llm-simple-router 0.10.1 → 0.10.3

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 (50) hide show
  1. package/dist/admin/monitor.js +8 -0
  2. package/dist/proxy/handler/failover-loop.js +7 -0
  3. package/dist/proxy/orchestration/orchestrator.d.ts +0 -1
  4. package/dist/proxy/orchestration/orchestrator.js +27 -19
  5. package/dist/proxy/orchestration/scope.d.ts +2 -0
  6. package/dist/proxy/orchestration/scope.js +4 -0
  7. package/dist/proxy/transform/stream-bridge-chat2resp.d.ts +3 -0
  8. package/dist/proxy/transform/stream-bridge-chat2resp.js +21 -11
  9. package/frontend-dist/assets/{CardContent-go9x8eec.js → CardContent-D3qqQOzw.js} +1 -1
  10. package/frontend-dist/assets/{CardTitle-BRlxAJ4B.js → CardTitle-DZmbJGNi.js} +1 -1
  11. package/frontend-dist/assets/{Checkbox-CNapa1C_.js → Checkbox-D0kd5NM5.js} +1 -1
  12. package/frontend-dist/assets/{CollapsibleContent-C_hdLxxg.js → CollapsibleContent-D7KpsB50.js} +1 -1
  13. package/frontend-dist/assets/{CollapsibleTrigger-DnPjb7Dr.js → CollapsibleTrigger-dErHwaLp.js} +1 -1
  14. package/frontend-dist/assets/{Dashboard-BD10zBkl.js → Dashboard-C1l8In2m.js} +1 -1
  15. package/frontend-dist/assets/{Input-DY_kIwJO.js → Input-DSL9i6-h.js} +1 -1
  16. package/frontend-dist/assets/{Label-DwD9QWfW.js → Label-DZV7A4As.js} +1 -1
  17. package/frontend-dist/assets/{Login-DVqJBb-O.js → Login-CGooPG3v.js} +1 -1
  18. package/frontend-dist/assets/{Logs-3ckBDY_r.js → Logs-C6Yq0PD5.js} +1 -1
  19. package/frontend-dist/assets/{MappingEntryEditor-DiuJMr6L.js → MappingEntryEditor-BCX9sqLY.js} +1 -1
  20. package/frontend-dist/assets/{ModelCard-M7BUbO4-.js → ModelCard-VhRGa9dN.js} +1 -1
  21. package/frontend-dist/assets/{ModelMappings-CAYfszaz.js → ModelMappings-qXsh3Yhb.js} +1 -1
  22. package/frontend-dist/assets/Monitor-CI4Xf34K.js +1 -0
  23. package/frontend-dist/assets/{Providers-DoB7cAWp.js → Providers-CH9v1ctT.js} +1 -1
  24. package/frontend-dist/assets/{ProxyEnhancement-CPiIq5wS.js → ProxyEnhancement-Fk_bLjAK.js} +1 -1
  25. package/frontend-dist/assets/{QuickSetup-BN_YqbgQ.js → QuickSetup-CcuF2ifO.js} +1 -1
  26. package/frontend-dist/assets/{RetryRules-DIxgHt-G.js → RetryRules-D6cIJh3h.js} +1 -1
  27. package/frontend-dist/assets/{RouterKeys-hBEzqWaf.js → RouterKeys-BgkmcxxN.js} +1 -1
  28. package/frontend-dist/assets/{RovingFocusItem-DXXOzxYf.js → RovingFocusItem-CJnGRDn0.js} +1 -1
  29. package/frontend-dist/assets/{Schedules-C8FBA29A.js → Schedules-BdnUtBRd.js} +1 -1
  30. package/frontend-dist/assets/{Settings-CsLsfZkl.js → Settings-DwnPkKQC.js} +1 -1
  31. package/frontend-dist/assets/{Setup-DE72fHWm.js → Setup-DTeb40gc.js} +1 -1
  32. package/frontend-dist/assets/{Switch-QKmayVBf.js → Switch-DypIONwh.js} +1 -1
  33. package/frontend-dist/assets/{TooltipTrigger-CTzZDwpq.js → TooltipTrigger-PjT4_t5o.js} +1 -1
  34. package/frontend-dist/assets/{TransformRulesForm-B1xYEDqV.js → TransformRulesForm-B1JEj03a.js} +1 -1
  35. package/frontend-dist/assets/{UnifiedRequestDialog-D2Rmt-2C.js → UnifiedRequestDialog-D4MlcpiA.js} +1 -1
  36. package/frontend-dist/assets/{VisuallyHiddenInput-C0PhLv6-.js → VisuallyHiddenInput-DfcRACwu.js} +1 -1
  37. package/frontend-dist/assets/{button-DIkr5-e9.js → button-DOpof38-.js} +2 -2
  38. package/frontend-dist/assets/{copy-wxL8rXSb.js → copy-D4VVSDtz.js} +1 -1
  39. package/frontend-dist/assets/{dialog-VRNiQWvn.js → dialog-BfODCy5Y.js} +1 -1
  40. package/frontend-dist/assets/{index-BkaQT-Ad.js → index-BEzoY3wI.js} +2 -2
  41. package/frontend-dist/assets/monitor-C9j7ppMj.js +1 -0
  42. package/frontend-dist/assets/monitor-CaDMr_KG.js +1 -0
  43. package/frontend-dist/assets/{trash-2-DP4nWvuZ.js → trash-2-DRNvvnll.js} +1 -1
  44. package/frontend-dist/assets/{useClipboard-tOb7LUo7.js → useClipboard-DI8woKxZ.js} +1 -1
  45. package/frontend-dist/assets/{useLogRetention-WLn9pgNe.js → useLogRetention-DT3HBeXR.js} +1 -1
  46. package/frontend-dist/index.html +2 -2
  47. package/package.json +2 -2
  48. package/frontend-dist/assets/Monitor-DcJP6XHy.js +0 -1
  49. package/frontend-dist/assets/monitor-Baldqd3x.js +0 -1
  50. package/frontend-dist/assets/monitor-DeInYpBf.js +0 -1
