rei-kit 2.7.0 → 2.9.0

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/web.js CHANGED
@@ -1,21 +1,24 @@
1
+ import { i as ensureSheetRoot, n as useBoundValue, t as inertOutside } from "./inert-BRQcZwpX.js";
1
2
  import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper-BOaGB7Aw.js";
2
- import { t as inertOutside } from "./inert-B441LoCD.js";
3
- import { Fragment, Teleport, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, mergeModels, nextTick, normalizeClass, onBeforeUnmount, openBlock, ref, renderList, renderSlot, resolveDynamicComponent, shallowRef, toDisplayString, unref, useId, useModel, vShow, watch, withCtx, withDirectives, withModifiers } from "vue";
3
+ import { t as BaseButton_default } from "./BaseButton-RN2an975.js";
4
+ import { n as BaseListbox_default, t as BaseSkeleton_default } from "./BaseSkeleton-BWTNXVwP.js";
5
+ import { Fragment, Teleport, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, mergeModels, nextTick, normalizeClass, normalizeStyle, onBeforeUnmount, onMounted, openBlock, ref, renderList, renderSlot, resolveDynamicComponent, shallowRef, toDisplayString, unref, useId, useModel, useTemplateRef, vModelText, vShow, watch, withCtx, withDirectives, withModifiers } from "vue";
6
+ import { ArrowDown, ArrowUp, ChevronLeft, ChevronRight, ChevronsUpDown, Search } from "lucide-vue-next";
4
7
  import { RouterLink } from "vue-router";
5
8
  //#region src/web/BaseAccordion.vue?vue&type=script&setup=true&lang.ts
6
- var _hoisted_1$7 = { class: "rk-accordion" };
7
- var _hoisted_2$7 = [
9
+ var _hoisted_1$13 = { class: "rk-accordion" };
10
+ var _hoisted_2$12 = [
8
11
  "aria-expanded",
9
12
  "aria-controls",
10
13
  "onClick"
11
14
  ];
12
- var _hoisted_3$5 = { class: "rk-accordion-title" };
13
- var _hoisted_4$4 = {
15
+ var _hoisted_3$10 = { class: "rk-accordion-title" };
16
+ var _hoisted_4$8 = {
14
17
  class: "rk-accordion-mark",
15
18
  "aria-hidden": "true"
16
19
  };
17
- var _hoisted_5$3 = ["id"];
18
- var _hoisted_6$2 = { class: "rk-accordion-clip" };
20
+ var _hoisted_5$6 = ["id"];
21
+ var _hoisted_6$5 = { class: "rk-accordion-clip" };
19
22
  //#endregion
20
23
  //#region src/web/BaseAccordion.vue
21
24
  var BaseAccordion_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
@@ -37,7 +40,7 @@ var BaseAccordion_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @
37
40
  else open.value = __props.multiple ? [...open.value, key] : [key];
38
41
  }
39
42
  return (_ctx, _cache) => {
40
- return openBlock(), createElementBlock("ul", _hoisted_1$7, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item) => {
43
+ return openBlock(), createElementBlock("ul", _hoisted_1$13, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item) => {
41
44
  return openBlock(), createElementBlock("li", {
42
45
  key: item.key,
43
46
  class: "rk-accordion-item"
@@ -48,32 +51,32 @@ var BaseAccordion_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @
48
51
  "aria-expanded": isOpen(item.key),
49
52
  "aria-controls": `${unref(uid)}-${item.key}`,
50
53
  onClick: ($event) => toggle(item.key)
51
- }, [createElementVNode("span", _hoisted_3$5, [renderSlot(_ctx.$slots, "title", {
54
+ }, [createElementVNode("span", _hoisted_3$10, [renderSlot(_ctx.$slots, "title", {
52
55
  item,
53
56
  open: isOpen(item.key)
54
- }, () => [createTextVNode(toDisplayString(item.title), 1)], true)]), createElementVNode("span", _hoisted_4$4, [_cache[0] || (_cache[0] = createElementVNode("span", { class: "rk-accordion-bar" }, null, -1)), createElementVNode("span", { class: normalizeClass(["rk-accordion-bar rk-accordion-bar-turn", { "is-open": isOpen(item.key) }]) }, null, 2)])], 8, _hoisted_2$7)]),
57
+ }, () => [createTextVNode(toDisplayString(item.title), 1)], true)]), createElementVNode("span", _hoisted_4$8, [_cache[0] || (_cache[0] = createElementVNode("span", { class: "rk-accordion-bar" }, null, -1)), createElementVNode("span", { class: normalizeClass(["rk-accordion-bar rk-accordion-bar-turn", { "is-open": isOpen(item.key) }]) }, null, 2)])], 8, _hoisted_2$12)]),
55
58
  _: 2
56
59
  }, 1024)), createElementVNode("div", {
57
60
  id: `${unref(uid)}-${item.key}`,
58
61
  class: normalizeClass(["rk-accordion-panel", { "is-open": isOpen(item.key) }])
59
- }, [createElementVNode("div", _hoisted_6$2, [createElementVNode("div", { class: normalizeClass(["rk-accordion-body", { "is-open": isOpen(item.key) }]) }, [renderSlot(_ctx.$slots, "default", {
62
+ }, [createElementVNode("div", _hoisted_6$5, [createElementVNode("div", { class: normalizeClass(["rk-accordion-body", { "is-open": isOpen(item.key) }]) }, [renderSlot(_ctx.$slots, "default", {
60
63
  item,
61
64
  open: isOpen(item.key)
62
- }, void 0, true)], 2)])], 10, _hoisted_5$3)]);
65
+ }, void 0, true)], 2)])], 10, _hoisted_5$6)]);
63
66
  }), 128))]);
64
67
  };
65
68
  }
66
69
  }), [["__scopeId", "data-v-03e2e1d0"]]);
67
70
  //#endregion
68
71
  //#region src/web/BaseBreadcrumb.vue?vue&type=script&setup=true&lang.ts
