llm-simple-router 0.11.19 → 0.11.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/retry-rules.js +3 -2
- package/dist/index.js +23 -5
- package/dist/proxy/handler/create-proxy-handler.js +3 -3
- package/dist/proxy/transform/stream-ant2oa.js +12 -11
- package/dist/proxy/transport/stream.js +18 -0
- package/frontend-dist/assets/{CardContent-qm2kSb9i.js → CardContent-1i8E_S3q.js} +1 -1
- package/frontend-dist/assets/{CardTitle-Dh2IdelR.js → CardTitle-9IEYVrNF.js} +1 -1
- package/frontend-dist/assets/{CascadingModelSelect-BXXqKjXW.js → CascadingModelSelect-CqzJeQWb.js} +1 -1
- package/frontend-dist/assets/{Checkbox-CrMFXc03.js → Checkbox-9z_nic4H.js} +1 -1
- package/frontend-dist/assets/{CollapsibleContent-C2QNOTgI.js → CollapsibleContent-DRXTjuF_.js} +1 -1
- package/frontend-dist/assets/{CollapsibleTrigger-B03rpgqE.js → CollapsibleTrigger-BusSosYR.js} +1 -1
- package/frontend-dist/assets/{Dashboard-Bn2To-ZJ.js → Dashboard-DjO_Bc_0.js} +1 -1
- package/frontend-dist/assets/{Input-CQwopHLx.js → Input-BwqUPR8k.js} +1 -1
- package/frontend-dist/assets/{Label-s8RWNSIO.js → Label-CumWBzHY.js} +1 -1
- package/frontend-dist/assets/{Login-CUtMwqeo.js → Login-9ZLrg5AA.js} +1 -1
- package/frontend-dist/assets/Logs-DKktTerr.js +1 -0
- package/frontend-dist/assets/{MappingEntryEditor-P0nXCWWh.js → MappingEntryEditor-DX749LDW.js} +1 -1
- package/frontend-dist/assets/{ModelMappings-DpMwOHl2.js → ModelMappings-snvf_INI.js} +1 -1
- package/frontend-dist/assets/Monitor-RqCMWyto.js +1 -0
- package/frontend-dist/assets/Providers-DlVBSVgE.js +1 -0
- package/frontend-dist/assets/{ProxyEnhancement-TiycHnDo.js → ProxyEnhancement-CZBmTnsG.js} +1 -1
- package/frontend-dist/assets/{QuickSetup-BKL5IeJc.js → QuickSetup-BIV6mDlG.js} +1 -1
- package/frontend-dist/assets/RetryRules-DfeCwU9V.js +1 -0
- package/frontend-dist/assets/RouterKeys-tCdqFDml.js +1 -0
- package/frontend-dist/assets/{RovingFocusItem-DhJ-9o_j.js → RovingFocusItem-D3EohvxE.js} +1 -1
- package/frontend-dist/assets/{Schedules-LA7mQMtR.js → Schedules-ImwpwJKm.js} +1 -1
- package/frontend-dist/assets/{Settings-DOjfY8tV.js → Settings-BUsDohX6.js} +1 -1
- package/frontend-dist/assets/{Setup-qzm9-FWT.js → Setup-2xmJP0f2.js} +1 -1
- package/frontend-dist/assets/{Switch-B6oVsC7A.js → Switch-Ce1RNEg2.js} +1 -1
- package/frontend-dist/assets/{TooltipTrigger-D-DKFA2f.js → TooltipTrigger-BvHKib2n.js} +1 -1
- package/frontend-dist/assets/{TransformRulesForm-C6jOPnLO.js → TransformRulesForm-BT9zoPTc.js} +1 -1
- package/frontend-dist/assets/UnifiedRequestDialog-C3sWdkTe.css +1 -0
- package/frontend-dist/assets/UnifiedRequestDialog-D_88_dFB.js +3 -0
- package/frontend-dist/assets/{VisuallyHiddenInput-Dh7_nt9D.js → VisuallyHiddenInput-B-usxRjt.js} +1 -1
- package/frontend-dist/assets/{button-B2krw-iX.js → button-Dm-cbgS5.js} +2 -2
- package/frontend-dist/assets/{copy-CmZzDtMZ.js → copy-DMw-23Tb.js} +1 -1
- package/frontend-dist/assets/{dialog-DAhG2HAN.js → dialog-Dzy4m58L.js} +1 -1
- package/frontend-dist/assets/{index-DtEzGlKv.js → index-CTaQHTod.js} +2 -2
- package/frontend-dist/assets/{model-patches-CX0qW8Tc.js → model-patches-Be68Qreu.js} +1 -1
- package/frontend-dist/assets/plus-BkH7yWn-.js +1 -0
- package/frontend-dist/assets/retryRules-CR3EIOTr.js +1 -0
- package/frontend-dist/assets/{sparkles-BXN0GrLS.js → sparkles-7mkrsmh7.js} +1 -1
- package/frontend-dist/assets/{trash-2-CdRR_084.js → trash-2-BoBubJto.js} +1 -1
- package/frontend-dist/assets/useClipboard-DebN1Yvq.js +1 -0
- package/frontend-dist/assets/{useLogRetention-FhFq_1PJ.js → useLogRetention-BGDglTVo.js} +1 -1
- package/frontend-dist/index.html +2 -2
- package/package.json +1 -1
- package/frontend-dist/assets/Logs-Dov1cUpT.js +0 -1
- package/frontend-dist/assets/Monitor-CzF_gO-D.js +0 -1
- package/frontend-dist/assets/Providers-BBbIb0zw.js +0 -1
- package/frontend-dist/assets/RetryRules-DIezWspT.js +0 -1
- package/frontend-dist/assets/RouterKeys-4wd-s4Fy.js +0 -1
- package/frontend-dist/assets/UnifiedRequestDialog-Bj4AG0sQ.css +0 -1
- package/frontend-dist/assets/UnifiedRequestDialog-Drvy6bja.js +0 -3
- package/frontend-dist/assets/plus-BXorva2M.js +0 -1
- package/frontend-dist/assets/retryRules-CEGYoM2X.js +0 -1
|
@@ -293,7 +293,7 @@ export const adminRetryRuleRoutes = (app, options, done) => {
|
|
|
293
293
|
retry_delay_ms: body.retry_delay_ms ?? DEFAULT_RETRY_DELAY_MS,
|
|
294
294
|
max_retries: body.max_retries ?? DEFAULT_MAX_RETRIES,
|
|
295
295
|
max_delay_ms: body.max_delay_ms ?? DEFAULT_MAX_DELAY_MS,
|
|
296
|
-
provider_id: body.provider_id || null,
|
|
296
|
+
provider_id: body.provider_id === "__all__" ? null : (body.provider_id || null),
|
|
297
297
|
body_matchers: bodyMatchers,
|
|
298
298
|
});
|
|
299
299
|
stateRegistry?.refreshRetryRules();
|
|
@@ -325,7 +325,7 @@ export const adminRetryRuleRoutes = (app, options, done) => {
|
|
|
325
325
|
if (body.max_delay_ms !== undefined)
|
|
326
326
|
fields.max_delay_ms = body.max_delay_ms;
|
|
327
327
|
if (body.provider_id !== undefined)
|
|
328
|
-
fields.provider_id = body.provider_id || null;
|
|
328
|
+
fields.provider_id = body.provider_id === "__all__" ? null : (body.provider_id || null);
|
|
329
329
|
if (body.body_matchers !== undefined) {
|
|
330
330
|
try {
|
|
331
331
|
fields.body_matchers = validateBodyMatchers(body.body_matchers);
|
|
@@ -461,6 +461,7 @@ export const adminRetryRuleRoutes = (app, options, done) => {
|
|
|
461
461
|
retry_delay_ms: parsed.retry_delay_ms,
|
|
462
462
|
max_retries: parsed.max_retries,
|
|
463
463
|
max_delay_ms: parsed.max_delay_ms,
|
|
464
|
+
provider_id: log.provider_id ?? null,
|
|
464
465
|
},
|
|
465
466
|
summary: parsed.summary,
|
|
466
467
|
});
|
package/dist/index.js
CHANGED
|
@@ -125,18 +125,36 @@ export async function buildApp(options) {
|
|
|
125
125
|
// 记录请求到达时间,供全局错误处理计算延迟
|
|
126
126
|
app.addHook("onRequest", (request, reply, done) => {
|
|
127
127
|
request.receivedAt = Date.now();
|
|
128
|
-
// 全局 EPIPE 防护:
|
|
129
|
-
//
|
|
130
|
-
//
|
|
128
|
+
// 全局 EPIPE 防护:
|
|
129
|
+
// EPIPE 从底层 socket 的 WriteWrap.onWriteComplete 触发,emit 在 socket 上,
|
|
130
|
+
// 不会传播到 reply.raw(ServerResponse)。reply.raw.on("error") 无法拦截 socket 的 EPIPE。
|
|
131
|
+
// 因此必须直接在 socket 上注册 error handler。
|
|
132
|
+
// Node.js HTTP server 内置的 socketOnError 只处理第一次 error(随后注册 noop 兜底),
|
|
133
|
+
// 本 handler 提供额外的永久保护层。
|
|
131
134
|
// 代理路由在 create-proxy-handler.ts 中已有额外监听,此处覆盖所有路由。
|
|
132
|
-
|
|
135
|
+
const sock = request.raw.socket;
|
|
136
|
+
const socketErrorHandler = (err) => {
|
|
137
|
+
if (err.code === "EPIPE" || err.code === "ECONNRESET") {
|
|
138
|
+
request.log.debug({ err }, "client socket error");
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
request.log.warn({ err }, "unexpected socket error");
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
sock.on("error", socketErrorHandler);
|
|
145
|
+
const replyErrorHandler = (err) => {
|
|
133
146
|
const code = err.code;
|
|
134
|
-
if (code ===
|
|
147
|
+
if (code === "EPIPE") {
|
|
135
148
|
request.log.debug({ err }, "client disconnected (EPIPE)");
|
|
136
149
|
}
|
|
137
150
|
else {
|
|
138
151
|
request.log.warn({ err }, "response stream error");
|
|
139
152
|
}
|
|
153
|
+
};
|
|
154
|
+
reply.raw.on("error", replyErrorHandler);
|
|
155
|
+
reply.raw.on("close", () => {
|
|
156
|
+
sock.removeListener("error", socketErrorHandler);
|
|
157
|
+
reply.raw.removeListener("error", replyErrorHandler);
|
|
140
158
|
});
|
|
141
159
|
done();
|
|
142
160
|
});
|
|
@@ -134,9 +134,9 @@ export function createProxyHandler(config) {
|
|
|
134
134
|
const socketErrorHandler = (err) => request.log.debug({ err }, "client socket error");
|
|
135
135
|
request.raw.socket.on("error", socketErrorHandler);
|
|
136
136
|
// reply.raw (ServerResponse) error handling
|
|
137
|
-
//
|
|
138
|
-
//
|
|
139
|
-
//
|
|
137
|
+
// 注意:EPIPE 从底层 socket 的 WriteWrap.onWriteComplete emit,不会传播到 reply.raw。
|
|
138
|
+
// 因此 reply.raw.on("error") 无法拦截 socket EPIPE——socket 级别由上面的 socketErrorHandler 和全局 onRequest hook 覆盖。
|
|
139
|
+
// 本 handler 仅处理 ServerResponse 自身可能产生的其他 error。
|
|
140
140
|
const replyErrorHandler = (err) => {
|
|
141
141
|
const code = err.code;
|
|
142
142
|
if (code === 'EPIPE') {
|
|
@@ -141,20 +141,12 @@ export class AnthropicToOpenAITransform extends BaseSSETransform {
|
|
|
141
141
|
break;
|
|
142
142
|
}
|
|
143
143
|
case "message_stop": {
|
|
144
|
-
// emit PSF as custom message_meta event before final usage
|
|
145
|
-
if (this.thinkingSignatures.length > 0 || this.cacheUsage) {
|
|
146
|
-
const meta = {};
|
|
147
|
-
if (this.thinkingSignatures.length > 0)
|
|
148
|
-
meta.thinking_signatures = this.thinkingSignatures;
|
|
149
|
-
if (this.cacheUsage)
|
|
150
|
-
meta.cache_usage = this.cacheUsage;
|
|
151
|
-
this.push(`event: message_meta\ndata: ${JSON.stringify({ provider_meta: { anthropic: meta } })}\n\n`);
|
|
152
|
-
}
|
|
153
144
|
// Anthropic input_tokens excludes cache; OpenAI prompt_tokens includes cache
|
|
154
145
|
const cacheRead = this.cacheUsage?.cache_read_input_tokens ?? 0;
|
|
155
146
|
const cacheCreation = this.cacheUsage?.cache_creation_input_tokens ?? 0;
|
|
156
147
|
const totalInput = this.inputTokens + cacheRead + cacheCreation;
|
|
157
|
-
|
|
148
|
+
// 将 provider_meta 合并到 usage chunk 中,避免独立 SSE 事件导致客户端 SDK 校验失败
|
|
149
|
+
const usageChunk = {
|
|
158
150
|
id: this.chatcmplId, object: "chat.completion.chunk",
|
|
159
151
|
choices: [],
|
|
160
152
|
usage: {
|
|
@@ -166,7 +158,16 @@ export class AnthropicToOpenAITransform extends BaseSSETransform {
|
|
|
166
158
|
cached_write_tokens: cacheCreation,
|
|
167
159
|
},
|
|
168
160
|
},
|
|
169
|
-
}
|
|
161
|
+
};
|
|
162
|
+
if (this.thinkingSignatures.length > 0 || this.cacheUsage) {
|
|
163
|
+
const meta = {};
|
|
164
|
+
if (this.thinkingSignatures.length > 0)
|
|
165
|
+
meta.thinking_signatures = this.thinkingSignatures;
|
|
166
|
+
if (this.cacheUsage)
|
|
167
|
+
meta.cache_usage = this.cacheUsage;
|
|
168
|
+
usageChunk.provider_meta = { anthropic: meta };
|
|
169
|
+
}
|
|
170
|
+
this.pushOpenAISSE(usageChunk);
|
|
170
171
|
this.pushDone();
|
|
171
172
|
break;
|
|
172
173
|
}
|
|
@@ -203,7 +203,25 @@ class StreamProxy {
|
|
|
203
203
|
if (this.closeHandlerRegistered)
|
|
204
204
|
return;
|
|
205
205
|
this.closeHandlerRegistered = true;
|
|
206
|
+
// EPIPE 从底层 socket 的 WriteWrap.onWriteComplete emit,reply.raw.on("error") 无法拦截。
|
|
207
|
+
// 必须直接在 socket 上注册 error handler 防止冒泡到 process uncaughtException。
|
|
208
|
+
// Node.js HTTP server 内置的 socketOnError 只处理第一次 socket error,
|
|
209
|
+
// 如果第一次被其他错误消耗,后续 EPIPE 可能无 handler 导致进程崩溃。
|
|
210
|
+
const sock = this.reply.raw.socket;
|
|
211
|
+
let sockErrorHandler;
|
|
212
|
+
if (sock) {
|
|
213
|
+
sockErrorHandler = (err) => {
|
|
214
|
+
if (err.code === "EPIPE" || err.code === "ECONNRESET") {
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
console.warn("[stream-proxy] socket error:", err.message);
|
|
218
|
+
};
|
|
219
|
+
sock.on("error", sockErrorHandler);
|
|
220
|
+
}
|
|
206
221
|
this.reply.raw.on("close", () => {
|
|
222
|
+
if (sockErrorHandler && sock) {
|
|
223
|
+
sock.removeListener("error", sockErrorHandler);
|
|
224
|
+
}
|
|
207
225
|
if (this.resolved)
|
|
208
226
|
return;
|
|
209
227
|
if (this.state === "BUFFERING" || this.state === "STREAMING") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Gt as e,et as t,gt as n,it as r,qt as i,r as a,yt as o}from"./button-
|
|
1
|
+
import{Gt as e,et as t,gt as n,it as r,qt as i,r as a,yt as o}from"./button-Dm-cbgS5.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)=>(n(),t(`div`,{"data-slot":`card`,"data-size":r.size,class:i(e(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))},[o(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)=>(n(),t(`div`,{"data-slot":`card-content`,class:i(e(a)(`px-4 group-data-[size=sm]/card:px-3`,s.class))},[o(r.$slots,`default`)],2))}});export{c as n,l as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Gt as e,et as t,gt as n,it as r,qt as i,r as a,yt as o}from"./button-
|
|
1
|
+
import{Gt as e,et as t,gt as n,it as r,qt as i,r as a,yt as o}from"./button-Dm-cbgS5.js";var s=r({__name:`CardHeader`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(r){let s=r;return(r,c)=>(n(),t(`div`,{"data-slot":`card-header`,class:i(e(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))},[o(r.$slots,`default`)],2))}}),c=r({__name:`CardTitle`,props:{class:{type:[Boolean,null,String,Object,Array]}},setup(r){let s=r;return(r,c)=>(n(),t(`div`,{"data-slot":`card-title`,class:i(e(a)(`text-base leading-snug font-medium group-data-[size=sm]/card:text-sm cn-font-heading`,s.class))},[o(r.$slots,`default`)],2))}});export{s as n,c as t};
|
package/frontend-dist/assets/{CascadingModelSelect-BXXqKjXW.js → CascadingModelSelect-CqzJeQWb.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{$ as e,Gt as t,H as n,J as r,L as i,Lt as a,Q as o,X as s,Xt as c,Z as l,et as u,gt as d,it as f,kt as p,qt as m,rt as h,vt as g}from"./button-
|
|
1
|
+
import{$ as e,Gt as t,H as n,J as r,L as i,Lt as a,Q as o,X as s,Xt as c,Z as l,et as u,gt as d,it as f,kt as p,qt as m,rt as h,vt as g}from"./button-Dm-cbgS5.js";import{b as _,ft as v,ht as y,v as b,y as x}from"./index-CTaQHTod.js";var S=i(`chevron-right`,[[`path`,{d:`m9 18 6-6-6-6`,key:`mthhwq`}]]),C=[`onMouseenter`],w={class:`truncate max-w-40`},T={key:0,class:`ml-1 text-[10px] px-1 py-px rounded bg-emerald-500/15 text-emerald-400 shrink-0`},E=[`onMouseenter`],D=[`onClick`],O={class:`truncate`},k={key:0,class:`shrink-0 text-xs text-muted-foreground`},A={key:0,class:`px-2 py-1.5 text-sm text-muted-foreground`},j=f({__name:`CascadingSelect`,props:{groups:{},modelValue:{},placeholder:{default:``},compact:{type:Boolean,default:!1}},emits:[`update:modelValue`],setup(i,{emit:f}){let{t:y}=n(),j=i,M=s(()=>j.placeholder||y(`common.selectPlaceholder`)),N=f,P=a(!1),F=a(null),I=s(()=>{if(!j.modelValue)return``;let e=j.groups.find(e=>e.key===j.modelValue.groupKey);if(!e)return``;let t=e.options.find(e=>e.value===j.modelValue.value);return t?`${e.label} / ${t.label}`:``});function L(e,t){N(`update:modelValue`,{groupKey:e,value:t}),P.value=!1}function R(e){P.value=e,e||(F.value=null)}return(n,a)=>(d(),o(t(_),{open:P.value,"onUpdate:open":R},{default:p(()=>[h(t(b),{"as-child":``},{default:p(()=>[l(`div`,{class:m([`flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background cursor-pointer hover:bg-accent hover:text-accent-foreground`,[i.compact?`h-8 text-xs px-2.5 py-1`:`h-10 text-sm px-3 py-2`,{"ring-2 ring-ring ring-offset-2":P.value}]])},[l(`span`,{class:m([`truncate`,i.modelValue?`text-foreground`:`text-muted-foreground`])},c(I.value||M.value),3),h(t(v),{class:`h-4 w-4 shrink-0 opacity-50`})],2)]),_:1}),h(t(x),{align:`start`,"side-offset":4,class:`z-[200] w-auto min-w-56 overflow-visible p-1`},{default:p(()=>[(d(!0),u(r,null,g(i.groups,n=>(d(),u(`div`,{key:n.key,class:m([`relative flex cursor-pointer items-center justify-between rounded-sm px-2 py-1.5 text-sm hover:bg-accent hover:text-accent-foreground`,{"bg-accent text-accent-foreground z-10":F.value===n.key}]),onMouseenter:e=>F.value=n.key},[l(`span`,w,c(n.label),1),n.badge?(d(),u(`span`,T,c(n.badge),1)):e(``,!0),h(t(S),{class:`ml-1 h-4 w-4 shrink-0 opacity-50`}),F.value===n.key&&n.options.length>0?(d(),u(`div`,{key:1,class:`absolute left-full top-0 ml-0.5 min-w-48 rounded-md border bg-popover p-1 text-popover-foreground shadow-md`,onMouseenter:e=>F.value=n.key},[(d(!0),u(r,null,g(n.options,t=>(d(),u(`div`,{key:t.value,class:m([`flex cursor-pointer items-center justify-between gap-2 rounded-sm px-2 py-1.5 text-sm hover:bg-accent hover:text-accent-foreground`,{"bg-accent text-accent-foreground":i.modelValue?.groupKey===n.key&&i.modelValue?.value===t.value}]),onClick:e=>L(n.key,t.value)},[l(`span`,O,c(t.label),1),t.tag?(d(),u(`span`,k,c(t.tag),1)):e(``,!0)],10,D))),128))],40,E)):e(``,!0)],42,C))),128)),i.groups.length===0?(d(),u(`div`,A,c(t(y)(`common.noOptions`)),1)):e(``,!0)]),_:1})]),_:1},8,[`open`]))}}),M=f({__name:`CascadingModelSelect`,props:{providers:{},modelValue:{},placeholder:{default:``},compact:{type:Boolean}},emits:[`update:modelValue`],setup(e,{emit:t}){let{t:r}=n(),i=e,a=s(()=>i.placeholder||r(`mappings.selectProviderModel`)),c=t,l=s(()=>i.providers.map(e=>({key:e.provider.id,label:e.provider.name,badge:e.isNew?r(`common.new`):void 0,options:e.models.map(e=>({value:e.name,label:e.name,tag:y(e.contextWindow)}))}))),u=s(()=>i.modelValue?{groupKey:i.modelValue.provider_id,value:i.modelValue.model}:void 0);function f(e){c(`update:modelValue`,{provider_id:e.groupKey,model:e.value})}return(t,n)=>(d(),o(j,{groups:l.value,"model-value":u.value,placeholder:a.value,compact:e.compact,"onUpdate:modelValue":f},null,8,[`groups`,`model-value`,`placeholder`,`compact`]))}});export{M as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{$ as e,Gt as t,Jt as n,K as r,Q as i,X as a,dt as o,gt as s,i as c,it as l,kt as u,m as d,o as f,ot as p,q as m,r as h,rt as g,x as _,xt as v,yt as y}from"./button-
|
|
1
|
+
import{$ as e,Gt as t,Jt as n,K as r,Q as i,X as a,dt as o,gt as s,i as c,it as l,kt as u,m as d,o as f,ot as p,q as m,r as h,rt as g,x as _,xt as v,yt as y}from"./button-Dm-cbgS5.js";import{t as b}from"./VisuallyHiddenInput-B-usxRjt.js";import{t as x}from"./RovingFocusItem-D3EohvxE.js";import{J as S,K as C,R as w,U as T,V as E,X as D,pt as O}from"./index-CTaQHTod.js";function k(e,t){return C(e)?!1:Array.isArray(e)?e.some(e=>D(e,t)):D(e,t)}var[A,j]=S(`CheckboxGroupRoot`);function M(e){return e===`indeterminate`}function N(e){return M(e)?`indeterminate`:e?`checked`:`unchecked`}var[P,F]=S(`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(n,{emit:l}){let p=n,h=l,{forwardRef:g,currentElement:_}=f(),S=A(null),w=d(p,`modelValue`,h,{defaultValue:p.defaultValue??p.falseValue,passive:p.modelValue===void 0}),E=a(()=>S?.disabled.value||p.disabled),O=a(()=>D(w.value,p.trueValue)),j=a(()=>C(S?.modelValue.value)?w.value===`indeterminate`?`indeterminate`:O.value:k(S.modelValue.value,p.value));function P(){if(C(S?.modelValue.value))w.value===`indeterminate`?w.value=p.trueValue:w.value=O.value?p.falseValue:p.trueValue;else{let e=[...S.modelValue.value||[]];if(k(e,p.value)){let t=e.findIndex(e=>D(e,p.value));e.splice(t,1)}else e.push(p.value);S.modelValue.value=e}}let I=T(_),L=a(()=>p.id&&_.value?document.querySelector(`[for="${p.id}"]`)?.innerText:void 0);return F({disabled:E,state:j}),(n,a)=>(s(),i(v(t(S)?.rovingFocus.value?t(x):t(c)),o(n.$attrs,{id:n.id,ref:t(g),role:`checkbox`,"as-child":n.asChild,as:n.as,type:n.as===`button`?`button`:void 0,"aria-checked":t(M)(j.value)?`mixed`:j.value,"aria-required":n.required,"aria-label":n.$attrs[`aria-label`]||L.value,"data-state":t(N)(j.value),"data-disabled":E.value?``:void 0,disabled:E.value,focusable:t(S)?.rovingFocus.value?!E.value:void 0,onKeydown:r(m(()=>{},[`prevent`]),[`enter`]),onClick:P}),{default:u(()=>[y(n.$slots,`default`,{modelValue:t(w),state:j.value}),t(I)&&n.name&&!t(S)?(s(),i(t(b),{key:0,type:`checkbox`,checked:!!j.value,name:n.name,value:n.value,disabled:E.value,required:n.required},null,8,[`checked`,`name`,`value`,`disabled`,`required`])):e(`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(e){let{forwardRef:n}=f(),r=P();return(e,a)=>(s(),i(t(w),{present:e.forceMount||t(M)(t(r).state.value)||t(r).state.value===!0},{default:u(()=>[g(t(c),o({ref:t(n),"data-state":t(N)(t(r).state.value),"data-disabled":t(r).disabled.value?``:void 0,style:{pointerEvents:`none`},"as-child":e.asChild,as:e.as},e.$attrs),{default:u(()=>[y(e.$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(e,{emit:r}){let a=e,c=r,l=E(_(a,`class`),c);return(e,r)=>(s(),i(t(I),o({"data-slot":`checkbox`},t(l),{class:t(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`,a.class)}),{default:u(r=>[g(t(L),{"data-slot":`checkbox-indicator`,class:`[&>svg]:size-3.5 grid place-content-center text-current transition-none`},{default:u(()=>[y(e.$slots,`default`,n(p(r)),()=>[g(t(O))])]),_:2},1024)]),_:3},16,[`class`]))}});export{R as t};
|
package/frontend-dist/assets/{CollapsibleContent-C2QNOTgI.js → CollapsibleContent-DRXTjuF_.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{$ as e,Et as t,Gt as n,Ht as r,Jt as i,Lt as a,Q as o,X as s,d as c,dt as l,ft as u,gt as d,i as f,it as p,kt as m,m as h,mt as g,o as _,ot as v,rt as y,yt as b}from"./button-
|
|
1
|
+
import{$ as e,Et as t,Gt as n,Ht as r,Jt as i,Lt as a,Q as o,X as s,d as c,dt as l,ft as u,gt as d,i as f,it as p,kt as m,m as h,mt as g,o as _,ot as v,rt as y,yt as b}from"./button-Dm-cbgS5.js";import{B as x,J as S,R as C,V as w}from"./index-CTaQHTod.js";var[T,E]=S(`CollapsibleRoot`),D=p({__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:i}){let a=e,s=h(a,`open`,i,{defaultValue:a.defaultOpen,passive:a.open===void 0}),{disabled:c,unmountOnHide:l}=r(a);return E({contentId:``,disabled:c,open:s,unmountOnHide:l,onOpenToggle:()=>{c.value||(s.value=!s.value)}}),t({open:s}),_(),(e,t)=>(d(),o(n(f),{as:e.as,"as-child":a.asChild,"data-state":n(s)?`open`:`closed`,"data-disabled":n(c)?``:void 0},{default:m(()=>[b(e.$slots,`default`,{open:n(s)})]),_:3},8,[`as`,`as-child`,`data-state`,`data-disabled`]))}}),O=p({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:i}){let p=r,h=i,v=T();v.contentId||=x(void 0,`reka-collapsible-content`);let S=a(),{forwardRef:w,currentElement:E}=_(),D=a(0),O=a(0),k=s(()=>v.open.value),A=a(k.value),j=a();t(()=>[k.value,S.value?.present],async()=>{await u();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=s(()=>A.value&&v.open.value);return g(()=>{requestAnimationFrame(()=>{A.value=!1})}),c(E,`beforematch`,e=>{requestAnimationFrame(()=>{v.onOpenToggle(),h(`contentFound`)})}),(t,r)=>(d(),o(n(C),{ref_key:`presentRef`,ref:S,present:t.forceMount||n(v).open.value,"force-mount":!0},{default:m(({present:r})=>[y(n(f),l(t.$attrs,{id:n(v).contentId,ref:n(w),"as-child":p.asChild,as:t.as,hidden:r?void 0:n(v).unmountOnHide.value?``:`until-found`,"data-state":M.value?void 0:n(v).open.value?`open`:`closed`,"data-disabled":n(v).disabled?.value?``:void 0,style:{"--reka-collapsible-content-height":`${O.value}px`,"--reka-collapsible-content-width":`${D.value}px`}}),{default:m(()=>[!n(v).unmountOnHide.value||r?b(t.$slots,`default`,{key:0}):e(`v-if`,!0)]),_:2},1040,[`id`,`as-child`,`as`,`hidden`,`data-state`,`data-disabled`,`style`])]),_:3},8,[`present`]))}}),k=p({__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:t}){let r=w(e,t);return(e,t)=>(d(),o(n(D),l({"data-slot":`collapsible`},n(r)),{default:m(t=>[b(e.$slots,`default`,i(v(t)))]),_:3},16))}}),A=p({__name:`CollapsibleContent`,props:{forceMount:{type:Boolean},asChild:{type:Boolean},as:{}},setup(e){let t=e;return(e,r)=>(d(),o(n(O),l({"data-slot":`collapsible-content`},t),{default:m(()=>[b(e.$slots,`default`)]),_:3},16))}});export{k as n,T as r,A as t};
|
package/frontend-dist/assets/{CollapsibleTrigger-B03rpgqE.js → CollapsibleTrigger-BusSosYR.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Gt as e,Ht as t,Jt as n,K as r,Lt as i,Q as a,X as o,dt as s,gt as c,i as l,it as u,kt as d,m as f,o as p,ot as m,q as h,r as g,rt as _,x as v,yt as y,zt as b}from"./button-
|
|
1
|
+
import{Gt as e,Ht as t,Jt as n,K as r,Lt as i,Q as a,X as o,dt as s,gt as c,i as l,it as u,kt as d,m as f,o as p,ot as m,q as h,r as g,rt as _,x as v,yt as y,zt as b}from"./button-Dm-cbgS5.js";import{r as x}from"./CollapsibleContent-DRXTjuF_.js";import{n as S,t as C}from"./RovingFocusItem-D3EohvxE.js";import{B as w,H as T,J as E,V as D,W as O}from"./index-CTaQHTod.js";var k=u({__name:`CollapsibleTrigger`,props:{asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`button`}},setup(t){let n=t;p();let r=x();return(t,i)=>(c(),a(e(l),{type:t.as===`button`?`button`:void 0,as:t.as,"as-child":n.asChild,"aria-controls":e(r).contentId,"aria-expanded":e(r).open.value,"data-state":e(r).open.value?`open`:`closed`,"data-disabled":e(r).disabled?.value?``:void 0,disabled:e(r).disabled?.value,onClick:e(r).onOpenToggle},{default:d(()=>[y(t.$slots,`default`)]),_:3},8,[`type`,`as`,`as-child`,`aria-controls`,`aria-expanded`,`data-state`,`data-disabled`,`disabled`,`onClick`]))}}),[A,j]=E(`TabsRoot`),M=u({__name:`TabsRoot`,props:{defaultValue:{type:null,required:!1},orientation:{type:String,required:!1,default:`horizontal`},dir:{type:String,required:!1},activationMode:{type:String,required:!1,default:`automatic`},modelValue:{type:null,required:!1},unmountOnHide:{type:Boolean,required:!1,default:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},emits:[`update:modelValue`],setup(n,{emit:r}){let o=n,s=r,{orientation:u,unmountOnHide:m,dir:h}=t(o),g=O(h);p();let _=f(o,`modelValue`,s,{defaultValue:o.defaultValue,passive:o.modelValue===void 0}),v=i(),x=b(new Set);return j({modelValue:_,changeModelValue:e=>{_.value=e},orientation:u,dir:g,unmountOnHide:m,activationMode:o.activationMode,baseId:w(void 0,`reka-tabs`),tabsList:v,contentIds:x,registerContent:e=>{x.value=new Set([...x.value,e])},unregisterContent:e=>{let t=new Set(x.value);t.delete(e),x.value=t}}),(t,n)=>(c(),a(e(l),{dir:e(g),"data-orientation":e(u),"as-child":t.asChild,as:t.as},{default:d(()=>[y(t.$slots,`default`,{modelValue:e(_)})]),_:3},8,[`dir`,`data-orientation`,`as-child`,`as`]))}});function N(e,t){return`${e}-trigger-${t}`}function P(e,t){return`${e}-content-${t}`}var F=u({__name:`TabsList`,props:{loop:{type:Boolean,required:!1,default:!0},asChild:{type:Boolean,required:!1},as:{type:null,required:!1}},setup(n){let{loop:r}=t(n),{forwardRef:i,currentElement:o}=p(),s=A();return s.tabsList=o,(t,n)=>(c(),a(e(S),{"as-child":``,orientation:e(s).orientation.value,dir:e(s).dir.value,loop:e(r)},{default:d(()=>[_(e(l),{ref:e(i),role:`tablist`,"as-child":t.asChild,as:t.as,"aria-orientation":e(s).orientation.value},{default:d(()=>[y(t.$slots,`default`)]),_:3},8,[`as-child`,`as`,`aria-orientation`])]),_:3},8,[`orientation`,`dir`,`loop`]))}}),I=u({__name:`TabsTrigger`,props:{value:{type:[String,Number],required:!0},disabled:{type:Boolean,required:!1,default:!1},asChild:{type:Boolean,required:!1},as:{type:null,required:!1,default:`button`}},setup(t){let n=t,{forwardRef:i}=p(),s=A(),u=o(()=>N(s.baseId,n.value)),f=o(()=>s.contentIds.value.has(n.value)?P(s.baseId,n.value):void 0),m=o(()=>n.value===s.modelValue.value);return(t,n)=>(c(),a(e(C),{"as-child":``,focusable:!t.disabled,active:m.value},{default:d(()=>[_(e(l),{id:u.value,ref:e(i),role:`tab`,type:t.as===`button`?`button`:void 0,as:t.as,"as-child":t.asChild,"aria-selected":m.value?`true`:`false`,"aria-controls":f.value,"data-state":m.value?`active`:`inactive`,disabled:t.disabled,"data-disabled":t.disabled?``:void 0,"data-orientation":e(s).orientation.value,onMousedown:n[0]||=h(n=>{!t.disabled&&n.ctrlKey===!1?e(s).changeModelValue(t.value):n.preventDefault()},[`left`]),onKeydown:n[1]||=r(n=>e(s).changeModelValue(t.value),[`enter`,`space`]),onFocus:n[2]||=()=>{let n=e(s).activationMode!==`manual`;!m.value&&!t.disabled&&n&&e(s).changeModelValue(t.value)}},{default:d(()=>[y(t.$slots,`default`)]),_:3},8,[`id`,`type`,`as`,`as-child`,`aria-selected`,`aria-controls`,`data-state`,`disabled`,`data-disabled`,`data-orientation`])]),_:3},8,[`focusable`,`active`]))}}),L=u({__name:`Tabs`,props:{defaultValue:{},orientation:{},dir:{},activationMode:{},modelValue:{},unmountOnHide:{type:Boolean},asChild:{type:Boolean},as:{},class:{type:[Boolean,null,String,Object,Array]}},emits:[`update:modelValue`],setup(t,{emit:r}){let i=t,o=r,l=D(v(i,`class`),o);return(t,r)=>(c(),a(e(M),s({"data-slot":`tabs`,"data-orientation":e(l).orientation||`horizontal`},e(l),{class:e(g)(`gap-2 group/tabs flex data-[orientation=horizontal]:flex-col`,i.class)}),{default:d(e=>[y(t.$slots,`default`,n(m(e)))]),_:3},16,[`data-orientation`,`class`]))}}),R=u({__name:`TabsList`,props:{loop:{type:Boolean},asChild:{type:Boolean},as:{},class:{type:[Boolean,null,String,Object,Array]},variant:{default:`default`}},setup(t){let n=t,r=v(n,`class`,`variant`);return(i,o)=>(c(),a(e(F),s({"data-slot":`tabs-list`,"data-variant":t.variant},e(r),{class:e(g)(`rounded-lg p-[3px] group-data-[orientation=horizontal]/tabs:h-8 data-[variant=line]:rounded-none group/tabs-list inline-flex w-fit items-center justify-center text-muted-foreground group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col`,t.variant===`default`&&`bg-muted`,t.variant===`line`&&`gap-1 bg-transparent`,n.class)}),{default:d(()=>[y(i.$slots,`default`)]),_:3},16,[`data-variant`,`class`]))}}),z=u({__name:`TabsTrigger`,props:{value:{},disabled:{type:Boolean},asChild:{type:Boolean},as:{},class:{type:[Boolean,null,String,Object,Array]}},setup(t){let n=t,r=T(v(n,`class`));return(t,i)=>(c(),a(e(I),s({"data-slot":`tabs-trigger`,class:e(g)(`gap-1.5 rounded-md border border-transparent px-1.5 py-0.5 text-sm font-medium group-data-[variant=default]/tabs-list:data-[state=active]:shadow-sm group-data-[variant=line]/tabs-list:data-[state=active]:shadow-none [&_svg:not([class*=size-])]:size-4 has-data-[icon=inline-end]:pr-1 has-data-[icon=inline-start]:pl-1 relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center whitespace-nowrap text-foreground/60 transition-all group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 dark:text-muted-foreground dark:hover:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0`,`group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:border-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent`,`data-[state=active]:bg-background data-[state=active]:text-foreground dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 dark:data-[state=active]:text-foreground`,`after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-[orientation=horizontal]/tabs:after:inset-x-0 group-data-[orientation=horizontal]/tabs:after:bottom-[-5px] group-data-[orientation=horizontal]/tabs:after:h-0.5 group-data-[orientation=vertical]/tabs:after:inset-y-0 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=vertical]/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-[state=active]:after:opacity-100`,n.class)},e(r)),{default:d(()=>[y(t.$slots,`default`)]),_:3},16,[`class`]))}}),B=u({__name:`CollapsibleTrigger`,props:{asChild:{type:Boolean},as:{}},setup(t){let n=t;return(t,r)=>(c(),a(e(k),s({"data-slot":`collapsible-trigger`},n),{default:d(()=>[y(t.$slots,`default`)]),_:3},16))}});export{P as a,L as i,z as n,N as o,R as r,A as s,B as t};
|