@@ -34,5 +34,13 @@ export const adminMonitorRoutes = (app, options, done) => {
34
34
  return reply.code(HTTP_NOT_FOUND).send(apiError(API_CODE.NOT_FOUND, "Not found"));
35
35
  return req;
36
36
  });
37
+ app.delete("/admin/api/monitor/request/:id", async (request, reply) => {
38
+ const { id } = request.params;
39
+ const killed = tracker.killRequest(id);
40
+ if (!killed) {
41
+ return reply.code(HTTP_NOT_FOUND).send(apiError(API_CODE.NOT_FOUND, "Request not found or already completed"));
42
+ }
43
+ return { killed: true };
44
+ });
37
45
  done();
38
46
  };
@@ -107,6 +107,9 @@ export async function executeFailoverLoop(ctx, errors, deps, upstreamPath, adapt
107
107
  const clientApiType = ctx.apiType;
108
108
  let failoverIteration = 0;
109
109
  while (true) {
110
+ // 请求被 kill 后 reply 已销毁,直接退出避免浪费 failover 迭代
111
+ if (reply.raw.destroyed)
112
+ return reply;
110
113
  if (++failoverIteration > MAX_FAILOVER_ITERATIONS) {
111
114
  return reply.code(HTTP_SERVICE_UNAVAILABLE).send({
112
115
  error: { message: `Max failover iterations (${MAX_FAILOVER_ITERATIONS}) exceeded`, type: "server_error", code: "failover_limit_exceeded" },
@@ -367,6 +370,10 @@ export async function executeFailoverLoop(ctx, errors, deps, upstreamPath, adapt
367
370
  if (e instanceof SemaphoreTimeoutError) {
368
371
  return rejectAndReply(reply, rCtx, errors.concurrencyTimeout(provider.id, e.timeoutMs), `Concurrency wait timeout for provider '${provider.id}' (${e.timeoutMs}ms)`, provider.id, flushCurrentErrors);
369
372
  }
373
+ // 请求被主动 kill(abort + reply destroy),直接退出不写日志
374
+ if (e instanceof Error && e.name === "AbortError") {
375
+ return reply;
376
+ }
370
377
  // 其他未知错误
371
378
  const errMsg = e instanceof Error ? e.message : e instanceof Error ? e.message : JSON.stringify(e);
372
379
  request.log.debug({ logId, error: errMsg, action: "upstream_error" });
@@ -54,7 +54,6 @@ export declare class ProxyOrchestrator {
54
54
  });
55
55
  handle(request: FastifyRequest, reply: FastifyReply, apiType: "openai" | "openai-responses" | "anthropic", config: OrchestratorConfig, ctx?: HandleContext): Promise<ResilienceResult>;
56
56
  private buildActiveRequest;
57
- private createAbortSignal;
58
57
  private executeResilience;
59
58
  private sendResponse;
60
59
  private extractTrackStatus;
@@ -23,18 +23,35 @@ export class ProxyOrchestrator {
23
23
  }
24
24
  async handle(request, reply, apiType, config, ctx) {
25
25
  const providerId = config.provider.id;
26
+ const controller = new AbortController();
27
+ // 客户端断连时自动 abort(保留原有行为)
28
+ request.raw.on("close", () => {
29
+ if (!request.raw.readableEnded) {
30
+ controller.abort();
31
+ }
32
+ });
26
33
  const trackerReq = this.buildActiveRequest(request, config, apiType);
27
34
  try {
28
- const result = await this.deps.trackerScope.track(trackerReq, () => this.deps.semaphoreScope.withSlot(providerId, this.createAbortSignal(request), () => {
29
- trackerReq.queued = true;
30
- this.deps.trackerScope.markQueued(trackerReq.id, true);
31
- }, () => {
32
- if (trackerReq.queued) {
33
- trackerReq.queued = false;
34
- this.deps.trackerScope.markQueued(trackerReq.id, false);
35
- }
36
- return this.executeResilience(config, ctx);
37
- }, config.concurrencyOverride), (result) => this.extractTrackStatus(result), (result) => result.attempts.map(a => ({
35
+ const result = await this.deps.trackerScope.track(trackerReq, () => {
36
+ // kill 回调必须在 tracker.start() 之后注册,确保请求已在 activeMap 中
37
+ this.deps.trackerScope.registerKillCallback(trackerReq.id, () => {
38
+ controller.abort();
39
+ try {
40
+ reply.raw.destroy();
41
+ }
42
+ catch { /* reply may already be destroyed */ } // eslint-disable-line taste/no-silent-catch
43
+ });
44
+ return this.deps.semaphoreScope.withSlot(providerId, controller.signal, () => {
45
+ trackerReq.queued = true;
46
+ this.deps.trackerScope.markQueued(trackerReq.id, true);
47
+ }, () => {
48
+ if (trackerReq.queued) {
49
+ trackerReq.queued = false;
50
+ this.deps.trackerScope.markQueued(trackerReq.id, false);
51
+ }
52
+ return this.executeResilience(config, ctx);
53
+ }, config.concurrencyOverride);
54
+ }, (result) => this.extractTrackStatus(result), (result) => result.attempts.map(a => ({
38
55
  statusCode: a.statusCode,
39
56
  error: a.error,
40
57
  latencyMs: a.latencyMs,
@@ -80,15 +97,6 @@ export class ProxyOrchestrator {
80
97
  upstreamRequest: config.upstreamRequest,
81
98
  };
82
99
  }
83
- createAbortSignal(request) {
84
- const controller = new AbortController();
85
- request.raw.on("close", () => {
86
- if (!request.raw.readableEnded) {
87
- controller.abort();
88
- }
89
- });
90
- return controller.signal;
91
- }
92
100
  async executeResilience(config, ctx) {
93
101
  if (!ctx?.transportFn)
94
102
  throw new Error("HandleContext.transportFn is required");
@@ -16,4 +16,6 @@ export declare class TrackerScope {
16
16
  }, extractAttempts?: (result: T) => AttemptSnapshot[]): Promise<T>;
17
17
  /** 通知 tracker 请求进入/离开信号量队列,触发前端即时广播 */
18
18
  markQueued(id: string, queued: boolean): void;
19
+ /** 注册请求终止回调,代理到 RequestTracker */
20
+ registerKillCallback(id: string, callback: () => void): void;
19
21
  }
@@ -36,4 +36,8 @@ export class TrackerScope {
36
36
  markQueued(id, queued) {
37
37
  this.tracker.update(id, { queued });
38
38
  }
39
+ /** 注册请求终止回调,代理到 RequestTracker */
40
+ registerKillCallback(id, callback) {
41
+ this.tracker.registerKillCallback(id, callback);
42
+ }
39
43
  }
@@ -23,6 +23,9 @@ export declare class ChatToResponsesBridgeTransform extends BaseSSETransform {
23
23
  private currentFunctionCallId;
24
24
  private currentFunctionCallName;
25
25
  private currentReasoningItemId;
26
+ private textBuffer;
27
+ private reasoningBuffer;
28
+ private argsBuffer;
26
29
  private createdAt;
27
30
  private nextSeq;
28
31
  private ensureResponseCreated;
@@ -30,6 +30,9 @@ export class ChatToResponsesBridgeTransform extends BaseSSETransform {
30
30
  currentFunctionCallId = "";
31
31
  currentFunctionCallName = "";
32
32
  currentReasoningItemId = "";
33
+ textBuffer = "";
34
+ reasoningBuffer = "";
35
+ argsBuffer = "";
33
36
  createdAt = Math.floor(Date.now() / MS_PER_SECOND);
34
37
  nextSeq() {
35
38
  return this.sequenceNumber++;
@@ -63,14 +66,14 @@ export class ChatToResponsesBridgeTransform extends BaseSSETransform {
63
66
  type: RESPONSES_SSE_EVENTS.OUTPUT_TEXT_DONE,
64
67
  output_index: this.outputIndex,
65
68
  content_index: this.contentIndex,
66
- text: "",
69
+ text: this.textBuffer,
67
70
  sequence_number: this.nextSeq(),
68
71
  });
69
72
  this.pushResponsesSSE(RESPONSES_SSE_EVENTS.CONTENT_PART_DONE, {
70
73
  type: RESPONSES_SSE_EVENTS.CONTENT_PART_DONE,
71
74
  output_index: this.outputIndex,
72
75
  content_index: this.contentIndex,
73
- part: { type: "output_text", text: "", annotations: [] },
76
+ part: { type: "output_text", text: this.textBuffer, annotations: [] },
74
77
  sequence_number: this.nextSeq(),
75
78
  });
76
79
  this.hasContentPartStarted = false;
@@ -83,7 +86,7 @@ export class ChatToResponsesBridgeTransform extends BaseSSETransform {
83
86
  type: "message",
84
87
  id: this.currentMessageItemId,
85
88
  role: "assistant",
86
- content: [{ type: "output_text", text: "", annotations: [] }],
89
+ content: [{ type: "output_text", text: this.textBuffer, annotations: [] }],
87
90
  status: "completed",
88
91
  },
89
92
  sequence_number: this.nextSeq(),
@@ -92,7 +95,7 @@ export class ChatToResponsesBridgeTransform extends BaseSSETransform {
92
95
  type: "message",
93
96
  id: this.currentMessageItemId,
94
97
  role: "assistant",
95
- content: [{ type: "output_text", text: "", annotations: [] }],
98
+ content: [{ type: "output_text", text: this.textBuffer, annotations: [] }],
96
99
  });
97
100
  this.hasMessageItemStarted = false;
98
101
  this.outputIndex++;
@@ -105,14 +108,14 @@ export class ChatToResponsesBridgeTransform extends BaseSSETransform {
105
108
  type: RESPONSES_SSE_EVENTS.REASONING_SUMMARY_TEXT_DONE,
106
109
  output_index: this.outputIndex,
107
110
  summary_index: 0,
108
- text: "",
111
+ text: this.reasoningBuffer,
109
112
  sequence_number: this.nextSeq(),
110
113
  });
111
114
  this.pushResponsesSSE(RESPONSES_SSE_EVENTS.REASONING_SUMMARY_PART_DONE, {
112
115
  type: RESPONSES_SSE_EVENTS.REASONING_SUMMARY_PART_DONE,
113
116
  output_index: this.outputIndex,
114
117
  summary_index: 0,
115
- part: { type: "summary_text", text: "" },
118
+ part: { type: "summary_text", text: this.reasoningBuffer },
116
119
  sequence_number: this.nextSeq(),
117
120
  });
118
121
  this.pushResponsesSSE(RESPONSES_SSE_EVENTS.OUTPUT_ITEM_DONE, {
@@ -121,14 +124,14 @@ export class ChatToResponsesBridgeTransform extends BaseSSETransform {
121
124
  item: {
122
125
  type: "reasoning",
123
126
  id: this.currentReasoningItemId,
124
- summary: [{ type: "summary_text", text: "" }],
127
+ summary: [{ type: "summary_text", text: this.reasoningBuffer }],
125
128
  },
126
129
  sequence_number: this.nextSeq(),
127
130
  });
128
131
  this.collectedOutput.push({
129
132
  type: "reasoning",
130
133
  id: this.currentReasoningItemId,
131
- summary: [{ type: "summary_text", text: "" }],
134
+ summary: [{ type: "summary_text", text: this.reasoningBuffer }],
132
135
  });
133
136
  this.hasReasoningItemStarted = false;
134
137
  this.outputIndex++;
@@ -139,7 +142,7 @@ export class ChatToResponsesBridgeTransform extends BaseSSETransform {
139
142
  output_index: this.outputIndex,
140
143
  item_id: this.currentFunctionCallId,
141
144
  call_id: this.currentFunctionCallId,
142
- arguments: "",
145
+ arguments: this.argsBuffer,
143
146
  sequence_number: this.nextSeq(),
144
147
  });
145
148
  this.pushResponsesSSE(RESPONSES_SSE_EVENTS.OUTPUT_ITEM_DONE, {
@@ -150,7 +153,7 @@ export class ChatToResponsesBridgeTransform extends BaseSSETransform {
150
153
  id: this.currentFunctionCallId,
151
154
  call_id: this.currentFunctionCallId,
152
155
  name: this.currentFunctionCallName,
153
- arguments: "",
156
+ arguments: this.argsBuffer,
154
157
  status: "completed",
155
158
  },
156
159
  sequence_number: this.nextSeq(),
@@ -160,7 +163,7 @@ export class ChatToResponsesBridgeTransform extends BaseSSETransform {
160
163
  id: this.currentFunctionCallId,
161
164
  call_id: this.currentFunctionCallId,
162
165
  name: this.currentFunctionCallName,
163
- arguments: "",
166
+ arguments: this.argsBuffer,
164
167
  });
165
168
  this.outputIndex++;
166
169
  this.currentFunctionCallId = "";
@@ -236,6 +239,7 @@ export class ChatToResponsesBridgeTransform extends BaseSSETransform {
236
239
  this.closeCurrentMessageItem();
237
240
  if (!this.hasReasoningItemStarted) {
238
241
  this.hasReasoningItemStarted = true;
242
+ this.reasoningBuffer = "";
239
243
  this.currentReasoningItemId = `rs_${randomHex(ID_HEX_LENGTH)}`;
240
244
  this.pushResponsesSSE(RESPONSES_SSE_EVENTS.OUTPUT_ITEM_ADDED, {
241
245
  type: RESPONSES_SSE_EVENTS.OUTPUT_ITEM_ADDED,
@@ -258,6 +262,7 @@ export class ChatToResponsesBridgeTransform extends BaseSSETransform {
258
262
  delta: delta.reasoning_content,
259
263
  sequence_number: this.nextSeq(),
260
264
  });
265
+ this.reasoningBuffer += delta.reasoning_content;
261
266
  }
262
267
  // Handle text content
263
268
  if (delta?.content != null && delta.content !== "") {
@@ -266,6 +271,7 @@ export class ChatToResponsesBridgeTransform extends BaseSSETransform {
266
271
  this.closeCurrentReasoningItem();
267
272
  if (!this.hasMessageItemStarted) {
268
273
  this.hasMessageItemStarted = true;
274
+ this.textBuffer = "";
269
275
  this.contentIndex = 0;
270
276
  this.currentMessageItemId = `msg_${randomHex(ID_HEX_LENGTH)}`;
271
277
  this.pushResponsesSSE(RESPONSES_SSE_EVENTS.OUTPUT_ITEM_ADDED, {
@@ -298,6 +304,7 @@ export class ChatToResponsesBridgeTransform extends BaseSSETransform {
298
304
  delta: delta.content,
299
305
  sequence_number: this.nextSeq(),
300
306
  });
307
+ this.textBuffer += delta.content;
301
308
  }
302
309
  // Handle tool_calls
303
310
  const toolCalls = delta?.tool_calls;
@@ -318,6 +325,7 @@ export class ChatToResponsesBridgeTransform extends BaseSSETransform {
318
325
  }
319
326
  this.currentFunctionCallId = tcId;
320
327
  this.currentFunctionCallName = tcName;
328
+ this.argsBuffer = "";
321
329
  this.pushResponsesSSE(RESPONSES_SSE_EVENTS.OUTPUT_ITEM_ADDED, {
322
330
  type: RESPONSES_SSE_EVENTS.OUTPUT_ITEM_ADDED,
323
331
  output_index: this.outputIndex,
@@ -342,6 +350,7 @@ export class ChatToResponsesBridgeTransform extends BaseSSETransform {
342
350
  delta: args,
343
351
  sequence_number: this.nextSeq(),
344
352
  });
353
+ this.argsBuffer += args;
345
354
  }
346
355
  }
347
356
  else if (fn?.arguments) {
@@ -354,6 +363,7 @@ export class ChatToResponsesBridgeTransform extends BaseSSETransform {
354
363
  delta: fn.arguments,
355
364
  sequence_number: this.nextSeq(),
356
365
  });
366
+ this.argsBuffer += fn.arguments;
357
367
  }
358
368
  }
359
369
  }
@@ -1 +1 @@
1
- import{$ as e,Vt as t,X as n,dt as r,mt as i,r as a,zt as o}from"./button-DIkr5-e9.js";var s=[`data-size`],c=e({__name:`Card`,props:{class:{type:[Boolean,null,String,Object,Array]},size:{default:`default`}},setup(e){let c=e;return(l,u)=>(r(),n(`div`,{"data-slot":`card`,"data-size":e.size,class:t(o(a)(`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))},[i(l.$slots,`default`)],10,s))}}),l=e({__name:`CardContent`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let s=e;return(e,c)=>(r(),n(`div`,{"data-slot":`card-content`,class:t(o(a)(`px-4 group-data-[size=sm]/card:px-3`,s.class))},[i(e.$slots,`default`)],2))}});export{c as n,l as t};
1
+ import{$ as e,Vt as t,X as n,dt as r,mt as i,r as a,zt as o}from"./button-DOpof38-.js";var s=[`data-size`],c=e({__name:`Card`,props:{class:{type:[Boolean,null,String,Object,Array]},size:{default:`default`}},setup(e){let c=e;return(l,u)=>(r(),n(`div`,{"data-slot":`card`,"data-size":e.size,class:t(o(a)(`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))},[i(l.$slots,`default`)],10,s))}}),l=e({__name:`CardContent`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let s=e;return(e,c)=>(r(),n(`div`,{"data-slot":`card-content`,class:t(o(a)(`px-4 group-data-[size=sm]/card:px-3`,s.class))},[i(e.$slots,`default`)],2))}});export{c as n,l as t};
@@ -1 +1 @@
1
- import{$ as e,Vt as t,X as n,dt as r,mt as i,r as a,zt as o}from"./button-DIkr5-e9.js";var s=e({__name:`CardHeader`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let s=e;return(e,c)=>(r(),n(`div`,{"data-slot":`card-header`,class:t(o(a)(`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))},[i(e.$slots,`default`)],2))}}),c=e({__name:`CardTitle`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let s=e;return(e,c)=>(r(),n(`div`,{"data-slot":`card-title`,class:t(o(a)(`text-base leading-snug font-medium group-data-[size=sm]/card:text-sm cn-font-heading`,s.class))},[i(e.$slots,`default`)],2))}});export{s as n,c as t};
1
+ import{$ as e,Vt as t,X as n,dt as r,mt as i,r as a,zt as o}from"./button-DOpof38-.js";var s=e({__name:`CardHeader`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let s=e;return(e,c)=>(r(),n(`div`,{"data-slot":`card-header`,class:t(o(a)(`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))},[i(e.$slots,`default`)],2))}}),c=e({__name:`CardTitle`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(e){let s=e;return(e,c)=>(r(),n(`div`,{"data-slot":`card-title`,class:t(o(a)(`text-base leading-snug font-medium group-data-[size=sm]/card:text-sm cn-font-heading`,s.class))},[i(e.$slots,`default`)],2))}});export{s as n,c as t};
@@ -1 +1 @@
1
- import{$ as e,H as t,Ht as n,J as r,K as i,Q as a,U as o,Y as s,dt as c,gt as l,i as u,m as d,mt as f,o as p,ot as m,r as h,tt as g,wt as _,x as v,zt as y}from"./button-DIkr5-e9.js";import{t as b}from"./VisuallyHiddenInput-C0PhLv6-.js";import{t as x}from"./RovingFocusItem-DXXOzxYf.js";import{B as S,G as C,H as w,L as T,Y as E,nt as D,q as O}from"./index-BkaQT-Ad.js";function k(e,t){return C(e)?!1:Array.isArray(e)?e.some(e=>E(e,t)):E(e,t)}var[A,j]=O(`CheckboxGroupRoot`);function M(e){return e===`indeterminate`}function N(e){return M(e)?`indeterminate`:e?`checked`:`unchecked`}var[P,F]=O(`CheckboxRoot`),I=e({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:n}){let a=e,h=n,{forwardRef:g,currentElement:v}=p(),S=A(null),T=d(a,`modelValue`,h,{defaultValue:a.defaultValue??a.falseValue,passive:a.modelValue===void 0}),D=i(()=>S?.disabled.value||a.disabled),O=i(()=>E(T.value,a.trueValue)),j=i(()=>C(S?.modelValue.value)?T.value===`indeterminate`?`indeterminate`:O.value:k(S.modelValue.value,a.value));function P(){if(C(S?.modelValue.value))T.value===`indeterminate`?T.value=a.trueValue:T.value=O.value?a.falseValue:a.trueValue;else{let e=[...S.modelValue.value||[]];if(k(e,a.value)){let t=e.findIndex(e=>E(e,a.value));e.splice(t,1)}else e.push(a.value);S.modelValue.value=e}}let I=w(v),L=i(()=>a.id&&v.value?document.querySelector(`[for="${a.id}"]`)?.innerText:void 0);return F({disabled:D,state:j}),(e,n)=>(c(),r(l(y(S)?.rovingFocus.value?y(x):y(u)),m(e.$attrs,{id:e.id,ref:y(g),role:`checkbox`,"as-child":e.asChild,as:e.as,type:e.as===`button`?`button`:void 0,"aria-checked":y(M)(j.value)?`mixed`:j.value,"aria-required":e.required,"aria-label":e.$attrs[`aria-label`]||L.value,"data-state":y(N)(j.value),"data-disabled":D.value?``:void 0,disabled:D.value,focusable:y(S)?.rovingFocus.value?!D.value:void 0,onKeydown:t(o(()=>{},[`prevent`]),[`enter`]),onClick:P}),{default:_(()=>[f(e.$slots,`default`,{modelValue:y(T),state:j.value}),y(I)&&e.name&&!y(S)?(c(),r(y(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`])):s(`v-if`,!0)]),_:3},16,[`id`,`as-child`,`as`,`type`,`aria-checked`,`aria-required`,`aria-label`,`data-state`,`data-disabled`,`disabled`,`focusable`,`onKeydown`]))}}),L=e({__name:`CheckboxIndicator`,props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`span`}},setup(e){let{forwardRef:t}=p(),n=P();return(e,i)=>(c(),r(y(T),{present:e.forceMount||y(M)(y(n).state.value)||y(n).state.value===!0},{default:_(()=>[a(y(u),m({ref:y(t),"data-state":y(N)(y(n).state.value),"data-disabled":y(n).disabled.value?``:void 0,style:{pointerEvents:`none`},"as-child":e.asChild,as:e.as},e.$attrs),{default:_(()=>[f(e.$slots,`default`)]),_:3},16,[`data-state`,`data-disabled`,`as-child`,`as`])]),_:3},8,[`present`]))}}),R=e({__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(e,{emit:t}){let i=e,o=t,s=S(v(i,`class`),o);return(e,t)=>(c(),r(y(I),m({"data-slot":`checkbox`},y(s),{class:y(h)(`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`,i.class)}),{default:_(t=>[a(y(L),{"data-slot":`checkbox-indicator`,class:`[&>svg]:size-3.5 grid place-content-center text-current transition-none`},{default:_(()=>[f(e.$slots,`default`,n(g(t)),()=>[a(y(D))])]),_:2},1024)]),_:3},16,[`class`]))}});export{R as t};
1
+ import{$ as e,H as t,Ht as n,J as r,K as i,Q as a,U as o,Y as s,dt as c,gt as l,i as u,m as d,mt as f,o as p,ot as m,r as h,tt as g,wt as _,x as v,zt as y}from"./button-DOpof38-.js";import{t as b}from"./VisuallyHiddenInput-DfcRACwu.js";import{t as x}from"./RovingFocusItem-CJnGRDn0.js";import{B as S,G as C,H as w,L as T,Y as E,nt as D,q as O}from"./index-BEzoY3wI.js";function k(e,t){return C(e)?!1:Array.isArray(e)?e.some(e=>E(e,t)):E(e,t)}var[A,j]=O(`CheckboxGroupRoot`);function M(e){return e===`indeterminate`}function N(e){return M(e)?`indeterminate`:e?`checked`:`unchecked`}var[P,F]=O(`CheckboxRoot`),I=e({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:n}){let a=e,h=n,{forwardRef:g,currentElement:v}=p(),S=A(null),T=d(a,`modelValue`,h,{defaultValue:a.defaultValue??a.falseValue,passive:a.modelValue===void 0}),D=i(()=>S?.disabled.value||a.disabled),O=i(()=>E(T.value,a.trueValue)),j=i(()=>C(S?.modelValue.value)?T.value===`indeterminate`?`indeterminate`:O.value:k(S.modelValue.value,a.value));function P(){if(C(S?.modelValue.value))T.value===`indeterminate`?T.value=a.trueValue:T.value=O.value?a.falseValue:a.trueValue;else{let e=[...S.modelValue.value||[]];if(k(e,a.value)){let t=e.findIndex(e=>E(e,a.value));e.splice(t,1)}else e.push(a.value);S.modelValue.value=e}}let I=w(v),L=i(()=>a.id&&v.value?document.querySelector(`[for="${a.id}"]`)?.innerText:void 0);return F({disabled:D,state:j}),(e,n)=>(c(),r(l(y(S)?.rovingFocus.value?y(x):y(u)),m(e.$attrs,{id:e.id,ref:y(g),role:`checkbox`,"as-child":e.asChild,as:e.as,type:e.as===`button`?`button`:void 0,"aria-checked":y(M)(j.value)?`mixed`:j.value,"aria-required":e.required,"aria-label":e.$attrs[`aria-label`]||L.value,"data-state":y(N)(j.value),"data-disabled":D.value?``:void 0,disabled:D.value,focusable:y(S)?.rovingFocus.value?!D.value:void 0,onKeydown:t(o(()=>{},[`prevent`]),[`enter`]),onClick:P}),{default:_(()=>[f(e.$slots,`default`,{modelValue:y(T),state:j.value}),y(I)&&e.name&&!y(S)?(c(),r(y(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`])):s(`v-if`,!0)]),_:3},16,[`id`,`as-child`,`as`,`type`,`aria-checked`,`aria-required`,`aria-label`,`data-state`,`data-disabled`,`disabled`,`focusable`,`onKeydown`]))}}),L=e({__name:`CheckboxIndicator`,props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`span`}},setup(e){let{forwardRef:t}=p(),n=P();return(e,i)=>(c(),r(y(T),{present:e.forceMount||y(M)(y(n).state.value)||y(n).state.value===!0},{default:_(()=>[a(y(u),m({ref:y(t),"data-state":y(N)(y(n).state.value),"data-disabled":y(n).disabled.value?``:void 0,style:{pointerEvents:`none`},"as-child":e.asChild,as:e.as},e.$attrs),{default:_(()=>[f(e.$slots,`default`)]),_:3},16,[`data-state`,`data-disabled`,`as-child`,`as`])]),_:3},8,[`present`]))}}),R=e({__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(e,{emit:t}){let i=e,o=t,s=S(v(i,`class`),o);return(e,t)=>(c(),r(y(I),m({"data-slot":`checkbox`},y(s),{class:y(h)(`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`,i.class)}),{default:_(t=>[a(y(L),{"data-slot":`checkbox-indicator`,class:`[&>svg]:size-3.5 grid place-content-center text-current transition-none`},{default:_(()=>[f(e.$slots,`default`,n(g(t)),()=>[a(y(D))])]),_:2},1024)]),_:3},16,[`class`]))}});export{R as t};
@@ -1 +1 @@
1
- import{$ as e,Ht as t,J as n,K as r,Lt as i,Mt as a,Q as o,Y as s,d as c,dt as l,i as u,lt as d,m as f,mt as p,o as m,ot as h,st as g,tt as _,wt as v,xt as y,zt as b}from"./button-DIkr5-e9.js";import{B as x,L as S,q as C,z as w}from"./index-BkaQT-Ad.js";var[T,E]=C(`CollapsibleRoot`),D=e({__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:t,emit:r}){let a=e,o=f(a,`open`,r,{defaultValue:a.defaultOpen,passive:a.open===void 0}),{disabled:s,unmountOnHide:c}=i(a);return E({contentId:``,disabled:s,open:o,unmountOnHide:c,onOpenToggle:()=>{s.value||(o.value=!o.value)}}),t({open:o}),m(),(e,t)=>(l(),n(b(u),{as:e.as,"as-child":a.asChild,"data-state":b(o)?`open`:`closed`,"data-disabled":b(s)?``:void 0},{default:v(()=>[p(e.$slots,`default`,{open:b(o)})]),_:3},8,[`as`,`as-child`,`data-state`,`data-disabled`]))}}),O=e({inheritAttrs:!1,__name:`CollapsibleContent`,props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:[`contentFound`],setup(e,{emit:t}){let i=e,f=t,_=T();_.contentId||=w(void 0,`reka-collapsible-content`);let x=a(),{forwardRef:C,currentElement:E}=m(),D=a(0),O=a(0),k=r(()=>_.open.value),A=a(k.value),j=a();y(()=>[k.value,x.value?.present],async()=>{await g();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=r(()=>A.value&&_.open.value);return d(()=>{requestAnimationFrame(()=>{A.value=!1})}),c(E,`beforematch`,e=>{requestAnimationFrame(()=>{_.onOpenToggle(),f(`contentFound`)})}),(e,t)=>(l(),n(b(S),{ref_key:`presentRef`,ref:x,present:e.forceMount||b(_).open.value,"force-mount":!0},{default:v(({present:t})=>[o(b(u),h(e.$attrs,{id:b(_).contentId,ref:b(C),"as-child":i.asChild,as:e.as,hidden:t?void 0:b(_).unmountOnHide.value?``:`until-found`,"data-state":M.value?void 0:b(_).open.value?`open`:`closed`,"data-disabled":b(_).disabled?.value?``:void 0,style:{"--reka-collapsible-content-height":`${O.value}px`,"--reka-collapsible-content-width":`${D.value}px`}}),{default:v(()=>[!b(_).unmountOnHide.value||t?p(e.$slots,`default`,{key:0}):s(`v-if`,!0)]),_:2},1040,[`id`,`as-child`,`as`,`hidden`,`data-state`,`data-disabled`,`style`])]),_:3},8,[`present`]))}}),k=e({__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:r}){let i=x(e,r);return(e,r)=>(l(),n(b(D),h({"data-slot":`collapsible`},b(i)),{default:v(n=>[p(e.$slots,`default`,t(_(n)))]),_:3},16))}}),A=e({__name:`CollapsibleContent`,props:{forceMount:{type:Boolean},asChild:{type:Boolean},as:{}},setup(e){let t=e;return(e,r)=>(l(),n(b(O),h({"data-slot":`collapsible-content`},t),{default:v(()=>[p(e.$slots,`default`)]),_:3},16))}});export{k as n,T as r,A as t};
1
+ import{$ as e,Ht as t,J as n,K as r,Lt as i,Mt as a,Q as o,Y as s,d as c,dt as l,i as u,lt as d,m as f,mt as p,o as m,ot as h,st as g,tt as _,wt as v,xt as y,zt as b}from"./button-DOpof38-.js";import{B as x,L as S,q as C,z as w}from"./index-BEzoY3wI.js";var[T,E]=C(`CollapsibleRoot`),D=e({__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:t,emit:r}){let a=e,o=f(a,`open`,r,{defaultValue:a.defaultOpen,passive:a.open===void 0}),{disabled:s,unmountOnHide:c}=i(a);return E({contentId:``,disabled:s,open:o,unmountOnHide:c,onOpenToggle:()=>{s.value||(o.value=!o.value)}}),t({open:o}),m(),(e,t)=>(l(),n(b(u),{as:e.as,"as-child":a.asChild,"data-state":b(o)?`open`:`closed`,"data-disabled":b(s)?``:void 0},{default:v(()=>[p(e.$slots,`default`,{open:b(o)})]),_:3},8,[`as`,`as-child`,`data-state`,`data-disabled`]))}}),O=e({inheritAttrs:!1,__name:`CollapsibleContent`,props:{forceMount:{type:Boolean,required:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:[`contentFound`],setup(e,{emit:t}){let i=e,f=t,_=T();_.contentId||=w(void 0,`reka-collapsible-content`);let x=a(),{forwardRef:C,currentElement:E}=m(),D=a(0),O=a(0),k=r(()=>_.open.value),A=a(k.value),j=a();y(()=>[k.value,x.value?.present],async()=>{await g();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=r(()=>A.value&&_.open.value);return d(()=>{requestAnimationFrame(()=>{A.value=!1})}),c(E,`beforematch`,e=>{requestAnimationFrame(()=>{_.onOpenToggle(),f(`contentFound`)})}),(e,t)=>(l(),n(b(S),{ref_key:`presentRef`,ref:x,present:e.forceMount||b(_).open.value,"force-mount":!0},{default:v(({present:t})=>[o(b(u),h(e.$attrs,{id:b(_).contentId,ref:b(C),"as-child":i.asChild,as:e.as,hidden:t?void 0:b(_).unmountOnHide.value?``:`until-found`,"data-state":M.value?void 0:b(_).open.value?`open`:`closed`,"data-disabled":b(_).disabled?.value?``:void 0,style:{"--reka-collapsible-content-height":`${O.value}px`,"--reka-collapsible-content-width":`${D.value}px`}}),{default:v(()=>[!b(_).unmountOnHide.value||t?p(e.$slots,`default`,{key:0}):s(`v-if`,!0)]),_:2},1040,[`id`,`as-child`,`as`,`hidden`,`data-state`,`data-disabled`,`style`])]),_:3},8,[`present`]))}}),k=e({__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:r}){let i=x(e,r);return(e,r)=>(l(),n(b(D),h({"data-slot":`collapsible`},b(i)),{default:v(n=>[p(e.$slots,`default`,t(_(n)))]),_:3},16))}}),A=e({__name:`CollapsibleContent`,props:{forceMount:{type:Boolean},asChild:{type:Boolean},as:{}},setup(e){let t=e;return(e,r)=>(l(),n(b(O),h({"data-slot":`collapsible-content`},t),{default:v(()=>[p(e.$slots,`default`)]),_:3},16))}});export{k as n,T as r,A as t};
@@ -1 +1 @@
1
- import{$ as e,J as t,dt as n,i as r,mt as i,o as a,ot as o,wt as s,zt as c}from"./button-DIkr5-e9.js";import{r as l}from"./CollapsibleContent-C_hdLxxg.js";var u=e({__name:`CollapsibleTrigger`,props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`button`}},setup(e){let o=e;a();let u=l();return(e,a)=>(n(),t(c(r),{type:e.as===`button`?`button`:void 0,as:e.as,"as-child":o.asChild,"aria-controls":c(u).contentId,"aria-expanded":c(u).open.value,"data-state":c(u).open.value?`open`:`closed`,"data-disabled":c(u).disabled?.value?``:void 0,disabled:c(u).disabled?.value,onClick:c(u).onOpenToggle},{default:s(()=>[i(e.$slots,`default`)]),_:3},8,[`type`,`as`,`as-child`,`aria-controls`,`aria-expanded`,`data-state`,`data-disabled`,`disabled`,`onClick`]))}}),d=e({__name:`CollapsibleTrigger`,props:{asChild:{type:Boolean},as:{}},setup(e){let r=e;return(e,a)=>(n(),t(c(u),o({"data-slot":`collapsible-trigger`},r),{default:s(()=>[i(e.$slots,`default`)]),_:3},16))}});export{d as t};
1
+ import{$ as e,J as t,dt as n,i as r,mt as i,o as a,ot as o,wt as s,zt as c}from"./button-DOpof38-.js";import{r as l}from"./CollapsibleContent-D7KpsB50.js";var u=e({__name:`CollapsibleTrigger`,props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`button`}},setup(e){let o=e;a();let u=l();return(e,a)=>(n(),t(c(r),{type:e.as===`button`?`button`:void 0,as:e.as,"as-child":o.asChild,"aria-controls":c(u).contentId,"aria-expanded":c(u).open.value,"data-state":c(u).open.value?`open`:`closed`,"data-disabled":c(u).disabled?.value?``:void 0,disabled:c(u).disabled?.value,onClick:c(u).onOpenToggle},{default:s(()=>[i(e.$slots,`default`)]),_:3},8,[`type`,`as`,`as-child`,`aria-controls`,`aria-expanded`,`data-state`,`data-disabled`,`disabled`,`onClick`]))}}),d=e({__name:`CollapsibleTrigger`,props:{asChild:{type:Boolean},as:{}},setup(e){let r=e;return(e,a)=>(n(),t(c(u),o({"data-slot":`collapsible-trigger`},r),{default:s(()=>[i(e.$slots,`default`)]),_:3},16))}});export{d as t};