From b6340b45d46c59613b74591b02fff82851e59bd8 Mon Sep 17 00:00:00 2001 From: Nathan Brake Date: Tue, 28 Jul 2026 11:25:51 +0000 Subject: [PATCH 1/3] feat(dashboard): make the activity histogram the time-range selector MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rework the Usage and Activity time controls around a request-volume histogram, the pattern CloudWatch Logs Insights, Kibana, and Grafana/Loki use for log exploration. The selection lives on the chart itself: full-height handles at the window edges zoom (react-aria slider thumbs, so they are pointer-captured and glide at 0.1-bucket steps), a slim strip along the axis band pans, regions outside the window dim in place, and −/+ buttons step the zoom. Zooming out past the extent promotes to the next larger preset (30d -> 90d -> 12mo), so a wrong default window is always one tap from a wider view; Reset restores the full extent. Presets set the extent the chart spans; the tiles / breakdowns / log follow the selection. This also fixes the original defects from the issue: - "All" on Usage silently meant a rolling 30 days (an omitted start hit the server's 30-day default), so the total drifted with the clock. Usage now drops "All" for bounded 90d and 12mo presets, reaching the full span the server serves without an unbounded, clock-rolling window. - The old custom picker (two datetime-local inputs) filtered only when both a date and a time were entered, and read local wall-clock times as UTC. The selection is bucket-based and UTC-aligned, matching the summary endpoint's bucketing and the existing "times in UTC" caption, so a picked range lines up with the bars and nothing is silently reinterpreted. - The bucket is chosen from the active preset's extent, and the effective window is always captioned, so a default or clamp is never invisible. Interaction details: drag feedback is a pair of CSS-positioned shades over the chart (the recharts tree never re-renders mid-drag) and the window commits once, on release, snapped outward to whole buckets. The histogram spans the preset extent independently of the selection, so there is always context to zoom back out into (one extra summary query, deduped with the active one when the selection is full). The handles are the only chart-level selector, so a stray tap cannot collapse the window; the pan strip sits over the axis band, so bar tooltips keep working; and touch-pan-y keeps mobile scrolling intact. Activity keeps a truthful "All" (its list endpoint is genuinely unbounded). Both pages share the timeline, the presets, and the window math (lib/timeRange). Active model/user/key/status/priced filters render as removable chips with an "Add filter" toggle for the pickers, the log-tool convention for keeping applied filters visible (especially on mobile). The Refresh button is an icon with an "updated Ns ago" freshness label; on Usage and Activity it rides the timeline's preset row rather than taking a dedicated header row, and stays in the header on Overview. Fixes #440 Co-Authored-By: Claude Fable 5 --- .../dashboard/assets/ActivityPage-BFwaR2GB.js | 1 + .../dashboard/assets/ActivityPage-RaXV2Jg6.js | 1 - ...ge-CX3eAAXN.js => AliasesPage-Q7olOjhL.js} | 2 +- ...ge-2_kce_tq.js => BudgetsPage-lTuTS-F9.js} | 2 +- ...-nzYO6eyy.js => ConfirmDialog-CWW3AYpK.js} | 2 +- ...able-CrQq0sYf.js => DataTable-Bmn_eYSV.js} | 2 +- ...sPage-C8AK643M.js => DocsPage-BAH_T1JY.js} | 2 +- .../{Field-DEJ6Wjg9.js => Field-Dwp6u3t8.js} | 2 +- .../dashboard/assets/FilterChips-Wo8I8zEd.js | 1 + ...sPage-CaQTAd2N.js => KeysPage-bUjPPYgf.js} | 2 +- ...tKOtj.js => ModelScopeControl-DmfR9Ylv.js} | 2 +- ...age-Cw8Xv_w2.js => ModelsPage-BMtuCmJv.js} | 2 +- .../dashboard/assets/OverviewPage-CX9hXHG1.js | 1 + .../dashboard/assets/OverviewPage-Deh5RtuT.js | 1 - .../assets/ProvidersPage-BRR1ZEsl.js | 1 - .../assets/ProvidersPage-DQdazSS9.js | 1 + ...e-CDoI9NPf.js => SettingsPage-CJyO6zWH.js} | 2 +- ...yewydW5.js => TablePagination-r1AimUKf.js} | 2 +- ...ytO.js => ToolsGuardrailsPage-1cTNaDRp.js} | 2 +- .../dashboard/assets/UsagePage-BD35XJZn.js | 1 - .../dashboard/assets/UsagePage-BECQyz4e.js | 1 + ...Page-CbRblpp_.js => UsersPage-CAU0FXTt.js} | 2 +- ...{charts-CuOShutR.js => charts-DIsd9m--.js} | 2 +- .../dashboard/assets/heroui-BI50yK5B.js | 20 + .../dashboard/assets/heroui-DZj66Arc.js | 20 - .../dashboard/assets/index-73ln6Ld4.css | 1 - .../static/dashboard/assets/index-CGnfXTEF.js | 2 + .../static/dashboard/assets/index-CI2beHfq.js | 2 - .../dashboard/assets/index-C_gHYR5I.css | 1 + ...harts-D7kuKp97.js => recharts-C4kRDmvS.js} | 4 +- ...CojkFPwd.js => tableSelection-9hV37uhu.js} | 2 +- src/gateway/static/dashboard/index.html | 6 +- web/src/components/ActivityTimeline.test.tsx | 132 +++++++ web/src/components/ActivityTimeline.tsx | 369 ++++++++++++++++++ web/src/components/FilterChips.test.tsx | 57 +++ web/src/components/FilterChips.tsx | 75 ++++ web/src/components/ui.test.tsx | 23 +- web/src/components/ui.tsx | 73 +++- web/src/lib/timeRange.test.ts | 136 +++++++ web/src/lib/timeRange.ts | 168 ++++++++ web/src/pages/ActivityPage.test.tsx | 54 ++- web/src/pages/ActivityPage.tsx | 218 +++++------ web/src/pages/OverviewPage.tsx | 30 +- web/src/pages/UsagePage.test.tsx | 42 +- web/src/pages/UsagePage.tsx | 256 ++++++------ 45 files changed, 1371 insertions(+), 357 deletions(-) create mode 100644 src/gateway/static/dashboard/assets/ActivityPage-BFwaR2GB.js delete mode 100644 src/gateway/static/dashboard/assets/ActivityPage-RaXV2Jg6.js rename src/gateway/static/dashboard/assets/{AliasesPage-CX3eAAXN.js => AliasesPage-Q7olOjhL.js} (95%) rename src/gateway/static/dashboard/assets/{BudgetsPage-2_kce_tq.js => BudgetsPage-lTuTS-F9.js} (97%) rename src/gateway/static/dashboard/assets/{ConfirmDialog-nzYO6eyy.js => ConfirmDialog-CWW3AYpK.js} (84%) rename src/gateway/static/dashboard/assets/{DataTable-CrQq0sYf.js => DataTable-Bmn_eYSV.js} (69%) rename src/gateway/static/dashboard/assets/{DocsPage-C8AK643M.js => DocsPage-BAH_T1JY.js} (99%) rename src/gateway/static/dashboard/assets/{Field-DEJ6Wjg9.js => Field-Dwp6u3t8.js} (88%) create mode 100644 src/gateway/static/dashboard/assets/FilterChips-Wo8I8zEd.js rename src/gateway/static/dashboard/assets/{KeysPage-CaQTAd2N.js => KeysPage-bUjPPYgf.js} (97%) rename src/gateway/static/dashboard/assets/{ModelScopeControl-L-_tKOtj.js => ModelScopeControl-DmfR9Ylv.js} (96%) rename src/gateway/static/dashboard/assets/{ModelsPage-Cw8Xv_w2.js => ModelsPage-BMtuCmJv.js} (99%) create mode 100644 src/gateway/static/dashboard/assets/OverviewPage-CX9hXHG1.js delete mode 100644 src/gateway/static/dashboard/assets/OverviewPage-Deh5RtuT.js delete mode 100644 src/gateway/static/dashboard/assets/ProvidersPage-BRR1ZEsl.js create mode 100644 src/gateway/static/dashboard/assets/ProvidersPage-DQdazSS9.js rename src/gateway/static/dashboard/assets/{SettingsPage-CDoI9NPf.js => SettingsPage-CJyO6zWH.js} (96%) rename src/gateway/static/dashboard/assets/{TablePagination-ByewydW5.js => TablePagination-r1AimUKf.js} (97%) rename src/gateway/static/dashboard/assets/{ToolsGuardrailsPage-bas8EytO.js => ToolsGuardrailsPage-1cTNaDRp.js} (97%) delete mode 100644 src/gateway/static/dashboard/assets/UsagePage-BD35XJZn.js create mode 100644 src/gateway/static/dashboard/assets/UsagePage-BECQyz4e.js rename src/gateway/static/dashboard/assets/{UsersPage-CbRblpp_.js => UsersPage-CAU0FXTt.js} (95%) rename src/gateway/static/dashboard/assets/{charts-CuOShutR.js => charts-DIsd9m--.js} (91%) create mode 100644 src/gateway/static/dashboard/assets/heroui-BI50yK5B.js delete mode 100644 src/gateway/static/dashboard/assets/heroui-DZj66Arc.js delete mode 100644 src/gateway/static/dashboard/assets/index-73ln6Ld4.css create mode 100644 src/gateway/static/dashboard/assets/index-CGnfXTEF.js delete mode 100644 src/gateway/static/dashboard/assets/index-CI2beHfq.js create mode 100644 src/gateway/static/dashboard/assets/index-C_gHYR5I.css rename src/gateway/static/dashboard/assets/{recharts-D7kuKp97.js => recharts-C4kRDmvS.js} (99%) rename src/gateway/static/dashboard/assets/{tableSelection-CojkFPwd.js => tableSelection-9hV37uhu.js} (95%) create mode 100644 web/src/components/ActivityTimeline.test.tsx create mode 100644 web/src/components/ActivityTimeline.tsx create mode 100644 web/src/components/FilterChips.test.tsx create mode 100644 web/src/components/FilterChips.tsx create mode 100644 web/src/lib/timeRange.test.ts create mode 100644 web/src/lib/timeRange.ts diff --git a/src/gateway/static/dashboard/assets/ActivityPage-BFwaR2GB.js b/src/gateway/static/dashboard/assets/ActivityPage-BFwaR2GB.js new file mode 100644 index 00000000..9d35258a --- /dev/null +++ b/src/gateway/static/dashboard/assets/ActivityPage-BFwaR2GB.js @@ -0,0 +1 @@ +import{j as s}from"./tanstack-query-1t81HyiD.js";import{u as Ke,r as n}from"./react-dgEcD0HR.js";import{u as Be,a as $e,b as qe,c as pe,d as ge,e as ze,f as We,P as Ye,E as Ge,R as He,F as he,g as q}from"./index-CGnfXTEF.js";import{f as D,A as Ve,a as P,F as Ze,b as W,C as Je,i as Qe}from"./FilterChips-Wo8I8zEd.js";import{u as Xe,r as et,B as tt}from"./tableSelection-9hV37uhu.js";import{C as st}from"./ConfirmDialog-CWW3AYpK.js";import{D as at}from"./DataTable-Bmn_eYSV.js";import{T as rt,S as lt,P as nt}from"./TablePagination-r1AimUKf.js";import{B as z}from"./heroui-BI50yK5B.js";import"./recharts-C4kRDmvS.js";function ot(t){const[l,i]=Ke(),a=n.useCallback(g=>l.get(g)??t[g],[l,t]),o=n.useCallback(g=>{const u=Number.parseInt(l.get(g)??"",10);if(!Number.isNaN(u))return u;const c=Number.parseInt(t[g],10);return Number.isNaN(c)?0:c},[l,t]),k=n.useCallback(g=>{i(u=>{const c=new URLSearchParams(u);for(const[m,h]of Object.entries(g)){const b=String(h);b===""||b===t[m]?c.delete(m):c.set(m,b)}return c},{replace:!0})},[i,t]);return{get:a,getNumber:o,patch:k}}const it=new Intl.NumberFormat(void 0,{style:"currency",currency:"USD",maximumFractionDigits:4});function T(t){return t===null?"—":it.format(t)}function _(t){return t===null?"—":t.toLocaleString()}function fe(t){return t===null?"—":t<1e3?`${t} ms`:`${(t/1e3).toFixed(t<1e4?2:1)} s`}function ct(t){const l=new Date(t);return Number.isNaN(l.getTime())?t:l.toLocaleString()}function dt(t){const l=new Date(t).getTime();if(Number.isNaN(l))return t;const i=Math.max(0,Math.round((Date.now()-l)/1e3));if(i<60)return`${i}s ago`;const a=Math.round(i/60);if(a<60)return`${a}m ago`;const o=Math.round(a/60);return o<24?`${o}h ago`:`${Math.round(o/24)}d ago`}const ut=t=>t.id,mt=t=>t.status==="error"?"bg-red-50":void 0,xe=[{label:"All",value:""},{label:"Success",value:"success"},{label:"Error",value:"error"}],be=[{label:"All",value:""},{label:"Priced",value:"true"},{label:"Unpriced",value:"false"}],pt=50,gt={range:W,start_date:"",end_date:"",status:"",model:"",user_id:"",api_key_id:"",priced:"",page:"0",size:String(pt)};function y(t,l,i){if(l||i)return{start:l||void 0,end:i||void 0};if(t===Je)return{};const a=D(P,t)??D(P,W),o=(a==null?void 0:a.seconds)??null;return{start:o==null?void 0:Qe(o),end:void 0}}function ht({status:t}){const l=t==="error"?"border-red-200 bg-red-50 text-red-700":"border-[var(--otari-line)] bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]";return s.jsx("span",{className:`inline-flex items-center rounded-full border px-2 py-0.5 text-xs font-medium ${l}`,children:t})}const xt={gateway:"Gateway",claude_code:"Claude Code",codex:"Codex"};function bt(t){return xt[t]??t}function d({label:t,children:l}){return s.jsxs("div",{className:"flex flex-col gap-0.5",children:[s.jsx("span",{className:"text-[11px] font-medium uppercase tracking-wide text-[var(--otari-muted)]",children:t}),s.jsx("span",{className:"text-sm text-[var(--otari-ink)] break-all",children:l})]})}function ft({entry:t}){var l;return s.jsxs("div",{className:"flex flex-col gap-4 px-4 py-4",children:[t.error_message?s.jsxs("div",{className:"flex flex-col gap-1.5",children:[s.jsx("span",{className:"text-[11px] font-medium uppercase tracking-wide text-[var(--otari-muted)]",children:"Error"}),s.jsx("pre",{className:"max-h-48 overflow-auto rounded-lg border border-red-200 bg-red-50 p-3 text-xs whitespace-pre-wrap break-all text-red-700",children:"The provider returned an error. Inspect gateway logs for details."})]}):null,s.jsxs("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-4",children:[s.jsx(d,{label:"Provider",children:t.provider??"—"}),s.jsx(d,{label:"Endpoint",children:t.endpoint}),s.jsx(d,{label:"Source",children:bt(t.source)}),t.source_label?s.jsx(d,{label:"Session",children:t.source_label}):null,s.jsx(d,{label:"User",children:t.user_id??"—"}),s.jsx(d,{label:"API key",children:t.api_key_id??"—"}),s.jsx(d,{label:"Prompt tokens",children:_(t.prompt_tokens)}),s.jsx(d,{label:"Completion tokens",children:_(t.completion_tokens)}),s.jsx(d,{label:"Total tokens",children:_(t.total_tokens)}),s.jsx(d,{label:"Cost",children:T(t.cost)}),s.jsx(d,{label:"Cache read tokens",children:_(t.cache_read_tokens)}),s.jsx(d,{label:"Cache write tokens",children:_(t.cache_write_tokens)}),s.jsx(d,{label:"1h cache writes",children:_(t.cache_write_1h_tokens??null)}),s.jsx(d,{label:"Total time",children:fe(t.latency_ms)}),s.jsx(d,{label:"Request ID",children:t.id})]}),(l=t.pricing_breakdown)!=null&&l.length?s.jsxs("div",{className:"flex flex-col gap-2",children:[s.jsx("span",{className:"text-[11px] font-medium uppercase tracking-wide text-[var(--otari-muted)]",children:"Billed meters"}),s.jsx("div",{className:"grid gap-2 sm:grid-cols-2 lg:grid-cols-3",children:t.pricing_breakdown.map(i=>s.jsxs(d,{label:i.meter.replaceAll("_"," "),children:[_(i.units)," at ",T(i.rate_per_million)," / 1M, ",T(i.cost)]},i.meter))})]}):null]})}function Ft(){var oe,ie,ce,de,ue;const t=Be(),l=$e(),i=n.useMemo(()=>{const e=new Map;for(const r of l.data??[])e.set(r.id,r.key_name??`${r.id.slice(0,8)}…`);return e},[l.data]),a=ot(gt),o=a.get("range"),k=a.get("start_date"),g=a.get("end_date"),u=a.get("status"),c=a.get("model"),m=a.get("user_id"),h=a.get("api_key_id"),b=a.get("priced"),Y=Math.max(0,a.getNumber("page")),G=a.getNumber("size"),I=nt.reduce((e,r)=>Math.abs(r-G)y(o,k,g));n.useEffect(()=>{H(y(o,k,g))},[o,k,g]);const[V,Z]=n.useState(()=>y(o,"",""));n.useEffect(()=>{Z(y(o,"",""))},[o]);const _e=!!(f.start||f.end),N=b==="true"?!0:b==="false"?!1:void 0,x=n.useMemo(()=>({start_date:f.start,end_date:f.end,status:u||void 0,model:c.trim()||void 0,user_id:m||void 0,api_key_id:h||void 0,priced:N}),[f,u,c,m,h,N]),p=Xe(),A=JSON.stringify(x),J=n.useRef(A);n.useEffect(()=>{J.current!==A&&(J.current=A,a.patch({page:0}),p.clear())},[A,a,p]);const v=qe(x,Y,I),j=pe(x),ve=n.useMemo(()=>({start_date:f.start,end_date:f.end,status:u||void 0,user_id:m||void 0,api_key_id:h||void 0}),[f,u,m,h]),U=((ie=(oe=ge(ve,"day").data)==null?void 0:oe.by_model)==null?void 0:ie.filter(e=>!e.is_other&&e.key!==null).map(e=>e.key))??[],Q=(l.data??[]).map(e=>({value:e.id,label:e.key_name??`${e.id.slice(0,8)}…`})),C=D(P,o)??D(P,W),X=(C==null?void 0:C.bucket)??"day",Se=n.useMemo(()=>({start_date:V.start,status:u||void 0,model:c.trim()||void 0,user_id:m||void 0,api_key_id:h||void 0,priced:N}),[V,u,c,m,h,N]),O=ge(Se,X),ke=(((ce=O.data)==null?void 0:ce.series)??[]).map(e=>({bucketStart:e.bucket_start,requests:e.requests})),S=v.data??[],ye=j.isSuccess&&!j.isPlaceholderData?((de=j.data)==null?void 0:de.total)??0:null,je=!!(u||c.trim()||m||h||b||_e),M=(e,r)=>{var me;return((me=e.find(Re=>Re.value===r))==null?void 0:me.label)??r},ee=(t.data??[]).map(e=>({value:e.user_id,label:e.alias?`${e.alias} (${e.user_id})`:e.user_id})),Ce=()=>a.patch({status:"",priced:"",model:"",user_id:"",api_key_id:""}),we=[...u?[{key:"status",label:"Status",value:M(xe,u),onClear:()=>a.patch({status:""})}]:[],...b?[{key:"priced",label:"Priced",value:M(be,b),onClear:()=>a.patch({priced:""})}]:[],...m?[{key:"user",label:"User",value:M(ee,m),onClear:()=>a.patch({user_id:""})}]:[],...c.trim()?[{key:"model",label:"Model",value:c.trim(),onClear:()=>a.patch({model:""})}]:[],...h?[{key:"key",label:"API key",value:M(Q,h),onClear:()=>a.patch({api_key_id:""})}]:[]],L=n.useMemo(()=>S.filter(e=>!e.counts_toward_budget).map(e=>e.id),[S]),Pe=n.useMemo(()=>S.filter(e=>e.counts_toward_budget).map(e=>e.id),[S]),te=et(p.selectedKeys,L),w=te.length,se=p.allMatching||w>0,Ne=n.useMemo(()=>({...x,counts_toward_budget:!1}),[x]),ae=pe(Ne,se),E=ae.isSuccess?((ue=ae.data)==null?void 0:ue.total)??null:null,Ae=L.length>0&&w===L.length&&E!=null&&E>w,F=p.allMatching?E??w:w,R=ze(),K=We(),[Me,B]=n.useState(!1),[Ee,$]=n.useState(!1),[Fe,re]=n.useState(null),Te=n.useCallback(e=>s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center justify-between border-b border-[var(--otari-line)] px-4 py-2",children:[s.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Request detail"}),s.jsx(z,{size:"sm",variant:"ghost",onPress:()=>re(null),children:"Close"})]}),s.jsx(ft,{entry:e})]}),[]),le=()=>p.allMatching?{by_filter:!0,model:x.model,user_id:x.user_id,api_key_id:x.api_key_id,status:x.status,start_date:x.start_date,end_date:x.end_date,priced:x.priced}:{ids:te},De=()=>{R.mutate(le(),{onSuccess:()=>{B(!1),p.clear()}})},Ie=e=>{K.mutate({...le(),...e},{onSuccess:()=>{$(!1),p.clear()}})},Ue=()=>{H(y(o,k,g)),Z(y(o,"","")),v.refetch(),j.refetch(),O.refetch()},ne=e=>a.patch({range:e.key,start_date:"",end_date:""}),Oe=(e,r)=>a.patch({start_date:e,end_date:r}),Le=n.useMemo(()=>{const e=r=>r===null?"—":i.get(r)??`${r.slice(0,8)}…`;return[{id:"time",header:"Time",cell:r=>s.jsx("span",{title:ct(r.timestamp),className:"text-[var(--otari-muted)]",children:dt(r.timestamp)})},{id:"user",header:"User",cell:r=>r.user_id??"—"},{id:"model",header:"Model",isRowHeader:!0,cell:r=>r.model},{id:"api_key",header:"API key",cell:r=>s.jsx("span",{className:"text-[var(--otari-muted)]",children:e(r.api_key_id)})},{id:"tokens",header:"Tokens",align:"end",cell:r=>_(r.total_tokens)},{id:"cost",header:"Cost",align:"end",cell:r=>T(r.cost)},{id:"latency",header:"Total time",align:"end",cell:r=>fe(r.latency_ms)},{id:"status",header:"Status",cell:r=>s.jsx(ht,{status:r.status})}]},[i]);return s.jsxs("div",{className:"flex flex-col gap-6",children:[s.jsx(Ye,{title:"Activity",description:"A per-request log of what the gateway served: tokens, cost, latency, and failures. No request or response content is stored."}),s.jsx(Ge,{error:v.error??j.error}),s.jsxs("div",{className:"flex flex-col gap-3",children:[s.jsx(Ve,{presets:P,extentKey:o,onPreset:ne,onSelectRange:Oe,onSelectFull:()=>C?ne(C):void 0,series:ke,bucket:X,windowStart:f.start,windowEnd:f.end,loading:O.isLoading,ariaLabel:"Activity request volume over the selected window",action:s.jsx(He,{onRefresh:Ue,isFetching:v.isFetching,updatedAt:v.dataUpdatedAt})}),s.jsxs(Ze,{chips:we,onClearAll:Ce,children:[s.jsx(he,{id:"filter-status",label:"Status",value:u,onChange:e=>a.patch({status:e}),children:xe.map(e=>s.jsx("option",{value:e.value,children:e.label},e.value))}),s.jsx(he,{id:"filter-priced",label:"Priced?",value:b,onChange:e=>a.patch({priced:e}),children:be.map(e=>s.jsx("option",{value:e.value,children:e.label},e.value))}),s.jsx(q,{label:"API key",value:h,onChange:e=>a.patch({api_key_id:e}),placeholder:"All keys",options:Q}),s.jsx(q,{label:"User",value:m,onChange:e=>a.patch({user_id:e}),placeholder:"All users",options:ee}),s.jsx(q,{label:"Model",value:c,onChange:e=>a.patch({model:e}),allowsCustom:!0,placeholder:"Any model",options:(c&&!U.includes(c)?[c,...U]:U).map(e=>({value:e,label:e}))})]})]}),se?s.jsxs(tt,{selectedCount:F,allMatching:p.allMatching,matchingTotal:E,canSelectAllMatching:Ae,onSelectAllMatching:p.enableAllMatching,onClear:p.clear,children:[s.jsx(z,{size:"sm",variant:"primary",onPress:()=>$(!0),children:"Set price"}),s.jsx(z,{size:"sm",variant:"danger",onPress:()=>B(!0),children:"Delete"})]}):null,s.jsx(at,{ariaLabel:"Activity log",columns:Le,rows:S,getRowKey:ut,isLoading:v.isLoading,emptyContent:je?"No requests match these filters.":"No requests recorded yet.",selectionMode:"multiple",selectedKeys:p.selectedKeys,onSelectionChange:p.onSelectionChange,disabledKeys:Pe,onRowAction:e=>re(r=>r===e?null:e),rowClassName:mt,detailKey:Fe,renderDetail:Te}),s.jsx(rt,{page:Y,pageSize:I,total:ye,rowsOnPage:S.length,onPageChange:e=>a.patch({page:e}),onPageSizeChange:e=>a.patch({size:e,page:0}),isFetching:v.isFetching,hasNextFallback:S.length===I}),s.jsx(st,{isOpen:Me,onOpenChange:B,heading:"Delete usage rows",body:`Delete ${F.toLocaleString()} imported ${F===1?"row":"rows"}? Only imported rows are removed, and this cannot be undone.`,confirmLabel:"Delete",isPending:R.isPending,error:R.error,onConfirm:De}),s.jsx(lt,{isOpen:Ee,onOpenChange:$,targetCount:F,isPending:K.isPending,error:K.error,onSubmit:Ie})]})}export{Ft as ActivityPage}; diff --git a/src/gateway/static/dashboard/assets/ActivityPage-RaXV2Jg6.js b/src/gateway/static/dashboard/assets/ActivityPage-RaXV2Jg6.js deleted file mode 100644 index 51fbd7f2..00000000 --- a/src/gateway/static/dashboard/assets/ActivityPage-RaXV2Jg6.js +++ /dev/null @@ -1 +0,0 @@ -import{j as t}from"./tanstack-query-1t81HyiD.js";import{B as _,c as we}from"./heroui-DZj66Arc.js";import{u as Pe,r as n}from"./react-dgEcD0HR.js";import{u as Ce,a as Ae,b as De,c as re,d as Fe,e as Me,f as Ee,P as Oe,E as Te,F as ne,g as R}from"./index-CI2beHfq.js";import{u as Ue,r as Ie,B as Re}from"./tableSelection-CojkFPwd.js";import{C as Le}from"./ConfirmDialog-nzYO6eyy.js";import{D as $e}from"./DataTable-CrQq0sYf.js";import{T as Be,S as Ke,P as ze}from"./TablePagination-ByewydW5.js";function qe(a){const[r,o]=Pe(),s=n.useCallback(u=>r.get(u)??a[u],[r,a]),d=n.useCallback(u=>{const g=Number.parseInt(r.get(u)??"",10);if(!Number.isNaN(g))return g;const c=Number.parseInt(a[u],10);return Number.isNaN(c)?0:c},[r,a]),p=n.useCallback(u=>{o(g=>{const c=new URLSearchParams(g);for(const[x,f]of Object.entries(u)){const b=String(f);b===""||b===a[x]?c.delete(x):c.set(x,b)}return c},{replace:!0})},[o,a]);return{get:s,getNumber:d,patch:p}}const Ge=new Intl.NumberFormat(void 0,{style:"currency",currency:"USD",maximumFractionDigits:4});function A(a){return a===null?"—":Ge.format(a)}function j(a){return a===null?"—":a.toLocaleString()}function oe(a){return a===null?"—":a<1e3?`${a} ms`:`${(a/1e3).toFixed(a<1e4?2:1)} s`}function He(a){const r=new Date(a);return Number.isNaN(r.getTime())?a:r.toLocaleString()}function We(a){const r=new Date(a).getTime();if(Number.isNaN(r))return a;const o=Math.max(0,Math.round((Date.now()-r)/1e3));if(o<60)return`${o}s ago`;const s=Math.round(o/60);if(s<60)return`${s}m ago`;const d=Math.round(s/60);return d<24?`${d}h ago`:`${Math.round(d/24)}d ago`}const Ze=a=>a.id,Je=a=>a.status==="error"?"bg-red-50":void 0,Ye=3600,L=86400,B=[{key:"1h",label:"1h",seconds:Ye},{key:"24h",label:"24h",seconds:L},{key:"7d",label:"7d",seconds:7*L},{key:"30d",label:"30d",seconds:30*L},{key:"all",label:"All",seconds:null}],ie="24h",Qe=[{label:"All",value:""},{label:"Success",value:"success"},{label:"Error",value:"error"}],Ve=[{label:"All",value:""},{label:"Priced",value:"true"},{label:"Unpriced",value:"false"}],Xe=50,et={range:ie,start_date:"",end_date:"",status:"",model:"",user_id:"",api_key_id:"",priced:"",page:"0",size:String(Xe)};function tt(a){return new Date(Date.now()-a*1e3).toISOString()}function $(a,r,o){if(r||o)return{start:r||void 0,end:o||void 0};if(a==="custom")return{};const s=B.find(p=>p.key===a)??B.find(p=>p.key===ie),d=(s==null?void 0:s.seconds)??null;return{start:d==null?void 0:tt(d),end:void 0}}function at({status:a}){const r=a==="error"?"border-red-200 bg-red-50 text-red-700":"border-[var(--otari-line)] bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]";return t.jsx("span",{className:`inline-flex items-center rounded-full border px-2 py-0.5 text-xs font-medium ${r}`,children:a})}const st={gateway:"Gateway",claude_code:"Claude Code",codex:"Codex"};function lt(a){return st[a]??a}function i({label:a,children:r}){return t.jsxs("div",{className:"flex flex-col gap-0.5",children:[t.jsx("span",{className:"text-[11px] font-medium uppercase tracking-wide text-[var(--otari-muted)]",children:a}),t.jsx("span",{className:"text-sm text-[var(--otari-ink)] break-all",children:r})]})}function rt({entry:a}){var r;return t.jsxs("div",{className:"flex flex-col gap-4 px-4 py-4",children:[a.error_message?t.jsxs("div",{className:"flex flex-col gap-1.5",children:[t.jsx("span",{className:"text-[11px] font-medium uppercase tracking-wide text-[var(--otari-muted)]",children:"Error"}),t.jsx("pre",{className:"max-h-48 overflow-auto rounded-lg border border-red-200 bg-red-50 p-3 text-xs whitespace-pre-wrap break-all text-red-700",children:"The provider returned an error. Inspect gateway logs for details."})]}):null,t.jsxs("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-4",children:[t.jsx(i,{label:"Provider",children:a.provider??"—"}),t.jsx(i,{label:"Endpoint",children:a.endpoint}),t.jsx(i,{label:"Source",children:lt(a.source)}),a.source_label?t.jsx(i,{label:"Session",children:a.source_label}):null,t.jsx(i,{label:"User",children:a.user_id??"—"}),t.jsx(i,{label:"API key",children:a.api_key_id??"—"}),t.jsx(i,{label:"Prompt tokens",children:j(a.prompt_tokens)}),t.jsx(i,{label:"Completion tokens",children:j(a.completion_tokens)}),t.jsx(i,{label:"Total tokens",children:j(a.total_tokens)}),t.jsx(i,{label:"Cost",children:A(a.cost)}),t.jsx(i,{label:"Cache read tokens",children:j(a.cache_read_tokens)}),t.jsx(i,{label:"Cache write tokens",children:j(a.cache_write_tokens)}),t.jsx(i,{label:"1h cache writes",children:j(a.cache_write_1h_tokens??null)}),t.jsx(i,{label:"Total time",children:oe(a.latency_ms)}),t.jsx(i,{label:"Request ID",children:a.id})]}),(r=a.pricing_breakdown)!=null&&r.length?t.jsxs("div",{className:"flex flex-col gap-2",children:[t.jsx("span",{className:"text-[11px] font-medium uppercase tracking-wide text-[var(--otari-muted)]",children:"Billed meters"}),t.jsx("div",{className:"grid gap-2 sm:grid-cols-2 lg:grid-cols-3",children:a.pricing_breakdown.map(o=>t.jsxs(i,{label:o.meter.replaceAll("_"," "),children:[j(o.units)," at ",A(o.rate_per_million)," / 1M, ",A(o.cost)]},o.meter))})]}):null]})}function ft(){var te,ae,se,le;const a=Ce(),r=Ae(),o=n.useMemo(()=>{const e=new Map;for(const l of r.data??[])e.set(l.id,l.key_name??`${l.id.slice(0,8)}…`);return e},[r.data]),s=qe(et),d=s.get("range"),p=s.get("start_date"),u=s.get("end_date"),g=s.get("status"),c=s.get("model"),x=s.get("user_id"),f=s.get("api_key_id"),b=s.get("priced"),K=Math.max(0,s.getNumber("page")),z=s.getNumber("size"),D=ze.reduce((e,l)=>Math.abs(l-z)$(d,p,u));n.useEffect(()=>{q($(d,p,u))},[d,p,u]);const F=p||u?"custom":d,ce=!!(v.start||v.end),G=b==="true"?!0:b==="false"?!1:void 0,h=n.useMemo(()=>({start_date:v.start,end_date:v.end,status:g||void 0,model:c.trim()||void 0,user_id:x||void 0,api_key_id:f||void 0,priced:G}),[v,g,c,x,f,G]),m=Ue(),w=JSON.stringify(h),H=n.useRef(w);n.useEffect(()=>{H.current!==w&&(H.current=w,s.patch({page:0}),m.clear())},[w,s,m]);const S=De(h,K,D),k=re(h),de=n.useMemo(()=>({start_date:v.start,end_date:v.end,status:g||void 0,user_id:x||void 0,api_key_id:f||void 0}),[v,g,x,f]),M=((ae=(te=Fe(de,"day").data)==null?void 0:te.by_model)==null?void 0:ae.filter(e=>!e.is_other&&e.key!==null).map(e=>e.key))??[],ue=(r.data??[]).map(e=>({value:e.id,label:e.key_name??`${e.id.slice(0,8)}…`})),y=S.data??[],me=k.isSuccess&&!k.isPlaceholderData?((se=k.data)==null?void 0:se.total)??0:null,W=!!(g||c.trim()||x||f||b||ce),[Z,pe]=n.useState(!1),J=[g,b,f,x,c.trim()].filter(Boolean).length,E=n.useMemo(()=>y.filter(e=>!e.counts_toward_budget).map(e=>e.id),[y]),ge=n.useMemo(()=>y.filter(e=>e.counts_toward_budget).map(e=>e.id),[y]),Y=Ie(m.selectedKeys,E),N=Y.length,Q=m.allMatching||N>0,he=n.useMemo(()=>({...h,counts_toward_budget:!1}),[h]),V=re(he,Q),P=V.isSuccess?((le=V.data)==null?void 0:le.total)??null:null,xe=E.length>0&&N===E.length&&P!=null&&P>N,C=m.allMatching?P??N:N,O=Me(),T=Ee(),[fe,U]=n.useState(!1),[be,I]=n.useState(!1),[ve,X]=n.useState(null),_e=n.useCallback(e=>t.jsxs("div",{children:[t.jsxs("div",{className:"flex items-center justify-between border-b border-[var(--otari-line)] px-4 py-2",children:[t.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Request detail"}),t.jsx(_,{size:"sm",variant:"ghost",onPress:()=>X(null),children:"Close"})]}),t.jsx(rt,{entry:e})]}),[]),ee=()=>m.allMatching?{by_filter:!0,model:h.model,user_id:h.user_id,api_key_id:h.api_key_id,status:h.status,start_date:h.start_date,end_date:h.end_date,priced:h.priced}:{ids:Y},je=()=>{O.mutate(ee(),{onSuccess:()=>{U(!1),m.clear()}})},ye=e=>{T.mutate({...ee(),...e},{onSuccess:()=>{I(!1),m.clear()}})},Se=()=>{s.patch({range:"all",start_date:"",end_date:"",status:"",model:"",user_id:"",api_key_id:"",priced:""})},ke=()=>{q($(d,p,u)),S.refetch(),k.refetch()},Ne=n.useMemo(()=>{const e=l=>l===null?"—":o.get(l)??`${l.slice(0,8)}…`;return[{id:"time",header:"Time",cell:l=>t.jsx("span",{title:He(l.timestamp),className:"text-[var(--otari-muted)]",children:We(l.timestamp)})},{id:"user",header:"User",cell:l=>l.user_id??"—"},{id:"model",header:"Model",isRowHeader:!0,cell:l=>l.model},{id:"api_key",header:"API key",cell:l=>t.jsx("span",{className:"text-[var(--otari-muted)]",children:e(l.api_key_id)})},{id:"tokens",header:"Tokens",align:"end",cell:l=>j(l.total_tokens)},{id:"cost",header:"Cost",align:"end",cell:l=>A(l.cost)},{id:"latency",header:"Total time",align:"end",cell:l=>oe(l.latency_ms)},{id:"status",header:"Status",cell:l=>t.jsx(at,{status:l.status})}]},[o]);return t.jsxs("div",{className:"flex flex-col gap-6",children:[t.jsx(Oe,{title:"Activity",description:"A per-request log of what the gateway served: tokens, cost, latency, and failures. No request or response content is stored.",action:t.jsx(_,{variant:"outline",onPress:ke,isDisabled:S.isFetching,children:"Refresh"})}),t.jsx(Te,{error:S.error??k.error}),t.jsxs("div",{className:"flex flex-wrap items-end gap-3",children:[t.jsxs("div",{className:"flex flex-wrap gap-2",children:[B.map(e=>t.jsx(_,{size:"sm",variant:F===e.key?"primary":"outline",onPress:()=>s.patch({range:e.key,start_date:"",end_date:""}),children:e.label},e.key)),t.jsx(_,{size:"sm",variant:F==="custom"?"primary":"outline",onPress:()=>s.patch({range:"custom"}),children:"Custom…"})]}),F==="custom"?t.jsxs("div",{className:"flex flex-wrap items-end gap-2",children:[t.jsxs("label",{className:"flex flex-col gap-1 text-xs font-medium text-[var(--otari-muted)]",children:["From",t.jsx("input",{type:"datetime-local",value:p,onChange:e=>s.patch({start_date:e.target.value}),className:"rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-3 py-2 text-sm text-[var(--otari-ink)] focus:border-[var(--otari-brand)] focus:outline-none"})]}),t.jsxs("label",{className:"flex flex-col gap-1 text-xs font-medium text-[var(--otari-muted)]",children:["To",t.jsx("input",{type:"datetime-local",value:u,onChange:e=>s.patch({end_date:e.target.value}),className:"rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-3 py-2 text-sm text-[var(--otari-ink)] focus:border-[var(--otari-brand)] focus:outline-none"})]})]}):null,t.jsxs(_,{size:"sm",variant:"outline",className:"md:hidden",onPress:()=>pe(e=>!e),"aria-expanded":Z,"aria-controls":"activity-filters",children:["Filters",J?` (${J})`:""]}),t.jsxs("div",{id:"activity-filters",className:we("flex-wrap items-end gap-3 md:flex",Z?"flex w-full md:w-auto":"hidden"),children:[t.jsx(ne,{id:"filter-status",label:"Status",value:g,onChange:e=>s.patch({status:e}),children:Qe.map(e=>t.jsx("option",{value:e.value,children:e.label},e.value))}),t.jsx(ne,{id:"filter-priced",label:"Priced?",value:b,onChange:e=>s.patch({priced:e}),children:Ve.map(e=>t.jsx("option",{value:e.value,children:e.label},e.value))}),t.jsx(R,{label:"API key",value:f,onChange:e=>s.patch({api_key_id:e}),placeholder:"All keys",options:ue}),t.jsx(R,{label:"User",value:x,onChange:e=>s.patch({user_id:e}),placeholder:"All users",options:(a.data??[]).map(e=>({value:e.user_id,label:e.alias?`${e.alias} (${e.user_id})`:e.user_id}))}),t.jsx(R,{label:"Model",value:c,onChange:e=>s.patch({model:e}),allowsCustom:!0,placeholder:"Any model",options:(c&&!M.includes(c)?[c,...M]:M).map(e=>({value:e,label:e}))}),W?t.jsx(_,{size:"sm",variant:"ghost",onPress:Se,children:"Clear filters"}):null]})]}),Q?t.jsxs(Re,{selectedCount:C,allMatching:m.allMatching,matchingTotal:P,canSelectAllMatching:xe,onSelectAllMatching:m.enableAllMatching,onClear:m.clear,children:[t.jsx(_,{size:"sm",variant:"primary",onPress:()=>I(!0),children:"Set price"}),t.jsx(_,{size:"sm",variant:"danger",onPress:()=>U(!0),children:"Delete"})]}):null,t.jsx($e,{ariaLabel:"Activity log",columns:Ne,rows:y,getRowKey:Ze,isLoading:S.isLoading,emptyContent:W?"No requests match these filters.":"No requests recorded yet.",selectionMode:"multiple",selectedKeys:m.selectedKeys,onSelectionChange:m.onSelectionChange,disabledKeys:ge,onRowAction:e=>X(l=>l===e?null:e),rowClassName:Je,detailKey:ve,renderDetail:_e}),t.jsx(Be,{page:K,pageSize:D,total:me,rowsOnPage:y.length,onPageChange:e=>s.patch({page:e}),onPageSizeChange:e=>s.patch({size:e,page:0}),isFetching:S.isFetching,hasNextFallback:y.length===D}),t.jsx(Le,{isOpen:fe,onOpenChange:U,heading:"Delete usage rows",body:`Delete ${C.toLocaleString()} imported ${C===1?"row":"rows"}? Only imported rows are removed, and this cannot be undone.`,confirmLabel:"Delete",isPending:O.isPending,error:O.error,onConfirm:je}),t.jsx(Ke,{isOpen:be,onOpenChange:I,targetCount:C,isPending:T.isPending,error:T.error,onSubmit:ye})]})}export{ft as ActivityPage}; diff --git a/src/gateway/static/dashboard/assets/AliasesPage-CX3eAAXN.js b/src/gateway/static/dashboard/assets/AliasesPage-Q7olOjhL.js similarity index 95% rename from src/gateway/static/dashboard/assets/AliasesPage-CX3eAAXN.js rename to src/gateway/static/dashboard/assets/AliasesPage-Q7olOjhL.js index fc5c3295..cd2904e8 100644 --- a/src/gateway/static/dashboard/assets/AliasesPage-CX3eAAXN.js +++ b/src/gateway/static/dashboard/assets/AliasesPage-Q7olOjhL.js @@ -1 +1 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as d,u as L}from"./react-dgEcD0HR.js";import{h as T,i as E,j as M,C as I,P as K,E as S,k as A}from"./index-CI2beHfq.js";import{u as R,r as F,B as $}from"./tableSelection-CojkFPwd.js";import{C as q}from"./ConfirmDialog-nzYO6eyy.js";import{D as O}from"./DataTable-CrQq0sYf.js";import{F as V}from"./Field-DEJ6Wjg9.js";import{C as N,L as z,I as H,a as G,b as W,f as X,B as h,d as k}from"./heroui-DZj66Arc.js";const _=50;function P({label:t,value:a,onChange:r,description:n,placeholder:u="provider:model",autoFocus:i,isRequired:m}){const c=T(),{visible:o,total:x,failed:p}=d.useMemo(()=>{var y;const l=a.trim().toLowerCase(),f=((y=c.data)==null?void 0:y.providers)??[],C=f.flatMap(g=>g.models),j=l?C.filter(g=>g.key.toLowerCase().includes(l)):C;return{visible:j.slice(0,_),total:j.length,failed:f.filter(g=>!g.ok)}},[c.data,a]),b=c.isLoading?"Loading models from your providers…":p.length>0?`Could not list models for ${p.map(f=>f.provider).join(", ")}. Check that provider's credentials, or type the model key directly.`:x>o.length?`Showing ${o.length} of ${x} matches. Keep typing to narrow them.`:n;return e.jsxs(N.Root,{allowsCustomValue:!0,allowsEmptyCollection:!0,menuTrigger:"input",inputValue:a,onInputChange:r,onSelectionChange:l=>{l!=null&&r(String(l))},isRequired:m,className:"flex max-w-md flex-col gap-1",children:[e.jsx(z,{className:"text-sm font-medium text-[var(--otari-ink)]",children:t}),e.jsxs(N.InputGroup,{children:[e.jsx(H,{placeholder:u,autoFocus:i}),e.jsx(N.Trigger,{})]}),e.jsx(N.Popover,{children:e.jsx(G,{items:o,className:"max-h-72 overflow-auto",children:l=>e.jsx(W,{id:l.key,textValue:l.key,children:l.key})})}),b?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:b}):null]})}const J=t=>t.name;function Q({alias:t,onClose:a}){const r=A(),[n,u]=d.useState(t.target),i=n.trim()!==""&&n.trim()!==t.target,m=()=>{i&&r.mutate({name:t.name,target:n.trim()},{onSuccess:a})};return e.jsx(k,{children:e.jsxs(k.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsxs("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:["Edit alias ",e.jsx("code",{children:t.name})]}),e.jsx(S,{error:r.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Alias name"}),e.jsx("code",{className:"text-sm text-[var(--otari-muted)]",children:t.name}),e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"The alias name is the key and cannot be changed here. Delete and recreate to rename."})]}),e.jsx(P,{label:"Target",value:n,onChange:u,isRequired:!0,description:"The real model this resolves to. Callers never see it."})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(h,{variant:"primary",isDisabled:!i||r.isPending,onPress:m,children:r.isPending?"Saving…":"Save changes"}),e.jsx(h,{variant:"ghost",onPress:a,children:"Cancel"})]})]})})}function U({onClose:t,initialTarget:a=""}){const r=A(),[n,u]=d.useState(""),[i,m]=d.useState(a),c=/[:/]/.test(n),o=n.trim()!==""&&i.trim()!==""&&!c,x=()=>{o&&r.mutate({name:n.trim(),target:i.trim()},{onSuccess:t})};return e.jsx(k,{children:e.jsxs(k.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsx("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"New alias"}),e.jsx(S,{error:r.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(V,{label:"Alias name",value:n,onChange:u,placeholder:"fast-model",isRequired:!0,autoFocus:!0,description:c?e.jsx("span",{className:"text-red-700",children:"An alias name cannot contain “:” or “/”."}):"What callers send as `model`."}),e.jsx(P,{label:"Target",value:i,onChange:m,isRequired:!0,description:"The real model this resolves to. Callers never see it."})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(h,{variant:"primary",isDisabled:!o||r.isPending,onPress:x,children:r.isPending?"Creating…":"Create alias"}),e.jsx(h,{variant:"ghost",onPress:t,children:"Cancel"})]})]})})}function le(){const t=E(),a=M(),[r]=L(),n=r.get("target")??"",[u,i]=d.useState(n!==""),[m,c]=d.useState(null),o=R(),[x,p]=d.useState(!1),[b,l]=d.useState(void 0),[f,C]=d.useState(!1),j=[...t.data??[]].sort((s,B)=>s.name.localeCompare(B.name)),y=j.filter(s=>s.source==="stored").map(s=>s.name),g=j.filter(s=>s.source!=="stored").map(s=>s.name),v=F(o.selectedKeys,y),w=async()=>{C(!0),l(void 0);try{for(const s of v)await a.mutateAsync(s);o.clear(),p(!1)}catch(s){l(s)}finally{C(!1)}},D=d.useMemo(()=>[{id:"alias",header:"Alias",isRowHeader:!0,cell:s=>e.jsx("span",{className:"font-medium break-all text-[var(--otari-ink)]",children:s.name})},{id:"target",header:"Target",cell:s=>e.jsx("span",{className:"break-all text-[var(--otari-muted)]",children:s.target})},{id:"source",header:"Source",cell:s=>e.jsx(X,{size:"sm",color:s.source==="stored"?"accent":"default",children:s.source})},{id:"actions",header:"Actions",align:"end",cell:s=>s.source==="stored"?e.jsxs("span",{className:"inline-flex items-center gap-2 whitespace-nowrap",children:[e.jsx(h,{size:"sm",variant:"ghost",onPress:()=>{i(!1),c(s)},children:"Edit"}),e.jsx(I,{confirmLabel:"Delete",isPending:a.isPending,onConfirm:()=>a.mutate(s.name),children:"Delete"})]}):e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"set in config.yml"})}],[a.isPending,a.mutate]);return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(K,{title:"Aliases",description:"Friendly names that map to a real provider:model. Callers send the alias as the model; pricing, budgets, and usage key on the target.",action:u||m?null:e.jsx(h,{variant:"primary",onPress:()=>{c(null),i(!0)},children:"New alias"})}),e.jsx(S,{error:t.error}),u?e.jsx(U,{initialTarget:n,onClose:()=>i(!1)}):null,m?e.jsx(Q,{alias:m,onClose:()=>c(null)}):null,a.error?e.jsx(S,{error:a.error}):null,v.length>0?e.jsx($,{selectedCount:v.length,allMatching:!1,matchingTotal:null,canSelectAllMatching:!1,onSelectAllMatching:()=>{},onClear:o.clear,children:e.jsx(h,{size:"sm",variant:"danger",onPress:()=>p(!0),children:"Delete"})}):null,e.jsx(O,{ariaLabel:"Aliases",columns:D,rows:j,getRowKey:J,isLoading:t.isLoading,emptyContent:"No aliases yet. Create one to give a model a friendly name.",selectionMode:"multiple",selectedKeys:o.selectedKeys,onSelectionChange:o.onSelectionChange,disabledKeys:g}),e.jsx(q,{isOpen:x,onOpenChange:p,heading:"Delete aliases",body:`Delete ${v.length} stored ${v.length===1?"alias":"aliases"}? Callers using ${v.length===1?"it":"them"} will get a model-not-found error.`,confirmLabel:"Delete",isPending:f,error:b,onConfirm:w})]})}export{le as AliasesPage}; +import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as d,u as L}from"./react-dgEcD0HR.js";import{h as T,i as E,j as M,C as I,P as K,E as S,k as A}from"./index-CGnfXTEF.js";import{u as R,r as F,B as $}from"./tableSelection-9hV37uhu.js";import{C as q}from"./ConfirmDialog-CWW3AYpK.js";import{D as O}from"./DataTable-Bmn_eYSV.js";import{F as V}from"./Field-Dwp6u3t8.js";import{C as N,L as z,I as H,a as G,b as W,f as X,B as h,d as k}from"./heroui-BI50yK5B.js";const _=50;function P({label:t,value:a,onChange:r,description:n,placeholder:u="provider:model",autoFocus:i,isRequired:m}){const c=T(),{visible:o,total:x,failed:p}=d.useMemo(()=>{var y;const l=a.trim().toLowerCase(),f=((y=c.data)==null?void 0:y.providers)??[],C=f.flatMap(g=>g.models),j=l?C.filter(g=>g.key.toLowerCase().includes(l)):C;return{visible:j.slice(0,_),total:j.length,failed:f.filter(g=>!g.ok)}},[c.data,a]),b=c.isLoading?"Loading models from your providers…":p.length>0?`Could not list models for ${p.map(f=>f.provider).join(", ")}. Check that provider's credentials, or type the model key directly.`:x>o.length?`Showing ${o.length} of ${x} matches. Keep typing to narrow them.`:n;return e.jsxs(N.Root,{allowsCustomValue:!0,allowsEmptyCollection:!0,menuTrigger:"input",inputValue:a,onInputChange:r,onSelectionChange:l=>{l!=null&&r(String(l))},isRequired:m,className:"flex max-w-md flex-col gap-1",children:[e.jsx(z,{className:"text-sm font-medium text-[var(--otari-ink)]",children:t}),e.jsxs(N.InputGroup,{children:[e.jsx(H,{placeholder:u,autoFocus:i}),e.jsx(N.Trigger,{})]}),e.jsx(N.Popover,{children:e.jsx(G,{items:o,className:"max-h-72 overflow-auto",children:l=>e.jsx(W,{id:l.key,textValue:l.key,children:l.key})})}),b?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:b}):null]})}const J=t=>t.name;function Q({alias:t,onClose:a}){const r=A(),[n,u]=d.useState(t.target),i=n.trim()!==""&&n.trim()!==t.target,m=()=>{i&&r.mutate({name:t.name,target:n.trim()},{onSuccess:a})};return e.jsx(k,{children:e.jsxs(k.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsxs("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:["Edit alias ",e.jsx("code",{children:t.name})]}),e.jsx(S,{error:r.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Alias name"}),e.jsx("code",{className:"text-sm text-[var(--otari-muted)]",children:t.name}),e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"The alias name is the key and cannot be changed here. Delete and recreate to rename."})]}),e.jsx(P,{label:"Target",value:n,onChange:u,isRequired:!0,description:"The real model this resolves to. Callers never see it."})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(h,{variant:"primary",isDisabled:!i||r.isPending,onPress:m,children:r.isPending?"Saving…":"Save changes"}),e.jsx(h,{variant:"ghost",onPress:a,children:"Cancel"})]})]})})}function U({onClose:t,initialTarget:a=""}){const r=A(),[n,u]=d.useState(""),[i,m]=d.useState(a),c=/[:/]/.test(n),o=n.trim()!==""&&i.trim()!==""&&!c,x=()=>{o&&r.mutate({name:n.trim(),target:i.trim()},{onSuccess:t})};return e.jsx(k,{children:e.jsxs(k.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsx("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"New alias"}),e.jsx(S,{error:r.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(V,{label:"Alias name",value:n,onChange:u,placeholder:"fast-model",isRequired:!0,autoFocus:!0,description:c?e.jsx("span",{className:"text-red-700",children:"An alias name cannot contain “:” or “/”."}):"What callers send as `model`."}),e.jsx(P,{label:"Target",value:i,onChange:m,isRequired:!0,description:"The real model this resolves to. Callers never see it."})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(h,{variant:"primary",isDisabled:!o||r.isPending,onPress:x,children:r.isPending?"Creating…":"Create alias"}),e.jsx(h,{variant:"ghost",onPress:t,children:"Cancel"})]})]})})}function le(){const t=E(),a=M(),[r]=L(),n=r.get("target")??"",[u,i]=d.useState(n!==""),[m,c]=d.useState(null),o=R(),[x,p]=d.useState(!1),[b,l]=d.useState(void 0),[f,C]=d.useState(!1),j=[...t.data??[]].sort((s,B)=>s.name.localeCompare(B.name)),y=j.filter(s=>s.source==="stored").map(s=>s.name),g=j.filter(s=>s.source!=="stored").map(s=>s.name),v=F(o.selectedKeys,y),w=async()=>{C(!0),l(void 0);try{for(const s of v)await a.mutateAsync(s);o.clear(),p(!1)}catch(s){l(s)}finally{C(!1)}},D=d.useMemo(()=>[{id:"alias",header:"Alias",isRowHeader:!0,cell:s=>e.jsx("span",{className:"font-medium break-all text-[var(--otari-ink)]",children:s.name})},{id:"target",header:"Target",cell:s=>e.jsx("span",{className:"break-all text-[var(--otari-muted)]",children:s.target})},{id:"source",header:"Source",cell:s=>e.jsx(X,{size:"sm",color:s.source==="stored"?"accent":"default",children:s.source})},{id:"actions",header:"Actions",align:"end",cell:s=>s.source==="stored"?e.jsxs("span",{className:"inline-flex items-center gap-2 whitespace-nowrap",children:[e.jsx(h,{size:"sm",variant:"ghost",onPress:()=>{i(!1),c(s)},children:"Edit"}),e.jsx(I,{confirmLabel:"Delete",isPending:a.isPending,onConfirm:()=>a.mutate(s.name),children:"Delete"})]}):e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"set in config.yml"})}],[a.isPending,a.mutate]);return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(K,{title:"Aliases",description:"Friendly names that map to a real provider:model. Callers send the alias as the model; pricing, budgets, and usage key on the target.",action:u||m?null:e.jsx(h,{variant:"primary",onPress:()=>{c(null),i(!0)},children:"New alias"})}),e.jsx(S,{error:t.error}),u?e.jsx(U,{initialTarget:n,onClose:()=>i(!1)}):null,m?e.jsx(Q,{alias:m,onClose:()=>c(null)}):null,a.error?e.jsx(S,{error:a.error}):null,v.length>0?e.jsx($,{selectedCount:v.length,allMatching:!1,matchingTotal:null,canSelectAllMatching:!1,onSelectAllMatching:()=>{},onClear:o.clear,children:e.jsx(h,{size:"sm",variant:"danger",onPress:()=>p(!0),children:"Delete"})}):null,e.jsx(O,{ariaLabel:"Aliases",columns:D,rows:j,getRowKey:J,isLoading:t.isLoading,emptyContent:"No aliases yet. Create one to give a model a friendly name.",selectionMode:"multiple",selectedKeys:o.selectedKeys,onSelectionChange:o.onSelectionChange,disabledKeys:g}),e.jsx(q,{isOpen:x,onOpenChange:p,heading:"Delete aliases",body:`Delete ${v.length} stored ${v.length===1?"alias":"aliases"}? Callers using ${v.length===1?"it":"them"} will get a model-not-found error.`,confirmLabel:"Delete",isPending:f,error:b,onConfirm:w})]})}export{le as AliasesPage}; diff --git a/src/gateway/static/dashboard/assets/BudgetsPage-2_kce_tq.js b/src/gateway/static/dashboard/assets/BudgetsPage-lTuTS-F9.js similarity index 97% rename from src/gateway/static/dashboard/assets/BudgetsPage-2_kce_tq.js rename to src/gateway/static/dashboard/assets/BudgetsPage-lTuTS-F9.js index 3bb4de27..b0eb8e0d 100644 --- a/src/gateway/static/dashboard/assets/BudgetsPage-2_kce_tq.js +++ b/src/gateway/static/dashboard/assets/BudgetsPage-lTuTS-F9.js @@ -1 +1 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as i}from"./react-dgEcD0HR.js";import{l as re,u as ae,m as le,n as ie,o as oe,p as de,P as ue,E as O,I as ce,q as me}from"./index-CI2beHfq.js";import{u as xe,r as ge,B as he}from"./tableSelection-CojkFPwd.js";import{C as pe}from"./ConfirmDialog-nzYO6eyy.js";import{D as fe}from"./DataTable-CrQq0sYf.js";import{F as $}from"./Field-DEJ6Wjg9.js";import{C as E,I as be,a as je,b as ve,B as c,d as C,S as ye}from"./heroui-DZj66Arc.js";const Ne=50;function Se({value:t,onChange:a,users:r,label:o,description:l}){const[g,h]=i.useState(""),d=i.useMemo(()=>r.filter(s=>!s.user_id.startsWith("apikey-")).map(s=>({id:s.user_id,label:s.alias?`${s.user_id} (${s.alias})`:s.user_id})),[r]),p=i.useMemo(()=>{const s=g.trim().toLowerCase();return d.filter(u=>!t.includes(u.id)).filter(u=>!s||u.id.toLowerCase().includes(s)||u.label.toLowerCase().includes(s)).slice(0,Ne)},[d,t,g]),m=s=>{t.includes(s)||a([...t,s]),h("")},x=s=>a(t.filter(u=>u!==s));return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{children:[e.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:o}),l?e.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:l}):null]}),t.length>0?e.jsx("div",{className:"flex flex-wrap gap-1.5",children:t.map(s=>e.jsxs("span",{className:"inline-flex items-center gap-1 rounded-full bg-[var(--otari-brand-tint)] px-2.5 py-1 font-mono text-xs text-[var(--otari-brand-dark)]",children:[s,e.jsx("button",{type:"button","aria-label":`Remove ${s}`,onClick:()=>x(s),className:"text-[var(--otari-brand-dark)] hover:text-red-700",children:"×"})]},s))}):null,d.length===0?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"No users yet. Create users first, then assign them here or from the Users page."}):e.jsxs(E.Root,{allowsEmptyCollection:!0,menuTrigger:"input",inputValue:g,onInputChange:h,selectedKey:null,onSelectionChange:s=>{s!=null&&m(String(s))},className:"flex flex-col gap-1",children:[e.jsxs(E.InputGroup,{children:[e.jsx(be,{"aria-label":"Add a user",placeholder:"Search users…",autoComplete:"off"}),e.jsx(E.Trigger,{})]}),e.jsx(E.Popover,{children:e.jsx(je,{items:p,className:"max-h-72 overflow-auto",children:s=>e.jsx(ve,{id:s.id,textValue:s.label,children:s.label})})})]})]})}const _e=new Intl.NumberFormat(void 0,{style:"currency",currency:"USD",maximumFractionDigits:2});function P(t){return _e.format(t)}const j=86400,q=3600,z=[{label:"No reset",seconds:null},{label:"Daily",seconds:j},{label:"Weekly",seconds:7*j},{label:"Monthly",seconds:30*j}];function Ce(t){if(t===null)return"No reset";const a=z.find(r=>r.seconds===t);return a?a.label:t%j===0?`Every ${t/j} days`:t%q===0?`Every ${t/q} hours`:`Every ${t}s`}function W(t){if(!t)return"—";const a=new Date(t);return Number.isNaN(a.getTime())?"—":a.toLocaleString()}function we(t){const a=t.trim();if(a==="")return{value:null,valid:!0};const r=Number(a);return!Number.isFinite(r)||r<0?{value:null,valid:!1}:{value:r,valid:!0}}function Y(t){return t!==null&&t%j===0?String(t/j):""}function De({value:t,onChange:a,onInvalidChange:r}){const o=z.some(s=>s.seconds===t),[l,g]=i.useState(!o),[h,d]=i.useState(()=>Y(t)),p=h.trim(),m=Number(p),x=p!==""&&(!Number.isSafeInteger(m)||m<=0);return i.useEffect(()=>{r==null||r(x)},[x,r]),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Reset period"}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[z.map(s=>e.jsx(c,{size:"sm",variant:!l&&t===s.seconds?"primary":"outline",onPress:()=>{g(!1),d(Y(s.seconds)),a(s.seconds)},children:s.label},s.label)),e.jsx(c,{size:"sm",variant:l?"primary":"outline",onPress:()=>g(!0),children:"Custom"})]}),l?e.jsx("div",{className:"flex items-end gap-2",children:e.jsx($,{label:"Every N days",value:h,onChange:s=>{d(s);const u=Number(s.trim());a(s.trim()===""||!Number.isSafeInteger(u)||u<=0?null:u*j)},placeholder:"14",description:x?e.jsx("span",{className:"text-red-700",children:"Enter a whole number of days."}):"Whole days between resets."})}):null,e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Spend returns to zero each period. A user’s clock starts when the budget is assigned to them."})]})}function G({title:t,submitLabel:a,initial:r,error:o,isPending:l,onSubmit:g,onClose:h,assignUsers:d}){const[p,m]=i.useState(r.name??""),[x,s]=i.useState(r.max_budget===null?"":String(r.max_budget)),[u,b]=i.useState(r.budget_duration_sec),[S,v]=i.useState(!1),[B,k]=i.useState([]),f=we(x),A=!l&&f.valid&&!S,w=()=>{A&&g({name:p.trim()||null,max_budget:f.value,budget_duration_sec:u},B)};return e.jsx(C,{children:e.jsxs(C.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsx("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:t}),e.jsx(O,{error:o}),e.jsx($,{label:"Name (optional)",value:p,onChange:m,autoFocus:!0,placeholder:"team-free-tier",description:"A label to recognize this budget later."}),e.jsx($,{label:"Spending limit (USD)",value:x,onChange:s,placeholder:"100.00",description:f.valid?"The most a single user on this budget may spend per period. Leave blank for no limit.":e.jsx("span",{className:"text-red-700",children:"Enter a non-negative number, or leave blank for no limit."})}),e.jsx(De,{value:u,onChange:b,onInvalidChange:v}),d?e.jsx(Se,{label:"Assign to users (optional)",description:"Attach this budget to existing users now. You can also manage assignments later on the Users page.",value:B,onChange:k,users:d}):null,e.jsxs("div",{className:"flex gap-2",children:[e.jsx(c,{variant:"primary",isDisabled:!A,onPress:w,children:l?"Saving…":a}),e.jsx(c,{variant:"ghost",isDisabled:l,onPress:h,children:"Cancel"})]})]})})}function Pe({budget:t}){if(t.user_count===0)return e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"No users assigned"});const a=t.total_spend;if(t.max_budget===null)return e.jsxs("span",{className:"text-xs text-[var(--otari-ink)]",children:[P(a)," spent",e.jsx("span",{className:"text-[var(--otari-muted)]",children:" · no limit"})]});const r=t.max_budget*t.user_count,o=r>0?Math.min(100,a/r*100):0,l=a>r;return e.jsxs("div",{className:"flex min-w-[140px] flex-col gap-1",children:[e.jsxs("div",{className:"flex items-baseline justify-between gap-2 text-xs",children:[e.jsx("span",{className:"text-[var(--otari-ink)]",children:P(a)}),e.jsxs("span",{className:"text-[var(--otari-muted)]",children:["of ",P(r)]})]}),e.jsx("div",{className:"h-1.5 w-full overflow-hidden rounded-full bg-[var(--otari-line)]",role:"progressbar","aria-valuenow":Math.round(o),"aria-valuemin":0,"aria-valuemax":100,"aria-label":"Aggregate spend against total allocation",children:e.jsx("div",{className:`h-full rounded-full ${l?"bg-red-500":"bg-[var(--otari-brand)]"}`,style:{width:`${Math.max(o,l?100:2)}%`}})})]})}function Be({budgetId:t}){const a=me(t);if(a.isLoading)return e.jsxs("div",{className:"flex items-center gap-2 px-4 py-4 text-sm text-[var(--otari-muted)]",children:[e.jsx(ye,{size:"sm"})," Loading reset history…"]});if(a.error)return e.jsx("div",{className:"px-4 py-4",children:e.jsx(O,{error:a.error})});const r=a.data??[];return r.length===0?e.jsx("div",{className:"px-4 py-4 text-sm text-[var(--otari-muted)]",children:"No resets recorded yet for this budget."}):e.jsx("div",{className:"overflow-x-auto px-4 py-3",children:e.jsxs("table",{className:"w-full border-collapse text-xs",children:[e.jsx("thead",{className:"text-left text-[var(--otari-muted)]",children:e.jsxs("tr",{children:[e.jsx("th",{className:"py-1.5 pr-4 font-medium",children:"User"}),e.jsx("th",{className:"py-1.5 pr-4 font-medium",children:"Spend cleared"}),e.jsx("th",{className:"py-1.5 pr-4 font-medium",children:"Reset at"}),e.jsx("th",{className:"py-1.5 font-medium",children:"Next reset"})]})}),e.jsx("tbody",{children:r.map(o=>e.jsxs("tr",{className:"border-t border-[var(--otari-line)]",children:[e.jsx("td",{className:"py-1.5 pr-4",children:e.jsx("code",{children:o.user_id??"—"})}),e.jsx("td",{className:"py-1.5 pr-4 text-[var(--otari-ink)]",children:P(o.previous_spend)}),e.jsx("td",{className:"py-1.5 pr-4 text-[var(--otari-muted)]",children:W(o.reset_at)}),e.jsx("td",{className:"py-1.5 text-[var(--otari-muted)]",children:W(o.next_reset_at)})]},o.id))})]})})}function ke({onCreate:t}){return e.jsx(C,{children:e.jsxs(C.Content,{className:"flex flex-col gap-4 p-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:"No budgets yet"}),e.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:"A budget caps how much a user may spend and, optionally, resets that spend on a schedule. Create one, then assign it to users to enforce a limit."})]}),e.jsx("div",{children:e.jsx(c,{variant:"primary",onPress:t,children:"Create your first budget"})})]})})}function Ae({label:t,isPending:a,onConfirm:r}){const[o,l]=i.useState(!1);return o?e.jsxs("div",{className:"flex flex-col items-end gap-1.5 rounded-lg border border-amber-200 bg-amber-50 p-2 text-right",children:[e.jsxs("span",{className:"max-w-xs text-xs text-amber-800",children:["Delete ",e.jsx("strong",{children:t}),"? Users keep their spend but lose this limit. Cannot be undone."]}),e.jsxs("span",{className:"inline-flex gap-1",children:[e.jsx(c,{size:"sm",variant:"danger",isDisabled:a,onPress:r,children:"Delete permanently"}),e.jsx(c,{size:"sm",variant:"ghost",isDisabled:a,onPress:()=>l(!1),children:"Cancel"})]})]}):e.jsx(c,{size:"sm",variant:"danger-soft",onPress:()=>l(!0),children:"Delete"})}const Ee=t=>t.budget_id;function Q(t){return t.split("-")[0]}function M(t){return t.name??Q(t.budget_id)}function Te(){const t=re(),a=ae(),r=le(),o=ie(),l=oe(),g=de(),[h,d]=i.useState(!1),[p,m]=i.useState(null),[x,s]=i.useState(null),[u,b]=i.useState(null),[S,v]=i.useState(null),[B,k]=i.useState(!1),f=xe(),[A,w]=i.useState(!1),[X,T]=i.useState(void 0),[J,F]=i.useState(!1),D=t.data??[],H=t.isLoading,y=D.find(n=>n.budget_id===p)??null,U=D.find(n=>n.budget_id===x)??null,K=!H&&D.length===0&&!h,Z=D.map(n=>n.budget_id),_=ge(f.selectedKeys,Z),ee=async()=>{F(!0),T(void 0);try{for(const n of _)await l.mutateAsync(n);f.clear(),w(!1)}catch(n){T(n)}finally{F(!1)}},te=i.useMemo(()=>[{id:"budget",header:"Budget",isRowHeader:!0,cell:n=>e.jsxs("div",{className:"flex flex-col gap-0.5",children:[e.jsx("span",{className:"font-medium text-[var(--otari-ink)]",children:n.name??e.jsx("span",{className:"text-[var(--otari-muted)]",children:"(unnamed)"})}),e.jsx("code",{className:"text-[11px] text-[var(--otari-muted)]",title:n.budget_id,children:Q(n.budget_id)})]})},{id:"limit",header:"Limit (per user)",cell:n=>n.max_budget===null?e.jsx("span",{className:"text-[var(--otari-muted)]",children:"Unlimited"}):P(n.max_budget)},{id:"reset",header:"Reset",cell:n=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:Ce(n.budget_duration_sec)})},{id:"users",header:"Users",cell:n=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:n.user_count})},{id:"usage",header:"Usage",cell:n=>e.jsx(Pe,{budget:n})},{id:"actions",header:"Actions",align:"end",cell:n=>e.jsxs("div",{className:"flex items-center justify-end gap-1.5",children:[e.jsx(c,{size:"sm",variant:"ghost",onPress:()=>s(N=>N===n.budget_id?null:n.budget_id),children:x===n.budget_id?"Hide history":"History"}),e.jsx(c,{size:"sm",variant:"ghost",onPress:()=>{d(!1),m(n.budget_id)},children:"Edit"}),e.jsx(Ae,{label:M(n),isPending:l.isPending,onConfirm:()=>l.mutate(n.budget_id)})]})}],[x,l.isPending,l.mutate]),V=async(n,N)=>{k(!0),b(null);const L=await Promise.allSettled(N.map(R=>g.mutateAsync({id:R,body:{budget_id:n}})));k(!1);const I=L.flatMap((R,ne)=>R.status==="rejected"?[N[ne]]:[]);if(I.length>0){v({budgetId:n,userIds:I}),b(new Error(`Budget created, but could not assign it to: ${I.join(", ")}. Retry to try again.`));return}v(null),d(!1)},se=(n,N)=>{if(S){V(S.budgetId,S.userIds);return}b(null),r.mutate(n,{onSuccess:async L=>{if(N.length>0){await V(L.budget_id,N);return}d(!1)}})};return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(ue,{title:"Budgets",description:"Define spending limits and reset schedules. Assign a budget to users to enforce it.",action:h||K?null:e.jsx(c,{variant:"primary",onPress:()=>{m(null),b(null),v(null),d(!0)},children:"Create budget"})}),e.jsx(O,{error:t.error??r.error??o.error??l.error??g.error}),e.jsx(ce,{children:"Assign a budget to users when you create it, or later from the Users page. Each row’s usage aggregates the spend of the users currently on that budget."}),K?e.jsx(ke,{onCreate:()=>{m(null),b(null),v(null),d(!0)}}):null,h?e.jsx(G,{title:"Create budget",submitLabel:S?"Retry assignments":"Create budget",initial:{name:null,max_budget:null,budget_duration_sec:null},error:r.error??u,isPending:r.isPending||B,assignUsers:a.data??[],onSubmit:se,onClose:()=>{b(null),v(null),d(!1)}}):null,y?e.jsx(G,{title:`Edit budget ${M(y)}`,submitLabel:"Save changes",initial:{name:y.name,max_budget:y.max_budget,budget_duration_sec:y.budget_duration_sec},error:o.error,isPending:o.isPending,onSubmit:n=>o.mutate({id:y.budget_id,body:n},{onSuccess:()=>m(null)}),onClose:()=>m(null)},y.budget_id):null,_.length>0?e.jsx(he,{selectedCount:_.length,allMatching:!1,matchingTotal:null,canSelectAllMatching:!1,onSelectAllMatching:()=>{},onClear:f.clear,children:e.jsx(c,{size:"sm",variant:"danger",onPress:()=>w(!0),children:"Delete"})}):null,e.jsx(fe,{ariaLabel:"Budgets",columns:te,rows:D,getRowKey:Ee,isLoading:H,emptyContent:"No budgets yet. Create one to cap spending.",selectionMode:"multiple",selectedKeys:f.selectedKeys,onSelectionChange:f.onSelectionChange}),U?e.jsx(C,{children:e.jsxs(C.Content,{className:"p-0",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-[var(--otari-line)] px-4 py-2",children:[e.jsxs("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:["Reset history — ",M(U)]}),e.jsx(c,{size:"sm",variant:"ghost",onPress:()=>s(null),children:"Close"})]}),e.jsx(Be,{budgetId:U.budget_id})]})}):null,e.jsx(pe,{isOpen:A,onOpenChange:w,heading:"Delete budgets",body:`Delete ${_.length} ${_.length===1?"budget":"budgets"}? Users on ${_.length===1?"it":"them"} will no longer be capped.`,confirmLabel:"Delete",isPending:J,error:X,onConfirm:ee})]})}export{Te as BudgetsPage}; +import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as i}from"./react-dgEcD0HR.js";import{l as re,u as ae,m as le,n as ie,o as oe,p as de,P as ue,E as O,I as ce,q as me}from"./index-CGnfXTEF.js";import{u as xe,r as ge,B as he}from"./tableSelection-9hV37uhu.js";import{C as pe}from"./ConfirmDialog-CWW3AYpK.js";import{D as fe}from"./DataTable-Bmn_eYSV.js";import{F as $}from"./Field-Dwp6u3t8.js";import{C as E,I as be,a as je,b as ve,B as c,d as C,S as ye}from"./heroui-BI50yK5B.js";const Ne=50;function Se({value:t,onChange:a,users:r,label:o,description:l}){const[g,h]=i.useState(""),d=i.useMemo(()=>r.filter(s=>!s.user_id.startsWith("apikey-")).map(s=>({id:s.user_id,label:s.alias?`${s.user_id} (${s.alias})`:s.user_id})),[r]),p=i.useMemo(()=>{const s=g.trim().toLowerCase();return d.filter(u=>!t.includes(u.id)).filter(u=>!s||u.id.toLowerCase().includes(s)||u.label.toLowerCase().includes(s)).slice(0,Ne)},[d,t,g]),m=s=>{t.includes(s)||a([...t,s]),h("")},x=s=>a(t.filter(u=>u!==s));return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{children:[e.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:o}),l?e.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:l}):null]}),t.length>0?e.jsx("div",{className:"flex flex-wrap gap-1.5",children:t.map(s=>e.jsxs("span",{className:"inline-flex items-center gap-1 rounded-full bg-[var(--otari-brand-tint)] px-2.5 py-1 font-mono text-xs text-[var(--otari-brand-dark)]",children:[s,e.jsx("button",{type:"button","aria-label":`Remove ${s}`,onClick:()=>x(s),className:"text-[var(--otari-brand-dark)] hover:text-red-700",children:"×"})]},s))}):null,d.length===0?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"No users yet. Create users first, then assign them here or from the Users page."}):e.jsxs(E.Root,{allowsEmptyCollection:!0,menuTrigger:"input",inputValue:g,onInputChange:h,selectedKey:null,onSelectionChange:s=>{s!=null&&m(String(s))},className:"flex flex-col gap-1",children:[e.jsxs(E.InputGroup,{children:[e.jsx(be,{"aria-label":"Add a user",placeholder:"Search users…",autoComplete:"off"}),e.jsx(E.Trigger,{})]}),e.jsx(E.Popover,{children:e.jsx(je,{items:p,className:"max-h-72 overflow-auto",children:s=>e.jsx(ve,{id:s.id,textValue:s.label,children:s.label})})})]})]})}const _e=new Intl.NumberFormat(void 0,{style:"currency",currency:"USD",maximumFractionDigits:2});function P(t){return _e.format(t)}const j=86400,q=3600,z=[{label:"No reset",seconds:null},{label:"Daily",seconds:j},{label:"Weekly",seconds:7*j},{label:"Monthly",seconds:30*j}];function Ce(t){if(t===null)return"No reset";const a=z.find(r=>r.seconds===t);return a?a.label:t%j===0?`Every ${t/j} days`:t%q===0?`Every ${t/q} hours`:`Every ${t}s`}function W(t){if(!t)return"—";const a=new Date(t);return Number.isNaN(a.getTime())?"—":a.toLocaleString()}function we(t){const a=t.trim();if(a==="")return{value:null,valid:!0};const r=Number(a);return!Number.isFinite(r)||r<0?{value:null,valid:!1}:{value:r,valid:!0}}function Y(t){return t!==null&&t%j===0?String(t/j):""}function De({value:t,onChange:a,onInvalidChange:r}){const o=z.some(s=>s.seconds===t),[l,g]=i.useState(!o),[h,d]=i.useState(()=>Y(t)),p=h.trim(),m=Number(p),x=p!==""&&(!Number.isSafeInteger(m)||m<=0);return i.useEffect(()=>{r==null||r(x)},[x,r]),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Reset period"}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[z.map(s=>e.jsx(c,{size:"sm",variant:!l&&t===s.seconds?"primary":"outline",onPress:()=>{g(!1),d(Y(s.seconds)),a(s.seconds)},children:s.label},s.label)),e.jsx(c,{size:"sm",variant:l?"primary":"outline",onPress:()=>g(!0),children:"Custom"})]}),l?e.jsx("div",{className:"flex items-end gap-2",children:e.jsx($,{label:"Every N days",value:h,onChange:s=>{d(s);const u=Number(s.trim());a(s.trim()===""||!Number.isSafeInteger(u)||u<=0?null:u*j)},placeholder:"14",description:x?e.jsx("span",{className:"text-red-700",children:"Enter a whole number of days."}):"Whole days between resets."})}):null,e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Spend returns to zero each period. A user’s clock starts when the budget is assigned to them."})]})}function G({title:t,submitLabel:a,initial:r,error:o,isPending:l,onSubmit:g,onClose:h,assignUsers:d}){const[p,m]=i.useState(r.name??""),[x,s]=i.useState(r.max_budget===null?"":String(r.max_budget)),[u,b]=i.useState(r.budget_duration_sec),[S,v]=i.useState(!1),[B,k]=i.useState([]),f=we(x),A=!l&&f.valid&&!S,w=()=>{A&&g({name:p.trim()||null,max_budget:f.value,budget_duration_sec:u},B)};return e.jsx(C,{children:e.jsxs(C.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsx("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:t}),e.jsx(O,{error:o}),e.jsx($,{label:"Name (optional)",value:p,onChange:m,autoFocus:!0,placeholder:"team-free-tier",description:"A label to recognize this budget later."}),e.jsx($,{label:"Spending limit (USD)",value:x,onChange:s,placeholder:"100.00",description:f.valid?"The most a single user on this budget may spend per period. Leave blank for no limit.":e.jsx("span",{className:"text-red-700",children:"Enter a non-negative number, or leave blank for no limit."})}),e.jsx(De,{value:u,onChange:b,onInvalidChange:v}),d?e.jsx(Se,{label:"Assign to users (optional)",description:"Attach this budget to existing users now. You can also manage assignments later on the Users page.",value:B,onChange:k,users:d}):null,e.jsxs("div",{className:"flex gap-2",children:[e.jsx(c,{variant:"primary",isDisabled:!A,onPress:w,children:l?"Saving…":a}),e.jsx(c,{variant:"ghost",isDisabled:l,onPress:h,children:"Cancel"})]})]})})}function Pe({budget:t}){if(t.user_count===0)return e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"No users assigned"});const a=t.total_spend;if(t.max_budget===null)return e.jsxs("span",{className:"text-xs text-[var(--otari-ink)]",children:[P(a)," spent",e.jsx("span",{className:"text-[var(--otari-muted)]",children:" · no limit"})]});const r=t.max_budget*t.user_count,o=r>0?Math.min(100,a/r*100):0,l=a>r;return e.jsxs("div",{className:"flex min-w-[140px] flex-col gap-1",children:[e.jsxs("div",{className:"flex items-baseline justify-between gap-2 text-xs",children:[e.jsx("span",{className:"text-[var(--otari-ink)]",children:P(a)}),e.jsxs("span",{className:"text-[var(--otari-muted)]",children:["of ",P(r)]})]}),e.jsx("div",{className:"h-1.5 w-full overflow-hidden rounded-full bg-[var(--otari-line)]",role:"progressbar","aria-valuenow":Math.round(o),"aria-valuemin":0,"aria-valuemax":100,"aria-label":"Aggregate spend against total allocation",children:e.jsx("div",{className:`h-full rounded-full ${l?"bg-red-500":"bg-[var(--otari-brand)]"}`,style:{width:`${Math.max(o,l?100:2)}%`}})})]})}function Be({budgetId:t}){const a=me(t);if(a.isLoading)return e.jsxs("div",{className:"flex items-center gap-2 px-4 py-4 text-sm text-[var(--otari-muted)]",children:[e.jsx(ye,{size:"sm"})," Loading reset history…"]});if(a.error)return e.jsx("div",{className:"px-4 py-4",children:e.jsx(O,{error:a.error})});const r=a.data??[];return r.length===0?e.jsx("div",{className:"px-4 py-4 text-sm text-[var(--otari-muted)]",children:"No resets recorded yet for this budget."}):e.jsx("div",{className:"overflow-x-auto px-4 py-3",children:e.jsxs("table",{className:"w-full border-collapse text-xs",children:[e.jsx("thead",{className:"text-left text-[var(--otari-muted)]",children:e.jsxs("tr",{children:[e.jsx("th",{className:"py-1.5 pr-4 font-medium",children:"User"}),e.jsx("th",{className:"py-1.5 pr-4 font-medium",children:"Spend cleared"}),e.jsx("th",{className:"py-1.5 pr-4 font-medium",children:"Reset at"}),e.jsx("th",{className:"py-1.5 font-medium",children:"Next reset"})]})}),e.jsx("tbody",{children:r.map(o=>e.jsxs("tr",{className:"border-t border-[var(--otari-line)]",children:[e.jsx("td",{className:"py-1.5 pr-4",children:e.jsx("code",{children:o.user_id??"—"})}),e.jsx("td",{className:"py-1.5 pr-4 text-[var(--otari-ink)]",children:P(o.previous_spend)}),e.jsx("td",{className:"py-1.5 pr-4 text-[var(--otari-muted)]",children:W(o.reset_at)}),e.jsx("td",{className:"py-1.5 text-[var(--otari-muted)]",children:W(o.next_reset_at)})]},o.id))})]})})}function ke({onCreate:t}){return e.jsx(C,{children:e.jsxs(C.Content,{className:"flex flex-col gap-4 p-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:"No budgets yet"}),e.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:"A budget caps how much a user may spend and, optionally, resets that spend on a schedule. Create one, then assign it to users to enforce a limit."})]}),e.jsx("div",{children:e.jsx(c,{variant:"primary",onPress:t,children:"Create your first budget"})})]})})}function Ae({label:t,isPending:a,onConfirm:r}){const[o,l]=i.useState(!1);return o?e.jsxs("div",{className:"flex flex-col items-end gap-1.5 rounded-lg border border-amber-200 bg-amber-50 p-2 text-right",children:[e.jsxs("span",{className:"max-w-xs text-xs text-amber-800",children:["Delete ",e.jsx("strong",{children:t}),"? Users keep their spend but lose this limit. Cannot be undone."]}),e.jsxs("span",{className:"inline-flex gap-1",children:[e.jsx(c,{size:"sm",variant:"danger",isDisabled:a,onPress:r,children:"Delete permanently"}),e.jsx(c,{size:"sm",variant:"ghost",isDisabled:a,onPress:()=>l(!1),children:"Cancel"})]})]}):e.jsx(c,{size:"sm",variant:"danger-soft",onPress:()=>l(!0),children:"Delete"})}const Ee=t=>t.budget_id;function Q(t){return t.split("-")[0]}function M(t){return t.name??Q(t.budget_id)}function Te(){const t=re(),a=ae(),r=le(),o=ie(),l=oe(),g=de(),[h,d]=i.useState(!1),[p,m]=i.useState(null),[x,s]=i.useState(null),[u,b]=i.useState(null),[S,v]=i.useState(null),[B,k]=i.useState(!1),f=xe(),[A,w]=i.useState(!1),[X,T]=i.useState(void 0),[J,F]=i.useState(!1),D=t.data??[],H=t.isLoading,y=D.find(n=>n.budget_id===p)??null,U=D.find(n=>n.budget_id===x)??null,K=!H&&D.length===0&&!h,Z=D.map(n=>n.budget_id),_=ge(f.selectedKeys,Z),ee=async()=>{F(!0),T(void 0);try{for(const n of _)await l.mutateAsync(n);f.clear(),w(!1)}catch(n){T(n)}finally{F(!1)}},te=i.useMemo(()=>[{id:"budget",header:"Budget",isRowHeader:!0,cell:n=>e.jsxs("div",{className:"flex flex-col gap-0.5",children:[e.jsx("span",{className:"font-medium text-[var(--otari-ink)]",children:n.name??e.jsx("span",{className:"text-[var(--otari-muted)]",children:"(unnamed)"})}),e.jsx("code",{className:"text-[11px] text-[var(--otari-muted)]",title:n.budget_id,children:Q(n.budget_id)})]})},{id:"limit",header:"Limit (per user)",cell:n=>n.max_budget===null?e.jsx("span",{className:"text-[var(--otari-muted)]",children:"Unlimited"}):P(n.max_budget)},{id:"reset",header:"Reset",cell:n=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:Ce(n.budget_duration_sec)})},{id:"users",header:"Users",cell:n=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:n.user_count})},{id:"usage",header:"Usage",cell:n=>e.jsx(Pe,{budget:n})},{id:"actions",header:"Actions",align:"end",cell:n=>e.jsxs("div",{className:"flex items-center justify-end gap-1.5",children:[e.jsx(c,{size:"sm",variant:"ghost",onPress:()=>s(N=>N===n.budget_id?null:n.budget_id),children:x===n.budget_id?"Hide history":"History"}),e.jsx(c,{size:"sm",variant:"ghost",onPress:()=>{d(!1),m(n.budget_id)},children:"Edit"}),e.jsx(Ae,{label:M(n),isPending:l.isPending,onConfirm:()=>l.mutate(n.budget_id)})]})}],[x,l.isPending,l.mutate]),V=async(n,N)=>{k(!0),b(null);const L=await Promise.allSettled(N.map(R=>g.mutateAsync({id:R,body:{budget_id:n}})));k(!1);const I=L.flatMap((R,ne)=>R.status==="rejected"?[N[ne]]:[]);if(I.length>0){v({budgetId:n,userIds:I}),b(new Error(`Budget created, but could not assign it to: ${I.join(", ")}. Retry to try again.`));return}v(null),d(!1)},se=(n,N)=>{if(S){V(S.budgetId,S.userIds);return}b(null),r.mutate(n,{onSuccess:async L=>{if(N.length>0){await V(L.budget_id,N);return}d(!1)}})};return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(ue,{title:"Budgets",description:"Define spending limits and reset schedules. Assign a budget to users to enforce it.",action:h||K?null:e.jsx(c,{variant:"primary",onPress:()=>{m(null),b(null),v(null),d(!0)},children:"Create budget"})}),e.jsx(O,{error:t.error??r.error??o.error??l.error??g.error}),e.jsx(ce,{children:"Assign a budget to users when you create it, or later from the Users page. Each row’s usage aggregates the spend of the users currently on that budget."}),K?e.jsx(ke,{onCreate:()=>{m(null),b(null),v(null),d(!0)}}):null,h?e.jsx(G,{title:"Create budget",submitLabel:S?"Retry assignments":"Create budget",initial:{name:null,max_budget:null,budget_duration_sec:null},error:r.error??u,isPending:r.isPending||B,assignUsers:a.data??[],onSubmit:se,onClose:()=>{b(null),v(null),d(!1)}}):null,y?e.jsx(G,{title:`Edit budget ${M(y)}`,submitLabel:"Save changes",initial:{name:y.name,max_budget:y.max_budget,budget_duration_sec:y.budget_duration_sec},error:o.error,isPending:o.isPending,onSubmit:n=>o.mutate({id:y.budget_id,body:n},{onSuccess:()=>m(null)}),onClose:()=>m(null)},y.budget_id):null,_.length>0?e.jsx(he,{selectedCount:_.length,allMatching:!1,matchingTotal:null,canSelectAllMatching:!1,onSelectAllMatching:()=>{},onClear:f.clear,children:e.jsx(c,{size:"sm",variant:"danger",onPress:()=>w(!0),children:"Delete"})}):null,e.jsx(fe,{ariaLabel:"Budgets",columns:te,rows:D,getRowKey:Ee,isLoading:H,emptyContent:"No budgets yet. Create one to cap spending.",selectionMode:"multiple",selectedKeys:f.selectedKeys,onSelectionChange:f.onSelectionChange}),U?e.jsx(C,{children:e.jsxs(C.Content,{className:"p-0",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-[var(--otari-line)] px-4 py-2",children:[e.jsxs("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:["Reset history — ",M(U)]}),e.jsx(c,{size:"sm",variant:"ghost",onPress:()=>s(null),children:"Close"})]}),e.jsx(Be,{budgetId:U.budget_id})]})}):null,e.jsx(pe,{isOpen:A,onOpenChange:w,heading:"Delete budgets",body:`Delete ${_.length} ${_.length===1?"budget":"budgets"}? Users on ${_.length===1?"it":"them"} will no longer be capped.`,confirmLabel:"Delete",isPending:J,error:X,onConfirm:ee})]})}export{Te as BudgetsPage}; diff --git a/src/gateway/static/dashboard/assets/ConfirmDialog-nzYO6eyy.js b/src/gateway/static/dashboard/assets/ConfirmDialog-CWW3AYpK.js similarity index 84% rename from src/gateway/static/dashboard/assets/ConfirmDialog-nzYO6eyy.js rename to src/gateway/static/dashboard/assets/ConfirmDialog-CWW3AYpK.js index a76977ee..6f4b3376 100644 --- a/src/gateway/static/dashboard/assets/ConfirmDialog-nzYO6eyy.js +++ b/src/gateway/static/dashboard/assets/ConfirmDialog-CWW3AYpK.js @@ -1 +1 @@ -import{j as r}from"./tanstack-query-1t81HyiD.js";import{E as j}from"./index-CI2beHfq.js";import{A as e,B as l}from"./heroui-DZj66Arc.js";function p({isOpen:s,onOpenChange:a,heading:n,body:o,confirmLabel:t,confirmVariant:c="danger",isPending:i,error:d,onConfirm:x}){return r.jsx(e,{isOpen:s,onOpenChange:a,children:s?r.jsx(e.Backdrop,{children:r.jsx(e.Container,{placement:"center",size:"md",children:r.jsxs(e.Dialog,{children:[r.jsx(e.Header,{children:r.jsx(e.Heading,{children:n})}),r.jsxs(e.Body,{className:"flex flex-col gap-4",children:[r.jsx("div",{className:"text-sm text-[var(--otari-muted)]",children:o}),r.jsx(j,{error:d})]}),r.jsxs(e.Footer,{children:[r.jsx(l,{variant:"ghost",isDisabled:i,onPress:()=>a(!1),children:"Cancel"}),r.jsx(l,{variant:c,isPending:i,onPress:x,children:t})]})]})})}):null})}export{p as C}; +import{j as r}from"./tanstack-query-1t81HyiD.js";import{E as j}from"./index-CGnfXTEF.js";import{A as e,B as l}from"./heroui-BI50yK5B.js";function p({isOpen:s,onOpenChange:a,heading:n,body:o,confirmLabel:t,confirmVariant:c="danger",isPending:i,error:d,onConfirm:x}){return r.jsx(e,{isOpen:s,onOpenChange:a,children:s?r.jsx(e.Backdrop,{children:r.jsx(e.Container,{placement:"center",size:"md",children:r.jsxs(e.Dialog,{children:[r.jsx(e.Header,{children:r.jsx(e.Heading,{children:n})}),r.jsxs(e.Body,{className:"flex flex-col gap-4",children:[r.jsx("div",{className:"text-sm text-[var(--otari-muted)]",children:o}),r.jsx(j,{error:d})]}),r.jsxs(e.Footer,{children:[r.jsx(l,{variant:"ghost",isDisabled:i,onPress:()=>a(!1),children:"Cancel"}),r.jsx(l,{variant:c,isPending:i,onPress:x,children:t})]})]})})}):null})}export{p as C}; diff --git a/src/gateway/static/dashboard/assets/DataTable-CrQq0sYf.js b/src/gateway/static/dashboard/assets/DataTable-Bmn_eYSV.js similarity index 69% rename from src/gateway/static/dashboard/assets/DataTable-CrQq0sYf.js rename to src/gateway/static/dashboard/assets/DataTable-Bmn_eYSV.js index 51ab30f2..aac34626 100644 --- a/src/gateway/static/dashboard/assets/DataTable-CrQq0sYf.js +++ b/src/gateway/static/dashboard/assets/DataTable-Bmn_eYSV.js @@ -1 +1 @@ -import{j as t}from"./tanstack-query-1t81HyiD.js";import{r as s,a as O}from"./react-dgEcD0HR.js";import{h as i,S as D,$ as I}from"./heroui-DZj66Arc.js";function _({isSelected:c,isIndeterminate:a,isDisabled:o}){const[l,f]=s.useState(null);s.useEffect(()=>{l!==null&&c===l&&f(null)},[c,l]),s.useEffect(()=>{if(l===null)return;const j=setTimeout(()=>f(null),600);return()=>clearTimeout(j)},[l]);const b=l??(c||a);return t.jsx("span",{onPointerDown:()=>{o||f(!c)},className:`flex h-4 w-4 items-center justify-center rounded border transition-colors ${b?"border-[var(--otari-brand)] bg-[var(--otari-brand)] text-white":"border-[var(--otari-line)] bg-[var(--otari-surface)]"} group-data-[focus-visible]:outline-2 group-data-[focus-visible]:outline-[var(--otari-brand)]`,children:a&&l===null?t.jsx("svg",{viewBox:"0 0 24 24",className:"h-3 w-3",fill:"none",stroke:"currentColor",strokeWidth:3,"aria-hidden":!0,children:t.jsx("line",{x1:"6",x2:"18",y1:"12",y2:"12",strokeLinecap:"round"})}):b?t.jsx("svg",{viewBox:"0 0 24 24",className:"h-3 w-3",fill:"none",stroke:"currentColor",strokeWidth:3,"aria-hidden":!0,children:t.jsx("polyline",{points:"5 12 10 17 19 7",strokeLinecap:"round",strokeLinejoin:"round"})}):null})}function T({ariaLabel:c}){return t.jsx(I,{slot:"selection","aria-label":c,className:"group inline-flex items-center",children:({isSelected:a,isIndeterminate:o,isDisabled:l})=>t.jsx(_,{isSelected:a,isIndeterminate:o,isDisabled:l})})}const B=44;function A({ariaLabel:c,columns:a,rows:o,getRowKey:l,isLoading:f=!1,emptyContent:b="No rows.",selectionMode:j="none",selectedKeys:m,onSelectionChange:P,disabledKeys:W,sortDescriptor:w,onSortChange:z,onRowAction:h,rowClassName:g,resizable:N=!1,detailKey:d=null,renderDetail:x}){const v=j==="multiple",q=N?i.ResizableContainer:i.ScrollContainer,E=a.length+(v?1:0),C=s.useRef(null),[L,$]=s.useState(null),S=s.useMemo(()=>d!=null&&x?o.find(e=>l(e)===d)??null:null,[d,x,o,l]);s.useLayoutEffect(()=>{$(null);const e=C.current;if(!e||d==null||!S)return;const r=document.createElement("tr");r.className="otari-detail-row",r.setAttribute("role","presentation");const n=document.createElement("td");n.colSpan=E,r.appendChild(n);const p=()=>{const R=e.querySelector(`tbody tr[data-key="${CSS.escape(d)}"]`);if(!R)return!1;for(const M of e.querySelectorAll(".otari-detail-opening"))M.classList.remove("otari-detail-opening");return R.after(r),$(n),!0};let u=null;return p()||(u=new MutationObserver(()=>{p()&&(u==null||u.disconnect(),u=null)}),u.observe(e,{childList:!0,subtree:!0})),()=>{u==null||u.disconnect(),r.remove()}},[d,S,E,o,w]);const y=s.useCallback(e=>{var r;if(h){if(x&&e!==d){const n=(r=C.current)==null?void 0:r.querySelector(`tbody tr[data-key="${CSS.escape(e)}"]`);n==null||n.classList.add("otari-detail-opening"),setTimeout(()=>n==null?void 0:n.classList.remove("otari-detail-opening"),1500)}h(e)}},[h,x,d]),k=s.useCallback(e=>{var p;if(!h||!(m==="all"||m instanceof Set&&m.size>0))return null;const n=e.target instanceof Element?e.target:null;return!n||n.closest("label[slot=selection], button, a, input, select, textarea, .otari-detail-row")?null:((p=n.closest("tbody tr[data-key]"))==null?void 0:p.getAttribute("data-key"))??null},[h,m]),H=s.useCallback(e=>{const r=l(e);return t.jsxs(i.Row,{id:r,className:g==null?void 0:g(e),children:[v?t.jsx(i.Cell,{children:t.jsx(T,{ariaLabel:"Select row"})}):null,a.map(n=>t.jsx(i.Cell,{className:n.align==="end"?"text-right tabular-nums":void 0,children:n.cell(e)},n.id))]},r)},[l,g,v,a]);return t.jsxs(i.Root,{ref:C,className:"otari-table",children:[t.jsx(q,{className:"overflow-x-auto",onPointerDownCapture:e=>{k(e)!=null&&e.stopPropagation()},onMouseDownCapture:e=>{k(e)!=null&&e.stopPropagation()},onClickCapture:e=>{const r=k(e);r!=null&&(e.stopPropagation(),y(r))},children:t.jsxs(i.Content,{"aria-label":c,className:"w-full text-sm",selectionMode:j,selectionBehavior:"toggle",disabledBehavior:"selection",selectedKeys:m,onSelectionChange:P,disabledKeys:W,sortDescriptor:w,onSortChange:z,onRowAction:h?e=>y(String(e)):void 0,children:[t.jsxs(i.Header,{children:[v?t.jsx(i.Column,{width:B,minWidth:B,children:t.jsx(T,{ariaLabel:"Select all rows"})}):null,a.map(e=>t.jsx(i.Column,{id:e.id,isRowHeader:e.isRowHeader,allowsSorting:e.allowsSorting,width:e.width,minWidth:e.minWidth,className:e.align==="end"?"text-right":void 0,children:({sortDirection:r})=>t.jsxs("div",{className:`flex items-center gap-1 ${e.align==="end"?"justify-end":""}`,children:[e.allowsSorting?t.jsx(i.SortableColumnHeader,{sortDirection:r,children:e.header}):t.jsx("span",{children:e.header}),N?t.jsx(i.ColumnResizer,{className:"ml-auto cursor-col-resize px-1"}):null]})},e.id))]}),t.jsx(i.Body,{items:f&&o.length===0?[]:o,dependencies:[H],renderEmptyState:()=>t.jsx("div",{className:"px-4 py-10 text-center text-[var(--otari-muted)]",children:f?t.jsxs("span",{className:"inline-flex items-center gap-2",children:[t.jsx(D,{size:"sm"})," Loading…"]}):b}),children:H})]})}),L&&S&&x?O.createPortal(t.jsx("div",{className:"otari-detail-reveal",children:t.jsx("div",{children:x(S)})}),L):null]})}export{A as D}; +import{j as t}from"./tanstack-query-1t81HyiD.js";import{r as s,a as O}from"./react-dgEcD0HR.js";import{j as i,S as D,k as I}from"./heroui-BI50yK5B.js";function _({isSelected:c,isIndeterminate:a,isDisabled:o}){const[l,f]=s.useState(null);s.useEffect(()=>{l!==null&&c===l&&f(null)},[c,l]),s.useEffect(()=>{if(l===null)return;const b=setTimeout(()=>f(null),600);return()=>clearTimeout(b)},[l]);const j=l??(c||a);return t.jsx("span",{onPointerDown:()=>{o||f(!c)},className:`flex h-4 w-4 items-center justify-center rounded border transition-colors ${j?"border-[var(--otari-brand)] bg-[var(--otari-brand)] text-white":"border-[var(--otari-line)] bg-[var(--otari-surface)]"} group-data-[focus-visible]:outline-2 group-data-[focus-visible]:outline-[var(--otari-brand)]`,children:a&&l===null?t.jsx("svg",{viewBox:"0 0 24 24",className:"h-3 w-3",fill:"none",stroke:"currentColor",strokeWidth:3,"aria-hidden":!0,children:t.jsx("line",{x1:"6",x2:"18",y1:"12",y2:"12",strokeLinecap:"round"})}):j?t.jsx("svg",{viewBox:"0 0 24 24",className:"h-3 w-3",fill:"none",stroke:"currentColor",strokeWidth:3,"aria-hidden":!0,children:t.jsx("polyline",{points:"5 12 10 17 19 7",strokeLinecap:"round",strokeLinejoin:"round"})}):null})}function $({ariaLabel:c}){return t.jsx(I,{slot:"selection","aria-label":c,className:"group inline-flex items-center",children:({isSelected:a,isIndeterminate:o,isDisabled:l})=>t.jsx(_,{isSelected:a,isIndeterminate:o,isDisabled:l})})}const B=44;function A({ariaLabel:c,columns:a,rows:o,getRowKey:l,isLoading:f=!1,emptyContent:j="No rows.",selectionMode:b="none",selectedKeys:m,onSelectionChange:P,disabledKeys:W,sortDescriptor:w,onSortChange:z,onRowAction:h,rowClassName:g,resizable:N=!1,detailKey:d=null,renderDetail:x}){const v=b==="multiple",q=N?i.ResizableContainer:i.ScrollContainer,E=a.length+(v?1:0),C=s.useRef(null),[L,y]=s.useState(null),S=s.useMemo(()=>d!=null&&x?o.find(e=>l(e)===d)??null:null,[d,x,o,l]);s.useLayoutEffect(()=>{y(null);const e=C.current;if(!e||d==null||!S)return;const r=document.createElement("tr");r.className="otari-detail-row",r.setAttribute("role","presentation");const n=document.createElement("td");n.colSpan=E,r.appendChild(n);const p=()=>{const T=e.querySelector(`tbody tr[data-key="${CSS.escape(d)}"]`);if(!T)return!1;for(const M of e.querySelectorAll(".otari-detail-opening"))M.classList.remove("otari-detail-opening");return T.after(r),y(n),!0};let u=null;return p()||(u=new MutationObserver(()=>{p()&&(u==null||u.disconnect(),u=null)}),u.observe(e,{childList:!0,subtree:!0})),()=>{u==null||u.disconnect(),r.remove()}},[d,S,E,o,w]);const H=s.useCallback(e=>{var r;if(h){if(x&&e!==d){const n=(r=C.current)==null?void 0:r.querySelector(`tbody tr[data-key="${CSS.escape(e)}"]`);n==null||n.classList.add("otari-detail-opening"),setTimeout(()=>n==null?void 0:n.classList.remove("otari-detail-opening"),1500)}h(e)}},[h,x,d]),k=s.useCallback(e=>{var p;if(!h||!(m==="all"||m instanceof Set&&m.size>0))return null;const n=e.target instanceof Element?e.target:null;return!n||n.closest("label[slot=selection], button, a, input, select, textarea, .otari-detail-row")?null:((p=n.closest("tbody tr[data-key]"))==null?void 0:p.getAttribute("data-key"))??null},[h,m]),R=s.useCallback(e=>{const r=l(e);return t.jsxs(i.Row,{id:r,className:g==null?void 0:g(e),children:[v?t.jsx(i.Cell,{children:t.jsx($,{ariaLabel:"Select row"})}):null,a.map(n=>t.jsx(i.Cell,{className:n.align==="end"?"text-right tabular-nums":void 0,children:n.cell(e)},n.id))]},r)},[l,g,v,a]);return t.jsxs(i.Root,{ref:C,className:"otari-table",children:[t.jsx(q,{className:"overflow-x-auto",onPointerDownCapture:e=>{k(e)!=null&&e.stopPropagation()},onMouseDownCapture:e=>{k(e)!=null&&e.stopPropagation()},onClickCapture:e=>{const r=k(e);r!=null&&(e.stopPropagation(),H(r))},children:t.jsxs(i.Content,{"aria-label":c,className:"w-full text-sm",selectionMode:b,selectionBehavior:"toggle",disabledBehavior:"selection",selectedKeys:m,onSelectionChange:P,disabledKeys:W,sortDescriptor:w,onSortChange:z,onRowAction:h?e=>H(String(e)):void 0,children:[t.jsxs(i.Header,{children:[v?t.jsx(i.Column,{width:B,minWidth:B,children:t.jsx($,{ariaLabel:"Select all rows"})}):null,a.map(e=>t.jsx(i.Column,{id:e.id,isRowHeader:e.isRowHeader,allowsSorting:e.allowsSorting,width:e.width,minWidth:e.minWidth,className:e.align==="end"?"text-right":void 0,children:({sortDirection:r})=>t.jsxs("div",{className:`flex items-center gap-1 ${e.align==="end"?"justify-end":""}`,children:[e.allowsSorting?t.jsx(i.SortableColumnHeader,{sortDirection:r,children:e.header}):t.jsx("span",{children:e.header}),N?t.jsx(i.ColumnResizer,{className:"ml-auto cursor-col-resize px-1"}):null]})},e.id))]}),t.jsx(i.Body,{items:f&&o.length===0?[]:o,dependencies:[R],renderEmptyState:()=>t.jsx("div",{className:"px-4 py-10 text-center text-[var(--otari-muted)]",children:f?t.jsxs("span",{className:"inline-flex items-center gap-2",children:[t.jsx(D,{size:"sm"})," Loading…"]}):j}),children:R})]})}),L&&S&&x?O.createPortal(t.jsx("div",{className:"otari-detail-reveal",children:t.jsx("div",{children:x(S)})}),L):null]})}export{A as D}; diff --git a/src/gateway/static/dashboard/assets/DocsPage-C8AK643M.js b/src/gateway/static/dashboard/assets/DocsPage-BAH_T1JY.js similarity index 99% rename from src/gateway/static/dashboard/assets/DocsPage-C8AK643M.js rename to src/gateway/static/dashboard/assets/DocsPage-BAH_T1JY.js index b9dfa299..f2d8990c 100644 --- a/src/gateway/static/dashboard/assets/DocsPage-C8AK643M.js +++ b/src/gateway/static/dashboard/assets/DocsPage-BAH_T1JY.js @@ -1,4 +1,4 @@ -import{j as re}from"./tanstack-query-1t81HyiD.js";import{P as gi}from"./index-CI2beHfq.js";import{d as ct}from"./heroui-DZj66Arc.js";import{g as nr}from"./react-dgEcD0HR.js";function yi(e,t){const n={};return(e[e.length-1]===""?[...e,""]:e).join((n.padRight?" ":"")+","+(n.padLeft===!1?"":" ")).trim()}const ki=/^[$_\p{ID_Start}][$_\u{200C}\u{200D}\p{ID_Continue}]*$/u,xi=/^[$_\p{ID_Start}][-$_\u{200C}\u{200D}\p{ID_Continue}]*$/u,bi={};function ft(e,t){return(bi.jsx?xi:ki).test(e)}const wi=/[ \t\n\f\r]/g;function Si(e){return typeof e=="object"?e.type==="text"?ht(e.value):!1:ht(e)}function ht(e){return e.replace(wi,"")===""}class Ke{constructor(t,n,r){this.normal=n,this.property=t,r&&(this.space=r)}}Ke.prototype.normal={};Ke.prototype.property={};Ke.prototype.space=void 0;function tr(e,t){const n={},r={};for(const i of e)Object.assign(n,i.property),Object.assign(r,i.normal);return new Ke(n,r,t)}function zn(e){return e.toLowerCase()}class ee{constructor(t,n){this.attribute=n,this.property=t}}ee.prototype.attribute="";ee.prototype.booleanish=!1;ee.prototype.boolean=!1;ee.prototype.commaOrSpaceSeparated=!1;ee.prototype.commaSeparated=!1;ee.prototype.defined=!1;ee.prototype.mustUseProperty=!1;ee.prototype.number=!1;ee.prototype.overloadedBoolean=!1;ee.prototype.property="";ee.prototype.spaceSeparated=!1;ee.prototype.space=void 0;let Ci=0;const L=Ae(),Y=Ae(),Dn=Ae(),E=Ae(),$=Ae(),Ie=Ae(),te=Ae();function Ae(){return 2**++Ci}const Ln=Object.freeze(Object.defineProperty({__proto__:null,boolean:L,booleanish:Y,commaOrSpaceSeparated:te,commaSeparated:Ie,number:E,overloadedBoolean:Dn,spaceSeparated:$},Symbol.toStringTag,{value:"Module"})),pn=Object.keys(Ln);class Hn extends ee{constructor(t,n,r,i){let o=-1;if(super(t,n),pt(this,"space",i),typeof r=="number")for(;++o4&&n.slice(0,4)==="data"&&vi.test(t)){if(t.charAt(4)==="-"){const o=t.slice(5).replace(mt,Di);r="data"+o.charAt(0).toUpperCase()+o.slice(1)}else{const o=t.slice(4);if(!mt.test(o)){let l=o.replace(Ai,zi);l.charAt(0)!=="-"&&(l="-"+l),t="data"+l}}i=Hn}return new i(r,t)}function zi(e){return"-"+e.toLowerCase()}function Di(e){return e.charAt(1).toUpperCase()}const Li=tr([rr,Ei,or,ar,ur],"html"),Un=tr([rr,Ii,or,ar,ur],"svg");function Fi(e){return e.join(" ").trim()}var De={},mn,dt;function Ri(){if(dt)return mn;dt=1;var e=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g,t=/\n/g,n=/^\s*/,r=/^(\*?[-#/*\\\w]+(\[[0-9a-z_-]+\])?)\s*/,i=/^:\s*/,o=/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/,l=/^[;\s]*/,a=/^\s+|\s+$/g,u=` +import{j as re}from"./tanstack-query-1t81HyiD.js";import{P as gi}from"./index-CGnfXTEF.js";import{d as ct}from"./heroui-BI50yK5B.js";import{g as nr}from"./react-dgEcD0HR.js";function yi(e,t){const n={};return(e[e.length-1]===""?[...e,""]:e).join((n.padRight?" ":"")+","+(n.padLeft===!1?"":" ")).trim()}const ki=/^[$_\p{ID_Start}][$_\u{200C}\u{200D}\p{ID_Continue}]*$/u,xi=/^[$_\p{ID_Start}][-$_\u{200C}\u{200D}\p{ID_Continue}]*$/u,bi={};function ft(e,t){return(bi.jsx?xi:ki).test(e)}const wi=/[ \t\n\f\r]/g;function Si(e){return typeof e=="object"?e.type==="text"?ht(e.value):!1:ht(e)}function ht(e){return e.replace(wi,"")===""}class Ke{constructor(t,n,r){this.normal=n,this.property=t,r&&(this.space=r)}}Ke.prototype.normal={};Ke.prototype.property={};Ke.prototype.space=void 0;function tr(e,t){const n={},r={};for(const i of e)Object.assign(n,i.property),Object.assign(r,i.normal);return new Ke(n,r,t)}function zn(e){return e.toLowerCase()}class ee{constructor(t,n){this.attribute=n,this.property=t}}ee.prototype.attribute="";ee.prototype.booleanish=!1;ee.prototype.boolean=!1;ee.prototype.commaOrSpaceSeparated=!1;ee.prototype.commaSeparated=!1;ee.prototype.defined=!1;ee.prototype.mustUseProperty=!1;ee.prototype.number=!1;ee.prototype.overloadedBoolean=!1;ee.prototype.property="";ee.prototype.spaceSeparated=!1;ee.prototype.space=void 0;let Ci=0;const L=Ae(),Y=Ae(),Dn=Ae(),E=Ae(),$=Ae(),Ie=Ae(),te=Ae();function Ae(){return 2**++Ci}const Ln=Object.freeze(Object.defineProperty({__proto__:null,boolean:L,booleanish:Y,commaOrSpaceSeparated:te,commaSeparated:Ie,number:E,overloadedBoolean:Dn,spaceSeparated:$},Symbol.toStringTag,{value:"Module"})),pn=Object.keys(Ln);class Hn extends ee{constructor(t,n,r,i){let o=-1;if(super(t,n),pt(this,"space",i),typeof r=="number")for(;++o4&&n.slice(0,4)==="data"&&vi.test(t)){if(t.charAt(4)==="-"){const o=t.slice(5).replace(mt,Di);r="data"+o.charAt(0).toUpperCase()+o.slice(1)}else{const o=t.slice(4);if(!mt.test(o)){let l=o.replace(Ai,zi);l.charAt(0)!=="-"&&(l="-"+l),t="data"+l}}i=Hn}return new i(r,t)}function zi(e){return"-"+e.toLowerCase()}function Di(e){return e.charAt(1).toUpperCase()}const Li=tr([rr,Ei,or,ar,ur],"html"),Un=tr([rr,Ii,or,ar,ur],"svg");function Fi(e){return e.join(" ").trim()}var De={},mn,dt;function Ri(){if(dt)return mn;dt=1;var e=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g,t=/\n/g,n=/^\s*/,r=/^(\*?[-#/*\\\w]+(\[[0-9a-z_-]+\])?)\s*/,i=/^:\s*/,o=/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/,l=/^[;\s]*/,a=/^\s+|\s+$/g,u=` `,s="/",f="*",c="",p="comment",h="declaration";function g(S,y){if(typeof S!="string")throw new TypeError("First argument must be a string");if(!S)return[];y=y||{};var I=1,C=1;function R(D){var A=D.match(t);A&&(I+=A.length);var q=D.lastIndexOf(u);C=~q?D.length-q:C+D.length}function _(){var D={line:I,column:C};return function(A){return A.position=new b(D),j(),A}}function b(D){this.start=D,this.end={line:I,column:C},this.source=y.source}b.prototype.content=S;function M(D){var A=new Error(y.source+":"+I+":"+C+": "+D);if(A.reason=D,A.filename=y.source,A.line=I,A.column=C,A.source=S,!y.silent)throw A}function H(D){var A=D.exec(S);if(A){var q=A[0];return R(q),S=S.slice(q.length),A}}function j(){H(n)}function k(D){var A;for(D=D||[];A=v();)A!==!1&&D.push(A);return D}function v(){var D=_();if(!(s!=S.charAt(0)||f!=S.charAt(1))){for(var A=2;c!=S.charAt(A)&&(f!=S.charAt(A)||s!=S.charAt(A+1));)++A;if(A+=2,c===S.charAt(A-1))return M("End of comment missing");var q=S.slice(2,A-2);return C+=2,R(q),S=S.slice(A),C+=2,D({type:p,comment:q})}}function P(){var D=_(),A=H(r);if(A){if(v(),!H(i))return M("property missing ':'");var q=H(o),K=D({type:h,property:w(A[0].replace(e,c)),value:q?w(q[0].replace(e,c)):c});return H(l),K}}function U(){var D=[];k(D);for(var A;A=P();)A!==!1&&(D.push(A),k(D));return D}return j(),U()}function w(S){return S?S.replace(a,c):c}return mn=g,mn}var gt;function _i(){if(gt)return De;gt=1;var e=De&&De.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(De,"__esModule",{value:!0}),De.default=n;const t=e(Ri());function n(r,i){let o=null;if(!r||typeof r!="string")return o;const l=(0,t.default)(r),a=typeof i=="function";return l.forEach(u=>{if(u.type!=="declaration")return;const{property:s,value:f}=u;a?i(s,f,u):f&&(o=o||{},o[s]=f)}),o}return De}var Be={},yt;function Oi(){if(yt)return Be;yt=1,Object.defineProperty(Be,"__esModule",{value:!0}),Be.camelCase=void 0;var e=/^--[a-zA-Z0-9_-]+$/,t=/-([a-z])/g,n=/^[^-]+$/,r=/^-(webkit|moz|ms|o|khtml)-/,i=/^-(ms)-/,o=function(s){return!s||n.test(s)||e.test(s)},l=function(s,f){return f.toUpperCase()},a=function(s,f){return"".concat(f,"-")},u=function(s,f){return f===void 0&&(f={}),o(s)?s:(s=s.toLowerCase(),f.reactCompat?s=s.replace(i,a):s=s.replace(r,a),s.replace(t,l))};return Be.camelCase=u,Be}var je,kt;function Mi(){if(kt)return je;kt=1;var e=je&&je.__importDefault||function(i){return i&&i.__esModule?i:{default:i}},t=e(_i()),n=Oi();function r(i,o){var l={};return!i||typeof i!="string"||(0,t.default)(i,function(a,u){a&&u&&(l[(0,n.camelCase)(a,o)]=u)}),l}return r.default=r,je=r,je}var Ni=Mi();const Bi=nr(Ni),sr=cr("end"),qn=cr("start");function cr(e){return t;function t(n){const r=n&&n.position&&n.position[e]||{};if(typeof r.line=="number"&&r.line>0&&typeof r.column=="number"&&r.column>0)return{line:r.line,column:r.column,offset:typeof r.offset=="number"&&r.offset>-1?r.offset:void 0}}}function ji(e){const t=qn(e),n=sr(e);if(t&&n)return{start:t,end:n}}function qe(e){return!e||typeof e!="object"?"":"position"in e||"type"in e?xt(e.position):"start"in e||"end"in e?xt(e):"line"in e||"column"in e?Fn(e):""}function Fn(e){return bt(e&&e.line)+":"+bt(e&&e.column)}function xt(e){return Fn(e&&e.start)+"-"+Fn(e&&e.end)}function bt(e){return e&&typeof e=="number"?e:1}class G extends Error{constructor(t,n,r){super(),typeof n=="string"&&(r=n,n=void 0);let i="",o={},l=!1;if(n&&("line"in n&&"column"in n?o={place:n}:"start"in n&&"end"in n?o={place:n}:"type"in n?o={ancestors:[n],place:n.position}:o={...n}),typeof t=="string"?i=t:!o.cause&&t&&(l=!0,i=t.message,o.cause=t),!o.ruleId&&!o.source&&typeof r=="string"){const u=r.indexOf(":");u===-1?o.ruleId=r:(o.source=r.slice(0,u),o.ruleId=r.slice(u+1))}if(!o.place&&o.ancestors&&o.ancestors){const u=o.ancestors[o.ancestors.length-1];u&&(o.place=u.position)}const a=o.place&&"start"in o.place?o.place.start:o.place;this.ancestors=o.ancestors||void 0,this.cause=o.cause||void 0,this.column=a?a.column:void 0,this.fatal=void 0,this.file="",this.message=i,this.line=a?a.line:void 0,this.name=qe(o.place)||"1:1",this.place=o.place||void 0,this.reason=this.message,this.ruleId=o.ruleId||void 0,this.source=o.source||void 0,this.stack=l&&o.cause&&typeof o.cause.stack=="string"?o.cause.stack:"",this.actual=void 0,this.expected=void 0,this.note=void 0,this.url=void 0}}G.prototype.file="";G.prototype.name="";G.prototype.reason="";G.prototype.message="";G.prototype.stack="";G.prototype.column=void 0;G.prototype.line=void 0;G.prototype.ancestors=void 0;G.prototype.cause=void 0;G.prototype.fatal=void 0;G.prototype.place=void 0;G.prototype.ruleId=void 0;G.prototype.source=void 0;const Vn={}.hasOwnProperty,Hi=new Map,Ui=/[A-Z]/g,qi=new Set(["table","tbody","thead","tfoot","tr"]),Vi=new Set(["td","th"]),fr="https://github.com/syntax-tree/hast-util-to-jsx-runtime";function $i(e,t){if(!t||t.Fragment===void 0)throw new TypeError("Expected `Fragment` in options");const n=t.filePath||void 0;let r;if(t.development){if(typeof t.jsxDEV!="function")throw new TypeError("Expected `jsxDEV` in options when `development: true`");r=Zi(n,t.jsxDEV)}else{if(typeof t.jsx!="function")throw new TypeError("Expected `jsx` in production options");if(typeof t.jsxs!="function")throw new TypeError("Expected `jsxs` in production options");r=Ji(n,t.jsx,t.jsxs)}const i={Fragment:t.Fragment,ancestors:[],components:t.components||{},create:r,elementAttributeNameCase:t.elementAttributeNameCase||"react",evaluater:t.createEvaluater?t.createEvaluater():void 0,filePath:n,ignoreInvalidStyle:t.ignoreInvalidStyle||!1,passKeys:t.passKeys!==!1,passNode:t.passNode||!1,schema:t.space==="svg"?Un:Li,stylePropertyNameCase:t.stylePropertyNameCase||"dom",tableCellAlignToStyle:t.tableCellAlignToStyle!==!1},o=hr(i,e,void 0);return o&&typeof o!="string"?o:i.create(e,i.Fragment,{children:o||void 0},void 0)}function hr(e,t,n){if(t.type==="element")return Wi(e,t,n);if(t.type==="mdxFlowExpression"||t.type==="mdxTextExpression")return Yi(e,t);if(t.type==="mdxJsxFlowElement"||t.type==="mdxJsxTextElement")return Qi(e,t,n);if(t.type==="mdxjsEsm")return Ki(e,t);if(t.type==="root")return Xi(e,t,n);if(t.type==="text")return Gi(e,t)}function Wi(e,t,n){const r=e.schema;let i=r;t.tagName.toLowerCase()==="svg"&&r.space==="html"&&(i=Un,e.schema=i),e.ancestors.push(t);const o=mr(e,t.tagName,!1),l=el(e,t);let a=Wn(e,t);return qi.has(t.tagName)&&(a=a.filter(function(u){return typeof u=="string"?!Si(u):!0})),pr(e,l,o,t),$n(l,a),e.ancestors.pop(),e.schema=r,e.create(t,o,l,n)}function Yi(e,t){if(t.data&&t.data.estree&&e.evaluater){const r=t.data.estree.body[0];return r.type,e.evaluater.evaluateExpression(r.expression)}We(e,t.position)}function Ki(e,t){if(t.data&&t.data.estree&&e.evaluater)return e.evaluater.evaluateProgram(t.data.estree);We(e,t.position)}function Qi(e,t,n){const r=e.schema;let i=r;t.name==="svg"&&r.space==="html"&&(i=Un,e.schema=i),e.ancestors.push(t);const o=t.name===null?e.Fragment:mr(e,t.name,!0),l=nl(e,t),a=Wn(e,t);return pr(e,l,o,t),$n(l,a),e.ancestors.pop(),e.schema=r,e.create(t,o,l,n)}function Xi(e,t,n){const r={};return $n(r,Wn(e,t)),e.create(t,e.Fragment,r,n)}function Gi(e,t){return t.value}function pr(e,t,n,r){typeof n!="string"&&n!==e.Fragment&&e.passNode&&(t.node=r)}function $n(e,t){if(t.length>0){const n=t.length>1?t:t[0];n&&(e.children=n)}}function Ji(e,t,n){return r;function r(i,o,l,a){const s=Array.isArray(l.children)?n:t;return a?s(o,l,a):s(o,l)}}function Zi(e,t){return n;function n(r,i,o,l){const a=Array.isArray(o.children),u=qn(r);return t(i,o,l,a,{columnNumber:u?u.column-1:void 0,fileName:e,lineNumber:u?u.line:void 0},void 0)}}function el(e,t){const n={};let r,i;for(i in t.properties)if(i!=="children"&&Vn.call(t.properties,i)){const o=tl(e,i,t.properties[i]);if(o){const[l,a]=o;e.tableCellAlignToStyle&&l==="align"&&typeof a=="string"&&Vi.has(t.tagName)?r=a:n[l]=a}}if(r){const o=n.style||(n.style={});o[e.stylePropertyNameCase==="css"?"text-align":"textAlign"]=r}return n}function nl(e,t){const n={};for(const r of t.attributes)if(r.type==="mdxJsxExpressionAttribute")if(r.data&&r.data.estree&&e.evaluater){const o=r.data.estree.body[0];o.type;const l=o.expression;l.type;const a=l.properties[0];a.type,Object.assign(n,e.evaluater.evaluateExpression(a.argument))}else We(e,t.position);else{const i=r.name;let o;if(r.value&&typeof r.value=="object")if(r.value.data&&r.value.data.estree&&e.evaluater){const a=r.value.data.estree.body[0];a.type,o=e.evaluater.evaluateExpression(a.expression)}else We(e,t.position);else o=r.value===null?!0:r.value;n[i]=o}return n}function Wn(e,t){const n=[];let r=-1;const i=e.passKeys?new Map:Hi;for(;++ri?0:i+t:t=t>i?i:t,n=n>0?n:0,r.length<1e4)l=Array.from(r),l.unshift(t,n),e.splice(...l);else for(n&&e.splice(t,n);o0?(ie(e,e.length,0,t),e):t}const Ct={}.hasOwnProperty;function gr(e){const t={};let n=-1;for(;++n13&&n<32||n>126&&n<160||n>55295&&n<57344||n>64975&&n<65008||(n&65535)===65535||(n&65535)===65534||n>1114111?"�":String.fromCodePoint(n)}function ce(e){return e.replace(/[\t\n\r ]+/g," ").replace(/^ | $/g,"").toLowerCase().toUpperCase()}const J=be(/[A-Za-z]/),X=be(/[\dA-Za-z]/),fl=be(/[#-'*+\--9=?A-Z^-~]/);function rn(e){return e!==null&&(e<32||e===127)}const Rn=be(/\d/),hl=be(/[\dA-Fa-f]/),pl=be(/[!-/:-@[-`{-~]/);function z(e){return e!==null&&e<-2}function W(e){return e!==null&&(e<0||e===32)}function O(e){return e===-2||e===-1||e===32}const un=be(new RegExp("\\p{P}|\\p{S}","u")),Te=be(/\s/);function be(e){return t;function t(n){return n!==null&&n>-1&&e.test(String.fromCharCode(n))}}function _e(e){const t=[];let n=-1,r=0,i=0;for(;++n55295&&o<57344){const a=e.charCodeAt(n+1);o<56320&&a>56319&&a<57344?(l=String.fromCharCode(o,a),i=1):l="�"}else l=String.fromCharCode(o);l&&(t.push(e.slice(r,n),encodeURIComponent(l)),r=n+i+1,l=""),i&&(n+=i,i=0)}return t.join("")+e.slice(r)}function B(e,t,n,r){const i=r?r-1:Number.POSITIVE_INFINITY;let o=0;return l;function l(u){return O(u)?(e.enter(n),a(u)):t(u)}function a(u){return O(u)&&o++l))return;const M=t.events.length;let H=M,j,k;for(;H--;)if(t.events[H][0]==="exit"&&t.events[H][1].type==="chunkFlow"){if(j){k=t.events[H][1].end;break}j=!0}for(y(r),b=M;bC;){const _=n[R];t.containerState=_[1],_[0].exit.call(t,e)}n.length=C}function I(){i.write([null]),o=void 0,i=void 0,t.containerState._closeFlow=void 0}}function kl(e,t,n){return B(e,e.attempt(this.parser.constructs.document,t,n),"linePrefix",this.parser.constructs.disable.null.includes("codeIndented")?void 0:4)}function Fe(e){if(e===null||W(e)||Te(e))return 1;if(un(e))return 2}function sn(e,t,n){const r=[];let i=-1;for(;++i1&&e[n][1].end.offset-e[n][1].start.offset>1?2:1;const c={...e[r][1].end},p={...e[n][1].start};It(c,-u),It(p,u),l={type:u>1?"strongSequence":"emphasisSequence",start:c,end:{...e[r][1].end}},a={type:u>1?"strongSequence":"emphasisSequence",start:{...e[n][1].start},end:p},o={type:u>1?"strongText":"emphasisText",start:{...e[r][1].end},end:{...e[n][1].start}},i={type:u>1?"strong":"emphasis",start:{...l.start},end:{...a.end}},e[r][1].end={...l.start},e[n][1].start={...a.end},s=[],e[r][1].end.offset-e[r][1].start.offset&&(s=le(s,[["enter",e[r][1],t],["exit",e[r][1],t]])),s=le(s,[["enter",i,t],["enter",l,t],["exit",l,t],["enter",o,t]]),s=le(s,sn(t.parser.constructs.insideSpan.null,e.slice(r+1,n),t)),s=le(s,[["exit",o,t],["enter",a,t],["exit",a,t],["exit",i,t]]),e[n][1].end.offset-e[n][1].start.offset?(f=2,s=le(s,[["enter",e[n][1],t],["exit",e[n][1],t]])):f=0,ie(e,r-1,n-r+3,s),n=r+s.length-f-2;break}}for(n=-1;++n0&&O(b)?B(e,I,"linePrefix",o+1)(b):I(b)}function I(b){return b===null||z(b)?e.check(Tt,w,R)(b):(e.enter("codeFlowValue"),C(b))}function C(b){return b===null||z(b)?(e.exit("codeFlowValue"),I(b)):(e.consume(b),C)}function R(b){return e.exit("codeFenced"),t(b)}function _(b,M,H){let j=0;return k;function k(A){return b.enter("lineEnding"),b.consume(A),b.exit("lineEnding"),v}function v(A){return b.enter("codeFencedFence"),O(A)?B(b,P,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(A):P(A)}function P(A){return A===a?(b.enter("codeFencedFenceSequence"),U(A)):H(A)}function U(A){return A===a?(j++,b.consume(A),U):j>=l?(b.exit("codeFencedFenceSequence"),O(A)?B(b,D,"whitespace")(A):D(A)):H(A)}function D(A){return A===null||z(A)?(b.exit("codeFencedFence"),M(A)):H(A)}}}function zl(e,t,n){const r=this;return i;function i(l){return l===null?n(l):(e.enter("lineEnding"),e.consume(l),e.exit("lineEnding"),o)}function o(l){return r.parser.lazy[r.now().line]?n(l):t(l)}}const gn={name:"codeIndented",tokenize:Ll},Dl={partial:!0,tokenize:Fl};function Ll(e,t,n){const r=this;return i;function i(s){return e.enter("codeIndented"),B(e,o,"linePrefix",5)(s)}function o(s){const f=r.events[r.events.length-1];return f&&f[1].type==="linePrefix"&&f[2].sliceSerialize(f[1],!0).length>=4?l(s):n(s)}function l(s){return s===null?u(s):z(s)?e.attempt(Dl,l,u)(s):(e.enter("codeFlowValue"),a(s))}function a(s){return s===null||z(s)?(e.exit("codeFlowValue"),l(s)):(e.consume(s),a)}function u(s){return e.exit("codeIndented"),t(s)}}function Fl(e,t,n){const r=this;return i;function i(l){return r.parser.lazy[r.now().line]?n(l):z(l)?(e.enter("lineEnding"),e.consume(l),e.exit("lineEnding"),i):B(e,o,"linePrefix",5)(l)}function o(l){const a=r.events[r.events.length-1];return a&&a[1].type==="linePrefix"&&a[2].sliceSerialize(a[1],!0).length>=4?t(l):z(l)?i(l):n(l)}}const Rl={name:"codeText",previous:Ol,resolve:_l,tokenize:Ml};function _l(e){let t=e.length-4,n=3,r,i;if((e[n][1].type==="lineEnding"||e[n][1].type==="space")&&(e[t][1].type==="lineEnding"||e[t][1].type==="space")){for(r=n;++r=this.left.length+this.right.length)throw new RangeError("Cannot access index `"+t+"` in a splice buffer of size `"+(this.left.length+this.right.length)+"`");return tthis.left.length?this.right.slice(this.right.length-r+this.left.length,this.right.length-t+this.left.length).reverse():this.left.slice(t).concat(this.right.slice(this.right.length-r+this.left.length).reverse())}splice(t,n,r){const i=n||0;this.setCursor(Math.trunc(t));const o=this.right.splice(this.right.length-i,Number.POSITIVE_INFINITY);return r&&He(this.left,r),o.reverse()}pop(){return this.setCursor(Number.POSITIVE_INFINITY),this.left.pop()}push(t){this.setCursor(Number.POSITIVE_INFINITY),this.left.push(t)}pushMany(t){this.setCursor(Number.POSITIVE_INFINITY),He(this.left,t)}unshift(t){this.setCursor(0),this.right.push(t)}unshiftMany(t){this.setCursor(0),He(this.right,t.reverse())}setCursor(t){if(!(t===this.left.length||t>this.left.length&&this.right.length===0||t<0&&this.left.length===0))if(t=4?t(l):e.interrupt(r.parser.constructs.flow,n,t)(l)}}function Sr(e,t,n,r,i,o,l,a,u){const s=u||Number.POSITIVE_INFINITY;let f=0;return c;function c(y){return y===60?(e.enter(r),e.enter(i),e.enter(o),e.consume(y),e.exit(o),p):y===null||y===32||y===41||rn(y)?n(y):(e.enter(r),e.enter(l),e.enter(a),e.enter("chunkString",{contentType:"string"}),w(y))}function p(y){return y===62?(e.enter(o),e.consume(y),e.exit(o),e.exit(i),e.exit(r),t):(e.enter(a),e.enter("chunkString",{contentType:"string"}),h(y))}function h(y){return y===62?(e.exit("chunkString"),e.exit(a),p(y)):y===null||y===60||z(y)?n(y):(e.consume(y),y===92?g:h)}function g(y){return y===60||y===62||y===92?(e.consume(y),h):h(y)}function w(y){return!f&&(y===null||y===41||W(y))?(e.exit("chunkString"),e.exit(a),e.exit(l),e.exit(r),t(y)):f999||h===null||h===91||h===93&&!u||h===94&&!a&&"_hiddenFootnoteSupport"in l.parser.constructs?n(h):h===93?(e.exit(o),e.enter(i),e.consume(h),e.exit(i),e.exit(r),t):z(h)?(e.enter("lineEnding"),e.consume(h),e.exit("lineEnding"),f):(e.enter("chunkString",{contentType:"string"}),c(h))}function c(h){return h===null||h===91||h===93||z(h)||a++>999?(e.exit("chunkString"),f(h)):(e.consume(h),u||(u=!O(h)),h===92?p:c)}function p(h){return h===91||h===92||h===93?(e.consume(h),a++,c):c(h)}}function Er(e,t,n,r,i,o){let l;return a;function a(p){return p===34||p===39||p===40?(e.enter(r),e.enter(i),e.consume(p),e.exit(i),l=p===40?41:p,u):n(p)}function u(p){return p===l?(e.enter(i),e.consume(p),e.exit(i),e.exit(r),t):(e.enter(o),s(p))}function s(p){return p===l?(e.exit(o),u(l)):p===null?n(p):z(p)?(e.enter("lineEnding"),e.consume(p),e.exit("lineEnding"),B(e,s,"linePrefix")):(e.enter("chunkString",{contentType:"string"}),f(p))}function f(p){return p===l||p===null||z(p)?(e.exit("chunkString"),s(p)):(e.consume(p),p===92?c:f)}function c(p){return p===l||p===92?(e.consume(p),f):f(p)}}function Ve(e,t){let n;return r;function r(i){return z(i)?(e.enter("lineEnding"),e.consume(i),e.exit("lineEnding"),n=!0,r):O(i)?B(e,r,n?"linePrefix":"lineSuffix")(i):t(i)}}const $l={name:"definition",tokenize:Yl},Wl={partial:!0,tokenize:Kl};function Yl(e,t,n){const r=this;let i;return o;function o(h){return e.enter("definition"),l(h)}function l(h){return Cr.call(r,e,a,n,"definitionLabel","definitionLabelMarker","definitionLabelString")(h)}function a(h){return i=ce(r.sliceSerialize(r.events[r.events.length-1][1]).slice(1,-1)),h===58?(e.enter("definitionMarker"),e.consume(h),e.exit("definitionMarker"),u):n(h)}function u(h){return W(h)?Ve(e,s)(h):s(h)}function s(h){return Sr(e,f,n,"definitionDestination","definitionDestinationLiteral","definitionDestinationLiteralMarker","definitionDestinationRaw","definitionDestinationString")(h)}function f(h){return e.attempt(Wl,c,c)(h)}function c(h){return O(h)?B(e,p,"whitespace")(h):p(h)}function p(h){return h===null||z(h)?(e.exit("definition"),r.parser.defined.push(i),t(h)):n(h)}}function Kl(e,t,n){return r;function r(a){return W(a)?Ve(e,i)(a):n(a)}function i(a){return Er(e,o,n,"definitionTitle","definitionTitleMarker","definitionTitleString")(a)}function o(a){return O(a)?B(e,l,"whitespace")(a):l(a)}function l(a){return a===null||z(a)?t(a):n(a)}}const Ql={name:"hardBreakEscape",tokenize:Xl};function Xl(e,t,n){return r;function r(o){return e.enter("hardBreakEscape"),e.consume(o),i}function i(o){return z(o)?(e.exit("hardBreakEscape"),t(o)):n(o)}}const Gl={name:"headingAtx",resolve:Jl,tokenize:Zl};function Jl(e,t){let n=e.length-2,r=3,i,o;return e[r][1].type==="whitespace"&&(r+=2),n-2>r&&e[n][1].type==="whitespace"&&(n-=2),e[n][1].type==="atxHeadingSequence"&&(r===n-1||n-4>r&&e[n-2][1].type==="whitespace")&&(n-=r+1===n?2:4),n>r&&(i={type:"atxHeadingText",start:e[r][1].start,end:e[n][1].end},o={type:"chunkText",start:e[r][1].start,end:e[n][1].end,contentType:"text"},ie(e,r,n-r+1,[["enter",i,t],["enter",o,t],["exit",o,t],["exit",i,t]])),e}function Zl(e,t,n){let r=0;return i;function i(f){return e.enter("atxHeading"),o(f)}function o(f){return e.enter("atxHeadingSequence"),l(f)}function l(f){return f===35&&r++<6?(e.consume(f),l):f===null||W(f)?(e.exit("atxHeadingSequence"),a(f)):n(f)}function a(f){return f===35?(e.enter("atxHeadingSequence"),u(f)):f===null||z(f)?(e.exit("atxHeading"),t(f)):O(f)?B(e,a,"whitespace")(f):(e.enter("atxHeadingText"),s(f))}function u(f){return f===35?(e.consume(f),u):(e.exit("atxHeadingSequence"),a(f))}function s(f){return f===null||f===35||W(f)?(e.exit("atxHeadingText"),a(f)):(e.consume(f),s)}}const eo=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","search","section","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"],vt=["pre","script","style","textarea"],no={concrete:!0,name:"htmlFlow",resolveTo:io,tokenize:lo},to={partial:!0,tokenize:ao},ro={partial:!0,tokenize:oo};function io(e){let t=e.length;for(;t--&&!(e[t][0]==="enter"&&e[t][1].type==="htmlFlow"););return t>1&&e[t-2][1].type==="linePrefix"&&(e[t][1].start=e[t-2][1].start,e[t+1][1].start=e[t-2][1].start,e.splice(t-2,2)),e}function lo(e,t,n){const r=this;let i,o,l,a,u;return s;function s(d){return f(d)}function f(d){return e.enter("htmlFlow"),e.enter("htmlFlowData"),e.consume(d),c}function c(d){return d===33?(e.consume(d),p):d===47?(e.consume(d),o=!0,w):d===63?(e.consume(d),i=3,r.interrupt?t:m):J(d)?(e.consume(d),l=String.fromCharCode(d),S):n(d)}function p(d){return d===45?(e.consume(d),i=2,h):d===91?(e.consume(d),i=5,a=0,g):J(d)?(e.consume(d),i=4,r.interrupt?t:m):n(d)}function h(d){return d===45?(e.consume(d),r.interrupt?t:m):n(d)}function g(d){const ue="CDATA[";return d===ue.charCodeAt(a++)?(e.consume(d),a===ue.length?r.interrupt?t:P:g):n(d)}function w(d){return J(d)?(e.consume(d),l=String.fromCharCode(d),S):n(d)}function S(d){if(d===null||d===47||d===62||W(d)){const ue=d===47,we=l.toLowerCase();return!ue&&!o&&vt.includes(we)?(i=1,r.interrupt?t(d):P(d)):eo.includes(l.toLowerCase())?(i=6,ue?(e.consume(d),y):r.interrupt?t(d):P(d)):(i=7,r.interrupt&&!r.parser.lazy[r.now().line]?n(d):o?I(d):C(d))}return d===45||X(d)?(e.consume(d),l+=String.fromCharCode(d),S):n(d)}function y(d){return d===62?(e.consume(d),r.interrupt?t:P):n(d)}function I(d){return O(d)?(e.consume(d),I):k(d)}function C(d){return d===47?(e.consume(d),k):d===58||d===95||J(d)?(e.consume(d),R):O(d)?(e.consume(d),C):k(d)}function R(d){return d===45||d===46||d===58||d===95||X(d)?(e.consume(d),R):_(d)}function _(d){return d===61?(e.consume(d),b):O(d)?(e.consume(d),_):C(d)}function b(d){return d===null||d===60||d===61||d===62||d===96?n(d):d===34||d===39?(e.consume(d),u=d,M):O(d)?(e.consume(d),b):H(d)}function M(d){return d===u?(e.consume(d),u=null,j):d===null||z(d)?n(d):(e.consume(d),M)}function H(d){return d===null||d===34||d===39||d===47||d===60||d===61||d===62||d===96||W(d)?_(d):(e.consume(d),H)}function j(d){return d===47||d===62||O(d)?C(d):n(d)}function k(d){return d===62?(e.consume(d),v):n(d)}function v(d){return d===null||z(d)?P(d):O(d)?(e.consume(d),v):n(d)}function P(d){return d===45&&i===2?(e.consume(d),q):d===60&&i===1?(e.consume(d),K):d===62&&i===4?(e.consume(d),ae):d===63&&i===3?(e.consume(d),m):d===93&&i===5?(e.consume(d),pe):z(d)&&(i===6||i===7)?(e.exit("htmlFlowData"),e.check(to,me,U)(d)):d===null||z(d)?(e.exit("htmlFlowData"),U(d)):(e.consume(d),P)}function U(d){return e.check(ro,D,me)(d)}function D(d){return e.enter("lineEnding"),e.consume(d),e.exit("lineEnding"),A}function A(d){return d===null||z(d)?U(d):(e.enter("htmlFlowData"),P(d))}function q(d){return d===45?(e.consume(d),m):P(d)}function K(d){return d===47?(e.consume(d),l="",oe):P(d)}function oe(d){if(d===62){const ue=l.toLowerCase();return vt.includes(ue)?(e.consume(d),ae):P(d)}return J(d)&&l.length<8?(e.consume(d),l+=String.fromCharCode(d),oe):P(d)}function pe(d){return d===93?(e.consume(d),m):P(d)}function m(d){return d===62?(e.consume(d),ae):d===45&&i===2?(e.consume(d),m):P(d)}function ae(d){return d===null||z(d)?(e.exit("htmlFlowData"),me(d)):(e.consume(d),ae)}function me(d){return e.exit("htmlFlow"),t(d)}}function oo(e,t,n){const r=this;return i;function i(l){return z(l)?(e.enter("lineEnding"),e.consume(l),e.exit("lineEnding"),o):n(l)}function o(l){return r.parser.lazy[r.now().line]?n(l):t(l)}}function ao(e,t,n){return r;function r(i){return e.enter("lineEnding"),e.consume(i),e.exit("lineEnding"),e.attempt(Qe,t,n)}}const uo={name:"htmlText",tokenize:so};function so(e,t,n){const r=this;let i,o,l;return a;function a(m){return e.enter("htmlText"),e.enter("htmlTextData"),e.consume(m),u}function u(m){return m===33?(e.consume(m),s):m===47?(e.consume(m),_):m===63?(e.consume(m),C):J(m)?(e.consume(m),H):n(m)}function s(m){return m===45?(e.consume(m),f):m===91?(e.consume(m),o=0,g):J(m)?(e.consume(m),I):n(m)}function f(m){return m===45?(e.consume(m),h):n(m)}function c(m){return m===null?n(m):m===45?(e.consume(m),p):z(m)?(l=c,K(m)):(e.consume(m),c)}function p(m){return m===45?(e.consume(m),h):c(m)}function h(m){return m===62?q(m):m===45?p(m):c(m)}function g(m){const ae="CDATA[";return m===ae.charCodeAt(o++)?(e.consume(m),o===ae.length?w:g):n(m)}function w(m){return m===null?n(m):m===93?(e.consume(m),S):z(m)?(l=w,K(m)):(e.consume(m),w)}function S(m){return m===93?(e.consume(m),y):w(m)}function y(m){return m===62?q(m):m===93?(e.consume(m),y):w(m)}function I(m){return m===null||m===62?q(m):z(m)?(l=I,K(m)):(e.consume(m),I)}function C(m){return m===null?n(m):m===63?(e.consume(m),R):z(m)?(l=C,K(m)):(e.consume(m),C)}function R(m){return m===62?q(m):C(m)}function _(m){return J(m)?(e.consume(m),b):n(m)}function b(m){return m===45||X(m)?(e.consume(m),b):M(m)}function M(m){return z(m)?(l=M,K(m)):O(m)?(e.consume(m),M):q(m)}function H(m){return m===45||X(m)?(e.consume(m),H):m===47||m===62||W(m)?j(m):n(m)}function j(m){return m===47?(e.consume(m),q):m===58||m===95||J(m)?(e.consume(m),k):z(m)?(l=j,K(m)):O(m)?(e.consume(m),j):q(m)}function k(m){return m===45||m===46||m===58||m===95||X(m)?(e.consume(m),k):v(m)}function v(m){return m===61?(e.consume(m),P):z(m)?(l=v,K(m)):O(m)?(e.consume(m),v):j(m)}function P(m){return m===null||m===60||m===61||m===62||m===96?n(m):m===34||m===39?(e.consume(m),i=m,U):z(m)?(l=P,K(m)):O(m)?(e.consume(m),P):(e.consume(m),D)}function U(m){return m===i?(e.consume(m),i=void 0,A):m===null?n(m):z(m)?(l=U,K(m)):(e.consume(m),U)}function D(m){return m===null||m===34||m===39||m===60||m===61||m===96?n(m):m===47||m===62||W(m)?j(m):(e.consume(m),D)}function A(m){return m===47||m===62||W(m)?j(m):n(m)}function q(m){return m===62?(e.consume(m),e.exit("htmlTextData"),e.exit("htmlText"),t):n(m)}function K(m){return e.exit("htmlTextData"),e.enter("lineEnding"),e.consume(m),e.exit("lineEnding"),oe}function oe(m){return O(m)?B(e,pe,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(m):pe(m)}function pe(m){return e.enter("htmlTextData"),l(m)}}const Qn={name:"labelEnd",resolveAll:po,resolveTo:mo,tokenize:go},co={tokenize:yo},fo={tokenize:ko},ho={tokenize:xo};function po(e){let t=-1;const n=[];for(;++t=3&&(s===null||z(s))?(e.exit("thematicBreak"),t(s)):n(s)}function u(s){return s===i?(e.consume(s),r++,u):(e.exit("thematicBreakSequence"),O(s)?B(e,a,"whitespace")(s):a(s))}}const Z={continuation:{tokenize:Po},exit:Do,name:"list",tokenize:vo},To={partial:!0,tokenize:Lo},Ao={partial:!0,tokenize:zo};function vo(e,t,n){const r=this,i=r.events[r.events.length-1];let o=i&&i[1].type==="linePrefix"?i[2].sliceSerialize(i[1],!0).length:0,l=0;return a;function a(h){const g=r.containerState.type||(h===42||h===43||h===45?"listUnordered":"listOrdered");if(g==="listUnordered"?!r.containerState.marker||h===r.containerState.marker:Rn(h)){if(r.containerState.type||(r.containerState.type=g,e.enter(g,{_container:!0})),g==="listUnordered")return e.enter("listItemPrefix"),h===42||h===45?e.check(tn,n,s)(h):s(h);if(!r.interrupt||h===49)return e.enter("listItemPrefix"),e.enter("listItemValue"),u(h)}return n(h)}function u(h){return Rn(h)&&++l<10?(e.consume(h),u):(!r.interrupt||l<2)&&(r.containerState.marker?h===r.containerState.marker:h===41||h===46)?(e.exit("listItemValue"),s(h)):n(h)}function s(h){return e.enter("listItemMarker"),e.consume(h),e.exit("listItemMarker"),r.containerState.marker=r.containerState.marker||h,e.check(Qe,r.interrupt?n:f,e.attempt(To,p,c))}function f(h){return r.containerState.initialBlankLine=!0,o++,p(h)}function c(h){return O(h)?(e.enter("listItemPrefixWhitespace"),e.consume(h),e.exit("listItemPrefixWhitespace"),p):n(h)}function p(h){return r.containerState.size=o+r.sliceSerialize(e.exit("listItemPrefix"),!0).length,t(h)}}function Po(e,t,n){const r=this;return r.containerState._closeFlow=void 0,e.check(Qe,i,o);function i(a){return r.containerState.furtherBlankLines=r.containerState.furtherBlankLines||r.containerState.initialBlankLine,B(e,t,"listItemIndent",r.containerState.size+1)(a)}function o(a){return r.containerState.furtherBlankLines||!O(a)?(r.containerState.furtherBlankLines=void 0,r.containerState.initialBlankLine=void 0,l(a)):(r.containerState.furtherBlankLines=void 0,r.containerState.initialBlankLine=void 0,e.attempt(Ao,t,l)(a))}function l(a){return r.containerState._closeFlow=!0,r.interrupt=void 0,B(e,e.attempt(Z,t,n),"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(a)}}function zo(e,t,n){const r=this;return B(e,i,"listItemIndent",r.containerState.size+1);function i(o){const l=r.events[r.events.length-1];return l&&l[1].type==="listItemIndent"&&l[2].sliceSerialize(l[1],!0).length===r.containerState.size?t(o):n(o)}}function Do(e){e.exit(this.containerState.type)}function Lo(e,t,n){const r=this;return B(e,i,"listItemPrefixWhitespace",r.parser.constructs.disable.null.includes("codeIndented")?void 0:5);function i(o){const l=r.events[r.events.length-1];return!O(o)&&l&&l[1].type==="listItemPrefixWhitespace"?t(o):n(o)}}const Pt={name:"setextUnderline",resolveTo:Fo,tokenize:Ro};function Fo(e,t){let n=e.length,r,i,o;for(;n--;)if(e[n][0]==="enter"){if(e[n][1].type==="content"){r=n;break}e[n][1].type==="paragraph"&&(i=n)}else e[n][1].type==="content"&&e.splice(n,1),!o&&e[n][1].type==="definition"&&(o=n);const l={type:"setextHeading",start:{...e[r][1].start},end:{...e[e.length-1][1].end}};return e[i][1].type="setextHeadingText",o?(e.splice(i,0,["enter",l,t]),e.splice(o+1,0,["exit",e[r][1],t]),e[r][1].end={...e[o][1].end}):e[r][1]=l,e.push(["exit",l,t]),e}function Ro(e,t,n){const r=this;let i;return o;function o(s){let f=r.events.length,c;for(;f--;)if(r.events[f][1].type!=="lineEnding"&&r.events[f][1].type!=="linePrefix"&&r.events[f][1].type!=="content"){c=r.events[f][1].type==="paragraph";break}return!r.parser.lazy[r.now().line]&&(r.interrupt||c)?(e.enter("setextHeadingLine"),i=s,l(s)):n(s)}function l(s){return e.enter("setextHeadingLineSequence"),a(s)}function a(s){return s===i?(e.consume(s),a):(e.exit("setextHeadingLineSequence"),O(s)?B(e,u,"lineSuffix")(s):u(s))}function u(s){return s===null||z(s)?(e.exit("setextHeadingLine"),t(s)):n(s)}}const _o={tokenize:Oo};function Oo(e){const t=this,n=e.attempt(Qe,r,e.attempt(this.parser.constructs.flowInitial,i,B(e,e.attempt(this.parser.constructs.flow,i,e.attempt(jl,i)),"linePrefix")));return n;function r(o){if(o===null){e.consume(o);return}return e.enter("lineEndingBlank"),e.consume(o),e.exit("lineEndingBlank"),t.currentConstruct=void 0,n}function i(o){if(o===null){e.consume(o);return}return e.enter("lineEnding"),e.consume(o),e.exit("lineEnding"),t.currentConstruct=void 0,n}}const Mo={resolveAll:Tr()},No=Ir("string"),Bo=Ir("text");function Ir(e){return{resolveAll:Tr(e==="text"?jo:void 0),tokenize:t};function t(n){const r=this,i=this.parser.constructs[e],o=n.attempt(i,l,a);return l;function l(f){return s(f)?o(f):a(f)}function a(f){if(f===null){n.consume(f);return}return n.enter("data"),n.consume(f),u}function u(f){return s(f)?(n.exit("data"),o(f)):(n.consume(f),u)}function s(f){if(f===null)return!0;const c=i[f];let p=-1;if(c)for(;++p-1){const a=l[0];typeof a=="string"?l[0]=a.slice(r):l.shift()}o>0&&l.push(e[i].slice(0,o))}return l}function Zo(e,t){let n=-1;const r=[];let i;for(;++n0){const se=F.tokenStack[F.tokenStack.length-1];(se[1]||Dt).call(F,void 0,se[0])}for(T.position={start:xe(x.length>0?x[0][1].start:{line:1,column:1,offset:0}),end:xe(x.length>0?x[x.length-2][1].end:{line:1,column:1,offset:0})},V=-1;++Va.key===r)}function Te(n,r=Date.now()){return new Date(r-n*1e3).toISOString()}function se(n){return(n==="hour"?P:x)*1e3}function Ne(n,r,a=Date.now()){const i=new Date(n).getTime();return(r?new Date(r).getTime():a)-i<=x*1e3?"hour":"day"}function ie(n,r,a,i){if(n.length===0)return null;const c=Math.max(0,Math.min(r,a)),l=Math.min(n.length-1,Math.max(r,a)),o=new Date(n[c]).getTime(),m=new Date(n[l]).getTime()+se(i);return{startIso:new Date(o).toISOString(),endIso:new Date(m).toISOString()}}function oe(n,r,a){const i=n.length;if(i===0)return{startIndex:0,endIndex:0};const c=n.map(m=>new Date(m).getTime());let l=0;if(r){const m=new Date(r).getTime();for(let d=0;dt.bucketStart),W=l.map(t=>({x:t.bucketStart,requests:t.requests})),s=l.length,q=le(m,d),$=()=>{if(s===0)return[0,1];const{startIndex:t,endIndex:f}=oe(R,m,d);return[t,f+1]},[N,w]=y.useState($),S=y.useRef(!1);y.useEffect(()=>{S.current||w($())},[m,d,s]);const T=([t,f])=>{if(S.current=!1,s===0)return;const v=Math.max(0,Math.min(s-1,Math.floor(t+1e-6))),h=Math.max(v,Math.min(s-1,Math.ceil(f-1e-6)-1));if(v===0&&h===s-1){c(),w([0,s]);return}const u=ie(R,v,h,o);u&&i(u.startIso,u.endIso)},E=n.findIndex(t=>t.key===r),D=E>=0?n[E+1]:void 0,[g,b]=N,M=g<=.01&&b>=s-.01,I=t=>{const f=Math.max(1,Math.min(s,t)),v=(g+b)/2;let h=v-f/2,u=v+f/2;h<0&&(u-=h,h=0),u>s&&(h-=u-s,u=s);const z=[Math.max(0,h),Math.min(s,u)];w(z),T(z)},X=()=>{if(M){D&&a(D);return}I((b-g)*2)},K=()=>I((b-g)/2),C=y.useRef(null),p=y.useRef(null),Z=t=>{if(!p.current||!C.current)return;const f=C.current.getBoundingClientRect().width;if(f<=0)return;const v=(t.clientX-p.current.x)/f*s,h=p.current.sel[1]-p.current.sel[0],u=Math.max(0,Math.min(s-h,p.current.sel[0]+v));w([u,u+h])},A=s?Math.min(g,b)/s*100:0,U=s?Math.max(g,b)/s*100:100,_=!M;return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[n.map(t=>e.jsx(k,{size:"sm",variant:r===t.key?"primary":"outline",onPress:()=>a(t),children:t.label},t.key)),e.jsxs("div",{className:"ml-auto flex items-center gap-3",children:[e.jsxs("span",{className:"text-xs text-[var(--otari-muted)]",children:["Showing ",q," · UTC"]}),O]})]}),e.jsxs("div",{className:"rounded-xl border border-[var(--otari-line)] bg-[var(--otari-surface)] p-2",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2 px-1 pb-1",children:[e.jsxs("span",{className:"text-[11px] font-medium uppercase tracking-wide text-[var(--otari-muted)]",children:["Requests / ",o==="hour"?"hour":"day"]}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"hidden text-[11px] text-[var(--otari-muted)] sm:inline",children:"drag the edges to zoom · the bottom strip to pan"}),e.jsx(k,{size:"sm",variant:"ghost",isIconOnly:!0,"aria-label":"Zoom in",isDisabled:s===0,onPress:K,children:e.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-4 w-4","aria-hidden":"true",children:e.jsx("path",{d:"M12 5v14M5 12h14",strokeLinecap:"round"})})}),e.jsx(k,{size:"sm",variant:"ghost",isIconOnly:!0,"aria-label":"Zoom out",isDisabled:s===0||M&&!D,onPress:X,children:e.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-4 w-4","aria-hidden":"true",children:e.jsx("path",{d:"M5 12h14",strokeLinecap:"round"})})}),_?e.jsx(k,{size:"sm",variant:"ghost",onPress:()=>T([0,s]),children:"Reset"}):null]})]}),F&&s===0?e.jsx("div",{className:"flex h-[90px] items-center justify-center",children:e.jsx(V,{size:"sm"})}):s===0?e.jsx("div",{className:"flex h-[90px] items-center justify-center text-xs text-[var(--otari-muted)]",children:"No activity in this range."}):e.jsxs("div",{ref:C,className:"relative w-full",children:[e.jsx("div",{role:"img","aria-label":Y,className:"w-full touch-pan-y select-none",children:e.jsx(Q,{width:"100%",height:90,children:e.jsxs(ee,{data:W,margin:{top:4,right:0,left:0,bottom:0},children:[e.jsx(te,{dataKey:"x",tickLine:!1,axisLine:!1,interval:"preserveStartEnd",minTickGap:40,tickFormatter:t=>B(t,o),tick:{fontSize:10,fill:"var(--otari-muted)"}}),e.jsx(ne,{cursor:{fill:"var(--otari-line)",opacity:.35},content:e.jsx(me,{bucket:o})}),e.jsx(re,{dataKey:"requests",fill:ce,radius:[2,2,0,0],isAnimationActive:!1})]})})}),_?e.jsxs(e.Fragment,{children:[e.jsx("div",{"aria-hidden":!0,className:"pointer-events-none absolute inset-y-0 left-0 bg-[var(--otari-bg)] opacity-70",style:{width:`${A}%`}}),e.jsx("div",{"aria-hidden":!0,className:"pointer-events-none absolute inset-y-0 right-0 bg-[var(--otari-bg)] opacity-70",style:{width:`${100-U}%`}})]}):null,e.jsx("div",{"aria-hidden":!0,className:"absolute bottom-0 z-[1] cursor-grab touch-none rounded bg-[var(--otari-brand)]/10 hover:bg-[var(--otari-brand)]/20 active:cursor-grabbing",style:{left:`${A}%`,width:`${Math.max(0,U-A)}%`,height:ue},onPointerDown:t=>{t.stopPropagation(),t.preventDefault(),S.current=!0,p.current={x:t.clientX,sel:[Math.min(g,b),Math.max(g,b)]},t.currentTarget.setPointerCapture(t.pointerId)},onPointerMove:Z,onPointerUp:t=>{t.currentTarget.releasePointerCapture(t.pointerId),p.current=null,T(N)},onPointerCancel:()=>{p.current=null,T(N)}}),e.jsx(G,{"aria-label":"Selected time range",minValue:0,maxValue:s,step:1/de,value:N,onChange:t=>{S.current=!0,Array.isArray(t)&&t.length===2&&w([t[0],t[1]])},onChangeEnd:t=>{Array.isArray(t)&&t.length===2&&T([t[0],t[1]])},className:"pointer-events-none absolute inset-0 z-[2]",children:e.jsxs(H,{className:"pointer-events-none relative h-full w-full",children:[e.jsx(L,{index:0,label:"Window start"}),e.jsx(L,{index:1,label:"Window end"})]})})]})]})]})}function De({chips:n,children:r,onClearAll:a}){const[i,c]=y.useState(!1),l=y.useId();return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(k,{size:"sm",variant:"outline",onPress:()=>c(o=>!o),"aria-expanded":i,"aria-controls":l,children:i?"Done":"Add filter"}),n.map(o=>e.jsxs("span",{className:"inline-flex items-center gap-1 rounded-full border border-[var(--otari-line)] bg-[var(--otari-brand-tint)] py-0.5 pl-2.5 pr-1 text-xs text-[var(--otari-brand-dark)]",children:[e.jsxs("span",{className:"text-[var(--otari-muted)]",children:[o.label,":"]}),e.jsx("span",{className:"font-medium",children:o.value}),e.jsx("button",{type:"button",onClick:o.onClear,"aria-label":`Remove ${o.label} filter`,className:"ml-0.5 inline-flex h-4 w-4 items-center justify-center rounded-full text-[var(--otari-muted)] hover:bg-[var(--otari-line)] hover:text-[var(--otari-ink)]",children:e.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",className:"h-3 w-3","aria-hidden":"true",children:e.jsx("path",{d:"M6 6l12 12M18 6L6 18",strokeLinecap:"round"})})})]},o.key)),n.length>0&&a?e.jsx(k,{size:"sm",variant:"ghost",onPress:a,children:"Clear all"}):null]}),e.jsx("div",{id:l,className:i?"flex flex-wrap items-end gap-3":"hidden",children:r})]})}export{Se as A,ke as C,De as F,ve as U,je as a,ye as b,Ne as c,pe as d,we as f,Te as i}; diff --git a/src/gateway/static/dashboard/assets/KeysPage-CaQTAd2N.js b/src/gateway/static/dashboard/assets/KeysPage-bUjPPYgf.js similarity index 97% rename from src/gateway/static/dashboard/assets/KeysPage-CaQTAd2N.js rename to src/gateway/static/dashboard/assets/KeysPage-bUjPPYgf.js index e2fa562b..8ded46e4 100644 --- a/src/gateway/static/dashboard/assets/KeysPage-CaQTAd2N.js +++ b/src/gateway/static/dashboard/assets/KeysPage-bUjPPYgf.js @@ -1,4 +1,4 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as l}from"./react-dgEcD0HR.js";import{a as Q,r as q,s as X,t as Z,P as ee,E as K,v as te,u as U,I as se}from"./index-CI2beHfq.js";import{u as ae,r as ne,B as re}from"./tableSelection-CojkFPwd.js";import{C as ie}from"./ConfirmDialog-nzYO6eyy.js";import{D as le}from"./DataTable-CrQq0sYf.js";import{F as I}from"./Field-DEJ6Wjg9.js";import{a as F,M as W}from"./ModelScopeControl-L-_tKOtj.js";import{C as D,L as oe,I as ce,a as de,b as ue,D as me,f as A,B as p,d as k}from"./heroui-DZj66Arc.js";function xe({value:t,onChange:a,users:n,description:i}){const u=n.filter(r=>!r.user_id.startsWith("apikey-")).map(r=>({id:r.user_id,name:r.alias?`${r.user_id} (${r.alias})`:r.user_id})),[o,c]=l.useState(t),x=o.trim().toLowerCase(),y=u.filter(r=>!x||r.id.toLowerCase().includes(x)||r.name.toLowerCase().includes(x)).slice(0,50),g=r=>{const m=r.trim(),v=u.find(j=>j.id===m||j.name===m);return v?v.id:m},d=g(o),h=u.some(r=>r.id===d),f=d!==""&&!h?e.jsxs("span",{children:["Creates a new user ",e.jsx("code",{children:d}),"."]}):i??"Spend and budgets track against this user.";return e.jsxs(D.Root,{allowsCustomValue:!0,allowsEmptyCollection:!0,menuTrigger:"focus",inputValue:o,onInputChange:r=>{c(r),a(g(r))},onSelectionChange:r=>{if(r!=null){const m=String(r);c(m),a(m)}},className:"flex max-w-md flex-col gap-1",children:[e.jsx(oe,{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Owner"}),e.jsxs(D.InputGroup,{children:[e.jsx(ce,{placeholder:"Pick a user, or type a new id…",autoComplete:"off","data-1p-ignore":!0,"data-lpignore":"true",onFocus:r=>r.currentTarget.select()}),e.jsx(D.Trigger,{})]}),e.jsx(D.Popover,{children:e.jsx(de,{items:y,className:"max-h-72 overflow-auto",children:r=>e.jsx(ue,{id:r.id,textValue:r.name,children:r.name})})}),e.jsx(me,{className:"text-xs text-[var(--otari-muted)]",children:f})]})}function H(t){if(!t)return"—";const a=new Date(t);return Number.isNaN(a.getTime())?"—":a.toLocaleDateString()}function he(t){if(!t)return null;const a=new Date(t).getTime();if(Number.isNaN(a))return null;const n=Math.round((a-Date.now())/1e3),i=Math.abs(n),u=[["day",86400],["hour",3600],["minute",60]],o=new Intl.RelativeTimeFormat(void 0,{numeric:"auto"});for(const[c,x]of u)if(i>=x)return o.format(Math.round(n/x),c);return o.format(n,"second")}function fe(t){if(!t.expires_at)return!1;const a=new Date(t.expires_at).getTime();return!Number.isNaN(a)&&aString(i).padStart(2,"0");return`${a.getFullYear()}-${n(a.getMonth()+1)}-${n(a.getDate())}T${n(a.getHours())}:${n(a.getMinutes())}`}const ge=t=>(t??"").startsWith("apikey-"),M=t=>t.key_name??t.id,ye=t=>t.id;function O({label:t,value:a,multiline:n=!1,fieldRef:i}){const u=l.useRef(null),o=i??u,[c,x]=l.useState(!1),[y,g]=l.useState(!1),d=async()=>{var f,r,m;(f=o.current)==null||f.focus(),(r=o.current)==null||r.select();try{if((m=navigator.clipboard)!=null&&m.writeText){await navigator.clipboard.writeText(a),x(!0),g(!1),window.setTimeout(()=>x(!1),2e3);return}}catch{}g(!0)},h="w-full rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-3 py-2 font-mono text-xs text-[var(--otari-ink)]";return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-xs font-medium text-[var(--otari-muted)]",children:t}),e.jsx(p,{size:"sm",variant:"outline",onPress:d,children:c?"Copied":"Copy"})]}),n?e.jsx("textarea",{ref:o,readOnly:!0,rows:a.split(` +import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as l}from"./react-dgEcD0HR.js";import{a as Q,r as q,s as X,t as Z,P as ee,E as K,v as te,u as U,I as se}from"./index-CGnfXTEF.js";import{u as ae,r as ne,B as re}from"./tableSelection-9hV37uhu.js";import{C as ie}from"./ConfirmDialog-CWW3AYpK.js";import{D as le}from"./DataTable-Bmn_eYSV.js";import{F as I}from"./Field-Dwp6u3t8.js";import{a as F,M as W}from"./ModelScopeControl-DmfR9Ylv.js";import{C as D,L as oe,I as ce,a as de,b as ue,D as me,f as A,B as p,d as k}from"./heroui-BI50yK5B.js";function xe({value:t,onChange:a,users:n,description:i}){const u=n.filter(r=>!r.user_id.startsWith("apikey-")).map(r=>({id:r.user_id,name:r.alias?`${r.user_id} (${r.alias})`:r.user_id})),[o,c]=l.useState(t),x=o.trim().toLowerCase(),y=u.filter(r=>!x||r.id.toLowerCase().includes(x)||r.name.toLowerCase().includes(x)).slice(0,50),g=r=>{const m=r.trim(),v=u.find(j=>j.id===m||j.name===m);return v?v.id:m},d=g(o),h=u.some(r=>r.id===d),f=d!==""&&!h?e.jsxs("span",{children:["Creates a new user ",e.jsx("code",{children:d}),"."]}):i??"Spend and budgets track against this user.";return e.jsxs(D.Root,{allowsCustomValue:!0,allowsEmptyCollection:!0,menuTrigger:"focus",inputValue:o,onInputChange:r=>{c(r),a(g(r))},onSelectionChange:r=>{if(r!=null){const m=String(r);c(m),a(m)}},className:"flex max-w-md flex-col gap-1",children:[e.jsx(oe,{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Owner"}),e.jsxs(D.InputGroup,{children:[e.jsx(ce,{placeholder:"Pick a user, or type a new id…",autoComplete:"off","data-1p-ignore":!0,"data-lpignore":"true",onFocus:r=>r.currentTarget.select()}),e.jsx(D.Trigger,{})]}),e.jsx(D.Popover,{children:e.jsx(de,{items:y,className:"max-h-72 overflow-auto",children:r=>e.jsx(ue,{id:r.id,textValue:r.name,children:r.name})})}),e.jsx(me,{className:"text-xs text-[var(--otari-muted)]",children:f})]})}function H(t){if(!t)return"—";const a=new Date(t);return Number.isNaN(a.getTime())?"—":a.toLocaleDateString()}function he(t){if(!t)return null;const a=new Date(t).getTime();if(Number.isNaN(a))return null;const n=Math.round((a-Date.now())/1e3),i=Math.abs(n),u=[["day",86400],["hour",3600],["minute",60]],o=new Intl.RelativeTimeFormat(void 0,{numeric:"auto"});for(const[c,x]of u)if(i>=x)return o.format(Math.round(n/x),c);return o.format(n,"second")}function fe(t){if(!t.expires_at)return!1;const a=new Date(t.expires_at).getTime();return!Number.isNaN(a)&&aString(i).padStart(2,"0");return`${a.getFullYear()}-${n(a.getMonth()+1)}-${n(a.getDate())}T${n(a.getHours())}:${n(a.getMinutes())}`}const ge=t=>(t??"").startsWith("apikey-"),M=t=>t.key_name??t.id,ye=t=>t.id;function O({label:t,value:a,multiline:n=!1,fieldRef:i}){const u=l.useRef(null),o=i??u,[c,x]=l.useState(!1),[y,g]=l.useState(!1),d=async()=>{var f,r,m;(f=o.current)==null||f.focus(),(r=o.current)==null||r.select();try{if((m=navigator.clipboard)!=null&&m.writeText){await navigator.clipboard.writeText(a),x(!0),g(!1),window.setTimeout(()=>x(!1),2e3);return}}catch{}g(!0)},h="w-full rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-3 py-2 font-mono text-xs text-[var(--otari-ink)]";return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-xs font-medium text-[var(--otari-muted)]",children:t}),e.jsx(p,{size:"sm",variant:"outline",onPress:d,children:c?"Copied":"Copy"})]}),n?e.jsx("textarea",{ref:o,readOnly:!0,rows:a.split(` `).length,value:a,onFocus:f=>f.currentTarget.select(),className:`${h} resize-none whitespace-pre`}):e.jsx("input",{ref:o,readOnly:!0,value:a,onFocus:f=>f.currentTarget.select(),className:h}),e.jsx("span",{"aria-live":"polite",className:"text-xs text-green-700",children:c?"Copied to clipboard.":""}),y?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Selected. Press Ctrl/Cmd-C to copy."}):null]})}function je({title:t,result:a,onClose:n}){const i=l.useRef(null),u=l.useRef(null),o=typeof window<"u"?window.location.origin:"",c=a.key;l.useEffect(()=>{var d,h;(d=u.current)==null||d.focus(),(h=u.current)==null||h.select()},[]);const x=d=>{var m;if(d.key!=="Tab")return;const h=(m=i.current)==null?void 0:m.querySelectorAll('button, input, textarea, a[href], [tabindex]:not([tabindex="-1"])');if(!h||h.length===0)return;const f=h[0],r=h[h.length-1];d.shiftKey&&document.activeElement===f?(d.preventDefault(),r.focus()):!d.shiftKey&&document.activeElement===r&&(d.preventDefault(),f.focus())},y=[`curl ${o}/v1/chat/completions \\`,` -H "Otari-Key: ${c}" \\`,' -H "Content-Type: application/json" \\',` -d '{"model": "your-model", "messages": [{"role": "user", "content": "Hello"}]}'`].join(` `),g=["from openai import OpenAI","",`client = OpenAI(base_url="${o}/v1", api_key="${c}")`,"resp = client.chat.completions.create(",' model="your-model",',' messages=[{"role": "user", "content": "Hello"}],',")","print(resp.choices[0].message.content)"].join(` `);return e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/40 p-4",role:"presentation",children:e.jsxs("div",{ref:i,role:"dialog","aria-modal":"true","aria-labelledby":"reveal-title",onKeyDown:x,className:"flex max-h-[90vh] w-full max-w-2xl flex-col gap-4 overflow-y-auto rounded-xl bg-[var(--otari-surface)] p-6 shadow-xl",children:[e.jsx("h2",{id:"reveal-title",className:"text-lg font-semibold text-[var(--otari-ink)]",children:t}),e.jsx(se,{tone:"warning",children:"Copy this key now. For security it is shown only once and cannot be retrieved later. If you lose it, use Regenerate to issue a new secret."}),e.jsxs("p",{className:"text-xs text-[var(--otari-muted)]",children:["Model access: ",F(a.allowed_models).text,"."]}),e.jsx(O,{label:"Secret key",value:c,fieldRef:u}),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Make your first call"}),e.jsxs("p",{className:"text-xs text-[var(--otari-muted)]",children:["Replace ",e.jsx("code",{children:"your-model"})," with a model from the Models page."]})]}),e.jsx(O,{label:"curl",value:y,multiline:!0}),e.jsx(O,{label:"Python (OpenAI SDK)",value:g,multiline:!0})]}),e.jsx("div",{className:"flex justify-end",children:e.jsx(p,{variant:"primary",onPress:n,children:"I’ve saved this key"})})]})})}function V({trigger:t,message:a,confirmLabel:n,isPending:i,onConfirm:u}){const[o,c]=l.useState(!1);return o?e.jsxs("div",{className:"flex flex-col items-end gap-1.5 rounded-lg border border-amber-200 bg-amber-50 p-2 text-right",children:[e.jsx("span",{className:"max-w-xs text-xs text-amber-800",children:a}),e.jsxs("span",{className:"inline-flex gap-1",children:[e.jsx(p,{size:"sm",variant:"danger",isDisabled:i,onPress:u,children:n}),e.jsx(p,{size:"sm",variant:"ghost",isDisabled:i,onPress:()=>c(!1),children:"Cancel"})]})]}):e.jsx(p,{size:"sm",variant:"danger-soft",onPress:()=>c(!0),children:t})}function G({userId:t,users:a}){const n=t.trim();if(n==="")return e.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:"Choose an owner above to see the models this key can inherit."});const i=a.find(c=>c.user_id===n);if(!i)return e.jsxs("p",{className:"text-xs text-[var(--otari-muted)]",children:["New user ",e.jsx("code",{children:n})," starts unrestricted, so this key may allow any model."]});const{text:u}=F(i.allowed_models),o=i.allowed_models&&i.allowed_models.length>0?i.allowed_models.join(", "):null;return e.jsxs("p",{className:"text-xs text-[var(--otari-muted)]",children:["Owner ",e.jsx("code",{children:n})," allows ",e.jsx("span",{className:"font-medium text-[var(--otari-ink)]",children:u.toLowerCase()}),o?e.jsxs(e.Fragment,{children:[" (",e.jsx("span",{className:"font-mono",children:o}),")"]}):null,". This key inherits that, or narrows within it."]})}function Y({checked:t,onChange:a}){return e.jsxs("label",{className:"flex items-start gap-2 rounded-lg border border-[var(--otari-line)] p-3 text-sm",children:[e.jsx("input",{type:"checkbox",checked:t,onChange:n=>a(n.target.checked),className:"mt-0.5 h-4 w-4 accent-[var(--otari-brand)]","aria-label":"Exempt this key from budget"}),e.jsxs("span",{className:"flex flex-col gap-0.5",children:[e.jsx("span",{className:"font-medium text-[var(--otari-ink)]",children:"Exempt from budget"}),e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Requests on this key are logged with their cost but never counted toward the owner's budget or spend, and never blocked by it."})]})]})}function ve({onClose:t,onCreated:a}){const n=te(),i=U(),[u,o]=l.useState(""),[c,x]=l.useState(""),[y,g]=l.useState(!1),[d,h]=l.useState(""),[f,r]=l.useState(null),[m,v]=l.useState(!1),[j,T]=l.useState(!0),_=c!==""&&new Date(c).getTime(){if(n.isPending||!j||N)return;const b={key_name:u.trim()||null,user_id:d.trim(),expires_at:c?new Date(c).toISOString():null,allowed_models:f,exclude_from_budget:m};n.mutate(b,{onSuccess:w=>{a(w),t()}})};return e.jsx(k,{children:e.jsxs(k.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsx("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Create API key"}),e.jsx(K,{error:n.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(I,{label:"Name",value:u,onChange:o,placeholder:"ci-bot",autoFocus:!0,description:"A label to recognize this key later."}),e.jsx(I,{label:"Expires (optional)",value:c,onChange:x,type:"datetime-local",description:_?e.jsx("span",{className:"text-red-700",children:"That time is in the past; the key would be rejected immediately."}):"Leave blank for a key that never expires."})]}),e.jsx(xe,{value:d,onChange:h,users:i.data??[]}),e.jsx("button",{type:"button",className:"self-start text-xs font-medium text-[var(--otari-brand-dark)]",onClick:()=>g(b=>!b),children:y?"Hide advanced":"Advanced"}),y?e.jsxs("div",{className:"flex flex-col gap-4 rounded-lg border border-[var(--otari-line)] p-4",children:[e.jsx(G,{userId:d,users:i.data??[]}),e.jsx(W,{title:"Restrict this key's models",description:"By default this key inherits its owner's access. Optionally narrow it to a subset; a key can never exceed its owner's allowed models.",anyLabel:"Inherit owner access",initial:null,onChange:(b,w)=>{r(b),T(w)}}),e.jsx(Y,{checked:m,onChange:v})]}):null,e.jsxs("div",{className:"flex gap-2",children:[e.jsx(p,{variant:"primary",isDisabled:n.isPending||!j||N,onPress:S,children:n.isPending?"Creating…":"Create key"}),e.jsx(p,{variant:"ghost",onPress:t,children:"Cancel"})]})]})})}function be({apiKey:t,onClose:a}){const n=q(),i=U(),[u,o]=l.useState(t.key_name??""),[c,x]=l.useState(pe(t.expires_at)),[y,g]=l.useState(t.allowed_models),[d,h]=l.useState(t.exclude_from_budget),[f,r]=l.useState(!0),m=()=>{n.isPending||!f||n.mutate({id:t.id,body:{key_name:u.trim()||null,expires_at:c?new Date(c).toISOString():null,allowed_models:y,exclude_from_budget:d}},{onSuccess:a})};return e.jsx(k,{children:e.jsxs(k.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsxs("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:["Edit ",e.jsx("code",{children:t.key_name??t.id})]}),e.jsx(K,{error:n.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(I,{label:"Name",value:u,onChange:o,placeholder:"ci-bot"}),e.jsx(I,{label:"Expires",value:c,onChange:x,type:"datetime-local",description:"Blank clears the expiry."})]}),t.user_id?e.jsx(G,{userId:t.user_id,users:i.data??[]}):null,e.jsx(W,{title:"Restrict this key's models",description:"This key inherits its owner's access by default. Narrow it to a subset here; it can never exceed the owner's allowed models.",anyLabel:"Inherit owner access",initial:t.allowed_models,onChange:(v,j)=>{g(v),r(j)}}),e.jsx(Y,{checked:d,onChange:h}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(p,{variant:"primary",isDisabled:n.isPending||!f,onPress:m,children:n.isPending?"Saving…":"Save changes"}),e.jsx(p,{variant:"ghost",onPress:a,children:"Cancel"})]})]})})}function we({apiKey:t}){return t.is_active?fe(t)?e.jsx(A,{size:"sm",color:"warning",children:"Expired"}):e.jsx(A,{size:"sm",color:"accent",children:"Active"}):e.jsx(A,{size:"sm",color:"default",children:"Disabled"})}function Ne({allowed:t}){const{text:a,tone:n}=F(t),i=n==="danger"?"text-red-700 font-medium":n==="muted"?"text-[var(--otari-muted)]":"text-[var(--otari-brand-dark)] font-medium",u=t&&t.length>0?t.join(", "):void 0;return e.jsx("span",{className:`text-xs ${i}`,title:u,children:a})}function ke({onCreate:t}){return e.jsx(k,{children:e.jsxs(k.Content,{className:"flex flex-col gap-4 p-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:"No API keys yet"}),e.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:"An API key authenticates callers to this gateway. Create one to make your first request; the secret is shown once, so keep it somewhere safe."})]}),e.jsx("div",{children:e.jsx(p,{variant:"primary",onPress:t,children:"Create your first key"})})]})})}function Re(){const t=Q(),a=q(),n=X(),i=Z(),[u,o]=l.useState(!1),[c,x]=l.useState(null),[y,g]=l.useState(null),d=t.data??[],h=t.isLoading,f=d.find(s=>s.id===c)??null,r=!h&&d.length===0&&!u,m=ae(),[v,j]=l.useState(!1),[T,_]=l.useState(void 0),[N,S]=l.useState(!1),b=d.map(s=>s.id),w=ne(m.selectedKeys,b),E=d.filter(s=>w.includes(s.id)),$=l.useCallback((s,C)=>a.mutate({id:s.id,body:{is_active:C}}),[a.mutate]),z=l.useCallback(s=>n.mutate(s.id,{onSuccess:C=>g({title:`New secret for ${M(s)}`,result:C})}),[n.mutate]),R=async(s,C,B)=>{S(!0),_(void 0);try{for(const L of s)await C(L);m.clear(),B==null||B()}catch(L){_(L)}finally{S(!1)}},J=l.useMemo(()=>[{id:"name",header:"Name",isRowHeader:!0,cell:s=>e.jsxs("div",{className:"flex flex-col gap-0.5",children:[e.jsx("span",{className:"font-medium text-[var(--otari-ink)]",children:s.key_name??e.jsx("span",{className:"text-[var(--otari-muted)]",children:"(unnamed)"})}),e.jsxs("div",{className:"flex flex-wrap items-center gap-1",children:[e.jsx(Ne,{allowed:s.allowed_models}),s.exclude_from_budget?e.jsx("span",{className:"inline-flex items-center rounded-full border border-[var(--otari-line)] bg-[var(--otari-brand-tint)] px-2 py-0.5 text-xs font-medium text-[var(--otari-brand-dark)]",title:"Requests on this key are logged with cost but never counted toward budget",children:"Budget-exempt"}):null]})]})},{id:"status",header:"Status",cell:s=>e.jsx(we,{apiKey:s})},{id:"owner",header:"Owner",cell:s=>ge(s.user_id)?e.jsx(A,{size:"sm",color:"default",children:"virtual"}):e.jsx("code",{className:"text-xs text-[var(--otari-muted)]",children:s.user_id??"—"})},{id:"key",header:"Key",cell:s=>e.jsx("code",{className:"text-xs text-[var(--otari-muted)]",children:s.key_prefix?`${s.key_prefix}…`:"—"})},{id:"created",header:"Created",cell:s=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:H(s.created_at)})},{id:"last_used",header:"Last used",cell:s=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:he(s.last_used_at)??"never"})},{id:"expires",header:"Expires",cell:s=>e.jsx("span",{className:"text-[var(--otari-muted)]",title:s.expires_at?new Date(s.expires_at).toLocaleString():void 0,children:s.expires_at?H(s.expires_at):"never"})},{id:"actions",header:"Actions",align:"end",cell:s=>e.jsxs("div",{className:"flex items-center justify-end gap-1.5",children:[e.jsx(p,{size:"sm",variant:"outline",isDisabled:a.isPending,onPress:()=>$(s,!s.is_active),children:s.is_active?"Disable":"Enable"}),e.jsx(p,{size:"sm",variant:"ghost",onPress:()=>{o(!1),x(s.id)},children:"Edit"}),e.jsx(V,{trigger:"Regenerate",confirmLabel:"Regenerate",isPending:n.isPending,message:e.jsxs(e.Fragment,{children:["Regenerate the secret for ",e.jsx("strong",{children:M(s)}),"? The current secret stops working immediately, with no grace period."]}),onConfirm:()=>z(s)}),s.is_active?null:e.jsx(V,{trigger:"Delete",confirmLabel:"Delete permanently",isPending:i.isPending,message:e.jsxs(e.Fragment,{children:["Permanently delete ",e.jsx("strong",{children:M(s)}),"? This removes the key and unlinks its usage history. Cannot be undone."]}),onConfirm:()=>i.mutate(s.id)})]})}],[a.isPending,n.isPending,i.isPending,i.mutate,$,z]),P=E.filter(s=>!s.is_active);return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(ee,{title:"API keys",description:"Issue and revoke the keys that authenticate callers to this gateway. Secrets are shown once at creation.",action:u?null:e.jsx(p,{variant:"primary",onPress:()=>{x(null),o(!0)},children:"Create key"})}),e.jsx(K,{error:t.error??a.error??n.error??i.error}),r?e.jsx(ke,{onCreate:()=>{x(null),o(!0)}}):null,u?e.jsx(ve,{onClose:()=>o(!1),onCreated:s=>g({title:"API key created",result:s})}):null,f?e.jsx(be,{apiKey:f,onClose:()=>x(null)},f.id):null,w.length>0?e.jsxs(re,{selectedCount:w.length,allMatching:!1,matchingTotal:null,canSelectAllMatching:!1,onSelectAllMatching:()=>{},onClear:m.clear,children:[e.jsx(p,{size:"sm",variant:"outline",isDisabled:N,onPress:()=>void R(E,s=>a.mutateAsync({id:s.id,body:{is_active:!1}})),children:"Disable"}),e.jsx(p,{size:"sm",variant:"outline",isDisabled:N,onPress:()=>void R(E,s=>a.mutateAsync({id:s.id,body:{exclude_from_budget:!0}})),children:"Budget-exempt"}),e.jsx(p,{size:"sm",variant:"danger",isDisabled:P.length===0,onPress:()=>j(!0),children:"Delete"})]}):null,e.jsx(le,{ariaLabel:"API keys",columns:J,rows:d,getRowKey:ye,isLoading:h,emptyContent:"No API keys yet. Create one to authenticate a caller.",selectionMode:"multiple",selectedKeys:m.selectedKeys,onSelectionChange:m.onSelectionChange}),e.jsx(ie,{isOpen:v,onOpenChange:j,heading:"Delete API keys",body:`Permanently delete ${P.length} disabled ${P.length===1?"key":"keys"}? This removes them and unlinks their usage history. Cannot be undone. Active keys in the selection are skipped; disable them first.`,confirmLabel:"Delete permanently",isPending:N,error:T,onConfirm:()=>void R(P,s=>i.mutateAsync(s.id),()=>j(!1))}),y?e.jsx(je,{title:y.title,result:y.result,onClose:()=>{g(null),n.reset()}}):null]})}export{Re as KeysPage}; diff --git a/src/gateway/static/dashboard/assets/ModelScopeControl-L-_tKOtj.js b/src/gateway/static/dashboard/assets/ModelScopeControl-DmfR9Ylv.js similarity index 96% rename from src/gateway/static/dashboard/assets/ModelScopeControl-L-_tKOtj.js rename to src/gateway/static/dashboard/assets/ModelScopeControl-DmfR9Ylv.js index 0cbcdbdc..0f571aa3 100644 --- a/src/gateway/static/dashboard/assets/ModelScopeControl-L-_tKOtj.js +++ b/src/gateway/static/dashboard/assets/ModelScopeControl-DmfR9Ylv.js @@ -1 +1 @@ -import{j as t}from"./tanstack-query-1t81HyiD.js";import{r as n}from"./react-dgEcD0HR.js";import{K as A,h as $,i as P}from"./index-CI2beHfq.js";import{C as d,I as R,a as T,b as V}from"./heroui-DZj66Arc.js";function q(r){return r===null?"any":r.length===0?"block":"only"}const K=50;function W({initial:r,onChange:m,title:N="Model access",description:w,anyLabel:C="Any model"}){const x=A(),u=$(),v=P(),[i,S]=n.useState(q(r)),[a,g]=n.useState(r??[]),[p,y]=n.useState(""),f=n.useMemo(()=>{var j,k;const e=new Set,s=[],l=(o,c)=>{o&&!e.has(o)&&(e.add(o),s.push({id:o,label:c}))};for(const o of((j=x.data)==null?void 0:j.providers)??[])l(`${o.instance}:*`,`${o.instance}:* · all ${o.instance} models`);for(const o of((k=u.data)==null?void 0:k.providers)??[])for(const c of o.models)l(c.key,c.key);for(const o of v.data??[])l(o.target,`${o.name} · alias`);return s},[x.data,u.data,v.data]),L=n.useMemo(()=>{const e=p.trim().toLowerCase();return f.filter(s=>!a.includes(s.id)).filter(s=>!e||s.id.toLowerCase().includes(e)||s.label.toLowerCase().includes(e)).slice(0,K)},[f,a,p]),h=(e,s)=>{e==="any"?m(null,!0):e==="block"?m([],!0):m(s,s.length>0)},B=e=>{S(e),h(e,a)},M=e=>{const s=a.includes(e)?a:[...a,e];g(s),y(""),h("only",s)},E=e=>{const s=a.filter(l=>l!==e);g(s),h("only",s)},b=(e,s)=>t.jsx("button",{type:"button","aria-pressed":i===e,onClick:()=>B(e),className:i===e?"rounded-md bg-white px-3 py-1.5 text-sm font-medium text-[var(--otari-ink)] shadow-sm":"rounded-md px-3 py-1.5 text-sm text-[var(--otari-muted)] hover:text-[var(--otari-ink)]",children:s}),I=!u.isLoading&&!x.isLoading&&f.length===0;return t.jsxs("div",{className:"flex flex-col gap-3",children:[t.jsxs("div",{children:[t.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:N}),t.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:w??"Which models this key may list and call. The master key is never restricted, so blocking a key cannot lock you out of the dashboard."})]}),t.jsxs("div",{className:"flex w-fit items-center gap-1 rounded-lg bg-[var(--otari-bg)] p-1",children:[b("any",C),b("only","Only selected"),b("block","Block all")]}),i==="block"?t.jsxs("div",{className:"rounded-lg border border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-800",children:["Blocked from ",t.jsx("strong",{children:"every"})," model until you change this access."]}):null,i==="only"?t.jsxs("div",{className:"flex flex-col gap-2",children:[t.jsx("div",{className:"flex flex-wrap gap-1.5",children:a.length===0?t.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Pick at least one model below, or choose “Block all”."}):a.map(e=>t.jsxs("span",{className:"inline-flex items-center gap-1 rounded-full bg-[var(--otari-brand-tint)] px-2.5 py-1 font-mono text-xs text-[var(--otari-brand-dark)]",children:[e,t.jsx("button",{type:"button","aria-label":`Remove ${e}`,onClick:()=>E(e),className:"text-[var(--otari-brand-dark)] hover:text-red-700",children:"×"})]},e))}),I?t.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"No providers or models discovered yet. Configure a provider first, then scope this key."}):t.jsxs(d.Root,{allowsEmptyCollection:!0,menuTrigger:"input",inputValue:p,onInputChange:y,selectedKey:null,onSelectionChange:e=>{e!=null&&M(String(e))},className:"flex max-w-md flex-col gap-1",children:[t.jsxs(d.InputGroup,{children:[t.jsx(R,{"aria-label":"Add a model",placeholder:"Search providers, models, aliases…",autoComplete:"off"}),t.jsx(d.Trigger,{})]}),t.jsx(d.Popover,{children:t.jsx(T,{items:L,className:"max-h-72 overflow-auto",children:e=>t.jsx(V,{id:e.id,textValue:e.label,children:e.label})})})]})]}):null]})}function X(r){return r===null?{text:"All models",tone:"muted"}:r.length===0?{text:"No models",tone:"danger"}:{text:"Selected models",tone:"normal"}}export{W as M,X as a}; +import{j as t}from"./tanstack-query-1t81HyiD.js";import{r as n}from"./react-dgEcD0HR.js";import{K as A,h as $,i as P}from"./index-CGnfXTEF.js";import{C as d,I as R,a as T,b as V}from"./heroui-BI50yK5B.js";function q(r){return r===null?"any":r.length===0?"block":"only"}const K=50;function W({initial:r,onChange:m,title:N="Model access",description:w,anyLabel:C="Any model"}){const x=A(),u=$(),v=P(),[i,S]=n.useState(q(r)),[a,g]=n.useState(r??[]),[p,y]=n.useState(""),f=n.useMemo(()=>{var j,k;const e=new Set,s=[],l=(o,c)=>{o&&!e.has(o)&&(e.add(o),s.push({id:o,label:c}))};for(const o of((j=x.data)==null?void 0:j.providers)??[])l(`${o.instance}:*`,`${o.instance}:* · all ${o.instance} models`);for(const o of((k=u.data)==null?void 0:k.providers)??[])for(const c of o.models)l(c.key,c.key);for(const o of v.data??[])l(o.target,`${o.name} · alias`);return s},[x.data,u.data,v.data]),L=n.useMemo(()=>{const e=p.trim().toLowerCase();return f.filter(s=>!a.includes(s.id)).filter(s=>!e||s.id.toLowerCase().includes(e)||s.label.toLowerCase().includes(e)).slice(0,K)},[f,a,p]),h=(e,s)=>{e==="any"?m(null,!0):e==="block"?m([],!0):m(s,s.length>0)},B=e=>{S(e),h(e,a)},M=e=>{const s=a.includes(e)?a:[...a,e];g(s),y(""),h("only",s)},E=e=>{const s=a.filter(l=>l!==e);g(s),h("only",s)},b=(e,s)=>t.jsx("button",{type:"button","aria-pressed":i===e,onClick:()=>B(e),className:i===e?"rounded-md bg-white px-3 py-1.5 text-sm font-medium text-[var(--otari-ink)] shadow-sm":"rounded-md px-3 py-1.5 text-sm text-[var(--otari-muted)] hover:text-[var(--otari-ink)]",children:s}),I=!u.isLoading&&!x.isLoading&&f.length===0;return t.jsxs("div",{className:"flex flex-col gap-3",children:[t.jsxs("div",{children:[t.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:N}),t.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:w??"Which models this key may list and call. The master key is never restricted, so blocking a key cannot lock you out of the dashboard."})]}),t.jsxs("div",{className:"flex w-fit items-center gap-1 rounded-lg bg-[var(--otari-bg)] p-1",children:[b("any",C),b("only","Only selected"),b("block","Block all")]}),i==="block"?t.jsxs("div",{className:"rounded-lg border border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-800",children:["Blocked from ",t.jsx("strong",{children:"every"})," model until you change this access."]}):null,i==="only"?t.jsxs("div",{className:"flex flex-col gap-2",children:[t.jsx("div",{className:"flex flex-wrap gap-1.5",children:a.length===0?t.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Pick at least one model below, or choose “Block all”."}):a.map(e=>t.jsxs("span",{className:"inline-flex items-center gap-1 rounded-full bg-[var(--otari-brand-tint)] px-2.5 py-1 font-mono text-xs text-[var(--otari-brand-dark)]",children:[e,t.jsx("button",{type:"button","aria-label":`Remove ${e}`,onClick:()=>E(e),className:"text-[var(--otari-brand-dark)] hover:text-red-700",children:"×"})]},e))}),I?t.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"No providers or models discovered yet. Configure a provider first, then scope this key."}):t.jsxs(d.Root,{allowsEmptyCollection:!0,menuTrigger:"input",inputValue:p,onInputChange:y,selectedKey:null,onSelectionChange:e=>{e!=null&&M(String(e))},className:"flex max-w-md flex-col gap-1",children:[t.jsxs(d.InputGroup,{children:[t.jsx(R,{"aria-label":"Add a model",placeholder:"Search providers, models, aliases…",autoComplete:"off"}),t.jsx(d.Trigger,{})]}),t.jsx(d.Popover,{children:t.jsx(T,{items:L,className:"max-h-72 overflow-auto",children:e=>t.jsx(V,{id:e.id,textValue:e.label,children:e.label})})})]})]}):null]})}function X(r){return r===null?{text:"All models",tone:"muted"}:r.length===0?{text:"No models",tone:"danger"}:{text:"Selected models",tone:"normal"}}export{W as M,X as a}; diff --git a/src/gateway/static/dashboard/assets/ModelsPage-Cw8Xv_w2.js b/src/gateway/static/dashboard/assets/ModelsPage-BMtuCmJv.js similarity index 99% rename from src/gateway/static/dashboard/assets/ModelsPage-Cw8Xv_w2.js rename to src/gateway/static/dashboard/assets/ModelsPage-BMtuCmJv.js index 0459f765..08dc0b09 100644 --- a/src/gateway/static/dashboard/assets/ModelsPage-Cw8Xv_w2.js +++ b/src/gateway/static/dashboard/assets/ModelsPage-BMtuCmJv.js @@ -1 +1 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{i as gt,u as vt,r as c}from"./react-dgEcD0HR.js";import{w as _t,x as bt,h as jt,y as yt,z as je,P as Pt,E as Nt,F as B,I as St,A as ae,B as Re,C as ze,D as be,G as Ct,H as kt,J as E}from"./index-CI2beHfq.js";import{u as Mt,r as Wt,B as It}from"./tableSelection-CojkFPwd.js";import{D as Tt}from"./DataTable-CrQq0sYf.js";import{T as Lt,S as At}from"./TablePagination-ByewydW5.js";import{B as A,d as se,f as V}from"./heroui-DZj66Arc.js";function Oe(t){const i=t.indexOf(":");return i>0?t.slice(0,i):"—"}function $t(t,i=Date.now()){const r=new Map;for(const n of t){const a=r.get(n.model_key)??[];a.push(n),r.set(n.model_key,a)}const s=[];for(const n of r.values()){const a=[...n].sort((p,u)=>Date.parse(p.effective_at)-Date.parse(u.effective_at)),f=[...a].reverse().find(p=>Date.parse(p.effective_at)<=i);s.push(f??a[0])}return s.sort((n,a)=>n.model_key.localeCompare(a.model_key))}const Et="otari",De=[{value:"vision",label:"Vision",test:t=>Array.isArray(t.input_modalities)&&t.input_modalities.includes("image")},{value:"tool_call",label:"Tool calling",test:t=>!!t.tool_call},{value:"reasoning",label:"Reasoning",test:t=>!!t.reasoning},{value:"structured_output",label:"Structured output",test:t=>!!t.structured_output},{value:"attachment",label:"Attachments",test:t=>!!t.attachment},{value:"audio",label:"Audio",test:t=>Array.isArray(t.input_modalities)&&t.input_modalities.includes("audio")},{value:"pdf",label:"PDF",test:t=>Array.isArray(t.input_modalities)&&t.input_modalities.includes("pdf")}],Ot=[{key:"reasoning",label:"Reasoning"},{key:"tool_call",label:"Tool calling"},{key:"structured_output",label:"Structured output"},{key:"attachment",label:"Attachments"},{key:"temperature",label:"Temperature"}],Fe={text:"Text",image:"Image",audio:"Audio",video:"Video",pdf:"PDF"},Dt=[{value:"0",label:"Any context"},{value:"8000",label:"≥ 8K"},{value:"32000",label:"≥ 32K"},{value:"128000",label:"≥ 128K"},{value:"200000",label:"≥ 200K"},{value:"1000000",label:"≥ 1M"}],Ft=[{value:"",label:"Any price"},{value:"1",label:"≤ $1 / 1M in"},{value:"3",label:"≤ $3 / 1M in"},{value:"10",label:"≤ $10 / 1M in"},{value:"30",label:"≤ $30 / 1M in"}],Bt=[{value:"",label:"Base prices"},{value:"8000",label:"Compare at 8K"},{value:"128000",label:"Compare at 128K"},{value:"200000",label:"Compare at 200K"},{value:"500000",label:"Compare at 500K"},{value:"1000000",label:"Compare at 1M"}],Kt=[{value:"all",label:"Any release date"},{value:"365",label:"Past year"},{value:"730",label:"Past 2 years"},{value:"1095",label:"Past 3 years"}],Rt=1440*60*1e3,zt=t=>t.key;function Be(t,i){const r=`${i}:`;return t.startsWith(r)?t.slice(r.length):t}function Ke(t,i){const r={inputPrice:t.inputPrice,outputPrice:t.outputPrice,cacheReadPrice:t.cacheReadPrice,cacheWritePrice:t.cacheWritePrice,cacheWrite1hPrice:t.cacheWrite1hPrice};if(i==null)return r;const s=t.pricingTiers.filter(n=>n.min_input_tokens<=i).sort((n,a)=>a.min_input_tokens-n.min_input_tokens)[0];return s?{inputPrice:s.input_price_per_million??r.inputPrice,outputPrice:s.output_price_per_million??r.outputPrice,cacheReadPrice:s.cache_read_price_per_million??r.cacheReadPrice,cacheWritePrice:s.cache_write_price_per_million??r.cacheWritePrice,cacheWrite1hPrice:s.cache_write_1h_price_per_million??r.cacheWrite1hPrice}:r}function ce(t){const i=Number(t);return t.trim()!==""&&Number.isFinite(i)&&i>=0}function w(t){if(t.trim()==="")return!0;const i=Number(t);return Number.isFinite(i)&&i>=0}function Y(t){return t.trim()===""?null:Number(t)}function we(t){return t.map((i,r)=>({id:r,minInputTokens:String(i.min_input_tokens),input:i.input_price_per_million==null?"":String(i.input_price_per_million),output:i.output_price_per_million==null?"":String(i.output_price_per_million),cacheRead:i.cache_read_price_per_million==null?"":String(i.cache_read_price_per_million),cacheWrite:i.cache_write_price_per_million==null?"":String(i.cache_write_price_per_million),cacheWrite1h:i.cache_write_1h_price_per_million==null?"":String(i.cache_write_1h_price_per_million)}))}function Ve(t){const i=new Set;return t.every(r=>{const s=Number(r.minInputTokens),n=[r.input,r.output,r.cacheRead,r.cacheWrite,r.cacheWrite1h].some(a=>a.trim()!=="");return!Number.isInteger(s)||s<=0||i.has(s)||!n?!1:(i.add(s),[r.input,r.output,r.cacheRead,r.cacheWrite,r.cacheWrite1h].every(w))})}function Ye(t){return t.map(i=>({min_input_tokens:Number(i.minInputTokens),...i.input.trim()===""?{}:{input_price_per_million:Number(i.input)},...i.output.trim()===""?{}:{output_price_per_million:Number(i.output)},...i.cacheRead.trim()===""?{}:{cache_read_price_per_million:Number(i.cacheRead)},...i.cacheWrite.trim()===""?{}:{cache_write_price_per_million:Number(i.cacheWrite)},...i.cacheWrite1h.trim()===""?{}:{cache_write_1h_price_per_million:Number(i.cacheWrite1h)}}))}function b({value:t,onChange:i,ariaLabel:r}){return e.jsx("input",{type:"number",step:"any",min:"0",inputMode:"decimal","aria-label":r,value:t,onChange:s=>i(s.target.value),className:"w-28 rounded-md border border-[var(--otari-line)] bg-white px-2 py-1 text-right text-sm tabular-nums focus:border-[var(--otari-brand)] focus:outline-none"})}function He({tiers:t,onChange:i}){const r=(n,a,f)=>{i(t.map(p=>p.id===n?{...p,[a]:f}:p))},s=()=>{const n=t.reduce((a,f)=>Math.max(a,f.id),-1)+1;i([...t,{id:n,minInputTokens:"128000",input:"",output:"",cacheRead:"",cacheWrite:"",cacheWrite1h:""}])};return e.jsxs("div",{className:"flex flex-col gap-2 rounded-lg border border-[var(--otari-line)] p-3",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-medium text-[var(--otari-ink)]",children:"Long-context price tiers"}),e.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:"At a threshold, listed rates replace the base rate for the whole request."})]}),e.jsx(A,{size:"sm",variant:"outline",onPress:s,children:"Add tier"})]}),t.map(n=>e.jsxs("div",{className:"flex flex-wrap items-end gap-2 border-t border-[var(--otari-line)] pt-2",children:[e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Context ≥ tokens",e.jsx("input",{type:"number",min:"1",step:"1",inputMode:"numeric","aria-label":"Tier context threshold",value:n.minInputTokens,onChange:a=>r(n.id,"minInputTokens",a.target.value),className:"w-28 rounded-md border border-[var(--otari-line)] bg-white px-2 py-1 text-right text-sm tabular-nums focus:border-[var(--otari-brand)] focus:outline-none"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Input",e.jsx(b,{value:n.input,onChange:a=>r(n.id,"input",a),ariaLabel:"Tier input price"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Output",e.jsx(b,{value:n.output,onChange:a=>r(n.id,"output",a),ariaLabel:"Tier output price"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Cache read",e.jsx(b,{value:n.cacheRead,onChange:a=>r(n.id,"cacheRead",a),ariaLabel:"Tier cache read price"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Cache write",e.jsx(b,{value:n.cacheWrite,onChange:a=>r(n.id,"cacheWrite",a),ariaLabel:"Tier cache write price"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["1h write",e.jsx(b,{value:n.cacheWrite1h,onChange:a=>r(n.id,"cacheWrite1h",a),ariaLabel:"Tier 1 hour cache write price"})]}),e.jsx(A,{size:"sm",variant:"ghost",onPress:()=>i(t.filter(a=>a.id!==n.id)),children:"Remove"})]},n.id))]})}function wt({source:t}){return t==="configured"?e.jsx(V,{size:"sm",color:"default",children:"configured"}):t==="default"||t==="alias"?e.jsx(V,{size:"sm",color:"accent",children:t}):e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"not priced"})}function oe({label:t,tone:i="info",children:r}){const s=c.useId();return e.jsxs("span",{className:"group relative inline-flex items-center font-normal normal-case",children:[e.jsx("button",{type:"button","aria-label":t,"aria-describedby":s,className:`inline-flex h-4 w-4 items-center justify-center rounded-full border text-[10px] leading-none ${i==="warning"?"border-[#c2843a] text-[#b45309]":"border-[var(--otari-line)] text-[var(--otari-muted)] hover:border-[var(--otari-brand)] hover:text-[var(--otari-brand)]"}`,children:"i"}),e.jsx("span",{id:s,role:"tooltip",className:"pointer-events-none absolute top-full right-0 z-20 mt-1.5 w-72 rounded-lg border border-[var(--otari-line)] bg-[var(--otari-surface)] px-3 py-2 text-left text-xs font-normal whitespace-normal break-words text-[var(--otari-ink)] opacity-0 shadow-lg transition-opacity group-hover:opacity-100 group-focus-within:opacity-100",children:r})]})}function Vt(){const t=kt();return t.data?t.data.default_pricing?e.jsx(oe,{label:"How unpriced models are metered",tone:"info",children:"Default pricing is on: models without a configured price are metered using community-maintained rates (the bundled genai-prices dataset). Set a price to override the fallback."}):e.jsxs(oe,{label:"How unpriced models are metered",tone:"warning",children:["Default pricing is off: only models with a configured price are metered.",t.data.require_pricing?" Requests for any other model are rejected (HTTP 402) because require_pricing is on.":" Other models are served without cost tracking."]}):null}function I({label:t,value:i}){return e.jsxs("div",{className:"flex items-baseline justify-between gap-3",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:t}),e.jsx("span",{className:"text-right text-sm text-[var(--otari-ink)] tabular-nums",children:i})]})}function le({title:t,children:i}){return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("span",{className:"text-xs font-semibold uppercase tracking-wide text-[var(--otari-muted)]",children:t}),i]})}function Yt({row:t}){const i=je(),r=Re(),[s,n]=c.useState(!1),[a,f]=c.useState(""),[p,u]=c.useState(""),[P,j]=c.useState(""),[k,T]=c.useState(""),[y,h]=c.useState(""),[N,O]=c.useState([]),S=()=>{f(t.inputPrice==null?"":String(t.inputPrice)),u(t.outputPrice==null?"":String(t.outputPrice)),j(t.cacheReadPrice==null?"":String(t.cacheReadPrice)),T(t.cacheWritePrice==null?"":String(t.cacheWritePrice)),h(t.cacheWrite1hPrice==null?"":String(t.cacheWrite1hPrice)),O(we(t.pricingTiers)),n(!0)},Z=ce(a)&&ce(p)&&w(P)&&w(k)&&w(y)&&Ve(N),W=()=>{Z&&i.mutate({model_key:t.key,input_price_per_million:Number(a),output_price_per_million:Number(p),cache_read_price_per_million:Y(P),cache_write_price_per_million:Y(k),cache_write_1h_price_per_million:Y(y),pricing_tiers:Ye(N)},{onSuccess:()=>n(!1)})};return s?e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Input $ / 1M"}),e.jsx(b,{value:a,onChange:f,ariaLabel:`Input price for ${t.key}`})]}),e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Output $ / 1M"}),e.jsx(b,{value:p,onChange:u,ariaLabel:`Output price for ${t.key}`})]}),e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Cache read $ / 1M"}),e.jsx(b,{value:P,onChange:j,ariaLabel:`Cache read price for ${t.key}`})]}),e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Cache write $ / 1M"}),e.jsx(b,{value:k,onChange:T,ariaLabel:`Cache write price for ${t.key}`})]}),e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"1h cache write $ / 1M"}),e.jsx(b,{value:y,onChange:h,ariaLabel:`1 hour cache write price for ${t.key}`})]}),e.jsx(He,{tiers:N,onChange:O}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(A,{size:"sm",variant:"primary",isDisabled:i.isPending||!Z,onPress:W,children:"Save"}),e.jsx(A,{size:"sm",variant:"ghost",isDisabled:i.isPending,onPress:()=>n(!1),children:"Cancel"})]}),i.error?e.jsx("span",{className:"text-xs text-red-700",children:be(i.error)}):null]}):e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(I,{label:"Input",value:t.inputPrice==null?"—":`${E(t.inputPrice)} / 1M`}),e.jsx(I,{label:"Output",value:t.outputPrice==null?"—":`${E(t.outputPrice)} / 1M`}),e.jsx(I,{label:"Cache read",value:t.cacheReadPrice==null?"—":`${E(t.cacheReadPrice)} / 1M`}),e.jsx(I,{label:"Cache write",value:t.cacheWritePrice==null?"—":`${E(t.cacheWritePrice)} / 1M`}),e.jsx(I,{label:"1h cache write",value:t.cacheWrite1hPrice==null?"—":`${E(t.cacheWrite1hPrice)} / 1M`}),e.jsx(I,{label:"Context tiers",value:t.pricingTiers.length?`${t.pricingTiers.length} configured`:"—"}),e.jsxs("div",{className:"flex items-center gap-2 pt-1",children:[e.jsx(A,{size:"sm",variant:"outline",onPress:S,children:t.source==="configured"?"Edit price":"Set price"}),t.source==="configured"?e.jsxs(e.Fragment,{children:[e.jsx(ze,{confirmLabel:"Reset",isPending:r.isPending,onConfirm:()=>r.mutate(t.key),children:"Reset"}),e.jsx(oe,{label:"What reset does",children:"Removes the custom price. The model reverts to the default rate (genai-prices) when default pricing is on, otherwise it is metered at no cost."})]}):null,r.error?e.jsx("span",{className:"text-xs text-red-700",children:be(r.error)}):null]})]})}function Ht({row:t,metadata:i,metadataAvailable:r,onMakeAlias:s,onClose:n}){const a=(i==null?void 0:i.input_modalities)??[],f=(i==null?void 0:i.output_modalities)??[],p=Ot.filter(({key:u})=>i==null?void 0:i[u]);return e.jsx(se,{children:e.jsxs(se.Content,{className:"flex flex-col gap-5 p-5",children:[e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h2",{className:"text-base font-semibold break-all text-[var(--otari-ink)]",children:t.model}),i!=null&&i.deprecated?e.jsx(V,{size:"sm",color:"danger",children:"deprecated"}):null]}),e.jsxs("p",{className:"mt-1 text-xs break-all text-[var(--otari-muted)]",children:["Selector: ",e.jsx("code",{children:t.key})]}),i!=null&&i.family?e.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:i.family}):null]}),e.jsx("button",{type:"button","aria-label":"Close model details",onClick:n,className:"-mt-1 -mr-1 shrink-0 rounded-md px-1.5 py-0.5 text-lg leading-none text-[var(--otari-muted)] hover:bg-[var(--otari-bg)] hover:text-[var(--otari-ink)]",children:"✕"})]}),i!=null&&i.description?e.jsx("p",{className:"text-sm text-[var(--otari-ink)]",children:i.description}):null,e.jsxs(le,{title:"Pricing",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(wt,{source:t.source}),t.isDiscovered?null:e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"not discovered"})]}),e.jsx(Yt,{row:t},t.key),e.jsx(A,{size:"sm",variant:"outline",onPress:()=>s(t.key),children:"Make an alias"})]}),e.jsxs(le,{title:"Specs",children:[e.jsx(I,{label:"Context window",value:ae(t.contextWindow)}),e.jsx(I,{label:"Max output",value:ae((i==null?void 0:i.max_output_tokens)??null)}),e.jsx(I,{label:"Knowledge cutoff",value:(i==null?void 0:i.knowledge_cutoff)??"—"}),e.jsx(I,{label:"Released",value:Ct(i==null?void 0:i.release_date)}),e.jsx(I,{label:"Open weights",value:i?i.open_weights?"Yes":"No":"—"})]}),e.jsx(le,{title:"Modalities",children:a.length===0&&f.length===0?e.jsx("span",{className:"text-sm text-[var(--otari-muted)]",children:"Unknown."}):e.jsxs("div",{className:"flex flex-col gap-1.5 text-xs text-[var(--otari-muted)]",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-1",children:[e.jsx("span",{children:"In:"}),a.map(u=>e.jsx(V,{size:"sm",color:"default",children:Fe[u]??u},u))]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-1",children:[e.jsx("span",{children:"Out:"}),f.map(u=>e.jsx(V,{size:"sm",color:"default",children:Fe[u]??u},u))]})]})}),e.jsx(le,{title:"Capabilities",children:p.length>0?e.jsx("div",{className:"flex flex-wrap gap-1.5",children:p.map(({key:u,label:P})=>e.jsx(V,{size:"sm",color:"default",children:P},u))}):e.jsx("span",{className:"text-sm text-[var(--otari-muted)]",children:r?"None reported.":"Extended metadata unavailable (models.dev disabled or unreachable)."})})]})})}const qt=15;function Ut({value:t,onChange:i,placeholder:r}){return e.jsx("input",{type:"search",value:t,onChange:s=>i(s.target.value),placeholder:r,"aria-label":r,className:"w-full max-w-xs rounded-md border border-[var(--otari-line)] bg-white px-3 py-1.5 text-sm focus:border-[var(--otari-brand)] focus:outline-none"})}const qe="otari.dashboard.modelsSort",_e={col:"model",dir:"asc"},Gt=["model","released","input","output"];function Jt(){if(typeof window>"u")return _e;try{const t=window.localStorage.getItem(qe);if(!t)return _e;const i=JSON.parse(t);if(Gt.includes(i.col)&&(i.dir==="asc"||i.dir==="desc"))return{col:i.col,dir:i.dir}}catch{}return _e}function Xt({row:t,onClose:i}){const r=je(),s=Re(),[n,a]=c.useState(t.inputPrice==null?"":String(t.inputPrice)),[f,p]=c.useState(t.outputPrice==null?"":String(t.outputPrice)),[u,P]=c.useState(t.cacheReadPrice==null?"":String(t.cacheReadPrice)),[j,k]=c.useState(t.cacheWritePrice==null?"":String(t.cacheWritePrice)),[T,y]=c.useState(t.cacheWrite1hPrice==null?"":String(t.cacheWrite1hPrice)),[h,N]=c.useState(we(t.pricingTiers)),O=ce(n)&&ce(f)&&w(u)&&w(j)&&w(T)&&Ve(h),S=()=>{O&&r.mutate({model_key:t.key,input_price_per_million:Number(n),output_price_per_million:Number(f),cache_read_price_per_million:Y(u),cache_write_price_per_million:Y(j),cache_write_1h_price_per_million:Y(T),pricing_tiers:Ye(h)},{onSuccess:i})};return e.jsxs("div",{className:"flex flex-col gap-3 px-4 py-3",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("span",{className:"text-xs font-medium break-all text-[var(--otari-muted)]",children:t.key}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["Input $ / 1M",e.jsx(b,{value:n,onChange:a,ariaLabel:`Input price for ${t.key}`})]}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["Output $ / 1M",e.jsx(b,{value:f,onChange:p,ariaLabel:`Output price for ${t.key}`})]}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["Cache read $ / 1M",e.jsx(b,{value:u,onChange:P,ariaLabel:`Cache read price for ${t.key}`})]}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["Cache write $ / 1M",e.jsx(b,{value:j,onChange:k,ariaLabel:`Cache write price for ${t.key}`})]}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["1h cache write $ / 1M",e.jsx(b,{value:T,onChange:y,ariaLabel:`1 hour cache write price for ${t.key}`})]}),e.jsx(A,{size:"sm",variant:"primary",isDisabled:r.isPending||!O,onPress:S,children:r.isPending?"Saving…":"Save"}),e.jsx(A,{size:"sm",variant:"ghost",isDisabled:r.isPending,onPress:i,children:"Cancel"}),t.source==="configured"?e.jsxs("span",{className:"inline-flex items-center gap-1",children:[e.jsx(ze,{confirmLabel:"Reset",isPending:s.isPending,onConfirm:()=>s.mutate(t.key,{onSuccess:i}),children:"Reset"}),e.jsx(oe,{label:"What reset does",children:"Removes the custom price. The model reverts to the default rate (genai-prices) when default pricing is on, otherwise it is metered at no cost."})]}):null,r.error||s.error?e.jsx("span",{className:"text-xs text-red-700",children:be(r.error??s.error)}):null]}),e.jsx(He,{tiers:h,onChange:N})]})}function Zt({primary:t,secondary:i,rowKey:r,primaryLabel:s,secondaryLabel:n,onEdit:a}){const f=(p,u)=>e.jsx("button",{type:"button","aria-label":`Edit ${u} price for ${r}`,className:"tabular-nums hover:text-[var(--otari-brand-dark)] hover:underline",onClick:P=>{P.stopPropagation(),a()},children:p==null?"—":E(p)});return e.jsxs("span",{className:"inline-flex items-center justify-end gap-1",children:[f(t,s),e.jsx("span",{className:"text-[var(--otari-muted)]",children:"/"}),f(i,n)]})}function Qt({rates:t,rowKey:i,onEdit:r}){const s=[t.cacheReadPrice==null?null:`R ${E(t.cacheReadPrice)}`,t.cacheWritePrice==null?null:`W ${E(t.cacheWritePrice)}`,t.cacheWrite1hPrice==null?null:`1h ${E(t.cacheWrite1hPrice)}`].filter(n=>n!==null);return e.jsx("button",{type:"button","aria-label":`Edit caching price for ${i}`,className:"max-w-44 text-right text-xs leading-5 text-[var(--otari-muted)] hover:text-[var(--otari-brand-dark)] hover:underline",onClick:n=>{n.stopPropagation(),r()},children:s.length>0?s.join(" · "):"Input-rate fallback"})}function ei({row:t,onEdit:i}){const r=[...t.pricingTiers].sort((n,a)=>n.min_input_tokens-a.min_input_tokens).map(n=>ae(n.min_input_tokens)),s=r.length===0?"Base only":`${r.length} tier${r.length===1?"":"s"} · ≥ ${r.join(", ")}`;return e.jsx("button",{type:"button","aria-label":`Edit pricing policy for ${t.key}`,className:"max-w-40 text-right text-xs leading-5 text-[var(--otari-muted)] hover:text-[var(--otari-brand-dark)] hover:underline",onClick:n=>{n.stopPropagation(),i()},children:s})}function ti({rows:t,isLoading:i,empty:r,sortDescriptor:s,onSortChange:n,selectedKey:a,onSelect:f,onEditPricing:p,comparisonContextTokens:u,selectedKeys:P,onSelectionChange:j}){const k=c.useMemo(()=>{const y=u==null?"Base":`at ${ae(u)}`;return[{id:"model",header:"Model",isRowHeader:!0,allowsSorting:!0,cell:h=>e.jsxs("span",{className:"font-medium break-all",children:[h.model,e.jsx("span",{className:"sr-only",children:h.key})]})},{id:"provider",header:"Provider",cell:h=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:h.provider})},{id:"input",header:e.jsxs("span",{className:"inline-flex items-center gap-1",children:[`${y} in / out $ / 1M`,e.jsx(Vt,{})]}),align:"end",allowsSorting:!0,cell:h=>{const N=Ke(h,u);return e.jsx(Zt,{primary:N.inputPrice,secondary:N.outputPrice,rowKey:h.key,primaryLabel:"input",secondaryLabel:"output",onEdit:()=>p(h.key)})}},{id:"caching",header:`Caching ${u==null?"policy":y}`,align:"end",cell:h=>e.jsx(Qt,{rates:Ke(h,u),rowKey:h.key,onEdit:()=>p(h.key)})},{id:"policy",header:"Pricing policy",align:"end",cell:h=>e.jsx(ei,{row:h,onEdit:()=>p(h.key)})}]},[u,p]),T=c.useCallback(y=>y.key===a?"bg-[var(--otari-brand-tint)]":void 0,[a]);return e.jsx(Tt,{ariaLabel:"Models",columns:k,rows:t,getRowKey:zt,isLoading:i,emptyContent:r,selectionMode:"multiple",selectedKeys:P,onSelectionChange:j,sortDescriptor:s,onSortChange:n,onRowAction:f,rowClassName:T})}function ii({providers:t}){return t.length===0?null:e.jsxs(St,{tone:"warning",children:["Could not list ",t.map(i=>i.provider).join(", "),". Check that provider's credentials in config.yml; its models are missing from the list below."]})}function pi(){var Te,Le,Ae;const t=gt(),[i]=vt(),r=_t(),s=bt(),n=jt(),a=yt(),f=je(),[p,u]=c.useState(""),[P,j]=c.useState(0),[k,T]=c.useState(qt),[y,h]=c.useState(null),[N,O]=c.useState(null),[S,Z]=c.useState(Jt),W=Mt(),[Ue,ue]=c.useState(!1),[Ge,ye]=c.useState(!1),[Je,Pe]=c.useState(void 0);c.useEffect(()=>{try{window.localStorage.setItem(qe,JSON.stringify(S))}catch{}},[S]);const[D,Ne]=c.useState(i.get("provider")||"all"),[K,Xe]=c.useState("all"),[H,Ze]=c.useState("all"),[q,Qe]=c.useState("all"),[de,et]=c.useState("0"),[Q,tt]=c.useState(""),[ee,it]=c.useState("all"),[pe,rt]=c.useState(""),F=((Te=a.data)==null?void 0:Te.models)??{},nt=((Le=a.data)==null?void 0:Le.available)??!1,Se=c.useMemo(()=>{var l;return new Set((((l=n.data)==null?void 0:l.providers)??[]).flatMap(m=>m.models.map(o=>o.key)))},[n.data]),lt=l=>{u(l),j(0)},R=l=>m=>{l(m),j(0)},te=c.useMemo(()=>{var M,v,_,$,L,z,$e;const l=new Map($t(s.data??[]).map(d=>[d.model_key,d])),m=[],o=new Set,g=(d,ve,Ee,x)=>{if(o.has(d))return;o.add(d);const C=l.get(d);m.push({key:d,model:Be(ve,Ee),provider:Ee,isDiscovered:Se.has(d),contextWindow:(x==null?void 0:x.contextWindow)??null,inputPrice:C?C.input_price_per_million:(x==null?void 0:x.inputPrice)??null,outputPrice:C?C.output_price_per_million:(x==null?void 0:x.outputPrice)??null,cacheReadPrice:C?C.cache_read_price_per_million:(x==null?void 0:x.cacheReadPrice)??null,cacheWritePrice:C?C.cache_write_price_per_million:(x==null?void 0:x.cacheWritePrice)??null,cacheWrite1hPrice:C?C.cache_write_1h_price_per_million??null:(x==null?void 0:x.cacheWrite1hPrice)??null,pricingTiers:C?C.pricing_tiers??[]:(x==null?void 0:x.pricingTiers)??[],source:C?"configured":(x==null?void 0:x.source)??"none"})};for(const d of((M=r.data)==null?void 0:M.data)??[]){if(d.owned_by===Et)continue;const ve=d.pricing_source==="default"?"default":d.pricing?"configured":"none";g(d.id,d.id,d.owned_by||Oe(d.id),{key:d.id,model:d.id,provider:d.owned_by,contextWindow:d.context_window,inputPrice:((v=d.pricing)==null?void 0:v.input_price_per_million)??null,outputPrice:((_=d.pricing)==null?void 0:_.output_price_per_million)??null,cacheReadPrice:(($=d.pricing)==null?void 0:$.cache_read_price_per_million)??null,cacheWritePrice:((L=d.pricing)==null?void 0:L.cache_write_price_per_million)??null,cacheWrite1hPrice:((z=d.pricing)==null?void 0:z.cache_write_1h_price_per_million)??null,pricingTiers:(($e=d.pricing)==null?void 0:$e.pricing_tiers)??[],source:ve})}for(const d of l.keys())g(d,d,Oe(d));return m},[r.data,s.data,Se]),Ce=c.useMemo(()=>new Map(te.map(l=>[l.key,l])),[te]),ie=c.useMemo(()=>{var o,g,M;const l=te.map(v=>{var _,$;return{...v,contextWindow:v.contextWindow??((_=F[v.key])==null?void 0:_.context_window)??null,releaseDate:(($=F[v.key])==null?void 0:$.release_date)??null}}),m=new Set(l.map(v=>v.key));for(const v of((o=n.data)==null?void 0:o.providers)??[])for(const _ of v.models)m.has(_.key)||(m.add(_.key),l.push({key:_.key,model:Be(_.key,v.provider),provider:v.provider,isDiscovered:!0,contextWindow:((g=F[_.key])==null?void 0:g.context_window)??null,releaseDate:((M=F[_.key])==null?void 0:M.release_date)??null,inputPrice:null,outputPrice:null,cacheReadPrice:null,cacheWritePrice:null,cacheWrite1hPrice:null,pricingTiers:[],source:"none"}));return l},[te,n.data,F]),at=(((Ae=n.data)==null?void 0:Ae.providers)??[]).filter(l=>!l.ok),re=c.useMemo(()=>{const l=Array.from(new Set(ie.map(m=>m.provider))).sort((m,o)=>m.localeCompare(o));return[{value:"all",label:"All providers"},...l.map(m=>({value:m,label:m}))]},[ie]);c.useEffect(()=>{D==="all"||re.length<=1||re.some(l=>l.value===D)||Ne("all")},[re,D]);const U=p.trim().toLowerCase(),he=Number(de)||0,me=Q===""?Number.POSITIVE_INFINITY:Number(Q),st=pe===""?null:Number(pe),xe=ee==="all"?null:Date.now()-Number(ee)*Rt,G=c.useMemo(()=>{const l=o=>{if(U&&!o.key.toLowerCase().includes(U)&&!o.provider.toLowerCase().includes(U)||D!=="all"&&o.provider!==D||K==="configured"&&o.source!=="configured"||K==="default"&&o.source!=="default"||K==="priced"&&o.inputPrice==null||K==="unpriced"&&o.inputPrice!=null||H==="discovered"&&!o.isDiscovered||H==="custom"&&o.isDiscovered)return!1;if(q!=="all"){const g=De.find(v=>v.value===q),M=F[o.key];if(!g||!M||!g.test(M))return!1}if(he>0&&(o.contextWindow==null||o.contextWindowme))return!1;if(xe!=null){const g=o.releaseDate?Date.parse(o.releaseDate):Number.NaN;if(Number.isNaN(g)||g{const M=S.dir==="asc"?1:-1;if(S.col==="model")return o.model.localeCompare(g.model)*M;if(S.col==="released"){const L=o.releaseDate??null,z=g.releaseDate??null;return!L&&!z?o.model.localeCompare(g.model):L?z?(Lz?1:0)*M||o.model.localeCompare(g.model):-1:1}const v=L=>S.col==="input"?L.inputPrice:L.outputPrice,_=v(o),$=v(g);return _==null&&$==null?o.model.localeCompare(g.model):_==null?1:$==null?-1:(_-$)*M||o.model.localeCompare(g.model)};return ie.filter(l).sort(m)},[ie,U,D,K,H,q,he,me,xe,F,S]),J=G.length,ct=Math.max(1,Math.ceil(J/k)),ke=Math.min(P,ct-1),Me=ke*k,fe=G.slice(Me,Me+k),ot={column:S.col,direction:S.dir==="asc"?"ascending":"descending"},ut=l=>{Z({col:String(l.column),dir:l.direction==="ascending"?"asc":"desc"}),j(0)},dt=c.useCallback(l=>h(m=>m===l?null:l),[]),ge=fe.map(l=>l.key),X=Wt(W.selectedKeys,ge),pt=ge.length>0&&X.length===ge.length&&J>X.length,ht=W.allMatching?G.map(l=>l.key):X,We=W.allMatching?J:X.length,Ie=y?G.find(l=>l.key===y)??Ce.get(y)??null:null,mt=async l=>{ye(!0),Pe(void 0);try{for(const m of ht)await f.mutateAsync({model_key:m,input_price_per_million:l.input_price_per_million,output_price_per_million:l.output_price_per_million,cache_read_price_per_million:l.cache_read_price_per_million??null,cache_write_price_per_million:l.cache_write_price_per_million??null,cache_write_1h_price_per_million:null,pricing_tiers:[]});W.clear(),ue(!1)}catch(m){Pe(m)}finally{ye(!1)}},xt=r.isLoading||s.isLoading||n.isLoading,ft=U!==""||D!=="all"||K!=="all"||H!=="all"||q!=="all"||de!=="0"||Q!==""||ee!=="all"?"No models match your filters.":"No models yet. Add a provider on the Providers page, or price a model below.",ne=N?G.find(l=>l.key===N)??Ce.get(N)??null:null;return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(Pt,{title:"Models",description:"Every model your providers can serve. Set a price on any model so budgets and usage tracking work."}),e.jsx(Nt,{error:r.error??s.error??n.error??a.error}),e.jsxs("div",{className:`grid gap-4 lg:items-start ${ne?"lg:grid-cols-[minmax(0,1fr)_360px]":"grid-cols-1"}`,children:[e.jsxs("div",{className:"flex min-w-0 flex-col gap-3",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(Ut,{value:p,onChange:lt,placeholder:"Search models…"}),e.jsx(B,{ariaLabel:"Filter by provider",value:D,onChange:R(Ne),options:re}),e.jsx(B,{ariaLabel:"Filter by pricing",value:K,onChange:R(Xe),options:[{value:"all",label:"Any pricing"},{value:"configured",label:"Custom price"},{value:"default",label:"Default price"},{value:"priced",label:"Priced"},{value:"unpriced",label:"Unpriced"}]}),e.jsx(B,{ariaLabel:"Filter by source",value:H,onChange:R(Ze),options:[{value:"all",label:"Any source"},{value:"discovered",label:"Discovered"},{value:"custom",label:"Custom (not discovered)"}]}),e.jsx(B,{ariaLabel:"Filter by capability",value:q,onChange:R(Qe),options:[{value:"all",label:"Any capability"},...De.map(l=>({value:l.value,label:l.label}))]}),e.jsx(B,{ariaLabel:"Minimum context window",value:de,onChange:R(et),options:Dt}),e.jsx(B,{ariaLabel:"Maximum input price",value:Q,onChange:R(tt),options:Ft}),e.jsx(B,{ariaLabel:"Compare prices at context",value:pe,onChange:rt,options:Bt}),e.jsx(B,{ariaLabel:"Filter by release date",value:ee,onChange:R(it),options:Kt})]}),e.jsx(ii,{providers:at}),X.length>0?e.jsx(It,{selectedCount:We,allMatching:W.allMatching,matchingTotal:J,canSelectAllMatching:pt,onSelectAllMatching:W.enableAllMatching,onClear:W.clear,children:e.jsx(A,{size:"sm",variant:"primary",onPress:()=>ue(!0),children:"Set pricing"})}):null,e.jsx(ti,{rows:fe,isLoading:xt,empty:ft,sortDescriptor:ot,onSortChange:ut,selectedKey:N,onSelect:O,onEditPricing:dt,comparisonContextTokens:st,selectedKeys:W.selectedKeys,onSelectionChange:W.onSelectionChange}),Ie?e.jsx(se,{children:e.jsxs(se.Content,{className:"p-0",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-[var(--otari-line)] px-4 py-2",children:[e.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Edit pricing"}),e.jsx(A,{size:"sm",variant:"ghost",onPress:()=>h(null),children:"Close"})]}),e.jsx(Xt,{row:Ie,onClose:()=>h(null)})]})}):null,e.jsx(Lt,{page:ke,pageSize:k,total:J,rowsOnPage:fe.length,onPageChange:j,onPageSizeChange:l=>{T(l),j(0)},pageSizeOptions:[15,25,50]})]}),ne?e.jsx("aside",{className:"lg:sticky lg:top-4",children:e.jsx(Ht,{row:ne,metadata:F[ne.key],metadataAvailable:nt,onMakeAlias:l=>t(`/aliases?target=${encodeURIComponent(l)}`),onClose:()=>O(null)})}):null]}),e.jsx(At,{isOpen:Ue,onOpenChange:ue,targetCount:We,isPending:Ge,error:Je,onSubmit:mt,title:"Set pricing",description:l=>`Apply these per-1M rates to ${l.toLocaleString()} selected ${l===1?"model":"models"}. This replaces each model's price; pricing tiers and the 1h cache rate are cleared. Edit a single model for tiers.`})]})}export{pi as ModelsPage}; +import{j as e}from"./tanstack-query-1t81HyiD.js";import{i as gt,u as vt,r as c}from"./react-dgEcD0HR.js";import{w as _t,x as bt,h as jt,y as yt,z as je,P as Pt,E as Nt,F as B,I as St,A as ae,B as Re,C as ze,D as be,G as Ct,H as kt,J as E}from"./index-CGnfXTEF.js";import{u as Mt,r as Wt,B as It}from"./tableSelection-9hV37uhu.js";import{D as Tt}from"./DataTable-Bmn_eYSV.js";import{T as Lt,S as At}from"./TablePagination-r1AimUKf.js";import{B as A,d as se,f as V}from"./heroui-BI50yK5B.js";function Oe(t){const i=t.indexOf(":");return i>0?t.slice(0,i):"—"}function $t(t,i=Date.now()){const r=new Map;for(const n of t){const a=r.get(n.model_key)??[];a.push(n),r.set(n.model_key,a)}const s=[];for(const n of r.values()){const a=[...n].sort((p,u)=>Date.parse(p.effective_at)-Date.parse(u.effective_at)),f=[...a].reverse().find(p=>Date.parse(p.effective_at)<=i);s.push(f??a[0])}return s.sort((n,a)=>n.model_key.localeCompare(a.model_key))}const Et="otari",De=[{value:"vision",label:"Vision",test:t=>Array.isArray(t.input_modalities)&&t.input_modalities.includes("image")},{value:"tool_call",label:"Tool calling",test:t=>!!t.tool_call},{value:"reasoning",label:"Reasoning",test:t=>!!t.reasoning},{value:"structured_output",label:"Structured output",test:t=>!!t.structured_output},{value:"attachment",label:"Attachments",test:t=>!!t.attachment},{value:"audio",label:"Audio",test:t=>Array.isArray(t.input_modalities)&&t.input_modalities.includes("audio")},{value:"pdf",label:"PDF",test:t=>Array.isArray(t.input_modalities)&&t.input_modalities.includes("pdf")}],Ot=[{key:"reasoning",label:"Reasoning"},{key:"tool_call",label:"Tool calling"},{key:"structured_output",label:"Structured output"},{key:"attachment",label:"Attachments"},{key:"temperature",label:"Temperature"}],Fe={text:"Text",image:"Image",audio:"Audio",video:"Video",pdf:"PDF"},Dt=[{value:"0",label:"Any context"},{value:"8000",label:"≥ 8K"},{value:"32000",label:"≥ 32K"},{value:"128000",label:"≥ 128K"},{value:"200000",label:"≥ 200K"},{value:"1000000",label:"≥ 1M"}],Ft=[{value:"",label:"Any price"},{value:"1",label:"≤ $1 / 1M in"},{value:"3",label:"≤ $3 / 1M in"},{value:"10",label:"≤ $10 / 1M in"},{value:"30",label:"≤ $30 / 1M in"}],Bt=[{value:"",label:"Base prices"},{value:"8000",label:"Compare at 8K"},{value:"128000",label:"Compare at 128K"},{value:"200000",label:"Compare at 200K"},{value:"500000",label:"Compare at 500K"},{value:"1000000",label:"Compare at 1M"}],Kt=[{value:"all",label:"Any release date"},{value:"365",label:"Past year"},{value:"730",label:"Past 2 years"},{value:"1095",label:"Past 3 years"}],Rt=1440*60*1e3,zt=t=>t.key;function Be(t,i){const r=`${i}:`;return t.startsWith(r)?t.slice(r.length):t}function Ke(t,i){const r={inputPrice:t.inputPrice,outputPrice:t.outputPrice,cacheReadPrice:t.cacheReadPrice,cacheWritePrice:t.cacheWritePrice,cacheWrite1hPrice:t.cacheWrite1hPrice};if(i==null)return r;const s=t.pricingTiers.filter(n=>n.min_input_tokens<=i).sort((n,a)=>a.min_input_tokens-n.min_input_tokens)[0];return s?{inputPrice:s.input_price_per_million??r.inputPrice,outputPrice:s.output_price_per_million??r.outputPrice,cacheReadPrice:s.cache_read_price_per_million??r.cacheReadPrice,cacheWritePrice:s.cache_write_price_per_million??r.cacheWritePrice,cacheWrite1hPrice:s.cache_write_1h_price_per_million??r.cacheWrite1hPrice}:r}function ce(t){const i=Number(t);return t.trim()!==""&&Number.isFinite(i)&&i>=0}function w(t){if(t.trim()==="")return!0;const i=Number(t);return Number.isFinite(i)&&i>=0}function Y(t){return t.trim()===""?null:Number(t)}function we(t){return t.map((i,r)=>({id:r,minInputTokens:String(i.min_input_tokens),input:i.input_price_per_million==null?"":String(i.input_price_per_million),output:i.output_price_per_million==null?"":String(i.output_price_per_million),cacheRead:i.cache_read_price_per_million==null?"":String(i.cache_read_price_per_million),cacheWrite:i.cache_write_price_per_million==null?"":String(i.cache_write_price_per_million),cacheWrite1h:i.cache_write_1h_price_per_million==null?"":String(i.cache_write_1h_price_per_million)}))}function Ve(t){const i=new Set;return t.every(r=>{const s=Number(r.minInputTokens),n=[r.input,r.output,r.cacheRead,r.cacheWrite,r.cacheWrite1h].some(a=>a.trim()!=="");return!Number.isInteger(s)||s<=0||i.has(s)||!n?!1:(i.add(s),[r.input,r.output,r.cacheRead,r.cacheWrite,r.cacheWrite1h].every(w))})}function Ye(t){return t.map(i=>({min_input_tokens:Number(i.minInputTokens),...i.input.trim()===""?{}:{input_price_per_million:Number(i.input)},...i.output.trim()===""?{}:{output_price_per_million:Number(i.output)},...i.cacheRead.trim()===""?{}:{cache_read_price_per_million:Number(i.cacheRead)},...i.cacheWrite.trim()===""?{}:{cache_write_price_per_million:Number(i.cacheWrite)},...i.cacheWrite1h.trim()===""?{}:{cache_write_1h_price_per_million:Number(i.cacheWrite1h)}}))}function b({value:t,onChange:i,ariaLabel:r}){return e.jsx("input",{type:"number",step:"any",min:"0",inputMode:"decimal","aria-label":r,value:t,onChange:s=>i(s.target.value),className:"w-28 rounded-md border border-[var(--otari-line)] bg-white px-2 py-1 text-right text-sm tabular-nums focus:border-[var(--otari-brand)] focus:outline-none"})}function He({tiers:t,onChange:i}){const r=(n,a,f)=>{i(t.map(p=>p.id===n?{...p,[a]:f}:p))},s=()=>{const n=t.reduce((a,f)=>Math.max(a,f.id),-1)+1;i([...t,{id:n,minInputTokens:"128000",input:"",output:"",cacheRead:"",cacheWrite:"",cacheWrite1h:""}])};return e.jsxs("div",{className:"flex flex-col gap-2 rounded-lg border border-[var(--otari-line)] p-3",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-medium text-[var(--otari-ink)]",children:"Long-context price tiers"}),e.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:"At a threshold, listed rates replace the base rate for the whole request."})]}),e.jsx(A,{size:"sm",variant:"outline",onPress:s,children:"Add tier"})]}),t.map(n=>e.jsxs("div",{className:"flex flex-wrap items-end gap-2 border-t border-[var(--otari-line)] pt-2",children:[e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Context ≥ tokens",e.jsx("input",{type:"number",min:"1",step:"1",inputMode:"numeric","aria-label":"Tier context threshold",value:n.minInputTokens,onChange:a=>r(n.id,"minInputTokens",a.target.value),className:"w-28 rounded-md border border-[var(--otari-line)] bg-white px-2 py-1 text-right text-sm tabular-nums focus:border-[var(--otari-brand)] focus:outline-none"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Input",e.jsx(b,{value:n.input,onChange:a=>r(n.id,"input",a),ariaLabel:"Tier input price"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Output",e.jsx(b,{value:n.output,onChange:a=>r(n.id,"output",a),ariaLabel:"Tier output price"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Cache read",e.jsx(b,{value:n.cacheRead,onChange:a=>r(n.id,"cacheRead",a),ariaLabel:"Tier cache read price"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Cache write",e.jsx(b,{value:n.cacheWrite,onChange:a=>r(n.id,"cacheWrite",a),ariaLabel:"Tier cache write price"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["1h write",e.jsx(b,{value:n.cacheWrite1h,onChange:a=>r(n.id,"cacheWrite1h",a),ariaLabel:"Tier 1 hour cache write price"})]}),e.jsx(A,{size:"sm",variant:"ghost",onPress:()=>i(t.filter(a=>a.id!==n.id)),children:"Remove"})]},n.id))]})}function wt({source:t}){return t==="configured"?e.jsx(V,{size:"sm",color:"default",children:"configured"}):t==="default"||t==="alias"?e.jsx(V,{size:"sm",color:"accent",children:t}):e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"not priced"})}function oe({label:t,tone:i="info",children:r}){const s=c.useId();return e.jsxs("span",{className:"group relative inline-flex items-center font-normal normal-case",children:[e.jsx("button",{type:"button","aria-label":t,"aria-describedby":s,className:`inline-flex h-4 w-4 items-center justify-center rounded-full border text-[10px] leading-none ${i==="warning"?"border-[#c2843a] text-[#b45309]":"border-[var(--otari-line)] text-[var(--otari-muted)] hover:border-[var(--otari-brand)] hover:text-[var(--otari-brand)]"}`,children:"i"}),e.jsx("span",{id:s,role:"tooltip",className:"pointer-events-none absolute top-full right-0 z-20 mt-1.5 w-72 rounded-lg border border-[var(--otari-line)] bg-[var(--otari-surface)] px-3 py-2 text-left text-xs font-normal whitespace-normal break-words text-[var(--otari-ink)] opacity-0 shadow-lg transition-opacity group-hover:opacity-100 group-focus-within:opacity-100",children:r})]})}function Vt(){const t=kt();return t.data?t.data.default_pricing?e.jsx(oe,{label:"How unpriced models are metered",tone:"info",children:"Default pricing is on: models without a configured price are metered using community-maintained rates (the bundled genai-prices dataset). Set a price to override the fallback."}):e.jsxs(oe,{label:"How unpriced models are metered",tone:"warning",children:["Default pricing is off: only models with a configured price are metered.",t.data.require_pricing?" Requests for any other model are rejected (HTTP 402) because require_pricing is on.":" Other models are served without cost tracking."]}):null}function I({label:t,value:i}){return e.jsxs("div",{className:"flex items-baseline justify-between gap-3",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:t}),e.jsx("span",{className:"text-right text-sm text-[var(--otari-ink)] tabular-nums",children:i})]})}function le({title:t,children:i}){return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("span",{className:"text-xs font-semibold uppercase tracking-wide text-[var(--otari-muted)]",children:t}),i]})}function Yt({row:t}){const i=je(),r=Re(),[s,n]=c.useState(!1),[a,f]=c.useState(""),[p,u]=c.useState(""),[P,j]=c.useState(""),[k,T]=c.useState(""),[y,h]=c.useState(""),[N,O]=c.useState([]),S=()=>{f(t.inputPrice==null?"":String(t.inputPrice)),u(t.outputPrice==null?"":String(t.outputPrice)),j(t.cacheReadPrice==null?"":String(t.cacheReadPrice)),T(t.cacheWritePrice==null?"":String(t.cacheWritePrice)),h(t.cacheWrite1hPrice==null?"":String(t.cacheWrite1hPrice)),O(we(t.pricingTiers)),n(!0)},Z=ce(a)&&ce(p)&&w(P)&&w(k)&&w(y)&&Ve(N),W=()=>{Z&&i.mutate({model_key:t.key,input_price_per_million:Number(a),output_price_per_million:Number(p),cache_read_price_per_million:Y(P),cache_write_price_per_million:Y(k),cache_write_1h_price_per_million:Y(y),pricing_tiers:Ye(N)},{onSuccess:()=>n(!1)})};return s?e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Input $ / 1M"}),e.jsx(b,{value:a,onChange:f,ariaLabel:`Input price for ${t.key}`})]}),e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Output $ / 1M"}),e.jsx(b,{value:p,onChange:u,ariaLabel:`Output price for ${t.key}`})]}),e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Cache read $ / 1M"}),e.jsx(b,{value:P,onChange:j,ariaLabel:`Cache read price for ${t.key}`})]}),e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Cache write $ / 1M"}),e.jsx(b,{value:k,onChange:T,ariaLabel:`Cache write price for ${t.key}`})]}),e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"1h cache write $ / 1M"}),e.jsx(b,{value:y,onChange:h,ariaLabel:`1 hour cache write price for ${t.key}`})]}),e.jsx(He,{tiers:N,onChange:O}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(A,{size:"sm",variant:"primary",isDisabled:i.isPending||!Z,onPress:W,children:"Save"}),e.jsx(A,{size:"sm",variant:"ghost",isDisabled:i.isPending,onPress:()=>n(!1),children:"Cancel"})]}),i.error?e.jsx("span",{className:"text-xs text-red-700",children:be(i.error)}):null]}):e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(I,{label:"Input",value:t.inputPrice==null?"—":`${E(t.inputPrice)} / 1M`}),e.jsx(I,{label:"Output",value:t.outputPrice==null?"—":`${E(t.outputPrice)} / 1M`}),e.jsx(I,{label:"Cache read",value:t.cacheReadPrice==null?"—":`${E(t.cacheReadPrice)} / 1M`}),e.jsx(I,{label:"Cache write",value:t.cacheWritePrice==null?"—":`${E(t.cacheWritePrice)} / 1M`}),e.jsx(I,{label:"1h cache write",value:t.cacheWrite1hPrice==null?"—":`${E(t.cacheWrite1hPrice)} / 1M`}),e.jsx(I,{label:"Context tiers",value:t.pricingTiers.length?`${t.pricingTiers.length} configured`:"—"}),e.jsxs("div",{className:"flex items-center gap-2 pt-1",children:[e.jsx(A,{size:"sm",variant:"outline",onPress:S,children:t.source==="configured"?"Edit price":"Set price"}),t.source==="configured"?e.jsxs(e.Fragment,{children:[e.jsx(ze,{confirmLabel:"Reset",isPending:r.isPending,onConfirm:()=>r.mutate(t.key),children:"Reset"}),e.jsx(oe,{label:"What reset does",children:"Removes the custom price. The model reverts to the default rate (genai-prices) when default pricing is on, otherwise it is metered at no cost."})]}):null,r.error?e.jsx("span",{className:"text-xs text-red-700",children:be(r.error)}):null]})]})}function Ht({row:t,metadata:i,metadataAvailable:r,onMakeAlias:s,onClose:n}){const a=(i==null?void 0:i.input_modalities)??[],f=(i==null?void 0:i.output_modalities)??[],p=Ot.filter(({key:u})=>i==null?void 0:i[u]);return e.jsx(se,{children:e.jsxs(se.Content,{className:"flex flex-col gap-5 p-5",children:[e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h2",{className:"text-base font-semibold break-all text-[var(--otari-ink)]",children:t.model}),i!=null&&i.deprecated?e.jsx(V,{size:"sm",color:"danger",children:"deprecated"}):null]}),e.jsxs("p",{className:"mt-1 text-xs break-all text-[var(--otari-muted)]",children:["Selector: ",e.jsx("code",{children:t.key})]}),i!=null&&i.family?e.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:i.family}):null]}),e.jsx("button",{type:"button","aria-label":"Close model details",onClick:n,className:"-mt-1 -mr-1 shrink-0 rounded-md px-1.5 py-0.5 text-lg leading-none text-[var(--otari-muted)] hover:bg-[var(--otari-bg)] hover:text-[var(--otari-ink)]",children:"✕"})]}),i!=null&&i.description?e.jsx("p",{className:"text-sm text-[var(--otari-ink)]",children:i.description}):null,e.jsxs(le,{title:"Pricing",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(wt,{source:t.source}),t.isDiscovered?null:e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"not discovered"})]}),e.jsx(Yt,{row:t},t.key),e.jsx(A,{size:"sm",variant:"outline",onPress:()=>s(t.key),children:"Make an alias"})]}),e.jsxs(le,{title:"Specs",children:[e.jsx(I,{label:"Context window",value:ae(t.contextWindow)}),e.jsx(I,{label:"Max output",value:ae((i==null?void 0:i.max_output_tokens)??null)}),e.jsx(I,{label:"Knowledge cutoff",value:(i==null?void 0:i.knowledge_cutoff)??"—"}),e.jsx(I,{label:"Released",value:Ct(i==null?void 0:i.release_date)}),e.jsx(I,{label:"Open weights",value:i?i.open_weights?"Yes":"No":"—"})]}),e.jsx(le,{title:"Modalities",children:a.length===0&&f.length===0?e.jsx("span",{className:"text-sm text-[var(--otari-muted)]",children:"Unknown."}):e.jsxs("div",{className:"flex flex-col gap-1.5 text-xs text-[var(--otari-muted)]",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-1",children:[e.jsx("span",{children:"In:"}),a.map(u=>e.jsx(V,{size:"sm",color:"default",children:Fe[u]??u},u))]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-1",children:[e.jsx("span",{children:"Out:"}),f.map(u=>e.jsx(V,{size:"sm",color:"default",children:Fe[u]??u},u))]})]})}),e.jsx(le,{title:"Capabilities",children:p.length>0?e.jsx("div",{className:"flex flex-wrap gap-1.5",children:p.map(({key:u,label:P})=>e.jsx(V,{size:"sm",color:"default",children:P},u))}):e.jsx("span",{className:"text-sm text-[var(--otari-muted)]",children:r?"None reported.":"Extended metadata unavailable (models.dev disabled or unreachable)."})})]})})}const qt=15;function Ut({value:t,onChange:i,placeholder:r}){return e.jsx("input",{type:"search",value:t,onChange:s=>i(s.target.value),placeholder:r,"aria-label":r,className:"w-full max-w-xs rounded-md border border-[var(--otari-line)] bg-white px-3 py-1.5 text-sm focus:border-[var(--otari-brand)] focus:outline-none"})}const qe="otari.dashboard.modelsSort",_e={col:"model",dir:"asc"},Gt=["model","released","input","output"];function Jt(){if(typeof window>"u")return _e;try{const t=window.localStorage.getItem(qe);if(!t)return _e;const i=JSON.parse(t);if(Gt.includes(i.col)&&(i.dir==="asc"||i.dir==="desc"))return{col:i.col,dir:i.dir}}catch{}return _e}function Xt({row:t,onClose:i}){const r=je(),s=Re(),[n,a]=c.useState(t.inputPrice==null?"":String(t.inputPrice)),[f,p]=c.useState(t.outputPrice==null?"":String(t.outputPrice)),[u,P]=c.useState(t.cacheReadPrice==null?"":String(t.cacheReadPrice)),[j,k]=c.useState(t.cacheWritePrice==null?"":String(t.cacheWritePrice)),[T,y]=c.useState(t.cacheWrite1hPrice==null?"":String(t.cacheWrite1hPrice)),[h,N]=c.useState(we(t.pricingTiers)),O=ce(n)&&ce(f)&&w(u)&&w(j)&&w(T)&&Ve(h),S=()=>{O&&r.mutate({model_key:t.key,input_price_per_million:Number(n),output_price_per_million:Number(f),cache_read_price_per_million:Y(u),cache_write_price_per_million:Y(j),cache_write_1h_price_per_million:Y(T),pricing_tiers:Ye(h)},{onSuccess:i})};return e.jsxs("div",{className:"flex flex-col gap-3 px-4 py-3",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("span",{className:"text-xs font-medium break-all text-[var(--otari-muted)]",children:t.key}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["Input $ / 1M",e.jsx(b,{value:n,onChange:a,ariaLabel:`Input price for ${t.key}`})]}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["Output $ / 1M",e.jsx(b,{value:f,onChange:p,ariaLabel:`Output price for ${t.key}`})]}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["Cache read $ / 1M",e.jsx(b,{value:u,onChange:P,ariaLabel:`Cache read price for ${t.key}`})]}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["Cache write $ / 1M",e.jsx(b,{value:j,onChange:k,ariaLabel:`Cache write price for ${t.key}`})]}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["1h cache write $ / 1M",e.jsx(b,{value:T,onChange:y,ariaLabel:`1 hour cache write price for ${t.key}`})]}),e.jsx(A,{size:"sm",variant:"primary",isDisabled:r.isPending||!O,onPress:S,children:r.isPending?"Saving…":"Save"}),e.jsx(A,{size:"sm",variant:"ghost",isDisabled:r.isPending,onPress:i,children:"Cancel"}),t.source==="configured"?e.jsxs("span",{className:"inline-flex items-center gap-1",children:[e.jsx(ze,{confirmLabel:"Reset",isPending:s.isPending,onConfirm:()=>s.mutate(t.key,{onSuccess:i}),children:"Reset"}),e.jsx(oe,{label:"What reset does",children:"Removes the custom price. The model reverts to the default rate (genai-prices) when default pricing is on, otherwise it is metered at no cost."})]}):null,r.error||s.error?e.jsx("span",{className:"text-xs text-red-700",children:be(r.error??s.error)}):null]}),e.jsx(He,{tiers:h,onChange:N})]})}function Zt({primary:t,secondary:i,rowKey:r,primaryLabel:s,secondaryLabel:n,onEdit:a}){const f=(p,u)=>e.jsx("button",{type:"button","aria-label":`Edit ${u} price for ${r}`,className:"tabular-nums hover:text-[var(--otari-brand-dark)] hover:underline",onClick:P=>{P.stopPropagation(),a()},children:p==null?"—":E(p)});return e.jsxs("span",{className:"inline-flex items-center justify-end gap-1",children:[f(t,s),e.jsx("span",{className:"text-[var(--otari-muted)]",children:"/"}),f(i,n)]})}function Qt({rates:t,rowKey:i,onEdit:r}){const s=[t.cacheReadPrice==null?null:`R ${E(t.cacheReadPrice)}`,t.cacheWritePrice==null?null:`W ${E(t.cacheWritePrice)}`,t.cacheWrite1hPrice==null?null:`1h ${E(t.cacheWrite1hPrice)}`].filter(n=>n!==null);return e.jsx("button",{type:"button","aria-label":`Edit caching price for ${i}`,className:"max-w-44 text-right text-xs leading-5 text-[var(--otari-muted)] hover:text-[var(--otari-brand-dark)] hover:underline",onClick:n=>{n.stopPropagation(),r()},children:s.length>0?s.join(" · "):"Input-rate fallback"})}function ei({row:t,onEdit:i}){const r=[...t.pricingTiers].sort((n,a)=>n.min_input_tokens-a.min_input_tokens).map(n=>ae(n.min_input_tokens)),s=r.length===0?"Base only":`${r.length} tier${r.length===1?"":"s"} · ≥ ${r.join(", ")}`;return e.jsx("button",{type:"button","aria-label":`Edit pricing policy for ${t.key}`,className:"max-w-40 text-right text-xs leading-5 text-[var(--otari-muted)] hover:text-[var(--otari-brand-dark)] hover:underline",onClick:n=>{n.stopPropagation(),i()},children:s})}function ti({rows:t,isLoading:i,empty:r,sortDescriptor:s,onSortChange:n,selectedKey:a,onSelect:f,onEditPricing:p,comparisonContextTokens:u,selectedKeys:P,onSelectionChange:j}){const k=c.useMemo(()=>{const y=u==null?"Base":`at ${ae(u)}`;return[{id:"model",header:"Model",isRowHeader:!0,allowsSorting:!0,cell:h=>e.jsxs("span",{className:"font-medium break-all",children:[h.model,e.jsx("span",{className:"sr-only",children:h.key})]})},{id:"provider",header:"Provider",cell:h=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:h.provider})},{id:"input",header:e.jsxs("span",{className:"inline-flex items-center gap-1",children:[`${y} in / out $ / 1M`,e.jsx(Vt,{})]}),align:"end",allowsSorting:!0,cell:h=>{const N=Ke(h,u);return e.jsx(Zt,{primary:N.inputPrice,secondary:N.outputPrice,rowKey:h.key,primaryLabel:"input",secondaryLabel:"output",onEdit:()=>p(h.key)})}},{id:"caching",header:`Caching ${u==null?"policy":y}`,align:"end",cell:h=>e.jsx(Qt,{rates:Ke(h,u),rowKey:h.key,onEdit:()=>p(h.key)})},{id:"policy",header:"Pricing policy",align:"end",cell:h=>e.jsx(ei,{row:h,onEdit:()=>p(h.key)})}]},[u,p]),T=c.useCallback(y=>y.key===a?"bg-[var(--otari-brand-tint)]":void 0,[a]);return e.jsx(Tt,{ariaLabel:"Models",columns:k,rows:t,getRowKey:zt,isLoading:i,emptyContent:r,selectionMode:"multiple",selectedKeys:P,onSelectionChange:j,sortDescriptor:s,onSortChange:n,onRowAction:f,rowClassName:T})}function ii({providers:t}){return t.length===0?null:e.jsxs(St,{tone:"warning",children:["Could not list ",t.map(i=>i.provider).join(", "),". Check that provider's credentials in config.yml; its models are missing from the list below."]})}function pi(){var Te,Le,Ae;const t=gt(),[i]=vt(),r=_t(),s=bt(),n=jt(),a=yt(),f=je(),[p,u]=c.useState(""),[P,j]=c.useState(0),[k,T]=c.useState(qt),[y,h]=c.useState(null),[N,O]=c.useState(null),[S,Z]=c.useState(Jt),W=Mt(),[Ue,ue]=c.useState(!1),[Ge,ye]=c.useState(!1),[Je,Pe]=c.useState(void 0);c.useEffect(()=>{try{window.localStorage.setItem(qe,JSON.stringify(S))}catch{}},[S]);const[D,Ne]=c.useState(i.get("provider")||"all"),[K,Xe]=c.useState("all"),[H,Ze]=c.useState("all"),[q,Qe]=c.useState("all"),[de,et]=c.useState("0"),[Q,tt]=c.useState(""),[ee,it]=c.useState("all"),[pe,rt]=c.useState(""),F=((Te=a.data)==null?void 0:Te.models)??{},nt=((Le=a.data)==null?void 0:Le.available)??!1,Se=c.useMemo(()=>{var l;return new Set((((l=n.data)==null?void 0:l.providers)??[]).flatMap(m=>m.models.map(o=>o.key)))},[n.data]),lt=l=>{u(l),j(0)},R=l=>m=>{l(m),j(0)},te=c.useMemo(()=>{var M,v,_,$,L,z,$e;const l=new Map($t(s.data??[]).map(d=>[d.model_key,d])),m=[],o=new Set,g=(d,ve,Ee,x)=>{if(o.has(d))return;o.add(d);const C=l.get(d);m.push({key:d,model:Be(ve,Ee),provider:Ee,isDiscovered:Se.has(d),contextWindow:(x==null?void 0:x.contextWindow)??null,inputPrice:C?C.input_price_per_million:(x==null?void 0:x.inputPrice)??null,outputPrice:C?C.output_price_per_million:(x==null?void 0:x.outputPrice)??null,cacheReadPrice:C?C.cache_read_price_per_million:(x==null?void 0:x.cacheReadPrice)??null,cacheWritePrice:C?C.cache_write_price_per_million:(x==null?void 0:x.cacheWritePrice)??null,cacheWrite1hPrice:C?C.cache_write_1h_price_per_million??null:(x==null?void 0:x.cacheWrite1hPrice)??null,pricingTiers:C?C.pricing_tiers??[]:(x==null?void 0:x.pricingTiers)??[],source:C?"configured":(x==null?void 0:x.source)??"none"})};for(const d of((M=r.data)==null?void 0:M.data)??[]){if(d.owned_by===Et)continue;const ve=d.pricing_source==="default"?"default":d.pricing?"configured":"none";g(d.id,d.id,d.owned_by||Oe(d.id),{key:d.id,model:d.id,provider:d.owned_by,contextWindow:d.context_window,inputPrice:((v=d.pricing)==null?void 0:v.input_price_per_million)??null,outputPrice:((_=d.pricing)==null?void 0:_.output_price_per_million)??null,cacheReadPrice:(($=d.pricing)==null?void 0:$.cache_read_price_per_million)??null,cacheWritePrice:((L=d.pricing)==null?void 0:L.cache_write_price_per_million)??null,cacheWrite1hPrice:((z=d.pricing)==null?void 0:z.cache_write_1h_price_per_million)??null,pricingTiers:(($e=d.pricing)==null?void 0:$e.pricing_tiers)??[],source:ve})}for(const d of l.keys())g(d,d,Oe(d));return m},[r.data,s.data,Se]),Ce=c.useMemo(()=>new Map(te.map(l=>[l.key,l])),[te]),ie=c.useMemo(()=>{var o,g,M;const l=te.map(v=>{var _,$;return{...v,contextWindow:v.contextWindow??((_=F[v.key])==null?void 0:_.context_window)??null,releaseDate:(($=F[v.key])==null?void 0:$.release_date)??null}}),m=new Set(l.map(v=>v.key));for(const v of((o=n.data)==null?void 0:o.providers)??[])for(const _ of v.models)m.has(_.key)||(m.add(_.key),l.push({key:_.key,model:Be(_.key,v.provider),provider:v.provider,isDiscovered:!0,contextWindow:((g=F[_.key])==null?void 0:g.context_window)??null,releaseDate:((M=F[_.key])==null?void 0:M.release_date)??null,inputPrice:null,outputPrice:null,cacheReadPrice:null,cacheWritePrice:null,cacheWrite1hPrice:null,pricingTiers:[],source:"none"}));return l},[te,n.data,F]),at=(((Ae=n.data)==null?void 0:Ae.providers)??[]).filter(l=>!l.ok),re=c.useMemo(()=>{const l=Array.from(new Set(ie.map(m=>m.provider))).sort((m,o)=>m.localeCompare(o));return[{value:"all",label:"All providers"},...l.map(m=>({value:m,label:m}))]},[ie]);c.useEffect(()=>{D==="all"||re.length<=1||re.some(l=>l.value===D)||Ne("all")},[re,D]);const U=p.trim().toLowerCase(),he=Number(de)||0,me=Q===""?Number.POSITIVE_INFINITY:Number(Q),st=pe===""?null:Number(pe),xe=ee==="all"?null:Date.now()-Number(ee)*Rt,G=c.useMemo(()=>{const l=o=>{if(U&&!o.key.toLowerCase().includes(U)&&!o.provider.toLowerCase().includes(U)||D!=="all"&&o.provider!==D||K==="configured"&&o.source!=="configured"||K==="default"&&o.source!=="default"||K==="priced"&&o.inputPrice==null||K==="unpriced"&&o.inputPrice!=null||H==="discovered"&&!o.isDiscovered||H==="custom"&&o.isDiscovered)return!1;if(q!=="all"){const g=De.find(v=>v.value===q),M=F[o.key];if(!g||!M||!g.test(M))return!1}if(he>0&&(o.contextWindow==null||o.contextWindowme))return!1;if(xe!=null){const g=o.releaseDate?Date.parse(o.releaseDate):Number.NaN;if(Number.isNaN(g)||g{const M=S.dir==="asc"?1:-1;if(S.col==="model")return o.model.localeCompare(g.model)*M;if(S.col==="released"){const L=o.releaseDate??null,z=g.releaseDate??null;return!L&&!z?o.model.localeCompare(g.model):L?z?(Lz?1:0)*M||o.model.localeCompare(g.model):-1:1}const v=L=>S.col==="input"?L.inputPrice:L.outputPrice,_=v(o),$=v(g);return _==null&&$==null?o.model.localeCompare(g.model):_==null?1:$==null?-1:(_-$)*M||o.model.localeCompare(g.model)};return ie.filter(l).sort(m)},[ie,U,D,K,H,q,he,me,xe,F,S]),J=G.length,ct=Math.max(1,Math.ceil(J/k)),ke=Math.min(P,ct-1),Me=ke*k,fe=G.slice(Me,Me+k),ot={column:S.col,direction:S.dir==="asc"?"ascending":"descending"},ut=l=>{Z({col:String(l.column),dir:l.direction==="ascending"?"asc":"desc"}),j(0)},dt=c.useCallback(l=>h(m=>m===l?null:l),[]),ge=fe.map(l=>l.key),X=Wt(W.selectedKeys,ge),pt=ge.length>0&&X.length===ge.length&&J>X.length,ht=W.allMatching?G.map(l=>l.key):X,We=W.allMatching?J:X.length,Ie=y?G.find(l=>l.key===y)??Ce.get(y)??null:null,mt=async l=>{ye(!0),Pe(void 0);try{for(const m of ht)await f.mutateAsync({model_key:m,input_price_per_million:l.input_price_per_million,output_price_per_million:l.output_price_per_million,cache_read_price_per_million:l.cache_read_price_per_million??null,cache_write_price_per_million:l.cache_write_price_per_million??null,cache_write_1h_price_per_million:null,pricing_tiers:[]});W.clear(),ue(!1)}catch(m){Pe(m)}finally{ye(!1)}},xt=r.isLoading||s.isLoading||n.isLoading,ft=U!==""||D!=="all"||K!=="all"||H!=="all"||q!=="all"||de!=="0"||Q!==""||ee!=="all"?"No models match your filters.":"No models yet. Add a provider on the Providers page, or price a model below.",ne=N?G.find(l=>l.key===N)??Ce.get(N)??null:null;return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(Pt,{title:"Models",description:"Every model your providers can serve. Set a price on any model so budgets and usage tracking work."}),e.jsx(Nt,{error:r.error??s.error??n.error??a.error}),e.jsxs("div",{className:`grid gap-4 lg:items-start ${ne?"lg:grid-cols-[minmax(0,1fr)_360px]":"grid-cols-1"}`,children:[e.jsxs("div",{className:"flex min-w-0 flex-col gap-3",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(Ut,{value:p,onChange:lt,placeholder:"Search models…"}),e.jsx(B,{ariaLabel:"Filter by provider",value:D,onChange:R(Ne),options:re}),e.jsx(B,{ariaLabel:"Filter by pricing",value:K,onChange:R(Xe),options:[{value:"all",label:"Any pricing"},{value:"configured",label:"Custom price"},{value:"default",label:"Default price"},{value:"priced",label:"Priced"},{value:"unpriced",label:"Unpriced"}]}),e.jsx(B,{ariaLabel:"Filter by source",value:H,onChange:R(Ze),options:[{value:"all",label:"Any source"},{value:"discovered",label:"Discovered"},{value:"custom",label:"Custom (not discovered)"}]}),e.jsx(B,{ariaLabel:"Filter by capability",value:q,onChange:R(Qe),options:[{value:"all",label:"Any capability"},...De.map(l=>({value:l.value,label:l.label}))]}),e.jsx(B,{ariaLabel:"Minimum context window",value:de,onChange:R(et),options:Dt}),e.jsx(B,{ariaLabel:"Maximum input price",value:Q,onChange:R(tt),options:Ft}),e.jsx(B,{ariaLabel:"Compare prices at context",value:pe,onChange:rt,options:Bt}),e.jsx(B,{ariaLabel:"Filter by release date",value:ee,onChange:R(it),options:Kt})]}),e.jsx(ii,{providers:at}),X.length>0?e.jsx(It,{selectedCount:We,allMatching:W.allMatching,matchingTotal:J,canSelectAllMatching:pt,onSelectAllMatching:W.enableAllMatching,onClear:W.clear,children:e.jsx(A,{size:"sm",variant:"primary",onPress:()=>ue(!0),children:"Set pricing"})}):null,e.jsx(ti,{rows:fe,isLoading:xt,empty:ft,sortDescriptor:ot,onSortChange:ut,selectedKey:N,onSelect:O,onEditPricing:dt,comparisonContextTokens:st,selectedKeys:W.selectedKeys,onSelectionChange:W.onSelectionChange}),Ie?e.jsx(se,{children:e.jsxs(se.Content,{className:"p-0",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-[var(--otari-line)] px-4 py-2",children:[e.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Edit pricing"}),e.jsx(A,{size:"sm",variant:"ghost",onPress:()=>h(null),children:"Close"})]}),e.jsx(Xt,{row:Ie,onClose:()=>h(null)})]})}):null,e.jsx(Lt,{page:ke,pageSize:k,total:J,rowsOnPage:fe.length,onPageChange:j,onPageSizeChange:l=>{T(l),j(0)},pageSizeOptions:[15,25,50]})]}),ne?e.jsx("aside",{className:"lg:sticky lg:top-4",children:e.jsx(Ht,{row:ne,metadata:F[ne.key],metadataAvailable:nt,onMakeAlias:l=>t(`/aliases?target=${encodeURIComponent(l)}`),onClose:()=>O(null)})}):null]}),e.jsx(At,{isOpen:Ue,onOpenChange:ue,targetCount:We,isPending:Ge,error:Je,onSubmit:mt,title:"Set pricing",description:l=>`Apply these per-1M rates to ${l.toLocaleString()} selected ${l===1?"model":"models"}. This replaces each model's price; pricing tiers and the 1h cache rate are cleared. Edit a single model for tiers.`})]})}export{pi as ModelsPage}; diff --git a/src/gateway/static/dashboard/assets/OverviewPage-CX9hXHG1.js b/src/gateway/static/dashboard/assets/OverviewPage-CX9hXHG1.js new file mode 100644 index 00000000..3d241296 --- /dev/null +++ b/src/gateway/static/dashboard/assets/OverviewPage-CX9hXHG1.js @@ -0,0 +1 @@ +import{j as t}from"./tanstack-query-1t81HyiD.js";import{r as b,i as rt,N as G}from"./react-dgEcD0HR.js";import{K as at,d as j,L as st,l as nt,a as ot,u as it,b as lt,M as w,P as dt,R as ct,E as I,S as p,N as _,O as N,Q as R,T as D,U as ut}from"./index-CGnfXTEF.js";import{S as q}from"./charts-DIsd9m--.js";import{D as mt}from"./DataTable-Bmn_eYSV.js";import{d as H,B as vt}from"./heroui-BI50yK5B.js";import"./recharts-C4kRDmvS.js";function M(e){return e==="neutral"?void 0:e}const ht=.02,xt=.1;function B(e){if(!e||e.request_count===0)return{rate:null,status:"neutral"};const i=e.error_count/e.request_count,a=i>=xt?"alert":i>=ht?"warn":"ok";return{rate:i,status:a}}function ft(e){return!e||e.total===0?"neutral":e.healthy>=e.total?"ok":e.healthy===0?"alert":"warn"}const pt=.8;function gt(e){if(e.length===0)return{status:"neutral",label:"No budgets configured",overCount:0,nearCount:0,cappedCount:0};const i=e.filter(r=>r.max_budget!==null&&r.user_count>0);if(i.length===0)return{status:"neutral",label:"No capped budgets",overCount:0,nearCount:0,cappedCount:0};let a=0,s=0,n,c=-1;for(const r of i){const o=r.max_budget*r.user_count,l=o>0?r.total_spend/o:0;l>=1?a+=1:l>=pt&&(s+=1),l>c&&(c=l,n={name:r.name??r.budget_id,spent:r.total_spend,allocated:o,pct:l})}const d=a>0?"alert":s>0?"warn":"ok",g=a>0?`${a} over limit`:s>0?`${s} near limit`:"All within budget";return{status:d,label:g,overCount:a,nearCount:s,cappedCount:i.length,worst:n}}const K=864e5,T=30;function W(){const e=new Date;return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`}function bt(){const[e,i]=b.useState(W);return b.useEffect(()=>{const a=()=>{if(document.visibilityState==="visible"){const s=W();i(n=>n===s?n:s)}};return document.addEventListener("visibilitychange",a),window.addEventListener("focus",a),()=>{document.removeEventListener("visibilitychange",a),window.removeEventListener("focus",a)}},[]),b.useMemo(()=>{const a=Date.now(),s=new Date(a);return{today:new Date(s.getFullYear(),s.getMonth(),s.getDate()).toISOString(),periodStart:new Date(a-T*K).toISOString(),prevStart:new Date(a-2*T*K).toISOString()}},[e])}const yt={ok:"Healthy",warn:"Elevated",alert:"High"},St={ok:"On track",warn:"Near limit",alert:"Over budget"};function Ft(){const e=at();return e.isLoading?null:t.jsx(jt,{needsSetup:e.isSuccess&&e.data.providers.length===0})}function jt({needsSetup:e=!1}){var O,L,A,$,F,P,U;const i=bt(),a=b.useMemo(()=>({start_date:i.today}),[i]),s=b.useMemo(()=>({start_date:i.periodStart}),[i]),n=b.useMemo(()=>({start_date:i.prevStart,end_date:i.periodStart}),[i]),c=j(a,"hour"),d=j(s,"day"),g=j(n,"day"),r=st(),o=nt(),l=ot(),y=it(),h=lt({},0,5),E=(O=c.data)==null?void 0:O.totals,v=(L=d.data)==null?void 0:L.totals,x=(A=g.data)==null?void 0:A.totals,S=(($=d.data)==null?void 0:$.series)??[],C=S.length>1,u=B(v),k=B(x),Y=u.rate!==null&&k.rate!==null?w(u.rate,k.rate):null,m=gt(o.data??[]),Q=ft(r.data),V=(l.data??[]).filter(f=>f.is_active).length,z=(y.data??[]).filter(f=>!f.blocked).length,J=(((F=h.data)==null?void 0:F.length)??0)>0,X=e&&h.isSuccess&&!J,Z=c.error??d.error??r.error??o.error??l.error??y.error,tt=()=>{c.refetch(),d.refetch(),g.refetch(),r.refetch(),o.refetch(),l.refetch(),y.refetch(),h.refetch()},et=c.isFetching||d.isFetching||r.isFetching||o.isFetching||l.isFetching||y.isFetching||h.isFetching;return t.jsxs("div",{className:"flex flex-col gap-6",children:[t.jsx(dt,{title:"Overview",description:"At-a-glance spend, traffic, and health across the gateway.",action:t.jsx(ct,{onRefresh:tt,isFetching:et,updatedAt:d.dataUpdatedAt})}),X?t.jsx(wt,{}):null,t.jsx(I,{error:Z}),t.jsx(Rt,{providerHealth:Q,healthy:((P=r.data)==null?void 0:P.healthy)??0,total:((U=r.data)==null?void 0:U.total)??0,budget:m,errStatus:u.status,errRate:u.rate,ready:r.isSuccess&&o.isSuccess&&d.isSuccess,failed:r.isError||o.isError||d.isError}),t.jsxs("div",{className:"grid grid-cols-2 gap-4 sm:grid-cols-3 xl:grid-cols-4",children:[t.jsx(p,{label:"Spend today",value:E?_(E.cost):"—"}),t.jsx(p,{label:"Spend, last 30 days",value:v?_(v.cost):"—",hint:v?t.jsx(N,{fraction:w(v.cost,x==null?void 0:x.cost)}):null,chart:C?t.jsx(q,{values:S.map(f=>f.cost),ariaLabel:"Spend trend over the last 30 days"}):void 0}),t.jsx(p,{label:"Requests, last 30 days",value:v?R(v.request_count):"—",hint:v?t.jsx(N,{fraction:w(v.request_count,x==null?void 0:x.request_count)}):null,chart:C?t.jsx(q,{values:S.map(f=>f.requests),ariaLabel:"Request volume trend over the last 30 days"}):void 0}),t.jsx(p,{label:"Error rate, last 30 days",value:u.rate===null?"—":D(u.rate),status:M(u.status),statusLabel:u.status==="neutral"?void 0:yt[u.status],hint:u.rate!==null?t.jsx(N,{fraction:Y}):null}),t.jsx(p,{label:"Budget health",value:o.data&&m.worst?D(m.worst.pct):"—",status:o.data?M(m.status):void 0,statusLabel:o.data&&m.status!=="neutral"?St[m.status]:void 0,hint:o.data?m.worst?`${m.label} · worst: ${m.worst.name}`:m.label:void 0,to:"/budgets"}),t.jsx(p,{label:"Active keys",value:l.data?R(V):"—",to:"/keys"}),t.jsx(p,{label:"Active users",value:y.data?R(z):"—",to:"/users"})]}),t.jsx(Dt,{entries:h.data??[],loading:h.isLoading,error:h.error})]})}function wt(){const e=rt();return t.jsx(H,{children:t.jsxs(H.Content,{className:"flex flex-col gap-3 p-6",children:[t.jsxs("div",{children:[t.jsx("h2",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:"Get started with Otari"}),t.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:"Add a provider to begin serving models. Once it is configured, this page will show your gateway’s traffic, spend, and health."})]}),t.jsx("div",{children:t.jsx(vt,{variant:"primary",onPress:()=>e("/providers"),children:"Add your first provider"})})]})})}function Nt({text:e}){return t.jsx("div",{role:"status",className:"flex items-center gap-2 rounded-xl border border-[var(--otari-line)] bg-[var(--otari-bg)] px-4 py-3 text-sm text-[var(--otari-muted)]",children:e})}function Rt({providerHealth:e,healthy:i,total:a,budget:s,errStatus:n,errRate:c,ready:d,failed:g}){if(g)return t.jsx(Nt,{text:"Some status data could not be loaded."});if(!d)return null;const r=[];if((e==="warn"||e==="alert")&&a>0){const o=a-i;r.push({text:`${o} provider${o===1?"":"s"} unreachable`,to:"/providers"})}return s.overCount>0?r.push({text:`${s.overCount} budget${s.overCount===1?"":"s"} over limit`,to:"/budgets"}):s.nearCount>0&&r.push({text:`${s.nearCount} budget${s.nearCount===1?"":"s"} near limit`,to:"/budgets"}),n==="alert"&&c!==null&&r.push({text:`error rate ${D(c)}`,to:"/activity?status=error"}),r.length===0?null:t.jsxs("div",{role:"alert",className:"flex flex-col gap-2 rounded-xl border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-900 sm:flex-row sm:flex-wrap sm:items-center",children:[t.jsx("span",{className:"font-medium",children:"Needs attention:"}),r.map((o,l)=>t.jsxs("span",{className:"flex items-center gap-2",children:[l>0?t.jsx("span",{"aria-hidden":!0,className:"text-amber-400",children:"·"}):null,t.jsx(G,{to:o.to,className:"underline underline-offset-2 hover:text-amber-950",children:o.text})]},o.to+o.text))]})}function _t(e){return e==="error"?"error":"ok"}function Dt({entries:e,loading:i,error:a}){const s=[{id:"time",header:"Time",cell:n=>t.jsx("span",{className:"text-[var(--otari-muted)]",title:new Date(n.timestamp).toLocaleString(),children:ut(n.timestamp)})},{id:"model",header:"Model",isRowHeader:!0,cell:n=>t.jsx("span",{className:"text-[var(--otari-ink)]",children:n.model})},{id:"cost",header:"Cost",align:"end",cell:n=>n.cost===null?"—":_(n.cost)},{id:"status",header:"Status",cell:n=>t.jsx("span",{className:`inline-flex items-center rounded-full border px-2 py-0.5 text-xs font-medium ${n.status==="error"?"border-red-200 bg-red-50 text-red-700":"border-[var(--otari-line)] bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]"}`,children:_t(n.status)})}];return t.jsxs("div",{className:"flex flex-col gap-3",children:[t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Recent activity"}),t.jsx(G,{to:"/activity",className:"text-sm text-[var(--otari-brand-dark)] hover:underline",children:"View all →"})]}),t.jsx(I,{error:a}),t.jsx(mt,{ariaLabel:"Recent activity",columns:s,rows:e,getRowKey:n=>n.id,isLoading:i,emptyContent:"No requests yet. Once the gateway serves traffic, it appears here."})]})}export{Ft as OverviewIndex,jt as OverviewPage,W as localDayKey}; diff --git a/src/gateway/static/dashboard/assets/OverviewPage-Deh5RtuT.js b/src/gateway/static/dashboard/assets/OverviewPage-Deh5RtuT.js deleted file mode 100644 index 1e668ff6..00000000 --- a/src/gateway/static/dashboard/assets/OverviewPage-Deh5RtuT.js +++ /dev/null @@ -1 +0,0 @@ -import{j as t}from"./tanstack-query-1t81HyiD.js";import{r as h,i as tt,N as G}from"./react-dgEcD0HR.js";import{K as et,d as j,L as rt,l as at,a as st,u as nt,b as ot,M as w,P as it,E as I,S as p,N as _,O as N,Q as R,R as D,T as lt}from"./index-CI2beHfq.js";import{S as M}from"./charts-CuOShutR.js";import{D as dt}from"./DataTable-CrQq0sYf.js";import{d as U,B as ut}from"./heroui-DZj66Arc.js";import"./recharts-D7kuKp97.js";function B(e){return e==="neutral"?void 0:e}const ct=.02,mt=.1;function K(e){if(!e||e.request_count===0)return{rate:null,status:"neutral"};const o=e.error_count/e.request_count,r=o>=mt?"alert":o>=ct?"warn":"ok";return{rate:o,status:r}}function xt(e){return!e||e.total===0?"neutral":e.healthy>=e.total?"ok":e.healthy===0?"alert":"warn"}const vt=.8;function ft(e){if(e.length===0)return{status:"neutral",label:"No budgets configured",overCount:0,nearCount:0,cappedCount:0};const o=e.filter(s=>s.max_budget!==null&&s.user_count>0);if(o.length===0)return{status:"neutral",label:"No capped budgets",overCount:0,nearCount:0,cappedCount:0};let r=0,a=0,n,x=-1;for(const s of o){const i=s.max_budget*s.user_count,l=i>0?s.total_spend/i:0;l>=1?r+=1:l>=vt&&(a+=1),l>x&&(x=l,n={name:s.name??s.budget_id,spent:s.total_spend,allocated:i,pct:l})}const c=r>0?"alert":a>0?"warn":"ok",g=r>0?`${r} over limit`:a>0?`${a} near limit`:"All within budget";return{status:c,label:g,overCount:r,nearCount:a,cappedCount:o.length,worst:n}}const F=864e5,T=30;function W(){const e=new Date;return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`}function pt(){const[e,o]=h.useState(W);return h.useEffect(()=>{const r=()=>{if(document.visibilityState==="visible"){const a=W();o(n=>n===a?n:a)}};return document.addEventListener("visibilitychange",r),window.addEventListener("focus",r),()=>{document.removeEventListener("visibilitychange",r),window.removeEventListener("focus",r)}},[]),h.useMemo(()=>{const r=Date.now(),a=new Date(r);return{today:new Date(a.getFullYear(),a.getMonth(),a.getDate()).toISOString(),periodStart:new Date(r-T*F).toISOString(),prevStart:new Date(r-2*T*F).toISOString()}},[e])}const ht={ok:"Healthy",warn:"Elevated",alert:"High"},gt={ok:"On track",warn:"Near limit",alert:"Over budget"};function Lt(){const e=et();return e.isLoading?null:t.jsx(bt,{needsSetup:e.isSuccess&&e.data.providers.length===0})}function bt({needsSetup:e=!1}){var O,L,$,A,P,q,H;const o=pt(),r=h.useMemo(()=>({start_date:o.today}),[o]),a=h.useMemo(()=>({start_date:o.periodStart}),[o]),n=h.useMemo(()=>({start_date:o.prevStart,end_date:o.periodStart}),[o]),x=j(r,"hour"),c=j(a,"day"),g=j(n,"day"),s=rt(),i=at(),l=st(),y=nt(),b=ot({},0,5),E=(O=x.data)==null?void 0:O.totals,m=(L=c.data)==null?void 0:L.totals,v=($=g.data)==null?void 0:$.totals,S=((A=c.data)==null?void 0:A.series)??[],C=S.length>1,d=K(m),k=K(v),Y=d.rate!==null&&k.rate!==null?w(d.rate,k.rate):null,u=ft(i.data??[]),Q=xt(s.data),V=(l.data??[]).filter(f=>f.is_active).length,z=(y.data??[]).filter(f=>!f.blocked).length,J=(((P=b.data)==null?void 0:P.length)??0)>0,X=e&&b.isSuccess&&!J,Z=x.error??c.error??s.error??i.error??l.error??y.error;return t.jsxs("div",{className:"flex flex-col gap-6",children:[t.jsx(it,{title:"Overview",description:"At-a-glance spend, traffic, and health across the gateway."}),X?t.jsx(yt,{}):null,t.jsx(I,{error:Z}),t.jsx(jt,{providerHealth:Q,healthy:((q=s.data)==null?void 0:q.healthy)??0,total:((H=s.data)==null?void 0:H.total)??0,budget:u,errStatus:d.status,errRate:d.rate,ready:s.isSuccess&&i.isSuccess&&c.isSuccess,failed:s.isError||i.isError||c.isError}),t.jsxs("div",{className:"grid grid-cols-2 gap-4 sm:grid-cols-3 xl:grid-cols-4",children:[t.jsx(p,{label:"Spend today",value:E?_(E.cost):"—"}),t.jsx(p,{label:"Spend, last 30 days",value:m?_(m.cost):"—",hint:m?t.jsx(N,{fraction:w(m.cost,v==null?void 0:v.cost)}):null,chart:C?t.jsx(M,{values:S.map(f=>f.cost),ariaLabel:"Spend trend over the last 30 days"}):void 0}),t.jsx(p,{label:"Requests, last 30 days",value:m?R(m.request_count):"—",hint:m?t.jsx(N,{fraction:w(m.request_count,v==null?void 0:v.request_count)}):null,chart:C?t.jsx(M,{values:S.map(f=>f.requests),ariaLabel:"Request volume trend over the last 30 days"}):void 0}),t.jsx(p,{label:"Error rate, last 30 days",value:d.rate===null?"—":D(d.rate),status:B(d.status),statusLabel:d.status==="neutral"?void 0:ht[d.status],hint:d.rate!==null?t.jsx(N,{fraction:Y}):null}),t.jsx(p,{label:"Budget health",value:i.data&&u.worst?D(u.worst.pct):"—",status:i.data?B(u.status):void 0,statusLabel:i.data&&u.status!=="neutral"?gt[u.status]:void 0,hint:i.data?u.worst?`${u.label} · worst: ${u.worst.name}`:u.label:void 0,to:"/budgets"}),t.jsx(p,{label:"Active keys",value:l.data?R(V):"—",to:"/keys"}),t.jsx(p,{label:"Active users",value:y.data?R(z):"—",to:"/users"})]}),t.jsx(Nt,{entries:b.data??[],loading:b.isLoading,error:b.error})]})}function yt(){const e=tt();return t.jsx(U,{children:t.jsxs(U.Content,{className:"flex flex-col gap-3 p-6",children:[t.jsxs("div",{children:[t.jsx("h2",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:"Get started with Otari"}),t.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:"Add a provider to begin serving models. Once it is configured, this page will show your gateway’s traffic, spend, and health."})]}),t.jsx("div",{children:t.jsx(ut,{variant:"primary",onPress:()=>e("/providers"),children:"Add your first provider"})})]})})}function St({text:e}){return t.jsx("div",{role:"status",className:"flex items-center gap-2 rounded-xl border border-[var(--otari-line)] bg-[var(--otari-bg)] px-4 py-3 text-sm text-[var(--otari-muted)]",children:e})}function jt({providerHealth:e,healthy:o,total:r,budget:a,errStatus:n,errRate:x,ready:c,failed:g}){if(g)return t.jsx(St,{text:"Some status data could not be loaded."});if(!c)return null;const s=[];if((e==="warn"||e==="alert")&&r>0){const i=r-o;s.push({text:`${i} provider${i===1?"":"s"} unreachable`,to:"/providers"})}return a.overCount>0?s.push({text:`${a.overCount} budget${a.overCount===1?"":"s"} over limit`,to:"/budgets"}):a.nearCount>0&&s.push({text:`${a.nearCount} budget${a.nearCount===1?"":"s"} near limit`,to:"/budgets"}),n==="alert"&&x!==null&&s.push({text:`error rate ${D(x)}`,to:"/activity?status=error"}),s.length===0?null:t.jsxs("div",{role:"alert",className:"flex flex-col gap-2 rounded-xl border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-900 sm:flex-row sm:flex-wrap sm:items-center",children:[t.jsx("span",{className:"font-medium",children:"Needs attention:"}),s.map((i,l)=>t.jsxs("span",{className:"flex items-center gap-2",children:[l>0?t.jsx("span",{"aria-hidden":!0,className:"text-amber-400",children:"·"}):null,t.jsx(G,{to:i.to,className:"underline underline-offset-2 hover:text-amber-950",children:i.text})]},i.to+i.text))]})}function wt(e){return e==="error"?"error":"ok"}function Nt({entries:e,loading:o,error:r}){const a=[{id:"time",header:"Time",cell:n=>t.jsx("span",{className:"text-[var(--otari-muted)]",title:new Date(n.timestamp).toLocaleString(),children:lt(n.timestamp)})},{id:"model",header:"Model",isRowHeader:!0,cell:n=>t.jsx("span",{className:"text-[var(--otari-ink)]",children:n.model})},{id:"cost",header:"Cost",align:"end",cell:n=>n.cost===null?"—":_(n.cost)},{id:"status",header:"Status",cell:n=>t.jsx("span",{className:`inline-flex items-center rounded-full border px-2 py-0.5 text-xs font-medium ${n.status==="error"?"border-red-200 bg-red-50 text-red-700":"border-[var(--otari-line)] bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]"}`,children:wt(n.status)})}];return t.jsxs("div",{className:"flex flex-col gap-3",children:[t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Recent activity"}),t.jsx(G,{to:"/activity",className:"text-sm text-[var(--otari-brand-dark)] hover:underline",children:"View all →"})]}),t.jsx(I,{error:r}),t.jsx(dt,{ariaLabel:"Recent activity",columns:a,rows:e,getRowKey:n=>n.id,isLoading:o,emptyContent:"No requests yet. Once the gateway serves traffic, it appears here."})]})}export{Lt as OverviewIndex,bt as OverviewPage,W as localDayKey}; diff --git a/src/gateway/static/dashboard/assets/ProvidersPage-BRR1ZEsl.js b/src/gateway/static/dashboard/assets/ProvidersPage-BRR1ZEsl.js deleted file mode 100644 index 95f394a1..00000000 --- a/src/gateway/static/dashboard/assets/ProvidersPage-BRR1ZEsl.js +++ /dev/null @@ -1 +0,0 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as x,L as M}from"./react-dgEcD0HR.js";import{K as Y,U as V,H as W,L as G,V as X,W as Z,X as J,P as Q,E as I,I as ee,Y as te,Z as se,T as $,C as ae,_ as O,$ as ne,D as q,a0 as re,a1 as ie}from"./index-CI2beHfq.js";import{F as S}from"./Field-DEJ6Wjg9.js";import{D as oe}from"./DataTable-CrQq0sYf.js";import{B as f,d as _,f as de,T as le,L as F,I as H,D as ce,S as me,C as T,a as ue,b as xe}from"./heroui-DZj66Arc.js";function R({value:s,onChange:a,label:t,placeholder:r,description:i}){return e.jsxs(le,{value:s,onChange:a,className:"flex max-w-md flex-col gap-1",children:[e.jsx(F,{className:"text-sm font-medium text-[var(--otari-ink)]",children:t}),e.jsx(H,{type:"password",placeholder:r??"sk-…",autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",spellCheck:!1,"data-1p-ignore":!0,"data-lpignore":"true"}),i?e.jsx(ce,{className:"text-xs text-[var(--otari-muted)]",children:i}):null]})}function U({label:s,value:a,onChange:t,description:r,placeholder:i,extra:l=[],includeCatalog:m=!0}){var k;const g=re(),u=x.useMemo(()=>m?[...l,...(g.data??[]).map(o=>({id:o.id,name:o.name}))]:l,[g.data,l,m]),[p,c]=x.useState(()=>{var o;return((o=u.find(y=>y.id===a))==null?void 0:o.name)??""}),j=((k=u.find(o=>o.id===a))==null?void 0:k.name)??"",h=p.trim()===j.trim()?"":p.trim().toLowerCase(),d=u.filter(o=>!h||o.name.toLowerCase().includes(h)||o.id.toLowerCase().includes(h)).slice(0,50);return e.jsxs(T.Root,{allowsEmptyCollection:!0,menuTrigger:"focus",inputValue:p,onInputChange:c,onSelectionChange:o=>{var y;o!=null?(t(String(o)),c(((y=u.find(N=>N.id===String(o)))==null?void 0:y.name)??"")):(t(""),c(""))},className:"flex max-w-md flex-col gap-1",children:[e.jsx(F,{className:"text-sm font-medium text-[var(--otari-ink)]",children:s}),e.jsxs(T.InputGroup,{children:[e.jsx(H,{placeholder:i??"Search providers…",autoComplete:"off","data-1p-ignore":!0,"data-lpignore":"true",onFocus:o=>o.currentTarget.select()}),e.jsx(T.Trigger,{})]}),e.jsx(T.Popover,{children:e.jsx(ue,{items:d,className:"max-h-72 overflow-auto",children:o=>e.jsx(xe,{id:o.id,textValue:o.name,children:o.name})})}),r?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:r}):null]})}function z({getPayload:s}){const a=ie(),t=s();return e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx(f,{variant:"outline",isDisabled:t===null||a.isPending,onPress:()=>{t&&a.mutate(t)},children:a.isPending?"Testing…":"Test connection"}),e.jsx("span",{role:"status","aria-live":"polite",children:a.isPending?null:a.error?e.jsx("span",{className:"text-xs text-red-700",children:q(a.error)}):a.data?a.data.ok?e.jsxs("span",{className:"text-xs font-medium text-green-700",children:["Connected. ",a.data.model_count," model",a.data.model_count===1?"":"s"," available."]}):e.jsx("span",{className:"block max-w-md break-words text-xs text-red-700",children:a.data.error??"Connection failed."}):null})]})}function pe({onClose:s}){var w;const a=O(),[t,r]=x.useState(""),[i,l]=x.useState(""),[m,g]=x.useState(!1),[u,p]=x.useState(""),[c,j]=x.useState(""),h=ne(t),d=((w=h.data)==null?void 0:w.id)===t?h.data:void 0;x.useEffect(()=>{d&&p(d.default_api_base??"")},[d]);const k=(d==null?void 0:d.env_key_present)??!1,o=((d==null?void 0:d.requires_api_key)??!0)&&!k,y=c.trim()!==""&&c.trim()!==t,N=/[:/]/.test(c),P=t!==""&&!N&&(!o||i.trim()!=="")&&!a.isPending,A=()=>{P&&a.mutate({instance:y?c.trim():t,provider_type:y?t:null,api_base:u.trim()||null,api_key:i.trim()||null},{onSuccess:s})};return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(I,{error:a.error}),e.jsx(U,{label:"Provider",value:t,onChange:C=>{r(C),j(""),p("")},description:"Its endpoint is built in."}),e.jsx(R,{value:i,onChange:l,label:d&&!o?"API key (optional)":"API key",description:d?o?`${d.name}'s endpoint is built in — just add your key.`:k?`${d.env_key} is set on the server, so a key is optional here. Paste one to override it.`:`${d.name} needs no API key.`:"Stored encrypted. Requires OTARI_SECRET_KEY on the server."}),e.jsx("button",{type:"button",className:"self-start text-xs font-medium text-[var(--otari-brand-dark)]",onClick:()=>g(C=>!C),children:m?"Hide advanced":"Advanced (API base, rename)"}),m?e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(S,{label:"API base",value:u,onChange:p,placeholder:(d==null?void 0:d.default_api_base)??"https://…/v1",description:"Only if you route through a proxy. Blank uses the built-in default."}),e.jsx(S,{label:"Name",value:c,onChange:j,placeholder:t||"instance name",description:N?e.jsx("span",{className:"text-red-700",children:"A name cannot contain “:” or “/”."}):"Rename to run two instances of the same provider."})]}):null,e.jsxs("div",{className:"flex flex-wrap items-start gap-2",children:[e.jsx(f,{variant:"primary",isDisabled:!P,onPress:A,children:a.isPending?"Adding…":"Add provider"}),e.jsx(f,{variant:"ghost",onPress:s,children:"Cancel"}),e.jsx(z,{getPayload:()=>t===""?null:{instance:y?c.trim():t,provider_type:y?t:null,api_base:u.trim()||null,api_key:i.trim()||null}})]})]})}function he({onClose:s}){const a=O(),[t,r]=x.useState(""),[i,l]=x.useState("openai-compatible"),[m,g]=x.useState(""),[u,p]=x.useState(""),c=/[:/]/.test(t),j=t.trim()!==""&&!c&&m.trim()!==""&&!a.isPending,h=()=>{j&&a.mutate({instance:t.trim(),provider_type:i||"openai-compatible",api_base:m.trim(),api_key:u.trim()||null},{onSuccess:s})};return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(I,{error:a.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(S,{label:"Name",value:t,onChange:r,placeholder:"my-local-llm",isRequired:!0,autoFocus:!0,description:c?e.jsx("span",{className:"text-red-700",children:"A name cannot contain “:” or “/”."}):"Call it whatever you want."}),e.jsx(U,{label:"Compatible with",value:i,onChange:l,includeCatalog:!1,description:"The API this endpoint speaks.",extra:[{id:"openai-compatible",name:"OpenAI"},{id:"anthropic-compatible",name:"Anthropic"}]})]}),e.jsx(S,{label:"API base",value:m,onChange:g,placeholder:"http://localhost:8000/v1",isRequired:!0,description:"The endpoint URL of your server."}),e.jsx(R,{value:u,onChange:p,label:"API key (optional)",description:"Many local backends need none. Stored encrypted."}),e.jsxs("div",{className:"flex flex-wrap items-start gap-2",children:[e.jsx(f,{variant:"primary",isDisabled:!j,onPress:h,children:a.isPending?"Adding…":"Add provider"}),e.jsx(f,{variant:"ghost",onPress:s,children:"Cancel"}),e.jsx(z,{getPayload:()=>t.trim()===""||m.trim()===""?null:{instance:t.trim(),provider_type:i||"openai-compatible",api_base:m.trim(),api_key:u.trim()||null}})]})]})}function ve({onClose:s}){const[a,t]=x.useState("known");return e.jsx(_,{children:e.jsxs(_.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsx("div",{className:"flex items-center justify-between",children:e.jsx("div",{className:"flex items-center gap-1 rounded-lg bg-[var(--otari-bg)] p-1",children:[["known","Known provider"],["custom","Custom endpoint"]].map(([r,i])=>e.jsx("button",{type:"button","aria-pressed":a===r,onClick:()=>t(r),className:a===r?"rounded-md bg-white px-3 py-1.5 text-sm font-medium text-[var(--otari-ink)] shadow-sm":"rounded-md px-3 py-1.5 text-sm text-[var(--otari-muted)] hover:text-[var(--otari-ink)]",children:i},r))})}),a==="known"?e.jsx(pe,{onClose:s}):e.jsx(he,{onClose:s})]})})}function ge({provider:s,onClose:a}){const t=te(),[r,i]=x.useState(s.provider_type??""),[l,m]=x.useState(s.api_base??""),[g,u]=x.useState(!1),[p,c]=x.useState(""),j=()=>{if(t.isPending)return;const h={provider_type:r.trim()||null,api_base:l.trim()||null,expected_updated_at:s.updated_at};g&&p.trim()&&(h.api_key=p.trim()),t.mutate({instance:s.instance,body:h},{onSuccess:a})};return e.jsx(_,{children:e.jsxs(_.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsxs("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:["Edit ",e.jsx("code",{children:s.instance})]}),e.jsx(I,{error:t.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(S,{label:"Provider type",value:r,onChange:i,placeholder:"openai"}),e.jsx(S,{label:"API base",value:l,onChange:m,placeholder:"https://api.openai.com/v1"})]}),e.jsx("div",{className:"flex flex-col gap-2",children:g?e.jsxs(e.Fragment,{children:[e.jsx(R,{value:p,onChange:c,label:"New API key",description:"Stored encrypted. The old key is replaced when you save."}),e.jsx("button",{type:"button",className:"self-start text-xs font-medium text-[var(--otari-brand-dark)]",onClick:()=>{u(!1),c("")},children:"Keep the current key"})]}):e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("span",{className:"text-sm text-[var(--otari-muted)]",children:["API key: ",e.jsx("code",{children:s.last4?`••••${s.last4}`:"none set"})]}),e.jsx(f,{size:"sm",variant:"outline",onPress:()=>u(!0),children:"Replace key"})]})}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(f,{variant:"primary",isDisabled:t.isPending,onPress:j,children:t.isPending?"Saving…":"Save changes"}),e.jsx(f,{variant:"ghost",onPress:a,children:"Cancel"})]})]})})}function fe(s,a){const t=new Map((a??[]).map(l=>[l.instance,l])),r=new Map((s??[]).map(l=>[l.instance,l]));return[...new Set([...t.keys(),...r.keys()])].sort().map(l=>{const m=t.get(l);return{instance:l,source:m?"stored":"config",stored:m,meta:r.get(l)}})}function je({state:s}){return s?s.status==="pending"?e.jsxs("span",{className:"inline-flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:[e.jsx(me,{size:"sm"})," Testing…"]}):s.ok?e.jsxs("span",{className:"text-xs font-medium text-green-700",children:["Connected. ",s.model_count," model",s.model_count===1?"":"s"," available."]}):e.jsx("span",{className:"block max-w-xs break-words text-xs text-red-700",children:s.error??"Connection failed."}):null}function ye({health:s}){if(!s)return e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"—"});const a=s.ok?"border-green-200 bg-green-50 text-green-700":"border-red-200 bg-red-50 text-red-700",t=s.checked_at?`Last checked ${$(s.checked_at)}`:"Not checked yet",r=s.ok?t:`${s.error??"Unreachable"} · ${t}`;return e.jsxs("span",{title:r,className:`inline-flex items-center gap-1.5 rounded-full border px-2.5 py-0.5 text-xs font-medium ${a}`,children:[e.jsx("span",{"aria-hidden":!0,className:`h-1.5 w-1.5 rounded-full ${s.ok?"bg-green-500":"bg-red-500"}`}),s.ok?"Reachable":"Unreachable"]})}function be({healthy:s,total:a,checkedAt:t}){const r=s===a,i=se();return e.jsxs("div",{className:"flex flex-wrap items-center gap-3 rounded-xl border border-[var(--otari-line)] bg-[var(--otari-surface)] px-4 py-2.5 text-sm",children:[e.jsx("span",{"aria-hidden":!0,className:`h-2 w-2 rounded-full ${r?"bg-green-500":"bg-red-500"}`}),e.jsxs("span",{className:"font-medium text-[var(--otari-ink)]",children:[s," of ",a," provider",a===1?"":"s"," reachable"]}),t?e.jsxs("span",{className:"text-[var(--otari-muted)]",children:["Last checked ",$(t)]}):null,e.jsx(f,{size:"sm",variant:"ghost",className:"ml-auto",isDisabled:i.isPending,onPress:()=>i.mutate(),children:i.isPending?"Re-checking…":"Re-check all"})]})}function E({n:s,title:a,children:t}){return e.jsxs("li",{className:"flex gap-3",children:[e.jsx("span",{className:"flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-[var(--otari-brand-tint)] text-xs font-semibold text-[var(--otari-brand-dark)]",children:s}),e.jsxs("div",{className:"text-sm",children:[e.jsx("div",{className:"font-medium text-[var(--otari-ink)]",children:a}),e.jsx("div",{className:"text-[var(--otari-muted)]",children:t})]})]})}function ke({onAddProvider:s,needsPricing:a,onEnablePricing:t,enabling:r,secretKeyConfigured:i}){return e.jsx(_,{children:e.jsxs(_.Content,{className:"flex flex-col gap-4 p-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:"Welcome to Otari"}),e.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:"You are signed in. Add a provider to start serving models: three quick steps."})]}),e.jsxs("ol",{className:"flex flex-col gap-3",children:[e.jsxs(E,{n:1,title:"Add a provider",children:["Enter a provider name (like ",e.jsx("code",{children:"openai"}),") and its API key. Keys are encrypted at rest."]}),e.jsxs(E,{n:2,title:"Test the connection",children:["Use ",e.jsx("strong",{children:"Test"})," on the provider row to confirm the key works and see how many models it serves."]}),e.jsxs(E,{n:3,title:"Send your first request",children:["Point your app at ",e.jsx("code",{children:"/v1"})," on this gateway with the API key printed in the server logs (",e.jsx("code",{children:"gw-…"}),"). See the"," ",e.jsx("a",{href:"/welcome",className:"font-medium text-[var(--otari-brand-dark)]",children:"quickstart"}),"."]})]}),a?e.jsxs("p",{className:"text-sm text-[var(--otari-muted)]",children:["Tip: ",e.jsx("code",{children:"require_pricing"})," is on, so requests are rejected until pricing is set."," ",e.jsx("button",{type:"button",className:"font-medium text-[var(--otari-brand-dark)] disabled:opacity-50",disabled:r,onClick:t,children:"Enable default pricing"})," ","to meter new models with public rates."]}):null,e.jsx("div",{children:e.jsx(f,{variant:"primary",isDisabled:!i,onPress:s,children:"Add your first provider"})})]})})}function we(){var K,B,D,L;const s=Y(),a=V(),t=W(),r=G(),i=X(),l=Z(),m=J(),[g,u]=x.useState(!1),[p,c]=x.useState(null),[j,h]=x.useState({}),d=fe((K=s.data)==null?void 0:K.providers,a.data),k=new Map((((B=r.data)==null?void 0:B.providers)??[]).map(n=>[n.instance,n])),o=s.isLoading||a.isLoading,y=((D=a.data)==null?void 0:D.find(n=>n.instance===p))??null,N=((L=t.data)==null?void 0:L.require_pricing)===!0&&t.data.default_pricing===!1,P=t.data?t.data.secret_key_configured!==!1:!t.isError,A=!o&&d.length===0&&!g,w=n=>{h(v=>({...v,[n]:{status:"pending"}})),l.mutate(n,{onSuccess:v=>h(b=>({...b,[n]:{status:"done",...v}})),onError:v=>h(b=>({...b,[n]:{status:"done",ok:!1,model_count:0,error:q(v)}}))})},C=[{id:"provider",header:"Provider",isRowHeader:!0,cell:n=>e.jsx(M,{to:`/models?provider=${encodeURIComponent(n.instance)}`,className:"font-medium text-[var(--otari-ink)] hover:text-[var(--otari-brand-dark)] hover:underline",children:n.instance})},{id:"type",header:"Type",cell:n=>{var v,b;return e.jsx("span",{className:"text-[var(--otari-muted)]",children:((v=n.meta)==null?void 0:v.provider_type)??((b=n.stored)==null?void 0:b.provider_type)??n.instance})}},{id:"source",header:"Source",cell:n=>e.jsx(de,{size:"sm",color:n.source==="stored"?"accent":"default",children:n.source==="stored"?"stored":"config"})},{id:"api_key",header:"API key",cell:n=>{var v,b;return e.jsx("span",{className:"text-[var(--otari-muted)]",children:n.source==="stored"?n.stored&&!n.stored.decryptable?e.jsx("span",{className:"text-amber-700",title:"This key can't be decrypted with the current OTARI_SECRET_KEY. Replace the key, or restore the original OTARI_SECRET_KEY.",children:"⚠ key unreadable"}):e.jsx("code",{children:(v=n.stored)!=null&&v.last4?`••••${n.stored.last4}`:"none set"}):(b=n.meta)!=null&&b.env_key?e.jsxs("span",{children:["via ",e.jsx("code",{children:n.meta.env_key})]}):"config.yml"})}},{id:"status",header:"Status",cell:n=>e.jsx(ye,{health:k.get(n.instance)})},{id:"actions",header:"Actions",align:"end",cell:n=>{var v,b;return n.source==="stored"?e.jsxs("div",{className:"flex flex-col items-end gap-1.5",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(f,{size:"sm",variant:"outline",isDisabled:((v=j[n.instance])==null?void 0:v.status)==="pending"||((b=n.stored)==null?void 0:b.decryptable)===!1,onPress:()=>w(n.instance),children:"Test"}),e.jsx(f,{size:"sm",variant:"ghost",onPress:()=>{u(!1),c(n.instance)},children:"Edit"}),e.jsx(ae,{confirmLabel:"Delete",isPending:i.isPending,onConfirm:()=>i.mutate(n.instance),children:"Delete"})]}),e.jsx(je,{state:j[n.instance]})]}):e.jsx("span",{className:"block text-right text-xs text-[var(--otari-muted)]",children:"managed in config.yml"})}}];return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(Q,{title:"Providers",description:"Add provider API keys here to serve models without editing config.yml. Keys are encrypted at rest.",action:g||A?null:e.jsx(f,{variant:"primary",isDisabled:!P,onPress:()=>{c(null),u(!0)},children:"Add provider"})}),e.jsx(I,{error:s.error??a.error??t.error??r.error??m.error??i.error}),P?null:e.jsxs(ee,{tone:"warning",children:[e.jsx("code",{children:"OTARI_SECRET_KEY"})," is not set, so provider keys can't be encrypted at rest and adding providers from the dashboard is disabled. Set it on the server and restart to add providers here. Providers defined in"," ",e.jsx("code",{children:"config.yml"})," keep working without it."]}),A?e.jsx(ke,{onAddProvider:()=>{c(null),u(!0)},needsPricing:N,onEnablePricing:()=>m.mutate({default_pricing:!0}),enabling:m.isPending,secretKeyConfigured:P}):null,g&&P?e.jsx(ve,{onClose:()=>u(!1)}):null,y?e.jsx(ge,{provider:y,onClose:()=>c(null)}):null,!o&&d.length>0&&r.data&&r.data.total>0?e.jsx(be,{healthy:r.data.healthy,total:r.data.total,checkedAt:r.data.checked_at}):null,e.jsx(oe,{ariaLabel:"Providers",columns:C,rows:d,getRowKey:n=>n.instance,isLoading:o,emptyContent:"No providers yet. Add your first provider to start serving models."})]})}export{we as ProvidersPage}; diff --git a/src/gateway/static/dashboard/assets/ProvidersPage-DQdazSS9.js b/src/gateway/static/dashboard/assets/ProvidersPage-DQdazSS9.js new file mode 100644 index 00000000..baf27910 --- /dev/null +++ b/src/gateway/static/dashboard/assets/ProvidersPage-DQdazSS9.js @@ -0,0 +1 @@ +import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as x,L as M}from"./react-dgEcD0HR.js";import{K as Y,V,H as W,L as G,W as X,X as Z,Y as J,P as Q,E as I,I as ee,Z as te,_ as se,U as $,C as ae,$ as O,a0 as ne,D as q,a1 as re,a2 as ie}from"./index-CGnfXTEF.js";import{F as S}from"./Field-Dwp6u3t8.js";import{D as oe}from"./DataTable-Bmn_eYSV.js";import{B as f,d as _,f as de,T as le,L as F,I as H,D as ce,S as me,C as T,a as ue,b as xe}from"./heroui-BI50yK5B.js";function R({value:s,onChange:a,label:t,placeholder:r,description:i}){return e.jsxs(le,{value:s,onChange:a,className:"flex max-w-md flex-col gap-1",children:[e.jsx(F,{className:"text-sm font-medium text-[var(--otari-ink)]",children:t}),e.jsx(H,{type:"password",placeholder:r??"sk-…",autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",spellCheck:!1,"data-1p-ignore":!0,"data-lpignore":"true"}),i?e.jsx(ce,{className:"text-xs text-[var(--otari-muted)]",children:i}):null]})}function U({label:s,value:a,onChange:t,description:r,placeholder:i,extra:l=[],includeCatalog:m=!0}){var k;const g=re(),u=x.useMemo(()=>m?[...l,...(g.data??[]).map(o=>({id:o.id,name:o.name}))]:l,[g.data,l,m]),[p,c]=x.useState(()=>{var o;return((o=u.find(y=>y.id===a))==null?void 0:o.name)??""}),j=((k=u.find(o=>o.id===a))==null?void 0:k.name)??"",h=p.trim()===j.trim()?"":p.trim().toLowerCase(),d=u.filter(o=>!h||o.name.toLowerCase().includes(h)||o.id.toLowerCase().includes(h)).slice(0,50);return e.jsxs(T.Root,{allowsEmptyCollection:!0,menuTrigger:"focus",inputValue:p,onInputChange:c,onSelectionChange:o=>{var y;o!=null?(t(String(o)),c(((y=u.find(N=>N.id===String(o)))==null?void 0:y.name)??"")):(t(""),c(""))},className:"flex max-w-md flex-col gap-1",children:[e.jsx(F,{className:"text-sm font-medium text-[var(--otari-ink)]",children:s}),e.jsxs(T.InputGroup,{children:[e.jsx(H,{placeholder:i??"Search providers…",autoComplete:"off","data-1p-ignore":!0,"data-lpignore":"true",onFocus:o=>o.currentTarget.select()}),e.jsx(T.Trigger,{})]}),e.jsx(T.Popover,{children:e.jsx(ue,{items:d,className:"max-h-72 overflow-auto",children:o=>e.jsx(xe,{id:o.id,textValue:o.name,children:o.name})})}),r?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:r}):null]})}function z({getPayload:s}){const a=ie(),t=s();return e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx(f,{variant:"outline",isDisabled:t===null||a.isPending,onPress:()=>{t&&a.mutate(t)},children:a.isPending?"Testing…":"Test connection"}),e.jsx("span",{role:"status","aria-live":"polite",children:a.isPending?null:a.error?e.jsx("span",{className:"text-xs text-red-700",children:q(a.error)}):a.data?a.data.ok?e.jsxs("span",{className:"text-xs font-medium text-green-700",children:["Connected. ",a.data.model_count," model",a.data.model_count===1?"":"s"," available."]}):e.jsx("span",{className:"block max-w-md break-words text-xs text-red-700",children:a.data.error??"Connection failed."}):null})]})}function pe({onClose:s}){var w;const a=O(),[t,r]=x.useState(""),[i,l]=x.useState(""),[m,g]=x.useState(!1),[u,p]=x.useState(""),[c,j]=x.useState(""),h=ne(t),d=((w=h.data)==null?void 0:w.id)===t?h.data:void 0;x.useEffect(()=>{d&&p(d.default_api_base??"")},[d]);const k=(d==null?void 0:d.env_key_present)??!1,o=((d==null?void 0:d.requires_api_key)??!0)&&!k,y=c.trim()!==""&&c.trim()!==t,N=/[:/]/.test(c),P=t!==""&&!N&&(!o||i.trim()!=="")&&!a.isPending,A=()=>{P&&a.mutate({instance:y?c.trim():t,provider_type:y?t:null,api_base:u.trim()||null,api_key:i.trim()||null},{onSuccess:s})};return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(I,{error:a.error}),e.jsx(U,{label:"Provider",value:t,onChange:C=>{r(C),j(""),p("")},description:"Its endpoint is built in."}),e.jsx(R,{value:i,onChange:l,label:d&&!o?"API key (optional)":"API key",description:d?o?`${d.name}'s endpoint is built in — just add your key.`:k?`${d.env_key} is set on the server, so a key is optional here. Paste one to override it.`:`${d.name} needs no API key.`:"Stored encrypted. Requires OTARI_SECRET_KEY on the server."}),e.jsx("button",{type:"button",className:"self-start text-xs font-medium text-[var(--otari-brand-dark)]",onClick:()=>g(C=>!C),children:m?"Hide advanced":"Advanced (API base, rename)"}),m?e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(S,{label:"API base",value:u,onChange:p,placeholder:(d==null?void 0:d.default_api_base)??"https://…/v1",description:"Only if you route through a proxy. Blank uses the built-in default."}),e.jsx(S,{label:"Name",value:c,onChange:j,placeholder:t||"instance name",description:N?e.jsx("span",{className:"text-red-700",children:"A name cannot contain “:” or “/”."}):"Rename to run two instances of the same provider."})]}):null,e.jsxs("div",{className:"flex flex-wrap items-start gap-2",children:[e.jsx(f,{variant:"primary",isDisabled:!P,onPress:A,children:a.isPending?"Adding…":"Add provider"}),e.jsx(f,{variant:"ghost",onPress:s,children:"Cancel"}),e.jsx(z,{getPayload:()=>t===""?null:{instance:y?c.trim():t,provider_type:y?t:null,api_base:u.trim()||null,api_key:i.trim()||null}})]})]})}function he({onClose:s}){const a=O(),[t,r]=x.useState(""),[i,l]=x.useState("openai-compatible"),[m,g]=x.useState(""),[u,p]=x.useState(""),c=/[:/]/.test(t),j=t.trim()!==""&&!c&&m.trim()!==""&&!a.isPending,h=()=>{j&&a.mutate({instance:t.trim(),provider_type:i||"openai-compatible",api_base:m.trim(),api_key:u.trim()||null},{onSuccess:s})};return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(I,{error:a.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(S,{label:"Name",value:t,onChange:r,placeholder:"my-local-llm",isRequired:!0,autoFocus:!0,description:c?e.jsx("span",{className:"text-red-700",children:"A name cannot contain “:” or “/”."}):"Call it whatever you want."}),e.jsx(U,{label:"Compatible with",value:i,onChange:l,includeCatalog:!1,description:"The API this endpoint speaks.",extra:[{id:"openai-compatible",name:"OpenAI"},{id:"anthropic-compatible",name:"Anthropic"}]})]}),e.jsx(S,{label:"API base",value:m,onChange:g,placeholder:"http://localhost:8000/v1",isRequired:!0,description:"The endpoint URL of your server."}),e.jsx(R,{value:u,onChange:p,label:"API key (optional)",description:"Many local backends need none. Stored encrypted."}),e.jsxs("div",{className:"flex flex-wrap items-start gap-2",children:[e.jsx(f,{variant:"primary",isDisabled:!j,onPress:h,children:a.isPending?"Adding…":"Add provider"}),e.jsx(f,{variant:"ghost",onPress:s,children:"Cancel"}),e.jsx(z,{getPayload:()=>t.trim()===""||m.trim()===""?null:{instance:t.trim(),provider_type:i||"openai-compatible",api_base:m.trim(),api_key:u.trim()||null}})]})]})}function ve({onClose:s}){const[a,t]=x.useState("known");return e.jsx(_,{children:e.jsxs(_.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsx("div",{className:"flex items-center justify-between",children:e.jsx("div",{className:"flex items-center gap-1 rounded-lg bg-[var(--otari-bg)] p-1",children:[["known","Known provider"],["custom","Custom endpoint"]].map(([r,i])=>e.jsx("button",{type:"button","aria-pressed":a===r,onClick:()=>t(r),className:a===r?"rounded-md bg-white px-3 py-1.5 text-sm font-medium text-[var(--otari-ink)] shadow-sm":"rounded-md px-3 py-1.5 text-sm text-[var(--otari-muted)] hover:text-[var(--otari-ink)]",children:i},r))})}),a==="known"?e.jsx(pe,{onClose:s}):e.jsx(he,{onClose:s})]})})}function ge({provider:s,onClose:a}){const t=te(),[r,i]=x.useState(s.provider_type??""),[l,m]=x.useState(s.api_base??""),[g,u]=x.useState(!1),[p,c]=x.useState(""),j=()=>{if(t.isPending)return;const h={provider_type:r.trim()||null,api_base:l.trim()||null,expected_updated_at:s.updated_at};g&&p.trim()&&(h.api_key=p.trim()),t.mutate({instance:s.instance,body:h},{onSuccess:a})};return e.jsx(_,{children:e.jsxs(_.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsxs("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:["Edit ",e.jsx("code",{children:s.instance})]}),e.jsx(I,{error:t.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(S,{label:"Provider type",value:r,onChange:i,placeholder:"openai"}),e.jsx(S,{label:"API base",value:l,onChange:m,placeholder:"https://api.openai.com/v1"})]}),e.jsx("div",{className:"flex flex-col gap-2",children:g?e.jsxs(e.Fragment,{children:[e.jsx(R,{value:p,onChange:c,label:"New API key",description:"Stored encrypted. The old key is replaced when you save."}),e.jsx("button",{type:"button",className:"self-start text-xs font-medium text-[var(--otari-brand-dark)]",onClick:()=>{u(!1),c("")},children:"Keep the current key"})]}):e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("span",{className:"text-sm text-[var(--otari-muted)]",children:["API key: ",e.jsx("code",{children:s.last4?`••••${s.last4}`:"none set"})]}),e.jsx(f,{size:"sm",variant:"outline",onPress:()=>u(!0),children:"Replace key"})]})}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(f,{variant:"primary",isDisabled:t.isPending,onPress:j,children:t.isPending?"Saving…":"Save changes"}),e.jsx(f,{variant:"ghost",onPress:a,children:"Cancel"})]})]})})}function fe(s,a){const t=new Map((a??[]).map(l=>[l.instance,l])),r=new Map((s??[]).map(l=>[l.instance,l]));return[...new Set([...t.keys(),...r.keys()])].sort().map(l=>{const m=t.get(l);return{instance:l,source:m?"stored":"config",stored:m,meta:r.get(l)}})}function je({state:s}){return s?s.status==="pending"?e.jsxs("span",{className:"inline-flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:[e.jsx(me,{size:"sm"})," Testing…"]}):s.ok?e.jsxs("span",{className:"text-xs font-medium text-green-700",children:["Connected. ",s.model_count," model",s.model_count===1?"":"s"," available."]}):e.jsx("span",{className:"block max-w-xs break-words text-xs text-red-700",children:s.error??"Connection failed."}):null}function ye({health:s}){if(!s)return e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"—"});const a=s.ok?"border-green-200 bg-green-50 text-green-700":"border-red-200 bg-red-50 text-red-700",t=s.checked_at?`Last checked ${$(s.checked_at)}`:"Not checked yet",r=s.ok?t:`${s.error??"Unreachable"} · ${t}`;return e.jsxs("span",{title:r,className:`inline-flex items-center gap-1.5 rounded-full border px-2.5 py-0.5 text-xs font-medium ${a}`,children:[e.jsx("span",{"aria-hidden":!0,className:`h-1.5 w-1.5 rounded-full ${s.ok?"bg-green-500":"bg-red-500"}`}),s.ok?"Reachable":"Unreachable"]})}function be({healthy:s,total:a,checkedAt:t}){const r=s===a,i=se();return e.jsxs("div",{className:"flex flex-wrap items-center gap-3 rounded-xl border border-[var(--otari-line)] bg-[var(--otari-surface)] px-4 py-2.5 text-sm",children:[e.jsx("span",{"aria-hidden":!0,className:`h-2 w-2 rounded-full ${r?"bg-green-500":"bg-red-500"}`}),e.jsxs("span",{className:"font-medium text-[var(--otari-ink)]",children:[s," of ",a," provider",a===1?"":"s"," reachable"]}),t?e.jsxs("span",{className:"text-[var(--otari-muted)]",children:["Last checked ",$(t)]}):null,e.jsx(f,{size:"sm",variant:"ghost",className:"ml-auto",isDisabled:i.isPending,onPress:()=>i.mutate(),children:i.isPending?"Re-checking…":"Re-check all"})]})}function E({n:s,title:a,children:t}){return e.jsxs("li",{className:"flex gap-3",children:[e.jsx("span",{className:"flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-[var(--otari-brand-tint)] text-xs font-semibold text-[var(--otari-brand-dark)]",children:s}),e.jsxs("div",{className:"text-sm",children:[e.jsx("div",{className:"font-medium text-[var(--otari-ink)]",children:a}),e.jsx("div",{className:"text-[var(--otari-muted)]",children:t})]})]})}function ke({onAddProvider:s,needsPricing:a,onEnablePricing:t,enabling:r,secretKeyConfigured:i}){return e.jsx(_,{children:e.jsxs(_.Content,{className:"flex flex-col gap-4 p-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:"Welcome to Otari"}),e.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:"You are signed in. Add a provider to start serving models: three quick steps."})]}),e.jsxs("ol",{className:"flex flex-col gap-3",children:[e.jsxs(E,{n:1,title:"Add a provider",children:["Enter a provider name (like ",e.jsx("code",{children:"openai"}),") and its API key. Keys are encrypted at rest."]}),e.jsxs(E,{n:2,title:"Test the connection",children:["Use ",e.jsx("strong",{children:"Test"})," on the provider row to confirm the key works and see how many models it serves."]}),e.jsxs(E,{n:3,title:"Send your first request",children:["Point your app at ",e.jsx("code",{children:"/v1"})," on this gateway with the API key printed in the server logs (",e.jsx("code",{children:"gw-…"}),"). See the"," ",e.jsx("a",{href:"/welcome",className:"font-medium text-[var(--otari-brand-dark)]",children:"quickstart"}),"."]})]}),a?e.jsxs("p",{className:"text-sm text-[var(--otari-muted)]",children:["Tip: ",e.jsx("code",{children:"require_pricing"})," is on, so requests are rejected until pricing is set."," ",e.jsx("button",{type:"button",className:"font-medium text-[var(--otari-brand-dark)] disabled:opacity-50",disabled:r,onClick:t,children:"Enable default pricing"})," ","to meter new models with public rates."]}):null,e.jsx("div",{children:e.jsx(f,{variant:"primary",isDisabled:!i,onPress:s,children:"Add your first provider"})})]})})}function we(){var K,B,D,L;const s=Y(),a=V(),t=W(),r=G(),i=X(),l=Z(),m=J(),[g,u]=x.useState(!1),[p,c]=x.useState(null),[j,h]=x.useState({}),d=fe((K=s.data)==null?void 0:K.providers,a.data),k=new Map((((B=r.data)==null?void 0:B.providers)??[]).map(n=>[n.instance,n])),o=s.isLoading||a.isLoading,y=((D=a.data)==null?void 0:D.find(n=>n.instance===p))??null,N=((L=t.data)==null?void 0:L.require_pricing)===!0&&t.data.default_pricing===!1,P=t.data?t.data.secret_key_configured!==!1:!t.isError,A=!o&&d.length===0&&!g,w=n=>{h(v=>({...v,[n]:{status:"pending"}})),l.mutate(n,{onSuccess:v=>h(b=>({...b,[n]:{status:"done",...v}})),onError:v=>h(b=>({...b,[n]:{status:"done",ok:!1,model_count:0,error:q(v)}}))})},C=[{id:"provider",header:"Provider",isRowHeader:!0,cell:n=>e.jsx(M,{to:`/models?provider=${encodeURIComponent(n.instance)}`,className:"font-medium text-[var(--otari-ink)] hover:text-[var(--otari-brand-dark)] hover:underline",children:n.instance})},{id:"type",header:"Type",cell:n=>{var v,b;return e.jsx("span",{className:"text-[var(--otari-muted)]",children:((v=n.meta)==null?void 0:v.provider_type)??((b=n.stored)==null?void 0:b.provider_type)??n.instance})}},{id:"source",header:"Source",cell:n=>e.jsx(de,{size:"sm",color:n.source==="stored"?"accent":"default",children:n.source==="stored"?"stored":"config"})},{id:"api_key",header:"API key",cell:n=>{var v,b;return e.jsx("span",{className:"text-[var(--otari-muted)]",children:n.source==="stored"?n.stored&&!n.stored.decryptable?e.jsx("span",{className:"text-amber-700",title:"This key can't be decrypted with the current OTARI_SECRET_KEY. Replace the key, or restore the original OTARI_SECRET_KEY.",children:"⚠ key unreadable"}):e.jsx("code",{children:(v=n.stored)!=null&&v.last4?`••••${n.stored.last4}`:"none set"}):(b=n.meta)!=null&&b.env_key?e.jsxs("span",{children:["via ",e.jsx("code",{children:n.meta.env_key})]}):"config.yml"})}},{id:"status",header:"Status",cell:n=>e.jsx(ye,{health:k.get(n.instance)})},{id:"actions",header:"Actions",align:"end",cell:n=>{var v,b;return n.source==="stored"?e.jsxs("div",{className:"flex flex-col items-end gap-1.5",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(f,{size:"sm",variant:"outline",isDisabled:((v=j[n.instance])==null?void 0:v.status)==="pending"||((b=n.stored)==null?void 0:b.decryptable)===!1,onPress:()=>w(n.instance),children:"Test"}),e.jsx(f,{size:"sm",variant:"ghost",onPress:()=>{u(!1),c(n.instance)},children:"Edit"}),e.jsx(ae,{confirmLabel:"Delete",isPending:i.isPending,onConfirm:()=>i.mutate(n.instance),children:"Delete"})]}),e.jsx(je,{state:j[n.instance]})]}):e.jsx("span",{className:"block text-right text-xs text-[var(--otari-muted)]",children:"managed in config.yml"})}}];return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(Q,{title:"Providers",description:"Add provider API keys here to serve models without editing config.yml. Keys are encrypted at rest.",action:g||A?null:e.jsx(f,{variant:"primary",isDisabled:!P,onPress:()=>{c(null),u(!0)},children:"Add provider"})}),e.jsx(I,{error:s.error??a.error??t.error??r.error??m.error??i.error}),P?null:e.jsxs(ee,{tone:"warning",children:[e.jsx("code",{children:"OTARI_SECRET_KEY"})," is not set, so provider keys can't be encrypted at rest and adding providers from the dashboard is disabled. Set it on the server and restart to add providers here. Providers defined in"," ",e.jsx("code",{children:"config.yml"})," keep working without it."]}),A?e.jsx(ke,{onAddProvider:()=>{c(null),u(!0)},needsPricing:N,onEnablePricing:()=>m.mutate({default_pricing:!0}),enabling:m.isPending,secretKeyConfigured:P}):null,g&&P?e.jsx(ve,{onClose:()=>u(!1)}):null,y?e.jsx(ge,{provider:y,onClose:()=>c(null)}):null,!o&&d.length>0&&r.data&&r.data.total>0?e.jsx(be,{healthy:r.data.healthy,total:r.data.total,checkedAt:r.data.checked_at}):null,e.jsx(oe,{ariaLabel:"Providers",columns:C,rows:d,getRowKey:n=>n.instance,isLoading:o,emptyContent:"No providers yet. Add your first provider to start serving models."})]})}export{we as ProvidersPage}; diff --git a/src/gateway/static/dashboard/assets/SettingsPage-CDoI9NPf.js b/src/gateway/static/dashboard/assets/SettingsPage-CJyO6zWH.js similarity index 96% rename from src/gateway/static/dashboard/assets/SettingsPage-CDoI9NPf.js rename to src/gateway/static/dashboard/assets/SettingsPage-CJyO6zWH.js index 3e17d2a7..2a6775ac 100644 --- a/src/gateway/static/dashboard/assets/SettingsPage-CDoI9NPf.js +++ b/src/gateway/static/dashboard/assets/SettingsPage-CJyO6zWH.js @@ -1 +1 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as u}from"./react-dgEcD0HR.js";import{H as R,X as C,P,E as y,a2 as E,a3 as T,a4 as _,F as D,a5 as A,U as O,a6 as F,I as w}from"./index-CI2beHfq.js";import{d as v,B as h,A as d,g as I,I as K}from"./heroui-DZj66Arc.js";function b(t,r){return{[t]:r}}function z(t,r){let s=0;for(const a of r)if(a===t[s]&&(s+=1),s===t.length)return!0;return t.length===0}function M(t,r){const s=r.trim().toLowerCase();if(s==="")return!0;const a=`${t.key} ${t.description??""} ${t.group}`.toLowerCase(),n=t.key.toLowerCase().replace(/[^a-z0-9]/g,"");return s.split(/\s+/).every(i=>a.includes(i)||z(i,n))}function B({checked:t,onChange:r,label:s,disabled:a}){return e.jsx("button",{type:"button",role:"switch","aria-checked":t,"aria-label":s,disabled:a,onClick:()=>r(!t),className:`relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors disabled:opacity-50 ${t?"bg-[var(--otari-brand)]":"bg-[var(--otari-line)]"}`,children:e.jsx("span",{className:`inline-block h-5 w-5 transform rounded-full bg-white shadow transition-transform ${t?"translate-x-5":"translate-x-0.5"}`})})}function H({field:t,onSave:r,disabled:s}){const a=typeof t.value=="number"?t.value:0,[n,i]=u.useState(String(a)),o=t.type==="float";u.useEffect(()=>{i(String(a))},[a]);const c=Number(n),p=n.trim()!==""&&Number.isFinite(c)&&(o||Number.isInteger(c)),m=t.minimum??void 0,x=t.exclusive_minimum??void 0,g=x!==void 0?c>x:m!==void 0?c>=m:c>=0,l=p&&g&&c!==a;return e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(K,{type:"number",min:"0",step:o?"any":"1",inputMode:o?"decimal":"numeric","aria-label":t.key,value:n,disabled:s,onChange:f=>i(f.target.value),className:"w-28 rounded-md border border-[var(--otari-line)] bg-white px-2 py-1 text-right text-sm tabular-nums focus:border-[var(--otari-brand)] focus:outline-none disabled:opacity-50"}),e.jsx(h,{size:"sm",variant:"primary","aria-label":`Save ${t.key}`,isDisabled:s||!l,onPress:()=>r(c),children:"Save"})]})}function L({field:t,onSave:r,disabled:s}){const a=typeof t.value=="string"?t.value:"",[n,i]=u.useState(a);u.useEffect(()=>{i(a)},[a]);const o=n!==a;return e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"text","aria-label":t.key,value:n,disabled:s,placeholder:"unset",onChange:c=>i(c.target.value),className:"w-56 rounded-md border border-[var(--otari-line)] bg-white px-2 py-1 text-sm focus:border-[var(--otari-brand)] focus:outline-none disabled:opacity-50"}),e.jsx(h,{size:"sm",variant:"primary","aria-label":`Save ${t.key}`,isDisabled:s||!o,onPress:()=>r(n.trim()===""?null:n),children:"Save"})]})}function $(t){const{value:r}=t;return r==null?"unset":typeof r=="boolean"?r?"on":"off":Array.isArray(r)?r.length?r.join(", "):"none":String(r)}function Y({field:t,patch:r,disabled:s}){return t.settable?t.type==="bool"?e.jsx(B,{checked:t.value===!0,onChange:a=>r(b(t.key,a)),label:t.key,disabled:s}):t.options&&t.options.length>0?e.jsx(D,{ariaLabel:t.key,value:String(t.value??""),onChange:a=>r(b(t.key,a)),options:t.options.map(a=>({value:a,label:a}))}):t.type==="int"||t.type==="float"?e.jsx(H,{field:t,onSave:a=>r(b(t.key,a)),disabled:s}):e.jsx(L,{field:t,onSave:a=>r(b(t.key,a)),disabled:s}):e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-sm tabular-nums text-[var(--otari-ink)]",children:$(t)}),e.jsx("span",{className:"rounded-full border border-[var(--otari-line)] px-2 py-0.5 text-xs text-[var(--otari-muted)]",children:"startup-only"})]})}function q({field:t,patch:r,disabled:s}){return e.jsxs("div",{className:"flex items-start justify-between gap-6 py-4",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("code",{className:"text-sm font-medium text-[var(--otari-ink)]",children:t.key}),t.description?e.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:t.description}):null]}),e.jsx("div",{className:"shrink-0 pt-0.5",children:e.jsx(Y,{field:t,patch:r,disabled:s})})]})}function U({value:t,fieldRef:r}){const s=u.useRef(null),a=r??s,[n,i]=u.useState(!1),[o,c]=u.useState(!1),p=async()=>{var m,x,g;(m=a.current)==null||m.focus(),(x=a.current)==null||x.select();try{if((g=navigator.clipboard)!=null&&g.writeText){await navigator.clipboard.writeText(t),i(!0),c(!1),window.setTimeout(()=>i(!1),2e3);return}}catch{}c(!0)};return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-xs font-medium text-[var(--otari-muted)]",children:"New master key"}),e.jsx(h,{size:"sm",variant:"outline",onPress:p,children:n?"Copied":"Copy"})]}),e.jsx("input",{ref:a,readOnly:!0,value:t,onFocus:m=>m.currentTarget.select(),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",spellCheck:!1,"data-1p-ignore":!0,"data-lpignore":"true"}),e.jsx("span",{"aria-live":"polite",className:"text-xs text-[var(--otari-brand-dark)]",children:n?"Copied to clipboard.":""}),o?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Selected. Press Ctrl/Cmd-C to copy."}):null]})}function V({masterKey:t,error:r,isPending:s,onRegenerate:a,onClose:n}){const i=u.useRef(null);return u.useEffect(()=>{var o,c;t!==void 0&&((o=i.current)==null||o.focus(),(c=i.current)==null||c.select())},[t]),e.jsx(d.Backdrop,{children:e.jsx(d.Container,{placement:"center",size:"lg",children:e.jsxs(d.Dialog,{children:[e.jsx(d.Header,{children:e.jsx(d.Heading,{children:t!==void 0?"Master key regenerated":"Regenerate master key?"})}),e.jsx(d.Body,{className:"flex flex-col gap-4",children:t!==void 0?e.jsxs(e.Fragment,{children:[e.jsx(w,{tone:"warning",children:"Copy this key now. It is shown once and cannot be retrieved again after you close this dialog."}),e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:"The previous master key has stopped working. This browser tab now uses the new key."}),e.jsx(U,{value:t,fieldRef:i})]}):e.jsxs(e.Fragment,{children:[e.jsx(w,{tone:"warning",children:"This immediately invalidates the current dashboard master key. Other signed-in dashboard sessions will need the new key to continue."}),e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:"The replacement key will be shown once. Save it before closing the next screen."}),e.jsx(y,{error:r})]})}),e.jsx(d.Footer,{children:t!==void 0?e.jsx(h,{variant:"primary",onPress:n,children:"I’ve saved this key"}):e.jsxs(e.Fragment,{children:[e.jsx(h,{variant:"ghost",isDisabled:s,onPress:n,children:"Cancel"}),e.jsx(h,{variant:"danger",isPending:s,onPress:a,children:"Regenerate key"})]})})]})})})}function G({source:t}){const r=A(),[s,a]=u.useState(!1),[n,i]=u.useState(),o=t==="generated",c=()=>r.mutate(void 0,{onSuccess:x=>{i(x.master_key)}}),p=()=>{a(!1),i(void 0),r.reset()},m=x=>{x?(r.reset(),a(!0)):n===void 0&&p()};return e.jsx("div",{className:"flex flex-col gap-4 py-4",children:e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("code",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"master_key"}),e.jsx("p",{className:"mt-1 max-w-3xl text-sm text-[var(--otari-muted)]",children:o?"This gateway uses its first-run generated dashboard key. Regeneration invalidates the current key immediately.":"This gateway uses a key managed through OTARI_MASTER_KEY or config.yml. Rotate it in configuration, then restart the gateway."})]}),e.jsxs(d,{isOpen:s,onOpenChange:m,children:[o?e.jsx(d.Trigger,{className:I({size:"sm",variant:"danger-soft"}),children:"Regenerate"}):e.jsx(h,{size:"sm",variant:"danger-soft",isDisabled:!0,children:"Managed in configuration"}),s?e.jsx(V,{masterKey:n,error:r.error,isPending:r.isPending,onRegenerate:c,onClose:p}):null]})]})})}function X(){var o;const t=O(),r=F(),s=r.data,a=((o=t.data)==null?void 0:o.length)??0,n=(t.data??[]).filter(c=>!c.decryptable).length,i=a>0;return e.jsxs("div",{className:"flex flex-col gap-4 py-4",children:[e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("code",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"OTARI_SECRET_KEY"}),e.jsxs("p",{className:"mt-1 max-w-3xl text-sm text-[var(--otari-muted)]",children:["Generate a new key with ",e.jsx("code",{children:"uv run otari gen-secret-key"}),", then restart with"," ",e.jsx("code",{children:"OTARI_SECRET_KEY=,"}),". Re-encrypt the stored provider keys, then restart with ",e.jsx("code",{children:"OTARI_SECRET_KEY="})," once none are unreadable."]})]}),e.jsx("div",{className:"shrink-0",children:e.jsx(h,{size:"sm",variant:"outline",isDisabled:!i||r.isPending,onPress:()=>r.mutate(),children:r.isPending?"Re-encrypting…":"Re-encrypt provider keys"})})]}),e.jsx(y,{error:t.error??r.error}),n>0?e.jsxs(w,{tone:"warning",children:[n," stored provider key",n===1?"":"s"," cannot be decrypted with the current"," ",e.jsx("code",{children:"OTARI_SECRET_KEY"}),". Restore the old secret key and re-encrypt, or edit each affected provider and replace its key."]}):null,s?e.jsxs("p",{className:"text-sm text-[var(--otari-muted)]",role:"status","aria-live":"polite",children:["Re-encrypted ",s.reencrypted," provider key",s.reencrypted===1?"":"s",".",s.unreadable>0?` ${s.unreadable} still need replacement.`:" All decryptable stored keys now use the primary secret key."]}):!t.isLoading&&!i?e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:"No stored provider keys need re-encryption."}):null]})}function J({masterKeySource:t}){return e.jsxs("section",{className:"flex flex-col gap-2",children:[e.jsxs("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:["Credential security ",e.jsx("span",{className:"font-normal text-[var(--otari-muted)]",children:"(2)"})]}),e.jsx(v,{children:e.jsxs(v.Content,{className:"flex flex-col divide-y divide-[var(--otari-line)] px-5 py-1",children:[e.jsx(G,{source:t}),e.jsx(X,{})]})})]})}function Q({preview:t,error:r,isPending:s,onAccept:a,onReject:n}){return e.jsx(d.Backdrop,{children:e.jsx(d.Container,{placement:"center",size:"lg",children:e.jsxs(d.Dialog,{children:[e.jsx(d.Header,{children:e.jsx(d.Heading,{children:"Review default price updates"})}),e.jsxs(d.Body,{className:"flex flex-col gap-4",children:[e.jsxs("p",{className:"text-sm text-[var(--otari-muted)]",children:[t.added_count," added, ",t.changed_count," changed, and ",t.removed_count," removed upstream model prices. The accepted catalog is saved in the database with source ",e.jsx("code",{children:"genai-prices"})," and reloads after a restart. Your ",t.protected_model_count," custom model price",t.protected_model_count===1?"":"s"," remain unchanged."]}),t.changes.length>0?e.jsx("ul",{className:"max-h-60 list-disc overflow-auto pl-5 text-sm text-[var(--otari-ink)]",children:t.changes.map(i=>e.jsxs("li",{children:[i.model_key,": ",i.change]},i.model_key))}):null,t.changes_truncated?e.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:"Only the first 100 changes are shown."}):null,e.jsx(y,{error:r})]}),e.jsxs(d.Footer,{children:[e.jsx(h,{variant:"ghost",isDisabled:s,onPress:n,children:"Reject changes"}),e.jsx(h,{variant:"primary",isPending:s,onPress:a,children:"Accept price updates"})]})]})})})}function W(){const t=E(),r=T(),s=_(),a=t.data,n=r.isPending||s.isPending,i=()=>{a===void 0||n||s.mutate(void 0,{onSuccess:t.reset})};return e.jsxs("section",{className:"flex flex-col gap-2",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Default pricing catalog"}),e.jsx(v,{children:e.jsxs(v.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"genai-prices defaults"}),e.jsxs("p",{className:"mt-1 max-w-3xl text-sm text-[var(--otari-muted)]",children:["Fetch the latest upstream catalog, review the proposed change summary, then accept or reject it. Accepted data is stored as ",e.jsx("code",{children:"genai-prices"}),"; custom prices remain separate and always take precedence."]})]}),e.jsx(h,{size:"sm",variant:"outline",isDisabled:t.isPending||n,onPress:()=>t.mutate(),children:t.isPending?"Checking prices…":"Check for price updates"})]}),e.jsx(y,{error:t.error})]})}),e.jsxs(d,{isOpen:a!==void 0,onOpenChange:o=>o?void 0:i(),children:[e.jsx(d.Trigger,{className:"hidden",children:"Review price updates"}),a?e.jsx(Q,{preview:a,error:r.error??s.error,isPending:n,onAccept:()=>r.mutate(void 0,{onSuccess:t.reset}),onReject:i}):null]})]})}function Z(t){const r=[],s=new Map;for(const a of t){let n=s.get(a.group);n||(n={name:a.group,fields:[]},s.set(a.group,n),r.push(n)),n.fields.push(a)}return r}function ae(){const t=R(),r=C(),s=t.data,a=r.isPending,[n,i]=u.useState(""),[o,c]=u.useState(!1),p=u.useRef(null);u.useEffect(()=>{function l(f){var N;const j=f.target,S=j&&(j.tagName==="INPUT"||j.tagName==="TEXTAREA"||j.tagName==="SELECT");f.key==="/"&&!S&&(f.preventDefault(),(N=p.current)==null||N.focus())}return window.addEventListener("keydown",l),()=>window.removeEventListener("keydown",l)},[]);const m=l=>r.mutate(l),x=(s==null?void 0:s.config)??[],g=x.filter(l=>(o?l.settable:!0)&&M(l,n)),k=Z(g);return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(P,{title:"Settings",description:"Every effective gateway setting. Settable fields apply immediately and persist across restarts; startup-only fields are shown for reference and change only via config.yml or environment variables (then a restart)."}),e.jsx(y,{error:t.error??r.error}),e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("input",{ref:p,type:"search","aria-label":"Search settings",placeholder:"Search settings (press / to focus)…",value:n,onChange:l=>i(l.target.value),onKeyDown:l=>{l.key==="Escape"&&i("")},className:"min-w-0 flex-1 rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-3 py-2 text-sm text-[var(--otari-ink)] focus:border-[var(--otari-brand)] focus:outline-none"}),e.jsxs("label",{className:"flex items-center gap-2 text-sm text-[var(--otari-muted)]",children:[e.jsx("input",{type:"checkbox",checked:o,onChange:l=>c(l.target.checked),className:"h-4 w-4 accent-[var(--otari-brand)]"}),"Settable only"]})]}),s?e.jsxs("p",{className:"text-xs text-[var(--otari-muted)]",children:["Showing ",g.length," of ",x.length," settings"]}):null,s&&g.length===0?e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:"No settings match your search."}):null,k.map(l=>e.jsxs("section",{className:"flex flex-col gap-2",children:[e.jsxs("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:[l.name," ",e.jsxs("span",{className:"font-normal text-[var(--otari-muted)]",children:["(",l.fields.length,")"]})]}),e.jsx(v,{children:e.jsx(v.Content,{className:"flex flex-col divide-y divide-[var(--otari-line)] px-5 py-1",children:l.fields.map(f=>e.jsx(q,{field:f,patch:m,disabled:!s||a},f.key))})})]},l.name)),s?e.jsx(W,{}):null,s?e.jsx(J,{masterKeySource:s.master_key_source}):null,s?e.jsxs("p",{className:"text-xs text-[var(--otari-muted)]",children:["Mode: ",s.mode," · Version ",s.version,s.require_pricing?" · require_pricing on":""]}):null]})}export{ae as SettingsPage,M as fieldMatches}; +import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as u}from"./react-dgEcD0HR.js";import{H as R,Y as C,P,E as y,a3 as E,a4 as T,a5 as _,F as D,a6 as A,V as O,a7 as F,I as w}from"./index-CGnfXTEF.js";import{d as v,B as h,A as d,g as I,I as K}from"./heroui-BI50yK5B.js";function b(t,r){return{[t]:r}}function z(t,r){let s=0;for(const a of r)if(a===t[s]&&(s+=1),s===t.length)return!0;return t.length===0}function M(t,r){const s=r.trim().toLowerCase();if(s==="")return!0;const a=`${t.key} ${t.description??""} ${t.group}`.toLowerCase(),n=t.key.toLowerCase().replace(/[^a-z0-9]/g,"");return s.split(/\s+/).every(i=>a.includes(i)||z(i,n))}function B({checked:t,onChange:r,label:s,disabled:a}){return e.jsx("button",{type:"button",role:"switch","aria-checked":t,"aria-label":s,disabled:a,onClick:()=>r(!t),className:`relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors disabled:opacity-50 ${t?"bg-[var(--otari-brand)]":"bg-[var(--otari-line)]"}`,children:e.jsx("span",{className:`inline-block h-5 w-5 transform rounded-full bg-white shadow transition-transform ${t?"translate-x-5":"translate-x-0.5"}`})})}function H({field:t,onSave:r,disabled:s}){const a=typeof t.value=="number"?t.value:0,[n,i]=u.useState(String(a)),o=t.type==="float";u.useEffect(()=>{i(String(a))},[a]);const c=Number(n),p=n.trim()!==""&&Number.isFinite(c)&&(o||Number.isInteger(c)),m=t.minimum??void 0,x=t.exclusive_minimum??void 0,g=x!==void 0?c>x:m!==void 0?c>=m:c>=0,l=p&&g&&c!==a;return e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(K,{type:"number",min:"0",step:o?"any":"1",inputMode:o?"decimal":"numeric","aria-label":t.key,value:n,disabled:s,onChange:f=>i(f.target.value),className:"w-28 rounded-md border border-[var(--otari-line)] bg-white px-2 py-1 text-right text-sm tabular-nums focus:border-[var(--otari-brand)] focus:outline-none disabled:opacity-50"}),e.jsx(h,{size:"sm",variant:"primary","aria-label":`Save ${t.key}`,isDisabled:s||!l,onPress:()=>r(c),children:"Save"})]})}function L({field:t,onSave:r,disabled:s}){const a=typeof t.value=="string"?t.value:"",[n,i]=u.useState(a);u.useEffect(()=>{i(a)},[a]);const o=n!==a;return e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"text","aria-label":t.key,value:n,disabled:s,placeholder:"unset",onChange:c=>i(c.target.value),className:"w-56 rounded-md border border-[var(--otari-line)] bg-white px-2 py-1 text-sm focus:border-[var(--otari-brand)] focus:outline-none disabled:opacity-50"}),e.jsx(h,{size:"sm",variant:"primary","aria-label":`Save ${t.key}`,isDisabled:s||!o,onPress:()=>r(n.trim()===""?null:n),children:"Save"})]})}function $(t){const{value:r}=t;return r==null?"unset":typeof r=="boolean"?r?"on":"off":Array.isArray(r)?r.length?r.join(", "):"none":String(r)}function Y({field:t,patch:r,disabled:s}){return t.settable?t.type==="bool"?e.jsx(B,{checked:t.value===!0,onChange:a=>r(b(t.key,a)),label:t.key,disabled:s}):t.options&&t.options.length>0?e.jsx(D,{ariaLabel:t.key,value:String(t.value??""),onChange:a=>r(b(t.key,a)),options:t.options.map(a=>({value:a,label:a}))}):t.type==="int"||t.type==="float"?e.jsx(H,{field:t,onSave:a=>r(b(t.key,a)),disabled:s}):e.jsx(L,{field:t,onSave:a=>r(b(t.key,a)),disabled:s}):e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-sm tabular-nums text-[var(--otari-ink)]",children:$(t)}),e.jsx("span",{className:"rounded-full border border-[var(--otari-line)] px-2 py-0.5 text-xs text-[var(--otari-muted)]",children:"startup-only"})]})}function q({field:t,patch:r,disabled:s}){return e.jsxs("div",{className:"flex items-start justify-between gap-6 py-4",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("code",{className:"text-sm font-medium text-[var(--otari-ink)]",children:t.key}),t.description?e.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:t.description}):null]}),e.jsx("div",{className:"shrink-0 pt-0.5",children:e.jsx(Y,{field:t,patch:r,disabled:s})})]})}function V({value:t,fieldRef:r}){const s=u.useRef(null),a=r??s,[n,i]=u.useState(!1),[o,c]=u.useState(!1),p=async()=>{var m,x,g;(m=a.current)==null||m.focus(),(x=a.current)==null||x.select();try{if((g=navigator.clipboard)!=null&&g.writeText){await navigator.clipboard.writeText(t),i(!0),c(!1),window.setTimeout(()=>i(!1),2e3);return}}catch{}c(!0)};return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-xs font-medium text-[var(--otari-muted)]",children:"New master key"}),e.jsx(h,{size:"sm",variant:"outline",onPress:p,children:n?"Copied":"Copy"})]}),e.jsx("input",{ref:a,readOnly:!0,value:t,onFocus:m=>m.currentTarget.select(),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",spellCheck:!1,"data-1p-ignore":!0,"data-lpignore":"true"}),e.jsx("span",{"aria-live":"polite",className:"text-xs text-[var(--otari-brand-dark)]",children:n?"Copied to clipboard.":""}),o?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Selected. Press Ctrl/Cmd-C to copy."}):null]})}function U({masterKey:t,error:r,isPending:s,onRegenerate:a,onClose:n}){const i=u.useRef(null);return u.useEffect(()=>{var o,c;t!==void 0&&((o=i.current)==null||o.focus(),(c=i.current)==null||c.select())},[t]),e.jsx(d.Backdrop,{children:e.jsx(d.Container,{placement:"center",size:"lg",children:e.jsxs(d.Dialog,{children:[e.jsx(d.Header,{children:e.jsx(d.Heading,{children:t!==void 0?"Master key regenerated":"Regenerate master key?"})}),e.jsx(d.Body,{className:"flex flex-col gap-4",children:t!==void 0?e.jsxs(e.Fragment,{children:[e.jsx(w,{tone:"warning",children:"Copy this key now. It is shown once and cannot be retrieved again after you close this dialog."}),e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:"The previous master key has stopped working. This browser tab now uses the new key."}),e.jsx(V,{value:t,fieldRef:i})]}):e.jsxs(e.Fragment,{children:[e.jsx(w,{tone:"warning",children:"This immediately invalidates the current dashboard master key. Other signed-in dashboard sessions will need the new key to continue."}),e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:"The replacement key will be shown once. Save it before closing the next screen."}),e.jsx(y,{error:r})]})}),e.jsx(d.Footer,{children:t!==void 0?e.jsx(h,{variant:"primary",onPress:n,children:"I’ve saved this key"}):e.jsxs(e.Fragment,{children:[e.jsx(h,{variant:"ghost",isDisabled:s,onPress:n,children:"Cancel"}),e.jsx(h,{variant:"danger",isPending:s,onPress:a,children:"Regenerate key"})]})})]})})})}function G({source:t}){const r=A(),[s,a]=u.useState(!1),[n,i]=u.useState(),o=t==="generated",c=()=>r.mutate(void 0,{onSuccess:x=>{i(x.master_key)}}),p=()=>{a(!1),i(void 0),r.reset()},m=x=>{x?(r.reset(),a(!0)):n===void 0&&p()};return e.jsx("div",{className:"flex flex-col gap-4 py-4",children:e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("code",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"master_key"}),e.jsx("p",{className:"mt-1 max-w-3xl text-sm text-[var(--otari-muted)]",children:o?"This gateway uses its first-run generated dashboard key. Regeneration invalidates the current key immediately.":"This gateway uses a key managed through OTARI_MASTER_KEY or config.yml. Rotate it in configuration, then restart the gateway."})]}),e.jsxs(d,{isOpen:s,onOpenChange:m,children:[o?e.jsx(d.Trigger,{className:I({size:"sm",variant:"danger-soft"}),children:"Regenerate"}):e.jsx(h,{size:"sm",variant:"danger-soft",isDisabled:!0,children:"Managed in configuration"}),s?e.jsx(U,{masterKey:n,error:r.error,isPending:r.isPending,onRegenerate:c,onClose:p}):null]})]})})}function X(){var o;const t=O(),r=F(),s=r.data,a=((o=t.data)==null?void 0:o.length)??0,n=(t.data??[]).filter(c=>!c.decryptable).length,i=a>0;return e.jsxs("div",{className:"flex flex-col gap-4 py-4",children:[e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("code",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"OTARI_SECRET_KEY"}),e.jsxs("p",{className:"mt-1 max-w-3xl text-sm text-[var(--otari-muted)]",children:["Generate a new key with ",e.jsx("code",{children:"uv run otari gen-secret-key"}),", then restart with"," ",e.jsx("code",{children:"OTARI_SECRET_KEY=,"}),". Re-encrypt the stored provider keys, then restart with ",e.jsx("code",{children:"OTARI_SECRET_KEY="})," once none are unreadable."]})]}),e.jsx("div",{className:"shrink-0",children:e.jsx(h,{size:"sm",variant:"outline",isDisabled:!i||r.isPending,onPress:()=>r.mutate(),children:r.isPending?"Re-encrypting…":"Re-encrypt provider keys"})})]}),e.jsx(y,{error:t.error??r.error}),n>0?e.jsxs(w,{tone:"warning",children:[n," stored provider key",n===1?"":"s"," cannot be decrypted with the current"," ",e.jsx("code",{children:"OTARI_SECRET_KEY"}),". Restore the old secret key and re-encrypt, or edit each affected provider and replace its key."]}):null,s?e.jsxs("p",{className:"text-sm text-[var(--otari-muted)]",role:"status","aria-live":"polite",children:["Re-encrypted ",s.reencrypted," provider key",s.reencrypted===1?"":"s",".",s.unreadable>0?` ${s.unreadable} still need replacement.`:" All decryptable stored keys now use the primary secret key."]}):!t.isLoading&&!i?e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:"No stored provider keys need re-encryption."}):null]})}function J({masterKeySource:t}){return e.jsxs("section",{className:"flex flex-col gap-2",children:[e.jsxs("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:["Credential security ",e.jsx("span",{className:"font-normal text-[var(--otari-muted)]",children:"(2)"})]}),e.jsx(v,{children:e.jsxs(v.Content,{className:"flex flex-col divide-y divide-[var(--otari-line)] px-5 py-1",children:[e.jsx(G,{source:t}),e.jsx(X,{})]})})]})}function Q({preview:t,error:r,isPending:s,onAccept:a,onReject:n}){return e.jsx(d.Backdrop,{children:e.jsx(d.Container,{placement:"center",size:"lg",children:e.jsxs(d.Dialog,{children:[e.jsx(d.Header,{children:e.jsx(d.Heading,{children:"Review default price updates"})}),e.jsxs(d.Body,{className:"flex flex-col gap-4",children:[e.jsxs("p",{className:"text-sm text-[var(--otari-muted)]",children:[t.added_count," added, ",t.changed_count," changed, and ",t.removed_count," removed upstream model prices. The accepted catalog is saved in the database with source ",e.jsx("code",{children:"genai-prices"})," and reloads after a restart. Your ",t.protected_model_count," custom model price",t.protected_model_count===1?"":"s"," remain unchanged."]}),t.changes.length>0?e.jsx("ul",{className:"max-h-60 list-disc overflow-auto pl-5 text-sm text-[var(--otari-ink)]",children:t.changes.map(i=>e.jsxs("li",{children:[i.model_key,": ",i.change]},i.model_key))}):null,t.changes_truncated?e.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:"Only the first 100 changes are shown."}):null,e.jsx(y,{error:r})]}),e.jsxs(d.Footer,{children:[e.jsx(h,{variant:"ghost",isDisabled:s,onPress:n,children:"Reject changes"}),e.jsx(h,{variant:"primary",isPending:s,onPress:a,children:"Accept price updates"})]})]})})})}function W(){const t=E(),r=T(),s=_(),a=t.data,n=r.isPending||s.isPending,i=()=>{a===void 0||n||s.mutate(void 0,{onSuccess:t.reset})};return e.jsxs("section",{className:"flex flex-col gap-2",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Default pricing catalog"}),e.jsx(v,{children:e.jsxs(v.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"genai-prices defaults"}),e.jsxs("p",{className:"mt-1 max-w-3xl text-sm text-[var(--otari-muted)]",children:["Fetch the latest upstream catalog, review the proposed change summary, then accept or reject it. Accepted data is stored as ",e.jsx("code",{children:"genai-prices"}),"; custom prices remain separate and always take precedence."]})]}),e.jsx(h,{size:"sm",variant:"outline",isDisabled:t.isPending||n,onPress:()=>t.mutate(),children:t.isPending?"Checking prices…":"Check for price updates"})]}),e.jsx(y,{error:t.error})]})}),e.jsxs(d,{isOpen:a!==void 0,onOpenChange:o=>o?void 0:i(),children:[e.jsx(d.Trigger,{className:"hidden",children:"Review price updates"}),a?e.jsx(Q,{preview:a,error:r.error??s.error,isPending:n,onAccept:()=>r.mutate(void 0,{onSuccess:t.reset}),onReject:i}):null]})]})}function Z(t){const r=[],s=new Map;for(const a of t){let n=s.get(a.group);n||(n={name:a.group,fields:[]},s.set(a.group,n),r.push(n)),n.fields.push(a)}return r}function ae(){const t=R(),r=C(),s=t.data,a=r.isPending,[n,i]=u.useState(""),[o,c]=u.useState(!1),p=u.useRef(null);u.useEffect(()=>{function l(f){var N;const j=f.target,S=j&&(j.tagName==="INPUT"||j.tagName==="TEXTAREA"||j.tagName==="SELECT");f.key==="/"&&!S&&(f.preventDefault(),(N=p.current)==null||N.focus())}return window.addEventListener("keydown",l),()=>window.removeEventListener("keydown",l)},[]);const m=l=>r.mutate(l),x=(s==null?void 0:s.config)??[],g=x.filter(l=>(o?l.settable:!0)&&M(l,n)),k=Z(g);return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(P,{title:"Settings",description:"Every effective gateway setting. Settable fields apply immediately and persist across restarts; startup-only fields are shown for reference and change only via config.yml or environment variables (then a restart)."}),e.jsx(y,{error:t.error??r.error}),e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("input",{ref:p,type:"search","aria-label":"Search settings",placeholder:"Search settings (press / to focus)…",value:n,onChange:l=>i(l.target.value),onKeyDown:l=>{l.key==="Escape"&&i("")},className:"min-w-0 flex-1 rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-3 py-2 text-sm text-[var(--otari-ink)] focus:border-[var(--otari-brand)] focus:outline-none"}),e.jsxs("label",{className:"flex items-center gap-2 text-sm text-[var(--otari-muted)]",children:[e.jsx("input",{type:"checkbox",checked:o,onChange:l=>c(l.target.checked),className:"h-4 w-4 accent-[var(--otari-brand)]"}),"Settable only"]})]}),s?e.jsxs("p",{className:"text-xs text-[var(--otari-muted)]",children:["Showing ",g.length," of ",x.length," settings"]}):null,s&&g.length===0?e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:"No settings match your search."}):null,k.map(l=>e.jsxs("section",{className:"flex flex-col gap-2",children:[e.jsxs("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:[l.name," ",e.jsxs("span",{className:"font-normal text-[var(--otari-muted)]",children:["(",l.fields.length,")"]})]}),e.jsx(v,{children:e.jsx(v.Content,{className:"flex flex-col divide-y divide-[var(--otari-line)] px-5 py-1",children:l.fields.map(f=>e.jsx(q,{field:f,patch:m,disabled:!s||a},f.key))})})]},l.name)),s?e.jsx(W,{}):null,s?e.jsx(J,{masterKeySource:s.master_key_source}):null,s?e.jsxs("p",{className:"text-xs text-[var(--otari-muted)]",children:["Mode: ",s.mode," · Version ",s.version,s.require_pricing?" · require_pricing on":""]}):null]})}export{ae as SettingsPage,M as fieldMatches}; diff --git a/src/gateway/static/dashboard/assets/TablePagination-ByewydW5.js b/src/gateway/static/dashboard/assets/TablePagination-r1AimUKf.js similarity index 97% rename from src/gateway/static/dashboard/assets/TablePagination-ByewydW5.js rename to src/gateway/static/dashboard/assets/TablePagination-r1AimUKf.js index 8e397a2b..5da185de 100644 --- a/src/gateway/static/dashboard/assets/TablePagination-ByewydW5.js +++ b/src/gateway/static/dashboard/assets/TablePagination-r1AimUKf.js @@ -1 +1 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as u}from"./react-dgEcD0HR.js";import{I as w,E as M,F as D}from"./index-CI2beHfq.js";import{A as o,B as x,T as F,L as $,I as T,S as y}from"./heroui-DZj66Arc.js";function _({label:t,value:r,onChange:a,isRequired:c,autoFocus:i}){return e.jsxs(F,{value:r,onChange:a,isRequired:c,className:"flex flex-col gap-1",children:[e.jsx($,{className:"text-sm font-medium text-[var(--otari-ink)]",children:t}),e.jsx(T,{inputMode:"decimal",placeholder:"0.00",autoFocus:i})]})}function R(t){const r=t.trim();if(r==="")return null;const a=Number(r);return Number.isFinite(a)&&a>=0?a:Number.NaN}const C=t=>`Recompute cost for ${t.toLocaleString()} imported ${t===1?"row":"rows"} from each row's own token counts at these per-1M rates. Enforced gateway rows are never affected.`;function W({isOpen:t,onOpenChange:r,targetCount:a,isPending:c,error:i,onSubmit:E,title:I="Set price",description:L=C}){const[j,p]=u.useState(""),[n,h]=u.useState(""),[b,N]=u.useState(""),[f,v]=u.useState("");u.useEffect(()=>{t&&(p(""),h(""),N(""),v(""))},[t]);const m=R(j),l=R(n),d=R(b),s=R(f),g=m===null||Number.isNaN(m)||l===null||Number.isNaN(l)||Number.isNaN(d??0)||Number.isNaN(s??0),S=()=>{g||m===null||l===null||E({input_price_per_million:m,output_price_per_million:l,...d!==null&&!Number.isNaN(d)?{cache_read_price_per_million:d}:{},...s!==null&&!Number.isNaN(s)?{cache_write_price_per_million:s}:{}})};return e.jsx(o,{isOpen:t,onOpenChange:r,children:t?e.jsx(o.Backdrop,{children:e.jsx(o.Container,{placement:"center",size:"lg",children:e.jsxs(o.Dialog,{children:[e.jsx(o.Header,{children:e.jsx(o.Heading,{children:I})}),e.jsxs(o.Body,{className:"flex flex-col gap-4",children:[e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:L(a)}),e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2",children:[e.jsx(_,{label:"Input $ / 1M",value:j,onChange:p,isRequired:!0,autoFocus:!0}),e.jsx(_,{label:"Output $ / 1M",value:n,onChange:h,isRequired:!0}),e.jsx(_,{label:"Cache read $ / 1M",value:b,onChange:N}),e.jsx(_,{label:"Cache write $ / 1M",value:f,onChange:v})]}),e.jsx(w,{tone:"info",children:"Leave a cache rate blank to bill those tokens at the input rate."}),e.jsx(M,{error:i})]}),e.jsxs(o.Footer,{children:[e.jsx(x,{variant:"ghost",isDisabled:c,onPress:()=>r(!1),children:"Cancel"}),e.jsx(x,{variant:"primary",isDisabled:g,isPending:c,onPress:S,children:"Set price"})]})]})})}):null})}const P=[25,50,100];function q({page:t,pageSize:r,total:a,rowsOnPage:c,onPageChange:i,onPageSizeChange:E,pageSizeOptions:I=P,isFetching:L=!1,hasNextFallback:j=!1}){const p=u.useId(),n=a!=null?Math.max(1,Math.ceil(a/r)):null,h=t===0,b=n!=null?t>=n-1:!j,N=c>0?t*r+1:0,f=t*r+c,v=a!=null?a===0?"0 of 0":`${N.toLocaleString()}–${f.toLocaleString()} of ${a.toLocaleString()}`:c>0?`${N.toLocaleString()}–${f.toLocaleString()}`:"0",[m,l]=u.useState(String(t+1));u.useEffect(()=>{l(String(t+1))},[t]);const d=()=>{const s=Number.parseInt(m,10);if(Number.isNaN(s)){l(String(t+1));return}const g=n??Number.MAX_SAFE_INTEGER,S=Math.min(Math.max(s,1),g);S-1!==t?i(S-1):l(String(t+1))};return e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("label",{htmlFor:p,className:"text-sm text-[var(--otari-muted)]",children:"Rows"}),e.jsx(D,{id:p,ariaLabel:"Rows per page",value:String(r),onChange:s=>E(Number.parseInt(s,10)),options:I.map(s=>({value:String(s),label:String(s)}))}),L?e.jsx(y,{size:"sm"}):null]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"text-sm text-[var(--otari-muted)] tabular-nums",children:v}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(x,{size:"sm",variant:"outline","aria-label":"First page",isDisabled:h,onPress:()=>i(0),children:"«"}),e.jsx(x,{size:"sm",variant:"outline","aria-label":"Previous page",isDisabled:h,onPress:()=>i(t-1),children:"‹"}),e.jsxs("span",{className:"inline-flex items-center gap-1 text-sm text-[var(--otari-muted)]",children:[e.jsx("input",{"aria-label":"Page number",inputMode:"numeric",value:m,onChange:s=>l(s.target.value.replace(/[^0-9]/g,"")),onKeyDown:s=>{s.key==="Enter"&&s.currentTarget.blur()},onBlur:d,className:"w-12 rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-2 py-1 text-center text-sm text-[var(--otari-ink)] tabular-nums focus:border-[var(--otari-brand)] focus:outline-none"}),n!=null?e.jsxs("span",{className:"tabular-nums",children:["/ ",n.toLocaleString()]}):null]}),e.jsx(x,{size:"sm",variant:"outline","aria-label":"Next page",isDisabled:b,onPress:()=>i(t+1),children:"›"}),e.jsx(x,{size:"sm",variant:"outline","aria-label":"Last page",isDisabled:n==null||b,onPress:()=>n!=null&&i(n-1),children:"»"})]})]})]})}export{P,W as S,q as T}; +import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as u}from"./react-dgEcD0HR.js";import{I as w,E as M,F as D}from"./index-CGnfXTEF.js";import{A as o,B as x,T as F,L as $,I as T,S as y}from"./heroui-BI50yK5B.js";function _({label:t,value:r,onChange:a,isRequired:c,autoFocus:i}){return e.jsxs(F,{value:r,onChange:a,isRequired:c,className:"flex flex-col gap-1",children:[e.jsx($,{className:"text-sm font-medium text-[var(--otari-ink)]",children:t}),e.jsx(T,{inputMode:"decimal",placeholder:"0.00",autoFocus:i})]})}function R(t){const r=t.trim();if(r==="")return null;const a=Number(r);return Number.isFinite(a)&&a>=0?a:Number.NaN}const C=t=>`Recompute cost for ${t.toLocaleString()} imported ${t===1?"row":"rows"} from each row's own token counts at these per-1M rates. Enforced gateway rows are never affected.`;function W({isOpen:t,onOpenChange:r,targetCount:a,isPending:c,error:i,onSubmit:E,title:I="Set price",description:L=C}){const[j,p]=u.useState(""),[n,h]=u.useState(""),[b,N]=u.useState(""),[f,v]=u.useState("");u.useEffect(()=>{t&&(p(""),h(""),N(""),v(""))},[t]);const m=R(j),l=R(n),d=R(b),s=R(f),g=m===null||Number.isNaN(m)||l===null||Number.isNaN(l)||Number.isNaN(d??0)||Number.isNaN(s??0),S=()=>{g||m===null||l===null||E({input_price_per_million:m,output_price_per_million:l,...d!==null&&!Number.isNaN(d)?{cache_read_price_per_million:d}:{},...s!==null&&!Number.isNaN(s)?{cache_write_price_per_million:s}:{}})};return e.jsx(o,{isOpen:t,onOpenChange:r,children:t?e.jsx(o.Backdrop,{children:e.jsx(o.Container,{placement:"center",size:"lg",children:e.jsxs(o.Dialog,{children:[e.jsx(o.Header,{children:e.jsx(o.Heading,{children:I})}),e.jsxs(o.Body,{className:"flex flex-col gap-4",children:[e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:L(a)}),e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2",children:[e.jsx(_,{label:"Input $ / 1M",value:j,onChange:p,isRequired:!0,autoFocus:!0}),e.jsx(_,{label:"Output $ / 1M",value:n,onChange:h,isRequired:!0}),e.jsx(_,{label:"Cache read $ / 1M",value:b,onChange:N}),e.jsx(_,{label:"Cache write $ / 1M",value:f,onChange:v})]}),e.jsx(w,{tone:"info",children:"Leave a cache rate blank to bill those tokens at the input rate."}),e.jsx(M,{error:i})]}),e.jsxs(o.Footer,{children:[e.jsx(x,{variant:"ghost",isDisabled:c,onPress:()=>r(!1),children:"Cancel"}),e.jsx(x,{variant:"primary",isDisabled:g,isPending:c,onPress:S,children:"Set price"})]})]})})}):null})}const P=[25,50,100];function q({page:t,pageSize:r,total:a,rowsOnPage:c,onPageChange:i,onPageSizeChange:E,pageSizeOptions:I=P,isFetching:L=!1,hasNextFallback:j=!1}){const p=u.useId(),n=a!=null?Math.max(1,Math.ceil(a/r)):null,h=t===0,b=n!=null?t>=n-1:!j,N=c>0?t*r+1:0,f=t*r+c,v=a!=null?a===0?"0 of 0":`${N.toLocaleString()}–${f.toLocaleString()} of ${a.toLocaleString()}`:c>0?`${N.toLocaleString()}–${f.toLocaleString()}`:"0",[m,l]=u.useState(String(t+1));u.useEffect(()=>{l(String(t+1))},[t]);const d=()=>{const s=Number.parseInt(m,10);if(Number.isNaN(s)){l(String(t+1));return}const g=n??Number.MAX_SAFE_INTEGER,S=Math.min(Math.max(s,1),g);S-1!==t?i(S-1):l(String(t+1))};return e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("label",{htmlFor:p,className:"text-sm text-[var(--otari-muted)]",children:"Rows"}),e.jsx(D,{id:p,ariaLabel:"Rows per page",value:String(r),onChange:s=>E(Number.parseInt(s,10)),options:I.map(s=>({value:String(s),label:String(s)}))}),L?e.jsx(y,{size:"sm"}):null]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"text-sm text-[var(--otari-muted)] tabular-nums",children:v}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(x,{size:"sm",variant:"outline","aria-label":"First page",isDisabled:h,onPress:()=>i(0),children:"«"}),e.jsx(x,{size:"sm",variant:"outline","aria-label":"Previous page",isDisabled:h,onPress:()=>i(t-1),children:"‹"}),e.jsxs("span",{className:"inline-flex items-center gap-1 text-sm text-[var(--otari-muted)]",children:[e.jsx("input",{"aria-label":"Page number",inputMode:"numeric",value:m,onChange:s=>l(s.target.value.replace(/[^0-9]/g,"")),onKeyDown:s=>{s.key==="Enter"&&s.currentTarget.blur()},onBlur:d,className:"w-12 rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-2 py-1 text-center text-sm text-[var(--otari-ink)] tabular-nums focus:border-[var(--otari-brand)] focus:outline-none"}),n!=null?e.jsxs("span",{className:"tabular-nums",children:["/ ",n.toLocaleString()]}):null]}),e.jsx(x,{size:"sm",variant:"outline","aria-label":"Next page",isDisabled:b,onPress:()=>i(t+1),children:"›"}),e.jsx(x,{size:"sm",variant:"outline","aria-label":"Last page",isDisabled:n==null||b,onPress:()=>n!=null&&i(n-1),children:"»"})]})]})]})}export{P,W as S,q as T}; diff --git a/src/gateway/static/dashboard/assets/ToolsGuardrailsPage-bas8EytO.js b/src/gateway/static/dashboard/assets/ToolsGuardrailsPage-1cTNaDRp.js similarity index 97% rename from src/gateway/static/dashboard/assets/ToolsGuardrailsPage-bas8EytO.js rename to src/gateway/static/dashboard/assets/ToolsGuardrailsPage-1cTNaDRp.js index 5891741b..198ee9ab 100644 --- a/src/gateway/static/dashboard/assets/ToolsGuardrailsPage-bas8EytO.js +++ b/src/gateway/static/dashboard/assets/ToolsGuardrailsPage-1cTNaDRp.js @@ -1 +1 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as x}from"./react-dgEcD0HR.js";import{a7 as C,a8 as L,P as E,E as P,D as w,a9 as R,F as D}from"./index-CI2beHfq.js";import{d as N,B as b}from"./heroui-DZj66Arc.js";function M(s,t){return{[s]:t}}const U=[{key:"web_search",label:"Web search",blurb:"Backend for otari_web_search tools (a SearXNG instance or a search adapter).",order:["web_search_url","web_search_engines","web_search_max_results","web_search_extract","web_search_purpose_hint"]},{key:"sandbox",label:"Code execution",blurb:"Backend for otari_code_execution tools (the sandbox that runs generated code).",order:["sandbox_url","sandbox_purpose_hint"]},{key:"guardrails",label:"Guardrails",blurb:"Default input-guardrails service used when a request does not pass its own guardrail URL.",order:["guardrails_url"]}];function B(){const[s,t]=x.useState(null),a=x.useRef(void 0),n=r=>{t(r),window.clearTimeout(a.current),a.current=window.setTimeout(()=>t(null),2500)};return x.useEffect(()=>()=>window.clearTimeout(a.current),[]),[s,n]}function $({message:s}){return s?e.jsxs("div",{role:"status","aria-live":"polite",className:"fixed right-4 bottom-4 z-50 flex items-center gap-2 rounded-lg border border-green-200 bg-green-50 px-4 py-3 text-sm font-medium text-green-700 shadow-lg",children:[e.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2","aria-hidden":!0,className:"h-5 w-5",children:e.jsx("path",{d:"M20 6 9 17l-5-5",strokeLinecap:"round",strokeLinejoin:"round"})}),s]}):null}const S="rounded-md border border-[var(--otari-line)] bg-[var(--otari-surface)] px-2 py-1 text-sm focus:border-[var(--otari-brand)] focus:outline-none disabled:opacity-50",g="grid gap-x-4 gap-y-1.5 py-4 sm:grid-cols-[minmax(0,1fr)_16rem_10rem] sm:items-start",_=`w-full sm:col-start-2 ${S}`,k="flex items-center gap-2 sm:col-start-3",f="flex flex-col gap-1 sm:col-span-2 sm:col-start-2";function j({message:s}){return s?e.jsx("span",{className:"break-words text-xs text-red-700",children:s}):null}function y({field:s,help:t}){return e.jsxs("div",{className:"min-w-0 sm:col-start-1",children:[e.jsx("code",{className:"text-sm font-medium text-[var(--otari-ink)]",children:s.key}),s.description?e.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:s.description}):null,t?e.jsx("p",{className:"mt-1 text-xs text-[var(--otari-muted)]",children:t}):null]})}function z({field:s,onSave:t,saveError:a,disabled:n}){const r=typeof s.value=="string"?s.value:"",[l,i]=x.useState(r),[m,p]=x.useState(null),c=R();x.useEffect(()=>{i(r)},[r]);const o=l.trim()!==r,d=l.trim(),h=m!==null&&m===d;return e.jsxs("div",{className:g,children:[e.jsx(y,{field:s,help:"Leave blank and Save to fall back to the configured default."}),e.jsx("input",{type:"text",inputMode:"url","aria-label":s.key,value:l,disabled:n,placeholder:"unset",onChange:v=>{i(v.target.value),c.reset()},className:_}),e.jsxs("div",{className:k,children:[e.jsx(b,{size:"sm",variant:"primary","aria-label":`Save ${s.key}`,isDisabled:n||!o,onPress:()=>t(d===""?null:d),children:"Save"}),e.jsx(b,{size:"sm",variant:"outline","aria-label":`Test ${s.service}`,isDisabled:d===""||c.isPending,onPress:()=>{p(d),c.mutate({service:s.service,url:d})},children:c.isPending?"Testing…":"Test"})]}),e.jsxs("div",{className:f,children:[e.jsx("span",{role:"status","aria-live":"polite",className:"block break-words text-xs",children:c.isPending||!h?null:c.error?e.jsx("span",{className:"text-red-700",children:w(c.error)}):c.data?e.jsx("span",{className:c.data.ok?"font-medium text-green-700":"text-red-700",children:c.data.reason}):null}),e.jsx(j,{message:a})]})]})}function G({field:s,onSave:t,saveError:a,disabled:n}){const r=typeof s.value=="string"?s.value:"",[l,i]=x.useState(r);x.useEffect(()=>{i(r)},[r]);const m=l!==r;return e.jsxs("div",{className:g,children:[e.jsx(y,{field:s}),e.jsx("input",{type:"text","aria-label":s.key,value:l,disabled:n,placeholder:"default",onChange:p=>i(p.target.value),className:_}),e.jsx("div",{className:k,children:e.jsx(b,{size:"sm",variant:"primary","aria-label":`Save ${s.key}`,isDisabled:n||!m,onPress:()=>t(l.trim()===""?null:l.trim()),children:"Save"})}),a?e.jsx("div",{className:f,children:e.jsx(j,{message:a})}):null]})}function I({field:s,onSave:t,saveError:a,disabled:n}){const r=typeof s.value=="number"?String(s.value):"",[l,i]=x.useState(r);x.useEffect(()=>{i(r)},[r]);const m=l.trim(),p=Number(m),o=(m===""||Number.isInteger(p)&&p>=1)&&m!==r;return e.jsxs("div",{className:g,children:[e.jsx(y,{field:s,help:"Leave blank to use the backend default."}),e.jsx("input",{type:"number",min:"1",step:"1",inputMode:"numeric","aria-label":s.key,value:l,disabled:n,placeholder:"default",onChange:d=>i(d.target.value),className:`w-full text-right tabular-nums sm:col-start-2 sm:w-28 sm:justify-self-end ${S}`}),e.jsx("div",{className:k,children:e.jsx(b,{size:"sm",variant:"primary","aria-label":`Save ${s.key}`,isDisabled:n||!o,onPress:()=>t(m===""?null:p),children:"Save"})}),a?e.jsx("div",{className:f,children:e.jsx(j,{message:a})}):null]})}function A({field:s,onSave:t,saveError:a,disabled:n}){const r=s.value===!0?"on":s.value===!1?"off":"default";return e.jsxs("div",{className:g,children:[e.jsx(y,{field:s}),e.jsx("div",{className:"sm:col-start-2 sm:justify-self-start",children:e.jsx(D,{ariaLabel:s.key,value:r,onChange:l=>t(l==="default"?null:l==="on"),options:[{value:"default",label:"Default"},{value:"on",label:"On"},{value:"off",label:"Off"}],disabled:n})}),a?e.jsx("div",{className:f,children:e.jsx(j,{message:a})}):null]})}function F({field:s,onSave:t,saveError:a,disabled:n}){return s.type==="url"?e.jsx(z,{field:s,onSave:t,saveError:a,disabled:n}):s.type==="int"?e.jsx(I,{field:s,onSave:t,saveError:a,disabled:n}):s.type==="bool"?e.jsx(A,{field:s,onSave:t,saveError:a,disabled:n}):e.jsx(G,{field:s,onSave:t,saveError:a,disabled:n})}function K(){const s=C(),t=L(),[a,n]=B(),[r,l]=x.useState({}),i=s.data,m=!i||t.isPending,p=new Map(((i==null?void 0:i.fields)??[]).map(o=>[o.key,o])),c=(o,d)=>{l(h=>{const{[o.key]:v,...u}=h;return u}),t.mutate(M(o.key,d),{onSuccess:()=>n(`${o.key} saved`),onError:h=>l(v=>({...v,[o.key]:w(h)}))})};return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(E,{title:"Tools & Guardrails",description:"Configure the built-in tool and guardrail service endpoints without a restart. Changes apply immediately and persist. URLs are validated for shape (http/https) and can be tested for reachability before saving; the network-safety gates for these services live on the Settings page."}),e.jsx(P,{error:s.error}),U.map(o=>{const d=o.order.map(u=>p.get(u)).filter(u=>u!==void 0),h=((i==null?void 0:i.fields)??[]).filter(u=>u.service===o.key&&!o.order.includes(u.key)),v=[...d,...h];return v.length===0?null:e.jsxs("section",{className:"flex flex-col gap-2",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:o.label}),e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:o.blurb}),e.jsx(N,{children:e.jsx(N.Content,{className:"flex flex-col divide-y divide-[var(--otari-line)] px-5 py-1",children:v.map(u=>e.jsx(F,{field:u,onSave:T=>c(u,T),saveError:r[u.key],disabled:m},u.key))})})]},o.key)}),e.jsx($,{message:a})]})}export{K as ToolsGuardrailsPage}; +import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as x}from"./react-dgEcD0HR.js";import{a8 as C,a9 as L,P as E,E as P,D as w,aa as R,F as D}from"./index-CGnfXTEF.js";import{d as N,B as b}from"./heroui-BI50yK5B.js";function M(s,t){return{[s]:t}}const U=[{key:"web_search",label:"Web search",blurb:"Backend for otari_web_search tools (a SearXNG instance or a search adapter).",order:["web_search_url","web_search_engines","web_search_max_results","web_search_extract","web_search_purpose_hint"]},{key:"sandbox",label:"Code execution",blurb:"Backend for otari_code_execution tools (the sandbox that runs generated code).",order:["sandbox_url","sandbox_purpose_hint"]},{key:"guardrails",label:"Guardrails",blurb:"Default input-guardrails service used when a request does not pass its own guardrail URL.",order:["guardrails_url"]}];function B(){const[s,t]=x.useState(null),a=x.useRef(void 0),n=r=>{t(r),window.clearTimeout(a.current),a.current=window.setTimeout(()=>t(null),2500)};return x.useEffect(()=>()=>window.clearTimeout(a.current),[]),[s,n]}function $({message:s}){return s?e.jsxs("div",{role:"status","aria-live":"polite",className:"fixed right-4 bottom-4 z-50 flex items-center gap-2 rounded-lg border border-green-200 bg-green-50 px-4 py-3 text-sm font-medium text-green-700 shadow-lg",children:[e.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2","aria-hidden":!0,className:"h-5 w-5",children:e.jsx("path",{d:"M20 6 9 17l-5-5",strokeLinecap:"round",strokeLinejoin:"round"})}),s]}):null}const S="rounded-md border border-[var(--otari-line)] bg-[var(--otari-surface)] px-2 py-1 text-sm focus:border-[var(--otari-brand)] focus:outline-none disabled:opacity-50",g="grid gap-x-4 gap-y-1.5 py-4 sm:grid-cols-[minmax(0,1fr)_16rem_10rem] sm:items-start",_=`w-full sm:col-start-2 ${S}`,k="flex items-center gap-2 sm:col-start-3",f="flex flex-col gap-1 sm:col-span-2 sm:col-start-2";function j({message:s}){return s?e.jsx("span",{className:"break-words text-xs text-red-700",children:s}):null}function y({field:s,help:t}){return e.jsxs("div",{className:"min-w-0 sm:col-start-1",children:[e.jsx("code",{className:"text-sm font-medium text-[var(--otari-ink)]",children:s.key}),s.description?e.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:s.description}):null,t?e.jsx("p",{className:"mt-1 text-xs text-[var(--otari-muted)]",children:t}):null]})}function z({field:s,onSave:t,saveError:a,disabled:n}){const r=typeof s.value=="string"?s.value:"",[l,i]=x.useState(r),[m,p]=x.useState(null),c=R();x.useEffect(()=>{i(r)},[r]);const o=l.trim()!==r,d=l.trim(),h=m!==null&&m===d;return e.jsxs("div",{className:g,children:[e.jsx(y,{field:s,help:"Leave blank and Save to fall back to the configured default."}),e.jsx("input",{type:"text",inputMode:"url","aria-label":s.key,value:l,disabled:n,placeholder:"unset",onChange:v=>{i(v.target.value),c.reset()},className:_}),e.jsxs("div",{className:k,children:[e.jsx(b,{size:"sm",variant:"primary","aria-label":`Save ${s.key}`,isDisabled:n||!o,onPress:()=>t(d===""?null:d),children:"Save"}),e.jsx(b,{size:"sm",variant:"outline","aria-label":`Test ${s.service}`,isDisabled:d===""||c.isPending,onPress:()=>{p(d),c.mutate({service:s.service,url:d})},children:c.isPending?"Testing…":"Test"})]}),e.jsxs("div",{className:f,children:[e.jsx("span",{role:"status","aria-live":"polite",className:"block break-words text-xs",children:c.isPending||!h?null:c.error?e.jsx("span",{className:"text-red-700",children:w(c.error)}):c.data?e.jsx("span",{className:c.data.ok?"font-medium text-green-700":"text-red-700",children:c.data.reason}):null}),e.jsx(j,{message:a})]})]})}function G({field:s,onSave:t,saveError:a,disabled:n}){const r=typeof s.value=="string"?s.value:"",[l,i]=x.useState(r);x.useEffect(()=>{i(r)},[r]);const m=l!==r;return e.jsxs("div",{className:g,children:[e.jsx(y,{field:s}),e.jsx("input",{type:"text","aria-label":s.key,value:l,disabled:n,placeholder:"default",onChange:p=>i(p.target.value),className:_}),e.jsx("div",{className:k,children:e.jsx(b,{size:"sm",variant:"primary","aria-label":`Save ${s.key}`,isDisabled:n||!m,onPress:()=>t(l.trim()===""?null:l.trim()),children:"Save"})}),a?e.jsx("div",{className:f,children:e.jsx(j,{message:a})}):null]})}function I({field:s,onSave:t,saveError:a,disabled:n}){const r=typeof s.value=="number"?String(s.value):"",[l,i]=x.useState(r);x.useEffect(()=>{i(r)},[r]);const m=l.trim(),p=Number(m),o=(m===""||Number.isInteger(p)&&p>=1)&&m!==r;return e.jsxs("div",{className:g,children:[e.jsx(y,{field:s,help:"Leave blank to use the backend default."}),e.jsx("input",{type:"number",min:"1",step:"1",inputMode:"numeric","aria-label":s.key,value:l,disabled:n,placeholder:"default",onChange:d=>i(d.target.value),className:`w-full text-right tabular-nums sm:col-start-2 sm:w-28 sm:justify-self-end ${S}`}),e.jsx("div",{className:k,children:e.jsx(b,{size:"sm",variant:"primary","aria-label":`Save ${s.key}`,isDisabled:n||!o,onPress:()=>t(m===""?null:p),children:"Save"})}),a?e.jsx("div",{className:f,children:e.jsx(j,{message:a})}):null]})}function A({field:s,onSave:t,saveError:a,disabled:n}){const r=s.value===!0?"on":s.value===!1?"off":"default";return e.jsxs("div",{className:g,children:[e.jsx(y,{field:s}),e.jsx("div",{className:"sm:col-start-2 sm:justify-self-start",children:e.jsx(D,{ariaLabel:s.key,value:r,onChange:l=>t(l==="default"?null:l==="on"),options:[{value:"default",label:"Default"},{value:"on",label:"On"},{value:"off",label:"Off"}],disabled:n})}),a?e.jsx("div",{className:f,children:e.jsx(j,{message:a})}):null]})}function F({field:s,onSave:t,saveError:a,disabled:n}){return s.type==="url"?e.jsx(z,{field:s,onSave:t,saveError:a,disabled:n}):s.type==="int"?e.jsx(I,{field:s,onSave:t,saveError:a,disabled:n}):s.type==="bool"?e.jsx(A,{field:s,onSave:t,saveError:a,disabled:n}):e.jsx(G,{field:s,onSave:t,saveError:a,disabled:n})}function K(){const s=C(),t=L(),[a,n]=B(),[r,l]=x.useState({}),i=s.data,m=!i||t.isPending,p=new Map(((i==null?void 0:i.fields)??[]).map(o=>[o.key,o])),c=(o,d)=>{l(h=>{const{[o.key]:v,...u}=h;return u}),t.mutate(M(o.key,d),{onSuccess:()=>n(`${o.key} saved`),onError:h=>l(v=>({...v,[o.key]:w(h)}))})};return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(E,{title:"Tools & Guardrails",description:"Configure the built-in tool and guardrail service endpoints without a restart. Changes apply immediately and persist. URLs are validated for shape (http/https) and can be tested for reachability before saving; the network-safety gates for these services live on the Settings page."}),e.jsx(P,{error:s.error}),U.map(o=>{const d=o.order.map(u=>p.get(u)).filter(u=>u!==void 0),h=((i==null?void 0:i.fields)??[]).filter(u=>u.service===o.key&&!o.order.includes(u.key)),v=[...d,...h];return v.length===0?null:e.jsxs("section",{className:"flex flex-col gap-2",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:o.label}),e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:o.blurb}),e.jsx(N,{children:e.jsx(N.Content,{className:"flex flex-col divide-y divide-[var(--otari-line)] px-5 py-1",children:v.map(u=>e.jsx(F,{field:u,onSave:T=>c(u,T),saveError:r[u.key],disabled:m},u.key))})})]},o.key)}),e.jsx($,{message:a})]})}export{K as ToolsGuardrailsPage}; diff --git a/src/gateway/static/dashboard/assets/UsagePage-BD35XJZn.js b/src/gateway/static/dashboard/assets/UsagePage-BD35XJZn.js deleted file mode 100644 index 3c91df7e..00000000 --- a/src/gateway/static/dashboard/assets/UsagePage-BD35XJZn.js +++ /dev/null @@ -1 +0,0 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{B as y,c as Me,S as ge}from"./heroui-DZj66Arc.js";import{i as Te,r as i}from"./react-dgEcD0HR.js";import{u as Le,a as qe,d as W,M as O,P as Fe,E as _e,g as X,S as D,O as E,N as Y,R as Oe,aa as K,e as Ee,f as Re,b as Ue,c as xe}from"./index-CI2beHfq.js";import{u as Ae,r as $e,B as Be}from"./tableSelection-CojkFPwd.js";import{S as ee,B as Ke}from"./charts-CuOShutR.js";import{C as ze}from"./ConfirmDialog-nzYO6eyy.js";import{D as je}from"./DataTable-CrQq0sYf.js";import{T as Ie,S as He}from"./TablePagination-ByewydW5.js";import"./recharts-D7kuKp97.js";function H(t){return t.toLocaleString()}function Ye(t){return t===null?"—":t<1e3?`${Math.round(t)} ms`:`${(t/1e3).toFixed(2)} s`}const Ze=3600,te=86400,I=[{label:"Last hour",seconds:Ze,bucket:"hour"},{label:"24h",seconds:te,bucket:"hour"},{label:"7d",seconds:7*te,bucket:"day"},{label:"30d",seconds:30*te,bucket:"day"},{label:"All",seconds:null,bucket:"day"}],se=I[3],ae=15;function ne(t){return new Date(Date.now()-t*1e3).toISOString()}const pe="__other__",fe="__unknown__";function ve({title:t,rows:r,totalCost:u,emptyLabel:o,onDrill:x,loading:d}){const[c,m]=i.useState(!1),k=c?r:r.slice(0,ae),M=r.length-k.length,w=n=>n.is_other?pe:n.key??fe,T=[{id:"name",header:t.replace("Spend by ",""),isRowHeader:!0,cell:n=>{const h=u>0?n.cost/u:0;return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("span",{className:"truncate text-[var(--otari-ink)]",children:n.is_other?`Other (${n.requests.toLocaleString()} req)`:n.key===null?"(unknown)":n.key}),e.jsx("span",{className:"h-1 w-full overflow-hidden rounded-full bg-[var(--otari-line)]",children:e.jsx("span",{className:"block h-full rounded-full bg-[var(--otari-brand)]",style:{width:`${Math.min(100,h*100)}%`}})})]})}},{id:"requests",header:"Requests",align:"end",cell:n=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:H(n.requests)})},{id:"spend",header:"Spend",align:"end",cell:n=>e.jsx("span",{className:"text-[var(--otari-ink)]",children:Y(n.cost)})}];return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:t}),e.jsx(je,{ariaLabel:t,columns:T,rows:k,getRowKey:w,isLoading:d,emptyContent:o,onRowAction:n=>{n!==pe&&n!==fe&&x(n)}}),!d&&M>0?e.jsxs(y,{size:"sm",variant:"ghost",onPress:()=>m(!0),children:["Show all ",r.length]}):null,!d&&c&&r.length>ae?e.jsxs(y,{size:"sm",variant:"ghost",onPress:()=>m(!1),children:["Show top ",ae]}):null]})}const Qe=[{key:"cost",label:"Cost"},{key:"tokens",label:"Tokens"},{key:"requests",label:"Requests"}];function Ve(t,r){return r==="cost"?t.cost:r==="tokens"?t.tokens:t.requests}function be(t,r){return r==="cost"?Y(t):r==="tokens"?K(t):H(t)}function Ge(t,r){const u=new Date(t);return Number.isNaN(u.getTime())?t:r==="hour"?u.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",timeZone:"UTC"}):u.toLocaleDateString(void 0,{month:"short",day:"numeric",timeZone:"UTC"})}function Je(t,r,u){const o=t.map(d=>({label:Ge(d.bucket_start,u),value:Ve(d,r)})),x=o.length?Math.max(...o.map(d=>d.value)):0;return{points:o,peak:x,count:t.length}}const We=50;function Xe(t){const r=new Date(t).getTime();if(Number.isNaN(r))return t;const u=Math.max(0,Math.round((Date.now()-r)/1e3));if(u<60)return`${u}s ago`;const o=Math.round(u/60);if(o<60)return`${o}m ago`;const x=Math.round(o/60);return x<24?`${x}h ago`:`${Math.round(x/24)}d ago`}function et({status:t}){return e.jsx("span",{className:`inline-flex items-center rounded-full border px-2 py-0.5 text-xs font-medium ${t==="error"?"border-red-200 bg-red-50 text-red-700":"border-[var(--otari-line)] bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]"}`,children:t})}const tt=[{id:"time",header:"Time",isRowHeader:!0,cell:t=>e.jsx("span",{className:"text-[var(--otari-muted)]",title:new Date(t.timestamp).toLocaleString(),children:Xe(t.timestamp)})},{id:"model",header:"Model",cell:t=>e.jsx("span",{className:"text-[var(--otari-ink)]",children:t.model})},{id:"user",header:"User",cell:t=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:t.user_id??"—"})},{id:"tokens",header:"Tokens",align:"end",cell:t=>t.total_tokens===null?"—":t.total_tokens.toLocaleString()},{id:"cost",header:"Cost",align:"end",cell:t=>t.cost===null?"—":Y(t.cost)},{id:"status",header:"Status",cell:t=>e.jsx(et,{status:t.status})}],st=t=>t.id;function at({filters:t,anyFilter:r}){var q,z;const[u,o]=i.useState(0),[x,d]=i.useState(We),c=Ae(),m=Ee(),k=Re(),[M,w]=i.useState(!1),[T,n]=i.useState(!1),h=JSON.stringify(t),R=i.useRef(h);i.useEffect(()=>{R.current!==h&&(R.current=h,o(0),c.clear())},[h,c]);const b=Ue(t,u,x),C=xe(t),p=b.data??[],P=C.isSuccess&&!C.isPlaceholderData?((q=C.data)==null?void 0:q.total)??0:null,U=p.filter(f=>!f.counts_toward_budget).map(f=>f.id),S=p.filter(f=>f.counts_toward_budget).map(f=>f.id),N=$e(c.selectedKeys,U),v=N.length,_=c.allMatching||v>0,A=i.useMemo(()=>({...t,counts_toward_budget:!1}),[t]),j=xe(A,_),L=j.isSuccess?((z=j.data)==null?void 0:z.total)??null:null,a=U.length>0&&v===U.length&&L!=null&&L>v,l=c.allMatching?L??v:v,$=()=>c.allMatching?{by_filter:!0,model:t.model,user_id:t.user_id,api_key_id:t.api_key_id,start_date:t.start_date,end_date:t.end_date,priced:t.priced}:{ids:N},Q=()=>m.mutate($(),{onSuccess:()=>{w(!1),c.clear()}}),re=f=>k.mutate({...$(),...f},{onSuccess:()=>{n(!1),c.clear()}});return e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Individual requests"}),e.jsx(_e,{error:b.error??C.error}),_?e.jsxs(Be,{selectedCount:l,allMatching:c.allMatching,matchingTotal:L,canSelectAllMatching:a,onSelectAllMatching:c.enableAllMatching,onClear:c.clear,children:[e.jsx(y,{size:"sm",variant:"primary",onPress:()=>n(!0),children:"Set price"}),e.jsx(y,{size:"sm",variant:"danger",onPress:()=>w(!0),children:"Delete"})]}):null,e.jsx(je,{ariaLabel:"Individual requests",columns:tt,rows:p,getRowKey:st,isLoading:b.isLoading,emptyContent:r?"No requests match these filters.":"No requests recorded yet.",selectionMode:"multiple",selectedKeys:c.selectedKeys,onSelectionChange:c.onSelectionChange,disabledKeys:S}),e.jsx(Ie,{page:u,pageSize:x,total:P,rowsOnPage:p.length,onPageChange:o,onPageSizeChange:f=>{d(f),o(0)},isFetching:b.isFetching,hasNextFallback:p.length===x}),e.jsx(ze,{isOpen:M,onOpenChange:w,heading:"Delete usage rows",body:`Delete ${l.toLocaleString()} imported ${l===1?"row":"rows"}? Only imported rows are removed, and this cannot be undone.`,confirmLabel:"Delete",isPending:m.isPending,error:m.error,onConfirm:Q}),e.jsx(He,{isOpen:T,onOpenChange:n,targetCount:l,isPending:k.isPending,error:k.error,onSubmit:re})]})}function gt(){var de,ue,me;const t=Te(),r=Le(),u=qe(),[o,x]=i.useState(se),[d,c]=i.useState(()=>se.seconds===null?void 0:ne(se.seconds)),[m,k]=i.useState(!1),[M,w]=i.useState(""),[T,n]=i.useState(""),[h,R]=i.useState(""),[b,C]=i.useState(""),[p,Z]=i.useState(""),[P,U]=i.useState("cost"),S=m?M||void 0:d,N=m&&T||void 0,v=m?"day":o.bucket,_=i.useMemo(()=>({start_date:S,end_date:N,model:h.trim()||void 0,user_id:b||void 0,api_key_id:p||void 0}),[S,N,h,b,p]),A=i.useMemo(()=>{if(m){if(!S||!N)return null;const s=new Date(N).getTime()-new Date(S).getTime();return s>0?{..._,start_date:new Date(new Date(S).getTime()-s).toISOString(),end_date:S}:null}return o.seconds===null||!d?null:{..._,start_date:new Date(new Date(d).getTime()-o.seconds*1e3).toISOString(),end_date:d}},[m,S,N,_,o.seconds,d]),j=W(_,v),L=W(A??_,v,A!==null),g=j.data,a=g==null?void 0:g.totals,l=A!==null?(de=L.data)==null?void 0:de.totals:void 0,$=a?O(a.cost,l==null?void 0:l.cost):null,Q=i.useMemo(()=>({..._,model:void 0}),[_]),q=((me=(ue=W(Q,v).data)==null?void 0:ue.by_model)==null?void 0:me.filter(s=>!s.is_other&&s.key!==null).map(s=>s.key))??[],z=(r.data??[]).map(s=>({value:s.user_id,label:s.alias?`${s.alias} (${s.user_id})`:s.user_id})),f=(u.data??[]).map(s=>({value:s.id,label:s.key_name??`${s.id.slice(0,8)}…`})),Se=(h&&!q.includes(h)?[h,...q]:q).map(s=>({value:s,label:s})),ye=m?!!(S||N):o.seconds!==null,B=!!(h.trim()||b||p||ye),[oe,ke]=i.useState(!1),le=[h.trim(),b,p].filter(Boolean).length,Ne=!!(g&&a&&a.request_count===0&&!B),ie=s=>{k(!1),x(s),c(s.seconds===null?void 0:ne(s.seconds))},we=()=>{ie(I[I.length-1]),w(""),n(""),R(""),C(""),Z("")},Ce=()=>{o.seconds!==null&&c(ne(o.seconds)),j.refetch()},ce=s=>{const J=new URLSearchParams;d&&J.set("start_date",d);for(const[De,he]of Object.entries(s))he&&J.set(De,he);t(`/activity?${J.toString()}`)},Pe=a&&a.request_count>0?a.error_count/a.request_count:0,F=(g==null?void 0:g.series)??[],V=F.length>1,G=Je(F,P,v);return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(Fe,{title:"Usage & analytics",description:"Aggregate spend, tokens, and request volume over time. Click a model or user to drill into the request log.",action:e.jsx(y,{variant:"outline",onPress:Ce,isDisabled:j.isFetching,children:"Refresh"})}),e.jsx(_e,{error:j.error}),e.jsxs("div",{className:"flex flex-wrap items-end gap-3",children:[e.jsxs("div",{className:"flex flex-wrap gap-2",children:[I.map(s=>e.jsx(y,{size:"sm",variant:!m&&o.label===s.label?"primary":"outline",onPress:()=>ie(s),children:s.label},s.label)),e.jsx(y,{size:"sm",variant:m?"primary":"outline",onPress:()=>k(!0),children:"Custom…"})]}),m?e.jsxs("div",{className:"flex flex-wrap items-end gap-2",children:[e.jsxs("label",{className:"flex flex-col gap-1 text-xs font-medium text-[var(--otari-muted)]",children:["From",e.jsx("input",{type:"datetime-local",value:M,onChange:s=>w(s.target.value),className:"rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-3 py-2 text-sm text-[var(--otari-ink)] focus:border-[var(--otari-brand)] focus:outline-none"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs font-medium text-[var(--otari-muted)]",children:["To",e.jsx("input",{type:"datetime-local",value:T,onChange:s=>n(s.target.value),className:"rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-3 py-2 text-sm text-[var(--otari-ink)] focus:border-[var(--otari-brand)] focus:outline-none"})]})]}):null,e.jsxs(y,{size:"sm",variant:"outline",className:"md:hidden",onPress:()=>ke(s=>!s),"aria-expanded":oe,"aria-controls":"usage-filters",children:["Filters",le?` (${le})`:""]}),e.jsxs("div",{id:"usage-filters",className:Me("flex-wrap items-end gap-3 md:flex",oe?"flex w-full md:w-auto":"hidden"),children:[e.jsx(X,{label:"User",value:b,onChange:C,options:z,placeholder:"All users"}),e.jsx(X,{label:"Model",value:h,onChange:R,options:Se,placeholder:"All models"}),e.jsx(X,{label:"API key",value:p,onChange:Z,options:f,placeholder:"All keys"}),B?e.jsx(y,{size:"sm",variant:"ghost",onPress:we,children:"Clear filters"}):null]})]}),Ne?e.jsx("div",{className:"rounded-xl border border-[var(--otari-line)] bg-[var(--otari-surface)] px-4 py-10 text-center text-sm text-[var(--otari-muted)]",children:"No usage yet. Once the gateway serves requests, spend and volume appear here."}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 sm:grid-cols-3 xl:grid-cols-4",children:[e.jsx(D,{label:"Tracked cost",value:a?Y(a.cost):"—",hint:a?e.jsxs("span",{className:"text-[var(--otari-muted)]",children:[e.jsx(E,{fraction:$}),a.unpriced_requests?`${$!==null?" · ":""}${H(a.unpriced_requests)} unpriced`:null]}):null,chart:V?e.jsx(ee,{values:F.map(s=>s.cost),ariaLabel:"Spend trend over the selected window"}):void 0}),e.jsx(D,{label:"Requests",value:a?H(a.request_count):"—",hint:a?e.jsxs("span",{className:"text-[var(--otari-muted)]",children:[Oe(Pe)," errors",l?e.jsxs(e.Fragment,{children:[" · ",e.jsx(E,{fraction:O(a.request_count,l.request_count)})]}):null]}):null,chart:V?e.jsx(ee,{values:F.map(s=>s.requests),ariaLabel:"Request volume trend over the selected window"}):void 0}),e.jsx(D,{label:"Tokens",value:a?K(a.total_tokens):"—",hint:a?e.jsx(E,{fraction:O(a.total_tokens,l==null?void 0:l.total_tokens)}):null,chart:V?e.jsx(ee,{values:F.map(s=>s.tokens),ariaLabel:"Token usage trend over the selected window"}):void 0}),e.jsx(D,{label:"Cache read",value:a?K(a.cache_read_tokens):"—",hint:a?e.jsx(E,{fraction:O(a.cache_read_tokens,l==null?void 0:l.cache_read_tokens)}):null}),e.jsx(D,{label:"Cache write",value:a?K(a.cache_write_tokens):"—",hint:a?e.jsx(E,{fraction:O(a.cache_write_tokens,l==null?void 0:l.cache_write_tokens)}):null}),e.jsx(D,{label:"1h cache write",value:a?K(a.cache_write_1h_tokens??0):"—",hint:a?e.jsx(E,{fraction:O(a.cache_write_1h_tokens??0,(l==null?void 0:l.cache_write_1h_tokens)??0)}):null}),e.jsx(D,{label:"Avg latency",value:a?Ye(a.avg_latency_ms):"—"})]}),e.jsxs("div",{className:"grid gap-6 lg:grid-cols-2",children:[e.jsx(ve,{title:"Spend by model",rows:(g==null?void 0:g.by_model)??[],totalCost:(a==null?void 0:a.cost)??0,emptyLabel:B?"No usage matches these filters.":"No usage recorded yet.",onDrill:s=>ce({model:s,user_id:b||void 0,api_key_id:p||void 0}),loading:j.isLoading}),e.jsx(ve,{title:"Spend by user",rows:(g==null?void 0:g.by_user)??[],totalCost:(a==null?void 0:a.cost)??0,emptyLabel:B?"No usage matches these filters.":"No usage recorded yet.",onDrill:s=>ce({user_id:s,model:h.trim()||void 0,api_key_id:p||void 0}),loading:j.isLoading})]}),e.jsx(at,{filters:_,anyFilter:B}),e.jsxs("div",{className:"flex flex-col gap-3 rounded-xl border border-[var(--otari-line)] bg-[var(--otari-surface)] p-4",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Over time"}),e.jsxs("div",{className:"inline-flex gap-1.5",children:[Qe.map(s=>e.jsx(y,{size:"sm",variant:P===s.key?"primary":"outline",onPress:()=>U(s.key),children:s.label},s.key)),j.isFetching?e.jsx(ge,{size:"sm"}):null]})]}),j.isLoading?e.jsx("div",{className:"flex h-48 items-center justify-center",children:e.jsx(ge,{size:"sm"})}):F.length===0?e.jsx("div",{className:"flex h-48 items-center justify-center text-sm text-[var(--otari-muted)]",children:"No data in this range."}):e.jsxs("figure",{className:"flex flex-col gap-2",children:[e.jsx(Ke,{data:G.points,formatValue:s=>be(s,P),ariaLabel:`${P} per ${v}`}),e.jsxs("figcaption",{className:"text-xs text-[var(--otari-muted)]",children:[be(G.peak,P)," peak · ",G.count," ",v==="hour"?"hours":"days"," (times in UTC)"]})]})]})]})]})}export{gt as UsagePage}; diff --git a/src/gateway/static/dashboard/assets/UsagePage-BECQyz4e.js b/src/gateway/static/dashboard/assets/UsagePage-BECQyz4e.js new file mode 100644 index 00000000..8a667745 --- /dev/null +++ b/src/gateway/static/dashboard/assets/UsagePage-BECQyz4e.js @@ -0,0 +1 @@ +import{j as e}from"./tanstack-query-1t81HyiD.js";import{i as Ue,r as i}from"./react-dgEcD0HR.js";import{u as Ae,a as Re,d as Q,M as F,P as Oe,E as ye,R as Ke,g as te,S as E,O as T,N as W,T as $e,ab as B,e as Be,f as Ie,b as ze,c as xe}from"./index-CGnfXTEF.js";import{i as se,c as He,U as ke,A as Ge,d as je,F as Ye,f as Ze}from"./FilterChips-Wo8I8zEd.js";import{u as Qe,r as Ve,B as We}from"./tableSelection-9hV37uhu.js";import{S as ae,B as Je}from"./charts-DIsd9m--.js";import{C as Xe}from"./ConfirmDialog-CWW3AYpK.js";import{D as we}from"./DataTable-Bmn_eYSV.js";import{T as et,S as tt}from"./TablePagination-r1AimUKf.js";import{B as I,S as pe}from"./heroui-BI50yK5B.js";import"./recharts-C4kRDmvS.js";function V(t){return t.toLocaleString()}function st(t){return t===null?"—":t<1e3?`${Math.round(t)} ms`:`${(t/1e3).toFixed(2)} s`}const fe=Ze(je,ke),ne=15,_e="__other__",ve="__unknown__";function Se({title:t,rows:r,totalCost:h,emptyLabel:n,onDrill:_,loading:m}){const[c,x]=i.useState(!1),j=c?r:r.slice(0,ne),U=r.length-j.length,N=o=>o.is_other?_e:o.key??ve,A=[{id:"name",header:t.replace("Spend by ",""),isRowHeader:!0,cell:o=>{const d=h>0?o.cost/h:0;return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("span",{className:"truncate text-[var(--otari-ink)]",children:o.is_other?`Other (${o.requests.toLocaleString()} req)`:o.key===null?"(unknown)":o.key}),e.jsx("span",{className:"h-1 w-full overflow-hidden rounded-full bg-[var(--otari-line)]",children:e.jsx("span",{className:"block h-full rounded-full bg-[var(--otari-brand)]",style:{width:`${Math.min(100,d*100)}%`}})})]})}},{id:"requests",header:"Requests",align:"end",cell:o=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:V(o.requests)})},{id:"spend",header:"Spend",align:"end",cell:o=>e.jsx("span",{className:"text-[var(--otari-ink)]",children:W(o.cost)})}];return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:t}),e.jsx(we,{ariaLabel:t,columns:A,rows:j,getRowKey:N,isLoading:m,emptyContent:n,onRowAction:o=>{o!==_e&&o!==ve&&_(o)}}),!m&&U>0?e.jsxs(I,{size:"sm",variant:"ghost",onPress:()=>x(!0),children:["Show all ",r.length]}):null,!m&&c&&r.length>ne?e.jsxs(I,{size:"sm",variant:"ghost",onPress:()=>x(!1),children:["Show top ",ne]}):null]})}const at=[{key:"cost",label:"Cost"},{key:"tokens",label:"Tokens"},{key:"requests",label:"Requests"}];function nt(t,r){return r==="cost"?t.cost:r==="tokens"?t.tokens:t.requests}function be(t,r){return r==="cost"?W(t):r==="tokens"?B(t):V(t)}function ot(t,r){const h=new Date(t);return Number.isNaN(h.getTime())?t:r==="hour"?h.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",timeZone:"UTC"}):h.toLocaleDateString(void 0,{month:"short",day:"numeric",timeZone:"UTC"})}function rt(t,r,h){const n=t.map(m=>({label:ot(m.bucket_start,h),value:nt(m,r)})),_=n.length?Math.max(...n.map(m=>m.value)):0;return{points:n,peak:_,count:t.length}}const lt=50;function it(t){const r=new Date(t).getTime();if(Number.isNaN(r))return t;const h=Math.max(0,Math.round((Date.now()-r)/1e3));if(h<60)return`${h}s ago`;const n=Math.round(h/60);if(n<60)return`${n}m ago`;const _=Math.round(n/60);return _<24?`${_}h ago`:`${Math.round(_/24)}d ago`}function ct({status:t}){return e.jsx("span",{className:`inline-flex items-center rounded-full border px-2 py-0.5 text-xs font-medium ${t==="error"?"border-red-200 bg-red-50 text-red-700":"border-[var(--otari-line)] bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]"}`,children:t})}const dt=[{id:"time",header:"Time",isRowHeader:!0,cell:t=>e.jsx("span",{className:"text-[var(--otari-muted)]",title:new Date(t.timestamp).toLocaleString(),children:it(t.timestamp)})},{id:"model",header:"Model",cell:t=>e.jsx("span",{className:"text-[var(--otari-ink)]",children:t.model})},{id:"user",header:"User",cell:t=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:t.user_id??"—"})},{id:"tokens",header:"Tokens",align:"end",cell:t=>t.total_tokens===null?"—":t.total_tokens.toLocaleString()},{id:"cost",header:"Cost",align:"end",cell:t=>t.cost===null?"—":W(t.cost)},{id:"status",header:"Status",cell:t=>e.jsx(ct,{status:t.status})}],ut=t=>t.id;function mt({filters:t,anyFilter:r}){var $,H;const[h,n]=i.useState(0),[_,m]=i.useState(lt),c=Qe(),x=Be(),j=Ie(),[U,N]=i.useState(!1),[A,o]=i.useState(!1),d=JSON.stringify(t),q=i.useRef(d);i.useEffect(()=>{q.current!==d&&(q.current=d,n(0),c.clear())},[d,c]);const p=ze(t,h,_),C=xe(t),g=p.data??[],P=C.isSuccess&&!C.isPlaceholderData?(($=C.data)==null?void 0:$.total)??0:null,R=g.filter(y=>!y.counts_toward_budget).map(y=>y.id),f=g.filter(y=>y.counts_toward_budget).map(y=>y.id),v=Ve(c.selectedKeys,R),S=v.length,k=c.allMatching||S>0,O=i.useMemo(()=>({...t,counts_toward_budget:!1}),[t]),b=xe(O,k),L=b.isSuccess?((H=b.data)==null?void 0:H.total)??null:null,K=R.length>0&&S===R.length&&L!=null&&L>S,M=c.allMatching?L??S:S,l=()=>c.allMatching?{by_filter:!0,model:t.model,user_id:t.user_id,api_key_id:t.api_key_id,start_date:t.start_date,end_date:t.end_date,priced:t.priced}:{ids:v},a=()=>x.mutate(l(),{onSuccess:()=>{N(!1),c.clear()}}),u=y=>j.mutate({...l(),...y},{onSuccess:()=>{o(!1),c.clear()}});return e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Individual requests"}),e.jsx(ye,{error:p.error??C.error}),k?e.jsxs(We,{selectedCount:M,allMatching:c.allMatching,matchingTotal:L,canSelectAllMatching:K,onSelectAllMatching:c.enableAllMatching,onClear:c.clear,children:[e.jsx(I,{size:"sm",variant:"primary",onPress:()=>o(!0),children:"Set price"}),e.jsx(I,{size:"sm",variant:"danger",onPress:()=>N(!0),children:"Delete"})]}):null,e.jsx(we,{ariaLabel:"Individual requests",columns:dt,rows:g,getRowKey:ut,isLoading:p.isLoading,emptyContent:r?"No requests match these filters.":"No requests recorded yet.",selectionMode:"multiple",selectedKeys:c.selectedKeys,onSelectionChange:c.onSelectionChange,disabledKeys:f}),e.jsx(et,{page:h,pageSize:_,total:P,rowsOnPage:g.length,onPageChange:n,onPageSizeChange:y=>{m(y),n(0)},isFetching:p.isFetching,hasNextFallback:g.length===_}),e.jsx(Xe,{isOpen:U,onOpenChange:N,heading:"Delete usage rows",body:`Delete ${M.toLocaleString()} imported ${M===1?"row":"rows"}? Only imported rows are removed, and this cannot be undone.`,confirmLabel:"Delete",isPending:x.isPending,error:x.error,onConfirm:a}),e.jsx(tt,{isOpen:A,onOpenChange:o,targetCount:M,isPending:j.isPending,error:j.error,onSubmit:u})]})}function jt(){var ue,me,he,ge;const t=Ue(),r=Ae(),h=Re(),[n,_]=i.useState(fe),[m,c]=i.useState(()=>se(fe.seconds??0)),[x,j]=i.useState(!1),[U,N]=i.useState(),[A,o]=i.useState(),[d,q]=i.useState(""),[p,C]=i.useState(""),[g,z]=i.useState(""),[P,R]=i.useState("cost"),f=x?U:m,v=x?A:void 0,S=x?f?He(f,v):"day":n.bucket,k=i.useMemo(()=>({start_date:f,end_date:v,model:d.trim()||void 0,user_id:p||void 0,api_key_id:g||void 0}),[f,v,d,p,g]),O=i.useMemo(()=>{if(x){if(!f||!v)return null;const s=new Date(v).getTime()-new Date(f).getTime();return s>0?{...k,start_date:new Date(new Date(f).getTime()-s).toISOString(),end_date:f}:null}return!m||n.seconds===null?null:{...k,start_date:new Date(new Date(m).getTime()-n.seconds*1e3).toISOString(),end_date:m}},[x,f,v,k,n.seconds,m]),b=Q(k,S),L=Q(O??k,S,O!==null),oe=i.useMemo(()=>({start_date:m,model:d.trim()||void 0,user_id:p||void 0,api_key_id:g||void 0}),[m,d,p,g]),K=Q(oe,n.bucket),M=(((ue=K.data)==null?void 0:ue.series)??[]).map(s=>({bucketStart:s.bucket_start,requests:s.requests})),l=b.data,a=l==null?void 0:l.totals,u=O!==null?(me=L.data)==null?void 0:me.totals:void 0,$=a?F(a.cost,u==null?void 0:u.cost):null,H=i.useMemo(()=>({...k,model:void 0}),[k]),J=((ge=(he=Q(H,S).data)==null?void 0:he.by_model)==null?void 0:ge.filter(s=>!s.is_other&&s.key!==null).map(s=>s.key))??[],re=(r.data??[]).map(s=>({value:s.user_id,label:s.alias?`${s.alias} (${s.user_id})`:s.user_id})),le=(h.data??[]).map(s=>({value:s.id,label:s.key_name??`${s.id.slice(0,8)}…`})),Ne=(d&&!J.includes(d)?[d,...J]:J).map(s=>({value:s,label:s})),Ce=x||n.key!==ke,G=!!(d.trim()||p||g||Ce),ie=(s,w)=>{var Y;return((Y=s.find(Z=>Z.value===w))==null?void 0:Y.label)??w},Pe=()=>{q(""),C(""),z("")},Ee=[...p?[{key:"user",label:"User",value:ie(re,p),onClear:()=>C("")}]:[],...d.trim()?[{key:"model",label:"Model",value:d.trim(),onClear:()=>q("")}]:[],...g?[{key:"key",label:"API key",value:ie(le,g),onClear:()=>z("")}]:[]],qe=!!(l&&a&&a.request_count===0&&!G),Le=(l==null?void 0:l.start_date)??f,Me=(l==null?void 0:l.end_date)??v,ce=s=>{j(!1),_(s),c(se(s.seconds??0)),N(void 0),o(void 0)},De=(s,w)=>{j(!0),N(s),o(w)},Fe=()=>{x||c(se(n.seconds??0)),b.refetch(),K.refetch()},de=s=>{const w=new URLSearchParams;f&&w.set("start_date",f),v&&w.set("end_date",v);for(const[Y,Z]of Object.entries(s))Z&&w.set(Y,Z);t(`/activity?${w.toString()}`)},Te=a&&a.request_count>0?a.error_count/a.request_count:0,D=(l==null?void 0:l.series)??[],X=D.length>1,ee=rt(D,P,S);return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(Oe,{title:"Usage & analytics",description:"Aggregate spend, tokens, and request volume over time. Click a model or user to drill into the request log."}),e.jsx(ye,{error:b.error}),e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx(Ge,{presets:je,extentKey:n.key,onPreset:ce,onSelectRange:De,onSelectFull:()=>ce(n),series:M,bucket:n.bucket,windowStart:Le,windowEnd:Me,loading:K.isLoading,ariaLabel:"Usage request volume over the selected window",action:e.jsx(Ke,{onRefresh:Fe,isFetching:b.isFetching,updatedAt:b.dataUpdatedAt})}),e.jsxs(Ye,{chips:Ee,onClearAll:Pe,children:[e.jsx(te,{label:"User",value:p,onChange:C,options:re,placeholder:"All users"}),e.jsx(te,{label:"Model",value:d,onChange:q,options:Ne,placeholder:"All models"}),e.jsx(te,{label:"API key",value:g,onChange:z,options:le,placeholder:"All keys"})]})]}),qe?e.jsx("div",{className:"rounded-xl border border-[var(--otari-line)] bg-[var(--otari-surface)] px-4 py-10 text-center text-sm text-[var(--otari-muted)]",children:"No usage yet. Once the gateway serves requests, spend and volume appear here."}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 sm:grid-cols-3 xl:grid-cols-4",children:[e.jsx(E,{label:"Tracked cost",value:a?W(a.cost):"—",hint:a?e.jsxs("span",{className:"text-[var(--otari-muted)]",children:[e.jsx(T,{fraction:$}),a.unpriced_requests?`${$!==null?" · ":""}${V(a.unpriced_requests)} unpriced`:null]}):null,chart:X?e.jsx(ae,{values:D.map(s=>s.cost),ariaLabel:"Spend trend over the selected window"}):void 0}),e.jsx(E,{label:"Requests",value:a?V(a.request_count):"—",hint:a?e.jsxs("span",{className:"text-[var(--otari-muted)]",children:[$e(Te)," errors",u?e.jsxs(e.Fragment,{children:[" · ",e.jsx(T,{fraction:F(a.request_count,u.request_count)})]}):null]}):null,chart:X?e.jsx(ae,{values:D.map(s=>s.requests),ariaLabel:"Request volume trend over the selected window"}):void 0}),e.jsx(E,{label:"Tokens",value:a?B(a.total_tokens):"—",hint:a?e.jsx(T,{fraction:F(a.total_tokens,u==null?void 0:u.total_tokens)}):null,chart:X?e.jsx(ae,{values:D.map(s=>s.tokens),ariaLabel:"Token usage trend over the selected window"}):void 0}),e.jsx(E,{label:"Cache read",value:a?B(a.cache_read_tokens):"—",hint:a?e.jsx(T,{fraction:F(a.cache_read_tokens,u==null?void 0:u.cache_read_tokens)}):null}),e.jsx(E,{label:"Cache write",value:a?B(a.cache_write_tokens):"—",hint:a?e.jsx(T,{fraction:F(a.cache_write_tokens,u==null?void 0:u.cache_write_tokens)}):null}),e.jsx(E,{label:"1h cache write",value:a?B(a.cache_write_1h_tokens??0):"—",hint:a?e.jsx(T,{fraction:F(a.cache_write_1h_tokens??0,(u==null?void 0:u.cache_write_1h_tokens)??0)}):null}),e.jsx(E,{label:"Avg latency",value:a?st(a.avg_latency_ms):"—"})]}),e.jsxs("div",{className:"grid gap-6 lg:grid-cols-2",children:[e.jsx(Se,{title:"Spend by model",rows:(l==null?void 0:l.by_model)??[],totalCost:(a==null?void 0:a.cost)??0,emptyLabel:G?"No usage matches these filters.":"No usage recorded yet.",onDrill:s=>de({model:s,user_id:p||void 0,api_key_id:g||void 0}),loading:b.isLoading}),e.jsx(Se,{title:"Spend by user",rows:(l==null?void 0:l.by_user)??[],totalCost:(a==null?void 0:a.cost)??0,emptyLabel:G?"No usage matches these filters.":"No usage recorded yet.",onDrill:s=>de({user_id:s,model:d.trim()||void 0,api_key_id:g||void 0}),loading:b.isLoading})]}),e.jsx(mt,{filters:k,anyFilter:G}),e.jsxs("div",{className:"flex flex-col gap-3 rounded-xl border border-[var(--otari-line)] bg-[var(--otari-surface)] p-4",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Over time"}),e.jsxs("div",{className:"inline-flex gap-1.5",children:[at.map(s=>e.jsx(I,{size:"sm",variant:P===s.key?"primary":"outline",onPress:()=>R(s.key),children:s.label},s.key)),b.isFetching?e.jsx(pe,{size:"sm"}):null]})]}),b.isLoading?e.jsx("div",{className:"flex h-48 items-center justify-center",children:e.jsx(pe,{size:"sm"})}):D.length===0?e.jsx("div",{className:"flex h-48 items-center justify-center text-sm text-[var(--otari-muted)]",children:"No data in this range."}):e.jsxs("figure",{className:"flex flex-col gap-2",children:[e.jsx(Je,{data:ee.points,formatValue:s=>be(s,P),ariaLabel:`${P} per ${S}`}),e.jsxs("figcaption",{className:"text-xs text-[var(--otari-muted)]",children:[be(ee.peak,P)," peak · ",ee.count," ",S==="hour"?"hours":"days"," (times in UTC)"]})]})]})]})]})}export{jt as UsagePage}; diff --git a/src/gateway/static/dashboard/assets/UsersPage-CbRblpp_.js b/src/gateway/static/dashboard/assets/UsersPage-CAU0FXTt.js similarity index 95% rename from src/gateway/static/dashboard/assets/UsersPage-CbRblpp_.js rename to src/gateway/static/dashboard/assets/UsersPage-CAU0FXTt.js index a895e18c..99bab785 100644 --- a/src/gateway/static/dashboard/assets/UsersPage-CbRblpp_.js +++ b/src/gateway/static/dashboard/assets/UsersPage-CAU0FXTt.js @@ -1 +1 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{r}from"./react-dgEcD0HR.js";import{u as Q,l as M,p as K,ab as X,P as Y,E as S,ac as Z,F as ee}from"./index-CI2beHfq.js";import{u as se,r as te,B as ae}from"./tableSelection-CojkFPwd.js";import{C as ne}from"./ConfirmDialog-nzYO6eyy.js";import{D as re}from"./DataTable-CrQq0sYf.js";import{F as B}from"./Field-DEJ6Wjg9.js";import{a as le,M as R}from"./ModelScopeControl-L-_tKOtj.js";import{f as I,B as d,d as y,A as f}from"./heroui-DZj66Arc.js";const ie=new Intl.NumberFormat(void 0,{style:"currency",currency:"USD",maximumFractionDigits:4});function U(t){return ie.format(t)}const de=t=>t.user_id,D=t=>t.startsWith("apikey-");function H(t){return t.split("-")[0]}function F(t){return t.name??H(t.budget_id)}function $({value:t,onChange:l,budgets:n}){return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("label",{htmlFor:"user-budget",className:"text-sm font-medium text-[var(--otari-ink)]",children:"Budget"}),e.jsxs("select",{id:"user-budget",value:t??"",onChange:a=>l(a.target.value||null),className:"w-full rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-3 py-2 text-sm text-[var(--otari-ink)]",children:[e.jsx("option",{value:"",children:"No budget (unlimited)"}),n.map(a=>e.jsxs("option",{value:a.budget_id,children:[F(a),a.max_budget===null?" · no limit":` · ${U(a.max_budget)}`]},a.budget_id))]}),e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"The spending limit this user is held to. Manage budgets on the Budgets page."})]})}function oe({onClose:t}){const l=Z(),n=M(),[a,i]=r.useState(""),[o,u]=r.useState(""),[c,m]=r.useState(null),[p,g]=r.useState(null),[j,b]=r.useState(!0),x=()=>{if(l.isPending||!j||a.trim()==="")return;const h={user_id:a.trim(),alias:o.trim()||null,budget_id:c,allowed_models:p};l.mutate(h,{onSuccess:t})};return e.jsx(y,{children:e.jsxs(y.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsx("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Create user"}),e.jsx(S,{error:l.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(B,{label:"User ID",value:a,onChange:i,placeholder:"alice@example.com",isRequired:!0,autoFocus:!0,description:"The identifier callers send as the `user` field; spend and budgets track against it."}),e.jsx(B,{label:"Alias (optional)",value:o,onChange:u,placeholder:"Alice"})]}),e.jsx($,{value:c,onChange:m,budgets:n.data??[]}),e.jsx(R,{title:"Model access (default for this user's keys)",description:"The models this user's keys may list and call by default. A key can narrow this, but never exceed it.",initial:null,onChange:(h,P)=>{g(h),b(P)}}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(d,{variant:"primary",isDisabled:l.isPending||!j||a.trim()==="",onPress:x,children:l.isPending?"Creating…":"Create user"}),e.jsx(d,{variant:"ghost",onPress:t,children:"Cancel"})]})]})})}function ce({user:t,onClose:l}){const n=K(),a=M(),[i,o]=r.useState(t.alias??""),[u,c]=r.useState(t.budget_id),[m,p]=r.useState(t.allowed_models),[g,j]=r.useState(!0),b=()=>{if(n.isPending||!g)return;const x={alias:i.trim()||null,budget_id:u,allowed_models:m};n.mutate({id:t.user_id,body:x},{onSuccess:l})};return e.jsx(y,{children:e.jsxs(y.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsxs("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:["Edit ",e.jsx("code",{children:t.user_id})]}),e.jsx(S,{error:n.error}),e.jsx(B,{label:"Alias",value:i,onChange:o,placeholder:"Alice"}),e.jsx($,{value:u,onChange:c,budgets:a.data??[]}),e.jsx(R,{title:"Model access (default for this user's keys)",description:"The models this user's keys may list and call by default. A key can narrow this, but never exceed it.",initial:t.allowed_models,onChange:(x,h)=>{p(x),j(h)}}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(d,{variant:"primary",isDisabled:n.isPending||!g,onPress:b,children:n.isPending?"Saving…":"Save changes"}),e.jsx(d,{variant:"ghost",onPress:l,children:"Cancel"})]})]})})}function ue({trigger:t,message:l,confirmLabel:n,isPending:a,onConfirm:i}){const[o,u]=r.useState(!1);return o?e.jsxs("div",{className:"flex flex-col items-end gap-1.5 rounded-lg border border-amber-200 bg-amber-50 p-2 text-right",children:[e.jsx("span",{className:"max-w-xs text-xs text-amber-800",children:l}),e.jsxs("span",{className:"inline-flex gap-1",children:[e.jsx(d,{size:"sm",variant:"danger",isDisabled:a,onPress:i,children:n}),e.jsx(d,{size:"sm",variant:"ghost",isDisabled:a,onPress:()=>u(!1),children:"Cancel"})]})]}):e.jsx(d,{size:"sm",variant:"danger-soft",onPress:()=>u(!0),children:t})}function me({user:t}){return t.blocked?e.jsx(I,{size:"sm",color:"warning",children:"Blocked"}):e.jsx(I,{size:"sm",color:"accent",children:"Active"})}function ge({allowed:t}){const{text:l,tone:n}=le(t),a=n==="danger"?"text-red-700 font-medium":n==="muted"?"text-[var(--otari-muted)]":"text-[var(--otari-brand-dark)] font-medium",i=t&&t.length>0?t.join(", "):void 0;return e.jsx("span",{className:`text-xs ${a}`,title:i,children:l})}function xe({onCreate:t}){return e.jsx(y,{children:e.jsxs(y.Content,{className:"flex flex-col gap-4 p-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:"No users yet"}),e.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:"A user owns API keys and carries the budget and default model access those keys inherit. Create a user here, then issue its keys on the API keys page."})]}),e.jsx("div",{children:e.jsx(d,{variant:"primary",onPress:t,children:"Create your first user"})})]})})}function he({isOpen:t,onOpenChange:l,budgets:n,count:a,isPending:i,error:o,onAssign:u}){const[c,m]=r.useState("");return r.useEffect(()=>{t&&m("")},[t]),e.jsx(f,{isOpen:t,onOpenChange:l,children:t?e.jsx(f.Backdrop,{children:e.jsx(f.Container,{placement:"center",size:"md",children:e.jsxs(f.Dialog,{children:[e.jsx(f.Header,{children:e.jsx(f.Heading,{children:"Assign budget"})}),e.jsxs(f.Body,{className:"flex flex-col gap-4",children:[e.jsxs("p",{className:"text-sm text-[var(--otari-muted)]",children:["Assign a budget to ",a," selected ",a===1?"user":"users","."]}),e.jsx(ee,{label:"Budget",value:c,onChange:m,options:[{value:"",label:"Select a budget…"},...n.map(p=>({value:p.budget_id,label:F(p)}))]}),e.jsx(S,{error:o})]}),e.jsxs(f.Footer,{children:[e.jsx(d,{variant:"ghost",isDisabled:i,onPress:()=>l(!1),children:"Cancel"}),e.jsx(d,{variant:"primary",isDisabled:!c,isPending:i,onPress:()=>u(c),children:"Assign"})]})]})})}):null})}function Pe(){const t=Q(),l=M(),n=K(),a=X(),[i,o]=r.useState(!1),[u,c]=r.useState(null),[m,p]=r.useState(!1),g=t.data??[],j=t.isLoading,b=g.filter(s=>D(s.user_id)).length,x=m?g:g.filter(s=>!D(s.user_id)),h=g.find(s=>s.user_id===u)??null,P=!j&&x.length===0&&!i,A=r.useMemo(()=>new Map((l.data??[]).map(s=>[s.budget_id,s])),[l.data]),C=se(),[q,_]=r.useState(!1),[W,N]=r.useState(!1),[z,E]=r.useState(void 0),[T,O]=r.useState(!1),G=x.map(s=>s.user_id),v=te(C.selectedKeys,G),L=r.useCallback((s,k)=>n.mutate({id:s.user_id,body:{blocked:k}}),[n.mutate]),V=async(s,k)=>{O(!0),E(void 0);try{for(const w of v)await s(w);C.clear(),k()}catch(w){E(w)}finally{O(!1)}},J=r.useMemo(()=>[{id:"user",header:"User",isRowHeader:!0,cell:s=>e.jsxs("div",{className:"flex flex-col gap-0.5",children:[e.jsxs("span",{className:"inline-flex items-center gap-1.5",children:[e.jsx("code",{className:"text-xs font-medium text-[var(--otari-ink)]",children:s.user_id}),D(s.user_id)?e.jsx(I,{size:"sm",color:"default",children:"virtual"}):null]}),s.alias?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:s.alias}):null]})},{id:"status",header:"Status",cell:s=>e.jsx(me,{user:s})},{id:"budget",header:"Budget",cell:s=>s.budget_id?e.jsx("span",{className:"text-[var(--otari-muted)]",title:s.budget_id,children:A.get(s.budget_id)?F(A.get(s.budget_id)):H(s.budget_id)}):e.jsx("span",{className:"text-[var(--otari-muted)]",children:"—"})},{id:"spend",header:"Spend",cell:s=>e.jsxs("span",{className:"text-[var(--otari-muted)]",children:[U(s.spend),s.reserved>0?e.jsxs("span",{children:[" (+",U(s.reserved)," held)"]}):null]})},{id:"access",header:"Model access",cell:s=>e.jsx(ge,{allowed:s.allowed_models})},{id:"actions",header:"Actions",align:"end",cell:s=>e.jsxs("div",{className:"flex items-center justify-end gap-1.5",children:[e.jsx(d,{size:"sm",variant:"outline",isDisabled:n.isPending,onPress:()=>L(s,!s.blocked),children:s.blocked?"Unblock":"Block"}),e.jsx(d,{size:"sm",variant:"ghost",onPress:()=>{o(!1),c(s.user_id)},children:"Edit"}),e.jsx(ue,{trigger:"Delete",confirmLabel:"Delete user",isPending:a.isPending,message:e.jsxs(e.Fragment,{children:["Delete ",e.jsx("strong",{children:s.user_id}),"? This deactivates its API keys and hides the user; usage history is preserved."]}),onConfirm:()=>a.mutate(s.user_id)})]})}],[A,n.isPending,a.isPending,a.mutate,L]);return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(Y,{title:"Users",description:"People and teams that own API keys. Set each one's budget and default model access here; issue their keys on the API keys page.",action:i?null:e.jsx(d,{variant:"primary",onPress:()=>{c(null),o(!0)},children:"Create user"})}),e.jsx(S,{error:t.error??n.error??a.error}),P?e.jsx(xe,{onCreate:()=>{c(null),o(!0)}}):null,b>0?e.jsxs("label",{className:"flex w-fit items-center gap-2 text-xs text-[var(--otari-muted)]",children:[e.jsx("input",{type:"checkbox",checked:m,onChange:s=>p(s.target.checked)}),"Show auto-created (virtual) users (",b,")"]}):null,i?e.jsx(oe,{onClose:()=>o(!1)}):null,h?e.jsx(ce,{user:h,onClose:()=>c(null)},h.user_id):null,v.length>0?e.jsxs(ae,{selectedCount:v.length,allMatching:!1,matchingTotal:null,canSelectAllMatching:!1,onSelectAllMatching:()=>{},onClear:C.clear,children:[e.jsx(d,{size:"sm",variant:"primary",onPress:()=>N(!0),children:"Assign budget"}),e.jsx(d,{size:"sm",variant:"danger",onPress:()=>_(!0),children:"Delete"})]}):null,e.jsx(re,{ariaLabel:"Users",columns:J,rows:x,getRowKey:de,isLoading:j,emptyContent:"No users yet. Create one, or create an API key to auto-create one.",selectionMode:"multiple",selectedKeys:C.selectedKeys,onSelectionChange:C.onSelectionChange}),e.jsx(ne,{isOpen:q,onOpenChange:_,heading:"Delete users",body:`Delete ${v.length} ${v.length===1?"user":"users"}? This deactivates their API keys and hides them; usage history is preserved.`,confirmLabel:"Delete",isPending:T,error:z,onConfirm:()=>V(s=>a.mutateAsync(s),()=>_(!1))}),e.jsx(he,{isOpen:W,onOpenChange:N,budgets:l.data??[],count:v.length,isPending:T,error:z,onAssign:s=>V(k=>n.mutateAsync({id:k,body:{budget_id:s}}),()=>N(!1))})]})}export{Pe as UsersPage}; +import{j as e}from"./tanstack-query-1t81HyiD.js";import{r}from"./react-dgEcD0HR.js";import{u as Q,l as M,p as K,ac as X,P as Y,E as S,ad as Z,F as ee}from"./index-CGnfXTEF.js";import{u as se,r as te,B as ae}from"./tableSelection-9hV37uhu.js";import{C as ne}from"./ConfirmDialog-CWW3AYpK.js";import{D as re}from"./DataTable-Bmn_eYSV.js";import{F as B}from"./Field-Dwp6u3t8.js";import{a as le,M as R}from"./ModelScopeControl-DmfR9Ylv.js";import{f as I,B as d,d as y,A as f}from"./heroui-BI50yK5B.js";const ie=new Intl.NumberFormat(void 0,{style:"currency",currency:"USD",maximumFractionDigits:4});function U(t){return ie.format(t)}const de=t=>t.user_id,D=t=>t.startsWith("apikey-");function H(t){return t.split("-")[0]}function F(t){return t.name??H(t.budget_id)}function $({value:t,onChange:l,budgets:n}){return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("label",{htmlFor:"user-budget",className:"text-sm font-medium text-[var(--otari-ink)]",children:"Budget"}),e.jsxs("select",{id:"user-budget",value:t??"",onChange:a=>l(a.target.value||null),className:"w-full rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-3 py-2 text-sm text-[var(--otari-ink)]",children:[e.jsx("option",{value:"",children:"No budget (unlimited)"}),n.map(a=>e.jsxs("option",{value:a.budget_id,children:[F(a),a.max_budget===null?" · no limit":` · ${U(a.max_budget)}`]},a.budget_id))]}),e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"The spending limit this user is held to. Manage budgets on the Budgets page."})]})}function oe({onClose:t}){const l=Z(),n=M(),[a,i]=r.useState(""),[o,u]=r.useState(""),[c,m]=r.useState(null),[p,g]=r.useState(null),[j,b]=r.useState(!0),x=()=>{if(l.isPending||!j||a.trim()==="")return;const h={user_id:a.trim(),alias:o.trim()||null,budget_id:c,allowed_models:p};l.mutate(h,{onSuccess:t})};return e.jsx(y,{children:e.jsxs(y.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsx("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Create user"}),e.jsx(S,{error:l.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(B,{label:"User ID",value:a,onChange:i,placeholder:"alice@example.com",isRequired:!0,autoFocus:!0,description:"The identifier callers send as the `user` field; spend and budgets track against it."}),e.jsx(B,{label:"Alias (optional)",value:o,onChange:u,placeholder:"Alice"})]}),e.jsx($,{value:c,onChange:m,budgets:n.data??[]}),e.jsx(R,{title:"Model access (default for this user's keys)",description:"The models this user's keys may list and call by default. A key can narrow this, but never exceed it.",initial:null,onChange:(h,P)=>{g(h),b(P)}}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(d,{variant:"primary",isDisabled:l.isPending||!j||a.trim()==="",onPress:x,children:l.isPending?"Creating…":"Create user"}),e.jsx(d,{variant:"ghost",onPress:t,children:"Cancel"})]})]})})}function ce({user:t,onClose:l}){const n=K(),a=M(),[i,o]=r.useState(t.alias??""),[u,c]=r.useState(t.budget_id),[m,p]=r.useState(t.allowed_models),[g,j]=r.useState(!0),b=()=>{if(n.isPending||!g)return;const x={alias:i.trim()||null,budget_id:u,allowed_models:m};n.mutate({id:t.user_id,body:x},{onSuccess:l})};return e.jsx(y,{children:e.jsxs(y.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsxs("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:["Edit ",e.jsx("code",{children:t.user_id})]}),e.jsx(S,{error:n.error}),e.jsx(B,{label:"Alias",value:i,onChange:o,placeholder:"Alice"}),e.jsx($,{value:u,onChange:c,budgets:a.data??[]}),e.jsx(R,{title:"Model access (default for this user's keys)",description:"The models this user's keys may list and call by default. A key can narrow this, but never exceed it.",initial:t.allowed_models,onChange:(x,h)=>{p(x),j(h)}}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(d,{variant:"primary",isDisabled:n.isPending||!g,onPress:b,children:n.isPending?"Saving…":"Save changes"}),e.jsx(d,{variant:"ghost",onPress:l,children:"Cancel"})]})]})})}function ue({trigger:t,message:l,confirmLabel:n,isPending:a,onConfirm:i}){const[o,u]=r.useState(!1);return o?e.jsxs("div",{className:"flex flex-col items-end gap-1.5 rounded-lg border border-amber-200 bg-amber-50 p-2 text-right",children:[e.jsx("span",{className:"max-w-xs text-xs text-amber-800",children:l}),e.jsxs("span",{className:"inline-flex gap-1",children:[e.jsx(d,{size:"sm",variant:"danger",isDisabled:a,onPress:i,children:n}),e.jsx(d,{size:"sm",variant:"ghost",isDisabled:a,onPress:()=>u(!1),children:"Cancel"})]})]}):e.jsx(d,{size:"sm",variant:"danger-soft",onPress:()=>u(!0),children:t})}function me({user:t}){return t.blocked?e.jsx(I,{size:"sm",color:"warning",children:"Blocked"}):e.jsx(I,{size:"sm",color:"accent",children:"Active"})}function ge({allowed:t}){const{text:l,tone:n}=le(t),a=n==="danger"?"text-red-700 font-medium":n==="muted"?"text-[var(--otari-muted)]":"text-[var(--otari-brand-dark)] font-medium",i=t&&t.length>0?t.join(", "):void 0;return e.jsx("span",{className:`text-xs ${a}`,title:i,children:l})}function xe({onCreate:t}){return e.jsx(y,{children:e.jsxs(y.Content,{className:"flex flex-col gap-4 p-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:"No users yet"}),e.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:"A user owns API keys and carries the budget and default model access those keys inherit. Create a user here, then issue its keys on the API keys page."})]}),e.jsx("div",{children:e.jsx(d,{variant:"primary",onPress:t,children:"Create your first user"})})]})})}function he({isOpen:t,onOpenChange:l,budgets:n,count:a,isPending:i,error:o,onAssign:u}){const[c,m]=r.useState("");return r.useEffect(()=>{t&&m("")},[t]),e.jsx(f,{isOpen:t,onOpenChange:l,children:t?e.jsx(f.Backdrop,{children:e.jsx(f.Container,{placement:"center",size:"md",children:e.jsxs(f.Dialog,{children:[e.jsx(f.Header,{children:e.jsx(f.Heading,{children:"Assign budget"})}),e.jsxs(f.Body,{className:"flex flex-col gap-4",children:[e.jsxs("p",{className:"text-sm text-[var(--otari-muted)]",children:["Assign a budget to ",a," selected ",a===1?"user":"users","."]}),e.jsx(ee,{label:"Budget",value:c,onChange:m,options:[{value:"",label:"Select a budget…"},...n.map(p=>({value:p.budget_id,label:F(p)}))]}),e.jsx(S,{error:o})]}),e.jsxs(f.Footer,{children:[e.jsx(d,{variant:"ghost",isDisabled:i,onPress:()=>l(!1),children:"Cancel"}),e.jsx(d,{variant:"primary",isDisabled:!c,isPending:i,onPress:()=>u(c),children:"Assign"})]})]})})}):null})}function Pe(){const t=Q(),l=M(),n=K(),a=X(),[i,o]=r.useState(!1),[u,c]=r.useState(null),[m,p]=r.useState(!1),g=t.data??[],j=t.isLoading,b=g.filter(s=>D(s.user_id)).length,x=m?g:g.filter(s=>!D(s.user_id)),h=g.find(s=>s.user_id===u)??null,P=!j&&x.length===0&&!i,A=r.useMemo(()=>new Map((l.data??[]).map(s=>[s.budget_id,s])),[l.data]),C=se(),[q,_]=r.useState(!1),[W,N]=r.useState(!1),[z,E]=r.useState(void 0),[T,O]=r.useState(!1),G=x.map(s=>s.user_id),v=te(C.selectedKeys,G),L=r.useCallback((s,k)=>n.mutate({id:s.user_id,body:{blocked:k}}),[n.mutate]),V=async(s,k)=>{O(!0),E(void 0);try{for(const w of v)await s(w);C.clear(),k()}catch(w){E(w)}finally{O(!1)}},J=r.useMemo(()=>[{id:"user",header:"User",isRowHeader:!0,cell:s=>e.jsxs("div",{className:"flex flex-col gap-0.5",children:[e.jsxs("span",{className:"inline-flex items-center gap-1.5",children:[e.jsx("code",{className:"text-xs font-medium text-[var(--otari-ink)]",children:s.user_id}),D(s.user_id)?e.jsx(I,{size:"sm",color:"default",children:"virtual"}):null]}),s.alias?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:s.alias}):null]})},{id:"status",header:"Status",cell:s=>e.jsx(me,{user:s})},{id:"budget",header:"Budget",cell:s=>s.budget_id?e.jsx("span",{className:"text-[var(--otari-muted)]",title:s.budget_id,children:A.get(s.budget_id)?F(A.get(s.budget_id)):H(s.budget_id)}):e.jsx("span",{className:"text-[var(--otari-muted)]",children:"—"})},{id:"spend",header:"Spend",cell:s=>e.jsxs("span",{className:"text-[var(--otari-muted)]",children:[U(s.spend),s.reserved>0?e.jsxs("span",{children:[" (+",U(s.reserved)," held)"]}):null]})},{id:"access",header:"Model access",cell:s=>e.jsx(ge,{allowed:s.allowed_models})},{id:"actions",header:"Actions",align:"end",cell:s=>e.jsxs("div",{className:"flex items-center justify-end gap-1.5",children:[e.jsx(d,{size:"sm",variant:"outline",isDisabled:n.isPending,onPress:()=>L(s,!s.blocked),children:s.blocked?"Unblock":"Block"}),e.jsx(d,{size:"sm",variant:"ghost",onPress:()=>{o(!1),c(s.user_id)},children:"Edit"}),e.jsx(ue,{trigger:"Delete",confirmLabel:"Delete user",isPending:a.isPending,message:e.jsxs(e.Fragment,{children:["Delete ",e.jsx("strong",{children:s.user_id}),"? This deactivates its API keys and hides the user; usage history is preserved."]}),onConfirm:()=>a.mutate(s.user_id)})]})}],[A,n.isPending,a.isPending,a.mutate,L]);return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(Y,{title:"Users",description:"People and teams that own API keys. Set each one's budget and default model access here; issue their keys on the API keys page.",action:i?null:e.jsx(d,{variant:"primary",onPress:()=>{c(null),o(!0)},children:"Create user"})}),e.jsx(S,{error:t.error??n.error??a.error}),P?e.jsx(xe,{onCreate:()=>{c(null),o(!0)}}):null,b>0?e.jsxs("label",{className:"flex w-fit items-center gap-2 text-xs text-[var(--otari-muted)]",children:[e.jsx("input",{type:"checkbox",checked:m,onChange:s=>p(s.target.checked)}),"Show auto-created (virtual) users (",b,")"]}):null,i?e.jsx(oe,{onClose:()=>o(!1)}):null,h?e.jsx(ce,{user:h,onClose:()=>c(null)},h.user_id):null,v.length>0?e.jsxs(ae,{selectedCount:v.length,allMatching:!1,matchingTotal:null,canSelectAllMatching:!1,onSelectAllMatching:()=>{},onClear:C.clear,children:[e.jsx(d,{size:"sm",variant:"primary",onPress:()=>N(!0),children:"Assign budget"}),e.jsx(d,{size:"sm",variant:"danger",onPress:()=>_(!0),children:"Delete"})]}):null,e.jsx(re,{ariaLabel:"Users",columns:J,rows:x,getRowKey:de,isLoading:j,emptyContent:"No users yet. Create one, or create an API key to auto-create one.",selectionMode:"multiple",selectedKeys:C.selectedKeys,onSelectionChange:C.onSelectionChange}),e.jsx(ne,{isOpen:q,onOpenChange:_,heading:"Delete users",body:`Delete ${v.length} ${v.length===1?"user":"users"}? This deactivates their API keys and hides them; usage history is preserved.`,confirmLabel:"Delete",isPending:T,error:z,onConfirm:()=>V(s=>a.mutateAsync(s),()=>_(!1))}),e.jsx(he,{isOpen:W,onOpenChange:N,budgets:l.data??[],count:v.length,isPending:T,error:z,onAssign:s=>V(k=>n.mutateAsync({id:k,body:{budget_id:s}}),()=>N(!1))})]})}export{Pe as UsersPage}; diff --git a/src/gateway/static/dashboard/assets/charts-CuOShutR.js b/src/gateway/static/dashboard/assets/charts-DIsd9m--.js similarity index 91% rename from src/gateway/static/dashboard/assets/charts-CuOShutR.js rename to src/gateway/static/dashboard/assets/charts-DIsd9m--.js index c50d5aba..aa810c13 100644 --- a/src/gateway/static/dashboard/assets/charts-CuOShutR.js +++ b/src/gateway/static/dashboard/assets/charts-DIsd9m--.js @@ -1 +1 @@ -import{j as a}from"./tanstack-query-1t81HyiD.js";import{R as l,L as d,a as c,B as m,X as u,T as x,b as f}from"./recharts-D7kuKp97.js";const o="var(--otari-brand)";function v({active:e,label:i,payload:t,formatValue:r}){var n;const s=(n=t==null?void 0:t[0])==null?void 0:n.value;return!e||typeof s!="number"?null:a.jsxs("div",{className:"rounded-md border border-[var(--otari-line)] bg-[var(--otari-surface)] px-2 py-1 text-xs shadow-sm",children:[a.jsx("div",{className:"text-[var(--otari-muted)]",children:i}),a.jsx("div",{className:"font-medium tabular-nums text-[var(--otari-ink)]",children:r(s)})]})}function p({data:e,formatValue:i,ariaLabel:t,height:r=200}){return a.jsx("div",{role:"img","aria-label":t,className:"w-full",children:a.jsx(l,{width:"100%",height:r,children:a.jsxs(m,{data:e,margin:{top:4,right:4,left:4,bottom:0},children:[a.jsx(u,{dataKey:"label",tickLine:!1,axisLine:!1,interval:"preserveStartEnd",minTickGap:24,tick:{fontSize:10,fill:"var(--otari-muted)"}}),a.jsx(x,{cursor:{fill:"var(--otari-line)",opacity:.35},content:a.jsx(v,{formatValue:i})}),a.jsx(f,{dataKey:"value",fill:o,radius:[2,2,0,0],isAnimationActive:!1})]})})})}function b({values:e,ariaLabel:i,height:t=32}){const r=e.map((s,n)=>({index:n,value:s}));return a.jsx("div",{role:"img","aria-label":i,className:"w-full",children:a.jsx(l,{width:"100%",height:t,children:a.jsx(d,{data:r,margin:{top:2,right:2,left:2,bottom:2},children:a.jsx(c,{type:"monotone",dataKey:"value",stroke:o,strokeWidth:1.5,dot:!1,isAnimationActive:!1})})})})}export{p as B,b as S}; +import{j as a}from"./tanstack-query-1t81HyiD.js";import{R as l,L as d,b as c,B as m,X as u,T as x,a as f}from"./recharts-C4kRDmvS.js";const o="var(--otari-brand)";function v({active:e,label:i,payload:t,formatValue:r}){var n;const s=(n=t==null?void 0:t[0])==null?void 0:n.value;return!e||typeof s!="number"?null:a.jsxs("div",{className:"rounded-md border border-[var(--otari-line)] bg-[var(--otari-surface)] px-2 py-1 text-xs shadow-sm",children:[a.jsx("div",{className:"text-[var(--otari-muted)]",children:i}),a.jsx("div",{className:"font-medium tabular-nums text-[var(--otari-ink)]",children:r(s)})]})}function p({data:e,formatValue:i,ariaLabel:t,height:r=200}){return a.jsx("div",{role:"img","aria-label":t,className:"w-full",children:a.jsx(l,{width:"100%",height:r,children:a.jsxs(m,{data:e,margin:{top:4,right:4,left:4,bottom:0},children:[a.jsx(u,{dataKey:"label",tickLine:!1,axisLine:!1,interval:"preserveStartEnd",minTickGap:24,tick:{fontSize:10,fill:"var(--otari-muted)"}}),a.jsx(x,{cursor:{fill:"var(--otari-line)",opacity:.35},content:a.jsx(v,{formatValue:i})}),a.jsx(f,{dataKey:"value",fill:o,radius:[2,2,0,0],isAnimationActive:!1})]})})})}function b({values:e,ariaLabel:i,height:t=32}){const r=e.map((s,n)=>({index:n,value:s}));return a.jsx("div",{role:"img","aria-label":i,className:"w-full",children:a.jsx(l,{width:"100%",height:t,children:a.jsx(d,{data:r,margin:{top:2,right:2,left:2,bottom:2},children:a.jsx(c,{type:"monotone",dataKey:"value",stroke:o,strokeWidth:1.5,dot:!1,isAnimationActive:!1})})})})}export{p as B,b as S}; diff --git a/src/gateway/static/dashboard/assets/heroui-BI50yK5B.js b/src/gateway/static/dashboard/assets/heroui-BI50yK5B.js new file mode 100644 index 00000000..af7769d5 --- /dev/null +++ b/src/gateway/static/dashboard/assets/heroui-BI50yK5B.js @@ -0,0 +1,20 @@ +var Ko=t=>{throw TypeError(t)};var Ro=(t,e,n)=>e.has(t)||Ko("Cannot "+n);var Mo=(t,e,n)=>(Ro(t,e,"read from private field"),n?n.call(t):e.get(t)),Fo=(t,e,n)=>e.has(t)?Ko("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,n),wl=(t,e,n,l)=>(Ro(t,e,"write to private field"),l?l.call(t,n):e.set(t,n),n);import{r as s,$ as x,a as kr,b as du,c as Cp}from"./react-dgEcD0HR.js";import{j as I}from"./tanstack-query-1t81HyiD.js";const Ep="react-aria-clear-focus",wp="react-aria-focus";function ol(t){var n;if(typeof window>"u"||window.navigator==null)return!1;let e=(n=window.navigator.userAgentData)==null?void 0:n.brands;return Array.isArray(e)&&e.some(l=>t.test(l.brand))||t.test(window.navigator.userAgent)}function Pr(t){var e;return typeof window<"u"&&window.navigator!=null?t.test(((e=window.navigator.userAgentData)==null?void 0:e.platform)||window.navigator.platform):!1}function rt(t){let e=null;return()=>(e==null&&(e=t()),e)}const $t=rt(function(){return Pr(/^Mac/i)}),Sp=rt(function(){return Pr(/^iPhone/i)}),fu=rt(function(){return Pr(/^iPad/i)||$t()&&navigator.maxTouchPoints>1}),vt=rt(function(){return Sp()||fu()}),jn=rt(function(){return $t()||vt()}),pu=rt(function(){return ol(/AppleWebKit/i)&&!bu()}),bu=rt(function(){return ol(/Chrome/i)}),an=rt(function(){return ol(/Android/i)}),Dp=rt(function(){return ol(/Firefox/i)});function Ne(t){if(kp())t.focus({preventScroll:!0});else{let e=Pp(t);t.focus(),Tp(e)}}let Bn=null;function kp(){if(Bn==null){Bn=!1;try{document.createElement("div").focus({get preventScroll(){return Bn=!0,!0}})}catch{}}return Bn}function Pp(t){let e=t.parentNode,n=[],l=document.scrollingElement||document.documentElement;for(;e instanceof HTMLElement&&e!==l;)(e.offsetHeightt});function Ot(){return s.useContext(Ap)}function Bp(t,e){let n=t.getAttribute("target");return(!n||n==="_self")&&t.origin===location.origin&&!t.hasAttribute("download")&&!e.metaKey&&!e.ctrlKey&&!e.altKey&&!e.shiftKey}function tt(t,e,n=!0){var a,c;let{metaKey:l,ctrlKey:r,altKey:o,shiftKey:i}=e;Dp()&&((c=(a=window.event)==null?void 0:a.type)!=null&&c.startsWith("key"))&&t.target==="_blank"&&($t()?l=!0:r=!0);let u=pu()&&$t()&&!fu()?new KeyboardEvent("keydown",{keyIdentifier:"Enter",metaKey:l,ctrlKey:r,altKey:o,shiftKey:i}):new MouseEvent("click",{metaKey:l,ctrlKey:r,altKey:o,shiftKey:i,detail:1,bubbles:!0,cancelable:!0});tt.isOpening=n,Ne(t),t.dispatchEvent(u),tt.isOpening=!1}tt.isOpening=!1;function Kp(t,e){if(t instanceof HTMLAnchorElement)e(t);else if(t.hasAttribute("data-href")){let n=document.createElement("a");n.href=t.getAttribute("data-href"),t.hasAttribute("data-target")&&(n.target=t.getAttribute("data-target")),t.hasAttribute("data-rel")&&(n.rel=t.getAttribute("data-rel")),t.hasAttribute("data-download")&&(n.download=t.getAttribute("data-download")),t.hasAttribute("data-ping")&&(n.ping=t.getAttribute("data-ping")),t.hasAttribute("data-referrer-policy")&&(n.referrerPolicy=t.getAttribute("data-referrer-policy")),t.appendChild(n),e(n),t.removeChild(n)}}function Rp(t,e){Kp(t,n=>tt(n,e))}function Mp(t){const n=Ot().useHref(t.href??"");return{"data-href":t.href?n:void 0,"data-target":t.target,"data-rel":t.rel,"data-download":t.download,"data-ping":t.ping,"data-referrer-policy":t.referrerPolicy}}function hu(t){const n=Ot().useHref((t==null?void 0:t.href)??"");let l={};if(t)for(let r of["href","target","rel","download","ping","referrerPolicy"])r in t&&(l[r]=r==="href"?n:t[r]);return l}function Fp(t,e,n,l){!e.isNative&&t.currentTarget instanceof HTMLAnchorElement&&t.currentTarget.href&&!t.isDefaultPrevented()&&Bp(t.currentTarget,t)&&n&&(t.preventDefault(),e.open(t.currentTarget,t,n,l))}const le=typeof document<"u"?x.useLayoutEffect:()=>{},mu={prefix:String(Math.round(Math.random()*1e10)),current:0},gu=x.createContext(mu),Ip=x.createContext(!1);let Sl=new WeakMap;function Lp(t=!1){var l,r;let e=s.useContext(gu),n=s.useRef(null);if(n.current===null&&!t){let o=(r=(l=x.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED)==null?void 0:l.ReactCurrentOwner)==null?void 0:r.current;if(o){let i=Sl.get(o);i==null?Sl.set(o,{id:e.current,state:o.memoizedState}):o.memoizedState!==i.state&&(e.current=i.id,Sl.delete(o))}n.current=++e.current}return n.current}function zp(t){let e=s.useContext(gu),n=Lp(!!t),l=`react-aria${e.prefix}`;return t||`${l}-${n}`}function Np(t){let e=x.useId(),[n]=s.useState(dt()),l=n?"react-aria":`react-aria${mu.prefix}`;return t||`${l}-${e}`}const Vp=typeof x.useId=="function"?Np:zp;function Op(){return!1}function jp(){return!0}function _p(t){return()=>{}}function dt(){return typeof x.useSyncExternalStore=="function"?x.useSyncExternalStore(_p,Op,jp):s.useContext(Ip)}function Hp(t){let[e,n]=s.useState(t),l=s.useRef(e),r=s.useRef(null),o=s.useRef(()=>{if(!r.current)return;let u=r.current.next();if(u.done){r.current=null;return}l.current===u.value?o.current():n(u.value)});le(()=>{l.current=e,r.current&&o.current()});let i=s.useCallback(u=>{r.current=u(l.current),o.current()},[o]);return[e,i]}let Wp=!!(typeof window<"u"&&window.document&&window.document.createElement),Rt=new Map,Jt;typeof FinalizationRegistry<"u"&&(Jt=new FinalizationRegistry(t=>{Rt.delete(t)}));function $e(t){let[e,n]=s.useState(t),l=s.useRef(null),r=Vp(e),o=s.useRef(null);if(Jt&&Jt.register(o,r),Wp){const i=Rt.get(r);i&&!i.includes(l)?i.push(l):Rt.set(r,[l])}return le(()=>{let i=r;return()=>{Jt&&Jt.unregister(o),Rt.delete(i)}},[r]),s.useEffect(()=>{let i=l.current;return i&&n(i),()=>{i&&(l.current=null)}}),r}function Up(t,e){if(t===e)return t;let n=Rt.get(t);if(n)return n.forEach(r=>r.current=e),e;let l=Rt.get(e);return l?(l.forEach(r=>r.current=t),t):e}function sn(t=[]){let e=$e(),[n,l]=Hp(e),r=s.useCallback(()=>{l(function*(){yield e,yield document.getElementById(e)?e:void 0})},[e,l]);return le(r,[e,r,...t]),n}function ft(...t){return(...e)=>{for(let n of t)typeof n=="function"&&n(...e)}}const re=t=>(t==null?void 0:t.ownerDocument)??document,Se=t=>t&&"window"in t&&t.window===t?t:re(t).defaultView||window;function Gp(t){return t!==null&&typeof t=="object"&&"nodeType"in t&&typeof t.nodeType=="number"}function qp(t){return Gp(t)&&t.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&"host"in t}let Zp=!1;function Qe(){return Zp}function ne(t,e){if(!Qe())return e&&t?t.contains(e):!1;if(!t||!e)return!1;let n=e;for(;n!==null;){if(n===t)return!0;n.tagName==="SLOT"&&n.assignedSlot?n=n.assignedSlot.parentNode:qp(n)?n=n.host:n=n.parentNode}return!1}const ie=(t=document)=>{var n;if(!Qe())return t.activeElement;let e=t.activeElement;for(;e&&"shadowRoot"in e&&((n=e.shadowRoot)!=null&&n.activeElement);)e=e.shadowRoot.activeElement;return e};function U(t){if(Qe()&&t.target instanceof Element&&t.target.shadowRoot){if("composedPath"in t)return t.composedPath()[0]??null;if("composedPath"in t.nativeEvent)return t.nativeEvent.composedPath()[0]??null}return t.target}function xt(t){if(!t)return!1;let e=t.getRootNode(),n=Se(t);if(!(e instanceof n.Document||e instanceof n.ShadowRoot))return!1;let l=e.activeElement;return l!=null&&t.contains(l)}class Yp{constructor(e,n,l,r){this._walkerStack=[],this._currentSetFor=new Set,this._acceptNode=i=>{var u;if(i.nodeType===Node.ELEMENT_NODE){const a=i.shadowRoot;if(a){const c=this._doc.createTreeWalker(a,this.whatToShow,{acceptNode:this._acceptNode});return this._walkerStack.unshift(c),NodeFilter.FILTER_ACCEPT}else{if(typeof this.filter=="function")return this.filter(i);if((u=this.filter)!=null&&u.acceptNode)return this.filter.acceptNode(i);if(this.filter===null)return NodeFilter.FILTER_ACCEPT}}return NodeFilter.FILTER_SKIP},this._doc=e,this.root=n,this.filter=r??null,this.whatToShow=l??NodeFilter.SHOW_ALL,this._currentNode=n,this._walkerStack.unshift(e.createTreeWalker(n,l,this._acceptNode));const o=n.shadowRoot;if(o){const i=this._doc.createTreeWalker(o,this.whatToShow,{acceptNode:this._acceptNode});this._walkerStack.unshift(i)}}get currentNode(){return this._currentNode}set currentNode(e){if(!ne(this.root,e))throw new Error("Cannot set currentNode to a node that is not contained by the root node.");const n=[];let l=e,r=e;for(this._currentNode=e;l&&l!==this.root;)if(l.nodeType===Node.DOCUMENT_FRAGMENT_NODE){const i=l,u=this._doc.createTreeWalker(i,this.whatToShow,{acceptNode:this._acceptNode});n.push(u),u.currentNode=r,this._currentSetFor.add(u),l=r=i.host}else l=l.parentNode;const o=this._doc.createTreeWalker(this.root,this.whatToShow,{acceptNode:this._acceptNode});n.push(o),o.currentNode=r,this._currentSetFor.add(o),this._walkerStack=n}get doc(){return this._doc}firstChild(){let e=this.currentNode,n=this.nextNode();return ne(e,n)?(n&&(this.currentNode=n),n):(this.currentNode=e,null)}lastChild(){let n=this._walkerStack[0].lastChild();return n&&(this.currentNode=n),n}nextNode(){var n;const e=this._walkerStack[0].nextNode();if(e){if(e.shadowRoot){let r;if(typeof this.filter=="function"?r=this.filter(e):(n=this.filter)!=null&&n.acceptNode&&(r=this.filter.acceptNode(e)),r===NodeFilter.FILTER_ACCEPT)return this.currentNode=e,e;let o=this.nextNode();return o&&(this.currentNode=o),o}return e&&(this.currentNode=e),e}else if(this._walkerStack.length>1){this._walkerStack.shift();let l=this.nextNode();return l&&(this.currentNode=l),l}else return null}previousNode(){var l;const e=this._walkerStack[0];if(e.currentNode===e.root){if(this._currentSetFor.has(e))if(this._currentSetFor.delete(e),this._walkerStack.length>1){this._walkerStack.shift();let r=this.previousNode();return r&&(this.currentNode=r),r}else return null;return null}const n=e.previousNode();if(n){if(n.shadowRoot){let o;if(typeof this.filter=="function"?o=this.filter(n):(l=this.filter)!=null&&l.acceptNode&&(o=this.filter.acceptNode(n)),o===NodeFilter.FILTER_ACCEPT)return n&&(this.currentNode=n),n;let i=this.lastChild();return i&&(this.currentNode=i),i}return n&&(this.currentNode=n),n}else if(this._walkerStack.length>1){this._walkerStack.shift();let r=this.previousNode();return r&&(this.currentNode=r),r}else return null}nextSibling(){return null}previousSibling(){return null}parentNode(){return null}}function yu(t,e,n,l){return Qe()?new Yp(t,e,n,l):t.createTreeWalker(e,n,l)}function pt(...t){return t.length===1&&t[0]?t[0]:e=>{let n=!1;const l=t.map(r=>{const o=Io(r,e);return n||(n=typeof o=="function"),o});if(n)return()=>{l.forEach((r,o)=>{typeof r=="function"?r():Io(t[o],null)})}}}function Io(t,e){if(typeof t=="function")return t(e);t!=null&&(t.current=e)}function $u(t){var e,n,l="";if(typeof t=="string"||typeof t=="number")l+=t;else if(typeof t=="object")if(Array.isArray(t)){var r=t.length;for(e=0;e=65&&r.charCodeAt(2)<=90?e[r]=ft(o,i):(r==="className"||r==="UNSAFE_className")&&typeof o=="string"&&typeof i=="string"?e[r]=Xp(o,i):r==="id"&&o&&i?e.id=Up(o,i):r==="ref"&&o&&i?e.ref=pt(o,i):e[r]=i!==void 0?i:o}}return e}const Jp=new Set(["id"]),Qp=new Set(["aria-label","aria-labelledby","aria-describedby","aria-details"]),eb=new Set(["href","hrefLang","target","rel","download","ping","referrerPolicy"]),tb=new Set(["dir","lang","hidden","inert","translate"]),Lo=new Set(["onClick","onAuxClick","onContextMenu","onDoubleClick","onMouseDown","onMouseEnter","onMouseLeave","onMouseMove","onMouseOut","onMouseOver","onMouseUp","onTouchCancel","onTouchEnd","onTouchMove","onTouchStart","onPointerDown","onPointerMove","onPointerUp","onPointerCancel","onPointerEnter","onPointerLeave","onPointerOver","onPointerOut","onGotPointerCapture","onLostPointerCapture","onScroll","onWheel","onAnimationStart","onAnimationEnd","onAnimationIteration","onTransitionCancel","onTransitionEnd","onTransitionRun","onTransitionStart"]),nb=/^(data-.*)$/;function oe(t,e={}){let{labelable:n,isLink:l,global:r,events:o=r,propNames:i}=e,u={};for(const a in t)Object.prototype.hasOwnProperty.call(t,a)&&(Jp.has(a)||n&&Qp.has(a)||l&&eb.has(a)||r&&tb.has(a)||o&&(Lo.has(a)||a.endsWith("Capture")&&Lo.has(a.slice(0,-7)))||i!=null&&i.has(a)||nb.test(a))&&(u[a]=t[a]);return u}let ut=new Map,Wl=new Set;function zo(){if(typeof window>"u")return;function t(l){return"propertyName"in l}let e=l=>{let r=U(l);if(!t(l)||!r)return;let o=ut.get(r);o||(o=new Set,ut.set(r,o),r.addEventListener("transitioncancel",n,{once:!0})),o.add(l.propertyName)},n=l=>{let r=U(l);if(!t(l)||!r)return;let o=ut.get(r);if(o&&(o.delete(l.propertyName),o.size===0&&(r.removeEventListener("transitioncancel",n),ut.delete(r)),ut.size===0)){for(let i of Wl)i();Wl.clear()}};document.body.addEventListener("transitionrun",e),document.body.addEventListener("transitionend",n)}typeof document<"u"&&(document.readyState!=="loading"?zo():document.addEventListener("DOMContentLoaded",zo));function lb(){for(const[t]of ut)"isConnected"in t&&!t.isConnected&&ut.delete(t)}function vu(t){requestAnimationFrame(()=>{lb(),ut.size===0?t():Wl.add(t)})}function Et(){let t=s.useRef(new Map),e=s.useCallback((r,o,i,u)=>{let a=u!=null&&u.once?(...c)=>{t.current.delete(i),i(...c)}:i;t.current.set(i,{type:o,eventTarget:r,fn:a,options:u}),r.addEventListener(o,a,u)},[]),n=s.useCallback((r,o,i,u)=>{var c;let a=((c=t.current.get(i))==null?void 0:c.fn)||i;r.removeEventListener(o,a,u),t.current.delete(i)},[]),l=s.useCallback(()=>{t.current.forEach((r,o)=>{n(r.eventTarget,r.type,o,r.options)})},[n]);return s.useEffect(()=>l,[l]),{addGlobalListener:e,removeGlobalListener:n,removeAllGlobalListeners:l}}function cn(t,e){let{id:n,"aria-label":l,"aria-labelledby":r}=t;return n=$e(n),r&&l?r=[...new Set([n,...r.trim().split(/\s+/)])].join(" "):r&&(r=r.trim().split(/\s+/).join(" ")),!l&&!r&&e&&(l=e),{id:n,"aria-label":l,"aria-labelledby":r}}function Te(t){const e=s.useRef(null),n=s.useRef(void 0),l=s.useCallback(r=>{if(typeof t=="function"){const o=t,i=o(r);return()=>{typeof i=="function"?i():o(null)}}else if(t)return t.current=r,()=>{t.current=null}},[t]);return s.useMemo(()=>({get current(){return e.current},set current(r){e.current=r,n.current&&(n.current(),n.current=void 0),r!=null&&(n.current=l(r))}}),[l])}const rb=x.useInsertionEffect??le;function we(t){const e=s.useRef(null);return rb(()=>{e.current=t},[t]),s.useCallback((...n)=>{const l=e.current;return l==null?void 0:l(...n)},[])}function Tr(t,e){const n=s.useRef(!0),l=s.useRef(null);let r=we(t);s.useEffect(()=>(n.current=!0,()=>{n.current=!1}),[]),s.useEffect(()=>{let o=l.current;n.current?n.current=!1:(!o||e.some((i,u)=>!Object.is(i,o[u])))&&r(),l.current=e},e)}function No(t,e){const n=s.useRef(!0),l=s.useRef(null);le(()=>(n.current=!0,()=>{n.current=!1}),[]),le(()=>{n.current?n.current=!1:(!l.current||e.some((r,o)=>!Object.is(r,l[o])))&&t(),l.current=e},e)}function ob(){return typeof window.ResizeObserver<"u"}function dn(t){const{ref:e,box:n,onResize:l}=t;let r=we(l);s.useEffect(()=>{let o=e==null?void 0:e.current;if(o)if(ob()){const i=new window.ResizeObserver(u=>{u.length&&r()});return i.observe(o,{box:n}),()=>{o&&i.unobserve(o)}}else return window.addEventListener("resize",r,!1),()=>{window.removeEventListener("resize",r,!1)}},[e,n])}function Ar(t,e){le(()=>{if(t&&t.ref&&e)return t.ref.current=e.current,()=>{t.ref&&(t.ref.current=null)}})}function st(t,e){if(!t)return!1;let n=window.getComputedStyle(t),l=document.scrollingElement||document.documentElement,r=/(auto|scroll)/.test(n.overflow+n.overflowX+n.overflowY);return t===l&&n.overflow!=="hidden"&&(r=!0),r&&e&&(r=t.scrollHeight!==t.clientHeight||t.scrollWidth!==t.clientWidth),r}function Xe(t,e){let n=t;for(st(n,e)&&(n=n.parentElement);n&&!st(n,e);)n=n.parentElement;return n||document.scrollingElement||document.documentElement}function Dl(t,e){let n=[],l=document.scrollingElement||document.documentElement;for(;t&&(st(t,e)&&n.push(t),t!==l);)t=t.parentElement;return n}function Tt(t){return $t()?t.metaKey:t.ctrlKey}const ib=new Set(["checkbox","radio","range","color","file","image","button","submit","reset"]);function rn(t){return t instanceof HTMLInputElement&&!ib.has(t.type)||t instanceof HTMLTextAreaElement||t instanceof HTMLElement&&t.isContentEditable}let Ke=typeof document<"u"&&window.visualViewport;function ub(){let t=dt(),[e,n]=s.useState(()=>t?{width:0,height:0}:kl());return s.useEffect(()=>{let l=u=>{n(a=>u.width===a.width&&u.height===a.height?a:u)},r=()=>{Ke&&Ke.scale>1||l(kl())},o,i=u=>{Ke&&Ke.scale>1||rn(U(u))&&(o=requestAnimationFrame(()=>{let a=ie();(!a||!rn(a))&&l({width:document.documentElement.clientWidth,height:document.documentElement.clientHeight})}))};return l(kl()),vt()&&window.addEventListener("blur",i,!0),Ke?Ke.addEventListener("resize",r):window.addEventListener("resize",r),()=>{cancelAnimationFrame(o),vt()&&window.removeEventListener("blur",i,!0),Ke?Ke.removeEventListener("resize",r):window.removeEventListener("resize",r)}},[]),e}function kl(){return{width:Ke?Math.min(Ke.width*Ke.scale,document.documentElement.clientWidth):document.documentElement.clientWidth,height:Ke?Ke.height*Ke.scale:document.documentElement.clientHeight}}let ab=0;const Pl=new Map;function $n(t){let[e,n]=s.useState();return le(()=>{if(!t)return;let l=Pl.get(t);if(l)n(l.element.id);else{let r=`react-aria-description-${ab++}`;n(r);let o=document.createElement("div");o.id=r,o.style.display="none",o.textContent=t,document.body.appendChild(o),l={refCount:0,element:o},Pl.set(t,l)}return l.refCount++,()=>{l&&--l.refCount===0&&(l.element.remove(),Pl.delete(t))}},[t]),{"aria-describedby":t?e:void 0}}function Qt(t,e,n,l){let r=we(n),o=n==null;s.useEffect(()=>{if(o||!t.current)return;let i=t.current;return i.addEventListener(e,r,l),()=>{i.removeEventListener(e,r,l)}},[t,e,l,o])}function _n(t,e,n={}){let{block:l="nearest",inline:r="nearest"}=n;if(t===e)return;let o=t.scrollTop,i=t.scrollLeft,u=e.getBoundingClientRect(),a=t.getBoundingClientRect(),c=window.getComputedStyle(e),f=window.getComputedStyle(t),d=document.scrollingElement||document.documentElement,b=t===d,p=t===d?0:a.top,h=t===d?t.clientHeight:a.bottom,y=t===d?0:a.left,m=t===d?t.clientWidth:a.right,g=parseFloat(c.scrollMarginTop)||0,v=parseFloat(c.scrollMarginBottom)||0,E=parseFloat(c.scrollMarginLeft)||0,C=parseFloat(c.scrollMarginRight)||0,R=parseFloat(f.scrollPaddingTop)||0,T=parseFloat(f.scrollPaddingBottom)||0,F=parseFloat(f.scrollPaddingLeft)||0,B=parseFloat(f.scrollPaddingRight)||0,L=parseFloat(f.borderTopWidth)||0,M=parseFloat(f.borderBottomWidth)||0,V=parseFloat(f.borderLeftWidth)||0,H=parseFloat(f.borderRightWidth)||0,j=u.top-g,$=u.bottom+v,D=u.left-E,A=u.right+C,w=t===d?0:V+H,P=t===d?0:L+M,k=t===d?0:t.offsetWidth-t.clientWidth-w,K=t===d?0:t.offsetHeight-t.clientHeight-P,_=p+(b?0:L)+R,Z=h-(b?0:M)-T-K,S=y+(b?0:V)+F,N=m-(b?0:H)-B;f.direction==="rtl"&&!vt()?S+=k:N-=k;let O=j<_||$>Z,X=DN;if(O&&l==="start")o+=j-_;else if(O&&l==="center")o+=(j+$)/2-(_+Z)/2;else if(O&&l==="end")o+=$-Z;else if(O&&l==="nearest"){let J=j-_,de=$-Z;o+=Math.abs(J)<=Math.abs(de)?J:de}if(X&&r==="start")i+=D-S;else if(X&&r==="center")i+=(D+A)/2-(S+N)/2;else if(X&&r==="end")i+=A-N;else if(X&&r==="nearest"){let J=D-S,de=A-N;i+=Math.abs(J)<=Math.abs(de)?J:de}t.scrollTo({left:i,top:o})}function it(t,e={}){var l,r,o;let{containingElement:n}=e;if(t&&t.isConnected){let i=document.scrollingElement||document.documentElement;if(window.getComputedStyle(i).overflow==="hidden"){let{left:a,top:c}=t.getBoundingClientRect(),f=Dl(t,!0);for(let p of f)_n(p,t);let{left:d,top:b}=t.getBoundingClientRect();if(Math.abs(a-d)>1||Math.abs(c-b)>1){f=n?Dl(n,!0):[];for(let p of f)_n(p,n,{block:"center",inline:"center"});for(let p of Dl(t,!0))_n(p,t)}}else{let{left:a,top:c}=t.getBoundingClientRect();(l=t==null?void 0:t.scrollIntoView)==null||l.call(t,{block:"nearest"});let{left:f,top:d}=t.getBoundingClientRect();(Math.abs(a-f)>1||Math.abs(c-d)>1)&&((r=n==null?void 0:n.scrollIntoView)==null||r.call(n,{block:"center",inline:"center"}),(o=t.scrollIntoView)==null||o.call(t,{block:"nearest"}))}}}function xu(t){return t.pointerType===""&&t.isTrusted?!0:an()&&t.pointerType?t.type==="click"&&t.buttons===1:t.detail===0&&!t.pointerType}function sb(t){return!an()&&t.width===0&&t.height===0||t.width===1&&t.height===1&&t.pressure===0&&t.detail===0&&t.pointerType==="mouse"}function il(t,e,n){let l=we(r=>{n&&!r.defaultPrevented&&n(e)});s.useEffect(()=>{var o;let r=(o=t==null?void 0:t.current)==null?void 0:o.form;return r==null||r.addEventListener("reset",l),()=>{r==null||r.removeEventListener("reset",l)}},[t])}function Cu(t,e){let{collection:n,onLoadMore:l,scrollOffset:r=1}=t,o=s.useRef(null),i=we(u=>{for(let a of u)a.isIntersecting&&l&&l()});le(()=>(e.current&&(o.current=new IntersectionObserver(i,{root:Xe(e==null?void 0:e.current),rootMargin:`0px ${100*r}% ${100*r}% ${100*r}%`}),o.current.observe(e.current)),()=>{o.current&&o.current.disconnect()}),[n,e,r])}function Eu(t){const e=s.version.split(".");return parseInt(e[0],10)>=19?t:t?"true":void 0}function Br(t,e=!0){let[n,l]=s.useState(!0),r=n&&e;return le(()=>{if(r&&t.current&&"getAnimations"in t.current)for(let o of t.current.getAnimations())o instanceof CSSTransition&&o.cancel()},[t,r]),wu(t,r,s.useCallback(()=>l(!1),[])),r}function Ul(t,e){let[n,l]=s.useState(e?"open":"closed");switch(n){case"open":e||l("exiting");break;case"closed":case"exiting":e&&l("open");break}let r=n==="exiting";return wu(t,r,s.useCallback(()=>{l(o=>o==="exiting"?"closed":o)},[])),r}function wu(t,e,n){le(()=>{if(e&&t.current){if(!("getAnimations"in t.current)){n();return}let l=t.current.getAnimations();if(l.length===0){n();return}let r=!1;return Promise.allSettled(l.map(o=>o.finished)).then(()=>{r||kr.flushSync(()=>{n()})}),()=>{r=!0}}},[t,e,n])}const cb=typeof Element<"u"&&"checkVisibility"in Element.prototype;function db(t){const e=Se(t);if(!(t instanceof e.HTMLElement)&&!(t instanceof e.SVGElement))return!1;let{display:n,visibility:l}=t.style,r=n!=="none"&&l!=="hidden"&&l!=="collapse";if(r){const{getComputedStyle:o}=t.ownerDocument.defaultView;let{display:i,visibility:u}=o(t);r=i!=="none"&&u!=="hidden"&&u!=="collapse"}return r}function fb(t,e){return!t.hasAttribute("hidden")&&!t.hasAttribute("data-react-aria-prevent-focus")&&(t.nodeName==="DETAILS"&&e&&e.nodeName!=="SUMMARY"?t.hasAttribute("open"):!0)}function Kr(t,e){return cb?t.checkVisibility({visibilityProperty:!0})&&!t.closest("[data-react-aria-prevent-focus]"):t.nodeName!=="#comment"&&db(t)&&fb(t,e)&&(!t.parentElement||Kr(t.parentElement,t))}const Rr=["input:not([disabled]):not([type=hidden])","select:not([disabled])","textarea:not([disabled])","button:not([disabled])","a[href]","area[href]","summary","iframe","object","embed","audio[controls]","video[controls]",'[contenteditable]:not([contenteditable^="false"])',"permission"],pb=Rr.join(":not([hidden]),")+",[tabindex]:not([disabled]):not([hidden])";Rr.push('[tabindex]:not([tabindex="-1"]):not([disabled])');const bb=Rr.join(':not([hidden]):not([tabindex="-1"]),');function Su(t,e){return t.matches(pb)&&!ku(t)&&((e==null?void 0:e.skipVisibilityCheck)||Kr(t))}function Du(t){return t.matches(bb)&&Kr(t)&&!ku(t)}function ku(t){let e=t;for(;e!=null;){if(e instanceof e.ownerDocument.defaultView.HTMLElement&&e.inert)return!0;e=e.parentElement}return!1}function Vo(t){let e=t==null?void 0:t.defaultView;return(e==null?void 0:e.__webpack_nonce__)||globalThis.__webpack_nonce__||void 0}let Tl=new WeakMap;function Pu(t){let e=t??(typeof document<"u"?document:void 0);if(!e)return Vo(e);if(Tl.has(e))return Tl.get(e);let n=e.querySelector('meta[property="csp-nonce"]'),l=n&&n instanceof Se(n).HTMLMetaElement&&(n.nonce||n.content)||Vo(e)||void 0;return l!==void 0&&Tl.set(e,l),l}function hb(t,e,n){const{render:l,...r}=e,o=s.useRef(null),i=s.useMemo(()=>pt(n,o),[n,o]);le(()=>{},[t,l]);const u={...r,ref:i};return l?l(u,void 0):I.jsx(t,{...u})}const Oo={},De=new Proxy({},{get(t,e){if(typeof e!="string")return;let n=Oo[e];return n||(n=s.forwardRef(hb.bind(null,e)),Oo[e]=n),n}});var mb=/\s+/g,gb=t=>typeof t!="string"||!t?t:t.replace(mb," ").trim(),Lt=(...t)=>{const e=[],n=l=>{if(!l&&l!==0&&l!==0n)return;if(Array.isArray(l)){for(let o=0,i=l.length;o0?gb(e.join(" ")):void 0},jo=t=>t===!1?"false":t===!0?"true":t===0?"0":t,Ae=t=>{if(!t||typeof t!="object")return!0;for(const e in t)return!1;return!0},yb=(t,e)=>{if(t===e)return!0;if(!t||!e)return!1;const n=Object.keys(t),l=Object.keys(e);if(n.length!==l.length)return!1;for(let r=0;r{for(const n in e)if(Object.prototype.hasOwnProperty.call(e,n)){const l=e[n];n in t?t[n]=Lt(t[n],l):t[n]=l}return t},Tu=(t,e)=>{for(let n=0;n{const e=[];Tu(t,e);const n=[];for(let l=0;l{const n={};for(const l in t){const r=t[l];if(l in e){const o=e[l];Array.isArray(r)||Array.isArray(o)?n[l]=Au(o,r):typeof r=="object"&&typeof o=="object"&&r&&o?n[l]=Gl(r,o):n[l]=o+" "+r}else n[l]=r}for(const l in e)l in t||(n[l]=e[l]);return n},vb={twMerge:!0,twMergeConfig:{}};function xb(){let t=null,e={},n=!1;return{get cachedTwMerge(){return t},set cachedTwMerge(l){t=l},get cachedTwMergeConfig(){return e},set cachedTwMergeConfig(l){e=l},get didTwMergeConfigChange(){return n},set didTwMergeConfigChange(l){n=l},reset(){t=null,e={},n=!1}}}var Je=xb(),Cb=t=>{const e=(l,r)=>{const{extend:o=null,slots:i={},variants:u={},compoundVariants:a=[],compoundSlots:c=[],defaultVariants:f={}}=l,d={...vb,...r},b=o!=null&&o.base?Lt(o.base,l==null?void 0:l.base):l==null?void 0:l.base,p=o!=null&&o.variants&&!Ae(o.variants)?Gl(u,o.variants):u,h=o!=null&&o.defaultVariants&&!Ae(o.defaultVariants)?{...o.defaultVariants,...f}:f;!Ae(d.twMergeConfig)&&!yb(d.twMergeConfig,Je.cachedTwMergeConfig)&&(Je.didTwMergeConfigChange=!0,Je.cachedTwMergeConfig=d.twMergeConfig);const y=Ae(o==null?void 0:o.slots),m=Ae(i)?{}:{base:Lt(l==null?void 0:l.base,y&&(o==null?void 0:o.base)),...i},g=y?m:$b({...o==null?void 0:o.slots},Ae(m)?{base:l==null?void 0:l.base}:m),v=Ae(o==null?void 0:o.compoundVariants)?a:Au(o==null?void 0:o.compoundVariants,a),E=R=>{if(Ae(p)&&Ae(i)&&y)return t(b,R==null?void 0:R.class,R==null?void 0:R.className)(d);if(v&&!Array.isArray(v))throw new TypeError(`The "compoundVariants" prop must be an array. Received: ${typeof v}`);if(c&&!Array.isArray(c))throw new TypeError(`The "compoundSlots" prop must be an array. Received: ${typeof c}`);const T=($,D=p,A=null,w=null)=>{const P=D[$];if(!P||Ae(P))return null;const k=(w==null?void 0:w[$])??(R==null?void 0:R[$]);if(k===null)return null;const K=jo(k);if(typeof K=="object")return null;const _=h==null?void 0:h[$],Z=K??jo(_);return P[Z||"false"]},F=()=>{if(!p)return null;const $=Object.keys(p),D=[];for(let A=0;A<$.length;A++){const w=T($[A],p);w&&D.push(w)}return D},B=($,D)=>{if(!p||typeof p!="object")return null;const A=[];for(const w in p){const P=T(w,p,$,D),k=$==="base"&&typeof P=="string"?P:P&&P[$];k&&A.push(k)}return A},L={};for(const $ in R){const D=R[$];D!==void 0&&(L[$]=D)}const M=($,D)=>{var w;const A=typeof(R==null?void 0:R[$])=="object"?{[$]:(w=R[$])==null?void 0:w.initial}:{};return{...h,...L,...A,...D}},V=($=[],D)=>{const A=[],w=$.length;for(let P=0;P{const D=V(v,$);if(!Array.isArray(D))return D;const A={},w=t;for(let P=0;P{if(c.length<1)return null;const D={},A=M(null,$);for(let w=0;w{const P=H(w),k=j(w);return D(g[A],B(A,w),P?P[A]:void 0,k?k[A]:void 0,w==null?void 0:w.class,w==null?void 0:w.className)(d)}}return $}return t(b,F(),V(v),R==null?void 0:R.class,R==null?void 0:R.className)(d)},C=()=>{if(!(!p||typeof p!="object"))return Object.keys(p)};return E.variantKeys=C(),E.extend=o,E.base=b,E.slots=g,E.variants=p,E.defaultVariants=h,E.compoundSlots=c,E.compoundVariants=v,E};return{tv:e,createTV:l=>(r,o)=>e(r,o?Gl(l,o):l)}};const Eb=(t,e)=>{const n=new Array(t.length+e.length);for(let l=0;l({classGroupId:t,validator:e}),Bu=(t=new Map,e=null,n)=>({nextPart:t,validators:e,classGroupId:n}),Gn="-",_o=[],Sb="arbitrary..",Db=t=>{const e=Pb(t),{conflictingClassGroups:n,conflictingClassGroupModifiers:l}=t;return{getClassGroupId:i=>{if(i.startsWith("[")&&i.endsWith("]"))return kb(i);const u=i.split(Gn),a=u[0]===""&&u.length>1?1:0;return Ku(u,a,e)},getConflictingClassGroupIds:(i,u)=>{if(u){const a=l[i],c=n[i];return a?c?Eb(c,a):a:c||_o}return n[i]||_o}}},Ku=(t,e,n)=>{if(t.length-e===0)return n.classGroupId;const r=t[e],o=n.nextPart.get(r);if(o){const c=Ku(t,e+1,o);if(c)return c}const i=n.validators;if(i===null)return;const u=e===0?t.join(Gn):t.slice(e).join(Gn),a=i.length;for(let c=0;ct.slice(1,-1).indexOf(":")===-1?void 0:(()=>{const e=t.slice(1,-1),n=e.indexOf(":"),l=e.slice(0,n);return l?Sb+l:void 0})(),Pb=t=>{const{theme:e,classGroups:n}=t;return Tb(n,e)},Tb=(t,e)=>{const n=Bu();for(const l in t){const r=t[l];Mr(r,n,l,e)}return n},Mr=(t,e,n,l)=>{const r=t.length;for(let o=0;o{if(typeof t=="string"){Bb(t,e,n);return}if(typeof t=="function"){Kb(t,e,n,l);return}Rb(t,e,n,l)},Bb=(t,e,n)=>{const l=t===""?e:Ru(e,t);l.classGroupId=n},Kb=(t,e,n,l)=>{if(Mb(t)){Mr(t(l),e,n,l);return}e.validators===null&&(e.validators=[]),e.validators.push(wb(n,t))},Rb=(t,e,n,l)=>{const r=Object.entries(t),o=r.length;for(let i=0;i{let n=t;const l=e.split(Gn),r=l.length;for(let o=0;o"isThemeGetter"in t&&t.isThemeGetter===!0,Fb=t=>{if(t<1)return{get:()=>{},set:()=>{}};let e=0,n=Object.create(null),l=Object.create(null);const r=(o,i)=>{n[o]=i,e++,e>t&&(e=0,l=n,n=Object.create(null))};return{get(o){let i=n[o];if(i!==void 0)return i;if((i=l[o])!==void 0)return r(o,i),i},set(o,i){o in n?n[o]=i:r(o,i)}}},ql="!",Ho=":",Ib=[],Wo=(t,e,n,l,r)=>({modifiers:t,hasImportantModifier:e,baseClassName:n,maybePostfixModifierPosition:l,isExternal:r}),Lb=t=>{const{prefix:e,experimentalParseClassName:n}=t;let l=r=>{const o=[];let i=0,u=0,a=0,c;const f=r.length;for(let y=0;ya?c-a:void 0;return Wo(o,p,b,h)};if(e){const r=e+Ho,o=l;l=i=>i.startsWith(r)?o(i.slice(r.length)):Wo(Ib,!1,i,void 0,!0)}if(n){const r=l;l=o=>n({className:o,parseClassName:r})}return l},zb=t=>{const e=new Map;return t.orderSensitiveModifiers.forEach((n,l)=>{e.set(n,1e6+l)}),n=>{const l=[];let r=[];for(let o=0;o0&&(r.sort(),l.push(...r),r=[]),l.push(i)):r.push(i)}return r.length>0&&(r.sort(),l.push(...r)),l}},Nb=t=>({cache:Fb(t.cacheSize),parseClassName:Lb(t),sortModifiers:zb(t),...Db(t)}),Vb=/\s+/,Ob=(t,e)=>{const{parseClassName:n,getClassGroupId:l,getConflictingClassGroupIds:r,sortModifiers:o}=e,i=[],u=t.trim().split(Vb);let a="";for(let c=u.length-1;c>=0;c-=1){const f=u[c],{isExternal:d,modifiers:b,hasImportantModifier:p,baseClassName:h,maybePostfixModifierPosition:y}=n(f);if(d){a=f+(a.length>0?" "+a:a);continue}let m=!!y,g=l(m?h.substring(0,y):h);if(!g){if(!m){a=f+(a.length>0?" "+a:a);continue}if(g=l(h),!g){a=f+(a.length>0?" "+a:a);continue}m=!1}const v=b.length===0?"":b.length===1?b[0]:o(b).join(":"),E=p?v+ql:v,C=E+g;if(i.indexOf(C)>-1)continue;i.push(C);const R=r(g,m);for(let T=0;T0?" "+a:a)}return a},jb=(...t)=>{let e=0,n,l,r="";for(;e{if(typeof t=="string")return t;let e,n="";for(let l=0;l{let n,l,r,o;const i=a=>{const c=e.reduce((f,d)=>d(f),t());return n=Nb(c),l=n.cache.get,r=n.cache.set,o=u,u(a)},u=a=>{const c=l(a);if(c)return c;const f=Ob(a,n);return r(a,f),f};return o=i,(...a)=>o(jb(...a))},_b=[],ye=t=>{const e=n=>n[t]||_b;return e.isThemeGetter=!0,e},Fu=/^\[(?:(\w[\w-]*):)?(.+)\]$/i,Iu=/^\((?:(\w[\w-]*):)?(.+)\)$/i,Hb=/^\d+\/\d+$/,Wb=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,Ub=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,Gb=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,qb=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,Zb=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,kt=t=>Hb.test(t),te=t=>!!t&&!Number.isNaN(Number(t)),ot=t=>!!t&&Number.isInteger(Number(t)),Al=t=>t.endsWith("%")&&te(t.slice(0,-1)),Ye=t=>Wb.test(t),Yb=()=>!0,Xb=t=>Ub.test(t)&&!Gb.test(t),Lu=()=>!1,Jb=t=>qb.test(t),Qb=t=>Zb.test(t),eh=t=>!G(t)&&!q(t),th=t=>jt(t,Vu,Lu),G=t=>Fu.test(t),bt=t=>jt(t,Ou,Xb),Bl=t=>jt(t,ih,te),Uo=t=>jt(t,zu,Lu),nh=t=>jt(t,Nu,Qb),Kn=t=>jt(t,ju,Jb),q=t=>Iu.test(t),qt=t=>_t(t,Ou),lh=t=>_t(t,uh),Go=t=>_t(t,zu),rh=t=>_t(t,Vu),oh=t=>_t(t,Nu),Rn=t=>_t(t,ju,!0),jt=(t,e,n)=>{const l=Fu.exec(t);return l?l[1]?e(l[1]):n(l[2]):!1},_t=(t,e,n=!1)=>{const l=Iu.exec(t);return l?l[1]?e(l[1]):n:!1},zu=t=>t==="position"||t==="percentage",Nu=t=>t==="image"||t==="url",Vu=t=>t==="length"||t==="size"||t==="bg-size",Ou=t=>t==="length",ih=t=>t==="number",uh=t=>t==="family-name",ju=t=>t==="shadow",Yl=()=>{const t=ye("color"),e=ye("font"),n=ye("text"),l=ye("font-weight"),r=ye("tracking"),o=ye("leading"),i=ye("breakpoint"),u=ye("container"),a=ye("spacing"),c=ye("radius"),f=ye("shadow"),d=ye("inset-shadow"),b=ye("text-shadow"),p=ye("drop-shadow"),h=ye("blur"),y=ye("perspective"),m=ye("aspect"),g=ye("ease"),v=ye("animate"),E=()=>["auto","avoid","all","avoid-page","page","left","right","column"],C=()=>["center","top","bottom","left","right","top-left","left-top","top-right","right-top","bottom-right","right-bottom","bottom-left","left-bottom"],R=()=>[...C(),q,G],T=()=>["auto","hidden","clip","visible","scroll"],F=()=>["auto","contain","none"],B=()=>[q,G,a],L=()=>[kt,"full","auto",...B()],M=()=>[ot,"none","subgrid",q,G],V=()=>["auto",{span:["full",ot,q,G]},ot,q,G],H=()=>[ot,"auto",q,G],j=()=>["auto","min","max","fr",q,G],$=()=>["start","end","center","between","around","evenly","stretch","baseline","center-safe","end-safe"],D=()=>["start","end","center","stretch","center-safe","end-safe"],A=()=>["auto",...B()],w=()=>[kt,"auto","full","dvw","dvh","lvw","lvh","svw","svh","min","max","fit",...B()],P=()=>[t,q,G],k=()=>[...C(),Go,Uo,{position:[q,G]}],K=()=>["no-repeat",{repeat:["","x","y","space","round"]}],_=()=>["auto","cover","contain",rh,th,{size:[q,G]}],Z=()=>[Al,qt,bt],S=()=>["","none","full",c,q,G],N=()=>["",te,qt,bt],O=()=>["solid","dashed","dotted","double"],X=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],J=()=>[te,Al,Go,Uo],de=()=>["","none",h,q,G],Ce=()=>["none",te,q,G],z=()=>["none",te,q,G],Y=()=>[te,q,G],ue=()=>[kt,"full",...B()];return{cacheSize:500,theme:{animate:["spin","ping","pulse","bounce"],aspect:["video"],blur:[Ye],breakpoint:[Ye],color:[Yb],container:[Ye],"drop-shadow":[Ye],ease:["in","out","in-out"],font:[eh],"font-weight":["thin","extralight","light","normal","medium","semibold","bold","extrabold","black"],"inset-shadow":[Ye],leading:["none","tight","snug","normal","relaxed","loose"],perspective:["dramatic","near","normal","midrange","distant","none"],radius:[Ye],shadow:[Ye],spacing:["px",te],text:[Ye],"text-shadow":[Ye],tracking:["tighter","tight","normal","wide","wider","widest"]},classGroups:{aspect:[{aspect:["auto","square",kt,G,q,m]}],container:["container"],columns:[{columns:[te,G,q,u]}],"break-after":[{"break-after":E()}],"break-before":[{"break-before":E()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],sr:["sr-only","not-sr-only"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:R()}],overflow:[{overflow:T()}],"overflow-x":[{"overflow-x":T()}],"overflow-y":[{"overflow-y":T()}],overscroll:[{overscroll:F()}],"overscroll-x":[{"overscroll-x":F()}],"overscroll-y":[{"overscroll-y":F()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:L()}],"inset-x":[{"inset-x":L()}],"inset-y":[{"inset-y":L()}],start:[{start:L()}],end:[{end:L()}],top:[{top:L()}],right:[{right:L()}],bottom:[{bottom:L()}],left:[{left:L()}],visibility:["visible","invisible","collapse"],z:[{z:[ot,"auto",q,G]}],basis:[{basis:[kt,"full","auto",u,...B()]}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["nowrap","wrap","wrap-reverse"]}],flex:[{flex:[te,kt,"auto","initial","none",G]}],grow:[{grow:["",te,q,G]}],shrink:[{shrink:["",te,q,G]}],order:[{order:[ot,"first","last","none",q,G]}],"grid-cols":[{"grid-cols":M()}],"col-start-end":[{col:V()}],"col-start":[{"col-start":H()}],"col-end":[{"col-end":H()}],"grid-rows":[{"grid-rows":M()}],"row-start-end":[{row:V()}],"row-start":[{"row-start":H()}],"row-end":[{"row-end":H()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":j()}],"auto-rows":[{"auto-rows":j()}],gap:[{gap:B()}],"gap-x":[{"gap-x":B()}],"gap-y":[{"gap-y":B()}],"justify-content":[{justify:[...$(),"normal"]}],"justify-items":[{"justify-items":[...D(),"normal"]}],"justify-self":[{"justify-self":["auto",...D()]}],"align-content":[{content:["normal",...$()]}],"align-items":[{items:[...D(),{baseline:["","last"]}]}],"align-self":[{self:["auto",...D(),{baseline:["","last"]}]}],"place-content":[{"place-content":$()}],"place-items":[{"place-items":[...D(),"baseline"]}],"place-self":[{"place-self":["auto",...D()]}],p:[{p:B()}],px:[{px:B()}],py:[{py:B()}],ps:[{ps:B()}],pe:[{pe:B()}],pt:[{pt:B()}],pr:[{pr:B()}],pb:[{pb:B()}],pl:[{pl:B()}],m:[{m:A()}],mx:[{mx:A()}],my:[{my:A()}],ms:[{ms:A()}],me:[{me:A()}],mt:[{mt:A()}],mr:[{mr:A()}],mb:[{mb:A()}],ml:[{ml:A()}],"space-x":[{"space-x":B()}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":B()}],"space-y-reverse":["space-y-reverse"],size:[{size:w()}],w:[{w:[u,"screen",...w()]}],"min-w":[{"min-w":[u,"screen","none",...w()]}],"max-w":[{"max-w":[u,"screen","none","prose",{screen:[i]},...w()]}],h:[{h:["screen","lh",...w()]}],"min-h":[{"min-h":["screen","lh","none",...w()]}],"max-h":[{"max-h":["screen","lh",...w()]}],"font-size":[{text:["base",n,qt,bt]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:[l,q,Bl]}],"font-stretch":[{"font-stretch":["ultra-condensed","extra-condensed","condensed","semi-condensed","normal","semi-expanded","expanded","extra-expanded","ultra-expanded",Al,G]}],"font-family":[{font:[lh,G,e]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:[r,q,G]}],"line-clamp":[{"line-clamp":[te,"none",q,Bl]}],leading:[{leading:[o,...B()]}],"list-image":[{"list-image":["none",q,G]}],"list-style-position":[{list:["inside","outside"]}],"list-style-type":[{list:["disc","decimal","none",q,G]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"placeholder-color":[{placeholder:P()}],"text-color":[{text:P()}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...O(),"wavy"]}],"text-decoration-thickness":[{decoration:[te,"from-font","auto",q,bt]}],"text-decoration-color":[{decoration:P()}],"underline-offset":[{"underline-offset":[te,"auto",q,G]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:B()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",q,G]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],wrap:[{wrap:["break-word","anywhere","normal"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",q,G]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:k()}],"bg-repeat":[{bg:K()}],"bg-size":[{bg:_()}],"bg-image":[{bg:["none",{linear:[{to:["t","tr","r","br","b","bl","l","tl"]},ot,q,G],radial:["",q,G],conic:[ot,q,G]},oh,nh]}],"bg-color":[{bg:P()}],"gradient-from-pos":[{from:Z()}],"gradient-via-pos":[{via:Z()}],"gradient-to-pos":[{to:Z()}],"gradient-from":[{from:P()}],"gradient-via":[{via:P()}],"gradient-to":[{to:P()}],rounded:[{rounded:S()}],"rounded-s":[{"rounded-s":S()}],"rounded-e":[{"rounded-e":S()}],"rounded-t":[{"rounded-t":S()}],"rounded-r":[{"rounded-r":S()}],"rounded-b":[{"rounded-b":S()}],"rounded-l":[{"rounded-l":S()}],"rounded-ss":[{"rounded-ss":S()}],"rounded-se":[{"rounded-se":S()}],"rounded-ee":[{"rounded-ee":S()}],"rounded-es":[{"rounded-es":S()}],"rounded-tl":[{"rounded-tl":S()}],"rounded-tr":[{"rounded-tr":S()}],"rounded-br":[{"rounded-br":S()}],"rounded-bl":[{"rounded-bl":S()}],"border-w":[{border:N()}],"border-w-x":[{"border-x":N()}],"border-w-y":[{"border-y":N()}],"border-w-s":[{"border-s":N()}],"border-w-e":[{"border-e":N()}],"border-w-t":[{"border-t":N()}],"border-w-r":[{"border-r":N()}],"border-w-b":[{"border-b":N()}],"border-w-l":[{"border-l":N()}],"divide-x":[{"divide-x":N()}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":N()}],"divide-y-reverse":["divide-y-reverse"],"border-style":[{border:[...O(),"hidden","none"]}],"divide-style":[{divide:[...O(),"hidden","none"]}],"border-color":[{border:P()}],"border-color-x":[{"border-x":P()}],"border-color-y":[{"border-y":P()}],"border-color-s":[{"border-s":P()}],"border-color-e":[{"border-e":P()}],"border-color-t":[{"border-t":P()}],"border-color-r":[{"border-r":P()}],"border-color-b":[{"border-b":P()}],"border-color-l":[{"border-l":P()}],"divide-color":[{divide:P()}],"outline-style":[{outline:[...O(),"none","hidden"]}],"outline-offset":[{"outline-offset":[te,q,G]}],"outline-w":[{outline:["",te,qt,bt]}],"outline-color":[{outline:P()}],shadow:[{shadow:["","none",f,Rn,Kn]}],"shadow-color":[{shadow:P()}],"inset-shadow":[{"inset-shadow":["none",d,Rn,Kn]}],"inset-shadow-color":[{"inset-shadow":P()}],"ring-w":[{ring:N()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:P()}],"ring-offset-w":[{"ring-offset":[te,bt]}],"ring-offset-color":[{"ring-offset":P()}],"inset-ring-w":[{"inset-ring":N()}],"inset-ring-color":[{"inset-ring":P()}],"text-shadow":[{"text-shadow":["none",b,Rn,Kn]}],"text-shadow-color":[{"text-shadow":P()}],opacity:[{opacity:[te,q,G]}],"mix-blend":[{"mix-blend":[...X(),"plus-darker","plus-lighter"]}],"bg-blend":[{"bg-blend":X()}],"mask-clip":[{"mask-clip":["border","padding","content","fill","stroke","view"]},"mask-no-clip"],"mask-composite":[{mask:["add","subtract","intersect","exclude"]}],"mask-image-linear-pos":[{"mask-linear":[te]}],"mask-image-linear-from-pos":[{"mask-linear-from":J()}],"mask-image-linear-to-pos":[{"mask-linear-to":J()}],"mask-image-linear-from-color":[{"mask-linear-from":P()}],"mask-image-linear-to-color":[{"mask-linear-to":P()}],"mask-image-t-from-pos":[{"mask-t-from":J()}],"mask-image-t-to-pos":[{"mask-t-to":J()}],"mask-image-t-from-color":[{"mask-t-from":P()}],"mask-image-t-to-color":[{"mask-t-to":P()}],"mask-image-r-from-pos":[{"mask-r-from":J()}],"mask-image-r-to-pos":[{"mask-r-to":J()}],"mask-image-r-from-color":[{"mask-r-from":P()}],"mask-image-r-to-color":[{"mask-r-to":P()}],"mask-image-b-from-pos":[{"mask-b-from":J()}],"mask-image-b-to-pos":[{"mask-b-to":J()}],"mask-image-b-from-color":[{"mask-b-from":P()}],"mask-image-b-to-color":[{"mask-b-to":P()}],"mask-image-l-from-pos":[{"mask-l-from":J()}],"mask-image-l-to-pos":[{"mask-l-to":J()}],"mask-image-l-from-color":[{"mask-l-from":P()}],"mask-image-l-to-color":[{"mask-l-to":P()}],"mask-image-x-from-pos":[{"mask-x-from":J()}],"mask-image-x-to-pos":[{"mask-x-to":J()}],"mask-image-x-from-color":[{"mask-x-from":P()}],"mask-image-x-to-color":[{"mask-x-to":P()}],"mask-image-y-from-pos":[{"mask-y-from":J()}],"mask-image-y-to-pos":[{"mask-y-to":J()}],"mask-image-y-from-color":[{"mask-y-from":P()}],"mask-image-y-to-color":[{"mask-y-to":P()}],"mask-image-radial":[{"mask-radial":[q,G]}],"mask-image-radial-from-pos":[{"mask-radial-from":J()}],"mask-image-radial-to-pos":[{"mask-radial-to":J()}],"mask-image-radial-from-color":[{"mask-radial-from":P()}],"mask-image-radial-to-color":[{"mask-radial-to":P()}],"mask-image-radial-shape":[{"mask-radial":["circle","ellipse"]}],"mask-image-radial-size":[{"mask-radial":[{closest:["side","corner"],farthest:["side","corner"]}]}],"mask-image-radial-pos":[{"mask-radial-at":C()}],"mask-image-conic-pos":[{"mask-conic":[te]}],"mask-image-conic-from-pos":[{"mask-conic-from":J()}],"mask-image-conic-to-pos":[{"mask-conic-to":J()}],"mask-image-conic-from-color":[{"mask-conic-from":P()}],"mask-image-conic-to-color":[{"mask-conic-to":P()}],"mask-mode":[{mask:["alpha","luminance","match"]}],"mask-origin":[{"mask-origin":["border","padding","content","fill","stroke","view"]}],"mask-position":[{mask:k()}],"mask-repeat":[{mask:K()}],"mask-size":[{mask:_()}],"mask-type":[{"mask-type":["alpha","luminance"]}],"mask-image":[{mask:["none",q,G]}],filter:[{filter:["","none",q,G]}],blur:[{blur:de()}],brightness:[{brightness:[te,q,G]}],contrast:[{contrast:[te,q,G]}],"drop-shadow":[{"drop-shadow":["","none",p,Rn,Kn]}],"drop-shadow-color":[{"drop-shadow":P()}],grayscale:[{grayscale:["",te,q,G]}],"hue-rotate":[{"hue-rotate":[te,q,G]}],invert:[{invert:["",te,q,G]}],saturate:[{saturate:[te,q,G]}],sepia:[{sepia:["",te,q,G]}],"backdrop-filter":[{"backdrop-filter":["","none",q,G]}],"backdrop-blur":[{"backdrop-blur":de()}],"backdrop-brightness":[{"backdrop-brightness":[te,q,G]}],"backdrop-contrast":[{"backdrop-contrast":[te,q,G]}],"backdrop-grayscale":[{"backdrop-grayscale":["",te,q,G]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[te,q,G]}],"backdrop-invert":[{"backdrop-invert":["",te,q,G]}],"backdrop-opacity":[{"backdrop-opacity":[te,q,G]}],"backdrop-saturate":[{"backdrop-saturate":[te,q,G]}],"backdrop-sepia":[{"backdrop-sepia":["",te,q,G]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":B()}],"border-spacing-x":[{"border-spacing-x":B()}],"border-spacing-y":[{"border-spacing-y":B()}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["","all","colors","opacity","shadow","transform","none",q,G]}],"transition-behavior":[{transition:["normal","discrete"]}],duration:[{duration:[te,"initial",q,G]}],ease:[{ease:["linear","initial",g,q,G]}],delay:[{delay:[te,q,G]}],animate:[{animate:["none",v,q,G]}],backface:[{backface:["hidden","visible"]}],perspective:[{perspective:[y,q,G]}],"perspective-origin":[{"perspective-origin":R()}],rotate:[{rotate:Ce()}],"rotate-x":[{"rotate-x":Ce()}],"rotate-y":[{"rotate-y":Ce()}],"rotate-z":[{"rotate-z":Ce()}],scale:[{scale:z()}],"scale-x":[{"scale-x":z()}],"scale-y":[{"scale-y":z()}],"scale-z":[{"scale-z":z()}],"scale-3d":["scale-3d"],skew:[{skew:Y()}],"skew-x":[{"skew-x":Y()}],"skew-y":[{"skew-y":Y()}],transform:[{transform:[q,G,"","none","gpu","cpu"]}],"transform-origin":[{origin:R()}],"transform-style":[{transform:["3d","flat"]}],translate:[{translate:ue()}],"translate-x":[{"translate-x":ue()}],"translate-y":[{"translate-y":ue()}],"translate-z":[{"translate-z":ue()}],"translate-none":["translate-none"],accent:[{accent:P()}],appearance:[{appearance:["none","auto"]}],"caret-color":[{caret:P()}],"color-scheme":[{scheme:["normal","dark","light","light-dark","only-dark","only-light"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",q,G]}],"field-sizing":[{"field-sizing":["fixed","content"]}],"pointer-events":[{"pointer-events":["auto","none"]}],resize:[{resize:["none","","y","x"]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":B()}],"scroll-mx":[{"scroll-mx":B()}],"scroll-my":[{"scroll-my":B()}],"scroll-ms":[{"scroll-ms":B()}],"scroll-me":[{"scroll-me":B()}],"scroll-mt":[{"scroll-mt":B()}],"scroll-mr":[{"scroll-mr":B()}],"scroll-mb":[{"scroll-mb":B()}],"scroll-ml":[{"scroll-ml":B()}],"scroll-p":[{"scroll-p":B()}],"scroll-px":[{"scroll-px":B()}],"scroll-py":[{"scroll-py":B()}],"scroll-ps":[{"scroll-ps":B()}],"scroll-pe":[{"scroll-pe":B()}],"scroll-pt":[{"scroll-pt":B()}],"scroll-pr":[{"scroll-pr":B()}],"scroll-pb":[{"scroll-pb":B()}],"scroll-pl":[{"scroll-pl":B()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",q,G]}],fill:[{fill:["none",...P()]}],"stroke-w":[{stroke:[te,qt,bt,Bl]}],stroke:[{stroke:["none",...P()]}],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-x","border-w-y","border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-x","border-color-y","border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],translate:["translate-x","translate-y","translate-none"],"translate-none":["translate","translate-x","translate-y","translate-z"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]},orderSensitiveModifiers:["*","**","after","backdrop","before","details-content","file","first-letter","first-line","marker","placeholder","selection"]}},ah=(t,{cacheSize:e,prefix:n,experimentalParseClassName:l,extend:r={},override:o={}})=>(en(t,"cacheSize",e),en(t,"prefix",n),en(t,"experimentalParseClassName",l),Mn(t.theme,o.theme),Mn(t.classGroups,o.classGroups),Mn(t.conflictingClassGroups,o.conflictingClassGroups),Mn(t.conflictingClassGroupModifiers,o.conflictingClassGroupModifiers),en(t,"orderSensitiveModifiers",o.orderSensitiveModifiers),Fn(t.theme,r.theme),Fn(t.classGroups,r.classGroups),Fn(t.conflictingClassGroups,r.conflictingClassGroups),Fn(t.conflictingClassGroupModifiers,r.conflictingClassGroupModifiers),_u(t,r,"orderSensitiveModifiers"),t),en=(t,e,n)=>{n!==void 0&&(t[e]=n)},Mn=(t,e)=>{if(e)for(const n in e)en(t,n,e[n])},Fn=(t,e)=>{if(e)for(const n in e)_u(t,e,n)},_u=(t,e,n)=>{const l=e[n];l!==void 0&&(t[n]=t[n]?t[n].concat(l):l)},sh=(t,...e)=>typeof t=="function"?Zl(Yl,t,...e):Zl(()=>ah(Yl(),t),...e),ch=Zl(Yl);var dh=t=>Ae(t)?ch:sh({...t,extend:{theme:t.theme,classGroups:t.classGroups,conflictingClassGroupModifiers:t.conflictingClassGroupModifiers,conflictingClassGroups:t.conflictingClassGroups,...t.extend}}),fh=(t,e)=>{const n=Lt(t);return!n||!((e==null?void 0:e.twMerge)??!0)?n:((!Je.cachedTwMerge||Je.didTwMergeConfigChange)&&(Je.didTwMergeConfigChange=!1,Je.cachedTwMerge=dh(Je.cachedTwMergeConfig)),Je.cachedTwMerge(n)||void 0)},ph=(...t)=>e=>fh(t,e),{tv:ke}=Cb(ph);const ul=ke({defaultVariants:{size:"md",status:"danger",variant:"opaque"},slots:{backdrop:"alert-dialog__backdrop",body:"alert-dialog__body",closeTrigger:"alert-dialog__close-trigger",container:"alert-dialog__container",dialog:"alert-dialog__dialog",footer:"alert-dialog__footer",header:"alert-dialog__header",heading:"alert-dialog__heading",icon:"alert-dialog__icon",trigger:"alert-dialog__trigger"},variants:{size:{cover:{dialog:"alert-dialog__dialog--cover"},lg:{dialog:"alert-dialog__dialog--lg"},md:{dialog:"alert-dialog__dialog--md"},sm:{dialog:"alert-dialog__dialog--sm"},xs:{dialog:"alert-dialog__dialog--xs"}},status:{accent:{icon:"alert-dialog__icon--accent"},danger:{icon:"alert-dialog__icon--danger"},default:{icon:"alert-dialog__icon--default"},success:{icon:"alert-dialog__icon--success"},warning:{icon:"alert-dialog__icon--warning"}},variant:{blur:{backdrop:"alert-dialog__backdrop--blur"},opaque:{backdrop:"alert-dialog__backdrop--opaque"},transparent:{backdrop:"alert-dialog__backdrop--transparent"}}}}),bh=ke({base:"button",defaultVariants:{fullWidth:!1,isIconOnly:!1,size:"md",variant:"primary"},variants:{fullWidth:{false:"",true:"button--full-width"},isIconOnly:{true:"button--icon-only"},size:{lg:"button--lg",md:"button--md",sm:"button--sm"},variant:{danger:"button--danger","danger-soft":"button--danger-soft",ghost:"button--ghost",outline:"button--outline",primary:"button--primary",secondary:"button--secondary",tertiary:"button--tertiary"}}}),hh=ke({defaultVariants:{variant:"default"},slots:{base:"card",content:"card__content",description:"card__description",footer:"card__footer",header:"card__header",title:"card__title"},variants:{variant:{default:{base:"card--default"},secondary:{base:"card--secondary"},tertiary:{base:"card--tertiary"},transparent:{base:"card--transparent"}}}}),mh=ke({defaultVariants:{color:"default",variant:"secondary"},slots:{base:"chip",label:"chip__label"},variants:{color:{accent:{base:"chip--accent"},danger:{base:"chip--danger"},default:{base:"chip--default"},success:{base:"chip--success"},warning:{base:"chip--warning"}},size:{lg:{base:"chip--lg"},md:{base:"chip--md"},sm:{base:"chip--sm"}},variant:{primary:{base:"chip--primary"},secondary:{base:"chip--secondary"},soft:{base:"chip--soft"},tertiary:{base:"chip--tertiary"}}}}),gh=ke({base:"close-button",defaultVariants:{variant:"default"},variants:{variant:{default:"close-button--default"}}}),yh=ke({defaultVariants:{fullWidth:!1},slots:{base:"combo-box",inputGroup:"combo-box__input-group",popover:"combo-box__popover",trigger:"combo-box__trigger"},variants:{fullWidth:{false:{},true:{base:"combo-box--full-width",inputGroup:"combo-box__input-group--full-width"}}}}),$h=ke({base:"description"}),vh=ke({base:"input",defaultVariants:{fullWidth:!1,variant:"primary"},variants:{fullWidth:{false:"",true:"input--full-width"},variant:{primary:"input--primary",secondary:"input--secondary"}}}),xh=ke({base:"label",defaultVariants:{isDisabled:!1,isInvalid:!1,isRequired:!1},variants:{isDisabled:{true:"label--disabled"},isInvalid:{true:"label--invalid"},isRequired:{true:"label--required"}}}),Ch=ke({slots:{base:"link",icon:"link__icon"}}),Eh=ke({base:"list-box",defaultVariants:{variant:"default"},variants:{variant:{danger:"list-box--danger",default:"list-box--default"}}}),wh=ke({defaultVariants:{variant:"default"},slots:{indicator:"list-box-item__indicator",item:"list-box-item"},variants:{variant:{danger:{item:"list-box-item--danger"},default:{item:"list-box-item--default"}}}}),Sh=ke({base:"list-box-section"}),Dh=ke({base:"spinner",defaultVariants:{color:"accent",size:"md"},variants:{color:{accent:"spinner--accent",current:"spinner--current",danger:"spinner--danger",success:"spinner--success",warning:"spinner--warning"},size:{lg:"spinner--lg",md:"spinner--md",sm:"spinner--sm",xl:"spinner--xl"}}}),kh=ke({defaultVariants:{variant:"primary"},slots:{base:"table-root",body:"table__body",cell:"table__cell",column:"table__column",columnResizer:"table__column-resizer",content:"table__content",footer:"table__footer",header:"table__header",loadMore:"table__load-more",loadMoreContent:"table__load-more-content",resizableContainer:"table__resizable-container",row:"table__row",scrollContainer:"table__scroll-container",sortableColumnHeader:"table__sortable-column-header",sortableColumnIndicator:"table__sortable-column-indicator"},variants:{variant:{primary:{base:"table-root--primary"},secondary:{base:"table-root--secondary"}}}}),Ph=ke({base:"textfield",defaultVariants:{fullWidth:!1},variants:{fullWidth:{false:"",true:"textfield--full-width"}}}),gt=Symbol("default");function Me({values:t,children:e}){for(let[n,l]of t)e=x.createElement(n.Provider,{value:l},e);return e}function ae(t){let{className:e,style:n,children:l,defaultClassName:r,defaultChildren:o,defaultStyle:i,values:u,render:a}=t;return s.useMemo(()=>{let c,f,d;return typeof e=="function"?c=e({...u,defaultClassName:r}):c=e,typeof n=="function"?f=n({...u,defaultStyle:i||{}}):f=n,typeof l=="function"?d=l({...u,defaultChildren:o}):l==null?d=o:d=l,{className:c??r,style:f||i?{...i,...f}:void 0,children:d??o,"data-rac":"",render:a?b=>a(b,u):void 0}},[e,n,l,r,o,i,u,a])}function Th(t,e){return n=>e(typeof t=="function"?t(n):t,n)}function vn(t,e){let n=s.useContext(t);if(e===null)return null;if(n&&typeof n=="object"&&"slots"in n&&n.slots){let l=e||gt;if(!n.slots[l]){let r=new Intl.ListFormat().format(Object.keys(n.slots).map(i=>`"${i}"`)),o=e?`Invalid slot "${e}".`:"A slot prop is required.";throw new Error(`${o} Valid slot names are ${r}.`)}return n.slots[l]}return n}function ve(t,e,n){let l=vn(n,t.slot)||{},{ref:r,...o}=l,i=Te(s.useMemo(()=>pt(e,r),[e,r])),u=W(o,t);return"style"in o&&o.style&&"style"in t&&t.style&&(typeof o.style=="function"||typeof t.style=="function"?u.style=a=>{let c=typeof o.style=="function"?o.style(a):o.style,f={...a.defaultStyle,...c},d=typeof t.style=="function"?t.style({...a,defaultStyle:f}):t.style;return{...f,...d}}:u.style={...o.style,...t.style}),[u,i]}function xn(t=!0){let[e,n]=s.useState(t),l=s.useRef(!1),r=s.useCallback(o=>{l.current=!0,n(!!o)},[]);return le(()=>{l.current||n(!1)},[]),[r,e]}function Fr(t){const e=/^(data-.*)$/;let n={};for(const l in t)e.test(l)||(n[l]=t[l]);return n}function Ah(t,e,n){let{render:l,...r}=e,o=s.useRef(null),i=s.useMemo(()=>pt(n,o),[n,o]);le(()=>{},[t,l]);let u={...r,ref:i};return l?l(u,void 0):x.createElement(t,u)}const qo={},ee=new Proxy({},{get(t,e){if(typeof e!="string")return;let n=qo[e];return n||(n=s.forwardRef(Ah.bind(null,e)),qo[e]=n),n}});typeof HTMLTemplateElement<"u"&&(Object.defineProperty(HTMLTemplateElement.prototype,"firstChild",{configurable:!0,enumerable:!0,get:function(){return this.content.firstChild}}),Object.defineProperty(HTMLTemplateElement.prototype,"appendChild",{configurable:!0,enumerable:!0,value:function(t){return this.content.appendChild(t)}}),Object.defineProperty(HTMLTemplateElement.prototype,"removeChild",{configurable:!0,enumerable:!0,value:function(t){return this.content.removeChild(t)}}),Object.defineProperty(HTMLTemplateElement.prototype,"insertBefore",{configurable:!0,enumerable:!0,value:function(t,e){return this.content.insertBefore(t,e)}}));const qn=s.createContext(!1);function Bh(t){if(s.useContext(qn))return x.createElement(x.Fragment,null,t.children);let n=x.createElement(qn.Provider,{value:!0},t.children);return x.createElement("template",null,n)}function Cn(t){let e=(n,l)=>s.useContext(qn)?null:t(n,l);return e.displayName=t.displayName||t.name,s.forwardRef(e)}function Kh(){return s.useContext(qn)}const Ht=s.createContext({}),Rh=Cn(function(e,n){[e,n]=ve(e,n,Ht);let{elementType:l="label",...r}=e,o=ee[l];return x.createElement(o,{className:"react-aria-Label",...r,ref:n})});function al(t){let{id:e,label:n,"aria-labelledby":l,"aria-label":r,labelElementType:o="label"}=t;e=$e(e);let i=$e(),u={};n&&(l=l?`${i} ${l}`:i,u={id:i,htmlFor:o==="label"?e:void 0});let a=cn({id:e,"aria-label":r,"aria-labelledby":l});return{labelProps:u,fieldProps:a}}const Mh=new Set(["Arab","Syrc","Samr","Mand","Thaa","Mend","Nkoo","Adlm","Rohg","Hebr"]),Fh=new Set(["ae","ar","arc","bcc","bqi","ckb","dv","fa","glk","he","ku","mzn","nqo","pnb","ps","sd","ug","ur","yi"]);function Ih(t){if(Intl.Locale){let n=new Intl.Locale(t).maximize(),l=typeof n.getTextInfo=="function"?n.getTextInfo():n.textInfo;if(l)return l.direction==="rtl";if(n.script)return Mh.has(n.script)}let e=t.split("-")[0];return Fh.has(e)}const Hu=Symbol.for("react-aria.i18n.locale");function Wu(){let t=typeof window<"u"&&window[Hu]||typeof navigator<"u"&&(navigator.language||navigator.userLanguage)||"en-US";try{Intl.DateTimeFormat.supportedLocalesOf([t])}catch{t="en-US"}return{locale:t,direction:Ih(t)?"rtl":"ltr"}}let Xl=Wu(),tn=new Set;function Zo(){Xl=Wu();for(let t of tn)t(Xl)}function Lh(){let t=dt(),[e,n]=s.useState(Xl);return s.useEffect(()=>(tn.size===0&&window.addEventListener("languagechange",Zo),tn.add(n),()=>{tn.delete(n),tn.size===0&&window.removeEventListener("languagechange",Zo)}),[]),t?{locale:typeof window<"u"&&window[Hu]||"en-US",direction:"ltr"}:e}const zh=x.createContext(null);function Pe(){let t=Lh();return s.useContext(zh)||t}let Kl=new Map,Jl=!1;try{Jl=new Intl.NumberFormat("de-DE",{signDisplay:"exceptZero"}).resolvedOptions().signDisplay==="exceptZero"}catch{}let Zn=!1;try{Zn=new Intl.NumberFormat("de-DE",{style:"unit",unit:"degree"}).resolvedOptions().style==="unit"}catch{}const Uu={degree:{narrow:{default:"°","ja-JP":" 度","zh-TW":"度","sl-SI":" °"}}};class Nh{constructor(e,n={}){this.numberFormatter=Vh(e,n),this.options=n}format(e){var l;let n="";if(!Jl&&this.options.signDisplay!=null?n=Oh(this.numberFormatter,this.options.signDisplay,e):n=this.numberFormatter.format(e),this.options.style==="unit"&&!Zn){let{unit:r,unitDisplay:o="short",locale:i}=this.resolvedOptions();if(!r)return n;let u=(l=Uu[r])==null?void 0:l[o];n+=u[i]||u.default}return n}formatToParts(e){return this.numberFormatter.formatToParts(e)}formatRange(e,n){if(typeof this.numberFormatter.formatRange=="function")return this.numberFormatter.formatRange(e,n);if(n= start date");return`${this.format(e)} – ${this.format(n)}`}formatRangeToParts(e,n){if(typeof this.numberFormatter.formatRangeToParts=="function")return this.numberFormatter.formatRangeToParts(e,n);if(n= start date");let l=this.numberFormatter.formatToParts(e),r=this.numberFormatter.formatToParts(n);return[...l.map(o=>({...o,source:"startRange"})),{type:"literal",value:" – ",source:"shared"},...r.map(o=>({...o,source:"endRange"}))]}resolvedOptions(){let e=this.numberFormatter.resolvedOptions();return!Jl&&this.options.signDisplay!=null&&(e={...e,signDisplay:this.options.signDisplay}),!Zn&&this.options.style==="unit"&&(e={...e,style:"unit",unit:this.options.unit,unitDisplay:this.options.unitDisplay}),e}}function Vh(t,e={}){var o;let{numberingSystem:n}=e;if(n&&t.includes("-nu-")&&(t.includes("-u-")||(t+="-u-"),t+=`-nu-${n}`),e.style==="unit"&&!Zn){let{unit:i,unitDisplay:u="short"}=e;if(!i)throw new Error('unit option must be provided with style: "unit"');if(!((o=Uu[i])!=null&&o[u]))throw new Error(`Unsupported unit ${i} with unitDisplay = ${u}`);e={...e,style:"decimal"}}let l=t+(e?Object.entries(e).sort((i,u)=>i[0]0||Object.is(n,0):e==="exceptZero"&&(Object.is(n,-0)||Object.is(n,0)?n=Math.abs(n):l=n>0),l){let r=t.format(-n),o=t.format(n),i=r.replace(o,"").replace(/\u200e|\u061C/,"");return[...i].length!==1&&console.warn("@react-aria/i18n polyfill for NumberFormat signDisplay: Unsupported case"),r.replace(o,"!!!").replace(i,"+").replace("!!!",o)}else return t.format(n)}}function jh(t={}){let{locale:e}=Pe();return s.useMemo(()=>new Nh(e,t),[e,t])}function fn(t,e=-1/0,n=1/0){return Math.min(Math.max(t,e),n)}function _h(t,e=-1/0,n=1/0){return Math.min(Math.max(t,e),n)}function In(t,e){let n=t,l=0,r=e.toString(),o=r.toLowerCase().indexOf("e-");if(o>0)l=Math.abs(Math.floor(Math.log10(Math.abs(e))))+o;else{let i=r.indexOf(".");i>=0&&(l=r.length-i)}if(l>0){let i=Math.pow(10,l);n=Math.round(n*i)/i}return n}function Zt(t,e,n,l){e=Number(e),n=Number(n);let r=(t-(isNaN(e)?0:e))%l,o=In(Math.abs(r)*2>=l?t+Math.sign(r)*(l-Math.abs(r)):t-r,l);return isNaN(e)?!isNaN(n)&&o>n&&(o=Math.floor(In(n/l,l))*l):on&&(o=e+Math.floor(In((n-e)/l,l))*l),o=In(o,l),o}const Hh=s.createContext(null),Gu=7e3;let We=null;function yt(t,e="assertive",n=Gu){We?We.announce(t,e,n):(We=new Wh,(typeof IS_REACT_ACT_ENVIRONMENT=="boolean"?IS_REACT_ACT_ENVIRONMENT:typeof jest<"u")?We.announce(t,e,n):setTimeout(()=>{We!=null&&We.isAttached()&&(We==null||We.announce(t,e,n))},100))}class Wh{constructor(){this.node=null,this.assertiveLog=null,this.politeLog=null,typeof document<"u"&&(this.node=document.createElement("div"),this.node.dataset.liveAnnouncer="true",Object.assign(this.node.style,{border:0,clip:"rect(0 0 0 0)",clipPath:"inset(50%)",height:"1px",margin:"-1px",overflow:"hidden",padding:0,position:"absolute",width:"1px",whiteSpace:"nowrap"}),this.assertiveLog=this.createLog("assertive"),this.node.appendChild(this.assertiveLog),this.politeLog=this.createLog("polite"),this.node.appendChild(this.politeLog),document.body.prepend(this.node))}isAttached(){var e;return(e=this.node)==null?void 0:e.isConnected}createLog(e){let n=document.createElement("div");return n.setAttribute("role","log"),n.setAttribute("aria-live",e),n.setAttribute("aria-relevant","additions"),n}destroy(){this.node&&(document.body.removeChild(this.node),this.node=null)}announce(e,n="assertive",l=Gu){var o,i;if(!this.node)return;let r=document.createElement("div");typeof e=="object"?(r.setAttribute("role","img"),r.setAttribute("aria-labelledby",e["aria-labelledby"])):r.textContent=e,n==="assertive"?(o=this.assertiveLog)==null||o.appendChild(r):(i=this.politeLog)==null||i.appendChild(r),e!==""&&setTimeout(()=>{r.remove()},l)}clear(e){this.node&&((!e||e==="assertive")&&this.assertiveLog&&(this.assertiveLog.innerHTML=""),(!e||e==="polite")&&this.politeLog&&(this.politeLog.innerHTML=""))}}function Ir(t){let e=t;return e.nativeEvent=t,e.isDefaultPrevented=()=>e.defaultPrevented,e.isPropagationStopped=()=>e.cancelBubble,e.persist=()=>{},e}function qu(t,e){Object.defineProperty(t,"target",{value:e}),Object.defineProperty(t,"currentTarget",{value:e})}function Zu(t){let e=s.useRef({isFocused:!1,observer:null});return le(()=>{const n=e.current;return()=>{n.observer&&(n.observer.disconnect(),n.observer=null)}},[]),s.useCallback(n=>{let l=U(n);if(l instanceof HTMLButtonElement||l instanceof HTMLInputElement||l instanceof HTMLTextAreaElement||l instanceof HTMLSelectElement){e.current.isFocused=!0;let r=l,o=i=>{if(e.current.isFocused=!1,r.disabled){let u=Ir(i);t==null||t(u)}e.current.observer&&(e.current.observer.disconnect(),e.current.observer=null)};r.addEventListener("focusout",o,{once:!0}),e.current.observer=new MutationObserver(()=>{var i;if(e.current.isFocused&&r.disabled){(i=e.current.observer)==null||i.disconnect();let u=r===ie()?null:ie();r.dispatchEvent(new FocusEvent("blur",{relatedTarget:u})),r.dispatchEvent(new FocusEvent("focusout",{bubbles:!0,relatedTarget:u}))}}),e.current.observer.observe(r,{attributes:!0,attributeFilter:["disabled"]})}},[t])}let Yn=!1;function Uh(t){for(;t&&!Su(t,{skipVisibilityCheck:!0});)t=t.parentElement;let e=Se(t),n=e.document.activeElement;if(!n||n===t)return;Yn=!0;let l=!1,r=f=>{(U(f)===n||l)&&f.stopImmediatePropagation()},o=f=>{(U(f)===n||l)&&(f.stopImmediatePropagation(),!t&&!l&&(l=!0,Ne(n),a()))},i=f=>{(U(f)===t||l)&&f.stopImmediatePropagation()},u=f=>{(U(f)===t||l)&&(f.stopImmediatePropagation(),l||(l=!0,Ne(n),a()))};e.addEventListener("blur",r,!0),e.addEventListener("focusout",o,!0),e.addEventListener("focusin",u,!0),e.addEventListener("focus",i,!0);let a=()=>{cancelAnimationFrame(c),e.removeEventListener("blur",r,!0),e.removeEventListener("focusout",o,!0),e.removeEventListener("focusin",u,!0),e.removeEventListener("focus",i,!0),Yn=!1,l=!1},c=requestAnimationFrame(a);return a}let nt=null;const pn=new Set;let on=new Map,Ct=!1,Ql=!1;const Gh={Tab:!0,Escape:!0};function sl(t,e){for(let n of pn)n(t,e)}function qh(t){return!(t.metaKey||!$t()&&t.altKey||t.ctrlKey||t.key==="Control"||t.key==="Shift"||t.key==="Meta")}function Xn(t){Ct=!0,!tt.isOpening&&qh(t)&&(nt="keyboard",sl("keyboard",t))}function Mt(t){nt="pointer","pointerType"in t&&t.pointerType,(t.type==="mousedown"||t.type==="pointerdown")&&(Ct=!0,sl("pointer",t))}function Yu(t){!tt.isOpening&&xu(t)&&(Ct=!0,nt="virtual")}function Xu(t){let e=Se(U(t)),n=re(U(t));U(t)===e||U(t)===n||Yn||!t.isTrusted||(!Ct&&!Ql&&(nt="virtual",sl("virtual",t)),Ct=!1,Ql=!1)}function Ju(){Yn||(Ct=!1,Ql=!0)}function Jn(t){if(typeof window>"u"||typeof document>"u")return;const e=Se(t),n=re(t);if(on.get(e))return;let l=e.HTMLElement.prototype.focus;e.HTMLElement.prototype.focus=function(){Ct=!0,l.apply(this,arguments)},n.addEventListener("keydown",Xn,!0),n.addEventListener("keyup",Xn,!0),n.addEventListener("click",Yu,!0),e.addEventListener("focus",Xu,!0),e.addEventListener("blur",Ju,!1),typeof PointerEvent<"u"&&(n.addEventListener("pointerdown",Mt,!0),n.addEventListener("pointermove",Mt,!0),n.addEventListener("pointerup",Mt,!0)),e.addEventListener("beforeunload",()=>{Qu(t)},{once:!0}),on.set(e,{focus:l})}const Qu=(t,e)=>{const n=Se(t),l=re(t);e&&l.removeEventListener("DOMContentLoaded",e),on.has(n)&&(n.HTMLElement.prototype.focus=on.get(n).focus,l.removeEventListener("keydown",Xn,!0),l.removeEventListener("keyup",Xn,!0),l.removeEventListener("click",Yu,!0),n.removeEventListener("focus",Xu,!0),n.removeEventListener("blur",Ju,!1),typeof PointerEvent<"u"&&(l.removeEventListener("pointerdown",Mt,!0),l.removeEventListener("pointermove",Mt,!0),l.removeEventListener("pointerup",Mt,!0)),on.delete(n))};function Zh(t){const e=re(t);let n;return e.readyState!=="loading"?Jn(t):(n=()=>{Jn(t)},e.addEventListener("DOMContentLoaded",n)),()=>Qu(t,n)}typeof document<"u"&&Zh();function zt(){return nt!=="pointer"}function bn(){return nt}function ea(t){nt=t,sl(t,null)}function ta(){Jn();let[t,e]=s.useState(nt);return s.useEffect(()=>{let n=()=>{e(nt)};return pn.add(n),()=>{pn.delete(n)}},[]),dt()?null:t}const Yh=new Set(["checkbox","radio","range","color","file","image","button","submit","reset"]);function Xh(t,e,n){let l=n?U(n):void 0,r=re(l),o=Se(l);const i=typeof o<"u"?o.HTMLInputElement:HTMLInputElement,u=typeof o<"u"?o.HTMLTextAreaElement:HTMLTextAreaElement,a=typeof o<"u"?o.HTMLElement:HTMLElement,c=typeof o<"u"?o.KeyboardEvent:KeyboardEvent;let f=ie(r);return t=t||f instanceof i&&!Yh.has(f.type)||f instanceof u||f instanceof a&&f.isContentEditable,!(t&&e==="keyboard"&&n instanceof c&&!Gh[n.key])}function Jh(t,e,n){Jn(),s.useEffect(()=>{if((n==null?void 0:n.enabled)===!1)return;let l=(r,o)=>{Xh(!!(n!=null&&n.isTextInput),r,o)&&t(zt())};return pn.add(l),()=>{pn.delete(l)}},e)}function xe(t){if(!t.isConnected)return;const e=re(t);if(bn()==="virtual"){let n=ie(e);vu(()=>{const l=ie(e);(l===n||l===e.body)&&t.isConnected&&Ne(t)})}else Ne(t)}function Lr(t){let{isDisabled:e,onFocus:n,onBlur:l,onFocusChange:r}=t;const o=s.useCallback(a=>{if(U(a)===a.currentTarget)return l&&l(a),r&&r(!1),!0},[l,r]),i=Zu(o),u=s.useCallback(a=>{let c=U(a);const f=re(c),d=f?ie(f):ie();c===a.currentTarget&&c===d&&(n&&n(a),r&&r(!0),i(a))},[r,n,i]);return{focusProps:{onFocus:!e&&(n||r||l)?u:void 0,onBlur:!e&&(l||r)?o:void 0}}}function Yo(t){if(!t)return;let e=!0;return n=>{let l={...n,preventDefault(){n.preventDefault()},isDefaultPrevented(){return n.isDefaultPrevented()},stopPropagation(){e=!0},continuePropagation(){e=!1},isPropagationStopped(){return e}};t(l),e&&n.stopPropagation()}}function cl(t){return{keyboardProps:t.isDisabled?{}:{onKeyDown:Yo(t.onKeyDown),onKeyUp:Yo(t.onKeyUp)}}}let er=x.createContext(null);function Qh(t){let e=s.useContext(er)||{};Ar(e,t);let{ref:n,...l}=e;return l}function wt(t,e){let{focusProps:n}=Lr(t),{keyboardProps:l}=cl(t),r=W(n,l),o=Qh(e),i=t.isDisabled?{}:o,u=s.useRef(t.autoFocus);s.useEffect(()=>{u.current&&e.current&&xe(e.current),u.current=!1},[e]);let a=t.excludeFromTabOrder?-1:0;return t.isDisabled&&(a=void 0),{focusableProps:W({...r,tabIndex:a},i)}}let Kt="default",tr="",Hn=new WeakMap;function na(t){if(vt()){if(Kt==="default"){const e=re(t);tr=e.documentElement.style.webkitUserSelect,e.documentElement.style.webkitUserSelect="none"}Kt="disabled"}else if(t instanceof HTMLElement||t instanceof SVGElement){let e="userSelect"in t.style?"userSelect":"webkitUserSelect";Hn.set(t,t.style[e]),t.style[e]="none"}}function nr(t){if(vt()){if(Kt!=="disabled")return;Kt="restoring",setTimeout(()=>{vu(()=>{if(Kt==="restoring"){const e=re(t);e.documentElement.style.webkitUserSelect==="none"&&(e.documentElement.style.webkitUserSelect=tr||""),tr="",Kt="default"}})},300)}else if((t instanceof HTMLElement||t instanceof SVGElement)&&t&&Hn.has(t)){let e=Hn.get(t),n="userSelect"in t.style?"userSelect":"webkitUserSelect";t.style[n]==="none"&&(t.style[n]=e),t.getAttribute("style")===""&&t.removeAttribute("style"),Hn.delete(t)}}const hn=x.createContext({register:()=>{}});hn.displayName="PressResponderContext";function em(t){let e=s.useContext(hn);if(e){let{register:n,ref:l,...r}=e;t=W(r,t),n()}return Ar(e,t.ref),t}var It;class Ln{constructor(e,n,l,r){Fo(this,It);wl(this,It,!0);let o=(r==null?void 0:r.target)??l.currentTarget;const i=o==null?void 0:o.getBoundingClientRect();let u,a=0,c,f=null;l.clientX!=null&&l.clientY!=null&&(c=l.clientX,f=l.clientY),i&&(c!=null&&f!=null?(u=c-i.left,a=f-i.top):(u=i.width/2,a=i.height/2)),this.type=e,this.pointerType=n,this.target=l.currentTarget,this.shiftKey=l.shiftKey,this.metaKey=l.metaKey,this.ctrlKey=l.ctrlKey,this.altKey=l.altKey,this.x=u,this.y=a,this.key=l.key}continuePropagation(){wl(this,It,!1)}get shouldStopPropagation(){return Mo(this,It)}}It=new WeakMap;const Xo=Symbol("linkClicked"),Jo="react-aria-pressable-style",Qo="data-react-aria-pressable";function lt(t){let{onPress:e,onPressChange:n,onPressStart:l,onPressEnd:r,onPressUp:o,onClick:i,isDisabled:u,isPressed:a,preventFocusOnPress:c,shouldCancelOnPointerExit:f,allowTextSelectionOnPress:d,ref:b,...p}=em(t),[h,y]=s.useState(!1),m=s.useRef({isPressed:!1,ignoreEmulatedMouseEvents:!1,didFirePressStart:!1,isTriggeringEvent:!1,activePointerId:null,target:null,isOverTarget:!1,pointerType:null,disposables:[]}),{addGlobalListener:g,removeAllGlobalListeners:v}=Et(),E=s.useCallback(($,D)=>{let A=m.current;if(u||A.didFirePressStart)return!1;let w=!0;if(A.isTriggeringEvent=!0,l){let P=new Ln("pressstart",D,$);l(P),w=P.shouldStopPropagation}return n&&n(!0),A.isTriggeringEvent=!1,A.didFirePressStart=!0,y(!0),w},[u,l,n]),C=s.useCallback(($,D,A=!0)=>{let w=m.current;if(!w.didFirePressStart)return!1;w.didFirePressStart=!1,w.isTriggeringEvent=!0;let P=!0;if(r){let k=new Ln("pressend",D,$);r(k),P=k.shouldStopPropagation}if(n&&n(!1),y(!1),e&&A&&!u){let k=new Ln("press",D,$);e(k),P&&(P=k.shouldStopPropagation)}return w.isTriggeringEvent=!1,P},[u,r,n,e]),R=we(C),T=s.useCallback(($,D)=>{let A=m.current;if(u)return!1;if(o){A.isTriggeringEvent=!0;let w=new Ln("pressup",D,$);return o(w),A.isTriggeringEvent=!1,w.shouldStopPropagation}return!0},[u,o]),F=we(T),B=s.useCallback($=>{let D=m.current;if(D.isPressed&&D.target){D.didFirePressStart&&D.pointerType!=null&&C(ht(D.target,$),D.pointerType,!1),D.isPressed=!1,D.isOverTarget=!1,D.activePointerId=null,D.pointerType=null,v(),d||nr(D.target);for(let A of D.disposables)A();D.disposables=[]}},[d,v,C]),L=we(B);s.useEffect(()=>{u&&m.current.isPressed&&L({currentTarget:m.current.target,shiftKey:!1,ctrlKey:!1,metaKey:!1,altKey:!1})},[u]);let M=s.useCallback($=>{f&&B($)},[f,B]),V=s.useCallback($=>{u||i==null||i($)},[u,i]),H=s.useCallback(($,D)=>{if(!u&&i){let A=new MouseEvent("click",$);qu(A,D),i(Ir(A))}},[u,i]),j=s.useMemo(()=>{let $=m.current,D={onKeyDown(w){var P;if(Rl(w.nativeEvent,w.currentTarget)&&ne(w.currentTarget,U(w))){ei(U(w),w.key)&&w.preventDefault();let k=!0;!$.isPressed&&!w.repeat&&($.target=w.currentTarget,$.isPressed=!0,$.pointerType="keyboard",k=E(w,"keyboard"));let K=w.currentTarget,_=Z=>{Rl(Z,K)&&!Z.repeat&&ne(K,U(Z))&&$.target&&F(ht($.target,Z),"keyboard")};g(re(w.currentTarget),"keyup",ft(_,A),!0),k&&w.stopPropagation(),w.metaKey&&$t()&&((P=$.metaKeyEvents)==null||P.set(w.key,w.nativeEvent))}else w.key==="Meta"&&($.metaKeyEvents=new Map)},onClick(w){if(!(w&&!ne(w.currentTarget,U(w)))&&w&&w.button===0&&!$.isTriggeringEvent&&!tt.isOpening){let P=!0;if(u&&w.preventDefault(),!$.ignoreEmulatedMouseEvents&&!$.isPressed&&($.pointerType==="virtual"||xu(w.nativeEvent))){let k=E(w,"virtual"),K=F(w,"virtual"),_=R(w,"virtual");V(w),P=k&&K&&_}else if($.isPressed&&$.pointerType!=="keyboard"){let k=$.pointerType||w.nativeEvent.pointerType||"virtual",K=F(ht(w.currentTarget,w),k),_=R(ht(w.currentTarget,w),k,!0);P=K&&_,$.isOverTarget=!1,V(w),L(w)}$.ignoreEmulatedMouseEvents=!1,P&&w.stopPropagation()}}},A=w=>{var P,k,K;if($.isPressed&&$.target&&Rl(w,$.target)){ei(U(w),w.key)&&w.preventDefault();let _=U(w),Z=ne($.target,_);R(ht($.target,w),"keyboard",Z),Z&&H(w,$.target),v(),w.key!=="Enter"&&zr($.target)&&ne($.target,_)&&!w[Xo]&&(w[Xo]=!0,tt($.target,w,!1)),$.isPressed=!1,(P=$.metaKeyEvents)==null||P.delete(w.key)}else if(w.key==="Meta"&&((k=$.metaKeyEvents)!=null&&k.size)){let _=$.metaKeyEvents;$.metaKeyEvents=void 0;for(let Z of _.values())(K=$.target)==null||K.dispatchEvent(new KeyboardEvent("keyup",Z))}};if(typeof PointerEvent<"u"){D.onPointerDown=k=>{if(k.button!==0||!ne(k.currentTarget,U(k)))return;if(sb(k.nativeEvent)){$.pointerType="virtual";return}$.pointerType=k.pointerType;let K=!0;if(!$.isPressed){$.isPressed=!0,$.isOverTarget=!0,$.activePointerId=k.pointerId,$.target=k.currentTarget,d||na($.target),K=E(k,$.pointerType);let _=U(k);"releasePointerCapture"in _&&("hasPointerCapture"in _?_.hasPointerCapture(k.pointerId)&&_.releasePointerCapture(k.pointerId):_.releasePointerCapture(k.pointerId)),g(re(k.currentTarget),"pointerup",w,!1),g(re(k.currentTarget),"pointercancel",P,!1)}K&&k.stopPropagation()},D.onMouseDown=k=>{if(ne(k.currentTarget,U(k))&&k.button===0){if(c){let K=Uh(k.target);K&&$.disposables.push(K)}k.stopPropagation()}},D.onPointerUp=k=>{!ne(k.currentTarget,U(k))||$.pointerType==="virtual"||k.button===0&&!$.isPressed&&F(k,$.pointerType||k.pointerType)},D.onPointerEnter=k=>{k.pointerId===$.activePointerId&&$.target&&!$.isOverTarget&&$.pointerType!=null&&($.isOverTarget=!0,E(ht($.target,k),$.pointerType))},D.onPointerLeave=k=>{k.pointerId===$.activePointerId&&$.target&&$.isOverTarget&&$.pointerType!=null&&($.isOverTarget=!1,R(ht($.target,k),$.pointerType,!1),M(k))};let w=k=>{if(k.pointerId===$.activePointerId&&$.isPressed&&k.button===0&&$.target){if(ne($.target,U(k))&&$.pointerType!=null){let K=!1,_=setTimeout(()=>{$.isPressed&&$.target instanceof HTMLElement&&(K?L(k):(Ne($.target),$.target.click()))},80);g(k.currentTarget,"click",()=>K=!0,!0),$.disposables.push(()=>clearTimeout(_))}else L(k);$.isOverTarget=!1}},P=k=>{L(k)};D.onDragStart=k=>{ne(k.currentTarget,U(k))&&L(k)}}return D},[g,u,c,v,d,M,E,V,H]);return s.useEffect(()=>{if(!b)return;const $=re(b.current);if(!$||!$.head||$.getElementById(Jo))return;const D=$.createElement("style");D.id=Jo;let A=Pu($);A&&(D.nonce=A),D.textContent=` +@layer { + [${Qo}] { + touch-action: pan-x pan-y pinch-zoom; + } +} + `.trim(),$.head.prepend(D)},[b]),s.useEffect(()=>{let $=m.current;return()=>{d||nr($.target??void 0);for(let D of $.disposables)D();$.disposables=[]}},[d]),{isPressed:a||h,pressProps:W(p,j,{[Qo]:!0})}}function zr(t){return t.tagName==="A"&&t.hasAttribute("href")}function Rl(t,e){const{key:n,code:l}=t,r=e,o=r.getAttribute("role");return(n==="Enter"||n===" "||n==="Spacebar"||l==="Space")&&!(r instanceof Se(r).HTMLInputElement&&!la(r,n)||r instanceof Se(r).HTMLTextAreaElement||r.isContentEditable)&&!((o==="link"||!o&&zr(r))&&n!=="Enter")}function ht(t,e){let n=e.clientX,l=e.clientY;return{currentTarget:t,shiftKey:e.shiftKey,ctrlKey:e.ctrlKey,metaKey:e.metaKey,altKey:e.altKey,clientX:n,clientY:l,key:e.key}}function tm(t){return t instanceof HTMLInputElement?!1:t instanceof HTMLButtonElement?t.type!=="submit"&&t.type!=="reset":!zr(t)}function ei(t,e){return t instanceof HTMLInputElement?!la(t,e):tm(t)}const nm=new Set(["checkbox","radio","range","color","file","image","button","submit","reset"]);function la(t,e){return t.type==="checkbox"||t.type==="radio"?e===" ":nm.has(t.type)}function lm(t,e){let{elementType:n="button",isDisabled:l,onPress:r,onPressStart:o,onPressEnd:i,onPressUp:u,onPressChange:a,preventFocusOnPress:c,allowFocusWhenDisabled:f,onClick:d,href:b,target:p,rel:h,type:y="button"}=t,m;n==="button"?m={type:y,disabled:l,form:t.form,formAction:t.formAction,formEncType:t.formEncType,formMethod:t.formMethod,formNoValidate:t.formNoValidate,formTarget:t.formTarget,name:t.name,value:t.value}:m={role:"button",href:n==="a"&&!l?b:void 0,target:n==="a"?p:void 0,type:n==="input"?y:void 0,disabled:n==="input"?l:void 0,"aria-disabled":!l||n==="input"?void 0:l,rel:n==="a"?h:void 0};let{pressProps:g,isPressed:v}=lt({onPressStart:o,onPressEnd:i,onPressChange:a,onPress:r,onPressUp:u,onClick:d,isDisabled:l,preventFocusOnPress:c,ref:e}),{focusableProps:E}=wt(t,e);f&&(E.tabIndex=l?-1:E.tabIndex);let C=W(E,g,oe(t,{labelable:!0}));return{isPressed:v,buttonProps:W(m,C,{"aria-haspopup":t["aria-haspopup"],"aria-expanded":t["aria-expanded"],"aria-controls":t["aria-controls"],"aria-pressed":t["aria-pressed"],"aria-current":t["aria-current"],"aria-disabled":t["aria-disabled"]})}}function dl(t){let{isDisabled:e,onBlurWithin:n,onFocusWithin:l,onFocusWithinChange:r}=t,o=s.useRef({isFocusWithin:!1}),{addGlobalListener:i,removeAllGlobalListeners:u}=Et(),a=s.useCallback(d=>{ne(d.currentTarget,U(d))&&o.current.isFocusWithin&&!ne(d.currentTarget,d.relatedTarget)&&(o.current.isFocusWithin=!1,u(),n&&n(d),r&&r(!1))},[n,r,o,u]),c=Zu(a),f=s.useCallback(d=>{if(!ne(d.currentTarget,U(d)))return;let b=U(d);const p=re(b),h=ie(p);if(!o.current.isFocusWithin&&h===b){l&&l(d),r&&r(!0),o.current.isFocusWithin=!0,c(d);let y=d.currentTarget;i(p,"focus",m=>{let g=U(m);if(o.current.isFocusWithin&&!ne(y,g)){let v=new p.defaultView.FocusEvent("blur",{relatedTarget:g});qu(v,y);let E=Ir(v);a(E)}},{capture:!0})}},[l,r,c,i,a]);return e?{focusWithinProps:{onFocus:void 0,onBlur:void 0}}:{focusWithinProps:{onFocus:f,onBlur:a}}}function Ve(t={}){let{autoFocus:e=!1,isTextInput:n,within:l}=t,r=s.useRef({isFocused:!1,isFocusVisible:e||zt()}),[o,i]=s.useState(!1),[u,a]=s.useState(()=>r.current.isFocused&&r.current.isFocusVisible),c=s.useCallback(()=>a(r.current.isFocused&&r.current.isFocusVisible),[]),f=s.useCallback(p=>{r.current.isFocused=p,r.current.isFocusVisible=zt(),i(p),c()},[c]);Jh(p=>{r.current.isFocusVisible=p,c()},[n,o],{enabled:o,isTextInput:n});let{focusProps:d}=Lr({isDisabled:l,onFocusChange:f}),{focusWithinProps:b}=dl({isDisabled:!l,onFocusWithinChange:f});return{isFocused:o,isFocusVisible:u,focusProps:l?b:d}}let lr=!1,zn=0;function rm(){lr=!0,setTimeout(()=>{lr=!1},500)}function ti(t){t.pointerType==="touch"&&rm()}function om(){let t=re(null);if(!(typeof t>"u"))return zn===0&&typeof PointerEvent<"u"&&t.addEventListener("pointerup",ti),zn++,()=>{zn--,!(zn>0)&&typeof PointerEvent<"u"&&t.removeEventListener("pointerup",ti)}}function Fe(t){let{onHoverStart:e,onHoverChange:n,onHoverEnd:l,isDisabled:r}=t,[o,i]=s.useState(!1),u=s.useRef({isHovered:!1,ignoreEmulatedMouseEvents:!1,pointerType:"",target:null}).current;s.useEffect(om,[]);let{addGlobalListener:a,removeAllGlobalListeners:c}=Et(),{hoverProps:f,triggerHoverEnd:d}=s.useMemo(()=>{let b=(y,m)=>{if(u.pointerType=m,r||m==="touch"||u.isHovered||!ne(y.currentTarget,U(y)))return;u.isHovered=!0;let g=y.currentTarget;u.target=g,a(re(U(y)),"pointerover",v=>{u.isHovered&&u.target&&!ne(u.target,U(v))&&p(v,v.pointerType)},{capture:!0}),e&&e({type:"hoverstart",target:g,pointerType:m}),n&&n(!0),i(!0)},p=(y,m)=>{let g=u.target;u.pointerType="",u.target=null,!(m==="touch"||!u.isHovered||!g)&&(u.isHovered=!1,c(),l&&l({type:"hoverend",target:g,pointerType:m}),n&&n(!1),i(!1))},h={};return typeof PointerEvent<"u"&&(h.onPointerEnter=y=>{lr&&y.pointerType==="mouse"||b(y,y.pointerType)},h.onPointerLeave=y=>{!r&&ne(y.currentTarget,U(y))&&p(y,y.pointerType)}),{hoverProps:h,triggerHoverEnd:p}},[e,n,l,r,u,a,c]);return s.useEffect(()=>{r&&d({currentTarget:u.target},u.pointerType)},[r]),{hoverProps:f,isHovered:o}}const En=s.createContext({}),Nr=Cn(function(e,n){[e,n]=ve(e,n,En);let l=e,{isPending:r}=l,{buttonProps:o,isPressed:i}=lm(e,n);o=um(o,r);let{focusProps:u,isFocused:a,isFocusVisible:c}=Ve(e),{hoverProps:f,isHovered:d}=Fe({...e,isDisabled:e.isDisabled||r}),b={isHovered:d,isPressed:(l.isPressed||i)&&!r,isFocused:a,isFocusVisible:c,isDisabled:e.isDisabled||!1,isPending:r??!1},p=ae({...e,values:b,defaultClassName:"react-aria-Button"}),h=$e(o.id),y=$e(),m=o["aria-labelledby"];r&&(m?m=`${m} ${y}`:o["aria-label"]&&(m=`${h} ${y}`));let g=s.useRef(r);s.useEffect(()=>{let E={"aria-labelledby":m||h};(!g.current&&a&&r||g.current&&a&&!r)&&yt(E,"assertive"),g.current=r},[r,a,m,h]);let v=oe(e,{global:!0});return delete v.onClick,x.createElement(ee.button,{...W(v,p,o,u,f),type:o.type==="submit"&&r?"button":o.type,id:h,ref:n,"aria-labelledby":m,slot:e.slot||void 0,"aria-disabled":r?"true":o["aria-disabled"],"data-disabled":e.isDisabled||void 0,"data-pressed":b.isPressed||void 0,"data-hovered":d||void 0,"data-focused":a||void 0,"data-pending":r||void 0,"data-focus-visible":c||void 0},x.createElement(Hh.Provider,{value:{id:y}},p.children))}),im=/Focus|Blur|Hover|Pointer(Enter|Leave|Over|Out)|Mouse(Enter|Leave|Over|Out)/;function um(t,e){if(e){for(const n in t)n.startsWith("on")&&!im.test(n)&&(t[n]=void 0);t.href=void 0,t.target=void 0}return t}const am=typeof document<"u"?x.useInsertionEffect??x.useLayoutEffect:()=>{};function ct(t,e,n){let[l,r]=s.useState(t||e),o=s.useRef(l),i=s.useRef(t!==void 0),u=t!==void 0;s.useEffect(()=>{i.current,i.current=u},[u]);let a=u?t:l;am(()=>{o.current=a});let[,c]=s.useReducer(()=>({}),{}),f=s.useCallback((d,...b)=>{let p=typeof d=="function"?d(o.current):d;Object.is(o.current,p)||(o.current=p,r(p),c(),n==null||n(p,...b))},[n]);return[a,f]}const ra=s.createContext({}),sm=s.forwardRef(function(e,n){[e,n]=ve(e,n,ra);let{children:l,level:r=3,className:o,...i}=e,u=ee[`h${r}`];return x.createElement(u,{...i,ref:n,className:o??"react-aria-Heading"},l)}),oa=t=>t?"true":void 0;function ge(t,e){return Th(t,(n,l)=>{const r=typeof e=="function"?e(l)??"":e??"";return Lt(r,n??"")??""})}const fe=(t,e,n)=>typeof t=="function"?t({className:e}):e,cm=t=>I.jsx("svg",{"aria-hidden":"true","aria-label":"Chevron down icon",fill:"none",height:16,role:"presentation",viewBox:"0 0 16 16",width:16,xmlns:"http://www.w3.org/2000/svg",...t,children:I.jsx("path",{clipRule:"evenodd",d:"M2.97 5.47a.75.75 0 0 1 1.06 0L8 9.44l3.97-3.97a.75.75 0 1 1 1.06 1.06l-4.5 4.5a.75.75 0 0 1-1.06 0l-4.5-4.5a.75.75 0 0 1 0-1.06",fill:"currentColor",fillRule:"evenodd"})}),dm=t=>I.jsx("svg",{"aria-hidden":"true","aria-label":"Chevron up icon",fill:"none",height:16,role:"presentation",viewBox:"0 0 16 16",width:16,xmlns:"http://www.w3.org/2000/svg",...t,children:I.jsx("path",{clipRule:"evenodd",d:"M13.03 10.53a.75.75 0 0 1-1.06 0L8 6.56l-3.97 3.97a.75.75 0 0 1-1.06-1.06l4.5-4.5a.75.75 0 0 1 1.06 0l4.5 4.5a.75.75 0 0 1 0 1.06",fill:"currentColor",fillRule:"evenodd"})}),fm=({height:t=9,width:e=9,...n})=>I.jsx("svg",{"aria-hidden":"true","aria-label":"External link icon",fill:"none",height:t,role:"presentation",viewBox:"0 0 7 7",width:e,xmlns:"http://www.w3.org/2000/svg",...n,children:I.jsx("path",{d:"M1.20592 6.84333L0.379822 6.01723L4.52594 1.8672H1.37819L1.38601 0.731812H6.48742V5.83714H5.34421L5.35203 2.6933L1.20592 6.84333Z",fill:"currentColor"})}),pm=t=>I.jsx("svg",{"aria-hidden":"true","aria-label":"Close icon",fill:"none",height:16,role:"presentation",viewBox:"0 0 16 16",width:16,xmlns:"http://www.w3.org/2000/svg",...t,children:I.jsx("path",{clipRule:"evenodd",d:"M3.47 3.47a.75.75 0 0 1 1.06 0L8 6.94l3.47-3.47a.75.75 0 1 1 1.06 1.06L9.06 8l3.47 3.47a.75.75 0 1 1-1.06 1.06L8 9.06l-3.47 3.47a.75.75 0 0 1-1.06-1.06L6.94 8 3.47 4.53a.75.75 0 0 1 0-1.06Z",fill:"currentColor",fillRule:"evenodd"})}),ni=t=>I.jsx("svg",{"aria-hidden":"true","aria-label":"Info icon",fill:"none",height:16,role:"presentation",viewBox:"0 0 16 16",width:16,xmlns:"http://www.w3.org/2000/svg",...t,children:I.jsx("path",{clipRule:"evenodd",d:"M8 13.5a5.5 5.5 0 1 0 0-11a5.5 5.5 0 0 0 0 11M8 15A7 7 0 1 0 8 1a7 7 0 0 0 0 14m1-9.5a1 1 0 1 1-2 0a1 1 0 0 1 2 0m-.25 3a.75.75 0 0 0-1.5 0V11a.75.75 0 0 0 1.5 0z",fill:"currentColor",fillRule:"evenodd"})}),bm=t=>I.jsx("svg",{"aria-hidden":"true","aria-label":"Warning icon",fill:"none",height:16,role:"presentation",viewBox:"0 0 16 16",width:16,xmlns:"http://www.w3.org/2000/svg",...t,children:I.jsx("path",{clipRule:"evenodd",d:"M7.134 2.994L2.217 11.5a1 1 0 0 0 .866 1.5h9.834a1 1 0 0 0 .866-1.5L8.866 2.993a1 1 0 0 0-1.732 0m3.03-.75c-.962-1.665-3.366-1.665-4.329 0L.918 10.749c-.963 1.666.24 3.751 2.165 3.751h9.834c1.925 0 3.128-2.085 2.164-3.751zM8 5a.75.75 0 0 1 .75.75v2a.75.75 0 0 1-1.5 0v-2A.75.75 0 0 1 8 5m1 5.75a1 1 0 1 1-2 0a1 1 0 0 1 2 0",fill:"currentColor",fillRule:"evenodd"})}),li=t=>I.jsx("svg",{"aria-hidden":"true","aria-label":"Danger icon",fill:"none",height:16,role:"presentation",viewBox:"0 0 16 16",width:16,xmlns:"http://www.w3.org/2000/svg",...t,children:I.jsx("path",{clipRule:"evenodd",d:"M8 13.5a5.5 5.5 0 1 0 0-11a5.5 5.5 0 0 0 0 11M8 15A7 7 0 1 0 8 1a7 7 0 0 0 0 14m1-4.5a1 1 0 1 1-2 0a1 1 0 0 1 2 0M8.75 5a.75.75 0 0 0-1.5 0v2.5a.75.75 0 0 0 1.5 0z",fill:"currentColor",fillRule:"evenodd"})}),hm=t=>I.jsx("svg",{"aria-hidden":"true","aria-label":"Success icon",fill:"none",height:16,role:"presentation",viewBox:"0 0 16 16",width:16,xmlns:"http://www.w3.org/2000/svg",...t,children:I.jsx("path",{clipRule:"evenodd",d:"M13.5 8a5.5 5.5 0 1 1-11 0a5.5 5.5 0 0 1 11 0M15 8A7 7 0 1 1 1 8a7 7 0 0 1 14 0m-3.9-1.55a.75.75 0 1 0-1.2-.9L7.419 8.858L6.03 7.47a.75.75 0 0 0-1.06 1.06l2 2a.75.75 0 0 0 1.13-.08z",fill:"currentColor",fillRule:"evenodd"})}),ia=s.createContext({}),mm=s.createContext({placement:"bottom"}),gm=typeof HTMLElement<"u"&&"inert"in HTMLElement.prototype;function ri(t){return t.dataset.liveAnnouncer==="true"||t.dataset.reactAriaTopLayer!==void 0}let Yt=new WeakMap,Be=[];function Vr(t,e){let n=Se(t==null?void 0:t[0]),l=e instanceof n.Element?{root:e}:e,r=(l==null?void 0:l.root)??document.body,o=(l==null?void 0:l.shouldUseInert)&&gm,i=new Set(t),u=new Set,a=m=>o&&m instanceof n.HTMLElement?m.inert:m.getAttribute("aria-hidden")==="true",c=(m,g)=>{o&&m instanceof n.HTMLElement?m.inert=g:g?m.setAttribute("aria-hidden","true"):(m.removeAttribute("aria-hidden"),m instanceof n.HTMLElement&&(m.inert=!1))},f=new Set;if(Qe())for(let m of t){let g=m;for(;g&&g!==r;){let v=g.getRootNode();"shadowRoot"in v&&f.add(v.shadowRoot),g=v.parentNode}}let d=m=>{for(let C of m.querySelectorAll("[data-live-announcer], [data-react-aria-top-layer]"))i.add(C);let g=C=>{if(u.has(C)||i.has(C)||C.parentElement&&u.has(C.parentElement)&&C.parentElement.getAttribute("role")!=="row")return NodeFilter.FILTER_REJECT;for(let R of i)if(ne(C,R))return NodeFilter.FILTER_SKIP;return NodeFilter.FILTER_ACCEPT},v=yu(re(m),m,NodeFilter.SHOW_ELEMENT,{acceptNode:g}),E=g(m);if(E===NodeFilter.FILTER_ACCEPT&&b(m),E!==NodeFilter.FILTER_REJECT){let C=v.nextNode();for(;C!=null;)b(C),C=v.nextNode()}},b=m=>{let g=Yt.get(m)??0;a(m)&&g===0||(g===0&&c(m,!0),u.add(m),Yt.set(m,g+1))};Be.length&&Be[Be.length-1].disconnect(),d(r);let p=new MutationObserver(m=>{for(let g of m)if(g.type==="childList"){if(g.target.isConnected&&![...i,...u].some(v=>ne(v,g.target)))for(let v of g.addedNodes)(v instanceof HTMLElement||v instanceof SVGElement)&&ri(v)?i.add(v):v instanceof Element&&d(v);if(Qe()){for(let v of f)if(!v.isConnected){p.disconnect();break}}}});p.observe(r,{childList:!0,subtree:!0});let h=new Set;if(Qe())for(let m of f){let g=new MutationObserver(v=>{for(let E of v)if(E.type==="childList"){if(E.target.isConnected&&![...i,...u].some(C=>ne(C,E.target)))for(let C of E.addedNodes)(C instanceof HTMLElement||C instanceof SVGElement)&&ri(C)?i.add(C):C instanceof Element&&d(C);if(Qe()){for(let C of f)if(!C.isConnected){p.disconnect();break}}}});g.observe(m,{childList:!0,subtree:!0}),h.add(g)}let y={visibleNodes:i,hiddenNodes:u,observe(){p.observe(r,{childList:!0,subtree:!0})},disconnect(){p.disconnect()}};return Be.push(y),()=>{if(p.disconnect(),Qe())for(let m of h)m.disconnect();for(let m of u){let g=Yt.get(m);g!=null&&(g===1?(c(m,!1),Yt.delete(m)):Yt.set(m,g-1))}y===Be[Be.length-1]?(Be.pop(),Be.length&&Be[Be.length-1].observe()):Be.splice(Be.indexOf(y),1)}}function ym(t){let e=Be[Be.length-1];if(e&&!e.visibleNodes.has(t))return e.visibleNodes.add(t),()=>{e.visibleNodes.delete(t)}}const Le={top:"top",bottom:"top",left:"left",right:"left"},Qn={top:"bottom",bottom:"top",left:"right",right:"left"},$m={top:"left",left:"top"},rr={top:"height",left:"width"},ua={width:"totalWidth",height:"totalHeight"},Nn={};let vm=()=>typeof document<"u"?window.visualViewport:null;function oi(t,e){let n=0,l=0,r=0,o=0,i=0,u=0,a={},c=((e==null?void 0:e.scale)??1)>1;if(t.tagName==="BODY"||t.tagName==="HTML"){let f=document.documentElement;r=f.clientWidth,o=f.clientHeight,n=(e==null?void 0:e.width)??r,l=(e==null?void 0:e.height)??o,a.top=f.scrollTop||t.scrollTop,a.left=f.scrollLeft||t.scrollLeft,e&&(i=e.offsetTop,u=e.offsetLeft)}else({width:n,height:l,top:i,left:u}=mn(t,!1)),a.top=t.scrollTop,a.left=t.scrollLeft,r=n,o=l;return pu()&&(t.tagName==="BODY"||t.tagName==="HTML")&&c&&(a.top=0,a.left=0,i=(e==null?void 0:e.pageTop)??0,u=(e==null?void 0:e.pageLeft)??0),{width:n,height:l,totalWidth:r,totalHeight:o,scroll:a,top:i,left:u}}function xm(t){return{top:t.scrollTop,left:t.scrollLeft,width:t.scrollWidth,height:t.scrollHeight}}function ii(t,e,n,l,r,o,i){let u=r.scroll[t]??0,a=l[rr[t]],c=i[t]+l.scroll[Le[t]]+o,f=i[t]+l.scroll[Le[t]]+a-o,d=e-u+l.scroll[Le[t]]+i[t]-l[Le[t]],b=e-u+n+l.scroll[Le[t]]+i[t]-l[Le[t]];return df?Math.max(f-b,c-d):0}function Cm(t){let e=window.getComputedStyle(t);return{top:parseInt(e.marginTop,10)||0,bottom:parseInt(e.marginBottom,10)||0,left:parseInt(e.marginLeft,10)||0,right:parseInt(e.marginRight,10)||0}}function ui(t){if(Nn[t])return Nn[t];let[e,n]=t.split(" "),l=Le[e]||"right",r=$m[l];Le[n]||(n="center");let o=rr[l],i=rr[r];return Nn[t]={placement:e,crossPlacement:n,axis:l,crossAxis:r,size:o,crossSize:i},Nn[t]}function Ml(t,e,n,l,r,o,i,u,a,c,f){let{placement:d,crossPlacement:b,axis:p,crossAxis:h,size:y,crossSize:m}=l,g={};g[h]=t[h]??0,b==="center"?g[h]+=((t[m]??0)-(n[m]??0))/2:b!==h&&(g[h]+=(t[m]??0)-(n[m]??0)),g[h]+=o;const v=t[h]-n[m]+a+c,E=t[h]+t[m]-a-c;if(g[h]=fn(g[h],v,E),d===p){let C=u?f[y]:f[ua[y]];g[Qn[p]]=Math.floor(C-t[p]+r)}else g[p]=Math.floor(t[p]+t[y]+r);return g}function Em(t,e,n,l,r,o,i,u,a,c,f){let d=(t.top!=null?t.top:a[ua.height]-(t.bottom??0)-i)-(a.scroll.top??0),b=c?n.top:0,p={top:Math.max(e.top+b,((f==null?void 0:f.offsetTop)??e.top)+b),bottom:Math.min(e.top+e.height+b,((f==null?void 0:f.offsetTop)??0)+((f==null?void 0:f.height)??0))};return u!=="top"?Math.max(0,p.bottom-d-((r.top??0)+(r.bottom??0)+o)):Math.max(0,d+i-p.top-((r.top??0)+(r.bottom??0)+o))}function ai(t,e,n,l,r,o,i,u){let{placement:a,axis:c,size:f}=o;return a===c?Math.max(0,n[c]-(i.scroll[c]??0)-(t[c]+(u?e[c]:0))-(l[c]??0)-l[Qn[c]]-r):Math.max(0,t[f]+t[c]+(u?e[c]:0)-n[c]-n[f]+(i.scroll[c]??0)-(l[c]??0)-l[Qn[c]]-r)}function wm(t,e,n,l,r,o,i,u,a,c,f,d,b,p,h,y,m,g){let v=ui(t),{size:E,crossAxis:C,crossSize:R,placement:T,crossPlacement:F}=v,B=Ml(e,u,n,v,f,d,c,b,h,y,a),L=f,M=ai(u,c,e,r,o+f,v,a,m);if(i&&n[E]>M){let O=ui(`${Qn[T]} ${F}`),X=Ml(e,u,n,O,f,d,c,b,h,y,a);ai(u,c,e,r,o+f,O,a,m)>M&&(v=O,B=X,L=f)}let V="bottom";v.axis==="top"?v.placement==="top"?V="top":v.placement==="bottom"&&(V="bottom"):v.crossAxis==="top"&&(v.crossPlacement==="top"?V="bottom":v.crossPlacement==="bottom"&&(V="top"));let H=ii(C,B[C],n[R],u,a,o,c);B[C]+=H;let j=Em(B,u,c,b,r,o,n.height,V,a,m,g);p&&p{if(!n||l===null)return;let r=o=>{let i=U(o);if(!e.current||i instanceof Node&&!ne(i,e.current)||i instanceof HTMLInputElement||i instanceof HTMLTextAreaElement)return;let u=l||aa.get(e.current);u&&u()};return window.addEventListener("scroll",r,!0),()=>{window.removeEventListener("scroll",r,!0)}},[n,l,e])}let be=typeof document<"u"?window.visualViewport:null;function Pm(t){let{direction:e}=Pe(),{arrowSize:n,targetRef:l,overlayRef:r,arrowRef:o,scrollRef:i=r,placement:u="bottom",containerPadding:a=12,shouldFlip:c=!0,boundaryElement:f=typeof document<"u"?document.body:null,offset:d=0,crossOffset:b=0,shouldUpdatePosition:p=!0,isOpen:h=!0,onClose:y,maxHeight:m,arrowBoundaryOffset:g=0}=t,[v,E]=s.useState(null),C=[p,u,r.current,l.current,o==null?void 0:o.current,i.current,a,c,f,d,b,h,e,m,g,n],R=s.useRef(be==null?void 0:be.scale);s.useEffect(()=>{h&&(R.current=be==null?void 0:be.scale)},[h]);let T=s.useCallback(()=>{var j,$;if(p===!1||!h||!r.current||!l.current||!f||(be==null?void 0:be.scale)!==R.current)return;let L=null;if(i.current&&xt(i.current)){let D=(j=ie())==null?void 0:j.getBoundingClientRect(),A=i.current.getBoundingClientRect();L={type:"top",offset:((D==null?void 0:D.top)??0)-A.top},L.offset>A.height/2&&(L.type="bottom",L.offset=((D==null?void 0:D.bottom)??0)-A.bottom)}let M=r.current;!m&&r.current&&(M.style.top="0px",M.style.bottom="",M.style.maxHeight=((($=window.visualViewport)==null?void 0:$.height)??window.innerHeight)+"px");let V=Sm({placement:Am(u,e),overlayNode:r.current,targetNode:l.current,scrollNode:i.current||r.current,padding:a,shouldFlip:c,boundaryElement:f,offset:d,crossOffset:b,maxHeight:m,arrowSize:n??(o!=null&&o.current?fl(o.current,!0).width:0),arrowBoundaryOffset:g});if(!V.position)return;M.style.top="",M.style.bottom="",M.style.left="",M.style.right="",Object.keys(V.position).forEach(D=>M.style[D]=V.position[D]+"px"),M.style.maxHeight=V.maxHeight!=null?V.maxHeight+"px":"";let H=ie();if(L&&H&&i.current){let D=H.getBoundingClientRect(),A=i.current.getBoundingClientRect(),w=D[L.type]-A[L.type];i.current.scrollTop+=w-L.offset}E(V)},C);le(T,C),Tm(T),dn({ref:r,onResize:T}),dn({ref:l,onResize:T});let F=s.useRef(!1);le(()=>{let L,M=()=>{F.current=!0,clearTimeout(L),L=setTimeout(()=>{F.current=!1},500),T()},V=()=>{F.current&&M()};return be==null||be.addEventListener("resize",M),be==null||be.addEventListener("scroll",V),()=>{be==null||be.removeEventListener("resize",M),be==null||be.removeEventListener("scroll",V)}},[T]);let B=s.useCallback(()=>{F.current||y==null||y()},[y,F]);return km({triggerRef:l,isOpen:h,onClose:y&&B}),{overlayProps:{style:{position:v?"absolute":"fixed",top:v?void 0:0,left:v?void 0:0,zIndex:1e5,...v==null?void 0:v.position,maxHeight:(v==null?void 0:v.maxHeight)??"100vh"}},placement:(v==null?void 0:v.placement)??null,triggerAnchorPoint:(v==null?void 0:v.triggerAnchorPoint)??null,arrowProps:{"aria-hidden":"true",role:"presentation",style:{left:v==null?void 0:v.arrowOffsetLeft,top:v==null?void 0:v.arrowOffsetTop}},updatePosition:T}}function Tm(t){le(()=>(window.addEventListener("resize",t,!1),()=>{window.removeEventListener("resize",t,!1)}),[t])}function Am(t,e){return e==="rtl"?t.replace("start","right").replace("end","left"):t.replace("start","left").replace("end","right")}const di=x.createContext(null),or="react-aria-focus-scope-restore";let se=null;function Or(t){let{children:e,contain:n,restoreFocus:l,autoFocus:r}=t,o=s.useRef(null),i=s.useRef(null),u=s.useRef([]),{parentNode:a}=s.useContext(di)||{},c=s.useMemo(()=>new ur({scopeRef:u}),[u]);le(()=>{let b=a||me.root;if(me.getTreeNode(b.scopeRef)&&se&&!el(se,b.scopeRef)){let p=me.getTreeNode(se);p&&(b=p)}b.addChild(c),me.addNode(c)},[c,a]),le(()=>{let b=me.getTreeNode(u);b&&(b.contain=!!n)},[n]),le(()=>{var y;let b=(y=o.current)==null?void 0:y.nextSibling,p=[],h=m=>m.stopPropagation();for(;b&&b!==i.current;)p.push(b),b.addEventListener(or,h),b=b.nextSibling;return u.current=p,()=>{for(let m of p)m.removeEventListener(or,h)}},[e]),Lm(u,l,n),Mm(u,n),zm(u,l,n),Im(u,r),s.useEffect(()=>{const b=ie(re(u.current?u.current[0]:void 0));let p=null;if(Oe(b,u.current)){for(let h of me.traverse())h.scopeRef&&Oe(b,h.scopeRef.current)&&(p=h);p===me.getTreeNode(u)&&(se=p.scopeRef)}},[u]),le(()=>()=>{var p,h;let b=((h=(p=me.getTreeNode(u))==null?void 0:p.parent)==null?void 0:h.scopeRef)??null;(u===se||el(u,se))&&(!b||me.getTreeNode(b))&&(se=b),me.removeTreeNode(u)},[u]);let f=s.useMemo(()=>Bm(u),[]),d=s.useMemo(()=>({focusManager:f,parentNode:c}),[c,f]);return x.createElement(di.Provider,{value:d},x.createElement("span",{"data-focus-scope-start":!0,hidden:!0,ref:o}),e,x.createElement("span",{"data-focus-scope-end":!0,hidden:!0,ref:i}))}function Bm(t){return{focusNext(e={}){let n=t.current,{from:l,tabbable:r,wrap:o,accept:i}=e,u=l||ie(re(n[0]??void 0)),a=n[0].previousElementSibling,c=mt(n),f=ze(c,{tabbable:r,accept:i},n);f.currentNode=Oe(u,n)?u:a;let d=f.nextNode();return!d&&o&&(f.currentNode=a,d=f.nextNode()),d&&et(d,!0),d},focusPrevious(e={}){let n=t.current,{from:l,tabbable:r,wrap:o,accept:i}=e,u=l||ie(re(n[0]??void 0)),a=n[n.length-1].nextElementSibling,c=mt(n),f=ze(c,{tabbable:r,accept:i},n);f.currentNode=Oe(u,n)?u:a;let d=f.previousNode();return!d&&o&&(f.currentNode=a,d=f.previousNode()),d&&et(d,!0),d},focusFirst(e={}){let n=t.current,{tabbable:l,accept:r}=e,o=mt(n),i=ze(o,{tabbable:l,accept:r},n);i.currentNode=n[0].previousElementSibling;let u=i.nextNode();return u&&et(u,!0),u},focusLast(e={}){let n=t.current,{tabbable:l,accept:r}=e,o=mt(n),i=ze(o,{tabbable:l,accept:r},n);i.currentNode=n[n.length-1].nextElementSibling;let u=i.previousNode();return u&&et(u,!0),u}}}function mt(t){return t[0].parentElement}function nn(t){let e=me.getTreeNode(se);for(;e&&e.scopeRef!==t;){if(e.contain)return!1;e=e.parent}return!0}function Km(t){if(!t.form)return Array.from(re(t).querySelectorAll(`input[type="radio"][name="${CSS.escape(t.name)}"]`)).filter(l=>!l.form);const e=t.form.elements.namedItem(t.name);let n=Se(t);return e instanceof n.RadioNodeList?Array.from(e).filter(l=>l instanceof n.HTMLInputElement):e instanceof n.HTMLInputElement?[e]:[]}function Rm(t){if(t.checked)return!0;const e=Km(t);return e.length>0&&!e.some(n=>n.checked)}function Mm(t,e){let n=s.useRef(void 0),l=s.useRef(void 0);le(()=>{let r=t.current;if(!e){l.current&&(cancelAnimationFrame(l.current),l.current=void 0);return}const o=re(r?r[0]:void 0);let i=c=>{if(c.key!=="Tab"||c.altKey||c.ctrlKey||c.metaKey||!nn(t)||c.isComposing)return;let f=ie(o),d=t.current;if(!d||!Oe(f,d))return;let b=mt(d),p=ze(b,{tabbable:!0},d);if(!f)return;p.currentNode=f;let h=c.shiftKey?p.previousNode():p.nextNode();h||(p.currentNode=c.shiftKey?d[d.length-1].nextElementSibling:d[0].previousElementSibling,h=c.shiftKey?p.previousNode():p.nextNode()),c.preventDefault(),h&&(et(h,!0),h instanceof Se(h).HTMLInputElement&&h.select())},u=c=>{(!se||el(se,t))&&Oe(U(c),t.current)?(se=t,n.current=U(c)):nn(t)&&!at(U(c),t)?n.current?n.current.focus():se&&se.current&&ir(se.current):nn(t)&&(n.current=U(c))},a=c=>{l.current&&cancelAnimationFrame(l.current),l.current=requestAnimationFrame(()=>{var p;let f=bn(),d=(f==="virtual"||f===null)&&an()&&bu(),b=ie(o);if(!d&&b&&nn(t)&&!at(b,t)){se=t;let h=U(c);h&&h.isConnected?(n.current=h,(p=n.current)==null||p.focus()):se.current&&ir(se.current)}})};return o.addEventListener("keydown",i,!1),o.addEventListener("focusin",u,!1),r==null||r.forEach(c=>c.addEventListener("focusin",u,!1)),r==null||r.forEach(c=>c.addEventListener("focusout",a,!1)),()=>{o.removeEventListener("keydown",i,!1),o.removeEventListener("focusin",u,!1),r==null||r.forEach(c=>c.removeEventListener("focusin",u,!1)),r==null||r.forEach(c=>c.removeEventListener("focusout",a,!1))}},[t,e]),le(()=>()=>{l.current&&cancelAnimationFrame(l.current)},[l])}function sa(t){return at(t)}function Oe(t,e){return!t||!e?!1:e.some(n=>ne(n,t))}function at(t,e=null){if(t instanceof Element&&t.closest("[data-react-aria-top-layer]"))return!0;for(let{scopeRef:n}of me.traverse(me.getTreeNode(e)))if(n&&Oe(t,n.current))return!0;return!1}function Fm(t){return at(t,se)}function el(t,e){var l;let n=(l=me.getTreeNode(e))==null?void 0:l.parent;for(;n;){if(n.scopeRef===t)return!0;n=n.parent}return!1}function et(t,e=!1){if(t!=null&&!e)try{xe(t)}catch{}else if(t!=null)try{t.focus()}catch{}}function ca(t,e=!0){let n=t[0].previousElementSibling,l=mt(t),r=ze(l,{tabbable:e},t);r.currentNode=n;let o=r.nextNode();return e&&!o&&(l=mt(t),r=ze(l,{tabbable:!1},t),r.currentNode=n,o=r.nextNode()),o}function ir(t,e=!0){et(ca(t,e))}function Im(t,e){const n=x.useRef(e);s.useEffect(()=>{if(n.current){se=t;const l=re(t.current?t.current[0]:void 0);!Oe(ie(l),se.current)&&t.current&&ir(t.current)}n.current=!1},[t])}function Lm(t,e,n){le(()=>{if(e||n)return;let l=t.current;const r=re(l?l[0]:void 0);let o=i=>{let u=U(i);Oe(u,t.current)?se=t:sa(u)||(se=null)};return r.addEventListener("focusin",o,!1),l==null||l.forEach(i=>i.addEventListener("focusin",o,!1)),()=>{r.removeEventListener("focusin",o,!1),l==null||l.forEach(i=>i.removeEventListener("focusin",o,!1))}},[t,e,n])}function fi(t){let e=me.getTreeNode(se);for(;e&&e.scopeRef!==t;){if(e.nodeToRestore)return!1;e=e.parent}return(e==null?void 0:e.scopeRef)===t}function zm(t,e,n){const l=s.useRef(typeof document<"u"?ie(re(t.current?t.current[0]:void 0)):null);le(()=>{let r=t.current;const o=re(r?r[0]:void 0);if(!e||n)return;let i=()=>{(!se||el(se,t))&&Oe(ie(o),t.current)&&(se=t)};return o.addEventListener("focusin",i,!1),r==null||r.forEach(u=>u.addEventListener("focusin",i,!1)),()=>{o.removeEventListener("focusin",i,!1),r==null||r.forEach(u=>u.removeEventListener("focusin",i,!1))}},[t,n]),le(()=>{const r=re(t.current?t.current[0]:void 0);if(!e)return;let o=i=>{if(i.key!=="Tab"||i.altKey||i.ctrlKey||i.metaKey||!nn(t)||i.isComposing)return;let u=r.activeElement;if(!at(u,t)||!fi(t))return;let a=me.getTreeNode(t);if(!a)return;let c=a.nodeToRestore,f=ze(r.body,{tabbable:!0});f.currentNode=u;let d=i.shiftKey?f.previousNode():f.nextNode();if((!c||!c.isConnected||c===r.body)&&(c=void 0,a.nodeToRestore=void 0),(!d||!at(d,t))&&c){f.currentNode=c;do d=i.shiftKey?f.previousNode():f.nextNode();while(at(d,t));i.preventDefault(),i.stopPropagation(),d?et(d,!0):sa(c)?et(c,!0):u.blur()}};return n||r.addEventListener("keydown",o,!0),()=>{n||r.removeEventListener("keydown",o,!0)}},[t,e,n]),le(()=>{const r=re(t.current?t.current[0]:void 0);if(!e)return;let o=me.getTreeNode(t);if(o)return o.nodeToRestore=l.current??void 0,()=>{let i=me.getTreeNode(t);if(!i)return;let u=i.nodeToRestore,a=ie(r);if(e&&u&&(a&&at(a,t)||a===r.body&&fi(t))){let c=me.clone();requestAnimationFrame(()=>{if(r.activeElement===r.body){let f=c.getTreeNode(t);for(;f;){if(f.nodeToRestore&&f.nodeToRestore.isConnected){pi(f.nodeToRestore);return}f=f.parent}for(f=c.getTreeNode(t);f;){if(f.scopeRef&&f.scopeRef.current&&me.getTreeNode(f.scopeRef)){let d=ca(f.scopeRef.current,!0);pi(d);return}f=f.parent}}})}}},[t,e])}function pi(t){t.dispatchEvent(new CustomEvent(or,{bubbles:!0,cancelable:!0}))&&et(t)}function ze(t,e,n){let l=e!=null&&e.tabbable?Du:Su,r=(t==null?void 0:t.nodeType)===Node.ELEMENT_NODE?t:null,o=re(r),i=yu(o,t||o,NodeFilter.SHOW_ELEMENT,{acceptNode(u){return ne(e==null?void 0:e.from,u)||e!=null&&e.tabbable&&u.tagName==="INPUT"&&u.getAttribute("type")==="radio"&&(!Rm(u)||i.currentNode.tagName==="INPUT"&&i.currentNode.type==="radio"&&i.currentNode.name===u.name)?NodeFilter.FILTER_REJECT:l(u)&&(!n||Oe(u,n))&&(!(e!=null&&e.accept)||e.accept(u))?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});return e!=null&&e.from&&(i.currentNode=e.from),i}class jr{constructor(){this.fastMap=new Map,this.root=new ur({scopeRef:null}),this.fastMap.set(null,this.root)}get size(){return this.fastMap.size}getTreeNode(e){return this.fastMap.get(e)}addTreeNode(e,n,l){let r=this.fastMap.get(n??null);if(!r)return;let o=new ur({scopeRef:e});r.addChild(o),o.parent=r,this.fastMap.set(e,o),l&&(o.nodeToRestore=l)}addNode(e){this.fastMap.set(e.scopeRef,e)}removeTreeNode(e){if(e===null)return;let n=this.fastMap.get(e);if(!n)return;let l=n.parent;for(let o of this.traverse())o!==n&&n.nodeToRestore&&o.nodeToRestore&&n.scopeRef&&n.scopeRef.current&&Oe(o.nodeToRestore,n.scopeRef.current)&&(o.nodeToRestore=n.nodeToRestore);let r=n.children;l&&(l.removeChild(n),r.size>0&&r.forEach(o=>l&&l.addChild(o))),this.fastMap.delete(n.scopeRef)}*traverse(e=this.root){if(e.scopeRef!=null&&(yield e),e.children.size>0)for(let n of e.children)yield*this.traverse(n)}clone(){var n;let e=new jr;for(let l of this.traverse())e.addTreeNode(l.scopeRef,((n=l.parent)==null?void 0:n.scopeRef)??null,l.nodeToRestore);return e}}class ur{constructor(e){this.children=new Set,this.contain=!1,this.scopeRef=e.scopeRef}addChild(e){this.children.add(e),e.parent=this}removeChild(e){this.children.delete(e),e.parent=void 0}}let me=new jr;function Nm(t){let{ref:e,onInteractOutside:n,isDisabled:l,onInteractOutsideStart:r}=t,o=s.useRef({isPointerDown:!1,ignoreEmulatedMouseEvents:!1}),i=we(a=>{n&&bi(a,e)&&(r&&r(a),o.current.isPointerDown=!0)}),u=we(a=>{n&&n(a)});s.useEffect(()=>{let a=o.current;if(l)return;const c=e.current,f=re(c);if(typeof PointerEvent<"u"){let d=b=>{a.isPointerDown&&bi(b,e)&&u(b),a.isPointerDown=!1};return f.addEventListener("pointerdown",i,!0),f.addEventListener("click",d,!0),()=>{f.removeEventListener("pointerdown",i,!0),f.removeEventListener("click",d,!0)}}},[e,l])}function bi(t,e){if(t.button>0)return!1;let n=U(t);if(n){const l=n.ownerDocument;if(!l||!ne(l.documentElement,n)||n.closest("[data-react-aria-top-layer]"))return!1}return e.current?!t.composedPath().includes(e.current):!1}const Ue=[];function da(t,e){let{onClose:n,shouldCloseOnBlur:l,isOpen:r,isDismissable:o=!1,isKeyboardDismissDisabled:i=!1,shouldCloseOnInteractOutside:u}=t,a=s.useRef(void 0);s.useEffect(()=>{if(r&&!Ue.includes(e))return Ue.push(e),()=>{let h=Ue.indexOf(e);h>=0&&Ue.splice(h,1)}},[r,e]);let c=()=>{Ue[Ue.length-1]===e&&n&&n()},f=h=>{const y=Ue[Ue.length-1];a.current=y,(!u||u(U(h)))&&y===e&&h.stopPropagation()},d=h=>{(!u||u(U(h)))&&(Ue[Ue.length-1]===e&&h.stopPropagation(),a.current===e&&c()),a.current=void 0},b=h=>{h.key==="Escape"&&!i&&!h.nativeEvent.isComposing&&(h.stopPropagation(),h.preventDefault(),c())};Nm({ref:e,onInteractOutside:o&&r?d:void 0,onInteractOutsideStart:f});let{focusWithinProps:p}=dl({isDisabled:!l,onBlurWithin:h=>{!h.relatedTarget||Fm(h.relatedTarget)||(!u||u(h.relatedTarget))&&(n==null||n())}});return{overlayProps:{onKeyDown:b,...p},underlayProps:{}}}const un=typeof document<"u"&&window.visualViewport;let Vn=0,Fl;function fa(t={}){let{isDisabled:e}=t;le(()=>{if(!e)return Vn++,Vn===1&&(vt()?Fl=Om():Fl=Vm()),()=>{Vn--,Vn===0&&Fl()}},[e])}function Vm(){let t=window.innerWidth-document.documentElement.clientWidth;return ft(t>0&&("scrollbarGutter"in document.documentElement.style?Wn(document.documentElement,"scrollbarGutter","stable"):Wn(document.documentElement,"paddingRight",`${t}px`)),Wn(document.documentElement,"overflow","hidden"))}function Om(){let t=Wn(document.documentElement,"overflow","hidden"),e,n=!1,l=f=>{let d=U(f);e=st(d)?d:Xe(d,!0),n=!1;let b=d.ownerDocument.defaultView.getSelection();b&&!b.isCollapsed&&b.containsNode(d,!0)&&(n=!0),f.composedPath().some(p=>p instanceof HTMLInputElement&&p.type==="range")&&(n=!0),"selectionStart"in d&&"selectionEnd"in d&&d.selectionStart{if(!(f.touches.length===2||n)){if(!e||e===document.documentElement||e===document.body){f.preventDefault();return}e.scrollHeight===e.clientHeight&&e.scrollWidth===e.clientWidth&&f.preventDefault()}},u=f=>{var p;let d=U(f),b=f.relatedTarget;if(b&&rn(b))b.focus({preventScroll:!0}),hi(b,rn(d));else if(!b){let h=(p=d.parentElement)==null?void 0:p.closest("[tabindex]");h==null||h.focus({preventScroll:!0})}},a=HTMLElement.prototype.focus;HTMLElement.prototype.focus=function(f){let d=ie(),b=d!=null&&rn(d);a.call(this,{...f,preventScroll:!0}),(!f||!f.preventScroll)&&hi(this,b)};let c=ft(Il(document,"touchstart",l,{passive:!1,capture:!0}),Il(document,"touchmove",i,{passive:!1,capture:!0}),Il(document,"blur",u,!0));return()=>{t(),c(),r.remove(),HTMLElement.prototype.focus=a}}function Wn(t,e,n){let l=t.style[e];return t.style[e]=n,()=>{t.style[e]=l}}function Il(t,e,n,l){return t.addEventListener(e,n,l),()=>{t.removeEventListener(e,n,l)}}function hi(t,e){e||!un?mi(t):un.addEventListener("resize",()=>mi(t),{once:!0})}function mi(t){let e=document.scrollingElement||document.documentElement,n=t;for(;n&&n!==e;){let l=Xe(n);if(l!==document.documentElement&&l!==document.body&&l!==n){let r=l.getBoundingClientRect(),o=n.getBoundingClientRect();if(o.topr.top+n.clientHeight){let i=r.bottom;un&&(i=Math.min(i,un.offsetTop+un.height));let u=o.top-r.top-((i-r.top)/2-o.height/2);l.scrollTo({top:Math.max(0,Math.min(l.scrollHeight-l.clientHeight,l.scrollTop+u)),behavior:"smooth"})}}n=l.parentElement}}function jm(t,e){let{triggerRef:n,popoverRef:l,groupRef:r,isNonModal:o,isKeyboardDismissDisabled:i,shouldCloseOnInteractOutside:u,...a}=t,c=a.trigger==="SubmenuTrigger",{overlayProps:f,underlayProps:d}=da({isOpen:e.isOpen,onClose:e.close,shouldCloseOnBlur:!0,isDismissable:!o||c,isKeyboardDismissDisabled:i,shouldCloseOnInteractOutside:u},r??l),{overlayProps:b,arrowProps:p,placement:h,triggerAnchorPoint:y}=Pm({...a,targetRef:n,overlayRef:l,isOpen:e.isOpen,onClose:o&&!c?e.close:null});return fa({isDisabled:o||!e.isOpen}),s.useEffect(()=>{if(e.isOpen&&l.current)return o?ym((r==null?void 0:r.current)??l.current):Vr([(r==null?void 0:r.current)??l.current],{shouldUseInert:!0})},[o,e.isOpen,l,r]),{popoverProps:W(f,b),arrowProps:p,underlayProps:d,placement:h,triggerAnchorPoint:y}}var pa={};pa={dismiss:"تجاهل"};var ba={};ba={dismiss:"Отхвърляне"};var ha={};ha={dismiss:"Odstranit"};var ma={};ma={dismiss:"Luk"};var ga={};ga={dismiss:"Schließen"};var ya={};ya={dismiss:"Απόρριψη"};var $a={};$a={dismiss:"Dismiss"};var va={};va={dismiss:"Descartar"};var xa={};xa={dismiss:"Lõpeta"};var Ca={};Ca={dismiss:"Hylkää"};var Ea={};Ea={dismiss:"Rejeter"};var wa={};wa={dismiss:"התעלם"};var Sa={};Sa={dismiss:"Odbaci"};var Da={};Da={dismiss:"Elutasítás"};var ka={};ka={dismiss:"Ignora"};var Pa={};Pa={dismiss:"閉じる"};var Ta={};Ta={dismiss:"무시"};var Aa={};Aa={dismiss:"Atmesti"};var Ba={};Ba={dismiss:"Nerādīt"};var Ka={};Ka={dismiss:"Lukk"};var Ra={};Ra={dismiss:"Negeren"};var Ma={};Ma={dismiss:"Zignoruj"};var Fa={};Fa={dismiss:"Descartar"};var Ia={};Ia={dismiss:"Dispensar"};var La={};La={dismiss:"Revocare"};var za={};za={dismiss:"Пропустить"};var Na={};Na={dismiss:"Zrušiť"};var Va={};Va={dismiss:"Opusti"};var Oa={};Oa={dismiss:"Odbaci"};var ja={};ja={dismiss:"Avvisa"};var _a={};_a={dismiss:"Kapat"};var Ha={};Ha={dismiss:"Скасувати"};var Wa={};Wa={dismiss:"取消"};var Ua={};Ua={dismiss:"關閉"};var Ga={};Ga={"ar-AE":pa,"bg-BG":ba,"cs-CZ":ha,"da-DK":ma,"de-DE":ga,"el-GR":ya,"en-US":$a,"es-ES":va,"et-EE":xa,"fi-FI":Ca,"fr-FR":Ea,"he-IL":wa,"hr-HR":Sa,"hu-HU":Da,"it-IT":ka,"ja-JP":Pa,"ko-KR":Ta,"lt-LT":Aa,"lv-LV":Ba,"nb-NO":Ka,"nl-NL":Ra,"pl-PL":Ma,"pt-BR":Fa,"pt-PT":Ia,"ro-RO":La,"ru-RU":za,"sk-SK":Na,"sl-SI":Va,"sr-SP":Oa,"sv-SE":ja,"tr-TR":_a,"uk-UA":Ha,"zh-CN":Wa,"zh-TW":Ua};const _m=Symbol.for("react-aria.i18n.locale"),Hm=Symbol.for("react-aria.i18n.strings");let Pt;class pl{constructor(e,n="en-US"){this.strings=Object.fromEntries(Object.entries(e).filter(([,l])=>l)),this.defaultLocale=n}getStringForLocale(e,n){let r=this.getStringsForLocale(n)[e];if(!r)throw new Error(`Could not find intl message ${e} in ${n} locale`);return r}getStringsForLocale(e){let n=this.strings[e];return n||(n=Wm(e,this.strings,this.defaultLocale),this.strings[e]=n),n}static getGlobalDictionaryForPackage(e){if(typeof window>"u")return null;let n=window[_m];if(Pt===void 0){let r=window[Hm];if(!r)return null;Pt={};for(let o in r)Pt[o]=new pl({[n]:r[o]},n)}let l=Pt==null?void 0:Pt[e];if(!l)throw new Error(`Strings for package "${e}" were not included by LocalizedStringProvider. Please add it to the list passed to createLocalizedStringDictionary.`);return l}}function Wm(t,e,n="en-US"){if(e[t])return e[t];let l=Um(t);if(e[l])return e[l];for(let r in e)if(r.startsWith(l+"-"))return e[r];return e[n]}function Um(t){return Intl.Locale?new Intl.Locale(t).language:t.split("-")[0]}const gi=new Map,yi=new Map;class Gm{constructor(e,n){this.locale=e,this.strings=n}format(e,n){let l=this.strings.getStringForLocale(e,this.locale);return typeof l=="function"?l(n,this):l}plural(e,n,l="cardinal"){let r=n["="+e];if(r)return typeof r=="function"?r():r;let o=this.locale+":"+l,i=gi.get(o);i||(i=new Intl.PluralRules(this.locale,{type:l}),gi.set(o,i));let u=i.select(e);return r=n[u]||n.other,typeof r=="function"?r():r}number(e){let n=yi.get(this.locale);return n||(n=new Intl.NumberFormat(this.locale),yi.set(this.locale,n)),n.format(e)}select(e,n){let l=e[n]||e.other;return typeof l=="function"?l():l}}const $i=new WeakMap;function qm(t){let e=$i.get(t);return e||(e=new pl(t),$i.set(t,e)),e}function Zm(t,e){return e&&pl.getGlobalDictionaryForPackage(e)||qm(t)}function _e(t,e){let{locale:n}=Pe(),l=Zm(t,e);return s.useMemo(()=>new Gm(n,l),[n,l])}const vi={border:0,clip:"rect(0 0 0 0)",clipPath:"inset(50%)",height:"1px",margin:"-1px",overflow:"hidden",padding:0,position:"absolute",width:"1px",whiteSpace:"nowrap"};function wn(t={}){let{style:e,isFocusable:n}=t,[l,r]=s.useState(!1),{focusWithinProps:o}=dl({isDisabled:!n,onFocusWithinChange:u=>r(u)}),i=s.useMemo(()=>l?e:e?{...vi,...e}:vi,[l]);return{visuallyHiddenProps:{...o,style:i}}}function _r(t){let{children:e,elementType:n="div",isFocusable:l,style:r,...o}=t,{visuallyHiddenProps:i}=wn(t);return x.createElement(n,W(o,i),e)}function Ym(t){return t&&t.__esModule?t.default:t}function ar(t){let{onDismiss:e,...n}=t,l=_e(Ym(Ga),"@react-aria/overlays"),r=cn(n,l.format("dismiss")),o=()=>{e&&e()};return x.createElement(_r,null,x.createElement("button",{...r,tabIndex:-1,onClick:o,style:{width:1,height:1}}))}const Xm=x.forwardRef(({children:t,...e},n)=>{let l=s.useRef(!1),r=s.useContext(hn),o=W(r||{},{...e,register(){l.current=!0,r&&r.register()}});return o.ref=Te(n||(r==null?void 0:r.ref)),Ar(r,o.ref),s.useEffect(()=>{l.current||(l.current=!0)},[]),x.createElement(hn.Provider,{value:o},t)});function Jm({children:t}){let e=s.useMemo(()=>({register:()=>{}}),[]);return x.createElement(hn.Provider,{value:e},t)}const Qm=s.createContext({});function e4(){return s.useContext(Qm)??{}}const qa=x.createContext(null);function sr(t){let e=dt(),{portalContainer:n=e?null:document.body,isExiting:l}=t,[r,o]=s.useState(!1),i=s.useMemo(()=>({contain:r,setContain:o}),[r,o]),{getContainer:u}=e4();if(!t.portalContainer&&u&&(n=u()),!n)return null;let a=t.children;return t.disableFocusManagement||(a=x.createElement(Or,{restoreFocus:!0,contain:(t.shouldContainFocus||r)&&!l},a)),a=x.createElement(qa.Provider,{value:i},x.createElement(Jm,null,a)),du.createPortal(a,n)}function Za(){let t=s.useContext(qa),e=t==null?void 0:t.setContain;le(()=>{e==null||e(!0)},[e])}function bl(t){let[e,n]=ct(t.isOpen,t.defaultOpen||!1,t.onOpenChange);const l=s.useCallback(()=>{n(!0)},[n]),r=s.useCallback(()=>{n(!1)},[n]),o=s.useCallback(()=>{n(!e)},[n,e]);return{isOpen:e,setOpen:n,open:l,close:r,toggle:o}}const Hr=s.createContext(null),xi=s.createContext(null),t4=s.forwardRef(function(e,n){[e,n]=ve(e,n,Hr);let l=s.useContext(St),r=bl(e),o=e.isOpen!=null||e.defaultOpen!=null||!l?r:l,i=Ul(n,o.isOpen)||e.isExiting||!1,u=Kh(),{direction:a}=Pe();if(u){let c=e.children;return typeof c=="function"&&(c=c({trigger:e.trigger||null,placement:"bottom",isEntering:!1,isExiting:!1,defaultChildren:null})),x.createElement(x.Fragment,null,c)}return o&&!o.isOpen&&!i?null:x.createElement(n4,{...e,triggerRef:e.triggerRef,state:o,popoverRef:n,isExiting:i,dir:a})});function n4({state:t,isExiting:e,UNSTABLE_portalContainer:n,clearContexts:l,...r}){var M,V;let o=s.useRef(null),i=s.useRef(null),u=s.useContext(xi),a=u&&r.trigger==="SubmenuTrigger",{popoverProps:c,underlayProps:f,arrowProps:d,placement:b,triggerAnchorPoint:p}=jm({...r,offset:r.offset??8,arrowRef:o,groupRef:a?u:i},t),h=r.popoverRef,y=Br(h,!!b)||r.isEntering||!1,m=ae({...r,defaultClassName:"react-aria-Popover",values:{trigger:r.trigger||null,placement:b,isEntering:y,isExiting:e}}),g=!r.isNonModal||r.trigger==="SubmenuTrigger",[v,E]=s.useState(!1);le(()=>{h.current&&E(g&&!h.current.querySelector("[role=dialog]"))},[h,g]),s.useEffect(()=>{v&&(r.trigger!=="SubmenuTrigger"||bn()!=="pointer")&&h.current&&!xt(h.current)&&xe(h.current)},[v,h,r.trigger]);let C=s.useMemo(()=>{let H=m.children;if(l)for(let j of l)H=x.createElement(j.Provider,{value:null},H);return H},[m.children,l]),[R,T]=s.useState(null),F=s.useCallback(()=>{r.triggerRef.current&&T(r.triggerRef.current.getBoundingClientRect().width+"px")},[r.triggerRef]);le(F,[F]),dn({ref:(M=m.style)!=null&&M["--trigger-width"]?void 0:r.triggerRef,onResize:F});let B={...c.style,"--trigger-anchor-point":p?`${p.x}px ${p.y}px`:void 0,...m.style,"--trigger-width":((V=m.style)==null?void 0:V["--trigger-width"])||R},L=x.createElement(ee.div,{...W(oe(r,{global:!0}),c),...m,role:v?"dialog":void 0,tabIndex:v?-1:void 0,"aria-label":r["aria-label"],"aria-labelledby":r["aria-labelledby"],ref:h,slot:r.slot||void 0,style:B,dir:r.dir,"data-trigger":r.trigger,"data-placement":b,"data-entering":y||void 0,"data-exiting":e||void 0},!r.isNonModal&&x.createElement(ar,{onDismiss:t.close}),x.createElement(mm.Provider,{value:{...d,placement:b,ref:o}},C),x.createElement(ar,{onDismiss:t.close}));return a?x.createElement(sr,{...r,shouldContainFocus:v,isExiting:e,portalContainer:n??(u==null?void 0:u.current)??void 0},L):x.createElement(sr,{...r,shouldContainFocus:v,isExiting:e,portalContainer:n},!r.isNonModal&&t.isOpen&&x.createElement("div",{"data-testid":"underlay",...f,style:{position:"fixed",inset:0}}),x.createElement("div",{ref:i,style:{display:"contents"}},x.createElement(xi.Provider,{value:i},L)))}class Ge{constructor(e){this.value=null,this.level=0,this.hasChildNodes=!1,this.rendered=null,this.textValue="",this["aria-label"]=void 0,this.index=0,this.parentKey=null,this.prevKey=null,this.nextKey=null,this.firstChildKey=null,this.lastChildKey=null,this.props={},this.colSpan=null,this.colIndex=null,this.type=this.constructor.type,this.key=e}get childNodes(){throw new Error("childNodes is not supported")}clone(){let e=new this.constructor(this.key);return e.value=this.value,e.level=this.level,e.hasChildNodes=this.hasChildNodes,e.rendered=this.rendered,e.textValue=this.textValue,e["aria-label"]=this["aria-label"],e.index=this.index,e.parentKey=this.parentKey,e.prevKey=this.prevKey,e.nextKey=this.nextKey,e.firstChildKey=this.firstChildKey,e.lastChildKey=this.lastChildKey,e.props=this.props,e.render=this.render,e.colSpan=this.colSpan,e.colIndex=this.colIndex,e}filter(e,n,l){let r=this.clone();return n.addDescendants(r,e),r}}class hl extends Ge{filter(e,n,l){let[r,o]=Xa(e,n,this.firstChildKey,l),i=this.clone();return i.firstChildKey=r,i.lastChildKey=o,i}}const mo=class mo extends Ge{};mo.type="header";let Ci=mo;const go=class go extends Ge{};go.type="loader";let tl=go;const yo=class yo extends hl{filter(e,n,l){if(l(this.textValue,this)){let r=this.clone();return n.addDescendants(r,e),r}return null}};yo.type="item";let cr=yo;const $o=class $o extends hl{filter(e,n,l){let r=super.filter(e,n,l);if(r&&r.lastChildKey!==null){let o=e.getItem(r.lastChildKey);if(o&&o.type!=="header")return r}return null}};$o.type="section";let dr=$o;class Ya{get size(){return this.itemCount}getKeys(){return this.keyMap.keys()}*[Symbol.iterator](){let e=this.firstKey!=null?this.keyMap.get(this.firstKey):void 0;for(;e;)yield e,e=e.nextKey!=null?this.keyMap.get(e.nextKey):void 0}getChildren(e){let n=this.keyMap;return{*[Symbol.iterator](){let l=n.get(e),r=(l==null?void 0:l.firstChildKey)!=null?n.get(l.firstChildKey):null;for(;r;)yield r,r=r.nextKey!=null?n.get(r.nextKey):void 0}}}getKeyBefore(e){let n=this.keyMap.get(e);if(!n)return null;if(n.prevKey!=null){for(n=this.keyMap.get(n.prevKey);n&&n.type!=="item"&&n.lastChildKey!=null;)n=this.keyMap.get(n.lastChildKey);return(n==null?void 0:n.key)??null}return n.parentKey}getKeyAfter(e){let n=this.keyMap.get(e);if(!n)return null;if(n.type!=="item"&&n.firstChildKey!=null)return n.firstChildKey;for(;n;){if(n.nextKey!=null)return n.nextKey;if(n.parentKey!=null)n=this.keyMap.get(n.parentKey);else return null}return null}getFirstKey(){return this.firstKey}getLastKey(){let e=this.lastKey!=null?this.keyMap.get(this.lastKey):null;for(;(e==null?void 0:e.lastChildKey)!=null;)e=this.keyMap.get(e.lastChildKey);return(e==null?void 0:e.key)??null}getItem(e){return this.keyMap.get(e)??null}at(){throw new Error("Not implemented")}clone(){let e=this.constructor,n=new e;return n.keyMap=new Map(this.keyMap),n.firstKey=this.firstKey,n.lastKey=this.lastKey,n.itemCount=this.itemCount,n}addNode(e){if(this.frozen)throw new Error("Cannot add a node to a frozen collection");e.type==="item"&&this.keyMap.get(e.key)==null&&this.itemCount++,this.keyMap.set(e.key,e)}addDescendants(e,n){this.addNode(e);let l=n.getChildren(e.key);for(let r of l)this.addDescendants(r,n)}removeNode(e){if(this.frozen)throw new Error("Cannot remove a node to a frozen collection");let n=this.keyMap.get(e);n!=null&&n.type==="item"&&this.itemCount--,this.keyMap.delete(e)}commit(e,n,l=!1){if(this.frozen)throw new Error("Cannot commit a frozen collection");this.firstKey=e,this.lastKey=n,this.frozen=!l}filter(e){let n=new this.constructor,[l,r]=Xa(this,n,this.firstKey,e);return n==null||n.commit(l,r),n}constructor(){this.keyMap=new Map,this.firstKey=null,this.lastKey=null,this.frozen=!1,this.itemCount=0}}function Xa(t,e,n,l){if(n==null)return[null,null];let r=null,o=null,i=t.getItem(n);for(;i!=null;){let u=i.filter(t,e,l);u!=null&&(u.nextKey=null,o&&(u.prevKey=o.key,o.nextKey=u.key),r==null&&(r=u),e.addNode(u),o=u),i=i.nextKey!=null?t.getItem(i.nextKey):null}if(o&&o.type==="separator"){let u=o.prevKey;e.removeNode(o.key),u!=null?(o=e.getItem(u),o.nextKey=null):o=null}return[(r==null?void 0:r.key)??null,(o==null?void 0:o.key)??null]}class Ja{constructor(e){this._firstChild=null,this._lastChild=null,this._previousSibling=null,this._nextSibling=null,this._parentNode=null,this._minInvalidChildIndex=null,this.ownerDocument=e}*[Symbol.iterator](){let e=this.firstChild;for(;e;)yield e,e=e.nextSibling}get firstChild(){return this._firstChild}set firstChild(e){this._firstChild=e,this.ownerDocument.markDirty(this)}get lastChild(){return this._lastChild}set lastChild(e){this._lastChild=e,this.ownerDocument.markDirty(this)}get previousSibling(){return this._previousSibling}set previousSibling(e){this._previousSibling=e,this.ownerDocument.markDirty(this)}get nextSibling(){return this._nextSibling}set nextSibling(e){this._nextSibling=e,this.ownerDocument.markDirty(this)}get parentNode(){return this._parentNode}set parentNode(e){this._parentNode=e,this.ownerDocument.markDirty(this)}get isConnected(){var e;return((e=this.parentNode)==null?void 0:e.isConnected)||!1}invalidateChildIndices(e){(this._minInvalidChildIndex==null||!this._minInvalidChildIndex.isConnected||e.indexthis.subscriptions.delete(e)}resetAfterSSR(){this.isSSR&&(this.isSSR=!1,this.firstChild=null,this.lastChild=null,this.nodeId=0)}}function Wr(t){let{children:e,items:n,idScope:l,addIdAndValue:r,dependencies:o=[]}=t,i=s.useMemo(()=>{},[e]),u=s.useMemo(()=>new WeakMap,[...o,i]);return s.useMemo(()=>{if(n&&typeof e=="function"){let a=[];for(let c of n){let f=r4(c)?c:null,d=f?u.get(f):null;if(!d){d=e(c);let b=d.props.id??(c==null?void 0:c.key)??(c==null?void 0:c.id);l!=null&&d.props.id==null&&b!=null&&(b=l+":"+b);let p=b??a.length;d=s.cloneElement(d,r?{key:p,id:b,value:c}:{key:p}),f&&u.set(f,d)}a.push(d)}return a}else if(typeof e!="function")return e},[e,n,u,l,r])}function r4(t){switch(typeof t){case"object":return t!=null;case"function":case"symbol":return!0;default:return!1}}var Ll={exports:{}},zl={};/** + * @license React + * use-sync-external-store-shim.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Ei;function o4(){if(Ei)return zl;Ei=1;var t=Cp();function e(d,b){return d===b&&(d!==0||1/d===1/b)||d!==d&&b!==b}var n=typeof Object.is=="function"?Object.is:e,l=t.useState,r=t.useEffect,o=t.useLayoutEffect,i=t.useDebugValue;function u(d,b){var p=b(),h=l({inst:{value:p,getSnapshot:b}}),y=h[0].inst,m=h[1];return o(function(){y.value=p,y.getSnapshot=b,a(y)&&m({inst:y})},[d,p,b]),r(function(){return a(y)&&m({inst:y}),d(function(){a(y)&&m({inst:y})})},[d]),i(p),p}function a(d){var b=d.getSnapshot;d=d.value;try{var p=b();return!n(d,p)}catch{return!0}}function c(d,b){return b()}var f=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?c:u;return zl.useSyncExternalStore=t.useSyncExternalStore!==void 0?t.useSyncExternalStore:f,zl}var wi;function i4(){return wi||(wi=1,Ll.exports=o4()),Ll.exports}var u4=i4();const Qa=s.createContext(!1),gn=s.createContext(null);function Ur(t){if(s.useContext(gn))return t.content;let{collection:n,document:l}=d4(t.createCollection);return x.createElement(x.Fragment,null,x.createElement(Bh,null,x.createElement(gn.Provider,{value:l},t.content)),x.createElement(a4,{render:t.children,collection:n}))}function a4({collection:t,render:e}){return e(t)}function s4(t,e,n){let l=dt(),r=s.useRef(l);r.current=l;let o=s.useCallback(()=>r.current?n():e(),[e,n]);return u4.useSyncExternalStore(t,o)}const c4=typeof x.useSyncExternalStore=="function"?x.useSyncExternalStore:s4;function d4(t){let[e]=s.useState(()=>new l4((t==null?void 0:t())||new Ya)),n=s.useCallback(i=>e.subscribe(i),[e]),l=s.useCallback(()=>{let i=e.getCollection();return e.isSSR&&e.resetAfterSSR(),i},[e]),r=s.useCallback(()=>(e.isSSR=!0,e.getCollection()),[e]);return{collection:c4(n,l,r),document:e}}const fr=s.createContext(null);function f4(t){var n;return n=class extends Ge{},n.type=t,n}function es(t,e,n,l,r,o){typeof t=="string"&&(t=f4(t));let i=s.useCallback(a=>{a==null||a.setProps(e,n,t,l,o)},[e,n,l,o,t]),u=s.useContext(fr);if(u){let a=u.ownerDocument.nodesByProps.get(e);return a||(a=u.ownerDocument.createElement(t.type),a.setProps(e,n,t,l,o),u.appendChild(a),u.ownerDocument.updateCollection(),u.ownerDocument.nodesByProps.set(e,a)),r?x.createElement(fr.Provider,{value:a},r):null}return x.createElement(t.type,{ref:i},r)}function Sn(t,e){let n=({node:r})=>e(r.props,r.props.ref,r),l=s.forwardRef((r,o)=>{let i=s.useContext(er);if(!s.useContext(Qa)){if(e.length>=3)throw new Error(e.name+" cannot be rendered outside a collection.");return e(r,o)}return es(t,r,o,"children"in r?r.children:null,null,a=>x.createElement(er.Provider,{value:i},x.createElement(n,{node:a})))});return l.displayName=e.name,l}function ml(t,e,n=ts){let l=({node:o})=>e(o.props,o.props.ref,o),r=s.forwardRef((o,i)=>{let u=n(o);return es(t,o,i,null,u,a=>x.createElement(l,{node:a}))??x.createElement(x.Fragment,null)});return r.displayName=e.name,r}function ts(t){return Wr({...t,addIdAndValue:!0})}const Si=s.createContext(null);function Dn(t){let e=s.useContext(Si),n=((e==null?void 0:e.dependencies)||[]).concat(t.dependencies),l=t.idScope??(e==null?void 0:e.idScope),r=ts({...t,idScope:l,dependencies:n});return s.useContext(gn)&&(r=x.createElement(p4,null,r)),e=s.useMemo(()=>({dependencies:n,idScope:l}),[l,...n]),x.createElement(Si.Provider,{value:e},r)}function p4({children:t}){let e=s.useContext(gn),n=s.useMemo(()=>x.createElement(gn.Provider,{value:null},x.createElement(Qa.Provider,{value:!0},t)),[t]);return dt()?x.createElement(fr.Provider,{value:e},n):kr.createPortal(n,e)}const b4=s.createContext(null),Gr={CollectionRoot({collection:t,renderDropIndicator:e}){return Di(t,null,e)},CollectionBranch({collection:t,parent:e,renderDropIndicator:n}){return Di(t,e,n)}};function Di(t,e,n){return Wr({items:e?t.getChildren(e.key):t,dependencies:[n],children(l){if(l.type==="content")return x.createElement(x.Fragment,null);let r=l.render(l);return!n||l.type!=="item"?r:x.createElement(x.Fragment,null,n({type:"item",key:l.key,dropPosition:"before"}),r,h4(t,l,n))}})}function h4(t,e,n){let l=e.key,r=t.getKeyAfter(l),o=r!=null?t.getItem(r):null;for(;o!=null&&o.type!=="item";)r=t.getKeyAfter(o.key),o=r!=null?t.getItem(r):null;let i=e.nextKey!=null?t.getItem(e.nextKey):null;for(;i!=null&&i.type!=="item";)i=i.nextKey!=null?t.getItem(i.nextKey):null;let u=[];if(i==null){let a=e;for(;(a==null?void 0:a.type)==="item"&&(!o||a.parentKey!==o.parentKey&&o.level{b.target.dispatchEvent(new PointerEvent("pointercancel",{bubbles:!0})),re(b.target).activeElement!==b.target&&Ne(b.target),r&&r({...b,type:"longpress"}),u.current=void 0},o),b.pointerType==="touch")){let p=y=>{y.preventDefault()},h=Se(b.target);a(b.target,"contextmenu",p,{once:!0}),a(h,"pointerup",()=>{setTimeout(()=>{c(b.target,"contextmenu",p)},30)},{once:!0})}},onPressEnd(b){u.current&&clearTimeout(u.current),l&&(b.pointerType==="mouse"||b.pointerType==="touch")&&l({...b,type:"longpressend"})}}),d=$n(r&&!e?i:void 0);return{longPressProps:W(f,d)}}function js(t,e,n){let{type:l}=t,{isOpen:r}=e;s.useEffect(()=>{n&&n.current&&aa.set(n.current,e.close)});let o;l==="menu"?o=!0:l==="listbox"&&(o="listbox");let i=$e();return{triggerProps:{"aria-haspopup":o,"aria-expanded":r,"aria-controls":r?i:void 0,onPress:e.toggle},overlayProps:{id:i}}}function E4(t){return t&&t.__esModule?t.default:t}function w4(t,e,n){let{type:l="menu",isDisabled:r,trigger:o="press"}=t,i=$e(),{triggerProps:u,overlayProps:a}=js({type:l},e,n),c=p=>{if(!r&&!(o==="longPress"&&!p.altKey)&&n&&n.current)switch(p.key){case"Enter":case" ":if(o==="longPress"||p.isDefaultPrevented())return;case"ArrowDown":"continuePropagation"in p||p.stopPropagation(),p.preventDefault(),e.toggle("first");break;case"ArrowUp":"continuePropagation"in p||p.stopPropagation(),p.preventDefault(),e.toggle("last");break;default:"continuePropagation"in p&&p.continuePropagation()}},f=_e(E4(Vs),"@react-aria/menu"),{longPressProps:d}=Os({isDisabled:r||o!=="longPress",accessibilityDescription:f.format("longPressMessage"),onLongPressStart(){e.close()},onLongPress(){e.open("first")}}),b={preventFocusOnPress:!0,onPressStart(p){p.pointerType!=="touch"&&p.pointerType!=="keyboard"&&!r&&(Ne(p.target),e.open(p.pointerType==="virtual"?"first":null))},onPress(p){p.pointerType==="touch"&&!r&&(Ne(p.target),e.toggle())}};return delete u.onPress,{menuTriggerProps:{...u,...o==="press"?b:d,id:i,onKeyDown:c},menuProps:{...a,"aria-labelledby":i,autoFocus:e.focusStrategy||!0,onClose:e.close}}}function br(t){return jn()?t.altKey:t.ctrlKey}function Un(t,e){var r,o;let n=`[data-key="${CSS.escape(String(e))}"]`,l=(r=t.current)==null?void 0:r.dataset.collection;return l&&(n=`[data-collection="${CSS.escape(l)}"]${n}`),(o=t.current)==null?void 0:o.querySelector(n)}const _s=new WeakMap;function S4(t){let e=$e();return _s.set(t,e),e}function D4(t){return _s.get(t)}const k4=1e3;function P4(t){let{keyboardDelegate:e,selectionManager:n,onTypeSelect:l}=t,r=s.useRef({search:"",timeout:void 0}).current,o=i=>{let u=T4(i.key);if(!(!u||i.ctrlKey||i.metaKey||!ne(i.currentTarget,U(i))||r.search.length===0&&u===" ")){if(u===" "&&r.search.trim().length>0&&(i.preventDefault(),"continuePropagation"in i||i.stopPropagation()),r.search+=u,e.getKeyForSearch!=null){let a=e.getKeyForSearch(r.search,n.focusedKey);a==null&&(a=e.getKeyForSearch(r.search)),a!=null&&(n.setFocusedKey(a),l&&l(a))}clearTimeout(r.timeout),r.timeout=setTimeout(()=>{r.search=""},k4)}};return{typeSelectProps:{onKeyDownCapture:e.getKeyForSearch?o:void 0}}}function T4(t){return t.length===1||!/^[A-Z]/i.test(t)?t:""}function Zr(t){let{selectionManager:e,keyboardDelegate:n,ref:l,autoFocus:r=!1,shouldFocusWrap:o=!1,disallowEmptySelection:i=!1,disallowSelectAll:u=!1,escapeKeyBehavior:a="clearSelection",selectOnFocus:c=e.selectionBehavior==="replace",disallowTypeAhead:f=!1,shouldUseVirtualFocus:d,allowsTabNavigation:b=!1,scrollRef:p=l,linkBehavior:h="action"}=t,{direction:y}=Pe(),m=Ot(),g=$=>{var A,w,P,k,K,_,Z,S,N,O,X,J,de,Ce;if($.altKey&&$.key==="Tab"&&$.preventDefault(),!l.current||!ne(l.current,U($)))return;const D=(z,Y)=>{if(z!=null){if(e.isLink(z)&&h==="selection"&&c&&!br($)){kr.flushSync(()=>{e.setFocusedKey(z,Y)});let ue=Un(l,z),Re=e.getItemProps(z);ue&&m.open(ue,$,Re.href,Re.routerOptions);return}if(e.setFocusedKey(z,Y),e.isLink(z)&&h==="override")return;$.shiftKey&&e.selectionMode==="multiple"?e.extendSelection(z):c&&!br($)&&e.replaceSelection(z)}};switch($.key){case"ArrowDown":if(n.getKeyBelow){let z=e.focusedKey!=null?(A=n.getKeyBelow)==null?void 0:A.call(n,e.focusedKey):(w=n.getFirstKey)==null?void 0:w.call(n);z==null&&o&&(z=(P=n.getFirstKey)==null?void 0:P.call(n,e.focusedKey)),z!=null&&($.preventDefault(),D(z))}break;case"ArrowUp":if(n.getKeyAbove){let z=e.focusedKey!=null?(k=n.getKeyAbove)==null?void 0:k.call(n,e.focusedKey):(K=n.getLastKey)==null?void 0:K.call(n);z==null&&o&&(z=(_=n.getLastKey)==null?void 0:_.call(n,e.focusedKey)),z!=null&&($.preventDefault(),D(z))}break;case"ArrowLeft":if(n.getKeyLeftOf){let z=e.focusedKey!=null?(Z=n.getKeyLeftOf)==null?void 0:Z.call(n,e.focusedKey):(S=n.getFirstKey)==null?void 0:S.call(n);z==null&&o&&(z=y==="rtl"?(N=n.getFirstKey)==null?void 0:N.call(n,e.focusedKey):(O=n.getLastKey)==null?void 0:O.call(n,e.focusedKey)),z!=null&&($.preventDefault(),D(z,y==="rtl"?"first":"last"))}break;case"ArrowRight":if(n.getKeyRightOf){let z=e.focusedKey!=null?(X=n.getKeyRightOf)==null?void 0:X.call(n,e.focusedKey):(J=n.getFirstKey)==null?void 0:J.call(n);z==null&&o&&(z=y==="rtl"?(de=n.getLastKey)==null?void 0:de.call(n,e.focusedKey):(Ce=n.getFirstKey)==null?void 0:Ce.call(n,e.focusedKey)),z!=null&&($.preventDefault(),D(z,y==="rtl"?"last":"first"))}break;case"Home":if(n.getFirstKey){if(e.focusedKey===null&&$.shiftKey)return;$.preventDefault();let z=n.getFirstKey(e.focusedKey,Tt($));e.setFocusedKey(z),z!=null&&(Tt($)&&$.shiftKey&&e.selectionMode==="multiple"?e.extendSelection(z):c&&e.replaceSelection(z))}break;case"End":if(n.getLastKey){if(e.focusedKey===null&&$.shiftKey)return;$.preventDefault();let z=n.getLastKey(e.focusedKey,Tt($));e.setFocusedKey(z),z!=null&&(Tt($)&&$.shiftKey&&e.selectionMode==="multiple"?e.extendSelection(z):c&&e.replaceSelection(z))}break;case"PageDown":if(n.getKeyPageBelow&&e.focusedKey!=null){let z=n.getKeyPageBelow(e.focusedKey);z!=null&&($.preventDefault(),D(z))}break;case"PageUp":if(n.getKeyPageAbove&&e.focusedKey!=null){let z=n.getKeyPageAbove(e.focusedKey);z!=null&&($.preventDefault(),D(z))}break;case"a":Tt($)&&e.selectionMode==="multiple"&&u!==!0&&($.preventDefault(),e.selectAll());break;case"Escape":a==="clearSelection"&&!i&&e.selectedKeys.size!==0&&($.stopPropagation(),$.preventDefault(),e.clearSelection());break;case"Tab":if(!b){if($.shiftKey)l.current.focus();else{let z=ze(l.current,{tabbable:!0}),Y,ue;do ue=z.lastChild(),ue&&(Y=ue);while(ue);let Re=ie();Y&&(!xt(Y)||Re&&!Du(Re))&&Ne(Y)}break}}},v=s.useRef({top:0,left:0});Qt(p,"scroll",()=>{var $,D;v.current={top:(($=p.current)==null?void 0:$.scrollTop)??0,left:((D=p.current)==null?void 0:D.scrollLeft)??0}});let E=$=>{var D,A;if(e.isFocused){ne($.currentTarget,U($))||e.setFocused(!1);return}if(ne($.currentTarget,U($))){if(e.setFocused(!0),e.focusedKey==null){let w=k=>{k!=null&&(e.setFocusedKey(k),c&&!e.isSelected(k)&&e.replaceSelection(k))},P=$.relatedTarget;P&&$.currentTarget.compareDocumentPosition(P)&Node.DOCUMENT_POSITION_FOLLOWING?w(e.lastSelectedKey??((D=n.getLastKey)==null?void 0:D.call(n))):w(e.firstSelectedKey??((A=n.getFirstKey)==null?void 0:A.call(n)))}else p.current&&(p.current.scrollTop=v.current.top,p.current.scrollLeft=v.current.left);if(e.focusedKey!=null&&p.current){let w=Un(l,e.focusedKey);w instanceof HTMLElement&&(!xt(w)&&!d&&Ne(w),bn()==="keyboard"&&it(w,{containingElement:l.current}))}}},C=$=>{ne($.currentTarget,$.relatedTarget)||e.setFocused(!1)},R=s.useRef(!1);Qt(l,wp,d?$=>{let{detail:D}=$;$.stopPropagation(),e.setFocused(!0),(D==null?void 0:D.focusStrategy)==="first"&&(R.current=!0)}:void 0),No(()=>{var $;if(R.current){let D=(($=n.getFirstKey)==null?void 0:$.call(n))??null;if(D==null){let A=ie();ns(l.current),qr(A,null),e.collection.size>0&&(R.current=!1)}else e.setFocusedKey(D),R.current=!1}},[e.collection]),No(()=>{e.collection.size>0&&(R.current=!1)},[e.focusedKey]),Qt(l,Ep,d?$=>{var D;$.stopPropagation(),e.setFocused(!1),(D=$.detail)!=null&&D.clearFocusKey&&e.setFocusedKey(null)}:void 0);const T=s.useRef(r),F=s.useRef(!1);s.useEffect(()=>{var $,D;if(T.current){let A=null;r==="first"&&(A=(($=n.getFirstKey)==null?void 0:$.call(n))??null),r==="last"&&(A=((D=n.getLastKey)==null?void 0:D.call(n))??null);let w=e.selectedKeys;if(w.size){for(let P of w)if(e.canSelectItem(P)){A=P;break}}e.setFocused(!0),e.setFocusedKey(A),A==null&&!d&&l.current&&xe(l.current),e.collection.size>0&&(T.current=!1,F.current=!0)}});let B=s.useRef(e.focusedKey),L=s.useRef(null);s.useEffect(()=>{if(e.isFocused&&e.focusedKey!=null&&(e.focusedKey!==B.current||F.current)&&p.current&&l.current){let $=bn(),D=Un(l,e.focusedKey);if(!(D instanceof HTMLElement))return;($==="keyboard"||F.current)&&(L.current&&cancelAnimationFrame(L.current),L.current=requestAnimationFrame(()=>{p.current&&(_n(p.current,D),$!=="virtual"&&it(D,{containingElement:l.current}))}))}!d&&e.isFocused&&e.focusedKey==null&&B.current!=null&&l.current&&xe(l.current),B.current=e.focusedKey,F.current=!1}),s.useEffect(()=>()=>{L.current&&cancelAnimationFrame(L.current)},[]),Qt(l,"react-aria-focus-scope-restore",$=>{$.preventDefault(),e.setFocused(!0)});let M={onKeyDown:g,onFocus:E,onBlur:C,onMouseDown($){p.current===U($)&&$.preventDefault()}},{typeSelectProps:V}=P4({keyboardDelegate:n,selectionManager:e});f||(M=W(V,M));let H;d||(H=e.focusedKey==null?0:-1);let j=S4(e.collection);return{collectionProps:W(M,{tabIndex:H,"data-collection":j})}}class hr{constructor(e){this.ref=e}getItemRect(e){let n=this.ref.current;if(!n)return null;let l=e!=null?Un(this.ref,e):null;if(!l)return null;let r=n.getBoundingClientRect(),o=l.getBoundingClientRect();return{x:o.left-r.left-n.clientLeft+n.scrollLeft,y:o.top-r.top-n.clientTop+n.scrollTop,width:o.width,height:o.height}}getContentSize(){let e=this.ref.current;return{width:(e==null?void 0:e.scrollWidth)??0,height:(e==null?void 0:e.scrollHeight)??0}}getVisibleRect(){let e=this.ref.current;return{x:(e==null?void 0:e.scrollLeft)??0,y:(e==null?void 0:e.scrollTop)??0,width:(e==null?void 0:e.clientWidth)??0,height:(e==null?void 0:e.clientHeight)??0}}}class gl{constructor(...e){if(e.length===1){let n=e[0];this.collection=n.collection,this.ref=n.ref,this.collator=n.collator,this.disabledKeys=n.disabledKeys||new Set,this.disabledBehavior=n.disabledBehavior||"all",this.orientation=n.orientation||"vertical",this.direction=n.direction,this.layout=n.layout||"stack",this.layoutDelegate=n.layoutDelegate||new hr(n.ref)}else this.collection=e[0],this.disabledKeys=e[1],this.ref=e[2],this.collator=e[3],this.layout="stack",this.orientation="vertical",this.disabledBehavior="all",this.layoutDelegate=new hr(this.ref);this.layout==="stack"&&this.orientation==="vertical"&&(this.getKeyLeftOf=void 0,this.getKeyRightOf=void 0)}isDisabled(e){var n,l;return this.disabledBehavior==="all"&&(((n=e.props)==null?void 0:n.isDisabled)||this.disabledKeys.has(e.key))&&((l=e.props)==null?void 0:l.disabledBehavior)!=="selection"}findNextNonDisabled(e,n,l=!1){let r=e;for(;r!=null;){let o=this.collection.getItem(r);if((o==null?void 0:o.type)==="item"&&(l||!this.isDisabled(o)))return r;r=n(r)}return null}getNextKey(e,n){let l=e;return l=this.collection.getKeyAfter(l),this.findNextNonDisabled(l,r=>this.collection.getKeyAfter(r),n==null?void 0:n.includeDisabled)}getPreviousKey(e,n){let l=e;return l=this.collection.getKeyBefore(l),this.findNextNonDisabled(l,r=>this.collection.getKeyBefore(r),n==null?void 0:n.includeDisabled)}findKey(e,n,l){let r=e,o=this.layoutDelegate.getItemRect(r);if(!o||r==null)return null;let i=o;do{if(r=n(r),r==null)break;o=this.layoutDelegate.getItemRect(r)}while(o&&l(i,o)&&r!=null);return r}isSameRow(e,n){return e.y===n.y||e.x!==n.x}isSameColumn(e,n){return e.x===n.x||e.y!==n.y}getKeyBelow(e,n){return this.layout==="grid"&&this.orientation==="vertical"?this.findKey(e,l=>this.getNextKey(l,n),this.isSameRow):this.getNextKey(e,n)}getKeyAbove(e,n){return this.layout==="grid"&&this.orientation==="vertical"?this.findKey(e,l=>this.getPreviousKey(l,n),this.isSameRow):this.getPreviousKey(e,n)}getNextColumn(e,n,l){return n?this.getPreviousKey(e,l):this.getNextKey(e,l)}getKeyRightOf(e,n){let l=this.direction==="ltr"?"getKeyRightOf":"getKeyLeftOf";return this.layoutDelegate[l]?(e=this.layoutDelegate[l](e),this.findNextNonDisabled(e,r=>this.layoutDelegate[l](r),n==null?void 0:n.includeDisabled)):this.layout==="grid"?this.orientation==="vertical"?this.getNextColumn(e,this.direction==="rtl",n):this.findKey(e,r=>this.getNextColumn(r,this.direction==="rtl",n),this.isSameColumn):this.orientation==="horizontal"?this.getNextColumn(e,this.direction==="rtl",n):null}getKeyLeftOf(e,n){let l=this.direction==="ltr"?"getKeyLeftOf":"getKeyRightOf";return this.layoutDelegate[l]?(e=this.layoutDelegate[l](e),this.findNextNonDisabled(e,r=>this.layoutDelegate[l](r),n==null?void 0:n.includeDisabled)):this.layout==="grid"?this.orientation==="vertical"?this.getNextColumn(e,this.direction==="ltr",n):this.findKey(e,r=>this.getNextColumn(r,this.direction==="ltr",n),this.isSameColumn):this.orientation==="horizontal"?this.getNextColumn(e,this.direction==="ltr",n):null}getFirstKey(){let e=this.collection.getFirstKey();return this.findNextNonDisabled(e,n=>this.collection.getKeyAfter(n))}getLastKey(){let e=this.collection.getLastKey();return this.findNextNonDisabled(e,n=>this.collection.getKeyBefore(n))}getKeyPageAbove(e){let n=this.ref.current,l=this.layoutDelegate.getItemRect(e);if(!l)return null;if(n&&!st(n))return this.getFirstKey();let r=e;if(this.orientation==="horizontal"){let o=Math.max(0,l.x+l.width-this.layoutDelegate.getVisibleRect().width);for(;l&&l.x>o&&r!=null;)r=this.getKeyAbove(r),l=r==null?null:this.layoutDelegate.getItemRect(r)}else{let o=Math.max(0,l.y+l.height-this.layoutDelegate.getVisibleRect().height);for(;l&&l.y>o&&r!=null;)r=this.getKeyAbove(r),l=r==null?null:this.layoutDelegate.getItemRect(r)}return r??this.getFirstKey()}getKeyPageBelow(e){let n=this.ref.current,l=this.layoutDelegate.getItemRect(e);if(!l)return null;if(n&&!st(n))return this.getLastKey();let r=e;if(this.orientation==="horizontal"){let o=Math.min(this.layoutDelegate.getContentSize().width,l.x-l.width+this.layoutDelegate.getVisibleRect().width);for(;l&&l.xr[0]o||new gl({collection:n,disabledKeys:l,disabledBehavior:c,ref:r,collator:a,layoutDelegate:i,orientation:u}),[o,i,n,l,r,a,c,u]),{collectionProps:d}=Zr({...t,ref:r,selectionManager:e,keyboardDelegate:f});return{listProps:d}}function Yr(t){let{id:e,selectionManager:n,key:l,ref:r,shouldSelectOnPressUp:o,shouldUseVirtualFocus:i,focus:u,isDisabled:a,onAction:c,allowsDifferentPressOrigin:f,linkBehavior:d="action"}=t,b=Ot();e=$e(e);let p=K=>{if(K.pointerType==="keyboard"&&br(K))n.toggleSelection(l);else{if(n.selectionMode==="none")return;if(n.isLink(l)){if(d==="selection"&&r.current){let _=n.getItemProps(l);b.open(r.current,K,_.href,_.routerOptions),n.setSelectedKeys(n.selectedKeys);return}else if(d==="override"||d==="none")return}n.selectionMode==="single"?n.isSelected(l)&&!n.disallowEmptySelection?n.toggleSelection(l):n.replaceSelection(l):K&&K.shiftKey?n.extendSelection(l):n.selectionBehavior==="toggle"||K&&(Tt(K)||K.pointerType==="touch"||K.pointerType==="virtual")?n.toggleSelection(l):n.replaceSelection(l)}};s.useEffect(()=>{l===n.focusedKey&&n.isFocused&&(i?ns(r.current):u?u():ie()!==r.current&&r.current&&xe(r.current))},[r,l,n.focusedKey,n.childFocusStrategy,n.isFocused,i]),a=a||n.isDisabled(l);let h={};!i&&!a?h={tabIndex:l===n.focusedKey?0:-1,onFocus(K){U(K)===r.current&&n.setFocusedKey(l)}}:a&&(h.onMouseDown=K=>{K.preventDefault()}),s.useEffect(()=>{a&&n.focusedKey===l&&n.setFocusedKey(null)},[n,a,l]);let y=n.isLink(l)&&d==="override",m=c&&t.UNSTABLE_itemBehavior==="action",g=n.isLink(l)&&d!=="selection"&&d!=="none",v=!a&&n.canSelectItem(l)&&!y&&!m,E=(c||g)&&!a,C=E&&(n.selectionBehavior==="replace"?!v:!v||n.isEmpty),R=E&&v&&n.selectionBehavior==="replace",T=C||R,F=s.useRef(null),B=T&&v,L=s.useRef(!1),M=s.useRef(!1),V=n.getItemProps(l),H=K=>{var _;c&&(c(),(_=r.current)==null||_.dispatchEvent(new CustomEvent("react-aria-item-action",{bubbles:!0}))),g&&r.current&&b.open(r.current,K,V.href,V.routerOptions)},j={ref:r};if(o?(j.onPressStart=K=>{F.current=K.pointerType,L.current=B,K.pointerType==="keyboard"&&(!T||Ti(K.key))&&p(K)},f?(j.onPressUp=C?void 0:K=>{K.pointerType==="mouse"&&v&&p(K)},j.onPress=C?H:K=>{K.pointerType!=="keyboard"&&K.pointerType!=="mouse"&&v&&p(K)}):j.onPress=K=>{if(C||R&&K.pointerType!=="mouse"){if(K.pointerType==="keyboard"&&!Pi(K.key))return;H(K)}else K.pointerType!=="keyboard"&&v&&p(K)}):(j.onPressStart=K=>{F.current=K.pointerType,L.current=B,M.current=C,v&&(K.pointerType==="mouse"&&!C||K.pointerType==="keyboard"&&(!E||Ti(K.key)))&&p(K)},j.onPress=K=>{(K.pointerType==="touch"||K.pointerType==="pen"||K.pointerType==="virtual"||K.pointerType==="keyboard"&&T&&Pi(K.key)||K.pointerType==="mouse"&&M.current)&&(T?H(K):v&&p(K))}),h["data-collection"]=D4(n.collection),h["data-key"]=l,j.preventFocusOnPress=i,i&&(j=W(j,{onPressStart(K){K.pointerType!=="touch"&&(n.setFocused(!0),n.setFocusedKey(l))},onPress(K){K.pointerType==="touch"&&(n.setFocused(!0),n.setFocusedKey(l))}})),V)for(let K of["onPressStart","onPressEnd","onPressChange","onPress","onPressUp","onClick"])V[K]&&(j[K]=ft(j[K],V[K]));let{pressProps:$,isPressed:D}=lt(j),A=R?K=>{F.current==="mouse"&&(K.stopPropagation(),K.preventDefault(),H(K))}:void 0,{longPressProps:w}=Os({isDisabled:!B,onLongPress(K){K.pointerType==="touch"&&(p(K),n.setSelectionBehavior("toggle"))}}),P=K=>{F.current==="touch"&&L.current&&K.preventDefault()},k=d!=="none"&&n.isLink(l)?K=>{tt.isOpening||K.preventDefault()}:void 0;return{itemProps:W(h,v||C||i&&!a?$:{},B?w:{},{onDoubleClick:A,onDragStartCapture:P,onClick:k,id:e},i?{onMouseDown:K=>K.preventDefault()}:void 0),isPressed:D,isSelected:n.isSelected(l),isFocused:n.isFocused&&n.focusedKey===l,isDisabled:a,allowsSelection:v,hasAction:T}}function Pi(t){return t==="Enter"}function Ti(t){return t===" "}function Ee(t,e){return typeof e.getChildren=="function"?e.getChildren(t.key):t.childNodes}function At(t){return ln(t,0)}function ln(t,e){if(e<0)return;let n=0;for(let l of t){if(n===e)return l;n++}}function On(t){let e;for(let n of t)e=n;return e}const Ai=new WeakMap;function Hs(t){let e=Ai.get(t);if(e!=null)return e;let n=0,l=r=>{for(let o of r)o.type==="section"?l(Ee(o,t)):o.type==="item"&&n++};return l(t),Ai.set(t,n),n}function B4(t){let e=bl(t),[n,l]=s.useState(null),[r,o]=s.useState([]),i=()=>{o([]),e.close()};return{focusStrategy:n,...e,open(c=null){l(c),e.open()},toggle(c=null){l(c),e.toggle()},close(){i()},expandedKeysStack:r,openSubmenu:(c,f)=>{o(d=>f>d.length?d:[...d.slice(0,f),c])},closeSubmenu:(c,f)=>{o(d=>d[f]===c?d.slice(0,f):d)}}}function nl(t,e){return typeof e.getChildren=="function"?e.getChildren(t.key):t.childNodes}function Xr(t){return K4(t)}function K4(t,e){for(let n of t)return n}function Ws(t){let e;for(let n of t)e=n;return e}function Vl(t,e,n){if(e.parentKey===n.parentKey)return e.index-n.index;let l=[...Bi(t,e),e],r=[...Bi(t,n),n],o=l.slice(0,r.length).findIndex((i,u)=>i!==r[u]);return o!==-1?(e=l[o],n=r[o],e.index-n.index):l.findIndex(i=>i===n)>=0?1:(r.findIndex(i=>i===e)>=0,-1)}function Bi(t,e){let n=[],l=e;for(;(l==null?void 0:l.parentKey)!=null;)l=t.getItem(l.parentKey),l&&n.unshift(l);return n}class He extends Set{constructor(e,n,l){super(e),e instanceof He?(this.anchorKey=n??e.anchorKey,this.currentKey=l??e.currentKey):(this.anchorKey=n??null,this.currentKey=l??null)}}class yl{constructor(e,n,l){this.collection=e,this.state=n,this.allowsCellSelection=(l==null?void 0:l.allowsCellSelection)??!1,this._isSelectAll=null,this.layoutDelegate=(l==null?void 0:l.layoutDelegate)||null,this.fullCollection=(l==null?void 0:l.fullCollection)||null}get selectionMode(){return this.state.selectionMode}get disallowEmptySelection(){return this.state.disallowEmptySelection}get selectionBehavior(){return this.state.selectionBehavior}setSelectionBehavior(e){this.state.setSelectionBehavior(e)}get isFocused(){return this.state.isFocused}setFocused(e){this.state.setFocused(e)}get focusedKey(){return this.state.focusedKey}get childFocusStrategy(){return this.state.childFocusStrategy}setFocusedKey(e,n){(e==null||this.collection.getItem(e))&&this.state.setFocusedKey(e,n)}get selectedKeys(){return this.state.selectedKeys==="all"?new Set(this.getSelectAllKeys()):this.state.selectedKeys}get rawSelection(){return this.state.selectedKeys}isSelected(e){if(this.state.selectionMode==="none")return!1;let n=this.getKey(e);return n==null?!1:this.state.selectedKeys==="all"?this.canSelectItem(n):this.state.selectedKeys.has(n)}get isEmpty(){return this.state.selectedKeys!=="all"&&this.state.selectedKeys.size===0}get isSelectAll(){if(this.isEmpty)return!1;if(this.state.selectedKeys==="all")return!0;if(this._isSelectAll!=null)return this._isSelectAll;let e=this.getSelectAllKeys(),n=this.state.selectedKeys;return this._isSelectAll=e.every(l=>n.has(l)),this._isSelectAll}get firstSelectedKey(){let e=null;for(let n of this.state.selectedKeys){let l=this.collection.getItem(n);(!e||l&&Vl(this.collection,l,e)<0)&&(e=l)}return(e==null?void 0:e.key)??null}get lastSelectedKey(){let e=null;for(let n of this.state.selectedKeys){let l=this.collection.getItem(n);(!e||l&&Vl(this.collection,l,e)>0)&&(e=l)}return(e==null?void 0:e.key)??null}get disabledKeys(){return this.state.disabledKeys}get disabledBehavior(){return this.state.disabledBehavior}extendSelection(e){if(this.selectionMode==="none")return;if(this.selectionMode==="single"){this.replaceSelection(e);return}let n=this.getKey(e);if(n==null)return;let l;if(this.state.selectedKeys==="all")l=new He([n],n,n);else{let r=this.state.selectedKeys,o=r.anchorKey??n;l=new He(r,o,n);for(let i of this.getKeyRange(o,r.currentKey??n))l.delete(i);for(let i of this.getKeyRange(n,o))this.canSelectItem(i)&&l.add(i)}this.state.setSelectedKeys(l)}getKeyRange(e,n){let l=this.collection.getItem(e),r=this.collection.getItem(n);return l&&r?Vl(this.collection,l,r)<=0?this.getKeyRangeInternal(e,n):this.getKeyRangeInternal(n,e):[]}getKeyRangeInternal(e,n){var o;if((o=this.layoutDelegate)!=null&&o.getKeyRange)return this.layoutDelegate.getKeyRange(e,n);let l=[],r=e;for(;r!=null;){let i=this.collection.getItem(r);if(i&&(i.type==="item"||i.type==="cell"&&this.allowsCellSelection)&&l.push(r),r===n)return l;r=this.collection.getKeyAfter(r)}return[]}getKey(e){let n=this.collection.getItem(e);if(!n||n.type==="cell"&&this.allowsCellSelection)return e;for(;n&&n.type!=="item"&&n.parentKey!=null;)n=this.collection.getItem(n.parentKey);return!n||n.type!=="item"?null:n.key}toggleSelection(e){if(this.selectionMode==="none")return;if(this.selectionMode==="single"&&!this.isSelected(e)){this.replaceSelection(e);return}let n=this.getKey(e);if(n==null)return;let l=new He(this.state.selectedKeys==="all"?this.getSelectAllKeys():this.state.selectedKeys);l.has(n)?l.delete(n):this.canSelectItem(n)&&(l.add(n),l.anchorKey=n,l.currentKey=n),!(this.disallowEmptySelection&&l.size===0)&&this.state.setSelectedKeys(l)}replaceSelection(e){if(this.selectionMode==="none")return;let n=this.getKey(e);if(n==null)return;let l=this.canSelectItem(n)?new He([n],n,n):new He;this.state.setSelectedKeys(l)}setSelectedKeys(e){if(this.selectionMode==="none")return;let n=new He;for(let l of e){let r=this.getKey(l);if(r!=null&&(n.add(r),this.selectionMode==="single"))break}this.state.setSelectedKeys(n)}getSelectAllKeys(){let e=this.fullCollection??this.collection,n=[],l=r=>{var o;for(;r!=null;){if(this.canSelectItemIn(r,e)){let i=e.getItem(r);(i==null?void 0:i.type)==="item"&&n.push(r),i!=null&&i.hasChildNodes&&(this.allowsCellSelection||i.type!=="item")&&l(((o=Xr(nl(i,e)))==null?void 0:o.key)??null)}r=e.getKeyAfter(r)}};return l(e.getFirstKey()),n}selectAll(){!this.isSelectAll&&this.selectionMode==="multiple"&&this.state.setSelectedKeys("all")}clearSelection(){!this.disallowEmptySelection&&(this.state.selectedKeys==="all"||this.state.selectedKeys.size>0)&&this.state.setSelectedKeys(new He)}toggleSelectAll(){this.isSelectAll?this.clearSelection():this.selectAll()}select(e,n){this.selectionMode!=="none"&&(this.selectionMode==="single"?this.isSelected(e)&&!this.disallowEmptySelection?this.toggleSelection(e):this.replaceSelection(e):this.selectionBehavior==="toggle"||n&&(n.pointerType==="touch"||n.pointerType==="virtual")?this.toggleSelection(e):this.replaceSelection(e))}isSelectionEqual(e){if(e===this.state.selectedKeys)return!0;let n=this.selectedKeys;if(e.size!==n.size)return!1;for(let l of e)if(!n.has(l))return!1;for(let l of n)if(!e.has(l))return!1;return!0}canSelectItem(e){return this.canSelectItemIn(e,this.collection)}canSelectItemIn(e,n){var r;if(this.state.selectionMode==="none"||this.state.disabledKeys.has(e))return!1;let l=n.getItem(e);return!(!l||(r=l==null?void 0:l.props)!=null&&r.isDisabled||l.type==="cell"&&!this.allowsCellSelection)}isDisabled(e){var l,r;let n=this.collection.getItem(e);return this.state.disabledBehavior==="all"&&(this.state.disabledKeys.has(e)||!!((l=n==null?void 0:n.props)!=null&&l.isDisabled))&&((r=n==null?void 0:n.props)==null?void 0:r.disabledBehavior)!=="selection"}isLink(e){var n,l;return!!((l=(n=this.collection.getItem(e))==null?void 0:n.props)!=null&&l.href)}getItemProps(e){var n;return(n=this.collection.getItem(e))==null?void 0:n.props}withCollection(e){return new yl(e,this.state,{allowsCellSelection:this.allowsCellSelection,layoutDelegate:this.layoutDelegate||void 0,fullCollection:this.fullCollection??this.collection})}}class R4{build(e,n){return this.context=n,Ki(()=>this.iterateCollection(e))}*iterateCollection(e){let{children:n,items:l}=e;if(x.isValidElement(n)&&n.type===x.Fragment)yield*this.iterateCollection({children:n.props.children,items:l});else if(typeof n=="function"){if(!l)throw new Error("props.children was a function but props.items is missing");let r=0;for(let o of l)yield*this.getFullNode({value:o,index:r},{renderer:n}),r++}else{let r=[];x.Children.forEach(n,i=>{i&&r.push(i)});let o=0;for(let i of r){let u=this.getFullNode({element:i,index:o},{});for(let a of u)o++,yield a}}}getKey(e,n,l,r){if(e.key!=null)return e.key;if(n.type==="cell"&&n.key!=null)return`${r}${n.key}`;let o=n.value;if(o!=null){let i=o.key??o.id;if(i==null)throw new Error("No key found for item");return i}return r?`${r}.${n.index}`:`$.${n.index}`}getChildState(e,n){return{renderer:n.renderer||e.renderer}}*getFullNode(e,n,l,r){if(x.isValidElement(e.element)&&e.element.type===x.Fragment){let a=[];x.Children.forEach(e.element.props.children,f=>{a.push(f)});let c=e.index??0;for(const f of a)yield*this.getFullNode({element:f,index:c++},n,l,r);return}let o=e.element;if(!o&&e.value&&n&&n.renderer){let a=this.cache.get(e.value);if(a&&(!a.shouldInvalidate||!a.shouldInvalidate(this.context))){a.index=e.index,a.parentKey=r?r.key:null,yield a;return}o=n.renderer(e.value)}if(x.isValidElement(o)){let a=o.type;if(typeof a!="function"&&typeof a.getCollectionNode!="function"){let b=o.type;throw new Error(`Unknown element <${b}> in collection.`)}let c=a.getCollectionNode(o.props,this.context),f=e.index??0,d=c.next();for(;!d.done&&d.value;){let b=d.value;e.index=f;let p=b.key??null;p==null&&(p=b.element?null:this.getKey(o,e,n,l));let y=[...this.getFullNode({...b,key:p,index:f,wrapper:M4(e.wrapper,b.wrapper)},this.getChildState(n,b),l?`${l}${o.key}`:o.key,r)];for(let m of y){if(m.value=b.value??e.value??null,m.value&&this.cache.set(m.value,m),e.type&&m.type!==e.type)throw new Error(`Unsupported type <${Ol(m.type)}> in <${Ol((r==null?void 0:r.type)??"unknown parent type")}>. Only <${Ol(e.type)}> is supported.`);f++,yield m}d=c.next(y)}return}if(e.key==null||e.type==null)return;let i=this,u={type:e.type,props:e.props,key:e.key,parentKey:r?r.key:null,value:e.value??null,level:((r==null?void 0:r.level)??0)+((r==null?void 0:r.type)==="item"?1:0),index:e.index,rendered:e.rendered,textValue:e.textValue??"","aria-label":e["aria-label"],wrapper:e.wrapper,shouldInvalidate:e.shouldInvalidate,hasChildNodes:e.hasChildNodes||!1,childNodes:Ki(function*(){if(!e.hasChildNodes||!e.childNodes)return;let a=0;for(let c of e.childNodes()){c.key!=null&&(c.key=`${u.key}${c.key}`);let f=i.getFullNode({...c,index:a},i.getChildState(n,c),u.key,u);for(let d of f)a++,yield d}})};yield u}constructor(){this.cache=new WeakMap}}function Ki(t){let e=[],n=null;return{*[Symbol.iterator](){for(let l of e)yield l;n||(n=t());for(let l of n)e.push(l),yield l}}}function M4(t,e){if(t&&e)return n=>t(e(n));if(t)return t;if(e)return e}function Ol(t){return t[0].toUpperCase()+t.slice(1)}function Us(t,e,n){let l=s.useMemo(()=>new R4,[]),{children:r,items:o,collection:i}=t;return s.useMemo(()=>{if(i)return i;let a=l.build({children:r,items:o},n);return e(a)},[l,r,o,i,n,e])}function F4(t,e){if(t.size!==e.size)return!1;for(let n of t)if(!e.has(n))return!1;return!0}function Jr(t){let{selectionMode:e="none",disallowEmptySelection:n=!1,allowDuplicateSelectionEvents:l,selectionBehavior:r="toggle",disabledBehavior:o="all"}=t,i=s.useRef(!1),[,u]=s.useState(!1),a=s.useRef(null),c=s.useRef(null),[,f]=s.useState(null),d=s.useMemo(()=>Ri(t.selectedKeys),[t.selectedKeys]),b=s.useMemo(()=>Ri(t.defaultSelectedKeys,new He),[t.defaultSelectedKeys]),[p,h]=ct(d,b,t.onSelectionChange),y=s.useMemo(()=>t.disabledKeys?new Set(t.disabledKeys):new Set,[t.disabledKeys]),[m,g]=s.useState(r);r==="replace"&&m==="toggle"&&typeof p=="object"&&p.size===0&&g("replace");let v=s.useRef(r);return s.useEffect(()=>{r!==v.current&&(g(r),v.current=r)},[r]),{selectionMode:e,disallowEmptySelection:n,selectionBehavior:m,setSelectionBehavior:g,get isFocused(){return i.current},setFocused(E){i.current=E,u(E)},get focusedKey(){return a.current},get childFocusStrategy(){return c.current},setFocusedKey(E,C="first"){a.current=E,c.current=C,f(E)},selectedKeys:p,setSelectedKeys(E){(l||!F4(E,p))&&h(E)},disabledKeys:y,disabledBehavior:o}}function Ri(t,e){return t?t==="all"?"all":new He(t):e}const I4=s.createContext(null),xo=class xo extends Ge{filter(e,n,l){let r=e.getItem(this.firstChildKey);if(r&&l(r.textValue,this)){let o=this.clone();return n.addDescendants(o,e),o}return null}};xo.type="submenutrigger";let Mi=xo;function L4(t,e){let{role:n="dialog"}=t,l=sn();l=t["aria-label"]?void 0:l;let r=s.useRef(!1);return s.useEffect(()=>{if(e.current&&!xt(e.current)){xe(e.current);let o=setTimeout(()=>{(ie()===e.current||ie()===document.body)&&(r.current=!0,e.current&&(e.current.blur(),xe(e.current)),r.current=!1)},500);return()=>{clearTimeout(o)}}},[e]),Za(),s.useRef(!1),s.useEffect(()=>{}),{dialogProps:{...oe(t,{labelable:!0}),role:n,tabIndex:-1,"aria-labelledby":t["aria-labelledby"]||l,onBlur:o=>{r.current&&o.stopPropagation()}},titleProps:{id:l}}}const Gs=s.createContext(null),St=s.createContext(null);function z4(t){let e=B4(t),n=s.useRef(null),{triggerProps:l,overlayProps:r}=js({type:"dialog"},e,n);return l.id=$e(),r["aria-labelledby"]=l.id,x.createElement(Me,{values:[[St,e],[I4,e],[Gs,r],[Hr,{trigger:"DialogTrigger",triggerRef:n,"aria-labelledby":r["aria-labelledby"]}]]},x.createElement(Xm,{...l,ref:n,isPressed:e.isOpen},t.children))}const N4=s.forwardRef(function(e,n){let l=e["aria-labelledby"];[e,n]=ve(e,n,Gs);let{dialogProps:r,titleProps:o}=L4({...e,"aria-labelledby":l},n),i=s.useContext(St);!r["aria-label"]&&!r["aria-labelledby"]&&e["aria-labelledby"]&&(r["aria-labelledby"]=e["aria-labelledby"]);let u=ae({defaultClassName:"react-aria-Dialog",className:e.className,style:e.style,children:e.children,values:{close:(i==null?void 0:i.close)||(()=>{})}}),a=oe(e,{global:!0});return x.createElement(ee.section,{...W(a,u,r),render:e.render,ref:n,slot:e.slot||void 0},x.createElement(Me,{values:[[ra,{slots:{[gt]:{},title:{...o,level:2}}}],[En,{slots:{[gt]:{},close:{onPress:()=>i==null?void 0:i.close()}}}]]},u.children))});function V4(t,e,n){let{overlayProps:l,underlayProps:r}=da({...t,isOpen:e.isOpen,onClose:e.close},n);return fa({isDisabled:!e.isOpen}),Za(),s.useEffect(()=>{if(e.isOpen&&n.current)return Vr([n.current],{shouldUseInert:!0})},[e.isOpen,n]),{modalProps:W(l),underlayProps:r}}const O4=s.createContext(null),Qr=s.createContext(null),j4=s.forwardRef(function(e,n){if(s.useContext(Qr))return x.createElement(Fi,{...e,modalRef:n},e.children);let{isDismissable:r,isKeyboardDismissDisabled:o,isOpen:i,defaultOpen:u,onOpenChange:a,children:c,isEntering:f,isExiting:d,UNSTABLE_portalContainer:b,shouldCloseOnInteractOutside:p,...h}=e;return x.createElement(qs,{isDismissable:r,isKeyboardDismissDisabled:o,isOpen:i,defaultOpen:u,onOpenChange:a,isEntering:f,isExiting:d,UNSTABLE_portalContainer:b,shouldCloseOnInteractOutside:p},x.createElement(Fi,{...h,modalRef:n},c))});function _4(t,e){[t,e]=ve(t,e,O4);let n=s.useContext(St),l=bl(t),r=t.isOpen!=null||t.defaultOpen!=null||!n?l:n,o=Te(e),i=s.useRef(null),u=Ul(o,r.isOpen),a=Ul(i,r.isOpen),c=u||a||t.isExiting||!1,f=dt();return!r.isOpen&&!c||f?null:x.createElement(H4,{...t,state:r,isExiting:c,overlayRef:o,modalRef:i})}const qs=s.forwardRef(_4);function H4({UNSTABLE_portalContainer:t,...e}){let n=e.modalRef,{state:l}=e,{modalProps:r,underlayProps:o}=V4(e,l,n),i=Br(e.overlayRef)||e.isEntering||!1,u=ae({...e,defaultClassName:"react-aria-ModalOverlay",values:{isEntering:i,isExiting:e.isExiting,state:l}}),a=ub(),c,f;if(typeof document<"u"){let b=st(document.body)?document.body:document.scrollingElement||document.documentElement,p=b.getBoundingClientRect().width%1,h=b.getBoundingClientRect().height%1;c=b.scrollWidth-p,f=b.scrollHeight-h}let d={...u.style,"--visual-viewport-width":a.width+"px","--visual-viewport-height":a.height+"px","--page-width":c!==void 0?c+"px":void 0,"--page-height":f!==void 0?f+"px":void 0};return x.createElement(sr,{isExiting:e.isExiting,portalContainer:t},x.createElement(ee.div,{...W(oe(e,{global:!0}),o),...u,style:d,ref:e.overlayRef,"data-entering":i||void 0,"data-exiting":e.isExiting||void 0},x.createElement(Me,{values:[[Qr,{modalProps:r,modalRef:n,isExiting:e.isExiting,isDismissable:e.isDismissable}],[St,l]]},u.children)))}function Fi(t){let{modalProps:e,modalRef:n,isExiting:l,isDismissable:r}=s.useContext(Qr),o=s.useContext(St),i=s.useMemo(()=>pt(t.modalRef,n),[t.modalRef,n]),u=Te(i),a=Br(u),c=ae({...t,defaultClassName:"react-aria-Modal",values:{isEntering:a,isExiting:l,state:o}});return x.createElement(ee.div,{...W(oe(t,{global:!0}),e),...c,ref:u,"data-entering":a||void 0,"data-exiting":l||void 0},r&&x.createElement(ar,{onDismiss:o.close}),c.children)}const W4=x.forwardRef(({children:t,...e},n)=>{n=Te(n);let{pressProps:l}=lt({...e,ref:n}),{focusableProps:r}=wt(e,n),o=x.Children.only(t);s.useEffect(()=>{},[n,e.isDisabled]);let i=parseInt(x.version,10)<19?o.ref:o.props.ref;return x.cloneElement(o,{...W(l,r,o.props),ref:pt(i,n)})}),Ii=({children:t,className:e,slot:n,style:l,variant:r,...o})=>{const i=s.useMemo(()=>gh({variant:r}),[r]);return I.jsx(Nr,{"aria-label":"Close",className:ge(e,i),"data-slot":"close-button",slot:n,style:l,...o,children:u=>typeof t=="function"?t(u):t??I.jsx(pm,{"data-slot":"close-button-icon"})})},U4=Object.assign(Ii,{Root:Ii}),je=s.createContext({}),Li=({children:t,...e})=>{const n=s.useMemo(()=>({slots:ul(),placement:void 0}),[]);return I.jsx(je,{value:n,children:I.jsx(z4,{"data-slot":"alert-dialog-root",...e,children:t})})},G4=({children:t,className:e,...n})=>{const{slots:l}=s.useContext(je);return I.jsx(W4,{children:I.jsx("div",{className:fe(l==null?void 0:l.trigger,e),"data-slot":"alert-dialog-trigger",role:"button",...n,children:t})})},q4=({children:t,className:e,isDismissable:n=!1,isKeyboardDismissDisabled:l=!0,onClick:r,variant:o,...i})=>{const{slots:u}=s.useContext(je),a=s.useMemo(()=>ul({variant:o}),[o]),c=s.useMemo(()=>({slots:{...u,...a}}),[u,a]);return I.jsx(qs,{className:ge(e,a==null?void 0:a.backdrop()),"data-slot":"alert-dialog-backdrop",isDismissable:n,isKeyboardDismissDisabled:l,onClick:f=>{f.stopPropagation(),r==null||r(f)},...i,children:f=>I.jsxs(je,{value:c,children:[typeof t=="function"?t(f):t," "]})})},Z4=({children:t,className:e,placement:n="auto",size:l,...r})=>{const{slots:o}=s.useContext(je),i=s.useMemo(()=>ul({size:l}),[l]),u=s.useMemo(()=>({placement:n,slots:{...o,...i}}),[n,o,i]);return I.jsx(j4,{className:ge(e,i==null?void 0:i.container()),"data-placement":n,"data-slot":"alert-dialog-container",...r,children:a=>I.jsx(je,{value:u,children:typeof t=="function"?t(a):t})})},Y4=({children:t,className:e,...n})=>{const{placement:l,slots:r}=s.useContext(je);return I.jsx(N4,{className:fe(r==null?void 0:r.dialog,e),"data-placement":l,"data-slot":"alert-dialog-dialog",role:"alertdialog",...n,children:t})},X4=({children:t,className:e,...n})=>{const{slots:l}=s.useContext(je);return I.jsx("div",{className:fe(l==null?void 0:l.header,e),"data-slot":"alert-dialog-header",...n,children:t})},J4=({children:t,className:e,...n})=>{const{slots:l}=s.useContext(je);return I.jsx(sm,{className:fe(l==null?void 0:l.heading,e),"data-slot":"alert-dialog-heading",slot:"title",...n,children:t})},Q4=({children:t,className:e,...n})=>{const{slots:l}=s.useContext(je);return I.jsx("div",{className:fe(l==null?void 0:l.body,e),"data-slot":"alert-dialog-body",...n,children:t})},eg=({children:t,className:e,...n})=>{const{slots:l}=s.useContext(je);return I.jsx("div",{className:fe(l==null?void 0:l.footer,e),"data-slot":"alert-dialog-footer",...n,children:t})},tg=({children:t,className:e,status:n="danger",...l})=>{const r=s.useMemo(()=>ul({status:n}),[n]),o=()=>{switch(n){case"default":return I.jsx(ni,{"data-slot":"alert-dialog-default-icon"});case"accent":return I.jsx(ni,{"data-slot":"alert-dialog-default-icon"});case"success":return I.jsx(hm,{"data-slot":"alert-dialog-default-icon"});case"warning":return I.jsx(bm,{"data-slot":"alert-dialog-default-icon"});case"danger":return I.jsx(li,{"data-slot":"alert-dialog-default-icon"});default:return I.jsx(li,{"data-slot":"alert-dialog-default-icon"})}};return I.jsx(De.div,{className:r==null?void 0:r.icon({className:e}),"data-slot":"alert-dialog-icon",...l,children:t??o()})},ng=({className:t,...e})=>{const{slots:n}=s.useContext(je);return I.jsx(U4,{className:ge(t,n==null?void 0:n.closeTrigger()),"data-slot":"alert-dialog-close-trigger",slot:"close",...e})},V0=Object.assign(Li,{Root:Li,Trigger:G4,Backdrop:q4,Container:Z4,Dialog:Y4,Header:X4,Heading:J4,Body:Q4,Footer:eg,Icon:tg,CloseTrigger:ng});function lg(t){let e=Pn({usage:"search",...t}),n=s.useCallback((o,i)=>i.length===0?!0:(o=o.normalize("NFC"),i=i.normalize("NFC"),e.compare(o.slice(0,i.length),i)===0),[e]),l=s.useCallback((o,i)=>i.length===0?!0:(o=o.normalize("NFC"),i=i.normalize("NFC"),e.compare(o.slice(-i.length),i)===0),[e]),r=s.useCallback((o,i)=>{if(i.length===0)return!0;o=o.normalize("NFC"),i=i.normalize("NFC");let u=0,a=i.length;for(;u+a<=o.length;u++){let c=o.slice(u,u+a);if(e.compare(i,c)===0)return!0}return!1},[e]);return s.useMemo(()=>({startsWith:n,endsWith:l,contains:r}),[n,l,r])}const eo=s.createContext({}),Zs=s.createContext(null),Ys={badInput:!1,customError:!1,patternMismatch:!1,rangeOverflow:!1,rangeUnderflow:!1,stepMismatch:!1,tooLong:!1,tooShort:!1,typeMismatch:!1,valueMissing:!1,valid:!0},Xs={...Ys,customError:!0,valid:!1},Xt={isInvalid:!1,validationDetails:Ys,validationErrors:[]},rg=s.createContext({}),zi="__reactAriaFormValidationState";function og(t){if(t[zi]){let{realtimeValidation:e,displayValidation:n,updateValidation:l,resetValidation:r,commitValidation:o}=t[zi];return{realtimeValidation:e,displayValidation:n,updateValidation:l,resetValidation:r,commitValidation:o}}return ig(t)}function ig(t){let{isInvalid:e,validationState:n,name:l,value:r,builtinValidation:o,validate:i,validationBehavior:u="aria"}=t;n&&(e||(e=n==="invalid"));let a=e!==void 0?{isInvalid:e,validationErrors:[],validationDetails:Xs}:null,c=s.useMemo(()=>{if(!i||r==null)return null;let M=ug(i,r);return Ni(M)},[i,r]);o!=null&&o.validationDetails.valid&&(o=void 0);let f=s.useContext(rg),d=s.useMemo(()=>l?Array.isArray(l)?l.flatMap(M=>mr(f[M])):mr(f[l]):[],[f,l]),[b,p]=s.useState(f),[h,y]=s.useState(!1);f!==b&&(p(f),y(!1));let m=s.useMemo(()=>Ni(h?[]:d),[h,d]),g=s.useRef(Xt),[v,E]=s.useState(Xt),C=s.useRef(Xt),R=()=>{if(!T)return;F(!1);let M=c||o||g.current;jl(M,C.current)||(C.current=M,E(M))},[T,F]=s.useState(!1);return s.useEffect(R),{realtimeValidation:a||m||c||o||Xt,displayValidation:u==="native"?a||m||v:a||m||c||o||v,updateValidation(M){u==="aria"&&!jl(v,M)?E(M):g.current=M},resetValidation(){let M=Xt;jl(M,C.current)||(C.current=M,E(M)),u==="native"&&F(!1),y(!0)},commitValidation(){u==="native"&&F(!0),y(!0)}}}function mr(t){return t?Array.isArray(t)?t:[t]:[]}function ug(t,e){if(typeof t=="function"){let n=t(e);if(n&&typeof n!="boolean")return mr(n)}return[]}function Ni(t){return t.length?{isInvalid:!0,validationErrors:t,validationDetails:Xs}:null}function jl(t,e){return t===e?!0:!!t&&!!e&&t.isInvalid===e.isInvalid&&t.validationErrors.length===e.validationErrors.length&&t.validationErrors.every((n,l)=>n===e.validationErrors[l])&&Object.entries(t.validationDetails).every(([n,l])=>e.validationDetails[n]===l)}const to=s.createContext(null);var Js={};Js={colorSwatchPicker:"تغييرات الألوان",dropzoneLabel:"DropZone",selectPlaceholder:"حدد عنصرًا",tableResizer:"أداة تغيير الحجم"};var Qs={};Qs={colorSwatchPicker:"Цветови мостри",dropzoneLabel:"DropZone",selectPlaceholder:"Изберете предмет",tableResizer:"Преоразмерител"};var ec={};ec={colorSwatchPicker:"Vzorky barev",dropzoneLabel:"Místo pro přetažení",selectPlaceholder:"Vyberte položku",tableResizer:"Změna velikosti"};var tc={};tc={colorSwatchPicker:"Farveprøver",dropzoneLabel:"DropZone",selectPlaceholder:"Vælg et element",tableResizer:"Størrelsesændring"};var nc={};nc={colorSwatchPicker:"Farbfelder",dropzoneLabel:"Ablegebereich",selectPlaceholder:"Element wählen",tableResizer:"Größenanpassung"};var lc={};lc={colorSwatchPicker:"Χρωματικά δείγματα",dropzoneLabel:"DropZone",selectPlaceholder:"Επιλέξτε ένα αντικείμενο",tableResizer:"Αλλαγή μεγέθους"};var rc={};rc={selectPlaceholder:"Select an item",tableResizer:"Resizer",dropzoneLabel:"DropZone",colorSwatchPicker:"Color swatches"};var oc={};oc={colorSwatchPicker:"Muestras de colores",dropzoneLabel:"DropZone",selectPlaceholder:"Seleccionar un artículo",tableResizer:"Cambiador de tamaño"};var ic={};ic={colorSwatchPicker:"Värvinäidised",dropzoneLabel:"DropZone",selectPlaceholder:"Valige üksus",tableResizer:"Suuruse muutja"};var uc={};uc={colorSwatchPicker:"Värimallit",dropzoneLabel:"DropZone",selectPlaceholder:"Valitse kohde",tableResizer:"Koon muuttaja"};var ac={};ac={colorSwatchPicker:"Échantillons de couleurs",dropzoneLabel:"DropZone",selectPlaceholder:"Sélectionner un élément",tableResizer:"Redimensionneur"};var sc={};sc={colorSwatchPicker:"דוגמיות צבע",dropzoneLabel:"DropZone",selectPlaceholder:"בחר פריט",tableResizer:"שינוי גודל"};var cc={};cc={colorSwatchPicker:"Uzorci boja",dropzoneLabel:"Zona spuštanja",selectPlaceholder:"Odaberite stavku",tableResizer:"Promjena veličine"};var dc={};dc={colorSwatchPicker:"Színtárak",dropzoneLabel:"DropZone",selectPlaceholder:"Válasszon ki egy elemet",tableResizer:"Átméretező"};var fc={};fc={colorSwatchPicker:"Campioni di colore",dropzoneLabel:"Zona di rilascio",selectPlaceholder:"Seleziona un elemento",tableResizer:"Ridimensionamento"};var pc={};pc={colorSwatchPicker:"カラースウォッチ",dropzoneLabel:"ドロップゾーン",selectPlaceholder:"項目を選択",tableResizer:"サイズ変更ツール"};var bc={};bc={colorSwatchPicker:"색상 견본",dropzoneLabel:"드롭 영역",selectPlaceholder:"항목 선택",tableResizer:"크기 조정기"};var hc={};hc={colorSwatchPicker:"Spalvų pavyzdžiai",dropzoneLabel:"„DropZone“",selectPlaceholder:"Pasirinkite elementą",tableResizer:"Dydžio keitiklis"};var mc={};mc={colorSwatchPicker:"Krāsu paraugi",dropzoneLabel:"DropZone",selectPlaceholder:"Izvēlēties vienumu",tableResizer:"Izmēra mainītājs"};var gc={};gc={colorSwatchPicker:"Fargekart",dropzoneLabel:"Droppsone",selectPlaceholder:"Velg et element",tableResizer:"Størrelsesendrer"};var yc={};yc={colorSwatchPicker:"kleurstalen",dropzoneLabel:"DropZone",selectPlaceholder:"Selecteer een item",tableResizer:"Resizer"};var $c={};$c={colorSwatchPicker:"Próbki kolorów",dropzoneLabel:"Strefa upuszczania",selectPlaceholder:"Wybierz element",tableResizer:"Zmiana rozmiaru"};var vc={};vc={colorSwatchPicker:"Amostras de cores",dropzoneLabel:"DropZone",selectPlaceholder:"Selecione um item",tableResizer:"Redimensionador"};var xc={};xc={colorSwatchPicker:"Amostras de cores",dropzoneLabel:"DropZone",selectPlaceholder:"Selecione um item",tableResizer:"Redimensionador"};var Cc={};Cc={colorSwatchPicker:"Specimene de culoare",dropzoneLabel:"Zonă de plasare",selectPlaceholder:"Selectați un element",tableResizer:"Instrument de redimensionare"};var Ec={};Ec={colorSwatchPicker:"Цветовые образцы",dropzoneLabel:"DropZone",selectPlaceholder:"Выберите элемент",tableResizer:"Средство изменения размера"};var wc={};wc={colorSwatchPicker:"Vzorkovníky farieb",dropzoneLabel:"DropZone",selectPlaceholder:"Vyberte položku",tableResizer:"Nástroj na zmenu veľkosti"};var Sc={};Sc={colorSwatchPicker:"Barvne palete",dropzoneLabel:"DropZone",selectPlaceholder:"Izberite element",tableResizer:"Spreminjanje velikosti"};var Dc={};Dc={colorSwatchPicker:"Uzorci boje",dropzoneLabel:"DropZone",selectPlaceholder:"Izaberite stavku",tableResizer:"Promena veličine"};var kc={};kc={colorSwatchPicker:"Färgrutor",dropzoneLabel:"DropZone",selectPlaceholder:"Välj en artikel",tableResizer:"Storleksändrare"};var Pc={};Pc={colorSwatchPicker:"Renk örnekleri",dropzoneLabel:"Bırakma Bölgesi",selectPlaceholder:"Bir öğe seçin",tableResizer:"Yeniden boyutlandırıcı"};var Tc={};Tc={colorSwatchPicker:"Зразки кольорів",dropzoneLabel:"DropZone",selectPlaceholder:"Виберіть елемент",tableResizer:"Засіб змінення розміру"};var Ac={};Ac={colorSwatchPicker:"颜色色板",dropzoneLabel:"放置区域",selectPlaceholder:"选择一个项目",tableResizer:"尺寸调整器"};var Bc={};Bc={colorSwatchPicker:"色票",dropzoneLabel:"放置區",selectPlaceholder:"選取項目",tableResizer:"大小調整器"};var Kc={};Kc={"ar-AE":Js,"bg-BG":Qs,"cs-CZ":ec,"da-DK":tc,"de-DE":nc,"el-GR":lc,"en-US":rc,"es-ES":oc,"et-EE":ic,"fi-FI":uc,"fr-FR":ac,"he-IL":sc,"hr-HR":cc,"hu-HU":dc,"it-IT":fc,"ja-JP":pc,"ko-KR":bc,"lt-LT":hc,"lv-LV":mc,"nb-NO":gc,"nl-NL":yc,"pl-PL":$c,"pt-BR":vc,"pt-PT":xc,"ro-RO":Cc,"ru-RU":Ec,"sk-SK":wc,"sl-SI":Sc,"sr-SP":Dc,"sv-SE":kc,"tr-TR":Pc,"uk-UA":Tc,"zh-CN":Ac,"zh-TW":Bc};const qe=s.createContext({}),no=s.createContext(null),ag=s.forwardRef(function(e,n){let{render:l}=s.useContext(no);return x.createElement(x.Fragment,null,l(e,n))});function lo(t,e){var o;let n=t==null?void 0:t.renderDropIndicator,l=(o=t==null?void 0:t.isVirtualDragging)==null?void 0:o.call(t),r=s.useCallback(i=>{if(l||e!=null&&e.isDropTarget(i))return n?n(i):x.createElement(ag,{target:i})},[e==null?void 0:e.target,l,n]);return t!=null&&t.useDropIndicator?r:void 0}function Rc(t,e,n){var o,i,u;let l=t.focusedKey,r=null;if((o=e==null?void 0:e.isVirtualDragging)!=null&&o.call(e)&&((i=n==null?void 0:n.target)==null?void 0:i.type)==="item"&&(r=n.target.key,n.target.dropPosition==="after")){let a=n.collection.getKeyAfter(r),c=null;if(a!=null){let f=((u=n.collection.getItem(r))==null?void 0:u.level)??0;for(;a!=null;){let d=n.collection.getItem(a);if(!d)break;if(d.type!=="item"){a=n.collection.getKeyAfter(a);continue}if((d.level??0)<=f)break;c=a,a=n.collection.getKeyAfter(a)}}r=a??c??r}return s.useMemo(()=>new Set([l,r].filter(a=>a!=null)),[l,r])}const $l=new WeakMap;function sg(t){return typeof t=="string"?t.replace(/\s*/g,""):""+t}function Mc(t,e){let n=$l.get(t);if(!n)throw new Error("Unknown list");return`${n.id}-option-${sg(e)}`}function cg(t,e,n){let l=oe(t,{labelable:!0}),r=t.selectionBehavior||"toggle",o=t.orientation||"vertical",i=t.linkBehavior||(r==="replace"?"action":"override");r==="toggle"&&i==="action"&&(i="override");let{listProps:u}=A4({...t,ref:n,selectionManager:e.selectionManager,collection:e.collection,disabledKeys:e.disabledKeys,linkBehavior:i}),{focusWithinProps:a}=dl({onFocusWithin:t.onFocus,onBlurWithin:t.onBlur,onFocusWithinChange:t.onFocusChange}),c=$e(t.id);$l.set(e,{id:c,shouldUseVirtualFocus:t.shouldUseVirtualFocus,shouldSelectOnPressUp:t.shouldSelectOnPressUp,shouldFocusOnHover:t.shouldFocusOnHover,isVirtualized:t.isVirtualized,onAction:t.onAction,linkBehavior:i,UNSTABLE_itemBehavior:t.UNSTABLE_itemBehavior});let{labelProps:f,fieldProps:d}=al({...t,id:c,labelElementType:"span"});return{labelProps:f,listBoxProps:W(l,a,e.selectionManager.selectionMode==="multiple"?{"aria-multiselectable":"true"}:{},{role:"listbox","aria-orientation":o,...W(d,u)})}}function dg(t,e,n){var L,M;let{key:l}=t,r=$l.get(e),o=t.isDisabled??e.selectionManager.isDisabled(l),i=t.isSelected??e.selectionManager.isSelected(l),u=t.shouldSelectOnPressUp??(r==null?void 0:r.shouldSelectOnPressUp),a=t.shouldFocusOnHover??(r==null?void 0:r.shouldFocusOnHover),c=t.shouldUseVirtualFocus??(r==null?void 0:r.shouldUseVirtualFocus),f=t.isVirtualized??(r==null?void 0:r.isVirtualized),d=sn(),b=sn(),p={role:"option","aria-disabled":o||void 0,"aria-selected":e.selectionManager.selectionMode!=="none"?i:void 0,"aria-label":t["aria-label"],"aria-labelledby":d,"aria-describedby":b},h=e.collection.getItem(l);if(f){let V=Number(h==null?void 0:h.index);p["aria-posinset"]=Number.isNaN(V)?void 0:V+1,p["aria-setsize"]=Hs(e.collection)}let y=r!=null&&r.onAction?()=>{var V;return(V=r==null?void 0:r.onAction)==null?void 0:V.call(r,l)}:void 0,m=Mc(e,l),{itemProps:g,isPressed:v,isFocused:E,hasAction:C,allowsSelection:R}=Yr({selectionManager:e.selectionManager,key:l,ref:n,shouldSelectOnPressUp:u,allowsDifferentPressOrigin:u&&a,isVirtualized:f,shouldUseVirtualFocus:c,isDisabled:o,onAction:y||(L=h==null?void 0:h.props)!=null&&L.onAction?ft((M=h==null?void 0:h.props)==null?void 0:M.onAction,y):void 0,linkBehavior:r==null?void 0:r.linkBehavior,UNSTABLE_itemBehavior:r==null?void 0:r.UNSTABLE_itemBehavior,id:m}),{hoverProps:T}=Fe({isDisabled:o||!a,onHoverStart(){zt()||(e.selectionManager.setFocused(!0),e.selectionManager.setFocusedKey(l))}}),F=oe(h==null?void 0:h.props);delete F.id;let B=hu(h==null?void 0:h.props);return{optionProps:{...p,...W(F,g,T,B),id:m},labelProps:{id:d},descriptionProps:{id:b},isFocused:E,isFocusVisible:E&&e.selectionManager.isFocused&&zt(),isSelected:i,isDisabled:o,isPressed:v,allowsSelection:R,hasAction:C}}function fg(t){let{heading:e,"aria-label":n}=t,l=$e();return{itemProps:{role:"presentation"},headingProps:e?{id:l,role:"presentation",onMouseDown:r=>{r.preventDefault()}}:{},groupProps:{role:"group","aria-label":n,"aria-labelledby":e?l:void 0}}}class gr{constructor(e){this.keyMap=new Map,this.firstKey=null,this.lastKey=null,this.iterable=e;let n=i=>{if(this.keyMap.set(i.key,i),i.childNodes&&i.type==="section")for(let u of i.childNodes)n(u)};for(let i of e)n(i);let l=null,r=0,o=0;for(let[i,u]of this.keyMap)l?(l.nextKey=i,u.prevKey=l.key):(this.firstKey=i,u.prevKey=void 0),u.type==="item"&&(u.index=r++),(u.type==="section"||u.type==="item")&&o++,l=u,l.nextKey=void 0;this._size=o,this.lastKey=(l==null?void 0:l.key)??null}*[Symbol.iterator](){yield*this.iterable}get size(){return this._size}getKeys(){return this.keyMap.keys()}getKeyBefore(e){let n=this.keyMap.get(e);return n?n.prevKey??null:null}getKeyAfter(e){let n=this.keyMap.get(e);return n?n.nextKey??null:null}getFirstKey(){return this.firstKey}getLastKey(){return this.lastKey}getItem(e){return this.keyMap.get(e)??null}at(e){const n=[...this.getKeys()];return this.getItem(n[e])}getChildren(e){let n=this.keyMap.get(e);return(n==null?void 0:n.childNodes)||[]}}function Fc(t){let{filter:e,layoutDelegate:n}=t,l=Jr(t),r=s.useMemo(()=>t.disabledKeys?new Set(t.disabledKeys):new Set,[t.disabledKeys]),o=s.useCallback(c=>e?new gr(e(c)):new gr(c),[e]),i=s.useMemo(()=>({suppressTextValueWarning:t.suppressTextValueWarning}),[t.suppressTextValueWarning]),u=Us(t,o,i),a=s.useMemo(()=>new yl(u,l,{layoutDelegate:n}),[u,l,n]);return Ic(u,a),{collection:u,disabledKeys:r,selectionManager:a}}function pg(t,e){let n=s.useMemo(()=>e?t.collection.filter(e):t.collection,[t.collection,e]),l=t.selectionManager.withCollection(n);return Ic(n,l),{collection:n,selectionManager:l,disabledKeys:t.disabledKeys}}function Ic(t,e){const n=s.useRef(null);s.useEffect(()=>{if(e.focusedKey!=null&&!t.getItem(e.focusedKey)&&n.current){let l=n.current.getKeyAfter(e.focusedKey),r=null;for(;l!=null;){let o=t.getItem(l);if(o&&o.type==="item"&&!e.isDisabled(l)){r=l;break}l=n.current.getKeyAfter(l)}if(r==null)for(l=n.current.getKeyBefore(e.focusedKey);l!=null;){let o=t.getItem(l);if(o&&o.type==="item"&&!e.isDisabled(l)){r=l;break}l=n.current.getKeyBefore(l)}e.setFocusedKey(r)}n.current=t},[t,e])}const vl=s.createContext(null),Wt=s.createContext(null),bg=s.forwardRef(function(e,n){[e,n]=ve(e,n,vl);let l=s.useContext(Wt);return l?x.createElement(Lc,{state:l,props:e,listBoxRef:n}):x.createElement(Ur,{content:x.createElement(Dn,e)},r=>x.createElement(hg,{props:e,listBoxRef:n,collection:r}))});function hg({props:t,listBoxRef:e,collection:n}){t={...t,collection:n,children:null,items:null};let{layoutDelegate:l}=s.useContext(pe),r=Fc({...t,layoutDelegate:l});return x.createElement(Lc,{state:r,props:t,listBoxRef:e})}function Lc({state:t,props:e,listBoxRef:n}){[e,n]=ve(e,n,pr);let{dragAndDropHooks:l,layout:r="stack",orientation:o="vertical",filter:i}=e,u=pg(t,i),{collection:a,selectionManager:c}=u,f=!!(l!=null&&l.useDraggableCollectionState),d=!!(l!=null&&l.useDroppableCollectionState),{direction:b}=Pe(),{disabledBehavior:p,disabledKeys:h}=c,y=Pn({usage:"search",sensitivity:"base"}),{isVirtualized:m,layoutDelegate:g,dropTargetDelegate:v,CollectionRoot:E}=s.useContext(pe),C=s.useMemo(()=>e.keyboardDelegate||new gl({collection:a,collator:y,ref:n,disabledKeys:h,disabledBehavior:p,layout:r,orientation:o,direction:b,layoutDelegate:g}),[a,y,n,p,h,o,b,e.keyboardDelegate,r,g]),{listBoxProps:R}=cg({...e,shouldSelectOnPressUp:f||e.shouldSelectOnPressUp,keyboardDelegate:C,isVirtualized:m},u,n);s.useRef(f),s.useRef(d),s.useEffect(()=>{},[f,d]);let T,F,B,L=!1,M=null,V=s.useRef(null);if(f&&l){T=l.useDraggableCollectionState({collection:a,selectionManager:c,preview:l.renderDragPreview?V:void 0}),l.useDraggableCollection({},T,n);let K=l.DragPreview;M=l.renderDragPreview?x.createElement(K,{ref:V},l.renderDragPreview):null}if(d&&l){F=l.useDroppableCollectionState({collection:a,selectionManager:c});let K=l.dropTargetDelegate||v||new l.ListDropTargetDelegate(a,n,{orientation:o,layout:r,direction:b});B=l.useDroppableCollection({keyboardDelegate:C,dropTargetDelegate:K},F,n),L=F.isDropTarget({type:"root"})}let{focusProps:H,isFocused:j,isFocusVisible:$}=Ve(),D=u.collection.size===0,A={isDropTarget:L,isEmpty:D,isFocused:j,isFocusVisible:$,layout:e.layout||"stack",orientation:o,state:u},w=ae({...e,children:void 0,defaultClassName:"react-aria-ListBox",values:A}),P=null;D&&e.renderEmptyState&&(P=x.createElement("div",{role:"option",style:{display:"contents"}},e.renderEmptyState(A)));let k=oe(e,{global:!0});return x.createElement(Or,null,x.createElement(ee.div,{...W(k,w,R,H,B==null?void 0:B.collectionProps),ref:n,slot:e.slot||void 0,onScroll:e.onScroll,"data-drop-target":L||void 0,"data-empty":D||void 0,"data-focused":j||void 0,"data-focus-visible":$||void 0,"data-layout":e.layout||"stack","data-orientation":o},x.createElement(Me,{values:[[vl,e],[Wt,u],[qe,{dragAndDropHooks:l,dragState:T,dropState:F}],[v4,{elementType:"div"}],[no,{render:yg}],[b4,{name:"ListBoxSection",render:zc}]]},x.createElement(rs,null,x.createElement(E,{collection:a,scrollRef:n,persistedKeys:Rc(c,l,F),renderDropIndicator:lo(l,F)}))),P,M))}function zc(t,e,n,l="react-aria-ListBoxSection"){let r=s.useContext(Wt),{dragAndDropHooks:o,dropState:i}=s.useContext(qe),{CollectionBranch:u}=s.useContext(pe),[a,c]=xn(),{headingProps:f,groupProps:d}=fg({heading:c,"aria-label":t["aria-label"]??void 0}),b=ae({...t,id:void 0,children:void 0,defaultClassName:l,values:void 0}),p=oe(t,{global:!0});return delete p.id,x.createElement(ee.section,{...W(p,b,d),ref:e},x.createElement(y4.Provider,{value:{...f,ref:a}},x.createElement(u,{collection:r.collection,parent:n,renderDropIndicator:lo(o,i)})))}const mg=ml(dr,zc),gg=Sn(cr,function(e,n,l){let r=Te(n),o=s.useContext(Wt),{dragAndDropHooks:i,dragState:u,dropState:a}=s.useContext(qe),c=u&&!(u.isDisabled||u.selectionManager.isDisabled(l.key)),{optionProps:f,labelProps:d,descriptionProps:b,...p}=dg({key:l.key,"aria-label":e==null?void 0:e["aria-label"]},o,r),{hoverProps:h,isHovered:y}=Fe({isDisabled:!p.allowsSelection&&!p.hasAction&&!c,onHoverStart:l.props.onHoverStart,onHoverChange:l.props.onHoverChange,onHoverEnd:l.props.onHoverEnd}),{keyboardProps:m}=cl(e),{focusProps:g}=Lr(e),v=null;u&&i&&(v=i.useDraggableItem({key:l.key,hasAction:p.hasAction},u));let E=null;a&&i&&(E=i.useDroppableItem({target:{type:"item",key:l.key,dropPosition:"on"}},a,r));let C=u&&u.isDragging(l.key),R=ae({...e,id:void 0,children:e.children,defaultClassName:"react-aria-ListBoxItem",values:{...p,isHovered:y,selectionMode:o.selectionManager.selectionMode,selectionBehavior:o.selectionManager.selectionBehavior,allowsDragging:!!u,isDragging:C,isDropTarget:E==null?void 0:E.isDropTarget}});s.useEffect(()=>{l.textValue},[l.textValue]);let T=e.href?ee.a:ee.div,F=oe(e,{global:!0});return delete F.id,delete F.onClick,e.href&&f.tabIndex==null&&(f.tabIndex=-1),x.createElement(T,{...W(F,R,f,h,m,g,v==null?void 0:v.dragProps,E==null?void 0:E.dropProps),ref:r,"data-allows-dragging":!!u||void 0,"data-selected":p.isSelected||void 0,"data-disabled":p.isDisabled||void 0,"data-hovered":y||void 0,"data-focused":p.isFocused||void 0,"data-focus-visible":p.isFocusVisible||void 0,"data-pressed":p.isPressed||void 0,"data-dragging":C||void 0,"data-drop-target":(E==null?void 0:E.isDropTarget)||void 0,"data-selection-mode":o.selectionManager.selectionMode==="none"?void 0:o.selectionManager.selectionMode},x.createElement(Me,{values:[[kn,{slots:{[gt]:d,label:d,description:b}}],[os,{isSelected:p.isSelected}]]},R.children))});function yg(t,e){e=Te(e);let{dragAndDropHooks:n,dropState:l}=s.useContext(qe),{dropIndicatorProps:r,isHidden:o,isDropTarget:i}=n.useDropIndicator(t,l,e);return o?null:x.createElement(vg,{...t,dropIndicatorProps:r,isDropTarget:i,ref:e})}function $g(t,e){let{dropIndicatorProps:n,isDropTarget:l,...r}=t,o=ae({...r,defaultClassName:"react-aria-DropIndicator",values:{isDropTarget:l}});return x.createElement(x.Fragment,null,x.createElement(ee.div,{...n,...o,role:"option",ref:e,"data-drop-target":l||void 0}))}const vg=s.forwardRef($g);Sn(tl,function(e,n,l){let r=s.useContext(Wt),{isLoading:o,onLoadMore:i,scrollOffset:u,...a}=e,c=s.useRef(null),f=s.useMemo(()=>({onLoadMore:i,collection:r==null?void 0:r.collection,sentinelRef:c,scrollOffset:u}),[i,u,r==null?void 0:r.collection]);Cu(f,c);let d=ae({...a,id:void 0,children:l.rendered,defaultClassName:"react-aria-ListBoxLoadingIndicator",values:void 0}),b={tabIndex:-1};return x.createElement(x.Fragment,null,x.createElement("div",{style:{position:"relative",width:0,height:0},inert:Eu(!0)},x.createElement("div",{"data-testid":"loadMoreSentinel",ref:c,style:{position:"absolute",height:1,width:1}})),o&&d.children&&x.createElement(x.Fragment,null,x.createElement(ee.div,{...W(oe(e,{global:!0}),b),...d,role:"option",ref:n},d.children)))});function xg(t){let{description:e,errorMessage:n,isInvalid:l,validationState:r}=t,{labelProps:o,fieldProps:i}=al(t),u=sn([!!e,!!n,l,r]),a=sn([!!e,!!n,l,r]);return i=W(i,{"aria-describedby":[u,a,t["aria-describedby"]].filter(Boolean).join(" ")||void 0}),{labelProps:o,fieldProps:i,descriptionProps:{id:u},errorMessageProps:{id:a}}}function Nc(t,e,n){let{validationBehavior:l,focus:r}=t;le(()=>{if(l==="native"&&(n!=null&&n.current)&&!n.current.disabled){let c=e.realtimeValidation.isInvalid?e.realtimeValidation.validationErrors.join(" ")||"Invalid value.":"";n.current.setCustomValidity(c),n.current.hasAttribute("title")||(n.current.title=""),e.realtimeValidation.isInvalid||e.updateValidation(Eg(n.current))}});let o=s.useRef(!1),i=we(()=>{o.current||e.resetValidation()}),u=we(c=>{var d,b;e.displayValidation.isInvalid||e.commitValidation();let f=(d=n==null?void 0:n.current)==null?void 0:d.form;!c.defaultPrevented&&n&&f&&wg(f)===n.current&&(r?r():(b=n.current)==null||b.focus(),ea("keyboard")),c.preventDefault()}),a=we(()=>{e.commitValidation()});s.useEffect(()=>{let c=n==null?void 0:n.current;if(!c)return;let f=c.form,d=f==null?void 0:f.reset;return f&&(f.reset=()=>{o.current=!window.event||window.event.type==="message"&&U(window.event)instanceof MessagePort,d==null||d.call(f),o.current=!1}),c.addEventListener("invalid",u),c.addEventListener("change",a),f==null||f.addEventListener("reset",i),()=>{c.removeEventListener("invalid",u),c.removeEventListener("change",a),f==null||f.removeEventListener("reset",i),f&&(f.reset=d)}},[n,l])}function Cg(t){let e=t.validity;return{badInput:e.badInput,customError:e.customError,patternMismatch:e.patternMismatch,rangeOverflow:e.rangeOverflow,rangeUnderflow:e.rangeUnderflow,stepMismatch:e.stepMismatch,tooLong:e.tooLong,tooShort:e.tooShort,typeMismatch:e.typeMismatch,valueMissing:e.valueMissing,valid:e.valid}}function Eg(t){return{isInvalid:!t.validity.valid,validationDetails:Cg(t),validationErrors:t.validationMessage?[t.validationMessage]:[]}}function wg(t){var e;for(let n=0;n{var v;(v=d.onClick)==null||v.call(d,g),Fp(g,y,t.href,t.routerOptions)}})}}const Dg=s.createContext(null),kg=s.forwardRef(function(e,n){[e,n]=ve(e,n,Dg);let l=e.href&&!e.isDisabled?"a":"span",{linkProps:r,isPressed:o}=Sg({...e,elementType:l},n),i=ee[l],{hoverProps:u,isHovered:a}=Fe(e),{focusProps:c,isFocused:f,isFocusVisible:d}=Ve(),b=ae({...e,defaultClassName:"react-aria-Link",values:{isCurrent:!!e["aria-current"],isDisabled:e.isDisabled||!1,isPressed:o,isHovered:a,isFocused:f,isFocusVisible:d}}),p=oe(e,{global:!0});return delete p.onClick,x.createElement(i,{ref:n,slot:e.slot||void 0,...W(p,b,r,u,c),"data-focused":f||void 0,"data-hovered":a||void 0,"data-pressed":o||void 0,"data-focus-visible":d||void 0,"data-current":!!e["aria-current"]||void 0,"data-disabled":e.isDisabled||void 0},b.children)}),Vc=s.createContext({}),Vi=({children:t,className:e,...n})=>{const l=x.useMemo(()=>Ch(),[]);return I.jsx(Vc,{value:{slots:l},children:I.jsx(kg,{...n,className:ge(e,l==null?void 0:l.base()),children:r=>I.jsx(I.Fragment,{children:typeof t=="function"?t(r):t})})})},Pg=({children:t,className:e,...n})=>{const{slots:l}=s.useContext(Vc);return I.jsx(De.span,{className:fe(l==null?void 0:l.icon,e),"data-default-icon":oa(!t),"data-slot":"link-icon",...n,children:t??I.jsx(fm,{"data-slot":"link-default-icon"})})},O0=Object.assign(Vi,{Root:Vi,Icon:Pg});function Tg(t={}){let{isReadOnly:e}=t,[n,l]=ct(t.isSelected,t.defaultSelected||!1,t.onChange),[r]=s.useState(n);function o(u){e||l(u)}function i(){e||l(!n)}return{isSelected:n,defaultSelected:t.defaultSelected??r,setSelected:o,toggle:i}}const Ag=s.createContext({}),Bg="__button_group_child",Oi=({children:t,className:e,fullWidth:n,isDisabled:l,isIconOnly:r,size:o,slot:i,style:u,variant:a,[Bg]:c,...f})=>{const d=s.useContext(Ag),b=c===!0,p=o??(b?d==null?void 0:d.size:void 0),h=a??(b?d==null?void 0:d.variant:void 0),y=l??(b?d==null?void 0:d.isDisabled:void 0),m=n??(b?d==null?void 0:d.fullWidth:void 0),g=bh({fullWidth:m,isIconOnly:r,size:p,variant:h});return I.jsx(Nr,{className:ge(e,g),"data-slot":"button",isDisabled:y,slot:i,style:u,...f,children:v=>typeof t=="function"?t(v):t})},j0=Object.assign(Oi,{Root:Oi}),Ut=s.createContext({}),ji=({children:t,className:e,variant:n="default",...l})=>{const r=x.useMemo(()=>hh({variant:n}),[n]),o=I.jsx(De.div,{className:r.base({className:e}),"data-slot":"card",...l,children:t});return I.jsx(Ut,{value:{slots:r},children:n==="transparent"?o:I.jsx(ia,{value:{variant:n},children:o})})},Kg=({className:t,...e})=>{const{slots:n}=s.useContext(Ut);return I.jsx(De.div,{className:fe(n==null?void 0:n.header,t),"data-slot":"card-header",...e})},Rg=({children:t,className:e,...n})=>{const{slots:l}=s.useContext(Ut);return I.jsx(De.h3,{className:fe(l==null?void 0:l.title,e),"data-slot":"card-title",...n,children:t})},Mg=({children:t,className:e,...n})=>{const{slots:l}=s.useContext(Ut);return I.jsx(De.p,{className:fe(l==null?void 0:l.description,e),"data-slot":"card-description",...n,children:t})},Fg=({className:t,...e})=>{const{slots:n}=s.useContext(Ut);return I.jsx(De.div,{className:fe(n==null?void 0:n.content,t),"data-slot":"card-content",...e})},Ig=({className:t,...e})=>{const{slots:n}=s.useContext(Ut);return I.jsx(De.div,{className:fe(n==null?void 0:n.footer,t),"data-slot":"card-footer",...e})},_0=Object.assign(ji,{Root:ji,Header:Kg,Title:Rg,Description:Mg,Content:Fg,Footer:Ig}),Lg=new WeakMap;function zg(t=!0){let[e,n]=s.useState(t),l=s.useRef(!1),r=s.useCallback(o=>{l.current=!0,n(!!o)},[]);return le(()=>{l.current||n(!1)},[]),[r,e]}function _i(t=!0){let e=$e(),[n,l]=zg(t);return{id:l?e:void 0,ref:n}}const Oc={badInput:!1,customError:!1,patternMismatch:!1,rangeOverflow:!1,rangeUnderflow:!1,stepMismatch:!1,tooLong:!1,tooShort:!1,typeMismatch:!1,valueMissing:!1,valid:!0},jc={...Oc,customError:!0,valid:!1},Bt={isInvalid:!1,validationDetails:Oc,validationErrors:[]},Ng=s.createContext({}),yn="__reactAriaFormValidationState";function ro(t){if(t[yn]){let{realtimeValidation:e,displayValidation:n,updateValidation:l,resetValidation:r,commitValidation:o}=t[yn];return{realtimeValidation:e,displayValidation:n,updateValidation:l,resetValidation:r,commitValidation:o}}return Vg(t)}function Vg(t){let{isInvalid:e,validationState:n,name:l,value:r,builtinValidation:o,validate:i,validationBehavior:u="aria"}=t;n&&(e||(e=n==="invalid"));let a=e!==void 0?{isInvalid:e,validationErrors:[],validationDetails:jc}:null,c=s.useMemo(()=>{if(!i||r==null)return null;let M=Og(i,r);return Hi(M)},[i,r]);o!=null&&o.validationDetails.valid&&(o=void 0);let f=s.useContext(Ng),d=s.useMemo(()=>l?Array.isArray(l)?l.flatMap(M=>yr(f[M])):yr(f[l]):[],[f,l]),[b,p]=s.useState(f),[h,y]=s.useState(!1);f!==b&&(p(f),y(!1));let m=s.useMemo(()=>Hi(h?[]:d),[h,d]),g=s.useRef(Bt),[v,E]=s.useState(Bt),C=s.useRef(Bt),R=()=>{if(!T)return;F(!1);let M=c||o||g.current;_l(M,C.current)||(C.current=M,E(M))},[T,F]=s.useState(!1);return s.useEffect(R),{realtimeValidation:a||m||c||o||Bt,displayValidation:u==="native"?a||m||v:a||m||c||o||v,updateValidation(M){u==="aria"&&!_l(v,M)?E(M):g.current=M},resetValidation(){let M=Bt;_l(M,C.current)||(C.current=M,E(M)),u==="native"&&F(!1),y(!0)},commitValidation(){u==="native"&&F(!0),y(!0)}}}function yr(t){return t?Array.isArray(t)?t:[t]:[]}function Og(t,e){if(typeof t=="function"){let n=t(e);if(n&&typeof n!="boolean")return yr(n)}return[]}function Hi(t){return t.length?{isInvalid:!0,validationErrors:t,validationDetails:jc}:null}function _l(t,e){return t===e?!0:!!t&&!!e&&t.isInvalid===e.isInvalid&&t.validationErrors.length===e.validationErrors.length&&t.validationErrors.every((n,l)=>n===e.validationErrors[l])&&Object.entries(t.validationDetails).every(([n,l])=>e.validationDetails[n]===l)}function jg(t,e,n){let{isDisabled:l=!1,isReadOnly:r=!1,value:o,name:i,form:u,children:a,isRequired:c,validationBehavior:f="aria","aria-label":d,"aria-labelledby":b,"aria-describedby":p,onPressStart:h,onPressEnd:y,onPressChange:m,onPress:g,onPressUp:v,onClick:E}=t,C=ro({...t,value:e.isSelected}),{isInvalid:R,validationErrors:T,validationDetails:F}=C.displayValidation;Nc(t,C,n);let B=k=>{k.stopPropagation(),e.setSelected(U(k).checked)},{pressProps:L,isPressed:M}=lt({onPressStart:h,onPressEnd:y,onPressChange:m,onPress:g,onPressUp:v,onClick:E,isDisabled:l}),[V,H]=s.useState(!1),{pressProps:j}=lt({onPressStart(k){if(k.pointerType==="keyboard"||k.pointerType==="virtual"){k.continuePropagation();return}h==null||h(k),m==null||m(!0),H(!0)},onPressEnd(k){if(k.pointerType==="keyboard"||k.pointerType==="virtual"){k.continuePropagation();return}y==null||y(k),m==null||m(!1),H(!1)},onPressUp(k){if(k.pointerType==="keyboard"||k.pointerType==="virtual"){k.continuePropagation();return}v==null||v(k)},onClick:E,onPress(k){var Z;if(k.pointerType==="keyboard"||k.pointerType==="virtual"){k.continuePropagation();return}g==null||g(k),e.toggle(),(Z=n.current)==null||Z.focus();let{[yn]:K}=t,{commitValidation:_}=K||C;_()},isDisabled:l||r}),{focusableProps:$}=wt(t,n),D=W(L,$),A=oe(t,{labelable:!0});il(n,e.defaultSelected,e.setSelected);let w=_i(),P=_i();return{labelProps:W(j,{onClick:k=>k.preventDefault()}),inputProps:W(A,{checked:e.isSelected,"aria-required":c&&f==="aria"||void 0,required:c&&f==="native","aria-invalid":R||t.validationState==="invalid"||void 0,"aria-errormessage":t["aria-errormessage"],"aria-controls":t["aria-controls"],"aria-readonly":r||void 0,"aria-describedby":[w.id,P.id,p].filter(Boolean).join(" ")||void 0,onChange:B,disabled:l,...o==null?{}:{value:o},name:i,form:u,type:"checkbox",...D}),descriptionProps:w,errorMessageProps:P,isSelected:e.isSelected,isPressed:M||V,isDisabled:l,isReadOnly:r,isInvalid:R||t.validationState==="invalid",validationErrors:T,validationDetails:F}}function _c(t,e,n){let{labelProps:l,inputProps:r,descriptionProps:o,errorMessageProps:i,isSelected:u,isPressed:a,isDisabled:c,isReadOnly:f,isInvalid:d,validationErrors:b,validationDetails:p}=jg(t,e,n),{isIndeterminate:h}=t;return s.useEffect(()=>{n.current&&(n.current.indeterminate=!!h)}),{labelProps:W(l,s.useMemo(()=>({onMouseDown:y=>y.preventDefault()}),[])),inputProps:r,descriptionProps:o,errorMessageProps:i,isSelected:u,isPressed:a,isDisabled:c,isReadOnly:f,isInvalid:d,validationErrors:b,validationDetails:p}}const _g=typeof document<"u"?x.useInsertionEffect??x.useLayoutEffect:()=>{};function Hc(t,e,n){let[l,r]=s.useState(t||e),o=s.useRef(l),i=s.useRef(t!==void 0),u=t!==void 0;s.useEffect(()=>{i.current,i.current=u},[u]);let a=u?t:l;_g(()=>{o.current=a});let[,c]=s.useReducer(()=>({}),{}),f=s.useCallback((d,...b)=>{let p=typeof d=="function"?d(o.current):d;Object.is(o.current,p)||(o.current=p,r(p),c(),n==null||n(p,...b))},[n]);return[a,f]}function Hg(t={}){let{isReadOnly:e}=t,[n,l]=Hc(t.isSelected,t.defaultSelected||!1,t.onChange),[r]=s.useState(n);function o(u){e||l(u)}function i(){e||l(!n)}return{isSelected:n,defaultSelected:t.defaultSelected??r,setSelected:o,toggle:i}}function Wg(t,e,n){const l=Hg({isReadOnly:t.isReadOnly||e.isReadOnly,isSelected:e.isSelected(t.value),defaultSelected:e.defaultValue.includes(t.value),onChange(y){y?e.addValue(t.value):e.removeValue(t.value),t.onChange&&t.onChange(y)}});let{name:r,form:o,descriptionId:i,errorMessageId:u,validationBehavior:a}=Lg.get(e);a=t.validationBehavior??a;let{realtimeValidation:c}=ro({...t,value:l.isSelected,name:void 0,validationBehavior:"aria"}),f=s.useRef(Bt),d=()=>{e.setInvalid(t.value,c.isInvalid?c:f.current)};s.useEffect(d);let b=e.realtimeValidation.isInvalid?e.realtimeValidation:c,p=a==="native"?e.displayValidation:b,h=_c({...t,isReadOnly:t.isReadOnly||e.isReadOnly,isDisabled:t.isDisabled||e.isDisabled,name:t.name||r,form:t.form||o,isRequired:t.isRequired??e.isRequired,validationBehavior:a,[yn]:{realtimeValidation:b,displayValidation:p,resetValidation:e.resetValidation,commitValidation:e.commitValidation,updateValidation(y){f.current=y,d()}}},l,n);return{...h,inputProps:{...h.inputProps,"aria-describedby":[h.inputProps["aria-describedby"],e.isInvalid?u:null,i].filter(Boolean).join(" ")||void 0}}}const oo=s.createContext(null),Wc=s.createContext(null),Ug=s.createContext(null),Uc=s.createContext(null);function Gg(t,e){let{validationBehavior:n}=vn(to)||{},l=t.validationBehavior??n??"native",r=s.useContext(Ug),o=Te(s.useMemo(()=>pt(e,t.inputRef!==void 0?t.inputRef:null),[e,t.inputRef])),i={...Fr(t),children:typeof t.children=="function"?!0:t.children,value:t.value,validationBehavior:l};return[r?Wg(i,r,o):_c(i,Tg(t),o),o]}const H0=s.forwardRef(function(e,n){let{inputRef:l=null,...r}=e;[e,n]=ve(r,n,oo);let[o,i]=Gg(e,l);return x.createElement(Uc.Provider,{value:{...o,inputRef:i,defaultClassName:"react-aria-Checkbox",isIndeterminate:e.isIndeterminate,isRequired:e.isRequired}},x.createElement(qg,{...e,ref:n}))}),qg=s.forwardRef(function(e,n){let{labelProps:l,inputProps:r,isSelected:o,isDisabled:i,isReadOnly:u,isPressed:a,isInvalid:c,inputRef:f,defaultClassName:d,isIndeterminate:b,isRequired:p}=s.useContext(Uc),{isFocused:h,isFocusVisible:y,focusProps:m}=Ve(),g=i||u,{hoverProps:v,isHovered:E}=Fe({...e,isDisabled:g}),C=ae({...e,defaultClassName:d,values:{isSelected:o,isIndeterminate:b||!1,isPressed:a,isHovered:E,isFocused:h,isFocusVisible:y,isDisabled:i,isReadOnly:u,isInvalid:c,isRequired:p||!1}}),R=oe(e,{global:!0});return delete R.id,delete R.onClick,x.createElement(ee.label,{...W(R,l,v,C),ref:n,slot:e.slot||void 0,"data-selected":o||void 0,"data-indeterminate":b||void 0,"data-pressed":a||void 0,"data-hovered":E||void 0,"data-focused":h||void 0,"data-focus-visible":y||void 0,"data-disabled":i||void 0,"data-readonly":u||void 0,"data-invalid":c||void 0,"data-required":p||void 0},x.createElement(_r,{elementType:"span"},x.createElement("input",{...W(r,m),ref:f})),C.children)}),Gc=s.createContext({}),Wi=({children:t,className:e,color:n,size:l,variant:r,...o})=>{const i=x.useMemo(()=>mh({color:n,size:l,variant:r}),[n,l,r]),u=x.useMemo(()=>typeof t=="string"||typeof t=="number"?I.jsx(qc,{children:t}):t,[t]);return I.jsx(Gc,{value:{slots:i},children:I.jsx(De.span,{...o,className:fe(i.base,e),"data-slot":"chip",children:u})})},qc=({children:t,className:e,...n})=>{const{slots:l}=s.useContext(Gc);return I.jsx(De.span,{className:fe(l==null?void 0:l.label,e),"data-slot":"chip-label",...n,children:t})},W0=Object.assign(Wi,{Root:Wi,Label:qc});function io(t){let{onMoveStart:e,onMove:n,onMoveEnd:l}=t,r=s.useRef({didMove:!1,lastPosition:null,id:null}),{addGlobalListener:o,removeGlobalListener:i}=Et(),u=s.useCallback((b,p,h,y)=>{h===0&&y===0||(r.current.didMove||(r.current.didMove=!0,e==null||e({type:"movestart",pointerType:p,shiftKey:b.shiftKey,metaKey:b.metaKey,ctrlKey:b.ctrlKey,altKey:b.altKey})),n==null||n({type:"move",pointerType:p,deltaX:h,deltaY:y,shiftKey:b.shiftKey,metaKey:b.metaKey,ctrlKey:b.ctrlKey,altKey:b.altKey}))},[e,n,r]),a=we(u),c=s.useCallback((b,p)=>{nr(),r.current.didMove&&(l==null||l({type:"moveend",pointerType:p,shiftKey:b.shiftKey,metaKey:b.metaKey,ctrlKey:b.ctrlKey,altKey:b.altKey}))},[l,r]),f=we(c);return{moveProps:s.useMemo(()=>{let b={},p=()=>{na(),r.current.didMove=!1};{let y=g=>{var v,E;if(g.pointerId===r.current.id){let C=g.pointerType||"mouse";a(g,C,g.pageX-(((v=r.current.lastPosition)==null?void 0:v.pageX)??0),g.pageY-(((E=r.current.lastPosition)==null?void 0:E.pageY)??0)),r.current.lastPosition={pageX:g.pageX,pageY:g.pageY}}},m=g=>{if(g.pointerId===r.current.id){let v=g.pointerType||"mouse";f(g,v),r.current.id=null;let E=Se(U(g));i(E,"pointermove",y,!1),i(E,"pointerup",m,!1),i(E,"pointercancel",m,!1)}};b.onPointerDown=g=>{if(g.button===0&&r.current.id==null){p(),g.stopPropagation(),g.preventDefault(),r.current.lastPosition={pageX:g.pageX,pageY:g.pageY},r.current.id=g.pointerId;let v=Se(U(g));o(v,"pointermove",y,!1),o(v,"pointerup",m,!1),o(v,"pointercancel",m,!1)}}}let h=(y,m,g)=>{p(),a(y,"keyboard",m,g),f(y,"keyboard")};return b.onKeyDown=y=>{switch(y.key){case"Left":case"ArrowLeft":y.preventDefault(),y.stopPropagation(),h(y,-1,0);break;case"Right":case"ArrowRight":y.preventDefault(),y.stopPropagation(),h(y,1,0);break;case"Up":case"ArrowUp":y.preventDefault(),y.stopPropagation(),h(y,0,-1);break;case"Down":case"ArrowDown":y.preventDefault(),y.stopPropagation(),h(y,0,1);break}},b},[o,i,r])}}const xl=s.createContext({});let Zg=t=>{let{onHoverStart:e,onHoverChange:n,onHoverEnd:l,...r}=t;return r};const Yg=Cn(function(e,n){[e,n]=ve(e,n,xl);let{hoverProps:l,isHovered:r}=Fe({...e,isDisabled:e.disabled}),{isFocused:o,isFocusVisible:i,focusProps:u}=Ve({isTextInput:!0,autoFocus:e.autoFocus}),a=!!e["aria-invalid"]&&e["aria-invalid"]!=="false",c=ae({...e,values:{isHovered:r,isFocused:o,isFocusVisible:i,isDisabled:e.disabled||!1,isInvalid:a},defaultClassName:"react-aria-Input"});return x.createElement(ee.input,{...W(Zg(e),u,l),...c,ref:n,"data-focused":o||void 0,"data-disabled":e.disabled||void 0,"data-hovered":r||void 0,"data-focus-visible":i||void 0,"data-invalid":a||void 0})});function Zc(t,e){let{inputElementType:n="input",isDisabled:l=!1,isRequired:r=!1,isReadOnly:o=!1,type:i="text",validationBehavior:u="aria"}=t,[a,c]=Hc(t.value,t.defaultValue||"",t.onChange),{focusableProps:f}=wt(t,e),d=ro({...t,value:a}),{isInvalid:b,validationErrors:p,validationDetails:h}=d.displayValidation,{labelProps:y,fieldProps:m,descriptionProps:g,errorMessageProps:v}=xg({...t,isInvalid:b,errorMessage:t.errorMessage||p}),E=oe(t,{labelable:!0});const C={type:i,pattern:t.pattern};let[R]=s.useState(a);return il(e,t.defaultValue??R,c),Nc(t,d,e),{labelProps:y,inputProps:W(E,n==="input"?C:void 0,{disabled:l,readOnly:o,required:r&&u==="native","aria-required":r&&u==="aria"||void 0,"aria-invalid":b||void 0,"aria-errormessage":t["aria-errormessage"],"aria-activedescendant":t["aria-activedescendant"],"aria-autocomplete":t["aria-autocomplete"],"aria-haspopup":t["aria-haspopup"],"aria-controls":t["aria-controls"],value:a,onChange:T=>c(U(T).value),autoComplete:t.autoComplete,autoCapitalize:t.autoCapitalize,maxLength:t.maxLength,minLength:t.minLength,name:t.name,form:t.form,placeholder:t.placeholder,inputMode:t.inputMode,autoCorrect:t.autoCorrect,spellCheck:t.spellCheck,[parseInt(x.version,10)>=17?"enterKeyHint":"enterkeyhint"]:t.enterKeyHint,onCopy:t.onCopy,onCut:t.onCut,onPaste:t.onPaste,onCompositionEnd:t.onCompositionEnd,onCompositionStart:t.onCompositionStart,onCompositionUpdate:t.onCompositionUpdate,onSelect:t.onSelect,onBeforeInput:t.onBeforeInput,onInput:t.onInput,...f,...m}),descriptionProps:g,errorMessageProps:v,isInvalid:b,validationErrors:p,validationDetails:h}}const uo=new WeakMap;function $r(t,e){let n=uo.get(t);if(!n)throw new Error("Unknown slider state");return`${n.id}-${e}`}function Xg(t,e,n){let{labelProps:l,fieldProps:r}=al(t),o=t.orientation==="vertical";uo.set(e,{id:l.id??r.id,"aria-describedby":t["aria-describedby"],"aria-details":t["aria-details"]});let{direction:i}=Pe(),{addGlobalListener:u,removeGlobalListener:a}=Et();const c=s.useRef(null),f=i==="rtl",d=s.useRef(null),{moveProps:b}=io({onMoveStart(){d.current=null},onMove({deltaX:m,deltaY:g}){if(!n.current)return;let{height:v,width:E}=n.current.getBoundingClientRect(),C=o?v:E;d.current==null&&c.current!=null&&(d.current=e.getThumbPercent(c.current)*C);let R=o?g:m;if((o||f)&&(R=-R),d.current+=R,c.current!=null&&n.current){const T=fn(d.current/C,0,1);e.setThumbPercent(c.current,T)}},onMoveEnd(){c.current!=null&&(e.setThumbDragging(c.current,!1),c.current=null)}});let p=s.useRef(void 0),h=(m,g,v,E)=>{if(n.current&&!t.isDisabled&&e.values.every((C,R)=>!e.isThumbDragging(R))){let{height:C,width:R,top:T,left:F}=n.current.getBoundingClientRect(),B=o?C:R,H=((o?E:v)-(o?T:F))/B;(i==="rtl"||o)&&(H=1-H);let j=e.getPercentValue(H),$,D=e.values.findIndex(A=>j-A<0);if(D===0)$=D;else if(D===-1)$=e.values.length-1;else{let A=e.values[D-1],w=e.values[D];Math.abs(A-j)=0&&e.isThumbEditable($)?(m.preventDefault(),c.current=$,e.setFocusedThumb($),p.current=g,e.setThumbDragging(c.current,!0),e.setThumbValue($,j),u(window,"mouseup",y,!1),u(window,"touchend",y,!1),u(window,"pointerup",y,!1)):c.current=null}},y=m=>{var v;(m.pointerId??((v=m.changedTouches)==null?void 0:v[0].identifier))===p.current&&(c.current!=null&&(e.setThumbDragging(c.current,!1),c.current=null),a(window,"mouseup",y,!1),a(window,"touchend",y,!1),a(window,"pointerup",y,!1))};return"htmlFor"in l&&l.htmlFor&&(delete l.htmlFor,l.onClick=()=>{var m;(m=document.getElementById($r(e,0)))==null||m.focus(),ea("keyboard")}),{labelProps:l,groupProps:{role:"group",...r},trackProps:W({onMouseDown(m){m.button!==0||m.altKey||m.ctrlKey||m.metaKey||h(m,void 0,m.clientX,m.clientY)},onPointerDown(m){m.pointerType==="mouse"&&(m.button!==0||m.altKey||m.ctrlKey||m.metaKey)||h(m,m.pointerId,m.clientX,m.clientY)},onTouchStart(m){h(m,m.changedTouches[0].identifier,m.changedTouches[0].clientX,m.changedTouches[0].clientY)},style:{position:"relative",touchAction:"none"}},b),outputProps:{htmlFor:e.values.map((m,g)=>$r(e,g)).join(" "),"aria-live":"off"}}}function Jg(t,e){let{index:n=0,isRequired:l,validationState:r,isInvalid:o,trackRef:i,inputRef:u,orientation:a=e.orientation,name:c,form:f}=t,d=t.isDisabled||e.isDisabled,b=a==="vertical",{direction:p}=Pe(),{addGlobalListener:h,removeGlobalListener:y}=Et(),m=uo.get(e);const{labelProps:g,fieldProps:v}=al({...t,id:$r(e,n),"aria-labelledby":`${m.id} ${t["aria-labelledby"]??""}`.trim()}),E=e.values[n],C=s.useCallback(()=>{u.current&&Ne(u.current)},[u]),R=e.focusedThumb===n;s.useEffect(()=>{R&&C()},[R,C]);let T=p==="rtl",F=s.useRef(null),{keyboardProps:B}=cl({onKeyDown(A){let{getThumbMaxValue:w,getThumbMinValue:P,decrementThumb:k,incrementThumb:K,setThumbValue:_,setThumbDragging:Z,pageSize:S}=e;if(!/^(PageUp|PageDown|Home|End)$/.test(A.key)){A.continuePropagation();return}switch(A.preventDefault(),Z(n,!0),A.key){case"PageUp":K(n,S);break;case"PageDown":k(n,S);break;case"Home":_(n,P(n));break;case"End":_(n,w(n));break}Z(n,!1)}}),{moveProps:L}=io({onMoveStart(){F.current=null,e.setThumbDragging(n,!0)},onMove({deltaX:A,deltaY:w,pointerType:P,shiftKey:k}){const{getThumbPercent:K,setThumbPercent:_,decrementThumb:Z,incrementThumb:S,step:N,pageSize:O}=e;if(!i.current)return;let{width:X,height:J}=i.current.getBoundingClientRect(),de=b?J:X;if(F.current==null&&(F.current=K(n)*de),P==="keyboard")A>0&&T||A<0&&!T||w>0?Z(n,k?O:N):S(n,k?O:N);else{let Ce=b?w:A;(b||T)&&(Ce=-Ce),F.current+=Ce,_(n,fn(F.current/de,0,1))}},onMoveEnd(){e.setThumbDragging(n,!1)}});e.setThumbEditable(n,!d);const{focusableProps:M}=wt(W(t,{onFocus:()=>e.setFocusedThumb(n),onBlur:()=>e.setFocusedThumb(void 0)}),u);let V=s.useRef(void 0),H=A=>{C(),V.current=A,e.setThumbDragging(n,!0),h(window,"mouseup",j,!1),h(window,"touchend",j,!1),h(window,"pointerup",j,!1)},j=A=>{var P;(A.pointerId??((P=A.changedTouches)==null?void 0:P[0].identifier))===V.current&&(C(),e.setThumbDragging(n,!1),y(window,"mouseup",j,!1),y(window,"touchend",j,!1),y(window,"pointerup",j,!1))},$=e.getThumbPercent(n);(b||p==="rtl")&&($=1-$);let D=d?{}:W(B,L,{onMouseDown:A=>{A.button!==0||A.altKey||A.ctrlKey||A.metaKey||H()},onPointerDown:A=>{A.button!==0||A.altKey||A.ctrlKey||A.metaKey||H(A.pointerId)},onTouchStart:A=>{H(A.changedTouches[0].identifier)}});return il(u,e.defaultValues[n],A=>{e.setThumbValue(n,A)}),{inputProps:W(M,v,{type:"range",tabIndex:d?void 0:0,min:e.getThumbMinValue(n),max:e.getThumbMaxValue(n),step:e.step,value:E,name:c,form:f,disabled:d,"aria-orientation":a,"aria-valuetext":e.getThumbValueLabel(n),"aria-required":l||void 0,"aria-invalid":o||r==="invalid"||void 0,"aria-errormessage":t["aria-errormessage"],"aria-describedby":[m["aria-describedby"],t["aria-describedby"]].filter(Boolean).join(" "),"aria-details":[m["aria-details"],t["aria-details"]].filter(Boolean).join(" "),onChange:A=>{e.setThumbValue(n,parseFloat(U(A).value))}}),thumbProps:{...D,style:{position:"absolute",[b?"top":"left"]:`${$*100}%`,transform:"translate(-50%, -50%)",touchAction:"none"}},labelProps:g,isDragging:e.isThumbDragging(n),isDisabled:d,isFocused:R}}const Qg=0,e3=100,t3=1;function n3(t){const{isDisabled:e=!1,minValue:n=Qg,maxValue:l=e3,numberFormatter:r,step:o=t3,orientation:i="horizontal"}=t;let u=s.useMemo(()=>{let S=(l-n)/10;return S=Zt(S,0,S+o,o),Math.max(S,o)},[o,l,n]),a=s.useCallback(S=>S==null?void 0:S.map((N,O)=>{let X=O===0?n:S[O-1],J=O===S.length-1?l:S[O+1];return Zt(N,X,J,o)}),[n,l,o]),c=s.useMemo(()=>a(Gi(t.value)),[t.value,a]),f=s.useMemo(()=>a(Gi(t.defaultValue)??[n]),[t.defaultValue,n,a]),d=qi(t.value,t.defaultValue,t.onChange),b=qi(t.value,t.defaultValue,t.onChangeEnd);const[p,h]=ct(c,f,d);let[y]=s.useState(p);const[m,g]=s.useState(new Array(p.length).fill(!1)),v=s.useRef(new Array(p.length).fill(!0)),[E,C]=s.useState(void 0),R=s.useRef(p),T=s.useRef(m);let F=S=>{R.current=S,h(S)},B=S=>{T.current=S,g(S)};function L(S){return(S-n)/(l-n)}function M(S){return S===0?n:p[S-1]}function V(S){return S===p.length-1?l:p[S+1]}function H(S){return v.current[S]}function j(S,N){v.current[S]=N}function $(S,N){if(e||!H(S))return;const O=M(S),X=V(S);N=Zt(N,O,X,o);let J=Ui(R.current,S,N);F(J)}function D(S,N){if(e||!H(S))return;N&&(R.current=p);const O=T.current[S];T.current=Ui(T.current,S,N),B(T.current),b&&O&&!T.current.some(Boolean)&&b(R.current)}let A=s.useRef(null);function w(S=p){switch(typeof S=="number"&&(S=[S]),S.length){case 0:return"";case 1:return r.format(S[0]);case 2:return r.formatRange(S[0],S[1]);default:{let N=S.map(X=>r.format(X)),O=A.current;return(!O||O.resolvedOptions().locale!==r.resolvedOptions().locale)&&(O=A.current=new Intl.ListFormat(r.resolvedOptions().locale,{type:"unit"})),O.format(N)}}}function P(S,N){$(S,K(N))}function k(S){return Math.round((S-n)/o)*o+n}function K(S){const N=S*(l-n)+n;return _h(k(N),n,l)}function _(S,N=1){let O=Math.max(N,o);$(S,Zt(p[S]+O,n,l,o))}function Z(S,N=1){let O=Math.max(N,o);$(S,Zt(p[S]-O,n,l,o))}return{values:p,defaultValues:t.defaultValue!==void 0?f:y,getThumbValue:S=>p[S],setThumbValue:$,setThumbPercent:P,isThumbDragging:S=>m[S],setThumbDragging:D,focusedThumb:E,setFocusedThumb:C,getThumbPercent:S=>L(p[S]),getValuePercent:L,getThumbValueLabel:S=>w(p[S]),getFormattedValue:w,getThumbMinValue:M,getThumbMaxValue:V,getPercentValue:K,isThumbEditable:H,setThumbEditable:j,incrementThumb:_,decrementThumb:Z,step:o,pageSize:u,orientation:i,isDisabled:e}}function Ui(t,e,n){return t[e]===n?t:[...t.slice(0,e),n,...t.slice(e+1)]}function Gi(t){if(t!=null)return Array.isArray(t)?t:[t]}function qi(t,e,n){return l=>{typeof t=="number"||typeof e=="number"?n==null||n(l[0]):n==null||n(l)}}const l3=s.createContext(null),ao=s.createContext(null),so=s.createContext(null),r3=s.createContext(null),U0=s.forwardRef(function(e,n){[e,n]=ve(e,n,l3);let l=s.useRef(null),r=jh(e.formatOptions),o=n3({...e,numberFormatter:r}),[i,u]=xn(!e["aria-label"]&&!e["aria-labelledby"]),{groupProps:a,trackProps:c,labelProps:f,outputProps:d}=Xg({...e,label:u},o,l),b=ae({...e,values:{orientation:o.orientation,isDisabled:o.isDisabled,state:o},defaultClassName:"react-aria-Slider"}),p=oe(e,{global:!0});return delete p.id,x.createElement(Me,{values:[[ao,o],[so,{...c,ref:l}],[r3,d],[Ht,{...f,ref:i}]]},x.createElement(ee.div,{...W(p,b,a),ref:n,slot:e.slot||void 0,"data-orientation":o.orientation,"data-disabled":o.isDisabled||void 0}))}),G0=s.forwardRef(function(e,n){[e,n]=ve(e,n,so);let l=s.useContext(ao),{onHoverStart:r,onHoverEnd:o,onHoverChange:i,...u}=e,{hoverProps:a,isHovered:c}=Fe({onHoverStart:r,onHoverEnd:o,onHoverChange:i}),f=ae({...e,defaultClassName:"react-aria-SliderTrack",values:{orientation:l.orientation,isDisabled:l.isDisabled,isHovered:c,state:l}});return x.createElement(ee.div,{...W(u,a),...f,ref:n,"data-hovered":c||void 0,"data-orientation":l.orientation||void 0,"data-disabled":l.isDisabled||void 0})}),q0=s.forwardRef(function(e,n){let{inputRef:l=null}=e,r=s.useContext(ao),{ref:o}=vn(so),{index:i=0}=e,u=s.useRef(null),a=l||u,[c,f]=xn(!e["aria-label"]&&!e["aria-labelledby"]),{thumbProps:d,inputProps:b,labelProps:p,isDragging:h,isFocused:y,isDisabled:m}=Jg({...e,index:i,trackRef:o,inputRef:a,label:f},r),{focusProps:g,isFocusVisible:v}=Ve(),{hoverProps:E,isHovered:C}=Fe(e),R=ae({...e,defaultClassName:"react-aria-SliderThumb",values:{state:r,isHovered:C,isDragging:h,isFocused:y,isFocusVisible:v,isDisabled:m}}),T=oe(e,{global:!0});return delete T.id,x.createElement(ee.div,{...W(T,d,E),...R,ref:n,style:{...d.style,...R.style},"data-hovered":C||void 0,"data-dragging":h||void 0,"data-focused":y||void 0,"data-focus-visible":v||void 0,"data-disabled":m||void 0},x.createElement(_r,null,x.createElement("input",{ref:a,...W(b,g)})),x.createElement(Me,{values:[[Ht,{...p,ref:c}]]},R.children))});var Yc={};Yc={buttonLabel:"عرض المقترحات",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} خيار`,other:()=>`${e.number(t.optionCount)} خيارات`})} متاحة.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`المجموعة المدخلة ${t.groupTitle}, مع ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} خيار`,other:()=>`${e.number(t.groupCount)} خيارات`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", محدد",other:""},t.isSelected)}`,listboxLabel:"مقترحات",selectedAnnouncement:t=>`${t.optionText}، محدد`};var Xc={};Xc={buttonLabel:"Покажи предложения",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} опция`,other:()=>`${e.number(t.optionCount)} опции`})} на разположение.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Въведена група ${t.groupTitle}, с ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} опция`,other:()=>`${e.number(t.groupCount)} опции`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", избрани",other:""},t.isSelected)}`,listboxLabel:"Предложения",selectedAnnouncement:t=>`${t.optionText}, избрани`};var Jc={};Jc={buttonLabel:"Zobrazit doporučení",countAnnouncement:(t,e)=>`K dispozici ${e.plural(t.optionCount,{one:()=>`je ${e.number(t.optionCount)} možnost`,other:()=>`jsou/je ${e.number(t.optionCount)} možnosti/-í`})}.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Zadaná skupina „${t.groupTitle}“ ${e.plural(t.groupCount,{one:()=>`s ${e.number(t.groupCount)} možností`,other:()=>`se ${e.number(t.groupCount)} možnostmi`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:" (vybráno)",other:""},t.isSelected)}`,listboxLabel:"Návrhy",selectedAnnouncement:t=>`${t.optionText}, vybráno`};var Qc={};Qc={buttonLabel:"Vis forslag",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} mulighed tilgængelig`,other:()=>`${e.number(t.optionCount)} muligheder tilgængelige`})}.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Angivet gruppe ${t.groupTitle}, med ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} mulighed`,other:()=>`${e.number(t.groupCount)} muligheder`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", valgt",other:""},t.isSelected)}`,listboxLabel:"Forslag",selectedAnnouncement:t=>`${t.optionText}, valgt`};var ed={};ed={buttonLabel:"Empfehlungen anzeigen",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} Option`,other:()=>`${e.number(t.optionCount)} Optionen`})} verfügbar.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Eingetretene Gruppe ${t.groupTitle}, mit ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} Option`,other:()=>`${e.number(t.groupCount)} Optionen`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", ausgewählt",other:""},t.isSelected)}`,listboxLabel:"Empfehlungen",selectedAnnouncement:t=>`${t.optionText}, ausgewählt`};var td={};td={buttonLabel:"Προβολή προτάσεων",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} επιλογή`,other:()=>`${e.number(t.optionCount)} επιλογές `})} διαθέσιμες.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Εισαγμένη ομάδα ${t.groupTitle}, με ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} επιλογή`,other:()=>`${e.number(t.groupCount)} επιλογές`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", επιλεγμένο",other:""},t.isSelected)}`,listboxLabel:"Προτάσεις",selectedAnnouncement:t=>`${t.optionText}, επιλέχθηκε`};var nd={};nd={focusAnnouncement:(t,e)=>`${e.select({true:()=>`Entered group ${t.groupTitle}, with ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} option`,other:()=>`${e.number(t.groupCount)} options`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", selected",other:""},t.isSelected)}`,countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} option`,other:()=>`${e.number(t.optionCount)} options`})} available.`,selectedAnnouncement:t=>`${t.optionText}, selected`,buttonLabel:"Show suggestions",listboxLabel:"Suggestions"};var ld={};ld={buttonLabel:"Mostrar sugerencias",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} opción`,other:()=>`${e.number(t.optionCount)} opciones`})} disponible(s).`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Se ha unido al grupo ${t.groupTitle}, con ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} opción`,other:()=>`${e.number(t.groupCount)} opciones`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", seleccionado",other:""},t.isSelected)}`,listboxLabel:"Sugerencias",selectedAnnouncement:t=>`${t.optionText}, seleccionado`};var rd={};rd={buttonLabel:"Kuva soovitused",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} valik`,other:()=>`${e.number(t.optionCount)} valikud`})} saadaval.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Sisestatud rühm ${t.groupTitle}, valikuga ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} valik`,other:()=>`${e.number(t.groupCount)} valikud`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", valitud",other:""},t.isSelected)}`,listboxLabel:"Soovitused",selectedAnnouncement:t=>`${t.optionText}, valitud`};var od={};od={buttonLabel:"Näytä ehdotukset",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} vaihtoehto`,other:()=>`${e.number(t.optionCount)} vaihtoehdot`})} saatavilla.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Mentiin ryhmään ${t.groupTitle}, ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} vaihtoehdon`,other:()=>`${e.number(t.groupCount)} vaihtoehdon`})} kanssa.`,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", valittu",other:""},t.isSelected)}`,listboxLabel:"Ehdotukset",selectedAnnouncement:t=>`${t.optionText}, valittu`};var id={};id={buttonLabel:"Afficher les suggestions",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} option`,other:()=>`${e.number(t.optionCount)} options`})} disponible(s).`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Groupe ${t.groupTitle} rejoint, avec ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} option`,other:()=>`${e.number(t.groupCount)} options`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", sélectionné(s)",other:""},t.isSelected)}`,listboxLabel:"Suggestions",selectedAnnouncement:t=>`${t.optionText}, sélectionné`};var ud={};ud={buttonLabel:"הצג הצעות",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`אפשרות ${e.number(t.optionCount)}`,other:()=>`${e.number(t.optionCount)} אפשרויות`})} במצב זמין.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`נכנס לקבוצה ${t.groupTitle}, עם ${e.plural(t.groupCount,{one:()=>`אפשרות ${e.number(t.groupCount)}`,other:()=>`${e.number(t.groupCount)} אפשרויות`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", נבחר",other:""},t.isSelected)}`,listboxLabel:"הצעות",selectedAnnouncement:t=>`${t.optionText}, נבחר`};var ad={};ad={buttonLabel:"Prikaži prijedloge",countAnnouncement:(t,e)=>`Dostupno još: ${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} opcija`,other:()=>`${e.number(t.optionCount)} opcije/a`})}.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Unesena skupina ${t.groupTitle}, s ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} opcijom`,other:()=>`${e.number(t.groupCount)} opcije/a`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", odabranih",other:""},t.isSelected)}`,listboxLabel:"Prijedlozi",selectedAnnouncement:t=>`${t.optionText}, odabrano`};var sd={};sd={buttonLabel:"Javaslatok megjelenítése",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} lehetőség`,other:()=>`${e.number(t.optionCount)} lehetőség`})} áll rendelkezésre.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Belépett a(z) ${t.groupTitle} csoportba, amely ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} lehetőséget`,other:()=>`${e.number(t.groupCount)} lehetőséget`})} tartalmaz. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", kijelölve",other:""},t.isSelected)}`,listboxLabel:"Javaslatok",selectedAnnouncement:t=>`${t.optionText}, kijelölve`};var cd={};cd={buttonLabel:"Mostra suggerimenti",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} opzione disponibile`,other:()=>`${e.number(t.optionCount)} opzioni disponibili`})}.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Ingresso nel gruppo ${t.groupTitle}, con ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} opzione`,other:()=>`${e.number(t.groupCount)} opzioni`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", selezionato",other:""},t.isSelected)}`,listboxLabel:"Suggerimenti",selectedAnnouncement:t=>`${t.optionText}, selezionato`};var dd={};dd={buttonLabel:"候補を表示",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} 個のオプション`,other:()=>`${e.number(t.optionCount)} 個のオプション`})}を利用できます。`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`入力されたグループ ${t.groupTitle}、${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} 個のオプション`,other:()=>`${e.number(t.groupCount)} 個のオプション`})}を含む。`,other:""},t.isGroupChange)}${t.optionText}${e.select({true:"、選択済み",other:""},t.isSelected)}`,listboxLabel:"候補",selectedAnnouncement:t=>`${t.optionText}、選択済み`};var fd={};fd={buttonLabel:"제안 사항 표시",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)}개 옵션`,other:()=>`${e.number(t.optionCount)}개 옵션`})}을 사용할 수 있습니다.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`입력한 그룹 ${t.groupTitle}, ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)}개 옵션`,other:()=>`${e.number(t.groupCount)}개 옵션`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", 선택됨",other:""},t.isSelected)}`,listboxLabel:"제안",selectedAnnouncement:t=>`${t.optionText}, 선택됨`};var pd={};pd={buttonLabel:"Rodyti pasiūlymus",countAnnouncement:(t,e)=>`Yra ${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} parinktis`,other:()=>`${e.number(t.optionCount)} parinktys (-ių)`})}.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Įvesta grupė ${t.groupTitle}, su ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} parinktimi`,other:()=>`${e.number(t.groupCount)} parinktimis (-ių)`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", pasirinkta",other:""},t.isSelected)}`,listboxLabel:"Pasiūlymai",selectedAnnouncement:t=>`${t.optionText}, pasirinkta`};var bd={};bd={buttonLabel:"Rādīt ieteikumus",countAnnouncement:(t,e)=>`Pieejamo opciju skaits: ${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} opcija`,other:()=>`${e.number(t.optionCount)} opcijas`})}.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Ievadīta grupa ${t.groupTitle}, ar ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} opciju`,other:()=>`${e.number(t.groupCount)} opcijām`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", atlasīta",other:""},t.isSelected)}`,listboxLabel:"Ieteikumi",selectedAnnouncement:t=>`${t.optionText}, atlasīta`};var hd={};hd={buttonLabel:"Vis forslag",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} alternativ`,other:()=>`${e.number(t.optionCount)} alternativer`})} finnes.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Angitt gruppe ${t.groupTitle}, med ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} alternativ`,other:()=>`${e.number(t.groupCount)} alternativer`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", valgt",other:""},t.isSelected)}`,listboxLabel:"Forslag",selectedAnnouncement:t=>`${t.optionText}, valgt`};var md={};md={buttonLabel:"Suggesties weergeven",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} optie`,other:()=>`${e.number(t.optionCount)} opties`})} beschikbaar.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Groep ${t.groupTitle} ingevoerd met ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} optie`,other:()=>`${e.number(t.groupCount)} opties`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", geselecteerd",other:""},t.isSelected)}`,listboxLabel:"Suggesties",selectedAnnouncement:t=>`${t.optionText}, geselecteerd`};var gd={};gd={buttonLabel:"Wyświetlaj sugestie",countAnnouncement:(t,e)=>`dostępna/dostępne(-nych) ${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} opcja`,other:()=>`${e.number(t.optionCount)} opcje(-i)`})}.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Dołączono do grupy ${t.groupTitle}, z ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} opcją`,other:()=>`${e.number(t.groupCount)} opcjami`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", wybrano",other:""},t.isSelected)}`,listboxLabel:"Sugestie",selectedAnnouncement:t=>`${t.optionText}, wybrano`};var yd={};yd={buttonLabel:"Mostrar sugestões",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} opção`,other:()=>`${e.number(t.optionCount)} opções`})} disponível.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Grupo inserido ${t.groupTitle}, com ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} opção`,other:()=>`${e.number(t.groupCount)} opções`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", selecionado",other:""},t.isSelected)}`,listboxLabel:"Sugestões",selectedAnnouncement:t=>`${t.optionText}, selecionado`};var $d={};$d={buttonLabel:"Apresentar sugestões",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} opção`,other:()=>`${e.number(t.optionCount)} opções`})} disponível.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Grupo introduzido ${t.groupTitle}, com ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} opção`,other:()=>`${e.number(t.groupCount)} opções`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", selecionado",other:""},t.isSelected)}`,listboxLabel:"Sugestões",selectedAnnouncement:t=>`${t.optionText}, selecionado`};var vd={};vd={buttonLabel:"Afișare sugestii",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} opțiune`,other:()=>`${e.number(t.optionCount)} opțiuni`})} disponibile.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Grup ${t.groupTitle} introdus, cu ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} opțiune`,other:()=>`${e.number(t.groupCount)} opțiuni`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", selectat",other:""},t.isSelected)}`,listboxLabel:"Sugestii",selectedAnnouncement:t=>`${t.optionText}, selectat`};var xd={};xd={buttonLabel:"Показать предложения",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} параметр`,other:()=>`${e.number(t.optionCount)} параметров`})} доступно.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Введенная группа ${t.groupTitle}, с ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} параметром`,other:()=>`${e.number(t.groupCount)} параметрами`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", выбранными",other:""},t.isSelected)}`,listboxLabel:"Предложения",selectedAnnouncement:t=>`${t.optionText}, выбрано`};var Cd={};Cd={buttonLabel:"Zobraziť návrhy",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} možnosť`,other:()=>`${e.number(t.optionCount)} možnosti/-í`})} k dispozícii.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Zadaná skupina ${t.groupTitle}, s ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} možnosťou`,other:()=>`${e.number(t.groupCount)} možnosťami`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", vybraté",other:""},t.isSelected)}`,listboxLabel:"Návrhy",selectedAnnouncement:t=>`${t.optionText}, vybraté`};var Ed={};Ed={buttonLabel:"Prikaži predloge",countAnnouncement:(t,e)=>`Na voljo je ${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} opcija`,other:()=>`${e.number(t.optionCount)} opcije`})}.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Vnesena skupina ${t.groupTitle}, z ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} opcija`,other:()=>`${e.number(t.groupCount)} opcije`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", izbrano",other:""},t.isSelected)}`,listboxLabel:"Predlogi",selectedAnnouncement:t=>`${t.optionText}, izbrano`};var wd={};wd={buttonLabel:"Prikaži predloge",countAnnouncement:(t,e)=>`Dostupno još: ${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} opcija`,other:()=>`${e.number(t.optionCount)} opcije/a`})}.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Unesena grupa ${t.groupTitle}, s ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} opcijom`,other:()=>`${e.number(t.groupCount)} optione/a`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", izabranih",other:""},t.isSelected)}`,listboxLabel:"Predlozi",selectedAnnouncement:t=>`${t.optionText}, izabrano`};var Sd={};Sd={buttonLabel:"Visa förslag",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} alternativ`,other:()=>`${e.number(t.optionCount)} alternativ`})} tillgängliga.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Ingick i gruppen ${t.groupTitle} med ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} alternativ`,other:()=>`${e.number(t.groupCount)} alternativ`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", valda",other:""},t.isSelected)}`,listboxLabel:"Förslag",selectedAnnouncement:t=>`${t.optionText}, valda`};var Dd={};Dd={buttonLabel:"Önerileri göster",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} seçenek`,other:()=>`${e.number(t.optionCount)} seçenekler`})} kullanılabilir.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Girilen grup ${t.groupTitle}, ile ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} seçenek`,other:()=>`${e.number(t.groupCount)} seçenekler`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", seçildi",other:""},t.isSelected)}`,listboxLabel:"Öneriler",selectedAnnouncement:t=>`${t.optionText}, seçildi`};var kd={};kd={buttonLabel:"Показати пропозиції",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} параметр`,other:()=>`${e.number(t.optionCount)} параметри(-ів)`})} доступно.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Введена група ${t.groupTitle}, з ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} параметр`,other:()=>`${e.number(t.groupCount)} параметри(-ів)`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", вибрано",other:""},t.isSelected)}`,listboxLabel:"Пропозиції",selectedAnnouncement:t=>`${t.optionText}, вибрано`};var Pd={};Pd={buttonLabel:"显示建议",countAnnouncement:(t,e)=>`有 ${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} 个选项`,other:()=>`${e.number(t.optionCount)} 个选项`})}可用。`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`进入了 ${t.groupTitle} 组,其中有 ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} 个选项`,other:()=>`${e.number(t.groupCount)} 个选项`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", 已选择",other:""},t.isSelected)}`,listboxLabel:"建议",selectedAnnouncement:t=>`${t.optionText}, 已选择`};var Td={};Td={buttonLabel:"顯示建議",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} 選項`,other:()=>`${e.number(t.optionCount)} 選項`})} 可用。`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`輸入的群組 ${t.groupTitle}, 有 ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} 選項`,other:()=>`${e.number(t.groupCount)} 選項`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", 已選取",other:""},t.isSelected)}`,listboxLabel:"建議",selectedAnnouncement:t=>`${t.optionText}, 已選取`};var Ad={};Ad={"ar-AE":Yc,"bg-BG":Xc,"cs-CZ":Jc,"da-DK":Qc,"de-DE":ed,"el-GR":td,"en-US":nd,"es-ES":ld,"et-EE":rd,"fi-FI":od,"fr-FR":id,"he-IL":ud,"hr-HR":ad,"hu-HU":sd,"it-IT":cd,"ja-JP":dd,"ko-KR":fd,"lt-LT":pd,"lv-LV":bd,"nb-NO":hd,"nl-NL":md,"pl-PL":gd,"pt-BR":yd,"pt-PT":$d,"ro-RO":vd,"ru-RU":xd,"sk-SK":Cd,"sl-SI":Ed,"sr-SP":wd,"sv-SE":Sd,"tr-TR":Dd,"uk-UA":kd,"zh-CN":Pd,"zh-TW":Td};function o3(t){return t&&t.__esModule?t.default:t}function i3(t,e){let{buttonRef:n,popoverRef:l,inputRef:r,listBoxRef:o,keyboardDelegate:i,layoutDelegate:u,shouldFocusWrap:a,isReadOnly:c,isDisabled:f}=t,d=s.useRef(null);n=n??d;let b=_e(o3(Ad),"@react-aria/combobox"),{menuTriggerProps:p,menuProps:h}=w4({type:"listbox",isDisabled:f||c},e,n);$l.set(e,{id:h.id});let{collection:y}=e,{disabledKeys:m}=e.selectionManager,g=s.useMemo(()=>i||new gl({collection:y,disabledKeys:m,ref:o,layoutDelegate:u}),[i,u,y,m,o]),{collectionProps:v}=Zr({selectionManager:e.selectionManager,keyboardDelegate:g,disallowTypeAhead:!0,disallowEmptySelection:!0,shouldFocusWrap:a,ref:r,isVirtualized:!0}),E=Ot(),C=z=>{if(!z.nativeEvent.isComposing)switch(z.key){case"Enter":case"Tab":if(e.isOpen&&z.key==="Enter"&&z.preventDefault(),e.isOpen&&o.current&&e.selectionManager.focusedKey!=null){let Y=e.collection.getItem(e.selectionManager.focusedKey);if(Y!=null&&Y.props.href){let ue=o.current.querySelector(`[data-key="${CSS.escape(e.selectionManager.focusedKey.toString())}"]`);z.key==="Enter"&&ue instanceof HTMLAnchorElement&&E.open(ue,z,Y.props.href,Y.props.routerOptions),e.close();break}else if(Y!=null&&Y.props.onAction){Y.props.onAction(),e.close();break}}(z.key==="Enter"||e.isOpen)&&e.commit();break;case"Escape":(!e.selectionManager.isEmpty||e.inputValue===""||t.allowsCustomValue)&&z.continuePropagation(),e.revert();break;case"ArrowDown":e.open("first","manual");break;case"ArrowUp":e.open("last","manual");break;case"ArrowLeft":case"ArrowRight":e.selectionManager.setFocusedKey(null);break}},R=z=>{let Y=(n==null?void 0:n.current)&&n.current===z.relatedTarget,ue=ne(l.current,z.relatedTarget);Y||ue||(t.onBlur&&t.onBlur(z),e.setFocused(!1))},T=z=>{e.isFocused||(t.onFocus&&t.onFocus(z),e.setFocused(!0))},F=u3([e.selectionManager.selectedKeys,e.selectionManager.selectionMode]),{isInvalid:B,validationErrors:L,validationDetails:M}=e.displayValidation,{labelProps:V,inputProps:H,descriptionProps:j,errorMessageProps:$}=Zc({...t,isRequired:t.selectionMode==="multiple"?t.isRequired&&e.selectionManager.isEmpty:t.isRequired,onChange:e.setInputValue,onKeyDown:c?t.onKeyDown:ft(e.isOpen&&v.onKeyDown,C,t.onKeyDown),onBlur:R,value:e.inputValue,defaultValue:e.defaultInputValue,onFocus:T,autoComplete:"off",validate:void 0,[yn]:e,"aria-describedby":[F,t["aria-describedby"]].filter(Boolean).join(" ")||void 0},r);il(r,e.defaultValue,e.setValue);let D=z=>{var Y;z.pointerType==="touch"&&((Y=r.current)==null||Y.focus(),e.toggle(null,"manual"))},A=z=>{var Y;z.pointerType!=="touch"&&((Y=r.current)==null||Y.focus(),e.toggle(z.pointerType==="keyboard"||z.pointerType==="virtual"?"first":null,"manual"))},w=cn({id:p.id,"aria-label":b.format("buttonLabel"),"aria-labelledby":t["aria-labelledby"]||V.id}),P=cn({id:h.id,"aria-label":b.format("listboxLabel"),"aria-labelledby":t["aria-labelledby"]||V.id}),k=s.useRef(0),K=z=>{var Dt,An;if(f||c)return;if(z.timeStamp-k.current<500){z.preventDefault(),(Dt=r.current)==null||Dt.focus();return}let Y=U(z).getBoundingClientRect(),ue=z.changedTouches[0],Re=Math.ceil(Y.left+.5*Y.width),El=Math.ceil(Y.top+.5*Y.height);ue.clientX===Re&&ue.clientY===El&&(z.preventDefault(),(An=r.current)==null||An.focus(),e.toggle(null,"manual"),k.current=z.timeStamp)},_=e.selectionManager.focusedKey!=null&&e.isOpen?e.collection.getItem(e.selectionManager.focusedKey):void 0,Z=(_==null?void 0:_.parentKey)??null,S=e.selectionManager.focusedKey??null,N=s.useRef(Z),O=s.useRef(S);s.useEffect(()=>{if(jn()&&_!=null&&S!=null&&S!==O.current){let z=e.selectionManager.isSelected(S),Y=Z!=null?e.collection.getItem(Z):null,ue=(Y==null?void 0:Y["aria-label"])||(typeof(Y==null?void 0:Y.rendered)=="string"?Y.rendered:"")||"",Re=b.format("focusAnnouncement",{isGroupChange:(Y&&Z!==N.current)??!1,groupTitle:ue,groupCount:Y?[...Ee(Y,e.collection)].length:0,optionText:_["aria-label"]||_.textValue||"",isSelected:z});yt(Re)}N.current=Z,O.current=S});let X=Hs(e.collection),J=s.useRef(X),de=s.useRef(e.isOpen);s.useEffect(()=>{let z=e.isOpen!==de.current&&(e.selectionManager.focusedKey==null||jn());if(e.isOpen&&(z||X!==J.current)){let Y=b.format("countAnnouncement",{optionCount:X});yt(Y)}J.current=X,de.current=e.isOpen});let Ce=s.useRef(e.selectedKey);return s.useEffect(()=>{if(jn()&&e.isFocused&&e.selectedItem&&e.selectedKey!==Ce.current){let z=e.selectedItem["aria-label"]||e.selectedItem.textValue||"",Y=b.format("selectedAnnouncement",{optionText:z});yt(Y)}Ce.current=e.selectedKey}),s.useEffect(()=>{if(e.isOpen)return Vr([r.current,l.current].filter(z=>z!=null))},[e.isOpen,r,l]),Tr(()=>{!_&&r.current&&ie(re(r.current))===r.current&&qr(r.current,null)},[_]),Qt(o,"react-aria-item-action",e.isOpen?()=>{e.close()}:void 0),{labelProps:V,buttonProps:{...p,...w,excludeFromTabOrder:!0,preventFocusOnPress:!0,onPress:D,onPressStart:A,isDisabled:f||c},inputProps:W(H,{role:"combobox","aria-expanded":p["aria-expanded"],"aria-controls":e.isOpen?h.id:void 0,"aria-autocomplete":"list","aria-activedescendant":_?Mc(e,_.key):void 0,onTouchEnd:K,autoCorrect:"off",spellCheck:"false"}),listBoxProps:W(h,P,{autoFocus:e.focusStrategy||!0,shouldUseVirtualFocus:!0,shouldSelectOnPressUp:!0,shouldFocusOnHover:!0,linkBehavior:"selection",UNSTABLE_itemBehavior:"action"}),valueProps:{id:F},descriptionProps:j,errorMessageProps:$,isInvalid:B,validationErrors:L,validationDetails:M}}function u3(t=[]){let e=$e(),[n,l]=s.useState(!0),[r,o]=s.useState(t);return r.some((i,u)=>!Object.is(i,t[u]))&&(l(!0),o(t)),s.useEffect(()=>{n&&!document.getElementById(e)&&l(!1)},[e,n,r]),n?e:void 0}function a3(t){var To;let{defaultFilter:e,menuTrigger:n="input",allowsEmptyCollection:l=!1,allowsCustomValue:r,shouldCloseOnBlur:o=!0,selectionMode:i="single"}=t,[u,a]=s.useState(!1),[c,f]=s.useState(!1),[d,b]=s.useState(null),p=s.useMemo(()=>t.defaultValue!==void 0?t.defaultValue:i==="single"?t.defaultSelectedKey??null:[],[t.defaultValue,t.defaultSelectedKey,i]),h=s.useMemo(()=>t.value!==void 0?t.value:i==="single"?t.selectedKey:void 0,[t.value,t.selectedKey,i]),[y,m]=ct(h,p,t.onChange),g=i==="single"&&Array.isArray(y)?y[0]:y,v=Q=>{var ce;if(i==="single"){let he=Array.isArray(Q)?Q[0]??null:Q;m(he),he!==g&&((ce=t.onSelectionChange)==null||ce.call(t,he))}else{let he=[];Array.isArray(Q)?he=Q:Q!=null&&(he=[Q]),m(he)}},{collection:E,selectionManager:C,disabledKeys:R}=Fc({...t,items:t.items??t.defaultItems,selectionMode:i,disallowEmptySelection:i==="single",allowDuplicateSelectionEvents:!0,selectedKeys:s.useMemo(()=>c3(g),[g]),onSelectionChange:Q=>{var ce;if(Q!=="all")if(i==="single"){let he=Q.values().next().value??null;he===g?((ce=t.onSelectionChange)==null||ce.call(t,he),X(),S()):v(he)}else v([...Q])}}),T=i==="single"?C.firstSelectedKey:null,F=s.useMemo(()=>[...C.selectedKeys].map(Q=>E.getItem(Q)).filter(Q=>Q!=null),[C.selectedKeys,E]),[B,L]=ct(t.inputValue,Zi(t.defaultInputValue,T,E)||"",t.onInputChange),[M]=s.useState(g),[V]=s.useState(B),H=E,j=s.useMemo(()=>t.items!=null||!e?E:s3(E,B,e),[E,B,e,t.items]),[$,D]=s.useState(j),A=s.useRef("focus"),P=bl({...t,onOpenChange:Q=>{t.onOpenChange&&t.onOpenChange(Q,Q?A.current:void 0),C.setFocused(Q),Q||C.setFocusedKey(null)},isOpen:void 0,defaultOpen:void 0}),k=(Q=null,ce)=>{let he=ce==="manual"||ce==="focus"&&n==="focus";(l||j.size>0||he&&H.size>0||t.items)&&(he&&!P.isOpen&&t.items===void 0&&a(!0),A.current=ce,b(Q),P.open())},K=(Q=null,ce)=>{let he=ce==="manual"||ce==="focus"&&n==="focus";!(l||j.size>0||he&&H.size>0||t.items)&&!P.isOpen||(he&&!P.isOpen&&t.items===void 0&&a(!0),P.isOpen||(A.current=ce),Z(Q))},_=s.useCallback(()=>{D(u?H:j)},[u,H,j]),Z=s.useCallback((Q=null)=>{P.isOpen&&_(),b(Q),P.toggle()},[P,_]),S=s.useCallback(()=>{P.isOpen&&(_(),P.close())},[P,_]),[N,O]=s.useState(B),X=()=>{var ce;let Q=T!=null?((ce=E.getItem(T))==null?void 0:ce.textValue)??"":"";O(Q),L(Q)},J=s.useRef(g),de=s.useRef(T!=null?((To=E.getItem(T))==null?void 0:To.textValue)??"":"");s.useEffect(()=>{var ce;c&&(j.size>0||l)&&!P.isOpen&&B!==N&&n!=="manual"&&k(null,"input"),!u&&!l&&P.isOpen&&j.size===0&&S(),g!=null&&g!==J.current&&i==="single"&&S(),B!==N&&(C.setFocusedKey(null),a(!1),i==="single"&&B===""&&(t.inputValue===void 0||h===void 0)&&v(null)),g!==J.current&&(t.inputValue===void 0||h===void 0)?X():N!==B&&O(B);let Q=T!=null?((ce=E.getItem(T))==null?void 0:ce.textValue)??"":"";!c&&T!=null&&t.inputValue===void 0&&T===J.current&&de.current!==Q&&(O(Q),L(Q)),J.current=g,de.current=Q});let Ce=og({...t,value:s.useMemo(()=>Array.isArray(g)&&g.length===0?null:{inputValue:B,value:g,selectedKey:T},[B,T,g])}),z=()=>{r&&T==null?Y():ue()},Y=()=>{if(i==="multiple"){O(B),S();return}let Q=null;J.current=Q,v(Q),S()},ue=(Q=!1)=>{var ce,he,Ao;if(h!==void 0&&t.inputValue!==void 0){let Bo=T!=null?((ce=E.getItem(T))==null?void 0:ce.textValue)??"":"";(Q||i==="multiple"||B!==Bo)&&((he=t.onSelectionChange)==null||he.call(t,T),(Ao=t.onChange)==null||Ao.call(t,g)),O(Bo),S()}else X(),S()};const Re=()=>{var Q;if(r){const ce=T!=null?((Q=E.getItem(T))==null?void 0:Q.textValue)??"":"";B===ce?ue():Y()}else ue()};let El=()=>{P.isOpen&&C.focusedKey!=null?C.isSelected(C.focusedKey)&&i==="single"?ue(!0):C.select(C.focusedKey):Re()},Dt=s.useRef([B,g]),An=Q=>{Q?(Dt.current=[B,g],n==="focus"&&!t.isReadOnly&&k(null,"focus")):(o&&Re(),(B!==Dt.current[0]||g!==Dt.current[1])&&Ce.commitValidation()),f(Q)},xp=s.useMemo(()=>P.isOpen?u?H:j:$,[P.isOpen,H,j,u,$]),Po=t.defaultSelectedKey??(i==="single"?M:null);return{...Ce,...P,focusStrategy:d,toggle:K,open:k,close:Re,selectionManager:C,value:g,defaultValue:p??M,setValue:v,selectedKey:T,selectedItems:F,defaultSelectedKey:Po,setSelectedKey:v,disabledKeys:R,isFocused:c,setFocused:An,selectedItem:F[0]??null,collection:xp,inputValue:B,defaultInputValue:Zi(t.defaultInputValue,Po,E)??V,setInputValue:L,commit:El,revert:z}}function s3(t,e,n){return new gr(Bd(t,t,e,n))}function Bd(t,e,n,l){let r=[];for(let o of e)if(o.type==="section"&&o.hasChildNodes){let i=Bd(t,nl(o,t),n,l);[...i].some(u=>u.type==="item")&&r.push({...o,childNodes:i})}else o.type==="item"&&l(o.textValue,n)?r.push({...o}):o.type!=="item"&&r.push({...o});return r}function Zi(t,e,n){var l;return t==null&&e!=null?((l=n.getItem(e))==null?void 0:l.textValue)??"":t}function c3(t){if(t!==void 0)return t===null?[]:Array.isArray(t)?t:[t]}const d3=s.createContext(null),Kd=s.createContext(null),f3=Cn(function(e,n){[e,n]=ve(e,n,d3);let{children:l,isDisabled:r=!1,isInvalid:o=!1,isRequired:i=!1,isReadOnly:u=!1}=e,a=s.useMemo(()=>x.createElement(vl.Provider,{value:{items:e.items??e.defaultItems}},typeof l=="function"?l({isOpen:!1,isDisabled:r,isInvalid:o,isRequired:i,defaultChildren:null,isReadOnly:u}):l),[l,r,o,i,u,e.items,e.defaultItems]);return x.createElement(Ur,{content:a},c=>x.createElement(b3,{props:e,collection:c,comboBoxRef:n}))}),p3=[Ht,En,xl,eo,kn];function b3({props:t,collection:e,comboBoxRef:n}){let{name:l,formValue:r="key",allowsCustomValue:o}=t;o&&(r="text");let{validationBehavior:i}=vn(to)||{},u=t.validationBehavior??i??"native",{contains:a}=lg({sensitivity:"base"}),c=a3({...t,defaultFilter:t.defaultFilter||a,items:t.items,children:void 0,collection:e,validationBehavior:u}),f=s.useRef(null),d=s.useRef(null),b=s.useRef(null),p=s.useRef(null),h=s.useRef(null),[y,m]=xn(!t["aria-label"]&&!t["aria-labelledby"]),{buttonProps:g,inputProps:v,listBoxProps:E,labelProps:C,descriptionProps:R,errorMessageProps:T,valueProps:F,...B}=i3({...Fr(t),label:m,inputRef:d,buttonRef:f,listBoxRef:p,popoverRef:h,name:r==="text"?l:void 0,validationBehavior:u},c),[L,M]=s.useState(null),V=s.useCallback(()=>{var w;if(d.current&&!b.current){let P=(w=f.current)==null?void 0:w.getBoundingClientRect(),k=d.current.getBoundingClientRect(),K=P?Math.min(P.left,k.left):k.left,_=P?Math.max(P.right,k.right):k.right;M(_-K+"px")}},[f,d,M]);dn({ref:d,onResize:V});let H=s.useMemo(()=>({get current(){return b.current||d.current}}),[b,d]),j=s.useMemo(()=>({isOpen:c.isOpen,isDisabled:t.isDisabled||!1,isInvalid:B.isInvalid||!1,isRequired:t.isRequired||!1,isReadOnly:t.isReadOnly||!1}),[c.isOpen,t.isDisabled,B.isInvalid,t.isRequired,t.isReadOnly]),$=ae({...t,values:j,defaultClassName:"react-aria-ComboBox"}),D=oe(t,{global:!0});delete D.id;let A=[];if(l&&r==="key"){let w=Array.isArray(c.value)?c.value:[c.value];w.length===0&&(w=[null]),A=w.map((P,k)=>x.createElement("input",{key:k,type:"hidden",name:l,form:t.form,value:P??""}))}return x.createElement(Me,{values:[[Kd,c],[Ht,{...C,ref:y}],[En,{...g,ref:f,isPressed:c.isOpen}],[xl,{...v,ref:d}],[St,c],[Hr,{ref:h,triggerRef:H,scrollRef:p,placement:"bottom start",isNonModal:!0,trigger:"ComboBox",style:{"--trigger-width":L},clearContexts:p3}],[vl,{...E,ref:p}],[Wt,c],[kn,{slots:{description:R,errorMessage:T}}],[eo,{ref:b,isInvalid:B.isInvalid,isDisabled:t.isDisabled||!1}],[Zs,B],[h3,F]]},x.createElement(ee.div,{...D,...$,ref:n,slot:t.slot||void 0,"data-focused":c.isFocused||void 0,"data-open":c.isOpen||void 0,"data-disabled":t.isDisabled||void 0,"data-readonly":t.isReadOnly||void 0,"data-invalid":B.isInvalid||void 0,"data-required":t.isRequired||void 0},$.children,A))}const h3=s.createContext(null),Tn=s.createContext({}),Yi=({children:t,className:e,fullWidth:n,menuTrigger:l="focus",variant:r,...o})=>{const i=x.useMemo(()=>yh({fullWidth:n}),[n]);return I.jsx(Tn,{value:{slots:i,variant:r},children:I.jsx(f3,{"data-slot":"combo-box",menuTrigger:l,...o,className:ge(e,i==null?void 0:i.base()),children:u=>I.jsx(I.Fragment,{children:typeof t=="function"?t(u):t})})})},m3=({children:t,className:e,...n})=>{const{slots:l}=s.useContext(Tn),r=fe(l==null?void 0:l.inputGroup,e);return I.jsx("div",{className:r,"data-slot":"combo-box-input-group",...n,children:t})},g3=({children:t,className:e,...n})=>{const{slots:l}=s.useContext(Tn),r=s.useContext(Kd);return I.jsx(Nr,{className:ge(e,l==null?void 0:l.trigger()),"data-open":oa(r==null?void 0:r.isOpen),"data-slot":"combo-box-trigger",...n,children:t??I.jsx(cm,{"data-slot":"combo-box-trigger-default-icon"})})},y3=({children:t,className:e,placement:n="bottom",...l})=>{const{slots:r}=s.useContext(Tn);return I.jsx(ia,{value:{variant:"default"},children:I.jsx(t4,{...l,className:ge(e,r==null?void 0:r.popover()),"data-slot":"combo-box-popover",placement:n,children:t})})},Z0=Object.assign(Yi,{Root:Yi,InputGroup:m3,Trigger:g3,Popover:y3}),$3=({...t})=>{const e=s.useId();return I.jsxs("svg",{"data-slot":"spinner-icon",viewBox:"0 0 24 24",...t,children:[I.jsxs("defs",{children:[I.jsxs("linearGradient",{id:`«data-slot-icon-def-1»-${e}`,x1:"50%",x2:"50%",y1:"5.271%",y2:"91.793%",children:[I.jsx("stop",{offset:"0%",stopColor:"currentColor"}),I.jsx("stop",{offset:"100%",stopColor:"currentColor",stopOpacity:.55})]}),I.jsxs("linearGradient",{id:`«data-slot-icon-def-2»-${e}`,x1:"50%",x2:"50%",y1:"15.24%",y2:"87.15%",children:[I.jsx("stop",{offset:"0%",stopColor:"currentColor",stopOpacity:0}),I.jsx("stop",{offset:"100%",stopColor:"currentColor",stopOpacity:.55})]})]}),I.jsxs("g",{fill:"none",children:[I.jsx("path",{d:"m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"}),I.jsx("path",{d:"M8.749.021a1.5 1.5 0 0 1 .497 2.958A7.5 7.5 0 0 0 3 10.375a7.5 7.5 0 0 0 7.5 7.5v3c-5.799 0-10.5-4.7-10.5-10.5C0 5.23 3.726.865 8.749.021",fill:`url(#«data-slot-icon-def-1»-${e})`,transform:"translate(1.5 1.625)"}),I.jsx("path",{d:"M15.392 2.673a1.5 1.5 0 0 1 2.119-.115A10.48 10.48 0 0 1 21 10.375c0 5.8-4.701 10.5-10.5 10.5v-3a7.5 7.5 0 0 0 5.007-13.084a1.5 1.5 0 0 1-.115-2.118",fill:`url(#«data-slot-icon-def-2»-${e})`,transform:"translate(1.5 1.625)"})]})]})},Xi=({className:t,color:e,size:n,...l})=>I.jsx(De.span,{"data-slot":"spinner",...l,className:Dh({className:t,color:e,size:n}),children:I.jsx($3,{"aria-hidden":!0,"aria-label":"Loading",role:"presentation"})}),Y0=Object.assign(Xi,{Root:Xi});function v3(t,e){let n=e==null?void 0:e.isDisabled,[l,r]=s.useState(!1);return le(()=>{if(t!=null&&t.current&&!n){let o=()=>{if(t.current){let u=ze(t.current,{tabbable:!0});r(!!u.nextNode())}};o();let i=new MutationObserver(o);return i.observe(t.current,{subtree:!0,childList:!0,attributes:!0,attributeFilter:["tabIndex","disabled"]}),()=>{i.disconnect()}}}),n?!1:l}var Rd={};Rd={deselectedItem:t=>`${t.item} غير المحدد`,longPressToSelect:"اضغط مطولًا للدخول إلى وضع التحديد.",select:"تحديد",selectedAll:"جميع العناصر المحددة.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"لم يتم تحديد عناصر",one:()=>`${e.number(t.count)} عنصر محدد`,other:()=>`${e.number(t.count)} عنصر محدد`})}.`,selectedItem:t=>`${t.item} المحدد`};var Md={};Md={deselectedItem:t=>`${t.item} не е избран.`,longPressToSelect:"Натиснете и задръжте за да влезете в избирателен режим.",select:"Изберете",selectedAll:"Всички елементи са избрани.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Няма избрани елементи",one:()=>`${e.number(t.count)} избран елемент`,other:()=>`${e.number(t.count)} избрани елементи`})}.`,selectedItem:t=>`${t.item} избран.`};var Fd={};Fd={deselectedItem:t=>`Položka ${t.item} není vybrána.`,longPressToSelect:"Dlouhým stisknutím přejdete do režimu výběru.",select:"Vybrat",selectedAll:"Vybrány všechny položky.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Nevybrány žádné položky",one:()=>`Vybrána ${e.number(t.count)} položka`,other:()=>`Vybráno ${e.number(t.count)} položek`})}.`,selectedItem:t=>`Vybrána položka ${t.item}.`};var Id={};Id={deselectedItem:t=>`${t.item} ikke valgt.`,longPressToSelect:"Lav et langt tryk for at aktivere valgtilstand.",select:"Vælg",selectedAll:"Alle elementer valgt.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Ingen elementer valgt",one:()=>`${e.number(t.count)} element valgt`,other:()=>`${e.number(t.count)} elementer valgt`})}.`,selectedItem:t=>`${t.item} valgt.`};var Ld={};Ld={deselectedItem:t=>`${t.item} nicht ausgewählt.`,longPressToSelect:"Gedrückt halten, um Auswahlmodus zu öffnen.",select:"Auswählen",selectedAll:"Alle Elemente ausgewählt.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Keine Elemente ausgewählt",one:()=>`${e.number(t.count)} Element ausgewählt`,other:()=>`${e.number(t.count)} Elemente ausgewählt`})}.`,selectedItem:t=>`${t.item} ausgewählt.`};var zd={};zd={deselectedItem:t=>`Δεν επιλέχθηκε το στοιχείο ${t.item}.`,longPressToSelect:"Πατήστε παρατεταμένα για να μπείτε σε λειτουργία επιλογής.",select:"Επιλογή",selectedAll:"Επιλέχθηκαν όλα τα στοιχεία.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Δεν επιλέχθηκαν στοιχεία",one:()=>`Επιλέχθηκε ${e.number(t.count)} στοιχείο`,other:()=>`Επιλέχθηκαν ${e.number(t.count)} στοιχεία`})}.`,selectedItem:t=>`Επιλέχθηκε το στοιχείο ${t.item}.`};var Nd={};Nd={deselectedItem:t=>`${t.item} not selected.`,select:"Select",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"No items selected",one:()=>`${e.number(t.count)} item selected`,other:()=>`${e.number(t.count)} items selected`})}.`,selectedAll:"All items selected.",selectedItem:t=>`${t.item} selected.`,longPressToSelect:"Long press to enter selection mode."};var Vd={};Vd={deselectedItem:t=>`${t.item} no seleccionado.`,longPressToSelect:"Mantenga pulsado para abrir el modo de selección.",select:"Seleccionar",selectedAll:"Todos los elementos seleccionados.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Ningún elemento seleccionado",one:()=>`${e.number(t.count)} elemento seleccionado`,other:()=>`${e.number(t.count)} elementos seleccionados`})}.`,selectedItem:t=>`${t.item} seleccionado.`};var Od={};Od={deselectedItem:t=>`${t.item} pole valitud.`,longPressToSelect:"Valikurežiimi sisenemiseks vajutage pikalt.",select:"Vali",selectedAll:"Kõik üksused valitud.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Üksusi pole valitud",one:()=>`${e.number(t.count)} üksus valitud`,other:()=>`${e.number(t.count)} üksust valitud`})}.`,selectedItem:t=>`${t.item} valitud.`};var jd={};jd={deselectedItem:t=>`Kohdetta ${t.item} ei valittu.`,longPressToSelect:"Siirry valintatilaan painamalla pitkään.",select:"Valitse",selectedAll:"Kaikki kohteet valittu.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Ei yhtään kohdetta valittu",one:()=>`${e.number(t.count)} kohde valittu`,other:()=>`${e.number(t.count)} kohdetta valittu`})}.`,selectedItem:t=>`${t.item} valittu.`};var _d={};_d={deselectedItem:t=>`${t.item} non sélectionné.`,longPressToSelect:"Appuyez de manière prolongée pour passer en mode de sélection.",select:"Sélectionner",selectedAll:"Tous les éléments sélectionnés.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Aucun élément sélectionné",one:()=>`${e.number(t.count)} élément sélectionné`,other:()=>`${e.number(t.count)} éléments sélectionnés`})}.`,selectedItem:t=>`${t.item} sélectionné.`};var Hd={};Hd={deselectedItem:t=>`${t.item} לא נבחר.`,longPressToSelect:"הקשה ארוכה לכניסה למצב בחירה.",select:"בחר",selectedAll:"כל הפריטים נבחרו.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"לא נבחרו פריטים",one:()=>`פריט ${e.number(t.count)} נבחר`,other:()=>`${e.number(t.count)} פריטים נבחרו`})}.`,selectedItem:t=>`${t.item} נבחר.`};var Wd={};Wd={deselectedItem:t=>`Stavka ${t.item} nije odabrana.`,longPressToSelect:"Dugo pritisnite za ulazak u način odabira.",select:"Odaberite",selectedAll:"Odabrane su sve stavke.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Nije odabrana nijedna stavka",one:()=>`Odabrana je ${e.number(t.count)} stavka`,other:()=>`Odabrano je ${e.number(t.count)} stavki`})}.`,selectedItem:t=>`Stavka ${t.item} je odabrana.`};var Ud={};Ud={deselectedItem:t=>`${t.item} nincs kijelölve.`,longPressToSelect:"Nyomja hosszan a kijelöléshez.",select:"Kijelölés",selectedAll:"Az összes elem kijelölve.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Egy elem sincs kijelölve",one:()=>`${e.number(t.count)} elem kijelölve`,other:()=>`${e.number(t.count)} elem kijelölve`})}.`,selectedItem:t=>`${t.item} kijelölve.`};var Gd={};Gd={deselectedItem:t=>`${t.item} non selezionato.`,longPressToSelect:"Premi a lungo per passare alla modalità di selezione.",select:"Seleziona",selectedAll:"Tutti gli elementi selezionati.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Nessun elemento selezionato",one:()=>`${e.number(t.count)} elemento selezionato`,other:()=>`${e.number(t.count)} elementi selezionati`})}.`,selectedItem:t=>`${t.item} selezionato.`};var qd={};qd={deselectedItem:t=>`${t.item} が選択されていません。`,longPressToSelect:"長押しして選択モードを開きます。",select:"選択",selectedAll:"すべての項目を選択しました。",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"項目が選択されていません",one:()=>`${e.number(t.count)} 項目を選択しました`,other:()=>`${e.number(t.count)} 項目を選択しました`})}。`,selectedItem:t=>`${t.item} を選択しました。`};var Zd={};Zd={deselectedItem:t=>`${t.item}이(가) 선택되지 않았습니다.`,longPressToSelect:"선택 모드로 들어가려면 길게 누르십시오.",select:"선택",selectedAll:"모든 항목이 선택되었습니다.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"선택된 항목이 없습니다",one:()=>`${e.number(t.count)}개 항목이 선택되었습니다`,other:()=>`${e.number(t.count)}개 항목이 선택되었습니다`})}.`,selectedItem:t=>`${t.item}이(가) 선택되었습니다.`};var Yd={};Yd={deselectedItem:t=>`${t.item} nepasirinkta.`,longPressToSelect:"Norėdami įjungti pasirinkimo režimą, paspauskite ir palaikykite.",select:"Pasirinkti",selectedAll:"Pasirinkti visi elementai.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Nepasirinktas nė vienas elementas",one:()=>`Pasirinktas ${e.number(t.count)} elementas`,other:()=>`Pasirinkta elementų: ${e.number(t.count)}`})}.`,selectedItem:t=>`Pasirinkta: ${t.item}.`};var Xd={};Xd={deselectedItem:t=>`Vienums ${t.item} nav atlasīts.`,longPressToSelect:"Ilgi turiet nospiestu. lai ieslēgtu atlases režīmu.",select:"Atlasīt",selectedAll:"Atlasīti visi vienumi.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Nav atlasīts neviens vienums",one:()=>`Atlasīto vienumu skaits: ${e.number(t.count)}`,other:()=>`Atlasīto vienumu skaits: ${e.number(t.count)}`})}.`,selectedItem:t=>`Atlasīts vienums ${t.item}.`};var Jd={};Jd={deselectedItem:t=>`${t.item} er ikke valgt.`,longPressToSelect:"Bruk et langt trykk for å gå inn i valgmodus.",select:"Velg",selectedAll:"Alle elementer er valgt.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Ingen elementer er valgt",one:()=>`${e.number(t.count)} element er valgt`,other:()=>`${e.number(t.count)} elementer er valgt`})}.`,selectedItem:t=>`${t.item} er valgt.`};var Qd={};Qd={deselectedItem:t=>`${t.item} niet geselecteerd.`,longPressToSelect:"Druk lang om de selectiemodus te openen.",select:"Selecteren",selectedAll:"Alle items geselecteerd.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Geen items geselecteerd",one:()=>`${e.number(t.count)} item geselecteerd`,other:()=>`${e.number(t.count)} items geselecteerd`})}.`,selectedItem:t=>`${t.item} geselecteerd.`};var ef={};ef={deselectedItem:t=>`Nie zaznaczono ${t.item}.`,longPressToSelect:"Naciśnij i przytrzymaj, aby wejść do trybu wyboru.",select:"Zaznacz",selectedAll:"Wszystkie zaznaczone elementy.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Nie zaznaczono żadnych elementów",one:()=>`${e.number(t.count)} zaznaczony element`,other:()=>`${e.number(t.count)} zaznaczonych elementów`})}.`,selectedItem:t=>`Zaznaczono ${t.item}.`};var tf={};tf={deselectedItem:t=>`${t.item} não selecionado.`,longPressToSelect:"Mantenha pressionado para entrar no modo de seleção.",select:"Selecionar",selectedAll:"Todos os itens selecionados.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Nenhum item selecionado",one:()=>`${e.number(t.count)} item selecionado`,other:()=>`${e.number(t.count)} itens selecionados`})}.`,selectedItem:t=>`${t.item} selecionado.`};var nf={};nf={deselectedItem:t=>`${t.item} não selecionado.`,longPressToSelect:"Prima continuamente para entrar no modo de seleção.",select:"Selecionar",selectedAll:"Todos os itens selecionados.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Nenhum item selecionado",one:()=>`${e.number(t.count)} item selecionado`,other:()=>`${e.number(t.count)} itens selecionados`})}.`,selectedItem:t=>`${t.item} selecionado.`};var lf={};lf={deselectedItem:t=>`${t.item} neselectat.`,longPressToSelect:"Apăsați lung pentru a intra în modul de selectare.",select:"Selectare",selectedAll:"Toate elementele selectate.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Niciun element selectat",one:()=>`${e.number(t.count)} element selectat`,other:()=>`${e.number(t.count)} elemente selectate`})}.`,selectedItem:t=>`${t.item} selectat.`};var rf={};rf={deselectedItem:t=>`${t.item} не выбрано.`,longPressToSelect:"Нажмите и удерживайте для входа в режим выбора.",select:"Выбрать",selectedAll:"Выбраны все элементы.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Нет выбранных элементов",one:()=>`${e.number(t.count)} элемент выбран`,other:()=>`${e.number(t.count)} элементов выбрано`})}.`,selectedItem:t=>`${t.item} выбрано.`};var of={};of={deselectedItem:t=>`Nevybraté položky: ${t.item}.`,longPressToSelect:"Dlhším stlačením prejdite do režimu výberu.",select:"Vybrať",selectedAll:"Všetky vybraté položky.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Žiadne vybraté položky",one:()=>`${e.number(t.count)} vybratá položka`,other:()=>`Počet vybratých položiek:${e.number(t.count)}`})}.`,selectedItem:t=>`Vybraté položky: ${t.item}.`};var uf={};uf={deselectedItem:t=>`Element ${t.item} ni izbran.`,longPressToSelect:"Za izbirni način pritisnite in dlje časa držite.",select:"Izberite",selectedAll:"Vsi elementi so izbrani.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Noben element ni izbran",one:()=>`${e.number(t.count)} element je izbran`,other:()=>`${e.number(t.count)} elementov je izbranih`})}.`,selectedItem:t=>`Element ${t.item} je izbran.`};var af={};af={deselectedItem:t=>`${t.item} nije izabrano.`,longPressToSelect:"Dugo pritisnite za ulazak u režim biranja.",select:"Izaberite",selectedAll:"Izabrane su sve stavke.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Nije izabrana nijedna stavka",one:()=>`Izabrana je ${e.number(t.count)} stavka`,other:()=>`Izabrano je ${e.number(t.count)} stavki`})}.`,selectedItem:t=>`${t.item} je izabrano.`};var sf={};sf={deselectedItem:t=>`${t.item} ej markerat.`,longPressToSelect:"Tryck länge när du vill öppna väljarläge.",select:"Markera",selectedAll:"Alla markerade objekt.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Inga markerade objekt",one:()=>`${e.number(t.count)} markerat objekt`,other:()=>`${e.number(t.count)} markerade objekt`})}.`,selectedItem:t=>`${t.item} markerat.`};var cf={};cf={deselectedItem:t=>`${t.item} seçilmedi.`,longPressToSelect:"Seçim moduna girmek için uzun basın.",select:"Seç",selectedAll:"Tüm ögeler seçildi.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Hiçbir öge seçilmedi",one:()=>`${e.number(t.count)} öge seçildi`,other:()=>`${e.number(t.count)} öge seçildi`})}.`,selectedItem:t=>`${t.item} seçildi.`};var df={};df={deselectedItem:t=>`${t.item} не вибрано.`,longPressToSelect:"Виконайте довге натиснення, щоб перейти в режим вибору.",select:"Вибрати",selectedAll:"Усі елементи вибрано.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Жодних елементів не вибрано",one:()=>`${e.number(t.count)} елемент вибрано`,other:()=>`Вибрано елементів: ${e.number(t.count)}`})}.`,selectedItem:t=>`${t.item} вибрано.`};var ff={};ff={deselectedItem:t=>`未选择 ${t.item}。`,longPressToSelect:"长按以进入选择模式。",select:"选择",selectedAll:"已选择所有项目。",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"未选择项目",one:()=>`已选择 ${e.number(t.count)} 个项目`,other:()=>`已选择 ${e.number(t.count)} 个项目`})}。`,selectedItem:t=>`已选择 ${t.item}。`};var pf={};pf={deselectedItem:t=>`未選取「${t.item}」。`,longPressToSelect:"長按以進入選擇模式。",select:"選取",selectedAll:"已選取所有項目。",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"未選取任何項目",one:()=>`已選取 ${e.number(t.count)} 個項目`,other:()=>`已選取 ${e.number(t.count)} 個項目`})}。`,selectedItem:t=>`已選取「${t.item}」。`};var Cl={};Cl={"ar-AE":Rd,"bg-BG":Md,"cs-CZ":Fd,"da-DK":Id,"de-DE":Ld,"el-GR":zd,"en-US":Nd,"es-ES":Vd,"et-EE":Od,"fi-FI":jd,"fr-FR":_d,"he-IL":Hd,"hr-HR":Wd,"hu-HU":Ud,"it-IT":Gd,"ja-JP":qd,"ko-KR":Zd,"lt-LT":Yd,"lv-LV":Xd,"nb-NO":Jd,"nl-NL":Qd,"pl-PL":ef,"pt-BR":tf,"pt-PT":nf,"ro-RO":lf,"ru-RU":rf,"sk-SK":of,"sl-SI":uf,"sr-SP":af,"sv-SE":sf,"tr-TR":cf,"uk-UA":df,"zh-CN":ff,"zh-TW":pf};function x3(t){return t&&t.__esModule?t.default:t}function C3(t,e){let{getRowText:n=u=>{var a,c,f;return((c=(a=e.collection).getTextValue)==null?void 0:c.call(a,u))??((f=e.collection.getItem(u))==null?void 0:f.textValue)}}=t,l=_e(x3(Cl),"@react-aria/grid"),r=e.selectionManager.rawSelection,o=s.useRef(r),i=s.useCallback(()=>{var d;if(!e.selectionManager.isFocused||r===o.current){o.current=r;return}let u=Ji(r,o.current),a=Ji(o.current,r),c=e.selectionManager.selectionBehavior==="replace",f=[];if(e.selectionManager.selectedKeys.size===1&&c){let b=e.selectionManager.selectedKeys.keys().next().value;if(b!=null&&e.collection.getItem(b)){let p=n(b);p&&f.push(l.format("selectedItem",{item:p}))}}else if(u.size===1&&a.size===0){let b=u.keys().next().value;if(b!=null){let p=n(b);p&&f.push(l.format("selectedItem",{item:p}))}}else if(a.size===1&&u.size===0){let b=a.keys().next().value;if(b!=null&&e.collection.getItem(b)){let p=n(b);p&&f.push(l.format("deselectedItem",{item:p}))}}e.selectionManager.selectionMode==="multiple"&&(f.length===0||r==="all"||r.size>1||o.current==="all"||((d=o.current)==null?void 0:d.size)>1)&&f.push(r==="all"?l.format("selectedAll"):l.format("selectedCount",{count:r.size})),f.length>0&&yt(f.join(" ")),o.current=r},[r,e.selectionManager.selectedKeys,e.selectionManager.isFocused,e.selectionManager.selectionBehavior,e.selectionManager.selectionMode,e.collection,n,l]);Tr(()=>{if(e.selectionManager.isFocused)i();else{let u=requestAnimationFrame(i);return()=>cancelAnimationFrame(u)}},[r,e.selectionManager.isFocused])}function Ji(t,e){let n=new Set;if(t==="all"||e==="all")return n;for(let l of t.keys())e.has(l)||n.add(l);return n}function E3(t){return t&&t.__esModule?t.default:t}function w3(t){let e=_e(E3(Cl),"@react-aria/grid"),n=ta(),l=(n==="pointer"||n==="virtual"||n==null)&&typeof window<"u"&&"ontouchstart"in window,r=s.useMemo(()=>{let i=t.selectionManager.selectionMode,u=t.selectionManager.selectionBehavior,a;return l&&(a=e.format("longPressToSelect")),u==="replace"&&i!=="none"&&t.hasItemActions?a:void 0},[t.selectionManager.selectionMode,t.selectionManager.selectionBehavior,t.hasItemActions,e,l]);return $n(r)}const S3=s.createContext({}),D3=s.createContext(null),k3=Cn(function(e,n){[e,n]=ve(e,n,D3);let{validationBehavior:l}=vn(to)||{},r=e.validationBehavior??l??"native",o=s.useRef(null);[e,o]=ve(e,o,ls);let[i,u]=xn(!e["aria-label"]&&!e["aria-labelledby"]),[a,c]=s.useState("input"),{labelProps:f,inputProps:d,descriptionProps:b,errorMessageProps:p,...h}=Zc({...Fr(e),inputElementType:a,label:u,validationBehavior:r},o),y=s.useCallback(v=>{o.current=v,v&&c(v instanceof HTMLTextAreaElement?"textarea":"input")},[o]),m=ae({...e,values:{isDisabled:e.isDisabled||!1,isInvalid:h.isInvalid,isReadOnly:e.isReadOnly||!1,isRequired:e.isRequired||!1},defaultClassName:"react-aria-TextField"}),g=oe(e,{global:!0});return delete g.id,x.createElement(ee.div,{...g,...m,ref:n,slot:e.slot||void 0,"data-disabled":e.isDisabled||void 0,"data-invalid":h.isInvalid||void 0,"data-readonly":e.isReadOnly||void 0,"data-required":e.isRequired||void 0},x.createElement(Me,{values:[[Ht,{...f,ref:i}],[xl,{...d,ref:y}],[S3,{...d,ref:y}],[eo,{role:"presentation",isInvalid:h.isInvalid,isDisabled:e.isDisabled||!1}],[kn,{slots:{description:b,errorMessage:p}}],[Zs,h]]},m.children))}),bf=s.createContext({}),Qi=({children:t,className:e,fullWidth:n,variant:l,...r})=>{const o=x.useMemo(()=>Ph({fullWidth:n}),[n]);return I.jsx(k3,{"data-slot":"textfield",...r,className:ge(e,o),children:i=>I.jsx(bf,{value:{variant:l},children:I.jsx(I.Fragment,{children:typeof t=="function"?t(i):t})})})},eu=({className:t,fullWidth:e,variant:n,...l})=>{const r=s.useContext(bf),o=s.useContext(Tn),i=n??r.variant??o.variant;return I.jsx(Yg,{className:ge(t,vh({fullWidth:e,variant:i})),"data-slot":"input",...l})},X0=Object.assign(eu,{Root:eu}),J0=Object.assign(Qi,{Root:Qi}),tu=({children:t,className:e,isDisabled:n,isInvalid:l,isRequired:r,...o})=>I.jsx(Rh,{className:xh({isRequired:r,isDisabled:n,isInvalid:l,className:e}),"data-slot":"label",...o,children:t}),Q0=Object.assign(tu,{Root:tu}),nu=({children:t,className:e,...n})=>I.jsx(x4,{className:$h({className:e}),"data-slot":"description",slot:"description",...n,children:t}),ey=Object.assign(nu,{Root:nu});function P3(t){return t&&t.__esModule?t.default:t}function T3(t,e){let{key:n}=t,l=e.selectionManager,r=$e(),o=!e.selectionManager.canSelectItem(n),i=e.selectionManager.isSelected(n),u=()=>l.toggleSelection(n);const a=_e(P3(Cl),"@react-aria/grid");return{checkboxProps:{id:r,"aria-label":a.format("select"),isSelected:i,isDisabled:o,onChange:u}}}const lu=10,ru=5;class A3{setup(e,n,l){this.delegate=e,this.state=n,this.direction=l}getDropTargetFromPoint(e,n,l){let r=this.delegate.getDropTargetFromPoint(e,n,l);return!r||r.type==="root"?r:this.resolveDropTarget(r,e,n,l)}resolveDropTarget(e,n,l,r){let o=this.pointerTracking,i=l-o.lastY,u=n-o.lastX,a=o.yDirection,c=o.xDirection;if(Math.abs(i)>ru&&(a=i>0?"down":"up",o.yDirection=a,o.lastY=l),Math.abs(u)>lu&&(c=u>0?"right":"left",o.xDirection=c,o.lastX=n),e.dropPosition==="before"){let b=this.state.collection.getKeyBefore(e.key);for(;b!=null;){let p=this.state.collection.getItem(b);if((p==null?void 0:p.type)==="item")break;b=(p==null?void 0:p.parentKey)??null}if(b!=null){let p={type:"item",key:b,dropPosition:"after"};r(p)&&(e=p)}}let f=this.getPotentialTargets(e,r);if(f.length===0)return{type:"root"};let d;return f.length>1?d=this.selectTarget(f,e,n,l,a,c):(d=f[0],o.boundaryContext=null),d}getPotentialTargets(e,n){if(e.dropPosition==="on")return[e];let l=e,r=this.state.collection,o=r.getItem(l.key);for(;o&&(o==null?void 0:o.type)!=="item"&&o.nextKey!=null;)l.key=o.nextKey,o=r.getItem(o.nextKey);let i=[l];if(o&&o.hasChildNodes&&this.state.expandedKeys.has(o.key)&&r.getChildren&&l.dropPosition==="after"){let c=o.firstChildKey!=null?r.getItem(o.firstChildKey):null;for(;c&&c.type!=="item";)c=c.nextKey!=null?r.getItem(c.nextKey):null;if((c==null?void 0:c.type)==="item"){const f={type:"item",key:c.key,dropPosition:"before"};return n(f)?[f]:[]}}if((o==null?void 0:o.nextKey)!=null)return[e];let u=o==null?void 0:o.parentKey,a=[];for(;u!=null;){let c=r.getItem(u),f=(c==null?void 0:c.nextKey)!=null?r.getItem(c.nextKey):null;if(!f||f.parentKey!==u){let b={type:"item",key:u,dropPosition:"after"};if(n(b)&&a.push(b),f)break}u=c==null?void 0:c.parentKey}if(a.length>0&&i.push(...a),i.length===1){let c=r.getKeyAfter(l.key),f=c!=null?r.getItem(c):null;if(c!=null&&f&&o&&f.level!=null&&o.level!=null&&f.level>o.level){let d={type:"item",key:c,dropPosition:"before"};if(n(d))return[d]}}return i.filter(n)}selectTarget(e,n,l,r,o,i){if(e.length<2)return e[0];let u=this.pointerTracking,a=this.state.collection.getItem(n.key),c=a==null?void 0:a.parentKey;if(c==null)return e[0];if(!u.boundaryContext||u.boundaryContext.parentKey!==c){let h=u.yDirection==="up"?e.length-1:0;u.boundaryContext={parentKey:c,preferredTargetIndex:h,lastSwitchY:r,lastSwitchX:l}}let f=u.boundaryContext,d=Math.abs(l-f.lastSwitchX);if(Math.abs(r-f.lastSwitchY)>ru&&o){let h=f.preferredTargetIndex||0;o==="down"&&h===0?f.preferredTargetIndex=e.length-1:o==="up"&&h===e.length-1&&(f.preferredTargetIndex=0),u.xDirection=null}if(d>lu&&i){let h=f.preferredTargetIndex||0;i==="left"?this.direction==="ltr"?h0&&(f.preferredTargetIndex=h-1,f.lastSwitchX=l):i==="right"&&(this.direction==="ltr"?h>0&&(f.preferredTargetIndex=h-1,f.lastSwitchX=l):h{var f,d,b;let i=this.keyMap.get(o.key);e.visitNode&&(o=e.visitNode(o)),this.keyMap.set(o.key,o);let u=new Set,a=null,c=!1;if(o.type==="item"){for(let p of o.childNodes)if(((f=p.props)==null?void 0:f.colSpan)!==void 0){c=!0;break}}for(let p of o.childNodes)p.type==="cell"&&c&&(p.colspan=(d=p.props)==null?void 0:d.colSpan,p.colSpan=(b=p.props)==null?void 0:b.colSpan,p.colIndex=a?(a.colIndex??a.index)+(a.colSpan??1):p.index),p.type==="cell"&&p.parentKey==null&&(p.parentKey=o.key),u.add(p.key),a?(a.nextKey=p.key,p.prevKey=a.key):p.prevKey=null,n(p),a=p;if(a&&(a.nextKey=null),i)for(let p of i.childNodes)u.has(p.key)||l(p)},l=o=>{this.keyMap.delete(o.key);for(let i of o.childNodes)this.keyMap.get(i.key)===i&&l(i)},r=null;for(let[o,i]of e.items.entries()){let u={...i,level:i.level??0,key:i.key??"row-"+o,type:i.type??"row",value:i.value??null,hasChildNodes:!0,childNodes:[...i.childNodes],rendered:i.rendered,textValue:i.textValue??"",index:i.index??o};r?(r.nextKey=u.key,u.prevKey=r.key):u.prevKey=null,this.rows.push(u),n(u),r=u}r&&(r.nextKey=null)}*[Symbol.iterator](){yield*[...this.rows]}get size(){return[...this.rows].length}getKeys(){return this.keyMap.keys()}getKeyBefore(e){let n=this.keyMap.get(e);return n?n.prevKey??null:null}getKeyAfter(e){let n=this.keyMap.get(e);return n?n.nextKey??null:null}getFirstKey(){var e;return(e=[...this.rows][0])==null?void 0:e.key}getLastKey(){var n;let e=[...this.rows];return(n=e[e.length-1])==null?void 0:n.key}getItem(e){return this.keyMap.get(e)??null}at(e){const n=[...this.getKeys()];return this.getItem(n[e])}getChildren(e){let n=this.keyMap.get(e);return(n==null?void 0:n.childNodes)||[]}}const hf="row-header-column-"+Math.random().toString(36).slice(2);let vr="row-header-column-"+Math.random().toString(36).slice(2);for(;hf===vr;)vr="row-header-column-"+Math.random().toString(36).slice(2);function mf(t,e){if(e.length===0)return[];let n=[],l=new Map;for(let a of e){let c=a.parentKey,f=[a];for(;c!=null;){let d=t.get(c);if(!d)break;if(l.has(d)){d.colSpan??(d.colSpan=0),d.colSpan++,d.colspan=d.colSpan;let{column:b,index:p}=l.get(d);if(p>f.length)break;for(let h=p;ha.length)),o=Array(r).fill(0).map(()=>[]),i=0;for(let a of n){let c=r-1;for(let f of a){if(f){let d=o[c],b=d.reduce((p,h)=>p+(h.colSpan??1),0);if(b0&&(d[d.length-1].nextKey=p.key,p.prevKey=d[d.length-1].key),d.push(p)}d.length>0&&(d[d.length-1].nextKey=f.key,f.prevKey=d[d.length-1].key),f.level=c,f.colIndex=i,d.push(f)}c--}i++}let u=0;for(let a of o){let c=a.reduce((f,d)=>f+(d.colSpan??1),0);if(c({type:"headerrow",key:"headerrow-"+c,index:c,value:null,rendered:null,level:0,hasChildNodes:!0,childNodes:a,textValue:""}))}class K3 extends B3{constructor(e,n,l){let r=new Set,o=null,i=[];if(l!=null&&l.showSelectionCheckboxes){let d={type:"column",key:hf,value:null,textValue:"",level:0,index:l!=null&&l.showDragButtons?1:0,hasChildNodes:!1,rendered:null,childNodes:[],props:{isSelectionCell:!0}};i.unshift(d)}if(l!=null&&l.showDragButtons){let d={type:"column",key:vr,value:null,textValue:"",level:0,index:0,hasChildNodes:!1,rendered:null,childNodes:[],props:{isDragButtonCell:!0}};i.unshift(d)}let u=[],a=new Map,c=d=>{switch(d.type){case"body":o=d;break;case"column":a.set(d.key,d),d.hasChildNodes||(i.push(d),d.props.isRowHeader&&r.add(d.key));break;case"item":u.push(d);return}for(let b of d.childNodes)c(b)};for(let d of e)c(d);let f=mf(a,i);if(f.forEach((d,b)=>u.splice(b,0,d)),super({columnCount:i.length,items:u,visitNode:d=>(d.column=i[d.index],d)}),this._size=0,this.columns=i,this.rowHeaderColumnKeys=r,this.body=o,this.headerRows=f,this._size=[...o.childNodes].length,this.rowHeaderColumnKeys.size===0){let d=this.columns.find(b=>{var p,h;return!((p=b.props)!=null&&p.isDragButtonCell)&&!((h=b.props)!=null&&h.isSelectionCell)});d&&this.rowHeaderColumnKeys.add(d.key)}}*[Symbol.iterator](){yield*this.body.childNodes}get size(){return this._size}getKeys(){return this.keyMap.keys()}getKeyBefore(e){let n=this.keyMap.get(e);return(n==null?void 0:n.prevKey)??null}getKeyAfter(e){let n=this.keyMap.get(e);return(n==null?void 0:n.nextKey)??null}getFirstKey(){var e;return((e=Xr(this.body.childNodes))==null?void 0:e.key)??null}getLastKey(){var e;return((e=Ws(this.body.childNodes))==null?void 0:e.key)??null}getItem(e){return e===this.body.key?this.body:this.keyMap.get(e)??null}at(e){const n=[...this.getKeys()];return this.getItem(n[e])}getChildren(e){if(e===this.body.key)return this.body.childNodes;let n=this.getItem(e);return(n==null?void 0:n.type)==="item"?[...n.childNodes].filter(l=>l.type==="cell"):super.getChildren(e)}getTextValue(e){let n=this.getItem(e);if(!n)return"";if(n.textValue)return n.textValue;let l=this.rowHeaderColumnKeys;if(l){let r=[];for(let o of n.childNodes){let i=this.columns[o.index];if(l.has(i.key)&&o.textValue&&r.push(o.textValue),r.length===l.size)break}return r.join(" ")}return""}}function R3(t){return t!=null&&(!isNaN(t)||String(t).match(/^(\d+)(?=%$)/)!==null)}function M3(t){if(!t||typeof t=="number")return 1;let e=t.match(/^(.+)(?=fr$)/);return e?parseFloat(e[0]):1}function co(t,e){if(typeof t=="string"){let n=t.match(/^(\d+)(?=%$)/);if(!n)throw new Error("Only percentages or numbers are supported for static column widths");return e*(parseFloat(n[0])/100)}return t}function gf(t,e){return t!=null?co(t,e):Number.MAX_SAFE_INTEGER}function yf(t,e){return t!=null?co(t,e):0}function F3(t,e,n,l,r){let o=!1,i=e.map((u,a)=>{let c=n.get(u.key)!=null?n.get(u.key)??"1fr":u.width??u.defaultWidth??(l==null?void 0:l(a))??"1fr",f=!1,d=0,b=0,p=0;R3(c)?(d=co(c,t),f=!0):(b=M3(c),b<=0&&(f=!0));let h=yf(u.minWidth??(r==null?void 0:r(a))??0,t),y=gf(u.maxWidth,t),m=Math.max(h,Math.min(d,y));return f?p=m:d>m&&(f=!0,p=m),f||(o=!0),{frozen:f,baseSize:d,hypotheticalMainSize:m,min:h,max:y,flex:b,targetMainSize:p,violation:0}});for(;o;){let u=0,a=0;i.forEach(d=>{d.frozen?u+=d.targetMainSize:(u+=d.baseSize,a+=d.flex)});let c=t-u;c>0&&i.forEach(d=>{if(!d.frozen){let b=d.flex/a;d.targetMainSize=d.baseSize+b*c}});let f=0;i.forEach(d=>{if(d.violation=0,!d.frozen){let{min:b,max:p,targetMainSize:h}=d;d.targetMainSize=Math.max(b,Math.min(h,p)),d.violation=d.targetMainSize-h,f+=d.violation}}),o=!1,i.forEach(d=>{f===0||Math.sign(f)===Math.sign(d.violation)?d.frozen=!0:d.frozen||(o=!0)})}return I3(i)}function I3(t){let e=0,n=0,l=[];return t.forEach(function(r){let o=r.targetMainSize,i=Math.round(o+e)-n;e+=o,n+=i,l.push(i)}),l}class L3{constructor(e){this.columnWidths=new Map,this.columnMinWidths=new Map,this.columnMaxWidths=new Map,this.getDefaultWidth=(e==null?void 0:e.getDefaultWidth)??(()=>"1fr"),this.getDefaultMinWidth=(e==null?void 0:e.getDefaultMinWidth)??(()=>75)}splitColumnsIntoControlledAndUncontrolled(e){return e.reduce((n,l)=>(l.props.width!=null?n[0].set(l.key,l):n[1].set(l.key,l),n),[new Map,new Map])}recombineColumns(e,n,l,r){return new Map(e.map(o=>l.has(o.key)?[o.key,n.get(o.key)]:[o.key,r.get(o.key).props.width]))}getInitialUncontrolledWidths(e){return new Map(Array.from(e).map(([n,l])=>{var r;return[n,l.props.defaultWidth??((r=this.getDefaultWidth)==null?void 0:r.call(this,l))??"1fr"]}))}getColumnWidth(e){return this.columnWidths.get(e)??0}getColumnMinWidth(e){return this.columnMinWidths.get(e)??0}getColumnMaxWidth(e){return this.columnMaxWidths.get(e)??0}resizeColumnWidth(e,n,l,r){let o=this.columnWidths,i=!0,u=new Map;return r=Math.max(this.getColumnMinWidth(l),Math.min(this.getColumnMaxWidth(l),Math.floor(r))),e.columns.forEach(a=>{a.key===l?(u.set(a.key,r),i=!1):i?u.set(a.key,o.get(a.key)??0):u.set(a.key,a.props.width??n.get(a.key))}),u}buildColumnWidths(e,n,l){return this.columnWidths=new Map,this.columnMinWidths=new Map,this.columnMaxWidths=new Map,F3(e,n.columns.map(o=>({...o.props,key:o.key})),l,o=>this.getDefaultWidth(n.columns[o]),o=>this.getDefaultMinWidth(n.columns[o])).forEach((o,i)=>{let u=n.columns[i].key,a=n.columns[i];this.columnWidths.set(u,o),this.columnMinWidths.set(u,yf(a.props.minWidth??this.getDefaultMinWidth(a),e)),this.columnMaxWidths.set(u,gf(a.props.maxWidth,e))}),this.columnWidths}}function z3(t,e){let{getDefaultWidth:n,getDefaultMinWidth:l,tableWidth:r=0}=t,[o,i]=s.useState(null),u=s.useMemo(()=>new L3({getDefaultWidth:n,getDefaultMinWidth:l}),[n,l]),[a,c]=s.useMemo(()=>u.splitColumnsIntoControlledAndUncontrolled(e.collection.columns),[e.collection.columns,u]),[f,d]=s.useState(()=>u.getInitialUncontrolledWidths(c)),[b,p]=s.useState(e.collection.columns);if(e.collection.columns!==b){if(e.collection.columns.length!==b.length||e.collection.columns.some((E,C)=>E.key!==b[C].key)){let E=u.getInitialUncontrolledWidths(c);d(E)}p(e.collection.columns)}let h=s.useMemo(()=>u.recombineColumns(e.collection.columns,f,c,a),[e.collection.columns,f,c,a,u]),y=s.useCallback(E=>{i(E)},[i]),m=s.useCallback((E,C)=>{let R=u.resizeColumnWidth(e.collection,f,E,C),T=new Map(Array.from(c).map(([F])=>[F,R.get(F)]));return T.set(E,C),d(T),R},[c,d,u,e.collection,f]),g=s.useCallback(()=>{i(null)},[i]),v=s.useMemo(()=>u.buildColumnWidths(r,e.collection,h),[r,e.collection,h,u]);return s.useMemo(()=>({resizingColumn:o,updateResizedColumns:m,startResize:y,endResize:g,getColumnWidth:E=>u.getColumnWidth(E),getColumnMinWidth:E=>u.getColumnMinWidth(E),getColumnMaxWidth:E=>u.getColumnMaxWidth(E),tableState:e,columnWidths:v}),[u,v,o,m,y,g,e])}function N3(t){let{collection:e,focusMode:n}=t,l=t.UNSAFE_selectionState||Jr(t),r=s.useMemo(()=>t.disabledKeys?new Set(t.disabledKeys):new Set,[t.disabledKeys]),o=l.setFocusedKey;l.setFocusedKey=(a,c)=>{var f,d;if(n==="cell"&&a!=null){let b=e.getItem(a);if((b==null?void 0:b.type)==="item"){let p=nl(b,e);c==="last"?a=((f=Ws(p))==null?void 0:f.key)??null:a=((d=Xr(p))==null?void 0:d.key)??null}}o(a,c)};let i=s.useMemo(()=>new yl(e,l),[e,l]);const u=s.useRef(null);return s.useEffect(()=>{if(l.focusedKey!=null&&u.current&&!e.getItem(l.focusedKey)){const a=u.current.getItem(l.focusedKey),c=(a==null?void 0:a.parentKey)!=null&&(a.type==="cell"||a.type==="rowheader"||a.type==="column")?u.current.getItem(a.parentKey):a;if(!c){l.setFocusedKey(null);return}const f=u.current.rows,d=e.rows,b=f.length-d.length;let p=Math.min(b>1?Math.max(c.index-b+1,0):c.index,d.length-1),h=null;for(;p>=0;){if(!i.isDisabled(d[p].key)&&d[p].type!=="headerrow"){h=d[p];break}pc.index&&(p=c.index),p--)}if(h){const y=h.hasChildNodes?[...nl(h,e)]:[],m=h.hasChildNodes&&c!==a&&a&&a.index({showSelectionCheckboxes:r&&l!=="none",showDragButtons:o,selectionMode:l,columns:[]}),[t.children,r,l,o]),a=Us(t,s.useCallback(p=>new K3(p,null,u),[u]),u),{disabledKeys:c,selectionManager:f}=N3({...t,collection:a,disabledBehavior:t.disabledBehavior||"selection"}),[d,b]=ct(t.expandedKeys?new Set(t.expandedKeys):void 0,t.defaultExpandedKeys?new Set(t.defaultExpandedKeys):new Set,t.onExpandedChange);return{collection:a,disabledKeys:c,selectionManager:f,showSelectionCheckboxes:t.showSelectionCheckboxes||!1,sortDescriptor:t.sortDescriptor??null,isKeyboardNavigationDisabled:a.size===0||e,setKeyboardNavigationDisabled:n,sort(p,h){var y,m;(m=t.onSortChange)==null||m.call(t,{column:p,direction:h??(((y=t.sortDescriptor)==null?void 0:y.column)===p?V3[t.sortDescriptor.direction]:"ascending")})},expandedKeys:d,toggleKey(p){b(h=>{let y=new Set(h);return y.has(p)?y.delete(p):y.add(p),y})},treeColumn:i}}function j3(t,e){let n=s.useMemo(()=>e?t.collection.filter(e):t.collection,[t.collection,e]),l=t.selectionManager.withCollection(n);return{...t,collection:n,selectionManager:l}}class $f{constructor(e){if(this.collection=e.collection,this.disabledKeys=e.disabledKeys,this.disabledBehavior=e.disabledBehavior||"all",this.direction=e.direction,this.collator=e.collator,!e.layout&&!e.ref)throw new Error("Either a layout or a ref must be specified.");this.layoutDelegate=e.layoutDelegate||(e.layout?new _3(e.layout):new hr(e.ref)),this.focusMode=e.focusMode??"row"}isCell(e){return e.type==="cell"}isRow(e){return e.type==="row"||e.type==="item"}isDisabled(e){var n,l;return this.disabledBehavior==="all"&&(((n=e.props)==null?void 0:n.isDisabled)||this.disabledKeys.has(e.key))&&((l=e.props)==null?void 0:l.disabledBehavior)!=="selection"}findPreviousKey(e,n,l=!1){let r=e!=null?this.collection.getKeyBefore(e):this.collection.getLastKey();for(;r!=null;){let o=this.collection.getItem(r);if(!o)return null;if((l||!this.isDisabled(o))&&(!n||n(o)))return r;r=this.collection.getKeyBefore(r)}return null}findNextKey(e,n,l=!1){let r=e!=null?this.collection.getKeyAfter(e):this.collection.getFirstKey();for(;r!=null;){let o=this.collection.getItem(r);if(!o)return null;if((l||!this.isDisabled(o))&&(!n||n(o)))return r;if(r=this.collection.getKeyAfter(r),r==null)return null}return null}getKeyForItemInRowByIndex(e,n=0){if(n<0)return null;let l=this.collection.getItem(e);if(!l)return null;let r=0;for(let o of Ee(l,this.collection)){if(o.colSpan&&o.colSpan+r>n||(o.colSpan&&(r=r+o.colSpan-1),r===n))return o.key??null;r++}return null}getKeyBelow(e,n){let l=e,r=this.collection.getItem(l);if(!r||(this.isCell(r)&&(l=r.parentKey??null),l==null))return null;if(l=this.findNextKey(l,o=>o.type==="item",n==null?void 0:n.includeDisabled),l!=null){if(this.isCell(r)){let o=r.colIndex?r.colIndex:r.index;return this.getKeyForItemInRowByIndex(l,o)}if(this.focusMode==="row")return l}return null}getKeyAbove(e,n){let l=e,r=this.collection.getItem(l);if(!r||(this.isCell(r)&&(l=r.parentKey??null),l==null))return null;if(l=this.findPreviousKey(l,o=>o.type==="item",n==null?void 0:n.includeDisabled),l!=null){if(this.isCell(r)){let o=r.colIndex?r.colIndex:r.index;return this.getKeyForItemInRowByIndex(l,o)}if(this.focusMode==="row")return l}return null}getKeyRightOf(e){var l,r;let n=this.collection.getItem(e);if(!n)return null;if(this.isRow(n)){let o=Ee(n,this.collection);return(this.direction==="rtl"?(l=On(o))==null?void 0:l.key:(r=At(o))==null?void 0:r.key)??null}if(this.isCell(n)&&n.parentKey!=null){let o=this.collection.getItem(n.parentKey);if(!o)return null;let i=Ee(o,this.collection),u=(this.direction==="rtl"?ln(i,n.index-1):ln(i,n.index+1))??null;return u?u.key??null:this.focusMode==="row"?n.parentKey??null:(this.direction==="rtl"?this.getFirstKey(e):this.getLastKey(e))??null}return null}getKeyLeftOf(e){var l,r;let n=this.collection.getItem(e);if(!n)return null;if(this.isRow(n)){let o=Ee(n,this.collection);return(this.direction==="rtl"?(l=At(o))==null?void 0:l.key:(r=On(o))==null?void 0:r.key)??null}if(this.isCell(n)&&n.parentKey!=null){let o=this.collection.getItem(n.parentKey);if(!o)return null;let i=Ee(o,this.collection),u=(this.direction==="rtl"?ln(i,n.index+1):ln(i,n.index-1))??null;return u?u.key??null:this.focusMode==="row"?n.parentKey??null:(this.direction==="rtl"?this.getLastKey(e):this.getFirstKey(e))??null}return null}getFirstKey(e,n){var o,i;let l=e??null,r;if(l!=null){if(r=this.collection.getItem(l),!r)return null;if(this.isCell(r)&&!n&&r.parentKey!=null){let u=this.collection.getItem(r.parentKey);return u?((o=At(Ee(u,this.collection)))==null?void 0:o.key)??null:null}}if(l=this.findNextKey(void 0,u=>u.type==="item"),l!=null&&(r&&this.isCell(r)&&n||this.focusMode==="cell")){let u=this.collection.getItem(l);if(!u)return null;l=((i=At(Ee(u,this.collection)))==null?void 0:i.key)??null}return l}getLastKey(e,n){var o,i;let l=e??null,r;if(l!=null){if(r=this.collection.getItem(l),!r)return null;if(this.isCell(r)&&!n&&r.parentKey!=null){let u=this.collection.getItem(r.parentKey);if(!u)return null;let a=Ee(u,this.collection);return((o=On(a))==null?void 0:o.key)??null}}if(l=this.findPreviousKey(void 0,u=>u.type==="item"),l!=null&&(r&&this.isCell(r)&&n||this.focusMode==="cell")){let u=this.collection.getItem(l);if(!u)return null;let a=Ee(u,this.collection);l=((i=On(a))==null?void 0:i.key)??null}return l}getKeyPageAbove(e){let n=e,l=this.layoutDelegate.getItemRect(n);if(!l)return null;let r=Math.max(0,l.y+l.height-this.layoutDelegate.getVisibleRect().height);for(;l&&l.y>r&&n!=null&&(n=this.getKeyAbove(n)??null,n!=null);)l=this.layoutDelegate.getItemRect(n);return n}getKeyPageBelow(e){let n=e,l=this.layoutDelegate.getItemRect(n);if(!l)return null;let r=this.layoutDelegate.getVisibleRect().height,o=Math.min(this.layoutDelegate.getContentSize().height,l.y+r);for(;l&&l.y+l.heightc.type==="item"),l==null&&!i&&(l=this.getFirstKey(),i=!0)}return null}}class _3{constructor(e){this.layout=e}getContentSize(){return this.layout.getContentSize()}getItemRect(e){var n;return((n=this.layout.getLayoutInfo(e))==null?void 0:n.rect)||null}getVisibleRect(){return this.layout.virtualizer.visibleRect}}const fo=new WeakMap;function H3(t,e,n){let{isVirtualized:l,disallowTypeAhead:r,keyboardDelegate:o,focusMode:i,scrollRef:u,getRowText:a,onRowAction:c,onCellAction:f,escapeKeyBehavior:d="clearSelection",shouldSelectOnPressUp:b}=t,{selectionManager:p}=e;!t["aria-label"]&&!t["aria-labelledby"]&&console.warn("An aria-label or aria-labelledby prop is required for accessibility.");let h=Pn({usage:"search",sensitivity:"base"}),{direction:y}=Pe(),m=e.selectionManager.disabledBehavior,g=s.useMemo(()=>o||new $f({collection:e.collection,disabledKeys:e.disabledKeys,disabledBehavior:m,ref:n,direction:y,collator:h,focusMode:i}),[o,e.collection,e.disabledKeys,m,n,y,h,i]),{collectionProps:v}=Zr({ref:n,selectionManager:p,keyboardDelegate:g,isVirtualized:l,scrollRef:u,disallowTypeAhead:r,escapeKeyBehavior:d}),E=$e(t.id);fo.set(e,{keyboardDelegate:g,actions:{onRowAction:c,onCellAction:f},shouldSelectOnPressUp:b});let C=w3({selectionManager:p,hasItemActions:!!(c||f)}),R=oe(t,{labelable:!0}),T=s.useCallback(M=>{if(p.isFocused){ne(M.currentTarget,U(M))||p.setFocused(!1);return}ne(M.currentTarget,U(M))&&p.setFocused(!0)},[p]),F=s.useMemo(()=>({onBlur:v.onBlur,onFocus:T}),[T,v.onBlur]),B=v3(n,{isDisabled:e.collection.size!==0}),L=W(R,{role:"grid",id:E,"aria-multiselectable":p.selectionMode==="multiple"?"true":void 0},e.isKeyboardNavigationDisabled?F:v,e.collection.size===0&&{tabIndex:B?-1:0}||void 0,C);return l&&(L["aria-rowcount"]=e.collection.size,L["aria-colcount"]=e.collection.columnCount),C3({getRowText:a},e),{gridProps:L}}const po=new WeakMap;function xr(t){return typeof t=="string"?t.replace(/\s*/g,""):""+t}function vf(t,e){let n=po.get(t);if(!n)throw new Error("Unknown grid");return`${n}-${xr(e)}`}function xf(t,e,n){let l=po.get(t);if(!l)throw new Error("Unknown grid");return`${l}-${xr(e)}-${xr(n)}`}function Cr(t,e){return[...t.collection.rowHeaderColumnKeys].map(n=>xf(t,e,n)).join(" ")}var Cf={};Cf={ascending:"تصاعدي",ascendingSort:t=>`ترتيب حسب العمود ${t.columnName} بترتيب تصاعدي`,columnSize:t=>`${t.value} بالبكسل`,descending:"تنازلي",descendingSort:t=>`ترتيب حسب العمود ${t.columnName} بترتيب تنازلي`,resizerDescription:"اضغط على مفتاح Enter لبدء تغيير الحجم",select:"تحديد",selectAll:"تحديد الكل",sortable:"عمود قابل للترتيب",collapse:"طي",expand:"تمديد"};var Ef={};Ef={ascending:"възходящ",ascendingSort:t=>`сортирано по колона ${t.columnName} във възходящ ред`,columnSize:t=>`${t.value} пиксела`,descending:"низходящ",descendingSort:t=>`сортирано по колона ${t.columnName} в низходящ ред`,resizerDescription:"Натиснете „Enter“, за да започнете да преоразмерявате",select:"Изберете",selectAll:"Изберете всичко",sortable:"сортираща колона",collapse:"Свиване",expand:"Разширяване"};var wf={};wf={ascending:"vzestupně",ascendingSort:t=>`řazeno vzestupně podle sloupce ${t.columnName}`,columnSize:t=>`${t.value} pixelů`,descending:"sestupně",descendingSort:t=>`řazeno sestupně podle sloupce ${t.columnName}`,resizerDescription:"Stisknutím klávesy Enter začnete měnit velikost",select:"Vybrat",selectAll:"Vybrat vše",sortable:"sloupec s možností řazení",collapse:"Sbalit",expand:"Roztáhnout"};var Sf={};Sf={ascending:"stigende",ascendingSort:t=>`sorteret efter kolonne ${t.columnName} i stigende rækkefølge`,columnSize:t=>`${t.value} pixels`,descending:"faldende",descendingSort:t=>`sorteret efter kolonne ${t.columnName} i faldende rækkefølge`,resizerDescription:"Tryk på Enter for at ændre størrelse",select:"Vælg",selectAll:"Vælg alle",sortable:"sorterbar kolonne",collapse:"Skjul",expand:"Udvid"};var Df={};Df={ascending:"aufsteigend",ascendingSort:t=>`sortiert nach Spalte ${t.columnName} in aufsteigender Reihenfolge`,columnSize:t=>`${t.value} Pixel`,descending:"absteigend",descendingSort:t=>`sortiert nach Spalte ${t.columnName} in absteigender Reihenfolge`,resizerDescription:"Eingabetaste zum Starten der Größenänderung drücken",select:"Auswählen",selectAll:"Alles auswählen",sortable:"sortierbare Spalte",collapse:"Reduzieren",expand:"Erweitern"};var kf={};kf={ascending:"αύξουσα",ascendingSort:t=>`διαλογή ανά στήλη ${t.columnName} σε αύξουσα σειρά`,columnSize:t=>`${t.value} pixel`,descending:"φθίνουσα",descendingSort:t=>`διαλογή ανά στήλη ${t.columnName} σε φθίνουσα σειρά`,resizerDescription:"Πατήστε Enter για έναρξη της αλλαγής μεγέθους",select:"Επιλογή",selectAll:"Επιλογή όλων",sortable:"Στήλη διαλογής",collapse:"Σύμπτυξη",expand:"Ανάπτυξη"};var Pf={};Pf={select:"Select",selectAll:"Select All",sortable:"sortable column",ascending:"ascending",descending:"descending",ascendingSort:t=>`sorted by column ${t.columnName} in ascending order`,descendingSort:t=>`sorted by column ${t.columnName} in descending order`,columnSize:t=>`${t.value} pixels`,resizerDescription:"Press Enter to start resizing",expand:"Expand",collapse:"Collapse"};var Tf={};Tf={ascending:"ascendente",ascendingSort:t=>`ordenado por columna ${t.columnName} en sentido ascendente`,columnSize:t=>`${t.value} píxeles`,descending:"descendente",descendingSort:t=>`ordenado por columna ${t.columnName} en orden descendente`,resizerDescription:"Pulse Intro para empezar a redimensionar",select:"Seleccionar",selectAll:"Seleccionar todos",sortable:"columna ordenable",collapse:"Contraer",expand:"Ampliar"};var Af={};Af={ascending:"tõusev järjestus",ascendingSort:t=>`sorditud veeru järgi ${t.columnName} tõusvas järjestuses`,columnSize:t=>`${t.value} pikslit`,descending:"laskuv järjestus",descendingSort:t=>`sorditud veeru järgi ${t.columnName} laskuvas järjestuses`,resizerDescription:"Suuruse muutmise alustamiseks vajutage klahvi Enter",select:"Vali",selectAll:"Vali kõik",sortable:"sorditav veerg",collapse:"Ahenda",expand:"Laienda"};var Bf={};Bf={ascending:"nouseva",ascendingSort:t=>`lajiteltu sarakkeen ${t.columnName} mukaan nousevassa järjestyksessä`,columnSize:t=>`${t.value} pikseliä`,descending:"laskeva",descendingSort:t=>`lajiteltu sarakkeen ${t.columnName} mukaan laskevassa järjestyksessä`,resizerDescription:"Aloita koon muutos painamalla Enter-näppäintä",select:"Valitse",selectAll:"Valitse kaikki",sortable:"lajiteltava sarake",collapse:"Pienennä",expand:"Laajenna"};var Kf={};Kf={ascending:"croissant",ascendingSort:t=>`trié en fonction de la colonne ${t.columnName} par ordre croissant`,columnSize:t=>`${t.value} pixels`,descending:"décroissant",descendingSort:t=>`trié en fonction de la colonne ${t.columnName} par ordre décroissant`,resizerDescription:"Appuyez sur Entrée pour commencer le redimensionnement.",select:"Sélectionner",selectAll:"Sélectionner tout",sortable:"colonne triable",collapse:"Réduire",expand:"Développer"};var Rf={};Rf={ascending:"עולה",ascendingSort:t=>`מוין לפי עמודה ${t.columnName} בסדר עולה`,columnSize:t=>`${t.value} פיקסלים`,descending:"יורד",descendingSort:t=>`מוין לפי עמודה ${t.columnName} בסדר יורד`,resizerDescription:"הקש Enter כדי לשנות את הגודל",select:"בחר",selectAll:"בחר הכול",sortable:"עמודה שניתן למיין",collapse:"כווץ",expand:"הרחב"};var Mf={};Mf={ascending:"rastući",ascendingSort:t=>`razvrstano po stupcima ${t.columnName} rastućem redoslijedom`,columnSize:t=>`${t.value} piksela`,descending:"padajući",descendingSort:t=>`razvrstano po stupcima ${t.columnName} padajućim redoslijedom`,resizerDescription:"Pritisnite Enter da biste započeli promenu veličine",select:"Odaberite",selectAll:"Odaberite sve",sortable:"stupac koji se može razvrstati",collapse:"Sažmi",expand:"Proširi"};var Ff={};Ff={ascending:"növekvő",ascendingSort:t=>`rendezve a(z) ${t.columnName} oszlop szerint, növekvő sorrendben`,columnSize:t=>`${t.value} képpont`,descending:"csökkenő",descendingSort:t=>`rendezve a(z) ${t.columnName} oszlop szerint, csökkenő sorrendben`,resizerDescription:"Nyomja le az Enter billentyűt az átméretezés megkezdéséhez",select:"Kijelölés",selectAll:"Összes kijelölése",sortable:"rendezendő oszlop",collapse:"Összecsukás",expand:"Kibontás"};var If={};If={ascending:"crescente",ascendingSort:t=>`in ordine crescente in base alla colonna ${t.columnName}`,columnSize:t=>`${t.value} pixel`,descending:"decrescente",descendingSort:t=>`in ordine decrescente in base alla colonna ${t.columnName}`,resizerDescription:"Premi Invio per iniziare a ridimensionare",select:"Seleziona",selectAll:"Seleziona tutto",sortable:"colonna ordinabile",collapse:"Comprimi",expand:"Espandi"};var Lf={};Lf={ascending:"昇順",ascendingSort:t=>`列 ${t.columnName} を昇順で並べ替え`,columnSize:t=>`${t.value} ピクセル`,descending:"降順",descendingSort:t=>`列 ${t.columnName} を降順で並べ替え`,resizerDescription:"Enter キーを押してサイズ変更を開始",select:"選択",selectAll:"すべて選択",sortable:"並べ替え可能な列",collapse:"折りたたむ",expand:"展開"};var zf={};zf={ascending:"오름차순",ascendingSort:t=>`${t.columnName} 열을 기준으로 오름차순으로 정렬됨`,columnSize:t=>`${t.value} 픽셀`,descending:"내림차순",descendingSort:t=>`${t.columnName} 열을 기준으로 내림차순으로 정렬됨`,resizerDescription:"크기 조정을 시작하려면 Enter를 누르세요.",select:"선택",selectAll:"모두 선택",sortable:"정렬 가능한 열",collapse:"접기",expand:"펼치기"};var Nf={};Nf={ascending:"didėjančia tvarka",ascendingSort:t=>`surikiuota pagal stulpelį ${t.columnName} didėjančia tvarka`,columnSize:t=>`${t.value} piks.`,descending:"mažėjančia tvarka",descendingSort:t=>`surikiuota pagal stulpelį ${t.columnName} mažėjančia tvarka`,resizerDescription:"Paspauskite „Enter“, kad pradėtumėte keisti dydį",select:"Pasirinkti",selectAll:"Pasirinkti viską",sortable:"rikiuojamas stulpelis",collapse:"Sutraukti",expand:"Išskleisti"};var Vf={};Vf={ascending:"augošā secībā",ascendingSort:t=>`kārtots pēc kolonnas ${t.columnName} augošā secībā`,columnSize:t=>`${t.value} pikseļi`,descending:"dilstošā secībā",descendingSort:t=>`kārtots pēc kolonnas ${t.columnName} dilstošā secībā`,resizerDescription:"Nospiediet Enter, lai sāktu izmēru mainīšanu",select:"Atlasīt",selectAll:"Atlasīt visu",sortable:"kārtojamā kolonna",collapse:"Sakļaut",expand:"Izvērst"};var Of={};Of={ascending:"stigende",ascendingSort:t=>`sortert etter kolonne ${t.columnName} i stigende rekkefølge`,columnSize:t=>`${t.value} piksler`,descending:"synkende",descendingSort:t=>`sortert etter kolonne ${t.columnName} i synkende rekkefølge`,resizerDescription:"Trykk på Enter for å starte størrelsesendring",select:"Velg",selectAll:"Velg alle",sortable:"kolonne som kan sorteres",collapse:"Skjul",expand:"Utvid"};var jf={};jf={ascending:"oplopend",ascendingSort:t=>`gesorteerd in oplopende volgorde in kolom ${t.columnName}`,columnSize:t=>`${t.value} pixels`,descending:"aflopend",descendingSort:t=>`gesorteerd in aflopende volgorde in kolom ${t.columnName}`,resizerDescription:"Druk op Enter om het formaat te wijzigen",select:"Selecteren",selectAll:"Alles selecteren",sortable:"sorteerbare kolom",collapse:"Samenvouwen",expand:"Uitvouwen"};var _f={};_f={ascending:"rosnąco",ascendingSort:t=>`posortowano według kolumny ${t.columnName} w porządku rosnącym`,columnSize:t=>`Liczba pikseli: ${t.value}`,descending:"malejąco",descendingSort:t=>`posortowano według kolumny ${t.columnName} w porządku malejącym`,resizerDescription:"Naciśnij Enter, aby rozpocząć zmienianie rozmiaru",select:"Zaznacz",selectAll:"Zaznacz wszystko",sortable:"kolumna z możliwością sortowania",collapse:"Zwiń",expand:"Rozwiń"};var Hf={};Hf={ascending:"crescente",ascendingSort:t=>`classificado pela coluna ${t.columnName} em ordem crescente`,columnSize:t=>`${t.value} pixels`,descending:"decrescente",descendingSort:t=>`classificado pela coluna ${t.columnName} em ordem decrescente`,resizerDescription:"Pressione Enter para começar a redimensionar",select:"Selecionar",selectAll:"Selecionar tudo",sortable:"coluna classificável",collapse:"Recolher",expand:"Expandir"};var Wf={};Wf={ascending:"ascendente",ascendingSort:t=>`Ordenar por coluna ${t.columnName} em ordem ascendente`,columnSize:t=>`${t.value} pixels`,descending:"descendente",descendingSort:t=>`Ordenar por coluna ${t.columnName} em ordem descendente`,resizerDescription:"Prima Enter para iniciar o redimensionamento",select:"Selecionar",selectAll:"Selecionar tudo",sortable:"Coluna ordenável",collapse:"Colapsar",expand:"Expandir"};var Uf={};Uf={ascending:"crescătoare",ascendingSort:t=>`sortate după coloana ${t.columnName} în ordine crescătoare`,columnSize:t=>`${t.value} pixeli`,descending:"descrescătoare",descendingSort:t=>`sortate după coloana ${t.columnName} în ordine descrescătoare`,resizerDescription:"Apăsați pe Enter pentru a începe redimensionarea",select:"Selectare",selectAll:"Selectare totală",sortable:"coloană sortabilă",collapse:"Restrângeți",expand:"Extindeți"};var Gf={};Gf={ascending:"возрастание",ascendingSort:t=>`сортировать столбец ${t.columnName} в порядке возрастания`,columnSize:t=>`${t.value} пикс.`,descending:"убывание",descendingSort:t=>`сортировать столбец ${t.columnName} в порядке убывания`,resizerDescription:"Нажмите клавишу Enter для начала изменения размеров",select:"Выбрать",selectAll:"Выбрать все",sortable:"сортируемый столбец",collapse:"Свернуть",expand:"Развернуть"};var qf={};qf={ascending:"vzostupne",ascendingSort:t=>`zoradené zostupne podľa stĺpca ${t.columnName}`,columnSize:t=>`Počet pixelov: ${t.value}`,descending:"zostupne",descendingSort:t=>`zoradené zostupne podľa stĺpca ${t.columnName}`,resizerDescription:"Stlačením klávesu Enter začnete zmenu veľkosti",select:"Vybrať",selectAll:"Vybrať všetko",sortable:"zoraditeľný stĺpec",collapse:"Zbaliť",expand:"Rozbaliť"};var Zf={};Zf={ascending:"naraščajoče",ascendingSort:t=>`razvrščeno po stolpcu ${t.columnName} v naraščajočem vrstnem redu`,columnSize:t=>`${t.value} slikovnih pik`,descending:"padajoče",descendingSort:t=>`razvrščeno po stolpcu ${t.columnName} v padajočem vrstnem redu`,resizerDescription:"Pritisnite tipko Enter da začnete spreminjati velikost",select:"Izberite",selectAll:"Izberite vse",sortable:"razvrstljivi stolpec",collapse:"Strni",expand:"Razširi"};var Yf={};Yf={ascending:"rastući",ascendingSort:t=>`sortirano po kolonama ${t.columnName} rastućim redosledom`,columnSize:t=>`${t.value} piksela`,descending:"padajući",descendingSort:t=>`sortirano po kolonama ${t.columnName} padajućim redosledom`,resizerDescription:"Pritisnite Enter da biste započeli promenu veličine",select:"Izaberite",selectAll:"Izaberite sve",sortable:"kolona koja se može sortirati",collapse:" Skupi",expand:"Proširi"};var Xf={};Xf={ascending:"stigande",ascendingSort:t=>`sorterat på kolumn ${t.columnName} i stigande ordning`,columnSize:t=>`${t.value} pixlar`,descending:"fallande",descendingSort:t=>`sorterat på kolumn ${t.columnName} i fallande ordning`,resizerDescription:"Tryck på Retur för att börja ändra storlek",select:"Markera",selectAll:"Markera allt",sortable:"sorterbar kolumn",collapse:"Dölj",expand:"Expandera"};var Jf={};Jf={ascending:"artan sırada",ascendingSort:t=>`${t.columnName} sütuna göre artan düzende sırala`,columnSize:t=>`${t.value} piksel`,descending:"azalan sırada",descendingSort:t=>`${t.columnName} sütuna göre azalan düzende sırala`,resizerDescription:"Yeniden boyutlandırmak için Enter'a basın",select:"Seç",selectAll:"Tümünü Seç",sortable:"Sıralanabilir sütun",collapse:"Daralt",expand:"Genişlet"};var Qf={};Qf={ascending:"висхідний",ascendingSort:t=>`відсортовано за стовпцем ${t.columnName} у висхідному порядку`,columnSize:t=>`${t.value} пікс.`,descending:"низхідний",descendingSort:t=>`відсортовано за стовпцем ${t.columnName} у низхідному порядку`,resizerDescription:"Натисніть Enter, щоб почати зміну розміру",select:"Вибрати",selectAll:"Вибрати все",sortable:"сортувальний стовпець",collapse:"Згорнути",expand:"Розгорнути"};var ep={};ep={ascending:"升序",ascendingSort:t=>`按列 ${t.columnName} 升序排序`,columnSize:t=>`${t.value} 像素`,descending:"降序",descendingSort:t=>`按列 ${t.columnName} 降序排序`,resizerDescription:"按“输入”键开始调整大小。",select:"选择",selectAll:"全选",sortable:"可排序的列",collapse:"折叠",expand:"扩展"};var tp={};tp={ascending:"遞增",ascendingSort:t=>`已依據「${t.columnName}」欄遞增排序`,columnSize:t=>`${t.value} 像素`,descending:"遞減",descendingSort:t=>`已依據「${t.columnName}」欄遞減排序`,resizerDescription:"按 Enter 鍵以開始調整大小",select:"選取",selectAll:"全選",sortable:"可排序的欄",collapse:"收合",expand:"展開"};var Gt={};Gt={"ar-AE":Cf,"bg-BG":Ef,"cs-CZ":wf,"da-DK":Sf,"de-DE":Df,"el-GR":kf,"en-US":Pf,"es-ES":Tf,"et-EE":Af,"fi-FI":Bf,"fr-FR":Kf,"he-IL":Rf,"hr-HR":Mf,"hu-HU":Ff,"it-IT":If,"ja-JP":Lf,"ko-KR":zf,"lt-LT":Nf,"lv-LV":Vf,"nb-NO":Of,"nl-NL":jf,"pl-PL":_f,"pt-BR":Hf,"pt-PT":Wf,"ro-RO":Uf,"ru-RU":Gf,"sk-SK":qf,"sl-SI":Zf,"sr-SP":Yf,"sv-SE":Xf,"tr-TR":Jf,"uk-UA":Qf,"zh-CN":ep,"zh-TW":tp};class W3 extends $f{isCell(e){return e.type==="cell"||e.type==="rowheader"||e.type==="column"}getKeyBelow(e,n){let l=this.collection.getItem(e);if(!l)return null;if(l.type==="column"){let r=At(Ee(l,this.collection));if(r)return r.key;let o=this.getFirstKey();return o==null||!this.collection.getItem(o)?null:super.getKeyForItemInRowByIndex(o,l.index)}return super.getKeyBelow(e,n)}getKeyAbove(e,n){let l=this.collection.getItem(e);if(!l)return null;if(l.type==="column"){let i=l.parentKey!=null?this.collection.getItem(l.parentKey):null;return i&&i.type==="column"?i.key:null}let r=super.getKeyAbove(e,n),o=r!=null?this.collection.getItem(r):null;return o&&o.type!=="headerrow"?r:this.isCell(l)?this.collection.columns[l.index].key:this.collection.columns[0].key}findNextColumnKey(e){let n=this.findNextKey(e.key,r=>r.type==="column");if(n!=null)return n;let l=this.collection.headerRows[e.level];for(let r of Ee(l,this.collection))if(r.type==="column")return r.key;return null}findPreviousColumnKey(e){let n=this.findPreviousKey(e.key,o=>o.type==="column");if(n!=null)return n;let l=this.collection.headerRows[e.level],r=[...Ee(l,this.collection)];for(let o=r.length-1;o>=0;o--){let i=r[o];if(i.type==="column")return i.key}return null}getKeyRightOf(e){let n=this.collection.getItem(e);return n?n.type==="column"?this.direction==="rtl"?this.findPreviousColumnKey(n):this.findNextColumnKey(n):super.getKeyRightOf(e):null}getKeyLeftOf(e){let n=this.collection.getItem(e);return n?n.type==="column"?this.direction==="rtl"?this.findNextColumnKey(n):this.findPreviousColumnKey(n):super.getKeyLeftOf(e):null}getKeyForSearch(e,n){if(!this.collator)return null;let l=this.collection,r=n??this.getFirstKey();if(r==null)return null;let o=l.getItem(r);(o==null?void 0:o.type)==="cell"&&(r=o.parentKey??null);let i=!1;for(;r!=null;){let u=l.getItem(r);if(!u)return null;if(u.textValue){let a=u.textValue.slice(0,e.length);if(this.collator.compare(a,e)===0)return u.key}for(let a of Ee(u,this.collection)){let c=l.columns[a.index];if(l.rowHeaderColumnKeys.has(c.key)&&a.textValue){let f=a.textValue.slice(0,e.length);if(this.collator.compare(f,e)===0){let d=n!=null?l.getItem(n):o;return(d==null?void 0:d.type)==="cell"?a.key:u.key}}}r=this.getKeyBelow(r),r==null&&!i&&(r=this.getFirstKey(),i=!0)}return null}}function U3(t){return t&&t.__esModule?t.default:t}function G3(t,e,n){let{keyboardDelegate:l,isVirtualized:r,layoutDelegate:o,layout:i}=t,u=Pn({usage:"search",sensitivity:"base"}),{direction:a}=Pe(),c=e.selectionManager.disabledBehavior,f=s.useMemo(()=>l||new W3({collection:e.collection,disabledKeys:e.disabledKeys,disabledBehavior:c,ref:n,direction:a,collator:u,layoutDelegate:o,layout:i}),[l,e.collection,e.disabledKeys,c,n,a,u,o,i]),d=$e(t.id);po.set(e,d);let{gridProps:b}=H3({...t,id:d,keyboardDelegate:f},e,n);r&&(b["aria-rowcount"]=e.collection.size+e.collection.headerRows.length),e.treeColumn!=null&&(b.role="treegrid");let{column:p,direction:h}=e.sortDescriptor||{},y=_e(U3(Gt),"@react-aria/table"),m=s.useMemo(()=>{var E;let v=((E=e.collection.columns.find(C=>C.key===p))==null?void 0:E.textValue)??"";return h&&p?y.format(`${h}Sort`,{columnName:v}):void 0},[h,p,e.collection.columns]),g=$n(m);return Tr(()=>{m&&yt(m,"assertive",500)},[m]),{gridProps:W(b,g,{"aria-describedby":[g["aria-describedby"],b["aria-describedby"]].filter(Boolean).join(" ")})}}function np(t,e,n){let{node:l,isVirtualized:r,focusMode:o="child",shouldSelectOnPressUp:i,onAction:u}=t,{direction:a}=Pe(),{keyboardDelegate:c,actions:{onCellAction:f}}=fo.get(e),d=s.useRef(null),b=()=>{if(n.current){let v=ze(n.current);if(o==="child"){if(xt(n.current)&&n.current!==ie())return;let E=e.selectionManager.childFocusStrategy==="last"?Hl(v):v.firstChild();if(E){xe(E);return}}(d.current!=null&&l.key!==d.current||!xt(n.current))&&xe(n.current)}},{itemProps:p,isPressed:h}=Yr({selectionManager:e.selectionManager,key:l.key,ref:n,isVirtualized:r,focus:b,shouldSelectOnPressUp:i,onAction:f?()=>f(l.key):u,isDisabled:e.collection.size===0}),y=v=>{var R,T,F,B,L;let E=ie();if(!ne(v.currentTarget,U(v))||e.isKeyboardNavigationDisabled||!n.current||!E)return;let C=ze(n.current);switch(C.currentNode=E,v.key){case"ArrowLeft":{let M=a==="rtl"?C.nextNode():C.previousNode();if(o==="child"&&M===n.current&&(M=null),v.preventDefault(),v.stopPropagation(),M)xe(M),it(M,{containingElement:Xe(n.current)});else{if(((R=c.getKeyLeftOf)==null?void 0:R.call(c,l.key))!==l.key){(T=n.current.parentElement)==null||T.dispatchEvent(new KeyboardEvent(v.nativeEvent.type,v.nativeEvent));break}o==="cell"&&a==="rtl"?(xe(n.current),it(n.current,{containingElement:Xe(n.current)})):(C.currentNode=n.current,M=a==="rtl"?C.firstChild():Hl(C),M&&(xe(M),it(M,{containingElement:Xe(n.current)})))}break}case"ArrowRight":{let M=a==="rtl"?C.previousNode():C.nextNode();if(o==="child"&&M===n.current&&(M=null),v.preventDefault(),v.stopPropagation(),M)xe(M),it(M,{containingElement:Xe(n.current)});else{if(((F=c.getKeyRightOf)==null?void 0:F.call(c,l.key))!==l.key){(B=n.current.parentElement)==null||B.dispatchEvent(new KeyboardEvent(v.nativeEvent.type,v.nativeEvent));break}o==="cell"&&a==="ltr"?(xe(n.current),it(n.current,{containingElement:Xe(n.current)})):(C.currentNode=n.current,M=a==="rtl"?Hl(C):C.firstChild(),M&&(xe(M),it(M,{containingElement:Xe(n.current)})))}break}case"ArrowUp":case"ArrowDown":!v.altKey&&ne(n.current,U(v))&&(v.stopPropagation(),v.preventDefault(),(L=n.current.parentElement)==null||L.dispatchEvent(new KeyboardEvent(v.nativeEvent.type,v.nativeEvent)));break}},m=v=>{if(d.current=l.key,U(v)!==n.current){zt()||e.selectionManager.setFocusedKey(l.key);return}requestAnimationFrame(()=>{o==="child"&&ie()===n.current&&b()})},g=W(p,{role:"gridcell",onKeyDownCapture:y,"aria-colspan":l.colSpan,"aria-colindex":l.colIndex!=null?l.colIndex+1:void 0,colSpan:r?void 0:l.colSpan,onFocus:m});return r&&(g["aria-colindex"]=(l.colIndex??l.index)+1),i&&g.tabIndex!=null&&g.onPointerDown==null&&(g.onPointerDown=v=>{let E=v.currentTarget,C=E.getAttribute("tabindex");E.removeAttribute("tabindex"),requestAnimationFrame(()=>{C!=null&&E.setAttribute("tabindex",C)})}),{gridCellProps:g,isPressed:h}}function Hl(t){let e=null,n=null;do n=t.lastChild(),n&&(e=n);while(n);return e}function q3(t){return t&&t.__esModule?t.default:t}function Z3(t,e,n){var g,v;let{node:l}=t,r=l.props.allowsSorting,{gridCellProps:o}=np({...t,focusMode:"child"},e,n),i=l.props.isSelectionCell&&e.selectionManager.selectionMode==="single",{pressProps:u,isPressed:a}=lt({isDisabled:!r||i,onPress(){e.sort(l.key)},ref:n}),{focusableProps:c}=wt({},n),f,d=((g=e.sortDescriptor)==null?void 0:g.column)===l.key,b=(v=e.sortDescriptor)==null?void 0:v.direction;l.props.allowsSorting&&!an()&&(f=d?b:"none");let p=_e(q3(Gt),"@react-aria/table"),h;r&&(h=`${p.format("sortable")}`,d&&b&&an()&&(h=`${h}, ${p.format(b)}`));let y=$n(h),m=e.collection.size===0;return s.useEffect(()=>{m&&e.selectionManager.focusedKey===l.key&&e.selectionManager.setFocusedKey(null)},[m,e.selectionManager,l.key]),{columnHeaderProps:{...W(c,o,u,y,m?{tabIndex:-1}:null),role:"columnheader",id:vf(e,l.key),"aria-colspan":l.colSpan&&l.colSpan>1?l.colSpan:void 0,"aria-sort":f},isPressed:a}}function Y3(t,e,n){var h,y;let{node:l,isVirtualized:r,shouldSelectOnPressUp:o,onAction:i}=t,{actions:u,shouldSelectOnPressUp:a}=fo.get(e),c=u.onRowAction?()=>{var m;return(m=u.onRowAction)==null?void 0:m.call(u,l.key)}:i,{itemProps:f,...d}=Yr({selectionManager:e.selectionManager,key:l.key,ref:n,isVirtualized:r,shouldSelectOnPressUp:a||o,onAction:c||(h=l==null?void 0:l.props)!=null&&h.onAction?ft((y=l==null?void 0:l.props)==null?void 0:y.onAction,c):void 0,isDisabled:e.collection.size===0}),b=e.selectionManager.isSelected(l.key),p={role:"row","aria-selected":e.selectionManager.selectionMode!=="none"?b:void 0,"aria-disabled":d.isDisabled||void 0,...f};return r&&(p["aria-rowindex"]=l.index+1),{rowProps:p,...d}}function X3(t){return t&&t.__esModule?t.default:t}const ou={expand:{ltr:"ArrowRight",rtl:"ArrowLeft"},collapse:{ltr:"ArrowLeft",rtl:"ArrowRight"}};function J3(t,e,n){var y,m;let{node:l,isVirtualized:r}=t,{rowProps:o,...i}=Y3(t,e,n),{direction:u}=Pe();r&&e.treeColumn==null?o["aria-rowindex"]=l.index+1+e.collection.headerRows.length:delete o["aria-rowindex"];let a=e.treeColumn!=null&&(e.expandedKeys==="all"||e.expandedKeys.has(l.key)),c=_e(X3(Gt),"@react-aria/table"),f=cn({"aria-label":a?c.format("collapse"):c.format("expand"),"aria-labelledby":Cr(e,l.key)}),d={},b={};if(e.treeColumn!=null){let g=e.collection.getItem(l.key);if(g!=null){let v=iu(e.collection,l),E=((y=g.props)==null?void 0:y.hasChildRows)||((m=g.props)==null?void 0:m.UNSTABLE_childItems)||(v==null?void 0:v.type)!=="cell",C=e.collection.getItem(l.parentKey),R=C.type==="tablebody"||C.type==="body",T=iu(e.collection,C);for(;T&&T.type!=="item"&&T.prevKey!=null;)T=e.collection.getItem(T.prevKey);d={onKeyDown:F=>{F.key===ou.expand[u]&&e.selectionManager.focusedKey===g.key&&E&&e.expandedKeys!=="all"&&!e.expandedKeys.has(g.key)?(e.toggleKey(g.key),F.stopPropagation()):F.key===ou.collapse[u]&&e.selectionManager.focusedKey===g.key&&(e.expandedKeys!=="all"?E&&e.expandedKeys.has(g.key)?(e.toggleKey(g.key),F.stopPropagation()):!e.expandedKeys.has(g.key)&&g.parentKey!=null&&g.level>0&&(e.selectionManager.setFocusedKey(g.parentKey),F.stopPropagation()):e.expandedKeys==="all"&&(e.toggleKey(g.key),F.stopPropagation()))},"aria-expanded":E?e.expandedKeys==="all"||e.expandedKeys.has(l.key):void 0,"aria-level":g.level+1,"aria-posinset":g.index-(R?0:e.collection.columnCount)+1,"aria-setsize":T.index-(R?0:e.collection.columnCount)+1},b={isDisabled:i.isDisabled,onPress:()=>{i.isDisabled||(e.toggleKey(l.key),e.selectionManager.setFocused(!0),e.selectionManager.setFocusedKey(l.key))},excludeFromTabOrder:!0,preventFocusOnPress:!0,"data-react-aria-prevent-focus":!0,...f}}}let p=Mp(l.props),h=i.hasAction?p:{};return{rowProps:{...W(o,d,h),"aria-labelledby":Cr(e,l.key)},expandButtonProps:b,...i}}function iu(t,e){return"lastChildKey"in e?e.lastChildKey!=null?t.getItem(e.lastChildKey):null:Array.from(e.childNodes).findLast(n=>n.parentKey===e.key)}function Q3(t,e,n){let{node:l,isVirtualized:r}=t,o={role:"row"};return r&&e.treeColumn==null&&(o["aria-rowindex"]=l.index+1),{rowProps:o}}function e0(t,e,n){var i;let{gridCellProps:l,isPressed:r}=np(t,e,n),o=(i=t.node.column)==null?void 0:i.key;return o!=null&&e.collection.rowHeaderColumnKeys.has(o)&&(l.role="rowheader",l.id=xf(e,t.node.parentKey,o)),{gridCellProps:l,isPressed:r}}function t0(t){return t&&t.__esModule?t.default:t}function n0(t,e){let{key:n}=t;const{checkboxProps:l}=T3(t,e);return{checkboxProps:{...l,"aria-labelledby":`${l.id} ${Cr(e,n)}`}}}function l0(t){let{isEmpty:e,isSelectAll:n,selectionMode:l}=t.selectionManager;return{checkboxProps:{"aria-label":_e(t0(Gt),"@react-aria/table").format(l==="single"?"select":"selectAll"),isSelected:n,isDisabled:l!=="multiple"||t.collection.size===0||t.collection.rows.length===1&&t.collection.rows[0].type==="loader",isIndeterminate:!e&&!n,onChange:()=>t.selectionManager.toggleSelectAll()}}}function r0(t){return t&&t.__esModule?t.default:t}function o0(t,e,n){let{column:l,triggerRef:r,isDisabled:o,onResizeStart:i,onResize:u,onResizeEnd:a,"aria-label":c}=t;const f=_e(r0(Gt),"@react-aria/table");let d=$e(),b=e.resizingColumn===l.key,p=s.useRef(b),h=s.useRef(null),y=s.useRef(!1),m=e.tableState.isKeyboardNavigationDisabled,{direction:g}=Pe(),v=s.useCallback(S=>{p.current||(h.current=e.updateResizedColumns(S.key,e.getColumnWidth(S.key)),e.startResize(S.key),e.tableState.setKeyboardNavigationDisabled(!0),i==null||i(h.current)),p.current=!0},[e,i]),E=s.useCallback((S,N)=>{let O=e.updateResizedColumns(S.key,N);u==null||u(O),h.current=O},[e,u]),C=s.useCallback(S=>{p.current&&(h.current==null&&(h.current=e.updateResizedColumns(S.key,e.getColumnWidth(S.key))),e.endResize(),e.tableState.setKeyboardNavigationDisabled(!1),a==null||a(h.current),p.current=!1,r!=null&&r.current&&!y.current&&xe(r.current)),h.current=null},[e,r,a]),{keyboardProps:R}=cl({onKeyDown:S=>{m?(S.key==="Escape"||S.key==="Enter"||S.key===" "||S.key==="Tab")&&(S.preventDefault(),C(l)):(S.continuePropagation(),S.key==="Enter"&&v(l))}});const T=s.useRef(0),{moveProps:F}=io({onMoveStart(){T.current=e.getColumnWidth(l.key),v(l)},onMove(S){let{deltaX:N,deltaY:O,pointerType:X}=S;g==="rtl"&&(N*=-1),X==="keyboard"&&(O!==0&&N===0&&(N=O*-1),N*=10),N!==0&&(T.current+=N,E(l,T.current))},onMoveEnd(S){let{pointerType:N}=S;T.current=0,(N==="mouse"||N==="touch"&&y.current)&&C(l)}});let B=s.useCallback(S=>{var N;m&&((N=F.onKeyDown)==null||N.call(F,S))},[m,F]),L=Math.floor(e.getColumnMinWidth(l.key)),M=Math.floor(e.getColumnMaxWidth(l.key));M===1/0&&(M=Number.MAX_SAFE_INTEGER);let V=Math.floor(e.getColumnWidth(l.key)),H=ta();H==="virtual"&&typeof window<"u"&&"ontouchstart"in window&&(H="touch");let j=(r==null?void 0:r.current)==null&&(H==="keyboard"||H==="virtual")&&!b?f.format("resizerDescription"):void 0,$=$n(j),D={"aria-label":c,"aria-orientation":"horizontal","aria-labelledby":`${d} ${vf(e.tableState,l.key)}`,"aria-valuetext":f.format("columnSize",{value:V}),type:"range",min:L,max:M,value:V,...$};const A=s.useCallback(()=>{n.current&&xe(n.current)},[n]);let w=e.resizingColumn,P=s.useRef(null),k=we(v);s.useEffect(()=>{if(P.current!==w&&w!=null&&w===l.key){y.current=ie()===n.current,k(l);let S=setTimeout(()=>A(),0),N=setTimeout(A,400);return()=>{clearTimeout(S),clearTimeout(N)}}P.current=w},[w,l,A,n]);let K=S=>{let N=e.getColumnWidth(l.key),O=parseFloat(U(S).value);O>N?O=N+10:O=N-10,E(l,O)},{pressProps:_}=lt({preventFocusOnPress:!0,onPressStart:S=>{if(!(S.ctrlKey||S.altKey||S.metaKey||S.shiftKey||S.pointerType==="keyboard")){if(S.pointerType==="virtual"&&e.resizingColumn!=null){C(l);return}A(),S.pointerType!=="virtual"&&v(l)}},onPress:S=>{(S.pointerType==="touch"&&y.current||S.pointerType==="mouse")&&e.resizingColumn!=null&&C(l)}}),{visuallyHiddenProps:Z}=wn();return{resizerProps:W(R,{...F,onKeyDown:B},_,{style:{touchAction:"none"}}),inputProps:W(Z,{id:d,onBlur:()=>{C(l)},onChange:K,disabled:o},D),isResizing:b}}function i0(){return{rowGroupProps:{role:"rowgroup"}}}function lp(){return i0()}function u0(t){return t&&t.__esModule?t.default:t}class a0 extends Ya{withExpandedKeys(e){let n=this.clone();return n.expandedKeys=e,n.frozen=this.frozen,n.rows=Array.from(n.getRows()),n}addNode(e){super.addNode(e),this.columnsDirty||(this.columnsDirty=e.type==="column"),e.type==="tableheader"&&(this.head=e)}getRows(){let e=[];for(let n of this)(n.type==="tablebody"||n.type==="tablefooter")&&e.push(...this.getChildren(n.key));return e}get body(){for(let e of this)if(e.type==="tablebody")return e;return new rl(-2)}commit(e,n,l=!1){this.updateColumns(l),this.firstKey=e,this.lastKey=n,this.rows=[];for(let r of this.getRows()){let o=r.lastChildKey;if(o!=null){let i=this.getItem(o);for(;i&&i.type!=="cell";)i=i.prevKey!=null?this.getItem(i.prevKey):null;if(i){let u=(i.colIndex??i.index)+(i.colSpan??1);if(u!==this.columns.length&&!l)throw new Error(`Cell count must match column count. Found ${u} cells and ${this.columns.length} columns.`)}}this.rows.push(r)}super.commit(e,n,l)}updateColumns(e){if(!this.columnsDirty)return;this.rowHeaderColumnKeys=new Set,this.columns=[];let n=new Map,l=r=>{switch(r.type){case"column":n.set(r.key,r),r.hasChildNodes||(r.index=this.columns.length,this.columns.push(r),r.props.isRowHeader&&this.rowHeaderColumnKeys.add(r.key));break}for(let o of this.getChildren(r.key))l(o)};for(let r of this.getChildren(this.head.key))l(r);if(this.headerRows=mf(n,this.columns),this.columnsDirty=!1,this.rowHeaderColumnKeys.size===0&&this.columns.length>0&&!e)throw new Error("A table must have at least one Column with the isRowHeader prop set to true")}get columnCount(){return this.columns.length}*[Symbol.iterator](){let e=this.firstKey;for(;e!=null;){let n=this.getItem(e);n&&(yield n),e=(n==null?void 0:n.nextKey)??null}}getFirstKey(){for(let e of this)if(e.type==="tablebody")return e.firstChildKey??null;return null}getLastKey(){let e=this.lastKey;if(e==null)return null;let n=this.getItem(e);for(;(n==null?void 0:n.lastChildKey)!=null&&(n.type!=="item"||this.expandedKeys.has(n.key));)n=this.getItem(n.lastChildKey);return n==null?void 0:n.key}getKeyAfter(e){let n=this.getItem(e);if((n==null?void 0:n.type)==="column")return n.nextKey??null;if(!n)return null;if(n.type==="item"&&n.firstChildKey!=null&&this.expandedKeys.has(n.key)){let l=this.getItem(n.firstChildKey);for(;l;){if(l.type==="item")return l.key;l=l.nextKey!=null?this.getItem(l.nextKey):null}}return super.getKeyAfter(e)}getKeyBefore(e){var r;let n=this.getItem(e);if((n==null?void 0:n.type)==="column")return n.prevKey??null;if(!n)return null;let l=null;if(n.prevKey!=null){for(n=this.getItem(n.prevKey);n&&(n.type!=="item"||this.expandedKeys.has(n.key))&&n.lastChildKey!=null;)n=this.getItem(n.lastChildKey);l=(n==null?void 0:n.key)??null}return l==null&&(l=n.parentKey),l!=null&&((r=this.getItem(l))==null?void 0:r.type)==="tableheader"?null:l}getChildren(e){let n=this.getItem(e);if(!n){for(let r of this.headerRows)if(r.key===e)return r.childNodes}let l=this;return(n==null?void 0:n.type)==="tablebody"||(n==null?void 0:n.type)==="tablefooter"?{*[Symbol.iterator](){let r=n.firstChildKey,o=r!=null?l.getItem(r):null;for(;o;){yield o;let i=l.getKeyAfter(o.key);if(o=i!=null?l.getItem(i):null,o&&o.parentKey===n.parentKey)break}}}:{*[Symbol.iterator](){let r=l.getItem(e),o=(r==null?void 0:r.firstChildKey)!=null?l.getItem(r.firstChildKey):null;for(;o&&(yield o,o=o.nextKey!=null?l.getItem(o.nextKey):null,!((r==null?void 0:r.type)==="item"&&(o==null?void 0:o.type)!=="cell")););}}}clone(){let e=super.clone();return e.headerRows=this.headerRows,e.columns=this.columns,e.rows=this.rows,e.rowHeaderColumnKeys=this.rowHeaderColumnKeys,e.head=this.head,e}getTextValue(e){let n=this.getItem(e);if(!n)return"";if(n.textValue)return n.textValue;let l=this.rowHeaderColumnKeys,r=[];for(let o of this.getChildren(e)){let i=this.columns[o.index];if(l.has(i.key)&&o.textValue&&r.push(o.textValue),r.length===l.size)break}return r.join(" ")}constructor(...e){super(...e),this.headerRows=[],this.columns=[],this.rows=[],this.rowHeaderColumnKeys=new Set,this.head=new ll(-1),this.columnsDirty=!0,this.expandedKeys=new Set}}const bo=s.createContext(null),s0=s.forwardRef(function(e,n){let l=Te(n),r=s.useRef(null),o=s.useRef(null),[i,u]=s.useState(0);le(()=>{let c=r.current;for(;c&&c!==l.current&&!st(c);)c=c.parentElement;o.current=c},[l]),dn({ref:o,box:"border-box",onResize(){var c;u(((c=o.current)==null?void 0:c.clientWidth)??0)}}),le(()=>{var c;u(((c=o.current)==null?void 0:c.clientWidth)??0)},[]);let a=s.useMemo(()=>({tableRef:r,scrollRef:o,tableWidth:i,useTableColumnResizeState:z3,onResizeStart:e.onResizeStart,onResize:e.onResize,onResizeEnd:e.onResizeEnd}),[r,i,e.onResizeStart,e.onResize,e.onResizeEnd]);return x.createElement(ee.div,{render:e.render,...oe(e,{global:!0}),ref:l,className:e.className||"react-aria-ResizableTableContainer",style:e.style,onScroll:e.onScroll},x.createElement(bo.Provider,{value:a},e.children))}),c0=s.createContext(null),Ze=s.createContext(null),ho=s.createContext(null),d0=s.forwardRef(function(e,n){var f;[e,n]=ve(e,n,c0);let l=Jr(e),{selectionBehavior:r,selectionMode:o,disallowEmptySelection:i}=l,u=!!((f=e.dragAndDropHooks)!=null&&f.useDraggableCollectionState),a=s.useMemo(()=>({selectionBehavior:o==="none"?null:r,selectionMode:o,disallowEmptySelection:i,allowsDragging:u}),[r,o,i,u]),c=x.createElement(b0.Provider,{value:a},x.createElement(Dn,e));return x.createElement(Ur,{content:c,createCollection:()=>new a0},d=>x.createElement(p0,{props:e,forwardedRef:n,selectionState:l,collection:d}))});let f0=s.forwardRef(function(e,n){let{isVirtualized:l}=s.useContext(pe);return l?x.createElement(ee.div,{...e,ref:n}):x.createElement(ee.table,{...e,ref:n})});const uu={expand:{ltr:"ArrowRight",rtl:"ArrowLeft"},collapse:{ltr:"ArrowLeft",rtl:"ArrowRight"}};function p0({props:t,forwardedRef:e,selectionState:n,collection:l}){[t,e]=ve(t,e,pr);let{shouldUseVirtualFocus:r,disallowTypeAhead:o,filter:i,...u}=t,a=s.useContext(bo);e=Te(s.useMemo(()=>pt(e,a==null?void 0:a.tableRef),[e,a==null?void 0:a.tableRef]));let[c,f]=ct(t.expandedKeys?new Set(t.expandedKeys):void 0,t.defaultExpandedKeys?new Set(t.defaultExpandedKeys):new Set,t.onExpandedChange);l=s.useMemo(()=>l.withExpandedKeys(c),[l,c]);let d=O3({...u,collection:l,children:void 0,UNSAFE_selectionState:n,expandedKeys:c,onExpandedChange:f}),b=j3(d,i),{isVirtualized:p,layoutDelegate:h,dropTargetDelegate:y,CollectionRoot:m}=s.useContext(pe),{dragAndDropHooks:g}=t,{gridProps:v}=G3({...u,layoutDelegate:h,isVirtualized:p},b,e),E=b.selectionManager,C=!!(g!=null&&g.useDraggableCollectionState),R=!!(g!=null&&g.useDroppableCollectionState);s.useRef(C),s.useRef(R),s.useEffect(()=>{},[C,R]);let T,F,B,L=!1,M=null,V=s.useRef(null),{direction:H}=Pe(),[j]=s.useState(()=>new A3);if(C&&g){T=g.useDraggableCollectionState({collection:b.collection,selectionManager:E,preview:g.renderDragPreview?V:void 0}),g.useDraggableCollection({},T,e);let Z=g.DragPreview;M=g.renderDragPreview?x.createElement(Z,{ref:V},g.renderDragPreview):null}if(R&&g){F=g.useDroppableCollectionState({collection:b.collection,selectionManager:E});let Z=new gl({collection:b.collection,disabledKeys:E.disabledKeys,disabledBehavior:E.disabledBehavior,ref:e,layoutDelegate:h}),S=g.dropTargetDelegate||y||new g.ListDropTargetDelegate(l.rows,e);j.setup(S,d,H),B=g.useDroppableCollection({keyboardDelegate:Z,dropTargetDelegate:j,onDropActivate:N=>{var O;if(N.target.type==="item"){let X=N.target.key,J=d.collection.getItem(X),de=c.has(X);J&&J.hasChildNodes&&(!de||(O=g==null?void 0:g.isVirtualDragging)!=null&&O.call(g))&&d.toggleKey(X)}},onKeyDown:N=>{let O=F==null?void 0:F.target;if(O&&O.type==="item"&&O.dropPosition==="on"){let X=d.collection.getItem(O.key);(N.key===uu.expand[H]&&(X!=null&&X.hasChildNodes)&&!d.expandedKeys.has(O.key)||N.key===uu.collapse[H]&&(X!=null&&X.hasChildNodes)&&d.expandedKeys.has(O.key))&&d.toggleKey(O.key)}}},F,e),L=F.isDropTarget({type:"root"})}let{focusProps:$,isFocused:D,isFocusVisible:A}=Ve(),w=ae({...t,children:void 0,defaultClassName:"react-aria-Table",values:{isDropTarget:L,isFocused:D,isFocusVisible:A,state:b}}),P=!!(C&&!(T!=null&&T.isDisabled)),k=w.style,K=null;a&&(K=a.useTableColumnResizeState({tableWidth:a.tableWidth},b),p||(k={...k,tableLayout:"fixed",width:"min-content"}));let _=oe(t,{global:!0});return x.createElement(Me,{values:[[Ze,b],[ho,K],[qe,{dragAndDropHooks:g,dragState:T,dropState:F}],[no,{render:D0}],[pr,null],[ls,null]]},x.createElement(Or,null,x.createElement(f0,{...W(_,w,v,$,B==null?void 0:B.collectionProps),style:k,ref:e,slot:t.slot||void 0,onScroll:t.onScroll,"data-allows-dragging":P||void 0,"data-drop-target":L||void 0,"data-focused":D||void 0,"data-focus-visible":A||void 0},x.createElement(rs,null,x.createElement(m,{collection:b.collection,scrollRef:(a==null?void 0:a.scrollRef)??e,persistedKeys:Rc(E,g,F)})))),M)}const b0=s.createContext(null),Co=class Co extends Ge{};Co.type="tableheader";let ll=Co,h0=s.forwardRef(function(e,n){let{isVirtualized:l}=s.useContext(pe);return l?x.createElement(ee.div,{...e,ref:n}):x.createElement(ee.thead,{...e,ref:n})});const m0=ml(ll,(t,e)=>{let n=s.useContext(Ze).collection,l=Wr({items:n.headerRows,children:s.useCallback(a=>{switch(a.type){case"headerrow":return x.createElement(y0,{item:a});default:throw new Error("Unsupported node type in TableHeader: "+a.type)}},[])}),{rowGroupProps:r}=lp(),{hoverProps:o,isHovered:i}=Fe({onHoverStart:t.onHoverStart,onHoverChange:t.onHoverChange,onHoverEnd:t.onHoverEnd}),u=ae({...t,children:void 0,defaultClassName:"react-aria-TableHeader",values:{isHovered:i}});return x.createElement(h0,{...W(oe(t,{global:!0}),r,o),...u,ref:e,"data-hovered":i||void 0},l)},t=>x.createElement(Dn,{dependencies:t.dependencies,items:t.columns},t.children));let g0=s.forwardRef(function(e,n){let{isVirtualized:l}=s.useContext(pe);return l?x.createElement("div",{...e,ref:n}):x.createElement("tr",{...e,ref:n})});function y0({item:t}){let e=s.useRef(null),n=s.useContext(Ze),{isVirtualized:l,CollectionBranch:r}=s.useContext(pe),{rowProps:o}=Q3({node:t,isVirtualized:l},n,e),{checkboxProps:i}=l0(n);return x.createElement(g0,{...o,ref:e},x.createElement(Me,{values:[[oo,{slots:{selection:i}}],[Wc,{slots:{selection:i}}]]},x.createElement(r,{collection:n.collection,parent:t})))}const Eo=class Eo extends Ge{};Eo.type="column";let Er=Eo,$0=s.forwardRef(function(e,n){let{isVirtualized:l}=s.useContext(pe);return l?x.createElement(ee.div,{...e,ref:n}):x.createElement(ee.th,{...e,ref:n})});const v0=Sn(Er,(t,e,n)=>{var v,E;let l=Te(e),r=s.useContext(Ze),{isVirtualized:o}=s.useContext(pe),{columnHeaderProps:i,isPressed:u}=Z3({node:n,isVirtualized:o},r,l),{isFocused:a,isFocusVisible:c,focusProps:f}=Ve(),d=s.useContext(ho),b=!1;d&&(b=d.resizingColumn===n.key);let{hoverProps:p,isHovered:h}=Fe({isDisabled:!t.allowsSorting}),y=ae({...t,id:void 0,children:n.rendered,defaultClassName:"react-aria-Column",values:{isHovered:h,isPressed:u,isFocused:a,isFocusVisible:c,allowsSorting:n.props.allowsSorting,sortDirection:((v=r.sortDescriptor)==null?void 0:v.column)===n.key?r.sortDescriptor.direction:void 0,isResizing:b,startResize:()=>{if(d)d.startResize(n.key),r.setKeyboardNavigationDisabled(!0);else throw new Error("Wrap your in a to enable column resizing")},sort:C=>{r.sort(n.key,C)}}}),m=y.style;d&&(m={...m,width:d.getColumnWidth(n.key)});let g=oe(t,{global:!0});return delete g.id,x.createElement($0,{...W(g,i,f,p),...y,style:m,ref:l,"data-hovered":h||void 0,"data-pressed":u||void 0,"data-focused":a||void 0,"data-focus-visible":c||void 0,"data-resizing":b||void 0,"data-allows-sorting":n.props.allowsSorting||void 0,"data-sort-direction":((E=r.sortDescriptor)==null?void 0:E.column)===n.key?r.sortDescriptor.direction:void 0},x.createElement(Me,{values:[[rp,{column:n,triggerRef:l}],[pe,Gr]]},y.children))}),rp=s.createContext(null),x0=s.forwardRef(function(e,n){let l=s.useContext(ho);if(!l)throw new Error("Wrap your
in a to enable column resizing");let r=_e(u0(Kc),"react-aria-components"),{onResizeStart:o,onResize:i,onResizeEnd:u}=s.useContext(bo),{column:a,triggerRef:c}=s.useContext(rp),f=s.useRef(null),{resizerProps:d,inputProps:b,isResizing:p}=o0({column:a,"aria-label":e["aria-label"]||r.format("tableResizer"),onResizeStart:o,onResize:i,onResizeEnd:u,triggerRef:c},l,f),{focusProps:h,isFocused:y,isFocusVisible:m}=Ve(),{hoverProps:g,isHovered:v}=Fe(e),E=l.getColumnMinWidth(a.key)>=l.getColumnWidth(a.key),C=l.getColumnMaxWidth(a.key)<=l.getColumnWidth(a.key),{direction:R}=Pe(),T="both";E?T=R==="rtl"?"right":"left":C?T=R==="rtl"?"left":"right":T="both";let F=Te(n),[B,L]=s.useState("");s.useEffect(()=>{if(!F.current)return;let D=window.getComputedStyle(F.current);L(D.cursor)},[F,T]);let M=ae({...e,defaultClassName:"react-aria-ColumnResizer",values:{isFocused:y,isFocusVisible:m,isResizing:p,isHovered:v,resizableDirection:T}}),[V,H]=s.useState(!1),j=D=>{D.pointerType==="mouse"&&H(!0)};!p&&V&&H(!1);let $=oe(e,{global:!0});return x.createElement(ee.div,{ref:F,role:"presentation",...W($,M,d,{onPointerDown:j},g),"data-hovered":v||void 0,"data-focused":y||void 0,"data-focus-visible":m||void 0,"data-resizing":p||void 0,"data-resizable-direction":T},M.children,x.createElement("input",{ref:f,...W(b,h)}),p&&V&&du.createPortal(x.createElement("div",{style:{position:"fixed",top:0,left:0,bottom:0,right:0,cursor:B}}),document.body))}),wo=class wo extends hl{};wo.type="tablebody";let rl=wo,C0=s.forwardRef(function(e,n){let{isVirtualized:l}=s.useContext(pe);return l?x.createElement(ee.div,{...e,ref:n}):x.createElement(ee.tbody,{...e,ref:n})});const E0=ml(rl,(t,e,n)=>{let l=s.useContext(Ze),{isVirtualized:r}=s.useContext(pe),o=l.collection,{CollectionBranch:i}=s.useContext(pe),{dragAndDropHooks:u,dropState:a}=s.useContext(qe),c=!!(u!=null&&u.useDroppableCollectionState)&&!(a!=null&&a.isDisabled),f=c&&!!a&&(a.isDropTarget({type:"root"})??!1),d=o.size===0,b={isDropTarget:f,isEmpty:d},p=ae({...t,id:void 0,children:void 0,defaultClassName:"react-aria-TableBody",values:b}),h,y=o.columnCount;if(d&&t.renderEmptyState&&l){let v={},E={},C={};r?(E["aria-colspan"]=y,C={display:"contents"}):E.colSpan=y,h=x.createElement(Nt,{role:"row",...v,style:C},x.createElement(Vt,{role:"rowheader",...E,style:C},t.renderEmptyState(b)))}let{rowGroupProps:m}=lp(),g=oe(t,{global:!0});return x.createElement(C0,{...W(g,p,m),ref:e,"data-empty":d||void 0},c&&x.createElement(B0,null),x.createElement(i,{collection:o,parent:n,renderDropIndicator:lo(u,a)}),h)}),So=class So extends hl{};So.type="tablefooter";let au=So;const op=s.createContext({isFocusVisibleWithinRow:!1}),Do=class Do extends Ge{filter(e,n,l){let r=e.getChildren(this.key);for(let o of r)if(l(o.textValue,o)){let i=this.clone();return n.addDescendants(i,e),i}return null}};Do.type="item";let wr=Do,Nt=s.forwardRef(function(e,n){let{isVirtualized:l}=s.useContext(pe);return l?x.createElement(ee.div,{...e,ref:n}):x.createElement(ee.tr,{...e,ref:n})});const w0=ml(wr,(t,e,n)=>{var P;let l=Te(e),r=s.useContext(Ze),{dragAndDropHooks:o,dragState:i,dropState:u}=s.useContext(qe),{isVirtualized:a,CollectionBranch:c}=s.useContext(pe),f=i&&!(i.isDisabled||i.selectionManager.isDisabled(n.key)),{rowProps:d,expandButtonProps:b,...p}=J3({node:n,shouldSelectOnPressUp:!!i,isVirtualized:a},r,l),{isFocused:h,isFocusVisible:y,focusProps:m}=Ve(),{isFocusVisible:g,focusProps:v}=Ve({within:!0}),{hoverProps:E,isHovered:C}=Fe({isDisabled:!p.allowsSelection&&!p.hasAction&&!f,onHoverStart:t.onHoverStart,onHoverChange:t.onHoverChange,onHoverEnd:t.onHoverEnd}),{checkboxProps:R}=n0({key:n.key},r),T;i&&o&&(T=o.useDraggableItem({key:n.key,hasDragButton:!0},i));let F,B=s.useRef(null),{visuallyHiddenProps:L}=wn();u&&o&&(F=o.useDropIndicator({target:{type:"item",key:n.key,dropPosition:"on"}},u,B));let M=s.useRef(null);s.useEffect(()=>{i&&M.current},[]);let V=i&&i.isDragging(n.key),{children:H,...j}=t,$=t.hasChildItems||((P=r.collection.getItem(n.lastChildKey))==null?void 0:P.type)!=="cell",D=$&&r.expandedKeys.has(n.key),A=ae({...j,id:void 0,defaultClassName:"react-aria-Row",defaultStyle:{"--table-row-level":n.level+1},values:{...p,state:r,isHovered:C,isFocused:h,isFocusVisible:y,selectionMode:r.selectionManager.selectionMode,selectionBehavior:r.selectionManager.selectionBehavior,isDragging:V,isDropTarget:F==null?void 0:F.isDropTarget,isFocusVisibleWithin:g,id:n.key,hasChildItems:$,isExpanded:D,level:n.level+1}}),w=oe(t,{global:!0});return delete w.id,delete w.onClick,x.createElement(x.Fragment,null,F&&!F.isHidden&&x.createElement(Nt,{role:"row",style:{height:0}},x.createElement(Vt,{role:"gridcell",colSpan:r.collection.columnCount,style:{padding:0}},x.createElement("div",{role:"button",...L,...F.dropIndicatorProps,ref:B}))),x.createElement(Nt,{...W(w,A,d,m,E,T==null?void 0:T.dragProps,v),ref:l,"data-disabled":p.isDisabled||void 0,"data-selected":p.isSelected||void 0,"data-hovered":C||void 0,"data-focused":p.isFocused||void 0,"data-focus-visible":y||void 0,"data-pressed":p.isPressed||void 0,"data-dragging":V||void 0,"data-drop-target":(F==null?void 0:F.isDropTarget)||void 0,"data-selection-mode":r.selectionManager.selectionMode==="none"?void 0:r.selectionManager.selectionMode,"data-focus-visible-within":g||void 0,"data-expanded":D||void 0,"data-has-child-items":$||void 0,"data-level":n.level+1},x.createElement(Me,{values:[[oo,{slots:{[gt]:{},selection:R}}],[Wc,{slots:{[gt]:{},selection:R}}],[En,{slots:{[gt]:{},chevron:b,drag:{...T==null?void 0:T.dragButtonProps,ref:M,style:{pointerEvents:"none"}}}}],[os,{isSelected:p.isSelected}],[op,{isFocusVisibleWithinRow:g}]]},x.createElement(c,{collection:r.collection,parent:n}))))},t=>{if(t.id==null&&typeof t.children=="function")throw new Error("No id detected for the Row element. The Row element requires a id to be provided to it when the cells are rendered dynamically.");let e=[t.value].concat(t.dependencies);return x.createElement(Dn,{dependencies:e,items:t.columns,idScope:t.id},t.children)}),ko=class ko extends Ge{};ko.type="cell";let Sr=ko,Vt=s.forwardRef(function(e,n){let{isVirtualized:l}=s.useContext(pe);return l?x.createElement(ee.div,{...e,ref:n}):x.createElement(ee.td,{...e,ref:n})});const S0=Sn(Sr,(t,e,n)=>{var F;let l=Te(e),r=s.useContext(Ze),{dragState:o}=s.useContext(qe),{isVirtualized:i}=s.useContext(pe);n.column=r.collection.columns[n.index];let{gridCellProps:u,isPressed:a}=e0({node:n,shouldSelectOnPressUp:!!o,isVirtualized:i},r,l),{isFocused:c,isFocusVisible:f,focusProps:d}=Ve(),{hoverProps:b,isHovered:p}=Fe({}),{isFocusVisibleWithinRow:h}=s.useContext(op),y=n.parentKey!=null?r.selectionManager.isSelected(n.parentKey):!1,m=n.colIndex||n.index,g=r.collection.getItem(n.parentKey),v=g.props.hasChildItems||((F=r.collection.getItem(g.lastChildKey))==null?void 0:F.type)!=="cell",E=v&&r.expandedKeys.has(n.parentKey),C=r.selectionManager.isDisabled(n.parentKey),R=ae({...t,id:void 0,defaultClassName:"react-aria-Cell",values:{isFocused:c,isFocusVisible:f,isFocusVisibleWithinRow:h,isPressed:a,isHovered:p,isSelected:y,id:n.key,columnIndex:m,hasChildItems:v,isExpanded:E,isDisabled:C,level:g.level+1,isTreeColumn:n.column.key===r.treeColumn}}),T=oe(t,{global:!0});return delete T.id,x.createElement(Vt,{...W(T,R,u,d,b),ref:l,"data-focused":c||void 0,"data-focus-visible":f||void 0,"data-focus-visible-within-row":h||void 0,"data-pressed":a||void 0,"data-selected":y||void 0,"data-column-index":m,"data-expanded":E||void 0,"data-has-child-items":v||void 0,"data-level":g.level+1,"data-tree-column":n.column.key===r.treeColumn||void 0,"data-disabled":C||void 0},x.createElement(pe.Provider,{value:Gr},R.children))});function D0(t,e){var c;e=Te(e);let{dragAndDropHooks:n,dropState:l}=s.useContext(qe),r=s.useRef(null),{dropIndicatorProps:o,isHidden:i,isDropTarget:u}=n.useDropIndicator(t,l,r);if(i)return null;let a=l&&t.target.type==="item"?(((c=l.collection.getItem(t.target.key))==null?void 0:c.level)||0)+1:1;return x.createElement(A0,{...t,dropIndicatorProps:o,isDropTarget:u,buttonRef:r,level:a,ref:e})}let k0=s.forwardRef(function(e,n){let{isVirtualized:l}=s.useContext(pe);return l?x.createElement(ee.div,{...e,ref:n}):x.createElement(ee.tr,{...e,ref:n})}),P0=s.forwardRef(function(e,n){let{isVirtualized:l}=s.useContext(pe);return l?x.createElement(ee.div,{...e,ref:n}):x.createElement(ee.td,{...e,ref:n})});function T0(t,e){let{dropIndicatorProps:n,isDropTarget:l,buttonRef:r,level:o,...i}=t,u=s.useContext(Ze),{visuallyHiddenProps:a}=wn(),c=ae({...i,defaultClassName:"react-aria-DropIndicator",defaultStyle:{"--table-row-level":o+1},values:{isDropTarget:l}});return x.createElement(k0,{...oe(t,{global:!0}),...c,role:"row",ref:e,"data-drop-target":l||void 0,"aria-level":o},x.createElement(P0,{role:"gridcell",colSpan:u.collection.columnCount,style:{padding:0}},x.createElement("div",{...a,role:"button",...n,ref:r}),c.children))}const A0=s.forwardRef(T0);function B0(){let t=s.useContext(Ze),{dragAndDropHooks:e,dropState:n}=s.useContext(qe),l=s.useRef(null),{dropIndicatorProps:r}=e.useDropIndicator({target:{type:"root"}},n,l),o=n.isDropTarget({type:"root"}),{visuallyHiddenProps:i}=wn();return!o&&r["aria-hidden"]?null:x.createElement(Nt,{role:"row","aria-hidden":r["aria-hidden"],style:{height:0}},x.createElement(Vt,{role:"gridcell",colSpan:t.collection.columnCount,style:{padding:0}},x.createElement("div",{role:"button",...i,...r,ref:l})))}const K0=Sn(tl,function(e,n,l){let r=s.useContext(Ze),{isVirtualized:o}=s.useContext(pe),{isLoading:i,onLoadMore:u,scrollOffset:a,...c}=e,f=r.collection.columns.length,d=s.useRef(null),b=s.useMemo(()=>({onLoadMore:u,collection:r==null?void 0:r.collection,sentinelRef:d,scrollOffset:a}),[u,a,r==null?void 0:r.collection]);Cu(b,d);let p=ae({...c,id:void 0,children:l.rendered,defaultClassName:"react-aria-TableLoadingIndicator",defaultStyle:{"--table-row-level":l.level+1},values:void 0}),h={},y={},m={};return o?(y["aria-colspan"]=f,m={display:"contents"}):y.colSpan=f,x.createElement(x.Fragment,null,x.createElement(Nt,{style:{height:0},inert:Eu(!0)},x.createElement(Vt,{style:{padding:0,border:0}},x.createElement("div",{"data-testid":"loadMoreSentinel",ref:d,style:{position:"relative",height:1,width:1}}))),i&&p.children&&x.createElement(Nt,{...W(oe(e,{global:!0}),h),...p,role:"row",ref:n,"aria-level":l.level+1,"data-level":l.level+1},x.createElement(Vt,{role:"rowheader",...y,style:m},p.children)))}),ip=s.createContext({}),su=({children:t,className:e,variant:n,...l})=>{const r=x.useMemo(()=>wh({variant:n}),[n]);return I.jsx(gg,{className:ge(e,r.item()),"data-slot":"list-box-item",...l,children:o=>I.jsx(ip,{value:{slots:r,state:o},children:typeof t=="function"?t(o):t})})},up=({children:t,className:e,...n})=>{const{slots:l,state:r}=s.useContext(ip),o=r==null?void 0:r.isSelected,i=typeof t=="function"?t(r??{}):t||I.jsx("svg",{"aria-hidden":"true","data-slot":"list-box-item-indicator--checkmark",fill:"none",role:"presentation",stroke:"currentColor",strokeDasharray:22,strokeDashoffset:o?44:66,strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,viewBox:"0 0 17 18",children:I.jsx("polyline",{points:"1 9 7 14 15 4"})});return I.jsx(De.span,{"aria-hidden":"true",className:fe(l==null?void 0:l.indicator,e),"data-slot":"list-box-item-indicator","data-visible":o||void 0,...n,children:i})},R0=Object.assign(su,{Root:su,Indicator:up}),M0=({children:t,className:e,...n})=>{const l=x.useMemo(()=>Sh({class:typeof e=="string"?e:void 0}),[e]);return I.jsx(mg,{className:l,...n,children:t})},F0=M0;function cu({className:t,variant:e,...n}){const l=x.useMemo(()=>Eh({variant:e}),[e]);return I.jsx(bg,{className:ge(t,l),"data-slot":"list-box",...n})}const ty=Object.assign(cu,{Root:cu,Item:R0,ItemIndicator:up,Section:F0}),Ie=s.createContext({}),Dr=({children:t,className:e,variant:n,...l})=>{const r=x.useMemo(()=>kh({variant:n}),[n]);return I.jsx(Ie,{value:{slots:r},children:I.jsx(De.div,{className:r.base({className:e}),"data-slot":"table",...l,children:t})})};Dr.displayName="HeroUI.Table";const ap=({className:t,...e})=>{const{slots:n}=s.useContext(Ie);return I.jsx(De.div,{className:fe(n==null?void 0:n.scrollContainer,t),"data-slot":"table-scroll-container",...e})};ap.displayName="HeroUI.Table.ScrollContainer";function sp({className:t,...e}){const{slots:n}=s.useContext(Ie);return I.jsx(d0,{className:ge(t,n==null?void 0:n.content()),"data-slot":"table-content",...e})}sp.displayName="HeroUI.Table.Content";function cp({className:t,...e}){const{slots:n}=s.useContext(Ie);return I.jsx(m0,{className:ge(t,n==null?void 0:n.header()),"data-slot":"table-header",...e})}cp.displayName="HeroUI.Table.Header";const dp=x.forwardRef(({className:t,...e},n)=>{const{slots:l}=s.useContext(Ie);return I.jsx(v0,{ref:n,className:ge(t,l==null?void 0:l.column()),"data-slot":"table-column",...e})});dp.displayName="HeroUI.Table.Column";function fp({className:t,...e}){const{slots:n}=s.useContext(Ie);return I.jsx(E0,{className:ge(t,n==null?void 0:n.body()),"data-slot":"table-body",...e})}fp.displayName="HeroUI.Table.Body";function pp({className:t,...e}){const{slots:n}=s.useContext(Ie);return I.jsx(w0,{className:ge(t,n==null?void 0:n.row()),"data-slot":"table-row",...e})}pp.displayName="HeroUI.Table.Row";const bp=x.forwardRef(({className:t,...e},n)=>{const{slots:l}=s.useContext(Ie);return I.jsx(S0,{ref:n,className:ge(t,l==null?void 0:l.cell()),"data-slot":"table-cell",...e})});bp.displayName="HeroUI.Table.Cell";const hp=({className:t,...e})=>{const{slots:n}=s.useContext(Ie);return I.jsx(De.div,{className:fe(n==null?void 0:n.footer,t),"data-slot":"table-footer",...e})};hp.displayName="HeroUI.Table.Footer";const mp=x.forwardRef(({className:t,...e},n)=>I.jsx(s0,{ref:n,className:Lt("table__resizable-container",t),"data-slot":"table-resizable-container",...e}));mp.displayName="HeroUI.Table.ResizableContainer";const gp=x.forwardRef(({className:t,...e},n)=>{const{slots:l}=s.useContext(Ie);return I.jsx(x0,{ref:n,className:ge(t,l==null?void 0:l.columnResizer()),"data-slot":"table-column-resizer",...e})});gp.displayName="HeroUI.Table.ColumnResizer";const yp=x.forwardRef(({className:t,...e},n)=>{const{slots:l}=s.useContext(Ie);return I.jsx(K0,{ref:n,className:fe(l==null?void 0:l.loadMore,t),"data-slot":"table-load-more",...e})});yp.displayName="HeroUI.Table.LoadMore";const $p=({className:t,...e})=>{const{slots:n}=s.useContext(Ie);return I.jsx(De.div,{className:fe(n==null?void 0:n.loadMoreContent,t),"data-slot":"table-load-more-content",...e})};$p.displayName="HeroUI.Table.LoadMoreContent";const vp=x.forwardRef(({children:t,className:e,indicator:n,showIndicator:l=!0,sortDirection:r,...o},i)=>{const{slots:u}=s.useContext(Ie),a=l&&!!r;let c=null;if(a)if(n===void 0)c=I.jsx(dm,{className:u==null?void 0:u.sortableColumnIndicator(),"data-direction":r,"data-slot":"table-sortable-column-indicator"});else if(x.isValidElement(n)){const f=n;c=x.cloneElement(f,{className:fe(u==null?void 0:u.sortableColumnIndicator,f.props.className),"data-direction":r,"data-slot":"table-sortable-column-indicator"})}else c=n;return I.jsxs("span",{ref:i,className:fe(u==null?void 0:u.sortableColumnHeader,e),"data-direction":r,"data-slot":"table-sortable-column-header",...o,children:[t,c]})});vp.displayName="HeroUI.Table.SortableColumnHeader";const I0=Dn,ny=Object.assign(Dr,{Body:fp,Cell:bp,Collection:I0,Column:dp,ColumnResizer:gp,Content:sp,Footer:hp,Header:cp,LoadMore:yp,LoadMoreContent:$p,ResizableContainer:mp,Root:Dr,Row:pp,ScrollContainer:ap,SortableColumnHeader:vp});export{U0 as $,V0 as A,j0 as B,Z0 as C,ey as D,X0 as I,Q0 as L,Y0 as S,J0 as T,ty as a,R0 as b,Xp as c,_0 as d,O0 as e,W0 as f,bh as g,G0 as h,q0 as i,ny as j,H0 as k,i4 as r}; diff --git a/src/gateway/static/dashboard/assets/heroui-DZj66Arc.js b/src/gateway/static/dashboard/assets/heroui-DZj66Arc.js deleted file mode 100644 index c2d80b0a..00000000 --- a/src/gateway/static/dashboard/assets/heroui-DZj66Arc.js +++ /dev/null @@ -1,20 +0,0 @@ -var vo=t=>{throw TypeError(t)};var xo=(t,e,n)=>e.has(t)||vo("Cannot "+n);var Co=(t,e,n)=>(xo(t,e,"read from private field"),n?n.call(t):e.get(t)),Eo=(t,e,n)=>e.has(t)?vo("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(t):e.set(t,n),ml=(t,e,n,l)=>(xo(t,e,"write to private field"),l?l.call(t,n):e.set(t,n),n);import{r as s,$ as g,a as gr,b as Yi,c as up}from"./react-dgEcD0HR.js";import{j as M}from"./tanstack-query-1t81HyiD.js";const ap="react-aria-clear-focus",sp="react-aria-focus";function Jn(t){var n;if(typeof window>"u"||window.navigator==null)return!1;let e=(n=window.navigator.userAgentData)==null?void 0:n.brands;return Array.isArray(e)&&e.some(l=>t.test(l.brand))||t.test(window.navigator.userAgent)}function yr(t){var e;return typeof window<"u"&&window.navigator!=null?t.test(((e=window.navigator.userAgentData)==null?void 0:e.platform)||window.navigator.platform):!1}function rt(t){let e=null;return()=>(e==null&&(e=t()),e)}const yt=rt(function(){return yr(/^Mac/i)}),cp=rt(function(){return yr(/^iPhone/i)}),Xi=rt(function(){return yr(/^iPad/i)||yt()&&navigator.maxTouchPoints>1}),$t=rt(function(){return cp()||Xi()}),Fn=rt(function(){return yt()||$t()}),Ji=rt(function(){return Jn(/AppleWebKit/i)&&!Qi()}),Qi=rt(function(){return Jn(/Chrome/i)}),rn=rt(function(){return Jn(/Android/i)}),dp=rt(function(){return Jn(/Firefox/i)});function Ve(t){if(fp())t.focus({preventScroll:!0});else{let e=pp(t);t.focus(),bp(e)}}let Dn=null;function fp(){if(Dn==null){Dn=!1;try{document.createElement("div").focus({get preventScroll(){return Dn=!0,!0}})}catch{}}return Dn}function pp(t){let e=t.parentNode,n=[],l=document.scrollingElement||document.documentElement;for(;e instanceof HTMLElement&&e!==l;)(e.offsetHeightt});function Nt(){return s.useContext(hp)}function mp(t,e){let n=t.getAttribute("target");return(!n||n==="_self")&&t.origin===location.origin&&!t.hasAttribute("download")&&!e.metaKey&&!e.ctrlKey&&!e.altKey&&!e.shiftKey}function tt(t,e,n=!0){var a,c;let{metaKey:l,ctrlKey:r,altKey:o,shiftKey:i}=e;dp()&&((c=(a=window.event)==null?void 0:a.type)!=null&&c.startsWith("key"))&&t.target==="_blank"&&(yt()?l=!0:r=!0);let u=Ji()&&yt()&&!Xi()?new KeyboardEvent("keydown",{keyIdentifier:"Enter",metaKey:l,ctrlKey:r,altKey:o,shiftKey:i}):new MouseEvent("click",{metaKey:l,ctrlKey:r,altKey:o,shiftKey:i,detail:1,bubbles:!0,cancelable:!0});tt.isOpening=n,Ve(t),t.dispatchEvent(u),tt.isOpening=!1}tt.isOpening=!1;function gp(t,e){if(t instanceof HTMLAnchorElement)e(t);else if(t.hasAttribute("data-href")){let n=document.createElement("a");n.href=t.getAttribute("data-href"),t.hasAttribute("data-target")&&(n.target=t.getAttribute("data-target")),t.hasAttribute("data-rel")&&(n.rel=t.getAttribute("data-rel")),t.hasAttribute("data-download")&&(n.download=t.getAttribute("data-download")),t.hasAttribute("data-ping")&&(n.ping=t.getAttribute("data-ping")),t.hasAttribute("data-referrer-policy")&&(n.referrerPolicy=t.getAttribute("data-referrer-policy")),t.appendChild(n),e(n),t.removeChild(n)}}function yp(t,e){gp(t,n=>tt(n,e))}function $p(t){const n=Nt().useHref(t.href??"");return{"data-href":t.href?n:void 0,"data-target":t.target,"data-rel":t.rel,"data-download":t.download,"data-ping":t.ping,"data-referrer-policy":t.referrerPolicy}}function eu(t){const n=Nt().useHref((t==null?void 0:t.href)??"");let l={};if(t)for(let r of["href","target","rel","download","ping","referrerPolicy"])r in t&&(l[r]=r==="href"?n:t[r]);return l}function vp(t,e,n,l){!e.isNative&&t.currentTarget instanceof HTMLAnchorElement&&t.currentTarget.href&&!t.isDefaultPrevented()&&mp(t.currentTarget,t)&&n&&(t.preventDefault(),e.open(t.currentTarget,t,n,l))}const ne=typeof document<"u"?g.useLayoutEffect:()=>{},tu={prefix:String(Math.round(Math.random()*1e10)),current:0},nu=g.createContext(tu),xp=g.createContext(!1);let gl=new WeakMap;function Cp(t=!1){var l,r;let e=s.useContext(nu),n=s.useRef(null);if(n.current===null&&!t){let o=(r=(l=g.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED)==null?void 0:l.ReactCurrentOwner)==null?void 0:r.current;if(o){let i=gl.get(o);i==null?gl.set(o,{id:e.current,state:o.memoizedState}):o.memoizedState!==i.state&&(e.current=i.id,gl.delete(o))}n.current=++e.current}return n.current}function Ep(t){let e=s.useContext(nu),n=Cp(!!t),l=`react-aria${e.prefix}`;return t||`${l}-${n}`}function wp(t){let e=g.useId(),[n]=s.useState(ct()),l=n?"react-aria":`react-aria${tu.prefix}`;return t||`${l}-${e}`}const Sp=typeof g.useId=="function"?wp:Ep;function Dp(){return!1}function kp(){return!0}function Pp(t){return()=>{}}function ct(){return typeof g.useSyncExternalStore=="function"?g.useSyncExternalStore(Pp,Dp,kp):s.useContext(xp)}function Ap(t){let[e,n]=s.useState(t),l=s.useRef(e),r=s.useRef(null),o=s.useRef(()=>{if(!r.current)return;let u=r.current.next();if(u.done){r.current=null;return}l.current===u.value?o.current():n(u.value)});ne(()=>{l.current=e,r.current&&o.current()});let i=s.useCallback(u=>{r.current=u(l.current),o.current()},[o]);return[e,i]}let Tp=!!(typeof window<"u"&&window.document&&window.document.createElement),Bt=new Map,Zt;typeof FinalizationRegistry<"u"&&(Zt=new FinalizationRegistry(t=>{Bt.delete(t)}));function $e(t){let[e,n]=s.useState(t),l=s.useRef(null),r=Sp(e),o=s.useRef(null);if(Zt&&Zt.register(o,r),Tp){const i=Bt.get(r);i&&!i.includes(l)?i.push(l):Bt.set(r,[l])}return ne(()=>{let i=r;return()=>{Zt&&Zt.unregister(o),Bt.delete(i)}},[r]),s.useEffect(()=>{let i=l.current;return i&&n(i),()=>{i&&(l.current=null)}}),r}function Bp(t,e){if(t===e)return t;let n=Bt.get(t);if(n)return n.forEach(r=>r.current=e),e;let l=Bt.get(e);return l?(l.forEach(r=>r.current=t),t):e}function on(t=[]){let e=$e(),[n,l]=Ap(e),r=s.useCallback(()=>{l(function*(){yield e,yield document.getElementById(e)?e:void 0})},[e,l]);return ne(r,[e,r,...t]),n}function dt(...t){return(...e)=>{for(let n of t)typeof n=="function"&&n(...e)}}const re=t=>(t==null?void 0:t.ownerDocument)??document,we=t=>t&&"window"in t&&t.window===t?t:re(t).defaultView||window;function Kp(t){return t!==null&&typeof t=="object"&&"nodeType"in t&&typeof t.nodeType=="number"}function Rp(t){return Kp(t)&&t.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&"host"in t}let Mp=!1;function Qe(){return Mp}function te(t,e){if(!Qe())return e&&t?t.contains(e):!1;if(!t||!e)return!1;let n=e;for(;n!==null;){if(n===t)return!0;n.tagName==="SLOT"&&n.assignedSlot?n=n.assignedSlot.parentNode:Rp(n)?n=n.host:n=n.parentNode}return!1}const oe=(t=document)=>{var n;if(!Qe())return t.activeElement;let e=t.activeElement;for(;e&&"shadowRoot"in e&&((n=e.shadowRoot)!=null&&n.activeElement);)e=e.shadowRoot.activeElement;return e};function j(t){if(Qe()&&t.target instanceof Element&&t.target.shadowRoot){if("composedPath"in t)return t.composedPath()[0]??null;if("composedPath"in t.nativeEvent)return t.nativeEvent.composedPath()[0]??null}return t.target}function vt(t){if(!t)return!1;let e=t.getRootNode(),n=we(t);if(!(e instanceof n.Document||e instanceof n.ShadowRoot))return!1;let l=e.activeElement;return l!=null&&t.contains(l)}class Ip{constructor(e,n,l,r){this._walkerStack=[],this._currentSetFor=new Set,this._acceptNode=i=>{var u;if(i.nodeType===Node.ELEMENT_NODE){const a=i.shadowRoot;if(a){const c=this._doc.createTreeWalker(a,this.whatToShow,{acceptNode:this._acceptNode});return this._walkerStack.unshift(c),NodeFilter.FILTER_ACCEPT}else{if(typeof this.filter=="function")return this.filter(i);if((u=this.filter)!=null&&u.acceptNode)return this.filter.acceptNode(i);if(this.filter===null)return NodeFilter.FILTER_ACCEPT}}return NodeFilter.FILTER_SKIP},this._doc=e,this.root=n,this.filter=r??null,this.whatToShow=l??NodeFilter.SHOW_ALL,this._currentNode=n,this._walkerStack.unshift(e.createTreeWalker(n,l,this._acceptNode));const o=n.shadowRoot;if(o){const i=this._doc.createTreeWalker(o,this.whatToShow,{acceptNode:this._acceptNode});this._walkerStack.unshift(i)}}get currentNode(){return this._currentNode}set currentNode(e){if(!te(this.root,e))throw new Error("Cannot set currentNode to a node that is not contained by the root node.");const n=[];let l=e,r=e;for(this._currentNode=e;l&&l!==this.root;)if(l.nodeType===Node.DOCUMENT_FRAGMENT_NODE){const i=l,u=this._doc.createTreeWalker(i,this.whatToShow,{acceptNode:this._acceptNode});n.push(u),u.currentNode=r,this._currentSetFor.add(u),l=r=i.host}else l=l.parentNode;const o=this._doc.createTreeWalker(this.root,this.whatToShow,{acceptNode:this._acceptNode});n.push(o),o.currentNode=r,this._currentSetFor.add(o),this._walkerStack=n}get doc(){return this._doc}firstChild(){let e=this.currentNode,n=this.nextNode();return te(e,n)?(n&&(this.currentNode=n),n):(this.currentNode=e,null)}lastChild(){let n=this._walkerStack[0].lastChild();return n&&(this.currentNode=n),n}nextNode(){var n;const e=this._walkerStack[0].nextNode();if(e){if(e.shadowRoot){let r;if(typeof this.filter=="function"?r=this.filter(e):(n=this.filter)!=null&&n.acceptNode&&(r=this.filter.acceptNode(e)),r===NodeFilter.FILTER_ACCEPT)return this.currentNode=e,e;let o=this.nextNode();return o&&(this.currentNode=o),o}return e&&(this.currentNode=e),e}else if(this._walkerStack.length>1){this._walkerStack.shift();let l=this.nextNode();return l&&(this.currentNode=l),l}else return null}previousNode(){var l;const e=this._walkerStack[0];if(e.currentNode===e.root){if(this._currentSetFor.has(e))if(this._currentSetFor.delete(e),this._walkerStack.length>1){this._walkerStack.shift();let r=this.previousNode();return r&&(this.currentNode=r),r}else return null;return null}const n=e.previousNode();if(n){if(n.shadowRoot){let o;if(typeof this.filter=="function"?o=this.filter(n):(l=this.filter)!=null&&l.acceptNode&&(o=this.filter.acceptNode(n)),o===NodeFilter.FILTER_ACCEPT)return n&&(this.currentNode=n),n;let i=this.lastChild();return i&&(this.currentNode=i),i}return n&&(this.currentNode=n),n}else if(this._walkerStack.length>1){this._walkerStack.shift();let r=this.previousNode();return r&&(this.currentNode=r),r}else return null}nextSibling(){return null}previousSibling(){return null}parentNode(){return null}}function lu(t,e,n,l){return Qe()?new Ip(t,e,n,l):t.createTreeWalker(e,n,l)}function ft(...t){return t.length===1&&t[0]?t[0]:e=>{let n=!1;const l=t.map(r=>{const o=wo(r,e);return n||(n=typeof o=="function"),o});if(n)return()=>{l.forEach((r,o)=>{typeof r=="function"?r():wo(t[o],null)})}}}function wo(t,e){if(typeof t=="function")return t(e);t!=null&&(t.current=e)}function ru(t){var e,n,l="";if(typeof t=="string"||typeof t=="number")l+=t;else if(typeof t=="object")if(Array.isArray(t)){var r=t.length;for(e=0;e=65&&r.charCodeAt(2)<=90?e[r]=dt(o,i):(r==="className"||r==="UNSAFE_className")&&typeof o=="string"&&typeof i=="string"?e[r]=Fp(o,i):r==="id"&&o&&i?e.id=Bp(o,i):r==="ref"&&o&&i?e.ref=ft(o,i):e[r]=i!==void 0?i:o}}return e}const Lp=new Set(["id"]),zp=new Set(["aria-label","aria-labelledby","aria-describedby","aria-details"]),Np=new Set(["href","hrefLang","target","rel","download","ping","referrerPolicy"]),Op=new Set(["dir","lang","hidden","inert","translate"]),So=new Set(["onClick","onAuxClick","onContextMenu","onDoubleClick","onMouseDown","onMouseEnter","onMouseLeave","onMouseMove","onMouseOut","onMouseOver","onMouseUp","onTouchCancel","onTouchEnd","onTouchMove","onTouchStart","onPointerDown","onPointerMove","onPointerUp","onPointerCancel","onPointerEnter","onPointerLeave","onPointerOver","onPointerOut","onGotPointerCapture","onLostPointerCapture","onScroll","onWheel","onAnimationStart","onAnimationEnd","onAnimationIteration","onTransitionCancel","onTransitionEnd","onTransitionRun","onTransitionStart"]),Vp=/^(data-.*)$/;function ie(t,e={}){let{labelable:n,isLink:l,global:r,events:o=r,propNames:i}=e,u={};for(const a in t)Object.prototype.hasOwnProperty.call(t,a)&&(Lp.has(a)||n&&zp.has(a)||l&&Np.has(a)||r&&Op.has(a)||o&&(So.has(a)||a.endsWith("Capture")&&So.has(a.slice(0,-7)))||i!=null&&i.has(a)||Vp.test(a))&&(u[a]=t[a]);return u}let ut=new Map,Fl=new Set;function Do(){if(typeof window>"u")return;function t(l){return"propertyName"in l}let e=l=>{let r=j(l);if(!t(l)||!r)return;let o=ut.get(r);o||(o=new Set,ut.set(r,o),r.addEventListener("transitioncancel",n,{once:!0})),o.add(l.propertyName)},n=l=>{let r=j(l);if(!t(l)||!r)return;let o=ut.get(r);if(o&&(o.delete(l.propertyName),o.size===0&&(r.removeEventListener("transitioncancel",n),ut.delete(r)),ut.size===0)){for(let i of Fl)i();Fl.clear()}};document.body.addEventListener("transitionrun",e),document.body.addEventListener("transitionend",n)}typeof document<"u"&&(document.readyState!=="loading"?Do():document.addEventListener("DOMContentLoaded",Do));function jp(){for(const[t]of ut)"isConnected"in t&&!t.isConnected&&ut.delete(t)}function ou(t){requestAnimationFrame(()=>{jp(),ut.size===0?t():Fl.add(t)})}function hn(){let t=s.useRef(new Map),e=s.useCallback((r,o,i,u)=>{let a=u!=null&&u.once?(...c)=>{t.current.delete(i),i(...c)}:i;t.current.set(i,{type:o,eventTarget:r,fn:a,options:u}),r.addEventListener(o,a,u)},[]),n=s.useCallback((r,o,i,u)=>{var c;let a=((c=t.current.get(i))==null?void 0:c.fn)||i;r.removeEventListener(o,a,u),t.current.delete(i)},[]),l=s.useCallback(()=>{t.current.forEach((r,o)=>{n(r.eventTarget,r.type,o,r.options)})},[n]);return s.useEffect(()=>l,[l]),{addGlobalListener:e,removeGlobalListener:n,removeAllGlobalListeners:l}}function un(t,e){let{id:n,"aria-label":l,"aria-labelledby":r}=t;return n=$e(n),r&&l?r=[...new Set([n,...r.trim().split(/\s+/)])].join(" "):r&&(r=r.trim().split(/\s+/).join(" ")),!l&&!r&&e&&(l=e),{id:n,"aria-label":l,"aria-labelledby":r}}function ke(t){const e=s.useRef(null),n=s.useRef(void 0),l=s.useCallback(r=>{if(typeof t=="function"){const o=t,i=o(r);return()=>{typeof i=="function"?i():o(null)}}else if(t)return t.current=r,()=>{t.current=null}},[t]);return s.useMemo(()=>({get current(){return e.current},set current(r){e.current=r,n.current&&(n.current(),n.current=void 0),r!=null&&(n.current=l(r))}}),[l])}const _p=g.useInsertionEffect??ne;function Ee(t){const e=s.useRef(null);return _p(()=>{e.current=t},[t]),s.useCallback((...n)=>{const l=e.current;return l==null?void 0:l(...n)},[])}function $r(t,e){const n=s.useRef(!0),l=s.useRef(null);let r=Ee(t);s.useEffect(()=>(n.current=!0,()=>{n.current=!1}),[]),s.useEffect(()=>{let o=l.current;n.current?n.current=!1:(!o||e.some((i,u)=>!Object.is(i,o[u])))&&r(),l.current=e},e)}function ko(t,e){const n=s.useRef(!0),l=s.useRef(null);ne(()=>(n.current=!0,()=>{n.current=!1}),[]),ne(()=>{n.current?n.current=!1:(!l.current||e.some((r,o)=>!Object.is(r,l[o])))&&t(),l.current=e},e)}function Hp(){return typeof window.ResizeObserver<"u"}function an(t){const{ref:e,box:n,onResize:l}=t;let r=Ee(l);s.useEffect(()=>{let o=e==null?void 0:e.current;if(o)if(Hp()){const i=new window.ResizeObserver(u=>{u.length&&r()});return i.observe(o,{box:n}),()=>{o&&i.unobserve(o)}}else return window.addEventListener("resize",r,!1),()=>{window.removeEventListener("resize",r,!1)}},[e,n])}function vr(t,e){ne(()=>{if(t&&t.ref&&e)return t.ref.current=e.current,()=>{t.ref&&(t.ref.current=null)}})}function st(t,e){if(!t)return!1;let n=window.getComputedStyle(t),l=document.scrollingElement||document.documentElement,r=/(auto|scroll)/.test(n.overflow+n.overflowX+n.overflowY);return t===l&&n.overflow!=="hidden"&&(r=!0),r&&e&&(r=t.scrollHeight!==t.clientHeight||t.scrollWidth!==t.clientWidth),r}function Xe(t,e){let n=t;for(st(n,e)&&(n=n.parentElement);n&&!st(n,e);)n=n.parentElement;return n||document.scrollingElement||document.documentElement}function yl(t,e){let n=[],l=document.scrollingElement||document.documentElement;for(;t&&(st(t,e)&&n.push(t),t!==l);)t=t.parentElement;return n}function kt(t){return yt()?t.metaKey:t.ctrlKey}const Wp=new Set(["checkbox","radio","range","color","file","image","button","submit","reset"]);function tn(t){return t instanceof HTMLInputElement&&!Wp.has(t.type)||t instanceof HTMLTextAreaElement||t instanceof HTMLElement&&t.isContentEditable}let Te=typeof document<"u"&&window.visualViewport;function Up(){let t=ct(),[e,n]=s.useState(()=>t?{width:0,height:0}:$l());return s.useEffect(()=>{let l=u=>{n(a=>u.width===a.width&&u.height===a.height?a:u)},r=()=>{Te&&Te.scale>1||l($l())},o,i=u=>{Te&&Te.scale>1||tn(j(u))&&(o=requestAnimationFrame(()=>{let a=oe();(!a||!tn(a))&&l({width:document.documentElement.clientWidth,height:document.documentElement.clientHeight})}))};return l($l()),$t()&&window.addEventListener("blur",i,!0),Te?Te.addEventListener("resize",r):window.addEventListener("resize",r),()=>{cancelAnimationFrame(o),$t()&&window.removeEventListener("blur",i,!0),Te?Te.removeEventListener("resize",r):window.removeEventListener("resize",r)}},[]),e}function $l(){return{width:Te?Math.min(Te.width*Te.scale,document.documentElement.clientWidth):document.documentElement.clientWidth,height:Te?Te.height*Te.scale:document.documentElement.clientHeight}}let Gp=0;const vl=new Map;function mn(t){let[e,n]=s.useState();return ne(()=>{if(!t)return;let l=vl.get(t);if(l)n(l.element.id);else{let r=`react-aria-description-${Gp++}`;n(r);let o=document.createElement("div");o.id=r,o.style.display="none",o.textContent=t,document.body.appendChild(o),l={refCount:0,element:o},vl.set(t,l)}return l.refCount++,()=>{l&&--l.refCount===0&&(l.element.remove(),vl.delete(t))}},[t]),{"aria-describedby":t?e:void 0}}function Yt(t,e,n,l){let r=Ee(n),o=n==null;s.useEffect(()=>{if(o||!t.current)return;let i=t.current;return i.addEventListener(e,r,l),()=>{i.removeEventListener(e,r,l)}},[t,e,l,o])}function Ln(t,e,n={}){let{block:l="nearest",inline:r="nearest"}=n;if(t===e)return;let o=t.scrollTop,i=t.scrollLeft,u=e.getBoundingClientRect(),a=t.getBoundingClientRect(),c=window.getComputedStyle(e),f=window.getComputedStyle(t),d=document.scrollingElement||document.documentElement,b=t===d,p=t===d?0:a.top,h=t===d?t.clientHeight:a.bottom,$=t===d?0:a.left,y=t===d?t.clientWidth:a.right,m=parseFloat(c.scrollMarginTop)||0,v=parseFloat(c.scrollMarginBottom)||0,E=parseFloat(c.scrollMarginLeft)||0,C=parseFloat(c.scrollMarginRight)||0,R=parseFloat(f.scrollPaddingTop)||0,A=parseFloat(f.scrollPaddingBottom)||0,K=parseFloat(f.scrollPaddingLeft)||0,P=parseFloat(f.scrollPaddingRight)||0,z=parseFloat(f.borderTopWidth)||0,B=parseFloat(f.borderBottomWidth)||0,N=parseFloat(f.borderLeftWidth)||0,U=parseFloat(f.borderRightWidth)||0,_=u.top-m,x=u.bottom+v,S=u.left-E,I=u.right+C,w=t===d?0:N+U,k=t===d?0:z+B,D=t===d?0:t.offsetWidth-t.clientWidth-w,T=t===d?0:t.offsetHeight-t.clientHeight-k,O=p+(b?0:z)+R,Z=h-(b?0:B)-A-T,F=$+(b?0:N)+K,V=y-(b?0:U)-P;f.direction==="rtl"&&!$t()?F+=D:V-=D;let q=_Z,Q=SV;if(q&&l==="start")o+=_-O;else if(q&&l==="center")o+=(_+x)/2-(O+Z)/2;else if(q&&l==="end")o+=x-Z;else if(q&&l==="nearest"){let J=_-O,ge=x-Z;o+=Math.abs(J)<=Math.abs(ge)?J:ge}if(Q&&r==="start")i+=S-F;else if(Q&&r==="center")i+=(S+I)/2-(F+V)/2;else if(Q&&r==="end")i+=I-V;else if(Q&&r==="nearest"){let J=S-F,ge=I-V;i+=Math.abs(J)<=Math.abs(ge)?J:ge}t.scrollTo({left:i,top:o})}function it(t,e={}){var l,r,o;let{containingElement:n}=e;if(t&&t.isConnected){let i=document.scrollingElement||document.documentElement;if(window.getComputedStyle(i).overflow==="hidden"){let{left:a,top:c}=t.getBoundingClientRect(),f=yl(t,!0);for(let p of f)Ln(p,t);let{left:d,top:b}=t.getBoundingClientRect();if(Math.abs(a-d)>1||Math.abs(c-b)>1){f=n?yl(n,!0):[];for(let p of f)Ln(p,n,{block:"center",inline:"center"});for(let p of yl(t,!0))Ln(p,t)}}else{let{left:a,top:c}=t.getBoundingClientRect();(l=t==null?void 0:t.scrollIntoView)==null||l.call(t,{block:"nearest"});let{left:f,top:d}=t.getBoundingClientRect();(Math.abs(a-f)>1||Math.abs(c-d)>1)&&((r=n==null?void 0:n.scrollIntoView)==null||r.call(n,{block:"center",inline:"center"}),(o=t.scrollIntoView)==null||o.call(t,{block:"nearest"}))}}}function iu(t){return t.pointerType===""&&t.isTrusted?!0:rn()&&t.pointerType?t.type==="click"&&t.buttons===1:t.detail===0&&!t.pointerType}function qp(t){return!rn()&&t.width===0&&t.height===0||t.width===1&&t.height===1&&t.pressure===0&&t.detail===0&&t.pointerType==="mouse"}function xr(t,e,n){let l=Ee(r=>{n&&!r.defaultPrevented&&n(e)});s.useEffect(()=>{var o;let r=(o=t==null?void 0:t.current)==null?void 0:o.form;return r==null||r.addEventListener("reset",l),()=>{r==null||r.removeEventListener("reset",l)}},[t])}function uu(t,e){let{collection:n,onLoadMore:l,scrollOffset:r=1}=t,o=s.useRef(null),i=Ee(u=>{for(let a of u)a.isIntersecting&&l&&l()});ne(()=>(e.current&&(o.current=new IntersectionObserver(i,{root:Xe(e==null?void 0:e.current),rootMargin:`0px ${100*r}% ${100*r}% ${100*r}%`}),o.current.observe(e.current)),()=>{o.current&&o.current.disconnect()}),[n,e,r])}function au(t){const e=s.version.split(".");return parseInt(e[0],10)>=19?t:t?"true":void 0}function Cr(t,e=!0){let[n,l]=s.useState(!0),r=n&&e;return ne(()=>{if(r&&t.current&&"getAnimations"in t.current)for(let o of t.current.getAnimations())o instanceof CSSTransition&&o.cancel()},[t,r]),su(t,r,s.useCallback(()=>l(!1),[])),r}function Ll(t,e){let[n,l]=s.useState(e?"open":"closed");switch(n){case"open":e||l("exiting");break;case"closed":case"exiting":e&&l("open");break}let r=n==="exiting";return su(t,r,s.useCallback(()=>{l(o=>o==="exiting"?"closed":o)},[])),r}function su(t,e,n){ne(()=>{if(e&&t.current){if(!("getAnimations"in t.current)){n();return}let l=t.current.getAnimations();if(l.length===0){n();return}let r=!1;return Promise.allSettled(l.map(o=>o.finished)).then(()=>{r||gr.flushSync(()=>{n()})}),()=>{r=!0}}},[t,e,n])}const Zp=typeof Element<"u"&&"checkVisibility"in Element.prototype;function Yp(t){const e=we(t);if(!(t instanceof e.HTMLElement)&&!(t instanceof e.SVGElement))return!1;let{display:n,visibility:l}=t.style,r=n!=="none"&&l!=="hidden"&&l!=="collapse";if(r){const{getComputedStyle:o}=t.ownerDocument.defaultView;let{display:i,visibility:u}=o(t);r=i!=="none"&&u!=="hidden"&&u!=="collapse"}return r}function Xp(t,e){return!t.hasAttribute("hidden")&&!t.hasAttribute("data-react-aria-prevent-focus")&&(t.nodeName==="DETAILS"&&e&&e.nodeName!=="SUMMARY"?t.hasAttribute("open"):!0)}function Er(t,e){return Zp?t.checkVisibility({visibilityProperty:!0})&&!t.closest("[data-react-aria-prevent-focus]"):t.nodeName!=="#comment"&&Yp(t)&&Xp(t,e)&&(!t.parentElement||Er(t.parentElement,t))}const wr=["input:not([disabled]):not([type=hidden])","select:not([disabled])","textarea:not([disabled])","button:not([disabled])","a[href]","area[href]","summary","iframe","object","embed","audio[controls]","video[controls]",'[contenteditable]:not([contenteditable^="false"])',"permission"],Jp=wr.join(":not([hidden]),")+",[tabindex]:not([disabled]):not([hidden])";wr.push('[tabindex]:not([tabindex="-1"]):not([disabled])');const Qp=wr.join(':not([hidden]):not([tabindex="-1"]),');function cu(t,e){return t.matches(Jp)&&!fu(t)&&((e==null?void 0:e.skipVisibilityCheck)||Er(t))}function du(t){return t.matches(Qp)&&Er(t)&&!fu(t)}function fu(t){let e=t;for(;e!=null;){if(e instanceof e.ownerDocument.defaultView.HTMLElement&&e.inert)return!0;e=e.parentElement}return!1}function Po(t){let e=t==null?void 0:t.defaultView;return(e==null?void 0:e.__webpack_nonce__)||globalThis.__webpack_nonce__||void 0}let xl=new WeakMap;function pu(t){let e=t??(typeof document<"u"?document:void 0);if(!e)return Po(e);if(xl.has(e))return xl.get(e);let n=e.querySelector('meta[property="csp-nonce"]'),l=n&&n instanceof we(n).HTMLMetaElement&&(n.nonce||n.content)||Po(e)||void 0;return l!==void 0&&xl.set(e,l),l}function eb(t,e,n){const{render:l,...r}=e,o=s.useRef(null),i=s.useMemo(()=>ft(n,o),[n,o]);ne(()=>{},[t,l]);const u={...r,ref:i};return l?l(u,void 0):M.jsx(t,{...u})}const Ao={},Se=new Proxy({},{get(t,e){if(typeof e!="string")return;let n=Ao[e];return n||(n=s.forwardRef(eb.bind(null,e)),Ao[e]=n),n}});var tb=/\s+/g,nb=t=>typeof t!="string"||!t?t:t.replace(tb," ").trim(),It=(...t)=>{const e=[],n=l=>{if(!l&&l!==0&&l!==0n)return;if(Array.isArray(l)){for(let o=0,i=l.length;o0?nb(e.join(" ")):void 0},To=t=>t===!1?"false":t===!0?"true":t===0?"0":t,Pe=t=>{if(!t||typeof t!="object")return!0;for(const e in t)return!1;return!0},lb=(t,e)=>{if(t===e)return!0;if(!t||!e)return!1;const n=Object.keys(t),l=Object.keys(e);if(n.length!==l.length)return!1;for(let r=0;r{for(const n in e)if(Object.prototype.hasOwnProperty.call(e,n)){const l=e[n];n in t?t[n]=It(t[n],l):t[n]=l}return t},bu=(t,e)=>{for(let n=0;n{const e=[];bu(t,e);const n=[];for(let l=0;l{const n={};for(const l in t){const r=t[l];if(l in e){const o=e[l];Array.isArray(r)||Array.isArray(o)?n[l]=hu(o,r):typeof r=="object"&&typeof o=="object"&&r&&o?n[l]=zl(r,o):n[l]=o+" "+r}else n[l]=r}for(const l in e)l in t||(n[l]=e[l]);return n},ob={twMerge:!0,twMergeConfig:{}};function ib(){let t=null,e={},n=!1;return{get cachedTwMerge(){return t},set cachedTwMerge(l){t=l},get cachedTwMergeConfig(){return e},set cachedTwMergeConfig(l){e=l},get didTwMergeConfigChange(){return n},set didTwMergeConfigChange(l){n=l},reset(){t=null,e={},n=!1}}}var Je=ib(),ub=t=>{const e=(l,r)=>{const{extend:o=null,slots:i={},variants:u={},compoundVariants:a=[],compoundSlots:c=[],defaultVariants:f={}}=l,d={...ob,...r},b=o!=null&&o.base?It(o.base,l==null?void 0:l.base):l==null?void 0:l.base,p=o!=null&&o.variants&&!Pe(o.variants)?zl(u,o.variants):u,h=o!=null&&o.defaultVariants&&!Pe(o.defaultVariants)?{...o.defaultVariants,...f}:f;!Pe(d.twMergeConfig)&&!lb(d.twMergeConfig,Je.cachedTwMergeConfig)&&(Je.didTwMergeConfigChange=!0,Je.cachedTwMergeConfig=d.twMergeConfig);const $=Pe(o==null?void 0:o.slots),y=Pe(i)?{}:{base:It(l==null?void 0:l.base,$&&(o==null?void 0:o.base)),...i},m=$?y:rb({...o==null?void 0:o.slots},Pe(y)?{base:l==null?void 0:l.base}:y),v=Pe(o==null?void 0:o.compoundVariants)?a:hu(o==null?void 0:o.compoundVariants,a),E=R=>{if(Pe(p)&&Pe(i)&&$)return t(b,R==null?void 0:R.class,R==null?void 0:R.className)(d);if(v&&!Array.isArray(v))throw new TypeError(`The "compoundVariants" prop must be an array. Received: ${typeof v}`);if(c&&!Array.isArray(c))throw new TypeError(`The "compoundSlots" prop must be an array. Received: ${typeof c}`);const A=(x,S=p,I=null,w=null)=>{const k=S[x];if(!k||Pe(k))return null;const D=(w==null?void 0:w[x])??(R==null?void 0:R[x]);if(D===null)return null;const T=To(D);if(typeof T=="object")return null;const O=h==null?void 0:h[x],Z=T??To(O);return k[Z||"false"]},K=()=>{if(!p)return null;const x=Object.keys(p),S=[];for(let I=0;I{if(!p||typeof p!="object")return null;const I=[];for(const w in p){const k=A(w,p,x,S),D=x==="base"&&typeof k=="string"?k:k&&k[x];D&&I.push(D)}return I},z={};for(const x in R){const S=R[x];S!==void 0&&(z[x]=S)}const B=(x,S)=>{var w;const I=typeof(R==null?void 0:R[x])=="object"?{[x]:(w=R[x])==null?void 0:w.initial}:{};return{...h,...z,...I,...S}},N=(x=[],S)=>{const I=[],w=x.length;for(let k=0;k{const S=N(v,x);if(!Array.isArray(S))return S;const I={},w=t;for(let k=0;k{if(c.length<1)return null;const S={},I=B(null,x);for(let w=0;w{const k=U(w),D=_(w);return S(m[I],P(I,w),k?k[I]:void 0,D?D[I]:void 0,w==null?void 0:w.class,w==null?void 0:w.className)(d)}}return x}return t(b,K(),N(v),R==null?void 0:R.class,R==null?void 0:R.className)(d)},C=()=>{if(!(!p||typeof p!="object"))return Object.keys(p)};return E.variantKeys=C(),E.extend=o,E.base=b,E.slots=m,E.variants=p,E.defaultVariants=h,E.compoundSlots=c,E.compoundVariants=v,E};return{tv:e,createTV:l=>(r,o)=>e(r,o?zl(l,o):l)}};const ab=(t,e)=>{const n=new Array(t.length+e.length);for(let l=0;l({classGroupId:t,validator:e}),mu=(t=new Map,e=null,n)=>({nextPart:t,validators:e,classGroupId:n}),Vn="-",Bo=[],cb="arbitrary..",db=t=>{const e=pb(t),{conflictingClassGroups:n,conflictingClassGroupModifiers:l}=t;return{getClassGroupId:i=>{if(i.startsWith("[")&&i.endsWith("]"))return fb(i);const u=i.split(Vn),a=u[0]===""&&u.length>1?1:0;return gu(u,a,e)},getConflictingClassGroupIds:(i,u)=>{if(u){const a=l[i],c=n[i];return a?c?ab(c,a):a:c||Bo}return n[i]||Bo}}},gu=(t,e,n)=>{if(t.length-e===0)return n.classGroupId;const r=t[e],o=n.nextPart.get(r);if(o){const c=gu(t,e+1,o);if(c)return c}const i=n.validators;if(i===null)return;const u=e===0?t.join(Vn):t.slice(e).join(Vn),a=i.length;for(let c=0;ct.slice(1,-1).indexOf(":")===-1?void 0:(()=>{const e=t.slice(1,-1),n=e.indexOf(":"),l=e.slice(0,n);return l?cb+l:void 0})(),pb=t=>{const{theme:e,classGroups:n}=t;return bb(n,e)},bb=(t,e)=>{const n=mu();for(const l in t){const r=t[l];Sr(r,n,l,e)}return n},Sr=(t,e,n,l)=>{const r=t.length;for(let o=0;o{if(typeof t=="string"){mb(t,e,n);return}if(typeof t=="function"){gb(t,e,n,l);return}yb(t,e,n,l)},mb=(t,e,n)=>{const l=t===""?e:yu(e,t);l.classGroupId=n},gb=(t,e,n,l)=>{if($b(t)){Sr(t(l),e,n,l);return}e.validators===null&&(e.validators=[]),e.validators.push(sb(n,t))},yb=(t,e,n,l)=>{const r=Object.entries(t),o=r.length;for(let i=0;i{let n=t;const l=e.split(Vn),r=l.length;for(let o=0;o"isThemeGetter"in t&&t.isThemeGetter===!0,vb=t=>{if(t<1)return{get:()=>{},set:()=>{}};let e=0,n=Object.create(null),l=Object.create(null);const r=(o,i)=>{n[o]=i,e++,e>t&&(e=0,l=n,n=Object.create(null))};return{get(o){let i=n[o];if(i!==void 0)return i;if((i=l[o])!==void 0)return r(o,i),i},set(o,i){o in n?n[o]=i:r(o,i)}}},Nl="!",Ko=":",xb=[],Ro=(t,e,n,l,r)=>({modifiers:t,hasImportantModifier:e,baseClassName:n,maybePostfixModifierPosition:l,isExternal:r}),Cb=t=>{const{prefix:e,experimentalParseClassName:n}=t;let l=r=>{const o=[];let i=0,u=0,a=0,c;const f=r.length;for(let $=0;$a?c-a:void 0;return Ro(o,p,b,h)};if(e){const r=e+Ko,o=l;l=i=>i.startsWith(r)?o(i.slice(r.length)):Ro(xb,!1,i,void 0,!0)}if(n){const r=l;l=o=>n({className:o,parseClassName:r})}return l},Eb=t=>{const e=new Map;return t.orderSensitiveModifiers.forEach((n,l)=>{e.set(n,1e6+l)}),n=>{const l=[];let r=[];for(let o=0;o0&&(r.sort(),l.push(...r),r=[]),l.push(i)):r.push(i)}return r.length>0&&(r.sort(),l.push(...r)),l}},wb=t=>({cache:vb(t.cacheSize),parseClassName:Cb(t),sortModifiers:Eb(t),...db(t)}),Sb=/\s+/,Db=(t,e)=>{const{parseClassName:n,getClassGroupId:l,getConflictingClassGroupIds:r,sortModifiers:o}=e,i=[],u=t.trim().split(Sb);let a="";for(let c=u.length-1;c>=0;c-=1){const f=u[c],{isExternal:d,modifiers:b,hasImportantModifier:p,baseClassName:h,maybePostfixModifierPosition:$}=n(f);if(d){a=f+(a.length>0?" "+a:a);continue}let y=!!$,m=l(y?h.substring(0,$):h);if(!m){if(!y){a=f+(a.length>0?" "+a:a);continue}if(m=l(h),!m){a=f+(a.length>0?" "+a:a);continue}y=!1}const v=b.length===0?"":b.length===1?b[0]:o(b).join(":"),E=p?v+Nl:v,C=E+m;if(i.indexOf(C)>-1)continue;i.push(C);const R=r(m,y);for(let A=0;A0?" "+a:a)}return a},kb=(...t)=>{let e=0,n,l,r="";for(;e{if(typeof t=="string")return t;let e,n="";for(let l=0;l{let n,l,r,o;const i=a=>{const c=e.reduce((f,d)=>d(f),t());return n=wb(c),l=n.cache.get,r=n.cache.set,o=u,u(a)},u=a=>{const c=l(a);if(c)return c;const f=Db(a,n);return r(a,f),f};return o=i,(...a)=>o(kb(...a))},Pb=[],ye=t=>{const e=n=>n[t]||Pb;return e.isThemeGetter=!0,e},vu=/^\[(?:(\w[\w-]*):)?(.+)\]$/i,xu=/^\((?:(\w[\w-]*):)?(.+)\)$/i,Ab=/^\d+\/\d+$/,Tb=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,Bb=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,Kb=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,Rb=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,Mb=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,St=t=>Ab.test(t),ee=t=>!!t&&!Number.isNaN(Number(t)),ot=t=>!!t&&Number.isInteger(Number(t)),Cl=t=>t.endsWith("%")&&ee(t.slice(0,-1)),Ye=t=>Tb.test(t),Ib=()=>!0,Fb=t=>Bb.test(t)&&!Kb.test(t),Cu=()=>!1,Lb=t=>Rb.test(t),zb=t=>Mb.test(t),Nb=t=>!H(t)&&!W(t),Ob=t=>Ot(t,Su,Cu),H=t=>vu.test(t),pt=t=>Ot(t,Du,Fb),El=t=>Ot(t,Wb,ee),Mo=t=>Ot(t,Eu,Cu),Vb=t=>Ot(t,wu,zb),kn=t=>Ot(t,ku,Lb),W=t=>xu.test(t),Ut=t=>Vt(t,Du),jb=t=>Vt(t,Ub),Io=t=>Vt(t,Eu),_b=t=>Vt(t,Su),Hb=t=>Vt(t,wu),Pn=t=>Vt(t,ku,!0),Ot=(t,e,n)=>{const l=vu.exec(t);return l?l[1]?e(l[1]):n(l[2]):!1},Vt=(t,e,n=!1)=>{const l=xu.exec(t);return l?l[1]?e(l[1]):n:!1},Eu=t=>t==="position"||t==="percentage",wu=t=>t==="image"||t==="url",Su=t=>t==="length"||t==="size"||t==="bg-size",Du=t=>t==="length",Wb=t=>t==="number",Ub=t=>t==="family-name",ku=t=>t==="shadow",Vl=()=>{const t=ye("color"),e=ye("font"),n=ye("text"),l=ye("font-weight"),r=ye("tracking"),o=ye("leading"),i=ye("breakpoint"),u=ye("container"),a=ye("spacing"),c=ye("radius"),f=ye("shadow"),d=ye("inset-shadow"),b=ye("text-shadow"),p=ye("drop-shadow"),h=ye("blur"),$=ye("perspective"),y=ye("aspect"),m=ye("ease"),v=ye("animate"),E=()=>["auto","avoid","all","avoid-page","page","left","right","column"],C=()=>["center","top","bottom","left","right","top-left","left-top","top-right","right-top","bottom-right","right-bottom","bottom-left","left-bottom"],R=()=>[...C(),W,H],A=()=>["auto","hidden","clip","visible","scroll"],K=()=>["auto","contain","none"],P=()=>[W,H,a],z=()=>[St,"full","auto",...P()],B=()=>[ot,"none","subgrid",W,H],N=()=>["auto",{span:["full",ot,W,H]},ot,W,H],U=()=>[ot,"auto",W,H],_=()=>["auto","min","max","fr",W,H],x=()=>["start","end","center","between","around","evenly","stretch","baseline","center-safe","end-safe"],S=()=>["start","end","center","stretch","center-safe","end-safe"],I=()=>["auto",...P()],w=()=>[St,"auto","full","dvw","dvh","lvw","lvh","svw","svh","min","max","fit",...P()],k=()=>[t,W,H],D=()=>[...C(),Io,Mo,{position:[W,H]}],T=()=>["no-repeat",{repeat:["","x","y","space","round"]}],O=()=>["auto","cover","contain",_b,Ob,{size:[W,H]}],Z=()=>[Cl,Ut,pt],F=()=>["","none","full",c,W,H],V=()=>["",ee,Ut,pt],q=()=>["solid","dashed","dotted","double"],Q=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],J=()=>[ee,Cl,Io,Mo],ge=()=>["","none",h,W,H],Be=()=>["none",ee,W,H],L=()=>["none",ee,W,H],Y=()=>[ee,W,H],ue=()=>[St,"full",...P()];return{cacheSize:500,theme:{animate:["spin","ping","pulse","bounce"],aspect:["video"],blur:[Ye],breakpoint:[Ye],color:[Ib],container:[Ye],"drop-shadow":[Ye],ease:["in","out","in-out"],font:[Nb],"font-weight":["thin","extralight","light","normal","medium","semibold","bold","extrabold","black"],"inset-shadow":[Ye],leading:["none","tight","snug","normal","relaxed","loose"],perspective:["dramatic","near","normal","midrange","distant","none"],radius:[Ye],shadow:[Ye],spacing:["px",ee],text:[Ye],"text-shadow":[Ye],tracking:["tighter","tight","normal","wide","wider","widest"]},classGroups:{aspect:[{aspect:["auto","square",St,H,W,y]}],container:["container"],columns:[{columns:[ee,H,W,u]}],"break-after":[{"break-after":E()}],"break-before":[{"break-before":E()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],sr:["sr-only","not-sr-only"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:R()}],overflow:[{overflow:A()}],"overflow-x":[{"overflow-x":A()}],"overflow-y":[{"overflow-y":A()}],overscroll:[{overscroll:K()}],"overscroll-x":[{"overscroll-x":K()}],"overscroll-y":[{"overscroll-y":K()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:z()}],"inset-x":[{"inset-x":z()}],"inset-y":[{"inset-y":z()}],start:[{start:z()}],end:[{end:z()}],top:[{top:z()}],right:[{right:z()}],bottom:[{bottom:z()}],left:[{left:z()}],visibility:["visible","invisible","collapse"],z:[{z:[ot,"auto",W,H]}],basis:[{basis:[St,"full","auto",u,...P()]}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["nowrap","wrap","wrap-reverse"]}],flex:[{flex:[ee,St,"auto","initial","none",H]}],grow:[{grow:["",ee,W,H]}],shrink:[{shrink:["",ee,W,H]}],order:[{order:[ot,"first","last","none",W,H]}],"grid-cols":[{"grid-cols":B()}],"col-start-end":[{col:N()}],"col-start":[{"col-start":U()}],"col-end":[{"col-end":U()}],"grid-rows":[{"grid-rows":B()}],"row-start-end":[{row:N()}],"row-start":[{"row-start":U()}],"row-end":[{"row-end":U()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":_()}],"auto-rows":[{"auto-rows":_()}],gap:[{gap:P()}],"gap-x":[{"gap-x":P()}],"gap-y":[{"gap-y":P()}],"justify-content":[{justify:[...x(),"normal"]}],"justify-items":[{"justify-items":[...S(),"normal"]}],"justify-self":[{"justify-self":["auto",...S()]}],"align-content":[{content:["normal",...x()]}],"align-items":[{items:[...S(),{baseline:["","last"]}]}],"align-self":[{self:["auto",...S(),{baseline:["","last"]}]}],"place-content":[{"place-content":x()}],"place-items":[{"place-items":[...S(),"baseline"]}],"place-self":[{"place-self":["auto",...S()]}],p:[{p:P()}],px:[{px:P()}],py:[{py:P()}],ps:[{ps:P()}],pe:[{pe:P()}],pt:[{pt:P()}],pr:[{pr:P()}],pb:[{pb:P()}],pl:[{pl:P()}],m:[{m:I()}],mx:[{mx:I()}],my:[{my:I()}],ms:[{ms:I()}],me:[{me:I()}],mt:[{mt:I()}],mr:[{mr:I()}],mb:[{mb:I()}],ml:[{ml:I()}],"space-x":[{"space-x":P()}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":P()}],"space-y-reverse":["space-y-reverse"],size:[{size:w()}],w:[{w:[u,"screen",...w()]}],"min-w":[{"min-w":[u,"screen","none",...w()]}],"max-w":[{"max-w":[u,"screen","none","prose",{screen:[i]},...w()]}],h:[{h:["screen","lh",...w()]}],"min-h":[{"min-h":["screen","lh","none",...w()]}],"max-h":[{"max-h":["screen","lh",...w()]}],"font-size":[{text:["base",n,Ut,pt]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:[l,W,El]}],"font-stretch":[{"font-stretch":["ultra-condensed","extra-condensed","condensed","semi-condensed","normal","semi-expanded","expanded","extra-expanded","ultra-expanded",Cl,H]}],"font-family":[{font:[jb,H,e]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:[r,W,H]}],"line-clamp":[{"line-clamp":[ee,"none",W,El]}],leading:[{leading:[o,...P()]}],"list-image":[{"list-image":["none",W,H]}],"list-style-position":[{list:["inside","outside"]}],"list-style-type":[{list:["disc","decimal","none",W,H]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"placeholder-color":[{placeholder:k()}],"text-color":[{text:k()}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...q(),"wavy"]}],"text-decoration-thickness":[{decoration:[ee,"from-font","auto",W,pt]}],"text-decoration-color":[{decoration:k()}],"underline-offset":[{"underline-offset":[ee,"auto",W,H]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:P()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",W,H]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],wrap:[{wrap:["break-word","anywhere","normal"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",W,H]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:D()}],"bg-repeat":[{bg:T()}],"bg-size":[{bg:O()}],"bg-image":[{bg:["none",{linear:[{to:["t","tr","r","br","b","bl","l","tl"]},ot,W,H],radial:["",W,H],conic:[ot,W,H]},Hb,Vb]}],"bg-color":[{bg:k()}],"gradient-from-pos":[{from:Z()}],"gradient-via-pos":[{via:Z()}],"gradient-to-pos":[{to:Z()}],"gradient-from":[{from:k()}],"gradient-via":[{via:k()}],"gradient-to":[{to:k()}],rounded:[{rounded:F()}],"rounded-s":[{"rounded-s":F()}],"rounded-e":[{"rounded-e":F()}],"rounded-t":[{"rounded-t":F()}],"rounded-r":[{"rounded-r":F()}],"rounded-b":[{"rounded-b":F()}],"rounded-l":[{"rounded-l":F()}],"rounded-ss":[{"rounded-ss":F()}],"rounded-se":[{"rounded-se":F()}],"rounded-ee":[{"rounded-ee":F()}],"rounded-es":[{"rounded-es":F()}],"rounded-tl":[{"rounded-tl":F()}],"rounded-tr":[{"rounded-tr":F()}],"rounded-br":[{"rounded-br":F()}],"rounded-bl":[{"rounded-bl":F()}],"border-w":[{border:V()}],"border-w-x":[{"border-x":V()}],"border-w-y":[{"border-y":V()}],"border-w-s":[{"border-s":V()}],"border-w-e":[{"border-e":V()}],"border-w-t":[{"border-t":V()}],"border-w-r":[{"border-r":V()}],"border-w-b":[{"border-b":V()}],"border-w-l":[{"border-l":V()}],"divide-x":[{"divide-x":V()}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":V()}],"divide-y-reverse":["divide-y-reverse"],"border-style":[{border:[...q(),"hidden","none"]}],"divide-style":[{divide:[...q(),"hidden","none"]}],"border-color":[{border:k()}],"border-color-x":[{"border-x":k()}],"border-color-y":[{"border-y":k()}],"border-color-s":[{"border-s":k()}],"border-color-e":[{"border-e":k()}],"border-color-t":[{"border-t":k()}],"border-color-r":[{"border-r":k()}],"border-color-b":[{"border-b":k()}],"border-color-l":[{"border-l":k()}],"divide-color":[{divide:k()}],"outline-style":[{outline:[...q(),"none","hidden"]}],"outline-offset":[{"outline-offset":[ee,W,H]}],"outline-w":[{outline:["",ee,Ut,pt]}],"outline-color":[{outline:k()}],shadow:[{shadow:["","none",f,Pn,kn]}],"shadow-color":[{shadow:k()}],"inset-shadow":[{"inset-shadow":["none",d,Pn,kn]}],"inset-shadow-color":[{"inset-shadow":k()}],"ring-w":[{ring:V()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:k()}],"ring-offset-w":[{"ring-offset":[ee,pt]}],"ring-offset-color":[{"ring-offset":k()}],"inset-ring-w":[{"inset-ring":V()}],"inset-ring-color":[{"inset-ring":k()}],"text-shadow":[{"text-shadow":["none",b,Pn,kn]}],"text-shadow-color":[{"text-shadow":k()}],opacity:[{opacity:[ee,W,H]}],"mix-blend":[{"mix-blend":[...Q(),"plus-darker","plus-lighter"]}],"bg-blend":[{"bg-blend":Q()}],"mask-clip":[{"mask-clip":["border","padding","content","fill","stroke","view"]},"mask-no-clip"],"mask-composite":[{mask:["add","subtract","intersect","exclude"]}],"mask-image-linear-pos":[{"mask-linear":[ee]}],"mask-image-linear-from-pos":[{"mask-linear-from":J()}],"mask-image-linear-to-pos":[{"mask-linear-to":J()}],"mask-image-linear-from-color":[{"mask-linear-from":k()}],"mask-image-linear-to-color":[{"mask-linear-to":k()}],"mask-image-t-from-pos":[{"mask-t-from":J()}],"mask-image-t-to-pos":[{"mask-t-to":J()}],"mask-image-t-from-color":[{"mask-t-from":k()}],"mask-image-t-to-color":[{"mask-t-to":k()}],"mask-image-r-from-pos":[{"mask-r-from":J()}],"mask-image-r-to-pos":[{"mask-r-to":J()}],"mask-image-r-from-color":[{"mask-r-from":k()}],"mask-image-r-to-color":[{"mask-r-to":k()}],"mask-image-b-from-pos":[{"mask-b-from":J()}],"mask-image-b-to-pos":[{"mask-b-to":J()}],"mask-image-b-from-color":[{"mask-b-from":k()}],"mask-image-b-to-color":[{"mask-b-to":k()}],"mask-image-l-from-pos":[{"mask-l-from":J()}],"mask-image-l-to-pos":[{"mask-l-to":J()}],"mask-image-l-from-color":[{"mask-l-from":k()}],"mask-image-l-to-color":[{"mask-l-to":k()}],"mask-image-x-from-pos":[{"mask-x-from":J()}],"mask-image-x-to-pos":[{"mask-x-to":J()}],"mask-image-x-from-color":[{"mask-x-from":k()}],"mask-image-x-to-color":[{"mask-x-to":k()}],"mask-image-y-from-pos":[{"mask-y-from":J()}],"mask-image-y-to-pos":[{"mask-y-to":J()}],"mask-image-y-from-color":[{"mask-y-from":k()}],"mask-image-y-to-color":[{"mask-y-to":k()}],"mask-image-radial":[{"mask-radial":[W,H]}],"mask-image-radial-from-pos":[{"mask-radial-from":J()}],"mask-image-radial-to-pos":[{"mask-radial-to":J()}],"mask-image-radial-from-color":[{"mask-radial-from":k()}],"mask-image-radial-to-color":[{"mask-radial-to":k()}],"mask-image-radial-shape":[{"mask-radial":["circle","ellipse"]}],"mask-image-radial-size":[{"mask-radial":[{closest:["side","corner"],farthest:["side","corner"]}]}],"mask-image-radial-pos":[{"mask-radial-at":C()}],"mask-image-conic-pos":[{"mask-conic":[ee]}],"mask-image-conic-from-pos":[{"mask-conic-from":J()}],"mask-image-conic-to-pos":[{"mask-conic-to":J()}],"mask-image-conic-from-color":[{"mask-conic-from":k()}],"mask-image-conic-to-color":[{"mask-conic-to":k()}],"mask-mode":[{mask:["alpha","luminance","match"]}],"mask-origin":[{"mask-origin":["border","padding","content","fill","stroke","view"]}],"mask-position":[{mask:D()}],"mask-repeat":[{mask:T()}],"mask-size":[{mask:O()}],"mask-type":[{"mask-type":["alpha","luminance"]}],"mask-image":[{mask:["none",W,H]}],filter:[{filter:["","none",W,H]}],blur:[{blur:ge()}],brightness:[{brightness:[ee,W,H]}],contrast:[{contrast:[ee,W,H]}],"drop-shadow":[{"drop-shadow":["","none",p,Pn,kn]}],"drop-shadow-color":[{"drop-shadow":k()}],grayscale:[{grayscale:["",ee,W,H]}],"hue-rotate":[{"hue-rotate":[ee,W,H]}],invert:[{invert:["",ee,W,H]}],saturate:[{saturate:[ee,W,H]}],sepia:[{sepia:["",ee,W,H]}],"backdrop-filter":[{"backdrop-filter":["","none",W,H]}],"backdrop-blur":[{"backdrop-blur":ge()}],"backdrop-brightness":[{"backdrop-brightness":[ee,W,H]}],"backdrop-contrast":[{"backdrop-contrast":[ee,W,H]}],"backdrop-grayscale":[{"backdrop-grayscale":["",ee,W,H]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[ee,W,H]}],"backdrop-invert":[{"backdrop-invert":["",ee,W,H]}],"backdrop-opacity":[{"backdrop-opacity":[ee,W,H]}],"backdrop-saturate":[{"backdrop-saturate":[ee,W,H]}],"backdrop-sepia":[{"backdrop-sepia":["",ee,W,H]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":P()}],"border-spacing-x":[{"border-spacing-x":P()}],"border-spacing-y":[{"border-spacing-y":P()}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["","all","colors","opacity","shadow","transform","none",W,H]}],"transition-behavior":[{transition:["normal","discrete"]}],duration:[{duration:[ee,"initial",W,H]}],ease:[{ease:["linear","initial",m,W,H]}],delay:[{delay:[ee,W,H]}],animate:[{animate:["none",v,W,H]}],backface:[{backface:["hidden","visible"]}],perspective:[{perspective:[$,W,H]}],"perspective-origin":[{"perspective-origin":R()}],rotate:[{rotate:Be()}],"rotate-x":[{"rotate-x":Be()}],"rotate-y":[{"rotate-y":Be()}],"rotate-z":[{"rotate-z":Be()}],scale:[{scale:L()}],"scale-x":[{"scale-x":L()}],"scale-y":[{"scale-y":L()}],"scale-z":[{"scale-z":L()}],"scale-3d":["scale-3d"],skew:[{skew:Y()}],"skew-x":[{"skew-x":Y()}],"skew-y":[{"skew-y":Y()}],transform:[{transform:[W,H,"","none","gpu","cpu"]}],"transform-origin":[{origin:R()}],"transform-style":[{transform:["3d","flat"]}],translate:[{translate:ue()}],"translate-x":[{"translate-x":ue()}],"translate-y":[{"translate-y":ue()}],"translate-z":[{"translate-z":ue()}],"translate-none":["translate-none"],accent:[{accent:k()}],appearance:[{appearance:["none","auto"]}],"caret-color":[{caret:k()}],"color-scheme":[{scheme:["normal","dark","light","light-dark","only-dark","only-light"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",W,H]}],"field-sizing":[{"field-sizing":["fixed","content"]}],"pointer-events":[{"pointer-events":["auto","none"]}],resize:[{resize:["none","","y","x"]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":P()}],"scroll-mx":[{"scroll-mx":P()}],"scroll-my":[{"scroll-my":P()}],"scroll-ms":[{"scroll-ms":P()}],"scroll-me":[{"scroll-me":P()}],"scroll-mt":[{"scroll-mt":P()}],"scroll-mr":[{"scroll-mr":P()}],"scroll-mb":[{"scroll-mb":P()}],"scroll-ml":[{"scroll-ml":P()}],"scroll-p":[{"scroll-p":P()}],"scroll-px":[{"scroll-px":P()}],"scroll-py":[{"scroll-py":P()}],"scroll-ps":[{"scroll-ps":P()}],"scroll-pe":[{"scroll-pe":P()}],"scroll-pt":[{"scroll-pt":P()}],"scroll-pr":[{"scroll-pr":P()}],"scroll-pb":[{"scroll-pb":P()}],"scroll-pl":[{"scroll-pl":P()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",W,H]}],fill:[{fill:["none",...k()]}],"stroke-w":[{stroke:[ee,Ut,pt,El]}],stroke:[{stroke:["none",...k()]}],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-x","border-w-y","border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-x","border-color-y","border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],translate:["translate-x","translate-y","translate-none"],"translate-none":["translate","translate-x","translate-y","translate-z"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]},orderSensitiveModifiers:["*","**","after","backdrop","before","details-content","file","first-letter","first-line","marker","placeholder","selection"]}},Gb=(t,{cacheSize:e,prefix:n,experimentalParseClassName:l,extend:r={},override:o={}})=>(Xt(t,"cacheSize",e),Xt(t,"prefix",n),Xt(t,"experimentalParseClassName",l),An(t.theme,o.theme),An(t.classGroups,o.classGroups),An(t.conflictingClassGroups,o.conflictingClassGroups),An(t.conflictingClassGroupModifiers,o.conflictingClassGroupModifiers),Xt(t,"orderSensitiveModifiers",o.orderSensitiveModifiers),Tn(t.theme,r.theme),Tn(t.classGroups,r.classGroups),Tn(t.conflictingClassGroups,r.conflictingClassGroups),Tn(t.conflictingClassGroupModifiers,r.conflictingClassGroupModifiers),Pu(t,r,"orderSensitiveModifiers"),t),Xt=(t,e,n)=>{n!==void 0&&(t[e]=n)},An=(t,e)=>{if(e)for(const n in e)Xt(t,n,e[n])},Tn=(t,e)=>{if(e)for(const n in e)Pu(t,e,n)},Pu=(t,e,n)=>{const l=e[n];l!==void 0&&(t[n]=t[n]?t[n].concat(l):l)},qb=(t,...e)=>typeof t=="function"?Ol(Vl,t,...e):Ol(()=>Gb(Vl(),t),...e),Zb=Ol(Vl);var Yb=t=>Pe(t)?Zb:qb({...t,extend:{theme:t.theme,classGroups:t.classGroups,conflictingClassGroupModifiers:t.conflictingClassGroupModifiers,conflictingClassGroups:t.conflictingClassGroups,...t.extend}}),Xb=(t,e)=>{const n=It(t);return!n||!((e==null?void 0:e.twMerge)??!0)?n:((!Je.cachedTwMerge||Je.didTwMergeConfigChange)&&(Je.didTwMergeConfigChange=!1,Je.cachedTwMerge=Yb(Je.cachedTwMergeConfig)),Je.cachedTwMerge(n)||void 0)},Jb=(...t)=>e=>Xb(t,e),{tv:De}=ub(Jb);const Qn=De({defaultVariants:{size:"md",status:"danger",variant:"opaque"},slots:{backdrop:"alert-dialog__backdrop",body:"alert-dialog__body",closeTrigger:"alert-dialog__close-trigger",container:"alert-dialog__container",dialog:"alert-dialog__dialog",footer:"alert-dialog__footer",header:"alert-dialog__header",heading:"alert-dialog__heading",icon:"alert-dialog__icon",trigger:"alert-dialog__trigger"},variants:{size:{cover:{dialog:"alert-dialog__dialog--cover"},lg:{dialog:"alert-dialog__dialog--lg"},md:{dialog:"alert-dialog__dialog--md"},sm:{dialog:"alert-dialog__dialog--sm"},xs:{dialog:"alert-dialog__dialog--xs"}},status:{accent:{icon:"alert-dialog__icon--accent"},danger:{icon:"alert-dialog__icon--danger"},default:{icon:"alert-dialog__icon--default"},success:{icon:"alert-dialog__icon--success"},warning:{icon:"alert-dialog__icon--warning"}},variant:{blur:{backdrop:"alert-dialog__backdrop--blur"},opaque:{backdrop:"alert-dialog__backdrop--opaque"},transparent:{backdrop:"alert-dialog__backdrop--transparent"}}}}),Qb=De({base:"button",defaultVariants:{fullWidth:!1,isIconOnly:!1,size:"md",variant:"primary"},variants:{fullWidth:{false:"",true:"button--full-width"},isIconOnly:{true:"button--icon-only"},size:{lg:"button--lg",md:"button--md",sm:"button--sm"},variant:{danger:"button--danger","danger-soft":"button--danger-soft",ghost:"button--ghost",outline:"button--outline",primary:"button--primary",secondary:"button--secondary",tertiary:"button--tertiary"}}}),eh=De({defaultVariants:{variant:"default"},slots:{base:"card",content:"card__content",description:"card__description",footer:"card__footer",header:"card__header",title:"card__title"},variants:{variant:{default:{base:"card--default"},secondary:{base:"card--secondary"},tertiary:{base:"card--tertiary"},transparent:{base:"card--transparent"}}}}),th=De({defaultVariants:{color:"default",variant:"secondary"},slots:{base:"chip",label:"chip__label"},variants:{color:{accent:{base:"chip--accent"},danger:{base:"chip--danger"},default:{base:"chip--default"},success:{base:"chip--success"},warning:{base:"chip--warning"}},size:{lg:{base:"chip--lg"},md:{base:"chip--md"},sm:{base:"chip--sm"}},variant:{primary:{base:"chip--primary"},secondary:{base:"chip--secondary"},soft:{base:"chip--soft"},tertiary:{base:"chip--tertiary"}}}}),nh=De({base:"close-button",defaultVariants:{variant:"default"},variants:{variant:{default:"close-button--default"}}}),lh=De({defaultVariants:{fullWidth:!1},slots:{base:"combo-box",inputGroup:"combo-box__input-group",popover:"combo-box__popover",trigger:"combo-box__trigger"},variants:{fullWidth:{false:{},true:{base:"combo-box--full-width",inputGroup:"combo-box__input-group--full-width"}}}}),rh=De({base:"description"}),oh=De({base:"input",defaultVariants:{fullWidth:!1,variant:"primary"},variants:{fullWidth:{false:"",true:"input--full-width"},variant:{primary:"input--primary",secondary:"input--secondary"}}}),ih=De({base:"label",defaultVariants:{isDisabled:!1,isInvalid:!1,isRequired:!1},variants:{isDisabled:{true:"label--disabled"},isInvalid:{true:"label--invalid"},isRequired:{true:"label--required"}}}),uh=De({slots:{base:"link",icon:"link__icon"}}),ah=De({base:"list-box",defaultVariants:{variant:"default"},variants:{variant:{danger:"list-box--danger",default:"list-box--default"}}}),sh=De({defaultVariants:{variant:"default"},slots:{indicator:"list-box-item__indicator",item:"list-box-item"},variants:{variant:{danger:{item:"list-box-item--danger"},default:{item:"list-box-item--default"}}}}),ch=De({base:"list-box-section"}),dh=De({base:"spinner",defaultVariants:{color:"accent",size:"md"},variants:{color:{accent:"spinner--accent",current:"spinner--current",danger:"spinner--danger",success:"spinner--success",warning:"spinner--warning"},size:{lg:"spinner--lg",md:"spinner--md",sm:"spinner--sm",xl:"spinner--xl"}}}),fh=De({defaultVariants:{variant:"primary"},slots:{base:"table-root",body:"table__body",cell:"table__cell",column:"table__column",columnResizer:"table__column-resizer",content:"table__content",footer:"table__footer",header:"table__header",loadMore:"table__load-more",loadMoreContent:"table__load-more-content",resizableContainer:"table__resizable-container",row:"table__row",scrollContainer:"table__scroll-container",sortableColumnHeader:"table__sortable-column-header",sortableColumnIndicator:"table__sortable-column-indicator"},variants:{variant:{primary:{base:"table-root--primary"},secondary:{base:"table-root--secondary"}}}}),ph=De({base:"textfield",defaultVariants:{fullWidth:!1},variants:{fullWidth:{false:"",true:"textfield--full-width"}}}),mt=Symbol("default");function _e({values:t,children:e}){for(let[n,l]of t)e=g.createElement(n.Provider,{value:l},e);return e}function ce(t){let{className:e,style:n,children:l,defaultClassName:r,defaultChildren:o,defaultStyle:i,values:u,render:a}=t;return s.useMemo(()=>{let c,f,d;return typeof e=="function"?c=e({...u,defaultClassName:r}):c=e,typeof n=="function"?f=n({...u,defaultStyle:i||{}}):f=n,typeof l=="function"?d=l({...u,defaultChildren:o}):l==null?d=o:d=l,{className:c??r,style:f||i?{...i,...f}:void 0,children:d??o,"data-rac":"",render:a?b=>a(b,u):void 0}},[e,n,l,r,o,i,u,a])}function bh(t,e){return n=>e(typeof t=="function"?t(n):t,n)}function el(t,e){let n=s.useContext(t);if(e===null)return null;if(n&&typeof n=="object"&&"slots"in n&&n.slots){let l=e||mt;if(!n.slots[l]){let r=new Intl.ListFormat().format(Object.keys(n.slots).map(i=>`"${i}"`)),o=e?`Invalid slot "${e}".`:"A slot prop is required.";throw new Error(`${o} Valid slot names are ${r}.`)}return n.slots[l]}return n}function xe(t,e,n){let l=el(n,t.slot)||{},{ref:r,...o}=l,i=ke(s.useMemo(()=>ft(e,r),[e,r])),u=G(o,t);return"style"in o&&o.style&&"style"in t&&t.style&&(typeof o.style=="function"||typeof t.style=="function"?u.style=a=>{let c=typeof o.style=="function"?o.style(a):o.style,f={...a.defaultStyle,...c},d=typeof t.style=="function"?t.style({...a,defaultStyle:f}):t.style;return{...f,...d}}:u.style={...o.style,...t.style}),[u,i]}function Dr(t=!0){let[e,n]=s.useState(t),l=s.useRef(!1),r=s.useCallback(o=>{l.current=!0,n(!!o)},[]);return ne(()=>{l.current||n(!1)},[]),[r,e]}function kr(t){const e=/^(data-.*)$/;let n={};for(const l in t)e.test(l)||(n[l]=t[l]);return n}function hh(t,e,n){let{render:l,...r}=e,o=s.useRef(null),i=s.useMemo(()=>ft(n,o),[n,o]);ne(()=>{},[t,l]);let u={...r,ref:i};return l?l(u,void 0):g.createElement(t,u)}const Fo={},le=new Proxy({},{get(t,e){if(typeof e!="string")return;let n=Fo[e];return n||(n=s.forwardRef(hh.bind(null,e)),Fo[e]=n),n}});typeof HTMLTemplateElement<"u"&&(Object.defineProperty(HTMLTemplateElement.prototype,"firstChild",{configurable:!0,enumerable:!0,get:function(){return this.content.firstChild}}),Object.defineProperty(HTMLTemplateElement.prototype,"appendChild",{configurable:!0,enumerable:!0,value:function(t){return this.content.appendChild(t)}}),Object.defineProperty(HTMLTemplateElement.prototype,"removeChild",{configurable:!0,enumerable:!0,value:function(t){return this.content.removeChild(t)}}),Object.defineProperty(HTMLTemplateElement.prototype,"insertBefore",{configurable:!0,enumerable:!0,value:function(t,e){return this.content.insertBefore(t,e)}}));const jn=s.createContext(!1);function mh(t){if(s.useContext(jn))return g.createElement(g.Fragment,null,t.children);let n=g.createElement(jn.Provider,{value:!0},t.children);return g.createElement("template",null,n)}function gn(t){let e=(n,l)=>s.useContext(jn)?null:t(n,l);return e.displayName=t.displayName||t.name,s.forwardRef(e)}function gh(){return s.useContext(jn)}const tl=s.createContext({}),yh=gn(function(e,n){[e,n]=xe(e,n,tl);let{elementType:l="label",...r}=e,o=le[l];return g.createElement(o,{className:"react-aria-Label",...r,ref:n})});function Au(t){let{id:e,label:n,"aria-labelledby":l,"aria-label":r,labelElementType:o="label"}=t;e=$e(e);let i=$e(),u={};n&&(l=l?`${i} ${l}`:i,u={id:i,htmlFor:o==="label"?e:void 0});let a=un({id:e,"aria-label":r,"aria-labelledby":l});return{labelProps:u,fieldProps:a}}const $h=new Set(["Arab","Syrc","Samr","Mand","Thaa","Mend","Nkoo","Adlm","Rohg","Hebr"]),vh=new Set(["ae","ar","arc","bcc","bqi","ckb","dv","fa","glk","he","ku","mzn","nqo","pnb","ps","sd","ug","ur","yi"]);function xh(t){if(Intl.Locale){let n=new Intl.Locale(t).maximize(),l=typeof n.getTextInfo=="function"?n.getTextInfo():n.textInfo;if(l)return l.direction==="rtl";if(n.script)return $h.has(n.script)}let e=t.split("-")[0];return vh.has(e)}const Tu=Symbol.for("react-aria.i18n.locale");function Bu(){let t=typeof window<"u"&&window[Tu]||typeof navigator<"u"&&(navigator.language||navigator.userLanguage)||"en-US";try{Intl.DateTimeFormat.supportedLocalesOf([t])}catch{t="en-US"}return{locale:t,direction:xh(t)?"rtl":"ltr"}}let jl=Bu(),Jt=new Set;function Lo(){jl=Bu();for(let t of Jt)t(jl)}function Ch(){let t=ct(),[e,n]=s.useState(jl);return s.useEffect(()=>(Jt.size===0&&window.addEventListener("languagechange",Lo),Jt.add(n),()=>{Jt.delete(n),Jt.size===0&&window.removeEventListener("languagechange",Lo)}),[]),t?{locale:typeof window<"u"&&window[Tu]||"en-US",direction:"ltr"}:e}const Eh=g.createContext(null);function Re(){let t=Ch();return s.useContext(Eh)||t}function _l(t,e=-1/0,n=1/0){return Math.min(Math.max(t,e),n)}const wh=s.createContext(null),Ku=7e3;let We=null;function gt(t,e="assertive",n=Ku){We?We.announce(t,e,n):(We=new Sh,(typeof IS_REACT_ACT_ENVIRONMENT=="boolean"?IS_REACT_ACT_ENVIRONMENT:typeof jest<"u")?We.announce(t,e,n):setTimeout(()=>{We!=null&&We.isAttached()&&(We==null||We.announce(t,e,n))},100))}class Sh{constructor(){this.node=null,this.assertiveLog=null,this.politeLog=null,typeof document<"u"&&(this.node=document.createElement("div"),this.node.dataset.liveAnnouncer="true",Object.assign(this.node.style,{border:0,clip:"rect(0 0 0 0)",clipPath:"inset(50%)",height:"1px",margin:"-1px",overflow:"hidden",padding:0,position:"absolute",width:"1px",whiteSpace:"nowrap"}),this.assertiveLog=this.createLog("assertive"),this.node.appendChild(this.assertiveLog),this.politeLog=this.createLog("polite"),this.node.appendChild(this.politeLog),document.body.prepend(this.node))}isAttached(){var e;return(e=this.node)==null?void 0:e.isConnected}createLog(e){let n=document.createElement("div");return n.setAttribute("role","log"),n.setAttribute("aria-live",e),n.setAttribute("aria-relevant","additions"),n}destroy(){this.node&&(document.body.removeChild(this.node),this.node=null)}announce(e,n="assertive",l=Ku){var o,i;if(!this.node)return;let r=document.createElement("div");typeof e=="object"?(r.setAttribute("role","img"),r.setAttribute("aria-labelledby",e["aria-labelledby"])):r.textContent=e,n==="assertive"?(o=this.assertiveLog)==null||o.appendChild(r):(i=this.politeLog)==null||i.appendChild(r),e!==""&&setTimeout(()=>{r.remove()},l)}clear(e){this.node&&((!e||e==="assertive")&&this.assertiveLog&&(this.assertiveLog.innerHTML=""),(!e||e==="polite")&&this.politeLog&&(this.politeLog.innerHTML=""))}}function Pr(t){let e=t;return e.nativeEvent=t,e.isDefaultPrevented=()=>e.defaultPrevented,e.isPropagationStopped=()=>e.cancelBubble,e.persist=()=>{},e}function Ru(t,e){Object.defineProperty(t,"target",{value:e}),Object.defineProperty(t,"currentTarget",{value:e})}function Mu(t){let e=s.useRef({isFocused:!1,observer:null});return ne(()=>{const n=e.current;return()=>{n.observer&&(n.observer.disconnect(),n.observer=null)}},[]),s.useCallback(n=>{let l=j(n);if(l instanceof HTMLButtonElement||l instanceof HTMLInputElement||l instanceof HTMLTextAreaElement||l instanceof HTMLSelectElement){e.current.isFocused=!0;let r=l,o=i=>{if(e.current.isFocused=!1,r.disabled){let u=Pr(i);t==null||t(u)}e.current.observer&&(e.current.observer.disconnect(),e.current.observer=null)};r.addEventListener("focusout",o,{once:!0}),e.current.observer=new MutationObserver(()=>{var i;if(e.current.isFocused&&r.disabled){(i=e.current.observer)==null||i.disconnect();let u=r===oe()?null:oe();r.dispatchEvent(new FocusEvent("blur",{relatedTarget:u})),r.dispatchEvent(new FocusEvent("focusout",{bubbles:!0,relatedTarget:u}))}}),e.current.observer.observe(r,{attributes:!0,attributeFilter:["disabled"]})}},[t])}let _n=!1;function Dh(t){for(;t&&!cu(t,{skipVisibilityCheck:!0});)t=t.parentElement;let e=we(t),n=e.document.activeElement;if(!n||n===t)return;_n=!0;let l=!1,r=f=>{(j(f)===n||l)&&f.stopImmediatePropagation()},o=f=>{(j(f)===n||l)&&(f.stopImmediatePropagation(),!t&&!l&&(l=!0,Ve(n),a()))},i=f=>{(j(f)===t||l)&&f.stopImmediatePropagation()},u=f=>{(j(f)===t||l)&&(f.stopImmediatePropagation(),l||(l=!0,Ve(n),a()))};e.addEventListener("blur",r,!0),e.addEventListener("focusout",o,!0),e.addEventListener("focusin",u,!0),e.addEventListener("focus",i,!0);let a=()=>{cancelAnimationFrame(c),e.removeEventListener("blur",r,!0),e.removeEventListener("focusout",o,!0),e.removeEventListener("focusin",u,!0),e.removeEventListener("focus",i,!0),_n=!1,l=!1},c=requestAnimationFrame(a);return a}let nt=null;const sn=new Set;let nn=new Map,xt=!1,Hl=!1;const kh={Tab:!0,Escape:!0};function nl(t,e){for(let n of sn)n(t,e)}function Ph(t){return!(t.metaKey||!yt()&&t.altKey||t.ctrlKey||t.key==="Control"||t.key==="Shift"||t.key==="Meta")}function Hn(t){xt=!0,!tt.isOpening&&Ph(t)&&(nt="keyboard",nl("keyboard",t))}function Kt(t){nt="pointer","pointerType"in t&&t.pointerType,(t.type==="mousedown"||t.type==="pointerdown")&&(xt=!0,nl("pointer",t))}function Iu(t){!tt.isOpening&&iu(t)&&(xt=!0,nt="virtual")}function Fu(t){let e=we(j(t)),n=re(j(t));j(t)===e||j(t)===n||_n||!t.isTrusted||(!xt&&!Hl&&(nt="virtual",nl("virtual",t)),xt=!1,Hl=!1)}function Lu(){_n||(xt=!1,Hl=!0)}function Wn(t){if(typeof window>"u"||typeof document>"u")return;const e=we(t),n=re(t);if(nn.get(e))return;let l=e.HTMLElement.prototype.focus;e.HTMLElement.prototype.focus=function(){xt=!0,l.apply(this,arguments)},n.addEventListener("keydown",Hn,!0),n.addEventListener("keyup",Hn,!0),n.addEventListener("click",Iu,!0),e.addEventListener("focus",Fu,!0),e.addEventListener("blur",Lu,!1),typeof PointerEvent<"u"&&(n.addEventListener("pointerdown",Kt,!0),n.addEventListener("pointermove",Kt,!0),n.addEventListener("pointerup",Kt,!0)),e.addEventListener("beforeunload",()=>{zu(t)},{once:!0}),nn.set(e,{focus:l})}const zu=(t,e)=>{const n=we(t),l=re(t);e&&l.removeEventListener("DOMContentLoaded",e),nn.has(n)&&(n.HTMLElement.prototype.focus=nn.get(n).focus,l.removeEventListener("keydown",Hn,!0),l.removeEventListener("keyup",Hn,!0),l.removeEventListener("click",Iu,!0),n.removeEventListener("focus",Fu,!0),n.removeEventListener("blur",Lu,!1),typeof PointerEvent<"u"&&(l.removeEventListener("pointerdown",Kt,!0),l.removeEventListener("pointermove",Kt,!0),l.removeEventListener("pointerup",Kt,!0)),nn.delete(n))};function Ah(t){const e=re(t);let n;return e.readyState!=="loading"?Wn(t):(n=()=>{Wn(t)},e.addEventListener("DOMContentLoaded",n)),()=>zu(t,n)}typeof document<"u"&&Ah();function Ft(){return nt!=="pointer"}function cn(){return nt}function Th(t){nt=t,nl(t,null)}function Nu(){Wn();let[t,e]=s.useState(nt);return s.useEffect(()=>{let n=()=>{e(nt)};return sn.add(n),()=>{sn.delete(n)}},[]),ct()?null:t}const Bh=new Set(["checkbox","radio","range","color","file","image","button","submit","reset"]);function Kh(t,e,n){let l=n?j(n):void 0,r=re(l),o=we(l);const i=typeof o<"u"?o.HTMLInputElement:HTMLInputElement,u=typeof o<"u"?o.HTMLTextAreaElement:HTMLTextAreaElement,a=typeof o<"u"?o.HTMLElement:HTMLElement,c=typeof o<"u"?o.KeyboardEvent:KeyboardEvent;let f=oe(r);return t=t||f instanceof i&&!Bh.has(f.type)||f instanceof u||f instanceof a&&f.isContentEditable,!(t&&e==="keyboard"&&n instanceof c&&!kh[n.key])}function Rh(t,e,n){Wn(),s.useEffect(()=>{if((n==null?void 0:n.enabled)===!1)return;let l=(r,o)=>{Kh(!!(n!=null&&n.isTextInput),r,o)&&t(Ft())};return sn.add(l),()=>{sn.delete(l)}},e)}function ve(t){if(!t.isConnected)return;const e=re(t);if(cn()==="virtual"){let n=oe(e);ou(()=>{const l=oe(e);(l===n||l===e.body)&&t.isConnected&&Ve(t)})}else Ve(t)}function Ar(t){let{isDisabled:e,onFocus:n,onBlur:l,onFocusChange:r}=t;const o=s.useCallback(a=>{if(j(a)===a.currentTarget)return l&&l(a),r&&r(!1),!0},[l,r]),i=Mu(o),u=s.useCallback(a=>{let c=j(a);const f=re(c),d=f?oe(f):oe();c===a.currentTarget&&c===d&&(n&&n(a),r&&r(!0),i(a))},[r,n,i]);return{focusProps:{onFocus:!e&&(n||r||l)?u:void 0,onBlur:!e&&(l||r)?o:void 0}}}function zo(t){if(!t)return;let e=!0;return n=>{let l={...n,preventDefault(){n.preventDefault()},isDefaultPrevented(){return n.isDefaultPrevented()},stopPropagation(){e=!0},continuePropagation(){e=!1},isPropagationStopped(){return e}};t(l),e&&n.stopPropagation()}}function Tr(t){return{keyboardProps:t.isDisabled?{}:{onKeyDown:zo(t.onKeyDown),onKeyUp:zo(t.onKeyUp)}}}let Wl=g.createContext(null);function Mh(t){let e=s.useContext(Wl)||{};vr(e,t);let{ref:n,...l}=e;return l}function jt(t,e){let{focusProps:n}=Ar(t),{keyboardProps:l}=Tr(t),r=G(n,l),o=Mh(e),i=t.isDisabled?{}:o,u=s.useRef(t.autoFocus);s.useEffect(()=>{u.current&&e.current&&ve(e.current),u.current=!1},[e]);let a=t.excludeFromTabOrder?-1:0;return t.isDisabled&&(a=void 0),{focusableProps:G({...r,tabIndex:a},i)}}let Tt="default",Ul="",zn=new WeakMap;function Ou(t){if($t()){if(Tt==="default"){const e=re(t);Ul=e.documentElement.style.webkitUserSelect,e.documentElement.style.webkitUserSelect="none"}Tt="disabled"}else if(t instanceof HTMLElement||t instanceof SVGElement){let e="userSelect"in t.style?"userSelect":"webkitUserSelect";zn.set(t,t.style[e]),t.style[e]="none"}}function Gl(t){if($t()){if(Tt!=="disabled")return;Tt="restoring",setTimeout(()=>{ou(()=>{if(Tt==="restoring"){const e=re(t);e.documentElement.style.webkitUserSelect==="none"&&(e.documentElement.style.webkitUserSelect=Ul||""),Ul="",Tt="default"}})},300)}else if((t instanceof HTMLElement||t instanceof SVGElement)&&t&&zn.has(t)){let e=zn.get(t),n="userSelect"in t.style?"userSelect":"webkitUserSelect";t.style[n]==="none"&&(t.style[n]=e),t.getAttribute("style")===""&&t.removeAttribute("style"),zn.delete(t)}}const dn=g.createContext({register:()=>{}});dn.displayName="PressResponderContext";function Ih(t){let e=s.useContext(dn);if(e){let{register:n,ref:l,...r}=e;t=G(r,t),n()}return vr(e,t.ref),t}var Mt;class Bn{constructor(e,n,l,r){Eo(this,Mt);ml(this,Mt,!0);let o=(r==null?void 0:r.target)??l.currentTarget;const i=o==null?void 0:o.getBoundingClientRect();let u,a=0,c,f=null;l.clientX!=null&&l.clientY!=null&&(c=l.clientX,f=l.clientY),i&&(c!=null&&f!=null?(u=c-i.left,a=f-i.top):(u=i.width/2,a=i.height/2)),this.type=e,this.pointerType=n,this.target=l.currentTarget,this.shiftKey=l.shiftKey,this.metaKey=l.metaKey,this.ctrlKey=l.ctrlKey,this.altKey=l.altKey,this.x=u,this.y=a,this.key=l.key}continuePropagation(){ml(this,Mt,!1)}get shouldStopPropagation(){return Co(this,Mt)}}Mt=new WeakMap;const No=Symbol("linkClicked"),Oo="react-aria-pressable-style",Vo="data-react-aria-pressable";function lt(t){let{onPress:e,onPressChange:n,onPressStart:l,onPressEnd:r,onPressUp:o,onClick:i,isDisabled:u,isPressed:a,preventFocusOnPress:c,shouldCancelOnPointerExit:f,allowTextSelectionOnPress:d,ref:b,...p}=Ih(t),[h,$]=s.useState(!1),y=s.useRef({isPressed:!1,ignoreEmulatedMouseEvents:!1,didFirePressStart:!1,isTriggeringEvent:!1,activePointerId:null,target:null,isOverTarget:!1,pointerType:null,disposables:[]}),{addGlobalListener:m,removeAllGlobalListeners:v}=hn(),E=s.useCallback((x,S)=>{let I=y.current;if(u||I.didFirePressStart)return!1;let w=!0;if(I.isTriggeringEvent=!0,l){let k=new Bn("pressstart",S,x);l(k),w=k.shouldStopPropagation}return n&&n(!0),I.isTriggeringEvent=!1,I.didFirePressStart=!0,$(!0),w},[u,l,n]),C=s.useCallback((x,S,I=!0)=>{let w=y.current;if(!w.didFirePressStart)return!1;w.didFirePressStart=!1,w.isTriggeringEvent=!0;let k=!0;if(r){let D=new Bn("pressend",S,x);r(D),k=D.shouldStopPropagation}if(n&&n(!1),$(!1),e&&I&&!u){let D=new Bn("press",S,x);e(D),k&&(k=D.shouldStopPropagation)}return w.isTriggeringEvent=!1,k},[u,r,n,e]),R=Ee(C),A=s.useCallback((x,S)=>{let I=y.current;if(u)return!1;if(o){I.isTriggeringEvent=!0;let w=new Bn("pressup",S,x);return o(w),I.isTriggeringEvent=!1,w.shouldStopPropagation}return!0},[u,o]),K=Ee(A),P=s.useCallback(x=>{let S=y.current;if(S.isPressed&&S.target){S.didFirePressStart&&S.pointerType!=null&&C(bt(S.target,x),S.pointerType,!1),S.isPressed=!1,S.isOverTarget=!1,S.activePointerId=null,S.pointerType=null,v(),d||Gl(S.target);for(let I of S.disposables)I();S.disposables=[]}},[d,v,C]),z=Ee(P);s.useEffect(()=>{u&&y.current.isPressed&&z({currentTarget:y.current.target,shiftKey:!1,ctrlKey:!1,metaKey:!1,altKey:!1})},[u]);let B=s.useCallback(x=>{f&&P(x)},[f,P]),N=s.useCallback(x=>{u||i==null||i(x)},[u,i]),U=s.useCallback((x,S)=>{if(!u&&i){let I=new MouseEvent("click",x);Ru(I,S),i(Pr(I))}},[u,i]),_=s.useMemo(()=>{let x=y.current,S={onKeyDown(w){var k;if(wl(w.nativeEvent,w.currentTarget)&&te(w.currentTarget,j(w))){jo(j(w),w.key)&&w.preventDefault();let D=!0;!x.isPressed&&!w.repeat&&(x.target=w.currentTarget,x.isPressed=!0,x.pointerType="keyboard",D=E(w,"keyboard"));let T=w.currentTarget,O=Z=>{wl(Z,T)&&!Z.repeat&&te(T,j(Z))&&x.target&&K(bt(x.target,Z),"keyboard")};m(re(w.currentTarget),"keyup",dt(O,I),!0),D&&w.stopPropagation(),w.metaKey&&yt()&&((k=x.metaKeyEvents)==null||k.set(w.key,w.nativeEvent))}else w.key==="Meta"&&(x.metaKeyEvents=new Map)},onClick(w){if(!(w&&!te(w.currentTarget,j(w)))&&w&&w.button===0&&!x.isTriggeringEvent&&!tt.isOpening){let k=!0;if(u&&w.preventDefault(),!x.ignoreEmulatedMouseEvents&&!x.isPressed&&(x.pointerType==="virtual"||iu(w.nativeEvent))){let D=E(w,"virtual"),T=K(w,"virtual"),O=R(w,"virtual");N(w),k=D&&T&&O}else if(x.isPressed&&x.pointerType!=="keyboard"){let D=x.pointerType||w.nativeEvent.pointerType||"virtual",T=K(bt(w.currentTarget,w),D),O=R(bt(w.currentTarget,w),D,!0);k=T&&O,x.isOverTarget=!1,N(w),z(w)}x.ignoreEmulatedMouseEvents=!1,k&&w.stopPropagation()}}},I=w=>{var k,D,T;if(x.isPressed&&x.target&&wl(w,x.target)){jo(j(w),w.key)&&w.preventDefault();let O=j(w),Z=te(x.target,O);R(bt(x.target,w),"keyboard",Z),Z&&U(w,x.target),v(),w.key!=="Enter"&&Br(x.target)&&te(x.target,O)&&!w[No]&&(w[No]=!0,tt(x.target,w,!1)),x.isPressed=!1,(k=x.metaKeyEvents)==null||k.delete(w.key)}else if(w.key==="Meta"&&((D=x.metaKeyEvents)!=null&&D.size)){let O=x.metaKeyEvents;x.metaKeyEvents=void 0;for(let Z of O.values())(T=x.target)==null||T.dispatchEvent(new KeyboardEvent("keyup",Z))}};if(typeof PointerEvent<"u"){S.onPointerDown=D=>{if(D.button!==0||!te(D.currentTarget,j(D)))return;if(qp(D.nativeEvent)){x.pointerType="virtual";return}x.pointerType=D.pointerType;let T=!0;if(!x.isPressed){x.isPressed=!0,x.isOverTarget=!0,x.activePointerId=D.pointerId,x.target=D.currentTarget,d||Ou(x.target),T=E(D,x.pointerType);let O=j(D);"releasePointerCapture"in O&&("hasPointerCapture"in O?O.hasPointerCapture(D.pointerId)&&O.releasePointerCapture(D.pointerId):O.releasePointerCapture(D.pointerId)),m(re(D.currentTarget),"pointerup",w,!1),m(re(D.currentTarget),"pointercancel",k,!1)}T&&D.stopPropagation()},S.onMouseDown=D=>{if(te(D.currentTarget,j(D))&&D.button===0){if(c){let T=Dh(D.target);T&&x.disposables.push(T)}D.stopPropagation()}},S.onPointerUp=D=>{!te(D.currentTarget,j(D))||x.pointerType==="virtual"||D.button===0&&!x.isPressed&&K(D,x.pointerType||D.pointerType)},S.onPointerEnter=D=>{D.pointerId===x.activePointerId&&x.target&&!x.isOverTarget&&x.pointerType!=null&&(x.isOverTarget=!0,E(bt(x.target,D),x.pointerType))},S.onPointerLeave=D=>{D.pointerId===x.activePointerId&&x.target&&x.isOverTarget&&x.pointerType!=null&&(x.isOverTarget=!1,R(bt(x.target,D),x.pointerType,!1),B(D))};let w=D=>{if(D.pointerId===x.activePointerId&&x.isPressed&&D.button===0&&x.target){if(te(x.target,j(D))&&x.pointerType!=null){let T=!1,O=setTimeout(()=>{x.isPressed&&x.target instanceof HTMLElement&&(T?z(D):(Ve(x.target),x.target.click()))},80);m(D.currentTarget,"click",()=>T=!0,!0),x.disposables.push(()=>clearTimeout(O))}else z(D);x.isOverTarget=!1}},k=D=>{z(D)};S.onDragStart=D=>{te(D.currentTarget,j(D))&&z(D)}}return S},[m,u,c,v,d,B,E,N,U]);return s.useEffect(()=>{if(!b)return;const x=re(b.current);if(!x||!x.head||x.getElementById(Oo))return;const S=x.createElement("style");S.id=Oo;let I=pu(x);I&&(S.nonce=I),S.textContent=` -@layer { - [${Vo}] { - touch-action: pan-x pan-y pinch-zoom; - } -} - `.trim(),x.head.prepend(S)},[b]),s.useEffect(()=>{let x=y.current;return()=>{d||Gl(x.target??void 0);for(let S of x.disposables)S();x.disposables=[]}},[d]),{isPressed:a||h,pressProps:G(p,_,{[Vo]:!0})}}function Br(t){return t.tagName==="A"&&t.hasAttribute("href")}function wl(t,e){const{key:n,code:l}=t,r=e,o=r.getAttribute("role");return(n==="Enter"||n===" "||n==="Spacebar"||l==="Space")&&!(r instanceof we(r).HTMLInputElement&&!Vu(r,n)||r instanceof we(r).HTMLTextAreaElement||r.isContentEditable)&&!((o==="link"||!o&&Br(r))&&n!=="Enter")}function bt(t,e){let n=e.clientX,l=e.clientY;return{currentTarget:t,shiftKey:e.shiftKey,ctrlKey:e.ctrlKey,metaKey:e.metaKey,altKey:e.altKey,clientX:n,clientY:l,key:e.key}}function Fh(t){return t instanceof HTMLInputElement?!1:t instanceof HTMLButtonElement?t.type!=="submit"&&t.type!=="reset":!Br(t)}function jo(t,e){return t instanceof HTMLInputElement?!Vu(t,e):Fh(t)}const Lh=new Set(["checkbox","radio","range","color","file","image","button","submit","reset"]);function Vu(t,e){return t.type==="checkbox"||t.type==="radio"?e===" ":Lh.has(t.type)}function zh(t,e){let{elementType:n="button",isDisabled:l,onPress:r,onPressStart:o,onPressEnd:i,onPressUp:u,onPressChange:a,preventFocusOnPress:c,allowFocusWhenDisabled:f,onClick:d,href:b,target:p,rel:h,type:$="button"}=t,y;n==="button"?y={type:$,disabled:l,form:t.form,formAction:t.formAction,formEncType:t.formEncType,formMethod:t.formMethod,formNoValidate:t.formNoValidate,formTarget:t.formTarget,name:t.name,value:t.value}:y={role:"button",href:n==="a"&&!l?b:void 0,target:n==="a"?p:void 0,type:n==="input"?$:void 0,disabled:n==="input"?l:void 0,"aria-disabled":!l||n==="input"?void 0:l,rel:n==="a"?h:void 0};let{pressProps:m,isPressed:v}=lt({onPressStart:o,onPressEnd:i,onPressChange:a,onPress:r,onPressUp:u,onClick:d,isDisabled:l,preventFocusOnPress:c,ref:e}),{focusableProps:E}=jt(t,e);f&&(E.tabIndex=l?-1:E.tabIndex);let C=G(E,m,ie(t,{labelable:!0}));return{isPressed:v,buttonProps:G(y,C,{"aria-haspopup":t["aria-haspopup"],"aria-expanded":t["aria-expanded"],"aria-controls":t["aria-controls"],"aria-pressed":t["aria-pressed"],"aria-current":t["aria-current"],"aria-disabled":t["aria-disabled"]})}}function ll(t){let{isDisabled:e,onBlurWithin:n,onFocusWithin:l,onFocusWithinChange:r}=t,o=s.useRef({isFocusWithin:!1}),{addGlobalListener:i,removeAllGlobalListeners:u}=hn(),a=s.useCallback(d=>{te(d.currentTarget,j(d))&&o.current.isFocusWithin&&!te(d.currentTarget,d.relatedTarget)&&(o.current.isFocusWithin=!1,u(),n&&n(d),r&&r(!1))},[n,r,o,u]),c=Mu(a),f=s.useCallback(d=>{if(!te(d.currentTarget,j(d)))return;let b=j(d);const p=re(b),h=oe(p);if(!o.current.isFocusWithin&&h===b){l&&l(d),r&&r(!0),o.current.isFocusWithin=!0,c(d);let $=d.currentTarget;i(p,"focus",y=>{let m=j(y);if(o.current.isFocusWithin&&!te($,m)){let v=new p.defaultView.FocusEvent("blur",{relatedTarget:m});Ru(v,$);let E=Pr(v);a(E)}},{capture:!0})}},[l,r,c,i,a]);return e?{focusWithinProps:{onFocus:void 0,onBlur:void 0}}:{focusWithinProps:{onFocus:f,onBlur:a}}}function je(t={}){let{autoFocus:e=!1,isTextInput:n,within:l}=t,r=s.useRef({isFocused:!1,isFocusVisible:e||Ft()}),[o,i]=s.useState(!1),[u,a]=s.useState(()=>r.current.isFocused&&r.current.isFocusVisible),c=s.useCallback(()=>a(r.current.isFocused&&r.current.isFocusVisible),[]),f=s.useCallback(p=>{r.current.isFocused=p,r.current.isFocusVisible=Ft(),i(p),c()},[c]);Rh(p=>{r.current.isFocusVisible=p,c()},[n,o],{enabled:o,isTextInput:n});let{focusProps:d}=Ar({isDisabled:l,onFocusChange:f}),{focusWithinProps:b}=ll({isDisabled:!l,onFocusWithinChange:f});return{isFocused:o,isFocusVisible:u,focusProps:l?b:d}}let ql=!1,Kn=0;function Nh(){ql=!0,setTimeout(()=>{ql=!1},500)}function _o(t){t.pointerType==="touch"&&Nh()}function Oh(){let t=re(null);if(!(typeof t>"u"))return Kn===0&&typeof PointerEvent<"u"&&t.addEventListener("pointerup",_o),Kn++,()=>{Kn--,!(Kn>0)&&typeof PointerEvent<"u"&&t.removeEventListener("pointerup",_o)}}function He(t){let{onHoverStart:e,onHoverChange:n,onHoverEnd:l,isDisabled:r}=t,[o,i]=s.useState(!1),u=s.useRef({isHovered:!1,ignoreEmulatedMouseEvents:!1,pointerType:"",target:null}).current;s.useEffect(Oh,[]);let{addGlobalListener:a,removeAllGlobalListeners:c}=hn(),{hoverProps:f,triggerHoverEnd:d}=s.useMemo(()=>{let b=($,y)=>{if(u.pointerType=y,r||y==="touch"||u.isHovered||!te($.currentTarget,j($)))return;u.isHovered=!0;let m=$.currentTarget;u.target=m,a(re(j($)),"pointerover",v=>{u.isHovered&&u.target&&!te(u.target,j(v))&&p(v,v.pointerType)},{capture:!0}),e&&e({type:"hoverstart",target:m,pointerType:y}),n&&n(!0),i(!0)},p=($,y)=>{let m=u.target;u.pointerType="",u.target=null,!(y==="touch"||!u.isHovered||!m)&&(u.isHovered=!1,c(),l&&l({type:"hoverend",target:m,pointerType:y}),n&&n(!1),i(!1))},h={};return typeof PointerEvent<"u"&&(h.onPointerEnter=$=>{ql&&$.pointerType==="mouse"||b($,$.pointerType)},h.onPointerLeave=$=>{!r&&te($.currentTarget,j($))&&p($,$.pointerType)}),{hoverProps:h,triggerHoverEnd:p}},[e,n,l,r,u,a,c]);return s.useEffect(()=>{r&&d({currentTarget:u.target},u.pointerType)},[r]),{hoverProps:f,isHovered:o}}const yn=s.createContext({}),Kr=gn(function(e,n){[e,n]=xe(e,n,yn);let l=e,{isPending:r}=l,{buttonProps:o,isPressed:i}=zh(e,n);o=jh(o,r);let{focusProps:u,isFocused:a,isFocusVisible:c}=je(e),{hoverProps:f,isHovered:d}=He({...e,isDisabled:e.isDisabled||r}),b={isHovered:d,isPressed:(l.isPressed||i)&&!r,isFocused:a,isFocusVisible:c,isDisabled:e.isDisabled||!1,isPending:r??!1},p=ce({...e,values:b,defaultClassName:"react-aria-Button"}),h=$e(o.id),$=$e(),y=o["aria-labelledby"];r&&(y?y=`${y} ${$}`:o["aria-label"]&&(y=`${h} ${$}`));let m=s.useRef(r);s.useEffect(()=>{let E={"aria-labelledby":y||h};(!m.current&&a&&r||m.current&&a&&!r)&>(E,"assertive"),m.current=r},[r,a,y,h]);let v=ie(e,{global:!0});return delete v.onClick,g.createElement(le.button,{...G(v,p,o,u,f),type:o.type==="submit"&&r?"button":o.type,id:h,ref:n,"aria-labelledby":y,slot:e.slot||void 0,"aria-disabled":r?"true":o["aria-disabled"],"data-disabled":e.isDisabled||void 0,"data-pressed":b.isPressed||void 0,"data-hovered":d||void 0,"data-focused":a||void 0,"data-pending":r||void 0,"data-focus-visible":c||void 0},g.createElement(wh.Provider,{value:{id:$}},p.children))}),Vh=/Focus|Blur|Hover|Pointer(Enter|Leave|Over|Out)|Mouse(Enter|Leave|Over|Out)/;function jh(t,e){if(e){for(const n in t)n.startsWith("on")&&!Vh.test(n)&&(t[n]=void 0);t.href=void 0,t.target=void 0}return t}const _h=typeof document<"u"?g.useInsertionEffect??g.useLayoutEffect:()=>{};function Ct(t,e,n){let[l,r]=s.useState(t||e),o=s.useRef(l),i=s.useRef(t!==void 0),u=t!==void 0;s.useEffect(()=>{i.current,i.current=u},[u]);let a=u?t:l;_h(()=>{o.current=a});let[,c]=s.useReducer(()=>({}),{}),f=s.useCallback((d,...b)=>{let p=typeof d=="function"?d(o.current):d;Object.is(o.current,p)||(o.current=p,r(p),c(),n==null||n(p,...b))},[n]);return[a,f]}const ju=s.createContext({}),Hh=s.forwardRef(function(e,n){[e,n]=xe(e,n,ju);let{children:l,level:r=3,className:o,...i}=e,u=le[`h${r}`];return g.createElement(u,{...i,ref:n,className:o??"react-aria-Heading"},l)}),_u=t=>t?"true":void 0;function me(t,e){return bh(t,(n,l)=>{const r=typeof e=="function"?e(l)??"":e??"";return It(r,n??"")??""})}const de=(t,e,n)=>typeof t=="function"?t({className:e}):e,Wh=t=>M.jsx("svg",{"aria-hidden":"true","aria-label":"Chevron down icon",fill:"none",height:16,role:"presentation",viewBox:"0 0 16 16",width:16,xmlns:"http://www.w3.org/2000/svg",...t,children:M.jsx("path",{clipRule:"evenodd",d:"M2.97 5.47a.75.75 0 0 1 1.06 0L8 9.44l3.97-3.97a.75.75 0 1 1 1.06 1.06l-4.5 4.5a.75.75 0 0 1-1.06 0l-4.5-4.5a.75.75 0 0 1 0-1.06",fill:"currentColor",fillRule:"evenodd"})}),Uh=t=>M.jsx("svg",{"aria-hidden":"true","aria-label":"Chevron up icon",fill:"none",height:16,role:"presentation",viewBox:"0 0 16 16",width:16,xmlns:"http://www.w3.org/2000/svg",...t,children:M.jsx("path",{clipRule:"evenodd",d:"M13.03 10.53a.75.75 0 0 1-1.06 0L8 6.56l-3.97 3.97a.75.75 0 0 1-1.06-1.06l4.5-4.5a.75.75 0 0 1 1.06 0l4.5 4.5a.75.75 0 0 1 0 1.06",fill:"currentColor",fillRule:"evenodd"})}),Gh=({height:t=9,width:e=9,...n})=>M.jsx("svg",{"aria-hidden":"true","aria-label":"External link icon",fill:"none",height:t,role:"presentation",viewBox:"0 0 7 7",width:e,xmlns:"http://www.w3.org/2000/svg",...n,children:M.jsx("path",{d:"M1.20592 6.84333L0.379822 6.01723L4.52594 1.8672H1.37819L1.38601 0.731812H6.48742V5.83714H5.34421L5.35203 2.6933L1.20592 6.84333Z",fill:"currentColor"})}),qh=t=>M.jsx("svg",{"aria-hidden":"true","aria-label":"Close icon",fill:"none",height:16,role:"presentation",viewBox:"0 0 16 16",width:16,xmlns:"http://www.w3.org/2000/svg",...t,children:M.jsx("path",{clipRule:"evenodd",d:"M3.47 3.47a.75.75 0 0 1 1.06 0L8 6.94l3.47-3.47a.75.75 0 1 1 1.06 1.06L9.06 8l3.47 3.47a.75.75 0 1 1-1.06 1.06L8 9.06l-3.47 3.47a.75.75 0 0 1-1.06-1.06L6.94 8 3.47 4.53a.75.75 0 0 1 0-1.06Z",fill:"currentColor",fillRule:"evenodd"})}),Ho=t=>M.jsx("svg",{"aria-hidden":"true","aria-label":"Info icon",fill:"none",height:16,role:"presentation",viewBox:"0 0 16 16",width:16,xmlns:"http://www.w3.org/2000/svg",...t,children:M.jsx("path",{clipRule:"evenodd",d:"M8 13.5a5.5 5.5 0 1 0 0-11a5.5 5.5 0 0 0 0 11M8 15A7 7 0 1 0 8 1a7 7 0 0 0 0 14m1-9.5a1 1 0 1 1-2 0a1 1 0 0 1 2 0m-.25 3a.75.75 0 0 0-1.5 0V11a.75.75 0 0 0 1.5 0z",fill:"currentColor",fillRule:"evenodd"})}),Zh=t=>M.jsx("svg",{"aria-hidden":"true","aria-label":"Warning icon",fill:"none",height:16,role:"presentation",viewBox:"0 0 16 16",width:16,xmlns:"http://www.w3.org/2000/svg",...t,children:M.jsx("path",{clipRule:"evenodd",d:"M7.134 2.994L2.217 11.5a1 1 0 0 0 .866 1.5h9.834a1 1 0 0 0 .866-1.5L8.866 2.993a1 1 0 0 0-1.732 0m3.03-.75c-.962-1.665-3.366-1.665-4.329 0L.918 10.749c-.963 1.666.24 3.751 2.165 3.751h9.834c1.925 0 3.128-2.085 2.164-3.751zM8 5a.75.75 0 0 1 .75.75v2a.75.75 0 0 1-1.5 0v-2A.75.75 0 0 1 8 5m1 5.75a1 1 0 1 1-2 0a1 1 0 0 1 2 0",fill:"currentColor",fillRule:"evenodd"})}),Wo=t=>M.jsx("svg",{"aria-hidden":"true","aria-label":"Danger icon",fill:"none",height:16,role:"presentation",viewBox:"0 0 16 16",width:16,xmlns:"http://www.w3.org/2000/svg",...t,children:M.jsx("path",{clipRule:"evenodd",d:"M8 13.5a5.5 5.5 0 1 0 0-11a5.5 5.5 0 0 0 0 11M8 15A7 7 0 1 0 8 1a7 7 0 0 0 0 14m1-4.5a1 1 0 1 1-2 0a1 1 0 0 1 2 0M8.75 5a.75.75 0 0 0-1.5 0v2.5a.75.75 0 0 0 1.5 0z",fill:"currentColor",fillRule:"evenodd"})}),Yh=t=>M.jsx("svg",{"aria-hidden":"true","aria-label":"Success icon",fill:"none",height:16,role:"presentation",viewBox:"0 0 16 16",width:16,xmlns:"http://www.w3.org/2000/svg",...t,children:M.jsx("path",{clipRule:"evenodd",d:"M13.5 8a5.5 5.5 0 1 1-11 0a5.5 5.5 0 0 1 11 0M15 8A7 7 0 1 1 1 8a7 7 0 0 1 14 0m-3.9-1.55a.75.75 0 1 0-1.2-.9L7.419 8.858L6.03 7.47a.75.75 0 0 0-1.06 1.06l2 2a.75.75 0 0 0 1.13-.08z",fill:"currentColor",fillRule:"evenodd"})}),Hu=s.createContext({}),Xh=s.createContext({placement:"bottom"}),Jh=typeof HTMLElement<"u"&&"inert"in HTMLElement.prototype;function Uo(t){return t.dataset.liveAnnouncer==="true"||t.dataset.reactAriaTopLayer!==void 0}let Gt=new WeakMap,Ae=[];function Rr(t,e){let n=we(t==null?void 0:t[0]),l=e instanceof n.Element?{root:e}:e,r=(l==null?void 0:l.root)??document.body,o=(l==null?void 0:l.shouldUseInert)&&Jh,i=new Set(t),u=new Set,a=y=>o&&y instanceof n.HTMLElement?y.inert:y.getAttribute("aria-hidden")==="true",c=(y,m)=>{o&&y instanceof n.HTMLElement?y.inert=m:m?y.setAttribute("aria-hidden","true"):(y.removeAttribute("aria-hidden"),y instanceof n.HTMLElement&&(y.inert=!1))},f=new Set;if(Qe())for(let y of t){let m=y;for(;m&&m!==r;){let v=m.getRootNode();"shadowRoot"in v&&f.add(v.shadowRoot),m=v.parentNode}}let d=y=>{for(let C of y.querySelectorAll("[data-live-announcer], [data-react-aria-top-layer]"))i.add(C);let m=C=>{if(u.has(C)||i.has(C)||C.parentElement&&u.has(C.parentElement)&&C.parentElement.getAttribute("role")!=="row")return NodeFilter.FILTER_REJECT;for(let R of i)if(te(C,R))return NodeFilter.FILTER_SKIP;return NodeFilter.FILTER_ACCEPT},v=lu(re(y),y,NodeFilter.SHOW_ELEMENT,{acceptNode:m}),E=m(y);if(E===NodeFilter.FILTER_ACCEPT&&b(y),E!==NodeFilter.FILTER_REJECT){let C=v.nextNode();for(;C!=null;)b(C),C=v.nextNode()}},b=y=>{let m=Gt.get(y)??0;a(y)&&m===0||(m===0&&c(y,!0),u.add(y),Gt.set(y,m+1))};Ae.length&&Ae[Ae.length-1].disconnect(),d(r);let p=new MutationObserver(y=>{for(let m of y)if(m.type==="childList"){if(m.target.isConnected&&![...i,...u].some(v=>te(v,m.target)))for(let v of m.addedNodes)(v instanceof HTMLElement||v instanceof SVGElement)&&Uo(v)?i.add(v):v instanceof Element&&d(v);if(Qe()){for(let v of f)if(!v.isConnected){p.disconnect();break}}}});p.observe(r,{childList:!0,subtree:!0});let h=new Set;if(Qe())for(let y of f){let m=new MutationObserver(v=>{for(let E of v)if(E.type==="childList"){if(E.target.isConnected&&![...i,...u].some(C=>te(C,E.target)))for(let C of E.addedNodes)(C instanceof HTMLElement||C instanceof SVGElement)&&Uo(C)?i.add(C):C instanceof Element&&d(C);if(Qe()){for(let C of f)if(!C.isConnected){p.disconnect();break}}}});m.observe(y,{childList:!0,subtree:!0}),h.add(m)}let $={visibleNodes:i,hiddenNodes:u,observe(){p.observe(r,{childList:!0,subtree:!0})},disconnect(){p.disconnect()}};return Ae.push($),()=>{if(p.disconnect(),Qe())for(let y of h)y.disconnect();for(let y of u){let m=Gt.get(y);m!=null&&(m===1?(c(y,!1),Gt.delete(y)):Gt.set(y,m-1))}$===Ae[Ae.length-1]?(Ae.pop(),Ae.length&&Ae[Ae.length-1].observe()):Ae.splice(Ae.indexOf($),1)}}function Qh(t){let e=Ae[Ae.length-1];if(e&&!e.visibleNodes.has(t))return e.visibleNodes.add(t),()=>{e.visibleNodes.delete(t)}}const Ie={top:"top",bottom:"top",left:"left",right:"left"},Un={top:"bottom",bottom:"top",left:"right",right:"left"},e4={top:"left",left:"top"},Zl={top:"height",left:"width"},Wu={width:"totalWidth",height:"totalHeight"},Rn={};let t4=()=>typeof document<"u"?window.visualViewport:null;function Go(t,e){let n=0,l=0,r=0,o=0,i=0,u=0,a={},c=((e==null?void 0:e.scale)??1)>1;if(t.tagName==="BODY"||t.tagName==="HTML"){let f=document.documentElement;r=f.clientWidth,o=f.clientHeight,n=(e==null?void 0:e.width)??r,l=(e==null?void 0:e.height)??o,a.top=f.scrollTop||t.scrollTop,a.left=f.scrollLeft||t.scrollLeft,e&&(i=e.offsetTop,u=e.offsetLeft)}else({width:n,height:l,top:i,left:u}=fn(t,!1)),a.top=t.scrollTop,a.left=t.scrollLeft,r=n,o=l;return Ji()&&(t.tagName==="BODY"||t.tagName==="HTML")&&c&&(a.top=0,a.left=0,i=(e==null?void 0:e.pageTop)??0,u=(e==null?void 0:e.pageLeft)??0),{width:n,height:l,totalWidth:r,totalHeight:o,scroll:a,top:i,left:u}}function n4(t){return{top:t.scrollTop,left:t.scrollLeft,width:t.scrollWidth,height:t.scrollHeight}}function qo(t,e,n,l,r,o,i){let u=r.scroll[t]??0,a=l[Zl[t]],c=i[t]+l.scroll[Ie[t]]+o,f=i[t]+l.scroll[Ie[t]]+a-o,d=e-u+l.scroll[Ie[t]]+i[t]-l[Ie[t]],b=e-u+n+l.scroll[Ie[t]]+i[t]-l[Ie[t]];return df?Math.max(f-b,c-d):0}function l4(t){let e=window.getComputedStyle(t);return{top:parseInt(e.marginTop,10)||0,bottom:parseInt(e.marginBottom,10)||0,left:parseInt(e.marginLeft,10)||0,right:parseInt(e.marginRight,10)||0}}function Zo(t){if(Rn[t])return Rn[t];let[e,n]=t.split(" "),l=Ie[e]||"right",r=e4[l];Ie[n]||(n="center");let o=Zl[l],i=Zl[r];return Rn[t]={placement:e,crossPlacement:n,axis:l,crossAxis:r,size:o,crossSize:i},Rn[t]}function Sl(t,e,n,l,r,o,i,u,a,c,f){let{placement:d,crossPlacement:b,axis:p,crossAxis:h,size:$,crossSize:y}=l,m={};m[h]=t[h]??0,b==="center"?m[h]+=((t[y]??0)-(n[y]??0))/2:b!==h&&(m[h]+=(t[y]??0)-(n[y]??0)),m[h]+=o;const v=t[h]-n[y]+a+c,E=t[h]+t[y]-a-c;if(m[h]=_l(m[h],v,E),d===p){let C=u?f[$]:f[Wu[$]];m[Un[p]]=Math.floor(C-t[p]+r)}else m[p]=Math.floor(t[p]+t[$]+r);return m}function r4(t,e,n,l,r,o,i,u,a,c,f){let d=(t.top!=null?t.top:a[Wu.height]-(t.bottom??0)-i)-(a.scroll.top??0),b=c?n.top:0,p={top:Math.max(e.top+b,((f==null?void 0:f.offsetTop)??e.top)+b),bottom:Math.min(e.top+e.height+b,((f==null?void 0:f.offsetTop)??0)+((f==null?void 0:f.height)??0))};return u!=="top"?Math.max(0,p.bottom-d-((r.top??0)+(r.bottom??0)+o)):Math.max(0,d+i-p.top-((r.top??0)+(r.bottom??0)+o))}function Yo(t,e,n,l,r,o,i,u){let{placement:a,axis:c,size:f}=o;return a===c?Math.max(0,n[c]-(i.scroll[c]??0)-(t[c]+(u?e[c]:0))-(l[c]??0)-l[Un[c]]-r):Math.max(0,t[f]+t[c]+(u?e[c]:0)-n[c]-n[f]+(i.scroll[c]??0)-(l[c]??0)-l[Un[c]]-r)}function o4(t,e,n,l,r,o,i,u,a,c,f,d,b,p,h,$,y,m){let v=Zo(t),{size:E,crossAxis:C,crossSize:R,placement:A,crossPlacement:K}=v,P=Sl(e,u,n,v,f,d,c,b,h,$,a),z=f,B=Yo(u,c,e,r,o+f,v,a,y);if(i&&n[E]>B){let q=Zo(`${Un[A]} ${K}`),Q=Sl(e,u,n,q,f,d,c,b,h,$,a);Yo(u,c,e,r,o+f,q,a,y)>B&&(v=q,P=Q,z=f)}let N="bottom";v.axis==="top"?v.placement==="top"?N="top":v.placement==="bottom"&&(N="bottom"):v.crossAxis==="top"&&(v.crossPlacement==="top"?N="bottom":v.crossPlacement==="bottom"&&(N="top"));let U=qo(C,P[C],n[R],u,a,o,c);P[C]+=U;let _=r4(P,u,c,b,r,o,n.height,N,a,y,m);p&&p<_&&(_=p),n.height=Math.min(n.height,_),P=Sl(e,u,n,v,z,d,c,b,h,$,a),U=qo(C,P[C],n[R],u,a,o,c),P[C]+=U;let x={},S=e[C]-P[C]-r[Ie[C]],I=S+.5*e[R];const w=h/2+$,k=Ie[C]==="left"?(r.left??0)+(r.right??0):(r.top??0)+(r.bottom??0),D=n[R]-k-h/2-$,T=e[C]+h/2-(P[C]+r[Ie[C]]),O=e[C]+e[R]-h/2-(P[C]+r[Ie[C]]),Z=_l(I,T,O);x[C]=_l(Z,w,D),{placement:A,crossPlacement:K}=v,h?S=x[C]:K==="right"?S+=e[R]:K==="center"&&(S+=e[R]/2);let F=A==="left"||A==="top"?n[E]:0,V={x:A==="top"||A==="bottom"?S:F,y:A==="left"||A==="right"?S:F};return{position:P,maxHeight:_,arrowOffsetLeft:x.left,arrowOffsetTop:x.top,placement:A,triggerAnchorPoint:V}}function i4(t){let{placement:e,targetNode:n,overlayNode:l,scrollNode:r,padding:o,shouldFlip:i,boundaryElement:u,offset:a,crossOffset:c,maxHeight:f,arrowSize:d=0,arrowBoundaryOffset:b=0}=t,p=t4(),h=l instanceof HTMLElement?u4(l):document.documentElement,$=h===document.documentElement;const y=window.getComputedStyle(h).position;let m=!!y&&y!=="static",v=$?fn(n,!1):Xo(n,h,!1);if(!$){let{marginTop:B,marginLeft:N}=window.getComputedStyle(n);v.top+=parseInt(B,10)||0,v.left+=parseInt(N,10)||0}let E=fn(l,!0),C=l4(l);E.width+=(C.left??0)+(C.right??0),E.height+=(C.top??0)+(C.bottom??0);let R=n4(r),A=Go(u,p),K=Go(h,p),P;if((u.tagName==="BODY"||u.tagName==="HTML")&&!$){let B=rl(h,!1);P={top:-(B.top-A.top),left:-(B.left-A.left),width:0,height:0}}else(u.tagName==="BODY"||u.tagName==="HTML")&&$?P={top:0,left:0,width:0,height:0}:P=Xo(u,h,!1);let z=te(u,h);return o4(e,v,E,R,C,o,i,A,K,P,a,c,m,f,d,b,z,p)}function rl(t,e){let{top:n,left:l,width:r,height:o}=t.getBoundingClientRect();return e&&t instanceof t.ownerDocument.defaultView.HTMLElement&&(r=t.offsetWidth,o=t.offsetHeight),{top:n,left:l,width:r,height:o}}function fn(t,e){let{top:n,left:l,width:r,height:o}=rl(t,e),{scrollTop:i,scrollLeft:u,clientTop:a,clientLeft:c}=document.documentElement;return{top:n+i-a,left:l+u-c,width:r,height:o}}function Xo(t,e,n){let l=window.getComputedStyle(t),r;if(l.position==="fixed")r=rl(t,n);else{r=fn(t,n);let o=fn(e,n),i=window.getComputedStyle(e);o.top+=(parseInt(i.borderTopWidth,10)||0)-e.scrollTop,o.left+=(parseInt(i.borderLeftWidth,10)||0)-e.scrollLeft,r.top-=o.top,r.left-=o.left}return r.top-=parseInt(l.marginTop,10)||0,r.left-=parseInt(l.marginLeft,10)||0,r}function u4(t){let e=t.offsetParent;if(e&&e===document.body&&window.getComputedStyle(e).position==="static"&&!Jo(e)&&(e=document.documentElement),e==null)for(e=t.parentElement;e&&!Jo(e);)e=e.parentElement;return e||document.documentElement}function Jo(t){let e=window.getComputedStyle(t);return e.transform!=="none"||/transform|perspective/.test(e.willChange)||e.filter!=="none"||e.contain==="paint"||"backdropFilter"in e&&e.backdropFilter!=="none"||"WebkitBackdropFilter"in e&&e.WebkitBackdropFilter!=="none"}const Uu=new WeakMap;function a4(t){let{triggerRef:e,isOpen:n,onClose:l}=t;s.useEffect(()=>{if(!n||l===null)return;let r=o=>{let i=j(o);if(!e.current||i instanceof Node&&!te(i,e.current)||i instanceof HTMLInputElement||i instanceof HTMLTextAreaElement)return;let u=l||Uu.get(e.current);u&&u()};return window.addEventListener("scroll",r,!0),()=>{window.removeEventListener("scroll",r,!0)}},[n,l,e])}let pe=typeof document<"u"?window.visualViewport:null;function s4(t){let{direction:e}=Re(),{arrowSize:n,targetRef:l,overlayRef:r,arrowRef:o,scrollRef:i=r,placement:u="bottom",containerPadding:a=12,shouldFlip:c=!0,boundaryElement:f=typeof document<"u"?document.body:null,offset:d=0,crossOffset:b=0,shouldUpdatePosition:p=!0,isOpen:h=!0,onClose:$,maxHeight:y,arrowBoundaryOffset:m=0}=t,[v,E]=s.useState(null),C=[p,u,r.current,l.current,o==null?void 0:o.current,i.current,a,c,f,d,b,h,e,y,m,n],R=s.useRef(pe==null?void 0:pe.scale);s.useEffect(()=>{h&&(R.current=pe==null?void 0:pe.scale)},[h]);let A=s.useCallback(()=>{var _,x;if(p===!1||!h||!r.current||!l.current||!f||(pe==null?void 0:pe.scale)!==R.current)return;let z=null;if(i.current&&vt(i.current)){let S=(_=oe())==null?void 0:_.getBoundingClientRect(),I=i.current.getBoundingClientRect();z={type:"top",offset:((S==null?void 0:S.top)??0)-I.top},z.offset>I.height/2&&(z.type="bottom",z.offset=((S==null?void 0:S.bottom)??0)-I.bottom)}let B=r.current;!y&&r.current&&(B.style.top="0px",B.style.bottom="",B.style.maxHeight=(((x=window.visualViewport)==null?void 0:x.height)??window.innerHeight)+"px");let N=i4({placement:d4(u,e),overlayNode:r.current,targetNode:l.current,scrollNode:i.current||r.current,padding:a,shouldFlip:c,boundaryElement:f,offset:d,crossOffset:b,maxHeight:y,arrowSize:n??(o!=null&&o.current?rl(o.current,!0).width:0),arrowBoundaryOffset:m});if(!N.position)return;B.style.top="",B.style.bottom="",B.style.left="",B.style.right="",Object.keys(N.position).forEach(S=>B.style[S]=N.position[S]+"px"),B.style.maxHeight=N.maxHeight!=null?N.maxHeight+"px":"";let U=oe();if(z&&U&&i.current){let S=U.getBoundingClientRect(),I=i.current.getBoundingClientRect(),w=S[z.type]-I[z.type];i.current.scrollTop+=w-z.offset}E(N)},C);ne(A,C),c4(A),an({ref:r,onResize:A}),an({ref:l,onResize:A});let K=s.useRef(!1);ne(()=>{let z,B=()=>{K.current=!0,clearTimeout(z),z=setTimeout(()=>{K.current=!1},500),A()},N=()=>{K.current&&B()};return pe==null||pe.addEventListener("resize",B),pe==null||pe.addEventListener("scroll",N),()=>{pe==null||pe.removeEventListener("resize",B),pe==null||pe.removeEventListener("scroll",N)}},[A]);let P=s.useCallback(()=>{K.current||$==null||$()},[$,K]);return a4({triggerRef:l,isOpen:h,onClose:$&&P}),{overlayProps:{style:{position:v?"absolute":"fixed",top:v?void 0:0,left:v?void 0:0,zIndex:1e5,...v==null?void 0:v.position,maxHeight:(v==null?void 0:v.maxHeight)??"100vh"}},placement:(v==null?void 0:v.placement)??null,triggerAnchorPoint:(v==null?void 0:v.triggerAnchorPoint)??null,arrowProps:{"aria-hidden":"true",role:"presentation",style:{left:v==null?void 0:v.arrowOffsetLeft,top:v==null?void 0:v.arrowOffsetTop}},updatePosition:A}}function c4(t){ne(()=>(window.addEventListener("resize",t,!1),()=>{window.removeEventListener("resize",t,!1)}),[t])}function d4(t,e){return e==="rtl"?t.replace("start","right").replace("end","left"):t.replace("start","left").replace("end","right")}const Qo=g.createContext(null),Yl="react-aria-focus-scope-restore";let ae=null;function Mr(t){let{children:e,contain:n,restoreFocus:l,autoFocus:r}=t,o=s.useRef(null),i=s.useRef(null),u=s.useRef([]),{parentNode:a}=s.useContext(Qo)||{},c=s.useMemo(()=>new Jl({scopeRef:u}),[u]);ne(()=>{let b=a||he.root;if(he.getTreeNode(b.scopeRef)&&ae&&!Gn(ae,b.scopeRef)){let p=he.getTreeNode(ae);p&&(b=p)}b.addChild(c),he.addNode(c)},[c,a]),ne(()=>{let b=he.getTreeNode(u);b&&(b.contain=!!n)},[n]),ne(()=>{var $;let b=($=o.current)==null?void 0:$.nextSibling,p=[],h=y=>y.stopPropagation();for(;b&&b!==i.current;)p.push(b),b.addEventListener(Yl,h),b=b.nextSibling;return u.current=p,()=>{for(let y of p)y.removeEventListener(Yl,h)}},[e]),y4(u,l,n),h4(u,n),$4(u,l,n),g4(u,r),s.useEffect(()=>{const b=oe(re(u.current?u.current[0]:void 0));let p=null;if(Le(b,u.current)){for(let h of he.traverse())h.scopeRef&&Le(b,h.scopeRef.current)&&(p=h);p===he.getTreeNode(u)&&(ae=p.scopeRef)}},[u]),ne(()=>()=>{var p,h;let b=((h=(p=he.getTreeNode(u))==null?void 0:p.parent)==null?void 0:h.scopeRef)??null;(u===ae||Gn(u,ae))&&(!b||he.getTreeNode(b))&&(ae=b),he.removeTreeNode(u)},[u]);let f=s.useMemo(()=>f4(u),[]),d=s.useMemo(()=>({focusManager:f,parentNode:c}),[c,f]);return g.createElement(Qo.Provider,{value:d},g.createElement("span",{"data-focus-scope-start":!0,hidden:!0,ref:o}),e,g.createElement("span",{"data-focus-scope-end":!0,hidden:!0,ref:i}))}function f4(t){return{focusNext(e={}){let n=t.current,{from:l,tabbable:r,wrap:o,accept:i}=e,u=l||oe(re(n[0]??void 0)),a=n[0].previousElementSibling,c=ht(n),f=Fe(c,{tabbable:r,accept:i},n);f.currentNode=Le(u,n)?u:a;let d=f.nextNode();return!d&&o&&(f.currentNode=a,d=f.nextNode()),d&&et(d,!0),d},focusPrevious(e={}){let n=t.current,{from:l,tabbable:r,wrap:o,accept:i}=e,u=l||oe(re(n[0]??void 0)),a=n[n.length-1].nextElementSibling,c=ht(n),f=Fe(c,{tabbable:r,accept:i},n);f.currentNode=Le(u,n)?u:a;let d=f.previousNode();return!d&&o&&(f.currentNode=a,d=f.previousNode()),d&&et(d,!0),d},focusFirst(e={}){let n=t.current,{tabbable:l,accept:r}=e,o=ht(n),i=Fe(o,{tabbable:l,accept:r},n);i.currentNode=n[0].previousElementSibling;let u=i.nextNode();return u&&et(u,!0),u},focusLast(e={}){let n=t.current,{tabbable:l,accept:r}=e,o=ht(n),i=Fe(o,{tabbable:l,accept:r},n);i.currentNode=n[n.length-1].nextElementSibling;let u=i.previousNode();return u&&et(u,!0),u}}}function ht(t){return t[0].parentElement}function Qt(t){let e=he.getTreeNode(ae);for(;e&&e.scopeRef!==t;){if(e.contain)return!1;e=e.parent}return!0}function p4(t){if(!t.form)return Array.from(re(t).querySelectorAll(`input[type="radio"][name="${CSS.escape(t.name)}"]`)).filter(l=>!l.form);const e=t.form.elements.namedItem(t.name);let n=we(t);return e instanceof n.RadioNodeList?Array.from(e).filter(l=>l instanceof n.HTMLInputElement):e instanceof n.HTMLInputElement?[e]:[]}function b4(t){if(t.checked)return!0;const e=p4(t);return e.length>0&&!e.some(n=>n.checked)}function h4(t,e){let n=s.useRef(void 0),l=s.useRef(void 0);ne(()=>{let r=t.current;if(!e){l.current&&(cancelAnimationFrame(l.current),l.current=void 0);return}const o=re(r?r[0]:void 0);let i=c=>{if(c.key!=="Tab"||c.altKey||c.ctrlKey||c.metaKey||!Qt(t)||c.isComposing)return;let f=oe(o),d=t.current;if(!d||!Le(f,d))return;let b=ht(d),p=Fe(b,{tabbable:!0},d);if(!f)return;p.currentNode=f;let h=c.shiftKey?p.previousNode():p.nextNode();h||(p.currentNode=c.shiftKey?d[d.length-1].nextElementSibling:d[0].previousElementSibling,h=c.shiftKey?p.previousNode():p.nextNode()),c.preventDefault(),h&&(et(h,!0),h instanceof we(h).HTMLInputElement&&h.select())},u=c=>{(!ae||Gn(ae,t))&&Le(j(c),t.current)?(ae=t,n.current=j(c)):Qt(t)&&!at(j(c),t)?n.current?n.current.focus():ae&&ae.current&&Xl(ae.current):Qt(t)&&(n.current=j(c))},a=c=>{l.current&&cancelAnimationFrame(l.current),l.current=requestAnimationFrame(()=>{var p;let f=cn(),d=(f==="virtual"||f===null)&&rn()&&Qi(),b=oe(o);if(!d&&b&&Qt(t)&&!at(b,t)){ae=t;let h=j(c);h&&h.isConnected?(n.current=h,(p=n.current)==null||p.focus()):ae.current&&Xl(ae.current)}})};return o.addEventListener("keydown",i,!1),o.addEventListener("focusin",u,!1),r==null||r.forEach(c=>c.addEventListener("focusin",u,!1)),r==null||r.forEach(c=>c.addEventListener("focusout",a,!1)),()=>{o.removeEventListener("keydown",i,!1),o.removeEventListener("focusin",u,!1),r==null||r.forEach(c=>c.removeEventListener("focusin",u,!1)),r==null||r.forEach(c=>c.removeEventListener("focusout",a,!1))}},[t,e]),ne(()=>()=>{l.current&&cancelAnimationFrame(l.current)},[l])}function Gu(t){return at(t)}function Le(t,e){return!t||!e?!1:e.some(n=>te(n,t))}function at(t,e=null){if(t instanceof Element&&t.closest("[data-react-aria-top-layer]"))return!0;for(let{scopeRef:n}of he.traverse(he.getTreeNode(e)))if(n&&Le(t,n.current))return!0;return!1}function m4(t){return at(t,ae)}function Gn(t,e){var l;let n=(l=he.getTreeNode(e))==null?void 0:l.parent;for(;n;){if(n.scopeRef===t)return!0;n=n.parent}return!1}function et(t,e=!1){if(t!=null&&!e)try{ve(t)}catch{}else if(t!=null)try{t.focus()}catch{}}function qu(t,e=!0){let n=t[0].previousElementSibling,l=ht(t),r=Fe(l,{tabbable:e},t);r.currentNode=n;let o=r.nextNode();return e&&!o&&(l=ht(t),r=Fe(l,{tabbable:!1},t),r.currentNode=n,o=r.nextNode()),o}function Xl(t,e=!0){et(qu(t,e))}function g4(t,e){const n=g.useRef(e);s.useEffect(()=>{if(n.current){ae=t;const l=re(t.current?t.current[0]:void 0);!Le(oe(l),ae.current)&&t.current&&Xl(t.current)}n.current=!1},[t])}function y4(t,e,n){ne(()=>{if(e||n)return;let l=t.current;const r=re(l?l[0]:void 0);let o=i=>{let u=j(i);Le(u,t.current)?ae=t:Gu(u)||(ae=null)};return r.addEventListener("focusin",o,!1),l==null||l.forEach(i=>i.addEventListener("focusin",o,!1)),()=>{r.removeEventListener("focusin",o,!1),l==null||l.forEach(i=>i.removeEventListener("focusin",o,!1))}},[t,e,n])}function ei(t){let e=he.getTreeNode(ae);for(;e&&e.scopeRef!==t;){if(e.nodeToRestore)return!1;e=e.parent}return(e==null?void 0:e.scopeRef)===t}function $4(t,e,n){const l=s.useRef(typeof document<"u"?oe(re(t.current?t.current[0]:void 0)):null);ne(()=>{let r=t.current;const o=re(r?r[0]:void 0);if(!e||n)return;let i=()=>{(!ae||Gn(ae,t))&&Le(oe(o),t.current)&&(ae=t)};return o.addEventListener("focusin",i,!1),r==null||r.forEach(u=>u.addEventListener("focusin",i,!1)),()=>{o.removeEventListener("focusin",i,!1),r==null||r.forEach(u=>u.removeEventListener("focusin",i,!1))}},[t,n]),ne(()=>{const r=re(t.current?t.current[0]:void 0);if(!e)return;let o=i=>{if(i.key!=="Tab"||i.altKey||i.ctrlKey||i.metaKey||!Qt(t)||i.isComposing)return;let u=r.activeElement;if(!at(u,t)||!ei(t))return;let a=he.getTreeNode(t);if(!a)return;let c=a.nodeToRestore,f=Fe(r.body,{tabbable:!0});f.currentNode=u;let d=i.shiftKey?f.previousNode():f.nextNode();if((!c||!c.isConnected||c===r.body)&&(c=void 0,a.nodeToRestore=void 0),(!d||!at(d,t))&&c){f.currentNode=c;do d=i.shiftKey?f.previousNode():f.nextNode();while(at(d,t));i.preventDefault(),i.stopPropagation(),d?et(d,!0):Gu(c)?et(c,!0):u.blur()}};return n||r.addEventListener("keydown",o,!0),()=>{n||r.removeEventListener("keydown",o,!0)}},[t,e,n]),ne(()=>{const r=re(t.current?t.current[0]:void 0);if(!e)return;let o=he.getTreeNode(t);if(o)return o.nodeToRestore=l.current??void 0,()=>{let i=he.getTreeNode(t);if(!i)return;let u=i.nodeToRestore,a=oe(r);if(e&&u&&(a&&at(a,t)||a===r.body&&ei(t))){let c=he.clone();requestAnimationFrame(()=>{if(r.activeElement===r.body){let f=c.getTreeNode(t);for(;f;){if(f.nodeToRestore&&f.nodeToRestore.isConnected){ti(f.nodeToRestore);return}f=f.parent}for(f=c.getTreeNode(t);f;){if(f.scopeRef&&f.scopeRef.current&&he.getTreeNode(f.scopeRef)){let d=qu(f.scopeRef.current,!0);ti(d);return}f=f.parent}}})}}},[t,e])}function ti(t){t.dispatchEvent(new CustomEvent(Yl,{bubbles:!0,cancelable:!0}))&&et(t)}function Fe(t,e,n){let l=e!=null&&e.tabbable?du:cu,r=(t==null?void 0:t.nodeType)===Node.ELEMENT_NODE?t:null,o=re(r),i=lu(o,t||o,NodeFilter.SHOW_ELEMENT,{acceptNode(u){return te(e==null?void 0:e.from,u)||e!=null&&e.tabbable&&u.tagName==="INPUT"&&u.getAttribute("type")==="radio"&&(!b4(u)||i.currentNode.tagName==="INPUT"&&i.currentNode.type==="radio"&&i.currentNode.name===u.name)?NodeFilter.FILTER_REJECT:l(u)&&(!n||Le(u,n))&&(!(e!=null&&e.accept)||e.accept(u))?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});return e!=null&&e.from&&(i.currentNode=e.from),i}class Ir{constructor(){this.fastMap=new Map,this.root=new Jl({scopeRef:null}),this.fastMap.set(null,this.root)}get size(){return this.fastMap.size}getTreeNode(e){return this.fastMap.get(e)}addTreeNode(e,n,l){let r=this.fastMap.get(n??null);if(!r)return;let o=new Jl({scopeRef:e});r.addChild(o),o.parent=r,this.fastMap.set(e,o),l&&(o.nodeToRestore=l)}addNode(e){this.fastMap.set(e.scopeRef,e)}removeTreeNode(e){if(e===null)return;let n=this.fastMap.get(e);if(!n)return;let l=n.parent;for(let o of this.traverse())o!==n&&n.nodeToRestore&&o.nodeToRestore&&n.scopeRef&&n.scopeRef.current&&Le(o.nodeToRestore,n.scopeRef.current)&&(o.nodeToRestore=n.nodeToRestore);let r=n.children;l&&(l.removeChild(n),r.size>0&&r.forEach(o=>l&&l.addChild(o))),this.fastMap.delete(n.scopeRef)}*traverse(e=this.root){if(e.scopeRef!=null&&(yield e),e.children.size>0)for(let n of e.children)yield*this.traverse(n)}clone(){var n;let e=new Ir;for(let l of this.traverse())e.addTreeNode(l.scopeRef,((n=l.parent)==null?void 0:n.scopeRef)??null,l.nodeToRestore);return e}}class Jl{constructor(e){this.children=new Set,this.contain=!1,this.scopeRef=e.scopeRef}addChild(e){this.children.add(e),e.parent=this}removeChild(e){this.children.delete(e),e.parent=void 0}}let he=new Ir;function v4(t){let{ref:e,onInteractOutside:n,isDisabled:l,onInteractOutsideStart:r}=t,o=s.useRef({isPointerDown:!1,ignoreEmulatedMouseEvents:!1}),i=Ee(a=>{n&&ni(a,e)&&(r&&r(a),o.current.isPointerDown=!0)}),u=Ee(a=>{n&&n(a)});s.useEffect(()=>{let a=o.current;if(l)return;const c=e.current,f=re(c);if(typeof PointerEvent<"u"){let d=b=>{a.isPointerDown&&ni(b,e)&&u(b),a.isPointerDown=!1};return f.addEventListener("pointerdown",i,!0),f.addEventListener("click",d,!0),()=>{f.removeEventListener("pointerdown",i,!0),f.removeEventListener("click",d,!0)}}},[e,l])}function ni(t,e){if(t.button>0)return!1;let n=j(t);if(n){const l=n.ownerDocument;if(!l||!te(l.documentElement,n)||n.closest("[data-react-aria-top-layer]"))return!1}return e.current?!t.composedPath().includes(e.current):!1}const Ue=[];function Zu(t,e){let{onClose:n,shouldCloseOnBlur:l,isOpen:r,isDismissable:o=!1,isKeyboardDismissDisabled:i=!1,shouldCloseOnInteractOutside:u}=t,a=s.useRef(void 0);s.useEffect(()=>{if(r&&!Ue.includes(e))return Ue.push(e),()=>{let h=Ue.indexOf(e);h>=0&&Ue.splice(h,1)}},[r,e]);let c=()=>{Ue[Ue.length-1]===e&&n&&n()},f=h=>{const $=Ue[Ue.length-1];a.current=$,(!u||u(j(h)))&&$===e&&h.stopPropagation()},d=h=>{(!u||u(j(h)))&&(Ue[Ue.length-1]===e&&h.stopPropagation(),a.current===e&&c()),a.current=void 0},b=h=>{h.key==="Escape"&&!i&&!h.nativeEvent.isComposing&&(h.stopPropagation(),h.preventDefault(),c())};v4({ref:e,onInteractOutside:o&&r?d:void 0,onInteractOutsideStart:f});let{focusWithinProps:p}=ll({isDisabled:!l,onBlurWithin:h=>{!h.relatedTarget||m4(h.relatedTarget)||(!u||u(h.relatedTarget))&&(n==null||n())}});return{overlayProps:{onKeyDown:b,...p},underlayProps:{}}}const ln=typeof document<"u"&&window.visualViewport;let Mn=0,Dl;function Yu(t={}){let{isDisabled:e}=t;ne(()=>{if(!e)return Mn++,Mn===1&&($t()?Dl=C4():Dl=x4()),()=>{Mn--,Mn===0&&Dl()}},[e])}function x4(){let t=window.innerWidth-document.documentElement.clientWidth;return dt(t>0&&("scrollbarGutter"in document.documentElement.style?Nn(document.documentElement,"scrollbarGutter","stable"):Nn(document.documentElement,"paddingRight",`${t}px`)),Nn(document.documentElement,"overflow","hidden"))}function C4(){let t=Nn(document.documentElement,"overflow","hidden"),e,n=!1,l=f=>{let d=j(f);e=st(d)?d:Xe(d,!0),n=!1;let b=d.ownerDocument.defaultView.getSelection();b&&!b.isCollapsed&&b.containsNode(d,!0)&&(n=!0),f.composedPath().some(p=>p instanceof HTMLInputElement&&p.type==="range")&&(n=!0),"selectionStart"in d&&"selectionEnd"in d&&d.selectionStart{if(!(f.touches.length===2||n)){if(!e||e===document.documentElement||e===document.body){f.preventDefault();return}e.scrollHeight===e.clientHeight&&e.scrollWidth===e.clientWidth&&f.preventDefault()}},u=f=>{var p;let d=j(f),b=f.relatedTarget;if(b&&tn(b))b.focus({preventScroll:!0}),li(b,tn(d));else if(!b){let h=(p=d.parentElement)==null?void 0:p.closest("[tabindex]");h==null||h.focus({preventScroll:!0})}},a=HTMLElement.prototype.focus;HTMLElement.prototype.focus=function(f){let d=oe(),b=d!=null&&tn(d);a.call(this,{...f,preventScroll:!0}),(!f||!f.preventScroll)&&li(this,b)};let c=dt(kl(document,"touchstart",l,{passive:!1,capture:!0}),kl(document,"touchmove",i,{passive:!1,capture:!0}),kl(document,"blur",u,!0));return()=>{t(),c(),r.remove(),HTMLElement.prototype.focus=a}}function Nn(t,e,n){let l=t.style[e];return t.style[e]=n,()=>{t.style[e]=l}}function kl(t,e,n,l){return t.addEventListener(e,n,l),()=>{t.removeEventListener(e,n,l)}}function li(t,e){e||!ln?ri(t):ln.addEventListener("resize",()=>ri(t),{once:!0})}function ri(t){let e=document.scrollingElement||document.documentElement,n=t;for(;n&&n!==e;){let l=Xe(n);if(l!==document.documentElement&&l!==document.body&&l!==n){let r=l.getBoundingClientRect(),o=n.getBoundingClientRect();if(o.topr.top+n.clientHeight){let i=r.bottom;ln&&(i=Math.min(i,ln.offsetTop+ln.height));let u=o.top-r.top-((i-r.top)/2-o.height/2);l.scrollTo({top:Math.max(0,Math.min(l.scrollHeight-l.clientHeight,l.scrollTop+u)),behavior:"smooth"})}}n=l.parentElement}}function E4(t,e){let{triggerRef:n,popoverRef:l,groupRef:r,isNonModal:o,isKeyboardDismissDisabled:i,shouldCloseOnInteractOutside:u,...a}=t,c=a.trigger==="SubmenuTrigger",{overlayProps:f,underlayProps:d}=Zu({isOpen:e.isOpen,onClose:e.close,shouldCloseOnBlur:!0,isDismissable:!o||c,isKeyboardDismissDisabled:i,shouldCloseOnInteractOutside:u},r??l),{overlayProps:b,arrowProps:p,placement:h,triggerAnchorPoint:$}=s4({...a,targetRef:n,overlayRef:l,isOpen:e.isOpen,onClose:o&&!c?e.close:null});return Yu({isDisabled:o||!e.isOpen}),s.useEffect(()=>{if(e.isOpen&&l.current)return o?Qh((r==null?void 0:r.current)??l.current):Rr([(r==null?void 0:r.current)??l.current],{shouldUseInert:!0})},[o,e.isOpen,l,r]),{popoverProps:G(f,b),arrowProps:p,underlayProps:d,placement:h,triggerAnchorPoint:$}}var Xu={};Xu={dismiss:"تجاهل"};var Ju={};Ju={dismiss:"Отхвърляне"};var Qu={};Qu={dismiss:"Odstranit"};var ea={};ea={dismiss:"Luk"};var ta={};ta={dismiss:"Schließen"};var na={};na={dismiss:"Απόρριψη"};var la={};la={dismiss:"Dismiss"};var ra={};ra={dismiss:"Descartar"};var oa={};oa={dismiss:"Lõpeta"};var ia={};ia={dismiss:"Hylkää"};var ua={};ua={dismiss:"Rejeter"};var aa={};aa={dismiss:"התעלם"};var sa={};sa={dismiss:"Odbaci"};var ca={};ca={dismiss:"Elutasítás"};var da={};da={dismiss:"Ignora"};var fa={};fa={dismiss:"閉じる"};var pa={};pa={dismiss:"무시"};var ba={};ba={dismiss:"Atmesti"};var ha={};ha={dismiss:"Nerādīt"};var ma={};ma={dismiss:"Lukk"};var ga={};ga={dismiss:"Negeren"};var ya={};ya={dismiss:"Zignoruj"};var $a={};$a={dismiss:"Descartar"};var va={};va={dismiss:"Dispensar"};var xa={};xa={dismiss:"Revocare"};var Ca={};Ca={dismiss:"Пропустить"};var Ea={};Ea={dismiss:"Zrušiť"};var wa={};wa={dismiss:"Opusti"};var Sa={};Sa={dismiss:"Odbaci"};var Da={};Da={dismiss:"Avvisa"};var ka={};ka={dismiss:"Kapat"};var Pa={};Pa={dismiss:"Скасувати"};var Aa={};Aa={dismiss:"取消"};var Ta={};Ta={dismiss:"關閉"};var Ba={};Ba={"ar-AE":Xu,"bg-BG":Ju,"cs-CZ":Qu,"da-DK":ea,"de-DE":ta,"el-GR":na,"en-US":la,"es-ES":ra,"et-EE":oa,"fi-FI":ia,"fr-FR":ua,"he-IL":aa,"hr-HR":sa,"hu-HU":ca,"it-IT":da,"ja-JP":fa,"ko-KR":pa,"lt-LT":ba,"lv-LV":ha,"nb-NO":ma,"nl-NL":ga,"pl-PL":ya,"pt-BR":$a,"pt-PT":va,"ro-RO":xa,"ru-RU":Ca,"sk-SK":Ea,"sl-SI":wa,"sr-SP":Sa,"sv-SE":Da,"tr-TR":ka,"uk-UA":Pa,"zh-CN":Aa,"zh-TW":Ta};const w4=Symbol.for("react-aria.i18n.locale"),S4=Symbol.for("react-aria.i18n.strings");let Dt;class ol{constructor(e,n="en-US"){this.strings=Object.fromEntries(Object.entries(e).filter(([,l])=>l)),this.defaultLocale=n}getStringForLocale(e,n){let r=this.getStringsForLocale(n)[e];if(!r)throw new Error(`Could not find intl message ${e} in ${n} locale`);return r}getStringsForLocale(e){let n=this.strings[e];return n||(n=D4(e,this.strings,this.defaultLocale),this.strings[e]=n),n}static getGlobalDictionaryForPackage(e){if(typeof window>"u")return null;let n=window[w4];if(Dt===void 0){let r=window[S4];if(!r)return null;Dt={};for(let o in r)Dt[o]=new ol({[n]:r[o]},n)}let l=Dt==null?void 0:Dt[e];if(!l)throw new Error(`Strings for package "${e}" were not included by LocalizedStringProvider. Please add it to the list passed to createLocalizedStringDictionary.`);return l}}function D4(t,e,n="en-US"){if(e[t])return e[t];let l=k4(t);if(e[l])return e[l];for(let r in e)if(r.startsWith(l+"-"))return e[r];return e[n]}function k4(t){return Intl.Locale?new Intl.Locale(t).language:t.split("-")[0]}const oi=new Map,ii=new Map;class P4{constructor(e,n){this.locale=e,this.strings=n}format(e,n){let l=this.strings.getStringForLocale(e,this.locale);return typeof l=="function"?l(n,this):l}plural(e,n,l="cardinal"){let r=n["="+e];if(r)return typeof r=="function"?r():r;let o=this.locale+":"+l,i=oi.get(o);i||(i=new Intl.PluralRules(this.locale,{type:l}),oi.set(o,i));let u=i.select(e);return r=n[u]||n.other,typeof r=="function"?r():r}number(e){let n=ii.get(this.locale);return n||(n=new Intl.NumberFormat(this.locale),ii.set(this.locale,n)),n.format(e)}select(e,n){let l=e[n]||e.other;return typeof l=="function"?l():l}}const ui=new WeakMap;function A4(t){let e=ui.get(t);return e||(e=new ol(t),ui.set(t,e)),e}function T4(t,e){return e&&ol.getGlobalDictionaryForPackage(e)||A4(t)}function Ne(t,e){let{locale:n}=Re(),l=T4(t,e);return s.useMemo(()=>new P4(n,l),[n,l])}const ai={border:0,clip:"rect(0 0 0 0)",clipPath:"inset(50%)",height:"1px",margin:"-1px",overflow:"hidden",padding:0,position:"absolute",width:"1px",whiteSpace:"nowrap"};function $n(t={}){let{style:e,isFocusable:n}=t,[l,r]=s.useState(!1),{focusWithinProps:o}=ll({isDisabled:!n,onFocusWithinChange:u=>r(u)}),i=s.useMemo(()=>l?e:e?{...ai,...e}:ai,[l]);return{visuallyHiddenProps:{...o,style:i}}}function Ka(t){let{children:e,elementType:n="div",isFocusable:l,style:r,...o}=t,{visuallyHiddenProps:i}=$n(t);return g.createElement(n,G(o,i),e)}function B4(t){return t&&t.__esModule?t.default:t}function Ql(t){let{onDismiss:e,...n}=t,l=Ne(B4(Ba),"@react-aria/overlays"),r=un(n,l.format("dismiss")),o=()=>{e&&e()};return g.createElement(Ka,null,g.createElement("button",{...r,tabIndex:-1,onClick:o,style:{width:1,height:1}}))}const K4=g.forwardRef(({children:t,...e},n)=>{let l=s.useRef(!1),r=s.useContext(dn),o=G(r||{},{...e,register(){l.current=!0,r&&r.register()}});return o.ref=ke(n||(r==null?void 0:r.ref)),vr(r,o.ref),s.useEffect(()=>{l.current||(l.current=!0)},[]),g.createElement(dn.Provider,{value:o},t)});function R4({children:t}){let e=s.useMemo(()=>({register:()=>{}}),[]);return g.createElement(dn.Provider,{value:e},t)}const M4=s.createContext({});function I4(){return s.useContext(M4)??{}}const Ra=g.createContext(null);function er(t){let e=ct(),{portalContainer:n=e?null:document.body,isExiting:l}=t,[r,o]=s.useState(!1),i=s.useMemo(()=>({contain:r,setContain:o}),[r,o]),{getContainer:u}=I4();if(!t.portalContainer&&u&&(n=u()),!n)return null;let a=t.children;return t.disableFocusManagement||(a=g.createElement(Mr,{restoreFocus:!0,contain:(t.shouldContainFocus||r)&&!l},a)),a=g.createElement(Ra.Provider,{value:i},g.createElement(R4,null,a)),Yi.createPortal(a,n)}function Ma(){let t=s.useContext(Ra),e=t==null?void 0:t.setContain;ne(()=>{e==null||e(!0)},[e])}function il(t){let[e,n]=Ct(t.isOpen,t.defaultOpen||!1,t.onOpenChange);const l=s.useCallback(()=>{n(!0)},[n]),r=s.useCallback(()=>{n(!1)},[n]),o=s.useCallback(()=>{n(!e)},[n,e]);return{isOpen:e,setOpen:n,open:l,close:r,toggle:o}}const Fr=s.createContext(null),si=s.createContext(null),F4=s.forwardRef(function(e,n){[e,n]=xe(e,n,Fr);let l=s.useContext(Et),r=il(e),o=e.isOpen!=null||e.defaultOpen!=null||!l?r:l,i=Ll(n,o.isOpen)||e.isExiting||!1,u=gh(),{direction:a}=Re();if(u){let c=e.children;return typeof c=="function"&&(c=c({trigger:e.trigger||null,placement:"bottom",isEntering:!1,isExiting:!1,defaultChildren:null})),g.createElement(g.Fragment,null,c)}return o&&!o.isOpen&&!i?null:g.createElement(L4,{...e,triggerRef:e.triggerRef,state:o,popoverRef:n,isExiting:i,dir:a})});function L4({state:t,isExiting:e,UNSTABLE_portalContainer:n,clearContexts:l,...r}){var B,N;let o=s.useRef(null),i=s.useRef(null),u=s.useContext(si),a=u&&r.trigger==="SubmenuTrigger",{popoverProps:c,underlayProps:f,arrowProps:d,placement:b,triggerAnchorPoint:p}=E4({...r,offset:r.offset??8,arrowRef:o,groupRef:a?u:i},t),h=r.popoverRef,$=Cr(h,!!b)||r.isEntering||!1,y=ce({...r,defaultClassName:"react-aria-Popover",values:{trigger:r.trigger||null,placement:b,isEntering:$,isExiting:e}}),m=!r.isNonModal||r.trigger==="SubmenuTrigger",[v,E]=s.useState(!1);ne(()=>{h.current&&E(m&&!h.current.querySelector("[role=dialog]"))},[h,m]),s.useEffect(()=>{v&&(r.trigger!=="SubmenuTrigger"||cn()!=="pointer")&&h.current&&!vt(h.current)&&ve(h.current)},[v,h,r.trigger]);let C=s.useMemo(()=>{let U=y.children;if(l)for(let _ of l)U=g.createElement(_.Provider,{value:null},U);return U},[y.children,l]),[R,A]=s.useState(null),K=s.useCallback(()=>{r.triggerRef.current&&A(r.triggerRef.current.getBoundingClientRect().width+"px")},[r.triggerRef]);ne(K,[K]),an({ref:(B=y.style)!=null&&B["--trigger-width"]?void 0:r.triggerRef,onResize:K});let P={...c.style,"--trigger-anchor-point":p?`${p.x}px ${p.y}px`:void 0,...y.style,"--trigger-width":((N=y.style)==null?void 0:N["--trigger-width"])||R},z=g.createElement(le.div,{...G(ie(r,{global:!0}),c),...y,role:v?"dialog":void 0,tabIndex:v?-1:void 0,"aria-label":r["aria-label"],"aria-labelledby":r["aria-labelledby"],ref:h,slot:r.slot||void 0,style:P,dir:r.dir,"data-trigger":r.trigger,"data-placement":b,"data-entering":$||void 0,"data-exiting":e||void 0},!r.isNonModal&&g.createElement(Ql,{onDismiss:t.close}),g.createElement(Xh.Provider,{value:{...d,placement:b,ref:o}},C),g.createElement(Ql,{onDismiss:t.close}));return a?g.createElement(er,{...r,shouldContainFocus:v,isExiting:e,portalContainer:n??(u==null?void 0:u.current)??void 0},z):g.createElement(er,{...r,shouldContainFocus:v,isExiting:e,portalContainer:n},!r.isNonModal&&t.isOpen&&g.createElement("div",{"data-testid":"underlay",...f,style:{position:"fixed",inset:0}}),g.createElement("div",{ref:i,style:{display:"contents"}},g.createElement(si.Provider,{value:i},z)))}class Ge{constructor(e){this.value=null,this.level=0,this.hasChildNodes=!1,this.rendered=null,this.textValue="",this["aria-label"]=void 0,this.index=0,this.parentKey=null,this.prevKey=null,this.nextKey=null,this.firstChildKey=null,this.lastChildKey=null,this.props={},this.colSpan=null,this.colIndex=null,this.type=this.constructor.type,this.key=e}get childNodes(){throw new Error("childNodes is not supported")}clone(){let e=new this.constructor(this.key);return e.value=this.value,e.level=this.level,e.hasChildNodes=this.hasChildNodes,e.rendered=this.rendered,e.textValue=this.textValue,e["aria-label"]=this["aria-label"],e.index=this.index,e.parentKey=this.parentKey,e.prevKey=this.prevKey,e.nextKey=this.nextKey,e.firstChildKey=this.firstChildKey,e.lastChildKey=this.lastChildKey,e.props=this.props,e.render=this.render,e.colSpan=this.colSpan,e.colIndex=this.colIndex,e}filter(e,n,l){let r=this.clone();return n.addDescendants(r,e),r}}class ul extends Ge{filter(e,n,l){let[r,o]=Fa(e,n,this.firstChildKey,l),i=this.clone();return i.firstChildKey=r,i.lastChildKey=o,i}}const lo=class lo extends Ge{};lo.type="header";let ci=lo;const ro=class ro extends Ge{};ro.type="loader";let qn=ro;const oo=class oo extends ul{filter(e,n,l){if(l(this.textValue,this)){let r=this.clone();return n.addDescendants(r,e),r}return null}};oo.type="item";let tr=oo;const io=class io extends ul{filter(e,n,l){let r=super.filter(e,n,l);if(r&&r.lastChildKey!==null){let o=e.getItem(r.lastChildKey);if(o&&o.type!=="header")return r}return null}};io.type="section";let nr=io;class Ia{get size(){return this.itemCount}getKeys(){return this.keyMap.keys()}*[Symbol.iterator](){let e=this.firstKey!=null?this.keyMap.get(this.firstKey):void 0;for(;e;)yield e,e=e.nextKey!=null?this.keyMap.get(e.nextKey):void 0}getChildren(e){let n=this.keyMap;return{*[Symbol.iterator](){let l=n.get(e),r=(l==null?void 0:l.firstChildKey)!=null?n.get(l.firstChildKey):null;for(;r;)yield r,r=r.nextKey!=null?n.get(r.nextKey):void 0}}}getKeyBefore(e){let n=this.keyMap.get(e);if(!n)return null;if(n.prevKey!=null){for(n=this.keyMap.get(n.prevKey);n&&n.type!=="item"&&n.lastChildKey!=null;)n=this.keyMap.get(n.lastChildKey);return(n==null?void 0:n.key)??null}return n.parentKey}getKeyAfter(e){let n=this.keyMap.get(e);if(!n)return null;if(n.type!=="item"&&n.firstChildKey!=null)return n.firstChildKey;for(;n;){if(n.nextKey!=null)return n.nextKey;if(n.parentKey!=null)n=this.keyMap.get(n.parentKey);else return null}return null}getFirstKey(){return this.firstKey}getLastKey(){let e=this.lastKey!=null?this.keyMap.get(this.lastKey):null;for(;(e==null?void 0:e.lastChildKey)!=null;)e=this.keyMap.get(e.lastChildKey);return(e==null?void 0:e.key)??null}getItem(e){return this.keyMap.get(e)??null}at(){throw new Error("Not implemented")}clone(){let e=this.constructor,n=new e;return n.keyMap=new Map(this.keyMap),n.firstKey=this.firstKey,n.lastKey=this.lastKey,n.itemCount=this.itemCount,n}addNode(e){if(this.frozen)throw new Error("Cannot add a node to a frozen collection");e.type==="item"&&this.keyMap.get(e.key)==null&&this.itemCount++,this.keyMap.set(e.key,e)}addDescendants(e,n){this.addNode(e);let l=n.getChildren(e.key);for(let r of l)this.addDescendants(r,n)}removeNode(e){if(this.frozen)throw new Error("Cannot remove a node to a frozen collection");let n=this.keyMap.get(e);n!=null&&n.type==="item"&&this.itemCount--,this.keyMap.delete(e)}commit(e,n,l=!1){if(this.frozen)throw new Error("Cannot commit a frozen collection");this.firstKey=e,this.lastKey=n,this.frozen=!l}filter(e){let n=new this.constructor,[l,r]=Fa(this,n,this.firstKey,e);return n==null||n.commit(l,r),n}constructor(){this.keyMap=new Map,this.firstKey=null,this.lastKey=null,this.frozen=!1,this.itemCount=0}}function Fa(t,e,n,l){if(n==null)return[null,null];let r=null,o=null,i=t.getItem(n);for(;i!=null;){let u=i.filter(t,e,l);u!=null&&(u.nextKey=null,o&&(u.prevKey=o.key,o.nextKey=u.key),r==null&&(r=u),e.addNode(u),o=u),i=i.nextKey!=null?t.getItem(i.nextKey):null}if(o&&o.type==="separator"){let u=o.prevKey;e.removeNode(o.key),u!=null?(o=e.getItem(u),o.nextKey=null):o=null}return[(r==null?void 0:r.key)??null,(o==null?void 0:o.key)??null]}class La{constructor(e){this._firstChild=null,this._lastChild=null,this._previousSibling=null,this._nextSibling=null,this._parentNode=null,this._minInvalidChildIndex=null,this.ownerDocument=e}*[Symbol.iterator](){let e=this.firstChild;for(;e;)yield e,e=e.nextSibling}get firstChild(){return this._firstChild}set firstChild(e){this._firstChild=e,this.ownerDocument.markDirty(this)}get lastChild(){return this._lastChild}set lastChild(e){this._lastChild=e,this.ownerDocument.markDirty(this)}get previousSibling(){return this._previousSibling}set previousSibling(e){this._previousSibling=e,this.ownerDocument.markDirty(this)}get nextSibling(){return this._nextSibling}set nextSibling(e){this._nextSibling=e,this.ownerDocument.markDirty(this)}get parentNode(){return this._parentNode}set parentNode(e){this._parentNode=e,this.ownerDocument.markDirty(this)}get isConnected(){var e;return((e=this.parentNode)==null?void 0:e.isConnected)||!1}invalidateChildIndices(e){(this._minInvalidChildIndex==null||!this._minInvalidChildIndex.isConnected||e.indexthis.subscriptions.delete(e)}resetAfterSSR(){this.isSSR&&(this.isSSR=!1,this.firstChild=null,this.lastChild=null,this.nodeId=0)}}function Lr(t){let{children:e,items:n,idScope:l,addIdAndValue:r,dependencies:o=[]}=t,i=s.useMemo(()=>{},[e]),u=s.useMemo(()=>new WeakMap,[...o,i]);return s.useMemo(()=>{if(n&&typeof e=="function"){let a=[];for(let c of n){let f=N4(c)?c:null,d=f?u.get(f):null;if(!d){d=e(c);let b=d.props.id??(c==null?void 0:c.key)??(c==null?void 0:c.id);l!=null&&d.props.id==null&&b!=null&&(b=l+":"+b);let p=b??a.length;d=s.cloneElement(d,r?{key:p,id:b,value:c}:{key:p}),f&&u.set(f,d)}a.push(d)}return a}else if(typeof e!="function")return e},[e,n,u,l,r])}function N4(t){switch(typeof t){case"object":return t!=null;case"function":case"symbol":return!0;default:return!1}}var Pl={exports:{}},Al={};/** - * @license React - * use-sync-external-store-shim.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var di;function O4(){if(di)return Al;di=1;var t=up();function e(d,b){return d===b&&(d!==0||1/d===1/b)||d!==d&&b!==b}var n=typeof Object.is=="function"?Object.is:e,l=t.useState,r=t.useEffect,o=t.useLayoutEffect,i=t.useDebugValue;function u(d,b){var p=b(),h=l({inst:{value:p,getSnapshot:b}}),$=h[0].inst,y=h[1];return o(function(){$.value=p,$.getSnapshot=b,a($)&&y({inst:$})},[d,p,b]),r(function(){return a($)&&y({inst:$}),d(function(){a($)&&y({inst:$})})},[d]),i(p),p}function a(d){var b=d.getSnapshot;d=d.value;try{var p=b();return!n(d,p)}catch{return!0}}function c(d,b){return b()}var f=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?c:u;return Al.useSyncExternalStore=t.useSyncExternalStore!==void 0?t.useSyncExternalStore:f,Al}var fi;function V4(){return fi||(fi=1,Pl.exports=O4()),Pl.exports}var j4=V4();const za=s.createContext(!1),pn=s.createContext(null);function zr(t){if(s.useContext(pn))return t.content;let{collection:n,document:l}=U4(t.createCollection);return g.createElement(g.Fragment,null,g.createElement(mh,null,g.createElement(pn.Provider,{value:l},t.content)),g.createElement(_4,{render:t.children,collection:n}))}function _4({collection:t,render:e}){return e(t)}function H4(t,e,n){let l=ct(),r=s.useRef(l);r.current=l;let o=s.useCallback(()=>r.current?n():e(),[e,n]);return j4.useSyncExternalStore(t,o)}const W4=typeof g.useSyncExternalStore=="function"?g.useSyncExternalStore:H4;function U4(t){let[e]=s.useState(()=>new z4((t==null?void 0:t())||new Ia)),n=s.useCallback(i=>e.subscribe(i),[e]),l=s.useCallback(()=>{let i=e.getCollection();return e.isSSR&&e.resetAfterSSR(),i},[e]),r=s.useCallback(()=>(e.isSSR=!0,e.getCollection()),[e]);return{collection:W4(n,l,r),document:e}}const lr=s.createContext(null);function G4(t){var n;return n=class extends Ge{},n.type=t,n}function Na(t,e,n,l,r,o){typeof t=="string"&&(t=G4(t));let i=s.useCallback(a=>{a==null||a.setProps(e,n,t,l,o)},[e,n,l,o,t]),u=s.useContext(lr);if(u){let a=u.ownerDocument.nodesByProps.get(e);return a||(a=u.ownerDocument.createElement(t.type),a.setProps(e,n,t,l,o),u.appendChild(a),u.ownerDocument.updateCollection(),u.ownerDocument.nodesByProps.set(e,a)),r?g.createElement(lr.Provider,{value:a},r):null}return g.createElement(t.type,{ref:i},r)}function vn(t,e){let n=({node:r})=>e(r.props,r.props.ref,r),l=s.forwardRef((r,o)=>{let i=s.useContext(Wl);if(!s.useContext(za)){if(e.length>=3)throw new Error(e.name+" cannot be rendered outside a collection.");return e(r,o)}return Na(t,r,o,"children"in r?r.children:null,null,a=>g.createElement(Wl.Provider,{value:i},g.createElement(n,{node:a})))});return l.displayName=e.name,l}function al(t,e,n=Oa){let l=({node:o})=>e(o.props,o.props.ref,o),r=s.forwardRef((o,i)=>{let u=n(o);return Na(t,o,i,null,u,a=>g.createElement(l,{node:a}))??g.createElement(g.Fragment,null)});return r.displayName=e.name,r}function Oa(t){return Lr({...t,addIdAndValue:!0})}const pi=s.createContext(null);function xn(t){let e=s.useContext(pi),n=((e==null?void 0:e.dependencies)||[]).concat(t.dependencies),l=t.idScope??(e==null?void 0:e.idScope),r=Oa({...t,idScope:l,dependencies:n});return s.useContext(pn)&&(r=g.createElement(q4,null,r)),e=s.useMemo(()=>({dependencies:n,idScope:l}),[l,...n]),g.createElement(pi.Provider,{value:e},r)}function q4({children:t}){let e=s.useContext(pn),n=s.useMemo(()=>g.createElement(pn.Provider,{value:null},g.createElement(za.Provider,{value:!0},t)),[t]);return ct()?g.createElement(lr.Provider,{value:e},n):gr.createPortal(n,e)}const Z4=s.createContext(null),Nr={CollectionRoot({collection:t,renderDropIndicator:e}){return bi(t,null,e)},CollectionBranch({collection:t,parent:e,renderDropIndicator:n}){return bi(t,e,n)}};function bi(t,e,n){return Lr({items:e?t.getChildren(e.key):t,dependencies:[n],children(l){if(l.type==="content")return g.createElement(g.Fragment,null);let r=l.render(l);return!n||l.type!=="item"?r:g.createElement(g.Fragment,null,n({type:"item",key:l.key,dropPosition:"before"}),r,Y4(t,l,n))}})}function Y4(t,e,n){let l=e.key,r=t.getKeyAfter(l),o=r!=null?t.getItem(r):null;for(;o!=null&&o.type!=="item";)r=t.getKeyAfter(o.key),o=r!=null?t.getItem(r):null;let i=e.nextKey!=null?t.getItem(e.nextKey):null;for(;i!=null&&i.type!=="item";)i=i.nextKey!=null?t.getItem(i.nextKey):null;let u=[];if(i==null){let a=e;for(;(a==null?void 0:a.type)==="item"&&(!o||a.parentKey!==o.parentKey&&o.level{b.target.dispatchEvent(new PointerEvent("pointercancel",{bubbles:!0})),re(b.target).activeElement!==b.target&&Ve(b.target),r&&r({...b,type:"longpress"}),u.current=void 0},o),b.pointerType==="touch")){let p=$=>{$.preventDefault()},h=we(b.target);a(b.target,"contextmenu",p,{once:!0}),a(h,"pointerup",()=>{setTimeout(()=>{c(b.target,"contextmenu",p)},30)},{once:!0})}},onPressEnd(b){u.current&&clearTimeout(u.current),l&&(b.pointerType==="mouse"||b.pointerType==="touch")&&l({...b,type:"longpressend"})}}),d=mn(r&&!e?i:void 0);return{longPressProps:G(f,d)}}function ks(t,e,n){let{type:l}=t,{isOpen:r}=e;s.useEffect(()=>{n&&n.current&&Uu.set(n.current,e.close)});let o;l==="menu"?o=!0:l==="listbox"&&(o="listbox");let i=$e();return{triggerProps:{"aria-haspopup":o,"aria-expanded":r,"aria-controls":r?i:void 0,onPress:e.toggle},overlayProps:{id:i}}}function rm(t){return t&&t.__esModule?t.default:t}function om(t,e,n){let{type:l="menu",isDisabled:r,trigger:o="press"}=t,i=$e(),{triggerProps:u,overlayProps:a}=ks({type:l},e,n),c=p=>{if(!r&&!(o==="longPress"&&!p.altKey)&&n&&n.current)switch(p.key){case"Enter":case" ":if(o==="longPress"||p.isDefaultPrevented())return;case"ArrowDown":"continuePropagation"in p||p.stopPropagation(),p.preventDefault(),e.toggle("first");break;case"ArrowUp":"continuePropagation"in p||p.stopPropagation(),p.preventDefault(),e.toggle("last");break;default:"continuePropagation"in p&&p.continuePropagation()}},f=Ne(rm(Ss),"@react-aria/menu"),{longPressProps:d}=Ds({isDisabled:r||o!=="longPress",accessibilityDescription:f.format("longPressMessage"),onLongPressStart(){e.close()},onLongPress(){e.open("first")}}),b={preventFocusOnPress:!0,onPressStart(p){p.pointerType!=="touch"&&p.pointerType!=="keyboard"&&!r&&(Ve(p.target),e.open(p.pointerType==="virtual"?"first":null))},onPress(p){p.pointerType==="touch"&&!r&&(Ve(p.target),e.toggle())}};return delete u.onPress,{menuTriggerProps:{...u,...o==="press"?b:d,id:i,onKeyDown:c},menuProps:{...a,"aria-labelledby":i,autoFocus:e.focusStrategy||!0,onClose:e.close}}}function or(t){return Fn()?t.altKey:t.ctrlKey}function On(t,e){var r,o;let n=`[data-key="${CSS.escape(String(e))}"]`,l=(r=t.current)==null?void 0:r.dataset.collection;return l&&(n=`[data-collection="${CSS.escape(l)}"]${n}`),(o=t.current)==null?void 0:o.querySelector(n)}const Ps=new WeakMap;function im(t){let e=$e();return Ps.set(t,e),e}function um(t){return Ps.get(t)}const am=1e3;function sm(t){let{keyboardDelegate:e,selectionManager:n,onTypeSelect:l}=t,r=s.useRef({search:"",timeout:void 0}).current,o=i=>{let u=cm(i.key);if(!(!u||i.ctrlKey||i.metaKey||!te(i.currentTarget,j(i))||r.search.length===0&&u===" ")){if(u===" "&&r.search.trim().length>0&&(i.preventDefault(),"continuePropagation"in i||i.stopPropagation()),r.search+=u,e.getKeyForSearch!=null){let a=e.getKeyForSearch(r.search,n.focusedKey);a==null&&(a=e.getKeyForSearch(r.search)),a!=null&&(n.setFocusedKey(a),l&&l(a))}clearTimeout(r.timeout),r.timeout=setTimeout(()=>{r.search=""},am)}};return{typeSelectProps:{onKeyDownCapture:e.getKeyForSearch?o:void 0}}}function cm(t){return t.length===1||!/^[A-Z]/i.test(t)?t:""}function Vr(t){let{selectionManager:e,keyboardDelegate:n,ref:l,autoFocus:r=!1,shouldFocusWrap:o=!1,disallowEmptySelection:i=!1,disallowSelectAll:u=!1,escapeKeyBehavior:a="clearSelection",selectOnFocus:c=e.selectionBehavior==="replace",disallowTypeAhead:f=!1,shouldUseVirtualFocus:d,allowsTabNavigation:b=!1,scrollRef:p=l,linkBehavior:h="action"}=t,{direction:$}=Re(),y=Nt(),m=x=>{var I,w,k,D,T,O,Z,F,V,q,Q,J,ge,Be;if(x.altKey&&x.key==="Tab"&&x.preventDefault(),!l.current||!te(l.current,j(x)))return;const S=(L,Y)=>{if(L!=null){if(e.isLink(L)&&h==="selection"&&c&&!or(x)){gr.flushSync(()=>{e.setFocusedKey(L,Y)});let ue=On(l,L),Ke=e.getItemProps(L);ue&&y.open(ue,x,Ke.href,Ke.routerOptions);return}if(e.setFocusedKey(L,Y),e.isLink(L)&&h==="override")return;x.shiftKey&&e.selectionMode==="multiple"?e.extendSelection(L):c&&!or(x)&&e.replaceSelection(L)}};switch(x.key){case"ArrowDown":if(n.getKeyBelow){let L=e.focusedKey!=null?(I=n.getKeyBelow)==null?void 0:I.call(n,e.focusedKey):(w=n.getFirstKey)==null?void 0:w.call(n);L==null&&o&&(L=(k=n.getFirstKey)==null?void 0:k.call(n,e.focusedKey)),L!=null&&(x.preventDefault(),S(L))}break;case"ArrowUp":if(n.getKeyAbove){let L=e.focusedKey!=null?(D=n.getKeyAbove)==null?void 0:D.call(n,e.focusedKey):(T=n.getLastKey)==null?void 0:T.call(n);L==null&&o&&(L=(O=n.getLastKey)==null?void 0:O.call(n,e.focusedKey)),L!=null&&(x.preventDefault(),S(L))}break;case"ArrowLeft":if(n.getKeyLeftOf){let L=e.focusedKey!=null?(Z=n.getKeyLeftOf)==null?void 0:Z.call(n,e.focusedKey):(F=n.getFirstKey)==null?void 0:F.call(n);L==null&&o&&(L=$==="rtl"?(V=n.getFirstKey)==null?void 0:V.call(n,e.focusedKey):(q=n.getLastKey)==null?void 0:q.call(n,e.focusedKey)),L!=null&&(x.preventDefault(),S(L,$==="rtl"?"first":"last"))}break;case"ArrowRight":if(n.getKeyRightOf){let L=e.focusedKey!=null?(Q=n.getKeyRightOf)==null?void 0:Q.call(n,e.focusedKey):(J=n.getFirstKey)==null?void 0:J.call(n);L==null&&o&&(L=$==="rtl"?(ge=n.getLastKey)==null?void 0:ge.call(n,e.focusedKey):(Be=n.getFirstKey)==null?void 0:Be.call(n,e.focusedKey)),L!=null&&(x.preventDefault(),S(L,$==="rtl"?"last":"first"))}break;case"Home":if(n.getFirstKey){if(e.focusedKey===null&&x.shiftKey)return;x.preventDefault();let L=n.getFirstKey(e.focusedKey,kt(x));e.setFocusedKey(L),L!=null&&(kt(x)&&x.shiftKey&&e.selectionMode==="multiple"?e.extendSelection(L):c&&e.replaceSelection(L))}break;case"End":if(n.getLastKey){if(e.focusedKey===null&&x.shiftKey)return;x.preventDefault();let L=n.getLastKey(e.focusedKey,kt(x));e.setFocusedKey(L),L!=null&&(kt(x)&&x.shiftKey&&e.selectionMode==="multiple"?e.extendSelection(L):c&&e.replaceSelection(L))}break;case"PageDown":if(n.getKeyPageBelow&&e.focusedKey!=null){let L=n.getKeyPageBelow(e.focusedKey);L!=null&&(x.preventDefault(),S(L))}break;case"PageUp":if(n.getKeyPageAbove&&e.focusedKey!=null){let L=n.getKeyPageAbove(e.focusedKey);L!=null&&(x.preventDefault(),S(L))}break;case"a":kt(x)&&e.selectionMode==="multiple"&&u!==!0&&(x.preventDefault(),e.selectAll());break;case"Escape":a==="clearSelection"&&!i&&e.selectedKeys.size!==0&&(x.stopPropagation(),x.preventDefault(),e.clearSelection());break;case"Tab":if(!b){if(x.shiftKey)l.current.focus();else{let L=Fe(l.current,{tabbable:!0}),Y,ue;do ue=L.lastChild(),ue&&(Y=ue);while(ue);let Ke=oe();Y&&(!vt(Y)||Ke&&!du(Ke))&&Ve(Y)}break}}},v=s.useRef({top:0,left:0});Yt(p,"scroll",()=>{var x,S;v.current={top:((x=p.current)==null?void 0:x.scrollTop)??0,left:((S=p.current)==null?void 0:S.scrollLeft)??0}});let E=x=>{var S,I;if(e.isFocused){te(x.currentTarget,j(x))||e.setFocused(!1);return}if(te(x.currentTarget,j(x))){if(e.setFocused(!0),e.focusedKey==null){let w=D=>{D!=null&&(e.setFocusedKey(D),c&&!e.isSelected(D)&&e.replaceSelection(D))},k=x.relatedTarget;k&&x.currentTarget.compareDocumentPosition(k)&Node.DOCUMENT_POSITION_FOLLOWING?w(e.lastSelectedKey??((S=n.getLastKey)==null?void 0:S.call(n))):w(e.firstSelectedKey??((I=n.getFirstKey)==null?void 0:I.call(n)))}else p.current&&(p.current.scrollTop=v.current.top,p.current.scrollLeft=v.current.left);if(e.focusedKey!=null&&p.current){let w=On(l,e.focusedKey);w instanceof HTMLElement&&(!vt(w)&&!d&&Ve(w),cn()==="keyboard"&&it(w,{containingElement:l.current}))}}},C=x=>{te(x.currentTarget,x.relatedTarget)||e.setFocused(!1)},R=s.useRef(!1);Yt(l,sp,d?x=>{let{detail:S}=x;x.stopPropagation(),e.setFocused(!0),(S==null?void 0:S.focusStrategy)==="first"&&(R.current=!0)}:void 0),ko(()=>{var x;if(R.current){let S=((x=n.getFirstKey)==null?void 0:x.call(n))??null;if(S==null){let I=oe();Va(l.current),Or(I,null),e.collection.size>0&&(R.current=!1)}else e.setFocusedKey(S),R.current=!1}},[e.collection]),ko(()=>{e.collection.size>0&&(R.current=!1)},[e.focusedKey]),Yt(l,ap,d?x=>{var S;x.stopPropagation(),e.setFocused(!1),(S=x.detail)!=null&&S.clearFocusKey&&e.setFocusedKey(null)}:void 0);const A=s.useRef(r),K=s.useRef(!1);s.useEffect(()=>{var x,S;if(A.current){let I=null;r==="first"&&(I=((x=n.getFirstKey)==null?void 0:x.call(n))??null),r==="last"&&(I=((S=n.getLastKey)==null?void 0:S.call(n))??null);let w=e.selectedKeys;if(w.size){for(let k of w)if(e.canSelectItem(k)){I=k;break}}e.setFocused(!0),e.setFocusedKey(I),I==null&&!d&&l.current&&ve(l.current),e.collection.size>0&&(A.current=!1,K.current=!0)}});let P=s.useRef(e.focusedKey),z=s.useRef(null);s.useEffect(()=>{if(e.isFocused&&e.focusedKey!=null&&(e.focusedKey!==P.current||K.current)&&p.current&&l.current){let x=cn(),S=On(l,e.focusedKey);if(!(S instanceof HTMLElement))return;(x==="keyboard"||K.current)&&(z.current&&cancelAnimationFrame(z.current),z.current=requestAnimationFrame(()=>{p.current&&(Ln(p.current,S),x!=="virtual"&&it(S,{containingElement:l.current}))}))}!d&&e.isFocused&&e.focusedKey==null&&P.current!=null&&l.current&&ve(l.current),P.current=e.focusedKey,K.current=!1}),s.useEffect(()=>()=>{z.current&&cancelAnimationFrame(z.current)},[]),Yt(l,"react-aria-focus-scope-restore",x=>{x.preventDefault(),e.setFocused(!0)});let B={onKeyDown:m,onFocus:E,onBlur:C,onMouseDown(x){p.current===j(x)&&x.preventDefault()}},{typeSelectProps:N}=sm({keyboardDelegate:n,selectionManager:e});f||(B=G(N,B));let U;d||(U=e.focusedKey==null?0:-1);let _=im(e.collection);return{collectionProps:G(B,{tabIndex:U,"data-collection":_})}}class ir{constructor(e){this.ref=e}getItemRect(e){let n=this.ref.current;if(!n)return null;let l=e!=null?On(this.ref,e):null;if(!l)return null;let r=n.getBoundingClientRect(),o=l.getBoundingClientRect();return{x:o.left-r.left-n.clientLeft+n.scrollLeft,y:o.top-r.top-n.clientTop+n.scrollTop,width:o.width,height:o.height}}getContentSize(){let e=this.ref.current;return{width:(e==null?void 0:e.scrollWidth)??0,height:(e==null?void 0:e.scrollHeight)??0}}getVisibleRect(){let e=this.ref.current;return{x:(e==null?void 0:e.scrollLeft)??0,y:(e==null?void 0:e.scrollTop)??0,width:(e==null?void 0:e.clientWidth)??0,height:(e==null?void 0:e.clientHeight)??0}}}class sl{constructor(...e){if(e.length===1){let n=e[0];this.collection=n.collection,this.ref=n.ref,this.collator=n.collator,this.disabledKeys=n.disabledKeys||new Set,this.disabledBehavior=n.disabledBehavior||"all",this.orientation=n.orientation||"vertical",this.direction=n.direction,this.layout=n.layout||"stack",this.layoutDelegate=n.layoutDelegate||new ir(n.ref)}else this.collection=e[0],this.disabledKeys=e[1],this.ref=e[2],this.collator=e[3],this.layout="stack",this.orientation="vertical",this.disabledBehavior="all",this.layoutDelegate=new ir(this.ref);this.layout==="stack"&&this.orientation==="vertical"&&(this.getKeyLeftOf=void 0,this.getKeyRightOf=void 0)}isDisabled(e){var n,l;return this.disabledBehavior==="all"&&(((n=e.props)==null?void 0:n.isDisabled)||this.disabledKeys.has(e.key))&&((l=e.props)==null?void 0:l.disabledBehavior)!=="selection"}findNextNonDisabled(e,n,l=!1){let r=e;for(;r!=null;){let o=this.collection.getItem(r);if((o==null?void 0:o.type)==="item"&&(l||!this.isDisabled(o)))return r;r=n(r)}return null}getNextKey(e,n){let l=e;return l=this.collection.getKeyAfter(l),this.findNextNonDisabled(l,r=>this.collection.getKeyAfter(r),n==null?void 0:n.includeDisabled)}getPreviousKey(e,n){let l=e;return l=this.collection.getKeyBefore(l),this.findNextNonDisabled(l,r=>this.collection.getKeyBefore(r),n==null?void 0:n.includeDisabled)}findKey(e,n,l){let r=e,o=this.layoutDelegate.getItemRect(r);if(!o||r==null)return null;let i=o;do{if(r=n(r),r==null)break;o=this.layoutDelegate.getItemRect(r)}while(o&&l(i,o)&&r!=null);return r}isSameRow(e,n){return e.y===n.y||e.x!==n.x}isSameColumn(e,n){return e.x===n.x||e.y!==n.y}getKeyBelow(e,n){return this.layout==="grid"&&this.orientation==="vertical"?this.findKey(e,l=>this.getNextKey(l,n),this.isSameRow):this.getNextKey(e,n)}getKeyAbove(e,n){return this.layout==="grid"&&this.orientation==="vertical"?this.findKey(e,l=>this.getPreviousKey(l,n),this.isSameRow):this.getPreviousKey(e,n)}getNextColumn(e,n,l){return n?this.getPreviousKey(e,l):this.getNextKey(e,l)}getKeyRightOf(e,n){let l=this.direction==="ltr"?"getKeyRightOf":"getKeyLeftOf";return this.layoutDelegate[l]?(e=this.layoutDelegate[l](e),this.findNextNonDisabled(e,r=>this.layoutDelegate[l](r),n==null?void 0:n.includeDisabled)):this.layout==="grid"?this.orientation==="vertical"?this.getNextColumn(e,this.direction==="rtl",n):this.findKey(e,r=>this.getNextColumn(r,this.direction==="rtl",n),this.isSameColumn):this.orientation==="horizontal"?this.getNextColumn(e,this.direction==="rtl",n):null}getKeyLeftOf(e,n){let l=this.direction==="ltr"?"getKeyLeftOf":"getKeyRightOf";return this.layoutDelegate[l]?(e=this.layoutDelegate[l](e),this.findNextNonDisabled(e,r=>this.layoutDelegate[l](r),n==null?void 0:n.includeDisabled)):this.layout==="grid"?this.orientation==="vertical"?this.getNextColumn(e,this.direction==="ltr",n):this.findKey(e,r=>this.getNextColumn(r,this.direction==="ltr",n),this.isSameColumn):this.orientation==="horizontal"?this.getNextColumn(e,this.direction==="ltr",n):null}getFirstKey(){let e=this.collection.getFirstKey();return this.findNextNonDisabled(e,n=>this.collection.getKeyAfter(n))}getLastKey(){let e=this.collection.getLastKey();return this.findNextNonDisabled(e,n=>this.collection.getKeyBefore(n))}getKeyPageAbove(e){let n=this.ref.current,l=this.layoutDelegate.getItemRect(e);if(!l)return null;if(n&&!st(n))return this.getFirstKey();let r=e;if(this.orientation==="horizontal"){let o=Math.max(0,l.x+l.width-this.layoutDelegate.getVisibleRect().width);for(;l&&l.x>o&&r!=null;)r=this.getKeyAbove(r),l=r==null?null:this.layoutDelegate.getItemRect(r)}else{let o=Math.max(0,l.y+l.height-this.layoutDelegate.getVisibleRect().height);for(;l&&l.y>o&&r!=null;)r=this.getKeyAbove(r),l=r==null?null:this.layoutDelegate.getItemRect(r)}return r??this.getFirstKey()}getKeyPageBelow(e){let n=this.ref.current,l=this.layoutDelegate.getItemRect(e);if(!l)return null;if(n&&!st(n))return this.getLastKey();let r=e;if(this.orientation==="horizontal"){let o=Math.min(this.layoutDelegate.getContentSize().width,l.x-l.width+this.layoutDelegate.getVisibleRect().width);for(;l&&l.xr[0]o||new sl({collection:n,disabledKeys:l,disabledBehavior:c,ref:r,collator:a,layoutDelegate:i,orientation:u}),[o,i,n,l,r,a,c,u]),{collectionProps:d}=Vr({...t,ref:r,selectionManager:e,keyboardDelegate:f});return{listProps:d}}function jr(t){let{id:e,selectionManager:n,key:l,ref:r,shouldSelectOnPressUp:o,shouldUseVirtualFocus:i,focus:u,isDisabled:a,onAction:c,allowsDifferentPressOrigin:f,linkBehavior:d="action"}=t,b=Nt();e=$e(e);let p=T=>{if(T.pointerType==="keyboard"&&or(T))n.toggleSelection(l);else{if(n.selectionMode==="none")return;if(n.isLink(l)){if(d==="selection"&&r.current){let O=n.getItemProps(l);b.open(r.current,T,O.href,O.routerOptions),n.setSelectedKeys(n.selectedKeys);return}else if(d==="override"||d==="none")return}n.selectionMode==="single"?n.isSelected(l)&&!n.disallowEmptySelection?n.toggleSelection(l):n.replaceSelection(l):T&&T.shiftKey?n.extendSelection(l):n.selectionBehavior==="toggle"||T&&(kt(T)||T.pointerType==="touch"||T.pointerType==="virtual")?n.toggleSelection(l):n.replaceSelection(l)}};s.useEffect(()=>{l===n.focusedKey&&n.isFocused&&(i?Va(r.current):u?u():oe()!==r.current&&r.current&&ve(r.current))},[r,l,n.focusedKey,n.childFocusStrategy,n.isFocused,i]),a=a||n.isDisabled(l);let h={};!i&&!a?h={tabIndex:l===n.focusedKey?0:-1,onFocus(T){j(T)===r.current&&n.setFocusedKey(l)}}:a&&(h.onMouseDown=T=>{T.preventDefault()}),s.useEffect(()=>{a&&n.focusedKey===l&&n.setFocusedKey(null)},[n,a,l]);let $=n.isLink(l)&&d==="override",y=c&&t.UNSTABLE_itemBehavior==="action",m=n.isLink(l)&&d!=="selection"&&d!=="none",v=!a&&n.canSelectItem(l)&&!$&&!y,E=(c||m)&&!a,C=E&&(n.selectionBehavior==="replace"?!v:!v||n.isEmpty),R=E&&v&&n.selectionBehavior==="replace",A=C||R,K=s.useRef(null),P=A&&v,z=s.useRef(!1),B=s.useRef(!1),N=n.getItemProps(l),U=T=>{var O;c&&(c(),(O=r.current)==null||O.dispatchEvent(new CustomEvent("react-aria-item-action",{bubbles:!0}))),m&&r.current&&b.open(r.current,T,N.href,N.routerOptions)},_={ref:r};if(o?(_.onPressStart=T=>{K.current=T.pointerType,z.current=P,T.pointerType==="keyboard"&&(!A||gi(T.key))&&p(T)},f?(_.onPressUp=C?void 0:T=>{T.pointerType==="mouse"&&v&&p(T)},_.onPress=C?U:T=>{T.pointerType!=="keyboard"&&T.pointerType!=="mouse"&&v&&p(T)}):_.onPress=T=>{if(C||R&&T.pointerType!=="mouse"){if(T.pointerType==="keyboard"&&!mi(T.key))return;U(T)}else T.pointerType!=="keyboard"&&v&&p(T)}):(_.onPressStart=T=>{K.current=T.pointerType,z.current=P,B.current=C,v&&(T.pointerType==="mouse"&&!C||T.pointerType==="keyboard"&&(!E||gi(T.key)))&&p(T)},_.onPress=T=>{(T.pointerType==="touch"||T.pointerType==="pen"||T.pointerType==="virtual"||T.pointerType==="keyboard"&&A&&mi(T.key)||T.pointerType==="mouse"&&B.current)&&(A?U(T):v&&p(T))}),h["data-collection"]=um(n.collection),h["data-key"]=l,_.preventFocusOnPress=i,i&&(_=G(_,{onPressStart(T){T.pointerType!=="touch"&&(n.setFocused(!0),n.setFocusedKey(l))},onPress(T){T.pointerType==="touch"&&(n.setFocused(!0),n.setFocusedKey(l))}})),N)for(let T of["onPressStart","onPressEnd","onPressChange","onPress","onPressUp","onClick"])N[T]&&(_[T]=dt(_[T],N[T]));let{pressProps:x,isPressed:S}=lt(_),I=R?T=>{K.current==="mouse"&&(T.stopPropagation(),T.preventDefault(),U(T))}:void 0,{longPressProps:w}=Ds({isDisabled:!P,onLongPress(T){T.pointerType==="touch"&&(p(T),n.setSelectionBehavior("toggle"))}}),k=T=>{K.current==="touch"&&z.current&&T.preventDefault()},D=d!=="none"&&n.isLink(l)?T=>{tt.isOpening||T.preventDefault()}:void 0;return{itemProps:G(h,v||C||i&&!a?x:{},P?w:{},{onDoubleClick:I,onDragStartCapture:k,onClick:D,id:e},i?{onMouseDown:T=>T.preventDefault()}:void 0),isPressed:S,isSelected:n.isSelected(l),isFocused:n.isFocused&&n.focusedKey===l,isDisabled:a,allowsSelection:v,hasAction:A}}function mi(t){return t==="Enter"}function gi(t){return t===" "}function Ce(t,e){return typeof e.getChildren=="function"?e.getChildren(t.key):t.childNodes}function Pt(t){return en(t,0)}function en(t,e){if(e<0)return;let n=0;for(let l of t){if(n===e)return l;n++}}function In(t){let e;for(let n of t)e=n;return e}const yi=new WeakMap;function As(t){let e=yi.get(t);if(e!=null)return e;let n=0,l=r=>{for(let o of r)o.type==="section"?l(Ce(o,t)):o.type==="item"&&n++};return l(t),yi.set(t,n),n}function fm(t){let e=il(t),[n,l]=s.useState(null),[r,o]=s.useState([]),i=()=>{o([]),e.close()};return{focusStrategy:n,...e,open(c=null){l(c),e.open()},toggle(c=null){l(c),e.toggle()},close(){i()},expandedKeysStack:r,openSubmenu:(c,f)=>{o(d=>f>d.length?d:[...d.slice(0,f),c])},closeSubmenu:(c,f)=>{o(d=>d[f]===c?d.slice(0,f):d)}}}function Zn(t,e){return typeof e.getChildren=="function"?e.getChildren(t.key):t.childNodes}function _r(t){return pm(t)}function pm(t,e){for(let n of t)return n}function Ts(t){let e;for(let n of t)e=n;return e}function Bl(t,e,n){if(e.parentKey===n.parentKey)return e.index-n.index;let l=[...$i(t,e),e],r=[...$i(t,n),n],o=l.slice(0,r.length).findIndex((i,u)=>i!==r[u]);return o!==-1?(e=l[o],n=r[o],e.index-n.index):l.findIndex(i=>i===n)>=0?1:(r.findIndex(i=>i===e)>=0,-1)}function $i(t,e){let n=[],l=e;for(;(l==null?void 0:l.parentKey)!=null;)l=t.getItem(l.parentKey),l&&n.unshift(l);return n}class Oe extends Set{constructor(e,n,l){super(e),e instanceof Oe?(this.anchorKey=n??e.anchorKey,this.currentKey=l??e.currentKey):(this.anchorKey=n??null,this.currentKey=l??null)}}class cl{constructor(e,n,l){this.collection=e,this.state=n,this.allowsCellSelection=(l==null?void 0:l.allowsCellSelection)??!1,this._isSelectAll=null,this.layoutDelegate=(l==null?void 0:l.layoutDelegate)||null,this.fullCollection=(l==null?void 0:l.fullCollection)||null}get selectionMode(){return this.state.selectionMode}get disallowEmptySelection(){return this.state.disallowEmptySelection}get selectionBehavior(){return this.state.selectionBehavior}setSelectionBehavior(e){this.state.setSelectionBehavior(e)}get isFocused(){return this.state.isFocused}setFocused(e){this.state.setFocused(e)}get focusedKey(){return this.state.focusedKey}get childFocusStrategy(){return this.state.childFocusStrategy}setFocusedKey(e,n){(e==null||this.collection.getItem(e))&&this.state.setFocusedKey(e,n)}get selectedKeys(){return this.state.selectedKeys==="all"?new Set(this.getSelectAllKeys()):this.state.selectedKeys}get rawSelection(){return this.state.selectedKeys}isSelected(e){if(this.state.selectionMode==="none")return!1;let n=this.getKey(e);return n==null?!1:this.state.selectedKeys==="all"?this.canSelectItem(n):this.state.selectedKeys.has(n)}get isEmpty(){return this.state.selectedKeys!=="all"&&this.state.selectedKeys.size===0}get isSelectAll(){if(this.isEmpty)return!1;if(this.state.selectedKeys==="all")return!0;if(this._isSelectAll!=null)return this._isSelectAll;let e=this.getSelectAllKeys(),n=this.state.selectedKeys;return this._isSelectAll=e.every(l=>n.has(l)),this._isSelectAll}get firstSelectedKey(){let e=null;for(let n of this.state.selectedKeys){let l=this.collection.getItem(n);(!e||l&&Bl(this.collection,l,e)<0)&&(e=l)}return(e==null?void 0:e.key)??null}get lastSelectedKey(){let e=null;for(let n of this.state.selectedKeys){let l=this.collection.getItem(n);(!e||l&&Bl(this.collection,l,e)>0)&&(e=l)}return(e==null?void 0:e.key)??null}get disabledKeys(){return this.state.disabledKeys}get disabledBehavior(){return this.state.disabledBehavior}extendSelection(e){if(this.selectionMode==="none")return;if(this.selectionMode==="single"){this.replaceSelection(e);return}let n=this.getKey(e);if(n==null)return;let l;if(this.state.selectedKeys==="all")l=new Oe([n],n,n);else{let r=this.state.selectedKeys,o=r.anchorKey??n;l=new Oe(r,o,n);for(let i of this.getKeyRange(o,r.currentKey??n))l.delete(i);for(let i of this.getKeyRange(n,o))this.canSelectItem(i)&&l.add(i)}this.state.setSelectedKeys(l)}getKeyRange(e,n){let l=this.collection.getItem(e),r=this.collection.getItem(n);return l&&r?Bl(this.collection,l,r)<=0?this.getKeyRangeInternal(e,n):this.getKeyRangeInternal(n,e):[]}getKeyRangeInternal(e,n){var o;if((o=this.layoutDelegate)!=null&&o.getKeyRange)return this.layoutDelegate.getKeyRange(e,n);let l=[],r=e;for(;r!=null;){let i=this.collection.getItem(r);if(i&&(i.type==="item"||i.type==="cell"&&this.allowsCellSelection)&&l.push(r),r===n)return l;r=this.collection.getKeyAfter(r)}return[]}getKey(e){let n=this.collection.getItem(e);if(!n||n.type==="cell"&&this.allowsCellSelection)return e;for(;n&&n.type!=="item"&&n.parentKey!=null;)n=this.collection.getItem(n.parentKey);return!n||n.type!=="item"?null:n.key}toggleSelection(e){if(this.selectionMode==="none")return;if(this.selectionMode==="single"&&!this.isSelected(e)){this.replaceSelection(e);return}let n=this.getKey(e);if(n==null)return;let l=new Oe(this.state.selectedKeys==="all"?this.getSelectAllKeys():this.state.selectedKeys);l.has(n)?l.delete(n):this.canSelectItem(n)&&(l.add(n),l.anchorKey=n,l.currentKey=n),!(this.disallowEmptySelection&&l.size===0)&&this.state.setSelectedKeys(l)}replaceSelection(e){if(this.selectionMode==="none")return;let n=this.getKey(e);if(n==null)return;let l=this.canSelectItem(n)?new Oe([n],n,n):new Oe;this.state.setSelectedKeys(l)}setSelectedKeys(e){if(this.selectionMode==="none")return;let n=new Oe;for(let l of e){let r=this.getKey(l);if(r!=null&&(n.add(r),this.selectionMode==="single"))break}this.state.setSelectedKeys(n)}getSelectAllKeys(){let e=this.fullCollection??this.collection,n=[],l=r=>{var o;for(;r!=null;){if(this.canSelectItemIn(r,e)){let i=e.getItem(r);(i==null?void 0:i.type)==="item"&&n.push(r),i!=null&&i.hasChildNodes&&(this.allowsCellSelection||i.type!=="item")&&l(((o=_r(Zn(i,e)))==null?void 0:o.key)??null)}r=e.getKeyAfter(r)}};return l(e.getFirstKey()),n}selectAll(){!this.isSelectAll&&this.selectionMode==="multiple"&&this.state.setSelectedKeys("all")}clearSelection(){!this.disallowEmptySelection&&(this.state.selectedKeys==="all"||this.state.selectedKeys.size>0)&&this.state.setSelectedKeys(new Oe)}toggleSelectAll(){this.isSelectAll?this.clearSelection():this.selectAll()}select(e,n){this.selectionMode!=="none"&&(this.selectionMode==="single"?this.isSelected(e)&&!this.disallowEmptySelection?this.toggleSelection(e):this.replaceSelection(e):this.selectionBehavior==="toggle"||n&&(n.pointerType==="touch"||n.pointerType==="virtual")?this.toggleSelection(e):this.replaceSelection(e))}isSelectionEqual(e){if(e===this.state.selectedKeys)return!0;let n=this.selectedKeys;if(e.size!==n.size)return!1;for(let l of e)if(!n.has(l))return!1;for(let l of n)if(!e.has(l))return!1;return!0}canSelectItem(e){return this.canSelectItemIn(e,this.collection)}canSelectItemIn(e,n){var r;if(this.state.selectionMode==="none"||this.state.disabledKeys.has(e))return!1;let l=n.getItem(e);return!(!l||(r=l==null?void 0:l.props)!=null&&r.isDisabled||l.type==="cell"&&!this.allowsCellSelection)}isDisabled(e){var l,r;let n=this.collection.getItem(e);return this.state.disabledBehavior==="all"&&(this.state.disabledKeys.has(e)||!!((l=n==null?void 0:n.props)!=null&&l.isDisabled))&&((r=n==null?void 0:n.props)==null?void 0:r.disabledBehavior)!=="selection"}isLink(e){var n,l;return!!((l=(n=this.collection.getItem(e))==null?void 0:n.props)!=null&&l.href)}getItemProps(e){var n;return(n=this.collection.getItem(e))==null?void 0:n.props}withCollection(e){return new cl(e,this.state,{allowsCellSelection:this.allowsCellSelection,layoutDelegate:this.layoutDelegate||void 0,fullCollection:this.fullCollection??this.collection})}}class bm{build(e,n){return this.context=n,vi(()=>this.iterateCollection(e))}*iterateCollection(e){let{children:n,items:l}=e;if(g.isValidElement(n)&&n.type===g.Fragment)yield*this.iterateCollection({children:n.props.children,items:l});else if(typeof n=="function"){if(!l)throw new Error("props.children was a function but props.items is missing");let r=0;for(let o of l)yield*this.getFullNode({value:o,index:r},{renderer:n}),r++}else{let r=[];g.Children.forEach(n,i=>{i&&r.push(i)});let o=0;for(let i of r){let u=this.getFullNode({element:i,index:o},{});for(let a of u)o++,yield a}}}getKey(e,n,l,r){if(e.key!=null)return e.key;if(n.type==="cell"&&n.key!=null)return`${r}${n.key}`;let o=n.value;if(o!=null){let i=o.key??o.id;if(i==null)throw new Error("No key found for item");return i}return r?`${r}.${n.index}`:`$.${n.index}`}getChildState(e,n){return{renderer:n.renderer||e.renderer}}*getFullNode(e,n,l,r){if(g.isValidElement(e.element)&&e.element.type===g.Fragment){let a=[];g.Children.forEach(e.element.props.children,f=>{a.push(f)});let c=e.index??0;for(const f of a)yield*this.getFullNode({element:f,index:c++},n,l,r);return}let o=e.element;if(!o&&e.value&&n&&n.renderer){let a=this.cache.get(e.value);if(a&&(!a.shouldInvalidate||!a.shouldInvalidate(this.context))){a.index=e.index,a.parentKey=r?r.key:null,yield a;return}o=n.renderer(e.value)}if(g.isValidElement(o)){let a=o.type;if(typeof a!="function"&&typeof a.getCollectionNode!="function"){let b=o.type;throw new Error(`Unknown element <${b}> in collection.`)}let c=a.getCollectionNode(o.props,this.context),f=e.index??0,d=c.next();for(;!d.done&&d.value;){let b=d.value;e.index=f;let p=b.key??null;p==null&&(p=b.element?null:this.getKey(o,e,n,l));let $=[...this.getFullNode({...b,key:p,index:f,wrapper:hm(e.wrapper,b.wrapper)},this.getChildState(n,b),l?`${l}${o.key}`:o.key,r)];for(let y of $){if(y.value=b.value??e.value??null,y.value&&this.cache.set(y.value,y),e.type&&y.type!==e.type)throw new Error(`Unsupported type <${Kl(y.type)}> in <${Kl((r==null?void 0:r.type)??"unknown parent type")}>. Only <${Kl(e.type)}> is supported.`);f++,yield y}d=c.next($)}return}if(e.key==null||e.type==null)return;let i=this,u={type:e.type,props:e.props,key:e.key,parentKey:r?r.key:null,value:e.value??null,level:((r==null?void 0:r.level)??0)+((r==null?void 0:r.type)==="item"?1:0),index:e.index,rendered:e.rendered,textValue:e.textValue??"","aria-label":e["aria-label"],wrapper:e.wrapper,shouldInvalidate:e.shouldInvalidate,hasChildNodes:e.hasChildNodes||!1,childNodes:vi(function*(){if(!e.hasChildNodes||!e.childNodes)return;let a=0;for(let c of e.childNodes()){c.key!=null&&(c.key=`${u.key}${c.key}`);let f=i.getFullNode({...c,index:a},i.getChildState(n,c),u.key,u);for(let d of f)a++,yield d}})};yield u}constructor(){this.cache=new WeakMap}}function vi(t){let e=[],n=null;return{*[Symbol.iterator](){for(let l of e)yield l;n||(n=t());for(let l of n)e.push(l),yield l}}}function hm(t,e){if(t&&e)return n=>t(e(n));if(t)return t;if(e)return e}function Kl(t){return t[0].toUpperCase()+t.slice(1)}function Bs(t,e,n){let l=s.useMemo(()=>new bm,[]),{children:r,items:o,collection:i}=t;return s.useMemo(()=>{if(i)return i;let a=l.build({children:r,items:o},n);return e(a)},[l,r,o,i,n,e])}function mm(t,e){if(t.size!==e.size)return!1;for(let n of t)if(!e.has(n))return!1;return!0}function Hr(t){let{selectionMode:e="none",disallowEmptySelection:n=!1,allowDuplicateSelectionEvents:l,selectionBehavior:r="toggle",disabledBehavior:o="all"}=t,i=s.useRef(!1),[,u]=s.useState(!1),a=s.useRef(null),c=s.useRef(null),[,f]=s.useState(null),d=s.useMemo(()=>xi(t.selectedKeys),[t.selectedKeys]),b=s.useMemo(()=>xi(t.defaultSelectedKeys,new Oe),[t.defaultSelectedKeys]),[p,h]=Ct(d,b,t.onSelectionChange),$=s.useMemo(()=>t.disabledKeys?new Set(t.disabledKeys):new Set,[t.disabledKeys]),[y,m]=s.useState(r);r==="replace"&&y==="toggle"&&typeof p=="object"&&p.size===0&&m("replace");let v=s.useRef(r);return s.useEffect(()=>{r!==v.current&&(m(r),v.current=r)},[r]),{selectionMode:e,disallowEmptySelection:n,selectionBehavior:y,setSelectionBehavior:m,get isFocused(){return i.current},setFocused(E){i.current=E,u(E)},get focusedKey(){return a.current},get childFocusStrategy(){return c.current},setFocusedKey(E,C="first"){a.current=E,c.current=C,f(E)},selectedKeys:p,setSelectedKeys(E){(l||!mm(E,p))&&h(E)},disabledKeys:$,disabledBehavior:o}}function xi(t,e){return t?t==="all"?"all":new Oe(t):e}const gm=s.createContext(null),ao=class ao extends Ge{filter(e,n,l){let r=e.getItem(this.firstChildKey);if(r&&l(r.textValue,this)){let o=this.clone();return n.addDescendants(o,e),o}return null}};ao.type="submenutrigger";let Ci=ao;function ym(t,e){let{role:n="dialog"}=t,l=on();l=t["aria-label"]?void 0:l;let r=s.useRef(!1);return s.useEffect(()=>{if(e.current&&!vt(e.current)){ve(e.current);let o=setTimeout(()=>{(oe()===e.current||oe()===document.body)&&(r.current=!0,e.current&&(e.current.blur(),ve(e.current)),r.current=!1)},500);return()=>{clearTimeout(o)}}},[e]),Ma(),s.useRef(!1),s.useEffect(()=>{}),{dialogProps:{...ie(t,{labelable:!0}),role:n,tabIndex:-1,"aria-labelledby":t["aria-labelledby"]||l,onBlur:o=>{r.current&&o.stopPropagation()}},titleProps:{id:l}}}const Ks=s.createContext(null),Et=s.createContext(null);function $m(t){let e=fm(t),n=s.useRef(null),{triggerProps:l,overlayProps:r}=ks({type:"dialog"},e,n);return l.id=$e(),r["aria-labelledby"]=l.id,g.createElement(_e,{values:[[Et,e],[gm,e],[Ks,r],[Fr,{trigger:"DialogTrigger",triggerRef:n,"aria-labelledby":r["aria-labelledby"]}]]},g.createElement(K4,{...l,ref:n,isPressed:e.isOpen},t.children))}const vm=s.forwardRef(function(e,n){let l=e["aria-labelledby"];[e,n]=xe(e,n,Ks);let{dialogProps:r,titleProps:o}=ym({...e,"aria-labelledby":l},n),i=s.useContext(Et);!r["aria-label"]&&!r["aria-labelledby"]&&e["aria-labelledby"]&&(r["aria-labelledby"]=e["aria-labelledby"]);let u=ce({defaultClassName:"react-aria-Dialog",className:e.className,style:e.style,children:e.children,values:{close:(i==null?void 0:i.close)||(()=>{})}}),a=ie(e,{global:!0});return g.createElement(le.section,{...G(a,u,r),render:e.render,ref:n,slot:e.slot||void 0},g.createElement(_e,{values:[[ju,{slots:{[mt]:{},title:{...o,level:2}}}],[yn,{slots:{[mt]:{},close:{onPress:()=>i==null?void 0:i.close()}}}]]},u.children))});function xm(t,e,n){let{overlayProps:l,underlayProps:r}=Zu({...t,isOpen:e.isOpen,onClose:e.close},n);return Yu({isDisabled:!e.isOpen}),Ma(),s.useEffect(()=>{if(e.isOpen&&n.current)return Rr([n.current],{shouldUseInert:!0})},[e.isOpen,n]),{modalProps:G(l),underlayProps:r}}const Cm=s.createContext(null),Wr=s.createContext(null),Em=s.forwardRef(function(e,n){if(s.useContext(Wr))return g.createElement(Ei,{...e,modalRef:n},e.children);let{isDismissable:r,isKeyboardDismissDisabled:o,isOpen:i,defaultOpen:u,onOpenChange:a,children:c,isEntering:f,isExiting:d,UNSTABLE_portalContainer:b,shouldCloseOnInteractOutside:p,...h}=e;return g.createElement(Rs,{isDismissable:r,isKeyboardDismissDisabled:o,isOpen:i,defaultOpen:u,onOpenChange:a,isEntering:f,isExiting:d,UNSTABLE_portalContainer:b,shouldCloseOnInteractOutside:p},g.createElement(Ei,{...h,modalRef:n},c))});function wm(t,e){[t,e]=xe(t,e,Cm);let n=s.useContext(Et),l=il(t),r=t.isOpen!=null||t.defaultOpen!=null||!n?l:n,o=ke(e),i=s.useRef(null),u=Ll(o,r.isOpen),a=Ll(i,r.isOpen),c=u||a||t.isExiting||!1,f=ct();return!r.isOpen&&!c||f?null:g.createElement(Sm,{...t,state:r,isExiting:c,overlayRef:o,modalRef:i})}const Rs=s.forwardRef(wm);function Sm({UNSTABLE_portalContainer:t,...e}){let n=e.modalRef,{state:l}=e,{modalProps:r,underlayProps:o}=xm(e,l,n),i=Cr(e.overlayRef)||e.isEntering||!1,u=ce({...e,defaultClassName:"react-aria-ModalOverlay",values:{isEntering:i,isExiting:e.isExiting,state:l}}),a=Up(),c,f;if(typeof document<"u"){let b=st(document.body)?document.body:document.scrollingElement||document.documentElement,p=b.getBoundingClientRect().width%1,h=b.getBoundingClientRect().height%1;c=b.scrollWidth-p,f=b.scrollHeight-h}let d={...u.style,"--visual-viewport-width":a.width+"px","--visual-viewport-height":a.height+"px","--page-width":c!==void 0?c+"px":void 0,"--page-height":f!==void 0?f+"px":void 0};return g.createElement(er,{isExiting:e.isExiting,portalContainer:t},g.createElement(le.div,{...G(ie(e,{global:!0}),o),...u,style:d,ref:e.overlayRef,"data-entering":i||void 0,"data-exiting":e.isExiting||void 0},g.createElement(_e,{values:[[Wr,{modalProps:r,modalRef:n,isExiting:e.isExiting,isDismissable:e.isDismissable}],[Et,l]]},u.children)))}function Ei(t){let{modalProps:e,modalRef:n,isExiting:l,isDismissable:r}=s.useContext(Wr),o=s.useContext(Et),i=s.useMemo(()=>ft(t.modalRef,n),[t.modalRef,n]),u=ke(i),a=Cr(u),c=ce({...t,defaultClassName:"react-aria-Modal",values:{isEntering:a,isExiting:l,state:o}});return g.createElement(le.div,{...G(ie(t,{global:!0}),e),...c,ref:u,"data-entering":a||void 0,"data-exiting":l||void 0},r&&g.createElement(Ql,{onDismiss:o.close}),c.children)}const Dm=g.forwardRef(({children:t,...e},n)=>{n=ke(n);let{pressProps:l}=lt({...e,ref:n}),{focusableProps:r}=jt(e,n),o=g.Children.only(t);s.useEffect(()=>{},[n,e.isDisabled]);let i=parseInt(g.version,10)<19?o.ref:o.props.ref;return g.cloneElement(o,{...G(l,r,o.props),ref:ft(i,n)})}),wi=({children:t,className:e,slot:n,style:l,variant:r,...o})=>{const i=s.useMemo(()=>nh({variant:r}),[r]);return M.jsx(Kr,{"aria-label":"Close",className:me(e,i),"data-slot":"close-button",slot:n,style:l,...o,children:u=>typeof t=="function"?t(u):t??M.jsx(qh,{"data-slot":"close-button-icon"})})},km=Object.assign(wi,{Root:wi}),ze=s.createContext({}),Si=({children:t,...e})=>{const n=s.useMemo(()=>({slots:Qn(),placement:void 0}),[]);return M.jsx(ze,{value:n,children:M.jsx($m,{"data-slot":"alert-dialog-root",...e,children:t})})},Pm=({children:t,className:e,...n})=>{const{slots:l}=s.useContext(ze);return M.jsx(Dm,{children:M.jsx("div",{className:de(l==null?void 0:l.trigger,e),"data-slot":"alert-dialog-trigger",role:"button",...n,children:t})})},Am=({children:t,className:e,isDismissable:n=!1,isKeyboardDismissDisabled:l=!0,onClick:r,variant:o,...i})=>{const{slots:u}=s.useContext(ze),a=s.useMemo(()=>Qn({variant:o}),[o]),c=s.useMemo(()=>({slots:{...u,...a}}),[u,a]);return M.jsx(Rs,{className:me(e,a==null?void 0:a.backdrop()),"data-slot":"alert-dialog-backdrop",isDismissable:n,isKeyboardDismissDisabled:l,onClick:f=>{f.stopPropagation(),r==null||r(f)},...i,children:f=>M.jsxs(ze,{value:c,children:[typeof t=="function"?t(f):t," "]})})},Tm=({children:t,className:e,placement:n="auto",size:l,...r})=>{const{slots:o}=s.useContext(ze),i=s.useMemo(()=>Qn({size:l}),[l]),u=s.useMemo(()=>({placement:n,slots:{...o,...i}}),[n,o,i]);return M.jsx(Em,{className:me(e,i==null?void 0:i.container()),"data-placement":n,"data-slot":"alert-dialog-container",...r,children:a=>M.jsx(ze,{value:u,children:typeof t=="function"?t(a):t})})},Bm=({children:t,className:e,...n})=>{const{placement:l,slots:r}=s.useContext(ze);return M.jsx(vm,{className:de(r==null?void 0:r.dialog,e),"data-placement":l,"data-slot":"alert-dialog-dialog",role:"alertdialog",...n,children:t})},Km=({children:t,className:e,...n})=>{const{slots:l}=s.useContext(ze);return M.jsx("div",{className:de(l==null?void 0:l.header,e),"data-slot":"alert-dialog-header",...n,children:t})},Rm=({children:t,className:e,...n})=>{const{slots:l}=s.useContext(ze);return M.jsx(Hh,{className:de(l==null?void 0:l.heading,e),"data-slot":"alert-dialog-heading",slot:"title",...n,children:t})},Mm=({children:t,className:e,...n})=>{const{slots:l}=s.useContext(ze);return M.jsx("div",{className:de(l==null?void 0:l.body,e),"data-slot":"alert-dialog-body",...n,children:t})},Im=({children:t,className:e,...n})=>{const{slots:l}=s.useContext(ze);return M.jsx("div",{className:de(l==null?void 0:l.footer,e),"data-slot":"alert-dialog-footer",...n,children:t})},Fm=({children:t,className:e,status:n="danger",...l})=>{const r=s.useMemo(()=>Qn({status:n}),[n]),o=()=>{switch(n){case"default":return M.jsx(Ho,{"data-slot":"alert-dialog-default-icon"});case"accent":return M.jsx(Ho,{"data-slot":"alert-dialog-default-icon"});case"success":return M.jsx(Yh,{"data-slot":"alert-dialog-default-icon"});case"warning":return M.jsx(Zh,{"data-slot":"alert-dialog-default-icon"});case"danger":return M.jsx(Wo,{"data-slot":"alert-dialog-default-icon"});default:return M.jsx(Wo,{"data-slot":"alert-dialog-default-icon"})}};return M.jsx(Se.div,{className:r==null?void 0:r.icon({className:e}),"data-slot":"alert-dialog-icon",...l,children:t??o()})},Lm=({className:t,...e})=>{const{slots:n}=s.useContext(ze);return M.jsx(km,{className:me(t,n==null?void 0:n.closeTrigger()),"data-slot":"alert-dialog-close-trigger",slot:"close",...e})},b0=Object.assign(Si,{Root:Si,Trigger:Pm,Backdrop:Am,Container:Tm,Dialog:Bm,Header:Km,Heading:Rm,Body:Mm,Footer:Im,Icon:Fm,CloseTrigger:Lm});function zm(t){let e=En({usage:"search",...t}),n=s.useCallback((o,i)=>i.length===0?!0:(o=o.normalize("NFC"),i=i.normalize("NFC"),e.compare(o.slice(0,i.length),i)===0),[e]),l=s.useCallback((o,i)=>i.length===0?!0:(o=o.normalize("NFC"),i=i.normalize("NFC"),e.compare(o.slice(-i.length),i)===0),[e]),r=s.useCallback((o,i)=>{if(i.length===0)return!0;o=o.normalize("NFC"),i=i.normalize("NFC");let u=0,a=i.length;for(;u+a<=o.length;u++){let c=o.slice(u,u+a);if(e.compare(i,c)===0)return!0}return!1},[e]);return s.useMemo(()=>({startsWith:n,endsWith:l,contains:r}),[n,l,r])}const Ur=s.createContext({}),Ms=s.createContext(null),Is={badInput:!1,customError:!1,patternMismatch:!1,rangeOverflow:!1,rangeUnderflow:!1,stepMismatch:!1,tooLong:!1,tooShort:!1,typeMismatch:!1,valueMissing:!1,valid:!0},Fs={...Is,customError:!0,valid:!1},qt={isInvalid:!1,validationDetails:Is,validationErrors:[]},Nm=s.createContext({}),Di="__reactAriaFormValidationState";function Om(t){if(t[Di]){let{realtimeValidation:e,displayValidation:n,updateValidation:l,resetValidation:r,commitValidation:o}=t[Di];return{realtimeValidation:e,displayValidation:n,updateValidation:l,resetValidation:r,commitValidation:o}}return Vm(t)}function Vm(t){let{isInvalid:e,validationState:n,name:l,value:r,builtinValidation:o,validate:i,validationBehavior:u="aria"}=t;n&&(e||(e=n==="invalid"));let a=e!==void 0?{isInvalid:e,validationErrors:[],validationDetails:Fs}:null,c=s.useMemo(()=>{if(!i||r==null)return null;let B=jm(i,r);return ki(B)},[i,r]);o!=null&&o.validationDetails.valid&&(o=void 0);let f=s.useContext(Nm),d=s.useMemo(()=>l?Array.isArray(l)?l.flatMap(B=>ur(f[B])):ur(f[l]):[],[f,l]),[b,p]=s.useState(f),[h,$]=s.useState(!1);f!==b&&(p(f),$(!1));let y=s.useMemo(()=>ki(h?[]:d),[h,d]),m=s.useRef(qt),[v,E]=s.useState(qt),C=s.useRef(qt),R=()=>{if(!A)return;K(!1);let B=c||o||m.current;Rl(B,C.current)||(C.current=B,E(B))},[A,K]=s.useState(!1);return s.useEffect(R),{realtimeValidation:a||y||c||o||qt,displayValidation:u==="native"?a||y||v:a||y||c||o||v,updateValidation(B){u==="aria"&&!Rl(v,B)?E(B):m.current=B},resetValidation(){let B=qt;Rl(B,C.current)||(C.current=B,E(B)),u==="native"&&K(!1),$(!0)},commitValidation(){u==="native"&&K(!0),$(!0)}}}function ur(t){return t?Array.isArray(t)?t:[t]:[]}function jm(t,e){if(typeof t=="function"){let n=t(e);if(n&&typeof n!="boolean")return ur(n)}return[]}function ki(t){return t.length?{isInvalid:!0,validationErrors:t,validationDetails:Fs}:null}function Rl(t,e){return t===e?!0:!!t&&!!e&&t.isInvalid===e.isInvalid&&t.validationErrors.length===e.validationErrors.length&&t.validationErrors.every((n,l)=>n===e.validationErrors[l])&&Object.entries(t.validationDetails).every(([n,l])=>e.validationDetails[n]===l)}const Gr=s.createContext(null);var Ls={};Ls={colorSwatchPicker:"تغييرات الألوان",dropzoneLabel:"DropZone",selectPlaceholder:"حدد عنصرًا",tableResizer:"أداة تغيير الحجم"};var zs={};zs={colorSwatchPicker:"Цветови мостри",dropzoneLabel:"DropZone",selectPlaceholder:"Изберете предмет",tableResizer:"Преоразмерител"};var Ns={};Ns={colorSwatchPicker:"Vzorky barev",dropzoneLabel:"Místo pro přetažení",selectPlaceholder:"Vyberte položku",tableResizer:"Změna velikosti"};var Os={};Os={colorSwatchPicker:"Farveprøver",dropzoneLabel:"DropZone",selectPlaceholder:"Vælg et element",tableResizer:"Størrelsesændring"};var Vs={};Vs={colorSwatchPicker:"Farbfelder",dropzoneLabel:"Ablegebereich",selectPlaceholder:"Element wählen",tableResizer:"Größenanpassung"};var js={};js={colorSwatchPicker:"Χρωματικά δείγματα",dropzoneLabel:"DropZone",selectPlaceholder:"Επιλέξτε ένα αντικείμενο",tableResizer:"Αλλαγή μεγέθους"};var _s={};_s={selectPlaceholder:"Select an item",tableResizer:"Resizer",dropzoneLabel:"DropZone",colorSwatchPicker:"Color swatches"};var Hs={};Hs={colorSwatchPicker:"Muestras de colores",dropzoneLabel:"DropZone",selectPlaceholder:"Seleccionar un artículo",tableResizer:"Cambiador de tamaño"};var Ws={};Ws={colorSwatchPicker:"Värvinäidised",dropzoneLabel:"DropZone",selectPlaceholder:"Valige üksus",tableResizer:"Suuruse muutja"};var Us={};Us={colorSwatchPicker:"Värimallit",dropzoneLabel:"DropZone",selectPlaceholder:"Valitse kohde",tableResizer:"Koon muuttaja"};var Gs={};Gs={colorSwatchPicker:"Échantillons de couleurs",dropzoneLabel:"DropZone",selectPlaceholder:"Sélectionner un élément",tableResizer:"Redimensionneur"};var qs={};qs={colorSwatchPicker:"דוגמיות צבע",dropzoneLabel:"DropZone",selectPlaceholder:"בחר פריט",tableResizer:"שינוי גודל"};var Zs={};Zs={colorSwatchPicker:"Uzorci boja",dropzoneLabel:"Zona spuštanja",selectPlaceholder:"Odaberite stavku",tableResizer:"Promjena veličine"};var Ys={};Ys={colorSwatchPicker:"Színtárak",dropzoneLabel:"DropZone",selectPlaceholder:"Válasszon ki egy elemet",tableResizer:"Átméretező"};var Xs={};Xs={colorSwatchPicker:"Campioni di colore",dropzoneLabel:"Zona di rilascio",selectPlaceholder:"Seleziona un elemento",tableResizer:"Ridimensionamento"};var Js={};Js={colorSwatchPicker:"カラースウォッチ",dropzoneLabel:"ドロップゾーン",selectPlaceholder:"項目を選択",tableResizer:"サイズ変更ツール"};var Qs={};Qs={colorSwatchPicker:"색상 견본",dropzoneLabel:"드롭 영역",selectPlaceholder:"항목 선택",tableResizer:"크기 조정기"};var ec={};ec={colorSwatchPicker:"Spalvų pavyzdžiai",dropzoneLabel:"„DropZone“",selectPlaceholder:"Pasirinkite elementą",tableResizer:"Dydžio keitiklis"};var tc={};tc={colorSwatchPicker:"Krāsu paraugi",dropzoneLabel:"DropZone",selectPlaceholder:"Izvēlēties vienumu",tableResizer:"Izmēra mainītājs"};var nc={};nc={colorSwatchPicker:"Fargekart",dropzoneLabel:"Droppsone",selectPlaceholder:"Velg et element",tableResizer:"Størrelsesendrer"};var lc={};lc={colorSwatchPicker:"kleurstalen",dropzoneLabel:"DropZone",selectPlaceholder:"Selecteer een item",tableResizer:"Resizer"};var rc={};rc={colorSwatchPicker:"Próbki kolorów",dropzoneLabel:"Strefa upuszczania",selectPlaceholder:"Wybierz element",tableResizer:"Zmiana rozmiaru"};var oc={};oc={colorSwatchPicker:"Amostras de cores",dropzoneLabel:"DropZone",selectPlaceholder:"Selecione um item",tableResizer:"Redimensionador"};var ic={};ic={colorSwatchPicker:"Amostras de cores",dropzoneLabel:"DropZone",selectPlaceholder:"Selecione um item",tableResizer:"Redimensionador"};var uc={};uc={colorSwatchPicker:"Specimene de culoare",dropzoneLabel:"Zonă de plasare",selectPlaceholder:"Selectați un element",tableResizer:"Instrument de redimensionare"};var ac={};ac={colorSwatchPicker:"Цветовые образцы",dropzoneLabel:"DropZone",selectPlaceholder:"Выберите элемент",tableResizer:"Средство изменения размера"};var sc={};sc={colorSwatchPicker:"Vzorkovníky farieb",dropzoneLabel:"DropZone",selectPlaceholder:"Vyberte položku",tableResizer:"Nástroj na zmenu veľkosti"};var cc={};cc={colorSwatchPicker:"Barvne palete",dropzoneLabel:"DropZone",selectPlaceholder:"Izberite element",tableResizer:"Spreminjanje velikosti"};var dc={};dc={colorSwatchPicker:"Uzorci boje",dropzoneLabel:"DropZone",selectPlaceholder:"Izaberite stavku",tableResizer:"Promena veličine"};var fc={};fc={colorSwatchPicker:"Färgrutor",dropzoneLabel:"DropZone",selectPlaceholder:"Välj en artikel",tableResizer:"Storleksändrare"};var pc={};pc={colorSwatchPicker:"Renk örnekleri",dropzoneLabel:"Bırakma Bölgesi",selectPlaceholder:"Bir öğe seçin",tableResizer:"Yeniden boyutlandırıcı"};var bc={};bc={colorSwatchPicker:"Зразки кольорів",dropzoneLabel:"DropZone",selectPlaceholder:"Виберіть елемент",tableResizer:"Засіб змінення розміру"};var hc={};hc={colorSwatchPicker:"颜色色板",dropzoneLabel:"放置区域",selectPlaceholder:"选择一个项目",tableResizer:"尺寸调整器"};var mc={};mc={colorSwatchPicker:"色票",dropzoneLabel:"放置區",selectPlaceholder:"選取項目",tableResizer:"大小調整器"};var gc={};gc={"ar-AE":Ls,"bg-BG":zs,"cs-CZ":Ns,"da-DK":Os,"de-DE":Vs,"el-GR":js,"en-US":_s,"es-ES":Hs,"et-EE":Ws,"fi-FI":Us,"fr-FR":Gs,"he-IL":qs,"hr-HR":Zs,"hu-HU":Ys,"it-IT":Xs,"ja-JP":Js,"ko-KR":Qs,"lt-LT":ec,"lv-LV":tc,"nb-NO":nc,"nl-NL":lc,"pl-PL":rc,"pt-BR":oc,"pt-PT":ic,"ro-RO":uc,"ru-RU":ac,"sk-SK":sc,"sl-SI":cc,"sr-SP":dc,"sv-SE":fc,"tr-TR":pc,"uk-UA":bc,"zh-CN":hc,"zh-TW":mc};const qe=s.createContext({}),qr=s.createContext(null),_m=s.forwardRef(function(e,n){let{render:l}=s.useContext(qr);return g.createElement(g.Fragment,null,l(e,n))});function Zr(t,e){var o;let n=t==null?void 0:t.renderDropIndicator,l=(o=t==null?void 0:t.isVirtualDragging)==null?void 0:o.call(t),r=s.useCallback(i=>{if(l||e!=null&&e.isDropTarget(i))return n?n(i):g.createElement(_m,{target:i})},[e==null?void 0:e.target,l,n]);return t!=null&&t.useDropIndicator?r:void 0}function yc(t,e,n){var o,i,u;let l=t.focusedKey,r=null;if((o=e==null?void 0:e.isVirtualDragging)!=null&&o.call(e)&&((i=n==null?void 0:n.target)==null?void 0:i.type)==="item"&&(r=n.target.key,n.target.dropPosition==="after")){let a=n.collection.getKeyAfter(r),c=null;if(a!=null){let f=((u=n.collection.getItem(r))==null?void 0:u.level)??0;for(;a!=null;){let d=n.collection.getItem(a);if(!d)break;if(d.type!=="item"){a=n.collection.getKeyAfter(a);continue}if((d.level??0)<=f)break;c=a,a=n.collection.getKeyAfter(a)}}r=a??c??r}return s.useMemo(()=>new Set([l,r].filter(a=>a!=null)),[l,r])}const dl=new WeakMap;function Hm(t){return typeof t=="string"?t.replace(/\s*/g,""):""+t}function $c(t,e){let n=dl.get(t);if(!n)throw new Error("Unknown list");return`${n.id}-option-${Hm(e)}`}function Wm(t,e,n){let l=ie(t,{labelable:!0}),r=t.selectionBehavior||"toggle",o=t.orientation||"vertical",i=t.linkBehavior||(r==="replace"?"action":"override");r==="toggle"&&i==="action"&&(i="override");let{listProps:u}=dm({...t,ref:n,selectionManager:e.selectionManager,collection:e.collection,disabledKeys:e.disabledKeys,linkBehavior:i}),{focusWithinProps:a}=ll({onFocusWithin:t.onFocus,onBlurWithin:t.onBlur,onFocusWithinChange:t.onFocusChange}),c=$e(t.id);dl.set(e,{id:c,shouldUseVirtualFocus:t.shouldUseVirtualFocus,shouldSelectOnPressUp:t.shouldSelectOnPressUp,shouldFocusOnHover:t.shouldFocusOnHover,isVirtualized:t.isVirtualized,onAction:t.onAction,linkBehavior:i,UNSTABLE_itemBehavior:t.UNSTABLE_itemBehavior});let{labelProps:f,fieldProps:d}=Au({...t,id:c,labelElementType:"span"});return{labelProps:f,listBoxProps:G(l,a,e.selectionManager.selectionMode==="multiple"?{"aria-multiselectable":"true"}:{},{role:"listbox","aria-orientation":o,...G(d,u)})}}function Um(t,e,n){var z,B;let{key:l}=t,r=dl.get(e),o=t.isDisabled??e.selectionManager.isDisabled(l),i=t.isSelected??e.selectionManager.isSelected(l),u=t.shouldSelectOnPressUp??(r==null?void 0:r.shouldSelectOnPressUp),a=t.shouldFocusOnHover??(r==null?void 0:r.shouldFocusOnHover),c=t.shouldUseVirtualFocus??(r==null?void 0:r.shouldUseVirtualFocus),f=t.isVirtualized??(r==null?void 0:r.isVirtualized),d=on(),b=on(),p={role:"option","aria-disabled":o||void 0,"aria-selected":e.selectionManager.selectionMode!=="none"?i:void 0,"aria-label":t["aria-label"],"aria-labelledby":d,"aria-describedby":b},h=e.collection.getItem(l);if(f){let N=Number(h==null?void 0:h.index);p["aria-posinset"]=Number.isNaN(N)?void 0:N+1,p["aria-setsize"]=As(e.collection)}let $=r!=null&&r.onAction?()=>{var N;return(N=r==null?void 0:r.onAction)==null?void 0:N.call(r,l)}:void 0,y=$c(e,l),{itemProps:m,isPressed:v,isFocused:E,hasAction:C,allowsSelection:R}=jr({selectionManager:e.selectionManager,key:l,ref:n,shouldSelectOnPressUp:u,allowsDifferentPressOrigin:u&&a,isVirtualized:f,shouldUseVirtualFocus:c,isDisabled:o,onAction:$||(z=h==null?void 0:h.props)!=null&&z.onAction?dt((B=h==null?void 0:h.props)==null?void 0:B.onAction,$):void 0,linkBehavior:r==null?void 0:r.linkBehavior,UNSTABLE_itemBehavior:r==null?void 0:r.UNSTABLE_itemBehavior,id:y}),{hoverProps:A}=He({isDisabled:o||!a,onHoverStart(){Ft()||(e.selectionManager.setFocused(!0),e.selectionManager.setFocusedKey(l))}}),K=ie(h==null?void 0:h.props);delete K.id;let P=eu(h==null?void 0:h.props);return{optionProps:{...p,...G(K,m,A,P),id:y},labelProps:{id:d},descriptionProps:{id:b},isFocused:E,isFocusVisible:E&&e.selectionManager.isFocused&&Ft(),isSelected:i,isDisabled:o,isPressed:v,allowsSelection:R,hasAction:C}}function Gm(t){let{heading:e,"aria-label":n}=t,l=$e();return{itemProps:{role:"presentation"},headingProps:e?{id:l,role:"presentation",onMouseDown:r=>{r.preventDefault()}}:{},groupProps:{role:"group","aria-label":n,"aria-labelledby":e?l:void 0}}}class ar{constructor(e){this.keyMap=new Map,this.firstKey=null,this.lastKey=null,this.iterable=e;let n=i=>{if(this.keyMap.set(i.key,i),i.childNodes&&i.type==="section")for(let u of i.childNodes)n(u)};for(let i of e)n(i);let l=null,r=0,o=0;for(let[i,u]of this.keyMap)l?(l.nextKey=i,u.prevKey=l.key):(this.firstKey=i,u.prevKey=void 0),u.type==="item"&&(u.index=r++),(u.type==="section"||u.type==="item")&&o++,l=u,l.nextKey=void 0;this._size=o,this.lastKey=(l==null?void 0:l.key)??null}*[Symbol.iterator](){yield*this.iterable}get size(){return this._size}getKeys(){return this.keyMap.keys()}getKeyBefore(e){let n=this.keyMap.get(e);return n?n.prevKey??null:null}getKeyAfter(e){let n=this.keyMap.get(e);return n?n.nextKey??null:null}getFirstKey(){return this.firstKey}getLastKey(){return this.lastKey}getItem(e){return this.keyMap.get(e)??null}at(e){const n=[...this.getKeys()];return this.getItem(n[e])}getChildren(e){let n=this.keyMap.get(e);return(n==null?void 0:n.childNodes)||[]}}function vc(t){let{filter:e,layoutDelegate:n}=t,l=Hr(t),r=s.useMemo(()=>t.disabledKeys?new Set(t.disabledKeys):new Set,[t.disabledKeys]),o=s.useCallback(c=>e?new ar(e(c)):new ar(c),[e]),i=s.useMemo(()=>({suppressTextValueWarning:t.suppressTextValueWarning}),[t.suppressTextValueWarning]),u=Bs(t,o,i),a=s.useMemo(()=>new cl(u,l,{layoutDelegate:n}),[u,l,n]);return xc(u,a),{collection:u,disabledKeys:r,selectionManager:a}}function qm(t,e){let n=s.useMemo(()=>e?t.collection.filter(e):t.collection,[t.collection,e]),l=t.selectionManager.withCollection(n);return xc(n,l),{collection:n,selectionManager:l,disabledKeys:t.disabledKeys}}function xc(t,e){const n=s.useRef(null);s.useEffect(()=>{if(e.focusedKey!=null&&!t.getItem(e.focusedKey)&&n.current){let l=n.current.getKeyAfter(e.focusedKey),r=null;for(;l!=null;){let o=t.getItem(l);if(o&&o.type==="item"&&!e.isDisabled(l)){r=l;break}l=n.current.getKeyAfter(l)}if(r==null)for(l=n.current.getKeyBefore(e.focusedKey);l!=null;){let o=t.getItem(l);if(o&&o.type==="item"&&!e.isDisabled(l)){r=l;break}l=n.current.getKeyBefore(l)}e.setFocusedKey(r)}n.current=t},[t,e])}const fl=s.createContext(null),_t=s.createContext(null),Zm=s.forwardRef(function(e,n){[e,n]=xe(e,n,fl);let l=s.useContext(_t);return l?g.createElement(Cc,{state:l,props:e,listBoxRef:n}):g.createElement(zr,{content:g.createElement(xn,e)},r=>g.createElement(Ym,{props:e,listBoxRef:n,collection:r}))});function Ym({props:t,listBoxRef:e,collection:n}){t={...t,collection:n,children:null,items:null};let{layoutDelegate:l}=s.useContext(fe),r=vc({...t,layoutDelegate:l});return g.createElement(Cc,{state:r,props:t,listBoxRef:e})}function Cc({state:t,props:e,listBoxRef:n}){[e,n]=xe(e,n,rr);let{dragAndDropHooks:l,layout:r="stack",orientation:o="vertical",filter:i}=e,u=qm(t,i),{collection:a,selectionManager:c}=u,f=!!(l!=null&&l.useDraggableCollectionState),d=!!(l!=null&&l.useDroppableCollectionState),{direction:b}=Re(),{disabledBehavior:p,disabledKeys:h}=c,$=En({usage:"search",sensitivity:"base"}),{isVirtualized:y,layoutDelegate:m,dropTargetDelegate:v,CollectionRoot:E}=s.useContext(fe),C=s.useMemo(()=>e.keyboardDelegate||new sl({collection:a,collator:$,ref:n,disabledKeys:h,disabledBehavior:p,layout:r,orientation:o,direction:b,layoutDelegate:m}),[a,$,n,p,h,o,b,e.keyboardDelegate,r,m]),{listBoxProps:R}=Wm({...e,shouldSelectOnPressUp:f||e.shouldSelectOnPressUp,keyboardDelegate:C,isVirtualized:y},u,n);s.useRef(f),s.useRef(d),s.useEffect(()=>{},[f,d]);let A,K,P,z=!1,B=null,N=s.useRef(null);if(f&&l){A=l.useDraggableCollectionState({collection:a,selectionManager:c,preview:l.renderDragPreview?N:void 0}),l.useDraggableCollection({},A,n);let T=l.DragPreview;B=l.renderDragPreview?g.createElement(T,{ref:N},l.renderDragPreview):null}if(d&&l){K=l.useDroppableCollectionState({collection:a,selectionManager:c});let T=l.dropTargetDelegate||v||new l.ListDropTargetDelegate(a,n,{orientation:o,layout:r,direction:b});P=l.useDroppableCollection({keyboardDelegate:C,dropTargetDelegate:T},K,n),z=K.isDropTarget({type:"root"})}let{focusProps:U,isFocused:_,isFocusVisible:x}=je(),S=u.collection.size===0,I={isDropTarget:z,isEmpty:S,isFocused:_,isFocusVisible:x,layout:e.layout||"stack",orientation:o,state:u},w=ce({...e,children:void 0,defaultClassName:"react-aria-ListBox",values:I}),k=null;S&&e.renderEmptyState&&(k=g.createElement("div",{role:"option",style:{display:"contents"}},e.renderEmptyState(I)));let D=ie(e,{global:!0});return g.createElement(Mr,null,g.createElement(le.div,{...G(D,w,R,U,P==null?void 0:P.collectionProps),ref:n,slot:e.slot||void 0,onScroll:e.onScroll,"data-drop-target":z||void 0,"data-empty":S||void 0,"data-focused":_||void 0,"data-focus-visible":x||void 0,"data-layout":e.layout||"stack","data-orientation":o},g.createElement(_e,{values:[[fl,e],[_t,u],[qe,{dragAndDropHooks:l,dragState:A,dropState:K}],[tm,{elementType:"div"}],[qr,{render:Qm}],[Z4,{name:"ListBoxSection",render:Ec}]]},g.createElement(_a,null,g.createElement(E,{collection:a,scrollRef:n,persistedKeys:yc(c,l,K),renderDropIndicator:Zr(l,K)}))),k,B))}function Ec(t,e,n,l="react-aria-ListBoxSection"){let r=s.useContext(_t),{dragAndDropHooks:o,dropState:i}=s.useContext(qe),{CollectionBranch:u}=s.useContext(fe),[a,c]=Dr(),{headingProps:f,groupProps:d}=Gm({heading:c,"aria-label":t["aria-label"]??void 0}),b=ce({...t,id:void 0,children:void 0,defaultClassName:l,values:void 0}),p=ie(t,{global:!0});return delete p.id,g.createElement(le.section,{...G(p,b,d),ref:e},g.createElement(Q4.Provider,{value:{...f,ref:a}},g.createElement(u,{collection:r.collection,parent:n,renderDropIndicator:Zr(o,i)})))}const Xm=al(nr,Ec),Jm=vn(tr,function(e,n,l){let r=ke(n),o=s.useContext(_t),{dragAndDropHooks:i,dragState:u,dropState:a}=s.useContext(qe),c=u&&!(u.isDisabled||u.selectionManager.isDisabled(l.key)),{optionProps:f,labelProps:d,descriptionProps:b,...p}=Um({key:l.key,"aria-label":e==null?void 0:e["aria-label"]},o,r),{hoverProps:h,isHovered:$}=He({isDisabled:!p.allowsSelection&&!p.hasAction&&!c,onHoverStart:l.props.onHoverStart,onHoverChange:l.props.onHoverChange,onHoverEnd:l.props.onHoverEnd}),{keyboardProps:y}=Tr(e),{focusProps:m}=Ar(e),v=null;u&&i&&(v=i.useDraggableItem({key:l.key,hasAction:p.hasAction},u));let E=null;a&&i&&(E=i.useDroppableItem({target:{type:"item",key:l.key,dropPosition:"on"}},a,r));let C=u&&u.isDragging(l.key),R=ce({...e,id:void 0,children:e.children,defaultClassName:"react-aria-ListBoxItem",values:{...p,isHovered:$,selectionMode:o.selectionManager.selectionMode,selectionBehavior:o.selectionManager.selectionBehavior,allowsDragging:!!u,isDragging:C,isDropTarget:E==null?void 0:E.isDropTarget}});s.useEffect(()=>{l.textValue},[l.textValue]);let A=e.href?le.a:le.div,K=ie(e,{global:!0});return delete K.id,delete K.onClick,e.href&&f.tabIndex==null&&(f.tabIndex=-1),g.createElement(A,{...G(K,R,f,h,y,m,v==null?void 0:v.dragProps,E==null?void 0:E.dropProps),ref:r,"data-allows-dragging":!!u||void 0,"data-selected":p.isSelected||void 0,"data-disabled":p.isDisabled||void 0,"data-hovered":$||void 0,"data-focused":p.isFocused||void 0,"data-focus-visible":p.isFocusVisible||void 0,"data-pressed":p.isPressed||void 0,"data-dragging":C||void 0,"data-drop-target":(E==null?void 0:E.isDropTarget)||void 0,"data-selection-mode":o.selectionManager.selectionMode==="none"?void 0:o.selectionManager.selectionMode},g.createElement(_e,{values:[[Cn,{slots:{[mt]:d,label:d,description:b}}],[Ha,{isSelected:p.isSelected}]]},R.children))});function Qm(t,e){e=ke(e);let{dragAndDropHooks:n,dropState:l}=s.useContext(qe),{dropIndicatorProps:r,isHidden:o,isDropTarget:i}=n.useDropIndicator(t,l,e);return o?null:g.createElement(t3,{...t,dropIndicatorProps:r,isDropTarget:i,ref:e})}function e3(t,e){let{dropIndicatorProps:n,isDropTarget:l,...r}=t,o=ce({...r,defaultClassName:"react-aria-DropIndicator",values:{isDropTarget:l}});return g.createElement(g.Fragment,null,g.createElement(le.div,{...n,...o,role:"option",ref:e,"data-drop-target":l||void 0}))}const t3=s.forwardRef(e3);vn(qn,function(e,n,l){let r=s.useContext(_t),{isLoading:o,onLoadMore:i,scrollOffset:u,...a}=e,c=s.useRef(null),f=s.useMemo(()=>({onLoadMore:i,collection:r==null?void 0:r.collection,sentinelRef:c,scrollOffset:u}),[i,u,r==null?void 0:r.collection]);uu(f,c);let d=ce({...a,id:void 0,children:l.rendered,defaultClassName:"react-aria-ListBoxLoadingIndicator",values:void 0}),b={tabIndex:-1};return g.createElement(g.Fragment,null,g.createElement("div",{style:{position:"relative",width:0,height:0},inert:au(!0)},g.createElement("div",{"data-testid":"loadMoreSentinel",ref:c,style:{position:"absolute",height:1,width:1}})),o&&d.children&&g.createElement(g.Fragment,null,g.createElement(le.div,{...G(ie(e,{global:!0}),b),...d,role:"option",ref:n},d.children)))});function n3(t){let{description:e,errorMessage:n,isInvalid:l,validationState:r}=t,{labelProps:o,fieldProps:i}=Au(t),u=on([!!e,!!n,l,r]),a=on([!!e,!!n,l,r]);return i=G(i,{"aria-describedby":[u,a,t["aria-describedby"]].filter(Boolean).join(" ")||void 0}),{labelProps:o,fieldProps:i,descriptionProps:{id:u},errorMessageProps:{id:a}}}function wc(t,e,n){let{validationBehavior:l,focus:r}=t;ne(()=>{if(l==="native"&&(n!=null&&n.current)&&!n.current.disabled){let c=e.realtimeValidation.isInvalid?e.realtimeValidation.validationErrors.join(" ")||"Invalid value.":"";n.current.setCustomValidity(c),n.current.hasAttribute("title")||(n.current.title=""),e.realtimeValidation.isInvalid||e.updateValidation(r3(n.current))}});let o=s.useRef(!1),i=Ee(()=>{o.current||e.resetValidation()}),u=Ee(c=>{var d,b;e.displayValidation.isInvalid||e.commitValidation();let f=(d=n==null?void 0:n.current)==null?void 0:d.form;!c.defaultPrevented&&n&&f&&o3(f)===n.current&&(r?r():(b=n.current)==null||b.focus(),Th("keyboard")),c.preventDefault()}),a=Ee(()=>{e.commitValidation()});s.useEffect(()=>{let c=n==null?void 0:n.current;if(!c)return;let f=c.form,d=f==null?void 0:f.reset;return f&&(f.reset=()=>{o.current=!window.event||window.event.type==="message"&&j(window.event)instanceof MessagePort,d==null||d.call(f),o.current=!1}),c.addEventListener("invalid",u),c.addEventListener("change",a),f==null||f.addEventListener("reset",i),()=>{c.removeEventListener("invalid",u),c.removeEventListener("change",a),f==null||f.removeEventListener("reset",i),f&&(f.reset=d)}},[n,l])}function l3(t){let e=t.validity;return{badInput:e.badInput,customError:e.customError,patternMismatch:e.patternMismatch,rangeOverflow:e.rangeOverflow,rangeUnderflow:e.rangeUnderflow,stepMismatch:e.stepMismatch,tooLong:e.tooLong,tooShort:e.tooShort,typeMismatch:e.typeMismatch,valueMissing:e.valueMissing,valid:e.valid}}function r3(t){return{isInvalid:!t.validity.valid,validationDetails:l3(t),validationErrors:t.validationMessage?[t.validationMessage]:[]}}function o3(t){var e;for(let n=0;n{var v;(v=d.onClick)==null||v.call(d,m),vp(m,$,t.href,t.routerOptions)}})}}const u3=s.createContext(null),a3=s.forwardRef(function(e,n){[e,n]=xe(e,n,u3);let l=e.href&&!e.isDisabled?"a":"span",{linkProps:r,isPressed:o}=i3({...e,elementType:l},n),i=le[l],{hoverProps:u,isHovered:a}=He(e),{focusProps:c,isFocused:f,isFocusVisible:d}=je(),b=ce({...e,defaultClassName:"react-aria-Link",values:{isCurrent:!!e["aria-current"],isDisabled:e.isDisabled||!1,isPressed:o,isHovered:a,isFocused:f,isFocusVisible:d}}),p=ie(e,{global:!0});return delete p.onClick,g.createElement(i,{ref:n,slot:e.slot||void 0,...G(p,b,r,u,c),"data-focused":f||void 0,"data-hovered":a||void 0,"data-pressed":o||void 0,"data-focus-visible":d||void 0,"data-current":!!e["aria-current"]||void 0,"data-disabled":e.isDisabled||void 0},b.children)}),Sc=s.createContext({}),Pi=({children:t,className:e,...n})=>{const l=g.useMemo(()=>uh(),[]);return M.jsx(Sc,{value:{slots:l},children:M.jsx(a3,{...n,className:me(e,l==null?void 0:l.base()),children:r=>M.jsx(M.Fragment,{children:typeof t=="function"?t(r):t})})})},s3=({children:t,className:e,...n})=>{const{slots:l}=s.useContext(Sc);return M.jsx(Se.span,{className:de(l==null?void 0:l.icon,e),"data-default-icon":_u(!t),"data-slot":"link-icon",...n,children:t??M.jsx(Gh,{"data-slot":"link-default-icon"})})},h0=Object.assign(Pi,{Root:Pi,Icon:s3});function c3(t={}){let{isReadOnly:e}=t,[n,l]=Ct(t.isSelected,t.defaultSelected||!1,t.onChange),[r]=s.useState(n);function o(u){e||l(u)}function i(){e||l(!n)}return{isSelected:n,defaultSelected:t.defaultSelected??r,setSelected:o,toggle:i}}const d3=s.createContext({}),f3="__button_group_child",Ai=({children:t,className:e,fullWidth:n,isDisabled:l,isIconOnly:r,size:o,slot:i,style:u,variant:a,[f3]:c,...f})=>{const d=s.useContext(d3),b=c===!0,p=o??(b?d==null?void 0:d.size:void 0),h=a??(b?d==null?void 0:d.variant:void 0),$=l??(b?d==null?void 0:d.isDisabled:void 0),y=n??(b?d==null?void 0:d.fullWidth:void 0),m=Qb({fullWidth:y,isIconOnly:r,size:p,variant:h});return M.jsx(Kr,{className:me(e,m),"data-slot":"button",isDisabled:$,slot:i,style:u,...f,children:v=>typeof t=="function"?t(v):t})},m0=Object.assign(Ai,{Root:Ai}),Ht=s.createContext({}),Ti=({children:t,className:e,variant:n="default",...l})=>{const r=g.useMemo(()=>eh({variant:n}),[n]),o=M.jsx(Se.div,{className:r.base({className:e}),"data-slot":"card",...l,children:t});return M.jsx(Ht,{value:{slots:r},children:n==="transparent"?o:M.jsx(Hu,{value:{variant:n},children:o})})},p3=({className:t,...e})=>{const{slots:n}=s.useContext(Ht);return M.jsx(Se.div,{className:de(n==null?void 0:n.header,t),"data-slot":"card-header",...e})},b3=({children:t,className:e,...n})=>{const{slots:l}=s.useContext(Ht);return M.jsx(Se.h3,{className:de(l==null?void 0:l.title,e),"data-slot":"card-title",...n,children:t})},h3=({children:t,className:e,...n})=>{const{slots:l}=s.useContext(Ht);return M.jsx(Se.p,{className:de(l==null?void 0:l.description,e),"data-slot":"card-description",...n,children:t})},m3=({className:t,...e})=>{const{slots:n}=s.useContext(Ht);return M.jsx(Se.div,{className:de(n==null?void 0:n.content,t),"data-slot":"card-content",...e})},g3=({className:t,...e})=>{const{slots:n}=s.useContext(Ht);return M.jsx(Se.div,{className:de(n==null?void 0:n.footer,t),"data-slot":"card-footer",...e})},g0=Object.assign(Ti,{Root:Ti,Header:p3,Title:b3,Description:h3,Content:m3,Footer:g3}),y3=new WeakMap;function $3(t=!0){let[e,n]=s.useState(t),l=s.useRef(!1),r=s.useCallback(o=>{l.current=!0,n(!!o)},[]);return ne(()=>{l.current||n(!1)},[]),[r,e]}function Bi(t=!0){let e=$e(),[n,l]=$3(t);return{id:l?e:void 0,ref:n}}const Dc={badInput:!1,customError:!1,patternMismatch:!1,rangeOverflow:!1,rangeUnderflow:!1,stepMismatch:!1,tooLong:!1,tooShort:!1,typeMismatch:!1,valueMissing:!1,valid:!0},kc={...Dc,customError:!0,valid:!1},At={isInvalid:!1,validationDetails:Dc,validationErrors:[]},v3=s.createContext({}),bn="__reactAriaFormValidationState";function Yr(t){if(t[bn]){let{realtimeValidation:e,displayValidation:n,updateValidation:l,resetValidation:r,commitValidation:o}=t[bn];return{realtimeValidation:e,displayValidation:n,updateValidation:l,resetValidation:r,commitValidation:o}}return x3(t)}function x3(t){let{isInvalid:e,validationState:n,name:l,value:r,builtinValidation:o,validate:i,validationBehavior:u="aria"}=t;n&&(e||(e=n==="invalid"));let a=e!==void 0?{isInvalid:e,validationErrors:[],validationDetails:kc}:null,c=s.useMemo(()=>{if(!i||r==null)return null;let B=C3(i,r);return Ki(B)},[i,r]);o!=null&&o.validationDetails.valid&&(o=void 0);let f=s.useContext(v3),d=s.useMemo(()=>l?Array.isArray(l)?l.flatMap(B=>sr(f[B])):sr(f[l]):[],[f,l]),[b,p]=s.useState(f),[h,$]=s.useState(!1);f!==b&&(p(f),$(!1));let y=s.useMemo(()=>Ki(h?[]:d),[h,d]),m=s.useRef(At),[v,E]=s.useState(At),C=s.useRef(At),R=()=>{if(!A)return;K(!1);let B=c||o||m.current;Ml(B,C.current)||(C.current=B,E(B))},[A,K]=s.useState(!1);return s.useEffect(R),{realtimeValidation:a||y||c||o||At,displayValidation:u==="native"?a||y||v:a||y||c||o||v,updateValidation(B){u==="aria"&&!Ml(v,B)?E(B):m.current=B},resetValidation(){let B=At;Ml(B,C.current)||(C.current=B,E(B)),u==="native"&&K(!1),$(!0)},commitValidation(){u==="native"&&K(!0),$(!0)}}}function sr(t){return t?Array.isArray(t)?t:[t]:[]}function C3(t,e){if(typeof t=="function"){let n=t(e);if(n&&typeof n!="boolean")return sr(n)}return[]}function Ki(t){return t.length?{isInvalid:!0,validationErrors:t,validationDetails:kc}:null}function Ml(t,e){return t===e?!0:!!t&&!!e&&t.isInvalid===e.isInvalid&&t.validationErrors.length===e.validationErrors.length&&t.validationErrors.every((n,l)=>n===e.validationErrors[l])&&Object.entries(t.validationDetails).every(([n,l])=>e.validationDetails[n]===l)}function E3(t,e,n){let{isDisabled:l=!1,isReadOnly:r=!1,value:o,name:i,form:u,children:a,isRequired:c,validationBehavior:f="aria","aria-label":d,"aria-labelledby":b,"aria-describedby":p,onPressStart:h,onPressEnd:$,onPressChange:y,onPress:m,onPressUp:v,onClick:E}=t,C=Yr({...t,value:e.isSelected}),{isInvalid:R,validationErrors:A,validationDetails:K}=C.displayValidation;wc(t,C,n);let P=D=>{D.stopPropagation(),e.setSelected(j(D).checked)},{pressProps:z,isPressed:B}=lt({onPressStart:h,onPressEnd:$,onPressChange:y,onPress:m,onPressUp:v,onClick:E,isDisabled:l}),[N,U]=s.useState(!1),{pressProps:_}=lt({onPressStart(D){if(D.pointerType==="keyboard"||D.pointerType==="virtual"){D.continuePropagation();return}h==null||h(D),y==null||y(!0),U(!0)},onPressEnd(D){if(D.pointerType==="keyboard"||D.pointerType==="virtual"){D.continuePropagation();return}$==null||$(D),y==null||y(!1),U(!1)},onPressUp(D){if(D.pointerType==="keyboard"||D.pointerType==="virtual"){D.continuePropagation();return}v==null||v(D)},onClick:E,onPress(D){var Z;if(D.pointerType==="keyboard"||D.pointerType==="virtual"){D.continuePropagation();return}m==null||m(D),e.toggle(),(Z=n.current)==null||Z.focus();let{[bn]:T}=t,{commitValidation:O}=T||C;O()},isDisabled:l||r}),{focusableProps:x}=jt(t,n),S=G(z,x),I=ie(t,{labelable:!0});xr(n,e.defaultSelected,e.setSelected);let w=Bi(),k=Bi();return{labelProps:G(_,{onClick:D=>D.preventDefault()}),inputProps:G(I,{checked:e.isSelected,"aria-required":c&&f==="aria"||void 0,required:c&&f==="native","aria-invalid":R||t.validationState==="invalid"||void 0,"aria-errormessage":t["aria-errormessage"],"aria-controls":t["aria-controls"],"aria-readonly":r||void 0,"aria-describedby":[w.id,k.id,p].filter(Boolean).join(" ")||void 0,onChange:P,disabled:l,...o==null?{}:{value:o},name:i,form:u,type:"checkbox",...S}),descriptionProps:w,errorMessageProps:k,isSelected:e.isSelected,isPressed:B||N,isDisabled:l,isReadOnly:r,isInvalid:R||t.validationState==="invalid",validationErrors:A,validationDetails:K}}function Pc(t,e,n){let{labelProps:l,inputProps:r,descriptionProps:o,errorMessageProps:i,isSelected:u,isPressed:a,isDisabled:c,isReadOnly:f,isInvalid:d,validationErrors:b,validationDetails:p}=E3(t,e,n),{isIndeterminate:h}=t;return s.useEffect(()=>{n.current&&(n.current.indeterminate=!!h)}),{labelProps:G(l,s.useMemo(()=>({onMouseDown:$=>$.preventDefault()}),[])),inputProps:r,descriptionProps:o,errorMessageProps:i,isSelected:u,isPressed:a,isDisabled:c,isReadOnly:f,isInvalid:d,validationErrors:b,validationDetails:p}}const w3=typeof document<"u"?g.useInsertionEffect??g.useLayoutEffect:()=>{};function Ac(t,e,n){let[l,r]=s.useState(t||e),o=s.useRef(l),i=s.useRef(t!==void 0),u=t!==void 0;s.useEffect(()=>{i.current,i.current=u},[u]);let a=u?t:l;w3(()=>{o.current=a});let[,c]=s.useReducer(()=>({}),{}),f=s.useCallback((d,...b)=>{let p=typeof d=="function"?d(o.current):d;Object.is(o.current,p)||(o.current=p,r(p),c(),n==null||n(p,...b))},[n]);return[a,f]}function S3(t={}){let{isReadOnly:e}=t,[n,l]=Ac(t.isSelected,t.defaultSelected||!1,t.onChange),[r]=s.useState(n);function o(u){e||l(u)}function i(){e||l(!n)}return{isSelected:n,defaultSelected:t.defaultSelected??r,setSelected:o,toggle:i}}function D3(t,e,n){const l=S3({isReadOnly:t.isReadOnly||e.isReadOnly,isSelected:e.isSelected(t.value),defaultSelected:e.defaultValue.includes(t.value),onChange($){$?e.addValue(t.value):e.removeValue(t.value),t.onChange&&t.onChange($)}});let{name:r,form:o,descriptionId:i,errorMessageId:u,validationBehavior:a}=y3.get(e);a=t.validationBehavior??a;let{realtimeValidation:c}=Yr({...t,value:l.isSelected,name:void 0,validationBehavior:"aria"}),f=s.useRef(At),d=()=>{e.setInvalid(t.value,c.isInvalid?c:f.current)};s.useEffect(d);let b=e.realtimeValidation.isInvalid?e.realtimeValidation:c,p=a==="native"?e.displayValidation:b,h=Pc({...t,isReadOnly:t.isReadOnly||e.isReadOnly,isDisabled:t.isDisabled||e.isDisabled,name:t.name||r,form:t.form||o,isRequired:t.isRequired??e.isRequired,validationBehavior:a,[bn]:{realtimeValidation:b,displayValidation:p,resetValidation:e.resetValidation,commitValidation:e.commitValidation,updateValidation($){f.current=$,d()}}},l,n);return{...h,inputProps:{...h.inputProps,"aria-describedby":[h.inputProps["aria-describedby"],e.isInvalid?u:null,i].filter(Boolean).join(" ")||void 0}}}const Xr=s.createContext(null),Tc=s.createContext(null),k3=s.createContext(null),Bc=s.createContext(null);function P3(t,e){let{validationBehavior:n}=el(Gr)||{},l=t.validationBehavior??n??"native",r=s.useContext(k3),o=ke(s.useMemo(()=>ft(e,t.inputRef!==void 0?t.inputRef:null),[e,t.inputRef])),i={...kr(t),children:typeof t.children=="function"?!0:t.children,value:t.value,validationBehavior:l};return[r?D3(i,r,o):Pc(i,c3(t),o),o]}const y0=s.forwardRef(function(e,n){let{inputRef:l=null,...r}=e;[e,n]=xe(r,n,Xr);let[o,i]=P3(e,l);return g.createElement(Bc.Provider,{value:{...o,inputRef:i,defaultClassName:"react-aria-Checkbox",isIndeterminate:e.isIndeterminate,isRequired:e.isRequired}},g.createElement(A3,{...e,ref:n}))}),A3=s.forwardRef(function(e,n){let{labelProps:l,inputProps:r,isSelected:o,isDisabled:i,isReadOnly:u,isPressed:a,isInvalid:c,inputRef:f,defaultClassName:d,isIndeterminate:b,isRequired:p}=s.useContext(Bc),{isFocused:h,isFocusVisible:$,focusProps:y}=je(),m=i||u,{hoverProps:v,isHovered:E}=He({...e,isDisabled:m}),C=ce({...e,defaultClassName:d,values:{isSelected:o,isIndeterminate:b||!1,isPressed:a,isHovered:E,isFocused:h,isFocusVisible:$,isDisabled:i,isReadOnly:u,isInvalid:c,isRequired:p||!1}}),R=ie(e,{global:!0});return delete R.id,delete R.onClick,g.createElement(le.label,{...G(R,l,v,C),ref:n,slot:e.slot||void 0,"data-selected":o||void 0,"data-indeterminate":b||void 0,"data-pressed":a||void 0,"data-hovered":E||void 0,"data-focused":h||void 0,"data-focus-visible":$||void 0,"data-disabled":i||void 0,"data-readonly":u||void 0,"data-invalid":c||void 0,"data-required":p||void 0},g.createElement(Ka,{elementType:"span"},g.createElement("input",{...G(r,y),ref:f})),C.children)}),Kc=s.createContext({}),Ri=({children:t,className:e,color:n,size:l,variant:r,...o})=>{const i=g.useMemo(()=>th({color:n,size:l,variant:r}),[n,l,r]),u=g.useMemo(()=>typeof t=="string"||typeof t=="number"?M.jsx(Rc,{children:t}):t,[t]);return M.jsx(Kc,{value:{slots:i},children:M.jsx(Se.span,{...o,className:de(i.base,e),"data-slot":"chip",children:u})})},Rc=({children:t,className:e,...n})=>{const{slots:l}=s.useContext(Kc);return M.jsx(Se.span,{className:de(l==null?void 0:l.label,e),"data-slot":"chip-label",...n,children:t})},$0=Object.assign(Ri,{Root:Ri,Label:Rc});function T3(t){let{onMoveStart:e,onMove:n,onMoveEnd:l}=t,r=s.useRef({didMove:!1,lastPosition:null,id:null}),{addGlobalListener:o,removeGlobalListener:i}=hn(),u=s.useCallback((b,p,h,$)=>{h===0&&$===0||(r.current.didMove||(r.current.didMove=!0,e==null||e({type:"movestart",pointerType:p,shiftKey:b.shiftKey,metaKey:b.metaKey,ctrlKey:b.ctrlKey,altKey:b.altKey})),n==null||n({type:"move",pointerType:p,deltaX:h,deltaY:$,shiftKey:b.shiftKey,metaKey:b.metaKey,ctrlKey:b.ctrlKey,altKey:b.altKey}))},[e,n,r]),a=Ee(u),c=s.useCallback((b,p)=>{Gl(),r.current.didMove&&(l==null||l({type:"moveend",pointerType:p,shiftKey:b.shiftKey,metaKey:b.metaKey,ctrlKey:b.ctrlKey,altKey:b.altKey}))},[l,r]),f=Ee(c);return{moveProps:s.useMemo(()=>{let b={},p=()=>{Ou(),r.current.didMove=!1};{let $=m=>{var v,E;if(m.pointerId===r.current.id){let C=m.pointerType||"mouse";a(m,C,m.pageX-(((v=r.current.lastPosition)==null?void 0:v.pageX)??0),m.pageY-(((E=r.current.lastPosition)==null?void 0:E.pageY)??0)),r.current.lastPosition={pageX:m.pageX,pageY:m.pageY}}},y=m=>{if(m.pointerId===r.current.id){let v=m.pointerType||"mouse";f(m,v),r.current.id=null;let E=we(j(m));i(E,"pointermove",$,!1),i(E,"pointerup",y,!1),i(E,"pointercancel",y,!1)}};b.onPointerDown=m=>{if(m.button===0&&r.current.id==null){p(),m.stopPropagation(),m.preventDefault(),r.current.lastPosition={pageX:m.pageX,pageY:m.pageY},r.current.id=m.pointerId;let v=we(j(m));o(v,"pointermove",$,!1),o(v,"pointerup",y,!1),o(v,"pointercancel",y,!1)}}}let h=($,y,m)=>{p(),a($,"keyboard",y,m),f($,"keyboard")};return b.onKeyDown=$=>{switch($.key){case"Left":case"ArrowLeft":$.preventDefault(),$.stopPropagation(),h($,-1,0);break;case"Right":case"ArrowRight":$.preventDefault(),$.stopPropagation(),h($,1,0);break;case"Up":case"ArrowUp":$.preventDefault(),$.stopPropagation(),h($,0,-1);break;case"Down":case"ArrowDown":$.preventDefault(),$.stopPropagation(),h($,0,1);break}},b},[o,i,r])}}const pl=s.createContext({});let B3=t=>{let{onHoverStart:e,onHoverChange:n,onHoverEnd:l,...r}=t;return r};const K3=gn(function(e,n){[e,n]=xe(e,n,pl);let{hoverProps:l,isHovered:r}=He({...e,isDisabled:e.disabled}),{isFocused:o,isFocusVisible:i,focusProps:u}=je({isTextInput:!0,autoFocus:e.autoFocus}),a=!!e["aria-invalid"]&&e["aria-invalid"]!=="false",c=ce({...e,values:{isHovered:r,isFocused:o,isFocusVisible:i,isDisabled:e.disabled||!1,isInvalid:a},defaultClassName:"react-aria-Input"});return g.createElement(le.input,{...G(B3(e),u,l),...c,ref:n,"data-focused":o||void 0,"data-disabled":e.disabled||void 0,"data-hovered":r||void 0,"data-focus-visible":i||void 0,"data-invalid":a||void 0})});function Mc(t,e){let{inputElementType:n="input",isDisabled:l=!1,isRequired:r=!1,isReadOnly:o=!1,type:i="text",validationBehavior:u="aria"}=t,[a,c]=Ac(t.value,t.defaultValue||"",t.onChange),{focusableProps:f}=jt(t,e),d=Yr({...t,value:a}),{isInvalid:b,validationErrors:p,validationDetails:h}=d.displayValidation,{labelProps:$,fieldProps:y,descriptionProps:m,errorMessageProps:v}=n3({...t,isInvalid:b,errorMessage:t.errorMessage||p}),E=ie(t,{labelable:!0});const C={type:i,pattern:t.pattern};let[R]=s.useState(a);return xr(e,t.defaultValue??R,c),wc(t,d,e),{labelProps:$,inputProps:G(E,n==="input"?C:void 0,{disabled:l,readOnly:o,required:r&&u==="native","aria-required":r&&u==="aria"||void 0,"aria-invalid":b||void 0,"aria-errormessage":t["aria-errormessage"],"aria-activedescendant":t["aria-activedescendant"],"aria-autocomplete":t["aria-autocomplete"],"aria-haspopup":t["aria-haspopup"],"aria-controls":t["aria-controls"],value:a,onChange:A=>c(j(A).value),autoComplete:t.autoComplete,autoCapitalize:t.autoCapitalize,maxLength:t.maxLength,minLength:t.minLength,name:t.name,form:t.form,placeholder:t.placeholder,inputMode:t.inputMode,autoCorrect:t.autoCorrect,spellCheck:t.spellCheck,[parseInt(g.version,10)>=17?"enterKeyHint":"enterkeyhint"]:t.enterKeyHint,onCopy:t.onCopy,onCut:t.onCut,onPaste:t.onPaste,onCompositionEnd:t.onCompositionEnd,onCompositionStart:t.onCompositionStart,onCompositionUpdate:t.onCompositionUpdate,onSelect:t.onSelect,onBeforeInput:t.onBeforeInput,onInput:t.onInput,...f,...y}),descriptionProps:m,errorMessageProps:v,isInvalid:b,validationErrors:p,validationDetails:h}}var Ic={};Ic={buttonLabel:"عرض المقترحات",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} خيار`,other:()=>`${e.number(t.optionCount)} خيارات`})} متاحة.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`المجموعة المدخلة ${t.groupTitle}, مع ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} خيار`,other:()=>`${e.number(t.groupCount)} خيارات`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", محدد",other:""},t.isSelected)}`,listboxLabel:"مقترحات",selectedAnnouncement:t=>`${t.optionText}، محدد`};var Fc={};Fc={buttonLabel:"Покажи предложения",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} опция`,other:()=>`${e.number(t.optionCount)} опции`})} на разположение.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Въведена група ${t.groupTitle}, с ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} опция`,other:()=>`${e.number(t.groupCount)} опции`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", избрани",other:""},t.isSelected)}`,listboxLabel:"Предложения",selectedAnnouncement:t=>`${t.optionText}, избрани`};var Lc={};Lc={buttonLabel:"Zobrazit doporučení",countAnnouncement:(t,e)=>`K dispozici ${e.plural(t.optionCount,{one:()=>`je ${e.number(t.optionCount)} možnost`,other:()=>`jsou/je ${e.number(t.optionCount)} možnosti/-í`})}.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Zadaná skupina „${t.groupTitle}“ ${e.plural(t.groupCount,{one:()=>`s ${e.number(t.groupCount)} možností`,other:()=>`se ${e.number(t.groupCount)} možnostmi`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:" (vybráno)",other:""},t.isSelected)}`,listboxLabel:"Návrhy",selectedAnnouncement:t=>`${t.optionText}, vybráno`};var zc={};zc={buttonLabel:"Vis forslag",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} mulighed tilgængelig`,other:()=>`${e.number(t.optionCount)} muligheder tilgængelige`})}.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Angivet gruppe ${t.groupTitle}, med ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} mulighed`,other:()=>`${e.number(t.groupCount)} muligheder`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", valgt",other:""},t.isSelected)}`,listboxLabel:"Forslag",selectedAnnouncement:t=>`${t.optionText}, valgt`};var Nc={};Nc={buttonLabel:"Empfehlungen anzeigen",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} Option`,other:()=>`${e.number(t.optionCount)} Optionen`})} verfügbar.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Eingetretene Gruppe ${t.groupTitle}, mit ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} Option`,other:()=>`${e.number(t.groupCount)} Optionen`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", ausgewählt",other:""},t.isSelected)}`,listboxLabel:"Empfehlungen",selectedAnnouncement:t=>`${t.optionText}, ausgewählt`};var Oc={};Oc={buttonLabel:"Προβολή προτάσεων",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} επιλογή`,other:()=>`${e.number(t.optionCount)} επιλογές `})} διαθέσιμες.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Εισαγμένη ομάδα ${t.groupTitle}, με ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} επιλογή`,other:()=>`${e.number(t.groupCount)} επιλογές`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", επιλεγμένο",other:""},t.isSelected)}`,listboxLabel:"Προτάσεις",selectedAnnouncement:t=>`${t.optionText}, επιλέχθηκε`};var Vc={};Vc={focusAnnouncement:(t,e)=>`${e.select({true:()=>`Entered group ${t.groupTitle}, with ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} option`,other:()=>`${e.number(t.groupCount)} options`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", selected",other:""},t.isSelected)}`,countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} option`,other:()=>`${e.number(t.optionCount)} options`})} available.`,selectedAnnouncement:t=>`${t.optionText}, selected`,buttonLabel:"Show suggestions",listboxLabel:"Suggestions"};var jc={};jc={buttonLabel:"Mostrar sugerencias",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} opción`,other:()=>`${e.number(t.optionCount)} opciones`})} disponible(s).`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Se ha unido al grupo ${t.groupTitle}, con ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} opción`,other:()=>`${e.number(t.groupCount)} opciones`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", seleccionado",other:""},t.isSelected)}`,listboxLabel:"Sugerencias",selectedAnnouncement:t=>`${t.optionText}, seleccionado`};var _c={};_c={buttonLabel:"Kuva soovitused",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} valik`,other:()=>`${e.number(t.optionCount)} valikud`})} saadaval.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Sisestatud rühm ${t.groupTitle}, valikuga ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} valik`,other:()=>`${e.number(t.groupCount)} valikud`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", valitud",other:""},t.isSelected)}`,listboxLabel:"Soovitused",selectedAnnouncement:t=>`${t.optionText}, valitud`};var Hc={};Hc={buttonLabel:"Näytä ehdotukset",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} vaihtoehto`,other:()=>`${e.number(t.optionCount)} vaihtoehdot`})} saatavilla.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Mentiin ryhmään ${t.groupTitle}, ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} vaihtoehdon`,other:()=>`${e.number(t.groupCount)} vaihtoehdon`})} kanssa.`,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", valittu",other:""},t.isSelected)}`,listboxLabel:"Ehdotukset",selectedAnnouncement:t=>`${t.optionText}, valittu`};var Wc={};Wc={buttonLabel:"Afficher les suggestions",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} option`,other:()=>`${e.number(t.optionCount)} options`})} disponible(s).`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Groupe ${t.groupTitle} rejoint, avec ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} option`,other:()=>`${e.number(t.groupCount)} options`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", sélectionné(s)",other:""},t.isSelected)}`,listboxLabel:"Suggestions",selectedAnnouncement:t=>`${t.optionText}, sélectionné`};var Uc={};Uc={buttonLabel:"הצג הצעות",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`אפשרות ${e.number(t.optionCount)}`,other:()=>`${e.number(t.optionCount)} אפשרויות`})} במצב זמין.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`נכנס לקבוצה ${t.groupTitle}, עם ${e.plural(t.groupCount,{one:()=>`אפשרות ${e.number(t.groupCount)}`,other:()=>`${e.number(t.groupCount)} אפשרויות`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", נבחר",other:""},t.isSelected)}`,listboxLabel:"הצעות",selectedAnnouncement:t=>`${t.optionText}, נבחר`};var Gc={};Gc={buttonLabel:"Prikaži prijedloge",countAnnouncement:(t,e)=>`Dostupno još: ${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} opcija`,other:()=>`${e.number(t.optionCount)} opcije/a`})}.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Unesena skupina ${t.groupTitle}, s ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} opcijom`,other:()=>`${e.number(t.groupCount)} opcije/a`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", odabranih",other:""},t.isSelected)}`,listboxLabel:"Prijedlozi",selectedAnnouncement:t=>`${t.optionText}, odabrano`};var qc={};qc={buttonLabel:"Javaslatok megjelenítése",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} lehetőség`,other:()=>`${e.number(t.optionCount)} lehetőség`})} áll rendelkezésre.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Belépett a(z) ${t.groupTitle} csoportba, amely ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} lehetőséget`,other:()=>`${e.number(t.groupCount)} lehetőséget`})} tartalmaz. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", kijelölve",other:""},t.isSelected)}`,listboxLabel:"Javaslatok",selectedAnnouncement:t=>`${t.optionText}, kijelölve`};var Zc={};Zc={buttonLabel:"Mostra suggerimenti",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} opzione disponibile`,other:()=>`${e.number(t.optionCount)} opzioni disponibili`})}.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Ingresso nel gruppo ${t.groupTitle}, con ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} opzione`,other:()=>`${e.number(t.groupCount)} opzioni`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", selezionato",other:""},t.isSelected)}`,listboxLabel:"Suggerimenti",selectedAnnouncement:t=>`${t.optionText}, selezionato`};var Yc={};Yc={buttonLabel:"候補を表示",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} 個のオプション`,other:()=>`${e.number(t.optionCount)} 個のオプション`})}を利用できます。`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`入力されたグループ ${t.groupTitle}、${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} 個のオプション`,other:()=>`${e.number(t.groupCount)} 個のオプション`})}を含む。`,other:""},t.isGroupChange)}${t.optionText}${e.select({true:"、選択済み",other:""},t.isSelected)}`,listboxLabel:"候補",selectedAnnouncement:t=>`${t.optionText}、選択済み`};var Xc={};Xc={buttonLabel:"제안 사항 표시",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)}개 옵션`,other:()=>`${e.number(t.optionCount)}개 옵션`})}을 사용할 수 있습니다.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`입력한 그룹 ${t.groupTitle}, ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)}개 옵션`,other:()=>`${e.number(t.groupCount)}개 옵션`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", 선택됨",other:""},t.isSelected)}`,listboxLabel:"제안",selectedAnnouncement:t=>`${t.optionText}, 선택됨`};var Jc={};Jc={buttonLabel:"Rodyti pasiūlymus",countAnnouncement:(t,e)=>`Yra ${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} parinktis`,other:()=>`${e.number(t.optionCount)} parinktys (-ių)`})}.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Įvesta grupė ${t.groupTitle}, su ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} parinktimi`,other:()=>`${e.number(t.groupCount)} parinktimis (-ių)`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", pasirinkta",other:""},t.isSelected)}`,listboxLabel:"Pasiūlymai",selectedAnnouncement:t=>`${t.optionText}, pasirinkta`};var Qc={};Qc={buttonLabel:"Rādīt ieteikumus",countAnnouncement:(t,e)=>`Pieejamo opciju skaits: ${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} opcija`,other:()=>`${e.number(t.optionCount)} opcijas`})}.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Ievadīta grupa ${t.groupTitle}, ar ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} opciju`,other:()=>`${e.number(t.groupCount)} opcijām`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", atlasīta",other:""},t.isSelected)}`,listboxLabel:"Ieteikumi",selectedAnnouncement:t=>`${t.optionText}, atlasīta`};var ed={};ed={buttonLabel:"Vis forslag",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} alternativ`,other:()=>`${e.number(t.optionCount)} alternativer`})} finnes.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Angitt gruppe ${t.groupTitle}, med ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} alternativ`,other:()=>`${e.number(t.groupCount)} alternativer`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", valgt",other:""},t.isSelected)}`,listboxLabel:"Forslag",selectedAnnouncement:t=>`${t.optionText}, valgt`};var td={};td={buttonLabel:"Suggesties weergeven",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} optie`,other:()=>`${e.number(t.optionCount)} opties`})} beschikbaar.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Groep ${t.groupTitle} ingevoerd met ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} optie`,other:()=>`${e.number(t.groupCount)} opties`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", geselecteerd",other:""},t.isSelected)}`,listboxLabel:"Suggesties",selectedAnnouncement:t=>`${t.optionText}, geselecteerd`};var nd={};nd={buttonLabel:"Wyświetlaj sugestie",countAnnouncement:(t,e)=>`dostępna/dostępne(-nych) ${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} opcja`,other:()=>`${e.number(t.optionCount)} opcje(-i)`})}.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Dołączono do grupy ${t.groupTitle}, z ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} opcją`,other:()=>`${e.number(t.groupCount)} opcjami`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", wybrano",other:""},t.isSelected)}`,listboxLabel:"Sugestie",selectedAnnouncement:t=>`${t.optionText}, wybrano`};var ld={};ld={buttonLabel:"Mostrar sugestões",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} opção`,other:()=>`${e.number(t.optionCount)} opções`})} disponível.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Grupo inserido ${t.groupTitle}, com ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} opção`,other:()=>`${e.number(t.groupCount)} opções`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", selecionado",other:""},t.isSelected)}`,listboxLabel:"Sugestões",selectedAnnouncement:t=>`${t.optionText}, selecionado`};var rd={};rd={buttonLabel:"Apresentar sugestões",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} opção`,other:()=>`${e.number(t.optionCount)} opções`})} disponível.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Grupo introduzido ${t.groupTitle}, com ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} opção`,other:()=>`${e.number(t.groupCount)} opções`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", selecionado",other:""},t.isSelected)}`,listboxLabel:"Sugestões",selectedAnnouncement:t=>`${t.optionText}, selecionado`};var od={};od={buttonLabel:"Afișare sugestii",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} opțiune`,other:()=>`${e.number(t.optionCount)} opțiuni`})} disponibile.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Grup ${t.groupTitle} introdus, cu ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} opțiune`,other:()=>`${e.number(t.groupCount)} opțiuni`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", selectat",other:""},t.isSelected)}`,listboxLabel:"Sugestii",selectedAnnouncement:t=>`${t.optionText}, selectat`};var id={};id={buttonLabel:"Показать предложения",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} параметр`,other:()=>`${e.number(t.optionCount)} параметров`})} доступно.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Введенная группа ${t.groupTitle}, с ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} параметром`,other:()=>`${e.number(t.groupCount)} параметрами`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", выбранными",other:""},t.isSelected)}`,listboxLabel:"Предложения",selectedAnnouncement:t=>`${t.optionText}, выбрано`};var ud={};ud={buttonLabel:"Zobraziť návrhy",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} možnosť`,other:()=>`${e.number(t.optionCount)} možnosti/-í`})} k dispozícii.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Zadaná skupina ${t.groupTitle}, s ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} možnosťou`,other:()=>`${e.number(t.groupCount)} možnosťami`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", vybraté",other:""},t.isSelected)}`,listboxLabel:"Návrhy",selectedAnnouncement:t=>`${t.optionText}, vybraté`};var ad={};ad={buttonLabel:"Prikaži predloge",countAnnouncement:(t,e)=>`Na voljo je ${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} opcija`,other:()=>`${e.number(t.optionCount)} opcije`})}.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Vnesena skupina ${t.groupTitle}, z ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} opcija`,other:()=>`${e.number(t.groupCount)} opcije`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", izbrano",other:""},t.isSelected)}`,listboxLabel:"Predlogi",selectedAnnouncement:t=>`${t.optionText}, izbrano`};var sd={};sd={buttonLabel:"Prikaži predloge",countAnnouncement:(t,e)=>`Dostupno još: ${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} opcija`,other:()=>`${e.number(t.optionCount)} opcije/a`})}.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Unesena grupa ${t.groupTitle}, s ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} opcijom`,other:()=>`${e.number(t.groupCount)} optione/a`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", izabranih",other:""},t.isSelected)}`,listboxLabel:"Predlozi",selectedAnnouncement:t=>`${t.optionText}, izabrano`};var cd={};cd={buttonLabel:"Visa förslag",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} alternativ`,other:()=>`${e.number(t.optionCount)} alternativ`})} tillgängliga.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Ingick i gruppen ${t.groupTitle} med ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} alternativ`,other:()=>`${e.number(t.groupCount)} alternativ`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", valda",other:""},t.isSelected)}`,listboxLabel:"Förslag",selectedAnnouncement:t=>`${t.optionText}, valda`};var dd={};dd={buttonLabel:"Önerileri göster",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} seçenek`,other:()=>`${e.number(t.optionCount)} seçenekler`})} kullanılabilir.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Girilen grup ${t.groupTitle}, ile ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} seçenek`,other:()=>`${e.number(t.groupCount)} seçenekler`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", seçildi",other:""},t.isSelected)}`,listboxLabel:"Öneriler",selectedAnnouncement:t=>`${t.optionText}, seçildi`};var fd={};fd={buttonLabel:"Показати пропозиції",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} параметр`,other:()=>`${e.number(t.optionCount)} параметри(-ів)`})} доступно.`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`Введена група ${t.groupTitle}, з ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} параметр`,other:()=>`${e.number(t.groupCount)} параметри(-ів)`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", вибрано",other:""},t.isSelected)}`,listboxLabel:"Пропозиції",selectedAnnouncement:t=>`${t.optionText}, вибрано`};var pd={};pd={buttonLabel:"显示建议",countAnnouncement:(t,e)=>`有 ${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} 个选项`,other:()=>`${e.number(t.optionCount)} 个选项`})}可用。`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`进入了 ${t.groupTitle} 组,其中有 ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} 个选项`,other:()=>`${e.number(t.groupCount)} 个选项`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", 已选择",other:""},t.isSelected)}`,listboxLabel:"建议",selectedAnnouncement:t=>`${t.optionText}, 已选择`};var bd={};bd={buttonLabel:"顯示建議",countAnnouncement:(t,e)=>`${e.plural(t.optionCount,{one:()=>`${e.number(t.optionCount)} 選項`,other:()=>`${e.number(t.optionCount)} 選項`})} 可用。`,focusAnnouncement:(t,e)=>`${e.select({true:()=>`輸入的群組 ${t.groupTitle}, 有 ${e.plural(t.groupCount,{one:()=>`${e.number(t.groupCount)} 選項`,other:()=>`${e.number(t.groupCount)} 選項`})}. `,other:""},t.isGroupChange)}${t.optionText}${e.select({true:", 已選取",other:""},t.isSelected)}`,listboxLabel:"建議",selectedAnnouncement:t=>`${t.optionText}, 已選取`};var hd={};hd={"ar-AE":Ic,"bg-BG":Fc,"cs-CZ":Lc,"da-DK":zc,"de-DE":Nc,"el-GR":Oc,"en-US":Vc,"es-ES":jc,"et-EE":_c,"fi-FI":Hc,"fr-FR":Wc,"he-IL":Uc,"hr-HR":Gc,"hu-HU":qc,"it-IT":Zc,"ja-JP":Yc,"ko-KR":Xc,"lt-LT":Jc,"lv-LV":Qc,"nb-NO":ed,"nl-NL":td,"pl-PL":nd,"pt-BR":ld,"pt-PT":rd,"ro-RO":od,"ru-RU":id,"sk-SK":ud,"sl-SI":ad,"sr-SP":sd,"sv-SE":cd,"tr-TR":dd,"uk-UA":fd,"zh-CN":pd,"zh-TW":bd};function R3(t){return t&&t.__esModule?t.default:t}function M3(t,e){let{buttonRef:n,popoverRef:l,inputRef:r,listBoxRef:o,keyboardDelegate:i,layoutDelegate:u,shouldFocusWrap:a,isReadOnly:c,isDisabled:f}=t,d=s.useRef(null);n=n??d;let b=Ne(R3(hd),"@react-aria/combobox"),{menuTriggerProps:p,menuProps:h}=om({type:"listbox",isDisabled:f||c},e,n);dl.set(e,{id:h.id});let{collection:$}=e,{disabledKeys:y}=e.selectionManager,m=s.useMemo(()=>i||new sl({collection:$,disabledKeys:y,ref:o,layoutDelegate:u}),[i,u,$,y,o]),{collectionProps:v}=Vr({selectionManager:e.selectionManager,keyboardDelegate:m,disallowTypeAhead:!0,disallowEmptySelection:!0,shouldFocusWrap:a,ref:r,isVirtualized:!0}),E=Nt(),C=L=>{if(!L.nativeEvent.isComposing)switch(L.key){case"Enter":case"Tab":if(e.isOpen&&L.key==="Enter"&&L.preventDefault(),e.isOpen&&o.current&&e.selectionManager.focusedKey!=null){let Y=e.collection.getItem(e.selectionManager.focusedKey);if(Y!=null&&Y.props.href){let ue=o.current.querySelector(`[data-key="${CSS.escape(e.selectionManager.focusedKey.toString())}"]`);L.key==="Enter"&&ue instanceof HTMLAnchorElement&&E.open(ue,L,Y.props.href,Y.props.routerOptions),e.close();break}else if(Y!=null&&Y.props.onAction){Y.props.onAction(),e.close();break}}(L.key==="Enter"||e.isOpen)&&e.commit();break;case"Escape":(!e.selectionManager.isEmpty||e.inputValue===""||t.allowsCustomValue)&&L.continuePropagation(),e.revert();break;case"ArrowDown":e.open("first","manual");break;case"ArrowUp":e.open("last","manual");break;case"ArrowLeft":case"ArrowRight":e.selectionManager.setFocusedKey(null);break}},R=L=>{let Y=(n==null?void 0:n.current)&&n.current===L.relatedTarget,ue=te(l.current,L.relatedTarget);Y||ue||(t.onBlur&&t.onBlur(L),e.setFocused(!1))},A=L=>{e.isFocused||(t.onFocus&&t.onFocus(L),e.setFocused(!0))},K=I3([e.selectionManager.selectedKeys,e.selectionManager.selectionMode]),{isInvalid:P,validationErrors:z,validationDetails:B}=e.displayValidation,{labelProps:N,inputProps:U,descriptionProps:_,errorMessageProps:x}=Mc({...t,isRequired:t.selectionMode==="multiple"?t.isRequired&&e.selectionManager.isEmpty:t.isRequired,onChange:e.setInputValue,onKeyDown:c?t.onKeyDown:dt(e.isOpen&&v.onKeyDown,C,t.onKeyDown),onBlur:R,value:e.inputValue,defaultValue:e.defaultInputValue,onFocus:A,autoComplete:"off",validate:void 0,[bn]:e,"aria-describedby":[K,t["aria-describedby"]].filter(Boolean).join(" ")||void 0},r);xr(r,e.defaultValue,e.setValue);let S=L=>{var Y;L.pointerType==="touch"&&((Y=r.current)==null||Y.focus(),e.toggle(null,"manual"))},I=L=>{var Y;L.pointerType!=="touch"&&((Y=r.current)==null||Y.focus(),e.toggle(L.pointerType==="keyboard"||L.pointerType==="virtual"?"first":null,"manual"))},w=un({id:p.id,"aria-label":b.format("buttonLabel"),"aria-labelledby":t["aria-labelledby"]||N.id}),k=un({id:h.id,"aria-label":b.format("listboxLabel"),"aria-labelledby":t["aria-labelledby"]||N.id}),D=s.useRef(0),T=L=>{var wt,Sn;if(f||c)return;if(L.timeStamp-D.current<500){L.preventDefault(),(wt=r.current)==null||wt.focus();return}let Y=j(L).getBoundingClientRect(),ue=L.changedTouches[0],Ke=Math.ceil(Y.left+.5*Y.width),hl=Math.ceil(Y.top+.5*Y.height);ue.clientX===Ke&&ue.clientY===hl&&(L.preventDefault(),(Sn=r.current)==null||Sn.focus(),e.toggle(null,"manual"),D.current=L.timeStamp)},O=e.selectionManager.focusedKey!=null&&e.isOpen?e.collection.getItem(e.selectionManager.focusedKey):void 0,Z=(O==null?void 0:O.parentKey)??null,F=e.selectionManager.focusedKey??null,V=s.useRef(Z),q=s.useRef(F);s.useEffect(()=>{if(Fn()&&O!=null&&F!=null&&F!==q.current){let L=e.selectionManager.isSelected(F),Y=Z!=null?e.collection.getItem(Z):null,ue=(Y==null?void 0:Y["aria-label"])||(typeof(Y==null?void 0:Y.rendered)=="string"?Y.rendered:"")||"",Ke=b.format("focusAnnouncement",{isGroupChange:(Y&&Z!==V.current)??!1,groupTitle:ue,groupCount:Y?[...Ce(Y,e.collection)].length:0,optionText:O["aria-label"]||O.textValue||"",isSelected:L});gt(Ke)}V.current=Z,q.current=F});let Q=As(e.collection),J=s.useRef(Q),ge=s.useRef(e.isOpen);s.useEffect(()=>{let L=e.isOpen!==ge.current&&(e.selectionManager.focusedKey==null||Fn());if(e.isOpen&&(L||Q!==J.current)){let Y=b.format("countAnnouncement",{optionCount:Q});gt(Y)}J.current=Q,ge.current=e.isOpen});let Be=s.useRef(e.selectedKey);return s.useEffect(()=>{if(Fn()&&e.isFocused&&e.selectedItem&&e.selectedKey!==Be.current){let L=e.selectedItem["aria-label"]||e.selectedItem.textValue||"",Y=b.format("selectedAnnouncement",{optionText:L});gt(Y)}Be.current=e.selectedKey}),s.useEffect(()=>{if(e.isOpen)return Rr([r.current,l.current].filter(L=>L!=null))},[e.isOpen,r,l]),$r(()=>{!O&&r.current&&oe(re(r.current))===r.current&&Or(r.current,null)},[O]),Yt(o,"react-aria-item-action",e.isOpen?()=>{e.close()}:void 0),{labelProps:N,buttonProps:{...p,...w,excludeFromTabOrder:!0,preventFocusOnPress:!0,onPress:S,onPressStart:I,isDisabled:f||c},inputProps:G(U,{role:"combobox","aria-expanded":p["aria-expanded"],"aria-controls":e.isOpen?h.id:void 0,"aria-autocomplete":"list","aria-activedescendant":O?$c(e,O.key):void 0,onTouchEnd:T,autoCorrect:"off",spellCheck:"false"}),listBoxProps:G(h,k,{autoFocus:e.focusStrategy||!0,shouldUseVirtualFocus:!0,shouldSelectOnPressUp:!0,shouldFocusOnHover:!0,linkBehavior:"selection",UNSTABLE_itemBehavior:"action"}),valueProps:{id:K},descriptionProps:_,errorMessageProps:x,isInvalid:P,validationErrors:z,validationDetails:B}}function I3(t=[]){let e=$e(),[n,l]=s.useState(!0),[r,o]=s.useState(t);return r.some((i,u)=>!Object.is(i,t[u]))&&(l(!0),o(t)),s.useEffect(()=>{n&&!document.getElementById(e)&&l(!1)},[e,n,r]),n?e:void 0}function F3(t){var go;let{defaultFilter:e,menuTrigger:n="input",allowsEmptyCollection:l=!1,allowsCustomValue:r,shouldCloseOnBlur:o=!0,selectionMode:i="single"}=t,[u,a]=s.useState(!1),[c,f]=s.useState(!1),[d,b]=s.useState(null),p=s.useMemo(()=>t.defaultValue!==void 0?t.defaultValue:i==="single"?t.defaultSelectedKey??null:[],[t.defaultValue,t.defaultSelectedKey,i]),h=s.useMemo(()=>t.value!==void 0?t.value:i==="single"?t.selectedKey:void 0,[t.value,t.selectedKey,i]),[$,y]=Ct(h,p,t.onChange),m=i==="single"&&Array.isArray($)?$[0]:$,v=X=>{var se;if(i==="single"){let be=Array.isArray(X)?X[0]??null:X;y(be),be!==m&&((se=t.onSelectionChange)==null||se.call(t,be))}else{let be=[];Array.isArray(X)?be=X:X!=null&&(be=[X]),y(be)}},{collection:E,selectionManager:C,disabledKeys:R}=vc({...t,items:t.items??t.defaultItems,selectionMode:i,disallowEmptySelection:i==="single",allowDuplicateSelectionEvents:!0,selectedKeys:s.useMemo(()=>z3(m),[m]),onSelectionChange:X=>{var se;if(X!=="all")if(i==="single"){let be=X.values().next().value??null;be===m?((se=t.onSelectionChange)==null||se.call(t,be),Q(),F()):v(be)}else v([...X])}}),A=i==="single"?C.firstSelectedKey:null,K=s.useMemo(()=>[...C.selectedKeys].map(X=>E.getItem(X)).filter(X=>X!=null),[C.selectedKeys,E]),[P,z]=Ct(t.inputValue,Mi(t.defaultInputValue,A,E)||"",t.onInputChange),[B]=s.useState(m),[N]=s.useState(P),U=E,_=s.useMemo(()=>t.items!=null||!e?E:L3(E,P,e),[E,P,e,t.items]),[x,S]=s.useState(_),I=s.useRef("focus"),k=il({...t,onOpenChange:X=>{t.onOpenChange&&t.onOpenChange(X,X?I.current:void 0),C.setFocused(X),X||C.setFocusedKey(null)},isOpen:void 0,defaultOpen:void 0}),D=(X=null,se)=>{let be=se==="manual"||se==="focus"&&n==="focus";(l||_.size>0||be&&U.size>0||t.items)&&(be&&!k.isOpen&&t.items===void 0&&a(!0),I.current=se,b(X),k.open())},T=(X=null,se)=>{let be=se==="manual"||se==="focus"&&n==="focus";!(l||_.size>0||be&&U.size>0||t.items)&&!k.isOpen||(be&&!k.isOpen&&t.items===void 0&&a(!0),k.isOpen||(I.current=se),Z(X))},O=s.useCallback(()=>{S(u?U:_)},[u,U,_]),Z=s.useCallback((X=null)=>{k.isOpen&&O(),b(X),k.toggle()},[k,O]),F=s.useCallback(()=>{k.isOpen&&(O(),k.close())},[k,O]),[V,q]=s.useState(P),Q=()=>{var se;let X=A!=null?((se=E.getItem(A))==null?void 0:se.textValue)??"":"";q(X),z(X)},J=s.useRef(m),ge=s.useRef(A!=null?((go=E.getItem(A))==null?void 0:go.textValue)??"":"");s.useEffect(()=>{var se;c&&(_.size>0||l)&&!k.isOpen&&P!==V&&n!=="manual"&&D(null,"input"),!u&&!l&&k.isOpen&&_.size===0&&F(),m!=null&&m!==J.current&&i==="single"&&F(),P!==V&&(C.setFocusedKey(null),a(!1),i==="single"&&P===""&&(t.inputValue===void 0||h===void 0)&&v(null)),m!==J.current&&(t.inputValue===void 0||h===void 0)?Q():V!==P&&q(P);let X=A!=null?((se=E.getItem(A))==null?void 0:se.textValue)??"":"";!c&&A!=null&&t.inputValue===void 0&&A===J.current&&ge.current!==X&&(q(X),z(X)),J.current=m,ge.current=X});let Be=Om({...t,value:s.useMemo(()=>Array.isArray(m)&&m.length===0?null:{inputValue:P,value:m,selectedKey:A},[P,A,m])}),L=()=>{r&&A==null?Y():ue()},Y=()=>{if(i==="multiple"){q(P),F();return}let X=null;J.current=X,v(X),F()},ue=(X=!1)=>{var se,be,yo;if(h!==void 0&&t.inputValue!==void 0){let $o=A!=null?((se=E.getItem(A))==null?void 0:se.textValue)??"":"";(X||i==="multiple"||P!==$o)&&((be=t.onSelectionChange)==null||be.call(t,A),(yo=t.onChange)==null||yo.call(t,m)),q($o),F()}else Q(),F()};const Ke=()=>{var X;if(r){const se=A!=null?((X=E.getItem(A))==null?void 0:X.textValue)??"":"";P===se?ue():Y()}else ue()};let hl=()=>{k.isOpen&&C.focusedKey!=null?C.isSelected(C.focusedKey)&&i==="single"?ue(!0):C.select(C.focusedKey):Ke()},wt=s.useRef([P,m]),Sn=X=>{X?(wt.current=[P,m],n==="focus"&&!t.isReadOnly&&D(null,"focus")):(o&&Ke(),(P!==wt.current[0]||m!==wt.current[1])&&Be.commitValidation()),f(X)},ip=s.useMemo(()=>k.isOpen?u?U:_:x,[k.isOpen,U,_,u,x]),mo=t.defaultSelectedKey??(i==="single"?B:null);return{...Be,...k,focusStrategy:d,toggle:T,open:D,close:Ke,selectionManager:C,value:m,defaultValue:p??B,setValue:v,selectedKey:A,selectedItems:K,defaultSelectedKey:mo,setSelectedKey:v,disabledKeys:R,isFocused:c,setFocused:Sn,selectedItem:K[0]??null,collection:ip,inputValue:P,defaultInputValue:Mi(t.defaultInputValue,mo,E)??N,setInputValue:z,commit:hl,revert:L}}function L3(t,e,n){return new ar(md(t,t,e,n))}function md(t,e,n,l){let r=[];for(let o of e)if(o.type==="section"&&o.hasChildNodes){let i=md(t,Zn(o,t),n,l);[...i].some(u=>u.type==="item")&&r.push({...o,childNodes:i})}else o.type==="item"&&l(o.textValue,n)?r.push({...o}):o.type!=="item"&&r.push({...o});return r}function Mi(t,e,n){var l;return t==null&&e!=null?((l=n.getItem(e))==null?void 0:l.textValue)??"":t}function z3(t){if(t!==void 0)return t===null?[]:Array.isArray(t)?t:[t]}const N3=s.createContext(null),gd=s.createContext(null),O3=gn(function(e,n){[e,n]=xe(e,n,N3);let{children:l,isDisabled:r=!1,isInvalid:o=!1,isRequired:i=!1,isReadOnly:u=!1}=e,a=s.useMemo(()=>g.createElement(fl.Provider,{value:{items:e.items??e.defaultItems}},typeof l=="function"?l({isOpen:!1,isDisabled:r,isInvalid:o,isRequired:i,defaultChildren:null,isReadOnly:u}):l),[l,r,o,i,u,e.items,e.defaultItems]);return g.createElement(zr,{content:a},c=>g.createElement(j3,{props:e,collection:c,comboBoxRef:n}))}),V3=[tl,yn,pl,Ur,Cn];function j3({props:t,collection:e,comboBoxRef:n}){let{name:l,formValue:r="key",allowsCustomValue:o}=t;o&&(r="text");let{validationBehavior:i}=el(Gr)||{},u=t.validationBehavior??i??"native",{contains:a}=zm({sensitivity:"base"}),c=F3({...t,defaultFilter:t.defaultFilter||a,items:t.items,children:void 0,collection:e,validationBehavior:u}),f=s.useRef(null),d=s.useRef(null),b=s.useRef(null),p=s.useRef(null),h=s.useRef(null),[$,y]=Dr(!t["aria-label"]&&!t["aria-labelledby"]),{buttonProps:m,inputProps:v,listBoxProps:E,labelProps:C,descriptionProps:R,errorMessageProps:A,valueProps:K,...P}=M3({...kr(t),label:y,inputRef:d,buttonRef:f,listBoxRef:p,popoverRef:h,name:r==="text"?l:void 0,validationBehavior:u},c),[z,B]=s.useState(null),N=s.useCallback(()=>{var w;if(d.current&&!b.current){let k=(w=f.current)==null?void 0:w.getBoundingClientRect(),D=d.current.getBoundingClientRect(),T=k?Math.min(k.left,D.left):D.left,O=k?Math.max(k.right,D.right):D.right;B(O-T+"px")}},[f,d,B]);an({ref:d,onResize:N});let U=s.useMemo(()=>({get current(){return b.current||d.current}}),[b,d]),_=s.useMemo(()=>({isOpen:c.isOpen,isDisabled:t.isDisabled||!1,isInvalid:P.isInvalid||!1,isRequired:t.isRequired||!1,isReadOnly:t.isReadOnly||!1}),[c.isOpen,t.isDisabled,P.isInvalid,t.isRequired,t.isReadOnly]),x=ce({...t,values:_,defaultClassName:"react-aria-ComboBox"}),S=ie(t,{global:!0});delete S.id;let I=[];if(l&&r==="key"){let w=Array.isArray(c.value)?c.value:[c.value];w.length===0&&(w=[null]),I=w.map((k,D)=>g.createElement("input",{key:D,type:"hidden",name:l,form:t.form,value:k??""}))}return g.createElement(_e,{values:[[gd,c],[tl,{...C,ref:$}],[yn,{...m,ref:f,isPressed:c.isOpen}],[pl,{...v,ref:d}],[Et,c],[Fr,{ref:h,triggerRef:U,scrollRef:p,placement:"bottom start",isNonModal:!0,trigger:"ComboBox",style:{"--trigger-width":z},clearContexts:V3}],[fl,{...E,ref:p}],[_t,c],[Cn,{slots:{description:R,errorMessage:A}}],[Ur,{ref:b,isInvalid:P.isInvalid,isDisabled:t.isDisabled||!1}],[Ms,P],[_3,K]]},g.createElement(le.div,{...S,...x,ref:n,slot:t.slot||void 0,"data-focused":c.isFocused||void 0,"data-open":c.isOpen||void 0,"data-disabled":t.isDisabled||void 0,"data-readonly":t.isReadOnly||void 0,"data-invalid":P.isInvalid||void 0,"data-required":t.isRequired||void 0},x.children,I))}const _3=s.createContext(null),wn=s.createContext({}),Ii=({children:t,className:e,fullWidth:n,menuTrigger:l="focus",variant:r,...o})=>{const i=g.useMemo(()=>lh({fullWidth:n}),[n]);return M.jsx(wn,{value:{slots:i,variant:r},children:M.jsx(O3,{"data-slot":"combo-box",menuTrigger:l,...o,className:me(e,i==null?void 0:i.base()),children:u=>M.jsx(M.Fragment,{children:typeof t=="function"?t(u):t})})})},H3=({children:t,className:e,...n})=>{const{slots:l}=s.useContext(wn),r=de(l==null?void 0:l.inputGroup,e);return M.jsx("div",{className:r,"data-slot":"combo-box-input-group",...n,children:t})},W3=({children:t,className:e,...n})=>{const{slots:l}=s.useContext(wn),r=s.useContext(gd);return M.jsx(Kr,{className:me(e,l==null?void 0:l.trigger()),"data-open":_u(r==null?void 0:r.isOpen),"data-slot":"combo-box-trigger",...n,children:t??M.jsx(Wh,{"data-slot":"combo-box-trigger-default-icon"})})},U3=({children:t,className:e,placement:n="bottom",...l})=>{const{slots:r}=s.useContext(wn);return M.jsx(Hu,{value:{variant:"default"},children:M.jsx(F4,{...l,className:me(e,r==null?void 0:r.popover()),"data-slot":"combo-box-popover",placement:n,children:t})})},v0=Object.assign(Ii,{Root:Ii,InputGroup:H3,Trigger:W3,Popover:U3}),G3=({...t})=>{const e=s.useId();return M.jsxs("svg",{"data-slot":"spinner-icon",viewBox:"0 0 24 24",...t,children:[M.jsxs("defs",{children:[M.jsxs("linearGradient",{id:`«data-slot-icon-def-1»-${e}`,x1:"50%",x2:"50%",y1:"5.271%",y2:"91.793%",children:[M.jsx("stop",{offset:"0%",stopColor:"currentColor"}),M.jsx("stop",{offset:"100%",stopColor:"currentColor",stopOpacity:.55})]}),M.jsxs("linearGradient",{id:`«data-slot-icon-def-2»-${e}`,x1:"50%",x2:"50%",y1:"15.24%",y2:"87.15%",children:[M.jsx("stop",{offset:"0%",stopColor:"currentColor",stopOpacity:0}),M.jsx("stop",{offset:"100%",stopColor:"currentColor",stopOpacity:.55})]})]}),M.jsxs("g",{fill:"none",children:[M.jsx("path",{d:"m12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.018-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z"}),M.jsx("path",{d:"M8.749.021a1.5 1.5 0 0 1 .497 2.958A7.5 7.5 0 0 0 3 10.375a7.5 7.5 0 0 0 7.5 7.5v3c-5.799 0-10.5-4.7-10.5-10.5C0 5.23 3.726.865 8.749.021",fill:`url(#«data-slot-icon-def-1»-${e})`,transform:"translate(1.5 1.625)"}),M.jsx("path",{d:"M15.392 2.673a1.5 1.5 0 0 1 2.119-.115A10.48 10.48 0 0 1 21 10.375c0 5.8-4.701 10.5-10.5 10.5v-3a7.5 7.5 0 0 0 5.007-13.084a1.5 1.5 0 0 1-.115-2.118",fill:`url(#«data-slot-icon-def-2»-${e})`,transform:"translate(1.5 1.625)"})]})]})},Fi=({className:t,color:e,size:n,...l})=>M.jsx(Se.span,{"data-slot":"spinner",...l,className:dh({className:t,color:e,size:n}),children:M.jsx(G3,{"aria-hidden":!0,"aria-label":"Loading",role:"presentation"})}),x0=Object.assign(Fi,{Root:Fi});function q3(t,e){let n=e==null?void 0:e.isDisabled,[l,r]=s.useState(!1);return ne(()=>{if(t!=null&&t.current&&!n){let o=()=>{if(t.current){let u=Fe(t.current,{tabbable:!0});r(!!u.nextNode())}};o();let i=new MutationObserver(o);return i.observe(t.current,{subtree:!0,childList:!0,attributes:!0,attributeFilter:["tabIndex","disabled"]}),()=>{i.disconnect()}}}),n?!1:l}var yd={};yd={deselectedItem:t=>`${t.item} غير المحدد`,longPressToSelect:"اضغط مطولًا للدخول إلى وضع التحديد.",select:"تحديد",selectedAll:"جميع العناصر المحددة.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"لم يتم تحديد عناصر",one:()=>`${e.number(t.count)} عنصر محدد`,other:()=>`${e.number(t.count)} عنصر محدد`})}.`,selectedItem:t=>`${t.item} المحدد`};var $d={};$d={deselectedItem:t=>`${t.item} не е избран.`,longPressToSelect:"Натиснете и задръжте за да влезете в избирателен режим.",select:"Изберете",selectedAll:"Всички елементи са избрани.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Няма избрани елементи",one:()=>`${e.number(t.count)} избран елемент`,other:()=>`${e.number(t.count)} избрани елементи`})}.`,selectedItem:t=>`${t.item} избран.`};var vd={};vd={deselectedItem:t=>`Položka ${t.item} není vybrána.`,longPressToSelect:"Dlouhým stisknutím přejdete do režimu výběru.",select:"Vybrat",selectedAll:"Vybrány všechny položky.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Nevybrány žádné položky",one:()=>`Vybrána ${e.number(t.count)} položka`,other:()=>`Vybráno ${e.number(t.count)} položek`})}.`,selectedItem:t=>`Vybrána položka ${t.item}.`};var xd={};xd={deselectedItem:t=>`${t.item} ikke valgt.`,longPressToSelect:"Lav et langt tryk for at aktivere valgtilstand.",select:"Vælg",selectedAll:"Alle elementer valgt.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Ingen elementer valgt",one:()=>`${e.number(t.count)} element valgt`,other:()=>`${e.number(t.count)} elementer valgt`})}.`,selectedItem:t=>`${t.item} valgt.`};var Cd={};Cd={deselectedItem:t=>`${t.item} nicht ausgewählt.`,longPressToSelect:"Gedrückt halten, um Auswahlmodus zu öffnen.",select:"Auswählen",selectedAll:"Alle Elemente ausgewählt.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Keine Elemente ausgewählt",one:()=>`${e.number(t.count)} Element ausgewählt`,other:()=>`${e.number(t.count)} Elemente ausgewählt`})}.`,selectedItem:t=>`${t.item} ausgewählt.`};var Ed={};Ed={deselectedItem:t=>`Δεν επιλέχθηκε το στοιχείο ${t.item}.`,longPressToSelect:"Πατήστε παρατεταμένα για να μπείτε σε λειτουργία επιλογής.",select:"Επιλογή",selectedAll:"Επιλέχθηκαν όλα τα στοιχεία.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Δεν επιλέχθηκαν στοιχεία",one:()=>`Επιλέχθηκε ${e.number(t.count)} στοιχείο`,other:()=>`Επιλέχθηκαν ${e.number(t.count)} στοιχεία`})}.`,selectedItem:t=>`Επιλέχθηκε το στοιχείο ${t.item}.`};var wd={};wd={deselectedItem:t=>`${t.item} not selected.`,select:"Select",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"No items selected",one:()=>`${e.number(t.count)} item selected`,other:()=>`${e.number(t.count)} items selected`})}.`,selectedAll:"All items selected.",selectedItem:t=>`${t.item} selected.`,longPressToSelect:"Long press to enter selection mode."};var Sd={};Sd={deselectedItem:t=>`${t.item} no seleccionado.`,longPressToSelect:"Mantenga pulsado para abrir el modo de selección.",select:"Seleccionar",selectedAll:"Todos los elementos seleccionados.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Ningún elemento seleccionado",one:()=>`${e.number(t.count)} elemento seleccionado`,other:()=>`${e.number(t.count)} elementos seleccionados`})}.`,selectedItem:t=>`${t.item} seleccionado.`};var Dd={};Dd={deselectedItem:t=>`${t.item} pole valitud.`,longPressToSelect:"Valikurežiimi sisenemiseks vajutage pikalt.",select:"Vali",selectedAll:"Kõik üksused valitud.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Üksusi pole valitud",one:()=>`${e.number(t.count)} üksus valitud`,other:()=>`${e.number(t.count)} üksust valitud`})}.`,selectedItem:t=>`${t.item} valitud.`};var kd={};kd={deselectedItem:t=>`Kohdetta ${t.item} ei valittu.`,longPressToSelect:"Siirry valintatilaan painamalla pitkään.",select:"Valitse",selectedAll:"Kaikki kohteet valittu.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Ei yhtään kohdetta valittu",one:()=>`${e.number(t.count)} kohde valittu`,other:()=>`${e.number(t.count)} kohdetta valittu`})}.`,selectedItem:t=>`${t.item} valittu.`};var Pd={};Pd={deselectedItem:t=>`${t.item} non sélectionné.`,longPressToSelect:"Appuyez de manière prolongée pour passer en mode de sélection.",select:"Sélectionner",selectedAll:"Tous les éléments sélectionnés.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Aucun élément sélectionné",one:()=>`${e.number(t.count)} élément sélectionné`,other:()=>`${e.number(t.count)} éléments sélectionnés`})}.`,selectedItem:t=>`${t.item} sélectionné.`};var Ad={};Ad={deselectedItem:t=>`${t.item} לא נבחר.`,longPressToSelect:"הקשה ארוכה לכניסה למצב בחירה.",select:"בחר",selectedAll:"כל הפריטים נבחרו.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"לא נבחרו פריטים",one:()=>`פריט ${e.number(t.count)} נבחר`,other:()=>`${e.number(t.count)} פריטים נבחרו`})}.`,selectedItem:t=>`${t.item} נבחר.`};var Td={};Td={deselectedItem:t=>`Stavka ${t.item} nije odabrana.`,longPressToSelect:"Dugo pritisnite za ulazak u način odabira.",select:"Odaberite",selectedAll:"Odabrane su sve stavke.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Nije odabrana nijedna stavka",one:()=>`Odabrana je ${e.number(t.count)} stavka`,other:()=>`Odabrano je ${e.number(t.count)} stavki`})}.`,selectedItem:t=>`Stavka ${t.item} je odabrana.`};var Bd={};Bd={deselectedItem:t=>`${t.item} nincs kijelölve.`,longPressToSelect:"Nyomja hosszan a kijelöléshez.",select:"Kijelölés",selectedAll:"Az összes elem kijelölve.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Egy elem sincs kijelölve",one:()=>`${e.number(t.count)} elem kijelölve`,other:()=>`${e.number(t.count)} elem kijelölve`})}.`,selectedItem:t=>`${t.item} kijelölve.`};var Kd={};Kd={deselectedItem:t=>`${t.item} non selezionato.`,longPressToSelect:"Premi a lungo per passare alla modalità di selezione.",select:"Seleziona",selectedAll:"Tutti gli elementi selezionati.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Nessun elemento selezionato",one:()=>`${e.number(t.count)} elemento selezionato`,other:()=>`${e.number(t.count)} elementi selezionati`})}.`,selectedItem:t=>`${t.item} selezionato.`};var Rd={};Rd={deselectedItem:t=>`${t.item} が選択されていません。`,longPressToSelect:"長押しして選択モードを開きます。",select:"選択",selectedAll:"すべての項目を選択しました。",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"項目が選択されていません",one:()=>`${e.number(t.count)} 項目を選択しました`,other:()=>`${e.number(t.count)} 項目を選択しました`})}。`,selectedItem:t=>`${t.item} を選択しました。`};var Md={};Md={deselectedItem:t=>`${t.item}이(가) 선택되지 않았습니다.`,longPressToSelect:"선택 모드로 들어가려면 길게 누르십시오.",select:"선택",selectedAll:"모든 항목이 선택되었습니다.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"선택된 항목이 없습니다",one:()=>`${e.number(t.count)}개 항목이 선택되었습니다`,other:()=>`${e.number(t.count)}개 항목이 선택되었습니다`})}.`,selectedItem:t=>`${t.item}이(가) 선택되었습니다.`};var Id={};Id={deselectedItem:t=>`${t.item} nepasirinkta.`,longPressToSelect:"Norėdami įjungti pasirinkimo režimą, paspauskite ir palaikykite.",select:"Pasirinkti",selectedAll:"Pasirinkti visi elementai.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Nepasirinktas nė vienas elementas",one:()=>`Pasirinktas ${e.number(t.count)} elementas`,other:()=>`Pasirinkta elementų: ${e.number(t.count)}`})}.`,selectedItem:t=>`Pasirinkta: ${t.item}.`};var Fd={};Fd={deselectedItem:t=>`Vienums ${t.item} nav atlasīts.`,longPressToSelect:"Ilgi turiet nospiestu. lai ieslēgtu atlases režīmu.",select:"Atlasīt",selectedAll:"Atlasīti visi vienumi.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Nav atlasīts neviens vienums",one:()=>`Atlasīto vienumu skaits: ${e.number(t.count)}`,other:()=>`Atlasīto vienumu skaits: ${e.number(t.count)}`})}.`,selectedItem:t=>`Atlasīts vienums ${t.item}.`};var Ld={};Ld={deselectedItem:t=>`${t.item} er ikke valgt.`,longPressToSelect:"Bruk et langt trykk for å gå inn i valgmodus.",select:"Velg",selectedAll:"Alle elementer er valgt.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Ingen elementer er valgt",one:()=>`${e.number(t.count)} element er valgt`,other:()=>`${e.number(t.count)} elementer er valgt`})}.`,selectedItem:t=>`${t.item} er valgt.`};var zd={};zd={deselectedItem:t=>`${t.item} niet geselecteerd.`,longPressToSelect:"Druk lang om de selectiemodus te openen.",select:"Selecteren",selectedAll:"Alle items geselecteerd.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Geen items geselecteerd",one:()=>`${e.number(t.count)} item geselecteerd`,other:()=>`${e.number(t.count)} items geselecteerd`})}.`,selectedItem:t=>`${t.item} geselecteerd.`};var Nd={};Nd={deselectedItem:t=>`Nie zaznaczono ${t.item}.`,longPressToSelect:"Naciśnij i przytrzymaj, aby wejść do trybu wyboru.",select:"Zaznacz",selectedAll:"Wszystkie zaznaczone elementy.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Nie zaznaczono żadnych elementów",one:()=>`${e.number(t.count)} zaznaczony element`,other:()=>`${e.number(t.count)} zaznaczonych elementów`})}.`,selectedItem:t=>`Zaznaczono ${t.item}.`};var Od={};Od={deselectedItem:t=>`${t.item} não selecionado.`,longPressToSelect:"Mantenha pressionado para entrar no modo de seleção.",select:"Selecionar",selectedAll:"Todos os itens selecionados.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Nenhum item selecionado",one:()=>`${e.number(t.count)} item selecionado`,other:()=>`${e.number(t.count)} itens selecionados`})}.`,selectedItem:t=>`${t.item} selecionado.`};var Vd={};Vd={deselectedItem:t=>`${t.item} não selecionado.`,longPressToSelect:"Prima continuamente para entrar no modo de seleção.",select:"Selecionar",selectedAll:"Todos os itens selecionados.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Nenhum item selecionado",one:()=>`${e.number(t.count)} item selecionado`,other:()=>`${e.number(t.count)} itens selecionados`})}.`,selectedItem:t=>`${t.item} selecionado.`};var jd={};jd={deselectedItem:t=>`${t.item} neselectat.`,longPressToSelect:"Apăsați lung pentru a intra în modul de selectare.",select:"Selectare",selectedAll:"Toate elementele selectate.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Niciun element selectat",one:()=>`${e.number(t.count)} element selectat`,other:()=>`${e.number(t.count)} elemente selectate`})}.`,selectedItem:t=>`${t.item} selectat.`};var _d={};_d={deselectedItem:t=>`${t.item} не выбрано.`,longPressToSelect:"Нажмите и удерживайте для входа в режим выбора.",select:"Выбрать",selectedAll:"Выбраны все элементы.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Нет выбранных элементов",one:()=>`${e.number(t.count)} элемент выбран`,other:()=>`${e.number(t.count)} элементов выбрано`})}.`,selectedItem:t=>`${t.item} выбрано.`};var Hd={};Hd={deselectedItem:t=>`Nevybraté položky: ${t.item}.`,longPressToSelect:"Dlhším stlačením prejdite do režimu výberu.",select:"Vybrať",selectedAll:"Všetky vybraté položky.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Žiadne vybraté položky",one:()=>`${e.number(t.count)} vybratá položka`,other:()=>`Počet vybratých položiek:${e.number(t.count)}`})}.`,selectedItem:t=>`Vybraté položky: ${t.item}.`};var Wd={};Wd={deselectedItem:t=>`Element ${t.item} ni izbran.`,longPressToSelect:"Za izbirni način pritisnite in dlje časa držite.",select:"Izberite",selectedAll:"Vsi elementi so izbrani.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Noben element ni izbran",one:()=>`${e.number(t.count)} element je izbran`,other:()=>`${e.number(t.count)} elementov je izbranih`})}.`,selectedItem:t=>`Element ${t.item} je izbran.`};var Ud={};Ud={deselectedItem:t=>`${t.item} nije izabrano.`,longPressToSelect:"Dugo pritisnite za ulazak u režim biranja.",select:"Izaberite",selectedAll:"Izabrane su sve stavke.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Nije izabrana nijedna stavka",one:()=>`Izabrana je ${e.number(t.count)} stavka`,other:()=>`Izabrano je ${e.number(t.count)} stavki`})}.`,selectedItem:t=>`${t.item} je izabrano.`};var Gd={};Gd={deselectedItem:t=>`${t.item} ej markerat.`,longPressToSelect:"Tryck länge när du vill öppna väljarläge.",select:"Markera",selectedAll:"Alla markerade objekt.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Inga markerade objekt",one:()=>`${e.number(t.count)} markerat objekt`,other:()=>`${e.number(t.count)} markerade objekt`})}.`,selectedItem:t=>`${t.item} markerat.`};var qd={};qd={deselectedItem:t=>`${t.item} seçilmedi.`,longPressToSelect:"Seçim moduna girmek için uzun basın.",select:"Seç",selectedAll:"Tüm ögeler seçildi.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Hiçbir öge seçilmedi",one:()=>`${e.number(t.count)} öge seçildi`,other:()=>`${e.number(t.count)} öge seçildi`})}.`,selectedItem:t=>`${t.item} seçildi.`};var Zd={};Zd={deselectedItem:t=>`${t.item} не вибрано.`,longPressToSelect:"Виконайте довге натиснення, щоб перейти в режим вибору.",select:"Вибрати",selectedAll:"Усі елементи вибрано.",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"Жодних елементів не вибрано",one:()=>`${e.number(t.count)} елемент вибрано`,other:()=>`Вибрано елементів: ${e.number(t.count)}`})}.`,selectedItem:t=>`${t.item} вибрано.`};var Yd={};Yd={deselectedItem:t=>`未选择 ${t.item}。`,longPressToSelect:"长按以进入选择模式。",select:"选择",selectedAll:"已选择所有项目。",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"未选择项目",one:()=>`已选择 ${e.number(t.count)} 个项目`,other:()=>`已选择 ${e.number(t.count)} 个项目`})}。`,selectedItem:t=>`已选择 ${t.item}。`};var Xd={};Xd={deselectedItem:t=>`未選取「${t.item}」。`,longPressToSelect:"長按以進入選擇模式。",select:"選取",selectedAll:"已選取所有項目。",selectedCount:(t,e)=>`${e.plural(t.count,{"=0":"未選取任何項目",one:()=>`已選取 ${e.number(t.count)} 個項目`,other:()=>`已選取 ${e.number(t.count)} 個項目`})}。`,selectedItem:t=>`已選取「${t.item}」。`};var bl={};bl={"ar-AE":yd,"bg-BG":$d,"cs-CZ":vd,"da-DK":xd,"de-DE":Cd,"el-GR":Ed,"en-US":wd,"es-ES":Sd,"et-EE":Dd,"fi-FI":kd,"fr-FR":Pd,"he-IL":Ad,"hr-HR":Td,"hu-HU":Bd,"it-IT":Kd,"ja-JP":Rd,"ko-KR":Md,"lt-LT":Id,"lv-LV":Fd,"nb-NO":Ld,"nl-NL":zd,"pl-PL":Nd,"pt-BR":Od,"pt-PT":Vd,"ro-RO":jd,"ru-RU":_d,"sk-SK":Hd,"sl-SI":Wd,"sr-SP":Ud,"sv-SE":Gd,"tr-TR":qd,"uk-UA":Zd,"zh-CN":Yd,"zh-TW":Xd};function Z3(t){return t&&t.__esModule?t.default:t}function Y3(t,e){let{getRowText:n=u=>{var a,c,f;return((c=(a=e.collection).getTextValue)==null?void 0:c.call(a,u))??((f=e.collection.getItem(u))==null?void 0:f.textValue)}}=t,l=Ne(Z3(bl),"@react-aria/grid"),r=e.selectionManager.rawSelection,o=s.useRef(r),i=s.useCallback(()=>{var d;if(!e.selectionManager.isFocused||r===o.current){o.current=r;return}let u=Li(r,o.current),a=Li(o.current,r),c=e.selectionManager.selectionBehavior==="replace",f=[];if(e.selectionManager.selectedKeys.size===1&&c){let b=e.selectionManager.selectedKeys.keys().next().value;if(b!=null&&e.collection.getItem(b)){let p=n(b);p&&f.push(l.format("selectedItem",{item:p}))}}else if(u.size===1&&a.size===0){let b=u.keys().next().value;if(b!=null){let p=n(b);p&&f.push(l.format("selectedItem",{item:p}))}}else if(a.size===1&&u.size===0){let b=a.keys().next().value;if(b!=null&&e.collection.getItem(b)){let p=n(b);p&&f.push(l.format("deselectedItem",{item:p}))}}e.selectionManager.selectionMode==="multiple"&&(f.length===0||r==="all"||r.size>1||o.current==="all"||((d=o.current)==null?void 0:d.size)>1)&&f.push(r==="all"?l.format("selectedAll"):l.format("selectedCount",{count:r.size})),f.length>0&>(f.join(" ")),o.current=r},[r,e.selectionManager.selectedKeys,e.selectionManager.isFocused,e.selectionManager.selectionBehavior,e.selectionManager.selectionMode,e.collection,n,l]);$r(()=>{if(e.selectionManager.isFocused)i();else{let u=requestAnimationFrame(i);return()=>cancelAnimationFrame(u)}},[r,e.selectionManager.isFocused])}function Li(t,e){let n=new Set;if(t==="all"||e==="all")return n;for(let l of t.keys())e.has(l)||n.add(l);return n}function X3(t){return t&&t.__esModule?t.default:t}function J3(t){let e=Ne(X3(bl),"@react-aria/grid"),n=Nu(),l=(n==="pointer"||n==="virtual"||n==null)&&typeof window<"u"&&"ontouchstart"in window,r=s.useMemo(()=>{let i=t.selectionManager.selectionMode,u=t.selectionManager.selectionBehavior,a;return l&&(a=e.format("longPressToSelect")),u==="replace"&&i!=="none"&&t.hasItemActions?a:void 0},[t.selectionManager.selectionMode,t.selectionManager.selectionBehavior,t.hasItemActions,e,l]);return mn(r)}const Q3=s.createContext({}),eg=s.createContext(null),tg=gn(function(e,n){[e,n]=xe(e,n,eg);let{validationBehavior:l}=el(Gr)||{},r=e.validationBehavior??l??"native",o=s.useRef(null);[e,o]=xe(e,o,ja);let[i,u]=Dr(!e["aria-label"]&&!e["aria-labelledby"]),[a,c]=s.useState("input"),{labelProps:f,inputProps:d,descriptionProps:b,errorMessageProps:p,...h}=Mc({...kr(e),inputElementType:a,label:u,validationBehavior:r},o),$=s.useCallback(v=>{o.current=v,v&&c(v instanceof HTMLTextAreaElement?"textarea":"input")},[o]),y=ce({...e,values:{isDisabled:e.isDisabled||!1,isInvalid:h.isInvalid,isReadOnly:e.isReadOnly||!1,isRequired:e.isRequired||!1},defaultClassName:"react-aria-TextField"}),m=ie(e,{global:!0});return delete m.id,g.createElement(le.div,{...m,...y,ref:n,slot:e.slot||void 0,"data-disabled":e.isDisabled||void 0,"data-invalid":h.isInvalid||void 0,"data-readonly":e.isReadOnly||void 0,"data-required":e.isRequired||void 0},g.createElement(_e,{values:[[tl,{...f,ref:i}],[pl,{...d,ref:$}],[Q3,{...d,ref:$}],[Ur,{role:"presentation",isInvalid:h.isInvalid,isDisabled:e.isDisabled||!1}],[Cn,{slots:{description:b,errorMessage:p}}],[Ms,h]]},y.children))}),Jd=s.createContext({}),zi=({children:t,className:e,fullWidth:n,variant:l,...r})=>{const o=g.useMemo(()=>ph({fullWidth:n}),[n]);return M.jsx(tg,{"data-slot":"textfield",...r,className:me(e,o),children:i=>M.jsx(Jd,{value:{variant:l},children:M.jsx(M.Fragment,{children:typeof t=="function"?t(i):t})})})},Ni=({className:t,fullWidth:e,variant:n,...l})=>{const r=s.useContext(Jd),o=s.useContext(wn),i=n??r.variant??o.variant;return M.jsx(K3,{className:me(t,oh({fullWidth:e,variant:i})),"data-slot":"input",...l})},C0=Object.assign(Ni,{Root:Ni}),E0=Object.assign(zi,{Root:zi}),Oi=({children:t,className:e,isDisabled:n,isInvalid:l,isRequired:r,...o})=>M.jsx(yh,{className:ih({isRequired:r,isDisabled:n,isInvalid:l,className:e}),"data-slot":"label",...o,children:t}),w0=Object.assign(Oi,{Root:Oi}),Vi=({children:t,className:e,...n})=>M.jsx(nm,{className:rh({className:e}),"data-slot":"description",slot:"description",...n,children:t}),S0=Object.assign(Vi,{Root:Vi});function ng(t){return t&&t.__esModule?t.default:t}function lg(t,e){let{key:n}=t,l=e.selectionManager,r=$e(),o=!e.selectionManager.canSelectItem(n),i=e.selectionManager.isSelected(n),u=()=>l.toggleSelection(n);const a=Ne(ng(bl),"@react-aria/grid");return{checkboxProps:{id:r,"aria-label":a.format("select"),isSelected:i,isDisabled:o,onChange:u}}}const ji=10,_i=5;class rg{setup(e,n,l){this.delegate=e,this.state=n,this.direction=l}getDropTargetFromPoint(e,n,l){let r=this.delegate.getDropTargetFromPoint(e,n,l);return!r||r.type==="root"?r:this.resolveDropTarget(r,e,n,l)}resolveDropTarget(e,n,l,r){let o=this.pointerTracking,i=l-o.lastY,u=n-o.lastX,a=o.yDirection,c=o.xDirection;if(Math.abs(i)>_i&&(a=i>0?"down":"up",o.yDirection=a,o.lastY=l),Math.abs(u)>ji&&(c=u>0?"right":"left",o.xDirection=c,o.lastX=n),e.dropPosition==="before"){let b=this.state.collection.getKeyBefore(e.key);for(;b!=null;){let p=this.state.collection.getItem(b);if((p==null?void 0:p.type)==="item")break;b=(p==null?void 0:p.parentKey)??null}if(b!=null){let p={type:"item",key:b,dropPosition:"after"};r(p)&&(e=p)}}let f=this.getPotentialTargets(e,r);if(f.length===0)return{type:"root"};let d;return f.length>1?d=this.selectTarget(f,e,n,l,a,c):(d=f[0],o.boundaryContext=null),d}getPotentialTargets(e,n){if(e.dropPosition==="on")return[e];let l=e,r=this.state.collection,o=r.getItem(l.key);for(;o&&(o==null?void 0:o.type)!=="item"&&o.nextKey!=null;)l.key=o.nextKey,o=r.getItem(o.nextKey);let i=[l];if(o&&o.hasChildNodes&&this.state.expandedKeys.has(o.key)&&r.getChildren&&l.dropPosition==="after"){let c=o.firstChildKey!=null?r.getItem(o.firstChildKey):null;for(;c&&c.type!=="item";)c=c.nextKey!=null?r.getItem(c.nextKey):null;if((c==null?void 0:c.type)==="item"){const f={type:"item",key:c.key,dropPosition:"before"};return n(f)?[f]:[]}}if((o==null?void 0:o.nextKey)!=null)return[e];let u=o==null?void 0:o.parentKey,a=[];for(;u!=null;){let c=r.getItem(u),f=(c==null?void 0:c.nextKey)!=null?r.getItem(c.nextKey):null;if(!f||f.parentKey!==u){let b={type:"item",key:u,dropPosition:"after"};if(n(b)&&a.push(b),f)break}u=c==null?void 0:c.parentKey}if(a.length>0&&i.push(...a),i.length===1){let c=r.getKeyAfter(l.key),f=c!=null?r.getItem(c):null;if(c!=null&&f&&o&&f.level!=null&&o.level!=null&&f.level>o.level){let d={type:"item",key:c,dropPosition:"before"};if(n(d))return[d]}}return i.filter(n)}selectTarget(e,n,l,r,o,i){if(e.length<2)return e[0];let u=this.pointerTracking,a=this.state.collection.getItem(n.key),c=a==null?void 0:a.parentKey;if(c==null)return e[0];if(!u.boundaryContext||u.boundaryContext.parentKey!==c){let h=u.yDirection==="up"?e.length-1:0;u.boundaryContext={parentKey:c,preferredTargetIndex:h,lastSwitchY:r,lastSwitchX:l}}let f=u.boundaryContext,d=Math.abs(l-f.lastSwitchX);if(Math.abs(r-f.lastSwitchY)>_i&&o){let h=f.preferredTargetIndex||0;o==="down"&&h===0?f.preferredTargetIndex=e.length-1:o==="up"&&h===e.length-1&&(f.preferredTargetIndex=0),u.xDirection=null}if(d>ji&&i){let h=f.preferredTargetIndex||0;i==="left"?this.direction==="ltr"?h0&&(f.preferredTargetIndex=h-1,f.lastSwitchX=l):i==="right"&&(this.direction==="ltr"?h>0&&(f.preferredTargetIndex=h-1,f.lastSwitchX=l):h{var f,d,b;let i=this.keyMap.get(o.key);e.visitNode&&(o=e.visitNode(o)),this.keyMap.set(o.key,o);let u=new Set,a=null,c=!1;if(o.type==="item"){for(let p of o.childNodes)if(((f=p.props)==null?void 0:f.colSpan)!==void 0){c=!0;break}}for(let p of o.childNodes)p.type==="cell"&&c&&(p.colspan=(d=p.props)==null?void 0:d.colSpan,p.colSpan=(b=p.props)==null?void 0:b.colSpan,p.colIndex=a?(a.colIndex??a.index)+(a.colSpan??1):p.index),p.type==="cell"&&p.parentKey==null&&(p.parentKey=o.key),u.add(p.key),a?(a.nextKey=p.key,p.prevKey=a.key):p.prevKey=null,n(p),a=p;if(a&&(a.nextKey=null),i)for(let p of i.childNodes)u.has(p.key)||l(p)},l=o=>{this.keyMap.delete(o.key);for(let i of o.childNodes)this.keyMap.get(i.key)===i&&l(i)},r=null;for(let[o,i]of e.items.entries()){let u={...i,level:i.level??0,key:i.key??"row-"+o,type:i.type??"row",value:i.value??null,hasChildNodes:!0,childNodes:[...i.childNodes],rendered:i.rendered,textValue:i.textValue??"",index:i.index??o};r?(r.nextKey=u.key,u.prevKey=r.key):u.prevKey=null,this.rows.push(u),n(u),r=u}r&&(r.nextKey=null)}*[Symbol.iterator](){yield*[...this.rows]}get size(){return[...this.rows].length}getKeys(){return this.keyMap.keys()}getKeyBefore(e){let n=this.keyMap.get(e);return n?n.prevKey??null:null}getKeyAfter(e){let n=this.keyMap.get(e);return n?n.nextKey??null:null}getFirstKey(){var e;return(e=[...this.rows][0])==null?void 0:e.key}getLastKey(){var n;let e=[...this.rows];return(n=e[e.length-1])==null?void 0:n.key}getItem(e){return this.keyMap.get(e)??null}at(e){const n=[...this.getKeys()];return this.getItem(n[e])}getChildren(e){let n=this.keyMap.get(e);return(n==null?void 0:n.childNodes)||[]}}const Qd="row-header-column-"+Math.random().toString(36).slice(2);let cr="row-header-column-"+Math.random().toString(36).slice(2);for(;Qd===cr;)cr="row-header-column-"+Math.random().toString(36).slice(2);function ef(t,e){if(e.length===0)return[];let n=[],l=new Map;for(let a of e){let c=a.parentKey,f=[a];for(;c!=null;){let d=t.get(c);if(!d)break;if(l.has(d)){d.colSpan??(d.colSpan=0),d.colSpan++,d.colspan=d.colSpan;let{column:b,index:p}=l.get(d);if(p>f.length)break;for(let h=p;ha.length)),o=Array(r).fill(0).map(()=>[]),i=0;for(let a of n){let c=r-1;for(let f of a){if(f){let d=o[c],b=d.reduce((p,h)=>p+(h.colSpan??1),0);if(b0&&(d[d.length-1].nextKey=p.key,p.prevKey=d[d.length-1].key),d.push(p)}d.length>0&&(d[d.length-1].nextKey=f.key,f.prevKey=d[d.length-1].key),f.level=c,f.colIndex=i,d.push(f)}c--}i++}let u=0;for(let a of o){let c=a.reduce((f,d)=>f+(d.colSpan??1),0);if(c({type:"headerrow",key:"headerrow-"+c,index:c,value:null,rendered:null,level:0,hasChildNodes:!0,childNodes:a,textValue:""}))}class ig extends og{constructor(e,n,l){let r=new Set,o=null,i=[];if(l!=null&&l.showSelectionCheckboxes){let d={type:"column",key:Qd,value:null,textValue:"",level:0,index:l!=null&&l.showDragButtons?1:0,hasChildNodes:!1,rendered:null,childNodes:[],props:{isSelectionCell:!0}};i.unshift(d)}if(l!=null&&l.showDragButtons){let d={type:"column",key:cr,value:null,textValue:"",level:0,index:0,hasChildNodes:!1,rendered:null,childNodes:[],props:{isDragButtonCell:!0}};i.unshift(d)}let u=[],a=new Map,c=d=>{switch(d.type){case"body":o=d;break;case"column":a.set(d.key,d),d.hasChildNodes||(i.push(d),d.props.isRowHeader&&r.add(d.key));break;case"item":u.push(d);return}for(let b of d.childNodes)c(b)};for(let d of e)c(d);let f=ef(a,i);if(f.forEach((d,b)=>u.splice(b,0,d)),super({columnCount:i.length,items:u,visitNode:d=>(d.column=i[d.index],d)}),this._size=0,this.columns=i,this.rowHeaderColumnKeys=r,this.body=o,this.headerRows=f,this._size=[...o.childNodes].length,this.rowHeaderColumnKeys.size===0){let d=this.columns.find(b=>{var p,h;return!((p=b.props)!=null&&p.isDragButtonCell)&&!((h=b.props)!=null&&h.isSelectionCell)});d&&this.rowHeaderColumnKeys.add(d.key)}}*[Symbol.iterator](){yield*this.body.childNodes}get size(){return this._size}getKeys(){return this.keyMap.keys()}getKeyBefore(e){let n=this.keyMap.get(e);return(n==null?void 0:n.prevKey)??null}getKeyAfter(e){let n=this.keyMap.get(e);return(n==null?void 0:n.nextKey)??null}getFirstKey(){var e;return((e=_r(this.body.childNodes))==null?void 0:e.key)??null}getLastKey(){var e;return((e=Ts(this.body.childNodes))==null?void 0:e.key)??null}getItem(e){return e===this.body.key?this.body:this.keyMap.get(e)??null}at(e){const n=[...this.getKeys()];return this.getItem(n[e])}getChildren(e){if(e===this.body.key)return this.body.childNodes;let n=this.getItem(e);return(n==null?void 0:n.type)==="item"?[...n.childNodes].filter(l=>l.type==="cell"):super.getChildren(e)}getTextValue(e){let n=this.getItem(e);if(!n)return"";if(n.textValue)return n.textValue;let l=this.rowHeaderColumnKeys;if(l){let r=[];for(let o of n.childNodes){let i=this.columns[o.index];if(l.has(i.key)&&o.textValue&&r.push(o.textValue),r.length===l.size)break}return r.join(" ")}return""}}function ug(t){return t!=null&&(!isNaN(t)||String(t).match(/^(\d+)(?=%$)/)!==null)}function ag(t){if(!t||typeof t=="number")return 1;let e=t.match(/^(.+)(?=fr$)/);return e?parseFloat(e[0]):1}function Jr(t,e){if(typeof t=="string"){let n=t.match(/^(\d+)(?=%$)/);if(!n)throw new Error("Only percentages or numbers are supported for static column widths");return e*(parseFloat(n[0])/100)}return t}function tf(t,e){return t!=null?Jr(t,e):Number.MAX_SAFE_INTEGER}function nf(t,e){return t!=null?Jr(t,e):0}function sg(t,e,n,l,r){let o=!1,i=e.map((u,a)=>{let c=n.get(u.key)!=null?n.get(u.key)??"1fr":u.width??u.defaultWidth??(l==null?void 0:l(a))??"1fr",f=!1,d=0,b=0,p=0;ug(c)?(d=Jr(c,t),f=!0):(b=ag(c),b<=0&&(f=!0));let h=nf(u.minWidth??(r==null?void 0:r(a))??0,t),$=tf(u.maxWidth,t),y=Math.max(h,Math.min(d,$));return f?p=y:d>y&&(f=!0,p=y),f||(o=!0),{frozen:f,baseSize:d,hypotheticalMainSize:y,min:h,max:$,flex:b,targetMainSize:p,violation:0}});for(;o;){let u=0,a=0;i.forEach(d=>{d.frozen?u+=d.targetMainSize:(u+=d.baseSize,a+=d.flex)});let c=t-u;c>0&&i.forEach(d=>{if(!d.frozen){let b=d.flex/a;d.targetMainSize=d.baseSize+b*c}});let f=0;i.forEach(d=>{if(d.violation=0,!d.frozen){let{min:b,max:p,targetMainSize:h}=d;d.targetMainSize=Math.max(b,Math.min(h,p)),d.violation=d.targetMainSize-h,f+=d.violation}}),o=!1,i.forEach(d=>{f===0||Math.sign(f)===Math.sign(d.violation)?d.frozen=!0:d.frozen||(o=!0)})}return cg(i)}function cg(t){let e=0,n=0,l=[];return t.forEach(function(r){let o=r.targetMainSize,i=Math.round(o+e)-n;e+=o,n+=i,l.push(i)}),l}class dg{constructor(e){this.columnWidths=new Map,this.columnMinWidths=new Map,this.columnMaxWidths=new Map,this.getDefaultWidth=(e==null?void 0:e.getDefaultWidth)??(()=>"1fr"),this.getDefaultMinWidth=(e==null?void 0:e.getDefaultMinWidth)??(()=>75)}splitColumnsIntoControlledAndUncontrolled(e){return e.reduce((n,l)=>(l.props.width!=null?n[0].set(l.key,l):n[1].set(l.key,l),n),[new Map,new Map])}recombineColumns(e,n,l,r){return new Map(e.map(o=>l.has(o.key)?[o.key,n.get(o.key)]:[o.key,r.get(o.key).props.width]))}getInitialUncontrolledWidths(e){return new Map(Array.from(e).map(([n,l])=>{var r;return[n,l.props.defaultWidth??((r=this.getDefaultWidth)==null?void 0:r.call(this,l))??"1fr"]}))}getColumnWidth(e){return this.columnWidths.get(e)??0}getColumnMinWidth(e){return this.columnMinWidths.get(e)??0}getColumnMaxWidth(e){return this.columnMaxWidths.get(e)??0}resizeColumnWidth(e,n,l,r){let o=this.columnWidths,i=!0,u=new Map;return r=Math.max(this.getColumnMinWidth(l),Math.min(this.getColumnMaxWidth(l),Math.floor(r))),e.columns.forEach(a=>{a.key===l?(u.set(a.key,r),i=!1):i?u.set(a.key,o.get(a.key)??0):u.set(a.key,a.props.width??n.get(a.key))}),u}buildColumnWidths(e,n,l){return this.columnWidths=new Map,this.columnMinWidths=new Map,this.columnMaxWidths=new Map,sg(e,n.columns.map(o=>({...o.props,key:o.key})),l,o=>this.getDefaultWidth(n.columns[o]),o=>this.getDefaultMinWidth(n.columns[o])).forEach((o,i)=>{let u=n.columns[i].key,a=n.columns[i];this.columnWidths.set(u,o),this.columnMinWidths.set(u,nf(a.props.minWidth??this.getDefaultMinWidth(a),e)),this.columnMaxWidths.set(u,tf(a.props.maxWidth,e))}),this.columnWidths}}function fg(t,e){let{getDefaultWidth:n,getDefaultMinWidth:l,tableWidth:r=0}=t,[o,i]=s.useState(null),u=s.useMemo(()=>new dg({getDefaultWidth:n,getDefaultMinWidth:l}),[n,l]),[a,c]=s.useMemo(()=>u.splitColumnsIntoControlledAndUncontrolled(e.collection.columns),[e.collection.columns,u]),[f,d]=s.useState(()=>u.getInitialUncontrolledWidths(c)),[b,p]=s.useState(e.collection.columns);if(e.collection.columns!==b){if(e.collection.columns.length!==b.length||e.collection.columns.some((E,C)=>E.key!==b[C].key)){let E=u.getInitialUncontrolledWidths(c);d(E)}p(e.collection.columns)}let h=s.useMemo(()=>u.recombineColumns(e.collection.columns,f,c,a),[e.collection.columns,f,c,a,u]),$=s.useCallback(E=>{i(E)},[i]),y=s.useCallback((E,C)=>{let R=u.resizeColumnWidth(e.collection,f,E,C),A=new Map(Array.from(c).map(([K])=>[K,R.get(K)]));return A.set(E,C),d(A),R},[c,d,u,e.collection,f]),m=s.useCallback(()=>{i(null)},[i]),v=s.useMemo(()=>u.buildColumnWidths(r,e.collection,h),[r,e.collection,h,u]);return s.useMemo(()=>({resizingColumn:o,updateResizedColumns:y,startResize:$,endResize:m,getColumnWidth:E=>u.getColumnWidth(E),getColumnMinWidth:E=>u.getColumnMinWidth(E),getColumnMaxWidth:E=>u.getColumnMaxWidth(E),tableState:e,columnWidths:v}),[u,v,o,y,$,m,e])}function pg(t){let{collection:e,focusMode:n}=t,l=t.UNSAFE_selectionState||Hr(t),r=s.useMemo(()=>t.disabledKeys?new Set(t.disabledKeys):new Set,[t.disabledKeys]),o=l.setFocusedKey;l.setFocusedKey=(a,c)=>{var f,d;if(n==="cell"&&a!=null){let b=e.getItem(a);if((b==null?void 0:b.type)==="item"){let p=Zn(b,e);c==="last"?a=((f=Ts(p))==null?void 0:f.key)??null:a=((d=_r(p))==null?void 0:d.key)??null}}o(a,c)};let i=s.useMemo(()=>new cl(e,l),[e,l]);const u=s.useRef(null);return s.useEffect(()=>{if(l.focusedKey!=null&&u.current&&!e.getItem(l.focusedKey)){const a=u.current.getItem(l.focusedKey),c=(a==null?void 0:a.parentKey)!=null&&(a.type==="cell"||a.type==="rowheader"||a.type==="column")?u.current.getItem(a.parentKey):a;if(!c){l.setFocusedKey(null);return}const f=u.current.rows,d=e.rows,b=f.length-d.length;let p=Math.min(b>1?Math.max(c.index-b+1,0):c.index,d.length-1),h=null;for(;p>=0;){if(!i.isDisabled(d[p].key)&&d[p].type!=="headerrow"){h=d[p];break}pc.index&&(p=c.index),p--)}if(h){const $=h.hasChildNodes?[...Zn(h,e)]:[],y=h.hasChildNodes&&c!==a&&a&&a.index<$.length?$[a.index].key:h.key;l.setFocusedKey(y)}else l.setFocusedKey(null)}u.current=e},[e,i,l,l.focusedKey]),{collection:e,disabledKeys:r,isKeyboardNavigationDisabled:!1,selectionManager:i}}const bg={ascending:"descending",descending:"ascending"};function hg(t){let[e,n]=s.useState(!1),{selectionMode:l="none",showSelectionCheckboxes:r,showDragButtons:o,treeColumn:i=null}=t,u=s.useMemo(()=>({showSelectionCheckboxes:r&&l!=="none",showDragButtons:o,selectionMode:l,columns:[]}),[t.children,r,l,o]),a=Bs(t,s.useCallback(p=>new ig(p,null,u),[u]),u),{disabledKeys:c,selectionManager:f}=pg({...t,collection:a,disabledBehavior:t.disabledBehavior||"selection"}),[d,b]=Ct(t.expandedKeys?new Set(t.expandedKeys):void 0,t.defaultExpandedKeys?new Set(t.defaultExpandedKeys):new Set,t.onExpandedChange);return{collection:a,disabledKeys:c,selectionManager:f,showSelectionCheckboxes:t.showSelectionCheckboxes||!1,sortDescriptor:t.sortDescriptor??null,isKeyboardNavigationDisabled:a.size===0||e,setKeyboardNavigationDisabled:n,sort(p,h){var $,y;(y=t.onSortChange)==null||y.call(t,{column:p,direction:h??((($=t.sortDescriptor)==null?void 0:$.column)===p?bg[t.sortDescriptor.direction]:"ascending")})},expandedKeys:d,toggleKey(p){b(h=>{let $=new Set(h);return $.has(p)?$.delete(p):$.add(p),$})},treeColumn:i}}function mg(t,e){let n=s.useMemo(()=>e?t.collection.filter(e):t.collection,[t.collection,e]),l=t.selectionManager.withCollection(n);return{...t,collection:n,selectionManager:l}}class lf{constructor(e){if(this.collection=e.collection,this.disabledKeys=e.disabledKeys,this.disabledBehavior=e.disabledBehavior||"all",this.direction=e.direction,this.collator=e.collator,!e.layout&&!e.ref)throw new Error("Either a layout or a ref must be specified.");this.layoutDelegate=e.layoutDelegate||(e.layout?new gg(e.layout):new ir(e.ref)),this.focusMode=e.focusMode??"row"}isCell(e){return e.type==="cell"}isRow(e){return e.type==="row"||e.type==="item"}isDisabled(e){var n,l;return this.disabledBehavior==="all"&&(((n=e.props)==null?void 0:n.isDisabled)||this.disabledKeys.has(e.key))&&((l=e.props)==null?void 0:l.disabledBehavior)!=="selection"}findPreviousKey(e,n,l=!1){let r=e!=null?this.collection.getKeyBefore(e):this.collection.getLastKey();for(;r!=null;){let o=this.collection.getItem(r);if(!o)return null;if((l||!this.isDisabled(o))&&(!n||n(o)))return r;r=this.collection.getKeyBefore(r)}return null}findNextKey(e,n,l=!1){let r=e!=null?this.collection.getKeyAfter(e):this.collection.getFirstKey();for(;r!=null;){let o=this.collection.getItem(r);if(!o)return null;if((l||!this.isDisabled(o))&&(!n||n(o)))return r;if(r=this.collection.getKeyAfter(r),r==null)return null}return null}getKeyForItemInRowByIndex(e,n=0){if(n<0)return null;let l=this.collection.getItem(e);if(!l)return null;let r=0;for(let o of Ce(l,this.collection)){if(o.colSpan&&o.colSpan+r>n||(o.colSpan&&(r=r+o.colSpan-1),r===n))return o.key??null;r++}return null}getKeyBelow(e,n){let l=e,r=this.collection.getItem(l);if(!r||(this.isCell(r)&&(l=r.parentKey??null),l==null))return null;if(l=this.findNextKey(l,o=>o.type==="item",n==null?void 0:n.includeDisabled),l!=null){if(this.isCell(r)){let o=r.colIndex?r.colIndex:r.index;return this.getKeyForItemInRowByIndex(l,o)}if(this.focusMode==="row")return l}return null}getKeyAbove(e,n){let l=e,r=this.collection.getItem(l);if(!r||(this.isCell(r)&&(l=r.parentKey??null),l==null))return null;if(l=this.findPreviousKey(l,o=>o.type==="item",n==null?void 0:n.includeDisabled),l!=null){if(this.isCell(r)){let o=r.colIndex?r.colIndex:r.index;return this.getKeyForItemInRowByIndex(l,o)}if(this.focusMode==="row")return l}return null}getKeyRightOf(e){var l,r;let n=this.collection.getItem(e);if(!n)return null;if(this.isRow(n)){let o=Ce(n,this.collection);return(this.direction==="rtl"?(l=In(o))==null?void 0:l.key:(r=Pt(o))==null?void 0:r.key)??null}if(this.isCell(n)&&n.parentKey!=null){let o=this.collection.getItem(n.parentKey);if(!o)return null;let i=Ce(o,this.collection),u=(this.direction==="rtl"?en(i,n.index-1):en(i,n.index+1))??null;return u?u.key??null:this.focusMode==="row"?n.parentKey??null:(this.direction==="rtl"?this.getFirstKey(e):this.getLastKey(e))??null}return null}getKeyLeftOf(e){var l,r;let n=this.collection.getItem(e);if(!n)return null;if(this.isRow(n)){let o=Ce(n,this.collection);return(this.direction==="rtl"?(l=Pt(o))==null?void 0:l.key:(r=In(o))==null?void 0:r.key)??null}if(this.isCell(n)&&n.parentKey!=null){let o=this.collection.getItem(n.parentKey);if(!o)return null;let i=Ce(o,this.collection),u=(this.direction==="rtl"?en(i,n.index+1):en(i,n.index-1))??null;return u?u.key??null:this.focusMode==="row"?n.parentKey??null:(this.direction==="rtl"?this.getLastKey(e):this.getFirstKey(e))??null}return null}getFirstKey(e,n){var o,i;let l=e??null,r;if(l!=null){if(r=this.collection.getItem(l),!r)return null;if(this.isCell(r)&&!n&&r.parentKey!=null){let u=this.collection.getItem(r.parentKey);return u?((o=Pt(Ce(u,this.collection)))==null?void 0:o.key)??null:null}}if(l=this.findNextKey(void 0,u=>u.type==="item"),l!=null&&(r&&this.isCell(r)&&n||this.focusMode==="cell")){let u=this.collection.getItem(l);if(!u)return null;l=((i=Pt(Ce(u,this.collection)))==null?void 0:i.key)??null}return l}getLastKey(e,n){var o,i;let l=e??null,r;if(l!=null){if(r=this.collection.getItem(l),!r)return null;if(this.isCell(r)&&!n&&r.parentKey!=null){let u=this.collection.getItem(r.parentKey);if(!u)return null;let a=Ce(u,this.collection);return((o=In(a))==null?void 0:o.key)??null}}if(l=this.findPreviousKey(void 0,u=>u.type==="item"),l!=null&&(r&&this.isCell(r)&&n||this.focusMode==="cell")){let u=this.collection.getItem(l);if(!u)return null;let a=Ce(u,this.collection);l=((i=In(a))==null?void 0:i.key)??null}return l}getKeyPageAbove(e){let n=e,l=this.layoutDelegate.getItemRect(n);if(!l)return null;let r=Math.max(0,l.y+l.height-this.layoutDelegate.getVisibleRect().height);for(;l&&l.y>r&&n!=null&&(n=this.getKeyAbove(n)??null,n!=null);)l=this.layoutDelegate.getItemRect(n);return n}getKeyPageBelow(e){let n=e,l=this.layoutDelegate.getItemRect(n);if(!l)return null;let r=this.layoutDelegate.getVisibleRect().height,o=Math.min(this.layoutDelegate.getContentSize().height,l.y+r);for(;l&&l.y+l.heightc.type==="item"),l==null&&!i&&(l=this.getFirstKey(),i=!0)}return null}}class gg{constructor(e){this.layout=e}getContentSize(){return this.layout.getContentSize()}getItemRect(e){var n;return((n=this.layout.getLayoutInfo(e))==null?void 0:n.rect)||null}getVisibleRect(){return this.layout.virtualizer.visibleRect}}const Qr=new WeakMap;function yg(t,e,n){let{isVirtualized:l,disallowTypeAhead:r,keyboardDelegate:o,focusMode:i,scrollRef:u,getRowText:a,onRowAction:c,onCellAction:f,escapeKeyBehavior:d="clearSelection",shouldSelectOnPressUp:b}=t,{selectionManager:p}=e;!t["aria-label"]&&!t["aria-labelledby"]&&console.warn("An aria-label or aria-labelledby prop is required for accessibility.");let h=En({usage:"search",sensitivity:"base"}),{direction:$}=Re(),y=e.selectionManager.disabledBehavior,m=s.useMemo(()=>o||new lf({collection:e.collection,disabledKeys:e.disabledKeys,disabledBehavior:y,ref:n,direction:$,collator:h,focusMode:i}),[o,e.collection,e.disabledKeys,y,n,$,h,i]),{collectionProps:v}=Vr({ref:n,selectionManager:p,keyboardDelegate:m,isVirtualized:l,scrollRef:u,disallowTypeAhead:r,escapeKeyBehavior:d}),E=$e(t.id);Qr.set(e,{keyboardDelegate:m,actions:{onRowAction:c,onCellAction:f},shouldSelectOnPressUp:b});let C=J3({selectionManager:p,hasItemActions:!!(c||f)}),R=ie(t,{labelable:!0}),A=s.useCallback(B=>{if(p.isFocused){te(B.currentTarget,j(B))||p.setFocused(!1);return}te(B.currentTarget,j(B))&&p.setFocused(!0)},[p]),K=s.useMemo(()=>({onBlur:v.onBlur,onFocus:A}),[A,v.onBlur]),P=q3(n,{isDisabled:e.collection.size!==0}),z=G(R,{role:"grid",id:E,"aria-multiselectable":p.selectionMode==="multiple"?"true":void 0},e.isKeyboardNavigationDisabled?K:v,e.collection.size===0&&{tabIndex:P?-1:0}||void 0,C);return l&&(z["aria-rowcount"]=e.collection.size,z["aria-colcount"]=e.collection.columnCount),Y3({getRowText:a},e),{gridProps:z}}const eo=new WeakMap;function dr(t){return typeof t=="string"?t.replace(/\s*/g,""):""+t}function rf(t,e){let n=eo.get(t);if(!n)throw new Error("Unknown grid");return`${n}-${dr(e)}`}function of(t,e,n){let l=eo.get(t);if(!l)throw new Error("Unknown grid");return`${l}-${dr(e)}-${dr(n)}`}function fr(t,e){return[...t.collection.rowHeaderColumnKeys].map(n=>of(t,e,n)).join(" ")}var uf={};uf={ascending:"تصاعدي",ascendingSort:t=>`ترتيب حسب العمود ${t.columnName} بترتيب تصاعدي`,columnSize:t=>`${t.value} بالبكسل`,descending:"تنازلي",descendingSort:t=>`ترتيب حسب العمود ${t.columnName} بترتيب تنازلي`,resizerDescription:"اضغط على مفتاح Enter لبدء تغيير الحجم",select:"تحديد",selectAll:"تحديد الكل",sortable:"عمود قابل للترتيب",collapse:"طي",expand:"تمديد"};var af={};af={ascending:"възходящ",ascendingSort:t=>`сортирано по колона ${t.columnName} във възходящ ред`,columnSize:t=>`${t.value} пиксела`,descending:"низходящ",descendingSort:t=>`сортирано по колона ${t.columnName} в низходящ ред`,resizerDescription:"Натиснете „Enter“, за да започнете да преоразмерявате",select:"Изберете",selectAll:"Изберете всичко",sortable:"сортираща колона",collapse:"Свиване",expand:"Разширяване"};var sf={};sf={ascending:"vzestupně",ascendingSort:t=>`řazeno vzestupně podle sloupce ${t.columnName}`,columnSize:t=>`${t.value} pixelů`,descending:"sestupně",descendingSort:t=>`řazeno sestupně podle sloupce ${t.columnName}`,resizerDescription:"Stisknutím klávesy Enter začnete měnit velikost",select:"Vybrat",selectAll:"Vybrat vše",sortable:"sloupec s možností řazení",collapse:"Sbalit",expand:"Roztáhnout"};var cf={};cf={ascending:"stigende",ascendingSort:t=>`sorteret efter kolonne ${t.columnName} i stigende rækkefølge`,columnSize:t=>`${t.value} pixels`,descending:"faldende",descendingSort:t=>`sorteret efter kolonne ${t.columnName} i faldende rækkefølge`,resizerDescription:"Tryk på Enter for at ændre størrelse",select:"Vælg",selectAll:"Vælg alle",sortable:"sorterbar kolonne",collapse:"Skjul",expand:"Udvid"};var df={};df={ascending:"aufsteigend",ascendingSort:t=>`sortiert nach Spalte ${t.columnName} in aufsteigender Reihenfolge`,columnSize:t=>`${t.value} Pixel`,descending:"absteigend",descendingSort:t=>`sortiert nach Spalte ${t.columnName} in absteigender Reihenfolge`,resizerDescription:"Eingabetaste zum Starten der Größenänderung drücken",select:"Auswählen",selectAll:"Alles auswählen",sortable:"sortierbare Spalte",collapse:"Reduzieren",expand:"Erweitern"};var ff={};ff={ascending:"αύξουσα",ascendingSort:t=>`διαλογή ανά στήλη ${t.columnName} σε αύξουσα σειρά`,columnSize:t=>`${t.value} pixel`,descending:"φθίνουσα",descendingSort:t=>`διαλογή ανά στήλη ${t.columnName} σε φθίνουσα σειρά`,resizerDescription:"Πατήστε Enter για έναρξη της αλλαγής μεγέθους",select:"Επιλογή",selectAll:"Επιλογή όλων",sortable:"Στήλη διαλογής",collapse:"Σύμπτυξη",expand:"Ανάπτυξη"};var pf={};pf={select:"Select",selectAll:"Select All",sortable:"sortable column",ascending:"ascending",descending:"descending",ascendingSort:t=>`sorted by column ${t.columnName} in ascending order`,descendingSort:t=>`sorted by column ${t.columnName} in descending order`,columnSize:t=>`${t.value} pixels`,resizerDescription:"Press Enter to start resizing",expand:"Expand",collapse:"Collapse"};var bf={};bf={ascending:"ascendente",ascendingSort:t=>`ordenado por columna ${t.columnName} en sentido ascendente`,columnSize:t=>`${t.value} píxeles`,descending:"descendente",descendingSort:t=>`ordenado por columna ${t.columnName} en orden descendente`,resizerDescription:"Pulse Intro para empezar a redimensionar",select:"Seleccionar",selectAll:"Seleccionar todos",sortable:"columna ordenable",collapse:"Contraer",expand:"Ampliar"};var hf={};hf={ascending:"tõusev järjestus",ascendingSort:t=>`sorditud veeru järgi ${t.columnName} tõusvas järjestuses`,columnSize:t=>`${t.value} pikslit`,descending:"laskuv järjestus",descendingSort:t=>`sorditud veeru järgi ${t.columnName} laskuvas järjestuses`,resizerDescription:"Suuruse muutmise alustamiseks vajutage klahvi Enter",select:"Vali",selectAll:"Vali kõik",sortable:"sorditav veerg",collapse:"Ahenda",expand:"Laienda"};var mf={};mf={ascending:"nouseva",ascendingSort:t=>`lajiteltu sarakkeen ${t.columnName} mukaan nousevassa järjestyksessä`,columnSize:t=>`${t.value} pikseliä`,descending:"laskeva",descendingSort:t=>`lajiteltu sarakkeen ${t.columnName} mukaan laskevassa järjestyksessä`,resizerDescription:"Aloita koon muutos painamalla Enter-näppäintä",select:"Valitse",selectAll:"Valitse kaikki",sortable:"lajiteltava sarake",collapse:"Pienennä",expand:"Laajenna"};var gf={};gf={ascending:"croissant",ascendingSort:t=>`trié en fonction de la colonne ${t.columnName} par ordre croissant`,columnSize:t=>`${t.value} pixels`,descending:"décroissant",descendingSort:t=>`trié en fonction de la colonne ${t.columnName} par ordre décroissant`,resizerDescription:"Appuyez sur Entrée pour commencer le redimensionnement.",select:"Sélectionner",selectAll:"Sélectionner tout",sortable:"colonne triable",collapse:"Réduire",expand:"Développer"};var yf={};yf={ascending:"עולה",ascendingSort:t=>`מוין לפי עמודה ${t.columnName} בסדר עולה`,columnSize:t=>`${t.value} פיקסלים`,descending:"יורד",descendingSort:t=>`מוין לפי עמודה ${t.columnName} בסדר יורד`,resizerDescription:"הקש Enter כדי לשנות את הגודל",select:"בחר",selectAll:"בחר הכול",sortable:"עמודה שניתן למיין",collapse:"כווץ",expand:"הרחב"};var $f={};$f={ascending:"rastući",ascendingSort:t=>`razvrstano po stupcima ${t.columnName} rastućem redoslijedom`,columnSize:t=>`${t.value} piksela`,descending:"padajući",descendingSort:t=>`razvrstano po stupcima ${t.columnName} padajućim redoslijedom`,resizerDescription:"Pritisnite Enter da biste započeli promenu veličine",select:"Odaberite",selectAll:"Odaberite sve",sortable:"stupac koji se može razvrstati",collapse:"Sažmi",expand:"Proširi"};var vf={};vf={ascending:"növekvő",ascendingSort:t=>`rendezve a(z) ${t.columnName} oszlop szerint, növekvő sorrendben`,columnSize:t=>`${t.value} képpont`,descending:"csökkenő",descendingSort:t=>`rendezve a(z) ${t.columnName} oszlop szerint, csökkenő sorrendben`,resizerDescription:"Nyomja le az Enter billentyűt az átméretezés megkezdéséhez",select:"Kijelölés",selectAll:"Összes kijelölése",sortable:"rendezendő oszlop",collapse:"Összecsukás",expand:"Kibontás"};var xf={};xf={ascending:"crescente",ascendingSort:t=>`in ordine crescente in base alla colonna ${t.columnName}`,columnSize:t=>`${t.value} pixel`,descending:"decrescente",descendingSort:t=>`in ordine decrescente in base alla colonna ${t.columnName}`,resizerDescription:"Premi Invio per iniziare a ridimensionare",select:"Seleziona",selectAll:"Seleziona tutto",sortable:"colonna ordinabile",collapse:"Comprimi",expand:"Espandi"};var Cf={};Cf={ascending:"昇順",ascendingSort:t=>`列 ${t.columnName} を昇順で並べ替え`,columnSize:t=>`${t.value} ピクセル`,descending:"降順",descendingSort:t=>`列 ${t.columnName} を降順で並べ替え`,resizerDescription:"Enter キーを押してサイズ変更を開始",select:"選択",selectAll:"すべて選択",sortable:"並べ替え可能な列",collapse:"折りたたむ",expand:"展開"};var Ef={};Ef={ascending:"오름차순",ascendingSort:t=>`${t.columnName} 열을 기준으로 오름차순으로 정렬됨`,columnSize:t=>`${t.value} 픽셀`,descending:"내림차순",descendingSort:t=>`${t.columnName} 열을 기준으로 내림차순으로 정렬됨`,resizerDescription:"크기 조정을 시작하려면 Enter를 누르세요.",select:"선택",selectAll:"모두 선택",sortable:"정렬 가능한 열",collapse:"접기",expand:"펼치기"};var wf={};wf={ascending:"didėjančia tvarka",ascendingSort:t=>`surikiuota pagal stulpelį ${t.columnName} didėjančia tvarka`,columnSize:t=>`${t.value} piks.`,descending:"mažėjančia tvarka",descendingSort:t=>`surikiuota pagal stulpelį ${t.columnName} mažėjančia tvarka`,resizerDescription:"Paspauskite „Enter“, kad pradėtumėte keisti dydį",select:"Pasirinkti",selectAll:"Pasirinkti viską",sortable:"rikiuojamas stulpelis",collapse:"Sutraukti",expand:"Išskleisti"};var Sf={};Sf={ascending:"augošā secībā",ascendingSort:t=>`kārtots pēc kolonnas ${t.columnName} augošā secībā`,columnSize:t=>`${t.value} pikseļi`,descending:"dilstošā secībā",descendingSort:t=>`kārtots pēc kolonnas ${t.columnName} dilstošā secībā`,resizerDescription:"Nospiediet Enter, lai sāktu izmēru mainīšanu",select:"Atlasīt",selectAll:"Atlasīt visu",sortable:"kārtojamā kolonna",collapse:"Sakļaut",expand:"Izvērst"};var Df={};Df={ascending:"stigende",ascendingSort:t=>`sortert etter kolonne ${t.columnName} i stigende rekkefølge`,columnSize:t=>`${t.value} piksler`,descending:"synkende",descendingSort:t=>`sortert etter kolonne ${t.columnName} i synkende rekkefølge`,resizerDescription:"Trykk på Enter for å starte størrelsesendring",select:"Velg",selectAll:"Velg alle",sortable:"kolonne som kan sorteres",collapse:"Skjul",expand:"Utvid"};var kf={};kf={ascending:"oplopend",ascendingSort:t=>`gesorteerd in oplopende volgorde in kolom ${t.columnName}`,columnSize:t=>`${t.value} pixels`,descending:"aflopend",descendingSort:t=>`gesorteerd in aflopende volgorde in kolom ${t.columnName}`,resizerDescription:"Druk op Enter om het formaat te wijzigen",select:"Selecteren",selectAll:"Alles selecteren",sortable:"sorteerbare kolom",collapse:"Samenvouwen",expand:"Uitvouwen"};var Pf={};Pf={ascending:"rosnąco",ascendingSort:t=>`posortowano według kolumny ${t.columnName} w porządku rosnącym`,columnSize:t=>`Liczba pikseli: ${t.value}`,descending:"malejąco",descendingSort:t=>`posortowano według kolumny ${t.columnName} w porządku malejącym`,resizerDescription:"Naciśnij Enter, aby rozpocząć zmienianie rozmiaru",select:"Zaznacz",selectAll:"Zaznacz wszystko",sortable:"kolumna z możliwością sortowania",collapse:"Zwiń",expand:"Rozwiń"};var Af={};Af={ascending:"crescente",ascendingSort:t=>`classificado pela coluna ${t.columnName} em ordem crescente`,columnSize:t=>`${t.value} pixels`,descending:"decrescente",descendingSort:t=>`classificado pela coluna ${t.columnName} em ordem decrescente`,resizerDescription:"Pressione Enter para começar a redimensionar",select:"Selecionar",selectAll:"Selecionar tudo",sortable:"coluna classificável",collapse:"Recolher",expand:"Expandir"};var Tf={};Tf={ascending:"ascendente",ascendingSort:t=>`Ordenar por coluna ${t.columnName} em ordem ascendente`,columnSize:t=>`${t.value} pixels`,descending:"descendente",descendingSort:t=>`Ordenar por coluna ${t.columnName} em ordem descendente`,resizerDescription:"Prima Enter para iniciar o redimensionamento",select:"Selecionar",selectAll:"Selecionar tudo",sortable:"Coluna ordenável",collapse:"Colapsar",expand:"Expandir"};var Bf={};Bf={ascending:"crescătoare",ascendingSort:t=>`sortate după coloana ${t.columnName} în ordine crescătoare`,columnSize:t=>`${t.value} pixeli`,descending:"descrescătoare",descendingSort:t=>`sortate după coloana ${t.columnName} în ordine descrescătoare`,resizerDescription:"Apăsați pe Enter pentru a începe redimensionarea",select:"Selectare",selectAll:"Selectare totală",sortable:"coloană sortabilă",collapse:"Restrângeți",expand:"Extindeți"};var Kf={};Kf={ascending:"возрастание",ascendingSort:t=>`сортировать столбец ${t.columnName} в порядке возрастания`,columnSize:t=>`${t.value} пикс.`,descending:"убывание",descendingSort:t=>`сортировать столбец ${t.columnName} в порядке убывания`,resizerDescription:"Нажмите клавишу Enter для начала изменения размеров",select:"Выбрать",selectAll:"Выбрать все",sortable:"сортируемый столбец",collapse:"Свернуть",expand:"Развернуть"};var Rf={};Rf={ascending:"vzostupne",ascendingSort:t=>`zoradené zostupne podľa stĺpca ${t.columnName}`,columnSize:t=>`Počet pixelov: ${t.value}`,descending:"zostupne",descendingSort:t=>`zoradené zostupne podľa stĺpca ${t.columnName}`,resizerDescription:"Stlačením klávesu Enter začnete zmenu veľkosti",select:"Vybrať",selectAll:"Vybrať všetko",sortable:"zoraditeľný stĺpec",collapse:"Zbaliť",expand:"Rozbaliť"};var Mf={};Mf={ascending:"naraščajoče",ascendingSort:t=>`razvrščeno po stolpcu ${t.columnName} v naraščajočem vrstnem redu`,columnSize:t=>`${t.value} slikovnih pik`,descending:"padajoče",descendingSort:t=>`razvrščeno po stolpcu ${t.columnName} v padajočem vrstnem redu`,resizerDescription:"Pritisnite tipko Enter da začnete spreminjati velikost",select:"Izberite",selectAll:"Izberite vse",sortable:"razvrstljivi stolpec",collapse:"Strni",expand:"Razširi"};var If={};If={ascending:"rastući",ascendingSort:t=>`sortirano po kolonama ${t.columnName} rastućim redosledom`,columnSize:t=>`${t.value} piksela`,descending:"padajući",descendingSort:t=>`sortirano po kolonama ${t.columnName} padajućim redosledom`,resizerDescription:"Pritisnite Enter da biste započeli promenu veličine",select:"Izaberite",selectAll:"Izaberite sve",sortable:"kolona koja se može sortirati",collapse:" Skupi",expand:"Proširi"};var Ff={};Ff={ascending:"stigande",ascendingSort:t=>`sorterat på kolumn ${t.columnName} i stigande ordning`,columnSize:t=>`${t.value} pixlar`,descending:"fallande",descendingSort:t=>`sorterat på kolumn ${t.columnName} i fallande ordning`,resizerDescription:"Tryck på Retur för att börja ändra storlek",select:"Markera",selectAll:"Markera allt",sortable:"sorterbar kolumn",collapse:"Dölj",expand:"Expandera"};var Lf={};Lf={ascending:"artan sırada",ascendingSort:t=>`${t.columnName} sütuna göre artan düzende sırala`,columnSize:t=>`${t.value} piksel`,descending:"azalan sırada",descendingSort:t=>`${t.columnName} sütuna göre azalan düzende sırala`,resizerDescription:"Yeniden boyutlandırmak için Enter'a basın",select:"Seç",selectAll:"Tümünü Seç",sortable:"Sıralanabilir sütun",collapse:"Daralt",expand:"Genişlet"};var zf={};zf={ascending:"висхідний",ascendingSort:t=>`відсортовано за стовпцем ${t.columnName} у висхідному порядку`,columnSize:t=>`${t.value} пікс.`,descending:"низхідний",descendingSort:t=>`відсортовано за стовпцем ${t.columnName} у низхідному порядку`,resizerDescription:"Натисніть Enter, щоб почати зміну розміру",select:"Вибрати",selectAll:"Вибрати все",sortable:"сортувальний стовпець",collapse:"Згорнути",expand:"Розгорнути"};var Nf={};Nf={ascending:"升序",ascendingSort:t=>`按列 ${t.columnName} 升序排序`,columnSize:t=>`${t.value} 像素`,descending:"降序",descendingSort:t=>`按列 ${t.columnName} 降序排序`,resizerDescription:"按“输入”键开始调整大小。",select:"选择",selectAll:"全选",sortable:"可排序的列",collapse:"折叠",expand:"扩展"};var Of={};Of={ascending:"遞增",ascendingSort:t=>`已依據「${t.columnName}」欄遞增排序`,columnSize:t=>`${t.value} 像素`,descending:"遞減",descendingSort:t=>`已依據「${t.columnName}」欄遞減排序`,resizerDescription:"按 Enter 鍵以開始調整大小",select:"選取",selectAll:"全選",sortable:"可排序的欄",collapse:"收合",expand:"展開"};var Wt={};Wt={"ar-AE":uf,"bg-BG":af,"cs-CZ":sf,"da-DK":cf,"de-DE":df,"el-GR":ff,"en-US":pf,"es-ES":bf,"et-EE":hf,"fi-FI":mf,"fr-FR":gf,"he-IL":yf,"hr-HR":$f,"hu-HU":vf,"it-IT":xf,"ja-JP":Cf,"ko-KR":Ef,"lt-LT":wf,"lv-LV":Sf,"nb-NO":Df,"nl-NL":kf,"pl-PL":Pf,"pt-BR":Af,"pt-PT":Tf,"ro-RO":Bf,"ru-RU":Kf,"sk-SK":Rf,"sl-SI":Mf,"sr-SP":If,"sv-SE":Ff,"tr-TR":Lf,"uk-UA":zf,"zh-CN":Nf,"zh-TW":Of};class $g extends lf{isCell(e){return e.type==="cell"||e.type==="rowheader"||e.type==="column"}getKeyBelow(e,n){let l=this.collection.getItem(e);if(!l)return null;if(l.type==="column"){let r=Pt(Ce(l,this.collection));if(r)return r.key;let o=this.getFirstKey();return o==null||!this.collection.getItem(o)?null:super.getKeyForItemInRowByIndex(o,l.index)}return super.getKeyBelow(e,n)}getKeyAbove(e,n){let l=this.collection.getItem(e);if(!l)return null;if(l.type==="column"){let i=l.parentKey!=null?this.collection.getItem(l.parentKey):null;return i&&i.type==="column"?i.key:null}let r=super.getKeyAbove(e,n),o=r!=null?this.collection.getItem(r):null;return o&&o.type!=="headerrow"?r:this.isCell(l)?this.collection.columns[l.index].key:this.collection.columns[0].key}findNextColumnKey(e){let n=this.findNextKey(e.key,r=>r.type==="column");if(n!=null)return n;let l=this.collection.headerRows[e.level];for(let r of Ce(l,this.collection))if(r.type==="column")return r.key;return null}findPreviousColumnKey(e){let n=this.findPreviousKey(e.key,o=>o.type==="column");if(n!=null)return n;let l=this.collection.headerRows[e.level],r=[...Ce(l,this.collection)];for(let o=r.length-1;o>=0;o--){let i=r[o];if(i.type==="column")return i.key}return null}getKeyRightOf(e){let n=this.collection.getItem(e);return n?n.type==="column"?this.direction==="rtl"?this.findPreviousColumnKey(n):this.findNextColumnKey(n):super.getKeyRightOf(e):null}getKeyLeftOf(e){let n=this.collection.getItem(e);return n?n.type==="column"?this.direction==="rtl"?this.findNextColumnKey(n):this.findPreviousColumnKey(n):super.getKeyLeftOf(e):null}getKeyForSearch(e,n){if(!this.collator)return null;let l=this.collection,r=n??this.getFirstKey();if(r==null)return null;let o=l.getItem(r);(o==null?void 0:o.type)==="cell"&&(r=o.parentKey??null);let i=!1;for(;r!=null;){let u=l.getItem(r);if(!u)return null;if(u.textValue){let a=u.textValue.slice(0,e.length);if(this.collator.compare(a,e)===0)return u.key}for(let a of Ce(u,this.collection)){let c=l.columns[a.index];if(l.rowHeaderColumnKeys.has(c.key)&&a.textValue){let f=a.textValue.slice(0,e.length);if(this.collator.compare(f,e)===0){let d=n!=null?l.getItem(n):o;return(d==null?void 0:d.type)==="cell"?a.key:u.key}}}r=this.getKeyBelow(r),r==null&&!i&&(r=this.getFirstKey(),i=!0)}return null}}function vg(t){return t&&t.__esModule?t.default:t}function xg(t,e,n){let{keyboardDelegate:l,isVirtualized:r,layoutDelegate:o,layout:i}=t,u=En({usage:"search",sensitivity:"base"}),{direction:a}=Re(),c=e.selectionManager.disabledBehavior,f=s.useMemo(()=>l||new $g({collection:e.collection,disabledKeys:e.disabledKeys,disabledBehavior:c,ref:n,direction:a,collator:u,layoutDelegate:o,layout:i}),[l,e.collection,e.disabledKeys,c,n,a,u,o,i]),d=$e(t.id);eo.set(e,d);let{gridProps:b}=yg({...t,id:d,keyboardDelegate:f},e,n);r&&(b["aria-rowcount"]=e.collection.size+e.collection.headerRows.length),e.treeColumn!=null&&(b.role="treegrid");let{column:p,direction:h}=e.sortDescriptor||{},$=Ne(vg(Wt),"@react-aria/table"),y=s.useMemo(()=>{var E;let v=((E=e.collection.columns.find(C=>C.key===p))==null?void 0:E.textValue)??"";return h&&p?$.format(`${h}Sort`,{columnName:v}):void 0},[h,p,e.collection.columns]),m=mn(y);return $r(()=>{y&>(y,"assertive",500)},[y]),{gridProps:G(b,m,{"aria-describedby":[m["aria-describedby"],b["aria-describedby"]].filter(Boolean).join(" ")})}}function Vf(t,e,n){let{node:l,isVirtualized:r,focusMode:o="child",shouldSelectOnPressUp:i,onAction:u}=t,{direction:a}=Re(),{keyboardDelegate:c,actions:{onCellAction:f}}=Qr.get(e),d=s.useRef(null),b=()=>{if(n.current){let v=Fe(n.current);if(o==="child"){if(vt(n.current)&&n.current!==oe())return;let E=e.selectionManager.childFocusStrategy==="last"?Il(v):v.firstChild();if(E){ve(E);return}}(d.current!=null&&l.key!==d.current||!vt(n.current))&&ve(n.current)}},{itemProps:p,isPressed:h}=jr({selectionManager:e.selectionManager,key:l.key,ref:n,isVirtualized:r,focus:b,shouldSelectOnPressUp:i,onAction:f?()=>f(l.key):u,isDisabled:e.collection.size===0}),$=v=>{var R,A,K,P,z;let E=oe();if(!te(v.currentTarget,j(v))||e.isKeyboardNavigationDisabled||!n.current||!E)return;let C=Fe(n.current);switch(C.currentNode=E,v.key){case"ArrowLeft":{let B=a==="rtl"?C.nextNode():C.previousNode();if(o==="child"&&B===n.current&&(B=null),v.preventDefault(),v.stopPropagation(),B)ve(B),it(B,{containingElement:Xe(n.current)});else{if(((R=c.getKeyLeftOf)==null?void 0:R.call(c,l.key))!==l.key){(A=n.current.parentElement)==null||A.dispatchEvent(new KeyboardEvent(v.nativeEvent.type,v.nativeEvent));break}o==="cell"&&a==="rtl"?(ve(n.current),it(n.current,{containingElement:Xe(n.current)})):(C.currentNode=n.current,B=a==="rtl"?C.firstChild():Il(C),B&&(ve(B),it(B,{containingElement:Xe(n.current)})))}break}case"ArrowRight":{let B=a==="rtl"?C.previousNode():C.nextNode();if(o==="child"&&B===n.current&&(B=null),v.preventDefault(),v.stopPropagation(),B)ve(B),it(B,{containingElement:Xe(n.current)});else{if(((K=c.getKeyRightOf)==null?void 0:K.call(c,l.key))!==l.key){(P=n.current.parentElement)==null||P.dispatchEvent(new KeyboardEvent(v.nativeEvent.type,v.nativeEvent));break}o==="cell"&&a==="ltr"?(ve(n.current),it(n.current,{containingElement:Xe(n.current)})):(C.currentNode=n.current,B=a==="rtl"?Il(C):C.firstChild(),B&&(ve(B),it(B,{containingElement:Xe(n.current)})))}break}case"ArrowUp":case"ArrowDown":!v.altKey&&te(n.current,j(v))&&(v.stopPropagation(),v.preventDefault(),(z=n.current.parentElement)==null||z.dispatchEvent(new KeyboardEvent(v.nativeEvent.type,v.nativeEvent)));break}},y=v=>{if(d.current=l.key,j(v)!==n.current){Ft()||e.selectionManager.setFocusedKey(l.key);return}requestAnimationFrame(()=>{o==="child"&&oe()===n.current&&b()})},m=G(p,{role:"gridcell",onKeyDownCapture:$,"aria-colspan":l.colSpan,"aria-colindex":l.colIndex!=null?l.colIndex+1:void 0,colSpan:r?void 0:l.colSpan,onFocus:y});return r&&(m["aria-colindex"]=(l.colIndex??l.index)+1),i&&m.tabIndex!=null&&m.onPointerDown==null&&(m.onPointerDown=v=>{let E=v.currentTarget,C=E.getAttribute("tabindex");E.removeAttribute("tabindex"),requestAnimationFrame(()=>{C!=null&&E.setAttribute("tabindex",C)})}),{gridCellProps:m,isPressed:h}}function Il(t){let e=null,n=null;do n=t.lastChild(),n&&(e=n);while(n);return e}function Cg(t){return t&&t.__esModule?t.default:t}function Eg(t,e,n){var m,v;let{node:l}=t,r=l.props.allowsSorting,{gridCellProps:o}=Vf({...t,focusMode:"child"},e,n),i=l.props.isSelectionCell&&e.selectionManager.selectionMode==="single",{pressProps:u,isPressed:a}=lt({isDisabled:!r||i,onPress(){e.sort(l.key)},ref:n}),{focusableProps:c}=jt({},n),f,d=((m=e.sortDescriptor)==null?void 0:m.column)===l.key,b=(v=e.sortDescriptor)==null?void 0:v.direction;l.props.allowsSorting&&!rn()&&(f=d?b:"none");let p=Ne(Cg(Wt),"@react-aria/table"),h;r&&(h=`${p.format("sortable")}`,d&&b&&rn()&&(h=`${h}, ${p.format(b)}`));let $=mn(h),y=e.collection.size===0;return s.useEffect(()=>{y&&e.selectionManager.focusedKey===l.key&&e.selectionManager.setFocusedKey(null)},[y,e.selectionManager,l.key]),{columnHeaderProps:{...G(c,o,u,$,y?{tabIndex:-1}:null),role:"columnheader",id:rf(e,l.key),"aria-colspan":l.colSpan&&l.colSpan>1?l.colSpan:void 0,"aria-sort":f},isPressed:a}}function wg(t,e,n){var h,$;let{node:l,isVirtualized:r,shouldSelectOnPressUp:o,onAction:i}=t,{actions:u,shouldSelectOnPressUp:a}=Qr.get(e),c=u.onRowAction?()=>{var y;return(y=u.onRowAction)==null?void 0:y.call(u,l.key)}:i,{itemProps:f,...d}=jr({selectionManager:e.selectionManager,key:l.key,ref:n,isVirtualized:r,shouldSelectOnPressUp:a||o,onAction:c||(h=l==null?void 0:l.props)!=null&&h.onAction?dt(($=l==null?void 0:l.props)==null?void 0:$.onAction,c):void 0,isDisabled:e.collection.size===0}),b=e.selectionManager.isSelected(l.key),p={role:"row","aria-selected":e.selectionManager.selectionMode!=="none"?b:void 0,"aria-disabled":d.isDisabled||void 0,...f};return r&&(p["aria-rowindex"]=l.index+1),{rowProps:p,...d}}function Sg(t){return t&&t.__esModule?t.default:t}const Hi={expand:{ltr:"ArrowRight",rtl:"ArrowLeft"},collapse:{ltr:"ArrowLeft",rtl:"ArrowRight"}};function Dg(t,e,n){var $,y;let{node:l,isVirtualized:r}=t,{rowProps:o,...i}=wg(t,e,n),{direction:u}=Re();r&&e.treeColumn==null?o["aria-rowindex"]=l.index+1+e.collection.headerRows.length:delete o["aria-rowindex"];let a=e.treeColumn!=null&&(e.expandedKeys==="all"||e.expandedKeys.has(l.key)),c=Ne(Sg(Wt),"@react-aria/table"),f=un({"aria-label":a?c.format("collapse"):c.format("expand"),"aria-labelledby":fr(e,l.key)}),d={},b={};if(e.treeColumn!=null){let m=e.collection.getItem(l.key);if(m!=null){let v=Wi(e.collection,l),E=(($=m.props)==null?void 0:$.hasChildRows)||((y=m.props)==null?void 0:y.UNSTABLE_childItems)||(v==null?void 0:v.type)!=="cell",C=e.collection.getItem(l.parentKey),R=C.type==="tablebody"||C.type==="body",A=Wi(e.collection,C);for(;A&&A.type!=="item"&&A.prevKey!=null;)A=e.collection.getItem(A.prevKey);d={onKeyDown:K=>{K.key===Hi.expand[u]&&e.selectionManager.focusedKey===m.key&&E&&e.expandedKeys!=="all"&&!e.expandedKeys.has(m.key)?(e.toggleKey(m.key),K.stopPropagation()):K.key===Hi.collapse[u]&&e.selectionManager.focusedKey===m.key&&(e.expandedKeys!=="all"?E&&e.expandedKeys.has(m.key)?(e.toggleKey(m.key),K.stopPropagation()):!e.expandedKeys.has(m.key)&&m.parentKey!=null&&m.level>0&&(e.selectionManager.setFocusedKey(m.parentKey),K.stopPropagation()):e.expandedKeys==="all"&&(e.toggleKey(m.key),K.stopPropagation()))},"aria-expanded":E?e.expandedKeys==="all"||e.expandedKeys.has(l.key):void 0,"aria-level":m.level+1,"aria-posinset":m.index-(R?0:e.collection.columnCount)+1,"aria-setsize":A.index-(R?0:e.collection.columnCount)+1},b={isDisabled:i.isDisabled,onPress:()=>{i.isDisabled||(e.toggleKey(l.key),e.selectionManager.setFocused(!0),e.selectionManager.setFocusedKey(l.key))},excludeFromTabOrder:!0,preventFocusOnPress:!0,"data-react-aria-prevent-focus":!0,...f}}}let p=$p(l.props),h=i.hasAction?p:{};return{rowProps:{...G(o,d,h),"aria-labelledby":fr(e,l.key)},expandButtonProps:b,...i}}function Wi(t,e){return"lastChildKey"in e?e.lastChildKey!=null?t.getItem(e.lastChildKey):null:Array.from(e.childNodes).findLast(n=>n.parentKey===e.key)}function kg(t,e,n){let{node:l,isVirtualized:r}=t,o={role:"row"};return r&&e.treeColumn==null&&(o["aria-rowindex"]=l.index+1),{rowProps:o}}function Pg(t,e,n){var i;let{gridCellProps:l,isPressed:r}=Vf(t,e,n),o=(i=t.node.column)==null?void 0:i.key;return o!=null&&e.collection.rowHeaderColumnKeys.has(o)&&(l.role="rowheader",l.id=of(e,t.node.parentKey,o)),{gridCellProps:l,isPressed:r}}function Ag(t){return t&&t.__esModule?t.default:t}function Tg(t,e){let{key:n}=t;const{checkboxProps:l}=lg(t,e);return{checkboxProps:{...l,"aria-labelledby":`${l.id} ${fr(e,n)}`}}}function Bg(t){let{isEmpty:e,isSelectAll:n,selectionMode:l}=t.selectionManager;return{checkboxProps:{"aria-label":Ne(Ag(Wt),"@react-aria/table").format(l==="single"?"select":"selectAll"),isSelected:n,isDisabled:l!=="multiple"||t.collection.size===0||t.collection.rows.length===1&&t.collection.rows[0].type==="loader",isIndeterminate:!e&&!n,onChange:()=>t.selectionManager.toggleSelectAll()}}}function Kg(t){return t&&t.__esModule?t.default:t}function Rg(t,e,n){let{column:l,triggerRef:r,isDisabled:o,onResizeStart:i,onResize:u,onResizeEnd:a,"aria-label":c}=t;const f=Ne(Kg(Wt),"@react-aria/table");let d=$e(),b=e.resizingColumn===l.key,p=s.useRef(b),h=s.useRef(null),$=s.useRef(!1),y=e.tableState.isKeyboardNavigationDisabled,{direction:m}=Re(),v=s.useCallback(F=>{p.current||(h.current=e.updateResizedColumns(F.key,e.getColumnWidth(F.key)),e.startResize(F.key),e.tableState.setKeyboardNavigationDisabled(!0),i==null||i(h.current)),p.current=!0},[e,i]),E=s.useCallback((F,V)=>{let q=e.updateResizedColumns(F.key,V);u==null||u(q),h.current=q},[e,u]),C=s.useCallback(F=>{p.current&&(h.current==null&&(h.current=e.updateResizedColumns(F.key,e.getColumnWidth(F.key))),e.endResize(),e.tableState.setKeyboardNavigationDisabled(!1),a==null||a(h.current),p.current=!1,r!=null&&r.current&&!$.current&&ve(r.current)),h.current=null},[e,r,a]),{keyboardProps:R}=Tr({onKeyDown:F=>{y?(F.key==="Escape"||F.key==="Enter"||F.key===" "||F.key==="Tab")&&(F.preventDefault(),C(l)):(F.continuePropagation(),F.key==="Enter"&&v(l))}});const A=s.useRef(0),{moveProps:K}=T3({onMoveStart(){A.current=e.getColumnWidth(l.key),v(l)},onMove(F){let{deltaX:V,deltaY:q,pointerType:Q}=F;m==="rtl"&&(V*=-1),Q==="keyboard"&&(q!==0&&V===0&&(V=q*-1),V*=10),V!==0&&(A.current+=V,E(l,A.current))},onMoveEnd(F){let{pointerType:V}=F;A.current=0,(V==="mouse"||V==="touch"&&$.current)&&C(l)}});let P=s.useCallback(F=>{var V;y&&((V=K.onKeyDown)==null||V.call(K,F))},[y,K]),z=Math.floor(e.getColumnMinWidth(l.key)),B=Math.floor(e.getColumnMaxWidth(l.key));B===1/0&&(B=Number.MAX_SAFE_INTEGER);let N=Math.floor(e.getColumnWidth(l.key)),U=Nu();U==="virtual"&&typeof window<"u"&&"ontouchstart"in window&&(U="touch");let _=(r==null?void 0:r.current)==null&&(U==="keyboard"||U==="virtual")&&!b?f.format("resizerDescription"):void 0,x=mn(_),S={"aria-label":c,"aria-orientation":"horizontal","aria-labelledby":`${d} ${rf(e.tableState,l.key)}`,"aria-valuetext":f.format("columnSize",{value:N}),type:"range",min:z,max:B,value:N,...x};const I=s.useCallback(()=>{n.current&&ve(n.current)},[n]);let w=e.resizingColumn,k=s.useRef(null),D=Ee(v);s.useEffect(()=>{if(k.current!==w&&w!=null&&w===l.key){$.current=oe()===n.current,D(l);let F=setTimeout(()=>I(),0),V=setTimeout(I,400);return()=>{clearTimeout(F),clearTimeout(V)}}k.current=w},[w,l,I,n]);let T=F=>{let V=e.getColumnWidth(l.key),q=parseFloat(j(F).value);q>V?q=V+10:q=V-10,E(l,q)},{pressProps:O}=lt({preventFocusOnPress:!0,onPressStart:F=>{if(!(F.ctrlKey||F.altKey||F.metaKey||F.shiftKey||F.pointerType==="keyboard")){if(F.pointerType==="virtual"&&e.resizingColumn!=null){C(l);return}I(),F.pointerType!=="virtual"&&v(l)}},onPress:F=>{(F.pointerType==="touch"&&$.current||F.pointerType==="mouse")&&e.resizingColumn!=null&&C(l)}}),{visuallyHiddenProps:Z}=$n();return{resizerProps:G(R,{...K,onKeyDown:P},O,{style:{touchAction:"none"}}),inputProps:G(Z,{id:d,onBlur:()=>{C(l)},onChange:T,disabled:o},S),isResizing:b}}function Mg(){return{rowGroupProps:{role:"rowgroup"}}}function jf(){return Mg()}function Ig(t){return t&&t.__esModule?t.default:t}class Fg extends Ia{withExpandedKeys(e){let n=this.clone();return n.expandedKeys=e,n.frozen=this.frozen,n.rows=Array.from(n.getRows()),n}addNode(e){super.addNode(e),this.columnsDirty||(this.columnsDirty=e.type==="column"),e.type==="tableheader"&&(this.head=e)}getRows(){let e=[];for(let n of this)(n.type==="tablebody"||n.type==="tablefooter")&&e.push(...this.getChildren(n.key));return e}get body(){for(let e of this)if(e.type==="tablebody")return e;return new Xn(-2)}commit(e,n,l=!1){this.updateColumns(l),this.firstKey=e,this.lastKey=n,this.rows=[];for(let r of this.getRows()){let o=r.lastChildKey;if(o!=null){let i=this.getItem(o);for(;i&&i.type!=="cell";)i=i.prevKey!=null?this.getItem(i.prevKey):null;if(i){let u=(i.colIndex??i.index)+(i.colSpan??1);if(u!==this.columns.length&&!l)throw new Error(`Cell count must match column count. Found ${u} cells and ${this.columns.length} columns.`)}}this.rows.push(r)}super.commit(e,n,l)}updateColumns(e){if(!this.columnsDirty)return;this.rowHeaderColumnKeys=new Set,this.columns=[];let n=new Map,l=r=>{switch(r.type){case"column":n.set(r.key,r),r.hasChildNodes||(r.index=this.columns.length,this.columns.push(r),r.props.isRowHeader&&this.rowHeaderColumnKeys.add(r.key));break}for(let o of this.getChildren(r.key))l(o)};for(let r of this.getChildren(this.head.key))l(r);if(this.headerRows=ef(n,this.columns),this.columnsDirty=!1,this.rowHeaderColumnKeys.size===0&&this.columns.length>0&&!e)throw new Error("A table must have at least one Column with the isRowHeader prop set to true")}get columnCount(){return this.columns.length}*[Symbol.iterator](){let e=this.firstKey;for(;e!=null;){let n=this.getItem(e);n&&(yield n),e=(n==null?void 0:n.nextKey)??null}}getFirstKey(){for(let e of this)if(e.type==="tablebody")return e.firstChildKey??null;return null}getLastKey(){let e=this.lastKey;if(e==null)return null;let n=this.getItem(e);for(;(n==null?void 0:n.lastChildKey)!=null&&(n.type!=="item"||this.expandedKeys.has(n.key));)n=this.getItem(n.lastChildKey);return n==null?void 0:n.key}getKeyAfter(e){let n=this.getItem(e);if((n==null?void 0:n.type)==="column")return n.nextKey??null;if(!n)return null;if(n.type==="item"&&n.firstChildKey!=null&&this.expandedKeys.has(n.key)){let l=this.getItem(n.firstChildKey);for(;l;){if(l.type==="item")return l.key;l=l.nextKey!=null?this.getItem(l.nextKey):null}}return super.getKeyAfter(e)}getKeyBefore(e){var r;let n=this.getItem(e);if((n==null?void 0:n.type)==="column")return n.prevKey??null;if(!n)return null;let l=null;if(n.prevKey!=null){for(n=this.getItem(n.prevKey);n&&(n.type!=="item"||this.expandedKeys.has(n.key))&&n.lastChildKey!=null;)n=this.getItem(n.lastChildKey);l=(n==null?void 0:n.key)??null}return l==null&&(l=n.parentKey),l!=null&&((r=this.getItem(l))==null?void 0:r.type)==="tableheader"?null:l}getChildren(e){let n=this.getItem(e);if(!n){for(let r of this.headerRows)if(r.key===e)return r.childNodes}let l=this;return(n==null?void 0:n.type)==="tablebody"||(n==null?void 0:n.type)==="tablefooter"?{*[Symbol.iterator](){let r=n.firstChildKey,o=r!=null?l.getItem(r):null;for(;o;){yield o;let i=l.getKeyAfter(o.key);if(o=i!=null?l.getItem(i):null,o&&o.parentKey===n.parentKey)break}}}:{*[Symbol.iterator](){let r=l.getItem(e),o=(r==null?void 0:r.firstChildKey)!=null?l.getItem(r.firstChildKey):null;for(;o&&(yield o,o=o.nextKey!=null?l.getItem(o.nextKey):null,!((r==null?void 0:r.type)==="item"&&(o==null?void 0:o.type)!=="cell")););}}}clone(){let e=super.clone();return e.headerRows=this.headerRows,e.columns=this.columns,e.rows=this.rows,e.rowHeaderColumnKeys=this.rowHeaderColumnKeys,e.head=this.head,e}getTextValue(e){let n=this.getItem(e);if(!n)return"";if(n.textValue)return n.textValue;let l=this.rowHeaderColumnKeys,r=[];for(let o of this.getChildren(e)){let i=this.columns[o.index];if(l.has(i.key)&&o.textValue&&r.push(o.textValue),r.length===l.size)break}return r.join(" ")}constructor(...e){super(...e),this.headerRows=[],this.columns=[],this.rows=[],this.rowHeaderColumnKeys=new Set,this.head=new Yn(-1),this.columnsDirty=!0,this.expandedKeys=new Set}}const to=s.createContext(null),Lg=s.forwardRef(function(e,n){let l=ke(n),r=s.useRef(null),o=s.useRef(null),[i,u]=s.useState(0);ne(()=>{let c=r.current;for(;c&&c!==l.current&&!st(c);)c=c.parentElement;o.current=c},[l]),an({ref:o,box:"border-box",onResize(){var c;u(((c=o.current)==null?void 0:c.clientWidth)??0)}}),ne(()=>{var c;u(((c=o.current)==null?void 0:c.clientWidth)??0)},[]);let a=s.useMemo(()=>({tableRef:r,scrollRef:o,tableWidth:i,useTableColumnResizeState:fg,onResizeStart:e.onResizeStart,onResize:e.onResize,onResizeEnd:e.onResizeEnd}),[r,i,e.onResizeStart,e.onResize,e.onResizeEnd]);return g.createElement(le.div,{render:e.render,...ie(e,{global:!0}),ref:l,className:e.className||"react-aria-ResizableTableContainer",style:e.style,onScroll:e.onScroll},g.createElement(to.Provider,{value:a},e.children))}),zg=s.createContext(null),Ze=s.createContext(null),no=s.createContext(null),Ng=s.forwardRef(function(e,n){var f;[e,n]=xe(e,n,zg);let l=Hr(e),{selectionBehavior:r,selectionMode:o,disallowEmptySelection:i}=l,u=!!((f=e.dragAndDropHooks)!=null&&f.useDraggableCollectionState),a=s.useMemo(()=>({selectionBehavior:o==="none"?null:r,selectionMode:o,disallowEmptySelection:i,allowsDragging:u}),[r,o,i,u]),c=g.createElement(jg.Provider,{value:a},g.createElement(xn,e));return g.createElement(zr,{content:c,createCollection:()=>new Fg},d=>g.createElement(Vg,{props:e,forwardedRef:n,selectionState:l,collection:d}))});let Og=s.forwardRef(function(e,n){let{isVirtualized:l}=s.useContext(fe);return l?g.createElement(le.div,{...e,ref:n}):g.createElement(le.table,{...e,ref:n})});const Ui={expand:{ltr:"ArrowRight",rtl:"ArrowLeft"},collapse:{ltr:"ArrowLeft",rtl:"ArrowRight"}};function Vg({props:t,forwardedRef:e,selectionState:n,collection:l}){[t,e]=xe(t,e,rr);let{shouldUseVirtualFocus:r,disallowTypeAhead:o,filter:i,...u}=t,a=s.useContext(to);e=ke(s.useMemo(()=>ft(e,a==null?void 0:a.tableRef),[e,a==null?void 0:a.tableRef]));let[c,f]=Ct(t.expandedKeys?new Set(t.expandedKeys):void 0,t.defaultExpandedKeys?new Set(t.defaultExpandedKeys):new Set,t.onExpandedChange);l=s.useMemo(()=>l.withExpandedKeys(c),[l,c]);let d=hg({...u,collection:l,children:void 0,UNSAFE_selectionState:n,expandedKeys:c,onExpandedChange:f}),b=mg(d,i),{isVirtualized:p,layoutDelegate:h,dropTargetDelegate:$,CollectionRoot:y}=s.useContext(fe),{dragAndDropHooks:m}=t,{gridProps:v}=xg({...u,layoutDelegate:h,isVirtualized:p},b,e),E=b.selectionManager,C=!!(m!=null&&m.useDraggableCollectionState),R=!!(m!=null&&m.useDroppableCollectionState);s.useRef(C),s.useRef(R),s.useEffect(()=>{},[C,R]);let A,K,P,z=!1,B=null,N=s.useRef(null),{direction:U}=Re(),[_]=s.useState(()=>new rg);if(C&&m){A=m.useDraggableCollectionState({collection:b.collection,selectionManager:E,preview:m.renderDragPreview?N:void 0}),m.useDraggableCollection({},A,e);let Z=m.DragPreview;B=m.renderDragPreview?g.createElement(Z,{ref:N},m.renderDragPreview):null}if(R&&m){K=m.useDroppableCollectionState({collection:b.collection,selectionManager:E});let Z=new sl({collection:b.collection,disabledKeys:E.disabledKeys,disabledBehavior:E.disabledBehavior,ref:e,layoutDelegate:h}),F=m.dropTargetDelegate||$||new m.ListDropTargetDelegate(l.rows,e);_.setup(F,d,U),P=m.useDroppableCollection({keyboardDelegate:Z,dropTargetDelegate:_,onDropActivate:V=>{var q;if(V.target.type==="item"){let Q=V.target.key,J=d.collection.getItem(Q),ge=c.has(Q);J&&J.hasChildNodes&&(!ge||(q=m==null?void 0:m.isVirtualDragging)!=null&&q.call(m))&&d.toggleKey(Q)}},onKeyDown:V=>{let q=K==null?void 0:K.target;if(q&&q.type==="item"&&q.dropPosition==="on"){let Q=d.collection.getItem(q.key);(V.key===Ui.expand[U]&&(Q!=null&&Q.hasChildNodes)&&!d.expandedKeys.has(q.key)||V.key===Ui.collapse[U]&&(Q!=null&&Q.hasChildNodes)&&d.expandedKeys.has(q.key))&&d.toggleKey(q.key)}}},K,e),z=K.isDropTarget({type:"root"})}let{focusProps:x,isFocused:S,isFocusVisible:I}=je(),w=ce({...t,children:void 0,defaultClassName:"react-aria-Table",values:{isDropTarget:z,isFocused:S,isFocusVisible:I,state:b}}),k=!!(C&&!(A!=null&&A.isDisabled)),D=w.style,T=null;a&&(T=a.useTableColumnResizeState({tableWidth:a.tableWidth},b),p||(D={...D,tableLayout:"fixed",width:"min-content"}));let O=ie(t,{global:!0});return g.createElement(_e,{values:[[Ze,b],[no,T],[qe,{dragAndDropHooks:m,dragState:A,dropState:K}],[qr,{render:e0}],[rr,null],[ja,null]]},g.createElement(Mr,null,g.createElement(Og,{...G(O,w,v,x,P==null?void 0:P.collectionProps),style:D,ref:e,slot:t.slot||void 0,onScroll:t.onScroll,"data-allows-dragging":k||void 0,"data-drop-target":z||void 0,"data-focused":S||void 0,"data-focus-visible":I||void 0},g.createElement(_a,null,g.createElement(y,{collection:b.collection,scrollRef:(a==null?void 0:a.scrollRef)??e,persistedKeys:yc(E,m,K)})))),B)}const jg=s.createContext(null),so=class so extends Ge{};so.type="tableheader";let Yn=so,_g=s.forwardRef(function(e,n){let{isVirtualized:l}=s.useContext(fe);return l?g.createElement(le.div,{...e,ref:n}):g.createElement(le.thead,{...e,ref:n})});const Hg=al(Yn,(t,e)=>{let n=s.useContext(Ze).collection,l=Lr({items:n.headerRows,children:s.useCallback(a=>{switch(a.type){case"headerrow":return g.createElement(Ug,{item:a});default:throw new Error("Unsupported node type in TableHeader: "+a.type)}},[])}),{rowGroupProps:r}=jf(),{hoverProps:o,isHovered:i}=He({onHoverStart:t.onHoverStart,onHoverChange:t.onHoverChange,onHoverEnd:t.onHoverEnd}),u=ce({...t,children:void 0,defaultClassName:"react-aria-TableHeader",values:{isHovered:i}});return g.createElement(_g,{...G(ie(t,{global:!0}),r,o),...u,ref:e,"data-hovered":i||void 0},l)},t=>g.createElement(xn,{dependencies:t.dependencies,items:t.columns},t.children));let Wg=s.forwardRef(function(e,n){let{isVirtualized:l}=s.useContext(fe);return l?g.createElement("div",{...e,ref:n}):g.createElement("tr",{...e,ref:n})});function Ug({item:t}){let e=s.useRef(null),n=s.useContext(Ze),{isVirtualized:l,CollectionBranch:r}=s.useContext(fe),{rowProps:o}=kg({node:t,isVirtualized:l},n,e),{checkboxProps:i}=Bg(n);return g.createElement(Wg,{...o,ref:e},g.createElement(_e,{values:[[Xr,{slots:{selection:i}}],[Tc,{slots:{selection:i}}]]},g.createElement(r,{collection:n.collection,parent:t})))}const co=class co extends Ge{};co.type="column";let pr=co,Gg=s.forwardRef(function(e,n){let{isVirtualized:l}=s.useContext(fe);return l?g.createElement(le.div,{...e,ref:n}):g.createElement(le.th,{...e,ref:n})});const qg=vn(pr,(t,e,n)=>{var v,E;let l=ke(e),r=s.useContext(Ze),{isVirtualized:o}=s.useContext(fe),{columnHeaderProps:i,isPressed:u}=Eg({node:n,isVirtualized:o},r,l),{isFocused:a,isFocusVisible:c,focusProps:f}=je(),d=s.useContext(no),b=!1;d&&(b=d.resizingColumn===n.key);let{hoverProps:p,isHovered:h}=He({isDisabled:!t.allowsSorting}),$=ce({...t,id:void 0,children:n.rendered,defaultClassName:"react-aria-Column",values:{isHovered:h,isPressed:u,isFocused:a,isFocusVisible:c,allowsSorting:n.props.allowsSorting,sortDirection:((v=r.sortDescriptor)==null?void 0:v.column)===n.key?r.sortDescriptor.direction:void 0,isResizing:b,startResize:()=>{if(d)d.startResize(n.key),r.setKeyboardNavigationDisabled(!0);else throw new Error("Wrap your
in a to enable column resizing")},sort:C=>{r.sort(n.key,C)}}}),y=$.style;d&&(y={...y,width:d.getColumnWidth(n.key)});let m=ie(t,{global:!0});return delete m.id,g.createElement(Gg,{...G(m,i,f,p),...$,style:y,ref:l,"data-hovered":h||void 0,"data-pressed":u||void 0,"data-focused":a||void 0,"data-focus-visible":c||void 0,"data-resizing":b||void 0,"data-allows-sorting":n.props.allowsSorting||void 0,"data-sort-direction":((E=r.sortDescriptor)==null?void 0:E.column)===n.key?r.sortDescriptor.direction:void 0},g.createElement(_e,{values:[[_f,{column:n,triggerRef:l}],[fe,Nr]]},$.children))}),_f=s.createContext(null),Zg=s.forwardRef(function(e,n){let l=s.useContext(no);if(!l)throw new Error("Wrap your
in a to enable column resizing");let r=Ne(Ig(gc),"react-aria-components"),{onResizeStart:o,onResize:i,onResizeEnd:u}=s.useContext(to),{column:a,triggerRef:c}=s.useContext(_f),f=s.useRef(null),{resizerProps:d,inputProps:b,isResizing:p}=Rg({column:a,"aria-label":e["aria-label"]||r.format("tableResizer"),onResizeStart:o,onResize:i,onResizeEnd:u,triggerRef:c},l,f),{focusProps:h,isFocused:$,isFocusVisible:y}=je(),{hoverProps:m,isHovered:v}=He(e),E=l.getColumnMinWidth(a.key)>=l.getColumnWidth(a.key),C=l.getColumnMaxWidth(a.key)<=l.getColumnWidth(a.key),{direction:R}=Re(),A="both";E?A=R==="rtl"?"right":"left":C?A=R==="rtl"?"left":"right":A="both";let K=ke(n),[P,z]=s.useState("");s.useEffect(()=>{if(!K.current)return;let S=window.getComputedStyle(K.current);z(S.cursor)},[K,A]);let B=ce({...e,defaultClassName:"react-aria-ColumnResizer",values:{isFocused:$,isFocusVisible:y,isResizing:p,isHovered:v,resizableDirection:A}}),[N,U]=s.useState(!1),_=S=>{S.pointerType==="mouse"&&U(!0)};!p&&N&&U(!1);let x=ie(e,{global:!0});return g.createElement(le.div,{ref:K,role:"presentation",...G(x,B,d,{onPointerDown:_},m),"data-hovered":v||void 0,"data-focused":$||void 0,"data-focus-visible":y||void 0,"data-resizing":p||void 0,"data-resizable-direction":A},B.children,g.createElement("input",{ref:f,...G(b,h)}),p&&N&&Yi.createPortal(g.createElement("div",{style:{position:"fixed",top:0,left:0,bottom:0,right:0,cursor:P}}),document.body))}),fo=class fo extends ul{};fo.type="tablebody";let Xn=fo,Yg=s.forwardRef(function(e,n){let{isVirtualized:l}=s.useContext(fe);return l?g.createElement(le.div,{...e,ref:n}):g.createElement(le.tbody,{...e,ref:n})});const Xg=al(Xn,(t,e,n)=>{let l=s.useContext(Ze),{isVirtualized:r}=s.useContext(fe),o=l.collection,{CollectionBranch:i}=s.useContext(fe),{dragAndDropHooks:u,dropState:a}=s.useContext(qe),c=!!(u!=null&&u.useDroppableCollectionState)&&!(a!=null&&a.isDisabled),f=c&&!!a&&(a.isDropTarget({type:"root"})??!1),d=o.size===0,b={isDropTarget:f,isEmpty:d},p=ce({...t,id:void 0,children:void 0,defaultClassName:"react-aria-TableBody",values:b}),h,$=o.columnCount;if(d&&t.renderEmptyState&&l){let v={},E={},C={};r?(E["aria-colspan"]=$,C={display:"contents"}):E.colSpan=$,h=g.createElement(Lt,{role:"row",...v,style:C},g.createElement(zt,{role:"rowheader",...E,style:C},t.renderEmptyState(b)))}let{rowGroupProps:y}=jf(),m=ie(t,{global:!0});return g.createElement(Yg,{...G(m,p,y),ref:e,"data-empty":d||void 0},c&&g.createElement(o0,null),g.createElement(i,{collection:o,parent:n,renderDropIndicator:Zr(u,a)}),h)}),po=class po extends ul{};po.type="tablefooter";let Gi=po;const Hf=s.createContext({isFocusVisibleWithinRow:!1}),bo=class bo extends Ge{filter(e,n,l){let r=e.getChildren(this.key);for(let o of r)if(l(o.textValue,o)){let i=this.clone();return n.addDescendants(i,e),i}return null}};bo.type="item";let br=bo,Lt=s.forwardRef(function(e,n){let{isVirtualized:l}=s.useContext(fe);return l?g.createElement(le.div,{...e,ref:n}):g.createElement(le.tr,{...e,ref:n})});const Jg=al(br,(t,e,n)=>{var k;let l=ke(e),r=s.useContext(Ze),{dragAndDropHooks:o,dragState:i,dropState:u}=s.useContext(qe),{isVirtualized:a,CollectionBranch:c}=s.useContext(fe),f=i&&!(i.isDisabled||i.selectionManager.isDisabled(n.key)),{rowProps:d,expandButtonProps:b,...p}=Dg({node:n,shouldSelectOnPressUp:!!i,isVirtualized:a},r,l),{isFocused:h,isFocusVisible:$,focusProps:y}=je(),{isFocusVisible:m,focusProps:v}=je({within:!0}),{hoverProps:E,isHovered:C}=He({isDisabled:!p.allowsSelection&&!p.hasAction&&!f,onHoverStart:t.onHoverStart,onHoverChange:t.onHoverChange,onHoverEnd:t.onHoverEnd}),{checkboxProps:R}=Tg({key:n.key},r),A;i&&o&&(A=o.useDraggableItem({key:n.key,hasDragButton:!0},i));let K,P=s.useRef(null),{visuallyHiddenProps:z}=$n();u&&o&&(K=o.useDropIndicator({target:{type:"item",key:n.key,dropPosition:"on"}},u,P));let B=s.useRef(null);s.useEffect(()=>{i&&B.current},[]);let N=i&&i.isDragging(n.key),{children:U,..._}=t,x=t.hasChildItems||((k=r.collection.getItem(n.lastChildKey))==null?void 0:k.type)!=="cell",S=x&&r.expandedKeys.has(n.key),I=ce({..._,id:void 0,defaultClassName:"react-aria-Row",defaultStyle:{"--table-row-level":n.level+1},values:{...p,state:r,isHovered:C,isFocused:h,isFocusVisible:$,selectionMode:r.selectionManager.selectionMode,selectionBehavior:r.selectionManager.selectionBehavior,isDragging:N,isDropTarget:K==null?void 0:K.isDropTarget,isFocusVisibleWithin:m,id:n.key,hasChildItems:x,isExpanded:S,level:n.level+1}}),w=ie(t,{global:!0});return delete w.id,delete w.onClick,g.createElement(g.Fragment,null,K&&!K.isHidden&&g.createElement(Lt,{role:"row",style:{height:0}},g.createElement(zt,{role:"gridcell",colSpan:r.collection.columnCount,style:{padding:0}},g.createElement("div",{role:"button",...z,...K.dropIndicatorProps,ref:P}))),g.createElement(Lt,{...G(w,I,d,y,E,A==null?void 0:A.dragProps,v),ref:l,"data-disabled":p.isDisabled||void 0,"data-selected":p.isSelected||void 0,"data-hovered":C||void 0,"data-focused":p.isFocused||void 0,"data-focus-visible":$||void 0,"data-pressed":p.isPressed||void 0,"data-dragging":N||void 0,"data-drop-target":(K==null?void 0:K.isDropTarget)||void 0,"data-selection-mode":r.selectionManager.selectionMode==="none"?void 0:r.selectionManager.selectionMode,"data-focus-visible-within":m||void 0,"data-expanded":S||void 0,"data-has-child-items":x||void 0,"data-level":n.level+1},g.createElement(_e,{values:[[Xr,{slots:{[mt]:{},selection:R}}],[Tc,{slots:{[mt]:{},selection:R}}],[yn,{slots:{[mt]:{},chevron:b,drag:{...A==null?void 0:A.dragButtonProps,ref:B,style:{pointerEvents:"none"}}}}],[Ha,{isSelected:p.isSelected}],[Hf,{isFocusVisibleWithinRow:m}]]},g.createElement(c,{collection:r.collection,parent:n}))))},t=>{if(t.id==null&&typeof t.children=="function")throw new Error("No id detected for the Row element. The Row element requires a id to be provided to it when the cells are rendered dynamically.");let e=[t.value].concat(t.dependencies);return g.createElement(xn,{dependencies:e,items:t.columns,idScope:t.id},t.children)}),ho=class ho extends Ge{};ho.type="cell";let hr=ho,zt=s.forwardRef(function(e,n){let{isVirtualized:l}=s.useContext(fe);return l?g.createElement(le.div,{...e,ref:n}):g.createElement(le.td,{...e,ref:n})});const Qg=vn(hr,(t,e,n)=>{var K;let l=ke(e),r=s.useContext(Ze),{dragState:o}=s.useContext(qe),{isVirtualized:i}=s.useContext(fe);n.column=r.collection.columns[n.index];let{gridCellProps:u,isPressed:a}=Pg({node:n,shouldSelectOnPressUp:!!o,isVirtualized:i},r,l),{isFocused:c,isFocusVisible:f,focusProps:d}=je(),{hoverProps:b,isHovered:p}=He({}),{isFocusVisibleWithinRow:h}=s.useContext(Hf),$=n.parentKey!=null?r.selectionManager.isSelected(n.parentKey):!1,y=n.colIndex||n.index,m=r.collection.getItem(n.parentKey),v=m.props.hasChildItems||((K=r.collection.getItem(m.lastChildKey))==null?void 0:K.type)!=="cell",E=v&&r.expandedKeys.has(n.parentKey),C=r.selectionManager.isDisabled(n.parentKey),R=ce({...t,id:void 0,defaultClassName:"react-aria-Cell",values:{isFocused:c,isFocusVisible:f,isFocusVisibleWithinRow:h,isPressed:a,isHovered:p,isSelected:$,id:n.key,columnIndex:y,hasChildItems:v,isExpanded:E,isDisabled:C,level:m.level+1,isTreeColumn:n.column.key===r.treeColumn}}),A=ie(t,{global:!0});return delete A.id,g.createElement(zt,{...G(A,R,u,d,b),ref:l,"data-focused":c||void 0,"data-focus-visible":f||void 0,"data-focus-visible-within-row":h||void 0,"data-pressed":a||void 0,"data-selected":$||void 0,"data-column-index":y,"data-expanded":E||void 0,"data-has-child-items":v||void 0,"data-level":m.level+1,"data-tree-column":n.column.key===r.treeColumn||void 0,"data-disabled":C||void 0},g.createElement(fe.Provider,{value:Nr},R.children))});function e0(t,e){var c;e=ke(e);let{dragAndDropHooks:n,dropState:l}=s.useContext(qe),r=s.useRef(null),{dropIndicatorProps:o,isHidden:i,isDropTarget:u}=n.useDropIndicator(t,l,r);if(i)return null;let a=l&&t.target.type==="item"?(((c=l.collection.getItem(t.target.key))==null?void 0:c.level)||0)+1:1;return g.createElement(r0,{...t,dropIndicatorProps:o,isDropTarget:u,buttonRef:r,level:a,ref:e})}let t0=s.forwardRef(function(e,n){let{isVirtualized:l}=s.useContext(fe);return l?g.createElement(le.div,{...e,ref:n}):g.createElement(le.tr,{...e,ref:n})}),n0=s.forwardRef(function(e,n){let{isVirtualized:l}=s.useContext(fe);return l?g.createElement(le.div,{...e,ref:n}):g.createElement(le.td,{...e,ref:n})});function l0(t,e){let{dropIndicatorProps:n,isDropTarget:l,buttonRef:r,level:o,...i}=t,u=s.useContext(Ze),{visuallyHiddenProps:a}=$n(),c=ce({...i,defaultClassName:"react-aria-DropIndicator",defaultStyle:{"--table-row-level":o+1},values:{isDropTarget:l}});return g.createElement(t0,{...ie(t,{global:!0}),...c,role:"row",ref:e,"data-drop-target":l||void 0,"aria-level":o},g.createElement(n0,{role:"gridcell",colSpan:u.collection.columnCount,style:{padding:0}},g.createElement("div",{...a,role:"button",...n,ref:r}),c.children))}const r0=s.forwardRef(l0);function o0(){let t=s.useContext(Ze),{dragAndDropHooks:e,dropState:n}=s.useContext(qe),l=s.useRef(null),{dropIndicatorProps:r}=e.useDropIndicator({target:{type:"root"}},n,l),o=n.isDropTarget({type:"root"}),{visuallyHiddenProps:i}=$n();return!o&&r["aria-hidden"]?null:g.createElement(Lt,{role:"row","aria-hidden":r["aria-hidden"],style:{height:0}},g.createElement(zt,{role:"gridcell",colSpan:t.collection.columnCount,style:{padding:0}},g.createElement("div",{role:"button",...i,...r,ref:l})))}const i0=vn(qn,function(e,n,l){let r=s.useContext(Ze),{isVirtualized:o}=s.useContext(fe),{isLoading:i,onLoadMore:u,scrollOffset:a,...c}=e,f=r.collection.columns.length,d=s.useRef(null),b=s.useMemo(()=>({onLoadMore:u,collection:r==null?void 0:r.collection,sentinelRef:d,scrollOffset:a}),[u,a,r==null?void 0:r.collection]);uu(b,d);let p=ce({...c,id:void 0,children:l.rendered,defaultClassName:"react-aria-TableLoadingIndicator",defaultStyle:{"--table-row-level":l.level+1},values:void 0}),h={},$={},y={};return o?($["aria-colspan"]=f,y={display:"contents"}):$.colSpan=f,g.createElement(g.Fragment,null,g.createElement(Lt,{style:{height:0},inert:au(!0)},g.createElement(zt,{style:{padding:0,border:0}},g.createElement("div",{"data-testid":"loadMoreSentinel",ref:d,style:{position:"relative",height:1,width:1}}))),i&&p.children&&g.createElement(Lt,{...G(ie(e,{global:!0}),h),...p,role:"row",ref:n,"aria-level":l.level+1,"data-level":l.level+1},g.createElement(zt,{role:"rowheader",...$,style:y},p.children)))}),Wf=s.createContext({}),qi=({children:t,className:e,variant:n,...l})=>{const r=g.useMemo(()=>sh({variant:n}),[n]);return M.jsx(Jm,{className:me(e,r.item()),"data-slot":"list-box-item",...l,children:o=>M.jsx(Wf,{value:{slots:r,state:o},children:typeof t=="function"?t(o):t})})},Uf=({children:t,className:e,...n})=>{const{slots:l,state:r}=s.useContext(Wf),o=r==null?void 0:r.isSelected,i=typeof t=="function"?t(r??{}):t||M.jsx("svg",{"aria-hidden":"true","data-slot":"list-box-item-indicator--checkmark",fill:"none",role:"presentation",stroke:"currentColor",strokeDasharray:22,strokeDashoffset:o?44:66,strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,viewBox:"0 0 17 18",children:M.jsx("polyline",{points:"1 9 7 14 15 4"})});return M.jsx(Se.span,{"aria-hidden":"true",className:de(l==null?void 0:l.indicator,e),"data-slot":"list-box-item-indicator","data-visible":o||void 0,...n,children:i})},u0=Object.assign(qi,{Root:qi,Indicator:Uf}),a0=({children:t,className:e,...n})=>{const l=g.useMemo(()=>ch({class:typeof e=="string"?e:void 0}),[e]);return M.jsx(Xm,{className:l,...n,children:t})},s0=a0;function Zi({className:t,variant:e,...n}){const l=g.useMemo(()=>ah({variant:e}),[e]);return M.jsx(Zm,{className:me(t,l),"data-slot":"list-box",...n})}const D0=Object.assign(Zi,{Root:Zi,Item:u0,ItemIndicator:Uf,Section:s0}),Me=s.createContext({}),mr=({children:t,className:e,variant:n,...l})=>{const r=g.useMemo(()=>fh({variant:n}),[n]);return M.jsx(Me,{value:{slots:r},children:M.jsx(Se.div,{className:r.base({className:e}),"data-slot":"table",...l,children:t})})};mr.displayName="HeroUI.Table";const Gf=({className:t,...e})=>{const{slots:n}=s.useContext(Me);return M.jsx(Se.div,{className:de(n==null?void 0:n.scrollContainer,t),"data-slot":"table-scroll-container",...e})};Gf.displayName="HeroUI.Table.ScrollContainer";function qf({className:t,...e}){const{slots:n}=s.useContext(Me);return M.jsx(Ng,{className:me(t,n==null?void 0:n.content()),"data-slot":"table-content",...e})}qf.displayName="HeroUI.Table.Content";function Zf({className:t,...e}){const{slots:n}=s.useContext(Me);return M.jsx(Hg,{className:me(t,n==null?void 0:n.header()),"data-slot":"table-header",...e})}Zf.displayName="HeroUI.Table.Header";const Yf=g.forwardRef(({className:t,...e},n)=>{const{slots:l}=s.useContext(Me);return M.jsx(qg,{ref:n,className:me(t,l==null?void 0:l.column()),"data-slot":"table-column",...e})});Yf.displayName="HeroUI.Table.Column";function Xf({className:t,...e}){const{slots:n}=s.useContext(Me);return M.jsx(Xg,{className:me(t,n==null?void 0:n.body()),"data-slot":"table-body",...e})}Xf.displayName="HeroUI.Table.Body";function Jf({className:t,...e}){const{slots:n}=s.useContext(Me);return M.jsx(Jg,{className:me(t,n==null?void 0:n.row()),"data-slot":"table-row",...e})}Jf.displayName="HeroUI.Table.Row";const Qf=g.forwardRef(({className:t,...e},n)=>{const{slots:l}=s.useContext(Me);return M.jsx(Qg,{ref:n,className:me(t,l==null?void 0:l.cell()),"data-slot":"table-cell",...e})});Qf.displayName="HeroUI.Table.Cell";const ep=({className:t,...e})=>{const{slots:n}=s.useContext(Me);return M.jsx(Se.div,{className:de(n==null?void 0:n.footer,t),"data-slot":"table-footer",...e})};ep.displayName="HeroUI.Table.Footer";const tp=g.forwardRef(({className:t,...e},n)=>M.jsx(Lg,{ref:n,className:It("table__resizable-container",t),"data-slot":"table-resizable-container",...e}));tp.displayName="HeroUI.Table.ResizableContainer";const np=g.forwardRef(({className:t,...e},n)=>{const{slots:l}=s.useContext(Me);return M.jsx(Zg,{ref:n,className:me(t,l==null?void 0:l.columnResizer()),"data-slot":"table-column-resizer",...e})});np.displayName="HeroUI.Table.ColumnResizer";const lp=g.forwardRef(({className:t,...e},n)=>{const{slots:l}=s.useContext(Me);return M.jsx(i0,{ref:n,className:de(l==null?void 0:l.loadMore,t),"data-slot":"table-load-more",...e})});lp.displayName="HeroUI.Table.LoadMore";const rp=({className:t,...e})=>{const{slots:n}=s.useContext(Me);return M.jsx(Se.div,{className:de(n==null?void 0:n.loadMoreContent,t),"data-slot":"table-load-more-content",...e})};rp.displayName="HeroUI.Table.LoadMoreContent";const op=g.forwardRef(({children:t,className:e,indicator:n,showIndicator:l=!0,sortDirection:r,...o},i)=>{const{slots:u}=s.useContext(Me),a=l&&!!r;let c=null;if(a)if(n===void 0)c=M.jsx(Uh,{className:u==null?void 0:u.sortableColumnIndicator(),"data-direction":r,"data-slot":"table-sortable-column-indicator"});else if(g.isValidElement(n)){const f=n;c=g.cloneElement(f,{className:de(u==null?void 0:u.sortableColumnIndicator,f.props.className),"data-direction":r,"data-slot":"table-sortable-column-indicator"})}else c=n;return M.jsxs("span",{ref:i,className:de(u==null?void 0:u.sortableColumnHeader,e),"data-direction":r,"data-slot":"table-sortable-column-header",...o,children:[t,c]})});op.displayName="HeroUI.Table.SortableColumnHeader";const c0=xn,k0=Object.assign(mr,{Body:Xf,Cell:Qf,Collection:c0,Column:Yf,ColumnResizer:np,Content:qf,Footer:ep,Header:Zf,LoadMore:lp,LoadMoreContent:rp,ResizableContainer:tp,Root:mr,Row:Jf,ScrollContainer:Gf,SortableColumnHeader:op});export{y0 as $,b0 as A,m0 as B,v0 as C,S0 as D,C0 as I,w0 as L,x0 as S,E0 as T,D0 as a,u0 as b,Fp as c,g0 as d,h0 as e,$0 as f,Qb as g,k0 as h,V4 as r}; diff --git a/src/gateway/static/dashboard/assets/index-73ln6Ld4.css b/src/gateway/static/dashboard/assets/index-73ln6Ld4.css deleted file mode 100644 index 7306e1b7..00000000 --- a/src/gateway/static/dashboard/assets/index-73ln6Ld4.css +++ /dev/null @@ -1 +0,0 @@ -/*! tailwindcss v4.3.1 | MIT License | https://tailwindcss.com */@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-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0;--tw-content:"";--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-space-y-reverse:0;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-space-x-reverse:0}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, 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-red-50:oklch(97.1% .013 17.38);--color-red-200:oklch(88.5% .062 18.334);--color-red-500:oklch(63.7% .237 25.331);--color-red-700:oklch(50.5% .213 27.518);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-amber-950:oklch(27.9% .077 45.635);--color-green-50:oklch(98.2% .018 155.826);--color-green-200:oklch(92.5% .084 155.995);--color-green-500:oklch(72.3% .219 149.579);--color-green-700:oklch(52.7% .154 150.069);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-700:oklch(50.8% .118 165.612);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--leading-relaxed:1.625;--radius-xl:calc(var(--radius) * 1.5);--radius-2xl:calc(var(--radius) * 2);--radius-3xl:calc(var(--radius) * 3);--ease-out:cubic-bezier(0, 0, .2, 1);--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-md:12px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--shadow-surface:var(--surface-shadow);--shadow-overlay:var(--overlay-shadow);--border-width-field:var(--field-border-width,var(--border-width));--ease-smooth:ease;--ease-out-quad:cubic-bezier(.25, .46, .45, .94);--ease-out-quart:cubic-bezier(.165, .84, .44, 1);--ease-out-fluid:cubic-bezier(.32, .72, 0, 1);--ease-linear:linear}@layer theme.base{:root,.light,.default,[data-theme=light],[data-theme=default]{color-scheme:light;--white:oklch(100% 0 0);--black:oklch(0% 0 0);--snow:oklch(99.11% 0 0);--eclipse:oklch(21.03% .0059 285.89);--spacing:.25rem;--border-width:1px;--field-border-width:0px;--disabled-opacity:.5;--ring-offset-width:2px;--cursor-interactive:pointer;--cursor-disabled:not-allowed;--radius:.5rem;--field-radius:calc(var(--radius) * 1.5);--background:oklch(97.02% 0 0);--foreground:var(--eclipse);--surface:var(--white);--surface-foreground:var(--foreground);--surface-secondary:oklch(95.24% .0013 286.37);--surface-secondary-foreground:var(--foreground);--surface-tertiary:oklch(93.73% .0013 286.37);--surface-tertiary-foreground:var(--foreground);--overlay:var(--white);--overlay-foreground:var(--foreground);--muted:oklch(55.17% .0138 285.94);--scrollbar:var(--scrollbar-thumb);--scrollbar-thumb:var(--foreground)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--scrollbar-thumb:color-mix(in oklch, var(--foreground) 15%, transparent)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--scrollbar-track:transparent;--scrollbar-gutter:auto;--scrollbar-width:thin;--scrollbar-color:var(--scrollbar-thumb) var(--scrollbar-track);--default:oklch(94% .001 286.375);--default-foreground:var(--eclipse);--accent:oklch(62.04% .195 253.83);--accent-foreground:var(--snow);--field-background:var(--white);--field-foreground:oklch(21.03% .0059 285.89);--field-placeholder:var(--muted);--field-border:transparent;--success:oklch(73.29% .1935 150.81);--success-foreground:var(--eclipse);--warning:oklch(78.19% .1585 72.33);--warning-foreground:var(--eclipse);--danger:oklch(65.32% .2328 25.74);--danger-foreground:var(--snow);--segment:var(--white);--segment-foreground:var(--eclipse);--border:oklch(90% .004 286.32);--separator:oklch(92% .004 286.32);--focus:var(--accent);--link:var(--foreground);--backdrop:#00000080;--surface-hover:var(--surface)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--surface-hover:color-mix(in oklab, var(--surface) 92%, var(--surface-foreground) 8%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--background-secondary:var(--background)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--background-secondary:color-mix(in oklab, var(--background) 96%, var(--foreground) 4%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--background-tertiary:var(--background)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--background-tertiary:color-mix(in oklab, var(--background) 92%, var(--foreground) 8%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--background-inverse:var(--foreground);--default-hover:var(--default)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--default-hover:color-mix(in oklab, var(--default) 96%, var(--default-foreground) 4%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--accent-hover:var(--accent)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--accent-hover:color-mix(in oklab, var(--accent) 90%, var(--accent-foreground) 10%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--success-hover:var(--success)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--success-hover:color-mix(in oklab, var(--success) 90%, var(--success-foreground) 10%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--warning-hover:var(--warning)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--warning-hover:color-mix(in oklab, var(--warning) 90%, var(--warning-foreground) 10%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--danger-hover:var(--danger)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--danger-hover:color-mix(in oklab, var(--danger) 90%, var(--danger-foreground) 10%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--field-hover:var(--field-background,var(--default))}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--field-hover:color-mix(in oklab, var(--field-background,var(--default)) 90%, var(--field-foreground,var(--foreground)) 2%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--field-focus:var(--field-background,var(--default));--field-border-hover:var(--field-border,var(--border))}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--field-border-hover:color-mix(in oklab, var(--field-border,var(--border)) 88%, var(--field-foreground,var(--foreground)) 10%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--field-border-focus:var(--field-border,var(--border))}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--field-border-focus:color-mix(in oklab, var(--field-border,var(--border)) 74%, var(--field-foreground,var(--foreground)) 22%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--default-soft:var(--default)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--default-soft:color-mix(in oklab, var(--default) 50%, transparent)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--default-soft-foreground:var(--default-foreground);--default-soft-hover:var(--default)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--default-soft-hover:color-mix(in oklab, var(--default) 60%, transparent)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--accent-soft:var(--accent)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--accent-soft:color-mix(in oklab, var(--accent) 15%, transparent)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--accent-soft-foreground:var(--accent)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--accent-soft-foreground:color-mix(in oklab, var(--accent) 70%, var(--foreground) 30%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--accent-soft-hover:var(--accent)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--accent-soft-hover:color-mix(in oklab, var(--accent) 20%, transparent)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--danger-soft:var(--danger)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--danger-soft:color-mix(in oklab, var(--danger) 15%, transparent)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--danger-soft-foreground:var(--danger)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--danger-soft-foreground:color-mix(in oklab, var(--danger) 70%, var(--foreground) 40%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--danger-soft-hover:var(--danger)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--danger-soft-hover:color-mix(in oklab, var(--danger) 20%, transparent)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--warning-soft:var(--warning)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--warning-soft:color-mix(in oklab, var(--warning) 15%, transparent)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--warning-soft-foreground:var(--warning)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--warning-soft-foreground:color-mix(in oklab, var(--warning) 80%, var(--foreground) 70%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--warning-soft-hover:var(--warning)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--warning-soft-hover:color-mix(in oklab, var(--warning) 20%, transparent)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--success-soft:var(--success)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--success-soft:color-mix(in oklab, var(--success) 15%, transparent)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--success-soft-foreground:var(--success)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--success-soft-foreground:color-mix(in oklab, var(--success) 80%, var(--foreground) 60%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--success-soft-hover:var(--success)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--success-soft-hover:color-mix(in oklab, var(--success) 20%, transparent)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--separator-secondary:var(--surface)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--separator-secondary:color-mix(in oklab, var(--surface) 85%, var(--surface-foreground) 15%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--separator-tertiary:var(--surface)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--separator-tertiary:color-mix(in oklab, var(--surface) 81%, var(--surface-foreground) 19%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--border-secondary:var(--surface)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--border-secondary:color-mix(in oklab, var(--surface) 78%, var(--surface-foreground) 22%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--border-tertiary:var(--surface)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--border-tertiary:color-mix(in oklab, var(--surface) 66%, var(--surface-foreground) 34%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--surface-shadow:0 2px 4px 0 #0000000a, 0 1px 2px 0 #0000000f, 0 0 1px 0 #0000000f;--overlay-shadow:0 2px 8px 0 #0000000f, 0 -6px 12px 0 #00000008, 0 14px 28px 0 #00000014;--field-shadow:0 2px 4px 0 #0000000a, 0 1px 2px 0 #0000000f, 0 0 1px 0 #0000000f;--skeleton-animation:shimmer;--tooltip-delay:1.5s;--tooltip-close-delay:.5s}.dark,[data-theme=dark]{color-scheme:dark;--background:oklch(12% .005 285.823);--foreground:var(--snow);--surface:oklch(21.03% .0059 285.89);--surface-foreground:var(--foreground);--surface-secondary:oklch(25.7% .0037 286.14);--surface-tertiary:oklch(27.21% .0024 247.91);--overlay:oklch(21.03% .0059 285.89);--overlay-foreground:var(--foreground);--muted:oklch(70.5% .015 286.067);--scrollbar:var(--scrollbar-thumb);--scrollbar-thumb:var(--foreground)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--scrollbar-thumb:color-mix(in oklch, var(--foreground) 15%, transparent)}}.dark,[data-theme=dark]{--scrollbar-track:transparent;--scrollbar-gutter:auto;--scrollbar-width:thin;--scrollbar-color:var(--scrollbar-thumb) var(--scrollbar-track);--default:oklch(27.4% .006 286.033);--default-foreground:var(--snow);--field-background:oklch(21.03% .0059 285.89);--field-foreground:var(--foreground);--warning:oklch(82.03% .1388 76.34);--warning-foreground:var(--eclipse);--danger:oklch(59.4% .1967 24.63);--danger-foreground:var(--snow);--segment:oklch(39.64% .01 285.93);--segment-foreground:var(--foreground);--border:oklch(28% .006 286.033);--separator:oklch(25% .006 286.033);--focus:var(--accent);--link:var(--foreground);--backdrop:#0009;--surface-shadow:0 0 0 0 transparent inset;--overlay-shadow:0 0 1px 0 #ffffff4d inset;--field-shadow:0 0 0 0 transparent inset;--surface-hover:var(--surface)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--surface-hover:color-mix(in oklab, var(--surface) 92%, var(--surface-foreground) 8%)}}.dark,[data-theme=dark]{--background-secondary:var(--background)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--background-secondary:color-mix(in oklab, var(--background) 96%, var(--foreground) 4%)}}.dark,[data-theme=dark]{--background-tertiary:var(--background)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--background-tertiary:color-mix(in oklab, var(--background) 92%, var(--foreground) 8%)}}.dark,[data-theme=dark]{--background-inverse:var(--foreground);--default-hover:var(--default)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--default-hover:color-mix(in oklab, var(--default) 96%, var(--default-foreground) 4%)}}.dark,[data-theme=dark]{--accent-hover:var(--accent)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--accent-hover:color-mix(in oklab, var(--accent) 90%, var(--accent-foreground) 10%)}}.dark,[data-theme=dark]{--success-hover:var(--success)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--success-hover:color-mix(in oklab, var(--success) 90%, var(--success-foreground) 10%)}}.dark,[data-theme=dark]{--warning-hover:var(--warning)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--warning-hover:color-mix(in oklab, var(--warning) 90%, var(--warning-foreground) 10%)}}.dark,[data-theme=dark]{--danger-hover:var(--danger)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--danger-hover:color-mix(in oklab, var(--danger) 90%, var(--danger-foreground) 10%)}}.dark,[data-theme=dark]{--field-hover:var(--field-background,var(--default))}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--field-hover:color-mix(in oklab, var(--field-background,var(--default)) 90%, var(--field-foreground,var(--foreground)) 2%)}}.dark,[data-theme=dark]{--field-focus:var(--field-background,var(--default));--field-border-hover:var(--field-border,var(--border))}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--field-border-hover:color-mix(in oklab, var(--field-border,var(--border)) 88%, var(--field-foreground,var(--foreground)) 10%)}}.dark,[data-theme=dark]{--field-border-focus:var(--field-border,var(--border))}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--field-border-focus:color-mix(in oklab, var(--field-border,var(--border)) 74%, var(--field-foreground,var(--foreground)) 22%)}}.dark,[data-theme=dark]{--default-soft:var(--default)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--default-soft:color-mix(in oklab, var(--default) 50%, transparent)}}.dark,[data-theme=dark]{--default-soft-foreground:var(--default-foreground);--default-soft-hover:var(--default)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--default-soft-hover:color-mix(in oklab, var(--default) 60%, transparent)}}.dark,[data-theme=dark]{--accent-soft:var(--accent)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--accent-soft:color-mix(in oklab, var(--accent) 12%, transparent)}}.dark,[data-theme=dark]{--accent-soft-foreground:var(--accent)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--accent-soft-foreground:color-mix(in oklab, var(--accent) 80%, var(--foreground) 30%)}}.dark,[data-theme=dark]{--accent-soft-hover:var(--accent)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--accent-soft-hover:color-mix(in oklab, var(--accent) 16%, transparent)}}.dark,[data-theme=dark]{--danger-soft:var(--danger)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--danger-soft:color-mix(in oklab, var(--danger) 15%, transparent)}}.dark,[data-theme=dark]{--danger-soft-foreground:var(--danger)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--danger-soft-foreground:color-mix(in oklab, var(--danger) 80%, var(--foreground) 30%)}}.dark,[data-theme=dark]{--danger-soft-hover:var(--danger)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--danger-soft-hover:color-mix(in oklab, var(--danger) 20%, transparent)}}.dark,[data-theme=dark]{--warning-soft:var(--warning)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--warning-soft:color-mix(in oklab, var(--warning) 12%, transparent)}}.dark,[data-theme=dark]{--warning-soft-foreground:var(--warning)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--warning-soft-foreground:color-mix(in oklab, var(--warning) 80%, var(--foreground) 30%)}}.dark,[data-theme=dark]{--warning-soft-hover:var(--warning)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--warning-soft-hover:color-mix(in oklab, var(--warning) 16%, transparent)}}.dark,[data-theme=dark]{--success-soft:var(--success)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--success-soft:color-mix(in oklab, var(--success) 12%, transparent)}}.dark,[data-theme=dark]{--success-soft-foreground:var(--success)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--success-soft-foreground:color-mix(in oklab, var(--success) 80%, var(--foreground) 30%)}}.dark,[data-theme=dark]{--success-soft-hover:var(--success)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--success-soft-hover:color-mix(in oklab, var(--success) 16%, transparent)}}.dark,[data-theme=dark]{--separator-secondary:var(--surface)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--separator-secondary:color-mix(in oklab, var(--surface) 85%, var(--surface-foreground) 15%)}}.dark,[data-theme=dark]{--separator-tertiary:var(--surface)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--separator-tertiary:color-mix(in oklab, var(--surface) 81%, var(--surface-foreground) 19%)}}.dark,[data-theme=dark]{--border-secondary:var(--surface)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--border-secondary:color-mix(in oklab, var(--surface) 78%, var(--surface-foreground) 22%)}}.dark,[data-theme=dark]{--border-tertiary:var(--surface)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--border-tertiary:color-mix(in oklab, var(--surface) 66%, var(--surface-foreground) 34%)}}[data-vibrant-palette=true]:not(.dark):not([data-theme=dark]){--accent-soft-foreground:var(--accent)}@supports (color:color-mix(in lab,red,red)){[data-vibrant-palette=true]:not(.dark):not([data-theme=dark]){--accent-soft-foreground:color-mix(in oklab, var(--accent) 92%, var(--foreground) 8%)}}[data-vibrant-palette=true]:not(.dark):not([data-theme=dark]){--danger-soft-foreground:var(--danger)}@supports (color:color-mix(in lab,red,red)){[data-vibrant-palette=true]:not(.dark):not([data-theme=dark]){--danger-soft-foreground:color-mix(in oklab, var(--danger) 92%, var(--foreground) 8%)}}[data-vibrant-palette=true]:not(.dark):not([data-theme=dark]){--warning-soft-foreground:var(--warning)}@supports (color:color-mix(in lab,red,red)){[data-vibrant-palette=true]:not(.dark):not([data-theme=dark]){--warning-soft-foreground:color-mix(in oklab, var(--warning) 92%, var(--foreground) 8%)}}[data-vibrant-palette=true]:not(.dark):not([data-theme=dark]){--success-soft-foreground:var(--success)}@supports (color:color-mix(in lab,red,red)){[data-vibrant-palette=true]:not(.dark):not([data-theme=dark]){--success-soft-foreground:color-mix(in oklab, var(--success) 92%, var(--foreground) 8%)}}[data-vibrant-palette=true].dark,[data-vibrant-palette=true][data-theme=dark]{--accent-soft-foreground:var(--accent)}@supports (color:color-mix(in lab,red,red)){[data-vibrant-palette=true].dark,[data-vibrant-palette=true][data-theme=dark]{--accent-soft-foreground:color-mix(in oklab, var(--accent) 92%, var(--foreground) 8%)}}[data-vibrant-palette=true].dark,[data-vibrant-palette=true][data-theme=dark]{--danger-soft-foreground:var(--danger)}@supports (color:color-mix(in lab,red,red)){[data-vibrant-palette=true].dark,[data-vibrant-palette=true][data-theme=dark]{--danger-soft-foreground:color-mix(in oklab, var(--danger) 92%, var(--foreground) 8%)}}[data-vibrant-palette=true].dark,[data-vibrant-palette=true][data-theme=dark]{--warning-soft-foreground:var(--warning)}@supports (color:color-mix(in lab,red,red)){[data-vibrant-palette=true].dark,[data-vibrant-palette=true][data-theme=dark]{--warning-soft-foreground:color-mix(in oklab, var(--warning) 92%, var(--foreground) 8%)}}[data-vibrant-palette=true].dark,[data-vibrant-palette=true][data-theme=dark]{--success-soft-foreground:var(--success)}@supports (color:color-mix(in lab,red,red)){[data-vibrant-palette=true].dark,[data-vibrant-palette=true][data-theme=dark]{--success-soft-foreground:color-mix(in oklab, var(--success) 92%, var(--foreground) 8%)}}}@layer components;}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{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]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*,:after,:before,::backdrop{border-color:var(--border,currentColor)}::file-selector-button{border-color:var(--border,currentColor)}:root{view-transition-name:none}::view-transition{pointer-events:none}[data-scrollbar=thin]{--scrollbar-width:thin;--scrollbar-color:var(--scrollbar-thumb) var(--scrollbar-track);--scrollbar-gutter:auto}[data-scrollbar=default]{--scrollbar-width:auto;--scrollbar-color:auto;--scrollbar-gutter:auto}[data-scrollbar=none]{--scrollbar-width:none;--scrollbar-color:auto;--scrollbar-gutter:auto}}@layer components{.close-button{isolation:isolate;height:calc(var(--spacing) * 6);width:calc(var(--spacing) * 6);transform-origin:50%;border-radius:calc(var(--radius) * 1.5);padding:var(--spacing);-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;cursor:var(--cursor-interactive);transition:transform .25s var(--ease-out-quart),color .15s var(--ease-out),background-color .1s var(--ease-out),box-shadow .15s var(--ease-out);transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);flex-shrink:0;justify-content:center;align-items:center;display:inline-flex;position:relative}.close-button:is([data-reduce-motion=true],[data-reduce-motion=true] *),.close-button:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.close-button:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.close-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.close-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.close-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.close-button:focus-visible:not(:focus),.close-button[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.close-button:disabled,.close-button[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.close-button[data-pending=true]{pointer-events:none}.close-button svg{pointer-events:none;width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);margin-inline:calc(var(--spacing) * -.5);margin-block:calc(var(--spacing) * .5);flex-shrink:0;align-self:center}.close-button--default{background-color:var(--default);color:var(--muted)}@media(hover:hover){.close-button--default:hover,.close-button--default[data-hovered=true]{background-color:var(--default-hover)}}.close-button--default:active,.close-button--default[data-pressed=true]{transform:scale(.93)}.description{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));text-wrap:wrap;overflow-wrap:break-word;color:var(--muted)}.error-message{height:auto;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));overflow-wrap:break-word;color:var(--danger);transition:opacity .15s var(--ease-out),height .35s var(--ease-smooth)}.error-message:is([data-reduce-motion=true],[data-reduce-motion=true] *),.error-message:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.error-message:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.error-message:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.error-message:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.error-message:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.field-error{height:0;padding-inline:var(--spacing);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));overflow-wrap:break-word;color:var(--danger);opacity:0}.field-error[data-visible]{opacity:1;height:auto}.field-error{transition:opacity .15s var(--ease-out),height .35s var(--ease-smooth)}.field-error:is([data-reduce-motion=true],[data-reduce-motion=true] *),.field-error:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.field-error:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.field-error:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.field-error:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.field-error:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.checkbox>.field-error,.checkbox>[data-slot=field-error],.switch>.field-error,.switch>[data-slot=field-error],.radio>.field-error,.radio>[data-slot=field-error]{height:auto;min-height:0;color:var(--muted);opacity:1;margin:0;padding:0;transition:none}.label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--foreground)}:is(.label--required,[data-required=true]:not([role=group]):not([role=radiogroup]):not([role=checkboxgroup])>.label,[data-required=true]:not([data-slot=radio]):not([data-slot=checkbox])>.label):after{margin-left:calc(var(--spacing) * .5);color:var(--danger);--tw-content:"*";content:var(--tw-content)}.label--disabled,[data-disabled=true] .label{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.label--invalid,[data-invalid=true] .label,[aria-invalid=true] .label{color:var(--danger)}.accordion{contain:layout style;width:100%}.accordion__body{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.accordion__body-inner{padding-inline:calc(var(--spacing) * 4);padding-top:0;padding-bottom:calc(var(--spacing) * 4);color:var(--muted)}.accordion__indicator{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);color:var(--muted);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.25s;flex-shrink:0;margin-left:auto;transition-duration:.25s}.accordion__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *),.accordion__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.accordion__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.accordion__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.accordion__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.accordion__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.accordion__indicator[data-expanded=true]{rotate:-180deg}.accordion__item{--tw-border-style:none;border-style:none;position:relative}.accordion__item:after{content:"";border-radius:calc(var(--radius) * .25);background-color:var(--separator);width:100%;height:1px;position:absolute;bottom:0;left:0}.accordion__item:last-child:after{content:none}.accordion__item[data-hide-separator=true]:after{display:none}.accordion__trigger{cursor:var(--cursor-interactive);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 4);text-align:left;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);-webkit-tap-highlight-color:transparent;transition:opacity .15s var(--ease-out),box-shadow .15s var(--ease-out);flex:1;justify-content:space-between;align-items:center;display:flex}.accordion__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *),.accordion__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.accordion__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.accordion__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.accordion__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.accordion__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}@media(hover:hover){.accordion__trigger:hover:not([aria-expanded=true]),.accordion__trigger[data-hovered=true]:not([aria-expanded=true]){background-color:var(--foreground)}@supports (color:color-mix(in lab,red,red)){.accordion__trigger:hover:not([aria-expanded=true]),.accordion__trigger[data-hovered=true]:not([aria-expanded=true]){background-color:color-mix(in oklab,var(--foreground) 3%,transparent 90%)}}}.accordion__trigger:focus-visible:not(:focus),.accordion__trigger[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.accordion__trigger:disabled,.accordion__trigger[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.accordion__panel{opacity:0;height:var(--disclosure-panel-height);transition:height .2s var(--ease-out-quad),opacity .2s var(--ease-out);overflow:clip}.accordion__panel:is([data-reduce-motion=true],[data-reduce-motion=true] *),.accordion__panel:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.accordion__panel:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.accordion__panel:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.accordion__panel:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.accordion__panel:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.accordion__panel[data-expanded=true]{will-change:height,opacity;opacity:1}.accordion--surface{background-color:var(--surface);border-radius:min(32px,var(--radius-3xl))}@media(hover:hover){.accordion--surface .accordion__trigger:hover:not([aria-expanded=true]),.accordion--surface .accordion__trigger[data-hovered=true]:not([aria-expanded=true]){background-color:var(--default)}}.accordion--surface .accordion__item:after{background-color:var(--surface-foreground)}@supports (color:color-mix(in lab,red,red)){.accordion--surface .accordion__item:after{background-color:color-mix(in oklab,var(--surface-foreground) 6%,transparent)}}.accordion--surface .accordion__item:after{width:94%;left:3%}.accordion--surface .accordion__item:first-child [data-slot=accordion-trigger]{border-top-left-radius:min(32px,var(--radius-3xl));border-top-right-radius:min(32px,var(--radius-3xl))}.accordion--surface .accordion__item:last-child:not(:has([data-slot=accordion-trigger][aria-expanded=true])) [data-slot=accordion-trigger]{border-bottom-left-radius:min(32px,var(--radius-3xl));border-bottom-right-radius:min(32px,var(--radius-3xl))}.breadcrumbs{align-items:center;display:flex}.breadcrumbs .breadcrumbs__link{padding-inline:calc(var(--spacing) * .5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--muted);opacity:1;text-decoration-line:none;position:relative}.breadcrumbs .breadcrumbs__link:hover,.breadcrumbs .breadcrumbs__link[data-hovered=true]{text-decoration-line:underline}.breadcrumbs .breadcrumbs__link[data-current=true]{color:var(--link);opacity:1}.breadcrumbs .breadcrumbs__item{justify-content:center;align-items:center;gap:calc(var(--spacing) * .5);padding-inline:calc(var(--spacing) * .5);flex-shrink:0;display:flex}.breadcrumbs .breadcrumbs__separator{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3);color:var(--muted)}.breadcrumbs .breadcrumbs__separator:where(:dir(rtl),[dir=rtl],[dir=rtl] *){rotate:180deg}.disclosure-group{contain:layout style;width:100%}.disclosure{position:relative}.accordion__heading{display:flex}.disclosure__trigger{cursor:var(--cursor-interactive);-webkit-tap-highlight-color:transparent;display:inline-block}.disclosure__trigger:focus-visible:not(:focus),.disclosure__trigger[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.disclosure__trigger:disabled,.disclosure__trigger[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.disclosure__indicator{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);color:inherit;transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.25s;flex-shrink:0;margin-left:auto;transition-duration:.25s}.disclosure__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *),.disclosure__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.disclosure__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.disclosure__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.disclosure__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.disclosure__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.disclosure__indicator[data-expanded=true]{rotate:-180deg}.disclosure__content{opacity:0;height:var(--disclosure-panel-height);transition:height .2s var(--ease-out-quad),opacity .2s var(--ease-out);overflow:clip}.disclosure__content:is([data-reduce-motion=true],[data-reduce-motion=true] *),.disclosure__content:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.disclosure__content:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.disclosure__content:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.disclosure__content:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.disclosure__content:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.disclosure__content[data-expanded=true]{will-change:height,opacity;opacity:1}.disclosure__body{padding:calc(var(--spacing) * 2)}.link{border-radius:calc(var(--radius) * 1.5);--tw-font-weight:var(--font-weight-medium);width:fit-content;height:fit-content;font-weight:var(--font-weight-medium);color:var(--link);text-decoration-line:none;-webkit-text-decoration-color:var(--separator-tertiary);text-decoration-color:var(--separator-tertiary);text-underline-offset:4px;-webkit-tap-highlight-color:transparent;transition:color .1s var(--ease-smooth),background-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out),opacity .1s var(--ease-out);align-items:center;text-decoration-thickness:1.5px;display:inline-flex;position:relative}.link:is([data-reduce-motion=true],[data-reduce-motion=true] *),.link:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.link:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.link:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.link:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.link:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.link{cursor:var(--cursor-interactive)}@media(hover:hover){.link:hover,.link[data-hovered=true]{text-decoration-line:underline;-webkit-text-decoration-color:var(--muted);text-decoration-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.link:hover,.link[data-hovered=true]{-webkit-text-decoration-color:color-mix(in oklab,var(--muted) 50%,transparent);text-decoration-color:color-mix(in oklab,var(--muted) 50%,transparent)}}:is(.link:hover,.link[data-hovered=true]) .link__icon{opacity:1}}.link:active,.link[data-pressed=true]{text-decoration-line:underline;-webkit-text-decoration-color:var(--muted);text-decoration-color:var(--muted)}:is(.link:active,.link[data-pressed=true]) .link__icon{opacity:1}.link:focus-visible:not(:focus),.link[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}:is(.link:focus-visible:not(:focus),.link[data-focus-visible=true]) .link__icon{opacity:1}.link[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.link .link__icon{pointer-events:none;color:currentColor;opacity:.6;width:.75em;height:.75em;transition:opacity .15s var(--ease-out);flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.link .link__icon:is([data-reduce-motion=true],[data-reduce-motion=true] *),.link .link__icon:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.link .link__icon:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.link .link__icon:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.link .link__icon:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.link .link__icon:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.link .link__icon svg{transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.link .link__icon[data-default-icon=true]{margin-left:var(--spacing);padding-bottom:calc(var(--spacing) * 1.5)}.link.button{gap:0;text-decoration-line:none}.pagination{justify-content:space-between;align-items:center;gap:calc(var(--spacing) * 4);flex-direction:column;width:100%;display:flex}@media(min-width:40rem){.pagination{flex-direction:row}}.pagination__summary{align-items:center;gap:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--muted);align-self:flex-start;display:flex}@media(min-width:40rem){.pagination__summary{align-self:center}}.pagination__content{align-items:center;gap:var(--spacing);align-self:flex-start;display:flex}@media(min-width:40rem){.pagination__content{align-self:center}}.pagination__item{display:inline-flex}.pagination__link{isolation:isolate;width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9);transform-origin:50%;border-radius:calc(var(--radius) * 3);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);white-space:nowrap;--tw-outline-style:none;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;outline-style:none;justify-content:center;align-items:center;display:inline-flex;position:relative}@media(min-width:48rem){.pagination__link{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}}.pagination__link{cursor:var(--cursor-interactive);transition:transform .25s var(--ease-smooth),background-color .1s var(--ease-out),box-shadow .1s var(--ease-out);transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.pagination__link:is([data-reduce-motion=true],[data-reduce-motion=true] *),.pagination__link:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.pagination__link:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.pagination__link:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.pagination__link:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.pagination__link:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.pagination__link{--pagination-link-bg:transparent;--pagination-link-bg-hover:var(--default-hover);--pagination-link-bg-pressed:var(--default-hover);--pagination-link-fg:var(--default-foreground);background-color:var(--pagination-link-bg);color:var(--pagination-link-fg)}.pagination__link:focus-visible,.pagination__link[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.pagination__link:disabled,.pagination__link[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}@media(hover:hover){.pagination__link:hover,.pagination__link[data-hovered=true]{background-color:var(--pagination-link-bg-hover)}}.pagination__link:active,.pagination__link[data-pressed=true]{background-color:var(--pagination-link-bg-pressed);transform:scale(.97)}.pagination__link[data-active=true]{--pagination-link-bg:var(--default);--pagination-link-bg-hover:var(--default-hover);--pagination-link-bg-pressed:var(--default-hover)}.pagination__ellipsis{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--muted);-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;display:inline-flex}@media(min-width:48rem){.pagination__ellipsis{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}}.pagination__link--nav{gap:calc(var(--spacing) * 1.5);width:auto;padding-inline:calc(var(--spacing) * 2.5)}.pagination--sm .pagination__link{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}@media(min-width:48rem){.pagination--sm .pagination__link{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}}.pagination--sm .pagination__link:active,.pagination--sm .pagination__link[data-pressed=true]{transform:scale(.98)}.pagination--sm .pagination__link--nav{width:auto;padding-inline:calc(var(--spacing) * 2)}.pagination--sm .pagination__ellipsis{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}@media(min-width:48rem){.pagination--sm .pagination__ellipsis{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}}.pagination--sm .pagination__summary{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.pagination--lg .pagination__link{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}@media(min-width:48rem){.pagination--lg .pagination__link{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}}.pagination--lg .pagination__link:active,.pagination--lg .pagination__link[data-pressed=true]{transform:scale(.96)}.pagination--lg .pagination__link--nav{width:auto;padding-inline:calc(var(--spacing) * 3)}.pagination--lg .pagination__ellipsis{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}@media(min-width:48rem){.pagination--lg .pagination__ellipsis{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}}.pagination--lg .pagination__summary{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.tabs{gap:calc(var(--spacing) * 2);display:flex}.tabs[data-orientation=horizontal]{flex-direction:column}.tabs[data-orientation=vertical]{flex-direction:row}.tabs__list-container{position:relative}.tabs__list{background-color:var(--default);padding:var(--spacing);border-radius:calc(var(--radius) * 2.5);display:inline-flex}.tabs__list[data-orientation=horizontal]{flex-direction:row;width:100%}.tabs__list[data-orientation=vertical]{gap:var(--spacing);flex-direction:column}.tabs__list[data-orientation=vertical] .tabs__tab{min-width:calc(var(--spacing) * 20)}.tabs__tab{z-index:1;cursor:var(--cursor-interactive);height:calc(var(--spacing) * 8);border-radius:calc(var(--radius) * 3);width:100%;padding-inline:calc(var(--spacing) * 4);text-align:center;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--muted);--tw-outline-style:none;-webkit-tap-highlight-color:transparent;transition:color .15s var(--ease-smooth),background-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out),opacity .15s var(--ease-smooth);outline-style:none;justify-content:center;align-items:center;display:flex;position:relative}.tabs__tab:is([data-reduce-motion=true],[data-reduce-motion=true] *),.tabs__tab:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.tabs__tab:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.tabs__tab:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.tabs__tab:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.tabs__tab:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.tabs__tab[data-selected=true]{color:var(--segment-foreground)}.tabs__tab[data-selected=true] .tabs__separator,.tabs__tab[data-selected=true]+.tabs__tab .tabs__separator{opacity:0}.tabs__tab:disabled,.tabs__tab[data-disabled=true],.tabs__tab[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}@media(hover:hover){.tabs__tab:not([data-selected=true]):not([data-disabled=true]):hover,.tabs__tab[data-hovered=true]:not([data-selected=true]):not([data-disabled=true]){opacity:.7}}.tabs__tab:focus-visible:not(:focus),.tabs__tab[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.tabs__separator{border-radius:calc(var(--radius) * .5);background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.tabs__separator{background-color:color-mix(in oklab,var(--muted) 25%,transparent)}}.tabs__separator{pointer-events:none;transition:opacity .15s var(--ease-smooth);position:absolute}.tabs__separator:is([data-reduce-motion=true],[data-reduce-motion=true] *),.tabs__separator:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.tabs__separator:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.tabs__separator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.tabs__separator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.tabs__separator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.tabs__list[data-orientation=horizontal] .tabs__separator{width:1px;height:50%;top:25%;left:0}.tabs__list[data-orientation=vertical] .tabs__separator{width:90%;height:1px;top:0;left:5%}.tabs__panel{width:100%;padding:calc(var(--spacing) * 2);--tw-outline-style:none;outline-style:none}.tabs__panel[data-exiting=true]{width:100%;position:absolute;top:0;left:0}.tabs__panel[data-orientation=horizontal]{margin-top:calc(var(--spacing) * 4)}.tabs__panel[data-orientation=vertical]{margin-left:calc(var(--spacing) * 4)}.tabs__indicator{box-shadow:var(--shadow-surface);z-index:-1;border-radius:var(--radius-3xl);background-color:var(--segment);width:100%;height:100%;transition-property:translate,width,height;transition-duration:.25s;transition-timing-function:var(--ease-out-fluid);position:absolute;top:0;left:0}.tabs__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *),.tabs__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.tabs__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.tabs__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.tabs__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.tabs__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.tabs--secondary>.tabs__list-container>.tabs__list{background-color:#0000;border-radius:0;padding:0}.tabs--secondary>.tabs__list-container>.tabs__list[data-orientation=horizontal]{scrollbar-color:auto;scrollbar-gutter:auto;-ms-overflow-style:none;scrollbar-width:none;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--border);max-width:100%;overflow:auto clip}.tabs--secondary>.tabs__list-container>.tabs__list[data-orientation=vertical]{border-left-style:var(--tw-border-style);border-left-width:1px;border-color:var(--border)}.tabs--secondary>.tabs__list-container .tabs__tab{border-radius:0}.tabs--secondary>.tabs__list-container .tabs__tab[data-selected=true]{color:var(--foreground)}.tabs--secondary>.tabs__list-container .tabs__separator{display:none}.tabs--secondary>.tabs__list-container .tabs__indicator{background-color:var(--accent);box-shadow:none;border-radius:0}.tabs--secondary[data-orientation=horizontal]>.tabs__list-container .tabs__indicator{height:2px;top:auto;bottom:0}.tabs--secondary[data-orientation=vertical]>.tabs__list-container .tabs__indicator{width:2px;height:100%;top:0;left:0}.button{isolation:isolate;height:calc(var(--spacing) * 10);transform-origin:50%;justify-content:center;align-items:center;gap:calc(var(--spacing) * 2);border-radius:calc(var(--radius) * 3);width:fit-content;padding-inline:calc(var(--spacing) * 4);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);white-space:nowrap;--tw-outline-style:none;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;outline-style:none;display:inline-flex;position:relative}@media(min-width:48rem){.button{height:calc(var(--spacing) * 9)}}.button{transition:transform .25s var(--ease-smooth),background-color .1s var(--ease-out),box-shadow .1s var(--ease-out);transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.button:is([data-reduce-motion=true],[data-reduce-motion=true] *),.button:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.button:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.button{cursor:var(--cursor-interactive);--button-bg:transparent;--button-bg-hover:var(--button-bg);--button-bg-pressed:var(--button-bg-hover);--button-fg:currentColor;background-color:var(--button-bg);color:var(--button-fg)}.button:focus-visible:not(:focus),.button[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.button:disabled,.button[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.button[data-pending=true]{pointer-events:none}.button:active,.button[data-pressed=true]{background-color:var(--button-bg-pressed);transform:scale(.97)}@media(hover:hover){.button:hover,.button[data-hovered=true]{background-color:var(--button-bg-hover)}}.button svg:not([data-slot=spinner] svg,[data-slot=link-icon] svg){pointer-events:none;margin-inline:calc(var(--spacing) * -.5);margin-block:calc(var(--spacing) * .5);width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5);flex-shrink:0;align-self:center}@media(min-width:40rem){.button svg:not([data-slot=spinner] svg,[data-slot=link-icon] svg){margin-block:var(--spacing);width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}}.button--sm{height:calc(var(--spacing) * 9);padding-inline:calc(var(--spacing) * 3)}@media(min-width:48rem){.button--sm{height:calc(var(--spacing) * 8)}}.button--sm svg:not([data-slot=spinner] svg,[data-slot=link-icon] svg){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.button--sm:active,.button--sm[data-pressed=true]{transform:scale(.98)}.button--lg{height:calc(var(--spacing) * 11);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}@media(min-width:48rem){.button--lg{height:calc(var(--spacing) * 10)}}.button--lg:active,.button--lg[data-pressed=true]{transform:scale(.96)}.button--primary{--button-bg:var(--accent);--button-bg-hover:var(--accent-hover);--button-bg-pressed:var(--accent-hover);--button-fg:var(--accent-foreground)}.button--secondary{--button-bg:var(--default);--button-bg-hover:var(--default-hover);--button-bg-pressed:var(--default-hover);--button-fg:var(--accent-soft-foreground)}.button--tertiary{--button-bg:var(--default);--button-bg-hover:var(--default-hover);--button-bg-pressed:var(--default-hover)}.button--ghost,.button--outline{--button-bg:transparent;--button-bg-hover:var(--default);--button-bg-pressed:var(--default);--button-fg:var(--default-foreground)}.button--outline{border-style:var(--tw-border-style);border-width:1px;border-color:var(--border);--button-bg-hover:var(--default)}@supports (color:color-mix(in lab,red,red)){.button--outline{--button-bg-hover:color-mix(in srgb, var(--default) 60%, transparent)}}.button--danger{--button-bg:var(--danger);--button-bg-hover:var(--danger-hover);--button-bg-pressed:var(--danger-hover);--button-fg:var(--danger-foreground)}.button--danger-soft{--button-bg:var(--danger-soft);--button-bg-hover:var(--danger-soft-hover);--button-bg-pressed:var(--danger-soft-hover);--button-fg:var(--danger-soft-foreground)}.button--icon-only{width:calc(var(--spacing) * 10);padding:0}@media(min-width:48rem){.button--icon-only{width:calc(var(--spacing) * 9)}}.button--icon-only.button--sm{width:calc(var(--spacing) * 9)}@media(min-width:48rem){.button--icon-only.button--sm{width:calc(var(--spacing) * 8)}}.button--icon-only.button--lg{width:calc(var(--spacing) * 11)}@media(min-width:48rem){.button--icon-only.button--lg{width:calc(var(--spacing) * 10)}}.button--full-width{width:100%}.button-group{justify-content:center;align-items:center;gap:0;height:auto;display:inline-flex}.button-group--horizontal{flex-direction:row}.button-group--vertical{flex-direction:column}.button-group .button{border-radius:0}.button-group--horizontal .button:first-child{border-start-start-radius:calc(var(--radius) * 3);border-end-start-radius:calc(var(--radius) * 3)}.button-group--horizontal .button:last-child{border-start-end-radius:calc(var(--radius) * 3);border-end-end-radius:calc(var(--radius) * 3)}.button-group--horizontal .button:first-child:last-child{border-radius:calc(var(--radius) * 3)}.button-group--vertical .button:first-child{border-top-left-radius:calc(var(--radius) * 3);border-top-right-radius:calc(var(--radius) * 3)}.button-group--vertical .button:last-child{border-bottom-right-radius:calc(var(--radius) * 3);border-bottom-left-radius:calc(var(--radius) * 3)}.button-group--vertical .button:first-child:last-child{border-radius:calc(var(--radius) * 3)}.button-group .button:active,.button-group .button[data-pressed=true]{transform:none}.button-group .button:focus-visible:not(:focus),.button-group .button[data-focus-visible=true]{--tw-ring-offset-width:0px;--tw-ring-inset:inset}.button-group__separator{border-radius:calc(var(--radius) * .5);opacity:.15;pointer-events:none;transition:opacity .15s var(--ease-smooth);background-color:currentColor;position:absolute}.button-group__separator:is([data-reduce-motion=true],[data-reduce-motion=true] *),.button-group__separator:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.button-group__separator:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.button-group__separator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.button-group__separator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.button-group__separator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.button-group--horizontal .button-group__separator{width:1px;height:50%;top:25%;left:-1px}.button-group--vertical .button-group__separator{width:50%;height:1px;top:-1px;left:25%}.button-group--horizontal .button--outline:first-child{border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}.button-group--horizontal .button--outline:last-child{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.button-group--horizontal .button--outline:not(:first-child):not(:last-child){border-inline-style:var(--tw-border-style);border-inline-width:0}.button-group--vertical .button--outline:first-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.button-group--vertical .button--outline:last-child{border-top-style:var(--tw-border-style);border-top-width:0}.button-group--vertical .button--outline:not(:first-child):not(:last-child){border-block-style:var(--tw-border-style);border-block-width:0}.button-group--full-width{width:100%}.toggle-button{isolation:isolate;height:calc(var(--spacing) * 10);transform-origin:50%;justify-content:center;align-items:center;gap:calc(var(--spacing) * 2);border-radius:calc(var(--radius) * 3);width:fit-content;padding-inline:calc(var(--spacing) * 4);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);white-space:nowrap;--tw-outline-style:none;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;outline-style:none;display:inline-flex;position:relative}@media(min-width:48rem){.toggle-button{height:calc(var(--spacing) * 9)}}.toggle-button{transition:transform .25s var(--ease-smooth),background-color .1s var(--ease-out),box-shadow .1s var(--ease-out);transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.toggle-button:is([data-reduce-motion=true],[data-reduce-motion=true] *),.toggle-button:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.toggle-button:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.toggle-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.toggle-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.toggle-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.toggle-button{cursor:var(--cursor-interactive);--toggle-button-bg:var(--default);--toggle-button-bg-hover:var(--default-hover);--toggle-button-bg-pressed:var(--default-hover);--toggle-button-fg:currentColor;--toggle-button-bg-selected:var(--accent-soft);--toggle-button-bg-selected-hover:var(--accent-soft-hover);--toggle-button-bg-selected-pressed:var(--accent-soft-hover);--toggle-button-fg-selected:var(--accent-soft-foreground);background-color:var(--toggle-button-bg);color:var(--toggle-button-fg)}.toggle-button:focus-visible:not(:focus),.toggle-button[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.toggle-button:disabled,.toggle-button[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}@media(hover:hover){.toggle-button:hover,.toggle-button[data-hovered=true]{background-color:var(--toggle-button-bg-hover)}}.toggle-button:active,.toggle-button[data-pressed=true]{background-color:var(--toggle-button-bg-pressed);transform:scale(.97)}.toggle-button[data-selected=true]{background-color:var(--toggle-button-bg-selected);color:var(--toggle-button-fg-selected)}@media(hover:hover){.toggle-button[data-selected=true]:hover,.toggle-button[data-selected=true][data-hovered=true]{background-color:var(--toggle-button-bg-selected-hover)}}.toggle-button[data-selected=true]:active,.toggle-button[data-selected=true][data-pressed=true]{background-color:var(--toggle-button-bg-selected-pressed)}.toggle-button svg{pointer-events:none;margin-inline:calc(var(--spacing) * -.5);margin-block:calc(var(--spacing) * .5);width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5);flex-shrink:0;align-self:center}@media(min-width:40rem){.toggle-button svg{margin-block:var(--spacing);width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}}.toggle-button--sm{height:calc(var(--spacing) * 9);padding-inline:calc(var(--spacing) * 3)}@media(min-width:48rem){.toggle-button--sm{height:calc(var(--spacing) * 8)}}.toggle-button--sm svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.toggle-button--sm:active,.toggle-button--sm[data-pressed=true]{transform:scale(.98)}.toggle-button--lg{height:calc(var(--spacing) * 11);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}@media(min-width:48rem){.toggle-button--lg{height:calc(var(--spacing) * 10)}}.toggle-button--lg:active,.toggle-button--lg[data-pressed=true]{transform:scale(.96)}.toggle-button--default{--toggle-button-bg:var(--default);--toggle-button-bg-hover:var(--default-hover);--toggle-button-bg-pressed:var(--default-hover)}.toggle-button--ghost{--toggle-button-bg:transparent;--toggle-button-bg-hover:var(--default);--toggle-button-bg-pressed:var(--default);--toggle-button-fg:var(--default-foreground)}.toggle-button--icon-only{width:calc(var(--spacing) * 10);padding:0}@media(min-width:48rem){.toggle-button--icon-only{width:calc(var(--spacing) * 9)}}.toggle-button--icon-only.toggle-button--sm{width:calc(var(--spacing) * 9)}@media(min-width:48rem){.toggle-button--icon-only.toggle-button--sm{width:calc(var(--spacing) * 8)}}.toggle-button--icon-only.toggle-button--lg{width:calc(var(--spacing) * 11)}@media(min-width:48rem){.toggle-button--icon-only.toggle-button--lg{width:calc(var(--spacing) * 10)}}.toggle-button-group{justify-content:center;align-items:center;gap:0;width:fit-content;height:auto;display:inline-flex}.toggle-button-group--horizontal{flex-direction:row}.toggle-button-group--vertical{flex-direction:column}.toggle-button-group--full-width{width:100%}.toggle-button-group .toggle-button{border-radius:0}.toggle-button-group--horizontal .toggle-button:first-child{border-start-start-radius:calc(var(--radius) * 3);border-end-start-radius:calc(var(--radius) * 3)}.toggle-button-group--horizontal .toggle-button:last-child{border-start-end-radius:calc(var(--radius) * 3);border-end-end-radius:calc(var(--radius) * 3)}.toggle-button-group--horizontal .toggle-button:first-child:last-child{border-radius:calc(var(--radius) * 3)}.toggle-button-group--vertical .toggle-button:first-child{border-top-left-radius:calc(var(--radius) * 3);border-top-right-radius:calc(var(--radius) * 3)}.toggle-button-group--vertical .toggle-button:last-child{border-bottom-right-radius:calc(var(--radius) * 3);border-bottom-left-radius:calc(var(--radius) * 3)}.toggle-button-group--vertical .toggle-button:first-child:last-child{border-radius:calc(var(--radius) * 3)}.toggle-button-group .toggle-button:active,.toggle-button-group .toggle-button[data-pressed=true]{transform:none}.toggle-button-group .toggle-button:focus-visible:not(:focus),.toggle-button-group .toggle-button[data-focus-visible=true]{--tw-ring-offset-width:0px;--tw-ring-inset:inset}.toggle-button-group--full-width .toggle-button{flex:1}.toggle-button-group__separator{border-radius:calc(var(--radius) * .5);opacity:.15;pointer-events:none;transition:opacity .15s var(--ease-smooth);background-color:currentColor;position:absolute}.toggle-button-group__separator:is([data-reduce-motion=true],[data-reduce-motion=true] *),.toggle-button-group__separator:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.toggle-button-group__separator:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.toggle-button-group__separator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.toggle-button-group__separator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.toggle-button-group__separator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.toggle-button-group--horizontal .toggle-button-group__separator{width:1px;height:50%;top:25%;left:-1px}.toggle-button-group--vertical .toggle-button-group__separator{width:50%;height:1px;top:-1px;left:25%}.toggle-button-group--detached{gap:var(--spacing)}.toggle-button-group--detached .toggle-button{border-radius:calc(var(--radius) * 3)}.toggle-button-group--detached .toggle-button-group__separator{display:none}.toolbar{align-items:center;gap:calc(var(--spacing) * 2);grid-auto-flow:column;width:fit-content;display:grid}.toolbar .separator--vertical{align-self:center;height:50%}.toolbar .separator--horizontal{justify-content:center;justify-self:center;width:50%}.toolbar--vertical{grid-auto-flow:row;justify-content:flex-start;align-items:flex-start}.toolbar--vertical .button-group{justify-content:flex-start}.toolbar--attached{border-radius:calc(var(--radius) * 3);background-color:var(--surface);padding:var(--spacing);--tw-shadow:var(--overlay-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dropdown{gap:var(--spacing);flex-direction:column;display:flex}.dropdown__trigger{--tw-outline-style:none;transition:transform .25s var(--ease-out-quart),background-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out);transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);outline-style:none;display:inline-block}.dropdown__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *),.dropdown__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.dropdown__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.dropdown__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.dropdown__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.dropdown__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.dropdown__trigger{cursor:var(--cursor-interactive)}.dropdown__trigger:focus-visible:not(:focus),.dropdown__trigger[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.dropdown__trigger:disabled,.dropdown__trigger[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.dropdown__trigger[data-pending=true]{pointer-events:none}.dropdown__trigger:active,.dropdown__trigger[data-pressed=true]{transform:scale(.97)}.dropdown__popover{max-width:48svw;transform-origin:var(--trigger-anchor-point);scroll-padding-block:var(--spacing);scrollbar-width:var(--scrollbar-width);scrollbar-color:var(--scrollbar-color);scrollbar-gutter:var(--scrollbar-gutter);overscroll-behavior:contain;background-color:var(--overlay);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding:0;overflow-y:auto}@media(min-width:48rem){.dropdown__popover{min-width:calc(var(--spacing) * 55)}}.dropdown__popover{border-radius:min(32px,var(--radius-3xl));box-shadow:var(--shadow-overlay)}.dropdown__popover:focus-visible:not(:focus),.dropdown__popover[data-focus-visible=true]{--tw-outline-style:none;outline-style:none}.dropdown__popover[data-entering=true]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.15s;--tw-ease:ease;--tw-enter-opacity:0;--tw-enter-scale:.9;transition-duration:.15s;transition-timing-function:ease}.dropdown__popover[data-entering=true][data-placement=top]{--tw-enter-translate-y:calc(1*var(--spacing))}.dropdown__popover[data-entering=true][data-placement=bottom]{--tw-enter-translate-y:calc(1*var(--spacing)*-1)}.dropdown__popover[data-entering=true][data-placement=left]{--tw-enter-translate-x:calc(1*var(--spacing))}.dropdown__popover[data-entering=true][data-placement=right]{--tw-enter-translate-x:calc(1*var(--spacing)*-1)}.dropdown__popover[data-exiting=true]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.1s;--tw-ease:ease;--tw-exit-scale:.95;--tw-exit-opacity:0;transition-duration:.1s;transition-timing-function:ease}.dropdown__popover[data-exiting=true],.dropdown__popover[data-entering=true]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));will-change:opacity,transform}.dropdown__popover [data-slot=popover-overlay-arrow]{fill:var(--overlay)}.dropdown__popover[data-placement=bottom] [data-slot=popover-overlay-arrow]{rotate:180deg}.dropdown__popover[data-placement=left] [data-slot=popover-overlay-arrow]{rotate:-90deg}.dropdown__popover[data-placement=right] [data-slot=popover-overlay-arrow]{rotate:90deg}.dropdown__popover [data-slot=dropdown-menu]{padding:calc(var(--spacing) * 1.5);--tw-outline-style:none;outline-style:none}.dropdown__popover [data-slot=menu-item]{padding-inline:calc(var(--spacing) * 2.5)}.dropdown__menu{gap:calc(var(--spacing) * .5);width:100%;padding:var(--spacing);flex-direction:column;display:flex;position:relative;overflow:clip}.dropdown__menu [data-slot=separator]{width:94%;margin-left:3%}.list-box-item{min-height:calc(var(--spacing) * 9);justify-content:flex-start;align-items:center;gap:calc(var(--spacing) * 3);border-radius:calc(var(--radius) * 2);width:100%;padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * 1.5);--tw-outline-style:none;-webkit-tap-highlight-color:transparent;transition:transform .25s var(--ease-out-quart),box-shadow .15s var(--ease-out);outline-style:none;display:flex;position:relative}.list-box-item:is([data-reduce-motion=true],[data-reduce-motion=true] *),.list-box-item:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.list-box-item:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.list-box-item:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.list-box-item:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.list-box-item:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.list-box-item{cursor:var(--cursor-interactive)}.list-box-item [data-slot=label]{pointer-events:none;-webkit-user-select:none;user-select:none;width:fit-content}.list-box-item [data-slot=description]{pointer-events:none;text-wrap:wrap;-webkit-user-select:none;user-select:none}.list-box-item:has(.list-box-item__indicator){padding-inline-end:calc(var(--spacing) * 7)}.list-box-item:focus-visible:not(:focus),.list-box-item[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.list-box-item:active,.list-box-item[data-pressed=true]{transform:scale(.98)}@media(hover:hover){.list-box-item:hover,.list-box-item[data-hovered=true]{background-color:var(--default)}}.list-box-item[data-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.list-box-item__indicator{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y);color:var(--default-foreground);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.25s;inset-inline-end:calc(var(--spacing) * 2);flex-shrink:0;justify-content:center;align-items:center;transition-duration:.25s;display:flex;position:absolute;top:50%}.list-box-item__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *),.list-box-item__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.list-box-item__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.list-box-item__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.list-box-item__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.list-box-item__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.list-box-item__indicator [data-slot=list-box-item-indicator--checkmark]{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;transition-duration:.3s}.list-box-item__indicator [data-slot=list-box-item-indicator--checkmark]:is([data-reduce-motion=true],[data-reduce-motion=true] *),.list-box-item__indicator [data-slot=list-box-item-indicator--checkmark]:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.list-box-item__indicator [data-slot=list-box-item-indicator--checkmark]:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.list-box-item__indicator [data-slot=list-box-item-indicator--checkmark]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.list-box-item__indicator [data-slot=list-box-item-indicator--checkmark]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.list-box-item__indicator [data-slot=list-box-item-indicator--checkmark]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.list-box-item__indicator .list-box-item[aria-selected=true] [data-slot=list-box-item-indicator--checkmark],.list-box-item__indicator .list-box-item[data-selected=true] [data-slot=list-box-item-indicator--checkmark]{transition:stroke-dashoffset .25s linear}:is(.list-box-item__indicator .list-box-item[aria-selected=true] [data-slot=list-box-item-indicator--checkmark],.list-box-item__indicator .list-box-item[data-selected=true] [data-slot=list-box-item-indicator--checkmark]):is([data-reduce-motion=true],[data-reduce-motion=true] *),:is(.list-box-item__indicator .list-box-item[aria-selected=true] [data-slot=list-box-item-indicator--checkmark],.list-box-item__indicator .list-box-item[data-selected=true] [data-slot=list-box-item-indicator--checkmark]):is([data-reduce-motion=true],[data-reduce-motion=true] *):before,:is(.list-box-item__indicator .list-box-item[aria-selected=true] [data-slot=list-box-item-indicator--checkmark],.list-box-item__indicator .list-box-item[data-selected=true] [data-slot=list-box-item-indicator--checkmark]):is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){:is(.list-box-item__indicator .list-box-item[aria-selected=true] [data-slot=list-box-item-indicator--checkmark],.list-box-item__indicator .list-box-item[data-selected=true] [data-slot=list-box-item-indicator--checkmark]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),:is(.list-box-item__indicator .list-box-item[aria-selected=true] [data-slot=list-box-item-indicator--checkmark],.list-box-item__indicator .list-box-item[data-selected=true] [data-slot=list-box-item-indicator--checkmark]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,:is(.list-box-item__indicator .list-box-item[aria-selected=true] [data-slot=list-box-item-indicator--checkmark],.list-box-item__indicator .list-box-item[data-selected=true] [data-slot=list-box-item-indicator--checkmark]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.list-box-item--danger .list-box-item__indicator,.list-box-item--danger [data-slot=label]{color:var(--danger)}.list-box-section{flex-direction:column;align-items:flex-start;gap:0;display:flex}.list-box{width:100%;padding:var(--spacing);position:relative;overflow:clip}.list-box>*+*{margin-top:var(--spacing)}.list-box [data-slot=separator][data-orientation=horizontal]{width:94%;margin-left:3%}.menu-item{min-height:calc(var(--spacing) * 9);justify-content:flex-start;align-items:center;gap:calc(var(--spacing) * 3);border-radius:calc(var(--radius) * 2);width:100%;padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * 1.5);--tw-outline-style:none;-webkit-tap-highlight-color:transparent;transition:transform .25s var(--ease-out-quart),box-shadow .15s var(--ease-out);outline-style:none;display:flex;position:relative}.menu-item:is([data-reduce-motion=true],[data-reduce-motion=true] *),.menu-item:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.menu-item:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.menu-item:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.menu-item:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.menu-item:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.menu-item{cursor:var(--cursor-interactive)}.menu-item [data-slot=label]{pointer-events:none;-webkit-user-select:none;user-select:none;width:fit-content}.menu-item [data-slot=description]{pointer-events:none;text-wrap:wrap;-webkit-user-select:none;user-select:none}.menu-item [data-slot=submenu-indicator] svg{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.menu-item:has(.menu-item__indicator){padding-inline-start:calc(var(--spacing) * 7)}.menu-item[data-has-submenu=true]:has(.menu-item__indicator){padding-inline-start:calc(var(--spacing) * 2);padding-inline-end:calc(var(--spacing) * 7)}.menu-item:focus-visible:not(:focus),.menu-item[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.menu-item:active,.menu-item[data-pressed=true]{transform:scale(.98)}@media(hover:hover){.menu-item:hover,.menu-item[data-hovered=true]{background-color:var(--default)}}:is(.menu-item[aria-checked=true],.menu-item[aria-selected=true],.menu-item[data-selected=true]) [data-slot=menu-item-indicator--checkmark]{transition:stroke-dashoffset .1s linear}:is(.menu-item[aria-checked=true],.menu-item[aria-selected=true],.menu-item[data-selected=true]) [data-slot=menu-item-indicator--checkmark]:is([data-reduce-motion=true],[data-reduce-motion=true] *),:is(.menu-item[aria-checked=true],.menu-item[aria-selected=true],.menu-item[data-selected=true]) [data-slot=menu-item-indicator--checkmark]:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,:is(.menu-item[aria-checked=true],.menu-item[aria-selected=true],.menu-item[data-selected=true]) [data-slot=menu-item-indicator--checkmark]:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){:is(.menu-item[aria-checked=true],.menu-item[aria-selected=true],.menu-item[data-selected=true]) [data-slot=menu-item-indicator--checkmark]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),:is(.menu-item[aria-checked=true],.menu-item[aria-selected=true],.menu-item[data-selected=true]) [data-slot=menu-item-indicator--checkmark]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,:is(.menu-item[aria-checked=true],.menu-item[aria-selected=true],.menu-item[data-selected=true]) [data-slot=menu-item-indicator--checkmark]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}:is(.menu-item[aria-checked=true],.menu-item[aria-selected=true],.menu-item[data-selected=true]) [data-slot=menu-item-indicator--dot]{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y);opacity:1}.menu-item[data-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.menu-item__indicator{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y);color:var(--muted);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.25s;inset-inline-start:calc(var(--spacing) * 2);flex-shrink:0;justify-content:center;align-items:center;transition-duration:.25s;display:flex;position:absolute;top:50%}.menu-item__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *),.menu-item__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.menu-item__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.menu-item__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.menu-item__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.menu-item__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.menu-item[data-has-submenu=true] .menu-item__indicator{inset-inline-start:auto;inset-inline-end:calc(var(--spacing) * 2)}.menu-item__indicator [data-slot=menu-item-indicator--checkmark]{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.menu-item[data-selection-mode=multiple] :is(.menu-item__indicator [data-slot=menu-item-indicator--checkmark]){transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;transition-duration:.3s}.menu-item[data-selection-mode=multiple] :is(.menu-item__indicator [data-slot=menu-item-indicator--checkmark]):is([data-reduce-motion=true],[data-reduce-motion=true] *),.menu-item[data-selection-mode=multiple] :is(.menu-item__indicator [data-slot=menu-item-indicator--checkmark]):is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.menu-item[data-selection-mode=multiple] :is(.menu-item__indicator [data-slot=menu-item-indicator--checkmark]):is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.menu-item[data-selection-mode=multiple] :is(.menu-item__indicator [data-slot=menu-item-indicator--checkmark]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.menu-item[data-selection-mode=multiple] :is(.menu-item__indicator [data-slot=menu-item-indicator--checkmark]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.menu-item[data-selection-mode=multiple] :is(.menu-item__indicator [data-slot=menu-item-indicator--checkmark]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.menu-item__indicator [data-slot=menu-item-indicator--dot]{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.menu-item[data-selection-mode=multiple] :is(.menu-item__indicator [data-slot=menu-item-indicator--dot]){transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.25s;transition-duration:.25s}.menu-item[data-selection-mode=multiple] :is(.menu-item__indicator [data-slot=menu-item-indicator--dot]):is([data-reduce-motion=true],[data-reduce-motion=true] *),.menu-item[data-selection-mode=multiple] :is(.menu-item__indicator [data-slot=menu-item-indicator--dot]):is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.menu-item[data-selection-mode=multiple] :is(.menu-item__indicator [data-slot=menu-item-indicator--dot]):is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.menu-item[data-selection-mode=multiple] :is(.menu-item__indicator [data-slot=menu-item-indicator--dot]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.menu-item[data-selection-mode=multiple] :is(.menu-item__indicator [data-slot=menu-item-indicator--dot]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.menu-item[data-selection-mode=multiple] :is(.menu-item__indicator [data-slot=menu-item-indicator--dot]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.menu-item__indicator [data-slot=menu-item-indicator--dot]{--tw-scale-x:70%;--tw-scale-y:70%;--tw-scale-z:70%;scale:var(--tw-scale-x) var(--tw-scale-y);opacity:0}.menu-item__indicator--submenu{color:var(--muted)}.menu-item__indicator--submenu svg{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.menu-item--danger .menu-item__indicator,.menu-item--danger [data-slot=label]{color:var(--danger)}.menu-section{flex-direction:column;align-items:flex-start;gap:0;display:flex}.menu{gap:var(--spacing);width:100%;padding:var(--spacing);flex-direction:column;display:flex;position:relative;overflow:clip}.menu [data-slot=separator]{width:94%;margin-left:3%}.tag-group{gap:var(--spacing);flex-direction:column;display:flex;position:relative}.tag-group__list{gap:calc(var(--spacing) * 1.5);flex-wrap:wrap;display:flex;position:relative}.tag-group [slot=description],.tag-group [data-slot=description],.tag-group [slot=errorMessage],.tag-group [data-slot=error-message]{padding:var(--spacing)}.tag{--optical-offset:.031em;align-items:center;gap:var(--spacing);border-radius:calc(var(--radius) * 1.5);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;transition:color .1s var(--ease-smooth),scale .1s var(--ease-smooth),opacity .1s var(--ease-smooth),background-color .1s var(--ease-smooth),box-shadow .1s var(--ease-out);transform-origin:50%;transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);display:inline-flex;position:relative}.tag:is([data-reduce-motion=true],[data-reduce-motion=true] *),.tag:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.tag:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.tag:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.tag:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.tag:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.tag{cursor:var(--cursor-interactive)}.tag svg{pointer-events:none;width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3);color:currentColor;flex-shrink:0;align-self:center}.tag:is([data-disabled=true],[aria-disabled=true]){opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.tag:is(:focus-visible,[data-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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.tag:is([data-selected=true],[aria-selected=true]){background-color:var(--accent-soft);color:var(--accent-soft-foreground)}@media(hover:hover){.tag:is([data-selected=true],[aria-selected=true]):is(:hover,[data-hovered=true]){background-color:var(--accent-soft-hover)}}.tag--sm{padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.tag--md{padding-inline:calc(var(--spacing) * 2);padding-block:var(--spacing);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.tag--lg{border-radius:calc(var(--radius) * 2);padding-inline:calc(var(--spacing) * 2.5);padding-block:calc(var(--spacing) * 1.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.tag--default{background-color:var(--default);color:var(--default-foreground)}@media(hover:hover){.tag--default:is(:hover,[data-hovered=true]):not([data-selected=true]):not([data-disabled=true]){background-color:var(--default-hover)}}.tag--surface{background-color:var(--surface);color:var(--surface-foreground)}@media(hover:hover){.tag--surface:is(:hover,[data-hovered=true]):not([data-selected=true]):not([data-disabled=true]){background-color:var(--surface-hover)}}.tag__remove-button{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3);color:inherit}.tag__remove-button svg{width:inherit;height:inherit;color:currentColor;flex-shrink:0;align-self:center}.color-area{width:100%;max-width:calc(var(--spacing) * 56);border-radius:calc(var(--radius) * 2);-webkit-tap-highlight-color:transparent;aspect-ratio:1;background:var(--color-area-background);flex-shrink:0;position:relative;box-shadow:inset 0 0 0 1px #0000001a}.color-area[data-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.color-area--show-dots:after{content:"";pointer-events:none;border-radius:inherit;background-image:radial-gradient(circle,#fff3 1px,#0000 1px);background-size:8px 8px;position:absolute;top:0;right:0;bottom:0;left:0}.color-area__thumb{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);border-radius:calc(var(--radius) * 1.5);will-change:width,height;background-color:var(--color-area-thumb-color);transition:width .15s var(--ease-out),height .15s var(--ease-out);border:3px solid #fff;box-shadow:0 0 0 1px #0000001a,inset 0 0 0 1px #0000001a}.color-area__thumb:is([data-reduce-motion=true],[data-reduce-motion=true] *),.color-area__thumb:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.color-area__thumb:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.color-area__thumb:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.color-area__thumb:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.color-area__thumb:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.color-area__thumb[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.color-area__thumb[data-dragging=true]{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.color-area__thumb[data-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.color-picker{display:inline-flex}.color-picker__trigger{align-items:center;gap:calc(var(--spacing) * 3);border-radius:calc(var(--radius) * .5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));-webkit-tap-highlight-color:transparent;cursor:var(--cursor-interactive);transition:background-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out);display:inline-flex}.color-picker__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *),.color-picker__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.color-picker__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.color-picker__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.color-picker__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.color-picker__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.color-picker__trigger [data-slot=label]{cursor:var(--cursor-interactive)}.color-picker__trigger:focus-visible:not(:focus),.color-picker__trigger[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.color-picker__trigger:disabled,.color-picker__trigger[data-disabled=true],.color-picker__trigger[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.color-picker__popover{min-width:calc(var(--spacing) * 62);transform-origin:var(--trigger-anchor-point);scrollbar-color:auto;scrollbar-gutter:auto;-ms-overflow-style:none;scrollbar-width:none;overscroll-behavior:contain;background-color:var(--overlay);padding-inline:calc(var(--spacing) * 2);padding-top:calc(var(--spacing) * 2);padding-bottom:calc(var(--spacing) * 3);box-shadow:var(--shadow-overlay);border-radius:min(32px,calc(var(--radius) * 2.5));gap:calc(var(--spacing) * 3);flex-direction:column;display:flex;overflow:hidden auto}.color-picker__popover:focus-visible:not(:focus),.color-picker__popover[data-focus-visible=true]{--tw-outline-style:none;outline-style:none}.color-picker__popover[data-entering=true]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.15s;--tw-ease:ease;--tw-enter-opacity:0;--tw-enter-scale:.95;transition-duration:.15s;transition-timing-function:ease}.color-picker__popover[data-entering=true][data-placement^=top]{--tw-enter-translate-y:calc(1*var(--spacing))}.color-picker__popover[data-entering=true][data-placement^=bottom]{--tw-enter-translate-y:calc(1*var(--spacing)*-1)}.color-picker__popover[data-entering=true][data-placement^=left]{--tw-enter-translate-x:calc(1*var(--spacing))}.color-picker__popover[data-entering=true][data-placement^=right]{--tw-enter-translate-x:calc(1*var(--spacing)*-1)}.color-picker__popover[data-exiting=true]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.1s;--tw-ease:ease;--tw-exit-scale:.95;--tw-exit-opacity:0;transition-duration:.1s;transition-timing-function:ease}.color-picker__popover[data-exiting=true],.color-picker__popover[data-entering=true]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));will-change:opacity,transform}.color-slider{gap:var(--spacing);grid-template:"label output""track track"/1fr auto;width:100%;display:grid}.color-slider:not(:has([data-slot=label])):not(:has(.color-slider__output)){grid-template:"track"/1fr;gap:0}.color-slider:has([data-slot=label]):not(:has(.color-slider__output)){grid-template-columns:1fr;grid-template-areas:"label""track"}.color-slider:not(:has([data-slot=label])):has(.color-slider__output){grid-template-columns:1fr;grid-template-areas:"output""track"}.color-slider:not(:has([data-slot=label])):has(.color-slider__output) .color-slider__output{justify-self:end}.color-slider [data-slot=label]{width:fit-content;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);grid-area:label}.color-slider .color-slider__output{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);--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,);grid-area:output}.color-slider .color-slider__track{border-radius:calc(var(--radius) * 2);grid-area:track;position:relative}.color-slider .color-slider__track:before,.color-slider .color-slider__track:after{content:"";z-index:0;pointer-events:none;position:absolute}.color-slider .color-slider__thumb{cursor:grab;border-radius:calc(var(--radius) * 2);-webkit-tap-highlight-color:transparent;border-style:var(--tw-border-style);border-width:3px;border-color:var(--color-white);--tw-shadow:var(--overlay-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);z-index:1;transition:transform .25s var(--ease-out),box-shadow .15s var(--ease-out);justify-content:center;align-items:center;display:flex;position:absolute}.color-slider .color-slider__thumb:is([data-reduce-motion=true],[data-reduce-motion=true] *),.color-slider .color-slider__thumb:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.color-slider .color-slider__thumb:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.color-slider .color-slider__thumb:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.color-slider .color-slider__thumb:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.color-slider .color-slider__thumb:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.color-slider .color-slider__thumb[data-dragging=true]{cursor:grabbing}.color-slider .color-slider__thumb[data-focus-visible=true]{z-index:10;--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.color-slider .color-slider__thumb[data-disabled=true]{cursor:default;background-color:var(--default)}.color-slider:disabled,.color-slider[data-disabled=true],.color-slider[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}:is(.color-slider:disabled,.color-slider[data-disabled=true],.color-slider[aria-disabled=true]) [data-slot=label]{opacity:1}.color-slider[data-orientation=horizontal]{flex-direction:column}.color-slider[data-orientation=horizontal] .color-slider__track{height:calc(var(--spacing) * 5);border-radius:0;justify-self:center;width:calc(100% - 1.25rem);box-shadow:inset 0 1px #0000001a,inset 0 -1px #0000001a}.color-slider[data-orientation=horizontal] .color-slider__track:before,.color-slider[data-orientation=horizontal] .color-slider__track:after{width:.625rem;height:100%;top:0}.color-slider[data-orientation=horizontal] .color-slider__track:before{border-top-left-radius:calc(var(--radius) * 2);border-bottom-left-radius:calc(var(--radius) * 2);background:linear-gradient(var(--track-start-color,transparent)),repeating-conic-gradient(#efefef,#efefef 25%,#f7f7f7 0%,#f7f7f7 50%) 50% / 16px 16px;left:-.625rem;box-shadow:inset 1px 0 #0000001a,inset 0 1px #0000001a,inset 0 -1px #0000001a}.color-slider[data-orientation=horizontal] .color-slider__track:after{border-top-right-radius:calc(var(--radius) * 2);border-bottom-right-radius:calc(var(--radius) * 2);background-color:var(--track-end-color,transparent);right:-.625rem;box-shadow:inset -1px 0 #0000001a,inset 0 1px #0000001a,inset 0 -1px #0000001a}.color-slider[data-orientation=horizontal] .color-slider__thumb{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);top:50%}.color-slider[data-orientation=vertical]{gap:calc(var(--spacing) * 2);flex-direction:row;grid-template:"output""track"1fr"label"/1fr;place-items:center;height:100%}.color-slider[data-orientation=vertical]:not(:has([data-slot=label])):not(:has(.color-slider__output)){grid-template-rows:1fr;grid-template-areas:"track";gap:0}.color-slider[data-orientation=vertical]:has([data-slot=label]):not(:has(.color-slider__output)){grid-template-rows:1fr auto;grid-template-areas:"track""label"}.color-slider[data-orientation=vertical]:not(:has([data-slot=label])):has(.color-slider__output){grid-template-rows:auto 1fr;grid-template-areas:"output""track"}.color-slider[data-orientation=vertical] .color-slider__output,.color-slider[data-orientation=vertical] [data-slot=label]{text-align:center}.color-slider[data-orientation=vertical] .color-slider__track{width:calc(var(--spacing) * 5);border-radius:0;justify-self:center;height:calc(100% - 1.25rem);box-shadow:inset 1px 0 #0000001a,inset -1px 0 #0000001a}.color-slider[data-orientation=vertical] .color-slider__track:before,.color-slider[data-orientation=vertical] .color-slider__track:after{width:100%;height:.625rem;left:0}.color-slider[data-orientation=vertical] .color-slider__track:before{background:linear-gradient(var(--track-start-color,transparent)),repeating-conic-gradient(#efefef,#efefef 25%,#f7f7f7 0%,#f7f7f7 50%) 50% / 16px 16px;border-bottom-right-radius:999px;border-bottom-left-radius:999px;bottom:-.625rem;box-shadow:inset 1px 0 #0000001a,inset -1px 0 #0000001a,inset 0 -1px #0000001a}.color-slider[data-orientation=vertical] .color-slider__track:after{background-color:var(--track-end-color,transparent);border-top-left-radius:999px;border-top-right-radius:999px;top:-.625rem;box-shadow:inset 1px 0 #0000001a,inset -1px 0 #0000001a,inset 0 1px #0000001a}.color-slider[data-orientation=vertical] .color-slider__thumb{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);left:50%}.color-swatch{box-sizing:border-box;width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8);background:linear-gradient(var(--color-swatch-current),var(--color-swatch-current)),repeating-conic-gradient(#efefef,#efefef 25%,#f7f7f7 0%,#f7f7f7 50%) 50% / 16px 16px;flex-shrink:0;position:relative;box-shadow:inset 0 0 0 1px #0000001a}.color-swatch--circle{border-radius:calc(var(--radius) * 2)}.color-swatch--square{border-radius:calc(var(--radius) * .75)}.color-swatch--xs{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.color-swatch--xs.color-swatch--circle{border-radius:calc(var(--radius) * 1)}.color-swatch--sm{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.color-swatch--sm.color-swatch--circle{border-radius:calc(var(--radius) * 1.5)}.color-swatch--lg{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.color-swatch--lg.color-swatch--circle{border-radius:calc(var(--radius) * 3)}.color-swatch--xl{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.color-swatch--xl.color-swatch--circle{border-radius:calc(var(--radius) * 3)}.color-swatch-picker{align-items:center;gap:calc(var(--spacing) * 2);flex-wrap:wrap;display:flex}.color-swatch-picker__item{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8);border-radius:calc(var(--radius) * 2);border-style:var(--tw-border-style);--tw-outline-style:none;-webkit-tap-highlight-color:transparent;cursor:var(--cursor-interactive);transition:border-color .1s var(--ease-out),box-shadow .1s var(--ease-out);transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);border-width:2px;border-color:#0000;outline-style:none;justify-content:center;align-items:center;display:flex;position:relative}.color-swatch-picker__item:is([data-reduce-motion=true],[data-reduce-motion=true] *),.color-swatch-picker__item:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.color-swatch-picker__item:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.color-swatch-picker__item:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.color-swatch-picker__item:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.color-swatch-picker__item:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.color-swatch-picker__item:focus-visible,.color-swatch-picker__item[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.color-swatch-picker__item[data-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.color-swatch-picker__item[data-selected=true]{border-color:var(--color-swatch-current);box-shadow:var(--field-shadow)}.color-swatch-picker__item[data-selected=true] .color-swatch-picker__swatch{transform:scale(.77)}.color-swatch-picker__swatch{border-radius:inherit;width:100%;height:100%;transition:transform .1s var(--ease-out);transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);display:block}.color-swatch-picker__swatch:is([data-reduce-motion=true],[data-reduce-motion=true] *),.color-swatch-picker__swatch:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.color-swatch-picker__swatch:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.color-swatch-picker__swatch:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.color-swatch-picker__swatch:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.color-swatch-picker__swatch:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}@media(hover:hover){.color-swatch-picker__swatch:hover{transform:scale(1.1)}}.color-swatch-picker__indicator{pointer-events:none;z-index:10;justify-content:center;align-items:center;display:flex;position:absolute;top:0;right:0;bottom:0;left:0}.color-swatch-picker__indicator>*{width:33.3333%;height:33.3333%;color:var(--color-white);transition:transform .15s var(--ease-out);transform:scale(0)translateZ(0)}.color-swatch-picker__indicator>:is([data-reduce-motion=true],[data-reduce-motion=true] *),.color-swatch-picker__indicator>:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.color-swatch-picker__indicator>:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.color-swatch-picker__indicator>:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.color-swatch-picker__indicator>:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.color-swatch-picker__indicator>:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.color-swatch-picker__indicator[data-light-color=true] .color-swatch-picker__indicator>*{color:var(--color-black)}.color-swatch-picker__item[data-selected=true] .color-swatch-picker__indicator>*{transform:scale(1)translateZ(0)}.color-swatch-picker--stack{flex-direction:column}.color-swatch-picker--xs .color-swatch-picker__item{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);border-radius:calc(var(--radius) * 1);border-style:var(--tw-border-style);border-width:1px}.color-swatch-picker--sm .color-swatch-picker__item{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6);border-radius:calc(var(--radius) * 1.5);border-style:var(--tw-border-style);border-width:2px}.color-swatch-picker--lg .color-swatch-picker__item{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9);border-radius:calc(var(--radius) * 3);border-style:var(--tw-border-style);border-width:3px}.color-swatch-picker--xl .color-swatch-picker__item{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10);border-radius:calc(var(--radius) * 3);border-style:var(--tw-border-style);border-width:3px}.color-swatch-picker--square .color-swatch-picker__item{border-radius:calc(var(--radius) * 1.5)}.color-swatch-picker--square .color-swatch-picker__item .color-swatch-picker__swatch,.color-swatch-picker--square .color-swatch-picker__item[data-selected=true] .color-swatch-picker__swatch{border-radius:calc(var(--radius) * 1)}.color-swatch-picker--square.color-swatch-picker--xs .color-swatch-picker__item,.color-swatch-picker--square.color-swatch-picker--xs .color-swatch-picker__item .color-swatch-picker__swatch,.color-swatch-picker--square.color-swatch-picker--xs .color-swatch-picker__item[data-selected=true] .color-swatch-picker__swatch{border-radius:calc(var(--radius) * .75)}.color-swatch-picker--square.color-swatch-picker--sm .color-swatch-picker__item,.color-swatch-picker--square.color-swatch-picker--sm .color-swatch-picker__item .color-swatch-picker__swatch{border-radius:calc(var(--radius) * 1)}.color-swatch-picker--square.color-swatch-picker--sm .color-swatch-picker__item[data-selected=true] .color-swatch-picker__swatch{border-radius:calc(var(--radius) * .75)}.color-swatch-picker--square.color-swatch-picker--lg .color-swatch-picker__item{border-radius:calc(var(--radius) * 1.5)}.color-swatch-picker--square.color-swatch-picker--lg .color-swatch-picker__item .color-swatch-picker__swatch,.color-swatch-picker--square.color-swatch-picker--lg .color-swatch-picker__item[data-selected=true] .color-swatch-picker__swatch{border-radius:calc(var(--radius) * 1)}.color-swatch-picker--square.color-swatch-picker--xl .color-swatch-picker__item{border-radius:calc(var(--radius) * 1.5)}.color-swatch-picker--square.color-swatch-picker--xl .color-swatch-picker__item .color-swatch-picker__swatch,.color-swatch-picker--square.color-swatch-picker--xl .color-swatch-picker__item[data-selected=true] .color-swatch-picker__swatch{border-radius:calc(var(--radius) * 1)}.color-input-group{height:calc(var(--spacing) * 9);border-radius:var(--field-radius,calc(var(--radius) * 1.5));border-style:var(--tw-border-style);background-color:var(--field-background,var(--default));font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--field-foreground,var(--foreground));--tw-shadow:var(--field-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;border-width:1px;border-width:var(--border-width-field);border-color:var(--field-border);transition:background-color .15s var(--ease-smooth),border-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out);outline-style:none;align-items:center;display:inline-flex;overflow:hidden}.color-input-group:is([data-reduce-motion=true],[data-reduce-motion=true] *),.color-input-group:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.color-input-group:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.color-input-group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.color-input-group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.color-input-group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}@media(hover:hover){.color-input-group:hover:not(:focus-within),.color-input-group[data-hovered=true]:not([data-focus-within=true]){background-color:var(--field-hover);border-color:var(--field-border-hover)}}.color-input-group[data-focus-within=true],.color-input-group:focus-within{--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);--tw-ring-color:var(--focus);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;--tw-ring-offset-width:0px;outline-style:none}.color-input-group[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.color-input-group[data-invalid=true]:focus,.color-input-group[data-invalid=true]:focus-visible,.color-input-group[data-invalid=true][data-focused=true],.color-input-group[data-invalid=true][data-focus-visible=true],.color-input-group[data-invalid=true]:focus-within,.color-input-group[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.color-input-group[data-invalid=true]{background-color:var(--field-focus);border-color:var(--color-field-border-invalid)}.color-input-group[data-disabled=true],.color-input-group[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.color-input-group__input{cursor:text;border-style:var(--tw-border-style);height:100%;padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;background-color:#0000;border-width:0;border-radius:0;outline-style:none;flex:1;align-items:center;display:flex}@media(min-width:40rem){.color-input-group__input{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.color-input-group__input::placeholder{color:var(--field-placeholder,var(--muted))}.color-input-group:has([data-slot=color-input-group-prefix]) .color-input-group__input{padding-left:calc(var(--spacing) * 2);border-top-left-radius:0;border-bottom-left-radius:0}.color-input-group:has([data-slot=color-input-group-suffix]) .color-input-group__input{padding-right:calc(var(--spacing) * 2);border-top-right-radius:0;border-bottom-right-radius:0}.color-input-group__input:focus,.color-input-group__input:focus-visible{--tw-outline-style:none;outline-style:none}.color-input-group__prefix{color:var(--field-placeholder,var(--muted));margin-right:0;margin-left:calc(var(--spacing) * 3);flex-shrink:0;align-items:center;display:flex}.color-input-group__suffix{color:var(--field-placeholder,var(--muted));margin-right:calc(var(--spacing) * 3);flex-shrink:0;align-items:center;display:flex}.color-input-group--secondary{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:var(--color-input-group-bg);--color-input-group-bg:var(--default);--color-input-group-bg-hover:var(--default-hover);--color-input-group-bg-focus:var(--default)}@media(hover:hover){.color-input-group--secondary:hover:not(:focus-within),.color-input-group--secondary[data-hovered=true]:not([data-focus-within=true]){background-color:var(--color-input-group-bg-hover)}}.color-input-group--secondary:focus-within,.color-input-group--secondary[data-focus-within=true]{background-color:var(--color-input-group-bg-focus)}.color-input-group--secondary[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.color-input-group--secondary[data-invalid=true]:focus,.color-input-group--secondary[data-invalid=true]:focus-visible,.color-input-group--secondary[data-invalid=true][data-focused=true],.color-input-group--secondary[data-invalid=true][data-focus-visible=true],.color-input-group--secondary[data-invalid=true]:focus-within,.color-input-group--secondary[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.color-input-group--secondary[data-invalid=true]{border-color:var(--color-field-border-invalid);background-color:var(--color-input-group-bg-focus)}.color-input-group--secondary [data-slot=color-input-group-input]{background-color:#0000}.color-input-group--full-width{width:100%}.color-field{gap:var(--spacing);flex-direction:column;display:flex}:is(.color-field[data-invalid=true],.color-field[aria-invalid=true]) [data-slot=description]{display:none}.color-field [data-slot=label]{width:fit-content}.color-field--full-width{width:100%}.slider{gap:var(--spacing);grid-template-columns:1fr auto;grid-template-areas:"label output""track track";width:100%;display:grid}.slider [data-slot=label]{width:fit-content;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);grid-area:label}.slider .slider__output{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);--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,);grid-area:output}.slider .slider__track{border-radius:calc(var(--radius) * 1.5);background-color:var(--default);grid-area:track;position:relative}.slider .slider__fill{pointer-events:none;background-color:var(--accent);position:absolute}.slider .slider__thumb{cursor:grab;border-radius:calc(var(--radius) * 1.5);background-color:var(--accent);-webkit-tap-highlight-color:transparent;transition:background-color .25s var(--ease-smooth),transform .25s var(--ease-out),box-shadow .15s var(--ease-out);justify-content:center;align-items:center;display:flex;position:absolute}.slider .slider__thumb:is([data-reduce-motion=true],[data-reduce-motion=true] *),.slider .slider__thumb:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.slider .slider__thumb:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.slider .slider__thumb:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.slider .slider__thumb:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.slider .slider__thumb:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.slider .slider__thumb:after{z-index:10;border-radius:calc(var(--radius) * 1);background-color:var(--accent-foreground);color:var(--color-black);--tw-shadow:var(--field-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);content:"";transform-origin:50%;transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));position:relative}@media(prefers-reduced-motion:reduce){.slider .slider__thumb:after:not(:is()){transition-property:none}}.slider .slider__thumb[data-dragging=true]{cursor:grabbing}.slider .slider__thumb[data-dragging=true]:after{scale:.9}@media(prefers-reduced-motion:reduce){.slider .slider__thumb[data-dragging=true]:after:not(:is()){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}}.slider .slider__thumb[data-focus-visible=true]{z-index:10;--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.slider .slider__thumb[data-disabled=true]{cursor:default}.slider:disabled,.slider[data-disabled=true],.slider[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}:is(.slider:disabled,.slider[data-disabled=true],.slider[aria-disabled=true]) [data-slot=label]{opacity:1}.slider[data-orientation=horizontal]{flex-direction:column}.slider[data-orientation=horizontal] .slider__track{height:calc(var(--spacing) * 5);border-inline-style:var(--tw-border-style);border-inline-width:.75rem;border-inline-color:#0000;width:100%}.slider[data-orientation=horizontal] .slider__track[data-fill-start=true]{border-inline-start-color:var(--accent)}.slider[data-orientation=horizontal] .slider__track[data-fill-end=true]{border-inline-end-color:var(--accent)}.slider[data-orientation=horizontal] .slider__fill,.slider[data-orientation=horizontal] .slider__thumb{height:100%}.slider[data-orientation=horizontal] .slider__thumb{width:1.75rem;top:50%}.slider[data-orientation=horizontal] .slider__thumb:after{width:1.5rem;height:1rem}.slider[data-orientation=vertical]{gap:calc(var(--spacing) * 2);flex-direction:row;grid-template:"output""track"1fr"label"/1fr;height:100%}.slider[data-orientation=vertical] .slider__output,.slider[data-orientation=vertical] [data-slot=label]{text-align:center}.slider[data-orientation=vertical] .slider__track{height:100%;width:calc(var(--spacing) * 5);border-block-style:var(--tw-border-style);border-block-width:.75rem;border-block-color:#0000;justify-self:center}.slider[data-orientation=vertical] .slider__track[data-fill-start=true]{border-bottom-color:var(--accent)}.slider[data-orientation=vertical] .slider__track[data-fill-end=true]{border-top-color:var(--accent)}.slider[data-orientation=vertical] .slider__fill,.slider[data-orientation=vertical] .slider__thumb{width:100%}.slider[data-orientation=vertical] .slider__thumb{height:1.75rem;left:50%}.slider[data-orientation=vertical] .slider__thumb:after{width:1rem;height:1.5rem}.switch{align-items:flex-start;gap:var(--spacing);-webkit-tap-highlight-color:transparent;cursor:var(--cursor-interactive);--switch-control-bg:var(--default);--switch-control-bg-hover:var(--switch-control-bg);flex-direction:column;display:flex}@supports (color:color-mix(in lab,red,red)){.switch{--switch-control-bg-hover:color-mix(in oklab, var(--switch-control-bg), transparent 20%)}}.switch{--switch-control-bg-pressed:var(--switch-control-bg-hover);--switch-control-bg-checked:var(--accent);--switch-control-bg-checked-hover:var(--accent-hover)}.switch[data-disabled=true],.switch[data-disabled=true] [data-slot=description],.switch[data-disabled=true] [data-slot=field-error]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.switch[data-disabled=true] .switch__thumb{background-color:var(--default-foreground)}@supports (color:color-mix(in lab,red,red)){.switch[data-disabled=true] .switch__thumb{background-color:color-mix(in oklab,var(--default-foreground) 20%,transparent)}}.switch>[data-slot=description]{width:100%;min-width:0;padding-inline-start:3.25rem}.switch>[data-slot=field-error]{width:100%;min-width:0;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--muted);padding-inline-start:3.25rem}.switch.switch--sm>[data-slot=description],.switch.switch--sm>[data-slot=field-error]{padding-inline-start:2.75rem}.switch.switch--lg>[data-slot=description],.switch.switch--lg>[data-slot=field-error]{padding-inline-start:3.75rem}:is(.switch:disabled[aria-checked=true],.switch:disabled[data-selected=true],.switch[data-disabled=true][aria-checked=true],.switch[data-disabled=true][data-selected=true],.switch[aria-disabled=true][aria-checked=true],.switch[aria-disabled=true][data-selected=true]) .switch__thumb{opacity:.4}.switch__control{border-radius:calc(var(--radius) * 1.5);background-color:var(--switch-control-bg);width:2.5rem;height:1.25rem;transition:background-color .25s var(--ease-smooth),box-shadow .15s var(--ease-out);flex-shrink:0;align-items:center;display:flex;position:relative;overflow:hidden}.switch__control:is([data-reduce-motion=true],[data-reduce-motion=true] *),.switch__control:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.switch__control:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.switch__control:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.switch__control:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.switch__control:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.switch:focus-visible .switch__control,.switch:has([data-slot=switch-content][data-focus-visible=true]) .switch__control,.switch [data-slot=switch-content][data-focus-visible=true] .switch__control{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.switch:hover .switch__control,.switch:has([data-slot=switch-content][data-hovered=true]) .switch__control,.switch [data-slot=switch-content][data-hovered=true] .switch__control{background-color:var(--switch-control-bg-hover)}.switch:active .switch__control,.switch:has([data-slot=switch-content][data-pressed=true]) .switch__control,.switch [data-slot=switch-content][data-pressed=true] .switch__control{background-color:var(--switch-control-bg-pressed)}:is(.switch:active .switch__control,.switch:has([data-slot=switch-content][data-pressed=true]) .switch__control,.switch [data-slot=switch-content][data-pressed=true] .switch__control):is([data-reduce-motion=true],[data-reduce-motion=true] *),:is(.switch:active .switch__control,.switch:has([data-slot=switch-content][data-pressed=true]) .switch__control,.switch [data-slot=switch-content][data-pressed=true] .switch__control):is([data-reduce-motion=true],[data-reduce-motion=true] *):before,:is(.switch:active .switch__control,.switch:has([data-slot=switch-content][data-pressed=true]) .switch__control,.switch [data-slot=switch-content][data-pressed=true] .switch__control):is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transform:none}@media(prefers-reduced-motion:reduce){:is(.switch:active .switch__control,.switch:has([data-slot=switch-content][data-pressed=true]) .switch__control,.switch [data-slot=switch-content][data-pressed=true] .switch__control):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),:is(.switch:active .switch__control,.switch:has([data-slot=switch-content][data-pressed=true]) .switch__control,.switch [data-slot=switch-content][data-pressed=true] .switch__control):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,:is(.switch:active .switch__control,.switch:has([data-slot=switch-content][data-pressed=true]) .switch__control,.switch [data-slot=switch-content][data-pressed=true] .switch__control):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transform:none}}.switch[aria-checked=true] .switch__control,.switch[data-selected=true] .switch__control{background-color:var(--switch-control-bg-checked)}.switch[aria-checked=true]:hover .switch__control,.switch[data-selected=true]:hover .switch__control,.switch[aria-checked=true][data-hovered=true] .switch__control,.switch[data-selected=true][data-hovered=true] .switch__control,.switch:has([data-slot=switch-content][data-hovered=true])[data-selected=true] .switch__control,.switch[aria-checked=true]:active .switch__control,.switch[data-selected=true]:active .switch__control,.switch[aria-checked=true][data-pressed=true] .switch__control,.switch[data-selected=true][data-pressed=true] .switch__control,.switch:has([data-slot=switch-content][data-pressed=true])[data-selected=true] .switch__control{background-color:var(--switch-control-bg-checked-hover)}.switch__content{cursor:inherit;align-items:center;gap:calc(var(--spacing) * 3);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--foreground);--tw-outline-style:none;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;outline-style:none;display:inline-flex}.switch--sm .switch__control{border-radius:calc(var(--radius) * 1);width:2rem;height:1rem}.switch--lg .switch__control{width:3rem;height:1.5rem}.switch__thumb{transform-origin:50%;border-radius:calc(var(--radius) * 1);background-color:var(--color-white);color:var(--color-black);--tw-shadow:var(--field-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);width:1.375rem;height:1rem;transition:margin .3s var(--ease-out-fluid),background-color .2s var(--ease-out);margin-inline-start:calc(var(--spacing) * .5);display:flex}.switch__thumb:is([data-reduce-motion=true],[data-reduce-motion=true] *),.switch__thumb:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.switch__thumb:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.switch__thumb:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.switch__thumb:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.switch__thumb:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.switch[aria-checked=true] .switch__thumb,.switch[data-selected=true] .switch__thumb{background-color:var(--accent-foreground);color:var(--accent);margin-inline-start:calc(100% - 1.5rem);box-shadow:0 0 5px #00000005,0 2px 10px #0000000f,0 0 1px #0000004d}.switch--sm .switch__thumb{border-radius:calc(var(--radius) * .75);width:1.03125rem;height:.75rem}.switch[aria-checked=true] :is(.switch--sm .switch__thumb),.switch[data-selected=true] :is(.switch--sm .switch__thumb){margin-inline-start:calc(100% - 1.15625rem)}.switch--lg .switch__thumb{border-radius:calc(var(--radius) * 1.5);width:1.71875rem;height:1.25rem}.switch[aria-checked=true] :is(.switch--lg .switch__thumb),.switch[data-selected=true] :is(.switch--lg .switch__thumb){margin-inline-start:calc(100% - 1.84375rem)}.switch__thumb>*{justify-content:center;align-items:center;width:100%;height:100%;display:flex}.switch__label{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--foreground)}.switch [data-slot=label]{-webkit-user-select:none;user-select:none}.switch__content [data-slot=label]{cursor:var(--cursor-interactive)}.switch [data-slot=description]{cursor:default;-webkit-user-select:none;user-select:none}.switch-group{gap:calc(var(--spacing) * 6);flex-direction:column;display:flex}.switch-group__items{gap:calc(var(--spacing) * 4);display:flex}.switch-group--horizontal .switch-group__items{flex-direction:row}.switch-group--vertical .switch-group__items{flex-direction:column}.badge{justify-content:center;align-items:center;gap:calc(var(--spacing) * .5);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);min-height:calc(var(--spacing) * 7);min-width:calc(var(--spacing) * 7);border-radius:calc(var(--radius) * 3);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-leading:1.34;--badge-bg:var(--default);--badge-fg:var(--default-foreground);--badge-border:var(--background);background-color:var(--badge-bg);color:var(--badge-fg);border:1px solid var(--badge-border);flex-shrink:0;line-height:1.34;display:inline-flex}.badge__label{padding-inline:calc(var(--spacing) * .5)}.badge-anchor{flex-shrink:0;display:inline-flex;position:relative}.badge--lg{min-height:calc(var(--spacing) * 8);min-width:calc(var(--spacing) * 8);border-radius:calc(var(--radius) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:1.43;line-height:1.43}.badge--sm{min-height:calc(var(--spacing) * 4);min-width:calc(var(--spacing) * 4);border-radius:calc(var(--radius) * 1.5);--tw-leading:1.34;font-size:10px;line-height:1.34}.badge--accent{--badge-fg:var(--accent-soft-foreground)}.badge--default{--badge-fg:var(--default-foreground)}.badge--success{--badge-fg:var(--success-soft-foreground)}.badge--warning{--badge-fg:var(--warning-soft-foreground)}.badge--danger{--badge-fg:var(--danger-soft-foreground)}.badge--top-right{position:absolute;top:0;right:0;transform:translate(25%,-25%)}.badge--top-left{position:absolute;top:0;left:0;transform:translate(-25%,-25%)}.badge--bottom-right{position:absolute;bottom:0;right:0;transform:translate(25%,25%)}.badge--bottom-left{position:absolute;bottom:0;left:0;transform:translate(-25%,25%)}.badge--primary.badge--accent{--badge-bg:var(--accent);--badge-fg:var(--accent-foreground)}.badge--primary.badge--default{--badge-bg:var(--default);--badge-fg:var(--default-foreground)}.badge--primary.badge--success{--badge-bg:var(--success);--badge-fg:var(--success-foreground)}.badge--primary.badge--warning{--badge-bg:var(--warning);--badge-fg:var(--warning-foreground)}.badge--primary.badge--danger{--badge-bg:var(--danger);--badge-fg:var(--danger-foreground)}.badge--soft.badge--accent{--badge-bg:var(--accent-soft);--badge-fg:var(--accent-soft-foreground)}.badge--soft.badge--default{--badge-bg:var(--default-soft);--badge-fg:var(--default-soft-foreground)}.badge--soft.badge--success{--badge-bg:var(--success-soft);--badge-fg:var(--success-soft-foreground)}.badge--soft.badge--warning{--badge-bg:var(--warning-soft);--badge-fg:var(--warning-soft-foreground)}.badge--soft.badge--danger{--badge-bg:var(--danger-soft);--badge-fg:var(--danger-soft-foreground)}.chip{align-items:center;gap:calc(var(--spacing) * .5);border-radius:calc(var(--radius) * 2);padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);--chip-bg:var(--default);--chip-fg:currentColor;background-color:var(--chip-bg);color:var(--chip-fg);flex-shrink:0;display:inline-flex}.chip__label{padding-inline:calc(var(--spacing) * .5)}.chip--accent{--chip-fg:var(--accent-soft-foreground)}.chip--danger{--chip-fg:var(--danger-soft-foreground)}.chip--default{--chip-fg:var(--default-foreground)}.chip--success{--chip-fg:var(--success-soft-foreground)}.chip--warning{--chip-fg:var(--warning-soft-foreground)}.chip--tertiary{--chip-bg:transparent}.chip--sm{padding-inline:var(--spacing);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));padding-block:0}.chip--md{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.chip--lg{padding-inline:calc(var(--spacing) * 3);padding-block:var(--spacing);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.chip--primary.chip--accent{--chip-bg:var(--accent);--chip-fg:var(--accent-foreground)}.chip--primary.chip--success{--chip-bg:var(--success);--chip-fg:var(--success-foreground)}.chip--primary.chip--warning{--chip-bg:var(--warning);--chip-fg:var(--warning-foreground)}.chip--primary.chip--danger{--chip-bg:var(--danger);--chip-fg:var(--danger-foreground)}.chip--accent.chip--soft{--chip-bg:var(--accent-soft);--chip-fg:var(--accent-soft-foreground)}.chip--success.chip--soft{--chip-bg:var(--success-soft);--chip-fg:var(--success-soft-foreground)}.chip--warning.chip--soft{--chip-bg:var(--warning-soft);--chip-fg:var(--warning-soft-foreground)}.chip--danger.chip--soft{--chip-bg:var(--danger-soft);--chip-fg:var(--danger-soft-foreground)}.chip--default.chip--soft{--chip-bg:var(--default-soft);--chip-fg:var(--default-soft-foreground)}.table-root{grid-template-columns:minmax(0,1fr);width:100%;display:grid;position:relative;overflow:clip}.table__scroll-container{scrollbar-width:var(--scrollbar-width);scrollbar-color:var(--scrollbar-color);scrollbar-gutter:var(--scrollbar-gutter);scrollbar-gutter:auto;overflow-x:auto}.table-root--primary{background-color:var(--surface-secondary);padding-inline:var(--spacing);padding-bottom:var(--spacing);border-radius:min(32px,calc(var(--radius) * 2.5))}.table-root--secondary .table__header{border-bottom-style:var(--tw-border-style);background-color:#0000;border-bottom-width:0}.table-root--secondary .table__column{background-color:var(--surface-secondary)}.table-root--secondary :is(th.table__column:first-child,[role=row]>[role=presentation]:first-of-type>.table__column){border-start-start-radius:min(32px,var(--radius-2xl));border-end-start-radius:min(32px,var(--radius-2xl))}.table-root--secondary :is(th.table__column:last-child,[role=row]>[role=presentation]:last-of-type>.table__column){border-start-end-radius:min(32px,var(--radius-2xl));border-end-end-radius:min(32px,var(--radius-2xl))}.table-root--secondary .table__body{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.table-root--secondary .table__body tr:first-child td:first-child,.table-root--secondary .table__body tr:first-child td:last-child,.table-root--secondary .table__body tr:last-child td:first-child,.table-root--secondary .table__body tr:last-child td:last-child{border-radius:0}.table-root--secondary .table__body:not(tbody){border-radius:0;overflow:visible}.table-root--secondary .table__row .table__cell{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--separator-tertiary)}@supports (color:color-mix(in lab,red,red)){.table-root--secondary .table__row .table__cell{border-color:color-mix(in oklab,var(--separator-tertiary) 50%,transparent)}}.table-root--secondary .table__row .table__cell{background-color:#0000}@media(hover:hover){.table-root--secondary .table__row:hover .table__cell,.table-root--secondary .table__row[data-hovered=true] .table__cell{background-color:var(--default)}@supports (color:color-mix(in lab,red,red)){.table-root--secondary .table__row:hover .table__cell,.table-root--secondary .table__row[data-hovered=true] .table__cell{background-color:color-mix(in oklab,var(--default) 50%,transparent)}}}.table__content{border-collapse:separate;--tw-border-spacing-x:0;--tw-border-spacing-y:0;width:100%;border-spacing:var(--tw-border-spacing-x) var(--tw-border-spacing-y);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.table-root--primary .table__content{overflow:clip}.table__header{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--separator)}@supports (color:color-mix(in lab,red,red)){.table__header{border-color:color-mix(in oklab,var(--separator) 50%,transparent)}}.table__header{background-color:var(--surface-secondary)}.table__column{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2.5);text-align:left;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--muted);position:relative}.table__column:after{content:"";pointer-events:none;height:calc(var(--spacing) * 4);--tw-translate-y: -50% ;width:1px;translate:var(--tw-translate-x) var(--tw-translate-y);border-radius:calc(var(--radius) * .5);background-color:var(--separator);inset-inline-end:calc(var(--spacing) * 0);position:absolute;top:50%}.table__column:last-child:not(:only-child):after{content:none}.table__column[data-allows-sorting=true]{cursor:var(--cursor-interactive)}@media(hover:hover){.table__column[data-allows-sorting=true]:hover,.table__column[data-allows-sorting=true][data-hovered=true]{color:var(--foreground)}}.table__column:focus-visible,.table__column[data-focus-visible=true]{border-radius:calc(var(--radius) * 1);--tw-outline-style:none;box-shadow:inset 0 0 0 2px var(--focus);outline-style:none}[role=row]>[role=presentation]:last-of-type:not(:only-of-type)>.table__column:after{content:none}.table__sortable-column-header{justify-content:space-between;align-items:center;display:flex}.table__sortable-column-indicator{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3);transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);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));--tw-duration:.1s;--tw-ease:var(--ease-out);transition-duration:.1s;transition-timing-function:var(--ease-out)}.table__sortable-column-indicator[data-direction=descending]{rotate:180deg}.table__body tr:first-child td:first-child{border-start-start-radius:min(32px,var(--radius-2xl))}.table__body tr:first-child td:last-child{border-start-end-radius:min(32px,var(--radius-2xl))}.table__body tr:last-child td:first-child{border-end-start-radius:min(32px,var(--radius-2xl))}.table__body tr:last-child td:last-child{border-end-end-radius:min(32px,var(--radius-2xl))}.table__body:not(tbody){border-radius:min(32px,var(--radius-2xl));height:100%;position:relative;overflow:clip}.table__row{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--separator);height:100%;position:relative}@supports (color:color-mix(in lab,red,red)){.table__row{border-color:color-mix(in oklab,var(--separator) 50%,transparent)}}.table__row:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media(hover:hover){.table__row:hover .table__cell,.table__row[data-hovered=true] .table__cell{background-color:var(--surface)}@supports (color:color-mix(in lab,red,red)){.table__row:hover .table__cell,.table__row[data-hovered=true] .table__cell{background-color:color-mix(in oklab,var(--surface) 40%,transparent)}}}.table__row[data-selected=true] .table__cell{background-color:var(--surface)}@supports (color:color-mix(in lab,red,red)){.table__row[data-selected=true] .table__cell{background-color:color-mix(in oklab,var(--surface) 10%,transparent)}}.table__row[aria-disabled=true],.table__row[data-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.table__row:focus-visible,.table__row[data-focus-visible=true]{--tw-outline-style:none;outline-style:none}.table__row[data-dragging=true]{opacity:.5}.table__row[data-drop-target=true] .table__cell{background-color:var(--accent-soft)}.table__cell{background-color:var(--surface);height:100%;padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);vertical-align:middle;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--foreground);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--separator-tertiary)}@supports (color:color-mix(in lab,red,red)){.table__cell{border-color:color-mix(in oklab,var(--separator-tertiary) 50%,transparent)}}.table__cell:focus-visible,.table__cell[data-focus-visible=true]{border-radius:calc(var(--radius) * 1);--tw-outline-style:none;box-shadow:inset 0 0 0 2px var(--focus);outline-style:none}.table__row:is(:focus-visible,[data-focus-visible=true]) :is(.table__cell,.table__column){--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.table__row:is(:focus-visible,[data-focus-visible=true])>:is(.table__cell,.table__column):only-child,.table__row:is(:focus-visible,[data-focus-visible=true])>:only-child :is(.table__cell,.table__column){border-radius:calc(var(--radius) * 1);--tw-shadow:inset 0 0 0 2px var(--tw-shadow-color,var(--focus));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;outline-style:none}.table__row:is(:focus-visible,[data-focus-visible=true])>:is(.table__cell,.table__column):first-child:not(:only-child),.table__row:is(:focus-visible,[data-focus-visible=true])>:first-child:not(:only-child) :is(.table__cell,.table__column){border-top-left-radius:calc(var(--radius) * 1);border-bottom-left-radius:calc(var(--radius) * 1);--tw-shadow:inset 2px 0 0 0 var(--tw-shadow-color,var(--focus)), inset 0 2px 0 0 var(--tw-shadow-color,var(--focus)), inset 0 -2px 0 0 var(--tw-shadow-color,var(--focus));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;outline-style:none}.table__row:is(:focus-visible,[data-focus-visible=true])>:is(.table__cell,.table__column):last-child:not(:only-child),.table__row:is(:focus-visible,[data-focus-visible=true])>:last-child:not(:only-child) :is(.table__cell,.table__column){border-top-right-radius:calc(var(--radius) * 1);border-bottom-right-radius:calc(var(--radius) * 1);--tw-shadow:inset -2px 0 0 0 var(--tw-shadow-color,var(--focus)), inset 0 2px 0 0 var(--tw-shadow-color,var(--focus)), inset 0 -2px 0 0 var(--tw-shadow-color,var(--focus));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;outline-style:none}.table__row:is(:focus-visible,[data-focus-visible=true])>:is(.table__cell,.table__column):not(:first-child):not(:last-child):not(:only-child),.table__row:is(:focus-visible,[data-focus-visible=true])>:not(:first-child):not(:last-child):not(:only-child) :is(.table__cell,.table__column){--tw-shadow:inset 0 2px 0 0 var(--tw-shadow-color,var(--focus)), inset 0 -2px 0 0 var(--tw-shadow-color,var(--focus));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;outline-style:none}.table__cell[data-tree-column]{padding-inline-start:calc(1rem * var(--table-row-level,1))}.table__footer{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2.5);align-items:center;display:flex}.table__resizable-container{scrollbar-width:var(--scrollbar-width);scrollbar-color:var(--scrollbar-color);scrollbar-gutter:var(--scrollbar-gutter);scrollbar-gutter:auto;position:relative;overflow:auto}.table__column-resizer{height:calc(var(--spacing) * 4);--tw-translate-y: -50% ;border-radius:calc(var(--radius) * .5);background-color:var(--separator);box-sizing:content-box;--tw-translate-x: 50% ;width:1px;translate:var(--tw-translate-x) var(--tw-translate-y);cursor:col-resize;touch-action:none;padding-inline:calc(var(--spacing) * 2);--tw-border-style:none;--tw-outline-style:none;inset-inline-end:calc(var(--spacing) * 0);background-clip:content-box;border-style:none;outline-style:none;position:absolute;top:50%}.table__column-resizer[data-hovered=true],.table__column-resizer:hover,.table__column-resizer[data-resizing=true]{height:100%;width:calc(var(--spacing) * .5);background-color:var(--accent)}.table__column-resizer[data-focus-visible=true],.table__column-resizer:focus-visible{height:100%;width:calc(var(--spacing) * .5);background-color:var(--focus)}.table__column:has(.table__column-resizer):after{content:none}.table__load-more td,.table__load-more [role=rowheader]{padding-block:calc(var(--spacing) * 3);text-align:center}:is(.table__load-more td,.table__load-more [role=rowheader])>*{margin-inline:auto}.table__load-more-content{justify-content:center;align-items:center;gap:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * 2);display:flex}.alert{justify-content:flex-start;align-items:flex-start;gap:calc(var(--spacing) * 4);background-color:var(--surface);width:100%;padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);--tw-shadow:var(--surface-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-radius:min(32px,var(--radius-3xl));flex-direction:row;display:flex}.alert__content{flex-direction:column;flex-grow:1;align-items:flex-start;height:100%;display:flex}.alert__indicator{padding:var(--spacing);-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;display:flex}.alert__indicator [data-slot=alert-default-icon]{box-sizing:content-box;width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.alert__title{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.alert__description{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--muted)}.alert--default .alert__indicator,.alert--default .alert__title{color:var(--foreground)}.alert--accent .alert__indicator,.alert--accent .alert__title{color:var(--accent-soft-foreground)}.alert--success .alert__indicator,.alert--success .alert__title{color:var(--success-soft-foreground)}.alert--warning .alert__indicator,.alert--warning .alert__title{color:var(--warning-soft-foreground)}.alert--danger .alert__indicator,.alert--danger .alert__title{color:var(--danger-soft-foreground)}.empty-state{padding:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--muted)}.skeleton{pointer-events:none;border-radius:calc(var(--radius) * .5);background-color:var(--surface-tertiary);position:relative;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.skeleton{background-color:color-mix(in oklab,var(--surface-tertiary) 70%,transparent)}}.skeleton--shimmer:after{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y);--tw-gradient-position:to right;animation:2s linear infinite skeleton;position:absolute;top:0;right:0;bottom:0;left:0}@supports (background-image:linear-gradient(in lab,red,red)){.skeleton--shimmer:after{--tw-gradient-position:to right in oklab}}.skeleton--shimmer:after{background-image:linear-gradient(var(--tw-gradient-stops));--tw-gradient-from:transparent;--tw-gradient-via:var(--surface-tertiary);--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));--tw-gradient-to:transparent;--tw-content:"";content:var(--tw-content)}.skeleton--shimmer:has(.skeleton):after{content:none}.skeleton--shimmer:has(.skeleton):before{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y);--tw-content:"";content:var(--tw-content);z-index:10;pointer-events:none;mix-blend-mode:overlay;background:linear-gradient(90deg,#0000,#ffffff80,#0000);animation:2s linear infinite skeleton;position:absolute;top:0;right:0;bottom:0;left:0}.skeleton--shimmer:has(.skeleton) .skeleton:after{content:none}.skeleton--pulse{animation:var(--animate-pulse)}.meter{gap:var(--spacing);--meter-fill:var(--accent);grid-template-columns:1fr auto;grid-template-areas:"label output""track track";width:100%;display:grid}.meter [data-slot=label]{width:fit-content;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);grid-area:label}.meter .meter__output{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);--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,);grid-area:output}.meter .meter__track{border-radius:calc(var(--radius) * .5);background-color:var(--default);height:calc(var(--spacing) * 2);grid-area:track;position:relative;overflow:hidden}.meter .meter__fill{border-radius:calc(var(--radius) * .5);background-color:var(--meter-fill);height:100%;transition:width .3s var(--ease-out);position:absolute;top:0;left:0}.meter .meter__fill:is([data-reduce-motion=true],[data-reduce-motion=true] *),.meter .meter__fill:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.meter .meter__fill:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.meter .meter__fill:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.meter .meter__fill:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.meter .meter__fill:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.meter:disabled,.meter[data-disabled=true],.meter[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}:is(.meter:disabled,.meter[data-disabled=true],.meter[aria-disabled=true]) [data-slot=label]{opacity:1}.meter--sm .meter__track{height:var(--spacing);border-radius:calc(var(--radius) * .25)}.meter--sm .meter__fill{border-radius:calc(var(--radius) * .25)}.meter--lg .meter__track{height:calc(var(--spacing) * 3);border-radius:calc(var(--radius) * .75)}.meter--lg .meter__fill{border-radius:calc(var(--radius) * .75)}.meter--default{--meter-fill:var(--default-foreground)}.meter--accent{--meter-fill:var(--accent)}.meter--success{--meter-fill:var(--success)}.meter--warning{--meter-fill:var(--warning)}.meter--danger{--meter-fill:var(--danger)}.progress-bar{gap:var(--spacing);--progress-bar-fill:var(--accent);grid-template-columns:1fr auto;grid-template-areas:"label output""track track";width:100%;display:grid}.progress-bar [data-slot=label]{width:fit-content;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);grid-area:label}.progress-bar .progress-bar__output{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);--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,);grid-area:output}.progress-bar .progress-bar__track{border-radius:calc(var(--radius) * .5);background-color:var(--default);height:calc(var(--spacing) * 2);grid-area:track;position:relative;overflow:hidden}.progress-bar .progress-bar__fill{border-radius:calc(var(--radius) * .5);background-color:var(--progress-bar-fill);height:100%;transition:width .3s var(--ease-out);position:absolute;top:0;left:0}.progress-bar .progress-bar__fill:is([data-reduce-motion=true],[data-reduce-motion=true] *),.progress-bar .progress-bar__fill:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.progress-bar .progress-bar__fill:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.progress-bar .progress-bar__fill:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.progress-bar .progress-bar__fill:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.progress-bar .progress-bar__fill:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.progress-bar:not([aria-valuenow]) .progress-bar__fill{width:40%;animation:1.5s cubic-bezier(.65,0,.35,1) infinite progress-bar-indeterminate}.progress-bar:not([aria-valuenow]) .progress-bar__fill:is([data-reduce-motion=true],[data-reduce-motion=true] *),.progress-bar:not([aria-valuenow]) .progress-bar__fill:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.progress-bar:not([aria-valuenow]) .progress-bar__fill:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{animation:none}@media(prefers-reduced-motion:reduce){.progress-bar:not([aria-valuenow]) .progress-bar__fill:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.progress-bar:not([aria-valuenow]) .progress-bar__fill:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.progress-bar:not([aria-valuenow]) .progress-bar__fill:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{animation:none}}.progress-bar:disabled,.progress-bar[data-disabled=true],.progress-bar[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}:is(.progress-bar:disabled,.progress-bar[data-disabled=true],.progress-bar[aria-disabled=true]) [data-slot=label]{opacity:1}@keyframes progress-bar-indeterminate{0%{transform:translate(-100%)}to{transform:translate(350%)}}.progress-bar--sm .progress-bar__track{height:var(--spacing);border-radius:calc(var(--radius) * .25)}.progress-bar--sm .progress-bar__fill{border-radius:calc(var(--radius) * .25)}.progress-bar--lg .progress-bar__track{height:calc(var(--spacing) * 3);border-radius:calc(var(--radius) * .75)}.progress-bar--lg .progress-bar__fill{border-radius:calc(var(--radius) * .75)}.progress-bar--default{--progress-bar-fill:var(--default-foreground)}.progress-bar--accent{--progress-bar-fill:var(--accent)}.progress-bar--success{--progress-bar-fill:var(--success)}.progress-bar--warning{--progress-bar-fill:var(--warning)}.progress-bar--danger{--progress-bar-fill:var(--danger)}.progress-circle{--progress-circle-stroke:var(--accent);--progress-circle-track-stroke:var(--default);justify-content:center;align-items:center;display:inline-flex}.progress-circle .progress-circle__track{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.progress-circle .progress-circle__track-circle{stroke:var(--progress-circle-track-stroke)}.progress-circle .progress-circle__fill-circle{stroke:var(--progress-circle-stroke);transition:stroke-dashoffset .3s var(--ease-out)}.progress-circle .progress-circle__fill-circle:is([data-reduce-motion=true],[data-reduce-motion=true] *),.progress-circle .progress-circle__fill-circle:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.progress-circle .progress-circle__fill-circle:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.progress-circle .progress-circle__fill-circle:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.progress-circle .progress-circle__fill-circle:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.progress-circle .progress-circle__fill-circle:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.progress-circle:not([aria-valuenow]) .progress-circle__track{animation:1s linear infinite progress-circle-spin}.progress-circle:not([aria-valuenow]) .progress-circle__track:is([data-reduce-motion=true],[data-reduce-motion=true] *),.progress-circle:not([aria-valuenow]) .progress-circle__track:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.progress-circle:not([aria-valuenow]) .progress-circle__track:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{animation:none}@media(prefers-reduced-motion:reduce){.progress-circle:not([aria-valuenow]) .progress-circle__track:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.progress-circle:not([aria-valuenow]) .progress-circle__track:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.progress-circle:not([aria-valuenow]) .progress-circle__track:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{animation:none}}.progress-circle:disabled,.progress-circle[data-disabled=true],.progress-circle[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}@keyframes progress-circle-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.progress-circle--sm .progress-circle__track{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.progress-circle--lg .progress-circle__track{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.progress-circle--default{--progress-circle-stroke:var(--default-foreground)}.progress-circle--accent{--progress-circle-stroke:var(--accent)}.progress-circle--success{--progress-circle-stroke:var(--success)}.progress-circle--warning{--progress-circle-stroke:var(--warning)}.progress-circle--danger{--progress-circle-stroke:var(--danger)}.spinner{pointer-events:none;width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6);flex-shrink:0;animation:.75s linear infinite spin;display:inline-flex}.spinner:is([data-reduce-motion=true],[data-reduce-motion=true] *),.spinner:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.spinner:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{animation:none}@media(prefers-reduced-motion:reduce){.spinner:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.spinner:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.spinner:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{animation:none}}.spinner--sm{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.spinner--lg{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.spinner--xl{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.spinner--current{color:inherit}.spinner--accent{color:var(--accent)}.spinner--danger{color:var(--danger)}.spinner--success{color:var(--success)}.spinner--warning{color:var(--warning)}.toast-region{pointer-events:none;z-index:50;--tw-outline-style:none;outline-style:none;width:calc(100vw - 2rem);position:fixed}@media(min-width:40rem){.toast-region{width:auto;min-width:var(--toast-width)}}.toast-region{display:block}.toast-region--bottom{bottom:calc(var(--spacing) * 4);--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y);left:50%}.toast-region--bottom-start{bottom:calc(var(--spacing) * 4);left:calc(var(--spacing) * 4)}.toast-region--bottom-end{right:calc(var(--spacing) * 4);bottom:calc(var(--spacing) * 4)}.toast-region--top{top:calc(var(--spacing) * 4);--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y);left:50%}.toast-region--top-start{top:calc(var(--spacing) * 4);left:calc(var(--spacing) * 4)}.toast-region--top-end{top:calc(var(--spacing) * 4);right:calc(var(--spacing) * 4)}.toast-region:focus-visible{outline-style:var(--tw-outline-style);outline-offset:2px;outline-width:2px;outline-color:var(--focus)}.toast{pointer-events:auto;justify-content:flex-start;align-items:flex-start;gap:calc(var(--spacing) * 1.5);background-color:var(--surface);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);--tw-shadow:var(--overlay-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-radius:min(32px,var(--radius-3xl));flex-direction:row;display:flex;position:absolute;left:0;right:0}.toast--bottom,.toast--bottom-start,.toast--bottom-end{bottom:0}.toast--top,.toast--top-start,.toast--top-end{top:0}.toast:not([data-frontmost=true]){pointer-events:none;height:var(--front-height);overflow:hidden}.toast:not([data-frontmost=true]) .toast__close-button{pointer-events:none;opacity:0;outline:none}.toast[data-hidden=true]{pointer-events:none;opacity:0;display:flex}.toast:focus-visible{outline-style:var(--tw-outline-style);outline-offset:2px;outline-width:2px;outline-color:var(--focus)}.toast--bottom,.toast--bottom-start,.toast--bottom-end{view-transition-class:toast-bottom}.toast--top,.toast--top-start,.toast--top-end{view-transition-class:toast-top}.toast__content{flex-direction:column;flex-grow:1;align-self:center;align-items:flex-start;height:100%;display:flex}.toast__indicator{padding:var(--spacing);color:var(--overlay-foreground);-webkit-user-select:none;user-select:none;flex-shrink:0;justify-content:center;align-items:center;display:flex}.toast__indicator [data-slot=toast-default-icon]{box-sizing:content-box;width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.toast__indicator [data-slot=spinner],.toast__indicator [data-slot=spinner-icon]{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.toast__title{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--overlay-foreground)}.toast__description{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--muted)}.toast__close-button{pointer-events:none;top:calc(var(--spacing) * -1);right:calc(var(--spacing) * -1);width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5);border-color:var(--border);background-color:var(--default);opacity:0;position:absolute}@media(min-width:40rem){.toast__close-button{border-style:var(--tw-border-style);background-color:var(--overlay);border-width:1px}}.toast__close-button{transition:opacity .15s var(--ease-smooth)}.toast__close-button:is([data-reduce-motion=true],[data-reduce-motion=true] *),.toast__close-button:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.toast__close-button:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.toast__close-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.toast__close-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.toast__close-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.toast__close-button [data-slot=close-button-icon]{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}@media(min-width:40rem){.toast__close-button [data-slot=close-button-icon]{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}}@media(hover:hover){.toast__close-button:hover,.toast__close-button[data-hovered=true]{background-color:var(--default)}}.toast[data-frontmost=true]:hover .toast__close-button{pointer-events:auto;opacity:1}.toast__action{margin-top:calc(var(--spacing) * 2)}@media(min-width:40rem){.toast__action{margin-top:0}}.toast--accent .toast__title{color:var(--accent-soft-foreground)}.toast--success .toast__title,.toast--success .toast__indicator{color:var(--success-soft-foreground)}.toast--warning .toast__title,.toast--warning .toast__indicator{color:var(--warning-soft-foreground)}.toast--danger .toast__title,.toast--danger .toast__indicator{color:var(--danger-soft-foreground)}::view-transition-old(*){will-change:translate,opacity}::view-transition-new(*){will-change:translate,opacity}::view-transition-new(.toast-bottom):only-child{animation:.35s toast-slide-bottom-in}::view-transition-old(.toast-bottom):only-child{animation:.35s forwards toast-slide-bottom-out}::view-transition-new(.toast-top):only-child{animation:.35s toast-slide-top-in}::view-transition-old(.toast-top):only-child{animation:.35s forwards toast-slide-top-out}@keyframes toast-slide-bottom-in{0%{opacity:0;translate:0 100%}}@keyframes toast-slide-bottom-out{to{opacity:0;translate:0 100%}}@keyframes toast-slide-top-in{0%{opacity:0;translate:0 -100%}}@keyframes toast-slide-top-out{to{opacity:0;translate:0 -100%}}.checkbox-group{flex-direction:column;display:flex}.checkbox-group [data-slot=checkbox]{margin-top:calc(var(--spacing) * 4)}.checkbox{align-items:flex-start;gap:var(--spacing);--tw-outline-style:none;-webkit-tap-highlight-color:transparent;cursor:var(--cursor-interactive);outline-style:none;flex-direction:column;display:flex}.checkbox>[data-slot=description],.checkbox>[data-slot=field-error]{cursor:default;width:100%;min-width:0;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));text-wrap:wrap;overflow-wrap:break-word;color:var(--muted);-webkit-user-select:none;user-select:none;padding-inline-start:calc(var(--spacing) * 7)}.checkbox [data-slot=label]{-webkit-user-select:none;user-select:none}.checkbox .checkbox__content [data-slot=label]{cursor:var(--cursor-interactive)}.checkbox[data-disabled=true],.checkbox[data-disabled=true] [data-slot=description],.checkbox[data-disabled=true] [data-slot=field-error]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}:is(.checkbox[data-selected=true],.checkbox[data-indeterminate=true]) .checkbox__indicator{border-color:var(--accent-foreground)}.checkbox [data-slot=checkbox-default-indicator--checkmark]{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5);stroke-width:2.5px;color:var(--accent-foreground);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;transition-duration:.2s}.checkbox [data-slot=checkbox-default-indicator--checkmark]:is([data-reduce-motion=true],[data-reduce-motion=true] *),.checkbox [data-slot=checkbox-default-indicator--checkmark]:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.checkbox [data-slot=checkbox-default-indicator--checkmark]:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.checkbox [data-slot=checkbox-default-indicator--checkmark]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.checkbox [data-slot=checkbox-default-indicator--checkmark]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.checkbox [data-slot=checkbox-default-indicator--checkmark]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.checkbox[data-selected=true] [data-slot=checkbox-default-indicator--checkmark]{transition:stroke-dashoffset .15s linear 15ms}.checkbox[data-invalid=true][data-selected=true] [data-slot=checkbox-default-indicator--checkmark],.checkbox[data-invalid=true][aria-checked=true] [data-slot=checkbox-default-indicator--checkmark],.checkbox[aria-invalid=true][data-selected=true] [data-slot=checkbox-default-indicator--checkmark],.checkbox[aria-invalid=true][aria-checked=true] [data-slot=checkbox-default-indicator--checkmark]{color:var(--danger-foreground)}.checkbox[data-indeterminate=true] [data-slot=checkbox-default-indicator--indeterminate]{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.checkbox[data-indeterminate=true][data-invalid=true] [data-slot=checkbox-default-indicator--indeterminate],.checkbox[data-indeterminate=true][aria-invalid=true] [data-slot=checkbox-default-indicator--indeterminate]{color:var(--danger-foreground)}.checkbox__control{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);border-radius:calc(var(--radius) * .75);border-style:var(--tw-border-style);border-width:1px;border-width:var(--border-width-field);border-color:var(--field-border,var(--border));background-color:var(--field-background,var(--default));--tw-shadow:var(--field-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;-webkit-tap-highlight-color:transparent;transition:background-color .2s var(--ease-out),border-color .2s var(--ease-out),transform .1s var(--ease-out);outline-style:none;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex;position:relative;overflow:hidden}.checkbox__control:is([data-reduce-motion=true],[data-reduce-motion=true] *),.checkbox__control:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.checkbox__control:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.checkbox__control:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.checkbox__control:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.checkbox__control:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.checkbox__control{cursor:var(--cursor-interactive)}.checkbox__control:before{pointer-events:none;z-index:0;transform-origin:50%;--tw-scale-x:70%;--tw-scale-y:70%;--tw-scale-z:70%;scale:var(--tw-scale-x) var(--tw-scale-y);border-radius:calc(var(--radius) * .75);background-color:var(--accent);opacity:0;--tw-content:"";content:var(--tw-content);transition:scale .1s var(--ease-linear),opacity .2s var(--ease-linear),background-color .2s var(--ease-out);position:absolute;top:0;right:0;bottom:0;left:0}@media(prefers-reduced-motion:reduce){.checkbox__control:before:not(:is()){transition-property:none}}.checkbox:focus-visible .checkbox__control,.checkbox:has([data-slot=checkbox-content][data-focus-visible=true]) .checkbox__control,.checkbox [data-slot=checkbox-content][data-focus-visible=true] .checkbox__control{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.checkbox:hover .checkbox__control,.checkbox:has([data-slot=checkbox-content][data-hovered=true]) .checkbox__control,.checkbox [data-slot=checkbox-content][data-hovered=true] .checkbox__control{border-color:var(--field-border-hover)}:is(.checkbox:hover .checkbox__control,.checkbox:has([data-slot=checkbox-content][data-hovered=true]) .checkbox__control,.checkbox [data-slot=checkbox-content][data-hovered=true] .checkbox__control):before{background-color:var(--accent-hover)}.checkbox[aria-checked=true] .checkbox__control,.checkbox[data-selected=true] .checkbox__control{color:var(--accent-foreground);border-color:#0000}:is(.checkbox[aria-checked=true] .checkbox__control,.checkbox[data-selected=true] .checkbox__control):before{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y);opacity:1}.checkbox[data-indeterminate=true] .checkbox__control{background-color:var(--accent);color:var(--accent-foreground)}.checkbox:active[data-indeterminate=true] .checkbox__control,.checkbox[data-pressed=true][data-indeterminate=true] .checkbox__control,.checkbox:has([data-slot=checkbox-content][data-pressed=true])[data-indeterminate=true] .checkbox__control{background-color:var(--accent-hover)}.checkbox[data-invalid=true]:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control,.checkbox[aria-invalid=true]:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}:is(.checkbox[data-invalid=true]:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control,.checkbox[aria-invalid=true]:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control):focus,:is(.checkbox[data-invalid=true]:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control,.checkbox[aria-invalid=true]:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control):focus-visible,:is(.checkbox[data-invalid=true]:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control,.checkbox[aria-invalid=true]:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control)[data-focused=true],:is(.checkbox[data-invalid=true]:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control,.checkbox[aria-invalid=true]:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control)[data-focus-visible=true],:is(.checkbox[data-invalid=true]:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control,.checkbox[aria-invalid=true]:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control):focus-within,:is(.checkbox[data-invalid=true]:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control,.checkbox[aria-invalid=true]:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control)[data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.checkbox[data-invalid=true][aria-checked=true] .checkbox__control,.checkbox[data-invalid=true][data-selected=true] .checkbox__control,.checkbox[aria-invalid=true][aria-checked=true] .checkbox__control,.checkbox[aria-invalid=true][data-selected=true] .checkbox__control{background-color:var(--danger);color:var(--danger-foreground);border-color:#0000}:is(.checkbox[data-invalid=true][aria-checked=true] .checkbox__control,.checkbox[data-invalid=true][data-selected=true] .checkbox__control,.checkbox[aria-invalid=true][aria-checked=true] .checkbox__control,.checkbox[aria-invalid=true][data-selected=true] .checkbox__control):before{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y);background-color:var(--danger);opacity:1}.checkbox[data-indeterminate=true][aria-invalid=true] .checkbox__control,.checkbox[data-indeterminate=true][data-invalid=true] .checkbox__control{background-color:var(--danger);color:var(--danger-foreground)}.checkbox__indicator{z-index:10;width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3);justify-content:center;align-items:center;display:flex;position:relative}.checkbox__indicator svg{width:100%;height:100%;transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.checkbox--disabled{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.checkbox--secondary .checkbox__control{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:var(--checkbox-control-bg);--checkbox-control-bg:var(--default)}.checkbox:hover :is(.checkbox--secondary .checkbox__control),.checkbox:has([data-slot=checkbox-content][data-hovered=true]) :is(.checkbox--secondary .checkbox__control),.checkbox [data-slot=checkbox-content][data-hovered=true] :is(.checkbox--secondary .checkbox__control){border-color:var(--field-border-hover)}.checkbox__content{cursor:inherit;align-items:center;gap:calc(var(--spacing) * 3);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--foreground);--tw-outline-style:none;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;outline-style:none;display:inline-flex}.checkbox--secondary:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control{background-color:var(--checkbox-control-bg)}:is(.checkbox--secondary[aria-checked=true] .checkbox__control,.checkbox--secondary[data-selected=true] .checkbox__control):before,.checkbox--secondary[data-indeterminate=true] .checkbox__control,.checkbox--secondary[data-indeterminate=true] .checkbox__control:before{background-color:var(--accent)}.fieldset{gap:calc(var(--spacing) * 6);flex-direction:column;flex:1 1 0;display:flex}.fieldset__legend{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--foreground)}.fieldset__field_group{width:100%}:where(.fieldset__field_group>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}.fieldset__actions{align-items:center;gap:calc(var(--spacing) * 2);padding-top:var(--spacing);display:flex}.input-otp{align-items:center;gap:calc(var(--spacing) * 2);display:flex;position:relative}.input-otp[data-disabled=true]{cursor:not-allowed;opacity:.5}.input-otp__group{align-items:center;gap:calc(var(--spacing) * 2);display:flex}.input-otp__slot{height:calc(var(--spacing) * 10);width:calc(var(--spacing) * 9.5);border-style:var(--tw-border-style);background-color:var(--field-background,var(--default));color:var(--field-foreground,var(--foreground));--tw-shadow:var(--field-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-radius:var(--field-radius,calc(var(--radius) * 1.5));font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-outline-style:none;border-width:1px;border-width:var(--border-width-field);border-color:var(--field-border);transition:background-color .15s var(--ease-smooth),border-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out);outline-style:none;flex:1;justify-content:center;align-items:center;display:flex;position:relative}.input-otp__slot:is([data-reduce-motion=true],[data-reduce-motion=true] *),.input-otp__slot:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.input-otp__slot:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.input-otp__slot:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.input-otp__slot:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.input-otp__slot:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}@media(hover:hover){.input-otp__slot:hover,.input-otp__slot[data-hovered=true]{background-color:var(--field-hover);border-color:var(--field-border-hover)}}.input-otp__slot[data-active=true]{z-index:10;background-color:var(--field-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);--tw-ring-color:var(--focus);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;--tw-ring-offset-width:0px;outline-style:none}.input-otp__slot[data-filled=true]{background-color:var(--field-focus)}.input-otp__slot[data-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.input-otp__slot[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.input-otp__slot[data-invalid=true]:focus,.input-otp__slot[data-invalid=true]:focus-visible,.input-otp__slot[data-invalid=true][data-focused=true],.input-otp__slot[data-invalid=true][data-focus-visible=true],.input-otp__slot[data-invalid=true]:focus-within,.input-otp__slot[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.input-otp__slot[data-invalid=true]{background-color:var(--field-focus)}.input-otp__slot-value{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height));--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6);--tw-tracking:-.27px;letter-spacing:-.27px;animation:slot-value-in .25s var(--ease-smooth) both;transform-origin:bottom}.input-otp__slot-value:is([data-reduce-motion=true],[data-reduce-motion=true] *),.input-otp__slot-value:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.input-otp__slot-value:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{animation:none}@media(prefers-reduced-motion:reduce){.input-otp__slot-value:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.input-otp__slot-value:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.input-otp__slot-value:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{animation:none}}.input-otp__caret{height:calc(var(--spacing) * 4);border-radius:calc(var(--radius) * .5);background-color:var(--field-placeholder,var(--muted));width:2px;animation:1.2s ease-out infinite caret-blink;position:absolute}.input-otp__separator{border-radius:calc(var(--radius) * .5);background-color:var(--separator);flex-shrink:0;width:6px;height:2px}.input-otp--secondary .input-otp__slot{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:var(--input-otp-slot-bg);--input-otp-slot-bg:var(--default);--input-otp-slot-bg-hover:var(--default-hover);--input-otp-slot-bg-focus:var(--default)}@media(hover:hover){.input-otp--secondary .input-otp__slot:hover,.input-otp--secondary .input-otp__slot[data-hovered=true]{background-color:var(--input-otp-slot-bg-hover)}}.input-otp--secondary .input-otp__slot[data-active=true],.input-otp--secondary .input-otp__slot[data-filled=true]{background-color:var(--input-otp-slot-bg-focus)}@keyframes slot-value-in{0%{opacity:0;transform:translateY(8px)scale(.8)}to{opacity:1;transform:translateY(0)scale(1)}}.input{border-radius:var(--field-radius,calc(var(--radius) * 1.5));border-style:var(--tw-border-style);background-color:var(--field-background,var(--default));padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));color:var(--field-foreground,var(--foreground));--tw-shadow:var(--field-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;border-width:1px;outline-style:none}.input::placeholder{color:var(--field-placeholder,var(--muted))}@media(min-width:40rem){.input{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.input{border-width:var(--border-width-field);border-color:var(--field-border);transition:background-color .15s var(--ease-smooth),border-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out)}.input:is([data-reduce-motion=true],[data-reduce-motion=true] *),.input:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.input:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.input:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.input:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.input:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}@media(hover:hover){.input:hover:not(:focus):not(:focus-visible),.input[data-hovered=true]:not([data-focused=true]):not([data-focus-visible=true]){background-color:var(--field-hover);border-color:var(--field-border-hover)}}.input:focus,.input[data-focused=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;--tw-ring-offset-width:0px;border-color:var(--field-border-focus);background-color:var(--field-focus);outline-style:none}.input[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.input[data-invalid=true]:focus,.input[data-invalid=true]:focus-visible,.input[data-invalid=true][data-focused=true],.input[data-invalid=true][data-focus-visible=true],.input[data-invalid=true]:focus-within,.input[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.input[data-invalid=true]{background-color:var(--field-focus)}.input:disabled,.input[data-disabled=true],.input[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.input--secondary{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:var(--input-bg);--input-bg:var(--default);--input-bg-hover:var(--default-hover);--input-bg-focus:var(--default)}@media(hover:hover){.input--secondary:hover:not(:focus):not(:focus-visible),.input--secondary[data-hovered=true]:not([data-focus-visible=true]):not([data-focused=true]){background-color:var(--input-bg-hover)}}.input--secondary:focus,.input--secondary[data-focused=true]{background-color:var(--input-bg-focus)}.input--secondary[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.input--secondary[data-invalid=true]:focus,.input--secondary[data-invalid=true]:focus-visible,.input--secondary[data-invalid=true][data-focused=true],.input--secondary[data-invalid=true][data-focus-visible=true],.input--secondary[data-invalid=true]:focus-within,.input--secondary[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.input--secondary[data-invalid=true]{background-color:var(--input-bg-focus)}.input--full-width{width:100%}.input-group{min-height:calc(var(--spacing) * 9);border-radius:var(--field-radius,calc(var(--radius) * 1.5));border-style:var(--tw-border-style);background-color:var(--field-background,var(--default));font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--field-foreground,var(--foreground));--tw-shadow:var(--field-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;border-width:1px;border-width:var(--border-width-field);border-color:var(--field-border);outline-style:none;align-items:center;display:inline-flex}.input-group:has([data-slot=input-group-textarea]){align-items:flex-start;height:auto}.input-group{transition:background-color .15s var(--ease-smooth),border-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out)}.input-group:is([data-reduce-motion=true],[data-reduce-motion=true] *),.input-group:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.input-group:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.input-group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.input-group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.input-group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}@media(hover:hover){.input-group:hover:not(:focus-within),.input-group[data-hovered=true]:not([data-focus-within=true]){background-color:var(--field-hover);border-color:var(--field-border-hover)}}.input-group:has([data-slot=input-group-input]:focus),.input-group:has([data-slot=input-group-textarea]: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);--tw-ring-color:var(--focus);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;--tw-ring-offset-width:0px;border-color:var(--field-border-focus);background-color:var(--field-focus);outline-style:none}.input-group[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.input-group[data-invalid=true]:focus,.input-group[data-invalid=true]:focus-visible,.input-group[data-invalid=true][data-focused=true],.input-group[data-invalid=true][data-focus-visible=true],.input-group[data-invalid=true]:focus-within,.input-group[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.input-group[data-invalid=true]{background-color:var(--field-focus);border-color:var(--color-field-border-invalid)}.input-group[data-disabled=true],.input-group[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}:-webkit-any(.input-group:has([data-slot=input-group-input]:-webkit-autofill),.input-group:has([data-slot=input-group-input]:autofill)){background-color:var(--field-focus);border-color:var(--field-border-focus)}:is(.input-group:has([data-slot=input-group-input]:autofill)){background-color:var(--field-focus);border-color:var(--field-border-focus)}.input-group__input{border-style:var(--tw-border-style);padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;background-color:#0000;border-width:0;border-radius:0;outline-style:none;flex:1}.input-group__input::placeholder{color:var(--field-placeholder,var(--muted))}@media(min-width:40rem){.input-group__input{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.input-group:has([data-slot=input-group-prefix]) .input-group__input{border-top-left-radius:0;border-bottom-left-radius:0;padding-left:0}.input-group:has([data-slot=input-group-suffix]) .input-group__input{border-top-right-radius:0;border-bottom-right-radius:0;padding-right:0}.input-group__input:focus,.input-group__input:focus-visible{--tw-outline-style:none;outline-style:none}.input-group__input:-webkit-autofill{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.input-group__input:-webkit-autofill:hover{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.input-group__input:-webkit-autofill:focus{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.input-group__input:-webkit-autofill:active{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.input-group__input:autofill{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.input-group__input[data-slot=input-group-textarea]{resize:vertical;min-height:38px}.input-group__prefix{border-top-left-radius:var(--field-radius,calc(var(--radius) * 1.5));border-bottom-left-radius:var(--field-radius,calc(var(--radius) * 1.5));height:100%;padding-inline:calc(var(--spacing) * 3);color:var(--field-placeholder,var(--muted));border-width:var(--border-width-field);border-color:var(--field-border);border-style:solid;border-right-color:var(--field-border);background-color:#0000;border-top:none;border-bottom:none;border-left:none;border-top-right-radius:0;border-bottom-right-radius:0;justify-content:center;align-items:center;display:flex}.input-group:has([data-slot=input-group-textarea]) .input-group__prefix{align-items:flex-start;padding-top:.5rem}.input-group__prefix{transition:background-color .15s var(--ease-smooth),border-color .15s var(--ease-smooth)}.input-group__prefix:is([data-reduce-motion=true],[data-reduce-motion=true] *),.input-group__prefix:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.input-group__prefix:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.input-group__prefix:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.input-group__prefix:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.input-group__prefix:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.input-group__suffix{border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:var(--field-radius,calc(var(--radius) * 1.5));border-bottom-right-radius:var(--field-radius,calc(var(--radius) * 1.5));height:100%;padding-inline:calc(var(--spacing) * 3);color:var(--field-placeholder,var(--muted));border-width:var(--border-width-field);border-color:var(--field-border);border-style:solid;border-left-color:var(--field-border);background-color:#0000;border-top:none;border-bottom:none;border-right:none;justify-content:center;align-items:center;display:flex}.input-group:has([data-slot=input-group-textarea]) .input-group__suffix{align-items:flex-start;padding-top:.5rem}.input-group__suffix{transition:background-color .15s var(--ease-smooth),border-color .15s var(--ease-smooth)}.input-group__suffix:is([data-reduce-motion=true],[data-reduce-motion=true] *),.input-group__suffix:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.input-group__suffix:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.input-group__suffix:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.input-group__suffix:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.input-group__suffix:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.input-group--secondary{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:var(--input-group-bg);--input-group-bg:var(--default);--input-group-bg-hover:var(--default-hover);--input-group-bg-focus:var(--default)}@media(hover:hover){.input-group--secondary:hover:not(:focus-within),.input-group--secondary[data-hovered=true]:not([data-focus-within=true]){background-color:var(--input-group-bg-hover)}}.input-group--secondary:has([data-slot=input-group-input]:focus),.input-group--secondary:has([data-slot=input-group-textarea]:focus){background-color:var(--input-group-bg-focus)}.input-group--secondary[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.input-group--secondary[data-invalid=true]:focus,.input-group--secondary[data-invalid=true]:focus-visible,.input-group--secondary[data-invalid=true][data-focused=true],.input-group--secondary[data-invalid=true][data-focus-visible=true],.input-group--secondary[data-invalid=true]:focus-within,.input-group--secondary[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.input-group--secondary[data-invalid=true]{border-color:var(--color-field-border-invalid);background-color:var(--input-group-bg-focus)}.input-group--secondary [data-slot=input-group-input],.input-group--secondary [data-slot=input-group-textarea]{background-color:#0000}.input-group--full-width{width:100%}.number-field{gap:var(--spacing);flex-direction:column;display:flex}:is(.number-field[data-invalid=true],.number-field[aria-invalid=true]) [data-slot=description]{display:none}.number-field [data-slot=label]{width:fit-content}.number-field__group{height:calc(var(--spacing) * 9);border-radius:var(--field-radius,calc(var(--radius) * 1.5));border-style:var(--tw-border-style);background-color:var(--field-background,var(--default));font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--field-foreground,var(--foreground));--tw-shadow:var(--field-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;border-width:1px;border-width:var(--border-width-field);border-color:var(--field-border);transition:background-color .15s var(--ease-smooth),border-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out);outline-style:none;grid-template-columns:40px 1fr 40px;align-items:center;display:grid;overflow:hidden}.number-field__group:is([data-reduce-motion=true],[data-reduce-motion=true] *),.number-field__group:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.number-field__group:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.number-field__group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.number-field__group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.number-field__group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}@media(hover:hover){.number-field__group:hover:not(:focus-within),.number-field__group[data-hovered=true]:not([data-focus-within=true]){background-color:var(--field-hover);border-color:var(--field-border-hover)}}.number-field__group[data-focus-within=true],.number-field__group:focus-within{--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);--tw-ring-color:var(--focus);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;--tw-ring-offset-width:0px;border-color:var(--field-border-focus);background-color:var(--field-focus);outline-style:none}.number-field__group[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.number-field__group[data-invalid=true]:focus,.number-field__group[data-invalid=true]:focus-visible,.number-field__group[data-invalid=true][data-focused=true],.number-field__group[data-invalid=true][data-focus-visible=true],.number-field__group[data-invalid=true]:focus-within,.number-field__group[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.number-field__group[data-invalid=true]{background-color:var(--field-focus);border-color:var(--color-field-border-invalid)}.number-field__group[data-disabled=true],.number-field__group[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}:-webkit-any(.number-field__group:has([data-slot=number-field-input]:-webkit-autofill),.number-field__group:has([data-slot=number-field-input]:autofill)){background-color:var(--field-focus);border-color:var(--field-border-focus)}:is(.number-field__group:has([data-slot=number-field-input]:autofill)){background-color:var(--field-focus);border-color:var(--field-border-focus)}.number-field__input{border-style:var(--tw-border-style);min-width:0;padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--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,);--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;background-color:#0000;border-width:0;border-radius:0;outline-style:none}@media(min-width:40rem){.number-field__input{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.number-field__group:has([slot=decrement]) .number-field__input{border-top-left-radius:0;border-bottom-left-radius:0}.number-field__group:has([slot=increment]) .number-field__input{border-top-right-radius:0;border-bottom-right-radius:0}.number-field__input:focus,.number-field__input:focus-visible{--tw-outline-style:none;outline-style:none}.number-field__input:-webkit-autofill{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.number-field__input:-webkit-autofill:hover{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.number-field__input:-webkit-autofill:focus{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.number-field__input:-webkit-autofill:active{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.number-field__input:autofill{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.number-field__increment-button,.number-field__decrement-button{height:100%;width:calc(var(--spacing) * 10);color:var(--field-foreground,var(--foreground));--tw-outline-style:none;border-width:var(--border-width-field);border-color:var(--field-border);transition:background-color .15s var(--ease-smooth),border-color .15s var(--ease-smooth);background-color:#0000;border-style:solid;border-radius:0;outline-style:none;justify-content:center;align-items:center;display:flex}:is(.number-field__increment-button,.number-field__decrement-button):is([data-reduce-motion=true],[data-reduce-motion=true] *),:is(.number-field__increment-button,.number-field__decrement-button):is([data-reduce-motion=true],[data-reduce-motion=true] *):before,:is(.number-field__increment-button,.number-field__decrement-button):is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){:is(.number-field__increment-button,.number-field__decrement-button):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),:is(.number-field__increment-button,.number-field__decrement-button):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,:is(.number-field__increment-button,.number-field__decrement-button):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.number-field__increment-button,.number-field__decrement-button{cursor:var(--cursor-interactive)}:is(.number-field__increment-button,.number-field__decrement-button):active,:is(.number-field__increment-button,.number-field__decrement-button)[data-pressed=true]{background-color:var(--field-foreground,var(--foreground))}@supports (color:color-mix(in lab,red,red)){:is(.number-field__increment-button,.number-field__decrement-button):active,:is(.number-field__increment-button,.number-field__decrement-button)[data-pressed=true]{background-color:color-mix(in oklab,var(--field-foreground,var(--foreground)) 10%,transparent)}}:is(.number-field__increment-button,.number-field__decrement-button):active,:is(.number-field__increment-button,.number-field__decrement-button)[data-pressed=true]{transform:scale(.97)}:is(.number-field__increment-button,.number-field__decrement-button):disabled,:is(.number-field__increment-button,.number-field__decrement-button)[data-disabled=true],:is(.number-field__increment-button,.number-field__decrement-button)[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}:is(.number-field__increment-button,.number-field__decrement-button) [data-slot=number-field-increment-button-icon],:is(.number-field__increment-button,.number-field__decrement-button) [data-slot=number-field-decrement-button-icon]{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.number-field__increment-button{border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:var(--field-radius,calc(var(--radius) * 1.5));border-bottom-right-radius:var(--field-radius,calc(var(--radius) * 1.5));border-left-style:var(--tw-border-style);border-left-width:1px;border-color:var(--field-placeholder,var(--muted))}@supports (color:color-mix(in lab,red,red)){.number-field__increment-button{border-color:color-mix(in oklab,var(--field-placeholder,var(--muted)) 15%,transparent)}}.number-field__decrement-button{border-top-left-radius:var(--field-radius,calc(var(--radius) * 1.5));border-bottom-left-radius:var(--field-radius,calc(var(--radius) * 1.5));border-right-style:var(--tw-border-style);border-right-width:1px;border-color:var(--field-placeholder,var(--muted));border-top-right-radius:0;border-bottom-right-radius:0}@supports (color:color-mix(in lab,red,red)){.number-field__decrement-button{border-color:color-mix(in oklab,var(--field-placeholder,var(--muted)) 15%,transparent)}}.number-field--secondary .number-field__group{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:var(--number-field-group-bg);--number-field-group-bg:var(--default);--number-field-group-bg-hover:var(--default-hover);--number-field-group-bg-focus:var(--default)}@media(hover:hover){.number-field--secondary .number-field__group:hover:not(:focus-within),.number-field--secondary .number-field__group[data-hovered=true]:not([data-focus-within=true]){background-color:var(--number-field-group-bg-hover)}}.number-field--secondary .number-field__group:focus-within,.number-field--secondary .number-field__group[data-focus-within=true]{background-color:var(--number-field-group-bg-focus)}.number-field--secondary .number-field__group[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.number-field--secondary .number-field__group[data-invalid=true]:focus,.number-field--secondary .number-field__group[data-invalid=true]:focus-visible,.number-field--secondary .number-field__group[data-invalid=true][data-focused=true],.number-field--secondary .number-field__group[data-invalid=true][data-focus-visible=true],.number-field--secondary .number-field__group[data-invalid=true]:focus-within,.number-field--secondary .number-field__group[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.number-field--secondary .number-field__group[data-invalid=true]{border-color:var(--color-field-border-invalid);background-color:var(--number-field-group-bg-focus)}.number-field--secondary .number-field__group [data-slot=number-field-input]{background-color:#0000}.number-field--full-width,.number-field__group--full-width{width:100%}.radio-group{flex-direction:column;display:flex}.radio-group[data-orientation=vertical] [data-slot=radio]{margin-top:calc(var(--spacing) * 4)}.radio-group[data-orientation=horizontal]{gap:calc(var(--spacing) * 4);flex-flow:wrap}.radio-group--secondary .radio__control{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:var(--radio-control-bg);--radio-control-bg:var(--default);--radio-control-bg-hover:var(--default-hover)}.radio:has([data-slot=radio-content][data-hovered=true]) :is(.radio-group--secondary .radio__control),.radio [data-slot=radio-content][data-hovered=true] :is(.radio-group--secondary .radio__control){border-color:var(--field-border-hover)}.radio:not([data-selected]):not(:has(input:checked)) :is(.radio-group--secondary .radio__control) .radio__indicator:empty:before{background-color:var(--radio-control-bg)}.radio:has([data-slot=radio-content][data-hovered=true]):not([data-selected]):not(:has(input:checked)) :is(.radio-group--secondary .radio__control) .radio__indicator:empty:before{background-color:var(--radio-control-bg-hover)}.radio{align-items:flex-start;gap:var(--spacing);--tw-outline-style:none;-webkit-tap-highlight-color:transparent;cursor:var(--cursor-interactive);outline-style:none;flex-direction:column;display:flex}.radio [data-slot=label]{-webkit-user-select:none;user-select:none}.radio .radio__content [data-slot=label]{cursor:var(--cursor-interactive)}.radio>[data-slot=description],.radio>[data-slot=field-error]{cursor:default;width:100%;min-width:0;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));text-wrap:wrap;overflow-wrap:break-word;color:var(--muted);-webkit-user-select:none;user-select:none;padding-inline-start:calc(var(--spacing) * 7)}.radio:disabled,.radio[data-disabled=true],.radio[aria-disabled=true],:is(.radio:disabled,.radio[data-disabled=true],.radio[aria-disabled=true]) [data-slot=description],:is(.radio:disabled,.radio[data-disabled=true],.radio[aria-disabled=true]) [data-slot=field-error]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.radio__content{cursor:inherit;align-items:center;gap:calc(var(--spacing) * 3);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--foreground);--tw-outline-style:none;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;outline-style:none;display:inline-flex}.radio__control{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);border-radius:calc(var(--radius) * 1);border-style:var(--tw-border-style);border-width:1px;border-width:var(--border-width-field);border-color:var(--field-border,var(--border));background-color:var(--field-background,var(--default));--tw-shadow:var(--field-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;-webkit-tap-highlight-color:transparent;transition:background-color .2s var(--ease-out),border-color .2s var(--ease-out),transform .1s var(--ease-out);outline-style:none;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex;position:relative}.radio__control:is([data-reduce-motion=true],[data-reduce-motion=true] *),.radio__control:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.radio__control:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.radio__control:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.radio__control:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.radio__control:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.radio__control{cursor:var(--cursor-interactive)}.radio:has([data-slot=radio-content][data-focus-visible=true]) .radio__control,.radio [data-slot=radio-content][data-focus-visible=true] .radio__control{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.radio:has([data-slot=radio-content][data-hovered=true]) .radio__control,.radio [data-slot=radio-content][data-hovered=true] .radio__control{border-color:var(--field-border-hover)}.radio:has([data-slot=radio-content][data-hovered=true]):not([data-selected]):not(:has(input:checked)) .radio__control .radio__indicator:empty:before{background-color:var(--field-hover)}.radio:has([data-slot=radio-content][data-pressed=true]) .radio__control,.radio [data-slot=radio-content][data-pressed=true] .radio__control{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.radio[data-selected] .radio__control,.radio:has([data-slot=radio-content][aria-checked=true]) .radio__control,.radio:has(input:checked) .radio__control{background-color:var(--accent);border-color:#0000}.radio[data-selected]:has([data-slot=radio-content][data-pressed=true]) .radio__control,.radio:has([data-slot=radio-content][data-pressed=true][aria-checked=true]) .radio__control,.radio:has(input:checked):has([data-slot=radio-content][data-pressed=true]) .radio__control{background-color:var(--accent-hover)}.radio[data-invalid=true] .radio__control,.radio[aria-invalid=true] .radio__control{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}:is(.radio[data-invalid=true] .radio__control,.radio[aria-invalid=true] .radio__control):focus,:is(.radio[data-invalid=true] .radio__control,.radio[aria-invalid=true] .radio__control):focus-visible,:is(.radio[data-invalid=true] .radio__control,.radio[aria-invalid=true] .radio__control)[data-focused=true],:is(.radio[data-invalid=true] .radio__control,.radio[aria-invalid=true] .radio__control)[data-focus-visible=true],:is(.radio[data-invalid=true] .radio__control,.radio[aria-invalid=true] .radio__control):focus-within,:is(.radio[data-invalid=true] .radio__control,.radio[aria-invalid=true] .radio__control)[data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.radio[data-invalid=true][data-selected] .radio__control,.radio[aria-invalid=true][data-selected] .radio__control,.radio[data-invalid=true]:has(input:checked) .radio__control,.radio[aria-invalid=true]:has(input:checked) .radio__control{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}:is(.radio[data-invalid=true][data-selected] .radio__control,.radio[aria-invalid=true][data-selected] .radio__control,.radio[data-invalid=true]:has(input:checked) .radio__control,.radio[aria-invalid=true]:has(input:checked) .radio__control):focus,:is(.radio[data-invalid=true][data-selected] .radio__control,.radio[aria-invalid=true][data-selected] .radio__control,.radio[data-invalid=true]:has(input:checked) .radio__control,.radio[aria-invalid=true]:has(input:checked) .radio__control):focus-visible,:is(.radio[data-invalid=true][data-selected] .radio__control,.radio[aria-invalid=true][data-selected] .radio__control,.radio[data-invalid=true]:has(input:checked) .radio__control,.radio[aria-invalid=true]:has(input:checked) .radio__control)[data-focused=true],:is(.radio[data-invalid=true][data-selected] .radio__control,.radio[aria-invalid=true][data-selected] .radio__control,.radio[data-invalid=true]:has(input:checked) .radio__control,.radio[aria-invalid=true]:has(input:checked) .radio__control)[data-focus-visible=true],:is(.radio[data-invalid=true][data-selected] .radio__control,.radio[aria-invalid=true][data-selected] .radio__control,.radio[data-invalid=true]:has(input:checked) .radio__control,.radio[aria-invalid=true]:has(input:checked) .radio__control):focus-within,:is(.radio[data-invalid=true][data-selected] .radio__control,.radio[aria-invalid=true][data-selected] .radio__control,.radio[data-invalid=true]:has(input:checked) .radio__control,.radio[aria-invalid=true]:has(input:checked) .radio__control)[data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.radio__indicator{pointer-events:none;justify-content:center;align-items:center;display:flex;position:absolute;top:0;right:0;bottom:0;left:0}.radio__indicator:empty:before{content:"";border-radius:calc(var(--radius) * 1);background-color:var(--field-background,var(--default));width:100%;height:100%;transition:scale .2s var(--ease-out),background-color .2s var(--ease-out);scale:1}@media(prefers-reduced-motion:reduce){.radio__indicator:empty:before:not(:is()){transition-property:none}}.radio[data-selected] .radio__indicator:empty:before,.radio:has([data-slot=radio-content][aria-checked=true]) .radio__indicator:empty:before,.radio:has(input:checked) .radio__indicator:empty:before{background-color:var(--accent-foreground);scale:.4286}.radio[data-selected]:has([data-slot=radio-content][data-pressed=true]) .radio__indicator:empty:before,.radio:has([data-slot=radio-content][data-pressed=true][aria-checked=true]) .radio__indicator:empty:before,.radio:has(input:checked):has([data-slot=radio-content][data-pressed=true]) .radio__indicator:empty:before{scale:.5714}.radio--disabled{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.textfield{gap:var(--spacing);flex-direction:column;display:flex}:is(.textfield[data-invalid=true],.textfield[aria-invalid=true]) [data-slot=description]{display:none}.textfield--full-width,.textfield--full-width [data-slot=input],.textfield--full-width [data-slot=textarea]{width:100%}.search-field{gap:var(--spacing);flex-direction:column;display:flex}:is(.search-field[data-invalid=true],.search-field[aria-invalid=true]) [data-slot=description]{display:none}.search-field [data-slot=label]{width:fit-content}.search-field[data-empty=true] [data-slot=search-field-clear-button]{pointer-events:none;opacity:0}.search-field__group{height:calc(var(--spacing) * 9);border-radius:var(--field-radius,calc(var(--radius) * 1.5));border-style:var(--tw-border-style);background-color:var(--field-background,var(--default));font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--field-foreground,var(--foreground));--tw-shadow:var(--field-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;border-width:1px;border-width:var(--border-width-field);border-color:var(--field-border);transition:background-color .15s var(--ease-smooth),border-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out);outline-style:none;align-items:center;display:inline-flex;position:relative;overflow:hidden}.search-field__group:is([data-reduce-motion=true],[data-reduce-motion=true] *),.search-field__group:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.search-field__group:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.search-field__group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.search-field__group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.search-field__group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}@media(hover:hover){.search-field__group:hover:not(:focus-within),.search-field__group[data-hovered=true]:not([data-focus-within=true]){background-color:var(--field-hover);border-color:var(--field-border-hover)}}.search-field__group[data-focus-within=true],.search-field__group:focus-within{--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);--tw-ring-color:var(--focus);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;--tw-ring-offset-width:0px;outline-style:none}.search-field__group[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.search-field__group[data-invalid=true]:focus,.search-field__group[data-invalid=true]:focus-visible,.search-field__group[data-invalid=true][data-focused=true],.search-field__group[data-invalid=true][data-focus-visible=true],.search-field__group[data-invalid=true]:focus-within,.search-field__group[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.search-field__group[data-invalid=true]{background-color:var(--field-focus);border-color:var(--color-field-border-invalid)}.search-field__group[data-disabled=true],.search-field__group[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}:-webkit-any(.search-field__group:has([data-slot=search-field-input]:-webkit-autofill),.search-field__group:has([data-slot=search-field-input]:autofill)){background-color:var(--field-focus);border-color:var(--field-border-focus)}:is(.search-field__group:has([data-slot=search-field-input]:autofill)){background-color:var(--field-focus);border-color:var(--field-border-focus)}.search-field__input{border-style:var(--tw-border-style);padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;background-color:#0000;border-width:0;border-radius:0;outline-style:none;flex:1}@media(min-width:40rem){.search-field__input{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.search-field__input::-webkit-search-cancel-button{-webkit-appearance:none;-moz-appearance:none;appearance:none}.search-field__input::-webkit-search-decoration{-webkit-appearance:none;-moz-appearance:none;appearance:none}.search-field__group:has([data-slot=search-field-search-icon]) .search-field__input{padding-left:calc(var(--spacing) * 2);border-top-left-radius:0;border-bottom-left-radius:0}.search-field__group:has([slot=clear]) .search-field__input{padding-right:calc(var(--spacing) * 2);border-top-right-radius:0;border-bottom-right-radius:0}.search-field__input:focus,.search-field__input:focus-visible{--tw-outline-style:none;outline-style:none}.search-field__input:-webkit-autofill{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.search-field__input:-webkit-autofill:hover{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.search-field__input:-webkit-autofill:focus{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.search-field__input:-webkit-autofill:active{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.search-field__input:autofill{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.search-field__search-icon{pointer-events:none;color:var(--field-placeholder,var(--muted));margin-right:0;margin-left:calc(var(--spacing) * 3);width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);flex-shrink:0}.search-field__clear-button{margin-right:calc(var(--spacing) * 2);width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5);flex-shrink:0}.search-field__clear-button [data-slot=close-button-icon]{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.search-field--secondary .search-field__group{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:var(--search-field-group-bg);--search-field-group-bg:var(--default);--search-field-group-bg-hover:var(--default-hover);--search-field-group-bg-focus:var(--default)}@media(hover:hover){.search-field--secondary .search-field__group:hover:not(:focus-within),.search-field--secondary .search-field__group[data-hovered=true]:not([data-focus-within=true]){background-color:var(--search-field-group-bg-hover)}}.search-field--secondary .search-field__group:focus-within,.search-field--secondary .search-field__group[data-focus-within=true]{background-color:var(--search-field-group-bg-focus)}.search-field--secondary .search-field__group[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.search-field--secondary .search-field__group[data-invalid=true]:focus,.search-field--secondary .search-field__group[data-invalid=true]:focus-visible,.search-field--secondary .search-field__group[data-invalid=true][data-focused=true],.search-field--secondary .search-field__group[data-invalid=true][data-focus-visible=true],.search-field--secondary .search-field__group[data-invalid=true]:focus-within,.search-field--secondary .search-field__group[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.search-field--secondary .search-field__group[data-invalid=true]{border-color:var(--color-field-border-invalid);background-color:var(--search-field-group-bg-focus)}.search-field--secondary .search-field__group [data-slot=search-field-input]{background-color:#0000}.search-field--full-width,.search-field__group--full-width{width:100%}.textarea{border-radius:var(--field-radius,calc(var(--radius) * 1.5));border-style:var(--tw-border-style);background-color:var(--field-background,var(--default));padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));color:var(--field-foreground,var(--foreground));--tw-shadow:var(--field-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;border-width:1px;outline-style:none}.textarea::placeholder{color:var(--field-placeholder,var(--muted))}@media(min-width:40rem){.textarea{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.textarea{border-width:var(--border-width-field);border-color:var(--field-border);min-height:38px;transition:background-color .15s var(--ease-smooth),border-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out)}.textarea:is([data-reduce-motion=true],[data-reduce-motion=true] *),.textarea:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.textarea:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.textarea:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.textarea:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.textarea:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}@media(hover:hover){.textarea:hover:not(:focus):not(:focus-visible),.textarea[data-hovered=true]:not([data-focused=true]):not([data-focus-visible=true]){background-color:var(--field-hover);border-color:var(--field-border-hover)}}.textarea:focus,.textarea[data-focused=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;--tw-ring-offset-width:0px;border-color:var(--field-border-focus);background-color:var(--field-focus);outline-style:none}.textarea[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.textarea[data-invalid=true]:focus,.textarea[data-invalid=true]:focus-visible,.textarea[data-invalid=true][data-focused=true],.textarea[data-invalid=true][data-focus-visible=true],.textarea[data-invalid=true]:focus-within,.textarea[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.textarea[data-invalid=true]{background-color:var(--field-focus)}.textarea:disabled,.textarea[data-disabled=true],.textarea[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.textarea--secondary{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:var(--textarea-bg);--textarea-bg:var(--default);--textarea-bg-hover:var(--default-hover);--textarea-bg-focus:var(--default)}@media(hover:hover){.textarea--secondary:hover:not(:focus):not(:focus-visible),.textarea--secondary[data-hovered=true]:not([data-focused=true]):not([data-focus-visible=true]){background-color:var(--textarea-bg-hover)}}.textarea--secondary:focus,.textarea--secondary[data-focused=true]{background-color:var(--textarea-bg-focus)}.textarea--secondary[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.textarea--secondary[data-invalid=true]:focus,.textarea--secondary[data-invalid=true]:focus-visible,.textarea--secondary[data-invalid=true][data-focused=true],.textarea--secondary[data-invalid=true][data-focus-visible=true],.textarea--secondary[data-invalid=true]:focus-within,.textarea--secondary[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.textarea--secondary[data-invalid=true]{background-color:var(--textarea-bg-focus)}.textarea--full-width{width:100%}.calendar{width:calc(var(--spacing) * 63);max-width:calc(var(--spacing) * 63);container-type:inline-size}.calendar--week-view .calendar__cell,.calendar--day-view .calendar__cell{aspect-ratio:1;place-self:center;width:100%;height:auto}.calendar--day-view .calendar__grid{flex-direction:column;display:flex}.calendar--day-view .calendar__grid-header{grid-template-columns:repeat(7,1fr);width:100%;display:grid}.calendar--day-view .calendar__grid-header>tr{display:contents}.calendar--day-view .calendar__grid-body{margin-top:var(--spacing);grid-template-columns:repeat(7,1fr);width:100%;display:grid}.calendar--day-view .calendar__grid-body>tr{display:contents}.calendar--day-view .calendar__grid-body>tr:first-child>td{margin-top:0}.calendar__header{padding-inline:calc(var(--spacing) * .5);padding-bottom:calc(var(--spacing) * 4);justify-content:space-between;align-items:center;display:flex}.calendar__header:has(.calendar-year-picker__trigger[data-open=true]) .calendar__nav-button{pointer-events:none;opacity:0}.calendar__heading{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);flex:1}.calendar__nav-button{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6);border-radius:calc(var(--radius) * 2);color:var(--accent-soft-foreground);will-change:scale;transition:transform .25s var(--ease-out),background-color .1s var(--ease-out),box-shadow .1s var(--ease-out),opacity .15s var(--ease-out);transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);justify-content:center;align-items:center;display:flex}.calendar__nav-button:is([data-reduce-motion=true],[data-reduce-motion=true] *),.calendar__nav-button:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.calendar__nav-button:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.calendar__nav-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.calendar__nav-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.calendar__nav-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.calendar__nav-button{cursor:var(--cursor-interactive)}@media(hover:hover){.calendar__nav-button:hover,.calendar__nav-button[data-hovered=true]{background-color:var(--default);color:var(--accent-soft-foreground)}}.calendar__nav-button:active,.calendar__nav-button[data-pressed=true]{transform:scale(.95)}.calendar__nav-button:focus-visible,.calendar__nav-button[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.calendar__nav-button:disabled,.calendar__nav-button[data-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.calendar__nav-button-icon{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.calendar__grid{grid-template-columns:repeat(7,1fr);width:100%;display:grid}.calendar__grid[aria-readonly=true] .calendar__cell{pointer-events:none}.calendar__grid-header,.calendar__grid-header>tr,.calendar__grid-body,.calendar__grid-body>tr{display:contents}.calendar__grid-body>tr:first-child>td{margin-top:var(--spacing)}.calendar__grid-row{display:contents}.calendar__header-cell{padding-bottom:calc(var(--spacing) * 2);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--muted);justify-content:center;align-items:center;display:flex}.calendar__cell{aspect-ratio:1;border-radius:calc(var(--radius) * 3);text-align:center;width:100%;height:100%;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);--tw-outline-style:none;-webkit-tap-highlight-color:transparent;will-change:scale;transition:transform .25s var(--ease-out),box-shadow .1s var(--ease-out);transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);outline-style:none;justify-content:center;align-items:center;display:flex;position:relative}.calendar__cell:is([data-reduce-motion=true],[data-reduce-motion=true] *),.calendar__cell:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.calendar__cell:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.calendar__cell:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.calendar__cell:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.calendar__cell:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.calendar__cell{cursor:var(--cursor-interactive)}.calendar__cell:focus-visible:not(:focus),.calendar__cell[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.calendar__cell[data-today=true]{background-color:var(--accent-soft);color:var(--accent-soft-foreground)}@media(hover:hover){.calendar__cell[data-today=true]:hover:not([data-selected=true]),.calendar__cell[data-today=true][data-hovered=true]:not([data-selected=true]){background-color:var(--accent-soft-hover)}}.calendar__cell[data-selected=true]{background-color:var(--accent);color:var(--accent-foreground)}.calendar__cell:active,.calendar__cell[data-pressed=true]{background-color:var(--default);transform:scale(.95)}:is(.calendar__cell:active,.calendar__cell[data-pressed=true])[data-selected=true]{background-color:var(--accent-hover)}@media(hover:hover){.calendar__cell:hover:not([data-selected=true]),.calendar__cell[data-hovered=true]:not([data-selected=true]){background-color:var(--default)}}.calendar__cell[data-outside-month=true]{color:var(--muted);opacity:.5}.calendar__cell[data-selected=true][data-outside-month=true]{background-color:var(--default)}.calendar__cell[data-unavailable=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.calendar__cell:disabled:not([data-outside-month=true]),.calendar__cell[data-disabled=true]:not([data-outside-month=true]){opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none;text-decoration:line-through}.calendar__cell-indicator{bottom:var(--spacing);--tw-translate-x: -50% ;width:3px;height:3px;translate:var(--tw-translate-x) var(--tw-translate-y);border-radius:calc(var(--radius) * .25);background-color:var(--muted);position:absolute;left:50%}[data-selected=true]>.calendar__cell-indicator{background-color:var(--accent-foreground)}.range-calendar{width:calc(var(--spacing) * 63);max-width:calc(var(--spacing) * 63);container-type:inline-size}.range-calendar--week-view .range-calendar__cell,.range-calendar--day-view .range-calendar__cell{aspect-ratio:1;place-self:center;width:100%;height:auto}.range-calendar--day-view .range-calendar__grid{flex-direction:column;display:flex}.range-calendar--day-view .range-calendar__grid-header{grid-template-columns:repeat(7,1fr);width:100%;display:grid}.range-calendar--day-view .range-calendar__grid-header>tr{display:contents}.range-calendar--day-view .range-calendar__grid-body{margin-top:var(--spacing);grid-template-columns:repeat(7,1fr);width:100%;display:grid}.range-calendar--day-view .range-calendar__grid-body>tr{display:contents}.range-calendar--day-view .range-calendar__grid-body>tr:first-child>td{margin-top:0}.range-calendar__header{padding-inline:calc(var(--spacing) * .5);padding-bottom:calc(var(--spacing) * 4);justify-content:space-between;align-items:center;display:flex}.range-calendar__header:has(.calendar-year-picker__trigger[data-open=true]) .range-calendar__nav-button{pointer-events:none;opacity:0}.range-calendar__heading{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);flex:1}.range-calendar__nav-button{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6);border-radius:calc(var(--radius) * 1.5);color:var(--accent-soft-foreground);will-change:scale;transition:transform .25s var(--ease-out),background-color .1s var(--ease-out),box-shadow .1s var(--ease-out),opacity .15s var(--ease-out);transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);justify-content:center;align-items:center;display:flex}.range-calendar__nav-button:is([data-reduce-motion=true],[data-reduce-motion=true] *),.range-calendar__nav-button:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.range-calendar__nav-button:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.range-calendar__nav-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.range-calendar__nav-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.range-calendar__nav-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.range-calendar__nav-button{cursor:var(--cursor-interactive)}@media(hover:hover){.range-calendar__nav-button:hover,.range-calendar__nav-button[data-hovered=true]{background-color:var(--default);color:var(--accent-soft-foreground)}}.range-calendar__nav-button:active,.range-calendar__nav-button[data-pressed=true]{transform:scale(.95)}.range-calendar__nav-button:focus-visible,.range-calendar__nav-button[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.range-calendar__nav-button:disabled,.range-calendar__nav-button[data-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.range-calendar__nav-button-icon{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.range-calendar__grid{grid-template-columns:repeat(7,1fr);width:100%;display:grid}.range-calendar__grid[aria-readonly=true] .range-calendar__cell{pointer-events:none}.range-calendar__grid-header,.range-calendar__grid-header>tr,.range-calendar__grid-body,.range-calendar__grid-body>tr{display:contents}.range-calendar__grid-body>tr:first-child>td{margin-top:var(--spacing)}.range-calendar__grid-row{display:contents}.range-calendar__header-cell{padding-bottom:calc(var(--spacing) * 2);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--muted);justify-content:center;align-items:center;display:flex}.range-calendar__cell{z-index:1;border-radius:calc(var(--radius) * 3);--tw-outline-style:none;cursor:var(--cursor-interactive);will-change:background-color,border-color;transition:box-shadow .1s var(--ease-out),border-color .1s var(--ease-out);transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);outline-style:none;margin-block:2px;margin-inline:0;padding:0;position:relative}.range-calendar__cell:is([data-reduce-motion=true],[data-reduce-motion=true] *),.range-calendar__cell:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.range-calendar__cell:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.range-calendar__cell:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.range-calendar__cell:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.range-calendar__cell:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.range-calendar__cell .range-calendar__cell-button{aspect-ratio:1;border-radius:calc(var(--radius) * 3);width:100%;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--foreground);-webkit-tap-highlight-color:transparent;will-change:scale;transition:scale .2s var(--ease-out);transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);justify-content:center;align-items:center;display:flex}.range-calendar__cell .range-calendar__cell-button:is([data-reduce-motion=true],[data-reduce-motion=true] *),.range-calendar__cell .range-calendar__cell-button:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.range-calendar__cell .range-calendar__cell-button:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.range-calendar__cell .range-calendar__cell-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.range-calendar__cell .range-calendar__cell-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.range-calendar__cell .range-calendar__cell-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.range-calendar__cell:focus-visible:not(:focus),.range-calendar__cell[data-focus-visible=true]{z-index:2}:is(.range-calendar__cell:focus-visible:not(:focus),.range-calendar__cell[data-focus-visible=true]) .range-calendar__cell-button{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.range-calendar__cell[data-today=true] .range-calendar__cell-button{background-color:var(--accent-soft);color:var(--accent-soft-foreground)}@media(hover:hover){:is(.range-calendar__cell[data-today=true]:hover:not([data-selected=true]),.range-calendar__cell[data-today=true][data-hovered=true]:not([data-selected=true])) .range-calendar__cell-button{background-color:var(--accent-soft-hover)}}.range-calendar__cell[data-selected=true]:not([data-outside-month=true]){background-color:var(--accent-soft);border-radius:0}.range-calendar__cell[data-selected=true]:is(td:first-child>*,[aria-disabled]+td>*){border-start-start-radius:calc(var(--radius) * 1);border-end-start-radius:calc(var(--radius) * 1)}.range-calendar__cell[data-selected=true]:is(td:first-child>*,[aria-disabled]+td>*)[data-selection-start=true]{border-start-start-radius:calc(var(--radius) * 3);border-end-start-radius:calc(var(--radius) * 3)}.range-calendar__cell[data-selected=true]:is(td:last-child>*,td:has(+[aria-disabled])>*){border-start-end-radius:calc(var(--radius) * 1);border-end-end-radius:calc(var(--radius) * 1)}.range-calendar__cell[data-selected=true]:is(td:last-child>*,td:has(+[aria-disabled])>*)[data-selection-end=true]{border-start-end-radius:calc(var(--radius) * 3);border-end-end-radius:calc(var(--radius) * 3)}.range-calendar__cell[data-selection-start=true]:not([data-outside-month=true]),.range-calendar__cell[data-selection-end=true]:not([data-outside-month=true]){z-index:2}:is(.range-calendar__cell[data-selection-start=true]:not([data-outside-month=true]),.range-calendar__cell[data-selection-end=true]:not([data-outside-month=true])) .range-calendar__cell-button{background-color:var(--accent);color:var(--accent-foreground)}.range-calendar__cell[data-selection-start=true]:not([data-outside-month=true]){border-top-left-radius:calc(var(--radius) * 3);border-bottom-left-radius:calc(var(--radius) * 3)}.range-calendar__cell[data-selection-end=true]:not([data-outside-month=true]){border-top-right-radius:calc(var(--radius) * 3);border-bottom-right-radius:calc(var(--radius) * 3)}:is(.range-calendar__cell:active,.range-calendar__cell[data-pressed=true]) .range-calendar__cell-button{scale:.9}:is(:is(.range-calendar__cell:active,.range-calendar__cell[data-pressed=true])[data-selection-start=true],:is(.range-calendar__cell:active,.range-calendar__cell[data-pressed=true])[data-selection-end=true]) .range-calendar__cell-button{background-color:var(--accent-hover)}@media(hover:hover){:is(.range-calendar__cell:hover:not([data-selected=true]),.range-calendar__cell[data-hovered=true]:not([data-selected=true])) .range-calendar__cell-button{background-color:var(--default)}}.range-calendar__cell[data-outside-month=true]{color:var(--muted);opacity:.5}.range-calendar__cell[data-selected=true][data-outside-month=true]:not([data-selection-start=true],[data-selection-end=true]){background-color:var(--default)}@supports (color:color-mix(in lab,red,red)){.range-calendar__cell[data-selected=true][data-outside-month=true]:not([data-selection-start=true],[data-selection-end=true]){background-color:color-mix(in oklab,var(--default) 20%,transparent)}}.range-calendar__cell[data-unavailable=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.range-calendar__cell:disabled:not([data-outside-month=true]),.range-calendar__cell[data-disabled=true]:not([data-outside-month=true]){opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none;text-decoration:line-through}.range-calendar__grid-body td:has(>.range-calendar__cell[data-outside-month=true])+td>.range-calendar__cell[data-selected=true]{border-start-start-radius:calc(var(--radius) * 1);border-end-start-radius:calc(var(--radius) * 1)}.range-calendar__grid-body td:has(>.range-calendar__cell[data-outside-month=true])+td>.range-calendar__cell[data-selected=true][data-outside-month=true],.range-calendar__grid-body td:has(>.range-calendar__cell[data-outside-month=true])+td>.range-calendar__cell[data-selected=true][data-selection-start=true]{border-start-start-radius:calc(var(--radius) * 3);border-end-start-radius:calc(var(--radius) * 3)}.range-calendar__grid-body td:has(>.range-calendar__cell[data-selected=true]):has(+td>.range-calendar__cell[data-outside-month=true])>.range-calendar__cell[data-selected=true]{border-start-end-radius:calc(var(--radius) * 1);border-end-end-radius:calc(var(--radius) * 1)}.range-calendar__grid-body td:has(>.range-calendar__cell[data-selected=true]):has(+td>.range-calendar__cell[data-outside-month=true])>.range-calendar__cell[data-selected=true][data-outside-month=true],.range-calendar__grid-body td:has(>.range-calendar__cell[data-selected=true]):has(+td>.range-calendar__cell[data-outside-month=true])>.range-calendar__cell[data-selected=true][data-selection-end=true]{border-start-end-radius:calc(var(--radius) * 3);border-end-end-radius:calc(var(--radius) * 3)}.range-calendar__cell-indicator{bottom:var(--spacing);--tw-translate-x: -50% ;width:3px;height:3px;translate:var(--tw-translate-x) var(--tw-translate-y);border-radius:calc(var(--radius) * .25);background-color:var(--muted);position:absolute;left:50%}[data-selected=true]>.range-calendar__cell-indicator{background-color:var(--accent-foreground)}.calendar:has(.calendar-year-picker__year-grid),.range-calendar:has(.calendar-year-picker__year-grid){position:relative}.calendar:has(.calendar-year-picker__year-grid)>[data-slot=calendar-grid],.range-calendar:has(.calendar-year-picker__year-grid)>[data-slot=range-calendar-grid]{will-change:opacity;transition:opacity .15s var(--ease-out),visibility 0s linear}:is(.calendar:has(.calendar-year-picker__year-grid)>[data-slot=calendar-grid],.range-calendar:has(.calendar-year-picker__year-grid)>[data-slot=range-calendar-grid]):is([data-reduce-motion=true],[data-reduce-motion=true] *),:is(.calendar:has(.calendar-year-picker__year-grid)>[data-slot=calendar-grid],.range-calendar:has(.calendar-year-picker__year-grid)>[data-slot=range-calendar-grid]):is([data-reduce-motion=true],[data-reduce-motion=true] *):before,:is(.calendar:has(.calendar-year-picker__year-grid)>[data-slot=calendar-grid],.range-calendar:has(.calendar-year-picker__year-grid)>[data-slot=range-calendar-grid]):is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){:is(.calendar:has(.calendar-year-picker__year-grid)>[data-slot=calendar-grid],.range-calendar:has(.calendar-year-picker__year-grid)>[data-slot=range-calendar-grid]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),:is(.calendar:has(.calendar-year-picker__year-grid)>[data-slot=calendar-grid],.range-calendar:has(.calendar-year-picker__year-grid)>[data-slot=range-calendar-grid]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,:is(.calendar:has(.calendar-year-picker__year-grid)>[data-slot=calendar-grid],.range-calendar:has(.calendar-year-picker__year-grid)>[data-slot=range-calendar-grid]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.calendar:has(.calendar-year-picker__year-grid[data-open=true])>[data-slot=calendar-grid],.range-calendar:has(.calendar-year-picker__year-grid[data-open=true])>[data-slot=range-calendar-grid]{pointer-events:none;opacity:0;visibility:hidden;transition:opacity .15s var(--ease-out),visibility 0s linear .15s}:is(.calendar:has(.calendar-year-picker__year-grid[data-open=true])>[data-slot=calendar-grid],.range-calendar:has(.calendar-year-picker__year-grid[data-open=true])>[data-slot=range-calendar-grid]):is([data-reduce-motion=true],[data-reduce-motion=true] *),:is(.calendar:has(.calendar-year-picker__year-grid[data-open=true])>[data-slot=calendar-grid],.range-calendar:has(.calendar-year-picker__year-grid[data-open=true])>[data-slot=range-calendar-grid]):is([data-reduce-motion=true],[data-reduce-motion=true] *):before,:is(.calendar:has(.calendar-year-picker__year-grid[data-open=true])>[data-slot=calendar-grid],.range-calendar:has(.calendar-year-picker__year-grid[data-open=true])>[data-slot=range-calendar-grid]):is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){:is(.calendar:has(.calendar-year-picker__year-grid[data-open=true])>[data-slot=calendar-grid],.range-calendar:has(.calendar-year-picker__year-grid[data-open=true])>[data-slot=range-calendar-grid]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),:is(.calendar:has(.calendar-year-picker__year-grid[data-open=true])>[data-slot=calendar-grid],.range-calendar:has(.calendar-year-picker__year-grid[data-open=true])>[data-slot=range-calendar-grid]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,:is(.calendar:has(.calendar-year-picker__year-grid[data-open=true])>[data-slot=calendar-grid],.range-calendar:has(.calendar-year-picker__year-grid[data-open=true])>[data-slot=range-calendar-grid]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.calendar-year-picker__trigger{justify-content:flex-start;align-items:center;gap:var(--spacing);border-radius:calc(var(--radius) * 1);--tw-outline-style:none;cursor:var(--cursor-interactive);touch-action:manipulation;outline-style:none;flex:1;display:flex}.calendar-year-picker__trigger: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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.calendar-year-picker__trigger-heading{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);transition:color .15s var(--ease-out)}.calendar-year-picker__trigger-heading:is([data-reduce-motion=true],[data-reduce-motion=true] *),.calendar-year-picker__trigger-heading:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.calendar-year-picker__trigger-heading:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.calendar-year-picker__trigger-heading:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.calendar-year-picker__trigger-heading:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.calendar-year-picker__trigger-heading:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.calendar-year-picker__trigger-indicator{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--accent-soft-foreground);transition:transform .15s var(--ease-out)}.calendar-year-picker__trigger-indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *),.calendar-year-picker__trigger-indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.calendar-year-picker__trigger-indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.calendar-year-picker__trigger-indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.calendar-year-picker__trigger-indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.calendar-year-picker__trigger-indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.calendar-year-picker__trigger[data-open=true] .calendar-year-picker__trigger-indicator{transform:rotate(90deg)}.calendar-year-picker__trigger[data-open=true] .calendar-year-picker__trigger-heading{color:var(--accent-soft-foreground)}.calendar-year-picker__year-grid{pointer-events:none;scrollbar-width:var(--scrollbar-width);scrollbar-color:var(--scrollbar-color);scrollbar-gutter:var(--scrollbar-gutter);align-content:flex-start;gap:var(--spacing);padding:var(--spacing);opacity:0;will-change:opacity;grid-template-columns:repeat(3,1fr);display:grid;position:absolute;left:0;right:0;overflow-y:auto}.calendar-year-picker__year-grid[data-open=true]{pointer-events:auto;opacity:1;transition:opacity .2s var(--ease-out) 50ms}.calendar-year-picker__year-grid[data-open=true]:is([data-reduce-motion=true],[data-reduce-motion=true] *),.calendar-year-picker__year-grid[data-open=true]:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.calendar-year-picker__year-grid[data-open=true]:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.calendar-year-picker__year-grid[data-open=true]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.calendar-year-picker__year-grid[data-open=true]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.calendar-year-picker__year-grid[data-open=true]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.calendar-year-picker__year-cell{height:calc(var(--spacing) * 8);border-radius:calc(var(--radius) * 3);padding-inline:calc(var(--spacing) * 2.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);--tw-outline-style:none;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;touch-action:manipulation;transition:color .1s var(--ease-smooth),scale .1s var(--ease-smooth),opacity .1s var(--ease-smooth),background-color .1s var(--ease-smooth),box-shadow .1s var(--ease-out);transform-origin:50%;transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);outline-style:none;justify-content:center;align-items:center;display:inline-flex;position:relative}.calendar-year-picker__year-cell:is([data-reduce-motion=true],[data-reduce-motion=true] *),.calendar-year-picker__year-cell:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.calendar-year-picker__year-cell:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.calendar-year-picker__year-cell:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.calendar-year-picker__year-cell:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.calendar-year-picker__year-cell:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.calendar-year-picker__year-cell{cursor:var(--cursor-interactive)}@media(hover:hover)and (pointer:fine){.calendar-year-picker__year-cell:is(:hover,[data-hovered=true]):not([data-selected=true]){background-color:var(--default);color:var(--default-foreground)}}.calendar-year-picker__year-cell[data-selected=true],.calendar-year-picker__year-cell[aria-selected=true]{background-color:var(--accent);color:var(--accent-foreground)}@media(hover:hover)and (pointer:fine){:is(.calendar-year-picker__year-cell[data-selected=true],.calendar-year-picker__year-cell[aria-selected=true]):is(:hover,[data-hovered=true]){background-color:var(--accent-hover)}}.calendar-year-picker__year-cell: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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.date-field{gap:var(--spacing);flex-direction:column;display:flex}:is(.date-field[data-invalid=true],.date-field[aria-invalid=true]) [data-slot=description]{display:none}.date-field [data-slot=label]{width:fit-content}.date-field--full-width{width:100%}.time-field{gap:var(--spacing);flex-direction:column;display:flex}:is(.time-field[data-invalid=true],.time-field[aria-invalid=true]) [data-slot=description]{display:none}.time-field [data-slot=label]{width:fit-content}.time-field--full-width{width:100%}.date-input-group{height:calc(var(--spacing) * 9);border-radius:var(--field-radius,calc(var(--radius) * 1.5));border-style:var(--tw-border-style);background-color:var(--field-background,var(--default));font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--field-foreground,var(--foreground));--tw-shadow:var(--field-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;border-width:1px;border-width:var(--border-width-field);border-color:var(--field-border);transition:background-color .15s var(--ease-smooth),border-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out);outline-style:none;align-items:center;display:inline-flex;overflow:hidden}.date-input-group:is([data-reduce-motion=true],[data-reduce-motion=true] *),.date-input-group:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.date-input-group:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.date-input-group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.date-input-group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.date-input-group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}@media(hover:hover){.date-input-group:hover:not(:focus-within),.date-input-group[data-hovered=true]:not([data-focus-within=true]){background-color:var(--field-hover);border-color:var(--field-border-hover)}}.date-input-group[data-focus-within=true]:not(:has([data-slot=date-picker-trigger]:focus,[data-slot=date-picker-trigger][data-focused=true],[data-slot=date-range-picker-trigger]:focus,[data-slot=date-range-picker-trigger][data-focused=true])),.date-input-group:focus-within:not(:has([data-slot=date-picker-trigger]:focus,[data-slot=date-picker-trigger][data-focused=true],[data-slot=date-range-picker-trigger]:focus,[data-slot=date-range-picker-trigger][data-focused=true])){--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);--tw-ring-color:var(--focus);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;--tw-ring-offset-width:0px;outline-style:none}.date-input-group[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.date-input-group[data-invalid=true]:focus,.date-input-group[data-invalid=true]:focus-visible,.date-input-group[data-invalid=true][data-focused=true],.date-input-group[data-invalid=true][data-focus-visible=true],.date-input-group[data-invalid=true]:focus-within,.date-input-group[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.date-input-group[data-invalid=true]{background-color:var(--field-focus);border-color:var(--color-field-border-invalid)}.date-input-group[data-disabled=true],.date-input-group[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.date-input-group__input{cursor:text;border-style:var(--tw-border-style);padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;background-color:#0000;border-width:0;border-radius:0;outline-style:none;flex:1;align-items:center;gap:1px;display:flex}@media(min-width:40rem){.date-input-group__input{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.date-input-group:has([data-slot=date-input-group-prefix]) .date-input-group__input{padding-left:calc(var(--spacing) * 2);border-top-left-radius:0;border-bottom-left-radius:0}.date-input-group:has([data-slot=date-input-group-suffix]) .date-input-group__input{padding-right:calc(var(--spacing) * 2);border-top-right-radius:0;border-bottom-right-radius:0}.date-input-group:has(.date-range-picker__range-separator) .date-input-group__input[slot=start]{flex:none;padding-right:0}.date-input-group:has(.date-range-picker__range-separator) .date-input-group__input[slot=end]{padding-left:0}.date-input-group__input:focus,.date-input-group__input:focus-visible{--tw-outline-style:none;outline-style:none}.date-input-group__input-container{scrollbar-color:auto;scrollbar-gutter:auto;-ms-overflow-style:none;scrollbar-width:none;flex:1;align-items:center;width:fit-content;display:flex;overflow:auto clip}.date-input-group__segment{border-radius:calc(var(--radius) * .75);padding-inline:calc(var(--spacing) * .5);text-align:end;text-wrap:nowrap;--tw-outline-style:none;outline-style:none;display:inline-block}.date-input-group__segment[data-type=literal]{color:var(--muted);padding:0}.date-input-group__segment[data-placeholder=true]{color:var(--field-placeholder,var(--muted))}.date-input-group__segment:focus,.date-input-group__segment[data-focused=true]{background-color:var(--accent-soft);color:var(--accent-soft-foreground)}.date-input-group__segment[data-disabled=true]{opacity:.5}.date-input-group__segment[data-invalid=true]{color:var(--danger)}.date-input-group__segment[data-invalid=true]:focus,.date-input-group__segment[data-invalid=true][data-focused=true]{background-color:var(--danger-soft);color:var(--danger-soft-foreground)}.date-input-group__prefix{pointer-events:none;color:var(--field-placeholder,var(--muted));margin-right:0;margin-left:calc(var(--spacing) * 3);flex-shrink:0;align-items:center;display:flex}.date-input-group__suffix{pointer-events:none;color:var(--field-placeholder,var(--muted));margin-right:calc(var(--spacing) * 3);flex-shrink:0;align-items:center;display:flex}.date-input-group--secondary{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:var(--date-input-group-bg);--date-input-group-bg:var(--default);--date-input-group-bg-hover:var(--default-hover);--date-input-group-bg-focus:var(--default)}@media(hover:hover){.date-input-group--secondary:hover:not(:focus-within),.date-input-group--secondary[data-hovered=true]:not([data-focus-within=true]){background-color:var(--date-input-group-bg-hover)}}.date-input-group--secondary:focus-within,.date-input-group--secondary[data-focus-within=true]{background-color:var(--date-input-group-bg-focus)}.date-input-group--secondary[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.date-input-group--secondary[data-invalid=true]:focus,.date-input-group--secondary[data-invalid=true]:focus-visible,.date-input-group--secondary[data-invalid=true][data-focused=true],.date-input-group--secondary[data-invalid=true][data-focus-visible=true],.date-input-group--secondary[data-invalid=true]:focus-within,.date-input-group--secondary[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.date-input-group--secondary[data-invalid=true]{border-color:var(--color-field-border-invalid);background-color:var(--date-input-group-bg-focus)}.date-input-group--secondary [data-slot=date-input-group-input]{background-color:#0000}.date-input-group--full-width{width:100%}.date-picker{gap:var(--spacing);flex-direction:column;display:inline-flex}.date-picker .date-input-group__suffix,.date-picker .date-input-group__prefix{pointer-events:auto}.date-picker__trigger{border-radius:var(--field-radius,calc(var(--radius) * 1.5));width:100%;padding:var(--spacing);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));-webkit-tap-highlight-color:transparent;cursor:var(--cursor-interactive);transition:box-shadow .15s var(--ease-out);align-items:center;display:inline-flex}.date-picker__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *),.date-picker__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.date-picker__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.date-picker__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.date-picker__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.date-picker__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.date-picker__trigger:focus-visible:not(:focus),.date-picker__trigger[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.date-picker__trigger:disabled,.date-picker__trigger[data-disabled=true],.date-picker__trigger[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.date-picker__trigger-indicator{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);color:var(--field-placeholder,var(--muted));justify-content:center;align-items:center;display:inline-flex}.date-picker__popover{min-width:var(--trigger-width);transform-origin:var(--trigger-anchor-point);scrollbar-color:auto;scrollbar-gutter:auto;-ms-overflow-style:none;scrollbar-width:none;overscroll-behavior:contain;background-color:var(--overlay);padding:calc(var(--spacing) * 3);overflow-y:auto}.date-picker__popover:is([data-reduce-motion=true],[data-reduce-motion=true] *),.date-picker__popover:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.date-picker__popover:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.date-picker__popover:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.date-picker__popover:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.date-picker__popover:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.date-picker__popover{box-shadow:var(--shadow-overlay);border-radius:min(32px,calc(var(--radius) * 2.5))}.date-picker__popover:focus-visible:not(:focus),.date-picker__popover[data-focus-visible=true]{--tw-outline-style:none;outline-style:none}.date-picker__popover[data-entering=true]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.15s;--tw-ease:ease;--tw-enter-opacity:0;--tw-enter-scale:.95;transition-duration:.15s;transition-timing-function:ease}.date-picker__popover[data-entering=true][data-placement^=top]{--tw-enter-translate-y:calc(1*var(--spacing))}.date-picker__popover[data-entering=true][data-placement^=bottom]{--tw-enter-translate-y:calc(1*var(--spacing)*-1)}.date-picker__popover[data-entering=true][data-placement^=left]{--tw-enter-translate-x:calc(1*var(--spacing))}.date-picker__popover[data-entering=true][data-placement^=right]{--tw-enter-translate-x:calc(1*var(--spacing)*-1)}.date-picker__popover[data-exiting=true]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.1s;--tw-ease:ease;--tw-exit-scale:.95;--tw-exit-opacity:0;transition-duration:.1s;transition-timing-function:ease}.date-picker__popover[data-exiting=true],.date-picker__popover[data-entering=true]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));will-change:opacity,transform}.date-range-picker{gap:var(--spacing);flex-direction:column;display:inline-flex}.date-range-picker .date-input-group__suffix,.date-range-picker .date-input-group__prefix{pointer-events:auto}.date-range-picker__trigger{border-radius:var(--field-radius,calc(var(--radius) * 1.5));width:100%;padding:var(--spacing);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));-webkit-tap-highlight-color:transparent;cursor:var(--cursor-interactive);transition:box-shadow .15s var(--ease-out);align-items:center;display:inline-flex}.date-range-picker__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *),.date-range-picker__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.date-range-picker__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.date-range-picker__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.date-range-picker__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.date-range-picker__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.date-range-picker__trigger:focus-visible:not(:focus),.date-range-picker__trigger[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.date-range-picker__trigger:disabled,.date-range-picker__trigger[data-disabled=true],.date-range-picker__trigger[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.date-range-picker__trigger-indicator{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);color:var(--field-placeholder,var(--muted));justify-content:center;align-items:center;display:inline-flex}.date-range-picker__range-separator{padding-inline:var(--spacing);color:var(--field-placeholder,var(--muted));-webkit-user-select:none;user-select:none}.date-range-picker__popover{min-width:var(--trigger-width);transform-origin:var(--trigger-anchor-point);scrollbar-color:auto;scrollbar-gutter:auto;-ms-overflow-style:none;scrollbar-width:none;overscroll-behavior:contain;background-color:var(--overlay);padding:calc(var(--spacing) * 3);overflow-y:auto}.date-range-picker__popover:is([data-reduce-motion=true],[data-reduce-motion=true] *),.date-range-picker__popover:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.date-range-picker__popover:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.date-range-picker__popover:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.date-range-picker__popover:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.date-range-picker__popover:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.date-range-picker__popover{box-shadow:var(--shadow-overlay);border-radius:min(32px,calc(var(--radius) * 2.5))}.date-range-picker__popover:focus-visible:not(:focus),.date-range-picker__popover[data-focus-visible=true]{--tw-outline-style:none;outline-style:none}.date-range-picker__popover[data-entering=true]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.15s;--tw-ease:ease;--tw-enter-opacity:0;--tw-enter-scale:.95;transition-duration:.15s;transition-timing-function:ease}.date-range-picker__popover[data-entering=true][data-placement^=top]{--tw-enter-translate-y:calc(1*var(--spacing))}.date-range-picker__popover[data-entering=true][data-placement^=bottom]{--tw-enter-translate-y:calc(1*var(--spacing)*-1)}.date-range-picker__popover[data-entering=true][data-placement^=left]{--tw-enter-translate-x:calc(1*var(--spacing))}.date-range-picker__popover[data-entering=true][data-placement^=right]{--tw-enter-translate-x:calc(1*var(--spacing)*-1)}.date-range-picker__popover[data-exiting=true]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.1s;--tw-ease:ease;--tw-exit-scale:.95;--tw-exit-opacity:0;transition-duration:.1s;transition-timing-function:ease}.date-range-picker__popover[data-exiting=true],.date-range-picker__popover[data-entering=true]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));will-change:opacity,transform}.card{gap:calc(var(--spacing) * 3);padding:calc(var(--spacing) * 4);--tw-shadow:var(--surface-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-radius:min(32px,var(--radius-3xl));flex-direction:column;display:flex;position:relative;overflow:visible}.card__header{flex-direction:column;display:flex}.card__title{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--foreground)}.card__description{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5);color:var(--muted)}.card__content{gap:var(--spacing);flex-direction:column;flex:1;display:flex}.card__footer{flex-direction:row;align-items:center;display:flex}.card--transparent{--tw-border-style:none;--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:#0000;border-style:none}.card--default{background-color:var(--surface)}.card--secondary{background-color:var(--surface-secondary)}.card--tertiary{background-color:var(--surface-tertiary)}.header{width:100%;padding-inline:calc(var(--spacing) * 2);padding-top:calc(var(--spacing) * 1.5);padding-bottom:var(--spacing);text-align:left;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--muted)}.separator{border-radius:calc(var(--radius) * .5);border-top-style:var(--tw-border-style);border-top-width:0;border-bottom-style:var(--tw-border-style);background-color:var(--separator);border-bottom-width:0;flex-shrink:0;width:100%;height:1px}.separator--horizontal{width:100%;height:1px}.separator--vertical{height:auto;min-height:calc(var(--spacing) * 2);align-self:stretch;width:1px}.separator--default{background-color:var(--separator)}.separator--secondary{background-color:var(--separator-secondary)}.separator--tertiary{background-color:var(--separator-tertiary)}.separator__container{align-items:center;gap:calc(var(--spacing) * 3);display:flex}.separator__container--horizontal{flex-direction:row;width:100%}.separator__container--vertical{flex-direction:column;justify-content:center;height:100%}.separator__line{flex-grow:1;flex-shrink:0}.separator__content{text-align:center;white-space:nowrap;color:var(--muted);justify-content:center;align-items:center;display:inline-flex}.separator__content--horizontal,.separator__content--vertical{text-align:center}.surface{color:var(--foreground);position:relative}.surface--transparent{background-color:#0000}.surface--default{background-color:var(--surface);color:var(--surface-foreground)}.surface--secondary{background-color:var(--surface-secondary);color:var(--surface-secondary-foreground)}.surface--tertiary{background-color:var(--surface-tertiary);color:var(--surface-tertiary-foreground)}.avatar{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10);border-radius:calc(var(--radius) * 3);background-color:var(--default);flex-shrink:0;justify-content:center;align-items:center;display:flex;position:relative;overflow:hidden}.avatar__fallback{background-color:var(--default);width:100%;height:100%;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);justify-content:center;align-items:center;display:flex}.avatar__image{aspect-ratio:1;width:100%;height:100%;transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.25s;transition-duration:.25s;position:absolute;top:0;right:0;bottom:0;left:0}.avatar__image:is([data-reduce-motion=true],[data-reduce-motion=true] *),.avatar__image:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.avatar__image:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.avatar__image:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.avatar__image:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.avatar__image:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.avatar--sm{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8);border-radius:calc(var(--radius) * 2)}.avatar--lg{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12);border-radius:calc(var(--radius) * 3)}.avatar--lg .avatar__fallback{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.avatar__fallback--accent{color:var(--accent-soft-foreground)}.avatar__fallback--default{color:var(--default-soft-foreground)}.avatar__fallback--success{color:var(--success-soft-foreground)}.avatar__fallback--warning{color:var(--warning-soft-foreground)}.avatar__fallback--danger{color:var(--danger-soft-foreground)}.avatar--soft{background-color:#0000}.avatar--soft .avatar__fallback--accent{background-color:var(--accent-soft);color:var(--accent-soft-foreground)}.avatar--soft .avatar__fallback--success{background-color:var(--success-soft);color:var(--success-soft-foreground)}.avatar--soft .avatar__fallback--warning{background-color:var(--warning-soft);color:var(--warning-soft-foreground)}.avatar--soft .avatar__fallback--default{background-color:var(--default-soft);color:var(--default-soft-foreground)}.avatar--soft .avatar__fallback--danger{background-color:var(--danger-soft);color:var(--danger-soft-foreground)}.alert-dialog__trigger{cursor:var(--cursor-interactive);transition:transform .25s var(--ease-out-quart),background-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out);display:inline-block}.alert-dialog__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *),.alert-dialog__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.alert-dialog__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.alert-dialog__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.alert-dialog__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.alert-dialog__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.alert-dialog__trigger:focus-visible:not(:focus),.alert-dialog__trigger[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.alert-dialog__trigger:disabled,.alert-dialog__trigger[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.alert-dialog__trigger:active,.alert-dialog__trigger[data-pressed=true]{transform:scale(.97)}.alert-dialog__backdrop{z-index:50;height:var(--visual-viewport-height);flex-direction:row;justify-content:center;align-items:center;width:100%;display:flex;position:fixed;top:0;right:0;bottom:0;left:0}.alert-dialog__backdrop[data-entering=true]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.15s;--tw-ease:var(--ease-out);transition-duration:.15s;transition-timing-function:var(--ease-out);--tw-enter-opacity:0}.alert-dialog__backdrop[data-exiting=true]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.1s;--tw-ease:var(--ease-out);transition-duration:.1s;transition-timing-function:var(--ease-out);--tw-exit-opacity:0}.alert-dialog__backdrop[data-exiting=true],.alert-dialog__backdrop[data-entering=true]{will-change:opacity}:is(.alert-dialog__backdrop[data-exiting=true],.alert-dialog__backdrop[data-entering=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *),:is(.alert-dialog__backdrop[data-exiting=true],.alert-dialog__backdrop[data-entering=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *):before,:is(.alert-dialog__backdrop[data-exiting=true],.alert-dialog__backdrop[data-entering=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *):after{animation:none}@media(prefers-reduced-motion:reduce){:is(.alert-dialog__backdrop[data-exiting=true],.alert-dialog__backdrop[data-entering=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),:is(.alert-dialog__backdrop[data-exiting=true],.alert-dialog__backdrop[data-entering=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,:is(.alert-dialog__backdrop[data-exiting=true],.alert-dialog__backdrop[data-entering=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{animation:none}}.alert-dialog__backdrop--transparent{background-color:#0000}.alert-dialog__backdrop--opaque{background-color:var(--backdrop)}.alert-dialog__backdrop--blur{background-color:var(--backdrop);--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.alert-dialog__container{height:var(--visual-viewport-height);width:100%;min-width:0;padding:calc(var(--spacing) * 4);flex-direction:column;flex:1;align-items:center;display:flex}@media(min-width:40rem){.alert-dialog__container{width:fit-content;padding:calc(var(--spacing) * 10)}}.alert-dialog__container{pointer-events:none}.alert-dialog__container[data-entering=true]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.25s;--tw-ease:cubic-bezier(.25, .46, .45, .94);--tw-enter-opacity:0;--tw-enter-scale: 105% ;transition-duration:.25s;transition-timing-function:cubic-bezier(.25,.46,.45,.94)}.alert-dialog__container[data-entering=true][data-placement=auto]{--tw-enter-translate-y:calc(1*var(--spacing))}@media(min-width:40rem){.alert-dialog__container[data-entering=true][data-placement=auto]{--tw-enter-translate-y: 0% }}.alert-dialog__container[data-entering=true][data-placement=top]{--tw-enter-translate-y:calc(1*var(--spacing)*-1)}.alert-dialog__container[data-entering=true][data-placement=center]{--tw-enter-translate-y: -0% }.alert-dialog__container[data-entering=true][data-placement=bottom]{--tw-enter-translate-y:calc(1*var(--spacing))}.alert-dialog__container[data-exiting=true]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.1s;--tw-ease:cubic-bezier(.25, .46, .45, .94);--tw-exit-opacity:0;--tw-exit-scale:.95;transition-duration:.1s;transition-timing-function:cubic-bezier(.25,.46,.45,.94)}.alert-dialog__container[data-exiting=true],.alert-dialog__container[data-entering=true]{will-change:opacity,transform}:is(.alert-dialog__container[data-exiting=true],.alert-dialog__container[data-entering=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *),:is(.alert-dialog__container[data-exiting=true],.alert-dialog__container[data-entering=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *):before,:is(.alert-dialog__container[data-exiting=true],.alert-dialog__container[data-entering=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *):after{animation:none}@media(prefers-reduced-motion:reduce){:is(.alert-dialog__container[data-exiting=true],.alert-dialog__container[data-entering=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),:is(.alert-dialog__container[data-exiting=true],.alert-dialog__container[data-entering=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,:is(.alert-dialog__container[data-exiting=true],.alert-dialog__container[data-entering=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{animation:none}}.alert-dialog__dialog{background-color:var(--overlay);--tw-shadow:var(--overlay-shadow);width:100%;min-height:0;max-height:100%;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;border-radius:min(32px,var(--radius-3xl));padding:calc(var(--spacing) * 6);pointer-events:auto;outline-style:none;flex-direction:column;display:flex;position:relative;overflow:clip}.alert-dialog__dialog[data-placement=auto]{margin-top:auto}@media(min-width:40rem){.alert-dialog__dialog[data-placement=auto]{margin-block:auto}}.alert-dialog__dialog[data-placement=center]{margin-block:auto}.alert-dialog__dialog[data-placement=bottom]{margin-top:auto}.alert-dialog__dialog[data-placement=top]{margin-top:0}.alert-dialog__dialog--xs{max-width:var(--container-xs)}.alert-dialog__dialog--sm{max-width:var(--container-sm)}.alert-dialog__dialog--md{max-width:var(--container-md)}.alert-dialog__dialog--lg{max-width:var(--container-lg)}.alert-dialog__dialog--cover{width:100%;height:100%;min-height:100%}.alert-dialog__header{gap:calc(var(--spacing) * 3);flex-direction:column;margin-bottom:0;display:flex}.alert-dialog__header>.modal__icon{margin-bottom:0}.alert-dialog__heading{vertical-align:middle;font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--foreground)}.alert-dialog__icon{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10);border-radius:calc(var(--radius) * 3);-webkit-user-select:none;user-select:none;flex-shrink:0;justify-content:center;align-items:center;display:flex}.alert-dialog__icon [data-slot=alert-dialog-default-icon]{box-sizing:content-box;width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.alert-dialog__icon--default{background-color:var(--default);color:var(--foreground)}.alert-dialog__icon--accent{background-color:var(--accent-soft);color:var(--accent-soft-foreground)}.alert-dialog__icon--success{background-color:var(--success-soft);color:var(--success-soft-foreground)}.alert-dialog__icon--warning{background-color:var(--warning-soft);color:var(--warning-soft-foreground)}.alert-dialog__icon--danger{background-color:var(--danger-soft);color:var(--danger-soft-foreground)}.alert-dialog__body{scrollbar-width:var(--scrollbar-width);scrollbar-color:var(--scrollbar-color);scrollbar-gutter:var(--scrollbar-gutter);min-height:0;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:1.43;color:var(--muted);overscroll-behavior:contain;-webkit-overflow-scrolling:touch;margin:-3px;flex:1;margin-block:0;padding:3px;line-height:1.43;overflow-y:auto}.alert-dialog__footer{justify-content:flex-end;align-items:center;gap:calc(var(--spacing) * 2);flex-direction:row;margin-top:0;display:flex}.alert-dialog__close-trigger{top:calc(var(--spacing) * 4);right:calc(var(--spacing) * 4);position:absolute}.alert-dialog__header+.alert-dialog__body{margin-top:calc(var(--spacing) * 2)}.alert-dialog__header+.alert-dialog__footer,.alert-dialog__body+.alert-dialog__footer{margin-top:calc(var(--spacing) * 5)}.drawer__trigger{cursor:var(--cursor-interactive);transition:transform .25s var(--ease-out-quart),background-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out);display:inline-block}.drawer__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *),.drawer__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.drawer__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.drawer__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.drawer__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.drawer__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.drawer__trigger:focus-visible:not(:focus),.drawer__trigger[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.drawer__trigger:disabled,.drawer__trigger[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.drawer__trigger:active,.drawer__trigger[data-pressed=true]{transform:scale(.97)}.drawer__backdrop{z-index:50;height:var(--visual-viewport-height);opacity:1;width:100%;transition:opacity .25s cubic-bezier(.32,.72,0,1);position:fixed;top:0;right:0;bottom:0;left:0}.drawer__backdrop[data-entering=true]{opacity:0}.drawer__backdrop[data-exiting=true]{opacity:0;transition-duration:.2s;transition-timing-function:cubic-bezier(.32,.72,0,1)}.drawer__backdrop[data-exiting=true],.drawer__backdrop[data-entering=true]{will-change:opacity}@media(prefers-reduced-motion:reduce){.drawer__backdrop{transition:none}}.drawer__backdrop--transparent{background-color:#0000}.drawer__backdrop--opaque{background-color:var(--backdrop)}.drawer__backdrop--blur{background-color:var(--backdrop);--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.drawer__content{pointer-events:none;z-index:50;height:var(--visual-viewport-height);width:100%;min-width:0;display:flex;position:fixed;top:0;right:0;bottom:0;left:0}.drawer__content--bottom{align-items:flex-end}.drawer__content--top{align-items:flex-start}.drawer__content--left{justify-content:flex-start}.drawer__content--right{justify-content:flex-end}.drawer__dialog{background-color:var(--overlay);--tw-shadow:var(--overlay-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;padding:calc(var(--spacing) * 6);pointer-events:auto;--drawer-enter-duration:.25s;--drawer-exit-duration:.2s;--drawer-enter-ease:cubic-bezier(.32, .72, 0, 1);--drawer-exit-ease:cubic-bezier(.32, .72, 0, 1);will-change:translate;transition:translate var(--drawer-enter-duration) var(--drawer-enter-ease);outline-style:none;flex-direction:column;display:flex;position:relative}@media(prefers-reduced-motion:reduce){.drawer__dialog{transition:none}}.drawer__dialog[data-placement=bottom]{border-top-left-radius:min(32px,var(--radius-2xl));border-top-right-radius:min(32px,var(--radius-2xl));width:100%;max-height:85vh}.drawer__dialog[data-placement=top]{border-bottom-left-radius:min(32px,var(--radius-2xl));border-bottom-right-radius:min(32px,var(--radius-2xl));width:100%;max-height:85vh}.drawer__dialog[data-placement=left]{height:100%;width:calc(var(--spacing) * 80);border-radius:0;max-width:85vw}@media(min-width:40rem){.drawer__dialog[data-placement=left]{width:calc(var(--spacing) * 96)}}.drawer__dialog[data-placement=right]{height:100%;width:calc(var(--spacing) * 80);border-radius:0;max-width:85vw}@media(min-width:40rem){.drawer__dialog[data-placement=right]{width:calc(var(--spacing) * 96)}}[data-exiting=true] .drawer__dialog{transition-duration:var(--drawer-exit-duration);transition-timing-function:var(--drawer-exit-ease)}.drawer__content--left .drawer__dialog,.drawer__content--right .drawer__dialog,.drawer__content--top .drawer__dialog,.drawer__content--bottom .drawer__dialog{translate:0}.drawer__content--left[data-entering=true] .drawer__dialog,.drawer__content--left[data-exiting=true] .drawer__dialog{translate:-100%}.drawer__content--right[data-entering=true] .drawer__dialog,.drawer__content--right[data-exiting=true] .drawer__dialog{translate:100%}.drawer__content--top[data-entering=true] .drawer__dialog,.drawer__content--top[data-exiting=true] .drawer__dialog{translate:0 -100%}.drawer__content--bottom[data-entering=true] .drawer__dialog,.drawer__content--bottom[data-exiting=true] .drawer__dialog{translate:0 100%}.drawer__dialog--top{padding-bottom:calc(var(--spacing) * 2)}.drawer__dialog--top .drawer__handle{padding-bottom:0}.drawer__header{gap:calc(var(--spacing) * 3);flex-direction:column;margin-bottom:0;display:flex}.drawer__heading{vertical-align:middle;font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--foreground)}.drawer__body{scrollbar-width:var(--scrollbar-width);scrollbar-color:var(--scrollbar-color);scrollbar-gutter:var(--scrollbar-gutter);min-height:0;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:1.43;color:var(--muted);overscroll-behavior:contain;-webkit-overflow-scrolling:touch;margin:-3px;flex:1;margin-block:0;padding:3px;line-height:1.43;overflow-y:auto}.drawer__footer{justify-content:flex-end;align-items:center;gap:calc(var(--spacing) * 2);flex-direction:row;margin-top:0;display:flex}.drawer__handle{padding-bottom:calc(var(--spacing) * 2);justify-content:center;align-items:center;display:flex}.drawer__handle>[data-slot=drawer-handle-bar]{height:var(--spacing);width:calc(var(--spacing) * 9);border-radius:calc(var(--radius) * .25);background-color:var(--separator)}.drawer__close-trigger{top:calc(var(--spacing) * 4);right:calc(var(--spacing) * 4);position:absolute}.drawer__header+.drawer__body{margin-top:calc(var(--spacing) * 2)}.drawer__header+.drawer__footer,.drawer__body+.drawer__footer{margin-top:calc(var(--spacing) * 5)}.drawer__handle+.drawer__header,.drawer__handle+.drawer__body{margin-top:0}.modal__trigger{cursor:var(--cursor-interactive);transition:transform .25s var(--ease-out-quart),background-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out);display:inline-block}.modal__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *),.modal__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.modal__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.modal__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.modal__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.modal__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.modal__trigger:focus-visible:not(:focus),.modal__trigger[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.modal__trigger:disabled,.modal__trigger[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.modal__trigger:active,.modal__trigger[data-pressed=true]{transform:scale(.97)}.modal__backdrop{z-index:50;height:var(--visual-viewport-height);flex-direction:row;justify-content:center;align-items:center;width:100%;display:flex;position:fixed;top:0;right:0;bottom:0;left:0}.modal__backdrop[data-entering=true]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.15s;--tw-ease:var(--ease-out);transition-duration:.15s;transition-timing-function:var(--ease-out);--tw-enter-opacity:0}.modal__backdrop[data-exiting=true]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.1s;--tw-ease:var(--ease-out);transition-duration:.1s;transition-timing-function:var(--ease-out);--tw-exit-opacity:0}.modal__backdrop[data-exiting=true],.modal__backdrop[data-entering=true]{will-change:opacity}:is(.modal__backdrop[data-exiting=true],.modal__backdrop[data-entering=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *),:is(.modal__backdrop[data-exiting=true],.modal__backdrop[data-entering=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *):before,:is(.modal__backdrop[data-exiting=true],.modal__backdrop[data-entering=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *):after{animation:none}@media(prefers-reduced-motion:reduce){:is(.modal__backdrop[data-exiting=true],.modal__backdrop[data-entering=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),:is(.modal__backdrop[data-exiting=true],.modal__backdrop[data-entering=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,:is(.modal__backdrop[data-exiting=true],.modal__backdrop[data-entering=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{animation:none}}.modal__backdrop--transparent{background-color:#0000}.modal__backdrop--opaque{background-color:var(--backdrop)}.modal__backdrop--blur{background-color:var(--backdrop);--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.modal__container{height:var(--visual-viewport-height);width:100%;min-width:0;padding:calc(var(--spacing) * 4);flex-direction:column;flex:1;align-items:center;display:flex}@media(min-width:40rem){.modal__container{width:fit-content;padding:calc(var(--spacing) * 10)}}.modal__container{pointer-events:none}.modal__container[data-entering=true]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.25s;--tw-ease:cubic-bezier(.25, .46, .45, .94);--tw-enter-opacity:0;--tw-enter-scale: 105% ;transition-duration:.25s;transition-timing-function:cubic-bezier(.25,.46,.45,.94)}.modal__container[data-entering=true][data-placement=auto]{--tw-enter-translate-y:calc(1*var(--spacing))}@media(min-width:40rem){.modal__container[data-entering=true][data-placement=auto]{--tw-enter-translate-y: 0% }}.modal__container[data-entering=true][data-placement=top]{--tw-enter-translate-y:calc(1*var(--spacing)*-1)}.modal__container[data-entering=true][data-placement=center]{--tw-enter-translate-y: -0% }.modal__container[data-entering=true][data-placement=bottom]{--tw-enter-translate-y:calc(1*var(--spacing))}.modal__container[data-exiting=true]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.1s;--tw-ease:cubic-bezier(.25, .46, .45, .94);--tw-exit-opacity:0;--tw-exit-scale:.95;transition-duration:.1s;transition-timing-function:cubic-bezier(.25,.46,.45,.94)}.modal__container[data-exiting=true],.modal__container[data-entering=true]{will-change:opacity,transform}:is(.modal__container[data-exiting=true],.modal__container[data-entering=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *),:is(.modal__container[data-exiting=true],.modal__container[data-entering=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *):before,:is(.modal__container[data-exiting=true],.modal__container[data-entering=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *):after{animation:none}@media(prefers-reduced-motion:reduce){:is(.modal__container[data-exiting=true],.modal__container[data-entering=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),:is(.modal__container[data-exiting=true],.modal__container[data-entering=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,:is(.modal__container[data-exiting=true],.modal__container[data-entering=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{animation:none}}.modal__container--scroll-outside{scrollbar-width:var(--scrollbar-width);scrollbar-color:var(--scrollbar-color);scrollbar-gutter:var(--scrollbar-gutter);pointer-events:auto;-webkit-overflow-scrolling:touch;overflow-y:auto}.modal__container--full{padding:0}@media(min-width:40rem){.modal__container--full{padding:0}}.modal__container--full[data-entering=true]{--tw-enter-translate-y: 0% ;--tw-enter-scale:1}@media(min-width:40rem){.modal__container--full[data-entering=true]{--tw-enter-translate-y: 0% }}.modal__container--full[data-exiting=true]{--tw-exit-scale:1}.modal__dialog{background-color:var(--overlay);--tw-shadow:var(--overlay-shadow);width:100%;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;border-radius:min(32px,var(--radius-3xl));padding:calc(var(--spacing) * 6);pointer-events:auto;outline-style:none;flex-direction:column;display:flex;position:relative}.modal__dialog[data-placement=auto]{margin-top:auto}@media(min-width:40rem){.modal__dialog[data-placement=auto]{margin-block:auto}}.modal__dialog[data-placement=center]{margin-block:auto}.modal__dialog[data-placement=bottom]{margin-top:auto}.modal__dialog[data-placement=top]{margin-top:0}.modal__dialog--scroll-inside{min-height:0;max-height:100%;overflow:clip}.modal__dialog--scroll-outside{flex-shrink:0;height:auto;min-height:0}.modal__dialog--xs{max-width:var(--container-xs)}.modal__dialog--sm{max-width:var(--container-sm)}.modal__dialog--md{max-width:var(--container-md)}.modal__dialog--lg{max-width:var(--container-lg)}.modal__dialog--cover{width:100%;height:100%;min-height:100%}.modal__dialog--full{--tw-shadow:0 0 #0000;width:100%;height:100%;min-height:100%;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-radius:0}.modal__header{gap:calc(var(--spacing) * 3);flex-direction:column;margin-bottom:0;display:flex}.modal__header>.modal__icon{margin-bottom:0}.modal__heading{vertical-align:middle;font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--foreground)}.modal__icon{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10);border-radius:calc(var(--radius) * 3);-webkit-user-select:none;user-select:none;flex-shrink:0;justify-content:center;align-items:center;display:flex}.modal__body{min-height:0;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:1.43;color:var(--muted);margin:-3px;flex:1;margin-block:0;padding:3px;line-height:1.43;overflow:visible}.modal__body--scroll-inside{scrollbar-width:var(--scrollbar-width);scrollbar-color:var(--scrollbar-color);scrollbar-gutter:var(--scrollbar-gutter);overscroll-behavior:contain;-webkit-overflow-scrolling:touch;overflow-y:auto}.modal__body--scroll-outside{overflow-y:visible}.modal__footer{justify-content:flex-end;align-items:center;gap:calc(var(--spacing) * 2);flex-direction:row;margin-top:0;display:flex}.modal__close-trigger{top:calc(var(--spacing) * 4);right:calc(var(--spacing) * 4);position:absolute}.modal__header+.modal__body{margin-top:calc(var(--spacing) * 2)}.modal__header+.modal__footer,.modal__body+.modal__footer{margin-top:calc(var(--spacing) * 5)}.popover{transform-origin:var(--trigger-anchor-point);background-color:var(--overlay);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));border-radius:min(32px,var(--radius-3xl));box-shadow:var(--shadow-overlay);padding:0}.popover[data-entering=true]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.15s;--tw-ease:ease;--tw-enter-opacity:0;--tw-enter-scale:.9;transition-duration:.15s;transition-timing-function:ease}.popover[data-entering=true][data-placement=top]{--tw-enter-translate-y:calc(1*var(--spacing))}.popover[data-entering=true][data-placement=bottom]{--tw-enter-translate-y:calc(1*var(--spacing)*-1)}.popover[data-entering=true][data-placement=left]{--tw-enter-translate-x:calc(1*var(--spacing))}.popover[data-entering=true][data-placement=right]{--tw-enter-translate-x:calc(1*var(--spacing)*-1)}.popover[data-exiting=true]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.1s;--tw-ease:ease;--tw-exit-scale:.95;--tw-exit-opacity:0;transition-duration:.1s;transition-timing-function:ease}.popover[data-exiting=true],.popover[data-entering=true]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));will-change:opacity,transform}.popover [data-slot=popover-overlay-arrow]{fill:var(--overlay)}.popover[data-placement=bottom] [data-slot=popover-overlay-arrow]{rotate:180deg}.popover[data-placement=left] [data-slot=popover-overlay-arrow]{rotate:-90deg}.popover[data-placement=right] [data-slot=popover-overlay-arrow]{rotate:90deg}.popover__dialog{padding:calc(var(--spacing) * 4);--tw-outline-style:none;outline-style:none}.popover__heading{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.popover__trigger{transition:color .15s var(--ease-smooth),background-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out);display:inline-block}.popover__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *),.popover__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.popover__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.popover__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.popover__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.popover__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.popover__trigger{cursor:var(--cursor-interactive)}.popover__trigger:focus-visible:not(:focus),.popover__trigger[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.popover__trigger:disabled,.popover__trigger[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.tooltip{max-width:var(--container-xs);transform-origin:var(--trigger-anchor-point);background-color:var(--overlay);padding:calc(var(--spacing) * 2);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));word-break:break-all;border-radius:min(32px,var(--radius-xl));box-shadow:var(--shadow-overlay)}.tooltip[data-entering=true]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.15s;--tw-ease:ease;--tw-enter-opacity:0;--tw-enter-scale:.9;transition-duration:.15s;transition-timing-function:ease}.tooltip[data-entering=true][data-placement=top]{--tw-enter-translate-y:calc(1*var(--spacing))}.tooltip[data-entering=true][data-placement=bottom]{--tw-enter-translate-y:calc(1*var(--spacing)*-1)}.tooltip[data-entering=true][data-placement=left]{--tw-enter-translate-x:calc(1*var(--spacing))}.tooltip[data-entering=true][data-placement=right]{--tw-enter-translate-x:calc(1*var(--spacing)*-1)}.tooltip[data-exiting=true]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.1s;--tw-ease:ease;--tw-exit-scale:.95;--tw-exit-opacity:0;transition-duration:.1s;transition-timing-function:ease}.tooltip[data-exiting=true],.tooltip[data-entering=true]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));will-change:opacity,transform}.tooltip [data-slot=overlay-arrow]{stroke:var(--border)}@supports (color:color-mix(in lab,red,red)){.tooltip [data-slot=overlay-arrow]{stroke:color-mix(in oklab,var(--border) 40%,transparent)}}.tooltip [data-slot=overlay-arrow]{fill:var(--overlay)}.tooltip[data-placement=bottom] [data-slot=overlay-arrow]{rotate:180deg}.tooltip[data-placement=left] [data-slot=overlay-arrow]{rotate:-90deg}.tooltip[data-placement=right] [data-slot=overlay-arrow]{rotate:90deg}.tooltip__trigger{transition:color .15s var(--ease-smooth),background-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out);display:inline-block}.tooltip__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *),.tooltip__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.tooltip__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.tooltip__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.tooltip__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.tooltip__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.tooltip__trigger:focus-visible:not(:focus),.tooltip__trigger[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.combo-box{gap:var(--spacing);flex-direction:column;display:flex}:is(.combo-box[data-invalid=true],.combo-box[aria-invalid=true]) [data-slot=description]{display:none}.combo-box [data-slot=label]{width:fit-content}.combo-box [data-slot=input]{flex:1;min-width:0}.combo-box [data-slot=input]:has(+.combo-box__trigger){padding-inline-end:calc(var(--spacing) * 7)}.combo-box [data-slot=input]:focus,.combo-box [data-slot=input][data-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);--tw-ring-color:var(--focus);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;--tw-ring-offset-width:0px;border-color:var(--field-border-focus);background-color:var(--field-focus);outline-style:none}.combo-box [data-slot=input]:disabled,.combo-box [data-slot=input][data-disabled],.combo-box [data-slot=input][aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.combo-box__input-group{isolation:isolate;align-items:center;display:inline-flex;position:relative}.combo-box__trigger{--tw-translate-y: -50% ;height:100%;translate:var(--tw-translate-x) var(--tw-translate-y);cursor:pointer;color:var(--field-placeholder,var(--muted));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.15s;-webkit-tap-highlight-color:transparent;--tw-border-style:none;--tw-outline-style:none;inset-inline-end:calc(var(--spacing) * 0);background-color:#0000;border-style:none;outline-style:none;flex-shrink:0;justify-content:center;align-items:center;padding-inline-end:calc(var(--spacing) * 2);transition-duration:.15s;display:flex;position:absolute;top:50%}@media(hover:hover){.combo-box__trigger:hover,.combo-box__trigger[data-hovered=true]{color:var(--field-foreground,var(--foreground))}}.combo-box__trigger:focus-visible:not(:focus),.combo-box__trigger[data-focus-visible=true]{--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);--tw-ring-color:var(--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);--tw-ring-offset-color:var(--background);--tw-outline-style:none;border-radius:.25rem;outline-style:none}.combo-box__trigger[data-pressed=true]{opacity:.7}.combo-box__trigger:disabled,.combo-box__trigger[data-disabled],.combo-box__trigger[aria-disabled=true]{cursor:not-allowed;opacity:.5}.combo-box__trigger [data-slot=combo-box-trigger-default-icon]{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);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));--tw-duration:.15s;transition-duration:.15s}.combo-box__trigger [data-slot=combo-box-trigger-default-icon]:is([data-reduce-motion=true],[data-reduce-motion=true] *),.combo-box__trigger [data-slot=combo-box-trigger-default-icon]:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.combo-box__trigger [data-slot=combo-box-trigger-default-icon]:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.combo-box__trigger [data-slot=combo-box-trigger-default-icon]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.combo-box__trigger [data-slot=combo-box-trigger-default-icon]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.combo-box__trigger [data-slot=combo-box-trigger-default-icon]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.combo-box__trigger[data-open=true] [data-slot=combo-box-trigger-default-icon]{rotate:180deg}.combo-box__popover{min-width:var(--trigger-width);transform-origin:var(--trigger-anchor-point);scroll-padding-block:var(--spacing);scrollbar-width:var(--scrollbar-width);scrollbar-color:var(--scrollbar-color);scrollbar-gutter:var(--scrollbar-gutter);overscroll-behavior:contain;background-color:var(--overlay);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));border-radius:min(32px,var(--radius-3xl));box-shadow:var(--shadow-overlay);padding:0;overflow-y:auto}.combo-box__popover:focus-visible:not(:focus),.combo-box__popover[data-focus-visible=true]{--tw-outline-style:none;outline-style:none}.combo-box__popover[data-entering=true]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.15s;--tw-ease:ease;--tw-enter-opacity:0;--tw-enter-scale:.95;transition-duration:.15s;transition-timing-function:ease}.combo-box__popover[data-entering=true][data-placement=top]{--tw-enter-translate-y:calc(1*var(--spacing))}.combo-box__popover[data-entering=true][data-placement=bottom]{--tw-enter-translate-y:calc(1*var(--spacing)*-1)}.combo-box__popover[data-entering=true][data-placement=left]{--tw-enter-translate-x:calc(1*var(--spacing))}.combo-box__popover[data-entering=true][data-placement=right]{--tw-enter-translate-x:calc(1*var(--spacing)*-1)}.combo-box__popover[data-exiting=true]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.1s;--tw-ease:ease;--tw-exit-scale:.95;--tw-exit-opacity:0;transition-duration:.1s;transition-timing-function:ease}.combo-box__popover[data-exiting=true],.combo-box__popover[data-entering=true]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));will-change:opacity,transform}.combo-box__popover [data-slot=popover-overlay-arrow]{fill:var(--overlay)}.combo-box__popover[data-placement=bottom] [data-slot=popover-overlay-arrow]{rotate:180deg}.combo-box__popover[data-placement=left] [data-slot=popover-overlay-arrow]{rotate:-90deg}.combo-box__popover[data-placement=right] [data-slot=popover-overlay-arrow]{rotate:90deg}.combo-box__popover [data-slot=list-box]{padding:calc(var(--spacing) * 1.5);--tw-outline-style:none;outline-style:none}.combo-box__popover [data-slot=list-box-item]{padding-inline:calc(var(--spacing) * 2.5)}.combo-box__popover [data-slot=list-box-item] [data-slot=list-box-item-indicator--checkmark]{transition-property:none}.combo-box--full-width,.combo-box__input-group--full-width{width:100%}.select{gap:var(--spacing);flex-direction:column;display:flex}:is(.select[data-invalid=true],.select[aria-invalid=true]) [data-slot=description]{display:none}.select [data-slot=label]{width:fit-content}.select__trigger{isolation:isolate;min-height:calc(var(--spacing) * 9);border-radius:var(--field-radius,calc(var(--radius) * 1.5));border-style:var(--tw-border-style);background-color:var(--field-background,var(--default));padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--field-foreground,var(--foreground));--tw-shadow:var(--field-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;transition:background-color .15s var(--ease-smooth),border-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out);border-width:1px;outline-style:none;display:inline-flex;position:relative}.select__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *),.select__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.select__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.select__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.select__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.select__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.select__trigger{cursor:var(--cursor-interactive);border-width:var(--border-width-field);border-color:var(--field-border)}.select__trigger:has(.select__indicator){padding-inline-end:calc(var(--spacing) * 7)}@media(hover:hover){.select__trigger:hover,.select__trigger[data-hovered=true]{background-color:var(--field-hover);border-color:var(--field-border-hover)}}.select__trigger:focus-visible:not(:focus),.select__trigger[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;border-color:var(--field-border-focus);background-color:var(--field-focus);outline-style:none}.select[data-invalid=true] .select__trigger,.select[aria-invalid=true] .select__trigger{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}:is(.select[data-invalid=true] .select__trigger,.select[aria-invalid=true] .select__trigger):focus,:is(.select[data-invalid=true] .select__trigger,.select[aria-invalid=true] .select__trigger):focus-visible,:is(.select[data-invalid=true] .select__trigger,.select[aria-invalid=true] .select__trigger)[data-focused=true],:is(.select[data-invalid=true] .select__trigger,.select[aria-invalid=true] .select__trigger)[data-focus-visible=true],:is(.select[data-invalid=true] .select__trigger,.select[aria-invalid=true] .select__trigger):focus-within,:is(.select[data-invalid=true] .select__trigger,.select[aria-invalid=true] .select__trigger)[data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.select[data-invalid=true] .select__trigger,.select[aria-invalid=true] .select__trigger{background-color:var(--field-focus)}.select__trigger:disabled,.select__trigger[data-disabled=true],.select__trigger[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.select--secondary .select__trigger{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:var(--select-trigger-bg);--select-trigger-bg:var(--default);--select-trigger-bg-hover:var(--default-hover);--select-trigger-bg-focus:var(--default)}@media(hover:hover){.select--secondary .select__trigger:hover,.select--secondary .select__trigger[data-hovered=true]{background-color:var(--select-trigger-bg-hover)}}.select--secondary .select__trigger:focus-visible:not(:focus),.select--secondary .select__trigger[data-focus-visible=true],.select[data-invalid=true] :is(.select--secondary .select__trigger),.select[aria-invalid=true] :is(.select--secondary .select__trigger){background-color:var(--select-trigger-bg-focus)}.select__value{text-align:start;font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));overflow-wrap:break-word;color:currentColor;flex:1}@media(min-width:40rem){.select__value{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.select__value[data-placeholder=true]{color:var(--field-placeholder,var(--muted))}.select__value [data-slot=list-box-item-indicator]{display:none}.select__indicator{color:var(--field-placeholder,var(--muted));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.15s;flex-shrink:0;justify-content:center;align-items:center;margin-block:auto;transition-duration:.15s;display:flex;position:absolute;inset-block:0;inset-inline-end:calc(var(--spacing) * 2)}.select__indicator[data-open=true]{rotate:180deg}.select__indicator[data-slot=select-default-indicator]{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.select__popover{min-width:var(--trigger-width);transform-origin:var(--trigger-anchor-point);scroll-padding-block:var(--spacing);scrollbar-width:var(--scrollbar-width);scrollbar-color:var(--scrollbar-color);scrollbar-gutter:var(--scrollbar-gutter);overscroll-behavior:contain;background-color:var(--overlay);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));border-radius:min(32px,var(--radius-3xl));box-shadow:var(--shadow-overlay);padding:0;overflow-y:auto}.select__popover:focus-visible:not(:focus),.select__popover[data-focus-visible=true]{--tw-outline-style:none;outline-style:none}.select__popover[data-entering=true]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.15s;--tw-ease:ease;--tw-enter-opacity:0;--tw-enter-scale:.95;transition-duration:.15s;transition-timing-function:ease}.select__popover[data-entering=true][data-placement=top]{--tw-enter-translate-y:calc(1*var(--spacing))}.select__popover[data-entering=true][data-placement=bottom]{--tw-enter-translate-y:calc(1*var(--spacing)*-1)}.select__popover[data-entering=true][data-placement=left]{--tw-enter-translate-x:calc(1*var(--spacing))}.select__popover[data-entering=true][data-placement=right]{--tw-enter-translate-x:calc(1*var(--spacing)*-1)}.select__popover[data-exiting=true]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.1s;--tw-ease:ease;--tw-exit-scale:.95;--tw-exit-opacity:0;transition-duration:.1s;transition-timing-function:ease}.select__popover[data-exiting=true],.select__popover[data-entering=true]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));will-change:opacity,transform}.select__popover [data-slot=popover-overlay-arrow]{fill:var(--overlay)}.select__popover[data-placement=bottom] [data-slot=popover-overlay-arrow]{rotate:180deg}.select__popover[data-placement=left] [data-slot=popover-overlay-arrow]{rotate:-90deg}.select__popover[data-placement=right] [data-slot=popover-overlay-arrow]{rotate:90deg}.select__popover [data-slot=list-box]{padding:calc(var(--spacing) * 1.5);--tw-outline-style:none;outline-style:none}.select__popover [data-slot=list-box-item]{padding-inline:calc(var(--spacing) * 2.5)}.select__popover [data-slot=list-box]:not([aria-multiselectable=true]) [data-slot=list-box-item-indicator],.select__popover [data-slot=list-box]:not([aria-multiselectable=true]) [data-slot=list-box-item-indicator] [data-slot=list-box-item-indicator--checkmark]{transition-property:none}.select--full-width,.select__trigger--full-width{width:100%}.autocomplete{gap:var(--spacing);flex-direction:column;display:flex}.autocomplete__trigger{isolation:isolate;min-height:calc(var(--spacing) * 9);border-radius:var(--field-radius,calc(var(--radius) * 1.5));border-style:var(--tw-border-style);background-color:var(--field-background,var(--default));padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--field-foreground,var(--foreground));--tw-shadow:var(--field-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;transition:background-color .15s var(--ease-smooth),border-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out);border-width:1px;outline-style:none;display:inline-flex;position:relative}.autocomplete__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *),.autocomplete__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.autocomplete__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.autocomplete__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.autocomplete__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.autocomplete__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.autocomplete__trigger{cursor:var(--cursor-interactive);border-width:var(--border-width-field);border-color:var(--field-border)}.autocomplete__trigger:has(.autocomplete__indicator){padding-inline-end:calc(var(--spacing) * 7)}@media(hover:hover){.autocomplete__trigger:hover:not(:has(.autocomplete__clear-button:hover)),.autocomplete__trigger[data-hovered=true]:not(:has(.autocomplete__clear-button:hover)){background-color:var(--field-hover);border-color:var(--field-border-hover)}}.autocomplete__trigger:focus-visible:not(:focus),.autocomplete__trigger[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;border-color:var(--field-border-focus);background-color:var(--field-focus);outline-style:none}.autocomplete[data-invalid=true] .autocomplete__trigger,.autocomplete[aria-invalid=true] .autocomplete__trigger{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}:is(.autocomplete[data-invalid=true] .autocomplete__trigger,.autocomplete[aria-invalid=true] .autocomplete__trigger):focus,:is(.autocomplete[data-invalid=true] .autocomplete__trigger,.autocomplete[aria-invalid=true] .autocomplete__trigger):focus-visible,:is(.autocomplete[data-invalid=true] .autocomplete__trigger,.autocomplete[aria-invalid=true] .autocomplete__trigger)[data-focused=true],:is(.autocomplete[data-invalid=true] .autocomplete__trigger,.autocomplete[aria-invalid=true] .autocomplete__trigger)[data-focus-visible=true],:is(.autocomplete[data-invalid=true] .autocomplete__trigger,.autocomplete[aria-invalid=true] .autocomplete__trigger):focus-within,:is(.autocomplete[data-invalid=true] .autocomplete__trigger,.autocomplete[aria-invalid=true] .autocomplete__trigger)[data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.autocomplete[data-invalid=true] .autocomplete__trigger,.autocomplete[aria-invalid=true] .autocomplete__trigger{background-color:var(--field-focus)}.autocomplete__trigger:disabled,.autocomplete__trigger[data-disabled=true],.autocomplete__trigger[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.autocomplete--secondary .autocomplete__trigger{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:var(--autocomplete-trigger-bg);--autocomplete-trigger-bg:var(--default);--autocomplete-trigger-bg-hover:var(--default-hover);--autocomplete-trigger-bg-focus:var(--default)}@media(hover:hover){.autocomplete--secondary .autocomplete__trigger:hover:not(:has(.autocomplete__clear-button:hover)),.autocomplete--secondary .autocomplete__trigger[data-hovered=true]:not(:has(.autocomplete__clear-button:hover)){background-color:var(--autocomplete-trigger-bg-hover)}}.autocomplete--secondary .autocomplete__trigger:focus-visible:not(:focus),.autocomplete--secondary .autocomplete__trigger[data-focus-visible=true],.autocomplete[data-invalid=true] :is(.autocomplete--secondary .autocomplete__trigger),.autocomplete[aria-invalid=true] :is(.autocomplete--secondary .autocomplete__trigger){background-color:var(--autocomplete-trigger-bg-focus)}.autocomplete__value{text-align:start;font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));overflow-wrap:break-word;color:currentColor;flex:1}@media(min-width:40rem){.autocomplete__value{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.autocomplete__value[data-placeholder=true]{color:var(--field-placeholder,var(--muted))}.autocomplete__value [data-slot=list-box-item-indicator]{display:none}.autocomplete__indicator{color:var(--field-placeholder,var(--muted));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.15s;cursor:var(--cursor-interactive);flex-shrink:0;justify-content:center;align-items:center;margin-block:auto;transition-duration:.15s;display:flex;position:absolute;inset-block:0;inset-inline-end:calc(var(--spacing) * 2)}.autocomplete__indicator[data-open=true]{rotate:180deg}.autocomplete__indicator[data-slot=autocomplete-default-indicator]{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.autocomplete__popover{width:var(--trigger-width);max-width:var(--trigger-width);transform-origin:var(--trigger-anchor-point);scroll-padding-block:var(--spacing);overscroll-behavior:contain;background-color:var(--overlay);padding:0;padding-top:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));border-radius:min(32px,var(--radius-3xl));box-shadow:var(--shadow-overlay);overflow:hidden}.autocomplete__popover:focus-visible:not(:focus),.autocomplete__popover[data-focus-visible=true]{--tw-outline-style:none;outline-style:none}.autocomplete__popover[data-entering=true]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.25s;--tw-ease:cubic-bezier(.32, .72, 0, 1);--tw-enter-opacity:0;--tw-enter-scale:.95;transition-duration:.25s;transition-timing-function:cubic-bezier(.32,.72,0,1)}.autocomplete__popover[data-entering=true][data-placement=top]{--tw-enter-translate-y:calc(1*var(--spacing))}.autocomplete__popover[data-entering=true][data-placement=bottom]{--tw-enter-translate-y:calc(1*var(--spacing)*-1)}.autocomplete__popover[data-entering=true][data-placement=left]{--tw-enter-translate-x:calc(1*var(--spacing))}.autocomplete__popover[data-entering=true][data-placement=right]{--tw-enter-translate-x:calc(1*var(--spacing)*-1)}.autocomplete__popover[data-exiting=true]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.1s;--tw-ease:cubic-bezier(.25, .46, .45, .94);--tw-exit-scale:.95;--tw-exit-opacity:0;transition-duration:.1s;transition-timing-function:cubic-bezier(.25,.46,.45,.94)}.autocomplete__popover[data-exiting=true],.autocomplete__popover[data-entering=true]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));will-change:opacity,transform}.autocomplete__popover [data-slot=popover-overlay-arrow]{fill:var(--overlay)}.autocomplete__popover[data-placement=bottom] [data-slot=popover-overlay-arrow]{rotate:180deg}.autocomplete__popover[data-placement=left] [data-slot=popover-overlay-arrow]{rotate:-90deg}.autocomplete__popover[data-placement=right] [data-slot=popover-overlay-arrow]{rotate:90deg}.autocomplete__popover [data-slot=list-box]{scrollbar-width:var(--scrollbar-width);scrollbar-color:var(--scrollbar-color);scrollbar-gutter:var(--scrollbar-gutter);max-height:320px;padding:calc(var(--spacing) * 1.5);--tw-outline-style:none;outline-style:none;overflow-y:auto}.autocomplete__popover [data-slot=list-box-item]{padding-inline:calc(var(--spacing) * 2.5)}.autocomplete__popover [data-slot=list-box]:not([aria-multiselectable=true]) [data-slot=list-box-item-indicator],.autocomplete__popover [data-slot=list-box]:not([aria-multiselectable=true]) [data-slot=list-box-item-indicator] [data-slot=list-box-item-indicator--checkmark]{transition-property:none}.autocomplete__popover [data-slot=search-field]{padding-inline:calc(var(--spacing) * 3);padding-block:var(--spacing);--tw-outline-style:none;outline-style:none}.autocomplete__popover [data-slot=empty-state]{text-align:center;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--overlay-foreground)}@supports (color:color-mix(in lab,red,red)){.autocomplete__popover [data-slot=empty-state]{color:color-mix(in oklab,var(--overlay-foreground) 60%,transparent)}}.autocomplete__popover-dialog,.autocomplete__popover-dialog:focus,.autocomplete__popover-dialog:focus-visible,.autocomplete__popover-dialog[data-focus-visible=true]{--tw-outline-style:none;outline-style:none}.autocomplete--full-width,.autocomplete__trigger--full-width{width:100%}.autocomplete__clear-button{isolation:isolate;height:calc(var(--spacing) * 6);width:calc(var(--spacing) * 6);transform-origin:50%;border-radius:calc(var(--radius) * 1.5);padding:var(--spacing);color:var(--muted);-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5);cursor:var(--cursor-interactive);transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);background-color:#0000;flex-shrink:0;justify-content:center;align-self:center;align-items:center;margin-inline-end:0;display:inline-flex;position:relative}.autocomplete__clear-button:not([data-empty=true]){transition:opacity .15s var(--ease-smooth)}.autocomplete__clear-button:not([data-empty=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *),.autocomplete__clear-button:not([data-empty=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.autocomplete__clear-button:not([data-empty=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.autocomplete__clear-button:not([data-empty=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.autocomplete__clear-button:not([data-empty=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.autocomplete__clear-button:not([data-empty=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.autocomplete__clear-button[data-empty=true]{pointer-events:none;opacity:0}.autocomplete__clear-button [data-slot=autocomplete-clear-button-icon]{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}@media(hover:hover){.autocomplete__clear-button:hover,.autocomplete__clear-button[data-hovered=true]{background-color:var(--default-hover)}}.autocomplete__clear-button:active,.autocomplete__clear-button[data-pressed=true]{transform:scale(.93)}.kbd{height:calc(var(--spacing) * 6);align-items:center;display:inline-flex}:where(.kbd>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * .5) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-x-reverse)))}.kbd{border-radius:calc(var(--radius) * 1);background-color:var(--default);padding-inline:calc(var(--spacing) * 2);text-align:center;font-family:var(--font-sans);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);white-space:nowrap;color:var(--muted)}:where(.kbd:where(:dir(rtl),[dir=rtl],[dir=rtl] *)>:not(:last-child)){--tw-space-x-reverse:1}.kbd{word-spacing:-.25rem}.kbd__abbr{justify-content:center;align-items:center;width:100%;height:100%;text-decoration:none;display:flex}.kbd__content{justify-content:center;align-items:center;display:flex}.kbd--light{background-color:#0000}.typography,.typography-prose{color:var(--foreground)}.typography-prose h1{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.typography-prose h2{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.typography-prose h3{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.typography-prose h4{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.typography-prose h5{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.typography-prose h6{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.typography-prose p{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing) * 7);line-height:calc(var(--spacing) * 7)}.typography-prose code{border-radius:calc(var(--radius) * .75);background-color:var(--default);padding-inline:calc(var(--spacing) * 1.5);padding-block:calc(var(--spacing) * .5);font-family:var(--font-mono);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--foreground)}.typography-prose a{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--link);text-underline-offset:4px;text-decoration-line:underline}.typography-prose blockquote{margin-top:calc(var(--spacing) * 4);border-left-style:var(--tw-border-style);border-left-width:4px;border-color:var(--border);padding-left:calc(var(--spacing) * 4);color:var(--muted);font-style:italic}.typography-prose ul{margin-block:calc(var(--spacing) * 4);list-style-type:disc}:where(.typography-prose ul>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}.typography-prose ul{padding-left:calc(var(--spacing) * 6)}.typography-prose ol{margin-block:calc(var(--spacing) * 4);list-style-type:decimal}:where(.typography-prose ol>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}.typography-prose ol{padding-left:calc(var(--spacing) * 6)}.typography-prose li{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing) * 7);line-height:calc(var(--spacing) * 7)}.typography-prose hr{margin-block:calc(var(--spacing) * 8);border-color:var(--separator)}.typography-prose pre{margin-block:calc(var(--spacing) * 4);border-radius:calc(var(--radius) * 1.5);background-color:var(--default);padding:calc(var(--spacing) * 4);font-family:var(--font-mono);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed);overflow-x:auto}.typography-prose strong{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--foreground)}.typography-prose em{font-style:italic}.typography-prose img{margin-block:calc(var(--spacing) * 4);border-radius:calc(var(--radius) * 1.5)}.typography--h1{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.typography--h2{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.typography--h3{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.typography--h4{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.typography--h5{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.typography--h6{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.typography--body{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing) * 7);line-height:calc(var(--spacing) * 7)}.typography--body-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.typography--body-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.typography--code{border-radius:calc(var(--radius) * .75);background-color:var(--default);padding-inline:calc(var(--spacing) * 1.5);padding-block:calc(var(--spacing) * .5);font-family:var(--font-mono);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--foreground)}.typography--align-start{text-align:left}.typography--align-start:where(:dir(rtl),[dir=rtl],[dir=rtl] *){text-align:right}.typography--align-center{text-align:center}.typography--align-end{text-align:right}.typography--align-end:where(:dir(rtl),[dir=rtl],[dir=rtl] *){text-align:left}.typography--align-justify{text-align:justify}.typography--color-default{color:var(--foreground)}.typography--color-muted{color:var(--muted)}.typography--truncate{text-overflow:ellipsis;white-space:nowrap;display:block;overflow:hidden}.typography--weight-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.typography--weight-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.typography--weight-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.typography--weight-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.scroll-shadow{--scroll-shadow-size:40px;--scroll-shadow-scrollbar-size:10px;position:relative}.scroll-shadow--vertical{scrollbar-width:var(--scrollbar-width);scrollbar-color:var(--scrollbar-color);scrollbar-gutter:var(--scrollbar-gutter);overflow-y:auto}.scroll-shadow--horizontal{scrollbar-width:var(--scrollbar-width);scrollbar-color:var(--scrollbar-color);scrollbar-gutter:var(--scrollbar-gutter);overflow-x:auto}.scroll-shadow--fade.scroll-shadow--vertical:where([data-top-scroll=true],[data-bottom-scroll=true],[data-top-bottom-scroll=true]){mask-image:linear-gradient(var(--scroll-linear-gradient)),linear-gradient(#000,#000);mask-position:0 0,100% 0;mask-repeat:no-repeat;mask-size:calc(100% - var(--scroll-shadow-scrollbar-size)) 100%,var(--scroll-shadow-scrollbar-size) 100%;-webkit-mask-image:linear-gradient(var(--scroll-linear-gradient)),linear-gradient(#000,#000);-webkit-mask-position:0 0,100% 0;-webkit-mask-repeat:no-repeat;-webkit-mask-size:calc(100% - var(--scroll-shadow-scrollbar-size)) 100%,var(--scroll-shadow-scrollbar-size) 100%}.scroll-shadow--fade.scroll-shadow--vertical[data-top-scroll=true]{--scroll-linear-gradient:0deg, #000 calc(100% - var(--scroll-shadow-size)), transparent}.scroll-shadow--fade.scroll-shadow--vertical[data-bottom-scroll=true]{--scroll-linear-gradient:180deg, #000 calc(100% - var(--scroll-shadow-size)), transparent}.scroll-shadow--fade.scroll-shadow--vertical[data-top-bottom-scroll=true]{--scroll-linear-gradient:#000, #000, transparent 0, #000 var(--scroll-shadow-size), #000 calc(100% - var(--scroll-shadow-size)), transparent}.scroll-shadow--fade.scroll-shadow--horizontal:where([data-left-scroll=true],[data-right-scroll=true],[data-left-right-scroll=true]){mask-image:linear-gradient(var(--scroll-linear-gradient)),linear-gradient(#000,#000);mask-position:0 0,0 100%;mask-repeat:no-repeat;mask-size:100% calc(100% - var(--scroll-shadow-scrollbar-size)),100% var(--scroll-shadow-scrollbar-size);-webkit-mask-image:linear-gradient(var(--scroll-linear-gradient)),linear-gradient(#000,#000);-webkit-mask-position:0 0,0 100%;-webkit-mask-repeat:no-repeat;-webkit-mask-size:100% calc(100% - var(--scroll-shadow-scrollbar-size)),100% var(--scroll-shadow-scrollbar-size)}.scroll-shadow--fade.scroll-shadow--horizontal[data-left-scroll=true]{--scroll-linear-gradient:270deg, #000 calc(100% - var(--scroll-shadow-size)), transparent}.scroll-shadow--fade.scroll-shadow--horizontal[data-right-scroll=true]{--scroll-linear-gradient:90deg, #000 calc(100% - var(--scroll-shadow-size)), transparent}.scroll-shadow--fade.scroll-shadow--horizontal[data-left-right-scroll=true]{--scroll-linear-gradient:to right, #000, #000, transparent 0, #000 var(--scroll-shadow-size), #000 calc(100% - var(--scroll-shadow-size)), transparent}.scroll-shadow--hide-scrollbar{scrollbar-color:auto;scrollbar-gutter:auto;-ms-overflow-style:none;scrollbar-width:none;--scroll-shadow-scrollbar-size:0px}}@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.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{top:0;right:0;bottom:0;left:0}.inset-x-0{inset-inline:0}.inset-y-0{inset-block:0}.top-0{top:0}.top-4{top:calc(var(--spacing) * 4)}.top-full{top:100%}.-right-3{right:calc(var(--spacing) * -3)}.right-0{right:0}.right-4{right:calc(var(--spacing) * 4)}.bottom-4{bottom:calc(var(--spacing) * 4)}.left-0{left:0}.left-1\/2{left:50%}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mx-1{margin-inline:var(--spacing)}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-3{margin-inline:calc(var(--spacing) * 3)}.mx-auto{margin-inline:auto}.-mt-1{margin-top:calc(var(--spacing) * -1)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.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-4{margin-top:calc(var(--spacing) * 4)}.mt-auto{margin-top:auto}.-mr-1{margin-right:calc(var(--spacing) * -1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.-ml-1{margin-left:calc(var(--spacing) * -1)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-1{height:var(--spacing)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-12{height:calc(var(--spacing) * 12)}.h-48{height:calc(var(--spacing) * 48)}.h-full{height:100%}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-\[90vh\]{max-height:90vh}.min-h-0{min-height:0}.min-h-full{min-height:100%}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-11{width:calc(var(--spacing) * 11)}.w-12{width:calc(var(--spacing) * 12)}.w-28{width:calc(var(--spacing) * 28)}.w-56{width:calc(var(--spacing) * 56)}.w-64{width:calc(var(--spacing) * 64)}.w-72{width:calc(var(--spacing) * 72)}.w-\[17rem\]{width:17rem}.w-\[calc\(100\%-2rem\)\]{width:calc(100% - 2rem)}.w-fit{width:fit-content}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-40{max-width:calc(var(--spacing) * 40)}.max-w-44{max-width:calc(var(--spacing) * 44)}.max-w-\[1800px\]{max-width:1800px}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.min-w-\[140px\]{min-width:140px}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0{--tw-translate-x:0;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0\.5{--tw-translate-x:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-5{--tw-translate-x:calc(var(--spacing) * 5);translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-col-resize{cursor:col-resize}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.resize-none{resize:none}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.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-x-4{column-gap:calc(var(--spacing) * 4)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}: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-\[var\(--otari-line\)\]>:not(:last-child)){border-color:var(--otari-line)}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:calc(var(--radius) * 1)}.rounded-md{border-radius:calc(var(--radius) * .75)}.rounded-xl{border-radius:calc(var(--radius) * 1.5)}.border{border-style:var(--tw-border-style);border-width:1px}.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-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-\[\#c2843a\]{border-color:#c2843a}.border-\[var\(--otari-brand\)\]{border-color:var(--otari-brand)}.border-\[var\(--otari-line\)\]{border-color:var(--otari-line)}.border-amber-200{border-color:var(--color-amber-200)}.border-emerald-200{border-color:var(--color-emerald-200)}.border-green-200{border-color:var(--color-green-200)}.border-red-200{border-color:var(--color-red-200)}.border-l-amber-500{border-left-color:var(--color-amber-500)}.border-l-emerald-500{border-left-color:var(--color-emerald-500)}.border-l-red-500{border-left-color:var(--color-red-500)}.bg-\[var\(--otari-bg\)\]{background-color:var(--otari-bg)}.bg-\[var\(--otari-brand\)\]{background-color:var(--otari-brand)}.bg-\[var\(--otari-brand-tint\)\]{background-color:var(--otari-brand-tint)}.bg-\[var\(--otari-line\)\]{background-color:var(--otari-line)}.bg-\[var\(--otari-surface\)\]{background-color:var(--otari-surface)}.bg-amber-50{background-color:var(--color-amber-50)}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab,red,red)){.bg-black\/40{background-color:color-mix(in oklab,var(--color-black) 40%,transparent)}}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-500{background-color:var(--color-green-500)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-500{background-color:var(--color-red-500)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.p-0{padding:0}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-7{padding:calc(var(--spacing) * 7)}.px-0{padding-inline:0}.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)}.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-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-10{padding-block:calc(var(--spacing) * 10)}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-1\.5{padding-right:calc(var(--spacing) * 1.5)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pb-1{padding-bottom:var(--spacing)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.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)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[\#b45309\]{color:#b45309}.text-\[var\(--otari-brand-dark\)\]{color:var(--otari-brand-dark)}.text-\[var\(--otari-ink\)\]{color:var(--otari-ink)}.text-\[var\(--otari-muted\)\]{color:var(--otari-muted)}.text-amber-400{color:var(--color-amber-400)}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-amber-900{color:var(--color-amber-900)}.text-emerald-700{color:var(--color-emerald-700)}.text-green-700{color:var(--color-green-700)}.text-red-700{color:var(--color-red-700)}.text-white{color:var(--color-white)}.normal-case{text-transform:none}.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,)}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.accent-\[var\(--otari-brand\)\]{accent-color:var(--otari-brand)}.opacity-0{opacity:0}.shadow{--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-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px 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-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-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px 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)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);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,)}.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-\[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-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.select-all{-webkit-user-select:all;user-select:all}.select-none{-webkit-user-select:none;user-select:none}.running{animation-play-state:running}.group-focus-within\:opacity-100:is(:where(.group):focus-within *){opacity:1}@media(hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.group-data-\[focus-visible\]\:outline-2:is(:where(.group)[data-focus-visible] *){outline-style:var(--tw-outline-style);outline-width:2px}.group-data-\[focus-visible\]\:outline-\[var\(--otari-brand\)\]:is(:where(.group)[data-focus-visible] *){outline-color:var(--otari-brand)}@media(hover:hover){.hover\:border-\[var\(--otari-brand\)\]:hover{border-color:var(--otari-brand)}.hover\:bg-\[var\(--otari-bg\)\]:hover{background-color:var(--otari-bg)}.hover\:bg-\[var\(--otari-brand\)\]:hover{background-color:var(--otari-brand)}.hover\:text-\[var\(--otari-brand\)\]:hover{color:var(--otari-brand)}.hover\:text-\[var\(--otari-brand-dark\)\]:hover{color:var(--otari-brand-dark)}.hover\:text-\[var\(--otari-ink\)\]:hover{color:var(--otari-ink)}.hover\:text-amber-950:hover{color:var(--color-amber-950)}.hover\:text-red-700:hover{color:var(--color-red-700)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:border-\[var\(--otari-brand\)\]:focus{border-color:var(--otari-brand)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:bg-\[var\(--otari-brand\)\]:focus-visible{background-color:var(--otari-brand)}.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-\[var\(--otari-brand\)\]:focus-visible{--tw-ring-color:var(--otari-brand)}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:40rem){.sm\:col-span-2{grid-column:span 2/span 2}.sm\:col-start-1{grid-column-start:1}.sm\:col-start-2{grid-column-start:2}.sm\:col-start-3{grid-column-start:3}.sm\:w-28{width:calc(var(--spacing) * 28)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-\[minmax\(0\,1fr\)_16rem_10rem\]{grid-template-columns:minmax(0,1fr) 16rem 10rem}.sm\:flex-row{flex-direction:row}.sm\:flex-wrap{flex-wrap:wrap}.sm\:items-center{align-items:center}.sm\:items-start{align-items:flex-start}.sm\:justify-self-end{justify-self:flex-end}.sm\:justify-self-start{justify-self:flex-start}.sm\:p-5{padding:calc(var(--spacing) * 5)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}}@media(min-width:48rem){.md\:flex{display:flex}.md\:hidden{display:none}.md\:w-auto{width:auto}.md\:px-6{padding-inline:calc(var(--spacing) * 6)}.md\:py-6{padding-block:calc(var(--spacing) * 6)}}@media(min-width:64rem){.lg\:sticky{position:sticky}.lg\:top-4{top:calc(var(--spacing) * 4)}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-\[minmax\(0\,1fr\)_360px\]{grid-template-columns:minmax(0,1fr) 360px}.lg\:items-start{align-items:flex-start}}@media(min-width:80rem){.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}:root{--otari-brand:#4e8295;--otari-brand-dark:#3c6678;--otari-brand-tint:#eaf1f3;--otari-ink:#14242c;--otari-muted:#5b6b73;--otari-line:#dbe5e8;--otari-surface:#fff;--otari-bg:#f6f9fa;--otari-code-ink:#e8eef0}.otari-table.table-root{background-color:var(--otari-surface);border:1px solid var(--otari-line);border-radius:.75rem;padding:0;overflow:hidden}.otari-table .table__header{background-color:var(--otari-brand-tint);border-bottom:1px solid var(--otari-line)}.otari-table .table__column,.otari-table [role=row]>[role=presentation]:first-of-type>.table__column,.otari-table [role=row]>[role=presentation]:last-of-type>.table__column{color:var(--otari-ink);background-color:#0000;border-radius:0;font-weight:600}.otari-table .table__column:after{content:none}.otari-table .table__row .table__cell{border-color:var(--otari-line)}.otari-table .table__row:hover .table__cell{background-color:var(--otari-bg)}.otari-table .otari-detail-row>td{border-bottom:1px solid var(--otari-line);background-color:var(--otari-bg);padding:0}.otari-table .otari-detail-opening .table__cell{background-color:var(--otari-brand-tint)}.otari-detail-reveal{grid-template-rows:0fr;animation:.18s ease-out forwards otari-detail-open;display:grid}.otari-detail-reveal>div{overflow:hidden}@keyframes otari-detail-open{0%{opacity:.5;grid-template-rows:0fr}to{opacity:1;grid-template-rows:1fr}}.otari-bulk-bar{animation:.16s ease-out otari-bulk-bar-in}@keyframes otari-bulk-bar-in{0%{opacity:0;transform:translate(-50%,.5rem)}to{opacity:1;transform:translate(-50%)}}@media(prefers-reduced-motion:reduce){.otari-detail-reveal{grid-template-rows:1fr;animation:none}.otari-bulk-bar{animation:none}}.otari-markdown{color:var(--otari-ink);font-size:.875rem;line-height:1.65}.otari-markdown>:first-child{margin-top:0}.otari-markdown h1,.otari-markdown h2,.otari-markdown h3,.otari-markdown h4{color:var(--otari-ink);font-weight:600;line-height:1.3}.otari-markdown h1{margin:2rem 0 .75rem;font-size:1.5rem}.otari-markdown h2{border-bottom:1px solid var(--otari-line);margin:2rem 0 .5rem;padding-bottom:.3rem;font-size:1.25rem}.otari-markdown h3{margin:1.5rem 0 .5rem;font-size:1.05rem}.otari-markdown h4{margin:1.25rem 0 .25rem;font-size:.95rem}.otari-markdown p{margin:.75rem 0}.otari-markdown a{color:var(--otari-brand-dark);text-underline-offset:2px;text-decoration:underline}.otari-markdown a:hover{text-decoration-thickness:2px}.otari-markdown ul,.otari-markdown ol{margin:.75rem 0;padding-left:1.5rem}.otari-markdown ul{list-style:outside}.otari-markdown ol{list-style:decimal}.otari-markdown li,.otari-markdown li>ul,.otari-markdown li>ol{margin:.25rem 0}.otari-markdown code{background-color:var(--otari-brand-tint);color:var(--otari-brand-dark);border-radius:.35rem;padding:.1rem .35rem;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,monospace;font-size:.85em}.otari-markdown pre{background-color:var(--otari-ink);border-radius:.6rem;margin:1rem 0;padding:.85rem 1rem;overflow-x:auto}.otari-markdown pre code{color:var(--otari-code-ink);background-color:#0000;border-radius:0;padding:0;font-size:.82rem;line-height:1.55}.otari-markdown blockquote{border-left:3px solid var(--otari-brand);color:var(--otari-muted);margin:1rem 0;padding:.25rem 0 .25rem 1rem}.otari-markdown hr{border:0;border-top:1px solid var(--otari-line);margin:1.5rem 0}.otari-markdown-scroll{max-width:100%;margin:1rem 0;overflow-x:auto}.otari-markdown table{border-collapse:collapse;font-size:.85rem}.otari-markdown th,.otari-markdown td{border:1px solid var(--otari-line);text-align:left;vertical-align:top;padding:.4rem .7rem}.otari-markdown th{background-color:var(--otari-brand-tint);color:var(--otari-ink);font-weight:600}.otari-markdown tbody tr:hover td,.otari-markdown tr:hover td{background-color:var(--otari-bg)}html,body,#root{height:100%}body{background-color:var(--otari-bg);color:var(--otari-ink);margin:0;font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,sans-serif}@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:"";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:"";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:"";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:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-border-spacing-x{syntax:"";inherits:false;initial-value:0}@property --tw-border-spacing-y{syntax:"";inherits:false;initial-value:0}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}}@keyframes caret-blink{0%,70%,to{opacity:1}20%,50%{opacity:0}}@keyframes skeleton{to{transform:translate(200%)}} diff --git a/src/gateway/static/dashboard/assets/index-CGnfXTEF.js b/src/gateway/static/dashboard/assets/index-CGnfXTEF.js new file mode 100644 index 00000000..9ba4345a --- /dev/null +++ b/src/gateway/static/dashboard/assets/index-CGnfXTEF.js @@ -0,0 +1,2 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ActivityPage-BFwaR2GB.js","assets/tanstack-query-1t81HyiD.js","assets/react-dgEcD0HR.js","assets/FilterChips-Wo8I8zEd.js","assets/heroui-BI50yK5B.js","assets/recharts-C4kRDmvS.js","assets/tableSelection-9hV37uhu.js","assets/ConfirmDialog-CWW3AYpK.js","assets/DataTable-Bmn_eYSV.js","assets/TablePagination-r1AimUKf.js","assets/AliasesPage-Q7olOjhL.js","assets/Field-Dwp6u3t8.js","assets/BudgetsPage-lTuTS-F9.js","assets/DocsPage-BAH_T1JY.js","assets/KeysPage-bUjPPYgf.js","assets/ModelScopeControl-DmfR9Ylv.js","assets/ModelsPage-BMtuCmJv.js","assets/OverviewPage-CX9hXHG1.js","assets/charts-DIsd9m--.js","assets/ProvidersPage-DQdazSS9.js","assets/SettingsPage-CJyO6zWH.js","assets/ToolsGuardrailsPage-1cTNaDRp.js","assets/UsagePage-BECQyz4e.js","assets/UsersPage-CAU0FXTt.js"])))=>i.map(i=>d[i]); +var _e=Object.defineProperty;var Te=(e,t,n)=>t in e?_e(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var ie=(e,t,n)=>Te(e,typeof t!="symbol"?t+"":t,n);import{u as v,j as r,a as p,b as h,k as Y,Q as Le,c as Ie}from"./tanstack-query-1t81HyiD.js";import{d as Ae,r as i,N as H,O as qe,H as Re,e as De,f as w,h as Oe}from"./react-dgEcD0HR.js";import{B as C,C as M,L as me,I as fe,a as Me,b as Fe,d as D,c as N,T as Ue,e as Ke}from"./heroui-BI50yK5B.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))s(o);new MutationObserver(o=>{for(const a of o)if(a.type==="childList")for(const f of a.addedNodes)f.tagName==="LINK"&&f.rel==="modulepreload"&&s(f)}).observe(document,{childList:!0,subtree:!0});function n(o){const a={};return o.integrity&&(a.integrity=o.integrity),o.referrerPolicy&&(a.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?a.credentials="include":o.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function s(o){if(o.ep)return;o.ep=!0;const a=n(o);fetch(o.href,a)}})();var Be=Ae();const $e="modulepreload",ze=function(e){return"/"+e},oe={},P=function(t,n,s){let o=Promise.resolve();if(n&&n.length>0){let f=function(u){return Promise.all(u.map(b=>Promise.resolve(b).then(x=>({status:"fulfilled",value:x}),x=>({status:"rejected",reason:x}))))};document.getElementsByTagName("link");const m=document.querySelector("meta[property=csp-nonce]"),y=(m==null?void 0:m.nonce)||(m==null?void 0:m.getAttribute("nonce"));o=f(n.map(u=>{if(u=ze(u),u in oe)return;oe[u]=!0;const b=u.endsWith(".css"),x=b?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${u}"]${x}`))return;const d=document.createElement("link");if(d.rel=b?"stylesheet":$e,b||(d.as="script"),d.crossOrigin="",d.href=u,y&&d.setAttribute("nonce",y),document.head.appendChild(d),b)return new Promise((L,q)=>{d.addEventListener("load",L),d.addEventListener("error",()=>q(new Error(`Unable to preload CSS for ${u}`)))})}))}function a(f){const m=new Event("vite:preloadError",{cancelable:!0});if(m.payload=f,window.dispatchEvent(m),!m.defaultPrevented)throw f}return o.then(f=>{for(const m of f||[])m.status==="rejected"&&a(m.reason);return t().catch(a)})};class _ extends Error{constructor(n,s){super(s);ie(this,"status");this.name="ApiError",this.status=n}}let F=null;function le(e){F=e}async function G(e){try{const t=await e.json();if(typeof t.detail=="string")return t.detail;if(t.detail!=null)return JSON.stringify(t.detail)}catch{}return e.statusText||`Request failed (${e.status})`}async function Qe(e){let t;try{t=await fetch("/v1/auth/session",{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({master_key:e})})}catch{throw new _(0,"Network error: could not reach the gateway.")}if(t.status===401||t.status===403)return!1;if(!t.ok)throw new _(t.status,await G(t));return!0}async function Ve(){try{await fetch("/v1/auth/session",{method:"DELETE"})}catch{}}async function l(e,t={}){const n=new Headers(t.headers);n.set("Accept","application/json"),t.body!=null&&!n.has("Content-Type")&&n.set("Content-Type","application/json");let s;try{s=await fetch(e,{...t,headers:n})}catch{throw new _(0,"Network error: could not reach the gateway.")}if(s.status===401||s.status===403)throw F==null||F(),new _(s.status,await G(s));if(!s.ok)throw new _(s.status,await G(s));if(s.status!==204)return await s.json()}const J="otari.dashboard.hasSession",he=i.createContext(null);function We(){try{return window.localStorage.getItem(J)==="1"}catch{return!1}}function He({children:e}){const t=v(),[n,s]=i.useState(We),o=i.useCallback(()=>{Ve(),s(!1),t.clear();try{window.localStorage.removeItem(J)}catch{}},[t]),a=i.useCallback(()=>{t.clear(),s(!0);try{window.localStorage.setItem(J,"1")}catch{}},[t]);i.useEffect(()=>(le(o),()=>le(null)),[o]);const f=i.useMemo(()=>({isAuthenticated:n,login:a,logout:o}),[n,a,o]);return r.jsx(he.Provider,{value:f,children:e})}function X(){const e=i.useContext(he);if(!e)throw new Error("useAuth must be used within an AuthProvider");return e}function Ge(e){return e instanceof _&&e.status===0}function Je(){const e=v(),[t,n]=i.useState(!1);return i.useEffect(()=>{const s=e.getQueryCache(),o=()=>s.getAll().some(a=>a.state.status==="error"&&Ge(a.state.error));return n(o()),s.subscribe(()=>n(o()))},[e]),t}function Ye(){return Je()?r.jsxs("div",{role:"alert","aria-live":"assertive",className:"fixed right-4 bottom-4 z-50 flex max-w-sm items-start gap-2.5 rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700 shadow-lg",children:[r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2","aria-hidden":!0,className:"mt-0.5 h-5 w-5 shrink-0",children:[r.jsx("path",{d:"M12 9v4M12 17h.01",strokeLinecap:"round",strokeLinejoin:"round"}),r.jsx("path",{d:"M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0z",strokeLinejoin:"round"})]}),r.jsxs("span",{children:[r.jsx("strong",{className:"font-semibold",children:"Can’t reach the gateway."})," The backend isn’t responding; data won’t load or save until the connection is restored."]})]}):null}const T="models",K="pricing",xe="settings",ve="tool-settings",Z="aliases",ee="discoverable",te="providers",re="provider-health",ye="stored-providers",Xe="model-metadata",Ze="build",I="keys",A="budgets",ge="users",O="usage",et=6e4,ce=60*6e4;function Xt(){return p({queryKey:[T],queryFn:()=>l("/v1/models"),staleTime:6e4})}function tt(){return p({queryKey:[Ze],queryFn:()=>l("/dashboard-build.json"),refetchInterval:et,refetchOnWindowFocus:!0,staleTime:0,retry:!1})}function Zt(){return p({queryKey:[ee],queryFn:()=>l("/v1/models/discoverable"),staleTime:5*6e4})}function er(){return p({queryKey:[te],queryFn:()=>l("/v1/providers"),staleTime:5*6e4})}function tr(){return p({queryKey:["provider-catalog"],queryFn:()=>l("/v1/providers/catalog"),staleTime:1/0})}function rr(e){return p({queryKey:["provider-catalog",e],queryFn:()=>l(`/v1/providers/catalog/${encodeURIComponent(e)}`),enabled:e!=="",staleTime:1/0})}function nr(){return p({queryKey:[re],queryFn:()=>l("/v1/providers/health"),staleTime:ce,refetchInterval:ce})}function sr(){const e=v();return h({mutationFn:()=>l("/v1/providers/health?refresh=true"),onSuccess:t=>e.setQueryData([re],t)})}function ar(){return p({queryKey:[ye],queryFn:()=>l("/v1/provider-credentials"),staleTime:6e4})}function B(e){e.invalidateQueries({queryKey:[ye]}),e.invalidateQueries({queryKey:[te]}),e.invalidateQueries({queryKey:[T]}),e.invalidateQueries({queryKey:[ee]}),e.invalidateQueries({queryKey:[re]})}function ir(){const e=v();return h({mutationFn:t=>l("/v1/provider-credentials",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>B(e)})}function or(){const e=v();return h({mutationFn:({instance:t,body:n})=>l(`/v1/provider-credentials/${encodeURIComponent(t)}`,{method:"PATCH",body:JSON.stringify(n)}),onSuccess:()=>B(e)})}function lr(){const e=v();return h({mutationFn:t=>l(`/v1/provider-credentials/${encodeURIComponent(t)}`,{method:"DELETE"}),onSuccess:()=>B(e)})}function cr(){const e=v();return h({mutationFn:()=>l("/v1/provider-credentials/reencrypt",{method:"POST"}),onSuccess:()=>B(e)})}function ur(){return h({mutationFn:e=>l(`/v1/provider-credentials/${encodeURIComponent(e)}/test`,{method:"POST"})})}function dr(){return h({mutationFn:e=>l("/v1/provider-credentials/test",{method:"POST",body:JSON.stringify(e)})})}function mr(){return p({queryKey:[Xe],queryFn:()=>l("/v1/models/metadata"),staleTime:10*6e4})}function fr(){return p({queryKey:[Z],queryFn:()=>l("/v1/aliases"),staleTime:6e4})}function hr(){const e=v();return h({mutationFn:t=>l("/v1/aliases",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>{e.invalidateQueries({queryKey:[Z]}),e.invalidateQueries({queryKey:[T]})}})}function xr(){const e=v();return h({mutationFn:t=>l(`/v1/aliases/${encodeURIComponent(t)}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:[Z]}),e.invalidateQueries({queryKey:[T]})}})}function rt(){return p({queryKey:[xe],queryFn:()=>l("/v1/settings"),staleTime:6e4})}function nt(){const e=v();return h({mutationFn:t=>l("/v1/settings",{method:"PATCH",body:JSON.stringify(t)}),onSuccess:t=>{e.setQueryData([xe],t),e.invalidateQueries({queryKey:[T]}),e.invalidateQueries({queryKey:[ee]})}})}function vr(){return h({mutationFn:()=>l("/v1/settings/master-key/rotate",{method:"POST"})})}function yr(){return p({queryKey:[ve],queryFn:()=>l("/v1/tool-settings"),staleTime:6e4})}function gr(){const e=v();return h({mutationFn:t=>l("/v1/tool-settings",{method:"PATCH",body:JSON.stringify(t)}),onSuccess:t=>{e.setQueryData([ve],t)}})}function pr(){return h({mutationFn:({service:e,url:t})=>l(`/v1/tool-settings/${encodeURIComponent(e)}/test`,{method:"POST",body:JSON.stringify({url:t})})})}const $=1e3,st=100;async function at(){const e=[];for(let t=0;tl("/v1/pricing",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>{e.invalidateQueries({queryKey:[K]}),e.invalidateQueries({queryKey:[T]})}})}function wr(){const e=v();return h({mutationFn:t=>l(`/v1/pricing/${encodeURIComponent(t)}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:[K]}),e.invalidateQueries({queryKey:[T]})}})}function Sr(){return h({mutationFn:()=>l("/v1/pricing/refresh",{method:"POST"})})}function kr(){const e=v();return h({mutationFn:()=>l("/v1/pricing/refresh/confirm",{method:"POST"}),onSuccess:()=>{e.invalidateQueries({queryKey:[K]}),e.invalidateQueries({queryKey:[T]}),e.invalidateQueries({queryKey:[te]})}})}function Er(){return h({mutationFn:()=>l("/v1/pricing/refresh/reject",{method:"POST"})})}const z=1e3,it=100;async function ot(){const e=[];for(let t=0;tl("/v1/keys",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>void e.invalidateQueries({queryKey:[I]})})}function Cr(){const e=v();return h({mutationFn:({id:t,body:n})=>l(`/v1/keys/${encodeURIComponent(t)}`,{method:"PATCH",body:JSON.stringify(n)}),onSuccess:()=>void e.invalidateQueries({queryKey:[I]})})}function _r(){const e=v();return h({mutationFn:t=>l(`/v1/keys/${encodeURIComponent(t)}/rotate`,{method:"POST"}),onSuccess:()=>void e.invalidateQueries({queryKey:[I]})})}function Tr(){const e=v();return h({mutationFn:t=>l(`/v1/keys/${encodeURIComponent(t)}`,{method:"DELETE"}),onSuccess:()=>void e.invalidateQueries({queryKey:[I]})})}const Q=1e3,lt=100;async function ct(){const e=[];for(let t=0;tl(`/v1/budgets/${encodeURIComponent(e)}/reset-logs`),enabled:e!==null,staleTime:6e4})}function Ar(){const e=v();return h({mutationFn:t=>l("/v1/budgets",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>void e.invalidateQueries({queryKey:[A]})})}function qr(){const e=v();return h({mutationFn:({id:t,body:n})=>l(`/v1/budgets/${encodeURIComponent(t)}`,{method:"PATCH",body:JSON.stringify(n)}),onSuccess:()=>void e.invalidateQueries({queryKey:[A]})})}function Rr(){const e=v();return h({mutationFn:t=>l(`/v1/budgets/${encodeURIComponent(t)}`,{method:"DELETE"}),onSuccess:()=>void e.invalidateQueries({queryKey:[A]})})}const V=1e3,ut=100;async function dt(){const e=[];for(let t=0;tl("/v1/users",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>ne(e)})}function Mr(){const e=v();return h({mutationFn:({id:t,body:n})=>l(`/v1/users/${encodeURIComponent(t)}`,{method:"PATCH",body:JSON.stringify(n)}),onSuccess:()=>ne(e)})}function Fr(){const e=v();return h({mutationFn:t=>l(`/v1/users/${encodeURIComponent(t)}`,{method:"DELETE"}),onSuccess:()=>{ne(e),e.invalidateQueries({queryKey:[I]})}})}function se(e){const t=new URLSearchParams;return e.start_date&&t.set("start_date",e.start_date),e.end_date&&t.set("end_date",e.end_date),e.status&&t.set("status",e.status),e.model&&t.set("model",e.model),e.endpoint&&t.set("endpoint",e.endpoint),e.user_id&&t.set("user_id",e.user_id),e.api_key_id&&t.set("api_key_id",e.api_key_id),e.source&&t.set("source",e.source),e.priced!==void 0&&t.set("priced",String(e.priced)),e.counts_toward_budget!==void 0&&t.set("counts_toward_budget",String(e.counts_toward_budget)),t}function Ur(e,t,n){return p({queryKey:[O,"list",e,t,n],queryFn:()=>{const s=se(e);return s.set("skip",String(t*n)),s.set("limit",String(n)),l(`/v1/usage?${s.toString()}`)},placeholderData:Y,staleTime:1e4})}function Kr(e,t=!0){return p({queryKey:[O,"count",e],queryFn:()=>l(`/v1/usage/count?${se(e).toString()}`),enabled:t,placeholderData:Y,staleTime:1e4})}function Br(){const e=v();return h({mutationFn:t=>l("/v1/usage",{method:"DELETE",body:JSON.stringify(t)}),onSuccess:()=>{e.invalidateQueries({queryKey:[O]})}})}function $r(){const e=v();return h({mutationFn:t=>l("/v1/usage/set-price",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>{e.invalidateQueries({queryKey:[O]})}})}function zr(e,t,n=!0){return p({queryKey:[O,"summary",e,t],queryFn:()=>{const s=se(e);return s.set("bucket",t),l(`/v1/usage/summary?${s.toString()}`)},enabled:n,placeholderData:Y,staleTime:3e4})}function Qr(e){return e==null?"0":new Intl.NumberFormat("en-US").format(e)}function Vr(e){if(e==null)return"$0.00";const t=e!==0&&Math.abs(e)<.01?4:2;return new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",minimumFractionDigits:2,maximumFractionDigits:t}).format(e)}function Wr(e){if(e==null)return"—";if(e>=1e6){const t=e/1e6;return`${Number.isInteger(t)?t:t.toFixed(1)}M`}if(e>=1e3){const t=Math.round(e/1e3);return t>=1e3?"1M":`${t}K`}return String(e)}const mt=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function Hr(e){if(!e)return"—";const t=/^(\d{4})-(\d{2})/.exec(e);if(!t)return e;const n=Number(t[2])-1;return n<0||n>11?t[1]:`${mt[n]} ${t[1]}`}const ft=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",maximumFractionDigits:2});function Gr(e){return ft.format(e)}function Jr(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function ht(e){return`${(e*100).toFixed(1)}%`}function Yr(e,t){return t===void 0||t===0?null:(e-t)/t}function xt(e,t=Date.now()){if(!e)return"never";const n=new Date(e);if(Number.isNaN(n.getTime()))return e;const s=Math.round((t-n.getTime())/1e3),o=s<0,a=Math.abs(s),f=[["second",60],["minute",60],["hour",24],["day",30],["month",12],["year",Number.POSITIVE_INFINITY]];let m=a,y="second";for(const[b,x]of f){if(y=b,m0?"▲":e<0?"▼":"•";return r.jsxs("span",{className:"text-[var(--otari-muted)]",children:[t," ",ht(Math.abs(e))," vs prev"]})}function vt(e){return e instanceof _||e instanceof Error?e.message:"Something went wrong."}function yt({error:e}){return e?r.jsx("div",{role:"alert",className:"rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700",children:vt(e)}):null}function gt({tone:e="info",children:t}){const n=e==="warning"?"border-amber-200 bg-amber-50 text-amber-800":"border-[var(--otari-brand)] bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]";return r.jsx("div",{className:`rounded-lg border px-4 py-3 text-sm ${n}`,children:t})}function en({title:e,description:t,action:n}){return r.jsxs("div",{className:"flex flex-col gap-3",children:[r.jsxs("div",{children:[r.jsx("h1",{className:"text-xl font-semibold text-[var(--otari-ink)]",children:e}),t?r.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:t}):null]}),n?r.jsx("div",{className:"flex flex-wrap gap-2",children:n}):null]})}function pt(e){const[t,n]=i.useState(()=>Date.now());return i.useEffect(()=>{let s;const o=()=>{s===void 0&&(s=setInterval(()=>n(Date.now()),e))},a=()=>{s!==void 0&&(clearInterval(s),s=void 0)},f=()=>{n(Date.now()),document.visibilityState==="visible"?o():a()};return f(),document.addEventListener("visibilitychange",f),()=>{a(),document.removeEventListener("visibilitychange",f)}},[e]),t}function tn({onRefresh:e,isFetching:t=!1,updatedAt:n,label:s="Refresh"}){const o=pt(15e3),a=n?xt(new Date(n).toISOString(),o):null;return r.jsxs("span",{className:"inline-flex items-center gap-2",children:[a?r.jsxs("span",{className:"text-xs text-[var(--otari-muted)]",children:["Updated ",a]}):null,r.jsx(C,{variant:"outline",size:"sm",isIconOnly:!0,isDisabled:t,onPress:e,"aria-label":s,children:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:`h-4 w-4 ${t?"animate-spin":""}`,"aria-hidden":"true",children:[r.jsx("path",{d:"M20 11a8 8 0 1 0-.5 4",strokeLinecap:"round",strokeLinejoin:"round"}),r.jsx("path",{d:"M20 4v5h-5",strokeLinecap:"round",strokeLinejoin:"round"})]})})]})}function rn({children:e,confirmLabel:t,onConfirm:n,isPending:s}){const[o,a]=i.useState(!1);return o?r.jsxs("span",{className:"inline-flex items-center gap-1",children:[r.jsx(C,{size:"sm",variant:"danger",isDisabled:s,onPress:n,children:t}),r.jsx(C,{size:"sm",variant:"ghost",isDisabled:s,onPress:()=>a(!1),children:"Cancel"})]}):r.jsx(C,{size:"sm",variant:"danger-soft",onPress:()=>a(!0),children:e})}const bt="rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-3 py-2 text-sm text-[var(--otari-ink)] focus:border-[var(--otari-brand)] focus:outline-none";function nn({id:e,label:t,ariaLabel:n,value:s,onChange:o,options:a,children:f,disabled:m}){const y=i.useId(),u=e??(t?y:void 0),b=r.jsx("select",{id:u,"aria-label":t?void 0:n,value:s,disabled:m,onChange:x=>o(x.target.value),className:bt,children:a?a.map(x=>r.jsx("option",{value:x.value,children:x.label},x.value)):f});return t?r.jsxs("div",{className:"flex flex-col gap-1",children:[r.jsx("label",{htmlFor:u,className:"text-xs font-medium text-[var(--otari-muted)]",children:t}),b]}):b}function sn({label:e,value:t,onChange:n,options:s,placeholder:o,maxVisible:a=50,allowsCustom:f=!1}){const m=d=>{var L;return((L=s.find(q=>q.value===d))==null?void 0:L.label)??d},[y,u]=i.useState(()=>m(t));i.useEffect(()=>{u(m(t))},[t]);const b=y.trim().toLowerCase(),x=s.filter(d=>!b||d.value.toLowerCase().includes(b)||d.label.toLowerCase().includes(b)).slice(0,a);return r.jsxs(M.Root,{allowsEmptyCollection:!0,allowsCustomValue:f,menuTrigger:"focus",inputValue:y,onInputChange:d=>{u(d),f?n(d.trim()):d.trim()===""&&n("")},onSelectionChange:d=>{d!=null&&n(String(d))},className:"flex flex-col gap-1",children:[r.jsx(me,{className:"text-xs font-medium text-[var(--otari-muted)]",children:e}),r.jsxs(M.InputGroup,{children:[r.jsx(fe,{placeholder:o,autoComplete:"off",onFocus:d=>d.currentTarget.select()}),r.jsx(M.Trigger,{})]}),r.jsx(M.Popover,{children:r.jsx(Me,{items:x,className:"max-h-72 overflow-auto",children:d=>r.jsx(Fe,{id:d.value,textValue:d.label,children:d.label})})})]})}function jt(){var a;const e=rt(),t=nt(),[n,s]=i.useState(!1);return!(((a=e.data)==null?void 0:a.require_pricing)===!0&&e.data.default_pricing===!1)||n?null:r.jsx("div",{className:"shrink-0 px-6 pt-3",children:r.jsx(gt,{tone:"warning",children:r.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[r.jsxs("span",{children:["Requests are rejected until pricing is set (",r.jsx("code",{children:"require_pricing"})," is on). Enable default pricing to meter new models with public rates right away."]}),r.jsxs("span",{className:"flex items-center gap-2",children:[r.jsx(C,{size:"sm",variant:"primary",isDisabled:t.isPending,onPress:()=>t.mutate({default_pricing:!0}),children:t.isPending?"Enabling…":"Enable default pricing"}),r.jsx(C,{size:"sm",variant:"ghost",onPress:()=>s(!0),children:"Dismiss"})]})]})})})}function wt(){const{data:e}=tt(),t=i.useRef(null);return e&&t.current===null&&(t.current=e.build),e!=null&&t.current!=null&&e.build!==t.current}function St(){const e=wt(),[t,n]=i.useState(!1);return!e||t?null:r.jsx("div",{className:"pointer-events-none absolute inset-x-0 top-0 z-50 flex justify-center",children:r.jsxs("div",{role:"status",className:"pointer-events-auto mt-1.5 flex items-center gap-3 rounded-full border border-[var(--otari-brand)] bg-[var(--otari-brand-tint)] py-1.5 pr-1.5 pl-4 text-sm text-[var(--otari-brand-dark)] shadow-md",children:[r.jsxs("span",{children:[r.jsx("strong",{className:"font-semibold",children:"An update is available."})," Reloading keeps you signed in."]}),r.jsx(C,{size:"sm",variant:"primary",onPress:()=>window.location.reload(),children:"Update now"}),r.jsx(C,{size:"sm",variant:"ghost",onPress:()=>n(!0),children:"Later"})]})})}const pe=200,be=480,W=240,kt=60,je="otari.dashboard.sidebarWidth",we="otari.dashboard.sidebarCollapsed",de=16,Se="(max-width: 767px)",U=e=>Math.min(be,Math.max(pe,e));function Et(){return typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia(Se).matches}const Pt='a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"])';function Nt(e){return e?Array.from(e.querySelectorAll(Pt)).filter(t=>t.offsetParent!==null||t===document.activeElement):[]}function Ct(){if(typeof window>"u")return W;try{const e=window.localStorage.getItem(je),t=e?Number.parseInt(e,10):Number.NaN;return Number.isNaN(t)?W:U(t)}catch{return W}}function _t(){if(typeof window>"u")return!1;try{return window.localStorage.getItem(we)==="1"}catch{return!1}}const Tt=[{key:"home"},{key:"observability",label:"Observability"},{key:"catalog",label:"Catalog"},{key:"access",label:"Access"},{key:"system"}],Lt=[{to:"/",section:"home",label:"Overview",end:!0,icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("rect",{x:"3.5",y:"3.5",width:"7",height:"7",rx:"1.5",strokeLinejoin:"round"}),r.jsx("rect",{x:"13.5",y:"3.5",width:"7",height:"7",rx:"1.5",strokeLinejoin:"round"}),r.jsx("rect",{x:"3.5",y:"13.5",width:"7",height:"7",rx:"1.5",strokeLinejoin:"round"}),r.jsx("rect",{x:"13.5",y:"13.5",width:"7",height:"7",rx:"1.5",strokeLinejoin:"round"})]})},{to:"/activity",section:"observability",label:"Activity",icon:r.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:r.jsx("path",{d:"M3 12h4l2.5-6 4 12 2.5-6H21",strokeLinecap:"round",strokeLinejoin:"round"})})},{to:"/usage",section:"observability",label:"Usage",icon:r.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:r.jsx("path",{d:"M4 20V10M10 20V4M16 20v-7M22 20H2",strokeLinecap:"round",strokeLinejoin:"round"})})},{to:"/providers",section:"catalog",label:"Providers",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("rect",{x:"3.5",y:"4.5",width:"17",height:"6",rx:"1.5",strokeLinejoin:"round"}),r.jsx("rect",{x:"3.5",y:"13.5",width:"17",height:"6",rx:"1.5",strokeLinejoin:"round"}),r.jsx("path",{d:"M7 7.5h.01M7 16.5h.01",strokeLinecap:"round",strokeLinejoin:"round"})]})},{to:"/users",section:"access",label:"Users",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("circle",{cx:"9",cy:"8",r:"3.2",strokeLinejoin:"round"}),r.jsx("path",{d:"M3.5 19a5.5 5.5 0 0 1 11 0",strokeLinecap:"round",strokeLinejoin:"round"}),r.jsx("path",{d:"M16 5.2a3.2 3.2 0 0 1 0 5.6M17.5 19a5.5 5.5 0 0 0-3-4.9",strokeLinecap:"round",strokeLinejoin:"round"})]})},{to:"/keys",section:"access",label:"API keys",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("circle",{cx:"7.5",cy:"15.5",r:"3.5"}),r.jsx("path",{d:"M10 13l7-7M14 5l3 3M16.5 7.5l2-2",strokeLinecap:"round",strokeLinejoin:"round"})]})},{to:"/budgets",section:"access",label:"Budgets",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("path",{d:"M3 7.5A1.5 1.5 0 0 1 4.5 6H18a1.5 1.5 0 0 1 1.5 1.5V9",strokeLinejoin:"round"}),r.jsx("rect",{x:"3",y:"7.5",width:"18",height:"12",rx:"1.5",strokeLinejoin:"round"}),r.jsx("path",{d:"M16 13.5h.01",strokeLinecap:"round",strokeLinejoin:"round"}),r.jsx("path",{d:"M21 12v3h-3.5a1.5 1.5 0 0 1 0-3H21z",strokeLinejoin:"round"})]})},{to:"/models",section:"catalog",label:"Models",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("path",{d:"M12 3l8 4.5v9L12 21l-8-4.5v-9L12 3z",strokeLinejoin:"round"}),r.jsx("path",{d:"M12 12l8-4.5M12 12v9M12 12L4 7.5",strokeLinejoin:"round"})]})},{to:"/aliases",section:"catalog",label:"Aliases",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("path",{d:"M20.6 13.4L13.4 20.6a2 2 0 0 1-2.8 0l-7-7A2 2 0 0 1 3 12.2V5a2 2 0 0 1 2-2h7.2a2 2 0 0 1 1.4.6l7 7a2 2 0 0 1 0 2.8z",strokeLinejoin:"round"}),r.jsx("circle",{cx:"7.5",cy:"7.5",r:"1.5"})]})},{to:"/tools",section:"system",label:"Tools & Guardrails",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("path",{d:"M14.7 6.3a4 4 0 0 1 5 5l-8.4 8.4a2 2 0 0 1-2.8 0l-2.2-2.2a2 2 0 0 1 0-2.8z",strokeLinejoin:"round"}),r.jsx("path",{d:"M12 9 5 16",strokeLinecap:"round"})]})},{to:"/settings",section:"system",label:"Settings",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("circle",{cx:"12",cy:"12",r:"3"}),r.jsx("path",{d:"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z",strokeLinejoin:"round"})]})}];function It(){const{logout:e}=X(),t=i.useRef(null),n=i.useRef(null),[s,o]=i.useState(Ct),[a,f]=i.useState(_t),[m,y]=i.useState(!1),[u,b]=i.useState(Et),[x,d]=i.useState(!1);i.useEffect(()=>{if(typeof window>"u"||typeof window.matchMedia!="function")return;const c=window.matchMedia(Se),g=j=>{b(j.matches),j.matches||d(!1)};return typeof c.addEventListener=="function"?(c.addEventListener("change",g),()=>c.removeEventListener("change",g)):(c.addListener(g),()=>c.removeListener(g))},[]),i.useEffect(()=>{if(!x)return;const c=g=>{g.key==="Escape"&&d(!1)};return window.addEventListener("keydown",c),()=>window.removeEventListener("keydown",c)},[x]),i.useEffect(()=>{var c,g,j;u&&(x?(c=t.current)==null||c.focus():(g=t.current)!=null&&g.contains(document.activeElement)&&((j=n.current)==null||j.focus()))},[u,x]);const L=i.useCallback(c=>{if(c.key!=="Tab")return;const g=Nt(t.current);if(g.length===0)return;const j=g[0],k=g[g.length-1],R=document.activeElement;c.shiftKey&&(R===j||R===t.current)?(c.preventDefault(),k.focus()):!c.shiftKey&&R===k&&(c.preventDefault(),j.focus())},[]);i.useEffect(()=>{const c=window.setTimeout(()=>{try{window.localStorage.setItem(je,String(Math.round(s)))}catch{}},200);return()=>window.clearTimeout(c)},[s]),i.useEffect(()=>{try{window.localStorage.setItem(we,a?"1":"0")}catch{}},[a]);const q=i.useCallback(c=>{c.preventDefault(),c.currentTarget.setPointerCapture(c.pointerId),y(!0)},[]),Ee=i.useCallback(c=>{var j;if(!c.currentTarget.hasPointerCapture(c.pointerId))return;const g=((j=t.current)==null?void 0:j.getBoundingClientRect().left)??0;o(U(c.clientX-g))},[]),Pe=i.useCallback(c=>{c.currentTarget.hasPointerCapture(c.pointerId)&&c.currentTarget.releasePointerCapture(c.pointerId),y(!1)},[]),Ne=i.useCallback(c=>{c.key==="ArrowLeft"?(c.preventDefault(),o(g=>U(g-de))):c.key==="ArrowRight"&&(c.preventDefault(),o(g=>U(g+de)))},[]),Ce=a?kt:s,S=u?!1:a,ae=u&&x?!0:void 0;return r.jsxs("div",{className:N("relative flex h-full flex-col overflow-hidden",m&&"cursor-col-resize select-none"),children:[r.jsxs("header",{inert:ae,className:"flex shrink-0 items-center justify-between border-b border-[var(--otari-line)] bg-[var(--otari-surface)] px-5 py-3",children:[r.jsxs("div",{className:"flex items-center gap-2.5",children:[r.jsx("button",{type:"button",ref:n,onClick:()=>d(c=>!c),"aria-label":x?"Close navigation":"Open navigation","aria-expanded":x,"aria-controls":"app-sidebar",className:"-ml-1 flex h-8 w-8 items-center justify-center rounded-lg text-[var(--otari-muted)] transition-colors hover:bg-[var(--otari-bg)] hover:text-[var(--otari-ink)] md:hidden",children:r.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5",children:r.jsx("path",{d:"M4 6h16M4 12h16M4 18h16",strokeLinecap:"round",strokeLinejoin:"round"})})}),r.jsx("img",{src:"/favicon.svg",alt:"",className:"h-7 w-7 shrink-0"}),r.jsx("span",{className:"text-base font-semibold text-[var(--otari-ink)]",children:"Otari"})]}),r.jsx(C,{size:"sm",variant:"outline",onPress:e,"aria-label":"Sign out",children:"Sign out"})]}),r.jsx(St,{}),r.jsx(Ye,{}),r.jsx(jt,{}),r.jsxs("div",{className:"flex min-h-0 flex-1",children:[u&&x?r.jsx("div",{"aria-hidden":"true",onClick:()=>d(!1),className:"fixed inset-0 z-30 bg-black/40 md:hidden"}):null,r.jsxs("aside",{ref:t,id:"app-sidebar",role:u?"dialog":void 0,"aria-modal":u&&x?!0:void 0,"aria-label":u?"Navigation":void 0,tabIndex:u?-1:void 0,inert:u&&!x?!0:void 0,onKeyDown:u&&x?L:void 0,style:u?void 0:{width:Ce},className:N("flex flex-col border-r border-[var(--otari-line)] bg-[var(--otari-surface)] focus:outline-none",u?N("fixed inset-y-0 left-0 z-40 w-[17rem] shadow-xl transition-transform duration-200",x?"translate-x-0":"-translate-x-full"):N("relative shrink-0",!m&&"transition-[width] duration-150")),children:[r.jsx("button",{type:"button",onClick:()=>f(c=>!c),"aria-label":a?"Expand sidebar":"Collapse sidebar","aria-pressed":a,title:a?"Expand sidebar":"Collapse sidebar",className:"absolute -right-3 top-4 z-30 hidden h-6 w-6 items-center justify-center rounded-full border border-[var(--otari-line)] bg-[var(--otari-surface)] text-[var(--otari-muted)] shadow-sm transition-colors hover:border-[var(--otari-brand)] hover:text-[var(--otari-brand-dark)] md:flex",children:r.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",className:N("h-3.5 w-3.5 transition-transform",a&&"rotate-180"),children:r.jsx("path",{d:"M15 6l-6 6 6 6",strokeLinecap:"round",strokeLinejoin:"round"})})}),r.jsx("nav",{className:N("flex flex-col py-4",S?"px-2":"px-3"),children:Tt.map((c,g)=>{const j=Lt.filter(k=>k.section===c.key);return j.length===0?null:r.jsxs("div",{className:g>0?"mt-4":void 0,children:[!S&&c.label?r.jsx("div",{className:"px-3 pb-1 text-[11px] font-semibold tracking-wider text-[var(--otari-muted)] uppercase",children:c.label}):null,g>0&&(S||!c.label)?r.jsx("div",{className:"mx-1 mb-2 border-t border-[var(--otari-line)]"}):null,r.jsx("div",{className:"flex flex-col gap-1",children:j.map(k=>r.jsxs(H,{to:k.to,end:k.end,onClick:()=>d(!1),"aria-label":S?k.label:void 0,title:S?k.label:void 0,className:({isActive:R})=>N("flex items-center rounded-lg py-2 text-sm font-medium transition-colors",S?"justify-center px-0":"gap-3 px-3",R?"bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]":"text-[var(--otari-muted)] hover:bg-[var(--otari-bg)] hover:text-[var(--otari-ink)]"),children:[k.icon,S?null:k.label]},k.to))})]},c.key)})}),r.jsxs("div",{className:"mt-auto flex flex-col gap-1 pb-3",children:[r.jsxs(H,{to:"/docs",onClick:()=>d(!1),"aria-label":S?"User guide":void 0,title:S?"User guide":void 0,className:({isActive:c})=>N("flex items-center rounded-lg py-2 text-sm font-medium transition-colors",S?"mx-2 justify-center px-0":"mx-3 gap-3 px-3",c?"bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]":"text-[var(--otari-muted)] hover:bg-[var(--otari-bg)] hover:text-[var(--otari-ink)]"),children:[r.jsxs("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("path",{d:"M12 6.5C10.5 5 8 4.5 4 4.5V18c4 0 6.5.5 8 2 1.5-1.5 4-2 8-2V4.5c-4 0-6.5.5-8 2z",strokeLinejoin:"round"}),r.jsx("path",{d:"M12 6.5V20",strokeLinecap:"round"})]}),S?null:"User guide"]}),r.jsxs("a",{href:"https://otari.ai",target:"_blank",rel:"noreferrer",title:"otari.ai — the hosted Otari gateway",className:N("flex items-center rounded-lg py-2 text-xs font-medium text-[var(--otari-muted)] transition-colors hover:bg-[var(--otari-bg)] hover:text-[var(--otari-brand-dark)]",S?"mx-2 justify-center px-0":"mx-3 gap-2 px-3"),children:[r.jsx("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-4 w-4 shrink-0",children:r.jsx("path",{d:"M18 10h-1.26A8 8 0 1 0 9 20h9a5 5 0 0 0 0-10z",strokeLinejoin:"round"})}),S?null:r.jsxs("span",{className:"flex-1",children:["otari.ai ",r.jsx("span",{"aria-hidden":!0,children:"↗"})]})]})]}),a||u?null:r.jsx("div",{role:"separator","aria-orientation":"vertical","aria-label":"Resize sidebar","aria-valuenow":Math.round(s),"aria-valuemin":pe,"aria-valuemax":be,tabIndex:0,onPointerDown:q,onPointerMove:Ee,onPointerUp:Pe,onKeyDown:Ne,className:N("absolute top-0 right-0 z-10 h-full w-1.5 cursor-col-resize touch-none transition-colors","hover:bg-[var(--otari-brand)] focus-visible:bg-[var(--otari-brand)] focus:outline-none",m?"bg-[var(--otari-brand)]":"bg-transparent")})]}),r.jsx("main",{inert:ae,className:"flex-1 overflow-y-auto",children:r.jsx("div",{className:"mx-auto flex max-w-[1800px] flex-col gap-6 px-4 py-5 md:px-6 md:py-6",children:r.jsx(qe,{})})})]})]})}function At(){const{login:e}=X(),[t,n]=i.useState(""),[s,o]=i.useState(null),[a,f]=i.useState(!1),m=async()=>{const y=t.trim();if(!(!y||a)){f(!0),o(null);try{await Qe(y)?e():o(new Error("Invalid master key."))}catch(u){o(u)}finally{f(!1)}}};return r.jsx("div",{className:"flex min-h-full items-center justify-center p-6",children:r.jsx(D,{className:"w-full max-w-md",children:r.jsxs(D.Content,{className:"flex flex-col gap-5 p-7",children:[r.jsxs("div",{className:"flex flex-col items-center gap-3 text-center",children:[r.jsx("img",{src:"/favicon.svg",alt:"Otari",className:"h-12 w-12"}),r.jsxs("div",{children:[r.jsx("h1",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:"Otari Dashboard"}),r.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:"Sign in with your master key to browse models, set pricing, and manage settings."})]})]}),r.jsxs("form",{className:"flex flex-col gap-4",onSubmit:y=>{y.preventDefault(),m()},children:[r.jsxs(Ue,{value:t,onChange:y=>{n(y),s&&o(null)},type:"password",isRequired:!0,className:"flex flex-col gap-1",children:[r.jsx(me,{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Master key"}),r.jsx(fe,{placeholder:"otari-mk-… or your master key",autoFocus:!0,autoComplete:"off"})]}),r.jsxs("details",{className:"text-xs text-[var(--otari-muted)]",children:[r.jsx("summary",{className:"cursor-pointer font-medium text-[var(--otari-brand-dark)]",children:"First run? Where to find your key"}),r.jsxs("p",{className:"mt-2 leading-relaxed",children:["If you did not set ",r.jsx("code",{children:"OTARI_MASTER_KEY"}),", Otari generated one and printed it to the server logs on startup. Look for the line ",r.jsx("code",{children:"Your master key:"})," (for example, run"," ",r.jsx("code",{children:"docker logs "}),") and paste it above."]})]}),r.jsx(yt,{error:s}),r.jsx(C,{type:"submit",variant:"primary",fullWidth:!0,isDisabled:!t.trim()||a,children:a?"Signing in…":"Sign in"})]}),r.jsx("p",{className:"text-center text-xs text-[var(--otari-muted)]",children:"The key is sent once to this gateway and exchanged for a session cookie; it is never stored in the browser."}),r.jsx("div",{className:"border-t border-[var(--otari-line)] pt-4 text-center",children:r.jsx(Ke,{href:"/welcome",className:"text-sm font-medium text-[var(--otari-brand-dark)]",children:"New to Otari? Open the welcome guide"})})]})})})}const qt=i.lazy(async()=>({default:(await P(async()=>{const{ActivityPage:e}=await import("./ActivityPage-BFwaR2GB.js");return{ActivityPage:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]))).ActivityPage})),Rt=i.lazy(async()=>({default:(await P(async()=>{const{AliasesPage:e}=await import("./AliasesPage-Q7olOjhL.js");return{AliasesPage:e}},__vite__mapDeps([10,1,2,6,4,7,8,11]))).AliasesPage})),Dt=i.lazy(async()=>({default:(await P(async()=>{const{BudgetsPage:e}=await import("./BudgetsPage-lTuTS-F9.js");return{BudgetsPage:e}},__vite__mapDeps([12,1,2,6,4,7,8,11]))).BudgetsPage})),Ot=i.lazy(async()=>({default:(await P(async()=>{const{DocsPage:e}=await import("./DocsPage-BAH_T1JY.js");return{DocsPage:e}},__vite__mapDeps([13,1,2,4]))).DocsPage})),Mt=i.lazy(async()=>({default:(await P(async()=>{const{KeysPage:e}=await import("./KeysPage-bUjPPYgf.js");return{KeysPage:e}},__vite__mapDeps([14,1,2,6,4,7,8,11,15]))).KeysPage})),Ft=i.lazy(async()=>({default:(await P(async()=>{const{ModelsPage:e}=await import("./ModelsPage-BMtuCmJv.js");return{ModelsPage:e}},__vite__mapDeps([16,1,2,6,4,8,9]))).ModelsPage})),Ut=i.lazy(async()=>({default:(await P(async()=>{const{OverviewIndex:e}=await import("./OverviewPage-CX9hXHG1.js");return{OverviewIndex:e}},__vite__mapDeps([17,1,2,18,5,4,8]))).OverviewIndex})),Kt=i.lazy(async()=>({default:(await P(async()=>{const{ProvidersPage:e}=await import("./ProvidersPage-DQdazSS9.js");return{ProvidersPage:e}},__vite__mapDeps([19,1,2,11,4,8]))).ProvidersPage})),Bt=i.lazy(async()=>({default:(await P(async()=>{const{SettingsPage:e}=await import("./SettingsPage-CJyO6zWH.js");return{SettingsPage:e}},__vite__mapDeps([20,1,2,4]))).SettingsPage})),$t=i.lazy(async()=>({default:(await P(async()=>{const{ToolsGuardrailsPage:e}=await import("./ToolsGuardrailsPage-1cTNaDRp.js");return{ToolsGuardrailsPage:e}},__vite__mapDeps([21,1,2,4]))).ToolsGuardrailsPage})),zt=i.lazy(async()=>({default:(await P(async()=>{const{UsagePage:e}=await import("./UsagePage-BECQyz4e.js");return{UsagePage:e}},__vite__mapDeps([22,1,2,3,4,5,6,18,7,8,9]))).UsagePage})),Qt=i.lazy(async()=>({default:(await P(async()=>{const{UsersPage:e}=await import("./UsersPage-CAU0FXTt.js");return{UsersPage:e}},__vite__mapDeps([23,1,2,6,4,7,8,11,15]))).UsersPage}));function E(e){return r.jsx(i.Suspense,{fallback:r.jsx("div",{role:"status",children:"Loading page…"}),children:e})}function Vt(){const{isAuthenticated:e}=X();return e?r.jsx(Re,{children:r.jsx(De,{children:r.jsxs(w,{element:r.jsx(It,{}),children:[r.jsx(w,{index:!0,element:E(r.jsx(Ut,{}))}),r.jsx(w,{path:"providers",element:E(r.jsx(Kt,{}))}),r.jsx(w,{path:"keys",element:E(r.jsx(Mt,{}))}),r.jsx(w,{path:"users",element:E(r.jsx(Qt,{}))}),r.jsx(w,{path:"budgets",element:E(r.jsx(Dt,{}))}),r.jsx(w,{path:"activity",element:E(r.jsx(qt,{}))}),r.jsx(w,{path:"usage",element:E(r.jsx(zt,{}))}),r.jsx(w,{path:"models",element:E(r.jsx(Ft,{}))}),r.jsx(w,{path:"aliases",element:E(r.jsx(Rt,{}))}),r.jsx(w,{path:"tools",element:E(r.jsx($t,{}))}),r.jsx(w,{path:"settings",element:E(r.jsx(Bt,{}))}),r.jsx(w,{path:"docs",element:E(r.jsx(Ot,{}))}),r.jsx(w,{path:"*",element:r.jsx(Oe,{to:"/",replace:!0})})]})})}):r.jsx(At,{})}function Wt({children:e}){const[t]=i.useState(()=>new Le({defaultOptions:{queries:{refetchOnWindowFocus:!1,retry:(n,s)=>s instanceof _&&(s.status===401||s.status===403)?!1:n<2}}}));return r.jsx(Ie,{client:t,children:r.jsx(He,{children:e})})}const ke=document.getElementById("root");if(!ke)throw new Error("Root element #root not found");Be.createRoot(ke).render(r.jsx(i.StrictMode,{children:r.jsx(Wt,{children:r.jsx(Vt,{})})}));export{ir as $,Wr as A,wr as B,rn as C,vt as D,yt as E,nn as F,Hr as G,rt as H,gt as I,Vr as J,er as K,nr as L,Yr as M,Gr as N,Zr as O,en as P,Qr as Q,tn as R,Xr as S,ht as T,xt as U,ar as V,lr as W,ur as X,nt as Y,or as Z,sr as _,Pr as a,rr as a0,tr as a1,dr as a2,Sr as a3,kr as a4,Er as a5,vr as a6,cr as a7,yr as a8,gr as a9,pr as aa,Jr as ab,Fr as ac,Or as ad,Ur as b,Kr as c,zr as d,Br as e,$r as f,sn as g,Zt as h,fr as i,xr as j,hr as k,Lr as l,Ar as m,qr as n,Rr as o,Mr as p,Ir as q,Cr as r,_r as s,Tr as t,Dr as u,Nr as v,Xt as w,br as x,mr as y,jr as z}; diff --git a/src/gateway/static/dashboard/assets/index-CI2beHfq.js b/src/gateway/static/dashboard/assets/index-CI2beHfq.js deleted file mode 100644 index f8d8858a..00000000 --- a/src/gateway/static/dashboard/assets/index-CI2beHfq.js +++ /dev/null @@ -1,2 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ActivityPage-RaXV2Jg6.js","assets/tanstack-query-1t81HyiD.js","assets/react-dgEcD0HR.js","assets/heroui-DZj66Arc.js","assets/tableSelection-CojkFPwd.js","assets/ConfirmDialog-nzYO6eyy.js","assets/DataTable-CrQq0sYf.js","assets/TablePagination-ByewydW5.js","assets/AliasesPage-CX3eAAXN.js","assets/Field-DEJ6Wjg9.js","assets/BudgetsPage-2_kce_tq.js","assets/DocsPage-C8AK643M.js","assets/KeysPage-CaQTAd2N.js","assets/ModelScopeControl-L-_tKOtj.js","assets/ModelsPage-Cw8Xv_w2.js","assets/OverviewPage-Deh5RtuT.js","assets/charts-CuOShutR.js","assets/recharts-D7kuKp97.js","assets/ProvidersPage-BRR1ZEsl.js","assets/SettingsPage-CDoI9NPf.js","assets/ToolsGuardrailsPage-bas8EytO.js","assets/UsagePage-BD35XJZn.js","assets/UsersPage-CbRblpp_.js"])))=>i.map(i=>d[i]); -var _e=Object.defineProperty;var Te=(e,t,n)=>t in e?_e(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var ie=(e,t,n)=>Te(e,typeof t!="symbol"?t+"":t,n);import{u as v,j as r,a as p,b as f,k as Y,Q as Le,c as Ae}from"./tanstack-query-1t81HyiD.js";import{d as Ie,r as a,N as W,O as qe,H as Re,e as Oe,f as w,h as De}from"./react-dgEcD0HR.js";import{C as M,L as me,I as fe,a as Me,b as Fe,B as C,d as O,c as N,T as Ue,e as Ke}from"./heroui-DZj66Arc.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const c of document.querySelectorAll('link[rel="modulepreload"]'))s(c);new MutationObserver(c=>{for(const i of c)if(i.type==="childList")for(const x of i.addedNodes)x.tagName==="LINK"&&x.rel==="modulepreload"&&s(x)}).observe(document,{childList:!0,subtree:!0});function n(c){const i={};return c.integrity&&(i.integrity=c.integrity),c.referrerPolicy&&(i.referrerPolicy=c.referrerPolicy),c.crossOrigin==="use-credentials"?i.credentials="include":c.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function s(c){if(c.ep)return;c.ep=!0;const i=n(c);fetch(c.href,i)}})();var Be=Ie();const $e="modulepreload",ze=function(e){return"/"+e},oe={},P=function(t,n,s){let c=Promise.resolve();if(n&&n.length>0){let x=function(u){return Promise.all(u.map(b=>Promise.resolve(b).then(h=>({status:"fulfilled",value:h}),h=>({status:"rejected",reason:h}))))};document.getElementsByTagName("link");const m=document.querySelector("meta[property=csp-nonce]"),y=(m==null?void 0:m.nonce)||(m==null?void 0:m.getAttribute("nonce"));c=x(n.map(u=>{if(u=ze(u),u in oe)return;oe[u]=!0;const b=u.endsWith(".css"),h=b?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${u}"]${h}`))return;const d=document.createElement("link");if(d.rel=b?"stylesheet":$e,b||(d.as="script"),d.crossOrigin="",d.href=u,y&&d.setAttribute("nonce",y),document.head.appendChild(d),b)return new Promise((L,q)=>{d.addEventListener("load",L),d.addEventListener("error",()=>q(new Error(`Unable to preload CSS for ${u}`)))})}))}function i(x){const m=new Event("vite:preloadError",{cancelable:!0});if(m.payload=x,window.dispatchEvent(m),!m.defaultPrevented)throw x}return c.then(x=>{for(const m of x||[])m.status==="rejected"&&i(m.reason);return t().catch(i)})};class _ extends Error{constructor(n,s){super(s);ie(this,"status");this.name="ApiError",this.status=n}}let F=null;function le(e){F=e}async function G(e){try{const t=await e.json();if(typeof t.detail=="string")return t.detail;if(t.detail!=null)return JSON.stringify(t.detail)}catch{}return e.statusText||`Request failed (${e.status})`}async function Qe(e){let t;try{t=await fetch("/v1/auth/session",{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({master_key:e})})}catch{throw new _(0,"Network error: could not reach the gateway.")}if(t.status===401||t.status===403)return!1;if(!t.ok)throw new _(t.status,await G(t));return!0}async function Ve(){try{await fetch("/v1/auth/session",{method:"DELETE"})}catch{}}async function o(e,t={}){const n=new Headers(t.headers);n.set("Accept","application/json"),t.body!=null&&!n.has("Content-Type")&&n.set("Content-Type","application/json");let s;try{s=await fetch(e,{...t,headers:n})}catch{throw new _(0,"Network error: could not reach the gateway.")}if(s.status===401||s.status===403)throw F==null||F(),new _(s.status,await G(s));if(!s.ok)throw new _(s.status,await G(s));if(s.status!==204)return await s.json()}const J="otari.dashboard.hasSession",he=a.createContext(null);function He(){try{return window.localStorage.getItem(J)==="1"}catch{return!1}}function We({children:e}){const t=v(),[n,s]=a.useState(He),c=a.useCallback(()=>{Ve(),s(!1),t.clear();try{window.localStorage.removeItem(J)}catch{}},[t]),i=a.useCallback(()=>{t.clear(),s(!0);try{window.localStorage.setItem(J,"1")}catch{}},[t]);a.useEffect(()=>(le(c),()=>le(null)),[c]);const x=a.useMemo(()=>({isAuthenticated:n,login:i,logout:c}),[n,i,c]);return r.jsx(he.Provider,{value:x,children:e})}function X(){const e=a.useContext(he);if(!e)throw new Error("useAuth must be used within an AuthProvider");return e}function Ge(e){return e instanceof _&&e.status===0}function Je(){const e=v(),[t,n]=a.useState(!1);return a.useEffect(()=>{const s=e.getQueryCache(),c=()=>s.getAll().some(i=>i.state.status==="error"&&Ge(i.state.error));return n(c()),s.subscribe(()=>n(c()))},[e]),t}function Ye(){return Je()?r.jsxs("div",{role:"alert","aria-live":"assertive",className:"fixed right-4 bottom-4 z-50 flex max-w-sm items-start gap-2.5 rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700 shadow-lg",children:[r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2","aria-hidden":!0,className:"mt-0.5 h-5 w-5 shrink-0",children:[r.jsx("path",{d:"M12 9v4M12 17h.01",strokeLinecap:"round",strokeLinejoin:"round"}),r.jsx("path",{d:"M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0z",strokeLinejoin:"round"})]}),r.jsxs("span",{children:[r.jsx("strong",{className:"font-semibold",children:"Can’t reach the gateway."})," The backend isn’t responding; data won’t load or save until the connection is restored."]})]}):null}const T="models",K="pricing",xe="settings",ve="tool-settings",Z="aliases",ee="discoverable",te="providers",re="provider-health",ye="stored-providers",Xe="model-metadata",Ze="build",A="keys",I="budgets",ge="users",D="usage",et=6e4,ce=60*6e4;function Jt(){return p({queryKey:[T],queryFn:()=>o("/v1/models"),staleTime:6e4})}function tt(){return p({queryKey:[Ze],queryFn:()=>o("/dashboard-build.json"),refetchInterval:et,refetchOnWindowFocus:!0,staleTime:0,retry:!1})}function Yt(){return p({queryKey:[ee],queryFn:()=>o("/v1/models/discoverable"),staleTime:5*6e4})}function Xt(){return p({queryKey:[te],queryFn:()=>o("/v1/providers"),staleTime:5*6e4})}function Zt(){return p({queryKey:["provider-catalog"],queryFn:()=>o("/v1/providers/catalog"),staleTime:1/0})}function er(e){return p({queryKey:["provider-catalog",e],queryFn:()=>o(`/v1/providers/catalog/${encodeURIComponent(e)}`),enabled:e!=="",staleTime:1/0})}function tr(){return p({queryKey:[re],queryFn:()=>o("/v1/providers/health"),staleTime:ce,refetchInterval:ce})}function rr(){const e=v();return f({mutationFn:()=>o("/v1/providers/health?refresh=true"),onSuccess:t=>e.setQueryData([re],t)})}function nr(){return p({queryKey:[ye],queryFn:()=>o("/v1/provider-credentials"),staleTime:6e4})}function B(e){e.invalidateQueries({queryKey:[ye]}),e.invalidateQueries({queryKey:[te]}),e.invalidateQueries({queryKey:[T]}),e.invalidateQueries({queryKey:[ee]}),e.invalidateQueries({queryKey:[re]})}function sr(){const e=v();return f({mutationFn:t=>o("/v1/provider-credentials",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>B(e)})}function ar(){const e=v();return f({mutationFn:({instance:t,body:n})=>o(`/v1/provider-credentials/${encodeURIComponent(t)}`,{method:"PATCH",body:JSON.stringify(n)}),onSuccess:()=>B(e)})}function ir(){const e=v();return f({mutationFn:t=>o(`/v1/provider-credentials/${encodeURIComponent(t)}`,{method:"DELETE"}),onSuccess:()=>B(e)})}function or(){const e=v();return f({mutationFn:()=>o("/v1/provider-credentials/reencrypt",{method:"POST"}),onSuccess:()=>B(e)})}function lr(){return f({mutationFn:e=>o(`/v1/provider-credentials/${encodeURIComponent(e)}/test`,{method:"POST"})})}function cr(){return f({mutationFn:e=>o("/v1/provider-credentials/test",{method:"POST",body:JSON.stringify(e)})})}function ur(){return p({queryKey:[Xe],queryFn:()=>o("/v1/models/metadata"),staleTime:10*6e4})}function dr(){return p({queryKey:[Z],queryFn:()=>o("/v1/aliases"),staleTime:6e4})}function mr(){const e=v();return f({mutationFn:t=>o("/v1/aliases",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>{e.invalidateQueries({queryKey:[Z]}),e.invalidateQueries({queryKey:[T]})}})}function fr(){const e=v();return f({mutationFn:t=>o(`/v1/aliases/${encodeURIComponent(t)}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:[Z]}),e.invalidateQueries({queryKey:[T]})}})}function rt(){return p({queryKey:[xe],queryFn:()=>o("/v1/settings"),staleTime:6e4})}function nt(){const e=v();return f({mutationFn:t=>o("/v1/settings",{method:"PATCH",body:JSON.stringify(t)}),onSuccess:t=>{e.setQueryData([xe],t),e.invalidateQueries({queryKey:[T]}),e.invalidateQueries({queryKey:[ee]})}})}function hr(){return f({mutationFn:()=>o("/v1/settings/master-key/rotate",{method:"POST"})})}function xr(){return p({queryKey:[ve],queryFn:()=>o("/v1/tool-settings"),staleTime:6e4})}function vr(){const e=v();return f({mutationFn:t=>o("/v1/tool-settings",{method:"PATCH",body:JSON.stringify(t)}),onSuccess:t=>{e.setQueryData([ve],t)}})}function yr(){return f({mutationFn:({service:e,url:t})=>o(`/v1/tool-settings/${encodeURIComponent(e)}/test`,{method:"POST",body:JSON.stringify({url:t})})})}const $=1e3,st=100;async function at(){const e=[];for(let t=0;to("/v1/pricing",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>{e.invalidateQueries({queryKey:[K]}),e.invalidateQueries({queryKey:[T]})}})}function br(){const e=v();return f({mutationFn:t=>o(`/v1/pricing/${encodeURIComponent(t)}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:[K]}),e.invalidateQueries({queryKey:[T]})}})}function jr(){return f({mutationFn:()=>o("/v1/pricing/refresh",{method:"POST"})})}function wr(){const e=v();return f({mutationFn:()=>o("/v1/pricing/refresh/confirm",{method:"POST"}),onSuccess:()=>{e.invalidateQueries({queryKey:[K]}),e.invalidateQueries({queryKey:[T]}),e.invalidateQueries({queryKey:[te]})}})}function Sr(){return f({mutationFn:()=>o("/v1/pricing/refresh/reject",{method:"POST"})})}const z=1e3,it=100;async function ot(){const e=[];for(let t=0;to("/v1/keys",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>void e.invalidateQueries({queryKey:[A]})})}function Pr(){const e=v();return f({mutationFn:({id:t,body:n})=>o(`/v1/keys/${encodeURIComponent(t)}`,{method:"PATCH",body:JSON.stringify(n)}),onSuccess:()=>void e.invalidateQueries({queryKey:[A]})})}function Nr(){const e=v();return f({mutationFn:t=>o(`/v1/keys/${encodeURIComponent(t)}/rotate`,{method:"POST"}),onSuccess:()=>void e.invalidateQueries({queryKey:[A]})})}function Cr(){const e=v();return f({mutationFn:t=>o(`/v1/keys/${encodeURIComponent(t)}`,{method:"DELETE"}),onSuccess:()=>void e.invalidateQueries({queryKey:[A]})})}const Q=1e3,lt=100;async function ct(){const e=[];for(let t=0;to(`/v1/budgets/${encodeURIComponent(e)}/reset-logs`),enabled:e!==null,staleTime:6e4})}function Lr(){const e=v();return f({mutationFn:t=>o("/v1/budgets",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>void e.invalidateQueries({queryKey:[I]})})}function Ar(){const e=v();return f({mutationFn:({id:t,body:n})=>o(`/v1/budgets/${encodeURIComponent(t)}`,{method:"PATCH",body:JSON.stringify(n)}),onSuccess:()=>void e.invalidateQueries({queryKey:[I]})})}function Ir(){const e=v();return f({mutationFn:t=>o(`/v1/budgets/${encodeURIComponent(t)}`,{method:"DELETE"}),onSuccess:()=>void e.invalidateQueries({queryKey:[I]})})}const V=1e3,ut=100;async function dt(){const e=[];for(let t=0;to("/v1/users",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>ne(e)})}function Or(){const e=v();return f({mutationFn:({id:t,body:n})=>o(`/v1/users/${encodeURIComponent(t)}`,{method:"PATCH",body:JSON.stringify(n)}),onSuccess:()=>ne(e)})}function Dr(){const e=v();return f({mutationFn:t=>o(`/v1/users/${encodeURIComponent(t)}`,{method:"DELETE"}),onSuccess:()=>{ne(e),e.invalidateQueries({queryKey:[A]})}})}function se(e){const t=new URLSearchParams;return e.start_date&&t.set("start_date",e.start_date),e.end_date&&t.set("end_date",e.end_date),e.status&&t.set("status",e.status),e.model&&t.set("model",e.model),e.endpoint&&t.set("endpoint",e.endpoint),e.user_id&&t.set("user_id",e.user_id),e.api_key_id&&t.set("api_key_id",e.api_key_id),e.source&&t.set("source",e.source),e.priced!==void 0&&t.set("priced",String(e.priced)),e.counts_toward_budget!==void 0&&t.set("counts_toward_budget",String(e.counts_toward_budget)),t}function Mr(e,t,n){return p({queryKey:[D,"list",e,t,n],queryFn:()=>{const s=se(e);return s.set("skip",String(t*n)),s.set("limit",String(n)),o(`/v1/usage?${s.toString()}`)},placeholderData:Y,staleTime:1e4})}function Fr(e,t=!0){return p({queryKey:[D,"count",e],queryFn:()=>o(`/v1/usage/count?${se(e).toString()}`),enabled:t,placeholderData:Y,staleTime:1e4})}function Ur(){const e=v();return f({mutationFn:t=>o("/v1/usage",{method:"DELETE",body:JSON.stringify(t)}),onSuccess:()=>{e.invalidateQueries({queryKey:[D]})}})}function Kr(){const e=v();return f({mutationFn:t=>o("/v1/usage/set-price",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>{e.invalidateQueries({queryKey:[D]})}})}function Br(e,t,n=!0){return p({queryKey:[D,"summary",e,t],queryFn:()=>{const s=se(e);return s.set("bucket",t),o(`/v1/usage/summary?${s.toString()}`)},enabled:n,placeholderData:Y,staleTime:3e4})}function $r(e){return e==null?"0":new Intl.NumberFormat("en-US").format(e)}function zr(e){if(e==null)return"$0.00";const t=e!==0&&Math.abs(e)<.01?4:2;return new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",minimumFractionDigits:2,maximumFractionDigits:t}).format(e)}function Qr(e){if(e==null)return"—";if(e>=1e6){const t=e/1e6;return`${Number.isInteger(t)?t:t.toFixed(1)}M`}if(e>=1e3){const t=Math.round(e/1e3);return t>=1e3?"1M":`${t}K`}return String(e)}const mt=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function Vr(e){if(!e)return"—";const t=/^(\d{4})-(\d{2})/.exec(e);if(!t)return e;const n=Number(t[2])-1;return n<0||n>11?t[1]:`${mt[n]} ${t[1]}`}const ft=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",maximumFractionDigits:2});function Hr(e){return ft.format(e)}function Wr(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function ht(e){return`${(e*100).toFixed(1)}%`}function Gr(e,t){return t===void 0||t===0?null:(e-t)/t}function Jr(e,t=Date.now()){if(!e)return"never";const n=new Date(e);if(Number.isNaN(n.getTime()))return e;const s=Math.round((t-n.getTime())/1e3),c=s<0,i=Math.abs(s),x=[["second",60],["minute",60],["hour",24],["day",30],["month",12],["year",Number.POSITIVE_INFINITY]];let m=i,y="second";for(const[b,h]of x){if(y=b,m0?"▲":e<0?"▼":"•";return r.jsxs("span",{className:"text-[var(--otari-muted)]",children:[t," ",ht(Math.abs(e))," vs prev"]})}function xt(e){return e instanceof _||e instanceof Error?e.message:"Something went wrong."}function vt({error:e}){return e?r.jsx("div",{role:"alert",className:"rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700",children:xt(e)}):null}function yt({tone:e="info",children:t}){const n=e==="warning"?"border-amber-200 bg-amber-50 text-amber-800":"border-[var(--otari-brand)] bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]";return r.jsx("div",{className:`rounded-lg border px-4 py-3 text-sm ${n}`,children:t})}function Zr({title:e,description:t,action:n}){return r.jsxs("div",{className:"flex flex-col gap-3",children:[r.jsxs("div",{children:[r.jsx("h1",{className:"text-xl font-semibold text-[var(--otari-ink)]",children:e}),t?r.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:t}):null]}),n?r.jsx("div",{className:"flex flex-wrap gap-2",children:n}):null]})}function en({children:e,confirmLabel:t,onConfirm:n,isPending:s}){const[c,i]=a.useState(!1);return c?r.jsxs("span",{className:"inline-flex items-center gap-1",children:[r.jsx(C,{size:"sm",variant:"danger",isDisabled:s,onPress:n,children:t}),r.jsx(C,{size:"sm",variant:"ghost",isDisabled:s,onPress:()=>i(!1),children:"Cancel"})]}):r.jsx(C,{size:"sm",variant:"danger-soft",onPress:()=>i(!0),children:e})}const gt="rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-3 py-2 text-sm text-[var(--otari-ink)] focus:border-[var(--otari-brand)] focus:outline-none";function tn({id:e,label:t,ariaLabel:n,value:s,onChange:c,options:i,children:x,disabled:m}){const y=a.useId(),u=e??(t?y:void 0),b=r.jsx("select",{id:u,"aria-label":t?void 0:n,value:s,disabled:m,onChange:h=>c(h.target.value),className:gt,children:i?i.map(h=>r.jsx("option",{value:h.value,children:h.label},h.value)):x});return t?r.jsxs("div",{className:"flex flex-col gap-1",children:[r.jsx("label",{htmlFor:u,className:"text-xs font-medium text-[var(--otari-muted)]",children:t}),b]}):b}function rn({label:e,value:t,onChange:n,options:s,placeholder:c,maxVisible:i=50,allowsCustom:x=!1}){const m=d=>{var L;return((L=s.find(q=>q.value===d))==null?void 0:L.label)??d},[y,u]=a.useState(()=>m(t));a.useEffect(()=>{u(m(t))},[t]);const b=y.trim().toLowerCase(),h=s.filter(d=>!b||d.value.toLowerCase().includes(b)||d.label.toLowerCase().includes(b)).slice(0,i);return r.jsxs(M.Root,{allowsEmptyCollection:!0,allowsCustomValue:x,menuTrigger:"focus",inputValue:y,onInputChange:d=>{u(d),x?n(d.trim()):d.trim()===""&&n("")},onSelectionChange:d=>{d!=null&&n(String(d))},className:"flex flex-col gap-1",children:[r.jsx(me,{className:"text-xs font-medium text-[var(--otari-muted)]",children:e}),r.jsxs(M.InputGroup,{children:[r.jsx(fe,{placeholder:c,autoComplete:"off",onFocus:d=>d.currentTarget.select()}),r.jsx(M.Trigger,{})]}),r.jsx(M.Popover,{children:r.jsx(Me,{items:h,className:"max-h-72 overflow-auto",children:d=>r.jsx(Fe,{id:d.value,textValue:d.label,children:d.label})})})]})}function pt(){var i;const e=rt(),t=nt(),[n,s]=a.useState(!1);return!(((i=e.data)==null?void 0:i.require_pricing)===!0&&e.data.default_pricing===!1)||n?null:r.jsx("div",{className:"shrink-0 px-6 pt-3",children:r.jsx(yt,{tone:"warning",children:r.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[r.jsxs("span",{children:["Requests are rejected until pricing is set (",r.jsx("code",{children:"require_pricing"})," is on). Enable default pricing to meter new models with public rates right away."]}),r.jsxs("span",{className:"flex items-center gap-2",children:[r.jsx(C,{size:"sm",variant:"primary",isDisabled:t.isPending,onPress:()=>t.mutate({default_pricing:!0}),children:t.isPending?"Enabling…":"Enable default pricing"}),r.jsx(C,{size:"sm",variant:"ghost",onPress:()=>s(!0),children:"Dismiss"})]})]})})})}function bt(){const{data:e}=tt(),t=a.useRef(null);return e&&t.current===null&&(t.current=e.build),e!=null&&t.current!=null&&e.build!==t.current}function jt(){const e=bt(),[t,n]=a.useState(!1);return!e||t?null:r.jsx("div",{className:"pointer-events-none absolute inset-x-0 top-0 z-50 flex justify-center",children:r.jsxs("div",{role:"status",className:"pointer-events-auto mt-1.5 flex items-center gap-3 rounded-full border border-[var(--otari-brand)] bg-[var(--otari-brand-tint)] py-1.5 pr-1.5 pl-4 text-sm text-[var(--otari-brand-dark)] shadow-md",children:[r.jsxs("span",{children:[r.jsx("strong",{className:"font-semibold",children:"An update is available."})," Reloading keeps you signed in."]}),r.jsx(C,{size:"sm",variant:"primary",onPress:()=>window.location.reload(),children:"Update now"}),r.jsx(C,{size:"sm",variant:"ghost",onPress:()=>n(!0),children:"Later"})]})})}const pe=200,be=480,H=240,wt=60,je="otari.dashboard.sidebarWidth",we="otari.dashboard.sidebarCollapsed",de=16,Se="(max-width: 767px)",U=e=>Math.min(be,Math.max(pe,e));function St(){return typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia(Se).matches}const kt='a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"])';function Et(e){return e?Array.from(e.querySelectorAll(kt)).filter(t=>t.offsetParent!==null||t===document.activeElement):[]}function Pt(){if(typeof window>"u")return H;try{const e=window.localStorage.getItem(je),t=e?Number.parseInt(e,10):Number.NaN;return Number.isNaN(t)?H:U(t)}catch{return H}}function Nt(){if(typeof window>"u")return!1;try{return window.localStorage.getItem(we)==="1"}catch{return!1}}const Ct=[{key:"home"},{key:"observability",label:"Observability"},{key:"catalog",label:"Catalog"},{key:"access",label:"Access"},{key:"system"}],_t=[{to:"/",section:"home",label:"Overview",end:!0,icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("rect",{x:"3.5",y:"3.5",width:"7",height:"7",rx:"1.5",strokeLinejoin:"round"}),r.jsx("rect",{x:"13.5",y:"3.5",width:"7",height:"7",rx:"1.5",strokeLinejoin:"round"}),r.jsx("rect",{x:"3.5",y:"13.5",width:"7",height:"7",rx:"1.5",strokeLinejoin:"round"}),r.jsx("rect",{x:"13.5",y:"13.5",width:"7",height:"7",rx:"1.5",strokeLinejoin:"round"})]})},{to:"/activity",section:"observability",label:"Activity",icon:r.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:r.jsx("path",{d:"M3 12h4l2.5-6 4 12 2.5-6H21",strokeLinecap:"round",strokeLinejoin:"round"})})},{to:"/usage",section:"observability",label:"Usage",icon:r.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:r.jsx("path",{d:"M4 20V10M10 20V4M16 20v-7M22 20H2",strokeLinecap:"round",strokeLinejoin:"round"})})},{to:"/providers",section:"catalog",label:"Providers",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("rect",{x:"3.5",y:"4.5",width:"17",height:"6",rx:"1.5",strokeLinejoin:"round"}),r.jsx("rect",{x:"3.5",y:"13.5",width:"17",height:"6",rx:"1.5",strokeLinejoin:"round"}),r.jsx("path",{d:"M7 7.5h.01M7 16.5h.01",strokeLinecap:"round",strokeLinejoin:"round"})]})},{to:"/users",section:"access",label:"Users",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("circle",{cx:"9",cy:"8",r:"3.2",strokeLinejoin:"round"}),r.jsx("path",{d:"M3.5 19a5.5 5.5 0 0 1 11 0",strokeLinecap:"round",strokeLinejoin:"round"}),r.jsx("path",{d:"M16 5.2a3.2 3.2 0 0 1 0 5.6M17.5 19a5.5 5.5 0 0 0-3-4.9",strokeLinecap:"round",strokeLinejoin:"round"})]})},{to:"/keys",section:"access",label:"API keys",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("circle",{cx:"7.5",cy:"15.5",r:"3.5"}),r.jsx("path",{d:"M10 13l7-7M14 5l3 3M16.5 7.5l2-2",strokeLinecap:"round",strokeLinejoin:"round"})]})},{to:"/budgets",section:"access",label:"Budgets",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("path",{d:"M3 7.5A1.5 1.5 0 0 1 4.5 6H18a1.5 1.5 0 0 1 1.5 1.5V9",strokeLinejoin:"round"}),r.jsx("rect",{x:"3",y:"7.5",width:"18",height:"12",rx:"1.5",strokeLinejoin:"round"}),r.jsx("path",{d:"M16 13.5h.01",strokeLinecap:"round",strokeLinejoin:"round"}),r.jsx("path",{d:"M21 12v3h-3.5a1.5 1.5 0 0 1 0-3H21z",strokeLinejoin:"round"})]})},{to:"/models",section:"catalog",label:"Models",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("path",{d:"M12 3l8 4.5v9L12 21l-8-4.5v-9L12 3z",strokeLinejoin:"round"}),r.jsx("path",{d:"M12 12l8-4.5M12 12v9M12 12L4 7.5",strokeLinejoin:"round"})]})},{to:"/aliases",section:"catalog",label:"Aliases",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("path",{d:"M20.6 13.4L13.4 20.6a2 2 0 0 1-2.8 0l-7-7A2 2 0 0 1 3 12.2V5a2 2 0 0 1 2-2h7.2a2 2 0 0 1 1.4.6l7 7a2 2 0 0 1 0 2.8z",strokeLinejoin:"round"}),r.jsx("circle",{cx:"7.5",cy:"7.5",r:"1.5"})]})},{to:"/tools",section:"system",label:"Tools & Guardrails",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("path",{d:"M14.7 6.3a4 4 0 0 1 5 5l-8.4 8.4a2 2 0 0 1-2.8 0l-2.2-2.2a2 2 0 0 1 0-2.8z",strokeLinejoin:"round"}),r.jsx("path",{d:"M12 9 5 16",strokeLinecap:"round"})]})},{to:"/settings",section:"system",label:"Settings",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("circle",{cx:"12",cy:"12",r:"3"}),r.jsx("path",{d:"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z",strokeLinejoin:"round"})]})}];function Tt(){const{logout:e}=X(),t=a.useRef(null),n=a.useRef(null),[s,c]=a.useState(Pt),[i,x]=a.useState(Nt),[m,y]=a.useState(!1),[u,b]=a.useState(St),[h,d]=a.useState(!1);a.useEffect(()=>{if(typeof window>"u"||typeof window.matchMedia!="function")return;const l=window.matchMedia(Se),g=j=>{b(j.matches),j.matches||d(!1)};return typeof l.addEventListener=="function"?(l.addEventListener("change",g),()=>l.removeEventListener("change",g)):(l.addListener(g),()=>l.removeListener(g))},[]),a.useEffect(()=>{if(!h)return;const l=g=>{g.key==="Escape"&&d(!1)};return window.addEventListener("keydown",l),()=>window.removeEventListener("keydown",l)},[h]),a.useEffect(()=>{var l,g,j;u&&(h?(l=t.current)==null||l.focus():(g=t.current)!=null&&g.contains(document.activeElement)&&((j=n.current)==null||j.focus()))},[u,h]);const L=a.useCallback(l=>{if(l.key!=="Tab")return;const g=Et(t.current);if(g.length===0)return;const j=g[0],k=g[g.length-1],R=document.activeElement;l.shiftKey&&(R===j||R===t.current)?(l.preventDefault(),k.focus()):!l.shiftKey&&R===k&&(l.preventDefault(),j.focus())},[]);a.useEffect(()=>{const l=window.setTimeout(()=>{try{window.localStorage.setItem(je,String(Math.round(s)))}catch{}},200);return()=>window.clearTimeout(l)},[s]),a.useEffect(()=>{try{window.localStorage.setItem(we,i?"1":"0")}catch{}},[i]);const q=a.useCallback(l=>{l.preventDefault(),l.currentTarget.setPointerCapture(l.pointerId),y(!0)},[]),Ee=a.useCallback(l=>{var j;if(!l.currentTarget.hasPointerCapture(l.pointerId))return;const g=((j=t.current)==null?void 0:j.getBoundingClientRect().left)??0;c(U(l.clientX-g))},[]),Pe=a.useCallback(l=>{l.currentTarget.hasPointerCapture(l.pointerId)&&l.currentTarget.releasePointerCapture(l.pointerId),y(!1)},[]),Ne=a.useCallback(l=>{l.key==="ArrowLeft"?(l.preventDefault(),c(g=>U(g-de))):l.key==="ArrowRight"&&(l.preventDefault(),c(g=>U(g+de)))},[]),Ce=i?wt:s,S=u?!1:i,ae=u&&h?!0:void 0;return r.jsxs("div",{className:N("relative flex h-full flex-col overflow-hidden",m&&"cursor-col-resize select-none"),children:[r.jsxs("header",{inert:ae,className:"flex shrink-0 items-center justify-between border-b border-[var(--otari-line)] bg-[var(--otari-surface)] px-5 py-3",children:[r.jsxs("div",{className:"flex items-center gap-2.5",children:[r.jsx("button",{type:"button",ref:n,onClick:()=>d(l=>!l),"aria-label":h?"Close navigation":"Open navigation","aria-expanded":h,"aria-controls":"app-sidebar",className:"-ml-1 flex h-8 w-8 items-center justify-center rounded-lg text-[var(--otari-muted)] transition-colors hover:bg-[var(--otari-bg)] hover:text-[var(--otari-ink)] md:hidden",children:r.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5",children:r.jsx("path",{d:"M4 6h16M4 12h16M4 18h16",strokeLinecap:"round",strokeLinejoin:"round"})})}),r.jsx("img",{src:"/favicon.svg",alt:"",className:"h-7 w-7 shrink-0"}),r.jsx("span",{className:"text-base font-semibold text-[var(--otari-ink)]",children:"Otari"})]}),r.jsx(C,{size:"sm",variant:"outline",onPress:e,"aria-label":"Sign out",children:"Sign out"})]}),r.jsx(jt,{}),r.jsx(Ye,{}),r.jsx(pt,{}),r.jsxs("div",{className:"flex min-h-0 flex-1",children:[u&&h?r.jsx("div",{"aria-hidden":"true",onClick:()=>d(!1),className:"fixed inset-0 z-30 bg-black/40 md:hidden"}):null,r.jsxs("aside",{ref:t,id:"app-sidebar",role:u?"dialog":void 0,"aria-modal":u&&h?!0:void 0,"aria-label":u?"Navigation":void 0,tabIndex:u?-1:void 0,inert:u&&!h?!0:void 0,onKeyDown:u&&h?L:void 0,style:u?void 0:{width:Ce},className:N("flex flex-col border-r border-[var(--otari-line)] bg-[var(--otari-surface)] focus:outline-none",u?N("fixed inset-y-0 left-0 z-40 w-[17rem] shadow-xl transition-transform duration-200",h?"translate-x-0":"-translate-x-full"):N("relative shrink-0",!m&&"transition-[width] duration-150")),children:[r.jsx("button",{type:"button",onClick:()=>x(l=>!l),"aria-label":i?"Expand sidebar":"Collapse sidebar","aria-pressed":i,title:i?"Expand sidebar":"Collapse sidebar",className:"absolute -right-3 top-4 z-30 hidden h-6 w-6 items-center justify-center rounded-full border border-[var(--otari-line)] bg-[var(--otari-surface)] text-[var(--otari-muted)] shadow-sm transition-colors hover:border-[var(--otari-brand)] hover:text-[var(--otari-brand-dark)] md:flex",children:r.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",className:N("h-3.5 w-3.5 transition-transform",i&&"rotate-180"),children:r.jsx("path",{d:"M15 6l-6 6 6 6",strokeLinecap:"round",strokeLinejoin:"round"})})}),r.jsx("nav",{className:N("flex flex-col py-4",S?"px-2":"px-3"),children:Ct.map((l,g)=>{const j=_t.filter(k=>k.section===l.key);return j.length===0?null:r.jsxs("div",{className:g>0?"mt-4":void 0,children:[!S&&l.label?r.jsx("div",{className:"px-3 pb-1 text-[11px] font-semibold tracking-wider text-[var(--otari-muted)] uppercase",children:l.label}):null,g>0&&(S||!l.label)?r.jsx("div",{className:"mx-1 mb-2 border-t border-[var(--otari-line)]"}):null,r.jsx("div",{className:"flex flex-col gap-1",children:j.map(k=>r.jsxs(W,{to:k.to,end:k.end,onClick:()=>d(!1),"aria-label":S?k.label:void 0,title:S?k.label:void 0,className:({isActive:R})=>N("flex items-center rounded-lg py-2 text-sm font-medium transition-colors",S?"justify-center px-0":"gap-3 px-3",R?"bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]":"text-[var(--otari-muted)] hover:bg-[var(--otari-bg)] hover:text-[var(--otari-ink)]"),children:[k.icon,S?null:k.label]},k.to))})]},l.key)})}),r.jsxs("div",{className:"mt-auto flex flex-col gap-1 pb-3",children:[r.jsxs(W,{to:"/docs",onClick:()=>d(!1),"aria-label":S?"User guide":void 0,title:S?"User guide":void 0,className:({isActive:l})=>N("flex items-center rounded-lg py-2 text-sm font-medium transition-colors",S?"mx-2 justify-center px-0":"mx-3 gap-3 px-3",l?"bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]":"text-[var(--otari-muted)] hover:bg-[var(--otari-bg)] hover:text-[var(--otari-ink)]"),children:[r.jsxs("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("path",{d:"M12 6.5C10.5 5 8 4.5 4 4.5V18c4 0 6.5.5 8 2 1.5-1.5 4-2 8-2V4.5c-4 0-6.5.5-8 2z",strokeLinejoin:"round"}),r.jsx("path",{d:"M12 6.5V20",strokeLinecap:"round"})]}),S?null:"User guide"]}),r.jsxs("a",{href:"https://otari.ai",target:"_blank",rel:"noreferrer",title:"otari.ai — the hosted Otari gateway",className:N("flex items-center rounded-lg py-2 text-xs font-medium text-[var(--otari-muted)] transition-colors hover:bg-[var(--otari-bg)] hover:text-[var(--otari-brand-dark)]",S?"mx-2 justify-center px-0":"mx-3 gap-2 px-3"),children:[r.jsx("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-4 w-4 shrink-0",children:r.jsx("path",{d:"M18 10h-1.26A8 8 0 1 0 9 20h9a5 5 0 0 0 0-10z",strokeLinejoin:"round"})}),S?null:r.jsxs("span",{className:"flex-1",children:["otari.ai ",r.jsx("span",{"aria-hidden":!0,children:"↗"})]})]})]}),i||u?null:r.jsx("div",{role:"separator","aria-orientation":"vertical","aria-label":"Resize sidebar","aria-valuenow":Math.round(s),"aria-valuemin":pe,"aria-valuemax":be,tabIndex:0,onPointerDown:q,onPointerMove:Ee,onPointerUp:Pe,onKeyDown:Ne,className:N("absolute top-0 right-0 z-10 h-full w-1.5 cursor-col-resize touch-none transition-colors","hover:bg-[var(--otari-brand)] focus-visible:bg-[var(--otari-brand)] focus:outline-none",m?"bg-[var(--otari-brand)]":"bg-transparent")})]}),r.jsx("main",{inert:ae,className:"flex-1 overflow-y-auto",children:r.jsx("div",{className:"mx-auto flex max-w-[1800px] flex-col gap-6 px-4 py-5 md:px-6 md:py-6",children:r.jsx(qe,{})})})]})]})}function Lt(){const{login:e}=X(),[t,n]=a.useState(""),[s,c]=a.useState(null),[i,x]=a.useState(!1),m=async()=>{const y=t.trim();if(!(!y||i)){x(!0),c(null);try{await Qe(y)?e():c(new Error("Invalid master key."))}catch(u){c(u)}finally{x(!1)}}};return r.jsx("div",{className:"flex min-h-full items-center justify-center p-6",children:r.jsx(O,{className:"w-full max-w-md",children:r.jsxs(O.Content,{className:"flex flex-col gap-5 p-7",children:[r.jsxs("div",{className:"flex flex-col items-center gap-3 text-center",children:[r.jsx("img",{src:"/favicon.svg",alt:"Otari",className:"h-12 w-12"}),r.jsxs("div",{children:[r.jsx("h1",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:"Otari Dashboard"}),r.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:"Sign in with your master key to browse models, set pricing, and manage settings."})]})]}),r.jsxs("form",{className:"flex flex-col gap-4",onSubmit:y=>{y.preventDefault(),m()},children:[r.jsxs(Ue,{value:t,onChange:y=>{n(y),s&&c(null)},type:"password",isRequired:!0,className:"flex flex-col gap-1",children:[r.jsx(me,{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Master key"}),r.jsx(fe,{placeholder:"otari-mk-… or your master key",autoFocus:!0,autoComplete:"off"})]}),r.jsxs("details",{className:"text-xs text-[var(--otari-muted)]",children:[r.jsx("summary",{className:"cursor-pointer font-medium text-[var(--otari-brand-dark)]",children:"First run? Where to find your key"}),r.jsxs("p",{className:"mt-2 leading-relaxed",children:["If you did not set ",r.jsx("code",{children:"OTARI_MASTER_KEY"}),", Otari generated one and printed it to the server logs on startup. Look for the line ",r.jsx("code",{children:"Your master key:"})," (for example, run"," ",r.jsx("code",{children:"docker logs "}),") and paste it above."]})]}),r.jsx(vt,{error:s}),r.jsx(C,{type:"submit",variant:"primary",fullWidth:!0,isDisabled:!t.trim()||i,children:i?"Signing in…":"Sign in"})]}),r.jsx("p",{className:"text-center text-xs text-[var(--otari-muted)]",children:"The key is sent once to this gateway and exchanged for a session cookie; it is never stored in the browser."}),r.jsx("div",{className:"border-t border-[var(--otari-line)] pt-4 text-center",children:r.jsx(Ke,{href:"/welcome",className:"text-sm font-medium text-[var(--otari-brand-dark)]",children:"New to Otari? Open the welcome guide"})})]})})})}const At=a.lazy(async()=>({default:(await P(async()=>{const{ActivityPage:e}=await import("./ActivityPage-RaXV2Jg6.js");return{ActivityPage:e}},__vite__mapDeps([0,1,2,3,4,5,6,7]))).ActivityPage})),It=a.lazy(async()=>({default:(await P(async()=>{const{AliasesPage:e}=await import("./AliasesPage-CX3eAAXN.js");return{AliasesPage:e}},__vite__mapDeps([8,1,2,4,3,5,6,9]))).AliasesPage})),qt=a.lazy(async()=>({default:(await P(async()=>{const{BudgetsPage:e}=await import("./BudgetsPage-2_kce_tq.js");return{BudgetsPage:e}},__vite__mapDeps([10,1,2,4,3,5,6,9]))).BudgetsPage})),Rt=a.lazy(async()=>({default:(await P(async()=>{const{DocsPage:e}=await import("./DocsPage-C8AK643M.js");return{DocsPage:e}},__vite__mapDeps([11,1,2,3]))).DocsPage})),Ot=a.lazy(async()=>({default:(await P(async()=>{const{KeysPage:e}=await import("./KeysPage-CaQTAd2N.js");return{KeysPage:e}},__vite__mapDeps([12,1,2,4,3,5,6,9,13]))).KeysPage})),Dt=a.lazy(async()=>({default:(await P(async()=>{const{ModelsPage:e}=await import("./ModelsPage-Cw8Xv_w2.js");return{ModelsPage:e}},__vite__mapDeps([14,1,2,4,3,6,7]))).ModelsPage})),Mt=a.lazy(async()=>({default:(await P(async()=>{const{OverviewIndex:e}=await import("./OverviewPage-Deh5RtuT.js");return{OverviewIndex:e}},__vite__mapDeps([15,1,2,16,17,3,6]))).OverviewIndex})),Ft=a.lazy(async()=>({default:(await P(async()=>{const{ProvidersPage:e}=await import("./ProvidersPage-BRR1ZEsl.js");return{ProvidersPage:e}},__vite__mapDeps([18,1,2,9,3,6]))).ProvidersPage})),Ut=a.lazy(async()=>({default:(await P(async()=>{const{SettingsPage:e}=await import("./SettingsPage-CDoI9NPf.js");return{SettingsPage:e}},__vite__mapDeps([19,1,2,3]))).SettingsPage})),Kt=a.lazy(async()=>({default:(await P(async()=>{const{ToolsGuardrailsPage:e}=await import("./ToolsGuardrailsPage-bas8EytO.js");return{ToolsGuardrailsPage:e}},__vite__mapDeps([20,1,2,3]))).ToolsGuardrailsPage})),Bt=a.lazy(async()=>({default:(await P(async()=>{const{UsagePage:e}=await import("./UsagePage-BD35XJZn.js");return{UsagePage:e}},__vite__mapDeps([21,1,2,3,4,16,17,5,6,7]))).UsagePage})),$t=a.lazy(async()=>({default:(await P(async()=>{const{UsersPage:e}=await import("./UsersPage-CbRblpp_.js");return{UsersPage:e}},__vite__mapDeps([22,1,2,4,3,5,6,9,13]))).UsersPage}));function E(e){return r.jsx(a.Suspense,{fallback:r.jsx("div",{role:"status",children:"Loading page…"}),children:e})}function zt(){const{isAuthenticated:e}=X();return e?r.jsx(Re,{children:r.jsx(Oe,{children:r.jsxs(w,{element:r.jsx(Tt,{}),children:[r.jsx(w,{index:!0,element:E(r.jsx(Mt,{}))}),r.jsx(w,{path:"providers",element:E(r.jsx(Ft,{}))}),r.jsx(w,{path:"keys",element:E(r.jsx(Ot,{}))}),r.jsx(w,{path:"users",element:E(r.jsx($t,{}))}),r.jsx(w,{path:"budgets",element:E(r.jsx(qt,{}))}),r.jsx(w,{path:"activity",element:E(r.jsx(At,{}))}),r.jsx(w,{path:"usage",element:E(r.jsx(Bt,{}))}),r.jsx(w,{path:"models",element:E(r.jsx(Dt,{}))}),r.jsx(w,{path:"aliases",element:E(r.jsx(It,{}))}),r.jsx(w,{path:"tools",element:E(r.jsx(Kt,{}))}),r.jsx(w,{path:"settings",element:E(r.jsx(Ut,{}))}),r.jsx(w,{path:"docs",element:E(r.jsx(Rt,{}))}),r.jsx(w,{path:"*",element:r.jsx(De,{to:"/",replace:!0})})]})})}):r.jsx(Lt,{})}function Qt({children:e}){const[t]=a.useState(()=>new Le({defaultOptions:{queries:{refetchOnWindowFocus:!1,retry:(n,s)=>s instanceof _&&(s.status===401||s.status===403)?!1:n<2}}}));return r.jsx(Ae,{client:t,children:r.jsx(We,{children:e})})}const ke=document.getElementById("root");if(!ke)throw new Error("Root element #root not found");Be.createRoot(ke).render(r.jsx(a.StrictMode,{children:r.jsx(Qt,{children:r.jsx(zt,{})})}));export{er as $,Qr as A,br as B,en as C,xt as D,vt as E,tn as F,Vr as G,rt as H,yt as I,zr as J,Xt as K,tr as L,Gr as M,Hr as N,Xr as O,Zr as P,$r as Q,ht as R,Yr as S,Jr as T,nr as U,ir as V,lr as W,nt as X,ar as Y,rr as Z,sr as _,kr as a,Zt as a0,cr as a1,jr as a2,wr as a3,Sr as a4,hr as a5,or as a6,xr as a7,vr as a8,yr as a9,Wr as aa,Dr as ab,Rr as ac,Mr as b,Fr as c,Br as d,Ur as e,Kr as f,rn as g,Yt as h,dr as i,fr as j,mr as k,_r as l,Lr as m,Ar as n,Ir as o,Or as p,Tr as q,Pr as r,Nr as s,Cr as t,qr as u,Er as v,Jt as w,gr as x,ur as y,pr as z}; diff --git a/src/gateway/static/dashboard/assets/index-C_gHYR5I.css b/src/gateway/static/dashboard/assets/index-C_gHYR5I.css new file mode 100644 index 00000000..efe5832b --- /dev/null +++ b/src/gateway/static/dashboard/assets/index-C_gHYR5I.css @@ -0,0 +1 @@ +/*! tailwindcss v4.3.1 | MIT License | https://tailwindcss.com */@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-pan-x:initial;--tw-pan-y:initial;--tw-pinch-zoom: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-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0;--tw-content:"";--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-space-y-reverse:0;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-space-x-reverse:0}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, 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-red-50:oklch(97.1% .013 17.38);--color-red-200:oklch(88.5% .062 18.334);--color-red-500:oklch(63.7% .237 25.331);--color-red-700:oklch(50.5% .213 27.518);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-amber-950:oklch(27.9% .077 45.635);--color-green-50:oklch(98.2% .018 155.826);--color-green-200:oklch(92.5% .084 155.995);--color-green-500:oklch(72.3% .219 149.579);--color-green-700:oklch(52.7% .154 150.069);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-700:oklch(50.8% .118 165.612);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--leading-relaxed:1.625;--radius-xl:calc(var(--radius) * 1.5);--radius-2xl:calc(var(--radius) * 2);--radius-3xl:calc(var(--radius) * 3);--ease-out:cubic-bezier(0, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-md:12px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--shadow-surface:var(--surface-shadow);--shadow-overlay:var(--overlay-shadow);--border-width-field:var(--field-border-width,var(--border-width));--ease-smooth:ease;--ease-out-quad:cubic-bezier(.25, .46, .45, .94);--ease-out-quart:cubic-bezier(.165, .84, .44, 1);--ease-out-fluid:cubic-bezier(.32, .72, 0, 1);--ease-linear:linear}@layer theme.base{:root,.light,.default,[data-theme=light],[data-theme=default]{color-scheme:light;--white:oklch(100% 0 0);--black:oklch(0% 0 0);--snow:oklch(99.11% 0 0);--eclipse:oklch(21.03% .0059 285.89);--spacing:.25rem;--border-width:1px;--field-border-width:0px;--disabled-opacity:.5;--ring-offset-width:2px;--cursor-interactive:pointer;--cursor-disabled:not-allowed;--radius:.5rem;--field-radius:calc(var(--radius) * 1.5);--background:oklch(97.02% 0 0);--foreground:var(--eclipse);--surface:var(--white);--surface-foreground:var(--foreground);--surface-secondary:oklch(95.24% .0013 286.37);--surface-secondary-foreground:var(--foreground);--surface-tertiary:oklch(93.73% .0013 286.37);--surface-tertiary-foreground:var(--foreground);--overlay:var(--white);--overlay-foreground:var(--foreground);--muted:oklch(55.17% .0138 285.94);--scrollbar:var(--scrollbar-thumb);--scrollbar-thumb:var(--foreground)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--scrollbar-thumb:color-mix(in oklch, var(--foreground) 15%, transparent)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--scrollbar-track:transparent;--scrollbar-gutter:auto;--scrollbar-width:thin;--scrollbar-color:var(--scrollbar-thumb) var(--scrollbar-track);--default:oklch(94% .001 286.375);--default-foreground:var(--eclipse);--accent:oklch(62.04% .195 253.83);--accent-foreground:var(--snow);--field-background:var(--white);--field-foreground:oklch(21.03% .0059 285.89);--field-placeholder:var(--muted);--field-border:transparent;--success:oklch(73.29% .1935 150.81);--success-foreground:var(--eclipse);--warning:oklch(78.19% .1585 72.33);--warning-foreground:var(--eclipse);--danger:oklch(65.32% .2328 25.74);--danger-foreground:var(--snow);--segment:var(--white);--segment-foreground:var(--eclipse);--border:oklch(90% .004 286.32);--separator:oklch(92% .004 286.32);--focus:var(--accent);--link:var(--foreground);--backdrop:#00000080;--surface-hover:var(--surface)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--surface-hover:color-mix(in oklab, var(--surface) 92%, var(--surface-foreground) 8%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--background-secondary:var(--background)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--background-secondary:color-mix(in oklab, var(--background) 96%, var(--foreground) 4%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--background-tertiary:var(--background)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--background-tertiary:color-mix(in oklab, var(--background) 92%, var(--foreground) 8%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--background-inverse:var(--foreground);--default-hover:var(--default)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--default-hover:color-mix(in oklab, var(--default) 96%, var(--default-foreground) 4%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--accent-hover:var(--accent)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--accent-hover:color-mix(in oklab, var(--accent) 90%, var(--accent-foreground) 10%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--success-hover:var(--success)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--success-hover:color-mix(in oklab, var(--success) 90%, var(--success-foreground) 10%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--warning-hover:var(--warning)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--warning-hover:color-mix(in oklab, var(--warning) 90%, var(--warning-foreground) 10%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--danger-hover:var(--danger)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--danger-hover:color-mix(in oklab, var(--danger) 90%, var(--danger-foreground) 10%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--field-hover:var(--field-background,var(--default))}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--field-hover:color-mix(in oklab, var(--field-background,var(--default)) 90%, var(--field-foreground,var(--foreground)) 2%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--field-focus:var(--field-background,var(--default));--field-border-hover:var(--field-border,var(--border))}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--field-border-hover:color-mix(in oklab, var(--field-border,var(--border)) 88%, var(--field-foreground,var(--foreground)) 10%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--field-border-focus:var(--field-border,var(--border))}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--field-border-focus:color-mix(in oklab, var(--field-border,var(--border)) 74%, var(--field-foreground,var(--foreground)) 22%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--default-soft:var(--default)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--default-soft:color-mix(in oklab, var(--default) 50%, transparent)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--default-soft-foreground:var(--default-foreground);--default-soft-hover:var(--default)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--default-soft-hover:color-mix(in oklab, var(--default) 60%, transparent)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--accent-soft:var(--accent)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--accent-soft:color-mix(in oklab, var(--accent) 15%, transparent)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--accent-soft-foreground:var(--accent)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--accent-soft-foreground:color-mix(in oklab, var(--accent) 70%, var(--foreground) 30%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--accent-soft-hover:var(--accent)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--accent-soft-hover:color-mix(in oklab, var(--accent) 20%, transparent)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--danger-soft:var(--danger)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--danger-soft:color-mix(in oklab, var(--danger) 15%, transparent)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--danger-soft-foreground:var(--danger)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--danger-soft-foreground:color-mix(in oklab, var(--danger) 70%, var(--foreground) 40%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--danger-soft-hover:var(--danger)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--danger-soft-hover:color-mix(in oklab, var(--danger) 20%, transparent)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--warning-soft:var(--warning)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--warning-soft:color-mix(in oklab, var(--warning) 15%, transparent)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--warning-soft-foreground:var(--warning)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--warning-soft-foreground:color-mix(in oklab, var(--warning) 80%, var(--foreground) 70%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--warning-soft-hover:var(--warning)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--warning-soft-hover:color-mix(in oklab, var(--warning) 20%, transparent)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--success-soft:var(--success)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--success-soft:color-mix(in oklab, var(--success) 15%, transparent)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--success-soft-foreground:var(--success)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--success-soft-foreground:color-mix(in oklab, var(--success) 80%, var(--foreground) 60%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--success-soft-hover:var(--success)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--success-soft-hover:color-mix(in oklab, var(--success) 20%, transparent)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--separator-secondary:var(--surface)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--separator-secondary:color-mix(in oklab, var(--surface) 85%, var(--surface-foreground) 15%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--separator-tertiary:var(--surface)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--separator-tertiary:color-mix(in oklab, var(--surface) 81%, var(--surface-foreground) 19%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--border-secondary:var(--surface)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--border-secondary:color-mix(in oklab, var(--surface) 78%, var(--surface-foreground) 22%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--border-tertiary:var(--surface)}@supports (color:color-mix(in lab,red,red)){:root,.light,.default,[data-theme=light],[data-theme=default]{--border-tertiary:color-mix(in oklab, var(--surface) 66%, var(--surface-foreground) 34%)}}:root,.light,.default,[data-theme=light],[data-theme=default]{--surface-shadow:0 2px 4px 0 #0000000a, 0 1px 2px 0 #0000000f, 0 0 1px 0 #0000000f;--overlay-shadow:0 2px 8px 0 #0000000f, 0 -6px 12px 0 #00000008, 0 14px 28px 0 #00000014;--field-shadow:0 2px 4px 0 #0000000a, 0 1px 2px 0 #0000000f, 0 0 1px 0 #0000000f;--skeleton-animation:shimmer;--tooltip-delay:1.5s;--tooltip-close-delay:.5s}.dark,[data-theme=dark]{color-scheme:dark;--background:oklch(12% .005 285.823);--foreground:var(--snow);--surface:oklch(21.03% .0059 285.89);--surface-foreground:var(--foreground);--surface-secondary:oklch(25.7% .0037 286.14);--surface-tertiary:oklch(27.21% .0024 247.91);--overlay:oklch(21.03% .0059 285.89);--overlay-foreground:var(--foreground);--muted:oklch(70.5% .015 286.067);--scrollbar:var(--scrollbar-thumb);--scrollbar-thumb:var(--foreground)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--scrollbar-thumb:color-mix(in oklch, var(--foreground) 15%, transparent)}}.dark,[data-theme=dark]{--scrollbar-track:transparent;--scrollbar-gutter:auto;--scrollbar-width:thin;--scrollbar-color:var(--scrollbar-thumb) var(--scrollbar-track);--default:oklch(27.4% .006 286.033);--default-foreground:var(--snow);--field-background:oklch(21.03% .0059 285.89);--field-foreground:var(--foreground);--warning:oklch(82.03% .1388 76.34);--warning-foreground:var(--eclipse);--danger:oklch(59.4% .1967 24.63);--danger-foreground:var(--snow);--segment:oklch(39.64% .01 285.93);--segment-foreground:var(--foreground);--border:oklch(28% .006 286.033);--separator:oklch(25% .006 286.033);--focus:var(--accent);--link:var(--foreground);--backdrop:#0009;--surface-shadow:0 0 0 0 transparent inset;--overlay-shadow:0 0 1px 0 #ffffff4d inset;--field-shadow:0 0 0 0 transparent inset;--surface-hover:var(--surface)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--surface-hover:color-mix(in oklab, var(--surface) 92%, var(--surface-foreground) 8%)}}.dark,[data-theme=dark]{--background-secondary:var(--background)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--background-secondary:color-mix(in oklab, var(--background) 96%, var(--foreground) 4%)}}.dark,[data-theme=dark]{--background-tertiary:var(--background)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--background-tertiary:color-mix(in oklab, var(--background) 92%, var(--foreground) 8%)}}.dark,[data-theme=dark]{--background-inverse:var(--foreground);--default-hover:var(--default)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--default-hover:color-mix(in oklab, var(--default) 96%, var(--default-foreground) 4%)}}.dark,[data-theme=dark]{--accent-hover:var(--accent)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--accent-hover:color-mix(in oklab, var(--accent) 90%, var(--accent-foreground) 10%)}}.dark,[data-theme=dark]{--success-hover:var(--success)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--success-hover:color-mix(in oklab, var(--success) 90%, var(--success-foreground) 10%)}}.dark,[data-theme=dark]{--warning-hover:var(--warning)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--warning-hover:color-mix(in oklab, var(--warning) 90%, var(--warning-foreground) 10%)}}.dark,[data-theme=dark]{--danger-hover:var(--danger)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--danger-hover:color-mix(in oklab, var(--danger) 90%, var(--danger-foreground) 10%)}}.dark,[data-theme=dark]{--field-hover:var(--field-background,var(--default))}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--field-hover:color-mix(in oklab, var(--field-background,var(--default)) 90%, var(--field-foreground,var(--foreground)) 2%)}}.dark,[data-theme=dark]{--field-focus:var(--field-background,var(--default));--field-border-hover:var(--field-border,var(--border))}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--field-border-hover:color-mix(in oklab, var(--field-border,var(--border)) 88%, var(--field-foreground,var(--foreground)) 10%)}}.dark,[data-theme=dark]{--field-border-focus:var(--field-border,var(--border))}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--field-border-focus:color-mix(in oklab, var(--field-border,var(--border)) 74%, var(--field-foreground,var(--foreground)) 22%)}}.dark,[data-theme=dark]{--default-soft:var(--default)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--default-soft:color-mix(in oklab, var(--default) 50%, transparent)}}.dark,[data-theme=dark]{--default-soft-foreground:var(--default-foreground);--default-soft-hover:var(--default)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--default-soft-hover:color-mix(in oklab, var(--default) 60%, transparent)}}.dark,[data-theme=dark]{--accent-soft:var(--accent)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--accent-soft:color-mix(in oklab, var(--accent) 12%, transparent)}}.dark,[data-theme=dark]{--accent-soft-foreground:var(--accent)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--accent-soft-foreground:color-mix(in oklab, var(--accent) 80%, var(--foreground) 30%)}}.dark,[data-theme=dark]{--accent-soft-hover:var(--accent)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--accent-soft-hover:color-mix(in oklab, var(--accent) 16%, transparent)}}.dark,[data-theme=dark]{--danger-soft:var(--danger)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--danger-soft:color-mix(in oklab, var(--danger) 15%, transparent)}}.dark,[data-theme=dark]{--danger-soft-foreground:var(--danger)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--danger-soft-foreground:color-mix(in oklab, var(--danger) 80%, var(--foreground) 30%)}}.dark,[data-theme=dark]{--danger-soft-hover:var(--danger)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--danger-soft-hover:color-mix(in oklab, var(--danger) 20%, transparent)}}.dark,[data-theme=dark]{--warning-soft:var(--warning)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--warning-soft:color-mix(in oklab, var(--warning) 12%, transparent)}}.dark,[data-theme=dark]{--warning-soft-foreground:var(--warning)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--warning-soft-foreground:color-mix(in oklab, var(--warning) 80%, var(--foreground) 30%)}}.dark,[data-theme=dark]{--warning-soft-hover:var(--warning)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--warning-soft-hover:color-mix(in oklab, var(--warning) 16%, transparent)}}.dark,[data-theme=dark]{--success-soft:var(--success)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--success-soft:color-mix(in oklab, var(--success) 12%, transparent)}}.dark,[data-theme=dark]{--success-soft-foreground:var(--success)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--success-soft-foreground:color-mix(in oklab, var(--success) 80%, var(--foreground) 30%)}}.dark,[data-theme=dark]{--success-soft-hover:var(--success)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--success-soft-hover:color-mix(in oklab, var(--success) 16%, transparent)}}.dark,[data-theme=dark]{--separator-secondary:var(--surface)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--separator-secondary:color-mix(in oklab, var(--surface) 85%, var(--surface-foreground) 15%)}}.dark,[data-theme=dark]{--separator-tertiary:var(--surface)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--separator-tertiary:color-mix(in oklab, var(--surface) 81%, var(--surface-foreground) 19%)}}.dark,[data-theme=dark]{--border-secondary:var(--surface)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--border-secondary:color-mix(in oklab, var(--surface) 78%, var(--surface-foreground) 22%)}}.dark,[data-theme=dark]{--border-tertiary:var(--surface)}@supports (color:color-mix(in lab,red,red)){.dark,[data-theme=dark]{--border-tertiary:color-mix(in oklab, var(--surface) 66%, var(--surface-foreground) 34%)}}[data-vibrant-palette=true]:not(.dark):not([data-theme=dark]){--accent-soft-foreground:var(--accent)}@supports (color:color-mix(in lab,red,red)){[data-vibrant-palette=true]:not(.dark):not([data-theme=dark]){--accent-soft-foreground:color-mix(in oklab, var(--accent) 92%, var(--foreground) 8%)}}[data-vibrant-palette=true]:not(.dark):not([data-theme=dark]){--danger-soft-foreground:var(--danger)}@supports (color:color-mix(in lab,red,red)){[data-vibrant-palette=true]:not(.dark):not([data-theme=dark]){--danger-soft-foreground:color-mix(in oklab, var(--danger) 92%, var(--foreground) 8%)}}[data-vibrant-palette=true]:not(.dark):not([data-theme=dark]){--warning-soft-foreground:var(--warning)}@supports (color:color-mix(in lab,red,red)){[data-vibrant-palette=true]:not(.dark):not([data-theme=dark]){--warning-soft-foreground:color-mix(in oklab, var(--warning) 92%, var(--foreground) 8%)}}[data-vibrant-palette=true]:not(.dark):not([data-theme=dark]){--success-soft-foreground:var(--success)}@supports (color:color-mix(in lab,red,red)){[data-vibrant-palette=true]:not(.dark):not([data-theme=dark]){--success-soft-foreground:color-mix(in oklab, var(--success) 92%, var(--foreground) 8%)}}[data-vibrant-palette=true].dark,[data-vibrant-palette=true][data-theme=dark]{--accent-soft-foreground:var(--accent)}@supports (color:color-mix(in lab,red,red)){[data-vibrant-palette=true].dark,[data-vibrant-palette=true][data-theme=dark]{--accent-soft-foreground:color-mix(in oklab, var(--accent) 92%, var(--foreground) 8%)}}[data-vibrant-palette=true].dark,[data-vibrant-palette=true][data-theme=dark]{--danger-soft-foreground:var(--danger)}@supports (color:color-mix(in lab,red,red)){[data-vibrant-palette=true].dark,[data-vibrant-palette=true][data-theme=dark]{--danger-soft-foreground:color-mix(in oklab, var(--danger) 92%, var(--foreground) 8%)}}[data-vibrant-palette=true].dark,[data-vibrant-palette=true][data-theme=dark]{--warning-soft-foreground:var(--warning)}@supports (color:color-mix(in lab,red,red)){[data-vibrant-palette=true].dark,[data-vibrant-palette=true][data-theme=dark]{--warning-soft-foreground:color-mix(in oklab, var(--warning) 92%, var(--foreground) 8%)}}[data-vibrant-palette=true].dark,[data-vibrant-palette=true][data-theme=dark]{--success-soft-foreground:var(--success)}@supports (color:color-mix(in lab,red,red)){[data-vibrant-palette=true].dark,[data-vibrant-palette=true][data-theme=dark]{--success-soft-foreground:color-mix(in oklab, var(--success) 92%, var(--foreground) 8%)}}}@layer components;}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{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]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*,:after,:before,::backdrop{border-color:var(--border,currentColor)}::file-selector-button{border-color:var(--border,currentColor)}:root{view-transition-name:none}::view-transition{pointer-events:none}[data-scrollbar=thin]{--scrollbar-width:thin;--scrollbar-color:var(--scrollbar-thumb) var(--scrollbar-track);--scrollbar-gutter:auto}[data-scrollbar=default]{--scrollbar-width:auto;--scrollbar-color:auto;--scrollbar-gutter:auto}[data-scrollbar=none]{--scrollbar-width:none;--scrollbar-color:auto;--scrollbar-gutter:auto}}@layer components{.close-button{isolation:isolate;height:calc(var(--spacing) * 6);width:calc(var(--spacing) * 6);transform-origin:50%;border-radius:calc(var(--radius) * 1.5);padding:var(--spacing);-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;cursor:var(--cursor-interactive);transition:transform .25s var(--ease-out-quart),color .15s var(--ease-out),background-color .1s var(--ease-out),box-shadow .15s var(--ease-out);transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);flex-shrink:0;justify-content:center;align-items:center;display:inline-flex;position:relative}.close-button:is([data-reduce-motion=true],[data-reduce-motion=true] *),.close-button:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.close-button:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.close-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.close-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.close-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.close-button:focus-visible:not(:focus),.close-button[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.close-button:disabled,.close-button[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.close-button[data-pending=true]{pointer-events:none}.close-button svg{pointer-events:none;width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);margin-inline:calc(var(--spacing) * -.5);margin-block:calc(var(--spacing) * .5);flex-shrink:0;align-self:center}.close-button--default{background-color:var(--default);color:var(--muted)}@media(hover:hover){.close-button--default:hover,.close-button--default[data-hovered=true]{background-color:var(--default-hover)}}.close-button--default:active,.close-button--default[data-pressed=true]{transform:scale(.93)}.description{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));text-wrap:wrap;overflow-wrap:break-word;color:var(--muted)}.error-message{height:auto;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));overflow-wrap:break-word;color:var(--danger);transition:opacity .15s var(--ease-out),height .35s var(--ease-smooth)}.error-message:is([data-reduce-motion=true],[data-reduce-motion=true] *),.error-message:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.error-message:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.error-message:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.error-message:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.error-message:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.field-error{height:0;padding-inline:var(--spacing);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));overflow-wrap:break-word;color:var(--danger);opacity:0}.field-error[data-visible]{opacity:1;height:auto}.field-error{transition:opacity .15s var(--ease-out),height .35s var(--ease-smooth)}.field-error:is([data-reduce-motion=true],[data-reduce-motion=true] *),.field-error:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.field-error:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.field-error:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.field-error:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.field-error:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.checkbox>.field-error,.checkbox>[data-slot=field-error],.switch>.field-error,.switch>[data-slot=field-error],.radio>.field-error,.radio>[data-slot=field-error]{height:auto;min-height:0;color:var(--muted);opacity:1;margin:0;padding:0;transition:none}.label{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--foreground)}:is(.label--required,[data-required=true]:not([role=group]):not([role=radiogroup]):not([role=checkboxgroup])>.label,[data-required=true]:not([data-slot=radio]):not([data-slot=checkbox])>.label):after{margin-left:calc(var(--spacing) * .5);color:var(--danger);--tw-content:"*";content:var(--tw-content)}.label--disabled,[data-disabled=true] .label{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.label--invalid,[data-invalid=true] .label,[aria-invalid=true] .label{color:var(--danger)}.accordion{contain:layout style;width:100%}.accordion__body{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.accordion__body-inner{padding-inline:calc(var(--spacing) * 4);padding-top:0;padding-bottom:calc(var(--spacing) * 4);color:var(--muted)}.accordion__indicator{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);color:var(--muted);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.25s;flex-shrink:0;margin-left:auto;transition-duration:.25s}.accordion__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *),.accordion__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.accordion__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.accordion__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.accordion__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.accordion__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.accordion__indicator[data-expanded=true]{rotate:-180deg}.accordion__item{--tw-border-style:none;border-style:none;position:relative}.accordion__item:after{content:"";border-radius:calc(var(--radius) * .25);background-color:var(--separator);width:100%;height:1px;position:absolute;bottom:0;left:0}.accordion__item:last-child:after{content:none}.accordion__item[data-hide-separator=true]:after{display:none}.accordion__trigger{cursor:var(--cursor-interactive);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 4);text-align:left;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);-webkit-tap-highlight-color:transparent;transition:opacity .15s var(--ease-out),box-shadow .15s var(--ease-out);flex:1;justify-content:space-between;align-items:center;display:flex}.accordion__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *),.accordion__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.accordion__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.accordion__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.accordion__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.accordion__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}@media(hover:hover){.accordion__trigger:hover:not([aria-expanded=true]),.accordion__trigger[data-hovered=true]:not([aria-expanded=true]){background-color:var(--foreground)}@supports (color:color-mix(in lab,red,red)){.accordion__trigger:hover:not([aria-expanded=true]),.accordion__trigger[data-hovered=true]:not([aria-expanded=true]){background-color:color-mix(in oklab,var(--foreground) 3%,transparent 90%)}}}.accordion__trigger:focus-visible:not(:focus),.accordion__trigger[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.accordion__trigger:disabled,.accordion__trigger[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.accordion__panel{opacity:0;height:var(--disclosure-panel-height);transition:height .2s var(--ease-out-quad),opacity .2s var(--ease-out);overflow:clip}.accordion__panel:is([data-reduce-motion=true],[data-reduce-motion=true] *),.accordion__panel:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.accordion__panel:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.accordion__panel:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.accordion__panel:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.accordion__panel:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.accordion__panel[data-expanded=true]{will-change:height,opacity;opacity:1}.accordion--surface{background-color:var(--surface);border-radius:min(32px,var(--radius-3xl))}@media(hover:hover){.accordion--surface .accordion__trigger:hover:not([aria-expanded=true]),.accordion--surface .accordion__trigger[data-hovered=true]:not([aria-expanded=true]){background-color:var(--default)}}.accordion--surface .accordion__item:after{background-color:var(--surface-foreground)}@supports (color:color-mix(in lab,red,red)){.accordion--surface .accordion__item:after{background-color:color-mix(in oklab,var(--surface-foreground) 6%,transparent)}}.accordion--surface .accordion__item:after{width:94%;left:3%}.accordion--surface .accordion__item:first-child [data-slot=accordion-trigger]{border-top-left-radius:min(32px,var(--radius-3xl));border-top-right-radius:min(32px,var(--radius-3xl))}.accordion--surface .accordion__item:last-child:not(:has([data-slot=accordion-trigger][aria-expanded=true])) [data-slot=accordion-trigger]{border-bottom-left-radius:min(32px,var(--radius-3xl));border-bottom-right-radius:min(32px,var(--radius-3xl))}.breadcrumbs{align-items:center;display:flex}.breadcrumbs .breadcrumbs__link{padding-inline:calc(var(--spacing) * .5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--muted);opacity:1;text-decoration-line:none;position:relative}.breadcrumbs .breadcrumbs__link:hover,.breadcrumbs .breadcrumbs__link[data-hovered=true]{text-decoration-line:underline}.breadcrumbs .breadcrumbs__link[data-current=true]{color:var(--link);opacity:1}.breadcrumbs .breadcrumbs__item{justify-content:center;align-items:center;gap:calc(var(--spacing) * .5);padding-inline:calc(var(--spacing) * .5);flex-shrink:0;display:flex}.breadcrumbs .breadcrumbs__separator{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3);color:var(--muted)}.breadcrumbs .breadcrumbs__separator:where(:dir(rtl),[dir=rtl],[dir=rtl] *){rotate:180deg}.disclosure-group{contain:layout style;width:100%}.disclosure{position:relative}.accordion__heading{display:flex}.disclosure__trigger{cursor:var(--cursor-interactive);-webkit-tap-highlight-color:transparent;display:inline-block}.disclosure__trigger:focus-visible:not(:focus),.disclosure__trigger[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.disclosure__trigger:disabled,.disclosure__trigger[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.disclosure__indicator{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);color:inherit;transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.25s;flex-shrink:0;margin-left:auto;transition-duration:.25s}.disclosure__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *),.disclosure__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.disclosure__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.disclosure__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.disclosure__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.disclosure__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.disclosure__indicator[data-expanded=true]{rotate:-180deg}.disclosure__content{opacity:0;height:var(--disclosure-panel-height);transition:height .2s var(--ease-out-quad),opacity .2s var(--ease-out);overflow:clip}.disclosure__content:is([data-reduce-motion=true],[data-reduce-motion=true] *),.disclosure__content:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.disclosure__content:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.disclosure__content:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.disclosure__content:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.disclosure__content:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.disclosure__content[data-expanded=true]{will-change:height,opacity;opacity:1}.disclosure__body{padding:calc(var(--spacing) * 2)}.link{border-radius:calc(var(--radius) * 1.5);--tw-font-weight:var(--font-weight-medium);width:fit-content;height:fit-content;font-weight:var(--font-weight-medium);color:var(--link);text-decoration-line:none;-webkit-text-decoration-color:var(--separator-tertiary);text-decoration-color:var(--separator-tertiary);text-underline-offset:4px;-webkit-tap-highlight-color:transparent;transition:color .1s var(--ease-smooth),background-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out),opacity .1s var(--ease-out);align-items:center;text-decoration-thickness:1.5px;display:inline-flex;position:relative}.link:is([data-reduce-motion=true],[data-reduce-motion=true] *),.link:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.link:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.link:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.link:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.link:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.link{cursor:var(--cursor-interactive)}@media(hover:hover){.link:hover,.link[data-hovered=true]{text-decoration-line:underline;-webkit-text-decoration-color:var(--muted);text-decoration-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.link:hover,.link[data-hovered=true]{-webkit-text-decoration-color:color-mix(in oklab,var(--muted) 50%,transparent);text-decoration-color:color-mix(in oklab,var(--muted) 50%,transparent)}}:is(.link:hover,.link[data-hovered=true]) .link__icon{opacity:1}}.link:active,.link[data-pressed=true]{text-decoration-line:underline;-webkit-text-decoration-color:var(--muted);text-decoration-color:var(--muted)}:is(.link:active,.link[data-pressed=true]) .link__icon{opacity:1}.link:focus-visible:not(:focus),.link[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}:is(.link:focus-visible:not(:focus),.link[data-focus-visible=true]) .link__icon{opacity:1}.link[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.link .link__icon{pointer-events:none;color:currentColor;opacity:.6;width:.75em;height:.75em;transition:opacity .15s var(--ease-out);flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.link .link__icon:is([data-reduce-motion=true],[data-reduce-motion=true] *),.link .link__icon:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.link .link__icon:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.link .link__icon:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.link .link__icon:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.link .link__icon:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.link .link__icon svg{transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.link .link__icon[data-default-icon=true]{margin-left:var(--spacing);padding-bottom:calc(var(--spacing) * 1.5)}.link.button{gap:0;text-decoration-line:none}.pagination{justify-content:space-between;align-items:center;gap:calc(var(--spacing) * 4);flex-direction:column;width:100%;display:flex}@media(min-width:40rem){.pagination{flex-direction:row}}.pagination__summary{align-items:center;gap:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--muted);align-self:flex-start;display:flex}@media(min-width:40rem){.pagination__summary{align-self:center}}.pagination__content{align-items:center;gap:var(--spacing);align-self:flex-start;display:flex}@media(min-width:40rem){.pagination__content{align-self:center}}.pagination__item{display:inline-flex}.pagination__link{isolation:isolate;width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9);transform-origin:50%;border-radius:calc(var(--radius) * 3);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);white-space:nowrap;--tw-outline-style:none;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;outline-style:none;justify-content:center;align-items:center;display:inline-flex;position:relative}@media(min-width:48rem){.pagination__link{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}}.pagination__link{cursor:var(--cursor-interactive);transition:transform .25s var(--ease-smooth),background-color .1s var(--ease-out),box-shadow .1s var(--ease-out);transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.pagination__link:is([data-reduce-motion=true],[data-reduce-motion=true] *),.pagination__link:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.pagination__link:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.pagination__link:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.pagination__link:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.pagination__link:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.pagination__link{--pagination-link-bg:transparent;--pagination-link-bg-hover:var(--default-hover);--pagination-link-bg-pressed:var(--default-hover);--pagination-link-fg:var(--default-foreground);background-color:var(--pagination-link-bg);color:var(--pagination-link-fg)}.pagination__link:focus-visible,.pagination__link[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.pagination__link:disabled,.pagination__link[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}@media(hover:hover){.pagination__link:hover,.pagination__link[data-hovered=true]{background-color:var(--pagination-link-bg-hover)}}.pagination__link:active,.pagination__link[data-pressed=true]{background-color:var(--pagination-link-bg-pressed);transform:scale(.97)}.pagination__link[data-active=true]{--pagination-link-bg:var(--default);--pagination-link-bg-hover:var(--default-hover);--pagination-link-bg-pressed:var(--default-hover)}.pagination__ellipsis{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--muted);-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;display:inline-flex}@media(min-width:48rem){.pagination__ellipsis{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}}.pagination__link--nav{gap:calc(var(--spacing) * 1.5);width:auto;padding-inline:calc(var(--spacing) * 2.5)}.pagination--sm .pagination__link{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}@media(min-width:48rem){.pagination--sm .pagination__link{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}}.pagination--sm .pagination__link:active,.pagination--sm .pagination__link[data-pressed=true]{transform:scale(.98)}.pagination--sm .pagination__link--nav{width:auto;padding-inline:calc(var(--spacing) * 2)}.pagination--sm .pagination__ellipsis{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}@media(min-width:48rem){.pagination--sm .pagination__ellipsis{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}}.pagination--sm .pagination__summary{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.pagination--lg .pagination__link{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}@media(min-width:48rem){.pagination--lg .pagination__link{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}}.pagination--lg .pagination__link:active,.pagination--lg .pagination__link[data-pressed=true]{transform:scale(.96)}.pagination--lg .pagination__link--nav{width:auto;padding-inline:calc(var(--spacing) * 3)}.pagination--lg .pagination__ellipsis{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}@media(min-width:48rem){.pagination--lg .pagination__ellipsis{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}}.pagination--lg .pagination__summary{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.tabs{gap:calc(var(--spacing) * 2);display:flex}.tabs[data-orientation=horizontal]{flex-direction:column}.tabs[data-orientation=vertical]{flex-direction:row}.tabs__list-container{position:relative}.tabs__list{background-color:var(--default);padding:var(--spacing);border-radius:calc(var(--radius) * 2.5);display:inline-flex}.tabs__list[data-orientation=horizontal]{flex-direction:row;width:100%}.tabs__list[data-orientation=vertical]{gap:var(--spacing);flex-direction:column}.tabs__list[data-orientation=vertical] .tabs__tab{min-width:calc(var(--spacing) * 20)}.tabs__tab{z-index:1;cursor:var(--cursor-interactive);height:calc(var(--spacing) * 8);border-radius:calc(var(--radius) * 3);width:100%;padding-inline:calc(var(--spacing) * 4);text-align:center;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--muted);--tw-outline-style:none;-webkit-tap-highlight-color:transparent;transition:color .15s var(--ease-smooth),background-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out),opacity .15s var(--ease-smooth);outline-style:none;justify-content:center;align-items:center;display:flex;position:relative}.tabs__tab:is([data-reduce-motion=true],[data-reduce-motion=true] *),.tabs__tab:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.tabs__tab:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.tabs__tab:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.tabs__tab:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.tabs__tab:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.tabs__tab[data-selected=true]{color:var(--segment-foreground)}.tabs__tab[data-selected=true] .tabs__separator,.tabs__tab[data-selected=true]+.tabs__tab .tabs__separator{opacity:0}.tabs__tab:disabled,.tabs__tab[data-disabled=true],.tabs__tab[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}@media(hover:hover){.tabs__tab:not([data-selected=true]):not([data-disabled=true]):hover,.tabs__tab[data-hovered=true]:not([data-selected=true]):not([data-disabled=true]){opacity:.7}}.tabs__tab:focus-visible:not(:focus),.tabs__tab[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.tabs__separator{border-radius:calc(var(--radius) * .5);background-color:var(--muted)}@supports (color:color-mix(in lab,red,red)){.tabs__separator{background-color:color-mix(in oklab,var(--muted) 25%,transparent)}}.tabs__separator{pointer-events:none;transition:opacity .15s var(--ease-smooth);position:absolute}.tabs__separator:is([data-reduce-motion=true],[data-reduce-motion=true] *),.tabs__separator:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.tabs__separator:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.tabs__separator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.tabs__separator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.tabs__separator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.tabs__list[data-orientation=horizontal] .tabs__separator{width:1px;height:50%;top:25%;left:0}.tabs__list[data-orientation=vertical] .tabs__separator{width:90%;height:1px;top:0;left:5%}.tabs__panel{width:100%;padding:calc(var(--spacing) * 2);--tw-outline-style:none;outline-style:none}.tabs__panel[data-exiting=true]{width:100%;position:absolute;top:0;left:0}.tabs__panel[data-orientation=horizontal]{margin-top:calc(var(--spacing) * 4)}.tabs__panel[data-orientation=vertical]{margin-left:calc(var(--spacing) * 4)}.tabs__indicator{box-shadow:var(--shadow-surface);z-index:-1;border-radius:var(--radius-3xl);background-color:var(--segment);width:100%;height:100%;transition-property:translate,width,height;transition-duration:.25s;transition-timing-function:var(--ease-out-fluid);position:absolute;top:0;left:0}.tabs__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *),.tabs__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.tabs__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.tabs__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.tabs__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.tabs__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.tabs--secondary>.tabs__list-container>.tabs__list{background-color:#0000;border-radius:0;padding:0}.tabs--secondary>.tabs__list-container>.tabs__list[data-orientation=horizontal]{scrollbar-color:auto;scrollbar-gutter:auto;-ms-overflow-style:none;scrollbar-width:none;border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--border);max-width:100%;overflow:auto clip}.tabs--secondary>.tabs__list-container>.tabs__list[data-orientation=vertical]{border-left-style:var(--tw-border-style);border-left-width:1px;border-color:var(--border)}.tabs--secondary>.tabs__list-container .tabs__tab{border-radius:0}.tabs--secondary>.tabs__list-container .tabs__tab[data-selected=true]{color:var(--foreground)}.tabs--secondary>.tabs__list-container .tabs__separator{display:none}.tabs--secondary>.tabs__list-container .tabs__indicator{background-color:var(--accent);box-shadow:none;border-radius:0}.tabs--secondary[data-orientation=horizontal]>.tabs__list-container .tabs__indicator{height:2px;top:auto;bottom:0}.tabs--secondary[data-orientation=vertical]>.tabs__list-container .tabs__indicator{width:2px;height:100%;top:0;left:0}.button{isolation:isolate;height:calc(var(--spacing) * 10);transform-origin:50%;justify-content:center;align-items:center;gap:calc(var(--spacing) * 2);border-radius:calc(var(--radius) * 3);width:fit-content;padding-inline:calc(var(--spacing) * 4);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);white-space:nowrap;--tw-outline-style:none;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;outline-style:none;display:inline-flex;position:relative}@media(min-width:48rem){.button{height:calc(var(--spacing) * 9)}}.button{transition:transform .25s var(--ease-smooth),background-color .1s var(--ease-out),box-shadow .1s var(--ease-out);transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.button:is([data-reduce-motion=true],[data-reduce-motion=true] *),.button:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.button:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.button{cursor:var(--cursor-interactive);--button-bg:transparent;--button-bg-hover:var(--button-bg);--button-bg-pressed:var(--button-bg-hover);--button-fg:currentColor;background-color:var(--button-bg);color:var(--button-fg)}.button:focus-visible:not(:focus),.button[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.button:disabled,.button[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.button[data-pending=true]{pointer-events:none}.button:active,.button[data-pressed=true]{background-color:var(--button-bg-pressed);transform:scale(.97)}@media(hover:hover){.button:hover,.button[data-hovered=true]{background-color:var(--button-bg-hover)}}.button svg:not([data-slot=spinner] svg,[data-slot=link-icon] svg){pointer-events:none;margin-inline:calc(var(--spacing) * -.5);margin-block:calc(var(--spacing) * .5);width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5);flex-shrink:0;align-self:center}@media(min-width:40rem){.button svg:not([data-slot=spinner] svg,[data-slot=link-icon] svg){margin-block:var(--spacing);width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}}.button--sm{height:calc(var(--spacing) * 9);padding-inline:calc(var(--spacing) * 3)}@media(min-width:48rem){.button--sm{height:calc(var(--spacing) * 8)}}.button--sm svg:not([data-slot=spinner] svg,[data-slot=link-icon] svg){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.button--sm:active,.button--sm[data-pressed=true]{transform:scale(.98)}.button--lg{height:calc(var(--spacing) * 11);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}@media(min-width:48rem){.button--lg{height:calc(var(--spacing) * 10)}}.button--lg:active,.button--lg[data-pressed=true]{transform:scale(.96)}.button--primary{--button-bg:var(--accent);--button-bg-hover:var(--accent-hover);--button-bg-pressed:var(--accent-hover);--button-fg:var(--accent-foreground)}.button--secondary{--button-bg:var(--default);--button-bg-hover:var(--default-hover);--button-bg-pressed:var(--default-hover);--button-fg:var(--accent-soft-foreground)}.button--tertiary{--button-bg:var(--default);--button-bg-hover:var(--default-hover);--button-bg-pressed:var(--default-hover)}.button--ghost,.button--outline{--button-bg:transparent;--button-bg-hover:var(--default);--button-bg-pressed:var(--default);--button-fg:var(--default-foreground)}.button--outline{border-style:var(--tw-border-style);border-width:1px;border-color:var(--border);--button-bg-hover:var(--default)}@supports (color:color-mix(in lab,red,red)){.button--outline{--button-bg-hover:color-mix(in srgb, var(--default) 60%, transparent)}}.button--danger{--button-bg:var(--danger);--button-bg-hover:var(--danger-hover);--button-bg-pressed:var(--danger-hover);--button-fg:var(--danger-foreground)}.button--danger-soft{--button-bg:var(--danger-soft);--button-bg-hover:var(--danger-soft-hover);--button-bg-pressed:var(--danger-soft-hover);--button-fg:var(--danger-soft-foreground)}.button--icon-only{width:calc(var(--spacing) * 10);padding:0}@media(min-width:48rem){.button--icon-only{width:calc(var(--spacing) * 9)}}.button--icon-only.button--sm{width:calc(var(--spacing) * 9)}@media(min-width:48rem){.button--icon-only.button--sm{width:calc(var(--spacing) * 8)}}.button--icon-only.button--lg{width:calc(var(--spacing) * 11)}@media(min-width:48rem){.button--icon-only.button--lg{width:calc(var(--spacing) * 10)}}.button--full-width{width:100%}.button-group{justify-content:center;align-items:center;gap:0;height:auto;display:inline-flex}.button-group--horizontal{flex-direction:row}.button-group--vertical{flex-direction:column}.button-group .button{border-radius:0}.button-group--horizontal .button:first-child{border-start-start-radius:calc(var(--radius) * 3);border-end-start-radius:calc(var(--radius) * 3)}.button-group--horizontal .button:last-child{border-start-end-radius:calc(var(--radius) * 3);border-end-end-radius:calc(var(--radius) * 3)}.button-group--horizontal .button:first-child:last-child{border-radius:calc(var(--radius) * 3)}.button-group--vertical .button:first-child{border-top-left-radius:calc(var(--radius) * 3);border-top-right-radius:calc(var(--radius) * 3)}.button-group--vertical .button:last-child{border-bottom-right-radius:calc(var(--radius) * 3);border-bottom-left-radius:calc(var(--radius) * 3)}.button-group--vertical .button:first-child:last-child{border-radius:calc(var(--radius) * 3)}.button-group .button:active,.button-group .button[data-pressed=true]{transform:none}.button-group .button:focus-visible:not(:focus),.button-group .button[data-focus-visible=true]{--tw-ring-offset-width:0px;--tw-ring-inset:inset}.button-group__separator{border-radius:calc(var(--radius) * .5);opacity:.15;pointer-events:none;transition:opacity .15s var(--ease-smooth);background-color:currentColor;position:absolute}.button-group__separator:is([data-reduce-motion=true],[data-reduce-motion=true] *),.button-group__separator:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.button-group__separator:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.button-group__separator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.button-group__separator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.button-group__separator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.button-group--horizontal .button-group__separator{width:1px;height:50%;top:25%;left:-1px}.button-group--vertical .button-group__separator{width:50%;height:1px;top:-1px;left:25%}.button-group--horizontal .button--outline:first-child{border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}.button-group--horizontal .button--outline:last-child{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.button-group--horizontal .button--outline:not(:first-child):not(:last-child){border-inline-style:var(--tw-border-style);border-inline-width:0}.button-group--vertical .button--outline:first-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.button-group--vertical .button--outline:last-child{border-top-style:var(--tw-border-style);border-top-width:0}.button-group--vertical .button--outline:not(:first-child):not(:last-child){border-block-style:var(--tw-border-style);border-block-width:0}.button-group--full-width{width:100%}.toggle-button{isolation:isolate;height:calc(var(--spacing) * 10);transform-origin:50%;justify-content:center;align-items:center;gap:calc(var(--spacing) * 2);border-radius:calc(var(--radius) * 3);width:fit-content;padding-inline:calc(var(--spacing) * 4);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);white-space:nowrap;--tw-outline-style:none;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;outline-style:none;display:inline-flex;position:relative}@media(min-width:48rem){.toggle-button{height:calc(var(--spacing) * 9)}}.toggle-button{transition:transform .25s var(--ease-smooth),background-color .1s var(--ease-out),box-shadow .1s var(--ease-out);transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.toggle-button:is([data-reduce-motion=true],[data-reduce-motion=true] *),.toggle-button:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.toggle-button:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.toggle-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.toggle-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.toggle-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.toggle-button{cursor:var(--cursor-interactive);--toggle-button-bg:var(--default);--toggle-button-bg-hover:var(--default-hover);--toggle-button-bg-pressed:var(--default-hover);--toggle-button-fg:currentColor;--toggle-button-bg-selected:var(--accent-soft);--toggle-button-bg-selected-hover:var(--accent-soft-hover);--toggle-button-bg-selected-pressed:var(--accent-soft-hover);--toggle-button-fg-selected:var(--accent-soft-foreground);background-color:var(--toggle-button-bg);color:var(--toggle-button-fg)}.toggle-button:focus-visible:not(:focus),.toggle-button[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.toggle-button:disabled,.toggle-button[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}@media(hover:hover){.toggle-button:hover,.toggle-button[data-hovered=true]{background-color:var(--toggle-button-bg-hover)}}.toggle-button:active,.toggle-button[data-pressed=true]{background-color:var(--toggle-button-bg-pressed);transform:scale(.97)}.toggle-button[data-selected=true]{background-color:var(--toggle-button-bg-selected);color:var(--toggle-button-fg-selected)}@media(hover:hover){.toggle-button[data-selected=true]:hover,.toggle-button[data-selected=true][data-hovered=true]{background-color:var(--toggle-button-bg-selected-hover)}}.toggle-button[data-selected=true]:active,.toggle-button[data-selected=true][data-pressed=true]{background-color:var(--toggle-button-bg-selected-pressed)}.toggle-button svg{pointer-events:none;margin-inline:calc(var(--spacing) * -.5);margin-block:calc(var(--spacing) * .5);width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5);flex-shrink:0;align-self:center}@media(min-width:40rem){.toggle-button svg{margin-block:var(--spacing);width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}}.toggle-button--sm{height:calc(var(--spacing) * 9);padding-inline:calc(var(--spacing) * 3)}@media(min-width:48rem){.toggle-button--sm{height:calc(var(--spacing) * 8)}}.toggle-button--sm svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.toggle-button--sm:active,.toggle-button--sm[data-pressed=true]{transform:scale(.98)}.toggle-button--lg{height:calc(var(--spacing) * 11);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}@media(min-width:48rem){.toggle-button--lg{height:calc(var(--spacing) * 10)}}.toggle-button--lg:active,.toggle-button--lg[data-pressed=true]{transform:scale(.96)}.toggle-button--default{--toggle-button-bg:var(--default);--toggle-button-bg-hover:var(--default-hover);--toggle-button-bg-pressed:var(--default-hover)}.toggle-button--ghost{--toggle-button-bg:transparent;--toggle-button-bg-hover:var(--default);--toggle-button-bg-pressed:var(--default);--toggle-button-fg:var(--default-foreground)}.toggle-button--icon-only{width:calc(var(--spacing) * 10);padding:0}@media(min-width:48rem){.toggle-button--icon-only{width:calc(var(--spacing) * 9)}}.toggle-button--icon-only.toggle-button--sm{width:calc(var(--spacing) * 9)}@media(min-width:48rem){.toggle-button--icon-only.toggle-button--sm{width:calc(var(--spacing) * 8)}}.toggle-button--icon-only.toggle-button--lg{width:calc(var(--spacing) * 11)}@media(min-width:48rem){.toggle-button--icon-only.toggle-button--lg{width:calc(var(--spacing) * 10)}}.toggle-button-group{justify-content:center;align-items:center;gap:0;width:fit-content;height:auto;display:inline-flex}.toggle-button-group--horizontal{flex-direction:row}.toggle-button-group--vertical{flex-direction:column}.toggle-button-group--full-width{width:100%}.toggle-button-group .toggle-button{border-radius:0}.toggle-button-group--horizontal .toggle-button:first-child{border-start-start-radius:calc(var(--radius) * 3);border-end-start-radius:calc(var(--radius) * 3)}.toggle-button-group--horizontal .toggle-button:last-child{border-start-end-radius:calc(var(--radius) * 3);border-end-end-radius:calc(var(--radius) * 3)}.toggle-button-group--horizontal .toggle-button:first-child:last-child{border-radius:calc(var(--radius) * 3)}.toggle-button-group--vertical .toggle-button:first-child{border-top-left-radius:calc(var(--radius) * 3);border-top-right-radius:calc(var(--radius) * 3)}.toggle-button-group--vertical .toggle-button:last-child{border-bottom-right-radius:calc(var(--radius) * 3);border-bottom-left-radius:calc(var(--radius) * 3)}.toggle-button-group--vertical .toggle-button:first-child:last-child{border-radius:calc(var(--radius) * 3)}.toggle-button-group .toggle-button:active,.toggle-button-group .toggle-button[data-pressed=true]{transform:none}.toggle-button-group .toggle-button:focus-visible:not(:focus),.toggle-button-group .toggle-button[data-focus-visible=true]{--tw-ring-offset-width:0px;--tw-ring-inset:inset}.toggle-button-group--full-width .toggle-button{flex:1}.toggle-button-group__separator{border-radius:calc(var(--radius) * .5);opacity:.15;pointer-events:none;transition:opacity .15s var(--ease-smooth);background-color:currentColor;position:absolute}.toggle-button-group__separator:is([data-reduce-motion=true],[data-reduce-motion=true] *),.toggle-button-group__separator:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.toggle-button-group__separator:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.toggle-button-group__separator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.toggle-button-group__separator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.toggle-button-group__separator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.toggle-button-group--horizontal .toggle-button-group__separator{width:1px;height:50%;top:25%;left:-1px}.toggle-button-group--vertical .toggle-button-group__separator{width:50%;height:1px;top:-1px;left:25%}.toggle-button-group--detached{gap:var(--spacing)}.toggle-button-group--detached .toggle-button{border-radius:calc(var(--radius) * 3)}.toggle-button-group--detached .toggle-button-group__separator{display:none}.toolbar{align-items:center;gap:calc(var(--spacing) * 2);grid-auto-flow:column;width:fit-content;display:grid}.toolbar .separator--vertical{align-self:center;height:50%}.toolbar .separator--horizontal{justify-content:center;justify-self:center;width:50%}.toolbar--vertical{grid-auto-flow:row;justify-content:flex-start;align-items:flex-start}.toolbar--vertical .button-group{justify-content:flex-start}.toolbar--attached{border-radius:calc(var(--radius) * 3);background-color:var(--surface);padding:var(--spacing);--tw-shadow:var(--overlay-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dropdown{gap:var(--spacing);flex-direction:column;display:flex}.dropdown__trigger{--tw-outline-style:none;transition:transform .25s var(--ease-out-quart),background-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out);transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);outline-style:none;display:inline-block}.dropdown__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *),.dropdown__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.dropdown__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.dropdown__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.dropdown__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.dropdown__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.dropdown__trigger{cursor:var(--cursor-interactive)}.dropdown__trigger:focus-visible:not(:focus),.dropdown__trigger[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.dropdown__trigger:disabled,.dropdown__trigger[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.dropdown__trigger[data-pending=true]{pointer-events:none}.dropdown__trigger:active,.dropdown__trigger[data-pressed=true]{transform:scale(.97)}.dropdown__popover{max-width:48svw;transform-origin:var(--trigger-anchor-point);scroll-padding-block:var(--spacing);scrollbar-width:var(--scrollbar-width);scrollbar-color:var(--scrollbar-color);scrollbar-gutter:var(--scrollbar-gutter);overscroll-behavior:contain;background-color:var(--overlay);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));padding:0;overflow-y:auto}@media(min-width:48rem){.dropdown__popover{min-width:calc(var(--spacing) * 55)}}.dropdown__popover{border-radius:min(32px,var(--radius-3xl));box-shadow:var(--shadow-overlay)}.dropdown__popover:focus-visible:not(:focus),.dropdown__popover[data-focus-visible=true]{--tw-outline-style:none;outline-style:none}.dropdown__popover[data-entering=true]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.15s;--tw-ease:ease;--tw-enter-opacity:0;--tw-enter-scale:.9;transition-duration:.15s;transition-timing-function:ease}.dropdown__popover[data-entering=true][data-placement=top]{--tw-enter-translate-y:calc(1*var(--spacing))}.dropdown__popover[data-entering=true][data-placement=bottom]{--tw-enter-translate-y:calc(1*var(--spacing)*-1)}.dropdown__popover[data-entering=true][data-placement=left]{--tw-enter-translate-x:calc(1*var(--spacing))}.dropdown__popover[data-entering=true][data-placement=right]{--tw-enter-translate-x:calc(1*var(--spacing)*-1)}.dropdown__popover[data-exiting=true]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.1s;--tw-ease:ease;--tw-exit-scale:.95;--tw-exit-opacity:0;transition-duration:.1s;transition-timing-function:ease}.dropdown__popover[data-exiting=true],.dropdown__popover[data-entering=true]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));will-change:opacity,transform}.dropdown__popover [data-slot=popover-overlay-arrow]{fill:var(--overlay)}.dropdown__popover[data-placement=bottom] [data-slot=popover-overlay-arrow]{rotate:180deg}.dropdown__popover[data-placement=left] [data-slot=popover-overlay-arrow]{rotate:-90deg}.dropdown__popover[data-placement=right] [data-slot=popover-overlay-arrow]{rotate:90deg}.dropdown__popover [data-slot=dropdown-menu]{padding:calc(var(--spacing) * 1.5);--tw-outline-style:none;outline-style:none}.dropdown__popover [data-slot=menu-item]{padding-inline:calc(var(--spacing) * 2.5)}.dropdown__menu{gap:calc(var(--spacing) * .5);width:100%;padding:var(--spacing);flex-direction:column;display:flex;position:relative;overflow:clip}.dropdown__menu [data-slot=separator]{width:94%;margin-left:3%}.list-box-item{min-height:calc(var(--spacing) * 9);justify-content:flex-start;align-items:center;gap:calc(var(--spacing) * 3);border-radius:calc(var(--radius) * 2);width:100%;padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * 1.5);--tw-outline-style:none;-webkit-tap-highlight-color:transparent;transition:transform .25s var(--ease-out-quart),box-shadow .15s var(--ease-out);outline-style:none;display:flex;position:relative}.list-box-item:is([data-reduce-motion=true],[data-reduce-motion=true] *),.list-box-item:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.list-box-item:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.list-box-item:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.list-box-item:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.list-box-item:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.list-box-item{cursor:var(--cursor-interactive)}.list-box-item [data-slot=label]{pointer-events:none;-webkit-user-select:none;user-select:none;width:fit-content}.list-box-item [data-slot=description]{pointer-events:none;text-wrap:wrap;-webkit-user-select:none;user-select:none}.list-box-item:has(.list-box-item__indicator){padding-inline-end:calc(var(--spacing) * 7)}.list-box-item:focus-visible:not(:focus),.list-box-item[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.list-box-item:active,.list-box-item[data-pressed=true]{transform:scale(.98)}@media(hover:hover){.list-box-item:hover,.list-box-item[data-hovered=true]{background-color:var(--default)}}.list-box-item[data-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.list-box-item__indicator{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y);color:var(--default-foreground);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.25s;inset-inline-end:calc(var(--spacing) * 2);flex-shrink:0;justify-content:center;align-items:center;transition-duration:.25s;display:flex;position:absolute;top:50%}.list-box-item__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *),.list-box-item__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.list-box-item__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.list-box-item__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.list-box-item__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.list-box-item__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.list-box-item__indicator [data-slot=list-box-item-indicator--checkmark]{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;transition-duration:.3s}.list-box-item__indicator [data-slot=list-box-item-indicator--checkmark]:is([data-reduce-motion=true],[data-reduce-motion=true] *),.list-box-item__indicator [data-slot=list-box-item-indicator--checkmark]:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.list-box-item__indicator [data-slot=list-box-item-indicator--checkmark]:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.list-box-item__indicator [data-slot=list-box-item-indicator--checkmark]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.list-box-item__indicator [data-slot=list-box-item-indicator--checkmark]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.list-box-item__indicator [data-slot=list-box-item-indicator--checkmark]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.list-box-item__indicator .list-box-item[aria-selected=true] [data-slot=list-box-item-indicator--checkmark],.list-box-item__indicator .list-box-item[data-selected=true] [data-slot=list-box-item-indicator--checkmark]{transition:stroke-dashoffset .25s linear}:is(.list-box-item__indicator .list-box-item[aria-selected=true] [data-slot=list-box-item-indicator--checkmark],.list-box-item__indicator .list-box-item[data-selected=true] [data-slot=list-box-item-indicator--checkmark]):is([data-reduce-motion=true],[data-reduce-motion=true] *),:is(.list-box-item__indicator .list-box-item[aria-selected=true] [data-slot=list-box-item-indicator--checkmark],.list-box-item__indicator .list-box-item[data-selected=true] [data-slot=list-box-item-indicator--checkmark]):is([data-reduce-motion=true],[data-reduce-motion=true] *):before,:is(.list-box-item__indicator .list-box-item[aria-selected=true] [data-slot=list-box-item-indicator--checkmark],.list-box-item__indicator .list-box-item[data-selected=true] [data-slot=list-box-item-indicator--checkmark]):is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){:is(.list-box-item__indicator .list-box-item[aria-selected=true] [data-slot=list-box-item-indicator--checkmark],.list-box-item__indicator .list-box-item[data-selected=true] [data-slot=list-box-item-indicator--checkmark]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),:is(.list-box-item__indicator .list-box-item[aria-selected=true] [data-slot=list-box-item-indicator--checkmark],.list-box-item__indicator .list-box-item[data-selected=true] [data-slot=list-box-item-indicator--checkmark]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,:is(.list-box-item__indicator .list-box-item[aria-selected=true] [data-slot=list-box-item-indicator--checkmark],.list-box-item__indicator .list-box-item[data-selected=true] [data-slot=list-box-item-indicator--checkmark]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.list-box-item--danger .list-box-item__indicator,.list-box-item--danger [data-slot=label]{color:var(--danger)}.list-box-section{flex-direction:column;align-items:flex-start;gap:0;display:flex}.list-box{width:100%;padding:var(--spacing);position:relative;overflow:clip}.list-box>*+*{margin-top:var(--spacing)}.list-box [data-slot=separator][data-orientation=horizontal]{width:94%;margin-left:3%}.menu-item{min-height:calc(var(--spacing) * 9);justify-content:flex-start;align-items:center;gap:calc(var(--spacing) * 3);border-radius:calc(var(--radius) * 2);width:100%;padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * 1.5);--tw-outline-style:none;-webkit-tap-highlight-color:transparent;transition:transform .25s var(--ease-out-quart),box-shadow .15s var(--ease-out);outline-style:none;display:flex;position:relative}.menu-item:is([data-reduce-motion=true],[data-reduce-motion=true] *),.menu-item:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.menu-item:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.menu-item:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.menu-item:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.menu-item:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.menu-item{cursor:var(--cursor-interactive)}.menu-item [data-slot=label]{pointer-events:none;-webkit-user-select:none;user-select:none;width:fit-content}.menu-item [data-slot=description]{pointer-events:none;text-wrap:wrap;-webkit-user-select:none;user-select:none}.menu-item [data-slot=submenu-indicator] svg{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.menu-item:has(.menu-item__indicator){padding-inline-start:calc(var(--spacing) * 7)}.menu-item[data-has-submenu=true]:has(.menu-item__indicator){padding-inline-start:calc(var(--spacing) * 2);padding-inline-end:calc(var(--spacing) * 7)}.menu-item:focus-visible:not(:focus),.menu-item[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.menu-item:active,.menu-item[data-pressed=true]{transform:scale(.98)}@media(hover:hover){.menu-item:hover,.menu-item[data-hovered=true]{background-color:var(--default)}}:is(.menu-item[aria-checked=true],.menu-item[aria-selected=true],.menu-item[data-selected=true]) [data-slot=menu-item-indicator--checkmark]{transition:stroke-dashoffset .1s linear}:is(.menu-item[aria-checked=true],.menu-item[aria-selected=true],.menu-item[data-selected=true]) [data-slot=menu-item-indicator--checkmark]:is([data-reduce-motion=true],[data-reduce-motion=true] *),:is(.menu-item[aria-checked=true],.menu-item[aria-selected=true],.menu-item[data-selected=true]) [data-slot=menu-item-indicator--checkmark]:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,:is(.menu-item[aria-checked=true],.menu-item[aria-selected=true],.menu-item[data-selected=true]) [data-slot=menu-item-indicator--checkmark]:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){:is(.menu-item[aria-checked=true],.menu-item[aria-selected=true],.menu-item[data-selected=true]) [data-slot=menu-item-indicator--checkmark]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),:is(.menu-item[aria-checked=true],.menu-item[aria-selected=true],.menu-item[data-selected=true]) [data-slot=menu-item-indicator--checkmark]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,:is(.menu-item[aria-checked=true],.menu-item[aria-selected=true],.menu-item[data-selected=true]) [data-slot=menu-item-indicator--checkmark]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}:is(.menu-item[aria-checked=true],.menu-item[aria-selected=true],.menu-item[data-selected=true]) [data-slot=menu-item-indicator--dot]{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y);opacity:1}.menu-item[data-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.menu-item__indicator{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y);color:var(--muted);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.25s;inset-inline-start:calc(var(--spacing) * 2);flex-shrink:0;justify-content:center;align-items:center;transition-duration:.25s;display:flex;position:absolute;top:50%}.menu-item__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *),.menu-item__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.menu-item__indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.menu-item__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.menu-item__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.menu-item__indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.menu-item[data-has-submenu=true] .menu-item__indicator{inset-inline-start:auto;inset-inline-end:calc(var(--spacing) * 2)}.menu-item__indicator [data-slot=menu-item-indicator--checkmark]{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.menu-item[data-selection-mode=multiple] :is(.menu-item__indicator [data-slot=menu-item-indicator--checkmark]){transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;transition-duration:.3s}.menu-item[data-selection-mode=multiple] :is(.menu-item__indicator [data-slot=menu-item-indicator--checkmark]):is([data-reduce-motion=true],[data-reduce-motion=true] *),.menu-item[data-selection-mode=multiple] :is(.menu-item__indicator [data-slot=menu-item-indicator--checkmark]):is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.menu-item[data-selection-mode=multiple] :is(.menu-item__indicator [data-slot=menu-item-indicator--checkmark]):is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.menu-item[data-selection-mode=multiple] :is(.menu-item__indicator [data-slot=menu-item-indicator--checkmark]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.menu-item[data-selection-mode=multiple] :is(.menu-item__indicator [data-slot=menu-item-indicator--checkmark]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.menu-item[data-selection-mode=multiple] :is(.menu-item__indicator [data-slot=menu-item-indicator--checkmark]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.menu-item__indicator [data-slot=menu-item-indicator--dot]{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.menu-item[data-selection-mode=multiple] :is(.menu-item__indicator [data-slot=menu-item-indicator--dot]){transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.25s;transition-duration:.25s}.menu-item[data-selection-mode=multiple] :is(.menu-item__indicator [data-slot=menu-item-indicator--dot]):is([data-reduce-motion=true],[data-reduce-motion=true] *),.menu-item[data-selection-mode=multiple] :is(.menu-item__indicator [data-slot=menu-item-indicator--dot]):is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.menu-item[data-selection-mode=multiple] :is(.menu-item__indicator [data-slot=menu-item-indicator--dot]):is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.menu-item[data-selection-mode=multiple] :is(.menu-item__indicator [data-slot=menu-item-indicator--dot]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.menu-item[data-selection-mode=multiple] :is(.menu-item__indicator [data-slot=menu-item-indicator--dot]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.menu-item[data-selection-mode=multiple] :is(.menu-item__indicator [data-slot=menu-item-indicator--dot]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.menu-item__indicator [data-slot=menu-item-indicator--dot]{--tw-scale-x:70%;--tw-scale-y:70%;--tw-scale-z:70%;scale:var(--tw-scale-x) var(--tw-scale-y);opacity:0}.menu-item__indicator--submenu{color:var(--muted)}.menu-item__indicator--submenu svg{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.menu-item--danger .menu-item__indicator,.menu-item--danger [data-slot=label]{color:var(--danger)}.menu-section{flex-direction:column;align-items:flex-start;gap:0;display:flex}.menu{gap:var(--spacing);width:100%;padding:var(--spacing);flex-direction:column;display:flex;position:relative;overflow:clip}.menu [data-slot=separator]{width:94%;margin-left:3%}.tag-group{gap:var(--spacing);flex-direction:column;display:flex;position:relative}.tag-group__list{gap:calc(var(--spacing) * 1.5);flex-wrap:wrap;display:flex;position:relative}.tag-group [slot=description],.tag-group [data-slot=description],.tag-group [slot=errorMessage],.tag-group [data-slot=error-message]{padding:var(--spacing)}.tag{--optical-offset:.031em;align-items:center;gap:var(--spacing);border-radius:calc(var(--radius) * 1.5);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;transition:color .1s var(--ease-smooth),scale .1s var(--ease-smooth),opacity .1s var(--ease-smooth),background-color .1s var(--ease-smooth),box-shadow .1s var(--ease-out);transform-origin:50%;transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);display:inline-flex;position:relative}.tag:is([data-reduce-motion=true],[data-reduce-motion=true] *),.tag:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.tag:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.tag:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.tag:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.tag:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.tag{cursor:var(--cursor-interactive)}.tag svg{pointer-events:none;width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3);color:currentColor;flex-shrink:0;align-self:center}.tag:is([data-disabled=true],[aria-disabled=true]){opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.tag:is(:focus-visible,[data-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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.tag:is([data-selected=true],[aria-selected=true]){background-color:var(--accent-soft);color:var(--accent-soft-foreground)}@media(hover:hover){.tag:is([data-selected=true],[aria-selected=true]):is(:hover,[data-hovered=true]){background-color:var(--accent-soft-hover)}}.tag--sm{padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.tag--md{padding-inline:calc(var(--spacing) * 2);padding-block:var(--spacing);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.tag--lg{border-radius:calc(var(--radius) * 2);padding-inline:calc(var(--spacing) * 2.5);padding-block:calc(var(--spacing) * 1.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.tag--default{background-color:var(--default);color:var(--default-foreground)}@media(hover:hover){.tag--default:is(:hover,[data-hovered=true]):not([data-selected=true]):not([data-disabled=true]){background-color:var(--default-hover)}}.tag--surface{background-color:var(--surface);color:var(--surface-foreground)}@media(hover:hover){.tag--surface:is(:hover,[data-hovered=true]):not([data-selected=true]):not([data-disabled=true]){background-color:var(--surface-hover)}}.tag__remove-button{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3);color:inherit}.tag__remove-button svg{width:inherit;height:inherit;color:currentColor;flex-shrink:0;align-self:center}.color-area{width:100%;max-width:calc(var(--spacing) * 56);border-radius:calc(var(--radius) * 2);-webkit-tap-highlight-color:transparent;aspect-ratio:1;background:var(--color-area-background);flex-shrink:0;position:relative;box-shadow:inset 0 0 0 1px #0000001a}.color-area[data-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.color-area--show-dots:after{content:"";pointer-events:none;border-radius:inherit;background-image:radial-gradient(circle,#fff3 1px,#0000 1px);background-size:8px 8px;position:absolute;top:0;right:0;bottom:0;left:0}.color-area__thumb{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);border-radius:calc(var(--radius) * 1.5);will-change:width,height;background-color:var(--color-area-thumb-color);transition:width .15s var(--ease-out),height .15s var(--ease-out);border:3px solid #fff;box-shadow:0 0 0 1px #0000001a,inset 0 0 0 1px #0000001a}.color-area__thumb:is([data-reduce-motion=true],[data-reduce-motion=true] *),.color-area__thumb:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.color-area__thumb:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.color-area__thumb:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.color-area__thumb:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.color-area__thumb:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.color-area__thumb[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.color-area__thumb[data-dragging=true]{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.color-area__thumb[data-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.color-picker{display:inline-flex}.color-picker__trigger{align-items:center;gap:calc(var(--spacing) * 3);border-radius:calc(var(--radius) * .5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));-webkit-tap-highlight-color:transparent;cursor:var(--cursor-interactive);transition:background-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out);display:inline-flex}.color-picker__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *),.color-picker__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.color-picker__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.color-picker__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.color-picker__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.color-picker__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.color-picker__trigger [data-slot=label]{cursor:var(--cursor-interactive)}.color-picker__trigger:focus-visible:not(:focus),.color-picker__trigger[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.color-picker__trigger:disabled,.color-picker__trigger[data-disabled=true],.color-picker__trigger[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.color-picker__popover{min-width:calc(var(--spacing) * 62);transform-origin:var(--trigger-anchor-point);scrollbar-color:auto;scrollbar-gutter:auto;-ms-overflow-style:none;scrollbar-width:none;overscroll-behavior:contain;background-color:var(--overlay);padding-inline:calc(var(--spacing) * 2);padding-top:calc(var(--spacing) * 2);padding-bottom:calc(var(--spacing) * 3);box-shadow:var(--shadow-overlay);border-radius:min(32px,calc(var(--radius) * 2.5));gap:calc(var(--spacing) * 3);flex-direction:column;display:flex;overflow:hidden auto}.color-picker__popover:focus-visible:not(:focus),.color-picker__popover[data-focus-visible=true]{--tw-outline-style:none;outline-style:none}.color-picker__popover[data-entering=true]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.15s;--tw-ease:ease;--tw-enter-opacity:0;--tw-enter-scale:.95;transition-duration:.15s;transition-timing-function:ease}.color-picker__popover[data-entering=true][data-placement^=top]{--tw-enter-translate-y:calc(1*var(--spacing))}.color-picker__popover[data-entering=true][data-placement^=bottom]{--tw-enter-translate-y:calc(1*var(--spacing)*-1)}.color-picker__popover[data-entering=true][data-placement^=left]{--tw-enter-translate-x:calc(1*var(--spacing))}.color-picker__popover[data-entering=true][data-placement^=right]{--tw-enter-translate-x:calc(1*var(--spacing)*-1)}.color-picker__popover[data-exiting=true]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.1s;--tw-ease:ease;--tw-exit-scale:.95;--tw-exit-opacity:0;transition-duration:.1s;transition-timing-function:ease}.color-picker__popover[data-exiting=true],.color-picker__popover[data-entering=true]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));will-change:opacity,transform}.color-slider{gap:var(--spacing);grid-template:"label output""track track"/1fr auto;width:100%;display:grid}.color-slider:not(:has([data-slot=label])):not(:has(.color-slider__output)){grid-template:"track"/1fr;gap:0}.color-slider:has([data-slot=label]):not(:has(.color-slider__output)){grid-template-columns:1fr;grid-template-areas:"label""track"}.color-slider:not(:has([data-slot=label])):has(.color-slider__output){grid-template-columns:1fr;grid-template-areas:"output""track"}.color-slider:not(:has([data-slot=label])):has(.color-slider__output) .color-slider__output{justify-self:end}.color-slider [data-slot=label]{width:fit-content;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);grid-area:label}.color-slider .color-slider__output{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);--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,);grid-area:output}.color-slider .color-slider__track{border-radius:calc(var(--radius) * 2);grid-area:track;position:relative}.color-slider .color-slider__track:before,.color-slider .color-slider__track:after{content:"";z-index:0;pointer-events:none;position:absolute}.color-slider .color-slider__thumb{cursor:grab;border-radius:calc(var(--radius) * 2);-webkit-tap-highlight-color:transparent;border-style:var(--tw-border-style);border-width:3px;border-color:var(--color-white);--tw-shadow:var(--overlay-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);z-index:1;transition:transform .25s var(--ease-out),box-shadow .15s var(--ease-out);justify-content:center;align-items:center;display:flex;position:absolute}.color-slider .color-slider__thumb:is([data-reduce-motion=true],[data-reduce-motion=true] *),.color-slider .color-slider__thumb:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.color-slider .color-slider__thumb:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.color-slider .color-slider__thumb:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.color-slider .color-slider__thumb:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.color-slider .color-slider__thumb:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.color-slider .color-slider__thumb[data-dragging=true]{cursor:grabbing}.color-slider .color-slider__thumb[data-focus-visible=true]{z-index:10;--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.color-slider .color-slider__thumb[data-disabled=true]{cursor:default;background-color:var(--default)}.color-slider:disabled,.color-slider[data-disabled=true],.color-slider[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}:is(.color-slider:disabled,.color-slider[data-disabled=true],.color-slider[aria-disabled=true]) [data-slot=label]{opacity:1}.color-slider[data-orientation=horizontal]{flex-direction:column}.color-slider[data-orientation=horizontal] .color-slider__track{height:calc(var(--spacing) * 5);border-radius:0;justify-self:center;width:calc(100% - 1.25rem);box-shadow:inset 0 1px #0000001a,inset 0 -1px #0000001a}.color-slider[data-orientation=horizontal] .color-slider__track:before,.color-slider[data-orientation=horizontal] .color-slider__track:after{width:.625rem;height:100%;top:0}.color-slider[data-orientation=horizontal] .color-slider__track:before{border-top-left-radius:calc(var(--radius) * 2);border-bottom-left-radius:calc(var(--radius) * 2);background:linear-gradient(var(--track-start-color,transparent)),repeating-conic-gradient(#efefef,#efefef 25%,#f7f7f7 0%,#f7f7f7 50%) 50% / 16px 16px;left:-.625rem;box-shadow:inset 1px 0 #0000001a,inset 0 1px #0000001a,inset 0 -1px #0000001a}.color-slider[data-orientation=horizontal] .color-slider__track:after{border-top-right-radius:calc(var(--radius) * 2);border-bottom-right-radius:calc(var(--radius) * 2);background-color:var(--track-end-color,transparent);right:-.625rem;box-shadow:inset -1px 0 #0000001a,inset 0 1px #0000001a,inset 0 -1px #0000001a}.color-slider[data-orientation=horizontal] .color-slider__thumb{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);top:50%}.color-slider[data-orientation=vertical]{gap:calc(var(--spacing) * 2);flex-direction:row;grid-template:"output""track"1fr"label"/1fr;place-items:center;height:100%}.color-slider[data-orientation=vertical]:not(:has([data-slot=label])):not(:has(.color-slider__output)){grid-template-rows:1fr;grid-template-areas:"track";gap:0}.color-slider[data-orientation=vertical]:has([data-slot=label]):not(:has(.color-slider__output)){grid-template-rows:1fr auto;grid-template-areas:"track""label"}.color-slider[data-orientation=vertical]:not(:has([data-slot=label])):has(.color-slider__output){grid-template-rows:auto 1fr;grid-template-areas:"output""track"}.color-slider[data-orientation=vertical] .color-slider__output,.color-slider[data-orientation=vertical] [data-slot=label]{text-align:center}.color-slider[data-orientation=vertical] .color-slider__track{width:calc(var(--spacing) * 5);border-radius:0;justify-self:center;height:calc(100% - 1.25rem);box-shadow:inset 1px 0 #0000001a,inset -1px 0 #0000001a}.color-slider[data-orientation=vertical] .color-slider__track:before,.color-slider[data-orientation=vertical] .color-slider__track:after{width:100%;height:.625rem;left:0}.color-slider[data-orientation=vertical] .color-slider__track:before{background:linear-gradient(var(--track-start-color,transparent)),repeating-conic-gradient(#efefef,#efefef 25%,#f7f7f7 0%,#f7f7f7 50%) 50% / 16px 16px;border-bottom-right-radius:999px;border-bottom-left-radius:999px;bottom:-.625rem;box-shadow:inset 1px 0 #0000001a,inset -1px 0 #0000001a,inset 0 -1px #0000001a}.color-slider[data-orientation=vertical] .color-slider__track:after{background-color:var(--track-end-color,transparent);border-top-left-radius:999px;border-top-right-radius:999px;top:-.625rem;box-shadow:inset 1px 0 #0000001a,inset -1px 0 #0000001a,inset 0 1px #0000001a}.color-slider[data-orientation=vertical] .color-slider__thumb{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);left:50%}.color-swatch{box-sizing:border-box;width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8);background:linear-gradient(var(--color-swatch-current),var(--color-swatch-current)),repeating-conic-gradient(#efefef,#efefef 25%,#f7f7f7 0%,#f7f7f7 50%) 50% / 16px 16px;flex-shrink:0;position:relative;box-shadow:inset 0 0 0 1px #0000001a}.color-swatch--circle{border-radius:calc(var(--radius) * 2)}.color-swatch--square{border-radius:calc(var(--radius) * .75)}.color-swatch--xs{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.color-swatch--xs.color-swatch--circle{border-radius:calc(var(--radius) * 1)}.color-swatch--sm{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.color-swatch--sm.color-swatch--circle{border-radius:calc(var(--radius) * 1.5)}.color-swatch--lg{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.color-swatch--lg.color-swatch--circle{border-radius:calc(var(--radius) * 3)}.color-swatch--xl{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.color-swatch--xl.color-swatch--circle{border-radius:calc(var(--radius) * 3)}.color-swatch-picker{align-items:center;gap:calc(var(--spacing) * 2);flex-wrap:wrap;display:flex}.color-swatch-picker__item{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8);border-radius:calc(var(--radius) * 2);border-style:var(--tw-border-style);--tw-outline-style:none;-webkit-tap-highlight-color:transparent;cursor:var(--cursor-interactive);transition:border-color .1s var(--ease-out),box-shadow .1s var(--ease-out);transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);border-width:2px;border-color:#0000;outline-style:none;justify-content:center;align-items:center;display:flex;position:relative}.color-swatch-picker__item:is([data-reduce-motion=true],[data-reduce-motion=true] *),.color-swatch-picker__item:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.color-swatch-picker__item:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.color-swatch-picker__item:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.color-swatch-picker__item:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.color-swatch-picker__item:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.color-swatch-picker__item:focus-visible,.color-swatch-picker__item[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.color-swatch-picker__item[data-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.color-swatch-picker__item[data-selected=true]{border-color:var(--color-swatch-current);box-shadow:var(--field-shadow)}.color-swatch-picker__item[data-selected=true] .color-swatch-picker__swatch{transform:scale(.77)}.color-swatch-picker__swatch{border-radius:inherit;width:100%;height:100%;transition:transform .1s var(--ease-out);transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);display:block}.color-swatch-picker__swatch:is([data-reduce-motion=true],[data-reduce-motion=true] *),.color-swatch-picker__swatch:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.color-swatch-picker__swatch:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.color-swatch-picker__swatch:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.color-swatch-picker__swatch:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.color-swatch-picker__swatch:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}@media(hover:hover){.color-swatch-picker__swatch:hover{transform:scale(1.1)}}.color-swatch-picker__indicator{pointer-events:none;z-index:10;justify-content:center;align-items:center;display:flex;position:absolute;top:0;right:0;bottom:0;left:0}.color-swatch-picker__indicator>*{width:33.3333%;height:33.3333%;color:var(--color-white);transition:transform .15s var(--ease-out);transform:scale(0)translateZ(0)}.color-swatch-picker__indicator>:is([data-reduce-motion=true],[data-reduce-motion=true] *),.color-swatch-picker__indicator>:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.color-swatch-picker__indicator>:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.color-swatch-picker__indicator>:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.color-swatch-picker__indicator>:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.color-swatch-picker__indicator>:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.color-swatch-picker__indicator[data-light-color=true] .color-swatch-picker__indicator>*{color:var(--color-black)}.color-swatch-picker__item[data-selected=true] .color-swatch-picker__indicator>*{transform:scale(1)translateZ(0)}.color-swatch-picker--stack{flex-direction:column}.color-swatch-picker--xs .color-swatch-picker__item{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);border-radius:calc(var(--radius) * 1);border-style:var(--tw-border-style);border-width:1px}.color-swatch-picker--sm .color-swatch-picker__item{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6);border-radius:calc(var(--radius) * 1.5);border-style:var(--tw-border-style);border-width:2px}.color-swatch-picker--lg .color-swatch-picker__item{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9);border-radius:calc(var(--radius) * 3);border-style:var(--tw-border-style);border-width:3px}.color-swatch-picker--xl .color-swatch-picker__item{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10);border-radius:calc(var(--radius) * 3);border-style:var(--tw-border-style);border-width:3px}.color-swatch-picker--square .color-swatch-picker__item{border-radius:calc(var(--radius) * 1.5)}.color-swatch-picker--square .color-swatch-picker__item .color-swatch-picker__swatch,.color-swatch-picker--square .color-swatch-picker__item[data-selected=true] .color-swatch-picker__swatch{border-radius:calc(var(--radius) * 1)}.color-swatch-picker--square.color-swatch-picker--xs .color-swatch-picker__item,.color-swatch-picker--square.color-swatch-picker--xs .color-swatch-picker__item .color-swatch-picker__swatch,.color-swatch-picker--square.color-swatch-picker--xs .color-swatch-picker__item[data-selected=true] .color-swatch-picker__swatch{border-radius:calc(var(--radius) * .75)}.color-swatch-picker--square.color-swatch-picker--sm .color-swatch-picker__item,.color-swatch-picker--square.color-swatch-picker--sm .color-swatch-picker__item .color-swatch-picker__swatch{border-radius:calc(var(--radius) * 1)}.color-swatch-picker--square.color-swatch-picker--sm .color-swatch-picker__item[data-selected=true] .color-swatch-picker__swatch{border-radius:calc(var(--radius) * .75)}.color-swatch-picker--square.color-swatch-picker--lg .color-swatch-picker__item{border-radius:calc(var(--radius) * 1.5)}.color-swatch-picker--square.color-swatch-picker--lg .color-swatch-picker__item .color-swatch-picker__swatch,.color-swatch-picker--square.color-swatch-picker--lg .color-swatch-picker__item[data-selected=true] .color-swatch-picker__swatch{border-radius:calc(var(--radius) * 1)}.color-swatch-picker--square.color-swatch-picker--xl .color-swatch-picker__item{border-radius:calc(var(--radius) * 1.5)}.color-swatch-picker--square.color-swatch-picker--xl .color-swatch-picker__item .color-swatch-picker__swatch,.color-swatch-picker--square.color-swatch-picker--xl .color-swatch-picker__item[data-selected=true] .color-swatch-picker__swatch{border-radius:calc(var(--radius) * 1)}.color-input-group{height:calc(var(--spacing) * 9);border-radius:var(--field-radius,calc(var(--radius) * 1.5));border-style:var(--tw-border-style);background-color:var(--field-background,var(--default));font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--field-foreground,var(--foreground));--tw-shadow:var(--field-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;border-width:1px;border-width:var(--border-width-field);border-color:var(--field-border);transition:background-color .15s var(--ease-smooth),border-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out);outline-style:none;align-items:center;display:inline-flex;overflow:hidden}.color-input-group:is([data-reduce-motion=true],[data-reduce-motion=true] *),.color-input-group:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.color-input-group:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.color-input-group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.color-input-group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.color-input-group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}@media(hover:hover){.color-input-group:hover:not(:focus-within),.color-input-group[data-hovered=true]:not([data-focus-within=true]){background-color:var(--field-hover);border-color:var(--field-border-hover)}}.color-input-group[data-focus-within=true],.color-input-group:focus-within{--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);--tw-ring-color:var(--focus);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;--tw-ring-offset-width:0px;outline-style:none}.color-input-group[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.color-input-group[data-invalid=true]:focus,.color-input-group[data-invalid=true]:focus-visible,.color-input-group[data-invalid=true][data-focused=true],.color-input-group[data-invalid=true][data-focus-visible=true],.color-input-group[data-invalid=true]:focus-within,.color-input-group[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.color-input-group[data-invalid=true]{background-color:var(--field-focus);border-color:var(--color-field-border-invalid)}.color-input-group[data-disabled=true],.color-input-group[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.color-input-group__input{cursor:text;border-style:var(--tw-border-style);height:100%;padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;background-color:#0000;border-width:0;border-radius:0;outline-style:none;flex:1;align-items:center;display:flex}@media(min-width:40rem){.color-input-group__input{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.color-input-group__input::placeholder{color:var(--field-placeholder,var(--muted))}.color-input-group:has([data-slot=color-input-group-prefix]) .color-input-group__input{padding-left:calc(var(--spacing) * 2);border-top-left-radius:0;border-bottom-left-radius:0}.color-input-group:has([data-slot=color-input-group-suffix]) .color-input-group__input{padding-right:calc(var(--spacing) * 2);border-top-right-radius:0;border-bottom-right-radius:0}.color-input-group__input:focus,.color-input-group__input:focus-visible{--tw-outline-style:none;outline-style:none}.color-input-group__prefix{color:var(--field-placeholder,var(--muted));margin-right:0;margin-left:calc(var(--spacing) * 3);flex-shrink:0;align-items:center;display:flex}.color-input-group__suffix{color:var(--field-placeholder,var(--muted));margin-right:calc(var(--spacing) * 3);flex-shrink:0;align-items:center;display:flex}.color-input-group--secondary{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:var(--color-input-group-bg);--color-input-group-bg:var(--default);--color-input-group-bg-hover:var(--default-hover);--color-input-group-bg-focus:var(--default)}@media(hover:hover){.color-input-group--secondary:hover:not(:focus-within),.color-input-group--secondary[data-hovered=true]:not([data-focus-within=true]){background-color:var(--color-input-group-bg-hover)}}.color-input-group--secondary:focus-within,.color-input-group--secondary[data-focus-within=true]{background-color:var(--color-input-group-bg-focus)}.color-input-group--secondary[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.color-input-group--secondary[data-invalid=true]:focus,.color-input-group--secondary[data-invalid=true]:focus-visible,.color-input-group--secondary[data-invalid=true][data-focused=true],.color-input-group--secondary[data-invalid=true][data-focus-visible=true],.color-input-group--secondary[data-invalid=true]:focus-within,.color-input-group--secondary[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.color-input-group--secondary[data-invalid=true]{border-color:var(--color-field-border-invalid);background-color:var(--color-input-group-bg-focus)}.color-input-group--secondary [data-slot=color-input-group-input]{background-color:#0000}.color-input-group--full-width{width:100%}.color-field{gap:var(--spacing);flex-direction:column;display:flex}:is(.color-field[data-invalid=true],.color-field[aria-invalid=true]) [data-slot=description]{display:none}.color-field [data-slot=label]{width:fit-content}.color-field--full-width{width:100%}.slider{gap:var(--spacing);grid-template-columns:1fr auto;grid-template-areas:"label output""track track";width:100%;display:grid}.slider [data-slot=label]{width:fit-content;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);grid-area:label}.slider .slider__output{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);--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,);grid-area:output}.slider .slider__track{border-radius:calc(var(--radius) * 1.5);background-color:var(--default);grid-area:track;position:relative}.slider .slider__fill{pointer-events:none;background-color:var(--accent);position:absolute}.slider .slider__thumb{cursor:grab;border-radius:calc(var(--radius) * 1.5);background-color:var(--accent);-webkit-tap-highlight-color:transparent;transition:background-color .25s var(--ease-smooth),transform .25s var(--ease-out),box-shadow .15s var(--ease-out);justify-content:center;align-items:center;display:flex;position:absolute}.slider .slider__thumb:is([data-reduce-motion=true],[data-reduce-motion=true] *),.slider .slider__thumb:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.slider .slider__thumb:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.slider .slider__thumb:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.slider .slider__thumb:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.slider .slider__thumb:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.slider .slider__thumb:after{z-index:10;border-radius:calc(var(--radius) * 1);background-color:var(--accent-foreground);color:var(--color-black);--tw-shadow:var(--field-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);content:"";transform-origin:50%;transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));position:relative}@media(prefers-reduced-motion:reduce){.slider .slider__thumb:after:not(:is()){transition-property:none}}.slider .slider__thumb[data-dragging=true]{cursor:grabbing}.slider .slider__thumb[data-dragging=true]:after{scale:.9}@media(prefers-reduced-motion:reduce){.slider .slider__thumb[data-dragging=true]:after:not(:is()){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}}.slider .slider__thumb[data-focus-visible=true]{z-index:10;--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.slider .slider__thumb[data-disabled=true]{cursor:default}.slider:disabled,.slider[data-disabled=true],.slider[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}:is(.slider:disabled,.slider[data-disabled=true],.slider[aria-disabled=true]) [data-slot=label]{opacity:1}.slider[data-orientation=horizontal]{flex-direction:column}.slider[data-orientation=horizontal] .slider__track{height:calc(var(--spacing) * 5);border-inline-style:var(--tw-border-style);border-inline-width:.75rem;border-inline-color:#0000;width:100%}.slider[data-orientation=horizontal] .slider__track[data-fill-start=true]{border-inline-start-color:var(--accent)}.slider[data-orientation=horizontal] .slider__track[data-fill-end=true]{border-inline-end-color:var(--accent)}.slider[data-orientation=horizontal] .slider__fill,.slider[data-orientation=horizontal] .slider__thumb{height:100%}.slider[data-orientation=horizontal] .slider__thumb{width:1.75rem;top:50%}.slider[data-orientation=horizontal] .slider__thumb:after{width:1.5rem;height:1rem}.slider[data-orientation=vertical]{gap:calc(var(--spacing) * 2);flex-direction:row;grid-template:"output""track"1fr"label"/1fr;height:100%}.slider[data-orientation=vertical] .slider__output,.slider[data-orientation=vertical] [data-slot=label]{text-align:center}.slider[data-orientation=vertical] .slider__track{height:100%;width:calc(var(--spacing) * 5);border-block-style:var(--tw-border-style);border-block-width:.75rem;border-block-color:#0000;justify-self:center}.slider[data-orientation=vertical] .slider__track[data-fill-start=true]{border-bottom-color:var(--accent)}.slider[data-orientation=vertical] .slider__track[data-fill-end=true]{border-top-color:var(--accent)}.slider[data-orientation=vertical] .slider__fill,.slider[data-orientation=vertical] .slider__thumb{width:100%}.slider[data-orientation=vertical] .slider__thumb{height:1.75rem;left:50%}.slider[data-orientation=vertical] .slider__thumb:after{width:1rem;height:1.5rem}.switch{align-items:flex-start;gap:var(--spacing);-webkit-tap-highlight-color:transparent;cursor:var(--cursor-interactive);--switch-control-bg:var(--default);--switch-control-bg-hover:var(--switch-control-bg);flex-direction:column;display:flex}@supports (color:color-mix(in lab,red,red)){.switch{--switch-control-bg-hover:color-mix(in oklab, var(--switch-control-bg), transparent 20%)}}.switch{--switch-control-bg-pressed:var(--switch-control-bg-hover);--switch-control-bg-checked:var(--accent);--switch-control-bg-checked-hover:var(--accent-hover)}.switch[data-disabled=true],.switch[data-disabled=true] [data-slot=description],.switch[data-disabled=true] [data-slot=field-error]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.switch[data-disabled=true] .switch__thumb{background-color:var(--default-foreground)}@supports (color:color-mix(in lab,red,red)){.switch[data-disabled=true] .switch__thumb{background-color:color-mix(in oklab,var(--default-foreground) 20%,transparent)}}.switch>[data-slot=description]{width:100%;min-width:0;padding-inline-start:3.25rem}.switch>[data-slot=field-error]{width:100%;min-width:0;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--muted);padding-inline-start:3.25rem}.switch.switch--sm>[data-slot=description],.switch.switch--sm>[data-slot=field-error]{padding-inline-start:2.75rem}.switch.switch--lg>[data-slot=description],.switch.switch--lg>[data-slot=field-error]{padding-inline-start:3.75rem}:is(.switch:disabled[aria-checked=true],.switch:disabled[data-selected=true],.switch[data-disabled=true][aria-checked=true],.switch[data-disabled=true][data-selected=true],.switch[aria-disabled=true][aria-checked=true],.switch[aria-disabled=true][data-selected=true]) .switch__thumb{opacity:.4}.switch__control{border-radius:calc(var(--radius) * 1.5);background-color:var(--switch-control-bg);width:2.5rem;height:1.25rem;transition:background-color .25s var(--ease-smooth),box-shadow .15s var(--ease-out);flex-shrink:0;align-items:center;display:flex;position:relative;overflow:hidden}.switch__control:is([data-reduce-motion=true],[data-reduce-motion=true] *),.switch__control:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.switch__control:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.switch__control:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.switch__control:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.switch__control:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.switch:focus-visible .switch__control,.switch:has([data-slot=switch-content][data-focus-visible=true]) .switch__control,.switch [data-slot=switch-content][data-focus-visible=true] .switch__control{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.switch:hover .switch__control,.switch:has([data-slot=switch-content][data-hovered=true]) .switch__control,.switch [data-slot=switch-content][data-hovered=true] .switch__control{background-color:var(--switch-control-bg-hover)}.switch:active .switch__control,.switch:has([data-slot=switch-content][data-pressed=true]) .switch__control,.switch [data-slot=switch-content][data-pressed=true] .switch__control{background-color:var(--switch-control-bg-pressed)}:is(.switch:active .switch__control,.switch:has([data-slot=switch-content][data-pressed=true]) .switch__control,.switch [data-slot=switch-content][data-pressed=true] .switch__control):is([data-reduce-motion=true],[data-reduce-motion=true] *),:is(.switch:active .switch__control,.switch:has([data-slot=switch-content][data-pressed=true]) .switch__control,.switch [data-slot=switch-content][data-pressed=true] .switch__control):is([data-reduce-motion=true],[data-reduce-motion=true] *):before,:is(.switch:active .switch__control,.switch:has([data-slot=switch-content][data-pressed=true]) .switch__control,.switch [data-slot=switch-content][data-pressed=true] .switch__control):is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transform:none}@media(prefers-reduced-motion:reduce){:is(.switch:active .switch__control,.switch:has([data-slot=switch-content][data-pressed=true]) .switch__control,.switch [data-slot=switch-content][data-pressed=true] .switch__control):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),:is(.switch:active .switch__control,.switch:has([data-slot=switch-content][data-pressed=true]) .switch__control,.switch [data-slot=switch-content][data-pressed=true] .switch__control):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,:is(.switch:active .switch__control,.switch:has([data-slot=switch-content][data-pressed=true]) .switch__control,.switch [data-slot=switch-content][data-pressed=true] .switch__control):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transform:none}}.switch[aria-checked=true] .switch__control,.switch[data-selected=true] .switch__control{background-color:var(--switch-control-bg-checked)}.switch[aria-checked=true]:hover .switch__control,.switch[data-selected=true]:hover .switch__control,.switch[aria-checked=true][data-hovered=true] .switch__control,.switch[data-selected=true][data-hovered=true] .switch__control,.switch:has([data-slot=switch-content][data-hovered=true])[data-selected=true] .switch__control,.switch[aria-checked=true]:active .switch__control,.switch[data-selected=true]:active .switch__control,.switch[aria-checked=true][data-pressed=true] .switch__control,.switch[data-selected=true][data-pressed=true] .switch__control,.switch:has([data-slot=switch-content][data-pressed=true])[data-selected=true] .switch__control{background-color:var(--switch-control-bg-checked-hover)}.switch__content{cursor:inherit;align-items:center;gap:calc(var(--spacing) * 3);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--foreground);--tw-outline-style:none;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;outline-style:none;display:inline-flex}.switch--sm .switch__control{border-radius:calc(var(--radius) * 1);width:2rem;height:1rem}.switch--lg .switch__control{width:3rem;height:1.5rem}.switch__thumb{transform-origin:50%;border-radius:calc(var(--radius) * 1);background-color:var(--color-white);color:var(--color-black);--tw-shadow:var(--field-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);width:1.375rem;height:1rem;transition:margin .3s var(--ease-out-fluid),background-color .2s var(--ease-out);margin-inline-start:calc(var(--spacing) * .5);display:flex}.switch__thumb:is([data-reduce-motion=true],[data-reduce-motion=true] *),.switch__thumb:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.switch__thumb:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.switch__thumb:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.switch__thumb:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.switch__thumb:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.switch[aria-checked=true] .switch__thumb,.switch[data-selected=true] .switch__thumb{background-color:var(--accent-foreground);color:var(--accent);margin-inline-start:calc(100% - 1.5rem);box-shadow:0 0 5px #00000005,0 2px 10px #0000000f,0 0 1px #0000004d}.switch--sm .switch__thumb{border-radius:calc(var(--radius) * .75);width:1.03125rem;height:.75rem}.switch[aria-checked=true] :is(.switch--sm .switch__thumb),.switch[data-selected=true] :is(.switch--sm .switch__thumb){margin-inline-start:calc(100% - 1.15625rem)}.switch--lg .switch__thumb{border-radius:calc(var(--radius) * 1.5);width:1.71875rem;height:1.25rem}.switch[aria-checked=true] :is(.switch--lg .switch__thumb),.switch[data-selected=true] :is(.switch--lg .switch__thumb){margin-inline-start:calc(100% - 1.84375rem)}.switch__thumb>*{justify-content:center;align-items:center;width:100%;height:100%;display:flex}.switch__label{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--foreground)}.switch [data-slot=label]{-webkit-user-select:none;user-select:none}.switch__content [data-slot=label]{cursor:var(--cursor-interactive)}.switch [data-slot=description]{cursor:default;-webkit-user-select:none;user-select:none}.switch-group{gap:calc(var(--spacing) * 6);flex-direction:column;display:flex}.switch-group__items{gap:calc(var(--spacing) * 4);display:flex}.switch-group--horizontal .switch-group__items{flex-direction:row}.switch-group--vertical .switch-group__items{flex-direction:column}.badge{justify-content:center;align-items:center;gap:calc(var(--spacing) * .5);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);min-height:calc(var(--spacing) * 7);min-width:calc(var(--spacing) * 7);border-radius:calc(var(--radius) * 3);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-leading:1.34;--badge-bg:var(--default);--badge-fg:var(--default-foreground);--badge-border:var(--background);background-color:var(--badge-bg);color:var(--badge-fg);border:1px solid var(--badge-border);flex-shrink:0;line-height:1.34;display:inline-flex}.badge__label{padding-inline:calc(var(--spacing) * .5)}.badge-anchor{flex-shrink:0;display:inline-flex;position:relative}.badge--lg{min-height:calc(var(--spacing) * 8);min-width:calc(var(--spacing) * 8);border-radius:calc(var(--radius) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:1.43;line-height:1.43}.badge--sm{min-height:calc(var(--spacing) * 4);min-width:calc(var(--spacing) * 4);border-radius:calc(var(--radius) * 1.5);--tw-leading:1.34;font-size:10px;line-height:1.34}.badge--accent{--badge-fg:var(--accent-soft-foreground)}.badge--default{--badge-fg:var(--default-foreground)}.badge--success{--badge-fg:var(--success-soft-foreground)}.badge--warning{--badge-fg:var(--warning-soft-foreground)}.badge--danger{--badge-fg:var(--danger-soft-foreground)}.badge--top-right{position:absolute;top:0;right:0;transform:translate(25%,-25%)}.badge--top-left{position:absolute;top:0;left:0;transform:translate(-25%,-25%)}.badge--bottom-right{position:absolute;bottom:0;right:0;transform:translate(25%,25%)}.badge--bottom-left{position:absolute;bottom:0;left:0;transform:translate(-25%,25%)}.badge--primary.badge--accent{--badge-bg:var(--accent);--badge-fg:var(--accent-foreground)}.badge--primary.badge--default{--badge-bg:var(--default);--badge-fg:var(--default-foreground)}.badge--primary.badge--success{--badge-bg:var(--success);--badge-fg:var(--success-foreground)}.badge--primary.badge--warning{--badge-bg:var(--warning);--badge-fg:var(--warning-foreground)}.badge--primary.badge--danger{--badge-bg:var(--danger);--badge-fg:var(--danger-foreground)}.badge--soft.badge--accent{--badge-bg:var(--accent-soft);--badge-fg:var(--accent-soft-foreground)}.badge--soft.badge--default{--badge-bg:var(--default-soft);--badge-fg:var(--default-soft-foreground)}.badge--soft.badge--success{--badge-bg:var(--success-soft);--badge-fg:var(--success-soft-foreground)}.badge--soft.badge--warning{--badge-bg:var(--warning-soft);--badge-fg:var(--warning-soft-foreground)}.badge--soft.badge--danger{--badge-bg:var(--danger-soft);--badge-fg:var(--danger-soft-foreground)}.chip{align-items:center;gap:calc(var(--spacing) * .5);border-radius:calc(var(--radius) * 2);padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * .5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);--chip-bg:var(--default);--chip-fg:currentColor;background-color:var(--chip-bg);color:var(--chip-fg);flex-shrink:0;display:inline-flex}.chip__label{padding-inline:calc(var(--spacing) * .5)}.chip--accent{--chip-fg:var(--accent-soft-foreground)}.chip--danger{--chip-fg:var(--danger-soft-foreground)}.chip--default{--chip-fg:var(--default-foreground)}.chip--success{--chip-fg:var(--success-soft-foreground)}.chip--warning{--chip-fg:var(--warning-soft-foreground)}.chip--tertiary{--chip-bg:transparent}.chip--sm{padding-inline:var(--spacing);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));padding-block:0}.chip--md{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.chip--lg{padding-inline:calc(var(--spacing) * 3);padding-block:var(--spacing);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.chip--primary.chip--accent{--chip-bg:var(--accent);--chip-fg:var(--accent-foreground)}.chip--primary.chip--success{--chip-bg:var(--success);--chip-fg:var(--success-foreground)}.chip--primary.chip--warning{--chip-bg:var(--warning);--chip-fg:var(--warning-foreground)}.chip--primary.chip--danger{--chip-bg:var(--danger);--chip-fg:var(--danger-foreground)}.chip--accent.chip--soft{--chip-bg:var(--accent-soft);--chip-fg:var(--accent-soft-foreground)}.chip--success.chip--soft{--chip-bg:var(--success-soft);--chip-fg:var(--success-soft-foreground)}.chip--warning.chip--soft{--chip-bg:var(--warning-soft);--chip-fg:var(--warning-soft-foreground)}.chip--danger.chip--soft{--chip-bg:var(--danger-soft);--chip-fg:var(--danger-soft-foreground)}.chip--default.chip--soft{--chip-bg:var(--default-soft);--chip-fg:var(--default-soft-foreground)}.table-root{grid-template-columns:minmax(0,1fr);width:100%;display:grid;position:relative;overflow:clip}.table__scroll-container{scrollbar-width:var(--scrollbar-width);scrollbar-color:var(--scrollbar-color);scrollbar-gutter:var(--scrollbar-gutter);scrollbar-gutter:auto;overflow-x:auto}.table-root--primary{background-color:var(--surface-secondary);padding-inline:var(--spacing);padding-bottom:var(--spacing);border-radius:min(32px,calc(var(--radius) * 2.5))}.table-root--secondary .table__header{border-bottom-style:var(--tw-border-style);background-color:#0000;border-bottom-width:0}.table-root--secondary .table__column{background-color:var(--surface-secondary)}.table-root--secondary :is(th.table__column:first-child,[role=row]>[role=presentation]:first-of-type>.table__column){border-start-start-radius:min(32px,var(--radius-2xl));border-end-start-radius:min(32px,var(--radius-2xl))}.table-root--secondary :is(th.table__column:last-child,[role=row]>[role=presentation]:last-of-type>.table__column){border-start-end-radius:min(32px,var(--radius-2xl));border-end-end-radius:min(32px,var(--radius-2xl))}.table-root--secondary .table__body{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.table-root--secondary .table__body tr:first-child td:first-child,.table-root--secondary .table__body tr:first-child td:last-child,.table-root--secondary .table__body tr:last-child td:first-child,.table-root--secondary .table__body tr:last-child td:last-child{border-radius:0}.table-root--secondary .table__body:not(tbody){border-radius:0;overflow:visible}.table-root--secondary .table__row .table__cell{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--separator-tertiary)}@supports (color:color-mix(in lab,red,red)){.table-root--secondary .table__row .table__cell{border-color:color-mix(in oklab,var(--separator-tertiary) 50%,transparent)}}.table-root--secondary .table__row .table__cell{background-color:#0000}@media(hover:hover){.table-root--secondary .table__row:hover .table__cell,.table-root--secondary .table__row[data-hovered=true] .table__cell{background-color:var(--default)}@supports (color:color-mix(in lab,red,red)){.table-root--secondary .table__row:hover .table__cell,.table-root--secondary .table__row[data-hovered=true] .table__cell{background-color:color-mix(in oklab,var(--default) 50%,transparent)}}}.table__content{border-collapse:separate;--tw-border-spacing-x:0;--tw-border-spacing-y:0;width:100%;border-spacing:var(--tw-border-spacing-x) var(--tw-border-spacing-y);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.table-root--primary .table__content{overflow:clip}.table__header{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--separator)}@supports (color:color-mix(in lab,red,red)){.table__header{border-color:color-mix(in oklab,var(--separator) 50%,transparent)}}.table__header{background-color:var(--surface-secondary)}.table__column{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2.5);text-align:left;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--muted);position:relative}.table__column:after{content:"";pointer-events:none;height:calc(var(--spacing) * 4);--tw-translate-y: -50% ;width:1px;translate:var(--tw-translate-x) var(--tw-translate-y);border-radius:calc(var(--radius) * .5);background-color:var(--separator);inset-inline-end:calc(var(--spacing) * 0);position:absolute;top:50%}.table__column:last-child:not(:only-child):after{content:none}.table__column[data-allows-sorting=true]{cursor:var(--cursor-interactive)}@media(hover:hover){.table__column[data-allows-sorting=true]:hover,.table__column[data-allows-sorting=true][data-hovered=true]{color:var(--foreground)}}.table__column:focus-visible,.table__column[data-focus-visible=true]{border-radius:calc(var(--radius) * 1);--tw-outline-style:none;box-shadow:inset 0 0 0 2px var(--focus);outline-style:none}[role=row]>[role=presentation]:last-of-type:not(:only-of-type)>.table__column:after{content:none}.table__sortable-column-header{justify-content:space-between;align-items:center;display:flex}.table__sortable-column-indicator{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3);transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);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));--tw-duration:.1s;--tw-ease:var(--ease-out);transition-duration:.1s;transition-timing-function:var(--ease-out)}.table__sortable-column-indicator[data-direction=descending]{rotate:180deg}.table__body tr:first-child td:first-child{border-start-start-radius:min(32px,var(--radius-2xl))}.table__body tr:first-child td:last-child{border-start-end-radius:min(32px,var(--radius-2xl))}.table__body tr:last-child td:first-child{border-end-start-radius:min(32px,var(--radius-2xl))}.table__body tr:last-child td:last-child{border-end-end-radius:min(32px,var(--radius-2xl))}.table__body:not(tbody){border-radius:min(32px,var(--radius-2xl));height:100%;position:relative;overflow:clip}.table__row{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--separator);height:100%;position:relative}@supports (color:color-mix(in lab,red,red)){.table__row{border-color:color-mix(in oklab,var(--separator) 50%,transparent)}}.table__row:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media(hover:hover){.table__row:hover .table__cell,.table__row[data-hovered=true] .table__cell{background-color:var(--surface)}@supports (color:color-mix(in lab,red,red)){.table__row:hover .table__cell,.table__row[data-hovered=true] .table__cell{background-color:color-mix(in oklab,var(--surface) 40%,transparent)}}}.table__row[data-selected=true] .table__cell{background-color:var(--surface)}@supports (color:color-mix(in lab,red,red)){.table__row[data-selected=true] .table__cell{background-color:color-mix(in oklab,var(--surface) 10%,transparent)}}.table__row[aria-disabled=true],.table__row[data-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.table__row:focus-visible,.table__row[data-focus-visible=true]{--tw-outline-style:none;outline-style:none}.table__row[data-dragging=true]{opacity:.5}.table__row[data-drop-target=true] .table__cell{background-color:var(--accent-soft)}.table__cell{background-color:var(--surface);height:100%;padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);vertical-align:middle;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--foreground);border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:var(--separator-tertiary)}@supports (color:color-mix(in lab,red,red)){.table__cell{border-color:color-mix(in oklab,var(--separator-tertiary) 50%,transparent)}}.table__cell:focus-visible,.table__cell[data-focus-visible=true]{border-radius:calc(var(--radius) * 1);--tw-outline-style:none;box-shadow:inset 0 0 0 2px var(--focus);outline-style:none}.table__row:is(:focus-visible,[data-focus-visible=true]) :is(.table__cell,.table__column){--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.table__row:is(:focus-visible,[data-focus-visible=true])>:is(.table__cell,.table__column):only-child,.table__row:is(:focus-visible,[data-focus-visible=true])>:only-child :is(.table__cell,.table__column){border-radius:calc(var(--radius) * 1);--tw-shadow:inset 0 0 0 2px var(--tw-shadow-color,var(--focus));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;outline-style:none}.table__row:is(:focus-visible,[data-focus-visible=true])>:is(.table__cell,.table__column):first-child:not(:only-child),.table__row:is(:focus-visible,[data-focus-visible=true])>:first-child:not(:only-child) :is(.table__cell,.table__column){border-top-left-radius:calc(var(--radius) * 1);border-bottom-left-radius:calc(var(--radius) * 1);--tw-shadow:inset 2px 0 0 0 var(--tw-shadow-color,var(--focus)), inset 0 2px 0 0 var(--tw-shadow-color,var(--focus)), inset 0 -2px 0 0 var(--tw-shadow-color,var(--focus));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;outline-style:none}.table__row:is(:focus-visible,[data-focus-visible=true])>:is(.table__cell,.table__column):last-child:not(:only-child),.table__row:is(:focus-visible,[data-focus-visible=true])>:last-child:not(:only-child) :is(.table__cell,.table__column){border-top-right-radius:calc(var(--radius) * 1);border-bottom-right-radius:calc(var(--radius) * 1);--tw-shadow:inset -2px 0 0 0 var(--tw-shadow-color,var(--focus)), inset 0 2px 0 0 var(--tw-shadow-color,var(--focus)), inset 0 -2px 0 0 var(--tw-shadow-color,var(--focus));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;outline-style:none}.table__row:is(:focus-visible,[data-focus-visible=true])>:is(.table__cell,.table__column):not(:first-child):not(:last-child):not(:only-child),.table__row:is(:focus-visible,[data-focus-visible=true])>:not(:first-child):not(:last-child):not(:only-child) :is(.table__cell,.table__column){--tw-shadow:inset 0 2px 0 0 var(--tw-shadow-color,var(--focus)), inset 0 -2px 0 0 var(--tw-shadow-color,var(--focus));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;outline-style:none}.table__cell[data-tree-column]{padding-inline-start:calc(1rem * var(--table-row-level,1))}.table__footer{padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2.5);align-items:center;display:flex}.table__resizable-container{scrollbar-width:var(--scrollbar-width);scrollbar-color:var(--scrollbar-color);scrollbar-gutter:var(--scrollbar-gutter);scrollbar-gutter:auto;position:relative;overflow:auto}.table__column-resizer{height:calc(var(--spacing) * 4);--tw-translate-y: -50% ;border-radius:calc(var(--radius) * .5);background-color:var(--separator);box-sizing:content-box;--tw-translate-x: 50% ;width:1px;translate:var(--tw-translate-x) var(--tw-translate-y);cursor:col-resize;touch-action:none;padding-inline:calc(var(--spacing) * 2);--tw-border-style:none;--tw-outline-style:none;inset-inline-end:calc(var(--spacing) * 0);background-clip:content-box;border-style:none;outline-style:none;position:absolute;top:50%}.table__column-resizer[data-hovered=true],.table__column-resizer:hover,.table__column-resizer[data-resizing=true]{height:100%;width:calc(var(--spacing) * .5);background-color:var(--accent)}.table__column-resizer[data-focus-visible=true],.table__column-resizer:focus-visible{height:100%;width:calc(var(--spacing) * .5);background-color:var(--focus)}.table__column:has(.table__column-resizer):after{content:none}.table__load-more td,.table__load-more [role=rowheader]{padding-block:calc(var(--spacing) * 3);text-align:center}:is(.table__load-more td,.table__load-more [role=rowheader])>*{margin-inline:auto}.table__load-more-content{justify-content:center;align-items:center;gap:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * 2);display:flex}.alert{justify-content:flex-start;align-items:flex-start;gap:calc(var(--spacing) * 4);background-color:var(--surface);width:100%;padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);--tw-shadow:var(--surface-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-radius:min(32px,var(--radius-3xl));flex-direction:row;display:flex}.alert__content{flex-direction:column;flex-grow:1;align-items:flex-start;height:100%;display:flex}.alert__indicator{padding:var(--spacing);-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;display:flex}.alert__indicator [data-slot=alert-default-icon]{box-sizing:content-box;width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.alert__title{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.alert__description{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--muted)}.alert--default .alert__indicator,.alert--default .alert__title{color:var(--foreground)}.alert--accent .alert__indicator,.alert--accent .alert__title{color:var(--accent-soft-foreground)}.alert--success .alert__indicator,.alert--success .alert__title{color:var(--success-soft-foreground)}.alert--warning .alert__indicator,.alert--warning .alert__title{color:var(--warning-soft-foreground)}.alert--danger .alert__indicator,.alert--danger .alert__title{color:var(--danger-soft-foreground)}.empty-state{padding:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--muted)}.skeleton{pointer-events:none;border-radius:calc(var(--radius) * .5);background-color:var(--surface-tertiary);position:relative;overflow:hidden}@supports (color:color-mix(in lab,red,red)){.skeleton{background-color:color-mix(in oklab,var(--surface-tertiary) 70%,transparent)}}.skeleton--shimmer:after{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y);--tw-gradient-position:to right;animation:2s linear infinite skeleton;position:absolute;top:0;right:0;bottom:0;left:0}@supports (background-image:linear-gradient(in lab,red,red)){.skeleton--shimmer:after{--tw-gradient-position:to right in oklab}}.skeleton--shimmer:after{background-image:linear-gradient(var(--tw-gradient-stops));--tw-gradient-from:transparent;--tw-gradient-via:var(--surface-tertiary);--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));--tw-gradient-to:transparent;--tw-content:"";content:var(--tw-content)}.skeleton--shimmer:has(.skeleton):after{content:none}.skeleton--shimmer:has(.skeleton):before{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y);--tw-content:"";content:var(--tw-content);z-index:10;pointer-events:none;mix-blend-mode:overlay;background:linear-gradient(90deg,#0000,#ffffff80,#0000);animation:2s linear infinite skeleton;position:absolute;top:0;right:0;bottom:0;left:0}.skeleton--shimmer:has(.skeleton) .skeleton:after{content:none}.skeleton--pulse{animation:var(--animate-pulse)}.meter{gap:var(--spacing);--meter-fill:var(--accent);grid-template-columns:1fr auto;grid-template-areas:"label output""track track";width:100%;display:grid}.meter [data-slot=label]{width:fit-content;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);grid-area:label}.meter .meter__output{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);--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,);grid-area:output}.meter .meter__track{border-radius:calc(var(--radius) * .5);background-color:var(--default);height:calc(var(--spacing) * 2);grid-area:track;position:relative;overflow:hidden}.meter .meter__fill{border-radius:calc(var(--radius) * .5);background-color:var(--meter-fill);height:100%;transition:width .3s var(--ease-out);position:absolute;top:0;left:0}.meter .meter__fill:is([data-reduce-motion=true],[data-reduce-motion=true] *),.meter .meter__fill:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.meter .meter__fill:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.meter .meter__fill:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.meter .meter__fill:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.meter .meter__fill:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.meter:disabled,.meter[data-disabled=true],.meter[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}:is(.meter:disabled,.meter[data-disabled=true],.meter[aria-disabled=true]) [data-slot=label]{opacity:1}.meter--sm .meter__track{height:var(--spacing);border-radius:calc(var(--radius) * .25)}.meter--sm .meter__fill{border-radius:calc(var(--radius) * .25)}.meter--lg .meter__track{height:calc(var(--spacing) * 3);border-radius:calc(var(--radius) * .75)}.meter--lg .meter__fill{border-radius:calc(var(--radius) * .75)}.meter--default{--meter-fill:var(--default-foreground)}.meter--accent{--meter-fill:var(--accent)}.meter--success{--meter-fill:var(--success)}.meter--warning{--meter-fill:var(--warning)}.meter--danger{--meter-fill:var(--danger)}.progress-bar{gap:var(--spacing);--progress-bar-fill:var(--accent);grid-template-columns:1fr auto;grid-template-areas:"label output""track track";width:100%;display:grid}.progress-bar [data-slot=label]{width:fit-content;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);grid-area:label}.progress-bar .progress-bar__output{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);--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,);grid-area:output}.progress-bar .progress-bar__track{border-radius:calc(var(--radius) * .5);background-color:var(--default);height:calc(var(--spacing) * 2);grid-area:track;position:relative;overflow:hidden}.progress-bar .progress-bar__fill{border-radius:calc(var(--radius) * .5);background-color:var(--progress-bar-fill);height:100%;transition:width .3s var(--ease-out);position:absolute;top:0;left:0}.progress-bar .progress-bar__fill:is([data-reduce-motion=true],[data-reduce-motion=true] *),.progress-bar .progress-bar__fill:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.progress-bar .progress-bar__fill:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.progress-bar .progress-bar__fill:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.progress-bar .progress-bar__fill:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.progress-bar .progress-bar__fill:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.progress-bar:not([aria-valuenow]) .progress-bar__fill{width:40%;animation:1.5s cubic-bezier(.65,0,.35,1) infinite progress-bar-indeterminate}.progress-bar:not([aria-valuenow]) .progress-bar__fill:is([data-reduce-motion=true],[data-reduce-motion=true] *),.progress-bar:not([aria-valuenow]) .progress-bar__fill:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.progress-bar:not([aria-valuenow]) .progress-bar__fill:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{animation:none}@media(prefers-reduced-motion:reduce){.progress-bar:not([aria-valuenow]) .progress-bar__fill:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.progress-bar:not([aria-valuenow]) .progress-bar__fill:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.progress-bar:not([aria-valuenow]) .progress-bar__fill:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{animation:none}}.progress-bar:disabled,.progress-bar[data-disabled=true],.progress-bar[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}:is(.progress-bar:disabled,.progress-bar[data-disabled=true],.progress-bar[aria-disabled=true]) [data-slot=label]{opacity:1}@keyframes progress-bar-indeterminate{0%{transform:translate(-100%)}to{transform:translate(350%)}}.progress-bar--sm .progress-bar__track{height:var(--spacing);border-radius:calc(var(--radius) * .25)}.progress-bar--sm .progress-bar__fill{border-radius:calc(var(--radius) * .25)}.progress-bar--lg .progress-bar__track{height:calc(var(--spacing) * 3);border-radius:calc(var(--radius) * .75)}.progress-bar--lg .progress-bar__fill{border-radius:calc(var(--radius) * .75)}.progress-bar--default{--progress-bar-fill:var(--default-foreground)}.progress-bar--accent{--progress-bar-fill:var(--accent)}.progress-bar--success{--progress-bar-fill:var(--success)}.progress-bar--warning{--progress-bar-fill:var(--warning)}.progress-bar--danger{--progress-bar-fill:var(--danger)}.progress-circle{--progress-circle-stroke:var(--accent);--progress-circle-track-stroke:var(--default);justify-content:center;align-items:center;display:inline-flex}.progress-circle .progress-circle__track{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.progress-circle .progress-circle__track-circle{stroke:var(--progress-circle-track-stroke)}.progress-circle .progress-circle__fill-circle{stroke:var(--progress-circle-stroke);transition:stroke-dashoffset .3s var(--ease-out)}.progress-circle .progress-circle__fill-circle:is([data-reduce-motion=true],[data-reduce-motion=true] *),.progress-circle .progress-circle__fill-circle:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.progress-circle .progress-circle__fill-circle:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.progress-circle .progress-circle__fill-circle:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.progress-circle .progress-circle__fill-circle:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.progress-circle .progress-circle__fill-circle:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.progress-circle:not([aria-valuenow]) .progress-circle__track{animation:1s linear infinite progress-circle-spin}.progress-circle:not([aria-valuenow]) .progress-circle__track:is([data-reduce-motion=true],[data-reduce-motion=true] *),.progress-circle:not([aria-valuenow]) .progress-circle__track:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.progress-circle:not([aria-valuenow]) .progress-circle__track:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{animation:none}@media(prefers-reduced-motion:reduce){.progress-circle:not([aria-valuenow]) .progress-circle__track:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.progress-circle:not([aria-valuenow]) .progress-circle__track:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.progress-circle:not([aria-valuenow]) .progress-circle__track:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{animation:none}}.progress-circle:disabled,.progress-circle[data-disabled=true],.progress-circle[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}@keyframes progress-circle-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.progress-circle--sm .progress-circle__track{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.progress-circle--lg .progress-circle__track{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.progress-circle--default{--progress-circle-stroke:var(--default-foreground)}.progress-circle--accent{--progress-circle-stroke:var(--accent)}.progress-circle--success{--progress-circle-stroke:var(--success)}.progress-circle--warning{--progress-circle-stroke:var(--warning)}.progress-circle--danger{--progress-circle-stroke:var(--danger)}.spinner{pointer-events:none;width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6);flex-shrink:0;animation:.75s linear infinite spin;display:inline-flex}.spinner:is([data-reduce-motion=true],[data-reduce-motion=true] *),.spinner:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.spinner:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{animation:none}@media(prefers-reduced-motion:reduce){.spinner:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.spinner:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.spinner:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{animation:none}}.spinner--sm{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.spinner--lg{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.spinner--xl{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.spinner--current{color:inherit}.spinner--accent{color:var(--accent)}.spinner--danger{color:var(--danger)}.spinner--success{color:var(--success)}.spinner--warning{color:var(--warning)}.toast-region{pointer-events:none;z-index:50;--tw-outline-style:none;outline-style:none;width:calc(100vw - 2rem);position:fixed}@media(min-width:40rem){.toast-region{width:auto;min-width:var(--toast-width)}}.toast-region{display:block}.toast-region--bottom{bottom:calc(var(--spacing) * 4);--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y);left:50%}.toast-region--bottom-start{bottom:calc(var(--spacing) * 4);left:calc(var(--spacing) * 4)}.toast-region--bottom-end{right:calc(var(--spacing) * 4);bottom:calc(var(--spacing) * 4)}.toast-region--top{top:calc(var(--spacing) * 4);--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y);left:50%}.toast-region--top-start{top:calc(var(--spacing) * 4);left:calc(var(--spacing) * 4)}.toast-region--top-end{top:calc(var(--spacing) * 4);right:calc(var(--spacing) * 4)}.toast-region:focus-visible{outline-style:var(--tw-outline-style);outline-offset:2px;outline-width:2px;outline-color:var(--focus)}.toast{pointer-events:auto;justify-content:flex-start;align-items:flex-start;gap:calc(var(--spacing) * 1.5);background-color:var(--surface);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);--tw-shadow:var(--overlay-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-radius:min(32px,var(--radius-3xl));flex-direction:row;display:flex;position:absolute;left:0;right:0}.toast--bottom,.toast--bottom-start,.toast--bottom-end{bottom:0}.toast--top,.toast--top-start,.toast--top-end{top:0}.toast:not([data-frontmost=true]){pointer-events:none;height:var(--front-height);overflow:hidden}.toast:not([data-frontmost=true]) .toast__close-button{pointer-events:none;opacity:0;outline:none}.toast[data-hidden=true]{pointer-events:none;opacity:0;display:flex}.toast:focus-visible{outline-style:var(--tw-outline-style);outline-offset:2px;outline-width:2px;outline-color:var(--focus)}.toast--bottom,.toast--bottom-start,.toast--bottom-end{view-transition-class:toast-bottom}.toast--top,.toast--top-start,.toast--top-end{view-transition-class:toast-top}.toast__content{flex-direction:column;flex-grow:1;align-self:center;align-items:flex-start;height:100%;display:flex}.toast__indicator{padding:var(--spacing);color:var(--overlay-foreground);-webkit-user-select:none;user-select:none;flex-shrink:0;justify-content:center;align-items:center;display:flex}.toast__indicator [data-slot=toast-default-icon]{box-sizing:content-box;width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.toast__indicator [data-slot=spinner],.toast__indicator [data-slot=spinner-icon]{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.toast__title{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--overlay-foreground)}.toast__description{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--muted)}.toast__close-button{pointer-events:none;top:calc(var(--spacing) * -1);right:calc(var(--spacing) * -1);width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5);border-color:var(--border);background-color:var(--default);opacity:0;position:absolute}@media(min-width:40rem){.toast__close-button{border-style:var(--tw-border-style);background-color:var(--overlay);border-width:1px}}.toast__close-button{transition:opacity .15s var(--ease-smooth)}.toast__close-button:is([data-reduce-motion=true],[data-reduce-motion=true] *),.toast__close-button:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.toast__close-button:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.toast__close-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.toast__close-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.toast__close-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.toast__close-button [data-slot=close-button-icon]{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}@media(min-width:40rem){.toast__close-button [data-slot=close-button-icon]{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}}@media(hover:hover){.toast__close-button:hover,.toast__close-button[data-hovered=true]{background-color:var(--default)}}.toast[data-frontmost=true]:hover .toast__close-button{pointer-events:auto;opacity:1}.toast__action{margin-top:calc(var(--spacing) * 2)}@media(min-width:40rem){.toast__action{margin-top:0}}.toast--accent .toast__title{color:var(--accent-soft-foreground)}.toast--success .toast__title,.toast--success .toast__indicator{color:var(--success-soft-foreground)}.toast--warning .toast__title,.toast--warning .toast__indicator{color:var(--warning-soft-foreground)}.toast--danger .toast__title,.toast--danger .toast__indicator{color:var(--danger-soft-foreground)}::view-transition-old(*){will-change:translate,opacity}::view-transition-new(*){will-change:translate,opacity}::view-transition-new(.toast-bottom):only-child{animation:.35s toast-slide-bottom-in}::view-transition-old(.toast-bottom):only-child{animation:.35s forwards toast-slide-bottom-out}::view-transition-new(.toast-top):only-child{animation:.35s toast-slide-top-in}::view-transition-old(.toast-top):only-child{animation:.35s forwards toast-slide-top-out}@keyframes toast-slide-bottom-in{0%{opacity:0;translate:0 100%}}@keyframes toast-slide-bottom-out{to{opacity:0;translate:0 100%}}@keyframes toast-slide-top-in{0%{opacity:0;translate:0 -100%}}@keyframes toast-slide-top-out{to{opacity:0;translate:0 -100%}}.checkbox-group{flex-direction:column;display:flex}.checkbox-group [data-slot=checkbox]{margin-top:calc(var(--spacing) * 4)}.checkbox{align-items:flex-start;gap:var(--spacing);--tw-outline-style:none;-webkit-tap-highlight-color:transparent;cursor:var(--cursor-interactive);outline-style:none;flex-direction:column;display:flex}.checkbox>[data-slot=description],.checkbox>[data-slot=field-error]{cursor:default;width:100%;min-width:0;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));text-wrap:wrap;overflow-wrap:break-word;color:var(--muted);-webkit-user-select:none;user-select:none;padding-inline-start:calc(var(--spacing) * 7)}.checkbox [data-slot=label]{-webkit-user-select:none;user-select:none}.checkbox .checkbox__content [data-slot=label]{cursor:var(--cursor-interactive)}.checkbox[data-disabled=true],.checkbox[data-disabled=true] [data-slot=description],.checkbox[data-disabled=true] [data-slot=field-error]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}:is(.checkbox[data-selected=true],.checkbox[data-indeterminate=true]) .checkbox__indicator{border-color:var(--accent-foreground)}.checkbox [data-slot=checkbox-default-indicator--checkmark]{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5);stroke-width:2.5px;color:var(--accent-foreground);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;transition-duration:.2s}.checkbox [data-slot=checkbox-default-indicator--checkmark]:is([data-reduce-motion=true],[data-reduce-motion=true] *),.checkbox [data-slot=checkbox-default-indicator--checkmark]:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.checkbox [data-slot=checkbox-default-indicator--checkmark]:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.checkbox [data-slot=checkbox-default-indicator--checkmark]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.checkbox [data-slot=checkbox-default-indicator--checkmark]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.checkbox [data-slot=checkbox-default-indicator--checkmark]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.checkbox[data-selected=true] [data-slot=checkbox-default-indicator--checkmark]{transition:stroke-dashoffset .15s linear 15ms}.checkbox[data-invalid=true][data-selected=true] [data-slot=checkbox-default-indicator--checkmark],.checkbox[data-invalid=true][aria-checked=true] [data-slot=checkbox-default-indicator--checkmark],.checkbox[aria-invalid=true][data-selected=true] [data-slot=checkbox-default-indicator--checkmark],.checkbox[aria-invalid=true][aria-checked=true] [data-slot=checkbox-default-indicator--checkmark]{color:var(--danger-foreground)}.checkbox[data-indeterminate=true] [data-slot=checkbox-default-indicator--indeterminate]{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.checkbox[data-indeterminate=true][data-invalid=true] [data-slot=checkbox-default-indicator--indeterminate],.checkbox[data-indeterminate=true][aria-invalid=true] [data-slot=checkbox-default-indicator--indeterminate]{color:var(--danger-foreground)}.checkbox__control{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);border-radius:calc(var(--radius) * .75);border-style:var(--tw-border-style);border-width:1px;border-width:var(--border-width-field);border-color:var(--field-border,var(--border));background-color:var(--field-background,var(--default));--tw-shadow:var(--field-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;-webkit-tap-highlight-color:transparent;transition:background-color .2s var(--ease-out),border-color .2s var(--ease-out),transform .1s var(--ease-out);outline-style:none;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex;position:relative;overflow:hidden}.checkbox__control:is([data-reduce-motion=true],[data-reduce-motion=true] *),.checkbox__control:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.checkbox__control:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.checkbox__control:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.checkbox__control:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.checkbox__control:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.checkbox__control{cursor:var(--cursor-interactive)}.checkbox__control:before{pointer-events:none;z-index:0;transform-origin:50%;--tw-scale-x:70%;--tw-scale-y:70%;--tw-scale-z:70%;scale:var(--tw-scale-x) var(--tw-scale-y);border-radius:calc(var(--radius) * .75);background-color:var(--accent);opacity:0;--tw-content:"";content:var(--tw-content);transition:scale .1s var(--ease-linear),opacity .2s var(--ease-linear),background-color .2s var(--ease-out);position:absolute;top:0;right:0;bottom:0;left:0}@media(prefers-reduced-motion:reduce){.checkbox__control:before:not(:is()){transition-property:none}}.checkbox:focus-visible .checkbox__control,.checkbox:has([data-slot=checkbox-content][data-focus-visible=true]) .checkbox__control,.checkbox [data-slot=checkbox-content][data-focus-visible=true] .checkbox__control{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.checkbox:hover .checkbox__control,.checkbox:has([data-slot=checkbox-content][data-hovered=true]) .checkbox__control,.checkbox [data-slot=checkbox-content][data-hovered=true] .checkbox__control{border-color:var(--field-border-hover)}:is(.checkbox:hover .checkbox__control,.checkbox:has([data-slot=checkbox-content][data-hovered=true]) .checkbox__control,.checkbox [data-slot=checkbox-content][data-hovered=true] .checkbox__control):before{background-color:var(--accent-hover)}.checkbox[aria-checked=true] .checkbox__control,.checkbox[data-selected=true] .checkbox__control{color:var(--accent-foreground);border-color:#0000}:is(.checkbox[aria-checked=true] .checkbox__control,.checkbox[data-selected=true] .checkbox__control):before{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y);opacity:1}.checkbox[data-indeterminate=true] .checkbox__control{background-color:var(--accent);color:var(--accent-foreground)}.checkbox:active[data-indeterminate=true] .checkbox__control,.checkbox[data-pressed=true][data-indeterminate=true] .checkbox__control,.checkbox:has([data-slot=checkbox-content][data-pressed=true])[data-indeterminate=true] .checkbox__control{background-color:var(--accent-hover)}.checkbox[data-invalid=true]:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control,.checkbox[aria-invalid=true]:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}:is(.checkbox[data-invalid=true]:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control,.checkbox[aria-invalid=true]:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control):focus,:is(.checkbox[data-invalid=true]:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control,.checkbox[aria-invalid=true]:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control):focus-visible,:is(.checkbox[data-invalid=true]:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control,.checkbox[aria-invalid=true]:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control)[data-focused=true],:is(.checkbox[data-invalid=true]:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control,.checkbox[aria-invalid=true]:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control)[data-focus-visible=true],:is(.checkbox[data-invalid=true]:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control,.checkbox[aria-invalid=true]:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control):focus-within,:is(.checkbox[data-invalid=true]:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control,.checkbox[aria-invalid=true]:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control)[data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.checkbox[data-invalid=true][aria-checked=true] .checkbox__control,.checkbox[data-invalid=true][data-selected=true] .checkbox__control,.checkbox[aria-invalid=true][aria-checked=true] .checkbox__control,.checkbox[aria-invalid=true][data-selected=true] .checkbox__control{background-color:var(--danger);color:var(--danger-foreground);border-color:#0000}:is(.checkbox[data-invalid=true][aria-checked=true] .checkbox__control,.checkbox[data-invalid=true][data-selected=true] .checkbox__control,.checkbox[aria-invalid=true][aria-checked=true] .checkbox__control,.checkbox[aria-invalid=true][data-selected=true] .checkbox__control):before{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y);background-color:var(--danger);opacity:1}.checkbox[data-indeterminate=true][aria-invalid=true] .checkbox__control,.checkbox[data-indeterminate=true][data-invalid=true] .checkbox__control{background-color:var(--danger);color:var(--danger-foreground)}.checkbox__indicator{z-index:10;width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3);justify-content:center;align-items:center;display:flex;position:relative}.checkbox__indicator svg{width:100%;height:100%;transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.checkbox--disabled{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.checkbox--secondary .checkbox__control{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:var(--checkbox-control-bg);--checkbox-control-bg:var(--default)}.checkbox:hover :is(.checkbox--secondary .checkbox__control),.checkbox:has([data-slot=checkbox-content][data-hovered=true]) :is(.checkbox--secondary .checkbox__control),.checkbox [data-slot=checkbox-content][data-hovered=true] :is(.checkbox--secondary .checkbox__control){border-color:var(--field-border-hover)}.checkbox__content{cursor:inherit;align-items:center;gap:calc(var(--spacing) * 3);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--foreground);--tw-outline-style:none;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;outline-style:none;display:inline-flex}.checkbox--secondary:not([aria-checked=true]):not([data-selected=true]):not([data-indeterminate=true]) .checkbox__control{background-color:var(--checkbox-control-bg)}:is(.checkbox--secondary[aria-checked=true] .checkbox__control,.checkbox--secondary[data-selected=true] .checkbox__control):before,.checkbox--secondary[data-indeterminate=true] .checkbox__control,.checkbox--secondary[data-indeterminate=true] .checkbox__control:before{background-color:var(--accent)}.fieldset{gap:calc(var(--spacing) * 6);flex-direction:column;flex:1 1 0;display:flex}.fieldset__legend{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--foreground)}.fieldset__field_group{width:100%}:where(.fieldset__field_group>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}.fieldset__actions{align-items:center;gap:calc(var(--spacing) * 2);padding-top:var(--spacing);display:flex}.input-otp{align-items:center;gap:calc(var(--spacing) * 2);display:flex;position:relative}.input-otp[data-disabled=true]{cursor:not-allowed;opacity:.5}.input-otp__group{align-items:center;gap:calc(var(--spacing) * 2);display:flex}.input-otp__slot{height:calc(var(--spacing) * 10);width:calc(var(--spacing) * 9.5);border-style:var(--tw-border-style);background-color:var(--field-background,var(--default));color:var(--field-foreground,var(--foreground));--tw-shadow:var(--field-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-radius:var(--field-radius,calc(var(--radius) * 1.5));font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-outline-style:none;border-width:1px;border-width:var(--border-width-field);border-color:var(--field-border);transition:background-color .15s var(--ease-smooth),border-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out);outline-style:none;flex:1;justify-content:center;align-items:center;display:flex;position:relative}.input-otp__slot:is([data-reduce-motion=true],[data-reduce-motion=true] *),.input-otp__slot:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.input-otp__slot:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.input-otp__slot:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.input-otp__slot:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.input-otp__slot:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}@media(hover:hover){.input-otp__slot:hover,.input-otp__slot[data-hovered=true]{background-color:var(--field-hover);border-color:var(--field-border-hover)}}.input-otp__slot[data-active=true]{z-index:10;background-color:var(--field-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);--tw-ring-color:var(--focus);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;--tw-ring-offset-width:0px;outline-style:none}.input-otp__slot[data-filled=true]{background-color:var(--field-focus)}.input-otp__slot[data-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.input-otp__slot[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.input-otp__slot[data-invalid=true]:focus,.input-otp__slot[data-invalid=true]:focus-visible,.input-otp__slot[data-invalid=true][data-focused=true],.input-otp__slot[data-invalid=true][data-focus-visible=true],.input-otp__slot[data-invalid=true]:focus-within,.input-otp__slot[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.input-otp__slot[data-invalid=true]{background-color:var(--field-focus)}.input-otp__slot-value{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height));--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6);--tw-tracking:-.27px;letter-spacing:-.27px;animation:slot-value-in .25s var(--ease-smooth) both;transform-origin:bottom}.input-otp__slot-value:is([data-reduce-motion=true],[data-reduce-motion=true] *),.input-otp__slot-value:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.input-otp__slot-value:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{animation:none}@media(prefers-reduced-motion:reduce){.input-otp__slot-value:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.input-otp__slot-value:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.input-otp__slot-value:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{animation:none}}.input-otp__caret{height:calc(var(--spacing) * 4);border-radius:calc(var(--radius) * .5);background-color:var(--field-placeholder,var(--muted));width:2px;animation:1.2s ease-out infinite caret-blink;position:absolute}.input-otp__separator{border-radius:calc(var(--radius) * .5);background-color:var(--separator);flex-shrink:0;width:6px;height:2px}.input-otp--secondary .input-otp__slot{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:var(--input-otp-slot-bg);--input-otp-slot-bg:var(--default);--input-otp-slot-bg-hover:var(--default-hover);--input-otp-slot-bg-focus:var(--default)}@media(hover:hover){.input-otp--secondary .input-otp__slot:hover,.input-otp--secondary .input-otp__slot[data-hovered=true]{background-color:var(--input-otp-slot-bg-hover)}}.input-otp--secondary .input-otp__slot[data-active=true],.input-otp--secondary .input-otp__slot[data-filled=true]{background-color:var(--input-otp-slot-bg-focus)}@keyframes slot-value-in{0%{opacity:0;transform:translateY(8px)scale(.8)}to{opacity:1;transform:translateY(0)scale(1)}}.input{border-radius:var(--field-radius,calc(var(--radius) * 1.5));border-style:var(--tw-border-style);background-color:var(--field-background,var(--default));padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));color:var(--field-foreground,var(--foreground));--tw-shadow:var(--field-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;border-width:1px;outline-style:none}.input::placeholder{color:var(--field-placeholder,var(--muted))}@media(min-width:40rem){.input{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.input{border-width:var(--border-width-field);border-color:var(--field-border);transition:background-color .15s var(--ease-smooth),border-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out)}.input:is([data-reduce-motion=true],[data-reduce-motion=true] *),.input:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.input:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.input:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.input:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.input:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}@media(hover:hover){.input:hover:not(:focus):not(:focus-visible),.input[data-hovered=true]:not([data-focused=true]):not([data-focus-visible=true]){background-color:var(--field-hover);border-color:var(--field-border-hover)}}.input:focus,.input[data-focused=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;--tw-ring-offset-width:0px;border-color:var(--field-border-focus);background-color:var(--field-focus);outline-style:none}.input[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.input[data-invalid=true]:focus,.input[data-invalid=true]:focus-visible,.input[data-invalid=true][data-focused=true],.input[data-invalid=true][data-focus-visible=true],.input[data-invalid=true]:focus-within,.input[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.input[data-invalid=true]{background-color:var(--field-focus)}.input:disabled,.input[data-disabled=true],.input[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.input--secondary{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:var(--input-bg);--input-bg:var(--default);--input-bg-hover:var(--default-hover);--input-bg-focus:var(--default)}@media(hover:hover){.input--secondary:hover:not(:focus):not(:focus-visible),.input--secondary[data-hovered=true]:not([data-focus-visible=true]):not([data-focused=true]){background-color:var(--input-bg-hover)}}.input--secondary:focus,.input--secondary[data-focused=true]{background-color:var(--input-bg-focus)}.input--secondary[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.input--secondary[data-invalid=true]:focus,.input--secondary[data-invalid=true]:focus-visible,.input--secondary[data-invalid=true][data-focused=true],.input--secondary[data-invalid=true][data-focus-visible=true],.input--secondary[data-invalid=true]:focus-within,.input--secondary[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.input--secondary[data-invalid=true]{background-color:var(--input-bg-focus)}.input--full-width{width:100%}.input-group{min-height:calc(var(--spacing) * 9);border-radius:var(--field-radius,calc(var(--radius) * 1.5));border-style:var(--tw-border-style);background-color:var(--field-background,var(--default));font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--field-foreground,var(--foreground));--tw-shadow:var(--field-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;border-width:1px;border-width:var(--border-width-field);border-color:var(--field-border);outline-style:none;align-items:center;display:inline-flex}.input-group:has([data-slot=input-group-textarea]){align-items:flex-start;height:auto}.input-group{transition:background-color .15s var(--ease-smooth),border-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out)}.input-group:is([data-reduce-motion=true],[data-reduce-motion=true] *),.input-group:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.input-group:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.input-group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.input-group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.input-group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}@media(hover:hover){.input-group:hover:not(:focus-within),.input-group[data-hovered=true]:not([data-focus-within=true]){background-color:var(--field-hover);border-color:var(--field-border-hover)}}.input-group:has([data-slot=input-group-input]:focus),.input-group:has([data-slot=input-group-textarea]: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);--tw-ring-color:var(--focus);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;--tw-ring-offset-width:0px;border-color:var(--field-border-focus);background-color:var(--field-focus);outline-style:none}.input-group[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.input-group[data-invalid=true]:focus,.input-group[data-invalid=true]:focus-visible,.input-group[data-invalid=true][data-focused=true],.input-group[data-invalid=true][data-focus-visible=true],.input-group[data-invalid=true]:focus-within,.input-group[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.input-group[data-invalid=true]{background-color:var(--field-focus);border-color:var(--color-field-border-invalid)}.input-group[data-disabled=true],.input-group[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}:-webkit-any(.input-group:has([data-slot=input-group-input]:-webkit-autofill),.input-group:has([data-slot=input-group-input]:autofill)){background-color:var(--field-focus);border-color:var(--field-border-focus)}:is(.input-group:has([data-slot=input-group-input]:autofill)){background-color:var(--field-focus);border-color:var(--field-border-focus)}.input-group__input{border-style:var(--tw-border-style);padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;background-color:#0000;border-width:0;border-radius:0;outline-style:none;flex:1}.input-group__input::placeholder{color:var(--field-placeholder,var(--muted))}@media(min-width:40rem){.input-group__input{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.input-group:has([data-slot=input-group-prefix]) .input-group__input{border-top-left-radius:0;border-bottom-left-radius:0;padding-left:0}.input-group:has([data-slot=input-group-suffix]) .input-group__input{border-top-right-radius:0;border-bottom-right-radius:0;padding-right:0}.input-group__input:focus,.input-group__input:focus-visible{--tw-outline-style:none;outline-style:none}.input-group__input:-webkit-autofill{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.input-group__input:-webkit-autofill:hover{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.input-group__input:-webkit-autofill:focus{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.input-group__input:-webkit-autofill:active{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.input-group__input:autofill{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.input-group__input[data-slot=input-group-textarea]{resize:vertical;min-height:38px}.input-group__prefix{border-top-left-radius:var(--field-radius,calc(var(--radius) * 1.5));border-bottom-left-radius:var(--field-radius,calc(var(--radius) * 1.5));height:100%;padding-inline:calc(var(--spacing) * 3);color:var(--field-placeholder,var(--muted));border-width:var(--border-width-field);border-color:var(--field-border);border-style:solid;border-right-color:var(--field-border);background-color:#0000;border-top:none;border-bottom:none;border-left:none;border-top-right-radius:0;border-bottom-right-radius:0;justify-content:center;align-items:center;display:flex}.input-group:has([data-slot=input-group-textarea]) .input-group__prefix{align-items:flex-start;padding-top:.5rem}.input-group__prefix{transition:background-color .15s var(--ease-smooth),border-color .15s var(--ease-smooth)}.input-group__prefix:is([data-reduce-motion=true],[data-reduce-motion=true] *),.input-group__prefix:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.input-group__prefix:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.input-group__prefix:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.input-group__prefix:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.input-group__prefix:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.input-group__suffix{border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:var(--field-radius,calc(var(--radius) * 1.5));border-bottom-right-radius:var(--field-radius,calc(var(--radius) * 1.5));height:100%;padding-inline:calc(var(--spacing) * 3);color:var(--field-placeholder,var(--muted));border-width:var(--border-width-field);border-color:var(--field-border);border-style:solid;border-left-color:var(--field-border);background-color:#0000;border-top:none;border-bottom:none;border-right:none;justify-content:center;align-items:center;display:flex}.input-group:has([data-slot=input-group-textarea]) .input-group__suffix{align-items:flex-start;padding-top:.5rem}.input-group__suffix{transition:background-color .15s var(--ease-smooth),border-color .15s var(--ease-smooth)}.input-group__suffix:is([data-reduce-motion=true],[data-reduce-motion=true] *),.input-group__suffix:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.input-group__suffix:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.input-group__suffix:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.input-group__suffix:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.input-group__suffix:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.input-group--secondary{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:var(--input-group-bg);--input-group-bg:var(--default);--input-group-bg-hover:var(--default-hover);--input-group-bg-focus:var(--default)}@media(hover:hover){.input-group--secondary:hover:not(:focus-within),.input-group--secondary[data-hovered=true]:not([data-focus-within=true]){background-color:var(--input-group-bg-hover)}}.input-group--secondary:has([data-slot=input-group-input]:focus),.input-group--secondary:has([data-slot=input-group-textarea]:focus){background-color:var(--input-group-bg-focus)}.input-group--secondary[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.input-group--secondary[data-invalid=true]:focus,.input-group--secondary[data-invalid=true]:focus-visible,.input-group--secondary[data-invalid=true][data-focused=true],.input-group--secondary[data-invalid=true][data-focus-visible=true],.input-group--secondary[data-invalid=true]:focus-within,.input-group--secondary[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.input-group--secondary[data-invalid=true]{border-color:var(--color-field-border-invalid);background-color:var(--input-group-bg-focus)}.input-group--secondary [data-slot=input-group-input],.input-group--secondary [data-slot=input-group-textarea]{background-color:#0000}.input-group--full-width{width:100%}.number-field{gap:var(--spacing);flex-direction:column;display:flex}:is(.number-field[data-invalid=true],.number-field[aria-invalid=true]) [data-slot=description]{display:none}.number-field [data-slot=label]{width:fit-content}.number-field__group{height:calc(var(--spacing) * 9);border-radius:var(--field-radius,calc(var(--radius) * 1.5));border-style:var(--tw-border-style);background-color:var(--field-background,var(--default));font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--field-foreground,var(--foreground));--tw-shadow:var(--field-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;border-width:1px;border-width:var(--border-width-field);border-color:var(--field-border);transition:background-color .15s var(--ease-smooth),border-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out);outline-style:none;grid-template-columns:40px 1fr 40px;align-items:center;display:grid;overflow:hidden}.number-field__group:is([data-reduce-motion=true],[data-reduce-motion=true] *),.number-field__group:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.number-field__group:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.number-field__group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.number-field__group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.number-field__group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}@media(hover:hover){.number-field__group:hover:not(:focus-within),.number-field__group[data-hovered=true]:not([data-focus-within=true]){background-color:var(--field-hover);border-color:var(--field-border-hover)}}.number-field__group[data-focus-within=true],.number-field__group:focus-within{--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);--tw-ring-color:var(--focus);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;--tw-ring-offset-width:0px;border-color:var(--field-border-focus);background-color:var(--field-focus);outline-style:none}.number-field__group[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.number-field__group[data-invalid=true]:focus,.number-field__group[data-invalid=true]:focus-visible,.number-field__group[data-invalid=true][data-focused=true],.number-field__group[data-invalid=true][data-focus-visible=true],.number-field__group[data-invalid=true]:focus-within,.number-field__group[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.number-field__group[data-invalid=true]{background-color:var(--field-focus);border-color:var(--color-field-border-invalid)}.number-field__group[data-disabled=true],.number-field__group[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}:-webkit-any(.number-field__group:has([data-slot=number-field-input]:-webkit-autofill),.number-field__group:has([data-slot=number-field-input]:autofill)){background-color:var(--field-focus);border-color:var(--field-border-focus)}:is(.number-field__group:has([data-slot=number-field-input]:autofill)){background-color:var(--field-focus);border-color:var(--field-border-focus)}.number-field__input{border-style:var(--tw-border-style);min-width:0;padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--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,);--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;background-color:#0000;border-width:0;border-radius:0;outline-style:none}@media(min-width:40rem){.number-field__input{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.number-field__group:has([slot=decrement]) .number-field__input{border-top-left-radius:0;border-bottom-left-radius:0}.number-field__group:has([slot=increment]) .number-field__input{border-top-right-radius:0;border-bottom-right-radius:0}.number-field__input:focus,.number-field__input:focus-visible{--tw-outline-style:none;outline-style:none}.number-field__input:-webkit-autofill{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.number-field__input:-webkit-autofill:hover{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.number-field__input:-webkit-autofill:focus{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.number-field__input:-webkit-autofill:active{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.number-field__input:autofill{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.number-field__increment-button,.number-field__decrement-button{height:100%;width:calc(var(--spacing) * 10);color:var(--field-foreground,var(--foreground));--tw-outline-style:none;border-width:var(--border-width-field);border-color:var(--field-border);transition:background-color .15s var(--ease-smooth),border-color .15s var(--ease-smooth);background-color:#0000;border-style:solid;border-radius:0;outline-style:none;justify-content:center;align-items:center;display:flex}:is(.number-field__increment-button,.number-field__decrement-button):is([data-reduce-motion=true],[data-reduce-motion=true] *),:is(.number-field__increment-button,.number-field__decrement-button):is([data-reduce-motion=true],[data-reduce-motion=true] *):before,:is(.number-field__increment-button,.number-field__decrement-button):is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){:is(.number-field__increment-button,.number-field__decrement-button):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),:is(.number-field__increment-button,.number-field__decrement-button):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,:is(.number-field__increment-button,.number-field__decrement-button):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.number-field__increment-button,.number-field__decrement-button{cursor:var(--cursor-interactive)}:is(.number-field__increment-button,.number-field__decrement-button):active,:is(.number-field__increment-button,.number-field__decrement-button)[data-pressed=true]{background-color:var(--field-foreground,var(--foreground))}@supports (color:color-mix(in lab,red,red)){:is(.number-field__increment-button,.number-field__decrement-button):active,:is(.number-field__increment-button,.number-field__decrement-button)[data-pressed=true]{background-color:color-mix(in oklab,var(--field-foreground,var(--foreground)) 10%,transparent)}}:is(.number-field__increment-button,.number-field__decrement-button):active,:is(.number-field__increment-button,.number-field__decrement-button)[data-pressed=true]{transform:scale(.97)}:is(.number-field__increment-button,.number-field__decrement-button):disabled,:is(.number-field__increment-button,.number-field__decrement-button)[data-disabled=true],:is(.number-field__increment-button,.number-field__decrement-button)[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}:is(.number-field__increment-button,.number-field__decrement-button) [data-slot=number-field-increment-button-icon],:is(.number-field__increment-button,.number-field__decrement-button) [data-slot=number-field-decrement-button-icon]{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.number-field__increment-button{border-top-left-radius:0;border-bottom-left-radius:0;border-top-right-radius:var(--field-radius,calc(var(--radius) * 1.5));border-bottom-right-radius:var(--field-radius,calc(var(--radius) * 1.5));border-left-style:var(--tw-border-style);border-left-width:1px;border-color:var(--field-placeholder,var(--muted))}@supports (color:color-mix(in lab,red,red)){.number-field__increment-button{border-color:color-mix(in oklab,var(--field-placeholder,var(--muted)) 15%,transparent)}}.number-field__decrement-button{border-top-left-radius:var(--field-radius,calc(var(--radius) * 1.5));border-bottom-left-radius:var(--field-radius,calc(var(--radius) * 1.5));border-right-style:var(--tw-border-style);border-right-width:1px;border-color:var(--field-placeholder,var(--muted));border-top-right-radius:0;border-bottom-right-radius:0}@supports (color:color-mix(in lab,red,red)){.number-field__decrement-button{border-color:color-mix(in oklab,var(--field-placeholder,var(--muted)) 15%,transparent)}}.number-field--secondary .number-field__group{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:var(--number-field-group-bg);--number-field-group-bg:var(--default);--number-field-group-bg-hover:var(--default-hover);--number-field-group-bg-focus:var(--default)}@media(hover:hover){.number-field--secondary .number-field__group:hover:not(:focus-within),.number-field--secondary .number-field__group[data-hovered=true]:not([data-focus-within=true]){background-color:var(--number-field-group-bg-hover)}}.number-field--secondary .number-field__group:focus-within,.number-field--secondary .number-field__group[data-focus-within=true]{background-color:var(--number-field-group-bg-focus)}.number-field--secondary .number-field__group[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.number-field--secondary .number-field__group[data-invalid=true]:focus,.number-field--secondary .number-field__group[data-invalid=true]:focus-visible,.number-field--secondary .number-field__group[data-invalid=true][data-focused=true],.number-field--secondary .number-field__group[data-invalid=true][data-focus-visible=true],.number-field--secondary .number-field__group[data-invalid=true]:focus-within,.number-field--secondary .number-field__group[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.number-field--secondary .number-field__group[data-invalid=true]{border-color:var(--color-field-border-invalid);background-color:var(--number-field-group-bg-focus)}.number-field--secondary .number-field__group [data-slot=number-field-input]{background-color:#0000}.number-field--full-width,.number-field__group--full-width{width:100%}.radio-group{flex-direction:column;display:flex}.radio-group[data-orientation=vertical] [data-slot=radio]{margin-top:calc(var(--spacing) * 4)}.radio-group[data-orientation=horizontal]{gap:calc(var(--spacing) * 4);flex-flow:wrap}.radio-group--secondary .radio__control{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:var(--radio-control-bg);--radio-control-bg:var(--default);--radio-control-bg-hover:var(--default-hover)}.radio:has([data-slot=radio-content][data-hovered=true]) :is(.radio-group--secondary .radio__control),.radio [data-slot=radio-content][data-hovered=true] :is(.radio-group--secondary .radio__control){border-color:var(--field-border-hover)}.radio:not([data-selected]):not(:has(input:checked)) :is(.radio-group--secondary .radio__control) .radio__indicator:empty:before{background-color:var(--radio-control-bg)}.radio:has([data-slot=radio-content][data-hovered=true]):not([data-selected]):not(:has(input:checked)) :is(.radio-group--secondary .radio__control) .radio__indicator:empty:before{background-color:var(--radio-control-bg-hover)}.radio{align-items:flex-start;gap:var(--spacing);--tw-outline-style:none;-webkit-tap-highlight-color:transparent;cursor:var(--cursor-interactive);outline-style:none;flex-direction:column;display:flex}.radio [data-slot=label]{-webkit-user-select:none;user-select:none}.radio .radio__content [data-slot=label]{cursor:var(--cursor-interactive)}.radio>[data-slot=description],.radio>[data-slot=field-error]{cursor:default;width:100%;min-width:0;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));text-wrap:wrap;overflow-wrap:break-word;color:var(--muted);-webkit-user-select:none;user-select:none;padding-inline-start:calc(var(--spacing) * 7)}.radio:disabled,.radio[data-disabled=true],.radio[aria-disabled=true],:is(.radio:disabled,.radio[data-disabled=true],.radio[aria-disabled=true]) [data-slot=description],:is(.radio:disabled,.radio[data-disabled=true],.radio[aria-disabled=true]) [data-slot=field-error]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.radio__content{cursor:inherit;align-items:center;gap:calc(var(--spacing) * 3);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--foreground);--tw-outline-style:none;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;outline-style:none;display:inline-flex}.radio__control{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);border-radius:calc(var(--radius) * 1);border-style:var(--tw-border-style);border-width:1px;border-width:var(--border-width-field);border-color:var(--field-border,var(--border));background-color:var(--field-background,var(--default));--tw-shadow:var(--field-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;-webkit-tap-highlight-color:transparent;transition:background-color .2s var(--ease-out),border-color .2s var(--ease-out),transform .1s var(--ease-out);outline-style:none;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex;position:relative}.radio__control:is([data-reduce-motion=true],[data-reduce-motion=true] *),.radio__control:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.radio__control:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.radio__control:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.radio__control:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.radio__control:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.radio__control{cursor:var(--cursor-interactive)}.radio:has([data-slot=radio-content][data-focus-visible=true]) .radio__control,.radio [data-slot=radio-content][data-focus-visible=true] .radio__control{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.radio:has([data-slot=radio-content][data-hovered=true]) .radio__control,.radio [data-slot=radio-content][data-hovered=true] .radio__control{border-color:var(--field-border-hover)}.radio:has([data-slot=radio-content][data-hovered=true]):not([data-selected]):not(:has(input:checked)) .radio__control .radio__indicator:empty:before{background-color:var(--field-hover)}.radio:has([data-slot=radio-content][data-pressed=true]) .radio__control,.radio [data-slot=radio-content][data-pressed=true] .radio__control{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.radio[data-selected] .radio__control,.radio:has([data-slot=radio-content][aria-checked=true]) .radio__control,.radio:has(input:checked) .radio__control{background-color:var(--accent);border-color:#0000}.radio[data-selected]:has([data-slot=radio-content][data-pressed=true]) .radio__control,.radio:has([data-slot=radio-content][data-pressed=true][aria-checked=true]) .radio__control,.radio:has(input:checked):has([data-slot=radio-content][data-pressed=true]) .radio__control{background-color:var(--accent-hover)}.radio[data-invalid=true] .radio__control,.radio[aria-invalid=true] .radio__control{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}:is(.radio[data-invalid=true] .radio__control,.radio[aria-invalid=true] .radio__control):focus,:is(.radio[data-invalid=true] .radio__control,.radio[aria-invalid=true] .radio__control):focus-visible,:is(.radio[data-invalid=true] .radio__control,.radio[aria-invalid=true] .radio__control)[data-focused=true],:is(.radio[data-invalid=true] .radio__control,.radio[aria-invalid=true] .radio__control)[data-focus-visible=true],:is(.radio[data-invalid=true] .radio__control,.radio[aria-invalid=true] .radio__control):focus-within,:is(.radio[data-invalid=true] .radio__control,.radio[aria-invalid=true] .radio__control)[data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.radio[data-invalid=true][data-selected] .radio__control,.radio[aria-invalid=true][data-selected] .radio__control,.radio[data-invalid=true]:has(input:checked) .radio__control,.radio[aria-invalid=true]:has(input:checked) .radio__control{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}:is(.radio[data-invalid=true][data-selected] .radio__control,.radio[aria-invalid=true][data-selected] .radio__control,.radio[data-invalid=true]:has(input:checked) .radio__control,.radio[aria-invalid=true]:has(input:checked) .radio__control):focus,:is(.radio[data-invalid=true][data-selected] .radio__control,.radio[aria-invalid=true][data-selected] .radio__control,.radio[data-invalid=true]:has(input:checked) .radio__control,.radio[aria-invalid=true]:has(input:checked) .radio__control):focus-visible,:is(.radio[data-invalid=true][data-selected] .radio__control,.radio[aria-invalid=true][data-selected] .radio__control,.radio[data-invalid=true]:has(input:checked) .radio__control,.radio[aria-invalid=true]:has(input:checked) .radio__control)[data-focused=true],:is(.radio[data-invalid=true][data-selected] .radio__control,.radio[aria-invalid=true][data-selected] .radio__control,.radio[data-invalid=true]:has(input:checked) .radio__control,.radio[aria-invalid=true]:has(input:checked) .radio__control)[data-focus-visible=true],:is(.radio[data-invalid=true][data-selected] .radio__control,.radio[aria-invalid=true][data-selected] .radio__control,.radio[data-invalid=true]:has(input:checked) .radio__control,.radio[aria-invalid=true]:has(input:checked) .radio__control):focus-within,:is(.radio[data-invalid=true][data-selected] .radio__control,.radio[aria-invalid=true][data-selected] .radio__control,.radio[data-invalid=true]:has(input:checked) .radio__control,.radio[aria-invalid=true]:has(input:checked) .radio__control)[data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.radio__indicator{pointer-events:none;justify-content:center;align-items:center;display:flex;position:absolute;top:0;right:0;bottom:0;left:0}.radio__indicator:empty:before{content:"";border-radius:calc(var(--radius) * 1);background-color:var(--field-background,var(--default));width:100%;height:100%;transition:scale .2s var(--ease-out),background-color .2s var(--ease-out);scale:1}@media(prefers-reduced-motion:reduce){.radio__indicator:empty:before:not(:is()){transition-property:none}}.radio[data-selected] .radio__indicator:empty:before,.radio:has([data-slot=radio-content][aria-checked=true]) .radio__indicator:empty:before,.radio:has(input:checked) .radio__indicator:empty:before{background-color:var(--accent-foreground);scale:.4286}.radio[data-selected]:has([data-slot=radio-content][data-pressed=true]) .radio__indicator:empty:before,.radio:has([data-slot=radio-content][data-pressed=true][aria-checked=true]) .radio__indicator:empty:before,.radio:has(input:checked):has([data-slot=radio-content][data-pressed=true]) .radio__indicator:empty:before{scale:.5714}.radio--disabled{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.textfield{gap:var(--spacing);flex-direction:column;display:flex}:is(.textfield[data-invalid=true],.textfield[aria-invalid=true]) [data-slot=description]{display:none}.textfield--full-width,.textfield--full-width [data-slot=input],.textfield--full-width [data-slot=textarea]{width:100%}.search-field{gap:var(--spacing);flex-direction:column;display:flex}:is(.search-field[data-invalid=true],.search-field[aria-invalid=true]) [data-slot=description]{display:none}.search-field [data-slot=label]{width:fit-content}.search-field[data-empty=true] [data-slot=search-field-clear-button]{pointer-events:none;opacity:0}.search-field__group{height:calc(var(--spacing) * 9);border-radius:var(--field-radius,calc(var(--radius) * 1.5));border-style:var(--tw-border-style);background-color:var(--field-background,var(--default));font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--field-foreground,var(--foreground));--tw-shadow:var(--field-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;border-width:1px;border-width:var(--border-width-field);border-color:var(--field-border);transition:background-color .15s var(--ease-smooth),border-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out);outline-style:none;align-items:center;display:inline-flex;position:relative;overflow:hidden}.search-field__group:is([data-reduce-motion=true],[data-reduce-motion=true] *),.search-field__group:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.search-field__group:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.search-field__group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.search-field__group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.search-field__group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}@media(hover:hover){.search-field__group:hover:not(:focus-within),.search-field__group[data-hovered=true]:not([data-focus-within=true]){background-color:var(--field-hover);border-color:var(--field-border-hover)}}.search-field__group[data-focus-within=true],.search-field__group:focus-within{--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);--tw-ring-color:var(--focus);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;--tw-ring-offset-width:0px;outline-style:none}.search-field__group[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.search-field__group[data-invalid=true]:focus,.search-field__group[data-invalid=true]:focus-visible,.search-field__group[data-invalid=true][data-focused=true],.search-field__group[data-invalid=true][data-focus-visible=true],.search-field__group[data-invalid=true]:focus-within,.search-field__group[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.search-field__group[data-invalid=true]{background-color:var(--field-focus);border-color:var(--color-field-border-invalid)}.search-field__group[data-disabled=true],.search-field__group[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}:-webkit-any(.search-field__group:has([data-slot=search-field-input]:-webkit-autofill),.search-field__group:has([data-slot=search-field-input]:autofill)){background-color:var(--field-focus);border-color:var(--field-border-focus)}:is(.search-field__group:has([data-slot=search-field-input]:autofill)){background-color:var(--field-focus);border-color:var(--field-border-focus)}.search-field__input{border-style:var(--tw-border-style);padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;background-color:#0000;border-width:0;border-radius:0;outline-style:none;flex:1}@media(min-width:40rem){.search-field__input{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.search-field__input::-webkit-search-cancel-button{-webkit-appearance:none;-moz-appearance:none;appearance:none}.search-field__input::-webkit-search-decoration{-webkit-appearance:none;-moz-appearance:none;appearance:none}.search-field__group:has([data-slot=search-field-search-icon]) .search-field__input{padding-left:calc(var(--spacing) * 2);border-top-left-radius:0;border-bottom-left-radius:0}.search-field__group:has([slot=clear]) .search-field__input{padding-right:calc(var(--spacing) * 2);border-top-right-radius:0;border-bottom-right-radius:0}.search-field__input:focus,.search-field__input:focus-visible{--tw-outline-style:none;outline-style:none}.search-field__input:-webkit-autofill{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.search-field__input:-webkit-autofill:hover{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.search-field__input:-webkit-autofill:focus{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.search-field__input:-webkit-autofill:active{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.search-field__input:autofill{-webkit-text-fill-color:var(--field-foreground);caret-color:var(--field-foreground);transition:background-color 9999s ease-in-out;box-shadow:inset 0 0 0 1000px #0000}.search-field__search-icon{pointer-events:none;color:var(--field-placeholder,var(--muted));margin-right:0;margin-left:calc(var(--spacing) * 3);width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);flex-shrink:0}.search-field__clear-button{margin-right:calc(var(--spacing) * 2);width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5);flex-shrink:0}.search-field__clear-button [data-slot=close-button-icon]{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.search-field--secondary .search-field__group{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:var(--search-field-group-bg);--search-field-group-bg:var(--default);--search-field-group-bg-hover:var(--default-hover);--search-field-group-bg-focus:var(--default)}@media(hover:hover){.search-field--secondary .search-field__group:hover:not(:focus-within),.search-field--secondary .search-field__group[data-hovered=true]:not([data-focus-within=true]){background-color:var(--search-field-group-bg-hover)}}.search-field--secondary .search-field__group:focus-within,.search-field--secondary .search-field__group[data-focus-within=true]{background-color:var(--search-field-group-bg-focus)}.search-field--secondary .search-field__group[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.search-field--secondary .search-field__group[data-invalid=true]:focus,.search-field--secondary .search-field__group[data-invalid=true]:focus-visible,.search-field--secondary .search-field__group[data-invalid=true][data-focused=true],.search-field--secondary .search-field__group[data-invalid=true][data-focus-visible=true],.search-field--secondary .search-field__group[data-invalid=true]:focus-within,.search-field--secondary .search-field__group[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.search-field--secondary .search-field__group[data-invalid=true]{border-color:var(--color-field-border-invalid);background-color:var(--search-field-group-bg-focus)}.search-field--secondary .search-field__group [data-slot=search-field-input]{background-color:#0000}.search-field--full-width,.search-field__group--full-width{width:100%}.textarea{border-radius:var(--field-radius,calc(var(--radius) * 1.5));border-style:var(--tw-border-style);background-color:var(--field-background,var(--default));padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));color:var(--field-foreground,var(--foreground));--tw-shadow:var(--field-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;border-width:1px;outline-style:none}.textarea::placeholder{color:var(--field-placeholder,var(--muted))}@media(min-width:40rem){.textarea{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.textarea{border-width:var(--border-width-field);border-color:var(--field-border);min-height:38px;transition:background-color .15s var(--ease-smooth),border-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out)}.textarea:is([data-reduce-motion=true],[data-reduce-motion=true] *),.textarea:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.textarea:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.textarea:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.textarea:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.textarea:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}@media(hover:hover){.textarea:hover:not(:focus):not(:focus-visible),.textarea[data-hovered=true]:not([data-focused=true]):not([data-focus-visible=true]){background-color:var(--field-hover);border-color:var(--field-border-hover)}}.textarea:focus,.textarea[data-focused=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;--tw-ring-offset-width:0px;border-color:var(--field-border-focus);background-color:var(--field-focus);outline-style:none}.textarea[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.textarea[data-invalid=true]:focus,.textarea[data-invalid=true]:focus-visible,.textarea[data-invalid=true][data-focused=true],.textarea[data-invalid=true][data-focus-visible=true],.textarea[data-invalid=true]:focus-within,.textarea[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.textarea[data-invalid=true]{background-color:var(--field-focus)}.textarea:disabled,.textarea[data-disabled=true],.textarea[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.textarea--secondary{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:var(--textarea-bg);--textarea-bg:var(--default);--textarea-bg-hover:var(--default-hover);--textarea-bg-focus:var(--default)}@media(hover:hover){.textarea--secondary:hover:not(:focus):not(:focus-visible),.textarea--secondary[data-hovered=true]:not([data-focused=true]):not([data-focus-visible=true]){background-color:var(--textarea-bg-hover)}}.textarea--secondary:focus,.textarea--secondary[data-focused=true]{background-color:var(--textarea-bg-focus)}.textarea--secondary[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.textarea--secondary[data-invalid=true]:focus,.textarea--secondary[data-invalid=true]:focus-visible,.textarea--secondary[data-invalid=true][data-focused=true],.textarea--secondary[data-invalid=true][data-focus-visible=true],.textarea--secondary[data-invalid=true]:focus-within,.textarea--secondary[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.textarea--secondary[data-invalid=true]{background-color:var(--textarea-bg-focus)}.textarea--full-width{width:100%}.calendar{width:calc(var(--spacing) * 63);max-width:calc(var(--spacing) * 63);container-type:inline-size}.calendar--week-view .calendar__cell,.calendar--day-view .calendar__cell{aspect-ratio:1;place-self:center;width:100%;height:auto}.calendar--day-view .calendar__grid{flex-direction:column;display:flex}.calendar--day-view .calendar__grid-header{grid-template-columns:repeat(7,1fr);width:100%;display:grid}.calendar--day-view .calendar__grid-header>tr{display:contents}.calendar--day-view .calendar__grid-body{margin-top:var(--spacing);grid-template-columns:repeat(7,1fr);width:100%;display:grid}.calendar--day-view .calendar__grid-body>tr{display:contents}.calendar--day-view .calendar__grid-body>tr:first-child>td{margin-top:0}.calendar__header{padding-inline:calc(var(--spacing) * .5);padding-bottom:calc(var(--spacing) * 4);justify-content:space-between;align-items:center;display:flex}.calendar__header:has(.calendar-year-picker__trigger[data-open=true]) .calendar__nav-button{pointer-events:none;opacity:0}.calendar__heading{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);flex:1}.calendar__nav-button{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6);border-radius:calc(var(--radius) * 2);color:var(--accent-soft-foreground);will-change:scale;transition:transform .25s var(--ease-out),background-color .1s var(--ease-out),box-shadow .1s var(--ease-out),opacity .15s var(--ease-out);transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);justify-content:center;align-items:center;display:flex}.calendar__nav-button:is([data-reduce-motion=true],[data-reduce-motion=true] *),.calendar__nav-button:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.calendar__nav-button:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.calendar__nav-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.calendar__nav-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.calendar__nav-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.calendar__nav-button{cursor:var(--cursor-interactive)}@media(hover:hover){.calendar__nav-button:hover,.calendar__nav-button[data-hovered=true]{background-color:var(--default);color:var(--accent-soft-foreground)}}.calendar__nav-button:active,.calendar__nav-button[data-pressed=true]{transform:scale(.95)}.calendar__nav-button:focus-visible,.calendar__nav-button[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.calendar__nav-button:disabled,.calendar__nav-button[data-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.calendar__nav-button-icon{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.calendar__grid{grid-template-columns:repeat(7,1fr);width:100%;display:grid}.calendar__grid[aria-readonly=true] .calendar__cell{pointer-events:none}.calendar__grid-header,.calendar__grid-header>tr,.calendar__grid-body,.calendar__grid-body>tr{display:contents}.calendar__grid-body>tr:first-child>td{margin-top:var(--spacing)}.calendar__grid-row{display:contents}.calendar__header-cell{padding-bottom:calc(var(--spacing) * 2);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--muted);justify-content:center;align-items:center;display:flex}.calendar__cell{aspect-ratio:1;border-radius:calc(var(--radius) * 3);text-align:center;width:100%;height:100%;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);--tw-outline-style:none;-webkit-tap-highlight-color:transparent;will-change:scale;transition:transform .25s var(--ease-out),box-shadow .1s var(--ease-out);transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);outline-style:none;justify-content:center;align-items:center;display:flex;position:relative}.calendar__cell:is([data-reduce-motion=true],[data-reduce-motion=true] *),.calendar__cell:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.calendar__cell:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.calendar__cell:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.calendar__cell:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.calendar__cell:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.calendar__cell{cursor:var(--cursor-interactive)}.calendar__cell:focus-visible:not(:focus),.calendar__cell[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.calendar__cell[data-today=true]{background-color:var(--accent-soft);color:var(--accent-soft-foreground)}@media(hover:hover){.calendar__cell[data-today=true]:hover:not([data-selected=true]),.calendar__cell[data-today=true][data-hovered=true]:not([data-selected=true]){background-color:var(--accent-soft-hover)}}.calendar__cell[data-selected=true]{background-color:var(--accent);color:var(--accent-foreground)}.calendar__cell:active,.calendar__cell[data-pressed=true]{background-color:var(--default);transform:scale(.95)}:is(.calendar__cell:active,.calendar__cell[data-pressed=true])[data-selected=true]{background-color:var(--accent-hover)}@media(hover:hover){.calendar__cell:hover:not([data-selected=true]),.calendar__cell[data-hovered=true]:not([data-selected=true]){background-color:var(--default)}}.calendar__cell[data-outside-month=true]{color:var(--muted);opacity:.5}.calendar__cell[data-selected=true][data-outside-month=true]{background-color:var(--default)}.calendar__cell[data-unavailable=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.calendar__cell:disabled:not([data-outside-month=true]),.calendar__cell[data-disabled=true]:not([data-outside-month=true]){opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none;text-decoration:line-through}.calendar__cell-indicator{bottom:var(--spacing);--tw-translate-x: -50% ;width:3px;height:3px;translate:var(--tw-translate-x) var(--tw-translate-y);border-radius:calc(var(--radius) * .25);background-color:var(--muted);position:absolute;left:50%}[data-selected=true]>.calendar__cell-indicator{background-color:var(--accent-foreground)}.range-calendar{width:calc(var(--spacing) * 63);max-width:calc(var(--spacing) * 63);container-type:inline-size}.range-calendar--week-view .range-calendar__cell,.range-calendar--day-view .range-calendar__cell{aspect-ratio:1;place-self:center;width:100%;height:auto}.range-calendar--day-view .range-calendar__grid{flex-direction:column;display:flex}.range-calendar--day-view .range-calendar__grid-header{grid-template-columns:repeat(7,1fr);width:100%;display:grid}.range-calendar--day-view .range-calendar__grid-header>tr{display:contents}.range-calendar--day-view .range-calendar__grid-body{margin-top:var(--spacing);grid-template-columns:repeat(7,1fr);width:100%;display:grid}.range-calendar--day-view .range-calendar__grid-body>tr{display:contents}.range-calendar--day-view .range-calendar__grid-body>tr:first-child>td{margin-top:0}.range-calendar__header{padding-inline:calc(var(--spacing) * .5);padding-bottom:calc(var(--spacing) * 4);justify-content:space-between;align-items:center;display:flex}.range-calendar__header:has(.calendar-year-picker__trigger[data-open=true]) .range-calendar__nav-button{pointer-events:none;opacity:0}.range-calendar__heading{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);flex:1}.range-calendar__nav-button{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6);border-radius:calc(var(--radius) * 1.5);color:var(--accent-soft-foreground);will-change:scale;transition:transform .25s var(--ease-out),background-color .1s var(--ease-out),box-shadow .1s var(--ease-out),opacity .15s var(--ease-out);transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);justify-content:center;align-items:center;display:flex}.range-calendar__nav-button:is([data-reduce-motion=true],[data-reduce-motion=true] *),.range-calendar__nav-button:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.range-calendar__nav-button:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.range-calendar__nav-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.range-calendar__nav-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.range-calendar__nav-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.range-calendar__nav-button{cursor:var(--cursor-interactive)}@media(hover:hover){.range-calendar__nav-button:hover,.range-calendar__nav-button[data-hovered=true]{background-color:var(--default);color:var(--accent-soft-foreground)}}.range-calendar__nav-button:active,.range-calendar__nav-button[data-pressed=true]{transform:scale(.95)}.range-calendar__nav-button:focus-visible,.range-calendar__nav-button[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.range-calendar__nav-button:disabled,.range-calendar__nav-button[data-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.range-calendar__nav-button-icon{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.range-calendar__grid{grid-template-columns:repeat(7,1fr);width:100%;display:grid}.range-calendar__grid[aria-readonly=true] .range-calendar__cell{pointer-events:none}.range-calendar__grid-header,.range-calendar__grid-header>tr,.range-calendar__grid-body,.range-calendar__grid-body>tr{display:contents}.range-calendar__grid-body>tr:first-child>td{margin-top:var(--spacing)}.range-calendar__grid-row{display:contents}.range-calendar__header-cell{padding-bottom:calc(var(--spacing) * 2);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--muted);justify-content:center;align-items:center;display:flex}.range-calendar__cell{z-index:1;border-radius:calc(var(--radius) * 3);--tw-outline-style:none;cursor:var(--cursor-interactive);will-change:background-color,border-color;transition:box-shadow .1s var(--ease-out),border-color .1s var(--ease-out);transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);outline-style:none;margin-block:2px;margin-inline:0;padding:0;position:relative}.range-calendar__cell:is([data-reduce-motion=true],[data-reduce-motion=true] *),.range-calendar__cell:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.range-calendar__cell:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.range-calendar__cell:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.range-calendar__cell:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.range-calendar__cell:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.range-calendar__cell .range-calendar__cell-button{aspect-ratio:1;border-radius:calc(var(--radius) * 3);width:100%;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--foreground);-webkit-tap-highlight-color:transparent;will-change:scale;transition:scale .2s var(--ease-out);transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);justify-content:center;align-items:center;display:flex}.range-calendar__cell .range-calendar__cell-button:is([data-reduce-motion=true],[data-reduce-motion=true] *),.range-calendar__cell .range-calendar__cell-button:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.range-calendar__cell .range-calendar__cell-button:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.range-calendar__cell .range-calendar__cell-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.range-calendar__cell .range-calendar__cell-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.range-calendar__cell .range-calendar__cell-button:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.range-calendar__cell:focus-visible:not(:focus),.range-calendar__cell[data-focus-visible=true]{z-index:2}:is(.range-calendar__cell:focus-visible:not(:focus),.range-calendar__cell[data-focus-visible=true]) .range-calendar__cell-button{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.range-calendar__cell[data-today=true] .range-calendar__cell-button{background-color:var(--accent-soft);color:var(--accent-soft-foreground)}@media(hover:hover){:is(.range-calendar__cell[data-today=true]:hover:not([data-selected=true]),.range-calendar__cell[data-today=true][data-hovered=true]:not([data-selected=true])) .range-calendar__cell-button{background-color:var(--accent-soft-hover)}}.range-calendar__cell[data-selected=true]:not([data-outside-month=true]){background-color:var(--accent-soft);border-radius:0}.range-calendar__cell[data-selected=true]:is(td:first-child>*,[aria-disabled]+td>*){border-start-start-radius:calc(var(--radius) * 1);border-end-start-radius:calc(var(--radius) * 1)}.range-calendar__cell[data-selected=true]:is(td:first-child>*,[aria-disabled]+td>*)[data-selection-start=true]{border-start-start-radius:calc(var(--radius) * 3);border-end-start-radius:calc(var(--radius) * 3)}.range-calendar__cell[data-selected=true]:is(td:last-child>*,td:has(+[aria-disabled])>*){border-start-end-radius:calc(var(--radius) * 1);border-end-end-radius:calc(var(--radius) * 1)}.range-calendar__cell[data-selected=true]:is(td:last-child>*,td:has(+[aria-disabled])>*)[data-selection-end=true]{border-start-end-radius:calc(var(--radius) * 3);border-end-end-radius:calc(var(--radius) * 3)}.range-calendar__cell[data-selection-start=true]:not([data-outside-month=true]),.range-calendar__cell[data-selection-end=true]:not([data-outside-month=true]){z-index:2}:is(.range-calendar__cell[data-selection-start=true]:not([data-outside-month=true]),.range-calendar__cell[data-selection-end=true]:not([data-outside-month=true])) .range-calendar__cell-button{background-color:var(--accent);color:var(--accent-foreground)}.range-calendar__cell[data-selection-start=true]:not([data-outside-month=true]){border-top-left-radius:calc(var(--radius) * 3);border-bottom-left-radius:calc(var(--radius) * 3)}.range-calendar__cell[data-selection-end=true]:not([data-outside-month=true]){border-top-right-radius:calc(var(--radius) * 3);border-bottom-right-radius:calc(var(--radius) * 3)}:is(.range-calendar__cell:active,.range-calendar__cell[data-pressed=true]) .range-calendar__cell-button{scale:.9}:is(:is(.range-calendar__cell:active,.range-calendar__cell[data-pressed=true])[data-selection-start=true],:is(.range-calendar__cell:active,.range-calendar__cell[data-pressed=true])[data-selection-end=true]) .range-calendar__cell-button{background-color:var(--accent-hover)}@media(hover:hover){:is(.range-calendar__cell:hover:not([data-selected=true]),.range-calendar__cell[data-hovered=true]:not([data-selected=true])) .range-calendar__cell-button{background-color:var(--default)}}.range-calendar__cell[data-outside-month=true]{color:var(--muted);opacity:.5}.range-calendar__cell[data-selected=true][data-outside-month=true]:not([data-selection-start=true],[data-selection-end=true]){background-color:var(--default)}@supports (color:color-mix(in lab,red,red)){.range-calendar__cell[data-selected=true][data-outside-month=true]:not([data-selection-start=true],[data-selection-end=true]){background-color:color-mix(in oklab,var(--default) 20%,transparent)}}.range-calendar__cell[data-unavailable=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.range-calendar__cell:disabled:not([data-outside-month=true]),.range-calendar__cell[data-disabled=true]:not([data-outside-month=true]){opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none;text-decoration:line-through}.range-calendar__grid-body td:has(>.range-calendar__cell[data-outside-month=true])+td>.range-calendar__cell[data-selected=true]{border-start-start-radius:calc(var(--radius) * 1);border-end-start-radius:calc(var(--radius) * 1)}.range-calendar__grid-body td:has(>.range-calendar__cell[data-outside-month=true])+td>.range-calendar__cell[data-selected=true][data-outside-month=true],.range-calendar__grid-body td:has(>.range-calendar__cell[data-outside-month=true])+td>.range-calendar__cell[data-selected=true][data-selection-start=true]{border-start-start-radius:calc(var(--radius) * 3);border-end-start-radius:calc(var(--radius) * 3)}.range-calendar__grid-body td:has(>.range-calendar__cell[data-selected=true]):has(+td>.range-calendar__cell[data-outside-month=true])>.range-calendar__cell[data-selected=true]{border-start-end-radius:calc(var(--radius) * 1);border-end-end-radius:calc(var(--radius) * 1)}.range-calendar__grid-body td:has(>.range-calendar__cell[data-selected=true]):has(+td>.range-calendar__cell[data-outside-month=true])>.range-calendar__cell[data-selected=true][data-outside-month=true],.range-calendar__grid-body td:has(>.range-calendar__cell[data-selected=true]):has(+td>.range-calendar__cell[data-outside-month=true])>.range-calendar__cell[data-selected=true][data-selection-end=true]{border-start-end-radius:calc(var(--radius) * 3);border-end-end-radius:calc(var(--radius) * 3)}.range-calendar__cell-indicator{bottom:var(--spacing);--tw-translate-x: -50% ;width:3px;height:3px;translate:var(--tw-translate-x) var(--tw-translate-y);border-radius:calc(var(--radius) * .25);background-color:var(--muted);position:absolute;left:50%}[data-selected=true]>.range-calendar__cell-indicator{background-color:var(--accent-foreground)}.calendar:has(.calendar-year-picker__year-grid),.range-calendar:has(.calendar-year-picker__year-grid){position:relative}.calendar:has(.calendar-year-picker__year-grid)>[data-slot=calendar-grid],.range-calendar:has(.calendar-year-picker__year-grid)>[data-slot=range-calendar-grid]{will-change:opacity;transition:opacity .15s var(--ease-out),visibility 0s linear}:is(.calendar:has(.calendar-year-picker__year-grid)>[data-slot=calendar-grid],.range-calendar:has(.calendar-year-picker__year-grid)>[data-slot=range-calendar-grid]):is([data-reduce-motion=true],[data-reduce-motion=true] *),:is(.calendar:has(.calendar-year-picker__year-grid)>[data-slot=calendar-grid],.range-calendar:has(.calendar-year-picker__year-grid)>[data-slot=range-calendar-grid]):is([data-reduce-motion=true],[data-reduce-motion=true] *):before,:is(.calendar:has(.calendar-year-picker__year-grid)>[data-slot=calendar-grid],.range-calendar:has(.calendar-year-picker__year-grid)>[data-slot=range-calendar-grid]):is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){:is(.calendar:has(.calendar-year-picker__year-grid)>[data-slot=calendar-grid],.range-calendar:has(.calendar-year-picker__year-grid)>[data-slot=range-calendar-grid]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),:is(.calendar:has(.calendar-year-picker__year-grid)>[data-slot=calendar-grid],.range-calendar:has(.calendar-year-picker__year-grid)>[data-slot=range-calendar-grid]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,:is(.calendar:has(.calendar-year-picker__year-grid)>[data-slot=calendar-grid],.range-calendar:has(.calendar-year-picker__year-grid)>[data-slot=range-calendar-grid]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.calendar:has(.calendar-year-picker__year-grid[data-open=true])>[data-slot=calendar-grid],.range-calendar:has(.calendar-year-picker__year-grid[data-open=true])>[data-slot=range-calendar-grid]{pointer-events:none;opacity:0;visibility:hidden;transition:opacity .15s var(--ease-out),visibility 0s linear .15s}:is(.calendar:has(.calendar-year-picker__year-grid[data-open=true])>[data-slot=calendar-grid],.range-calendar:has(.calendar-year-picker__year-grid[data-open=true])>[data-slot=range-calendar-grid]):is([data-reduce-motion=true],[data-reduce-motion=true] *),:is(.calendar:has(.calendar-year-picker__year-grid[data-open=true])>[data-slot=calendar-grid],.range-calendar:has(.calendar-year-picker__year-grid[data-open=true])>[data-slot=range-calendar-grid]):is([data-reduce-motion=true],[data-reduce-motion=true] *):before,:is(.calendar:has(.calendar-year-picker__year-grid[data-open=true])>[data-slot=calendar-grid],.range-calendar:has(.calendar-year-picker__year-grid[data-open=true])>[data-slot=range-calendar-grid]):is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){:is(.calendar:has(.calendar-year-picker__year-grid[data-open=true])>[data-slot=calendar-grid],.range-calendar:has(.calendar-year-picker__year-grid[data-open=true])>[data-slot=range-calendar-grid]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),:is(.calendar:has(.calendar-year-picker__year-grid[data-open=true])>[data-slot=calendar-grid],.range-calendar:has(.calendar-year-picker__year-grid[data-open=true])>[data-slot=range-calendar-grid]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,:is(.calendar:has(.calendar-year-picker__year-grid[data-open=true])>[data-slot=calendar-grid],.range-calendar:has(.calendar-year-picker__year-grid[data-open=true])>[data-slot=range-calendar-grid]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.calendar-year-picker__trigger{justify-content:flex-start;align-items:center;gap:var(--spacing);border-radius:calc(var(--radius) * 1);--tw-outline-style:none;cursor:var(--cursor-interactive);touch-action:manipulation;outline-style:none;flex:1;display:flex}.calendar-year-picker__trigger: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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.calendar-year-picker__trigger-heading{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);transition:color .15s var(--ease-out)}.calendar-year-picker__trigger-heading:is([data-reduce-motion=true],[data-reduce-motion=true] *),.calendar-year-picker__trigger-heading:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.calendar-year-picker__trigger-heading:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.calendar-year-picker__trigger-heading:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.calendar-year-picker__trigger-heading:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.calendar-year-picker__trigger-heading:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.calendar-year-picker__trigger-indicator{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--accent-soft-foreground);transition:transform .15s var(--ease-out)}.calendar-year-picker__trigger-indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *),.calendar-year-picker__trigger-indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.calendar-year-picker__trigger-indicator:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.calendar-year-picker__trigger-indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.calendar-year-picker__trigger-indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.calendar-year-picker__trigger-indicator:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.calendar-year-picker__trigger[data-open=true] .calendar-year-picker__trigger-indicator{transform:rotate(90deg)}.calendar-year-picker__trigger[data-open=true] .calendar-year-picker__trigger-heading{color:var(--accent-soft-foreground)}.calendar-year-picker__year-grid{pointer-events:none;scrollbar-width:var(--scrollbar-width);scrollbar-color:var(--scrollbar-color);scrollbar-gutter:var(--scrollbar-gutter);align-content:flex-start;gap:var(--spacing);padding:var(--spacing);opacity:0;will-change:opacity;grid-template-columns:repeat(3,1fr);display:grid;position:absolute;left:0;right:0;overflow-y:auto}.calendar-year-picker__year-grid[data-open=true]{pointer-events:auto;opacity:1;transition:opacity .2s var(--ease-out) 50ms}.calendar-year-picker__year-grid[data-open=true]:is([data-reduce-motion=true],[data-reduce-motion=true] *),.calendar-year-picker__year-grid[data-open=true]:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.calendar-year-picker__year-grid[data-open=true]:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.calendar-year-picker__year-grid[data-open=true]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.calendar-year-picker__year-grid[data-open=true]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.calendar-year-picker__year-grid[data-open=true]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.calendar-year-picker__year-cell{height:calc(var(--spacing) * 8);border-radius:calc(var(--radius) * 3);padding-inline:calc(var(--spacing) * 2.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);--tw-outline-style:none;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;touch-action:manipulation;transition:color .1s var(--ease-smooth),scale .1s var(--ease-smooth),opacity .1s var(--ease-smooth),background-color .1s var(--ease-smooth),box-shadow .1s var(--ease-out);transform-origin:50%;transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);outline-style:none;justify-content:center;align-items:center;display:inline-flex;position:relative}.calendar-year-picker__year-cell:is([data-reduce-motion=true],[data-reduce-motion=true] *),.calendar-year-picker__year-cell:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.calendar-year-picker__year-cell:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.calendar-year-picker__year-cell:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.calendar-year-picker__year-cell:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.calendar-year-picker__year-cell:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.calendar-year-picker__year-cell{cursor:var(--cursor-interactive)}@media(hover:hover)and (pointer:fine){.calendar-year-picker__year-cell:is(:hover,[data-hovered=true]):not([data-selected=true]){background-color:var(--default);color:var(--default-foreground)}}.calendar-year-picker__year-cell[data-selected=true],.calendar-year-picker__year-cell[aria-selected=true]{background-color:var(--accent);color:var(--accent-foreground)}@media(hover:hover)and (pointer:fine){:is(.calendar-year-picker__year-cell[data-selected=true],.calendar-year-picker__year-cell[aria-selected=true]):is(:hover,[data-hovered=true]){background-color:var(--accent-hover)}}.calendar-year-picker__year-cell: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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.date-field{gap:var(--spacing);flex-direction:column;display:flex}:is(.date-field[data-invalid=true],.date-field[aria-invalid=true]) [data-slot=description]{display:none}.date-field [data-slot=label]{width:fit-content}.date-field--full-width{width:100%}.time-field{gap:var(--spacing);flex-direction:column;display:flex}:is(.time-field[data-invalid=true],.time-field[aria-invalid=true]) [data-slot=description]{display:none}.time-field [data-slot=label]{width:fit-content}.time-field--full-width{width:100%}.date-input-group{height:calc(var(--spacing) * 9);border-radius:var(--field-radius,calc(var(--radius) * 1.5));border-style:var(--tw-border-style);background-color:var(--field-background,var(--default));font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--field-foreground,var(--foreground));--tw-shadow:var(--field-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;border-width:1px;border-width:var(--border-width-field);border-color:var(--field-border);transition:background-color .15s var(--ease-smooth),border-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out);outline-style:none;align-items:center;display:inline-flex;overflow:hidden}.date-input-group:is([data-reduce-motion=true],[data-reduce-motion=true] *),.date-input-group:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.date-input-group:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.date-input-group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.date-input-group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.date-input-group:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}@media(hover:hover){.date-input-group:hover:not(:focus-within),.date-input-group[data-hovered=true]:not([data-focus-within=true]){background-color:var(--field-hover);border-color:var(--field-border-hover)}}.date-input-group[data-focus-within=true]:not(:has([data-slot=date-picker-trigger]:focus,[data-slot=date-picker-trigger][data-focused=true],[data-slot=date-range-picker-trigger]:focus,[data-slot=date-range-picker-trigger][data-focused=true])),.date-input-group:focus-within:not(:has([data-slot=date-picker-trigger]:focus,[data-slot=date-picker-trigger][data-focused=true],[data-slot=date-range-picker-trigger]:focus,[data-slot=date-range-picker-trigger][data-focused=true])){--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);--tw-ring-color:var(--focus);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;--tw-ring-offset-width:0px;outline-style:none}.date-input-group[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.date-input-group[data-invalid=true]:focus,.date-input-group[data-invalid=true]:focus-visible,.date-input-group[data-invalid=true][data-focused=true],.date-input-group[data-invalid=true][data-focus-visible=true],.date-input-group[data-invalid=true]:focus-within,.date-input-group[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.date-input-group[data-invalid=true]{background-color:var(--field-focus);border-color:var(--color-field-border-invalid)}.date-input-group[data-disabled=true],.date-input-group[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.date-input-group__input{cursor:text;border-style:var(--tw-border-style);padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;background-color:#0000;border-width:0;border-radius:0;outline-style:none;flex:1;align-items:center;gap:1px;display:flex}@media(min-width:40rem){.date-input-group__input{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.date-input-group:has([data-slot=date-input-group-prefix]) .date-input-group__input{padding-left:calc(var(--spacing) * 2);border-top-left-radius:0;border-bottom-left-radius:0}.date-input-group:has([data-slot=date-input-group-suffix]) .date-input-group__input{padding-right:calc(var(--spacing) * 2);border-top-right-radius:0;border-bottom-right-radius:0}.date-input-group:has(.date-range-picker__range-separator) .date-input-group__input[slot=start]{flex:none;padding-right:0}.date-input-group:has(.date-range-picker__range-separator) .date-input-group__input[slot=end]{padding-left:0}.date-input-group__input:focus,.date-input-group__input:focus-visible{--tw-outline-style:none;outline-style:none}.date-input-group__input-container{scrollbar-color:auto;scrollbar-gutter:auto;-ms-overflow-style:none;scrollbar-width:none;flex:1;align-items:center;width:fit-content;display:flex;overflow:auto clip}.date-input-group__segment{border-radius:calc(var(--radius) * .75);padding-inline:calc(var(--spacing) * .5);text-align:end;text-wrap:nowrap;--tw-outline-style:none;outline-style:none;display:inline-block}.date-input-group__segment[data-type=literal]{color:var(--muted);padding:0}.date-input-group__segment[data-placeholder=true]{color:var(--field-placeholder,var(--muted))}.date-input-group__segment:focus,.date-input-group__segment[data-focused=true]{background-color:var(--accent-soft);color:var(--accent-soft-foreground)}.date-input-group__segment[data-disabled=true]{opacity:.5}.date-input-group__segment[data-invalid=true]{color:var(--danger)}.date-input-group__segment[data-invalid=true]:focus,.date-input-group__segment[data-invalid=true][data-focused=true]{background-color:var(--danger-soft);color:var(--danger-soft-foreground)}.date-input-group__prefix{pointer-events:none;color:var(--field-placeholder,var(--muted));margin-right:0;margin-left:calc(var(--spacing) * 3);flex-shrink:0;align-items:center;display:flex}.date-input-group__suffix{pointer-events:none;color:var(--field-placeholder,var(--muted));margin-right:calc(var(--spacing) * 3);flex-shrink:0;align-items:center;display:flex}.date-input-group--secondary{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:var(--date-input-group-bg);--date-input-group-bg:var(--default);--date-input-group-bg-hover:var(--default-hover);--date-input-group-bg-focus:var(--default)}@media(hover:hover){.date-input-group--secondary:hover:not(:focus-within),.date-input-group--secondary[data-hovered=true]:not([data-focus-within=true]){background-color:var(--date-input-group-bg-hover)}}.date-input-group--secondary:focus-within,.date-input-group--secondary[data-focus-within=true]{background-color:var(--date-input-group-bg-focus)}.date-input-group--secondary[data-invalid=true]{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}.date-input-group--secondary[data-invalid=true]:focus,.date-input-group--secondary[data-invalid=true]:focus-visible,.date-input-group--secondary[data-invalid=true][data-focused=true],.date-input-group--secondary[data-invalid=true][data-focus-visible=true],.date-input-group--secondary[data-invalid=true]:focus-within,.date-input-group--secondary[data-invalid=true][data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.date-input-group--secondary[data-invalid=true]{border-color:var(--color-field-border-invalid);background-color:var(--date-input-group-bg-focus)}.date-input-group--secondary [data-slot=date-input-group-input]{background-color:#0000}.date-input-group--full-width{width:100%}.date-picker{gap:var(--spacing);flex-direction:column;display:inline-flex}.date-picker .date-input-group__suffix,.date-picker .date-input-group__prefix{pointer-events:auto}.date-picker__trigger{border-radius:var(--field-radius,calc(var(--radius) * 1.5));width:100%;padding:var(--spacing);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));-webkit-tap-highlight-color:transparent;cursor:var(--cursor-interactive);transition:box-shadow .15s var(--ease-out);align-items:center;display:inline-flex}.date-picker__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *),.date-picker__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.date-picker__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.date-picker__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.date-picker__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.date-picker__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.date-picker__trigger:focus-visible:not(:focus),.date-picker__trigger[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.date-picker__trigger:disabled,.date-picker__trigger[data-disabled=true],.date-picker__trigger[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.date-picker__trigger-indicator{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);color:var(--field-placeholder,var(--muted));justify-content:center;align-items:center;display:inline-flex}.date-picker__popover{min-width:var(--trigger-width);transform-origin:var(--trigger-anchor-point);scrollbar-color:auto;scrollbar-gutter:auto;-ms-overflow-style:none;scrollbar-width:none;overscroll-behavior:contain;background-color:var(--overlay);padding:calc(var(--spacing) * 3);overflow-y:auto}.date-picker__popover:is([data-reduce-motion=true],[data-reduce-motion=true] *),.date-picker__popover:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.date-picker__popover:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.date-picker__popover:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.date-picker__popover:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.date-picker__popover:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.date-picker__popover{box-shadow:var(--shadow-overlay);border-radius:min(32px,calc(var(--radius) * 2.5))}.date-picker__popover:focus-visible:not(:focus),.date-picker__popover[data-focus-visible=true]{--tw-outline-style:none;outline-style:none}.date-picker__popover[data-entering=true]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.15s;--tw-ease:ease;--tw-enter-opacity:0;--tw-enter-scale:.95;transition-duration:.15s;transition-timing-function:ease}.date-picker__popover[data-entering=true][data-placement^=top]{--tw-enter-translate-y:calc(1*var(--spacing))}.date-picker__popover[data-entering=true][data-placement^=bottom]{--tw-enter-translate-y:calc(1*var(--spacing)*-1)}.date-picker__popover[data-entering=true][data-placement^=left]{--tw-enter-translate-x:calc(1*var(--spacing))}.date-picker__popover[data-entering=true][data-placement^=right]{--tw-enter-translate-x:calc(1*var(--spacing)*-1)}.date-picker__popover[data-exiting=true]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.1s;--tw-ease:ease;--tw-exit-scale:.95;--tw-exit-opacity:0;transition-duration:.1s;transition-timing-function:ease}.date-picker__popover[data-exiting=true],.date-picker__popover[data-entering=true]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));will-change:opacity,transform}.date-range-picker{gap:var(--spacing);flex-direction:column;display:inline-flex}.date-range-picker .date-input-group__suffix,.date-range-picker .date-input-group__prefix{pointer-events:auto}.date-range-picker__trigger{border-radius:var(--field-radius,calc(var(--radius) * 1.5));width:100%;padding:var(--spacing);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));-webkit-tap-highlight-color:transparent;cursor:var(--cursor-interactive);transition:box-shadow .15s var(--ease-out);align-items:center;display:inline-flex}.date-range-picker__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *),.date-range-picker__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.date-range-picker__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.date-range-picker__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.date-range-picker__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.date-range-picker__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.date-range-picker__trigger:focus-visible:not(:focus),.date-range-picker__trigger[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.date-range-picker__trigger:disabled,.date-range-picker__trigger[data-disabled=true],.date-range-picker__trigger[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.date-range-picker__trigger-indicator{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);color:var(--field-placeholder,var(--muted));justify-content:center;align-items:center;display:inline-flex}.date-range-picker__range-separator{padding-inline:var(--spacing);color:var(--field-placeholder,var(--muted));-webkit-user-select:none;user-select:none}.date-range-picker__popover{min-width:var(--trigger-width);transform-origin:var(--trigger-anchor-point);scrollbar-color:auto;scrollbar-gutter:auto;-ms-overflow-style:none;scrollbar-width:none;overscroll-behavior:contain;background-color:var(--overlay);padding:calc(var(--spacing) * 3);overflow-y:auto}.date-range-picker__popover:is([data-reduce-motion=true],[data-reduce-motion=true] *),.date-range-picker__popover:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.date-range-picker__popover:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.date-range-picker__popover:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.date-range-picker__popover:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.date-range-picker__popover:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.date-range-picker__popover{box-shadow:var(--shadow-overlay);border-radius:min(32px,calc(var(--radius) * 2.5))}.date-range-picker__popover:focus-visible:not(:focus),.date-range-picker__popover[data-focus-visible=true]{--tw-outline-style:none;outline-style:none}.date-range-picker__popover[data-entering=true]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.15s;--tw-ease:ease;--tw-enter-opacity:0;--tw-enter-scale:.95;transition-duration:.15s;transition-timing-function:ease}.date-range-picker__popover[data-entering=true][data-placement^=top]{--tw-enter-translate-y:calc(1*var(--spacing))}.date-range-picker__popover[data-entering=true][data-placement^=bottom]{--tw-enter-translate-y:calc(1*var(--spacing)*-1)}.date-range-picker__popover[data-entering=true][data-placement^=left]{--tw-enter-translate-x:calc(1*var(--spacing))}.date-range-picker__popover[data-entering=true][data-placement^=right]{--tw-enter-translate-x:calc(1*var(--spacing)*-1)}.date-range-picker__popover[data-exiting=true]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.1s;--tw-ease:ease;--tw-exit-scale:.95;--tw-exit-opacity:0;transition-duration:.1s;transition-timing-function:ease}.date-range-picker__popover[data-exiting=true],.date-range-picker__popover[data-entering=true]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));will-change:opacity,transform}.card{gap:calc(var(--spacing) * 3);padding:calc(var(--spacing) * 4);--tw-shadow:var(--surface-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-radius:min(32px,var(--radius-3xl));flex-direction:column;display:flex;position:relative;overflow:visible}.card__header{flex-direction:column;display:flex}.card__title{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--foreground)}.card__description{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5);color:var(--muted)}.card__content{gap:var(--spacing);flex-direction:column;flex:1;display:flex}.card__footer{flex-direction:row;align-items:center;display:flex}.card--transparent{--tw-border-style:none;--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:#0000;border-style:none}.card--default{background-color:var(--surface)}.card--secondary{background-color:var(--surface-secondary)}.card--tertiary{background-color:var(--surface-tertiary)}.header{width:100%;padding-inline:calc(var(--spacing) * 2);padding-top:calc(var(--spacing) * 1.5);padding-bottom:var(--spacing);text-align:left;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--muted)}.separator{border-radius:calc(var(--radius) * .5);border-top-style:var(--tw-border-style);border-top-width:0;border-bottom-style:var(--tw-border-style);background-color:var(--separator);border-bottom-width:0;flex-shrink:0;width:100%;height:1px}.separator--horizontal{width:100%;height:1px}.separator--vertical{height:auto;min-height:calc(var(--spacing) * 2);align-self:stretch;width:1px}.separator--default{background-color:var(--separator)}.separator--secondary{background-color:var(--separator-secondary)}.separator--tertiary{background-color:var(--separator-tertiary)}.separator__container{align-items:center;gap:calc(var(--spacing) * 3);display:flex}.separator__container--horizontal{flex-direction:row;width:100%}.separator__container--vertical{flex-direction:column;justify-content:center;height:100%}.separator__line{flex-grow:1;flex-shrink:0}.separator__content{text-align:center;white-space:nowrap;color:var(--muted);justify-content:center;align-items:center;display:inline-flex}.separator__content--horizontal,.separator__content--vertical{text-align:center}.surface{color:var(--foreground);position:relative}.surface--transparent{background-color:#0000}.surface--default{background-color:var(--surface);color:var(--surface-foreground)}.surface--secondary{background-color:var(--surface-secondary);color:var(--surface-secondary-foreground)}.surface--tertiary{background-color:var(--surface-tertiary);color:var(--surface-tertiary-foreground)}.avatar{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10);border-radius:calc(var(--radius) * 3);background-color:var(--default);flex-shrink:0;justify-content:center;align-items:center;display:flex;position:relative;overflow:hidden}.avatar__fallback{background-color:var(--default);width:100%;height:100%;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);justify-content:center;align-items:center;display:flex}.avatar__image{aspect-ratio:1;width:100%;height:100%;transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.25s;transition-duration:.25s;position:absolute;top:0;right:0;bottom:0;left:0}.avatar__image:is([data-reduce-motion=true],[data-reduce-motion=true] *),.avatar__image:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.avatar__image:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.avatar__image:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.avatar__image:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.avatar__image:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.avatar--sm{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8);border-radius:calc(var(--radius) * 2)}.avatar--lg{width:calc(var(--spacing) * 12);height:calc(var(--spacing) * 12);border-radius:calc(var(--radius) * 3)}.avatar--lg .avatar__fallback{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.avatar__fallback--accent{color:var(--accent-soft-foreground)}.avatar__fallback--default{color:var(--default-soft-foreground)}.avatar__fallback--success{color:var(--success-soft-foreground)}.avatar__fallback--warning{color:var(--warning-soft-foreground)}.avatar__fallback--danger{color:var(--danger-soft-foreground)}.avatar--soft{background-color:#0000}.avatar--soft .avatar__fallback--accent{background-color:var(--accent-soft);color:var(--accent-soft-foreground)}.avatar--soft .avatar__fallback--success{background-color:var(--success-soft);color:var(--success-soft-foreground)}.avatar--soft .avatar__fallback--warning{background-color:var(--warning-soft);color:var(--warning-soft-foreground)}.avatar--soft .avatar__fallback--default{background-color:var(--default-soft);color:var(--default-soft-foreground)}.avatar--soft .avatar__fallback--danger{background-color:var(--danger-soft);color:var(--danger-soft-foreground)}.alert-dialog__trigger{cursor:var(--cursor-interactive);transition:transform .25s var(--ease-out-quart),background-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out);display:inline-block}.alert-dialog__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *),.alert-dialog__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.alert-dialog__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.alert-dialog__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.alert-dialog__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.alert-dialog__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.alert-dialog__trigger:focus-visible:not(:focus),.alert-dialog__trigger[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.alert-dialog__trigger:disabled,.alert-dialog__trigger[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.alert-dialog__trigger:active,.alert-dialog__trigger[data-pressed=true]{transform:scale(.97)}.alert-dialog__backdrop{z-index:50;height:var(--visual-viewport-height);flex-direction:row;justify-content:center;align-items:center;width:100%;display:flex;position:fixed;top:0;right:0;bottom:0;left:0}.alert-dialog__backdrop[data-entering=true]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.15s;--tw-ease:var(--ease-out);transition-duration:.15s;transition-timing-function:var(--ease-out);--tw-enter-opacity:0}.alert-dialog__backdrop[data-exiting=true]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.1s;--tw-ease:var(--ease-out);transition-duration:.1s;transition-timing-function:var(--ease-out);--tw-exit-opacity:0}.alert-dialog__backdrop[data-exiting=true],.alert-dialog__backdrop[data-entering=true]{will-change:opacity}:is(.alert-dialog__backdrop[data-exiting=true],.alert-dialog__backdrop[data-entering=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *),:is(.alert-dialog__backdrop[data-exiting=true],.alert-dialog__backdrop[data-entering=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *):before,:is(.alert-dialog__backdrop[data-exiting=true],.alert-dialog__backdrop[data-entering=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *):after{animation:none}@media(prefers-reduced-motion:reduce){:is(.alert-dialog__backdrop[data-exiting=true],.alert-dialog__backdrop[data-entering=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),:is(.alert-dialog__backdrop[data-exiting=true],.alert-dialog__backdrop[data-entering=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,:is(.alert-dialog__backdrop[data-exiting=true],.alert-dialog__backdrop[data-entering=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{animation:none}}.alert-dialog__backdrop--transparent{background-color:#0000}.alert-dialog__backdrop--opaque{background-color:var(--backdrop)}.alert-dialog__backdrop--blur{background-color:var(--backdrop);--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.alert-dialog__container{height:var(--visual-viewport-height);width:100%;min-width:0;padding:calc(var(--spacing) * 4);flex-direction:column;flex:1;align-items:center;display:flex}@media(min-width:40rem){.alert-dialog__container{width:fit-content;padding:calc(var(--spacing) * 10)}}.alert-dialog__container{pointer-events:none}.alert-dialog__container[data-entering=true]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.25s;--tw-ease:cubic-bezier(.25, .46, .45, .94);--tw-enter-opacity:0;--tw-enter-scale: 105% ;transition-duration:.25s;transition-timing-function:cubic-bezier(.25,.46,.45,.94)}.alert-dialog__container[data-entering=true][data-placement=auto]{--tw-enter-translate-y:calc(1*var(--spacing))}@media(min-width:40rem){.alert-dialog__container[data-entering=true][data-placement=auto]{--tw-enter-translate-y: 0% }}.alert-dialog__container[data-entering=true][data-placement=top]{--tw-enter-translate-y:calc(1*var(--spacing)*-1)}.alert-dialog__container[data-entering=true][data-placement=center]{--tw-enter-translate-y: -0% }.alert-dialog__container[data-entering=true][data-placement=bottom]{--tw-enter-translate-y:calc(1*var(--spacing))}.alert-dialog__container[data-exiting=true]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.1s;--tw-ease:cubic-bezier(.25, .46, .45, .94);--tw-exit-opacity:0;--tw-exit-scale:.95;transition-duration:.1s;transition-timing-function:cubic-bezier(.25,.46,.45,.94)}.alert-dialog__container[data-exiting=true],.alert-dialog__container[data-entering=true]{will-change:opacity,transform}:is(.alert-dialog__container[data-exiting=true],.alert-dialog__container[data-entering=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *),:is(.alert-dialog__container[data-exiting=true],.alert-dialog__container[data-entering=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *):before,:is(.alert-dialog__container[data-exiting=true],.alert-dialog__container[data-entering=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *):after{animation:none}@media(prefers-reduced-motion:reduce){:is(.alert-dialog__container[data-exiting=true],.alert-dialog__container[data-entering=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),:is(.alert-dialog__container[data-exiting=true],.alert-dialog__container[data-entering=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,:is(.alert-dialog__container[data-exiting=true],.alert-dialog__container[data-entering=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{animation:none}}.alert-dialog__dialog{background-color:var(--overlay);--tw-shadow:var(--overlay-shadow);width:100%;min-height:0;max-height:100%;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;border-radius:min(32px,var(--radius-3xl));padding:calc(var(--spacing) * 6);pointer-events:auto;outline-style:none;flex-direction:column;display:flex;position:relative;overflow:clip}.alert-dialog__dialog[data-placement=auto]{margin-top:auto}@media(min-width:40rem){.alert-dialog__dialog[data-placement=auto]{margin-block:auto}}.alert-dialog__dialog[data-placement=center]{margin-block:auto}.alert-dialog__dialog[data-placement=bottom]{margin-top:auto}.alert-dialog__dialog[data-placement=top]{margin-top:0}.alert-dialog__dialog--xs{max-width:var(--container-xs)}.alert-dialog__dialog--sm{max-width:var(--container-sm)}.alert-dialog__dialog--md{max-width:var(--container-md)}.alert-dialog__dialog--lg{max-width:var(--container-lg)}.alert-dialog__dialog--cover{width:100%;height:100%;min-height:100%}.alert-dialog__header{gap:calc(var(--spacing) * 3);flex-direction:column;margin-bottom:0;display:flex}.alert-dialog__header>.modal__icon{margin-bottom:0}.alert-dialog__heading{vertical-align:middle;font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--foreground)}.alert-dialog__icon{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10);border-radius:calc(var(--radius) * 3);-webkit-user-select:none;user-select:none;flex-shrink:0;justify-content:center;align-items:center;display:flex}.alert-dialog__icon [data-slot=alert-dialog-default-icon]{box-sizing:content-box;width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.alert-dialog__icon--default{background-color:var(--default);color:var(--foreground)}.alert-dialog__icon--accent{background-color:var(--accent-soft);color:var(--accent-soft-foreground)}.alert-dialog__icon--success{background-color:var(--success-soft);color:var(--success-soft-foreground)}.alert-dialog__icon--warning{background-color:var(--warning-soft);color:var(--warning-soft-foreground)}.alert-dialog__icon--danger{background-color:var(--danger-soft);color:var(--danger-soft-foreground)}.alert-dialog__body{scrollbar-width:var(--scrollbar-width);scrollbar-color:var(--scrollbar-color);scrollbar-gutter:var(--scrollbar-gutter);min-height:0;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:1.43;color:var(--muted);overscroll-behavior:contain;-webkit-overflow-scrolling:touch;margin:-3px;flex:1;margin-block:0;padding:3px;line-height:1.43;overflow-y:auto}.alert-dialog__footer{justify-content:flex-end;align-items:center;gap:calc(var(--spacing) * 2);flex-direction:row;margin-top:0;display:flex}.alert-dialog__close-trigger{top:calc(var(--spacing) * 4);right:calc(var(--spacing) * 4);position:absolute}.alert-dialog__header+.alert-dialog__body{margin-top:calc(var(--spacing) * 2)}.alert-dialog__header+.alert-dialog__footer,.alert-dialog__body+.alert-dialog__footer{margin-top:calc(var(--spacing) * 5)}.drawer__trigger{cursor:var(--cursor-interactive);transition:transform .25s var(--ease-out-quart),background-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out);display:inline-block}.drawer__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *),.drawer__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.drawer__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.drawer__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.drawer__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.drawer__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.drawer__trigger:focus-visible:not(:focus),.drawer__trigger[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.drawer__trigger:disabled,.drawer__trigger[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.drawer__trigger:active,.drawer__trigger[data-pressed=true]{transform:scale(.97)}.drawer__backdrop{z-index:50;height:var(--visual-viewport-height);opacity:1;width:100%;transition:opacity .25s cubic-bezier(.32,.72,0,1);position:fixed;top:0;right:0;bottom:0;left:0}.drawer__backdrop[data-entering=true]{opacity:0}.drawer__backdrop[data-exiting=true]{opacity:0;transition-duration:.2s;transition-timing-function:cubic-bezier(.32,.72,0,1)}.drawer__backdrop[data-exiting=true],.drawer__backdrop[data-entering=true]{will-change:opacity}@media(prefers-reduced-motion:reduce){.drawer__backdrop{transition:none}}.drawer__backdrop--transparent{background-color:#0000}.drawer__backdrop--opaque{background-color:var(--backdrop)}.drawer__backdrop--blur{background-color:var(--backdrop);--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.drawer__content{pointer-events:none;z-index:50;height:var(--visual-viewport-height);width:100%;min-width:0;display:flex;position:fixed;top:0;right:0;bottom:0;left:0}.drawer__content--bottom{align-items:flex-end}.drawer__content--top{align-items:flex-start}.drawer__content--left{justify-content:flex-start}.drawer__content--right{justify-content:flex-end}.drawer__dialog{background-color:var(--overlay);--tw-shadow:var(--overlay-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;padding:calc(var(--spacing) * 6);pointer-events:auto;--drawer-enter-duration:.25s;--drawer-exit-duration:.2s;--drawer-enter-ease:cubic-bezier(.32, .72, 0, 1);--drawer-exit-ease:cubic-bezier(.32, .72, 0, 1);will-change:translate;transition:translate var(--drawer-enter-duration) var(--drawer-enter-ease);outline-style:none;flex-direction:column;display:flex;position:relative}@media(prefers-reduced-motion:reduce){.drawer__dialog{transition:none}}.drawer__dialog[data-placement=bottom]{border-top-left-radius:min(32px,var(--radius-2xl));border-top-right-radius:min(32px,var(--radius-2xl));width:100%;max-height:85vh}.drawer__dialog[data-placement=top]{border-bottom-left-radius:min(32px,var(--radius-2xl));border-bottom-right-radius:min(32px,var(--radius-2xl));width:100%;max-height:85vh}.drawer__dialog[data-placement=left]{height:100%;width:calc(var(--spacing) * 80);border-radius:0;max-width:85vw}@media(min-width:40rem){.drawer__dialog[data-placement=left]{width:calc(var(--spacing) * 96)}}.drawer__dialog[data-placement=right]{height:100%;width:calc(var(--spacing) * 80);border-radius:0;max-width:85vw}@media(min-width:40rem){.drawer__dialog[data-placement=right]{width:calc(var(--spacing) * 96)}}[data-exiting=true] .drawer__dialog{transition-duration:var(--drawer-exit-duration);transition-timing-function:var(--drawer-exit-ease)}.drawer__content--left .drawer__dialog,.drawer__content--right .drawer__dialog,.drawer__content--top .drawer__dialog,.drawer__content--bottom .drawer__dialog{translate:0}.drawer__content--left[data-entering=true] .drawer__dialog,.drawer__content--left[data-exiting=true] .drawer__dialog{translate:-100%}.drawer__content--right[data-entering=true] .drawer__dialog,.drawer__content--right[data-exiting=true] .drawer__dialog{translate:100%}.drawer__content--top[data-entering=true] .drawer__dialog,.drawer__content--top[data-exiting=true] .drawer__dialog{translate:0 -100%}.drawer__content--bottom[data-entering=true] .drawer__dialog,.drawer__content--bottom[data-exiting=true] .drawer__dialog{translate:0 100%}.drawer__dialog--top{padding-bottom:calc(var(--spacing) * 2)}.drawer__dialog--top .drawer__handle{padding-bottom:0}.drawer__header{gap:calc(var(--spacing) * 3);flex-direction:column;margin-bottom:0;display:flex}.drawer__heading{vertical-align:middle;font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--foreground)}.drawer__body{scrollbar-width:var(--scrollbar-width);scrollbar-color:var(--scrollbar-color);scrollbar-gutter:var(--scrollbar-gutter);min-height:0;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:1.43;color:var(--muted);overscroll-behavior:contain;-webkit-overflow-scrolling:touch;margin:-3px;flex:1;margin-block:0;padding:3px;line-height:1.43;overflow-y:auto}.drawer__footer{justify-content:flex-end;align-items:center;gap:calc(var(--spacing) * 2);flex-direction:row;margin-top:0;display:flex}.drawer__handle{padding-bottom:calc(var(--spacing) * 2);justify-content:center;align-items:center;display:flex}.drawer__handle>[data-slot=drawer-handle-bar]{height:var(--spacing);width:calc(var(--spacing) * 9);border-radius:calc(var(--radius) * .25);background-color:var(--separator)}.drawer__close-trigger{top:calc(var(--spacing) * 4);right:calc(var(--spacing) * 4);position:absolute}.drawer__header+.drawer__body{margin-top:calc(var(--spacing) * 2)}.drawer__header+.drawer__footer,.drawer__body+.drawer__footer{margin-top:calc(var(--spacing) * 5)}.drawer__handle+.drawer__header,.drawer__handle+.drawer__body{margin-top:0}.modal__trigger{cursor:var(--cursor-interactive);transition:transform .25s var(--ease-out-quart),background-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out);display:inline-block}.modal__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *),.modal__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.modal__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.modal__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.modal__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.modal__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.modal__trigger:focus-visible:not(:focus),.modal__trigger[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.modal__trigger:disabled,.modal__trigger[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.modal__trigger:active,.modal__trigger[data-pressed=true]{transform:scale(.97)}.modal__backdrop{z-index:50;height:var(--visual-viewport-height);flex-direction:row;justify-content:center;align-items:center;width:100%;display:flex;position:fixed;top:0;right:0;bottom:0;left:0}.modal__backdrop[data-entering=true]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.15s;--tw-ease:var(--ease-out);transition-duration:.15s;transition-timing-function:var(--ease-out);--tw-enter-opacity:0}.modal__backdrop[data-exiting=true]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.1s;--tw-ease:var(--ease-out);transition-duration:.1s;transition-timing-function:var(--ease-out);--tw-exit-opacity:0}.modal__backdrop[data-exiting=true],.modal__backdrop[data-entering=true]{will-change:opacity}:is(.modal__backdrop[data-exiting=true],.modal__backdrop[data-entering=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *),:is(.modal__backdrop[data-exiting=true],.modal__backdrop[data-entering=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *):before,:is(.modal__backdrop[data-exiting=true],.modal__backdrop[data-entering=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *):after{animation:none}@media(prefers-reduced-motion:reduce){:is(.modal__backdrop[data-exiting=true],.modal__backdrop[data-entering=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),:is(.modal__backdrop[data-exiting=true],.modal__backdrop[data-entering=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,:is(.modal__backdrop[data-exiting=true],.modal__backdrop[data-entering=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{animation:none}}.modal__backdrop--transparent{background-color:#0000}.modal__backdrop--opaque{background-color:var(--backdrop)}.modal__backdrop--blur{background-color:var(--backdrop);--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.modal__container{height:var(--visual-viewport-height);width:100%;min-width:0;padding:calc(var(--spacing) * 4);flex-direction:column;flex:1;align-items:center;display:flex}@media(min-width:40rem){.modal__container{width:fit-content;padding:calc(var(--spacing) * 10)}}.modal__container{pointer-events:none}.modal__container[data-entering=true]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.25s;--tw-ease:cubic-bezier(.25, .46, .45, .94);--tw-enter-opacity:0;--tw-enter-scale: 105% ;transition-duration:.25s;transition-timing-function:cubic-bezier(.25,.46,.45,.94)}.modal__container[data-entering=true][data-placement=auto]{--tw-enter-translate-y:calc(1*var(--spacing))}@media(min-width:40rem){.modal__container[data-entering=true][data-placement=auto]{--tw-enter-translate-y: 0% }}.modal__container[data-entering=true][data-placement=top]{--tw-enter-translate-y:calc(1*var(--spacing)*-1)}.modal__container[data-entering=true][data-placement=center]{--tw-enter-translate-y: -0% }.modal__container[data-entering=true][data-placement=bottom]{--tw-enter-translate-y:calc(1*var(--spacing))}.modal__container[data-exiting=true]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.1s;--tw-ease:cubic-bezier(.25, .46, .45, .94);--tw-exit-opacity:0;--tw-exit-scale:.95;transition-duration:.1s;transition-timing-function:cubic-bezier(.25,.46,.45,.94)}.modal__container[data-exiting=true],.modal__container[data-entering=true]{will-change:opacity,transform}:is(.modal__container[data-exiting=true],.modal__container[data-entering=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *),:is(.modal__container[data-exiting=true],.modal__container[data-entering=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *):before,:is(.modal__container[data-exiting=true],.modal__container[data-entering=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *):after{animation:none}@media(prefers-reduced-motion:reduce){:is(.modal__container[data-exiting=true],.modal__container[data-entering=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),:is(.modal__container[data-exiting=true],.modal__container[data-entering=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,:is(.modal__container[data-exiting=true],.modal__container[data-entering=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{animation:none}}.modal__container--scroll-outside{scrollbar-width:var(--scrollbar-width);scrollbar-color:var(--scrollbar-color);scrollbar-gutter:var(--scrollbar-gutter);pointer-events:auto;-webkit-overflow-scrolling:touch;overflow-y:auto}.modal__container--full{padding:0}@media(min-width:40rem){.modal__container--full{padding:0}}.modal__container--full[data-entering=true]{--tw-enter-translate-y: 0% ;--tw-enter-scale:1}@media(min-width:40rem){.modal__container--full[data-entering=true]{--tw-enter-translate-y: 0% }}.modal__container--full[data-exiting=true]{--tw-exit-scale:1}.modal__dialog{background-color:var(--overlay);--tw-shadow:var(--overlay-shadow);width:100%;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;border-radius:min(32px,var(--radius-3xl));padding:calc(var(--spacing) * 6);pointer-events:auto;outline-style:none;flex-direction:column;display:flex;position:relative}.modal__dialog[data-placement=auto]{margin-top:auto}@media(min-width:40rem){.modal__dialog[data-placement=auto]{margin-block:auto}}.modal__dialog[data-placement=center]{margin-block:auto}.modal__dialog[data-placement=bottom]{margin-top:auto}.modal__dialog[data-placement=top]{margin-top:0}.modal__dialog--scroll-inside{min-height:0;max-height:100%;overflow:clip}.modal__dialog--scroll-outside{flex-shrink:0;height:auto;min-height:0}.modal__dialog--xs{max-width:var(--container-xs)}.modal__dialog--sm{max-width:var(--container-sm)}.modal__dialog--md{max-width:var(--container-md)}.modal__dialog--lg{max-width:var(--container-lg)}.modal__dialog--cover{width:100%;height:100%;min-height:100%}.modal__dialog--full{--tw-shadow:0 0 #0000;width:100%;height:100%;min-height:100%;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-radius:0}.modal__header{gap:calc(var(--spacing) * 3);flex-direction:column;margin-bottom:0;display:flex}.modal__header>.modal__icon{margin-bottom:0}.modal__heading{vertical-align:middle;font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--foreground)}.modal__icon{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10);border-radius:calc(var(--radius) * 3);-webkit-user-select:none;user-select:none;flex-shrink:0;justify-content:center;align-items:center;display:flex}.modal__body{min-height:0;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:1.43;color:var(--muted);margin:-3px;flex:1;margin-block:0;padding:3px;line-height:1.43;overflow:visible}.modal__body--scroll-inside{scrollbar-width:var(--scrollbar-width);scrollbar-color:var(--scrollbar-color);scrollbar-gutter:var(--scrollbar-gutter);overscroll-behavior:contain;-webkit-overflow-scrolling:touch;overflow-y:auto}.modal__body--scroll-outside{overflow-y:visible}.modal__footer{justify-content:flex-end;align-items:center;gap:calc(var(--spacing) * 2);flex-direction:row;margin-top:0;display:flex}.modal__close-trigger{top:calc(var(--spacing) * 4);right:calc(var(--spacing) * 4);position:absolute}.modal__header+.modal__body{margin-top:calc(var(--spacing) * 2)}.modal__header+.modal__footer,.modal__body+.modal__footer{margin-top:calc(var(--spacing) * 5)}.popover{transform-origin:var(--trigger-anchor-point);background-color:var(--overlay);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));border-radius:min(32px,var(--radius-3xl));box-shadow:var(--shadow-overlay);padding:0}.popover[data-entering=true]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.15s;--tw-ease:ease;--tw-enter-opacity:0;--tw-enter-scale:.9;transition-duration:.15s;transition-timing-function:ease}.popover[data-entering=true][data-placement=top]{--tw-enter-translate-y:calc(1*var(--spacing))}.popover[data-entering=true][data-placement=bottom]{--tw-enter-translate-y:calc(1*var(--spacing)*-1)}.popover[data-entering=true][data-placement=left]{--tw-enter-translate-x:calc(1*var(--spacing))}.popover[data-entering=true][data-placement=right]{--tw-enter-translate-x:calc(1*var(--spacing)*-1)}.popover[data-exiting=true]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.1s;--tw-ease:ease;--tw-exit-scale:.95;--tw-exit-opacity:0;transition-duration:.1s;transition-timing-function:ease}.popover[data-exiting=true],.popover[data-entering=true]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));will-change:opacity,transform}.popover [data-slot=popover-overlay-arrow]{fill:var(--overlay)}.popover[data-placement=bottom] [data-slot=popover-overlay-arrow]{rotate:180deg}.popover[data-placement=left] [data-slot=popover-overlay-arrow]{rotate:-90deg}.popover[data-placement=right] [data-slot=popover-overlay-arrow]{rotate:90deg}.popover__dialog{padding:calc(var(--spacing) * 4);--tw-outline-style:none;outline-style:none}.popover__heading{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.popover__trigger{transition:color .15s var(--ease-smooth),background-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out);display:inline-block}.popover__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *),.popover__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.popover__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.popover__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.popover__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.popover__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.popover__trigger{cursor:var(--cursor-interactive)}.popover__trigger:focus-visible:not(:focus),.popover__trigger[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.popover__trigger:disabled,.popover__trigger[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.tooltip{max-width:var(--container-xs);transform-origin:var(--trigger-anchor-point);background-color:var(--overlay);padding:calc(var(--spacing) * 2);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));word-break:break-all;border-radius:min(32px,var(--radius-xl));box-shadow:var(--shadow-overlay)}.tooltip[data-entering=true]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.15s;--tw-ease:ease;--tw-enter-opacity:0;--tw-enter-scale:.9;transition-duration:.15s;transition-timing-function:ease}.tooltip[data-entering=true][data-placement=top]{--tw-enter-translate-y:calc(1*var(--spacing))}.tooltip[data-entering=true][data-placement=bottom]{--tw-enter-translate-y:calc(1*var(--spacing)*-1)}.tooltip[data-entering=true][data-placement=left]{--tw-enter-translate-x:calc(1*var(--spacing))}.tooltip[data-entering=true][data-placement=right]{--tw-enter-translate-x:calc(1*var(--spacing)*-1)}.tooltip[data-exiting=true]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.1s;--tw-ease:ease;--tw-exit-scale:.95;--tw-exit-opacity:0;transition-duration:.1s;transition-timing-function:ease}.tooltip[data-exiting=true],.tooltip[data-entering=true]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));will-change:opacity,transform}.tooltip [data-slot=overlay-arrow]{stroke:var(--border)}@supports (color:color-mix(in lab,red,red)){.tooltip [data-slot=overlay-arrow]{stroke:color-mix(in oklab,var(--border) 40%,transparent)}}.tooltip [data-slot=overlay-arrow]{fill:var(--overlay)}.tooltip[data-placement=bottom] [data-slot=overlay-arrow]{rotate:180deg}.tooltip[data-placement=left] [data-slot=overlay-arrow]{rotate:-90deg}.tooltip[data-placement=right] [data-slot=overlay-arrow]{rotate:90deg}.tooltip__trigger{transition:color .15s var(--ease-smooth),background-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out);display:inline-block}.tooltip__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *),.tooltip__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.tooltip__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.tooltip__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.tooltip__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.tooltip__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.tooltip__trigger:focus-visible:not(:focus),.tooltip__trigger[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;outline-style:none}.combo-box{gap:var(--spacing);flex-direction:column;display:flex}:is(.combo-box[data-invalid=true],.combo-box[aria-invalid=true]) [data-slot=description]{display:none}.combo-box [data-slot=label]{width:fit-content}.combo-box [data-slot=input]{flex:1;min-width:0}.combo-box [data-slot=input]:has(+.combo-box__trigger){padding-inline-end:calc(var(--spacing) * 7)}.combo-box [data-slot=input]:focus,.combo-box [data-slot=input][data-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);--tw-ring-color:var(--focus);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-outline-style:none;--tw-ring-offset-width:0px;border-color:var(--field-border-focus);background-color:var(--field-focus);outline-style:none}.combo-box [data-slot=input]:disabled,.combo-box [data-slot=input][data-disabled],.combo-box [data-slot=input][aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.combo-box__input-group{isolation:isolate;align-items:center;display:inline-flex;position:relative}.combo-box__trigger{--tw-translate-y: -50% ;height:100%;translate:var(--tw-translate-x) var(--tw-translate-y);cursor:pointer;color:var(--field-placeholder,var(--muted));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.15s;-webkit-tap-highlight-color:transparent;--tw-border-style:none;--tw-outline-style:none;inset-inline-end:calc(var(--spacing) * 0);background-color:#0000;border-style:none;outline-style:none;flex-shrink:0;justify-content:center;align-items:center;padding-inline-end:calc(var(--spacing) * 2);transition-duration:.15s;display:flex;position:absolute;top:50%}@media(hover:hover){.combo-box__trigger:hover,.combo-box__trigger[data-hovered=true]{color:var(--field-foreground,var(--foreground))}}.combo-box__trigger:focus-visible:not(:focus),.combo-box__trigger[data-focus-visible=true]{--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);--tw-ring-color:var(--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);--tw-ring-offset-color:var(--background);--tw-outline-style:none;border-radius:.25rem;outline-style:none}.combo-box__trigger[data-pressed=true]{opacity:.7}.combo-box__trigger:disabled,.combo-box__trigger[data-disabled],.combo-box__trigger[aria-disabled=true]{cursor:not-allowed;opacity:.5}.combo-box__trigger [data-slot=combo-box-trigger-default-icon]{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4);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));--tw-duration:.15s;transition-duration:.15s}.combo-box__trigger [data-slot=combo-box-trigger-default-icon]:is([data-reduce-motion=true],[data-reduce-motion=true] *),.combo-box__trigger [data-slot=combo-box-trigger-default-icon]:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.combo-box__trigger [data-slot=combo-box-trigger-default-icon]:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.combo-box__trigger [data-slot=combo-box-trigger-default-icon]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.combo-box__trigger [data-slot=combo-box-trigger-default-icon]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.combo-box__trigger [data-slot=combo-box-trigger-default-icon]:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.combo-box__trigger[data-open=true] [data-slot=combo-box-trigger-default-icon]{rotate:180deg}.combo-box__popover{min-width:var(--trigger-width);transform-origin:var(--trigger-anchor-point);scroll-padding-block:var(--spacing);scrollbar-width:var(--scrollbar-width);scrollbar-color:var(--scrollbar-color);scrollbar-gutter:var(--scrollbar-gutter);overscroll-behavior:contain;background-color:var(--overlay);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));border-radius:min(32px,var(--radius-3xl));box-shadow:var(--shadow-overlay);padding:0;overflow-y:auto}.combo-box__popover:focus-visible:not(:focus),.combo-box__popover[data-focus-visible=true]{--tw-outline-style:none;outline-style:none}.combo-box__popover[data-entering=true]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.15s;--tw-ease:ease;--tw-enter-opacity:0;--tw-enter-scale:.95;transition-duration:.15s;transition-timing-function:ease}.combo-box__popover[data-entering=true][data-placement=top]{--tw-enter-translate-y:calc(1*var(--spacing))}.combo-box__popover[data-entering=true][data-placement=bottom]{--tw-enter-translate-y:calc(1*var(--spacing)*-1)}.combo-box__popover[data-entering=true][data-placement=left]{--tw-enter-translate-x:calc(1*var(--spacing))}.combo-box__popover[data-entering=true][data-placement=right]{--tw-enter-translate-x:calc(1*var(--spacing)*-1)}.combo-box__popover[data-exiting=true]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.1s;--tw-ease:ease;--tw-exit-scale:.95;--tw-exit-opacity:0;transition-duration:.1s;transition-timing-function:ease}.combo-box__popover[data-exiting=true],.combo-box__popover[data-entering=true]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));will-change:opacity,transform}.combo-box__popover [data-slot=popover-overlay-arrow]{fill:var(--overlay)}.combo-box__popover[data-placement=bottom] [data-slot=popover-overlay-arrow]{rotate:180deg}.combo-box__popover[data-placement=left] [data-slot=popover-overlay-arrow]{rotate:-90deg}.combo-box__popover[data-placement=right] [data-slot=popover-overlay-arrow]{rotate:90deg}.combo-box__popover [data-slot=list-box]{padding:calc(var(--spacing) * 1.5);--tw-outline-style:none;outline-style:none}.combo-box__popover [data-slot=list-box-item]{padding-inline:calc(var(--spacing) * 2.5)}.combo-box__popover [data-slot=list-box-item] [data-slot=list-box-item-indicator--checkmark]{transition-property:none}.combo-box--full-width,.combo-box__input-group--full-width{width:100%}.select{gap:var(--spacing);flex-direction:column;display:flex}:is(.select[data-invalid=true],.select[aria-invalid=true]) [data-slot=description]{display:none}.select [data-slot=label]{width:fit-content}.select__trigger{isolation:isolate;min-height:calc(var(--spacing) * 9);border-radius:var(--field-radius,calc(var(--radius) * 1.5));border-style:var(--tw-border-style);background-color:var(--field-background,var(--default));padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--field-foreground,var(--foreground));--tw-shadow:var(--field-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;transition:background-color .15s var(--ease-smooth),border-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out);border-width:1px;outline-style:none;display:inline-flex;position:relative}.select__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *),.select__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.select__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.select__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.select__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.select__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.select__trigger{cursor:var(--cursor-interactive);border-width:var(--border-width-field);border-color:var(--field-border)}.select__trigger:has(.select__indicator){padding-inline-end:calc(var(--spacing) * 7)}@media(hover:hover){.select__trigger:hover,.select__trigger[data-hovered=true]{background-color:var(--field-hover);border-color:var(--field-border-hover)}}.select__trigger:focus-visible:not(:focus),.select__trigger[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;border-color:var(--field-border-focus);background-color:var(--field-focus);outline-style:none}.select[data-invalid=true] .select__trigger,.select[aria-invalid=true] .select__trigger{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}:is(.select[data-invalid=true] .select__trigger,.select[aria-invalid=true] .select__trigger):focus,:is(.select[data-invalid=true] .select__trigger,.select[aria-invalid=true] .select__trigger):focus-visible,:is(.select[data-invalid=true] .select__trigger,.select[aria-invalid=true] .select__trigger)[data-focused=true],:is(.select[data-invalid=true] .select__trigger,.select[aria-invalid=true] .select__trigger)[data-focus-visible=true],:is(.select[data-invalid=true] .select__trigger,.select[aria-invalid=true] .select__trigger):focus-within,:is(.select[data-invalid=true] .select__trigger,.select[aria-invalid=true] .select__trigger)[data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.select[data-invalid=true] .select__trigger,.select[aria-invalid=true] .select__trigger{background-color:var(--field-focus)}.select__trigger:disabled,.select__trigger[data-disabled=true],.select__trigger[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.select--secondary .select__trigger{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:var(--select-trigger-bg);--select-trigger-bg:var(--default);--select-trigger-bg-hover:var(--default-hover);--select-trigger-bg-focus:var(--default)}@media(hover:hover){.select--secondary .select__trigger:hover,.select--secondary .select__trigger[data-hovered=true]{background-color:var(--select-trigger-bg-hover)}}.select--secondary .select__trigger:focus-visible:not(:focus),.select--secondary .select__trigger[data-focus-visible=true],.select[data-invalid=true] :is(.select--secondary .select__trigger),.select[aria-invalid=true] :is(.select--secondary .select__trigger){background-color:var(--select-trigger-bg-focus)}.select__value{text-align:start;font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));overflow-wrap:break-word;color:currentColor;flex:1}@media(min-width:40rem){.select__value{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.select__value[data-placeholder=true]{color:var(--field-placeholder,var(--muted))}.select__value [data-slot=list-box-item-indicator]{display:none}.select__indicator{color:var(--field-placeholder,var(--muted));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.15s;flex-shrink:0;justify-content:center;align-items:center;margin-block:auto;transition-duration:.15s;display:flex;position:absolute;inset-block:0;inset-inline-end:calc(var(--spacing) * 2)}.select__indicator[data-open=true]{rotate:180deg}.select__indicator[data-slot=select-default-indicator]{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.select__popover{min-width:var(--trigger-width);transform-origin:var(--trigger-anchor-point);scroll-padding-block:var(--spacing);scrollbar-width:var(--scrollbar-width);scrollbar-color:var(--scrollbar-color);scrollbar-gutter:var(--scrollbar-gutter);overscroll-behavior:contain;background-color:var(--overlay);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));border-radius:min(32px,var(--radius-3xl));box-shadow:var(--shadow-overlay);padding:0;overflow-y:auto}.select__popover:focus-visible:not(:focus),.select__popover[data-focus-visible=true]{--tw-outline-style:none;outline-style:none}.select__popover[data-entering=true]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.15s;--tw-ease:ease;--tw-enter-opacity:0;--tw-enter-scale:.95;transition-duration:.15s;transition-timing-function:ease}.select__popover[data-entering=true][data-placement=top]{--tw-enter-translate-y:calc(1*var(--spacing))}.select__popover[data-entering=true][data-placement=bottom]{--tw-enter-translate-y:calc(1*var(--spacing)*-1)}.select__popover[data-entering=true][data-placement=left]{--tw-enter-translate-x:calc(1*var(--spacing))}.select__popover[data-entering=true][data-placement=right]{--tw-enter-translate-x:calc(1*var(--spacing)*-1)}.select__popover[data-exiting=true]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.1s;--tw-ease:ease;--tw-exit-scale:.95;--tw-exit-opacity:0;transition-duration:.1s;transition-timing-function:ease}.select__popover[data-exiting=true],.select__popover[data-entering=true]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));will-change:opacity,transform}.select__popover [data-slot=popover-overlay-arrow]{fill:var(--overlay)}.select__popover[data-placement=bottom] [data-slot=popover-overlay-arrow]{rotate:180deg}.select__popover[data-placement=left] [data-slot=popover-overlay-arrow]{rotate:-90deg}.select__popover[data-placement=right] [data-slot=popover-overlay-arrow]{rotate:90deg}.select__popover [data-slot=list-box]{padding:calc(var(--spacing) * 1.5);--tw-outline-style:none;outline-style:none}.select__popover [data-slot=list-box-item]{padding-inline:calc(var(--spacing) * 2.5)}.select__popover [data-slot=list-box]:not([aria-multiselectable=true]) [data-slot=list-box-item-indicator],.select__popover [data-slot=list-box]:not([aria-multiselectable=true]) [data-slot=list-box-item-indicator] [data-slot=list-box-item-indicator--checkmark]{transition-property:none}.select--full-width,.select__trigger--full-width{width:100%}.autocomplete{gap:var(--spacing);flex-direction:column;display:flex}.autocomplete__trigger{isolation:isolate;min-height:calc(var(--spacing) * 9);border-radius:var(--field-radius,calc(var(--radius) * 1.5));border-style:var(--tw-border-style);background-color:var(--field-background,var(--default));padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--field-foreground,var(--foreground));--tw-shadow:var(--field-shadow);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-outline-style:none;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;transition:background-color .15s var(--ease-smooth),border-color .15s var(--ease-smooth),box-shadow .15s var(--ease-out);border-width:1px;outline-style:none;display:inline-flex;position:relative}.autocomplete__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *),.autocomplete__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.autocomplete__trigger:is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.autocomplete__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.autocomplete__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.autocomplete__trigger:not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.autocomplete__trigger{cursor:var(--cursor-interactive);border-width:var(--border-width-field);border-color:var(--field-border)}.autocomplete__trigger:has(.autocomplete__indicator){padding-inline-end:calc(var(--spacing) * 7)}@media(hover:hover){.autocomplete__trigger:hover:not(:has(.autocomplete__clear-button:hover)),.autocomplete__trigger[data-hovered=true]:not(:has(.autocomplete__clear-button:hover)){background-color:var(--field-hover);border-color:var(--field-border-hover)}}.autocomplete__trigger:focus-visible:not(:focus),.autocomplete__trigger[data-focus-visible=true]{--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);--tw-ring-color:var(--focus);--tw-ring-offset-width:var(--ring-offset-width);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-color:var(--background);--tw-outline-style:none;border-color:var(--field-border-focus);background-color:var(--field-focus);outline-style:none}.autocomplete[data-invalid=true] .autocomplete__trigger,.autocomplete[aria-invalid=true] .autocomplete__trigger{outline-style:var(--tw-outline-style);outline-width:1px;outline-color:var(--danger);--tw-outline-style:solid;--tw-ring-offset-width:3px;outline-style:solid}:is(.autocomplete[data-invalid=true] .autocomplete__trigger,.autocomplete[aria-invalid=true] .autocomplete__trigger):focus,:is(.autocomplete[data-invalid=true] .autocomplete__trigger,.autocomplete[aria-invalid=true] .autocomplete__trigger):focus-visible,:is(.autocomplete[data-invalid=true] .autocomplete__trigger,.autocomplete[aria-invalid=true] .autocomplete__trigger)[data-focused=true],:is(.autocomplete[data-invalid=true] .autocomplete__trigger,.autocomplete[aria-invalid=true] .autocomplete__trigger)[data-focus-visible=true],:is(.autocomplete[data-invalid=true] .autocomplete__trigger,.autocomplete[aria-invalid=true] .autocomplete__trigger):focus-within,:is(.autocomplete[data-invalid=true] .autocomplete__trigger,.autocomplete[aria-invalid=true] .autocomplete__trigger)[data-focus-within=true]{--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);--tw-ring-color:var(--danger);--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-offset-width:0px}.autocomplete[data-invalid=true] .autocomplete__trigger,.autocomplete[aria-invalid=true] .autocomplete__trigger{background-color:var(--field-focus)}.autocomplete__trigger:disabled,.autocomplete__trigger[data-disabled=true],.autocomplete__trigger[aria-disabled=true]{opacity:var(--disabled-opacity);cursor:var(--cursor-disabled);pointer-events:none}.autocomplete--secondary .autocomplete__trigger{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:var(--autocomplete-trigger-bg);--autocomplete-trigger-bg:var(--default);--autocomplete-trigger-bg-hover:var(--default-hover);--autocomplete-trigger-bg-focus:var(--default)}@media(hover:hover){.autocomplete--secondary .autocomplete__trigger:hover:not(:has(.autocomplete__clear-button:hover)),.autocomplete--secondary .autocomplete__trigger[data-hovered=true]:not(:has(.autocomplete__clear-button:hover)){background-color:var(--autocomplete-trigger-bg-hover)}}.autocomplete--secondary .autocomplete__trigger:focus-visible:not(:focus),.autocomplete--secondary .autocomplete__trigger[data-focus-visible=true],.autocomplete[data-invalid=true] :is(.autocomplete--secondary .autocomplete__trigger),.autocomplete[aria-invalid=true] :is(.autocomplete--secondary .autocomplete__trigger){background-color:var(--autocomplete-trigger-bg-focus)}.autocomplete__value{text-align:start;font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));overflow-wrap:break-word;color:currentColor;flex:1}@media(min-width:40rem){.autocomplete__value{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.autocomplete__value[data-placeholder=true]{color:var(--field-placeholder,var(--muted))}.autocomplete__value [data-slot=list-box-item-indicator]{display:none}.autocomplete__indicator{color:var(--field-placeholder,var(--muted));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.15s;cursor:var(--cursor-interactive);flex-shrink:0;justify-content:center;align-items:center;margin-block:auto;transition-duration:.15s;display:flex;position:absolute;inset-block:0;inset-inline-end:calc(var(--spacing) * 2)}.autocomplete__indicator[data-open=true]{rotate:180deg}.autocomplete__indicator[data-slot=autocomplete-default-indicator]{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.autocomplete__popover{width:var(--trigger-width);max-width:var(--trigger-width);transform-origin:var(--trigger-anchor-point);scroll-padding-block:var(--spacing);overscroll-behavior:contain;background-color:var(--overlay);padding:0;padding-top:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));border-radius:min(32px,var(--radius-3xl));box-shadow:var(--shadow-overlay);overflow:hidden}.autocomplete__popover:focus-visible:not(:focus),.autocomplete__popover[data-focus-visible=true]{--tw-outline-style:none;outline-style:none}.autocomplete__popover[data-entering=true]{animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.25s;--tw-ease:cubic-bezier(.32, .72, 0, 1);--tw-enter-opacity:0;--tw-enter-scale:.95;transition-duration:.25s;transition-timing-function:cubic-bezier(.32,.72,0,1)}.autocomplete__popover[data-entering=true][data-placement=top]{--tw-enter-translate-y:calc(1*var(--spacing))}.autocomplete__popover[data-entering=true][data-placement=bottom]{--tw-enter-translate-y:calc(1*var(--spacing)*-1)}.autocomplete__popover[data-entering=true][data-placement=left]{--tw-enter-translate-x:calc(1*var(--spacing))}.autocomplete__popover[data-entering=true][data-placement=right]{--tw-enter-translate-x:calc(1*var(--spacing)*-1)}.autocomplete__popover[data-exiting=true]{animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none);--tw-duration:.1s;--tw-ease:cubic-bezier(.25, .46, .45, .94);--tw-exit-scale:.95;--tw-exit-opacity:0;transition-duration:.1s;transition-timing-function:cubic-bezier(.25,.46,.45,.94)}.autocomplete__popover[data-exiting=true],.autocomplete__popover[data-entering=true]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));will-change:opacity,transform}.autocomplete__popover [data-slot=popover-overlay-arrow]{fill:var(--overlay)}.autocomplete__popover[data-placement=bottom] [data-slot=popover-overlay-arrow]{rotate:180deg}.autocomplete__popover[data-placement=left] [data-slot=popover-overlay-arrow]{rotate:-90deg}.autocomplete__popover[data-placement=right] [data-slot=popover-overlay-arrow]{rotate:90deg}.autocomplete__popover [data-slot=list-box]{scrollbar-width:var(--scrollbar-width);scrollbar-color:var(--scrollbar-color);scrollbar-gutter:var(--scrollbar-gutter);max-height:320px;padding:calc(var(--spacing) * 1.5);--tw-outline-style:none;outline-style:none;overflow-y:auto}.autocomplete__popover [data-slot=list-box-item]{padding-inline:calc(var(--spacing) * 2.5)}.autocomplete__popover [data-slot=list-box]:not([aria-multiselectable=true]) [data-slot=list-box-item-indicator],.autocomplete__popover [data-slot=list-box]:not([aria-multiselectable=true]) [data-slot=list-box-item-indicator] [data-slot=list-box-item-indicator--checkmark]{transition-property:none}.autocomplete__popover [data-slot=search-field]{padding-inline:calc(var(--spacing) * 3);padding-block:var(--spacing);--tw-outline-style:none;outline-style:none}.autocomplete__popover [data-slot=empty-state]{text-align:center;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--overlay-foreground)}@supports (color:color-mix(in lab,red,red)){.autocomplete__popover [data-slot=empty-state]{color:color-mix(in oklab,var(--overlay-foreground) 60%,transparent)}}.autocomplete__popover-dialog,.autocomplete__popover-dialog:focus,.autocomplete__popover-dialog:focus-visible,.autocomplete__popover-dialog[data-focus-visible=true]{--tw-outline-style:none;outline-style:none}.autocomplete--full-width,.autocomplete__trigger--full-width{width:100%}.autocomplete__clear-button{isolation:isolate;height:calc(var(--spacing) * 6);width:calc(var(--spacing) * 6);transform-origin:50%;border-radius:calc(var(--radius) * 1.5);padding:var(--spacing);color:var(--muted);-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5);cursor:var(--cursor-interactive);transform:translateZ(0) var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);background-color:#0000;flex-shrink:0;justify-content:center;align-self:center;align-items:center;margin-inline-end:0;display:inline-flex;position:relative}.autocomplete__clear-button:not([data-empty=true]){transition:opacity .15s var(--ease-smooth)}.autocomplete__clear-button:not([data-empty=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *),.autocomplete__clear-button:not([data-empty=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *):before,.autocomplete__clear-button:not([data-empty=true]):is([data-reduce-motion=true],[data-reduce-motion=true] *):after{transition-property:none}@media(prefers-reduced-motion:reduce){.autocomplete__clear-button:not([data-empty=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)),.autocomplete__clear-button:not([data-empty=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):before,.autocomplete__clear-button:not([data-empty=true]):not(:is([data-reduce-motion=true],[data-reduce-motion=true] *)):after{transition-property:none}}.autocomplete__clear-button[data-empty=true]{pointer-events:none;opacity:0}.autocomplete__clear-button [data-slot=autocomplete-clear-button-icon]{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}@media(hover:hover){.autocomplete__clear-button:hover,.autocomplete__clear-button[data-hovered=true]{background-color:var(--default-hover)}}.autocomplete__clear-button:active,.autocomplete__clear-button[data-pressed=true]{transform:scale(.93)}.kbd{height:calc(var(--spacing) * 6);align-items:center;display:inline-flex}:where(.kbd>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * .5) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-x-reverse)))}.kbd{border-radius:calc(var(--radius) * 1);background-color:var(--default);padding-inline:calc(var(--spacing) * 2);text-align:center;font-family:var(--font-sans);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);white-space:nowrap;color:var(--muted)}:where(.kbd:where(:dir(rtl),[dir=rtl],[dir=rtl] *)>:not(:last-child)){--tw-space-x-reverse:1}.kbd{word-spacing:-.25rem}.kbd__abbr{justify-content:center;align-items:center;width:100%;height:100%;text-decoration:none;display:flex}.kbd__content{justify-content:center;align-items:center;display:flex}.kbd--light{background-color:#0000}.typography,.typography-prose{color:var(--foreground)}.typography-prose h1{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.typography-prose h2{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.typography-prose h3{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.typography-prose h4{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.typography-prose h5{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.typography-prose h6{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.typography-prose p{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing) * 7);line-height:calc(var(--spacing) * 7)}.typography-prose code{border-radius:calc(var(--radius) * .75);background-color:var(--default);padding-inline:calc(var(--spacing) * 1.5);padding-block:calc(var(--spacing) * .5);font-family:var(--font-mono);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--foreground)}.typography-prose a{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:var(--link);text-underline-offset:4px;text-decoration-line:underline}.typography-prose blockquote{margin-top:calc(var(--spacing) * 4);border-left-style:var(--tw-border-style);border-left-width:4px;border-color:var(--border);padding-left:calc(var(--spacing) * 4);color:var(--muted);font-style:italic}.typography-prose ul{margin-block:calc(var(--spacing) * 4);list-style-type:disc}:where(.typography-prose ul>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}.typography-prose ul{padding-left:calc(var(--spacing) * 6)}.typography-prose ol{margin-block:calc(var(--spacing) * 4);list-style-type:decimal}:where(.typography-prose ol>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}.typography-prose ol{padding-left:calc(var(--spacing) * 6)}.typography-prose li{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing) * 7);line-height:calc(var(--spacing) * 7)}.typography-prose hr{margin-block:calc(var(--spacing) * 8);border-color:var(--separator)}.typography-prose pre{margin-block:calc(var(--spacing) * 4);border-radius:calc(var(--radius) * 1.5);background-color:var(--default);padding:calc(var(--spacing) * 4);font-family:var(--font-mono);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed);overflow-x:auto}.typography-prose strong{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--foreground)}.typography-prose em{font-style:italic}.typography-prose img{margin-block:calc(var(--spacing) * 4);border-radius:calc(var(--radius) * 1.5)}.typography--h1{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.typography--h2{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.typography--h3{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.typography--h4{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.typography--h5{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.typography--h6{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.typography--body{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-leading:calc(var(--spacing) * 7);line-height:calc(var(--spacing) * 7)}.typography--body-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.typography--body-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.typography--code{border-radius:calc(var(--radius) * .75);background-color:var(--default);padding-inline:calc(var(--spacing) * 1.5);padding-block:calc(var(--spacing) * .5);font-family:var(--font-mono);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--foreground)}.typography--align-start{text-align:left}.typography--align-start:where(:dir(rtl),[dir=rtl],[dir=rtl] *){text-align:right}.typography--align-center{text-align:center}.typography--align-end{text-align:right}.typography--align-end:where(:dir(rtl),[dir=rtl],[dir=rtl] *){text-align:left}.typography--align-justify{text-align:justify}.typography--color-default{color:var(--foreground)}.typography--color-muted{color:var(--muted)}.typography--truncate{text-overflow:ellipsis;white-space:nowrap;display:block;overflow:hidden}.typography--weight-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.typography--weight-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.typography--weight-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.typography--weight-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.scroll-shadow{--scroll-shadow-size:40px;--scroll-shadow-scrollbar-size:10px;position:relative}.scroll-shadow--vertical{scrollbar-width:var(--scrollbar-width);scrollbar-color:var(--scrollbar-color);scrollbar-gutter:var(--scrollbar-gutter);overflow-y:auto}.scroll-shadow--horizontal{scrollbar-width:var(--scrollbar-width);scrollbar-color:var(--scrollbar-color);scrollbar-gutter:var(--scrollbar-gutter);overflow-x:auto}.scroll-shadow--fade.scroll-shadow--vertical:where([data-top-scroll=true],[data-bottom-scroll=true],[data-top-bottom-scroll=true]){mask-image:linear-gradient(var(--scroll-linear-gradient)),linear-gradient(#000,#000);mask-position:0 0,100% 0;mask-repeat:no-repeat;mask-size:calc(100% - var(--scroll-shadow-scrollbar-size)) 100%,var(--scroll-shadow-scrollbar-size) 100%;-webkit-mask-image:linear-gradient(var(--scroll-linear-gradient)),linear-gradient(#000,#000);-webkit-mask-position:0 0,100% 0;-webkit-mask-repeat:no-repeat;-webkit-mask-size:calc(100% - var(--scroll-shadow-scrollbar-size)) 100%,var(--scroll-shadow-scrollbar-size) 100%}.scroll-shadow--fade.scroll-shadow--vertical[data-top-scroll=true]{--scroll-linear-gradient:0deg, #000 calc(100% - var(--scroll-shadow-size)), transparent}.scroll-shadow--fade.scroll-shadow--vertical[data-bottom-scroll=true]{--scroll-linear-gradient:180deg, #000 calc(100% - var(--scroll-shadow-size)), transparent}.scroll-shadow--fade.scroll-shadow--vertical[data-top-bottom-scroll=true]{--scroll-linear-gradient:#000, #000, transparent 0, #000 var(--scroll-shadow-size), #000 calc(100% - var(--scroll-shadow-size)), transparent}.scroll-shadow--fade.scroll-shadow--horizontal:where([data-left-scroll=true],[data-right-scroll=true],[data-left-right-scroll=true]){mask-image:linear-gradient(var(--scroll-linear-gradient)),linear-gradient(#000,#000);mask-position:0 0,0 100%;mask-repeat:no-repeat;mask-size:100% calc(100% - var(--scroll-shadow-scrollbar-size)),100% var(--scroll-shadow-scrollbar-size);-webkit-mask-image:linear-gradient(var(--scroll-linear-gradient)),linear-gradient(#000,#000);-webkit-mask-position:0 0,0 100%;-webkit-mask-repeat:no-repeat;-webkit-mask-size:100% calc(100% - var(--scroll-shadow-scrollbar-size)),100% var(--scroll-shadow-scrollbar-size)}.scroll-shadow--fade.scroll-shadow--horizontal[data-left-scroll=true]{--scroll-linear-gradient:270deg, #000 calc(100% - var(--scroll-shadow-size)), transparent}.scroll-shadow--fade.scroll-shadow--horizontal[data-right-scroll=true]{--scroll-linear-gradient:90deg, #000 calc(100% - var(--scroll-shadow-size)), transparent}.scroll-shadow--fade.scroll-shadow--horizontal[data-left-right-scroll=true]{--scroll-linear-gradient:to right, #000, #000, transparent 0, #000 var(--scroll-shadow-size), #000 calc(100% - var(--scroll-shadow-size)), transparent}.scroll-shadow--hide-scrollbar{scrollbar-color:auto;scrollbar-gutter:auto;-ms-overflow-style:none;scrollbar-width:none;--scroll-shadow-scrollbar-size:0px}}@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.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{top:0;right:0;bottom:0;left:0}.inset-x-0{inset-inline:0}.inset-y-0{inset-block:0}.top-0{top:0}.top-1\/2{top:50%}.top-4{top:calc(var(--spacing) * 4)}.top-full{top:100%}.-right-3{right:calc(var(--spacing) * -3)}.right-0{right:0}.right-4{right:calc(var(--spacing) * 4)}.bottom-0{bottom:0}.bottom-4{bottom:calc(var(--spacing) * 4)}.left-0{left:0}.left-1\/2{left:50%}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[1\]{z-index:1}.z-\[2\]{z-index:2}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mx-1{margin-inline:var(--spacing)}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-3{margin-inline:calc(var(--spacing) * 3)}.mx-auto{margin-inline:auto}.-mt-1{margin-top:calc(var(--spacing) * -1)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.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-4{margin-top:calc(var(--spacing) * 4)}.mt-auto{margin-top:auto}.-mr-1{margin-right:calc(var(--spacing) * -1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.-ml-1{margin-left:calc(var(--spacing) * -1)}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-1{height:var(--spacing)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-12{height:calc(var(--spacing) * 12)}.h-48{height:calc(var(--spacing) * 48)}.h-\[90px\]{height:90px}.h-full{height:100%}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-\[90vh\]{max-height:90vh}.min-h-0{min-height:0}.min-h-full{min-height:100%}.w-0\.5{width:calc(var(--spacing) * .5)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-11{width:calc(var(--spacing) * 11)}.w-12{width:calc(var(--spacing) * 12)}.w-28{width:calc(var(--spacing) * 28)}.w-56{width:calc(var(--spacing) * 56)}.w-64{width:calc(var(--spacing) * 64)}.w-72{width:calc(var(--spacing) * 72)}.w-\[17rem\]{width:17rem}.w-\[calc\(100\%-2rem\)\]{width:calc(100% - 2rem)}.w-fit{width:fit-content}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-40{max-width:calc(var(--spacing) * 40)}.max-w-44{max-width:calc(var(--spacing) * 44)}.max-w-\[1800px\]{max-width:1800px}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.min-w-\[140px\]{min-width:140px}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0{--tw-translate-x:0;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0\.5{--tw-translate-x:calc(var(--spacing) * .5);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-5{--tw-translate-x:calc(var(--spacing) * 5);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-col-resize{cursor:col-resize}.cursor-ew-resize{cursor:ew-resize}.cursor-grab{cursor:grab}.cursor-pointer{cursor:pointer}.touch-pan-y{--tw-pan-y:pan-y;touch-action:var(--tw-pan-x,) var(--tw-pan-y,) var(--tw-pinch-zoom,)}.touch-none{touch-action:none}.resize{resize:both}.resize-none{resize:none}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.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-x-4{column-gap:calc(var(--spacing) * 4)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}: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-\[var\(--otari-line\)\]>:not(:last-child)){border-color:var(--otari-line)}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:calc(var(--radius) * 1)}.rounded-md{border-radius:calc(var(--radius) * .75)}.rounded-xl{border-radius:calc(var(--radius) * 1.5)}.border{border-style:var(--tw-border-style);border-width:1px}.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-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-\[\#c2843a\]{border-color:#c2843a}.border-\[var\(--otari-brand\)\]{border-color:var(--otari-brand)}.border-\[var\(--otari-line\)\]{border-color:var(--otari-line)}.border-amber-200{border-color:var(--color-amber-200)}.border-emerald-200{border-color:var(--color-emerald-200)}.border-green-200{border-color:var(--color-green-200)}.border-red-200{border-color:var(--color-red-200)}.border-l-amber-500{border-left-color:var(--color-amber-500)}.border-l-emerald-500{border-left-color:var(--color-emerald-500)}.border-l-red-500{border-left-color:var(--color-red-500)}.bg-\[var\(--otari-bg\)\]{background-color:var(--otari-bg)}.bg-\[var\(--otari-brand\)\],.bg-\[var\(--otari-brand\)\]\/10{background-color:var(--otari-brand)}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--otari-brand\)\]\/10{background-color:color-mix(in oklab,var(--otari-brand) 10%,transparent)}}.bg-\[var\(--otari-brand-tint\)\]{background-color:var(--otari-brand-tint)}.bg-\[var\(--otari-line\)\]{background-color:var(--otari-line)}.bg-\[var\(--otari-surface\)\]{background-color:var(--otari-surface)}.bg-amber-50{background-color:var(--color-amber-50)}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab,red,red)){.bg-black\/40{background-color:color-mix(in oklab,var(--color-black) 40%,transparent)}}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-500{background-color:var(--color-green-500)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-500{background-color:var(--color-red-500)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.p-0{padding:0}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-7{padding:calc(var(--spacing) * 7)}.px-0{padding-inline:0}.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)}.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-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-10{padding-block:calc(var(--spacing) * 10)}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-1{padding-right:var(--spacing)}.pr-1\.5{padding-right:calc(var(--spacing) * 1.5)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pb-1{padding-bottom:var(--spacing)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.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)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[\#b45309\]{color:#b45309}.text-\[var\(--otari-brand-dark\)\]{color:var(--otari-brand-dark)}.text-\[var\(--otari-ink\)\]{color:var(--otari-ink)}.text-\[var\(--otari-muted\)\]{color:var(--otari-muted)}.text-amber-400{color:var(--color-amber-400)}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-amber-900{color:var(--color-amber-900)}.text-emerald-700{color:var(--color-emerald-700)}.text-green-700{color:var(--color-green-700)}.text-red-700{color:var(--color-red-700)}.text-white{color:var(--color-white)}.normal-case{text-transform:none}.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,)}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.accent-\[var\(--otari-brand\)\]{accent-color:var(--otari-brand)}.opacity-0{opacity:0}.opacity-70{opacity:.7}.shadow{--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-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px 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-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-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px 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)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);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,)}.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-\[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-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.outline-none{--tw-outline-style:none;outline-style:none}.select-all{-webkit-user-select:all;user-select:all}.select-none{-webkit-user-select:none;user-select:none}.running{animation-play-state:running}.zoom-out{--tw-exit-scale:0}.group-focus-within\:opacity-100:is(:where(.group):focus-within *){opacity:1}@media(hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.group-focus-visible\:ring-2:is(:where(.group):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)}.group-focus-visible\:ring-\[var\(--otari-brand\)\]:is(:where(.group):focus-visible *){--tw-ring-color:var(--otari-brand)}.group-data-\[focus-visible\]\:outline-2:is(:where(.group)[data-focus-visible] *){outline-style:var(--tw-outline-style);outline-width:2px}.group-data-\[focus-visible\]\:outline-\[var\(--otari-brand\)\]:is(:where(.group)[data-focus-visible] *){outline-color:var(--otari-brand)}@media(hover:hover){.hover\:border-\[var\(--otari-brand\)\]:hover{border-color:var(--otari-brand)}.hover\:bg-\[var\(--otari-bg\)\]:hover{background-color:var(--otari-bg)}.hover\:bg-\[var\(--otari-brand\)\]:hover,.hover\:bg-\[var\(--otari-brand\)\]\/20:hover{background-color:var(--otari-brand)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[var\(--otari-brand\)\]\/20:hover{background-color:color-mix(in oklab,var(--otari-brand) 20%,transparent)}}.hover\:bg-\[var\(--otari-line\)\]:hover{background-color:var(--otari-line)}.hover\:text-\[var\(--otari-brand\)\]:hover{color:var(--otari-brand)}.hover\:text-\[var\(--otari-brand-dark\)\]:hover{color:var(--otari-brand-dark)}.hover\:text-\[var\(--otari-ink\)\]:hover{color:var(--otari-ink)}.hover\:text-amber-950:hover{color:var(--color-amber-950)}.hover\:text-red-700:hover{color:var(--color-red-700)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:border-\[var\(--otari-brand\)\]:focus{border-color:var(--otari-brand)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:bg-\[var\(--otari-brand\)\]:focus-visible{background-color:var(--otari-brand)}.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-\[var\(--otari-brand\)\]:focus-visible{--tw-ring-color:var(--otari-brand)}.active\:cursor-grabbing:active{cursor:grabbing}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:40rem){.sm\:col-span-2{grid-column:span 2/span 2}.sm\:col-start-1{grid-column-start:1}.sm\:col-start-2{grid-column-start:2}.sm\:col-start-3{grid-column-start:3}.sm\:inline{display:inline}.sm\:w-28{width:calc(var(--spacing) * 28)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-\[minmax\(0\,1fr\)_16rem_10rem\]{grid-template-columns:minmax(0,1fr) 16rem 10rem}.sm\:flex-row{flex-direction:row}.sm\:flex-wrap{flex-wrap:wrap}.sm\:items-center{align-items:center}.sm\:items-start{align-items:flex-start}.sm\:justify-self-end{justify-self:flex-end}.sm\:justify-self-start{justify-self:flex-start}.sm\:p-5{padding:calc(var(--spacing) * 5)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}}@media(min-width:48rem){.md\:flex{display:flex}.md\:hidden{display:none}.md\:px-6{padding-inline:calc(var(--spacing) * 6)}.md\:py-6{padding-block:calc(var(--spacing) * 6)}}@media(min-width:64rem){.lg\:sticky{position:sticky}.lg\:top-4{top:calc(var(--spacing) * 4)}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-\[minmax\(0\,1fr\)_360px\]{grid-template-columns:minmax(0,1fr) 360px}.lg\:items-start{align-items:flex-start}}@media(min-width:80rem){.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}:root{--otari-brand:#4e8295;--otari-brand-dark:#3c6678;--otari-brand-tint:#eaf1f3;--otari-ink:#14242c;--otari-muted:#5b6b73;--otari-line:#dbe5e8;--otari-surface:#fff;--otari-bg:#f6f9fa;--otari-code-ink:#e8eef0}.otari-table.table-root{background-color:var(--otari-surface);border:1px solid var(--otari-line);border-radius:.75rem;padding:0;overflow:hidden}.otari-table .table__header{background-color:var(--otari-brand-tint);border-bottom:1px solid var(--otari-line)}.otari-table .table__column,.otari-table [role=row]>[role=presentation]:first-of-type>.table__column,.otari-table [role=row]>[role=presentation]:last-of-type>.table__column{color:var(--otari-ink);background-color:#0000;border-radius:0;font-weight:600}.otari-table .table__column:after{content:none}.otari-table .table__row .table__cell{border-color:var(--otari-line)}.otari-table .table__row:hover .table__cell{background-color:var(--otari-bg)}.otari-table .otari-detail-row>td{border-bottom:1px solid var(--otari-line);background-color:var(--otari-bg);padding:0}.otari-table .otari-detail-opening .table__cell{background-color:var(--otari-brand-tint)}.otari-detail-reveal{grid-template-rows:0fr;animation:.18s ease-out forwards otari-detail-open;display:grid}.otari-detail-reveal>div{overflow:hidden}@keyframes otari-detail-open{0%{opacity:.5;grid-template-rows:0fr}to{opacity:1;grid-template-rows:1fr}}.otari-bulk-bar{animation:.16s ease-out otari-bulk-bar-in}@keyframes otari-bulk-bar-in{0%{opacity:0;transform:translate(-50%,.5rem)}to{opacity:1;transform:translate(-50%)}}@media(prefers-reduced-motion:reduce){.otari-detail-reveal{grid-template-rows:1fr;animation:none}.otari-bulk-bar{animation:none}}.otari-markdown{color:var(--otari-ink);font-size:.875rem;line-height:1.65}.otari-markdown>:first-child{margin-top:0}.otari-markdown h1,.otari-markdown h2,.otari-markdown h3,.otari-markdown h4{color:var(--otari-ink);font-weight:600;line-height:1.3}.otari-markdown h1{margin:2rem 0 .75rem;font-size:1.5rem}.otari-markdown h2{border-bottom:1px solid var(--otari-line);margin:2rem 0 .5rem;padding-bottom:.3rem;font-size:1.25rem}.otari-markdown h3{margin:1.5rem 0 .5rem;font-size:1.05rem}.otari-markdown h4{margin:1.25rem 0 .25rem;font-size:.95rem}.otari-markdown p{margin:.75rem 0}.otari-markdown a{color:var(--otari-brand-dark);text-underline-offset:2px;text-decoration:underline}.otari-markdown a:hover{text-decoration-thickness:2px}.otari-markdown ul,.otari-markdown ol{margin:.75rem 0;padding-left:1.5rem}.otari-markdown ul{list-style:outside}.otari-markdown ol{list-style:decimal}.otari-markdown li,.otari-markdown li>ul,.otari-markdown li>ol{margin:.25rem 0}.otari-markdown code{background-color:var(--otari-brand-tint);color:var(--otari-brand-dark);border-radius:.35rem;padding:.1rem .35rem;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,monospace;font-size:.85em}.otari-markdown pre{background-color:var(--otari-ink);border-radius:.6rem;margin:1rem 0;padding:.85rem 1rem;overflow-x:auto}.otari-markdown pre code{color:var(--otari-code-ink);background-color:#0000;border-radius:0;padding:0;font-size:.82rem;line-height:1.55}.otari-markdown blockquote{border-left:3px solid var(--otari-brand);color:var(--otari-muted);margin:1rem 0;padding:.25rem 0 .25rem 1rem}.otari-markdown hr{border:0;border-top:1px solid var(--otari-line);margin:1.5rem 0}.otari-markdown-scroll{max-width:100%;margin:1rem 0;overflow-x:auto}.otari-markdown table{border-collapse:collapse;font-size:.85rem}.otari-markdown th,.otari-markdown td{border:1px solid var(--otari-line);text-align:left;vertical-align:top;padding:.4rem .7rem}.otari-markdown th{background-color:var(--otari-brand-tint);color:var(--otari-ink);font-weight:600}.otari-markdown tbody tr:hover td,.otari-markdown tr:hover td{background-color:var(--otari-bg)}html,body,#root{height:100%}body{background-color:var(--otari-bg);color:var(--otari-ink);margin:0;font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,sans-serif}@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-pan-x{syntax:"*";inherits:false}@property --tw-pan-y{syntax:"*";inherits:false}@property --tw-pinch-zoom{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:"";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:"";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:"";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:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-border-spacing-x{syntax:"";inherits:false;initial-value:0}@property --tw-border-spacing-y{syntax:"";inherits:false;initial-value:0}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}}@keyframes caret-blink{0%,70%,to{opacity:1}20%,50%{opacity:0}}@keyframes skeleton{to{transform:translate(200%)}} diff --git a/src/gateway/static/dashboard/assets/recharts-D7kuKp97.js b/src/gateway/static/dashboard/assets/recharts-C4kRDmvS.js similarity index 99% rename from src/gateway/static/dashboard/assets/recharts-D7kuKp97.js rename to src/gateway/static/dashboard/assets/recharts-C4kRDmvS.js index c3b6c468..a2c9359b 100644 --- a/src/gateway/static/dashboard/assets/recharts-D7kuKp97.js +++ b/src/gateway/static/dashboard/assets/recharts-C4kRDmvS.js @@ -1,4 +1,4 @@ -var kg=Object.defineProperty;var Tg=(e,t,r)=>t in e?kg(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var ii=(e,t,r)=>Tg(e,typeof t!="symbol"?t+"":t,r);import{r as h,c as iv,a as av,g as Mg,R as jg}from"./react-dgEcD0HR.js";import{c as ne,r as Dg}from"./heroui-DZj66Arc.js";var $g=["dangerouslySetInnerHTML","onCopy","onCopyCapture","onCut","onCutCapture","onPaste","onPasteCapture","onCompositionEnd","onCompositionEndCapture","onCompositionStart","onCompositionStartCapture","onCompositionUpdate","onCompositionUpdateCapture","onFocus","onFocusCapture","onBlur","onBlurCapture","onChange","onChangeCapture","onBeforeInput","onBeforeInputCapture","onInput","onInputCapture","onReset","onResetCapture","onSubmit","onSubmitCapture","onInvalid","onInvalidCapture","onLoad","onLoadCapture","onError","onErrorCapture","onKeyDown","onKeyDownCapture","onKeyPress","onKeyPressCapture","onKeyUp","onKeyUpCapture","onAbort","onAbortCapture","onCanPlay","onCanPlayCapture","onCanPlayThrough","onCanPlayThroughCapture","onDurationChange","onDurationChangeCapture","onEmptied","onEmptiedCapture","onEncrypted","onEncryptedCapture","onEnded","onEndedCapture","onLoadedData","onLoadedDataCapture","onLoadedMetadata","onLoadedMetadataCapture","onLoadStart","onLoadStartCapture","onPause","onPauseCapture","onPlay","onPlayCapture","onPlaying","onPlayingCapture","onProgress","onProgressCapture","onRateChange","onRateChangeCapture","onSeeked","onSeekedCapture","onSeeking","onSeekingCapture","onStalled","onStalledCapture","onSuspend","onSuspendCapture","onTimeUpdate","onTimeUpdateCapture","onVolumeChange","onVolumeChangeCapture","onWaiting","onWaitingCapture","onAuxClick","onAuxClickCapture","onClick","onClickCapture","onContextMenu","onContextMenuCapture","onDoubleClick","onDoubleClickCapture","onDrag","onDragCapture","onDragEnd","onDragEndCapture","onDragEnter","onDragEnterCapture","onDragExit","onDragExitCapture","onDragLeave","onDragLeaveCapture","onDragOver","onDragOverCapture","onDragStart","onDragStartCapture","onDrop","onDropCapture","onMouseDown","onMouseDownCapture","onMouseEnter","onMouseLeave","onMouseMove","onMouseMoveCapture","onMouseOut","onMouseOutCapture","onMouseOver","onMouseOverCapture","onMouseUp","onMouseUpCapture","onSelect","onSelectCapture","onTouchCancel","onTouchCancelCapture","onTouchEnd","onTouchEndCapture","onTouchMove","onTouchMoveCapture","onTouchStart","onTouchStartCapture","onPointerDown","onPointerDownCapture","onPointerMove","onPointerMoveCapture","onPointerUp","onPointerUpCapture","onPointerCancel","onPointerCancelCapture","onPointerEnter","onPointerEnterCapture","onPointerLeave","onPointerLeaveCapture","onPointerOver","onPointerOverCapture","onPointerOut","onPointerOutCapture","onGotPointerCapture","onGotPointerCaptureCapture","onLostPointerCapture","onLostPointerCaptureCapture","onScroll","onScrollCapture","onWheel","onWheelCapture","onAnimationStart","onAnimationStartCapture","onAnimationEnd","onAnimationEndCapture","onAnimationIteration","onAnimationIterationCapture","onTransitionEnd","onTransitionEndCapture"];function Ou(e){if(typeof e!="string")return!1;var t=$g;return t.includes(e)}var Ng=["aria-activedescendant","aria-atomic","aria-autocomplete","aria-busy","aria-checked","aria-colcount","aria-colindex","aria-colspan","aria-controls","aria-current","aria-describedby","aria-details","aria-disabled","aria-errormessage","aria-expanded","aria-flowto","aria-haspopup","aria-hidden","aria-invalid","aria-keyshortcuts","aria-label","aria-labelledby","aria-level","aria-live","aria-modal","aria-multiline","aria-multiselectable","aria-orientation","aria-owns","aria-placeholder","aria-posinset","aria-pressed","aria-readonly","aria-relevant","aria-required","aria-roledescription","aria-rowcount","aria-rowindex","aria-rowspan","aria-selected","aria-setsize","aria-sort","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext","className","color","height","id","lang","max","media","method","min","name","style","target","width","role","tabIndex","accentHeight","accumulate","additive","alignmentBaseline","allowReorder","alphabetic","amplitude","arabicForm","ascent","attributeName","attributeType","autoReverse","azimuth","baseFrequency","baselineShift","baseProfile","bbox","begin","bias","by","calcMode","capHeight","clip","clipPath","clipPathUnits","clipRule","colorInterpolation","colorInterpolationFilters","colorProfile","colorRendering","contentScriptType","contentStyleType","cursor","cx","cy","d","decelerate","descent","diffuseConstant","direction","display","divisor","dominantBaseline","dur","dx","dy","edgeMode","elevation","enableBackground","end","exponent","externalResourcesRequired","fill","fillOpacity","fillRule","filter","filterRes","filterUnits","floodColor","floodOpacity","focusable","fontFamily","fontSize","fontSizeAdjust","fontStretch","fontStyle","fontVariant","fontWeight","format","from","fx","fy","g1","g2","glyphName","glyphOrientationHorizontal","glyphOrientationVertical","glyphRef","gradientTransform","gradientUnits","hanging","horizAdvX","horizOriginX","href","ideographic","imageRendering","in2","in","intercept","k1","k2","k3","k4","k","kernelMatrix","kernelUnitLength","kerning","keyPoints","keySplines","keyTimes","lengthAdjust","letterSpacing","lightingColor","limitingConeAngle","local","markerEnd","markerHeight","markerMid","markerStart","markerUnits","markerWidth","mask","maskContentUnits","maskUnits","mathematical","mode","numOctaves","offset","opacity","operator","order","orient","orientation","origin","overflow","overlinePosition","overlineThickness","paintOrder","panose1","pathLength","patternContentUnits","patternTransform","patternUnits","pointerEvents","pointsAtX","pointsAtY","pointsAtZ","preserveAlpha","preserveAspectRatio","primitiveUnits","r","radius","refX","refY","renderingIntent","repeatCount","repeatDur","requiredExtensions","requiredFeatures","restart","result","rotate","rx","ry","seed","shapeRendering","slope","spacing","specularConstant","specularExponent","speed","spreadMethod","startOffset","stdDeviation","stemh","stemv","stitchTiles","stopColor","stopOpacity","strikethroughPosition","strikethroughThickness","string","stroke","strokeDasharray","strokeDashoffset","strokeLinecap","strokeLinejoin","strokeMiterlimit","strokeOpacity","strokeWidth","surfaceScale","systemLanguage","tableValues","targetX","targetY","textAnchor","textDecoration","textLength","textRendering","to","transform","u1","u2","underlinePosition","underlineThickness","unicode","unicodeBidi","unicodeRange","unitsPerEm","vAlphabetic","values","vectorEffect","version","vertAdvY","vertOriginX","vertOriginY","vHanging","vIdeographic","viewTarget","visibility","vMathematical","widths","wordSpacing","writingMode","x1","x2","x","xChannelSelector","xHeight","xlinkActuate","xlinkArcrole","xlinkHref","xlinkRole","xlinkShow","xlinkTitle","xlinkType","xmlBase","xmlLang","xmlns","xmlnsXlink","xmlSpace","y1","y2","y","yChannelSelector","z","zoomAndPan","ref","key","angle"],Rg=new Set(Ng);function ov(e){return typeof e!="string"?!1:Rg.has(e)}function uv(e){return typeof e=="string"&&e.startsWith("data-")}function wt(e){if(typeof e!="object"||e===null)return{};var t={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(ov(r)||uv(r))&&(t[r]=e[r]);return t}function Ln(e){if(e==null)return null;if(h.isValidElement(e)&&typeof e.props=="object"&&e.props!==null){var t=e.props;return wt(t)}return typeof e=="object"&&!Array.isArray(e)?wt(e):null}function Ge(e){var t={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(ov(r)||uv(r)||Ou(r))&&(t[r]=e[r]);return t}function Lg(e){return e==null?null:h.isValidElement(e)?Ge(e.props):typeof e=="object"&&!Array.isArray(e)?Ge(e):null}var Bg=["children","width","height","viewBox","className","style","title","desc"];function jo(){return jo=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var r=e.children,n=e.width,i=e.height,a=e.viewBox,o=e.className,u=e.style,l=e.title,c=e.desc,s=zg(e,Bg),f=a||{width:n,height:i,x:0,y:0},d=ne("recharts-surface",o);return h.createElement("svg",jo({},Ge(s),{className:d,width:n,height:i,style:u,viewBox:"".concat(f.x," ").concat(f.y," ").concat(f.width," ").concat(f.height),ref:t}),h.createElement("title",null,l),h.createElement("desc",null,c),r)}),Wg=["children","className"];function Do(){return Do=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var r=e.children,n=e.className,i=Ug(e,Wg),a=ne("recharts-layer",n);return h.createElement("g",Do({className:a},Ge(i),{ref:t}),r)});function $o(e){return e==="__proto__"}function cv(e){switch(typeof e){case"number":case"symbol":return!1;case"string":return e.includes(".")||e.includes("[")||e.includes("]")}}function Pu(e){var t;return typeof e=="string"||typeof e=="symbol"?e:Object.is((t=e==null?void 0:e.valueOf)==null?void 0:t.call(e),-0)?"-0":String(e)}function sv(e){if(e==null)return"";if(typeof e=="string")return e;if(Array.isArray(e))return e.map(sv).join(",");const t=String(e);return t==="0"&&Object.is(Number(e),-0)?"-0":t}function Su(e){if(Array.isArray(e))return e.map(Pu);if(typeof e=="symbol")return[e];e=sv(e);const t=[],r=e.length;if(r===0)return t;let n=0,i="",a="",o=!1;for(e.charCodeAt(0)===46&&t.push("");n1&&arguments[1]!==void 0?arguments[1]:Yg,r=10**t,n=Math.round(e*r)/r;return Object.is(n,-0)?0:n}function Se(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n{var u=r[o-1];return typeof u=="string"?i+u+a:u!==void 0?i+It(u)+a:i+a},"")}var We=e=>e===0?0:e>0?1:-1,At=e=>typeof e=="number"&&e!=+e,mr=e=>typeof e=="string"&&e.length>1&&e.indexOf("%")===e.length-1,D=e=>(typeof e=="number"||e instanceof Number)&&!At(e),Ot=e=>D(e)||typeof e=="string",Vg=0,Sn=e=>{var t=++Vg;return"".concat(e||"").concat(t)},ut=function(t,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;if(!D(t)&&typeof t!="string")return n;var a;if(mr(t)){if(r==null)return n;var o=t.indexOf("%");a=r*parseFloat(t.slice(0,o))/100}else a=+t;return At(a)&&(a=n),i&&r!=null&&a>r&&(a=r),a},fv=e=>{if(!Array.isArray(e))return!1;for(var t=e.length,r={},n=0;nn&&(typeof t=="function"?t(n):Tt(n,t))===r)}var ae=e=>e===null||typeof e>"u",Eu=e=>ae(e)?e:"".concat(e.charAt(0).toUpperCase()).concat(e.slice(1));function mt(e){return e!=null}function Or(){}function Iu(e){if(e)return{x:e.x,y:e.y,upperWidth:"upperWidth"in e?e.upperWidth:e.width,lowerWidth:"lowerWidth"in e?e.lowerWidth:e.width,width:e.width,height:e.height}}function ac(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function dt(e){for(var t=1;t{var t=e.viewBox,r=e.position,n=e.offset,i=n===void 0?0:n,a=e.parentViewBox,o=Iu(t),u=o.x,l=o.y,c=o.height,s=o.upperWidth,f=o.lowerWidth,d=u,v=u+(s-f)/2,p=(d+v)/2,m=(s+f)/2,y=d+s/2,g=c>=0?1:-1,x=g*i,A=g>0?"end":"start",w=g>0?"start":"end",O=s>=0?1:-1,b=O*i,S=O>0?"end":"start",I=O>0?"start":"end",_=a;if(r==="top"){var T={x:d+s/2,y:l-x,horizontalAnchor:"middle",verticalAnchor:A};return _&&(T.height=Math.max(l-_.y,0),T.width=s),T}if(r==="bottom"){var k={x:v+f/2,y:l+c+x,horizontalAnchor:"middle",verticalAnchor:w};return _&&(k.height=Math.max(_.y+_.height-(l+c),0),k.width=f),k}if(r==="left"){var E={x:p-b,y:l+c/2,horizontalAnchor:S,verticalAnchor:"middle"};return _&&(E.width=Math.max(E.x-_.x,0),E.height=c),E}if(r==="right"){var R={x:p+m+b,y:l+c/2,horizontalAnchor:I,verticalAnchor:"middle"};return _&&(R.width=Math.max(_.x+_.width-R.x,0),R.height=c),R}var $=_?{width:m,height:c}:{};return r==="insideLeft"?dt({x:p+b,y:l+c/2,horizontalAnchor:I,verticalAnchor:"middle"},$):r==="insideRight"?dt({x:p+m-b,y:l+c/2,horizontalAnchor:S,verticalAnchor:"middle"},$):r==="insideTop"?dt({x:d+s/2,y:l+x,horizontalAnchor:"middle",verticalAnchor:w},$):r==="insideBottom"?dt({x:v+f/2,y:l+c-x,horizontalAnchor:"middle",verticalAnchor:A},$):r==="insideTopLeft"?dt({x:d+b,y:l+x,horizontalAnchor:I,verticalAnchor:w},$):r==="insideTopRight"?dt({x:d+s-b,y:l+x,horizontalAnchor:S,verticalAnchor:w},$):r==="insideBottomLeft"?dt({x:v+b,y:l+c-x,horizontalAnchor:I,verticalAnchor:A},$):r==="insideBottomRight"?dt({x:v+f-b,y:l+c-x,horizontalAnchor:S,verticalAnchor:A},$):r&&typeof r=="object"&&(D(r.x)||mr(r.x))&&(D(r.y)||mr(r.y))?dt({x:u+ut(r.x,m),y:l+ut(r.y,c),horizontalAnchor:"end",verticalAnchor:"end"},$):dt({x:y,y:l+c/2,horizontalAnchor:"middle",verticalAnchor:"middle"},$)},Qg=["top","left","right","bottom"];function Jg(e){return e==null?!1:typeof e=="object"?!0:Qg.includes(e)}var e0=h.createContext(null);function ue(e){return function(){return e}}const No=Math.PI,Ro=2*No,or=1e-6,t0=Ro-or;function vv(e){this._+=e[0];for(let t=1,r=e.length;t=0))throw new Error(`invalid digits: ${e}`);if(t>15)return vv;const r=10**t;return function(n){this._+=n[0];for(let i=1,a=n.length;ior)if(!(Math.abs(f*l-c*s)>or)||!a)this._append`L${this._x1=t},${this._y1=r}`;else{let v=n-o,p=i-u,m=l*l+c*c,y=v*v+p*p,g=Math.sqrt(m),x=Math.sqrt(d),A=a*Math.tan((No-Math.acos((m+d-y)/(2*g*x)))/2),w=A/x,O=A/g;Math.abs(w-1)>or&&this._append`L${t+w*s},${r+w*f}`,this._append`A${a},${a},0,0,${+(f*v>s*p)},${this._x1=t+O*l},${this._y1=r+O*c}`}}arc(t,r,n,i,a,o){if(t=+t,r=+r,n=+n,o=!!o,n<0)throw new Error(`negative radius: ${n}`);let u=n*Math.cos(i),l=n*Math.sin(i),c=t+u,s=r+l,f=1^o,d=o?i-a:a-i;this._x1===null?this._append`M${c},${s}`:(Math.abs(this._x1-c)>or||Math.abs(this._y1-s)>or)&&this._append`L${c},${s}`,n&&(d<0&&(d=d%Ro+Ro),d>t0?this._append`A${n},${n},0,1,${f},${t-u},${r-l}A${n},${n},0,1,${f},${this._x1=c},${this._y1=s}`:d>or&&this._append`A${n},${n},0,${+(d>=No)},${f},${this._x1=t+n*Math.cos(a)},${this._y1=r+n*Math.sin(a)}`)}rect(t,r,n,i){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+r}h${n=+n}v${+i}h${-n}Z`}toString(){return this._}}function hv(e){let t=3;return e.digits=function(r){if(!arguments.length)return t;if(r==null)t=null;else{const n=Math.floor(r);if(!(n>=0))throw new RangeError(`invalid digits: ${r}`);t=n}return e},()=>new n0(t)}function _u(e){return typeof e=="object"&&"length"in e?e:Array.from(e)}function pv(e){this._context=e}pv.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:this._context.lineTo(e,t);break}}};function ma(e){return new pv(e)}function mv(e){return e[0]}function yv(e){return e[1]}function gv(e,t){var r=ue(!0),n=null,i=ma,a=null,o=hv(u);e=typeof e=="function"?e:e===void 0?mv:ue(e),t=typeof t=="function"?t:t===void 0?yv:ue(t);function u(l){var c,s=(l=_u(l)).length,f,d=!1,v;for(n==null&&(a=i(v=o())),c=0;c<=s;++c)!(c=v;--p)u.point(A[p],w[p]);u.lineEnd(),u.areaEnd()}g&&(A[d]=+e(y,d,f),w[d]=+t(y,d,f),u.point(n?+n(y,d,f):A[d],r?+r(y,d,f):w[d]))}if(x)return u=null,x+""||null}function s(){return gv().defined(i).curve(o).context(a)}return c.x=function(f){return arguments.length?(e=typeof f=="function"?f:ue(+f),n=null,c):e},c.x0=function(f){return arguments.length?(e=typeof f=="function"?f:ue(+f),c):e},c.x1=function(f){return arguments.length?(n=f==null?null:typeof f=="function"?f:ue(+f),c):n},c.y=function(f){return arguments.length?(t=typeof f=="function"?f:ue(+f),r=null,c):t},c.y0=function(f){return arguments.length?(t=typeof f=="function"?f:ue(+f),c):t},c.y1=function(f){return arguments.length?(r=f==null?null:typeof f=="function"?f:ue(+f),c):r},c.lineX0=c.lineY0=function(){return s().x(e).y(t)},c.lineY1=function(){return s().x(e).y(r)},c.lineX1=function(){return s().x(n).y(t)},c.defined=function(f){return arguments.length?(i=typeof f=="function"?f:ue(!!f),c):i},c.curve=function(f){return arguments.length?(o=f,a!=null&&(u=o(a)),c):o},c.context=function(f){return arguments.length?(f==null?a=u=null:u=o(a=f),c):a},c}class bv{constructor(t,r){this._context=t,this._x=r}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(t,r){switch(t=+t,r=+r,this._point){case 0:{this._point=1,this._line?this._context.lineTo(t,r):this._context.moveTo(t,r);break}case 1:this._point=2;default:{this._x?this._context.bezierCurveTo(this._x0=(this._x0+t)/2,this._y0,this._x0,r,t,r):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+r)/2,t,this._y0,t,r);break}}this._x0=t,this._y0=r}}function i0(e){return new bv(e,!0)}function a0(e){return new bv(e,!1)}function _i(){}function Ci(e,t,r){e._context.bezierCurveTo((2*e._x0+e._x1)/3,(2*e._y0+e._y1)/3,(e._x0+2*e._x1)/3,(e._y0+2*e._y1)/3,(e._x0+4*e._x1+t)/6,(e._y0+4*e._y1+r)/6)}function xv(e){this._context=e}xv.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:Ci(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:Ci(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function o0(e){return new xv(e)}function wv(e){this._context=e}wv.prototype={areaStart:_i,areaEnd:_i,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2),this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break}case 3:{this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4);break}}},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._x2=e,this._y2=t;break;case 1:this._point=2,this._x3=e,this._y3=t;break;case 2:this._point=3,this._x4=e,this._y4=t,this._context.moveTo((this._x0+4*this._x1+e)/6,(this._y0+4*this._y1+t)/6);break;default:Ci(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function u0(e){return new wv(e)}function Av(e){this._context=e}Av.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var r=(this._x0+4*this._x1+e)/6,n=(this._y0+4*this._y1+t)/6;this._line?this._context.lineTo(r,n):this._context.moveTo(r,n);break;case 3:this._point=4;default:Ci(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function l0(e){return new Av(e)}function Ov(e){this._context=e}Ov.prototype={areaStart:_i,areaEnd:_i,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(e,t){e=+e,t=+t,this._point?this._context.lineTo(e,t):(this._point=1,this._context.moveTo(e,t))}};function c0(e){return new Ov(e)}function oc(e){return e<0?-1:1}function uc(e,t,r){var n=e._x1-e._x0,i=t-e._x1,a=(e._y1-e._y0)/(n||i<0&&-0),o=(r-e._y1)/(i||n<0&&-0),u=(a*i+o*n)/(n+i);return(oc(a)+oc(o))*Math.min(Math.abs(a),Math.abs(o),.5*Math.abs(u))||0}function lc(e,t){var r=e._x1-e._x0;return r?(3*(e._y1-e._y0)/r-t)/2:t}function eo(e,t,r){var n=e._x0,i=e._y0,a=e._x1,o=e._y1,u=(a-n)/3;e._context.bezierCurveTo(n+u,i+u*t,a-u,o-u*r,a,o)}function ki(e){this._context=e}ki.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:eo(this,this._t0,lc(this,this._t0));break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){var r=NaN;if(e=+e,t=+t,!(e===this._x1&&t===this._y1)){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,eo(this,lc(this,r=uc(this,e,t)),r);break;default:eo(this,this._t0,r=uc(this,e,t));break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t,this._t0=r}}};function Pv(e){this._context=new Sv(e)}(Pv.prototype=Object.create(ki.prototype)).point=function(e,t){ki.prototype.point.call(this,t,e)};function Sv(e){this._context=e}Sv.prototype={moveTo:function(e,t){this._context.moveTo(t,e)},closePath:function(){this._context.closePath()},lineTo:function(e,t){this._context.lineTo(t,e)},bezierCurveTo:function(e,t,r,n,i,a){this._context.bezierCurveTo(t,e,n,r,a,i)}};function s0(e){return new ki(e)}function f0(e){return new Pv(e)}function Ev(e){this._context=e}Ev.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var e=this._x,t=this._y,r=e.length;if(r)if(this._line?this._context.lineTo(e[0],t[0]):this._context.moveTo(e[0],t[0]),r===2)this._context.lineTo(e[1],t[1]);else for(var n=cc(e),i=cc(t),a=0,o=1;o=0;--t)i[t]=(o[t]-i[t+1])/a[t];for(a[r-1]=(e[r]+i[r-1])/2,t=0;t=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:{if(this._t<=0)this._context.lineTo(this._x,t),this._context.lineTo(e,t);else{var r=this._x*(1-this._t)+e*this._t;this._context.lineTo(r,this._y),this._context.lineTo(r,t)}break}}this._x=e,this._y=t}};function v0(e){return new ya(e,.5)}function h0(e){return new ya(e,0)}function p0(e){return new ya(e,1)}function yr(e,t){if((o=e.length)>1)for(var r=1,n,i,a=e[t[0]],o,u=a.length;r=0;)r[t]=t;return r}function m0(e,t){return e[t]}function y0(e){const t=[];return t.key=e,t}function g0(){var e=ue([]),t=Lo,r=yr,n=m0;function i(a){var o=Array.from(e.apply(this,arguments),y0),u,l=o.length,c=-1,s;for(const f of a)for(u=0,++c;u0){for(var r,n,i=0,a=e[0].length,o;i0){for(var r=0,n=e[t[0]],i,a=n.length;r0)||!((a=(i=e[t[0]]).length)>0))){for(var r=0,n=1,i,a,o;n"radius"in e&&"startAngle"in e&&"endAngle"in e,Cu=(e,t)=>{if(!e||typeof e=="function"||typeof e=="boolean")return null;var r=e;if(h.isValidElement(e)&&(r=e.props),typeof r!="object"&&typeof r!="function")return null;var n={};return Object.keys(r).forEach(i=>{Ou(i)&&typeof r[i]=="function"&&(n[i]=(a=>r[i](r,a)))}),n},A0=(e,t,r)=>n=>(e(t,r,n),null),ku=(e,t,r)=>{if(e===null||typeof e!="object"&&typeof e!="function")return null;var n=null;return Object.keys(e).forEach(i=>{var a=e[i];Ou(i)&&typeof a=="function"&&(n||(n={}),n[i]=A0(a,t,r))}),n};function sc(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function O0(e){for(var t=1;t(o[u]===void 0&&n[u]!==void 0&&(o[u]=n[u]),o),r);return a}function I0(e,t){const r=new Map;for(let n=0;nObject.prototype.propertyIsEnumerable.call(e,t))}function En(e){return e==null?e===void 0?"[object Undefined]":"[object Null]":Object.prototype.toString.call(e)}const Cv="[object RegExp]",Tu="[object String]",Mu="[object Number]",ju="[object Boolean]",kv="[object Arguments]",Tv="[object Symbol]",Mv="[object Date]",jv="[object Map]",Dv="[object Set]",$v="[object Array]",T0="[object Function]",Nv="[object ArrayBuffer]",Ai="[object Object]",M0="[object Error]",Rv="[object DataView]",Lv="[object Uint8Array]",Bv="[object Uint8ClampedArray]",zv="[object Uint16Array]",Fv="[object Uint32Array]",j0="[object BigUint64Array]",Wv="[object Int8Array]",Uv="[object Int16Array]",Kv="[object Int32Array]",D0="[object BigInt64Array]",Hv="[object Float32Array]",Yv="[object Float64Array]",fc=typeof globalThis=="object"&&globalThis||typeof window=="object"&&window||typeof self=="object"&&self||typeof global=="object"&&global||(function(){return this})();function Fo(e){return typeof fc.Buffer<"u"&&fc.Buffer.isBuffer(e)}function $0(e,t){return cr(e,void 0,e,new Map,t)}function cr(e,t,r,n=new Map,i=void 0){const a=i==null?void 0:i(e,t,r,n);if(a!==void 0)return a;if(Bo(e))return e;if(n.has(e))return n.get(e);if(Array.isArray(e)){const o=new Array(e.length);n.set(e,o);for(let u=0;u{}):Wo(e,t,function n(i,a,o,u,l,c){const s=r(i,a,o,u,l,c);return s!==void 0?!!s:Wo(i,a,n,c,!1)},new Map,!0)}function Wo(e,t,r,n,i=!1){if(t===e)return!0;switch(typeof t){case"object":return L0(e,t,r,n);case"function":return Object.keys(t).length>0?Wo(e,{...t},r,n,i):wn(e,t);default:return Vv(e)&&i?typeof t=="string"?t==="":!0:wn(e,t)}}function L0(e,t,r,n){if(t==null)return!0;if(Array.isArray(t))return Xv(e,t,r,n);if(t instanceof Map)return B0(e,t,r,n);if(t instanceof Set)return z0(e,t,r,n);const i=Object.keys(t);if(e==null||Bo(e))return i.length===0;if(i.length===0)return!0;if(n!=null&&n.has(t))return n.get(t)===e;n==null||n.set(t,e);try{for(let a=0;a{})}function F0(e){return e=R0(e),t=>Gv(t,e)}function W0(e,t){return $0(e,(r,n,i,a)=>{if(typeof e=="object"){if(En(e)==="[object Object]"&&typeof e.constructor!="function"){const o={};return a.set(e,o),it(o,e,i,a),o}switch(Object.prototype.toString.call(e)){case Mu:case Tu:case ju:{const o=new e.constructor(e==null?void 0:e.valueOf());return it(o,e),o}case kv:{const o={};return it(o,e),o.length=e.length,o[Symbol.iterator]=e[Symbol.iterator],o}default:return}}})}function U0(e){return W0(e)}const K0=/^(?:0|[1-9]\d*)$/;function Zv(e,t=Number.MAX_SAFE_INTEGER){switch(typeof e){case"number":return Number.isInteger(e)&&e>=0&&e=0}function Qv(e){return e!=null&&typeof e!="function"&&X0(e.length)}function G0(e){return typeof e=="object"&&e!==null}function Z0(e){return G0(e)&&Qv(e)}function dc(e,t=_v){return Z0(e)?I0(Array.from(e),_0(q0(t),1)):[]}function Q0(e,t,r){return t===!0?dc(e,r):typeof t=="function"?dc(e,t):e}var to={exports:{}},ro={};/** +var kg=Object.defineProperty;var Tg=(e,t,r)=>t in e?kg(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r;var ii=(e,t,r)=>Tg(e,typeof t!="symbol"?t+"":t,r);import{r as h,c as iv,a as av,g as Mg,R as jg}from"./react-dgEcD0HR.js";import{c as ne,r as Dg}from"./heroui-BI50yK5B.js";var $g=["dangerouslySetInnerHTML","onCopy","onCopyCapture","onCut","onCutCapture","onPaste","onPasteCapture","onCompositionEnd","onCompositionEndCapture","onCompositionStart","onCompositionStartCapture","onCompositionUpdate","onCompositionUpdateCapture","onFocus","onFocusCapture","onBlur","onBlurCapture","onChange","onChangeCapture","onBeforeInput","onBeforeInputCapture","onInput","onInputCapture","onReset","onResetCapture","onSubmit","onSubmitCapture","onInvalid","onInvalidCapture","onLoad","onLoadCapture","onError","onErrorCapture","onKeyDown","onKeyDownCapture","onKeyPress","onKeyPressCapture","onKeyUp","onKeyUpCapture","onAbort","onAbortCapture","onCanPlay","onCanPlayCapture","onCanPlayThrough","onCanPlayThroughCapture","onDurationChange","onDurationChangeCapture","onEmptied","onEmptiedCapture","onEncrypted","onEncryptedCapture","onEnded","onEndedCapture","onLoadedData","onLoadedDataCapture","onLoadedMetadata","onLoadedMetadataCapture","onLoadStart","onLoadStartCapture","onPause","onPauseCapture","onPlay","onPlayCapture","onPlaying","onPlayingCapture","onProgress","onProgressCapture","onRateChange","onRateChangeCapture","onSeeked","onSeekedCapture","onSeeking","onSeekingCapture","onStalled","onStalledCapture","onSuspend","onSuspendCapture","onTimeUpdate","onTimeUpdateCapture","onVolumeChange","onVolumeChangeCapture","onWaiting","onWaitingCapture","onAuxClick","onAuxClickCapture","onClick","onClickCapture","onContextMenu","onContextMenuCapture","onDoubleClick","onDoubleClickCapture","onDrag","onDragCapture","onDragEnd","onDragEndCapture","onDragEnter","onDragEnterCapture","onDragExit","onDragExitCapture","onDragLeave","onDragLeaveCapture","onDragOver","onDragOverCapture","onDragStart","onDragStartCapture","onDrop","onDropCapture","onMouseDown","onMouseDownCapture","onMouseEnter","onMouseLeave","onMouseMove","onMouseMoveCapture","onMouseOut","onMouseOutCapture","onMouseOver","onMouseOverCapture","onMouseUp","onMouseUpCapture","onSelect","onSelectCapture","onTouchCancel","onTouchCancelCapture","onTouchEnd","onTouchEndCapture","onTouchMove","onTouchMoveCapture","onTouchStart","onTouchStartCapture","onPointerDown","onPointerDownCapture","onPointerMove","onPointerMoveCapture","onPointerUp","onPointerUpCapture","onPointerCancel","onPointerCancelCapture","onPointerEnter","onPointerEnterCapture","onPointerLeave","onPointerLeaveCapture","onPointerOver","onPointerOverCapture","onPointerOut","onPointerOutCapture","onGotPointerCapture","onGotPointerCaptureCapture","onLostPointerCapture","onLostPointerCaptureCapture","onScroll","onScrollCapture","onWheel","onWheelCapture","onAnimationStart","onAnimationStartCapture","onAnimationEnd","onAnimationEndCapture","onAnimationIteration","onAnimationIterationCapture","onTransitionEnd","onTransitionEndCapture"];function Ou(e){if(typeof e!="string")return!1;var t=$g;return t.includes(e)}var Ng=["aria-activedescendant","aria-atomic","aria-autocomplete","aria-busy","aria-checked","aria-colcount","aria-colindex","aria-colspan","aria-controls","aria-current","aria-describedby","aria-details","aria-disabled","aria-errormessage","aria-expanded","aria-flowto","aria-haspopup","aria-hidden","aria-invalid","aria-keyshortcuts","aria-label","aria-labelledby","aria-level","aria-live","aria-modal","aria-multiline","aria-multiselectable","aria-orientation","aria-owns","aria-placeholder","aria-posinset","aria-pressed","aria-readonly","aria-relevant","aria-required","aria-roledescription","aria-rowcount","aria-rowindex","aria-rowspan","aria-selected","aria-setsize","aria-sort","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext","className","color","height","id","lang","max","media","method","min","name","style","target","width","role","tabIndex","accentHeight","accumulate","additive","alignmentBaseline","allowReorder","alphabetic","amplitude","arabicForm","ascent","attributeName","attributeType","autoReverse","azimuth","baseFrequency","baselineShift","baseProfile","bbox","begin","bias","by","calcMode","capHeight","clip","clipPath","clipPathUnits","clipRule","colorInterpolation","colorInterpolationFilters","colorProfile","colorRendering","contentScriptType","contentStyleType","cursor","cx","cy","d","decelerate","descent","diffuseConstant","direction","display","divisor","dominantBaseline","dur","dx","dy","edgeMode","elevation","enableBackground","end","exponent","externalResourcesRequired","fill","fillOpacity","fillRule","filter","filterRes","filterUnits","floodColor","floodOpacity","focusable","fontFamily","fontSize","fontSizeAdjust","fontStretch","fontStyle","fontVariant","fontWeight","format","from","fx","fy","g1","g2","glyphName","glyphOrientationHorizontal","glyphOrientationVertical","glyphRef","gradientTransform","gradientUnits","hanging","horizAdvX","horizOriginX","href","ideographic","imageRendering","in2","in","intercept","k1","k2","k3","k4","k","kernelMatrix","kernelUnitLength","kerning","keyPoints","keySplines","keyTimes","lengthAdjust","letterSpacing","lightingColor","limitingConeAngle","local","markerEnd","markerHeight","markerMid","markerStart","markerUnits","markerWidth","mask","maskContentUnits","maskUnits","mathematical","mode","numOctaves","offset","opacity","operator","order","orient","orientation","origin","overflow","overlinePosition","overlineThickness","paintOrder","panose1","pathLength","patternContentUnits","patternTransform","patternUnits","pointerEvents","pointsAtX","pointsAtY","pointsAtZ","preserveAlpha","preserveAspectRatio","primitiveUnits","r","radius","refX","refY","renderingIntent","repeatCount","repeatDur","requiredExtensions","requiredFeatures","restart","result","rotate","rx","ry","seed","shapeRendering","slope","spacing","specularConstant","specularExponent","speed","spreadMethod","startOffset","stdDeviation","stemh","stemv","stitchTiles","stopColor","stopOpacity","strikethroughPosition","strikethroughThickness","string","stroke","strokeDasharray","strokeDashoffset","strokeLinecap","strokeLinejoin","strokeMiterlimit","strokeOpacity","strokeWidth","surfaceScale","systemLanguage","tableValues","targetX","targetY","textAnchor","textDecoration","textLength","textRendering","to","transform","u1","u2","underlinePosition","underlineThickness","unicode","unicodeBidi","unicodeRange","unitsPerEm","vAlphabetic","values","vectorEffect","version","vertAdvY","vertOriginX","vertOriginY","vHanging","vIdeographic","viewTarget","visibility","vMathematical","widths","wordSpacing","writingMode","x1","x2","x","xChannelSelector","xHeight","xlinkActuate","xlinkArcrole","xlinkHref","xlinkRole","xlinkShow","xlinkTitle","xlinkType","xmlBase","xmlLang","xmlns","xmlnsXlink","xmlSpace","y1","y2","y","yChannelSelector","z","zoomAndPan","ref","key","angle"],Rg=new Set(Ng);function ov(e){return typeof e!="string"?!1:Rg.has(e)}function uv(e){return typeof e=="string"&&e.startsWith("data-")}function wt(e){if(typeof e!="object"||e===null)return{};var t={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(ov(r)||uv(r))&&(t[r]=e[r]);return t}function Ln(e){if(e==null)return null;if(h.isValidElement(e)&&typeof e.props=="object"&&e.props!==null){var t=e.props;return wt(t)}return typeof e=="object"&&!Array.isArray(e)?wt(e):null}function Ge(e){var t={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(ov(r)||uv(r)||Ou(r))&&(t[r]=e[r]);return t}function Lg(e){return e==null?null:h.isValidElement(e)?Ge(e.props):typeof e=="object"&&!Array.isArray(e)?Ge(e):null}var Bg=["children","width","height","viewBox","className","style","title","desc"];function jo(){return jo=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var r=e.children,n=e.width,i=e.height,a=e.viewBox,o=e.className,u=e.style,l=e.title,c=e.desc,s=zg(e,Bg),f=a||{width:n,height:i,x:0,y:0},d=ne("recharts-surface",o);return h.createElement("svg",jo({},Ge(s),{className:d,width:n,height:i,style:u,viewBox:"".concat(f.x," ").concat(f.y," ").concat(f.width," ").concat(f.height),ref:t}),h.createElement("title",null,l),h.createElement("desc",null,c),r)}),Wg=["children","className"];function Do(){return Do=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var r=e.children,n=e.className,i=Ug(e,Wg),a=ne("recharts-layer",n);return h.createElement("g",Do({className:a},Ge(i),{ref:t}),r)});function $o(e){return e==="__proto__"}function cv(e){switch(typeof e){case"number":case"symbol":return!1;case"string":return e.includes(".")||e.includes("[")||e.includes("]")}}function Pu(e){var t;return typeof e=="string"||typeof e=="symbol"?e:Object.is((t=e==null?void 0:e.valueOf)==null?void 0:t.call(e),-0)?"-0":String(e)}function sv(e){if(e==null)return"";if(typeof e=="string")return e;if(Array.isArray(e))return e.map(sv).join(",");const t=String(e);return t==="0"&&Object.is(Number(e),-0)?"-0":t}function Su(e){if(Array.isArray(e))return e.map(Pu);if(typeof e=="symbol")return[e];e=sv(e);const t=[],r=e.length;if(r===0)return t;let n=0,i="",a="",o=!1;for(e.charCodeAt(0)===46&&t.push("");n1&&arguments[1]!==void 0?arguments[1]:Yg,r=10**t,n=Math.round(e*r)/r;return Object.is(n,-0)?0:n}function Se(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n{var u=r[o-1];return typeof u=="string"?i+u+a:u!==void 0?i+It(u)+a:i+a},"")}var We=e=>e===0?0:e>0?1:-1,At=e=>typeof e=="number"&&e!=+e,mr=e=>typeof e=="string"&&e.length>1&&e.indexOf("%")===e.length-1,D=e=>(typeof e=="number"||e instanceof Number)&&!At(e),Ot=e=>D(e)||typeof e=="string",Vg=0,Sn=e=>{var t=++Vg;return"".concat(e||"").concat(t)},ut=function(t,r){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;if(!D(t)&&typeof t!="string")return n;var a;if(mr(t)){if(r==null)return n;var o=t.indexOf("%");a=r*parseFloat(t.slice(0,o))/100}else a=+t;return At(a)&&(a=n),i&&r!=null&&a>r&&(a=r),a},fv=e=>{if(!Array.isArray(e))return!1;for(var t=e.length,r={},n=0;nn&&(typeof t=="function"?t(n):Tt(n,t))===r)}var ae=e=>e===null||typeof e>"u",Eu=e=>ae(e)?e:"".concat(e.charAt(0).toUpperCase()).concat(e.slice(1));function mt(e){return e!=null}function Or(){}function Iu(e){if(e)return{x:e.x,y:e.y,upperWidth:"upperWidth"in e?e.upperWidth:e.width,lowerWidth:"lowerWidth"in e?e.lowerWidth:e.width,width:e.width,height:e.height}}function ac(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function dt(e){for(var t=1;t{var t=e.viewBox,r=e.position,n=e.offset,i=n===void 0?0:n,a=e.parentViewBox,o=Iu(t),u=o.x,l=o.y,c=o.height,s=o.upperWidth,f=o.lowerWidth,d=u,v=u+(s-f)/2,p=(d+v)/2,m=(s+f)/2,y=d+s/2,g=c>=0?1:-1,x=g*i,A=g>0?"end":"start",w=g>0?"start":"end",O=s>=0?1:-1,b=O*i,S=O>0?"end":"start",I=O>0?"start":"end",_=a;if(r==="top"){var T={x:d+s/2,y:l-x,horizontalAnchor:"middle",verticalAnchor:A};return _&&(T.height=Math.max(l-_.y,0),T.width=s),T}if(r==="bottom"){var k={x:v+f/2,y:l+c+x,horizontalAnchor:"middle",verticalAnchor:w};return _&&(k.height=Math.max(_.y+_.height-(l+c),0),k.width=f),k}if(r==="left"){var E={x:p-b,y:l+c/2,horizontalAnchor:S,verticalAnchor:"middle"};return _&&(E.width=Math.max(E.x-_.x,0),E.height=c),E}if(r==="right"){var R={x:p+m+b,y:l+c/2,horizontalAnchor:I,verticalAnchor:"middle"};return _&&(R.width=Math.max(_.x+_.width-R.x,0),R.height=c),R}var $=_?{width:m,height:c}:{};return r==="insideLeft"?dt({x:p+b,y:l+c/2,horizontalAnchor:I,verticalAnchor:"middle"},$):r==="insideRight"?dt({x:p+m-b,y:l+c/2,horizontalAnchor:S,verticalAnchor:"middle"},$):r==="insideTop"?dt({x:d+s/2,y:l+x,horizontalAnchor:"middle",verticalAnchor:w},$):r==="insideBottom"?dt({x:v+f/2,y:l+c-x,horizontalAnchor:"middle",verticalAnchor:A},$):r==="insideTopLeft"?dt({x:d+b,y:l+x,horizontalAnchor:I,verticalAnchor:w},$):r==="insideTopRight"?dt({x:d+s-b,y:l+x,horizontalAnchor:S,verticalAnchor:w},$):r==="insideBottomLeft"?dt({x:v+b,y:l+c-x,horizontalAnchor:I,verticalAnchor:A},$):r==="insideBottomRight"?dt({x:v+f-b,y:l+c-x,horizontalAnchor:S,verticalAnchor:A},$):r&&typeof r=="object"&&(D(r.x)||mr(r.x))&&(D(r.y)||mr(r.y))?dt({x:u+ut(r.x,m),y:l+ut(r.y,c),horizontalAnchor:"end",verticalAnchor:"end"},$):dt({x:y,y:l+c/2,horizontalAnchor:"middle",verticalAnchor:"middle"},$)},Qg=["top","left","right","bottom"];function Jg(e){return e==null?!1:typeof e=="object"?!0:Qg.includes(e)}var e0=h.createContext(null);function ue(e){return function(){return e}}const No=Math.PI,Ro=2*No,or=1e-6,t0=Ro-or;function vv(e){this._+=e[0];for(let t=1,r=e.length;t=0))throw new Error(`invalid digits: ${e}`);if(t>15)return vv;const r=10**t;return function(n){this._+=n[0];for(let i=1,a=n.length;ior)if(!(Math.abs(f*l-c*s)>or)||!a)this._append`L${this._x1=t},${this._y1=r}`;else{let v=n-o,p=i-u,m=l*l+c*c,y=v*v+p*p,g=Math.sqrt(m),x=Math.sqrt(d),A=a*Math.tan((No-Math.acos((m+d-y)/(2*g*x)))/2),w=A/x,O=A/g;Math.abs(w-1)>or&&this._append`L${t+w*s},${r+w*f}`,this._append`A${a},${a},0,0,${+(f*v>s*p)},${this._x1=t+O*l},${this._y1=r+O*c}`}}arc(t,r,n,i,a,o){if(t=+t,r=+r,n=+n,o=!!o,n<0)throw new Error(`negative radius: ${n}`);let u=n*Math.cos(i),l=n*Math.sin(i),c=t+u,s=r+l,f=1^o,d=o?i-a:a-i;this._x1===null?this._append`M${c},${s}`:(Math.abs(this._x1-c)>or||Math.abs(this._y1-s)>or)&&this._append`L${c},${s}`,n&&(d<0&&(d=d%Ro+Ro),d>t0?this._append`A${n},${n},0,1,${f},${t-u},${r-l}A${n},${n},0,1,${f},${this._x1=c},${this._y1=s}`:d>or&&this._append`A${n},${n},0,${+(d>=No)},${f},${this._x1=t+n*Math.cos(a)},${this._y1=r+n*Math.sin(a)}`)}rect(t,r,n,i){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+r}h${n=+n}v${+i}h${-n}Z`}toString(){return this._}}function hv(e){let t=3;return e.digits=function(r){if(!arguments.length)return t;if(r==null)t=null;else{const n=Math.floor(r);if(!(n>=0))throw new RangeError(`invalid digits: ${r}`);t=n}return e},()=>new n0(t)}function _u(e){return typeof e=="object"&&"length"in e?e:Array.from(e)}function pv(e){this._context=e}pv.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:this._context.lineTo(e,t);break}}};function ma(e){return new pv(e)}function mv(e){return e[0]}function yv(e){return e[1]}function gv(e,t){var r=ue(!0),n=null,i=ma,a=null,o=hv(u);e=typeof e=="function"?e:e===void 0?mv:ue(e),t=typeof t=="function"?t:t===void 0?yv:ue(t);function u(l){var c,s=(l=_u(l)).length,f,d=!1,v;for(n==null&&(a=i(v=o())),c=0;c<=s;++c)!(c=v;--p)u.point(A[p],w[p]);u.lineEnd(),u.areaEnd()}g&&(A[d]=+e(y,d,f),w[d]=+t(y,d,f),u.point(n?+n(y,d,f):A[d],r?+r(y,d,f):w[d]))}if(x)return u=null,x+""||null}function s(){return gv().defined(i).curve(o).context(a)}return c.x=function(f){return arguments.length?(e=typeof f=="function"?f:ue(+f),n=null,c):e},c.x0=function(f){return arguments.length?(e=typeof f=="function"?f:ue(+f),c):e},c.x1=function(f){return arguments.length?(n=f==null?null:typeof f=="function"?f:ue(+f),c):n},c.y=function(f){return arguments.length?(t=typeof f=="function"?f:ue(+f),r=null,c):t},c.y0=function(f){return arguments.length?(t=typeof f=="function"?f:ue(+f),c):t},c.y1=function(f){return arguments.length?(r=f==null?null:typeof f=="function"?f:ue(+f),c):r},c.lineX0=c.lineY0=function(){return s().x(e).y(t)},c.lineY1=function(){return s().x(e).y(r)},c.lineX1=function(){return s().x(n).y(t)},c.defined=function(f){return arguments.length?(i=typeof f=="function"?f:ue(!!f),c):i},c.curve=function(f){return arguments.length?(o=f,a!=null&&(u=o(a)),c):o},c.context=function(f){return arguments.length?(f==null?a=u=null:u=o(a=f),c):a},c}class bv{constructor(t,r){this._context=t,this._x=r}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(t,r){switch(t=+t,r=+r,this._point){case 0:{this._point=1,this._line?this._context.lineTo(t,r):this._context.moveTo(t,r);break}case 1:this._point=2;default:{this._x?this._context.bezierCurveTo(this._x0=(this._x0+t)/2,this._y0,this._x0,r,t,r):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+r)/2,t,this._y0,t,r);break}}this._x0=t,this._y0=r}}function i0(e){return new bv(e,!0)}function a0(e){return new bv(e,!1)}function _i(){}function Ci(e,t,r){e._context.bezierCurveTo((2*e._x0+e._x1)/3,(2*e._y0+e._y1)/3,(e._x0+2*e._x1)/3,(e._y0+2*e._y1)/3,(e._x0+4*e._x1+t)/6,(e._y0+4*e._y1+r)/6)}function xv(e){this._context=e}xv.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:Ci(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:Ci(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function o0(e){return new xv(e)}function wv(e){this._context=e}wv.prototype={areaStart:_i,areaEnd:_i,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:{this._context.moveTo(this._x2,this._y2),this._context.closePath();break}case 2:{this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break}case 3:{this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4);break}}},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._x2=e,this._y2=t;break;case 1:this._point=2,this._x3=e,this._y3=t;break;case 2:this._point=3,this._x4=e,this._y4=t,this._context.moveTo((this._x0+4*this._x1+e)/6,(this._y0+4*this._y1+t)/6);break;default:Ci(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function u0(e){return new wv(e)}function Av(e){this._context=e}Av.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var r=(this._x0+4*this._x1+e)/6,n=(this._y0+4*this._y1+t)/6;this._line?this._context.lineTo(r,n):this._context.moveTo(r,n);break;case 3:this._point=4;default:Ci(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function l0(e){return new Av(e)}function Ov(e){this._context=e}Ov.prototype={areaStart:_i,areaEnd:_i,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(e,t){e=+e,t=+t,this._point?this._context.lineTo(e,t):(this._point=1,this._context.moveTo(e,t))}};function c0(e){return new Ov(e)}function oc(e){return e<0?-1:1}function uc(e,t,r){var n=e._x1-e._x0,i=t-e._x1,a=(e._y1-e._y0)/(n||i<0&&-0),o=(r-e._y1)/(i||n<0&&-0),u=(a*i+o*n)/(n+i);return(oc(a)+oc(o))*Math.min(Math.abs(a),Math.abs(o),.5*Math.abs(u))||0}function lc(e,t){var r=e._x1-e._x0;return r?(3*(e._y1-e._y0)/r-t)/2:t}function eo(e,t,r){var n=e._x0,i=e._y0,a=e._x1,o=e._y1,u=(a-n)/3;e._context.bezierCurveTo(n+u,i+u*t,a-u,o-u*r,a,o)}function ki(e){this._context=e}ki.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:eo(this,this._t0,lc(this,this._t0));break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){var r=NaN;if(e=+e,t=+t,!(e===this._x1&&t===this._y1)){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,eo(this,lc(this,r=uc(this,e,t)),r);break;default:eo(this,this._t0,r=uc(this,e,t));break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t,this._t0=r}}};function Pv(e){this._context=new Sv(e)}(Pv.prototype=Object.create(ki.prototype)).point=function(e,t){ki.prototype.point.call(this,t,e)};function Sv(e){this._context=e}Sv.prototype={moveTo:function(e,t){this._context.moveTo(t,e)},closePath:function(){this._context.closePath()},lineTo:function(e,t){this._context.lineTo(t,e)},bezierCurveTo:function(e,t,r,n,i,a){this._context.bezierCurveTo(t,e,n,r,a,i)}};function s0(e){return new ki(e)}function f0(e){return new Pv(e)}function Ev(e){this._context=e}Ev.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var e=this._x,t=this._y,r=e.length;if(r)if(this._line?this._context.lineTo(e[0],t[0]):this._context.moveTo(e[0],t[0]),r===2)this._context.lineTo(e[1],t[1]);else for(var n=cc(e),i=cc(t),a=0,o=1;o=0;--t)i[t]=(o[t]-i[t+1])/a[t];for(a[r-1]=(e[r]+i[r-1])/2,t=0;t=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:{if(this._t<=0)this._context.lineTo(this._x,t),this._context.lineTo(e,t);else{var r=this._x*(1-this._t)+e*this._t;this._context.lineTo(r,this._y),this._context.lineTo(r,t)}break}}this._x=e,this._y=t}};function v0(e){return new ya(e,.5)}function h0(e){return new ya(e,0)}function p0(e){return new ya(e,1)}function yr(e,t){if((o=e.length)>1)for(var r=1,n,i,a=e[t[0]],o,u=a.length;r=0;)r[t]=t;return r}function m0(e,t){return e[t]}function y0(e){const t=[];return t.key=e,t}function g0(){var e=ue([]),t=Lo,r=yr,n=m0;function i(a){var o=Array.from(e.apply(this,arguments),y0),u,l=o.length,c=-1,s;for(const f of a)for(u=0,++c;u0){for(var r,n,i=0,a=e[0].length,o;i0){for(var r=0,n=e[t[0]],i,a=n.length;r0)||!((a=(i=e[t[0]]).length)>0))){for(var r=0,n=1,i,a,o;n"radius"in e&&"startAngle"in e&&"endAngle"in e,Cu=(e,t)=>{if(!e||typeof e=="function"||typeof e=="boolean")return null;var r=e;if(h.isValidElement(e)&&(r=e.props),typeof r!="object"&&typeof r!="function")return null;var n={};return Object.keys(r).forEach(i=>{Ou(i)&&typeof r[i]=="function"&&(n[i]=(a=>r[i](r,a)))}),n},A0=(e,t,r)=>n=>(e(t,r,n),null),ku=(e,t,r)=>{if(e===null||typeof e!="object"&&typeof e!="function")return null;var n=null;return Object.keys(e).forEach(i=>{var a=e[i];Ou(i)&&typeof a=="function"&&(n||(n={}),n[i]=A0(a,t,r))}),n};function sc(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function O0(e){for(var t=1;t(o[u]===void 0&&n[u]!==void 0&&(o[u]=n[u]),o),r);return a}function I0(e,t){const r=new Map;for(let n=0;nObject.prototype.propertyIsEnumerable.call(e,t))}function En(e){return e==null?e===void 0?"[object Undefined]":"[object Null]":Object.prototype.toString.call(e)}const Cv="[object RegExp]",Tu="[object String]",Mu="[object Number]",ju="[object Boolean]",kv="[object Arguments]",Tv="[object Symbol]",Mv="[object Date]",jv="[object Map]",Dv="[object Set]",$v="[object Array]",T0="[object Function]",Nv="[object ArrayBuffer]",Ai="[object Object]",M0="[object Error]",Rv="[object DataView]",Lv="[object Uint8Array]",Bv="[object Uint8ClampedArray]",zv="[object Uint16Array]",Fv="[object Uint32Array]",j0="[object BigUint64Array]",Wv="[object Int8Array]",Uv="[object Int16Array]",Kv="[object Int32Array]",D0="[object BigInt64Array]",Hv="[object Float32Array]",Yv="[object Float64Array]",fc=typeof globalThis=="object"&&globalThis||typeof window=="object"&&window||typeof self=="object"&&self||typeof global=="object"&&global||(function(){return this})();function Fo(e){return typeof fc.Buffer<"u"&&fc.Buffer.isBuffer(e)}function $0(e,t){return cr(e,void 0,e,new Map,t)}function cr(e,t,r,n=new Map,i=void 0){const a=i==null?void 0:i(e,t,r,n);if(a!==void 0)return a;if(Bo(e))return e;if(n.has(e))return n.get(e);if(Array.isArray(e)){const o=new Array(e.length);n.set(e,o);for(let u=0;u{}):Wo(e,t,function n(i,a,o,u,l,c){const s=r(i,a,o,u,l,c);return s!==void 0?!!s:Wo(i,a,n,c,!1)},new Map,!0)}function Wo(e,t,r,n,i=!1){if(t===e)return!0;switch(typeof t){case"object":return L0(e,t,r,n);case"function":return Object.keys(t).length>0?Wo(e,{...t},r,n,i):wn(e,t);default:return Vv(e)&&i?typeof t=="string"?t==="":!0:wn(e,t)}}function L0(e,t,r,n){if(t==null)return!0;if(Array.isArray(t))return Xv(e,t,r,n);if(t instanceof Map)return B0(e,t,r,n);if(t instanceof Set)return z0(e,t,r,n);const i=Object.keys(t);if(e==null||Bo(e))return i.length===0;if(i.length===0)return!0;if(n!=null&&n.has(t))return n.get(t)===e;n==null||n.set(t,e);try{for(let a=0;a{})}function F0(e){return e=R0(e),t=>Gv(t,e)}function W0(e,t){return $0(e,(r,n,i,a)=>{if(typeof e=="object"){if(En(e)==="[object Object]"&&typeof e.constructor!="function"){const o={};return a.set(e,o),it(o,e,i,a),o}switch(Object.prototype.toString.call(e)){case Mu:case Tu:case ju:{const o=new e.constructor(e==null?void 0:e.valueOf());return it(o,e),o}case kv:{const o={};return it(o,e),o.length=e.length,o[Symbol.iterator]=e[Symbol.iterator],o}default:return}}})}function U0(e){return W0(e)}const K0=/^(?:0|[1-9]\d*)$/;function Zv(e,t=Number.MAX_SAFE_INTEGER){switch(typeof e){case"number":return Number.isInteger(e)&&e>=0&&e=0}function Qv(e){return e!=null&&typeof e!="function"&&X0(e.length)}function G0(e){return typeof e=="object"&&e!==null}function Z0(e){return G0(e)&&Qv(e)}function dc(e,t=_v){return Z0(e)?I0(Array.from(e),_0(q0(t),1)):[]}function Q0(e,t,r){return t===!0?dc(e,r):typeof t=="function"?dc(e,t):e}var to={exports:{}},ro={};/** * @license React * use-sync-external-store-shim/with-selector.production.js * @@ -76,4 +76,4 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function HM(e,t){if(e){if(typeof e=="string")return Bd(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Bd(e,t):void 0}}function Bd(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{if(!(n==null||r==null)){var o=t.map(l=>({value:l.value,coordinate:l.coordinate,offset:l.offset,index:l.index})),u=a.current;u!=null&&u.axisId===n&&u.axisType===r&&SM(u.ticks,o)||(a.current={ticks:o,axisId:n,axisType:r},i(zM({ticks:o,axisId:n,axisType:r})))}},[i,t,n,r]),h.useEffect(()=>n==null||r==null?Or:()=>{i(FM({axisId:n,axisType:r}))},[i,n,r]),null}var aj=h.forwardRef((e,t)=>{var r=e.ticks,n=r===void 0?[]:r,i=e.tick,a=e.tickLine,o=e.stroke,u=e.tickFormatter,l=e.unit,c=e.padding,s=e.tickTextProps,f=e.orientation,d=e.mirror,v=e.x,p=e.y,m=e.width,y=e.height,g=e.tickSize,x=e.tickMargin,A=e.fontSize,w=e.letterSpacing,O=e.getTicksConfig,b=e.events,S=e.axisType,I=e.axisId,_=NM(le(le({},O),{},{ticks:n}),A,w),T=wt(O),k=Ln(i),E=Ay(T.textAnchor)?T.textAnchor:tj(f,d),R=rj(f,d),$={};typeof a=="object"&&($=a);var F=le(le({},T),{},{fill:"none"},$),K=_.map(V=>le({entry:V},ej(V,v,p,m,y,f,g,d,x))),H=K.map(V=>{var W=V.entry,fe=V.line;return h.createElement(He,{className:"recharts-cartesian-axis-tick",key:"tick-".concat(W.value,"-").concat(W.coordinate,"-").concat(W.tickCoord)},a&&h.createElement("line",Ar({},F,fe,{className:ne("recharts-cartesian-axis-tick-line",Tt(a,"className"))})))}),L=K.map((V,W)=>{var fe,de,oe=V.entry,De=V.tick,Be=le(le(le(le({verticalAnchor:R},T),{},{textAnchor:E,stroke:"none",fill:o},De),{},{index:W,payload:oe,visibleTicksCount:_.length,tickFormatter:u,padding:c},s),{},{angle:(fe=(de=s==null?void 0:s.angle)!==null&&de!==void 0?de:T.angle)!==null&&fe!==void 0?fe:0}),rt=le(le({},Be),k);return h.createElement(He,Ar({className:"recharts-cartesian-axis-tick-label",key:"tick-label-".concat(oe.value,"-").concat(oe.coordinate,"-").concat(oe.tickCoord)},ku(b,oe,W)),i&&h.createElement(nj,{option:i,tickProps:rt,value:"".concat(typeof u=="function"?u(oe.value,W):oe.value).concat(l||"")}))});return h.createElement("g",{className:"recharts-cartesian-axis-ticks recharts-".concat(S,"-ticks")},h.createElement(ij,{ticks:_,axisId:I,axisType:S}),L.length>0&&h.createElement(st,{zIndex:_e.label},h.createElement("g",{className:"recharts-cartesian-axis-tick-labels recharts-".concat(S,"-tick-labels"),ref:t},L)),H.length>0&&h.createElement("g",{className:"recharts-cartesian-axis-tick-lines recharts-".concat(S,"-tick-lines")},H))}),oj=h.forwardRef((e,t)=>{var r=e.axisLine,n=e.width,i=e.height,a=e.className,o=e.hide,u=e.ticks,l=e.axisType,c=e.axisId,s=qM(e,UM),f=h.useState(""),d=Ld(f,2),v=d[0],p=d[1],m=h.useState(""),y=Ld(m,2),g=y[0],x=y[1],A=h.useRef(null);h.useImperativeHandle(t,()=>({getCalculatedWidth:()=>{var O;return RM({ticks:A.current,label:(O=e.labelRef)===null||O===void 0?void 0:O.current,labelGapWithTick:5,tickSize:e.tickSize,tickMargin:e.tickMargin})},getCalculatedHeight:()=>{var O;return LM({ticks:A.current,label:(O=e.labelRef)===null||O===void 0?void 0:O.current,labelGapWithTick:5,tickSize:e.tickSize,tickMargin:e.tickMargin})}}));var w=h.useCallback(O=>{if(O){var b=O.getElementsByClassName("recharts-cartesian-axis-tick-value");A.current=b;var S=b[0];if(S){var I=window.getComputedStyle(S),_=I.fontSize,T=I.letterSpacing;(_!==v||T!==g)&&(p(_),x(T))}}},[v,g]);return o||n!=null&&n<=0||i!=null&&i<=0?null:h.createElement(st,{zIndex:e.zIndex},h.createElement(He,{className:ne("recharts-cartesian-axis",a)},h.createElement(JM,{x:e.x,y:e.y,width:n,height:i,orientation:e.orientation,mirror:e.mirror,axisLine:r,otherSvgProps:wt(e)}),h.createElement(aj,{ref:w,axisType:l,events:s,fontSize:v,getTicksConfig:e,height:e.height,letterSpacing:g,mirror:e.mirror,orientation:e.orientation,padding:e.padding,stroke:e.stroke,tick:e.tick,tickFormatter:e.tickFormatter,tickLine:e.tickLine,tickMargin:e.tickMargin,tickSize:e.tickSize,tickTextProps:e.tickTextProps,ticks:u,unit:e.unit,width:e.width,x:e.x,y:e.y,axisId:c}),h.createElement(mk,{x:e.x,y:e.y,width:e.width,height:e.height,lowerWidth:e.width,upperWidth:e.width},h.createElement(Ek,{label:e.label,labelRef:e.labelRef}),e.children)))}),rg=h.forwardRef((e,t)=>{var r=Je(e,Ii);return h.createElement(oj,Ar({},r,{ref:t}))});rg.displayName="CartesianAxis";var uj=["animationElapsedTime","isAnimating","isEntrance","visibleLength","strokeDasharray","connectNulls"];function yu(){return yu=Object.assign?Object.assign.bind():function(e){for(var t=1;tv+p,0);if(!i)return ng(t,e);for(var a=Math.floor(e/i),o=e%i,u=[],l=0,c=0;lo){u=[...n.slice(0,l),o-c];break}}var d=u.length%2===0?[0,t]:[t];return[...dj(n,a),...u,...d].map(v=>"".concat(v,"px")).join(", ")}function hj(e,t,r){if(e){var n="".concat(e).split(/[,\s]+/gim).map(i=>parseFloat(i));return vj(r,t,n)}return ng(t,r)}function pj(e){e.animationElapsedTime,e.isAnimating,e.isEntrance;var t=e.visibleLength,r=e.strokeDasharray,n=e.connectNulls,i=lj(e,uj),a=n??!1,o;if(t!=null){var u,l=i.pathRef,c=sj((u=l==null?void 0:l.current)!==null&&u!==void 0?u:null);o=hj(r,c,t)}else r!=null&&(o=String(r));return h.createElement(Wh,yu({},i,{connectNulls:a,strokeDasharray:o}))}function mj(e){var t=h.useRef(0),r=h.useRef(0),n=h.useRef(!1),i=h.useRef(e);return i.current!==e&&(t.current=r.current,i.current=e),h.useCallback((a,o)=>{if(n.current)return null;var u=Math.min(It(t.current+a*o),o);return a>0&&o>0&&(r.current=Math.max(r.current,u),u>=o)?(n.current=!0,null):u},[])}var yj={},ig=Me({name:"errorBars",initialState:yj,reducers:{addErrorBar:(e,t)=>{var r=t.payload,n=r.itemId,i=r.errorBar;e[n]||(e[n]=[]),e[n].push(i)},replaceErrorBar:(e,t)=>{var r=t.payload,n=r.itemId,i=r.prev,a=r.next;e[n]&&(e[n]=e[n].map(o=>o.dataKey===i.dataKey&&o.direction===i.direction?a:o))},removeErrorBar:(e,t)=>{var r=t.payload,n=r.itemId,i=r.errorBar;e[n]&&(e[n]=e[n].filter(a=>a.dataKey!==i.dataKey||a.direction!==i.direction))}}}),Gl=ig.actions;Gl.addErrorBar;Gl.replaceErrorBar;Gl.removeErrorBar;var gj=ig.reducer,bj=["children"];function xj(e,t){if(e==null)return{};var r,n,i=wj(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n({x:0,y:0,value:0}),errorBarOffset:0},Oj=h.createContext(Aj);function ag(e){var t=e.children,r=xj(e,bj);return h.createElement(Oj.Provider,{value:r},t)}function Zl(e,t){var r,n,i=N(c=>zt(c,e)),a=N(c=>Ft(c,t)),o=(r=i==null?void 0:i.allowDataOverflow)!==null&&r!==void 0?r:pe.allowDataOverflow,u=(n=a==null?void 0:a.allowDataOverflow)!==null&&n!==void 0?n:nm.allowDataOverflow,l=o||u;return{needClip:l,needClipX:o,needClipY:u}}function og(e){var t=e.xAxisId,r=e.yAxisId,n=e.clipPathId,i=Xl(),a=Zl(t,r),o=a.needClipX,u=a.needClipY,l=a.needClip,c=N(A=>km(A,t,!1)),s=N(A=>Tm(A,r,!1));if(!l||!i)return null;var f=i.x,d=i.y,v=i.width,p=i.height,m=o&&c?Math.min(c[0],c[1]):f-v/2,y=u&&s?Math.min(s[0],s[1]):d-p/2,g=o&&c?Math.abs(c[1]-c[0]):v*2,x=u&&s?Math.abs(s[1]-s[0]):p*2;return h.createElement("clipPath",{id:"clipPath-".concat(n)},h.createElement("rect",{x:m,y,width:g,height:x}))}var ug=(e,t,r,n)=>Zt(e,"xAxis",t,n),lg=(e,t,r,n)=>Gt(e,"xAxis",t,n),cg=(e,t,r,n)=>Zt(e,"yAxis",r,n),sg=(e,t,r,n)=>Gt(e,"yAxis",r,n),Pj=P([Z,ug,cg,lg,sg],(e,t,r,n,i)=>Nt(e,"xAxis")?Kr(t,n,!1):Kr(r,i,!1)),Sj=(e,t,r,n,i)=>i;function Ej(e){return e.type==="line"}var Ij=P([Va,Sj],(e,t)=>e.filter(Ej).find(r=>r.id===t)),_j=P([Z,ug,cg,lg,sg,Ij,Pj,Yn],(e,t,r,n,i,a,o,u)=>{var l=u.chartData,c=u.dataStartIndex,s=u.dataEndIndex;if(!(a==null||t==null||r==null||n==null||i==null||n.length===0||i.length===0||o==null||e!=="horizontal"&&e!=="vertical")){var f=a.dataKey,d=a.data,v;if(d!=null&&d.length>0?v=d:v=l==null?void 0:l.slice(c,s+1),v!=null)return Gj({layout:e,xAxis:t,yAxis:r,xAxisTicks:n,yAxisTicks:i,dataKey:f,bandSize:o,displayedData:v})}});function Cj(e){var t=Ln(e),r=3,n=2;if(t!=null){var i=t.r,a=t.strokeWidth,o=Number(i),u=Number(a);return(Number.isNaN(o)||o<0)&&(o=r),(Number.isNaN(u)||u<0)&&(u=n),{r:o,strokeWidth:u}}return{r,strokeWidth:n}}var kj=["id"],Tj=["type","layout","connectNulls","needClip","shape","strokeDasharray"],Mj=["activeDot","animateNewValues","animationBegin","animationDuration","animationEasing","connectNulls","dot","hide","isAnimationActive","label","legendType","xAxisId","yAxisId","id"];function fa(){return fa=Object.assign?Object.assign.bind():function(e){for(var t=1;t0?t/r:0}var Bj=(e,t)=>{if(e==null)return[];if(t===1)return e.flatMap(u=>u.status==="removed"?[]:[u.next]);var r=Lj(e),n=[];for(var i of e)if(i.status==="matched")n.push(pt(pt({},i.next),{},{x:ve(i.prev.x,i.next.x,t),y:ve(i.prev.y,i.next.y,t)}));else if(i.status==="added")if(i.next.x!=null){var a=i.next.x-r;n.push(pt(pt({},i.next),{},{x:ve(a,i.next.x,t),y:i.next.y}))}else n.push(i.next);else if(i.status==="removed"&&i.prev.x!=null){var o=i.prev.x+r;n.push(pt(pt({},i.prev),{},{x:ve(i.prev.x,o,t),y:i.prev.y}))}return n},Jl={activeDot:!0,animateNewValues:!0,animationBegin:0,animationDuration:1500,animationEasing:"ease",animationInterpolateFn:Bj,animationMatchBy:Vl,connectNulls:!1,dot:!0,fill:"#fff",hide:!1,isAnimationActive:"auto",label:!1,legendType:"line",shape:pj,stroke:"#3182bd",strokeWidth:1,xAxisId:0,yAxisId:0,zIndex:_e.line,type:"linear"},zj=e=>{var t=e.dataKey,r=e.name,n=e.stroke,i=e.legendType,a=e.hide;return[{inactive:a,dataKey:t,type:i,color:n,value:Ca(r,t),payload:e}]},Fj=h.memo(e=>{var t=e.dataKey,r=e.data,n=e.stroke,i=e.strokeWidth,a=e.fill,o=e.name,u=e.hide,l=e.unit,c=e.formatter,s=e.tooltipType,f=e.id,d={dataDefinedOnItem:r,getPosition:Or,settings:{stroke:n,strokeWidth:i,fill:a,dataKey:t,nameKey:void 0,name:Ca(o,t),hide:u,type:s,color:n,unit:l,formatter:c,graphicalItemId:f}};return h.createElement(Fy,{tooltipEntrySettings:d})});function Wj(e){var t=e.clipPathId,r=e.points,n=e.props,i=n.dot,a=n.dataKey,o=n.needClip;n.id;var u=Ql(n,kj),l=wt(u);return h.createElement(MT,{points:r,dot:i,className:"recharts-line-dots",dotClassName:"recharts-line-dot",dataKey:a,baseProps:l,needClip:o,clipPathId:t})}function Uj(e){var t=e.showLabels,r=e.children,n=e.points,i=h.useMemo(()=>n==null?void 0:n.map(a=>{var o,u,l={x:(o=a.x)!==null&&o!==void 0?o:0,y:(u=a.y)!==null&&u!==void 0?u:0,width:0,lowerWidth:0,upperWidth:0,height:0};return pt(pt({},l),{},{value:a.value,payload:a.payload,viewBox:l,parentViewBox:void 0,fill:void 0})}),[n]);return h.createElement(Cy,{value:t?i:void 0},r)}function Kj(e){var t=e.clipPathId,r=e.pathRef,n=e.points,i=e.props,a=e.animationElapsedTime,o=e.isAnimating,u=e.isEntrance,l=e.visibleLength,c=i.type,s=i.layout,f=i.connectNulls,d=i.needClip,v=i.shape,p=i.strokeDasharray,m=Ql(i,Tj),y=pt(pt({},Ge(m)),{},{fill:"none",className:"recharts-line-curve",clipPath:d?"url(#clipPath-".concat(t,")"):void 0,points:n,type:c,layout:s,connectNulls:f,strokeDasharray:p??i.strokeDasharray,pathRef:r,animationElapsedTime:a,isAnimating:o,isEntrance:i.animateNewValues?u:!1,visibleLength:l});return h.createElement(h.Fragment,null,(n==null?void 0:n.length)>1&&h.createElement(Ry,{option:v,DefaultShape:Jl.shape,shapeProps:y}),h.createElement(Wj,{points:n,clipPathId:t,props:i}))}function Hj(e){var t=e.clipPathId,r=e.props,n=e.pathRef,i=e.previousPointsRef,a=r.points,o=r.isAnimationActive,u=r.animationBegin,l=r.animationDuration,c=r.animationEasing,s=r.animationMatchBy,f=r.animationInterpolateFn,d=r.layout,v=Rj(n.current),p=Ky(r.onAnimationStart,r.onAnimationEnd),m=p.isAnimating,y=p.handleAnimationStart,g=p.handleAnimationEnd,x=!m,A=mj(a),w=h.useCallback(O=>O>0&&v>0,[v]);return h.createElement(Uj,{points:a,showLabels:x},r.children,h.createElement(Hy,{animationInput:a,animationIdPrefix:"recharts-line-",items:a,previousItemsRef:i,isAnimationActive:o,animationBegin:u,animationDuration:l,animationEasing:c,onAnimationStart:y,onAnimationEnd:g,animationInterpolateFn:f,animationMatchBy:s,shouldUpdatePreviousRef:w,layout:d},(O,b,S)=>{var I=m||b<1,_=I?A(b,v):null;return h.createElement(Kj,{props:r,points:O,clipPathId:t,pathRef:n,animationElapsedTime:b,isAnimating:I,isEntrance:S,visibleLength:_})}),h.createElement(Ty,{label:r.label}))}function Yj(e){var t=e.clipPathId,r=e.props,n=h.useRef(null),i=h.useRef(null);return h.createElement(Hj,{props:r,clipPathId:t,previousPointsRef:n,pathRef:i})}var Vj=(e,t)=>{var r,n;return{x:(r=e.x)!==null&&r!==void 0?r:void 0,y:(n=e.y)!==null&&n!==void 0?n:void 0,value:e.value,errorVal:se(e.payload,t)}};class qj extends h.Component{render(){var t=this.props,r=t.hide,n=t.dot,i=t.points,a=t.className,o=t.xAxisId,u=t.yAxisId,l=t.top,c=t.left,s=t.width,f=t.height,d=t.id,v=t.needClip,p=t.zIndex;if(r)return null;var m=ne("recharts-line",a),y=d,g=Cj(n),x=g.r,A=g.strokeWidth,w=$y(n),O=x*2+A,b=v?"url(#clipPath-".concat(w?"":"dots-").concat(y,")"):void 0;return h.createElement(st,{zIndex:p},h.createElement(He,{className:m},v&&h.createElement("defs",null,h.createElement(og,{clipPathId:y,xAxisId:o,yAxisId:u}),!w&&h.createElement("clipPath",{id:"clipPath-dots-".concat(y)},h.createElement("rect",{x:c-O/2,y:l-O/2,width:s+O,height:f+O}))),h.createElement(ag,{xAxisId:o,yAxisId:u,data:i,dataPointFormatter:Vj,errorBarOffset:0},h.createElement(Yj,{props:this.props,clipPathId:y}))),h.createElement(XT,{activeDot:this.props.activeDot,points:i,mainColor:this.props.stroke,itemDataKey:this.props.dataKey,clipPath:b}))}}function Xj(e){var t=Je(e,Jl),r=t.activeDot,n=t.animateNewValues,i=t.animationBegin,a=t.animationDuration,o=t.animationEasing,u=t.connectNulls,l=t.dot,c=t.hide,s=t.isAnimationActive,f=t.label,d=t.legendType,v=t.xAxisId,p=t.yAxisId,m=t.id,y=Ql(t,Mj),g=Zl(v,p),x=g.needClip,A=Xl(),w=Pr(),O=Le(),b=N(k=>_j(k,v,p,O,m));if(w!=="horizontal"&&w!=="vertical"||b==null||A==null)return null;var S=A.height,I=A.width,_=A.x,T=A.y;return h.createElement(qj,fa({},y,{id:m,connectNulls:u,dot:l,activeDot:r,animateNewValues:n,animationBegin:i,animationDuration:a,animationEasing:o,isAnimationActive:s,hide:c,label:f,legendType:d,xAxisId:v,yAxisId:p,points:b,layout:w,height:S,width:I,left:_,top:T,needClip:x}))}function Gj(e){var t=e.layout,r=e.xAxis,n=e.yAxis,i=e.xAxisTicks,a=e.yAxisTicks,o=e.dataKey,u=e.bandSize,l=e.displayedData;return l.map((c,s)=>{var f=se(c,o);if(t==="horizontal"){var d=Nc({axis:r,ticks:i,bandSize:u,entry:c,index:s}),v=ae(f)?null:n.scale.map(f);return{x:d,y:v??null,value:f,payload:c}}var p=ae(f)?null:r.scale.map(f),m=Nc({axis:n,ticks:a,bandSize:u,entry:c,index:s});return p==null||m==null?null:{x:p,y:m,value:f,payload:c}}).filter(Boolean)}function Zj(e){var t=Je(e,Jl),r=Le();return h.createElement(Yy,{id:t.id,type:"line"},n=>h.createElement(h.Fragment,null,h.createElement(Wy,{legendPayload:zj(t)}),h.createElement(Fj,{dataKey:t.dataKey,data:t.data,stroke:t.stroke,strokeWidth:t.strokeWidth,fill:t.fill,name:t.name,hide:t.hide,unit:t.unit,formatter:t.formatter,tooltipType:t.tooltipType,id:n}),h.createElement(qy,{type:"line",id:n,data:t.data,xAxisId:t.xAxisId,yAxisId:t.yAxisId,zAxisId:0,dataKey:t.dataKey,hide:t.hide,isPanorama:r}),h.createElement(Xj,fa({},t,{id:n}))))}var Qj=h.memo(Zj,Kn);Qj.displayName="Line";function _r(e,t){var r,n;return(r=(n=e.graphicalItems.cartesianItems.find(i=>i.id===t))===null||n===void 0?void 0:n.xAxisId)!==null&&r!==void 0?r:Xy}function Cr(e,t){var r,n;return(r=(n=e.graphicalItems.cartesianItems.find(i=>i.id===t))===null||n===void 0?void 0:n.yAxisId)!==null&&r!==void 0?r:Xy}var Jj="Invariant failed";function eD(e,t){throw new Error(Jj)}var tD=["option"];function rD(e,t){if(e==null)return{};var r,n,i=nD(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n1&&arguments[1]!==void 0?arguments[1]:0;return(n,i)=>{if(D(t))return t;var a=D(n)||ae(n);return a?t(n,i):(a||eD(),r)}},aD=(e,t,r)=>r,oD=(e,t)=>t,ni=P([Va,oD],(e,t)=>e.filter(r=>r.type==="bar").find(r=>r.id===t)),uD=P([ni],e=>e==null?void 0:e.maxBarSize),lD=(e,t,r,n)=>n,cD=P([Z,Va,_r,Cr,aD],(e,t,r,n,i)=>t.filter(a=>e==="horizontal"?a.xAxisId===r:a.yAxisId===n).filter(a=>a.isPanorama===i).filter(a=>a.hide===!1).filter(a=>a.type==="bar")),sD=(e,t,r)=>{var n=Z(e),i=_r(e,t),a=Cr(e,t);if(!(i==null||a==null))return n==="horizontal"?du(e,"yAxis",a,r):du(e,"xAxis",i,r)},fD=(e,t)=>{var r=Z(e),n=_r(e,t),i=Cr(e,t);if(!(n==null||i==null))return r==="horizontal"?Lf(e,"xAxis",n):Lf(e,"yAxis",i)},dD=P([cD,lO,fD],tM),vD=(e,t,r)=>{var n,i,a=ni(e,t);if(a==null)return 0;var o=_r(e,t),u=Cr(e,t);if(o==null||u==null)return 0;var l=Z(e),c=cp(e),s=a.maxBarSize,f=ae(s)?c:s,d,v;return l==="horizontal"?(d=Zt(e,"xAxis",o,r),v=Gt(e,"xAxis",o,r)):(d=Zt(e,"yAxis",u,r),v=Gt(e,"yAxis",u,r)),(n=(i=Kr(d,v,!0))!==null&&i!==void 0?i:f)!==null&&n!==void 0?n:0},fg=(e,t,r)=>{var n=Z(e),i=_r(e,t),a=Cr(e,t);if(!(i==null||a==null)){var o,u;return n==="horizontal"?(o=Zt(e,"xAxis",i,r),u=Gt(e,"xAxis",i,r)):(o=Zt(e,"yAxis",a,r),u=Gt(e,"yAxis",a,r)),Kr(o,u)}},hD=P([dD,cp,uO,sp,vD,fg,uD],oM),pD=(e,t,r)=>{var n=_r(e,t);if(n!=null)return Zt(e,"xAxis",n,r)},mD=(e,t,r)=>{var n=Cr(e,t);if(n!=null)return Zt(e,"yAxis",n,r)},yD=(e,t,r)=>{var n=_r(e,t);if(n!=null)return Gt(e,"xAxis",n,r)},gD=(e,t,r)=>{var n=Cr(e,t);if(n!=null)return Gt(e,"yAxis",n,r)},bD=P([hD,ni],lM),xD=P([sD,ni],uM),wD=P([xe,Dh,pD,mD,yD,gD,bD,Z,H1,fg,xD,ni,lD],(e,t,r,n,i,a,o,u,l,c,s,f,d)=>{var v=l.chartData,p=l.dataStartIndex,m=l.dataEndIndex;if(!(f==null||o==null||t==null||u!=="horizontal"&&u!=="vertical"||r==null||n==null||i==null||a==null||c==null)){var y=f.data,g;if(y!=null&&y.length>0?g=y:g=v==null?void 0:v.slice(p,m+1),g!=null)return e$({layout:u,barSettings:f,pos:o,parentViewBox:t,bandSize:c,xAxis:r,yAxis:n,xAxisTicks:i,yAxisTicks:a,stackedData:s,displayedData:g,offset:e,cells:d,dataStartIndex:p})}}),AD=["index"];function gu(){return gu=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var t=h.useContext(dg);if(t!=null)return t.stackId;if(e!=null)return Bx(e)},ED=(e,t)=>"recharts-bar-stack-clip-path-".concat(e,"-").concat(t),ID=e=>{var t=h.useContext(dg);if(t!=null){var r=t.stackId;return"url(#".concat(ED(r,e),")")}},vg=e=>{var t=e.index,r=OD(e,AD),n=ID(t);return h.createElement(He,gu({className:"recharts-bar-stack-layer",clipPath:n},r))},_D=["onMouseEnter","onMouseLeave","onClick"],CD=["value","background","tooltipPosition"],kD=["id"],TD=["onMouseEnter","onClick","onMouseLeave"];function Wd(e,t){return $D(e)||DD(e,t)||jD(e,t)||MD()}function MD(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function jD(e,t){if(e){if(typeof e=="string")return Ud(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Ud(e,t):void 0}}function Ud(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{var t=e.dataKey,r=e.name,n=e.fill,i=e.legendType,a=e.hide;return[{inactive:a,dataKey:t,type:i,color:n,value:Ca(r,t),payload:e}]},FD=h.memo(e=>{var t=e.dataKey,r=e.stroke,n=e.strokeWidth,i=e.fill,a=e.name,o=e.hide,u=e.unit,l=e.formatter,c=e.tooltipType,s=e.id,f={dataDefinedOnItem:void 0,getPosition:Or,settings:{stroke:r,strokeWidth:n,fill:i,dataKey:t,nameKey:void 0,name:Ca(a,t),hide:o,type:c,color:i,unit:u,formatter:l,graphicalItemId:s}};return h.createElement(Fy,{tooltipEntrySettings:f})});function WD(e){var t=N(wr),r=e.data,n=e.dataKey,i=e.background,a=e.allOtherBarProps,o=a.onMouseEnter,u=a.onMouseLeave,l=a.onClick,c=da(a,_D),s=Ly(o,n,a.id),f=By(u),d=zy(l,n,a.id);if(!i||r==null)return null;var v=Ln(i);return h.createElement(st,{zIndex:cM(i,_e.barBackground)},r.map((p,m)=>{p.value;var y=p.background;p.tooltipPosition;var g=da(p,CD);if(!y)return null;var x=s(p,p.originalDataIndex),A=f(p,p.originalDataIndex),w=d(p,p.originalDataIndex),O=me(me(me(me(me({option:i,isActive:String(p.originalDataIndex)===t},g),{},{fill:"#eee"},y),v),ku(c,p,m)),{},{onMouseEnter:x,onMouseLeave:A,onClick:w,dataKey:n,index:m,className:"recharts-bar-background-rectangle"});return h.createElement(tc,Qt({key:"background-bar-".concat(m)},O))}))}function UD(e){var t=e.showLabels,r=e.children,n=e.rects,i=n==null?void 0:n.map(a=>{var o={x:a.x,y:a.y,width:a.width,lowerWidth:a.width,upperWidth:a.width,height:a.height};return me(me({},o),{},{value:a.value,payload:a.payload,parentViewBox:a.parentViewBox,viewBox:o,fill:a.fill})});return h.createElement(Cy,{value:t?i:void 0},r)}function KD(e){var t=e.shape,r=e.activeBar,n=e.baseProps,i=e.entry,a=e.index,o=e.dataKey,u=N(wr),l=N(ay),c=r&&String(i.originalDataIndex)===u&&(l==null||o===l),s=u!=null&&(String(i.originalDataIndex)!==u||l!=null&&o!==l),f=h.useState(!1),d=Wd(f,2),v=d[0],p=d[1],m=h.useState(!1),y=Wd(m,2),g=y[0],x=y[1];h.useEffect(()=>{var I;return c?(p(!0),I=requestAnimationFrame(()=>{x(!0)})):(x(!1),s&&p(!1)),()=>{cancelAnimationFrame(I)}},[c,s]);var A=h.useCallback(()=>{c||p(!1)},[c]),w=c&&g,O=c||v,b;c?r===!0?b=t:b=r:b=t;var S=h.createElement(tc,Qt({},n,{name:String(n.name)},i,{isActive:w,option:b,index:a,dataKey:o,animationElapsedTime:e.animationElapsedTime,isAnimating:e.isAnimating,isEntrance:e.isEntrance,onTransitionEnd:A}));return O?h.createElement(st,{zIndex:_e.activeBar},h.createElement(vg,{index:i.originalDataIndex},S)):S}function HD(e){var t=e.shape,r=e.baseProps,n=e.entry,i=e.index,a=e.dataKey;return h.createElement(tc,Qt({},r,{name:String(r.name)},n,{isActive:!1,option:t,index:i,dataKey:a,animationElapsedTime:e.animationElapsedTime,isAnimating:e.isAnimating,isEntrance:e.isEntrance}))}function YD(e){var t,r=e.data,n=e.props,i=e.animationElapsedTime,a=e.isAnimating,o=e.isEntrance,u=(t=wt(n))!==null&&t!==void 0?t:{},l=u.id,c=da(u,kD),s=n.shape,f=n.dataKey,d=n.activeBar,v=n.onMouseEnter,p=n.onClick,m=n.onMouseLeave,y=da(n,TD),g=Ly(v,f,l),x=By(m),A=zy(p,f,l);return r?h.createElement(h.Fragment,null,r.map((w,O)=>h.createElement(vg,Qt({index:w.originalDataIndex,key:"rectangle-".concat(w==null?void 0:w.x,"-").concat(w==null?void 0:w.y,"-").concat(w==null?void 0:w.value,"-").concat(O),className:"recharts-bar-rectangle"},ku(y,w,O),{onMouseEnter:g(w,w.originalDataIndex),onMouseLeave:x(w,w.originalDataIndex),onClick:A(w,w.originalDataIndex)}),d?h.createElement(KD,{shape:s,activeBar:d,baseProps:c,entry:w,index:O,dataKey:f,animationElapsedTime:i,isAnimating:a,isEntrance:o}):h.createElement(HD,{shape:s,baseProps:c,entry:w,index:O,dataKey:f,animationElapsedTime:i,isAnimating:a,isEntrance:o})))):null}var VD=(e,t,r)=>e==null?[]:t===1?e.flatMap(n=>n.status==="removed"?[]:[n.next]):e.flatMap(n=>{if(n.status==="removed")return r==="horizontal"?[me(me({},n.prev),{},{height:ve(n.prev.height,0,t),y:ve(n.prev.y,n.prev.y+n.prev.height,t)})]:[me(me({},n.prev),{},{width:ve(n.prev.width,0,t)})];if(n.status==="matched")return[me(me({},n.next),{},{x:ve(n.prev.x,n.next.x,t),y:ve(n.prev.y,n.next.y,t),width:ve(n.prev.width,n.next.width,t),height:ve(n.prev.height,n.next.height,t)})];var i=n.next;return r==="horizontal"?[me(me({},i),{},{height:ve(0,i.height,t),y:ve(i.stackedBarStart,i.y,t)})]:[me(me({},i),{},{width:ve(0,i.width,t),x:ve(i.stackedBarStart,i.x,t)})]});function qD(e){var t=e.props,r=e.previousRectanglesRef,n=t.data,i=t.isAnimationActive,a=t.animationBegin,o=t.animationDuration,u=t.animationEasing,l=t.animationInterpolateFn,c=t.layout,s=Ky(t.onAnimationStart,t.onAnimationEnd),f=s.isAnimating,d=s.handleAnimationStart,v=s.handleAnimationEnd;return h.createElement(UD,{showLabels:!f,rects:n},h.createElement(Hy,{animationInput:n,animationIdPrefix:"recharts-bar-",items:n,previousItemsRef:r,isAnimationActive:i,animationBegin:a,animationDuration:o,animationEasing:u,onAnimationStart:d,onAnimationEnd:v,animationInterpolateFn:l,animationMatchBy:t.animationMatchBy,layout:c},(p,m,y)=>h.createElement(He,null,h.createElement(YD,{props:t,data:p,animationElapsedTime:m,isAnimating:f||m<1,isEntrance:y}))),h.createElement(Ty,{label:t.label}),t.children)}function XD(e){var t=h.useRef(null);return h.createElement(qD,{previousRectanglesRef:t,props:e})}var hg=0,GD=(e,t)=>{var r=Array.isArray(e.value)?e.value[1]:e.value;return{x:e.x,y:e.y,value:r,errorVal:se(e,t)}};class ZD extends h.PureComponent{render(){var t=this.props,r=t.hide,n=t.data,i=t.dataKey,a=t.className,o=t.xAxisId,u=t.yAxisId,l=t.needClip,c=t.background,s=t.id;if(r||n==null)return null;var f=ne("recharts-bar",a),d=s;return h.createElement(He,{className:f,id:s},l&&h.createElement("defs",null,h.createElement(og,{clipPathId:d,xAxisId:o,yAxisId:u})),h.createElement(He,{className:"recharts-bar-rectangles",clipPath:l?"url(#clipPath-".concat(d,")"):void 0},h.createElement(WD,{data:n,dataKey:i,background:c,allOtherBarProps:this.props}),h.createElement(XD,this.props)))}}var QD={activeBar:!1,animationBegin:0,animationDuration:400,animationEasing:"ease",animationInterpolateFn:VD,animationMatchBy:Uy,background:!1,hide:!1,isAnimationActive:"auto",label:!1,legendType:"rect",minPointSize:hg,shape:ec,xAxisId:0,yAxisId:0,zIndex:_e.bar};function JD(e){var t=e.xAxisId,r=e.yAxisId,n=e.hide,i=e.legendType,a=e.minPointSize,o=e.activeBar,u=e.animationBegin,l=e.animationDuration,c=e.animationEasing,s=e.isAnimationActive,f=Zl(t,r),d=f.needClip,v=Pr(),p=Le(),m=Bk(e.children,my),y=N(A=>wD(A,e.id,p,m));if(v!=="vertical"&&v!=="horizontal")return null;var g,x=y==null?void 0:y[0];return x==null||x.height==null||x.width==null?g=0:g=v==="vertical"?x.height/2:x.width/2,h.createElement(ag,{xAxisId:t,yAxisId:r,data:y,dataPointFormatter:GD,errorBarOffset:g},h.createElement(ZD,Qt({},e,{layout:v,needClip:d,data:y,xAxisId:t,yAxisId:r,hide:n,legendType:i,minPointSize:a,activeBar:o,animationBegin:u,animationDuration:l,animationEasing:c,isAnimationActive:s})))}function e$(e){var t=e.layout,r=e.barSettings,n=r.dataKey,i=r.minPointSize,a=r.hasCustomShape,o=e.pos,u=e.bandSize,l=e.xAxis,c=e.yAxis,s=e.xAxisTicks,f=e.yAxisTicks,d=e.stackedData,v=e.displayedData,p=e.offset,m=e.cells,y=e.parentViewBox,g=e.dataStartIndex,x=t==="horizontal"?c:l,A=d?x.scale.domain():null,w=zx({numericAxis:x}),O=x.scale.map(w);return v.map((b,S)=>{var I,_,T,k,E,R;if(d){var $=d[S+g];if($==null)return null;I=Dx($,A)}else I=se(b,n),Array.isArray(I)||(I=[w,I]);var F=iD(i,hg)(I[1],S);if(t==="horizontal"){var K,H=c.scale.map(I[0]),L=c.scale.map(I[1]);if(H==null||L==null)return null;_=Rc({axis:l,ticks:s,bandSize:u,offset:o.offset,entry:b,index:S}),T=(K=L??H)!==null&&K!==void 0?K:void 0,k=o.size;var V=H-L;if(E=At(V)?0:V,R={x:_,y:p.top,width:k,height:p.height},Math.abs(F)>0&&Math.abs(E)0&&Math.abs(k)h.createElement(h.Fragment,null,h.createElement(Wy,{legendPayload:zD(t)}),h.createElement(FD,{dataKey:t.dataKey,stroke:t.stroke,strokeWidth:t.strokeWidth,fill:t.fill,name:t.name,hide:t.hide,unit:t.unit,formatter:t.formatter,tooltipType:t.tooltipType,id:i}),h.createElement(qy,{type:"bar",id:i,data:void 0,xAxisId:t.xAxisId,yAxisId:t.yAxisId,zAxisId:0,dataKey:t.dataKey,stackId:r,hide:t.hide,barSize:t.barSize,minPointSize:t.minPointSize,maxBarSize:t.maxBarSize,isPanorama:n,hasCustomShape:t.shape!=null&&t.shape!==ec}),h.createElement(st,{zIndex:t.zIndex},h.createElement(JD,Qt({},t,{id:i})))))}var r$=h.memo(t$,Kn);r$.displayName="Bar";var n$=["domain","range"],i$=["domain","range"];function Hd(e,t){if(e==null)return{};var r,n,i=a$(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n{if(o!=null)return qd(qd({},a),{},{type:o})},[a,o]);return h.useLayoutEffect(()=>{u!=null&&(r.current===null?t(RT(u)):r.current!==u&&t(LT({prev:r.current,next:u})),r.current=u)},[u,t]),h.useLayoutEffect(()=>()=>{r.current&&(t(BT(r.current)),r.current=null)},[t]),null}var p$=e=>{var t=e.xAxisId,r=e.className,n=e.height,i=e.label,a=h.useRef(null),o=h.useRef(null),u=N(Dh),l=Le(),c=ce(),s="xAxis",f=N(g=>QE(g,s,t,l)),d=N(g=>Nm(g,t)),v=N(g=>qE(g,t)),p=N(g=>rm(g,t));if(h.useLayoutEffect(()=>{if(!(n!=="auto"||!d||Yl(i)||h.isValidElement(i)||p==null)){var g=a.current;if(g){var x=g.getCalculatedHeight();Math.round(d.height)!==Math.round(x)&&c(zT({id:t,height:x}))}}},[f,d,c,i,t,n,p]),d==null||v==null||p==null)return null;e.dangerouslySetInnerHTML,e.ticks,e.scale;var m=xu(e,l$);p.id,p.scale;var y=xu(p,c$);return h.createElement(rg,bu({},m,y,{ref:a,labelRef:o,x:v.x,y:v.y,width:d.width,height:d.height,className:ne("recharts-".concat(s," ").concat(s),r),viewBox:u,ticks:f,axisType:s,axisId:t}))},m$={allowDataOverflow:pe.allowDataOverflow,allowDecimals:pe.allowDecimals,allowDuplicatedCategory:pe.allowDuplicatedCategory,angle:pe.angle,axisLine:Ii.axisLine,height:pe.height,hide:!1,includeHidden:pe.includeHidden,interval:pe.interval,label:!1,minTickGap:pe.minTickGap,mirror:pe.mirror,orientation:pe.orientation,padding:pe.padding,reversed:pe.reversed,scale:pe.scale,tick:pe.tick,tickCount:pe.tickCount,tickLine:Ii.tickLine,tickSize:Ii.tickSize,type:pe.type,niceTicks:pe.niceTicks,xAxisId:0},y$=e=>{var t=Je(e,m$);return h.createElement(h.Fragment,null,h.createElement(h$,{allowDataOverflow:t.allowDataOverflow,allowDecimals:t.allowDecimals,allowDuplicatedCategory:t.allowDuplicatedCategory,angle:t.angle,dataKey:t.dataKey,domain:t.domain,height:t.height,hide:t.hide,id:t.xAxisId,includeHidden:t.includeHidden,interval:t.interval,minTickGap:t.minTickGap,mirror:t.mirror,name:t.name,orientation:t.orientation,padding:t.padding,reversed:t.reversed,scale:t.scale,tick:t.tick,tickCount:t.tickCount,tickFormatter:t.tickFormatter,ticks:t.ticks,type:t.type,unit:t.unit,niceTicks:t.niceTicks}),h.createElement(p$,t))},g$=h.memo(y$,o$);g$.displayName="XAxis";var b$=(e,t)=>t,rc=P([b$,Z,yp,Ae,ty,Wt,x_,xe],I_);function x$(e){return"getBBox"in e.currentTarget&&typeof e.currentTarget.getBBox=="function"}function nc(e){var t=e.currentTarget.getBoundingClientRect(),r,n;if(x$(e)){var i=e.currentTarget.getBBox();r=i.width>0?t.width/i.width:1,n=i.height>0?t.height/i.height:1}else{var a=e.currentTarget;r=a.offsetWidth>0?t.width/a.offsetWidth:1,n=a.offsetHeight>0?t.height/a.offsetHeight:1}var o=(u,l)=>({relativeX:Math.round((u-t.left)/r),relativeY:Math.round((l-t.top)/n)});return"touches"in e?Array.from(e.touches).map(u=>o(u.clientX,u.clientY)):o(e.clientX,e.clientY)}var pg=Ye("mouseClick"),mg=zn();mg.startListening({actionCreator:pg,effect:(e,t)=>{var r=e.payload,n=rc(t.getState(),nc(r));(n==null?void 0:n.activeIndex)!=null&&t.dispatch(vI({activeIndex:n.activeIndex,activeDataKey:void 0,activeCoordinate:n.activeCoordinate}))}});var wu=Ye("mouseMove"),yg=zn(),$r=null,nr=null,To=null;yg.startListening({actionCreator:wu,effect:(e,t)=>{var r=e.payload,n=t.getState(),i=n.eventSettings,a=i.throttleDelay,o=i.throttledEvents,u=o==="all"||(o==null?void 0:o.includes("mousemove"));$r!==null&&(cancelAnimationFrame($r),$r=null),nr!==null&&(typeof a!="number"||!u)&&(clearTimeout(nr),nr=null),To=nc(r);var l=()=>{var c=t.getState(),s=ti(c,c.tooltip.settings.shared);if(!To){$r=null,nr=null;return}if(s==="axis"){var f=rc(c,To);(f==null?void 0:f.activeIndex)!=null?t.dispatch(Hm({activeIndex:f.activeIndex,activeDataKey:void 0,activeCoordinate:f.activeCoordinate})):t.dispatch(Km())}$r=null,nr=null};if(!u){l();return}a==="raf"?$r=requestAnimationFrame(l):typeof a=="number"&&nr===null&&(nr=setTimeout(l,a))}});function w$(e,t){return t instanceof HTMLElement?"HTMLElement <".concat(t.tagName,' class="').concat(t.className,'">'):t===window?"global.window":e==="children"&&typeof t=="object"&&t!==null?"<>":t}var Xd={accessibilityLayer:!0,barCategoryGap:"10%",barGap:4,barSize:void 0,className:void 0,maxBarSize:void 0,stackOffset:"none",syncId:void 0,syncMethod:"index",baseValue:void 0,reverseStackOrder:!1},gg=Me({name:"rootProps",initialState:Xd,reducers:{updateOptions:(e,t)=>{var r;e.accessibilityLayer=t.payload.accessibilityLayer,e.barCategoryGap=t.payload.barCategoryGap,e.barGap=(r=t.payload.barGap)!==null&&r!==void 0?r:Xd.barGap,e.barSize=t.payload.barSize,e.maxBarSize=t.payload.maxBarSize,e.stackOffset=t.payload.stackOffset,e.syncId=t.payload.syncId,e.syncMethod=t.payload.syncMethod,e.className=t.payload.className,e.baseValue=t.payload.baseValue,e.reverseStackOrder=t.payload.reverseStackOrder}}}),A$=gg.reducer,O$=gg.actions.updateOptions,P$=null,S$={updatePolarOptions:(e,t)=>e===null?t.payload:(e.startAngle=t.payload.startAngle,e.endAngle=t.payload.endAngle,e.cx=t.payload.cx,e.cy=t.payload.cy,e.innerRadius=t.payload.innerRadius,e.outerRadius=t.payload.outerRadius,e)},bg=Me({name:"polarOptions",initialState:P$,reducers:S$});bg.actions.updatePolarOptions;var E$=bg.reducer,xg=Ye("keyDown"),wg=Ye("focus"),Ag=Ye("blur"),Ja=zn(),Nr=null,ir=null,xi=null;Ja.startListening({actionCreator:xg,effect:(e,t)=>{xi=e.payload,Nr!==null&&(cancelAnimationFrame(Nr),Nr=null);var r=t.getState(),n=r.eventSettings,i=n.throttleDelay,a=n.throttledEvents,o=a==="all"||a.includes("keydown");ir!==null&&(typeof i!="number"||!o)&&(clearTimeout(ir),ir=null);var u=()=>{try{var l=t.getState(),c=l.rootProps.accessibilityLayer!==!1;if(!c)return;var s=l.tooltip.keyboardInteraction,f=xi;if(f!=="ArrowRight"&&f!=="ArrowLeft"&&f!=="Enter")return;var d=An(s,xr(l),qr(l),Xr(l)),v=d==null?-1:Number(d),p=!Number.isFinite(v)||v<0,m=Wt(l),y=xr(l),g=ti(l,l.tooltip.settings.shared);if(f==="Enter"){if(p)return;var x=ua(l,g,"hover",String(s.index));t.dispatch(oa({active:!s.active,activeIndex:s.index,activeCoordinate:x}));return}var A=rI(l),w=A==="left-to-right"?1:-1,O=f==="ArrowRight"?1:-1,b;if(p){var S=qr(l),I=Xr(l),_=O*w,T=F=>({active:!1,index:String(F),dataKey:void 0,graphicalItemId:void 0,coordinate:void 0});if(b=-1,_>0){for(var k=0;k=0;E--)if(An(T(E),y,S,I)!=null){b=E;break}if(b<0)return}else{b=v+O*w;var R=(m==null?void 0:m.length)||y.length;if(R===0||b>=R||b<0)return}var $=ua(l,g,"hover",String(b));t.dispatch(oa({active:!0,activeIndex:b.toString(),activeCoordinate:$}))}finally{Nr=null,ir=null}};if(!o){u();return}i==="raf"?Nr=requestAnimationFrame(u):typeof i=="number"&&ir===null&&(u(),xi=null,ir=setTimeout(()=>{xi?u():(ir=null,Nr=null)},i))}});Ja.startListening({actionCreator:wg,effect:(e,t)=>{var r=t.getState(),n=r.rootProps.accessibilityLayer!==!1;if(n){var i=r.tooltip.keyboardInteraction;if(!i.active&&i.index==null){var a="0",o=ti(r,r.tooltip.settings.shared),u=ua(r,o,"hover",String(a));t.dispatch(oa({active:!0,activeIndex:a,activeCoordinate:u}))}}}});Ja.startListening({actionCreator:Ag,effect:(e,t)=>{var r=t.getState(),n=r.rootProps.accessibilityLayer!==!1;if(n){var i=r.tooltip.keyboardInteraction;i.active&&t.dispatch(oa({active:!1,activeIndex:i.index,activeCoordinate:i.coordinate}))}}});function Og(e){e.persist();var t=e.currentTarget;return new Proxy(e,{get:(r,n)=>{if(n==="currentTarget")return t;var i=Reflect.get(r,n);return typeof i=="function"?i.bind(r):i}})}var Ve=Ye("externalEvent"),Pg=zn(),wi=new Map,mn=new Map,Mo=new Map;Pg.startListening({actionCreator:Ve,effect:(e,t)=>{var r=e.payload,n=r.handler,i=r.reactEvent;if(n!=null){var a=i.type,o=Og(i);Mo.set(a,{handler:n,reactEvent:o});var u=wi.get(a);u!==void 0&&(cancelAnimationFrame(u),wi.delete(a));var l=t.getState(),c=l.eventSettings,s=c.throttleDelay,f=c.throttledEvents,d=f,v=d==="all"||(d==null?void 0:d.includes(a)),p=mn.get(a);p!==void 0&&(typeof s!="number"||!v)&&(clearTimeout(p),mn.delete(a));var m=()=>{var x=Mo.get(a);try{if(!x)return;var A=x.handler,w=x.reactEvent,O=t.getState(),b={activeCoordinate:i_(O),activeDataKey:ay(O),activeIndex:wr(O),activeLabel:iy(O),activeTooltipIndex:wr(O),isTooltipActive:a_(O)};A&&A(b,w)}finally{wi.delete(a),mn.delete(a),Mo.delete(a)}};if(!v){m();return}if(s==="raf"){var y=requestAnimationFrame(m);wi.set(a,y)}else if(typeof s=="number"){if(!mn.has(a)){m();var g=setTimeout(m,s);mn.set(a,g)}}else m()}}});var I$=P([nn],e=>e.tooltipItemPayloads),_$=P([I$,(e,t)=>t,(e,t,r)=>r],(e,t,r)=>{if(t!=null){var n=e.find(a=>a.settings.graphicalItemId===r);if(n!=null){var i=n.getPosition;if(i!=null)return i(t)}}}),Sg=Ye("touchMove"),Eg=zn(),ar=null,Ut=null,Gd=null,yn=null;Eg.startListening({actionCreator:Sg,effect:(e,t)=>{var r=e.payload;if(!(r.touches==null||r.touches.length===0)){yn=Og(r);var n=t.getState(),i=n.eventSettings,a=i.throttleDelay,o=i.throttledEvents,u=o==="all"||o.includes("touchmove");ar!==null&&(cancelAnimationFrame(ar),ar=null),Ut!==null&&(typeof a!="number"||!u)&&(clearTimeout(Ut),Ut=null),Gd=Array.from(r.touches).map(c=>nc({clientX:c.clientX,clientY:c.clientY,currentTarget:r.currentTarget}));var l=()=>{if(yn!=null){var c=t.getState(),s=ti(c,c.tooltip.settings.shared);if(s==="axis"){var f,d=(f=Gd)===null||f===void 0?void 0:f[0];if(d==null){ar=null,Ut=null;return}var v=rc(c,d);(v==null?void 0:v.activeIndex)!=null&&t.dispatch(Hm({activeIndex:v.activeIndex,activeDataKey:void 0,activeCoordinate:v.activeCoordinate}))}else if(s==="item"){var p,m=yn.touches[0];if(document.elementFromPoint==null||m==null)return;var y=document.elementFromPoint(m.clientX,m.clientY);if(!y||!y.getAttribute)return;var g=y.getAttribute(Vx),x=(p=y.getAttribute(qx))!==null&&p!==void 0?p:void 0,A=Ir(c).find(b=>b.id===x);if(g==null||A==null||x==null)return;var w=A.dataKey,O=_$(c,g,x);t.dispatch(Um({activeDataKey:w,activeIndex:g,activeCoordinate:O,activeGraphicalItemId:x}))}ar=null,Ut=null}};if(!u){l();return}a==="raf"?ar=requestAnimationFrame(l):typeof a=="number"&&Ut===null&&(l(),yn=null,Ut=setTimeout(()=>{yn?l():(Ut=null,ar=null)},a))}}});var Ig={throttleDelay:"raf",throttledEvents:["mousemove","touchmove","pointermove","scroll","wheel"]},_g=Me({name:"eventSettings",initialState:Ig,reducers:{setEventSettings:(e,t)=>{t.payload.throttleDelay!=null&&(e.throttleDelay=t.payload.throttleDelay),t.payload.throttledEvents!=null&&(e.throttledEvents=q(t.payload.throttledEvents))}}}),C$=_g.actions.setEventSettings,k$=_g.reducer,T$=ih({brush:fM,cartesianAxis:FT,chartData:nC,errorBars:gj,eventSettings:k$,graphicalItems:AT,layout:Cx,legend:Rw,options:Q_,polarAxis:Dk,polarOptions:E$,referenceElements:pM,renderedTicks:WM,rootProps:A$,tooltip:hI,zIndex:z_}),M$=function(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"Chart";return ex({reducer:T$,preloadedState:t,middleware:n=>{var i;return n({serializableCheck:!1,immutableCheck:!["commonjs","es6","production"].includes((i="es6")!==null&&i!==void 0?i:"")}).concat([mg.middleware,yg.middleware,Ja.middleware,Pg.middleware,Eg.middleware])},enhancers:n=>{var i=n;return typeof n=="function"&&(i=n()),i.concat(bh({type:"raf"}))},devTools:{serialize:{replacer:w$},name:"recharts-".concat(r)}})};function j$(e){var t=e.preloadedState,r=e.children,n=e.reduxStoreName,i=Le(),a=h.useRef(null);if(i)return r;a.current==null&&(a.current=M$(t,n));var o=Du;return h.createElement(Jw,{context:o,store:a.current},r)}function D$(e){var t=e.layout,r=e.margin,n=ce(),i=Le();return h.useEffect(()=>{i||(n(Ex(t)),n(Sx(r)))},[n,i,t,r]),null}var $$=h.memo(D$,Kn);function N$(e){var t=ce();return h.useEffect(()=>{t(O$(e))},[t,e]),null}var R$=e=>{var t=ce();return h.useEffect(()=>{t(C$(e))},[t,e]),null},L$=h.memo(R$,Kn);function Zd(e){var t=e.zIndex,r=e.isPanorama,n=h.useRef(null),i=ce();return h.useLayoutEffect(()=>(n.current&&i(L_({zIndex:t,element:n.current,isPanorama:r})),()=>{i(B_({zIndex:t,isPanorama:r}))}),[i,t,r]),h.createElement("g",{tabIndex:-1,ref:n,className:"recharts-zIndex-layer_".concat(t)})}function Qd(e){var t=e.children,r=e.isPanorama,n=N(C_);if(!n||n.length===0)return t;var i=n.filter(o=>o<0),a=n.filter(o=>o>0);return h.createElement(h.Fragment,null,i.map(o=>h.createElement(Zd,{key:o,zIndex:o,isPanorama:r})),t,a.map(o=>h.createElement(Zd,{key:o,zIndex:o,isPanorama:r})))}var B$=["children"];function z$(e,t){if(e==null)return{};var r,n,i=F$(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n{var r=Cw(),n=kw(),i=Fh();if(!Xt(r)||!Xt(n))return null;var a=e.children,o=e.otherAttributes,u=e.title,l=e.desc,c,s;return o!=null&&(typeof o.tabIndex=="number"?c=o.tabIndex:c=i?0:void 0,typeof o.role=="string"?s=o.role:s=i?"application":void 0),h.createElement(lv,va({},o,{title:u,desc:l,role:s,tabIndex:c,width:r,height:n,style:W$,ref:t}),a)}),K$=e=>{var t=e.children,r=N(ja);if(!r)return null;var n=r.width,i=r.height,a=r.y,o=r.x;return h.createElement(lv,{width:n,height:i,x:o,y:a},t)},Jd=h.forwardRef((e,t)=>{var r=e.children,n=z$(e,B$),i=Le();return i?h.createElement(K$,null,h.createElement(Qd,{isPanorama:!0},r)):h.createElement(U$,va({ref:t},n),h.createElement(Qd,{isPanorama:!1},r))});function H$(e,t){return X$(e)||q$(e,t)||V$(e,t)||Y$()}function Y$(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function V$(e,t){if(e){if(typeof e=="string")return ev(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?ev(e,t):void 0}}function ev(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r{if(n!=null){var o=n.getBoundingClientRect(),u=o.width/n.offsetWidth;G(u)&&u!==a&&e(_x(u))}},[n,e,a]),i}function tv(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function Z$(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,n=Array(t);r(dC(),null);function pa(e){if(typeof e=="number")return e;if(typeof e=="string"){var t=parseFloat(e);if(!Number.isNaN(t))return t}return 0}var oN=h.forwardRef((e,t)=>{var r,n,i=h.useRef(null),a=h.useState({containerWidth:pa((r=e.style)===null||r===void 0?void 0:r.width),containerHeight:pa((n=e.style)===null||n===void 0?void 0:n.height)}),o=ha(a,2),u=o[0],l=o[1],c=h.useCallback((f,d)=>{l(v=>{var p=Math.round(f),m=Math.round(d);return v.containerWidth===p&&v.containerHeight===m?v:{containerWidth:p,containerHeight:m}})},[]),s=h.useCallback(f=>{if(typeof t=="function"&&t(f),i.current!=null&&(i.current.disconnect(),i.current=null),f!=null&&typeof ResizeObserver<"u"){var d=f.getBoundingClientRect(),v=d.width,p=d.height;c(v,p);var m=g=>{var x=g[0];if(x!=null){var A=x.contentRect,w=A.width,O=A.height;c(w,O)}},y=new ResizeObserver(m);y.observe(f),i.current=y}},[t,c]);return h.useEffect(()=>()=>{var f=i.current;f!=null&&f.disconnect()},[c]),h.createElement(h.Fragment,null,h.createElement(Wn,{width:u.containerWidth,height:u.containerHeight}),h.createElement("div",qt({ref:s},e)))}),uN=h.forwardRef((e,t)=>{var r=e.width,n=e.height,i=h.useState({containerWidth:pa(r),containerHeight:pa(n)}),a=ha(i,2),o=a[0],u=a[1],l=h.useCallback((s,f)=>{u(d=>{var v=Math.round(s),p=Math.round(f);return d.containerWidth===v&&d.containerHeight===p?d:{containerWidth:v,containerHeight:p}})},[]),c=h.useCallback(s=>{if(typeof t=="function"&&t(s),s!=null){var f=s.getBoundingClientRect(),d=f.width,v=f.height;l(d,v)}},[t,l]);return h.createElement(h.Fragment,null,h.createElement(Wn,{width:o.containerWidth,height:o.containerHeight}),h.createElement("div",qt({ref:c},e)))}),lN=h.forwardRef((e,t)=>{var r=e.width,n=e.height;return h.createElement(h.Fragment,null,h.createElement(Wn,{width:r,height:n}),h.createElement("div",qt({ref:t},e)))}),cN=h.forwardRef((e,t)=>{var r=e.width,n=e.height;return typeof r=="string"||typeof n=="string"?h.createElement(uN,qt({},e,{ref:t})):typeof r=="number"&&typeof n=="number"?h.createElement(lN,qt({},e,{width:r,height:n,ref:t})):h.createElement(h.Fragment,null,h.createElement(Wn,{width:r,height:n}),h.createElement("div",qt({ref:t},e)))});function sN(e){return e?oN:cN}var fN=h.forwardRef((e,t)=>{var r=e.children,n=e.className,i=e.height,a=e.onClick,o=e.onContextMenu,u=e.onDoubleClick,l=e.onMouseDown,c=e.onMouseEnter,s=e.onMouseLeave,f=e.onMouseMove,d=e.onMouseUp,v=e.onTouchEnd,p=e.onTouchMove,m=e.onTouchStart,y=e.style,g=e.width,x=e.responsive,A=e.dispatchTouchEvents,w=A===void 0?!0:A,O=h.useRef(null),b=ce(),S=h.useState(null),I=ha(S,2),_=I[0],T=I[1],k=h.useState(null),E=ha(k,2),R=E[0],$=E[1],F=G$(),K=Wu(),H=(K==null?void 0:K.width)>0?K.width:g,L=(K==null?void 0:K.height)>0?K.height:i,V=h.useCallback(B=>{F(B),typeof t=="function"&&t(B),T(B),$(B),B!=null&&(O.current=B)},[F,t,T,$]),W=h.useCallback(B=>{b(pg(B)),b(Ve({handler:a,reactEvent:B}))},[b,a]),fe=h.useCallback(B=>{b(wu(B)),b(Ve({handler:c,reactEvent:B}))},[b,c]),de=h.useCallback(B=>{b(Km()),b(Ve({handler:s,reactEvent:B}))},[b,s]),oe=h.useCallback(B=>{b(wu(B)),b(Ve({handler:f,reactEvent:B}))},[b,f]),De=h.useCallback(()=>{b(wg())},[b]),Be=h.useCallback(()=>{b(Ag())},[b]),rt=h.useCallback(B=>{b(xg(B.key))},[b]),nt=h.useCallback(B=>{b(Ve({handler:o,reactEvent:B}))},[b,o]),un=h.useCallback(B=>{b(Ve({handler:u,reactEvent:B}))},[b,u]),M=h.useCallback(B=>{b(Ve({handler:l,reactEvent:B}))},[b,l]),U=h.useCallback(B=>{b(Ve({handler:d,reactEvent:B}))},[b,d]),z=h.useCallback(B=>{b(Ve({handler:m,reactEvent:B}))},[b,m]),C=h.useCallback(B=>{w&&b(Sg(B)),b(Ve({handler:p,reactEvent:B}))},[b,w,p]),Ce=h.useCallback(B=>{b(Ve({handler:v,reactEvent:B}))},[b,v]),Q=sN(x);return h.createElement(dy.Provider,{value:_},h.createElement(e0.Provider,{value:R},h.createElement(Q,{width:H??(y==null?void 0:y.width),height:L??(y==null?void 0:y.height),className:ne("recharts-wrapper",n),style:Z$({position:"relative",cursor:"default",width:H,height:L},y),onClick:W,onContextMenu:nt,onDoubleClick:un,onFocus:De,onBlur:Be,onKeyDown:rt,onMouseDown:M,onMouseEnter:fe,onMouseLeave:de,onMouseMove:oe,onMouseUp:U,onTouchEnd:Ce,onTouchMove:C,onTouchStart:z,ref:V},h.createElement(aN,null),r)))}),dN=["width","height","responsive","children","className","style","compact","title","desc"];function vN(e,t){if(e==null)return{};var r,n,i=hN(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n{var r=e.width,n=e.height,i=e.responsive,a=e.children,o=e.className,u=e.style,l=e.compact,c=e.title,s=e.desc,f=vN(e,dN),d=wt(f);return l?h.createElement(h.Fragment,null,h.createElement(Wn,{width:r,height:n}),h.createElement(Jd,{otherAttributes:d,title:c,desc:s},a)):h.createElement(fN,{className:o,style:u,width:r,height:n,responsive:i??!1,onClick:e.onClick,onMouseLeave:e.onMouseLeave,onMouseEnter:e.onMouseEnter,onMouseMove:e.onMouseMove,onMouseDown:e.onMouseDown,onMouseUp:e.onMouseUp,onContextMenu:e.onContextMenu,onDoubleClick:e.onDoubleClick,onTouchStart:e.onTouchStart,onTouchMove:e.onTouchMove,onTouchEnd:e.onTouchEnd},h.createElement(Jd,{otherAttributes:d,title:c,desc:s,ref:t},h.createElement(AM,null,a)))});function Au(){return Au=Object.assign?Object.assign.bind():function(e){for(var t=1;th.createElement(Cg,{chartName:"LineChart",defaultTooltipEventType:"axis",validateTooltipEventTypes:AN,tooltipPayloadSearcher:vy,categoricalChartProps:e,ref:t})),ON=["axis","item"],kN=h.forwardRef((e,t)=>h.createElement(Cg,{chartName:"BarChart",defaultTooltipEventType:"axis",validateTooltipEventTypes:ON,tooltipPayloadSearcher:vy,categoricalChartProps:e,ref:t}));export{kN as B,CN as L,IN as R,_N as T,g$ as X,Qj as a,r$ as b}; +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function rN(e,t){if(e){if(typeof e=="string")return rv(e,t);var r={}.toString.call(e).slice(8,-1);return r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set"?Array.from(e):r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?rv(e,t):void 0}}function rv(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r(dC(),null);function pa(e){if(typeof e=="number")return e;if(typeof e=="string"){var t=parseFloat(e);if(!Number.isNaN(t))return t}return 0}var oN=h.forwardRef((e,t)=>{var r,n,i=h.useRef(null),a=h.useState({containerWidth:pa((r=e.style)===null||r===void 0?void 0:r.width),containerHeight:pa((n=e.style)===null||n===void 0?void 0:n.height)}),o=ha(a,2),u=o[0],l=o[1],c=h.useCallback((f,d)=>{l(v=>{var p=Math.round(f),m=Math.round(d);return v.containerWidth===p&&v.containerHeight===m?v:{containerWidth:p,containerHeight:m}})},[]),s=h.useCallback(f=>{if(typeof t=="function"&&t(f),i.current!=null&&(i.current.disconnect(),i.current=null),f!=null&&typeof ResizeObserver<"u"){var d=f.getBoundingClientRect(),v=d.width,p=d.height;c(v,p);var m=g=>{var x=g[0];if(x!=null){var A=x.contentRect,w=A.width,O=A.height;c(w,O)}},y=new ResizeObserver(m);y.observe(f),i.current=y}},[t,c]);return h.useEffect(()=>()=>{var f=i.current;f!=null&&f.disconnect()},[c]),h.createElement(h.Fragment,null,h.createElement(Wn,{width:u.containerWidth,height:u.containerHeight}),h.createElement("div",qt({ref:s},e)))}),uN=h.forwardRef((e,t)=>{var r=e.width,n=e.height,i=h.useState({containerWidth:pa(r),containerHeight:pa(n)}),a=ha(i,2),o=a[0],u=a[1],l=h.useCallback((s,f)=>{u(d=>{var v=Math.round(s),p=Math.round(f);return d.containerWidth===v&&d.containerHeight===p?d:{containerWidth:v,containerHeight:p}})},[]),c=h.useCallback(s=>{if(typeof t=="function"&&t(s),s!=null){var f=s.getBoundingClientRect(),d=f.width,v=f.height;l(d,v)}},[t,l]);return h.createElement(h.Fragment,null,h.createElement(Wn,{width:o.containerWidth,height:o.containerHeight}),h.createElement("div",qt({ref:c},e)))}),lN=h.forwardRef((e,t)=>{var r=e.width,n=e.height;return h.createElement(h.Fragment,null,h.createElement(Wn,{width:r,height:n}),h.createElement("div",qt({ref:t},e)))}),cN=h.forwardRef((e,t)=>{var r=e.width,n=e.height;return typeof r=="string"||typeof n=="string"?h.createElement(uN,qt({},e,{ref:t})):typeof r=="number"&&typeof n=="number"?h.createElement(lN,qt({},e,{width:r,height:n,ref:t})):h.createElement(h.Fragment,null,h.createElement(Wn,{width:r,height:n}),h.createElement("div",qt({ref:t},e)))});function sN(e){return e?oN:cN}var fN=h.forwardRef((e,t)=>{var r=e.children,n=e.className,i=e.height,a=e.onClick,o=e.onContextMenu,u=e.onDoubleClick,l=e.onMouseDown,c=e.onMouseEnter,s=e.onMouseLeave,f=e.onMouseMove,d=e.onMouseUp,v=e.onTouchEnd,p=e.onTouchMove,m=e.onTouchStart,y=e.style,g=e.width,x=e.responsive,A=e.dispatchTouchEvents,w=A===void 0?!0:A,O=h.useRef(null),b=ce(),S=h.useState(null),I=ha(S,2),_=I[0],T=I[1],k=h.useState(null),E=ha(k,2),R=E[0],$=E[1],F=G$(),K=Wu(),H=(K==null?void 0:K.width)>0?K.width:g,L=(K==null?void 0:K.height)>0?K.height:i,V=h.useCallback(B=>{F(B),typeof t=="function"&&t(B),T(B),$(B),B!=null&&(O.current=B)},[F,t,T,$]),W=h.useCallback(B=>{b(pg(B)),b(Ve({handler:a,reactEvent:B}))},[b,a]),fe=h.useCallback(B=>{b(wu(B)),b(Ve({handler:c,reactEvent:B}))},[b,c]),de=h.useCallback(B=>{b(Km()),b(Ve({handler:s,reactEvent:B}))},[b,s]),oe=h.useCallback(B=>{b(wu(B)),b(Ve({handler:f,reactEvent:B}))},[b,f]),De=h.useCallback(()=>{b(wg())},[b]),Be=h.useCallback(()=>{b(Ag())},[b]),rt=h.useCallback(B=>{b(xg(B.key))},[b]),nt=h.useCallback(B=>{b(Ve({handler:o,reactEvent:B}))},[b,o]),un=h.useCallback(B=>{b(Ve({handler:u,reactEvent:B}))},[b,u]),M=h.useCallback(B=>{b(Ve({handler:l,reactEvent:B}))},[b,l]),U=h.useCallback(B=>{b(Ve({handler:d,reactEvent:B}))},[b,d]),z=h.useCallback(B=>{b(Ve({handler:m,reactEvent:B}))},[b,m]),C=h.useCallback(B=>{w&&b(Sg(B)),b(Ve({handler:p,reactEvent:B}))},[b,w,p]),Ce=h.useCallback(B=>{b(Ve({handler:v,reactEvent:B}))},[b,v]),Q=sN(x);return h.createElement(dy.Provider,{value:_},h.createElement(e0.Provider,{value:R},h.createElement(Q,{width:H??(y==null?void 0:y.width),height:L??(y==null?void 0:y.height),className:ne("recharts-wrapper",n),style:Z$({position:"relative",cursor:"default",width:H,height:L},y),onClick:W,onContextMenu:nt,onDoubleClick:un,onFocus:De,onBlur:Be,onKeyDown:rt,onMouseDown:M,onMouseEnter:fe,onMouseLeave:de,onMouseMove:oe,onMouseUp:U,onTouchEnd:Ce,onTouchMove:C,onTouchStart:z,ref:V},h.createElement(aN,null),r)))}),dN=["width","height","responsive","children","className","style","compact","title","desc"];function vN(e,t){if(e==null)return{};var r,n,i=hN(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n{var r=e.width,n=e.height,i=e.responsive,a=e.children,o=e.className,u=e.style,l=e.compact,c=e.title,s=e.desc,f=vN(e,dN),d=wt(f);return l?h.createElement(h.Fragment,null,h.createElement(Wn,{width:r,height:n}),h.createElement(Jd,{otherAttributes:d,title:c,desc:s},a)):h.createElement(fN,{className:o,style:u,width:r,height:n,responsive:i??!1,onClick:e.onClick,onMouseLeave:e.onMouseLeave,onMouseEnter:e.onMouseEnter,onMouseMove:e.onMouseMove,onMouseDown:e.onMouseDown,onMouseUp:e.onMouseUp,onContextMenu:e.onContextMenu,onDoubleClick:e.onDoubleClick,onTouchStart:e.onTouchStart,onTouchMove:e.onTouchMove,onTouchEnd:e.onTouchEnd},h.createElement(Jd,{otherAttributes:d,title:c,desc:s,ref:t},h.createElement(AM,null,a)))});function Au(){return Au=Object.assign?Object.assign.bind():function(e){for(var t=1;th.createElement(Cg,{chartName:"LineChart",defaultTooltipEventType:"axis",validateTooltipEventTypes:AN,tooltipPayloadSearcher:vy,categoricalChartProps:e,ref:t})),ON=["axis","item"],kN=h.forwardRef((e,t)=>h.createElement(Cg,{chartName:"BarChart",defaultTooltipEventType:"axis",validateTooltipEventTypes:ON,tooltipPayloadSearcher:vy,categoricalChartProps:e,ref:t}));export{kN as B,CN as L,IN as R,_N as T,g$ as X,r$ as a,Qj as b}; diff --git a/src/gateway/static/dashboard/assets/tableSelection-CojkFPwd.js b/src/gateway/static/dashboard/assets/tableSelection-9hV37uhu.js similarity index 95% rename from src/gateway/static/dashboard/assets/tableSelection-CojkFPwd.js rename to src/gateway/static/dashboard/assets/tableSelection-9hV37uhu.js index b005b598..1a201851 100644 --- a/src/gateway/static/dashboard/assets/tableSelection-CojkFPwd.js +++ b/src/gateway/static/dashboard/assets/tableSelection-9hV37uhu.js @@ -1 +1 @@ -import{j as s}from"./tanstack-query-1t81HyiD.js";import{B as u}from"./heroui-DZj66Arc.js";import{r as l}from"./react-dgEcD0HR.js";function f({selectedCount:t,allMatching:e,matchingTotal:a,canSelectAllMatching:r,onSelectAllMatching:n,onClear:o,children:c}){const i=e?`All ${(a??t).toLocaleString()} matching rows selected`:`${t.toLocaleString()} selected`;return s.jsxs("div",{role:"toolbar","aria-label":"Bulk actions",className:"otari-bulk-bar fixed bottom-4 left-1/2 z-40 flex w-[calc(100%-2rem)] max-w-3xl -translate-x-1/2 flex-wrap items-center gap-3 rounded-xl border border-[var(--otari-brand)] bg-[var(--otari-surface)] px-4 py-2.5 shadow-lg",children:[s.jsx("span",{className:"text-sm font-medium text-[var(--otari-brand-dark)]",children:i}),!e&&r&&a!=null?s.jsxs(u,{size:"sm",variant:"ghost",onPress:n,children:["Select all ",a.toLocaleString()," matching this filter"]}):null,s.jsxs("div",{className:"ml-auto flex flex-wrap items-center gap-2",children:[c,s.jsx(u,{size:"sm",variant:"ghost",onPress:o,children:"Clear"})]})]})}function b(){const[t,e]=l.useState(()=>new Set),[a,r]=l.useState(!1),n=l.useCallback(i=>{e(i),r(!1)},[]),o=l.useCallback(()=>{e(new Set),r(!1)},[]),c=l.useCallback(()=>r(!0),[]);return{selectedKeys:t,onSelectionChange:n,allMatching:a,enableAllMatching:c,clear:o}}function h(t,e){return t==="all"?e:e.filter(a=>t.has(a))}export{f as B,h as r,b as u}; +import{j as s}from"./tanstack-query-1t81HyiD.js";import{B as u}from"./heroui-BI50yK5B.js";import{r as l}from"./react-dgEcD0HR.js";function f({selectedCount:t,allMatching:e,matchingTotal:a,canSelectAllMatching:r,onSelectAllMatching:n,onClear:o,children:c}){const i=e?`All ${(a??t).toLocaleString()} matching rows selected`:`${t.toLocaleString()} selected`;return s.jsxs("div",{role:"toolbar","aria-label":"Bulk actions",className:"otari-bulk-bar fixed bottom-4 left-1/2 z-40 flex w-[calc(100%-2rem)] max-w-3xl -translate-x-1/2 flex-wrap items-center gap-3 rounded-xl border border-[var(--otari-brand)] bg-[var(--otari-surface)] px-4 py-2.5 shadow-lg",children:[s.jsx("span",{className:"text-sm font-medium text-[var(--otari-brand-dark)]",children:i}),!e&&r&&a!=null?s.jsxs(u,{size:"sm",variant:"ghost",onPress:n,children:["Select all ",a.toLocaleString()," matching this filter"]}):null,s.jsxs("div",{className:"ml-auto flex flex-wrap items-center gap-2",children:[c,s.jsx(u,{size:"sm",variant:"ghost",onPress:o,children:"Clear"})]})]})}function b(){const[t,e]=l.useState(()=>new Set),[a,r]=l.useState(!1),n=l.useCallback(i=>{e(i),r(!1)},[]),o=l.useCallback(()=>{e(new Set),r(!1)},[]),c=l.useCallback(()=>r(!0),[]);return{selectedKeys:t,onSelectionChange:n,allMatching:a,enableAllMatching:c,clear:o}}function h(t,e){return t==="all"?e:e.filter(a=>t.has(a))}export{f as B,h as r,b as u}; diff --git a/src/gateway/static/dashboard/index.html b/src/gateway/static/dashboard/index.html index 937a27bc..b6c93f6f 100644 --- a/src/gateway/static/dashboard/index.html +++ b/src/gateway/static/dashboard/index.html @@ -6,11 +6,11 @@ Otari Dashboard - + - - + +
diff --git a/web/src/components/ActivityTimeline.test.tsx b/web/src/components/ActivityTimeline.test.tsx new file mode 100644 index 00000000..81326fa5 --- /dev/null +++ b/web/src/components/ActivityTimeline.test.tsx @@ -0,0 +1,132 @@ +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { describe, expect, it, vi } from "vitest"; + +import { USAGE_PRESETS } from "@/lib/timeRange"; +import { ActivityTimeline, type TimelinePoint } from "./ActivityTimeline"; + +const SERIES: TimelinePoint[] = [ + { bucketStart: "2026-07-10T00:00:00Z", requests: 12 }, + { bucketStart: "2026-07-11T00:00:00Z", requests: 40 }, + { bucketStart: "2026-07-12T00:00:00Z", requests: 8 }, +]; + +function renderTimeline(overrides: Partial> = {}) { + const onPreset = vi.fn(); + const onSelectRange = vi.fn(); + const onSelectFull = vi.fn(); + render( + , + ); + return { onPreset, onSelectRange, onSelectFull }; +} + +describe("ActivityTimeline", () => { + it("renders presets and highlights the extent, reporting a picked preset", async () => { + const user = userEvent.setup(); + const { onPreset } = renderTimeline(); + await user.click(screen.getByRole("button", { name: "7d" })); + expect(onPreset).toHaveBeenCalledWith(expect.objectContaining({ key: "7d" })); + }); + + it("captions the active window (inclusive end, UTC)", () => { + renderTimeline(); + const caption = screen.getByText(/Showing/); + expect(caption).toHaveTextContent("Jul 10"); + expect(caption).toHaveTextContent("Jul 12"); // 2026-07-13 exclusive -> inclusive Jul 12 + expect(caption).toHaveTextContent("UTC"); + }); + + it("captions an unbounded window as All time", () => { + renderTimeline({ windowStart: undefined, windowEnd: undefined }); + expect(screen.getByText(/Showing/)).toHaveTextContent("All time"); + }); + + it("renders the bucket unit label", () => { + renderTimeline(); + expect(screen.getByText("Requests / day")).toBeInTheDocument(); + }); + + it("shows an empty state when there is no activity", () => { + renderTimeline({ series: [] }); + expect(screen.getByText(/No activity in this range/)).toBeInTheDocument(); + }); + + it("renders a dual-thumb range slider positioned on the active window", () => { + renderTimeline(); + // Window covers the whole 3-bucket series: thumbs sit at the extremes of + // the fractional bucket scale [0, 3]. (Queried by DOM order: react-aria's + // group labelling overrides the per-thumb aria-label in name computation.) + const thumbs = screen.getAllByRole("slider"); + expect(thumbs).toHaveLength(2); + expect(thumbs[0]).toHaveValue("0"); + expect(thumbs[1]).toHaveValue("3"); + }); + + it("positions the thumbs on a sub-window", () => { + renderTimeline({ + // Jul 11 only (one bucket of the three). + windowStart: "2026-07-11T00:00:00.000Z", + windowEnd: "2026-07-12T00:00:00.000Z", + }); + const thumbs = screen.getAllByRole("slider"); + expect(thumbs[0]).toHaveValue("1"); + expect(thumbs[1]).toHaveValue("2"); + }); + + it("promotes to the next larger preset when zooming out at the full extent", async () => { + const user = userEvent.setup(); + // Window covers the whole series, so the extent itself must widen: 30d -> 90d. + const { onPreset, onSelectRange } = renderTimeline(); + await user.click(screen.getByRole("button", { name: "Zoom out" })); + expect(onPreset).toHaveBeenCalledWith(expect.objectContaining({ key: "90d" })); + expect(onSelectRange).not.toHaveBeenCalled(); + }); + + it("doubles a sub-window around its center when zooming out", async () => { + const user = userEvent.setup(); + const series = [ + { bucketStart: "2026-07-10T00:00:00Z", requests: 1 }, + { bucketStart: "2026-07-11T00:00:00Z", requests: 2 }, + { bucketStart: "2026-07-12T00:00:00Z", requests: 3 }, + { bucketStart: "2026-07-13T00:00:00Z", requests: 4 }, + { bucketStart: "2026-07-14T00:00:00Z", requests: 5 }, + ]; + const { onSelectRange } = renderTimeline({ + series, + // Jul 12 only (the middle bucket of five). + windowStart: "2026-07-12T00:00:00.000Z", + windowEnd: "2026-07-13T00:00:00.000Z", + }); + await user.click(screen.getByRole("button", { name: "Zoom out" })); + // One bucket doubles to two, centered, then snaps outward to whole buckets: + // Jul 11 .. Jul 14 (exclusive). + expect(onSelectRange).toHaveBeenCalledWith("2026-07-11T00:00:00.000Z", "2026-07-14T00:00:00.000Z"); + }); + + it("offers Reset only when zoomed, and it restores the full extent", async () => { + const user = userEvent.setup(); + const { onSelectFull } = renderTimeline({ + windowStart: "2026-07-11T00:00:00.000Z", + windowEnd: "2026-07-12T00:00:00.000Z", + }); + await user.click(screen.getByRole("button", { name: "Reset" })); + expect(onSelectFull).toHaveBeenCalledOnce(); + }); + + it("hides Reset at the full extent", () => { + renderTimeline(); + expect(screen.queryByRole("button", { name: "Reset" })).not.toBeInTheDocument(); + }); +}); diff --git a/web/src/components/ActivityTimeline.tsx b/web/src/components/ActivityTimeline.tsx new file mode 100644 index 00000000..7ad9179b --- /dev/null +++ b/web/src/components/ActivityTimeline.tsx @@ -0,0 +1,369 @@ +import { Button, Spinner } from "@heroui/react"; +import { useEffect, useRef, useState } from "react"; +import type { ReactNode } from "react"; +import { Slider as RacSlider, SliderThumb as RacSliderThumb, SliderTrack as RacSliderTrack } from "react-aria-components"; +import { Bar, BarChart, ResponsiveContainer, Tooltip, XAxis } from "recharts"; + +import type { UsageBucket } from "@/api/types"; +import { bucketIndexRange, formatWindowLabel, rangeFromBuckets, type RangePreset } from "@/lib/timeRange"; + +// A request-volume histogram that doubles as the time-range selector for the +// Usage and Activity pages (the pattern CloudWatch Logs Insights, Kibana, and +// Grafana/Loki use for log exploration). Presets set the *extent* the chart +// spans; the selection lives on the chart itself: full-height handles at the +// window edges zoom, a slim strip along the axis pans, regions outside the +// window dim in place, and −/+ buttons step the zoom (zooming out past the +// extent promotes to the next larger preset, so a wrong default is one tap +// away from a wider view). The tiles and log below follow the selection. +// +// Smoothness: the handles are react-aria slider thumbs (unstyled primitives, +// the same machinery HeroUI wraps), so they are pointer-captured and glide at +// 0.1-bucket steps. Drag feedback is CSS-positioned shades; the recharts tree +// never re-renders mid-drag, and the window commits once, on release, snapped +// outward to whole buckets. Buckets are UTC-aligned, so the selection lines up +// with the bars and the caption reads in UTC. + +export interface TimelinePoint { + bucketStart: string; + requests: number; +} + +interface ActivityTimelineProps { + presets: RangePreset[]; + // The preset defining the current extent (highlighted). Stays highlighted even + // while a sub-window is selected, since it still describes how far back we span. + extentKey: string; + onPreset: (preset: RangePreset) => void; + // A selected sub-window, resolved to absolute instants (end exclusive). + onSelectRange: (startIso: string, endIso: string) => void; + // The selection was widened back to the whole extent: fall back to the rolling + // preset window rather than a bounded snapshot. + onSelectFull: () => void; + series: TimelinePoint[]; + bucket: UsageBucket; + // The active window (server-echoed): positions the handles and drives the caption. + windowStart?: string; + windowEnd?: string; + loading?: boolean; + ariaLabel?: string; + action?: ReactNode; +} + +const BRAND = "var(--otari-brand)"; +// Slider positions per bucket: fine enough to glide, coarse enough that arrow +// keys still move perceptibly (PageUp/Down jumps a whole bucket). +const STEPS_PER_BUCKET = 10; +// The pan strip's height: it overlays the x-axis band at the chart's bottom, so +// it never sits over the bars and their hover tooltips. +const PAN_STRIP_PX = 22; + +function formatTick(iso: string, bucket: UsageBucket): string { + const d = new Date(iso); + if (Number.isNaN(d.getTime())) return iso; + return bucket === "hour" + ? d.toLocaleTimeString(undefined, { hour: "2-digit", minute: "2-digit", timeZone: "UTC" }) + : d.toLocaleDateString(undefined, { month: "short", day: "numeric", timeZone: "UTC" }); +} + +function TimelineTooltip({ + active, + label, + payload, + bucket, +}: { + active?: boolean; + label?: string; + payload?: readonly { value?: number | string }[]; + bucket: UsageBucket; +}) { + const value = payload?.[0]?.value; + if (!active || typeof value !== "number" || typeof label !== "string") return null; + return ( +
+
{formatTick(label, bucket)} · UTC
+
{value.toLocaleString()} requests
+
+ ); +} + +// A window-edge handle: a full-height grab bar with a centered grip pill, laid +// over the chart at the thumb's position. react-aria positions it with inline +// `left: X%` plus `transform: translate(-50%, -50%)`, so `top-1/2` is the whole +// centering recipe: adding Tailwind translate utilities (a separate `translate` +// property) would stack with that inline transform and shift the bar off the +// chart. +const THUMB_CLASS = "group top-1/2 h-full w-3 cursor-ew-resize outline-none"; + +function EdgeHandle({ index, label }: { index: number; label: string }) { + return ( + + + + + ); +} + +export function ActivityTimeline({ + presets, + extentKey, + onPreset, + onSelectRange, + onSelectFull, + series, + bucket, + windowStart, + windowEnd, + loading = false, + ariaLabel = "Request volume over the selected window", + action, +}: ActivityTimelineProps) { + const starts = series.map((p) => p.bucketStart); + const data = series.map((p) => ({ x: p.bucketStart, requests: p.requests })); + const n = series.length; + const label = formatWindowLabel(windowStart, windowEnd); + + // Selection in fractional bucket units over [0, n]. Local state so a drag + // updates every frame; synced from the active window only while not dragging + // (the commit round-trips through the parent and must not fight the pointer). + const windowToRange = (): [number, number] => { + if (n === 0) return [0, 1]; + const { startIndex, endIndex } = bucketIndexRange(starts, windowStart, windowEnd); + return [startIndex, endIndex + 1]; + }; + const [sel, setSel] = useState<[number, number]>(windowToRange); + const dragging = useRef(false); + useEffect(() => { + if (!dragging.current) setSel(windowToRange()); + // starts is derived from series each render; resync on the window bounds and + // the extent length, not the fresh array identity. + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [windowStart, windowEnd, n]); + + const commit = ([lo, hi]: [number, number]) => { + dragging.current = false; + if (n === 0) return; + // Snap outward to whole buckets so the selection always covers what was + // touched, and keep at least one bucket selected. + const startIndex = Math.max(0, Math.min(n - 1, Math.floor(lo + 1e-6))); + const endIndex = Math.max(startIndex, Math.min(n - 1, Math.ceil(hi - 1e-6) - 1)); + if (startIndex === 0 && endIndex === n - 1) { + onSelectFull(); + setSel([0, n]); + return; + } + const range = rangeFromBuckets(starts, startIndex, endIndex, bucket); + if (range) onSelectRange(range.startIso, range.endIso); + }; + + // Step zoom. Out doubles the window around its center; at the full extent it + // promotes to the next larger preset, so "the default window is too narrow" + // is always one tap from a wider view. In halves it (min one bucket). + const extentIndex = presets.findIndex((p) => p.key === extentKey); + const largerPreset = extentIndex >= 0 ? presets[extentIndex + 1] : undefined; + const [lo, hi] = sel; + const atFullExtent = lo <= 0.01 && hi >= n - 0.01; + + const applySpan = (newSpan: number) => { + const span = Math.max(1, Math.min(n, newSpan)); + const center = (lo + hi) / 2; + let nlo = center - span / 2; + let nhi = center + span / 2; + if (nlo < 0) { + nhi -= nlo; + nlo = 0; + } + if (nhi > n) { + nlo -= nhi - n; + nhi = n; + } + const next: [number, number] = [Math.max(0, nlo), Math.min(n, nhi)]; + setSel(next); + commit(next); + }; + + const zoomOut = () => { + if (atFullExtent) { + if (largerPreset) onPreset(largerPreset); + return; + } + applySpan((hi - lo) * 2); + }; + const zoomIn = () => applySpan((hi - lo) / 2); + + // Pan: dragging the axis strip slides the whole window. Plain pointer capture; + // commits on release like the handles do. + const areaRef = useRef(null); + const pan = useRef<{ x: number; sel: [number, number] } | null>(null); + const onPanMove = (event: React.PointerEvent) => { + if (!pan.current || !areaRef.current) return; + const width = areaRef.current.getBoundingClientRect().width; + if (width <= 0) return; + const dx = ((event.clientX - pan.current.x) / width) * n; + const span = pan.current.sel[1] - pan.current.sel[0]; + const plo = Math.max(0, Math.min(n - span, pan.current.sel[0] + dx)); + setSel([plo, plo + span]); + }; + + const loPct = n ? (Math.min(lo, hi) / n) * 100 : 0; + const hiPct = n ? (Math.max(lo, hi) / n) * 100 : 100; + const zoomed = !atFullExtent; + + return ( +
+
+ {presets.map((preset) => ( + + ))} +
+ Showing {label} · UTC + {action} +
+
+ +
+
+ + Requests / {bucket === "hour" ? "hour" : "day"} + +
+ + drag the edges to zoom · the bottom strip to pan + + + + {zoomed ? ( + + ) : null} +
+
+ + {loading && n === 0 ? ( +
+ +
+ ) : n === 0 ? ( +
+ No activity in this range. +
+ ) : ( +
+
+ + + formatTick(iso, bucket)} + tick={{ fontSize: 10, fill: "var(--otari-muted)" }} + /> + } + /> + + + +
+ + {/* Out-of-window shades: pure CSS feedback that tracks the handles + live without touching the recharts tree. pointer-events-none so + the bars' hover tooltip keeps working. */} + {zoomed ? ( + <> +
+
+ + ) : null} + + {/* Pan strip along the axis band: slides the window without resizing + it. Sits below the bars, so plot-area tooltips are unaffected. */} +
{ + event.stopPropagation(); + event.preventDefault(); + dragging.current = true; + pan.current = { x: event.clientX, sel: [Math.min(lo, hi), Math.max(lo, hi)] }; + event.currentTarget.setPointerCapture(event.pointerId); + }} + onPointerMove={onPanMove} + onPointerUp={(event) => { + event.currentTarget.releasePointerCapture(event.pointerId); + pan.current = null; + commit(sel); + }} + onPointerCancel={() => { + pan.current = null; + commit(sel); + }} + /> + + {/* The selection handles, overlaid on the chart. The slider itself is + pointer-transparent (so bars stay hoverable and a stray click + cannot jump a handle); only the handles take the pointer. */} + { + dragging.current = true; + if (Array.isArray(value) && value.length === 2) setSel([value[0], value[1]]); + }} + onChangeEnd={(value) => { + if (Array.isArray(value) && value.length === 2) commit([value[0], value[1]]); + }} + className="pointer-events-none absolute inset-0 z-[2]" + > + + + + + +
+ )} +
+
+ ); +} diff --git a/web/src/components/FilterChips.test.tsx b/web/src/components/FilterChips.test.tsx new file mode 100644 index 00000000..63b2714a --- /dev/null +++ b/web/src/components/FilterChips.test.tsx @@ -0,0 +1,57 @@ +import { render, screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { describe, expect, it, vi } from "vitest"; + +import { FilterChips } from "./FilterChips"; + +describe("FilterChips", () => { + it("renders a chip per active filter and clears one on ✕", async () => { + const user = userEvent.setup(); + const clearModel = vi.fn(); + render( + +
pickers
+
, + ); + expect(screen.getByText("gpt-5.6")).toBeInTheDocument(); + await user.click(screen.getByRole("button", { name: "Remove Model filter" })); + expect(clearModel).toHaveBeenCalledOnce(); + }); + + it("keeps the picker row hidden until 'Add filter' is toggled", async () => { + const user = userEvent.setup(); + render( + + + , + ); + const region = screen.getByText("User picker").closest("div")!; + expect(region.className).toContain("hidden"); + await user.click(screen.getByRole("button", { name: "Add filter" })); + expect(region.className).not.toContain("hidden"); + }); + + it("offers 'Clear all' only when filters are active", async () => { + const user = userEvent.setup(); + const clearAll = vi.fn(); + const { rerender } = render( + +
+ , + ); + expect(screen.queryByRole("button", { name: "Clear all" })).not.toBeInTheDocument(); + + rerender( + +
+ , + ); + await user.click(screen.getByRole("button", { name: "Clear all" })); + expect(clearAll).toHaveBeenCalledOnce(); + }); +}); diff --git a/web/src/components/FilterChips.tsx b/web/src/components/FilterChips.tsx new file mode 100644 index 00000000..706666b0 --- /dev/null +++ b/web/src/components/FilterChips.tsx @@ -0,0 +1,75 @@ +import { Button } from "@heroui/react"; +import { useId, useState } from "react"; +import type { ReactNode } from "react"; + +// Active filters shown as removable pills, with the pickers tucked behind an +// "Add filter" toggle. This is the log-tool convention (CloudWatch, Railway): +// keep the applied filters visible at all times (especially on mobile, where the +// picker row is otherwise hidden), and let a chip's ✕ clear just that filter. + +export interface FilterChip { + // Stable key for the collection. + key: string; + // The dimension, e.g. "Model". + label: string; + // The human-readable current value, e.g. "gpt-5.6". + value: string; + onClear: () => void; +} + +export function FilterChips({ + chips, + children, + onClearAll, +}: { + chips: FilterChip[]; + // The picker controls (comboboxes/selects), revealed by "Add filter". + children: ReactNode; + onClearAll?: () => void; +}) { + const [open, setOpen] = useState(false); + const regionId = useId(); + + return ( +
+
+ + {chips.map((chip) => ( + + {chip.label}: + {chip.value} + + + ))} + {chips.length > 0 && onClearAll ? ( + + ) : null} +
+
+ {children} +
+
+ ); +} diff --git a/web/src/components/ui.test.tsx b/web/src/components/ui.test.tsx index 4599a4bb..cc7b6636 100644 --- a/web/src/components/ui.test.tsx +++ b/web/src/components/ui.test.tsx @@ -1,7 +1,8 @@ import { render, screen } from "@testing-library/react"; -import { describe, expect, it } from "vitest"; +import userEvent from "@testing-library/user-event"; +import { describe, expect, it, vi } from "vitest"; -import { StatCard } from "@/components/ui"; +import { RefreshButton, StatCard } from "@/components/ui"; describe("StatCard", () => { it("renders its label and value", () => { @@ -22,3 +23,21 @@ describe("StatCard", () => { expect(root.className).toContain("p-0"); }); }); + +describe("RefreshButton", () => { + it("fires onRefresh and shows a freshness label", async () => { + const user = userEvent.setup(); + const onRefresh = vi.fn(); + render(); + expect(screen.getByText(/Updated/)).toBeInTheDocument(); + await user.click(screen.getByRole("button", { name: "Refresh" })); + expect(onRefresh).toHaveBeenCalledOnce(); + }); + + it("hides the timestamp before the first load and disables while fetching", () => { + const onRefresh = vi.fn(); + render(); + expect(screen.queryByText(/Updated/)).not.toBeInTheDocument(); + expect(screen.getByRole("button", { name: "Refresh" })).toBeDisabled(); + }); +}); diff --git a/web/src/components/ui.tsx b/web/src/components/ui.tsx index 9f8a62d6..35be8b15 100644 --- a/web/src/components/ui.tsx +++ b/web/src/components/ui.tsx @@ -4,7 +4,7 @@ import type { ReactNode } from "react"; import { NavLink } from "react-router-dom"; import { ApiError } from "@/api/client"; -import { formatPct } from "@/lib/format"; +import { formatPct, formatRelative } from "@/lib/format"; // A tile's attention status. Colors mirror the banner precedent (ErrorBanner // red-*, InfoBanner amber-*) and add emerald for the healthy state. Color is @@ -139,6 +139,77 @@ export function PageHeader({ title, description, action }: { title: string; desc ); } +// A slowly ticking wall clock, only to keep a relative "updated Ns ago" label +// current between renders. This is a display timer, not the prohibited data +// polling (which belongs on a TanStack Query `refetchInterval`): it fetches +// nothing. Paused while the tab is hidden so a backgrounded dashboard is idle. +function useDisplayClock(intervalMs: number): number { + const [now, setNow] = useState(() => Date.now()); + useEffect(() => { + let timer: ReturnType | undefined; + const start = () => { + if (timer === undefined) { + timer = setInterval(() => setNow(Date.now()), intervalMs); + } + }; + const stop = () => { + if (timer !== undefined) { + clearInterval(timer); + timer = undefined; + } + }; + const sync = () => { + setNow(Date.now()); + if (document.visibilityState === "visible") start(); + else stop(); + }; + sync(); + document.addEventListener("visibilitychange", sync); + return () => { + stop(); + document.removeEventListener("visibilitychange", sync); + }; + }, [intervalMs]); + return now; +} + +// A refresh control paired with a "last updated" timestamp, so an operator can +// tell stale numbers from fresh ones. The icon spins while a refetch is in +// flight. `updatedAt` is a TanStack Query `dataUpdatedAt` (ms epoch; 0 before +// the first successful load, which reads as "never" and is hidden). +export function RefreshButton({ + onRefresh, + isFetching = false, + updatedAt, + label = "Refresh", +}: { + onRefresh: () => void; + isFetching?: boolean; + updatedAt?: number; + label?: string; +}) { + const now = useDisplayClock(15_000); + const freshness = updatedAt ? formatRelative(new Date(updatedAt).toISOString(), now) : null; + return ( + + {freshness ? Updated {freshness} : null} + + + ); +} + // A destructive button that requires a second click to confirm, avoiding a // modal dependency for revoke/delete actions. export function ConfirmButton({ diff --git a/web/src/lib/timeRange.test.ts b/web/src/lib/timeRange.test.ts new file mode 100644 index 00000000..a7bc3ba1 --- /dev/null +++ b/web/src/lib/timeRange.test.ts @@ -0,0 +1,136 @@ +import { describe, expect, it } from "vitest"; + +import { + ACTIVITY_PRESETS, + bucketDurationMs, + bucketForWindow, + bucketIndexRange, + DAY_S, + findPreset, + formatWindowLabel, + HOUR_S, + isoAgo, + rangeFromBuckets, + USAGE_PRESETS, +} from "./timeRange"; + +describe("presets", () => { + it("Usage presets are all bounded (no unbounded 'All')", () => { + expect(USAGE_PRESETS.every((p) => typeof p.seconds === "number")).toBe(true); + expect(USAGE_PRESETS.some((p) => p.key === "all")).toBe(false); + expect(findPreset(USAGE_PRESETS, "90d")).toBeDefined(); + expect(findPreset(USAGE_PRESETS, "12mo")).toBeDefined(); + }); + + it("Activity keeps a truthful unbounded 'All'", () => { + expect(findPreset(ACTIVITY_PRESETS, "all")?.seconds).toBeNull(); + }); +}); + +describe("isoAgo", () => { + it("anchors to now minus the span", () => { + const now = Date.parse("2026-07-27T12:00:00Z"); + expect(isoAgo(DAY_S, now)).toBe("2026-07-26T12:00:00.000Z"); + }); +}); + +describe("bucketForWindow / bucketDurationMs", () => { + const now = Date.parse("2026-07-27T00:00:00Z"); + + it("buckets a sub-day (or exactly one-day) window hourly, longer daily", () => { + expect(bucketForWindow("2026-07-26T00:00:00Z", "2026-07-27T00:00:00Z", now)).toBe("hour"); + expect(bucketForWindow("2026-07-20T00:00:00Z", "2026-07-27T00:00:00Z", now)).toBe("day"); + }); + + it("measures an open-ended window against now", () => { + expect(bucketForWindow("2026-07-26T23:00:00Z", undefined, now)).toBe("hour"); + expect(bucketForWindow("2026-07-01T00:00:00Z", undefined, now)).toBe("day"); + }); + + it("reports the bucket duration", () => { + expect(bucketDurationMs("hour")).toBe(HOUR_S * 1000); + expect(bucketDurationMs("day")).toBe(DAY_S * 1000); + }); +}); + +describe("rangeFromBuckets", () => { + const starts = ["2026-07-01T00:00:00Z", "2026-07-02T00:00:00Z", "2026-07-03T00:00:00Z", "2026-07-04T00:00:00Z"]; + + it("spans from the first picked bucket to the exclusive end of the last", () => { + const r = rangeFromBuckets(starts, 1, 2, "day"); + expect(r).toEqual({ startIso: "2026-07-02T00:00:00.000Z", endIso: "2026-07-04T00:00:00.000Z" }); + }); + + it("is order-independent and clamps to the series bounds", () => { + const r = rangeFromBuckets(starts, 9, -3, "day"); + expect(r).toEqual({ startIso: "2026-07-01T00:00:00.000Z", endIso: "2026-07-05T00:00:00.000Z" }); + }); + + it("returns null for an empty series", () => { + expect(rangeFromBuckets([], 0, 0, "day")).toBeNull(); + }); +}); + +describe("bucketIndexRange", () => { + const starts = [ + "2026-07-01T00:00:00Z", + "2026-07-02T00:00:00Z", + "2026-07-03T00:00:00Z", + "2026-07-04T00:00:00Z", + "2026-07-05T00:00:00Z", + ]; + + it("spans the whole series when the window covers it (or is absent)", () => { + expect(bucketIndexRange(starts, undefined, undefined)).toEqual({ startIndex: 0, endIndex: 4 }); + expect(bucketIndexRange(starts, "2026-06-01T00:00:00Z", "2026-08-01T00:00:00Z")).toEqual({ + startIndex: 0, + endIndex: 4, + }); + }); + + it("locates a sub-window by its bucket boundaries", () => { + // Jul 2 .. Jul 4 exclusive -> buckets index 1 (Jul 2) through 2 (Jul 3). + expect(bucketIndexRange(starts, "2026-07-02T00:00:00Z", "2026-07-04T00:00:00Z")).toEqual({ + startIndex: 1, + endIndex: 2, + }); + }); + + it("clamps an inverted or empty window and handles an empty series", () => { + const r = bucketIndexRange(starts, "2026-07-04T00:00:00Z", "2026-07-02T00:00:00Z"); + expect(r.endIndex).toBeGreaterThanOrEqual(r.startIndex); + expect(bucketIndexRange([], "2026-07-01T00:00:00Z", "2026-07-02T00:00:00Z")).toEqual({ startIndex: 0, endIndex: 0 }); + }); +}); + +describe("formatWindowLabel", () => { + it("labels an unbounded window", () => { + expect(formatWindowLabel(undefined, undefined)).toBe("All time"); + }); + + it("labels an open-ended (start-only) window", () => { + expect(formatWindowLabel("2026-07-03T00:00:00Z", undefined)).toContain("Since"); + expect(formatWindowLabel("2026-07-03T00:00:00Z", undefined)).toContain("Jul 3"); + }); + + it("shows the inclusive last day for a bounded range, not the exclusive bound", () => { + const label = formatWindowLabel("2026-07-03T00:00:00Z", "2026-07-11T00:00:00Z"); + expect(label).toContain("Jul 3"); + expect(label).toContain("Jul 10"); + expect(label).not.toContain("Jul 11"); + expect(label).toContain("–"); + }); + + it("collapses a single-day window to one date", () => { + const label = formatWindowLabel("2026-07-03T00:00:00Z", "2026-07-04T00:00:00Z"); + expect(label).toContain("Jul 3"); + expect(label).not.toContain("–"); + }); + + it("carries the year on both sides across a year boundary", () => { + const label = formatWindowLabel("2025-12-30T00:00:00Z", "2026-01-03T00:00:00Z"); + expect(label).toContain("2025"); + expect(label).toContain("2026"); + expect(label).toContain("Jan 2"); + }); +}); diff --git a/web/src/lib/timeRange.ts b/web/src/lib/timeRange.ts new file mode 100644 index 00000000..a14a9eb9 --- /dev/null +++ b/web/src/lib/timeRange.ts @@ -0,0 +1,168 @@ +import type { UsageBucket } from "@/api/types"; + +// Shared time-range vocabulary for the Usage and Activity pages. Both pages used +// to keep private copies of the preset list (which drifted: "All" meant 30 days +// on Usage but all-time on Activity). Centralizing the presets and the window +// math here keeps the two pages honest, and feeds the shared activity-timeline +// selector (a request-volume histogram you drag across to pick a range). +// +// Windows are absolute instants and are read in UTC, matching the summary +// endpoint's UTC bucketing and the existing "times in UTC" trend caption. The +// timeline's buckets are UTC-aligned, so a picked range lines up with the bars. + +export const HOUR_S = 3_600; +export const DAY_S = 86_400; + +// The server caps a single summary window at 366 days (`_MAX_SUMMARY_SPAN`); +// mirror it so a client-driven zoom-out can't outrun what the server will serve. +export const MAX_SPAN_DAYS = 366; + +export interface RangePreset { + key: string; + label: string; + // A rolling lookback of this many seconds ("now minus N"). `null` is an + // explicit unbounded ("All") window; only Activity uses it, because its raw + // list endpoint treats an omitted start as all-time. Usage's summary endpoint + // reads an omitted start as a 30-day *default*, so its preset list carries no + // null: an unbounded Usage window is neither representable nor meaningful. + seconds: number | null; + bucket: UsageBucket; +} + +// Sub-day windows bucket hourly; longer ranges bucket daily. Usage adds bounded +// long-range presets (90d, a year) in place of the old rolling "All", so the +// page still reaches the full span the server will serve without an unbounded, +// clock-rolling window whose total silently changes day to day. +export const USAGE_PRESETS: RangePreset[] = [ + { key: "1h", label: "Last hour", seconds: HOUR_S, bucket: "hour" }, + { key: "24h", label: "24h", seconds: DAY_S, bucket: "hour" }, + { key: "7d", label: "7d", seconds: 7 * DAY_S, bucket: "day" }, + { key: "30d", label: "30d", seconds: 30 * DAY_S, bucket: "day" }, + { key: "90d", label: "90d", seconds: 90 * DAY_S, bucket: "day" }, + { key: "12mo", label: "12mo", seconds: MAX_SPAN_DAYS * DAY_S, bucket: "day" }, +]; + +// A spend investigation is usually monthly. +export const USAGE_DEFAULT_KEY = "30d"; + +// Activity keeps a truthful "All": the raw list endpoint applies no default and +// no clamp, so an omitted start really is all-time there. +export const ACTIVITY_PRESETS: RangePreset[] = [ + { key: "1h", label: "1h", seconds: HOUR_S, bucket: "hour" }, + { key: "24h", label: "24h", seconds: DAY_S, bucket: "hour" }, + { key: "7d", label: "7d", seconds: 7 * DAY_S, bucket: "day" }, + { key: "30d", label: "30d", seconds: 30 * DAY_S, bucket: "day" }, + { key: "all", label: "All", seconds: null, bucket: "day" }, +]; + +export const ACTIVITY_DEFAULT_KEY = "24h"; + +// The sentinel key the preset row highlights while an explicit range is active +// (drag-selected or zoomed). Not a preset itself, so it never appears in a list. +export const CUSTOM_KEY = "custom"; + +export function findPreset(presets: RangePreset[], key: string): RangePreset | undefined { + return presets.find((p) => p.key === key); +} + +export function isoAgo(seconds: number, now: number = Date.now()): string { + return new Date(now - seconds * 1000).toISOString(); +} + +export function bucketDurationMs(bucket: UsageBucket): number { + return (bucket === "hour" ? HOUR_S : DAY_S) * 1000; +} + +// Bucket granularity for a window, chosen from its length rather than from +// whether the range is "custom": a three-hour window should still bucket hourly +// instead of collapsing to a single point. An open-ended window (no explicit +// end) is measured against `now`. +export function bucketForWindow(startIso: string, endIso: string | undefined, now: number = Date.now()): UsageBucket { + const start = new Date(startIso).getTime(); + const end = endIso ? new Date(endIso).getTime() : now; + return end - start <= DAY_S * 1000 ? "hour" : "day"; +} + +// The absolute window covered by buckets [i..j] of a timeline series (order of +// i/j does not matter). Start is the first bucket's start; end is the exclusive +// upper bound (last bucket's start plus one bucket), so the whole last bucket is +// included. Indices are clamped to the series bounds. +export function rangeFromBuckets( + starts: string[], + i: number, + j: number, + bucket: UsageBucket, +): { startIso: string; endIso: string } | null { + if (starts.length === 0) return null; + const lo = Math.max(0, Math.min(i, j)); + const hi = Math.min(starts.length - 1, Math.max(i, j)); + const startMs = new Date(starts[lo]).getTime(); + const endMs = new Date(starts[hi]).getTime() + bucketDurationMs(bucket); + return { startIso: new Date(startMs).toISOString(), endIso: new Date(endMs).toISOString() }; +} + +// Map an active window onto bucket indices of a timeline (extent) series, for +// positioning the brush slider. `startIndex` is the last bucket starting at or +// before the window start; `endIndex` is the last bucket starting before the +// (exclusive) window end. An absent bound extends to that end of the series. +export function bucketIndexRange( + starts: string[], + startIso: string | undefined, + endIso: string | undefined, +): { startIndex: number; endIndex: number } { + const n = starts.length; + if (n === 0) return { startIndex: 0, endIndex: 0 }; + const ms = starts.map((s) => new Date(s).getTime()); + let startIndex = 0; + if (startIso) { + const t = new Date(startIso).getTime(); + for (let i = 0; i < n; i++) { + if (ms[i] <= t) startIndex = i; + } + } + let endIndex = n - 1; + if (endIso) { + const t = new Date(endIso).getTime(); + endIndex = 0; + for (let i = 0; i < n; i++) { + if (ms[i] < t) endIndex = i; + } + } + if (endIndex < startIndex) endIndex = startIndex; + return { startIndex, endIndex }; +} + +// ---------- effective-window caption ---------- + +function formatDay(ms: number, withYear: boolean): string { + return new Date(ms).toLocaleDateString(undefined, { + month: "short", + day: "numeric", + ...(withYear ? { year: "numeric" } : {}), + timeZone: "UTC", + }); +} + +// A human caption for the window the server actually aggregated over, so a +// default or a clamp is never invisible. Sourced from the echoed start/end +// instants and rendered in UTC calendar terms (end shown inclusively). +export function formatWindowLabel(startIso: string | undefined, endIso: string | undefined): string { + if (!startIso && !endIso) { + return "All time"; + } + if (startIso && !endIso) { + return `Since ${formatDay(new Date(startIso).getTime(), true)}`; + } + if (!startIso && endIso) { + return `Up to ${formatDay(new Date(endIso).getTime() - 1, true)}`; + } + const startMs = new Date(startIso as string).getTime(); + // Inclusive last day: our windows end at the next bucket's start (exclusive). + const endMs = new Date(endIso as string).getTime() - 1; + const sameDay = formatDay(startMs, true) === formatDay(endMs, true); + if (sameDay) { + return formatDay(startMs, true); + } + const sameYear = new Date(startMs).getUTCFullYear() === new Date(endMs).getUTCFullYear(); + return `${formatDay(startMs, !sameYear)} – ${formatDay(endMs, true)}`; +} diff --git a/web/src/pages/ActivityPage.test.tsx b/web/src/pages/ActivityPage.test.tsx index 862b5fed..3dacd4ee 100644 --- a/web/src/pages/ActivityPage.test.tsx +++ b/web/src/pages/ActivityPage.test.tsx @@ -253,7 +253,9 @@ describe("ActivityPage", () => { // The default 24h window bounds the query, so an empty result reads as filtered. expect(await screen.findByText("No requests match these filters.")).toBeInTheDocument(); - await user.click(screen.getByRole("button", { name: "Clear filters" })); + // The truthful "All" preset drops the window entirely (unbounded), so an empty + // result now reads as "never used". + await user.click(screen.getByRole("button", { name: "All" })); expect(await screen.findByText("No requests recorded yet.")).toBeInTheDocument(); }); @@ -381,16 +383,17 @@ describe("ActivityPage", () => { }); }); - it("collapses the filter controls behind a mobile toggle that expands them", async () => { + it("keeps the filter pickers behind an 'Add filter' toggle", async () => { mockApi({ rows: [entry()] }); const user = userEvent.setup(); renderPage(); await screen.findByText("gpt-4o"); - const toggle = screen.getByRole("button", { name: "Filters" }); - const region = document.getElementById("activity-filters")!; - // Collapsed by default on mobile (display:none there; the md: variant reveals - // it on desktop). Expanding flips the classes and the toggle's aria state. + // The picker row is collapsed until the operator opts to add a filter. jsdom + // does not apply Tailwind's `.hidden`, so assert on the toggled class rather + // than computed visibility. + const toggle = screen.getByRole("button", { name: "Add filter" }); + const region = document.getElementById(toggle.getAttribute("aria-controls")!)!; expect(toggle).toHaveAttribute("aria-expanded", "false"); expect(region.className).toContain("hidden"); @@ -401,12 +404,43 @@ describe("ActivityPage", () => { expect(region.className).not.toContain("hidden"); }); - it("labels the mobile filter toggle with the active filter count", async () => { - mockApi({ rows: [entry()] }); + it("shows active filters as removable chips and clears one on ✕", async () => { + const user = userEvent.setup(); + const { calls } = mockApi({ rows: [entry()] }); renderPage(, "/activity?model=gpt-4o&status=error"); await screen.findByText("gpt-4o"); - // Two collapsible filters active (model + status); the time range is excluded. - expect(screen.getByRole("button", { name: "Filters (2)" })).toBeInTheDocument(); + // A chip per active entity filter (model + status); the time range is not a chip. + expect(screen.getByRole("button", { name: "Remove Model filter" })).toBeInTheDocument(); + expect(screen.getByRole("button", { name: "Remove Status filter" })).toBeInTheDocument(); + + // Removing the model chip drops just that filter from the query. + await user.click(screen.getByRole("button", { name: "Remove Model filter" })); + await waitFor(() => expect(listCalls(calls).some((url) => !url.includes("model=gpt-4o"))).toBe(true)); + }); + + it("queries an unbounded window for the truthful 'All' preset", async () => { + const user = userEvent.setup(); + const { calls } = mockApi({ rows: [entry()] }); + renderPage(); + await screen.findByText("gpt-4o"); + + await user.click(screen.getByRole("button", { name: "All" })); + + // Activity's list endpoint applies no default lookback, so "All" really omits + // the start bound rather than silently scoping to a recent window. + await waitFor(() => expect(listCalls(calls).some((url) => !url.includes("start_date"))).toBe(true)); + }); + + it("buckets the timeline histogram by the active preset's extent", async () => { + const { calls } = mockApi({ rows: [entry()] }); + renderPage(); // default 24h + await screen.findByText("gpt-4o"); + + // The 24h extent buckets hourly, so the timeline's context summary is fetched + // with bucket=hour (distinct from the day-bucketed model-suggestion summary). + await waitFor(() => + expect(calls.some((c) => c.url.includes("/v1/usage/summary") && c.url.includes("bucket=hour"))).toBe(true), + ); }); }); diff --git a/web/src/pages/ActivityPage.tsx b/web/src/pages/ActivityPage.tsx index 0c27a6f7..a57dd463 100644 --- a/web/src/pages/ActivityPage.tsx +++ b/web/src/pages/ActivityPage.tsx @@ -1,5 +1,4 @@ import { Button } from "@heroui/react"; -import clsx from "clsx"; import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import type { ReactNode } from "react"; @@ -13,13 +12,16 @@ import { useUsers, } from "@/api/hooks"; import type { UsageEntry, UsageFilters, UsageMutationSelection } from "@/api/types"; +import { ActivityTimeline } from "@/components/ActivityTimeline"; import { BulkActionBar } from "@/components/BulkActionBar"; import { ConfirmDialog } from "@/components/ConfirmDialog"; import { DataTable, type DataTableColumn } from "@/components/DataTable"; +import { FilterChips, type FilterChip } from "@/components/FilterChips"; import { SetPriceDialog, type ManualRates } from "@/components/SetPriceDialog"; import { PAGE_SIZE_OPTIONS, TablePagination } from "@/components/TablePagination"; -import { ErrorBanner, FilterComboBox, FilterSelect, PageHeader } from "@/components/ui"; +import { ErrorBanner, FilterComboBox, FilterSelect, PageHeader, RefreshButton } from "@/components/ui"; import { resolveSelectedIds, useTableSelection } from "@/lib/tableSelection"; +import { ACTIVITY_DEFAULT_KEY, ACTIVITY_PRESETS, CUSTOM_KEY, findPreset, isoAgo, type RangePreset } from "@/lib/timeRange"; import { useUrlState } from "@/lib/urlState"; // ---------- formatting ---------- @@ -70,19 +72,11 @@ const activityRowClassName = (e: UsageEntry): string | undefined => e.status === "error" ? "bg-red-50" : undefined; // ---------- filter option sets ---------- - -const HOUR_S = 3_600; -const DAY_S = 86_400; - -const RANGE_PRESETS: { key: string; label: string; seconds: number | null }[] = [ - { key: "1h", label: "1h", seconds: HOUR_S }, - { key: "24h", label: "24h", seconds: DAY_S }, - { key: "7d", label: "7d", seconds: 7 * DAY_S }, - { key: "30d", label: "30d", seconds: 30 * DAY_S }, - { key: "all", label: "All", seconds: null }, -]; - -const DEFAULT_RANGE = "24h"; +// +// The time presets and the local-time custom picker are shared with the Usage +// page via `@/lib/timeRange` (see TimeRangeControl). Activity keeps a truthful +// "All": its raw list endpoint applies no default and no clamp, so an omitted +// start really is all-time. const STATUS_OPTIONS: { label: string; value: string }[] = [ { label: "All", value: "" }, @@ -100,7 +94,7 @@ const DEFAULT_PAGE_SIZE = 50; // All filter + pagination state, with defaults, kept in the URL. const URL_DEFAULTS = { - range: DEFAULT_RANGE, + range: ACTIVITY_DEFAULT_KEY, start_date: "", end_date: "", status: "", @@ -112,10 +106,6 @@ const URL_DEFAULTS = { size: String(DEFAULT_PAGE_SIZE), } as const; -function isoAgo(seconds: number): string { - return new Date(Date.now() - seconds * 1000).toISOString(); -} - // Resolve the query window. Explicit start_date/end_date bounds (a custom range, // or a drill-down from the Usage page) take precedence; otherwise a preset anchors // `start` to "now minus N", and "all" (or an empty custom range) leaves it open. @@ -123,10 +113,10 @@ function resolveWindow(range: string, start: string, end: string): { start?: str if (start || end) { return { start: start || undefined, end: end || undefined }; } - if (range === "custom") { + if (range === CUSTOM_KEY) { return {}; } - const preset = RANGE_PRESETS.find((p) => p.key === range) ?? RANGE_PRESETS.find((p) => p.key === DEFAULT_RANGE); + const preset = findPreset(ACTIVITY_PRESETS, range) ?? findPreset(ACTIVITY_PRESETS, ACTIVITY_DEFAULT_KEY); const seconds = preset?.seconds ?? null; return { start: seconds == null ? undefined : isoAgo(seconds), end: undefined }; } @@ -264,9 +254,13 @@ export function ActivityPage() { setWin(resolveWindow(range, startParam, endParam)); }, [range, startParam, endParam]); - // A custom range is active whenever explicit bounds are set (including a - // drill-down), otherwise the URL's preset drives the highlight. - const activeRange = startParam || endParam ? "custom" : range; + // The preset extent (ignoring any brushed bounds) that the timeline histogram + // spans. Snapshotted like `win`, re-anchored when the preset changes. + const [extentWin, setExtentWin] = useState(() => resolveWindow(range, "", "")); + useEffect(() => { + setExtentWin(resolveWindow(range, "", "")); + }, [range]); + const hasWindow = Boolean(win.start || win.end); const priced = pricedFilter === "true" ? true : pricedFilter === "false" ? false : undefined; @@ -318,19 +312,55 @@ export function ActivityPage() { modelSummary.data?.by_model?.filter((r) => !r.is_other && r.key !== null).map((r) => r.key as string) ?? []; const keyOptions = (keys.data ?? []).map((k) => ({ value: k.id, label: k.key_name ?? `${k.id.slice(0, 8)}…` })); + // The timeline histogram spans the whole preset *extent* (the rolling preset + // window, independent of any brushed sub-window), so the brush always has + // context to zoom back out into. For the unbounded "All" the summary endpoint + // applies its 30-day default, so the bars show recent activity while the list + // stays all-time; the caption reflects the true list window, and the brush + // still narrows it. Entity filters carry over so the bars match what's shown. + const extentPreset = findPreset(ACTIVITY_PRESETS, range) ?? findPreset(ACTIVITY_PRESETS, ACTIVITY_DEFAULT_KEY); + const extentBucket = extentPreset?.bucket ?? "day"; + const contextFilters: UsageFilters = useMemo( + () => ({ + start_date: extentWin.start, + status: statusFilter || undefined, + model: modelFilter.trim() || undefined, + user_id: userFilter || undefined, + api_key_id: apiKeyFilter || undefined, + priced, + }), + [extentWin, statusFilter, modelFilter, userFilter, apiKeyFilter, priced], + ); + const contextSummary = useUsageSummary(contextFilters, extentBucket); + const timelineSeries = (contextSummary.data?.series ?? []).map((p) => ({ + bucketStart: p.bucket_start, + requests: p.requests, + })); + const rows = usage.data ?? []; const totalIsExact = count.isSuccess && !count.isPlaceholderData; const total = totalIsExact ? (count.data?.total ?? 0) : null; const anyFilter = Boolean( statusFilter || modelFilter.trim() || userFilter || apiKeyFilter || pricedFilter || hasWindow, ); - // On mobile the status/priced/key/user/model controls collapse behind a - // "Filters" toggle (labelled with the active count) so the request table sits - // near the top; desktop shows them inline. - const [filtersOpen, setFiltersOpen] = useState(false); - const activeFilterCount = [statusFilter, pricedFilter, apiKeyFilter, userFilter, modelFilter.trim()].filter( - Boolean, - ).length; + + // Active entity filters as removable chips (time is driven by the timeline, so + // it is not a chip). Values show the human label where one exists. + const labelFrom = (options: { value: string; label: string }[], value: string) => + options.find((o) => o.value === value)?.label ?? value; + const userOptionsList = (users.data ?? []).map((u) => ({ + value: u.user_id, + label: u.alias ? `${u.alias} (${u.user_id})` : u.user_id, + })); + const clearEntityFilters = () => + url.patch({ status: "", priced: "", model: "", user_id: "", api_key_id: "" }); + const filterChips: FilterChip[] = [ + ...(statusFilter ? [{ key: "status", label: "Status", value: labelFrom(STATUS_OPTIONS, statusFilter), onClear: () => url.patch({ status: "" }) }] : []), + ...(pricedFilter ? [{ key: "priced", label: "Priced", value: labelFrom(PRICED_OPTIONS, pricedFilter), onClear: () => url.patch({ priced: "" }) }] : []), + ...(userFilter ? [{ key: "user", label: "User", value: labelFrom(userOptionsList, userFilter), onClear: () => url.patch({ user_id: "" }) }] : []), + ...(modelFilter.trim() ? [{ key: "model", label: "Model", value: modelFilter.trim(), onClear: () => url.patch({ model: "" }) }] : []), + ...(apiKeyFilter ? [{ key: "key", label: "API key", value: labelFrom(keyOptions, apiKeyFilter), onClear: () => url.patch({ api_key_id: "" }) }] : []), + ]; // Selection targets imported rows only; enforced gateway rows are disabled so // bulk delete / set-price can never reach them. @@ -411,26 +441,19 @@ export function ActivityPage() { ); }; - const clearFilters = () => { - // "All" time plus no filters is the true-empty baseline. - url.patch({ - range: "all", - start_date: "", - end_date: "", - status: "", - model: "", - user_id: "", - api_key_id: "", - priced: "", - }); - }; - const refresh = () => { setWin(resolveWindow(range, startParam, endParam)); + setExtentWin(resolveWindow(range, "", "")); void usage.refetch(); void count.refetch(); + void contextSummary.refetch(); }; + // A rolling preset clears any explicit bounds; a calendar pick sets them (the + // preset key is left as-is, the bounds' presence drives the "custom" highlight). + const pickPreset = (preset: RangePreset) => url.patch({ range: preset.key, start_date: "", end_date: "" }); + const pickCustom = (startIso: string, endIso: string) => url.patch({ start_date: startIso, end_date: endIso }); + // Memoized on keyLabels (the only per-render input) so DataTable's per-row // cache holds: a fresh array every render would rebuild all rows per click. const columns = useMemo[]>(() => { @@ -461,89 +484,34 @@ export function ActivityPage() { - Refresh - - } /> -
-
- {RANGE_PRESETS.map((preset) => ( - - ))} - -
- {activeRange === "custom" ? ( -
- - -
- ) : null} - -
- url.patch({ status: value })} - > +
+ (extentPreset ? pickPreset(extentPreset) : undefined)} + series={timelineSeries} + bucket={extentBucket} + windowStart={win.start} + windowEnd={win.end} + loading={contextSummary.isLoading} + ariaLabel="Activity request volume over the selected window" + action={} + /> + + url.patch({ status: value })}> {STATUS_OPTIONS.map((opt) => ( ))} - url.patch({ priced: value })} - > + url.patch({ priced: value })}> {PRICED_OPTIONS.map((opt) => (
+
{hasSelection ? ( diff --git a/web/src/pages/OverviewPage.tsx b/web/src/pages/OverviewPage.tsx index 95bc2730..9a5a1d85 100644 --- a/web/src/pages/OverviewPage.tsx +++ b/web/src/pages/OverviewPage.tsx @@ -14,7 +14,7 @@ import { import type { UsageEntry } from "@/api/types"; import { Sparkline } from "@/components/charts"; import { DataTable, type DataTableColumn } from "@/components/DataTable"; -import { DeltaHint, ErrorBanner, PageHeader, StatCard } from "@/components/ui"; +import { DeltaHint, ErrorBanner, PageHeader, RefreshButton, StatCard } from "@/components/ui"; import { deltaFraction, formatNumber, formatPct, formatRelative, formatUsd } from "@/lib/format"; import { budgetHealth, errorRateHealth, providerHealthStatus, toStatStatus } from "@/lib/overview"; @@ -130,9 +130,35 @@ export function OverviewPage({ needsSetup = false }: { needsSetup?: boolean }) { // renders its own inline banner, so including it here would double-report. const loadError = today.error ?? period.error ?? health.error ?? budgets.error ?? keys.error ?? users.error; + // Manual refresh for the whole page; the windows already advance across + // midnight on focus, but the numbers within a day are only as fresh as the + // last fetch, so give the operator a way to pull the latest. + const refresh = () => { + void today.refetch(); + void period.refetch(); + void previous.refetch(); + void health.refetch(); + void budgets.refetch(); + void keys.refetch(); + void users.refetch(); + void recent.refetch(); + }; + const isRefreshing = + today.isFetching || + period.isFetching || + health.isFetching || + budgets.isFetching || + keys.isFetching || + users.isFetching || + recent.isFetching; + return (
- + } + /> {showGettingStarted ? : null} diff --git a/web/src/pages/UsagePage.test.tsx b/web/src/pages/UsagePage.test.tsx index 09101680..baa2b1ec 100644 --- a/web/src/pages/UsagePage.test.tsx +++ b/web/src/pages/UsagePage.test.tsx @@ -1,5 +1,5 @@ import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import { fireEvent, render, screen, within } from "@testing-library/react"; +import { render, screen, within } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import type { ReactElement } from "react"; import { MemoryRouter, Route, Routes, useLocation } from "react-router-dom"; @@ -126,24 +126,19 @@ describe("UsagePage", () => { expect(screen.queryByRole("button", { name: "Export CSV" })).not.toBeInTheDocument(); }); - it("queries a custom from/to window when a custom range is set", async () => { + it("re-queries with an hourly bucket when a sub-day preset is chosen from the timeline", async () => { const user = userEvent.setup(); const fetchMock = mockApi(summary()); renderPage(); await screen.findByText("$1,240.50"); - - await user.click(screen.getByRole("button", { name: "Custom…" })); fetchMock.mockClear(); - fireEvent.change(screen.getByLabelText("From"), { target: { value: "2026-07-01T00:00" } }); - fireEvent.change(screen.getByLabelText("To"), { target: { value: "2026-07-15T00:00" } }); + + await user.click(screen.getByRole("button", { name: "Last hour" })); await vi.waitFor(() => { const summaryCalls = fetchMock.mock.calls.map(([u]) => String(u)).filter((u) => u.includes("/v1/usage/summary")); - // The current-window query carries both bounds (a separate call fetches the - // preceding window for deltas, so assert on the set, not just the last call). - expect(summaryCalls.some((u) => u.includes("start_date=2026-07-01") && u.includes("end_date=2026-07-15"))).toBe( - true, - ); + // The sub-day extent buckets hourly (both the context histogram and the tiles). + expect(summaryCalls.some((u) => u.includes("bucket=hour"))).toBe(true); }); }); @@ -330,10 +325,8 @@ describe("UsagePage", () => { ); renderPage(); - // Default window is 30d (a filter), so the empty state only reads as - // "never used" after clearing filters. - await screen.findByText("Spend by model"); - await userEvent.setup().click(screen.getByRole("button", { name: "Clear filters" })); + // The default 30d window is the baseline (not a user-applied filter), so an + // empty gateway reads as onboarding rather than "no rows match". expect(await screen.findByText(/No usage yet/)).toBeInTheDocument(); }); @@ -393,15 +386,16 @@ describe("UsagePage", () => { }); }); - it("collapses the filter controls behind a mobile toggle that expands them", async () => { + it("keeps the filter pickers behind an 'Add filter' toggle", async () => { mockApi(summary()); const user = userEvent.setup(); renderPage(); await screen.findByText("$1,240.50"); - const toggle = screen.getByRole("button", { name: "Filters" }); - const region = document.getElementById("usage-filters")!; - // Collapsed on mobile by default (display:none there; md: reveals it). + const toggle = screen.getByRole("button", { name: "Add filter" }); + const region = document.getElementById(toggle.getAttribute("aria-controls")!)!; + // jsdom does not apply Tailwind's `.hidden`, so assert on the class the toggle + // flips (display:none collapsed, flex expanded) rather than computed visibility. expect(toggle).toHaveAttribute("aria-expanded", "false"); expect(region.className).toContain("hidden"); @@ -412,18 +406,20 @@ describe("UsagePage", () => { expect(region.className).not.toContain("hidden"); }); - it("labels the mobile filter toggle with the active filter count", async () => { + it("surfaces an active filter as a removable chip", async () => { mockApi(summary()); const user = userEvent.setup(); renderPage(); await screen.findByText("$1,240.50"); - // No collapsible filters active yet (only the default time range). - expect(screen.getByRole("button", { name: "Filters" })).toBeInTheDocument(); + // No entity filters yet, so no chips. + expect(screen.queryByRole("button", { name: /Remove .* filter/ })).not.toBeInTheDocument(); + await user.click(screen.getByRole("button", { name: "Add filter" })); await user.click(screen.getByPlaceholderText("All keys")); await user.click(await screen.findByRole("option", { name: "ci-bot" })); - expect(await screen.findByRole("button", { name: "Filters (1)" })).toBeInTheDocument(); + // The picked key shows as a chip with a remove control. + expect(await screen.findByRole("button", { name: "Remove API key filter" })).toBeInTheDocument(); }); }); diff --git a/web/src/pages/UsagePage.tsx b/web/src/pages/UsagePage.tsx index 9f7edc1f..a5a34736 100644 --- a/web/src/pages/UsagePage.tsx +++ b/web/src/pages/UsagePage.tsx @@ -1,5 +1,4 @@ import { Button, Spinner } from "@heroui/react"; -import clsx from "clsx"; import { useEffect, useMemo, useRef, useState } from "react"; import { useNavigate } from "react-router-dom"; @@ -20,15 +19,18 @@ import type { UsageMutationSelection, UsageSeriesPoint, } from "@/api/types"; +import { ActivityTimeline } from "@/components/ActivityTimeline"; import { BulkActionBar } from "@/components/BulkActionBar"; import { BarTrendChart, Sparkline } from "@/components/charts"; import { ConfirmDialog } from "@/components/ConfirmDialog"; import { DataTable, type DataTableColumn } from "@/components/DataTable"; +import { FilterChips, type FilterChip } from "@/components/FilterChips"; import { SetPriceDialog, type ManualRates } from "@/components/SetPriceDialog"; import { TablePagination } from "@/components/TablePagination"; -import { DeltaHint, ErrorBanner, FilterComboBox, PageHeader, StatCard } from "@/components/ui"; +import { DeltaHint, ErrorBanner, FilterComboBox, PageHeader, RefreshButton, StatCard } from "@/components/ui"; import { deltaFraction, formatPct, formatTokens, formatUsd } from "@/lib/format"; import { resolveSelectedIds, useTableSelection } from "@/lib/tableSelection"; +import { bucketForWindow, findPreset, isoAgo, type RangePreset, USAGE_DEFAULT_KEY, USAGE_PRESETS } from "@/lib/timeRange"; // ---------- formatting ---------- @@ -46,35 +48,16 @@ function formatLatency(ms: number | null): string { return `${(ms / 1000).toFixed(2)} s`; } -// ---------- filter option sets (mirrors ActivityPage, plus 30d for spend) ---------- +// ---------- filter option sets ---------- +// +// The time presets, window math, and the local-time custom picker live in +// `@/lib/timeRange` and are shared with the Activity page (see TimeRangeControl). -const HOUR_S = 3_600; -const DAY_S = 86_400; - -interface Preset { - label: string; - seconds: number | null; - bucket: UsageBucket; -} - -// Sub-day windows bucket hourly; longer ranges bucket daily. "All" has no lower -// bound, so no previous period to compare against (deltas hide). -const TIME_PRESETS: Preset[] = [ - { label: "Last hour", seconds: HOUR_S, bucket: "hour" }, - { label: "24h", seconds: DAY_S, bucket: "hour" }, - { label: "7d", seconds: 7 * DAY_S, bucket: "day" }, - { label: "30d", seconds: 30 * DAY_S, bucket: "day" }, - { label: "All", seconds: null, bucket: "day" }, -]; - -const DEFAULT_PRESET = TIME_PRESETS[3]; // 30d: a spend investigation is usually monthly. +// 30d: a spend investigation is usually monthly. +const DEFAULT_PRESET = findPreset(USAGE_PRESETS, USAGE_DEFAULT_KEY) as RangePreset; const TABLE_TOP_N = 15; -function isoAgo(seconds: number): string { - return new Date(Date.now() - seconds * 1000).toISOString(); -} - // ---------- breakdown table ---------- interface BreakdownProps { @@ -419,23 +402,31 @@ export function UsagePage() { const users = useUsers(); const keys = useKeys(); - const [preset, setPreset] = useState(DEFAULT_PRESET); - const [startDate, setStartDate] = useState(() => - DEFAULT_PRESET.seconds === null ? undefined : isoAgo(DEFAULT_PRESET.seconds), - ); - // Custom range: an explicit from/to window (like the Activity page), buckets - // daily. When active it overrides the preset window. + const [preset, setPreset] = useState(DEFAULT_PRESET); + // Anchored start of the rolling preset window, snapshotted so a re-render does + // not recompute "now" and churn the query key. Re-anchored on preset change + // and on refresh. Usage presets are all bounded, so this is always set. + const [startDate, setStartDate] = useState(() => isoAgo(DEFAULT_PRESET.seconds ?? 0)); + // Custom range: an explicit calendar window (local time), resolved to absolute + // instants by the picker. When active it overrides the preset window. The + // calendar always yields both bounds, so there is no half-filled window. const [customMode, setCustomMode] = useState(false); - const [customFrom, setCustomFrom] = useState(""); - const [customTo, setCustomTo] = useState(""); + const [customStart, setCustomStart] = useState(); + const [customEnd, setCustomEnd] = useState(); const [modelFilter, setModelFilter] = useState(""); const [userFilter, setUserFilter] = useState(""); const [apiKeyFilter, setApiKeyFilter] = useState(""); const [metric, setMetric] = useState("cost"); - const winStart = customMode ? customFrom || undefined : startDate; - const winEnd = customMode ? customTo || undefined : undefined; - const bucket: UsageBucket = customMode ? "day" : preset.bucket; + const winStart = customMode ? customStart : startDate; + const winEnd = customMode ? customEnd : undefined; + // Bucket by the window's length, not by whether it is custom, so a short + // custom range still buckets hourly instead of collapsing to a single point. + const bucket: UsageBucket = customMode + ? winStart + ? bucketForWindow(winStart, winEnd) + : "day" + : preset.bucket; const filters: UsageFilters = useMemo( () => ({ @@ -449,7 +440,7 @@ export function UsagePage() { ); // The immediately-preceding window of equal length, for period-over-period - // deltas. Only meaningful for a bounded range. + // deltas. Every preset is now bounded, so a comparison always exists. const previousFilters: UsageFilters | null = useMemo(() => { if (customMode) { if (!winStart || !winEnd) return null; @@ -457,7 +448,7 @@ export function UsagePage() { if (!(span > 0)) return null; return { ...filters, start_date: new Date(new Date(winStart).getTime() - span).toISOString(), end_date: winStart }; } - if (preset.seconds === null || !startDate) return null; + if (!startDate || preset.seconds === null) return null; return { ...filters, start_date: new Date(new Date(startDate).getTime() - preset.seconds * 1000).toISOString(), @@ -469,6 +460,25 @@ export function UsagePage() { const summary = useUsageSummary(filters, bucket); const previous = useUsageSummary(previousFilters ?? filters, bucket, previousFilters !== null); + // The timeline histogram spans the whole preset *extent* (independent of the + // brushed sub-window), so the brush always has context to zoom back out into. + // When the brush is full this is the same query as `summary` (deduped); a + // sub-window makes them diverge by one query. + const contextFilters: UsageFilters = useMemo( + () => ({ + start_date: startDate, + model: modelFilter.trim() || undefined, + user_id: userFilter || undefined, + api_key_id: apiKeyFilter || undefined, + }), + [startDate, modelFilter, userFilter, apiKeyFilter], + ); + const contextSummary = useUsageSummary(contextFilters, preset.bucket); + const timelineSeries = (contextSummary.data?.series ?? []).map((p) => ({ + bucketStart: p.bucket_start, + requests: p.requests, + })); + const data = summary.data; const totals = data?.totals; const prevTotals = previousFilters !== null ? previous.data?.totals : undefined; @@ -496,43 +506,66 @@ export function UsagePage() { modelFilter && !modelOptions.includes(modelFilter) ? [modelFilter, ...modelOptions] : modelOptions ).map((m) => ({ value: m, label: m })); - const timeFiltered = customMode ? Boolean(winStart || winEnd) : preset.seconds !== null; + // The default 30d window is the baseline (like the old "All" was), so it does + // not count as a user-applied time filter: clearing returns to it, and an + // empty gateway on the default view still reads as onboarding, not "no match". + const timeFiltered = customMode || preset.key !== USAGE_DEFAULT_KEY; const anyFilter = Boolean(modelFilter.trim() || userFilter || apiKeyFilter || timeFiltered); - // On mobile the user/model/key controls collapse behind a "Filters" toggle so - // the tiles and breakdowns sit near the top; desktop shows them inline. - const [filtersOpen, setFiltersOpen] = useState(false); - const activeFilterCount = [modelFilter.trim(), userFilter, apiKeyFilter].filter(Boolean).length; + + // Active entity filters as removable chips (time is driven by the timeline, so + // it is not a chip). Values show the human label where one exists. + const labelFor = (options: { value: string; label: string }[], value: string) => + options.find((o) => o.value === value)?.label ?? value; + const clearEntityFilters = () => { + setModelFilter(""); + setUserFilter(""); + setApiKeyFilter(""); + }; + const filterChips: FilterChip[] = [ + ...(userFilter ? [{ key: "user", label: "User", value: labelFor(userOptions, userFilter), onClear: () => setUserFilter("") }] : []), + ...(modelFilter.trim() ? [{ key: "model", label: "Model", value: modelFilter.trim(), onClear: () => setModelFilter("") }] : []), + ...(apiKeyFilter ? [{ key: "key", label: "API key", value: labelFor(keyOptions, apiKeyFilter), onClear: () => setApiKeyFilter("") }] : []), + ]; + // Distinguish "this gateway has never served a request" from "no rows match // these filters": the first is an onboarding state, the second is a filter hint. const isEmptyEver = Boolean(data && totals && totals.request_count === 0 && !anyFilter); - const pickPreset = (next: Preset) => { + // The window the server actually aggregated over, so the caption reflects any + // default or clamp. Falls back to the client-intended window before the first + // response lands. + const effectiveStart = data?.start_date ?? winStart; + const effectiveEnd = data?.end_date ?? winEnd; + + const pickPreset = (next: RangePreset) => { setCustomMode(false); setPreset(next); - setStartDate(next.seconds === null ? undefined : isoAgo(next.seconds)); + setStartDate(isoAgo(next.seconds ?? 0)); + setCustomStart(undefined); + setCustomEnd(undefined); }; - const clearFilters = () => { - pickPreset(TIME_PRESETS[TIME_PRESETS.length - 1]); // All - setCustomFrom(""); - setCustomTo(""); - setModelFilter(""); - setUserFilter(""); - setApiKeyFilter(""); + const pickCustom = (startIso: string, endIso: string) => { + setCustomMode(true); + setCustomStart(startIso); + setCustomEnd(endIso); }; const refresh = () => { - if (preset.seconds !== null) { - setStartDate(isoAgo(preset.seconds)); + if (!customMode) { + setStartDate(isoAgo(preset.seconds ?? 0)); } void summary.refetch(); + void contextSummary.refetch(); }; // Drill from a breakdown row into the Activity log, pre-filtering on the picked - // dimension plus the current time window. + // dimension plus the current time window. The bounds are absolute instants, so + // Activity reads the same window without any local/UTC reinterpretation. const drillTo = (params: Record) => { const search = new URLSearchParams(); - if (startDate) search.set("start_date", startDate); + if (winStart) search.set("start_date", winStart); + if (winEnd) search.set("end_date", winEnd); for (const [k, v] of Object.entries(params)) { if (v) search.set(k, v); } @@ -552,95 +585,32 @@ export function UsagePage() { - Refresh - - } /> - {/* Filters */} -
-
- {TIME_PRESETS.map((option) => ( - - ))} - -
- {customMode ? ( -
- - -
- ) : null} - -
- - - - {anyFilter ? ( - - ) : null} -
+ {/* Filters: the timeline picks the window; chips carry entity filters. The + refresh control rides the timeline's preset row to save vertical space. */} +
+ pickPreset(preset)} + series={timelineSeries} + bucket={preset.bucket} + windowStart={effectiveStart} + windowEnd={effectiveEnd} + loading={contextSummary.isLoading} + ariaLabel="Usage request volume over the selected window" + action={} + /> + + + + +
{isEmptyEver ? ( From ddb8113dd36e4571ec6098d6651af8adeb5cf374 Mon Sep 17 00:00:00 2001 From: Nathan Brake Date: Tue, 28 Jul 2026 18:16:04 +0000 Subject: [PATCH 2/3] fix(dashboard): address self-review findings on the timeline selector Four fixes from reviewing the PR diff: - Frame a drill-down window that reaches outside the preset extent. A Usage drill-through carries explicit bounds while Activity's `range` param still holds the 24h default, so the timeline highlighted "24h" and drew an unrelated 24h histogram under a 30-day window. The window itself is now the frame (no preset highlighted), and zoom-out falls back to the smallest broader preset so it never dead-ends. - Make arrow keys work on the handles. The slider's built-in arrow step is the fine pointer step (0.1 bucket), which the bucket-snapping commit immediately undid, so a single arrow press was a silent no-op. A capture-phase keydown on the wrapper reroutes arrows to whole-bucket steps before react-aria's unconditional handler sees them; PageUp/Down, Home, and End stay react-aria's. - Commit pan drags from a ref. A pointerup can fire before the last pointermove's setState re-renders, so committing from the closure value could snap to a different bucket than the one on screen. - Refresh stale comments that still referenced the removed calendar picker and its local-time semantics. Co-Authored-By: Claude Fable 5 --- .../dashboard/assets/ActivityPage-BFwaR2GB.js | 1 - .../dashboard/assets/ActivityPage-CV-nynWl.js | 1 + ...ge-Q7olOjhL.js => AliasesPage-wZMHXIpE.js} | 2 +- ...ge-lTuTS-F9.js => BudgetsPage-p9qxuU3G.js} | 2 +- ...-CWW3AYpK.js => ConfirmDialog-D_mZT4k-.js} | 2 +- ...sPage-BAH_T1JY.js => DocsPage-D7XUEYdI.js} | 2 +- .../dashboard/assets/FilterChips-DZjxf-ot.js | 1 + .../dashboard/assets/FilterChips-Wo8I8zEd.js | 1 - ...sPage-bUjPPYgf.js => KeysPage-DZwI8ovn.js} | 2 +- ...R9Ylv.js => ModelScopeControl-DY7OwwJM.js} | 2 +- ...age-BMtuCmJv.js => ModelsPage-CAoQKgS_.js} | 2 +- ...e-CX9hXHG1.js => OverviewPage-B4Niis7e.js} | 2 +- ...-DQdazSS9.js => ProvidersPage-BX7hxsKz.js} | 2 +- ...e-CJyO6zWH.js => SettingsPage-0IuzwARi.js} | 2 +- ...1AimUKf.js => TablePagination-Chra1w0V.js} | 2 +- ...DRp.js => ToolsGuardrailsPage-KUSgM6cX.js} | 2 +- ...Page-BECQyz4e.js => UsagePage-M0prV-lU.js} | 2 +- ...Page-CAU0FXTt.js => UsersPage-DPrtdYVu.js} | 2 +- .../{index-CGnfXTEF.js => index-DHi1jXMu.js} | 4 +- src/gateway/static/dashboard/index.html | 2 +- web/src/components/ActivityTimeline.test.tsx | 20 ++++ web/src/components/ActivityTimeline.tsx | 111 +++++++++++++----- web/src/pages/ActivityPage.test.tsx | 24 ++++ web/src/pages/ActivityPage.tsx | 42 +++++-- web/src/pages/UsagePage.tsx | 10 +- 25 files changed, 181 insertions(+), 64 deletions(-) delete mode 100644 src/gateway/static/dashboard/assets/ActivityPage-BFwaR2GB.js create mode 100644 src/gateway/static/dashboard/assets/ActivityPage-CV-nynWl.js rename src/gateway/static/dashboard/assets/{AliasesPage-Q7olOjhL.js => AliasesPage-wZMHXIpE.js} (98%) rename src/gateway/static/dashboard/assets/{BudgetsPage-lTuTS-F9.js => BudgetsPage-p9qxuU3G.js} (98%) rename src/gateway/static/dashboard/assets/{ConfirmDialog-CWW3AYpK.js => ConfirmDialog-D_mZT4k-.js} (92%) rename src/gateway/static/dashboard/assets/{DocsPage-BAH_T1JY.js => DocsPage-D7XUEYdI.js} (99%) create mode 100644 src/gateway/static/dashboard/assets/FilterChips-DZjxf-ot.js delete mode 100644 src/gateway/static/dashboard/assets/FilterChips-Wo8I8zEd.js rename src/gateway/static/dashboard/assets/{KeysPage-bUjPPYgf.js => KeysPage-DZwI8ovn.js} (98%) rename src/gateway/static/dashboard/assets/{ModelScopeControl-DmfR9Ylv.js => ModelScopeControl-DY7OwwJM.js} (98%) rename src/gateway/static/dashboard/assets/{ModelsPage-BMtuCmJv.js => ModelsPage-CAoQKgS_.js} (99%) rename src/gateway/static/dashboard/assets/{OverviewPage-CX9hXHG1.js => OverviewPage-B4Niis7e.js} (98%) rename src/gateway/static/dashboard/assets/{ProvidersPage-DQdazSS9.js => ProvidersPage-BX7hxsKz.js} (99%) rename src/gateway/static/dashboard/assets/{SettingsPage-CJyO6zWH.js => SettingsPage-0IuzwARi.js} (99%) rename src/gateway/static/dashboard/assets/{TablePagination-r1AimUKf.js => TablePagination-Chra1w0V.js} (98%) rename src/gateway/static/dashboard/assets/{ToolsGuardrailsPage-1cTNaDRp.js => ToolsGuardrailsPage-KUSgM6cX.js} (99%) rename src/gateway/static/dashboard/assets/{UsagePage-BECQyz4e.js => UsagePage-M0prV-lU.js} (97%) rename src/gateway/static/dashboard/assets/{UsersPage-CAU0FXTt.js => UsersPage-DPrtdYVu.js} (98%) rename src/gateway/static/dashboard/assets/{index-CGnfXTEF.js => index-DHi1jXMu.js} (96%) diff --git a/src/gateway/static/dashboard/assets/ActivityPage-BFwaR2GB.js b/src/gateway/static/dashboard/assets/ActivityPage-BFwaR2GB.js deleted file mode 100644 index 9d35258a..00000000 --- a/src/gateway/static/dashboard/assets/ActivityPage-BFwaR2GB.js +++ /dev/null @@ -1 +0,0 @@ -import{j as s}from"./tanstack-query-1t81HyiD.js";import{u as Ke,r as n}from"./react-dgEcD0HR.js";import{u as Be,a as $e,b as qe,c as pe,d as ge,e as ze,f as We,P as Ye,E as Ge,R as He,F as he,g as q}from"./index-CGnfXTEF.js";import{f as D,A as Ve,a as P,F as Ze,b as W,C as Je,i as Qe}from"./FilterChips-Wo8I8zEd.js";import{u as Xe,r as et,B as tt}from"./tableSelection-9hV37uhu.js";import{C as st}from"./ConfirmDialog-CWW3AYpK.js";import{D as at}from"./DataTable-Bmn_eYSV.js";import{T as rt,S as lt,P as nt}from"./TablePagination-r1AimUKf.js";import{B as z}from"./heroui-BI50yK5B.js";import"./recharts-C4kRDmvS.js";function ot(t){const[l,i]=Ke(),a=n.useCallback(g=>l.get(g)??t[g],[l,t]),o=n.useCallback(g=>{const u=Number.parseInt(l.get(g)??"",10);if(!Number.isNaN(u))return u;const c=Number.parseInt(t[g],10);return Number.isNaN(c)?0:c},[l,t]),k=n.useCallback(g=>{i(u=>{const c=new URLSearchParams(u);for(const[m,h]of Object.entries(g)){const b=String(h);b===""||b===t[m]?c.delete(m):c.set(m,b)}return c},{replace:!0})},[i,t]);return{get:a,getNumber:o,patch:k}}const it=new Intl.NumberFormat(void 0,{style:"currency",currency:"USD",maximumFractionDigits:4});function T(t){return t===null?"—":it.format(t)}function _(t){return t===null?"—":t.toLocaleString()}function fe(t){return t===null?"—":t<1e3?`${t} ms`:`${(t/1e3).toFixed(t<1e4?2:1)} s`}function ct(t){const l=new Date(t);return Number.isNaN(l.getTime())?t:l.toLocaleString()}function dt(t){const l=new Date(t).getTime();if(Number.isNaN(l))return t;const i=Math.max(0,Math.round((Date.now()-l)/1e3));if(i<60)return`${i}s ago`;const a=Math.round(i/60);if(a<60)return`${a}m ago`;const o=Math.round(a/60);return o<24?`${o}h ago`:`${Math.round(o/24)}d ago`}const ut=t=>t.id,mt=t=>t.status==="error"?"bg-red-50":void 0,xe=[{label:"All",value:""},{label:"Success",value:"success"},{label:"Error",value:"error"}],be=[{label:"All",value:""},{label:"Priced",value:"true"},{label:"Unpriced",value:"false"}],pt=50,gt={range:W,start_date:"",end_date:"",status:"",model:"",user_id:"",api_key_id:"",priced:"",page:"0",size:String(pt)};function y(t,l,i){if(l||i)return{start:l||void 0,end:i||void 0};if(t===Je)return{};const a=D(P,t)??D(P,W),o=(a==null?void 0:a.seconds)??null;return{start:o==null?void 0:Qe(o),end:void 0}}function ht({status:t}){const l=t==="error"?"border-red-200 bg-red-50 text-red-700":"border-[var(--otari-line)] bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]";return s.jsx("span",{className:`inline-flex items-center rounded-full border px-2 py-0.5 text-xs font-medium ${l}`,children:t})}const xt={gateway:"Gateway",claude_code:"Claude Code",codex:"Codex"};function bt(t){return xt[t]??t}function d({label:t,children:l}){return s.jsxs("div",{className:"flex flex-col gap-0.5",children:[s.jsx("span",{className:"text-[11px] font-medium uppercase tracking-wide text-[var(--otari-muted)]",children:t}),s.jsx("span",{className:"text-sm text-[var(--otari-ink)] break-all",children:l})]})}function ft({entry:t}){var l;return s.jsxs("div",{className:"flex flex-col gap-4 px-4 py-4",children:[t.error_message?s.jsxs("div",{className:"flex flex-col gap-1.5",children:[s.jsx("span",{className:"text-[11px] font-medium uppercase tracking-wide text-[var(--otari-muted)]",children:"Error"}),s.jsx("pre",{className:"max-h-48 overflow-auto rounded-lg border border-red-200 bg-red-50 p-3 text-xs whitespace-pre-wrap break-all text-red-700",children:"The provider returned an error. Inspect gateway logs for details."})]}):null,s.jsxs("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-4",children:[s.jsx(d,{label:"Provider",children:t.provider??"—"}),s.jsx(d,{label:"Endpoint",children:t.endpoint}),s.jsx(d,{label:"Source",children:bt(t.source)}),t.source_label?s.jsx(d,{label:"Session",children:t.source_label}):null,s.jsx(d,{label:"User",children:t.user_id??"—"}),s.jsx(d,{label:"API key",children:t.api_key_id??"—"}),s.jsx(d,{label:"Prompt tokens",children:_(t.prompt_tokens)}),s.jsx(d,{label:"Completion tokens",children:_(t.completion_tokens)}),s.jsx(d,{label:"Total tokens",children:_(t.total_tokens)}),s.jsx(d,{label:"Cost",children:T(t.cost)}),s.jsx(d,{label:"Cache read tokens",children:_(t.cache_read_tokens)}),s.jsx(d,{label:"Cache write tokens",children:_(t.cache_write_tokens)}),s.jsx(d,{label:"1h cache writes",children:_(t.cache_write_1h_tokens??null)}),s.jsx(d,{label:"Total time",children:fe(t.latency_ms)}),s.jsx(d,{label:"Request ID",children:t.id})]}),(l=t.pricing_breakdown)!=null&&l.length?s.jsxs("div",{className:"flex flex-col gap-2",children:[s.jsx("span",{className:"text-[11px] font-medium uppercase tracking-wide text-[var(--otari-muted)]",children:"Billed meters"}),s.jsx("div",{className:"grid gap-2 sm:grid-cols-2 lg:grid-cols-3",children:t.pricing_breakdown.map(i=>s.jsxs(d,{label:i.meter.replaceAll("_"," "),children:[_(i.units)," at ",T(i.rate_per_million)," / 1M, ",T(i.cost)]},i.meter))})]}):null]})}function Ft(){var oe,ie,ce,de,ue;const t=Be(),l=$e(),i=n.useMemo(()=>{const e=new Map;for(const r of l.data??[])e.set(r.id,r.key_name??`${r.id.slice(0,8)}…`);return e},[l.data]),a=ot(gt),o=a.get("range"),k=a.get("start_date"),g=a.get("end_date"),u=a.get("status"),c=a.get("model"),m=a.get("user_id"),h=a.get("api_key_id"),b=a.get("priced"),Y=Math.max(0,a.getNumber("page")),G=a.getNumber("size"),I=nt.reduce((e,r)=>Math.abs(r-G)y(o,k,g));n.useEffect(()=>{H(y(o,k,g))},[o,k,g]);const[V,Z]=n.useState(()=>y(o,"",""));n.useEffect(()=>{Z(y(o,"",""))},[o]);const _e=!!(f.start||f.end),N=b==="true"?!0:b==="false"?!1:void 0,x=n.useMemo(()=>({start_date:f.start,end_date:f.end,status:u||void 0,model:c.trim()||void 0,user_id:m||void 0,api_key_id:h||void 0,priced:N}),[f,u,c,m,h,N]),p=Xe(),A=JSON.stringify(x),J=n.useRef(A);n.useEffect(()=>{J.current!==A&&(J.current=A,a.patch({page:0}),p.clear())},[A,a,p]);const v=qe(x,Y,I),j=pe(x),ve=n.useMemo(()=>({start_date:f.start,end_date:f.end,status:u||void 0,user_id:m||void 0,api_key_id:h||void 0}),[f,u,m,h]),U=((ie=(oe=ge(ve,"day").data)==null?void 0:oe.by_model)==null?void 0:ie.filter(e=>!e.is_other&&e.key!==null).map(e=>e.key))??[],Q=(l.data??[]).map(e=>({value:e.id,label:e.key_name??`${e.id.slice(0,8)}…`})),C=D(P,o)??D(P,W),X=(C==null?void 0:C.bucket)??"day",Se=n.useMemo(()=>({start_date:V.start,status:u||void 0,model:c.trim()||void 0,user_id:m||void 0,api_key_id:h||void 0,priced:N}),[V,u,c,m,h,N]),O=ge(Se,X),ke=(((ce=O.data)==null?void 0:ce.series)??[]).map(e=>({bucketStart:e.bucket_start,requests:e.requests})),S=v.data??[],ye=j.isSuccess&&!j.isPlaceholderData?((de=j.data)==null?void 0:de.total)??0:null,je=!!(u||c.trim()||m||h||b||_e),M=(e,r)=>{var me;return((me=e.find(Re=>Re.value===r))==null?void 0:me.label)??r},ee=(t.data??[]).map(e=>({value:e.user_id,label:e.alias?`${e.alias} (${e.user_id})`:e.user_id})),Ce=()=>a.patch({status:"",priced:"",model:"",user_id:"",api_key_id:""}),we=[...u?[{key:"status",label:"Status",value:M(xe,u),onClear:()=>a.patch({status:""})}]:[],...b?[{key:"priced",label:"Priced",value:M(be,b),onClear:()=>a.patch({priced:""})}]:[],...m?[{key:"user",label:"User",value:M(ee,m),onClear:()=>a.patch({user_id:""})}]:[],...c.trim()?[{key:"model",label:"Model",value:c.trim(),onClear:()=>a.patch({model:""})}]:[],...h?[{key:"key",label:"API key",value:M(Q,h),onClear:()=>a.patch({api_key_id:""})}]:[]],L=n.useMemo(()=>S.filter(e=>!e.counts_toward_budget).map(e=>e.id),[S]),Pe=n.useMemo(()=>S.filter(e=>e.counts_toward_budget).map(e=>e.id),[S]),te=et(p.selectedKeys,L),w=te.length,se=p.allMatching||w>0,Ne=n.useMemo(()=>({...x,counts_toward_budget:!1}),[x]),ae=pe(Ne,se),E=ae.isSuccess?((ue=ae.data)==null?void 0:ue.total)??null:null,Ae=L.length>0&&w===L.length&&E!=null&&E>w,F=p.allMatching?E??w:w,R=ze(),K=We(),[Me,B]=n.useState(!1),[Ee,$]=n.useState(!1),[Fe,re]=n.useState(null),Te=n.useCallback(e=>s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center justify-between border-b border-[var(--otari-line)] px-4 py-2",children:[s.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Request detail"}),s.jsx(z,{size:"sm",variant:"ghost",onPress:()=>re(null),children:"Close"})]}),s.jsx(ft,{entry:e})]}),[]),le=()=>p.allMatching?{by_filter:!0,model:x.model,user_id:x.user_id,api_key_id:x.api_key_id,status:x.status,start_date:x.start_date,end_date:x.end_date,priced:x.priced}:{ids:te},De=()=>{R.mutate(le(),{onSuccess:()=>{B(!1),p.clear()}})},Ie=e=>{K.mutate({...le(),...e},{onSuccess:()=>{$(!1),p.clear()}})},Ue=()=>{H(y(o,k,g)),Z(y(o,"","")),v.refetch(),j.refetch(),O.refetch()},ne=e=>a.patch({range:e.key,start_date:"",end_date:""}),Oe=(e,r)=>a.patch({start_date:e,end_date:r}),Le=n.useMemo(()=>{const e=r=>r===null?"—":i.get(r)??`${r.slice(0,8)}…`;return[{id:"time",header:"Time",cell:r=>s.jsx("span",{title:ct(r.timestamp),className:"text-[var(--otari-muted)]",children:dt(r.timestamp)})},{id:"user",header:"User",cell:r=>r.user_id??"—"},{id:"model",header:"Model",isRowHeader:!0,cell:r=>r.model},{id:"api_key",header:"API key",cell:r=>s.jsx("span",{className:"text-[var(--otari-muted)]",children:e(r.api_key_id)})},{id:"tokens",header:"Tokens",align:"end",cell:r=>_(r.total_tokens)},{id:"cost",header:"Cost",align:"end",cell:r=>T(r.cost)},{id:"latency",header:"Total time",align:"end",cell:r=>fe(r.latency_ms)},{id:"status",header:"Status",cell:r=>s.jsx(ht,{status:r.status})}]},[i]);return s.jsxs("div",{className:"flex flex-col gap-6",children:[s.jsx(Ye,{title:"Activity",description:"A per-request log of what the gateway served: tokens, cost, latency, and failures. No request or response content is stored."}),s.jsx(Ge,{error:v.error??j.error}),s.jsxs("div",{className:"flex flex-col gap-3",children:[s.jsx(Ve,{presets:P,extentKey:o,onPreset:ne,onSelectRange:Oe,onSelectFull:()=>C?ne(C):void 0,series:ke,bucket:X,windowStart:f.start,windowEnd:f.end,loading:O.isLoading,ariaLabel:"Activity request volume over the selected window",action:s.jsx(He,{onRefresh:Ue,isFetching:v.isFetching,updatedAt:v.dataUpdatedAt})}),s.jsxs(Ze,{chips:we,onClearAll:Ce,children:[s.jsx(he,{id:"filter-status",label:"Status",value:u,onChange:e=>a.patch({status:e}),children:xe.map(e=>s.jsx("option",{value:e.value,children:e.label},e.value))}),s.jsx(he,{id:"filter-priced",label:"Priced?",value:b,onChange:e=>a.patch({priced:e}),children:be.map(e=>s.jsx("option",{value:e.value,children:e.label},e.value))}),s.jsx(q,{label:"API key",value:h,onChange:e=>a.patch({api_key_id:e}),placeholder:"All keys",options:Q}),s.jsx(q,{label:"User",value:m,onChange:e=>a.patch({user_id:e}),placeholder:"All users",options:ee}),s.jsx(q,{label:"Model",value:c,onChange:e=>a.patch({model:e}),allowsCustom:!0,placeholder:"Any model",options:(c&&!U.includes(c)?[c,...U]:U).map(e=>({value:e,label:e}))})]})]}),se?s.jsxs(tt,{selectedCount:F,allMatching:p.allMatching,matchingTotal:E,canSelectAllMatching:Ae,onSelectAllMatching:p.enableAllMatching,onClear:p.clear,children:[s.jsx(z,{size:"sm",variant:"primary",onPress:()=>$(!0),children:"Set price"}),s.jsx(z,{size:"sm",variant:"danger",onPress:()=>B(!0),children:"Delete"})]}):null,s.jsx(at,{ariaLabel:"Activity log",columns:Le,rows:S,getRowKey:ut,isLoading:v.isLoading,emptyContent:je?"No requests match these filters.":"No requests recorded yet.",selectionMode:"multiple",selectedKeys:p.selectedKeys,onSelectionChange:p.onSelectionChange,disabledKeys:Pe,onRowAction:e=>re(r=>r===e?null:e),rowClassName:mt,detailKey:Fe,renderDetail:Te}),s.jsx(rt,{page:Y,pageSize:I,total:ye,rowsOnPage:S.length,onPageChange:e=>a.patch({page:e}),onPageSizeChange:e=>a.patch({size:e,page:0}),isFetching:v.isFetching,hasNextFallback:S.length===I}),s.jsx(st,{isOpen:Me,onOpenChange:B,heading:"Delete usage rows",body:`Delete ${F.toLocaleString()} imported ${F===1?"row":"rows"}? Only imported rows are removed, and this cannot be undone.`,confirmLabel:"Delete",isPending:R.isPending,error:R.error,onConfirm:De}),s.jsx(lt,{isOpen:Ee,onOpenChange:$,targetCount:F,isPending:K.isPending,error:K.error,onSubmit:Ie})]})}export{Ft as ActivityPage}; diff --git a/src/gateway/static/dashboard/assets/ActivityPage-CV-nynWl.js b/src/gateway/static/dashboard/assets/ActivityPage-CV-nynWl.js new file mode 100644 index 00000000..b851dc82 --- /dev/null +++ b/src/gateway/static/dashboard/assets/ActivityPage-CV-nynWl.js @@ -0,0 +1 @@ +import{j as s}from"./tanstack-query-1t81HyiD.js";import{u as qe,r as n}from"./react-dgEcD0HR.js";import{u as ze,a as We,b as Ye,c as ge,d as he,e as Ge,f as He,P as Ve,E as Ze,R as Je,F as xe,g as W}from"./index-DHi1jXMu.js";import{f as O,b as Qe,A as Xe,C as fe,a as N,F as et,c as G,i as tt}from"./FilterChips-DZjxf-ot.js";import{u as st,r as at,B as rt}from"./tableSelection-9hV37uhu.js";import{C as lt}from"./ConfirmDialog-D_mZT4k-.js";import{D as nt}from"./DataTable-Bmn_eYSV.js";import{T as ot,S as it,P as ct}from"./TablePagination-Chra1w0V.js";import{B as Y}from"./heroui-BI50yK5B.js";import"./recharts-C4kRDmvS.js";function dt(t){const[l,i]=qe(),a=n.useCallback(h=>l.get(h)??t[h],[l,t]),o=n.useCallback(h=>{const m=Number.parseInt(l.get(h)??"",10);if(!Number.isNaN(m))return m;const c=Number.parseInt(t[h],10);return Number.isNaN(c)?0:c},[l,t]),S=n.useCallback(h=>{i(m=>{const c=new URLSearchParams(m);for(const[p,x]of Object.entries(h)){const _=String(x);_===""||_===t[p]?c.delete(p):c.set(p,_)}return c},{replace:!0})},[i,t]);return{get:a,getNumber:o,patch:S}}const ut=new Intl.NumberFormat(void 0,{style:"currency",currency:"USD",maximumFractionDigits:4});function I(t){return t===null?"—":ut.format(t)}function f(t){return t===null?"—":t.toLocaleString()}function ve(t){return t===null?"—":t<1e3?`${t} ms`:`${(t/1e3).toFixed(t<1e4?2:1)} s`}function mt(t){const l=new Date(t);return Number.isNaN(l.getTime())?t:l.toLocaleString()}function pt(t){const l=new Date(t).getTime();if(Number.isNaN(l))return t;const i=Math.max(0,Math.round((Date.now()-l)/1e3));if(i<60)return`${i}s ago`;const a=Math.round(i/60);if(a<60)return`${a}m ago`;const o=Math.round(a/60);return o<24?`${o}h ago`:`${Math.round(o/24)}d ago`}const gt=t=>t.id,ht=t=>t.status==="error"?"bg-red-50":void 0,be=[{label:"All",value:""},{label:"Success",value:"success"},{label:"Error",value:"error"}],_e=[{label:"All",value:""},{label:"Priced",value:"true"},{label:"Unpriced",value:"false"}],xt=50,bt={range:G,start_date:"",end_date:"",status:"",model:"",user_id:"",api_key_id:"",priced:"",page:"0",size:String(xt)};function y(t,l,i){if(l||i)return{start:l||void 0,end:i||void 0};if(t===fe)return{};const a=O(N,t)??O(N,G),o=(a==null?void 0:a.seconds)??null;return{start:o==null?void 0:tt(o),end:void 0}}function _t({status:t}){const l=t==="error"?"border-red-200 bg-red-50 text-red-700":"border-[var(--otari-line)] bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]";return s.jsx("span",{className:`inline-flex items-center rounded-full border px-2 py-0.5 text-xs font-medium ${l}`,children:t})}const ft={gateway:"Gateway",claude_code:"Claude Code",codex:"Codex"};function vt(t){return ft[t]??t}function u({label:t,children:l}){return s.jsxs("div",{className:"flex flex-col gap-0.5",children:[s.jsx("span",{className:"text-[11px] font-medium uppercase tracking-wide text-[var(--otari-muted)]",children:t}),s.jsx("span",{className:"text-sm text-[var(--otari-ink)] break-all",children:l})]})}function kt({entry:t}){var l;return s.jsxs("div",{className:"flex flex-col gap-4 px-4 py-4",children:[t.error_message?s.jsxs("div",{className:"flex flex-col gap-1.5",children:[s.jsx("span",{className:"text-[11px] font-medium uppercase tracking-wide text-[var(--otari-muted)]",children:"Error"}),s.jsx("pre",{className:"max-h-48 overflow-auto rounded-lg border border-red-200 bg-red-50 p-3 text-xs whitespace-pre-wrap break-all text-red-700",children:"The provider returned an error. Inspect gateway logs for details."})]}):null,s.jsxs("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-4",children:[s.jsx(u,{label:"Provider",children:t.provider??"—"}),s.jsx(u,{label:"Endpoint",children:t.endpoint}),s.jsx(u,{label:"Source",children:vt(t.source)}),t.source_label?s.jsx(u,{label:"Session",children:t.source_label}):null,s.jsx(u,{label:"User",children:t.user_id??"—"}),s.jsx(u,{label:"API key",children:t.api_key_id??"—"}),s.jsx(u,{label:"Prompt tokens",children:f(t.prompt_tokens)}),s.jsx(u,{label:"Completion tokens",children:f(t.completion_tokens)}),s.jsx(u,{label:"Total tokens",children:f(t.total_tokens)}),s.jsx(u,{label:"Cost",children:I(t.cost)}),s.jsx(u,{label:"Cache read tokens",children:f(t.cache_read_tokens)}),s.jsx(u,{label:"Cache write tokens",children:f(t.cache_write_tokens)}),s.jsx(u,{label:"1h cache writes",children:f(t.cache_write_1h_tokens??null)}),s.jsx(u,{label:"Total time",children:ve(t.latency_ms)}),s.jsx(u,{label:"Request ID",children:t.id})]}),(l=t.pricing_breakdown)!=null&&l.length?s.jsxs("div",{className:"flex flex-col gap-2",children:[s.jsx("span",{className:"text-[11px] font-medium uppercase tracking-wide text-[var(--otari-muted)]",children:"Billed meters"}),s.jsx("div",{className:"grid gap-2 sm:grid-cols-2 lg:grid-cols-3",children:t.pricing_breakdown.map(i=>s.jsxs(u,{label:i.meter.replaceAll("_"," "),children:[f(i.units)," at ",I(i.rate_per_million)," / 1M, ",I(i.cost)]},i.meter))})]}):null]})}function It(){var ie,ce,de,ue,me;const t=ze(),l=We(),i=n.useMemo(()=>{const e=new Map;for(const r of l.data??[])e.set(r.id,r.key_name??`${r.id.slice(0,8)}…`);return e},[l.data]),a=dt(bt),o=a.get("range"),S=a.get("start_date"),h=a.get("end_date"),m=a.get("status"),c=a.get("model"),p=a.get("user_id"),x=a.get("api_key_id"),_=a.get("priced"),H=Math.max(0,a.getNumber("page")),V=a.getNumber("size"),U=ct.reduce((e,r)=>Math.abs(r-V)y(o,S,h));n.useEffect(()=>{Z(y(o,S,h))},[o,S,h]);const[A,J]=n.useState(()=>y(o,"",""));n.useEffect(()=>{J(y(o,"",""))},[o]);const ke=!!(d.start||d.end),E=_==="true"?!0:_==="false"?!1:void 0,b=n.useMemo(()=>({start_date:d.start,end_date:d.end,status:m||void 0,model:c.trim()||void 0,user_id:p||void 0,api_key_id:x||void 0,priced:E}),[d,m,c,p,x,E]),g=st(),F=JSON.stringify(b),Q=n.useRef(F);n.useEffect(()=>{Q.current!==F&&(Q.current=F,a.patch({page:0}),g.clear())},[F,a,g]);const v=Ye(b,H,U),j=ge(b),Se=n.useMemo(()=>({start_date:d.start,end_date:d.end,status:m||void 0,user_id:p||void 0,api_key_id:x||void 0}),[d,m,p,x]),L=((ce=(ie=he(Se,"day").data)==null?void 0:ie.by_model)==null?void 0:ce.filter(e=>!e.is_other&&e.key!==null).map(e=>e.key))??[],X=(l.data??[]).map(e=>({value:e.id,label:e.key_name??`${e.id.slice(0,8)}…`})),w=O(N,o)??O(N,G),C=!!(d.start&&A.start&&new Date(d.start).getTime()({start_date:C?d.start:A.start,end_date:C?d.end:void 0,status:m||void 0,model:c.trim()||void 0,user_id:p||void 0,api_key_id:x||void 0,priced:E}),[C,d,A,m,c,p,x,E]),R=he(je,ee),we=(((de=R.data)==null?void 0:de.series)??[]).map(e=>({bucketStart:e.bucket_start,requests:e.requests})),k=v.data??[],Ce=j.isSuccess&&!j.isPlaceholderData?((ue=j.data)==null?void 0:ue.total)??0:null,Pe=!!(m||c.trim()||p||x||_||ke),M=(e,r)=>{var pe;return((pe=e.find($e=>$e.value===r))==null?void 0:pe.label)??r},te=(t.data??[]).map(e=>({value:e.user_id,label:e.alias?`${e.alias} (${e.user_id})`:e.user_id})),Ne=()=>a.patch({status:"",priced:"",model:"",user_id:"",api_key_id:""}),Ae=[...m?[{key:"status",label:"Status",value:M(be,m),onClear:()=>a.patch({status:""})}]:[],..._?[{key:"priced",label:"Priced",value:M(_e,_),onClear:()=>a.patch({priced:""})}]:[],...p?[{key:"user",label:"User",value:M(te,p),onClear:()=>a.patch({user_id:""})}]:[],...c.trim()?[{key:"model",label:"Model",value:c.trim(),onClear:()=>a.patch({model:""})}]:[],...x?[{key:"key",label:"API key",value:M(X,x),onClear:()=>a.patch({api_key_id:""})}]:[]],K=n.useMemo(()=>k.filter(e=>!e.counts_toward_budget).map(e=>e.id),[k]),Ee=n.useMemo(()=>k.filter(e=>e.counts_toward_budget).map(e=>e.id),[k]),se=at(g.selectedKeys,K),P=se.length,ae=g.allMatching||P>0,Fe=n.useMemo(()=>({...b,counts_toward_budget:!1}),[b]),re=ge(Fe,ae),T=re.isSuccess?((me=re.data)==null?void 0:me.total)??null:null,Me=K.length>0&&P===K.length&&T!=null&&T>P,D=g.allMatching?T??P:P,B=Ge(),$=He(),[Te,q]=n.useState(!1),[De,z]=n.useState(!1),[Ie,le]=n.useState(null),Oe=n.useCallback(e=>s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center justify-between border-b border-[var(--otari-line)] px-4 py-2",children:[s.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Request detail"}),s.jsx(Y,{size:"sm",variant:"ghost",onPress:()=>le(null),children:"Close"})]}),s.jsx(kt,{entry:e})]}),[]),ne=()=>g.allMatching?{by_filter:!0,model:b.model,user_id:b.user_id,api_key_id:b.api_key_id,status:b.status,start_date:b.start_date,end_date:b.end_date,priced:b.priced}:{ids:se},Ue=()=>{B.mutate(ne(),{onSuccess:()=>{q(!1),g.clear()}})},Le=e=>{$.mutate({...ne(),...e},{onSuccess:()=>{z(!1),g.clear()}})},Re=()=>{Z(y(o,S,h)),J(y(o,"","")),v.refetch(),j.refetch(),R.refetch()},oe=e=>a.patch({range:e.key,start_date:"",end_date:""}),Ke=(e,r)=>a.patch({start_date:e,end_date:r}),Be=n.useMemo(()=>{const e=r=>r===null?"—":i.get(r)??`${r.slice(0,8)}…`;return[{id:"time",header:"Time",cell:r=>s.jsx("span",{title:mt(r.timestamp),className:"text-[var(--otari-muted)]",children:pt(r.timestamp)})},{id:"user",header:"User",cell:r=>r.user_id??"—"},{id:"model",header:"Model",isRowHeader:!0,cell:r=>r.model},{id:"api_key",header:"API key",cell:r=>s.jsx("span",{className:"text-[var(--otari-muted)]",children:e(r.api_key_id)})},{id:"tokens",header:"Tokens",align:"end",cell:r=>f(r.total_tokens)},{id:"cost",header:"Cost",align:"end",cell:r=>I(r.cost)},{id:"latency",header:"Total time",align:"end",cell:r=>ve(r.latency_ms)},{id:"status",header:"Status",cell:r=>s.jsx(_t,{status:r.status})}]},[i]);return s.jsxs("div",{className:"flex flex-col gap-6",children:[s.jsx(Ve,{title:"Activity",description:"A per-request log of what the gateway served: tokens, cost, latency, and failures. No request or response content is stored."}),s.jsx(Ze,{error:v.error??j.error}),s.jsxs("div",{className:"flex flex-col gap-3",children:[s.jsx(Xe,{presets:N,extentKey:ye,onPreset:oe,onSelectRange:Ke,onSelectFull:()=>w?oe(w):void 0,series:we,bucket:ee,windowStart:d.start,windowEnd:d.end,loading:R.isLoading,ariaLabel:"Activity request volume over the selected window",action:s.jsx(Je,{onRefresh:Re,isFetching:v.isFetching,updatedAt:v.dataUpdatedAt})}),s.jsxs(et,{chips:Ae,onClearAll:Ne,children:[s.jsx(xe,{id:"filter-status",label:"Status",value:m,onChange:e=>a.patch({status:e}),children:be.map(e=>s.jsx("option",{value:e.value,children:e.label},e.value))}),s.jsx(xe,{id:"filter-priced",label:"Priced?",value:_,onChange:e=>a.patch({priced:e}),children:_e.map(e=>s.jsx("option",{value:e.value,children:e.label},e.value))}),s.jsx(W,{label:"API key",value:x,onChange:e=>a.patch({api_key_id:e}),placeholder:"All keys",options:X}),s.jsx(W,{label:"User",value:p,onChange:e=>a.patch({user_id:e}),placeholder:"All users",options:te}),s.jsx(W,{label:"Model",value:c,onChange:e=>a.patch({model:e}),allowsCustom:!0,placeholder:"Any model",options:(c&&!L.includes(c)?[c,...L]:L).map(e=>({value:e,label:e}))})]})]}),ae?s.jsxs(rt,{selectedCount:D,allMatching:g.allMatching,matchingTotal:T,canSelectAllMatching:Me,onSelectAllMatching:g.enableAllMatching,onClear:g.clear,children:[s.jsx(Y,{size:"sm",variant:"primary",onPress:()=>z(!0),children:"Set price"}),s.jsx(Y,{size:"sm",variant:"danger",onPress:()=>q(!0),children:"Delete"})]}):null,s.jsx(nt,{ariaLabel:"Activity log",columns:Be,rows:k,getRowKey:gt,isLoading:v.isLoading,emptyContent:Pe?"No requests match these filters.":"No requests recorded yet.",selectionMode:"multiple",selectedKeys:g.selectedKeys,onSelectionChange:g.onSelectionChange,disabledKeys:Ee,onRowAction:e=>le(r=>r===e?null:e),rowClassName:ht,detailKey:Ie,renderDetail:Oe}),s.jsx(ot,{page:H,pageSize:U,total:Ce,rowsOnPage:k.length,onPageChange:e=>a.patch({page:e}),onPageSizeChange:e=>a.patch({size:e,page:0}),isFetching:v.isFetching,hasNextFallback:k.length===U}),s.jsx(lt,{isOpen:Te,onOpenChange:q,heading:"Delete usage rows",body:`Delete ${D.toLocaleString()} imported ${D===1?"row":"rows"}? Only imported rows are removed, and this cannot be undone.`,confirmLabel:"Delete",isPending:B.isPending,error:B.error,onConfirm:Ue}),s.jsx(it,{isOpen:De,onOpenChange:z,targetCount:D,isPending:$.isPending,error:$.error,onSubmit:Le})]})}export{It as ActivityPage}; diff --git a/src/gateway/static/dashboard/assets/AliasesPage-Q7olOjhL.js b/src/gateway/static/dashboard/assets/AliasesPage-wZMHXIpE.js similarity index 98% rename from src/gateway/static/dashboard/assets/AliasesPage-Q7olOjhL.js rename to src/gateway/static/dashboard/assets/AliasesPage-wZMHXIpE.js index cd2904e8..c461060e 100644 --- a/src/gateway/static/dashboard/assets/AliasesPage-Q7olOjhL.js +++ b/src/gateway/static/dashboard/assets/AliasesPage-wZMHXIpE.js @@ -1 +1 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as d,u as L}from"./react-dgEcD0HR.js";import{h as T,i as E,j as M,C as I,P as K,E as S,k as A}from"./index-CGnfXTEF.js";import{u as R,r as F,B as $}from"./tableSelection-9hV37uhu.js";import{C as q}from"./ConfirmDialog-CWW3AYpK.js";import{D as O}from"./DataTable-Bmn_eYSV.js";import{F as V}from"./Field-Dwp6u3t8.js";import{C as N,L as z,I as H,a as G,b as W,f as X,B as h,d as k}from"./heroui-BI50yK5B.js";const _=50;function P({label:t,value:a,onChange:r,description:n,placeholder:u="provider:model",autoFocus:i,isRequired:m}){const c=T(),{visible:o,total:x,failed:p}=d.useMemo(()=>{var y;const l=a.trim().toLowerCase(),f=((y=c.data)==null?void 0:y.providers)??[],C=f.flatMap(g=>g.models),j=l?C.filter(g=>g.key.toLowerCase().includes(l)):C;return{visible:j.slice(0,_),total:j.length,failed:f.filter(g=>!g.ok)}},[c.data,a]),b=c.isLoading?"Loading models from your providers…":p.length>0?`Could not list models for ${p.map(f=>f.provider).join(", ")}. Check that provider's credentials, or type the model key directly.`:x>o.length?`Showing ${o.length} of ${x} matches. Keep typing to narrow them.`:n;return e.jsxs(N.Root,{allowsCustomValue:!0,allowsEmptyCollection:!0,menuTrigger:"input",inputValue:a,onInputChange:r,onSelectionChange:l=>{l!=null&&r(String(l))},isRequired:m,className:"flex max-w-md flex-col gap-1",children:[e.jsx(z,{className:"text-sm font-medium text-[var(--otari-ink)]",children:t}),e.jsxs(N.InputGroup,{children:[e.jsx(H,{placeholder:u,autoFocus:i}),e.jsx(N.Trigger,{})]}),e.jsx(N.Popover,{children:e.jsx(G,{items:o,className:"max-h-72 overflow-auto",children:l=>e.jsx(W,{id:l.key,textValue:l.key,children:l.key})})}),b?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:b}):null]})}const J=t=>t.name;function Q({alias:t,onClose:a}){const r=A(),[n,u]=d.useState(t.target),i=n.trim()!==""&&n.trim()!==t.target,m=()=>{i&&r.mutate({name:t.name,target:n.trim()},{onSuccess:a})};return e.jsx(k,{children:e.jsxs(k.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsxs("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:["Edit alias ",e.jsx("code",{children:t.name})]}),e.jsx(S,{error:r.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Alias name"}),e.jsx("code",{className:"text-sm text-[var(--otari-muted)]",children:t.name}),e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"The alias name is the key and cannot be changed here. Delete and recreate to rename."})]}),e.jsx(P,{label:"Target",value:n,onChange:u,isRequired:!0,description:"The real model this resolves to. Callers never see it."})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(h,{variant:"primary",isDisabled:!i||r.isPending,onPress:m,children:r.isPending?"Saving…":"Save changes"}),e.jsx(h,{variant:"ghost",onPress:a,children:"Cancel"})]})]})})}function U({onClose:t,initialTarget:a=""}){const r=A(),[n,u]=d.useState(""),[i,m]=d.useState(a),c=/[:/]/.test(n),o=n.trim()!==""&&i.trim()!==""&&!c,x=()=>{o&&r.mutate({name:n.trim(),target:i.trim()},{onSuccess:t})};return e.jsx(k,{children:e.jsxs(k.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsx("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"New alias"}),e.jsx(S,{error:r.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(V,{label:"Alias name",value:n,onChange:u,placeholder:"fast-model",isRequired:!0,autoFocus:!0,description:c?e.jsx("span",{className:"text-red-700",children:"An alias name cannot contain “:” or “/”."}):"What callers send as `model`."}),e.jsx(P,{label:"Target",value:i,onChange:m,isRequired:!0,description:"The real model this resolves to. Callers never see it."})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(h,{variant:"primary",isDisabled:!o||r.isPending,onPress:x,children:r.isPending?"Creating…":"Create alias"}),e.jsx(h,{variant:"ghost",onPress:t,children:"Cancel"})]})]})})}function le(){const t=E(),a=M(),[r]=L(),n=r.get("target")??"",[u,i]=d.useState(n!==""),[m,c]=d.useState(null),o=R(),[x,p]=d.useState(!1),[b,l]=d.useState(void 0),[f,C]=d.useState(!1),j=[...t.data??[]].sort((s,B)=>s.name.localeCompare(B.name)),y=j.filter(s=>s.source==="stored").map(s=>s.name),g=j.filter(s=>s.source!=="stored").map(s=>s.name),v=F(o.selectedKeys,y),w=async()=>{C(!0),l(void 0);try{for(const s of v)await a.mutateAsync(s);o.clear(),p(!1)}catch(s){l(s)}finally{C(!1)}},D=d.useMemo(()=>[{id:"alias",header:"Alias",isRowHeader:!0,cell:s=>e.jsx("span",{className:"font-medium break-all text-[var(--otari-ink)]",children:s.name})},{id:"target",header:"Target",cell:s=>e.jsx("span",{className:"break-all text-[var(--otari-muted)]",children:s.target})},{id:"source",header:"Source",cell:s=>e.jsx(X,{size:"sm",color:s.source==="stored"?"accent":"default",children:s.source})},{id:"actions",header:"Actions",align:"end",cell:s=>s.source==="stored"?e.jsxs("span",{className:"inline-flex items-center gap-2 whitespace-nowrap",children:[e.jsx(h,{size:"sm",variant:"ghost",onPress:()=>{i(!1),c(s)},children:"Edit"}),e.jsx(I,{confirmLabel:"Delete",isPending:a.isPending,onConfirm:()=>a.mutate(s.name),children:"Delete"})]}):e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"set in config.yml"})}],[a.isPending,a.mutate]);return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(K,{title:"Aliases",description:"Friendly names that map to a real provider:model. Callers send the alias as the model; pricing, budgets, and usage key on the target.",action:u||m?null:e.jsx(h,{variant:"primary",onPress:()=>{c(null),i(!0)},children:"New alias"})}),e.jsx(S,{error:t.error}),u?e.jsx(U,{initialTarget:n,onClose:()=>i(!1)}):null,m?e.jsx(Q,{alias:m,onClose:()=>c(null)}):null,a.error?e.jsx(S,{error:a.error}):null,v.length>0?e.jsx($,{selectedCount:v.length,allMatching:!1,matchingTotal:null,canSelectAllMatching:!1,onSelectAllMatching:()=>{},onClear:o.clear,children:e.jsx(h,{size:"sm",variant:"danger",onPress:()=>p(!0),children:"Delete"})}):null,e.jsx(O,{ariaLabel:"Aliases",columns:D,rows:j,getRowKey:J,isLoading:t.isLoading,emptyContent:"No aliases yet. Create one to give a model a friendly name.",selectionMode:"multiple",selectedKeys:o.selectedKeys,onSelectionChange:o.onSelectionChange,disabledKeys:g}),e.jsx(q,{isOpen:x,onOpenChange:p,heading:"Delete aliases",body:`Delete ${v.length} stored ${v.length===1?"alias":"aliases"}? Callers using ${v.length===1?"it":"them"} will get a model-not-found error.`,confirmLabel:"Delete",isPending:f,error:b,onConfirm:w})]})}export{le as AliasesPage}; +import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as d,u as L}from"./react-dgEcD0HR.js";import{h as T,i as E,j as M,C as I,P as K,E as S,k as A}from"./index-DHi1jXMu.js";import{u as R,r as F,B as $}from"./tableSelection-9hV37uhu.js";import{C as q}from"./ConfirmDialog-D_mZT4k-.js";import{D as O}from"./DataTable-Bmn_eYSV.js";import{F as V}from"./Field-Dwp6u3t8.js";import{C as N,L as z,I as H,a as G,b as W,f as X,B as h,d as k}from"./heroui-BI50yK5B.js";const _=50;function P({label:t,value:a,onChange:r,description:n,placeholder:u="provider:model",autoFocus:i,isRequired:m}){const c=T(),{visible:o,total:x,failed:p}=d.useMemo(()=>{var y;const l=a.trim().toLowerCase(),f=((y=c.data)==null?void 0:y.providers)??[],C=f.flatMap(g=>g.models),j=l?C.filter(g=>g.key.toLowerCase().includes(l)):C;return{visible:j.slice(0,_),total:j.length,failed:f.filter(g=>!g.ok)}},[c.data,a]),b=c.isLoading?"Loading models from your providers…":p.length>0?`Could not list models for ${p.map(f=>f.provider).join(", ")}. Check that provider's credentials, or type the model key directly.`:x>o.length?`Showing ${o.length} of ${x} matches. Keep typing to narrow them.`:n;return e.jsxs(N.Root,{allowsCustomValue:!0,allowsEmptyCollection:!0,menuTrigger:"input",inputValue:a,onInputChange:r,onSelectionChange:l=>{l!=null&&r(String(l))},isRequired:m,className:"flex max-w-md flex-col gap-1",children:[e.jsx(z,{className:"text-sm font-medium text-[var(--otari-ink)]",children:t}),e.jsxs(N.InputGroup,{children:[e.jsx(H,{placeholder:u,autoFocus:i}),e.jsx(N.Trigger,{})]}),e.jsx(N.Popover,{children:e.jsx(G,{items:o,className:"max-h-72 overflow-auto",children:l=>e.jsx(W,{id:l.key,textValue:l.key,children:l.key})})}),b?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:b}):null]})}const J=t=>t.name;function Q({alias:t,onClose:a}){const r=A(),[n,u]=d.useState(t.target),i=n.trim()!==""&&n.trim()!==t.target,m=()=>{i&&r.mutate({name:t.name,target:n.trim()},{onSuccess:a})};return e.jsx(k,{children:e.jsxs(k.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsxs("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:["Edit alias ",e.jsx("code",{children:t.name})]}),e.jsx(S,{error:r.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Alias name"}),e.jsx("code",{className:"text-sm text-[var(--otari-muted)]",children:t.name}),e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"The alias name is the key and cannot be changed here. Delete and recreate to rename."})]}),e.jsx(P,{label:"Target",value:n,onChange:u,isRequired:!0,description:"The real model this resolves to. Callers never see it."})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(h,{variant:"primary",isDisabled:!i||r.isPending,onPress:m,children:r.isPending?"Saving…":"Save changes"}),e.jsx(h,{variant:"ghost",onPress:a,children:"Cancel"})]})]})})}function U({onClose:t,initialTarget:a=""}){const r=A(),[n,u]=d.useState(""),[i,m]=d.useState(a),c=/[:/]/.test(n),o=n.trim()!==""&&i.trim()!==""&&!c,x=()=>{o&&r.mutate({name:n.trim(),target:i.trim()},{onSuccess:t})};return e.jsx(k,{children:e.jsxs(k.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsx("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"New alias"}),e.jsx(S,{error:r.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(V,{label:"Alias name",value:n,onChange:u,placeholder:"fast-model",isRequired:!0,autoFocus:!0,description:c?e.jsx("span",{className:"text-red-700",children:"An alias name cannot contain “:” or “/”."}):"What callers send as `model`."}),e.jsx(P,{label:"Target",value:i,onChange:m,isRequired:!0,description:"The real model this resolves to. Callers never see it."})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(h,{variant:"primary",isDisabled:!o||r.isPending,onPress:x,children:r.isPending?"Creating…":"Create alias"}),e.jsx(h,{variant:"ghost",onPress:t,children:"Cancel"})]})]})})}function le(){const t=E(),a=M(),[r]=L(),n=r.get("target")??"",[u,i]=d.useState(n!==""),[m,c]=d.useState(null),o=R(),[x,p]=d.useState(!1),[b,l]=d.useState(void 0),[f,C]=d.useState(!1),j=[...t.data??[]].sort((s,B)=>s.name.localeCompare(B.name)),y=j.filter(s=>s.source==="stored").map(s=>s.name),g=j.filter(s=>s.source!=="stored").map(s=>s.name),v=F(o.selectedKeys,y),w=async()=>{C(!0),l(void 0);try{for(const s of v)await a.mutateAsync(s);o.clear(),p(!1)}catch(s){l(s)}finally{C(!1)}},D=d.useMemo(()=>[{id:"alias",header:"Alias",isRowHeader:!0,cell:s=>e.jsx("span",{className:"font-medium break-all text-[var(--otari-ink)]",children:s.name})},{id:"target",header:"Target",cell:s=>e.jsx("span",{className:"break-all text-[var(--otari-muted)]",children:s.target})},{id:"source",header:"Source",cell:s=>e.jsx(X,{size:"sm",color:s.source==="stored"?"accent":"default",children:s.source})},{id:"actions",header:"Actions",align:"end",cell:s=>s.source==="stored"?e.jsxs("span",{className:"inline-flex items-center gap-2 whitespace-nowrap",children:[e.jsx(h,{size:"sm",variant:"ghost",onPress:()=>{i(!1),c(s)},children:"Edit"}),e.jsx(I,{confirmLabel:"Delete",isPending:a.isPending,onConfirm:()=>a.mutate(s.name),children:"Delete"})]}):e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"set in config.yml"})}],[a.isPending,a.mutate]);return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(K,{title:"Aliases",description:"Friendly names that map to a real provider:model. Callers send the alias as the model; pricing, budgets, and usage key on the target.",action:u||m?null:e.jsx(h,{variant:"primary",onPress:()=>{c(null),i(!0)},children:"New alias"})}),e.jsx(S,{error:t.error}),u?e.jsx(U,{initialTarget:n,onClose:()=>i(!1)}):null,m?e.jsx(Q,{alias:m,onClose:()=>c(null)}):null,a.error?e.jsx(S,{error:a.error}):null,v.length>0?e.jsx($,{selectedCount:v.length,allMatching:!1,matchingTotal:null,canSelectAllMatching:!1,onSelectAllMatching:()=>{},onClear:o.clear,children:e.jsx(h,{size:"sm",variant:"danger",onPress:()=>p(!0),children:"Delete"})}):null,e.jsx(O,{ariaLabel:"Aliases",columns:D,rows:j,getRowKey:J,isLoading:t.isLoading,emptyContent:"No aliases yet. Create one to give a model a friendly name.",selectionMode:"multiple",selectedKeys:o.selectedKeys,onSelectionChange:o.onSelectionChange,disabledKeys:g}),e.jsx(q,{isOpen:x,onOpenChange:p,heading:"Delete aliases",body:`Delete ${v.length} stored ${v.length===1?"alias":"aliases"}? Callers using ${v.length===1?"it":"them"} will get a model-not-found error.`,confirmLabel:"Delete",isPending:f,error:b,onConfirm:w})]})}export{le as AliasesPage}; diff --git a/src/gateway/static/dashboard/assets/BudgetsPage-lTuTS-F9.js b/src/gateway/static/dashboard/assets/BudgetsPage-p9qxuU3G.js similarity index 98% rename from src/gateway/static/dashboard/assets/BudgetsPage-lTuTS-F9.js rename to src/gateway/static/dashboard/assets/BudgetsPage-p9qxuU3G.js index b0eb8e0d..50e1ddaf 100644 --- a/src/gateway/static/dashboard/assets/BudgetsPage-lTuTS-F9.js +++ b/src/gateway/static/dashboard/assets/BudgetsPage-p9qxuU3G.js @@ -1 +1 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as i}from"./react-dgEcD0HR.js";import{l as re,u as ae,m as le,n as ie,o as oe,p as de,P as ue,E as O,I as ce,q as me}from"./index-CGnfXTEF.js";import{u as xe,r as ge,B as he}from"./tableSelection-9hV37uhu.js";import{C as pe}from"./ConfirmDialog-CWW3AYpK.js";import{D as fe}from"./DataTable-Bmn_eYSV.js";import{F as $}from"./Field-Dwp6u3t8.js";import{C as E,I as be,a as je,b as ve,B as c,d as C,S as ye}from"./heroui-BI50yK5B.js";const Ne=50;function Se({value:t,onChange:a,users:r,label:o,description:l}){const[g,h]=i.useState(""),d=i.useMemo(()=>r.filter(s=>!s.user_id.startsWith("apikey-")).map(s=>({id:s.user_id,label:s.alias?`${s.user_id} (${s.alias})`:s.user_id})),[r]),p=i.useMemo(()=>{const s=g.trim().toLowerCase();return d.filter(u=>!t.includes(u.id)).filter(u=>!s||u.id.toLowerCase().includes(s)||u.label.toLowerCase().includes(s)).slice(0,Ne)},[d,t,g]),m=s=>{t.includes(s)||a([...t,s]),h("")},x=s=>a(t.filter(u=>u!==s));return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{children:[e.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:o}),l?e.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:l}):null]}),t.length>0?e.jsx("div",{className:"flex flex-wrap gap-1.5",children:t.map(s=>e.jsxs("span",{className:"inline-flex items-center gap-1 rounded-full bg-[var(--otari-brand-tint)] px-2.5 py-1 font-mono text-xs text-[var(--otari-brand-dark)]",children:[s,e.jsx("button",{type:"button","aria-label":`Remove ${s}`,onClick:()=>x(s),className:"text-[var(--otari-brand-dark)] hover:text-red-700",children:"×"})]},s))}):null,d.length===0?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"No users yet. Create users first, then assign them here or from the Users page."}):e.jsxs(E.Root,{allowsEmptyCollection:!0,menuTrigger:"input",inputValue:g,onInputChange:h,selectedKey:null,onSelectionChange:s=>{s!=null&&m(String(s))},className:"flex flex-col gap-1",children:[e.jsxs(E.InputGroup,{children:[e.jsx(be,{"aria-label":"Add a user",placeholder:"Search users…",autoComplete:"off"}),e.jsx(E.Trigger,{})]}),e.jsx(E.Popover,{children:e.jsx(je,{items:p,className:"max-h-72 overflow-auto",children:s=>e.jsx(ve,{id:s.id,textValue:s.label,children:s.label})})})]})]})}const _e=new Intl.NumberFormat(void 0,{style:"currency",currency:"USD",maximumFractionDigits:2});function P(t){return _e.format(t)}const j=86400,q=3600,z=[{label:"No reset",seconds:null},{label:"Daily",seconds:j},{label:"Weekly",seconds:7*j},{label:"Monthly",seconds:30*j}];function Ce(t){if(t===null)return"No reset";const a=z.find(r=>r.seconds===t);return a?a.label:t%j===0?`Every ${t/j} days`:t%q===0?`Every ${t/q} hours`:`Every ${t}s`}function W(t){if(!t)return"—";const a=new Date(t);return Number.isNaN(a.getTime())?"—":a.toLocaleString()}function we(t){const a=t.trim();if(a==="")return{value:null,valid:!0};const r=Number(a);return!Number.isFinite(r)||r<0?{value:null,valid:!1}:{value:r,valid:!0}}function Y(t){return t!==null&&t%j===0?String(t/j):""}function De({value:t,onChange:a,onInvalidChange:r}){const o=z.some(s=>s.seconds===t),[l,g]=i.useState(!o),[h,d]=i.useState(()=>Y(t)),p=h.trim(),m=Number(p),x=p!==""&&(!Number.isSafeInteger(m)||m<=0);return i.useEffect(()=>{r==null||r(x)},[x,r]),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Reset period"}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[z.map(s=>e.jsx(c,{size:"sm",variant:!l&&t===s.seconds?"primary":"outline",onPress:()=>{g(!1),d(Y(s.seconds)),a(s.seconds)},children:s.label},s.label)),e.jsx(c,{size:"sm",variant:l?"primary":"outline",onPress:()=>g(!0),children:"Custom"})]}),l?e.jsx("div",{className:"flex items-end gap-2",children:e.jsx($,{label:"Every N days",value:h,onChange:s=>{d(s);const u=Number(s.trim());a(s.trim()===""||!Number.isSafeInteger(u)||u<=0?null:u*j)},placeholder:"14",description:x?e.jsx("span",{className:"text-red-700",children:"Enter a whole number of days."}):"Whole days between resets."})}):null,e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Spend returns to zero each period. A user’s clock starts when the budget is assigned to them."})]})}function G({title:t,submitLabel:a,initial:r,error:o,isPending:l,onSubmit:g,onClose:h,assignUsers:d}){const[p,m]=i.useState(r.name??""),[x,s]=i.useState(r.max_budget===null?"":String(r.max_budget)),[u,b]=i.useState(r.budget_duration_sec),[S,v]=i.useState(!1),[B,k]=i.useState([]),f=we(x),A=!l&&f.valid&&!S,w=()=>{A&&g({name:p.trim()||null,max_budget:f.value,budget_duration_sec:u},B)};return e.jsx(C,{children:e.jsxs(C.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsx("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:t}),e.jsx(O,{error:o}),e.jsx($,{label:"Name (optional)",value:p,onChange:m,autoFocus:!0,placeholder:"team-free-tier",description:"A label to recognize this budget later."}),e.jsx($,{label:"Spending limit (USD)",value:x,onChange:s,placeholder:"100.00",description:f.valid?"The most a single user on this budget may spend per period. Leave blank for no limit.":e.jsx("span",{className:"text-red-700",children:"Enter a non-negative number, or leave blank for no limit."})}),e.jsx(De,{value:u,onChange:b,onInvalidChange:v}),d?e.jsx(Se,{label:"Assign to users (optional)",description:"Attach this budget to existing users now. You can also manage assignments later on the Users page.",value:B,onChange:k,users:d}):null,e.jsxs("div",{className:"flex gap-2",children:[e.jsx(c,{variant:"primary",isDisabled:!A,onPress:w,children:l?"Saving…":a}),e.jsx(c,{variant:"ghost",isDisabled:l,onPress:h,children:"Cancel"})]})]})})}function Pe({budget:t}){if(t.user_count===0)return e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"No users assigned"});const a=t.total_spend;if(t.max_budget===null)return e.jsxs("span",{className:"text-xs text-[var(--otari-ink)]",children:[P(a)," spent",e.jsx("span",{className:"text-[var(--otari-muted)]",children:" · no limit"})]});const r=t.max_budget*t.user_count,o=r>0?Math.min(100,a/r*100):0,l=a>r;return e.jsxs("div",{className:"flex min-w-[140px] flex-col gap-1",children:[e.jsxs("div",{className:"flex items-baseline justify-between gap-2 text-xs",children:[e.jsx("span",{className:"text-[var(--otari-ink)]",children:P(a)}),e.jsxs("span",{className:"text-[var(--otari-muted)]",children:["of ",P(r)]})]}),e.jsx("div",{className:"h-1.5 w-full overflow-hidden rounded-full bg-[var(--otari-line)]",role:"progressbar","aria-valuenow":Math.round(o),"aria-valuemin":0,"aria-valuemax":100,"aria-label":"Aggregate spend against total allocation",children:e.jsx("div",{className:`h-full rounded-full ${l?"bg-red-500":"bg-[var(--otari-brand)]"}`,style:{width:`${Math.max(o,l?100:2)}%`}})})]})}function Be({budgetId:t}){const a=me(t);if(a.isLoading)return e.jsxs("div",{className:"flex items-center gap-2 px-4 py-4 text-sm text-[var(--otari-muted)]",children:[e.jsx(ye,{size:"sm"})," Loading reset history…"]});if(a.error)return e.jsx("div",{className:"px-4 py-4",children:e.jsx(O,{error:a.error})});const r=a.data??[];return r.length===0?e.jsx("div",{className:"px-4 py-4 text-sm text-[var(--otari-muted)]",children:"No resets recorded yet for this budget."}):e.jsx("div",{className:"overflow-x-auto px-4 py-3",children:e.jsxs("table",{className:"w-full border-collapse text-xs",children:[e.jsx("thead",{className:"text-left text-[var(--otari-muted)]",children:e.jsxs("tr",{children:[e.jsx("th",{className:"py-1.5 pr-4 font-medium",children:"User"}),e.jsx("th",{className:"py-1.5 pr-4 font-medium",children:"Spend cleared"}),e.jsx("th",{className:"py-1.5 pr-4 font-medium",children:"Reset at"}),e.jsx("th",{className:"py-1.5 font-medium",children:"Next reset"})]})}),e.jsx("tbody",{children:r.map(o=>e.jsxs("tr",{className:"border-t border-[var(--otari-line)]",children:[e.jsx("td",{className:"py-1.5 pr-4",children:e.jsx("code",{children:o.user_id??"—"})}),e.jsx("td",{className:"py-1.5 pr-4 text-[var(--otari-ink)]",children:P(o.previous_spend)}),e.jsx("td",{className:"py-1.5 pr-4 text-[var(--otari-muted)]",children:W(o.reset_at)}),e.jsx("td",{className:"py-1.5 text-[var(--otari-muted)]",children:W(o.next_reset_at)})]},o.id))})]})})}function ke({onCreate:t}){return e.jsx(C,{children:e.jsxs(C.Content,{className:"flex flex-col gap-4 p-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:"No budgets yet"}),e.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:"A budget caps how much a user may spend and, optionally, resets that spend on a schedule. Create one, then assign it to users to enforce a limit."})]}),e.jsx("div",{children:e.jsx(c,{variant:"primary",onPress:t,children:"Create your first budget"})})]})})}function Ae({label:t,isPending:a,onConfirm:r}){const[o,l]=i.useState(!1);return o?e.jsxs("div",{className:"flex flex-col items-end gap-1.5 rounded-lg border border-amber-200 bg-amber-50 p-2 text-right",children:[e.jsxs("span",{className:"max-w-xs text-xs text-amber-800",children:["Delete ",e.jsx("strong",{children:t}),"? Users keep their spend but lose this limit. Cannot be undone."]}),e.jsxs("span",{className:"inline-flex gap-1",children:[e.jsx(c,{size:"sm",variant:"danger",isDisabled:a,onPress:r,children:"Delete permanently"}),e.jsx(c,{size:"sm",variant:"ghost",isDisabled:a,onPress:()=>l(!1),children:"Cancel"})]})]}):e.jsx(c,{size:"sm",variant:"danger-soft",onPress:()=>l(!0),children:"Delete"})}const Ee=t=>t.budget_id;function Q(t){return t.split("-")[0]}function M(t){return t.name??Q(t.budget_id)}function Te(){const t=re(),a=ae(),r=le(),o=ie(),l=oe(),g=de(),[h,d]=i.useState(!1),[p,m]=i.useState(null),[x,s]=i.useState(null),[u,b]=i.useState(null),[S,v]=i.useState(null),[B,k]=i.useState(!1),f=xe(),[A,w]=i.useState(!1),[X,T]=i.useState(void 0),[J,F]=i.useState(!1),D=t.data??[],H=t.isLoading,y=D.find(n=>n.budget_id===p)??null,U=D.find(n=>n.budget_id===x)??null,K=!H&&D.length===0&&!h,Z=D.map(n=>n.budget_id),_=ge(f.selectedKeys,Z),ee=async()=>{F(!0),T(void 0);try{for(const n of _)await l.mutateAsync(n);f.clear(),w(!1)}catch(n){T(n)}finally{F(!1)}},te=i.useMemo(()=>[{id:"budget",header:"Budget",isRowHeader:!0,cell:n=>e.jsxs("div",{className:"flex flex-col gap-0.5",children:[e.jsx("span",{className:"font-medium text-[var(--otari-ink)]",children:n.name??e.jsx("span",{className:"text-[var(--otari-muted)]",children:"(unnamed)"})}),e.jsx("code",{className:"text-[11px] text-[var(--otari-muted)]",title:n.budget_id,children:Q(n.budget_id)})]})},{id:"limit",header:"Limit (per user)",cell:n=>n.max_budget===null?e.jsx("span",{className:"text-[var(--otari-muted)]",children:"Unlimited"}):P(n.max_budget)},{id:"reset",header:"Reset",cell:n=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:Ce(n.budget_duration_sec)})},{id:"users",header:"Users",cell:n=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:n.user_count})},{id:"usage",header:"Usage",cell:n=>e.jsx(Pe,{budget:n})},{id:"actions",header:"Actions",align:"end",cell:n=>e.jsxs("div",{className:"flex items-center justify-end gap-1.5",children:[e.jsx(c,{size:"sm",variant:"ghost",onPress:()=>s(N=>N===n.budget_id?null:n.budget_id),children:x===n.budget_id?"Hide history":"History"}),e.jsx(c,{size:"sm",variant:"ghost",onPress:()=>{d(!1),m(n.budget_id)},children:"Edit"}),e.jsx(Ae,{label:M(n),isPending:l.isPending,onConfirm:()=>l.mutate(n.budget_id)})]})}],[x,l.isPending,l.mutate]),V=async(n,N)=>{k(!0),b(null);const L=await Promise.allSettled(N.map(R=>g.mutateAsync({id:R,body:{budget_id:n}})));k(!1);const I=L.flatMap((R,ne)=>R.status==="rejected"?[N[ne]]:[]);if(I.length>0){v({budgetId:n,userIds:I}),b(new Error(`Budget created, but could not assign it to: ${I.join(", ")}. Retry to try again.`));return}v(null),d(!1)},se=(n,N)=>{if(S){V(S.budgetId,S.userIds);return}b(null),r.mutate(n,{onSuccess:async L=>{if(N.length>0){await V(L.budget_id,N);return}d(!1)}})};return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(ue,{title:"Budgets",description:"Define spending limits and reset schedules. Assign a budget to users to enforce it.",action:h||K?null:e.jsx(c,{variant:"primary",onPress:()=>{m(null),b(null),v(null),d(!0)},children:"Create budget"})}),e.jsx(O,{error:t.error??r.error??o.error??l.error??g.error}),e.jsx(ce,{children:"Assign a budget to users when you create it, or later from the Users page. Each row’s usage aggregates the spend of the users currently on that budget."}),K?e.jsx(ke,{onCreate:()=>{m(null),b(null),v(null),d(!0)}}):null,h?e.jsx(G,{title:"Create budget",submitLabel:S?"Retry assignments":"Create budget",initial:{name:null,max_budget:null,budget_duration_sec:null},error:r.error??u,isPending:r.isPending||B,assignUsers:a.data??[],onSubmit:se,onClose:()=>{b(null),v(null),d(!1)}}):null,y?e.jsx(G,{title:`Edit budget ${M(y)}`,submitLabel:"Save changes",initial:{name:y.name,max_budget:y.max_budget,budget_duration_sec:y.budget_duration_sec},error:o.error,isPending:o.isPending,onSubmit:n=>o.mutate({id:y.budget_id,body:n},{onSuccess:()=>m(null)}),onClose:()=>m(null)},y.budget_id):null,_.length>0?e.jsx(he,{selectedCount:_.length,allMatching:!1,matchingTotal:null,canSelectAllMatching:!1,onSelectAllMatching:()=>{},onClear:f.clear,children:e.jsx(c,{size:"sm",variant:"danger",onPress:()=>w(!0),children:"Delete"})}):null,e.jsx(fe,{ariaLabel:"Budgets",columns:te,rows:D,getRowKey:Ee,isLoading:H,emptyContent:"No budgets yet. Create one to cap spending.",selectionMode:"multiple",selectedKeys:f.selectedKeys,onSelectionChange:f.onSelectionChange}),U?e.jsx(C,{children:e.jsxs(C.Content,{className:"p-0",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-[var(--otari-line)] px-4 py-2",children:[e.jsxs("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:["Reset history — ",M(U)]}),e.jsx(c,{size:"sm",variant:"ghost",onPress:()=>s(null),children:"Close"})]}),e.jsx(Be,{budgetId:U.budget_id})]})}):null,e.jsx(pe,{isOpen:A,onOpenChange:w,heading:"Delete budgets",body:`Delete ${_.length} ${_.length===1?"budget":"budgets"}? Users on ${_.length===1?"it":"them"} will no longer be capped.`,confirmLabel:"Delete",isPending:J,error:X,onConfirm:ee})]})}export{Te as BudgetsPage}; +import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as i}from"./react-dgEcD0HR.js";import{l as re,u as ae,m as le,n as ie,o as oe,p as de,P as ue,E as O,I as ce,q as me}from"./index-DHi1jXMu.js";import{u as xe,r as ge,B as he}from"./tableSelection-9hV37uhu.js";import{C as pe}from"./ConfirmDialog-D_mZT4k-.js";import{D as fe}from"./DataTable-Bmn_eYSV.js";import{F as $}from"./Field-Dwp6u3t8.js";import{C as E,I as be,a as je,b as ve,B as c,d as C,S as ye}from"./heroui-BI50yK5B.js";const Ne=50;function Se({value:t,onChange:a,users:r,label:o,description:l}){const[g,h]=i.useState(""),d=i.useMemo(()=>r.filter(s=>!s.user_id.startsWith("apikey-")).map(s=>({id:s.user_id,label:s.alias?`${s.user_id} (${s.alias})`:s.user_id})),[r]),p=i.useMemo(()=>{const s=g.trim().toLowerCase();return d.filter(u=>!t.includes(u.id)).filter(u=>!s||u.id.toLowerCase().includes(s)||u.label.toLowerCase().includes(s)).slice(0,Ne)},[d,t,g]),m=s=>{t.includes(s)||a([...t,s]),h("")},x=s=>a(t.filter(u=>u!==s));return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{children:[e.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:o}),l?e.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:l}):null]}),t.length>0?e.jsx("div",{className:"flex flex-wrap gap-1.5",children:t.map(s=>e.jsxs("span",{className:"inline-flex items-center gap-1 rounded-full bg-[var(--otari-brand-tint)] px-2.5 py-1 font-mono text-xs text-[var(--otari-brand-dark)]",children:[s,e.jsx("button",{type:"button","aria-label":`Remove ${s}`,onClick:()=>x(s),className:"text-[var(--otari-brand-dark)] hover:text-red-700",children:"×"})]},s))}):null,d.length===0?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"No users yet. Create users first, then assign them here or from the Users page."}):e.jsxs(E.Root,{allowsEmptyCollection:!0,menuTrigger:"input",inputValue:g,onInputChange:h,selectedKey:null,onSelectionChange:s=>{s!=null&&m(String(s))},className:"flex flex-col gap-1",children:[e.jsxs(E.InputGroup,{children:[e.jsx(be,{"aria-label":"Add a user",placeholder:"Search users…",autoComplete:"off"}),e.jsx(E.Trigger,{})]}),e.jsx(E.Popover,{children:e.jsx(je,{items:p,className:"max-h-72 overflow-auto",children:s=>e.jsx(ve,{id:s.id,textValue:s.label,children:s.label})})})]})]})}const _e=new Intl.NumberFormat(void 0,{style:"currency",currency:"USD",maximumFractionDigits:2});function P(t){return _e.format(t)}const j=86400,q=3600,z=[{label:"No reset",seconds:null},{label:"Daily",seconds:j},{label:"Weekly",seconds:7*j},{label:"Monthly",seconds:30*j}];function Ce(t){if(t===null)return"No reset";const a=z.find(r=>r.seconds===t);return a?a.label:t%j===0?`Every ${t/j} days`:t%q===0?`Every ${t/q} hours`:`Every ${t}s`}function W(t){if(!t)return"—";const a=new Date(t);return Number.isNaN(a.getTime())?"—":a.toLocaleString()}function we(t){const a=t.trim();if(a==="")return{value:null,valid:!0};const r=Number(a);return!Number.isFinite(r)||r<0?{value:null,valid:!1}:{value:r,valid:!0}}function Y(t){return t!==null&&t%j===0?String(t/j):""}function De({value:t,onChange:a,onInvalidChange:r}){const o=z.some(s=>s.seconds===t),[l,g]=i.useState(!o),[h,d]=i.useState(()=>Y(t)),p=h.trim(),m=Number(p),x=p!==""&&(!Number.isSafeInteger(m)||m<=0);return i.useEffect(()=>{r==null||r(x)},[x,r]),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Reset period"}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[z.map(s=>e.jsx(c,{size:"sm",variant:!l&&t===s.seconds?"primary":"outline",onPress:()=>{g(!1),d(Y(s.seconds)),a(s.seconds)},children:s.label},s.label)),e.jsx(c,{size:"sm",variant:l?"primary":"outline",onPress:()=>g(!0),children:"Custom"})]}),l?e.jsx("div",{className:"flex items-end gap-2",children:e.jsx($,{label:"Every N days",value:h,onChange:s=>{d(s);const u=Number(s.trim());a(s.trim()===""||!Number.isSafeInteger(u)||u<=0?null:u*j)},placeholder:"14",description:x?e.jsx("span",{className:"text-red-700",children:"Enter a whole number of days."}):"Whole days between resets."})}):null,e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Spend returns to zero each period. A user’s clock starts when the budget is assigned to them."})]})}function G({title:t,submitLabel:a,initial:r,error:o,isPending:l,onSubmit:g,onClose:h,assignUsers:d}){const[p,m]=i.useState(r.name??""),[x,s]=i.useState(r.max_budget===null?"":String(r.max_budget)),[u,b]=i.useState(r.budget_duration_sec),[S,v]=i.useState(!1),[B,k]=i.useState([]),f=we(x),A=!l&&f.valid&&!S,w=()=>{A&&g({name:p.trim()||null,max_budget:f.value,budget_duration_sec:u},B)};return e.jsx(C,{children:e.jsxs(C.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsx("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:t}),e.jsx(O,{error:o}),e.jsx($,{label:"Name (optional)",value:p,onChange:m,autoFocus:!0,placeholder:"team-free-tier",description:"A label to recognize this budget later."}),e.jsx($,{label:"Spending limit (USD)",value:x,onChange:s,placeholder:"100.00",description:f.valid?"The most a single user on this budget may spend per period. Leave blank for no limit.":e.jsx("span",{className:"text-red-700",children:"Enter a non-negative number, or leave blank for no limit."})}),e.jsx(De,{value:u,onChange:b,onInvalidChange:v}),d?e.jsx(Se,{label:"Assign to users (optional)",description:"Attach this budget to existing users now. You can also manage assignments later on the Users page.",value:B,onChange:k,users:d}):null,e.jsxs("div",{className:"flex gap-2",children:[e.jsx(c,{variant:"primary",isDisabled:!A,onPress:w,children:l?"Saving…":a}),e.jsx(c,{variant:"ghost",isDisabled:l,onPress:h,children:"Cancel"})]})]})})}function Pe({budget:t}){if(t.user_count===0)return e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"No users assigned"});const a=t.total_spend;if(t.max_budget===null)return e.jsxs("span",{className:"text-xs text-[var(--otari-ink)]",children:[P(a)," spent",e.jsx("span",{className:"text-[var(--otari-muted)]",children:" · no limit"})]});const r=t.max_budget*t.user_count,o=r>0?Math.min(100,a/r*100):0,l=a>r;return e.jsxs("div",{className:"flex min-w-[140px] flex-col gap-1",children:[e.jsxs("div",{className:"flex items-baseline justify-between gap-2 text-xs",children:[e.jsx("span",{className:"text-[var(--otari-ink)]",children:P(a)}),e.jsxs("span",{className:"text-[var(--otari-muted)]",children:["of ",P(r)]})]}),e.jsx("div",{className:"h-1.5 w-full overflow-hidden rounded-full bg-[var(--otari-line)]",role:"progressbar","aria-valuenow":Math.round(o),"aria-valuemin":0,"aria-valuemax":100,"aria-label":"Aggregate spend against total allocation",children:e.jsx("div",{className:`h-full rounded-full ${l?"bg-red-500":"bg-[var(--otari-brand)]"}`,style:{width:`${Math.max(o,l?100:2)}%`}})})]})}function Be({budgetId:t}){const a=me(t);if(a.isLoading)return e.jsxs("div",{className:"flex items-center gap-2 px-4 py-4 text-sm text-[var(--otari-muted)]",children:[e.jsx(ye,{size:"sm"})," Loading reset history…"]});if(a.error)return e.jsx("div",{className:"px-4 py-4",children:e.jsx(O,{error:a.error})});const r=a.data??[];return r.length===0?e.jsx("div",{className:"px-4 py-4 text-sm text-[var(--otari-muted)]",children:"No resets recorded yet for this budget."}):e.jsx("div",{className:"overflow-x-auto px-4 py-3",children:e.jsxs("table",{className:"w-full border-collapse text-xs",children:[e.jsx("thead",{className:"text-left text-[var(--otari-muted)]",children:e.jsxs("tr",{children:[e.jsx("th",{className:"py-1.5 pr-4 font-medium",children:"User"}),e.jsx("th",{className:"py-1.5 pr-4 font-medium",children:"Spend cleared"}),e.jsx("th",{className:"py-1.5 pr-4 font-medium",children:"Reset at"}),e.jsx("th",{className:"py-1.5 font-medium",children:"Next reset"})]})}),e.jsx("tbody",{children:r.map(o=>e.jsxs("tr",{className:"border-t border-[var(--otari-line)]",children:[e.jsx("td",{className:"py-1.5 pr-4",children:e.jsx("code",{children:o.user_id??"—"})}),e.jsx("td",{className:"py-1.5 pr-4 text-[var(--otari-ink)]",children:P(o.previous_spend)}),e.jsx("td",{className:"py-1.5 pr-4 text-[var(--otari-muted)]",children:W(o.reset_at)}),e.jsx("td",{className:"py-1.5 text-[var(--otari-muted)]",children:W(o.next_reset_at)})]},o.id))})]})})}function ke({onCreate:t}){return e.jsx(C,{children:e.jsxs(C.Content,{className:"flex flex-col gap-4 p-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:"No budgets yet"}),e.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:"A budget caps how much a user may spend and, optionally, resets that spend on a schedule. Create one, then assign it to users to enforce a limit."})]}),e.jsx("div",{children:e.jsx(c,{variant:"primary",onPress:t,children:"Create your first budget"})})]})})}function Ae({label:t,isPending:a,onConfirm:r}){const[o,l]=i.useState(!1);return o?e.jsxs("div",{className:"flex flex-col items-end gap-1.5 rounded-lg border border-amber-200 bg-amber-50 p-2 text-right",children:[e.jsxs("span",{className:"max-w-xs text-xs text-amber-800",children:["Delete ",e.jsx("strong",{children:t}),"? Users keep their spend but lose this limit. Cannot be undone."]}),e.jsxs("span",{className:"inline-flex gap-1",children:[e.jsx(c,{size:"sm",variant:"danger",isDisabled:a,onPress:r,children:"Delete permanently"}),e.jsx(c,{size:"sm",variant:"ghost",isDisabled:a,onPress:()=>l(!1),children:"Cancel"})]})]}):e.jsx(c,{size:"sm",variant:"danger-soft",onPress:()=>l(!0),children:"Delete"})}const Ee=t=>t.budget_id;function Q(t){return t.split("-")[0]}function M(t){return t.name??Q(t.budget_id)}function Te(){const t=re(),a=ae(),r=le(),o=ie(),l=oe(),g=de(),[h,d]=i.useState(!1),[p,m]=i.useState(null),[x,s]=i.useState(null),[u,b]=i.useState(null),[S,v]=i.useState(null),[B,k]=i.useState(!1),f=xe(),[A,w]=i.useState(!1),[X,T]=i.useState(void 0),[J,F]=i.useState(!1),D=t.data??[],H=t.isLoading,y=D.find(n=>n.budget_id===p)??null,U=D.find(n=>n.budget_id===x)??null,K=!H&&D.length===0&&!h,Z=D.map(n=>n.budget_id),_=ge(f.selectedKeys,Z),ee=async()=>{F(!0),T(void 0);try{for(const n of _)await l.mutateAsync(n);f.clear(),w(!1)}catch(n){T(n)}finally{F(!1)}},te=i.useMemo(()=>[{id:"budget",header:"Budget",isRowHeader:!0,cell:n=>e.jsxs("div",{className:"flex flex-col gap-0.5",children:[e.jsx("span",{className:"font-medium text-[var(--otari-ink)]",children:n.name??e.jsx("span",{className:"text-[var(--otari-muted)]",children:"(unnamed)"})}),e.jsx("code",{className:"text-[11px] text-[var(--otari-muted)]",title:n.budget_id,children:Q(n.budget_id)})]})},{id:"limit",header:"Limit (per user)",cell:n=>n.max_budget===null?e.jsx("span",{className:"text-[var(--otari-muted)]",children:"Unlimited"}):P(n.max_budget)},{id:"reset",header:"Reset",cell:n=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:Ce(n.budget_duration_sec)})},{id:"users",header:"Users",cell:n=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:n.user_count})},{id:"usage",header:"Usage",cell:n=>e.jsx(Pe,{budget:n})},{id:"actions",header:"Actions",align:"end",cell:n=>e.jsxs("div",{className:"flex items-center justify-end gap-1.5",children:[e.jsx(c,{size:"sm",variant:"ghost",onPress:()=>s(N=>N===n.budget_id?null:n.budget_id),children:x===n.budget_id?"Hide history":"History"}),e.jsx(c,{size:"sm",variant:"ghost",onPress:()=>{d(!1),m(n.budget_id)},children:"Edit"}),e.jsx(Ae,{label:M(n),isPending:l.isPending,onConfirm:()=>l.mutate(n.budget_id)})]})}],[x,l.isPending,l.mutate]),V=async(n,N)=>{k(!0),b(null);const L=await Promise.allSettled(N.map(R=>g.mutateAsync({id:R,body:{budget_id:n}})));k(!1);const I=L.flatMap((R,ne)=>R.status==="rejected"?[N[ne]]:[]);if(I.length>0){v({budgetId:n,userIds:I}),b(new Error(`Budget created, but could not assign it to: ${I.join(", ")}. Retry to try again.`));return}v(null),d(!1)},se=(n,N)=>{if(S){V(S.budgetId,S.userIds);return}b(null),r.mutate(n,{onSuccess:async L=>{if(N.length>0){await V(L.budget_id,N);return}d(!1)}})};return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(ue,{title:"Budgets",description:"Define spending limits and reset schedules. Assign a budget to users to enforce it.",action:h||K?null:e.jsx(c,{variant:"primary",onPress:()=>{m(null),b(null),v(null),d(!0)},children:"Create budget"})}),e.jsx(O,{error:t.error??r.error??o.error??l.error??g.error}),e.jsx(ce,{children:"Assign a budget to users when you create it, or later from the Users page. Each row’s usage aggregates the spend of the users currently on that budget."}),K?e.jsx(ke,{onCreate:()=>{m(null),b(null),v(null),d(!0)}}):null,h?e.jsx(G,{title:"Create budget",submitLabel:S?"Retry assignments":"Create budget",initial:{name:null,max_budget:null,budget_duration_sec:null},error:r.error??u,isPending:r.isPending||B,assignUsers:a.data??[],onSubmit:se,onClose:()=>{b(null),v(null),d(!1)}}):null,y?e.jsx(G,{title:`Edit budget ${M(y)}`,submitLabel:"Save changes",initial:{name:y.name,max_budget:y.max_budget,budget_duration_sec:y.budget_duration_sec},error:o.error,isPending:o.isPending,onSubmit:n=>o.mutate({id:y.budget_id,body:n},{onSuccess:()=>m(null)}),onClose:()=>m(null)},y.budget_id):null,_.length>0?e.jsx(he,{selectedCount:_.length,allMatching:!1,matchingTotal:null,canSelectAllMatching:!1,onSelectAllMatching:()=>{},onClear:f.clear,children:e.jsx(c,{size:"sm",variant:"danger",onPress:()=>w(!0),children:"Delete"})}):null,e.jsx(fe,{ariaLabel:"Budgets",columns:te,rows:D,getRowKey:Ee,isLoading:H,emptyContent:"No budgets yet. Create one to cap spending.",selectionMode:"multiple",selectedKeys:f.selectedKeys,onSelectionChange:f.onSelectionChange}),U?e.jsx(C,{children:e.jsxs(C.Content,{className:"p-0",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-[var(--otari-line)] px-4 py-2",children:[e.jsxs("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:["Reset history — ",M(U)]}),e.jsx(c,{size:"sm",variant:"ghost",onPress:()=>s(null),children:"Close"})]}),e.jsx(Be,{budgetId:U.budget_id})]})}):null,e.jsx(pe,{isOpen:A,onOpenChange:w,heading:"Delete budgets",body:`Delete ${_.length} ${_.length===1?"budget":"budgets"}? Users on ${_.length===1?"it":"them"} will no longer be capped.`,confirmLabel:"Delete",isPending:J,error:X,onConfirm:ee})]})}export{Te as BudgetsPage}; diff --git a/src/gateway/static/dashboard/assets/ConfirmDialog-CWW3AYpK.js b/src/gateway/static/dashboard/assets/ConfirmDialog-D_mZT4k-.js similarity index 92% rename from src/gateway/static/dashboard/assets/ConfirmDialog-CWW3AYpK.js rename to src/gateway/static/dashboard/assets/ConfirmDialog-D_mZT4k-.js index 6f4b3376..7f0efeb2 100644 --- a/src/gateway/static/dashboard/assets/ConfirmDialog-CWW3AYpK.js +++ b/src/gateway/static/dashboard/assets/ConfirmDialog-D_mZT4k-.js @@ -1 +1 @@ -import{j as r}from"./tanstack-query-1t81HyiD.js";import{E as j}from"./index-CGnfXTEF.js";import{A as e,B as l}from"./heroui-BI50yK5B.js";function p({isOpen:s,onOpenChange:a,heading:n,body:o,confirmLabel:t,confirmVariant:c="danger",isPending:i,error:d,onConfirm:x}){return r.jsx(e,{isOpen:s,onOpenChange:a,children:s?r.jsx(e.Backdrop,{children:r.jsx(e.Container,{placement:"center",size:"md",children:r.jsxs(e.Dialog,{children:[r.jsx(e.Header,{children:r.jsx(e.Heading,{children:n})}),r.jsxs(e.Body,{className:"flex flex-col gap-4",children:[r.jsx("div",{className:"text-sm text-[var(--otari-muted)]",children:o}),r.jsx(j,{error:d})]}),r.jsxs(e.Footer,{children:[r.jsx(l,{variant:"ghost",isDisabled:i,onPress:()=>a(!1),children:"Cancel"}),r.jsx(l,{variant:c,isPending:i,onPress:x,children:t})]})]})})}):null})}export{p as C}; +import{j as r}from"./tanstack-query-1t81HyiD.js";import{E as j}from"./index-DHi1jXMu.js";import{A as e,B as l}from"./heroui-BI50yK5B.js";function p({isOpen:s,onOpenChange:a,heading:n,body:o,confirmLabel:t,confirmVariant:c="danger",isPending:i,error:d,onConfirm:x}){return r.jsx(e,{isOpen:s,onOpenChange:a,children:s?r.jsx(e.Backdrop,{children:r.jsx(e.Container,{placement:"center",size:"md",children:r.jsxs(e.Dialog,{children:[r.jsx(e.Header,{children:r.jsx(e.Heading,{children:n})}),r.jsxs(e.Body,{className:"flex flex-col gap-4",children:[r.jsx("div",{className:"text-sm text-[var(--otari-muted)]",children:o}),r.jsx(j,{error:d})]}),r.jsxs(e.Footer,{children:[r.jsx(l,{variant:"ghost",isDisabled:i,onPress:()=>a(!1),children:"Cancel"}),r.jsx(l,{variant:c,isPending:i,onPress:x,children:t})]})]})})}):null})}export{p as C}; diff --git a/src/gateway/static/dashboard/assets/DocsPage-BAH_T1JY.js b/src/gateway/static/dashboard/assets/DocsPage-D7XUEYdI.js similarity index 99% rename from src/gateway/static/dashboard/assets/DocsPage-BAH_T1JY.js rename to src/gateway/static/dashboard/assets/DocsPage-D7XUEYdI.js index f2d8990c..12eb203d 100644 --- a/src/gateway/static/dashboard/assets/DocsPage-BAH_T1JY.js +++ b/src/gateway/static/dashboard/assets/DocsPage-D7XUEYdI.js @@ -1,4 +1,4 @@ -import{j as re}from"./tanstack-query-1t81HyiD.js";import{P as gi}from"./index-CGnfXTEF.js";import{d as ct}from"./heroui-BI50yK5B.js";import{g as nr}from"./react-dgEcD0HR.js";function yi(e,t){const n={};return(e[e.length-1]===""?[...e,""]:e).join((n.padRight?" ":"")+","+(n.padLeft===!1?"":" ")).trim()}const ki=/^[$_\p{ID_Start}][$_\u{200C}\u{200D}\p{ID_Continue}]*$/u,xi=/^[$_\p{ID_Start}][-$_\u{200C}\u{200D}\p{ID_Continue}]*$/u,bi={};function ft(e,t){return(bi.jsx?xi:ki).test(e)}const wi=/[ \t\n\f\r]/g;function Si(e){return typeof e=="object"?e.type==="text"?ht(e.value):!1:ht(e)}function ht(e){return e.replace(wi,"")===""}class Ke{constructor(t,n,r){this.normal=n,this.property=t,r&&(this.space=r)}}Ke.prototype.normal={};Ke.prototype.property={};Ke.prototype.space=void 0;function tr(e,t){const n={},r={};for(const i of e)Object.assign(n,i.property),Object.assign(r,i.normal);return new Ke(n,r,t)}function zn(e){return e.toLowerCase()}class ee{constructor(t,n){this.attribute=n,this.property=t}}ee.prototype.attribute="";ee.prototype.booleanish=!1;ee.prototype.boolean=!1;ee.prototype.commaOrSpaceSeparated=!1;ee.prototype.commaSeparated=!1;ee.prototype.defined=!1;ee.prototype.mustUseProperty=!1;ee.prototype.number=!1;ee.prototype.overloadedBoolean=!1;ee.prototype.property="";ee.prototype.spaceSeparated=!1;ee.prototype.space=void 0;let Ci=0;const L=Ae(),Y=Ae(),Dn=Ae(),E=Ae(),$=Ae(),Ie=Ae(),te=Ae();function Ae(){return 2**++Ci}const Ln=Object.freeze(Object.defineProperty({__proto__:null,boolean:L,booleanish:Y,commaOrSpaceSeparated:te,commaSeparated:Ie,number:E,overloadedBoolean:Dn,spaceSeparated:$},Symbol.toStringTag,{value:"Module"})),pn=Object.keys(Ln);class Hn extends ee{constructor(t,n,r,i){let o=-1;if(super(t,n),pt(this,"space",i),typeof r=="number")for(;++o4&&n.slice(0,4)==="data"&&vi.test(t)){if(t.charAt(4)==="-"){const o=t.slice(5).replace(mt,Di);r="data"+o.charAt(0).toUpperCase()+o.slice(1)}else{const o=t.slice(4);if(!mt.test(o)){let l=o.replace(Ai,zi);l.charAt(0)!=="-"&&(l="-"+l),t="data"+l}}i=Hn}return new i(r,t)}function zi(e){return"-"+e.toLowerCase()}function Di(e){return e.charAt(1).toUpperCase()}const Li=tr([rr,Ei,or,ar,ur],"html"),Un=tr([rr,Ii,or,ar,ur],"svg");function Fi(e){return e.join(" ").trim()}var De={},mn,dt;function Ri(){if(dt)return mn;dt=1;var e=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g,t=/\n/g,n=/^\s*/,r=/^(\*?[-#/*\\\w]+(\[[0-9a-z_-]+\])?)\s*/,i=/^:\s*/,o=/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/,l=/^[;\s]*/,a=/^\s+|\s+$/g,u=` +import{j as re}from"./tanstack-query-1t81HyiD.js";import{P as gi}from"./index-DHi1jXMu.js";import{d as ct}from"./heroui-BI50yK5B.js";import{g as nr}from"./react-dgEcD0HR.js";function yi(e,t){const n={};return(e[e.length-1]===""?[...e,""]:e).join((n.padRight?" ":"")+","+(n.padLeft===!1?"":" ")).trim()}const ki=/^[$_\p{ID_Start}][$_\u{200C}\u{200D}\p{ID_Continue}]*$/u,xi=/^[$_\p{ID_Start}][-$_\u{200C}\u{200D}\p{ID_Continue}]*$/u,bi={};function ft(e,t){return(bi.jsx?xi:ki).test(e)}const wi=/[ \t\n\f\r]/g;function Si(e){return typeof e=="object"?e.type==="text"?ht(e.value):!1:ht(e)}function ht(e){return e.replace(wi,"")===""}class Ke{constructor(t,n,r){this.normal=n,this.property=t,r&&(this.space=r)}}Ke.prototype.normal={};Ke.prototype.property={};Ke.prototype.space=void 0;function tr(e,t){const n={},r={};for(const i of e)Object.assign(n,i.property),Object.assign(r,i.normal);return new Ke(n,r,t)}function zn(e){return e.toLowerCase()}class ee{constructor(t,n){this.attribute=n,this.property=t}}ee.prototype.attribute="";ee.prototype.booleanish=!1;ee.prototype.boolean=!1;ee.prototype.commaOrSpaceSeparated=!1;ee.prototype.commaSeparated=!1;ee.prototype.defined=!1;ee.prototype.mustUseProperty=!1;ee.prototype.number=!1;ee.prototype.overloadedBoolean=!1;ee.prototype.property="";ee.prototype.spaceSeparated=!1;ee.prototype.space=void 0;let Ci=0;const L=Ae(),Y=Ae(),Dn=Ae(),E=Ae(),$=Ae(),Ie=Ae(),te=Ae();function Ae(){return 2**++Ci}const Ln=Object.freeze(Object.defineProperty({__proto__:null,boolean:L,booleanish:Y,commaOrSpaceSeparated:te,commaSeparated:Ie,number:E,overloadedBoolean:Dn,spaceSeparated:$},Symbol.toStringTag,{value:"Module"})),pn=Object.keys(Ln);class Hn extends ee{constructor(t,n,r,i){let o=-1;if(super(t,n),pt(this,"space",i),typeof r=="number")for(;++o4&&n.slice(0,4)==="data"&&vi.test(t)){if(t.charAt(4)==="-"){const o=t.slice(5).replace(mt,Di);r="data"+o.charAt(0).toUpperCase()+o.slice(1)}else{const o=t.slice(4);if(!mt.test(o)){let l=o.replace(Ai,zi);l.charAt(0)!=="-"&&(l="-"+l),t="data"+l}}i=Hn}return new i(r,t)}function zi(e){return"-"+e.toLowerCase()}function Di(e){return e.charAt(1).toUpperCase()}const Li=tr([rr,Ei,or,ar,ur],"html"),Un=tr([rr,Ii,or,ar,ur],"svg");function Fi(e){return e.join(" ").trim()}var De={},mn,dt;function Ri(){if(dt)return mn;dt=1;var e=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g,t=/\n/g,n=/^\s*/,r=/^(\*?[-#/*\\\w]+(\[[0-9a-z_-]+\])?)\s*/,i=/^:\s*/,o=/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/,l=/^[;\s]*/,a=/^\s+|\s+$/g,u=` `,s="/",f="*",c="",p="comment",h="declaration";function g(S,y){if(typeof S!="string")throw new TypeError("First argument must be a string");if(!S)return[];y=y||{};var I=1,C=1;function R(D){var A=D.match(t);A&&(I+=A.length);var q=D.lastIndexOf(u);C=~q?D.length-q:C+D.length}function _(){var D={line:I,column:C};return function(A){return A.position=new b(D),j(),A}}function b(D){this.start=D,this.end={line:I,column:C},this.source=y.source}b.prototype.content=S;function M(D){var A=new Error(y.source+":"+I+":"+C+": "+D);if(A.reason=D,A.filename=y.source,A.line=I,A.column=C,A.source=S,!y.silent)throw A}function H(D){var A=D.exec(S);if(A){var q=A[0];return R(q),S=S.slice(q.length),A}}function j(){H(n)}function k(D){var A;for(D=D||[];A=v();)A!==!1&&D.push(A);return D}function v(){var D=_();if(!(s!=S.charAt(0)||f!=S.charAt(1))){for(var A=2;c!=S.charAt(A)&&(f!=S.charAt(A)||s!=S.charAt(A+1));)++A;if(A+=2,c===S.charAt(A-1))return M("End of comment missing");var q=S.slice(2,A-2);return C+=2,R(q),S=S.slice(A),C+=2,D({type:p,comment:q})}}function P(){var D=_(),A=H(r);if(A){if(v(),!H(i))return M("property missing ':'");var q=H(o),K=D({type:h,property:w(A[0].replace(e,c)),value:q?w(q[0].replace(e,c)):c});return H(l),K}}function U(){var D=[];k(D);for(var A;A=P();)A!==!1&&(D.push(A),k(D));return D}return j(),U()}function w(S){return S?S.replace(a,c):c}return mn=g,mn}var gt;function _i(){if(gt)return De;gt=1;var e=De&&De.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(De,"__esModule",{value:!0}),De.default=n;const t=e(Ri());function n(r,i){let o=null;if(!r||typeof r!="string")return o;const l=(0,t.default)(r),a=typeof i=="function";return l.forEach(u=>{if(u.type!=="declaration")return;const{property:s,value:f}=u;a?i(s,f,u):f&&(o=o||{},o[s]=f)}),o}return De}var Be={},yt;function Oi(){if(yt)return Be;yt=1,Object.defineProperty(Be,"__esModule",{value:!0}),Be.camelCase=void 0;var e=/^--[a-zA-Z0-9_-]+$/,t=/-([a-z])/g,n=/^[^-]+$/,r=/^-(webkit|moz|ms|o|khtml)-/,i=/^-(ms)-/,o=function(s){return!s||n.test(s)||e.test(s)},l=function(s,f){return f.toUpperCase()},a=function(s,f){return"".concat(f,"-")},u=function(s,f){return f===void 0&&(f={}),o(s)?s:(s=s.toLowerCase(),f.reactCompat?s=s.replace(i,a):s=s.replace(r,a),s.replace(t,l))};return Be.camelCase=u,Be}var je,kt;function Mi(){if(kt)return je;kt=1;var e=je&&je.__importDefault||function(i){return i&&i.__esModule?i:{default:i}},t=e(_i()),n=Oi();function r(i,o){var l={};return!i||typeof i!="string"||(0,t.default)(i,function(a,u){a&&u&&(l[(0,n.camelCase)(a,o)]=u)}),l}return r.default=r,je=r,je}var Ni=Mi();const Bi=nr(Ni),sr=cr("end"),qn=cr("start");function cr(e){return t;function t(n){const r=n&&n.position&&n.position[e]||{};if(typeof r.line=="number"&&r.line>0&&typeof r.column=="number"&&r.column>0)return{line:r.line,column:r.column,offset:typeof r.offset=="number"&&r.offset>-1?r.offset:void 0}}}function ji(e){const t=qn(e),n=sr(e);if(t&&n)return{start:t,end:n}}function qe(e){return!e||typeof e!="object"?"":"position"in e||"type"in e?xt(e.position):"start"in e||"end"in e?xt(e):"line"in e||"column"in e?Fn(e):""}function Fn(e){return bt(e&&e.line)+":"+bt(e&&e.column)}function xt(e){return Fn(e&&e.start)+"-"+Fn(e&&e.end)}function bt(e){return e&&typeof e=="number"?e:1}class G extends Error{constructor(t,n,r){super(),typeof n=="string"&&(r=n,n=void 0);let i="",o={},l=!1;if(n&&("line"in n&&"column"in n?o={place:n}:"start"in n&&"end"in n?o={place:n}:"type"in n?o={ancestors:[n],place:n.position}:o={...n}),typeof t=="string"?i=t:!o.cause&&t&&(l=!0,i=t.message,o.cause=t),!o.ruleId&&!o.source&&typeof r=="string"){const u=r.indexOf(":");u===-1?o.ruleId=r:(o.source=r.slice(0,u),o.ruleId=r.slice(u+1))}if(!o.place&&o.ancestors&&o.ancestors){const u=o.ancestors[o.ancestors.length-1];u&&(o.place=u.position)}const a=o.place&&"start"in o.place?o.place.start:o.place;this.ancestors=o.ancestors||void 0,this.cause=o.cause||void 0,this.column=a?a.column:void 0,this.fatal=void 0,this.file="",this.message=i,this.line=a?a.line:void 0,this.name=qe(o.place)||"1:1",this.place=o.place||void 0,this.reason=this.message,this.ruleId=o.ruleId||void 0,this.source=o.source||void 0,this.stack=l&&o.cause&&typeof o.cause.stack=="string"?o.cause.stack:"",this.actual=void 0,this.expected=void 0,this.note=void 0,this.url=void 0}}G.prototype.file="";G.prototype.name="";G.prototype.reason="";G.prototype.message="";G.prototype.stack="";G.prototype.column=void 0;G.prototype.line=void 0;G.prototype.ancestors=void 0;G.prototype.cause=void 0;G.prototype.fatal=void 0;G.prototype.place=void 0;G.prototype.ruleId=void 0;G.prototype.source=void 0;const Vn={}.hasOwnProperty,Hi=new Map,Ui=/[A-Z]/g,qi=new Set(["table","tbody","thead","tfoot","tr"]),Vi=new Set(["td","th"]),fr="https://github.com/syntax-tree/hast-util-to-jsx-runtime";function $i(e,t){if(!t||t.Fragment===void 0)throw new TypeError("Expected `Fragment` in options");const n=t.filePath||void 0;let r;if(t.development){if(typeof t.jsxDEV!="function")throw new TypeError("Expected `jsxDEV` in options when `development: true`");r=Zi(n,t.jsxDEV)}else{if(typeof t.jsx!="function")throw new TypeError("Expected `jsx` in production options");if(typeof t.jsxs!="function")throw new TypeError("Expected `jsxs` in production options");r=Ji(n,t.jsx,t.jsxs)}const i={Fragment:t.Fragment,ancestors:[],components:t.components||{},create:r,elementAttributeNameCase:t.elementAttributeNameCase||"react",evaluater:t.createEvaluater?t.createEvaluater():void 0,filePath:n,ignoreInvalidStyle:t.ignoreInvalidStyle||!1,passKeys:t.passKeys!==!1,passNode:t.passNode||!1,schema:t.space==="svg"?Un:Li,stylePropertyNameCase:t.stylePropertyNameCase||"dom",tableCellAlignToStyle:t.tableCellAlignToStyle!==!1},o=hr(i,e,void 0);return o&&typeof o!="string"?o:i.create(e,i.Fragment,{children:o||void 0},void 0)}function hr(e,t,n){if(t.type==="element")return Wi(e,t,n);if(t.type==="mdxFlowExpression"||t.type==="mdxTextExpression")return Yi(e,t);if(t.type==="mdxJsxFlowElement"||t.type==="mdxJsxTextElement")return Qi(e,t,n);if(t.type==="mdxjsEsm")return Ki(e,t);if(t.type==="root")return Xi(e,t,n);if(t.type==="text")return Gi(e,t)}function Wi(e,t,n){const r=e.schema;let i=r;t.tagName.toLowerCase()==="svg"&&r.space==="html"&&(i=Un,e.schema=i),e.ancestors.push(t);const o=mr(e,t.tagName,!1),l=el(e,t);let a=Wn(e,t);return qi.has(t.tagName)&&(a=a.filter(function(u){return typeof u=="string"?!Si(u):!0})),pr(e,l,o,t),$n(l,a),e.ancestors.pop(),e.schema=r,e.create(t,o,l,n)}function Yi(e,t){if(t.data&&t.data.estree&&e.evaluater){const r=t.data.estree.body[0];return r.type,e.evaluater.evaluateExpression(r.expression)}We(e,t.position)}function Ki(e,t){if(t.data&&t.data.estree&&e.evaluater)return e.evaluater.evaluateProgram(t.data.estree);We(e,t.position)}function Qi(e,t,n){const r=e.schema;let i=r;t.name==="svg"&&r.space==="html"&&(i=Un,e.schema=i),e.ancestors.push(t);const o=t.name===null?e.Fragment:mr(e,t.name,!0),l=nl(e,t),a=Wn(e,t);return pr(e,l,o,t),$n(l,a),e.ancestors.pop(),e.schema=r,e.create(t,o,l,n)}function Xi(e,t,n){const r={};return $n(r,Wn(e,t)),e.create(t,e.Fragment,r,n)}function Gi(e,t){return t.value}function pr(e,t,n,r){typeof n!="string"&&n!==e.Fragment&&e.passNode&&(t.node=r)}function $n(e,t){if(t.length>0){const n=t.length>1?t:t[0];n&&(e.children=n)}}function Ji(e,t,n){return r;function r(i,o,l,a){const s=Array.isArray(l.children)?n:t;return a?s(o,l,a):s(o,l)}}function Zi(e,t){return n;function n(r,i,o,l){const a=Array.isArray(o.children),u=qn(r);return t(i,o,l,a,{columnNumber:u?u.column-1:void 0,fileName:e,lineNumber:u?u.line:void 0},void 0)}}function el(e,t){const n={};let r,i;for(i in t.properties)if(i!=="children"&&Vn.call(t.properties,i)){const o=tl(e,i,t.properties[i]);if(o){const[l,a]=o;e.tableCellAlignToStyle&&l==="align"&&typeof a=="string"&&Vi.has(t.tagName)?r=a:n[l]=a}}if(r){const o=n.style||(n.style={});o[e.stylePropertyNameCase==="css"?"text-align":"textAlign"]=r}return n}function nl(e,t){const n={};for(const r of t.attributes)if(r.type==="mdxJsxExpressionAttribute")if(r.data&&r.data.estree&&e.evaluater){const o=r.data.estree.body[0];o.type;const l=o.expression;l.type;const a=l.properties[0];a.type,Object.assign(n,e.evaluater.evaluateExpression(a.argument))}else We(e,t.position);else{const i=r.name;let o;if(r.value&&typeof r.value=="object")if(r.value.data&&r.value.data.estree&&e.evaluater){const a=r.value.data.estree.body[0];a.type,o=e.evaluater.evaluateExpression(a.expression)}else We(e,t.position);else o=r.value===null?!0:r.value;n[i]=o}return n}function Wn(e,t){const n=[];let r=-1;const i=e.passKeys?new Map:Hi;for(;++ri?0:i+t:t=t>i?i:t,n=n>0?n:0,r.length<1e4)l=Array.from(r),l.unshift(t,n),e.splice(...l);else for(n&&e.splice(t,n);o0?(ie(e,e.length,0,t),e):t}const Ct={}.hasOwnProperty;function gr(e){const t={};let n=-1;for(;++n13&&n<32||n>126&&n<160||n>55295&&n<57344||n>64975&&n<65008||(n&65535)===65535||(n&65535)===65534||n>1114111?"�":String.fromCodePoint(n)}function ce(e){return e.replace(/[\t\n\r ]+/g," ").replace(/^ | $/g,"").toLowerCase().toUpperCase()}const J=be(/[A-Za-z]/),X=be(/[\dA-Za-z]/),fl=be(/[#-'*+\--9=?A-Z^-~]/);function rn(e){return e!==null&&(e<32||e===127)}const Rn=be(/\d/),hl=be(/[\dA-Fa-f]/),pl=be(/[!-/:-@[-`{-~]/);function z(e){return e!==null&&e<-2}function W(e){return e!==null&&(e<0||e===32)}function O(e){return e===-2||e===-1||e===32}const un=be(new RegExp("\\p{P}|\\p{S}","u")),Te=be(/\s/);function be(e){return t;function t(n){return n!==null&&n>-1&&e.test(String.fromCharCode(n))}}function _e(e){const t=[];let n=-1,r=0,i=0;for(;++n55295&&o<57344){const a=e.charCodeAt(n+1);o<56320&&a>56319&&a<57344?(l=String.fromCharCode(o,a),i=1):l="�"}else l=String.fromCharCode(o);l&&(t.push(e.slice(r,n),encodeURIComponent(l)),r=n+i+1,l=""),i&&(n+=i,i=0)}return t.join("")+e.slice(r)}function B(e,t,n,r){const i=r?r-1:Number.POSITIVE_INFINITY;let o=0;return l;function l(u){return O(u)?(e.enter(n),a(u)):t(u)}function a(u){return O(u)&&o++l))return;const M=t.events.length;let H=M,j,k;for(;H--;)if(t.events[H][0]==="exit"&&t.events[H][1].type==="chunkFlow"){if(j){k=t.events[H][1].end;break}j=!0}for(y(r),b=M;bC;){const _=n[R];t.containerState=_[1],_[0].exit.call(t,e)}n.length=C}function I(){i.write([null]),o=void 0,i=void 0,t.containerState._closeFlow=void 0}}function kl(e,t,n){return B(e,e.attempt(this.parser.constructs.document,t,n),"linePrefix",this.parser.constructs.disable.null.includes("codeIndented")?void 0:4)}function Fe(e){if(e===null||W(e)||Te(e))return 1;if(un(e))return 2}function sn(e,t,n){const r=[];let i=-1;for(;++i1&&e[n][1].end.offset-e[n][1].start.offset>1?2:1;const c={...e[r][1].end},p={...e[n][1].start};It(c,-u),It(p,u),l={type:u>1?"strongSequence":"emphasisSequence",start:c,end:{...e[r][1].end}},a={type:u>1?"strongSequence":"emphasisSequence",start:{...e[n][1].start},end:p},o={type:u>1?"strongText":"emphasisText",start:{...e[r][1].end},end:{...e[n][1].start}},i={type:u>1?"strong":"emphasis",start:{...l.start},end:{...a.end}},e[r][1].end={...l.start},e[n][1].start={...a.end},s=[],e[r][1].end.offset-e[r][1].start.offset&&(s=le(s,[["enter",e[r][1],t],["exit",e[r][1],t]])),s=le(s,[["enter",i,t],["enter",l,t],["exit",l,t],["enter",o,t]]),s=le(s,sn(t.parser.constructs.insideSpan.null,e.slice(r+1,n),t)),s=le(s,[["exit",o,t],["enter",a,t],["exit",a,t],["exit",i,t]]),e[n][1].end.offset-e[n][1].start.offset?(f=2,s=le(s,[["enter",e[n][1],t],["exit",e[n][1],t]])):f=0,ie(e,r-1,n-r+3,s),n=r+s.length-f-2;break}}for(n=-1;++n0&&O(b)?B(e,I,"linePrefix",o+1)(b):I(b)}function I(b){return b===null||z(b)?e.check(Tt,w,R)(b):(e.enter("codeFlowValue"),C(b))}function C(b){return b===null||z(b)?(e.exit("codeFlowValue"),I(b)):(e.consume(b),C)}function R(b){return e.exit("codeFenced"),t(b)}function _(b,M,H){let j=0;return k;function k(A){return b.enter("lineEnding"),b.consume(A),b.exit("lineEnding"),v}function v(A){return b.enter("codeFencedFence"),O(A)?B(b,P,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(A):P(A)}function P(A){return A===a?(b.enter("codeFencedFenceSequence"),U(A)):H(A)}function U(A){return A===a?(j++,b.consume(A),U):j>=l?(b.exit("codeFencedFenceSequence"),O(A)?B(b,D,"whitespace")(A):D(A)):H(A)}function D(A){return A===null||z(A)?(b.exit("codeFencedFence"),M(A)):H(A)}}}function zl(e,t,n){const r=this;return i;function i(l){return l===null?n(l):(e.enter("lineEnding"),e.consume(l),e.exit("lineEnding"),o)}function o(l){return r.parser.lazy[r.now().line]?n(l):t(l)}}const gn={name:"codeIndented",tokenize:Ll},Dl={partial:!0,tokenize:Fl};function Ll(e,t,n){const r=this;return i;function i(s){return e.enter("codeIndented"),B(e,o,"linePrefix",5)(s)}function o(s){const f=r.events[r.events.length-1];return f&&f[1].type==="linePrefix"&&f[2].sliceSerialize(f[1],!0).length>=4?l(s):n(s)}function l(s){return s===null?u(s):z(s)?e.attempt(Dl,l,u)(s):(e.enter("codeFlowValue"),a(s))}function a(s){return s===null||z(s)?(e.exit("codeFlowValue"),l(s)):(e.consume(s),a)}function u(s){return e.exit("codeIndented"),t(s)}}function Fl(e,t,n){const r=this;return i;function i(l){return r.parser.lazy[r.now().line]?n(l):z(l)?(e.enter("lineEnding"),e.consume(l),e.exit("lineEnding"),i):B(e,o,"linePrefix",5)(l)}function o(l){const a=r.events[r.events.length-1];return a&&a[1].type==="linePrefix"&&a[2].sliceSerialize(a[1],!0).length>=4?t(l):z(l)?i(l):n(l)}}const Rl={name:"codeText",previous:Ol,resolve:_l,tokenize:Ml};function _l(e){let t=e.length-4,n=3,r,i;if((e[n][1].type==="lineEnding"||e[n][1].type==="space")&&(e[t][1].type==="lineEnding"||e[t][1].type==="space")){for(r=n;++r=this.left.length+this.right.length)throw new RangeError("Cannot access index `"+t+"` in a splice buffer of size `"+(this.left.length+this.right.length)+"`");return tthis.left.length?this.right.slice(this.right.length-r+this.left.length,this.right.length-t+this.left.length).reverse():this.left.slice(t).concat(this.right.slice(this.right.length-r+this.left.length).reverse())}splice(t,n,r){const i=n||0;this.setCursor(Math.trunc(t));const o=this.right.splice(this.right.length-i,Number.POSITIVE_INFINITY);return r&&He(this.left,r),o.reverse()}pop(){return this.setCursor(Number.POSITIVE_INFINITY),this.left.pop()}push(t){this.setCursor(Number.POSITIVE_INFINITY),this.left.push(t)}pushMany(t){this.setCursor(Number.POSITIVE_INFINITY),He(this.left,t)}unshift(t){this.setCursor(0),this.right.push(t)}unshiftMany(t){this.setCursor(0),He(this.right,t.reverse())}setCursor(t){if(!(t===this.left.length||t>this.left.length&&this.right.length===0||t<0&&this.left.length===0))if(t=4?t(l):e.interrupt(r.parser.constructs.flow,n,t)(l)}}function Sr(e,t,n,r,i,o,l,a,u){const s=u||Number.POSITIVE_INFINITY;let f=0;return c;function c(y){return y===60?(e.enter(r),e.enter(i),e.enter(o),e.consume(y),e.exit(o),p):y===null||y===32||y===41||rn(y)?n(y):(e.enter(r),e.enter(l),e.enter(a),e.enter("chunkString",{contentType:"string"}),w(y))}function p(y){return y===62?(e.enter(o),e.consume(y),e.exit(o),e.exit(i),e.exit(r),t):(e.enter(a),e.enter("chunkString",{contentType:"string"}),h(y))}function h(y){return y===62?(e.exit("chunkString"),e.exit(a),p(y)):y===null||y===60||z(y)?n(y):(e.consume(y),y===92?g:h)}function g(y){return y===60||y===62||y===92?(e.consume(y),h):h(y)}function w(y){return!f&&(y===null||y===41||W(y))?(e.exit("chunkString"),e.exit(a),e.exit(l),e.exit(r),t(y)):f999||h===null||h===91||h===93&&!u||h===94&&!a&&"_hiddenFootnoteSupport"in l.parser.constructs?n(h):h===93?(e.exit(o),e.enter(i),e.consume(h),e.exit(i),e.exit(r),t):z(h)?(e.enter("lineEnding"),e.consume(h),e.exit("lineEnding"),f):(e.enter("chunkString",{contentType:"string"}),c(h))}function c(h){return h===null||h===91||h===93||z(h)||a++>999?(e.exit("chunkString"),f(h)):(e.consume(h),u||(u=!O(h)),h===92?p:c)}function p(h){return h===91||h===92||h===93?(e.consume(h),a++,c):c(h)}}function Er(e,t,n,r,i,o){let l;return a;function a(p){return p===34||p===39||p===40?(e.enter(r),e.enter(i),e.consume(p),e.exit(i),l=p===40?41:p,u):n(p)}function u(p){return p===l?(e.enter(i),e.consume(p),e.exit(i),e.exit(r),t):(e.enter(o),s(p))}function s(p){return p===l?(e.exit(o),u(l)):p===null?n(p):z(p)?(e.enter("lineEnding"),e.consume(p),e.exit("lineEnding"),B(e,s,"linePrefix")):(e.enter("chunkString",{contentType:"string"}),f(p))}function f(p){return p===l||p===null||z(p)?(e.exit("chunkString"),s(p)):(e.consume(p),p===92?c:f)}function c(p){return p===l||p===92?(e.consume(p),f):f(p)}}function Ve(e,t){let n;return r;function r(i){return z(i)?(e.enter("lineEnding"),e.consume(i),e.exit("lineEnding"),n=!0,r):O(i)?B(e,r,n?"linePrefix":"lineSuffix")(i):t(i)}}const $l={name:"definition",tokenize:Yl},Wl={partial:!0,tokenize:Kl};function Yl(e,t,n){const r=this;let i;return o;function o(h){return e.enter("definition"),l(h)}function l(h){return Cr.call(r,e,a,n,"definitionLabel","definitionLabelMarker","definitionLabelString")(h)}function a(h){return i=ce(r.sliceSerialize(r.events[r.events.length-1][1]).slice(1,-1)),h===58?(e.enter("definitionMarker"),e.consume(h),e.exit("definitionMarker"),u):n(h)}function u(h){return W(h)?Ve(e,s)(h):s(h)}function s(h){return Sr(e,f,n,"definitionDestination","definitionDestinationLiteral","definitionDestinationLiteralMarker","definitionDestinationRaw","definitionDestinationString")(h)}function f(h){return e.attempt(Wl,c,c)(h)}function c(h){return O(h)?B(e,p,"whitespace")(h):p(h)}function p(h){return h===null||z(h)?(e.exit("definition"),r.parser.defined.push(i),t(h)):n(h)}}function Kl(e,t,n){return r;function r(a){return W(a)?Ve(e,i)(a):n(a)}function i(a){return Er(e,o,n,"definitionTitle","definitionTitleMarker","definitionTitleString")(a)}function o(a){return O(a)?B(e,l,"whitespace")(a):l(a)}function l(a){return a===null||z(a)?t(a):n(a)}}const Ql={name:"hardBreakEscape",tokenize:Xl};function Xl(e,t,n){return r;function r(o){return e.enter("hardBreakEscape"),e.consume(o),i}function i(o){return z(o)?(e.exit("hardBreakEscape"),t(o)):n(o)}}const Gl={name:"headingAtx",resolve:Jl,tokenize:Zl};function Jl(e,t){let n=e.length-2,r=3,i,o;return e[r][1].type==="whitespace"&&(r+=2),n-2>r&&e[n][1].type==="whitespace"&&(n-=2),e[n][1].type==="atxHeadingSequence"&&(r===n-1||n-4>r&&e[n-2][1].type==="whitespace")&&(n-=r+1===n?2:4),n>r&&(i={type:"atxHeadingText",start:e[r][1].start,end:e[n][1].end},o={type:"chunkText",start:e[r][1].start,end:e[n][1].end,contentType:"text"},ie(e,r,n-r+1,[["enter",i,t],["enter",o,t],["exit",o,t],["exit",i,t]])),e}function Zl(e,t,n){let r=0;return i;function i(f){return e.enter("atxHeading"),o(f)}function o(f){return e.enter("atxHeadingSequence"),l(f)}function l(f){return f===35&&r++<6?(e.consume(f),l):f===null||W(f)?(e.exit("atxHeadingSequence"),a(f)):n(f)}function a(f){return f===35?(e.enter("atxHeadingSequence"),u(f)):f===null||z(f)?(e.exit("atxHeading"),t(f)):O(f)?B(e,a,"whitespace")(f):(e.enter("atxHeadingText"),s(f))}function u(f){return f===35?(e.consume(f),u):(e.exit("atxHeadingSequence"),a(f))}function s(f){return f===null||f===35||W(f)?(e.exit("atxHeadingText"),a(f)):(e.consume(f),s)}}const eo=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","search","section","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"],vt=["pre","script","style","textarea"],no={concrete:!0,name:"htmlFlow",resolveTo:io,tokenize:lo},to={partial:!0,tokenize:ao},ro={partial:!0,tokenize:oo};function io(e){let t=e.length;for(;t--&&!(e[t][0]==="enter"&&e[t][1].type==="htmlFlow"););return t>1&&e[t-2][1].type==="linePrefix"&&(e[t][1].start=e[t-2][1].start,e[t+1][1].start=e[t-2][1].start,e.splice(t-2,2)),e}function lo(e,t,n){const r=this;let i,o,l,a,u;return s;function s(d){return f(d)}function f(d){return e.enter("htmlFlow"),e.enter("htmlFlowData"),e.consume(d),c}function c(d){return d===33?(e.consume(d),p):d===47?(e.consume(d),o=!0,w):d===63?(e.consume(d),i=3,r.interrupt?t:m):J(d)?(e.consume(d),l=String.fromCharCode(d),S):n(d)}function p(d){return d===45?(e.consume(d),i=2,h):d===91?(e.consume(d),i=5,a=0,g):J(d)?(e.consume(d),i=4,r.interrupt?t:m):n(d)}function h(d){return d===45?(e.consume(d),r.interrupt?t:m):n(d)}function g(d){const ue="CDATA[";return d===ue.charCodeAt(a++)?(e.consume(d),a===ue.length?r.interrupt?t:P:g):n(d)}function w(d){return J(d)?(e.consume(d),l=String.fromCharCode(d),S):n(d)}function S(d){if(d===null||d===47||d===62||W(d)){const ue=d===47,we=l.toLowerCase();return!ue&&!o&&vt.includes(we)?(i=1,r.interrupt?t(d):P(d)):eo.includes(l.toLowerCase())?(i=6,ue?(e.consume(d),y):r.interrupt?t(d):P(d)):(i=7,r.interrupt&&!r.parser.lazy[r.now().line]?n(d):o?I(d):C(d))}return d===45||X(d)?(e.consume(d),l+=String.fromCharCode(d),S):n(d)}function y(d){return d===62?(e.consume(d),r.interrupt?t:P):n(d)}function I(d){return O(d)?(e.consume(d),I):k(d)}function C(d){return d===47?(e.consume(d),k):d===58||d===95||J(d)?(e.consume(d),R):O(d)?(e.consume(d),C):k(d)}function R(d){return d===45||d===46||d===58||d===95||X(d)?(e.consume(d),R):_(d)}function _(d){return d===61?(e.consume(d),b):O(d)?(e.consume(d),_):C(d)}function b(d){return d===null||d===60||d===61||d===62||d===96?n(d):d===34||d===39?(e.consume(d),u=d,M):O(d)?(e.consume(d),b):H(d)}function M(d){return d===u?(e.consume(d),u=null,j):d===null||z(d)?n(d):(e.consume(d),M)}function H(d){return d===null||d===34||d===39||d===47||d===60||d===61||d===62||d===96||W(d)?_(d):(e.consume(d),H)}function j(d){return d===47||d===62||O(d)?C(d):n(d)}function k(d){return d===62?(e.consume(d),v):n(d)}function v(d){return d===null||z(d)?P(d):O(d)?(e.consume(d),v):n(d)}function P(d){return d===45&&i===2?(e.consume(d),q):d===60&&i===1?(e.consume(d),K):d===62&&i===4?(e.consume(d),ae):d===63&&i===3?(e.consume(d),m):d===93&&i===5?(e.consume(d),pe):z(d)&&(i===6||i===7)?(e.exit("htmlFlowData"),e.check(to,me,U)(d)):d===null||z(d)?(e.exit("htmlFlowData"),U(d)):(e.consume(d),P)}function U(d){return e.check(ro,D,me)(d)}function D(d){return e.enter("lineEnding"),e.consume(d),e.exit("lineEnding"),A}function A(d){return d===null||z(d)?U(d):(e.enter("htmlFlowData"),P(d))}function q(d){return d===45?(e.consume(d),m):P(d)}function K(d){return d===47?(e.consume(d),l="",oe):P(d)}function oe(d){if(d===62){const ue=l.toLowerCase();return vt.includes(ue)?(e.consume(d),ae):P(d)}return J(d)&&l.length<8?(e.consume(d),l+=String.fromCharCode(d),oe):P(d)}function pe(d){return d===93?(e.consume(d),m):P(d)}function m(d){return d===62?(e.consume(d),ae):d===45&&i===2?(e.consume(d),m):P(d)}function ae(d){return d===null||z(d)?(e.exit("htmlFlowData"),me(d)):(e.consume(d),ae)}function me(d){return e.exit("htmlFlow"),t(d)}}function oo(e,t,n){const r=this;return i;function i(l){return z(l)?(e.enter("lineEnding"),e.consume(l),e.exit("lineEnding"),o):n(l)}function o(l){return r.parser.lazy[r.now().line]?n(l):t(l)}}function ao(e,t,n){return r;function r(i){return e.enter("lineEnding"),e.consume(i),e.exit("lineEnding"),e.attempt(Qe,t,n)}}const uo={name:"htmlText",tokenize:so};function so(e,t,n){const r=this;let i,o,l;return a;function a(m){return e.enter("htmlText"),e.enter("htmlTextData"),e.consume(m),u}function u(m){return m===33?(e.consume(m),s):m===47?(e.consume(m),_):m===63?(e.consume(m),C):J(m)?(e.consume(m),H):n(m)}function s(m){return m===45?(e.consume(m),f):m===91?(e.consume(m),o=0,g):J(m)?(e.consume(m),I):n(m)}function f(m){return m===45?(e.consume(m),h):n(m)}function c(m){return m===null?n(m):m===45?(e.consume(m),p):z(m)?(l=c,K(m)):(e.consume(m),c)}function p(m){return m===45?(e.consume(m),h):c(m)}function h(m){return m===62?q(m):m===45?p(m):c(m)}function g(m){const ae="CDATA[";return m===ae.charCodeAt(o++)?(e.consume(m),o===ae.length?w:g):n(m)}function w(m){return m===null?n(m):m===93?(e.consume(m),S):z(m)?(l=w,K(m)):(e.consume(m),w)}function S(m){return m===93?(e.consume(m),y):w(m)}function y(m){return m===62?q(m):m===93?(e.consume(m),y):w(m)}function I(m){return m===null||m===62?q(m):z(m)?(l=I,K(m)):(e.consume(m),I)}function C(m){return m===null?n(m):m===63?(e.consume(m),R):z(m)?(l=C,K(m)):(e.consume(m),C)}function R(m){return m===62?q(m):C(m)}function _(m){return J(m)?(e.consume(m),b):n(m)}function b(m){return m===45||X(m)?(e.consume(m),b):M(m)}function M(m){return z(m)?(l=M,K(m)):O(m)?(e.consume(m),M):q(m)}function H(m){return m===45||X(m)?(e.consume(m),H):m===47||m===62||W(m)?j(m):n(m)}function j(m){return m===47?(e.consume(m),q):m===58||m===95||J(m)?(e.consume(m),k):z(m)?(l=j,K(m)):O(m)?(e.consume(m),j):q(m)}function k(m){return m===45||m===46||m===58||m===95||X(m)?(e.consume(m),k):v(m)}function v(m){return m===61?(e.consume(m),P):z(m)?(l=v,K(m)):O(m)?(e.consume(m),v):j(m)}function P(m){return m===null||m===60||m===61||m===62||m===96?n(m):m===34||m===39?(e.consume(m),i=m,U):z(m)?(l=P,K(m)):O(m)?(e.consume(m),P):(e.consume(m),D)}function U(m){return m===i?(e.consume(m),i=void 0,A):m===null?n(m):z(m)?(l=U,K(m)):(e.consume(m),U)}function D(m){return m===null||m===34||m===39||m===60||m===61||m===96?n(m):m===47||m===62||W(m)?j(m):(e.consume(m),D)}function A(m){return m===47||m===62||W(m)?j(m):n(m)}function q(m){return m===62?(e.consume(m),e.exit("htmlTextData"),e.exit("htmlText"),t):n(m)}function K(m){return e.exit("htmlTextData"),e.enter("lineEnding"),e.consume(m),e.exit("lineEnding"),oe}function oe(m){return O(m)?B(e,pe,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(m):pe(m)}function pe(m){return e.enter("htmlTextData"),l(m)}}const Qn={name:"labelEnd",resolveAll:po,resolveTo:mo,tokenize:go},co={tokenize:yo},fo={tokenize:ko},ho={tokenize:xo};function po(e){let t=-1;const n=[];for(;++t=3&&(s===null||z(s))?(e.exit("thematicBreak"),t(s)):n(s)}function u(s){return s===i?(e.consume(s),r++,u):(e.exit("thematicBreakSequence"),O(s)?B(e,a,"whitespace")(s):a(s))}}const Z={continuation:{tokenize:Po},exit:Do,name:"list",tokenize:vo},To={partial:!0,tokenize:Lo},Ao={partial:!0,tokenize:zo};function vo(e,t,n){const r=this,i=r.events[r.events.length-1];let o=i&&i[1].type==="linePrefix"?i[2].sliceSerialize(i[1],!0).length:0,l=0;return a;function a(h){const g=r.containerState.type||(h===42||h===43||h===45?"listUnordered":"listOrdered");if(g==="listUnordered"?!r.containerState.marker||h===r.containerState.marker:Rn(h)){if(r.containerState.type||(r.containerState.type=g,e.enter(g,{_container:!0})),g==="listUnordered")return e.enter("listItemPrefix"),h===42||h===45?e.check(tn,n,s)(h):s(h);if(!r.interrupt||h===49)return e.enter("listItemPrefix"),e.enter("listItemValue"),u(h)}return n(h)}function u(h){return Rn(h)&&++l<10?(e.consume(h),u):(!r.interrupt||l<2)&&(r.containerState.marker?h===r.containerState.marker:h===41||h===46)?(e.exit("listItemValue"),s(h)):n(h)}function s(h){return e.enter("listItemMarker"),e.consume(h),e.exit("listItemMarker"),r.containerState.marker=r.containerState.marker||h,e.check(Qe,r.interrupt?n:f,e.attempt(To,p,c))}function f(h){return r.containerState.initialBlankLine=!0,o++,p(h)}function c(h){return O(h)?(e.enter("listItemPrefixWhitespace"),e.consume(h),e.exit("listItemPrefixWhitespace"),p):n(h)}function p(h){return r.containerState.size=o+r.sliceSerialize(e.exit("listItemPrefix"),!0).length,t(h)}}function Po(e,t,n){const r=this;return r.containerState._closeFlow=void 0,e.check(Qe,i,o);function i(a){return r.containerState.furtherBlankLines=r.containerState.furtherBlankLines||r.containerState.initialBlankLine,B(e,t,"listItemIndent",r.containerState.size+1)(a)}function o(a){return r.containerState.furtherBlankLines||!O(a)?(r.containerState.furtherBlankLines=void 0,r.containerState.initialBlankLine=void 0,l(a)):(r.containerState.furtherBlankLines=void 0,r.containerState.initialBlankLine=void 0,e.attempt(Ao,t,l)(a))}function l(a){return r.containerState._closeFlow=!0,r.interrupt=void 0,B(e,e.attempt(Z,t,n),"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(a)}}function zo(e,t,n){const r=this;return B(e,i,"listItemIndent",r.containerState.size+1);function i(o){const l=r.events[r.events.length-1];return l&&l[1].type==="listItemIndent"&&l[2].sliceSerialize(l[1],!0).length===r.containerState.size?t(o):n(o)}}function Do(e){e.exit(this.containerState.type)}function Lo(e,t,n){const r=this;return B(e,i,"listItemPrefixWhitespace",r.parser.constructs.disable.null.includes("codeIndented")?void 0:5);function i(o){const l=r.events[r.events.length-1];return!O(o)&&l&&l[1].type==="listItemPrefixWhitespace"?t(o):n(o)}}const Pt={name:"setextUnderline",resolveTo:Fo,tokenize:Ro};function Fo(e,t){let n=e.length,r,i,o;for(;n--;)if(e[n][0]==="enter"){if(e[n][1].type==="content"){r=n;break}e[n][1].type==="paragraph"&&(i=n)}else e[n][1].type==="content"&&e.splice(n,1),!o&&e[n][1].type==="definition"&&(o=n);const l={type:"setextHeading",start:{...e[r][1].start},end:{...e[e.length-1][1].end}};return e[i][1].type="setextHeadingText",o?(e.splice(i,0,["enter",l,t]),e.splice(o+1,0,["exit",e[r][1],t]),e[r][1].end={...e[o][1].end}):e[r][1]=l,e.push(["exit",l,t]),e}function Ro(e,t,n){const r=this;let i;return o;function o(s){let f=r.events.length,c;for(;f--;)if(r.events[f][1].type!=="lineEnding"&&r.events[f][1].type!=="linePrefix"&&r.events[f][1].type!=="content"){c=r.events[f][1].type==="paragraph";break}return!r.parser.lazy[r.now().line]&&(r.interrupt||c)?(e.enter("setextHeadingLine"),i=s,l(s)):n(s)}function l(s){return e.enter("setextHeadingLineSequence"),a(s)}function a(s){return s===i?(e.consume(s),a):(e.exit("setextHeadingLineSequence"),O(s)?B(e,u,"lineSuffix")(s):u(s))}function u(s){return s===null||z(s)?(e.exit("setextHeadingLine"),t(s)):n(s)}}const _o={tokenize:Oo};function Oo(e){const t=this,n=e.attempt(Qe,r,e.attempt(this.parser.constructs.flowInitial,i,B(e,e.attempt(this.parser.constructs.flow,i,e.attempt(jl,i)),"linePrefix")));return n;function r(o){if(o===null){e.consume(o);return}return e.enter("lineEndingBlank"),e.consume(o),e.exit("lineEndingBlank"),t.currentConstruct=void 0,n}function i(o){if(o===null){e.consume(o);return}return e.enter("lineEnding"),e.consume(o),e.exit("lineEnding"),t.currentConstruct=void 0,n}}const Mo={resolveAll:Tr()},No=Ir("string"),Bo=Ir("text");function Ir(e){return{resolveAll:Tr(e==="text"?jo:void 0),tokenize:t};function t(n){const r=this,i=this.parser.constructs[e],o=n.attempt(i,l,a);return l;function l(f){return s(f)?o(f):a(f)}function a(f){if(f===null){n.consume(f);return}return n.enter("data"),n.consume(f),u}function u(f){return s(f)?(n.exit("data"),o(f)):(n.consume(f),u)}function s(f){if(f===null)return!0;const c=i[f];let p=-1;if(c)for(;++p-1){const a=l[0];typeof a=="string"?l[0]=a.slice(r):l.shift()}o>0&&l.push(e[i].slice(0,o))}return l}function Zo(e,t){let n=-1;const r=[];let i;for(;++n0){const se=F.tokenStack[F.tokenStack.length-1];(se[1]||Dt).call(F,void 0,se[0])}for(T.position={start:xe(x.length>0?x[0][1].start:{line:1,column:1,offset:0}),end:xe(x.length>0?x[x.length-2][1].end:{line:1,column:1,offset:0})},V=-1;++Va.key===r)}function Ce(n,r=Date.now()){return new Date(r-n*1e3).toISOString()}function O(n){return(n==="hour"?U:g)*1e3}function Pe(n,r,a=Date.now()){const o=new Date(n).getTime();return(r?new Date(r).getTime():a)-o<=g*1e3?"hour":"day"}function me(n,r,a,o){if(n.length===0)return null;const h=Math.max(0,Math.min(r,a)),l=Math.min(n.length-1,Math.max(r,a)),i=new Date(n[h]).getTime(),f=new Date(n[l]).getTime()+O(o);return{startIso:new Date(i).toISOString(),endIso:new Date(f).toISOString()}}function he(n,r,a){const o=n.length;if(o===0)return{startIndex:0,endIndex:0};const h=n.map(f=>new Date(f).getTime());let l=0;if(r){const f=new Date(r).getTime();for(let x=0;xe.bucketStart),Z=l.map(e=>({x:e.bucketStart,requests:e.requests})),s=l.length,H=xe(f,x),I=()=>{if(s===0)return[0,1];const{startIndex:e,endIndex:u}=he($,f,x);return[e,u+1]},[A,V]=y.useState(I),N=y.useRef(A),w=e=>{N.current=e,V(e)},S=y.useRef(!1);y.useEffect(()=>{S.current||w(I())},[f,x,s]);const k=([e,u])=>{if(S.current=!1,s===0)return;const m=Math.max(0,Math.min(s-1,Math.floor(e+1e-6))),c=Math.max(m,Math.min(s-1,Math.ceil(u-1e-6)-1));if(m===0&&c===s-1){h(),w([0,s]);return}const d=me($,m,c,i);d&&o(d.startIso,d.endIso)},D=n.findIndex(e=>e.key===r),L=D>=0?n[D].seconds:s*O(i)/1e3,C=D>=0?n[D+1]:n.find(e=>e.seconds===null||L!==null&&e.seconds>L),[p,b]=A,P=p<=.01&&b>=s-.01,_=e=>{const u=Math.max(1,Math.min(s,e)),m=(p+b)/2;let c=m-u/2,d=m+u/2;c<0&&(d-=c,c=0),d>s&&(c-=d-s,d=s);const M=[Math.max(0,c),Math.min(s,d)];w(M),k(M)},G=()=>{if(P){C&&a(C);return}_((b-p)*2)},J=()=>_((b-p)/2),Q=(e,u)=>{const[m,c]=N.current,d=e===0?[Math.max(0,Math.min(c-1,Math.round(m)+u)),c]:[m,Math.min(s,Math.max(m+1,Math.round(c)+u))];w(d),k(d)},ee=e=>{var d,M;const u=e.key==="ArrowRight"||e.key==="ArrowUp"?1:e.key==="ArrowLeft"||e.key==="ArrowDown"?-1:0;if(u===0)return;const m=(M=(d=e.target).getAttribute)==null?void 0:M.call(d,"aria-label"),c=K.indexOf(m);c<0||(e.preventDefault(),e.stopPropagation(),Q(c,u))},R=y.useRef(null),v=y.useRef(null),te=e=>{if(!v.current||!R.current)return;const u=R.current.getBoundingClientRect().width;if(u<=0)return;const m=(e.clientX-v.current.x)/u*s,c=v.current.sel[1]-v.current.sel[0],d=Math.max(0,Math.min(s-c,v.current.sel[0]+m));w([d,d+c])},E=s?Math.min(p,b)/s*100:0,z=s?Math.max(p,b)/s*100:100,B=!P;return t.jsxs("div",{className:"flex flex-col gap-2",children:[t.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[n.map(e=>t.jsx(T,{size:"sm",variant:r===e.key?"primary":"outline",onPress:()=>a(e),children:e.label},e.key)),t.jsxs("div",{className:"ml-auto flex items-center gap-3",children:[t.jsxs("span",{className:"text-xs text-[var(--otari-muted)]",children:["Showing ",H," · UTC"]}),X]})]}),t.jsxs("div",{className:"rounded-xl border border-[var(--otari-line)] bg-[var(--otari-surface)] p-2",children:[t.jsxs("div",{className:"flex items-center justify-between gap-2 px-1 pb-1",children:[t.jsxs("span",{className:"text-[11px] font-medium uppercase tracking-wide text-[var(--otari-muted)]",children:["Requests / ",i==="hour"?"hour":"day"]}),t.jsxs("div",{className:"flex items-center gap-1.5",children:[t.jsx("span",{className:"hidden text-[11px] text-[var(--otari-muted)] sm:inline",children:"drag the edges to zoom · the bottom strip to pan"}),t.jsx(T,{size:"sm",variant:"ghost",isIconOnly:!0,"aria-label":"Zoom in",isDisabled:s===0,onPress:J,children:t.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-4 w-4","aria-hidden":"true",children:t.jsx("path",{d:"M12 5v14M5 12h14",strokeLinecap:"round"})})}),t.jsx(T,{size:"sm",variant:"ghost",isIconOnly:!0,"aria-label":"Zoom out",isDisabled:s===0||P&&!C,onPress:G,children:t.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-4 w-4","aria-hidden":"true",children:t.jsx("path",{d:"M5 12h14",strokeLinecap:"round"})})}),B?t.jsx(T,{size:"sm",variant:"ghost",onPress:()=>k([0,s]),children:"Reset"}):null]})]}),W&&s===0?t.jsx("div",{className:"flex h-[90px] items-center justify-center",children:t.jsx(ne,{size:"sm"})}):s===0?t.jsx("div",{className:"flex h-[90px] items-center justify-center text-xs text-[var(--otari-muted)]",children:"No activity in this range."}):t.jsxs("div",{ref:R,className:"relative w-full",children:[t.jsx("div",{role:"img","aria-label":q,className:"w-full touch-pan-y select-none",children:t.jsx(ie,{width:"100%",height:90,children:t.jsxs(oe,{data:Z,margin:{top:4,right:0,left:0,bottom:0},children:[t.jsx(le,{dataKey:"x",tickLine:!1,axisLine:!1,interval:"preserveStartEnd",minTickGap:40,tickFormatter:e=>Y(e,i),tick:{fontSize:10,fill:"var(--otari-muted)"}}),t.jsx(ce,{cursor:{fill:"var(--otari-line)",opacity:.35},content:t.jsx(be,{bucket:i})}),t.jsx(de,{dataKey:"requests",fill:fe,radius:[2,2,0,0],isAnimationActive:!1})]})})}),B?t.jsxs(t.Fragment,{children:[t.jsx("div",{"aria-hidden":!0,className:"pointer-events-none absolute inset-y-0 left-0 bg-[var(--otari-bg)] opacity-70",style:{width:`${E}%`}}),t.jsx("div",{"aria-hidden":!0,className:"pointer-events-none absolute inset-y-0 right-0 bg-[var(--otari-bg)] opacity-70",style:{width:`${100-z}%`}})]}):null,t.jsx("div",{"aria-hidden":!0,className:"absolute bottom-0 z-[1] cursor-grab touch-none rounded bg-[var(--otari-brand)]/10 hover:bg-[var(--otari-brand)]/20 active:cursor-grabbing",style:{left:`${E}%`,width:`${Math.max(0,z-E)}%`,height:pe},onPointerDown:e=>{e.stopPropagation(),e.preventDefault(),S.current=!0,v.current={x:e.clientX,sel:[Math.min(p,b),Math.max(p,b)]},e.currentTarget.setPointerCapture(e.pointerId)},onPointerMove:te,onPointerUp:e=>{e.currentTarget.releasePointerCapture(e.pointerId),v.current=null,k(N.current)},onPointerCancel:()=>{v.current=null,k(N.current)}}),t.jsx("div",{className:"pointer-events-none absolute inset-0 z-[2]",onKeyDownCapture:ee,children:t.jsx(re,{"aria-label":"Selected time range",minValue:0,maxValue:s,step:1/ge,value:A,onChange:e=>{S.current=!0,Array.isArray(e)&&e.length===2&&w([e[0],e[1]])},onChangeEnd:e=>{Array.isArray(e)&&e.length===2&&k([e[0],e[1]])},className:"pointer-events-none h-full w-full",children:t.jsxs(ae,{className:"pointer-events-none relative h-full w-full",children:[t.jsx(F,{index:0}),t.jsx(F,{index:1})]})})})]})]})]})}function Ee({chips:n,children:r,onClearAll:a}){const[o,h]=y.useState(!1),l=y.useId();return t.jsxs("div",{className:"flex flex-col gap-2",children:[t.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[t.jsx(T,{size:"sm",variant:"outline",onPress:()=>h(i=>!i),"aria-expanded":o,"aria-controls":l,children:o?"Done":"Add filter"}),n.map(i=>t.jsxs("span",{className:"inline-flex items-center gap-1 rounded-full border border-[var(--otari-line)] bg-[var(--otari-brand-tint)] py-0.5 pl-2.5 pr-1 text-xs text-[var(--otari-brand-dark)]",children:[t.jsxs("span",{className:"text-[var(--otari-muted)]",children:[i.label,":"]}),t.jsx("span",{className:"font-medium",children:i.value}),t.jsx("button",{type:"button",onClick:i.onClear,"aria-label":`Remove ${i.label} filter`,className:"ml-0.5 inline-flex h-4 w-4 items-center justify-center rounded-full text-[var(--otari-muted)] hover:bg-[var(--otari-line)] hover:text-[var(--otari-ink)]",children:t.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",className:"h-3 w-3","aria-hidden":"true",children:t.jsx("path",{d:"M6 6l12 12M18 6L6 18",strokeLinecap:"round"})})})]},i.key)),n.length>0&&a?t.jsx(T,{size:"sm",variant:"ghost",onPress:a,children:"Clear all"}):null]}),t.jsx("div",{id:l,className:o?"flex flex-wrap items-end gap-3":"hidden",children:r})]})}export{Re as A,De as C,Ee as F,Me as U,Ne as a,Pe as b,Se as c,Te as d,Ae as f,Ce as i}; diff --git a/src/gateway/static/dashboard/assets/FilterChips-Wo8I8zEd.js b/src/gateway/static/dashboard/assets/FilterChips-Wo8I8zEd.js deleted file mode 100644 index f2b9c2fa..00000000 --- a/src/gateway/static/dashboard/assets/FilterChips-Wo8I8zEd.js +++ /dev/null @@ -1 +0,0 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as y}from"./react-dgEcD0HR.js";import{B as k,S as V,$ as G,h as H,i as J}from"./heroui-BI50yK5B.js";import{R as Q,B as ee,X as te,T as ne,a as re}from"./recharts-C4kRDmvS.js";const P=3600,x=86400,ae=366,pe=[{key:"1h",label:"Last hour",seconds:P,bucket:"hour"},{key:"24h",label:"24h",seconds:x,bucket:"hour"},{key:"7d",label:"7d",seconds:7*x,bucket:"day"},{key:"30d",label:"30d",seconds:30*x,bucket:"day"},{key:"90d",label:"90d",seconds:90*x,bucket:"day"},{key:"12mo",label:"12mo",seconds:ae*x,bucket:"day"}],ve="30d",je=[{key:"1h",label:"1h",seconds:P,bucket:"hour"},{key:"24h",label:"24h",seconds:x,bucket:"hour"},{key:"7d",label:"7d",seconds:7*x,bucket:"day"},{key:"30d",label:"30d",seconds:30*x,bucket:"day"},{key:"all",label:"All",seconds:null,bucket:"day"}],ye="24h",ke="custom";function we(n,r){return n.find(a=>a.key===r)}function Te(n,r=Date.now()){return new Date(r-n*1e3).toISOString()}function se(n){return(n==="hour"?P:x)*1e3}function Ne(n,r,a=Date.now()){const i=new Date(n).getTime();return(r?new Date(r).getTime():a)-i<=x*1e3?"hour":"day"}function ie(n,r,a,i){if(n.length===0)return null;const c=Math.max(0,Math.min(r,a)),l=Math.min(n.length-1,Math.max(r,a)),o=new Date(n[c]).getTime(),m=new Date(n[l]).getTime()+se(i);return{startIso:new Date(o).toISOString(),endIso:new Date(m).toISOString()}}function oe(n,r,a){const i=n.length;if(i===0)return{startIndex:0,endIndex:0};const c=n.map(m=>new Date(m).getTime());let l=0;if(r){const m=new Date(r).getTime();for(let d=0;dt.bucketStart),W=l.map(t=>({x:t.bucketStart,requests:t.requests})),s=l.length,q=le(m,d),$=()=>{if(s===0)return[0,1];const{startIndex:t,endIndex:f}=oe(R,m,d);return[t,f+1]},[N,w]=y.useState($),S=y.useRef(!1);y.useEffect(()=>{S.current||w($())},[m,d,s]);const T=([t,f])=>{if(S.current=!1,s===0)return;const v=Math.max(0,Math.min(s-1,Math.floor(t+1e-6))),h=Math.max(v,Math.min(s-1,Math.ceil(f-1e-6)-1));if(v===0&&h===s-1){c(),w([0,s]);return}const u=ie(R,v,h,o);u&&i(u.startIso,u.endIso)},E=n.findIndex(t=>t.key===r),D=E>=0?n[E+1]:void 0,[g,b]=N,M=g<=.01&&b>=s-.01,I=t=>{const f=Math.max(1,Math.min(s,t)),v=(g+b)/2;let h=v-f/2,u=v+f/2;h<0&&(u-=h,h=0),u>s&&(h-=u-s,u=s);const z=[Math.max(0,h),Math.min(s,u)];w(z),T(z)},X=()=>{if(M){D&&a(D);return}I((b-g)*2)},K=()=>I((b-g)/2),C=y.useRef(null),p=y.useRef(null),Z=t=>{if(!p.current||!C.current)return;const f=C.current.getBoundingClientRect().width;if(f<=0)return;const v=(t.clientX-p.current.x)/f*s,h=p.current.sel[1]-p.current.sel[0],u=Math.max(0,Math.min(s-h,p.current.sel[0]+v));w([u,u+h])},A=s?Math.min(g,b)/s*100:0,U=s?Math.max(g,b)/s*100:100,_=!M;return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[n.map(t=>e.jsx(k,{size:"sm",variant:r===t.key?"primary":"outline",onPress:()=>a(t),children:t.label},t.key)),e.jsxs("div",{className:"ml-auto flex items-center gap-3",children:[e.jsxs("span",{className:"text-xs text-[var(--otari-muted)]",children:["Showing ",q," · UTC"]}),O]})]}),e.jsxs("div",{className:"rounded-xl border border-[var(--otari-line)] bg-[var(--otari-surface)] p-2",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2 px-1 pb-1",children:[e.jsxs("span",{className:"text-[11px] font-medium uppercase tracking-wide text-[var(--otari-muted)]",children:["Requests / ",o==="hour"?"hour":"day"]}),e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx("span",{className:"hidden text-[11px] text-[var(--otari-muted)] sm:inline",children:"drag the edges to zoom · the bottom strip to pan"}),e.jsx(k,{size:"sm",variant:"ghost",isIconOnly:!0,"aria-label":"Zoom in",isDisabled:s===0,onPress:K,children:e.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-4 w-4","aria-hidden":"true",children:e.jsx("path",{d:"M12 5v14M5 12h14",strokeLinecap:"round"})})}),e.jsx(k,{size:"sm",variant:"ghost",isIconOnly:!0,"aria-label":"Zoom out",isDisabled:s===0||M&&!D,onPress:X,children:e.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-4 w-4","aria-hidden":"true",children:e.jsx("path",{d:"M5 12h14",strokeLinecap:"round"})})}),_?e.jsx(k,{size:"sm",variant:"ghost",onPress:()=>T([0,s]),children:"Reset"}):null]})]}),F&&s===0?e.jsx("div",{className:"flex h-[90px] items-center justify-center",children:e.jsx(V,{size:"sm"})}):s===0?e.jsx("div",{className:"flex h-[90px] items-center justify-center text-xs text-[var(--otari-muted)]",children:"No activity in this range."}):e.jsxs("div",{ref:C,className:"relative w-full",children:[e.jsx("div",{role:"img","aria-label":Y,className:"w-full touch-pan-y select-none",children:e.jsx(Q,{width:"100%",height:90,children:e.jsxs(ee,{data:W,margin:{top:4,right:0,left:0,bottom:0},children:[e.jsx(te,{dataKey:"x",tickLine:!1,axisLine:!1,interval:"preserveStartEnd",minTickGap:40,tickFormatter:t=>B(t,o),tick:{fontSize:10,fill:"var(--otari-muted)"}}),e.jsx(ne,{cursor:{fill:"var(--otari-line)",opacity:.35},content:e.jsx(me,{bucket:o})}),e.jsx(re,{dataKey:"requests",fill:ce,radius:[2,2,0,0],isAnimationActive:!1})]})})}),_?e.jsxs(e.Fragment,{children:[e.jsx("div",{"aria-hidden":!0,className:"pointer-events-none absolute inset-y-0 left-0 bg-[var(--otari-bg)] opacity-70",style:{width:`${A}%`}}),e.jsx("div",{"aria-hidden":!0,className:"pointer-events-none absolute inset-y-0 right-0 bg-[var(--otari-bg)] opacity-70",style:{width:`${100-U}%`}})]}):null,e.jsx("div",{"aria-hidden":!0,className:"absolute bottom-0 z-[1] cursor-grab touch-none rounded bg-[var(--otari-brand)]/10 hover:bg-[var(--otari-brand)]/20 active:cursor-grabbing",style:{left:`${A}%`,width:`${Math.max(0,U-A)}%`,height:ue},onPointerDown:t=>{t.stopPropagation(),t.preventDefault(),S.current=!0,p.current={x:t.clientX,sel:[Math.min(g,b),Math.max(g,b)]},t.currentTarget.setPointerCapture(t.pointerId)},onPointerMove:Z,onPointerUp:t=>{t.currentTarget.releasePointerCapture(t.pointerId),p.current=null,T(N)},onPointerCancel:()=>{p.current=null,T(N)}}),e.jsx(G,{"aria-label":"Selected time range",minValue:0,maxValue:s,step:1/de,value:N,onChange:t=>{S.current=!0,Array.isArray(t)&&t.length===2&&w([t[0],t[1]])},onChangeEnd:t=>{Array.isArray(t)&&t.length===2&&T([t[0],t[1]])},className:"pointer-events-none absolute inset-0 z-[2]",children:e.jsxs(H,{className:"pointer-events-none relative h-full w-full",children:[e.jsx(L,{index:0,label:"Window start"}),e.jsx(L,{index:1,label:"Window end"})]})})]})]})]})}function De({chips:n,children:r,onClearAll:a}){const[i,c]=y.useState(!1),l=y.useId();return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(k,{size:"sm",variant:"outline",onPress:()=>c(o=>!o),"aria-expanded":i,"aria-controls":l,children:i?"Done":"Add filter"}),n.map(o=>e.jsxs("span",{className:"inline-flex items-center gap-1 rounded-full border border-[var(--otari-line)] bg-[var(--otari-brand-tint)] py-0.5 pl-2.5 pr-1 text-xs text-[var(--otari-brand-dark)]",children:[e.jsxs("span",{className:"text-[var(--otari-muted)]",children:[o.label,":"]}),e.jsx("span",{className:"font-medium",children:o.value}),e.jsx("button",{type:"button",onClick:o.onClear,"aria-label":`Remove ${o.label} filter`,className:"ml-0.5 inline-flex h-4 w-4 items-center justify-center rounded-full text-[var(--otari-muted)] hover:bg-[var(--otari-line)] hover:text-[var(--otari-ink)]",children:e.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",className:"h-3 w-3","aria-hidden":"true",children:e.jsx("path",{d:"M6 6l12 12M18 6L6 18",strokeLinecap:"round"})})})]},o.key)),n.length>0&&a?e.jsx(k,{size:"sm",variant:"ghost",onPress:a,children:"Clear all"}):null]}),e.jsx("div",{id:l,className:i?"flex flex-wrap items-end gap-3":"hidden",children:r})]})}export{Se as A,ke as C,De as F,ve as U,je as a,ye as b,Ne as c,pe as d,we as f,Te as i}; diff --git a/src/gateway/static/dashboard/assets/KeysPage-bUjPPYgf.js b/src/gateway/static/dashboard/assets/KeysPage-DZwI8ovn.js similarity index 98% rename from src/gateway/static/dashboard/assets/KeysPage-bUjPPYgf.js rename to src/gateway/static/dashboard/assets/KeysPage-DZwI8ovn.js index 8ded46e4..5ad35304 100644 --- a/src/gateway/static/dashboard/assets/KeysPage-bUjPPYgf.js +++ b/src/gateway/static/dashboard/assets/KeysPage-DZwI8ovn.js @@ -1,4 +1,4 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as l}from"./react-dgEcD0HR.js";import{a as Q,r as q,s as X,t as Z,P as ee,E as K,v as te,u as U,I as se}from"./index-CGnfXTEF.js";import{u as ae,r as ne,B as re}from"./tableSelection-9hV37uhu.js";import{C as ie}from"./ConfirmDialog-CWW3AYpK.js";import{D as le}from"./DataTable-Bmn_eYSV.js";import{F as I}from"./Field-Dwp6u3t8.js";import{a as F,M as W}from"./ModelScopeControl-DmfR9Ylv.js";import{C as D,L as oe,I as ce,a as de,b as ue,D as me,f as A,B as p,d as k}from"./heroui-BI50yK5B.js";function xe({value:t,onChange:a,users:n,description:i}){const u=n.filter(r=>!r.user_id.startsWith("apikey-")).map(r=>({id:r.user_id,name:r.alias?`${r.user_id} (${r.alias})`:r.user_id})),[o,c]=l.useState(t),x=o.trim().toLowerCase(),y=u.filter(r=>!x||r.id.toLowerCase().includes(x)||r.name.toLowerCase().includes(x)).slice(0,50),g=r=>{const m=r.trim(),v=u.find(j=>j.id===m||j.name===m);return v?v.id:m},d=g(o),h=u.some(r=>r.id===d),f=d!==""&&!h?e.jsxs("span",{children:["Creates a new user ",e.jsx("code",{children:d}),"."]}):i??"Spend and budgets track against this user.";return e.jsxs(D.Root,{allowsCustomValue:!0,allowsEmptyCollection:!0,menuTrigger:"focus",inputValue:o,onInputChange:r=>{c(r),a(g(r))},onSelectionChange:r=>{if(r!=null){const m=String(r);c(m),a(m)}},className:"flex max-w-md flex-col gap-1",children:[e.jsx(oe,{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Owner"}),e.jsxs(D.InputGroup,{children:[e.jsx(ce,{placeholder:"Pick a user, or type a new id…",autoComplete:"off","data-1p-ignore":!0,"data-lpignore":"true",onFocus:r=>r.currentTarget.select()}),e.jsx(D.Trigger,{})]}),e.jsx(D.Popover,{children:e.jsx(de,{items:y,className:"max-h-72 overflow-auto",children:r=>e.jsx(ue,{id:r.id,textValue:r.name,children:r.name})})}),e.jsx(me,{className:"text-xs text-[var(--otari-muted)]",children:f})]})}function H(t){if(!t)return"—";const a=new Date(t);return Number.isNaN(a.getTime())?"—":a.toLocaleDateString()}function he(t){if(!t)return null;const a=new Date(t).getTime();if(Number.isNaN(a))return null;const n=Math.round((a-Date.now())/1e3),i=Math.abs(n),u=[["day",86400],["hour",3600],["minute",60]],o=new Intl.RelativeTimeFormat(void 0,{numeric:"auto"});for(const[c,x]of u)if(i>=x)return o.format(Math.round(n/x),c);return o.format(n,"second")}function fe(t){if(!t.expires_at)return!1;const a=new Date(t.expires_at).getTime();return!Number.isNaN(a)&&aString(i).padStart(2,"0");return`${a.getFullYear()}-${n(a.getMonth()+1)}-${n(a.getDate())}T${n(a.getHours())}:${n(a.getMinutes())}`}const ge=t=>(t??"").startsWith("apikey-"),M=t=>t.key_name??t.id,ye=t=>t.id;function O({label:t,value:a,multiline:n=!1,fieldRef:i}){const u=l.useRef(null),o=i??u,[c,x]=l.useState(!1),[y,g]=l.useState(!1),d=async()=>{var f,r,m;(f=o.current)==null||f.focus(),(r=o.current)==null||r.select();try{if((m=navigator.clipboard)!=null&&m.writeText){await navigator.clipboard.writeText(a),x(!0),g(!1),window.setTimeout(()=>x(!1),2e3);return}}catch{}g(!0)},h="w-full rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-3 py-2 font-mono text-xs text-[var(--otari-ink)]";return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-xs font-medium text-[var(--otari-muted)]",children:t}),e.jsx(p,{size:"sm",variant:"outline",onPress:d,children:c?"Copied":"Copy"})]}),n?e.jsx("textarea",{ref:o,readOnly:!0,rows:a.split(` +import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as l}from"./react-dgEcD0HR.js";import{a as Q,r as q,s as X,t as Z,P as ee,E as K,v as te,u as U,I as se}from"./index-DHi1jXMu.js";import{u as ae,r as ne,B as re}from"./tableSelection-9hV37uhu.js";import{C as ie}from"./ConfirmDialog-D_mZT4k-.js";import{D as le}from"./DataTable-Bmn_eYSV.js";import{F as I}from"./Field-Dwp6u3t8.js";import{a as F,M as W}from"./ModelScopeControl-DY7OwwJM.js";import{C as D,L as oe,I as ce,a as de,b as ue,D as me,f as A,B as p,d as k}from"./heroui-BI50yK5B.js";function xe({value:t,onChange:a,users:n,description:i}){const u=n.filter(r=>!r.user_id.startsWith("apikey-")).map(r=>({id:r.user_id,name:r.alias?`${r.user_id} (${r.alias})`:r.user_id})),[o,c]=l.useState(t),x=o.trim().toLowerCase(),y=u.filter(r=>!x||r.id.toLowerCase().includes(x)||r.name.toLowerCase().includes(x)).slice(0,50),g=r=>{const m=r.trim(),v=u.find(j=>j.id===m||j.name===m);return v?v.id:m},d=g(o),h=u.some(r=>r.id===d),f=d!==""&&!h?e.jsxs("span",{children:["Creates a new user ",e.jsx("code",{children:d}),"."]}):i??"Spend and budgets track against this user.";return e.jsxs(D.Root,{allowsCustomValue:!0,allowsEmptyCollection:!0,menuTrigger:"focus",inputValue:o,onInputChange:r=>{c(r),a(g(r))},onSelectionChange:r=>{if(r!=null){const m=String(r);c(m),a(m)}},className:"flex max-w-md flex-col gap-1",children:[e.jsx(oe,{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Owner"}),e.jsxs(D.InputGroup,{children:[e.jsx(ce,{placeholder:"Pick a user, or type a new id…",autoComplete:"off","data-1p-ignore":!0,"data-lpignore":"true",onFocus:r=>r.currentTarget.select()}),e.jsx(D.Trigger,{})]}),e.jsx(D.Popover,{children:e.jsx(de,{items:y,className:"max-h-72 overflow-auto",children:r=>e.jsx(ue,{id:r.id,textValue:r.name,children:r.name})})}),e.jsx(me,{className:"text-xs text-[var(--otari-muted)]",children:f})]})}function H(t){if(!t)return"—";const a=new Date(t);return Number.isNaN(a.getTime())?"—":a.toLocaleDateString()}function he(t){if(!t)return null;const a=new Date(t).getTime();if(Number.isNaN(a))return null;const n=Math.round((a-Date.now())/1e3),i=Math.abs(n),u=[["day",86400],["hour",3600],["minute",60]],o=new Intl.RelativeTimeFormat(void 0,{numeric:"auto"});for(const[c,x]of u)if(i>=x)return o.format(Math.round(n/x),c);return o.format(n,"second")}function fe(t){if(!t.expires_at)return!1;const a=new Date(t.expires_at).getTime();return!Number.isNaN(a)&&aString(i).padStart(2,"0");return`${a.getFullYear()}-${n(a.getMonth()+1)}-${n(a.getDate())}T${n(a.getHours())}:${n(a.getMinutes())}`}const ge=t=>(t??"").startsWith("apikey-"),M=t=>t.key_name??t.id,ye=t=>t.id;function O({label:t,value:a,multiline:n=!1,fieldRef:i}){const u=l.useRef(null),o=i??u,[c,x]=l.useState(!1),[y,g]=l.useState(!1),d=async()=>{var f,r,m;(f=o.current)==null||f.focus(),(r=o.current)==null||r.select();try{if((m=navigator.clipboard)!=null&&m.writeText){await navigator.clipboard.writeText(a),x(!0),g(!1),window.setTimeout(()=>x(!1),2e3);return}}catch{}g(!0)},h="w-full rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-3 py-2 font-mono text-xs text-[var(--otari-ink)]";return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-xs font-medium text-[var(--otari-muted)]",children:t}),e.jsx(p,{size:"sm",variant:"outline",onPress:d,children:c?"Copied":"Copy"})]}),n?e.jsx("textarea",{ref:o,readOnly:!0,rows:a.split(` `).length,value:a,onFocus:f=>f.currentTarget.select(),className:`${h} resize-none whitespace-pre`}):e.jsx("input",{ref:o,readOnly:!0,value:a,onFocus:f=>f.currentTarget.select(),className:h}),e.jsx("span",{"aria-live":"polite",className:"text-xs text-green-700",children:c?"Copied to clipboard.":""}),y?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Selected. Press Ctrl/Cmd-C to copy."}):null]})}function je({title:t,result:a,onClose:n}){const i=l.useRef(null),u=l.useRef(null),o=typeof window<"u"?window.location.origin:"",c=a.key;l.useEffect(()=>{var d,h;(d=u.current)==null||d.focus(),(h=u.current)==null||h.select()},[]);const x=d=>{var m;if(d.key!=="Tab")return;const h=(m=i.current)==null?void 0:m.querySelectorAll('button, input, textarea, a[href], [tabindex]:not([tabindex="-1"])');if(!h||h.length===0)return;const f=h[0],r=h[h.length-1];d.shiftKey&&document.activeElement===f?(d.preventDefault(),r.focus()):!d.shiftKey&&document.activeElement===r&&(d.preventDefault(),f.focus())},y=[`curl ${o}/v1/chat/completions \\`,` -H "Otari-Key: ${c}" \\`,' -H "Content-Type: application/json" \\',` -d '{"model": "your-model", "messages": [{"role": "user", "content": "Hello"}]}'`].join(` `),g=["from openai import OpenAI","",`client = OpenAI(base_url="${o}/v1", api_key="${c}")`,"resp = client.chat.completions.create(",' model="your-model",',' messages=[{"role": "user", "content": "Hello"}],',")","print(resp.choices[0].message.content)"].join(` `);return e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/40 p-4",role:"presentation",children:e.jsxs("div",{ref:i,role:"dialog","aria-modal":"true","aria-labelledby":"reveal-title",onKeyDown:x,className:"flex max-h-[90vh] w-full max-w-2xl flex-col gap-4 overflow-y-auto rounded-xl bg-[var(--otari-surface)] p-6 shadow-xl",children:[e.jsx("h2",{id:"reveal-title",className:"text-lg font-semibold text-[var(--otari-ink)]",children:t}),e.jsx(se,{tone:"warning",children:"Copy this key now. For security it is shown only once and cannot be retrieved later. If you lose it, use Regenerate to issue a new secret."}),e.jsxs("p",{className:"text-xs text-[var(--otari-muted)]",children:["Model access: ",F(a.allowed_models).text,"."]}),e.jsx(O,{label:"Secret key",value:c,fieldRef:u}),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Make your first call"}),e.jsxs("p",{className:"text-xs text-[var(--otari-muted)]",children:["Replace ",e.jsx("code",{children:"your-model"})," with a model from the Models page."]})]}),e.jsx(O,{label:"curl",value:y,multiline:!0}),e.jsx(O,{label:"Python (OpenAI SDK)",value:g,multiline:!0})]}),e.jsx("div",{className:"flex justify-end",children:e.jsx(p,{variant:"primary",onPress:n,children:"I’ve saved this key"})})]})})}function V({trigger:t,message:a,confirmLabel:n,isPending:i,onConfirm:u}){const[o,c]=l.useState(!1);return o?e.jsxs("div",{className:"flex flex-col items-end gap-1.5 rounded-lg border border-amber-200 bg-amber-50 p-2 text-right",children:[e.jsx("span",{className:"max-w-xs text-xs text-amber-800",children:a}),e.jsxs("span",{className:"inline-flex gap-1",children:[e.jsx(p,{size:"sm",variant:"danger",isDisabled:i,onPress:u,children:n}),e.jsx(p,{size:"sm",variant:"ghost",isDisabled:i,onPress:()=>c(!1),children:"Cancel"})]})]}):e.jsx(p,{size:"sm",variant:"danger-soft",onPress:()=>c(!0),children:t})}function G({userId:t,users:a}){const n=t.trim();if(n==="")return e.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:"Choose an owner above to see the models this key can inherit."});const i=a.find(c=>c.user_id===n);if(!i)return e.jsxs("p",{className:"text-xs text-[var(--otari-muted)]",children:["New user ",e.jsx("code",{children:n})," starts unrestricted, so this key may allow any model."]});const{text:u}=F(i.allowed_models),o=i.allowed_models&&i.allowed_models.length>0?i.allowed_models.join(", "):null;return e.jsxs("p",{className:"text-xs text-[var(--otari-muted)]",children:["Owner ",e.jsx("code",{children:n})," allows ",e.jsx("span",{className:"font-medium text-[var(--otari-ink)]",children:u.toLowerCase()}),o?e.jsxs(e.Fragment,{children:[" (",e.jsx("span",{className:"font-mono",children:o}),")"]}):null,". This key inherits that, or narrows within it."]})}function Y({checked:t,onChange:a}){return e.jsxs("label",{className:"flex items-start gap-2 rounded-lg border border-[var(--otari-line)] p-3 text-sm",children:[e.jsx("input",{type:"checkbox",checked:t,onChange:n=>a(n.target.checked),className:"mt-0.5 h-4 w-4 accent-[var(--otari-brand)]","aria-label":"Exempt this key from budget"}),e.jsxs("span",{className:"flex flex-col gap-0.5",children:[e.jsx("span",{className:"font-medium text-[var(--otari-ink)]",children:"Exempt from budget"}),e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Requests on this key are logged with their cost but never counted toward the owner's budget or spend, and never blocked by it."})]})]})}function ve({onClose:t,onCreated:a}){const n=te(),i=U(),[u,o]=l.useState(""),[c,x]=l.useState(""),[y,g]=l.useState(!1),[d,h]=l.useState(""),[f,r]=l.useState(null),[m,v]=l.useState(!1),[j,T]=l.useState(!0),_=c!==""&&new Date(c).getTime(){if(n.isPending||!j||N)return;const b={key_name:u.trim()||null,user_id:d.trim(),expires_at:c?new Date(c).toISOString():null,allowed_models:f,exclude_from_budget:m};n.mutate(b,{onSuccess:w=>{a(w),t()}})};return e.jsx(k,{children:e.jsxs(k.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsx("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Create API key"}),e.jsx(K,{error:n.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(I,{label:"Name",value:u,onChange:o,placeholder:"ci-bot",autoFocus:!0,description:"A label to recognize this key later."}),e.jsx(I,{label:"Expires (optional)",value:c,onChange:x,type:"datetime-local",description:_?e.jsx("span",{className:"text-red-700",children:"That time is in the past; the key would be rejected immediately."}):"Leave blank for a key that never expires."})]}),e.jsx(xe,{value:d,onChange:h,users:i.data??[]}),e.jsx("button",{type:"button",className:"self-start text-xs font-medium text-[var(--otari-brand-dark)]",onClick:()=>g(b=>!b),children:y?"Hide advanced":"Advanced"}),y?e.jsxs("div",{className:"flex flex-col gap-4 rounded-lg border border-[var(--otari-line)] p-4",children:[e.jsx(G,{userId:d,users:i.data??[]}),e.jsx(W,{title:"Restrict this key's models",description:"By default this key inherits its owner's access. Optionally narrow it to a subset; a key can never exceed its owner's allowed models.",anyLabel:"Inherit owner access",initial:null,onChange:(b,w)=>{r(b),T(w)}}),e.jsx(Y,{checked:m,onChange:v})]}):null,e.jsxs("div",{className:"flex gap-2",children:[e.jsx(p,{variant:"primary",isDisabled:n.isPending||!j||N,onPress:S,children:n.isPending?"Creating…":"Create key"}),e.jsx(p,{variant:"ghost",onPress:t,children:"Cancel"})]})]})})}function be({apiKey:t,onClose:a}){const n=q(),i=U(),[u,o]=l.useState(t.key_name??""),[c,x]=l.useState(pe(t.expires_at)),[y,g]=l.useState(t.allowed_models),[d,h]=l.useState(t.exclude_from_budget),[f,r]=l.useState(!0),m=()=>{n.isPending||!f||n.mutate({id:t.id,body:{key_name:u.trim()||null,expires_at:c?new Date(c).toISOString():null,allowed_models:y,exclude_from_budget:d}},{onSuccess:a})};return e.jsx(k,{children:e.jsxs(k.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsxs("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:["Edit ",e.jsx("code",{children:t.key_name??t.id})]}),e.jsx(K,{error:n.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(I,{label:"Name",value:u,onChange:o,placeholder:"ci-bot"}),e.jsx(I,{label:"Expires",value:c,onChange:x,type:"datetime-local",description:"Blank clears the expiry."})]}),t.user_id?e.jsx(G,{userId:t.user_id,users:i.data??[]}):null,e.jsx(W,{title:"Restrict this key's models",description:"This key inherits its owner's access by default. Narrow it to a subset here; it can never exceed the owner's allowed models.",anyLabel:"Inherit owner access",initial:t.allowed_models,onChange:(v,j)=>{g(v),r(j)}}),e.jsx(Y,{checked:d,onChange:h}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(p,{variant:"primary",isDisabled:n.isPending||!f,onPress:m,children:n.isPending?"Saving…":"Save changes"}),e.jsx(p,{variant:"ghost",onPress:a,children:"Cancel"})]})]})})}function we({apiKey:t}){return t.is_active?fe(t)?e.jsx(A,{size:"sm",color:"warning",children:"Expired"}):e.jsx(A,{size:"sm",color:"accent",children:"Active"}):e.jsx(A,{size:"sm",color:"default",children:"Disabled"})}function Ne({allowed:t}){const{text:a,tone:n}=F(t),i=n==="danger"?"text-red-700 font-medium":n==="muted"?"text-[var(--otari-muted)]":"text-[var(--otari-brand-dark)] font-medium",u=t&&t.length>0?t.join(", "):void 0;return e.jsx("span",{className:`text-xs ${i}`,title:u,children:a})}function ke({onCreate:t}){return e.jsx(k,{children:e.jsxs(k.Content,{className:"flex flex-col gap-4 p-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:"No API keys yet"}),e.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:"An API key authenticates callers to this gateway. Create one to make your first request; the secret is shown once, so keep it somewhere safe."})]}),e.jsx("div",{children:e.jsx(p,{variant:"primary",onPress:t,children:"Create your first key"})})]})})}function Re(){const t=Q(),a=q(),n=X(),i=Z(),[u,o]=l.useState(!1),[c,x]=l.useState(null),[y,g]=l.useState(null),d=t.data??[],h=t.isLoading,f=d.find(s=>s.id===c)??null,r=!h&&d.length===0&&!u,m=ae(),[v,j]=l.useState(!1),[T,_]=l.useState(void 0),[N,S]=l.useState(!1),b=d.map(s=>s.id),w=ne(m.selectedKeys,b),E=d.filter(s=>w.includes(s.id)),$=l.useCallback((s,C)=>a.mutate({id:s.id,body:{is_active:C}}),[a.mutate]),z=l.useCallback(s=>n.mutate(s.id,{onSuccess:C=>g({title:`New secret for ${M(s)}`,result:C})}),[n.mutate]),R=async(s,C,B)=>{S(!0),_(void 0);try{for(const L of s)await C(L);m.clear(),B==null||B()}catch(L){_(L)}finally{S(!1)}},J=l.useMemo(()=>[{id:"name",header:"Name",isRowHeader:!0,cell:s=>e.jsxs("div",{className:"flex flex-col gap-0.5",children:[e.jsx("span",{className:"font-medium text-[var(--otari-ink)]",children:s.key_name??e.jsx("span",{className:"text-[var(--otari-muted)]",children:"(unnamed)"})}),e.jsxs("div",{className:"flex flex-wrap items-center gap-1",children:[e.jsx(Ne,{allowed:s.allowed_models}),s.exclude_from_budget?e.jsx("span",{className:"inline-flex items-center rounded-full border border-[var(--otari-line)] bg-[var(--otari-brand-tint)] px-2 py-0.5 text-xs font-medium text-[var(--otari-brand-dark)]",title:"Requests on this key are logged with cost but never counted toward budget",children:"Budget-exempt"}):null]})]})},{id:"status",header:"Status",cell:s=>e.jsx(we,{apiKey:s})},{id:"owner",header:"Owner",cell:s=>ge(s.user_id)?e.jsx(A,{size:"sm",color:"default",children:"virtual"}):e.jsx("code",{className:"text-xs text-[var(--otari-muted)]",children:s.user_id??"—"})},{id:"key",header:"Key",cell:s=>e.jsx("code",{className:"text-xs text-[var(--otari-muted)]",children:s.key_prefix?`${s.key_prefix}…`:"—"})},{id:"created",header:"Created",cell:s=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:H(s.created_at)})},{id:"last_used",header:"Last used",cell:s=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:he(s.last_used_at)??"never"})},{id:"expires",header:"Expires",cell:s=>e.jsx("span",{className:"text-[var(--otari-muted)]",title:s.expires_at?new Date(s.expires_at).toLocaleString():void 0,children:s.expires_at?H(s.expires_at):"never"})},{id:"actions",header:"Actions",align:"end",cell:s=>e.jsxs("div",{className:"flex items-center justify-end gap-1.5",children:[e.jsx(p,{size:"sm",variant:"outline",isDisabled:a.isPending,onPress:()=>$(s,!s.is_active),children:s.is_active?"Disable":"Enable"}),e.jsx(p,{size:"sm",variant:"ghost",onPress:()=>{o(!1),x(s.id)},children:"Edit"}),e.jsx(V,{trigger:"Regenerate",confirmLabel:"Regenerate",isPending:n.isPending,message:e.jsxs(e.Fragment,{children:["Regenerate the secret for ",e.jsx("strong",{children:M(s)}),"? The current secret stops working immediately, with no grace period."]}),onConfirm:()=>z(s)}),s.is_active?null:e.jsx(V,{trigger:"Delete",confirmLabel:"Delete permanently",isPending:i.isPending,message:e.jsxs(e.Fragment,{children:["Permanently delete ",e.jsx("strong",{children:M(s)}),"? This removes the key and unlinks its usage history. Cannot be undone."]}),onConfirm:()=>i.mutate(s.id)})]})}],[a.isPending,n.isPending,i.isPending,i.mutate,$,z]),P=E.filter(s=>!s.is_active);return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(ee,{title:"API keys",description:"Issue and revoke the keys that authenticate callers to this gateway. Secrets are shown once at creation.",action:u?null:e.jsx(p,{variant:"primary",onPress:()=>{x(null),o(!0)},children:"Create key"})}),e.jsx(K,{error:t.error??a.error??n.error??i.error}),r?e.jsx(ke,{onCreate:()=>{x(null),o(!0)}}):null,u?e.jsx(ve,{onClose:()=>o(!1),onCreated:s=>g({title:"API key created",result:s})}):null,f?e.jsx(be,{apiKey:f,onClose:()=>x(null)},f.id):null,w.length>0?e.jsxs(re,{selectedCount:w.length,allMatching:!1,matchingTotal:null,canSelectAllMatching:!1,onSelectAllMatching:()=>{},onClear:m.clear,children:[e.jsx(p,{size:"sm",variant:"outline",isDisabled:N,onPress:()=>void R(E,s=>a.mutateAsync({id:s.id,body:{is_active:!1}})),children:"Disable"}),e.jsx(p,{size:"sm",variant:"outline",isDisabled:N,onPress:()=>void R(E,s=>a.mutateAsync({id:s.id,body:{exclude_from_budget:!0}})),children:"Budget-exempt"}),e.jsx(p,{size:"sm",variant:"danger",isDisabled:P.length===0,onPress:()=>j(!0),children:"Delete"})]}):null,e.jsx(le,{ariaLabel:"API keys",columns:J,rows:d,getRowKey:ye,isLoading:h,emptyContent:"No API keys yet. Create one to authenticate a caller.",selectionMode:"multiple",selectedKeys:m.selectedKeys,onSelectionChange:m.onSelectionChange}),e.jsx(ie,{isOpen:v,onOpenChange:j,heading:"Delete API keys",body:`Permanently delete ${P.length} disabled ${P.length===1?"key":"keys"}? This removes them and unlinks their usage history. Cannot be undone. Active keys in the selection are skipped; disable them first.`,confirmLabel:"Delete permanently",isPending:N,error:T,onConfirm:()=>void R(P,s=>i.mutateAsync(s.id),()=>j(!1))}),y?e.jsx(je,{title:y.title,result:y.result,onClose:()=>{g(null),n.reset()}}):null]})}export{Re as KeysPage}; diff --git a/src/gateway/static/dashboard/assets/ModelScopeControl-DmfR9Ylv.js b/src/gateway/static/dashboard/assets/ModelScopeControl-DY7OwwJM.js similarity index 98% rename from src/gateway/static/dashboard/assets/ModelScopeControl-DmfR9Ylv.js rename to src/gateway/static/dashboard/assets/ModelScopeControl-DY7OwwJM.js index 0f571aa3..6c7f31bd 100644 --- a/src/gateway/static/dashboard/assets/ModelScopeControl-DmfR9Ylv.js +++ b/src/gateway/static/dashboard/assets/ModelScopeControl-DY7OwwJM.js @@ -1 +1 @@ -import{j as t}from"./tanstack-query-1t81HyiD.js";import{r as n}from"./react-dgEcD0HR.js";import{K as A,h as $,i as P}from"./index-CGnfXTEF.js";import{C as d,I as R,a as T,b as V}from"./heroui-BI50yK5B.js";function q(r){return r===null?"any":r.length===0?"block":"only"}const K=50;function W({initial:r,onChange:m,title:N="Model access",description:w,anyLabel:C="Any model"}){const x=A(),u=$(),v=P(),[i,S]=n.useState(q(r)),[a,g]=n.useState(r??[]),[p,y]=n.useState(""),f=n.useMemo(()=>{var j,k;const e=new Set,s=[],l=(o,c)=>{o&&!e.has(o)&&(e.add(o),s.push({id:o,label:c}))};for(const o of((j=x.data)==null?void 0:j.providers)??[])l(`${o.instance}:*`,`${o.instance}:* · all ${o.instance} models`);for(const o of((k=u.data)==null?void 0:k.providers)??[])for(const c of o.models)l(c.key,c.key);for(const o of v.data??[])l(o.target,`${o.name} · alias`);return s},[x.data,u.data,v.data]),L=n.useMemo(()=>{const e=p.trim().toLowerCase();return f.filter(s=>!a.includes(s.id)).filter(s=>!e||s.id.toLowerCase().includes(e)||s.label.toLowerCase().includes(e)).slice(0,K)},[f,a,p]),h=(e,s)=>{e==="any"?m(null,!0):e==="block"?m([],!0):m(s,s.length>0)},B=e=>{S(e),h(e,a)},M=e=>{const s=a.includes(e)?a:[...a,e];g(s),y(""),h("only",s)},E=e=>{const s=a.filter(l=>l!==e);g(s),h("only",s)},b=(e,s)=>t.jsx("button",{type:"button","aria-pressed":i===e,onClick:()=>B(e),className:i===e?"rounded-md bg-white px-3 py-1.5 text-sm font-medium text-[var(--otari-ink)] shadow-sm":"rounded-md px-3 py-1.5 text-sm text-[var(--otari-muted)] hover:text-[var(--otari-ink)]",children:s}),I=!u.isLoading&&!x.isLoading&&f.length===0;return t.jsxs("div",{className:"flex flex-col gap-3",children:[t.jsxs("div",{children:[t.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:N}),t.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:w??"Which models this key may list and call. The master key is never restricted, so blocking a key cannot lock you out of the dashboard."})]}),t.jsxs("div",{className:"flex w-fit items-center gap-1 rounded-lg bg-[var(--otari-bg)] p-1",children:[b("any",C),b("only","Only selected"),b("block","Block all")]}),i==="block"?t.jsxs("div",{className:"rounded-lg border border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-800",children:["Blocked from ",t.jsx("strong",{children:"every"})," model until you change this access."]}):null,i==="only"?t.jsxs("div",{className:"flex flex-col gap-2",children:[t.jsx("div",{className:"flex flex-wrap gap-1.5",children:a.length===0?t.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Pick at least one model below, or choose “Block all”."}):a.map(e=>t.jsxs("span",{className:"inline-flex items-center gap-1 rounded-full bg-[var(--otari-brand-tint)] px-2.5 py-1 font-mono text-xs text-[var(--otari-brand-dark)]",children:[e,t.jsx("button",{type:"button","aria-label":`Remove ${e}`,onClick:()=>E(e),className:"text-[var(--otari-brand-dark)] hover:text-red-700",children:"×"})]},e))}),I?t.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"No providers or models discovered yet. Configure a provider first, then scope this key."}):t.jsxs(d.Root,{allowsEmptyCollection:!0,menuTrigger:"input",inputValue:p,onInputChange:y,selectedKey:null,onSelectionChange:e=>{e!=null&&M(String(e))},className:"flex max-w-md flex-col gap-1",children:[t.jsxs(d.InputGroup,{children:[t.jsx(R,{"aria-label":"Add a model",placeholder:"Search providers, models, aliases…",autoComplete:"off"}),t.jsx(d.Trigger,{})]}),t.jsx(d.Popover,{children:t.jsx(T,{items:L,className:"max-h-72 overflow-auto",children:e=>t.jsx(V,{id:e.id,textValue:e.label,children:e.label})})})]})]}):null]})}function X(r){return r===null?{text:"All models",tone:"muted"}:r.length===0?{text:"No models",tone:"danger"}:{text:"Selected models",tone:"normal"}}export{W as M,X as a}; +import{j as t}from"./tanstack-query-1t81HyiD.js";import{r as n}from"./react-dgEcD0HR.js";import{K as A,h as $,i as P}from"./index-DHi1jXMu.js";import{C as d,I as R,a as T,b as V}from"./heroui-BI50yK5B.js";function q(r){return r===null?"any":r.length===0?"block":"only"}const K=50;function W({initial:r,onChange:m,title:N="Model access",description:w,anyLabel:C="Any model"}){const x=A(),u=$(),v=P(),[i,S]=n.useState(q(r)),[a,g]=n.useState(r??[]),[p,y]=n.useState(""),f=n.useMemo(()=>{var j,k;const e=new Set,s=[],l=(o,c)=>{o&&!e.has(o)&&(e.add(o),s.push({id:o,label:c}))};for(const o of((j=x.data)==null?void 0:j.providers)??[])l(`${o.instance}:*`,`${o.instance}:* · all ${o.instance} models`);for(const o of((k=u.data)==null?void 0:k.providers)??[])for(const c of o.models)l(c.key,c.key);for(const o of v.data??[])l(o.target,`${o.name} · alias`);return s},[x.data,u.data,v.data]),L=n.useMemo(()=>{const e=p.trim().toLowerCase();return f.filter(s=>!a.includes(s.id)).filter(s=>!e||s.id.toLowerCase().includes(e)||s.label.toLowerCase().includes(e)).slice(0,K)},[f,a,p]),h=(e,s)=>{e==="any"?m(null,!0):e==="block"?m([],!0):m(s,s.length>0)},B=e=>{S(e),h(e,a)},M=e=>{const s=a.includes(e)?a:[...a,e];g(s),y(""),h("only",s)},E=e=>{const s=a.filter(l=>l!==e);g(s),h("only",s)},b=(e,s)=>t.jsx("button",{type:"button","aria-pressed":i===e,onClick:()=>B(e),className:i===e?"rounded-md bg-white px-3 py-1.5 text-sm font-medium text-[var(--otari-ink)] shadow-sm":"rounded-md px-3 py-1.5 text-sm text-[var(--otari-muted)] hover:text-[var(--otari-ink)]",children:s}),I=!u.isLoading&&!x.isLoading&&f.length===0;return t.jsxs("div",{className:"flex flex-col gap-3",children:[t.jsxs("div",{children:[t.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:N}),t.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:w??"Which models this key may list and call. The master key is never restricted, so blocking a key cannot lock you out of the dashboard."})]}),t.jsxs("div",{className:"flex w-fit items-center gap-1 rounded-lg bg-[var(--otari-bg)] p-1",children:[b("any",C),b("only","Only selected"),b("block","Block all")]}),i==="block"?t.jsxs("div",{className:"rounded-lg border border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-800",children:["Blocked from ",t.jsx("strong",{children:"every"})," model until you change this access."]}):null,i==="only"?t.jsxs("div",{className:"flex flex-col gap-2",children:[t.jsx("div",{className:"flex flex-wrap gap-1.5",children:a.length===0?t.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Pick at least one model below, or choose “Block all”."}):a.map(e=>t.jsxs("span",{className:"inline-flex items-center gap-1 rounded-full bg-[var(--otari-brand-tint)] px-2.5 py-1 font-mono text-xs text-[var(--otari-brand-dark)]",children:[e,t.jsx("button",{type:"button","aria-label":`Remove ${e}`,onClick:()=>E(e),className:"text-[var(--otari-brand-dark)] hover:text-red-700",children:"×"})]},e))}),I?t.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"No providers or models discovered yet. Configure a provider first, then scope this key."}):t.jsxs(d.Root,{allowsEmptyCollection:!0,menuTrigger:"input",inputValue:p,onInputChange:y,selectedKey:null,onSelectionChange:e=>{e!=null&&M(String(e))},className:"flex max-w-md flex-col gap-1",children:[t.jsxs(d.InputGroup,{children:[t.jsx(R,{"aria-label":"Add a model",placeholder:"Search providers, models, aliases…",autoComplete:"off"}),t.jsx(d.Trigger,{})]}),t.jsx(d.Popover,{children:t.jsx(T,{items:L,className:"max-h-72 overflow-auto",children:e=>t.jsx(V,{id:e.id,textValue:e.label,children:e.label})})})]})]}):null]})}function X(r){return r===null?{text:"All models",tone:"muted"}:r.length===0?{text:"No models",tone:"danger"}:{text:"Selected models",tone:"normal"}}export{W as M,X as a}; diff --git a/src/gateway/static/dashboard/assets/ModelsPage-BMtuCmJv.js b/src/gateway/static/dashboard/assets/ModelsPage-CAoQKgS_.js similarity index 99% rename from src/gateway/static/dashboard/assets/ModelsPage-BMtuCmJv.js rename to src/gateway/static/dashboard/assets/ModelsPage-CAoQKgS_.js index 08dc0b09..4b93461b 100644 --- a/src/gateway/static/dashboard/assets/ModelsPage-BMtuCmJv.js +++ b/src/gateway/static/dashboard/assets/ModelsPage-CAoQKgS_.js @@ -1 +1 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{i as gt,u as vt,r as c}from"./react-dgEcD0HR.js";import{w as _t,x as bt,h as jt,y as yt,z as je,P as Pt,E as Nt,F as B,I as St,A as ae,B as Re,C as ze,D as be,G as Ct,H as kt,J as E}from"./index-CGnfXTEF.js";import{u as Mt,r as Wt,B as It}from"./tableSelection-9hV37uhu.js";import{D as Tt}from"./DataTable-Bmn_eYSV.js";import{T as Lt,S as At}from"./TablePagination-r1AimUKf.js";import{B as A,d as se,f as V}from"./heroui-BI50yK5B.js";function Oe(t){const i=t.indexOf(":");return i>0?t.slice(0,i):"—"}function $t(t,i=Date.now()){const r=new Map;for(const n of t){const a=r.get(n.model_key)??[];a.push(n),r.set(n.model_key,a)}const s=[];for(const n of r.values()){const a=[...n].sort((p,u)=>Date.parse(p.effective_at)-Date.parse(u.effective_at)),f=[...a].reverse().find(p=>Date.parse(p.effective_at)<=i);s.push(f??a[0])}return s.sort((n,a)=>n.model_key.localeCompare(a.model_key))}const Et="otari",De=[{value:"vision",label:"Vision",test:t=>Array.isArray(t.input_modalities)&&t.input_modalities.includes("image")},{value:"tool_call",label:"Tool calling",test:t=>!!t.tool_call},{value:"reasoning",label:"Reasoning",test:t=>!!t.reasoning},{value:"structured_output",label:"Structured output",test:t=>!!t.structured_output},{value:"attachment",label:"Attachments",test:t=>!!t.attachment},{value:"audio",label:"Audio",test:t=>Array.isArray(t.input_modalities)&&t.input_modalities.includes("audio")},{value:"pdf",label:"PDF",test:t=>Array.isArray(t.input_modalities)&&t.input_modalities.includes("pdf")}],Ot=[{key:"reasoning",label:"Reasoning"},{key:"tool_call",label:"Tool calling"},{key:"structured_output",label:"Structured output"},{key:"attachment",label:"Attachments"},{key:"temperature",label:"Temperature"}],Fe={text:"Text",image:"Image",audio:"Audio",video:"Video",pdf:"PDF"},Dt=[{value:"0",label:"Any context"},{value:"8000",label:"≥ 8K"},{value:"32000",label:"≥ 32K"},{value:"128000",label:"≥ 128K"},{value:"200000",label:"≥ 200K"},{value:"1000000",label:"≥ 1M"}],Ft=[{value:"",label:"Any price"},{value:"1",label:"≤ $1 / 1M in"},{value:"3",label:"≤ $3 / 1M in"},{value:"10",label:"≤ $10 / 1M in"},{value:"30",label:"≤ $30 / 1M in"}],Bt=[{value:"",label:"Base prices"},{value:"8000",label:"Compare at 8K"},{value:"128000",label:"Compare at 128K"},{value:"200000",label:"Compare at 200K"},{value:"500000",label:"Compare at 500K"},{value:"1000000",label:"Compare at 1M"}],Kt=[{value:"all",label:"Any release date"},{value:"365",label:"Past year"},{value:"730",label:"Past 2 years"},{value:"1095",label:"Past 3 years"}],Rt=1440*60*1e3,zt=t=>t.key;function Be(t,i){const r=`${i}:`;return t.startsWith(r)?t.slice(r.length):t}function Ke(t,i){const r={inputPrice:t.inputPrice,outputPrice:t.outputPrice,cacheReadPrice:t.cacheReadPrice,cacheWritePrice:t.cacheWritePrice,cacheWrite1hPrice:t.cacheWrite1hPrice};if(i==null)return r;const s=t.pricingTiers.filter(n=>n.min_input_tokens<=i).sort((n,a)=>a.min_input_tokens-n.min_input_tokens)[0];return s?{inputPrice:s.input_price_per_million??r.inputPrice,outputPrice:s.output_price_per_million??r.outputPrice,cacheReadPrice:s.cache_read_price_per_million??r.cacheReadPrice,cacheWritePrice:s.cache_write_price_per_million??r.cacheWritePrice,cacheWrite1hPrice:s.cache_write_1h_price_per_million??r.cacheWrite1hPrice}:r}function ce(t){const i=Number(t);return t.trim()!==""&&Number.isFinite(i)&&i>=0}function w(t){if(t.trim()==="")return!0;const i=Number(t);return Number.isFinite(i)&&i>=0}function Y(t){return t.trim()===""?null:Number(t)}function we(t){return t.map((i,r)=>({id:r,minInputTokens:String(i.min_input_tokens),input:i.input_price_per_million==null?"":String(i.input_price_per_million),output:i.output_price_per_million==null?"":String(i.output_price_per_million),cacheRead:i.cache_read_price_per_million==null?"":String(i.cache_read_price_per_million),cacheWrite:i.cache_write_price_per_million==null?"":String(i.cache_write_price_per_million),cacheWrite1h:i.cache_write_1h_price_per_million==null?"":String(i.cache_write_1h_price_per_million)}))}function Ve(t){const i=new Set;return t.every(r=>{const s=Number(r.minInputTokens),n=[r.input,r.output,r.cacheRead,r.cacheWrite,r.cacheWrite1h].some(a=>a.trim()!=="");return!Number.isInteger(s)||s<=0||i.has(s)||!n?!1:(i.add(s),[r.input,r.output,r.cacheRead,r.cacheWrite,r.cacheWrite1h].every(w))})}function Ye(t){return t.map(i=>({min_input_tokens:Number(i.minInputTokens),...i.input.trim()===""?{}:{input_price_per_million:Number(i.input)},...i.output.trim()===""?{}:{output_price_per_million:Number(i.output)},...i.cacheRead.trim()===""?{}:{cache_read_price_per_million:Number(i.cacheRead)},...i.cacheWrite.trim()===""?{}:{cache_write_price_per_million:Number(i.cacheWrite)},...i.cacheWrite1h.trim()===""?{}:{cache_write_1h_price_per_million:Number(i.cacheWrite1h)}}))}function b({value:t,onChange:i,ariaLabel:r}){return e.jsx("input",{type:"number",step:"any",min:"0",inputMode:"decimal","aria-label":r,value:t,onChange:s=>i(s.target.value),className:"w-28 rounded-md border border-[var(--otari-line)] bg-white px-2 py-1 text-right text-sm tabular-nums focus:border-[var(--otari-brand)] focus:outline-none"})}function He({tiers:t,onChange:i}){const r=(n,a,f)=>{i(t.map(p=>p.id===n?{...p,[a]:f}:p))},s=()=>{const n=t.reduce((a,f)=>Math.max(a,f.id),-1)+1;i([...t,{id:n,minInputTokens:"128000",input:"",output:"",cacheRead:"",cacheWrite:"",cacheWrite1h:""}])};return e.jsxs("div",{className:"flex flex-col gap-2 rounded-lg border border-[var(--otari-line)] p-3",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-medium text-[var(--otari-ink)]",children:"Long-context price tiers"}),e.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:"At a threshold, listed rates replace the base rate for the whole request."})]}),e.jsx(A,{size:"sm",variant:"outline",onPress:s,children:"Add tier"})]}),t.map(n=>e.jsxs("div",{className:"flex flex-wrap items-end gap-2 border-t border-[var(--otari-line)] pt-2",children:[e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Context ≥ tokens",e.jsx("input",{type:"number",min:"1",step:"1",inputMode:"numeric","aria-label":"Tier context threshold",value:n.minInputTokens,onChange:a=>r(n.id,"minInputTokens",a.target.value),className:"w-28 rounded-md border border-[var(--otari-line)] bg-white px-2 py-1 text-right text-sm tabular-nums focus:border-[var(--otari-brand)] focus:outline-none"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Input",e.jsx(b,{value:n.input,onChange:a=>r(n.id,"input",a),ariaLabel:"Tier input price"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Output",e.jsx(b,{value:n.output,onChange:a=>r(n.id,"output",a),ariaLabel:"Tier output price"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Cache read",e.jsx(b,{value:n.cacheRead,onChange:a=>r(n.id,"cacheRead",a),ariaLabel:"Tier cache read price"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Cache write",e.jsx(b,{value:n.cacheWrite,onChange:a=>r(n.id,"cacheWrite",a),ariaLabel:"Tier cache write price"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["1h write",e.jsx(b,{value:n.cacheWrite1h,onChange:a=>r(n.id,"cacheWrite1h",a),ariaLabel:"Tier 1 hour cache write price"})]}),e.jsx(A,{size:"sm",variant:"ghost",onPress:()=>i(t.filter(a=>a.id!==n.id)),children:"Remove"})]},n.id))]})}function wt({source:t}){return t==="configured"?e.jsx(V,{size:"sm",color:"default",children:"configured"}):t==="default"||t==="alias"?e.jsx(V,{size:"sm",color:"accent",children:t}):e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"not priced"})}function oe({label:t,tone:i="info",children:r}){const s=c.useId();return e.jsxs("span",{className:"group relative inline-flex items-center font-normal normal-case",children:[e.jsx("button",{type:"button","aria-label":t,"aria-describedby":s,className:`inline-flex h-4 w-4 items-center justify-center rounded-full border text-[10px] leading-none ${i==="warning"?"border-[#c2843a] text-[#b45309]":"border-[var(--otari-line)] text-[var(--otari-muted)] hover:border-[var(--otari-brand)] hover:text-[var(--otari-brand)]"}`,children:"i"}),e.jsx("span",{id:s,role:"tooltip",className:"pointer-events-none absolute top-full right-0 z-20 mt-1.5 w-72 rounded-lg border border-[var(--otari-line)] bg-[var(--otari-surface)] px-3 py-2 text-left text-xs font-normal whitespace-normal break-words text-[var(--otari-ink)] opacity-0 shadow-lg transition-opacity group-hover:opacity-100 group-focus-within:opacity-100",children:r})]})}function Vt(){const t=kt();return t.data?t.data.default_pricing?e.jsx(oe,{label:"How unpriced models are metered",tone:"info",children:"Default pricing is on: models without a configured price are metered using community-maintained rates (the bundled genai-prices dataset). Set a price to override the fallback."}):e.jsxs(oe,{label:"How unpriced models are metered",tone:"warning",children:["Default pricing is off: only models with a configured price are metered.",t.data.require_pricing?" Requests for any other model are rejected (HTTP 402) because require_pricing is on.":" Other models are served without cost tracking."]}):null}function I({label:t,value:i}){return e.jsxs("div",{className:"flex items-baseline justify-between gap-3",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:t}),e.jsx("span",{className:"text-right text-sm text-[var(--otari-ink)] tabular-nums",children:i})]})}function le({title:t,children:i}){return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("span",{className:"text-xs font-semibold uppercase tracking-wide text-[var(--otari-muted)]",children:t}),i]})}function Yt({row:t}){const i=je(),r=Re(),[s,n]=c.useState(!1),[a,f]=c.useState(""),[p,u]=c.useState(""),[P,j]=c.useState(""),[k,T]=c.useState(""),[y,h]=c.useState(""),[N,O]=c.useState([]),S=()=>{f(t.inputPrice==null?"":String(t.inputPrice)),u(t.outputPrice==null?"":String(t.outputPrice)),j(t.cacheReadPrice==null?"":String(t.cacheReadPrice)),T(t.cacheWritePrice==null?"":String(t.cacheWritePrice)),h(t.cacheWrite1hPrice==null?"":String(t.cacheWrite1hPrice)),O(we(t.pricingTiers)),n(!0)},Z=ce(a)&&ce(p)&&w(P)&&w(k)&&w(y)&&Ve(N),W=()=>{Z&&i.mutate({model_key:t.key,input_price_per_million:Number(a),output_price_per_million:Number(p),cache_read_price_per_million:Y(P),cache_write_price_per_million:Y(k),cache_write_1h_price_per_million:Y(y),pricing_tiers:Ye(N)},{onSuccess:()=>n(!1)})};return s?e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Input $ / 1M"}),e.jsx(b,{value:a,onChange:f,ariaLabel:`Input price for ${t.key}`})]}),e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Output $ / 1M"}),e.jsx(b,{value:p,onChange:u,ariaLabel:`Output price for ${t.key}`})]}),e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Cache read $ / 1M"}),e.jsx(b,{value:P,onChange:j,ariaLabel:`Cache read price for ${t.key}`})]}),e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Cache write $ / 1M"}),e.jsx(b,{value:k,onChange:T,ariaLabel:`Cache write price for ${t.key}`})]}),e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"1h cache write $ / 1M"}),e.jsx(b,{value:y,onChange:h,ariaLabel:`1 hour cache write price for ${t.key}`})]}),e.jsx(He,{tiers:N,onChange:O}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(A,{size:"sm",variant:"primary",isDisabled:i.isPending||!Z,onPress:W,children:"Save"}),e.jsx(A,{size:"sm",variant:"ghost",isDisabled:i.isPending,onPress:()=>n(!1),children:"Cancel"})]}),i.error?e.jsx("span",{className:"text-xs text-red-700",children:be(i.error)}):null]}):e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(I,{label:"Input",value:t.inputPrice==null?"—":`${E(t.inputPrice)} / 1M`}),e.jsx(I,{label:"Output",value:t.outputPrice==null?"—":`${E(t.outputPrice)} / 1M`}),e.jsx(I,{label:"Cache read",value:t.cacheReadPrice==null?"—":`${E(t.cacheReadPrice)} / 1M`}),e.jsx(I,{label:"Cache write",value:t.cacheWritePrice==null?"—":`${E(t.cacheWritePrice)} / 1M`}),e.jsx(I,{label:"1h cache write",value:t.cacheWrite1hPrice==null?"—":`${E(t.cacheWrite1hPrice)} / 1M`}),e.jsx(I,{label:"Context tiers",value:t.pricingTiers.length?`${t.pricingTiers.length} configured`:"—"}),e.jsxs("div",{className:"flex items-center gap-2 pt-1",children:[e.jsx(A,{size:"sm",variant:"outline",onPress:S,children:t.source==="configured"?"Edit price":"Set price"}),t.source==="configured"?e.jsxs(e.Fragment,{children:[e.jsx(ze,{confirmLabel:"Reset",isPending:r.isPending,onConfirm:()=>r.mutate(t.key),children:"Reset"}),e.jsx(oe,{label:"What reset does",children:"Removes the custom price. The model reverts to the default rate (genai-prices) when default pricing is on, otherwise it is metered at no cost."})]}):null,r.error?e.jsx("span",{className:"text-xs text-red-700",children:be(r.error)}):null]})]})}function Ht({row:t,metadata:i,metadataAvailable:r,onMakeAlias:s,onClose:n}){const a=(i==null?void 0:i.input_modalities)??[],f=(i==null?void 0:i.output_modalities)??[],p=Ot.filter(({key:u})=>i==null?void 0:i[u]);return e.jsx(se,{children:e.jsxs(se.Content,{className:"flex flex-col gap-5 p-5",children:[e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h2",{className:"text-base font-semibold break-all text-[var(--otari-ink)]",children:t.model}),i!=null&&i.deprecated?e.jsx(V,{size:"sm",color:"danger",children:"deprecated"}):null]}),e.jsxs("p",{className:"mt-1 text-xs break-all text-[var(--otari-muted)]",children:["Selector: ",e.jsx("code",{children:t.key})]}),i!=null&&i.family?e.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:i.family}):null]}),e.jsx("button",{type:"button","aria-label":"Close model details",onClick:n,className:"-mt-1 -mr-1 shrink-0 rounded-md px-1.5 py-0.5 text-lg leading-none text-[var(--otari-muted)] hover:bg-[var(--otari-bg)] hover:text-[var(--otari-ink)]",children:"✕"})]}),i!=null&&i.description?e.jsx("p",{className:"text-sm text-[var(--otari-ink)]",children:i.description}):null,e.jsxs(le,{title:"Pricing",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(wt,{source:t.source}),t.isDiscovered?null:e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"not discovered"})]}),e.jsx(Yt,{row:t},t.key),e.jsx(A,{size:"sm",variant:"outline",onPress:()=>s(t.key),children:"Make an alias"})]}),e.jsxs(le,{title:"Specs",children:[e.jsx(I,{label:"Context window",value:ae(t.contextWindow)}),e.jsx(I,{label:"Max output",value:ae((i==null?void 0:i.max_output_tokens)??null)}),e.jsx(I,{label:"Knowledge cutoff",value:(i==null?void 0:i.knowledge_cutoff)??"—"}),e.jsx(I,{label:"Released",value:Ct(i==null?void 0:i.release_date)}),e.jsx(I,{label:"Open weights",value:i?i.open_weights?"Yes":"No":"—"})]}),e.jsx(le,{title:"Modalities",children:a.length===0&&f.length===0?e.jsx("span",{className:"text-sm text-[var(--otari-muted)]",children:"Unknown."}):e.jsxs("div",{className:"flex flex-col gap-1.5 text-xs text-[var(--otari-muted)]",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-1",children:[e.jsx("span",{children:"In:"}),a.map(u=>e.jsx(V,{size:"sm",color:"default",children:Fe[u]??u},u))]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-1",children:[e.jsx("span",{children:"Out:"}),f.map(u=>e.jsx(V,{size:"sm",color:"default",children:Fe[u]??u},u))]})]})}),e.jsx(le,{title:"Capabilities",children:p.length>0?e.jsx("div",{className:"flex flex-wrap gap-1.5",children:p.map(({key:u,label:P})=>e.jsx(V,{size:"sm",color:"default",children:P},u))}):e.jsx("span",{className:"text-sm text-[var(--otari-muted)]",children:r?"None reported.":"Extended metadata unavailable (models.dev disabled or unreachable)."})})]})})}const qt=15;function Ut({value:t,onChange:i,placeholder:r}){return e.jsx("input",{type:"search",value:t,onChange:s=>i(s.target.value),placeholder:r,"aria-label":r,className:"w-full max-w-xs rounded-md border border-[var(--otari-line)] bg-white px-3 py-1.5 text-sm focus:border-[var(--otari-brand)] focus:outline-none"})}const qe="otari.dashboard.modelsSort",_e={col:"model",dir:"asc"},Gt=["model","released","input","output"];function Jt(){if(typeof window>"u")return _e;try{const t=window.localStorage.getItem(qe);if(!t)return _e;const i=JSON.parse(t);if(Gt.includes(i.col)&&(i.dir==="asc"||i.dir==="desc"))return{col:i.col,dir:i.dir}}catch{}return _e}function Xt({row:t,onClose:i}){const r=je(),s=Re(),[n,a]=c.useState(t.inputPrice==null?"":String(t.inputPrice)),[f,p]=c.useState(t.outputPrice==null?"":String(t.outputPrice)),[u,P]=c.useState(t.cacheReadPrice==null?"":String(t.cacheReadPrice)),[j,k]=c.useState(t.cacheWritePrice==null?"":String(t.cacheWritePrice)),[T,y]=c.useState(t.cacheWrite1hPrice==null?"":String(t.cacheWrite1hPrice)),[h,N]=c.useState(we(t.pricingTiers)),O=ce(n)&&ce(f)&&w(u)&&w(j)&&w(T)&&Ve(h),S=()=>{O&&r.mutate({model_key:t.key,input_price_per_million:Number(n),output_price_per_million:Number(f),cache_read_price_per_million:Y(u),cache_write_price_per_million:Y(j),cache_write_1h_price_per_million:Y(T),pricing_tiers:Ye(h)},{onSuccess:i})};return e.jsxs("div",{className:"flex flex-col gap-3 px-4 py-3",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("span",{className:"text-xs font-medium break-all text-[var(--otari-muted)]",children:t.key}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["Input $ / 1M",e.jsx(b,{value:n,onChange:a,ariaLabel:`Input price for ${t.key}`})]}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["Output $ / 1M",e.jsx(b,{value:f,onChange:p,ariaLabel:`Output price for ${t.key}`})]}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["Cache read $ / 1M",e.jsx(b,{value:u,onChange:P,ariaLabel:`Cache read price for ${t.key}`})]}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["Cache write $ / 1M",e.jsx(b,{value:j,onChange:k,ariaLabel:`Cache write price for ${t.key}`})]}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["1h cache write $ / 1M",e.jsx(b,{value:T,onChange:y,ariaLabel:`1 hour cache write price for ${t.key}`})]}),e.jsx(A,{size:"sm",variant:"primary",isDisabled:r.isPending||!O,onPress:S,children:r.isPending?"Saving…":"Save"}),e.jsx(A,{size:"sm",variant:"ghost",isDisabled:r.isPending,onPress:i,children:"Cancel"}),t.source==="configured"?e.jsxs("span",{className:"inline-flex items-center gap-1",children:[e.jsx(ze,{confirmLabel:"Reset",isPending:s.isPending,onConfirm:()=>s.mutate(t.key,{onSuccess:i}),children:"Reset"}),e.jsx(oe,{label:"What reset does",children:"Removes the custom price. The model reverts to the default rate (genai-prices) when default pricing is on, otherwise it is metered at no cost."})]}):null,r.error||s.error?e.jsx("span",{className:"text-xs text-red-700",children:be(r.error??s.error)}):null]}),e.jsx(He,{tiers:h,onChange:N})]})}function Zt({primary:t,secondary:i,rowKey:r,primaryLabel:s,secondaryLabel:n,onEdit:a}){const f=(p,u)=>e.jsx("button",{type:"button","aria-label":`Edit ${u} price for ${r}`,className:"tabular-nums hover:text-[var(--otari-brand-dark)] hover:underline",onClick:P=>{P.stopPropagation(),a()},children:p==null?"—":E(p)});return e.jsxs("span",{className:"inline-flex items-center justify-end gap-1",children:[f(t,s),e.jsx("span",{className:"text-[var(--otari-muted)]",children:"/"}),f(i,n)]})}function Qt({rates:t,rowKey:i,onEdit:r}){const s=[t.cacheReadPrice==null?null:`R ${E(t.cacheReadPrice)}`,t.cacheWritePrice==null?null:`W ${E(t.cacheWritePrice)}`,t.cacheWrite1hPrice==null?null:`1h ${E(t.cacheWrite1hPrice)}`].filter(n=>n!==null);return e.jsx("button",{type:"button","aria-label":`Edit caching price for ${i}`,className:"max-w-44 text-right text-xs leading-5 text-[var(--otari-muted)] hover:text-[var(--otari-brand-dark)] hover:underline",onClick:n=>{n.stopPropagation(),r()},children:s.length>0?s.join(" · "):"Input-rate fallback"})}function ei({row:t,onEdit:i}){const r=[...t.pricingTiers].sort((n,a)=>n.min_input_tokens-a.min_input_tokens).map(n=>ae(n.min_input_tokens)),s=r.length===0?"Base only":`${r.length} tier${r.length===1?"":"s"} · ≥ ${r.join(", ")}`;return e.jsx("button",{type:"button","aria-label":`Edit pricing policy for ${t.key}`,className:"max-w-40 text-right text-xs leading-5 text-[var(--otari-muted)] hover:text-[var(--otari-brand-dark)] hover:underline",onClick:n=>{n.stopPropagation(),i()},children:s})}function ti({rows:t,isLoading:i,empty:r,sortDescriptor:s,onSortChange:n,selectedKey:a,onSelect:f,onEditPricing:p,comparisonContextTokens:u,selectedKeys:P,onSelectionChange:j}){const k=c.useMemo(()=>{const y=u==null?"Base":`at ${ae(u)}`;return[{id:"model",header:"Model",isRowHeader:!0,allowsSorting:!0,cell:h=>e.jsxs("span",{className:"font-medium break-all",children:[h.model,e.jsx("span",{className:"sr-only",children:h.key})]})},{id:"provider",header:"Provider",cell:h=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:h.provider})},{id:"input",header:e.jsxs("span",{className:"inline-flex items-center gap-1",children:[`${y} in / out $ / 1M`,e.jsx(Vt,{})]}),align:"end",allowsSorting:!0,cell:h=>{const N=Ke(h,u);return e.jsx(Zt,{primary:N.inputPrice,secondary:N.outputPrice,rowKey:h.key,primaryLabel:"input",secondaryLabel:"output",onEdit:()=>p(h.key)})}},{id:"caching",header:`Caching ${u==null?"policy":y}`,align:"end",cell:h=>e.jsx(Qt,{rates:Ke(h,u),rowKey:h.key,onEdit:()=>p(h.key)})},{id:"policy",header:"Pricing policy",align:"end",cell:h=>e.jsx(ei,{row:h,onEdit:()=>p(h.key)})}]},[u,p]),T=c.useCallback(y=>y.key===a?"bg-[var(--otari-brand-tint)]":void 0,[a]);return e.jsx(Tt,{ariaLabel:"Models",columns:k,rows:t,getRowKey:zt,isLoading:i,emptyContent:r,selectionMode:"multiple",selectedKeys:P,onSelectionChange:j,sortDescriptor:s,onSortChange:n,onRowAction:f,rowClassName:T})}function ii({providers:t}){return t.length===0?null:e.jsxs(St,{tone:"warning",children:["Could not list ",t.map(i=>i.provider).join(", "),". Check that provider's credentials in config.yml; its models are missing from the list below."]})}function pi(){var Te,Le,Ae;const t=gt(),[i]=vt(),r=_t(),s=bt(),n=jt(),a=yt(),f=je(),[p,u]=c.useState(""),[P,j]=c.useState(0),[k,T]=c.useState(qt),[y,h]=c.useState(null),[N,O]=c.useState(null),[S,Z]=c.useState(Jt),W=Mt(),[Ue,ue]=c.useState(!1),[Ge,ye]=c.useState(!1),[Je,Pe]=c.useState(void 0);c.useEffect(()=>{try{window.localStorage.setItem(qe,JSON.stringify(S))}catch{}},[S]);const[D,Ne]=c.useState(i.get("provider")||"all"),[K,Xe]=c.useState("all"),[H,Ze]=c.useState("all"),[q,Qe]=c.useState("all"),[de,et]=c.useState("0"),[Q,tt]=c.useState(""),[ee,it]=c.useState("all"),[pe,rt]=c.useState(""),F=((Te=a.data)==null?void 0:Te.models)??{},nt=((Le=a.data)==null?void 0:Le.available)??!1,Se=c.useMemo(()=>{var l;return new Set((((l=n.data)==null?void 0:l.providers)??[]).flatMap(m=>m.models.map(o=>o.key)))},[n.data]),lt=l=>{u(l),j(0)},R=l=>m=>{l(m),j(0)},te=c.useMemo(()=>{var M,v,_,$,L,z,$e;const l=new Map($t(s.data??[]).map(d=>[d.model_key,d])),m=[],o=new Set,g=(d,ve,Ee,x)=>{if(o.has(d))return;o.add(d);const C=l.get(d);m.push({key:d,model:Be(ve,Ee),provider:Ee,isDiscovered:Se.has(d),contextWindow:(x==null?void 0:x.contextWindow)??null,inputPrice:C?C.input_price_per_million:(x==null?void 0:x.inputPrice)??null,outputPrice:C?C.output_price_per_million:(x==null?void 0:x.outputPrice)??null,cacheReadPrice:C?C.cache_read_price_per_million:(x==null?void 0:x.cacheReadPrice)??null,cacheWritePrice:C?C.cache_write_price_per_million:(x==null?void 0:x.cacheWritePrice)??null,cacheWrite1hPrice:C?C.cache_write_1h_price_per_million??null:(x==null?void 0:x.cacheWrite1hPrice)??null,pricingTiers:C?C.pricing_tiers??[]:(x==null?void 0:x.pricingTiers)??[],source:C?"configured":(x==null?void 0:x.source)??"none"})};for(const d of((M=r.data)==null?void 0:M.data)??[]){if(d.owned_by===Et)continue;const ve=d.pricing_source==="default"?"default":d.pricing?"configured":"none";g(d.id,d.id,d.owned_by||Oe(d.id),{key:d.id,model:d.id,provider:d.owned_by,contextWindow:d.context_window,inputPrice:((v=d.pricing)==null?void 0:v.input_price_per_million)??null,outputPrice:((_=d.pricing)==null?void 0:_.output_price_per_million)??null,cacheReadPrice:(($=d.pricing)==null?void 0:$.cache_read_price_per_million)??null,cacheWritePrice:((L=d.pricing)==null?void 0:L.cache_write_price_per_million)??null,cacheWrite1hPrice:((z=d.pricing)==null?void 0:z.cache_write_1h_price_per_million)??null,pricingTiers:(($e=d.pricing)==null?void 0:$e.pricing_tiers)??[],source:ve})}for(const d of l.keys())g(d,d,Oe(d));return m},[r.data,s.data,Se]),Ce=c.useMemo(()=>new Map(te.map(l=>[l.key,l])),[te]),ie=c.useMemo(()=>{var o,g,M;const l=te.map(v=>{var _,$;return{...v,contextWindow:v.contextWindow??((_=F[v.key])==null?void 0:_.context_window)??null,releaseDate:(($=F[v.key])==null?void 0:$.release_date)??null}}),m=new Set(l.map(v=>v.key));for(const v of((o=n.data)==null?void 0:o.providers)??[])for(const _ of v.models)m.has(_.key)||(m.add(_.key),l.push({key:_.key,model:Be(_.key,v.provider),provider:v.provider,isDiscovered:!0,contextWindow:((g=F[_.key])==null?void 0:g.context_window)??null,releaseDate:((M=F[_.key])==null?void 0:M.release_date)??null,inputPrice:null,outputPrice:null,cacheReadPrice:null,cacheWritePrice:null,cacheWrite1hPrice:null,pricingTiers:[],source:"none"}));return l},[te,n.data,F]),at=(((Ae=n.data)==null?void 0:Ae.providers)??[]).filter(l=>!l.ok),re=c.useMemo(()=>{const l=Array.from(new Set(ie.map(m=>m.provider))).sort((m,o)=>m.localeCompare(o));return[{value:"all",label:"All providers"},...l.map(m=>({value:m,label:m}))]},[ie]);c.useEffect(()=>{D==="all"||re.length<=1||re.some(l=>l.value===D)||Ne("all")},[re,D]);const U=p.trim().toLowerCase(),he=Number(de)||0,me=Q===""?Number.POSITIVE_INFINITY:Number(Q),st=pe===""?null:Number(pe),xe=ee==="all"?null:Date.now()-Number(ee)*Rt,G=c.useMemo(()=>{const l=o=>{if(U&&!o.key.toLowerCase().includes(U)&&!o.provider.toLowerCase().includes(U)||D!=="all"&&o.provider!==D||K==="configured"&&o.source!=="configured"||K==="default"&&o.source!=="default"||K==="priced"&&o.inputPrice==null||K==="unpriced"&&o.inputPrice!=null||H==="discovered"&&!o.isDiscovered||H==="custom"&&o.isDiscovered)return!1;if(q!=="all"){const g=De.find(v=>v.value===q),M=F[o.key];if(!g||!M||!g.test(M))return!1}if(he>0&&(o.contextWindow==null||o.contextWindowme))return!1;if(xe!=null){const g=o.releaseDate?Date.parse(o.releaseDate):Number.NaN;if(Number.isNaN(g)||g{const M=S.dir==="asc"?1:-1;if(S.col==="model")return o.model.localeCompare(g.model)*M;if(S.col==="released"){const L=o.releaseDate??null,z=g.releaseDate??null;return!L&&!z?o.model.localeCompare(g.model):L?z?(Lz?1:0)*M||o.model.localeCompare(g.model):-1:1}const v=L=>S.col==="input"?L.inputPrice:L.outputPrice,_=v(o),$=v(g);return _==null&&$==null?o.model.localeCompare(g.model):_==null?1:$==null?-1:(_-$)*M||o.model.localeCompare(g.model)};return ie.filter(l).sort(m)},[ie,U,D,K,H,q,he,me,xe,F,S]),J=G.length,ct=Math.max(1,Math.ceil(J/k)),ke=Math.min(P,ct-1),Me=ke*k,fe=G.slice(Me,Me+k),ot={column:S.col,direction:S.dir==="asc"?"ascending":"descending"},ut=l=>{Z({col:String(l.column),dir:l.direction==="ascending"?"asc":"desc"}),j(0)},dt=c.useCallback(l=>h(m=>m===l?null:l),[]),ge=fe.map(l=>l.key),X=Wt(W.selectedKeys,ge),pt=ge.length>0&&X.length===ge.length&&J>X.length,ht=W.allMatching?G.map(l=>l.key):X,We=W.allMatching?J:X.length,Ie=y?G.find(l=>l.key===y)??Ce.get(y)??null:null,mt=async l=>{ye(!0),Pe(void 0);try{for(const m of ht)await f.mutateAsync({model_key:m,input_price_per_million:l.input_price_per_million,output_price_per_million:l.output_price_per_million,cache_read_price_per_million:l.cache_read_price_per_million??null,cache_write_price_per_million:l.cache_write_price_per_million??null,cache_write_1h_price_per_million:null,pricing_tiers:[]});W.clear(),ue(!1)}catch(m){Pe(m)}finally{ye(!1)}},xt=r.isLoading||s.isLoading||n.isLoading,ft=U!==""||D!=="all"||K!=="all"||H!=="all"||q!=="all"||de!=="0"||Q!==""||ee!=="all"?"No models match your filters.":"No models yet. Add a provider on the Providers page, or price a model below.",ne=N?G.find(l=>l.key===N)??Ce.get(N)??null:null;return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(Pt,{title:"Models",description:"Every model your providers can serve. Set a price on any model so budgets and usage tracking work."}),e.jsx(Nt,{error:r.error??s.error??n.error??a.error}),e.jsxs("div",{className:`grid gap-4 lg:items-start ${ne?"lg:grid-cols-[minmax(0,1fr)_360px]":"grid-cols-1"}`,children:[e.jsxs("div",{className:"flex min-w-0 flex-col gap-3",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(Ut,{value:p,onChange:lt,placeholder:"Search models…"}),e.jsx(B,{ariaLabel:"Filter by provider",value:D,onChange:R(Ne),options:re}),e.jsx(B,{ariaLabel:"Filter by pricing",value:K,onChange:R(Xe),options:[{value:"all",label:"Any pricing"},{value:"configured",label:"Custom price"},{value:"default",label:"Default price"},{value:"priced",label:"Priced"},{value:"unpriced",label:"Unpriced"}]}),e.jsx(B,{ariaLabel:"Filter by source",value:H,onChange:R(Ze),options:[{value:"all",label:"Any source"},{value:"discovered",label:"Discovered"},{value:"custom",label:"Custom (not discovered)"}]}),e.jsx(B,{ariaLabel:"Filter by capability",value:q,onChange:R(Qe),options:[{value:"all",label:"Any capability"},...De.map(l=>({value:l.value,label:l.label}))]}),e.jsx(B,{ariaLabel:"Minimum context window",value:de,onChange:R(et),options:Dt}),e.jsx(B,{ariaLabel:"Maximum input price",value:Q,onChange:R(tt),options:Ft}),e.jsx(B,{ariaLabel:"Compare prices at context",value:pe,onChange:rt,options:Bt}),e.jsx(B,{ariaLabel:"Filter by release date",value:ee,onChange:R(it),options:Kt})]}),e.jsx(ii,{providers:at}),X.length>0?e.jsx(It,{selectedCount:We,allMatching:W.allMatching,matchingTotal:J,canSelectAllMatching:pt,onSelectAllMatching:W.enableAllMatching,onClear:W.clear,children:e.jsx(A,{size:"sm",variant:"primary",onPress:()=>ue(!0),children:"Set pricing"})}):null,e.jsx(ti,{rows:fe,isLoading:xt,empty:ft,sortDescriptor:ot,onSortChange:ut,selectedKey:N,onSelect:O,onEditPricing:dt,comparisonContextTokens:st,selectedKeys:W.selectedKeys,onSelectionChange:W.onSelectionChange}),Ie?e.jsx(se,{children:e.jsxs(se.Content,{className:"p-0",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-[var(--otari-line)] px-4 py-2",children:[e.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Edit pricing"}),e.jsx(A,{size:"sm",variant:"ghost",onPress:()=>h(null),children:"Close"})]}),e.jsx(Xt,{row:Ie,onClose:()=>h(null)})]})}):null,e.jsx(Lt,{page:ke,pageSize:k,total:J,rowsOnPage:fe.length,onPageChange:j,onPageSizeChange:l=>{T(l),j(0)},pageSizeOptions:[15,25,50]})]}),ne?e.jsx("aside",{className:"lg:sticky lg:top-4",children:e.jsx(Ht,{row:ne,metadata:F[ne.key],metadataAvailable:nt,onMakeAlias:l=>t(`/aliases?target=${encodeURIComponent(l)}`),onClose:()=>O(null)})}):null]}),e.jsx(At,{isOpen:Ue,onOpenChange:ue,targetCount:We,isPending:Ge,error:Je,onSubmit:mt,title:"Set pricing",description:l=>`Apply these per-1M rates to ${l.toLocaleString()} selected ${l===1?"model":"models"}. This replaces each model's price; pricing tiers and the 1h cache rate are cleared. Edit a single model for tiers.`})]})}export{pi as ModelsPage}; +import{j as e}from"./tanstack-query-1t81HyiD.js";import{i as gt,u as vt,r as c}from"./react-dgEcD0HR.js";import{w as _t,x as bt,h as jt,y as yt,z as je,P as Pt,E as Nt,F as B,I as St,A as ae,B as Re,C as ze,D as be,G as Ct,H as kt,J as E}from"./index-DHi1jXMu.js";import{u as Mt,r as Wt,B as It}from"./tableSelection-9hV37uhu.js";import{D as Tt}from"./DataTable-Bmn_eYSV.js";import{T as Lt,S as At}from"./TablePagination-Chra1w0V.js";import{B as A,d as se,f as V}from"./heroui-BI50yK5B.js";function Oe(t){const i=t.indexOf(":");return i>0?t.slice(0,i):"—"}function $t(t,i=Date.now()){const r=new Map;for(const n of t){const a=r.get(n.model_key)??[];a.push(n),r.set(n.model_key,a)}const s=[];for(const n of r.values()){const a=[...n].sort((p,u)=>Date.parse(p.effective_at)-Date.parse(u.effective_at)),f=[...a].reverse().find(p=>Date.parse(p.effective_at)<=i);s.push(f??a[0])}return s.sort((n,a)=>n.model_key.localeCompare(a.model_key))}const Et="otari",De=[{value:"vision",label:"Vision",test:t=>Array.isArray(t.input_modalities)&&t.input_modalities.includes("image")},{value:"tool_call",label:"Tool calling",test:t=>!!t.tool_call},{value:"reasoning",label:"Reasoning",test:t=>!!t.reasoning},{value:"structured_output",label:"Structured output",test:t=>!!t.structured_output},{value:"attachment",label:"Attachments",test:t=>!!t.attachment},{value:"audio",label:"Audio",test:t=>Array.isArray(t.input_modalities)&&t.input_modalities.includes("audio")},{value:"pdf",label:"PDF",test:t=>Array.isArray(t.input_modalities)&&t.input_modalities.includes("pdf")}],Ot=[{key:"reasoning",label:"Reasoning"},{key:"tool_call",label:"Tool calling"},{key:"structured_output",label:"Structured output"},{key:"attachment",label:"Attachments"},{key:"temperature",label:"Temperature"}],Fe={text:"Text",image:"Image",audio:"Audio",video:"Video",pdf:"PDF"},Dt=[{value:"0",label:"Any context"},{value:"8000",label:"≥ 8K"},{value:"32000",label:"≥ 32K"},{value:"128000",label:"≥ 128K"},{value:"200000",label:"≥ 200K"},{value:"1000000",label:"≥ 1M"}],Ft=[{value:"",label:"Any price"},{value:"1",label:"≤ $1 / 1M in"},{value:"3",label:"≤ $3 / 1M in"},{value:"10",label:"≤ $10 / 1M in"},{value:"30",label:"≤ $30 / 1M in"}],Bt=[{value:"",label:"Base prices"},{value:"8000",label:"Compare at 8K"},{value:"128000",label:"Compare at 128K"},{value:"200000",label:"Compare at 200K"},{value:"500000",label:"Compare at 500K"},{value:"1000000",label:"Compare at 1M"}],Kt=[{value:"all",label:"Any release date"},{value:"365",label:"Past year"},{value:"730",label:"Past 2 years"},{value:"1095",label:"Past 3 years"}],Rt=1440*60*1e3,zt=t=>t.key;function Be(t,i){const r=`${i}:`;return t.startsWith(r)?t.slice(r.length):t}function Ke(t,i){const r={inputPrice:t.inputPrice,outputPrice:t.outputPrice,cacheReadPrice:t.cacheReadPrice,cacheWritePrice:t.cacheWritePrice,cacheWrite1hPrice:t.cacheWrite1hPrice};if(i==null)return r;const s=t.pricingTiers.filter(n=>n.min_input_tokens<=i).sort((n,a)=>a.min_input_tokens-n.min_input_tokens)[0];return s?{inputPrice:s.input_price_per_million??r.inputPrice,outputPrice:s.output_price_per_million??r.outputPrice,cacheReadPrice:s.cache_read_price_per_million??r.cacheReadPrice,cacheWritePrice:s.cache_write_price_per_million??r.cacheWritePrice,cacheWrite1hPrice:s.cache_write_1h_price_per_million??r.cacheWrite1hPrice}:r}function ce(t){const i=Number(t);return t.trim()!==""&&Number.isFinite(i)&&i>=0}function w(t){if(t.trim()==="")return!0;const i=Number(t);return Number.isFinite(i)&&i>=0}function Y(t){return t.trim()===""?null:Number(t)}function we(t){return t.map((i,r)=>({id:r,minInputTokens:String(i.min_input_tokens),input:i.input_price_per_million==null?"":String(i.input_price_per_million),output:i.output_price_per_million==null?"":String(i.output_price_per_million),cacheRead:i.cache_read_price_per_million==null?"":String(i.cache_read_price_per_million),cacheWrite:i.cache_write_price_per_million==null?"":String(i.cache_write_price_per_million),cacheWrite1h:i.cache_write_1h_price_per_million==null?"":String(i.cache_write_1h_price_per_million)}))}function Ve(t){const i=new Set;return t.every(r=>{const s=Number(r.minInputTokens),n=[r.input,r.output,r.cacheRead,r.cacheWrite,r.cacheWrite1h].some(a=>a.trim()!=="");return!Number.isInteger(s)||s<=0||i.has(s)||!n?!1:(i.add(s),[r.input,r.output,r.cacheRead,r.cacheWrite,r.cacheWrite1h].every(w))})}function Ye(t){return t.map(i=>({min_input_tokens:Number(i.minInputTokens),...i.input.trim()===""?{}:{input_price_per_million:Number(i.input)},...i.output.trim()===""?{}:{output_price_per_million:Number(i.output)},...i.cacheRead.trim()===""?{}:{cache_read_price_per_million:Number(i.cacheRead)},...i.cacheWrite.trim()===""?{}:{cache_write_price_per_million:Number(i.cacheWrite)},...i.cacheWrite1h.trim()===""?{}:{cache_write_1h_price_per_million:Number(i.cacheWrite1h)}}))}function b({value:t,onChange:i,ariaLabel:r}){return e.jsx("input",{type:"number",step:"any",min:"0",inputMode:"decimal","aria-label":r,value:t,onChange:s=>i(s.target.value),className:"w-28 rounded-md border border-[var(--otari-line)] bg-white px-2 py-1 text-right text-sm tabular-nums focus:border-[var(--otari-brand)] focus:outline-none"})}function He({tiers:t,onChange:i}){const r=(n,a,f)=>{i(t.map(p=>p.id===n?{...p,[a]:f}:p))},s=()=>{const n=t.reduce((a,f)=>Math.max(a,f.id),-1)+1;i([...t,{id:n,minInputTokens:"128000",input:"",output:"",cacheRead:"",cacheWrite:"",cacheWrite1h:""}])};return e.jsxs("div",{className:"flex flex-col gap-2 rounded-lg border border-[var(--otari-line)] p-3",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-medium text-[var(--otari-ink)]",children:"Long-context price tiers"}),e.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:"At a threshold, listed rates replace the base rate for the whole request."})]}),e.jsx(A,{size:"sm",variant:"outline",onPress:s,children:"Add tier"})]}),t.map(n=>e.jsxs("div",{className:"flex flex-wrap items-end gap-2 border-t border-[var(--otari-line)] pt-2",children:[e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Context ≥ tokens",e.jsx("input",{type:"number",min:"1",step:"1",inputMode:"numeric","aria-label":"Tier context threshold",value:n.minInputTokens,onChange:a=>r(n.id,"minInputTokens",a.target.value),className:"w-28 rounded-md border border-[var(--otari-line)] bg-white px-2 py-1 text-right text-sm tabular-nums focus:border-[var(--otari-brand)] focus:outline-none"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Input",e.jsx(b,{value:n.input,onChange:a=>r(n.id,"input",a),ariaLabel:"Tier input price"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Output",e.jsx(b,{value:n.output,onChange:a=>r(n.id,"output",a),ariaLabel:"Tier output price"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Cache read",e.jsx(b,{value:n.cacheRead,onChange:a=>r(n.id,"cacheRead",a),ariaLabel:"Tier cache read price"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Cache write",e.jsx(b,{value:n.cacheWrite,onChange:a=>r(n.id,"cacheWrite",a),ariaLabel:"Tier cache write price"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["1h write",e.jsx(b,{value:n.cacheWrite1h,onChange:a=>r(n.id,"cacheWrite1h",a),ariaLabel:"Tier 1 hour cache write price"})]}),e.jsx(A,{size:"sm",variant:"ghost",onPress:()=>i(t.filter(a=>a.id!==n.id)),children:"Remove"})]},n.id))]})}function wt({source:t}){return t==="configured"?e.jsx(V,{size:"sm",color:"default",children:"configured"}):t==="default"||t==="alias"?e.jsx(V,{size:"sm",color:"accent",children:t}):e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"not priced"})}function oe({label:t,tone:i="info",children:r}){const s=c.useId();return e.jsxs("span",{className:"group relative inline-flex items-center font-normal normal-case",children:[e.jsx("button",{type:"button","aria-label":t,"aria-describedby":s,className:`inline-flex h-4 w-4 items-center justify-center rounded-full border text-[10px] leading-none ${i==="warning"?"border-[#c2843a] text-[#b45309]":"border-[var(--otari-line)] text-[var(--otari-muted)] hover:border-[var(--otari-brand)] hover:text-[var(--otari-brand)]"}`,children:"i"}),e.jsx("span",{id:s,role:"tooltip",className:"pointer-events-none absolute top-full right-0 z-20 mt-1.5 w-72 rounded-lg border border-[var(--otari-line)] bg-[var(--otari-surface)] px-3 py-2 text-left text-xs font-normal whitespace-normal break-words text-[var(--otari-ink)] opacity-0 shadow-lg transition-opacity group-hover:opacity-100 group-focus-within:opacity-100",children:r})]})}function Vt(){const t=kt();return t.data?t.data.default_pricing?e.jsx(oe,{label:"How unpriced models are metered",tone:"info",children:"Default pricing is on: models without a configured price are metered using community-maintained rates (the bundled genai-prices dataset). Set a price to override the fallback."}):e.jsxs(oe,{label:"How unpriced models are metered",tone:"warning",children:["Default pricing is off: only models with a configured price are metered.",t.data.require_pricing?" Requests for any other model are rejected (HTTP 402) because require_pricing is on.":" Other models are served without cost tracking."]}):null}function I({label:t,value:i}){return e.jsxs("div",{className:"flex items-baseline justify-between gap-3",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:t}),e.jsx("span",{className:"text-right text-sm text-[var(--otari-ink)] tabular-nums",children:i})]})}function le({title:t,children:i}){return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("span",{className:"text-xs font-semibold uppercase tracking-wide text-[var(--otari-muted)]",children:t}),i]})}function Yt({row:t}){const i=je(),r=Re(),[s,n]=c.useState(!1),[a,f]=c.useState(""),[p,u]=c.useState(""),[P,j]=c.useState(""),[k,T]=c.useState(""),[y,h]=c.useState(""),[N,O]=c.useState([]),S=()=>{f(t.inputPrice==null?"":String(t.inputPrice)),u(t.outputPrice==null?"":String(t.outputPrice)),j(t.cacheReadPrice==null?"":String(t.cacheReadPrice)),T(t.cacheWritePrice==null?"":String(t.cacheWritePrice)),h(t.cacheWrite1hPrice==null?"":String(t.cacheWrite1hPrice)),O(we(t.pricingTiers)),n(!0)},Z=ce(a)&&ce(p)&&w(P)&&w(k)&&w(y)&&Ve(N),W=()=>{Z&&i.mutate({model_key:t.key,input_price_per_million:Number(a),output_price_per_million:Number(p),cache_read_price_per_million:Y(P),cache_write_price_per_million:Y(k),cache_write_1h_price_per_million:Y(y),pricing_tiers:Ye(N)},{onSuccess:()=>n(!1)})};return s?e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Input $ / 1M"}),e.jsx(b,{value:a,onChange:f,ariaLabel:`Input price for ${t.key}`})]}),e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Output $ / 1M"}),e.jsx(b,{value:p,onChange:u,ariaLabel:`Output price for ${t.key}`})]}),e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Cache read $ / 1M"}),e.jsx(b,{value:P,onChange:j,ariaLabel:`Cache read price for ${t.key}`})]}),e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Cache write $ / 1M"}),e.jsx(b,{value:k,onChange:T,ariaLabel:`Cache write price for ${t.key}`})]}),e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"1h cache write $ / 1M"}),e.jsx(b,{value:y,onChange:h,ariaLabel:`1 hour cache write price for ${t.key}`})]}),e.jsx(He,{tiers:N,onChange:O}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(A,{size:"sm",variant:"primary",isDisabled:i.isPending||!Z,onPress:W,children:"Save"}),e.jsx(A,{size:"sm",variant:"ghost",isDisabled:i.isPending,onPress:()=>n(!1),children:"Cancel"})]}),i.error?e.jsx("span",{className:"text-xs text-red-700",children:be(i.error)}):null]}):e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(I,{label:"Input",value:t.inputPrice==null?"—":`${E(t.inputPrice)} / 1M`}),e.jsx(I,{label:"Output",value:t.outputPrice==null?"—":`${E(t.outputPrice)} / 1M`}),e.jsx(I,{label:"Cache read",value:t.cacheReadPrice==null?"—":`${E(t.cacheReadPrice)} / 1M`}),e.jsx(I,{label:"Cache write",value:t.cacheWritePrice==null?"—":`${E(t.cacheWritePrice)} / 1M`}),e.jsx(I,{label:"1h cache write",value:t.cacheWrite1hPrice==null?"—":`${E(t.cacheWrite1hPrice)} / 1M`}),e.jsx(I,{label:"Context tiers",value:t.pricingTiers.length?`${t.pricingTiers.length} configured`:"—"}),e.jsxs("div",{className:"flex items-center gap-2 pt-1",children:[e.jsx(A,{size:"sm",variant:"outline",onPress:S,children:t.source==="configured"?"Edit price":"Set price"}),t.source==="configured"?e.jsxs(e.Fragment,{children:[e.jsx(ze,{confirmLabel:"Reset",isPending:r.isPending,onConfirm:()=>r.mutate(t.key),children:"Reset"}),e.jsx(oe,{label:"What reset does",children:"Removes the custom price. The model reverts to the default rate (genai-prices) when default pricing is on, otherwise it is metered at no cost."})]}):null,r.error?e.jsx("span",{className:"text-xs text-red-700",children:be(r.error)}):null]})]})}function Ht({row:t,metadata:i,metadataAvailable:r,onMakeAlias:s,onClose:n}){const a=(i==null?void 0:i.input_modalities)??[],f=(i==null?void 0:i.output_modalities)??[],p=Ot.filter(({key:u})=>i==null?void 0:i[u]);return e.jsx(se,{children:e.jsxs(se.Content,{className:"flex flex-col gap-5 p-5",children:[e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h2",{className:"text-base font-semibold break-all text-[var(--otari-ink)]",children:t.model}),i!=null&&i.deprecated?e.jsx(V,{size:"sm",color:"danger",children:"deprecated"}):null]}),e.jsxs("p",{className:"mt-1 text-xs break-all text-[var(--otari-muted)]",children:["Selector: ",e.jsx("code",{children:t.key})]}),i!=null&&i.family?e.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:i.family}):null]}),e.jsx("button",{type:"button","aria-label":"Close model details",onClick:n,className:"-mt-1 -mr-1 shrink-0 rounded-md px-1.5 py-0.5 text-lg leading-none text-[var(--otari-muted)] hover:bg-[var(--otari-bg)] hover:text-[var(--otari-ink)]",children:"✕"})]}),i!=null&&i.description?e.jsx("p",{className:"text-sm text-[var(--otari-ink)]",children:i.description}):null,e.jsxs(le,{title:"Pricing",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(wt,{source:t.source}),t.isDiscovered?null:e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"not discovered"})]}),e.jsx(Yt,{row:t},t.key),e.jsx(A,{size:"sm",variant:"outline",onPress:()=>s(t.key),children:"Make an alias"})]}),e.jsxs(le,{title:"Specs",children:[e.jsx(I,{label:"Context window",value:ae(t.contextWindow)}),e.jsx(I,{label:"Max output",value:ae((i==null?void 0:i.max_output_tokens)??null)}),e.jsx(I,{label:"Knowledge cutoff",value:(i==null?void 0:i.knowledge_cutoff)??"—"}),e.jsx(I,{label:"Released",value:Ct(i==null?void 0:i.release_date)}),e.jsx(I,{label:"Open weights",value:i?i.open_weights?"Yes":"No":"—"})]}),e.jsx(le,{title:"Modalities",children:a.length===0&&f.length===0?e.jsx("span",{className:"text-sm text-[var(--otari-muted)]",children:"Unknown."}):e.jsxs("div",{className:"flex flex-col gap-1.5 text-xs text-[var(--otari-muted)]",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-1",children:[e.jsx("span",{children:"In:"}),a.map(u=>e.jsx(V,{size:"sm",color:"default",children:Fe[u]??u},u))]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-1",children:[e.jsx("span",{children:"Out:"}),f.map(u=>e.jsx(V,{size:"sm",color:"default",children:Fe[u]??u},u))]})]})}),e.jsx(le,{title:"Capabilities",children:p.length>0?e.jsx("div",{className:"flex flex-wrap gap-1.5",children:p.map(({key:u,label:P})=>e.jsx(V,{size:"sm",color:"default",children:P},u))}):e.jsx("span",{className:"text-sm text-[var(--otari-muted)]",children:r?"None reported.":"Extended metadata unavailable (models.dev disabled or unreachable)."})})]})})}const qt=15;function Ut({value:t,onChange:i,placeholder:r}){return e.jsx("input",{type:"search",value:t,onChange:s=>i(s.target.value),placeholder:r,"aria-label":r,className:"w-full max-w-xs rounded-md border border-[var(--otari-line)] bg-white px-3 py-1.5 text-sm focus:border-[var(--otari-brand)] focus:outline-none"})}const qe="otari.dashboard.modelsSort",_e={col:"model",dir:"asc"},Gt=["model","released","input","output"];function Jt(){if(typeof window>"u")return _e;try{const t=window.localStorage.getItem(qe);if(!t)return _e;const i=JSON.parse(t);if(Gt.includes(i.col)&&(i.dir==="asc"||i.dir==="desc"))return{col:i.col,dir:i.dir}}catch{}return _e}function Xt({row:t,onClose:i}){const r=je(),s=Re(),[n,a]=c.useState(t.inputPrice==null?"":String(t.inputPrice)),[f,p]=c.useState(t.outputPrice==null?"":String(t.outputPrice)),[u,P]=c.useState(t.cacheReadPrice==null?"":String(t.cacheReadPrice)),[j,k]=c.useState(t.cacheWritePrice==null?"":String(t.cacheWritePrice)),[T,y]=c.useState(t.cacheWrite1hPrice==null?"":String(t.cacheWrite1hPrice)),[h,N]=c.useState(we(t.pricingTiers)),O=ce(n)&&ce(f)&&w(u)&&w(j)&&w(T)&&Ve(h),S=()=>{O&&r.mutate({model_key:t.key,input_price_per_million:Number(n),output_price_per_million:Number(f),cache_read_price_per_million:Y(u),cache_write_price_per_million:Y(j),cache_write_1h_price_per_million:Y(T),pricing_tiers:Ye(h)},{onSuccess:i})};return e.jsxs("div",{className:"flex flex-col gap-3 px-4 py-3",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("span",{className:"text-xs font-medium break-all text-[var(--otari-muted)]",children:t.key}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["Input $ / 1M",e.jsx(b,{value:n,onChange:a,ariaLabel:`Input price for ${t.key}`})]}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["Output $ / 1M",e.jsx(b,{value:f,onChange:p,ariaLabel:`Output price for ${t.key}`})]}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["Cache read $ / 1M",e.jsx(b,{value:u,onChange:P,ariaLabel:`Cache read price for ${t.key}`})]}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["Cache write $ / 1M",e.jsx(b,{value:j,onChange:k,ariaLabel:`Cache write price for ${t.key}`})]}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["1h cache write $ / 1M",e.jsx(b,{value:T,onChange:y,ariaLabel:`1 hour cache write price for ${t.key}`})]}),e.jsx(A,{size:"sm",variant:"primary",isDisabled:r.isPending||!O,onPress:S,children:r.isPending?"Saving…":"Save"}),e.jsx(A,{size:"sm",variant:"ghost",isDisabled:r.isPending,onPress:i,children:"Cancel"}),t.source==="configured"?e.jsxs("span",{className:"inline-flex items-center gap-1",children:[e.jsx(ze,{confirmLabel:"Reset",isPending:s.isPending,onConfirm:()=>s.mutate(t.key,{onSuccess:i}),children:"Reset"}),e.jsx(oe,{label:"What reset does",children:"Removes the custom price. The model reverts to the default rate (genai-prices) when default pricing is on, otherwise it is metered at no cost."})]}):null,r.error||s.error?e.jsx("span",{className:"text-xs text-red-700",children:be(r.error??s.error)}):null]}),e.jsx(He,{tiers:h,onChange:N})]})}function Zt({primary:t,secondary:i,rowKey:r,primaryLabel:s,secondaryLabel:n,onEdit:a}){const f=(p,u)=>e.jsx("button",{type:"button","aria-label":`Edit ${u} price for ${r}`,className:"tabular-nums hover:text-[var(--otari-brand-dark)] hover:underline",onClick:P=>{P.stopPropagation(),a()},children:p==null?"—":E(p)});return e.jsxs("span",{className:"inline-flex items-center justify-end gap-1",children:[f(t,s),e.jsx("span",{className:"text-[var(--otari-muted)]",children:"/"}),f(i,n)]})}function Qt({rates:t,rowKey:i,onEdit:r}){const s=[t.cacheReadPrice==null?null:`R ${E(t.cacheReadPrice)}`,t.cacheWritePrice==null?null:`W ${E(t.cacheWritePrice)}`,t.cacheWrite1hPrice==null?null:`1h ${E(t.cacheWrite1hPrice)}`].filter(n=>n!==null);return e.jsx("button",{type:"button","aria-label":`Edit caching price for ${i}`,className:"max-w-44 text-right text-xs leading-5 text-[var(--otari-muted)] hover:text-[var(--otari-brand-dark)] hover:underline",onClick:n=>{n.stopPropagation(),r()},children:s.length>0?s.join(" · "):"Input-rate fallback"})}function ei({row:t,onEdit:i}){const r=[...t.pricingTiers].sort((n,a)=>n.min_input_tokens-a.min_input_tokens).map(n=>ae(n.min_input_tokens)),s=r.length===0?"Base only":`${r.length} tier${r.length===1?"":"s"} · ≥ ${r.join(", ")}`;return e.jsx("button",{type:"button","aria-label":`Edit pricing policy for ${t.key}`,className:"max-w-40 text-right text-xs leading-5 text-[var(--otari-muted)] hover:text-[var(--otari-brand-dark)] hover:underline",onClick:n=>{n.stopPropagation(),i()},children:s})}function ti({rows:t,isLoading:i,empty:r,sortDescriptor:s,onSortChange:n,selectedKey:a,onSelect:f,onEditPricing:p,comparisonContextTokens:u,selectedKeys:P,onSelectionChange:j}){const k=c.useMemo(()=>{const y=u==null?"Base":`at ${ae(u)}`;return[{id:"model",header:"Model",isRowHeader:!0,allowsSorting:!0,cell:h=>e.jsxs("span",{className:"font-medium break-all",children:[h.model,e.jsx("span",{className:"sr-only",children:h.key})]})},{id:"provider",header:"Provider",cell:h=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:h.provider})},{id:"input",header:e.jsxs("span",{className:"inline-flex items-center gap-1",children:[`${y} in / out $ / 1M`,e.jsx(Vt,{})]}),align:"end",allowsSorting:!0,cell:h=>{const N=Ke(h,u);return e.jsx(Zt,{primary:N.inputPrice,secondary:N.outputPrice,rowKey:h.key,primaryLabel:"input",secondaryLabel:"output",onEdit:()=>p(h.key)})}},{id:"caching",header:`Caching ${u==null?"policy":y}`,align:"end",cell:h=>e.jsx(Qt,{rates:Ke(h,u),rowKey:h.key,onEdit:()=>p(h.key)})},{id:"policy",header:"Pricing policy",align:"end",cell:h=>e.jsx(ei,{row:h,onEdit:()=>p(h.key)})}]},[u,p]),T=c.useCallback(y=>y.key===a?"bg-[var(--otari-brand-tint)]":void 0,[a]);return e.jsx(Tt,{ariaLabel:"Models",columns:k,rows:t,getRowKey:zt,isLoading:i,emptyContent:r,selectionMode:"multiple",selectedKeys:P,onSelectionChange:j,sortDescriptor:s,onSortChange:n,onRowAction:f,rowClassName:T})}function ii({providers:t}){return t.length===0?null:e.jsxs(St,{tone:"warning",children:["Could not list ",t.map(i=>i.provider).join(", "),". Check that provider's credentials in config.yml; its models are missing from the list below."]})}function pi(){var Te,Le,Ae;const t=gt(),[i]=vt(),r=_t(),s=bt(),n=jt(),a=yt(),f=je(),[p,u]=c.useState(""),[P,j]=c.useState(0),[k,T]=c.useState(qt),[y,h]=c.useState(null),[N,O]=c.useState(null),[S,Z]=c.useState(Jt),W=Mt(),[Ue,ue]=c.useState(!1),[Ge,ye]=c.useState(!1),[Je,Pe]=c.useState(void 0);c.useEffect(()=>{try{window.localStorage.setItem(qe,JSON.stringify(S))}catch{}},[S]);const[D,Ne]=c.useState(i.get("provider")||"all"),[K,Xe]=c.useState("all"),[H,Ze]=c.useState("all"),[q,Qe]=c.useState("all"),[de,et]=c.useState("0"),[Q,tt]=c.useState(""),[ee,it]=c.useState("all"),[pe,rt]=c.useState(""),F=((Te=a.data)==null?void 0:Te.models)??{},nt=((Le=a.data)==null?void 0:Le.available)??!1,Se=c.useMemo(()=>{var l;return new Set((((l=n.data)==null?void 0:l.providers)??[]).flatMap(m=>m.models.map(o=>o.key)))},[n.data]),lt=l=>{u(l),j(0)},R=l=>m=>{l(m),j(0)},te=c.useMemo(()=>{var M,v,_,$,L,z,$e;const l=new Map($t(s.data??[]).map(d=>[d.model_key,d])),m=[],o=new Set,g=(d,ve,Ee,x)=>{if(o.has(d))return;o.add(d);const C=l.get(d);m.push({key:d,model:Be(ve,Ee),provider:Ee,isDiscovered:Se.has(d),contextWindow:(x==null?void 0:x.contextWindow)??null,inputPrice:C?C.input_price_per_million:(x==null?void 0:x.inputPrice)??null,outputPrice:C?C.output_price_per_million:(x==null?void 0:x.outputPrice)??null,cacheReadPrice:C?C.cache_read_price_per_million:(x==null?void 0:x.cacheReadPrice)??null,cacheWritePrice:C?C.cache_write_price_per_million:(x==null?void 0:x.cacheWritePrice)??null,cacheWrite1hPrice:C?C.cache_write_1h_price_per_million??null:(x==null?void 0:x.cacheWrite1hPrice)??null,pricingTiers:C?C.pricing_tiers??[]:(x==null?void 0:x.pricingTiers)??[],source:C?"configured":(x==null?void 0:x.source)??"none"})};for(const d of((M=r.data)==null?void 0:M.data)??[]){if(d.owned_by===Et)continue;const ve=d.pricing_source==="default"?"default":d.pricing?"configured":"none";g(d.id,d.id,d.owned_by||Oe(d.id),{key:d.id,model:d.id,provider:d.owned_by,contextWindow:d.context_window,inputPrice:((v=d.pricing)==null?void 0:v.input_price_per_million)??null,outputPrice:((_=d.pricing)==null?void 0:_.output_price_per_million)??null,cacheReadPrice:(($=d.pricing)==null?void 0:$.cache_read_price_per_million)??null,cacheWritePrice:((L=d.pricing)==null?void 0:L.cache_write_price_per_million)??null,cacheWrite1hPrice:((z=d.pricing)==null?void 0:z.cache_write_1h_price_per_million)??null,pricingTiers:(($e=d.pricing)==null?void 0:$e.pricing_tiers)??[],source:ve})}for(const d of l.keys())g(d,d,Oe(d));return m},[r.data,s.data,Se]),Ce=c.useMemo(()=>new Map(te.map(l=>[l.key,l])),[te]),ie=c.useMemo(()=>{var o,g,M;const l=te.map(v=>{var _,$;return{...v,contextWindow:v.contextWindow??((_=F[v.key])==null?void 0:_.context_window)??null,releaseDate:(($=F[v.key])==null?void 0:$.release_date)??null}}),m=new Set(l.map(v=>v.key));for(const v of((o=n.data)==null?void 0:o.providers)??[])for(const _ of v.models)m.has(_.key)||(m.add(_.key),l.push({key:_.key,model:Be(_.key,v.provider),provider:v.provider,isDiscovered:!0,contextWindow:((g=F[_.key])==null?void 0:g.context_window)??null,releaseDate:((M=F[_.key])==null?void 0:M.release_date)??null,inputPrice:null,outputPrice:null,cacheReadPrice:null,cacheWritePrice:null,cacheWrite1hPrice:null,pricingTiers:[],source:"none"}));return l},[te,n.data,F]),at=(((Ae=n.data)==null?void 0:Ae.providers)??[]).filter(l=>!l.ok),re=c.useMemo(()=>{const l=Array.from(new Set(ie.map(m=>m.provider))).sort((m,o)=>m.localeCompare(o));return[{value:"all",label:"All providers"},...l.map(m=>({value:m,label:m}))]},[ie]);c.useEffect(()=>{D==="all"||re.length<=1||re.some(l=>l.value===D)||Ne("all")},[re,D]);const U=p.trim().toLowerCase(),he=Number(de)||0,me=Q===""?Number.POSITIVE_INFINITY:Number(Q),st=pe===""?null:Number(pe),xe=ee==="all"?null:Date.now()-Number(ee)*Rt,G=c.useMemo(()=>{const l=o=>{if(U&&!o.key.toLowerCase().includes(U)&&!o.provider.toLowerCase().includes(U)||D!=="all"&&o.provider!==D||K==="configured"&&o.source!=="configured"||K==="default"&&o.source!=="default"||K==="priced"&&o.inputPrice==null||K==="unpriced"&&o.inputPrice!=null||H==="discovered"&&!o.isDiscovered||H==="custom"&&o.isDiscovered)return!1;if(q!=="all"){const g=De.find(v=>v.value===q),M=F[o.key];if(!g||!M||!g.test(M))return!1}if(he>0&&(o.contextWindow==null||o.contextWindowme))return!1;if(xe!=null){const g=o.releaseDate?Date.parse(o.releaseDate):Number.NaN;if(Number.isNaN(g)||g{const M=S.dir==="asc"?1:-1;if(S.col==="model")return o.model.localeCompare(g.model)*M;if(S.col==="released"){const L=o.releaseDate??null,z=g.releaseDate??null;return!L&&!z?o.model.localeCompare(g.model):L?z?(Lz?1:0)*M||o.model.localeCompare(g.model):-1:1}const v=L=>S.col==="input"?L.inputPrice:L.outputPrice,_=v(o),$=v(g);return _==null&&$==null?o.model.localeCompare(g.model):_==null?1:$==null?-1:(_-$)*M||o.model.localeCompare(g.model)};return ie.filter(l).sort(m)},[ie,U,D,K,H,q,he,me,xe,F,S]),J=G.length,ct=Math.max(1,Math.ceil(J/k)),ke=Math.min(P,ct-1),Me=ke*k,fe=G.slice(Me,Me+k),ot={column:S.col,direction:S.dir==="asc"?"ascending":"descending"},ut=l=>{Z({col:String(l.column),dir:l.direction==="ascending"?"asc":"desc"}),j(0)},dt=c.useCallback(l=>h(m=>m===l?null:l),[]),ge=fe.map(l=>l.key),X=Wt(W.selectedKeys,ge),pt=ge.length>0&&X.length===ge.length&&J>X.length,ht=W.allMatching?G.map(l=>l.key):X,We=W.allMatching?J:X.length,Ie=y?G.find(l=>l.key===y)??Ce.get(y)??null:null,mt=async l=>{ye(!0),Pe(void 0);try{for(const m of ht)await f.mutateAsync({model_key:m,input_price_per_million:l.input_price_per_million,output_price_per_million:l.output_price_per_million,cache_read_price_per_million:l.cache_read_price_per_million??null,cache_write_price_per_million:l.cache_write_price_per_million??null,cache_write_1h_price_per_million:null,pricing_tiers:[]});W.clear(),ue(!1)}catch(m){Pe(m)}finally{ye(!1)}},xt=r.isLoading||s.isLoading||n.isLoading,ft=U!==""||D!=="all"||K!=="all"||H!=="all"||q!=="all"||de!=="0"||Q!==""||ee!=="all"?"No models match your filters.":"No models yet. Add a provider on the Providers page, or price a model below.",ne=N?G.find(l=>l.key===N)??Ce.get(N)??null:null;return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(Pt,{title:"Models",description:"Every model your providers can serve. Set a price on any model so budgets and usage tracking work."}),e.jsx(Nt,{error:r.error??s.error??n.error??a.error}),e.jsxs("div",{className:`grid gap-4 lg:items-start ${ne?"lg:grid-cols-[minmax(0,1fr)_360px]":"grid-cols-1"}`,children:[e.jsxs("div",{className:"flex min-w-0 flex-col gap-3",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(Ut,{value:p,onChange:lt,placeholder:"Search models…"}),e.jsx(B,{ariaLabel:"Filter by provider",value:D,onChange:R(Ne),options:re}),e.jsx(B,{ariaLabel:"Filter by pricing",value:K,onChange:R(Xe),options:[{value:"all",label:"Any pricing"},{value:"configured",label:"Custom price"},{value:"default",label:"Default price"},{value:"priced",label:"Priced"},{value:"unpriced",label:"Unpriced"}]}),e.jsx(B,{ariaLabel:"Filter by source",value:H,onChange:R(Ze),options:[{value:"all",label:"Any source"},{value:"discovered",label:"Discovered"},{value:"custom",label:"Custom (not discovered)"}]}),e.jsx(B,{ariaLabel:"Filter by capability",value:q,onChange:R(Qe),options:[{value:"all",label:"Any capability"},...De.map(l=>({value:l.value,label:l.label}))]}),e.jsx(B,{ariaLabel:"Minimum context window",value:de,onChange:R(et),options:Dt}),e.jsx(B,{ariaLabel:"Maximum input price",value:Q,onChange:R(tt),options:Ft}),e.jsx(B,{ariaLabel:"Compare prices at context",value:pe,onChange:rt,options:Bt}),e.jsx(B,{ariaLabel:"Filter by release date",value:ee,onChange:R(it),options:Kt})]}),e.jsx(ii,{providers:at}),X.length>0?e.jsx(It,{selectedCount:We,allMatching:W.allMatching,matchingTotal:J,canSelectAllMatching:pt,onSelectAllMatching:W.enableAllMatching,onClear:W.clear,children:e.jsx(A,{size:"sm",variant:"primary",onPress:()=>ue(!0),children:"Set pricing"})}):null,e.jsx(ti,{rows:fe,isLoading:xt,empty:ft,sortDescriptor:ot,onSortChange:ut,selectedKey:N,onSelect:O,onEditPricing:dt,comparisonContextTokens:st,selectedKeys:W.selectedKeys,onSelectionChange:W.onSelectionChange}),Ie?e.jsx(se,{children:e.jsxs(se.Content,{className:"p-0",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-[var(--otari-line)] px-4 py-2",children:[e.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Edit pricing"}),e.jsx(A,{size:"sm",variant:"ghost",onPress:()=>h(null),children:"Close"})]}),e.jsx(Xt,{row:Ie,onClose:()=>h(null)})]})}):null,e.jsx(Lt,{page:ke,pageSize:k,total:J,rowsOnPage:fe.length,onPageChange:j,onPageSizeChange:l=>{T(l),j(0)},pageSizeOptions:[15,25,50]})]}),ne?e.jsx("aside",{className:"lg:sticky lg:top-4",children:e.jsx(Ht,{row:ne,metadata:F[ne.key],metadataAvailable:nt,onMakeAlias:l=>t(`/aliases?target=${encodeURIComponent(l)}`),onClose:()=>O(null)})}):null]}),e.jsx(At,{isOpen:Ue,onOpenChange:ue,targetCount:We,isPending:Ge,error:Je,onSubmit:mt,title:"Set pricing",description:l=>`Apply these per-1M rates to ${l.toLocaleString()} selected ${l===1?"model":"models"}. This replaces each model's price; pricing tiers and the 1h cache rate are cleared. Edit a single model for tiers.`})]})}export{pi as ModelsPage}; diff --git a/src/gateway/static/dashboard/assets/OverviewPage-CX9hXHG1.js b/src/gateway/static/dashboard/assets/OverviewPage-B4Niis7e.js similarity index 98% rename from src/gateway/static/dashboard/assets/OverviewPage-CX9hXHG1.js rename to src/gateway/static/dashboard/assets/OverviewPage-B4Niis7e.js index 3d241296..3c017fb7 100644 --- a/src/gateway/static/dashboard/assets/OverviewPage-CX9hXHG1.js +++ b/src/gateway/static/dashboard/assets/OverviewPage-B4Niis7e.js @@ -1 +1 @@ -import{j as t}from"./tanstack-query-1t81HyiD.js";import{r as b,i as rt,N as G}from"./react-dgEcD0HR.js";import{K as at,d as j,L as st,l as nt,a as ot,u as it,b as lt,M as w,P as dt,R as ct,E as I,S as p,N as _,O as N,Q as R,T as D,U as ut}from"./index-CGnfXTEF.js";import{S as q}from"./charts-DIsd9m--.js";import{D as mt}from"./DataTable-Bmn_eYSV.js";import{d as H,B as vt}from"./heroui-BI50yK5B.js";import"./recharts-C4kRDmvS.js";function M(e){return e==="neutral"?void 0:e}const ht=.02,xt=.1;function B(e){if(!e||e.request_count===0)return{rate:null,status:"neutral"};const i=e.error_count/e.request_count,a=i>=xt?"alert":i>=ht?"warn":"ok";return{rate:i,status:a}}function ft(e){return!e||e.total===0?"neutral":e.healthy>=e.total?"ok":e.healthy===0?"alert":"warn"}const pt=.8;function gt(e){if(e.length===0)return{status:"neutral",label:"No budgets configured",overCount:0,nearCount:0,cappedCount:0};const i=e.filter(r=>r.max_budget!==null&&r.user_count>0);if(i.length===0)return{status:"neutral",label:"No capped budgets",overCount:0,nearCount:0,cappedCount:0};let a=0,s=0,n,c=-1;for(const r of i){const o=r.max_budget*r.user_count,l=o>0?r.total_spend/o:0;l>=1?a+=1:l>=pt&&(s+=1),l>c&&(c=l,n={name:r.name??r.budget_id,spent:r.total_spend,allocated:o,pct:l})}const d=a>0?"alert":s>0?"warn":"ok",g=a>0?`${a} over limit`:s>0?`${s} near limit`:"All within budget";return{status:d,label:g,overCount:a,nearCount:s,cappedCount:i.length,worst:n}}const K=864e5,T=30;function W(){const e=new Date;return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`}function bt(){const[e,i]=b.useState(W);return b.useEffect(()=>{const a=()=>{if(document.visibilityState==="visible"){const s=W();i(n=>n===s?n:s)}};return document.addEventListener("visibilitychange",a),window.addEventListener("focus",a),()=>{document.removeEventListener("visibilitychange",a),window.removeEventListener("focus",a)}},[]),b.useMemo(()=>{const a=Date.now(),s=new Date(a);return{today:new Date(s.getFullYear(),s.getMonth(),s.getDate()).toISOString(),periodStart:new Date(a-T*K).toISOString(),prevStart:new Date(a-2*T*K).toISOString()}},[e])}const yt={ok:"Healthy",warn:"Elevated",alert:"High"},St={ok:"On track",warn:"Near limit",alert:"Over budget"};function Ft(){const e=at();return e.isLoading?null:t.jsx(jt,{needsSetup:e.isSuccess&&e.data.providers.length===0})}function jt({needsSetup:e=!1}){var O,L,A,$,F,P,U;const i=bt(),a=b.useMemo(()=>({start_date:i.today}),[i]),s=b.useMemo(()=>({start_date:i.periodStart}),[i]),n=b.useMemo(()=>({start_date:i.prevStart,end_date:i.periodStart}),[i]),c=j(a,"hour"),d=j(s,"day"),g=j(n,"day"),r=st(),o=nt(),l=ot(),y=it(),h=lt({},0,5),E=(O=c.data)==null?void 0:O.totals,v=(L=d.data)==null?void 0:L.totals,x=(A=g.data)==null?void 0:A.totals,S=(($=d.data)==null?void 0:$.series)??[],C=S.length>1,u=B(v),k=B(x),Y=u.rate!==null&&k.rate!==null?w(u.rate,k.rate):null,m=gt(o.data??[]),Q=ft(r.data),V=(l.data??[]).filter(f=>f.is_active).length,z=(y.data??[]).filter(f=>!f.blocked).length,J=(((F=h.data)==null?void 0:F.length)??0)>0,X=e&&h.isSuccess&&!J,Z=c.error??d.error??r.error??o.error??l.error??y.error,tt=()=>{c.refetch(),d.refetch(),g.refetch(),r.refetch(),o.refetch(),l.refetch(),y.refetch(),h.refetch()},et=c.isFetching||d.isFetching||r.isFetching||o.isFetching||l.isFetching||y.isFetching||h.isFetching;return t.jsxs("div",{className:"flex flex-col gap-6",children:[t.jsx(dt,{title:"Overview",description:"At-a-glance spend, traffic, and health across the gateway.",action:t.jsx(ct,{onRefresh:tt,isFetching:et,updatedAt:d.dataUpdatedAt})}),X?t.jsx(wt,{}):null,t.jsx(I,{error:Z}),t.jsx(Rt,{providerHealth:Q,healthy:((P=r.data)==null?void 0:P.healthy)??0,total:((U=r.data)==null?void 0:U.total)??0,budget:m,errStatus:u.status,errRate:u.rate,ready:r.isSuccess&&o.isSuccess&&d.isSuccess,failed:r.isError||o.isError||d.isError}),t.jsxs("div",{className:"grid grid-cols-2 gap-4 sm:grid-cols-3 xl:grid-cols-4",children:[t.jsx(p,{label:"Spend today",value:E?_(E.cost):"—"}),t.jsx(p,{label:"Spend, last 30 days",value:v?_(v.cost):"—",hint:v?t.jsx(N,{fraction:w(v.cost,x==null?void 0:x.cost)}):null,chart:C?t.jsx(q,{values:S.map(f=>f.cost),ariaLabel:"Spend trend over the last 30 days"}):void 0}),t.jsx(p,{label:"Requests, last 30 days",value:v?R(v.request_count):"—",hint:v?t.jsx(N,{fraction:w(v.request_count,x==null?void 0:x.request_count)}):null,chart:C?t.jsx(q,{values:S.map(f=>f.requests),ariaLabel:"Request volume trend over the last 30 days"}):void 0}),t.jsx(p,{label:"Error rate, last 30 days",value:u.rate===null?"—":D(u.rate),status:M(u.status),statusLabel:u.status==="neutral"?void 0:yt[u.status],hint:u.rate!==null?t.jsx(N,{fraction:Y}):null}),t.jsx(p,{label:"Budget health",value:o.data&&m.worst?D(m.worst.pct):"—",status:o.data?M(m.status):void 0,statusLabel:o.data&&m.status!=="neutral"?St[m.status]:void 0,hint:o.data?m.worst?`${m.label} · worst: ${m.worst.name}`:m.label:void 0,to:"/budgets"}),t.jsx(p,{label:"Active keys",value:l.data?R(V):"—",to:"/keys"}),t.jsx(p,{label:"Active users",value:y.data?R(z):"—",to:"/users"})]}),t.jsx(Dt,{entries:h.data??[],loading:h.isLoading,error:h.error})]})}function wt(){const e=rt();return t.jsx(H,{children:t.jsxs(H.Content,{className:"flex flex-col gap-3 p-6",children:[t.jsxs("div",{children:[t.jsx("h2",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:"Get started with Otari"}),t.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:"Add a provider to begin serving models. Once it is configured, this page will show your gateway’s traffic, spend, and health."})]}),t.jsx("div",{children:t.jsx(vt,{variant:"primary",onPress:()=>e("/providers"),children:"Add your first provider"})})]})})}function Nt({text:e}){return t.jsx("div",{role:"status",className:"flex items-center gap-2 rounded-xl border border-[var(--otari-line)] bg-[var(--otari-bg)] px-4 py-3 text-sm text-[var(--otari-muted)]",children:e})}function Rt({providerHealth:e,healthy:i,total:a,budget:s,errStatus:n,errRate:c,ready:d,failed:g}){if(g)return t.jsx(Nt,{text:"Some status data could not be loaded."});if(!d)return null;const r=[];if((e==="warn"||e==="alert")&&a>0){const o=a-i;r.push({text:`${o} provider${o===1?"":"s"} unreachable`,to:"/providers"})}return s.overCount>0?r.push({text:`${s.overCount} budget${s.overCount===1?"":"s"} over limit`,to:"/budgets"}):s.nearCount>0&&r.push({text:`${s.nearCount} budget${s.nearCount===1?"":"s"} near limit`,to:"/budgets"}),n==="alert"&&c!==null&&r.push({text:`error rate ${D(c)}`,to:"/activity?status=error"}),r.length===0?null:t.jsxs("div",{role:"alert",className:"flex flex-col gap-2 rounded-xl border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-900 sm:flex-row sm:flex-wrap sm:items-center",children:[t.jsx("span",{className:"font-medium",children:"Needs attention:"}),r.map((o,l)=>t.jsxs("span",{className:"flex items-center gap-2",children:[l>0?t.jsx("span",{"aria-hidden":!0,className:"text-amber-400",children:"·"}):null,t.jsx(G,{to:o.to,className:"underline underline-offset-2 hover:text-amber-950",children:o.text})]},o.to+o.text))]})}function _t(e){return e==="error"?"error":"ok"}function Dt({entries:e,loading:i,error:a}){const s=[{id:"time",header:"Time",cell:n=>t.jsx("span",{className:"text-[var(--otari-muted)]",title:new Date(n.timestamp).toLocaleString(),children:ut(n.timestamp)})},{id:"model",header:"Model",isRowHeader:!0,cell:n=>t.jsx("span",{className:"text-[var(--otari-ink)]",children:n.model})},{id:"cost",header:"Cost",align:"end",cell:n=>n.cost===null?"—":_(n.cost)},{id:"status",header:"Status",cell:n=>t.jsx("span",{className:`inline-flex items-center rounded-full border px-2 py-0.5 text-xs font-medium ${n.status==="error"?"border-red-200 bg-red-50 text-red-700":"border-[var(--otari-line)] bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]"}`,children:_t(n.status)})}];return t.jsxs("div",{className:"flex flex-col gap-3",children:[t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Recent activity"}),t.jsx(G,{to:"/activity",className:"text-sm text-[var(--otari-brand-dark)] hover:underline",children:"View all →"})]}),t.jsx(I,{error:a}),t.jsx(mt,{ariaLabel:"Recent activity",columns:s,rows:e,getRowKey:n=>n.id,isLoading:i,emptyContent:"No requests yet. Once the gateway serves traffic, it appears here."})]})}export{Ft as OverviewIndex,jt as OverviewPage,W as localDayKey}; +import{j as t}from"./tanstack-query-1t81HyiD.js";import{r as b,i as rt,N as G}from"./react-dgEcD0HR.js";import{K as at,d as j,L as st,l as nt,a as ot,u as it,b as lt,M as w,P as dt,R as ct,E as I,S as p,N as _,O as N,Q as R,T as D,U as ut}from"./index-DHi1jXMu.js";import{S as q}from"./charts-DIsd9m--.js";import{D as mt}from"./DataTable-Bmn_eYSV.js";import{d as H,B as vt}from"./heroui-BI50yK5B.js";import"./recharts-C4kRDmvS.js";function M(e){return e==="neutral"?void 0:e}const ht=.02,xt=.1;function B(e){if(!e||e.request_count===0)return{rate:null,status:"neutral"};const i=e.error_count/e.request_count,a=i>=xt?"alert":i>=ht?"warn":"ok";return{rate:i,status:a}}function ft(e){return!e||e.total===0?"neutral":e.healthy>=e.total?"ok":e.healthy===0?"alert":"warn"}const pt=.8;function gt(e){if(e.length===0)return{status:"neutral",label:"No budgets configured",overCount:0,nearCount:0,cappedCount:0};const i=e.filter(r=>r.max_budget!==null&&r.user_count>0);if(i.length===0)return{status:"neutral",label:"No capped budgets",overCount:0,nearCount:0,cappedCount:0};let a=0,s=0,n,c=-1;for(const r of i){const o=r.max_budget*r.user_count,l=o>0?r.total_spend/o:0;l>=1?a+=1:l>=pt&&(s+=1),l>c&&(c=l,n={name:r.name??r.budget_id,spent:r.total_spend,allocated:o,pct:l})}const d=a>0?"alert":s>0?"warn":"ok",g=a>0?`${a} over limit`:s>0?`${s} near limit`:"All within budget";return{status:d,label:g,overCount:a,nearCount:s,cappedCount:i.length,worst:n}}const K=864e5,T=30;function W(){const e=new Date;return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`}function bt(){const[e,i]=b.useState(W);return b.useEffect(()=>{const a=()=>{if(document.visibilityState==="visible"){const s=W();i(n=>n===s?n:s)}};return document.addEventListener("visibilitychange",a),window.addEventListener("focus",a),()=>{document.removeEventListener("visibilitychange",a),window.removeEventListener("focus",a)}},[]),b.useMemo(()=>{const a=Date.now(),s=new Date(a);return{today:new Date(s.getFullYear(),s.getMonth(),s.getDate()).toISOString(),periodStart:new Date(a-T*K).toISOString(),prevStart:new Date(a-2*T*K).toISOString()}},[e])}const yt={ok:"Healthy",warn:"Elevated",alert:"High"},St={ok:"On track",warn:"Near limit",alert:"Over budget"};function Ft(){const e=at();return e.isLoading?null:t.jsx(jt,{needsSetup:e.isSuccess&&e.data.providers.length===0})}function jt({needsSetup:e=!1}){var O,L,A,$,F,P,U;const i=bt(),a=b.useMemo(()=>({start_date:i.today}),[i]),s=b.useMemo(()=>({start_date:i.periodStart}),[i]),n=b.useMemo(()=>({start_date:i.prevStart,end_date:i.periodStart}),[i]),c=j(a,"hour"),d=j(s,"day"),g=j(n,"day"),r=st(),o=nt(),l=ot(),y=it(),h=lt({},0,5),E=(O=c.data)==null?void 0:O.totals,v=(L=d.data)==null?void 0:L.totals,x=(A=g.data)==null?void 0:A.totals,S=(($=d.data)==null?void 0:$.series)??[],C=S.length>1,u=B(v),k=B(x),Y=u.rate!==null&&k.rate!==null?w(u.rate,k.rate):null,m=gt(o.data??[]),Q=ft(r.data),V=(l.data??[]).filter(f=>f.is_active).length,z=(y.data??[]).filter(f=>!f.blocked).length,J=(((F=h.data)==null?void 0:F.length)??0)>0,X=e&&h.isSuccess&&!J,Z=c.error??d.error??r.error??o.error??l.error??y.error,tt=()=>{c.refetch(),d.refetch(),g.refetch(),r.refetch(),o.refetch(),l.refetch(),y.refetch(),h.refetch()},et=c.isFetching||d.isFetching||r.isFetching||o.isFetching||l.isFetching||y.isFetching||h.isFetching;return t.jsxs("div",{className:"flex flex-col gap-6",children:[t.jsx(dt,{title:"Overview",description:"At-a-glance spend, traffic, and health across the gateway.",action:t.jsx(ct,{onRefresh:tt,isFetching:et,updatedAt:d.dataUpdatedAt})}),X?t.jsx(wt,{}):null,t.jsx(I,{error:Z}),t.jsx(Rt,{providerHealth:Q,healthy:((P=r.data)==null?void 0:P.healthy)??0,total:((U=r.data)==null?void 0:U.total)??0,budget:m,errStatus:u.status,errRate:u.rate,ready:r.isSuccess&&o.isSuccess&&d.isSuccess,failed:r.isError||o.isError||d.isError}),t.jsxs("div",{className:"grid grid-cols-2 gap-4 sm:grid-cols-3 xl:grid-cols-4",children:[t.jsx(p,{label:"Spend today",value:E?_(E.cost):"—"}),t.jsx(p,{label:"Spend, last 30 days",value:v?_(v.cost):"—",hint:v?t.jsx(N,{fraction:w(v.cost,x==null?void 0:x.cost)}):null,chart:C?t.jsx(q,{values:S.map(f=>f.cost),ariaLabel:"Spend trend over the last 30 days"}):void 0}),t.jsx(p,{label:"Requests, last 30 days",value:v?R(v.request_count):"—",hint:v?t.jsx(N,{fraction:w(v.request_count,x==null?void 0:x.request_count)}):null,chart:C?t.jsx(q,{values:S.map(f=>f.requests),ariaLabel:"Request volume trend over the last 30 days"}):void 0}),t.jsx(p,{label:"Error rate, last 30 days",value:u.rate===null?"—":D(u.rate),status:M(u.status),statusLabel:u.status==="neutral"?void 0:yt[u.status],hint:u.rate!==null?t.jsx(N,{fraction:Y}):null}),t.jsx(p,{label:"Budget health",value:o.data&&m.worst?D(m.worst.pct):"—",status:o.data?M(m.status):void 0,statusLabel:o.data&&m.status!=="neutral"?St[m.status]:void 0,hint:o.data?m.worst?`${m.label} · worst: ${m.worst.name}`:m.label:void 0,to:"/budgets"}),t.jsx(p,{label:"Active keys",value:l.data?R(V):"—",to:"/keys"}),t.jsx(p,{label:"Active users",value:y.data?R(z):"—",to:"/users"})]}),t.jsx(Dt,{entries:h.data??[],loading:h.isLoading,error:h.error})]})}function wt(){const e=rt();return t.jsx(H,{children:t.jsxs(H.Content,{className:"flex flex-col gap-3 p-6",children:[t.jsxs("div",{children:[t.jsx("h2",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:"Get started with Otari"}),t.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:"Add a provider to begin serving models. Once it is configured, this page will show your gateway’s traffic, spend, and health."})]}),t.jsx("div",{children:t.jsx(vt,{variant:"primary",onPress:()=>e("/providers"),children:"Add your first provider"})})]})})}function Nt({text:e}){return t.jsx("div",{role:"status",className:"flex items-center gap-2 rounded-xl border border-[var(--otari-line)] bg-[var(--otari-bg)] px-4 py-3 text-sm text-[var(--otari-muted)]",children:e})}function Rt({providerHealth:e,healthy:i,total:a,budget:s,errStatus:n,errRate:c,ready:d,failed:g}){if(g)return t.jsx(Nt,{text:"Some status data could not be loaded."});if(!d)return null;const r=[];if((e==="warn"||e==="alert")&&a>0){const o=a-i;r.push({text:`${o} provider${o===1?"":"s"} unreachable`,to:"/providers"})}return s.overCount>0?r.push({text:`${s.overCount} budget${s.overCount===1?"":"s"} over limit`,to:"/budgets"}):s.nearCount>0&&r.push({text:`${s.nearCount} budget${s.nearCount===1?"":"s"} near limit`,to:"/budgets"}),n==="alert"&&c!==null&&r.push({text:`error rate ${D(c)}`,to:"/activity?status=error"}),r.length===0?null:t.jsxs("div",{role:"alert",className:"flex flex-col gap-2 rounded-xl border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-900 sm:flex-row sm:flex-wrap sm:items-center",children:[t.jsx("span",{className:"font-medium",children:"Needs attention:"}),r.map((o,l)=>t.jsxs("span",{className:"flex items-center gap-2",children:[l>0?t.jsx("span",{"aria-hidden":!0,className:"text-amber-400",children:"·"}):null,t.jsx(G,{to:o.to,className:"underline underline-offset-2 hover:text-amber-950",children:o.text})]},o.to+o.text))]})}function _t(e){return e==="error"?"error":"ok"}function Dt({entries:e,loading:i,error:a}){const s=[{id:"time",header:"Time",cell:n=>t.jsx("span",{className:"text-[var(--otari-muted)]",title:new Date(n.timestamp).toLocaleString(),children:ut(n.timestamp)})},{id:"model",header:"Model",isRowHeader:!0,cell:n=>t.jsx("span",{className:"text-[var(--otari-ink)]",children:n.model})},{id:"cost",header:"Cost",align:"end",cell:n=>n.cost===null?"—":_(n.cost)},{id:"status",header:"Status",cell:n=>t.jsx("span",{className:`inline-flex items-center rounded-full border px-2 py-0.5 text-xs font-medium ${n.status==="error"?"border-red-200 bg-red-50 text-red-700":"border-[var(--otari-line)] bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]"}`,children:_t(n.status)})}];return t.jsxs("div",{className:"flex flex-col gap-3",children:[t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Recent activity"}),t.jsx(G,{to:"/activity",className:"text-sm text-[var(--otari-brand-dark)] hover:underline",children:"View all →"})]}),t.jsx(I,{error:a}),t.jsx(mt,{ariaLabel:"Recent activity",columns:s,rows:e,getRowKey:n=>n.id,isLoading:i,emptyContent:"No requests yet. Once the gateway serves traffic, it appears here."})]})}export{Ft as OverviewIndex,jt as OverviewPage,W as localDayKey}; diff --git a/src/gateway/static/dashboard/assets/ProvidersPage-DQdazSS9.js b/src/gateway/static/dashboard/assets/ProvidersPage-BX7hxsKz.js similarity index 99% rename from src/gateway/static/dashboard/assets/ProvidersPage-DQdazSS9.js rename to src/gateway/static/dashboard/assets/ProvidersPage-BX7hxsKz.js index baf27910..67c75d78 100644 --- a/src/gateway/static/dashboard/assets/ProvidersPage-DQdazSS9.js +++ b/src/gateway/static/dashboard/assets/ProvidersPage-BX7hxsKz.js @@ -1 +1 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as x,L as M}from"./react-dgEcD0HR.js";import{K as Y,V,H as W,L as G,W as X,X as Z,Y as J,P as Q,E as I,I as ee,Z as te,_ as se,U as $,C as ae,$ as O,a0 as ne,D as q,a1 as re,a2 as ie}from"./index-CGnfXTEF.js";import{F as S}from"./Field-Dwp6u3t8.js";import{D as oe}from"./DataTable-Bmn_eYSV.js";import{B as f,d as _,f as de,T as le,L as F,I as H,D as ce,S as me,C as T,a as ue,b as xe}from"./heroui-BI50yK5B.js";function R({value:s,onChange:a,label:t,placeholder:r,description:i}){return e.jsxs(le,{value:s,onChange:a,className:"flex max-w-md flex-col gap-1",children:[e.jsx(F,{className:"text-sm font-medium text-[var(--otari-ink)]",children:t}),e.jsx(H,{type:"password",placeholder:r??"sk-…",autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",spellCheck:!1,"data-1p-ignore":!0,"data-lpignore":"true"}),i?e.jsx(ce,{className:"text-xs text-[var(--otari-muted)]",children:i}):null]})}function U({label:s,value:a,onChange:t,description:r,placeholder:i,extra:l=[],includeCatalog:m=!0}){var k;const g=re(),u=x.useMemo(()=>m?[...l,...(g.data??[]).map(o=>({id:o.id,name:o.name}))]:l,[g.data,l,m]),[p,c]=x.useState(()=>{var o;return((o=u.find(y=>y.id===a))==null?void 0:o.name)??""}),j=((k=u.find(o=>o.id===a))==null?void 0:k.name)??"",h=p.trim()===j.trim()?"":p.trim().toLowerCase(),d=u.filter(o=>!h||o.name.toLowerCase().includes(h)||o.id.toLowerCase().includes(h)).slice(0,50);return e.jsxs(T.Root,{allowsEmptyCollection:!0,menuTrigger:"focus",inputValue:p,onInputChange:c,onSelectionChange:o=>{var y;o!=null?(t(String(o)),c(((y=u.find(N=>N.id===String(o)))==null?void 0:y.name)??"")):(t(""),c(""))},className:"flex max-w-md flex-col gap-1",children:[e.jsx(F,{className:"text-sm font-medium text-[var(--otari-ink)]",children:s}),e.jsxs(T.InputGroup,{children:[e.jsx(H,{placeholder:i??"Search providers…",autoComplete:"off","data-1p-ignore":!0,"data-lpignore":"true",onFocus:o=>o.currentTarget.select()}),e.jsx(T.Trigger,{})]}),e.jsx(T.Popover,{children:e.jsx(ue,{items:d,className:"max-h-72 overflow-auto",children:o=>e.jsx(xe,{id:o.id,textValue:o.name,children:o.name})})}),r?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:r}):null]})}function z({getPayload:s}){const a=ie(),t=s();return e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx(f,{variant:"outline",isDisabled:t===null||a.isPending,onPress:()=>{t&&a.mutate(t)},children:a.isPending?"Testing…":"Test connection"}),e.jsx("span",{role:"status","aria-live":"polite",children:a.isPending?null:a.error?e.jsx("span",{className:"text-xs text-red-700",children:q(a.error)}):a.data?a.data.ok?e.jsxs("span",{className:"text-xs font-medium text-green-700",children:["Connected. ",a.data.model_count," model",a.data.model_count===1?"":"s"," available."]}):e.jsx("span",{className:"block max-w-md break-words text-xs text-red-700",children:a.data.error??"Connection failed."}):null})]})}function pe({onClose:s}){var w;const a=O(),[t,r]=x.useState(""),[i,l]=x.useState(""),[m,g]=x.useState(!1),[u,p]=x.useState(""),[c,j]=x.useState(""),h=ne(t),d=((w=h.data)==null?void 0:w.id)===t?h.data:void 0;x.useEffect(()=>{d&&p(d.default_api_base??"")},[d]);const k=(d==null?void 0:d.env_key_present)??!1,o=((d==null?void 0:d.requires_api_key)??!0)&&!k,y=c.trim()!==""&&c.trim()!==t,N=/[:/]/.test(c),P=t!==""&&!N&&(!o||i.trim()!=="")&&!a.isPending,A=()=>{P&&a.mutate({instance:y?c.trim():t,provider_type:y?t:null,api_base:u.trim()||null,api_key:i.trim()||null},{onSuccess:s})};return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(I,{error:a.error}),e.jsx(U,{label:"Provider",value:t,onChange:C=>{r(C),j(""),p("")},description:"Its endpoint is built in."}),e.jsx(R,{value:i,onChange:l,label:d&&!o?"API key (optional)":"API key",description:d?o?`${d.name}'s endpoint is built in — just add your key.`:k?`${d.env_key} is set on the server, so a key is optional here. Paste one to override it.`:`${d.name} needs no API key.`:"Stored encrypted. Requires OTARI_SECRET_KEY on the server."}),e.jsx("button",{type:"button",className:"self-start text-xs font-medium text-[var(--otari-brand-dark)]",onClick:()=>g(C=>!C),children:m?"Hide advanced":"Advanced (API base, rename)"}),m?e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(S,{label:"API base",value:u,onChange:p,placeholder:(d==null?void 0:d.default_api_base)??"https://…/v1",description:"Only if you route through a proxy. Blank uses the built-in default."}),e.jsx(S,{label:"Name",value:c,onChange:j,placeholder:t||"instance name",description:N?e.jsx("span",{className:"text-red-700",children:"A name cannot contain “:” or “/”."}):"Rename to run two instances of the same provider."})]}):null,e.jsxs("div",{className:"flex flex-wrap items-start gap-2",children:[e.jsx(f,{variant:"primary",isDisabled:!P,onPress:A,children:a.isPending?"Adding…":"Add provider"}),e.jsx(f,{variant:"ghost",onPress:s,children:"Cancel"}),e.jsx(z,{getPayload:()=>t===""?null:{instance:y?c.trim():t,provider_type:y?t:null,api_base:u.trim()||null,api_key:i.trim()||null}})]})]})}function he({onClose:s}){const a=O(),[t,r]=x.useState(""),[i,l]=x.useState("openai-compatible"),[m,g]=x.useState(""),[u,p]=x.useState(""),c=/[:/]/.test(t),j=t.trim()!==""&&!c&&m.trim()!==""&&!a.isPending,h=()=>{j&&a.mutate({instance:t.trim(),provider_type:i||"openai-compatible",api_base:m.trim(),api_key:u.trim()||null},{onSuccess:s})};return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(I,{error:a.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(S,{label:"Name",value:t,onChange:r,placeholder:"my-local-llm",isRequired:!0,autoFocus:!0,description:c?e.jsx("span",{className:"text-red-700",children:"A name cannot contain “:” or “/”."}):"Call it whatever you want."}),e.jsx(U,{label:"Compatible with",value:i,onChange:l,includeCatalog:!1,description:"The API this endpoint speaks.",extra:[{id:"openai-compatible",name:"OpenAI"},{id:"anthropic-compatible",name:"Anthropic"}]})]}),e.jsx(S,{label:"API base",value:m,onChange:g,placeholder:"http://localhost:8000/v1",isRequired:!0,description:"The endpoint URL of your server."}),e.jsx(R,{value:u,onChange:p,label:"API key (optional)",description:"Many local backends need none. Stored encrypted."}),e.jsxs("div",{className:"flex flex-wrap items-start gap-2",children:[e.jsx(f,{variant:"primary",isDisabled:!j,onPress:h,children:a.isPending?"Adding…":"Add provider"}),e.jsx(f,{variant:"ghost",onPress:s,children:"Cancel"}),e.jsx(z,{getPayload:()=>t.trim()===""||m.trim()===""?null:{instance:t.trim(),provider_type:i||"openai-compatible",api_base:m.trim(),api_key:u.trim()||null}})]})]})}function ve({onClose:s}){const[a,t]=x.useState("known");return e.jsx(_,{children:e.jsxs(_.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsx("div",{className:"flex items-center justify-between",children:e.jsx("div",{className:"flex items-center gap-1 rounded-lg bg-[var(--otari-bg)] p-1",children:[["known","Known provider"],["custom","Custom endpoint"]].map(([r,i])=>e.jsx("button",{type:"button","aria-pressed":a===r,onClick:()=>t(r),className:a===r?"rounded-md bg-white px-3 py-1.5 text-sm font-medium text-[var(--otari-ink)] shadow-sm":"rounded-md px-3 py-1.5 text-sm text-[var(--otari-muted)] hover:text-[var(--otari-ink)]",children:i},r))})}),a==="known"?e.jsx(pe,{onClose:s}):e.jsx(he,{onClose:s})]})})}function ge({provider:s,onClose:a}){const t=te(),[r,i]=x.useState(s.provider_type??""),[l,m]=x.useState(s.api_base??""),[g,u]=x.useState(!1),[p,c]=x.useState(""),j=()=>{if(t.isPending)return;const h={provider_type:r.trim()||null,api_base:l.trim()||null,expected_updated_at:s.updated_at};g&&p.trim()&&(h.api_key=p.trim()),t.mutate({instance:s.instance,body:h},{onSuccess:a})};return e.jsx(_,{children:e.jsxs(_.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsxs("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:["Edit ",e.jsx("code",{children:s.instance})]}),e.jsx(I,{error:t.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(S,{label:"Provider type",value:r,onChange:i,placeholder:"openai"}),e.jsx(S,{label:"API base",value:l,onChange:m,placeholder:"https://api.openai.com/v1"})]}),e.jsx("div",{className:"flex flex-col gap-2",children:g?e.jsxs(e.Fragment,{children:[e.jsx(R,{value:p,onChange:c,label:"New API key",description:"Stored encrypted. The old key is replaced when you save."}),e.jsx("button",{type:"button",className:"self-start text-xs font-medium text-[var(--otari-brand-dark)]",onClick:()=>{u(!1),c("")},children:"Keep the current key"})]}):e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("span",{className:"text-sm text-[var(--otari-muted)]",children:["API key: ",e.jsx("code",{children:s.last4?`••••${s.last4}`:"none set"})]}),e.jsx(f,{size:"sm",variant:"outline",onPress:()=>u(!0),children:"Replace key"})]})}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(f,{variant:"primary",isDisabled:t.isPending,onPress:j,children:t.isPending?"Saving…":"Save changes"}),e.jsx(f,{variant:"ghost",onPress:a,children:"Cancel"})]})]})})}function fe(s,a){const t=new Map((a??[]).map(l=>[l.instance,l])),r=new Map((s??[]).map(l=>[l.instance,l]));return[...new Set([...t.keys(),...r.keys()])].sort().map(l=>{const m=t.get(l);return{instance:l,source:m?"stored":"config",stored:m,meta:r.get(l)}})}function je({state:s}){return s?s.status==="pending"?e.jsxs("span",{className:"inline-flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:[e.jsx(me,{size:"sm"})," Testing…"]}):s.ok?e.jsxs("span",{className:"text-xs font-medium text-green-700",children:["Connected. ",s.model_count," model",s.model_count===1?"":"s"," available."]}):e.jsx("span",{className:"block max-w-xs break-words text-xs text-red-700",children:s.error??"Connection failed."}):null}function ye({health:s}){if(!s)return e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"—"});const a=s.ok?"border-green-200 bg-green-50 text-green-700":"border-red-200 bg-red-50 text-red-700",t=s.checked_at?`Last checked ${$(s.checked_at)}`:"Not checked yet",r=s.ok?t:`${s.error??"Unreachable"} · ${t}`;return e.jsxs("span",{title:r,className:`inline-flex items-center gap-1.5 rounded-full border px-2.5 py-0.5 text-xs font-medium ${a}`,children:[e.jsx("span",{"aria-hidden":!0,className:`h-1.5 w-1.5 rounded-full ${s.ok?"bg-green-500":"bg-red-500"}`}),s.ok?"Reachable":"Unreachable"]})}function be({healthy:s,total:a,checkedAt:t}){const r=s===a,i=se();return e.jsxs("div",{className:"flex flex-wrap items-center gap-3 rounded-xl border border-[var(--otari-line)] bg-[var(--otari-surface)] px-4 py-2.5 text-sm",children:[e.jsx("span",{"aria-hidden":!0,className:`h-2 w-2 rounded-full ${r?"bg-green-500":"bg-red-500"}`}),e.jsxs("span",{className:"font-medium text-[var(--otari-ink)]",children:[s," of ",a," provider",a===1?"":"s"," reachable"]}),t?e.jsxs("span",{className:"text-[var(--otari-muted)]",children:["Last checked ",$(t)]}):null,e.jsx(f,{size:"sm",variant:"ghost",className:"ml-auto",isDisabled:i.isPending,onPress:()=>i.mutate(),children:i.isPending?"Re-checking…":"Re-check all"})]})}function E({n:s,title:a,children:t}){return e.jsxs("li",{className:"flex gap-3",children:[e.jsx("span",{className:"flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-[var(--otari-brand-tint)] text-xs font-semibold text-[var(--otari-brand-dark)]",children:s}),e.jsxs("div",{className:"text-sm",children:[e.jsx("div",{className:"font-medium text-[var(--otari-ink)]",children:a}),e.jsx("div",{className:"text-[var(--otari-muted)]",children:t})]})]})}function ke({onAddProvider:s,needsPricing:a,onEnablePricing:t,enabling:r,secretKeyConfigured:i}){return e.jsx(_,{children:e.jsxs(_.Content,{className:"flex flex-col gap-4 p-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:"Welcome to Otari"}),e.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:"You are signed in. Add a provider to start serving models: three quick steps."})]}),e.jsxs("ol",{className:"flex flex-col gap-3",children:[e.jsxs(E,{n:1,title:"Add a provider",children:["Enter a provider name (like ",e.jsx("code",{children:"openai"}),") and its API key. Keys are encrypted at rest."]}),e.jsxs(E,{n:2,title:"Test the connection",children:["Use ",e.jsx("strong",{children:"Test"})," on the provider row to confirm the key works and see how many models it serves."]}),e.jsxs(E,{n:3,title:"Send your first request",children:["Point your app at ",e.jsx("code",{children:"/v1"})," on this gateway with the API key printed in the server logs (",e.jsx("code",{children:"gw-…"}),"). See the"," ",e.jsx("a",{href:"/welcome",className:"font-medium text-[var(--otari-brand-dark)]",children:"quickstart"}),"."]})]}),a?e.jsxs("p",{className:"text-sm text-[var(--otari-muted)]",children:["Tip: ",e.jsx("code",{children:"require_pricing"})," is on, so requests are rejected until pricing is set."," ",e.jsx("button",{type:"button",className:"font-medium text-[var(--otari-brand-dark)] disabled:opacity-50",disabled:r,onClick:t,children:"Enable default pricing"})," ","to meter new models with public rates."]}):null,e.jsx("div",{children:e.jsx(f,{variant:"primary",isDisabled:!i,onPress:s,children:"Add your first provider"})})]})})}function we(){var K,B,D,L;const s=Y(),a=V(),t=W(),r=G(),i=X(),l=Z(),m=J(),[g,u]=x.useState(!1),[p,c]=x.useState(null),[j,h]=x.useState({}),d=fe((K=s.data)==null?void 0:K.providers,a.data),k=new Map((((B=r.data)==null?void 0:B.providers)??[]).map(n=>[n.instance,n])),o=s.isLoading||a.isLoading,y=((D=a.data)==null?void 0:D.find(n=>n.instance===p))??null,N=((L=t.data)==null?void 0:L.require_pricing)===!0&&t.data.default_pricing===!1,P=t.data?t.data.secret_key_configured!==!1:!t.isError,A=!o&&d.length===0&&!g,w=n=>{h(v=>({...v,[n]:{status:"pending"}})),l.mutate(n,{onSuccess:v=>h(b=>({...b,[n]:{status:"done",...v}})),onError:v=>h(b=>({...b,[n]:{status:"done",ok:!1,model_count:0,error:q(v)}}))})},C=[{id:"provider",header:"Provider",isRowHeader:!0,cell:n=>e.jsx(M,{to:`/models?provider=${encodeURIComponent(n.instance)}`,className:"font-medium text-[var(--otari-ink)] hover:text-[var(--otari-brand-dark)] hover:underline",children:n.instance})},{id:"type",header:"Type",cell:n=>{var v,b;return e.jsx("span",{className:"text-[var(--otari-muted)]",children:((v=n.meta)==null?void 0:v.provider_type)??((b=n.stored)==null?void 0:b.provider_type)??n.instance})}},{id:"source",header:"Source",cell:n=>e.jsx(de,{size:"sm",color:n.source==="stored"?"accent":"default",children:n.source==="stored"?"stored":"config"})},{id:"api_key",header:"API key",cell:n=>{var v,b;return e.jsx("span",{className:"text-[var(--otari-muted)]",children:n.source==="stored"?n.stored&&!n.stored.decryptable?e.jsx("span",{className:"text-amber-700",title:"This key can't be decrypted with the current OTARI_SECRET_KEY. Replace the key, or restore the original OTARI_SECRET_KEY.",children:"⚠ key unreadable"}):e.jsx("code",{children:(v=n.stored)!=null&&v.last4?`••••${n.stored.last4}`:"none set"}):(b=n.meta)!=null&&b.env_key?e.jsxs("span",{children:["via ",e.jsx("code",{children:n.meta.env_key})]}):"config.yml"})}},{id:"status",header:"Status",cell:n=>e.jsx(ye,{health:k.get(n.instance)})},{id:"actions",header:"Actions",align:"end",cell:n=>{var v,b;return n.source==="stored"?e.jsxs("div",{className:"flex flex-col items-end gap-1.5",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(f,{size:"sm",variant:"outline",isDisabled:((v=j[n.instance])==null?void 0:v.status)==="pending"||((b=n.stored)==null?void 0:b.decryptable)===!1,onPress:()=>w(n.instance),children:"Test"}),e.jsx(f,{size:"sm",variant:"ghost",onPress:()=>{u(!1),c(n.instance)},children:"Edit"}),e.jsx(ae,{confirmLabel:"Delete",isPending:i.isPending,onConfirm:()=>i.mutate(n.instance),children:"Delete"})]}),e.jsx(je,{state:j[n.instance]})]}):e.jsx("span",{className:"block text-right text-xs text-[var(--otari-muted)]",children:"managed in config.yml"})}}];return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(Q,{title:"Providers",description:"Add provider API keys here to serve models without editing config.yml. Keys are encrypted at rest.",action:g||A?null:e.jsx(f,{variant:"primary",isDisabled:!P,onPress:()=>{c(null),u(!0)},children:"Add provider"})}),e.jsx(I,{error:s.error??a.error??t.error??r.error??m.error??i.error}),P?null:e.jsxs(ee,{tone:"warning",children:[e.jsx("code",{children:"OTARI_SECRET_KEY"})," is not set, so provider keys can't be encrypted at rest and adding providers from the dashboard is disabled. Set it on the server and restart to add providers here. Providers defined in"," ",e.jsx("code",{children:"config.yml"})," keep working without it."]}),A?e.jsx(ke,{onAddProvider:()=>{c(null),u(!0)},needsPricing:N,onEnablePricing:()=>m.mutate({default_pricing:!0}),enabling:m.isPending,secretKeyConfigured:P}):null,g&&P?e.jsx(ve,{onClose:()=>u(!1)}):null,y?e.jsx(ge,{provider:y,onClose:()=>c(null)}):null,!o&&d.length>0&&r.data&&r.data.total>0?e.jsx(be,{healthy:r.data.healthy,total:r.data.total,checkedAt:r.data.checked_at}):null,e.jsx(oe,{ariaLabel:"Providers",columns:C,rows:d,getRowKey:n=>n.instance,isLoading:o,emptyContent:"No providers yet. Add your first provider to start serving models."})]})}export{we as ProvidersPage}; +import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as x,L as M}from"./react-dgEcD0HR.js";import{K as Y,V,H as W,L as G,W as X,X as Z,Y as J,P as Q,E as I,I as ee,Z as te,_ as se,U as $,C as ae,$ as O,a0 as ne,D as q,a1 as re,a2 as ie}from"./index-DHi1jXMu.js";import{F as S}from"./Field-Dwp6u3t8.js";import{D as oe}from"./DataTable-Bmn_eYSV.js";import{B as f,d as _,f as de,T as le,L as F,I as H,D as ce,S as me,C as T,a as ue,b as xe}from"./heroui-BI50yK5B.js";function R({value:s,onChange:a,label:t,placeholder:r,description:i}){return e.jsxs(le,{value:s,onChange:a,className:"flex max-w-md flex-col gap-1",children:[e.jsx(F,{className:"text-sm font-medium text-[var(--otari-ink)]",children:t}),e.jsx(H,{type:"password",placeholder:r??"sk-…",autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",spellCheck:!1,"data-1p-ignore":!0,"data-lpignore":"true"}),i?e.jsx(ce,{className:"text-xs text-[var(--otari-muted)]",children:i}):null]})}function U({label:s,value:a,onChange:t,description:r,placeholder:i,extra:l=[],includeCatalog:m=!0}){var k;const g=re(),u=x.useMemo(()=>m?[...l,...(g.data??[]).map(o=>({id:o.id,name:o.name}))]:l,[g.data,l,m]),[p,c]=x.useState(()=>{var o;return((o=u.find(y=>y.id===a))==null?void 0:o.name)??""}),j=((k=u.find(o=>o.id===a))==null?void 0:k.name)??"",h=p.trim()===j.trim()?"":p.trim().toLowerCase(),d=u.filter(o=>!h||o.name.toLowerCase().includes(h)||o.id.toLowerCase().includes(h)).slice(0,50);return e.jsxs(T.Root,{allowsEmptyCollection:!0,menuTrigger:"focus",inputValue:p,onInputChange:c,onSelectionChange:o=>{var y;o!=null?(t(String(o)),c(((y=u.find(N=>N.id===String(o)))==null?void 0:y.name)??"")):(t(""),c(""))},className:"flex max-w-md flex-col gap-1",children:[e.jsx(F,{className:"text-sm font-medium text-[var(--otari-ink)]",children:s}),e.jsxs(T.InputGroup,{children:[e.jsx(H,{placeholder:i??"Search providers…",autoComplete:"off","data-1p-ignore":!0,"data-lpignore":"true",onFocus:o=>o.currentTarget.select()}),e.jsx(T.Trigger,{})]}),e.jsx(T.Popover,{children:e.jsx(ue,{items:d,className:"max-h-72 overflow-auto",children:o=>e.jsx(xe,{id:o.id,textValue:o.name,children:o.name})})}),r?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:r}):null]})}function z({getPayload:s}){const a=ie(),t=s();return e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx(f,{variant:"outline",isDisabled:t===null||a.isPending,onPress:()=>{t&&a.mutate(t)},children:a.isPending?"Testing…":"Test connection"}),e.jsx("span",{role:"status","aria-live":"polite",children:a.isPending?null:a.error?e.jsx("span",{className:"text-xs text-red-700",children:q(a.error)}):a.data?a.data.ok?e.jsxs("span",{className:"text-xs font-medium text-green-700",children:["Connected. ",a.data.model_count," model",a.data.model_count===1?"":"s"," available."]}):e.jsx("span",{className:"block max-w-md break-words text-xs text-red-700",children:a.data.error??"Connection failed."}):null})]})}function pe({onClose:s}){var w;const a=O(),[t,r]=x.useState(""),[i,l]=x.useState(""),[m,g]=x.useState(!1),[u,p]=x.useState(""),[c,j]=x.useState(""),h=ne(t),d=((w=h.data)==null?void 0:w.id)===t?h.data:void 0;x.useEffect(()=>{d&&p(d.default_api_base??"")},[d]);const k=(d==null?void 0:d.env_key_present)??!1,o=((d==null?void 0:d.requires_api_key)??!0)&&!k,y=c.trim()!==""&&c.trim()!==t,N=/[:/]/.test(c),P=t!==""&&!N&&(!o||i.trim()!=="")&&!a.isPending,A=()=>{P&&a.mutate({instance:y?c.trim():t,provider_type:y?t:null,api_base:u.trim()||null,api_key:i.trim()||null},{onSuccess:s})};return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(I,{error:a.error}),e.jsx(U,{label:"Provider",value:t,onChange:C=>{r(C),j(""),p("")},description:"Its endpoint is built in."}),e.jsx(R,{value:i,onChange:l,label:d&&!o?"API key (optional)":"API key",description:d?o?`${d.name}'s endpoint is built in — just add your key.`:k?`${d.env_key} is set on the server, so a key is optional here. Paste one to override it.`:`${d.name} needs no API key.`:"Stored encrypted. Requires OTARI_SECRET_KEY on the server."}),e.jsx("button",{type:"button",className:"self-start text-xs font-medium text-[var(--otari-brand-dark)]",onClick:()=>g(C=>!C),children:m?"Hide advanced":"Advanced (API base, rename)"}),m?e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(S,{label:"API base",value:u,onChange:p,placeholder:(d==null?void 0:d.default_api_base)??"https://…/v1",description:"Only if you route through a proxy. Blank uses the built-in default."}),e.jsx(S,{label:"Name",value:c,onChange:j,placeholder:t||"instance name",description:N?e.jsx("span",{className:"text-red-700",children:"A name cannot contain “:” or “/”."}):"Rename to run two instances of the same provider."})]}):null,e.jsxs("div",{className:"flex flex-wrap items-start gap-2",children:[e.jsx(f,{variant:"primary",isDisabled:!P,onPress:A,children:a.isPending?"Adding…":"Add provider"}),e.jsx(f,{variant:"ghost",onPress:s,children:"Cancel"}),e.jsx(z,{getPayload:()=>t===""?null:{instance:y?c.trim():t,provider_type:y?t:null,api_base:u.trim()||null,api_key:i.trim()||null}})]})]})}function he({onClose:s}){const a=O(),[t,r]=x.useState(""),[i,l]=x.useState("openai-compatible"),[m,g]=x.useState(""),[u,p]=x.useState(""),c=/[:/]/.test(t),j=t.trim()!==""&&!c&&m.trim()!==""&&!a.isPending,h=()=>{j&&a.mutate({instance:t.trim(),provider_type:i||"openai-compatible",api_base:m.trim(),api_key:u.trim()||null},{onSuccess:s})};return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(I,{error:a.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(S,{label:"Name",value:t,onChange:r,placeholder:"my-local-llm",isRequired:!0,autoFocus:!0,description:c?e.jsx("span",{className:"text-red-700",children:"A name cannot contain “:” or “/”."}):"Call it whatever you want."}),e.jsx(U,{label:"Compatible with",value:i,onChange:l,includeCatalog:!1,description:"The API this endpoint speaks.",extra:[{id:"openai-compatible",name:"OpenAI"},{id:"anthropic-compatible",name:"Anthropic"}]})]}),e.jsx(S,{label:"API base",value:m,onChange:g,placeholder:"http://localhost:8000/v1",isRequired:!0,description:"The endpoint URL of your server."}),e.jsx(R,{value:u,onChange:p,label:"API key (optional)",description:"Many local backends need none. Stored encrypted."}),e.jsxs("div",{className:"flex flex-wrap items-start gap-2",children:[e.jsx(f,{variant:"primary",isDisabled:!j,onPress:h,children:a.isPending?"Adding…":"Add provider"}),e.jsx(f,{variant:"ghost",onPress:s,children:"Cancel"}),e.jsx(z,{getPayload:()=>t.trim()===""||m.trim()===""?null:{instance:t.trim(),provider_type:i||"openai-compatible",api_base:m.trim(),api_key:u.trim()||null}})]})]})}function ve({onClose:s}){const[a,t]=x.useState("known");return e.jsx(_,{children:e.jsxs(_.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsx("div",{className:"flex items-center justify-between",children:e.jsx("div",{className:"flex items-center gap-1 rounded-lg bg-[var(--otari-bg)] p-1",children:[["known","Known provider"],["custom","Custom endpoint"]].map(([r,i])=>e.jsx("button",{type:"button","aria-pressed":a===r,onClick:()=>t(r),className:a===r?"rounded-md bg-white px-3 py-1.5 text-sm font-medium text-[var(--otari-ink)] shadow-sm":"rounded-md px-3 py-1.5 text-sm text-[var(--otari-muted)] hover:text-[var(--otari-ink)]",children:i},r))})}),a==="known"?e.jsx(pe,{onClose:s}):e.jsx(he,{onClose:s})]})})}function ge({provider:s,onClose:a}){const t=te(),[r,i]=x.useState(s.provider_type??""),[l,m]=x.useState(s.api_base??""),[g,u]=x.useState(!1),[p,c]=x.useState(""),j=()=>{if(t.isPending)return;const h={provider_type:r.trim()||null,api_base:l.trim()||null,expected_updated_at:s.updated_at};g&&p.trim()&&(h.api_key=p.trim()),t.mutate({instance:s.instance,body:h},{onSuccess:a})};return e.jsx(_,{children:e.jsxs(_.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsxs("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:["Edit ",e.jsx("code",{children:s.instance})]}),e.jsx(I,{error:t.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(S,{label:"Provider type",value:r,onChange:i,placeholder:"openai"}),e.jsx(S,{label:"API base",value:l,onChange:m,placeholder:"https://api.openai.com/v1"})]}),e.jsx("div",{className:"flex flex-col gap-2",children:g?e.jsxs(e.Fragment,{children:[e.jsx(R,{value:p,onChange:c,label:"New API key",description:"Stored encrypted. The old key is replaced when you save."}),e.jsx("button",{type:"button",className:"self-start text-xs font-medium text-[var(--otari-brand-dark)]",onClick:()=>{u(!1),c("")},children:"Keep the current key"})]}):e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("span",{className:"text-sm text-[var(--otari-muted)]",children:["API key: ",e.jsx("code",{children:s.last4?`••••${s.last4}`:"none set"})]}),e.jsx(f,{size:"sm",variant:"outline",onPress:()=>u(!0),children:"Replace key"})]})}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(f,{variant:"primary",isDisabled:t.isPending,onPress:j,children:t.isPending?"Saving…":"Save changes"}),e.jsx(f,{variant:"ghost",onPress:a,children:"Cancel"})]})]})})}function fe(s,a){const t=new Map((a??[]).map(l=>[l.instance,l])),r=new Map((s??[]).map(l=>[l.instance,l]));return[...new Set([...t.keys(),...r.keys()])].sort().map(l=>{const m=t.get(l);return{instance:l,source:m?"stored":"config",stored:m,meta:r.get(l)}})}function je({state:s}){return s?s.status==="pending"?e.jsxs("span",{className:"inline-flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:[e.jsx(me,{size:"sm"})," Testing…"]}):s.ok?e.jsxs("span",{className:"text-xs font-medium text-green-700",children:["Connected. ",s.model_count," model",s.model_count===1?"":"s"," available."]}):e.jsx("span",{className:"block max-w-xs break-words text-xs text-red-700",children:s.error??"Connection failed."}):null}function ye({health:s}){if(!s)return e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"—"});const a=s.ok?"border-green-200 bg-green-50 text-green-700":"border-red-200 bg-red-50 text-red-700",t=s.checked_at?`Last checked ${$(s.checked_at)}`:"Not checked yet",r=s.ok?t:`${s.error??"Unreachable"} · ${t}`;return e.jsxs("span",{title:r,className:`inline-flex items-center gap-1.5 rounded-full border px-2.5 py-0.5 text-xs font-medium ${a}`,children:[e.jsx("span",{"aria-hidden":!0,className:`h-1.5 w-1.5 rounded-full ${s.ok?"bg-green-500":"bg-red-500"}`}),s.ok?"Reachable":"Unreachable"]})}function be({healthy:s,total:a,checkedAt:t}){const r=s===a,i=se();return e.jsxs("div",{className:"flex flex-wrap items-center gap-3 rounded-xl border border-[var(--otari-line)] bg-[var(--otari-surface)] px-4 py-2.5 text-sm",children:[e.jsx("span",{"aria-hidden":!0,className:`h-2 w-2 rounded-full ${r?"bg-green-500":"bg-red-500"}`}),e.jsxs("span",{className:"font-medium text-[var(--otari-ink)]",children:[s," of ",a," provider",a===1?"":"s"," reachable"]}),t?e.jsxs("span",{className:"text-[var(--otari-muted)]",children:["Last checked ",$(t)]}):null,e.jsx(f,{size:"sm",variant:"ghost",className:"ml-auto",isDisabled:i.isPending,onPress:()=>i.mutate(),children:i.isPending?"Re-checking…":"Re-check all"})]})}function E({n:s,title:a,children:t}){return e.jsxs("li",{className:"flex gap-3",children:[e.jsx("span",{className:"flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-[var(--otari-brand-tint)] text-xs font-semibold text-[var(--otari-brand-dark)]",children:s}),e.jsxs("div",{className:"text-sm",children:[e.jsx("div",{className:"font-medium text-[var(--otari-ink)]",children:a}),e.jsx("div",{className:"text-[var(--otari-muted)]",children:t})]})]})}function ke({onAddProvider:s,needsPricing:a,onEnablePricing:t,enabling:r,secretKeyConfigured:i}){return e.jsx(_,{children:e.jsxs(_.Content,{className:"flex flex-col gap-4 p-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:"Welcome to Otari"}),e.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:"You are signed in. Add a provider to start serving models: three quick steps."})]}),e.jsxs("ol",{className:"flex flex-col gap-3",children:[e.jsxs(E,{n:1,title:"Add a provider",children:["Enter a provider name (like ",e.jsx("code",{children:"openai"}),") and its API key. Keys are encrypted at rest."]}),e.jsxs(E,{n:2,title:"Test the connection",children:["Use ",e.jsx("strong",{children:"Test"})," on the provider row to confirm the key works and see how many models it serves."]}),e.jsxs(E,{n:3,title:"Send your first request",children:["Point your app at ",e.jsx("code",{children:"/v1"})," on this gateway with the API key printed in the server logs (",e.jsx("code",{children:"gw-…"}),"). See the"," ",e.jsx("a",{href:"/welcome",className:"font-medium text-[var(--otari-brand-dark)]",children:"quickstart"}),"."]})]}),a?e.jsxs("p",{className:"text-sm text-[var(--otari-muted)]",children:["Tip: ",e.jsx("code",{children:"require_pricing"})," is on, so requests are rejected until pricing is set."," ",e.jsx("button",{type:"button",className:"font-medium text-[var(--otari-brand-dark)] disabled:opacity-50",disabled:r,onClick:t,children:"Enable default pricing"})," ","to meter new models with public rates."]}):null,e.jsx("div",{children:e.jsx(f,{variant:"primary",isDisabled:!i,onPress:s,children:"Add your first provider"})})]})})}function we(){var K,B,D,L;const s=Y(),a=V(),t=W(),r=G(),i=X(),l=Z(),m=J(),[g,u]=x.useState(!1),[p,c]=x.useState(null),[j,h]=x.useState({}),d=fe((K=s.data)==null?void 0:K.providers,a.data),k=new Map((((B=r.data)==null?void 0:B.providers)??[]).map(n=>[n.instance,n])),o=s.isLoading||a.isLoading,y=((D=a.data)==null?void 0:D.find(n=>n.instance===p))??null,N=((L=t.data)==null?void 0:L.require_pricing)===!0&&t.data.default_pricing===!1,P=t.data?t.data.secret_key_configured!==!1:!t.isError,A=!o&&d.length===0&&!g,w=n=>{h(v=>({...v,[n]:{status:"pending"}})),l.mutate(n,{onSuccess:v=>h(b=>({...b,[n]:{status:"done",...v}})),onError:v=>h(b=>({...b,[n]:{status:"done",ok:!1,model_count:0,error:q(v)}}))})},C=[{id:"provider",header:"Provider",isRowHeader:!0,cell:n=>e.jsx(M,{to:`/models?provider=${encodeURIComponent(n.instance)}`,className:"font-medium text-[var(--otari-ink)] hover:text-[var(--otari-brand-dark)] hover:underline",children:n.instance})},{id:"type",header:"Type",cell:n=>{var v,b;return e.jsx("span",{className:"text-[var(--otari-muted)]",children:((v=n.meta)==null?void 0:v.provider_type)??((b=n.stored)==null?void 0:b.provider_type)??n.instance})}},{id:"source",header:"Source",cell:n=>e.jsx(de,{size:"sm",color:n.source==="stored"?"accent":"default",children:n.source==="stored"?"stored":"config"})},{id:"api_key",header:"API key",cell:n=>{var v,b;return e.jsx("span",{className:"text-[var(--otari-muted)]",children:n.source==="stored"?n.stored&&!n.stored.decryptable?e.jsx("span",{className:"text-amber-700",title:"This key can't be decrypted with the current OTARI_SECRET_KEY. Replace the key, or restore the original OTARI_SECRET_KEY.",children:"⚠ key unreadable"}):e.jsx("code",{children:(v=n.stored)!=null&&v.last4?`••••${n.stored.last4}`:"none set"}):(b=n.meta)!=null&&b.env_key?e.jsxs("span",{children:["via ",e.jsx("code",{children:n.meta.env_key})]}):"config.yml"})}},{id:"status",header:"Status",cell:n=>e.jsx(ye,{health:k.get(n.instance)})},{id:"actions",header:"Actions",align:"end",cell:n=>{var v,b;return n.source==="stored"?e.jsxs("div",{className:"flex flex-col items-end gap-1.5",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(f,{size:"sm",variant:"outline",isDisabled:((v=j[n.instance])==null?void 0:v.status)==="pending"||((b=n.stored)==null?void 0:b.decryptable)===!1,onPress:()=>w(n.instance),children:"Test"}),e.jsx(f,{size:"sm",variant:"ghost",onPress:()=>{u(!1),c(n.instance)},children:"Edit"}),e.jsx(ae,{confirmLabel:"Delete",isPending:i.isPending,onConfirm:()=>i.mutate(n.instance),children:"Delete"})]}),e.jsx(je,{state:j[n.instance]})]}):e.jsx("span",{className:"block text-right text-xs text-[var(--otari-muted)]",children:"managed in config.yml"})}}];return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(Q,{title:"Providers",description:"Add provider API keys here to serve models without editing config.yml. Keys are encrypted at rest.",action:g||A?null:e.jsx(f,{variant:"primary",isDisabled:!P,onPress:()=>{c(null),u(!0)},children:"Add provider"})}),e.jsx(I,{error:s.error??a.error??t.error??r.error??m.error??i.error}),P?null:e.jsxs(ee,{tone:"warning",children:[e.jsx("code",{children:"OTARI_SECRET_KEY"})," is not set, so provider keys can't be encrypted at rest and adding providers from the dashboard is disabled. Set it on the server and restart to add providers here. Providers defined in"," ",e.jsx("code",{children:"config.yml"})," keep working without it."]}),A?e.jsx(ke,{onAddProvider:()=>{c(null),u(!0)},needsPricing:N,onEnablePricing:()=>m.mutate({default_pricing:!0}),enabling:m.isPending,secretKeyConfigured:P}):null,g&&P?e.jsx(ve,{onClose:()=>u(!1)}):null,y?e.jsx(ge,{provider:y,onClose:()=>c(null)}):null,!o&&d.length>0&&r.data&&r.data.total>0?e.jsx(be,{healthy:r.data.healthy,total:r.data.total,checkedAt:r.data.checked_at}):null,e.jsx(oe,{ariaLabel:"Providers",columns:C,rows:d,getRowKey:n=>n.instance,isLoading:o,emptyContent:"No providers yet. Add your first provider to start serving models."})]})}export{we as ProvidersPage}; diff --git a/src/gateway/static/dashboard/assets/SettingsPage-CJyO6zWH.js b/src/gateway/static/dashboard/assets/SettingsPage-0IuzwARi.js similarity index 99% rename from src/gateway/static/dashboard/assets/SettingsPage-CJyO6zWH.js rename to src/gateway/static/dashboard/assets/SettingsPage-0IuzwARi.js index 2a6775ac..465f01de 100644 --- a/src/gateway/static/dashboard/assets/SettingsPage-CJyO6zWH.js +++ b/src/gateway/static/dashboard/assets/SettingsPage-0IuzwARi.js @@ -1 +1 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as u}from"./react-dgEcD0HR.js";import{H as R,Y as C,P,E as y,a3 as E,a4 as T,a5 as _,F as D,a6 as A,V as O,a7 as F,I as w}from"./index-CGnfXTEF.js";import{d as v,B as h,A as d,g as I,I as K}from"./heroui-BI50yK5B.js";function b(t,r){return{[t]:r}}function z(t,r){let s=0;for(const a of r)if(a===t[s]&&(s+=1),s===t.length)return!0;return t.length===0}function M(t,r){const s=r.trim().toLowerCase();if(s==="")return!0;const a=`${t.key} ${t.description??""} ${t.group}`.toLowerCase(),n=t.key.toLowerCase().replace(/[^a-z0-9]/g,"");return s.split(/\s+/).every(i=>a.includes(i)||z(i,n))}function B({checked:t,onChange:r,label:s,disabled:a}){return e.jsx("button",{type:"button",role:"switch","aria-checked":t,"aria-label":s,disabled:a,onClick:()=>r(!t),className:`relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors disabled:opacity-50 ${t?"bg-[var(--otari-brand)]":"bg-[var(--otari-line)]"}`,children:e.jsx("span",{className:`inline-block h-5 w-5 transform rounded-full bg-white shadow transition-transform ${t?"translate-x-5":"translate-x-0.5"}`})})}function H({field:t,onSave:r,disabled:s}){const a=typeof t.value=="number"?t.value:0,[n,i]=u.useState(String(a)),o=t.type==="float";u.useEffect(()=>{i(String(a))},[a]);const c=Number(n),p=n.trim()!==""&&Number.isFinite(c)&&(o||Number.isInteger(c)),m=t.minimum??void 0,x=t.exclusive_minimum??void 0,g=x!==void 0?c>x:m!==void 0?c>=m:c>=0,l=p&&g&&c!==a;return e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(K,{type:"number",min:"0",step:o?"any":"1",inputMode:o?"decimal":"numeric","aria-label":t.key,value:n,disabled:s,onChange:f=>i(f.target.value),className:"w-28 rounded-md border border-[var(--otari-line)] bg-white px-2 py-1 text-right text-sm tabular-nums focus:border-[var(--otari-brand)] focus:outline-none disabled:opacity-50"}),e.jsx(h,{size:"sm",variant:"primary","aria-label":`Save ${t.key}`,isDisabled:s||!l,onPress:()=>r(c),children:"Save"})]})}function L({field:t,onSave:r,disabled:s}){const a=typeof t.value=="string"?t.value:"",[n,i]=u.useState(a);u.useEffect(()=>{i(a)},[a]);const o=n!==a;return e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"text","aria-label":t.key,value:n,disabled:s,placeholder:"unset",onChange:c=>i(c.target.value),className:"w-56 rounded-md border border-[var(--otari-line)] bg-white px-2 py-1 text-sm focus:border-[var(--otari-brand)] focus:outline-none disabled:opacity-50"}),e.jsx(h,{size:"sm",variant:"primary","aria-label":`Save ${t.key}`,isDisabled:s||!o,onPress:()=>r(n.trim()===""?null:n),children:"Save"})]})}function $(t){const{value:r}=t;return r==null?"unset":typeof r=="boolean"?r?"on":"off":Array.isArray(r)?r.length?r.join(", "):"none":String(r)}function Y({field:t,patch:r,disabled:s}){return t.settable?t.type==="bool"?e.jsx(B,{checked:t.value===!0,onChange:a=>r(b(t.key,a)),label:t.key,disabled:s}):t.options&&t.options.length>0?e.jsx(D,{ariaLabel:t.key,value:String(t.value??""),onChange:a=>r(b(t.key,a)),options:t.options.map(a=>({value:a,label:a}))}):t.type==="int"||t.type==="float"?e.jsx(H,{field:t,onSave:a=>r(b(t.key,a)),disabled:s}):e.jsx(L,{field:t,onSave:a=>r(b(t.key,a)),disabled:s}):e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-sm tabular-nums text-[var(--otari-ink)]",children:$(t)}),e.jsx("span",{className:"rounded-full border border-[var(--otari-line)] px-2 py-0.5 text-xs text-[var(--otari-muted)]",children:"startup-only"})]})}function q({field:t,patch:r,disabled:s}){return e.jsxs("div",{className:"flex items-start justify-between gap-6 py-4",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("code",{className:"text-sm font-medium text-[var(--otari-ink)]",children:t.key}),t.description?e.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:t.description}):null]}),e.jsx("div",{className:"shrink-0 pt-0.5",children:e.jsx(Y,{field:t,patch:r,disabled:s})})]})}function V({value:t,fieldRef:r}){const s=u.useRef(null),a=r??s,[n,i]=u.useState(!1),[o,c]=u.useState(!1),p=async()=>{var m,x,g;(m=a.current)==null||m.focus(),(x=a.current)==null||x.select();try{if((g=navigator.clipboard)!=null&&g.writeText){await navigator.clipboard.writeText(t),i(!0),c(!1),window.setTimeout(()=>i(!1),2e3);return}}catch{}c(!0)};return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-xs font-medium text-[var(--otari-muted)]",children:"New master key"}),e.jsx(h,{size:"sm",variant:"outline",onPress:p,children:n?"Copied":"Copy"})]}),e.jsx("input",{ref:a,readOnly:!0,value:t,onFocus:m=>m.currentTarget.select(),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",spellCheck:!1,"data-1p-ignore":!0,"data-lpignore":"true"}),e.jsx("span",{"aria-live":"polite",className:"text-xs text-[var(--otari-brand-dark)]",children:n?"Copied to clipboard.":""}),o?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Selected. Press Ctrl/Cmd-C to copy."}):null]})}function U({masterKey:t,error:r,isPending:s,onRegenerate:a,onClose:n}){const i=u.useRef(null);return u.useEffect(()=>{var o,c;t!==void 0&&((o=i.current)==null||o.focus(),(c=i.current)==null||c.select())},[t]),e.jsx(d.Backdrop,{children:e.jsx(d.Container,{placement:"center",size:"lg",children:e.jsxs(d.Dialog,{children:[e.jsx(d.Header,{children:e.jsx(d.Heading,{children:t!==void 0?"Master key regenerated":"Regenerate master key?"})}),e.jsx(d.Body,{className:"flex flex-col gap-4",children:t!==void 0?e.jsxs(e.Fragment,{children:[e.jsx(w,{tone:"warning",children:"Copy this key now. It is shown once and cannot be retrieved again after you close this dialog."}),e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:"The previous master key has stopped working. This browser tab now uses the new key."}),e.jsx(V,{value:t,fieldRef:i})]}):e.jsxs(e.Fragment,{children:[e.jsx(w,{tone:"warning",children:"This immediately invalidates the current dashboard master key. Other signed-in dashboard sessions will need the new key to continue."}),e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:"The replacement key will be shown once. Save it before closing the next screen."}),e.jsx(y,{error:r})]})}),e.jsx(d.Footer,{children:t!==void 0?e.jsx(h,{variant:"primary",onPress:n,children:"I’ve saved this key"}):e.jsxs(e.Fragment,{children:[e.jsx(h,{variant:"ghost",isDisabled:s,onPress:n,children:"Cancel"}),e.jsx(h,{variant:"danger",isPending:s,onPress:a,children:"Regenerate key"})]})})]})})})}function G({source:t}){const r=A(),[s,a]=u.useState(!1),[n,i]=u.useState(),o=t==="generated",c=()=>r.mutate(void 0,{onSuccess:x=>{i(x.master_key)}}),p=()=>{a(!1),i(void 0),r.reset()},m=x=>{x?(r.reset(),a(!0)):n===void 0&&p()};return e.jsx("div",{className:"flex flex-col gap-4 py-4",children:e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("code",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"master_key"}),e.jsx("p",{className:"mt-1 max-w-3xl text-sm text-[var(--otari-muted)]",children:o?"This gateway uses its first-run generated dashboard key. Regeneration invalidates the current key immediately.":"This gateway uses a key managed through OTARI_MASTER_KEY or config.yml. Rotate it in configuration, then restart the gateway."})]}),e.jsxs(d,{isOpen:s,onOpenChange:m,children:[o?e.jsx(d.Trigger,{className:I({size:"sm",variant:"danger-soft"}),children:"Regenerate"}):e.jsx(h,{size:"sm",variant:"danger-soft",isDisabled:!0,children:"Managed in configuration"}),s?e.jsx(U,{masterKey:n,error:r.error,isPending:r.isPending,onRegenerate:c,onClose:p}):null]})]})})}function X(){var o;const t=O(),r=F(),s=r.data,a=((o=t.data)==null?void 0:o.length)??0,n=(t.data??[]).filter(c=>!c.decryptable).length,i=a>0;return e.jsxs("div",{className:"flex flex-col gap-4 py-4",children:[e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("code",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"OTARI_SECRET_KEY"}),e.jsxs("p",{className:"mt-1 max-w-3xl text-sm text-[var(--otari-muted)]",children:["Generate a new key with ",e.jsx("code",{children:"uv run otari gen-secret-key"}),", then restart with"," ",e.jsx("code",{children:"OTARI_SECRET_KEY=,"}),". Re-encrypt the stored provider keys, then restart with ",e.jsx("code",{children:"OTARI_SECRET_KEY="})," once none are unreadable."]})]}),e.jsx("div",{className:"shrink-0",children:e.jsx(h,{size:"sm",variant:"outline",isDisabled:!i||r.isPending,onPress:()=>r.mutate(),children:r.isPending?"Re-encrypting…":"Re-encrypt provider keys"})})]}),e.jsx(y,{error:t.error??r.error}),n>0?e.jsxs(w,{tone:"warning",children:[n," stored provider key",n===1?"":"s"," cannot be decrypted with the current"," ",e.jsx("code",{children:"OTARI_SECRET_KEY"}),". Restore the old secret key and re-encrypt, or edit each affected provider and replace its key."]}):null,s?e.jsxs("p",{className:"text-sm text-[var(--otari-muted)]",role:"status","aria-live":"polite",children:["Re-encrypted ",s.reencrypted," provider key",s.reencrypted===1?"":"s",".",s.unreadable>0?` ${s.unreadable} still need replacement.`:" All decryptable stored keys now use the primary secret key."]}):!t.isLoading&&!i?e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:"No stored provider keys need re-encryption."}):null]})}function J({masterKeySource:t}){return e.jsxs("section",{className:"flex flex-col gap-2",children:[e.jsxs("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:["Credential security ",e.jsx("span",{className:"font-normal text-[var(--otari-muted)]",children:"(2)"})]}),e.jsx(v,{children:e.jsxs(v.Content,{className:"flex flex-col divide-y divide-[var(--otari-line)] px-5 py-1",children:[e.jsx(G,{source:t}),e.jsx(X,{})]})})]})}function Q({preview:t,error:r,isPending:s,onAccept:a,onReject:n}){return e.jsx(d.Backdrop,{children:e.jsx(d.Container,{placement:"center",size:"lg",children:e.jsxs(d.Dialog,{children:[e.jsx(d.Header,{children:e.jsx(d.Heading,{children:"Review default price updates"})}),e.jsxs(d.Body,{className:"flex flex-col gap-4",children:[e.jsxs("p",{className:"text-sm text-[var(--otari-muted)]",children:[t.added_count," added, ",t.changed_count," changed, and ",t.removed_count," removed upstream model prices. The accepted catalog is saved in the database with source ",e.jsx("code",{children:"genai-prices"})," and reloads after a restart. Your ",t.protected_model_count," custom model price",t.protected_model_count===1?"":"s"," remain unchanged."]}),t.changes.length>0?e.jsx("ul",{className:"max-h-60 list-disc overflow-auto pl-5 text-sm text-[var(--otari-ink)]",children:t.changes.map(i=>e.jsxs("li",{children:[i.model_key,": ",i.change]},i.model_key))}):null,t.changes_truncated?e.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:"Only the first 100 changes are shown."}):null,e.jsx(y,{error:r})]}),e.jsxs(d.Footer,{children:[e.jsx(h,{variant:"ghost",isDisabled:s,onPress:n,children:"Reject changes"}),e.jsx(h,{variant:"primary",isPending:s,onPress:a,children:"Accept price updates"})]})]})})})}function W(){const t=E(),r=T(),s=_(),a=t.data,n=r.isPending||s.isPending,i=()=>{a===void 0||n||s.mutate(void 0,{onSuccess:t.reset})};return e.jsxs("section",{className:"flex flex-col gap-2",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Default pricing catalog"}),e.jsx(v,{children:e.jsxs(v.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"genai-prices defaults"}),e.jsxs("p",{className:"mt-1 max-w-3xl text-sm text-[var(--otari-muted)]",children:["Fetch the latest upstream catalog, review the proposed change summary, then accept or reject it. Accepted data is stored as ",e.jsx("code",{children:"genai-prices"}),"; custom prices remain separate and always take precedence."]})]}),e.jsx(h,{size:"sm",variant:"outline",isDisabled:t.isPending||n,onPress:()=>t.mutate(),children:t.isPending?"Checking prices…":"Check for price updates"})]}),e.jsx(y,{error:t.error})]})}),e.jsxs(d,{isOpen:a!==void 0,onOpenChange:o=>o?void 0:i(),children:[e.jsx(d.Trigger,{className:"hidden",children:"Review price updates"}),a?e.jsx(Q,{preview:a,error:r.error??s.error,isPending:n,onAccept:()=>r.mutate(void 0,{onSuccess:t.reset}),onReject:i}):null]})]})}function Z(t){const r=[],s=new Map;for(const a of t){let n=s.get(a.group);n||(n={name:a.group,fields:[]},s.set(a.group,n),r.push(n)),n.fields.push(a)}return r}function ae(){const t=R(),r=C(),s=t.data,a=r.isPending,[n,i]=u.useState(""),[o,c]=u.useState(!1),p=u.useRef(null);u.useEffect(()=>{function l(f){var N;const j=f.target,S=j&&(j.tagName==="INPUT"||j.tagName==="TEXTAREA"||j.tagName==="SELECT");f.key==="/"&&!S&&(f.preventDefault(),(N=p.current)==null||N.focus())}return window.addEventListener("keydown",l),()=>window.removeEventListener("keydown",l)},[]);const m=l=>r.mutate(l),x=(s==null?void 0:s.config)??[],g=x.filter(l=>(o?l.settable:!0)&&M(l,n)),k=Z(g);return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(P,{title:"Settings",description:"Every effective gateway setting. Settable fields apply immediately and persist across restarts; startup-only fields are shown for reference and change only via config.yml or environment variables (then a restart)."}),e.jsx(y,{error:t.error??r.error}),e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("input",{ref:p,type:"search","aria-label":"Search settings",placeholder:"Search settings (press / to focus)…",value:n,onChange:l=>i(l.target.value),onKeyDown:l=>{l.key==="Escape"&&i("")},className:"min-w-0 flex-1 rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-3 py-2 text-sm text-[var(--otari-ink)] focus:border-[var(--otari-brand)] focus:outline-none"}),e.jsxs("label",{className:"flex items-center gap-2 text-sm text-[var(--otari-muted)]",children:[e.jsx("input",{type:"checkbox",checked:o,onChange:l=>c(l.target.checked),className:"h-4 w-4 accent-[var(--otari-brand)]"}),"Settable only"]})]}),s?e.jsxs("p",{className:"text-xs text-[var(--otari-muted)]",children:["Showing ",g.length," of ",x.length," settings"]}):null,s&&g.length===0?e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:"No settings match your search."}):null,k.map(l=>e.jsxs("section",{className:"flex flex-col gap-2",children:[e.jsxs("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:[l.name," ",e.jsxs("span",{className:"font-normal text-[var(--otari-muted)]",children:["(",l.fields.length,")"]})]}),e.jsx(v,{children:e.jsx(v.Content,{className:"flex flex-col divide-y divide-[var(--otari-line)] px-5 py-1",children:l.fields.map(f=>e.jsx(q,{field:f,patch:m,disabled:!s||a},f.key))})})]},l.name)),s?e.jsx(W,{}):null,s?e.jsx(J,{masterKeySource:s.master_key_source}):null,s?e.jsxs("p",{className:"text-xs text-[var(--otari-muted)]",children:["Mode: ",s.mode," · Version ",s.version,s.require_pricing?" · require_pricing on":""]}):null]})}export{ae as SettingsPage,M as fieldMatches}; +import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as u}from"./react-dgEcD0HR.js";import{H as R,Y as C,P,E as y,a3 as E,a4 as T,a5 as _,F as D,a6 as A,V as O,a7 as F,I as w}from"./index-DHi1jXMu.js";import{d as v,B as h,A as d,g as I,I as K}from"./heroui-BI50yK5B.js";function b(t,r){return{[t]:r}}function z(t,r){let s=0;for(const a of r)if(a===t[s]&&(s+=1),s===t.length)return!0;return t.length===0}function M(t,r){const s=r.trim().toLowerCase();if(s==="")return!0;const a=`${t.key} ${t.description??""} ${t.group}`.toLowerCase(),n=t.key.toLowerCase().replace(/[^a-z0-9]/g,"");return s.split(/\s+/).every(i=>a.includes(i)||z(i,n))}function B({checked:t,onChange:r,label:s,disabled:a}){return e.jsx("button",{type:"button",role:"switch","aria-checked":t,"aria-label":s,disabled:a,onClick:()=>r(!t),className:`relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors disabled:opacity-50 ${t?"bg-[var(--otari-brand)]":"bg-[var(--otari-line)]"}`,children:e.jsx("span",{className:`inline-block h-5 w-5 transform rounded-full bg-white shadow transition-transform ${t?"translate-x-5":"translate-x-0.5"}`})})}function H({field:t,onSave:r,disabled:s}){const a=typeof t.value=="number"?t.value:0,[n,i]=u.useState(String(a)),o=t.type==="float";u.useEffect(()=>{i(String(a))},[a]);const c=Number(n),p=n.trim()!==""&&Number.isFinite(c)&&(o||Number.isInteger(c)),m=t.minimum??void 0,x=t.exclusive_minimum??void 0,g=x!==void 0?c>x:m!==void 0?c>=m:c>=0,l=p&&g&&c!==a;return e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(K,{type:"number",min:"0",step:o?"any":"1",inputMode:o?"decimal":"numeric","aria-label":t.key,value:n,disabled:s,onChange:f=>i(f.target.value),className:"w-28 rounded-md border border-[var(--otari-line)] bg-white px-2 py-1 text-right text-sm tabular-nums focus:border-[var(--otari-brand)] focus:outline-none disabled:opacity-50"}),e.jsx(h,{size:"sm",variant:"primary","aria-label":`Save ${t.key}`,isDisabled:s||!l,onPress:()=>r(c),children:"Save"})]})}function L({field:t,onSave:r,disabled:s}){const a=typeof t.value=="string"?t.value:"",[n,i]=u.useState(a);u.useEffect(()=>{i(a)},[a]);const o=n!==a;return e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"text","aria-label":t.key,value:n,disabled:s,placeholder:"unset",onChange:c=>i(c.target.value),className:"w-56 rounded-md border border-[var(--otari-line)] bg-white px-2 py-1 text-sm focus:border-[var(--otari-brand)] focus:outline-none disabled:opacity-50"}),e.jsx(h,{size:"sm",variant:"primary","aria-label":`Save ${t.key}`,isDisabled:s||!o,onPress:()=>r(n.trim()===""?null:n),children:"Save"})]})}function $(t){const{value:r}=t;return r==null?"unset":typeof r=="boolean"?r?"on":"off":Array.isArray(r)?r.length?r.join(", "):"none":String(r)}function Y({field:t,patch:r,disabled:s}){return t.settable?t.type==="bool"?e.jsx(B,{checked:t.value===!0,onChange:a=>r(b(t.key,a)),label:t.key,disabled:s}):t.options&&t.options.length>0?e.jsx(D,{ariaLabel:t.key,value:String(t.value??""),onChange:a=>r(b(t.key,a)),options:t.options.map(a=>({value:a,label:a}))}):t.type==="int"||t.type==="float"?e.jsx(H,{field:t,onSave:a=>r(b(t.key,a)),disabled:s}):e.jsx(L,{field:t,onSave:a=>r(b(t.key,a)),disabled:s}):e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-sm tabular-nums text-[var(--otari-ink)]",children:$(t)}),e.jsx("span",{className:"rounded-full border border-[var(--otari-line)] px-2 py-0.5 text-xs text-[var(--otari-muted)]",children:"startup-only"})]})}function q({field:t,patch:r,disabled:s}){return e.jsxs("div",{className:"flex items-start justify-between gap-6 py-4",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("code",{className:"text-sm font-medium text-[var(--otari-ink)]",children:t.key}),t.description?e.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:t.description}):null]}),e.jsx("div",{className:"shrink-0 pt-0.5",children:e.jsx(Y,{field:t,patch:r,disabled:s})})]})}function V({value:t,fieldRef:r}){const s=u.useRef(null),a=r??s,[n,i]=u.useState(!1),[o,c]=u.useState(!1),p=async()=>{var m,x,g;(m=a.current)==null||m.focus(),(x=a.current)==null||x.select();try{if((g=navigator.clipboard)!=null&&g.writeText){await navigator.clipboard.writeText(t),i(!0),c(!1),window.setTimeout(()=>i(!1),2e3);return}}catch{}c(!0)};return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-xs font-medium text-[var(--otari-muted)]",children:"New master key"}),e.jsx(h,{size:"sm",variant:"outline",onPress:p,children:n?"Copied":"Copy"})]}),e.jsx("input",{ref:a,readOnly:!0,value:t,onFocus:m=>m.currentTarget.select(),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",spellCheck:!1,"data-1p-ignore":!0,"data-lpignore":"true"}),e.jsx("span",{"aria-live":"polite",className:"text-xs text-[var(--otari-brand-dark)]",children:n?"Copied to clipboard.":""}),o?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Selected. Press Ctrl/Cmd-C to copy."}):null]})}function U({masterKey:t,error:r,isPending:s,onRegenerate:a,onClose:n}){const i=u.useRef(null);return u.useEffect(()=>{var o,c;t!==void 0&&((o=i.current)==null||o.focus(),(c=i.current)==null||c.select())},[t]),e.jsx(d.Backdrop,{children:e.jsx(d.Container,{placement:"center",size:"lg",children:e.jsxs(d.Dialog,{children:[e.jsx(d.Header,{children:e.jsx(d.Heading,{children:t!==void 0?"Master key regenerated":"Regenerate master key?"})}),e.jsx(d.Body,{className:"flex flex-col gap-4",children:t!==void 0?e.jsxs(e.Fragment,{children:[e.jsx(w,{tone:"warning",children:"Copy this key now. It is shown once and cannot be retrieved again after you close this dialog."}),e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:"The previous master key has stopped working. This browser tab now uses the new key."}),e.jsx(V,{value:t,fieldRef:i})]}):e.jsxs(e.Fragment,{children:[e.jsx(w,{tone:"warning",children:"This immediately invalidates the current dashboard master key. Other signed-in dashboard sessions will need the new key to continue."}),e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:"The replacement key will be shown once. Save it before closing the next screen."}),e.jsx(y,{error:r})]})}),e.jsx(d.Footer,{children:t!==void 0?e.jsx(h,{variant:"primary",onPress:n,children:"I’ve saved this key"}):e.jsxs(e.Fragment,{children:[e.jsx(h,{variant:"ghost",isDisabled:s,onPress:n,children:"Cancel"}),e.jsx(h,{variant:"danger",isPending:s,onPress:a,children:"Regenerate key"})]})})]})})})}function G({source:t}){const r=A(),[s,a]=u.useState(!1),[n,i]=u.useState(),o=t==="generated",c=()=>r.mutate(void 0,{onSuccess:x=>{i(x.master_key)}}),p=()=>{a(!1),i(void 0),r.reset()},m=x=>{x?(r.reset(),a(!0)):n===void 0&&p()};return e.jsx("div",{className:"flex flex-col gap-4 py-4",children:e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("code",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"master_key"}),e.jsx("p",{className:"mt-1 max-w-3xl text-sm text-[var(--otari-muted)]",children:o?"This gateway uses its first-run generated dashboard key. Regeneration invalidates the current key immediately.":"This gateway uses a key managed through OTARI_MASTER_KEY or config.yml. Rotate it in configuration, then restart the gateway."})]}),e.jsxs(d,{isOpen:s,onOpenChange:m,children:[o?e.jsx(d.Trigger,{className:I({size:"sm",variant:"danger-soft"}),children:"Regenerate"}):e.jsx(h,{size:"sm",variant:"danger-soft",isDisabled:!0,children:"Managed in configuration"}),s?e.jsx(U,{masterKey:n,error:r.error,isPending:r.isPending,onRegenerate:c,onClose:p}):null]})]})})}function X(){var o;const t=O(),r=F(),s=r.data,a=((o=t.data)==null?void 0:o.length)??0,n=(t.data??[]).filter(c=>!c.decryptable).length,i=a>0;return e.jsxs("div",{className:"flex flex-col gap-4 py-4",children:[e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("code",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"OTARI_SECRET_KEY"}),e.jsxs("p",{className:"mt-1 max-w-3xl text-sm text-[var(--otari-muted)]",children:["Generate a new key with ",e.jsx("code",{children:"uv run otari gen-secret-key"}),", then restart with"," ",e.jsx("code",{children:"OTARI_SECRET_KEY=,"}),". Re-encrypt the stored provider keys, then restart with ",e.jsx("code",{children:"OTARI_SECRET_KEY="})," once none are unreadable."]})]}),e.jsx("div",{className:"shrink-0",children:e.jsx(h,{size:"sm",variant:"outline",isDisabled:!i||r.isPending,onPress:()=>r.mutate(),children:r.isPending?"Re-encrypting…":"Re-encrypt provider keys"})})]}),e.jsx(y,{error:t.error??r.error}),n>0?e.jsxs(w,{tone:"warning",children:[n," stored provider key",n===1?"":"s"," cannot be decrypted with the current"," ",e.jsx("code",{children:"OTARI_SECRET_KEY"}),". Restore the old secret key and re-encrypt, or edit each affected provider and replace its key."]}):null,s?e.jsxs("p",{className:"text-sm text-[var(--otari-muted)]",role:"status","aria-live":"polite",children:["Re-encrypted ",s.reencrypted," provider key",s.reencrypted===1?"":"s",".",s.unreadable>0?` ${s.unreadable} still need replacement.`:" All decryptable stored keys now use the primary secret key."]}):!t.isLoading&&!i?e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:"No stored provider keys need re-encryption."}):null]})}function J({masterKeySource:t}){return e.jsxs("section",{className:"flex flex-col gap-2",children:[e.jsxs("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:["Credential security ",e.jsx("span",{className:"font-normal text-[var(--otari-muted)]",children:"(2)"})]}),e.jsx(v,{children:e.jsxs(v.Content,{className:"flex flex-col divide-y divide-[var(--otari-line)] px-5 py-1",children:[e.jsx(G,{source:t}),e.jsx(X,{})]})})]})}function Q({preview:t,error:r,isPending:s,onAccept:a,onReject:n}){return e.jsx(d.Backdrop,{children:e.jsx(d.Container,{placement:"center",size:"lg",children:e.jsxs(d.Dialog,{children:[e.jsx(d.Header,{children:e.jsx(d.Heading,{children:"Review default price updates"})}),e.jsxs(d.Body,{className:"flex flex-col gap-4",children:[e.jsxs("p",{className:"text-sm text-[var(--otari-muted)]",children:[t.added_count," added, ",t.changed_count," changed, and ",t.removed_count," removed upstream model prices. The accepted catalog is saved in the database with source ",e.jsx("code",{children:"genai-prices"})," and reloads after a restart. Your ",t.protected_model_count," custom model price",t.protected_model_count===1?"":"s"," remain unchanged."]}),t.changes.length>0?e.jsx("ul",{className:"max-h-60 list-disc overflow-auto pl-5 text-sm text-[var(--otari-ink)]",children:t.changes.map(i=>e.jsxs("li",{children:[i.model_key,": ",i.change]},i.model_key))}):null,t.changes_truncated?e.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:"Only the first 100 changes are shown."}):null,e.jsx(y,{error:r})]}),e.jsxs(d.Footer,{children:[e.jsx(h,{variant:"ghost",isDisabled:s,onPress:n,children:"Reject changes"}),e.jsx(h,{variant:"primary",isPending:s,onPress:a,children:"Accept price updates"})]})]})})})}function W(){const t=E(),r=T(),s=_(),a=t.data,n=r.isPending||s.isPending,i=()=>{a===void 0||n||s.mutate(void 0,{onSuccess:t.reset})};return e.jsxs("section",{className:"flex flex-col gap-2",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Default pricing catalog"}),e.jsx(v,{children:e.jsxs(v.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"genai-prices defaults"}),e.jsxs("p",{className:"mt-1 max-w-3xl text-sm text-[var(--otari-muted)]",children:["Fetch the latest upstream catalog, review the proposed change summary, then accept or reject it. Accepted data is stored as ",e.jsx("code",{children:"genai-prices"}),"; custom prices remain separate and always take precedence."]})]}),e.jsx(h,{size:"sm",variant:"outline",isDisabled:t.isPending||n,onPress:()=>t.mutate(),children:t.isPending?"Checking prices…":"Check for price updates"})]}),e.jsx(y,{error:t.error})]})}),e.jsxs(d,{isOpen:a!==void 0,onOpenChange:o=>o?void 0:i(),children:[e.jsx(d.Trigger,{className:"hidden",children:"Review price updates"}),a?e.jsx(Q,{preview:a,error:r.error??s.error,isPending:n,onAccept:()=>r.mutate(void 0,{onSuccess:t.reset}),onReject:i}):null]})]})}function Z(t){const r=[],s=new Map;for(const a of t){let n=s.get(a.group);n||(n={name:a.group,fields:[]},s.set(a.group,n),r.push(n)),n.fields.push(a)}return r}function ae(){const t=R(),r=C(),s=t.data,a=r.isPending,[n,i]=u.useState(""),[o,c]=u.useState(!1),p=u.useRef(null);u.useEffect(()=>{function l(f){var N;const j=f.target,S=j&&(j.tagName==="INPUT"||j.tagName==="TEXTAREA"||j.tagName==="SELECT");f.key==="/"&&!S&&(f.preventDefault(),(N=p.current)==null||N.focus())}return window.addEventListener("keydown",l),()=>window.removeEventListener("keydown",l)},[]);const m=l=>r.mutate(l),x=(s==null?void 0:s.config)??[],g=x.filter(l=>(o?l.settable:!0)&&M(l,n)),k=Z(g);return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(P,{title:"Settings",description:"Every effective gateway setting. Settable fields apply immediately and persist across restarts; startup-only fields are shown for reference and change only via config.yml or environment variables (then a restart)."}),e.jsx(y,{error:t.error??r.error}),e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("input",{ref:p,type:"search","aria-label":"Search settings",placeholder:"Search settings (press / to focus)…",value:n,onChange:l=>i(l.target.value),onKeyDown:l=>{l.key==="Escape"&&i("")},className:"min-w-0 flex-1 rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-3 py-2 text-sm text-[var(--otari-ink)] focus:border-[var(--otari-brand)] focus:outline-none"}),e.jsxs("label",{className:"flex items-center gap-2 text-sm text-[var(--otari-muted)]",children:[e.jsx("input",{type:"checkbox",checked:o,onChange:l=>c(l.target.checked),className:"h-4 w-4 accent-[var(--otari-brand)]"}),"Settable only"]})]}),s?e.jsxs("p",{className:"text-xs text-[var(--otari-muted)]",children:["Showing ",g.length," of ",x.length," settings"]}):null,s&&g.length===0?e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:"No settings match your search."}):null,k.map(l=>e.jsxs("section",{className:"flex flex-col gap-2",children:[e.jsxs("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:[l.name," ",e.jsxs("span",{className:"font-normal text-[var(--otari-muted)]",children:["(",l.fields.length,")"]})]}),e.jsx(v,{children:e.jsx(v.Content,{className:"flex flex-col divide-y divide-[var(--otari-line)] px-5 py-1",children:l.fields.map(f=>e.jsx(q,{field:f,patch:m,disabled:!s||a},f.key))})})]},l.name)),s?e.jsx(W,{}):null,s?e.jsx(J,{masterKeySource:s.master_key_source}):null,s?e.jsxs("p",{className:"text-xs text-[var(--otari-muted)]",children:["Mode: ",s.mode," · Version ",s.version,s.require_pricing?" · require_pricing on":""]}):null]})}export{ae as SettingsPage,M as fieldMatches}; diff --git a/src/gateway/static/dashboard/assets/TablePagination-r1AimUKf.js b/src/gateway/static/dashboard/assets/TablePagination-Chra1w0V.js similarity index 98% rename from src/gateway/static/dashboard/assets/TablePagination-r1AimUKf.js rename to src/gateway/static/dashboard/assets/TablePagination-Chra1w0V.js index 5da185de..1475f1d4 100644 --- a/src/gateway/static/dashboard/assets/TablePagination-r1AimUKf.js +++ b/src/gateway/static/dashboard/assets/TablePagination-Chra1w0V.js @@ -1 +1 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as u}from"./react-dgEcD0HR.js";import{I as w,E as M,F as D}from"./index-CGnfXTEF.js";import{A as o,B as x,T as F,L as $,I as T,S as y}from"./heroui-BI50yK5B.js";function _({label:t,value:r,onChange:a,isRequired:c,autoFocus:i}){return e.jsxs(F,{value:r,onChange:a,isRequired:c,className:"flex flex-col gap-1",children:[e.jsx($,{className:"text-sm font-medium text-[var(--otari-ink)]",children:t}),e.jsx(T,{inputMode:"decimal",placeholder:"0.00",autoFocus:i})]})}function R(t){const r=t.trim();if(r==="")return null;const a=Number(r);return Number.isFinite(a)&&a>=0?a:Number.NaN}const C=t=>`Recompute cost for ${t.toLocaleString()} imported ${t===1?"row":"rows"} from each row's own token counts at these per-1M rates. Enforced gateway rows are never affected.`;function W({isOpen:t,onOpenChange:r,targetCount:a,isPending:c,error:i,onSubmit:E,title:I="Set price",description:L=C}){const[j,p]=u.useState(""),[n,h]=u.useState(""),[b,N]=u.useState(""),[f,v]=u.useState("");u.useEffect(()=>{t&&(p(""),h(""),N(""),v(""))},[t]);const m=R(j),l=R(n),d=R(b),s=R(f),g=m===null||Number.isNaN(m)||l===null||Number.isNaN(l)||Number.isNaN(d??0)||Number.isNaN(s??0),S=()=>{g||m===null||l===null||E({input_price_per_million:m,output_price_per_million:l,...d!==null&&!Number.isNaN(d)?{cache_read_price_per_million:d}:{},...s!==null&&!Number.isNaN(s)?{cache_write_price_per_million:s}:{}})};return e.jsx(o,{isOpen:t,onOpenChange:r,children:t?e.jsx(o.Backdrop,{children:e.jsx(o.Container,{placement:"center",size:"lg",children:e.jsxs(o.Dialog,{children:[e.jsx(o.Header,{children:e.jsx(o.Heading,{children:I})}),e.jsxs(o.Body,{className:"flex flex-col gap-4",children:[e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:L(a)}),e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2",children:[e.jsx(_,{label:"Input $ / 1M",value:j,onChange:p,isRequired:!0,autoFocus:!0}),e.jsx(_,{label:"Output $ / 1M",value:n,onChange:h,isRequired:!0}),e.jsx(_,{label:"Cache read $ / 1M",value:b,onChange:N}),e.jsx(_,{label:"Cache write $ / 1M",value:f,onChange:v})]}),e.jsx(w,{tone:"info",children:"Leave a cache rate blank to bill those tokens at the input rate."}),e.jsx(M,{error:i})]}),e.jsxs(o.Footer,{children:[e.jsx(x,{variant:"ghost",isDisabled:c,onPress:()=>r(!1),children:"Cancel"}),e.jsx(x,{variant:"primary",isDisabled:g,isPending:c,onPress:S,children:"Set price"})]})]})})}):null})}const P=[25,50,100];function q({page:t,pageSize:r,total:a,rowsOnPage:c,onPageChange:i,onPageSizeChange:E,pageSizeOptions:I=P,isFetching:L=!1,hasNextFallback:j=!1}){const p=u.useId(),n=a!=null?Math.max(1,Math.ceil(a/r)):null,h=t===0,b=n!=null?t>=n-1:!j,N=c>0?t*r+1:0,f=t*r+c,v=a!=null?a===0?"0 of 0":`${N.toLocaleString()}–${f.toLocaleString()} of ${a.toLocaleString()}`:c>0?`${N.toLocaleString()}–${f.toLocaleString()}`:"0",[m,l]=u.useState(String(t+1));u.useEffect(()=>{l(String(t+1))},[t]);const d=()=>{const s=Number.parseInt(m,10);if(Number.isNaN(s)){l(String(t+1));return}const g=n??Number.MAX_SAFE_INTEGER,S=Math.min(Math.max(s,1),g);S-1!==t?i(S-1):l(String(t+1))};return e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("label",{htmlFor:p,className:"text-sm text-[var(--otari-muted)]",children:"Rows"}),e.jsx(D,{id:p,ariaLabel:"Rows per page",value:String(r),onChange:s=>E(Number.parseInt(s,10)),options:I.map(s=>({value:String(s),label:String(s)}))}),L?e.jsx(y,{size:"sm"}):null]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"text-sm text-[var(--otari-muted)] tabular-nums",children:v}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(x,{size:"sm",variant:"outline","aria-label":"First page",isDisabled:h,onPress:()=>i(0),children:"«"}),e.jsx(x,{size:"sm",variant:"outline","aria-label":"Previous page",isDisabled:h,onPress:()=>i(t-1),children:"‹"}),e.jsxs("span",{className:"inline-flex items-center gap-1 text-sm text-[var(--otari-muted)]",children:[e.jsx("input",{"aria-label":"Page number",inputMode:"numeric",value:m,onChange:s=>l(s.target.value.replace(/[^0-9]/g,"")),onKeyDown:s=>{s.key==="Enter"&&s.currentTarget.blur()},onBlur:d,className:"w-12 rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-2 py-1 text-center text-sm text-[var(--otari-ink)] tabular-nums focus:border-[var(--otari-brand)] focus:outline-none"}),n!=null?e.jsxs("span",{className:"tabular-nums",children:["/ ",n.toLocaleString()]}):null]}),e.jsx(x,{size:"sm",variant:"outline","aria-label":"Next page",isDisabled:b,onPress:()=>i(t+1),children:"›"}),e.jsx(x,{size:"sm",variant:"outline","aria-label":"Last page",isDisabled:n==null||b,onPress:()=>n!=null&&i(n-1),children:"»"})]})]})]})}export{P,W as S,q as T}; +import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as u}from"./react-dgEcD0HR.js";import{I as w,E as M,F as D}from"./index-DHi1jXMu.js";import{A as o,B as x,T as F,L as $,I as T,S as y}from"./heroui-BI50yK5B.js";function _({label:t,value:r,onChange:a,isRequired:c,autoFocus:i}){return e.jsxs(F,{value:r,onChange:a,isRequired:c,className:"flex flex-col gap-1",children:[e.jsx($,{className:"text-sm font-medium text-[var(--otari-ink)]",children:t}),e.jsx(T,{inputMode:"decimal",placeholder:"0.00",autoFocus:i})]})}function R(t){const r=t.trim();if(r==="")return null;const a=Number(r);return Number.isFinite(a)&&a>=0?a:Number.NaN}const C=t=>`Recompute cost for ${t.toLocaleString()} imported ${t===1?"row":"rows"} from each row's own token counts at these per-1M rates. Enforced gateway rows are never affected.`;function W({isOpen:t,onOpenChange:r,targetCount:a,isPending:c,error:i,onSubmit:E,title:I="Set price",description:L=C}){const[j,p]=u.useState(""),[n,h]=u.useState(""),[b,N]=u.useState(""),[f,v]=u.useState("");u.useEffect(()=>{t&&(p(""),h(""),N(""),v(""))},[t]);const m=R(j),l=R(n),d=R(b),s=R(f),g=m===null||Number.isNaN(m)||l===null||Number.isNaN(l)||Number.isNaN(d??0)||Number.isNaN(s??0),S=()=>{g||m===null||l===null||E({input_price_per_million:m,output_price_per_million:l,...d!==null&&!Number.isNaN(d)?{cache_read_price_per_million:d}:{},...s!==null&&!Number.isNaN(s)?{cache_write_price_per_million:s}:{}})};return e.jsx(o,{isOpen:t,onOpenChange:r,children:t?e.jsx(o.Backdrop,{children:e.jsx(o.Container,{placement:"center",size:"lg",children:e.jsxs(o.Dialog,{children:[e.jsx(o.Header,{children:e.jsx(o.Heading,{children:I})}),e.jsxs(o.Body,{className:"flex flex-col gap-4",children:[e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:L(a)}),e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2",children:[e.jsx(_,{label:"Input $ / 1M",value:j,onChange:p,isRequired:!0,autoFocus:!0}),e.jsx(_,{label:"Output $ / 1M",value:n,onChange:h,isRequired:!0}),e.jsx(_,{label:"Cache read $ / 1M",value:b,onChange:N}),e.jsx(_,{label:"Cache write $ / 1M",value:f,onChange:v})]}),e.jsx(w,{tone:"info",children:"Leave a cache rate blank to bill those tokens at the input rate."}),e.jsx(M,{error:i})]}),e.jsxs(o.Footer,{children:[e.jsx(x,{variant:"ghost",isDisabled:c,onPress:()=>r(!1),children:"Cancel"}),e.jsx(x,{variant:"primary",isDisabled:g,isPending:c,onPress:S,children:"Set price"})]})]})})}):null})}const P=[25,50,100];function q({page:t,pageSize:r,total:a,rowsOnPage:c,onPageChange:i,onPageSizeChange:E,pageSizeOptions:I=P,isFetching:L=!1,hasNextFallback:j=!1}){const p=u.useId(),n=a!=null?Math.max(1,Math.ceil(a/r)):null,h=t===0,b=n!=null?t>=n-1:!j,N=c>0?t*r+1:0,f=t*r+c,v=a!=null?a===0?"0 of 0":`${N.toLocaleString()}–${f.toLocaleString()} of ${a.toLocaleString()}`:c>0?`${N.toLocaleString()}–${f.toLocaleString()}`:"0",[m,l]=u.useState(String(t+1));u.useEffect(()=>{l(String(t+1))},[t]);const d=()=>{const s=Number.parseInt(m,10);if(Number.isNaN(s)){l(String(t+1));return}const g=n??Number.MAX_SAFE_INTEGER,S=Math.min(Math.max(s,1),g);S-1!==t?i(S-1):l(String(t+1))};return e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("label",{htmlFor:p,className:"text-sm text-[var(--otari-muted)]",children:"Rows"}),e.jsx(D,{id:p,ariaLabel:"Rows per page",value:String(r),onChange:s=>E(Number.parseInt(s,10)),options:I.map(s=>({value:String(s),label:String(s)}))}),L?e.jsx(y,{size:"sm"}):null]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"text-sm text-[var(--otari-muted)] tabular-nums",children:v}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(x,{size:"sm",variant:"outline","aria-label":"First page",isDisabled:h,onPress:()=>i(0),children:"«"}),e.jsx(x,{size:"sm",variant:"outline","aria-label":"Previous page",isDisabled:h,onPress:()=>i(t-1),children:"‹"}),e.jsxs("span",{className:"inline-flex items-center gap-1 text-sm text-[var(--otari-muted)]",children:[e.jsx("input",{"aria-label":"Page number",inputMode:"numeric",value:m,onChange:s=>l(s.target.value.replace(/[^0-9]/g,"")),onKeyDown:s=>{s.key==="Enter"&&s.currentTarget.blur()},onBlur:d,className:"w-12 rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-2 py-1 text-center text-sm text-[var(--otari-ink)] tabular-nums focus:border-[var(--otari-brand)] focus:outline-none"}),n!=null?e.jsxs("span",{className:"tabular-nums",children:["/ ",n.toLocaleString()]}):null]}),e.jsx(x,{size:"sm",variant:"outline","aria-label":"Next page",isDisabled:b,onPress:()=>i(t+1),children:"›"}),e.jsx(x,{size:"sm",variant:"outline","aria-label":"Last page",isDisabled:n==null||b,onPress:()=>n!=null&&i(n-1),children:"»"})]})]})]})}export{P,W as S,q as T}; diff --git a/src/gateway/static/dashboard/assets/ToolsGuardrailsPage-1cTNaDRp.js b/src/gateway/static/dashboard/assets/ToolsGuardrailsPage-KUSgM6cX.js similarity index 99% rename from src/gateway/static/dashboard/assets/ToolsGuardrailsPage-1cTNaDRp.js rename to src/gateway/static/dashboard/assets/ToolsGuardrailsPage-KUSgM6cX.js index 198ee9ab..7f03b8b2 100644 --- a/src/gateway/static/dashboard/assets/ToolsGuardrailsPage-1cTNaDRp.js +++ b/src/gateway/static/dashboard/assets/ToolsGuardrailsPage-KUSgM6cX.js @@ -1 +1 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as x}from"./react-dgEcD0HR.js";import{a8 as C,a9 as L,P as E,E as P,D as w,aa as R,F as D}from"./index-CGnfXTEF.js";import{d as N,B as b}from"./heroui-BI50yK5B.js";function M(s,t){return{[s]:t}}const U=[{key:"web_search",label:"Web search",blurb:"Backend for otari_web_search tools (a SearXNG instance or a search adapter).",order:["web_search_url","web_search_engines","web_search_max_results","web_search_extract","web_search_purpose_hint"]},{key:"sandbox",label:"Code execution",blurb:"Backend for otari_code_execution tools (the sandbox that runs generated code).",order:["sandbox_url","sandbox_purpose_hint"]},{key:"guardrails",label:"Guardrails",blurb:"Default input-guardrails service used when a request does not pass its own guardrail URL.",order:["guardrails_url"]}];function B(){const[s,t]=x.useState(null),a=x.useRef(void 0),n=r=>{t(r),window.clearTimeout(a.current),a.current=window.setTimeout(()=>t(null),2500)};return x.useEffect(()=>()=>window.clearTimeout(a.current),[]),[s,n]}function $({message:s}){return s?e.jsxs("div",{role:"status","aria-live":"polite",className:"fixed right-4 bottom-4 z-50 flex items-center gap-2 rounded-lg border border-green-200 bg-green-50 px-4 py-3 text-sm font-medium text-green-700 shadow-lg",children:[e.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2","aria-hidden":!0,className:"h-5 w-5",children:e.jsx("path",{d:"M20 6 9 17l-5-5",strokeLinecap:"round",strokeLinejoin:"round"})}),s]}):null}const S="rounded-md border border-[var(--otari-line)] bg-[var(--otari-surface)] px-2 py-1 text-sm focus:border-[var(--otari-brand)] focus:outline-none disabled:opacity-50",g="grid gap-x-4 gap-y-1.5 py-4 sm:grid-cols-[minmax(0,1fr)_16rem_10rem] sm:items-start",_=`w-full sm:col-start-2 ${S}`,k="flex items-center gap-2 sm:col-start-3",f="flex flex-col gap-1 sm:col-span-2 sm:col-start-2";function j({message:s}){return s?e.jsx("span",{className:"break-words text-xs text-red-700",children:s}):null}function y({field:s,help:t}){return e.jsxs("div",{className:"min-w-0 sm:col-start-1",children:[e.jsx("code",{className:"text-sm font-medium text-[var(--otari-ink)]",children:s.key}),s.description?e.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:s.description}):null,t?e.jsx("p",{className:"mt-1 text-xs text-[var(--otari-muted)]",children:t}):null]})}function z({field:s,onSave:t,saveError:a,disabled:n}){const r=typeof s.value=="string"?s.value:"",[l,i]=x.useState(r),[m,p]=x.useState(null),c=R();x.useEffect(()=>{i(r)},[r]);const o=l.trim()!==r,d=l.trim(),h=m!==null&&m===d;return e.jsxs("div",{className:g,children:[e.jsx(y,{field:s,help:"Leave blank and Save to fall back to the configured default."}),e.jsx("input",{type:"text",inputMode:"url","aria-label":s.key,value:l,disabled:n,placeholder:"unset",onChange:v=>{i(v.target.value),c.reset()},className:_}),e.jsxs("div",{className:k,children:[e.jsx(b,{size:"sm",variant:"primary","aria-label":`Save ${s.key}`,isDisabled:n||!o,onPress:()=>t(d===""?null:d),children:"Save"}),e.jsx(b,{size:"sm",variant:"outline","aria-label":`Test ${s.service}`,isDisabled:d===""||c.isPending,onPress:()=>{p(d),c.mutate({service:s.service,url:d})},children:c.isPending?"Testing…":"Test"})]}),e.jsxs("div",{className:f,children:[e.jsx("span",{role:"status","aria-live":"polite",className:"block break-words text-xs",children:c.isPending||!h?null:c.error?e.jsx("span",{className:"text-red-700",children:w(c.error)}):c.data?e.jsx("span",{className:c.data.ok?"font-medium text-green-700":"text-red-700",children:c.data.reason}):null}),e.jsx(j,{message:a})]})]})}function G({field:s,onSave:t,saveError:a,disabled:n}){const r=typeof s.value=="string"?s.value:"",[l,i]=x.useState(r);x.useEffect(()=>{i(r)},[r]);const m=l!==r;return e.jsxs("div",{className:g,children:[e.jsx(y,{field:s}),e.jsx("input",{type:"text","aria-label":s.key,value:l,disabled:n,placeholder:"default",onChange:p=>i(p.target.value),className:_}),e.jsx("div",{className:k,children:e.jsx(b,{size:"sm",variant:"primary","aria-label":`Save ${s.key}`,isDisabled:n||!m,onPress:()=>t(l.trim()===""?null:l.trim()),children:"Save"})}),a?e.jsx("div",{className:f,children:e.jsx(j,{message:a})}):null]})}function I({field:s,onSave:t,saveError:a,disabled:n}){const r=typeof s.value=="number"?String(s.value):"",[l,i]=x.useState(r);x.useEffect(()=>{i(r)},[r]);const m=l.trim(),p=Number(m),o=(m===""||Number.isInteger(p)&&p>=1)&&m!==r;return e.jsxs("div",{className:g,children:[e.jsx(y,{field:s,help:"Leave blank to use the backend default."}),e.jsx("input",{type:"number",min:"1",step:"1",inputMode:"numeric","aria-label":s.key,value:l,disabled:n,placeholder:"default",onChange:d=>i(d.target.value),className:`w-full text-right tabular-nums sm:col-start-2 sm:w-28 sm:justify-self-end ${S}`}),e.jsx("div",{className:k,children:e.jsx(b,{size:"sm",variant:"primary","aria-label":`Save ${s.key}`,isDisabled:n||!o,onPress:()=>t(m===""?null:p),children:"Save"})}),a?e.jsx("div",{className:f,children:e.jsx(j,{message:a})}):null]})}function A({field:s,onSave:t,saveError:a,disabled:n}){const r=s.value===!0?"on":s.value===!1?"off":"default";return e.jsxs("div",{className:g,children:[e.jsx(y,{field:s}),e.jsx("div",{className:"sm:col-start-2 sm:justify-self-start",children:e.jsx(D,{ariaLabel:s.key,value:r,onChange:l=>t(l==="default"?null:l==="on"),options:[{value:"default",label:"Default"},{value:"on",label:"On"},{value:"off",label:"Off"}],disabled:n})}),a?e.jsx("div",{className:f,children:e.jsx(j,{message:a})}):null]})}function F({field:s,onSave:t,saveError:a,disabled:n}){return s.type==="url"?e.jsx(z,{field:s,onSave:t,saveError:a,disabled:n}):s.type==="int"?e.jsx(I,{field:s,onSave:t,saveError:a,disabled:n}):s.type==="bool"?e.jsx(A,{field:s,onSave:t,saveError:a,disabled:n}):e.jsx(G,{field:s,onSave:t,saveError:a,disabled:n})}function K(){const s=C(),t=L(),[a,n]=B(),[r,l]=x.useState({}),i=s.data,m=!i||t.isPending,p=new Map(((i==null?void 0:i.fields)??[]).map(o=>[o.key,o])),c=(o,d)=>{l(h=>{const{[o.key]:v,...u}=h;return u}),t.mutate(M(o.key,d),{onSuccess:()=>n(`${o.key} saved`),onError:h=>l(v=>({...v,[o.key]:w(h)}))})};return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(E,{title:"Tools & Guardrails",description:"Configure the built-in tool and guardrail service endpoints without a restart. Changes apply immediately and persist. URLs are validated for shape (http/https) and can be tested for reachability before saving; the network-safety gates for these services live on the Settings page."}),e.jsx(P,{error:s.error}),U.map(o=>{const d=o.order.map(u=>p.get(u)).filter(u=>u!==void 0),h=((i==null?void 0:i.fields)??[]).filter(u=>u.service===o.key&&!o.order.includes(u.key)),v=[...d,...h];return v.length===0?null:e.jsxs("section",{className:"flex flex-col gap-2",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:o.label}),e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:o.blurb}),e.jsx(N,{children:e.jsx(N.Content,{className:"flex flex-col divide-y divide-[var(--otari-line)] px-5 py-1",children:v.map(u=>e.jsx(F,{field:u,onSave:T=>c(u,T),saveError:r[u.key],disabled:m},u.key))})})]},o.key)}),e.jsx($,{message:a})]})}export{K as ToolsGuardrailsPage}; +import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as x}from"./react-dgEcD0HR.js";import{a8 as C,a9 as L,P as E,E as P,D as w,aa as R,F as D}from"./index-DHi1jXMu.js";import{d as N,B as b}from"./heroui-BI50yK5B.js";function M(s,t){return{[s]:t}}const U=[{key:"web_search",label:"Web search",blurb:"Backend for otari_web_search tools (a SearXNG instance or a search adapter).",order:["web_search_url","web_search_engines","web_search_max_results","web_search_extract","web_search_purpose_hint"]},{key:"sandbox",label:"Code execution",blurb:"Backend for otari_code_execution tools (the sandbox that runs generated code).",order:["sandbox_url","sandbox_purpose_hint"]},{key:"guardrails",label:"Guardrails",blurb:"Default input-guardrails service used when a request does not pass its own guardrail URL.",order:["guardrails_url"]}];function B(){const[s,t]=x.useState(null),a=x.useRef(void 0),n=r=>{t(r),window.clearTimeout(a.current),a.current=window.setTimeout(()=>t(null),2500)};return x.useEffect(()=>()=>window.clearTimeout(a.current),[]),[s,n]}function $({message:s}){return s?e.jsxs("div",{role:"status","aria-live":"polite",className:"fixed right-4 bottom-4 z-50 flex items-center gap-2 rounded-lg border border-green-200 bg-green-50 px-4 py-3 text-sm font-medium text-green-700 shadow-lg",children:[e.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2","aria-hidden":!0,className:"h-5 w-5",children:e.jsx("path",{d:"M20 6 9 17l-5-5",strokeLinecap:"round",strokeLinejoin:"round"})}),s]}):null}const S="rounded-md border border-[var(--otari-line)] bg-[var(--otari-surface)] px-2 py-1 text-sm focus:border-[var(--otari-brand)] focus:outline-none disabled:opacity-50",g="grid gap-x-4 gap-y-1.5 py-4 sm:grid-cols-[minmax(0,1fr)_16rem_10rem] sm:items-start",_=`w-full sm:col-start-2 ${S}`,k="flex items-center gap-2 sm:col-start-3",f="flex flex-col gap-1 sm:col-span-2 sm:col-start-2";function j({message:s}){return s?e.jsx("span",{className:"break-words text-xs text-red-700",children:s}):null}function y({field:s,help:t}){return e.jsxs("div",{className:"min-w-0 sm:col-start-1",children:[e.jsx("code",{className:"text-sm font-medium text-[var(--otari-ink)]",children:s.key}),s.description?e.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:s.description}):null,t?e.jsx("p",{className:"mt-1 text-xs text-[var(--otari-muted)]",children:t}):null]})}function z({field:s,onSave:t,saveError:a,disabled:n}){const r=typeof s.value=="string"?s.value:"",[l,i]=x.useState(r),[m,p]=x.useState(null),c=R();x.useEffect(()=>{i(r)},[r]);const o=l.trim()!==r,d=l.trim(),h=m!==null&&m===d;return e.jsxs("div",{className:g,children:[e.jsx(y,{field:s,help:"Leave blank and Save to fall back to the configured default."}),e.jsx("input",{type:"text",inputMode:"url","aria-label":s.key,value:l,disabled:n,placeholder:"unset",onChange:v=>{i(v.target.value),c.reset()},className:_}),e.jsxs("div",{className:k,children:[e.jsx(b,{size:"sm",variant:"primary","aria-label":`Save ${s.key}`,isDisabled:n||!o,onPress:()=>t(d===""?null:d),children:"Save"}),e.jsx(b,{size:"sm",variant:"outline","aria-label":`Test ${s.service}`,isDisabled:d===""||c.isPending,onPress:()=>{p(d),c.mutate({service:s.service,url:d})},children:c.isPending?"Testing…":"Test"})]}),e.jsxs("div",{className:f,children:[e.jsx("span",{role:"status","aria-live":"polite",className:"block break-words text-xs",children:c.isPending||!h?null:c.error?e.jsx("span",{className:"text-red-700",children:w(c.error)}):c.data?e.jsx("span",{className:c.data.ok?"font-medium text-green-700":"text-red-700",children:c.data.reason}):null}),e.jsx(j,{message:a})]})]})}function G({field:s,onSave:t,saveError:a,disabled:n}){const r=typeof s.value=="string"?s.value:"",[l,i]=x.useState(r);x.useEffect(()=>{i(r)},[r]);const m=l!==r;return e.jsxs("div",{className:g,children:[e.jsx(y,{field:s}),e.jsx("input",{type:"text","aria-label":s.key,value:l,disabled:n,placeholder:"default",onChange:p=>i(p.target.value),className:_}),e.jsx("div",{className:k,children:e.jsx(b,{size:"sm",variant:"primary","aria-label":`Save ${s.key}`,isDisabled:n||!m,onPress:()=>t(l.trim()===""?null:l.trim()),children:"Save"})}),a?e.jsx("div",{className:f,children:e.jsx(j,{message:a})}):null]})}function I({field:s,onSave:t,saveError:a,disabled:n}){const r=typeof s.value=="number"?String(s.value):"",[l,i]=x.useState(r);x.useEffect(()=>{i(r)},[r]);const m=l.trim(),p=Number(m),o=(m===""||Number.isInteger(p)&&p>=1)&&m!==r;return e.jsxs("div",{className:g,children:[e.jsx(y,{field:s,help:"Leave blank to use the backend default."}),e.jsx("input",{type:"number",min:"1",step:"1",inputMode:"numeric","aria-label":s.key,value:l,disabled:n,placeholder:"default",onChange:d=>i(d.target.value),className:`w-full text-right tabular-nums sm:col-start-2 sm:w-28 sm:justify-self-end ${S}`}),e.jsx("div",{className:k,children:e.jsx(b,{size:"sm",variant:"primary","aria-label":`Save ${s.key}`,isDisabled:n||!o,onPress:()=>t(m===""?null:p),children:"Save"})}),a?e.jsx("div",{className:f,children:e.jsx(j,{message:a})}):null]})}function A({field:s,onSave:t,saveError:a,disabled:n}){const r=s.value===!0?"on":s.value===!1?"off":"default";return e.jsxs("div",{className:g,children:[e.jsx(y,{field:s}),e.jsx("div",{className:"sm:col-start-2 sm:justify-self-start",children:e.jsx(D,{ariaLabel:s.key,value:r,onChange:l=>t(l==="default"?null:l==="on"),options:[{value:"default",label:"Default"},{value:"on",label:"On"},{value:"off",label:"Off"}],disabled:n})}),a?e.jsx("div",{className:f,children:e.jsx(j,{message:a})}):null]})}function F({field:s,onSave:t,saveError:a,disabled:n}){return s.type==="url"?e.jsx(z,{field:s,onSave:t,saveError:a,disabled:n}):s.type==="int"?e.jsx(I,{field:s,onSave:t,saveError:a,disabled:n}):s.type==="bool"?e.jsx(A,{field:s,onSave:t,saveError:a,disabled:n}):e.jsx(G,{field:s,onSave:t,saveError:a,disabled:n})}function K(){const s=C(),t=L(),[a,n]=B(),[r,l]=x.useState({}),i=s.data,m=!i||t.isPending,p=new Map(((i==null?void 0:i.fields)??[]).map(o=>[o.key,o])),c=(o,d)=>{l(h=>{const{[o.key]:v,...u}=h;return u}),t.mutate(M(o.key,d),{onSuccess:()=>n(`${o.key} saved`),onError:h=>l(v=>({...v,[o.key]:w(h)}))})};return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(E,{title:"Tools & Guardrails",description:"Configure the built-in tool and guardrail service endpoints without a restart. Changes apply immediately and persist. URLs are validated for shape (http/https) and can be tested for reachability before saving; the network-safety gates for these services live on the Settings page."}),e.jsx(P,{error:s.error}),U.map(o=>{const d=o.order.map(u=>p.get(u)).filter(u=>u!==void 0),h=((i==null?void 0:i.fields)??[]).filter(u=>u.service===o.key&&!o.order.includes(u.key)),v=[...d,...h];return v.length===0?null:e.jsxs("section",{className:"flex flex-col gap-2",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:o.label}),e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:o.blurb}),e.jsx(N,{children:e.jsx(N.Content,{className:"flex flex-col divide-y divide-[var(--otari-line)] px-5 py-1",children:v.map(u=>e.jsx(F,{field:u,onSave:T=>c(u,T),saveError:r[u.key],disabled:m},u.key))})})]},o.key)}),e.jsx($,{message:a})]})}export{K as ToolsGuardrailsPage}; diff --git a/src/gateway/static/dashboard/assets/UsagePage-BECQyz4e.js b/src/gateway/static/dashboard/assets/UsagePage-M0prV-lU.js similarity index 97% rename from src/gateway/static/dashboard/assets/UsagePage-BECQyz4e.js rename to src/gateway/static/dashboard/assets/UsagePage-M0prV-lU.js index 8a667745..ac5fe4e2 100644 --- a/src/gateway/static/dashboard/assets/UsagePage-BECQyz4e.js +++ b/src/gateway/static/dashboard/assets/UsagePage-M0prV-lU.js @@ -1 +1 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{i as Ue,r as i}from"./react-dgEcD0HR.js";import{u as Ae,a as Re,d as Q,M as F,P as Oe,E as ye,R as Ke,g as te,S as E,O as T,N as W,T as $e,ab as B,e as Be,f as Ie,b as ze,c as xe}from"./index-CGnfXTEF.js";import{i as se,c as He,U as ke,A as Ge,d as je,F as Ye,f as Ze}from"./FilterChips-Wo8I8zEd.js";import{u as Qe,r as Ve,B as We}from"./tableSelection-9hV37uhu.js";import{S as ae,B as Je}from"./charts-DIsd9m--.js";import{C as Xe}from"./ConfirmDialog-CWW3AYpK.js";import{D as we}from"./DataTable-Bmn_eYSV.js";import{T as et,S as tt}from"./TablePagination-r1AimUKf.js";import{B as I,S as pe}from"./heroui-BI50yK5B.js";import"./recharts-C4kRDmvS.js";function V(t){return t.toLocaleString()}function st(t){return t===null?"—":t<1e3?`${Math.round(t)} ms`:`${(t/1e3).toFixed(2)} s`}const fe=Ze(je,ke),ne=15,_e="__other__",ve="__unknown__";function Se({title:t,rows:r,totalCost:h,emptyLabel:n,onDrill:_,loading:m}){const[c,x]=i.useState(!1),j=c?r:r.slice(0,ne),U=r.length-j.length,N=o=>o.is_other?_e:o.key??ve,A=[{id:"name",header:t.replace("Spend by ",""),isRowHeader:!0,cell:o=>{const d=h>0?o.cost/h:0;return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("span",{className:"truncate text-[var(--otari-ink)]",children:o.is_other?`Other (${o.requests.toLocaleString()} req)`:o.key===null?"(unknown)":o.key}),e.jsx("span",{className:"h-1 w-full overflow-hidden rounded-full bg-[var(--otari-line)]",children:e.jsx("span",{className:"block h-full rounded-full bg-[var(--otari-brand)]",style:{width:`${Math.min(100,d*100)}%`}})})]})}},{id:"requests",header:"Requests",align:"end",cell:o=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:V(o.requests)})},{id:"spend",header:"Spend",align:"end",cell:o=>e.jsx("span",{className:"text-[var(--otari-ink)]",children:W(o.cost)})}];return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:t}),e.jsx(we,{ariaLabel:t,columns:A,rows:j,getRowKey:N,isLoading:m,emptyContent:n,onRowAction:o=>{o!==_e&&o!==ve&&_(o)}}),!m&&U>0?e.jsxs(I,{size:"sm",variant:"ghost",onPress:()=>x(!0),children:["Show all ",r.length]}):null,!m&&c&&r.length>ne?e.jsxs(I,{size:"sm",variant:"ghost",onPress:()=>x(!1),children:["Show top ",ne]}):null]})}const at=[{key:"cost",label:"Cost"},{key:"tokens",label:"Tokens"},{key:"requests",label:"Requests"}];function nt(t,r){return r==="cost"?t.cost:r==="tokens"?t.tokens:t.requests}function be(t,r){return r==="cost"?W(t):r==="tokens"?B(t):V(t)}function ot(t,r){const h=new Date(t);return Number.isNaN(h.getTime())?t:r==="hour"?h.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",timeZone:"UTC"}):h.toLocaleDateString(void 0,{month:"short",day:"numeric",timeZone:"UTC"})}function rt(t,r,h){const n=t.map(m=>({label:ot(m.bucket_start,h),value:nt(m,r)})),_=n.length?Math.max(...n.map(m=>m.value)):0;return{points:n,peak:_,count:t.length}}const lt=50;function it(t){const r=new Date(t).getTime();if(Number.isNaN(r))return t;const h=Math.max(0,Math.round((Date.now()-r)/1e3));if(h<60)return`${h}s ago`;const n=Math.round(h/60);if(n<60)return`${n}m ago`;const _=Math.round(n/60);return _<24?`${_}h ago`:`${Math.round(_/24)}d ago`}function ct({status:t}){return e.jsx("span",{className:`inline-flex items-center rounded-full border px-2 py-0.5 text-xs font-medium ${t==="error"?"border-red-200 bg-red-50 text-red-700":"border-[var(--otari-line)] bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]"}`,children:t})}const dt=[{id:"time",header:"Time",isRowHeader:!0,cell:t=>e.jsx("span",{className:"text-[var(--otari-muted)]",title:new Date(t.timestamp).toLocaleString(),children:it(t.timestamp)})},{id:"model",header:"Model",cell:t=>e.jsx("span",{className:"text-[var(--otari-ink)]",children:t.model})},{id:"user",header:"User",cell:t=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:t.user_id??"—"})},{id:"tokens",header:"Tokens",align:"end",cell:t=>t.total_tokens===null?"—":t.total_tokens.toLocaleString()},{id:"cost",header:"Cost",align:"end",cell:t=>t.cost===null?"—":W(t.cost)},{id:"status",header:"Status",cell:t=>e.jsx(ct,{status:t.status})}],ut=t=>t.id;function mt({filters:t,anyFilter:r}){var $,H;const[h,n]=i.useState(0),[_,m]=i.useState(lt),c=Qe(),x=Be(),j=Ie(),[U,N]=i.useState(!1),[A,o]=i.useState(!1),d=JSON.stringify(t),q=i.useRef(d);i.useEffect(()=>{q.current!==d&&(q.current=d,n(0),c.clear())},[d,c]);const p=ze(t,h,_),C=xe(t),g=p.data??[],P=C.isSuccess&&!C.isPlaceholderData?(($=C.data)==null?void 0:$.total)??0:null,R=g.filter(y=>!y.counts_toward_budget).map(y=>y.id),f=g.filter(y=>y.counts_toward_budget).map(y=>y.id),v=Ve(c.selectedKeys,R),S=v.length,k=c.allMatching||S>0,O=i.useMemo(()=>({...t,counts_toward_budget:!1}),[t]),b=xe(O,k),L=b.isSuccess?((H=b.data)==null?void 0:H.total)??null:null,K=R.length>0&&S===R.length&&L!=null&&L>S,M=c.allMatching?L??S:S,l=()=>c.allMatching?{by_filter:!0,model:t.model,user_id:t.user_id,api_key_id:t.api_key_id,start_date:t.start_date,end_date:t.end_date,priced:t.priced}:{ids:v},a=()=>x.mutate(l(),{onSuccess:()=>{N(!1),c.clear()}}),u=y=>j.mutate({...l(),...y},{onSuccess:()=>{o(!1),c.clear()}});return e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Individual requests"}),e.jsx(ye,{error:p.error??C.error}),k?e.jsxs(We,{selectedCount:M,allMatching:c.allMatching,matchingTotal:L,canSelectAllMatching:K,onSelectAllMatching:c.enableAllMatching,onClear:c.clear,children:[e.jsx(I,{size:"sm",variant:"primary",onPress:()=>o(!0),children:"Set price"}),e.jsx(I,{size:"sm",variant:"danger",onPress:()=>N(!0),children:"Delete"})]}):null,e.jsx(we,{ariaLabel:"Individual requests",columns:dt,rows:g,getRowKey:ut,isLoading:p.isLoading,emptyContent:r?"No requests match these filters.":"No requests recorded yet.",selectionMode:"multiple",selectedKeys:c.selectedKeys,onSelectionChange:c.onSelectionChange,disabledKeys:f}),e.jsx(et,{page:h,pageSize:_,total:P,rowsOnPage:g.length,onPageChange:n,onPageSizeChange:y=>{m(y),n(0)},isFetching:p.isFetching,hasNextFallback:g.length===_}),e.jsx(Xe,{isOpen:U,onOpenChange:N,heading:"Delete usage rows",body:`Delete ${M.toLocaleString()} imported ${M===1?"row":"rows"}? Only imported rows are removed, and this cannot be undone.`,confirmLabel:"Delete",isPending:x.isPending,error:x.error,onConfirm:a}),e.jsx(tt,{isOpen:A,onOpenChange:o,targetCount:M,isPending:j.isPending,error:j.error,onSubmit:u})]})}function jt(){var ue,me,he,ge;const t=Ue(),r=Ae(),h=Re(),[n,_]=i.useState(fe),[m,c]=i.useState(()=>se(fe.seconds??0)),[x,j]=i.useState(!1),[U,N]=i.useState(),[A,o]=i.useState(),[d,q]=i.useState(""),[p,C]=i.useState(""),[g,z]=i.useState(""),[P,R]=i.useState("cost"),f=x?U:m,v=x?A:void 0,S=x?f?He(f,v):"day":n.bucket,k=i.useMemo(()=>({start_date:f,end_date:v,model:d.trim()||void 0,user_id:p||void 0,api_key_id:g||void 0}),[f,v,d,p,g]),O=i.useMemo(()=>{if(x){if(!f||!v)return null;const s=new Date(v).getTime()-new Date(f).getTime();return s>0?{...k,start_date:new Date(new Date(f).getTime()-s).toISOString(),end_date:f}:null}return!m||n.seconds===null?null:{...k,start_date:new Date(new Date(m).getTime()-n.seconds*1e3).toISOString(),end_date:m}},[x,f,v,k,n.seconds,m]),b=Q(k,S),L=Q(O??k,S,O!==null),oe=i.useMemo(()=>({start_date:m,model:d.trim()||void 0,user_id:p||void 0,api_key_id:g||void 0}),[m,d,p,g]),K=Q(oe,n.bucket),M=(((ue=K.data)==null?void 0:ue.series)??[]).map(s=>({bucketStart:s.bucket_start,requests:s.requests})),l=b.data,a=l==null?void 0:l.totals,u=O!==null?(me=L.data)==null?void 0:me.totals:void 0,$=a?F(a.cost,u==null?void 0:u.cost):null,H=i.useMemo(()=>({...k,model:void 0}),[k]),J=((ge=(he=Q(H,S).data)==null?void 0:he.by_model)==null?void 0:ge.filter(s=>!s.is_other&&s.key!==null).map(s=>s.key))??[],re=(r.data??[]).map(s=>({value:s.user_id,label:s.alias?`${s.alias} (${s.user_id})`:s.user_id})),le=(h.data??[]).map(s=>({value:s.id,label:s.key_name??`${s.id.slice(0,8)}…`})),Ne=(d&&!J.includes(d)?[d,...J]:J).map(s=>({value:s,label:s})),Ce=x||n.key!==ke,G=!!(d.trim()||p||g||Ce),ie=(s,w)=>{var Y;return((Y=s.find(Z=>Z.value===w))==null?void 0:Y.label)??w},Pe=()=>{q(""),C(""),z("")},Ee=[...p?[{key:"user",label:"User",value:ie(re,p),onClear:()=>C("")}]:[],...d.trim()?[{key:"model",label:"Model",value:d.trim(),onClear:()=>q("")}]:[],...g?[{key:"key",label:"API key",value:ie(le,g),onClear:()=>z("")}]:[]],qe=!!(l&&a&&a.request_count===0&&!G),Le=(l==null?void 0:l.start_date)??f,Me=(l==null?void 0:l.end_date)??v,ce=s=>{j(!1),_(s),c(se(s.seconds??0)),N(void 0),o(void 0)},De=(s,w)=>{j(!0),N(s),o(w)},Fe=()=>{x||c(se(n.seconds??0)),b.refetch(),K.refetch()},de=s=>{const w=new URLSearchParams;f&&w.set("start_date",f),v&&w.set("end_date",v);for(const[Y,Z]of Object.entries(s))Z&&w.set(Y,Z);t(`/activity?${w.toString()}`)},Te=a&&a.request_count>0?a.error_count/a.request_count:0,D=(l==null?void 0:l.series)??[],X=D.length>1,ee=rt(D,P,S);return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(Oe,{title:"Usage & analytics",description:"Aggregate spend, tokens, and request volume over time. Click a model or user to drill into the request log."}),e.jsx(ye,{error:b.error}),e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx(Ge,{presets:je,extentKey:n.key,onPreset:ce,onSelectRange:De,onSelectFull:()=>ce(n),series:M,bucket:n.bucket,windowStart:Le,windowEnd:Me,loading:K.isLoading,ariaLabel:"Usage request volume over the selected window",action:e.jsx(Ke,{onRefresh:Fe,isFetching:b.isFetching,updatedAt:b.dataUpdatedAt})}),e.jsxs(Ye,{chips:Ee,onClearAll:Pe,children:[e.jsx(te,{label:"User",value:p,onChange:C,options:re,placeholder:"All users"}),e.jsx(te,{label:"Model",value:d,onChange:q,options:Ne,placeholder:"All models"}),e.jsx(te,{label:"API key",value:g,onChange:z,options:le,placeholder:"All keys"})]})]}),qe?e.jsx("div",{className:"rounded-xl border border-[var(--otari-line)] bg-[var(--otari-surface)] px-4 py-10 text-center text-sm text-[var(--otari-muted)]",children:"No usage yet. Once the gateway serves requests, spend and volume appear here."}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 sm:grid-cols-3 xl:grid-cols-4",children:[e.jsx(E,{label:"Tracked cost",value:a?W(a.cost):"—",hint:a?e.jsxs("span",{className:"text-[var(--otari-muted)]",children:[e.jsx(T,{fraction:$}),a.unpriced_requests?`${$!==null?" · ":""}${V(a.unpriced_requests)} unpriced`:null]}):null,chart:X?e.jsx(ae,{values:D.map(s=>s.cost),ariaLabel:"Spend trend over the selected window"}):void 0}),e.jsx(E,{label:"Requests",value:a?V(a.request_count):"—",hint:a?e.jsxs("span",{className:"text-[var(--otari-muted)]",children:[$e(Te)," errors",u?e.jsxs(e.Fragment,{children:[" · ",e.jsx(T,{fraction:F(a.request_count,u.request_count)})]}):null]}):null,chart:X?e.jsx(ae,{values:D.map(s=>s.requests),ariaLabel:"Request volume trend over the selected window"}):void 0}),e.jsx(E,{label:"Tokens",value:a?B(a.total_tokens):"—",hint:a?e.jsx(T,{fraction:F(a.total_tokens,u==null?void 0:u.total_tokens)}):null,chart:X?e.jsx(ae,{values:D.map(s=>s.tokens),ariaLabel:"Token usage trend over the selected window"}):void 0}),e.jsx(E,{label:"Cache read",value:a?B(a.cache_read_tokens):"—",hint:a?e.jsx(T,{fraction:F(a.cache_read_tokens,u==null?void 0:u.cache_read_tokens)}):null}),e.jsx(E,{label:"Cache write",value:a?B(a.cache_write_tokens):"—",hint:a?e.jsx(T,{fraction:F(a.cache_write_tokens,u==null?void 0:u.cache_write_tokens)}):null}),e.jsx(E,{label:"1h cache write",value:a?B(a.cache_write_1h_tokens??0):"—",hint:a?e.jsx(T,{fraction:F(a.cache_write_1h_tokens??0,(u==null?void 0:u.cache_write_1h_tokens)??0)}):null}),e.jsx(E,{label:"Avg latency",value:a?st(a.avg_latency_ms):"—"})]}),e.jsxs("div",{className:"grid gap-6 lg:grid-cols-2",children:[e.jsx(Se,{title:"Spend by model",rows:(l==null?void 0:l.by_model)??[],totalCost:(a==null?void 0:a.cost)??0,emptyLabel:G?"No usage matches these filters.":"No usage recorded yet.",onDrill:s=>de({model:s,user_id:p||void 0,api_key_id:g||void 0}),loading:b.isLoading}),e.jsx(Se,{title:"Spend by user",rows:(l==null?void 0:l.by_user)??[],totalCost:(a==null?void 0:a.cost)??0,emptyLabel:G?"No usage matches these filters.":"No usage recorded yet.",onDrill:s=>de({user_id:s,model:d.trim()||void 0,api_key_id:g||void 0}),loading:b.isLoading})]}),e.jsx(mt,{filters:k,anyFilter:G}),e.jsxs("div",{className:"flex flex-col gap-3 rounded-xl border border-[var(--otari-line)] bg-[var(--otari-surface)] p-4",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Over time"}),e.jsxs("div",{className:"inline-flex gap-1.5",children:[at.map(s=>e.jsx(I,{size:"sm",variant:P===s.key?"primary":"outline",onPress:()=>R(s.key),children:s.label},s.key)),b.isFetching?e.jsx(pe,{size:"sm"}):null]})]}),b.isLoading?e.jsx("div",{className:"flex h-48 items-center justify-center",children:e.jsx(pe,{size:"sm"})}):D.length===0?e.jsx("div",{className:"flex h-48 items-center justify-center text-sm text-[var(--otari-muted)]",children:"No data in this range."}):e.jsxs("figure",{className:"flex flex-col gap-2",children:[e.jsx(Je,{data:ee.points,formatValue:s=>be(s,P),ariaLabel:`${P} per ${S}`}),e.jsxs("figcaption",{className:"text-xs text-[var(--otari-muted)]",children:[be(ee.peak,P)," peak · ",ee.count," ",S==="hour"?"hours":"days"," (times in UTC)"]})]})]})]})]})}export{jt as UsagePage}; +import{j as e}from"./tanstack-query-1t81HyiD.js";import{i as Ue,r as i}from"./react-dgEcD0HR.js";import{u as Ae,a as Re,d as Q,M as F,P as Oe,E as ye,R as Ke,g as te,S as E,O as T,N as W,T as $e,ab as B,e as Be,f as Ie,b as ze,c as xe}from"./index-DHi1jXMu.js";import{i as se,b as He,U as ke,A as Ge,d as je,F as Ye,f as Ze}from"./FilterChips-DZjxf-ot.js";import{u as Qe,r as Ve,B as We}from"./tableSelection-9hV37uhu.js";import{S as ae,B as Je}from"./charts-DIsd9m--.js";import{C as Xe}from"./ConfirmDialog-D_mZT4k-.js";import{D as we}from"./DataTable-Bmn_eYSV.js";import{T as et,S as tt}from"./TablePagination-Chra1w0V.js";import{B as I,S as pe}from"./heroui-BI50yK5B.js";import"./recharts-C4kRDmvS.js";function V(t){return t.toLocaleString()}function st(t){return t===null?"—":t<1e3?`${Math.round(t)} ms`:`${(t/1e3).toFixed(2)} s`}const fe=Ze(je,ke),ne=15,_e="__other__",ve="__unknown__";function Se({title:t,rows:r,totalCost:h,emptyLabel:n,onDrill:_,loading:m}){const[c,x]=i.useState(!1),j=c?r:r.slice(0,ne),U=r.length-j.length,N=o=>o.is_other?_e:o.key??ve,A=[{id:"name",header:t.replace("Spend by ",""),isRowHeader:!0,cell:o=>{const d=h>0?o.cost/h:0;return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("span",{className:"truncate text-[var(--otari-ink)]",children:o.is_other?`Other (${o.requests.toLocaleString()} req)`:o.key===null?"(unknown)":o.key}),e.jsx("span",{className:"h-1 w-full overflow-hidden rounded-full bg-[var(--otari-line)]",children:e.jsx("span",{className:"block h-full rounded-full bg-[var(--otari-brand)]",style:{width:`${Math.min(100,d*100)}%`}})})]})}},{id:"requests",header:"Requests",align:"end",cell:o=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:V(o.requests)})},{id:"spend",header:"Spend",align:"end",cell:o=>e.jsx("span",{className:"text-[var(--otari-ink)]",children:W(o.cost)})}];return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:t}),e.jsx(we,{ariaLabel:t,columns:A,rows:j,getRowKey:N,isLoading:m,emptyContent:n,onRowAction:o=>{o!==_e&&o!==ve&&_(o)}}),!m&&U>0?e.jsxs(I,{size:"sm",variant:"ghost",onPress:()=>x(!0),children:["Show all ",r.length]}):null,!m&&c&&r.length>ne?e.jsxs(I,{size:"sm",variant:"ghost",onPress:()=>x(!1),children:["Show top ",ne]}):null]})}const at=[{key:"cost",label:"Cost"},{key:"tokens",label:"Tokens"},{key:"requests",label:"Requests"}];function nt(t,r){return r==="cost"?t.cost:r==="tokens"?t.tokens:t.requests}function be(t,r){return r==="cost"?W(t):r==="tokens"?B(t):V(t)}function ot(t,r){const h=new Date(t);return Number.isNaN(h.getTime())?t:r==="hour"?h.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",timeZone:"UTC"}):h.toLocaleDateString(void 0,{month:"short",day:"numeric",timeZone:"UTC"})}function rt(t,r,h){const n=t.map(m=>({label:ot(m.bucket_start,h),value:nt(m,r)})),_=n.length?Math.max(...n.map(m=>m.value)):0;return{points:n,peak:_,count:t.length}}const lt=50;function it(t){const r=new Date(t).getTime();if(Number.isNaN(r))return t;const h=Math.max(0,Math.round((Date.now()-r)/1e3));if(h<60)return`${h}s ago`;const n=Math.round(h/60);if(n<60)return`${n}m ago`;const _=Math.round(n/60);return _<24?`${_}h ago`:`${Math.round(_/24)}d ago`}function ct({status:t}){return e.jsx("span",{className:`inline-flex items-center rounded-full border px-2 py-0.5 text-xs font-medium ${t==="error"?"border-red-200 bg-red-50 text-red-700":"border-[var(--otari-line)] bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]"}`,children:t})}const dt=[{id:"time",header:"Time",isRowHeader:!0,cell:t=>e.jsx("span",{className:"text-[var(--otari-muted)]",title:new Date(t.timestamp).toLocaleString(),children:it(t.timestamp)})},{id:"model",header:"Model",cell:t=>e.jsx("span",{className:"text-[var(--otari-ink)]",children:t.model})},{id:"user",header:"User",cell:t=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:t.user_id??"—"})},{id:"tokens",header:"Tokens",align:"end",cell:t=>t.total_tokens===null?"—":t.total_tokens.toLocaleString()},{id:"cost",header:"Cost",align:"end",cell:t=>t.cost===null?"—":W(t.cost)},{id:"status",header:"Status",cell:t=>e.jsx(ct,{status:t.status})}],ut=t=>t.id;function mt({filters:t,anyFilter:r}){var $,H;const[h,n]=i.useState(0),[_,m]=i.useState(lt),c=Qe(),x=Be(),j=Ie(),[U,N]=i.useState(!1),[A,o]=i.useState(!1),d=JSON.stringify(t),q=i.useRef(d);i.useEffect(()=>{q.current!==d&&(q.current=d,n(0),c.clear())},[d,c]);const p=ze(t,h,_),C=xe(t),g=p.data??[],P=C.isSuccess&&!C.isPlaceholderData?(($=C.data)==null?void 0:$.total)??0:null,R=g.filter(y=>!y.counts_toward_budget).map(y=>y.id),f=g.filter(y=>y.counts_toward_budget).map(y=>y.id),v=Ve(c.selectedKeys,R),S=v.length,k=c.allMatching||S>0,O=i.useMemo(()=>({...t,counts_toward_budget:!1}),[t]),b=xe(O,k),L=b.isSuccess?((H=b.data)==null?void 0:H.total)??null:null,K=R.length>0&&S===R.length&&L!=null&&L>S,M=c.allMatching?L??S:S,l=()=>c.allMatching?{by_filter:!0,model:t.model,user_id:t.user_id,api_key_id:t.api_key_id,start_date:t.start_date,end_date:t.end_date,priced:t.priced}:{ids:v},a=()=>x.mutate(l(),{onSuccess:()=>{N(!1),c.clear()}}),u=y=>j.mutate({...l(),...y},{onSuccess:()=>{o(!1),c.clear()}});return e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Individual requests"}),e.jsx(ye,{error:p.error??C.error}),k?e.jsxs(We,{selectedCount:M,allMatching:c.allMatching,matchingTotal:L,canSelectAllMatching:K,onSelectAllMatching:c.enableAllMatching,onClear:c.clear,children:[e.jsx(I,{size:"sm",variant:"primary",onPress:()=>o(!0),children:"Set price"}),e.jsx(I,{size:"sm",variant:"danger",onPress:()=>N(!0),children:"Delete"})]}):null,e.jsx(we,{ariaLabel:"Individual requests",columns:dt,rows:g,getRowKey:ut,isLoading:p.isLoading,emptyContent:r?"No requests match these filters.":"No requests recorded yet.",selectionMode:"multiple",selectedKeys:c.selectedKeys,onSelectionChange:c.onSelectionChange,disabledKeys:f}),e.jsx(et,{page:h,pageSize:_,total:P,rowsOnPage:g.length,onPageChange:n,onPageSizeChange:y=>{m(y),n(0)},isFetching:p.isFetching,hasNextFallback:g.length===_}),e.jsx(Xe,{isOpen:U,onOpenChange:N,heading:"Delete usage rows",body:`Delete ${M.toLocaleString()} imported ${M===1?"row":"rows"}? Only imported rows are removed, and this cannot be undone.`,confirmLabel:"Delete",isPending:x.isPending,error:x.error,onConfirm:a}),e.jsx(tt,{isOpen:A,onOpenChange:o,targetCount:M,isPending:j.isPending,error:j.error,onSubmit:u})]})}function jt(){var ue,me,he,ge;const t=Ue(),r=Ae(),h=Re(),[n,_]=i.useState(fe),[m,c]=i.useState(()=>se(fe.seconds??0)),[x,j]=i.useState(!1),[U,N]=i.useState(),[A,o]=i.useState(),[d,q]=i.useState(""),[p,C]=i.useState(""),[g,z]=i.useState(""),[P,R]=i.useState("cost"),f=x?U:m,v=x?A:void 0,S=x?f?He(f,v):"day":n.bucket,k=i.useMemo(()=>({start_date:f,end_date:v,model:d.trim()||void 0,user_id:p||void 0,api_key_id:g||void 0}),[f,v,d,p,g]),O=i.useMemo(()=>{if(x){if(!f||!v)return null;const s=new Date(v).getTime()-new Date(f).getTime();return s>0?{...k,start_date:new Date(new Date(f).getTime()-s).toISOString(),end_date:f}:null}return!m||n.seconds===null?null:{...k,start_date:new Date(new Date(m).getTime()-n.seconds*1e3).toISOString(),end_date:m}},[x,f,v,k,n.seconds,m]),b=Q(k,S),L=Q(O??k,S,O!==null),oe=i.useMemo(()=>({start_date:m,model:d.trim()||void 0,user_id:p||void 0,api_key_id:g||void 0}),[m,d,p,g]),K=Q(oe,n.bucket),M=(((ue=K.data)==null?void 0:ue.series)??[]).map(s=>({bucketStart:s.bucket_start,requests:s.requests})),l=b.data,a=l==null?void 0:l.totals,u=O!==null?(me=L.data)==null?void 0:me.totals:void 0,$=a?F(a.cost,u==null?void 0:u.cost):null,H=i.useMemo(()=>({...k,model:void 0}),[k]),J=((ge=(he=Q(H,S).data)==null?void 0:he.by_model)==null?void 0:ge.filter(s=>!s.is_other&&s.key!==null).map(s=>s.key))??[],re=(r.data??[]).map(s=>({value:s.user_id,label:s.alias?`${s.alias} (${s.user_id})`:s.user_id})),le=(h.data??[]).map(s=>({value:s.id,label:s.key_name??`${s.id.slice(0,8)}…`})),Ne=(d&&!J.includes(d)?[d,...J]:J).map(s=>({value:s,label:s})),Ce=x||n.key!==ke,G=!!(d.trim()||p||g||Ce),ie=(s,w)=>{var Y;return((Y=s.find(Z=>Z.value===w))==null?void 0:Y.label)??w},Pe=()=>{q(""),C(""),z("")},Ee=[...p?[{key:"user",label:"User",value:ie(re,p),onClear:()=>C("")}]:[],...d.trim()?[{key:"model",label:"Model",value:d.trim(),onClear:()=>q("")}]:[],...g?[{key:"key",label:"API key",value:ie(le,g),onClear:()=>z("")}]:[]],qe=!!(l&&a&&a.request_count===0&&!G),Le=(l==null?void 0:l.start_date)??f,Me=(l==null?void 0:l.end_date)??v,ce=s=>{j(!1),_(s),c(se(s.seconds??0)),N(void 0),o(void 0)},De=(s,w)=>{j(!0),N(s),o(w)},Fe=()=>{x||c(se(n.seconds??0)),b.refetch(),K.refetch()},de=s=>{const w=new URLSearchParams;f&&w.set("start_date",f),v&&w.set("end_date",v);for(const[Y,Z]of Object.entries(s))Z&&w.set(Y,Z);t(`/activity?${w.toString()}`)},Te=a&&a.request_count>0?a.error_count/a.request_count:0,D=(l==null?void 0:l.series)??[],X=D.length>1,ee=rt(D,P,S);return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(Oe,{title:"Usage & analytics",description:"Aggregate spend, tokens, and request volume over time. Click a model or user to drill into the request log."}),e.jsx(ye,{error:b.error}),e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx(Ge,{presets:je,extentKey:n.key,onPreset:ce,onSelectRange:De,onSelectFull:()=>ce(n),series:M,bucket:n.bucket,windowStart:Le,windowEnd:Me,loading:K.isLoading,ariaLabel:"Usage request volume over the selected window",action:e.jsx(Ke,{onRefresh:Fe,isFetching:b.isFetching,updatedAt:b.dataUpdatedAt})}),e.jsxs(Ye,{chips:Ee,onClearAll:Pe,children:[e.jsx(te,{label:"User",value:p,onChange:C,options:re,placeholder:"All users"}),e.jsx(te,{label:"Model",value:d,onChange:q,options:Ne,placeholder:"All models"}),e.jsx(te,{label:"API key",value:g,onChange:z,options:le,placeholder:"All keys"})]})]}),qe?e.jsx("div",{className:"rounded-xl border border-[var(--otari-line)] bg-[var(--otari-surface)] px-4 py-10 text-center text-sm text-[var(--otari-muted)]",children:"No usage yet. Once the gateway serves requests, spend and volume appear here."}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 sm:grid-cols-3 xl:grid-cols-4",children:[e.jsx(E,{label:"Tracked cost",value:a?W(a.cost):"—",hint:a?e.jsxs("span",{className:"text-[var(--otari-muted)]",children:[e.jsx(T,{fraction:$}),a.unpriced_requests?`${$!==null?" · ":""}${V(a.unpriced_requests)} unpriced`:null]}):null,chart:X?e.jsx(ae,{values:D.map(s=>s.cost),ariaLabel:"Spend trend over the selected window"}):void 0}),e.jsx(E,{label:"Requests",value:a?V(a.request_count):"—",hint:a?e.jsxs("span",{className:"text-[var(--otari-muted)]",children:[$e(Te)," errors",u?e.jsxs(e.Fragment,{children:[" · ",e.jsx(T,{fraction:F(a.request_count,u.request_count)})]}):null]}):null,chart:X?e.jsx(ae,{values:D.map(s=>s.requests),ariaLabel:"Request volume trend over the selected window"}):void 0}),e.jsx(E,{label:"Tokens",value:a?B(a.total_tokens):"—",hint:a?e.jsx(T,{fraction:F(a.total_tokens,u==null?void 0:u.total_tokens)}):null,chart:X?e.jsx(ae,{values:D.map(s=>s.tokens),ariaLabel:"Token usage trend over the selected window"}):void 0}),e.jsx(E,{label:"Cache read",value:a?B(a.cache_read_tokens):"—",hint:a?e.jsx(T,{fraction:F(a.cache_read_tokens,u==null?void 0:u.cache_read_tokens)}):null}),e.jsx(E,{label:"Cache write",value:a?B(a.cache_write_tokens):"—",hint:a?e.jsx(T,{fraction:F(a.cache_write_tokens,u==null?void 0:u.cache_write_tokens)}):null}),e.jsx(E,{label:"1h cache write",value:a?B(a.cache_write_1h_tokens??0):"—",hint:a?e.jsx(T,{fraction:F(a.cache_write_1h_tokens??0,(u==null?void 0:u.cache_write_1h_tokens)??0)}):null}),e.jsx(E,{label:"Avg latency",value:a?st(a.avg_latency_ms):"—"})]}),e.jsxs("div",{className:"grid gap-6 lg:grid-cols-2",children:[e.jsx(Se,{title:"Spend by model",rows:(l==null?void 0:l.by_model)??[],totalCost:(a==null?void 0:a.cost)??0,emptyLabel:G?"No usage matches these filters.":"No usage recorded yet.",onDrill:s=>de({model:s,user_id:p||void 0,api_key_id:g||void 0}),loading:b.isLoading}),e.jsx(Se,{title:"Spend by user",rows:(l==null?void 0:l.by_user)??[],totalCost:(a==null?void 0:a.cost)??0,emptyLabel:G?"No usage matches these filters.":"No usage recorded yet.",onDrill:s=>de({user_id:s,model:d.trim()||void 0,api_key_id:g||void 0}),loading:b.isLoading})]}),e.jsx(mt,{filters:k,anyFilter:G}),e.jsxs("div",{className:"flex flex-col gap-3 rounded-xl border border-[var(--otari-line)] bg-[var(--otari-surface)] p-4",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Over time"}),e.jsxs("div",{className:"inline-flex gap-1.5",children:[at.map(s=>e.jsx(I,{size:"sm",variant:P===s.key?"primary":"outline",onPress:()=>R(s.key),children:s.label},s.key)),b.isFetching?e.jsx(pe,{size:"sm"}):null]})]}),b.isLoading?e.jsx("div",{className:"flex h-48 items-center justify-center",children:e.jsx(pe,{size:"sm"})}):D.length===0?e.jsx("div",{className:"flex h-48 items-center justify-center text-sm text-[var(--otari-muted)]",children:"No data in this range."}):e.jsxs("figure",{className:"flex flex-col gap-2",children:[e.jsx(Je,{data:ee.points,formatValue:s=>be(s,P),ariaLabel:`${P} per ${S}`}),e.jsxs("figcaption",{className:"text-xs text-[var(--otari-muted)]",children:[be(ee.peak,P)," peak · ",ee.count," ",S==="hour"?"hours":"days"," (times in UTC)"]})]})]})]})]})}export{jt as UsagePage}; diff --git a/src/gateway/static/dashboard/assets/UsersPage-CAU0FXTt.js b/src/gateway/static/dashboard/assets/UsersPage-DPrtdYVu.js similarity index 98% rename from src/gateway/static/dashboard/assets/UsersPage-CAU0FXTt.js rename to src/gateway/static/dashboard/assets/UsersPage-DPrtdYVu.js index 99bab785..3bea6438 100644 --- a/src/gateway/static/dashboard/assets/UsersPage-CAU0FXTt.js +++ b/src/gateway/static/dashboard/assets/UsersPage-DPrtdYVu.js @@ -1 +1 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{r}from"./react-dgEcD0HR.js";import{u as Q,l as M,p as K,ac as X,P as Y,E as S,ad as Z,F as ee}from"./index-CGnfXTEF.js";import{u as se,r as te,B as ae}from"./tableSelection-9hV37uhu.js";import{C as ne}from"./ConfirmDialog-CWW3AYpK.js";import{D as re}from"./DataTable-Bmn_eYSV.js";import{F as B}from"./Field-Dwp6u3t8.js";import{a as le,M as R}from"./ModelScopeControl-DmfR9Ylv.js";import{f as I,B as d,d as y,A as f}from"./heroui-BI50yK5B.js";const ie=new Intl.NumberFormat(void 0,{style:"currency",currency:"USD",maximumFractionDigits:4});function U(t){return ie.format(t)}const de=t=>t.user_id,D=t=>t.startsWith("apikey-");function H(t){return t.split("-")[0]}function F(t){return t.name??H(t.budget_id)}function $({value:t,onChange:l,budgets:n}){return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("label",{htmlFor:"user-budget",className:"text-sm font-medium text-[var(--otari-ink)]",children:"Budget"}),e.jsxs("select",{id:"user-budget",value:t??"",onChange:a=>l(a.target.value||null),className:"w-full rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-3 py-2 text-sm text-[var(--otari-ink)]",children:[e.jsx("option",{value:"",children:"No budget (unlimited)"}),n.map(a=>e.jsxs("option",{value:a.budget_id,children:[F(a),a.max_budget===null?" · no limit":` · ${U(a.max_budget)}`]},a.budget_id))]}),e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"The spending limit this user is held to. Manage budgets on the Budgets page."})]})}function oe({onClose:t}){const l=Z(),n=M(),[a,i]=r.useState(""),[o,u]=r.useState(""),[c,m]=r.useState(null),[p,g]=r.useState(null),[j,b]=r.useState(!0),x=()=>{if(l.isPending||!j||a.trim()==="")return;const h={user_id:a.trim(),alias:o.trim()||null,budget_id:c,allowed_models:p};l.mutate(h,{onSuccess:t})};return e.jsx(y,{children:e.jsxs(y.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsx("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Create user"}),e.jsx(S,{error:l.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(B,{label:"User ID",value:a,onChange:i,placeholder:"alice@example.com",isRequired:!0,autoFocus:!0,description:"The identifier callers send as the `user` field; spend and budgets track against it."}),e.jsx(B,{label:"Alias (optional)",value:o,onChange:u,placeholder:"Alice"})]}),e.jsx($,{value:c,onChange:m,budgets:n.data??[]}),e.jsx(R,{title:"Model access (default for this user's keys)",description:"The models this user's keys may list and call by default. A key can narrow this, but never exceed it.",initial:null,onChange:(h,P)=>{g(h),b(P)}}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(d,{variant:"primary",isDisabled:l.isPending||!j||a.trim()==="",onPress:x,children:l.isPending?"Creating…":"Create user"}),e.jsx(d,{variant:"ghost",onPress:t,children:"Cancel"})]})]})})}function ce({user:t,onClose:l}){const n=K(),a=M(),[i,o]=r.useState(t.alias??""),[u,c]=r.useState(t.budget_id),[m,p]=r.useState(t.allowed_models),[g,j]=r.useState(!0),b=()=>{if(n.isPending||!g)return;const x={alias:i.trim()||null,budget_id:u,allowed_models:m};n.mutate({id:t.user_id,body:x},{onSuccess:l})};return e.jsx(y,{children:e.jsxs(y.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsxs("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:["Edit ",e.jsx("code",{children:t.user_id})]}),e.jsx(S,{error:n.error}),e.jsx(B,{label:"Alias",value:i,onChange:o,placeholder:"Alice"}),e.jsx($,{value:u,onChange:c,budgets:a.data??[]}),e.jsx(R,{title:"Model access (default for this user's keys)",description:"The models this user's keys may list and call by default. A key can narrow this, but never exceed it.",initial:t.allowed_models,onChange:(x,h)=>{p(x),j(h)}}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(d,{variant:"primary",isDisabled:n.isPending||!g,onPress:b,children:n.isPending?"Saving…":"Save changes"}),e.jsx(d,{variant:"ghost",onPress:l,children:"Cancel"})]})]})})}function ue({trigger:t,message:l,confirmLabel:n,isPending:a,onConfirm:i}){const[o,u]=r.useState(!1);return o?e.jsxs("div",{className:"flex flex-col items-end gap-1.5 rounded-lg border border-amber-200 bg-amber-50 p-2 text-right",children:[e.jsx("span",{className:"max-w-xs text-xs text-amber-800",children:l}),e.jsxs("span",{className:"inline-flex gap-1",children:[e.jsx(d,{size:"sm",variant:"danger",isDisabled:a,onPress:i,children:n}),e.jsx(d,{size:"sm",variant:"ghost",isDisabled:a,onPress:()=>u(!1),children:"Cancel"})]})]}):e.jsx(d,{size:"sm",variant:"danger-soft",onPress:()=>u(!0),children:t})}function me({user:t}){return t.blocked?e.jsx(I,{size:"sm",color:"warning",children:"Blocked"}):e.jsx(I,{size:"sm",color:"accent",children:"Active"})}function ge({allowed:t}){const{text:l,tone:n}=le(t),a=n==="danger"?"text-red-700 font-medium":n==="muted"?"text-[var(--otari-muted)]":"text-[var(--otari-brand-dark)] font-medium",i=t&&t.length>0?t.join(", "):void 0;return e.jsx("span",{className:`text-xs ${a}`,title:i,children:l})}function xe({onCreate:t}){return e.jsx(y,{children:e.jsxs(y.Content,{className:"flex flex-col gap-4 p-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:"No users yet"}),e.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:"A user owns API keys and carries the budget and default model access those keys inherit. Create a user here, then issue its keys on the API keys page."})]}),e.jsx("div",{children:e.jsx(d,{variant:"primary",onPress:t,children:"Create your first user"})})]})})}function he({isOpen:t,onOpenChange:l,budgets:n,count:a,isPending:i,error:o,onAssign:u}){const[c,m]=r.useState("");return r.useEffect(()=>{t&&m("")},[t]),e.jsx(f,{isOpen:t,onOpenChange:l,children:t?e.jsx(f.Backdrop,{children:e.jsx(f.Container,{placement:"center",size:"md",children:e.jsxs(f.Dialog,{children:[e.jsx(f.Header,{children:e.jsx(f.Heading,{children:"Assign budget"})}),e.jsxs(f.Body,{className:"flex flex-col gap-4",children:[e.jsxs("p",{className:"text-sm text-[var(--otari-muted)]",children:["Assign a budget to ",a," selected ",a===1?"user":"users","."]}),e.jsx(ee,{label:"Budget",value:c,onChange:m,options:[{value:"",label:"Select a budget…"},...n.map(p=>({value:p.budget_id,label:F(p)}))]}),e.jsx(S,{error:o})]}),e.jsxs(f.Footer,{children:[e.jsx(d,{variant:"ghost",isDisabled:i,onPress:()=>l(!1),children:"Cancel"}),e.jsx(d,{variant:"primary",isDisabled:!c,isPending:i,onPress:()=>u(c),children:"Assign"})]})]})})}):null})}function Pe(){const t=Q(),l=M(),n=K(),a=X(),[i,o]=r.useState(!1),[u,c]=r.useState(null),[m,p]=r.useState(!1),g=t.data??[],j=t.isLoading,b=g.filter(s=>D(s.user_id)).length,x=m?g:g.filter(s=>!D(s.user_id)),h=g.find(s=>s.user_id===u)??null,P=!j&&x.length===0&&!i,A=r.useMemo(()=>new Map((l.data??[]).map(s=>[s.budget_id,s])),[l.data]),C=se(),[q,_]=r.useState(!1),[W,N]=r.useState(!1),[z,E]=r.useState(void 0),[T,O]=r.useState(!1),G=x.map(s=>s.user_id),v=te(C.selectedKeys,G),L=r.useCallback((s,k)=>n.mutate({id:s.user_id,body:{blocked:k}}),[n.mutate]),V=async(s,k)=>{O(!0),E(void 0);try{for(const w of v)await s(w);C.clear(),k()}catch(w){E(w)}finally{O(!1)}},J=r.useMemo(()=>[{id:"user",header:"User",isRowHeader:!0,cell:s=>e.jsxs("div",{className:"flex flex-col gap-0.5",children:[e.jsxs("span",{className:"inline-flex items-center gap-1.5",children:[e.jsx("code",{className:"text-xs font-medium text-[var(--otari-ink)]",children:s.user_id}),D(s.user_id)?e.jsx(I,{size:"sm",color:"default",children:"virtual"}):null]}),s.alias?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:s.alias}):null]})},{id:"status",header:"Status",cell:s=>e.jsx(me,{user:s})},{id:"budget",header:"Budget",cell:s=>s.budget_id?e.jsx("span",{className:"text-[var(--otari-muted)]",title:s.budget_id,children:A.get(s.budget_id)?F(A.get(s.budget_id)):H(s.budget_id)}):e.jsx("span",{className:"text-[var(--otari-muted)]",children:"—"})},{id:"spend",header:"Spend",cell:s=>e.jsxs("span",{className:"text-[var(--otari-muted)]",children:[U(s.spend),s.reserved>0?e.jsxs("span",{children:[" (+",U(s.reserved)," held)"]}):null]})},{id:"access",header:"Model access",cell:s=>e.jsx(ge,{allowed:s.allowed_models})},{id:"actions",header:"Actions",align:"end",cell:s=>e.jsxs("div",{className:"flex items-center justify-end gap-1.5",children:[e.jsx(d,{size:"sm",variant:"outline",isDisabled:n.isPending,onPress:()=>L(s,!s.blocked),children:s.blocked?"Unblock":"Block"}),e.jsx(d,{size:"sm",variant:"ghost",onPress:()=>{o(!1),c(s.user_id)},children:"Edit"}),e.jsx(ue,{trigger:"Delete",confirmLabel:"Delete user",isPending:a.isPending,message:e.jsxs(e.Fragment,{children:["Delete ",e.jsx("strong",{children:s.user_id}),"? This deactivates its API keys and hides the user; usage history is preserved."]}),onConfirm:()=>a.mutate(s.user_id)})]})}],[A,n.isPending,a.isPending,a.mutate,L]);return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(Y,{title:"Users",description:"People and teams that own API keys. Set each one's budget and default model access here; issue their keys on the API keys page.",action:i?null:e.jsx(d,{variant:"primary",onPress:()=>{c(null),o(!0)},children:"Create user"})}),e.jsx(S,{error:t.error??n.error??a.error}),P?e.jsx(xe,{onCreate:()=>{c(null),o(!0)}}):null,b>0?e.jsxs("label",{className:"flex w-fit items-center gap-2 text-xs text-[var(--otari-muted)]",children:[e.jsx("input",{type:"checkbox",checked:m,onChange:s=>p(s.target.checked)}),"Show auto-created (virtual) users (",b,")"]}):null,i?e.jsx(oe,{onClose:()=>o(!1)}):null,h?e.jsx(ce,{user:h,onClose:()=>c(null)},h.user_id):null,v.length>0?e.jsxs(ae,{selectedCount:v.length,allMatching:!1,matchingTotal:null,canSelectAllMatching:!1,onSelectAllMatching:()=>{},onClear:C.clear,children:[e.jsx(d,{size:"sm",variant:"primary",onPress:()=>N(!0),children:"Assign budget"}),e.jsx(d,{size:"sm",variant:"danger",onPress:()=>_(!0),children:"Delete"})]}):null,e.jsx(re,{ariaLabel:"Users",columns:J,rows:x,getRowKey:de,isLoading:j,emptyContent:"No users yet. Create one, or create an API key to auto-create one.",selectionMode:"multiple",selectedKeys:C.selectedKeys,onSelectionChange:C.onSelectionChange}),e.jsx(ne,{isOpen:q,onOpenChange:_,heading:"Delete users",body:`Delete ${v.length} ${v.length===1?"user":"users"}? This deactivates their API keys and hides them; usage history is preserved.`,confirmLabel:"Delete",isPending:T,error:z,onConfirm:()=>V(s=>a.mutateAsync(s),()=>_(!1))}),e.jsx(he,{isOpen:W,onOpenChange:N,budgets:l.data??[],count:v.length,isPending:T,error:z,onAssign:s=>V(k=>n.mutateAsync({id:k,body:{budget_id:s}}),()=>N(!1))})]})}export{Pe as UsersPage}; +import{j as e}from"./tanstack-query-1t81HyiD.js";import{r}from"./react-dgEcD0HR.js";import{u as Q,l as M,p as K,ac as X,P as Y,E as S,ad as Z,F as ee}from"./index-DHi1jXMu.js";import{u as se,r as te,B as ae}from"./tableSelection-9hV37uhu.js";import{C as ne}from"./ConfirmDialog-D_mZT4k-.js";import{D as re}from"./DataTable-Bmn_eYSV.js";import{F as B}from"./Field-Dwp6u3t8.js";import{a as le,M as R}from"./ModelScopeControl-DY7OwwJM.js";import{f as I,B as d,d as y,A as f}from"./heroui-BI50yK5B.js";const ie=new Intl.NumberFormat(void 0,{style:"currency",currency:"USD",maximumFractionDigits:4});function U(t){return ie.format(t)}const de=t=>t.user_id,D=t=>t.startsWith("apikey-");function H(t){return t.split("-")[0]}function F(t){return t.name??H(t.budget_id)}function $({value:t,onChange:l,budgets:n}){return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("label",{htmlFor:"user-budget",className:"text-sm font-medium text-[var(--otari-ink)]",children:"Budget"}),e.jsxs("select",{id:"user-budget",value:t??"",onChange:a=>l(a.target.value||null),className:"w-full rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-3 py-2 text-sm text-[var(--otari-ink)]",children:[e.jsx("option",{value:"",children:"No budget (unlimited)"}),n.map(a=>e.jsxs("option",{value:a.budget_id,children:[F(a),a.max_budget===null?" · no limit":` · ${U(a.max_budget)}`]},a.budget_id))]}),e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"The spending limit this user is held to. Manage budgets on the Budgets page."})]})}function oe({onClose:t}){const l=Z(),n=M(),[a,i]=r.useState(""),[o,u]=r.useState(""),[c,m]=r.useState(null),[p,g]=r.useState(null),[j,b]=r.useState(!0),x=()=>{if(l.isPending||!j||a.trim()==="")return;const h={user_id:a.trim(),alias:o.trim()||null,budget_id:c,allowed_models:p};l.mutate(h,{onSuccess:t})};return e.jsx(y,{children:e.jsxs(y.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsx("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Create user"}),e.jsx(S,{error:l.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(B,{label:"User ID",value:a,onChange:i,placeholder:"alice@example.com",isRequired:!0,autoFocus:!0,description:"The identifier callers send as the `user` field; spend and budgets track against it."}),e.jsx(B,{label:"Alias (optional)",value:o,onChange:u,placeholder:"Alice"})]}),e.jsx($,{value:c,onChange:m,budgets:n.data??[]}),e.jsx(R,{title:"Model access (default for this user's keys)",description:"The models this user's keys may list and call by default. A key can narrow this, but never exceed it.",initial:null,onChange:(h,P)=>{g(h),b(P)}}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(d,{variant:"primary",isDisabled:l.isPending||!j||a.trim()==="",onPress:x,children:l.isPending?"Creating…":"Create user"}),e.jsx(d,{variant:"ghost",onPress:t,children:"Cancel"})]})]})})}function ce({user:t,onClose:l}){const n=K(),a=M(),[i,o]=r.useState(t.alias??""),[u,c]=r.useState(t.budget_id),[m,p]=r.useState(t.allowed_models),[g,j]=r.useState(!0),b=()=>{if(n.isPending||!g)return;const x={alias:i.trim()||null,budget_id:u,allowed_models:m};n.mutate({id:t.user_id,body:x},{onSuccess:l})};return e.jsx(y,{children:e.jsxs(y.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsxs("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:["Edit ",e.jsx("code",{children:t.user_id})]}),e.jsx(S,{error:n.error}),e.jsx(B,{label:"Alias",value:i,onChange:o,placeholder:"Alice"}),e.jsx($,{value:u,onChange:c,budgets:a.data??[]}),e.jsx(R,{title:"Model access (default for this user's keys)",description:"The models this user's keys may list and call by default. A key can narrow this, but never exceed it.",initial:t.allowed_models,onChange:(x,h)=>{p(x),j(h)}}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(d,{variant:"primary",isDisabled:n.isPending||!g,onPress:b,children:n.isPending?"Saving…":"Save changes"}),e.jsx(d,{variant:"ghost",onPress:l,children:"Cancel"})]})]})})}function ue({trigger:t,message:l,confirmLabel:n,isPending:a,onConfirm:i}){const[o,u]=r.useState(!1);return o?e.jsxs("div",{className:"flex flex-col items-end gap-1.5 rounded-lg border border-amber-200 bg-amber-50 p-2 text-right",children:[e.jsx("span",{className:"max-w-xs text-xs text-amber-800",children:l}),e.jsxs("span",{className:"inline-flex gap-1",children:[e.jsx(d,{size:"sm",variant:"danger",isDisabled:a,onPress:i,children:n}),e.jsx(d,{size:"sm",variant:"ghost",isDisabled:a,onPress:()=>u(!1),children:"Cancel"})]})]}):e.jsx(d,{size:"sm",variant:"danger-soft",onPress:()=>u(!0),children:t})}function me({user:t}){return t.blocked?e.jsx(I,{size:"sm",color:"warning",children:"Blocked"}):e.jsx(I,{size:"sm",color:"accent",children:"Active"})}function ge({allowed:t}){const{text:l,tone:n}=le(t),a=n==="danger"?"text-red-700 font-medium":n==="muted"?"text-[var(--otari-muted)]":"text-[var(--otari-brand-dark)] font-medium",i=t&&t.length>0?t.join(", "):void 0;return e.jsx("span",{className:`text-xs ${a}`,title:i,children:l})}function xe({onCreate:t}){return e.jsx(y,{children:e.jsxs(y.Content,{className:"flex flex-col gap-4 p-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:"No users yet"}),e.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:"A user owns API keys and carries the budget and default model access those keys inherit. Create a user here, then issue its keys on the API keys page."})]}),e.jsx("div",{children:e.jsx(d,{variant:"primary",onPress:t,children:"Create your first user"})})]})})}function he({isOpen:t,onOpenChange:l,budgets:n,count:a,isPending:i,error:o,onAssign:u}){const[c,m]=r.useState("");return r.useEffect(()=>{t&&m("")},[t]),e.jsx(f,{isOpen:t,onOpenChange:l,children:t?e.jsx(f.Backdrop,{children:e.jsx(f.Container,{placement:"center",size:"md",children:e.jsxs(f.Dialog,{children:[e.jsx(f.Header,{children:e.jsx(f.Heading,{children:"Assign budget"})}),e.jsxs(f.Body,{className:"flex flex-col gap-4",children:[e.jsxs("p",{className:"text-sm text-[var(--otari-muted)]",children:["Assign a budget to ",a," selected ",a===1?"user":"users","."]}),e.jsx(ee,{label:"Budget",value:c,onChange:m,options:[{value:"",label:"Select a budget…"},...n.map(p=>({value:p.budget_id,label:F(p)}))]}),e.jsx(S,{error:o})]}),e.jsxs(f.Footer,{children:[e.jsx(d,{variant:"ghost",isDisabled:i,onPress:()=>l(!1),children:"Cancel"}),e.jsx(d,{variant:"primary",isDisabled:!c,isPending:i,onPress:()=>u(c),children:"Assign"})]})]})})}):null})}function Pe(){const t=Q(),l=M(),n=K(),a=X(),[i,o]=r.useState(!1),[u,c]=r.useState(null),[m,p]=r.useState(!1),g=t.data??[],j=t.isLoading,b=g.filter(s=>D(s.user_id)).length,x=m?g:g.filter(s=>!D(s.user_id)),h=g.find(s=>s.user_id===u)??null,P=!j&&x.length===0&&!i,A=r.useMemo(()=>new Map((l.data??[]).map(s=>[s.budget_id,s])),[l.data]),C=se(),[q,_]=r.useState(!1),[W,N]=r.useState(!1),[z,E]=r.useState(void 0),[T,O]=r.useState(!1),G=x.map(s=>s.user_id),v=te(C.selectedKeys,G),L=r.useCallback((s,k)=>n.mutate({id:s.user_id,body:{blocked:k}}),[n.mutate]),V=async(s,k)=>{O(!0),E(void 0);try{for(const w of v)await s(w);C.clear(),k()}catch(w){E(w)}finally{O(!1)}},J=r.useMemo(()=>[{id:"user",header:"User",isRowHeader:!0,cell:s=>e.jsxs("div",{className:"flex flex-col gap-0.5",children:[e.jsxs("span",{className:"inline-flex items-center gap-1.5",children:[e.jsx("code",{className:"text-xs font-medium text-[var(--otari-ink)]",children:s.user_id}),D(s.user_id)?e.jsx(I,{size:"sm",color:"default",children:"virtual"}):null]}),s.alias?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:s.alias}):null]})},{id:"status",header:"Status",cell:s=>e.jsx(me,{user:s})},{id:"budget",header:"Budget",cell:s=>s.budget_id?e.jsx("span",{className:"text-[var(--otari-muted)]",title:s.budget_id,children:A.get(s.budget_id)?F(A.get(s.budget_id)):H(s.budget_id)}):e.jsx("span",{className:"text-[var(--otari-muted)]",children:"—"})},{id:"spend",header:"Spend",cell:s=>e.jsxs("span",{className:"text-[var(--otari-muted)]",children:[U(s.spend),s.reserved>0?e.jsxs("span",{children:[" (+",U(s.reserved)," held)"]}):null]})},{id:"access",header:"Model access",cell:s=>e.jsx(ge,{allowed:s.allowed_models})},{id:"actions",header:"Actions",align:"end",cell:s=>e.jsxs("div",{className:"flex items-center justify-end gap-1.5",children:[e.jsx(d,{size:"sm",variant:"outline",isDisabled:n.isPending,onPress:()=>L(s,!s.blocked),children:s.blocked?"Unblock":"Block"}),e.jsx(d,{size:"sm",variant:"ghost",onPress:()=>{o(!1),c(s.user_id)},children:"Edit"}),e.jsx(ue,{trigger:"Delete",confirmLabel:"Delete user",isPending:a.isPending,message:e.jsxs(e.Fragment,{children:["Delete ",e.jsx("strong",{children:s.user_id}),"? This deactivates its API keys and hides the user; usage history is preserved."]}),onConfirm:()=>a.mutate(s.user_id)})]})}],[A,n.isPending,a.isPending,a.mutate,L]);return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(Y,{title:"Users",description:"People and teams that own API keys. Set each one's budget and default model access here; issue their keys on the API keys page.",action:i?null:e.jsx(d,{variant:"primary",onPress:()=>{c(null),o(!0)},children:"Create user"})}),e.jsx(S,{error:t.error??n.error??a.error}),P?e.jsx(xe,{onCreate:()=>{c(null),o(!0)}}):null,b>0?e.jsxs("label",{className:"flex w-fit items-center gap-2 text-xs text-[var(--otari-muted)]",children:[e.jsx("input",{type:"checkbox",checked:m,onChange:s=>p(s.target.checked)}),"Show auto-created (virtual) users (",b,")"]}):null,i?e.jsx(oe,{onClose:()=>o(!1)}):null,h?e.jsx(ce,{user:h,onClose:()=>c(null)},h.user_id):null,v.length>0?e.jsxs(ae,{selectedCount:v.length,allMatching:!1,matchingTotal:null,canSelectAllMatching:!1,onSelectAllMatching:()=>{},onClear:C.clear,children:[e.jsx(d,{size:"sm",variant:"primary",onPress:()=>N(!0),children:"Assign budget"}),e.jsx(d,{size:"sm",variant:"danger",onPress:()=>_(!0),children:"Delete"})]}):null,e.jsx(re,{ariaLabel:"Users",columns:J,rows:x,getRowKey:de,isLoading:j,emptyContent:"No users yet. Create one, or create an API key to auto-create one.",selectionMode:"multiple",selectedKeys:C.selectedKeys,onSelectionChange:C.onSelectionChange}),e.jsx(ne,{isOpen:q,onOpenChange:_,heading:"Delete users",body:`Delete ${v.length} ${v.length===1?"user":"users"}? This deactivates their API keys and hides them; usage history is preserved.`,confirmLabel:"Delete",isPending:T,error:z,onConfirm:()=>V(s=>a.mutateAsync(s),()=>_(!1))}),e.jsx(he,{isOpen:W,onOpenChange:N,budgets:l.data??[],count:v.length,isPending:T,error:z,onAssign:s=>V(k=>n.mutateAsync({id:k,body:{budget_id:s}}),()=>N(!1))})]})}export{Pe as UsersPage}; diff --git a/src/gateway/static/dashboard/assets/index-CGnfXTEF.js b/src/gateway/static/dashboard/assets/index-DHi1jXMu.js similarity index 96% rename from src/gateway/static/dashboard/assets/index-CGnfXTEF.js rename to src/gateway/static/dashboard/assets/index-DHi1jXMu.js index 9ba4345a..fa541783 100644 --- a/src/gateway/static/dashboard/assets/index-CGnfXTEF.js +++ b/src/gateway/static/dashboard/assets/index-DHi1jXMu.js @@ -1,2 +1,2 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ActivityPage-BFwaR2GB.js","assets/tanstack-query-1t81HyiD.js","assets/react-dgEcD0HR.js","assets/FilterChips-Wo8I8zEd.js","assets/heroui-BI50yK5B.js","assets/recharts-C4kRDmvS.js","assets/tableSelection-9hV37uhu.js","assets/ConfirmDialog-CWW3AYpK.js","assets/DataTable-Bmn_eYSV.js","assets/TablePagination-r1AimUKf.js","assets/AliasesPage-Q7olOjhL.js","assets/Field-Dwp6u3t8.js","assets/BudgetsPage-lTuTS-F9.js","assets/DocsPage-BAH_T1JY.js","assets/KeysPage-bUjPPYgf.js","assets/ModelScopeControl-DmfR9Ylv.js","assets/ModelsPage-BMtuCmJv.js","assets/OverviewPage-CX9hXHG1.js","assets/charts-DIsd9m--.js","assets/ProvidersPage-DQdazSS9.js","assets/SettingsPage-CJyO6zWH.js","assets/ToolsGuardrailsPage-1cTNaDRp.js","assets/UsagePage-BECQyz4e.js","assets/UsersPage-CAU0FXTt.js"])))=>i.map(i=>d[i]); -var _e=Object.defineProperty;var Te=(e,t,n)=>t in e?_e(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var ie=(e,t,n)=>Te(e,typeof t!="symbol"?t+"":t,n);import{u as v,j as r,a as p,b as h,k as Y,Q as Le,c as Ie}from"./tanstack-query-1t81HyiD.js";import{d as Ae,r as i,N as H,O as qe,H as Re,e as De,f as w,h as Oe}from"./react-dgEcD0HR.js";import{B as C,C as M,L as me,I as fe,a as Me,b as Fe,d as D,c as N,T as Ue,e as Ke}from"./heroui-BI50yK5B.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))s(o);new MutationObserver(o=>{for(const a of o)if(a.type==="childList")for(const f of a.addedNodes)f.tagName==="LINK"&&f.rel==="modulepreload"&&s(f)}).observe(document,{childList:!0,subtree:!0});function n(o){const a={};return o.integrity&&(a.integrity=o.integrity),o.referrerPolicy&&(a.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?a.credentials="include":o.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function s(o){if(o.ep)return;o.ep=!0;const a=n(o);fetch(o.href,a)}})();var Be=Ae();const $e="modulepreload",ze=function(e){return"/"+e},oe={},P=function(t,n,s){let o=Promise.resolve();if(n&&n.length>0){let f=function(u){return Promise.all(u.map(b=>Promise.resolve(b).then(x=>({status:"fulfilled",value:x}),x=>({status:"rejected",reason:x}))))};document.getElementsByTagName("link");const m=document.querySelector("meta[property=csp-nonce]"),y=(m==null?void 0:m.nonce)||(m==null?void 0:m.getAttribute("nonce"));o=f(n.map(u=>{if(u=ze(u),u in oe)return;oe[u]=!0;const b=u.endsWith(".css"),x=b?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${u}"]${x}`))return;const d=document.createElement("link");if(d.rel=b?"stylesheet":$e,b||(d.as="script"),d.crossOrigin="",d.href=u,y&&d.setAttribute("nonce",y),document.head.appendChild(d),b)return new Promise((L,q)=>{d.addEventListener("load",L),d.addEventListener("error",()=>q(new Error(`Unable to preload CSS for ${u}`)))})}))}function a(f){const m=new Event("vite:preloadError",{cancelable:!0});if(m.payload=f,window.dispatchEvent(m),!m.defaultPrevented)throw f}return o.then(f=>{for(const m of f||[])m.status==="rejected"&&a(m.reason);return t().catch(a)})};class _ extends Error{constructor(n,s){super(s);ie(this,"status");this.name="ApiError",this.status=n}}let F=null;function le(e){F=e}async function G(e){try{const t=await e.json();if(typeof t.detail=="string")return t.detail;if(t.detail!=null)return JSON.stringify(t.detail)}catch{}return e.statusText||`Request failed (${e.status})`}async function Qe(e){let t;try{t=await fetch("/v1/auth/session",{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({master_key:e})})}catch{throw new _(0,"Network error: could not reach the gateway.")}if(t.status===401||t.status===403)return!1;if(!t.ok)throw new _(t.status,await G(t));return!0}async function Ve(){try{await fetch("/v1/auth/session",{method:"DELETE"})}catch{}}async function l(e,t={}){const n=new Headers(t.headers);n.set("Accept","application/json"),t.body!=null&&!n.has("Content-Type")&&n.set("Content-Type","application/json");let s;try{s=await fetch(e,{...t,headers:n})}catch{throw new _(0,"Network error: could not reach the gateway.")}if(s.status===401||s.status===403)throw F==null||F(),new _(s.status,await G(s));if(!s.ok)throw new _(s.status,await G(s));if(s.status!==204)return await s.json()}const J="otari.dashboard.hasSession",he=i.createContext(null);function We(){try{return window.localStorage.getItem(J)==="1"}catch{return!1}}function He({children:e}){const t=v(),[n,s]=i.useState(We),o=i.useCallback(()=>{Ve(),s(!1),t.clear();try{window.localStorage.removeItem(J)}catch{}},[t]),a=i.useCallback(()=>{t.clear(),s(!0);try{window.localStorage.setItem(J,"1")}catch{}},[t]);i.useEffect(()=>(le(o),()=>le(null)),[o]);const f=i.useMemo(()=>({isAuthenticated:n,login:a,logout:o}),[n,a,o]);return r.jsx(he.Provider,{value:f,children:e})}function X(){const e=i.useContext(he);if(!e)throw new Error("useAuth must be used within an AuthProvider");return e}function Ge(e){return e instanceof _&&e.status===0}function Je(){const e=v(),[t,n]=i.useState(!1);return i.useEffect(()=>{const s=e.getQueryCache(),o=()=>s.getAll().some(a=>a.state.status==="error"&&Ge(a.state.error));return n(o()),s.subscribe(()=>n(o()))},[e]),t}function Ye(){return Je()?r.jsxs("div",{role:"alert","aria-live":"assertive",className:"fixed right-4 bottom-4 z-50 flex max-w-sm items-start gap-2.5 rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700 shadow-lg",children:[r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2","aria-hidden":!0,className:"mt-0.5 h-5 w-5 shrink-0",children:[r.jsx("path",{d:"M12 9v4M12 17h.01",strokeLinecap:"round",strokeLinejoin:"round"}),r.jsx("path",{d:"M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0z",strokeLinejoin:"round"})]}),r.jsxs("span",{children:[r.jsx("strong",{className:"font-semibold",children:"Can’t reach the gateway."})," The backend isn’t responding; data won’t load or save until the connection is restored."]})]}):null}const T="models",K="pricing",xe="settings",ve="tool-settings",Z="aliases",ee="discoverable",te="providers",re="provider-health",ye="stored-providers",Xe="model-metadata",Ze="build",I="keys",A="budgets",ge="users",O="usage",et=6e4,ce=60*6e4;function Xt(){return p({queryKey:[T],queryFn:()=>l("/v1/models"),staleTime:6e4})}function tt(){return p({queryKey:[Ze],queryFn:()=>l("/dashboard-build.json"),refetchInterval:et,refetchOnWindowFocus:!0,staleTime:0,retry:!1})}function Zt(){return p({queryKey:[ee],queryFn:()=>l("/v1/models/discoverable"),staleTime:5*6e4})}function er(){return p({queryKey:[te],queryFn:()=>l("/v1/providers"),staleTime:5*6e4})}function tr(){return p({queryKey:["provider-catalog"],queryFn:()=>l("/v1/providers/catalog"),staleTime:1/0})}function rr(e){return p({queryKey:["provider-catalog",e],queryFn:()=>l(`/v1/providers/catalog/${encodeURIComponent(e)}`),enabled:e!=="",staleTime:1/0})}function nr(){return p({queryKey:[re],queryFn:()=>l("/v1/providers/health"),staleTime:ce,refetchInterval:ce})}function sr(){const e=v();return h({mutationFn:()=>l("/v1/providers/health?refresh=true"),onSuccess:t=>e.setQueryData([re],t)})}function ar(){return p({queryKey:[ye],queryFn:()=>l("/v1/provider-credentials"),staleTime:6e4})}function B(e){e.invalidateQueries({queryKey:[ye]}),e.invalidateQueries({queryKey:[te]}),e.invalidateQueries({queryKey:[T]}),e.invalidateQueries({queryKey:[ee]}),e.invalidateQueries({queryKey:[re]})}function ir(){const e=v();return h({mutationFn:t=>l("/v1/provider-credentials",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>B(e)})}function or(){const e=v();return h({mutationFn:({instance:t,body:n})=>l(`/v1/provider-credentials/${encodeURIComponent(t)}`,{method:"PATCH",body:JSON.stringify(n)}),onSuccess:()=>B(e)})}function lr(){const e=v();return h({mutationFn:t=>l(`/v1/provider-credentials/${encodeURIComponent(t)}`,{method:"DELETE"}),onSuccess:()=>B(e)})}function cr(){const e=v();return h({mutationFn:()=>l("/v1/provider-credentials/reencrypt",{method:"POST"}),onSuccess:()=>B(e)})}function ur(){return h({mutationFn:e=>l(`/v1/provider-credentials/${encodeURIComponent(e)}/test`,{method:"POST"})})}function dr(){return h({mutationFn:e=>l("/v1/provider-credentials/test",{method:"POST",body:JSON.stringify(e)})})}function mr(){return p({queryKey:[Xe],queryFn:()=>l("/v1/models/metadata"),staleTime:10*6e4})}function fr(){return p({queryKey:[Z],queryFn:()=>l("/v1/aliases"),staleTime:6e4})}function hr(){const e=v();return h({mutationFn:t=>l("/v1/aliases",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>{e.invalidateQueries({queryKey:[Z]}),e.invalidateQueries({queryKey:[T]})}})}function xr(){const e=v();return h({mutationFn:t=>l(`/v1/aliases/${encodeURIComponent(t)}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:[Z]}),e.invalidateQueries({queryKey:[T]})}})}function rt(){return p({queryKey:[xe],queryFn:()=>l("/v1/settings"),staleTime:6e4})}function nt(){const e=v();return h({mutationFn:t=>l("/v1/settings",{method:"PATCH",body:JSON.stringify(t)}),onSuccess:t=>{e.setQueryData([xe],t),e.invalidateQueries({queryKey:[T]}),e.invalidateQueries({queryKey:[ee]})}})}function vr(){return h({mutationFn:()=>l("/v1/settings/master-key/rotate",{method:"POST"})})}function yr(){return p({queryKey:[ve],queryFn:()=>l("/v1/tool-settings"),staleTime:6e4})}function gr(){const e=v();return h({mutationFn:t=>l("/v1/tool-settings",{method:"PATCH",body:JSON.stringify(t)}),onSuccess:t=>{e.setQueryData([ve],t)}})}function pr(){return h({mutationFn:({service:e,url:t})=>l(`/v1/tool-settings/${encodeURIComponent(e)}/test`,{method:"POST",body:JSON.stringify({url:t})})})}const $=1e3,st=100;async function at(){const e=[];for(let t=0;tl("/v1/pricing",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>{e.invalidateQueries({queryKey:[K]}),e.invalidateQueries({queryKey:[T]})}})}function wr(){const e=v();return h({mutationFn:t=>l(`/v1/pricing/${encodeURIComponent(t)}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:[K]}),e.invalidateQueries({queryKey:[T]})}})}function Sr(){return h({mutationFn:()=>l("/v1/pricing/refresh",{method:"POST"})})}function kr(){const e=v();return h({mutationFn:()=>l("/v1/pricing/refresh/confirm",{method:"POST"}),onSuccess:()=>{e.invalidateQueries({queryKey:[K]}),e.invalidateQueries({queryKey:[T]}),e.invalidateQueries({queryKey:[te]})}})}function Er(){return h({mutationFn:()=>l("/v1/pricing/refresh/reject",{method:"POST"})})}const z=1e3,it=100;async function ot(){const e=[];for(let t=0;tl("/v1/keys",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>void e.invalidateQueries({queryKey:[I]})})}function Cr(){const e=v();return h({mutationFn:({id:t,body:n})=>l(`/v1/keys/${encodeURIComponent(t)}`,{method:"PATCH",body:JSON.stringify(n)}),onSuccess:()=>void e.invalidateQueries({queryKey:[I]})})}function _r(){const e=v();return h({mutationFn:t=>l(`/v1/keys/${encodeURIComponent(t)}/rotate`,{method:"POST"}),onSuccess:()=>void e.invalidateQueries({queryKey:[I]})})}function Tr(){const e=v();return h({mutationFn:t=>l(`/v1/keys/${encodeURIComponent(t)}`,{method:"DELETE"}),onSuccess:()=>void e.invalidateQueries({queryKey:[I]})})}const Q=1e3,lt=100;async function ct(){const e=[];for(let t=0;tl(`/v1/budgets/${encodeURIComponent(e)}/reset-logs`),enabled:e!==null,staleTime:6e4})}function Ar(){const e=v();return h({mutationFn:t=>l("/v1/budgets",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>void e.invalidateQueries({queryKey:[A]})})}function qr(){const e=v();return h({mutationFn:({id:t,body:n})=>l(`/v1/budgets/${encodeURIComponent(t)}`,{method:"PATCH",body:JSON.stringify(n)}),onSuccess:()=>void e.invalidateQueries({queryKey:[A]})})}function Rr(){const e=v();return h({mutationFn:t=>l(`/v1/budgets/${encodeURIComponent(t)}`,{method:"DELETE"}),onSuccess:()=>void e.invalidateQueries({queryKey:[A]})})}const V=1e3,ut=100;async function dt(){const e=[];for(let t=0;tl("/v1/users",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>ne(e)})}function Mr(){const e=v();return h({mutationFn:({id:t,body:n})=>l(`/v1/users/${encodeURIComponent(t)}`,{method:"PATCH",body:JSON.stringify(n)}),onSuccess:()=>ne(e)})}function Fr(){const e=v();return h({mutationFn:t=>l(`/v1/users/${encodeURIComponent(t)}`,{method:"DELETE"}),onSuccess:()=>{ne(e),e.invalidateQueries({queryKey:[I]})}})}function se(e){const t=new URLSearchParams;return e.start_date&&t.set("start_date",e.start_date),e.end_date&&t.set("end_date",e.end_date),e.status&&t.set("status",e.status),e.model&&t.set("model",e.model),e.endpoint&&t.set("endpoint",e.endpoint),e.user_id&&t.set("user_id",e.user_id),e.api_key_id&&t.set("api_key_id",e.api_key_id),e.source&&t.set("source",e.source),e.priced!==void 0&&t.set("priced",String(e.priced)),e.counts_toward_budget!==void 0&&t.set("counts_toward_budget",String(e.counts_toward_budget)),t}function Ur(e,t,n){return p({queryKey:[O,"list",e,t,n],queryFn:()=>{const s=se(e);return s.set("skip",String(t*n)),s.set("limit",String(n)),l(`/v1/usage?${s.toString()}`)},placeholderData:Y,staleTime:1e4})}function Kr(e,t=!0){return p({queryKey:[O,"count",e],queryFn:()=>l(`/v1/usage/count?${se(e).toString()}`),enabled:t,placeholderData:Y,staleTime:1e4})}function Br(){const e=v();return h({mutationFn:t=>l("/v1/usage",{method:"DELETE",body:JSON.stringify(t)}),onSuccess:()=>{e.invalidateQueries({queryKey:[O]})}})}function $r(){const e=v();return h({mutationFn:t=>l("/v1/usage/set-price",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>{e.invalidateQueries({queryKey:[O]})}})}function zr(e,t,n=!0){return p({queryKey:[O,"summary",e,t],queryFn:()=>{const s=se(e);return s.set("bucket",t),l(`/v1/usage/summary?${s.toString()}`)},enabled:n,placeholderData:Y,staleTime:3e4})}function Qr(e){return e==null?"0":new Intl.NumberFormat("en-US").format(e)}function Vr(e){if(e==null)return"$0.00";const t=e!==0&&Math.abs(e)<.01?4:2;return new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",minimumFractionDigits:2,maximumFractionDigits:t}).format(e)}function Wr(e){if(e==null)return"—";if(e>=1e6){const t=e/1e6;return`${Number.isInteger(t)?t:t.toFixed(1)}M`}if(e>=1e3){const t=Math.round(e/1e3);return t>=1e3?"1M":`${t}K`}return String(e)}const mt=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function Hr(e){if(!e)return"—";const t=/^(\d{4})-(\d{2})/.exec(e);if(!t)return e;const n=Number(t[2])-1;return n<0||n>11?t[1]:`${mt[n]} ${t[1]}`}const ft=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",maximumFractionDigits:2});function Gr(e){return ft.format(e)}function Jr(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function ht(e){return`${(e*100).toFixed(1)}%`}function Yr(e,t){return t===void 0||t===0?null:(e-t)/t}function xt(e,t=Date.now()){if(!e)return"never";const n=new Date(e);if(Number.isNaN(n.getTime()))return e;const s=Math.round((t-n.getTime())/1e3),o=s<0,a=Math.abs(s),f=[["second",60],["minute",60],["hour",24],["day",30],["month",12],["year",Number.POSITIVE_INFINITY]];let m=a,y="second";for(const[b,x]of f){if(y=b,m0?"▲":e<0?"▼":"•";return r.jsxs("span",{className:"text-[var(--otari-muted)]",children:[t," ",ht(Math.abs(e))," vs prev"]})}function vt(e){return e instanceof _||e instanceof Error?e.message:"Something went wrong."}function yt({error:e}){return e?r.jsx("div",{role:"alert",className:"rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700",children:vt(e)}):null}function gt({tone:e="info",children:t}){const n=e==="warning"?"border-amber-200 bg-amber-50 text-amber-800":"border-[var(--otari-brand)] bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]";return r.jsx("div",{className:`rounded-lg border px-4 py-3 text-sm ${n}`,children:t})}function en({title:e,description:t,action:n}){return r.jsxs("div",{className:"flex flex-col gap-3",children:[r.jsxs("div",{children:[r.jsx("h1",{className:"text-xl font-semibold text-[var(--otari-ink)]",children:e}),t?r.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:t}):null]}),n?r.jsx("div",{className:"flex flex-wrap gap-2",children:n}):null]})}function pt(e){const[t,n]=i.useState(()=>Date.now());return i.useEffect(()=>{let s;const o=()=>{s===void 0&&(s=setInterval(()=>n(Date.now()),e))},a=()=>{s!==void 0&&(clearInterval(s),s=void 0)},f=()=>{n(Date.now()),document.visibilityState==="visible"?o():a()};return f(),document.addEventListener("visibilitychange",f),()=>{a(),document.removeEventListener("visibilitychange",f)}},[e]),t}function tn({onRefresh:e,isFetching:t=!1,updatedAt:n,label:s="Refresh"}){const o=pt(15e3),a=n?xt(new Date(n).toISOString(),o):null;return r.jsxs("span",{className:"inline-flex items-center gap-2",children:[a?r.jsxs("span",{className:"text-xs text-[var(--otari-muted)]",children:["Updated ",a]}):null,r.jsx(C,{variant:"outline",size:"sm",isIconOnly:!0,isDisabled:t,onPress:e,"aria-label":s,children:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:`h-4 w-4 ${t?"animate-spin":""}`,"aria-hidden":"true",children:[r.jsx("path",{d:"M20 11a8 8 0 1 0-.5 4",strokeLinecap:"round",strokeLinejoin:"round"}),r.jsx("path",{d:"M20 4v5h-5",strokeLinecap:"round",strokeLinejoin:"round"})]})})]})}function rn({children:e,confirmLabel:t,onConfirm:n,isPending:s}){const[o,a]=i.useState(!1);return o?r.jsxs("span",{className:"inline-flex items-center gap-1",children:[r.jsx(C,{size:"sm",variant:"danger",isDisabled:s,onPress:n,children:t}),r.jsx(C,{size:"sm",variant:"ghost",isDisabled:s,onPress:()=>a(!1),children:"Cancel"})]}):r.jsx(C,{size:"sm",variant:"danger-soft",onPress:()=>a(!0),children:e})}const bt="rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-3 py-2 text-sm text-[var(--otari-ink)] focus:border-[var(--otari-brand)] focus:outline-none";function nn({id:e,label:t,ariaLabel:n,value:s,onChange:o,options:a,children:f,disabled:m}){const y=i.useId(),u=e??(t?y:void 0),b=r.jsx("select",{id:u,"aria-label":t?void 0:n,value:s,disabled:m,onChange:x=>o(x.target.value),className:bt,children:a?a.map(x=>r.jsx("option",{value:x.value,children:x.label},x.value)):f});return t?r.jsxs("div",{className:"flex flex-col gap-1",children:[r.jsx("label",{htmlFor:u,className:"text-xs font-medium text-[var(--otari-muted)]",children:t}),b]}):b}function sn({label:e,value:t,onChange:n,options:s,placeholder:o,maxVisible:a=50,allowsCustom:f=!1}){const m=d=>{var L;return((L=s.find(q=>q.value===d))==null?void 0:L.label)??d},[y,u]=i.useState(()=>m(t));i.useEffect(()=>{u(m(t))},[t]);const b=y.trim().toLowerCase(),x=s.filter(d=>!b||d.value.toLowerCase().includes(b)||d.label.toLowerCase().includes(b)).slice(0,a);return r.jsxs(M.Root,{allowsEmptyCollection:!0,allowsCustomValue:f,menuTrigger:"focus",inputValue:y,onInputChange:d=>{u(d),f?n(d.trim()):d.trim()===""&&n("")},onSelectionChange:d=>{d!=null&&n(String(d))},className:"flex flex-col gap-1",children:[r.jsx(me,{className:"text-xs font-medium text-[var(--otari-muted)]",children:e}),r.jsxs(M.InputGroup,{children:[r.jsx(fe,{placeholder:o,autoComplete:"off",onFocus:d=>d.currentTarget.select()}),r.jsx(M.Trigger,{})]}),r.jsx(M.Popover,{children:r.jsx(Me,{items:x,className:"max-h-72 overflow-auto",children:d=>r.jsx(Fe,{id:d.value,textValue:d.label,children:d.label})})})]})}function jt(){var a;const e=rt(),t=nt(),[n,s]=i.useState(!1);return!(((a=e.data)==null?void 0:a.require_pricing)===!0&&e.data.default_pricing===!1)||n?null:r.jsx("div",{className:"shrink-0 px-6 pt-3",children:r.jsx(gt,{tone:"warning",children:r.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[r.jsxs("span",{children:["Requests are rejected until pricing is set (",r.jsx("code",{children:"require_pricing"})," is on). Enable default pricing to meter new models with public rates right away."]}),r.jsxs("span",{className:"flex items-center gap-2",children:[r.jsx(C,{size:"sm",variant:"primary",isDisabled:t.isPending,onPress:()=>t.mutate({default_pricing:!0}),children:t.isPending?"Enabling…":"Enable default pricing"}),r.jsx(C,{size:"sm",variant:"ghost",onPress:()=>s(!0),children:"Dismiss"})]})]})})})}function wt(){const{data:e}=tt(),t=i.useRef(null);return e&&t.current===null&&(t.current=e.build),e!=null&&t.current!=null&&e.build!==t.current}function St(){const e=wt(),[t,n]=i.useState(!1);return!e||t?null:r.jsx("div",{className:"pointer-events-none absolute inset-x-0 top-0 z-50 flex justify-center",children:r.jsxs("div",{role:"status",className:"pointer-events-auto mt-1.5 flex items-center gap-3 rounded-full border border-[var(--otari-brand)] bg-[var(--otari-brand-tint)] py-1.5 pr-1.5 pl-4 text-sm text-[var(--otari-brand-dark)] shadow-md",children:[r.jsxs("span",{children:[r.jsx("strong",{className:"font-semibold",children:"An update is available."})," Reloading keeps you signed in."]}),r.jsx(C,{size:"sm",variant:"primary",onPress:()=>window.location.reload(),children:"Update now"}),r.jsx(C,{size:"sm",variant:"ghost",onPress:()=>n(!0),children:"Later"})]})})}const pe=200,be=480,W=240,kt=60,je="otari.dashboard.sidebarWidth",we="otari.dashboard.sidebarCollapsed",de=16,Se="(max-width: 767px)",U=e=>Math.min(be,Math.max(pe,e));function Et(){return typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia(Se).matches}const Pt='a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"])';function Nt(e){return e?Array.from(e.querySelectorAll(Pt)).filter(t=>t.offsetParent!==null||t===document.activeElement):[]}function Ct(){if(typeof window>"u")return W;try{const e=window.localStorage.getItem(je),t=e?Number.parseInt(e,10):Number.NaN;return Number.isNaN(t)?W:U(t)}catch{return W}}function _t(){if(typeof window>"u")return!1;try{return window.localStorage.getItem(we)==="1"}catch{return!1}}const Tt=[{key:"home"},{key:"observability",label:"Observability"},{key:"catalog",label:"Catalog"},{key:"access",label:"Access"},{key:"system"}],Lt=[{to:"/",section:"home",label:"Overview",end:!0,icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("rect",{x:"3.5",y:"3.5",width:"7",height:"7",rx:"1.5",strokeLinejoin:"round"}),r.jsx("rect",{x:"13.5",y:"3.5",width:"7",height:"7",rx:"1.5",strokeLinejoin:"round"}),r.jsx("rect",{x:"3.5",y:"13.5",width:"7",height:"7",rx:"1.5",strokeLinejoin:"round"}),r.jsx("rect",{x:"13.5",y:"13.5",width:"7",height:"7",rx:"1.5",strokeLinejoin:"round"})]})},{to:"/activity",section:"observability",label:"Activity",icon:r.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:r.jsx("path",{d:"M3 12h4l2.5-6 4 12 2.5-6H21",strokeLinecap:"round",strokeLinejoin:"round"})})},{to:"/usage",section:"observability",label:"Usage",icon:r.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:r.jsx("path",{d:"M4 20V10M10 20V4M16 20v-7M22 20H2",strokeLinecap:"round",strokeLinejoin:"round"})})},{to:"/providers",section:"catalog",label:"Providers",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("rect",{x:"3.5",y:"4.5",width:"17",height:"6",rx:"1.5",strokeLinejoin:"round"}),r.jsx("rect",{x:"3.5",y:"13.5",width:"17",height:"6",rx:"1.5",strokeLinejoin:"round"}),r.jsx("path",{d:"M7 7.5h.01M7 16.5h.01",strokeLinecap:"round",strokeLinejoin:"round"})]})},{to:"/users",section:"access",label:"Users",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("circle",{cx:"9",cy:"8",r:"3.2",strokeLinejoin:"round"}),r.jsx("path",{d:"M3.5 19a5.5 5.5 0 0 1 11 0",strokeLinecap:"round",strokeLinejoin:"round"}),r.jsx("path",{d:"M16 5.2a3.2 3.2 0 0 1 0 5.6M17.5 19a5.5 5.5 0 0 0-3-4.9",strokeLinecap:"round",strokeLinejoin:"round"})]})},{to:"/keys",section:"access",label:"API keys",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("circle",{cx:"7.5",cy:"15.5",r:"3.5"}),r.jsx("path",{d:"M10 13l7-7M14 5l3 3M16.5 7.5l2-2",strokeLinecap:"round",strokeLinejoin:"round"})]})},{to:"/budgets",section:"access",label:"Budgets",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("path",{d:"M3 7.5A1.5 1.5 0 0 1 4.5 6H18a1.5 1.5 0 0 1 1.5 1.5V9",strokeLinejoin:"round"}),r.jsx("rect",{x:"3",y:"7.5",width:"18",height:"12",rx:"1.5",strokeLinejoin:"round"}),r.jsx("path",{d:"M16 13.5h.01",strokeLinecap:"round",strokeLinejoin:"round"}),r.jsx("path",{d:"M21 12v3h-3.5a1.5 1.5 0 0 1 0-3H21z",strokeLinejoin:"round"})]})},{to:"/models",section:"catalog",label:"Models",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("path",{d:"M12 3l8 4.5v9L12 21l-8-4.5v-9L12 3z",strokeLinejoin:"round"}),r.jsx("path",{d:"M12 12l8-4.5M12 12v9M12 12L4 7.5",strokeLinejoin:"round"})]})},{to:"/aliases",section:"catalog",label:"Aliases",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("path",{d:"M20.6 13.4L13.4 20.6a2 2 0 0 1-2.8 0l-7-7A2 2 0 0 1 3 12.2V5a2 2 0 0 1 2-2h7.2a2 2 0 0 1 1.4.6l7 7a2 2 0 0 1 0 2.8z",strokeLinejoin:"round"}),r.jsx("circle",{cx:"7.5",cy:"7.5",r:"1.5"})]})},{to:"/tools",section:"system",label:"Tools & Guardrails",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("path",{d:"M14.7 6.3a4 4 0 0 1 5 5l-8.4 8.4a2 2 0 0 1-2.8 0l-2.2-2.2a2 2 0 0 1 0-2.8z",strokeLinejoin:"round"}),r.jsx("path",{d:"M12 9 5 16",strokeLinecap:"round"})]})},{to:"/settings",section:"system",label:"Settings",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("circle",{cx:"12",cy:"12",r:"3"}),r.jsx("path",{d:"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z",strokeLinejoin:"round"})]})}];function It(){const{logout:e}=X(),t=i.useRef(null),n=i.useRef(null),[s,o]=i.useState(Ct),[a,f]=i.useState(_t),[m,y]=i.useState(!1),[u,b]=i.useState(Et),[x,d]=i.useState(!1);i.useEffect(()=>{if(typeof window>"u"||typeof window.matchMedia!="function")return;const c=window.matchMedia(Se),g=j=>{b(j.matches),j.matches||d(!1)};return typeof c.addEventListener=="function"?(c.addEventListener("change",g),()=>c.removeEventListener("change",g)):(c.addListener(g),()=>c.removeListener(g))},[]),i.useEffect(()=>{if(!x)return;const c=g=>{g.key==="Escape"&&d(!1)};return window.addEventListener("keydown",c),()=>window.removeEventListener("keydown",c)},[x]),i.useEffect(()=>{var c,g,j;u&&(x?(c=t.current)==null||c.focus():(g=t.current)!=null&&g.contains(document.activeElement)&&((j=n.current)==null||j.focus()))},[u,x]);const L=i.useCallback(c=>{if(c.key!=="Tab")return;const g=Nt(t.current);if(g.length===0)return;const j=g[0],k=g[g.length-1],R=document.activeElement;c.shiftKey&&(R===j||R===t.current)?(c.preventDefault(),k.focus()):!c.shiftKey&&R===k&&(c.preventDefault(),j.focus())},[]);i.useEffect(()=>{const c=window.setTimeout(()=>{try{window.localStorage.setItem(je,String(Math.round(s)))}catch{}},200);return()=>window.clearTimeout(c)},[s]),i.useEffect(()=>{try{window.localStorage.setItem(we,a?"1":"0")}catch{}},[a]);const q=i.useCallback(c=>{c.preventDefault(),c.currentTarget.setPointerCapture(c.pointerId),y(!0)},[]),Ee=i.useCallback(c=>{var j;if(!c.currentTarget.hasPointerCapture(c.pointerId))return;const g=((j=t.current)==null?void 0:j.getBoundingClientRect().left)??0;o(U(c.clientX-g))},[]),Pe=i.useCallback(c=>{c.currentTarget.hasPointerCapture(c.pointerId)&&c.currentTarget.releasePointerCapture(c.pointerId),y(!1)},[]),Ne=i.useCallback(c=>{c.key==="ArrowLeft"?(c.preventDefault(),o(g=>U(g-de))):c.key==="ArrowRight"&&(c.preventDefault(),o(g=>U(g+de)))},[]),Ce=a?kt:s,S=u?!1:a,ae=u&&x?!0:void 0;return r.jsxs("div",{className:N("relative flex h-full flex-col overflow-hidden",m&&"cursor-col-resize select-none"),children:[r.jsxs("header",{inert:ae,className:"flex shrink-0 items-center justify-between border-b border-[var(--otari-line)] bg-[var(--otari-surface)] px-5 py-3",children:[r.jsxs("div",{className:"flex items-center gap-2.5",children:[r.jsx("button",{type:"button",ref:n,onClick:()=>d(c=>!c),"aria-label":x?"Close navigation":"Open navigation","aria-expanded":x,"aria-controls":"app-sidebar",className:"-ml-1 flex h-8 w-8 items-center justify-center rounded-lg text-[var(--otari-muted)] transition-colors hover:bg-[var(--otari-bg)] hover:text-[var(--otari-ink)] md:hidden",children:r.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5",children:r.jsx("path",{d:"M4 6h16M4 12h16M4 18h16",strokeLinecap:"round",strokeLinejoin:"round"})})}),r.jsx("img",{src:"/favicon.svg",alt:"",className:"h-7 w-7 shrink-0"}),r.jsx("span",{className:"text-base font-semibold text-[var(--otari-ink)]",children:"Otari"})]}),r.jsx(C,{size:"sm",variant:"outline",onPress:e,"aria-label":"Sign out",children:"Sign out"})]}),r.jsx(St,{}),r.jsx(Ye,{}),r.jsx(jt,{}),r.jsxs("div",{className:"flex min-h-0 flex-1",children:[u&&x?r.jsx("div",{"aria-hidden":"true",onClick:()=>d(!1),className:"fixed inset-0 z-30 bg-black/40 md:hidden"}):null,r.jsxs("aside",{ref:t,id:"app-sidebar",role:u?"dialog":void 0,"aria-modal":u&&x?!0:void 0,"aria-label":u?"Navigation":void 0,tabIndex:u?-1:void 0,inert:u&&!x?!0:void 0,onKeyDown:u&&x?L:void 0,style:u?void 0:{width:Ce},className:N("flex flex-col border-r border-[var(--otari-line)] bg-[var(--otari-surface)] focus:outline-none",u?N("fixed inset-y-0 left-0 z-40 w-[17rem] shadow-xl transition-transform duration-200",x?"translate-x-0":"-translate-x-full"):N("relative shrink-0",!m&&"transition-[width] duration-150")),children:[r.jsx("button",{type:"button",onClick:()=>f(c=>!c),"aria-label":a?"Expand sidebar":"Collapse sidebar","aria-pressed":a,title:a?"Expand sidebar":"Collapse sidebar",className:"absolute -right-3 top-4 z-30 hidden h-6 w-6 items-center justify-center rounded-full border border-[var(--otari-line)] bg-[var(--otari-surface)] text-[var(--otari-muted)] shadow-sm transition-colors hover:border-[var(--otari-brand)] hover:text-[var(--otari-brand-dark)] md:flex",children:r.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",className:N("h-3.5 w-3.5 transition-transform",a&&"rotate-180"),children:r.jsx("path",{d:"M15 6l-6 6 6 6",strokeLinecap:"round",strokeLinejoin:"round"})})}),r.jsx("nav",{className:N("flex flex-col py-4",S?"px-2":"px-3"),children:Tt.map((c,g)=>{const j=Lt.filter(k=>k.section===c.key);return j.length===0?null:r.jsxs("div",{className:g>0?"mt-4":void 0,children:[!S&&c.label?r.jsx("div",{className:"px-3 pb-1 text-[11px] font-semibold tracking-wider text-[var(--otari-muted)] uppercase",children:c.label}):null,g>0&&(S||!c.label)?r.jsx("div",{className:"mx-1 mb-2 border-t border-[var(--otari-line)]"}):null,r.jsx("div",{className:"flex flex-col gap-1",children:j.map(k=>r.jsxs(H,{to:k.to,end:k.end,onClick:()=>d(!1),"aria-label":S?k.label:void 0,title:S?k.label:void 0,className:({isActive:R})=>N("flex items-center rounded-lg py-2 text-sm font-medium transition-colors",S?"justify-center px-0":"gap-3 px-3",R?"bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]":"text-[var(--otari-muted)] hover:bg-[var(--otari-bg)] hover:text-[var(--otari-ink)]"),children:[k.icon,S?null:k.label]},k.to))})]},c.key)})}),r.jsxs("div",{className:"mt-auto flex flex-col gap-1 pb-3",children:[r.jsxs(H,{to:"/docs",onClick:()=>d(!1),"aria-label":S?"User guide":void 0,title:S?"User guide":void 0,className:({isActive:c})=>N("flex items-center rounded-lg py-2 text-sm font-medium transition-colors",S?"mx-2 justify-center px-0":"mx-3 gap-3 px-3",c?"bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]":"text-[var(--otari-muted)] hover:bg-[var(--otari-bg)] hover:text-[var(--otari-ink)]"),children:[r.jsxs("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("path",{d:"M12 6.5C10.5 5 8 4.5 4 4.5V18c4 0 6.5.5 8 2 1.5-1.5 4-2 8-2V4.5c-4 0-6.5.5-8 2z",strokeLinejoin:"round"}),r.jsx("path",{d:"M12 6.5V20",strokeLinecap:"round"})]}),S?null:"User guide"]}),r.jsxs("a",{href:"https://otari.ai",target:"_blank",rel:"noreferrer",title:"otari.ai — the hosted Otari gateway",className:N("flex items-center rounded-lg py-2 text-xs font-medium text-[var(--otari-muted)] transition-colors hover:bg-[var(--otari-bg)] hover:text-[var(--otari-brand-dark)]",S?"mx-2 justify-center px-0":"mx-3 gap-2 px-3"),children:[r.jsx("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-4 w-4 shrink-0",children:r.jsx("path",{d:"M18 10h-1.26A8 8 0 1 0 9 20h9a5 5 0 0 0 0-10z",strokeLinejoin:"round"})}),S?null:r.jsxs("span",{className:"flex-1",children:["otari.ai ",r.jsx("span",{"aria-hidden":!0,children:"↗"})]})]})]}),a||u?null:r.jsx("div",{role:"separator","aria-orientation":"vertical","aria-label":"Resize sidebar","aria-valuenow":Math.round(s),"aria-valuemin":pe,"aria-valuemax":be,tabIndex:0,onPointerDown:q,onPointerMove:Ee,onPointerUp:Pe,onKeyDown:Ne,className:N("absolute top-0 right-0 z-10 h-full w-1.5 cursor-col-resize touch-none transition-colors","hover:bg-[var(--otari-brand)] focus-visible:bg-[var(--otari-brand)] focus:outline-none",m?"bg-[var(--otari-brand)]":"bg-transparent")})]}),r.jsx("main",{inert:ae,className:"flex-1 overflow-y-auto",children:r.jsx("div",{className:"mx-auto flex max-w-[1800px] flex-col gap-6 px-4 py-5 md:px-6 md:py-6",children:r.jsx(qe,{})})})]})]})}function At(){const{login:e}=X(),[t,n]=i.useState(""),[s,o]=i.useState(null),[a,f]=i.useState(!1),m=async()=>{const y=t.trim();if(!(!y||a)){f(!0),o(null);try{await Qe(y)?e():o(new Error("Invalid master key."))}catch(u){o(u)}finally{f(!1)}}};return r.jsx("div",{className:"flex min-h-full items-center justify-center p-6",children:r.jsx(D,{className:"w-full max-w-md",children:r.jsxs(D.Content,{className:"flex flex-col gap-5 p-7",children:[r.jsxs("div",{className:"flex flex-col items-center gap-3 text-center",children:[r.jsx("img",{src:"/favicon.svg",alt:"Otari",className:"h-12 w-12"}),r.jsxs("div",{children:[r.jsx("h1",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:"Otari Dashboard"}),r.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:"Sign in with your master key to browse models, set pricing, and manage settings."})]})]}),r.jsxs("form",{className:"flex flex-col gap-4",onSubmit:y=>{y.preventDefault(),m()},children:[r.jsxs(Ue,{value:t,onChange:y=>{n(y),s&&o(null)},type:"password",isRequired:!0,className:"flex flex-col gap-1",children:[r.jsx(me,{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Master key"}),r.jsx(fe,{placeholder:"otari-mk-… or your master key",autoFocus:!0,autoComplete:"off"})]}),r.jsxs("details",{className:"text-xs text-[var(--otari-muted)]",children:[r.jsx("summary",{className:"cursor-pointer font-medium text-[var(--otari-brand-dark)]",children:"First run? Where to find your key"}),r.jsxs("p",{className:"mt-2 leading-relaxed",children:["If you did not set ",r.jsx("code",{children:"OTARI_MASTER_KEY"}),", Otari generated one and printed it to the server logs on startup. Look for the line ",r.jsx("code",{children:"Your master key:"})," (for example, run"," ",r.jsx("code",{children:"docker logs "}),") and paste it above."]})]}),r.jsx(yt,{error:s}),r.jsx(C,{type:"submit",variant:"primary",fullWidth:!0,isDisabled:!t.trim()||a,children:a?"Signing in…":"Sign in"})]}),r.jsx("p",{className:"text-center text-xs text-[var(--otari-muted)]",children:"The key is sent once to this gateway and exchanged for a session cookie; it is never stored in the browser."}),r.jsx("div",{className:"border-t border-[var(--otari-line)] pt-4 text-center",children:r.jsx(Ke,{href:"/welcome",className:"text-sm font-medium text-[var(--otari-brand-dark)]",children:"New to Otari? Open the welcome guide"})})]})})})}const qt=i.lazy(async()=>({default:(await P(async()=>{const{ActivityPage:e}=await import("./ActivityPage-BFwaR2GB.js");return{ActivityPage:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]))).ActivityPage})),Rt=i.lazy(async()=>({default:(await P(async()=>{const{AliasesPage:e}=await import("./AliasesPage-Q7olOjhL.js");return{AliasesPage:e}},__vite__mapDeps([10,1,2,6,4,7,8,11]))).AliasesPage})),Dt=i.lazy(async()=>({default:(await P(async()=>{const{BudgetsPage:e}=await import("./BudgetsPage-lTuTS-F9.js");return{BudgetsPage:e}},__vite__mapDeps([12,1,2,6,4,7,8,11]))).BudgetsPage})),Ot=i.lazy(async()=>({default:(await P(async()=>{const{DocsPage:e}=await import("./DocsPage-BAH_T1JY.js");return{DocsPage:e}},__vite__mapDeps([13,1,2,4]))).DocsPage})),Mt=i.lazy(async()=>({default:(await P(async()=>{const{KeysPage:e}=await import("./KeysPage-bUjPPYgf.js");return{KeysPage:e}},__vite__mapDeps([14,1,2,6,4,7,8,11,15]))).KeysPage})),Ft=i.lazy(async()=>({default:(await P(async()=>{const{ModelsPage:e}=await import("./ModelsPage-BMtuCmJv.js");return{ModelsPage:e}},__vite__mapDeps([16,1,2,6,4,8,9]))).ModelsPage})),Ut=i.lazy(async()=>({default:(await P(async()=>{const{OverviewIndex:e}=await import("./OverviewPage-CX9hXHG1.js");return{OverviewIndex:e}},__vite__mapDeps([17,1,2,18,5,4,8]))).OverviewIndex})),Kt=i.lazy(async()=>({default:(await P(async()=>{const{ProvidersPage:e}=await import("./ProvidersPage-DQdazSS9.js");return{ProvidersPage:e}},__vite__mapDeps([19,1,2,11,4,8]))).ProvidersPage})),Bt=i.lazy(async()=>({default:(await P(async()=>{const{SettingsPage:e}=await import("./SettingsPage-CJyO6zWH.js");return{SettingsPage:e}},__vite__mapDeps([20,1,2,4]))).SettingsPage})),$t=i.lazy(async()=>({default:(await P(async()=>{const{ToolsGuardrailsPage:e}=await import("./ToolsGuardrailsPage-1cTNaDRp.js");return{ToolsGuardrailsPage:e}},__vite__mapDeps([21,1,2,4]))).ToolsGuardrailsPage})),zt=i.lazy(async()=>({default:(await P(async()=>{const{UsagePage:e}=await import("./UsagePage-BECQyz4e.js");return{UsagePage:e}},__vite__mapDeps([22,1,2,3,4,5,6,18,7,8,9]))).UsagePage})),Qt=i.lazy(async()=>({default:(await P(async()=>{const{UsersPage:e}=await import("./UsersPage-CAU0FXTt.js");return{UsersPage:e}},__vite__mapDeps([23,1,2,6,4,7,8,11,15]))).UsersPage}));function E(e){return r.jsx(i.Suspense,{fallback:r.jsx("div",{role:"status",children:"Loading page…"}),children:e})}function Vt(){const{isAuthenticated:e}=X();return e?r.jsx(Re,{children:r.jsx(De,{children:r.jsxs(w,{element:r.jsx(It,{}),children:[r.jsx(w,{index:!0,element:E(r.jsx(Ut,{}))}),r.jsx(w,{path:"providers",element:E(r.jsx(Kt,{}))}),r.jsx(w,{path:"keys",element:E(r.jsx(Mt,{}))}),r.jsx(w,{path:"users",element:E(r.jsx(Qt,{}))}),r.jsx(w,{path:"budgets",element:E(r.jsx(Dt,{}))}),r.jsx(w,{path:"activity",element:E(r.jsx(qt,{}))}),r.jsx(w,{path:"usage",element:E(r.jsx(zt,{}))}),r.jsx(w,{path:"models",element:E(r.jsx(Ft,{}))}),r.jsx(w,{path:"aliases",element:E(r.jsx(Rt,{}))}),r.jsx(w,{path:"tools",element:E(r.jsx($t,{}))}),r.jsx(w,{path:"settings",element:E(r.jsx(Bt,{}))}),r.jsx(w,{path:"docs",element:E(r.jsx(Ot,{}))}),r.jsx(w,{path:"*",element:r.jsx(Oe,{to:"/",replace:!0})})]})})}):r.jsx(At,{})}function Wt({children:e}){const[t]=i.useState(()=>new Le({defaultOptions:{queries:{refetchOnWindowFocus:!1,retry:(n,s)=>s instanceof _&&(s.status===401||s.status===403)?!1:n<2}}}));return r.jsx(Ie,{client:t,children:r.jsx(He,{children:e})})}const ke=document.getElementById("root");if(!ke)throw new Error("Root element #root not found");Be.createRoot(ke).render(r.jsx(i.StrictMode,{children:r.jsx(Wt,{children:r.jsx(Vt,{})})}));export{ir as $,Wr as A,wr as B,rn as C,vt as D,yt as E,nn as F,Hr as G,rt as H,gt as I,Vr as J,er as K,nr as L,Yr as M,Gr as N,Zr as O,en as P,Qr as Q,tn as R,Xr as S,ht as T,xt as U,ar as V,lr as W,ur as X,nt as Y,or as Z,sr as _,Pr as a,rr as a0,tr as a1,dr as a2,Sr as a3,kr as a4,Er as a5,vr as a6,cr as a7,yr as a8,gr as a9,pr as aa,Jr as ab,Fr as ac,Or as ad,Ur as b,Kr as c,zr as d,Br as e,$r as f,sn as g,Zt as h,fr as i,xr as j,hr as k,Lr as l,Ar as m,qr as n,Rr as o,Mr as p,Ir as q,Cr as r,_r as s,Tr as t,Dr as u,Nr as v,Xt as w,br as x,mr as y,jr as z}; +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ActivityPage-CV-nynWl.js","assets/tanstack-query-1t81HyiD.js","assets/react-dgEcD0HR.js","assets/FilterChips-DZjxf-ot.js","assets/heroui-BI50yK5B.js","assets/recharts-C4kRDmvS.js","assets/tableSelection-9hV37uhu.js","assets/ConfirmDialog-D_mZT4k-.js","assets/DataTable-Bmn_eYSV.js","assets/TablePagination-Chra1w0V.js","assets/AliasesPage-wZMHXIpE.js","assets/Field-Dwp6u3t8.js","assets/BudgetsPage-p9qxuU3G.js","assets/DocsPage-D7XUEYdI.js","assets/KeysPage-DZwI8ovn.js","assets/ModelScopeControl-DY7OwwJM.js","assets/ModelsPage-CAoQKgS_.js","assets/OverviewPage-B4Niis7e.js","assets/charts-DIsd9m--.js","assets/ProvidersPage-BX7hxsKz.js","assets/SettingsPage-0IuzwARi.js","assets/ToolsGuardrailsPage-KUSgM6cX.js","assets/UsagePage-M0prV-lU.js","assets/UsersPage-DPrtdYVu.js"])))=>i.map(i=>d[i]); +var _e=Object.defineProperty;var Te=(e,t,n)=>t in e?_e(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var ie=(e,t,n)=>Te(e,typeof t!="symbol"?t+"":t,n);import{u as v,j as r,a as p,b as h,k as Y,Q as Le,c as Ie}from"./tanstack-query-1t81HyiD.js";import{d as Ae,r as i,N as H,O as qe,H as Re,e as De,f as w,h as Oe}from"./react-dgEcD0HR.js";import{B as C,C as M,L as me,I as fe,a as Me,b as Fe,d as D,c as N,T as Ue,e as Ke}from"./heroui-BI50yK5B.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))s(o);new MutationObserver(o=>{for(const a of o)if(a.type==="childList")for(const f of a.addedNodes)f.tagName==="LINK"&&f.rel==="modulepreload"&&s(f)}).observe(document,{childList:!0,subtree:!0});function n(o){const a={};return o.integrity&&(a.integrity=o.integrity),o.referrerPolicy&&(a.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?a.credentials="include":o.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function s(o){if(o.ep)return;o.ep=!0;const a=n(o);fetch(o.href,a)}})();var Be=Ae();const $e="modulepreload",ze=function(e){return"/"+e},oe={},P=function(t,n,s){let o=Promise.resolve();if(n&&n.length>0){let f=function(u){return Promise.all(u.map(b=>Promise.resolve(b).then(x=>({status:"fulfilled",value:x}),x=>({status:"rejected",reason:x}))))};document.getElementsByTagName("link");const m=document.querySelector("meta[property=csp-nonce]"),y=(m==null?void 0:m.nonce)||(m==null?void 0:m.getAttribute("nonce"));o=f(n.map(u=>{if(u=ze(u),u in oe)return;oe[u]=!0;const b=u.endsWith(".css"),x=b?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${u}"]${x}`))return;const d=document.createElement("link");if(d.rel=b?"stylesheet":$e,b||(d.as="script"),d.crossOrigin="",d.href=u,y&&d.setAttribute("nonce",y),document.head.appendChild(d),b)return new Promise((L,q)=>{d.addEventListener("load",L),d.addEventListener("error",()=>q(new Error(`Unable to preload CSS for ${u}`)))})}))}function a(f){const m=new Event("vite:preloadError",{cancelable:!0});if(m.payload=f,window.dispatchEvent(m),!m.defaultPrevented)throw f}return o.then(f=>{for(const m of f||[])m.status==="rejected"&&a(m.reason);return t().catch(a)})};class _ extends Error{constructor(n,s){super(s);ie(this,"status");this.name="ApiError",this.status=n}}let F=null;function le(e){F=e}async function G(e){try{const t=await e.json();if(typeof t.detail=="string")return t.detail;if(t.detail!=null)return JSON.stringify(t.detail)}catch{}return e.statusText||`Request failed (${e.status})`}async function Qe(e){let t;try{t=await fetch("/v1/auth/session",{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({master_key:e})})}catch{throw new _(0,"Network error: could not reach the gateway.")}if(t.status===401||t.status===403)return!1;if(!t.ok)throw new _(t.status,await G(t));return!0}async function Ve(){try{await fetch("/v1/auth/session",{method:"DELETE"})}catch{}}async function l(e,t={}){const n=new Headers(t.headers);n.set("Accept","application/json"),t.body!=null&&!n.has("Content-Type")&&n.set("Content-Type","application/json");let s;try{s=await fetch(e,{...t,headers:n})}catch{throw new _(0,"Network error: could not reach the gateway.")}if(s.status===401||s.status===403)throw F==null||F(),new _(s.status,await G(s));if(!s.ok)throw new _(s.status,await G(s));if(s.status!==204)return await s.json()}const J="otari.dashboard.hasSession",he=i.createContext(null);function We(){try{return window.localStorage.getItem(J)==="1"}catch{return!1}}function He({children:e}){const t=v(),[n,s]=i.useState(We),o=i.useCallback(()=>{Ve(),s(!1),t.clear();try{window.localStorage.removeItem(J)}catch{}},[t]),a=i.useCallback(()=>{t.clear(),s(!0);try{window.localStorage.setItem(J,"1")}catch{}},[t]);i.useEffect(()=>(le(o),()=>le(null)),[o]);const f=i.useMemo(()=>({isAuthenticated:n,login:a,logout:o}),[n,a,o]);return r.jsx(he.Provider,{value:f,children:e})}function X(){const e=i.useContext(he);if(!e)throw new Error("useAuth must be used within an AuthProvider");return e}function Ge(e){return e instanceof _&&e.status===0}function Je(){const e=v(),[t,n]=i.useState(!1);return i.useEffect(()=>{const s=e.getQueryCache(),o=()=>s.getAll().some(a=>a.state.status==="error"&&Ge(a.state.error));return n(o()),s.subscribe(()=>n(o()))},[e]),t}function Ye(){return Je()?r.jsxs("div",{role:"alert","aria-live":"assertive",className:"fixed right-4 bottom-4 z-50 flex max-w-sm items-start gap-2.5 rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700 shadow-lg",children:[r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2","aria-hidden":!0,className:"mt-0.5 h-5 w-5 shrink-0",children:[r.jsx("path",{d:"M12 9v4M12 17h.01",strokeLinecap:"round",strokeLinejoin:"round"}),r.jsx("path",{d:"M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0z",strokeLinejoin:"round"})]}),r.jsxs("span",{children:[r.jsx("strong",{className:"font-semibold",children:"Can’t reach the gateway."})," The backend isn’t responding; data won’t load or save until the connection is restored."]})]}):null}const T="models",K="pricing",xe="settings",ve="tool-settings",Z="aliases",ee="discoverable",te="providers",re="provider-health",ye="stored-providers",Xe="model-metadata",Ze="build",I="keys",A="budgets",ge="users",O="usage",et=6e4,ce=60*6e4;function Xt(){return p({queryKey:[T],queryFn:()=>l("/v1/models"),staleTime:6e4})}function tt(){return p({queryKey:[Ze],queryFn:()=>l("/dashboard-build.json"),refetchInterval:et,refetchOnWindowFocus:!0,staleTime:0,retry:!1})}function Zt(){return p({queryKey:[ee],queryFn:()=>l("/v1/models/discoverable"),staleTime:5*6e4})}function er(){return p({queryKey:[te],queryFn:()=>l("/v1/providers"),staleTime:5*6e4})}function tr(){return p({queryKey:["provider-catalog"],queryFn:()=>l("/v1/providers/catalog"),staleTime:1/0})}function rr(e){return p({queryKey:["provider-catalog",e],queryFn:()=>l(`/v1/providers/catalog/${encodeURIComponent(e)}`),enabled:e!=="",staleTime:1/0})}function nr(){return p({queryKey:[re],queryFn:()=>l("/v1/providers/health"),staleTime:ce,refetchInterval:ce})}function sr(){const e=v();return h({mutationFn:()=>l("/v1/providers/health?refresh=true"),onSuccess:t=>e.setQueryData([re],t)})}function ar(){return p({queryKey:[ye],queryFn:()=>l("/v1/provider-credentials"),staleTime:6e4})}function B(e){e.invalidateQueries({queryKey:[ye]}),e.invalidateQueries({queryKey:[te]}),e.invalidateQueries({queryKey:[T]}),e.invalidateQueries({queryKey:[ee]}),e.invalidateQueries({queryKey:[re]})}function ir(){const e=v();return h({mutationFn:t=>l("/v1/provider-credentials",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>B(e)})}function or(){const e=v();return h({mutationFn:({instance:t,body:n})=>l(`/v1/provider-credentials/${encodeURIComponent(t)}`,{method:"PATCH",body:JSON.stringify(n)}),onSuccess:()=>B(e)})}function lr(){const e=v();return h({mutationFn:t=>l(`/v1/provider-credentials/${encodeURIComponent(t)}`,{method:"DELETE"}),onSuccess:()=>B(e)})}function cr(){const e=v();return h({mutationFn:()=>l("/v1/provider-credentials/reencrypt",{method:"POST"}),onSuccess:()=>B(e)})}function ur(){return h({mutationFn:e=>l(`/v1/provider-credentials/${encodeURIComponent(e)}/test`,{method:"POST"})})}function dr(){return h({mutationFn:e=>l("/v1/provider-credentials/test",{method:"POST",body:JSON.stringify(e)})})}function mr(){return p({queryKey:[Xe],queryFn:()=>l("/v1/models/metadata"),staleTime:10*6e4})}function fr(){return p({queryKey:[Z],queryFn:()=>l("/v1/aliases"),staleTime:6e4})}function hr(){const e=v();return h({mutationFn:t=>l("/v1/aliases",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>{e.invalidateQueries({queryKey:[Z]}),e.invalidateQueries({queryKey:[T]})}})}function xr(){const e=v();return h({mutationFn:t=>l(`/v1/aliases/${encodeURIComponent(t)}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:[Z]}),e.invalidateQueries({queryKey:[T]})}})}function rt(){return p({queryKey:[xe],queryFn:()=>l("/v1/settings"),staleTime:6e4})}function nt(){const e=v();return h({mutationFn:t=>l("/v1/settings",{method:"PATCH",body:JSON.stringify(t)}),onSuccess:t=>{e.setQueryData([xe],t),e.invalidateQueries({queryKey:[T]}),e.invalidateQueries({queryKey:[ee]})}})}function vr(){return h({mutationFn:()=>l("/v1/settings/master-key/rotate",{method:"POST"})})}function yr(){return p({queryKey:[ve],queryFn:()=>l("/v1/tool-settings"),staleTime:6e4})}function gr(){const e=v();return h({mutationFn:t=>l("/v1/tool-settings",{method:"PATCH",body:JSON.stringify(t)}),onSuccess:t=>{e.setQueryData([ve],t)}})}function pr(){return h({mutationFn:({service:e,url:t})=>l(`/v1/tool-settings/${encodeURIComponent(e)}/test`,{method:"POST",body:JSON.stringify({url:t})})})}const $=1e3,st=100;async function at(){const e=[];for(let t=0;tl("/v1/pricing",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>{e.invalidateQueries({queryKey:[K]}),e.invalidateQueries({queryKey:[T]})}})}function wr(){const e=v();return h({mutationFn:t=>l(`/v1/pricing/${encodeURIComponent(t)}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:[K]}),e.invalidateQueries({queryKey:[T]})}})}function Sr(){return h({mutationFn:()=>l("/v1/pricing/refresh",{method:"POST"})})}function kr(){const e=v();return h({mutationFn:()=>l("/v1/pricing/refresh/confirm",{method:"POST"}),onSuccess:()=>{e.invalidateQueries({queryKey:[K]}),e.invalidateQueries({queryKey:[T]}),e.invalidateQueries({queryKey:[te]})}})}function Er(){return h({mutationFn:()=>l("/v1/pricing/refresh/reject",{method:"POST"})})}const z=1e3,it=100;async function ot(){const e=[];for(let t=0;tl("/v1/keys",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>void e.invalidateQueries({queryKey:[I]})})}function Cr(){const e=v();return h({mutationFn:({id:t,body:n})=>l(`/v1/keys/${encodeURIComponent(t)}`,{method:"PATCH",body:JSON.stringify(n)}),onSuccess:()=>void e.invalidateQueries({queryKey:[I]})})}function _r(){const e=v();return h({mutationFn:t=>l(`/v1/keys/${encodeURIComponent(t)}/rotate`,{method:"POST"}),onSuccess:()=>void e.invalidateQueries({queryKey:[I]})})}function Tr(){const e=v();return h({mutationFn:t=>l(`/v1/keys/${encodeURIComponent(t)}`,{method:"DELETE"}),onSuccess:()=>void e.invalidateQueries({queryKey:[I]})})}const Q=1e3,lt=100;async function ct(){const e=[];for(let t=0;tl(`/v1/budgets/${encodeURIComponent(e)}/reset-logs`),enabled:e!==null,staleTime:6e4})}function Ar(){const e=v();return h({mutationFn:t=>l("/v1/budgets",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>void e.invalidateQueries({queryKey:[A]})})}function qr(){const e=v();return h({mutationFn:({id:t,body:n})=>l(`/v1/budgets/${encodeURIComponent(t)}`,{method:"PATCH",body:JSON.stringify(n)}),onSuccess:()=>void e.invalidateQueries({queryKey:[A]})})}function Rr(){const e=v();return h({mutationFn:t=>l(`/v1/budgets/${encodeURIComponent(t)}`,{method:"DELETE"}),onSuccess:()=>void e.invalidateQueries({queryKey:[A]})})}const V=1e3,ut=100;async function dt(){const e=[];for(let t=0;tl("/v1/users",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>ne(e)})}function Mr(){const e=v();return h({mutationFn:({id:t,body:n})=>l(`/v1/users/${encodeURIComponent(t)}`,{method:"PATCH",body:JSON.stringify(n)}),onSuccess:()=>ne(e)})}function Fr(){const e=v();return h({mutationFn:t=>l(`/v1/users/${encodeURIComponent(t)}`,{method:"DELETE"}),onSuccess:()=>{ne(e),e.invalidateQueries({queryKey:[I]})}})}function se(e){const t=new URLSearchParams;return e.start_date&&t.set("start_date",e.start_date),e.end_date&&t.set("end_date",e.end_date),e.status&&t.set("status",e.status),e.model&&t.set("model",e.model),e.endpoint&&t.set("endpoint",e.endpoint),e.user_id&&t.set("user_id",e.user_id),e.api_key_id&&t.set("api_key_id",e.api_key_id),e.source&&t.set("source",e.source),e.priced!==void 0&&t.set("priced",String(e.priced)),e.counts_toward_budget!==void 0&&t.set("counts_toward_budget",String(e.counts_toward_budget)),t}function Ur(e,t,n){return p({queryKey:[O,"list",e,t,n],queryFn:()=>{const s=se(e);return s.set("skip",String(t*n)),s.set("limit",String(n)),l(`/v1/usage?${s.toString()}`)},placeholderData:Y,staleTime:1e4})}function Kr(e,t=!0){return p({queryKey:[O,"count",e],queryFn:()=>l(`/v1/usage/count?${se(e).toString()}`),enabled:t,placeholderData:Y,staleTime:1e4})}function Br(){const e=v();return h({mutationFn:t=>l("/v1/usage",{method:"DELETE",body:JSON.stringify(t)}),onSuccess:()=>{e.invalidateQueries({queryKey:[O]})}})}function $r(){const e=v();return h({mutationFn:t=>l("/v1/usage/set-price",{method:"POST",body:JSON.stringify(t)}),onSuccess:()=>{e.invalidateQueries({queryKey:[O]})}})}function zr(e,t,n=!0){return p({queryKey:[O,"summary",e,t],queryFn:()=>{const s=se(e);return s.set("bucket",t),l(`/v1/usage/summary?${s.toString()}`)},enabled:n,placeholderData:Y,staleTime:3e4})}function Qr(e){return e==null?"0":new Intl.NumberFormat("en-US").format(e)}function Vr(e){if(e==null)return"$0.00";const t=e!==0&&Math.abs(e)<.01?4:2;return new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",minimumFractionDigits:2,maximumFractionDigits:t}).format(e)}function Wr(e){if(e==null)return"—";if(e>=1e6){const t=e/1e6;return`${Number.isInteger(t)?t:t.toFixed(1)}M`}if(e>=1e3){const t=Math.round(e/1e3);return t>=1e3?"1M":`${t}K`}return String(e)}const mt=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function Hr(e){if(!e)return"—";const t=/^(\d{4})-(\d{2})/.exec(e);if(!t)return e;const n=Number(t[2])-1;return n<0||n>11?t[1]:`${mt[n]} ${t[1]}`}const ft=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",maximumFractionDigits:2});function Gr(e){return ft.format(e)}function Jr(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function ht(e){return`${(e*100).toFixed(1)}%`}function Yr(e,t){return t===void 0||t===0?null:(e-t)/t}function xt(e,t=Date.now()){if(!e)return"never";const n=new Date(e);if(Number.isNaN(n.getTime()))return e;const s=Math.round((t-n.getTime())/1e3),o=s<0,a=Math.abs(s),f=[["second",60],["minute",60],["hour",24],["day",30],["month",12],["year",Number.POSITIVE_INFINITY]];let m=a,y="second";for(const[b,x]of f){if(y=b,m0?"▲":e<0?"▼":"•";return r.jsxs("span",{className:"text-[var(--otari-muted)]",children:[t," ",ht(Math.abs(e))," vs prev"]})}function vt(e){return e instanceof _||e instanceof Error?e.message:"Something went wrong."}function yt({error:e}){return e?r.jsx("div",{role:"alert",className:"rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700",children:vt(e)}):null}function gt({tone:e="info",children:t}){const n=e==="warning"?"border-amber-200 bg-amber-50 text-amber-800":"border-[var(--otari-brand)] bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]";return r.jsx("div",{className:`rounded-lg border px-4 py-3 text-sm ${n}`,children:t})}function en({title:e,description:t,action:n}){return r.jsxs("div",{className:"flex flex-col gap-3",children:[r.jsxs("div",{children:[r.jsx("h1",{className:"text-xl font-semibold text-[var(--otari-ink)]",children:e}),t?r.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:t}):null]}),n?r.jsx("div",{className:"flex flex-wrap gap-2",children:n}):null]})}function pt(e){const[t,n]=i.useState(()=>Date.now());return i.useEffect(()=>{let s;const o=()=>{s===void 0&&(s=setInterval(()=>n(Date.now()),e))},a=()=>{s!==void 0&&(clearInterval(s),s=void 0)},f=()=>{n(Date.now()),document.visibilityState==="visible"?o():a()};return f(),document.addEventListener("visibilitychange",f),()=>{a(),document.removeEventListener("visibilitychange",f)}},[e]),t}function tn({onRefresh:e,isFetching:t=!1,updatedAt:n,label:s="Refresh"}){const o=pt(15e3),a=n?xt(new Date(n).toISOString(),o):null;return r.jsxs("span",{className:"inline-flex items-center gap-2",children:[a?r.jsxs("span",{className:"text-xs text-[var(--otari-muted)]",children:["Updated ",a]}):null,r.jsx(C,{variant:"outline",size:"sm",isIconOnly:!0,isDisabled:t,onPress:e,"aria-label":s,children:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:`h-4 w-4 ${t?"animate-spin":""}`,"aria-hidden":"true",children:[r.jsx("path",{d:"M20 11a8 8 0 1 0-.5 4",strokeLinecap:"round",strokeLinejoin:"round"}),r.jsx("path",{d:"M20 4v5h-5",strokeLinecap:"round",strokeLinejoin:"round"})]})})]})}function rn({children:e,confirmLabel:t,onConfirm:n,isPending:s}){const[o,a]=i.useState(!1);return o?r.jsxs("span",{className:"inline-flex items-center gap-1",children:[r.jsx(C,{size:"sm",variant:"danger",isDisabled:s,onPress:n,children:t}),r.jsx(C,{size:"sm",variant:"ghost",isDisabled:s,onPress:()=>a(!1),children:"Cancel"})]}):r.jsx(C,{size:"sm",variant:"danger-soft",onPress:()=>a(!0),children:e})}const bt="rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-3 py-2 text-sm text-[var(--otari-ink)] focus:border-[var(--otari-brand)] focus:outline-none";function nn({id:e,label:t,ariaLabel:n,value:s,onChange:o,options:a,children:f,disabled:m}){const y=i.useId(),u=e??(t?y:void 0),b=r.jsx("select",{id:u,"aria-label":t?void 0:n,value:s,disabled:m,onChange:x=>o(x.target.value),className:bt,children:a?a.map(x=>r.jsx("option",{value:x.value,children:x.label},x.value)):f});return t?r.jsxs("div",{className:"flex flex-col gap-1",children:[r.jsx("label",{htmlFor:u,className:"text-xs font-medium text-[var(--otari-muted)]",children:t}),b]}):b}function sn({label:e,value:t,onChange:n,options:s,placeholder:o,maxVisible:a=50,allowsCustom:f=!1}){const m=d=>{var L;return((L=s.find(q=>q.value===d))==null?void 0:L.label)??d},[y,u]=i.useState(()=>m(t));i.useEffect(()=>{u(m(t))},[t]);const b=y.trim().toLowerCase(),x=s.filter(d=>!b||d.value.toLowerCase().includes(b)||d.label.toLowerCase().includes(b)).slice(0,a);return r.jsxs(M.Root,{allowsEmptyCollection:!0,allowsCustomValue:f,menuTrigger:"focus",inputValue:y,onInputChange:d=>{u(d),f?n(d.trim()):d.trim()===""&&n("")},onSelectionChange:d=>{d!=null&&n(String(d))},className:"flex flex-col gap-1",children:[r.jsx(me,{className:"text-xs font-medium text-[var(--otari-muted)]",children:e}),r.jsxs(M.InputGroup,{children:[r.jsx(fe,{placeholder:o,autoComplete:"off",onFocus:d=>d.currentTarget.select()}),r.jsx(M.Trigger,{})]}),r.jsx(M.Popover,{children:r.jsx(Me,{items:x,className:"max-h-72 overflow-auto",children:d=>r.jsx(Fe,{id:d.value,textValue:d.label,children:d.label})})})]})}function jt(){var a;const e=rt(),t=nt(),[n,s]=i.useState(!1);return!(((a=e.data)==null?void 0:a.require_pricing)===!0&&e.data.default_pricing===!1)||n?null:r.jsx("div",{className:"shrink-0 px-6 pt-3",children:r.jsx(gt,{tone:"warning",children:r.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[r.jsxs("span",{children:["Requests are rejected until pricing is set (",r.jsx("code",{children:"require_pricing"})," is on). Enable default pricing to meter new models with public rates right away."]}),r.jsxs("span",{className:"flex items-center gap-2",children:[r.jsx(C,{size:"sm",variant:"primary",isDisabled:t.isPending,onPress:()=>t.mutate({default_pricing:!0}),children:t.isPending?"Enabling…":"Enable default pricing"}),r.jsx(C,{size:"sm",variant:"ghost",onPress:()=>s(!0),children:"Dismiss"})]})]})})})}function wt(){const{data:e}=tt(),t=i.useRef(null);return e&&t.current===null&&(t.current=e.build),e!=null&&t.current!=null&&e.build!==t.current}function St(){const e=wt(),[t,n]=i.useState(!1);return!e||t?null:r.jsx("div",{className:"pointer-events-none absolute inset-x-0 top-0 z-50 flex justify-center",children:r.jsxs("div",{role:"status",className:"pointer-events-auto mt-1.5 flex items-center gap-3 rounded-full border border-[var(--otari-brand)] bg-[var(--otari-brand-tint)] py-1.5 pr-1.5 pl-4 text-sm text-[var(--otari-brand-dark)] shadow-md",children:[r.jsxs("span",{children:[r.jsx("strong",{className:"font-semibold",children:"An update is available."})," Reloading keeps you signed in."]}),r.jsx(C,{size:"sm",variant:"primary",onPress:()=>window.location.reload(),children:"Update now"}),r.jsx(C,{size:"sm",variant:"ghost",onPress:()=>n(!0),children:"Later"})]})})}const pe=200,be=480,W=240,kt=60,je="otari.dashboard.sidebarWidth",we="otari.dashboard.sidebarCollapsed",de=16,Se="(max-width: 767px)",U=e=>Math.min(be,Math.max(pe,e));function Et(){return typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia(Se).matches}const Pt='a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"])';function Nt(e){return e?Array.from(e.querySelectorAll(Pt)).filter(t=>t.offsetParent!==null||t===document.activeElement):[]}function Ct(){if(typeof window>"u")return W;try{const e=window.localStorage.getItem(je),t=e?Number.parseInt(e,10):Number.NaN;return Number.isNaN(t)?W:U(t)}catch{return W}}function _t(){if(typeof window>"u")return!1;try{return window.localStorage.getItem(we)==="1"}catch{return!1}}const Tt=[{key:"home"},{key:"observability",label:"Observability"},{key:"catalog",label:"Catalog"},{key:"access",label:"Access"},{key:"system"}],Lt=[{to:"/",section:"home",label:"Overview",end:!0,icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("rect",{x:"3.5",y:"3.5",width:"7",height:"7",rx:"1.5",strokeLinejoin:"round"}),r.jsx("rect",{x:"13.5",y:"3.5",width:"7",height:"7",rx:"1.5",strokeLinejoin:"round"}),r.jsx("rect",{x:"3.5",y:"13.5",width:"7",height:"7",rx:"1.5",strokeLinejoin:"round"}),r.jsx("rect",{x:"13.5",y:"13.5",width:"7",height:"7",rx:"1.5",strokeLinejoin:"round"})]})},{to:"/activity",section:"observability",label:"Activity",icon:r.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:r.jsx("path",{d:"M3 12h4l2.5-6 4 12 2.5-6H21",strokeLinecap:"round",strokeLinejoin:"round"})})},{to:"/usage",section:"observability",label:"Usage",icon:r.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:r.jsx("path",{d:"M4 20V10M10 20V4M16 20v-7M22 20H2",strokeLinecap:"round",strokeLinejoin:"round"})})},{to:"/providers",section:"catalog",label:"Providers",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("rect",{x:"3.5",y:"4.5",width:"17",height:"6",rx:"1.5",strokeLinejoin:"round"}),r.jsx("rect",{x:"3.5",y:"13.5",width:"17",height:"6",rx:"1.5",strokeLinejoin:"round"}),r.jsx("path",{d:"M7 7.5h.01M7 16.5h.01",strokeLinecap:"round",strokeLinejoin:"round"})]})},{to:"/users",section:"access",label:"Users",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("circle",{cx:"9",cy:"8",r:"3.2",strokeLinejoin:"round"}),r.jsx("path",{d:"M3.5 19a5.5 5.5 0 0 1 11 0",strokeLinecap:"round",strokeLinejoin:"round"}),r.jsx("path",{d:"M16 5.2a3.2 3.2 0 0 1 0 5.6M17.5 19a5.5 5.5 0 0 0-3-4.9",strokeLinecap:"round",strokeLinejoin:"round"})]})},{to:"/keys",section:"access",label:"API keys",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("circle",{cx:"7.5",cy:"15.5",r:"3.5"}),r.jsx("path",{d:"M10 13l7-7M14 5l3 3M16.5 7.5l2-2",strokeLinecap:"round",strokeLinejoin:"round"})]})},{to:"/budgets",section:"access",label:"Budgets",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("path",{d:"M3 7.5A1.5 1.5 0 0 1 4.5 6H18a1.5 1.5 0 0 1 1.5 1.5V9",strokeLinejoin:"round"}),r.jsx("rect",{x:"3",y:"7.5",width:"18",height:"12",rx:"1.5",strokeLinejoin:"round"}),r.jsx("path",{d:"M16 13.5h.01",strokeLinecap:"round",strokeLinejoin:"round"}),r.jsx("path",{d:"M21 12v3h-3.5a1.5 1.5 0 0 1 0-3H21z",strokeLinejoin:"round"})]})},{to:"/models",section:"catalog",label:"Models",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("path",{d:"M12 3l8 4.5v9L12 21l-8-4.5v-9L12 3z",strokeLinejoin:"round"}),r.jsx("path",{d:"M12 12l8-4.5M12 12v9M12 12L4 7.5",strokeLinejoin:"round"})]})},{to:"/aliases",section:"catalog",label:"Aliases",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("path",{d:"M20.6 13.4L13.4 20.6a2 2 0 0 1-2.8 0l-7-7A2 2 0 0 1 3 12.2V5a2 2 0 0 1 2-2h7.2a2 2 0 0 1 1.4.6l7 7a2 2 0 0 1 0 2.8z",strokeLinejoin:"round"}),r.jsx("circle",{cx:"7.5",cy:"7.5",r:"1.5"})]})},{to:"/tools",section:"system",label:"Tools & Guardrails",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("path",{d:"M14.7 6.3a4 4 0 0 1 5 5l-8.4 8.4a2 2 0 0 1-2.8 0l-2.2-2.2a2 2 0 0 1 0-2.8z",strokeLinejoin:"round"}),r.jsx("path",{d:"M12 9 5 16",strokeLinecap:"round"})]})},{to:"/settings",section:"system",label:"Settings",icon:r.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("circle",{cx:"12",cy:"12",r:"3"}),r.jsx("path",{d:"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z",strokeLinejoin:"round"})]})}];function It(){const{logout:e}=X(),t=i.useRef(null),n=i.useRef(null),[s,o]=i.useState(Ct),[a,f]=i.useState(_t),[m,y]=i.useState(!1),[u,b]=i.useState(Et),[x,d]=i.useState(!1);i.useEffect(()=>{if(typeof window>"u"||typeof window.matchMedia!="function")return;const c=window.matchMedia(Se),g=j=>{b(j.matches),j.matches||d(!1)};return typeof c.addEventListener=="function"?(c.addEventListener("change",g),()=>c.removeEventListener("change",g)):(c.addListener(g),()=>c.removeListener(g))},[]),i.useEffect(()=>{if(!x)return;const c=g=>{g.key==="Escape"&&d(!1)};return window.addEventListener("keydown",c),()=>window.removeEventListener("keydown",c)},[x]),i.useEffect(()=>{var c,g,j;u&&(x?(c=t.current)==null||c.focus():(g=t.current)!=null&&g.contains(document.activeElement)&&((j=n.current)==null||j.focus()))},[u,x]);const L=i.useCallback(c=>{if(c.key!=="Tab")return;const g=Nt(t.current);if(g.length===0)return;const j=g[0],k=g[g.length-1],R=document.activeElement;c.shiftKey&&(R===j||R===t.current)?(c.preventDefault(),k.focus()):!c.shiftKey&&R===k&&(c.preventDefault(),j.focus())},[]);i.useEffect(()=>{const c=window.setTimeout(()=>{try{window.localStorage.setItem(je,String(Math.round(s)))}catch{}},200);return()=>window.clearTimeout(c)},[s]),i.useEffect(()=>{try{window.localStorage.setItem(we,a?"1":"0")}catch{}},[a]);const q=i.useCallback(c=>{c.preventDefault(),c.currentTarget.setPointerCapture(c.pointerId),y(!0)},[]),Ee=i.useCallback(c=>{var j;if(!c.currentTarget.hasPointerCapture(c.pointerId))return;const g=((j=t.current)==null?void 0:j.getBoundingClientRect().left)??0;o(U(c.clientX-g))},[]),Pe=i.useCallback(c=>{c.currentTarget.hasPointerCapture(c.pointerId)&&c.currentTarget.releasePointerCapture(c.pointerId),y(!1)},[]),Ne=i.useCallback(c=>{c.key==="ArrowLeft"?(c.preventDefault(),o(g=>U(g-de))):c.key==="ArrowRight"&&(c.preventDefault(),o(g=>U(g+de)))},[]),Ce=a?kt:s,S=u?!1:a,ae=u&&x?!0:void 0;return r.jsxs("div",{className:N("relative flex h-full flex-col overflow-hidden",m&&"cursor-col-resize select-none"),children:[r.jsxs("header",{inert:ae,className:"flex shrink-0 items-center justify-between border-b border-[var(--otari-line)] bg-[var(--otari-surface)] px-5 py-3",children:[r.jsxs("div",{className:"flex items-center gap-2.5",children:[r.jsx("button",{type:"button",ref:n,onClick:()=>d(c=>!c),"aria-label":x?"Close navigation":"Open navigation","aria-expanded":x,"aria-controls":"app-sidebar",className:"-ml-1 flex h-8 w-8 items-center justify-center rounded-lg text-[var(--otari-muted)] transition-colors hover:bg-[var(--otari-bg)] hover:text-[var(--otari-ink)] md:hidden",children:r.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5",children:r.jsx("path",{d:"M4 6h16M4 12h16M4 18h16",strokeLinecap:"round",strokeLinejoin:"round"})})}),r.jsx("img",{src:"/favicon.svg",alt:"",className:"h-7 w-7 shrink-0"}),r.jsx("span",{className:"text-base font-semibold text-[var(--otari-ink)]",children:"Otari"})]}),r.jsx(C,{size:"sm",variant:"outline",onPress:e,"aria-label":"Sign out",children:"Sign out"})]}),r.jsx(St,{}),r.jsx(Ye,{}),r.jsx(jt,{}),r.jsxs("div",{className:"flex min-h-0 flex-1",children:[u&&x?r.jsx("div",{"aria-hidden":"true",onClick:()=>d(!1),className:"fixed inset-0 z-30 bg-black/40 md:hidden"}):null,r.jsxs("aside",{ref:t,id:"app-sidebar",role:u?"dialog":void 0,"aria-modal":u&&x?!0:void 0,"aria-label":u?"Navigation":void 0,tabIndex:u?-1:void 0,inert:u&&!x?!0:void 0,onKeyDown:u&&x?L:void 0,style:u?void 0:{width:Ce},className:N("flex flex-col border-r border-[var(--otari-line)] bg-[var(--otari-surface)] focus:outline-none",u?N("fixed inset-y-0 left-0 z-40 w-[17rem] shadow-xl transition-transform duration-200",x?"translate-x-0":"-translate-x-full"):N("relative shrink-0",!m&&"transition-[width] duration-150")),children:[r.jsx("button",{type:"button",onClick:()=>f(c=>!c),"aria-label":a?"Expand sidebar":"Collapse sidebar","aria-pressed":a,title:a?"Expand sidebar":"Collapse sidebar",className:"absolute -right-3 top-4 z-30 hidden h-6 w-6 items-center justify-center rounded-full border border-[var(--otari-line)] bg-[var(--otari-surface)] text-[var(--otari-muted)] shadow-sm transition-colors hover:border-[var(--otari-brand)] hover:text-[var(--otari-brand-dark)] md:flex",children:r.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",className:N("h-3.5 w-3.5 transition-transform",a&&"rotate-180"),children:r.jsx("path",{d:"M15 6l-6 6 6 6",strokeLinecap:"round",strokeLinejoin:"round"})})}),r.jsx("nav",{className:N("flex flex-col py-4",S?"px-2":"px-3"),children:Tt.map((c,g)=>{const j=Lt.filter(k=>k.section===c.key);return j.length===0?null:r.jsxs("div",{className:g>0?"mt-4":void 0,children:[!S&&c.label?r.jsx("div",{className:"px-3 pb-1 text-[11px] font-semibold tracking-wider text-[var(--otari-muted)] uppercase",children:c.label}):null,g>0&&(S||!c.label)?r.jsx("div",{className:"mx-1 mb-2 border-t border-[var(--otari-line)]"}):null,r.jsx("div",{className:"flex flex-col gap-1",children:j.map(k=>r.jsxs(H,{to:k.to,end:k.end,onClick:()=>d(!1),"aria-label":S?k.label:void 0,title:S?k.label:void 0,className:({isActive:R})=>N("flex items-center rounded-lg py-2 text-sm font-medium transition-colors",S?"justify-center px-0":"gap-3 px-3",R?"bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]":"text-[var(--otari-muted)] hover:bg-[var(--otari-bg)] hover:text-[var(--otari-ink)]"),children:[k.icon,S?null:k.label]},k.to))})]},c.key)})}),r.jsxs("div",{className:"mt-auto flex flex-col gap-1 pb-3",children:[r.jsxs(H,{to:"/docs",onClick:()=>d(!1),"aria-label":S?"User guide":void 0,title:S?"User guide":void 0,className:({isActive:c})=>N("flex items-center rounded-lg py-2 text-sm font-medium transition-colors",S?"mx-2 justify-center px-0":"mx-3 gap-3 px-3",c?"bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]":"text-[var(--otari-muted)] hover:bg-[var(--otari-bg)] hover:text-[var(--otari-ink)]"),children:[r.jsxs("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[r.jsx("path",{d:"M12 6.5C10.5 5 8 4.5 4 4.5V18c4 0 6.5.5 8 2 1.5-1.5 4-2 8-2V4.5c-4 0-6.5.5-8 2z",strokeLinejoin:"round"}),r.jsx("path",{d:"M12 6.5V20",strokeLinecap:"round"})]}),S?null:"User guide"]}),r.jsxs("a",{href:"https://otari.ai",target:"_blank",rel:"noreferrer",title:"otari.ai — the hosted Otari gateway",className:N("flex items-center rounded-lg py-2 text-xs font-medium text-[var(--otari-muted)] transition-colors hover:bg-[var(--otari-bg)] hover:text-[var(--otari-brand-dark)]",S?"mx-2 justify-center px-0":"mx-3 gap-2 px-3"),children:[r.jsx("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-4 w-4 shrink-0",children:r.jsx("path",{d:"M18 10h-1.26A8 8 0 1 0 9 20h9a5 5 0 0 0 0-10z",strokeLinejoin:"round"})}),S?null:r.jsxs("span",{className:"flex-1",children:["otari.ai ",r.jsx("span",{"aria-hidden":!0,children:"↗"})]})]})]}),a||u?null:r.jsx("div",{role:"separator","aria-orientation":"vertical","aria-label":"Resize sidebar","aria-valuenow":Math.round(s),"aria-valuemin":pe,"aria-valuemax":be,tabIndex:0,onPointerDown:q,onPointerMove:Ee,onPointerUp:Pe,onKeyDown:Ne,className:N("absolute top-0 right-0 z-10 h-full w-1.5 cursor-col-resize touch-none transition-colors","hover:bg-[var(--otari-brand)] focus-visible:bg-[var(--otari-brand)] focus:outline-none",m?"bg-[var(--otari-brand)]":"bg-transparent")})]}),r.jsx("main",{inert:ae,className:"flex-1 overflow-y-auto",children:r.jsx("div",{className:"mx-auto flex max-w-[1800px] flex-col gap-6 px-4 py-5 md:px-6 md:py-6",children:r.jsx(qe,{})})})]})]})}function At(){const{login:e}=X(),[t,n]=i.useState(""),[s,o]=i.useState(null),[a,f]=i.useState(!1),m=async()=>{const y=t.trim();if(!(!y||a)){f(!0),o(null);try{await Qe(y)?e():o(new Error("Invalid master key."))}catch(u){o(u)}finally{f(!1)}}};return r.jsx("div",{className:"flex min-h-full items-center justify-center p-6",children:r.jsx(D,{className:"w-full max-w-md",children:r.jsxs(D.Content,{className:"flex flex-col gap-5 p-7",children:[r.jsxs("div",{className:"flex flex-col items-center gap-3 text-center",children:[r.jsx("img",{src:"/favicon.svg",alt:"Otari",className:"h-12 w-12"}),r.jsxs("div",{children:[r.jsx("h1",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:"Otari Dashboard"}),r.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:"Sign in with your master key to browse models, set pricing, and manage settings."})]})]}),r.jsxs("form",{className:"flex flex-col gap-4",onSubmit:y=>{y.preventDefault(),m()},children:[r.jsxs(Ue,{value:t,onChange:y=>{n(y),s&&o(null)},type:"password",isRequired:!0,className:"flex flex-col gap-1",children:[r.jsx(me,{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Master key"}),r.jsx(fe,{placeholder:"otari-mk-… or your master key",autoFocus:!0,autoComplete:"off"})]}),r.jsxs("details",{className:"text-xs text-[var(--otari-muted)]",children:[r.jsx("summary",{className:"cursor-pointer font-medium text-[var(--otari-brand-dark)]",children:"First run? Where to find your key"}),r.jsxs("p",{className:"mt-2 leading-relaxed",children:["If you did not set ",r.jsx("code",{children:"OTARI_MASTER_KEY"}),", Otari generated one and printed it to the server logs on startup. Look for the line ",r.jsx("code",{children:"Your master key:"})," (for example, run"," ",r.jsx("code",{children:"docker logs "}),") and paste it above."]})]}),r.jsx(yt,{error:s}),r.jsx(C,{type:"submit",variant:"primary",fullWidth:!0,isDisabled:!t.trim()||a,children:a?"Signing in…":"Sign in"})]}),r.jsx("p",{className:"text-center text-xs text-[var(--otari-muted)]",children:"The key is sent once to this gateway and exchanged for a session cookie; it is never stored in the browser."}),r.jsx("div",{className:"border-t border-[var(--otari-line)] pt-4 text-center",children:r.jsx(Ke,{href:"/welcome",className:"text-sm font-medium text-[var(--otari-brand-dark)]",children:"New to Otari? Open the welcome guide"})})]})})})}const qt=i.lazy(async()=>({default:(await P(async()=>{const{ActivityPage:e}=await import("./ActivityPage-CV-nynWl.js");return{ActivityPage:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]))).ActivityPage})),Rt=i.lazy(async()=>({default:(await P(async()=>{const{AliasesPage:e}=await import("./AliasesPage-wZMHXIpE.js");return{AliasesPage:e}},__vite__mapDeps([10,1,2,6,4,7,8,11]))).AliasesPage})),Dt=i.lazy(async()=>({default:(await P(async()=>{const{BudgetsPage:e}=await import("./BudgetsPage-p9qxuU3G.js");return{BudgetsPage:e}},__vite__mapDeps([12,1,2,6,4,7,8,11]))).BudgetsPage})),Ot=i.lazy(async()=>({default:(await P(async()=>{const{DocsPage:e}=await import("./DocsPage-D7XUEYdI.js");return{DocsPage:e}},__vite__mapDeps([13,1,2,4]))).DocsPage})),Mt=i.lazy(async()=>({default:(await P(async()=>{const{KeysPage:e}=await import("./KeysPage-DZwI8ovn.js");return{KeysPage:e}},__vite__mapDeps([14,1,2,6,4,7,8,11,15]))).KeysPage})),Ft=i.lazy(async()=>({default:(await P(async()=>{const{ModelsPage:e}=await import("./ModelsPage-CAoQKgS_.js");return{ModelsPage:e}},__vite__mapDeps([16,1,2,6,4,8,9]))).ModelsPage})),Ut=i.lazy(async()=>({default:(await P(async()=>{const{OverviewIndex:e}=await import("./OverviewPage-B4Niis7e.js");return{OverviewIndex:e}},__vite__mapDeps([17,1,2,18,5,4,8]))).OverviewIndex})),Kt=i.lazy(async()=>({default:(await P(async()=>{const{ProvidersPage:e}=await import("./ProvidersPage-BX7hxsKz.js");return{ProvidersPage:e}},__vite__mapDeps([19,1,2,11,4,8]))).ProvidersPage})),Bt=i.lazy(async()=>({default:(await P(async()=>{const{SettingsPage:e}=await import("./SettingsPage-0IuzwARi.js");return{SettingsPage:e}},__vite__mapDeps([20,1,2,4]))).SettingsPage})),$t=i.lazy(async()=>({default:(await P(async()=>{const{ToolsGuardrailsPage:e}=await import("./ToolsGuardrailsPage-KUSgM6cX.js");return{ToolsGuardrailsPage:e}},__vite__mapDeps([21,1,2,4]))).ToolsGuardrailsPage})),zt=i.lazy(async()=>({default:(await P(async()=>{const{UsagePage:e}=await import("./UsagePage-M0prV-lU.js");return{UsagePage:e}},__vite__mapDeps([22,1,2,3,4,5,6,18,7,8,9]))).UsagePage})),Qt=i.lazy(async()=>({default:(await P(async()=>{const{UsersPage:e}=await import("./UsersPage-DPrtdYVu.js");return{UsersPage:e}},__vite__mapDeps([23,1,2,6,4,7,8,11,15]))).UsersPage}));function E(e){return r.jsx(i.Suspense,{fallback:r.jsx("div",{role:"status",children:"Loading page…"}),children:e})}function Vt(){const{isAuthenticated:e}=X();return e?r.jsx(Re,{children:r.jsx(De,{children:r.jsxs(w,{element:r.jsx(It,{}),children:[r.jsx(w,{index:!0,element:E(r.jsx(Ut,{}))}),r.jsx(w,{path:"providers",element:E(r.jsx(Kt,{}))}),r.jsx(w,{path:"keys",element:E(r.jsx(Mt,{}))}),r.jsx(w,{path:"users",element:E(r.jsx(Qt,{}))}),r.jsx(w,{path:"budgets",element:E(r.jsx(Dt,{}))}),r.jsx(w,{path:"activity",element:E(r.jsx(qt,{}))}),r.jsx(w,{path:"usage",element:E(r.jsx(zt,{}))}),r.jsx(w,{path:"models",element:E(r.jsx(Ft,{}))}),r.jsx(w,{path:"aliases",element:E(r.jsx(Rt,{}))}),r.jsx(w,{path:"tools",element:E(r.jsx($t,{}))}),r.jsx(w,{path:"settings",element:E(r.jsx(Bt,{}))}),r.jsx(w,{path:"docs",element:E(r.jsx(Ot,{}))}),r.jsx(w,{path:"*",element:r.jsx(Oe,{to:"/",replace:!0})})]})})}):r.jsx(At,{})}function Wt({children:e}){const[t]=i.useState(()=>new Le({defaultOptions:{queries:{refetchOnWindowFocus:!1,retry:(n,s)=>s instanceof _&&(s.status===401||s.status===403)?!1:n<2}}}));return r.jsx(Ie,{client:t,children:r.jsx(He,{children:e})})}const ke=document.getElementById("root");if(!ke)throw new Error("Root element #root not found");Be.createRoot(ke).render(r.jsx(i.StrictMode,{children:r.jsx(Wt,{children:r.jsx(Vt,{})})}));export{ir as $,Wr as A,wr as B,rn as C,vt as D,yt as E,nn as F,Hr as G,rt as H,gt as I,Vr as J,er as K,nr as L,Yr as M,Gr as N,Zr as O,en as P,Qr as Q,tn as R,Xr as S,ht as T,xt as U,ar as V,lr as W,ur as X,nt as Y,or as Z,sr as _,Pr as a,rr as a0,tr as a1,dr as a2,Sr as a3,kr as a4,Er as a5,vr as a6,cr as a7,yr as a8,gr as a9,pr as aa,Jr as ab,Fr as ac,Or as ad,Ur as b,Kr as c,zr as d,Br as e,$r as f,sn as g,Zt as h,fr as i,xr as j,hr as k,Lr as l,Ar as m,qr as n,Rr as o,Mr as p,Ir as q,Cr as r,_r as s,Tr as t,Dr as u,Nr as v,Xt as w,br as x,mr as y,jr as z}; diff --git a/src/gateway/static/dashboard/index.html b/src/gateway/static/dashboard/index.html index b6c93f6f..1b038d00 100644 --- a/src/gateway/static/dashboard/index.html +++ b/src/gateway/static/dashboard/index.html @@ -6,7 +6,7 @@ Otari Dashboard - + diff --git a/web/src/components/ActivityTimeline.test.tsx b/web/src/components/ActivityTimeline.test.tsx index 81326fa5..2329df5e 100644 --- a/web/src/components/ActivityTimeline.test.tsx +++ b/web/src/components/ActivityTimeline.test.tsx @@ -129,4 +129,24 @@ describe("ActivityTimeline", () => { renderTimeline(); expect(screen.queryByRole("button", { name: "Reset" })).not.toBeInTheDocument(); }); + + it("falls back to the smallest broader preset when the extent is not a preset", async () => { + const user = userEvent.setup(); + // A drill-down window: extentKey is the custom sentinel, series spans 3 days. + const { onPreset } = renderTimeline({ extentKey: "custom" }); + await user.click(screen.getByRole("button", { name: "Zoom out" })); + // Smallest USAGE preset broader than 3 days is 7d. + expect(onPreset).toHaveBeenCalledWith(expect.objectContaining({ key: "7d" })); + }); + + it("moves an edge by one whole bucket per arrow key", async () => { + const user = userEvent.setup(); + const { onSelectRange } = renderTimeline(); + // Focus the end thumb and nudge it left: the full 3-bucket window narrows to + // the first two buckets (arrows are rerouted to whole-bucket steps; the + // slider's own 0.1-bucket step would be snapped back by the commit). + screen.getAllByRole("slider")[1].focus(); + await user.keyboard("{ArrowLeft}"); + expect(onSelectRange).toHaveBeenCalledWith("2026-07-10T00:00:00.000Z", "2026-07-12T00:00:00.000Z"); + }); }); diff --git a/web/src/components/ActivityTimeline.tsx b/web/src/components/ActivityTimeline.tsx index 7ad9179b..ef189a1a 100644 --- a/web/src/components/ActivityTimeline.tsx +++ b/web/src/components/ActivityTimeline.tsx @@ -5,7 +5,7 @@ import { Slider as RacSlider, SliderThumb as RacSliderThumb, SliderTrack as RacS import { Bar, BarChart, ResponsiveContainer, Tooltip, XAxis } from "recharts"; import type { UsageBucket } from "@/api/types"; -import { bucketIndexRange, formatWindowLabel, rangeFromBuckets, type RangePreset } from "@/lib/timeRange"; +import { bucketDurationMs, bucketIndexRange, formatWindowLabel, rangeFromBuckets, type RangePreset } from "@/lib/timeRange"; // A request-volume histogram that doubles as the time-range selector for the // Usage and Activity pages (the pattern CloudWatch Logs Insights, Kibana, and @@ -94,9 +94,13 @@ function TimelineTooltip({ // chart. const THUMB_CLASS = "group top-1/2 h-full w-3 cursor-ew-resize outline-none"; -function EdgeHandle({ index, label }: { index: number; label: string }) { +// The thumbs' accessible names double as the routing key for the wrapper's +// arrow-key intercept below. +const THUMB_LABELS = ["Window start", "Window end"] as const; + +function EdgeHandle({ index }: { index: 0 | 1 }) { return ( - + (windowToRange); + const [sel, setSelState] = useState<[number, number]>(windowToRange); + // Mirror of `sel` for pointer handlers: a pointerup can fire before the last + // pointermove's setState has re-rendered, and committing from the (stale) + // closure value could snap to a different bucket than the one on screen. + const selRef = useRef(sel); + const setSel = (next: [number, number]) => { + selRef.current = next; + setSelState(next); + }; const dragging = useRef(false); useEffect(() => { if (!dragging.current) setSel(windowToRange()); @@ -160,9 +172,15 @@ export function ActivityTimeline({ // Step zoom. Out doubles the window around its center; at the full extent it // promotes to the next larger preset, so "the default window is too narrow" - // is always one tap from a wider view. In halves it (min one bucket). + // is always one tap from a wider view. In halves it (min one bucket). When the + // extent is not one of the presets (a drill-down window from another page), + // fall back to the smallest preset that broadens it, so zoom-out never dead-ends. const extentIndex = presets.findIndex((p) => p.key === extentKey); - const largerPreset = extentIndex >= 0 ? presets[extentIndex + 1] : undefined; + const extentSeconds = extentIndex >= 0 ? presets[extentIndex].seconds : (n * bucketDurationMs(bucket)) / 1000; + const largerPreset = + extentIndex >= 0 + ? presets[extentIndex + 1] + : presets.find((p) => p.seconds === null || (extentSeconds !== null && p.seconds > extentSeconds)); const [lo, hi] = sel; const atFullExtent = lo <= 0.01 && hi >= n - 0.01; @@ -193,6 +211,37 @@ export function ActivityTimeline({ }; const zoomIn = () => applySpan((hi - lo) / 2); + // Arrow keys on a handle move that edge by one whole bucket. Intercepted in + // the capture phase on the wrapper below (before react-aria's own handler, + // which is unconditional): the slider's built-in arrow step is the fine + // pointer step (0.1 bucket), which the bucket-snapping commit would undo, + // making arrows a silent no-op. PageUp/Down, Home, and End stay react-aria's. + const stepEdge = (index: number, deltaBuckets: number) => { + const [slo, shi] = selRef.current; + const next: [number, number] = + index === 0 + ? [Math.max(0, Math.min(shi - 1, Math.round(slo) + deltaBuckets)), shi] + : [slo, Math.min(n, Math.max(slo + 1, Math.round(shi) + deltaBuckets))]; + setSel(next); + commit(next); + }; + + const onSliderKeyDownCapture = (event: React.KeyboardEvent) => { + const delta = + event.key === "ArrowRight" || event.key === "ArrowUp" + ? 1 + : event.key === "ArrowLeft" || event.key === "ArrowDown" + ? -1 + : 0; + if (delta === 0) return; + const which = (event.target as HTMLElement).getAttribute?.("aria-label"); + const index = THUMB_LABELS.indexOf(which as (typeof THUMB_LABELS)[number]); + if (index < 0) return; + event.preventDefault(); + event.stopPropagation(); + stepEdge(index, delta); + }; + // Pan: dragging the axis strip slides the whole window. Plain pointer capture; // commits on release like the handles do. const areaRef = useRef(null); @@ -330,37 +379,41 @@ export function ActivityTimeline({ onPointerUp={(event) => { event.currentTarget.releasePointerCapture(event.pointerId); pan.current = null; - commit(sel); + commit(selRef.current); }} onPointerCancel={() => { pan.current = null; - commit(sel); + commit(selRef.current); }} /> {/* The selection handles, overlaid on the chart. The slider itself is pointer-transparent (so bars stay hoverable and a stray click - cannot jump a handle); only the handles take the pointer. */} - { - dragging.current = true; - if (Array.isArray(value) && value.length === 2) setSel([value[0], value[1]]); - }} - onChangeEnd={(value) => { - if (Array.isArray(value) && value.length === 2) commit([value[0], value[1]]); - }} - className="pointer-events-none absolute inset-0 z-[2]" - > - - - - - + cannot jump a handle); only the handles take the pointer. The + wrapper's capture-phase keydown reroutes arrow keys to whole- + bucket steps before react-aria's fine-step handler sees them. */} +
+ { + dragging.current = true; + if (Array.isArray(value) && value.length === 2) setSel([value[0], value[1]]); + }} + onChangeEnd={(value) => { + if (Array.isArray(value) && value.length === 2) commit([value[0], value[1]]); + }} + className="pointer-events-none h-full w-full" + > + + + + + +
)}
diff --git a/web/src/pages/ActivityPage.test.tsx b/web/src/pages/ActivityPage.test.tsx index 3dacd4ee..65b3ad27 100644 --- a/web/src/pages/ActivityPage.test.tsx +++ b/web/src/pages/ActivityPage.test.tsx @@ -432,6 +432,30 @@ describe("ActivityPage", () => { await waitFor(() => expect(listCalls(calls).some((url) => !url.includes("start_date"))).toBe(true)); }); + it("frames a drill-down window that reaches outside the preset extent", async () => { + const { calls } = mockApi({ rows: [entry()] }); + // A Usage-page drill-down: explicit multi-week bounds while `range` stays the + // 24h default. The timeline must frame the drilled window (daily buckets over + // its bounds), not the unrelated 24h extent. + renderPage(, "/activity?start_date=2020-07-01T00:00:00.000Z&end_date=2020-07-15T00:00:00.000Z"); + await screen.findByText("gpt-4o"); + + await waitFor(() => + expect( + calls.some( + (c) => + c.url.includes("/v1/usage/summary") && + c.url.includes("bucket=day") && + c.url.includes("start_date=2020-07-01") && + c.url.includes("end_date=2020-07-15"), + ), + ).toBe(true), + ); + // The caption reflects the drilled window (end shown inclusively). + expect(screen.getByText(/Showing/)).toHaveTextContent("Jul 1"); + expect(screen.getByText(/Showing/)).toHaveTextContent("Jul 14"); + }); + it("buckets the timeline histogram by the active preset's extent", async () => { const { calls } = mockApi({ rows: [entry()] }); renderPage(); // default 24h diff --git a/web/src/pages/ActivityPage.tsx b/web/src/pages/ActivityPage.tsx index a57dd463..51a216db 100644 --- a/web/src/pages/ActivityPage.tsx +++ b/web/src/pages/ActivityPage.tsx @@ -21,7 +21,15 @@ import { SetPriceDialog, type ManualRates } from "@/components/SetPriceDialog"; import { PAGE_SIZE_OPTIONS, TablePagination } from "@/components/TablePagination"; import { ErrorBanner, FilterComboBox, FilterSelect, PageHeader, RefreshButton } from "@/components/ui"; import { resolveSelectedIds, useTableSelection } from "@/lib/tableSelection"; -import { ACTIVITY_DEFAULT_KEY, ACTIVITY_PRESETS, CUSTOM_KEY, findPreset, isoAgo, type RangePreset } from "@/lib/timeRange"; +import { + ACTIVITY_DEFAULT_KEY, + ACTIVITY_PRESETS, + bucketForWindow, + CUSTOM_KEY, + findPreset, + isoAgo, + type RangePreset, +} from "@/lib/timeRange"; import { useUrlState } from "@/lib/urlState"; // ---------- formatting ---------- @@ -73,10 +81,10 @@ const activityRowClassName = (e: UsageEntry): string | undefined => // ---------- filter option sets ---------- // -// The time presets and the local-time custom picker are shared with the Usage -// page via `@/lib/timeRange` (see TimeRangeControl). Activity keeps a truthful -// "All": its raw list endpoint applies no default and no clamp, so an omitted -// start really is all-time. +// The time presets and window math are shared with the Usage page via +// `@/lib/timeRange` (see the ActivityTimeline selector). Activity keeps a +// truthful "All": its raw list endpoint applies no default and no clamp, so an +// omitted start really is all-time. const STATUS_OPTIONS: { label: string; value: string }[] = [ { label: "All", value: "" }, @@ -319,17 +327,29 @@ export function ActivityPage() { // stays all-time; the caption reflects the true list window, and the brush // still narrows it. Entity filters carry over so the bars match what's shown. const extentPreset = findPreset(ACTIVITY_PRESETS, range) ?? findPreset(ACTIVITY_PRESETS, ACTIVITY_DEFAULT_KEY); - const extentBucket = extentPreset?.bucket ?? "day"; + // A window reaching outside the preset extent (a drill-down from the Usage + // page carries its own bounds while the URL's `range` still holds a default) + // cannot be framed by that extent: the histogram would show unrelated bars + // and the preset would read as active. Frame the window itself instead, with + // no preset highlighted; zoom-out falls back to the smallest broader preset. + const winOutsideExtent = Boolean( + win.start && extentWin.start && new Date(win.start).getTime() < new Date(extentWin.start).getTime(), + ); + const extentKey = winOutsideExtent ? CUSTOM_KEY : range; + const extentBucket = winOutsideExtent + ? bucketForWindow(win.start as string, win.end) + : (extentPreset?.bucket ?? "day"); const contextFilters: UsageFilters = useMemo( () => ({ - start_date: extentWin.start, + start_date: winOutsideExtent ? win.start : extentWin.start, + end_date: winOutsideExtent ? win.end : undefined, status: statusFilter || undefined, model: modelFilter.trim() || undefined, user_id: userFilter || undefined, api_key_id: apiKeyFilter || undefined, priced, }), - [extentWin, statusFilter, modelFilter, userFilter, apiKeyFilter, priced], + [winOutsideExtent, win, extentWin, statusFilter, modelFilter, userFilter, apiKeyFilter, priced], ); const contextSummary = useUsageSummary(contextFilters, extentBucket); const timelineSeries = (contextSummary.data?.series ?? []).map((p) => ({ @@ -449,8 +469,8 @@ export function ActivityPage() { void contextSummary.refetch(); }; - // A rolling preset clears any explicit bounds; a calendar pick sets them (the - // preset key is left as-is, the bounds' presence drives the "custom" highlight). + // A rolling preset clears any explicit bounds; a timeline selection sets them + // (the preset key is left as-is, since it still names the extent). const pickPreset = (preset: RangePreset) => url.patch({ range: preset.key, start_date: "", end_date: "" }); const pickCustom = (startIso: string, endIso: string) => url.patch({ start_date: startIso, end_date: endIso }); @@ -491,7 +511,7 @@ export function ActivityPage() {
(extentPreset ? pickPreset(extentPreset) : undefined)} diff --git a/web/src/pages/UsagePage.tsx b/web/src/pages/UsagePage.tsx index a5a34736..6e170fed 100644 --- a/web/src/pages/UsagePage.tsx +++ b/web/src/pages/UsagePage.tsx @@ -50,8 +50,8 @@ function formatLatency(ms: number | null): string { // ---------- filter option sets ---------- // -// The time presets, window math, and the local-time custom picker live in -// `@/lib/timeRange` and are shared with the Activity page (see TimeRangeControl). +// The time presets and window math live in `@/lib/timeRange` and are shared +// with the Activity page via the ActivityTimeline selector. // 30d: a spend investigation is usually monthly. const DEFAULT_PRESET = findPreset(USAGE_PRESETS, USAGE_DEFAULT_KEY) as RangePreset; @@ -407,9 +407,9 @@ export function UsagePage() { // not recompute "now" and churn the query key. Re-anchored on preset change // and on refresh. Usage presets are all bounded, so this is always set. const [startDate, setStartDate] = useState(() => isoAgo(DEFAULT_PRESET.seconds ?? 0)); - // Custom range: an explicit calendar window (local time), resolved to absolute - // instants by the picker. When active it overrides the preset window. The - // calendar always yields both bounds, so there is no half-filled window. + // Custom range: an explicit UTC-bucket window selected on the timeline + // (handles, pan, or step zoom). When active it overrides the preset window. + // The selection always yields both bounds, so there is no half-filled window. const [customMode, setCustomMode] = useState(false); const [customStart, setCustomStart] = useState(); const [customEnd, setCustomEnd] = useState(); From 4b17dc3c9a4f5f309cd906d9a1a97470d75411ae Mon Sep 17 00:00:00 2001 From: Nathan Brake Date: Tue, 28 Jul 2026 18:24:38 +0000 Subject: [PATCH 3/3] fix(dashboard): refetch every window-scoped query on manual refresh CodeRabbit review finding on #445: the manual refresh handlers enumerated a subset of the queries derived from the current window, so in custom mode (where the query keys do not change) the model typeahead and the period-over-period baseline silently stayed on cached data after an explicit refresh. Usage now also refetches the model-suggestion summary and, when a comparison window exists, the previous-period summary; Activity also refetches its model-suggestion summary. The previous-period refetch is guarded because refetch() ignores `enabled` and would otherwise fire a pointless request. Co-Authored-By: Claude Fable 5 --- .../static/dashboard/assets/ActivityPage-CD1bI8e0.js | 1 - .../static/dashboard/assets/ActivityPage-DIACtZv5.js | 1 + .../{AliasesPage-DOW9Z9Aj.js => AliasesPage-x0NFKgtH.js} | 2 +- .../{BudgetsPage-BJR_ZONo.js => BudgetsPage-D-S9-U_l.js} | 2 +- ...onfirmDialog-BZx_uBLn.js => ConfirmDialog-KvA7b1-a.js} | 2 +- .../assets/{DocsPage-iVP3WPzU.js => DocsPage-BZcIfS8u.js} | 2 +- .../assets/{KeysPage-ChiGoU_A.js => KeysPage-CZjqxzex.js} | 2 +- ...eControl-OSfbanjb.js => ModelScopeControl-u-XlXgXz.js} | 2 +- .../{ModelsPage-CRpsI3fJ.js => ModelsPage-BkzSZx5b.js} | 2 +- ...{OverviewPage-D51QWvyh.js => OverviewPage-BedTU_aZ.js} | 2 +- ...rovidersPage-DBjl1bc3.js => ProvidersPage-BP60GuZv.js} | 2 +- ...{SettingsPage-BFxhhnZx.js => SettingsPage-DR0J2MHH.js} | 2 +- ...Pagination-SF1u0DDk.js => TablePagination-CXhesdmH.js} | 2 +- ...lsPage-517a2mDO.js => ToolsGuardrailsPage-DiZ1TbOa.js} | 2 +- src/gateway/static/dashboard/assets/UsagePage-Ce_jAzFl.js | 1 + src/gateway/static/dashboard/assets/UsagePage-D0tp6Db_.js | 1 - .../{UsersPage-CjqDrVVr.js => UsersPage-5kctrw19.js} | 2 +- .../assets/{index-mAhQhUE6.js => index-DV8qvdUj.js} | 4 ++-- src/gateway/static/dashboard/index.html | 2 +- web/src/pages/ActivityPage.tsx | 4 ++++ web/src/pages/UsagePage.tsx | 8 ++++++++ 21 files changed, 30 insertions(+), 18 deletions(-) delete mode 100644 src/gateway/static/dashboard/assets/ActivityPage-CD1bI8e0.js create mode 100644 src/gateway/static/dashboard/assets/ActivityPage-DIACtZv5.js rename src/gateway/static/dashboard/assets/{AliasesPage-DOW9Z9Aj.js => AliasesPage-x0NFKgtH.js} (98%) rename src/gateway/static/dashboard/assets/{BudgetsPage-BJR_ZONo.js => BudgetsPage-D-S9-U_l.js} (99%) rename src/gateway/static/dashboard/assets/{ConfirmDialog-BZx_uBLn.js => ConfirmDialog-KvA7b1-a.js} (92%) rename src/gateway/static/dashboard/assets/{DocsPage-iVP3WPzU.js => DocsPage-BZcIfS8u.js} (99%) rename src/gateway/static/dashboard/assets/{KeysPage-ChiGoU_A.js => KeysPage-CZjqxzex.js} (98%) rename src/gateway/static/dashboard/assets/{ModelScopeControl-OSfbanjb.js => ModelScopeControl-u-XlXgXz.js} (98%) rename src/gateway/static/dashboard/assets/{ModelsPage-CRpsI3fJ.js => ModelsPage-BkzSZx5b.js} (99%) rename src/gateway/static/dashboard/assets/{OverviewPage-D51QWvyh.js => OverviewPage-BedTU_aZ.js} (99%) rename src/gateway/static/dashboard/assets/{ProvidersPage-DBjl1bc3.js => ProvidersPage-BP60GuZv.js} (99%) rename src/gateway/static/dashboard/assets/{SettingsPage-BFxhhnZx.js => SettingsPage-DR0J2MHH.js} (99%) rename src/gateway/static/dashboard/assets/{TablePagination-SF1u0DDk.js => TablePagination-CXhesdmH.js} (98%) rename src/gateway/static/dashboard/assets/{ToolsGuardrailsPage-517a2mDO.js => ToolsGuardrailsPage-DiZ1TbOa.js} (99%) create mode 100644 src/gateway/static/dashboard/assets/UsagePage-Ce_jAzFl.js delete mode 100644 src/gateway/static/dashboard/assets/UsagePage-D0tp6Db_.js rename src/gateway/static/dashboard/assets/{UsersPage-CjqDrVVr.js => UsersPage-5kctrw19.js} (98%) rename src/gateway/static/dashboard/assets/{index-mAhQhUE6.js => index-DV8qvdUj.js} (96%) diff --git a/src/gateway/static/dashboard/assets/ActivityPage-CD1bI8e0.js b/src/gateway/static/dashboard/assets/ActivityPage-CD1bI8e0.js deleted file mode 100644 index 72fed257..00000000 --- a/src/gateway/static/dashboard/assets/ActivityPage-CD1bI8e0.js +++ /dev/null @@ -1 +0,0 @@ -import{j as s}from"./tanstack-query-1t81HyiD.js";import{u as qe,r as n}from"./react-dgEcD0HR.js";import{u as ze,a as We,b as Ye,c as ge,d as he,e as Ge,f as He,P as Ve,E as Ze,R as Je,F as xe,g as W}from"./index-mAhQhUE6.js";import{f as O,b as Qe,A as Xe,C as fe,a as N,F as et,c as G,i as tt}from"./FilterChips-DZjxf-ot.js";import{u as st,r as at,B as rt}from"./tableSelection-9hV37uhu.js";import{C as lt}from"./ConfirmDialog-BZx_uBLn.js";import{D as nt}from"./DataTable-Bmn_eYSV.js";import{T as ot,S as it,P as ct}from"./TablePagination-SF1u0DDk.js";import{B as Y}from"./heroui-BI50yK5B.js";import"./recharts-C4kRDmvS.js";function dt(t){const[l,i]=qe(),a=n.useCallback(h=>l.get(h)??t[h],[l,t]),o=n.useCallback(h=>{const m=Number.parseInt(l.get(h)??"",10);if(!Number.isNaN(m))return m;const c=Number.parseInt(t[h],10);return Number.isNaN(c)?0:c},[l,t]),S=n.useCallback(h=>{i(m=>{const c=new URLSearchParams(m);for(const[p,x]of Object.entries(h)){const _=String(x);_===""||_===t[p]?c.delete(p):c.set(p,_)}return c},{replace:!0})},[i,t]);return{get:a,getNumber:o,patch:S}}const ut=new Intl.NumberFormat(void 0,{style:"currency",currency:"USD",maximumFractionDigits:4});function I(t){return t===null?"—":ut.format(t)}function f(t){return t===null?"—":t.toLocaleString()}function ve(t){return t===null?"—":t<1e3?`${t} ms`:`${(t/1e3).toFixed(t<1e4?2:1)} s`}function mt(t){const l=new Date(t);return Number.isNaN(l.getTime())?t:l.toLocaleString()}function pt(t){const l=new Date(t).getTime();if(Number.isNaN(l))return t;const i=Math.max(0,Math.round((Date.now()-l)/1e3));if(i<60)return`${i}s ago`;const a=Math.round(i/60);if(a<60)return`${a}m ago`;const o=Math.round(a/60);return o<24?`${o}h ago`:`${Math.round(o/24)}d ago`}const gt=t=>t.id,ht=t=>t.status==="error"?"bg-red-50":void 0,be=[{label:"All",value:""},{label:"Success",value:"success"},{label:"Error",value:"error"}],_e=[{label:"All",value:""},{label:"Priced",value:"true"},{label:"Unpriced",value:"false"}],xt=50,bt={range:G,start_date:"",end_date:"",status:"",model:"",user_id:"",api_key_id:"",priced:"",page:"0",size:String(xt)};function y(t,l,i){if(l||i)return{start:l||void 0,end:i||void 0};if(t===fe)return{};const a=O(N,t)??O(N,G),o=(a==null?void 0:a.seconds)??null;return{start:o==null?void 0:tt(o),end:void 0}}function _t({status:t}){const l=t==="error"?"border-red-200 bg-red-50 text-red-700":"border-[var(--otari-line)] bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]";return s.jsx("span",{className:`inline-flex items-center rounded-full border px-2 py-0.5 text-xs font-medium ${l}`,children:t})}const ft={gateway:"Gateway",claude_code:"Claude Code",codex:"Codex"};function vt(t){return ft[t]??t}function u({label:t,children:l}){return s.jsxs("div",{className:"flex flex-col gap-0.5",children:[s.jsx("span",{className:"text-[11px] font-medium uppercase tracking-wide text-[var(--otari-muted)]",children:t}),s.jsx("span",{className:"text-sm text-[var(--otari-ink)] break-all",children:l})]})}function kt({entry:t}){var l;return s.jsxs("div",{className:"flex flex-col gap-4 px-4 py-4",children:[t.error_message?s.jsxs("div",{className:"flex flex-col gap-1.5",children:[s.jsx("span",{className:"text-[11px] font-medium uppercase tracking-wide text-[var(--otari-muted)]",children:"Error"}),s.jsx("pre",{className:"max-h-48 overflow-auto rounded-lg border border-red-200 bg-red-50 p-3 text-xs whitespace-pre-wrap break-all text-red-700",children:"The provider returned an error. Inspect gateway logs for details."})]}):null,s.jsxs("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-4",children:[s.jsx(u,{label:"Provider",children:t.provider??"—"}),s.jsx(u,{label:"Endpoint",children:t.endpoint}),s.jsx(u,{label:"Source",children:vt(t.source)}),t.source_label?s.jsx(u,{label:"Session",children:t.source_label}):null,s.jsx(u,{label:"User",children:t.user_id??"—"}),s.jsx(u,{label:"API key",children:t.api_key_id??"—"}),s.jsx(u,{label:"Prompt tokens",children:f(t.prompt_tokens)}),s.jsx(u,{label:"Completion tokens",children:f(t.completion_tokens)}),s.jsx(u,{label:"Total tokens",children:f(t.total_tokens)}),s.jsx(u,{label:"Cost",children:I(t.cost)}),s.jsx(u,{label:"Cache read tokens",children:f(t.cache_read_tokens)}),s.jsx(u,{label:"Cache write tokens",children:f(t.cache_write_tokens)}),s.jsx(u,{label:"1h cache writes",children:f(t.cache_write_1h_tokens??null)}),s.jsx(u,{label:"Total time",children:ve(t.latency_ms)}),s.jsx(u,{label:"Request ID",children:t.id})]}),(l=t.pricing_breakdown)!=null&&l.length?s.jsxs("div",{className:"flex flex-col gap-2",children:[s.jsx("span",{className:"text-[11px] font-medium uppercase tracking-wide text-[var(--otari-muted)]",children:"Billed meters"}),s.jsx("div",{className:"grid gap-2 sm:grid-cols-2 lg:grid-cols-3",children:t.pricing_breakdown.map(i=>s.jsxs(u,{label:i.meter.replaceAll("_"," "),children:[f(i.units)," at ",I(i.rate_per_million)," / 1M, ",I(i.cost)]},i.meter))})]}):null]})}function It(){var ie,ce,de,ue,me;const t=ze(),l=We(),i=n.useMemo(()=>{const e=new Map;for(const r of l.data??[])e.set(r.id,r.key_name??`${r.id.slice(0,8)}…`);return e},[l.data]),a=dt(bt),o=a.get("range"),S=a.get("start_date"),h=a.get("end_date"),m=a.get("status"),c=a.get("model"),p=a.get("user_id"),x=a.get("api_key_id"),_=a.get("priced"),H=Math.max(0,a.getNumber("page")),V=a.getNumber("size"),U=ct.reduce((e,r)=>Math.abs(r-V)y(o,S,h));n.useEffect(()=>{Z(y(o,S,h))},[o,S,h]);const[A,J]=n.useState(()=>y(o,"",""));n.useEffect(()=>{J(y(o,"",""))},[o]);const ke=!!(d.start||d.end),E=_==="true"?!0:_==="false"?!1:void 0,b=n.useMemo(()=>({start_date:d.start,end_date:d.end,status:m||void 0,model:c.trim()||void 0,user_id:p||void 0,api_key_id:x||void 0,priced:E}),[d,m,c,p,x,E]),g=st(),F=JSON.stringify(b),Q=n.useRef(F);n.useEffect(()=>{Q.current!==F&&(Q.current=F,a.patch({page:0}),g.clear())},[F,a,g]);const v=Ye(b,H,U),j=ge(b),Se=n.useMemo(()=>({start_date:d.start,end_date:d.end,status:m||void 0,user_id:p||void 0,api_key_id:x||void 0}),[d,m,p,x]),L=((ce=(ie=he(Se,"day").data)==null?void 0:ie.by_model)==null?void 0:ce.filter(e=>!e.is_other&&e.key!==null).map(e=>e.key))??[],X=(l.data??[]).map(e=>({value:e.id,label:e.key_name??`${e.id.slice(0,8)}…`})),w=O(N,o)??O(N,G),C=!!(d.start&&A.start&&new Date(d.start).getTime()({start_date:C?d.start:A.start,end_date:C?d.end:void 0,status:m||void 0,model:c.trim()||void 0,user_id:p||void 0,api_key_id:x||void 0,priced:E}),[C,d,A,m,c,p,x,E]),R=he(je,ee),we=(((de=R.data)==null?void 0:de.series)??[]).map(e=>({bucketStart:e.bucket_start,requests:e.requests})),k=v.data??[],Ce=j.isSuccess&&!j.isPlaceholderData?((ue=j.data)==null?void 0:ue.total)??0:null,Pe=!!(m||c.trim()||p||x||_||ke),M=(e,r)=>{var pe;return((pe=e.find($e=>$e.value===r))==null?void 0:pe.label)??r},te=(t.data??[]).map(e=>({value:e.user_id,label:e.alias?`${e.alias} (${e.user_id})`:e.user_id})),Ne=()=>a.patch({status:"",priced:"",model:"",user_id:"",api_key_id:""}),Ae=[...m?[{key:"status",label:"Status",value:M(be,m),onClear:()=>a.patch({status:""})}]:[],..._?[{key:"priced",label:"Priced",value:M(_e,_),onClear:()=>a.patch({priced:""})}]:[],...p?[{key:"user",label:"User",value:M(te,p),onClear:()=>a.patch({user_id:""})}]:[],...c.trim()?[{key:"model",label:"Model",value:c.trim(),onClear:()=>a.patch({model:""})}]:[],...x?[{key:"key",label:"API key",value:M(X,x),onClear:()=>a.patch({api_key_id:""})}]:[]],K=n.useMemo(()=>k.filter(e=>!e.counts_toward_budget).map(e=>e.id),[k]),Ee=n.useMemo(()=>k.filter(e=>e.counts_toward_budget).map(e=>e.id),[k]),se=at(g.selectedKeys,K),P=se.length,ae=g.allMatching||P>0,Fe=n.useMemo(()=>({...b,counts_toward_budget:!1}),[b]),re=ge(Fe,ae),T=re.isSuccess?((me=re.data)==null?void 0:me.total)??null:null,Me=K.length>0&&P===K.length&&T!=null&&T>P,D=g.allMatching?T??P:P,B=Ge(),$=He(),[Te,q]=n.useState(!1),[De,z]=n.useState(!1),[Ie,le]=n.useState(null),Oe=n.useCallback(e=>s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center justify-between border-b border-[var(--otari-line)] px-4 py-2",children:[s.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Request detail"}),s.jsx(Y,{size:"sm",variant:"ghost",onPress:()=>le(null),children:"Close"})]}),s.jsx(kt,{entry:e})]}),[]),ne=()=>g.allMatching?{by_filter:!0,model:b.model,user_id:b.user_id,api_key_id:b.api_key_id,status:b.status,start_date:b.start_date,end_date:b.end_date,priced:b.priced}:{ids:se},Ue=()=>{B.mutate(ne(),{onSuccess:()=>{q(!1),g.clear()}})},Le=e=>{$.mutate({...ne(),...e},{onSuccess:()=>{z(!1),g.clear()}})},Re=()=>{Z(y(o,S,h)),J(y(o,"","")),v.refetch(),j.refetch(),R.refetch()},oe=e=>a.patch({range:e.key,start_date:"",end_date:""}),Ke=(e,r)=>a.patch({start_date:e,end_date:r}),Be=n.useMemo(()=>{const e=r=>r===null?"—":i.get(r)??`${r.slice(0,8)}…`;return[{id:"time",header:"Time",cell:r=>s.jsx("span",{title:mt(r.timestamp),className:"text-[var(--otari-muted)]",children:pt(r.timestamp)})},{id:"user",header:"User",cell:r=>r.user_id??"—"},{id:"model",header:"Model",isRowHeader:!0,cell:r=>r.model},{id:"api_key",header:"API key",cell:r=>s.jsx("span",{className:"text-[var(--otari-muted)]",children:e(r.api_key_id)})},{id:"tokens",header:"Tokens",align:"end",cell:r=>f(r.total_tokens)},{id:"cost",header:"Cost",align:"end",cell:r=>I(r.cost)},{id:"latency",header:"Total time",align:"end",cell:r=>ve(r.latency_ms)},{id:"status",header:"Status",cell:r=>s.jsx(_t,{status:r.status})}]},[i]);return s.jsxs("div",{className:"flex flex-col gap-6",children:[s.jsx(Ve,{title:"Activity",description:"A per-request log of what the gateway served: tokens, cost, latency, and failures. No request or response content is stored."}),s.jsx(Ze,{error:v.error??j.error}),s.jsxs("div",{className:"flex flex-col gap-3",children:[s.jsx(Xe,{presets:N,extentKey:ye,onPreset:oe,onSelectRange:Ke,onSelectFull:()=>w?oe(w):void 0,series:we,bucket:ee,windowStart:d.start,windowEnd:d.end,loading:R.isLoading,ariaLabel:"Activity request volume over the selected window",action:s.jsx(Je,{onRefresh:Re,isFetching:v.isFetching,updatedAt:v.dataUpdatedAt})}),s.jsxs(et,{chips:Ae,onClearAll:Ne,children:[s.jsx(xe,{id:"filter-status",label:"Status",value:m,onChange:e=>a.patch({status:e}),children:be.map(e=>s.jsx("option",{value:e.value,children:e.label},e.value))}),s.jsx(xe,{id:"filter-priced",label:"Priced?",value:_,onChange:e=>a.patch({priced:e}),children:_e.map(e=>s.jsx("option",{value:e.value,children:e.label},e.value))}),s.jsx(W,{label:"API key",value:x,onChange:e=>a.patch({api_key_id:e}),placeholder:"All keys",options:X}),s.jsx(W,{label:"User",value:p,onChange:e=>a.patch({user_id:e}),placeholder:"All users",options:te}),s.jsx(W,{label:"Model",value:c,onChange:e=>a.patch({model:e}),allowsCustom:!0,placeholder:"Any model",options:(c&&!L.includes(c)?[c,...L]:L).map(e=>({value:e,label:e}))})]})]}),ae?s.jsxs(rt,{selectedCount:D,allMatching:g.allMatching,matchingTotal:T,canSelectAllMatching:Me,onSelectAllMatching:g.enableAllMatching,onClear:g.clear,children:[s.jsx(Y,{size:"sm",variant:"primary",onPress:()=>z(!0),children:"Set price"}),s.jsx(Y,{size:"sm",variant:"danger",onPress:()=>q(!0),children:"Delete"})]}):null,s.jsx(nt,{ariaLabel:"Activity log",columns:Be,rows:k,getRowKey:gt,isLoading:v.isLoading,emptyContent:Pe?"No requests match these filters.":"No requests recorded yet.",selectionMode:"multiple",selectedKeys:g.selectedKeys,onSelectionChange:g.onSelectionChange,disabledKeys:Ee,onRowAction:e=>le(r=>r===e?null:e),rowClassName:ht,detailKey:Ie,renderDetail:Oe}),s.jsx(ot,{page:H,pageSize:U,total:Ce,rowsOnPage:k.length,onPageChange:e=>a.patch({page:e}),onPageSizeChange:e=>a.patch({size:e,page:0}),isFetching:v.isFetching,hasNextFallback:k.length===U}),s.jsx(lt,{isOpen:Te,onOpenChange:q,heading:"Delete usage rows",body:`Delete ${D.toLocaleString()} imported ${D===1?"row":"rows"}? Only imported rows are removed, and this cannot be undone.`,confirmLabel:"Delete",isPending:B.isPending,error:B.error,onConfirm:Ue}),s.jsx(it,{isOpen:De,onOpenChange:z,targetCount:D,isPending:$.isPending,error:$.error,onSubmit:Le})]})}export{It as ActivityPage}; diff --git a/src/gateway/static/dashboard/assets/ActivityPage-DIACtZv5.js b/src/gateway/static/dashboard/assets/ActivityPage-DIACtZv5.js new file mode 100644 index 00000000..33a2e1d9 --- /dev/null +++ b/src/gateway/static/dashboard/assets/ActivityPage-DIACtZv5.js @@ -0,0 +1 @@ +import{j as s}from"./tanstack-query-1t81HyiD.js";import{u as ze,r as n}from"./react-dgEcD0HR.js";import{u as We,a as Ye,b as Ge,c as he,d as xe,e as He,f as Ve,P as Ze,E as Je,R as Qe,F as be,g as W}from"./index-DV8qvdUj.js";import{f as O,b as Xe,A as et,C as ve,a as N,F as tt,c as G,i as st}from"./FilterChips-DZjxf-ot.js";import{u as at,r as rt,B as lt}from"./tableSelection-9hV37uhu.js";import{C as nt}from"./ConfirmDialog-KvA7b1-a.js";import{D as ot}from"./DataTable-Bmn_eYSV.js";import{T as it,S as ct,P as dt}from"./TablePagination-CXhesdmH.js";import{B as Y}from"./heroui-BI50yK5B.js";import"./recharts-C4kRDmvS.js";function ut(t){const[l,i]=ze(),a=n.useCallback(h=>l.get(h)??t[h],[l,t]),o=n.useCallback(h=>{const m=Number.parseInt(l.get(h)??"",10);if(!Number.isNaN(m))return m;const c=Number.parseInt(t[h],10);return Number.isNaN(c)?0:c},[l,t]),S=n.useCallback(h=>{i(m=>{const c=new URLSearchParams(m);for(const[p,x]of Object.entries(h)){const f=String(x);f===""||f===t[p]?c.delete(p):c.set(p,f)}return c},{replace:!0})},[i,t]);return{get:a,getNumber:o,patch:S}}const mt=new Intl.NumberFormat(void 0,{style:"currency",currency:"USD",maximumFractionDigits:4});function I(t){return t===null?"—":mt.format(t)}function _(t){return t===null?"—":t.toLocaleString()}function ke(t){return t===null?"—":t<1e3?`${t} ms`:`${(t/1e3).toFixed(t<1e4?2:1)} s`}function pt(t){const l=new Date(t);return Number.isNaN(l.getTime())?t:l.toLocaleString()}function gt(t){const l=new Date(t).getTime();if(Number.isNaN(l))return t;const i=Math.max(0,Math.round((Date.now()-l)/1e3));if(i<60)return`${i}s ago`;const a=Math.round(i/60);if(a<60)return`${a}m ago`;const o=Math.round(a/60);return o<24?`${o}h ago`:`${Math.round(o/24)}d ago`}const ht=t=>t.id,xt=t=>t.status==="error"?"bg-red-50":void 0,fe=[{label:"All",value:""},{label:"Success",value:"success"},{label:"Error",value:"error"}],_e=[{label:"All",value:""},{label:"Priced",value:"true"},{label:"Unpriced",value:"false"}],bt=50,ft={range:G,start_date:"",end_date:"",status:"",model:"",user_id:"",api_key_id:"",priced:"",page:"0",size:String(bt)};function y(t,l,i){if(l||i)return{start:l||void 0,end:i||void 0};if(t===ve)return{};const a=O(N,t)??O(N,G),o=(a==null?void 0:a.seconds)??null;return{start:o==null?void 0:st(o),end:void 0}}function _t({status:t}){const l=t==="error"?"border-red-200 bg-red-50 text-red-700":"border-[var(--otari-line)] bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]";return s.jsx("span",{className:`inline-flex items-center rounded-full border px-2 py-0.5 text-xs font-medium ${l}`,children:t})}const vt={gateway:"Gateway",claude_code:"Claude Code",codex:"Codex"};function kt(t){return vt[t]??t}function u({label:t,children:l}){return s.jsxs("div",{className:"flex flex-col gap-0.5",children:[s.jsx("span",{className:"text-[11px] font-medium uppercase tracking-wide text-[var(--otari-muted)]",children:t}),s.jsx("span",{className:"text-sm text-[var(--otari-ink)] break-all",children:l})]})}function St({entry:t}){var l;return s.jsxs("div",{className:"flex flex-col gap-4 px-4 py-4",children:[t.error_message?s.jsxs("div",{className:"flex flex-col gap-1.5",children:[s.jsx("span",{className:"text-[11px] font-medium uppercase tracking-wide text-[var(--otari-muted)]",children:"Error"}),s.jsx("pre",{className:"max-h-48 overflow-auto rounded-lg border border-red-200 bg-red-50 p-3 text-xs whitespace-pre-wrap break-all text-red-700",children:"The provider returned an error. Inspect gateway logs for details."})]}):null,s.jsxs("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-4",children:[s.jsx(u,{label:"Provider",children:t.provider??"—"}),s.jsx(u,{label:"Endpoint",children:t.endpoint}),s.jsx(u,{label:"Source",children:kt(t.source)}),t.source_label?s.jsx(u,{label:"Session",children:t.source_label}):null,s.jsx(u,{label:"User",children:t.user_id??"—"}),s.jsx(u,{label:"API key",children:t.api_key_id??"—"}),s.jsx(u,{label:"Prompt tokens",children:_(t.prompt_tokens)}),s.jsx(u,{label:"Completion tokens",children:_(t.completion_tokens)}),s.jsx(u,{label:"Total tokens",children:_(t.total_tokens)}),s.jsx(u,{label:"Cost",children:I(t.cost)}),s.jsx(u,{label:"Cache read tokens",children:_(t.cache_read_tokens)}),s.jsx(u,{label:"Cache write tokens",children:_(t.cache_write_tokens)}),s.jsx(u,{label:"1h cache writes",children:_(t.cache_write_1h_tokens??null)}),s.jsx(u,{label:"Total time",children:ke(t.latency_ms)}),s.jsx(u,{label:"Request ID",children:t.id})]}),(l=t.pricing_breakdown)!=null&&l.length?s.jsxs("div",{className:"flex flex-col gap-2",children:[s.jsx("span",{className:"text-[11px] font-medium uppercase tracking-wide text-[var(--otari-muted)]",children:"Billed meters"}),s.jsx("div",{className:"grid gap-2 sm:grid-cols-2 lg:grid-cols-3",children:t.pricing_breakdown.map(i=>s.jsxs(u,{label:i.meter.replaceAll("_"," "),children:[_(i.units)," at ",I(i.rate_per_million)," / 1M, ",I(i.cost)]},i.meter))})]}):null]})}function It(){var ce,de,ue,me,pe;const t=We(),l=Ye(),i=n.useMemo(()=>{const e=new Map;for(const r of l.data??[])e.set(r.id,r.key_name??`${r.id.slice(0,8)}…`);return e},[l.data]),a=ut(ft),o=a.get("range"),S=a.get("start_date"),h=a.get("end_date"),m=a.get("status"),c=a.get("model"),p=a.get("user_id"),x=a.get("api_key_id"),f=a.get("priced"),H=Math.max(0,a.getNumber("page")),V=a.getNumber("size"),U=dt.reduce((e,r)=>Math.abs(r-V)y(o,S,h));n.useEffect(()=>{Z(y(o,S,h))},[o,S,h]);const[A,J]=n.useState(()=>y(o,"",""));n.useEffect(()=>{J(y(o,"",""))},[o]);const Se=!!(d.start||d.end),E=f==="true"?!0:f==="false"?!1:void 0,b=n.useMemo(()=>({start_date:d.start,end_date:d.end,status:m||void 0,model:c.trim()||void 0,user_id:p||void 0,api_key_id:x||void 0,priced:E}),[d,m,c,p,x,E]),g=at(),F=JSON.stringify(b),Q=n.useRef(F);n.useEffect(()=>{Q.current!==F&&(Q.current=F,a.patch({page:0}),g.clear())},[F,a,g]);const v=Ge(b,H,U),j=he(b),ye=n.useMemo(()=>({start_date:d.start,end_date:d.end,status:m||void 0,user_id:p||void 0,api_key_id:x||void 0}),[d,m,p,x]),X=xe(ye,"day"),L=((de=(ce=X.data)==null?void 0:ce.by_model)==null?void 0:de.filter(e=>!e.is_other&&e.key!==null).map(e=>e.key))??[],ee=(l.data??[]).map(e=>({value:e.id,label:e.key_name??`${e.id.slice(0,8)}…`})),w=O(N,o)??O(N,G),C=!!(d.start&&A.start&&new Date(d.start).getTime()({start_date:C?d.start:A.start,end_date:C?d.end:void 0,status:m||void 0,model:c.trim()||void 0,user_id:p||void 0,api_key_id:x||void 0,priced:E}),[C,d,A,m,c,p,x,E]),R=xe(we,te),Ce=(((ue=R.data)==null?void 0:ue.series)??[]).map(e=>({bucketStart:e.bucket_start,requests:e.requests})),k=v.data??[],Pe=j.isSuccess&&!j.isPlaceholderData?((me=j.data)==null?void 0:me.total)??0:null,Ne=!!(m||c.trim()||p||x||f||Se),M=(e,r)=>{var ge;return((ge=e.find(qe=>qe.value===r))==null?void 0:ge.label)??r},se=(t.data??[]).map(e=>({value:e.user_id,label:e.alias?`${e.alias} (${e.user_id})`:e.user_id})),Ae=()=>a.patch({status:"",priced:"",model:"",user_id:"",api_key_id:""}),Ee=[...m?[{key:"status",label:"Status",value:M(fe,m),onClear:()=>a.patch({status:""})}]:[],...f?[{key:"priced",label:"Priced",value:M(_e,f),onClear:()=>a.patch({priced:""})}]:[],...p?[{key:"user",label:"User",value:M(se,p),onClear:()=>a.patch({user_id:""})}]:[],...c.trim()?[{key:"model",label:"Model",value:c.trim(),onClear:()=>a.patch({model:""})}]:[],...x?[{key:"key",label:"API key",value:M(ee,x),onClear:()=>a.patch({api_key_id:""})}]:[]],K=n.useMemo(()=>k.filter(e=>!e.counts_toward_budget).map(e=>e.id),[k]),Fe=n.useMemo(()=>k.filter(e=>e.counts_toward_budget).map(e=>e.id),[k]),ae=rt(g.selectedKeys,K),P=ae.length,re=g.allMatching||P>0,Me=n.useMemo(()=>({...b,counts_toward_budget:!1}),[b]),le=he(Me,re),T=le.isSuccess?((pe=le.data)==null?void 0:pe.total)??null:null,Te=K.length>0&&P===K.length&&T!=null&&T>P,D=g.allMatching?T??P:P,B=He(),$=Ve(),[De,q]=n.useState(!1),[Ie,z]=n.useState(!1),[Oe,ne]=n.useState(null),Ue=n.useCallback(e=>s.jsxs("div",{children:[s.jsxs("div",{className:"flex items-center justify-between border-b border-[var(--otari-line)] px-4 py-2",children:[s.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Request detail"}),s.jsx(Y,{size:"sm",variant:"ghost",onPress:()=>ne(null),children:"Close"})]}),s.jsx(St,{entry:e})]}),[]),oe=()=>g.allMatching?{by_filter:!0,model:b.model,user_id:b.user_id,api_key_id:b.api_key_id,status:b.status,start_date:b.start_date,end_date:b.end_date,priced:b.priced}:{ids:ae},Le=()=>{B.mutate(oe(),{onSuccess:()=>{q(!1),g.clear()}})},Re=e=>{$.mutate({...oe(),...e},{onSuccess:()=>{z(!1),g.clear()}})},Ke=()=>{Z(y(o,S,h)),J(y(o,"","")),v.refetch(),j.refetch(),R.refetch(),X.refetch()},ie=e=>a.patch({range:e.key,start_date:"",end_date:""}),Be=(e,r)=>a.patch({start_date:e,end_date:r}),$e=n.useMemo(()=>{const e=r=>r===null?"—":i.get(r)??`${r.slice(0,8)}…`;return[{id:"time",header:"Time",cell:r=>s.jsx("span",{title:pt(r.timestamp),className:"text-[var(--otari-muted)]",children:gt(r.timestamp)})},{id:"user",header:"User",cell:r=>r.user_id??"—"},{id:"model",header:"Model",isRowHeader:!0,cell:r=>r.model},{id:"api_key",header:"API key",cell:r=>s.jsx("span",{className:"text-[var(--otari-muted)]",children:e(r.api_key_id)})},{id:"tokens",header:"Tokens",align:"end",cell:r=>_(r.total_tokens)},{id:"cost",header:"Cost",align:"end",cell:r=>I(r.cost)},{id:"latency",header:"Total time",align:"end",cell:r=>ke(r.latency_ms)},{id:"status",header:"Status",cell:r=>s.jsx(_t,{status:r.status})}]},[i]);return s.jsxs("div",{className:"flex flex-col gap-6",children:[s.jsx(Ze,{title:"Activity",description:"A per-request log of what the gateway served: tokens, cost, latency, and failures. No request or response content is stored."}),s.jsx(Je,{error:v.error??j.error}),s.jsxs("div",{className:"flex flex-col gap-3",children:[s.jsx(et,{presets:N,extentKey:je,onPreset:ie,onSelectRange:Be,onSelectFull:()=>w?ie(w):void 0,series:Ce,bucket:te,windowStart:d.start,windowEnd:d.end,loading:R.isLoading,ariaLabel:"Activity request volume over the selected window",action:s.jsx(Qe,{onRefresh:Ke,isFetching:v.isFetching,updatedAt:v.dataUpdatedAt})}),s.jsxs(tt,{chips:Ee,onClearAll:Ae,children:[s.jsx(be,{id:"filter-status",label:"Status",value:m,onChange:e=>a.patch({status:e}),children:fe.map(e=>s.jsx("option",{value:e.value,children:e.label},e.value))}),s.jsx(be,{id:"filter-priced",label:"Priced?",value:f,onChange:e=>a.patch({priced:e}),children:_e.map(e=>s.jsx("option",{value:e.value,children:e.label},e.value))}),s.jsx(W,{label:"API key",value:x,onChange:e=>a.patch({api_key_id:e}),placeholder:"All keys",options:ee}),s.jsx(W,{label:"User",value:p,onChange:e=>a.patch({user_id:e}),placeholder:"All users",options:se}),s.jsx(W,{label:"Model",value:c,onChange:e=>a.patch({model:e}),allowsCustom:!0,placeholder:"Any model",options:(c&&!L.includes(c)?[c,...L]:L).map(e=>({value:e,label:e}))})]})]}),re?s.jsxs(lt,{selectedCount:D,allMatching:g.allMatching,matchingTotal:T,canSelectAllMatching:Te,onSelectAllMatching:g.enableAllMatching,onClear:g.clear,children:[s.jsx(Y,{size:"sm",variant:"primary",onPress:()=>z(!0),children:"Set price"}),s.jsx(Y,{size:"sm",variant:"danger",onPress:()=>q(!0),children:"Delete"})]}):null,s.jsx(ot,{ariaLabel:"Activity log",columns:$e,rows:k,getRowKey:ht,isLoading:v.isLoading,emptyContent:Ne?"No requests match these filters.":"No requests recorded yet.",selectionMode:"multiple",selectedKeys:g.selectedKeys,onSelectionChange:g.onSelectionChange,disabledKeys:Fe,onRowAction:e=>ne(r=>r===e?null:e),rowClassName:xt,detailKey:Oe,renderDetail:Ue}),s.jsx(it,{page:H,pageSize:U,total:Pe,rowsOnPage:k.length,onPageChange:e=>a.patch({page:e}),onPageSizeChange:e=>a.patch({size:e,page:0}),isFetching:v.isFetching,hasNextFallback:k.length===U}),s.jsx(nt,{isOpen:De,onOpenChange:q,heading:"Delete usage rows",body:`Delete ${D.toLocaleString()} imported ${D===1?"row":"rows"}? Only imported rows are removed, and this cannot be undone.`,confirmLabel:"Delete",isPending:B.isPending,error:B.error,onConfirm:Le}),s.jsx(ct,{isOpen:Ie,onOpenChange:z,targetCount:D,isPending:$.isPending,error:$.error,onSubmit:Re})]})}export{It as ActivityPage}; diff --git a/src/gateway/static/dashboard/assets/AliasesPage-DOW9Z9Aj.js b/src/gateway/static/dashboard/assets/AliasesPage-x0NFKgtH.js similarity index 98% rename from src/gateway/static/dashboard/assets/AliasesPage-DOW9Z9Aj.js rename to src/gateway/static/dashboard/assets/AliasesPage-x0NFKgtH.js index 6f14f3b9..6789fe8c 100644 --- a/src/gateway/static/dashboard/assets/AliasesPage-DOW9Z9Aj.js +++ b/src/gateway/static/dashboard/assets/AliasesPage-x0NFKgtH.js @@ -1 +1 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as d,u as L}from"./react-dgEcD0HR.js";import{h as T,i as E,j as M,C as I,P as K,E as S,k as A}from"./index-mAhQhUE6.js";import{u as R,r as F,B as $}from"./tableSelection-9hV37uhu.js";import{C as q}from"./ConfirmDialog-BZx_uBLn.js";import{D as O}from"./DataTable-Bmn_eYSV.js";import{F as V}from"./Field-Dwp6u3t8.js";import{C as N,L as z,I as H,a as G,b as W,f as X,B as h,d as k}from"./heroui-BI50yK5B.js";const _=50;function P({label:t,value:a,onChange:r,description:n,placeholder:u="provider:model",autoFocus:i,isRequired:m}){const c=T(),{visible:o,total:x,failed:p}=d.useMemo(()=>{var y;const l=a.trim().toLowerCase(),f=((y=c.data)==null?void 0:y.providers)??[],C=f.flatMap(g=>g.models),j=l?C.filter(g=>g.key.toLowerCase().includes(l)):C;return{visible:j.slice(0,_),total:j.length,failed:f.filter(g=>!g.ok)}},[c.data,a]),b=c.isLoading?"Loading models from your providers…":p.length>0?`Could not list models for ${p.map(f=>f.provider).join(", ")}. Check that provider's credentials, or type the model key directly.`:x>o.length?`Showing ${o.length} of ${x} matches. Keep typing to narrow them.`:n;return e.jsxs(N.Root,{allowsCustomValue:!0,allowsEmptyCollection:!0,menuTrigger:"input",inputValue:a,onInputChange:r,onSelectionChange:l=>{l!=null&&r(String(l))},isRequired:m,className:"flex max-w-md flex-col gap-1",children:[e.jsx(z,{className:"text-sm font-medium text-[var(--otari-ink)]",children:t}),e.jsxs(N.InputGroup,{children:[e.jsx(H,{placeholder:u,autoFocus:i}),e.jsx(N.Trigger,{})]}),e.jsx(N.Popover,{children:e.jsx(G,{items:o,className:"max-h-72 overflow-auto",children:l=>e.jsx(W,{id:l.key,textValue:l.key,children:l.key})})}),b?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:b}):null]})}const J=t=>t.name;function Q({alias:t,onClose:a}){const r=A(),[n,u]=d.useState(t.target),i=n.trim()!==""&&n.trim()!==t.target,m=()=>{i&&r.mutate({name:t.name,target:n.trim()},{onSuccess:a})};return e.jsx(k,{children:e.jsxs(k.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsxs("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:["Edit alias ",e.jsx("code",{children:t.name})]}),e.jsx(S,{error:r.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Alias name"}),e.jsx("code",{className:"text-sm text-[var(--otari-muted)]",children:t.name}),e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"The alias name is the key and cannot be changed here. Delete and recreate to rename."})]}),e.jsx(P,{label:"Target",value:n,onChange:u,isRequired:!0,description:"The real model this resolves to. Callers never see it."})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(h,{variant:"primary",isDisabled:!i||r.isPending,onPress:m,children:r.isPending?"Saving…":"Save changes"}),e.jsx(h,{variant:"ghost",onPress:a,children:"Cancel"})]})]})})}function U({onClose:t,initialTarget:a=""}){const r=A(),[n,u]=d.useState(""),[i,m]=d.useState(a),c=/[:/]/.test(n),o=n.trim()!==""&&i.trim()!==""&&!c,x=()=>{o&&r.mutate({name:n.trim(),target:i.trim()},{onSuccess:t})};return e.jsx(k,{children:e.jsxs(k.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsx("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"New alias"}),e.jsx(S,{error:r.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(V,{label:"Alias name",value:n,onChange:u,placeholder:"fast-model",isRequired:!0,autoFocus:!0,description:c?e.jsx("span",{className:"text-red-700",children:"An alias name cannot contain “:” or “/”."}):"What callers send as `model`."}),e.jsx(P,{label:"Target",value:i,onChange:m,isRequired:!0,description:"The real model this resolves to. Callers never see it."})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(h,{variant:"primary",isDisabled:!o||r.isPending,onPress:x,children:r.isPending?"Creating…":"Create alias"}),e.jsx(h,{variant:"ghost",onPress:t,children:"Cancel"})]})]})})}function le(){const t=E(),a=M(),[r]=L(),n=r.get("target")??"",[u,i]=d.useState(n!==""),[m,c]=d.useState(null),o=R(),[x,p]=d.useState(!1),[b,l]=d.useState(void 0),[f,C]=d.useState(!1),j=[...t.data??[]].sort((s,B)=>s.name.localeCompare(B.name)),y=j.filter(s=>s.source==="stored").map(s=>s.name),g=j.filter(s=>s.source!=="stored").map(s=>s.name),v=F(o.selectedKeys,y),w=async()=>{C(!0),l(void 0);try{for(const s of v)await a.mutateAsync(s);o.clear(),p(!1)}catch(s){l(s)}finally{C(!1)}},D=d.useMemo(()=>[{id:"alias",header:"Alias",isRowHeader:!0,cell:s=>e.jsx("span",{className:"font-medium break-all text-[var(--otari-ink)]",children:s.name})},{id:"target",header:"Target",cell:s=>e.jsx("span",{className:"break-all text-[var(--otari-muted)]",children:s.target})},{id:"source",header:"Source",cell:s=>e.jsx(X,{size:"sm",color:s.source==="stored"?"accent":"default",children:s.source})},{id:"actions",header:"Actions",align:"end",cell:s=>s.source==="stored"?e.jsxs("span",{className:"inline-flex items-center gap-2 whitespace-nowrap",children:[e.jsx(h,{size:"sm",variant:"ghost",onPress:()=>{i(!1),c(s)},children:"Edit"}),e.jsx(I,{confirmLabel:"Delete",isPending:a.isPending,onConfirm:()=>a.mutate(s.name),children:"Delete"})]}):e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"set in config.yml"})}],[a.isPending,a.mutate]);return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(K,{title:"Aliases",description:"Friendly names that map to a real provider:model. Callers send the alias as the model; pricing, budgets, and usage key on the target.",action:u||m?null:e.jsx(h,{variant:"primary",onPress:()=>{c(null),i(!0)},children:"New alias"})}),e.jsx(S,{error:t.error}),u?e.jsx(U,{initialTarget:n,onClose:()=>i(!1)}):null,m?e.jsx(Q,{alias:m,onClose:()=>c(null)}):null,a.error?e.jsx(S,{error:a.error}):null,v.length>0?e.jsx($,{selectedCount:v.length,allMatching:!1,matchingTotal:null,canSelectAllMatching:!1,onSelectAllMatching:()=>{},onClear:o.clear,children:e.jsx(h,{size:"sm",variant:"danger",onPress:()=>p(!0),children:"Delete"})}):null,e.jsx(O,{ariaLabel:"Aliases",columns:D,rows:j,getRowKey:J,isLoading:t.isLoading,emptyContent:"No aliases yet. Create one to give a model a friendly name.",selectionMode:"multiple",selectedKeys:o.selectedKeys,onSelectionChange:o.onSelectionChange,disabledKeys:g}),e.jsx(q,{isOpen:x,onOpenChange:p,heading:"Delete aliases",body:`Delete ${v.length} stored ${v.length===1?"alias":"aliases"}? Callers using ${v.length===1?"it":"them"} will get a model-not-found error.`,confirmLabel:"Delete",isPending:f,error:b,onConfirm:w})]})}export{le as AliasesPage}; +import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as d,u as L}from"./react-dgEcD0HR.js";import{h as T,i as E,j as M,C as I,P as K,E as S,k as A}from"./index-DV8qvdUj.js";import{u as R,r as F,B as $}from"./tableSelection-9hV37uhu.js";import{C as q}from"./ConfirmDialog-KvA7b1-a.js";import{D as O}from"./DataTable-Bmn_eYSV.js";import{F as V}from"./Field-Dwp6u3t8.js";import{C as N,L as z,I as H,a as G,b as W,f as X,B as h,d as k}from"./heroui-BI50yK5B.js";const _=50;function P({label:t,value:a,onChange:r,description:n,placeholder:u="provider:model",autoFocus:i,isRequired:m}){const c=T(),{visible:o,total:x,failed:p}=d.useMemo(()=>{var y;const l=a.trim().toLowerCase(),f=((y=c.data)==null?void 0:y.providers)??[],C=f.flatMap(g=>g.models),j=l?C.filter(g=>g.key.toLowerCase().includes(l)):C;return{visible:j.slice(0,_),total:j.length,failed:f.filter(g=>!g.ok)}},[c.data,a]),b=c.isLoading?"Loading models from your providers…":p.length>0?`Could not list models for ${p.map(f=>f.provider).join(", ")}. Check that provider's credentials, or type the model key directly.`:x>o.length?`Showing ${o.length} of ${x} matches. Keep typing to narrow them.`:n;return e.jsxs(N.Root,{allowsCustomValue:!0,allowsEmptyCollection:!0,menuTrigger:"input",inputValue:a,onInputChange:r,onSelectionChange:l=>{l!=null&&r(String(l))},isRequired:m,className:"flex max-w-md flex-col gap-1",children:[e.jsx(z,{className:"text-sm font-medium text-[var(--otari-ink)]",children:t}),e.jsxs(N.InputGroup,{children:[e.jsx(H,{placeholder:u,autoFocus:i}),e.jsx(N.Trigger,{})]}),e.jsx(N.Popover,{children:e.jsx(G,{items:o,className:"max-h-72 overflow-auto",children:l=>e.jsx(W,{id:l.key,textValue:l.key,children:l.key})})}),b?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:b}):null]})}const J=t=>t.name;function Q({alias:t,onClose:a}){const r=A(),[n,u]=d.useState(t.target),i=n.trim()!==""&&n.trim()!==t.target,m=()=>{i&&r.mutate({name:t.name,target:n.trim()},{onSuccess:a})};return e.jsx(k,{children:e.jsxs(k.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsxs("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:["Edit alias ",e.jsx("code",{children:t.name})]}),e.jsx(S,{error:r.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Alias name"}),e.jsx("code",{className:"text-sm text-[var(--otari-muted)]",children:t.name}),e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"The alias name is the key and cannot be changed here. Delete and recreate to rename."})]}),e.jsx(P,{label:"Target",value:n,onChange:u,isRequired:!0,description:"The real model this resolves to. Callers never see it."})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(h,{variant:"primary",isDisabled:!i||r.isPending,onPress:m,children:r.isPending?"Saving…":"Save changes"}),e.jsx(h,{variant:"ghost",onPress:a,children:"Cancel"})]})]})})}function U({onClose:t,initialTarget:a=""}){const r=A(),[n,u]=d.useState(""),[i,m]=d.useState(a),c=/[:/]/.test(n),o=n.trim()!==""&&i.trim()!==""&&!c,x=()=>{o&&r.mutate({name:n.trim(),target:i.trim()},{onSuccess:t})};return e.jsx(k,{children:e.jsxs(k.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsx("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"New alias"}),e.jsx(S,{error:r.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(V,{label:"Alias name",value:n,onChange:u,placeholder:"fast-model",isRequired:!0,autoFocus:!0,description:c?e.jsx("span",{className:"text-red-700",children:"An alias name cannot contain “:” or “/”."}):"What callers send as `model`."}),e.jsx(P,{label:"Target",value:i,onChange:m,isRequired:!0,description:"The real model this resolves to. Callers never see it."})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(h,{variant:"primary",isDisabled:!o||r.isPending,onPress:x,children:r.isPending?"Creating…":"Create alias"}),e.jsx(h,{variant:"ghost",onPress:t,children:"Cancel"})]})]})})}function le(){const t=E(),a=M(),[r]=L(),n=r.get("target")??"",[u,i]=d.useState(n!==""),[m,c]=d.useState(null),o=R(),[x,p]=d.useState(!1),[b,l]=d.useState(void 0),[f,C]=d.useState(!1),j=[...t.data??[]].sort((s,B)=>s.name.localeCompare(B.name)),y=j.filter(s=>s.source==="stored").map(s=>s.name),g=j.filter(s=>s.source!=="stored").map(s=>s.name),v=F(o.selectedKeys,y),w=async()=>{C(!0),l(void 0);try{for(const s of v)await a.mutateAsync(s);o.clear(),p(!1)}catch(s){l(s)}finally{C(!1)}},D=d.useMemo(()=>[{id:"alias",header:"Alias",isRowHeader:!0,cell:s=>e.jsx("span",{className:"font-medium break-all text-[var(--otari-ink)]",children:s.name})},{id:"target",header:"Target",cell:s=>e.jsx("span",{className:"break-all text-[var(--otari-muted)]",children:s.target})},{id:"source",header:"Source",cell:s=>e.jsx(X,{size:"sm",color:s.source==="stored"?"accent":"default",children:s.source})},{id:"actions",header:"Actions",align:"end",cell:s=>s.source==="stored"?e.jsxs("span",{className:"inline-flex items-center gap-2 whitespace-nowrap",children:[e.jsx(h,{size:"sm",variant:"ghost",onPress:()=>{i(!1),c(s)},children:"Edit"}),e.jsx(I,{confirmLabel:"Delete",isPending:a.isPending,onConfirm:()=>a.mutate(s.name),children:"Delete"})]}):e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"set in config.yml"})}],[a.isPending,a.mutate]);return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(K,{title:"Aliases",description:"Friendly names that map to a real provider:model. Callers send the alias as the model; pricing, budgets, and usage key on the target.",action:u||m?null:e.jsx(h,{variant:"primary",onPress:()=>{c(null),i(!0)},children:"New alias"})}),e.jsx(S,{error:t.error}),u?e.jsx(U,{initialTarget:n,onClose:()=>i(!1)}):null,m?e.jsx(Q,{alias:m,onClose:()=>c(null)}):null,a.error?e.jsx(S,{error:a.error}):null,v.length>0?e.jsx($,{selectedCount:v.length,allMatching:!1,matchingTotal:null,canSelectAllMatching:!1,onSelectAllMatching:()=>{},onClear:o.clear,children:e.jsx(h,{size:"sm",variant:"danger",onPress:()=>p(!0),children:"Delete"})}):null,e.jsx(O,{ariaLabel:"Aliases",columns:D,rows:j,getRowKey:J,isLoading:t.isLoading,emptyContent:"No aliases yet. Create one to give a model a friendly name.",selectionMode:"multiple",selectedKeys:o.selectedKeys,onSelectionChange:o.onSelectionChange,disabledKeys:g}),e.jsx(q,{isOpen:x,onOpenChange:p,heading:"Delete aliases",body:`Delete ${v.length} stored ${v.length===1?"alias":"aliases"}? Callers using ${v.length===1?"it":"them"} will get a model-not-found error.`,confirmLabel:"Delete",isPending:f,error:b,onConfirm:w})]})}export{le as AliasesPage}; diff --git a/src/gateway/static/dashboard/assets/BudgetsPage-BJR_ZONo.js b/src/gateway/static/dashboard/assets/BudgetsPage-D-S9-U_l.js similarity index 99% rename from src/gateway/static/dashboard/assets/BudgetsPage-BJR_ZONo.js rename to src/gateway/static/dashboard/assets/BudgetsPage-D-S9-U_l.js index 83fff987..98f17f26 100644 --- a/src/gateway/static/dashboard/assets/BudgetsPage-BJR_ZONo.js +++ b/src/gateway/static/dashboard/assets/BudgetsPage-D-S9-U_l.js @@ -1 +1 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as i}from"./react-dgEcD0HR.js";import{l as ae,u as re,m as le,n as ie,o as oe,p as de,P as ue,E as T,I as ce,q as me,r as xe}from"./index-mAhQhUE6.js";import{u as ge,r as he,B as pe}from"./tableSelection-9hV37uhu.js";import{C as fe}from"./ConfirmDialog-BZx_uBLn.js";import{D as be}from"./DataTable-Bmn_eYSV.js";import{F as z}from"./Field-Dwp6u3t8.js";import{C as E,I as je,a as ve,b as ye,B as x,d as k,S as Ne}from"./heroui-BI50yK5B.js";const Se=50;function _e({value:t,onChange:r,users:a,label:o,description:l}){const[g,h]=i.useState(""),d=i.useMemo(()=>a.filter(s=>!s.user_id.startsWith("apikey-")).map(s=>({id:s.user_id,label:s.alias?`${s.user_id} (${s.alias})`:s.user_id})),[a]),p=i.useMemo(()=>{const s=g.trim().toLowerCase();return d.filter(u=>!t.includes(u.id)).filter(u=>!s||u.id.toLowerCase().includes(s)||u.label.toLowerCase().includes(s)).slice(0,Se)},[d,t,g]),c=s=>{t.includes(s)||r([...t,s]),h("")},m=s=>r(t.filter(u=>u!==s));return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{children:[e.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:o}),l?e.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:l}):null]}),t.length>0?e.jsx("div",{className:"flex flex-wrap gap-1.5",children:t.map(s=>e.jsxs("span",{className:"inline-flex items-center gap-1 rounded-full bg-[var(--otari-brand-tint)] px-2.5 py-1 font-mono text-xs text-[var(--otari-brand-dark)]",children:[s,e.jsx("button",{type:"button","aria-label":`Remove ${s}`,onClick:()=>m(s),className:"text-[var(--otari-brand-dark)] hover:text-red-700",children:"×"})]},s))}):null,d.length===0?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"No users yet. Create users first, then assign them here or from the Users page."}):e.jsxs(E.Root,{allowsEmptyCollection:!0,menuTrigger:"input",inputValue:g,onInputChange:h,selectedKey:null,onSelectionChange:s=>{s!=null&&c(String(s))},className:"flex flex-col gap-1",children:[e.jsxs(E.InputGroup,{children:[e.jsx(je,{"aria-label":"Add a user",placeholder:"Search users…",autoComplete:"off"}),e.jsx(E.Trigger,{})]}),e.jsx(E.Popover,{children:e.jsx(ve,{items:p,className:"max-h-72 overflow-auto",children:s=>e.jsx(ye,{id:s.id,textValue:s.label,children:s.label})})})]})]})}const Ce=new Intl.NumberFormat(void 0,{style:"currency",currency:"USD",maximumFractionDigits:2});function D(t){return Ce.format(t)}const j=86400,q=3600,O=[{label:"No reset",seconds:null},{label:"Daily",seconds:j},{label:"Weekly",seconds:7*j},{label:"Monthly",seconds:30*j}];function we(t){if(t===null)return"No reset";const r=O.find(a=>a.seconds===t);return r?r.label:t%j===0?`Every ${t/j} days`:t%q===0?`Every ${t/q} hours`:`Every ${t}s`}function W(t){if(!t)return"—";const r=new Date(t);return Number.isNaN(r.getTime())?"—":r.toLocaleString()}function De(t){const r=t.trim();if(r==="")return{value:null,valid:!0};const a=Number(r);return!Number.isFinite(a)||a<0?{value:null,valid:!1}:{value:a,valid:!0}}function Y(t){return t!==null&&t%j===0?String(t/j):""}function Be({value:t,onChange:r,onInvalidChange:a}){const o=O.some(s=>s.seconds===t),[l,g]=i.useState(!o),[h,d]=i.useState(()=>Y(t)),p=h.trim(),c=Number(p),m=p!==""&&(!Number.isSafeInteger(c)||c<=0);return i.useEffect(()=>{a==null||a(m)},[m,a]),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Reset period"}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[O.map(s=>e.jsx(x,{size:"sm",variant:!l&&t===s.seconds?"primary":"outline",onPress:()=>{g(!1),d(Y(s.seconds)),r(s.seconds)},children:s.label},s.label)),e.jsx(x,{size:"sm",variant:l?"primary":"outline",onPress:()=>g(!0),children:"Custom"})]}),l?e.jsx("div",{className:"flex items-end gap-2",children:e.jsx(z,{label:"Every N days",value:h,onChange:s=>{d(s);const u=Number(s.trim());r(s.trim()===""||!Number.isSafeInteger(u)||u<=0?null:u*j)},placeholder:"14",description:m?e.jsx("span",{className:"text-red-700",children:"Enter a whole number of days."}):"Whole days between resets."})}):null,e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Spend returns to zero each period. A user’s clock starts when the budget is assigned to them."})]})}function G({title:t,submitLabel:r,initial:a,error:o,isPending:l,onSubmit:g,onClose:h,assignUsers:d}){const[p,c]=i.useState(a.name??""),[m,s]=i.useState(a.max_budget===null?"":String(a.max_budget)),[u,b]=i.useState(a.budget_duration_sec),[S,v]=i.useState(!1),[B,P]=i.useState([]),f=De(m),A=!l&&f.valid&&!S,C=()=>{A&&g({name:p.trim()||null,max_budget:f.value,budget_duration_sec:u},B)};return e.jsx(k,{children:e.jsxs(k.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsx("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:t}),e.jsx(T,{error:o}),e.jsx(z,{label:"Name (optional)",value:p,onChange:c,autoFocus:!0,placeholder:"team-free-tier",description:"A label to recognize this budget later."}),e.jsx(z,{label:"Spending limit (USD)",value:m,onChange:s,placeholder:"100.00",description:f.valid?"The most a single user on this budget may spend per period. Leave blank for no limit.":e.jsx("span",{className:"text-red-700",children:"Enter a non-negative number, or leave blank for no limit."})}),e.jsx(Be,{value:u,onChange:b,onInvalidChange:v}),d?e.jsx(_e,{label:"Assign to users (optional)",description:"Attach this budget to existing users now. You can also manage assignments later on the Users page.",value:B,onChange:P,users:d}):null,e.jsxs("div",{className:"flex gap-2",children:[e.jsx(x,{variant:"primary",isDisabled:!A,onPress:C,children:l?"Saving…":r}),e.jsx(x,{variant:"ghost",isDisabled:l,onPress:h,children:"Cancel"})]})]})})}function Pe({budget:t}){if(t.user_count===0)return e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"No users assigned"});const r=t.total_spend;if(t.max_budget===null)return e.jsxs("span",{className:"text-xs text-[var(--otari-ink)]",children:[D(r)," spent",e.jsx("span",{className:"text-[var(--otari-muted)]",children:" · no limit"})]});const a=t.max_budget*t.user_count,o=a>0?Math.min(100,r/a*100):0,l=r>a;return e.jsxs("div",{className:"flex min-w-[140px] flex-col gap-1",children:[e.jsxs("div",{className:"flex items-baseline justify-between gap-2 text-xs",children:[e.jsx("span",{className:"text-[var(--otari-ink)]",children:D(r)}),e.jsxs("span",{className:"text-[var(--otari-muted)]",children:["of ",D(a)]})]}),e.jsx("div",{className:"h-1.5 w-full overflow-hidden rounded-full bg-[var(--otari-line)]",role:"progressbar","aria-valuenow":Math.round(o),"aria-valuemin":0,"aria-valuemax":100,"aria-label":"Aggregate spend against total allocation",children:e.jsx("div",{className:`h-full rounded-full ${l?"bg-red-500":"bg-[var(--otari-brand)]"}`,style:{width:`${Math.max(o,l?100:2)}%`}})})]})}function Ae({budgetId:t}){const r=xe(t);if(r.isLoading)return e.jsxs("div",{className:"flex items-center gap-2 px-4 py-4 text-sm text-[var(--otari-muted)]",children:[e.jsx(Ne,{size:"sm"})," Loading reset history…"]});if(r.error)return e.jsx("div",{className:"px-4 py-4",children:e.jsx(T,{error:r.error})});const a=r.data??[];return a.length===0?e.jsx("div",{className:"px-4 py-4 text-sm text-[var(--otari-muted)]",children:"No resets recorded yet for this budget."}):e.jsx("div",{className:"overflow-x-auto px-4 py-3",children:e.jsxs("table",{className:"w-full border-collapse text-xs",children:[e.jsx("thead",{className:"text-left text-[var(--otari-muted)]",children:e.jsxs("tr",{children:[e.jsx("th",{className:"py-1.5 pr-4 font-medium",children:"User"}),e.jsx("th",{className:"py-1.5 pr-4 font-medium",children:"Spend cleared"}),e.jsx("th",{className:"py-1.5 pr-4 font-medium",children:"Reset at"}),e.jsx("th",{className:"py-1.5 font-medium",children:"Next reset"})]})}),e.jsx("tbody",{children:a.map(o=>e.jsxs("tr",{className:"border-t border-[var(--otari-line)]",children:[e.jsx("td",{className:"py-1.5 pr-4",children:e.jsx("code",{children:o.user_id??"—"})}),e.jsx("td",{className:"py-1.5 pr-4 text-[var(--otari-ink)]",children:D(o.previous_spend)}),e.jsx("td",{className:"py-1.5 pr-4 text-[var(--otari-muted)]",children:W(o.reset_at)}),e.jsx("td",{className:"py-1.5 text-[var(--otari-muted)]",children:W(o.next_reset_at)})]},o.id))})]})})}function Ee({label:t,isPending:r,onConfirm:a}){const[o,l]=i.useState(!1);return o?e.jsxs("div",{className:"flex flex-col items-end gap-1.5 rounded-lg border border-amber-200 bg-amber-50 p-2 text-right",children:[e.jsxs("span",{className:"max-w-xs text-xs text-amber-800",children:["Delete ",e.jsx("strong",{children:t}),"? Users keep their spend but lose this limit. Cannot be undone."]}),e.jsxs("span",{className:"inline-flex gap-1",children:[e.jsx(x,{size:"sm",variant:"danger",isDisabled:r,onPress:a,children:"Delete permanently"}),e.jsx(x,{size:"sm",variant:"ghost",isDisabled:r,onPress:()=>l(!1),children:"Cancel"})]})]}):e.jsx(x,{size:"sm",variant:"danger-soft",onPress:()=>l(!0),children:"Delete"})}const ke=t=>t.budget_id;function Q(t){return t.split("-")[0]}function $(t){return t.name??Q(t.budget_id)}function Te(){const t=ae(),r=re(),a=le(),o=ie(),l=oe(),g=de(),[h,d]=i.useState(!1),[p,c]=i.useState(null),[m,s]=i.useState(null),[u,b]=i.useState(null),[S,v]=i.useState(null),[B,P]=i.useState(!1),f=ge(),[A,C]=i.useState(!1),[X,F]=i.useState(void 0),[J,H]=i.useState(!1),w=t.data??[],K=t.isLoading,y=w.find(n=>n.budget_id===p)??null,U=w.find(n=>n.budget_id===m)??null,L=!K&&w.length===0&&!h,Z=w.map(n=>n.budget_id),_=he(f.selectedKeys,Z),ee=async()=>{H(!0),F(void 0);try{for(const n of _)await l.mutateAsync(n);f.clear(),C(!1)}catch(n){F(n)}finally{H(!1)}},te=i.useMemo(()=>[{id:"budget",header:"Budget",isRowHeader:!0,cell:n=>e.jsxs("div",{className:"flex flex-col gap-0.5",children:[e.jsx("span",{className:"font-medium text-[var(--otari-ink)]",children:n.name??e.jsx("span",{className:"text-[var(--otari-muted)]",children:"(unnamed)"})}),e.jsx("code",{className:"text-[11px] text-[var(--otari-muted)]",title:n.budget_id,children:Q(n.budget_id)})]})},{id:"limit",header:"Limit (per user)",cell:n=>n.max_budget===null?e.jsx("span",{className:"text-[var(--otari-muted)]",children:"Unlimited"}):D(n.max_budget)},{id:"reset",header:"Reset",cell:n=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:we(n.budget_duration_sec)})},{id:"users",header:"Users",cell:n=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:n.user_count})},{id:"usage",header:"Usage",cell:n=>e.jsx(Pe,{budget:n})},{id:"actions",header:"Actions",align:"end",cell:n=>e.jsxs("div",{className:"flex items-center justify-end gap-1.5",children:[e.jsx(x,{size:"sm",variant:"ghost",onPress:()=>s(N=>N===n.budget_id?null:n.budget_id),children:m===n.budget_id?"Hide history":"History"}),e.jsx(x,{size:"sm",variant:"ghost",onPress:()=>{d(!1),c(n.budget_id)},children:"Edit"}),e.jsx(Ee,{label:$(n),isPending:l.isPending,onConfirm:()=>l.mutate(n.budget_id)})]})}],[m,l.isPending,l.mutate]),V=async(n,N)=>{P(!0),b(null);const I=await Promise.allSettled(N.map(M=>g.mutateAsync({id:M,body:{budget_id:n}})));P(!1);const R=I.flatMap((M,ne)=>M.status==="rejected"?[N[ne]]:[]);if(R.length>0){v({budgetId:n,userIds:R}),b(new Error(`Budget created, but could not assign it to: ${R.join(", ")}. Retry to try again.`));return}v(null),d(!1)},se=(n,N)=>{if(S){V(S.budgetId,S.userIds);return}b(null),a.mutate(n,{onSuccess:async I=>{if(N.length>0){await V(I.budget_id,N);return}d(!1)}})};return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(ue,{title:"Budgets",description:"Define spending limits and reset schedules. Assign a budget to users to enforce it.",action:h||L?null:e.jsx(x,{variant:"primary",onPress:()=>{c(null),b(null),v(null),d(!0)},children:"Create budget"})}),e.jsx(T,{error:t.error??a.error??o.error??l.error??g.error}),e.jsx(ce,{children:"Assign a budget to users when you create it, or later from the Users page. Each row’s usage aggregates the spend of the users currently on that budget."}),L?e.jsx(me,{title:"No budgets yet",description:"A budget caps how much a user may spend and, optionally, resets that spend on a schedule. Create one, then assign it to users to enforce a limit.",actionLabel:"Create your first budget",onAction:()=>{c(null),b(null),v(null),d(!0)}}):null,h?e.jsx(G,{title:"Create budget",submitLabel:S?"Retry assignments":"Create budget",initial:{name:null,max_budget:null,budget_duration_sec:null},error:a.error??u,isPending:a.isPending||B,assignUsers:r.data??[],onSubmit:se,onClose:()=>{b(null),v(null),d(!1)}}):null,y?e.jsx(G,{title:`Edit budget ${$(y)}`,submitLabel:"Save changes",initial:{name:y.name,max_budget:y.max_budget,budget_duration_sec:y.budget_duration_sec},error:o.error,isPending:o.isPending,onSubmit:n=>o.mutate({id:y.budget_id,body:n},{onSuccess:()=>c(null)}),onClose:()=>c(null)},y.budget_id):null,_.length>0?e.jsx(pe,{selectedCount:_.length,allMatching:!1,matchingTotal:null,canSelectAllMatching:!1,onSelectAllMatching:()=>{},onClear:f.clear,children:e.jsx(x,{size:"sm",variant:"danger",onPress:()=>C(!0),children:"Delete"})}):null,L?null:e.jsx(be,{ariaLabel:"Budgets",columns:te,rows:w,getRowKey:ke,isLoading:K,emptyContent:"No budgets yet. Create one to cap spending.",selectionMode:"multiple",selectedKeys:f.selectedKeys,onSelectionChange:f.onSelectionChange}),U?e.jsx(k,{children:e.jsxs(k.Content,{className:"p-0",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-[var(--otari-line)] px-4 py-2",children:[e.jsxs("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:["Reset history — ",$(U)]}),e.jsx(x,{size:"sm",variant:"ghost",onPress:()=>s(null),children:"Close"})]}),e.jsx(Ae,{budgetId:U.budget_id})]})}):null,e.jsx(fe,{isOpen:A,onOpenChange:C,heading:"Delete budgets",body:`Delete ${_.length} ${_.length===1?"budget":"budgets"}? Users on ${_.length===1?"it":"them"} will no longer be capped.`,confirmLabel:"Delete",isPending:J,error:X,onConfirm:ee})]})}export{Te as BudgetsPage}; +import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as i}from"./react-dgEcD0HR.js";import{l as ae,u as re,m as le,n as ie,o as oe,p as de,P as ue,E as T,I as ce,q as me,r as xe}from"./index-DV8qvdUj.js";import{u as ge,r as he,B as pe}from"./tableSelection-9hV37uhu.js";import{C as fe}from"./ConfirmDialog-KvA7b1-a.js";import{D as be}from"./DataTable-Bmn_eYSV.js";import{F as z}from"./Field-Dwp6u3t8.js";import{C as E,I as je,a as ve,b as ye,B as x,d as k,S as Ne}from"./heroui-BI50yK5B.js";const Se=50;function _e({value:t,onChange:r,users:a,label:o,description:l}){const[g,h]=i.useState(""),d=i.useMemo(()=>a.filter(s=>!s.user_id.startsWith("apikey-")).map(s=>({id:s.user_id,label:s.alias?`${s.user_id} (${s.alias})`:s.user_id})),[a]),p=i.useMemo(()=>{const s=g.trim().toLowerCase();return d.filter(u=>!t.includes(u.id)).filter(u=>!s||u.id.toLowerCase().includes(s)||u.label.toLowerCase().includes(s)).slice(0,Se)},[d,t,g]),c=s=>{t.includes(s)||r([...t,s]),h("")},m=s=>r(t.filter(u=>u!==s));return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{children:[e.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:o}),l?e.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:l}):null]}),t.length>0?e.jsx("div",{className:"flex flex-wrap gap-1.5",children:t.map(s=>e.jsxs("span",{className:"inline-flex items-center gap-1 rounded-full bg-[var(--otari-brand-tint)] px-2.5 py-1 font-mono text-xs text-[var(--otari-brand-dark)]",children:[s,e.jsx("button",{type:"button","aria-label":`Remove ${s}`,onClick:()=>m(s),className:"text-[var(--otari-brand-dark)] hover:text-red-700",children:"×"})]},s))}):null,d.length===0?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"No users yet. Create users first, then assign them here or from the Users page."}):e.jsxs(E.Root,{allowsEmptyCollection:!0,menuTrigger:"input",inputValue:g,onInputChange:h,selectedKey:null,onSelectionChange:s=>{s!=null&&c(String(s))},className:"flex flex-col gap-1",children:[e.jsxs(E.InputGroup,{children:[e.jsx(je,{"aria-label":"Add a user",placeholder:"Search users…",autoComplete:"off"}),e.jsx(E.Trigger,{})]}),e.jsx(E.Popover,{children:e.jsx(ve,{items:p,className:"max-h-72 overflow-auto",children:s=>e.jsx(ye,{id:s.id,textValue:s.label,children:s.label})})})]})]})}const Ce=new Intl.NumberFormat(void 0,{style:"currency",currency:"USD",maximumFractionDigits:2});function D(t){return Ce.format(t)}const j=86400,q=3600,O=[{label:"No reset",seconds:null},{label:"Daily",seconds:j},{label:"Weekly",seconds:7*j},{label:"Monthly",seconds:30*j}];function we(t){if(t===null)return"No reset";const r=O.find(a=>a.seconds===t);return r?r.label:t%j===0?`Every ${t/j} days`:t%q===0?`Every ${t/q} hours`:`Every ${t}s`}function W(t){if(!t)return"—";const r=new Date(t);return Number.isNaN(r.getTime())?"—":r.toLocaleString()}function De(t){const r=t.trim();if(r==="")return{value:null,valid:!0};const a=Number(r);return!Number.isFinite(a)||a<0?{value:null,valid:!1}:{value:a,valid:!0}}function Y(t){return t!==null&&t%j===0?String(t/j):""}function Be({value:t,onChange:r,onInvalidChange:a}){const o=O.some(s=>s.seconds===t),[l,g]=i.useState(!o),[h,d]=i.useState(()=>Y(t)),p=h.trim(),c=Number(p),m=p!==""&&(!Number.isSafeInteger(c)||c<=0);return i.useEffect(()=>{a==null||a(m)},[m,a]),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Reset period"}),e.jsxs("div",{className:"flex flex-wrap gap-2",children:[O.map(s=>e.jsx(x,{size:"sm",variant:!l&&t===s.seconds?"primary":"outline",onPress:()=>{g(!1),d(Y(s.seconds)),r(s.seconds)},children:s.label},s.label)),e.jsx(x,{size:"sm",variant:l?"primary":"outline",onPress:()=>g(!0),children:"Custom"})]}),l?e.jsx("div",{className:"flex items-end gap-2",children:e.jsx(z,{label:"Every N days",value:h,onChange:s=>{d(s);const u=Number(s.trim());r(s.trim()===""||!Number.isSafeInteger(u)||u<=0?null:u*j)},placeholder:"14",description:m?e.jsx("span",{className:"text-red-700",children:"Enter a whole number of days."}):"Whole days between resets."})}):null,e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Spend returns to zero each period. A user’s clock starts when the budget is assigned to them."})]})}function G({title:t,submitLabel:r,initial:a,error:o,isPending:l,onSubmit:g,onClose:h,assignUsers:d}){const[p,c]=i.useState(a.name??""),[m,s]=i.useState(a.max_budget===null?"":String(a.max_budget)),[u,b]=i.useState(a.budget_duration_sec),[S,v]=i.useState(!1),[B,P]=i.useState([]),f=De(m),A=!l&&f.valid&&!S,C=()=>{A&&g({name:p.trim()||null,max_budget:f.value,budget_duration_sec:u},B)};return e.jsx(k,{children:e.jsxs(k.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsx("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:t}),e.jsx(T,{error:o}),e.jsx(z,{label:"Name (optional)",value:p,onChange:c,autoFocus:!0,placeholder:"team-free-tier",description:"A label to recognize this budget later."}),e.jsx(z,{label:"Spending limit (USD)",value:m,onChange:s,placeholder:"100.00",description:f.valid?"The most a single user on this budget may spend per period. Leave blank for no limit.":e.jsx("span",{className:"text-red-700",children:"Enter a non-negative number, or leave blank for no limit."})}),e.jsx(Be,{value:u,onChange:b,onInvalidChange:v}),d?e.jsx(_e,{label:"Assign to users (optional)",description:"Attach this budget to existing users now. You can also manage assignments later on the Users page.",value:B,onChange:P,users:d}):null,e.jsxs("div",{className:"flex gap-2",children:[e.jsx(x,{variant:"primary",isDisabled:!A,onPress:C,children:l?"Saving…":r}),e.jsx(x,{variant:"ghost",isDisabled:l,onPress:h,children:"Cancel"})]})]})})}function Pe({budget:t}){if(t.user_count===0)return e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"No users assigned"});const r=t.total_spend;if(t.max_budget===null)return e.jsxs("span",{className:"text-xs text-[var(--otari-ink)]",children:[D(r)," spent",e.jsx("span",{className:"text-[var(--otari-muted)]",children:" · no limit"})]});const a=t.max_budget*t.user_count,o=a>0?Math.min(100,r/a*100):0,l=r>a;return e.jsxs("div",{className:"flex min-w-[140px] flex-col gap-1",children:[e.jsxs("div",{className:"flex items-baseline justify-between gap-2 text-xs",children:[e.jsx("span",{className:"text-[var(--otari-ink)]",children:D(r)}),e.jsxs("span",{className:"text-[var(--otari-muted)]",children:["of ",D(a)]})]}),e.jsx("div",{className:"h-1.5 w-full overflow-hidden rounded-full bg-[var(--otari-line)]",role:"progressbar","aria-valuenow":Math.round(o),"aria-valuemin":0,"aria-valuemax":100,"aria-label":"Aggregate spend against total allocation",children:e.jsx("div",{className:`h-full rounded-full ${l?"bg-red-500":"bg-[var(--otari-brand)]"}`,style:{width:`${Math.max(o,l?100:2)}%`}})})]})}function Ae({budgetId:t}){const r=xe(t);if(r.isLoading)return e.jsxs("div",{className:"flex items-center gap-2 px-4 py-4 text-sm text-[var(--otari-muted)]",children:[e.jsx(Ne,{size:"sm"})," Loading reset history…"]});if(r.error)return e.jsx("div",{className:"px-4 py-4",children:e.jsx(T,{error:r.error})});const a=r.data??[];return a.length===0?e.jsx("div",{className:"px-4 py-4 text-sm text-[var(--otari-muted)]",children:"No resets recorded yet for this budget."}):e.jsx("div",{className:"overflow-x-auto px-4 py-3",children:e.jsxs("table",{className:"w-full border-collapse text-xs",children:[e.jsx("thead",{className:"text-left text-[var(--otari-muted)]",children:e.jsxs("tr",{children:[e.jsx("th",{className:"py-1.5 pr-4 font-medium",children:"User"}),e.jsx("th",{className:"py-1.5 pr-4 font-medium",children:"Spend cleared"}),e.jsx("th",{className:"py-1.5 pr-4 font-medium",children:"Reset at"}),e.jsx("th",{className:"py-1.5 font-medium",children:"Next reset"})]})}),e.jsx("tbody",{children:a.map(o=>e.jsxs("tr",{className:"border-t border-[var(--otari-line)]",children:[e.jsx("td",{className:"py-1.5 pr-4",children:e.jsx("code",{children:o.user_id??"—"})}),e.jsx("td",{className:"py-1.5 pr-4 text-[var(--otari-ink)]",children:D(o.previous_spend)}),e.jsx("td",{className:"py-1.5 pr-4 text-[var(--otari-muted)]",children:W(o.reset_at)}),e.jsx("td",{className:"py-1.5 text-[var(--otari-muted)]",children:W(o.next_reset_at)})]},o.id))})]})})}function Ee({label:t,isPending:r,onConfirm:a}){const[o,l]=i.useState(!1);return o?e.jsxs("div",{className:"flex flex-col items-end gap-1.5 rounded-lg border border-amber-200 bg-amber-50 p-2 text-right",children:[e.jsxs("span",{className:"max-w-xs text-xs text-amber-800",children:["Delete ",e.jsx("strong",{children:t}),"? Users keep their spend but lose this limit. Cannot be undone."]}),e.jsxs("span",{className:"inline-flex gap-1",children:[e.jsx(x,{size:"sm",variant:"danger",isDisabled:r,onPress:a,children:"Delete permanently"}),e.jsx(x,{size:"sm",variant:"ghost",isDisabled:r,onPress:()=>l(!1),children:"Cancel"})]})]}):e.jsx(x,{size:"sm",variant:"danger-soft",onPress:()=>l(!0),children:"Delete"})}const ke=t=>t.budget_id;function Q(t){return t.split("-")[0]}function $(t){return t.name??Q(t.budget_id)}function Te(){const t=ae(),r=re(),a=le(),o=ie(),l=oe(),g=de(),[h,d]=i.useState(!1),[p,c]=i.useState(null),[m,s]=i.useState(null),[u,b]=i.useState(null),[S,v]=i.useState(null),[B,P]=i.useState(!1),f=ge(),[A,C]=i.useState(!1),[X,F]=i.useState(void 0),[J,H]=i.useState(!1),w=t.data??[],K=t.isLoading,y=w.find(n=>n.budget_id===p)??null,U=w.find(n=>n.budget_id===m)??null,L=!K&&w.length===0&&!h,Z=w.map(n=>n.budget_id),_=he(f.selectedKeys,Z),ee=async()=>{H(!0),F(void 0);try{for(const n of _)await l.mutateAsync(n);f.clear(),C(!1)}catch(n){F(n)}finally{H(!1)}},te=i.useMemo(()=>[{id:"budget",header:"Budget",isRowHeader:!0,cell:n=>e.jsxs("div",{className:"flex flex-col gap-0.5",children:[e.jsx("span",{className:"font-medium text-[var(--otari-ink)]",children:n.name??e.jsx("span",{className:"text-[var(--otari-muted)]",children:"(unnamed)"})}),e.jsx("code",{className:"text-[11px] text-[var(--otari-muted)]",title:n.budget_id,children:Q(n.budget_id)})]})},{id:"limit",header:"Limit (per user)",cell:n=>n.max_budget===null?e.jsx("span",{className:"text-[var(--otari-muted)]",children:"Unlimited"}):D(n.max_budget)},{id:"reset",header:"Reset",cell:n=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:we(n.budget_duration_sec)})},{id:"users",header:"Users",cell:n=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:n.user_count})},{id:"usage",header:"Usage",cell:n=>e.jsx(Pe,{budget:n})},{id:"actions",header:"Actions",align:"end",cell:n=>e.jsxs("div",{className:"flex items-center justify-end gap-1.5",children:[e.jsx(x,{size:"sm",variant:"ghost",onPress:()=>s(N=>N===n.budget_id?null:n.budget_id),children:m===n.budget_id?"Hide history":"History"}),e.jsx(x,{size:"sm",variant:"ghost",onPress:()=>{d(!1),c(n.budget_id)},children:"Edit"}),e.jsx(Ee,{label:$(n),isPending:l.isPending,onConfirm:()=>l.mutate(n.budget_id)})]})}],[m,l.isPending,l.mutate]),V=async(n,N)=>{P(!0),b(null);const I=await Promise.allSettled(N.map(M=>g.mutateAsync({id:M,body:{budget_id:n}})));P(!1);const R=I.flatMap((M,ne)=>M.status==="rejected"?[N[ne]]:[]);if(R.length>0){v({budgetId:n,userIds:R}),b(new Error(`Budget created, but could not assign it to: ${R.join(", ")}. Retry to try again.`));return}v(null),d(!1)},se=(n,N)=>{if(S){V(S.budgetId,S.userIds);return}b(null),a.mutate(n,{onSuccess:async I=>{if(N.length>0){await V(I.budget_id,N);return}d(!1)}})};return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(ue,{title:"Budgets",description:"Define spending limits and reset schedules. Assign a budget to users to enforce it.",action:h||L?null:e.jsx(x,{variant:"primary",onPress:()=>{c(null),b(null),v(null),d(!0)},children:"Create budget"})}),e.jsx(T,{error:t.error??a.error??o.error??l.error??g.error}),e.jsx(ce,{children:"Assign a budget to users when you create it, or later from the Users page. Each row’s usage aggregates the spend of the users currently on that budget."}),L?e.jsx(me,{title:"No budgets yet",description:"A budget caps how much a user may spend and, optionally, resets that spend on a schedule. Create one, then assign it to users to enforce a limit.",actionLabel:"Create your first budget",onAction:()=>{c(null),b(null),v(null),d(!0)}}):null,h?e.jsx(G,{title:"Create budget",submitLabel:S?"Retry assignments":"Create budget",initial:{name:null,max_budget:null,budget_duration_sec:null},error:a.error??u,isPending:a.isPending||B,assignUsers:r.data??[],onSubmit:se,onClose:()=>{b(null),v(null),d(!1)}}):null,y?e.jsx(G,{title:`Edit budget ${$(y)}`,submitLabel:"Save changes",initial:{name:y.name,max_budget:y.max_budget,budget_duration_sec:y.budget_duration_sec},error:o.error,isPending:o.isPending,onSubmit:n=>o.mutate({id:y.budget_id,body:n},{onSuccess:()=>c(null)}),onClose:()=>c(null)},y.budget_id):null,_.length>0?e.jsx(pe,{selectedCount:_.length,allMatching:!1,matchingTotal:null,canSelectAllMatching:!1,onSelectAllMatching:()=>{},onClear:f.clear,children:e.jsx(x,{size:"sm",variant:"danger",onPress:()=>C(!0),children:"Delete"})}):null,L?null:e.jsx(be,{ariaLabel:"Budgets",columns:te,rows:w,getRowKey:ke,isLoading:K,emptyContent:"No budgets yet. Create one to cap spending.",selectionMode:"multiple",selectedKeys:f.selectedKeys,onSelectionChange:f.onSelectionChange}),U?e.jsx(k,{children:e.jsxs(k.Content,{className:"p-0",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-[var(--otari-line)] px-4 py-2",children:[e.jsxs("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:["Reset history — ",$(U)]}),e.jsx(x,{size:"sm",variant:"ghost",onPress:()=>s(null),children:"Close"})]}),e.jsx(Ae,{budgetId:U.budget_id})]})}):null,e.jsx(fe,{isOpen:A,onOpenChange:C,heading:"Delete budgets",body:`Delete ${_.length} ${_.length===1?"budget":"budgets"}? Users on ${_.length===1?"it":"them"} will no longer be capped.`,confirmLabel:"Delete",isPending:J,error:X,onConfirm:ee})]})}export{Te as BudgetsPage}; diff --git a/src/gateway/static/dashboard/assets/ConfirmDialog-BZx_uBLn.js b/src/gateway/static/dashboard/assets/ConfirmDialog-KvA7b1-a.js similarity index 92% rename from src/gateway/static/dashboard/assets/ConfirmDialog-BZx_uBLn.js rename to src/gateway/static/dashboard/assets/ConfirmDialog-KvA7b1-a.js index de51a747..97073b50 100644 --- a/src/gateway/static/dashboard/assets/ConfirmDialog-BZx_uBLn.js +++ b/src/gateway/static/dashboard/assets/ConfirmDialog-KvA7b1-a.js @@ -1 +1 @@ -import{j as r}from"./tanstack-query-1t81HyiD.js";import{E as j}from"./index-mAhQhUE6.js";import{A as e,B as l}from"./heroui-BI50yK5B.js";function p({isOpen:s,onOpenChange:a,heading:n,body:o,confirmLabel:t,confirmVariant:c="danger",isPending:i,error:d,onConfirm:x}){return r.jsx(e,{isOpen:s,onOpenChange:a,children:s?r.jsx(e.Backdrop,{children:r.jsx(e.Container,{placement:"center",size:"md",children:r.jsxs(e.Dialog,{children:[r.jsx(e.Header,{children:r.jsx(e.Heading,{children:n})}),r.jsxs(e.Body,{className:"flex flex-col gap-4",children:[r.jsx("div",{className:"text-sm text-[var(--otari-muted)]",children:o}),r.jsx(j,{error:d})]}),r.jsxs(e.Footer,{children:[r.jsx(l,{variant:"ghost",isDisabled:i,onPress:()=>a(!1),children:"Cancel"}),r.jsx(l,{variant:c,isPending:i,onPress:x,children:t})]})]})})}):null})}export{p as C}; +import{j as r}from"./tanstack-query-1t81HyiD.js";import{E as j}from"./index-DV8qvdUj.js";import{A as e,B as l}from"./heroui-BI50yK5B.js";function p({isOpen:s,onOpenChange:a,heading:n,body:o,confirmLabel:t,confirmVariant:c="danger",isPending:i,error:d,onConfirm:x}){return r.jsx(e,{isOpen:s,onOpenChange:a,children:s?r.jsx(e.Backdrop,{children:r.jsx(e.Container,{placement:"center",size:"md",children:r.jsxs(e.Dialog,{children:[r.jsx(e.Header,{children:r.jsx(e.Heading,{children:n})}),r.jsxs(e.Body,{className:"flex flex-col gap-4",children:[r.jsx("div",{className:"text-sm text-[var(--otari-muted)]",children:o}),r.jsx(j,{error:d})]}),r.jsxs(e.Footer,{children:[r.jsx(l,{variant:"ghost",isDisabled:i,onPress:()=>a(!1),children:"Cancel"}),r.jsx(l,{variant:c,isPending:i,onPress:x,children:t})]})]})})}):null})}export{p as C}; diff --git a/src/gateway/static/dashboard/assets/DocsPage-iVP3WPzU.js b/src/gateway/static/dashboard/assets/DocsPage-BZcIfS8u.js similarity index 99% rename from src/gateway/static/dashboard/assets/DocsPage-iVP3WPzU.js rename to src/gateway/static/dashboard/assets/DocsPage-BZcIfS8u.js index 7c578d00..81d718bc 100644 --- a/src/gateway/static/dashboard/assets/DocsPage-iVP3WPzU.js +++ b/src/gateway/static/dashboard/assets/DocsPage-BZcIfS8u.js @@ -1,4 +1,4 @@ -import{j as re}from"./tanstack-query-1t81HyiD.js";import{P as gi}from"./index-mAhQhUE6.js";import{d as ct}from"./heroui-BI50yK5B.js";import{g as nr}from"./react-dgEcD0HR.js";function yi(e,t){const n={};return(e[e.length-1]===""?[...e,""]:e).join((n.padRight?" ":"")+","+(n.padLeft===!1?"":" ")).trim()}const ki=/^[$_\p{ID_Start}][$_\u{200C}\u{200D}\p{ID_Continue}]*$/u,xi=/^[$_\p{ID_Start}][-$_\u{200C}\u{200D}\p{ID_Continue}]*$/u,bi={};function ft(e,t){return(bi.jsx?xi:ki).test(e)}const wi=/[ \t\n\f\r]/g;function Si(e){return typeof e=="object"?e.type==="text"?ht(e.value):!1:ht(e)}function ht(e){return e.replace(wi,"")===""}class Ke{constructor(t,n,r){this.normal=n,this.property=t,r&&(this.space=r)}}Ke.prototype.normal={};Ke.prototype.property={};Ke.prototype.space=void 0;function tr(e,t){const n={},r={};for(const i of e)Object.assign(n,i.property),Object.assign(r,i.normal);return new Ke(n,r,t)}function zn(e){return e.toLowerCase()}class ee{constructor(t,n){this.attribute=n,this.property=t}}ee.prototype.attribute="";ee.prototype.booleanish=!1;ee.prototype.boolean=!1;ee.prototype.commaOrSpaceSeparated=!1;ee.prototype.commaSeparated=!1;ee.prototype.defined=!1;ee.prototype.mustUseProperty=!1;ee.prototype.number=!1;ee.prototype.overloadedBoolean=!1;ee.prototype.property="";ee.prototype.spaceSeparated=!1;ee.prototype.space=void 0;let Ci=0;const L=Ae(),Y=Ae(),Dn=Ae(),E=Ae(),$=Ae(),Ie=Ae(),te=Ae();function Ae(){return 2**++Ci}const Ln=Object.freeze(Object.defineProperty({__proto__:null,boolean:L,booleanish:Y,commaOrSpaceSeparated:te,commaSeparated:Ie,number:E,overloadedBoolean:Dn,spaceSeparated:$},Symbol.toStringTag,{value:"Module"})),pn=Object.keys(Ln);class Hn extends ee{constructor(t,n,r,i){let o=-1;if(super(t,n),pt(this,"space",i),typeof r=="number")for(;++o4&&n.slice(0,4)==="data"&&vi.test(t)){if(t.charAt(4)==="-"){const o=t.slice(5).replace(mt,Di);r="data"+o.charAt(0).toUpperCase()+o.slice(1)}else{const o=t.slice(4);if(!mt.test(o)){let l=o.replace(Ai,zi);l.charAt(0)!=="-"&&(l="-"+l),t="data"+l}}i=Hn}return new i(r,t)}function zi(e){return"-"+e.toLowerCase()}function Di(e){return e.charAt(1).toUpperCase()}const Li=tr([rr,Ei,or,ar,ur],"html"),Un=tr([rr,Ii,or,ar,ur],"svg");function Fi(e){return e.join(" ").trim()}var De={},mn,dt;function Ri(){if(dt)return mn;dt=1;var e=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g,t=/\n/g,n=/^\s*/,r=/^(\*?[-#/*\\\w]+(\[[0-9a-z_-]+\])?)\s*/,i=/^:\s*/,o=/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/,l=/^[;\s]*/,a=/^\s+|\s+$/g,u=` +import{j as re}from"./tanstack-query-1t81HyiD.js";import{P as gi}from"./index-DV8qvdUj.js";import{d as ct}from"./heroui-BI50yK5B.js";import{g as nr}from"./react-dgEcD0HR.js";function yi(e,t){const n={};return(e[e.length-1]===""?[...e,""]:e).join((n.padRight?" ":"")+","+(n.padLeft===!1?"":" ")).trim()}const ki=/^[$_\p{ID_Start}][$_\u{200C}\u{200D}\p{ID_Continue}]*$/u,xi=/^[$_\p{ID_Start}][-$_\u{200C}\u{200D}\p{ID_Continue}]*$/u,bi={};function ft(e,t){return(bi.jsx?xi:ki).test(e)}const wi=/[ \t\n\f\r]/g;function Si(e){return typeof e=="object"?e.type==="text"?ht(e.value):!1:ht(e)}function ht(e){return e.replace(wi,"")===""}class Ke{constructor(t,n,r){this.normal=n,this.property=t,r&&(this.space=r)}}Ke.prototype.normal={};Ke.prototype.property={};Ke.prototype.space=void 0;function tr(e,t){const n={},r={};for(const i of e)Object.assign(n,i.property),Object.assign(r,i.normal);return new Ke(n,r,t)}function zn(e){return e.toLowerCase()}class ee{constructor(t,n){this.attribute=n,this.property=t}}ee.prototype.attribute="";ee.prototype.booleanish=!1;ee.prototype.boolean=!1;ee.prototype.commaOrSpaceSeparated=!1;ee.prototype.commaSeparated=!1;ee.prototype.defined=!1;ee.prototype.mustUseProperty=!1;ee.prototype.number=!1;ee.prototype.overloadedBoolean=!1;ee.prototype.property="";ee.prototype.spaceSeparated=!1;ee.prototype.space=void 0;let Ci=0;const L=Ae(),Y=Ae(),Dn=Ae(),E=Ae(),$=Ae(),Ie=Ae(),te=Ae();function Ae(){return 2**++Ci}const Ln=Object.freeze(Object.defineProperty({__proto__:null,boolean:L,booleanish:Y,commaOrSpaceSeparated:te,commaSeparated:Ie,number:E,overloadedBoolean:Dn,spaceSeparated:$},Symbol.toStringTag,{value:"Module"})),pn=Object.keys(Ln);class Hn extends ee{constructor(t,n,r,i){let o=-1;if(super(t,n),pt(this,"space",i),typeof r=="number")for(;++o4&&n.slice(0,4)==="data"&&vi.test(t)){if(t.charAt(4)==="-"){const o=t.slice(5).replace(mt,Di);r="data"+o.charAt(0).toUpperCase()+o.slice(1)}else{const o=t.slice(4);if(!mt.test(o)){let l=o.replace(Ai,zi);l.charAt(0)!=="-"&&(l="-"+l),t="data"+l}}i=Hn}return new i(r,t)}function zi(e){return"-"+e.toLowerCase()}function Di(e){return e.charAt(1).toUpperCase()}const Li=tr([rr,Ei,or,ar,ur],"html"),Un=tr([rr,Ii,or,ar,ur],"svg");function Fi(e){return e.join(" ").trim()}var De={},mn,dt;function Ri(){if(dt)return mn;dt=1;var e=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//g,t=/\n/g,n=/^\s*/,r=/^(\*?[-#/*\\\w]+(\[[0-9a-z_-]+\])?)\s*/,i=/^:\s*/,o=/^((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};])+)/,l=/^[;\s]*/,a=/^\s+|\s+$/g,u=` `,s="/",f="*",c="",p="comment",h="declaration";function g(S,y){if(typeof S!="string")throw new TypeError("First argument must be a string");if(!S)return[];y=y||{};var I=1,C=1;function R(D){var A=D.match(t);A&&(I+=A.length);var q=D.lastIndexOf(u);C=~q?D.length-q:C+D.length}function _(){var D={line:I,column:C};return function(A){return A.position=new b(D),j(),A}}function b(D){this.start=D,this.end={line:I,column:C},this.source=y.source}b.prototype.content=S;function M(D){var A=new Error(y.source+":"+I+":"+C+": "+D);if(A.reason=D,A.filename=y.source,A.line=I,A.column=C,A.source=S,!y.silent)throw A}function H(D){var A=D.exec(S);if(A){var q=A[0];return R(q),S=S.slice(q.length),A}}function j(){H(n)}function k(D){var A;for(D=D||[];A=v();)A!==!1&&D.push(A);return D}function v(){var D=_();if(!(s!=S.charAt(0)||f!=S.charAt(1))){for(var A=2;c!=S.charAt(A)&&(f!=S.charAt(A)||s!=S.charAt(A+1));)++A;if(A+=2,c===S.charAt(A-1))return M("End of comment missing");var q=S.slice(2,A-2);return C+=2,R(q),S=S.slice(A),C+=2,D({type:p,comment:q})}}function P(){var D=_(),A=H(r);if(A){if(v(),!H(i))return M("property missing ':'");var q=H(o),K=D({type:h,property:w(A[0].replace(e,c)),value:q?w(q[0].replace(e,c)):c});return H(l),K}}function U(){var D=[];k(D);for(var A;A=P();)A!==!1&&(D.push(A),k(D));return D}return j(),U()}function w(S){return S?S.replace(a,c):c}return mn=g,mn}var gt;function _i(){if(gt)return De;gt=1;var e=De&&De.__importDefault||function(r){return r&&r.__esModule?r:{default:r}};Object.defineProperty(De,"__esModule",{value:!0}),De.default=n;const t=e(Ri());function n(r,i){let o=null;if(!r||typeof r!="string")return o;const l=(0,t.default)(r),a=typeof i=="function";return l.forEach(u=>{if(u.type!=="declaration")return;const{property:s,value:f}=u;a?i(s,f,u):f&&(o=o||{},o[s]=f)}),o}return De}var Be={},yt;function Oi(){if(yt)return Be;yt=1,Object.defineProperty(Be,"__esModule",{value:!0}),Be.camelCase=void 0;var e=/^--[a-zA-Z0-9_-]+$/,t=/-([a-z])/g,n=/^[^-]+$/,r=/^-(webkit|moz|ms|o|khtml)-/,i=/^-(ms)-/,o=function(s){return!s||n.test(s)||e.test(s)},l=function(s,f){return f.toUpperCase()},a=function(s,f){return"".concat(f,"-")},u=function(s,f){return f===void 0&&(f={}),o(s)?s:(s=s.toLowerCase(),f.reactCompat?s=s.replace(i,a):s=s.replace(r,a),s.replace(t,l))};return Be.camelCase=u,Be}var je,kt;function Mi(){if(kt)return je;kt=1;var e=je&&je.__importDefault||function(i){return i&&i.__esModule?i:{default:i}},t=e(_i()),n=Oi();function r(i,o){var l={};return!i||typeof i!="string"||(0,t.default)(i,function(a,u){a&&u&&(l[(0,n.camelCase)(a,o)]=u)}),l}return r.default=r,je=r,je}var Ni=Mi();const Bi=nr(Ni),sr=cr("end"),qn=cr("start");function cr(e){return t;function t(n){const r=n&&n.position&&n.position[e]||{};if(typeof r.line=="number"&&r.line>0&&typeof r.column=="number"&&r.column>0)return{line:r.line,column:r.column,offset:typeof r.offset=="number"&&r.offset>-1?r.offset:void 0}}}function ji(e){const t=qn(e),n=sr(e);if(t&&n)return{start:t,end:n}}function qe(e){return!e||typeof e!="object"?"":"position"in e||"type"in e?xt(e.position):"start"in e||"end"in e?xt(e):"line"in e||"column"in e?Fn(e):""}function Fn(e){return bt(e&&e.line)+":"+bt(e&&e.column)}function xt(e){return Fn(e&&e.start)+"-"+Fn(e&&e.end)}function bt(e){return e&&typeof e=="number"?e:1}class G extends Error{constructor(t,n,r){super(),typeof n=="string"&&(r=n,n=void 0);let i="",o={},l=!1;if(n&&("line"in n&&"column"in n?o={place:n}:"start"in n&&"end"in n?o={place:n}:"type"in n?o={ancestors:[n],place:n.position}:o={...n}),typeof t=="string"?i=t:!o.cause&&t&&(l=!0,i=t.message,o.cause=t),!o.ruleId&&!o.source&&typeof r=="string"){const u=r.indexOf(":");u===-1?o.ruleId=r:(o.source=r.slice(0,u),o.ruleId=r.slice(u+1))}if(!o.place&&o.ancestors&&o.ancestors){const u=o.ancestors[o.ancestors.length-1];u&&(o.place=u.position)}const a=o.place&&"start"in o.place?o.place.start:o.place;this.ancestors=o.ancestors||void 0,this.cause=o.cause||void 0,this.column=a?a.column:void 0,this.fatal=void 0,this.file="",this.message=i,this.line=a?a.line:void 0,this.name=qe(o.place)||"1:1",this.place=o.place||void 0,this.reason=this.message,this.ruleId=o.ruleId||void 0,this.source=o.source||void 0,this.stack=l&&o.cause&&typeof o.cause.stack=="string"?o.cause.stack:"",this.actual=void 0,this.expected=void 0,this.note=void 0,this.url=void 0}}G.prototype.file="";G.prototype.name="";G.prototype.reason="";G.prototype.message="";G.prototype.stack="";G.prototype.column=void 0;G.prototype.line=void 0;G.prototype.ancestors=void 0;G.prototype.cause=void 0;G.prototype.fatal=void 0;G.prototype.place=void 0;G.prototype.ruleId=void 0;G.prototype.source=void 0;const Vn={}.hasOwnProperty,Hi=new Map,Ui=/[A-Z]/g,qi=new Set(["table","tbody","thead","tfoot","tr"]),Vi=new Set(["td","th"]),fr="https://github.com/syntax-tree/hast-util-to-jsx-runtime";function $i(e,t){if(!t||t.Fragment===void 0)throw new TypeError("Expected `Fragment` in options");const n=t.filePath||void 0;let r;if(t.development){if(typeof t.jsxDEV!="function")throw new TypeError("Expected `jsxDEV` in options when `development: true`");r=Zi(n,t.jsxDEV)}else{if(typeof t.jsx!="function")throw new TypeError("Expected `jsx` in production options");if(typeof t.jsxs!="function")throw new TypeError("Expected `jsxs` in production options");r=Ji(n,t.jsx,t.jsxs)}const i={Fragment:t.Fragment,ancestors:[],components:t.components||{},create:r,elementAttributeNameCase:t.elementAttributeNameCase||"react",evaluater:t.createEvaluater?t.createEvaluater():void 0,filePath:n,ignoreInvalidStyle:t.ignoreInvalidStyle||!1,passKeys:t.passKeys!==!1,passNode:t.passNode||!1,schema:t.space==="svg"?Un:Li,stylePropertyNameCase:t.stylePropertyNameCase||"dom",tableCellAlignToStyle:t.tableCellAlignToStyle!==!1},o=hr(i,e,void 0);return o&&typeof o!="string"?o:i.create(e,i.Fragment,{children:o||void 0},void 0)}function hr(e,t,n){if(t.type==="element")return Wi(e,t,n);if(t.type==="mdxFlowExpression"||t.type==="mdxTextExpression")return Yi(e,t);if(t.type==="mdxJsxFlowElement"||t.type==="mdxJsxTextElement")return Qi(e,t,n);if(t.type==="mdxjsEsm")return Ki(e,t);if(t.type==="root")return Xi(e,t,n);if(t.type==="text")return Gi(e,t)}function Wi(e,t,n){const r=e.schema;let i=r;t.tagName.toLowerCase()==="svg"&&r.space==="html"&&(i=Un,e.schema=i),e.ancestors.push(t);const o=mr(e,t.tagName,!1),l=el(e,t);let a=Wn(e,t);return qi.has(t.tagName)&&(a=a.filter(function(u){return typeof u=="string"?!Si(u):!0})),pr(e,l,o,t),$n(l,a),e.ancestors.pop(),e.schema=r,e.create(t,o,l,n)}function Yi(e,t){if(t.data&&t.data.estree&&e.evaluater){const r=t.data.estree.body[0];return r.type,e.evaluater.evaluateExpression(r.expression)}We(e,t.position)}function Ki(e,t){if(t.data&&t.data.estree&&e.evaluater)return e.evaluater.evaluateProgram(t.data.estree);We(e,t.position)}function Qi(e,t,n){const r=e.schema;let i=r;t.name==="svg"&&r.space==="html"&&(i=Un,e.schema=i),e.ancestors.push(t);const o=t.name===null?e.Fragment:mr(e,t.name,!0),l=nl(e,t),a=Wn(e,t);return pr(e,l,o,t),$n(l,a),e.ancestors.pop(),e.schema=r,e.create(t,o,l,n)}function Xi(e,t,n){const r={};return $n(r,Wn(e,t)),e.create(t,e.Fragment,r,n)}function Gi(e,t){return t.value}function pr(e,t,n,r){typeof n!="string"&&n!==e.Fragment&&e.passNode&&(t.node=r)}function $n(e,t){if(t.length>0){const n=t.length>1?t:t[0];n&&(e.children=n)}}function Ji(e,t,n){return r;function r(i,o,l,a){const s=Array.isArray(l.children)?n:t;return a?s(o,l,a):s(o,l)}}function Zi(e,t){return n;function n(r,i,o,l){const a=Array.isArray(o.children),u=qn(r);return t(i,o,l,a,{columnNumber:u?u.column-1:void 0,fileName:e,lineNumber:u?u.line:void 0},void 0)}}function el(e,t){const n={};let r,i;for(i in t.properties)if(i!=="children"&&Vn.call(t.properties,i)){const o=tl(e,i,t.properties[i]);if(o){const[l,a]=o;e.tableCellAlignToStyle&&l==="align"&&typeof a=="string"&&Vi.has(t.tagName)?r=a:n[l]=a}}if(r){const o=n.style||(n.style={});o[e.stylePropertyNameCase==="css"?"text-align":"textAlign"]=r}return n}function nl(e,t){const n={};for(const r of t.attributes)if(r.type==="mdxJsxExpressionAttribute")if(r.data&&r.data.estree&&e.evaluater){const o=r.data.estree.body[0];o.type;const l=o.expression;l.type;const a=l.properties[0];a.type,Object.assign(n,e.evaluater.evaluateExpression(a.argument))}else We(e,t.position);else{const i=r.name;let o;if(r.value&&typeof r.value=="object")if(r.value.data&&r.value.data.estree&&e.evaluater){const a=r.value.data.estree.body[0];a.type,o=e.evaluater.evaluateExpression(a.expression)}else We(e,t.position);else o=r.value===null?!0:r.value;n[i]=o}return n}function Wn(e,t){const n=[];let r=-1;const i=e.passKeys?new Map:Hi;for(;++ri?0:i+t:t=t>i?i:t,n=n>0?n:0,r.length<1e4)l=Array.from(r),l.unshift(t,n),e.splice(...l);else for(n&&e.splice(t,n);o0?(ie(e,e.length,0,t),e):t}const Ct={}.hasOwnProperty;function gr(e){const t={};let n=-1;for(;++n13&&n<32||n>126&&n<160||n>55295&&n<57344||n>64975&&n<65008||(n&65535)===65535||(n&65535)===65534||n>1114111?"�":String.fromCodePoint(n)}function ce(e){return e.replace(/[\t\n\r ]+/g," ").replace(/^ | $/g,"").toLowerCase().toUpperCase()}const J=be(/[A-Za-z]/),X=be(/[\dA-Za-z]/),fl=be(/[#-'*+\--9=?A-Z^-~]/);function rn(e){return e!==null&&(e<32||e===127)}const Rn=be(/\d/),hl=be(/[\dA-Fa-f]/),pl=be(/[!-/:-@[-`{-~]/);function z(e){return e!==null&&e<-2}function W(e){return e!==null&&(e<0||e===32)}function O(e){return e===-2||e===-1||e===32}const un=be(new RegExp("\\p{P}|\\p{S}","u")),Te=be(/\s/);function be(e){return t;function t(n){return n!==null&&n>-1&&e.test(String.fromCharCode(n))}}function _e(e){const t=[];let n=-1,r=0,i=0;for(;++n55295&&o<57344){const a=e.charCodeAt(n+1);o<56320&&a>56319&&a<57344?(l=String.fromCharCode(o,a),i=1):l="�"}else l=String.fromCharCode(o);l&&(t.push(e.slice(r,n),encodeURIComponent(l)),r=n+i+1,l=""),i&&(n+=i,i=0)}return t.join("")+e.slice(r)}function B(e,t,n,r){const i=r?r-1:Number.POSITIVE_INFINITY;let o=0;return l;function l(u){return O(u)?(e.enter(n),a(u)):t(u)}function a(u){return O(u)&&o++l))return;const M=t.events.length;let H=M,j,k;for(;H--;)if(t.events[H][0]==="exit"&&t.events[H][1].type==="chunkFlow"){if(j){k=t.events[H][1].end;break}j=!0}for(y(r),b=M;bC;){const _=n[R];t.containerState=_[1],_[0].exit.call(t,e)}n.length=C}function I(){i.write([null]),o=void 0,i=void 0,t.containerState._closeFlow=void 0}}function kl(e,t,n){return B(e,e.attempt(this.parser.constructs.document,t,n),"linePrefix",this.parser.constructs.disable.null.includes("codeIndented")?void 0:4)}function Fe(e){if(e===null||W(e)||Te(e))return 1;if(un(e))return 2}function sn(e,t,n){const r=[];let i=-1;for(;++i1&&e[n][1].end.offset-e[n][1].start.offset>1?2:1;const c={...e[r][1].end},p={...e[n][1].start};It(c,-u),It(p,u),l={type:u>1?"strongSequence":"emphasisSequence",start:c,end:{...e[r][1].end}},a={type:u>1?"strongSequence":"emphasisSequence",start:{...e[n][1].start},end:p},o={type:u>1?"strongText":"emphasisText",start:{...e[r][1].end},end:{...e[n][1].start}},i={type:u>1?"strong":"emphasis",start:{...l.start},end:{...a.end}},e[r][1].end={...l.start},e[n][1].start={...a.end},s=[],e[r][1].end.offset-e[r][1].start.offset&&(s=le(s,[["enter",e[r][1],t],["exit",e[r][1],t]])),s=le(s,[["enter",i,t],["enter",l,t],["exit",l,t],["enter",o,t]]),s=le(s,sn(t.parser.constructs.insideSpan.null,e.slice(r+1,n),t)),s=le(s,[["exit",o,t],["enter",a,t],["exit",a,t],["exit",i,t]]),e[n][1].end.offset-e[n][1].start.offset?(f=2,s=le(s,[["enter",e[n][1],t],["exit",e[n][1],t]])):f=0,ie(e,r-1,n-r+3,s),n=r+s.length-f-2;break}}for(n=-1;++n0&&O(b)?B(e,I,"linePrefix",o+1)(b):I(b)}function I(b){return b===null||z(b)?e.check(Tt,w,R)(b):(e.enter("codeFlowValue"),C(b))}function C(b){return b===null||z(b)?(e.exit("codeFlowValue"),I(b)):(e.consume(b),C)}function R(b){return e.exit("codeFenced"),t(b)}function _(b,M,H){let j=0;return k;function k(A){return b.enter("lineEnding"),b.consume(A),b.exit("lineEnding"),v}function v(A){return b.enter("codeFencedFence"),O(A)?B(b,P,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(A):P(A)}function P(A){return A===a?(b.enter("codeFencedFenceSequence"),U(A)):H(A)}function U(A){return A===a?(j++,b.consume(A),U):j>=l?(b.exit("codeFencedFenceSequence"),O(A)?B(b,D,"whitespace")(A):D(A)):H(A)}function D(A){return A===null||z(A)?(b.exit("codeFencedFence"),M(A)):H(A)}}}function zl(e,t,n){const r=this;return i;function i(l){return l===null?n(l):(e.enter("lineEnding"),e.consume(l),e.exit("lineEnding"),o)}function o(l){return r.parser.lazy[r.now().line]?n(l):t(l)}}const gn={name:"codeIndented",tokenize:Ll},Dl={partial:!0,tokenize:Fl};function Ll(e,t,n){const r=this;return i;function i(s){return e.enter("codeIndented"),B(e,o,"linePrefix",5)(s)}function o(s){const f=r.events[r.events.length-1];return f&&f[1].type==="linePrefix"&&f[2].sliceSerialize(f[1],!0).length>=4?l(s):n(s)}function l(s){return s===null?u(s):z(s)?e.attempt(Dl,l,u)(s):(e.enter("codeFlowValue"),a(s))}function a(s){return s===null||z(s)?(e.exit("codeFlowValue"),l(s)):(e.consume(s),a)}function u(s){return e.exit("codeIndented"),t(s)}}function Fl(e,t,n){const r=this;return i;function i(l){return r.parser.lazy[r.now().line]?n(l):z(l)?(e.enter("lineEnding"),e.consume(l),e.exit("lineEnding"),i):B(e,o,"linePrefix",5)(l)}function o(l){const a=r.events[r.events.length-1];return a&&a[1].type==="linePrefix"&&a[2].sliceSerialize(a[1],!0).length>=4?t(l):z(l)?i(l):n(l)}}const Rl={name:"codeText",previous:Ol,resolve:_l,tokenize:Ml};function _l(e){let t=e.length-4,n=3,r,i;if((e[n][1].type==="lineEnding"||e[n][1].type==="space")&&(e[t][1].type==="lineEnding"||e[t][1].type==="space")){for(r=n;++r=this.left.length+this.right.length)throw new RangeError("Cannot access index `"+t+"` in a splice buffer of size `"+(this.left.length+this.right.length)+"`");return tthis.left.length?this.right.slice(this.right.length-r+this.left.length,this.right.length-t+this.left.length).reverse():this.left.slice(t).concat(this.right.slice(this.right.length-r+this.left.length).reverse())}splice(t,n,r){const i=n||0;this.setCursor(Math.trunc(t));const o=this.right.splice(this.right.length-i,Number.POSITIVE_INFINITY);return r&&He(this.left,r),o.reverse()}pop(){return this.setCursor(Number.POSITIVE_INFINITY),this.left.pop()}push(t){this.setCursor(Number.POSITIVE_INFINITY),this.left.push(t)}pushMany(t){this.setCursor(Number.POSITIVE_INFINITY),He(this.left,t)}unshift(t){this.setCursor(0),this.right.push(t)}unshiftMany(t){this.setCursor(0),He(this.right,t.reverse())}setCursor(t){if(!(t===this.left.length||t>this.left.length&&this.right.length===0||t<0&&this.left.length===0))if(t=4?t(l):e.interrupt(r.parser.constructs.flow,n,t)(l)}}function Sr(e,t,n,r,i,o,l,a,u){const s=u||Number.POSITIVE_INFINITY;let f=0;return c;function c(y){return y===60?(e.enter(r),e.enter(i),e.enter(o),e.consume(y),e.exit(o),p):y===null||y===32||y===41||rn(y)?n(y):(e.enter(r),e.enter(l),e.enter(a),e.enter("chunkString",{contentType:"string"}),w(y))}function p(y){return y===62?(e.enter(o),e.consume(y),e.exit(o),e.exit(i),e.exit(r),t):(e.enter(a),e.enter("chunkString",{contentType:"string"}),h(y))}function h(y){return y===62?(e.exit("chunkString"),e.exit(a),p(y)):y===null||y===60||z(y)?n(y):(e.consume(y),y===92?g:h)}function g(y){return y===60||y===62||y===92?(e.consume(y),h):h(y)}function w(y){return!f&&(y===null||y===41||W(y))?(e.exit("chunkString"),e.exit(a),e.exit(l),e.exit(r),t(y)):f999||h===null||h===91||h===93&&!u||h===94&&!a&&"_hiddenFootnoteSupport"in l.parser.constructs?n(h):h===93?(e.exit(o),e.enter(i),e.consume(h),e.exit(i),e.exit(r),t):z(h)?(e.enter("lineEnding"),e.consume(h),e.exit("lineEnding"),f):(e.enter("chunkString",{contentType:"string"}),c(h))}function c(h){return h===null||h===91||h===93||z(h)||a++>999?(e.exit("chunkString"),f(h)):(e.consume(h),u||(u=!O(h)),h===92?p:c)}function p(h){return h===91||h===92||h===93?(e.consume(h),a++,c):c(h)}}function Er(e,t,n,r,i,o){let l;return a;function a(p){return p===34||p===39||p===40?(e.enter(r),e.enter(i),e.consume(p),e.exit(i),l=p===40?41:p,u):n(p)}function u(p){return p===l?(e.enter(i),e.consume(p),e.exit(i),e.exit(r),t):(e.enter(o),s(p))}function s(p){return p===l?(e.exit(o),u(l)):p===null?n(p):z(p)?(e.enter("lineEnding"),e.consume(p),e.exit("lineEnding"),B(e,s,"linePrefix")):(e.enter("chunkString",{contentType:"string"}),f(p))}function f(p){return p===l||p===null||z(p)?(e.exit("chunkString"),s(p)):(e.consume(p),p===92?c:f)}function c(p){return p===l||p===92?(e.consume(p),f):f(p)}}function Ve(e,t){let n;return r;function r(i){return z(i)?(e.enter("lineEnding"),e.consume(i),e.exit("lineEnding"),n=!0,r):O(i)?B(e,r,n?"linePrefix":"lineSuffix")(i):t(i)}}const $l={name:"definition",tokenize:Yl},Wl={partial:!0,tokenize:Kl};function Yl(e,t,n){const r=this;let i;return o;function o(h){return e.enter("definition"),l(h)}function l(h){return Cr.call(r,e,a,n,"definitionLabel","definitionLabelMarker","definitionLabelString")(h)}function a(h){return i=ce(r.sliceSerialize(r.events[r.events.length-1][1]).slice(1,-1)),h===58?(e.enter("definitionMarker"),e.consume(h),e.exit("definitionMarker"),u):n(h)}function u(h){return W(h)?Ve(e,s)(h):s(h)}function s(h){return Sr(e,f,n,"definitionDestination","definitionDestinationLiteral","definitionDestinationLiteralMarker","definitionDestinationRaw","definitionDestinationString")(h)}function f(h){return e.attempt(Wl,c,c)(h)}function c(h){return O(h)?B(e,p,"whitespace")(h):p(h)}function p(h){return h===null||z(h)?(e.exit("definition"),r.parser.defined.push(i),t(h)):n(h)}}function Kl(e,t,n){return r;function r(a){return W(a)?Ve(e,i)(a):n(a)}function i(a){return Er(e,o,n,"definitionTitle","definitionTitleMarker","definitionTitleString")(a)}function o(a){return O(a)?B(e,l,"whitespace")(a):l(a)}function l(a){return a===null||z(a)?t(a):n(a)}}const Ql={name:"hardBreakEscape",tokenize:Xl};function Xl(e,t,n){return r;function r(o){return e.enter("hardBreakEscape"),e.consume(o),i}function i(o){return z(o)?(e.exit("hardBreakEscape"),t(o)):n(o)}}const Gl={name:"headingAtx",resolve:Jl,tokenize:Zl};function Jl(e,t){let n=e.length-2,r=3,i,o;return e[r][1].type==="whitespace"&&(r+=2),n-2>r&&e[n][1].type==="whitespace"&&(n-=2),e[n][1].type==="atxHeadingSequence"&&(r===n-1||n-4>r&&e[n-2][1].type==="whitespace")&&(n-=r+1===n?2:4),n>r&&(i={type:"atxHeadingText",start:e[r][1].start,end:e[n][1].end},o={type:"chunkText",start:e[r][1].start,end:e[n][1].end,contentType:"text"},ie(e,r,n-r+1,[["enter",i,t],["enter",o,t],["exit",o,t],["exit",i,t]])),e}function Zl(e,t,n){let r=0;return i;function i(f){return e.enter("atxHeading"),o(f)}function o(f){return e.enter("atxHeadingSequence"),l(f)}function l(f){return f===35&&r++<6?(e.consume(f),l):f===null||W(f)?(e.exit("atxHeadingSequence"),a(f)):n(f)}function a(f){return f===35?(e.enter("atxHeadingSequence"),u(f)):f===null||z(f)?(e.exit("atxHeading"),t(f)):O(f)?B(e,a,"whitespace")(f):(e.enter("atxHeadingText"),s(f))}function u(f){return f===35?(e.consume(f),u):(e.exit("atxHeadingSequence"),a(f))}function s(f){return f===null||f===35||W(f)?(e.exit("atxHeadingText"),a(f)):(e.consume(f),s)}}const eo=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","nav","noframes","ol","optgroup","option","p","param","search","section","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"],vt=["pre","script","style","textarea"],no={concrete:!0,name:"htmlFlow",resolveTo:io,tokenize:lo},to={partial:!0,tokenize:ao},ro={partial:!0,tokenize:oo};function io(e){let t=e.length;for(;t--&&!(e[t][0]==="enter"&&e[t][1].type==="htmlFlow"););return t>1&&e[t-2][1].type==="linePrefix"&&(e[t][1].start=e[t-2][1].start,e[t+1][1].start=e[t-2][1].start,e.splice(t-2,2)),e}function lo(e,t,n){const r=this;let i,o,l,a,u;return s;function s(d){return f(d)}function f(d){return e.enter("htmlFlow"),e.enter("htmlFlowData"),e.consume(d),c}function c(d){return d===33?(e.consume(d),p):d===47?(e.consume(d),o=!0,w):d===63?(e.consume(d),i=3,r.interrupt?t:m):J(d)?(e.consume(d),l=String.fromCharCode(d),S):n(d)}function p(d){return d===45?(e.consume(d),i=2,h):d===91?(e.consume(d),i=5,a=0,g):J(d)?(e.consume(d),i=4,r.interrupt?t:m):n(d)}function h(d){return d===45?(e.consume(d),r.interrupt?t:m):n(d)}function g(d){const ue="CDATA[";return d===ue.charCodeAt(a++)?(e.consume(d),a===ue.length?r.interrupt?t:P:g):n(d)}function w(d){return J(d)?(e.consume(d),l=String.fromCharCode(d),S):n(d)}function S(d){if(d===null||d===47||d===62||W(d)){const ue=d===47,we=l.toLowerCase();return!ue&&!o&&vt.includes(we)?(i=1,r.interrupt?t(d):P(d)):eo.includes(l.toLowerCase())?(i=6,ue?(e.consume(d),y):r.interrupt?t(d):P(d)):(i=7,r.interrupt&&!r.parser.lazy[r.now().line]?n(d):o?I(d):C(d))}return d===45||X(d)?(e.consume(d),l+=String.fromCharCode(d),S):n(d)}function y(d){return d===62?(e.consume(d),r.interrupt?t:P):n(d)}function I(d){return O(d)?(e.consume(d),I):k(d)}function C(d){return d===47?(e.consume(d),k):d===58||d===95||J(d)?(e.consume(d),R):O(d)?(e.consume(d),C):k(d)}function R(d){return d===45||d===46||d===58||d===95||X(d)?(e.consume(d),R):_(d)}function _(d){return d===61?(e.consume(d),b):O(d)?(e.consume(d),_):C(d)}function b(d){return d===null||d===60||d===61||d===62||d===96?n(d):d===34||d===39?(e.consume(d),u=d,M):O(d)?(e.consume(d),b):H(d)}function M(d){return d===u?(e.consume(d),u=null,j):d===null||z(d)?n(d):(e.consume(d),M)}function H(d){return d===null||d===34||d===39||d===47||d===60||d===61||d===62||d===96||W(d)?_(d):(e.consume(d),H)}function j(d){return d===47||d===62||O(d)?C(d):n(d)}function k(d){return d===62?(e.consume(d),v):n(d)}function v(d){return d===null||z(d)?P(d):O(d)?(e.consume(d),v):n(d)}function P(d){return d===45&&i===2?(e.consume(d),q):d===60&&i===1?(e.consume(d),K):d===62&&i===4?(e.consume(d),ae):d===63&&i===3?(e.consume(d),m):d===93&&i===5?(e.consume(d),pe):z(d)&&(i===6||i===7)?(e.exit("htmlFlowData"),e.check(to,me,U)(d)):d===null||z(d)?(e.exit("htmlFlowData"),U(d)):(e.consume(d),P)}function U(d){return e.check(ro,D,me)(d)}function D(d){return e.enter("lineEnding"),e.consume(d),e.exit("lineEnding"),A}function A(d){return d===null||z(d)?U(d):(e.enter("htmlFlowData"),P(d))}function q(d){return d===45?(e.consume(d),m):P(d)}function K(d){return d===47?(e.consume(d),l="",oe):P(d)}function oe(d){if(d===62){const ue=l.toLowerCase();return vt.includes(ue)?(e.consume(d),ae):P(d)}return J(d)&&l.length<8?(e.consume(d),l+=String.fromCharCode(d),oe):P(d)}function pe(d){return d===93?(e.consume(d),m):P(d)}function m(d){return d===62?(e.consume(d),ae):d===45&&i===2?(e.consume(d),m):P(d)}function ae(d){return d===null||z(d)?(e.exit("htmlFlowData"),me(d)):(e.consume(d),ae)}function me(d){return e.exit("htmlFlow"),t(d)}}function oo(e,t,n){const r=this;return i;function i(l){return z(l)?(e.enter("lineEnding"),e.consume(l),e.exit("lineEnding"),o):n(l)}function o(l){return r.parser.lazy[r.now().line]?n(l):t(l)}}function ao(e,t,n){return r;function r(i){return e.enter("lineEnding"),e.consume(i),e.exit("lineEnding"),e.attempt(Qe,t,n)}}const uo={name:"htmlText",tokenize:so};function so(e,t,n){const r=this;let i,o,l;return a;function a(m){return e.enter("htmlText"),e.enter("htmlTextData"),e.consume(m),u}function u(m){return m===33?(e.consume(m),s):m===47?(e.consume(m),_):m===63?(e.consume(m),C):J(m)?(e.consume(m),H):n(m)}function s(m){return m===45?(e.consume(m),f):m===91?(e.consume(m),o=0,g):J(m)?(e.consume(m),I):n(m)}function f(m){return m===45?(e.consume(m),h):n(m)}function c(m){return m===null?n(m):m===45?(e.consume(m),p):z(m)?(l=c,K(m)):(e.consume(m),c)}function p(m){return m===45?(e.consume(m),h):c(m)}function h(m){return m===62?q(m):m===45?p(m):c(m)}function g(m){const ae="CDATA[";return m===ae.charCodeAt(o++)?(e.consume(m),o===ae.length?w:g):n(m)}function w(m){return m===null?n(m):m===93?(e.consume(m),S):z(m)?(l=w,K(m)):(e.consume(m),w)}function S(m){return m===93?(e.consume(m),y):w(m)}function y(m){return m===62?q(m):m===93?(e.consume(m),y):w(m)}function I(m){return m===null||m===62?q(m):z(m)?(l=I,K(m)):(e.consume(m),I)}function C(m){return m===null?n(m):m===63?(e.consume(m),R):z(m)?(l=C,K(m)):(e.consume(m),C)}function R(m){return m===62?q(m):C(m)}function _(m){return J(m)?(e.consume(m),b):n(m)}function b(m){return m===45||X(m)?(e.consume(m),b):M(m)}function M(m){return z(m)?(l=M,K(m)):O(m)?(e.consume(m),M):q(m)}function H(m){return m===45||X(m)?(e.consume(m),H):m===47||m===62||W(m)?j(m):n(m)}function j(m){return m===47?(e.consume(m),q):m===58||m===95||J(m)?(e.consume(m),k):z(m)?(l=j,K(m)):O(m)?(e.consume(m),j):q(m)}function k(m){return m===45||m===46||m===58||m===95||X(m)?(e.consume(m),k):v(m)}function v(m){return m===61?(e.consume(m),P):z(m)?(l=v,K(m)):O(m)?(e.consume(m),v):j(m)}function P(m){return m===null||m===60||m===61||m===62||m===96?n(m):m===34||m===39?(e.consume(m),i=m,U):z(m)?(l=P,K(m)):O(m)?(e.consume(m),P):(e.consume(m),D)}function U(m){return m===i?(e.consume(m),i=void 0,A):m===null?n(m):z(m)?(l=U,K(m)):(e.consume(m),U)}function D(m){return m===null||m===34||m===39||m===60||m===61||m===96?n(m):m===47||m===62||W(m)?j(m):(e.consume(m),D)}function A(m){return m===47||m===62||W(m)?j(m):n(m)}function q(m){return m===62?(e.consume(m),e.exit("htmlTextData"),e.exit("htmlText"),t):n(m)}function K(m){return e.exit("htmlTextData"),e.enter("lineEnding"),e.consume(m),e.exit("lineEnding"),oe}function oe(m){return O(m)?B(e,pe,"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(m):pe(m)}function pe(m){return e.enter("htmlTextData"),l(m)}}const Qn={name:"labelEnd",resolveAll:po,resolveTo:mo,tokenize:go},co={tokenize:yo},fo={tokenize:ko},ho={tokenize:xo};function po(e){let t=-1;const n=[];for(;++t=3&&(s===null||z(s))?(e.exit("thematicBreak"),t(s)):n(s)}function u(s){return s===i?(e.consume(s),r++,u):(e.exit("thematicBreakSequence"),O(s)?B(e,a,"whitespace")(s):a(s))}}const Z={continuation:{tokenize:Po},exit:Do,name:"list",tokenize:vo},To={partial:!0,tokenize:Lo},Ao={partial:!0,tokenize:zo};function vo(e,t,n){const r=this,i=r.events[r.events.length-1];let o=i&&i[1].type==="linePrefix"?i[2].sliceSerialize(i[1],!0).length:0,l=0;return a;function a(h){const g=r.containerState.type||(h===42||h===43||h===45?"listUnordered":"listOrdered");if(g==="listUnordered"?!r.containerState.marker||h===r.containerState.marker:Rn(h)){if(r.containerState.type||(r.containerState.type=g,e.enter(g,{_container:!0})),g==="listUnordered")return e.enter("listItemPrefix"),h===42||h===45?e.check(tn,n,s)(h):s(h);if(!r.interrupt||h===49)return e.enter("listItemPrefix"),e.enter("listItemValue"),u(h)}return n(h)}function u(h){return Rn(h)&&++l<10?(e.consume(h),u):(!r.interrupt||l<2)&&(r.containerState.marker?h===r.containerState.marker:h===41||h===46)?(e.exit("listItemValue"),s(h)):n(h)}function s(h){return e.enter("listItemMarker"),e.consume(h),e.exit("listItemMarker"),r.containerState.marker=r.containerState.marker||h,e.check(Qe,r.interrupt?n:f,e.attempt(To,p,c))}function f(h){return r.containerState.initialBlankLine=!0,o++,p(h)}function c(h){return O(h)?(e.enter("listItemPrefixWhitespace"),e.consume(h),e.exit("listItemPrefixWhitespace"),p):n(h)}function p(h){return r.containerState.size=o+r.sliceSerialize(e.exit("listItemPrefix"),!0).length,t(h)}}function Po(e,t,n){const r=this;return r.containerState._closeFlow=void 0,e.check(Qe,i,o);function i(a){return r.containerState.furtherBlankLines=r.containerState.furtherBlankLines||r.containerState.initialBlankLine,B(e,t,"listItemIndent",r.containerState.size+1)(a)}function o(a){return r.containerState.furtherBlankLines||!O(a)?(r.containerState.furtherBlankLines=void 0,r.containerState.initialBlankLine=void 0,l(a)):(r.containerState.furtherBlankLines=void 0,r.containerState.initialBlankLine=void 0,e.attempt(Ao,t,l)(a))}function l(a){return r.containerState._closeFlow=!0,r.interrupt=void 0,B(e,e.attempt(Z,t,n),"linePrefix",r.parser.constructs.disable.null.includes("codeIndented")?void 0:4)(a)}}function zo(e,t,n){const r=this;return B(e,i,"listItemIndent",r.containerState.size+1);function i(o){const l=r.events[r.events.length-1];return l&&l[1].type==="listItemIndent"&&l[2].sliceSerialize(l[1],!0).length===r.containerState.size?t(o):n(o)}}function Do(e){e.exit(this.containerState.type)}function Lo(e,t,n){const r=this;return B(e,i,"listItemPrefixWhitespace",r.parser.constructs.disable.null.includes("codeIndented")?void 0:5);function i(o){const l=r.events[r.events.length-1];return!O(o)&&l&&l[1].type==="listItemPrefixWhitespace"?t(o):n(o)}}const Pt={name:"setextUnderline",resolveTo:Fo,tokenize:Ro};function Fo(e,t){let n=e.length,r,i,o;for(;n--;)if(e[n][0]==="enter"){if(e[n][1].type==="content"){r=n;break}e[n][1].type==="paragraph"&&(i=n)}else e[n][1].type==="content"&&e.splice(n,1),!o&&e[n][1].type==="definition"&&(o=n);const l={type:"setextHeading",start:{...e[r][1].start},end:{...e[e.length-1][1].end}};return e[i][1].type="setextHeadingText",o?(e.splice(i,0,["enter",l,t]),e.splice(o+1,0,["exit",e[r][1],t]),e[r][1].end={...e[o][1].end}):e[r][1]=l,e.push(["exit",l,t]),e}function Ro(e,t,n){const r=this;let i;return o;function o(s){let f=r.events.length,c;for(;f--;)if(r.events[f][1].type!=="lineEnding"&&r.events[f][1].type!=="linePrefix"&&r.events[f][1].type!=="content"){c=r.events[f][1].type==="paragraph";break}return!r.parser.lazy[r.now().line]&&(r.interrupt||c)?(e.enter("setextHeadingLine"),i=s,l(s)):n(s)}function l(s){return e.enter("setextHeadingLineSequence"),a(s)}function a(s){return s===i?(e.consume(s),a):(e.exit("setextHeadingLineSequence"),O(s)?B(e,u,"lineSuffix")(s):u(s))}function u(s){return s===null||z(s)?(e.exit("setextHeadingLine"),t(s)):n(s)}}const _o={tokenize:Oo};function Oo(e){const t=this,n=e.attempt(Qe,r,e.attempt(this.parser.constructs.flowInitial,i,B(e,e.attempt(this.parser.constructs.flow,i,e.attempt(jl,i)),"linePrefix")));return n;function r(o){if(o===null){e.consume(o);return}return e.enter("lineEndingBlank"),e.consume(o),e.exit("lineEndingBlank"),t.currentConstruct=void 0,n}function i(o){if(o===null){e.consume(o);return}return e.enter("lineEnding"),e.consume(o),e.exit("lineEnding"),t.currentConstruct=void 0,n}}const Mo={resolveAll:Tr()},No=Ir("string"),Bo=Ir("text");function Ir(e){return{resolveAll:Tr(e==="text"?jo:void 0),tokenize:t};function t(n){const r=this,i=this.parser.constructs[e],o=n.attempt(i,l,a);return l;function l(f){return s(f)?o(f):a(f)}function a(f){if(f===null){n.consume(f);return}return n.enter("data"),n.consume(f),u}function u(f){return s(f)?(n.exit("data"),o(f)):(n.consume(f),u)}function s(f){if(f===null)return!0;const c=i[f];let p=-1;if(c)for(;++p-1){const a=l[0];typeof a=="string"?l[0]=a.slice(r):l.shift()}o>0&&l.push(e[i].slice(0,o))}return l}function Zo(e,t){let n=-1;const r=[];let i;for(;++n0){const se=F.tokenStack[F.tokenStack.length-1];(se[1]||Dt).call(F,void 0,se[0])}for(T.position={start:xe(x.length>0?x[0][1].start:{line:1,column:1,offset:0}),end:xe(x.length>0?x[x.length-2][1].end:{line:1,column:1,offset:0})},V=-1;++V!r.user_id.startsWith("apikey-")).map(r=>({id:r.user_id,name:r.alias?`${r.user_id} (${r.alias})`:r.user_id})),[o,c]=l.useState(t),x=o.trim().toLowerCase(),y=u.filter(r=>!x||r.id.toLowerCase().includes(x)||r.name.toLowerCase().includes(x)).slice(0,50),p=r=>{const m=r.trim(),j=u.find(v=>v.id===m||v.name===m);return j?j.id:m},d=p(o),h=u.some(r=>r.id===d),f=d!==""&&!h?e.jsxs("span",{children:["Creates a new user ",e.jsx("code",{children:d}),"."]}):i??"Spend and budgets track against this user.";return e.jsxs(P.Root,{allowsCustomValue:!0,allowsEmptyCollection:!0,menuTrigger:"focus",inputValue:o,onInputChange:r=>{c(r),a(p(r))},onSelectionChange:r=>{if(r!=null){const m=String(r);c(m),a(m)}},className:"flex max-w-md flex-col gap-1",children:[e.jsx(ce,{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Owner"}),e.jsxs(P.InputGroup,{children:[e.jsx(de,{placeholder:"Pick a user, or type a new id…",autoComplete:"off","data-1p-ignore":!0,"data-lpignore":"true",onFocus:r=>r.currentTarget.select()}),e.jsx(P.Trigger,{})]}),e.jsx(P.Popover,{children:e.jsx(ue,{items:y,className:"max-h-72 overflow-auto",children:r=>e.jsx(me,{id:r.id,textValue:r.name,children:r.name})})}),e.jsx(xe,{className:"text-xs text-[var(--otari-muted)]",children:f})]})}function H(t){if(!t)return"—";const a=new Date(t);return Number.isNaN(a.getTime())?"—":a.toLocaleDateString()}function fe(t){if(!t)return null;const a=new Date(t).getTime();if(Number.isNaN(a))return null;const n=Math.round((a-Date.now())/1e3),i=Math.abs(n),u=[["day",86400],["hour",3600],["minute",60]],o=new Intl.RelativeTimeFormat(void 0,{numeric:"auto"});for(const[c,x]of u)if(i>=x)return o.format(Math.round(n/x),c);return o.format(n,"second")}function pe(t){if(!t.expires_at)return!1;const a=new Date(t.expires_at).getTime();return!Number.isNaN(a)&&aString(i).padStart(2,"0");return`${a.getFullYear()}-${n(a.getMonth()+1)}-${n(a.getDate())}T${n(a.getHours())}:${n(a.getMinutes())}`}const ye=t=>(t??"").startsWith("apikey-"),M=t=>t.key_name??t.id,ve=t=>t.id;function K({label:t,value:a,multiline:n=!1,fieldRef:i}){const u=l.useRef(null),o=i??u,[c,x]=l.useState(!1),[y,p]=l.useState(!1),d=async()=>{var f,r,m;(f=o.current)==null||f.focus(),(r=o.current)==null||r.select();try{if((m=navigator.clipboard)!=null&&m.writeText){await navigator.clipboard.writeText(a),x(!0),p(!1),window.setTimeout(()=>x(!1),2e3);return}}catch{}p(!0)},h="w-full rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-3 py-2 font-mono text-xs text-[var(--otari-ink)]";return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-xs font-medium text-[var(--otari-muted)]",children:t}),e.jsx(g,{size:"sm",variant:"outline",onPress:d,children:c?"Copied":"Copy"})]}),n?e.jsx("textarea",{ref:o,readOnly:!0,rows:a.split(` +import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as l}from"./react-dgEcD0HR.js";import{a as Q,s as q,t as X,v as Z,P as ee,E as O,q as te,w as se,u as U,I as ae}from"./index-DV8qvdUj.js";import{u as ne,r as re,B as ie}from"./tableSelection-9hV37uhu.js";import{C as le}from"./ConfirmDialog-KvA7b1-a.js";import{D as oe}from"./DataTable-Bmn_eYSV.js";import{F as D}from"./Field-Dwp6u3t8.js";import{a as F,M as W}from"./ModelScopeControl-u-XlXgXz.js";import{C as P,L as ce,I as de,a as ue,b as me,D as xe,f as A,B as g,d as I}from"./heroui-BI50yK5B.js";function he({value:t,onChange:a,users:n,description:i}){const u=n.filter(r=>!r.user_id.startsWith("apikey-")).map(r=>({id:r.user_id,name:r.alias?`${r.user_id} (${r.alias})`:r.user_id})),[o,c]=l.useState(t),x=o.trim().toLowerCase(),y=u.filter(r=>!x||r.id.toLowerCase().includes(x)||r.name.toLowerCase().includes(x)).slice(0,50),p=r=>{const m=r.trim(),j=u.find(v=>v.id===m||v.name===m);return j?j.id:m},d=p(o),h=u.some(r=>r.id===d),f=d!==""&&!h?e.jsxs("span",{children:["Creates a new user ",e.jsx("code",{children:d}),"."]}):i??"Spend and budgets track against this user.";return e.jsxs(P.Root,{allowsCustomValue:!0,allowsEmptyCollection:!0,menuTrigger:"focus",inputValue:o,onInputChange:r=>{c(r),a(p(r))},onSelectionChange:r=>{if(r!=null){const m=String(r);c(m),a(m)}},className:"flex max-w-md flex-col gap-1",children:[e.jsx(ce,{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Owner"}),e.jsxs(P.InputGroup,{children:[e.jsx(de,{placeholder:"Pick a user, or type a new id…",autoComplete:"off","data-1p-ignore":!0,"data-lpignore":"true",onFocus:r=>r.currentTarget.select()}),e.jsx(P.Trigger,{})]}),e.jsx(P.Popover,{children:e.jsx(ue,{items:y,className:"max-h-72 overflow-auto",children:r=>e.jsx(me,{id:r.id,textValue:r.name,children:r.name})})}),e.jsx(xe,{className:"text-xs text-[var(--otari-muted)]",children:f})]})}function H(t){if(!t)return"—";const a=new Date(t);return Number.isNaN(a.getTime())?"—":a.toLocaleDateString()}function fe(t){if(!t)return null;const a=new Date(t).getTime();if(Number.isNaN(a))return null;const n=Math.round((a-Date.now())/1e3),i=Math.abs(n),u=[["day",86400],["hour",3600],["minute",60]],o=new Intl.RelativeTimeFormat(void 0,{numeric:"auto"});for(const[c,x]of u)if(i>=x)return o.format(Math.round(n/x),c);return o.format(n,"second")}function pe(t){if(!t.expires_at)return!1;const a=new Date(t.expires_at).getTime();return!Number.isNaN(a)&&aString(i).padStart(2,"0");return`${a.getFullYear()}-${n(a.getMonth()+1)}-${n(a.getDate())}T${n(a.getHours())}:${n(a.getMinutes())}`}const ye=t=>(t??"").startsWith("apikey-"),M=t=>t.key_name??t.id,ve=t=>t.id;function K({label:t,value:a,multiline:n=!1,fieldRef:i}){const u=l.useRef(null),o=i??u,[c,x]=l.useState(!1),[y,p]=l.useState(!1),d=async()=>{var f,r,m;(f=o.current)==null||f.focus(),(r=o.current)==null||r.select();try{if((m=navigator.clipboard)!=null&&m.writeText){await navigator.clipboard.writeText(a),x(!0),p(!1),window.setTimeout(()=>x(!1),2e3);return}}catch{}p(!0)},h="w-full rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-3 py-2 font-mono text-xs text-[var(--otari-ink)]";return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-xs font-medium text-[var(--otari-muted)]",children:t}),e.jsx(g,{size:"sm",variant:"outline",onPress:d,children:c?"Copied":"Copy"})]}),n?e.jsx("textarea",{ref:o,readOnly:!0,rows:a.split(` `).length,value:a,onFocus:f=>f.currentTarget.select(),className:`${h} resize-none whitespace-pre`}):e.jsx("input",{ref:o,readOnly:!0,value:a,onFocus:f=>f.currentTarget.select(),className:h}),e.jsx("span",{"aria-live":"polite",className:"text-xs text-green-700",children:c?"Copied to clipboard.":""}),y?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Selected. Press Ctrl/Cmd-C to copy."}):null]})}function je({title:t,result:a,onClose:n}){const i=l.useRef(null),u=l.useRef(null),o=typeof window<"u"?window.location.origin:"",c=a.key;l.useEffect(()=>{var d,h;(d=u.current)==null||d.focus(),(h=u.current)==null||h.select()},[]);const x=d=>{var m;if(d.key!=="Tab")return;const h=(m=i.current)==null?void 0:m.querySelectorAll('button, input, textarea, a[href], [tabindex]:not([tabindex="-1"])');if(!h||h.length===0)return;const f=h[0],r=h[h.length-1];d.shiftKey&&document.activeElement===f?(d.preventDefault(),r.focus()):!d.shiftKey&&document.activeElement===r&&(d.preventDefault(),f.focus())},y=[`curl ${o}/v1/chat/completions \\`,` -H "Otari-Key: ${c}" \\`,' -H "Content-Type: application/json" \\',` -d '{"model": "your-model", "messages": [{"role": "user", "content": "Hello"}]}'`].join(` `),p=["from openai import OpenAI","",`client = OpenAI(base_url="${o}/v1", api_key="${c}")`,"resp = client.chat.completions.create(",' model="your-model",',' messages=[{"role": "user", "content": "Hello"}],',")","print(resp.choices[0].message.content)"].join(` `);return e.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/40 p-4",role:"presentation",children:e.jsxs("div",{ref:i,role:"dialog","aria-modal":"true","aria-labelledby":"reveal-title",onKeyDown:x,className:"flex max-h-[90vh] w-full max-w-2xl flex-col gap-4 overflow-y-auto rounded-xl bg-[var(--otari-surface)] p-6 shadow-xl",children:[e.jsx("h2",{id:"reveal-title",className:"text-lg font-semibold text-[var(--otari-ink)]",children:t}),e.jsx(ae,{tone:"warning",children:"Copy this key now. For security it is shown only once and cannot be retrieved later. If you lose it, use Regenerate to issue a new secret."}),e.jsxs("p",{className:"text-xs text-[var(--otari-muted)]",children:["Model access: ",F(a.allowed_models).text,"."]}),e.jsx(K,{label:"Secret key",value:c,fieldRef:u}),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Make your first call"}),e.jsxs("p",{className:"text-xs text-[var(--otari-muted)]",children:["Replace ",e.jsx("code",{children:"your-model"})," with a model from the Models page."]})]}),e.jsx(K,{label:"curl",value:y,multiline:!0}),e.jsx(K,{label:"Python (OpenAI SDK)",value:p,multiline:!0})]}),e.jsx("div",{className:"flex justify-end",children:e.jsx(g,{variant:"primary",onPress:n,children:"I’ve saved this key"})})]})})}function V({trigger:t,message:a,confirmLabel:n,isPending:i,onConfirm:u}){const[o,c]=l.useState(!1);return o?e.jsxs("div",{className:"flex flex-col items-end gap-1.5 rounded-lg border border-amber-200 bg-amber-50 p-2 text-right",children:[e.jsx("span",{className:"max-w-xs text-xs text-amber-800",children:a}),e.jsxs("span",{className:"inline-flex gap-1",children:[e.jsx(g,{size:"sm",variant:"danger",isDisabled:i,onPress:u,children:n}),e.jsx(g,{size:"sm",variant:"ghost",isDisabled:i,onPress:()=>c(!1),children:"Cancel"})]})]}):e.jsx(g,{size:"sm",variant:"danger-soft",onPress:()=>c(!0),children:t})}function G({userId:t,users:a}){const n=t.trim();if(n==="")return e.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:"Choose an owner above to see the models this key can inherit."});const i=a.find(c=>c.user_id===n);if(!i)return e.jsxs("p",{className:"text-xs text-[var(--otari-muted)]",children:["New user ",e.jsx("code",{children:n})," starts unrestricted, so this key may allow any model."]});const{text:u}=F(i.allowed_models),o=i.allowed_models&&i.allowed_models.length>0?i.allowed_models.join(", "):null;return e.jsxs("p",{className:"text-xs text-[var(--otari-muted)]",children:["Owner ",e.jsx("code",{children:n})," allows ",e.jsx("span",{className:"font-medium text-[var(--otari-ink)]",children:u.toLowerCase()}),o?e.jsxs(e.Fragment,{children:[" (",e.jsx("span",{className:"font-mono",children:o}),")"]}):null,". This key inherits that, or narrows within it."]})}function Y({checked:t,onChange:a}){return e.jsxs("label",{className:"flex items-start gap-2 rounded-lg border border-[var(--otari-line)] p-3 text-sm",children:[e.jsx("input",{type:"checkbox",checked:t,onChange:n=>a(n.target.checked),className:"mt-0.5 h-4 w-4 accent-[var(--otari-brand)]","aria-label":"Exempt this key from budget"}),e.jsxs("span",{className:"flex flex-col gap-0.5",children:[e.jsx("span",{className:"font-medium text-[var(--otari-ink)]",children:"Exempt from budget"}),e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Requests on this key are logged with their cost but never counted toward the owner's budget or spend, and never blocked by it."})]})]})}function be({onClose:t,onCreated:a}){const n=se(),i=U(),[u,o]=l.useState(""),[c,x]=l.useState(""),[y,p]=l.useState(!1),[d,h]=l.useState(""),[f,r]=l.useState(null),[m,j]=l.useState(!1),[v,E]=l.useState(!0),C=c!==""&&new Date(c).getTime(){if(n.isPending||!v||N)return;const b={key_name:u.trim()||null,user_id:d.trim(),expires_at:c?new Date(c).toISOString():null,allowed_models:f,exclude_from_budget:m};n.mutate(b,{onSuccess:w=>{a(w),t()}})};return e.jsx(I,{children:e.jsxs(I.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsx("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Create API key"}),e.jsx(O,{error:n.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(D,{label:"Name",value:u,onChange:o,placeholder:"ci-bot",autoFocus:!0,description:"A label to recognize this key later."}),e.jsx(D,{label:"Expires (optional)",value:c,onChange:x,type:"datetime-local",description:C?e.jsx("span",{className:"text-red-700",children:"That time is in the past; the key would be rejected immediately."}):"Leave blank for a key that never expires."})]}),e.jsx(he,{value:d,onChange:h,users:i.data??[]}),e.jsx("button",{type:"button",className:"self-start text-xs font-medium text-[var(--otari-brand-dark)]",onClick:()=>p(b=>!b),children:y?"Hide advanced":"Advanced"}),y?e.jsxs("div",{className:"flex flex-col gap-4 rounded-lg border border-[var(--otari-line)] p-4",children:[e.jsx(G,{userId:d,users:i.data??[]}),e.jsx(W,{title:"Restrict this key's models",description:"By default this key inherits its owner's access. Optionally narrow it to a subset; a key can never exceed its owner's allowed models.",anyLabel:"Inherit owner access",initial:null,onChange:(b,w)=>{r(b),E(w)}}),e.jsx(Y,{checked:m,onChange:j})]}):null,e.jsxs("div",{className:"flex gap-2",children:[e.jsx(g,{variant:"primary",isDisabled:n.isPending||!v||N,onPress:S,children:n.isPending?"Creating…":"Create key"}),e.jsx(g,{variant:"ghost",onPress:t,children:"Cancel"})]})]})})}function we({apiKey:t,onClose:a}){const n=q(),i=U(),[u,o]=l.useState(t.key_name??""),[c,x]=l.useState(ge(t.expires_at)),[y,p]=l.useState(t.allowed_models),[d,h]=l.useState(t.exclude_from_budget),[f,r]=l.useState(!0),m=()=>{n.isPending||!f||n.mutate({id:t.id,body:{key_name:u.trim()||null,expires_at:c?new Date(c).toISOString():null,allowed_models:y,exclude_from_budget:d}},{onSuccess:a})};return e.jsx(I,{children:e.jsxs(I.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsxs("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:["Edit ",e.jsx("code",{children:t.key_name??t.id})]}),e.jsx(O,{error:n.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(D,{label:"Name",value:u,onChange:o,placeholder:"ci-bot"}),e.jsx(D,{label:"Expires",value:c,onChange:x,type:"datetime-local",description:"Blank clears the expiry."})]}),t.user_id?e.jsx(G,{userId:t.user_id,users:i.data??[]}):null,e.jsx(W,{title:"Restrict this key's models",description:"This key inherits its owner's access by default. Narrow it to a subset here; it can never exceed the owner's allowed models.",anyLabel:"Inherit owner access",initial:t.allowed_models,onChange:(j,v)=>{p(j),r(v)}}),e.jsx(Y,{checked:d,onChange:h}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(g,{variant:"primary",isDisabled:n.isPending||!f,onPress:m,children:n.isPending?"Saving…":"Save changes"}),e.jsx(g,{variant:"ghost",onPress:a,children:"Cancel"})]})]})})}function Ne({apiKey:t}){return t.is_active?pe(t)?e.jsx(A,{size:"sm",color:"warning",children:"Expired"}):e.jsx(A,{size:"sm",color:"accent",children:"Active"}):e.jsx(A,{size:"sm",color:"default",children:"Disabled"})}function ke({allowed:t}){const{text:a,tone:n}=F(t),i=n==="danger"?"text-red-700 font-medium":n==="muted"?"text-[var(--otari-muted)]":"text-[var(--otari-brand-dark)] font-medium",u=t&&t.length>0?t.join(", "):void 0;return e.jsx("span",{className:`text-xs ${i}`,title:u,children:a})}function Re(){const t=Q(),a=q(),n=X(),i=Z(),[u,o]=l.useState(!1),[c,x]=l.useState(null),[y,p]=l.useState(null),d=t.data??[],h=t.isLoading,f=d.find(s=>s.id===c)??null,r=!h&&d.length===0&&!u,m=ne(),[j,v]=l.useState(!1),[E,C]=l.useState(void 0),[N,S]=l.useState(!1),b=d.map(s=>s.id),w=re(m.selectedKeys,b),T=d.filter(s=>w.includes(s.id)),$=l.useCallback((s,k)=>a.mutate({id:s.id,body:{is_active:k}}),[a.mutate]),z=l.useCallback(s=>n.mutate(s.id,{onSuccess:k=>p({title:`New secret for ${M(s)}`,result:k})}),[n.mutate]),R=async(s,k,B)=>{S(!0),C(void 0);try{for(const L of s)await k(L);m.clear(),B==null||B()}catch(L){C(L)}finally{S(!1)}},J=l.useMemo(()=>[{id:"name",header:"Name",isRowHeader:!0,cell:s=>e.jsxs("div",{className:"flex flex-col gap-0.5",children:[e.jsx("span",{className:"font-medium text-[var(--otari-ink)]",children:s.key_name??e.jsx("span",{className:"text-[var(--otari-muted)]",children:"(unnamed)"})}),e.jsxs("div",{className:"flex flex-wrap items-center gap-1",children:[e.jsx(ke,{allowed:s.allowed_models}),s.exclude_from_budget?e.jsx("span",{className:"inline-flex items-center rounded-full border border-[var(--otari-line)] bg-[var(--otari-brand-tint)] px-2 py-0.5 text-xs font-medium text-[var(--otari-brand-dark)]",title:"Requests on this key are logged with cost but never counted toward budget",children:"Budget-exempt"}):null]})]})},{id:"status",header:"Status",cell:s=>e.jsx(Ne,{apiKey:s})},{id:"owner",header:"Owner",cell:s=>ye(s.user_id)?e.jsx(A,{size:"sm",color:"default",children:"virtual"}):e.jsx("code",{className:"text-xs text-[var(--otari-muted)]",children:s.user_id??"—"})},{id:"key",header:"Key",cell:s=>e.jsx("code",{className:"text-xs text-[var(--otari-muted)]",children:s.key_prefix?`${s.key_prefix}…`:"—"})},{id:"created",header:"Created",cell:s=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:H(s.created_at)})},{id:"last_used",header:"Last used",cell:s=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:fe(s.last_used_at)??"never"})},{id:"expires",header:"Expires",cell:s=>e.jsx("span",{className:"text-[var(--otari-muted)]",title:s.expires_at?new Date(s.expires_at).toLocaleString():void 0,children:s.expires_at?H(s.expires_at):"never"})},{id:"actions",header:"Actions",align:"end",cell:s=>e.jsxs("div",{className:"flex items-center justify-end gap-1.5",children:[e.jsx(g,{size:"sm",variant:"outline",isDisabled:a.isPending,onPress:()=>$(s,!s.is_active),children:s.is_active?"Disable":"Enable"}),e.jsx(g,{size:"sm",variant:"ghost",onPress:()=>{o(!1),x(s.id)},children:"Edit"}),e.jsx(V,{trigger:"Regenerate",confirmLabel:"Regenerate",isPending:n.isPending,message:e.jsxs(e.Fragment,{children:["Regenerate the secret for ",e.jsx("strong",{children:M(s)}),"? The current secret stops working immediately, with no grace period."]}),onConfirm:()=>z(s)}),s.is_active?null:e.jsx(V,{trigger:"Delete",confirmLabel:"Delete permanently",isPending:i.isPending,message:e.jsxs(e.Fragment,{children:["Permanently delete ",e.jsx("strong",{children:M(s)}),"? This removes the key and unlinks its usage history. Cannot be undone."]}),onConfirm:()=>i.mutate(s.id)})]})}],[a.isPending,n.isPending,i.isPending,i.mutate,$,z]),_=T.filter(s=>!s.is_active);return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(ee,{title:"API keys",description:"Issue and revoke the keys that authenticate callers to this gateway. Secrets are shown once at creation.",action:u?null:e.jsx(g,{variant:"primary",onPress:()=>{x(null),o(!0)},children:"Create key"})}),e.jsx(O,{error:t.error??a.error??n.error??i.error}),r?e.jsx(te,{title:"No API keys yet",description:"An API key authenticates callers to this gateway. Create one to make your first request; the secret is shown once, so keep it somewhere safe.",actionLabel:"Create your first key",onAction:()=>{x(null),o(!0)}}):null,u?e.jsx(be,{onClose:()=>o(!1),onCreated:s=>p({title:"API key created",result:s})}):null,f?e.jsx(we,{apiKey:f,onClose:()=>x(null)},f.id):null,w.length>0?e.jsxs(ie,{selectedCount:w.length,allMatching:!1,matchingTotal:null,canSelectAllMatching:!1,onSelectAllMatching:()=>{},onClear:m.clear,children:[e.jsx(g,{size:"sm",variant:"outline",isDisabled:N,onPress:()=>void R(T,s=>a.mutateAsync({id:s.id,body:{is_active:!1}})),children:"Disable"}),e.jsx(g,{size:"sm",variant:"outline",isDisabled:N,onPress:()=>void R(T,s=>a.mutateAsync({id:s.id,body:{exclude_from_budget:!0}})),children:"Budget-exempt"}),e.jsx(g,{size:"sm",variant:"danger",isDisabled:_.length===0,onPress:()=>v(!0),children:"Delete"})]}):null,r?null:e.jsx(oe,{ariaLabel:"API keys",columns:J,rows:d,getRowKey:ve,isLoading:h,emptyContent:"No API keys yet. Create one to authenticate a caller.",selectionMode:"multiple",selectedKeys:m.selectedKeys,onSelectionChange:m.onSelectionChange}),e.jsx(le,{isOpen:j,onOpenChange:v,heading:"Delete API keys",body:`Permanently delete ${_.length} disabled ${_.length===1?"key":"keys"}? This removes them and unlinks their usage history. Cannot be undone. Active keys in the selection are skipped; disable them first.`,confirmLabel:"Delete permanently",isPending:N,error:E,onConfirm:()=>void R(_,s=>i.mutateAsync(s.id),()=>v(!1))}),y?e.jsx(je,{title:y.title,result:y.result,onClose:()=>{p(null),n.reset()}}):null]})}export{Re as KeysPage}; diff --git a/src/gateway/static/dashboard/assets/ModelScopeControl-OSfbanjb.js b/src/gateway/static/dashboard/assets/ModelScopeControl-u-XlXgXz.js similarity index 98% rename from src/gateway/static/dashboard/assets/ModelScopeControl-OSfbanjb.js rename to src/gateway/static/dashboard/assets/ModelScopeControl-u-XlXgXz.js index 09b6a0d0..89f313b3 100644 --- a/src/gateway/static/dashboard/assets/ModelScopeControl-OSfbanjb.js +++ b/src/gateway/static/dashboard/assets/ModelScopeControl-u-XlXgXz.js @@ -1 +1 @@ -import{j as t}from"./tanstack-query-1t81HyiD.js";import{r as n}from"./react-dgEcD0HR.js";import{L as A,h as $,i as P}from"./index-mAhQhUE6.js";import{C as d,I as R,a as T,b as V}from"./heroui-BI50yK5B.js";function q(r){return r===null?"any":r.length===0?"block":"only"}const O=50;function W({initial:r,onChange:m,title:N="Model access",description:w,anyLabel:C="Any model"}){const x=A(),u=$(),v=P(),[i,L]=n.useState(q(r)),[a,g]=n.useState(r??[]),[p,y]=n.useState(""),f=n.useMemo(()=>{var j,k;const e=new Set,s=[],l=(o,c)=>{o&&!e.has(o)&&(e.add(o),s.push({id:o,label:c}))};for(const o of((j=x.data)==null?void 0:j.providers)??[])l(`${o.instance}:*`,`${o.instance}:* · all ${o.instance} models`);for(const o of((k=u.data)==null?void 0:k.providers)??[])for(const c of o.models)l(c.key,c.key);for(const o of v.data??[])l(o.target,`${o.name} · alias`);return s},[x.data,u.data,v.data]),S=n.useMemo(()=>{const e=p.trim().toLowerCase();return f.filter(s=>!a.includes(s.id)).filter(s=>!e||s.id.toLowerCase().includes(e)||s.label.toLowerCase().includes(e)).slice(0,O)},[f,a,p]),h=(e,s)=>{e==="any"?m(null,!0):e==="block"?m([],!0):m(s,s.length>0)},B=e=>{L(e),h(e,a)},M=e=>{const s=a.includes(e)?a:[...a,e];g(s),y(""),h("only",s)},E=e=>{const s=a.filter(l=>l!==e);g(s),h("only",s)},b=(e,s)=>t.jsx("button",{type:"button","aria-pressed":i===e,onClick:()=>B(e),className:i===e?"rounded-md bg-white px-3 py-1.5 text-sm font-medium text-[var(--otari-ink)] shadow-sm":"rounded-md px-3 py-1.5 text-sm text-[var(--otari-muted)] hover:text-[var(--otari-ink)]",children:s}),I=!u.isLoading&&!x.isLoading&&f.length===0;return t.jsxs("div",{className:"flex flex-col gap-3",children:[t.jsxs("div",{children:[t.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:N}),t.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:w??"Which models this key may list and call. The master key is never restricted, so blocking a key cannot lock you out of the dashboard."})]}),t.jsxs("div",{className:"flex w-fit items-center gap-1 rounded-lg bg-[var(--otari-bg)] p-1",children:[b("any",C),b("only","Only selected"),b("block","Block all")]}),i==="block"?t.jsxs("div",{className:"rounded-lg border border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-800",children:["Blocked from ",t.jsx("strong",{children:"every"})," model until you change this access."]}):null,i==="only"?t.jsxs("div",{className:"flex flex-col gap-2",children:[t.jsx("div",{className:"flex flex-wrap gap-1.5",children:a.length===0?t.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Pick at least one model below, or choose “Block all”."}):a.map(e=>t.jsxs("span",{className:"inline-flex items-center gap-1 rounded-full bg-[var(--otari-brand-tint)] px-2.5 py-1 font-mono text-xs text-[var(--otari-brand-dark)]",children:[e,t.jsx("button",{type:"button","aria-label":`Remove ${e}`,onClick:()=>E(e),className:"text-[var(--otari-brand-dark)] hover:text-red-700",children:"×"})]},e))}),I?t.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"No providers or models discovered yet. Configure a provider first, then scope this key."}):t.jsxs(d.Root,{allowsEmptyCollection:!0,menuTrigger:"input",inputValue:p,onInputChange:y,selectedKey:null,onSelectionChange:e=>{e!=null&&M(String(e))},className:"flex max-w-md flex-col gap-1",children:[t.jsxs(d.InputGroup,{children:[t.jsx(R,{"aria-label":"Add a model",placeholder:"Search providers, models, aliases…",autoComplete:"off"}),t.jsx(d.Trigger,{})]}),t.jsx(d.Popover,{children:t.jsx(T,{items:S,className:"max-h-72 overflow-auto",children:e=>t.jsx(V,{id:e.id,textValue:e.label,children:e.label})})})]})]}):null]})}function X(r){return r===null?{text:"All models",tone:"muted"}:r.length===0?{text:"No models",tone:"danger"}:{text:"Selected models",tone:"normal"}}export{W as M,X as a}; +import{j as t}from"./tanstack-query-1t81HyiD.js";import{r as n}from"./react-dgEcD0HR.js";import{L as A,h as $,i as P}from"./index-DV8qvdUj.js";import{C as d,I as R,a as T,b as V}from"./heroui-BI50yK5B.js";function q(r){return r===null?"any":r.length===0?"block":"only"}const O=50;function W({initial:r,onChange:m,title:N="Model access",description:w,anyLabel:C="Any model"}){const x=A(),u=$(),v=P(),[i,L]=n.useState(q(r)),[a,g]=n.useState(r??[]),[p,y]=n.useState(""),f=n.useMemo(()=>{var j,k;const e=new Set,s=[],l=(o,c)=>{o&&!e.has(o)&&(e.add(o),s.push({id:o,label:c}))};for(const o of((j=x.data)==null?void 0:j.providers)??[])l(`${o.instance}:*`,`${o.instance}:* · all ${o.instance} models`);for(const o of((k=u.data)==null?void 0:k.providers)??[])for(const c of o.models)l(c.key,c.key);for(const o of v.data??[])l(o.target,`${o.name} · alias`);return s},[x.data,u.data,v.data]),S=n.useMemo(()=>{const e=p.trim().toLowerCase();return f.filter(s=>!a.includes(s.id)).filter(s=>!e||s.id.toLowerCase().includes(e)||s.label.toLowerCase().includes(e)).slice(0,O)},[f,a,p]),h=(e,s)=>{e==="any"?m(null,!0):e==="block"?m([],!0):m(s,s.length>0)},B=e=>{L(e),h(e,a)},M=e=>{const s=a.includes(e)?a:[...a,e];g(s),y(""),h("only",s)},E=e=>{const s=a.filter(l=>l!==e);g(s),h("only",s)},b=(e,s)=>t.jsx("button",{type:"button","aria-pressed":i===e,onClick:()=>B(e),className:i===e?"rounded-md bg-white px-3 py-1.5 text-sm font-medium text-[var(--otari-ink)] shadow-sm":"rounded-md px-3 py-1.5 text-sm text-[var(--otari-muted)] hover:text-[var(--otari-ink)]",children:s}),I=!u.isLoading&&!x.isLoading&&f.length===0;return t.jsxs("div",{className:"flex flex-col gap-3",children:[t.jsxs("div",{children:[t.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:N}),t.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:w??"Which models this key may list and call. The master key is never restricted, so blocking a key cannot lock you out of the dashboard."})]}),t.jsxs("div",{className:"flex w-fit items-center gap-1 rounded-lg bg-[var(--otari-bg)] p-1",children:[b("any",C),b("only","Only selected"),b("block","Block all")]}),i==="block"?t.jsxs("div",{className:"rounded-lg border border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-800",children:["Blocked from ",t.jsx("strong",{children:"every"})," model until you change this access."]}):null,i==="only"?t.jsxs("div",{className:"flex flex-col gap-2",children:[t.jsx("div",{className:"flex flex-wrap gap-1.5",children:a.length===0?t.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Pick at least one model below, or choose “Block all”."}):a.map(e=>t.jsxs("span",{className:"inline-flex items-center gap-1 rounded-full bg-[var(--otari-brand-tint)] px-2.5 py-1 font-mono text-xs text-[var(--otari-brand-dark)]",children:[e,t.jsx("button",{type:"button","aria-label":`Remove ${e}`,onClick:()=>E(e),className:"text-[var(--otari-brand-dark)] hover:text-red-700",children:"×"})]},e))}),I?t.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"No providers or models discovered yet. Configure a provider first, then scope this key."}):t.jsxs(d.Root,{allowsEmptyCollection:!0,menuTrigger:"input",inputValue:p,onInputChange:y,selectedKey:null,onSelectionChange:e=>{e!=null&&M(String(e))},className:"flex max-w-md flex-col gap-1",children:[t.jsxs(d.InputGroup,{children:[t.jsx(R,{"aria-label":"Add a model",placeholder:"Search providers, models, aliases…",autoComplete:"off"}),t.jsx(d.Trigger,{})]}),t.jsx(d.Popover,{children:t.jsx(T,{items:S,className:"max-h-72 overflow-auto",children:e=>t.jsx(V,{id:e.id,textValue:e.label,children:e.label})})})]})]}):null]})}function X(r){return r===null?{text:"All models",tone:"muted"}:r.length===0?{text:"No models",tone:"danger"}:{text:"Selected models",tone:"normal"}}export{W as M,X as a}; diff --git a/src/gateway/static/dashboard/assets/ModelsPage-CRpsI3fJ.js b/src/gateway/static/dashboard/assets/ModelsPage-BkzSZx5b.js similarity index 99% rename from src/gateway/static/dashboard/assets/ModelsPage-CRpsI3fJ.js rename to src/gateway/static/dashboard/assets/ModelsPage-BkzSZx5b.js index e12c06f5..0d515be0 100644 --- a/src/gateway/static/dashboard/assets/ModelsPage-CRpsI3fJ.js +++ b/src/gateway/static/dashboard/assets/ModelsPage-BkzSZx5b.js @@ -1 +1 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{i as gt,u as vt,r as c}from"./react-dgEcD0HR.js";import{x as _t,y as bt,h as jt,z as yt,A as je,P as Pt,E as Nt,F as B,I as St,B as ae,D as Re,C as ze,G as be,H as Ct,J as kt,K as E}from"./index-mAhQhUE6.js";import{u as Mt,r as Wt,B as It}from"./tableSelection-9hV37uhu.js";import{D as Tt}from"./DataTable-Bmn_eYSV.js";import{T as Lt,S as At}from"./TablePagination-SF1u0DDk.js";import{B as A,d as se,f as V}from"./heroui-BI50yK5B.js";function Oe(t){const i=t.indexOf(":");return i>0?t.slice(0,i):"—"}function $t(t,i=Date.now()){const r=new Map;for(const n of t){const a=r.get(n.model_key)??[];a.push(n),r.set(n.model_key,a)}const s=[];for(const n of r.values()){const a=[...n].sort((p,u)=>Date.parse(p.effective_at)-Date.parse(u.effective_at)),f=[...a].reverse().find(p=>Date.parse(p.effective_at)<=i);s.push(f??a[0])}return s.sort((n,a)=>n.model_key.localeCompare(a.model_key))}const Et="otari",De=[{value:"vision",label:"Vision",test:t=>Array.isArray(t.input_modalities)&&t.input_modalities.includes("image")},{value:"tool_call",label:"Tool calling",test:t=>!!t.tool_call},{value:"reasoning",label:"Reasoning",test:t=>!!t.reasoning},{value:"structured_output",label:"Structured output",test:t=>!!t.structured_output},{value:"attachment",label:"Attachments",test:t=>!!t.attachment},{value:"audio",label:"Audio",test:t=>Array.isArray(t.input_modalities)&&t.input_modalities.includes("audio")},{value:"pdf",label:"PDF",test:t=>Array.isArray(t.input_modalities)&&t.input_modalities.includes("pdf")}],Ot=[{key:"reasoning",label:"Reasoning"},{key:"tool_call",label:"Tool calling"},{key:"structured_output",label:"Structured output"},{key:"attachment",label:"Attachments"},{key:"temperature",label:"Temperature"}],Fe={text:"Text",image:"Image",audio:"Audio",video:"Video",pdf:"PDF"},Dt=[{value:"0",label:"Any context"},{value:"8000",label:"≥ 8K"},{value:"32000",label:"≥ 32K"},{value:"128000",label:"≥ 128K"},{value:"200000",label:"≥ 200K"},{value:"1000000",label:"≥ 1M"}],Ft=[{value:"",label:"Any price"},{value:"1",label:"≤ $1 / 1M in"},{value:"3",label:"≤ $3 / 1M in"},{value:"10",label:"≤ $10 / 1M in"},{value:"30",label:"≤ $30 / 1M in"}],Bt=[{value:"",label:"Base prices"},{value:"8000",label:"Compare at 8K"},{value:"128000",label:"Compare at 128K"},{value:"200000",label:"Compare at 200K"},{value:"500000",label:"Compare at 500K"},{value:"1000000",label:"Compare at 1M"}],Kt=[{value:"all",label:"Any release date"},{value:"365",label:"Past year"},{value:"730",label:"Past 2 years"},{value:"1095",label:"Past 3 years"}],Rt=1440*60*1e3,zt=t=>t.key;function Be(t,i){const r=`${i}:`;return t.startsWith(r)?t.slice(r.length):t}function Ke(t,i){const r={inputPrice:t.inputPrice,outputPrice:t.outputPrice,cacheReadPrice:t.cacheReadPrice,cacheWritePrice:t.cacheWritePrice,cacheWrite1hPrice:t.cacheWrite1hPrice};if(i==null)return r;const s=t.pricingTiers.filter(n=>n.min_input_tokens<=i).sort((n,a)=>a.min_input_tokens-n.min_input_tokens)[0];return s?{inputPrice:s.input_price_per_million??r.inputPrice,outputPrice:s.output_price_per_million??r.outputPrice,cacheReadPrice:s.cache_read_price_per_million??r.cacheReadPrice,cacheWritePrice:s.cache_write_price_per_million??r.cacheWritePrice,cacheWrite1hPrice:s.cache_write_1h_price_per_million??r.cacheWrite1hPrice}:r}function ce(t){const i=Number(t);return t.trim()!==""&&Number.isFinite(i)&&i>=0}function w(t){if(t.trim()==="")return!0;const i=Number(t);return Number.isFinite(i)&&i>=0}function Y(t){return t.trim()===""?null:Number(t)}function we(t){return t.map((i,r)=>({id:r,minInputTokens:String(i.min_input_tokens),input:i.input_price_per_million==null?"":String(i.input_price_per_million),output:i.output_price_per_million==null?"":String(i.output_price_per_million),cacheRead:i.cache_read_price_per_million==null?"":String(i.cache_read_price_per_million),cacheWrite:i.cache_write_price_per_million==null?"":String(i.cache_write_price_per_million),cacheWrite1h:i.cache_write_1h_price_per_million==null?"":String(i.cache_write_1h_price_per_million)}))}function Ve(t){const i=new Set;return t.every(r=>{const s=Number(r.minInputTokens),n=[r.input,r.output,r.cacheRead,r.cacheWrite,r.cacheWrite1h].some(a=>a.trim()!=="");return!Number.isInteger(s)||s<=0||i.has(s)||!n?!1:(i.add(s),[r.input,r.output,r.cacheRead,r.cacheWrite,r.cacheWrite1h].every(w))})}function Ye(t){return t.map(i=>({min_input_tokens:Number(i.minInputTokens),...i.input.trim()===""?{}:{input_price_per_million:Number(i.input)},...i.output.trim()===""?{}:{output_price_per_million:Number(i.output)},...i.cacheRead.trim()===""?{}:{cache_read_price_per_million:Number(i.cacheRead)},...i.cacheWrite.trim()===""?{}:{cache_write_price_per_million:Number(i.cacheWrite)},...i.cacheWrite1h.trim()===""?{}:{cache_write_1h_price_per_million:Number(i.cacheWrite1h)}}))}function b({value:t,onChange:i,ariaLabel:r}){return e.jsx("input",{type:"number",step:"any",min:"0",inputMode:"decimal","aria-label":r,value:t,onChange:s=>i(s.target.value),className:"w-28 rounded-md border border-[var(--otari-line)] bg-white px-2 py-1 text-right text-sm tabular-nums focus:border-[var(--otari-brand)] focus:outline-none"})}function He({tiers:t,onChange:i}){const r=(n,a,f)=>{i(t.map(p=>p.id===n?{...p,[a]:f}:p))},s=()=>{const n=t.reduce((a,f)=>Math.max(a,f.id),-1)+1;i([...t,{id:n,minInputTokens:"128000",input:"",output:"",cacheRead:"",cacheWrite:"",cacheWrite1h:""}])};return e.jsxs("div",{className:"flex flex-col gap-2 rounded-lg border border-[var(--otari-line)] p-3",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-medium text-[var(--otari-ink)]",children:"Long-context price tiers"}),e.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:"At a threshold, listed rates replace the base rate for the whole request."})]}),e.jsx(A,{size:"sm",variant:"outline",onPress:s,children:"Add tier"})]}),t.map(n=>e.jsxs("div",{className:"flex flex-wrap items-end gap-2 border-t border-[var(--otari-line)] pt-2",children:[e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Context ≥ tokens",e.jsx("input",{type:"number",min:"1",step:"1",inputMode:"numeric","aria-label":"Tier context threshold",value:n.minInputTokens,onChange:a=>r(n.id,"minInputTokens",a.target.value),className:"w-28 rounded-md border border-[var(--otari-line)] bg-white px-2 py-1 text-right text-sm tabular-nums focus:border-[var(--otari-brand)] focus:outline-none"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Input",e.jsx(b,{value:n.input,onChange:a=>r(n.id,"input",a),ariaLabel:"Tier input price"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Output",e.jsx(b,{value:n.output,onChange:a=>r(n.id,"output",a),ariaLabel:"Tier output price"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Cache read",e.jsx(b,{value:n.cacheRead,onChange:a=>r(n.id,"cacheRead",a),ariaLabel:"Tier cache read price"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Cache write",e.jsx(b,{value:n.cacheWrite,onChange:a=>r(n.id,"cacheWrite",a),ariaLabel:"Tier cache write price"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["1h write",e.jsx(b,{value:n.cacheWrite1h,onChange:a=>r(n.id,"cacheWrite1h",a),ariaLabel:"Tier 1 hour cache write price"})]}),e.jsx(A,{size:"sm",variant:"ghost",onPress:()=>i(t.filter(a=>a.id!==n.id)),children:"Remove"})]},n.id))]})}function wt({source:t}){return t==="configured"?e.jsx(V,{size:"sm",color:"default",children:"configured"}):t==="default"||t==="alias"?e.jsx(V,{size:"sm",color:"accent",children:t}):e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"not priced"})}function oe({label:t,tone:i="info",children:r}){const s=c.useId();return e.jsxs("span",{className:"group relative inline-flex items-center font-normal normal-case",children:[e.jsx("button",{type:"button","aria-label":t,"aria-describedby":s,className:`inline-flex h-4 w-4 items-center justify-center rounded-full border text-[10px] leading-none ${i==="warning"?"border-[#c2843a] text-[#b45309]":"border-[var(--otari-line)] text-[var(--otari-muted)] hover:border-[var(--otari-brand)] hover:text-[var(--otari-brand)]"}`,children:"i"}),e.jsx("span",{id:s,role:"tooltip",className:"pointer-events-none absolute top-full right-0 z-20 mt-1.5 w-72 rounded-lg border border-[var(--otari-line)] bg-[var(--otari-surface)] px-3 py-2 text-left text-xs font-normal whitespace-normal break-words text-[var(--otari-ink)] opacity-0 shadow-lg transition-opacity group-hover:opacity-100 group-focus-within:opacity-100",children:r})]})}function Vt(){const t=kt();return t.data?t.data.default_pricing?e.jsx(oe,{label:"How unpriced models are metered",tone:"info",children:"Default pricing is on: models without a configured price are metered using community-maintained rates (the bundled genai-prices dataset). Set a price to override the fallback."}):e.jsxs(oe,{label:"How unpriced models are metered",tone:"warning",children:["Default pricing is off: only models with a configured price are metered.",t.data.require_pricing?" Requests for any other model are rejected (HTTP 402) because require_pricing is on.":" Other models are served without cost tracking."]}):null}function I({label:t,value:i}){return e.jsxs("div",{className:"flex items-baseline justify-between gap-3",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:t}),e.jsx("span",{className:"text-right text-sm text-[var(--otari-ink)] tabular-nums",children:i})]})}function le({title:t,children:i}){return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("span",{className:"text-xs font-semibold uppercase tracking-wide text-[var(--otari-muted)]",children:t}),i]})}function Yt({row:t}){const i=je(),r=Re(),[s,n]=c.useState(!1),[a,f]=c.useState(""),[p,u]=c.useState(""),[P,j]=c.useState(""),[k,T]=c.useState(""),[y,h]=c.useState(""),[N,O]=c.useState([]),S=()=>{f(t.inputPrice==null?"":String(t.inputPrice)),u(t.outputPrice==null?"":String(t.outputPrice)),j(t.cacheReadPrice==null?"":String(t.cacheReadPrice)),T(t.cacheWritePrice==null?"":String(t.cacheWritePrice)),h(t.cacheWrite1hPrice==null?"":String(t.cacheWrite1hPrice)),O(we(t.pricingTiers)),n(!0)},Z=ce(a)&&ce(p)&&w(P)&&w(k)&&w(y)&&Ve(N),W=()=>{Z&&i.mutate({model_key:t.key,input_price_per_million:Number(a),output_price_per_million:Number(p),cache_read_price_per_million:Y(P),cache_write_price_per_million:Y(k),cache_write_1h_price_per_million:Y(y),pricing_tiers:Ye(N)},{onSuccess:()=>n(!1)})};return s?e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Input $ / 1M"}),e.jsx(b,{value:a,onChange:f,ariaLabel:`Input price for ${t.key}`})]}),e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Output $ / 1M"}),e.jsx(b,{value:p,onChange:u,ariaLabel:`Output price for ${t.key}`})]}),e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Cache read $ / 1M"}),e.jsx(b,{value:P,onChange:j,ariaLabel:`Cache read price for ${t.key}`})]}),e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Cache write $ / 1M"}),e.jsx(b,{value:k,onChange:T,ariaLabel:`Cache write price for ${t.key}`})]}),e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"1h cache write $ / 1M"}),e.jsx(b,{value:y,onChange:h,ariaLabel:`1 hour cache write price for ${t.key}`})]}),e.jsx(He,{tiers:N,onChange:O}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(A,{size:"sm",variant:"primary",isDisabled:i.isPending||!Z,onPress:W,children:"Save"}),e.jsx(A,{size:"sm",variant:"ghost",isDisabled:i.isPending,onPress:()=>n(!1),children:"Cancel"})]}),i.error?e.jsx("span",{className:"text-xs text-red-700",children:be(i.error)}):null]}):e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(I,{label:"Input",value:t.inputPrice==null?"—":`${E(t.inputPrice)} / 1M`}),e.jsx(I,{label:"Output",value:t.outputPrice==null?"—":`${E(t.outputPrice)} / 1M`}),e.jsx(I,{label:"Cache read",value:t.cacheReadPrice==null?"—":`${E(t.cacheReadPrice)} / 1M`}),e.jsx(I,{label:"Cache write",value:t.cacheWritePrice==null?"—":`${E(t.cacheWritePrice)} / 1M`}),e.jsx(I,{label:"1h cache write",value:t.cacheWrite1hPrice==null?"—":`${E(t.cacheWrite1hPrice)} / 1M`}),e.jsx(I,{label:"Context tiers",value:t.pricingTiers.length?`${t.pricingTiers.length} configured`:"—"}),e.jsxs("div",{className:"flex items-center gap-2 pt-1",children:[e.jsx(A,{size:"sm",variant:"outline",onPress:S,children:t.source==="configured"?"Edit price":"Set price"}),t.source==="configured"?e.jsxs(e.Fragment,{children:[e.jsx(ze,{confirmLabel:"Reset",isPending:r.isPending,onConfirm:()=>r.mutate(t.key),children:"Reset"}),e.jsx(oe,{label:"What reset does",children:"Removes the custom price. The model reverts to the default rate (genai-prices) when default pricing is on, otherwise it is metered at no cost."})]}):null,r.error?e.jsx("span",{className:"text-xs text-red-700",children:be(r.error)}):null]})]})}function Ht({row:t,metadata:i,metadataAvailable:r,onMakeAlias:s,onClose:n}){const a=(i==null?void 0:i.input_modalities)??[],f=(i==null?void 0:i.output_modalities)??[],p=Ot.filter(({key:u})=>i==null?void 0:i[u]);return e.jsx(se,{children:e.jsxs(se.Content,{className:"flex flex-col gap-5 p-5",children:[e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h2",{className:"text-base font-semibold break-all text-[var(--otari-ink)]",children:t.model}),i!=null&&i.deprecated?e.jsx(V,{size:"sm",color:"danger",children:"deprecated"}):null]}),e.jsxs("p",{className:"mt-1 text-xs break-all text-[var(--otari-muted)]",children:["Selector: ",e.jsx("code",{children:t.key})]}),i!=null&&i.family?e.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:i.family}):null]}),e.jsx("button",{type:"button","aria-label":"Close model details",onClick:n,className:"-mt-1 -mr-1 shrink-0 rounded-md px-1.5 py-0.5 text-lg leading-none text-[var(--otari-muted)] hover:bg-[var(--otari-bg)] hover:text-[var(--otari-ink)]",children:"✕"})]}),i!=null&&i.description?e.jsx("p",{className:"text-sm text-[var(--otari-ink)]",children:i.description}):null,e.jsxs(le,{title:"Pricing",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(wt,{source:t.source}),t.isDiscovered?null:e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"not discovered"})]}),e.jsx(Yt,{row:t},t.key),e.jsx(A,{size:"sm",variant:"outline",onPress:()=>s(t.key),children:"Make an alias"})]}),e.jsxs(le,{title:"Specs",children:[e.jsx(I,{label:"Context window",value:ae(t.contextWindow)}),e.jsx(I,{label:"Max output",value:ae((i==null?void 0:i.max_output_tokens)??null)}),e.jsx(I,{label:"Knowledge cutoff",value:(i==null?void 0:i.knowledge_cutoff)??"—"}),e.jsx(I,{label:"Released",value:Ct(i==null?void 0:i.release_date)}),e.jsx(I,{label:"Open weights",value:i?i.open_weights?"Yes":"No":"—"})]}),e.jsx(le,{title:"Modalities",children:a.length===0&&f.length===0?e.jsx("span",{className:"text-sm text-[var(--otari-muted)]",children:"Unknown."}):e.jsxs("div",{className:"flex flex-col gap-1.5 text-xs text-[var(--otari-muted)]",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-1",children:[e.jsx("span",{children:"In:"}),a.map(u=>e.jsx(V,{size:"sm",color:"default",children:Fe[u]??u},u))]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-1",children:[e.jsx("span",{children:"Out:"}),f.map(u=>e.jsx(V,{size:"sm",color:"default",children:Fe[u]??u},u))]})]})}),e.jsx(le,{title:"Capabilities",children:p.length>0?e.jsx("div",{className:"flex flex-wrap gap-1.5",children:p.map(({key:u,label:P})=>e.jsx(V,{size:"sm",color:"default",children:P},u))}):e.jsx("span",{className:"text-sm text-[var(--otari-muted)]",children:r?"None reported.":"Extended metadata unavailable (models.dev disabled or unreachable)."})})]})})}const qt=15;function Ut({value:t,onChange:i,placeholder:r}){return e.jsx("input",{type:"search",value:t,onChange:s=>i(s.target.value),placeholder:r,"aria-label":r,className:"w-full max-w-xs rounded-md border border-[var(--otari-line)] bg-white px-3 py-1.5 text-sm focus:border-[var(--otari-brand)] focus:outline-none"})}const qe="otari.dashboard.modelsSort",_e={col:"model",dir:"asc"},Gt=["model","released","input","output"];function Jt(){if(typeof window>"u")return _e;try{const t=window.localStorage.getItem(qe);if(!t)return _e;const i=JSON.parse(t);if(Gt.includes(i.col)&&(i.dir==="asc"||i.dir==="desc"))return{col:i.col,dir:i.dir}}catch{}return _e}function Xt({row:t,onClose:i}){const r=je(),s=Re(),[n,a]=c.useState(t.inputPrice==null?"":String(t.inputPrice)),[f,p]=c.useState(t.outputPrice==null?"":String(t.outputPrice)),[u,P]=c.useState(t.cacheReadPrice==null?"":String(t.cacheReadPrice)),[j,k]=c.useState(t.cacheWritePrice==null?"":String(t.cacheWritePrice)),[T,y]=c.useState(t.cacheWrite1hPrice==null?"":String(t.cacheWrite1hPrice)),[h,N]=c.useState(we(t.pricingTiers)),O=ce(n)&&ce(f)&&w(u)&&w(j)&&w(T)&&Ve(h),S=()=>{O&&r.mutate({model_key:t.key,input_price_per_million:Number(n),output_price_per_million:Number(f),cache_read_price_per_million:Y(u),cache_write_price_per_million:Y(j),cache_write_1h_price_per_million:Y(T),pricing_tiers:Ye(h)},{onSuccess:i})};return e.jsxs("div",{className:"flex flex-col gap-3 px-4 py-3",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("span",{className:"text-xs font-medium break-all text-[var(--otari-muted)]",children:t.key}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["Input $ / 1M",e.jsx(b,{value:n,onChange:a,ariaLabel:`Input price for ${t.key}`})]}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["Output $ / 1M",e.jsx(b,{value:f,onChange:p,ariaLabel:`Output price for ${t.key}`})]}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["Cache read $ / 1M",e.jsx(b,{value:u,onChange:P,ariaLabel:`Cache read price for ${t.key}`})]}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["Cache write $ / 1M",e.jsx(b,{value:j,onChange:k,ariaLabel:`Cache write price for ${t.key}`})]}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["1h cache write $ / 1M",e.jsx(b,{value:T,onChange:y,ariaLabel:`1 hour cache write price for ${t.key}`})]}),e.jsx(A,{size:"sm",variant:"primary",isDisabled:r.isPending||!O,onPress:S,children:r.isPending?"Saving…":"Save"}),e.jsx(A,{size:"sm",variant:"ghost",isDisabled:r.isPending,onPress:i,children:"Cancel"}),t.source==="configured"?e.jsxs("span",{className:"inline-flex items-center gap-1",children:[e.jsx(ze,{confirmLabel:"Reset",isPending:s.isPending,onConfirm:()=>s.mutate(t.key,{onSuccess:i}),children:"Reset"}),e.jsx(oe,{label:"What reset does",children:"Removes the custom price. The model reverts to the default rate (genai-prices) when default pricing is on, otherwise it is metered at no cost."})]}):null,r.error||s.error?e.jsx("span",{className:"text-xs text-red-700",children:be(r.error??s.error)}):null]}),e.jsx(He,{tiers:h,onChange:N})]})}function Zt({primary:t,secondary:i,rowKey:r,primaryLabel:s,secondaryLabel:n,onEdit:a}){const f=(p,u)=>e.jsx("button",{type:"button","aria-label":`Edit ${u} price for ${r}`,className:"tabular-nums hover:text-[var(--otari-brand-dark)] hover:underline",onClick:P=>{P.stopPropagation(),a()},children:p==null?"—":E(p)});return e.jsxs("span",{className:"inline-flex items-center justify-end gap-1",children:[f(t,s),e.jsx("span",{className:"text-[var(--otari-muted)]",children:"/"}),f(i,n)]})}function Qt({rates:t,rowKey:i,onEdit:r}){const s=[t.cacheReadPrice==null?null:`R ${E(t.cacheReadPrice)}`,t.cacheWritePrice==null?null:`W ${E(t.cacheWritePrice)}`,t.cacheWrite1hPrice==null?null:`1h ${E(t.cacheWrite1hPrice)}`].filter(n=>n!==null);return e.jsx("button",{type:"button","aria-label":`Edit caching price for ${i}`,className:"max-w-44 text-right text-xs leading-5 text-[var(--otari-muted)] hover:text-[var(--otari-brand-dark)] hover:underline",onClick:n=>{n.stopPropagation(),r()},children:s.length>0?s.join(" · "):"Input-rate fallback"})}function ei({row:t,onEdit:i}){const r=[...t.pricingTiers].sort((n,a)=>n.min_input_tokens-a.min_input_tokens).map(n=>ae(n.min_input_tokens)),s=r.length===0?"Base only":`${r.length} tier${r.length===1?"":"s"} · ≥ ${r.join(", ")}`;return e.jsx("button",{type:"button","aria-label":`Edit pricing policy for ${t.key}`,className:"max-w-40 text-right text-xs leading-5 text-[var(--otari-muted)] hover:text-[var(--otari-brand-dark)] hover:underline",onClick:n=>{n.stopPropagation(),i()},children:s})}function ti({rows:t,isLoading:i,empty:r,sortDescriptor:s,onSortChange:n,selectedKey:a,onSelect:f,onEditPricing:p,comparisonContextTokens:u,selectedKeys:P,onSelectionChange:j}){const k=c.useMemo(()=>{const y=u==null?"Base":`at ${ae(u)}`;return[{id:"model",header:"Model",isRowHeader:!0,allowsSorting:!0,cell:h=>e.jsxs("span",{className:"font-medium break-all",children:[h.model,e.jsx("span",{className:"sr-only",children:h.key})]})},{id:"provider",header:"Provider",cell:h=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:h.provider})},{id:"input",header:e.jsxs("span",{className:"inline-flex items-center gap-1",children:[`${y} in / out $ / 1M`,e.jsx(Vt,{})]}),align:"end",allowsSorting:!0,cell:h=>{const N=Ke(h,u);return e.jsx(Zt,{primary:N.inputPrice,secondary:N.outputPrice,rowKey:h.key,primaryLabel:"input",secondaryLabel:"output",onEdit:()=>p(h.key)})}},{id:"caching",header:`Caching ${u==null?"policy":y}`,align:"end",cell:h=>e.jsx(Qt,{rates:Ke(h,u),rowKey:h.key,onEdit:()=>p(h.key)})},{id:"policy",header:"Pricing policy",align:"end",cell:h=>e.jsx(ei,{row:h,onEdit:()=>p(h.key)})}]},[u,p]),T=c.useCallback(y=>y.key===a?"bg-[var(--otari-brand-tint)]":void 0,[a]);return e.jsx(Tt,{ariaLabel:"Models",columns:k,rows:t,getRowKey:zt,isLoading:i,emptyContent:r,selectionMode:"multiple",selectedKeys:P,onSelectionChange:j,sortDescriptor:s,onSortChange:n,onRowAction:f,rowClassName:T})}function ii({providers:t}){return t.length===0?null:e.jsxs(St,{tone:"warning",children:["Could not list ",t.map(i=>i.provider).join(", "),". Check that provider's credentials in config.yml; its models are missing from the list below."]})}function pi(){var Te,Le,Ae;const t=gt(),[i]=vt(),r=_t(),s=bt(),n=jt(),a=yt(),f=je(),[p,u]=c.useState(""),[P,j]=c.useState(0),[k,T]=c.useState(qt),[y,h]=c.useState(null),[N,O]=c.useState(null),[S,Z]=c.useState(Jt),W=Mt(),[Ue,ue]=c.useState(!1),[Ge,ye]=c.useState(!1),[Je,Pe]=c.useState(void 0);c.useEffect(()=>{try{window.localStorage.setItem(qe,JSON.stringify(S))}catch{}},[S]);const[D,Ne]=c.useState(i.get("provider")||"all"),[K,Xe]=c.useState("all"),[H,Ze]=c.useState("all"),[q,Qe]=c.useState("all"),[de,et]=c.useState("0"),[Q,tt]=c.useState(""),[ee,it]=c.useState("all"),[pe,rt]=c.useState(""),F=((Te=a.data)==null?void 0:Te.models)??{},nt=((Le=a.data)==null?void 0:Le.available)??!1,Se=c.useMemo(()=>{var l;return new Set((((l=n.data)==null?void 0:l.providers)??[]).flatMap(m=>m.models.map(o=>o.key)))},[n.data]),lt=l=>{u(l),j(0)},R=l=>m=>{l(m),j(0)},te=c.useMemo(()=>{var M,v,_,$,L,z,$e;const l=new Map($t(s.data??[]).map(d=>[d.model_key,d])),m=[],o=new Set,g=(d,ve,Ee,x)=>{if(o.has(d))return;o.add(d);const C=l.get(d);m.push({key:d,model:Be(ve,Ee),provider:Ee,isDiscovered:Se.has(d),contextWindow:(x==null?void 0:x.contextWindow)??null,inputPrice:C?C.input_price_per_million:(x==null?void 0:x.inputPrice)??null,outputPrice:C?C.output_price_per_million:(x==null?void 0:x.outputPrice)??null,cacheReadPrice:C?C.cache_read_price_per_million:(x==null?void 0:x.cacheReadPrice)??null,cacheWritePrice:C?C.cache_write_price_per_million:(x==null?void 0:x.cacheWritePrice)??null,cacheWrite1hPrice:C?C.cache_write_1h_price_per_million??null:(x==null?void 0:x.cacheWrite1hPrice)??null,pricingTiers:C?C.pricing_tiers??[]:(x==null?void 0:x.pricingTiers)??[],source:C?"configured":(x==null?void 0:x.source)??"none"})};for(const d of((M=r.data)==null?void 0:M.data)??[]){if(d.owned_by===Et)continue;const ve=d.pricing_source==="default"?"default":d.pricing?"configured":"none";g(d.id,d.id,d.owned_by||Oe(d.id),{key:d.id,model:d.id,provider:d.owned_by,contextWindow:d.context_window,inputPrice:((v=d.pricing)==null?void 0:v.input_price_per_million)??null,outputPrice:((_=d.pricing)==null?void 0:_.output_price_per_million)??null,cacheReadPrice:(($=d.pricing)==null?void 0:$.cache_read_price_per_million)??null,cacheWritePrice:((L=d.pricing)==null?void 0:L.cache_write_price_per_million)??null,cacheWrite1hPrice:((z=d.pricing)==null?void 0:z.cache_write_1h_price_per_million)??null,pricingTiers:(($e=d.pricing)==null?void 0:$e.pricing_tiers)??[],source:ve})}for(const d of l.keys())g(d,d,Oe(d));return m},[r.data,s.data,Se]),Ce=c.useMemo(()=>new Map(te.map(l=>[l.key,l])),[te]),ie=c.useMemo(()=>{var o,g,M;const l=te.map(v=>{var _,$;return{...v,contextWindow:v.contextWindow??((_=F[v.key])==null?void 0:_.context_window)??null,releaseDate:(($=F[v.key])==null?void 0:$.release_date)??null}}),m=new Set(l.map(v=>v.key));for(const v of((o=n.data)==null?void 0:o.providers)??[])for(const _ of v.models)m.has(_.key)||(m.add(_.key),l.push({key:_.key,model:Be(_.key,v.provider),provider:v.provider,isDiscovered:!0,contextWindow:((g=F[_.key])==null?void 0:g.context_window)??null,releaseDate:((M=F[_.key])==null?void 0:M.release_date)??null,inputPrice:null,outputPrice:null,cacheReadPrice:null,cacheWritePrice:null,cacheWrite1hPrice:null,pricingTiers:[],source:"none"}));return l},[te,n.data,F]),at=(((Ae=n.data)==null?void 0:Ae.providers)??[]).filter(l=>!l.ok),re=c.useMemo(()=>{const l=Array.from(new Set(ie.map(m=>m.provider))).sort((m,o)=>m.localeCompare(o));return[{value:"all",label:"All providers"},...l.map(m=>({value:m,label:m}))]},[ie]);c.useEffect(()=>{D==="all"||re.length<=1||re.some(l=>l.value===D)||Ne("all")},[re,D]);const U=p.trim().toLowerCase(),he=Number(de)||0,me=Q===""?Number.POSITIVE_INFINITY:Number(Q),st=pe===""?null:Number(pe),xe=ee==="all"?null:Date.now()-Number(ee)*Rt,G=c.useMemo(()=>{const l=o=>{if(U&&!o.key.toLowerCase().includes(U)&&!o.provider.toLowerCase().includes(U)||D!=="all"&&o.provider!==D||K==="configured"&&o.source!=="configured"||K==="default"&&o.source!=="default"||K==="priced"&&o.inputPrice==null||K==="unpriced"&&o.inputPrice!=null||H==="discovered"&&!o.isDiscovered||H==="custom"&&o.isDiscovered)return!1;if(q!=="all"){const g=De.find(v=>v.value===q),M=F[o.key];if(!g||!M||!g.test(M))return!1}if(he>0&&(o.contextWindow==null||o.contextWindowme))return!1;if(xe!=null){const g=o.releaseDate?Date.parse(o.releaseDate):Number.NaN;if(Number.isNaN(g)||g{const M=S.dir==="asc"?1:-1;if(S.col==="model")return o.model.localeCompare(g.model)*M;if(S.col==="released"){const L=o.releaseDate??null,z=g.releaseDate??null;return!L&&!z?o.model.localeCompare(g.model):L?z?(Lz?1:0)*M||o.model.localeCompare(g.model):-1:1}const v=L=>S.col==="input"?L.inputPrice:L.outputPrice,_=v(o),$=v(g);return _==null&&$==null?o.model.localeCompare(g.model):_==null?1:$==null?-1:(_-$)*M||o.model.localeCompare(g.model)};return ie.filter(l).sort(m)},[ie,U,D,K,H,q,he,me,xe,F,S]),J=G.length,ct=Math.max(1,Math.ceil(J/k)),ke=Math.min(P,ct-1),Me=ke*k,fe=G.slice(Me,Me+k),ot={column:S.col,direction:S.dir==="asc"?"ascending":"descending"},ut=l=>{Z({col:String(l.column),dir:l.direction==="ascending"?"asc":"desc"}),j(0)},dt=c.useCallback(l=>h(m=>m===l?null:l),[]),ge=fe.map(l=>l.key),X=Wt(W.selectedKeys,ge),pt=ge.length>0&&X.length===ge.length&&J>X.length,ht=W.allMatching?G.map(l=>l.key):X,We=W.allMatching?J:X.length,Ie=y?G.find(l=>l.key===y)??Ce.get(y)??null:null,mt=async l=>{ye(!0),Pe(void 0);try{for(const m of ht)await f.mutateAsync({model_key:m,input_price_per_million:l.input_price_per_million,output_price_per_million:l.output_price_per_million,cache_read_price_per_million:l.cache_read_price_per_million??null,cache_write_price_per_million:l.cache_write_price_per_million??null,cache_write_1h_price_per_million:null,pricing_tiers:[]});W.clear(),ue(!1)}catch(m){Pe(m)}finally{ye(!1)}},xt=r.isLoading||s.isLoading||n.isLoading,ft=U!==""||D!=="all"||K!=="all"||H!=="all"||q!=="all"||de!=="0"||Q!==""||ee!=="all"?"No models match your filters.":"No models yet. Add a provider on the Providers page, or price a model below.",ne=N?G.find(l=>l.key===N)??Ce.get(N)??null:null;return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(Pt,{title:"Models",description:"Every model your providers can serve. Set a price on any model so budgets and usage tracking work."}),e.jsx(Nt,{error:r.error??s.error??n.error??a.error}),e.jsxs("div",{className:`grid gap-4 lg:items-start ${ne?"lg:grid-cols-[minmax(0,1fr)_360px]":"grid-cols-1"}`,children:[e.jsxs("div",{className:"flex min-w-0 flex-col gap-3",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(Ut,{value:p,onChange:lt,placeholder:"Search models…"}),e.jsx(B,{ariaLabel:"Filter by provider",value:D,onChange:R(Ne),options:re}),e.jsx(B,{ariaLabel:"Filter by pricing",value:K,onChange:R(Xe),options:[{value:"all",label:"Any pricing"},{value:"configured",label:"Custom price"},{value:"default",label:"Default price"},{value:"priced",label:"Priced"},{value:"unpriced",label:"Unpriced"}]}),e.jsx(B,{ariaLabel:"Filter by source",value:H,onChange:R(Ze),options:[{value:"all",label:"Any source"},{value:"discovered",label:"Discovered"},{value:"custom",label:"Custom (not discovered)"}]}),e.jsx(B,{ariaLabel:"Filter by capability",value:q,onChange:R(Qe),options:[{value:"all",label:"Any capability"},...De.map(l=>({value:l.value,label:l.label}))]}),e.jsx(B,{ariaLabel:"Minimum context window",value:de,onChange:R(et),options:Dt}),e.jsx(B,{ariaLabel:"Maximum input price",value:Q,onChange:R(tt),options:Ft}),e.jsx(B,{ariaLabel:"Compare prices at context",value:pe,onChange:rt,options:Bt}),e.jsx(B,{ariaLabel:"Filter by release date",value:ee,onChange:R(it),options:Kt})]}),e.jsx(ii,{providers:at}),X.length>0?e.jsx(It,{selectedCount:We,allMatching:W.allMatching,matchingTotal:J,canSelectAllMatching:pt,onSelectAllMatching:W.enableAllMatching,onClear:W.clear,children:e.jsx(A,{size:"sm",variant:"primary",onPress:()=>ue(!0),children:"Set pricing"})}):null,e.jsx(ti,{rows:fe,isLoading:xt,empty:ft,sortDescriptor:ot,onSortChange:ut,selectedKey:N,onSelect:O,onEditPricing:dt,comparisonContextTokens:st,selectedKeys:W.selectedKeys,onSelectionChange:W.onSelectionChange}),Ie?e.jsx(se,{children:e.jsxs(se.Content,{className:"p-0",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-[var(--otari-line)] px-4 py-2",children:[e.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Edit pricing"}),e.jsx(A,{size:"sm",variant:"ghost",onPress:()=>h(null),children:"Close"})]}),e.jsx(Xt,{row:Ie,onClose:()=>h(null)})]})}):null,e.jsx(Lt,{page:ke,pageSize:k,total:J,rowsOnPage:fe.length,onPageChange:j,onPageSizeChange:l=>{T(l),j(0)},pageSizeOptions:[15,25,50]})]}),ne?e.jsx("aside",{className:"lg:sticky lg:top-4",children:e.jsx(Ht,{row:ne,metadata:F[ne.key],metadataAvailable:nt,onMakeAlias:l=>t(`/aliases?target=${encodeURIComponent(l)}`),onClose:()=>O(null)})}):null]}),e.jsx(At,{isOpen:Ue,onOpenChange:ue,targetCount:We,isPending:Ge,error:Je,onSubmit:mt,title:"Set pricing",description:l=>`Apply these per-1M rates to ${l.toLocaleString()} selected ${l===1?"model":"models"}. This replaces each model's price; pricing tiers and the 1h cache rate are cleared. Edit a single model for tiers.`})]})}export{pi as ModelsPage}; +import{j as e}from"./tanstack-query-1t81HyiD.js";import{i as gt,u as vt,r as c}from"./react-dgEcD0HR.js";import{x as _t,y as bt,h as jt,z as yt,A as je,P as Pt,E as Nt,F as B,I as St,B as ae,D as Re,C as ze,G as be,H as Ct,J as kt,K as E}from"./index-DV8qvdUj.js";import{u as Mt,r as Wt,B as It}from"./tableSelection-9hV37uhu.js";import{D as Tt}from"./DataTable-Bmn_eYSV.js";import{T as Lt,S as At}from"./TablePagination-CXhesdmH.js";import{B as A,d as se,f as V}from"./heroui-BI50yK5B.js";function Oe(t){const i=t.indexOf(":");return i>0?t.slice(0,i):"—"}function $t(t,i=Date.now()){const r=new Map;for(const n of t){const a=r.get(n.model_key)??[];a.push(n),r.set(n.model_key,a)}const s=[];for(const n of r.values()){const a=[...n].sort((p,u)=>Date.parse(p.effective_at)-Date.parse(u.effective_at)),f=[...a].reverse().find(p=>Date.parse(p.effective_at)<=i);s.push(f??a[0])}return s.sort((n,a)=>n.model_key.localeCompare(a.model_key))}const Et="otari",De=[{value:"vision",label:"Vision",test:t=>Array.isArray(t.input_modalities)&&t.input_modalities.includes("image")},{value:"tool_call",label:"Tool calling",test:t=>!!t.tool_call},{value:"reasoning",label:"Reasoning",test:t=>!!t.reasoning},{value:"structured_output",label:"Structured output",test:t=>!!t.structured_output},{value:"attachment",label:"Attachments",test:t=>!!t.attachment},{value:"audio",label:"Audio",test:t=>Array.isArray(t.input_modalities)&&t.input_modalities.includes("audio")},{value:"pdf",label:"PDF",test:t=>Array.isArray(t.input_modalities)&&t.input_modalities.includes("pdf")}],Ot=[{key:"reasoning",label:"Reasoning"},{key:"tool_call",label:"Tool calling"},{key:"structured_output",label:"Structured output"},{key:"attachment",label:"Attachments"},{key:"temperature",label:"Temperature"}],Fe={text:"Text",image:"Image",audio:"Audio",video:"Video",pdf:"PDF"},Dt=[{value:"0",label:"Any context"},{value:"8000",label:"≥ 8K"},{value:"32000",label:"≥ 32K"},{value:"128000",label:"≥ 128K"},{value:"200000",label:"≥ 200K"},{value:"1000000",label:"≥ 1M"}],Ft=[{value:"",label:"Any price"},{value:"1",label:"≤ $1 / 1M in"},{value:"3",label:"≤ $3 / 1M in"},{value:"10",label:"≤ $10 / 1M in"},{value:"30",label:"≤ $30 / 1M in"}],Bt=[{value:"",label:"Base prices"},{value:"8000",label:"Compare at 8K"},{value:"128000",label:"Compare at 128K"},{value:"200000",label:"Compare at 200K"},{value:"500000",label:"Compare at 500K"},{value:"1000000",label:"Compare at 1M"}],Kt=[{value:"all",label:"Any release date"},{value:"365",label:"Past year"},{value:"730",label:"Past 2 years"},{value:"1095",label:"Past 3 years"}],Rt=1440*60*1e3,zt=t=>t.key;function Be(t,i){const r=`${i}:`;return t.startsWith(r)?t.slice(r.length):t}function Ke(t,i){const r={inputPrice:t.inputPrice,outputPrice:t.outputPrice,cacheReadPrice:t.cacheReadPrice,cacheWritePrice:t.cacheWritePrice,cacheWrite1hPrice:t.cacheWrite1hPrice};if(i==null)return r;const s=t.pricingTiers.filter(n=>n.min_input_tokens<=i).sort((n,a)=>a.min_input_tokens-n.min_input_tokens)[0];return s?{inputPrice:s.input_price_per_million??r.inputPrice,outputPrice:s.output_price_per_million??r.outputPrice,cacheReadPrice:s.cache_read_price_per_million??r.cacheReadPrice,cacheWritePrice:s.cache_write_price_per_million??r.cacheWritePrice,cacheWrite1hPrice:s.cache_write_1h_price_per_million??r.cacheWrite1hPrice}:r}function ce(t){const i=Number(t);return t.trim()!==""&&Number.isFinite(i)&&i>=0}function w(t){if(t.trim()==="")return!0;const i=Number(t);return Number.isFinite(i)&&i>=0}function Y(t){return t.trim()===""?null:Number(t)}function we(t){return t.map((i,r)=>({id:r,minInputTokens:String(i.min_input_tokens),input:i.input_price_per_million==null?"":String(i.input_price_per_million),output:i.output_price_per_million==null?"":String(i.output_price_per_million),cacheRead:i.cache_read_price_per_million==null?"":String(i.cache_read_price_per_million),cacheWrite:i.cache_write_price_per_million==null?"":String(i.cache_write_price_per_million),cacheWrite1h:i.cache_write_1h_price_per_million==null?"":String(i.cache_write_1h_price_per_million)}))}function Ve(t){const i=new Set;return t.every(r=>{const s=Number(r.minInputTokens),n=[r.input,r.output,r.cacheRead,r.cacheWrite,r.cacheWrite1h].some(a=>a.trim()!=="");return!Number.isInteger(s)||s<=0||i.has(s)||!n?!1:(i.add(s),[r.input,r.output,r.cacheRead,r.cacheWrite,r.cacheWrite1h].every(w))})}function Ye(t){return t.map(i=>({min_input_tokens:Number(i.minInputTokens),...i.input.trim()===""?{}:{input_price_per_million:Number(i.input)},...i.output.trim()===""?{}:{output_price_per_million:Number(i.output)},...i.cacheRead.trim()===""?{}:{cache_read_price_per_million:Number(i.cacheRead)},...i.cacheWrite.trim()===""?{}:{cache_write_price_per_million:Number(i.cacheWrite)},...i.cacheWrite1h.trim()===""?{}:{cache_write_1h_price_per_million:Number(i.cacheWrite1h)}}))}function b({value:t,onChange:i,ariaLabel:r}){return e.jsx("input",{type:"number",step:"any",min:"0",inputMode:"decimal","aria-label":r,value:t,onChange:s=>i(s.target.value),className:"w-28 rounded-md border border-[var(--otari-line)] bg-white px-2 py-1 text-right text-sm tabular-nums focus:border-[var(--otari-brand)] focus:outline-none"})}function He({tiers:t,onChange:i}){const r=(n,a,f)=>{i(t.map(p=>p.id===n?{...p,[a]:f}:p))},s=()=>{const n=t.reduce((a,f)=>Math.max(a,f.id),-1)+1;i([...t,{id:n,minInputTokens:"128000",input:"",output:"",cacheRead:"",cacheWrite:"",cacheWrite1h:""}])};return e.jsxs("div",{className:"flex flex-col gap-2 rounded-lg border border-[var(--otari-line)] p-3",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-xs font-medium text-[var(--otari-ink)]",children:"Long-context price tiers"}),e.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:"At a threshold, listed rates replace the base rate for the whole request."})]}),e.jsx(A,{size:"sm",variant:"outline",onPress:s,children:"Add tier"})]}),t.map(n=>e.jsxs("div",{className:"flex flex-wrap items-end gap-2 border-t border-[var(--otari-line)] pt-2",children:[e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Context ≥ tokens",e.jsx("input",{type:"number",min:"1",step:"1",inputMode:"numeric","aria-label":"Tier context threshold",value:n.minInputTokens,onChange:a=>r(n.id,"minInputTokens",a.target.value),className:"w-28 rounded-md border border-[var(--otari-line)] bg-white px-2 py-1 text-right text-sm tabular-nums focus:border-[var(--otari-brand)] focus:outline-none"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Input",e.jsx(b,{value:n.input,onChange:a=>r(n.id,"input",a),ariaLabel:"Tier input price"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Output",e.jsx(b,{value:n.output,onChange:a=>r(n.id,"output",a),ariaLabel:"Tier output price"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Cache read",e.jsx(b,{value:n.cacheRead,onChange:a=>r(n.id,"cacheRead",a),ariaLabel:"Tier cache read price"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["Cache write",e.jsx(b,{value:n.cacheWrite,onChange:a=>r(n.id,"cacheWrite",a),ariaLabel:"Tier cache write price"})]}),e.jsxs("label",{className:"flex flex-col gap-1 text-xs text-[var(--otari-muted)]",children:["1h write",e.jsx(b,{value:n.cacheWrite1h,onChange:a=>r(n.id,"cacheWrite1h",a),ariaLabel:"Tier 1 hour cache write price"})]}),e.jsx(A,{size:"sm",variant:"ghost",onPress:()=>i(t.filter(a=>a.id!==n.id)),children:"Remove"})]},n.id))]})}function wt({source:t}){return t==="configured"?e.jsx(V,{size:"sm",color:"default",children:"configured"}):t==="default"||t==="alias"?e.jsx(V,{size:"sm",color:"accent",children:t}):e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"not priced"})}function oe({label:t,tone:i="info",children:r}){const s=c.useId();return e.jsxs("span",{className:"group relative inline-flex items-center font-normal normal-case",children:[e.jsx("button",{type:"button","aria-label":t,"aria-describedby":s,className:`inline-flex h-4 w-4 items-center justify-center rounded-full border text-[10px] leading-none ${i==="warning"?"border-[#c2843a] text-[#b45309]":"border-[var(--otari-line)] text-[var(--otari-muted)] hover:border-[var(--otari-brand)] hover:text-[var(--otari-brand)]"}`,children:"i"}),e.jsx("span",{id:s,role:"tooltip",className:"pointer-events-none absolute top-full right-0 z-20 mt-1.5 w-72 rounded-lg border border-[var(--otari-line)] bg-[var(--otari-surface)] px-3 py-2 text-left text-xs font-normal whitespace-normal break-words text-[var(--otari-ink)] opacity-0 shadow-lg transition-opacity group-hover:opacity-100 group-focus-within:opacity-100",children:r})]})}function Vt(){const t=kt();return t.data?t.data.default_pricing?e.jsx(oe,{label:"How unpriced models are metered",tone:"info",children:"Default pricing is on: models without a configured price are metered using community-maintained rates (the bundled genai-prices dataset). Set a price to override the fallback."}):e.jsxs(oe,{label:"How unpriced models are metered",tone:"warning",children:["Default pricing is off: only models with a configured price are metered.",t.data.require_pricing?" Requests for any other model are rejected (HTTP 402) because require_pricing is on.":" Other models are served without cost tracking."]}):null}function I({label:t,value:i}){return e.jsxs("div",{className:"flex items-baseline justify-between gap-3",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:t}),e.jsx("span",{className:"text-right text-sm text-[var(--otari-ink)] tabular-nums",children:i})]})}function le({title:t,children:i}){return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("span",{className:"text-xs font-semibold uppercase tracking-wide text-[var(--otari-muted)]",children:t}),i]})}function Yt({row:t}){const i=je(),r=Re(),[s,n]=c.useState(!1),[a,f]=c.useState(""),[p,u]=c.useState(""),[P,j]=c.useState(""),[k,T]=c.useState(""),[y,h]=c.useState(""),[N,O]=c.useState([]),S=()=>{f(t.inputPrice==null?"":String(t.inputPrice)),u(t.outputPrice==null?"":String(t.outputPrice)),j(t.cacheReadPrice==null?"":String(t.cacheReadPrice)),T(t.cacheWritePrice==null?"":String(t.cacheWritePrice)),h(t.cacheWrite1hPrice==null?"":String(t.cacheWrite1hPrice)),O(we(t.pricingTiers)),n(!0)},Z=ce(a)&&ce(p)&&w(P)&&w(k)&&w(y)&&Ve(N),W=()=>{Z&&i.mutate({model_key:t.key,input_price_per_million:Number(a),output_price_per_million:Number(p),cache_read_price_per_million:Y(P),cache_write_price_per_million:Y(k),cache_write_1h_price_per_million:Y(y),pricing_tiers:Ye(N)},{onSuccess:()=>n(!1)})};return s?e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Input $ / 1M"}),e.jsx(b,{value:a,onChange:f,ariaLabel:`Input price for ${t.key}`})]}),e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Output $ / 1M"}),e.jsx(b,{value:p,onChange:u,ariaLabel:`Output price for ${t.key}`})]}),e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Cache read $ / 1M"}),e.jsx(b,{value:P,onChange:j,ariaLabel:`Cache read price for ${t.key}`})]}),e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Cache write $ / 1M"}),e.jsx(b,{value:k,onChange:T,ariaLabel:`Cache write price for ${t.key}`})]}),e.jsxs("div",{className:"flex items-center justify-between gap-2",children:[e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"1h cache write $ / 1M"}),e.jsx(b,{value:y,onChange:h,ariaLabel:`1 hour cache write price for ${t.key}`})]}),e.jsx(He,{tiers:N,onChange:O}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(A,{size:"sm",variant:"primary",isDisabled:i.isPending||!Z,onPress:W,children:"Save"}),e.jsx(A,{size:"sm",variant:"ghost",isDisabled:i.isPending,onPress:()=>n(!1),children:"Cancel"})]}),i.error?e.jsx("span",{className:"text-xs text-red-700",children:be(i.error)}):null]}):e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(I,{label:"Input",value:t.inputPrice==null?"—":`${E(t.inputPrice)} / 1M`}),e.jsx(I,{label:"Output",value:t.outputPrice==null?"—":`${E(t.outputPrice)} / 1M`}),e.jsx(I,{label:"Cache read",value:t.cacheReadPrice==null?"—":`${E(t.cacheReadPrice)} / 1M`}),e.jsx(I,{label:"Cache write",value:t.cacheWritePrice==null?"—":`${E(t.cacheWritePrice)} / 1M`}),e.jsx(I,{label:"1h cache write",value:t.cacheWrite1hPrice==null?"—":`${E(t.cacheWrite1hPrice)} / 1M`}),e.jsx(I,{label:"Context tiers",value:t.pricingTiers.length?`${t.pricingTiers.length} configured`:"—"}),e.jsxs("div",{className:"flex items-center gap-2 pt-1",children:[e.jsx(A,{size:"sm",variant:"outline",onPress:S,children:t.source==="configured"?"Edit price":"Set price"}),t.source==="configured"?e.jsxs(e.Fragment,{children:[e.jsx(ze,{confirmLabel:"Reset",isPending:r.isPending,onConfirm:()=>r.mutate(t.key),children:"Reset"}),e.jsx(oe,{label:"What reset does",children:"Removes the custom price. The model reverts to the default rate (genai-prices) when default pricing is on, otherwise it is metered at no cost."})]}):null,r.error?e.jsx("span",{className:"text-xs text-red-700",children:be(r.error)}):null]})]})}function Ht({row:t,metadata:i,metadataAvailable:r,onMakeAlias:s,onClose:n}){const a=(i==null?void 0:i.input_modalities)??[],f=(i==null?void 0:i.output_modalities)??[],p=Ot.filter(({key:u})=>i==null?void 0:i[u]);return e.jsx(se,{children:e.jsxs(se.Content,{className:"flex flex-col gap-5 p-5",children:[e.jsxs("div",{className:"flex items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h2",{className:"text-base font-semibold break-all text-[var(--otari-ink)]",children:t.model}),i!=null&&i.deprecated?e.jsx(V,{size:"sm",color:"danger",children:"deprecated"}):null]}),e.jsxs("p",{className:"mt-1 text-xs break-all text-[var(--otari-muted)]",children:["Selector: ",e.jsx("code",{children:t.key})]}),i!=null&&i.family?e.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:i.family}):null]}),e.jsx("button",{type:"button","aria-label":"Close model details",onClick:n,className:"-mt-1 -mr-1 shrink-0 rounded-md px-1.5 py-0.5 text-lg leading-none text-[var(--otari-muted)] hover:bg-[var(--otari-bg)] hover:text-[var(--otari-ink)]",children:"✕"})]}),i!=null&&i.description?e.jsx("p",{className:"text-sm text-[var(--otari-ink)]",children:i.description}):null,e.jsxs(le,{title:"Pricing",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(wt,{source:t.source}),t.isDiscovered?null:e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"not discovered"})]}),e.jsx(Yt,{row:t},t.key),e.jsx(A,{size:"sm",variant:"outline",onPress:()=>s(t.key),children:"Make an alias"})]}),e.jsxs(le,{title:"Specs",children:[e.jsx(I,{label:"Context window",value:ae(t.contextWindow)}),e.jsx(I,{label:"Max output",value:ae((i==null?void 0:i.max_output_tokens)??null)}),e.jsx(I,{label:"Knowledge cutoff",value:(i==null?void 0:i.knowledge_cutoff)??"—"}),e.jsx(I,{label:"Released",value:Ct(i==null?void 0:i.release_date)}),e.jsx(I,{label:"Open weights",value:i?i.open_weights?"Yes":"No":"—"})]}),e.jsx(le,{title:"Modalities",children:a.length===0&&f.length===0?e.jsx("span",{className:"text-sm text-[var(--otari-muted)]",children:"Unknown."}):e.jsxs("div",{className:"flex flex-col gap-1.5 text-xs text-[var(--otari-muted)]",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-1",children:[e.jsx("span",{children:"In:"}),a.map(u=>e.jsx(V,{size:"sm",color:"default",children:Fe[u]??u},u))]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-1",children:[e.jsx("span",{children:"Out:"}),f.map(u=>e.jsx(V,{size:"sm",color:"default",children:Fe[u]??u},u))]})]})}),e.jsx(le,{title:"Capabilities",children:p.length>0?e.jsx("div",{className:"flex flex-wrap gap-1.5",children:p.map(({key:u,label:P})=>e.jsx(V,{size:"sm",color:"default",children:P},u))}):e.jsx("span",{className:"text-sm text-[var(--otari-muted)]",children:r?"None reported.":"Extended metadata unavailable (models.dev disabled or unreachable)."})})]})})}const qt=15;function Ut({value:t,onChange:i,placeholder:r}){return e.jsx("input",{type:"search",value:t,onChange:s=>i(s.target.value),placeholder:r,"aria-label":r,className:"w-full max-w-xs rounded-md border border-[var(--otari-line)] bg-white px-3 py-1.5 text-sm focus:border-[var(--otari-brand)] focus:outline-none"})}const qe="otari.dashboard.modelsSort",_e={col:"model",dir:"asc"},Gt=["model","released","input","output"];function Jt(){if(typeof window>"u")return _e;try{const t=window.localStorage.getItem(qe);if(!t)return _e;const i=JSON.parse(t);if(Gt.includes(i.col)&&(i.dir==="asc"||i.dir==="desc"))return{col:i.col,dir:i.dir}}catch{}return _e}function Xt({row:t,onClose:i}){const r=je(),s=Re(),[n,a]=c.useState(t.inputPrice==null?"":String(t.inputPrice)),[f,p]=c.useState(t.outputPrice==null?"":String(t.outputPrice)),[u,P]=c.useState(t.cacheReadPrice==null?"":String(t.cacheReadPrice)),[j,k]=c.useState(t.cacheWritePrice==null?"":String(t.cacheWritePrice)),[T,y]=c.useState(t.cacheWrite1hPrice==null?"":String(t.cacheWrite1hPrice)),[h,N]=c.useState(we(t.pricingTiers)),O=ce(n)&&ce(f)&&w(u)&&w(j)&&w(T)&&Ve(h),S=()=>{O&&r.mutate({model_key:t.key,input_price_per_million:Number(n),output_price_per_million:Number(f),cache_read_price_per_million:Y(u),cache_write_price_per_million:Y(j),cache_write_1h_price_per_million:Y(T),pricing_tiers:Ye(h)},{onSuccess:i})};return e.jsxs("div",{className:"flex flex-col gap-3 px-4 py-3",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("span",{className:"text-xs font-medium break-all text-[var(--otari-muted)]",children:t.key}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["Input $ / 1M",e.jsx(b,{value:n,onChange:a,ariaLabel:`Input price for ${t.key}`})]}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["Output $ / 1M",e.jsx(b,{value:f,onChange:p,ariaLabel:`Output price for ${t.key}`})]}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["Cache read $ / 1M",e.jsx(b,{value:u,onChange:P,ariaLabel:`Cache read price for ${t.key}`})]}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["Cache write $ / 1M",e.jsx(b,{value:j,onChange:k,ariaLabel:`Cache write price for ${t.key}`})]}),e.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:["1h cache write $ / 1M",e.jsx(b,{value:T,onChange:y,ariaLabel:`1 hour cache write price for ${t.key}`})]}),e.jsx(A,{size:"sm",variant:"primary",isDisabled:r.isPending||!O,onPress:S,children:r.isPending?"Saving…":"Save"}),e.jsx(A,{size:"sm",variant:"ghost",isDisabled:r.isPending,onPress:i,children:"Cancel"}),t.source==="configured"?e.jsxs("span",{className:"inline-flex items-center gap-1",children:[e.jsx(ze,{confirmLabel:"Reset",isPending:s.isPending,onConfirm:()=>s.mutate(t.key,{onSuccess:i}),children:"Reset"}),e.jsx(oe,{label:"What reset does",children:"Removes the custom price. The model reverts to the default rate (genai-prices) when default pricing is on, otherwise it is metered at no cost."})]}):null,r.error||s.error?e.jsx("span",{className:"text-xs text-red-700",children:be(r.error??s.error)}):null]}),e.jsx(He,{tiers:h,onChange:N})]})}function Zt({primary:t,secondary:i,rowKey:r,primaryLabel:s,secondaryLabel:n,onEdit:a}){const f=(p,u)=>e.jsx("button",{type:"button","aria-label":`Edit ${u} price for ${r}`,className:"tabular-nums hover:text-[var(--otari-brand-dark)] hover:underline",onClick:P=>{P.stopPropagation(),a()},children:p==null?"—":E(p)});return e.jsxs("span",{className:"inline-flex items-center justify-end gap-1",children:[f(t,s),e.jsx("span",{className:"text-[var(--otari-muted)]",children:"/"}),f(i,n)]})}function Qt({rates:t,rowKey:i,onEdit:r}){const s=[t.cacheReadPrice==null?null:`R ${E(t.cacheReadPrice)}`,t.cacheWritePrice==null?null:`W ${E(t.cacheWritePrice)}`,t.cacheWrite1hPrice==null?null:`1h ${E(t.cacheWrite1hPrice)}`].filter(n=>n!==null);return e.jsx("button",{type:"button","aria-label":`Edit caching price for ${i}`,className:"max-w-44 text-right text-xs leading-5 text-[var(--otari-muted)] hover:text-[var(--otari-brand-dark)] hover:underline",onClick:n=>{n.stopPropagation(),r()},children:s.length>0?s.join(" · "):"Input-rate fallback"})}function ei({row:t,onEdit:i}){const r=[...t.pricingTiers].sort((n,a)=>n.min_input_tokens-a.min_input_tokens).map(n=>ae(n.min_input_tokens)),s=r.length===0?"Base only":`${r.length} tier${r.length===1?"":"s"} · ≥ ${r.join(", ")}`;return e.jsx("button",{type:"button","aria-label":`Edit pricing policy for ${t.key}`,className:"max-w-40 text-right text-xs leading-5 text-[var(--otari-muted)] hover:text-[var(--otari-brand-dark)] hover:underline",onClick:n=>{n.stopPropagation(),i()},children:s})}function ti({rows:t,isLoading:i,empty:r,sortDescriptor:s,onSortChange:n,selectedKey:a,onSelect:f,onEditPricing:p,comparisonContextTokens:u,selectedKeys:P,onSelectionChange:j}){const k=c.useMemo(()=>{const y=u==null?"Base":`at ${ae(u)}`;return[{id:"model",header:"Model",isRowHeader:!0,allowsSorting:!0,cell:h=>e.jsxs("span",{className:"font-medium break-all",children:[h.model,e.jsx("span",{className:"sr-only",children:h.key})]})},{id:"provider",header:"Provider",cell:h=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:h.provider})},{id:"input",header:e.jsxs("span",{className:"inline-flex items-center gap-1",children:[`${y} in / out $ / 1M`,e.jsx(Vt,{})]}),align:"end",allowsSorting:!0,cell:h=>{const N=Ke(h,u);return e.jsx(Zt,{primary:N.inputPrice,secondary:N.outputPrice,rowKey:h.key,primaryLabel:"input",secondaryLabel:"output",onEdit:()=>p(h.key)})}},{id:"caching",header:`Caching ${u==null?"policy":y}`,align:"end",cell:h=>e.jsx(Qt,{rates:Ke(h,u),rowKey:h.key,onEdit:()=>p(h.key)})},{id:"policy",header:"Pricing policy",align:"end",cell:h=>e.jsx(ei,{row:h,onEdit:()=>p(h.key)})}]},[u,p]),T=c.useCallback(y=>y.key===a?"bg-[var(--otari-brand-tint)]":void 0,[a]);return e.jsx(Tt,{ariaLabel:"Models",columns:k,rows:t,getRowKey:zt,isLoading:i,emptyContent:r,selectionMode:"multiple",selectedKeys:P,onSelectionChange:j,sortDescriptor:s,onSortChange:n,onRowAction:f,rowClassName:T})}function ii({providers:t}){return t.length===0?null:e.jsxs(St,{tone:"warning",children:["Could not list ",t.map(i=>i.provider).join(", "),". Check that provider's credentials in config.yml; its models are missing from the list below."]})}function pi(){var Te,Le,Ae;const t=gt(),[i]=vt(),r=_t(),s=bt(),n=jt(),a=yt(),f=je(),[p,u]=c.useState(""),[P,j]=c.useState(0),[k,T]=c.useState(qt),[y,h]=c.useState(null),[N,O]=c.useState(null),[S,Z]=c.useState(Jt),W=Mt(),[Ue,ue]=c.useState(!1),[Ge,ye]=c.useState(!1),[Je,Pe]=c.useState(void 0);c.useEffect(()=>{try{window.localStorage.setItem(qe,JSON.stringify(S))}catch{}},[S]);const[D,Ne]=c.useState(i.get("provider")||"all"),[K,Xe]=c.useState("all"),[H,Ze]=c.useState("all"),[q,Qe]=c.useState("all"),[de,et]=c.useState("0"),[Q,tt]=c.useState(""),[ee,it]=c.useState("all"),[pe,rt]=c.useState(""),F=((Te=a.data)==null?void 0:Te.models)??{},nt=((Le=a.data)==null?void 0:Le.available)??!1,Se=c.useMemo(()=>{var l;return new Set((((l=n.data)==null?void 0:l.providers)??[]).flatMap(m=>m.models.map(o=>o.key)))},[n.data]),lt=l=>{u(l),j(0)},R=l=>m=>{l(m),j(0)},te=c.useMemo(()=>{var M,v,_,$,L,z,$e;const l=new Map($t(s.data??[]).map(d=>[d.model_key,d])),m=[],o=new Set,g=(d,ve,Ee,x)=>{if(o.has(d))return;o.add(d);const C=l.get(d);m.push({key:d,model:Be(ve,Ee),provider:Ee,isDiscovered:Se.has(d),contextWindow:(x==null?void 0:x.contextWindow)??null,inputPrice:C?C.input_price_per_million:(x==null?void 0:x.inputPrice)??null,outputPrice:C?C.output_price_per_million:(x==null?void 0:x.outputPrice)??null,cacheReadPrice:C?C.cache_read_price_per_million:(x==null?void 0:x.cacheReadPrice)??null,cacheWritePrice:C?C.cache_write_price_per_million:(x==null?void 0:x.cacheWritePrice)??null,cacheWrite1hPrice:C?C.cache_write_1h_price_per_million??null:(x==null?void 0:x.cacheWrite1hPrice)??null,pricingTiers:C?C.pricing_tiers??[]:(x==null?void 0:x.pricingTiers)??[],source:C?"configured":(x==null?void 0:x.source)??"none"})};for(const d of((M=r.data)==null?void 0:M.data)??[]){if(d.owned_by===Et)continue;const ve=d.pricing_source==="default"?"default":d.pricing?"configured":"none";g(d.id,d.id,d.owned_by||Oe(d.id),{key:d.id,model:d.id,provider:d.owned_by,contextWindow:d.context_window,inputPrice:((v=d.pricing)==null?void 0:v.input_price_per_million)??null,outputPrice:((_=d.pricing)==null?void 0:_.output_price_per_million)??null,cacheReadPrice:(($=d.pricing)==null?void 0:$.cache_read_price_per_million)??null,cacheWritePrice:((L=d.pricing)==null?void 0:L.cache_write_price_per_million)??null,cacheWrite1hPrice:((z=d.pricing)==null?void 0:z.cache_write_1h_price_per_million)??null,pricingTiers:(($e=d.pricing)==null?void 0:$e.pricing_tiers)??[],source:ve})}for(const d of l.keys())g(d,d,Oe(d));return m},[r.data,s.data,Se]),Ce=c.useMemo(()=>new Map(te.map(l=>[l.key,l])),[te]),ie=c.useMemo(()=>{var o,g,M;const l=te.map(v=>{var _,$;return{...v,contextWindow:v.contextWindow??((_=F[v.key])==null?void 0:_.context_window)??null,releaseDate:(($=F[v.key])==null?void 0:$.release_date)??null}}),m=new Set(l.map(v=>v.key));for(const v of((o=n.data)==null?void 0:o.providers)??[])for(const _ of v.models)m.has(_.key)||(m.add(_.key),l.push({key:_.key,model:Be(_.key,v.provider),provider:v.provider,isDiscovered:!0,contextWindow:((g=F[_.key])==null?void 0:g.context_window)??null,releaseDate:((M=F[_.key])==null?void 0:M.release_date)??null,inputPrice:null,outputPrice:null,cacheReadPrice:null,cacheWritePrice:null,cacheWrite1hPrice:null,pricingTiers:[],source:"none"}));return l},[te,n.data,F]),at=(((Ae=n.data)==null?void 0:Ae.providers)??[]).filter(l=>!l.ok),re=c.useMemo(()=>{const l=Array.from(new Set(ie.map(m=>m.provider))).sort((m,o)=>m.localeCompare(o));return[{value:"all",label:"All providers"},...l.map(m=>({value:m,label:m}))]},[ie]);c.useEffect(()=>{D==="all"||re.length<=1||re.some(l=>l.value===D)||Ne("all")},[re,D]);const U=p.trim().toLowerCase(),he=Number(de)||0,me=Q===""?Number.POSITIVE_INFINITY:Number(Q),st=pe===""?null:Number(pe),xe=ee==="all"?null:Date.now()-Number(ee)*Rt,G=c.useMemo(()=>{const l=o=>{if(U&&!o.key.toLowerCase().includes(U)&&!o.provider.toLowerCase().includes(U)||D!=="all"&&o.provider!==D||K==="configured"&&o.source!=="configured"||K==="default"&&o.source!=="default"||K==="priced"&&o.inputPrice==null||K==="unpriced"&&o.inputPrice!=null||H==="discovered"&&!o.isDiscovered||H==="custom"&&o.isDiscovered)return!1;if(q!=="all"){const g=De.find(v=>v.value===q),M=F[o.key];if(!g||!M||!g.test(M))return!1}if(he>0&&(o.contextWindow==null||o.contextWindowme))return!1;if(xe!=null){const g=o.releaseDate?Date.parse(o.releaseDate):Number.NaN;if(Number.isNaN(g)||g{const M=S.dir==="asc"?1:-1;if(S.col==="model")return o.model.localeCompare(g.model)*M;if(S.col==="released"){const L=o.releaseDate??null,z=g.releaseDate??null;return!L&&!z?o.model.localeCompare(g.model):L?z?(Lz?1:0)*M||o.model.localeCompare(g.model):-1:1}const v=L=>S.col==="input"?L.inputPrice:L.outputPrice,_=v(o),$=v(g);return _==null&&$==null?o.model.localeCompare(g.model):_==null?1:$==null?-1:(_-$)*M||o.model.localeCompare(g.model)};return ie.filter(l).sort(m)},[ie,U,D,K,H,q,he,me,xe,F,S]),J=G.length,ct=Math.max(1,Math.ceil(J/k)),ke=Math.min(P,ct-1),Me=ke*k,fe=G.slice(Me,Me+k),ot={column:S.col,direction:S.dir==="asc"?"ascending":"descending"},ut=l=>{Z({col:String(l.column),dir:l.direction==="ascending"?"asc":"desc"}),j(0)},dt=c.useCallback(l=>h(m=>m===l?null:l),[]),ge=fe.map(l=>l.key),X=Wt(W.selectedKeys,ge),pt=ge.length>0&&X.length===ge.length&&J>X.length,ht=W.allMatching?G.map(l=>l.key):X,We=W.allMatching?J:X.length,Ie=y?G.find(l=>l.key===y)??Ce.get(y)??null:null,mt=async l=>{ye(!0),Pe(void 0);try{for(const m of ht)await f.mutateAsync({model_key:m,input_price_per_million:l.input_price_per_million,output_price_per_million:l.output_price_per_million,cache_read_price_per_million:l.cache_read_price_per_million??null,cache_write_price_per_million:l.cache_write_price_per_million??null,cache_write_1h_price_per_million:null,pricing_tiers:[]});W.clear(),ue(!1)}catch(m){Pe(m)}finally{ye(!1)}},xt=r.isLoading||s.isLoading||n.isLoading,ft=U!==""||D!=="all"||K!=="all"||H!=="all"||q!=="all"||de!=="0"||Q!==""||ee!=="all"?"No models match your filters.":"No models yet. Add a provider on the Providers page, or price a model below.",ne=N?G.find(l=>l.key===N)??Ce.get(N)??null:null;return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(Pt,{title:"Models",description:"Every model your providers can serve. Set a price on any model so budgets and usage tracking work."}),e.jsx(Nt,{error:r.error??s.error??n.error??a.error}),e.jsxs("div",{className:`grid gap-4 lg:items-start ${ne?"lg:grid-cols-[minmax(0,1fr)_360px]":"grid-cols-1"}`,children:[e.jsxs("div",{className:"flex min-w-0 flex-col gap-3",children:[e.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[e.jsx(Ut,{value:p,onChange:lt,placeholder:"Search models…"}),e.jsx(B,{ariaLabel:"Filter by provider",value:D,onChange:R(Ne),options:re}),e.jsx(B,{ariaLabel:"Filter by pricing",value:K,onChange:R(Xe),options:[{value:"all",label:"Any pricing"},{value:"configured",label:"Custom price"},{value:"default",label:"Default price"},{value:"priced",label:"Priced"},{value:"unpriced",label:"Unpriced"}]}),e.jsx(B,{ariaLabel:"Filter by source",value:H,onChange:R(Ze),options:[{value:"all",label:"Any source"},{value:"discovered",label:"Discovered"},{value:"custom",label:"Custom (not discovered)"}]}),e.jsx(B,{ariaLabel:"Filter by capability",value:q,onChange:R(Qe),options:[{value:"all",label:"Any capability"},...De.map(l=>({value:l.value,label:l.label}))]}),e.jsx(B,{ariaLabel:"Minimum context window",value:de,onChange:R(et),options:Dt}),e.jsx(B,{ariaLabel:"Maximum input price",value:Q,onChange:R(tt),options:Ft}),e.jsx(B,{ariaLabel:"Compare prices at context",value:pe,onChange:rt,options:Bt}),e.jsx(B,{ariaLabel:"Filter by release date",value:ee,onChange:R(it),options:Kt})]}),e.jsx(ii,{providers:at}),X.length>0?e.jsx(It,{selectedCount:We,allMatching:W.allMatching,matchingTotal:J,canSelectAllMatching:pt,onSelectAllMatching:W.enableAllMatching,onClear:W.clear,children:e.jsx(A,{size:"sm",variant:"primary",onPress:()=>ue(!0),children:"Set pricing"})}):null,e.jsx(ti,{rows:fe,isLoading:xt,empty:ft,sortDescriptor:ot,onSortChange:ut,selectedKey:N,onSelect:O,onEditPricing:dt,comparisonContextTokens:st,selectedKeys:W.selectedKeys,onSelectionChange:W.onSelectionChange}),Ie?e.jsx(se,{children:e.jsxs(se.Content,{className:"p-0",children:[e.jsxs("div",{className:"flex items-center justify-between border-b border-[var(--otari-line)] px-4 py-2",children:[e.jsx("span",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Edit pricing"}),e.jsx(A,{size:"sm",variant:"ghost",onPress:()=>h(null),children:"Close"})]}),e.jsx(Xt,{row:Ie,onClose:()=>h(null)})]})}):null,e.jsx(Lt,{page:ke,pageSize:k,total:J,rowsOnPage:fe.length,onPageChange:j,onPageSizeChange:l=>{T(l),j(0)},pageSizeOptions:[15,25,50]})]}),ne?e.jsx("aside",{className:"lg:sticky lg:top-4",children:e.jsx(Ht,{row:ne,metadata:F[ne.key],metadataAvailable:nt,onMakeAlias:l=>t(`/aliases?target=${encodeURIComponent(l)}`),onClose:()=>O(null)})}):null]}),e.jsx(At,{isOpen:Ue,onOpenChange:ue,targetCount:We,isPending:Ge,error:Je,onSubmit:mt,title:"Set pricing",description:l=>`Apply these per-1M rates to ${l.toLocaleString()} selected ${l===1?"model":"models"}. This replaces each model's price; pricing tiers and the 1h cache rate are cleared. Edit a single model for tiers.`})]})}export{pi as ModelsPage}; diff --git a/src/gateway/static/dashboard/assets/OverviewPage-D51QWvyh.js b/src/gateway/static/dashboard/assets/OverviewPage-BedTU_aZ.js similarity index 99% rename from src/gateway/static/dashboard/assets/OverviewPage-D51QWvyh.js rename to src/gateway/static/dashboard/assets/OverviewPage-BedTU_aZ.js index 0aa6f997..7957de38 100644 --- a/src/gateway/static/dashboard/assets/OverviewPage-D51QWvyh.js +++ b/src/gateway/static/dashboard/assets/OverviewPage-BedTU_aZ.js @@ -1 +1 @@ -import{j as t}from"./tanstack-query-1t81HyiD.js";import{r as b,i as rt,N as G}from"./react-dgEcD0HR.js";import{L as at,M as st,d as j,N as nt,l as ot,a as it,u as lt,b as dt,O as w,P as ct,R as ut,E as I,S as g,Q as _,T as N,U as R,V as D,W as mt}from"./index-mAhQhUE6.js";import{S as q}from"./charts-DIsd9m--.js";import{D as vt}from"./DataTable-Bmn_eYSV.js";import{d as H,B as ht}from"./heroui-BI50yK5B.js";import"./recharts-C4kRDmvS.js";function M(e){return e==="neutral"?void 0:e}const xt=.02,ft=.1;function B(e){if(!e||e.request_count===0)return{rate:null,status:"neutral"};const i=e.error_count/e.request_count,a=i>=ft?"alert":i>=xt?"warn":"ok";return{rate:i,status:a}}function gt(e){return!e||e.total===0?"neutral":e.healthy>=e.total?"ok":e.healthy===0?"alert":"warn"}const pt=.8;function bt(e){if(e.length===0)return{status:"neutral",label:"No budgets configured",overCount:0,nearCount:0,cappedCount:0};const i=e.filter(r=>r.max_budget!==null&&r.user_count>0);if(i.length===0)return{status:"neutral",label:"No capped budgets",overCount:0,nearCount:0,cappedCount:0};let a=0,s=0,n,c=-1;for(const r of i){const o=r.max_budget*r.user_count,l=o>0?r.total_spend/o:0;l>=1?a+=1:l>=pt&&(s+=1),l>c&&(c=l,n={name:r.name??r.budget_id,spent:r.total_spend,allocated:o,pct:l})}const d=a>0?"alert":s>0?"warn":"ok",p=a>0?`${a} over limit`:s>0?`${s} near limit`:"All within budget";return{status:d,label:p,overCount:a,nearCount:s,cappedCount:i.length,worst:n}}const W=864e5,K=30;function T(){const e=new Date;return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`}function yt(){const[e,i]=b.useState(T);return b.useEffect(()=>{const a=()=>{if(document.visibilityState==="visible"){const s=T();i(n=>n===s?n:s)}};return document.addEventListener("visibilitychange",a),window.addEventListener("focus",a),()=>{document.removeEventListener("visibilitychange",a),window.removeEventListener("focus",a)}},[]),b.useMemo(()=>{const a=Date.now(),s=new Date(a);return{today:new Date(s.getFullYear(),s.getMonth(),s.getDate()).toISOString(),periodStart:new Date(a-K*W).toISOString(),prevStart:new Date(a-2*K*W).toISOString()}},[e])}const St={ok:"Healthy",warn:"Elevated",alert:"High"},jt={ok:"On track",warn:"Near limit",alert:"Over budget"};function Pt(){const e=at();return e.isLoading?t.jsx(st,{}):t.jsx(wt,{needsSetup:e.isSuccess&&e.data.providers.length===0})}function wt({needsSetup:e=!1}){var L,O,A,$,F,P,U;const i=yt(),a=b.useMemo(()=>({start_date:i.today}),[i]),s=b.useMemo(()=>({start_date:i.periodStart}),[i]),n=b.useMemo(()=>({start_date:i.prevStart,end_date:i.periodStart}),[i]),c=j(a,"hour"),d=j(s,"day"),p=j(n,"day"),r=nt(),o=ot(),l=it(),y=lt(),h=dt({},0,5),E=(L=c.data)==null?void 0:L.totals,v=(O=d.data)==null?void 0:O.totals,x=(A=p.data)==null?void 0:A.totals,S=(($=d.data)==null?void 0:$.series)??[],C=S.length>1,u=B(v),k=B(x),Y=u.rate!==null&&k.rate!==null?w(u.rate,k.rate):null,m=bt(o.data??[]),V=gt(r.data),Q=(l.data??[]).filter(f=>f.is_active).length,z=(y.data??[]).filter(f=>!f.blocked).length,J=(((F=h.data)==null?void 0:F.length)??0)>0,X=e&&h.isSuccess&&!J,Z=c.error??d.error??r.error??o.error??l.error??y.error,tt=()=>{c.refetch(),d.refetch(),p.refetch(),r.refetch(),o.refetch(),l.refetch(),y.refetch(),h.refetch()},et=c.isFetching||d.isFetching||r.isFetching||o.isFetching||l.isFetching||y.isFetching||h.isFetching;return t.jsxs("div",{className:"flex flex-col gap-6",children:[t.jsx(ct,{title:"Overview",description:"At-a-glance spend, traffic, and health across the gateway.",action:t.jsx(ut,{onRefresh:tt,isFetching:et,updatedAt:d.dataUpdatedAt})}),X?t.jsx(Nt,{}):null,t.jsx(I,{error:Z}),t.jsx(_t,{providerHealth:V,healthy:((P=r.data)==null?void 0:P.healthy)??0,total:((U=r.data)==null?void 0:U.total)??0,budget:m,errStatus:u.status,errRate:u.rate,ready:r.isSuccess&&o.isSuccess&&d.isSuccess,failed:r.isError||o.isError||d.isError}),t.jsxs("div",{className:"grid grid-cols-2 gap-4 sm:grid-cols-3 xl:grid-cols-4",children:[t.jsx(g,{label:"Spend today",value:E?_(E.cost):"—"}),t.jsx(g,{label:"Spend, last 30 days",value:v?_(v.cost):"—",hint:v?t.jsx(N,{fraction:w(v.cost,x==null?void 0:x.cost)}):null,chart:C?t.jsx(q,{values:S.map(f=>f.cost),ariaLabel:"Spend trend over the last 30 days"}):void 0}),t.jsx(g,{label:"Requests, last 30 days",value:v?R(v.request_count):"—",hint:v?t.jsx(N,{fraction:w(v.request_count,x==null?void 0:x.request_count)}):null,chart:C?t.jsx(q,{values:S.map(f=>f.requests),ariaLabel:"Request volume trend over the last 30 days"}):void 0}),t.jsx(g,{label:"Error rate, last 30 days",value:u.rate===null?"—":D(u.rate),status:M(u.status),statusLabel:u.status==="neutral"?void 0:St[u.status],hint:u.rate!==null?t.jsx(N,{fraction:Y}):null}),t.jsx(g,{label:"Budget health",value:o.data&&m.worst?D(m.worst.pct):"—",status:o.data?M(m.status):void 0,statusLabel:o.data&&m.status!=="neutral"?jt[m.status]:void 0,hint:o.data?m.worst?`${m.label} · worst: ${m.worst.name}`:m.label:void 0,to:"/budgets"}),t.jsx(g,{label:"Active keys",value:l.data?R(Q):"—",to:"/keys"}),t.jsx(g,{label:"Active users",value:y.data?R(z):"—",to:"/users"})]}),t.jsx(Et,{entries:h.data??[],loading:h.isLoading,error:h.error})]})}function Nt(){const e=rt();return t.jsx(H,{children:t.jsxs(H.Content,{className:"flex flex-col gap-3 p-6",children:[t.jsxs("div",{children:[t.jsx("h2",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:"Get started with Otari"}),t.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:"Add a provider to begin serving models. Once it is configured, this page will show your gateway’s traffic, spend, and health."})]}),t.jsx("div",{children:t.jsx(ht,{variant:"primary",onPress:()=>e("/providers"),children:"Add your first provider"})})]})})}function Rt({text:e}){return t.jsx("div",{role:"status",className:"flex items-center gap-2 rounded-xl border border-[var(--otari-line)] bg-[var(--otari-bg)] px-4 py-3 text-sm text-[var(--otari-muted)]",children:e})}function _t({providerHealth:e,healthy:i,total:a,budget:s,errStatus:n,errRate:c,ready:d,failed:p}){if(p)return t.jsx(Rt,{text:"Some status data could not be loaded."});if(!d)return null;const r=[];if((e==="warn"||e==="alert")&&a>0){const o=a-i;r.push({text:`${o} provider${o===1?"":"s"} unreachable`,to:"/providers"})}return s.overCount>0?r.push({text:`${s.overCount} budget${s.overCount===1?"":"s"} over limit`,to:"/budgets"}):s.nearCount>0&&r.push({text:`${s.nearCount} budget${s.nearCount===1?"":"s"} near limit`,to:"/budgets"}),n==="alert"&&c!==null&&r.push({text:`error rate ${D(c)}`,to:"/activity?status=error"}),r.length===0?null:t.jsxs("div",{role:"alert",className:"flex flex-col gap-2 rounded-xl border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-900 sm:flex-row sm:flex-wrap sm:items-center",children:[t.jsx("span",{className:"font-medium",children:"Needs attention:"}),r.map((o,l)=>t.jsxs("span",{className:"flex items-center gap-2",children:[l>0?t.jsx("span",{"aria-hidden":!0,className:"text-amber-400",children:"·"}):null,t.jsx(G,{to:o.to,className:"underline underline-offset-2 hover:text-amber-950",children:o.text})]},o.to+o.text))]})}function Dt(e){return e==="error"?"error":"ok"}function Et({entries:e,loading:i,error:a}){const s=[{id:"time",header:"Time",cell:n=>t.jsx("span",{className:"text-[var(--otari-muted)]",title:new Date(n.timestamp).toLocaleString(),children:mt(n.timestamp)})},{id:"model",header:"Model",isRowHeader:!0,cell:n=>t.jsx("span",{className:"text-[var(--otari-ink)]",children:n.model})},{id:"cost",header:"Cost",align:"end",cell:n=>n.cost===null?"—":_(n.cost)},{id:"status",header:"Status",cell:n=>t.jsx("span",{className:`inline-flex items-center rounded-full border px-2 py-0.5 text-xs font-medium ${n.status==="error"?"border-red-200 bg-red-50 text-red-700":"border-[var(--otari-line)] bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]"}`,children:Dt(n.status)})}];return t.jsxs("div",{className:"flex flex-col gap-3",children:[t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Recent activity"}),t.jsx(G,{to:"/activity",className:"text-sm text-[var(--otari-brand-dark)] hover:underline",children:"View all →"})]}),t.jsx(I,{error:a}),t.jsx(vt,{ariaLabel:"Recent activity",columns:s,rows:e,getRowKey:n=>n.id,isLoading:i,emptyContent:"No requests yet. Once the gateway serves traffic, it appears here."})]})}export{Pt as OverviewIndex,wt as OverviewPage,T as localDayKey}; +import{j as t}from"./tanstack-query-1t81HyiD.js";import{r as b,i as rt,N as G}from"./react-dgEcD0HR.js";import{L as at,M as st,d as j,N as nt,l as ot,a as it,u as lt,b as dt,O as w,P as ct,R as ut,E as I,S as g,Q as _,T as N,U as R,V as D,W as mt}from"./index-DV8qvdUj.js";import{S as q}from"./charts-DIsd9m--.js";import{D as vt}from"./DataTable-Bmn_eYSV.js";import{d as H,B as ht}from"./heroui-BI50yK5B.js";import"./recharts-C4kRDmvS.js";function M(e){return e==="neutral"?void 0:e}const xt=.02,ft=.1;function B(e){if(!e||e.request_count===0)return{rate:null,status:"neutral"};const i=e.error_count/e.request_count,a=i>=ft?"alert":i>=xt?"warn":"ok";return{rate:i,status:a}}function gt(e){return!e||e.total===0?"neutral":e.healthy>=e.total?"ok":e.healthy===0?"alert":"warn"}const pt=.8;function bt(e){if(e.length===0)return{status:"neutral",label:"No budgets configured",overCount:0,nearCount:0,cappedCount:0};const i=e.filter(r=>r.max_budget!==null&&r.user_count>0);if(i.length===0)return{status:"neutral",label:"No capped budgets",overCount:0,nearCount:0,cappedCount:0};let a=0,s=0,n,c=-1;for(const r of i){const o=r.max_budget*r.user_count,l=o>0?r.total_spend/o:0;l>=1?a+=1:l>=pt&&(s+=1),l>c&&(c=l,n={name:r.name??r.budget_id,spent:r.total_spend,allocated:o,pct:l})}const d=a>0?"alert":s>0?"warn":"ok",p=a>0?`${a} over limit`:s>0?`${s} near limit`:"All within budget";return{status:d,label:p,overCount:a,nearCount:s,cappedCount:i.length,worst:n}}const W=864e5,K=30;function T(){const e=new Date;return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`}function yt(){const[e,i]=b.useState(T);return b.useEffect(()=>{const a=()=>{if(document.visibilityState==="visible"){const s=T();i(n=>n===s?n:s)}};return document.addEventListener("visibilitychange",a),window.addEventListener("focus",a),()=>{document.removeEventListener("visibilitychange",a),window.removeEventListener("focus",a)}},[]),b.useMemo(()=>{const a=Date.now(),s=new Date(a);return{today:new Date(s.getFullYear(),s.getMonth(),s.getDate()).toISOString(),periodStart:new Date(a-K*W).toISOString(),prevStart:new Date(a-2*K*W).toISOString()}},[e])}const St={ok:"Healthy",warn:"Elevated",alert:"High"},jt={ok:"On track",warn:"Near limit",alert:"Over budget"};function Pt(){const e=at();return e.isLoading?t.jsx(st,{}):t.jsx(wt,{needsSetup:e.isSuccess&&e.data.providers.length===0})}function wt({needsSetup:e=!1}){var L,O,A,$,F,P,U;const i=yt(),a=b.useMemo(()=>({start_date:i.today}),[i]),s=b.useMemo(()=>({start_date:i.periodStart}),[i]),n=b.useMemo(()=>({start_date:i.prevStart,end_date:i.periodStart}),[i]),c=j(a,"hour"),d=j(s,"day"),p=j(n,"day"),r=nt(),o=ot(),l=it(),y=lt(),h=dt({},0,5),E=(L=c.data)==null?void 0:L.totals,v=(O=d.data)==null?void 0:O.totals,x=(A=p.data)==null?void 0:A.totals,S=(($=d.data)==null?void 0:$.series)??[],C=S.length>1,u=B(v),k=B(x),Y=u.rate!==null&&k.rate!==null?w(u.rate,k.rate):null,m=bt(o.data??[]),V=gt(r.data),Q=(l.data??[]).filter(f=>f.is_active).length,z=(y.data??[]).filter(f=>!f.blocked).length,J=(((F=h.data)==null?void 0:F.length)??0)>0,X=e&&h.isSuccess&&!J,Z=c.error??d.error??r.error??o.error??l.error??y.error,tt=()=>{c.refetch(),d.refetch(),p.refetch(),r.refetch(),o.refetch(),l.refetch(),y.refetch(),h.refetch()},et=c.isFetching||d.isFetching||r.isFetching||o.isFetching||l.isFetching||y.isFetching||h.isFetching;return t.jsxs("div",{className:"flex flex-col gap-6",children:[t.jsx(ct,{title:"Overview",description:"At-a-glance spend, traffic, and health across the gateway.",action:t.jsx(ut,{onRefresh:tt,isFetching:et,updatedAt:d.dataUpdatedAt})}),X?t.jsx(Nt,{}):null,t.jsx(I,{error:Z}),t.jsx(_t,{providerHealth:V,healthy:((P=r.data)==null?void 0:P.healthy)??0,total:((U=r.data)==null?void 0:U.total)??0,budget:m,errStatus:u.status,errRate:u.rate,ready:r.isSuccess&&o.isSuccess&&d.isSuccess,failed:r.isError||o.isError||d.isError}),t.jsxs("div",{className:"grid grid-cols-2 gap-4 sm:grid-cols-3 xl:grid-cols-4",children:[t.jsx(g,{label:"Spend today",value:E?_(E.cost):"—"}),t.jsx(g,{label:"Spend, last 30 days",value:v?_(v.cost):"—",hint:v?t.jsx(N,{fraction:w(v.cost,x==null?void 0:x.cost)}):null,chart:C?t.jsx(q,{values:S.map(f=>f.cost),ariaLabel:"Spend trend over the last 30 days"}):void 0}),t.jsx(g,{label:"Requests, last 30 days",value:v?R(v.request_count):"—",hint:v?t.jsx(N,{fraction:w(v.request_count,x==null?void 0:x.request_count)}):null,chart:C?t.jsx(q,{values:S.map(f=>f.requests),ariaLabel:"Request volume trend over the last 30 days"}):void 0}),t.jsx(g,{label:"Error rate, last 30 days",value:u.rate===null?"—":D(u.rate),status:M(u.status),statusLabel:u.status==="neutral"?void 0:St[u.status],hint:u.rate!==null?t.jsx(N,{fraction:Y}):null}),t.jsx(g,{label:"Budget health",value:o.data&&m.worst?D(m.worst.pct):"—",status:o.data?M(m.status):void 0,statusLabel:o.data&&m.status!=="neutral"?jt[m.status]:void 0,hint:o.data?m.worst?`${m.label} · worst: ${m.worst.name}`:m.label:void 0,to:"/budgets"}),t.jsx(g,{label:"Active keys",value:l.data?R(Q):"—",to:"/keys"}),t.jsx(g,{label:"Active users",value:y.data?R(z):"—",to:"/users"})]}),t.jsx(Et,{entries:h.data??[],loading:h.isLoading,error:h.error})]})}function Nt(){const e=rt();return t.jsx(H,{children:t.jsxs(H.Content,{className:"flex flex-col gap-3 p-6",children:[t.jsxs("div",{children:[t.jsx("h2",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:"Get started with Otari"}),t.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:"Add a provider to begin serving models. Once it is configured, this page will show your gateway’s traffic, spend, and health."})]}),t.jsx("div",{children:t.jsx(ht,{variant:"primary",onPress:()=>e("/providers"),children:"Add your first provider"})})]})})}function Rt({text:e}){return t.jsx("div",{role:"status",className:"flex items-center gap-2 rounded-xl border border-[var(--otari-line)] bg-[var(--otari-bg)] px-4 py-3 text-sm text-[var(--otari-muted)]",children:e})}function _t({providerHealth:e,healthy:i,total:a,budget:s,errStatus:n,errRate:c,ready:d,failed:p}){if(p)return t.jsx(Rt,{text:"Some status data could not be loaded."});if(!d)return null;const r=[];if((e==="warn"||e==="alert")&&a>0){const o=a-i;r.push({text:`${o} provider${o===1?"":"s"} unreachable`,to:"/providers"})}return s.overCount>0?r.push({text:`${s.overCount} budget${s.overCount===1?"":"s"} over limit`,to:"/budgets"}):s.nearCount>0&&r.push({text:`${s.nearCount} budget${s.nearCount===1?"":"s"} near limit`,to:"/budgets"}),n==="alert"&&c!==null&&r.push({text:`error rate ${D(c)}`,to:"/activity?status=error"}),r.length===0?null:t.jsxs("div",{role:"alert",className:"flex flex-col gap-2 rounded-xl border border-amber-200 bg-amber-50 px-4 py-3 text-sm text-amber-900 sm:flex-row sm:flex-wrap sm:items-center",children:[t.jsx("span",{className:"font-medium",children:"Needs attention:"}),r.map((o,l)=>t.jsxs("span",{className:"flex items-center gap-2",children:[l>0?t.jsx("span",{"aria-hidden":!0,className:"text-amber-400",children:"·"}):null,t.jsx(G,{to:o.to,className:"underline underline-offset-2 hover:text-amber-950",children:o.text})]},o.to+o.text))]})}function Dt(e){return e==="error"?"error":"ok"}function Et({entries:e,loading:i,error:a}){const s=[{id:"time",header:"Time",cell:n=>t.jsx("span",{className:"text-[var(--otari-muted)]",title:new Date(n.timestamp).toLocaleString(),children:mt(n.timestamp)})},{id:"model",header:"Model",isRowHeader:!0,cell:n=>t.jsx("span",{className:"text-[var(--otari-ink)]",children:n.model})},{id:"cost",header:"Cost",align:"end",cell:n=>n.cost===null?"—":_(n.cost)},{id:"status",header:"Status",cell:n=>t.jsx("span",{className:`inline-flex items-center rounded-full border px-2 py-0.5 text-xs font-medium ${n.status==="error"?"border-red-200 bg-red-50 text-red-700":"border-[var(--otari-line)] bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]"}`,children:Dt(n.status)})}];return t.jsxs("div",{className:"flex flex-col gap-3",children:[t.jsxs("div",{className:"flex items-center justify-between",children:[t.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Recent activity"}),t.jsx(G,{to:"/activity",className:"text-sm text-[var(--otari-brand-dark)] hover:underline",children:"View all →"})]}),t.jsx(I,{error:a}),t.jsx(vt,{ariaLabel:"Recent activity",columns:s,rows:e,getRowKey:n=>n.id,isLoading:i,emptyContent:"No requests yet. Once the gateway serves traffic, it appears here."})]})}export{Pt as OverviewIndex,wt as OverviewPage,T as localDayKey}; diff --git a/src/gateway/static/dashboard/assets/ProvidersPage-DBjl1bc3.js b/src/gateway/static/dashboard/assets/ProvidersPage-BP60GuZv.js similarity index 99% rename from src/gateway/static/dashboard/assets/ProvidersPage-DBjl1bc3.js rename to src/gateway/static/dashboard/assets/ProvidersPage-BP60GuZv.js index 2459fb7f..741f8b2f 100644 --- a/src/gateway/static/dashboard/assets/ProvidersPage-DBjl1bc3.js +++ b/src/gateway/static/dashboard/assets/ProvidersPage-BP60GuZv.js @@ -1 +1 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as x,L as M}from"./react-dgEcD0HR.js";import{L as Y,X as G,J as V,N as W,Y as J,Z as X,_ as Z,P as Q,E as I,I as ee,$ as te,a0 as se,W as $,C as ae,a1 as O,a2 as ne,G as q,a3 as re,a4 as ie}from"./index-mAhQhUE6.js";import{F as S}from"./Field-Dwp6u3t8.js";import{D as oe}from"./DataTable-Bmn_eYSV.js";import{B as f,d as _,f as de,T as le,L as F,I as H,D as ce,S as me,C as T,a as ue,b as xe}from"./heroui-BI50yK5B.js";function R({value:s,onChange:a,label:t,placeholder:r,description:i}){return e.jsxs(le,{value:s,onChange:a,className:"flex max-w-md flex-col gap-1",children:[e.jsx(F,{className:"text-sm font-medium text-[var(--otari-ink)]",children:t}),e.jsx(H,{type:"password",placeholder:r??"sk-…",autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",spellCheck:!1,"data-1p-ignore":!0,"data-lpignore":"true"}),i?e.jsx(ce,{className:"text-xs text-[var(--otari-muted)]",children:i}):null]})}function z({label:s,value:a,onChange:t,description:r,placeholder:i,extra:l=[],includeCatalog:m=!0}){var k;const g=re(),u=x.useMemo(()=>m?[...l,...(g.data??[]).map(o=>({id:o.id,name:o.name}))]:l,[g.data,l,m]),[p,c]=x.useState(()=>{var o;return((o=u.find(y=>y.id===a))==null?void 0:o.name)??""}),j=((k=u.find(o=>o.id===a))==null?void 0:k.name)??"",h=p.trim()===j.trim()?"":p.trim().toLowerCase(),d=u.filter(o=>!h||o.name.toLowerCase().includes(h)||o.id.toLowerCase().includes(h)).slice(0,50);return e.jsxs(T.Root,{allowsEmptyCollection:!0,menuTrigger:"focus",inputValue:p,onInputChange:c,onSelectionChange:o=>{var y;o!=null?(t(String(o)),c(((y=u.find(N=>N.id===String(o)))==null?void 0:y.name)??"")):(t(""),c(""))},className:"flex max-w-md flex-col gap-1",children:[e.jsx(F,{className:"text-sm font-medium text-[var(--otari-ink)]",children:s}),e.jsxs(T.InputGroup,{children:[e.jsx(H,{placeholder:i??"Search providers…",autoComplete:"off","data-1p-ignore":!0,"data-lpignore":"true",onFocus:o=>o.currentTarget.select()}),e.jsx(T.Trigger,{})]}),e.jsx(T.Popover,{children:e.jsx(ue,{items:d,className:"max-h-72 overflow-auto",children:o=>e.jsx(xe,{id:o.id,textValue:o.name,children:o.name})})}),r?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:r}):null]})}function U({getPayload:s}){const a=ie(),t=s();return e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx(f,{variant:"outline",isDisabled:t===null||a.isPending,onPress:()=>{t&&a.mutate(t)},children:a.isPending?"Testing…":"Test connection"}),e.jsx("span",{role:"status","aria-live":"polite",children:a.isPending?null:a.error?e.jsx("span",{className:"text-xs text-red-700",children:q(a.error)}):a.data?a.data.ok?e.jsxs("span",{className:"text-xs font-medium text-green-700",children:["Connected. ",a.data.model_count," model",a.data.model_count===1?"":"s"," available."]}):e.jsx("span",{className:"block max-w-md break-words text-xs text-red-700",children:a.data.error??"Connection failed."}):null})]})}function pe({onClose:s}){var w;const a=O(),[t,r]=x.useState(""),[i,l]=x.useState(""),[m,g]=x.useState(!1),[u,p]=x.useState(""),[c,j]=x.useState(""),h=ne(t),d=((w=h.data)==null?void 0:w.id)===t?h.data:void 0;x.useEffect(()=>{d&&p(d.default_api_base??"")},[d]);const k=(d==null?void 0:d.env_key_present)??!1,o=((d==null?void 0:d.requires_api_key)??!0)&&!k,y=c.trim()!==""&&c.trim()!==t,N=/[:/]/.test(c),P=t!==""&&!N&&(!o||i.trim()!=="")&&!a.isPending,C=()=>{P&&a.mutate({instance:y?c.trim():t,provider_type:y?t:null,api_base:u.trim()||null,api_key:i.trim()||null},{onSuccess:s})};return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(I,{error:a.error}),e.jsx(z,{label:"Provider",value:t,onChange:A=>{r(A),j(""),p("")},description:"Its endpoint is built in."}),e.jsx(R,{value:i,onChange:l,label:d&&!o?"API key (optional)":"API key",description:d?o?`${d.name}'s endpoint is built in — just add your key.`:k?`${d.env_key} is set on the server, so a key is optional here. Paste one to override it.`:`${d.name} needs no API key.`:"Stored encrypted. Requires OTARI_SECRET_KEY on the server."}),e.jsx("button",{type:"button",className:"self-start text-xs font-medium text-[var(--otari-brand-dark)]",onClick:()=>g(A=>!A),children:m?"Hide advanced":"Advanced (API base, rename)"}),m?e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(S,{label:"API base",value:u,onChange:p,placeholder:(d==null?void 0:d.default_api_base)??"https://…/v1",description:"Only if you route through a proxy. Blank uses the built-in default."}),e.jsx(S,{label:"Name",value:c,onChange:j,placeholder:t||"instance name",description:N?e.jsx("span",{className:"text-red-700",children:"A name cannot contain “:” or “/”."}):"Rename to run two instances of the same provider."})]}):null,e.jsxs("div",{className:"flex flex-wrap items-start gap-2",children:[e.jsx(f,{variant:"primary",isDisabled:!P,onPress:C,children:a.isPending?"Adding…":"Add provider"}),e.jsx(f,{variant:"ghost",onPress:s,children:"Cancel"}),e.jsx(U,{getPayload:()=>t===""?null:{instance:y?c.trim():t,provider_type:y?t:null,api_base:u.trim()||null,api_key:i.trim()||null}})]})]})}function he({onClose:s}){const a=O(),[t,r]=x.useState(""),[i,l]=x.useState("openai-compatible"),[m,g]=x.useState(""),[u,p]=x.useState(""),c=/[:/]/.test(t),j=t.trim()!==""&&!c&&m.trim()!==""&&!a.isPending,h=()=>{j&&a.mutate({instance:t.trim(),provider_type:i||"openai-compatible",api_base:m.trim(),api_key:u.trim()||null},{onSuccess:s})};return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(I,{error:a.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(S,{label:"Name",value:t,onChange:r,placeholder:"my-local-llm",isRequired:!0,autoFocus:!0,description:c?e.jsx("span",{className:"text-red-700",children:"A name cannot contain “:” or “/”."}):"Call it whatever you want."}),e.jsx(z,{label:"Compatible with",value:i,onChange:l,includeCatalog:!1,description:"The API this endpoint speaks.",extra:[{id:"openai-compatible",name:"OpenAI"},{id:"anthropic-compatible",name:"Anthropic"}]})]}),e.jsx(S,{label:"API base",value:m,onChange:g,placeholder:"http://localhost:8000/v1",isRequired:!0,description:"The endpoint URL of your server."}),e.jsx(R,{value:u,onChange:p,label:"API key (optional)",description:"Many local backends need none. Stored encrypted."}),e.jsxs("div",{className:"flex flex-wrap items-start gap-2",children:[e.jsx(f,{variant:"primary",isDisabled:!j,onPress:h,children:a.isPending?"Adding…":"Add provider"}),e.jsx(f,{variant:"ghost",onPress:s,children:"Cancel"}),e.jsx(U,{getPayload:()=>t.trim()===""||m.trim()===""?null:{instance:t.trim(),provider_type:i||"openai-compatible",api_base:m.trim(),api_key:u.trim()||null}})]})]})}function ve({onClose:s}){const[a,t]=x.useState("known");return e.jsx(_,{children:e.jsxs(_.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsx("div",{className:"flex items-center justify-between",children:e.jsx("div",{className:"flex items-center gap-1 rounded-lg bg-[var(--otari-bg)] p-1",children:[["known","Known provider"],["custom","Custom endpoint"]].map(([r,i])=>e.jsx("button",{type:"button","aria-pressed":a===r,onClick:()=>t(r),className:a===r?"rounded-md bg-white px-3 py-1.5 text-sm font-medium text-[var(--otari-ink)] shadow-sm":"rounded-md px-3 py-1.5 text-sm text-[var(--otari-muted)] hover:text-[var(--otari-ink)]",children:i},r))})}),a==="known"?e.jsx(pe,{onClose:s}):e.jsx(he,{onClose:s})]})})}function ge({provider:s,onClose:a}){const t=te(),[r,i]=x.useState(s.provider_type??""),[l,m]=x.useState(s.api_base??""),[g,u]=x.useState(!1),[p,c]=x.useState(""),j=()=>{if(t.isPending)return;const h={provider_type:r.trim()||null,api_base:l.trim()||null,expected_updated_at:s.updated_at};g&&p.trim()&&(h.api_key=p.trim()),t.mutate({instance:s.instance,body:h},{onSuccess:a})};return e.jsx(_,{children:e.jsxs(_.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsxs("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:["Edit ",e.jsx("code",{children:s.instance})]}),e.jsx(I,{error:t.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(S,{label:"Provider type",value:r,onChange:i,placeholder:"openai"}),e.jsx(S,{label:"API base",value:l,onChange:m,placeholder:"https://api.openai.com/v1"})]}),e.jsx("div",{className:"flex flex-col gap-2",children:g?e.jsxs(e.Fragment,{children:[e.jsx(R,{value:p,onChange:c,label:"New API key",description:"Stored encrypted. The old key is replaced when you save."}),e.jsx("button",{type:"button",className:"self-start text-xs font-medium text-[var(--otari-brand-dark)]",onClick:()=>{u(!1),c("")},children:"Keep the current key"})]}):e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("span",{className:"text-sm text-[var(--otari-muted)]",children:["API key: ",e.jsx("code",{children:s.last4?`••••${s.last4}`:"none set"})]}),e.jsx(f,{size:"sm",variant:"outline",onPress:()=>u(!0),children:"Replace key"})]})}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(f,{variant:"primary",isDisabled:t.isPending,onPress:j,children:t.isPending?"Saving…":"Save changes"}),e.jsx(f,{variant:"ghost",onPress:a,children:"Cancel"})]})]})})}function fe(s,a){const t=new Map((a??[]).map(l=>[l.instance,l])),r=new Map((s??[]).map(l=>[l.instance,l]));return[...new Set([...t.keys(),...r.keys()])].sort().map(l=>{const m=t.get(l);return{instance:l,source:m?"stored":"config",stored:m,meta:r.get(l)}})}function je({state:s}){return s?s.status==="pending"?e.jsxs("span",{className:"inline-flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:[e.jsx(me,{size:"sm"})," Testing…"]}):s.ok?e.jsxs("span",{className:"text-xs font-medium text-green-700",children:["Connected. ",s.model_count," model",s.model_count===1?"":"s"," available."]}):e.jsx("span",{className:"block max-w-xs break-words text-xs text-red-700",children:s.error??"Connection failed."}):null}function ye({health:s}){if(!s)return e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"—"});const a=s.ok?"border-green-200 bg-green-50 text-green-700":"border-red-200 bg-red-50 text-red-700",t=s.checked_at?`Last checked ${$(s.checked_at)}`:"Not checked yet",r=s.ok?t:`${s.error??"Unreachable"} · ${t}`;return e.jsxs("span",{title:r,className:`inline-flex items-center gap-1.5 rounded-full border px-2.5 py-0.5 text-xs font-medium ${a}`,children:[e.jsx("span",{"aria-hidden":!0,className:`h-1.5 w-1.5 rounded-full ${s.ok?"bg-green-500":"bg-red-500"}`}),s.ok?"Reachable":"Unreachable"]})}function be({healthy:s,total:a,checkedAt:t}){const r=s===a,i=se();return e.jsxs("div",{className:"flex flex-wrap items-center gap-3 rounded-xl border border-[var(--otari-line)] bg-[var(--otari-surface)] px-4 py-2.5 text-sm",children:[e.jsx("span",{"aria-hidden":!0,className:`h-2 w-2 rounded-full ${r?"bg-green-500":"bg-red-500"}`}),e.jsxs("span",{className:"font-medium text-[var(--otari-ink)]",children:[s," of ",a," provider",a===1?"":"s"," reachable"]}),t?e.jsxs("span",{className:"text-[var(--otari-muted)]",children:["Last checked ",$(t)]}):null,e.jsx(f,{size:"sm",variant:"ghost",className:"ml-auto",isDisabled:i.isPending,onPress:()=>i.mutate(),children:i.isPending?"Re-checking…":"Re-check all"})]})}function E({n:s,title:a,children:t}){return e.jsxs("li",{className:"flex gap-3",children:[e.jsx("span",{className:"flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-[var(--otari-brand-tint)] text-xs font-semibold text-[var(--otari-brand-dark)]",children:s}),e.jsxs("div",{className:"text-sm",children:[e.jsx("div",{className:"font-medium text-[var(--otari-ink)]",children:a}),e.jsx("div",{className:"text-[var(--otari-muted)]",children:t})]})]})}function ke({onAddProvider:s,needsPricing:a,onEnablePricing:t,enabling:r,secretKeyConfigured:i}){return e.jsx(_,{children:e.jsxs(_.Content,{className:"flex flex-col gap-4 p-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:"Welcome to Otari"}),e.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:"You are signed in. Add a provider to start serving models: three quick steps."})]}),e.jsxs("ol",{className:"flex flex-col gap-3",children:[e.jsxs(E,{n:1,title:"Add a provider",children:["Enter a provider name (like ",e.jsx("code",{children:"openai"}),") and its API key. Keys are encrypted at rest."]}),e.jsxs(E,{n:2,title:"Test the connection",children:["Use ",e.jsx("strong",{children:"Test"})," on the provider row to confirm the key works and see how many models it serves."]}),e.jsxs(E,{n:3,title:"Send your first request",children:["Point your app at ",e.jsx("code",{children:"/v1"})," on this gateway with the API key printed in the server logs (",e.jsx("code",{children:"gw-…"}),"). See the"," ",e.jsx("a",{href:"/welcome",className:"font-medium text-[var(--otari-brand-dark)]",children:"quickstart"}),"."]})]}),a?e.jsxs("p",{className:"text-sm text-[var(--otari-muted)]",children:["Tip: ",e.jsx("code",{children:"require_pricing"})," is on, so requests are rejected until pricing is set."," ",e.jsx("button",{type:"button",className:"font-medium text-[var(--otari-brand-dark)] disabled:opacity-50",disabled:r,onClick:t,children:"Enable default pricing"})," ","to meter new models with public rates."]}):null,e.jsx("div",{children:e.jsx(f,{variant:"primary",isDisabled:!i,onPress:s,children:"Add your first provider"})})]})})}function we(){var K,B,D,L;const s=Y(),a=G(),t=V(),r=W(),i=J(),l=X(),m=Z(),[g,u]=x.useState(!1),[p,c]=x.useState(null),[j,h]=x.useState({}),d=fe((K=s.data)==null?void 0:K.providers,a.data),k=new Map((((B=r.data)==null?void 0:B.providers)??[]).map(n=>[n.instance,n])),o=s.isLoading||a.isLoading,y=((D=a.data)==null?void 0:D.find(n=>n.instance===p))??null,N=((L=t.data)==null?void 0:L.require_pricing)===!0&&t.data.default_pricing===!1,P=t.data?t.data.secret_key_configured!==!1:!t.isError,C=!o&&d.length===0&&!g,w=n=>{h(v=>({...v,[n]:{status:"pending"}})),l.mutate(n,{onSuccess:v=>h(b=>({...b,[n]:{status:"done",...v}})),onError:v=>h(b=>({...b,[n]:{status:"done",ok:!1,model_count:0,error:q(v)}}))})},A=[{id:"provider",header:"Provider",isRowHeader:!0,cell:n=>e.jsx(M,{to:`/models?provider=${encodeURIComponent(n.instance)}`,className:"font-medium text-[var(--otari-ink)] hover:text-[var(--otari-brand-dark)] hover:underline",children:n.instance})},{id:"type",header:"Type",cell:n=>{var v,b;return e.jsx("span",{className:"text-[var(--otari-muted)]",children:((v=n.meta)==null?void 0:v.provider_type)??((b=n.stored)==null?void 0:b.provider_type)??n.instance})}},{id:"source",header:"Source",cell:n=>e.jsx(de,{size:"sm",color:n.source==="stored"?"accent":"default",children:n.source==="stored"?"stored":"config"})},{id:"api_key",header:"API key",cell:n=>{var v,b;return e.jsx("span",{className:"text-[var(--otari-muted)]",children:n.source==="stored"?n.stored&&!n.stored.decryptable?e.jsx("span",{className:"text-amber-700",title:"This key can't be decrypted with the current OTARI_SECRET_KEY. Replace the key, or restore the original OTARI_SECRET_KEY.",children:"⚠ key unreadable"}):e.jsx("code",{children:(v=n.stored)!=null&&v.last4?`••••${n.stored.last4}`:"none set"}):(b=n.meta)!=null&&b.env_key?e.jsxs("span",{children:["via ",e.jsx("code",{children:n.meta.env_key})]}):"config.yml"})}},{id:"status",header:"Status",cell:n=>e.jsx(ye,{health:k.get(n.instance)})},{id:"actions",header:"Actions",align:"end",cell:n=>{var v,b;return n.source==="stored"?e.jsxs("div",{className:"flex flex-col items-end gap-1.5",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(f,{size:"sm",variant:"outline",isDisabled:((v=j[n.instance])==null?void 0:v.status)==="pending"||((b=n.stored)==null?void 0:b.decryptable)===!1,onPress:()=>w(n.instance),children:"Test"}),e.jsx(f,{size:"sm",variant:"ghost",onPress:()=>{u(!1),c(n.instance)},children:"Edit"}),e.jsx(ae,{confirmLabel:"Delete",isPending:i.isPending,onConfirm:()=>i.mutate(n.instance),children:"Delete"})]}),e.jsx(je,{state:j[n.instance]})]}):e.jsx("span",{className:"block text-right text-xs text-[var(--otari-muted)]",children:"managed in config.yml"})}}];return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(Q,{title:"Providers",description:"Add provider API keys here to serve models without editing config.yml. Keys are encrypted at rest.",action:g||C?null:e.jsx(f,{variant:"primary",isDisabled:!P,onPress:()=>{c(null),u(!0)},children:"Add provider"})}),e.jsx(I,{error:s.error??a.error??t.error??r.error??m.error??i.error}),P?null:e.jsxs(ee,{tone:"warning",children:[e.jsx("code",{children:"OTARI_SECRET_KEY"})," is not set, so provider keys can't be encrypted at rest and adding providers from the dashboard is disabled. Set it on the server and restart to add providers here. Providers defined in"," ",e.jsx("code",{children:"config.yml"})," keep working without it."]}),C?e.jsx(ke,{onAddProvider:()=>{c(null),u(!0)},needsPricing:N,onEnablePricing:()=>m.mutate({default_pricing:!0}),enabling:m.isPending,secretKeyConfigured:P}):null,g&&P?e.jsx(ve,{onClose:()=>u(!1)}):null,y?e.jsx(ge,{provider:y,onClose:()=>c(null)}):null,!o&&d.length>0&&r.data&&r.data.total>0?e.jsx(be,{healthy:r.data.healthy,total:r.data.total,checkedAt:r.data.checked_at}):null,C?null:e.jsx(oe,{ariaLabel:"Providers",columns:A,rows:d,getRowKey:n=>n.instance,isLoading:o,emptyContent:"No providers yet. Add your first provider to start serving models."})]})}export{we as ProvidersPage}; +import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as x,L as M}from"./react-dgEcD0HR.js";import{L as Y,X as G,J as V,N as W,Y as J,Z as X,_ as Z,P as Q,E as I,I as ee,$ as te,a0 as se,W as $,C as ae,a1 as O,a2 as ne,G as q,a3 as re,a4 as ie}from"./index-DV8qvdUj.js";import{F as S}from"./Field-Dwp6u3t8.js";import{D as oe}from"./DataTable-Bmn_eYSV.js";import{B as f,d as _,f as de,T as le,L as F,I as H,D as ce,S as me,C as T,a as ue,b as xe}from"./heroui-BI50yK5B.js";function R({value:s,onChange:a,label:t,placeholder:r,description:i}){return e.jsxs(le,{value:s,onChange:a,className:"flex max-w-md flex-col gap-1",children:[e.jsx(F,{className:"text-sm font-medium text-[var(--otari-ink)]",children:t}),e.jsx(H,{type:"password",placeholder:r??"sk-…",autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",spellCheck:!1,"data-1p-ignore":!0,"data-lpignore":"true"}),i?e.jsx(ce,{className:"text-xs text-[var(--otari-muted)]",children:i}):null]})}function z({label:s,value:a,onChange:t,description:r,placeholder:i,extra:l=[],includeCatalog:m=!0}){var k;const g=re(),u=x.useMemo(()=>m?[...l,...(g.data??[]).map(o=>({id:o.id,name:o.name}))]:l,[g.data,l,m]),[p,c]=x.useState(()=>{var o;return((o=u.find(y=>y.id===a))==null?void 0:o.name)??""}),j=((k=u.find(o=>o.id===a))==null?void 0:k.name)??"",h=p.trim()===j.trim()?"":p.trim().toLowerCase(),d=u.filter(o=>!h||o.name.toLowerCase().includes(h)||o.id.toLowerCase().includes(h)).slice(0,50);return e.jsxs(T.Root,{allowsEmptyCollection:!0,menuTrigger:"focus",inputValue:p,onInputChange:c,onSelectionChange:o=>{var y;o!=null?(t(String(o)),c(((y=u.find(N=>N.id===String(o)))==null?void 0:y.name)??"")):(t(""),c(""))},className:"flex max-w-md flex-col gap-1",children:[e.jsx(F,{className:"text-sm font-medium text-[var(--otari-ink)]",children:s}),e.jsxs(T.InputGroup,{children:[e.jsx(H,{placeholder:i??"Search providers…",autoComplete:"off","data-1p-ignore":!0,"data-lpignore":"true",onFocus:o=>o.currentTarget.select()}),e.jsx(T.Trigger,{})]}),e.jsx(T.Popover,{children:e.jsx(ue,{items:d,className:"max-h-72 overflow-auto",children:o=>e.jsx(xe,{id:o.id,textValue:o.name,children:o.name})})}),r?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:r}):null]})}function U({getPayload:s}){const a=ie(),t=s();return e.jsxs("div",{className:"flex flex-col gap-1.5",children:[e.jsx(f,{variant:"outline",isDisabled:t===null||a.isPending,onPress:()=>{t&&a.mutate(t)},children:a.isPending?"Testing…":"Test connection"}),e.jsx("span",{role:"status","aria-live":"polite",children:a.isPending?null:a.error?e.jsx("span",{className:"text-xs text-red-700",children:q(a.error)}):a.data?a.data.ok?e.jsxs("span",{className:"text-xs font-medium text-green-700",children:["Connected. ",a.data.model_count," model",a.data.model_count===1?"":"s"," available."]}):e.jsx("span",{className:"block max-w-md break-words text-xs text-red-700",children:a.data.error??"Connection failed."}):null})]})}function pe({onClose:s}){var w;const a=O(),[t,r]=x.useState(""),[i,l]=x.useState(""),[m,g]=x.useState(!1),[u,p]=x.useState(""),[c,j]=x.useState(""),h=ne(t),d=((w=h.data)==null?void 0:w.id)===t?h.data:void 0;x.useEffect(()=>{d&&p(d.default_api_base??"")},[d]);const k=(d==null?void 0:d.env_key_present)??!1,o=((d==null?void 0:d.requires_api_key)??!0)&&!k,y=c.trim()!==""&&c.trim()!==t,N=/[:/]/.test(c),P=t!==""&&!N&&(!o||i.trim()!=="")&&!a.isPending,C=()=>{P&&a.mutate({instance:y?c.trim():t,provider_type:y?t:null,api_base:u.trim()||null,api_key:i.trim()||null},{onSuccess:s})};return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(I,{error:a.error}),e.jsx(z,{label:"Provider",value:t,onChange:A=>{r(A),j(""),p("")},description:"Its endpoint is built in."}),e.jsx(R,{value:i,onChange:l,label:d&&!o?"API key (optional)":"API key",description:d?o?`${d.name}'s endpoint is built in — just add your key.`:k?`${d.env_key} is set on the server, so a key is optional here. Paste one to override it.`:`${d.name} needs no API key.`:"Stored encrypted. Requires OTARI_SECRET_KEY on the server."}),e.jsx("button",{type:"button",className:"self-start text-xs font-medium text-[var(--otari-brand-dark)]",onClick:()=>g(A=>!A),children:m?"Hide advanced":"Advanced (API base, rename)"}),m?e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(S,{label:"API base",value:u,onChange:p,placeholder:(d==null?void 0:d.default_api_base)??"https://…/v1",description:"Only if you route through a proxy. Blank uses the built-in default."}),e.jsx(S,{label:"Name",value:c,onChange:j,placeholder:t||"instance name",description:N?e.jsx("span",{className:"text-red-700",children:"A name cannot contain “:” or “/”."}):"Rename to run two instances of the same provider."})]}):null,e.jsxs("div",{className:"flex flex-wrap items-start gap-2",children:[e.jsx(f,{variant:"primary",isDisabled:!P,onPress:C,children:a.isPending?"Adding…":"Add provider"}),e.jsx(f,{variant:"ghost",onPress:s,children:"Cancel"}),e.jsx(U,{getPayload:()=>t===""?null:{instance:y?c.trim():t,provider_type:y?t:null,api_base:u.trim()||null,api_key:i.trim()||null}})]})]})}function he({onClose:s}){const a=O(),[t,r]=x.useState(""),[i,l]=x.useState("openai-compatible"),[m,g]=x.useState(""),[u,p]=x.useState(""),c=/[:/]/.test(t),j=t.trim()!==""&&!c&&m.trim()!==""&&!a.isPending,h=()=>{j&&a.mutate({instance:t.trim(),provider_type:i||"openai-compatible",api_base:m.trim(),api_key:u.trim()||null},{onSuccess:s})};return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(I,{error:a.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(S,{label:"Name",value:t,onChange:r,placeholder:"my-local-llm",isRequired:!0,autoFocus:!0,description:c?e.jsx("span",{className:"text-red-700",children:"A name cannot contain “:” or “/”."}):"Call it whatever you want."}),e.jsx(z,{label:"Compatible with",value:i,onChange:l,includeCatalog:!1,description:"The API this endpoint speaks.",extra:[{id:"openai-compatible",name:"OpenAI"},{id:"anthropic-compatible",name:"Anthropic"}]})]}),e.jsx(S,{label:"API base",value:m,onChange:g,placeholder:"http://localhost:8000/v1",isRequired:!0,description:"The endpoint URL of your server."}),e.jsx(R,{value:u,onChange:p,label:"API key (optional)",description:"Many local backends need none. Stored encrypted."}),e.jsxs("div",{className:"flex flex-wrap items-start gap-2",children:[e.jsx(f,{variant:"primary",isDisabled:!j,onPress:h,children:a.isPending?"Adding…":"Add provider"}),e.jsx(f,{variant:"ghost",onPress:s,children:"Cancel"}),e.jsx(U,{getPayload:()=>t.trim()===""||m.trim()===""?null:{instance:t.trim(),provider_type:i||"openai-compatible",api_base:m.trim(),api_key:u.trim()||null}})]})]})}function ve({onClose:s}){const[a,t]=x.useState("known");return e.jsx(_,{children:e.jsxs(_.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsx("div",{className:"flex items-center justify-between",children:e.jsx("div",{className:"flex items-center gap-1 rounded-lg bg-[var(--otari-bg)] p-1",children:[["known","Known provider"],["custom","Custom endpoint"]].map(([r,i])=>e.jsx("button",{type:"button","aria-pressed":a===r,onClick:()=>t(r),className:a===r?"rounded-md bg-white px-3 py-1.5 text-sm font-medium text-[var(--otari-ink)] shadow-sm":"rounded-md px-3 py-1.5 text-sm text-[var(--otari-muted)] hover:text-[var(--otari-ink)]",children:i},r))})}),a==="known"?e.jsx(pe,{onClose:s}):e.jsx(he,{onClose:s})]})})}function ge({provider:s,onClose:a}){const t=te(),[r,i]=x.useState(s.provider_type??""),[l,m]=x.useState(s.api_base??""),[g,u]=x.useState(!1),[p,c]=x.useState(""),j=()=>{if(t.isPending)return;const h={provider_type:r.trim()||null,api_base:l.trim()||null,expected_updated_at:s.updated_at};g&&p.trim()&&(h.api_key=p.trim()),t.mutate({instance:s.instance,body:h},{onSuccess:a})};return e.jsx(_,{children:e.jsxs(_.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsxs("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:["Edit ",e.jsx("code",{children:s.instance})]}),e.jsx(I,{error:t.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(S,{label:"Provider type",value:r,onChange:i,placeholder:"openai"}),e.jsx(S,{label:"API base",value:l,onChange:m,placeholder:"https://api.openai.com/v1"})]}),e.jsx("div",{className:"flex flex-col gap-2",children:g?e.jsxs(e.Fragment,{children:[e.jsx(R,{value:p,onChange:c,label:"New API key",description:"Stored encrypted. The old key is replaced when you save."}),e.jsx("button",{type:"button",className:"self-start text-xs font-medium text-[var(--otari-brand-dark)]",onClick:()=>{u(!1),c("")},children:"Keep the current key"})]}):e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("span",{className:"text-sm text-[var(--otari-muted)]",children:["API key: ",e.jsx("code",{children:s.last4?`••••${s.last4}`:"none set"})]}),e.jsx(f,{size:"sm",variant:"outline",onPress:()=>u(!0),children:"Replace key"})]})}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(f,{variant:"primary",isDisabled:t.isPending,onPress:j,children:t.isPending?"Saving…":"Save changes"}),e.jsx(f,{variant:"ghost",onPress:a,children:"Cancel"})]})]})})}function fe(s,a){const t=new Map((a??[]).map(l=>[l.instance,l])),r=new Map((s??[]).map(l=>[l.instance,l]));return[...new Set([...t.keys(),...r.keys()])].sort().map(l=>{const m=t.get(l);return{instance:l,source:m?"stored":"config",stored:m,meta:r.get(l)}})}function je({state:s}){return s?s.status==="pending"?e.jsxs("span",{className:"inline-flex items-center gap-1.5 text-xs text-[var(--otari-muted)]",children:[e.jsx(me,{size:"sm"})," Testing…"]}):s.ok?e.jsxs("span",{className:"text-xs font-medium text-green-700",children:["Connected. ",s.model_count," model",s.model_count===1?"":"s"," available."]}):e.jsx("span",{className:"block max-w-xs break-words text-xs text-red-700",children:s.error??"Connection failed."}):null}function ye({health:s}){if(!s)return e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"—"});const a=s.ok?"border-green-200 bg-green-50 text-green-700":"border-red-200 bg-red-50 text-red-700",t=s.checked_at?`Last checked ${$(s.checked_at)}`:"Not checked yet",r=s.ok?t:`${s.error??"Unreachable"} · ${t}`;return e.jsxs("span",{title:r,className:`inline-flex items-center gap-1.5 rounded-full border px-2.5 py-0.5 text-xs font-medium ${a}`,children:[e.jsx("span",{"aria-hidden":!0,className:`h-1.5 w-1.5 rounded-full ${s.ok?"bg-green-500":"bg-red-500"}`}),s.ok?"Reachable":"Unreachable"]})}function be({healthy:s,total:a,checkedAt:t}){const r=s===a,i=se();return e.jsxs("div",{className:"flex flex-wrap items-center gap-3 rounded-xl border border-[var(--otari-line)] bg-[var(--otari-surface)] px-4 py-2.5 text-sm",children:[e.jsx("span",{"aria-hidden":!0,className:`h-2 w-2 rounded-full ${r?"bg-green-500":"bg-red-500"}`}),e.jsxs("span",{className:"font-medium text-[var(--otari-ink)]",children:[s," of ",a," provider",a===1?"":"s"," reachable"]}),t?e.jsxs("span",{className:"text-[var(--otari-muted)]",children:["Last checked ",$(t)]}):null,e.jsx(f,{size:"sm",variant:"ghost",className:"ml-auto",isDisabled:i.isPending,onPress:()=>i.mutate(),children:i.isPending?"Re-checking…":"Re-check all"})]})}function E({n:s,title:a,children:t}){return e.jsxs("li",{className:"flex gap-3",children:[e.jsx("span",{className:"flex h-6 w-6 shrink-0 items-center justify-center rounded-full bg-[var(--otari-brand-tint)] text-xs font-semibold text-[var(--otari-brand-dark)]",children:s}),e.jsxs("div",{className:"text-sm",children:[e.jsx("div",{className:"font-medium text-[var(--otari-ink)]",children:a}),e.jsx("div",{className:"text-[var(--otari-muted)]",children:t})]})]})}function ke({onAddProvider:s,needsPricing:a,onEnablePricing:t,enabling:r,secretKeyConfigured:i}){return e.jsx(_,{children:e.jsxs(_.Content,{className:"flex flex-col gap-4 p-6",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:"Welcome to Otari"}),e.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:"You are signed in. Add a provider to start serving models: three quick steps."})]}),e.jsxs("ol",{className:"flex flex-col gap-3",children:[e.jsxs(E,{n:1,title:"Add a provider",children:["Enter a provider name (like ",e.jsx("code",{children:"openai"}),") and its API key. Keys are encrypted at rest."]}),e.jsxs(E,{n:2,title:"Test the connection",children:["Use ",e.jsx("strong",{children:"Test"})," on the provider row to confirm the key works and see how many models it serves."]}),e.jsxs(E,{n:3,title:"Send your first request",children:["Point your app at ",e.jsx("code",{children:"/v1"})," on this gateway with the API key printed in the server logs (",e.jsx("code",{children:"gw-…"}),"). See the"," ",e.jsx("a",{href:"/welcome",className:"font-medium text-[var(--otari-brand-dark)]",children:"quickstart"}),"."]})]}),a?e.jsxs("p",{className:"text-sm text-[var(--otari-muted)]",children:["Tip: ",e.jsx("code",{children:"require_pricing"})," is on, so requests are rejected until pricing is set."," ",e.jsx("button",{type:"button",className:"font-medium text-[var(--otari-brand-dark)] disabled:opacity-50",disabled:r,onClick:t,children:"Enable default pricing"})," ","to meter new models with public rates."]}):null,e.jsx("div",{children:e.jsx(f,{variant:"primary",isDisabled:!i,onPress:s,children:"Add your first provider"})})]})})}function we(){var K,B,D,L;const s=Y(),a=G(),t=V(),r=W(),i=J(),l=X(),m=Z(),[g,u]=x.useState(!1),[p,c]=x.useState(null),[j,h]=x.useState({}),d=fe((K=s.data)==null?void 0:K.providers,a.data),k=new Map((((B=r.data)==null?void 0:B.providers)??[]).map(n=>[n.instance,n])),o=s.isLoading||a.isLoading,y=((D=a.data)==null?void 0:D.find(n=>n.instance===p))??null,N=((L=t.data)==null?void 0:L.require_pricing)===!0&&t.data.default_pricing===!1,P=t.data?t.data.secret_key_configured!==!1:!t.isError,C=!o&&d.length===0&&!g,w=n=>{h(v=>({...v,[n]:{status:"pending"}})),l.mutate(n,{onSuccess:v=>h(b=>({...b,[n]:{status:"done",...v}})),onError:v=>h(b=>({...b,[n]:{status:"done",ok:!1,model_count:0,error:q(v)}}))})},A=[{id:"provider",header:"Provider",isRowHeader:!0,cell:n=>e.jsx(M,{to:`/models?provider=${encodeURIComponent(n.instance)}`,className:"font-medium text-[var(--otari-ink)] hover:text-[var(--otari-brand-dark)] hover:underline",children:n.instance})},{id:"type",header:"Type",cell:n=>{var v,b;return e.jsx("span",{className:"text-[var(--otari-muted)]",children:((v=n.meta)==null?void 0:v.provider_type)??((b=n.stored)==null?void 0:b.provider_type)??n.instance})}},{id:"source",header:"Source",cell:n=>e.jsx(de,{size:"sm",color:n.source==="stored"?"accent":"default",children:n.source==="stored"?"stored":"config"})},{id:"api_key",header:"API key",cell:n=>{var v,b;return e.jsx("span",{className:"text-[var(--otari-muted)]",children:n.source==="stored"?n.stored&&!n.stored.decryptable?e.jsx("span",{className:"text-amber-700",title:"This key can't be decrypted with the current OTARI_SECRET_KEY. Replace the key, or restore the original OTARI_SECRET_KEY.",children:"⚠ key unreadable"}):e.jsx("code",{children:(v=n.stored)!=null&&v.last4?`••••${n.stored.last4}`:"none set"}):(b=n.meta)!=null&&b.env_key?e.jsxs("span",{children:["via ",e.jsx("code",{children:n.meta.env_key})]}):"config.yml"})}},{id:"status",header:"Status",cell:n=>e.jsx(ye,{health:k.get(n.instance)})},{id:"actions",header:"Actions",align:"end",cell:n=>{var v,b;return n.source==="stored"?e.jsxs("div",{className:"flex flex-col items-end gap-1.5",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsx(f,{size:"sm",variant:"outline",isDisabled:((v=j[n.instance])==null?void 0:v.status)==="pending"||((b=n.stored)==null?void 0:b.decryptable)===!1,onPress:()=>w(n.instance),children:"Test"}),e.jsx(f,{size:"sm",variant:"ghost",onPress:()=>{u(!1),c(n.instance)},children:"Edit"}),e.jsx(ae,{confirmLabel:"Delete",isPending:i.isPending,onConfirm:()=>i.mutate(n.instance),children:"Delete"})]}),e.jsx(je,{state:j[n.instance]})]}):e.jsx("span",{className:"block text-right text-xs text-[var(--otari-muted)]",children:"managed in config.yml"})}}];return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(Q,{title:"Providers",description:"Add provider API keys here to serve models without editing config.yml. Keys are encrypted at rest.",action:g||C?null:e.jsx(f,{variant:"primary",isDisabled:!P,onPress:()=>{c(null),u(!0)},children:"Add provider"})}),e.jsx(I,{error:s.error??a.error??t.error??r.error??m.error??i.error}),P?null:e.jsxs(ee,{tone:"warning",children:[e.jsx("code",{children:"OTARI_SECRET_KEY"})," is not set, so provider keys can't be encrypted at rest and adding providers from the dashboard is disabled. Set it on the server and restart to add providers here. Providers defined in"," ",e.jsx("code",{children:"config.yml"})," keep working without it."]}),C?e.jsx(ke,{onAddProvider:()=>{c(null),u(!0)},needsPricing:N,onEnablePricing:()=>m.mutate({default_pricing:!0}),enabling:m.isPending,secretKeyConfigured:P}):null,g&&P?e.jsx(ve,{onClose:()=>u(!1)}):null,y?e.jsx(ge,{provider:y,onClose:()=>c(null)}):null,!o&&d.length>0&&r.data&&r.data.total>0?e.jsx(be,{healthy:r.data.healthy,total:r.data.total,checkedAt:r.data.checked_at}):null,C?null:e.jsx(oe,{ariaLabel:"Providers",columns:A,rows:d,getRowKey:n=>n.instance,isLoading:o,emptyContent:"No providers yet. Add your first provider to start serving models."})]})}export{we as ProvidersPage}; diff --git a/src/gateway/static/dashboard/assets/SettingsPage-BFxhhnZx.js b/src/gateway/static/dashboard/assets/SettingsPage-DR0J2MHH.js similarity index 99% rename from src/gateway/static/dashboard/assets/SettingsPage-BFxhhnZx.js rename to src/gateway/static/dashboard/assets/SettingsPage-DR0J2MHH.js index 127139c0..f2eb5fab 100644 --- a/src/gateway/static/dashboard/assets/SettingsPage-BFxhhnZx.js +++ b/src/gateway/static/dashboard/assets/SettingsPage-DR0J2MHH.js @@ -1 +1 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as u}from"./react-dgEcD0HR.js";import{J as R,_ as C,P,E as y,M as E,a5 as T,a6 as _,a7 as D,F as A,a8 as O,X as F,a9 as I,I as w}from"./index-mAhQhUE6.js";import{d as v,B as h,A as d,g as K,I as M}from"./heroui-BI50yK5B.js";function b(t,r){return{[t]:r}}function z(t,r){let s=0;for(const a of r)if(a===t[s]&&(s+=1),s===t.length)return!0;return t.length===0}function L(t,r){const s=r.trim().toLowerCase();if(s==="")return!0;const a=`${t.key} ${t.description??""} ${t.group}`.toLowerCase(),n=t.key.toLowerCase().replace(/[^a-z0-9]/g,"");return s.split(/\s+/).every(i=>a.includes(i)||z(i,n))}function B({checked:t,onChange:r,label:s,disabled:a}){return e.jsx("button",{type:"button",role:"switch","aria-checked":t,"aria-label":s,disabled:a,onClick:()=>r(!t),className:`relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors disabled:opacity-50 ${t?"bg-[var(--otari-brand)]":"bg-[var(--otari-line)]"}`,children:e.jsx("span",{className:`inline-block h-5 w-5 transform rounded-full bg-white shadow transition-transform ${t?"translate-x-5":"translate-x-0.5"}`})})}function $({field:t,onSave:r,disabled:s}){const a=typeof t.value=="number"?t.value:0,[n,i]=u.useState(String(a)),o=t.type==="float";u.useEffect(()=>{i(String(a))},[a]);const c=Number(n),p=n.trim()!==""&&Number.isFinite(c)&&(o||Number.isInteger(c)),m=t.minimum??void 0,x=t.exclusive_minimum??void 0,g=x!==void 0?c>x:m!==void 0?c>=m:c>=0,l=p&&g&&c!==a;return e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(M,{type:"number",min:"0",step:o?"any":"1",inputMode:o?"decimal":"numeric","aria-label":t.key,value:n,disabled:s,onChange:f=>i(f.target.value),className:"w-28 rounded-md border border-[var(--otari-line)] bg-white px-2 py-1 text-right text-sm tabular-nums focus:border-[var(--otari-brand)] focus:outline-none disabled:opacity-50"}),e.jsx(h,{size:"sm",variant:"primary","aria-label":`Save ${t.key}`,isDisabled:s||!l,onPress:()=>r(c),children:"Save"})]})}function H({field:t,onSave:r,disabled:s}){const a=typeof t.value=="string"?t.value:"",[n,i]=u.useState(a);u.useEffect(()=>{i(a)},[a]);const o=n!==a;return e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"text","aria-label":t.key,value:n,disabled:s,placeholder:"unset",onChange:c=>i(c.target.value),className:"w-56 rounded-md border border-[var(--otari-line)] bg-white px-2 py-1 text-sm focus:border-[var(--otari-brand)] focus:outline-none disabled:opacity-50"}),e.jsx(h,{size:"sm",variant:"primary","aria-label":`Save ${t.key}`,isDisabled:s||!o,onPress:()=>r(n.trim()===""?null:n),children:"Save"})]})}function Y(t){const{value:r}=t;return r==null?"unset":typeof r=="boolean"?r?"on":"off":Array.isArray(r)?r.length?r.join(", "):"none":String(r)}function q({field:t,patch:r,disabled:s}){return t.settable?t.type==="bool"?e.jsx(B,{checked:t.value===!0,onChange:a=>r(b(t.key,a)),label:t.key,disabled:s}):t.options&&t.options.length>0?e.jsx(A,{ariaLabel:t.key,value:String(t.value??""),onChange:a=>r(b(t.key,a)),options:t.options.map(a=>({value:a,label:a}))}):t.type==="int"||t.type==="float"?e.jsx($,{field:t,onSave:a=>r(b(t.key,a)),disabled:s}):e.jsx(H,{field:t,onSave:a=>r(b(t.key,a)),disabled:s}):e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-sm tabular-nums text-[var(--otari-ink)]",children:Y(t)}),e.jsx("span",{className:"rounded-full border border-[var(--otari-line)] px-2 py-0.5 text-xs text-[var(--otari-muted)]",children:"startup-only"})]})}function U({field:t,patch:r,disabled:s}){return e.jsxs("div",{className:"flex items-start justify-between gap-6 py-4",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("code",{className:"text-sm font-medium text-[var(--otari-ink)]",children:t.key}),t.description?e.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:t.description}):null]}),e.jsx("div",{className:"shrink-0 pt-0.5",children:e.jsx(q,{field:t,patch:r,disabled:s})})]})}function V({value:t,fieldRef:r}){const s=u.useRef(null),a=r??s,[n,i]=u.useState(!1),[o,c]=u.useState(!1),p=async()=>{var m,x,g;(m=a.current)==null||m.focus(),(x=a.current)==null||x.select();try{if((g=navigator.clipboard)!=null&&g.writeText){await navigator.clipboard.writeText(t),i(!0),c(!1),window.setTimeout(()=>i(!1),2e3);return}}catch{}c(!0)};return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-xs font-medium text-[var(--otari-muted)]",children:"New master key"}),e.jsx(h,{size:"sm",variant:"outline",onPress:p,children:n?"Copied":"Copy"})]}),e.jsx("input",{ref:a,readOnly:!0,value:t,onFocus:m=>m.currentTarget.select(),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",spellCheck:!1,"data-1p-ignore":!0,"data-lpignore":"true"}),e.jsx("span",{"aria-live":"polite",className:"text-xs text-[var(--otari-brand-dark)]",children:n?"Copied to clipboard.":""}),o?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Selected. Press Ctrl/Cmd-C to copy."}):null]})}function G({masterKey:t,error:r,isPending:s,onRegenerate:a,onClose:n}){const i=u.useRef(null);return u.useEffect(()=>{var o,c;t!==void 0&&((o=i.current)==null||o.focus(),(c=i.current)==null||c.select())},[t]),e.jsx(d.Backdrop,{children:e.jsx(d.Container,{placement:"center",size:"lg",children:e.jsxs(d.Dialog,{children:[e.jsx(d.Header,{children:e.jsx(d.Heading,{children:t!==void 0?"Master key regenerated":"Regenerate master key?"})}),e.jsx(d.Body,{className:"flex flex-col gap-4",children:t!==void 0?e.jsxs(e.Fragment,{children:[e.jsx(w,{tone:"warning",children:"Copy this key now. It is shown once and cannot be retrieved again after you close this dialog."}),e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:"The previous master key has stopped working. This browser tab now uses the new key."}),e.jsx(V,{value:t,fieldRef:i})]}):e.jsxs(e.Fragment,{children:[e.jsx(w,{tone:"warning",children:"This immediately invalidates the current dashboard master key. Other signed-in dashboard sessions will need the new key to continue."}),e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:"The replacement key will be shown once. Save it before closing the next screen."}),e.jsx(y,{error:r})]})}),e.jsx(d.Footer,{children:t!==void 0?e.jsx(h,{variant:"primary",onPress:n,children:"I’ve saved this key"}):e.jsxs(e.Fragment,{children:[e.jsx(h,{variant:"ghost",isDisabled:s,onPress:n,children:"Cancel"}),e.jsx(h,{variant:"danger",isPending:s,onPress:a,children:"Regenerate key"})]})})]})})})}function X({source:t}){const r=O(),[s,a]=u.useState(!1),[n,i]=u.useState(),o=t==="generated",c=()=>r.mutate(void 0,{onSuccess:x=>{i(x.master_key)}}),p=()=>{a(!1),i(void 0),r.reset()},m=x=>{x?(r.reset(),a(!0)):n===void 0&&p()};return e.jsx("div",{className:"flex flex-col gap-4 py-4",children:e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("code",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"master_key"}),e.jsx("p",{className:"mt-1 max-w-3xl text-sm text-[var(--otari-muted)]",children:o?"This gateway uses its first-run generated dashboard key. Regeneration invalidates the current key immediately.":"This gateway uses a key managed through OTARI_MASTER_KEY or config.yml. Rotate it in configuration, then restart the gateway."})]}),e.jsxs(d,{isOpen:s,onOpenChange:m,children:[o?e.jsx(d.Trigger,{className:K({size:"sm",variant:"danger-soft"}),children:"Regenerate"}):e.jsx(h,{size:"sm",variant:"danger-soft",isDisabled:!0,children:"Managed in configuration"}),s?e.jsx(G,{masterKey:n,error:r.error,isPending:r.isPending,onRegenerate:c,onClose:p}):null]})]})})}function J(){var o;const t=F(),r=I(),s=r.data,a=((o=t.data)==null?void 0:o.length)??0,n=(t.data??[]).filter(c=>!c.decryptable).length,i=a>0;return e.jsxs("div",{className:"flex flex-col gap-4 py-4",children:[e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("code",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"OTARI_SECRET_KEY"}),e.jsxs("p",{className:"mt-1 max-w-3xl text-sm text-[var(--otari-muted)]",children:["Generate a new key with ",e.jsx("code",{children:"uv run otari gen-secret-key"}),", then restart with"," ",e.jsx("code",{children:"OTARI_SECRET_KEY=,"}),". Re-encrypt the stored provider keys, then restart with ",e.jsx("code",{children:"OTARI_SECRET_KEY="})," once none are unreadable."]})]}),e.jsx("div",{className:"shrink-0",children:e.jsx(h,{size:"sm",variant:"outline",isDisabled:!i||r.isPending,onPress:()=>r.mutate(),children:r.isPending?"Re-encrypting…":"Re-encrypt provider keys"})})]}),e.jsx(y,{error:t.error??r.error}),n>0?e.jsxs(w,{tone:"warning",children:[n," stored provider key",n===1?"":"s"," cannot be decrypted with the current"," ",e.jsx("code",{children:"OTARI_SECRET_KEY"}),". Restore the old secret key and re-encrypt, or edit each affected provider and replace its key."]}):null,s?e.jsxs("p",{className:"text-sm text-[var(--otari-muted)]",role:"status","aria-live":"polite",children:["Re-encrypted ",s.reencrypted," provider key",s.reencrypted===1?"":"s",".",s.unreadable>0?` ${s.unreadable} still need replacement.`:" All decryptable stored keys now use the primary secret key."]}):!t.isLoading&&!i?e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:"No stored provider keys need re-encryption."}):null]})}function Q({masterKeySource:t}){return e.jsxs("section",{className:"flex flex-col gap-2",children:[e.jsxs("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:["Credential security ",e.jsx("span",{className:"font-normal text-[var(--otari-muted)]",children:"(2)"})]}),e.jsx(v,{children:e.jsxs(v.Content,{className:"flex flex-col divide-y divide-[var(--otari-line)] px-5 py-1",children:[e.jsx(X,{source:t}),e.jsx(J,{})]})})]})}function W({preview:t,error:r,isPending:s,onAccept:a,onReject:n}){return e.jsx(d.Backdrop,{children:e.jsx(d.Container,{placement:"center",size:"lg",children:e.jsxs(d.Dialog,{children:[e.jsx(d.Header,{children:e.jsx(d.Heading,{children:"Review default price updates"})}),e.jsxs(d.Body,{className:"flex flex-col gap-4",children:[e.jsxs("p",{className:"text-sm text-[var(--otari-muted)]",children:[t.added_count," added, ",t.changed_count," changed, and ",t.removed_count," removed upstream model prices. The accepted catalog is saved in the database with source ",e.jsx("code",{children:"genai-prices"})," and reloads after a restart. Your ",t.protected_model_count," custom model price",t.protected_model_count===1?"":"s"," remain unchanged."]}),t.changes.length>0?e.jsx("ul",{className:"max-h-60 list-disc overflow-auto pl-5 text-sm text-[var(--otari-ink)]",children:t.changes.map(i=>e.jsxs("li",{children:[i.model_key,": ",i.change]},i.model_key))}):null,t.changes_truncated?e.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:"Only the first 100 changes are shown."}):null,e.jsx(y,{error:r})]}),e.jsxs(d.Footer,{children:[e.jsx(h,{variant:"ghost",isDisabled:s,onPress:n,children:"Reject changes"}),e.jsx(h,{variant:"primary",isPending:s,onPress:a,children:"Accept price updates"})]})]})})})}function Z(){const t=T(),r=_(),s=D(),a=t.data,n=r.isPending||s.isPending,i=()=>{a===void 0||n||s.mutate(void 0,{onSuccess:t.reset})};return e.jsxs("section",{className:"flex flex-col gap-2",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Default pricing catalog"}),e.jsx(v,{children:e.jsxs(v.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"genai-prices defaults"}),e.jsxs("p",{className:"mt-1 max-w-3xl text-sm text-[var(--otari-muted)]",children:["Fetch the latest upstream catalog, review the proposed change summary, then accept or reject it. Accepted data is stored as ",e.jsx("code",{children:"genai-prices"}),"; custom prices remain separate and always take precedence."]})]}),e.jsx(h,{size:"sm",variant:"outline",isDisabled:t.isPending||n,onPress:()=>t.mutate(),children:t.isPending?"Checking prices…":"Check for price updates"})]}),e.jsx(y,{error:t.error})]})}),e.jsxs(d,{isOpen:a!==void 0,onOpenChange:o=>o?void 0:i(),children:[e.jsx(d.Trigger,{className:"hidden",children:"Review price updates"}),a?e.jsx(W,{preview:a,error:r.error??s.error,isPending:n,onAccept:()=>r.mutate(void 0,{onSuccess:t.reset}),onReject:i}):null]})]})}function ee(t){const r=[],s=new Map;for(const a of t){let n=s.get(a.group);n||(n={name:a.group,fields:[]},s.set(a.group,n),r.push(n)),n.fields.push(a)}return r}function ne(){const t=R(),r=C(),s=t.data,a=r.isPending,[n,i]=u.useState(""),[o,c]=u.useState(!1),p=u.useRef(null);u.useEffect(()=>{function l(f){var N;const j=f.target,S=j&&(j.tagName==="INPUT"||j.tagName==="TEXTAREA"||j.tagName==="SELECT");f.key==="/"&&!S&&(f.preventDefault(),(N=p.current)==null||N.focus())}return window.addEventListener("keydown",l),()=>window.removeEventListener("keydown",l)},[]);const m=l=>r.mutate(l),x=(s==null?void 0:s.config)??[],g=x.filter(l=>(o?l.settable:!0)&&L(l,n)),k=ee(g);return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(P,{title:"Settings",description:"Every effective gateway setting. Settable fields apply immediately and persist across restarts; startup-only fields are shown for reference and change only via config.yml or environment variables (then a restart)."}),e.jsx(y,{error:t.error??r.error}),e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("input",{ref:p,type:"search","aria-label":"Search settings",placeholder:"Search settings (press / to focus)…",value:n,onChange:l=>i(l.target.value),onKeyDown:l=>{l.key==="Escape"&&i("")},className:"min-w-0 flex-1 rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-3 py-2 text-sm text-[var(--otari-ink)] focus:border-[var(--otari-brand)] focus:outline-none"}),e.jsxs("label",{className:"flex items-center gap-2 text-sm text-[var(--otari-muted)]",children:[e.jsx("input",{type:"checkbox",checked:o,onChange:l=>c(l.target.checked),className:"h-4 w-4 accent-[var(--otari-brand)]"}),"Settable only"]})]}),s?e.jsxs("p",{className:"text-xs text-[var(--otari-muted)]",children:["Showing ",g.length," of ",x.length," settings"]}):null,s&&g.length===0?e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:"No settings match your search."}):null,t.isLoading?e.jsx(E,{}):null,k.map(l=>e.jsxs("section",{className:"flex flex-col gap-2",children:[e.jsxs("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:[l.name," ",e.jsxs("span",{className:"font-normal text-[var(--otari-muted)]",children:["(",l.fields.length,")"]})]}),e.jsx(v,{children:e.jsx(v.Content,{className:"flex flex-col divide-y divide-[var(--otari-line)] px-5 py-1",children:l.fields.map(f=>e.jsx(U,{field:f,patch:m,disabled:!s||a},f.key))})})]},l.name)),s?e.jsx(Z,{}):null,s?e.jsx(Q,{masterKeySource:s.master_key_source}):null,s?e.jsxs("p",{className:"text-xs text-[var(--otari-muted)]",children:["Mode: ",s.mode," · Version ",s.version,s.require_pricing?" · require_pricing on":""]}):null]})}export{ne as SettingsPage,L as fieldMatches}; +import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as u}from"./react-dgEcD0HR.js";import{J as R,_ as C,P,E as y,M as E,a5 as T,a6 as _,a7 as D,F as A,a8 as O,X as F,a9 as I,I as w}from"./index-DV8qvdUj.js";import{d as v,B as h,A as d,g as K,I as M}from"./heroui-BI50yK5B.js";function b(t,r){return{[t]:r}}function z(t,r){let s=0;for(const a of r)if(a===t[s]&&(s+=1),s===t.length)return!0;return t.length===0}function L(t,r){const s=r.trim().toLowerCase();if(s==="")return!0;const a=`${t.key} ${t.description??""} ${t.group}`.toLowerCase(),n=t.key.toLowerCase().replace(/[^a-z0-9]/g,"");return s.split(/\s+/).every(i=>a.includes(i)||z(i,n))}function B({checked:t,onChange:r,label:s,disabled:a}){return e.jsx("button",{type:"button",role:"switch","aria-checked":t,"aria-label":s,disabled:a,onClick:()=>r(!t),className:`relative inline-flex h-6 w-11 shrink-0 items-center rounded-full transition-colors disabled:opacity-50 ${t?"bg-[var(--otari-brand)]":"bg-[var(--otari-line)]"}`,children:e.jsx("span",{className:`inline-block h-5 w-5 transform rounded-full bg-white shadow transition-transform ${t?"translate-x-5":"translate-x-0.5"}`})})}function $({field:t,onSave:r,disabled:s}){const a=typeof t.value=="number"?t.value:0,[n,i]=u.useState(String(a)),o=t.type==="float";u.useEffect(()=>{i(String(a))},[a]);const c=Number(n),p=n.trim()!==""&&Number.isFinite(c)&&(o||Number.isInteger(c)),m=t.minimum??void 0,x=t.exclusive_minimum??void 0,g=x!==void 0?c>x:m!==void 0?c>=m:c>=0,l=p&&g&&c!==a;return e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(M,{type:"number",min:"0",step:o?"any":"1",inputMode:o?"decimal":"numeric","aria-label":t.key,value:n,disabled:s,onChange:f=>i(f.target.value),className:"w-28 rounded-md border border-[var(--otari-line)] bg-white px-2 py-1 text-right text-sm tabular-nums focus:border-[var(--otari-brand)] focus:outline-none disabled:opacity-50"}),e.jsx(h,{size:"sm",variant:"primary","aria-label":`Save ${t.key}`,isDisabled:s||!l,onPress:()=>r(c),children:"Save"})]})}function H({field:t,onSave:r,disabled:s}){const a=typeof t.value=="string"?t.value:"",[n,i]=u.useState(a);u.useEffect(()=>{i(a)},[a]);const o=n!==a;return e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"text","aria-label":t.key,value:n,disabled:s,placeholder:"unset",onChange:c=>i(c.target.value),className:"w-56 rounded-md border border-[var(--otari-line)] bg-white px-2 py-1 text-sm focus:border-[var(--otari-brand)] focus:outline-none disabled:opacity-50"}),e.jsx(h,{size:"sm",variant:"primary","aria-label":`Save ${t.key}`,isDisabled:s||!o,onPress:()=>r(n.trim()===""?null:n),children:"Save"})]})}function Y(t){const{value:r}=t;return r==null?"unset":typeof r=="boolean"?r?"on":"off":Array.isArray(r)?r.length?r.join(", "):"none":String(r)}function q({field:t,patch:r,disabled:s}){return t.settable?t.type==="bool"?e.jsx(B,{checked:t.value===!0,onChange:a=>r(b(t.key,a)),label:t.key,disabled:s}):t.options&&t.options.length>0?e.jsx(A,{ariaLabel:t.key,value:String(t.value??""),onChange:a=>r(b(t.key,a)),options:t.options.map(a=>({value:a,label:a}))}):t.type==="int"||t.type==="float"?e.jsx($,{field:t,onSave:a=>r(b(t.key,a)),disabled:s}):e.jsx(H,{field:t,onSave:a=>r(b(t.key,a)),disabled:s}):e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-sm tabular-nums text-[var(--otari-ink)]",children:Y(t)}),e.jsx("span",{className:"rounded-full border border-[var(--otari-line)] px-2 py-0.5 text-xs text-[var(--otari-muted)]",children:"startup-only"})]})}function U({field:t,patch:r,disabled:s}){return e.jsxs("div",{className:"flex items-start justify-between gap-6 py-4",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("code",{className:"text-sm font-medium text-[var(--otari-ink)]",children:t.key}),t.description?e.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:t.description}):null]}),e.jsx("div",{className:"shrink-0 pt-0.5",children:e.jsx(q,{field:t,patch:r,disabled:s})})]})}function V({value:t,fieldRef:r}){const s=u.useRef(null),a=r??s,[n,i]=u.useState(!1),[o,c]=u.useState(!1),p=async()=>{var m,x,g;(m=a.current)==null||m.focus(),(x=a.current)==null||x.select();try{if((g=navigator.clipboard)!=null&&g.writeText){await navigator.clipboard.writeText(t),i(!0),c(!1),window.setTimeout(()=>i(!1),2e3);return}}catch{}c(!0)};return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsx("span",{className:"text-xs font-medium text-[var(--otari-muted)]",children:"New master key"}),e.jsx(h,{size:"sm",variant:"outline",onPress:p,children:n?"Copied":"Copy"})]}),e.jsx("input",{ref:a,readOnly:!0,value:t,onFocus:m=>m.currentTarget.select(),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",spellCheck:!1,"data-1p-ignore":!0,"data-lpignore":"true"}),e.jsx("span",{"aria-live":"polite",className:"text-xs text-[var(--otari-brand-dark)]",children:n?"Copied to clipboard.":""}),o?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"Selected. Press Ctrl/Cmd-C to copy."}):null]})}function G({masterKey:t,error:r,isPending:s,onRegenerate:a,onClose:n}){const i=u.useRef(null);return u.useEffect(()=>{var o,c;t!==void 0&&((o=i.current)==null||o.focus(),(c=i.current)==null||c.select())},[t]),e.jsx(d.Backdrop,{children:e.jsx(d.Container,{placement:"center",size:"lg",children:e.jsxs(d.Dialog,{children:[e.jsx(d.Header,{children:e.jsx(d.Heading,{children:t!==void 0?"Master key regenerated":"Regenerate master key?"})}),e.jsx(d.Body,{className:"flex flex-col gap-4",children:t!==void 0?e.jsxs(e.Fragment,{children:[e.jsx(w,{tone:"warning",children:"Copy this key now. It is shown once and cannot be retrieved again after you close this dialog."}),e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:"The previous master key has stopped working. This browser tab now uses the new key."}),e.jsx(V,{value:t,fieldRef:i})]}):e.jsxs(e.Fragment,{children:[e.jsx(w,{tone:"warning",children:"This immediately invalidates the current dashboard master key. Other signed-in dashboard sessions will need the new key to continue."}),e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:"The replacement key will be shown once. Save it before closing the next screen."}),e.jsx(y,{error:r})]})}),e.jsx(d.Footer,{children:t!==void 0?e.jsx(h,{variant:"primary",onPress:n,children:"I’ve saved this key"}):e.jsxs(e.Fragment,{children:[e.jsx(h,{variant:"ghost",isDisabled:s,onPress:n,children:"Cancel"}),e.jsx(h,{variant:"danger",isPending:s,onPress:a,children:"Regenerate key"})]})})]})})})}function X({source:t}){const r=O(),[s,a]=u.useState(!1),[n,i]=u.useState(),o=t==="generated",c=()=>r.mutate(void 0,{onSuccess:x=>{i(x.master_key)}}),p=()=>{a(!1),i(void 0),r.reset()},m=x=>{x?(r.reset(),a(!0)):n===void 0&&p()};return e.jsx("div",{className:"flex flex-col gap-4 py-4",children:e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("code",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"master_key"}),e.jsx("p",{className:"mt-1 max-w-3xl text-sm text-[var(--otari-muted)]",children:o?"This gateway uses its first-run generated dashboard key. Regeneration invalidates the current key immediately.":"This gateway uses a key managed through OTARI_MASTER_KEY or config.yml. Rotate it in configuration, then restart the gateway."})]}),e.jsxs(d,{isOpen:s,onOpenChange:m,children:[o?e.jsx(d.Trigger,{className:K({size:"sm",variant:"danger-soft"}),children:"Regenerate"}):e.jsx(h,{size:"sm",variant:"danger-soft",isDisabled:!0,children:"Managed in configuration"}),s?e.jsx(G,{masterKey:n,error:r.error,isPending:r.isPending,onRegenerate:c,onClose:p}):null]})]})})}function J(){var o;const t=F(),r=I(),s=r.data,a=((o=t.data)==null?void 0:o.length)??0,n=(t.data??[]).filter(c=>!c.decryptable).length,i=a>0;return e.jsxs("div",{className:"flex flex-col gap-4 py-4",children:[e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("code",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"OTARI_SECRET_KEY"}),e.jsxs("p",{className:"mt-1 max-w-3xl text-sm text-[var(--otari-muted)]",children:["Generate a new key with ",e.jsx("code",{children:"uv run otari gen-secret-key"}),", then restart with"," ",e.jsx("code",{children:"OTARI_SECRET_KEY=,"}),". Re-encrypt the stored provider keys, then restart with ",e.jsx("code",{children:"OTARI_SECRET_KEY="})," once none are unreadable."]})]}),e.jsx("div",{className:"shrink-0",children:e.jsx(h,{size:"sm",variant:"outline",isDisabled:!i||r.isPending,onPress:()=>r.mutate(),children:r.isPending?"Re-encrypting…":"Re-encrypt provider keys"})})]}),e.jsx(y,{error:t.error??r.error}),n>0?e.jsxs(w,{tone:"warning",children:[n," stored provider key",n===1?"":"s"," cannot be decrypted with the current"," ",e.jsx("code",{children:"OTARI_SECRET_KEY"}),". Restore the old secret key and re-encrypt, or edit each affected provider and replace its key."]}):null,s?e.jsxs("p",{className:"text-sm text-[var(--otari-muted)]",role:"status","aria-live":"polite",children:["Re-encrypted ",s.reencrypted," provider key",s.reencrypted===1?"":"s",".",s.unreadable>0?` ${s.unreadable} still need replacement.`:" All decryptable stored keys now use the primary secret key."]}):!t.isLoading&&!i?e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:"No stored provider keys need re-encryption."}):null]})}function Q({masterKeySource:t}){return e.jsxs("section",{className:"flex flex-col gap-2",children:[e.jsxs("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:["Credential security ",e.jsx("span",{className:"font-normal text-[var(--otari-muted)]",children:"(2)"})]}),e.jsx(v,{children:e.jsxs(v.Content,{className:"flex flex-col divide-y divide-[var(--otari-line)] px-5 py-1",children:[e.jsx(X,{source:t}),e.jsx(J,{})]})})]})}function W({preview:t,error:r,isPending:s,onAccept:a,onReject:n}){return e.jsx(d.Backdrop,{children:e.jsx(d.Container,{placement:"center",size:"lg",children:e.jsxs(d.Dialog,{children:[e.jsx(d.Header,{children:e.jsx(d.Heading,{children:"Review default price updates"})}),e.jsxs(d.Body,{className:"flex flex-col gap-4",children:[e.jsxs("p",{className:"text-sm text-[var(--otari-muted)]",children:[t.added_count," added, ",t.changed_count," changed, and ",t.removed_count," removed upstream model prices. The accepted catalog is saved in the database with source ",e.jsx("code",{children:"genai-prices"})," and reloads after a restart. Your ",t.protected_model_count," custom model price",t.protected_model_count===1?"":"s"," remain unchanged."]}),t.changes.length>0?e.jsx("ul",{className:"max-h-60 list-disc overflow-auto pl-5 text-sm text-[var(--otari-ink)]",children:t.changes.map(i=>e.jsxs("li",{children:[i.model_key,": ",i.change]},i.model_key))}):null,t.changes_truncated?e.jsx("p",{className:"text-xs text-[var(--otari-muted)]",children:"Only the first 100 changes are shown."}):null,e.jsx(y,{error:r})]}),e.jsxs(d.Footer,{children:[e.jsx(h,{variant:"ghost",isDisabled:s,onPress:n,children:"Reject changes"}),e.jsx(h,{variant:"primary",isPending:s,onPress:a,children:"Accept price updates"})]})]})})})}function Z(){const t=T(),r=_(),s=D(),a=t.data,n=r.isPending||s.isPending,i=()=>{a===void 0||n||s.mutate(void 0,{onSuccess:t.reset})};return e.jsxs("section",{className:"flex flex-col gap-2",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Default pricing catalog"}),e.jsx(v,{children:e.jsxs(v.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-3",children:[e.jsxs("div",{className:"min-w-0",children:[e.jsx("div",{className:"text-sm font-medium text-[var(--otari-ink)]",children:"genai-prices defaults"}),e.jsxs("p",{className:"mt-1 max-w-3xl text-sm text-[var(--otari-muted)]",children:["Fetch the latest upstream catalog, review the proposed change summary, then accept or reject it. Accepted data is stored as ",e.jsx("code",{children:"genai-prices"}),"; custom prices remain separate and always take precedence."]})]}),e.jsx(h,{size:"sm",variant:"outline",isDisabled:t.isPending||n,onPress:()=>t.mutate(),children:t.isPending?"Checking prices…":"Check for price updates"})]}),e.jsx(y,{error:t.error})]})}),e.jsxs(d,{isOpen:a!==void 0,onOpenChange:o=>o?void 0:i(),children:[e.jsx(d.Trigger,{className:"hidden",children:"Review price updates"}),a?e.jsx(W,{preview:a,error:r.error??s.error,isPending:n,onAccept:()=>r.mutate(void 0,{onSuccess:t.reset}),onReject:i}):null]})]})}function ee(t){const r=[],s=new Map;for(const a of t){let n=s.get(a.group);n||(n={name:a.group,fields:[]},s.set(a.group,n),r.push(n)),n.fields.push(a)}return r}function ne(){const t=R(),r=C(),s=t.data,a=r.isPending,[n,i]=u.useState(""),[o,c]=u.useState(!1),p=u.useRef(null);u.useEffect(()=>{function l(f){var N;const j=f.target,S=j&&(j.tagName==="INPUT"||j.tagName==="TEXTAREA"||j.tagName==="SELECT");f.key==="/"&&!S&&(f.preventDefault(),(N=p.current)==null||N.focus())}return window.addEventListener("keydown",l),()=>window.removeEventListener("keydown",l)},[]);const m=l=>r.mutate(l),x=(s==null?void 0:s.config)??[],g=x.filter(l=>(o?l.settable:!0)&&L(l,n)),k=ee(g);return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(P,{title:"Settings",description:"Every effective gateway setting. Settable fields apply immediately and persist across restarts; startup-only fields are shown for reference and change only via config.yml or environment variables (then a restart)."}),e.jsx(y,{error:t.error??r.error}),e.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[e.jsx("input",{ref:p,type:"search","aria-label":"Search settings",placeholder:"Search settings (press / to focus)…",value:n,onChange:l=>i(l.target.value),onKeyDown:l=>{l.key==="Escape"&&i("")},className:"min-w-0 flex-1 rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-3 py-2 text-sm text-[var(--otari-ink)] focus:border-[var(--otari-brand)] focus:outline-none"}),e.jsxs("label",{className:"flex items-center gap-2 text-sm text-[var(--otari-muted)]",children:[e.jsx("input",{type:"checkbox",checked:o,onChange:l=>c(l.target.checked),className:"h-4 w-4 accent-[var(--otari-brand)]"}),"Settable only"]})]}),s?e.jsxs("p",{className:"text-xs text-[var(--otari-muted)]",children:["Showing ",g.length," of ",x.length," settings"]}):null,s&&g.length===0?e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:"No settings match your search."}):null,t.isLoading?e.jsx(E,{}):null,k.map(l=>e.jsxs("section",{className:"flex flex-col gap-2",children:[e.jsxs("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:[l.name," ",e.jsxs("span",{className:"font-normal text-[var(--otari-muted)]",children:["(",l.fields.length,")"]})]}),e.jsx(v,{children:e.jsx(v.Content,{className:"flex flex-col divide-y divide-[var(--otari-line)] px-5 py-1",children:l.fields.map(f=>e.jsx(U,{field:f,patch:m,disabled:!s||a},f.key))})})]},l.name)),s?e.jsx(Z,{}):null,s?e.jsx(Q,{masterKeySource:s.master_key_source}):null,s?e.jsxs("p",{className:"text-xs text-[var(--otari-muted)]",children:["Mode: ",s.mode," · Version ",s.version,s.require_pricing?" · require_pricing on":""]}):null]})}export{ne as SettingsPage,L as fieldMatches}; diff --git a/src/gateway/static/dashboard/assets/TablePagination-SF1u0DDk.js b/src/gateway/static/dashboard/assets/TablePagination-CXhesdmH.js similarity index 98% rename from src/gateway/static/dashboard/assets/TablePagination-SF1u0DDk.js rename to src/gateway/static/dashboard/assets/TablePagination-CXhesdmH.js index ba547068..17fa3207 100644 --- a/src/gateway/static/dashboard/assets/TablePagination-SF1u0DDk.js +++ b/src/gateway/static/dashboard/assets/TablePagination-CXhesdmH.js @@ -1 +1 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as u}from"./react-dgEcD0HR.js";import{I as w,E as M,F as D}from"./index-mAhQhUE6.js";import{A as o,B as x,T as F,L as $,I as T,S as y}from"./heroui-BI50yK5B.js";function _({label:t,value:r,onChange:a,isRequired:c,autoFocus:i}){return e.jsxs(F,{value:r,onChange:a,isRequired:c,className:"flex flex-col gap-1",children:[e.jsx($,{className:"text-sm font-medium text-[var(--otari-ink)]",children:t}),e.jsx(T,{inputMode:"decimal",placeholder:"0.00",autoFocus:i})]})}function R(t){const r=t.trim();if(r==="")return null;const a=Number(r);return Number.isFinite(a)&&a>=0?a:Number.NaN}const C=t=>`Recompute cost for ${t.toLocaleString()} imported ${t===1?"row":"rows"} from each row's own token counts at these per-1M rates. Enforced gateway rows are never affected.`;function W({isOpen:t,onOpenChange:r,targetCount:a,isPending:c,error:i,onSubmit:E,title:I="Set price",description:L=C}){const[j,p]=u.useState(""),[n,h]=u.useState(""),[b,N]=u.useState(""),[f,v]=u.useState("");u.useEffect(()=>{t&&(p(""),h(""),N(""),v(""))},[t]);const m=R(j),l=R(n),d=R(b),s=R(f),g=m===null||Number.isNaN(m)||l===null||Number.isNaN(l)||Number.isNaN(d??0)||Number.isNaN(s??0),S=()=>{g||m===null||l===null||E({input_price_per_million:m,output_price_per_million:l,...d!==null&&!Number.isNaN(d)?{cache_read_price_per_million:d}:{},...s!==null&&!Number.isNaN(s)?{cache_write_price_per_million:s}:{}})};return e.jsx(o,{isOpen:t,onOpenChange:r,children:t?e.jsx(o.Backdrop,{children:e.jsx(o.Container,{placement:"center",size:"lg",children:e.jsxs(o.Dialog,{children:[e.jsx(o.Header,{children:e.jsx(o.Heading,{children:I})}),e.jsxs(o.Body,{className:"flex flex-col gap-4",children:[e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:L(a)}),e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2",children:[e.jsx(_,{label:"Input $ / 1M",value:j,onChange:p,isRequired:!0,autoFocus:!0}),e.jsx(_,{label:"Output $ / 1M",value:n,onChange:h,isRequired:!0}),e.jsx(_,{label:"Cache read $ / 1M",value:b,onChange:N}),e.jsx(_,{label:"Cache write $ / 1M",value:f,onChange:v})]}),e.jsx(w,{tone:"info",children:"Leave a cache rate blank to bill those tokens at the input rate."}),e.jsx(M,{error:i})]}),e.jsxs(o.Footer,{children:[e.jsx(x,{variant:"ghost",isDisabled:c,onPress:()=>r(!1),children:"Cancel"}),e.jsx(x,{variant:"primary",isDisabled:g,isPending:c,onPress:S,children:"Set price"})]})]})})}):null})}const P=[25,50,100];function q({page:t,pageSize:r,total:a,rowsOnPage:c,onPageChange:i,onPageSizeChange:E,pageSizeOptions:I=P,isFetching:L=!1,hasNextFallback:j=!1}){const p=u.useId(),n=a!=null?Math.max(1,Math.ceil(a/r)):null,h=t===0,b=n!=null?t>=n-1:!j,N=c>0?t*r+1:0,f=t*r+c,v=a!=null?a===0?"0 of 0":`${N.toLocaleString()}–${f.toLocaleString()} of ${a.toLocaleString()}`:c>0?`${N.toLocaleString()}–${f.toLocaleString()}`:"0",[m,l]=u.useState(String(t+1));u.useEffect(()=>{l(String(t+1))},[t]);const d=()=>{const s=Number.parseInt(m,10);if(Number.isNaN(s)){l(String(t+1));return}const g=n??Number.MAX_SAFE_INTEGER,S=Math.min(Math.max(s,1),g);S-1!==t?i(S-1):l(String(t+1))};return e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("label",{htmlFor:p,className:"text-sm text-[var(--otari-muted)]",children:"Rows"}),e.jsx(D,{id:p,ariaLabel:"Rows per page",value:String(r),onChange:s=>E(Number.parseInt(s,10)),options:I.map(s=>({value:String(s),label:String(s)}))}),L?e.jsx(y,{size:"sm"}):null]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"text-sm text-[var(--otari-muted)] tabular-nums",children:v}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(x,{size:"sm",variant:"outline","aria-label":"First page",isDisabled:h,onPress:()=>i(0),children:"«"}),e.jsx(x,{size:"sm",variant:"outline","aria-label":"Previous page",isDisabled:h,onPress:()=>i(t-1),children:"‹"}),e.jsxs("span",{className:"inline-flex items-center gap-1 text-sm text-[var(--otari-muted)]",children:[e.jsx("input",{"aria-label":"Page number",inputMode:"numeric",value:m,onChange:s=>l(s.target.value.replace(/[^0-9]/g,"")),onKeyDown:s=>{s.key==="Enter"&&s.currentTarget.blur()},onBlur:d,className:"w-12 rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-2 py-1 text-center text-sm text-[var(--otari-ink)] tabular-nums focus:border-[var(--otari-brand)] focus:outline-none"}),n!=null?e.jsxs("span",{className:"tabular-nums",children:["/ ",n.toLocaleString()]}):null]}),e.jsx(x,{size:"sm",variant:"outline","aria-label":"Next page",isDisabled:b,onPress:()=>i(t+1),children:"›"}),e.jsx(x,{size:"sm",variant:"outline","aria-label":"Last page",isDisabled:n==null||b,onPress:()=>n!=null&&i(n-1),children:"»"})]})]})]})}export{P,W as S,q as T}; +import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as u}from"./react-dgEcD0HR.js";import{I as w,E as M,F as D}from"./index-DV8qvdUj.js";import{A as o,B as x,T as F,L as $,I as T,S as y}from"./heroui-BI50yK5B.js";function _({label:t,value:r,onChange:a,isRequired:c,autoFocus:i}){return e.jsxs(F,{value:r,onChange:a,isRequired:c,className:"flex flex-col gap-1",children:[e.jsx($,{className:"text-sm font-medium text-[var(--otari-ink)]",children:t}),e.jsx(T,{inputMode:"decimal",placeholder:"0.00",autoFocus:i})]})}function R(t){const r=t.trim();if(r==="")return null;const a=Number(r);return Number.isFinite(a)&&a>=0?a:Number.NaN}const C=t=>`Recompute cost for ${t.toLocaleString()} imported ${t===1?"row":"rows"} from each row's own token counts at these per-1M rates. Enforced gateway rows are never affected.`;function W({isOpen:t,onOpenChange:r,targetCount:a,isPending:c,error:i,onSubmit:E,title:I="Set price",description:L=C}){const[j,p]=u.useState(""),[n,h]=u.useState(""),[b,N]=u.useState(""),[f,v]=u.useState("");u.useEffect(()=>{t&&(p(""),h(""),N(""),v(""))},[t]);const m=R(j),l=R(n),d=R(b),s=R(f),g=m===null||Number.isNaN(m)||l===null||Number.isNaN(l)||Number.isNaN(d??0)||Number.isNaN(s??0),S=()=>{g||m===null||l===null||E({input_price_per_million:m,output_price_per_million:l,...d!==null&&!Number.isNaN(d)?{cache_read_price_per_million:d}:{},...s!==null&&!Number.isNaN(s)?{cache_write_price_per_million:s}:{}})};return e.jsx(o,{isOpen:t,onOpenChange:r,children:t?e.jsx(o.Backdrop,{children:e.jsx(o.Container,{placement:"center",size:"lg",children:e.jsxs(o.Dialog,{children:[e.jsx(o.Header,{children:e.jsx(o.Heading,{children:I})}),e.jsxs(o.Body,{className:"flex flex-col gap-4",children:[e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:L(a)}),e.jsxs("div",{className:"grid gap-3 sm:grid-cols-2",children:[e.jsx(_,{label:"Input $ / 1M",value:j,onChange:p,isRequired:!0,autoFocus:!0}),e.jsx(_,{label:"Output $ / 1M",value:n,onChange:h,isRequired:!0}),e.jsx(_,{label:"Cache read $ / 1M",value:b,onChange:N}),e.jsx(_,{label:"Cache write $ / 1M",value:f,onChange:v})]}),e.jsx(w,{tone:"info",children:"Leave a cache rate blank to bill those tokens at the input rate."}),e.jsx(M,{error:i})]}),e.jsxs(o.Footer,{children:[e.jsx(x,{variant:"ghost",isDisabled:c,onPress:()=>r(!1),children:"Cancel"}),e.jsx(x,{variant:"primary",isDisabled:g,isPending:c,onPress:S,children:"Set price"})]})]})})}):null})}const P=[25,50,100];function q({page:t,pageSize:r,total:a,rowsOnPage:c,onPageChange:i,onPageSizeChange:E,pageSizeOptions:I=P,isFetching:L=!1,hasNextFallback:j=!1}){const p=u.useId(),n=a!=null?Math.max(1,Math.ceil(a/r)):null,h=t===0,b=n!=null?t>=n-1:!j,N=c>0?t*r+1:0,f=t*r+c,v=a!=null?a===0?"0 of 0":`${N.toLocaleString()}–${f.toLocaleString()} of ${a.toLocaleString()}`:c>0?`${N.toLocaleString()}–${f.toLocaleString()}`:"0",[m,l]=u.useState(String(t+1));u.useEffect(()=>{l(String(t+1))},[t]);const d=()=>{const s=Number.parseInt(m,10);if(Number.isNaN(s)){l(String(t+1));return}const g=n??Number.MAX_SAFE_INTEGER,S=Math.min(Math.max(s,1),g);S-1!==t?i(S-1):l(String(t+1))};return e.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("label",{htmlFor:p,className:"text-sm text-[var(--otari-muted)]",children:"Rows"}),e.jsx(D,{id:p,ariaLabel:"Rows per page",value:String(r),onChange:s=>E(Number.parseInt(s,10)),options:I.map(s=>({value:String(s),label:String(s)}))}),L?e.jsx(y,{size:"sm"}):null]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"text-sm text-[var(--otari-muted)] tabular-nums",children:v}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(x,{size:"sm",variant:"outline","aria-label":"First page",isDisabled:h,onPress:()=>i(0),children:"«"}),e.jsx(x,{size:"sm",variant:"outline","aria-label":"Previous page",isDisabled:h,onPress:()=>i(t-1),children:"‹"}),e.jsxs("span",{className:"inline-flex items-center gap-1 text-sm text-[var(--otari-muted)]",children:[e.jsx("input",{"aria-label":"Page number",inputMode:"numeric",value:m,onChange:s=>l(s.target.value.replace(/[^0-9]/g,"")),onKeyDown:s=>{s.key==="Enter"&&s.currentTarget.blur()},onBlur:d,className:"w-12 rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-2 py-1 text-center text-sm text-[var(--otari-ink)] tabular-nums focus:border-[var(--otari-brand)] focus:outline-none"}),n!=null?e.jsxs("span",{className:"tabular-nums",children:["/ ",n.toLocaleString()]}):null]}),e.jsx(x,{size:"sm",variant:"outline","aria-label":"Next page",isDisabled:b,onPress:()=>i(t+1),children:"›"}),e.jsx(x,{size:"sm",variant:"outline","aria-label":"Last page",isDisabled:n==null||b,onPress:()=>n!=null&&i(n-1),children:"»"})]})]})]})}export{P,W as S,q as T}; diff --git a/src/gateway/static/dashboard/assets/ToolsGuardrailsPage-517a2mDO.js b/src/gateway/static/dashboard/assets/ToolsGuardrailsPage-DiZ1TbOa.js similarity index 99% rename from src/gateway/static/dashboard/assets/ToolsGuardrailsPage-517a2mDO.js rename to src/gateway/static/dashboard/assets/ToolsGuardrailsPage-DiZ1TbOa.js index bcf1d4bf..2f90c443 100644 --- a/src/gateway/static/dashboard/assets/ToolsGuardrailsPage-517a2mDO.js +++ b/src/gateway/static/dashboard/assets/ToolsGuardrailsPage-DiZ1TbOa.js @@ -1 +1 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as x}from"./react-dgEcD0HR.js";import{aa as L,ab as C,P,E,M as R,G as w,ac as D,F as M}from"./index-mAhQhUE6.js";import{d as N,B as g}from"./heroui-BI50yK5B.js";function U(s,t){return{[s]:t}}const B=[{key:"web_search",label:"Web search",blurb:"Backend for otari_web_search tools (a SearXNG instance or a search adapter).",order:["web_search_url","web_search_engines","web_search_max_results","web_search_extract","web_search_purpose_hint"]},{key:"sandbox",label:"Code execution",blurb:"Backend for otari_code_execution tools (the sandbox that runs generated code).",order:["sandbox_url","sandbox_purpose_hint"]},{key:"guardrails",label:"Guardrails",blurb:"Default input-guardrails service used when a request does not pass its own guardrail URL.",order:["guardrails_url"]}];function $(){const[s,t]=x.useState(null),a=x.useRef(void 0),n=r=>{t(r),window.clearTimeout(a.current),a.current=window.setTimeout(()=>t(null),2500)};return x.useEffect(()=>()=>window.clearTimeout(a.current),[]),[s,n]}function G({message:s}){return s?e.jsxs("div",{role:"status","aria-live":"polite",className:"fixed right-4 bottom-4 z-50 flex items-center gap-2 rounded-lg border border-green-200 bg-green-50 px-4 py-3 text-sm font-medium text-green-700 shadow-lg",children:[e.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2","aria-hidden":!0,className:"h-5 w-5",children:e.jsx("path",{d:"M20 6 9 17l-5-5",strokeLinecap:"round",strokeLinejoin:"round"})}),s]}):null}const S="rounded-md border border-[var(--otari-line)] bg-[var(--otari-surface)] px-2 py-1 text-sm focus:border-[var(--otari-brand)] focus:outline-none disabled:opacity-50",b="grid gap-x-4 gap-y-1.5 py-4 sm:grid-cols-[minmax(0,1fr)_16rem_10rem] sm:items-start",_=`w-full sm:col-start-2 ${S}`,k="flex items-center gap-2 sm:col-start-3",f="flex flex-col gap-1 sm:col-span-2 sm:col-start-2";function j({message:s}){return s?e.jsx("span",{className:"break-words text-xs text-red-700",children:s}):null}function y({field:s,help:t}){return e.jsxs("div",{className:"min-w-0 sm:col-start-1",children:[e.jsx("code",{className:"text-sm font-medium text-[var(--otari-ink)]",children:s.key}),s.description?e.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:s.description}):null,t?e.jsx("p",{className:"mt-1 text-xs text-[var(--otari-muted)]",children:t}):null]})}function z({field:s,onSave:t,saveError:a,disabled:n}){const r=typeof s.value=="string"?s.value:"",[l,i]=x.useState(r),[m,p]=x.useState(null),c=D();x.useEffect(()=>{i(r)},[r]);const o=l.trim()!==r,d=l.trim(),h=m!==null&&m===d;return e.jsxs("div",{className:b,children:[e.jsx(y,{field:s,help:"Leave blank and Save to fall back to the configured default."}),e.jsx("input",{type:"text",inputMode:"url","aria-label":s.key,value:l,disabled:n,placeholder:"unset",onChange:v=>{i(v.target.value),c.reset()},className:_}),e.jsxs("div",{className:k,children:[e.jsx(g,{size:"sm",variant:"primary","aria-label":`Save ${s.key}`,isDisabled:n||!o,onPress:()=>t(d===""?null:d),children:"Save"}),e.jsx(g,{size:"sm",variant:"outline","aria-label":`Test ${s.service}`,isDisabled:d===""||c.isPending,onPress:()=>{p(d),c.mutate({service:s.service,url:d})},children:c.isPending?"Testing…":"Test"})]}),e.jsxs("div",{className:f,children:[e.jsx("span",{role:"status","aria-live":"polite",className:"block break-words text-xs",children:c.isPending||!h?null:c.error?e.jsx("span",{className:"text-red-700",children:w(c.error)}):c.data?e.jsx("span",{className:c.data.ok?"font-medium text-green-700":"text-red-700",children:c.data.reason}):null}),e.jsx(j,{message:a})]})]})}function I({field:s,onSave:t,saveError:a,disabled:n}){const r=typeof s.value=="string"?s.value:"",[l,i]=x.useState(r);x.useEffect(()=>{i(r)},[r]);const m=l!==r;return e.jsxs("div",{className:b,children:[e.jsx(y,{field:s}),e.jsx("input",{type:"text","aria-label":s.key,value:l,disabled:n,placeholder:"default",onChange:p=>i(p.target.value),className:_}),e.jsx("div",{className:k,children:e.jsx(g,{size:"sm",variant:"primary","aria-label":`Save ${s.key}`,isDisabled:n||!m,onPress:()=>t(l.trim()===""?null:l.trim()),children:"Save"})}),a?e.jsx("div",{className:f,children:e.jsx(j,{message:a})}):null]})}function A({field:s,onSave:t,saveError:a,disabled:n}){const r=typeof s.value=="number"?String(s.value):"",[l,i]=x.useState(r);x.useEffect(()=>{i(r)},[r]);const m=l.trim(),p=Number(m),o=(m===""||Number.isInteger(p)&&p>=1)&&m!==r;return e.jsxs("div",{className:b,children:[e.jsx(y,{field:s,help:"Leave blank to use the backend default."}),e.jsx("input",{type:"number",min:"1",step:"1",inputMode:"numeric","aria-label":s.key,value:l,disabled:n,placeholder:"default",onChange:d=>i(d.target.value),className:`w-full text-right tabular-nums sm:col-start-2 sm:w-28 sm:justify-self-end ${S}`}),e.jsx("div",{className:k,children:e.jsx(g,{size:"sm",variant:"primary","aria-label":`Save ${s.key}`,isDisabled:n||!o,onPress:()=>t(m===""?null:p),children:"Save"})}),a?e.jsx("div",{className:f,children:e.jsx(j,{message:a})}):null]})}function F({field:s,onSave:t,saveError:a,disabled:n}){const r=s.value===!0?"on":s.value===!1?"off":"default";return e.jsxs("div",{className:b,children:[e.jsx(y,{field:s}),e.jsx("div",{className:"sm:col-start-2 sm:justify-self-start",children:e.jsx(M,{ariaLabel:s.key,value:r,onChange:l=>t(l==="default"?null:l==="on"),options:[{value:"default",label:"Default"},{value:"on",label:"On"},{value:"off",label:"Off"}],disabled:n})}),a?e.jsx("div",{className:f,children:e.jsx(j,{message:a})}):null]})}function O({field:s,onSave:t,saveError:a,disabled:n}){return s.type==="url"?e.jsx(z,{field:s,onSave:t,saveError:a,disabled:n}):s.type==="int"?e.jsx(A,{field:s,onSave:t,saveError:a,disabled:n}):s.type==="bool"?e.jsx(F,{field:s,onSave:t,saveError:a,disabled:n}):e.jsx(I,{field:s,onSave:t,saveError:a,disabled:n})}function V(){const s=L(),t=C(),[a,n]=$(),[r,l]=x.useState({}),i=s.data,m=!i||t.isPending,p=new Map(((i==null?void 0:i.fields)??[]).map(o=>[o.key,o])),c=(o,d)=>{l(h=>{const{[o.key]:v,...u}=h;return u}),t.mutate(U(o.key,d),{onSuccess:()=>n(`${o.key} saved`),onError:h=>l(v=>({...v,[o.key]:w(h)}))})};return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(P,{title:"Tools & Guardrails",description:"Configure the built-in tool and guardrail service endpoints without a restart. Changes apply immediately and persist. URLs are validated for shape (http/https) and can be tested for reachability before saving; the network-safety gates for these services live on the Settings page."}),e.jsx(E,{error:s.error}),s.isLoading?e.jsx(R,{}):null,B.map(o=>{const d=o.order.map(u=>p.get(u)).filter(u=>u!==void 0),h=((i==null?void 0:i.fields)??[]).filter(u=>u.service===o.key&&!o.order.includes(u.key)),v=[...d,...h];return v.length===0?null:e.jsxs("section",{className:"flex flex-col gap-2",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:o.label}),e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:o.blurb}),e.jsx(N,{children:e.jsx(N.Content,{className:"flex flex-col divide-y divide-[var(--otari-line)] px-5 py-1",children:v.map(u=>e.jsx(O,{field:u,onSave:T=>c(u,T),saveError:r[u.key],disabled:m},u.key))})})]},o.key)}),e.jsx(G,{message:a})]})}export{V as ToolsGuardrailsPage}; +import{j as e}from"./tanstack-query-1t81HyiD.js";import{r as x}from"./react-dgEcD0HR.js";import{aa as L,ab as C,P,E,M as R,G as w,ac as D,F as M}from"./index-DV8qvdUj.js";import{d as N,B as g}from"./heroui-BI50yK5B.js";function U(s,t){return{[s]:t}}const B=[{key:"web_search",label:"Web search",blurb:"Backend for otari_web_search tools (a SearXNG instance or a search adapter).",order:["web_search_url","web_search_engines","web_search_max_results","web_search_extract","web_search_purpose_hint"]},{key:"sandbox",label:"Code execution",blurb:"Backend for otari_code_execution tools (the sandbox that runs generated code).",order:["sandbox_url","sandbox_purpose_hint"]},{key:"guardrails",label:"Guardrails",blurb:"Default input-guardrails service used when a request does not pass its own guardrail URL.",order:["guardrails_url"]}];function $(){const[s,t]=x.useState(null),a=x.useRef(void 0),n=r=>{t(r),window.clearTimeout(a.current),a.current=window.setTimeout(()=>t(null),2500)};return x.useEffect(()=>()=>window.clearTimeout(a.current),[]),[s,n]}function G({message:s}){return s?e.jsxs("div",{role:"status","aria-live":"polite",className:"fixed right-4 bottom-4 z-50 flex items-center gap-2 rounded-lg border border-green-200 bg-green-50 px-4 py-3 text-sm font-medium text-green-700 shadow-lg",children:[e.jsx("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2","aria-hidden":!0,className:"h-5 w-5",children:e.jsx("path",{d:"M20 6 9 17l-5-5",strokeLinecap:"round",strokeLinejoin:"round"})}),s]}):null}const S="rounded-md border border-[var(--otari-line)] bg-[var(--otari-surface)] px-2 py-1 text-sm focus:border-[var(--otari-brand)] focus:outline-none disabled:opacity-50",b="grid gap-x-4 gap-y-1.5 py-4 sm:grid-cols-[minmax(0,1fr)_16rem_10rem] sm:items-start",_=`w-full sm:col-start-2 ${S}`,k="flex items-center gap-2 sm:col-start-3",f="flex flex-col gap-1 sm:col-span-2 sm:col-start-2";function j({message:s}){return s?e.jsx("span",{className:"break-words text-xs text-red-700",children:s}):null}function y({field:s,help:t}){return e.jsxs("div",{className:"min-w-0 sm:col-start-1",children:[e.jsx("code",{className:"text-sm font-medium text-[var(--otari-ink)]",children:s.key}),s.description?e.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:s.description}):null,t?e.jsx("p",{className:"mt-1 text-xs text-[var(--otari-muted)]",children:t}):null]})}function z({field:s,onSave:t,saveError:a,disabled:n}){const r=typeof s.value=="string"?s.value:"",[l,i]=x.useState(r),[m,p]=x.useState(null),c=D();x.useEffect(()=>{i(r)},[r]);const o=l.trim()!==r,d=l.trim(),h=m!==null&&m===d;return e.jsxs("div",{className:b,children:[e.jsx(y,{field:s,help:"Leave blank and Save to fall back to the configured default."}),e.jsx("input",{type:"text",inputMode:"url","aria-label":s.key,value:l,disabled:n,placeholder:"unset",onChange:v=>{i(v.target.value),c.reset()},className:_}),e.jsxs("div",{className:k,children:[e.jsx(g,{size:"sm",variant:"primary","aria-label":`Save ${s.key}`,isDisabled:n||!o,onPress:()=>t(d===""?null:d),children:"Save"}),e.jsx(g,{size:"sm",variant:"outline","aria-label":`Test ${s.service}`,isDisabled:d===""||c.isPending,onPress:()=>{p(d),c.mutate({service:s.service,url:d})},children:c.isPending?"Testing…":"Test"})]}),e.jsxs("div",{className:f,children:[e.jsx("span",{role:"status","aria-live":"polite",className:"block break-words text-xs",children:c.isPending||!h?null:c.error?e.jsx("span",{className:"text-red-700",children:w(c.error)}):c.data?e.jsx("span",{className:c.data.ok?"font-medium text-green-700":"text-red-700",children:c.data.reason}):null}),e.jsx(j,{message:a})]})]})}function I({field:s,onSave:t,saveError:a,disabled:n}){const r=typeof s.value=="string"?s.value:"",[l,i]=x.useState(r);x.useEffect(()=>{i(r)},[r]);const m=l!==r;return e.jsxs("div",{className:b,children:[e.jsx(y,{field:s}),e.jsx("input",{type:"text","aria-label":s.key,value:l,disabled:n,placeholder:"default",onChange:p=>i(p.target.value),className:_}),e.jsx("div",{className:k,children:e.jsx(g,{size:"sm",variant:"primary","aria-label":`Save ${s.key}`,isDisabled:n||!m,onPress:()=>t(l.trim()===""?null:l.trim()),children:"Save"})}),a?e.jsx("div",{className:f,children:e.jsx(j,{message:a})}):null]})}function A({field:s,onSave:t,saveError:a,disabled:n}){const r=typeof s.value=="number"?String(s.value):"",[l,i]=x.useState(r);x.useEffect(()=>{i(r)},[r]);const m=l.trim(),p=Number(m),o=(m===""||Number.isInteger(p)&&p>=1)&&m!==r;return e.jsxs("div",{className:b,children:[e.jsx(y,{field:s,help:"Leave blank to use the backend default."}),e.jsx("input",{type:"number",min:"1",step:"1",inputMode:"numeric","aria-label":s.key,value:l,disabled:n,placeholder:"default",onChange:d=>i(d.target.value),className:`w-full text-right tabular-nums sm:col-start-2 sm:w-28 sm:justify-self-end ${S}`}),e.jsx("div",{className:k,children:e.jsx(g,{size:"sm",variant:"primary","aria-label":`Save ${s.key}`,isDisabled:n||!o,onPress:()=>t(m===""?null:p),children:"Save"})}),a?e.jsx("div",{className:f,children:e.jsx(j,{message:a})}):null]})}function F({field:s,onSave:t,saveError:a,disabled:n}){const r=s.value===!0?"on":s.value===!1?"off":"default";return e.jsxs("div",{className:b,children:[e.jsx(y,{field:s}),e.jsx("div",{className:"sm:col-start-2 sm:justify-self-start",children:e.jsx(M,{ariaLabel:s.key,value:r,onChange:l=>t(l==="default"?null:l==="on"),options:[{value:"default",label:"Default"},{value:"on",label:"On"},{value:"off",label:"Off"}],disabled:n})}),a?e.jsx("div",{className:f,children:e.jsx(j,{message:a})}):null]})}function O({field:s,onSave:t,saveError:a,disabled:n}){return s.type==="url"?e.jsx(z,{field:s,onSave:t,saveError:a,disabled:n}):s.type==="int"?e.jsx(A,{field:s,onSave:t,saveError:a,disabled:n}):s.type==="bool"?e.jsx(F,{field:s,onSave:t,saveError:a,disabled:n}):e.jsx(I,{field:s,onSave:t,saveError:a,disabled:n})}function V(){const s=L(),t=C(),[a,n]=$(),[r,l]=x.useState({}),i=s.data,m=!i||t.isPending,p=new Map(((i==null?void 0:i.fields)??[]).map(o=>[o.key,o])),c=(o,d)=>{l(h=>{const{[o.key]:v,...u}=h;return u}),t.mutate(U(o.key,d),{onSuccess:()=>n(`${o.key} saved`),onError:h=>l(v=>({...v,[o.key]:w(h)}))})};return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(P,{title:"Tools & Guardrails",description:"Configure the built-in tool and guardrail service endpoints without a restart. Changes apply immediately and persist. URLs are validated for shape (http/https) and can be tested for reachability before saving; the network-safety gates for these services live on the Settings page."}),e.jsx(E,{error:s.error}),s.isLoading?e.jsx(R,{}):null,B.map(o=>{const d=o.order.map(u=>p.get(u)).filter(u=>u!==void 0),h=((i==null?void 0:i.fields)??[]).filter(u=>u.service===o.key&&!o.order.includes(u.key)),v=[...d,...h];return v.length===0?null:e.jsxs("section",{className:"flex flex-col gap-2",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:o.label}),e.jsx("p",{className:"text-sm text-[var(--otari-muted)]",children:o.blurb}),e.jsx(N,{children:e.jsx(N.Content,{className:"flex flex-col divide-y divide-[var(--otari-line)] px-5 py-1",children:v.map(u=>e.jsx(O,{field:u,onSave:T=>c(u,T),saveError:r[u.key],disabled:m},u.key))})})]},o.key)}),e.jsx(G,{message:a})]})}export{V as ToolsGuardrailsPage}; diff --git a/src/gateway/static/dashboard/assets/UsagePage-Ce_jAzFl.js b/src/gateway/static/dashboard/assets/UsagePage-Ce_jAzFl.js new file mode 100644 index 00000000..ee68cbdc --- /dev/null +++ b/src/gateway/static/dashboard/assets/UsagePage-Ce_jAzFl.js @@ -0,0 +1 @@ +import{j as e}from"./tanstack-query-1t81HyiD.js";import{i as Ue,r as i}from"./react-dgEcD0HR.js";import{u as Ae,a as Re,d as Y,O as T,P as Oe,E as ye,R as Ke,g as te,q as $e,S as q,T as U,Q as W,V as Be,ad as B,e as Ie,f as ze,b as He,c as xe}from"./index-DV8qvdUj.js";import{i as se,b as Ge,U as ke,A as Qe,d as je,F as Ve,f as Ye}from"./FilterChips-DZjxf-ot.js";import{u as Ze,r as We,B as Je}from"./tableSelection-9hV37uhu.js";import{S as ae,B as Xe}from"./charts-DIsd9m--.js";import{C as et}from"./ConfirmDialog-KvA7b1-a.js";import{D as we}from"./DataTable-Bmn_eYSV.js";import{T as tt,S as st}from"./TablePagination-CXhesdmH.js";import{B as I,S as pe}from"./heroui-BI50yK5B.js";import"./recharts-C4kRDmvS.js";function Z(t){return t.toLocaleString()}function at(t){return t===null?"—":t<1e3?`${Math.round(t)} ms`:`${(t/1e3).toFixed(2)} s`}const fe=Ye(je,ke),ne=15,_e="__other__",ve="__unknown__";function Se({title:t,rows:r,totalCost:h,emptyLabel:n,onDrill:v,loading:m}){const[c,x]=i.useState(!1),j=c?r:r.slice(0,ne),A=r.length-j.length,N=o=>o.is_other?_e:o.key??ve,R=[{id:"name",header:t.replace("Spend by ",""),isRowHeader:!0,cell:o=>{const d=h>0?o.cost/h:0;return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("span",{className:"truncate text-[var(--otari-ink)]",children:o.is_other?`Other (${o.requests.toLocaleString()} req)`:o.key===null?"(unknown)":o.key}),e.jsx("span",{className:"h-1 w-full overflow-hidden rounded-full bg-[var(--otari-line)]",children:e.jsx("span",{className:"block h-full rounded-full bg-[var(--otari-brand)]",style:{width:`${Math.min(100,d*100)}%`}})})]})}},{id:"requests",header:"Requests",align:"end",cell:o=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:Z(o.requests)})},{id:"spend",header:"Spend",align:"end",cell:o=>e.jsx("span",{className:"text-[var(--otari-ink)]",children:W(o.cost)})}];return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:t}),e.jsx(we,{ariaLabel:t,columns:R,rows:j,getRowKey:N,isLoading:m,emptyContent:n,onRowAction:o=>{o!==_e&&o!==ve&&v(o)}}),!m&&A>0?e.jsxs(I,{size:"sm",variant:"ghost",onPress:()=>x(!0),children:["Show all ",r.length]}):null,!m&&c&&r.length>ne?e.jsxs(I,{size:"sm",variant:"ghost",onPress:()=>x(!1),children:["Show top ",ne]}):null]})}const nt=[{key:"cost",label:"Cost"},{key:"tokens",label:"Tokens"},{key:"requests",label:"Requests"}];function ot(t,r){return r==="cost"?t.cost:r==="tokens"?t.tokens:t.requests}function be(t,r){return r==="cost"?W(t):r==="tokens"?B(t):Z(t)}function rt(t,r){const h=new Date(t);return Number.isNaN(h.getTime())?t:r==="hour"?h.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",timeZone:"UTC"}):h.toLocaleDateString(void 0,{month:"short",day:"numeric",timeZone:"UTC"})}function lt(t,r,h){const n=t.map(m=>({label:rt(m.bucket_start,h),value:ot(m,r)})),v=n.length?Math.max(...n.map(m=>m.value)):0;return{points:n,peak:v,count:t.length}}const it=50;function ct(t){const r=new Date(t).getTime();if(Number.isNaN(r))return t;const h=Math.max(0,Math.round((Date.now()-r)/1e3));if(h<60)return`${h}s ago`;const n=Math.round(h/60);if(n<60)return`${n}m ago`;const v=Math.round(n/60);return v<24?`${v}h ago`:`${Math.round(v/24)}d ago`}function dt({status:t}){return e.jsx("span",{className:`inline-flex items-center rounded-full border px-2 py-0.5 text-xs font-medium ${t==="error"?"border-red-200 bg-red-50 text-red-700":"border-[var(--otari-line)] bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]"}`,children:t})}const ut=[{id:"time",header:"Time",isRowHeader:!0,cell:t=>e.jsx("span",{className:"text-[var(--otari-muted)]",title:new Date(t.timestamp).toLocaleString(),children:ct(t.timestamp)})},{id:"model",header:"Model",cell:t=>e.jsx("span",{className:"text-[var(--otari-ink)]",children:t.model})},{id:"user",header:"User",cell:t=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:t.user_id??"—"})},{id:"tokens",header:"Tokens",align:"end",cell:t=>t.total_tokens===null?"—":t.total_tokens.toLocaleString()},{id:"cost",header:"Cost",align:"end",cell:t=>t.cost===null?"—":W(t.cost)},{id:"status",header:"Status",cell:t=>e.jsx(dt,{status:t.status})}],mt=t=>t.id;function ht({filters:t,anyFilter:r}){var $,H;const[h,n]=i.useState(0),[v,m]=i.useState(it),c=Ze(),x=Ie(),j=ze(),[A,N]=i.useState(!1),[R,o]=i.useState(!1),d=JSON.stringify(t),L=i.useRef(d);i.useEffect(()=>{L.current!==d&&(L.current=d,n(0),c.clear())},[d,c]);const p=He(t,h,v),C=xe(t),g=p.data??[],P=C.isSuccess&&!C.isPlaceholderData?(($=C.data)==null?void 0:$.total)??0:null,O=g.filter(_=>!_.counts_toward_budget).map(_=>_.id),f=g.filter(_=>_.counts_toward_budget).map(_=>_.id),S=We(c.selectedKeys,O),b=S.length,k=c.allMatching||b>0,D=i.useMemo(()=>({...t,counts_toward_budget:!1}),[t]),y=xe(D,k),E=y.isSuccess?((H=y.data)==null?void 0:H.total)??null:null,K=O.length>0&&b===O.length&&E!=null&&E>b,F=c.allMatching?E??b:b,l=()=>c.allMatching?{by_filter:!0,model:t.model,user_id:t.user_id,api_key_id:t.api_key_id,start_date:t.start_date,end_date:t.end_date,priced:t.priced}:{ids:S},a=()=>x.mutate(l(),{onSuccess:()=>{N(!1),c.clear()}}),u=_=>j.mutate({...l(),..._},{onSuccess:()=>{o(!1),c.clear()}});return e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Individual requests"}),e.jsx(ye,{error:p.error??C.error}),k?e.jsxs(Je,{selectedCount:F,allMatching:c.allMatching,matchingTotal:E,canSelectAllMatching:K,onSelectAllMatching:c.enableAllMatching,onClear:c.clear,children:[e.jsx(I,{size:"sm",variant:"primary",onPress:()=>o(!0),children:"Set price"}),e.jsx(I,{size:"sm",variant:"danger",onPress:()=>N(!0),children:"Delete"})]}):null,e.jsx(we,{ariaLabel:"Individual requests",columns:ut,rows:g,getRowKey:mt,isLoading:p.isLoading,emptyContent:r?"No requests match these filters.":"No requests recorded yet.",selectionMode:"multiple",selectedKeys:c.selectedKeys,onSelectionChange:c.onSelectionChange,disabledKeys:f}),e.jsx(tt,{page:h,pageSize:v,total:P,rowsOnPage:g.length,onPageChange:n,onPageSizeChange:_=>{m(_),n(0)},isFetching:p.isFetching,hasNextFallback:g.length===v}),e.jsx(et,{isOpen:A,onOpenChange:N,heading:"Delete usage rows",body:`Delete ${F.toLocaleString()} imported ${F===1?"row":"rows"}? Only imported rows are removed, and this cannot be undone.`,confirmLabel:"Delete",isPending:x.isPending,error:x.error,onConfirm:a}),e.jsx(st,{isOpen:R,onOpenChange:o,targetCount:F,isPending:j.isPending,error:j.error,onSubmit:u})]})}function wt(){var ue,me,he,ge;const t=Ue(),r=Ae(),h=Re(),[n,v]=i.useState(fe),[m,c]=i.useState(()=>se(fe.seconds??0)),[x,j]=i.useState(!1),[A,N]=i.useState(),[R,o]=i.useState(),[d,L]=i.useState(""),[p,C]=i.useState(""),[g,z]=i.useState(""),[P,O]=i.useState("cost"),f=x?A:m,S=x?R:void 0,b=x?f?Ge(f,S):"day":n.bucket,k=i.useMemo(()=>({start_date:f,end_date:S,model:d.trim()||void 0,user_id:p||void 0,api_key_id:g||void 0}),[f,S,d,p,g]),D=i.useMemo(()=>{if(x){if(!f||!S)return null;const s=new Date(S).getTime()-new Date(f).getTime();return s>0?{...k,start_date:new Date(new Date(f).getTime()-s).toISOString(),end_date:f}:null}return!m||n.seconds===null?null:{...k,start_date:new Date(new Date(m).getTime()-n.seconds*1e3).toISOString(),end_date:m}},[x,f,S,k,n.seconds,m]),y=Y(k,b),E=Y(D??k,b,D!==null),oe=i.useMemo(()=>({start_date:m,model:d.trim()||void 0,user_id:p||void 0,api_key_id:g||void 0}),[m,d,p,g]),K=Y(oe,n.bucket),F=(((ue=K.data)==null?void 0:ue.series)??[]).map(s=>({bucketStart:s.bucket_start,requests:s.requests})),l=y.data,a=l==null?void 0:l.totals,u=D!==null?(me=E.data)==null?void 0:me.totals:void 0,$=a?T(a.cost,u==null?void 0:u.cost):null,H=i.useMemo(()=>({...k,model:void 0}),[k]),_=Y(H,b),J=((ge=(he=_.data)==null?void 0:he.by_model)==null?void 0:ge.filter(s=>!s.is_other&&s.key!==null).map(s=>s.key))??[],re=(r.data??[]).map(s=>({value:s.user_id,label:s.alias?`${s.alias} (${s.user_id})`:s.user_id})),le=(h.data??[]).map(s=>({value:s.id,label:s.key_name??`${s.id.slice(0,8)}…`})),Ne=(d&&!J.includes(d)?[d,...J]:J).map(s=>({value:s,label:s})),Ce=x||n.key!==ke,G=!!(d.trim()||p||g||Ce),ie=(s,w)=>{var Q;return((Q=s.find(V=>V.value===w))==null?void 0:Q.label)??w},Pe=()=>{L(""),C(""),z("")},Ee=[...p?[{key:"user",label:"User",value:ie(re,p),onClear:()=>C("")}]:[],...d.trim()?[{key:"model",label:"Model",value:d.trim(),onClear:()=>L("")}]:[],...g?[{key:"key",label:"API key",value:ie(le,g),onClear:()=>z("")}]:[]],qe=!!(l&&a&&a.request_count===0&&!G),Le=(l==null?void 0:l.start_date)??f,De=(l==null?void 0:l.end_date)??S,ce=s=>{j(!1),v(s),c(se(s.seconds??0)),N(void 0),o(void 0)},Fe=(s,w)=>{j(!0),N(s),o(w)},Me=()=>{x||c(se(n.seconds??0)),y.refetch(),K.refetch(),_.refetch(),D!==null&&E.refetch()},de=s=>{const w=new URLSearchParams;f&&w.set("start_date",f),S&&w.set("end_date",S);for(const[Q,V]of Object.entries(s))V&&w.set(Q,V);t(`/activity?${w.toString()}`)},Te=a&&a.request_count>0?a.error_count/a.request_count:0,M=(l==null?void 0:l.series)??[],X=M.length>1,ee=lt(M,P,b);return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(Oe,{title:"Usage & analytics",description:"Aggregate spend, tokens, and request volume over time. Click a model or user to drill into the request log."}),e.jsx(ye,{error:y.error}),e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx(Qe,{presets:je,extentKey:n.key,onPreset:ce,onSelectRange:Fe,onSelectFull:()=>ce(n),series:F,bucket:n.bucket,windowStart:Le,windowEnd:De,loading:K.isLoading,ariaLabel:"Usage request volume over the selected window",action:e.jsx(Ke,{onRefresh:Me,isFetching:y.isFetching,updatedAt:y.dataUpdatedAt})}),e.jsxs(Ve,{chips:Ee,onClearAll:Pe,children:[e.jsx(te,{label:"User",value:p,onChange:C,options:re,placeholder:"All users"}),e.jsx(te,{label:"Model",value:d,onChange:L,options:Ne,placeholder:"All models"}),e.jsx(te,{label:"API key",value:g,onChange:z,options:le,placeholder:"All keys"})]})]}),qe?e.jsx($e,{title:"No usage yet",description:"Once the gateway serves requests, spend and volume appear here."}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 sm:grid-cols-3 xl:grid-cols-4",children:[e.jsx(q,{label:"Tracked cost",value:a?W(a.cost):"—",hint:a?e.jsxs("span",{className:"text-[var(--otari-muted)]",children:[e.jsx(U,{fraction:$}),a.unpriced_requests?`${$!==null?" · ":""}${Z(a.unpriced_requests)} unpriced`:null]}):null,chart:X?e.jsx(ae,{values:M.map(s=>s.cost),ariaLabel:"Spend trend over the selected window"}):void 0}),e.jsx(q,{label:"Requests",value:a?Z(a.request_count):"—",hint:a?e.jsxs("span",{className:"text-[var(--otari-muted)]",children:[Be(Te)," errors",u?e.jsxs(e.Fragment,{children:[" · ",e.jsx(U,{fraction:T(a.request_count,u.request_count)})]}):null]}):null,chart:X?e.jsx(ae,{values:M.map(s=>s.requests),ariaLabel:"Request volume trend over the selected window"}):void 0}),e.jsx(q,{label:"Tokens",value:a?B(a.total_tokens):"—",hint:a?e.jsx(U,{fraction:T(a.total_tokens,u==null?void 0:u.total_tokens)}):null,chart:X?e.jsx(ae,{values:M.map(s=>s.tokens),ariaLabel:"Token usage trend over the selected window"}):void 0}),e.jsx(q,{label:"Cache read",value:a?B(a.cache_read_tokens):"—",hint:a?e.jsx(U,{fraction:T(a.cache_read_tokens,u==null?void 0:u.cache_read_tokens)}):null}),e.jsx(q,{label:"Cache write",value:a?B(a.cache_write_tokens):"—",hint:a?e.jsx(U,{fraction:T(a.cache_write_tokens,u==null?void 0:u.cache_write_tokens)}):null}),e.jsx(q,{label:"1h cache write",value:a?B(a.cache_write_1h_tokens??0):"—",hint:a?e.jsx(U,{fraction:T(a.cache_write_1h_tokens??0,(u==null?void 0:u.cache_write_1h_tokens)??0)}):null}),e.jsx(q,{label:"Avg latency",value:a?at(a.avg_latency_ms):"—"})]}),e.jsxs("div",{className:"grid gap-6 lg:grid-cols-2",children:[e.jsx(Se,{title:"Spend by model",rows:(l==null?void 0:l.by_model)??[],totalCost:(a==null?void 0:a.cost)??0,emptyLabel:G?"No usage matches these filters.":"No usage recorded yet.",onDrill:s=>de({model:s,user_id:p||void 0,api_key_id:g||void 0}),loading:y.isLoading}),e.jsx(Se,{title:"Spend by user",rows:(l==null?void 0:l.by_user)??[],totalCost:(a==null?void 0:a.cost)??0,emptyLabel:G?"No usage matches these filters.":"No usage recorded yet.",onDrill:s=>de({user_id:s,model:d.trim()||void 0,api_key_id:g||void 0}),loading:y.isLoading})]}),e.jsx(ht,{filters:k,anyFilter:G}),e.jsxs("div",{className:"flex flex-col gap-3 rounded-xl border border-[var(--otari-line)] bg-[var(--otari-surface)] p-4",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Over time"}),e.jsxs("div",{className:"inline-flex gap-1.5",children:[nt.map(s=>e.jsx(I,{size:"sm",variant:P===s.key?"primary":"outline",onPress:()=>O(s.key),children:s.label},s.key)),y.isFetching?e.jsx(pe,{size:"sm"}):null]})]}),y.isLoading?e.jsx("div",{className:"flex h-48 items-center justify-center",children:e.jsx(pe,{size:"sm"})}):M.length===0?e.jsx("div",{className:"flex h-48 items-center justify-center text-sm text-[var(--otari-muted)]",children:"No data in this range."}):e.jsxs("figure",{className:"flex flex-col gap-2",children:[e.jsx(Xe,{data:ee.points,formatValue:s=>be(s,P),ariaLabel:`${P} per ${b}`}),e.jsxs("figcaption",{className:"text-xs text-[var(--otari-muted)]",children:[be(ee.peak,P)," peak · ",ee.count," ",b==="hour"?"hours":"days"," (times in UTC)"]})]})]})]})]})}export{wt as UsagePage}; diff --git a/src/gateway/static/dashboard/assets/UsagePage-D0tp6Db_.js b/src/gateway/static/dashboard/assets/UsagePage-D0tp6Db_.js deleted file mode 100644 index a218871e..00000000 --- a/src/gateway/static/dashboard/assets/UsagePage-D0tp6Db_.js +++ /dev/null @@ -1 +0,0 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{i as Ue,r as i}from"./react-dgEcD0HR.js";import{u as Ae,a as Re,d as Y,O as M,P as Oe,E as ye,R as Ke,g as te,q as $e,S as E,T,Q as W,V as Be,ad as B,e as Ie,f as ze,b as He,c as xe}from"./index-mAhQhUE6.js";import{i as se,b as Ge,U as ke,A as Qe,d as je,F as Ve,f as Ye}from"./FilterChips-DZjxf-ot.js";import{u as Ze,r as We,B as Je}from"./tableSelection-9hV37uhu.js";import{S as ae,B as Xe}from"./charts-DIsd9m--.js";import{C as et}from"./ConfirmDialog-BZx_uBLn.js";import{D as we}from"./DataTable-Bmn_eYSV.js";import{T as tt,S as st}from"./TablePagination-SF1u0DDk.js";import{B as I,S as pe}from"./heroui-BI50yK5B.js";import"./recharts-C4kRDmvS.js";function Z(t){return t.toLocaleString()}function at(t){return t===null?"—":t<1e3?`${Math.round(t)} ms`:`${(t/1e3).toFixed(2)} s`}const fe=Ye(je,ke),ne=15,_e="__other__",ve="__unknown__";function Se({title:t,rows:r,totalCost:h,emptyLabel:n,onDrill:_,loading:m}){const[c,x]=i.useState(!1),j=c?r:r.slice(0,ne),U=r.length-j.length,N=o=>o.is_other?_e:o.key??ve,A=[{id:"name",header:t.replace("Spend by ",""),isRowHeader:!0,cell:o=>{const d=h>0?o.cost/h:0;return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("span",{className:"truncate text-[var(--otari-ink)]",children:o.is_other?`Other (${o.requests.toLocaleString()} req)`:o.key===null?"(unknown)":o.key}),e.jsx("span",{className:"h-1 w-full overflow-hidden rounded-full bg-[var(--otari-line)]",children:e.jsx("span",{className:"block h-full rounded-full bg-[var(--otari-brand)]",style:{width:`${Math.min(100,d*100)}%`}})})]})}},{id:"requests",header:"Requests",align:"end",cell:o=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:Z(o.requests)})},{id:"spend",header:"Spend",align:"end",cell:o=>e.jsx("span",{className:"text-[var(--otari-ink)]",children:W(o.cost)})}];return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:t}),e.jsx(we,{ariaLabel:t,columns:A,rows:j,getRowKey:N,isLoading:m,emptyContent:n,onRowAction:o=>{o!==_e&&o!==ve&&_(o)}}),!m&&U>0?e.jsxs(I,{size:"sm",variant:"ghost",onPress:()=>x(!0),children:["Show all ",r.length]}):null,!m&&c&&r.length>ne?e.jsxs(I,{size:"sm",variant:"ghost",onPress:()=>x(!1),children:["Show top ",ne]}):null]})}const nt=[{key:"cost",label:"Cost"},{key:"tokens",label:"Tokens"},{key:"requests",label:"Requests"}];function ot(t,r){return r==="cost"?t.cost:r==="tokens"?t.tokens:t.requests}function be(t,r){return r==="cost"?W(t):r==="tokens"?B(t):Z(t)}function rt(t,r){const h=new Date(t);return Number.isNaN(h.getTime())?t:r==="hour"?h.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",timeZone:"UTC"}):h.toLocaleDateString(void 0,{month:"short",day:"numeric",timeZone:"UTC"})}function lt(t,r,h){const n=t.map(m=>({label:rt(m.bucket_start,h),value:ot(m,r)})),_=n.length?Math.max(...n.map(m=>m.value)):0;return{points:n,peak:_,count:t.length}}const it=50;function ct(t){const r=new Date(t).getTime();if(Number.isNaN(r))return t;const h=Math.max(0,Math.round((Date.now()-r)/1e3));if(h<60)return`${h}s ago`;const n=Math.round(h/60);if(n<60)return`${n}m ago`;const _=Math.round(n/60);return _<24?`${_}h ago`:`${Math.round(_/24)}d ago`}function dt({status:t}){return e.jsx("span",{className:`inline-flex items-center rounded-full border px-2 py-0.5 text-xs font-medium ${t==="error"?"border-red-200 bg-red-50 text-red-700":"border-[var(--otari-line)] bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]"}`,children:t})}const ut=[{id:"time",header:"Time",isRowHeader:!0,cell:t=>e.jsx("span",{className:"text-[var(--otari-muted)]",title:new Date(t.timestamp).toLocaleString(),children:ct(t.timestamp)})},{id:"model",header:"Model",cell:t=>e.jsx("span",{className:"text-[var(--otari-ink)]",children:t.model})},{id:"user",header:"User",cell:t=>e.jsx("span",{className:"text-[var(--otari-muted)]",children:t.user_id??"—"})},{id:"tokens",header:"Tokens",align:"end",cell:t=>t.total_tokens===null?"—":t.total_tokens.toLocaleString()},{id:"cost",header:"Cost",align:"end",cell:t=>t.cost===null?"—":W(t.cost)},{id:"status",header:"Status",cell:t=>e.jsx(dt,{status:t.status})}],mt=t=>t.id;function ht({filters:t,anyFilter:r}){var $,H;const[h,n]=i.useState(0),[_,m]=i.useState(it),c=Ze(),x=Ie(),j=ze(),[U,N]=i.useState(!1),[A,o]=i.useState(!1),d=JSON.stringify(t),q=i.useRef(d);i.useEffect(()=>{q.current!==d&&(q.current=d,n(0),c.clear())},[d,c]);const p=He(t,h,_),C=xe(t),g=p.data??[],P=C.isSuccess&&!C.isPlaceholderData?(($=C.data)==null?void 0:$.total)??0:null,R=g.filter(y=>!y.counts_toward_budget).map(y=>y.id),f=g.filter(y=>y.counts_toward_budget).map(y=>y.id),v=We(c.selectedKeys,R),S=v.length,k=c.allMatching||S>0,O=i.useMemo(()=>({...t,counts_toward_budget:!1}),[t]),b=xe(O,k),L=b.isSuccess?((H=b.data)==null?void 0:H.total)??null:null,K=R.length>0&&S===R.length&&L!=null&&L>S,D=c.allMatching?L??S:S,l=()=>c.allMatching?{by_filter:!0,model:t.model,user_id:t.user_id,api_key_id:t.api_key_id,start_date:t.start_date,end_date:t.end_date,priced:t.priced}:{ids:v},a=()=>x.mutate(l(),{onSuccess:()=>{N(!1),c.clear()}}),u=y=>j.mutate({...l(),...y},{onSuccess:()=>{o(!1),c.clear()}});return e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Individual requests"}),e.jsx(ye,{error:p.error??C.error}),k?e.jsxs(Je,{selectedCount:D,allMatching:c.allMatching,matchingTotal:L,canSelectAllMatching:K,onSelectAllMatching:c.enableAllMatching,onClear:c.clear,children:[e.jsx(I,{size:"sm",variant:"primary",onPress:()=>o(!0),children:"Set price"}),e.jsx(I,{size:"sm",variant:"danger",onPress:()=>N(!0),children:"Delete"})]}):null,e.jsx(we,{ariaLabel:"Individual requests",columns:ut,rows:g,getRowKey:mt,isLoading:p.isLoading,emptyContent:r?"No requests match these filters.":"No requests recorded yet.",selectionMode:"multiple",selectedKeys:c.selectedKeys,onSelectionChange:c.onSelectionChange,disabledKeys:f}),e.jsx(tt,{page:h,pageSize:_,total:P,rowsOnPage:g.length,onPageChange:n,onPageSizeChange:y=>{m(y),n(0)},isFetching:p.isFetching,hasNextFallback:g.length===_}),e.jsx(et,{isOpen:U,onOpenChange:N,heading:"Delete usage rows",body:`Delete ${D.toLocaleString()} imported ${D===1?"row":"rows"}? Only imported rows are removed, and this cannot be undone.`,confirmLabel:"Delete",isPending:x.isPending,error:x.error,onConfirm:a}),e.jsx(st,{isOpen:A,onOpenChange:o,targetCount:D,isPending:j.isPending,error:j.error,onSubmit:u})]})}function wt(){var ue,me,he,ge;const t=Ue(),r=Ae(),h=Re(),[n,_]=i.useState(fe),[m,c]=i.useState(()=>se(fe.seconds??0)),[x,j]=i.useState(!1),[U,N]=i.useState(),[A,o]=i.useState(),[d,q]=i.useState(""),[p,C]=i.useState(""),[g,z]=i.useState(""),[P,R]=i.useState("cost"),f=x?U:m,v=x?A:void 0,S=x?f?Ge(f,v):"day":n.bucket,k=i.useMemo(()=>({start_date:f,end_date:v,model:d.trim()||void 0,user_id:p||void 0,api_key_id:g||void 0}),[f,v,d,p,g]),O=i.useMemo(()=>{if(x){if(!f||!v)return null;const s=new Date(v).getTime()-new Date(f).getTime();return s>0?{...k,start_date:new Date(new Date(f).getTime()-s).toISOString(),end_date:f}:null}return!m||n.seconds===null?null:{...k,start_date:new Date(new Date(m).getTime()-n.seconds*1e3).toISOString(),end_date:m}},[x,f,v,k,n.seconds,m]),b=Y(k,S),L=Y(O??k,S,O!==null),oe=i.useMemo(()=>({start_date:m,model:d.trim()||void 0,user_id:p||void 0,api_key_id:g||void 0}),[m,d,p,g]),K=Y(oe,n.bucket),D=(((ue=K.data)==null?void 0:ue.series)??[]).map(s=>({bucketStart:s.bucket_start,requests:s.requests})),l=b.data,a=l==null?void 0:l.totals,u=O!==null?(me=L.data)==null?void 0:me.totals:void 0,$=a?M(a.cost,u==null?void 0:u.cost):null,H=i.useMemo(()=>({...k,model:void 0}),[k]),J=((ge=(he=Y(H,S).data)==null?void 0:he.by_model)==null?void 0:ge.filter(s=>!s.is_other&&s.key!==null).map(s=>s.key))??[],re=(r.data??[]).map(s=>({value:s.user_id,label:s.alias?`${s.alias} (${s.user_id})`:s.user_id})),le=(h.data??[]).map(s=>({value:s.id,label:s.key_name??`${s.id.slice(0,8)}…`})),Ne=(d&&!J.includes(d)?[d,...J]:J).map(s=>({value:s,label:s})),Ce=x||n.key!==ke,G=!!(d.trim()||p||g||Ce),ie=(s,w)=>{var Q;return((Q=s.find(V=>V.value===w))==null?void 0:Q.label)??w},Pe=()=>{q(""),C(""),z("")},Ee=[...p?[{key:"user",label:"User",value:ie(re,p),onClear:()=>C("")}]:[],...d.trim()?[{key:"model",label:"Model",value:d.trim(),onClear:()=>q("")}]:[],...g?[{key:"key",label:"API key",value:ie(le,g),onClear:()=>z("")}]:[]],qe=!!(l&&a&&a.request_count===0&&!G),Le=(l==null?void 0:l.start_date)??f,De=(l==null?void 0:l.end_date)??v,ce=s=>{j(!1),_(s),c(se(s.seconds??0)),N(void 0),o(void 0)},Fe=(s,w)=>{j(!0),N(s),o(w)},Me=()=>{x||c(se(n.seconds??0)),b.refetch(),K.refetch()},de=s=>{const w=new URLSearchParams;f&&w.set("start_date",f),v&&w.set("end_date",v);for(const[Q,V]of Object.entries(s))V&&w.set(Q,V);t(`/activity?${w.toString()}`)},Te=a&&a.request_count>0?a.error_count/a.request_count:0,F=(l==null?void 0:l.series)??[],X=F.length>1,ee=lt(F,P,S);return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(Oe,{title:"Usage & analytics",description:"Aggregate spend, tokens, and request volume over time. Click a model or user to drill into the request log."}),e.jsx(ye,{error:b.error}),e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsx(Qe,{presets:je,extentKey:n.key,onPreset:ce,onSelectRange:Fe,onSelectFull:()=>ce(n),series:D,bucket:n.bucket,windowStart:Le,windowEnd:De,loading:K.isLoading,ariaLabel:"Usage request volume over the selected window",action:e.jsx(Ke,{onRefresh:Me,isFetching:b.isFetching,updatedAt:b.dataUpdatedAt})}),e.jsxs(Ve,{chips:Ee,onClearAll:Pe,children:[e.jsx(te,{label:"User",value:p,onChange:C,options:re,placeholder:"All users"}),e.jsx(te,{label:"Model",value:d,onChange:q,options:Ne,placeholder:"All models"}),e.jsx(te,{label:"API key",value:g,onChange:z,options:le,placeholder:"All keys"})]})]}),qe?e.jsx($e,{title:"No usage yet",description:"Once the gateway serves requests, spend and volume appear here."}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"grid grid-cols-2 gap-4 sm:grid-cols-3 xl:grid-cols-4",children:[e.jsx(E,{label:"Tracked cost",value:a?W(a.cost):"—",hint:a?e.jsxs("span",{className:"text-[var(--otari-muted)]",children:[e.jsx(T,{fraction:$}),a.unpriced_requests?`${$!==null?" · ":""}${Z(a.unpriced_requests)} unpriced`:null]}):null,chart:X?e.jsx(ae,{values:F.map(s=>s.cost),ariaLabel:"Spend trend over the selected window"}):void 0}),e.jsx(E,{label:"Requests",value:a?Z(a.request_count):"—",hint:a?e.jsxs("span",{className:"text-[var(--otari-muted)]",children:[Be(Te)," errors",u?e.jsxs(e.Fragment,{children:[" · ",e.jsx(T,{fraction:M(a.request_count,u.request_count)})]}):null]}):null,chart:X?e.jsx(ae,{values:F.map(s=>s.requests),ariaLabel:"Request volume trend over the selected window"}):void 0}),e.jsx(E,{label:"Tokens",value:a?B(a.total_tokens):"—",hint:a?e.jsx(T,{fraction:M(a.total_tokens,u==null?void 0:u.total_tokens)}):null,chart:X?e.jsx(ae,{values:F.map(s=>s.tokens),ariaLabel:"Token usage trend over the selected window"}):void 0}),e.jsx(E,{label:"Cache read",value:a?B(a.cache_read_tokens):"—",hint:a?e.jsx(T,{fraction:M(a.cache_read_tokens,u==null?void 0:u.cache_read_tokens)}):null}),e.jsx(E,{label:"Cache write",value:a?B(a.cache_write_tokens):"—",hint:a?e.jsx(T,{fraction:M(a.cache_write_tokens,u==null?void 0:u.cache_write_tokens)}):null}),e.jsx(E,{label:"1h cache write",value:a?B(a.cache_write_1h_tokens??0):"—",hint:a?e.jsx(T,{fraction:M(a.cache_write_1h_tokens??0,(u==null?void 0:u.cache_write_1h_tokens)??0)}):null}),e.jsx(E,{label:"Avg latency",value:a?at(a.avg_latency_ms):"—"})]}),e.jsxs("div",{className:"grid gap-6 lg:grid-cols-2",children:[e.jsx(Se,{title:"Spend by model",rows:(l==null?void 0:l.by_model)??[],totalCost:(a==null?void 0:a.cost)??0,emptyLabel:G?"No usage matches these filters.":"No usage recorded yet.",onDrill:s=>de({model:s,user_id:p||void 0,api_key_id:g||void 0}),loading:b.isLoading}),e.jsx(Se,{title:"Spend by user",rows:(l==null?void 0:l.by_user)??[],totalCost:(a==null?void 0:a.cost)??0,emptyLabel:G?"No usage matches these filters.":"No usage recorded yet.",onDrill:s=>de({user_id:s,model:d.trim()||void 0,api_key_id:g||void 0}),loading:b.isLoading})]}),e.jsx(ht,{filters:k,anyFilter:G}),e.jsxs("div",{className:"flex flex-col gap-3 rounded-xl border border-[var(--otari-line)] bg-[var(--otari-surface)] p-4",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Over time"}),e.jsxs("div",{className:"inline-flex gap-1.5",children:[nt.map(s=>e.jsx(I,{size:"sm",variant:P===s.key?"primary":"outline",onPress:()=>R(s.key),children:s.label},s.key)),b.isFetching?e.jsx(pe,{size:"sm"}):null]})]}),b.isLoading?e.jsx("div",{className:"flex h-48 items-center justify-center",children:e.jsx(pe,{size:"sm"})}):F.length===0?e.jsx("div",{className:"flex h-48 items-center justify-center text-sm text-[var(--otari-muted)]",children:"No data in this range."}):e.jsxs("figure",{className:"flex flex-col gap-2",children:[e.jsx(Xe,{data:ee.points,formatValue:s=>be(s,P),ariaLabel:`${P} per ${S}`}),e.jsxs("figcaption",{className:"text-xs text-[var(--otari-muted)]",children:[be(ee.peak,P)," peak · ",ee.count," ",S==="hour"?"hours":"days"," (times in UTC)"]})]})]})]})]})}export{wt as UsagePage}; diff --git a/src/gateway/static/dashboard/assets/UsersPage-CjqDrVVr.js b/src/gateway/static/dashboard/assets/UsersPage-5kctrw19.js similarity index 98% rename from src/gateway/static/dashboard/assets/UsersPage-CjqDrVVr.js rename to src/gateway/static/dashboard/assets/UsersPage-5kctrw19.js index 3d3a489e..68dd0bbb 100644 --- a/src/gateway/static/dashboard/assets/UsersPage-CjqDrVVr.js +++ b/src/gateway/static/dashboard/assets/UsersPage-5kctrw19.js @@ -1 +1 @@ -import{j as e}from"./tanstack-query-1t81HyiD.js";import{r}from"./react-dgEcD0HR.js";import{u as Q,l as M,p as K,ae as X,P as Y,E as A,q as Z,af as ee,F as se}from"./index-mAhQhUE6.js";import{u as te,r as ae,B as ne}from"./tableSelection-9hV37uhu.js";import{C as re}from"./ConfirmDialog-BZx_uBLn.js";import{D as le}from"./DataTable-Bmn_eYSV.js";import{F as B}from"./Field-Dwp6u3t8.js";import{a as ie,M as R}from"./ModelScopeControl-OSfbanjb.js";import{f as I,B as d,d as S,A as f}from"./heroui-BI50yK5B.js";const de=new Intl.NumberFormat(void 0,{style:"currency",currency:"USD",maximumFractionDigits:4});function U(t){return de.format(t)}const oe=t=>t.user_id,D=t=>t.startsWith("apikey-");function H(t){return t.split("-")[0]}function E(t){return t.name??H(t.budget_id)}function $({value:t,onChange:l,budgets:n}){return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("label",{htmlFor:"user-budget",className:"text-sm font-medium text-[var(--otari-ink)]",children:"Budget"}),e.jsxs("select",{id:"user-budget",value:t??"",onChange:a=>l(a.target.value||null),className:"w-full rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-3 py-2 text-sm text-[var(--otari-ink)]",children:[e.jsx("option",{value:"",children:"No budget (unlimited)"}),n.map(a=>e.jsxs("option",{value:a.budget_id,children:[E(a),a.max_budget===null?" · no limit":` · ${U(a.max_budget)}`]},a.budget_id))]}),e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"The spending limit this user is held to. Manage budgets on the Budgets page."})]})}function ce({onClose:t}){const l=ee(),n=M(),[a,i]=r.useState(""),[o,u]=r.useState(""),[c,g]=r.useState(null),[p,m]=r.useState(null),[b,j]=r.useState(!0),x=()=>{if(l.isPending||!b||a.trim()==="")return;const h={user_id:a.trim(),alias:o.trim()||null,budget_id:c,allowed_models:p};l.mutate(h,{onSuccess:t})};return e.jsx(S,{children:e.jsxs(S.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsx("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Create user"}),e.jsx(A,{error:l.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(B,{label:"User ID",value:a,onChange:i,placeholder:"alice@example.com",isRequired:!0,autoFocus:!0,description:"The identifier callers send as the `user` field; spend and budgets track against it."}),e.jsx(B,{label:"Alias (optional)",value:o,onChange:u,placeholder:"Alice"})]}),e.jsx($,{value:c,onChange:g,budgets:n.data??[]}),e.jsx(R,{title:"Model access (default for this user's keys)",description:"The models this user's keys may list and call by default. A key can narrow this, but never exceed it.",initial:null,onChange:(h,C)=>{m(h),j(C)}}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(d,{variant:"primary",isDisabled:l.isPending||!b||a.trim()==="",onPress:x,children:l.isPending?"Creating…":"Create user"}),e.jsx(d,{variant:"ghost",onPress:t,children:"Cancel"})]})]})})}function ue({user:t,onClose:l}){const n=K(),a=M(),[i,o]=r.useState(t.alias??""),[u,c]=r.useState(t.budget_id),[g,p]=r.useState(t.allowed_models),[m,b]=r.useState(!0),j=()=>{if(n.isPending||!m)return;const x={alias:i.trim()||null,budget_id:u,allowed_models:g};n.mutate({id:t.user_id,body:x},{onSuccess:l})};return e.jsx(S,{children:e.jsxs(S.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsxs("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:["Edit ",e.jsx("code",{children:t.user_id})]}),e.jsx(A,{error:n.error}),e.jsx(B,{label:"Alias",value:i,onChange:o,placeholder:"Alice"}),e.jsx($,{value:u,onChange:c,budgets:a.data??[]}),e.jsx(R,{title:"Model access (default for this user's keys)",description:"The models this user's keys may list and call by default. A key can narrow this, but never exceed it.",initial:t.allowed_models,onChange:(x,h)=>{p(x),b(h)}}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(d,{variant:"primary",isDisabled:n.isPending||!m,onPress:j,children:n.isPending?"Saving…":"Save changes"}),e.jsx(d,{variant:"ghost",onPress:l,children:"Cancel"})]})]})})}function ge({trigger:t,message:l,confirmLabel:n,isPending:a,onConfirm:i}){const[o,u]=r.useState(!1);return o?e.jsxs("div",{className:"flex flex-col items-end gap-1.5 rounded-lg border border-amber-200 bg-amber-50 p-2 text-right",children:[e.jsx("span",{className:"max-w-xs text-xs text-amber-800",children:l}),e.jsxs("span",{className:"inline-flex gap-1",children:[e.jsx(d,{size:"sm",variant:"danger",isDisabled:a,onPress:i,children:n}),e.jsx(d,{size:"sm",variant:"ghost",isDisabled:a,onPress:()=>u(!1),children:"Cancel"})]})]}):e.jsx(d,{size:"sm",variant:"danger-soft",onPress:()=>u(!0),children:t})}function me({user:t}){return t.blocked?e.jsx(I,{size:"sm",color:"warning",children:"Blocked"}):e.jsx(I,{size:"sm",color:"accent",children:"Active"})}function xe({allowed:t}){const{text:l,tone:n}=ie(t),a=n==="danger"?"text-red-700 font-medium":n==="muted"?"text-[var(--otari-muted)]":"text-[var(--otari-brand-dark)] font-medium",i=t&&t.length>0?t.join(", "):void 0;return e.jsx("span",{className:`text-xs ${a}`,title:i,children:l})}function he({isOpen:t,onOpenChange:l,budgets:n,count:a,isPending:i,error:o,onAssign:u}){const[c,g]=r.useState("");return r.useEffect(()=>{t&&g("")},[t]),e.jsx(f,{isOpen:t,onOpenChange:l,children:t?e.jsx(f.Backdrop,{children:e.jsx(f.Container,{placement:"center",size:"md",children:e.jsxs(f.Dialog,{children:[e.jsx(f.Header,{children:e.jsx(f.Heading,{children:"Assign budget"})}),e.jsxs(f.Body,{className:"flex flex-col gap-4",children:[e.jsxs("p",{className:"text-sm text-[var(--otari-muted)]",children:["Assign a budget to ",a," selected ",a===1?"user":"users","."]}),e.jsx(se,{label:"Budget",value:c,onChange:g,options:[{value:"",label:"Select a budget…"},...n.map(p=>({value:p.budget_id,label:E(p)}))]}),e.jsx(A,{error:o})]}),e.jsxs(f.Footer,{children:[e.jsx(d,{variant:"ghost",isDisabled:i,onPress:()=>l(!1),children:"Cancel"}),e.jsx(d,{variant:"primary",isDisabled:!c,isPending:i,onPress:()=>u(c),children:"Assign"})]})]})})}):null})}function Ae(){const t=Q(),l=M(),n=K(),a=X(),[i,o]=r.useState(!1),[u,c]=r.useState(null),[g,p]=r.useState(!1),m=t.data??[],b=t.isLoading,j=m.filter(s=>D(s.user_id)).length,x=g?m:m.filter(s=>!D(s.user_id)),h=m.find(s=>s.user_id===u)??null,C=!b&&x.length===0&&!i,P=r.useMemo(()=>new Map((l.data??[]).map(s=>[s.budget_id,s])),[l.data]),y=te(),[q,_]=r.useState(!1),[W,N]=r.useState(!1),[F,z]=r.useState(void 0),[T,L]=r.useState(!1),G=x.map(s=>s.user_id),v=ae(y.selectedKeys,G),O=r.useCallback((s,k)=>n.mutate({id:s.user_id,body:{blocked:k}}),[n.mutate]),V=async(s,k)=>{L(!0),z(void 0);try{for(const w of v)await s(w);y.clear(),k()}catch(w){z(w)}finally{L(!1)}},J=r.useMemo(()=>[{id:"user",header:"User",isRowHeader:!0,cell:s=>e.jsxs("div",{className:"flex flex-col gap-0.5",children:[e.jsxs("span",{className:"inline-flex items-center gap-1.5",children:[e.jsx("code",{className:"text-xs font-medium text-[var(--otari-ink)]",children:s.user_id}),D(s.user_id)?e.jsx(I,{size:"sm",color:"default",children:"virtual"}):null]}),s.alias?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:s.alias}):null]})},{id:"status",header:"Status",cell:s=>e.jsx(me,{user:s})},{id:"budget",header:"Budget",cell:s=>s.budget_id?e.jsx("span",{className:"text-[var(--otari-muted)]",title:s.budget_id,children:P.get(s.budget_id)?E(P.get(s.budget_id)):H(s.budget_id)}):e.jsx("span",{className:"text-[var(--otari-muted)]",children:"—"})},{id:"spend",header:"Spend",cell:s=>e.jsxs("span",{className:"text-[var(--otari-muted)]",children:[U(s.spend),s.reserved>0?e.jsxs("span",{children:[" (+",U(s.reserved)," held)"]}):null]})},{id:"access",header:"Model access",cell:s=>e.jsx(xe,{allowed:s.allowed_models})},{id:"actions",header:"Actions",align:"end",cell:s=>e.jsxs("div",{className:"flex items-center justify-end gap-1.5",children:[e.jsx(d,{size:"sm",variant:"outline",isDisabled:n.isPending,onPress:()=>O(s,!s.blocked),children:s.blocked?"Unblock":"Block"}),e.jsx(d,{size:"sm",variant:"ghost",onPress:()=>{o(!1),c(s.user_id)},children:"Edit"}),e.jsx(ge,{trigger:"Delete",confirmLabel:"Delete user",isPending:a.isPending,message:e.jsxs(e.Fragment,{children:["Delete ",e.jsx("strong",{children:s.user_id}),"? This deactivates its API keys and hides the user; usage history is preserved."]}),onConfirm:()=>a.mutate(s.user_id)})]})}],[P,n.isPending,a.isPending,a.mutate,O]);return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(Y,{title:"Users",description:"People and teams that own API keys. Set each one's budget and default model access here; issue their keys on the API keys page.",action:i?null:e.jsx(d,{variant:"primary",onPress:()=>{c(null),o(!0)},children:"Create user"})}),e.jsx(A,{error:t.error??n.error??a.error}),C?e.jsx(Z,{title:"No users yet",description:"A user owns API keys and carries the budget and default model access those keys inherit. Create a user here, then issue its keys on the API keys page.",actionLabel:"Create your first user",onAction:()=>{c(null),o(!0)}}):null,j>0?e.jsxs("label",{className:"flex w-fit items-center gap-2 text-xs text-[var(--otari-muted)]",children:[e.jsx("input",{type:"checkbox",checked:g,onChange:s=>p(s.target.checked)}),"Show auto-created (virtual) users (",j,")"]}):null,i?e.jsx(ce,{onClose:()=>o(!1)}):null,h?e.jsx(ue,{user:h,onClose:()=>c(null)},h.user_id):null,v.length>0?e.jsxs(ne,{selectedCount:v.length,allMatching:!1,matchingTotal:null,canSelectAllMatching:!1,onSelectAllMatching:()=>{},onClear:y.clear,children:[e.jsx(d,{size:"sm",variant:"primary",onPress:()=>N(!0),children:"Assign budget"}),e.jsx(d,{size:"sm",variant:"danger",onPress:()=>_(!0),children:"Delete"})]}):null,C?null:e.jsx(le,{ariaLabel:"Users",columns:J,rows:x,getRowKey:oe,isLoading:b,emptyContent:"No users yet. Create one, or create an API key to auto-create one.",selectionMode:"multiple",selectedKeys:y.selectedKeys,onSelectionChange:y.onSelectionChange}),e.jsx(re,{isOpen:q,onOpenChange:_,heading:"Delete users",body:`Delete ${v.length} ${v.length===1?"user":"users"}? This deactivates their API keys and hides them; usage history is preserved.`,confirmLabel:"Delete",isPending:T,error:F,onConfirm:()=>V(s=>a.mutateAsync(s),()=>_(!1))}),e.jsx(he,{isOpen:W,onOpenChange:N,budgets:l.data??[],count:v.length,isPending:T,error:F,onAssign:s=>V(k=>n.mutateAsync({id:k,body:{budget_id:s}}),()=>N(!1))})]})}export{Ae as UsersPage}; +import{j as e}from"./tanstack-query-1t81HyiD.js";import{r}from"./react-dgEcD0HR.js";import{u as Q,l as M,p as K,ae as X,P as Y,E as A,q as Z,af as ee,F as se}from"./index-DV8qvdUj.js";import{u as te,r as ae,B as ne}from"./tableSelection-9hV37uhu.js";import{C as re}from"./ConfirmDialog-KvA7b1-a.js";import{D as le}from"./DataTable-Bmn_eYSV.js";import{F as B}from"./Field-Dwp6u3t8.js";import{a as ie,M as R}from"./ModelScopeControl-u-XlXgXz.js";import{f as I,B as d,d as S,A as f}from"./heroui-BI50yK5B.js";const de=new Intl.NumberFormat(void 0,{style:"currency",currency:"USD",maximumFractionDigits:4});function U(t){return de.format(t)}const oe=t=>t.user_id,D=t=>t.startsWith("apikey-");function H(t){return t.split("-")[0]}function E(t){return t.name??H(t.budget_id)}function $({value:t,onChange:l,budgets:n}){return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("label",{htmlFor:"user-budget",className:"text-sm font-medium text-[var(--otari-ink)]",children:"Budget"}),e.jsxs("select",{id:"user-budget",value:t??"",onChange:a=>l(a.target.value||null),className:"w-full rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-3 py-2 text-sm text-[var(--otari-ink)]",children:[e.jsx("option",{value:"",children:"No budget (unlimited)"}),n.map(a=>e.jsxs("option",{value:a.budget_id,children:[E(a),a.max_budget===null?" · no limit":` · ${U(a.max_budget)}`]},a.budget_id))]}),e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:"The spending limit this user is held to. Manage budgets on the Budgets page."})]})}function ce({onClose:t}){const l=ee(),n=M(),[a,i]=r.useState(""),[o,u]=r.useState(""),[c,g]=r.useState(null),[p,m]=r.useState(null),[b,j]=r.useState(!0),x=()=>{if(l.isPending||!b||a.trim()==="")return;const h={user_id:a.trim(),alias:o.trim()||null,budget_id:c,allowed_models:p};l.mutate(h,{onSuccess:t})};return e.jsx(S,{children:e.jsxs(S.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsx("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:"Create user"}),e.jsx(A,{error:l.error}),e.jsxs("div",{className:"grid gap-4 sm:grid-cols-2",children:[e.jsx(B,{label:"User ID",value:a,onChange:i,placeholder:"alice@example.com",isRequired:!0,autoFocus:!0,description:"The identifier callers send as the `user` field; spend and budgets track against it."}),e.jsx(B,{label:"Alias (optional)",value:o,onChange:u,placeholder:"Alice"})]}),e.jsx($,{value:c,onChange:g,budgets:n.data??[]}),e.jsx(R,{title:"Model access (default for this user's keys)",description:"The models this user's keys may list and call by default. A key can narrow this, but never exceed it.",initial:null,onChange:(h,C)=>{m(h),j(C)}}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(d,{variant:"primary",isDisabled:l.isPending||!b||a.trim()==="",onPress:x,children:l.isPending?"Creating…":"Create user"}),e.jsx(d,{variant:"ghost",onPress:t,children:"Cancel"})]})]})})}function ue({user:t,onClose:l}){const n=K(),a=M(),[i,o]=r.useState(t.alias??""),[u,c]=r.useState(t.budget_id),[g,p]=r.useState(t.allowed_models),[m,b]=r.useState(!0),j=()=>{if(n.isPending||!m)return;const x={alias:i.trim()||null,budget_id:u,allowed_models:g};n.mutate({id:t.user_id,body:x},{onSuccess:l})};return e.jsx(S,{children:e.jsxs(S.Content,{className:"flex flex-col gap-4 p-5",children:[e.jsxs("div",{className:"text-sm font-semibold text-[var(--otari-ink)]",children:["Edit ",e.jsx("code",{children:t.user_id})]}),e.jsx(A,{error:n.error}),e.jsx(B,{label:"Alias",value:i,onChange:o,placeholder:"Alice"}),e.jsx($,{value:u,onChange:c,budgets:a.data??[]}),e.jsx(R,{title:"Model access (default for this user's keys)",description:"The models this user's keys may list and call by default. A key can narrow this, but never exceed it.",initial:t.allowed_models,onChange:(x,h)=>{p(x),b(h)}}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(d,{variant:"primary",isDisabled:n.isPending||!m,onPress:j,children:n.isPending?"Saving…":"Save changes"}),e.jsx(d,{variant:"ghost",onPress:l,children:"Cancel"})]})]})})}function ge({trigger:t,message:l,confirmLabel:n,isPending:a,onConfirm:i}){const[o,u]=r.useState(!1);return o?e.jsxs("div",{className:"flex flex-col items-end gap-1.5 rounded-lg border border-amber-200 bg-amber-50 p-2 text-right",children:[e.jsx("span",{className:"max-w-xs text-xs text-amber-800",children:l}),e.jsxs("span",{className:"inline-flex gap-1",children:[e.jsx(d,{size:"sm",variant:"danger",isDisabled:a,onPress:i,children:n}),e.jsx(d,{size:"sm",variant:"ghost",isDisabled:a,onPress:()=>u(!1),children:"Cancel"})]})]}):e.jsx(d,{size:"sm",variant:"danger-soft",onPress:()=>u(!0),children:t})}function me({user:t}){return t.blocked?e.jsx(I,{size:"sm",color:"warning",children:"Blocked"}):e.jsx(I,{size:"sm",color:"accent",children:"Active"})}function xe({allowed:t}){const{text:l,tone:n}=ie(t),a=n==="danger"?"text-red-700 font-medium":n==="muted"?"text-[var(--otari-muted)]":"text-[var(--otari-brand-dark)] font-medium",i=t&&t.length>0?t.join(", "):void 0;return e.jsx("span",{className:`text-xs ${a}`,title:i,children:l})}function he({isOpen:t,onOpenChange:l,budgets:n,count:a,isPending:i,error:o,onAssign:u}){const[c,g]=r.useState("");return r.useEffect(()=>{t&&g("")},[t]),e.jsx(f,{isOpen:t,onOpenChange:l,children:t?e.jsx(f.Backdrop,{children:e.jsx(f.Container,{placement:"center",size:"md",children:e.jsxs(f.Dialog,{children:[e.jsx(f.Header,{children:e.jsx(f.Heading,{children:"Assign budget"})}),e.jsxs(f.Body,{className:"flex flex-col gap-4",children:[e.jsxs("p",{className:"text-sm text-[var(--otari-muted)]",children:["Assign a budget to ",a," selected ",a===1?"user":"users","."]}),e.jsx(se,{label:"Budget",value:c,onChange:g,options:[{value:"",label:"Select a budget…"},...n.map(p=>({value:p.budget_id,label:E(p)}))]}),e.jsx(A,{error:o})]}),e.jsxs(f.Footer,{children:[e.jsx(d,{variant:"ghost",isDisabled:i,onPress:()=>l(!1),children:"Cancel"}),e.jsx(d,{variant:"primary",isDisabled:!c,isPending:i,onPress:()=>u(c),children:"Assign"})]})]})})}):null})}function Ae(){const t=Q(),l=M(),n=K(),a=X(),[i,o]=r.useState(!1),[u,c]=r.useState(null),[g,p]=r.useState(!1),m=t.data??[],b=t.isLoading,j=m.filter(s=>D(s.user_id)).length,x=g?m:m.filter(s=>!D(s.user_id)),h=m.find(s=>s.user_id===u)??null,C=!b&&x.length===0&&!i,P=r.useMemo(()=>new Map((l.data??[]).map(s=>[s.budget_id,s])),[l.data]),y=te(),[q,_]=r.useState(!1),[W,N]=r.useState(!1),[F,z]=r.useState(void 0),[T,L]=r.useState(!1),G=x.map(s=>s.user_id),v=ae(y.selectedKeys,G),O=r.useCallback((s,k)=>n.mutate({id:s.user_id,body:{blocked:k}}),[n.mutate]),V=async(s,k)=>{L(!0),z(void 0);try{for(const w of v)await s(w);y.clear(),k()}catch(w){z(w)}finally{L(!1)}},J=r.useMemo(()=>[{id:"user",header:"User",isRowHeader:!0,cell:s=>e.jsxs("div",{className:"flex flex-col gap-0.5",children:[e.jsxs("span",{className:"inline-flex items-center gap-1.5",children:[e.jsx("code",{className:"text-xs font-medium text-[var(--otari-ink)]",children:s.user_id}),D(s.user_id)?e.jsx(I,{size:"sm",color:"default",children:"virtual"}):null]}),s.alias?e.jsx("span",{className:"text-xs text-[var(--otari-muted)]",children:s.alias}):null]})},{id:"status",header:"Status",cell:s=>e.jsx(me,{user:s})},{id:"budget",header:"Budget",cell:s=>s.budget_id?e.jsx("span",{className:"text-[var(--otari-muted)]",title:s.budget_id,children:P.get(s.budget_id)?E(P.get(s.budget_id)):H(s.budget_id)}):e.jsx("span",{className:"text-[var(--otari-muted)]",children:"—"})},{id:"spend",header:"Spend",cell:s=>e.jsxs("span",{className:"text-[var(--otari-muted)]",children:[U(s.spend),s.reserved>0?e.jsxs("span",{children:[" (+",U(s.reserved)," held)"]}):null]})},{id:"access",header:"Model access",cell:s=>e.jsx(xe,{allowed:s.allowed_models})},{id:"actions",header:"Actions",align:"end",cell:s=>e.jsxs("div",{className:"flex items-center justify-end gap-1.5",children:[e.jsx(d,{size:"sm",variant:"outline",isDisabled:n.isPending,onPress:()=>O(s,!s.blocked),children:s.blocked?"Unblock":"Block"}),e.jsx(d,{size:"sm",variant:"ghost",onPress:()=>{o(!1),c(s.user_id)},children:"Edit"}),e.jsx(ge,{trigger:"Delete",confirmLabel:"Delete user",isPending:a.isPending,message:e.jsxs(e.Fragment,{children:["Delete ",e.jsx("strong",{children:s.user_id}),"? This deactivates its API keys and hides the user; usage history is preserved."]}),onConfirm:()=>a.mutate(s.user_id)})]})}],[P,n.isPending,a.isPending,a.mutate,O]);return e.jsxs("div",{className:"flex flex-col gap-6",children:[e.jsx(Y,{title:"Users",description:"People and teams that own API keys. Set each one's budget and default model access here; issue their keys on the API keys page.",action:i?null:e.jsx(d,{variant:"primary",onPress:()=>{c(null),o(!0)},children:"Create user"})}),e.jsx(A,{error:t.error??n.error??a.error}),C?e.jsx(Z,{title:"No users yet",description:"A user owns API keys and carries the budget and default model access those keys inherit. Create a user here, then issue its keys on the API keys page.",actionLabel:"Create your first user",onAction:()=>{c(null),o(!0)}}):null,j>0?e.jsxs("label",{className:"flex w-fit items-center gap-2 text-xs text-[var(--otari-muted)]",children:[e.jsx("input",{type:"checkbox",checked:g,onChange:s=>p(s.target.checked)}),"Show auto-created (virtual) users (",j,")"]}):null,i?e.jsx(ce,{onClose:()=>o(!1)}):null,h?e.jsx(ue,{user:h,onClose:()=>c(null)},h.user_id):null,v.length>0?e.jsxs(ne,{selectedCount:v.length,allMatching:!1,matchingTotal:null,canSelectAllMatching:!1,onSelectAllMatching:()=>{},onClear:y.clear,children:[e.jsx(d,{size:"sm",variant:"primary",onPress:()=>N(!0),children:"Assign budget"}),e.jsx(d,{size:"sm",variant:"danger",onPress:()=>_(!0),children:"Delete"})]}):null,C?null:e.jsx(le,{ariaLabel:"Users",columns:J,rows:x,getRowKey:oe,isLoading:b,emptyContent:"No users yet. Create one, or create an API key to auto-create one.",selectionMode:"multiple",selectedKeys:y.selectedKeys,onSelectionChange:y.onSelectionChange}),e.jsx(re,{isOpen:q,onOpenChange:_,heading:"Delete users",body:`Delete ${v.length} ${v.length===1?"user":"users"}? This deactivates their API keys and hides them; usage history is preserved.`,confirmLabel:"Delete",isPending:T,error:F,onConfirm:()=>V(s=>a.mutateAsync(s),()=>_(!1))}),e.jsx(he,{isOpen:W,onOpenChange:N,budgets:l.data??[],count:v.length,isPending:T,error:F,onAssign:s=>V(k=>n.mutateAsync({id:k,body:{budget_id:s}}),()=>N(!1))})]})}export{Ae as UsersPage}; diff --git a/src/gateway/static/dashboard/assets/index-mAhQhUE6.js b/src/gateway/static/dashboard/assets/index-DV8qvdUj.js similarity index 96% rename from src/gateway/static/dashboard/assets/index-mAhQhUE6.js rename to src/gateway/static/dashboard/assets/index-DV8qvdUj.js index b1b7421a..b9e0db48 100644 --- a/src/gateway/static/dashboard/assets/index-mAhQhUE6.js +++ b/src/gateway/static/dashboard/assets/index-DV8qvdUj.js @@ -1,2 +1,2 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ActivityPage-CD1bI8e0.js","assets/tanstack-query-1t81HyiD.js","assets/react-dgEcD0HR.js","assets/FilterChips-DZjxf-ot.js","assets/heroui-BI50yK5B.js","assets/recharts-C4kRDmvS.js","assets/tableSelection-9hV37uhu.js","assets/ConfirmDialog-BZx_uBLn.js","assets/DataTable-Bmn_eYSV.js","assets/TablePagination-SF1u0DDk.js","assets/AliasesPage-DOW9Z9Aj.js","assets/Field-Dwp6u3t8.js","assets/BudgetsPage-BJR_ZONo.js","assets/DocsPage-iVP3WPzU.js","assets/KeysPage-ChiGoU_A.js","assets/ModelScopeControl-OSfbanjb.js","assets/ModelsPage-CRpsI3fJ.js","assets/OverviewPage-D51QWvyh.js","assets/charts-DIsd9m--.js","assets/ProvidersPage-DBjl1bc3.js","assets/SettingsPage-BFxhhnZx.js","assets/ToolsGuardrailsPage-517a2mDO.js","assets/UsagePage-D0tp6Db_.js","assets/UsersPage-CjqDrVVr.js"])))=>i.map(i=>d[i]); -var Le=Object.defineProperty;var Ie=(e,r,n)=>r in e?Le(e,r,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[r]=n;var ie=(e,r,n)=>Ie(e,typeof r!="symbol"?r+"":r,n);import{u as y,j as t,a as g,b as h,k as X,Q as Ae,c as qe}from"./tanstack-query-1t81HyiD.js";import{d as Re,r as a,N as G,O as De,H as Oe,e as Me,f as w,h as Fe}from"./react-dgEcD0HR.js";import{B as C,C as M,L as me,I as fe,a as Ue,b as Ke,d as I,S as Be,c as _,T as ze,e as $e}from"./heroui-BI50yK5B.js";(function(){const r=document.createElement("link").relList;if(r&&r.supports&&r.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))s(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const d of o.addedNodes)d.tagName==="LINK"&&d.rel==="modulepreload"&&s(d)}).observe(document,{childList:!0,subtree:!0});function n(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function s(i){if(i.ep)return;i.ep=!0;const o=n(i);fetch(i.href,o)}})();var Qe=Re();const Ve="modulepreload",We=function(e){return"/"+e},oe={},P=function(r,n,s){let i=Promise.resolve();if(n&&n.length>0){let d=function(x){return Promise.all(x.map(f=>Promise.resolve(f).then(b=>({status:"fulfilled",value:b}),b=>({status:"rejected",reason:b}))))};document.getElementsByTagName("link");const m=document.querySelector("meta[property=csp-nonce]"),p=(m==null?void 0:m.nonce)||(m==null?void 0:m.getAttribute("nonce"));i=d(n.map(x=>{if(x=We(x),x in oe)return;oe[x]=!0;const f=x.endsWith(".css"),b=f?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${x}"]${b}`))return;const u=document.createElement("link");if(u.rel=f?"stylesheet":Ve,f||(u.as="script"),u.crossOrigin="",u.href=x,p&&u.setAttribute("nonce",p),document.head.appendChild(u),f)return new Promise((N,R)=>{u.addEventListener("load",N),u.addEventListener("error",()=>R(new Error(`Unable to preload CSS for ${x}`)))})}))}function o(d){const m=new Event("vite:preloadError",{cancelable:!0});if(m.payload=d,window.dispatchEvent(m),!m.defaultPrevented)throw d}return i.then(d=>{for(const m of d||[])m.status==="rejected"&&o(m.reason);return r().catch(o)})};class T extends Error{constructor(n,s){super(s);ie(this,"status");this.name="ApiError",this.status=n}}let F=null;function le(e){F=e}async function J(e){try{const r=await e.json();if(typeof r.detail=="string")return r.detail;if(r.detail!=null)return JSON.stringify(r.detail)}catch{}return e.statusText||`Request failed (${e.status})`}async function He(e){let r;try{r=await fetch("/v1/auth/session",{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({master_key:e})})}catch{throw new T(0,"Network error: could not reach the gateway.")}if(r.status===401||r.status===403)return!1;if(!r.ok)throw new T(r.status,await J(r));return!0}async function Ge(){try{await fetch("/v1/auth/session",{method:"DELETE"})}catch{}}async function c(e,r={}){const n=new Headers(r.headers);n.set("Accept","application/json"),r.body!=null&&!n.has("Content-Type")&&n.set("Content-Type","application/json");let s;try{s=await fetch(e,{...r,headers:n})}catch{throw new T(0,"Network error: could not reach the gateway.")}if(s.status===401||s.status===403)throw F==null||F(),new T(s.status,await J(s));if(!s.ok)throw new T(s.status,await J(s));if(s.status!==204)return await s.json()}const Y="otari.dashboard.hasSession",he=a.createContext(null);function Je(){try{return window.localStorage.getItem(Y)==="1"}catch{return!1}}function Ye({children:e}){const r=y(),[n,s]=a.useState(Je),i=a.useCallback(()=>{Ge(),s(!1),r.clear();try{window.localStorage.removeItem(Y)}catch{}},[r]),o=a.useCallback(()=>{r.clear(),s(!0);try{window.localStorage.setItem(Y,"1")}catch{}},[r]);a.useEffect(()=>(le(i),()=>le(null)),[i]);const d=a.useMemo(()=>({isAuthenticated:n,login:o,logout:i}),[n,o,i]);return t.jsx(he.Provider,{value:d,children:e})}function Z(){const e=a.useContext(he);if(!e)throw new Error("useAuth must be used within an AuthProvider");return e}function Xe(e){return e instanceof T&&e.status===0}function Ze(){const e=y(),[r,n]=a.useState(!1);return a.useEffect(()=>{const s=e.getQueryCache(),i=()=>s.getAll().some(o=>o.state.status==="error"&&Xe(o.state.error));return n(i()),s.subscribe(()=>n(i()))},[e]),r}function et(){return Ze()?t.jsxs("div",{role:"alert","aria-live":"assertive",className:"fixed right-4 bottom-4 z-50 flex max-w-sm items-start gap-2.5 rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700 shadow-lg",children:[t.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2","aria-hidden":!0,className:"mt-0.5 h-5 w-5 shrink-0",children:[t.jsx("path",{d:"M12 9v4M12 17h.01",strokeLinecap:"round",strokeLinejoin:"round"}),t.jsx("path",{d:"M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0z",strokeLinejoin:"round"})]}),t.jsxs("span",{children:[t.jsx("strong",{className:"font-semibold",children:"Can’t reach the gateway."})," The backend isn’t responding; data won’t load or save until the connection is restored."]})]}):null}const L="models",K="pricing",xe="settings",ve="tool-settings",ee="aliases",te="discoverable",re="providers",ne="provider-health",ye="stored-providers",tt="model-metadata",rt="build",A="keys",q="budgets",pe="users",O="usage",nt=6e4,ce=60*6e4;function tr(){return g({queryKey:[L],queryFn:()=>c("/v1/models"),staleTime:6e4})}function st(){return g({queryKey:[rt],queryFn:()=>c("/dashboard-build.json"),refetchInterval:nt,refetchOnWindowFocus:!0,staleTime:0,retry:!1})}function rr(){return g({queryKey:[te],queryFn:()=>c("/v1/models/discoverable"),staleTime:5*6e4})}function nr(){return g({queryKey:[re],queryFn:()=>c("/v1/providers"),staleTime:5*6e4})}function sr(){return g({queryKey:["provider-catalog"],queryFn:()=>c("/v1/providers/catalog"),staleTime:1/0})}function ar(e){return g({queryKey:["provider-catalog",e],queryFn:()=>c(`/v1/providers/catalog/${encodeURIComponent(e)}`),enabled:e!=="",staleTime:1/0})}function ir(){return g({queryKey:[ne],queryFn:()=>c("/v1/providers/health"),staleTime:ce,refetchInterval:ce})}function or(){const e=y();return h({mutationFn:()=>c("/v1/providers/health?refresh=true"),onSuccess:r=>e.setQueryData([ne],r)})}function lr(){return g({queryKey:[ye],queryFn:()=>c("/v1/provider-credentials"),staleTime:6e4})}function B(e){e.invalidateQueries({queryKey:[ye]}),e.invalidateQueries({queryKey:[re]}),e.invalidateQueries({queryKey:[L]}),e.invalidateQueries({queryKey:[te]}),e.invalidateQueries({queryKey:[ne]})}function cr(){const e=y();return h({mutationFn:r=>c("/v1/provider-credentials",{method:"POST",body:JSON.stringify(r)}),onSuccess:()=>B(e)})}function ur(){const e=y();return h({mutationFn:({instance:r,body:n})=>c(`/v1/provider-credentials/${encodeURIComponent(r)}`,{method:"PATCH",body:JSON.stringify(n)}),onSuccess:()=>B(e)})}function dr(){const e=y();return h({mutationFn:r=>c(`/v1/provider-credentials/${encodeURIComponent(r)}`,{method:"DELETE"}),onSuccess:()=>B(e)})}function mr(){const e=y();return h({mutationFn:()=>c("/v1/provider-credentials/reencrypt",{method:"POST"}),onSuccess:()=>B(e)})}function fr(){return h({mutationFn:e=>c(`/v1/provider-credentials/${encodeURIComponent(e)}/test`,{method:"POST"})})}function hr(){return h({mutationFn:e=>c("/v1/provider-credentials/test",{method:"POST",body:JSON.stringify(e)})})}function xr(){return g({queryKey:[tt],queryFn:()=>c("/v1/models/metadata"),staleTime:10*6e4})}function vr(){return g({queryKey:[ee],queryFn:()=>c("/v1/aliases"),staleTime:6e4})}function yr(){const e=y();return h({mutationFn:r=>c("/v1/aliases",{method:"POST",body:JSON.stringify(r)}),onSuccess:()=>{e.invalidateQueries({queryKey:[ee]}),e.invalidateQueries({queryKey:[L]})}})}function pr(){const e=y();return h({mutationFn:r=>c(`/v1/aliases/${encodeURIComponent(r)}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:[ee]}),e.invalidateQueries({queryKey:[L]})}})}function at(){return g({queryKey:[xe],queryFn:()=>c("/v1/settings"),staleTime:6e4})}function it(){const e=y();return h({mutationFn:r=>c("/v1/settings",{method:"PATCH",body:JSON.stringify(r)}),onSuccess:r=>{e.setQueryData([xe],r),e.invalidateQueries({queryKey:[L]}),e.invalidateQueries({queryKey:[te]})}})}function gr(){return h({mutationFn:()=>c("/v1/settings/master-key/rotate",{method:"POST"})})}function br(){return g({queryKey:[ve],queryFn:()=>c("/v1/tool-settings"),staleTime:6e4})}function jr(){const e=y();return h({mutationFn:r=>c("/v1/tool-settings",{method:"PATCH",body:JSON.stringify(r)}),onSuccess:r=>{e.setQueryData([ve],r)}})}function wr(){return h({mutationFn:({service:e,url:r})=>c(`/v1/tool-settings/${encodeURIComponent(e)}/test`,{method:"POST",body:JSON.stringify({url:r})})})}const $=1e3,ot=100;async function lt(){const e=[];for(let r=0;rc("/v1/pricing",{method:"POST",body:JSON.stringify(r)}),onSuccess:()=>{e.invalidateQueries({queryKey:[K]}),e.invalidateQueries({queryKey:[L]})}})}function Er(){const e=y();return h({mutationFn:r=>c(`/v1/pricing/${encodeURIComponent(r)}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:[K]}),e.invalidateQueries({queryKey:[L]})}})}function Pr(){return h({mutationFn:()=>c("/v1/pricing/refresh",{method:"POST"})})}function Nr(){const e=y();return h({mutationFn:()=>c("/v1/pricing/refresh/confirm",{method:"POST"}),onSuccess:()=>{e.invalidateQueries({queryKey:[K]}),e.invalidateQueries({queryKey:[L]}),e.invalidateQueries({queryKey:[re]})}})}function Cr(){return h({mutationFn:()=>c("/v1/pricing/refresh/reject",{method:"POST"})})}const Q=1e3,ct=100;async function ut(){const e=[];for(let r=0;rc("/v1/keys",{method:"POST",body:JSON.stringify(r)}),onSuccess:()=>void e.invalidateQueries({queryKey:[A]})})}function Lr(){const e=y();return h({mutationFn:({id:r,body:n})=>c(`/v1/keys/${encodeURIComponent(r)}`,{method:"PATCH",body:JSON.stringify(n)}),onSuccess:()=>void e.invalidateQueries({queryKey:[A]})})}function Ir(){const e=y();return h({mutationFn:r=>c(`/v1/keys/${encodeURIComponent(r)}/rotate`,{method:"POST"}),onSuccess:()=>void e.invalidateQueries({queryKey:[A]})})}function Ar(){const e=y();return h({mutationFn:r=>c(`/v1/keys/${encodeURIComponent(r)}`,{method:"DELETE"}),onSuccess:()=>void e.invalidateQueries({queryKey:[A]})})}const V=1e3,dt=100;async function mt(){const e=[];for(let r=0;rc(`/v1/budgets/${encodeURIComponent(e)}/reset-logs`),enabled:e!==null,staleTime:6e4})}function Dr(){const e=y();return h({mutationFn:r=>c("/v1/budgets",{method:"POST",body:JSON.stringify(r)}),onSuccess:()=>void e.invalidateQueries({queryKey:[q]})})}function Or(){const e=y();return h({mutationFn:({id:r,body:n})=>c(`/v1/budgets/${encodeURIComponent(r)}`,{method:"PATCH",body:JSON.stringify(n)}),onSuccess:()=>void e.invalidateQueries({queryKey:[q]})})}function Mr(){const e=y();return h({mutationFn:r=>c(`/v1/budgets/${encodeURIComponent(r)}`,{method:"DELETE"}),onSuccess:()=>void e.invalidateQueries({queryKey:[q]})})}const W=1e3,ft=100;async function ht(){const e=[];for(let r=0;rc("/v1/users",{method:"POST",body:JSON.stringify(r)}),onSuccess:()=>se(e)})}function Kr(){const e=y();return h({mutationFn:({id:r,body:n})=>c(`/v1/users/${encodeURIComponent(r)}`,{method:"PATCH",body:JSON.stringify(n)}),onSuccess:()=>se(e)})}function Br(){const e=y();return h({mutationFn:r=>c(`/v1/users/${encodeURIComponent(r)}`,{method:"DELETE"}),onSuccess:()=>{se(e),e.invalidateQueries({queryKey:[A]})}})}function ae(e){const r=new URLSearchParams;return e.start_date&&r.set("start_date",e.start_date),e.end_date&&r.set("end_date",e.end_date),e.status&&r.set("status",e.status),e.model&&r.set("model",e.model),e.endpoint&&r.set("endpoint",e.endpoint),e.user_id&&r.set("user_id",e.user_id),e.api_key_id&&r.set("api_key_id",e.api_key_id),e.source&&r.set("source",e.source),e.priced!==void 0&&r.set("priced",String(e.priced)),e.counts_toward_budget!==void 0&&r.set("counts_toward_budget",String(e.counts_toward_budget)),r}function zr(e,r,n){return g({queryKey:[O,"list",e,r,n],queryFn:()=>{const s=ae(e);return s.set("skip",String(r*n)),s.set("limit",String(n)),c(`/v1/usage?${s.toString()}`)},placeholderData:X,staleTime:1e4})}function $r(e,r=!0){return g({queryKey:[O,"count",e],queryFn:()=>c(`/v1/usage/count?${ae(e).toString()}`),enabled:r,placeholderData:X,staleTime:1e4})}function Qr(){const e=y();return h({mutationFn:r=>c("/v1/usage",{method:"DELETE",body:JSON.stringify(r)}),onSuccess:()=>{e.invalidateQueries({queryKey:[O]})}})}function Vr(){const e=y();return h({mutationFn:r=>c("/v1/usage/set-price",{method:"POST",body:JSON.stringify(r)}),onSuccess:()=>{e.invalidateQueries({queryKey:[O]})}})}function Wr(e,r,n=!0){return g({queryKey:[O,"summary",e,r],queryFn:()=>{const s=ae(e);return s.set("bucket",r),c(`/v1/usage/summary?${s.toString()}`)},enabled:n,placeholderData:X,staleTime:3e4})}function Hr(e){return e==null?"0":new Intl.NumberFormat("en-US").format(e)}function Gr(e){if(e==null)return"$0.00";const r=e!==0&&Math.abs(e)<.01?4:2;return new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",minimumFractionDigits:2,maximumFractionDigits:r}).format(e)}function Jr(e){if(e==null)return"—";if(e>=1e6){const r=e/1e6;return`${Number.isInteger(r)?r:r.toFixed(1)}M`}if(e>=1e3){const r=Math.round(e/1e3);return r>=1e3?"1M":`${r}K`}return String(e)}const xt=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function Yr(e){if(!e)return"—";const r=/^(\d{4})-(\d{2})/.exec(e);if(!r)return e;const n=Number(r[2])-1;return n<0||n>11?r[1]:`${xt[n]} ${r[1]}`}const vt=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",maximumFractionDigits:2});function Xr(e){return vt.format(e)}function Zr(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function yt(e){return`${(e*100).toFixed(1)}%`}function en(e,r){return r===void 0||r===0?null:(e-r)/r}function pt(e,r=Date.now()){if(!e)return"never";const n=new Date(e);if(Number.isNaN(n.getTime()))return e;const s=Math.round((r-n.getTime())/1e3),i=s<0,o=Math.abs(s),d=[["second",60],["minute",60],["hour",24],["day",30],["month",12],["year",Number.POSITIVE_INFINITY]];let m=o,p="second";for(const[f,b]of d){if(p=f,m0?"▲":e<0?"▼":"•";return t.jsxs("span",{className:"text-[var(--otari-muted)]",children:[r," ",yt(Math.abs(e))," vs prev"]})}function gt(e){return e instanceof T||e instanceof Error?e.message:"Something went wrong."}function bt({error:e}){return e?t.jsx("div",{role:"alert",className:"rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700",children:gt(e)}):null}function jt({tone:e="info",children:r}){const n=e==="warning"?"border-amber-200 bg-amber-50 text-amber-800":"border-[var(--otari-brand)] bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]";return t.jsx("div",{className:`rounded-lg border px-4 py-3 text-sm ${n}`,children:r})}function nn({title:e,description:r,action:n}){return t.jsxs("div",{className:"flex flex-col gap-3",children:[t.jsxs("div",{children:[t.jsx("h1",{className:"text-xl font-semibold text-[var(--otari-ink)]",children:e}),r?t.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:r}):null]}),n?t.jsx("div",{className:"flex flex-wrap gap-2",children:n}):null]})}function wt(e){const[r,n]=a.useState(()=>Date.now());return a.useEffect(()=>{let s;const i=()=>{s===void 0&&(s=setInterval(()=>n(Date.now()),e))},o=()=>{s!==void 0&&(clearInterval(s),s=void 0)},d=()=>{n(Date.now()),document.visibilityState==="visible"?i():o()};return d(),document.addEventListener("visibilitychange",d),()=>{o(),document.removeEventListener("visibilitychange",d)}},[e]),r}function sn({onRefresh:e,isFetching:r=!1,updatedAt:n,label:s="Refresh"}){const i=wt(15e3),o=n?pt(new Date(n).toISOString(),i):null;return t.jsxs("span",{className:"inline-flex items-center gap-2",children:[o?t.jsxs("span",{className:"text-xs text-[var(--otari-muted)]",children:["Updated ",o]}):null,t.jsx(C,{variant:"outline",size:"sm",isIconOnly:!0,isDisabled:r,onPress:e,"aria-label":s,children:t.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:`h-4 w-4 ${r?"animate-spin":""}`,"aria-hidden":"true",children:[t.jsx("path",{d:"M20 11a8 8 0 1 0-.5 4",strokeLinecap:"round",strokeLinejoin:"round"}),t.jsx("path",{d:"M20 4v5h-5",strokeLinecap:"round",strokeLinejoin:"round"})]})})]})}function an({title:e,description:r,actionLabel:n,onAction:s,isActionDisabled:i,children:o}){return t.jsx(I,{children:t.jsxs(I.Content,{className:"flex flex-col gap-4 p-6",children:[t.jsxs("div",{children:[t.jsx("h2",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:e}),r?t.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:r}):null]}),o,n&&s?t.jsx("div",{children:t.jsx(C,{variant:"primary",isDisabled:i,onPress:s,children:n})}):null]})})}function on({label:e="Loading…"}){return t.jsxs("div",{role:"status",className:"flex items-center justify-center gap-2 px-4 py-10 text-sm text-[var(--otari-muted)]",children:[t.jsx(Be,{size:"sm"}),t.jsx("span",{children:e})]})}function ln({children:e,confirmLabel:r,onConfirm:n,isPending:s}){const[i,o]=a.useState(!1);return i?t.jsxs("span",{className:"inline-flex items-center gap-1",children:[t.jsx(C,{size:"sm",variant:"danger",isDisabled:s,onPress:n,children:r}),t.jsx(C,{size:"sm",variant:"ghost",isDisabled:s,onPress:()=>o(!1),children:"Cancel"})]}):t.jsx(C,{size:"sm",variant:"danger-soft",onPress:()=>o(!0),children:e})}const St="rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-3 py-2 text-sm text-[var(--otari-ink)] focus:border-[var(--otari-brand)] focus:outline-none";function cn({id:e,label:r,ariaLabel:n,value:s,onChange:i,options:o,children:d,disabled:m}){const p=a.useId(),x=e??(r?p:void 0),f=t.jsx("select",{id:x,"aria-label":r?void 0:n,value:s,disabled:m,onChange:b=>i(b.target.value),className:St,children:o?o.map(b=>t.jsx("option",{value:b.value,children:b.label},b.value)):d});return r?t.jsxs("div",{className:"flex flex-col gap-1",children:[t.jsx("label",{htmlFor:x,className:"text-xs font-medium text-[var(--otari-muted)]",children:r}),f]}):f}function un({label:e,value:r,onChange:n,options:s,placeholder:i,maxVisible:o=50,allowsCustom:d=!1}){const m=u=>{var N;return((N=s.find(R=>R.value===u))==null?void 0:N.label)??u},[p,x]=a.useState(()=>m(r));a.useEffect(()=>{x(m(r))},[r]);const f=p.trim().toLowerCase(),b=s.filter(u=>!f||u.value.toLowerCase().includes(f)||u.label.toLowerCase().includes(f)).slice(0,o);return t.jsxs(M.Root,{allowsEmptyCollection:!0,allowsCustomValue:d,menuTrigger:"focus",inputValue:p,onInputChange:u=>{x(u),d?n(u.trim()):u.trim()===""&&n("")},onSelectionChange:u=>{u!=null&&n(String(u))},className:"flex flex-col gap-1",children:[t.jsx(me,{className:"text-xs font-medium text-[var(--otari-muted)]",children:e}),t.jsxs(M.InputGroup,{children:[t.jsx(fe,{placeholder:i,autoComplete:"off",onFocus:u=>u.currentTarget.select()}),t.jsx(M.Trigger,{})]}),t.jsx(M.Popover,{children:t.jsx(Ue,{items:b,className:"max-h-72 overflow-auto",children:u=>t.jsx(Ke,{id:u.value,textValue:u.label,children:u.label})})})]})}function kt(){var o;const e=at(),r=it(),[n,s]=a.useState(!1);return!(((o=e.data)==null?void 0:o.require_pricing)===!0&&e.data.default_pricing===!1)||n?null:t.jsx("div",{className:"shrink-0 px-6 pt-3",children:t.jsx(jt,{tone:"warning",children:t.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[t.jsxs("span",{children:["Requests are rejected until pricing is set (",t.jsx("code",{children:"require_pricing"})," is on). Enable default pricing to meter new models with public rates right away."]}),t.jsxs("span",{className:"flex items-center gap-2",children:[t.jsx(C,{size:"sm",variant:"primary",isDisabled:r.isPending,onPress:()=>r.mutate({default_pricing:!0}),children:r.isPending?"Enabling…":"Enable default pricing"}),t.jsx(C,{size:"sm",variant:"ghost",onPress:()=>s(!0),children:"Dismiss"})]})]})})})}function Et(){const{data:e}=st(),r=a.useRef(null);return e&&r.current===null&&(r.current=e.build),e!=null&&r.current!=null&&e.build!==r.current}function Pt(){const e=Et(),[r,n]=a.useState(!1);return!e||r?null:t.jsx("div",{className:"pointer-events-none absolute inset-x-0 top-0 z-50 flex justify-center",children:t.jsxs("div",{role:"status",className:"pointer-events-auto mt-1.5 flex items-center gap-3 rounded-full border border-[var(--otari-brand)] bg-[var(--otari-brand-tint)] py-1.5 pr-1.5 pl-4 text-sm text-[var(--otari-brand-dark)] shadow-md",children:[t.jsxs("span",{children:[t.jsx("strong",{className:"font-semibold",children:"An update is available."})," Reloading keeps you signed in."]}),t.jsx(C,{size:"sm",variant:"primary",onPress:()=>window.location.reload(),children:"Update now"}),t.jsx(C,{size:"sm",variant:"ghost",onPress:()=>n(!0),children:"Later"})]})})}const ge=200,be=480,H=240,Nt=60,je="otari.dashboard.sidebarWidth",we="otari.dashboard.sidebarCollapsed",de=16,Se="(max-width: 767px)",U=e=>Math.min(be,Math.max(ge,e));function Ct(){return typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia(Se).matches}const _t='a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"])';function Tt(e){return e?Array.from(e.querySelectorAll(_t)).filter(r=>r.offsetParent!==null||r===document.activeElement):[]}function Lt(){if(typeof window>"u")return H;try{const e=window.localStorage.getItem(je),r=e?Number.parseInt(e,10):Number.NaN;return Number.isNaN(r)?H:U(r)}catch{return H}}function It(){if(typeof window>"u")return!1;try{return window.localStorage.getItem(we)==="1"}catch{return!1}}const At=[{key:"home"},{key:"observability",label:"Observability"},{key:"catalog",label:"Catalog"},{key:"access",label:"Access"},{key:"system"}],qt=[{to:"/",section:"home",label:"Overview",end:!0,icon:t.jsxs("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[t.jsx("rect",{x:"3.5",y:"3.5",width:"7",height:"7",rx:"1.5",strokeLinejoin:"round"}),t.jsx("rect",{x:"13.5",y:"3.5",width:"7",height:"7",rx:"1.5",strokeLinejoin:"round"}),t.jsx("rect",{x:"3.5",y:"13.5",width:"7",height:"7",rx:"1.5",strokeLinejoin:"round"}),t.jsx("rect",{x:"13.5",y:"13.5",width:"7",height:"7",rx:"1.5",strokeLinejoin:"round"})]})},{to:"/activity",section:"observability",label:"Activity",icon:t.jsx("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:t.jsx("path",{d:"M3 12h4l2.5-6 4 12 2.5-6H21",strokeLinecap:"round",strokeLinejoin:"round"})})},{to:"/usage",section:"observability",label:"Usage",icon:t.jsx("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:t.jsx("path",{d:"M4 20V10M10 20V4M16 20v-7M22 20H2",strokeLinecap:"round",strokeLinejoin:"round"})})},{to:"/providers",section:"catalog",label:"Providers",icon:t.jsxs("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[t.jsx("rect",{x:"3.5",y:"4.5",width:"17",height:"6",rx:"1.5",strokeLinejoin:"round"}),t.jsx("rect",{x:"3.5",y:"13.5",width:"17",height:"6",rx:"1.5",strokeLinejoin:"round"}),t.jsx("path",{d:"M7 7.5h.01M7 16.5h.01",strokeLinecap:"round",strokeLinejoin:"round"})]})},{to:"/users",section:"access",label:"Users",icon:t.jsxs("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[t.jsx("circle",{cx:"9",cy:"8",r:"3.2",strokeLinejoin:"round"}),t.jsx("path",{d:"M3.5 19a5.5 5.5 0 0 1 11 0",strokeLinecap:"round",strokeLinejoin:"round"}),t.jsx("path",{d:"M16 5.2a3.2 3.2 0 0 1 0 5.6M17.5 19a5.5 5.5 0 0 0-3-4.9",strokeLinecap:"round",strokeLinejoin:"round"})]})},{to:"/keys",section:"access",label:"API keys",icon:t.jsxs("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[t.jsx("circle",{cx:"7.5",cy:"15.5",r:"3.5"}),t.jsx("path",{d:"M10 13l7-7M14 5l3 3M16.5 7.5l2-2",strokeLinecap:"round",strokeLinejoin:"round"})]})},{to:"/budgets",section:"access",label:"Budgets",icon:t.jsxs("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[t.jsx("path",{d:"M3 7.5A1.5 1.5 0 0 1 4.5 6H18a1.5 1.5 0 0 1 1.5 1.5V9",strokeLinejoin:"round"}),t.jsx("rect",{x:"3",y:"7.5",width:"18",height:"12",rx:"1.5",strokeLinejoin:"round"}),t.jsx("path",{d:"M16 13.5h.01",strokeLinecap:"round",strokeLinejoin:"round"}),t.jsx("path",{d:"M21 12v3h-3.5a1.5 1.5 0 0 1 0-3H21z",strokeLinejoin:"round"})]})},{to:"/models",section:"catalog",label:"Models",icon:t.jsxs("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[t.jsx("path",{d:"M12 3l8 4.5v9L12 21l-8-4.5v-9L12 3z",strokeLinejoin:"round"}),t.jsx("path",{d:"M12 12l8-4.5M12 12v9M12 12L4 7.5",strokeLinejoin:"round"})]})},{to:"/aliases",section:"catalog",label:"Aliases",icon:t.jsxs("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[t.jsx("path",{d:"M20.6 13.4L13.4 20.6a2 2 0 0 1-2.8 0l-7-7A2 2 0 0 1 3 12.2V5a2 2 0 0 1 2-2h7.2a2 2 0 0 1 1.4.6l7 7a2 2 0 0 1 0 2.8z",strokeLinejoin:"round"}),t.jsx("circle",{cx:"7.5",cy:"7.5",r:"1.5"})]})},{to:"/tools",section:"system",label:"Tools & Guardrails",icon:t.jsxs("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[t.jsx("path",{d:"M14.7 6.3a4 4 0 0 1 5 5l-8.4 8.4a2 2 0 0 1-2.8 0l-2.2-2.2a2 2 0 0 1 0-2.8z",strokeLinejoin:"round"}),t.jsx("path",{d:"M12 9 5 16",strokeLinecap:"round"})]})},{to:"/settings",section:"system",label:"Settings",icon:t.jsxs("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[t.jsx("circle",{cx:"12",cy:"12",r:"3"}),t.jsx("path",{d:"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z",strokeLinejoin:"round"})]})}];function Rt(){const{logout:e}=Z(),r=a.useRef(null),n=a.useRef(null),s=a.useRef(null),[i,o]=a.useState(Lt),[d,m]=a.useState(It),[p,x]=a.useState(!1),[f,b]=a.useState(Ct),[u,N]=a.useState(!1);a.useEffect(()=>{if(typeof window>"u"||typeof window.matchMedia!="function")return;const l=window.matchMedia(Se),v=j=>{b(j.matches),j.matches||N(!1)};return typeof l.addEventListener=="function"?(l.addEventListener("change",v),()=>l.removeEventListener("change",v)):(l.addListener(v),()=>l.removeListener(v))},[]),a.useEffect(()=>{if(!u)return;const l=v=>{v.key==="Escape"&&N(!1)};return window.addEventListener("keydown",l),()=>window.removeEventListener("keydown",l)},[u]),a.useEffect(()=>{var l,v,j;f&&(u?(l=r.current)==null||l.focus():(v=r.current)!=null&&v.contains(document.activeElement)&&((j=s.current)==null||j.focus()))},[f,u]);const R=a.useCallback(l=>{if(l.key!=="Tab")return;const v=Tt(r.current);if(v.length===0)return;const j=v[0],k=v[v.length-1],D=document.activeElement;l.shiftKey&&(D===j||D===r.current)?(l.preventDefault(),k.focus()):!l.shiftKey&&D===k&&(l.preventDefault(),j.focus())},[]);a.useEffect(()=>{const l=window.setTimeout(()=>{try{window.localStorage.setItem(je,String(Math.round(i)))}catch{}},200);return()=>window.clearTimeout(l)},[i]),a.useEffect(()=>{try{window.localStorage.setItem(we,d?"1":"0")}catch{}},[d]);const Ee=a.useCallback(l=>{l.preventDefault(),l.currentTarget.setPointerCapture(l.pointerId),x(!0)},[]),Pe=a.useCallback(l=>{var j;if(!l.currentTarget.hasPointerCapture(l.pointerId))return;const v=((j=r.current)==null?void 0:j.getBoundingClientRect().left)??0;o(U(l.clientX-v))},[]),Ne=a.useCallback(l=>{l.currentTarget.hasPointerCapture(l.pointerId)&&l.currentTarget.releasePointerCapture(l.pointerId),x(!1)},[]),Ce=a.useCallback(l=>{var v;l.preventDefault(),(v=n.current)==null||v.focus()},[]),_e=a.useCallback(l=>{l.key==="ArrowLeft"?(l.preventDefault(),o(v=>U(v-de))):l.key==="ArrowRight"&&(l.preventDefault(),o(v=>U(v+de)))},[]),Te=d?Nt:i,S=f?!1:d,z=f&&u?!0:void 0;return t.jsxs("div",{className:_("relative flex h-full flex-col overflow-hidden",p&&"cursor-col-resize select-none"),children:[t.jsx("button",{type:"button",inert:z,onClick:Ce,className:"sr-only focus:not-sr-only focus:absolute focus:top-3 focus:left-3 focus:z-50 focus:rounded-lg focus:border focus:border-[var(--otari-brand)] focus:bg-[var(--otari-surface)] focus:px-4 focus:py-2 focus:text-sm focus:font-medium focus:text-[var(--otari-brand-dark)] focus:shadow-md focus:outline-none",children:"Skip to main content"}),t.jsxs("header",{inert:z,className:"flex shrink-0 items-center justify-between border-b border-[var(--otari-line)] bg-[var(--otari-surface)] px-5 py-3",children:[t.jsxs("div",{className:"flex items-center gap-2.5",children:[t.jsx("button",{type:"button",ref:s,onClick:()=>N(l=>!l),"aria-label":u?"Close navigation":"Open navigation","aria-expanded":u,"aria-controls":"app-sidebar",className:"-ml-1 flex h-8 w-8 items-center justify-center rounded-lg text-[var(--otari-muted)] transition-colors hover:bg-[var(--otari-bg)] hover:text-[var(--otari-ink)] md:hidden",children:t.jsx("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5",children:t.jsx("path",{d:"M4 6h16M4 12h16M4 18h16",strokeLinecap:"round",strokeLinejoin:"round"})})}),t.jsx("img",{src:"/favicon.svg",alt:"",className:"h-7 w-7 shrink-0"}),t.jsx("span",{className:"text-base font-semibold text-[var(--otari-ink)]",children:"Otari"})]}),t.jsx(C,{size:"sm",variant:"outline",onPress:e,"aria-label":"Sign out",children:"Sign out"})]}),t.jsx(Pt,{}),t.jsx(et,{}),t.jsx(kt,{}),t.jsxs("div",{className:"flex min-h-0 flex-1",children:[f&&u?t.jsx("div",{"aria-hidden":"true",onClick:()=>N(!1),className:"fixed inset-0 z-30 bg-black/40 md:hidden"}):null,t.jsxs("aside",{ref:r,id:"app-sidebar",role:f?"dialog":void 0,"aria-modal":f&&u?!0:void 0,"aria-label":f?"Navigation":void 0,tabIndex:f?-1:void 0,inert:f&&!u?!0:void 0,onKeyDown:f&&u?R:void 0,style:f?void 0:{width:Te},className:_("flex flex-col border-r border-[var(--otari-line)] bg-[var(--otari-surface)] focus:outline-none",f?_("fixed inset-y-0 left-0 z-40 w-[17rem] shadow-xl transition-transform duration-200",u?"translate-x-0":"-translate-x-full"):_("relative shrink-0",!p&&"transition-[width] duration-150")),children:[t.jsx("button",{type:"button",onClick:()=>m(l=>!l),"aria-label":d?"Expand sidebar":"Collapse sidebar","aria-pressed":d,title:d?"Expand sidebar":"Collapse sidebar",className:"absolute -right-3 top-4 z-30 hidden h-6 w-6 items-center justify-center rounded-full border border-[var(--otari-line)] bg-[var(--otari-surface)] text-[var(--otari-muted)] shadow-sm transition-colors hover:border-[var(--otari-brand)] hover:text-[var(--otari-brand-dark)] md:flex",children:t.jsx("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",className:_("h-3.5 w-3.5 transition-transform",d&&"rotate-180"),children:t.jsx("path",{d:"M15 6l-6 6 6 6",strokeLinecap:"round",strokeLinejoin:"round"})})}),t.jsx("nav",{className:_("flex flex-col py-4",S?"px-2":"px-3"),children:At.map((l,v)=>{const j=qt.filter(k=>k.section===l.key);return j.length===0?null:t.jsxs("div",{className:v>0?"mt-4":void 0,children:[!S&&l.label?t.jsx("div",{className:"px-3 pb-1 text-[11px] font-semibold tracking-wider text-[var(--otari-muted)] uppercase",children:l.label}):null,v>0&&(S||!l.label)?t.jsx("div",{className:"mx-1 mb-2 border-t border-[var(--otari-line)]"}):null,t.jsx("div",{className:"flex flex-col gap-1",children:j.map(k=>t.jsxs(G,{to:k.to,end:k.end,onClick:()=>N(!1),"aria-label":S?k.label:void 0,title:S?k.label:void 0,className:({isActive:D})=>_("flex items-center rounded-lg py-2 text-sm font-medium transition-colors",S?"justify-center px-0":"gap-3 px-3",D?"bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]":"text-[var(--otari-muted)] hover:bg-[var(--otari-bg)] hover:text-[var(--otari-ink)]"),children:[k.icon,S?null:k.label]},k.to))})]},l.key)})}),t.jsxs("div",{className:"mt-auto flex flex-col gap-1 pb-3",children:[t.jsxs(G,{to:"/docs",onClick:()=>N(!1),"aria-label":S?"User guide":void 0,title:S?"User guide":void 0,className:({isActive:l})=>_("flex items-center rounded-lg py-2 text-sm font-medium transition-colors",S?"mx-2 justify-center px-0":"mx-3 gap-3 px-3",l?"bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]":"text-[var(--otari-muted)] hover:bg-[var(--otari-bg)] hover:text-[var(--otari-ink)]"),children:[t.jsxs("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[t.jsx("path",{d:"M12 6.5C10.5 5 8 4.5 4 4.5V18c4 0 6.5.5 8 2 1.5-1.5 4-2 8-2V4.5c-4 0-6.5.5-8 2z",strokeLinejoin:"round"}),t.jsx("path",{d:"M12 6.5V20",strokeLinecap:"round"})]}),S?null:"User guide"]}),t.jsxs("a",{href:"https://otari.ai",target:"_blank",rel:"noreferrer",title:"otari.ai: the hosted Otari gateway",className:_("flex items-center rounded-lg py-2 text-xs font-medium text-[var(--otari-muted)] transition-colors hover:bg-[var(--otari-bg)] hover:text-[var(--otari-brand-dark)]",S?"mx-2 justify-center px-0":"mx-3 gap-2 px-3"),children:[t.jsx("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-4 w-4 shrink-0",children:t.jsx("path",{d:"M18 10h-1.26A8 8 0 1 0 9 20h9a5 5 0 0 0 0-10z",strokeLinejoin:"round"})}),S?null:t.jsxs("span",{className:"flex-1",children:["otari.ai ",t.jsx("span",{"aria-hidden":!0,children:"↗"})]})]})]}),d||f?null:t.jsx("div",{role:"separator","aria-orientation":"vertical","aria-label":"Resize sidebar","aria-valuenow":Math.round(i),"aria-valuemin":ge,"aria-valuemax":be,tabIndex:0,onPointerDown:Ee,onPointerMove:Pe,onPointerUp:Ne,onKeyDown:_e,className:_("absolute top-0 right-0 z-10 h-full w-1.5 cursor-col-resize touch-none transition-colors","hover:bg-[var(--otari-brand)] focus-visible:bg-[var(--otari-brand)] focus:outline-none",p?"bg-[var(--otari-brand)]":"bg-transparent")})]}),t.jsx("main",{ref:n,id:"main-content",tabIndex:-1,inert:z,className:"flex-1 overflow-y-auto focus:outline-none",children:t.jsx("div",{className:"mx-auto flex max-w-[1800px] flex-col gap-6 px-4 py-5 md:px-6 md:py-6",children:t.jsx(De,{})})})]})]})}function Dt(){const{login:e}=Z(),[r,n]=a.useState(""),[s,i]=a.useState(null),[o,d]=a.useState(!1),m=async()=>{const p=r.trim();if(!(!p||o)){d(!0),i(null);try{await He(p)?e():i(new Error("Invalid master key."))}catch(x){i(x)}finally{d(!1)}}};return t.jsx("div",{className:"flex min-h-full items-center justify-center p-6",children:t.jsx(I,{className:"w-full max-w-md",children:t.jsxs(I.Content,{className:"flex flex-col gap-5 p-7",children:[t.jsxs("div",{className:"flex flex-col items-center gap-3 text-center",children:[t.jsx("img",{src:"/favicon.svg",alt:"Otari",className:"h-12 w-12"}),t.jsxs("div",{children:[t.jsx("h1",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:"Otari Dashboard"}),t.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:"Sign in with your master key to browse models, set pricing, and manage settings."})]})]}),t.jsxs("form",{className:"flex flex-col gap-4",onSubmit:p=>{p.preventDefault(),m()},children:[t.jsxs(ze,{value:r,onChange:p=>{n(p),s&&i(null)},type:"password",isRequired:!0,className:"flex flex-col gap-1",children:[t.jsx(me,{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Master key"}),t.jsx(fe,{placeholder:"otari-mk-… or your master key",autoFocus:!0,autoComplete:"off"})]}),t.jsxs("details",{className:"text-xs text-[var(--otari-muted)]",children:[t.jsx("summary",{className:"cursor-pointer font-medium text-[var(--otari-brand-dark)]",children:"First run? Where to find your key"}),t.jsxs("p",{className:"mt-2 leading-relaxed",children:["If you did not set ",t.jsx("code",{children:"OTARI_MASTER_KEY"}),", Otari generated one and printed it to the server logs on startup. Look for the line ",t.jsx("code",{children:"Your master key:"})," (for example, run"," ",t.jsx("code",{children:"docker logs "}),") and paste it above."]})]}),t.jsx(bt,{error:s}),t.jsx(C,{type:"submit",variant:"primary",fullWidth:!0,isDisabled:!r.trim()||o,children:o?"Signing in…":"Sign in"})]}),t.jsx("p",{className:"text-center text-xs text-[var(--otari-muted)]",children:"The key is sent once to this gateway and exchanged for a session cookie; it is never stored in the browser."}),t.jsx("div",{className:"border-t border-[var(--otari-line)] pt-4 text-center",children:t.jsx($e,{href:"/welcome",className:"text-sm font-medium text-[var(--otari-brand-dark)]",children:"New to Otari? Open the welcome guide"})})]})})})}const Ot=a.lazy(async()=>({default:(await P(async()=>{const{ActivityPage:e}=await import("./ActivityPage-CD1bI8e0.js");return{ActivityPage:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]))).ActivityPage})),Mt=a.lazy(async()=>({default:(await P(async()=>{const{AliasesPage:e}=await import("./AliasesPage-DOW9Z9Aj.js");return{AliasesPage:e}},__vite__mapDeps([10,1,2,6,4,7,8,11]))).AliasesPage})),Ft=a.lazy(async()=>({default:(await P(async()=>{const{BudgetsPage:e}=await import("./BudgetsPage-BJR_ZONo.js");return{BudgetsPage:e}},__vite__mapDeps([12,1,2,6,4,7,8,11]))).BudgetsPage})),Ut=a.lazy(async()=>({default:(await P(async()=>{const{DocsPage:e}=await import("./DocsPage-iVP3WPzU.js");return{DocsPage:e}},__vite__mapDeps([13,1,2,4]))).DocsPage})),Kt=a.lazy(async()=>({default:(await P(async()=>{const{KeysPage:e}=await import("./KeysPage-ChiGoU_A.js");return{KeysPage:e}},__vite__mapDeps([14,1,2,6,4,7,8,11,15]))).KeysPage})),Bt=a.lazy(async()=>({default:(await P(async()=>{const{ModelsPage:e}=await import("./ModelsPage-CRpsI3fJ.js");return{ModelsPage:e}},__vite__mapDeps([16,1,2,6,4,8,9]))).ModelsPage})),zt=a.lazy(async()=>({default:(await P(async()=>{const{OverviewIndex:e}=await import("./OverviewPage-D51QWvyh.js");return{OverviewIndex:e}},__vite__mapDeps([17,1,2,18,5,4,8]))).OverviewIndex})),$t=a.lazy(async()=>({default:(await P(async()=>{const{ProvidersPage:e}=await import("./ProvidersPage-DBjl1bc3.js");return{ProvidersPage:e}},__vite__mapDeps([19,1,2,11,4,8]))).ProvidersPage})),Qt=a.lazy(async()=>({default:(await P(async()=>{const{SettingsPage:e}=await import("./SettingsPage-BFxhhnZx.js");return{SettingsPage:e}},__vite__mapDeps([20,1,2,4]))).SettingsPage})),Vt=a.lazy(async()=>({default:(await P(async()=>{const{ToolsGuardrailsPage:e}=await import("./ToolsGuardrailsPage-517a2mDO.js");return{ToolsGuardrailsPage:e}},__vite__mapDeps([21,1,2,4]))).ToolsGuardrailsPage})),Wt=a.lazy(async()=>({default:(await P(async()=>{const{UsagePage:e}=await import("./UsagePage-D0tp6Db_.js");return{UsagePage:e}},__vite__mapDeps([22,1,2,3,4,5,6,18,7,8,9]))).UsagePage})),Ht=a.lazy(async()=>({default:(await P(async()=>{const{UsersPage:e}=await import("./UsersPage-CjqDrVVr.js");return{UsersPage:e}},__vite__mapDeps([23,1,2,6,4,7,8,11,15]))).UsersPage}));function E(e){return t.jsx(a.Suspense,{fallback:t.jsx("div",{role:"status",children:"Loading page…"}),children:e})}function Gt(){const{isAuthenticated:e}=Z();return e?t.jsx(Oe,{children:t.jsx(Me,{children:t.jsxs(w,{element:t.jsx(Rt,{}),children:[t.jsx(w,{index:!0,element:E(t.jsx(zt,{}))}),t.jsx(w,{path:"providers",element:E(t.jsx($t,{}))}),t.jsx(w,{path:"keys",element:E(t.jsx(Kt,{}))}),t.jsx(w,{path:"users",element:E(t.jsx(Ht,{}))}),t.jsx(w,{path:"budgets",element:E(t.jsx(Ft,{}))}),t.jsx(w,{path:"activity",element:E(t.jsx(Ot,{}))}),t.jsx(w,{path:"usage",element:E(t.jsx(Wt,{}))}),t.jsx(w,{path:"models",element:E(t.jsx(Bt,{}))}),t.jsx(w,{path:"aliases",element:E(t.jsx(Mt,{}))}),t.jsx(w,{path:"tools",element:E(t.jsx(Vt,{}))}),t.jsx(w,{path:"settings",element:E(t.jsx(Qt,{}))}),t.jsx(w,{path:"docs",element:E(t.jsx(Ut,{}))}),t.jsx(w,{path:"*",element:t.jsx(Fe,{to:"/",replace:!0})})]})})}):t.jsx(Dt,{})}function Jt({children:e}){const[r]=a.useState(()=>new Ae({defaultOptions:{queries:{refetchOnWindowFocus:!1,retry:(n,s)=>s instanceof T&&(s.status===401||s.status===403)?!1:n<2}}}));return t.jsx(qe,{client:r,children:t.jsx(Ye,{children:e})})}const ke=document.getElementById("root");if(!ke)throw new Error("Root element #root not found");Qe.createRoot(ke).render(t.jsx(a.StrictMode,{children:t.jsx(Jt,{children:t.jsx(Gt,{})})}));export{ur as $,kr as A,Jr as B,ln as C,Er as D,bt as E,cn as F,gt as G,Yr as H,jt as I,at as J,Gr as K,nr as L,on as M,ir as N,en as O,nn as P,Xr as Q,sn as R,tn as S,rn as T,Hr as U,yt as V,pt as W,lr as X,dr as Y,fr as Z,it as _,_r as a,or as a0,cr as a1,ar as a2,sr as a3,hr as a4,Pr as a5,Nr as a6,Cr as a7,gr as a8,mr as a9,br as aa,jr as ab,wr as ac,Zr as ad,Br as ae,Ur as af,zr as b,$r as c,Wr as d,Qr as e,Vr as f,un as g,rr as h,vr as i,pr as j,yr as k,qr as l,Dr as m,Or as n,Mr as o,Kr as p,an as q,Rr as r,Lr as s,Ir as t,Fr as u,Ar as v,Tr as w,tr as x,Sr as y,xr as z}; +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ActivityPage-DIACtZv5.js","assets/tanstack-query-1t81HyiD.js","assets/react-dgEcD0HR.js","assets/FilterChips-DZjxf-ot.js","assets/heroui-BI50yK5B.js","assets/recharts-C4kRDmvS.js","assets/tableSelection-9hV37uhu.js","assets/ConfirmDialog-KvA7b1-a.js","assets/DataTable-Bmn_eYSV.js","assets/TablePagination-CXhesdmH.js","assets/AliasesPage-x0NFKgtH.js","assets/Field-Dwp6u3t8.js","assets/BudgetsPage-D-S9-U_l.js","assets/DocsPage-BZcIfS8u.js","assets/KeysPage-CZjqxzex.js","assets/ModelScopeControl-u-XlXgXz.js","assets/ModelsPage-BkzSZx5b.js","assets/OverviewPage-BedTU_aZ.js","assets/charts-DIsd9m--.js","assets/ProvidersPage-BP60GuZv.js","assets/SettingsPage-DR0J2MHH.js","assets/ToolsGuardrailsPage-DiZ1TbOa.js","assets/UsagePage-Ce_jAzFl.js","assets/UsersPage-5kctrw19.js"])))=>i.map(i=>d[i]); +var Le=Object.defineProperty;var Ie=(e,r,n)=>r in e?Le(e,r,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[r]=n;var ie=(e,r,n)=>Ie(e,typeof r!="symbol"?r+"":r,n);import{u as y,j as t,a as g,b as h,k as X,Q as Ae,c as qe}from"./tanstack-query-1t81HyiD.js";import{d as Re,r as a,N as G,O as De,H as Oe,e as Me,f as w,h as Fe}from"./react-dgEcD0HR.js";import{B as C,C as M,L as me,I as fe,a as Ue,b as Ke,d as I,S as Be,c as _,T as ze,e as $e}from"./heroui-BI50yK5B.js";(function(){const r=document.createElement("link").relList;if(r&&r.supports&&r.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))s(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const d of o.addedNodes)d.tagName==="LINK"&&d.rel==="modulepreload"&&s(d)}).observe(document,{childList:!0,subtree:!0});function n(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function s(i){if(i.ep)return;i.ep=!0;const o=n(i);fetch(i.href,o)}})();var Qe=Re();const Ve="modulepreload",We=function(e){return"/"+e},oe={},P=function(r,n,s){let i=Promise.resolve();if(n&&n.length>0){let d=function(x){return Promise.all(x.map(f=>Promise.resolve(f).then(b=>({status:"fulfilled",value:b}),b=>({status:"rejected",reason:b}))))};document.getElementsByTagName("link");const m=document.querySelector("meta[property=csp-nonce]"),p=(m==null?void 0:m.nonce)||(m==null?void 0:m.getAttribute("nonce"));i=d(n.map(x=>{if(x=We(x),x in oe)return;oe[x]=!0;const f=x.endsWith(".css"),b=f?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${x}"]${b}`))return;const u=document.createElement("link");if(u.rel=f?"stylesheet":Ve,f||(u.as="script"),u.crossOrigin="",u.href=x,p&&u.setAttribute("nonce",p),document.head.appendChild(u),f)return new Promise((N,R)=>{u.addEventListener("load",N),u.addEventListener("error",()=>R(new Error(`Unable to preload CSS for ${x}`)))})}))}function o(d){const m=new Event("vite:preloadError",{cancelable:!0});if(m.payload=d,window.dispatchEvent(m),!m.defaultPrevented)throw d}return i.then(d=>{for(const m of d||[])m.status==="rejected"&&o(m.reason);return r().catch(o)})};class T extends Error{constructor(n,s){super(s);ie(this,"status");this.name="ApiError",this.status=n}}let F=null;function le(e){F=e}async function J(e){try{const r=await e.json();if(typeof r.detail=="string")return r.detail;if(r.detail!=null)return JSON.stringify(r.detail)}catch{}return e.statusText||`Request failed (${e.status})`}async function He(e){let r;try{r=await fetch("/v1/auth/session",{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify({master_key:e})})}catch{throw new T(0,"Network error: could not reach the gateway.")}if(r.status===401||r.status===403)return!1;if(!r.ok)throw new T(r.status,await J(r));return!0}async function Ge(){try{await fetch("/v1/auth/session",{method:"DELETE"})}catch{}}async function c(e,r={}){const n=new Headers(r.headers);n.set("Accept","application/json"),r.body!=null&&!n.has("Content-Type")&&n.set("Content-Type","application/json");let s;try{s=await fetch(e,{...r,headers:n})}catch{throw new T(0,"Network error: could not reach the gateway.")}if(s.status===401||s.status===403)throw F==null||F(),new T(s.status,await J(s));if(!s.ok)throw new T(s.status,await J(s));if(s.status!==204)return await s.json()}const Y="otari.dashboard.hasSession",he=a.createContext(null);function Je(){try{return window.localStorage.getItem(Y)==="1"}catch{return!1}}function Ye({children:e}){const r=y(),[n,s]=a.useState(Je),i=a.useCallback(()=>{Ge(),s(!1),r.clear();try{window.localStorage.removeItem(Y)}catch{}},[r]),o=a.useCallback(()=>{r.clear(),s(!0);try{window.localStorage.setItem(Y,"1")}catch{}},[r]);a.useEffect(()=>(le(i),()=>le(null)),[i]);const d=a.useMemo(()=>({isAuthenticated:n,login:o,logout:i}),[n,o,i]);return t.jsx(he.Provider,{value:d,children:e})}function Z(){const e=a.useContext(he);if(!e)throw new Error("useAuth must be used within an AuthProvider");return e}function Xe(e){return e instanceof T&&e.status===0}function Ze(){const e=y(),[r,n]=a.useState(!1);return a.useEffect(()=>{const s=e.getQueryCache(),i=()=>s.getAll().some(o=>o.state.status==="error"&&Xe(o.state.error));return n(i()),s.subscribe(()=>n(i()))},[e]),r}function et(){return Ze()?t.jsxs("div",{role:"alert","aria-live":"assertive",className:"fixed right-4 bottom-4 z-50 flex max-w-sm items-start gap-2.5 rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700 shadow-lg",children:[t.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2","aria-hidden":!0,className:"mt-0.5 h-5 w-5 shrink-0",children:[t.jsx("path",{d:"M12 9v4M12 17h.01",strokeLinecap:"round",strokeLinejoin:"round"}),t.jsx("path",{d:"M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0z",strokeLinejoin:"round"})]}),t.jsxs("span",{children:[t.jsx("strong",{className:"font-semibold",children:"Can’t reach the gateway."})," The backend isn’t responding; data won’t load or save until the connection is restored."]})]}):null}const L="models",K="pricing",xe="settings",ve="tool-settings",ee="aliases",te="discoverable",re="providers",ne="provider-health",ye="stored-providers",tt="model-metadata",rt="build",A="keys",q="budgets",pe="users",O="usage",nt=6e4,ce=60*6e4;function tr(){return g({queryKey:[L],queryFn:()=>c("/v1/models"),staleTime:6e4})}function st(){return g({queryKey:[rt],queryFn:()=>c("/dashboard-build.json"),refetchInterval:nt,refetchOnWindowFocus:!0,staleTime:0,retry:!1})}function rr(){return g({queryKey:[te],queryFn:()=>c("/v1/models/discoverable"),staleTime:5*6e4})}function nr(){return g({queryKey:[re],queryFn:()=>c("/v1/providers"),staleTime:5*6e4})}function sr(){return g({queryKey:["provider-catalog"],queryFn:()=>c("/v1/providers/catalog"),staleTime:1/0})}function ar(e){return g({queryKey:["provider-catalog",e],queryFn:()=>c(`/v1/providers/catalog/${encodeURIComponent(e)}`),enabled:e!=="",staleTime:1/0})}function ir(){return g({queryKey:[ne],queryFn:()=>c("/v1/providers/health"),staleTime:ce,refetchInterval:ce})}function or(){const e=y();return h({mutationFn:()=>c("/v1/providers/health?refresh=true"),onSuccess:r=>e.setQueryData([ne],r)})}function lr(){return g({queryKey:[ye],queryFn:()=>c("/v1/provider-credentials"),staleTime:6e4})}function B(e){e.invalidateQueries({queryKey:[ye]}),e.invalidateQueries({queryKey:[re]}),e.invalidateQueries({queryKey:[L]}),e.invalidateQueries({queryKey:[te]}),e.invalidateQueries({queryKey:[ne]})}function cr(){const e=y();return h({mutationFn:r=>c("/v1/provider-credentials",{method:"POST",body:JSON.stringify(r)}),onSuccess:()=>B(e)})}function ur(){const e=y();return h({mutationFn:({instance:r,body:n})=>c(`/v1/provider-credentials/${encodeURIComponent(r)}`,{method:"PATCH",body:JSON.stringify(n)}),onSuccess:()=>B(e)})}function dr(){const e=y();return h({mutationFn:r=>c(`/v1/provider-credentials/${encodeURIComponent(r)}`,{method:"DELETE"}),onSuccess:()=>B(e)})}function mr(){const e=y();return h({mutationFn:()=>c("/v1/provider-credentials/reencrypt",{method:"POST"}),onSuccess:()=>B(e)})}function fr(){return h({mutationFn:e=>c(`/v1/provider-credentials/${encodeURIComponent(e)}/test`,{method:"POST"})})}function hr(){return h({mutationFn:e=>c("/v1/provider-credentials/test",{method:"POST",body:JSON.stringify(e)})})}function xr(){return g({queryKey:[tt],queryFn:()=>c("/v1/models/metadata"),staleTime:10*6e4})}function vr(){return g({queryKey:[ee],queryFn:()=>c("/v1/aliases"),staleTime:6e4})}function yr(){const e=y();return h({mutationFn:r=>c("/v1/aliases",{method:"POST",body:JSON.stringify(r)}),onSuccess:()=>{e.invalidateQueries({queryKey:[ee]}),e.invalidateQueries({queryKey:[L]})}})}function pr(){const e=y();return h({mutationFn:r=>c(`/v1/aliases/${encodeURIComponent(r)}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:[ee]}),e.invalidateQueries({queryKey:[L]})}})}function at(){return g({queryKey:[xe],queryFn:()=>c("/v1/settings"),staleTime:6e4})}function it(){const e=y();return h({mutationFn:r=>c("/v1/settings",{method:"PATCH",body:JSON.stringify(r)}),onSuccess:r=>{e.setQueryData([xe],r),e.invalidateQueries({queryKey:[L]}),e.invalidateQueries({queryKey:[te]})}})}function gr(){return h({mutationFn:()=>c("/v1/settings/master-key/rotate",{method:"POST"})})}function br(){return g({queryKey:[ve],queryFn:()=>c("/v1/tool-settings"),staleTime:6e4})}function jr(){const e=y();return h({mutationFn:r=>c("/v1/tool-settings",{method:"PATCH",body:JSON.stringify(r)}),onSuccess:r=>{e.setQueryData([ve],r)}})}function wr(){return h({mutationFn:({service:e,url:r})=>c(`/v1/tool-settings/${encodeURIComponent(e)}/test`,{method:"POST",body:JSON.stringify({url:r})})})}const $=1e3,ot=100;async function lt(){const e=[];for(let r=0;rc("/v1/pricing",{method:"POST",body:JSON.stringify(r)}),onSuccess:()=>{e.invalidateQueries({queryKey:[K]}),e.invalidateQueries({queryKey:[L]})}})}function Er(){const e=y();return h({mutationFn:r=>c(`/v1/pricing/${encodeURIComponent(r)}`,{method:"DELETE"}),onSuccess:()=>{e.invalidateQueries({queryKey:[K]}),e.invalidateQueries({queryKey:[L]})}})}function Pr(){return h({mutationFn:()=>c("/v1/pricing/refresh",{method:"POST"})})}function Nr(){const e=y();return h({mutationFn:()=>c("/v1/pricing/refresh/confirm",{method:"POST"}),onSuccess:()=>{e.invalidateQueries({queryKey:[K]}),e.invalidateQueries({queryKey:[L]}),e.invalidateQueries({queryKey:[re]})}})}function Cr(){return h({mutationFn:()=>c("/v1/pricing/refresh/reject",{method:"POST"})})}const Q=1e3,ct=100;async function ut(){const e=[];for(let r=0;rc("/v1/keys",{method:"POST",body:JSON.stringify(r)}),onSuccess:()=>void e.invalidateQueries({queryKey:[A]})})}function Lr(){const e=y();return h({mutationFn:({id:r,body:n})=>c(`/v1/keys/${encodeURIComponent(r)}`,{method:"PATCH",body:JSON.stringify(n)}),onSuccess:()=>void e.invalidateQueries({queryKey:[A]})})}function Ir(){const e=y();return h({mutationFn:r=>c(`/v1/keys/${encodeURIComponent(r)}/rotate`,{method:"POST"}),onSuccess:()=>void e.invalidateQueries({queryKey:[A]})})}function Ar(){const e=y();return h({mutationFn:r=>c(`/v1/keys/${encodeURIComponent(r)}`,{method:"DELETE"}),onSuccess:()=>void e.invalidateQueries({queryKey:[A]})})}const V=1e3,dt=100;async function mt(){const e=[];for(let r=0;rc(`/v1/budgets/${encodeURIComponent(e)}/reset-logs`),enabled:e!==null,staleTime:6e4})}function Dr(){const e=y();return h({mutationFn:r=>c("/v1/budgets",{method:"POST",body:JSON.stringify(r)}),onSuccess:()=>void e.invalidateQueries({queryKey:[q]})})}function Or(){const e=y();return h({mutationFn:({id:r,body:n})=>c(`/v1/budgets/${encodeURIComponent(r)}`,{method:"PATCH",body:JSON.stringify(n)}),onSuccess:()=>void e.invalidateQueries({queryKey:[q]})})}function Mr(){const e=y();return h({mutationFn:r=>c(`/v1/budgets/${encodeURIComponent(r)}`,{method:"DELETE"}),onSuccess:()=>void e.invalidateQueries({queryKey:[q]})})}const W=1e3,ft=100;async function ht(){const e=[];for(let r=0;rc("/v1/users",{method:"POST",body:JSON.stringify(r)}),onSuccess:()=>se(e)})}function Kr(){const e=y();return h({mutationFn:({id:r,body:n})=>c(`/v1/users/${encodeURIComponent(r)}`,{method:"PATCH",body:JSON.stringify(n)}),onSuccess:()=>se(e)})}function Br(){const e=y();return h({mutationFn:r=>c(`/v1/users/${encodeURIComponent(r)}`,{method:"DELETE"}),onSuccess:()=>{se(e),e.invalidateQueries({queryKey:[A]})}})}function ae(e){const r=new URLSearchParams;return e.start_date&&r.set("start_date",e.start_date),e.end_date&&r.set("end_date",e.end_date),e.status&&r.set("status",e.status),e.model&&r.set("model",e.model),e.endpoint&&r.set("endpoint",e.endpoint),e.user_id&&r.set("user_id",e.user_id),e.api_key_id&&r.set("api_key_id",e.api_key_id),e.source&&r.set("source",e.source),e.priced!==void 0&&r.set("priced",String(e.priced)),e.counts_toward_budget!==void 0&&r.set("counts_toward_budget",String(e.counts_toward_budget)),r}function zr(e,r,n){return g({queryKey:[O,"list",e,r,n],queryFn:()=>{const s=ae(e);return s.set("skip",String(r*n)),s.set("limit",String(n)),c(`/v1/usage?${s.toString()}`)},placeholderData:X,staleTime:1e4})}function $r(e,r=!0){return g({queryKey:[O,"count",e],queryFn:()=>c(`/v1/usage/count?${ae(e).toString()}`),enabled:r,placeholderData:X,staleTime:1e4})}function Qr(){const e=y();return h({mutationFn:r=>c("/v1/usage",{method:"DELETE",body:JSON.stringify(r)}),onSuccess:()=>{e.invalidateQueries({queryKey:[O]})}})}function Vr(){const e=y();return h({mutationFn:r=>c("/v1/usage/set-price",{method:"POST",body:JSON.stringify(r)}),onSuccess:()=>{e.invalidateQueries({queryKey:[O]})}})}function Wr(e,r,n=!0){return g({queryKey:[O,"summary",e,r],queryFn:()=>{const s=ae(e);return s.set("bucket",r),c(`/v1/usage/summary?${s.toString()}`)},enabled:n,placeholderData:X,staleTime:3e4})}function Hr(e){return e==null?"0":new Intl.NumberFormat("en-US").format(e)}function Gr(e){if(e==null)return"$0.00";const r=e!==0&&Math.abs(e)<.01?4:2;return new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",minimumFractionDigits:2,maximumFractionDigits:r}).format(e)}function Jr(e){if(e==null)return"—";if(e>=1e6){const r=e/1e6;return`${Number.isInteger(r)?r:r.toFixed(1)}M`}if(e>=1e3){const r=Math.round(e/1e3);return r>=1e3?"1M":`${r}K`}return String(e)}const xt=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function Yr(e){if(!e)return"—";const r=/^(\d{4})-(\d{2})/.exec(e);if(!r)return e;const n=Number(r[2])-1;return n<0||n>11?r[1]:`${xt[n]} ${r[1]}`}const vt=new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",maximumFractionDigits:2});function Xr(e){return vt.format(e)}function Zr(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function yt(e){return`${(e*100).toFixed(1)}%`}function en(e,r){return r===void 0||r===0?null:(e-r)/r}function pt(e,r=Date.now()){if(!e)return"never";const n=new Date(e);if(Number.isNaN(n.getTime()))return e;const s=Math.round((r-n.getTime())/1e3),i=s<0,o=Math.abs(s),d=[["second",60],["minute",60],["hour",24],["day",30],["month",12],["year",Number.POSITIVE_INFINITY]];let m=o,p="second";for(const[f,b]of d){if(p=f,m0?"▲":e<0?"▼":"•";return t.jsxs("span",{className:"text-[var(--otari-muted)]",children:[r," ",yt(Math.abs(e))," vs prev"]})}function gt(e){return e instanceof T||e instanceof Error?e.message:"Something went wrong."}function bt({error:e}){return e?t.jsx("div",{role:"alert",className:"rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700",children:gt(e)}):null}function jt({tone:e="info",children:r}){const n=e==="warning"?"border-amber-200 bg-amber-50 text-amber-800":"border-[var(--otari-brand)] bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]";return t.jsx("div",{className:`rounded-lg border px-4 py-3 text-sm ${n}`,children:r})}function nn({title:e,description:r,action:n}){return t.jsxs("div",{className:"flex flex-col gap-3",children:[t.jsxs("div",{children:[t.jsx("h1",{className:"text-xl font-semibold text-[var(--otari-ink)]",children:e}),r?t.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:r}):null]}),n?t.jsx("div",{className:"flex flex-wrap gap-2",children:n}):null]})}function wt(e){const[r,n]=a.useState(()=>Date.now());return a.useEffect(()=>{let s;const i=()=>{s===void 0&&(s=setInterval(()=>n(Date.now()),e))},o=()=>{s!==void 0&&(clearInterval(s),s=void 0)},d=()=>{n(Date.now()),document.visibilityState==="visible"?i():o()};return d(),document.addEventListener("visibilitychange",d),()=>{o(),document.removeEventListener("visibilitychange",d)}},[e]),r}function sn({onRefresh:e,isFetching:r=!1,updatedAt:n,label:s="Refresh"}){const i=wt(15e3),o=n?pt(new Date(n).toISOString(),i):null;return t.jsxs("span",{className:"inline-flex items-center gap-2",children:[o?t.jsxs("span",{className:"text-xs text-[var(--otari-muted)]",children:["Updated ",o]}):null,t.jsx(C,{variant:"outline",size:"sm",isIconOnly:!0,isDisabled:r,onPress:e,"aria-label":s,children:t.jsxs("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:`h-4 w-4 ${r?"animate-spin":""}`,"aria-hidden":"true",children:[t.jsx("path",{d:"M20 11a8 8 0 1 0-.5 4",strokeLinecap:"round",strokeLinejoin:"round"}),t.jsx("path",{d:"M20 4v5h-5",strokeLinecap:"round",strokeLinejoin:"round"})]})})]})}function an({title:e,description:r,actionLabel:n,onAction:s,isActionDisabled:i,children:o}){return t.jsx(I,{children:t.jsxs(I.Content,{className:"flex flex-col gap-4 p-6",children:[t.jsxs("div",{children:[t.jsx("h2",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:e}),r?t.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:r}):null]}),o,n&&s?t.jsx("div",{children:t.jsx(C,{variant:"primary",isDisabled:i,onPress:s,children:n})}):null]})})}function on({label:e="Loading…"}){return t.jsxs("div",{role:"status",className:"flex items-center justify-center gap-2 px-4 py-10 text-sm text-[var(--otari-muted)]",children:[t.jsx(Be,{size:"sm"}),t.jsx("span",{children:e})]})}function ln({children:e,confirmLabel:r,onConfirm:n,isPending:s}){const[i,o]=a.useState(!1);return i?t.jsxs("span",{className:"inline-flex items-center gap-1",children:[t.jsx(C,{size:"sm",variant:"danger",isDisabled:s,onPress:n,children:r}),t.jsx(C,{size:"sm",variant:"ghost",isDisabled:s,onPress:()=>o(!1),children:"Cancel"})]}):t.jsx(C,{size:"sm",variant:"danger-soft",onPress:()=>o(!0),children:e})}const St="rounded-lg border border-[var(--otari-line)] bg-[var(--otari-bg)] px-3 py-2 text-sm text-[var(--otari-ink)] focus:border-[var(--otari-brand)] focus:outline-none";function cn({id:e,label:r,ariaLabel:n,value:s,onChange:i,options:o,children:d,disabled:m}){const p=a.useId(),x=e??(r?p:void 0),f=t.jsx("select",{id:x,"aria-label":r?void 0:n,value:s,disabled:m,onChange:b=>i(b.target.value),className:St,children:o?o.map(b=>t.jsx("option",{value:b.value,children:b.label},b.value)):d});return r?t.jsxs("div",{className:"flex flex-col gap-1",children:[t.jsx("label",{htmlFor:x,className:"text-xs font-medium text-[var(--otari-muted)]",children:r}),f]}):f}function un({label:e,value:r,onChange:n,options:s,placeholder:i,maxVisible:o=50,allowsCustom:d=!1}){const m=u=>{var N;return((N=s.find(R=>R.value===u))==null?void 0:N.label)??u},[p,x]=a.useState(()=>m(r));a.useEffect(()=>{x(m(r))},[r]);const f=p.trim().toLowerCase(),b=s.filter(u=>!f||u.value.toLowerCase().includes(f)||u.label.toLowerCase().includes(f)).slice(0,o);return t.jsxs(M.Root,{allowsEmptyCollection:!0,allowsCustomValue:d,menuTrigger:"focus",inputValue:p,onInputChange:u=>{x(u),d?n(u.trim()):u.trim()===""&&n("")},onSelectionChange:u=>{u!=null&&n(String(u))},className:"flex flex-col gap-1",children:[t.jsx(me,{className:"text-xs font-medium text-[var(--otari-muted)]",children:e}),t.jsxs(M.InputGroup,{children:[t.jsx(fe,{placeholder:i,autoComplete:"off",onFocus:u=>u.currentTarget.select()}),t.jsx(M.Trigger,{})]}),t.jsx(M.Popover,{children:t.jsx(Ue,{items:b,className:"max-h-72 overflow-auto",children:u=>t.jsx(Ke,{id:u.value,textValue:u.label,children:u.label})})})]})}function kt(){var o;const e=at(),r=it(),[n,s]=a.useState(!1);return!(((o=e.data)==null?void 0:o.require_pricing)===!0&&e.data.default_pricing===!1)||n?null:t.jsx("div",{className:"shrink-0 px-6 pt-3",children:t.jsx(jt,{tone:"warning",children:t.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[t.jsxs("span",{children:["Requests are rejected until pricing is set (",t.jsx("code",{children:"require_pricing"})," is on). Enable default pricing to meter new models with public rates right away."]}),t.jsxs("span",{className:"flex items-center gap-2",children:[t.jsx(C,{size:"sm",variant:"primary",isDisabled:r.isPending,onPress:()=>r.mutate({default_pricing:!0}),children:r.isPending?"Enabling…":"Enable default pricing"}),t.jsx(C,{size:"sm",variant:"ghost",onPress:()=>s(!0),children:"Dismiss"})]})]})})})}function Et(){const{data:e}=st(),r=a.useRef(null);return e&&r.current===null&&(r.current=e.build),e!=null&&r.current!=null&&e.build!==r.current}function Pt(){const e=Et(),[r,n]=a.useState(!1);return!e||r?null:t.jsx("div",{className:"pointer-events-none absolute inset-x-0 top-0 z-50 flex justify-center",children:t.jsxs("div",{role:"status",className:"pointer-events-auto mt-1.5 flex items-center gap-3 rounded-full border border-[var(--otari-brand)] bg-[var(--otari-brand-tint)] py-1.5 pr-1.5 pl-4 text-sm text-[var(--otari-brand-dark)] shadow-md",children:[t.jsxs("span",{children:[t.jsx("strong",{className:"font-semibold",children:"An update is available."})," Reloading keeps you signed in."]}),t.jsx(C,{size:"sm",variant:"primary",onPress:()=>window.location.reload(),children:"Update now"}),t.jsx(C,{size:"sm",variant:"ghost",onPress:()=>n(!0),children:"Later"})]})})}const ge=200,be=480,H=240,Nt=60,je="otari.dashboard.sidebarWidth",we="otari.dashboard.sidebarCollapsed",de=16,Se="(max-width: 767px)",U=e=>Math.min(be,Math.max(ge,e));function Ct(){return typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia(Se).matches}const _t='a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"])';function Tt(e){return e?Array.from(e.querySelectorAll(_t)).filter(r=>r.offsetParent!==null||r===document.activeElement):[]}function Lt(){if(typeof window>"u")return H;try{const e=window.localStorage.getItem(je),r=e?Number.parseInt(e,10):Number.NaN;return Number.isNaN(r)?H:U(r)}catch{return H}}function It(){if(typeof window>"u")return!1;try{return window.localStorage.getItem(we)==="1"}catch{return!1}}const At=[{key:"home"},{key:"observability",label:"Observability"},{key:"catalog",label:"Catalog"},{key:"access",label:"Access"},{key:"system"}],qt=[{to:"/",section:"home",label:"Overview",end:!0,icon:t.jsxs("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[t.jsx("rect",{x:"3.5",y:"3.5",width:"7",height:"7",rx:"1.5",strokeLinejoin:"round"}),t.jsx("rect",{x:"13.5",y:"3.5",width:"7",height:"7",rx:"1.5",strokeLinejoin:"round"}),t.jsx("rect",{x:"3.5",y:"13.5",width:"7",height:"7",rx:"1.5",strokeLinejoin:"round"}),t.jsx("rect",{x:"13.5",y:"13.5",width:"7",height:"7",rx:"1.5",strokeLinejoin:"round"})]})},{to:"/activity",section:"observability",label:"Activity",icon:t.jsx("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:t.jsx("path",{d:"M3 12h4l2.5-6 4 12 2.5-6H21",strokeLinecap:"round",strokeLinejoin:"round"})})},{to:"/usage",section:"observability",label:"Usage",icon:t.jsx("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:t.jsx("path",{d:"M4 20V10M10 20V4M16 20v-7M22 20H2",strokeLinecap:"round",strokeLinejoin:"round"})})},{to:"/providers",section:"catalog",label:"Providers",icon:t.jsxs("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[t.jsx("rect",{x:"3.5",y:"4.5",width:"17",height:"6",rx:"1.5",strokeLinejoin:"round"}),t.jsx("rect",{x:"3.5",y:"13.5",width:"17",height:"6",rx:"1.5",strokeLinejoin:"round"}),t.jsx("path",{d:"M7 7.5h.01M7 16.5h.01",strokeLinecap:"round",strokeLinejoin:"round"})]})},{to:"/users",section:"access",label:"Users",icon:t.jsxs("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[t.jsx("circle",{cx:"9",cy:"8",r:"3.2",strokeLinejoin:"round"}),t.jsx("path",{d:"M3.5 19a5.5 5.5 0 0 1 11 0",strokeLinecap:"round",strokeLinejoin:"round"}),t.jsx("path",{d:"M16 5.2a3.2 3.2 0 0 1 0 5.6M17.5 19a5.5 5.5 0 0 0-3-4.9",strokeLinecap:"round",strokeLinejoin:"round"})]})},{to:"/keys",section:"access",label:"API keys",icon:t.jsxs("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[t.jsx("circle",{cx:"7.5",cy:"15.5",r:"3.5"}),t.jsx("path",{d:"M10 13l7-7M14 5l3 3M16.5 7.5l2-2",strokeLinecap:"round",strokeLinejoin:"round"})]})},{to:"/budgets",section:"access",label:"Budgets",icon:t.jsxs("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[t.jsx("path",{d:"M3 7.5A1.5 1.5 0 0 1 4.5 6H18a1.5 1.5 0 0 1 1.5 1.5V9",strokeLinejoin:"round"}),t.jsx("rect",{x:"3",y:"7.5",width:"18",height:"12",rx:"1.5",strokeLinejoin:"round"}),t.jsx("path",{d:"M16 13.5h.01",strokeLinecap:"round",strokeLinejoin:"round"}),t.jsx("path",{d:"M21 12v3h-3.5a1.5 1.5 0 0 1 0-3H21z",strokeLinejoin:"round"})]})},{to:"/models",section:"catalog",label:"Models",icon:t.jsxs("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[t.jsx("path",{d:"M12 3l8 4.5v9L12 21l-8-4.5v-9L12 3z",strokeLinejoin:"round"}),t.jsx("path",{d:"M12 12l8-4.5M12 12v9M12 12L4 7.5",strokeLinejoin:"round"})]})},{to:"/aliases",section:"catalog",label:"Aliases",icon:t.jsxs("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[t.jsx("path",{d:"M20.6 13.4L13.4 20.6a2 2 0 0 1-2.8 0l-7-7A2 2 0 0 1 3 12.2V5a2 2 0 0 1 2-2h7.2a2 2 0 0 1 1.4.6l7 7a2 2 0 0 1 0 2.8z",strokeLinejoin:"round"}),t.jsx("circle",{cx:"7.5",cy:"7.5",r:"1.5"})]})},{to:"/tools",section:"system",label:"Tools & Guardrails",icon:t.jsxs("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[t.jsx("path",{d:"M14.7 6.3a4 4 0 0 1 5 5l-8.4 8.4a2 2 0 0 1-2.8 0l-2.2-2.2a2 2 0 0 1 0-2.8z",strokeLinejoin:"round"}),t.jsx("path",{d:"M12 9 5 16",strokeLinecap:"round"})]})},{to:"/settings",section:"system",label:"Settings",icon:t.jsxs("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[t.jsx("circle",{cx:"12",cy:"12",r:"3"}),t.jsx("path",{d:"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z",strokeLinejoin:"round"})]})}];function Rt(){const{logout:e}=Z(),r=a.useRef(null),n=a.useRef(null),s=a.useRef(null),[i,o]=a.useState(Lt),[d,m]=a.useState(It),[p,x]=a.useState(!1),[f,b]=a.useState(Ct),[u,N]=a.useState(!1);a.useEffect(()=>{if(typeof window>"u"||typeof window.matchMedia!="function")return;const l=window.matchMedia(Se),v=j=>{b(j.matches),j.matches||N(!1)};return typeof l.addEventListener=="function"?(l.addEventListener("change",v),()=>l.removeEventListener("change",v)):(l.addListener(v),()=>l.removeListener(v))},[]),a.useEffect(()=>{if(!u)return;const l=v=>{v.key==="Escape"&&N(!1)};return window.addEventListener("keydown",l),()=>window.removeEventListener("keydown",l)},[u]),a.useEffect(()=>{var l,v,j;f&&(u?(l=r.current)==null||l.focus():(v=r.current)!=null&&v.contains(document.activeElement)&&((j=s.current)==null||j.focus()))},[f,u]);const R=a.useCallback(l=>{if(l.key!=="Tab")return;const v=Tt(r.current);if(v.length===0)return;const j=v[0],k=v[v.length-1],D=document.activeElement;l.shiftKey&&(D===j||D===r.current)?(l.preventDefault(),k.focus()):!l.shiftKey&&D===k&&(l.preventDefault(),j.focus())},[]);a.useEffect(()=>{const l=window.setTimeout(()=>{try{window.localStorage.setItem(je,String(Math.round(i)))}catch{}},200);return()=>window.clearTimeout(l)},[i]),a.useEffect(()=>{try{window.localStorage.setItem(we,d?"1":"0")}catch{}},[d]);const Ee=a.useCallback(l=>{l.preventDefault(),l.currentTarget.setPointerCapture(l.pointerId),x(!0)},[]),Pe=a.useCallback(l=>{var j;if(!l.currentTarget.hasPointerCapture(l.pointerId))return;const v=((j=r.current)==null?void 0:j.getBoundingClientRect().left)??0;o(U(l.clientX-v))},[]),Ne=a.useCallback(l=>{l.currentTarget.hasPointerCapture(l.pointerId)&&l.currentTarget.releasePointerCapture(l.pointerId),x(!1)},[]),Ce=a.useCallback(l=>{var v;l.preventDefault(),(v=n.current)==null||v.focus()},[]),_e=a.useCallback(l=>{l.key==="ArrowLeft"?(l.preventDefault(),o(v=>U(v-de))):l.key==="ArrowRight"&&(l.preventDefault(),o(v=>U(v+de)))},[]),Te=d?Nt:i,S=f?!1:d,z=f&&u?!0:void 0;return t.jsxs("div",{className:_("relative flex h-full flex-col overflow-hidden",p&&"cursor-col-resize select-none"),children:[t.jsx("button",{type:"button",inert:z,onClick:Ce,className:"sr-only focus:not-sr-only focus:absolute focus:top-3 focus:left-3 focus:z-50 focus:rounded-lg focus:border focus:border-[var(--otari-brand)] focus:bg-[var(--otari-surface)] focus:px-4 focus:py-2 focus:text-sm focus:font-medium focus:text-[var(--otari-brand-dark)] focus:shadow-md focus:outline-none",children:"Skip to main content"}),t.jsxs("header",{inert:z,className:"flex shrink-0 items-center justify-between border-b border-[var(--otari-line)] bg-[var(--otari-surface)] px-5 py-3",children:[t.jsxs("div",{className:"flex items-center gap-2.5",children:[t.jsx("button",{type:"button",ref:s,onClick:()=>N(l=>!l),"aria-label":u?"Close navigation":"Open navigation","aria-expanded":u,"aria-controls":"app-sidebar",className:"-ml-1 flex h-8 w-8 items-center justify-center rounded-lg text-[var(--otari-muted)] transition-colors hover:bg-[var(--otari-bg)] hover:text-[var(--otari-ink)] md:hidden",children:t.jsx("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5",children:t.jsx("path",{d:"M4 6h16M4 12h16M4 18h16",strokeLinecap:"round",strokeLinejoin:"round"})})}),t.jsx("img",{src:"/favicon.svg",alt:"",className:"h-7 w-7 shrink-0"}),t.jsx("span",{className:"text-base font-semibold text-[var(--otari-ink)]",children:"Otari"})]}),t.jsx(C,{size:"sm",variant:"outline",onPress:e,"aria-label":"Sign out",children:"Sign out"})]}),t.jsx(Pt,{}),t.jsx(et,{}),t.jsx(kt,{}),t.jsxs("div",{className:"flex min-h-0 flex-1",children:[f&&u?t.jsx("div",{"aria-hidden":"true",onClick:()=>N(!1),className:"fixed inset-0 z-30 bg-black/40 md:hidden"}):null,t.jsxs("aside",{ref:r,id:"app-sidebar",role:f?"dialog":void 0,"aria-modal":f&&u?!0:void 0,"aria-label":f?"Navigation":void 0,tabIndex:f?-1:void 0,inert:f&&!u?!0:void 0,onKeyDown:f&&u?R:void 0,style:f?void 0:{width:Te},className:_("flex flex-col border-r border-[var(--otari-line)] bg-[var(--otari-surface)] focus:outline-none",f?_("fixed inset-y-0 left-0 z-40 w-[17rem] shadow-xl transition-transform duration-200",u?"translate-x-0":"-translate-x-full"):_("relative shrink-0",!p&&"transition-[width] duration-150")),children:[t.jsx("button",{type:"button",onClick:()=>m(l=>!l),"aria-label":d?"Expand sidebar":"Collapse sidebar","aria-pressed":d,title:d?"Expand sidebar":"Collapse sidebar",className:"absolute -right-3 top-4 z-30 hidden h-6 w-6 items-center justify-center rounded-full border border-[var(--otari-line)] bg-[var(--otari-surface)] text-[var(--otari-muted)] shadow-sm transition-colors hover:border-[var(--otari-brand)] hover:text-[var(--otari-brand-dark)] md:flex",children:t.jsx("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2.5",className:_("h-3.5 w-3.5 transition-transform",d&&"rotate-180"),children:t.jsx("path",{d:"M15 6l-6 6 6 6",strokeLinecap:"round",strokeLinejoin:"round"})})}),t.jsx("nav",{className:_("flex flex-col py-4",S?"px-2":"px-3"),children:At.map((l,v)=>{const j=qt.filter(k=>k.section===l.key);return j.length===0?null:t.jsxs("div",{className:v>0?"mt-4":void 0,children:[!S&&l.label?t.jsx("div",{className:"px-3 pb-1 text-[11px] font-semibold tracking-wider text-[var(--otari-muted)] uppercase",children:l.label}):null,v>0&&(S||!l.label)?t.jsx("div",{className:"mx-1 mb-2 border-t border-[var(--otari-line)]"}):null,t.jsx("div",{className:"flex flex-col gap-1",children:j.map(k=>t.jsxs(G,{to:k.to,end:k.end,onClick:()=>N(!1),"aria-label":S?k.label:void 0,title:S?k.label:void 0,className:({isActive:D})=>_("flex items-center rounded-lg py-2 text-sm font-medium transition-colors",S?"justify-center px-0":"gap-3 px-3",D?"bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]":"text-[var(--otari-muted)] hover:bg-[var(--otari-bg)] hover:text-[var(--otari-ink)]"),children:[k.icon,S?null:k.label]},k.to))})]},l.key)})}),t.jsxs("div",{className:"mt-auto flex flex-col gap-1 pb-3",children:[t.jsxs(G,{to:"/docs",onClick:()=>N(!1),"aria-label":S?"User guide":void 0,title:S?"User guide":void 0,className:({isActive:l})=>_("flex items-center rounded-lg py-2 text-sm font-medium transition-colors",S?"mx-2 justify-center px-0":"mx-3 gap-3 px-3",l?"bg-[var(--otari-brand-tint)] text-[var(--otari-brand-dark)]":"text-[var(--otari-muted)] hover:bg-[var(--otari-bg)] hover:text-[var(--otari-ink)]"),children:[t.jsxs("svg",{"aria-hidden":"true",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-5 w-5 shrink-0",children:[t.jsx("path",{d:"M12 6.5C10.5 5 8 4.5 4 4.5V18c4 0 6.5.5 8 2 1.5-1.5 4-2 8-2V4.5c-4 0-6.5.5-8 2z",strokeLinejoin:"round"}),t.jsx("path",{d:"M12 6.5V20",strokeLinecap:"round"})]}),S?null:"User guide"]}),t.jsxs("a",{href:"https://otari.ai",target:"_blank",rel:"noreferrer",title:"otari.ai: the hosted Otari gateway",className:_("flex items-center rounded-lg py-2 text-xs font-medium text-[var(--otari-muted)] transition-colors hover:bg-[var(--otari-bg)] hover:text-[var(--otari-brand-dark)]",S?"mx-2 justify-center px-0":"mx-3 gap-2 px-3"),children:[t.jsx("svg",{"aria-hidden":!0,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",className:"h-4 w-4 shrink-0",children:t.jsx("path",{d:"M18 10h-1.26A8 8 0 1 0 9 20h9a5 5 0 0 0 0-10z",strokeLinejoin:"round"})}),S?null:t.jsxs("span",{className:"flex-1",children:["otari.ai ",t.jsx("span",{"aria-hidden":!0,children:"↗"})]})]})]}),d||f?null:t.jsx("div",{role:"separator","aria-orientation":"vertical","aria-label":"Resize sidebar","aria-valuenow":Math.round(i),"aria-valuemin":ge,"aria-valuemax":be,tabIndex:0,onPointerDown:Ee,onPointerMove:Pe,onPointerUp:Ne,onKeyDown:_e,className:_("absolute top-0 right-0 z-10 h-full w-1.5 cursor-col-resize touch-none transition-colors","hover:bg-[var(--otari-brand)] focus-visible:bg-[var(--otari-brand)] focus:outline-none",p?"bg-[var(--otari-brand)]":"bg-transparent")})]}),t.jsx("main",{ref:n,id:"main-content",tabIndex:-1,inert:z,className:"flex-1 overflow-y-auto focus:outline-none",children:t.jsx("div",{className:"mx-auto flex max-w-[1800px] flex-col gap-6 px-4 py-5 md:px-6 md:py-6",children:t.jsx(De,{})})})]})]})}function Dt(){const{login:e}=Z(),[r,n]=a.useState(""),[s,i]=a.useState(null),[o,d]=a.useState(!1),m=async()=>{const p=r.trim();if(!(!p||o)){d(!0),i(null);try{await He(p)?e():i(new Error("Invalid master key."))}catch(x){i(x)}finally{d(!1)}}};return t.jsx("div",{className:"flex min-h-full items-center justify-center p-6",children:t.jsx(I,{className:"w-full max-w-md",children:t.jsxs(I.Content,{className:"flex flex-col gap-5 p-7",children:[t.jsxs("div",{className:"flex flex-col items-center gap-3 text-center",children:[t.jsx("img",{src:"/favicon.svg",alt:"Otari",className:"h-12 w-12"}),t.jsxs("div",{children:[t.jsx("h1",{className:"text-lg font-semibold text-[var(--otari-ink)]",children:"Otari Dashboard"}),t.jsx("p",{className:"mt-1 text-sm text-[var(--otari-muted)]",children:"Sign in with your master key to browse models, set pricing, and manage settings."})]})]}),t.jsxs("form",{className:"flex flex-col gap-4",onSubmit:p=>{p.preventDefault(),m()},children:[t.jsxs(ze,{value:r,onChange:p=>{n(p),s&&i(null)},type:"password",isRequired:!0,className:"flex flex-col gap-1",children:[t.jsx(me,{className:"text-sm font-medium text-[var(--otari-ink)]",children:"Master key"}),t.jsx(fe,{placeholder:"otari-mk-… or your master key",autoFocus:!0,autoComplete:"off"})]}),t.jsxs("details",{className:"text-xs text-[var(--otari-muted)]",children:[t.jsx("summary",{className:"cursor-pointer font-medium text-[var(--otari-brand-dark)]",children:"First run? Where to find your key"}),t.jsxs("p",{className:"mt-2 leading-relaxed",children:["If you did not set ",t.jsx("code",{children:"OTARI_MASTER_KEY"}),", Otari generated one and printed it to the server logs on startup. Look for the line ",t.jsx("code",{children:"Your master key:"})," (for example, run"," ",t.jsx("code",{children:"docker logs "}),") and paste it above."]})]}),t.jsx(bt,{error:s}),t.jsx(C,{type:"submit",variant:"primary",fullWidth:!0,isDisabled:!r.trim()||o,children:o?"Signing in…":"Sign in"})]}),t.jsx("p",{className:"text-center text-xs text-[var(--otari-muted)]",children:"The key is sent once to this gateway and exchanged for a session cookie; it is never stored in the browser."}),t.jsx("div",{className:"border-t border-[var(--otari-line)] pt-4 text-center",children:t.jsx($e,{href:"/welcome",className:"text-sm font-medium text-[var(--otari-brand-dark)]",children:"New to Otari? Open the welcome guide"})})]})})})}const Ot=a.lazy(async()=>({default:(await P(async()=>{const{ActivityPage:e}=await import("./ActivityPage-DIACtZv5.js");return{ActivityPage:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]))).ActivityPage})),Mt=a.lazy(async()=>({default:(await P(async()=>{const{AliasesPage:e}=await import("./AliasesPage-x0NFKgtH.js");return{AliasesPage:e}},__vite__mapDeps([10,1,2,6,4,7,8,11]))).AliasesPage})),Ft=a.lazy(async()=>({default:(await P(async()=>{const{BudgetsPage:e}=await import("./BudgetsPage-D-S9-U_l.js");return{BudgetsPage:e}},__vite__mapDeps([12,1,2,6,4,7,8,11]))).BudgetsPage})),Ut=a.lazy(async()=>({default:(await P(async()=>{const{DocsPage:e}=await import("./DocsPage-BZcIfS8u.js");return{DocsPage:e}},__vite__mapDeps([13,1,2,4]))).DocsPage})),Kt=a.lazy(async()=>({default:(await P(async()=>{const{KeysPage:e}=await import("./KeysPage-CZjqxzex.js");return{KeysPage:e}},__vite__mapDeps([14,1,2,6,4,7,8,11,15]))).KeysPage})),Bt=a.lazy(async()=>({default:(await P(async()=>{const{ModelsPage:e}=await import("./ModelsPage-BkzSZx5b.js");return{ModelsPage:e}},__vite__mapDeps([16,1,2,6,4,8,9]))).ModelsPage})),zt=a.lazy(async()=>({default:(await P(async()=>{const{OverviewIndex:e}=await import("./OverviewPage-BedTU_aZ.js");return{OverviewIndex:e}},__vite__mapDeps([17,1,2,18,5,4,8]))).OverviewIndex})),$t=a.lazy(async()=>({default:(await P(async()=>{const{ProvidersPage:e}=await import("./ProvidersPage-BP60GuZv.js");return{ProvidersPage:e}},__vite__mapDeps([19,1,2,11,4,8]))).ProvidersPage})),Qt=a.lazy(async()=>({default:(await P(async()=>{const{SettingsPage:e}=await import("./SettingsPage-DR0J2MHH.js");return{SettingsPage:e}},__vite__mapDeps([20,1,2,4]))).SettingsPage})),Vt=a.lazy(async()=>({default:(await P(async()=>{const{ToolsGuardrailsPage:e}=await import("./ToolsGuardrailsPage-DiZ1TbOa.js");return{ToolsGuardrailsPage:e}},__vite__mapDeps([21,1,2,4]))).ToolsGuardrailsPage})),Wt=a.lazy(async()=>({default:(await P(async()=>{const{UsagePage:e}=await import("./UsagePage-Ce_jAzFl.js");return{UsagePage:e}},__vite__mapDeps([22,1,2,3,4,5,6,18,7,8,9]))).UsagePage})),Ht=a.lazy(async()=>({default:(await P(async()=>{const{UsersPage:e}=await import("./UsersPage-5kctrw19.js");return{UsersPage:e}},__vite__mapDeps([23,1,2,6,4,7,8,11,15]))).UsersPage}));function E(e){return t.jsx(a.Suspense,{fallback:t.jsx("div",{role:"status",children:"Loading page…"}),children:e})}function Gt(){const{isAuthenticated:e}=Z();return e?t.jsx(Oe,{children:t.jsx(Me,{children:t.jsxs(w,{element:t.jsx(Rt,{}),children:[t.jsx(w,{index:!0,element:E(t.jsx(zt,{}))}),t.jsx(w,{path:"providers",element:E(t.jsx($t,{}))}),t.jsx(w,{path:"keys",element:E(t.jsx(Kt,{}))}),t.jsx(w,{path:"users",element:E(t.jsx(Ht,{}))}),t.jsx(w,{path:"budgets",element:E(t.jsx(Ft,{}))}),t.jsx(w,{path:"activity",element:E(t.jsx(Ot,{}))}),t.jsx(w,{path:"usage",element:E(t.jsx(Wt,{}))}),t.jsx(w,{path:"models",element:E(t.jsx(Bt,{}))}),t.jsx(w,{path:"aliases",element:E(t.jsx(Mt,{}))}),t.jsx(w,{path:"tools",element:E(t.jsx(Vt,{}))}),t.jsx(w,{path:"settings",element:E(t.jsx(Qt,{}))}),t.jsx(w,{path:"docs",element:E(t.jsx(Ut,{}))}),t.jsx(w,{path:"*",element:t.jsx(Fe,{to:"/",replace:!0})})]})})}):t.jsx(Dt,{})}function Jt({children:e}){const[r]=a.useState(()=>new Ae({defaultOptions:{queries:{refetchOnWindowFocus:!1,retry:(n,s)=>s instanceof T&&(s.status===401||s.status===403)?!1:n<2}}}));return t.jsx(qe,{client:r,children:t.jsx(Ye,{children:e})})}const ke=document.getElementById("root");if(!ke)throw new Error("Root element #root not found");Qe.createRoot(ke).render(t.jsx(a.StrictMode,{children:t.jsx(Jt,{children:t.jsx(Gt,{})})}));export{ur as $,kr as A,Jr as B,ln as C,Er as D,bt as E,cn as F,gt as G,Yr as H,jt as I,at as J,Gr as K,nr as L,on as M,ir as N,en as O,nn as P,Xr as Q,sn as R,tn as S,rn as T,Hr as U,yt as V,pt as W,lr as X,dr as Y,fr as Z,it as _,_r as a,or as a0,cr as a1,ar as a2,sr as a3,hr as a4,Pr as a5,Nr as a6,Cr as a7,gr as a8,mr as a9,br as aa,jr as ab,wr as ac,Zr as ad,Br as ae,Ur as af,zr as b,$r as c,Wr as d,Qr as e,Vr as f,un as g,rr as h,vr as i,pr as j,yr as k,qr as l,Dr as m,Or as n,Mr as o,Kr as p,an as q,Rr as r,Lr as s,Ir as t,Fr as u,Ar as v,Tr as w,tr as x,Sr as y,xr as z}; diff --git a/src/gateway/static/dashboard/index.html b/src/gateway/static/dashboard/index.html index c90d8c84..e4ff701b 100644 --- a/src/gateway/static/dashboard/index.html +++ b/src/gateway/static/dashboard/index.html @@ -6,7 +6,7 @@ Otari Dashboard - + diff --git a/web/src/pages/ActivityPage.tsx b/web/src/pages/ActivityPage.tsx index 51a216db..42c8e461 100644 --- a/web/src/pages/ActivityPage.tsx +++ b/web/src/pages/ActivityPage.tsx @@ -461,12 +461,16 @@ export function ActivityPage() { ); }; + // Refetch every window-scoped query (see the UsagePage refresh note): the + // model typeahead summary would otherwise stay on cached data whenever the + // re-anchored window resolves to the same query key. const refresh = () => { setWin(resolveWindow(range, startParam, endParam)); setExtentWin(resolveWindow(range, "", "")); void usage.refetch(); void count.refetch(); void contextSummary.refetch(); + void modelSummary.refetch(); }; // A rolling preset clears any explicit bounds; a timeline selection sets them diff --git a/web/src/pages/UsagePage.tsx b/web/src/pages/UsagePage.tsx index 3b4c1f4d..3519f2b5 100644 --- a/web/src/pages/UsagePage.tsx +++ b/web/src/pages/UsagePage.tsx @@ -551,12 +551,20 @@ export function UsagePage() { setCustomEnd(endIso); }; + // Refetch every window-scoped query, not just the headline summary: in custom + // mode the query keys do not change, so anything left out would silently stay + // on cached data after an explicit refresh. `previous` is guarded because + // refetch() ignores `enabled` and would fire a pointless request. const refresh = () => { if (!customMode) { setStartDate(isoAgo(preset.seconds ?? 0)); } void summary.refetch(); void contextSummary.refetch(); + void modelSuggest.refetch(); + if (previousFilters !== null) { + void previous.refetch(); + } }; // Drill from a breakdown row into the Activity log, pre-filtering on the picked