llm-simple-router 0.9.29 → 0.9.30

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 (43) hide show
  1. package/dist/db/migrations/042_simplify_tool_error_logs.sql +27 -0
  2. package/dist/proxy/handler/proxy-handler-utils.d.ts +2 -3
  3. package/dist/proxy/handler/proxy-handler-utils.js +9 -15
  4. package/dist/proxy/handler/proxy-handler.js +25 -14
  5. package/dist/proxy/tool-error-logger.d.ts +3 -1
  6. package/dist/proxy/tool-error-logger.js +8 -10
  7. package/frontend-dist/assets/{CardContent-B7Q1YCsK.js → CardContent-CSzTFJFo.js} +1 -1
  8. package/frontend-dist/assets/{CardTitle-C5Bsezde.js → CardTitle-CuFtTb2C.js} +1 -1
  9. package/frontend-dist/assets/{Checkbox-wJzvSjuY.js → Checkbox-Csq97GuG.js} +1 -1
  10. package/frontend-dist/assets/{CollapsibleContent-B5pPNqRd.js → CollapsibleContent-Bkw5Nkei.js} +1 -1
  11. package/frontend-dist/assets/{CollapsibleTrigger-CSexuQRq.js → CollapsibleTrigger-Ipe-hYf6.js} +1 -1
  12. package/frontend-dist/assets/{Dashboard-BqOhqB5M.js → Dashboard-ChgBE0D0.js} +1 -1
  13. package/frontend-dist/assets/{Input-DMQL4BIA.js → Input-CqOgrx6Z.js} +1 -1
  14. package/frontend-dist/assets/{Label-hAkd1fSw.js → Label--rffSxX9.js} +1 -1
  15. package/frontend-dist/assets/{Login-n5g90q7F.js → Login-DyJS3pSs.js} +1 -1
  16. package/frontend-dist/assets/{Logs-BdptXdAL.js → Logs-DqQrxaOX.js} +1 -1
  17. package/frontend-dist/assets/{MappingEntryEditor-DrLuHu98.js → MappingEntryEditor-B0kwYMex.js} +1 -1
  18. package/frontend-dist/assets/{ModelCard-gEWqLgeY.js → ModelCard-CLZ_dn_n.js} +1 -1
  19. package/frontend-dist/assets/{ModelMappings-CYeT2Zks.js → ModelMappings-BM55q4HM.js} +1 -1
  20. package/frontend-dist/assets/{Monitor-BUr4LnM-.js → Monitor-CX8fZrcF.js} +1 -1
  21. package/frontend-dist/assets/{Providers-CcfxF8po.js → Providers-Dl3fFnpI.js} +1 -1
  22. package/frontend-dist/assets/{ProxyEnhancement-BxGYl9qc.js → ProxyEnhancement-BwKTjUS7.js} +1 -1
  23. package/frontend-dist/assets/{QuickSetup-B3Hc_tfI.js → QuickSetup-0guGcXHC.js} +1 -1
  24. package/frontend-dist/assets/{RetryRules-2T_w2dsY.js → RetryRules-0phZYYTs.js} +1 -1
  25. package/frontend-dist/assets/{RouterKeys-C0iULDvk.js → RouterKeys-Cket7Ux-.js} +1 -1
  26. package/frontend-dist/assets/{RovingFocusItem-WInkGN79.js → RovingFocusItem-DS-DstIs.js} +1 -1
  27. package/frontend-dist/assets/{Schedules-DC3-3teO.js → Schedules-C9vhSJcd.js} +1 -1
  28. package/frontend-dist/assets/{Settings-DGd7p1_A.js → Settings-Dt30ZGlc.js} +1 -1
  29. package/frontend-dist/assets/{Setup-CfojnNyj.js → Setup-BcmdpuSd.js} +1 -1
  30. package/frontend-dist/assets/{Switch-Bs4rq7IS.js → Switch-B_AxabaZ.js} +1 -1
  31. package/frontend-dist/assets/{TooltipTrigger-C-z-Bt9A.js → TooltipTrigger-CnHEbo1F.js} +1 -1
  32. package/frontend-dist/assets/{TransformRulesForm-BWeHl75r.js → TransformRulesForm-C58xEpM0.js} +1 -1
  33. package/frontend-dist/assets/{UnifiedRequestDialog-B6aqWGh6.js → UnifiedRequestDialog-BDBKI_rc.js} +1 -1
  34. package/frontend-dist/assets/{VisuallyHiddenInput-CbZDCpY7.js → VisuallyHiddenInput-DfrItQHC.js} +1 -1
  35. package/frontend-dist/assets/{button-m0I0MyCI.js → button-BYlLW16a.js} +2 -2
  36. package/frontend-dist/assets/{copy-JCnKoTiJ.js → copy-CEiO0ojz.js} +1 -1
  37. package/frontend-dist/assets/{dialog-Cq89SQbS.js → dialog-CPh0o197.js} +1 -1
  38. package/frontend-dist/assets/{index-CjaxcyJj.js → index-D8gxFmha.js} +2 -2
  39. package/frontend-dist/assets/{trash-2-PnXybHnJ.js → trash-2-DiNZDqd9.js} +1 -1
  40. package/frontend-dist/assets/{useClipboard-C5CZy9d2.js → useClipboard-Dlgqqssg.js} +1 -1
  41. package/frontend-dist/assets/{useLogRetention-CLjR8sEq.js → useLogRetention-DQFhIYfJ.js} +1 -1
  42. package/frontend-dist/index.html +2 -2
  43. package/package.json +1 -1