69
- var _hoisted_1$6 = ["aria-label"];
70
- var _hoisted_2$6 = { class: "rk-crumbs" };
71
- var _hoisted_3$4 = {
72
+ var _hoisted_1$12 = ["aria-label"];
73
+ var _hoisted_2$11 = { class: "rk-crumbs" };
74
+ var _hoisted_3$9 = {
72
75
  key: 1,
73
76
  class: "rk-crumb-current",
74
77
  "aria-current": "page"
75
78
  };
76
- var _hoisted_4$3 = {
79
+ var _hoisted_4$7 = {
77
80
  key: 2,
78
81
  class: "rk-crumb-sep",
79
82
  "aria-hidden": "true"
@@ -88,7 +91,7 @@ var BaseBreadcrumb_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/*
88
91
  },
89
92
  setup(__props) {
90
93
  return (_ctx, _cache) => {
91
- return openBlock(), createElementBlock("nav", { "aria-label": __props.label || void 0 }, [createElementVNode("ol", _hoisted_2$6, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item, index) => {
94
+ return openBlock(), createElementBlock("nav", { "aria-label": __props.label || void 0 }, [createElementVNode("ol", _hoisted_2$11, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item, index) => {
92
95
  return openBlock(), createElementBlock("li", {
93
96
  key: item.label,
94
97
  class: "rk-crumb"
@@ -99,22 +102,22 @@ var BaseBreadcrumb_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/*
99
102
  }, {
100
103
  default: withCtx(() => [createTextVNode(toDisplayString(item.label), 1)]),
101
104
  _: 2
102
- }, 1032, ["to"])) : (openBlock(), createElementBlock("span", _hoisted_3$4, toDisplayString(item.label), 1)), index < __props.items.length - 1 ? (openBlock(), createElementBlock("span", _hoisted_4$3, "/")) : createCommentVNode("", true)]);
103
- }), 128))])], 8, _hoisted_1$6);
105
+ }, 1032, ["to"])) : (openBlock(), createElementBlock("span", _hoisted_3$9, toDisplayString(item.label), 1)), index < __props.items.length - 1 ? (openBlock(), createElementBlock("span", _hoisted_4$7, "/")) : createCommentVNode("", true)]);
106
+ }), 128))])], 8, _hoisted_1$12);
104
107
  };
105
108
  }
106
109
  }), [["__scopeId", "data-v-dcc01b03"]]);
107
110
  //#endregion
108
111
  //#region src/web/BaseDisclosure.vue?vue&type=script&setup=true&lang.ts
109
- var _hoisted_1$5 = { class: "rk-disclosure" };
110
- var _hoisted_2$5 = ["aria-expanded", "aria-controls"];
111
- var _hoisted_3$3 = { class: "rk-disclosure-title" };
112
- var _hoisted_4$2 = {
112
+ var _hoisted_1$11 = { class: "rk-disclosure" };
113
+ var _hoisted_2$10 = ["aria-expanded", "aria-controls"];
114
+ var _hoisted_3$8 = { class: "rk-disclosure-title" };
115
+ var _hoisted_4$6 = {
113
116
  class: "rk-disclosure-mark",
114
117
  "aria-hidden": "true"
115
118
  };
116
- var _hoisted_5$2 = ["id"];
117
- var _hoisted_6$1 = { class: "rk-disclosure-clip" };
119
+ var _hoisted_5$5 = ["id"];
120
+ var _hoisted_6$4 = { class: "rk-disclosure-clip" };
118
121
  //#endregion
119
122
  //#region src/web/BaseDisclosure.vue
120
123
  var BaseDisclosure_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
@@ -134,30 +137,30 @@ var BaseDisclosure_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/*
134
137
  const open = useModel(__props, "modelValue");
135
138
  const id = useId();
136
139
  return (_ctx, _cache) => {
137
- return openBlock(), createElementBlock("div", _hoisted_1$5, [(openBlock(), createBlock(resolveDynamicComponent(`h${__props.headingLevel}`), null, {
140
+ return openBlock(), createElementBlock("div", _hoisted_1$11, [(openBlock(), createBlock(resolveDynamicComponent(`h${__props.headingLevel}`), null, {
138
141
  default: withCtx(() => [createElementVNode("button", {
139
142
  type: "button",
140
143
  class: "rk-disclosure-control",
141
144
  "aria-expanded": open.value,
142
145
  "aria-controls": unref(id),
143
146
  onClick: _cache[0] || (_cache[0] = ($event) => open.value = !open.value)
144
- }, [createElementVNode("span", _hoisted_3$3, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)], true)]), createElementVNode("span", _hoisted_4$2, [_cache[1] || (_cache[1] = createElementVNode("span", { class: "rk-disclosure-bar" }, null, -1)), createElementVNode("span", { class: normalizeClass(["rk-disclosure-bar rk-disclosure-turn", { "is-open": open.value }]) }, null, 2)])], 8, _hoisted_2$5)]),
147
+ }, [createElementVNode("span", _hoisted_3$8, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)], true)]), createElementVNode("span", _hoisted_4$6, [_cache[1] || (_cache[1] = createElementVNode("span", { class: "rk-disclosure-bar" }, null, -1)), createElementVNode("span", { class: normalizeClass(["rk-disclosure-bar rk-disclosure-turn", { "is-open": open.value }]) }, null, 2)])], 8, _hoisted_2$10)]),
145
148
  _: 3
146
149
  })), createElementVNode("div", {
147
150
  id: unref(id),
148
151
  class: normalizeClass(["rk-disclosure-panel", { "is-open": open.value }])
149
- }, [createElementVNode("div", _hoisted_6$1, [createElementVNode("div", { class: normalizeClass(["rk-disclosure-body", { "is-open": open.value }]) }, [renderSlot(_ctx.$slots, "default", {}, void 0, true)], 2)])], 10, _hoisted_5$2)]);
152
+ }, [createElementVNode("div", _hoisted_6$4, [createElementVNode("div", { class: normalizeClass(["rk-disclosure-body", { "is-open": open.value }]) }, [renderSlot(_ctx.$slots, "default", {}, void 0, true)], 2)])], 10, _hoisted_5$5)]);
150
153
  };
151
154
  }
152
155
  }), [["__scopeId", "data-v-ad5c09f5"]]);
153
156
  //#endregion
154
157
  //#region src/web/BaseModal.vue?vue&type=script&setup=true&lang.ts
155
- var _hoisted_1$4 = ["role", "aria-label"];
156
- var _hoisted_2$4 = { class: "rk-modal-head" };
157
- var _hoisted_3$2 = { class: "rk-modal-title" };
158
- var _hoisted_4$1 = ["aria-label"];
159
- var _hoisted_5$1 = { class: "rk-modal-body" };
160
- var _hoisted_6 = {
158
+ var _hoisted_1$10 = ["role", "aria-label"];
159
+ var _hoisted_2$9 = { class: "rk-modal-head" };
160
+ var _hoisted_3$7 = { class: "rk-modal-title" };
161
+ var _hoisted_4$5 = ["aria-label"];
162
+ var _hoisted_5$4 = { class: "rk-modal-body" };
163
+ var _hoisted_6$3 = {
161
164
  key: 0,
162
165
  class: "rk-modal-actions"
163
166
  };
@@ -189,7 +192,7 @@ var _hoisted_6 = {
189
192
  * why this listens for a press on the backdrop itself rather than any click
190
193
  * that reaches it.
191
194
  */
192
- var FOCUSABLE = "a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])";
195
+ var FOCUSABLE$1 = "a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])";
193
196
  //#endregion
194
197
  //#region src/web/BaseModal.vue
195
198
  var BaseModal_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
@@ -219,7 +222,7 @@ var BaseModal_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
219
222
  let releaseInert = null;
220
223
  function focusable() {
221
224
  if (!panel.value) return [];
222
- return Array.from(panel.value.querySelectorAll(FOCUSABLE));
225
+ return Array.from(panel.value.querySelectorAll(FOCUSABLE$1));
223
226
  }
224
227
  function onKeydown(event) {
225
228
  if (event.key === "Escape" && __props.dismissible) {
@@ -276,7 +279,7 @@ var BaseModal_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
276
279
  "aria-label": __props.title,
277
280
  tabindex: "-1"
278
281
  }, [
279
- createElementVNode("div", _hoisted_2$4, [createElementVNode("h2", _hoisted_3$2, toDisplayString(__props.title), 1), __props.dismissible ? (openBlock(), createElementBlock("button", {
282
+ createElementVNode("div", _hoisted_2$9, [createElementVNode("h2", _hoisted_3$7, toDisplayString(__props.title), 1), __props.dismissible ? (openBlock(), createElementBlock("button", {
280
283
  key: 0,
281
284
  type: "button",
282
285
  class: "rk-modal-close",
@@ -290,10 +293,10 @@ var BaseModal_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
290
293
  }, [createElementVNode("path", {
291
294
  d: "M18 6 6 18M6 6l12 12",
292
295
  "stroke-linecap": "round"
293
- })], -1)])], 8, _hoisted_4$1)) : createCommentVNode("", true)]),
294
- createElementVNode("div", _hoisted_5$1, [renderSlot(_ctx.$slots, "default", {}, void 0, true)]),
295
- _ctx.$slots.actions ? (openBlock(), createElementBlock("div", _hoisted_6, [renderSlot(_ctx.$slots, "actions", {}, void 0, true)])) : createCommentVNode("", true)
296
- ], 8, _hoisted_1$4)], 32)) : createCommentVNode("", true)]),
296
+ })], -1)])], 8, _hoisted_4$5)) : createCommentVNode("", true)]),
297
+ createElementVNode("div", _hoisted_5$4, [renderSlot(_ctx.$slots, "default", {}, void 0, true)]),
298
+ _ctx.$slots.actions ? (openBlock(), createElementBlock("div", _hoisted_6$3, [renderSlot(_ctx.$slots, "actions", {}, void 0, true)])) : createCommentVNode("", true)
299
+ ], 8, _hoisted_1$10)], 32)) : createCommentVNode("", true)]),
297
300
  _: 3
