llm-simple-router 0.10.4 → 0.10.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/core/monitor/request-tracker.d.ts +1 -0
  2. package/dist/core/monitor/request-tracker.js +42 -4
  3. package/dist/index.d.ts +1 -0
  4. package/dist/index.js +1 -0
  5. package/frontend-dist/assets/{CardContent-B3NpaDJW.js → CardContent-CkdwrZW4.js} +1 -1
  6. package/frontend-dist/assets/{CardTitle-C-cyX3iO.js → CardTitle-DSy7RCiB.js} +1 -1
  7. package/frontend-dist/assets/{Checkbox-Gyk5KBde.js → Checkbox-C3NmNtqa.js} +1 -1
  8. package/frontend-dist/assets/{CollapsibleContent-DMDLLq9x.js → CollapsibleContent-DBzDxLSb.js} +1 -1
  9. package/frontend-dist/assets/{CollapsibleTrigger-Cuf_Ec1W.js → CollapsibleTrigger-B2f-xQJ0.js} +1 -1
  10. package/frontend-dist/assets/{Dashboard-CAtXlJc5.js → Dashboard-D8wX4CUe.js} +1 -1
  11. package/frontend-dist/assets/{Input-y93GdDnC.js → Input-CWz3gSq7.js} +1 -1
  12. package/frontend-dist/assets/{Label-DhDyFy2K.js → Label-DtNVUGfD.js} +1 -1
  13. package/frontend-dist/assets/{Login-B0Wzgfpt.js → Login-CWveR_5r.js} +1 -1
  14. package/frontend-dist/assets/{Logs-CsEVfnaw.js → Logs-Bi1whdhz.js} +1 -1
  15. package/frontend-dist/assets/{MappingEntryEditor--PH4opRr.js → MappingEntryEditor-BRm2vENX.js} +1 -1
  16. package/frontend-dist/assets/{ModelCard-DqPMwc7c.js → ModelCard-7k6e0d6o.js} +1 -1
  17. package/frontend-dist/assets/{ModelMappings-BJdLraaJ.js → ModelMappings-BA2biFmT.js} +1 -1
  18. package/frontend-dist/assets/{Monitor-L-kxM94E.js → Monitor-B0ZTNvv5.js} +1 -1
  19. package/frontend-dist/assets/{Providers-Cy9Sf_PQ.js → Providers-62LJNLRi.js} +1 -1
  20. package/frontend-dist/assets/{ProxyEnhancement-BMqjyzYh.js → ProxyEnhancement-dcYVsc3f.js} +1 -1
  21. package/frontend-dist/assets/{QuickSetup-DlGBDNqN.js → QuickSetup-CRcUhnmK.js} +1 -1
  22. package/frontend-dist/assets/{RetryRules-DgQ5Vys1.js → RetryRules-B-Yaery1.js} +1 -1
  23. package/frontend-dist/assets/{RouterKeys-2mb13vx1.js → RouterKeys-HMyzbiSY.js} +1 -1
  24. package/frontend-dist/assets/{RovingFocusItem-BiL81wTl.js → RovingFocusItem-BLxXLvHz.js} +1 -1
  25. package/frontend-dist/assets/{Schedules-Rj1ujFuY.js → Schedules-DuXBLzKL.js} +1 -1
  26. package/frontend-dist/assets/{Settings-CAZpS-nE.js → Settings--oVZQg3A.js} +1 -1
  27. package/frontend-dist/assets/{Setup-DPhGJve7.js → Setup-DCtJiJxI.js} +1 -1
  28. package/frontend-dist/assets/{Switch-D0zRSMEx.js → Switch-Cvlk-GzL.js} +1 -1
  29. package/frontend-dist/assets/{TooltipTrigger-R37E-Tih.js → TooltipTrigger-Caej0jjH.js} +1 -1
  30. package/frontend-dist/assets/{TransformRulesForm-DngqhgRH.js → TransformRulesForm-kWP-wmEh.js} +1 -1
  31. package/frontend-dist/assets/{UnifiedRequestDialog-CxKfPeEb.js → UnifiedRequestDialog-Vwxh-lNJ.js} +1 -1
  32. package/frontend-dist/assets/{VisuallyHiddenInput-CRpwrr9A.js → VisuallyHiddenInput-DVhdgqSs.js} +1 -1
  33. package/frontend-dist/assets/{button-BQGfqOaD.js → button--Qf6nmZk.js} +2 -2
  34. package/frontend-dist/assets/{copy-BGvRQjGW.js → copy-DBByuQcn.js} +1 -1
  35. package/frontend-dist/assets/{dialog-J03VLwvc.js → dialog-MkZTr6jd.js} +1 -1
  36. package/frontend-dist/assets/{index-B22b454x.js → index-Bg5CP0c1.js} +2 -2
  37. package/frontend-dist/assets/{trash-2-Dtaa0BOA.js → trash-2-C1sEBLn-.js} +1 -1
  38. package/frontend-dist/assets/{useClipboard-Doiae-Ms.js → useClipboard-BQ-_hkN0.js} +1 -1
  39. package/frontend-dist/assets/{useLogRetention-BjZhZJaf.js → useLogRetention-PhhUFWsW.js} +1 -1
  40. package/frontend-dist/index.html +2 -2
  41. package/package.json +1 -1