@@ -0,0 +1,27 @@
1
+ -- 042_simplify_tool_error_logs.sql
2
+ -- 精简 tool_error_logs:去掉 tool_input / error_content 大字段,
3
+ -- 改为通过 request_log_id + tool_use_id 从 request_logs 回溯完整数据。
4
+ -- SQLite 不支持 DROP COLUMN(需 3.35+),重建表。
5
+
6
+ DROP TABLE IF EXISTS tool_error_logs;
7
+
8
+ CREATE TABLE tool_error_logs (
9
+ id TEXT PRIMARY KEY,
10
+ request_log_id TEXT REFERENCES request_logs(id) ON DELETE SET NULL,
11
+ tool_use_id TEXT NOT NULL,
12
+ provider_id TEXT NOT NULL,
13
+ backend_model TEXT NOT NULL,
14
+ client_agent_type TEXT NOT NULL DEFAULT 'unknown'
15
+ CHECK(client_agent_type IN ('claude-code', 'pi', 'unknown')),
16
+ tool_name TEXT NOT NULL,
17
+ router_key_id TEXT,
18
+ session_id TEXT,
19
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
20
+ );
21
+
22
+ CREATE INDEX idx_tool_error_logs_time
23
+ ON tool_error_logs(created_at);
24
+ CREATE INDEX idx_tool_error_logs_provider
25
+ ON tool_error_logs(provider_id, created_at);
26
+ CREATE INDEX idx_tool_error_logs_tool
27
+ ON tool_error_logs(tool_name);
@@ -6,8 +6,6 @@ export type ClientAgentType = "claude-code" | "pi" | "unknown";
6
6
  export interface FailedToolResult {
7
7
  toolName: string;
8
8
  toolUseId: string | undefined;
9
- toolInput: string | undefined;
10
- errorContent: string;
11
9
  }
12
10
  /**
13
11
  * 根据请求头识别客户端类型。
@@ -22,7 +20,8 @@ export declare function detectClientAgentType(headers: RawHeaders): ClientAgentT
22
20
  * 避免重复记录前轮请求已记录的 tool 失败。
23
21
  *
24
22
  * 通过向前扫描 assistant 消息中的 tool_use 块
25
- * 关联对应的 tool_name tool_input。
23
+ * 关联对应的 tool_name。完整 input/error 内容通过
24
+ * request_log_id + tool_use_id 从 request_logs 回溯。
26
25
  */
27
26
  export declare function extractFailedToolResults(body: Record<string, unknown>): FailedToolResult[];
28
27
  /** 从 TransportResult 中提取最终 HTTP status code */