298
301
  })]);
299
302
  };
@@ -301,15 +304,15 @@ var BaseModal_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
301
304
  }), [["__scopeId", "data-v-61956691"]]);
302
305
  //#endregion
303
306
  //#region src/web/BasePagination.vue?vue&type=script&setup=true&lang.ts
304
- var _hoisted_1$3 = ["aria-label"];
305
- var _hoisted_2$3 = ["disabled", "aria-label"];
306
- var _hoisted_3$1 = {
307
+ var _hoisted_1$9 = ["aria-label"];
308
+ var _hoisted_2$8 = ["disabled", "aria-label"];
309
+ var _hoisted_3$6 = {
307
310
  key: 0,
308
311
  class: "rk-pager-gap",
309
312
  "aria-hidden": "true"
310
313
  };
311
- var _hoisted_4 = ["aria-current", "onClick"];
312
- var _hoisted_5 = ["disabled", "aria-label"];
314
+ var _hoisted_4$4 = ["aria-current", "onClick"];
315
+ var _hoisted_5$3 = ["disabled", "aria-label"];
313
316
  /**
314
317
  * Moving between pages of a list.
315
318
  *
@@ -372,15 +375,15 @@ var BasePagination_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/*
372
375
  disabled: __props.page <= 1,
373
376
  "aria-label": __props.previousLabel,
374
377
  onClick: _cache[0] || (_cache[0] = ($event) => go(__props.page - 1))
375
- }, " ‹ ", 8, _hoisted_2$3),
378
+ }, " ‹ ", 8, _hoisted_2$8),
376
379
  (openBlock(true), createElementBlock(Fragment, null, renderList(slots.value, (slot, index) => {
377
- return openBlock(), createElementBlock(Fragment, { key: `${slot}-${index}` }, [slot === "gap" ? (openBlock(), createElementBlock("span", _hoisted_3$1, "…")) : (openBlock(), createElementBlock("button", {
380
+ return openBlock(), createElementBlock(Fragment, { key: `${slot}-${index}` }, [slot === "gap" ? (openBlock(), createElementBlock("span", _hoisted_3$6, "…")) : (openBlock(), createElementBlock("button", {
378
381
  key: 1,
379
382
  type: "button",
380
383
  class: normalizeClass(["rk-pager-page", { "is-active": slot === __props.page }]),
381
384
  "aria-current": slot === __props.page ? "page" : void 0,
382
385
  onClick: ($event) => go(slot)
383
- }, toDisplayString(slot), 11, _hoisted_4))], 64);
386
+ }, toDisplayString(slot), 11, _hoisted_4$4))], 64);
384
387
  }), 128)),
385
388
  createElementVNode("button", {
386
389
  type: "button",
@@ -388,12 +391,840 @@ var BasePagination_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/*
388
391
  disabled: __props.page >= __props.pages,
389
392
  "aria-label": __props.nextLabel,
390
393
  onClick: _cache[1] || (_cache[1] = ($event) => go(__props.page + 1))
391
- }, " › ", 8, _hoisted_5)
392
- ], 8, _hoisted_1$3);
394
+ }, " › ", 8, _hoisted_5$3)
395
+ ], 8, _hoisted_1$9);
393
396
  };
394
397
  }
395
398
  }), [["__scopeId", "data-v-29950578"]]);
396
399
  //#endregion
400
+ //#region src/web/CommandMenu.vue?vue&type=script&setup=true&lang.ts
401
+ var _hoisted_1$8 = ["aria-label"];
402
+ var _hoisted_2$7 = { class: "rk-command-field" };
403
+ var _hoisted_3$5 = [
404
+ "placeholder",
405
+ "aria-label",
406
+ "aria-controls",
407
+ "aria-activedescendant"
408
+ ];
409
+ var _hoisted_4$3 = ["id", "aria-label"];
410
+ var _hoisted_5$2 = {
411
+ key: 0,
412
+ class: "rk-command-group"
413
+ };
414
+ var _hoisted_6$2 = [
415
+ "id",
416
+ "aria-selected",
417
+ "onClick",
418
+ "onPointermove"
419
+ ];
420
+ var _hoisted_7$1 = { class: "truncate" };
421
+ var _hoisted_8$1 = {
422
+ key: 1,
423
+ class: "rk-command-hint"
424
+ };
425
+ var _hoisted_9$1 = {
426
+ key: 0,
427
+ class: "rk-command-empty"
428
+ };
429
+ //#endregion
430
+ //#region src/web/CommandMenu.vue
431
+ var CommandMenu_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
432
+ __name: "CommandMenu",
433
+ props: /*@__PURE__*/ mergeModels({
434
+ groups: {},
435
+ label: {},
436
+ placeholder: {},
437
+ emptyLabel: {},
438
+ hotkey: { default: () => void 0 }
439
+ }, {
440
+ "modelValue": {
441
+ type: Boolean,
442
+ default: false
443
+ },
444
+ "modelModifiers": {}
445
+ }),
446
+ emits: /*@__PURE__*/ mergeModels(["select"], ["update:modelValue"]),
447
+ setup(__props, { emit: __emit }) {
448
+ const emit = __emit;
449
+ /** Open or closed, with `v-model`. */
450
+ const open = useModel(__props, "modelValue");
451
+ const query = ref("");
452
+ const active = ref(0);
453
+ const id = useId();
454
+ const field = useTemplateRef("field");
455
+ const sheetRoot = ensureSheetRoot();
456
+ let release = null;
457
+ const matches = computed(() => {
458
+ const needle = query.value.trim().toLowerCase();
459
+ const keep = (item) => needle === "" || [item.label, ...item.keywords ?? []].some((word) => word.toLowerCase().includes(needle));
460
+ return __props.groups.map((group) => ({
461
+ ...group,
462
+ items: group.items.filter(keep)
463
+ })).filter((group) => group.items.length > 0);
464
+ });
465
+ /** Flattened, because the arrows walk the results and not the groups. */
466
+ const flat = computed(() => matches.value.flatMap((group) => group.items));
467
+ function choose(item) {
468
+ emit("select", item.id);
469
+ open.value = false;
470
+ }
471
+ function move(step) {
472
+ if (flat.value.length === 0) return;
473
+ active.value = (active.value + step + flat.value.length) % flat.value.length;
474
+ nextTick(() => {
475
+ document.getElementById(`${id}-${active.value}`)?.scrollIntoView?.({ block: "nearest" });
476
+ });
477
+ }
478
+ function onKeydown(event) {
479
+ if (event.key === "ArrowDown") {
480
+ event.preventDefault();
481
+ move(1);
482
+ } else if (event.key === "ArrowUp") {
483
+ event.preventDefault();
484
+ move(-1);
485
+ } else if (event.key === "Home") {
486
+ event.preventDefault();
487
+ active.value = 0;
488
+ } else if (event.key === "End") {
489
+ event.preventDefault();
490
+ active.value = Math.max(0, flat.value.length - 1);
491
+ } else if (event.key === "Enter") {
492
+ const item = flat.value[active.value];
493
+ if (item) {
494
+ event.preventDefault();
495
+ choose(item);
496
+ }
497
+ } else if (event.key === "Escape") {
498
+ event.preventDefault();
499
+ open.value = false;
500
+ }
501
+ }
502
+ function onWindowKeydown(event) {
503
+ if (!__props.hotkey || event.key.toLowerCase() !== __props.hotkey.toLowerCase()) return;
504
+ if (!event.metaKey && !event.ctrlKey) return;
505
+ event.preventDefault();
506
+ open.value = !open.value;
507
+ }
508
+ if (typeof window !== "undefined") window.addEventListener("keydown", onWindowKeydown);
509
+ watch(open, async (isOpen) => {
510
+ if (typeof document === "undefined") return;
511
+ if (!isOpen) {
512
+ release?.();
513
+ release = null;
514
+ return;
515
+ }
516
+ query.value = "";
517
+ active.value = 0;
518
+ await nextTick();
519
+ field.value?.focus();
520
+ const panel = field.value?.closest(".rk-command-panel");
521
+ if (panel) release = inertOutside(panel);
522
+ }, { immediate: true });
523
+ watch(query, () => active.value = 0);
524
+ onBeforeUnmount(() => {
525
+ release?.();
526
+ if (typeof window !== "undefined") window.removeEventListener("keydown", onWindowKeydown);
527
+ });
528
+ const indexOf = (item) => flat.value.indexOf(item);
529
+ return (_ctx, _cache) => {
530
+ return openBlock(), createBlock(Teleport, { to: unref(sheetRoot) }, [createVNode(Transition, { name: "rk-command" }, {
531
+ default: withCtx(() => [open.value ? (openBlock(), createElementBlock("div", {
532
+ key: 0,
533
+ class: "rk-command",
534
+ onKeydown
535
+ }, [createElementVNode("div", {
536
+ class: "rk-command-scrim",
537
+ onClick: _cache[0] || (_cache[0] = ($event) => open.value = false)
538
+ }), createElementVNode("div", {
539
+ class: "rk-command-panel surface-overlay",
540
+ role: "dialog",
541
+ "aria-modal": "true",
542
+ "aria-label": __props.label
543
+ }, [createElementVNode("div", _hoisted_2$7, [createVNode(unref(Search), {
544
+ class: "text-ink-soft size-4 shrink-0",
545
+ "aria-hidden": "true"
546
+ }), withDirectives(createElementVNode("input", {
547
+ ref_key: "field",
548
+ ref: field,
549
+ "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => query.value = $event),
550
+ type: "text",
551
+ role: "combobox",
552
+ class: "rk-command-input",
553
+ autocomplete: "off",
554
+ placeholder: __props.placeholder,
555
+ "aria-label": __props.label,
556
+ "aria-expanded": true,
557
+ "aria-controls": unref(id),
558
+ "aria-activedescendant": flat.value.length ? `${unref(id)}-${active.value}` : void 0
559
+ }, null, 8, _hoisted_3$5), [[vModelText, query.value]])]), createElementVNode("div", {
560
+ id: unref(id),
561
+ class: "rk-command-list",
562
+ role: "listbox",
563
+ "aria-label": __props.label
564
+ }, [(openBlock(true), createElementBlock(Fragment, null, renderList(matches.value, (group) => {
565
+ return openBlock(), createElementBlock(Fragment, { key: group.label ?? "items" }, [group.label ? (openBlock(), createElementBlock("p", _hoisted_5$2, toDisplayString(group.label), 1)) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(group.items, (item) => {
566
+ return openBlock(), createElementBlock("div", {
567
+ id: `${unref(id)}-${indexOf(item)}`,
568
+ key: item.id,
569
+ class: normalizeClass(["rk-command-item", { "is-active": indexOf(item) === active.value }]),
570
+ role: "option",
571
+ "aria-selected": indexOf(item) === active.value,
572
+ onClick: ($event) => choose(item),
573
+ onPointermove: ($event) => active.value = indexOf(item)
574
+ }, [
575
+ item.icon ? (openBlock(), createBlock(resolveDynamicComponent(item.icon), {
576
+ key: 0,
577
+ class: "size-4 shrink-0",
578
+ "aria-hidden": "true"
579
+ })) : createCommentVNode("", true),
580
+ createElementVNode("span", _hoisted_7$1, toDisplayString(item.label), 1),
581
+ item.hint ? (openBlock(), createElementBlock("span", _hoisted_8$1, toDisplayString(item.hint), 1)) : createCommentVNode("", true)
582
+ ], 42, _hoisted_6$2);
583
+ }), 128))], 64);
584
+ }), 128)), flat.value.length === 0 ? (openBlock(), createElementBlock("p", _hoisted_9$1, toDisplayString(__props.emptyLabel), 1)) : createCommentVNode("", true)], 8, _hoisted_4$3)], 8, _hoisted_1$8)], 32)) : createCommentVNode("", true)]),
585
+ _: 1
586
+ })], 8, ["to"]);
587
+ };
588
+ }
589
+ }), [["__scopeId", "data-v-cce1dd03"]]);
590
+ //#endregion
591
+ //#region src/web/DataTable.vue?vue&type=script&setup=true&lang.ts
592
+ var _hoisted_1$7 = ["aria-label"];
593
+ var _hoisted_2$6 = {
594
+ key: 0,
595
+ scope: "col",
596
+ class: "rk-data-pick"
597
+ };
598
+ var _hoisted_3$4 = [
599
+ "checked",
600
+ "indeterminate",
601
+ "aria-label"
602
+ ];
603
+ var _hoisted_4$2 = ["aria-sort"];
604
+ var _hoisted_5$1 = ["onClick"];
605
+ var _hoisted_6$1 = {
606
+ key: 0,
607
+ "aria-busy": "true"
608
+ };
609
+ var _hoisted_7 = { key: 0 };
610
+ var _hoisted_8 = { key: 1 };
611
+ var _hoisted_9 = {
612
+ key: 0,
613
+ class: "rk-data-pick"
614
+ };
615
+ var _hoisted_10 = [
616
+ "checked",
617
+ "aria-label",
618
+ "onChange"
619
+ ];
620
+ var _hoisted_11 = { key: 2 };
621
+ var _hoisted_12 = ["colspan"];
622
+ //#endregion
623
+ //#region src/web/DataTable.vue
624
+ var DataTable_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
625
+ __name: "DataTable",
626
+ props: /*@__PURE__*/ mergeModels({
627
+ columns: {},
628
+ rows: {},
629
+ caption: {},
630
+ captionHidden: {
631
+ type: Boolean,
632
+ default: false
633
+ },
634
+ rowKey: { default: () => void 0 },
635
+ selectAllLabel: { default: () => void 0 },
636
+ rowLabel: {
637
+ type: Function,
638
+ default: void 0
639
+ },
640
+ manualSort: {
641
+ type: Boolean,
642
+ default: false
643
+ },
644
+ loading: {
645
+ type: Boolean,
646
+ default: false
647
+ },
648
+ loadingRows: { default: 5 },
649
+ stickyHeader: {
650
+ type: Boolean,
651
+ default: false
652
+ }
653
+ }, {
654
+ "sort": { default: void 0 },
655
+ "sortModifiers": {},
656
+ "selected": { default: () => [] },
657
+ "selectedModifiers": {}
658
+ }),
659
+ emits: ["update:sort", "update:selected"],
660
+ setup(__props) {
661
+ /** Which column is sorted, and which way. `v-model:sort`. */
662
+ const sort = useModel(__props, "sort");
663
+ /** The chosen rows' keys. `v-model:selected`. */
664
+ const selected = useModel(__props, "selected");
665
+ const selectable = computed(() => Boolean(__props.rowKey && __props.selectAllLabel && __props.rowLabel));
666
+ const keyOf = (row, index) => __props.rowKey ? String(row[__props.rowKey]) : String(index);
667
+ function compare(a, b) {
668
+ if (typeof a === "number" && typeof b === "number") return a - b;
669
+ if (a == null) return b == null ? 0 : -1;
670
+ if (b == null) return 1;
671
+ return String(a).localeCompare(String(b));
672
+ }
673
+ const shown = computed(() => {
674
+ if (!sort.value || __props.manualSort) return __props.rows;
675
+ const { key, direction } = sort.value;
676
+ const sorted = [...__props.rows].sort((a, b) => compare(a[key], b[key]));
677
+ return direction === "asc" ? sorted : sorted.reverse();
678
+ });
679
+ /** Ascending, then descending, then back to the order it arrived in. */
680
+ function toggleSort(column) {
681
+ if (!column.sortable) return;
682
+ if (sort.value?.key !== column.key) {
683
+ sort.value = {
684
+ key: column.key,
685
+ direction: "asc"
686
+ };
687
+ return;
688
+ }
689
+ sort.value = sort.value.direction === "asc" ? {
690
+ key: column.key,
691
+ direction: "desc"
692
+ } : void 0;
693
+ }
694
+ const ariaSort = (column) => {
695
+ if (!column.sortable) return void 0;
696
+ if (sort.value?.key !== column.key) return "none";
697
+ return sort.value.direction === "asc" ? "ascending" : "descending";
698
+ };
699
+ const allKeys = computed(() => shown.value.map((row, index) => keyOf(row, index)));
700
+ const allChosen = computed(() => allKeys.value.length > 0 && allKeys.value.every((key) => selected.value.includes(key)));
701
+ const someChosen = computed(() => !allChosen.value && allKeys.value.some((key) => selected.value.includes(key)));
702
+ function toggleAll() {
703
+ selected.value = allChosen.value ? [] : allKeys.value;
704
+ }
705
+ function toggleRow(key) {
706
+ selected.value = selected.value.includes(key) ? selected.value.filter((one) => one !== key) : [...selected.value, key];
707
+ }
708
+ const columnCount = computed(() => __props.columns.length + (selectable.value ? 1 : 0));
709
+ return (_ctx, _cache) => {
710
+ return openBlock(), createElementBlock("div", {
711
+ class: "rk-data-scroll",
712
+ tabindex: "0",
713
+ role: "region",
714
+ "aria-label": __props.caption
715
+ }, [createElementVNode("table", { class: normalizeClass(["rk-data", { "is-sticky": __props.stickyHeader }]) }, [
716
+ createElementVNode("caption", { class: normalizeClass(__props.captionHidden ? "rk-data-caption-hidden" : "rk-data-caption") }, toDisplayString(__props.caption), 3),
717
+ createElementVNode("thead", null, [createElementVNode("tr", null, [selectable.value ? (openBlock(), createElementBlock("th", _hoisted_2$6, [createElementVNode("input", {
718
+ type: "checkbox",
719
+ class: "rk-data-box focus-ring",
720
+ checked: allChosen.value,
721
+ indeterminate: someChosen.value,
722
+ "aria-label": __props.selectAllLabel,
723
+ onChange: toggleAll
724
+ }, null, 40, _hoisted_3$4)])) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (column) => {
725
+ return openBlock(), createElementBlock("th", {
726
+ key: column.key,
727
+ scope: "col",
728
+ "aria-sort": ariaSort(column),
729
+ class: normalizeClass([column.align === "end" && "is-end", column.nowrap && "is-nowrap"])
730
+ }, [column.sortable ? (openBlock(), createElementBlock("button", {
731
+ key: 0,
732
+ type: "button",
733
+ class: "rk-data-sort focus-ring",
734
+ onClick: ($event) => toggleSort(column)
735
+ }, [createTextVNode(toDisplayString(column.label) + " ", 1), ariaSort(column) === "ascending" ? (openBlock(), createBlock(unref(ArrowUp), {
736
+ key: 0,
737
+ class: "size-3.5",
738
+ "aria-hidden": "true"
739
+ })) : ariaSort(column) === "descending" ? (openBlock(), createBlock(unref(ArrowDown), {
740
+ key: 1,
741
+ class: "size-3.5",
742
+ "aria-hidden": "true"
743
+ })) : (openBlock(), createBlock(unref(ChevronsUpDown), {
744
+ key: 2,
745
+ class: "size-3.5 opacity-40",
746
+ "aria-hidden": "true"
747
+ }))], 8, _hoisted_5$1)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [createTextVNode(toDisplayString(column.label), 1)], 64))], 10, _hoisted_4$2);
748
+ }), 128))])]),
749
+ __props.loading ? (openBlock(), createElementBlock("tbody", _hoisted_6$1, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.loadingRows, (row) => {
750
+ return openBlock(), createElementBlock("tr", { key: row }, [selectable.value ? (openBlock(), createElementBlock("td", _hoisted_7)) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (column) => {
751
+ return openBlock(), createElementBlock("td", { key: column.key }, [createVNode(BaseSkeleton_default, {
752
+ shape: "text",
753
+ height: "0.75rem",
754
+ width: "70%"
755
+ })]);
756
+ }), 128))]);
757
+ }), 128))])) : shown.value.length > 0 ? (openBlock(), createElementBlock("tbody", _hoisted_8, [(openBlock(true), createElementBlock(Fragment, null, renderList(shown.value, (row, index) => {
758
+ return openBlock(), createElementBlock("tr", {
759
+ key: keyOf(row, index),
760
+ class: normalizeClass({ "is-chosen": selected.value.includes(keyOf(row, index)) })
761
+ }, [selectable.value ? (openBlock(), createElementBlock("td", _hoisted_9, [createElementVNode("input", {
762
+ type: "checkbox",
763
+ class: "rk-data-box focus-ring",
764
+ checked: selected.value.includes(keyOf(row, index)),
765
+ "aria-label": __props.rowLabel(row),
766
+ onChange: ($event) => toggleRow(keyOf(row, index))
767
+ }, null, 40, _hoisted_10)])) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (column) => {
768
+ return openBlock(), createElementBlock("td", {
769
+ key: column.key,
770
+ class: normalizeClass([column.align === "end" && "is-end", column.nowrap && "is-nowrap"])
771
+ }, [renderSlot(_ctx.$slots, column.key, {
772
+ row,
773
+ value: row[column.key]
774
+ }, () => [createTextVNode(toDisplayString(row[column.key]), 1)], true)], 2);
775
+ }), 128))], 2);
776
+ }), 128))])) : (openBlock(), createElementBlock("tbody", _hoisted_11, [createElementVNode("tr", null, [createElementVNode("td", {
777
+ colspan: columnCount.value,
778
+ class: "rk-data-empty"
779
+ }, [renderSlot(_ctx.$slots, "empty", {}, void 0, true)], 8, _hoisted_12)])]))
780
+ ], 2)], 8, _hoisted_1$7);
781
+ };
782
+ }
783
+ }), [["__scopeId", "data-v-5920cac0"]]);
784
+ //#endregion
785
+ //#region src/web/BaseSplitter.vue?vue&type=script&setup=true&lang.ts
786
+ var _hoisted_1$6 = { class: "rk-split-pane is-start" };
787
+ var _hoisted_2$5 = [
788
+ "aria-label",
789
+ "aria-orientation",
790
+ "aria-valuenow",
791
+ "aria-valuemin",
792
+ "aria-valuemax"
793
+ ];
794
+ var _hoisted_3$3 = { class: "rk-split-pane is-end" };
795
+ //#endregion
796
+ //#region src/web/BaseSplitter.vue
797
+ var BaseSplitter_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
798
+ __name: "BaseSplitter",
799
+ props: /*@__PURE__*/ mergeModels({
800
+ label: {},
801
+ orientation: { default: "horizontal" },
802
+ min: { default: 15 },
803
+ max: { default: 85 },
804
+ step: { default: 2 }
805
+ }, {
806
+ "modelValue": { default: 50 },
807
+ "modelModifiers": {}
808
+ }),
809
+ emits: ["update:modelValue"],
810
+ setup(__props) {
811
+ /** Where the split sits, as a percentage of the whole. `v-model`. */
812
+ const split = useModel(__props, "modelValue");
813
+ const root = useTemplateRef("root");
814
+ const dragging = ref(false);
815
+ const startedAt = split.value;
816
+ const clamp = (value) => Math.min(__props.max, Math.max(__props.min, value));
817
+ const horizontal = computed(() => __props.orientation === "horizontal");
818
+ function moveTo(point) {
819
+ const box = root.value?.getBoundingClientRect();
820
+ if (!box) return;
821
+ const ratio = horizontal.value ? (point - box.left) / box.width : (point - box.top) / box.height;
822
+ split.value = clamp(Math.round(ratio * 100));
823
+ }
824
+ function onPointerDown(event) {
825
+ dragging.value = true;
826
+ event.target.setPointerCapture(event.pointerId);
827
+ }
828
+ function onPointerMove(event) {
829
+ if (!dragging.value) return;
830
+ event.preventDefault();
831
+ moveTo(horizontal.value ? event.clientX : event.clientY);
832
+ }
833
+ function onPointerUp(event) {
834
+ dragging.value = false;
835
+ event.target.releasePointerCapture?.(event.pointerId);
836
+ }
837
+ function onKeydown(event) {
838
+ const back = horizontal.value ? "ArrowLeft" : "ArrowUp";
839
+ const forward = horizontal.value ? "ArrowRight" : "ArrowDown";
840
+ const next = {
841
+ [back]: split.value - __props.step,
842
+ [forward]: split.value + __props.step,
843
+ Home: __props.min,
844
+ End: __props.max,
845
+ Enter: startedAt
846
+ }[event.key];
847
+ if (next === void 0) return;
848
+ event.preventDefault();
849
+ split.value = clamp(next);
850
+ }
851
+ onBeforeUnmount(() => dragging.value = false);
852
+ return (_ctx, _cache) => {
853
+ return openBlock(), createElementBlock("div", {
854
+ ref_key: "root",
855
+ ref: root,
856
+ class: normalizeClass(["rk-split", [`is-${__props.orientation}`, { "is-dragging": dragging.value }]]),
857
+ style: normalizeStyle({ "--rk-split": `${split.value}%` })
858
+ }, [
859
+ createElementVNode("div", _hoisted_1$6, [renderSlot(_ctx.$slots, "start", {}, void 0, true)]),
860
+ createElementVNode("div", {
861
+ class: "rk-split-handle focus-ring",
862
+ role: "separator",
863
+ tabindex: "0",
864
+ "aria-label": __props.label,
865
+ "aria-orientation": __props.orientation === "horizontal" ? "vertical" : "horizontal",
866
+ "aria-valuenow": split.value,
867
+ "aria-valuemin": __props.min,
868
+ "aria-valuemax": __props.max,
869
+ onPointerdown: onPointerDown,
870
+ onPointermove: onPointerMove,
871
+ onPointerup: onPointerUp,
872
+ onPointercancel: onPointerUp,
873
+ onKeydown
874
+ }, [..._cache[0] || (_cache[0] = [createElementVNode("span", {
875
+ class: "rk-split-grip",
876
+ "aria-hidden": "true"
877
+ }, null, -1)])], 40, _hoisted_2$5),
878
+ createElementVNode("div", _hoisted_3$3, [renderSlot(_ctx.$slots, "end", {}, void 0, true)])
879
+ ], 6);
880
+ };
881
+ }
882
+ }), [["__scopeId", "data-v-159a4f08"]]);
883
+ //#endregion
884
+ //#region src/web/BaseToolbar.vue?vue&type=script&setup=true&lang.ts
885
+ var _hoisted_1$5 = ["aria-label", "aria-orientation"];
886
+ /**
887
+ * A row of controls that belong together: a formatting bar, a row of view
888
+ * switches, the actions over a table.
889
+ *
890
+ * One Tab stop for the lot. The arrows move between the controls inside it,
891
+ * Home and End jump to the ends — the toolbar pattern, and the reason to
892
+ * use it is arithmetic: twelve buttons in the tab order cost twelve presses
893
+ * to get past on the way to the thing under them.
894
+ *
895
+ * The controls are yours: anything focusable inside is picked up, so a
896
+ * toolbar can mix the kit's buttons, a `ToggleGroup` and a separator
897
+ * without declaring any of them as data.
898
+ */
899
+ var FOCUSABLE = "button:not([disabled]), a[href], input:not([disabled]), select, textarea";
900
+ //#endregion
901
+ //#region src/web/BaseToolbar.vue
902
+ var BaseToolbar_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
903
+ __name: "BaseToolbar",
904
+ props: {
905
+ label: {},
906
+ orientation: { default: "horizontal" }
907
+ },
908
+ setup(__props) {
909
+ const root = useTemplateRef("root");
910
+ const at = ref(0);
911
+ function controls() {
912
+ return Array.from(root.value?.querySelectorAll(FOCUSABLE) ?? []);
913
+ }
914
+ function applyRoving() {
915
+ const list = controls();
916
+ at.value = Math.min(at.value, Math.max(0, list.length - 1));
917
+ list.forEach((control, index) => {
918
+ control.tabIndex = index === at.value ? 0 : -1;
919
+ });
920
+ }
921
+ function focusAt(index) {
922
+ const list = controls();
923
+ if (list.length === 0) return;
924
+ at.value = (index + list.length) % list.length;
925
+ applyRoving();
926
+ list[at.value]?.focus();
927
+ }
928
+ function onKeydown(event) {
929
+ const back = __props.orientation === "horizontal" ? "ArrowLeft" : "ArrowUp";
930
+ const forward = __props.orientation === "horizontal" ? "ArrowRight" : "ArrowDown";
931
+ const list = controls();
932
+ const current = list.indexOf(document.activeElement);
933
+ if (event.key === back) {
934
+ event.preventDefault();
935
+ focusAt(current - 1);
936
+ } else if (event.key === forward) {
937
+ event.preventDefault();
938
+ focusAt(current + 1);
939
+ } else if (event.key === "Home") {
940
+ event.preventDefault();
941
+ focusAt(0);
942
+ } else if (event.key === "End") {
943
+ event.preventDefault();
944
+ focusAt(list.length - 1);
945
+ }
946
+ }
947
+ function onFocusin(event) {
948
+ const index = controls().indexOf(event.target);
949
+ if (index >= 0) {
950
+ at.value = index;
951
+ applyRoving();
952
+ }
953
+ }
954
+ onMounted(applyRoving);
955
+ return (_ctx, _cache) => {
956
+ return openBlock(), createElementBlock("div", {
957
+ ref_key: "root",
958
+ ref: root,
959
+ class: normalizeClass(["rk-toolbar", `is-${__props.orientation}`]),
960
+ role: "toolbar",
961
+ "aria-label": __props.label,
962
+ "aria-orientation": __props.orientation,
963
+ onKeydown,
964
+ onFocusin
965
+ }, [renderSlot(_ctx.$slots, "default", {}, void 0, true)], 42, _hoisted_1$5);
966
+ };
967
+ }
968
+ }), [["__scopeId", "data-v-a65164b7"]]);
969
+ //#endregion
970
+ //#region src/web/BaseTree.vue?vue&type=script&setup=true&lang.ts
971
+ var _hoisted_1$4 = ["aria-label", "aria-multiselectable"];
972
+ var _hoisted_2$4 = [
973
+ "aria-level",
974
+ "aria-setsize",
975
+ "aria-posinset",
976
+ "aria-expanded",
977
+ "aria-selected",
978
+ "aria-disabled",
979
+ "onClick"
980
+ ];
981
+ var _hoisted_3$2 = {
982
+ key: 1,
983
+ class: "rk-tree-twist-space",
984
+ "aria-hidden": "true"
985
+ };
986
+ var _hoisted_4$1 = { class: "truncate" };
987
+ //#endregion
988
+ //#region src/web/BaseTree.vue
989
+ var BaseTree_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
990
+ __name: "BaseTree",
991
+ props: /*@__PURE__*/ mergeModels({
992
+ modelValue: { default: () => void 0 },
993
+ nodes: {},
994
+ label: {},
995
+ mode: { default: "single" }
996
+ }, {
997
+ "expanded": { default: () => [] },
998
+ "expandedModifiers": {}
999
+ }),
1000
+ emits: /*@__PURE__*/ mergeModels(["update:modelValue"], ["update:expanded"]),
1001
+ setup(__props, { emit: __emit }) {
1002
+ const emit = __emit;
1003
+ const model = useBoundValue(() => __props.modelValue, (value) => emit("update:modelValue", value));
1004
+ /** Which branches are open. */
1005
+ const expanded = useModel(__props, "expanded");
1006
+ const rows = computed(() => {
1007
+ const out = [];
1008
+ const walk = (list, level, parent) => {
1009
+ list.forEach((node, index) => {
1010
+ out.push({
1011
+ node,
1012
+ level,
1013
+ position: index + 1,
1014
+ size: list.length,
1015
+ parent
1016
+ });
1017
+ if (node.children?.length && expanded.value.includes(node.key)) walk(node.children, level + 1, node.key);
1018
+ });
1019
+ };
1020
+ walk(__props.nodes, 1, null);
1021
+ return out;
1022
+ });
1023
+ const active = ref(0);
1024
+ const chosen = computed(() => {
1025
+ const value = model.value;
1026
+ if (Array.isArray(value)) return new Set(value);
1027
+ return new Set(value === void 0 ? [] : [value]);
1028
+ });
1029
+ const isOpen = (node) => expanded.value.includes(node.key);
1030
+ const hasChildren = (node) => Boolean(node.children?.length);
1031
+ function setOpen(node, open) {
1032
+ if (!hasChildren(node)) return;
1033
+ expanded.value = open ? [...expanded.value, node.key] : expanded.value.filter((key) => key !== node.key);
1034
+ }
1035
+ function choose(node) {
1036
+ if (node.disabled) return;
1037
+ if (__props.mode === "multiple") {
1038
+ const next = new Set(chosen.value);
1039
+ if (next.has(node.key)) next.delete(node.key);
1040
+ else next.add(node.key);
1041
+ model.value = [...next];
1042
+ return;
1043
+ }
1044
+ model.value = node.key;
1045
+ }
1046
+ function moveTo(index) {
1047
+ active.value = Math.max(0, Math.min(rows.value.length - 1, index));
1048
+ }
1049
+ function onKeydown(event) {
1050
+ const row = rows.value[active.value];
1051
+ if (!row) return;
1052
+ switch (event.key) {
1053
+ case "ArrowDown":
1054
+ event.preventDefault();
1055
+ moveTo(active.value + 1);
1056
+ break;
1057
+ case "ArrowUp":
1058
+ event.preventDefault();
1059
+ moveTo(active.value - 1);
1060
+ break;
1061
+ case "ArrowRight":
1062
+ event.preventDefault();
1063
+ if (hasChildren(row.node) && !isOpen(row.node)) setOpen(row.node, true);
1064
+ else if (hasChildren(row.node)) moveTo(active.value + 1);
1065
+ break;
1066
+ case "ArrowLeft": {
1067
+ event.preventDefault();
1068
+ if (hasChildren(row.node) && isOpen(row.node)) {
1069
+ setOpen(row.node, false);
1070
+ break;
1071
+ }
1072
+ const parent = rows.value.findIndex((one) => one.node.key === row.parent);
1073
+ if (parent >= 0) moveTo(parent);
1074
+ break;
1075
+ }
1076
+ case "Home":
1077
+ event.preventDefault();
1078
+ moveTo(0);
1079
+ break;
1080
+ case "End":
1081
+ event.preventDefault();
1082
+ moveTo(rows.value.length - 1);
1083
+ break;
1084
+ case "Enter":
1085
+ case " ":
1086
+ event.preventDefault();
1087
+ choose(row.node);
1088
+ }
1089
+ }
1090
+ function onClick(index, row) {
1091
+ active.value = index;
1092
+ if (hasChildren(row.node)) setOpen(row.node, !isOpen(row.node));
1093
+ else choose(row.node);
1094
+ }
1095
+ return (_ctx, _cache) => {
1096
+ return openBlock(), createElementBlock("ul", {
1097
+ class: "rk-tree",
1098
+ role: "tree",
1099
+ "aria-label": __props.label,
1100
+ "aria-multiselectable": __props.mode === "multiple" ? true : void 0,
1101
+ tabindex: "0",
1102
+ onKeydown
1103
+ }, [(openBlock(true), createElementBlock(Fragment, null, renderList(rows.value, (row, index) => {
1104
+ return openBlock(), createElementBlock("li", {
1105
+ key: row.node.key,
1106
+ class: normalizeClass(["rk-tree-row", {
1107
+ "is-active": index === active.value,
1108
+ "is-chosen": chosen.value.has(row.node.key),
1109
+ "is-disabled": row.node.disabled
1110
+ }]),
1111
+ role: "treeitem",
1112
+ "aria-level": row.level,
1113
+ "aria-setsize": row.size,
1114
+ "aria-posinset": row.position,
1115
+ "aria-expanded": row.node.children?.length ? isOpen(row.node) : void 0,
1116
+ "aria-selected": chosen.value.has(row.node.key),
1117
+ "aria-disabled": row.node.disabled,
1118
+ style: normalizeStyle({ "--rk-tree-level": row.level }),
1119
+ onClick: ($event) => onClick(index, row)
1120
+ }, [
1121
+ row.node.children?.length ? (openBlock(), createBlock(unref(ChevronRight), {
1122
+ key: 0,
1123
+ class: normalizeClass(["rk-tree-twist", { "is-open": isOpen(row.node) }]),
1124
+ "aria-hidden": "true"
1125
+ }, null, 8, ["class"])) : (openBlock(), createElementBlock("span", _hoisted_3$2)),
1126
+ row.node.icon ? (openBlock(), createBlock(resolveDynamicComponent(row.node.icon), {
1127
+ key: 2,
1128
+ class: "size-4 shrink-0",
1129
+ "aria-hidden": "true"
1130
+ })) : createCommentVNode("", true),
1131
+ createElementVNode("span", _hoisted_4$1, toDisplayString(row.node.label), 1)
1132
+ ], 14, _hoisted_2$4);
1133
+ }), 128))], 40, _hoisted_1$4);
1134
+ };
1135
+ }
1136
+ }), [["__scopeId", "data-v-1ba675c5"]]);
1137
+ //#endregion
1138
+ //#region src/web/TransferList.vue?vue&type=script&setup=true&lang.ts
1139
+ var _hoisted_1$3 = { class: "rk-transfer" };
1140
+ var _hoisted_2$3 = { class: "rk-transfer-side" };
1141
+ var _hoisted_3$1 = { class: "rk-transfer-title" };
1142
+ var _hoisted_4 = { class: "rk-transfer-middle" };
1143
+ var _hoisted_5 = { class: "rk-transfer-side" };
1144
+ var _hoisted_6 = { class: "rk-transfer-title" };
1145
+ //#endregion
1146
+ //#region src/web/TransferList.vue
1147
+ var TransferList_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
1148
+ __name: "TransferList",
1149
+ props: /*@__PURE__*/ mergeModels({
1150
+ options: {},
1151
+ availableLabel: {},
1152
+ chosenLabel: {},
1153
+ addLabel: {},
1154
+ removeLabel: {},
1155
+ height: { default: "14rem" }
1156
+ }, {
1157
+ "modelValue": { default: () => [] },
1158
+ "modelModifiers": {}
1159
+ }),
1160
+ emits: ["update:modelValue"],
1161
+ setup(__props) {
1162
+ /** What has been moved across, in the order it was moved. `v-model`. */
1163
+ const model = useModel(__props, "modelValue");
1164
+ const markedAvailable = ref([]);
1165
+ const markedChosen = ref([]);
1166
+ const available = computed(() => __props.options.filter((option) => !model.value.includes(option.value)));
1167
+ const chosen = computed(() => model.value.map((value) => __props.options.find((option) => option.value === value)).filter((option) => option !== void 0));
1168
+ function add() {
1169
+ model.value = [...model.value, ...markedAvailable.value];
1170
+ markedAvailable.value = [];
1171
+ }
1172
+ function remove() {
1173
+ model.value = model.value.filter((value) => !markedChosen.value.includes(value));
1174
+ markedChosen.value = [];
1175
+ }
1176
+ return (_ctx, _cache) => {
1177
+ return openBlock(), createElementBlock("div", _hoisted_1$3, [
1178
+ createElementVNode("div", _hoisted_2$3, [createElementVNode("p", _hoisted_3$1, toDisplayString(__props.availableLabel), 1), createVNode(BaseListbox_default, {
1179
+ modelValue: markedAvailable.value,
1180
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => markedAvailable.value = $event),
1181
+ mode: "multiple",
1182
+ options: available.value,
1183
+ label: __props.availableLabel,
1184
+ height: __props.height
1185
+ }, null, 8, [
1186
+ "modelValue",
1187
+ "options",
1188
+ "label",
1189
+ "height"
1190
+ ])]),
1191
+ createElementVNode("div", _hoisted_4, [createVNode(BaseButton_default, {
1192
+ icon: "",
1193
+ variant: "secondary",
1194
+ "aria-label": __props.addLabel,
1195
+ disabled: markedAvailable.value.length === 0,
1196
+ onClick: add
1197
+ }, {
1198
+ default: withCtx(() => [createVNode(unref(ChevronRight), { class: "size-4" })]),
1199
+ _: 1
1200
+ }, 8, ["aria-label", "disabled"]), createVNode(BaseButton_default, {
1201
+ icon: "",
1202
+ variant: "secondary",
1203
+ "aria-label": __props.removeLabel,
1204
+ disabled: markedChosen.value.length === 0,
1205
+ onClick: remove
1206
+ }, {
1207
+ default: withCtx(() => [createVNode(unref(ChevronLeft), { class: "size-4" })]),
1208
+ _: 1
1209
+ }, 8, ["aria-label", "disabled"])]),
1210
+ createElementVNode("div", _hoisted_5, [createElementVNode("p", _hoisted_6, toDisplayString(__props.chosenLabel), 1), createVNode(BaseListbox_default, {
1211
+ modelValue: markedChosen.value,
1212
+ "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => markedChosen.value = $event),
1213
+ mode: "multiple",
1214
+ options: chosen.value,
1215
+ label: __props.chosenLabel,
1216
+ height: __props.height
1217
+ }, null, 8, [
1218
+ "modelValue",
1219
+ "options",
1220
+ "label",
1221
+ "height"
1222
+ ])])
1223
+ ]);
1224
+ };
1225
+ }
1226
+ }), [["__scopeId", "data-v-1d75b0da"]]);
1227
+ //#endregion
397
1228
  //#region src/web/BaseTabs.vue?vue&type=script&setup=true&lang.ts
