@opentiny/tiny-robot 0.5.0 → 0.5.1-alpha.14

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