@opentiny/tiny-robot 0.5.2-alpha.10 → 0.5.2-alpha.15

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.
@@ -0,0 +1,1009 @@
1
+ import { shallowRef as V, computed as g, watch as Y, nextTick as Z, defineComponent as J, openBlock as p, createElementBlock as b, createElementVNode as I, toDisplayString as F, Fragment as ae, renderList as re, normalizeClass as W, withModifiers as pe, renderSlot as D, createBlock as _, resolveDynamicComponent as se, createCommentVNode as z, createVNode as N, unref as P, createSlots as te, withCtx as H, mergeProps as ue, onMounted as ce, onBeforeUnmount as ye, normalizeStyle as be, normalizeProps as U, guardReactiveProps as j, onScopeDispose as we, toRaw as ke, getCurrentInstance as $e, Teleport as Ee } from "vue";
2
+ import { IconCheck as Oe, IconSearch as Se, IconNoData as xe, IconArrowDown as Me } from "@opentiny/tiny-robot-svgs";
3
+ import { a as Pe, c as Ve, o as Te, f as Ce, s as De, b as Ie } from "../floating-ui.dom.js";
4
+ import { u as ze } from "../useTeleportTarget.js";
5
+ function Be(e) {
6
+ const a = V(""), n = g(() => a.value.trim()), l = g(() => {
7
+ const d = e.options(), i = n.value;
8
+ if (!e.searchable() || !i)
9
+ return d;
10
+ const r = e.filterMethod();
11
+ if (r)
12
+ return d.filter((m) => r(i, m.raw));
13
+ const u = i.toLocaleLowerCase();
14
+ return d.filter((m) => m.searchText.includes(u));
15
+ }), s = g(() => {
16
+ const d = /* @__PURE__ */ new Map();
17
+ return l.value.forEach((i) => {
18
+ var u, m;
19
+ const r = d.get(i.groupKey);
20
+ if (r) {
21
+ r.items.push(i);
22
+ return;
23
+ }
24
+ d.set(i.groupKey, {
25
+ key: i.groupKey,
26
+ index: d.size,
27
+ group: ((u = i.raw.group) == null ? void 0 : u.trim()) ?? "",
28
+ label: ((m = i.raw.group) == null ? void 0 : m.trim()) ?? "",
29
+ items: [i]
30
+ });
31
+ }), [...d.values()];
32
+ }), f = g(() => l.value.length === 0);
33
+ function c(d) {
34
+ a.value = d;
35
+ }
36
+ function h() {
37
+ a.value = "";
38
+ }
39
+ return {
40
+ query: a,
41
+ visibleOptions: l,
42
+ groups: s,
43
+ isEmpty: f,
44
+ setQuery: c,
45
+ clearQuery: h
46
+ };
47
+ }
48
+ function Le(e) {
49
+ const a = V(null), n = g(() => e.options().find((i) => i.key === a.value) ?? null);
50
+ function l() {
51
+ return e.options().filter((i) => !i.disabled);
52
+ }
53
+ function s(i) {
54
+ if (i === null) {
55
+ a.value = null;
56
+ return;
57
+ }
58
+ const r = e.options().find((u) => u.key === i);
59
+ r && !r.disabled && (a.value = r.key);
60
+ }
61
+ function f() {
62
+ a.value = null;
63
+ }
64
+ function c(i) {
65
+ const r = l(), u = i === "first" ? r[0] : r[r.length - 1];
66
+ a.value = (u == null ? void 0 : u.key) ?? null;
67
+ }
68
+ function h(i = "first") {
69
+ const r = e.selectedValue(), u = e.options().find((m) => m.value === r && !m.disabled);
70
+ if (u) {
71
+ a.value = u.key;
72
+ return;
73
+ }
74
+ c(i);
75
+ }
76
+ function d(i) {
77
+ var y, x;
78
+ const r = l();
79
+ if (r.length === 0) {
80
+ f();
81
+ return;
82
+ }
83
+ const u = r.findIndex((k) => k.key === a.value);
84
+ if (u < 0) {
85
+ const k = i === 1 ? 0 : r.length - 1;
86
+ a.value = ((y = r[k]) == null ? void 0 : y.key) ?? null;
87
+ return;
88
+ }
89
+ const m = (u + i + r.length) % r.length;
90
+ a.value = ((x = r[m]) == null ? void 0 : x.key) ?? null;
91
+ }
92
+ return Y(
93
+ () => [e.enabled(), e.options(), e.selectedValue()],
94
+ ([i, r, u], m) => {
95
+ if (!i) {
96
+ f();
97
+ return;
98
+ }
99
+ const y = m == null ? void 0 : m[2], x = r.find(($) => $.value === u && !$.disabled);
100
+ if (u !== y && x) {
101
+ a.value = x.key;
102
+ return;
103
+ }
104
+ (a.value ? r.some(($) => $.key === a.value && !$.disabled) : !1) || h("first");
105
+ },
106
+ { immediate: !0 }
107
+ ), Y(a, async (i) => {
108
+ if (!i || !e.enabled())
109
+ return;
110
+ await Z();
111
+ const r = e.containerEl.value, u = Array.from(
112
+ (r == null ? void 0 : r.querySelectorAll("[data-model-selector-option-key]")) ?? []
113
+ ).find((m) => m.dataset.modelSelectorOptionKey === i);
114
+ u == null || u.scrollIntoView({ block: "nearest" });
115
+ }), {
116
+ highlightedKey: a,
117
+ highlightedOption: n,
118
+ setHighlightedKey: s,
119
+ resetHighlight: f,
120
+ highlightBoundary: c,
121
+ highlightSelectedOrBoundary: h,
122
+ moveHighlight: d
123
+ };
124
+ }
125
+ const Re = { class: "tr-model-selector__effort" }, Ke = { class: "tr-model-selector__effort-label" }, qe = ["aria-label"], Fe = ["disabled", "aria-pressed", "data-model-selector-effort-value", "onClick"], Ae = /* @__PURE__ */ J({
126
+ name: "TrModelSelectorEffort",
127
+ __name: "ModelSelectorEffort",
128
+ props: {
129
+ options: {},
130
+ value: {},
131
+ label: {},
132
+ disabled: { type: Boolean }
133
+ },
134
+ emits: ["select"],
135
+ setup(e) {
136
+ return (a, n) => (p(), b("div", Re, [
137
+ I("span", Ke, F(e.label), 1),
138
+ I("div", {
139
+ class: "tr-model-selector__effort-options",
140
+ role: "group",
141
+ "aria-label": e.label
142
+ }, [
143
+ (p(!0), b(ae, null, re(e.options, (l) => (p(), b("button", {
144
+ key: l.value,
145
+ type: "button",
146
+ class: W(["tr-model-selector__effort-option", { "is-active": l.value === e.value }]),
147
+ disabled: e.disabled || l.disabled,
148
+ "aria-pressed": l.value === e.value,
149
+ "data-model-selector-effort-value": l.value,
150
+ onClick: (s) => a.$emit("select", l.value)
151
+ }, F(l.label), 11, Fe))), 128))
152
+ ], 8, qe)
153
+ ]));
154
+ }
155
+ }), He = ["id", "data-model-selector-option-key", "aria-selected", "aria-disabled", "aria-describedby"], Ue = { class: "tr-model-selector__option-main" }, je = ["src"], Ne = { class: "tr-model-selector__option-text" }, We = ["title"], Qe = ["id", "title"], Ge = /* @__PURE__ */ J({
156
+ name: "TrModelSelectorItem",
157
+ __name: "ModelSelectorItem",
158
+ props: {
159
+ option: {},
160
+ selected: { type: Boolean },
161
+ highlighted: { type: Boolean },
162
+ optionId: {},
163
+ descriptionId: {}
164
+ },
165
+ emits: ["hover", "select"],
166
+ setup(e, { emit: a }) {
167
+ const n = e, l = a;
168
+ function s() {
169
+ n.option.disabled || l("hover", n.option.key);
170
+ }
171
+ function f() {
172
+ n.option.disabled || l("select", n.option.raw);
173
+ }
174
+ return (c, h) => (p(), b("div", {
175
+ id: e.optionId,
176
+ class: W(["tr-model-selector__option", {
177
+ "is-selected": e.selected,
178
+ "is-highlighted": e.highlighted,
179
+ "is-disabled": e.option.disabled
180
+ }]),
181
+ "data-model-selector-option-key": e.option.key,
182
+ role: "option",
183
+ "aria-selected": e.selected,
184
+ "aria-disabled": e.option.disabled || void 0,
185
+ "aria-describedby": e.option.description && !c.$slots.item ? e.descriptionId : void 0,
186
+ onMouseenter: s,
187
+ onMousedown: h[0] || (h[0] = pe(() => {
188
+ }, ["prevent"])),
189
+ onClick: f
190
+ }, [
191
+ D(c.$slots, "item", {
192
+ option: e.option.raw,
193
+ selected: e.selected,
194
+ highlighted: e.highlighted
195
+ }, () => [
196
+ I("span", Ue, [
197
+ typeof e.option.icon == "string" ? (p(), b("img", {
198
+ key: 0,
199
+ src: e.option.icon,
200
+ class: "tr-model-selector__option-icon",
201
+ alt: "",
202
+ "aria-hidden": "true"
203
+ }, null, 8, je)) : e.option.icon ? (p(), _(se(e.option.icon), {
204
+ key: 1,
205
+ class: "tr-model-selector__option-icon",
206
+ "aria-hidden": "true",
207
+ focusable: "false"
208
+ })) : z("", !0),
209
+ I("span", Ne, [
210
+ I("span", {
211
+ class: "tr-model-selector__option-label",
212
+ title: e.option.label
213
+ }, F(e.option.label), 9, We),
214
+ e.option.description ? (p(), b("span", {
215
+ key: 0,
216
+ id: e.descriptionId,
217
+ class: "tr-model-selector__option-description",
218
+ title: e.option.description
219
+ }, F(e.option.description), 9, Qe)) : z("", !0)
220
+ ])
221
+ ]),
222
+ N(P(Oe), {
223
+ class: "tr-model-selector__option-check",
224
+ "aria-hidden": "true",
225
+ focusable: "false"
226
+ })
227
+ ])
228
+ ], 42, He));
229
+ }
230
+ }), Ye = ["role", "aria-labelledby"], Je = ["id"], Xe = /* @__PURE__ */ J({
231
+ name: "TrModelSelectorGroup",
232
+ __name: "ModelSelectorGroup",
233
+ props: {
234
+ group: {},
235
+ selectedValue: {},
236
+ highlightedKey: {},
237
+ optionIdPrefix: {}
238
+ },
239
+ emits: ["hover", "select"],
240
+ setup(e) {
241
+ return (a, n) => (p(), b("div", {
242
+ class: "tr-model-selector__group",
243
+ role: e.group.label ? "group" : "presentation",
244
+ "aria-labelledby": e.group.label ? `${e.optionIdPrefix}-group-${e.group.index}` : void 0
245
+ }, [
246
+ e.group.label ? (p(), b("div", {
247
+ key: 0,
248
+ id: `${e.optionIdPrefix}-group-${e.group.index}`,
249
+ class: "tr-model-selector__group-title"
250
+ }, F(e.group.label), 9, Je)) : z("", !0),
251
+ (p(!0), b(ae, null, re(e.group.items, (l) => (p(), _(Ge, {
252
+ key: l.key,
253
+ option: l,
254
+ selected: e.selectedValue === l.value,
255
+ highlighted: e.highlightedKey === l.key,
256
+ "option-id": `${e.optionIdPrefix}-option-${l.index}`,
257
+ "description-id": `${e.optionIdPrefix}-option-${l.index}-description`,
258
+ onHover: n[0] || (n[0] = (s) => a.$emit("hover", s)),
259
+ onSelect: n[1] || (n[1] = (s) => a.$emit("select", s))
260
+ }, te({ _: 2 }, [
261
+ a.$slots.item ? {
262
+ name: "item",
263
+ fn: H((s) => [
264
+ D(a.$slots, "item", ue({ ref_for: !0 }, s))
265
+ ]),
266
+ key: "0"
267
+ } : void 0
268
+ ]), 1032, ["option", "selected", "highlighted", "option-id", "description-id"]))), 128))
269
+ ], 8, Ye));
270
+ }
271
+ }), Ze = {
272
+ key: 0,
273
+ class: "tr-model-selector__header"
274
+ }, _e = {
275
+ key: 1,
276
+ class: "tr-model-selector__search"
277
+ }, et = ["value", "placeholder", "aria-label", "aria-controls", "aria-activedescendant"], tt = {
278
+ key: 2,
279
+ class: "tr-model-selector__empty",
280
+ role: "status",
281
+ "aria-live": "polite"
282
+ }, lt = ["id", "aria-label", "aria-activedescendant"], ot = {
283
+ key: 3,
284
+ class: "tr-model-selector__footer"
285
+ }, nt = /* @__PURE__ */ J({
286
+ name: "TrModelSelectorPanel",
287
+ __name: "ModelSelectorPanel",
288
+ props: {
289
+ options: {},
290
+ selectedValue: {},
291
+ searchable: { type: Boolean },
292
+ filterMethod: { type: Function },
293
+ listboxId: {},
294
+ optionIdPrefix: {},
295
+ placeholder: {},
296
+ searchPlaceholder: {},
297
+ emptyText: {},
298
+ effortOptions: {},
299
+ effortValue: {},
300
+ effortLabel: {},
301
+ effortDisabled: { type: Boolean },
302
+ size: {},
303
+ panelClass: {},
304
+ slotContext: {}
305
+ },
306
+ emits: ["select", "select-effort", "close"],
307
+ setup(e, { emit: a }) {
308
+ const n = e, l = a, s = V(null), f = V(null), c = V(null), h = V(null);
309
+ let d;
310
+ const i = g(
311
+ () => h.value === null ? void 0 : { "--tr-model-selector-open-min-width": `${h.value}px` }
312
+ ), r = Be({
313
+ options: () => n.options,
314
+ searchable: () => n.searchable,
315
+ filterMethod: () => n.filterMethod
316
+ }), u = Le({
317
+ enabled: () => !0,
318
+ options: () => r.visibleOptions.value,
319
+ selectedValue: () => n.selectedValue,
320
+ containerEl: f
321
+ }), m = g(() => {
322
+ const t = u.highlightedOption.value;
323
+ return t ? `${n.optionIdPrefix}-option-${t.index}` : void 0;
324
+ }), y = g(() => ({
325
+ ...n.slotContext,
326
+ query: r.query.value
327
+ })), x = g(() => ({
328
+ ...y.value,
329
+ reasoningEfforts: n.effortOptions,
330
+ reasoningEffortOption: n.effortOptions.find((t) => t.value === n.effortValue) ?? null,
331
+ setReasoningEffort: (t) => l("select-effort", t)
332
+ }));
333
+ function k(t) {
334
+ r.setQuery(t.target.value);
335
+ }
336
+ function $() {
337
+ const t = n.searchable ? s.value : f.value;
338
+ t == null || t.focus({ preventScroll: !0 });
339
+ }
340
+ async function E() {
341
+ var S, M;
342
+ await Z();
343
+ const t = ((S = s.value) == null ? void 0 : S.ownerDocument.defaultView) ?? ((M = f.value) == null ? void 0 : M.ownerDocument.defaultView);
344
+ if (!t || typeof t.requestAnimationFrame != "function") {
345
+ $();
346
+ return;
347
+ }
348
+ t.requestAnimationFrame(() => {
349
+ $();
350
+ });
351
+ }
352
+ function R() {
353
+ const t = u.highlightedOption.value;
354
+ t && l("select", t.raw);
355
+ }
356
+ function T(t) {
357
+ return t.isComposing || t.keyCode === 229;
358
+ }
359
+ function O(t) {
360
+ if (!(t.defaultPrevented || T(t))) {
361
+ if (t.key === "ArrowDown" || t.key === "ArrowUp") {
362
+ t.preventDefault(), u.moveHighlight(t.key === "ArrowDown" ? 1 : -1);
363
+ return;
364
+ }
365
+ if (t.key === "Enter") {
366
+ t.preventDefault(), R();
367
+ return;
368
+ }
369
+ t.key === "Escape" && (t.preventDefault(), l("close", !0));
370
+ }
371
+ }
372
+ function K(t) {
373
+ if (!(t.defaultPrevented || T(t))) {
374
+ if (t.key === "ArrowDown" || t.key === "ArrowUp") {
375
+ t.preventDefault(), u.moveHighlight(t.key === "ArrowDown" ? 1 : -1);
376
+ return;
377
+ }
378
+ if (t.key === "Home" || t.key === "End") {
379
+ t.preventDefault(), u.highlightBoundary(t.key === "Home" ? "first" : "last");
380
+ return;
381
+ }
382
+ (t.key === "Enter" || t.key === " " || t.key === "Spacebar") && (t.preventDefault(), R());
383
+ }
384
+ }
385
+ function Q(t) {
386
+ t.defaultPrevented || t.key === "Escape" && (t.preventDefault(), l("close", !0));
387
+ }
388
+ return ce(() => {
389
+ var B;
390
+ const t = c.value, S = (B = t == null ? void 0 : t.ownerDocument.defaultView) == null ? void 0 : B.ResizeObserver;
391
+ function M() {
392
+ if (!t)
393
+ return;
394
+ const q = Math.ceil(t.getBoundingClientRect().width);
395
+ q > (h.value ?? 0) && (h.value = q);
396
+ }
397
+ M(), t && S && (d = new S(M), d.observe(t)), E();
398
+ }), ye(() => {
399
+ d == null || d.disconnect();
400
+ }), Y(
401
+ () => n.searchable,
402
+ async () => {
403
+ r.clearQuery(), await E();
404
+ }
405
+ ), (t, S) => (p(), b("div", {
406
+ ref_key: "panelEl",
407
+ ref: c,
408
+ class: W(["tr-model-selector__panel", [`tr-model-selector__panel--${e.size}`, e.panelClass]]),
409
+ style: be(i.value),
410
+ onKeydown: Q
411
+ }, [
412
+ t.$slots.header ? (p(), b("div", Ze, [
413
+ D(t.$slots, "header", U(j(y.value)))
414
+ ])) : z("", !0),
415
+ e.searchable ? (p(), b("div", _e, [
416
+ N(P(Se), {
417
+ class: "tr-model-selector__search-icon",
418
+ "aria-hidden": "true",
419
+ focusable: "false"
420
+ }),
421
+ I("input", {
422
+ ref_key: "searchInputEl",
423
+ ref: s,
424
+ type: "text",
425
+ class: "tr-model-selector__search-input",
426
+ "data-model-selector-search-input": "",
427
+ role: "combobox",
428
+ value: P(r).query.value,
429
+ placeholder: e.searchPlaceholder,
430
+ "aria-label": e.searchPlaceholder,
431
+ "aria-controls": e.listboxId,
432
+ "aria-activedescendant": m.value,
433
+ "aria-autocomplete": "list",
434
+ "aria-expanded": "true",
435
+ "aria-haspopup": "listbox",
436
+ autocomplete: "off",
437
+ spellcheck: !1,
438
+ onInput: k,
439
+ onKeydown: O
440
+ }, null, 40, et)
441
+ ])) : z("", !0),
442
+ P(r).isEmpty.value ? (p(), b("div", tt, [
443
+ D(t.$slots, "empty", {
444
+ query: P(r).query.value
445
+ }, () => [
446
+ N(P(xe), {
447
+ class: "tr-model-selector__empty-icon",
448
+ "aria-hidden": "true",
449
+ focusable: "false"
450
+ }),
451
+ I("span", null, F(e.emptyText), 1)
452
+ ])
453
+ ])) : z("", !0),
454
+ I("div", {
455
+ id: e.listboxId,
456
+ ref_key: "listboxEl",
457
+ ref: f,
458
+ class: W(["tr-model-selector__content", { "is-empty": P(r).isEmpty.value }]),
459
+ role: "listbox",
460
+ tabindex: "-1",
461
+ "aria-label": e.placeholder,
462
+ "aria-activedescendant": e.searchable ? void 0 : m.value,
463
+ onKeydown: K
464
+ }, [
465
+ (p(!0), b(ae, null, re(P(r).groups.value, (M) => (p(), _(Xe, {
466
+ key: M.key,
467
+ group: M,
468
+ "selected-value": e.selectedValue,
469
+ "highlighted-key": P(u).highlightedKey.value,
470
+ "option-id-prefix": e.optionIdPrefix,
471
+ onHover: P(u).setHighlightedKey,
472
+ onSelect: S[0] || (S[0] = (B) => t.$emit("select", B))
473
+ }, te({ _: 2 }, [
474
+ t.$slots.item ? {
475
+ name: "item",
476
+ fn: H((B) => [
477
+ D(t.$slots, "item", ue({ ref_for: !0 }, B))
478
+ ]),
479
+ key: "0"
480
+ } : void 0
481
+ ]), 1032, ["group", "selected-value", "highlighted-key", "option-id-prefix", "onHover"]))), 128))
482
+ ], 42, lt),
483
+ t.$slots.footer || e.effortOptions.length > 0 ? (p(), b("div", ot, [
484
+ D(t.$slots, "footer", U(j(x.value)), () => [
485
+ N(Ae, {
486
+ options: e.effortOptions,
487
+ value: e.effortValue,
488
+ label: e.effortLabel,
489
+ disabled: e.effortDisabled,
490
+ onSelect: S[1] || (S[1] = (M) => t.$emit("select-effort", M))
491
+ }, null, 8, ["options", "value", "label", "disabled"])
492
+ ])
493
+ ])) : z("", !0)
494
+ ], 38));
495
+ }
496
+ }), at = ["title", "disabled", "aria-label", "aria-expanded", "aria-controls"], rt = { class: "tr-model-selector__trigger-content" }, it = ["src"], st = { class: "tr-model-selector__trigger-label" }, ut = {
497
+ key: 2,
498
+ class: "tr-model-selector__trigger-effort"
499
+ }, ct = /* @__PURE__ */ J({
500
+ name: "TrModelSelectorTrigger",
501
+ __name: "ModelSelectorTrigger",
502
+ props: {
503
+ open: { type: Boolean },
504
+ disabled: { type: Boolean },
505
+ label: {},
506
+ effortLabel: {},
507
+ icon: {},
508
+ controlsId: {},
509
+ variant: {},
510
+ size: {}
511
+ },
512
+ emits: ["click", "enter"],
513
+ setup(e, { emit: a }) {
514
+ const n = e, l = g(() => n.effortLabel ? `${n.label} · ${n.effortLabel}` : n.label), s = a;
515
+ function f(c) {
516
+ c.key === "Enter" && !c.defaultPrevented && (c.preventDefault(), s("enter", c));
517
+ }
518
+ return (c, h) => (p(), b("button", {
519
+ type: "button",
520
+ class: W(["tr-model-selector__trigger", [`tr-model-selector__trigger--${e.variant}`, `tr-model-selector__trigger--${e.size}`, { "is-open": e.open }]]),
521
+ title: l.value,
522
+ disabled: e.disabled,
523
+ "aria-label": l.value,
524
+ "aria-expanded": e.open,
525
+ "aria-controls": e.controlsId,
526
+ "aria-haspopup": "listbox",
527
+ onClick: h[0] || (h[0] = (d) => c.$emit("click", d)),
528
+ onKeydown: f
529
+ }, [
530
+ D(c.$slots, "default", {}, () => [
531
+ I("span", rt, [
532
+ typeof e.icon == "string" ? (p(), b("img", {
533
+ key: 0,
534
+ src: e.icon,
535
+ class: "tr-model-selector__trigger-icon",
536
+ alt: "",
537
+ "aria-hidden": "true"
538
+ }, null, 8, it)) : e.icon ? (p(), _(se(e.icon), {
539
+ key: 1,
540
+ class: "tr-model-selector__trigger-icon",
541
+ "aria-hidden": "true",
542
+ focusable: "false"
543
+ })) : z("", !0),
544
+ I("span", st, F(e.label), 1),
545
+ e.effortLabel ? (p(), b("span", ut, F(e.effortLabel), 1)) : z("", !0)
546
+ ]),
547
+ N(P(Me), {
548
+ class: "tr-model-selector__trigger-chevron",
549
+ "aria-hidden": "true",
550
+ focusable: "false"
551
+ })
552
+ ])
553
+ ], 42, at));
554
+ }
555
+ });
556
+ function dt(e) {
557
+ const a = e.controlled, n = V(e.defaultValue), l = g(() => a ? e.value() ?? null : n.value), s = g(() => e.efforts().find((c) => c.value === l.value) ?? null);
558
+ function f(c) {
559
+ if (Object.is(l.value, c))
560
+ return !1;
561
+ if (c !== null) {
562
+ const h = e.efforts().find((d) => d.value === c);
563
+ if (!h || h.disabled)
564
+ return !1;
565
+ }
566
+ return a || (n.value = c), e.onUpdateValue(c), !0;
567
+ }
568
+ return {
569
+ value: l,
570
+ activeOption: s,
571
+ setValue: f
572
+ };
573
+ }
574
+ function ie(e, a) {
575
+ var s, f;
576
+ if ((((s = e.composedPath) == null ? void 0 : s.call(e)) ?? []).includes(a))
577
+ return !0;
578
+ const l = (f = a.ownerDocument.defaultView) == null ? void 0 : f.Node;
579
+ return !!(l && e.target instanceof l && a.contains(e.target));
580
+ }
581
+ function ft(e) {
582
+ const a = V(!1), n = Y(
583
+ () => [
584
+ e.open(),
585
+ e.referenceEl.value,
586
+ e.floatingEl.value,
587
+ e.placement(),
588
+ e.strategy(),
589
+ e.offset(),
590
+ e.teleportTarget()
591
+ ],
592
+ async ([l, s, f, c, h, d, i], r, u) => {
593
+ if (a.value = !1, !l || !s || !f)
594
+ return;
595
+ const m = s, y = f;
596
+ let x = !0, k = 0;
597
+ const $ = {}, E = m.ownerDocument, R = (O) => {
598
+ ie(O, m) || ie(O, y) || e.onOutsidePointerDown(O);
599
+ };
600
+ E.addEventListener("pointerdown", R, !0), u(() => {
601
+ var O;
602
+ x = !1, k += 1, (O = $.current) == null || O.call($), E.removeEventListener("pointerdown", R, !0), a.value = !1;
603
+ });
604
+ async function T() {
605
+ var K;
606
+ const O = ++k;
607
+ try {
608
+ const Q = await Ve(m, y, {
609
+ placement: c,
610
+ strategy: h,
611
+ middleware: [
612
+ Te(d),
613
+ Ce({ padding: 8 }),
614
+ De({ padding: 8 }),
615
+ Ie({
616
+ padding: 8,
617
+ apply({ availableHeight: B, availableWidth: q, rects: oe, elements: G }) {
618
+ const ee = Math.min(oe.reference.width, Math.max(0, q));
619
+ G.floating.style.minWidth = `${Math.round(ee)}px`, G.floating.style.maxWidth = `${Math.max(0, Math.floor(q))}px`, G.floating.style.setProperty(
620
+ "--tr-model-selector-available-height",
621
+ `${Math.max(0, Math.floor(B))}px`
622
+ ), G.floating.style.setProperty(
623
+ "--tr-model-selector-available-width",
624
+ `${Math.max(0, Math.floor(q))}px`
625
+ );
626
+ }
627
+ })
628
+ ]
629
+ });
630
+ if (!x || O !== k || !e.open() || e.referenceEl.value !== m || e.floatingEl.value !== y)
631
+ return;
632
+ const t = ((K = E.defaultView) == null ? void 0 : K.devicePixelRatio) || 1, S = Math.round(Q.x * t) / t, M = Math.round(Q.y * t) / t;
633
+ Object.assign(y.style, {
634
+ left: `${S}px`,
635
+ top: `${M}px`
636
+ }), a.value = !0;
637
+ } catch {
638
+ x && O === k && (a.value = !1);
639
+ }
640
+ }
641
+ await Z(), !(!x || !e.open()) && ($.current = Pe(m, y, () => {
642
+ T();
643
+ }));
644
+ },
645
+ { flush: "post", immediate: !0 }
646
+ );
647
+ return we(() => {
648
+ n();
649
+ }), {
650
+ isPositioned: a
651
+ };
652
+ }
653
+ function ht(e) {
654
+ const a = e.valueControlled, n = e.openControlled, l = V(e.defaultValue), s = V(e.defaultOpen), f = g(() => a ? e.value() ?? null : l.value), c = g(() => n ? !!e.open() : s.value);
655
+ function h(i) {
656
+ return Object.is(f.value, i) ? !1 : (a || (l.value = i), e.onUpdateValue(i), !0);
657
+ }
658
+ function d(i) {
659
+ return c.value === i ? !1 : (n || (s.value = i), e.onUpdateOpen(i), !0);
660
+ }
661
+ return {
662
+ value: f,
663
+ open: c,
664
+ setValue: h,
665
+ setOpen: d
666
+ };
667
+ }
668
+ const vt = Object.freeze([
669
+ Object.freeze({ value: "low", label: "Low" }),
670
+ Object.freeze({ value: "medium", label: "Medium" }),
671
+ Object.freeze({ value: "high", label: "High" })
672
+ ]);
673
+ function mt(e) {
674
+ if (!e)
675
+ return [];
676
+ if (e === !0)
677
+ return vt;
678
+ const a = /* @__PURE__ */ new Set(), n = [];
679
+ for (const l of e)
680
+ a.has(l.value) || (a.add(l.value), n.push(l));
681
+ return n;
682
+ }
683
+ function gt(e) {
684
+ if (!e || e === !0)
685
+ return [];
686
+ const a = /* @__PURE__ */ new Set(), n = /* @__PURE__ */ new Set();
687
+ for (const l of e)
688
+ a.has(l.value) ? n.add(l.value) : a.add(l.value);
689
+ return Array.from(n);
690
+ }
691
+ const pt = "__tr-model-selector-ungrouped__";
692
+ function ne(e) {
693
+ return (e == null ? void 0 : e.trim()) ?? "";
694
+ }
695
+ function yt(e) {
696
+ return e.filter((a) => !!(a && a.trim())).join(" ").toLocaleLowerCase();
697
+ }
698
+ function bt(e) {
699
+ const a = /* @__PURE__ */ new Set(), n = [];
700
+ return e.forEach((l, s) => {
701
+ if (a.has(l.value))
702
+ return;
703
+ a.add(l.value);
704
+ const f = ne(l.label) || l.value, c = ne(l.description) || void 0, h = ne(l.group), d = h ? `group:${h}` : pt, i = typeof l.icon == "string" ? l.icon : l.icon ? ke(l.icon) : void 0;
705
+ n.push({
706
+ key: `value:${l.value}`,
707
+ index: s,
708
+ value: l.value,
709
+ label: f,
710
+ description: c,
711
+ icon: i,
712
+ disabled: !!l.disabled,
713
+ groupKey: d,
714
+ searchText: yt([f, l.value, c, h]),
715
+ raw: l
716
+ });
717
+ }), n;
718
+ }
719
+ function wt(e) {
720
+ const a = /* @__PURE__ */ new Set(), n = /* @__PURE__ */ new Set();
721
+ return e.forEach((l) => {
722
+ a.has(l.value) ? n.add(l.value) : a.add(l.value);
723
+ }), [...n];
724
+ }
725
+ const kt = { class: "tr-model-selector__dropdown-surface" }, le = /* @__PURE__ */ J({
726
+ name: "TrModelSelector",
727
+ __name: "index",
728
+ props: {
729
+ models: { default: () => [] },
730
+ modelValue: {},
731
+ defaultValue: { default: null },
732
+ reasoningEffort: { default: void 0 },
733
+ defaultReasoningEffort: { default: null },
734
+ open: { type: Boolean, default: void 0 },
735
+ defaultOpen: { type: Boolean, default: !1 },
736
+ closeOnSelect: { type: Boolean, default: !0 },
737
+ disabled: { type: Boolean, default: !1 },
738
+ searchable: { type: Boolean, default: !1 },
739
+ placeholder: { default: "选择模型" },
740
+ searchPlaceholder: { default: "搜索模型" },
741
+ emptyText: { default: "暂无可用模型" },
742
+ filterMethod: {},
743
+ variant: { default: "outline" },
744
+ size: { default: "normal" },
745
+ placement: { default: "bottom-start" },
746
+ offset: { default: 8 },
747
+ appendTo: { default: "body" },
748
+ panelClass: {},
749
+ reasoningEffortLabel: { default: "Thinking" }
750
+ },
751
+ emits: ["update:modelValue", "change", "update:reasoningEffort", "reasoning-effort-change", "update:open"],
752
+ setup(e, { emit: a }) {
753
+ const n = e, l = a, s = $e(), f = (s == null ? void 0 : s.uid) ?? 0, c = (s == null ? void 0 : s.vnode.props) ?? {}, h = (...o) => o.some((v) => Object.prototype.hasOwnProperty.call(c, v)), d = `tr-model-selector-${f}`, i = `${d}-listbox`, r = V(null), u = V(null), m = V(!1), y = V(null), x = ze(r), k = g(() => {
754
+ var C, L;
755
+ if (!m.value)
756
+ return null;
757
+ const o = x.value, v = n.appendTo;
758
+ if (!v)
759
+ return o;
760
+ if (typeof v != "string")
761
+ return v;
762
+ if (v === "body" && o === ((C = r.value) == null ? void 0 : C.ownerDocument.body))
763
+ return o;
764
+ const w = o;
765
+ try {
766
+ return ((L = w.querySelector) == null ? void 0 : L.call(w, v)) ?? o;
767
+ } catch {
768
+ return o;
769
+ }
770
+ }), $ = g(() => {
771
+ var w;
772
+ const o = k.value, v = (w = r.value) == null ? void 0 : w.ownerDocument;
773
+ return !!(v && o && o !== v.body && o.nodeType === 1);
774
+ }), E = ht({
775
+ value: () => n.modelValue,
776
+ defaultValue: n.defaultValue,
777
+ valueControlled: h("modelValue", "model-value"),
778
+ open: () => n.open,
779
+ defaultOpen: n.disabled ? !1 : n.defaultOpen,
780
+ openControlled: h("open"),
781
+ onUpdateValue: (o) => l("update:modelValue", o),
782
+ onUpdateOpen: (o) => l("update:open", o)
783
+ }), R = g(() => bt(n.models));
784
+ g(() => wt(n.models));
785
+ const T = g(() => R.value.find((o) => o.value === E.value.value) ?? null), O = g(() => {
786
+ var o;
787
+ return mt((o = T.value) == null ? void 0 : o.raw.reasoningEfforts);
788
+ });
789
+ g(() => {
790
+ var o;
791
+ return gt((o = T.value) == null ? void 0 : o.raw.reasoningEfforts);
792
+ });
793
+ const K = dt({
794
+ value: () => n.reasoningEffort,
795
+ defaultValue: n.defaultReasoningEffort,
796
+ efforts: () => O.value,
797
+ controlled: h("reasoningEffort", "reasoning-effort"),
798
+ onUpdateValue: (o) => l("update:reasoningEffort", o)
799
+ }), Q = g(() => {
800
+ var o;
801
+ return ((o = K.activeOption.value) == null ? void 0 : o.value) ?? null;
802
+ }), t = g(() => E.open.value && !n.disabled), S = g(() => {
803
+ var o;
804
+ return ((o = T.value) == null ? void 0 : o.label) ?? n.placeholder;
805
+ }), M = g(() => {
806
+ var o;
807
+ return {
808
+ option: ((o = T.value) == null ? void 0 : o.raw) ?? null,
809
+ label: S.value,
810
+ open: t.value,
811
+ reasoningEffortOption: K.activeOption.value
812
+ };
813
+ }), B = g(() => {
814
+ var o;
815
+ return {
816
+ option: ((o = T.value) == null ? void 0 : o.raw) ?? null,
817
+ close: me
818
+ };
819
+ });
820
+ function q() {
821
+ var o, v;
822
+ (v = (o = r.value) == null ? void 0 : o.querySelector(".tr-model-selector__trigger")) == null || v.focus({ preventScroll: !0 });
823
+ }
824
+ function oe() {
825
+ var v, w;
826
+ let o = ((v = r.value) == null ? void 0 : v.ownerDocument.activeElement) ?? null;
827
+ for (; (w = o == null ? void 0 : o.shadowRoot) != null && w.activeElement; )
828
+ o = o.shadowRoot.activeElement;
829
+ return o;
830
+ }
831
+ function G() {
832
+ var v;
833
+ const o = oe();
834
+ return !!(o && ((v = u.value) != null && v.contains(o)));
835
+ }
836
+ function ee() {
837
+ n.disabled || E.setOpen(!0);
838
+ }
839
+ function X(o) {
840
+ var L;
841
+ if (!t.value || y.value !== null)
842
+ return;
843
+ if (y.value = o, !E.setOpen(!1)) {
844
+ y.value = null;
845
+ return;
846
+ }
847
+ const w = () => {
848
+ t.value && y.value === o && (y.value = null);
849
+ }, C = (L = r.value) == null ? void 0 : L.ownerDocument.defaultView;
850
+ C ? C.setTimeout(w, 0) : Z().then(w);
851
+ }
852
+ function de() {
853
+ t.value ? X(!1) : ee();
854
+ }
855
+ function fe() {
856
+ ee();
857
+ }
858
+ function he(o) {
859
+ const v = R.value.find((C) => C.value === o.value);
860
+ if (!v || v.disabled)
861
+ return;
862
+ E.setValue(v.value) && l("change", v.raw), n.closeOnSelect && X(!0);
863
+ }
864
+ function ve(o) {
865
+ var C;
866
+ if (n.disabled || (C = T.value) != null && C.disabled)
867
+ return;
868
+ const v = o === null ? null : O.value.find((L) => L.value === o) ?? null;
869
+ K.setValue(o) && l("reasoning-effort-change", v);
870
+ }
871
+ function me() {
872
+ X(!0);
873
+ }
874
+ const { isPositioned: ge } = ft({
875
+ referenceEl: r,
876
+ floatingEl: u,
877
+ open: () => t.value,
878
+ placement: () => n.placement,
879
+ strategy: () => $.value ? "absolute" : "fixed",
880
+ offset: () => n.offset,
881
+ teleportTarget: () => k.value,
882
+ onOutsidePointerDown: () => X(!1)
883
+ });
884
+ return Y(
885
+ () => n.disabled,
886
+ (o) => {
887
+ o && E.open.value && (y.value = !1, E.setOpen(!1));
888
+ }
889
+ ), Y(
890
+ t,
891
+ async (o, v) => {
892
+ if (!o) {
893
+ if (v) {
894
+ const w = y.value ?? G();
895
+ y.value = null, w && (await Z(), q());
896
+ }
897
+ return;
898
+ }
899
+ },
900
+ { immediate: !0 }
901
+ ), ce(() => {
902
+ m.value = !0;
903
+ }), (o, v) => {
904
+ var w, C, L;
905
+ return p(), b("div", {
906
+ class: W(["tr-model-selector", [`tr-model-selector--${e.variant}`, `tr-model-selector--${e.size}`]])
907
+ }, [
908
+ I("span", {
909
+ ref_key: "referenceEl",
910
+ ref: r,
911
+ class: "tr-model-selector__anchor"
912
+ }, [
913
+ N(ct, {
914
+ open: t.value,
915
+ disabled: e.disabled,
916
+ label: S.value,
917
+ "effort-label": (w = P(K).activeOption.value) == null ? void 0 : w.label,
918
+ icon: (C = T.value) == null ? void 0 : C.icon,
919
+ "controls-id": i,
920
+ variant: e.variant,
921
+ size: e.size,
922
+ onClick: de,
923
+ onEnter: fe
924
+ }, te({ _: 2 }, [
925
+ o.$slots.trigger ? {
926
+ name: "default",
927
+ fn: H(() => [
928
+ D(o.$slots, "trigger", U(j(M.value)))
929
+ ]),
930
+ key: "0"
931
+ } : void 0
932
+ ]), 1032, ["open", "disabled", "label", "effort-label", "icon", "variant", "size"])
933
+ ], 512),
934
+ k.value ? (p(), _(Ee, {
935
+ key: 0,
936
+ to: k.value
937
+ }, [
938
+ t.value ? (p(), b("div", {
939
+ key: 0,
940
+ ref_key: "floatingEl",
941
+ ref: u,
942
+ class: W(["tr-model-selector__dropdown-wrapper", { "is-positioned": P(ge), "is-absolute": $.value }])
943
+ }, [
944
+ I("div", kt, [
945
+ N(nt, {
946
+ options: R.value,
947
+ "selected-value": P(E).value.value,
948
+ searchable: e.searchable,
949
+ "filter-method": e.filterMethod,
950
+ "listbox-id": i,
951
+ "option-id-prefix": d,
952
+ placeholder: e.placeholder,
953
+ "search-placeholder": e.searchPlaceholder,
954
+ "empty-text": e.emptyText,
955
+ "effort-options": O.value,
956
+ "effort-value": Q.value,
957
+ "effort-label": e.reasoningEffortLabel,
958
+ "effort-disabled": !!((L = T.value) != null && L.disabled),
959
+ size: e.size,
960
+ "panel-class": e.panelClass,
961
+ "slot-context": B.value,
962
+ onSelect: he,
963
+ onSelectEffort: ve,
964
+ onClose: X
965
+ }, te({ _: 2 }, [
966
+ o.$slots.header ? {
967
+ name: "header",
968
+ fn: H((A) => [
969
+ D(o.$slots, "header", U(j(A)))
970
+ ]),
971
+ key: "0"
972
+ } : void 0,
973
+ o.$slots.item ? {
974
+ name: "item",
975
+ fn: H((A) => [
976
+ D(o.$slots, "item", U(j(A)))
977
+ ]),
978
+ key: "1"
979
+ } : void 0,
980
+ o.$slots.empty ? {
981
+ name: "empty",
982
+ fn: H((A) => [
983
+ D(o.$slots, "empty", U(j(A)))
984
+ ]),
985
+ key: "2"
986
+ } : void 0,
987
+ o.$slots.footer ? {
988
+ name: "footer",
989
+ fn: H((A) => [
990
+ D(o.$slots, "footer", U(j(A)))
991
+ ]),
992
+ key: "3"
993
+ } : void 0
994
+ ]), 1032, ["options", "selected-value", "searchable", "filter-method", "placeholder", "search-placeholder", "empty-text", "effort-options", "effort-value", "effort-label", "effort-disabled", "size", "panel-class", "slot-context"])
995
+ ])
996
+ ], 2)) : z("", !0)
997
+ ], 8, ["to"])) : z("", !0)
998
+ ], 2);
999
+ };
1000
+ }
1001
+ });
1002
+ le.name = "TrModelSelector";
1003
+ const $t = function(e) {
1004
+ e.component(le.name, le);
1005
+ };
1006
+ le.install = $t;
1007
+ export {
1008
+ le as default
1009
+ };