@@ -21,13 +21,14 @@ export function detectClientAgentType(headers) {
21
21
  * 避免重复记录前轮请求已记录的 tool 失败。
22
22
  *
23
23
  * 通过向前扫描 assistant 消息中的 tool_use 块
24
- * 关联对应的 tool_name tool_input。
24
+ * 关联对应的 tool_name。完整 input/error 内容通过
25
+ * request_log_id + tool_use_id 从 request_logs 回溯。
25
26
  */
26
27
  export function extractFailedToolResults(body) {
27
28
  const messages = body.messages;
28
29
  if (!messages || messages.length === 0)
29
30
  return [];
30
- // 第一步:向后往前找最后一个包含 tool_result 的 user 消息
31
+ // 第一步:从后往前找最后一个包含 tool_result 的 user 消息
31
32
  let lastUserIndex = -1;
32
33
  const resultBlocks = [];
33
34
  for (let i = messages.length - 1; i >= 0; i--) {
@@ -48,7 +49,7 @@ export function extractFailedToolResults(body) {
48
49
  }
49
50
  if (lastUserIndex < 0)
50
51
  return [];
51
- // 第二步:在整个 messages 中建立 tool_use_id → { name, input } 映射
52
+ // 第二步:建立 tool_use_id → tool_name 映射
52
53
  const toolUseMap = new Map();
53
54
  for (let i = 0; i < lastUserIndex; i++) {
54
55
  const msg = messages[i];
@@ -57,8 +58,7 @@ export function extractFailedToolResults(body) {
57
58
  const content = Array.isArray(msg.content) ? msg.content : [];
58
59
  for (const block of content) {
59
60
  if (block.type === "tool_use" && block.id) {
60
- const inputText = block.input ? JSON.stringify(block.input) : "";
61
- toolUseMap.set(block.id, { name: block.name ?? "unknown", input: inputText });
61
+ toolUseMap.set(block.id, block.name ?? "unknown");
62
62
  }
63
63
  }
64
64
  }
@@ -67,17 +67,11 @@ export function extractFailedToolResults(body) {
67
67
  for (const block of resultBlocks) {
68
68
  if (block.is_error !== true)
69
69
  continue;
70
- const toolUse = block.tool_use_id && typeof block.tool_use_id === "string"
71
- ? toolUseMap.get(block.tool_use_id)
72
- : undefined;
73
- const errorContent = typeof block.content === "string"
74
- ? block.content
75
- : JSON.stringify(block.content ?? "");
70
+ const toolUseId = block.tool_use_id && typeof block.tool_use_id === "string"
71
+ ? block.tool_use_id : undefined;
76
72
  failures.push({
77
- toolName: toolUse?.name ?? "unknown",
78
- toolUseId: block.tool_use_id,
79
- toolInput: toolUse?.input,
80
- errorContent,
73
+ toolName: toolUseId ? (toolUseMap.get(toolUseId) ?? "unknown") : "unknown",
74
+ toolUseId,
81
75
  });
82
76
  }
83
77
  return failures;
@@ -24,7 +24,7 @@ const HTTP_ERROR_THRESHOLD = 400;
24
24
  const MAX_LOG_FIELD_LENGTH = 80;
25
25
  const UPSTREAM_ERROR_STATUS = 502;
26
26
  const TIER2_LOOP_THRESHOLD = 2;
27
- function rejectAndReply(reply, params, error, errorMessage, providerId) {
27
+ function rejectAndReply(reply, params, error, errorMessage, providerId, afterLog) {
28
28
  insertRejectedLog({
29
29
  db: params.db, logId: params.logId, apiType: params.apiType, model: params.model,
30
30
  statusCode: error.statusCode, errorMessage, startTime: params.startTime,
@@ -35,6 +35,10 @@ function rejectAndReply(reply, params, error, errorMessage, providerId) {
35
35
  sessionId: params.sessionId, pipelineSnapshot: params.pipelineSnapshot,
36
36
  matcher: params.matcher, logFileWriter: params.logFileWriter,
37
37
  });
38
+ try {
39
+ afterLog?.();
40
+ }
41
+ catch { /* tool error log 写入失败不影响响应 */ } // eslint-disable-line taste/no-silent-catch
38
42
  return reply.code(error.statusCode).send(error.body);
39
43
  }
40
44
  import { getConfig } from "../../config/index.js";
@@ -127,6 +131,14 @@ async function executeFailoverLoop(ctx) {
127
131
  const excludeTargets = [];
128
132
  let rootLogId = null;
129
133
  let toolErrorsLogged = false;
134
+ let pendingToolErrors = null;
135
+ /** request_logs 写入后调用,将 pending 的 tool error logs 安全写入 DB */
136
+ const flushToolErrors = (providerId, model, reqLogId) => {
137
+ if (!pendingToolErrors)
138
+ return;
139
+ logToolErrors(pendingToolErrors, { db: deps.db, providerId, backendModel: model, clientAgentType: detectClientAgentType(request.headers), requestLogId: reqLogId, routerKeyId: request.routerKey?.id ?? null, sessionId });
140
+ pendingToolErrors = null;
141
+ };
130
142
  // TransformCoordinator 无状态,只需创建一次
131
143
  const coordinator = new TransformCoordinator();
132
144
  const enhancementConfig = loadEnhancementConfig(deps.db);
@@ -180,21 +192,14 @@ async function executeFailoverLoop(ctx) {
180
192
  if (!provider || !provider.is_active) {
181
193
  return rejectAndReply(reply, rCtx, errors.providerUnavailable(), `Provider '${resolved.provider_id}' unavailable`, resolved.provider_id);
182
194
  }
183
- // 工具错误日志记录 首次迭代时执行,记录本轮请求中的 is_error tool_result
195
+ // 工具错误日志:首次迭代时提取 failures,延迟到 request_logs 写入后再记录
196
+ // 避免 request_log_id 外键引用尚未存在的 request_logs 记录
184
197
  if (enhancementConfig.tool_error_logging_enabled && !toolErrorsLogged) {
185
198
  toolErrorsLogged = true;
186
199
  const failures = extractFailedToolResults(pipelineBody);
187
200
  if (failures.length > 0) {
188
201
  request.log.info({ failures: failures.length, sessionId }, "Tool error results detected");
189
- logToolErrors(failures, {
190
- db: deps.db,
191
- providerId: resolved.provider_id,
192
- backendModel: resolved.backend_model ?? effectiveModel,
193
- clientAgentType: detectClientAgentType(cliHdrs),
194
- requestLogId: logId,
195
- routerKeyId,
196
- sessionId,
197
- });
202
+ pendingToolErrors = failures;
198
203
  }
199
204
  }
200
205
  // --- 溢出重定向:上下文超出时切换到更大模型(必须在 transform 之前,确保使用正确的 api_type) ---
@@ -252,7 +257,7 @@ async function executeFailoverLoop(ctx) {
252
257
  iterationSnapshot.add({ stage: "provider_patch", types: patchMeta.types });
253
258
  const encryptionKey = getSetting(deps.db, "encryption_key");
254
259
  if (!encryptionKey) {
255
- return rejectAndReply(reply, rCtx, errors.providerUnavailable(), `Encryption key not configured`, provider.id);
260
+ return rejectAndReply(reply, rCtx, errors.providerUnavailable(), `Encryption key not configured`, provider.id, () => flushToolErrors(provider.id, resolved.backend_model ?? effectiveModel, logId));
256
261
  }
257
262
  const apiKey = decrypt(provider.api_key, encryptionKey);
258
263
  options?.beforeSendProxy?.(patchedBody, isStream);
@@ -316,6 +321,8 @@ async function executeFailoverLoop(ctx) {
316
321
  matcher, logFileWriter,
317
322
  }, resilienceResult.attempts, resilienceResult.result, startTime);
318
323
  collectTransportMetrics(deps.db, apiType, resilienceResult.result, isStream, lastLogId, provider.id, resolved.backend_model, request, routerKeyId, getTransportStatusCode(resilienceResult.result));
324
+ // request_logs 已写入,安全写入 pending tool error logs
325
+ flushToolErrors(resolved.provider_id, resolved.backend_model ?? effectiveModel, lastLogId);
319
326
  // Stream timeout: send 408 error with API-specific body to client
320
327
  if (resilienceResult.result.kind === "stream_abort" && resilienceResult.result.timeoutContext) {
321
328
  const { modelId, providerId } = resilienceResult.result.timeoutContext;
@@ -389,14 +396,16 @@ async function executeFailoverLoop(ctx) {
389
396
  }, e.attempts, fakeResult, startTime);
390
397
  }
391
398
  request.log.debug({ logId, action: "provider_switch", targetProviderId: e.targetProviderId });
399
+ // request_logs 已写入(logResilienceResult),flush pending tool errors
400
+ flushToolErrors(resolved.provider_id, resolved.backend_model ?? effectiveModel, logId);
392
401
  excludeTargets.push(resolved);
393
402
  continue;
394
403
  }
395
404
  if (e instanceof SemaphoreQueueFullError) {
396
- return rejectAndReply(reply, rCtx, errors.concurrencyQueueFull(provider.id), `Concurrency queue full for provider '${provider.id}'`, provider.id);
405
+ return rejectAndReply(reply, rCtx, errors.concurrencyQueueFull(provider.id), `Concurrency queue full for provider '${provider.id}'`, provider.id, () => flushToolErrors(provider.id, resolved.backend_model ?? effectiveModel, logId));
397
406
  }
398
407
  if (e instanceof SemaphoreTimeoutError) {
399
- return rejectAndReply(reply, rCtx, errors.concurrencyTimeout(provider.id, e.timeoutMs), `Concurrency wait timeout for provider '${provider.id}' (${e.timeoutMs}ms)`, provider.id);
408
+ return rejectAndReply(reply, rCtx, errors.concurrencyTimeout(provider.id, e.timeoutMs), `Concurrency wait timeout for provider '${provider.id}' (${e.timeoutMs}ms)`, provider.id, () => flushToolErrors(provider.id, resolved.backend_model ?? effectiveModel, logId));
400
409
  }
401
410
  const errMsg = e instanceof Error ? e.message : String(e);
402
411
  request.log.debug({ logId, error: errMsg, action: "upstream_error" });
@@ -412,6 +421,8 @@ async function executeFailoverLoop(ctx) {
412
421
  }, (matcher || logFileWriter) ? {
413
422
  matcher, logFileWriter, responseBody: null,
414
423
  } : undefined);
424
+ // request_logs 已写入,flush pending tool errors
425
+ flushToolErrors(provider.id, resolved.backend_model ?? effectiveModel, logId);
415
426
  const err = errors.upstreamConnectionFailed();
416
427
  return reply.code(err.statusCode).send(err.body);
417
428
  }
@@ -11,6 +11,8 @@ export interface ToolErrorLogContext {
11
11
  }
12
12
  /**
13
13
  * 将失败的 tool_result 批量写入 tool_error_logs 表。
14
- * 每条失败记录独立一行。
14
+ * 每条失败记录独立一行。只存索引字段,
15
+ * 完整 tool_input / error_content 通过
16
+ * request_log_id + tool_use_id 从 request_logs 回溯。
15
17
  */
16
18
  export declare function logToolErrors(failures: FailedToolResult[], ctx: ToolErrorLogContext): void;
@@ -1,20 +1,20 @@
1
1
  import { randomUUID } from "crypto";
2
2
  /**
3
3
  * 将失败的 tool_result 批量写入 tool_error_logs 表。
4
- * 每条失败记录独立一行。
4
+ * 每条失败记录独立一行。只存索引字段,
5
+ * 完整 tool_input / error_content 通过
6
+ * request_log_id + tool_use_id 从 request_logs 回溯。
5
7
  */
6
8
  export function logToolErrors(failures, ctx) {
7
9
  if (failures.length === 0)
8
10
  return;
9
11
  const stmt = ctx.db.prepare(`
10
12
  INSERT INTO tool_error_logs
11
- (id, request_log_id, provider_id, backend_model, client_agent_type,
12
- tool_name, tool_use_id, tool_input, error_content,
13
- router_key_id, session_id, created_at)
13
+ (id, request_log_id, tool_use_id, provider_id, backend_model,
14
+ client_agent_type, tool_name, router_key_id, session_id, created_at)
14
15
  VALUES
15
- (@id, @request_log_id, @provider_id, @backend_model, @client_agent_type,
16
- @tool_name, @tool_use_id, @tool_input, @error_content,
17
- @router_key_id, @session_id, @created_at)
16
+ (@id, @request_log_id, @tool_use_id, @provider_id, @backend_model,
17
+ @client_agent_type, @tool_name, @router_key_id, @session_id, @created_at)
18
18
  `);
19
19
  const now = new Date().toISOString();
20
20
  const insertMany = ctx.db.transaction(() => {
@@ -22,13 +22,11 @@ export function logToolErrors(failures, ctx) {
22
22
  stmt.run({
23
23
  id: randomUUID(),
24
24
  request_log_id: ctx.requestLogId,
25
+ tool_use_id: f.toolUseId ?? "unknown",
25
26
  provider_id: ctx.providerId,
26
27
  backend_model: ctx.backendModel,
27
28
  client_agent_type: ctx.clientAgentType,
28
29
  tool_name: f.toolName,
29
- tool_use_id: f.toolUseId ?? null,
30
- tool_input: f.toolInput ?? null,
31
- error_content: f.errorContent,
32
30
  router_key_id: ctx.routerKeyId,
33
31
  session_id: ctx.sessionId ?? null,
34
32
  created_at: now,
@@ -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-m0I0MyCI.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-BYlLW16a.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-m0I0MyCI.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-BYlLW16a.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-m0I0MyCI.js";import{t as b}from"./VisuallyHiddenInput-CbZDCpY7.js";import{t as x}from"./RovingFocusItem-WInkGN79.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-CjaxcyJj.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-BYlLW16a.js";import{t as b}from"./VisuallyHiddenInput-DfrItQHC.js";import{t as x}from"./RovingFocusItem-DS-DstIs.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-D8gxFmha.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-m0I0MyCI.js";import{B as x,L as S,q as C,z as w}from"./index-CjaxcyJj.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-BYlLW16a.js";import{B as x,L as S,q as C,z as w}from"./index-D8gxFmha.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-m0I0MyCI.js";import{r as l}from"./CollapsibleContent-B5pPNqRd.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-BYlLW16a.js";import{r as l}from"./CollapsibleContent-Bkw5Nkei.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};