398
1229
  var _hoisted_1$2 = ["aria-label"];
399
1230
  var _hoisted_2$2 = [
@@ -539,6 +1370,6 @@ var NavLinks_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PUR
539
1370
  }
540
1371
  }), [["__scopeId", "data-v-52e5d553"]]);
541
1372
  //#endregion
542
- export { BaseAccordion_default as BaseAccordion, BaseBreadcrumb_default as BaseBreadcrumb, BaseDisclosure_default as BaseDisclosure, BaseModal_default as BaseModal, BasePagination_default as BasePagination, BaseTabs_default as BaseTabs, BaseTooltip_default as BaseTooltip, NavLinks_default as NavLinks };
1373
+ export { BaseAccordion_default as BaseAccordion, BaseBreadcrumb_default as BaseBreadcrumb, BaseDisclosure_default as BaseDisclosure, BaseModal_default as BaseModal, BasePagination_default as BasePagination, BaseSplitter_default as BaseSplitter, BaseTabs_default as BaseTabs, BaseToolbar_default as BaseToolbar, BaseTooltip_default as BaseTooltip, BaseTree_default as BaseTree, CommandMenu_default as CommandMenu, DataTable_default as DataTable, NavLinks_default as NavLinks, TransferList_default as TransferList };
543
1374
 
544
1375
  //# sourceMappingURL=web.js.map