@@ -28,6 +28,7 @@ export declare class RequestTracker {
28
28
  private streamContentTimer;
29
29
  private killCallbacks;
30
30
  private killedRequests;
31
+ private completedDetails;
31
32
  /** Visible for testing */
32
33
  readonly statsAggregator: StatsAggregator;
33
34
  readonly runtimeCollector: RuntimeCollector;
@@ -20,6 +20,7 @@ export class RequestTracker {
20
20
  streamContentTimer = null;
21
21
  killCallbacks = new Map();
22
22
  killedRequests = new Set();
23
+ completedDetails = new Map();
23
24
  /** Visible for testing */
24
25
  statsAggregator;
25
26
  runtimeCollector;
@@ -105,8 +106,20 @@ export class RequestTracker {
105
106
  this.statsAggregator.recordLatency(latency);
106
107
  this.statsAggregator.recordRequest(req.providerId, req.providerName, statusCode, req.retryCount > 0, false);
107
108
  this.statsAggregator.recordProviderLatency(req.providerId, latency);
109
+ // 分离大字段到 completedDetails,recentCompleted 仅保留摘要
110
+ const { clientRequest, upstreamRequest, ...rest } = req;
111
+ if (clientRequest !== undefined || upstreamRequest !== undefined) {
112
+ this.completedDetails.set(id, { clientRequest, upstreamRequest, completedAt: now });
113
+ // completedDetails 容量保护:超过上限时移除最早条目
114
+ // Map 按插入顺序迭代,complete() 按时间顺序调用,首个 key 即最旧
115
+ if (this.completedDetails.size > RECENT_COMPLETED_MAX) {
116
+ const oldestKey = this.completedDetails.keys().next().value;
117
+ if (oldestKey !== undefined)
118
+ this.completedDetails.delete(oldestKey);
119
+ }
120
+ }
108
121
  const completed = {
109
- ...req,
122
+ ...rest,
110
123
  status: wasKilled ? "failed" : result.status,
111
124
  completedAt: now,
112
125
  attempts: result.attempts ?? req.attempts,
@@ -151,7 +164,18 @@ export class RequestTracker {
151
164
  }
152
165
  /** Public alias for API endpoint use — returns full request data including clientRequest */
153
166
  getRequestById(id) {
154
- return this.get(id);
167
+ // 1. 先从 activeMap 查找(pending 请求,完整数据)
168
+ const active = this.activeMap.get(id);
169
+ if (active)
170
+ return active;
171
+ // 2. 从 recentCompleted 查找摘要,合并 completedDetails
172
+ const completed = this.recentCompleted.find((r) => r.id === id);
173
+ if (!completed)
174
+ return undefined;
175
+ const details = this.completedDetails.get(id);
176
+ if (!details)
177
+ return completed;
178
+ return { ...completed, clientRequest: details.clientRequest, upstreamRequest: details.upstreamRequest };
155
179
  }
156
180
  /** 注册请求的终止回调,由 orchestrator 在请求开始时调用 */
157
181
  registerKillCallback(id, callback) {
@@ -213,7 +237,11 @@ export class RequestTracker {
213
237
  }
214
238
  /** 向单个客户端发送当前活跃请求快照(保留 clientRequest 以便前端即时展示) */
215
239
  sendInitialSnapshot(client) {
216
- const active = this.getActive();
240
+ const active = this.getActive().map((req) => {
241
+ const copy = { ...req };
242
+ delete copy.upstreamRequest;
243
+ return copy;
244
+ });
217
245
  const msg = `event: request_update\ndata: ${JSON.stringify(active)}\n\n`;
218
246
  try {
219
247
  if (!client.writableEnded)
@@ -280,12 +308,14 @@ export class RequestTracker {
280
308
  payload = data.map((req) => {
281
309
  const copy = { ...req };
282
310
  delete copy.clientRequest;
311
+ delete copy.upstreamRequest;
283
312
  return copy;
284
313
  });
285
314
  }
286
315
  else if ((event === "request_complete" || event === "request_start") && data && typeof data === "object") {
287
316
  const copy = { ...data };
288
317
  delete copy.clientRequest;
318
+ delete copy.upstreamRequest;
289
319
  payload = copy;
290
320
  }
291
321
  const msg = `event: ${event}\ndata: ${JSON.stringify(payload)}\n\n`;
@@ -327,7 +357,15 @@ export class RequestTracker {
327
357
  break;
328
358
  }
329
359
  }
330
- this.recentCompleted = this.recentCompleted.slice(0, Math.min(i, RECENT_COMPLETED_MAX));
360
+ // 收集被 slice 丢弃的条目 ID,同步清理 completedDetails
361
+ const trimmed = this.recentCompleted.slice(0, Math.min(i, RECENT_COMPLETED_MAX));
362
+ const trimmedIds = new Set(trimmed.map((r) => r.id));
363
+ for (const entry of this.recentCompleted) {
364
+ if (!trimmedIds.has(entry.id)) {
365
+ this.completedDetails.delete(entry.id);
366
+ }
367
+ }
368
+ this.recentCompleted = trimmed;
331
369
  }
332
370
  /** 最终一致性兜底:清理异常残留的 active 条目 */
333
371
  cleanupStaleActive() {
package/dist/index.d.ts CHANGED
@@ -20,6 +20,7 @@ export declare function buildApp(options?: AppOptions): Promise<{
20
20
  app: FastifyInstance;
21
21
  db: Database.Database;
22
22
  usageWindowTracker: UsageWindowTracker;
23
+ tracker: RequestTracker;
23
24
  close: () => Promise<void>;
24
25
  }>;
25
26
  export declare function main(): Promise<void>;
package/dist/index.js CHANGED
@@ -363,6 +363,7 @@ export async function buildApp(options) {
363
363
  app,
364
364
  db,
365
365
  usageWindowTracker,
366
+ tracker,
366
367
  close,
367
368
  };
368
369
  }
@@ -1 +1 @@
1
- import{Bt as e,Ht as t,Z as n,et as r,ft as i,ht as a,r as o}from"./button-BQGfqOaD.js";var s=[`data-size`],c=r({__name:`Card`,props:{class:{type:[Boolean,null,String,Object,Array]},size:{default:`default`}},setup(r){let c=r;return(l,u)=>(i(),n(`div`,{"data-slot":`card`,"data-size":r.size,class:t(e(o)(`ring-foreground/10 bg-card text-card-foreground gap-4 overflow-hidden rounded-lg py-4 text-sm ring-1 has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:gap-3 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-lg *:[img:last-child]:rounded-b-lg group/card flex flex-col`,c.class))},[a(l.$slots,`default`)],10,s))}}),l=r({__name:`CardContent`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(r){let s=r;return(r,c)=>(i(),n(`div`,{"data-slot":`card-content`,class:t(e(o)(`px-4 group-data-[size=sm]/card:px-3`,s.class))},[a(r.$slots,`default`)],2))}});export{c as n,l as t};
1
+ import{Bt as e,Ht as t,Z as n,et as r,ft as i,ht as a,r as o}from"./button--Qf6nmZk.js";var s=[`data-size`],c=r({__name:`Card`,props:{class:{type:[Boolean,null,String,Object,Array]},size:{default:`default`}},setup(r){let c=r;return(l,u)=>(i(),n(`div`,{"data-slot":`card`,"data-size":r.size,class:t(e(o)(`ring-foreground/10 bg-card text-card-foreground gap-4 overflow-hidden rounded-lg py-4 text-sm ring-1 has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:gap-3 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-lg *:[img:last-child]:rounded-b-lg group/card flex flex-col`,c.class))},[a(l.$slots,`default`)],10,s))}}),l=r({__name:`CardContent`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(r){let s=r;return(r,c)=>(i(),n(`div`,{"data-slot":`card-content`,class:t(e(o)(`px-4 group-data-[size=sm]/card:px-3`,s.class))},[a(r.$slots,`default`)],2))}});export{c as n,l as t};
@@ -1 +1 @@
1
- import{Bt as e,Ht as t,Z as n,et as r,ft as i,ht as a,r as o}from"./button-BQGfqOaD.js";var s=r({__name:`CardHeader`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(r){let s=r;return(r,c)=>(i(),n(`div`,{"data-slot":`card-header`,class:t(e(o)(`gap-1 rounded-t-xl px-4 group-data-[size=sm]/card:px-3 [.border-b]:pb-4 group-data-[size=sm]/card:[.border-b]:pb-3 group/card-header @container/card-header grid auto-rows-min items-start has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto]`,s.class))},[a(r.$slots,`default`)],2))}}),c=r({__name:`CardTitle`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(r){let s=r;return(r,c)=>(i(),n(`div`,{"data-slot":`card-title`,class:t(e(o)(`text-base leading-snug font-medium group-data-[size=sm]/card:text-sm cn-font-heading`,s.class))},[a(r.$slots,`default`)],2))}});export{s as n,c as t};
1
+ import{Bt as e,Ht as t,Z as n,et as r,ft as i,ht as a,r as o}from"./button--Qf6nmZk.js";var s=r({__name:`CardHeader`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(r){let s=r;return(r,c)=>(i(),n(`div`,{"data-slot":`card-header`,class:t(e(o)(`gap-1 rounded-t-xl px-4 group-data-[size=sm]/card:px-3 [.border-b]:pb-4 group-data-[size=sm]/card:[.border-b]:pb-3 group/card-header @container/card-header grid auto-rows-min items-start has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto]`,s.class))},[a(r.$slots,`default`)],2))}}),c=r({__name:`CardTitle`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(r){let s=r;return(r,c)=>(i(),n(`div`,{"data-slot":`card-title`,class:t(e(o)(`text-base leading-snug font-medium group-data-[size=sm]/card:text-sm cn-font-heading`,s.class))},[a(r.$slots,`default`)],2))}});export{s as n,c as t};
@@ -1 +1 @@
1
- import{$ as e,Bt as t,Tt as n,U as r,Ut as i,W as a,X as o,Y as s,_t as c,et as l,ft as u,ht as d,i as f,m as p,nt as m,o as h,q as g,r as _,st as v,x as y}from"./button-BQGfqOaD.js";import{t as b}from"./VisuallyHiddenInput-CRpwrr9A.js";import{t as x}from"./RovingFocusItem-BiL81wTl.js";import{B as S,G as C,H as w,L as T,Y as E,q as D,ut as O}from"./index-B22b454x.js";function k(e,t){return C(e)?!1:Array.isArray(e)?e.some(e=>E(e,t)):E(e,t)}var[A,j]=D(`CheckboxGroupRoot`);function M(e){return e===`indeterminate`}function N(e){return M(e)?`indeterminate`:e?`checked`:`unchecked`}var[P,F]=D(`CheckboxRoot`),I=l({inheritAttrs:!1,__name:`CheckboxRoot`,props:{defaultValue:{type:null,required:!1},modelValue:{type:null,required:!1,default:void 0},disabled:{type:Boolean,required:!1},value:{type:null,required:!1,default:`on`},id:{type:String,required:!1},trueValue:{type:null,required:!1,default:()=>!0},falseValue:{type:null,required:!1,default:()=>!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`button`},name:{type:String,required:!1},required:{type:Boolean,required:!1}},emits:[`update:modelValue`],setup(e,{emit:i}){let l=e,m=i,{forwardRef:_,currentElement:y}=h(),S=A(null),T=p(l,`modelValue`,m,{defaultValue:l.defaultValue??l.falseValue,passive:l.modelValue===void 0}),D=g(()=>S?.disabled.value||l.disabled),O=g(()=>E(T.value,l.trueValue)),j=g(()=>C(S?.modelValue.value)?T.value===`indeterminate`?`indeterminate`:O.value:k(S.modelValue.value,l.value));function P(){if(C(S?.modelValue.value))T.value===`indeterminate`?T.value=l.trueValue:T.value=O.value?l.falseValue:l.trueValue;else{let e=[...S.modelValue.value||[]];if(k(e,l.value)){let t=e.findIndex(e=>E(e,l.value));e.splice(t,1)}else e.push(l.value);S.modelValue.value=e}}let I=w(y),L=g(()=>l.id&&y.value?document.querySelector(`[for="${l.id}"]`)?.innerText:void 0);return F({disabled:D,state:j}),(e,i)=>(u(),s(c(t(S)?.rovingFocus.value?t(x):t(f)),v(e.$attrs,{id:e.id,ref:t(_),role:`checkbox`,"as-child":e.asChild,as:e.as,type:e.as===`button`?`button`:void 0,"aria-checked":t(M)(j.value)?`mixed`:j.value,"aria-required":e.required,"aria-label":e.$attrs[`aria-label`]||L.value,"data-state":t(N)(j.value),"data-disabled":D.value?``:void 0,disabled:D.value,focusable:t(S)?.rovingFocus.value?!D.value:void 0,onKeydown:r(a(()=>{},[`prevent`]),[`enter`]),onClick:P}),{default:n(()=>[d(e.$slots,`default`,{modelValue:t(T),state:j.value}),t(I)&&e.name&&!t(S)?(u(),s(t(b),{key:0,type:`checkbox`,checked:!!j.value,name:e.name,value:e.value,disabled:D.value,required:e.required},null,8,[`checked`,`name`,`value`,`disabled`,`required`])):o(`v-if`,!0)]),_:3},16,[`id`,`as-child`,`as`,`type`,`aria-checked`,`aria-required`,`aria-label`,`data-state`,`data-disabled`,`disabled`,`focusable`,`onKeydown`]))}}),L=l({__name:`CheckboxIndicator`,props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`span`}},setup(r){let{forwardRef:i}=h(),a=P();return(r,o)=>(u(),s(t(T),{present:r.forceMount||t(M)(t(a).state.value)||t(a).state.value===!0},{default:n(()=>[e(t(f),v({ref:t(i),"data-state":t(N)(t(a).state.value),"data-disabled":t(a).disabled.value?``:void 0,style:{pointerEvents:`none`},"as-child":r.asChild,as:r.as},r.$attrs),{default:n(()=>[d(r.$slots,`default`)]),_:3},16,[`data-state`,`data-disabled`,`as-child`,`as`])]),_:3},8,[`present`]))}}),R=l({__name:`Checkbox`,props:{defaultValue:{},modelValue:{},disabled:{type:Boolean},value:{},id:{},trueValue:{},falseValue:{},asChild:{type:Boolean},as:{},name:{},required:{type:Boolean},class:{type:[Boolean,null,String,Object,Array]}},emits:[`update:modelValue`],setup(r,{emit:a}){let o=r,c=a,l=S(y(o,`class`),c);return(r,a)=>(u(),s(t(I),v({"data-slot":`checkbox`},t(l),{class:t(_)(`border-input dark:bg-input/30 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary data-[state=checked]:border-primary aria-invalid:aria-checked:border-primary aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 flex size-4 items-center justify-center rounded-md border transition-colors group-has-disabled/field:opacity-50 focus-visible:ring-3 aria-invalid:ring-3 peer relative shrink-0 outline-none after:absolute after:-inset-x-3 after:-inset-y-2 disabled:cursor-not-allowed disabled:opacity-50`,o.class)}),{default:n(a=>[e(t(L),{"data-slot":`checkbox-indicator`,class:`[&>svg]:size-3.5 grid place-content-center text-current transition-none`},{default:n(()=>[d(r.$slots,`default`,i(m(a)),()=>[e(t(O))])]),_:2},1024)]),_:3},16,[`class`]))}});export{R as t};
1
+ import{$ as e,Bt as t,Tt as n,U as r,Ut as i,W as a,X as o,Y as s,_t as c,et as l,ft as u,ht as d,i as f,m as p,nt as m,o as h,q as g,r as _,st as v,x as y}from"./button--Qf6nmZk.js";import{t as b}from"./VisuallyHiddenInput-DVhdgqSs.js";import{t as x}from"./RovingFocusItem-BLxXLvHz.js";import{B as S,G as C,H as w,L as T,Y as E,q as D,ut as O}from"./index-Bg5CP0c1.js";function k(e,t){return C(e)?!1:Array.isArray(e)?e.some(e=>E(e,t)):E(e,t)}var[A,j]=D(`CheckboxGroupRoot`);function M(e){return e===`indeterminate`}function N(e){return M(e)?`indeterminate`:e?`checked`:`unchecked`}var[P,F]=D(`CheckboxRoot`),I=l({inheritAttrs:!1,__name:`CheckboxRoot`,props:{defaultValue:{type:null,required:!1},modelValue:{type:null,required:!1,default:void 0},disabled:{type:Boolean,required:!1},value:{type:null,required:!1,default:`on`},id:{type:String,required:!1},trueValue:{type:null,required:!1,default:()=>!0},falseValue:{type:null,required:!1,default:()=>!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`button`},name:{type:String,required:!1},required:{type:Boolean,required:!1}},emits:[`update:modelValue`],setup(e,{emit:i}){let l=e,m=i,{forwardRef:_,currentElement:y}=h(),S=A(null),T=p(l,`modelValue`,m,{defaultValue:l.defaultValue??l.falseValue,passive:l.modelValue===void 0}),D=g(()=>S?.disabled.value||l.disabled),O=g(()=>E(T.value,l.trueValue)),j=g(()=>C(S?.modelValue.value)?T.value===`indeterminate`?`indeterminate`:O.value:k(S.modelValue.value,l.value));function P(){if(C(S?.modelValue.value))T.value===`indeterminate`?T.value=l.trueValue:T.value=O.value?l.falseValue:l.trueValue;else{let e=[...S.modelValue.value||[]];if(k(e,l.value)){let t=e.findIndex(e=>E(e,l.value));e.splice(t,1)}else e.push(l.value);S.modelValue.value=e}}let I=w(y),L=g(()=>l.id&&y.value?document.querySelector(`[for="${l.id}"]`)?.innerText:void 0);return F({disabled:D,state:j}),(e,i)=>(u(),s(c(t(S)?.rovingFocus.value?t(x):t(f)),v(e.$attrs,{id:e.id,ref:t(_),role:`checkbox`,"as-child":e.asChild,as:e.as,type:e.as===`button`?`button`:void 0,"aria-checked":t(M)(j.value)?`mixed`:j.value,"aria-required":e.required,"aria-label":e.$attrs[`aria-label`]||L.value,"data-state":t(N)(j.value),"data-disabled":D.value?``:void 0,disabled:D.value,focusable:t(S)?.rovingFocus.value?!D.value:void 0,onKeydown:r(a(()=>{},[`prevent`]),[`enter`]),onClick:P}),{default:n(()=>[d(e.$slots,`default`,{modelValue:t(T),state:j.value}),t(I)&&e.name&&!t(S)?(u(),s(t(b),{key:0,type:`checkbox`,checked:!!j.value,name:e.name,value:e.value,disabled:D.value,required:e.required},null,8,[`checked`,`name`,`value`,`disabled`,`required`])):o(`v-if`,!0)]),_:3},16,[`id`,`as-child`,`as`,`type`,`aria-checked`,`aria-required`,`aria-label`,`data-state`,`data-disabled`,`disabled`,`focusable`,`onKeydown`]))}}),L=l({__name:`CheckboxIndicator`,props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`span`}},setup(r){let{forwardRef:i}=h(),a=P();return(r,o)=>(u(),s(t(T),{present:r.forceMount||t(M)(t(a).state.value)||t(a).state.value===!0},{default:n(()=>[e(t(f),v({ref:t(i),"data-state":t(N)(t(a).state.value),"data-disabled":t(a).disabled.value?``:void 0,style:{pointerEvents:`none`},"as-child":r.asChild,as:r.as},r.$attrs),{default:n(()=>[d(r.$slots,`default`)]),_:3},16,[`data-state`,`data-disabled`,`as-child`,`as`])]),_:3},8,[`present`]))}}),R=l({__name:`Checkbox`,props:{defaultValue:{},modelValue:{},disabled:{type:Boolean},value:{},id:{},trueValue:{},falseValue:{},asChild:{type:Boolean},as:{},name:{},required:{type:Boolean},class:{type:[Boolean,null,String,Object,Array]}},emits:[`update:modelValue`],setup(r,{emit:a}){let o=r,c=a,l=S(y(o,`class`),c);return(r,a)=>(u(),s(t(I),v({"data-slot":`checkbox`},t(l),{class:t(_)(`border-input dark:bg-input/30 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary data-[state=checked]:border-primary aria-invalid:aria-checked:border-primary aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 flex size-4 items-center justify-center rounded-md border transition-colors group-has-disabled/field:opacity-50 focus-visible:ring-3 aria-invalid:ring-3 peer relative shrink-0 outline-none after:absolute after:-inset-x-3 after:-inset-y-2 disabled:cursor-not-allowed disabled:opacity-50`,o.class)}),{default:n(a=>[e(t(L),{"data-slot":`checkbox-indicator`,class:`[&>svg]:size-3.5 grid place-content-center text-current transition-none`},{default:n(()=>[d(r.$slots,`default`,i(m(a)),()=>[e(t(O))])]),_:2},1024)]),_:3},16,[`class`]))}});export{R as t};
@@ -1 +1 @@
1
- import{$ as e,Bt as t,Nt as n,Rt as r,St as i,Tt as a,Ut as o,X as s,Y as c,ct as l,d as u,et as d,ft as f,ht as p,i as m,m as h,nt as g,o as _,q as v,st as y,ut as b}from"./button-BQGfqOaD.js";import{B as x,L as S,q as C,z as w}from"./index-B22b454x.js";var[T,E]=C(`CollapsibleRoot`),D=d({__name:`CollapsibleRoot`,props:{defaultOpen:{type:Boolean,required:!1,default:!1},open:{type:Boolean,required:!1,default:void 0},disabled:{type:Boolean,required:!1},unmountOnHide:{type:Boolean,required:!1,default:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:[`update:open`],setup(e,{expose:n,emit:i}){let o=e,s=h(o,`open`,i,{defaultValue:o.defaultOpen,passive:o.open===void 0}),{disabled:l,unmountOnHide:u}=r(o);return E({contentId:``,disabled:l,open:s,unmountOnHide:u,onOpenToggle:()=>{l.value||(s.value=!s.value)}}),n({open:s}),_(),(e,n)=>(f(),c(t(m),{as:e.as,"as-child":o.asChild,"data-state":t(s)?`open`:`closed`,"data-disabled":t(l)?``:void 0},{default:a(()=>[p(e.$slots,`default`,{open:t(s)})]),_:3},8,[`as`,`as-child`,`data-state`,`data-disabled`]))}}),O=d({inheritAttrs:!1,__name:`CollapsibleContent`,props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:[`contentFound`],setup(r,{emit:o}){let d=r,h=o,g=T();g.contentId||=w(void 0,`reka-collapsible-content`);let x=n(),{forwardRef:C,currentElement:E}=_(),D=n(0),O=n(0),k=v(()=>g.open.value),A=n(k.value),j=n();i(()=>[k.value,x.value?.present],async()=>{await l();let e=E.value;if(!e)return;j.value=j.value||{transitionDuration:e.style.transitionDuration,animationName:e.style.animationName},e.style.transitionDuration=`0s`,e.style.animationName=`none`;let t=e.getBoundingClientRect();O.value=t.height,D.value=t.width,A.value||(e.style.transitionDuration=j.value.transitionDuration,e.style.animationName=j.value.animationName)},{immediate:!0});let M=v(()=>A.value&&g.open.value);return b(()=>{requestAnimationFrame(()=>{A.value=!1})}),u(E,`beforematch`,e=>{requestAnimationFrame(()=>{g.onOpenToggle(),h(`contentFound`)})}),(n,r)=>(f(),c(t(S),{ref_key:`presentRef`,ref:x,present:n.forceMount||t(g).open.value,"force-mount":!0},{default:a(({present:r})=>[e(t(m),y(n.$attrs,{id:t(g).contentId,ref:t(C),"as-child":d.asChild,as:n.as,hidden:r?void 0:t(g).unmountOnHide.value?``:`until-found`,"data-state":M.value?void 0:t(g).open.value?`open`:`closed`,"data-disabled":t(g).disabled?.value?``:void 0,style:{"--reka-collapsible-content-height":`${O.value}px`,"--reka-collapsible-content-width":`${D.value}px`}}),{default:a(()=>[!t(g).unmountOnHide.value||r?p(n.$slots,`default`,{key:0}):s(`v-if`,!0)]),_:2},1040,[`id`,`as-child`,`as`,`hidden`,`data-state`,`data-disabled`,`style`])]),_:3},8,[`present`]))}}),k=d({__name:`Collapsible`,props:{defaultOpen:{type:Boolean},open:{type:Boolean},disabled:{type:Boolean},unmountOnHide:{type:Boolean},asChild:{type:Boolean},as:{}},emits:[`update:open`],setup(e,{emit:n}){let r=x(e,n);return(e,n)=>(f(),c(t(D),y({"data-slot":`collapsible`},t(r)),{default:a(t=>[p(e.$slots,`default`,o(g(t)))]),_:3},16))}}),A=d({__name:`CollapsibleContent`,props:{forceMount:{type:Boolean},asChild:{type:Boolean},as:{}},setup(e){let n=e;return(e,r)=>(f(),c(t(O),y({"data-slot":`collapsible-content`},n),{default:a(()=>[p(e.$slots,`default`)]),_:3},16))}});export{k as n,T as r,A as t};
1
+ import{$ as e,Bt as t,Nt as n,Rt as r,St as i,Tt as a,Ut as o,X as s,Y as c,ct as l,d as u,et as d,ft as f,ht as p,i as m,m as h,nt as g,o as _,q as v,st as y,ut as b}from"./button--Qf6nmZk.js";import{B as x,L as S,q as C,z as w}from"./index-Bg5CP0c1.js";var[T,E]=C(`CollapsibleRoot`),D=d({__name:`CollapsibleRoot`,props:{defaultOpen:{type:Boolean,required:!1,default:!1},open:{type:Boolean,required:!1,default:void 0},disabled:{type:Boolean,required:!1},unmountOnHide:{type:Boolean,required:!1,default:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:[`update:open`],setup(e,{expose:n,emit:i}){let o=e,s=h(o,`open`,i,{defaultValue:o.defaultOpen,passive:o.open===void 0}),{disabled:l,unmountOnHide:u}=r(o);return E({contentId:``,disabled:l,open:s,unmountOnHide:u,onOpenToggle:()=>{l.value||(s.value=!s.value)}}),n({open:s}),_(),(e,n)=>(f(),c(t(m),{as:e.as,"as-child":o.asChild,"data-state":t(s)?`open`:`closed`,"data-disabled":t(l)?``:void 0},{default:a(()=>[p(e.$slots,`default`,{open:t(s)})]),_:3},8,[`as`,`as-child`,`data-state`,`data-disabled`]))}}),O=d({inheritAttrs:!1,__name:`CollapsibleContent`,props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:[`contentFound`],setup(r,{emit:o}){let d=r,h=o,g=T();g.contentId||=w(void 0,`reka-collapsible-content`);let x=n(),{forwardRef:C,currentElement:E}=_(),D=n(0),O=n(0),k=v(()=>g.open.value),A=n(k.value),j=n();i(()=>[k.value,x.value?.present],async()=>{await l();let e=E.value;if(!e)return;j.value=j.value||{transitionDuration:e.style.transitionDuration,animationName:e.style.animationName},e.style.transitionDuration=`0s`,e.style.animationName=`none`;let t=e.getBoundingClientRect();O.value=t.height,D.value=t.width,A.value||(e.style.transitionDuration=j.value.transitionDuration,e.style.animationName=j.value.animationName)},{immediate:!0});let M=v(()=>A.value&&g.open.value);return b(()=>{requestAnimationFrame(()=>{A.value=!1})}),u(E,`beforematch`,e=>{requestAnimationFrame(()=>{g.onOpenToggle(),h(`contentFound`)})}),(n,r)=>(f(),c(t(S),{ref_key:`presentRef`,ref:x,present:n.forceMount||t(g).open.value,"force-mount":!0},{default:a(({present:r})=>[e(t(m),y(n.$attrs,{id:t(g).contentId,ref:t(C),"as-child":d.asChild,as:n.as,hidden:r?void 0:t(g).unmountOnHide.value?``:`until-found`,"data-state":M.value?void 0:t(g).open.value?`open`:`closed`,"data-disabled":t(g).disabled?.value?``:void 0,style:{"--reka-collapsible-content-height":`${O.value}px`,"--reka-collapsible-content-width":`${D.value}px`}}),{default:a(()=>[!t(g).unmountOnHide.value||r?p(n.$slots,`default`,{key:0}):s(`v-if`,!0)]),_:2},1040,[`id`,`as-child`,`as`,`hidden`,`data-state`,`data-disabled`,`style`])]),_:3},8,[`present`]))}}),k=d({__name:`Collapsible`,props:{defaultOpen:{type:Boolean},open:{type:Boolean},disabled:{type:Boolean},unmountOnHide:{type:Boolean},asChild:{type:Boolean},as:{}},emits:[`update:open`],setup(e,{emit:n}){let r=x(e,n);return(e,n)=>(f(),c(t(D),y({"data-slot":`collapsible`},t(r)),{default:a(t=>[p(e.$slots,`default`,o(g(t)))]),_:3},16))}}),A=d({__name:`CollapsibleContent`,props:{forceMount:{type:Boolean},asChild:{type:Boolean},as:{}},setup(e){let n=e;return(e,r)=>(f(),c(t(O),y({"data-slot":`collapsible-content`},n),{default:a(()=>[p(e.$slots,`default`)]),_:3},16))}});export{k as n,T as r,A as t};
@@ -1 +1 @@
1
- import{Bt as e,Tt as t,Y as n,et as r,ft as i,ht as a,i as o,o as s,st as c}from"./button-BQGfqOaD.js";import{r as l}from"./CollapsibleContent-DMDLLq9x.js";var u=r({__name:`CollapsibleTrigger`,props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`button`}},setup(r){let c=r;s();let u=l();return(r,s)=>(i(),n(e(o),{type:r.as===`button`?`button`:void 0,as:r.as,"as-child":c.asChild,"aria-controls":e(u).contentId,"aria-expanded":e(u).open.value,"data-state":e(u).open.value?`open`:`closed`,"data-disabled":e(u).disabled?.value?``:void 0,disabled:e(u).disabled?.value,onClick:e(u).onOpenToggle},{default:t(()=>[a(r.$slots,`default`)]),_:3},8,[`type`,`as`,`as-child`,`aria-controls`,`aria-expanded`,`data-state`,`data-disabled`,`disabled`,`onClick`]))}}),d=r({__name:`CollapsibleTrigger`,props:{asChild:{type:Boolean},as:{}},setup(r){let o=r;return(r,s)=>(i(),n(e(u),c({"data-slot":`collapsible-trigger`},o),{default:t(()=>[a(r.$slots,`default`)]),_:3},16))}});export{d as t};
1
+ import{Bt as e,Tt as t,Y as n,et as r,ft as i,ht as a,i as o,o as s,st as c}from"./button--Qf6nmZk.js";import{r as l}from"./CollapsibleContent-DBzDxLSb.js";var u=r({__name:`CollapsibleTrigger`,props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`button`}},setup(r){let c=r;s();let u=l();return(r,s)=>(i(),n(e(o),{type:r.as===`button`?`button`:void 0,as:r.as,"as-child":c.asChild,"aria-controls":e(u).contentId,"aria-expanded":e(u).open.value,"data-state":e(u).open.value?`open`:`closed`,"data-disabled":e(u).disabled?.value?``:void 0,disabled:e(u).disabled?.value,onClick:e(u).onOpenToggle},{default:t(()=>[a(r.$slots,`default`)]),_:3},8,[`type`,`as`,`as-child`,`aria-controls`,`aria-expanded`,`data-state`,`data-disabled`,`disabled`,`onClick`]))}}),d=r({__name:`CollapsibleTrigger`,props:{asChild:{type:Boolean},as:{}},setup(r){let o=r;return(r,s)=>(i(),n(e(u),c({"data-slot":`collapsible-trigger`},o),{default:t(()=>[a(r.$slots,`default`)]),_:3},16))}});export{d as t};