rei-kit 2.20.0 → 2.22.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.
Files changed (35) hide show
  1. package/README.md +3 -3
  2. package/dist/{BaseListbox-Btibgnaf.js → BaseListbox-DMR-Zn1u.js} +232 -4
  3. package/dist/BaseListbox-DMR-Zn1u.js.map +1 -0
  4. package/dist/app/guards.d.ts +43 -1
  5. package/dist/app/index.d.ts +1 -1
  6. package/dist/app.js +51 -5
  7. package/dist/app.js.map +1 -1
  8. package/dist/components/AnnounceHost.vue.d.ts +3 -0
  9. package/dist/components/BaseCheckbox.vue.d.ts +19 -0
  10. package/dist/components/ErrorSummary.vue.d.ts +60 -0
  11. package/dist/components/FormField.vue.d.ts +6 -0
  12. package/dist/components/ScrollArea.vue.d.ts +68 -0
  13. package/dist/components/VirtualList.vue.d.ts +37 -0
  14. package/dist/composables/use-announce.d.ts +65 -0
  15. package/dist/composables/use-virtual-window.d.ts +39 -0
  16. package/dist/{BaseSheet-B7401rS7.js → focus-target-D0WsXwKh.js} +109 -9
  17. package/dist/focus-target-D0WsXwKh.js.map +1 -0
  18. package/dist/index.d.ts +33 -0
  19. package/dist/index.js +443 -262
  20. package/dist/index.js.map +1 -1
  21. package/dist/motion.js +1 -1
  22. package/dist/motion.js.map +1 -1
  23. package/dist/styles.css +469 -323
  24. package/dist/{GoogleButton-mCqGbrXm.js → use-announce-B1LsfsZx.js} +59 -86
  25. package/dist/use-announce-B1LsfsZx.js.map +1 -0
  26. package/dist/utils/direction.d.ts +20 -0
  27. package/dist/utils/focus-target.d.ts +18 -0
  28. package/dist/web/SkipLink.vue.d.ts +43 -0
  29. package/dist/web/index.d.ts +6 -0
  30. package/dist/web.js +154 -133
  31. package/dist/web.js.map +1 -1
  32. package/package.json +2 -2
  33. package/dist/BaseListbox-Btibgnaf.js.map +0 -1
  34. package/dist/BaseSheet-B7401rS7.js.map +0 -1
  35. package/dist/GoogleButton-mCqGbrXm.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import { a as addDays, c as lastNDays, d as toDateKey, f as todayKey, i as needsIosInstall, l as leadingBlanks, n as isApplePortable, o as eachDayOfYear, r as isInstalled, s as fromDateKey, t as SettingsGroup_default, u as startOfWeek } from "./SettingsGroup-BXkajKGl.js";
2
2
  import { n as formatNumber, r as setFormatLocale, t as formatDate } from "./format-BEvBK1SJ.js";
3
- import { a as SHEET_ROOT_ID, i as useVisualViewport, o as ensureSheetRoot, r as useBoundValue, t as BaseSheet_default } from "./BaseSheet-B7401rS7.js";
4
- import { a as BaseAlert_default, c as applyTheme, d as setThemeStorageKey, f as useTheme, h as toRedirectPath, i as FormField_default, l as isThemePreference, m as safeRedirect, n as BaseCheckbox_default, o as useToast, p as tapFeedback, r as BaseInput_default, s as useOnline, t as GoogleButton_default, u as readStoredTheme } from "./GoogleButton-mCqGbrXm.js";
3
+ import { a as useBoundValue, c as ensureSheetRoot, n as BaseCheckbox_default, o as useVisualViewport, r as BaseSheet_default, s as SHEET_ROOT_ID, t as focusTarget } from "./focus-target-D0WsXwKh.js";
4
+ import { a as FormField_default, c as useOnline, d as readStoredTheme, f as setThemeStorageKey, g as toRedirectPath, h as safeRedirect, i as BaseInput_default, l as applyTheme, m as tapFeedback, n as useAnnounce, o as BaseAlert_default, p as useTheme, r as GoogleButton_default, s as useToast, t as announce, u as isThemePreference } from "./use-announce-B1LsfsZx.js";
5
5
  import { n as registerErrorMapper, r as toAppError, t as AppError } from "./app-error-DF9cijE0.js";
6
- import { i as useMediaQuery, n as BaseSkeleton_default, r as useMenuKeys, t as BaseListbox_default } from "./BaseListbox-Btibgnaf.js";
6
+ import { a as useMediaQuery, i as useMenuKeys, n as ScrollArea_default, o as useDragScroll, r as BaseSkeleton_default, t as BaseListbox_default } from "./BaseListbox-DMR-Zn1u.js";
7
7
  import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper-BOaGB7Aw.js";
8
8
  import { t as BaseButton_default } from "./BaseButton-RN2an975.js";
9
9
  import { t as SettingsRow_default } from "./SettingsRow-Ct1p2C9Q.js";
@@ -271,90 +271,14 @@ function useDebouncedCallback(callback, delay = 800) {
271
271
  };
272
272
  }
273
273
  //#endregion
274
- //#region src/composables/use-drag-scroll.ts
275
- /** Movement before a press counts as a drag rather than a tap. */
276
- var DRAG_THRESHOLD_PX = 6;
277
- /**
278
- * Drag-to-scroll for a horizontally scrolling element.
279
- *
280
- * The app puts `touch-action: pan-y` on the page content so the tab-swipe
281
- * gesture keeps its pointer events — the browser never claims a horizontal
282
- * drag, which also means it never pans this element natively. Rather than give
283
- * that up, horizontal scrolling is driven here.
284
- *
285
- * @param target - The scroll container.
286
- * @returns `didDrag`, so a click handler can ignore the press that ended a drag.
287
- *
288
- * @example
289
- * ```ts
290
- * const scroller = ref<HTMLElement | null>(null)
291
- * const { didDrag } = useDragScroll(scroller)
292
- *
293
- * function onClick() {
294
- * if (didDrag()) return
295
- * // …treat as a tap
296
- * }
297
- * ```
298
- */
299
- function useDragScroll(target) {
300
- let pointerId = null;
301
- let startX = 0;
302
- let startScroll = 0;
303
- let dragged = false;
304
- function onPointerDown(event) {
305
- const element = target.value;
306
- if (!element || event.pointerType === "mouse") return;
307
- pointerId = event.pointerId;
308
- startX = event.clientX;
309
- startScroll = element.scrollLeft;
310
- dragged = false;
311
- }
312
- function onPointerMove(event) {
313
- const element = target.value;
314
- if (!element || event.pointerId !== pointerId) return;
315
- const dx = event.clientX - startX;
316
- if (!dragged && Math.abs(dx) < DRAG_THRESHOLD_PX) return;
317
- if (!dragged) {
318
- dragged = true;
319
- element.setPointerCapture(event.pointerId);
320
- }
321
- element.scrollLeft = startScroll - dx;
322
- }
323
- function onPointerUp(event) {
324
- const element = target.value;
325
- if (element?.hasPointerCapture(event.pointerId)) element.releasePointerCapture(event.pointerId);
326
- pointerId = null;
327
- }
328
- function bind(element) {
329
- element.addEventListener("pointerdown", onPointerDown);
330
- element.addEventListener("pointermove", onPointerMove);
331
- element.addEventListener("pointerup", onPointerUp);
332
- element.addEventListener("pointercancel", onPointerUp);
333
- }
334
- function unbind(element) {
335
- element.removeEventListener("pointerdown", onPointerDown);
336
- element.removeEventListener("pointermove", onPointerMove);
337
- element.removeEventListener("pointerup", onPointerUp);
338
- element.removeEventListener("pointercancel", onPointerUp);
339
- }
340
- watch(target, (element, previous) => {
341
- if (previous) unbind(previous);
342
- if (element) bind(element);
343
- }, { immediate: true });
344
- onScopeDispose(() => {
345
- if (target.value) unbind(target.value);
346
- });
347
- return { didDrag: () => dragged };
348
- }
349
- //#endregion
350
274
  //#region src/components/BaseAvatar.vue?vue&type=script&setup=true&lang.ts
351
- var _hoisted_1$45 = [
275
+ var _hoisted_1$48 = [
352
276
  "role",
353
277
  "aria-label",
354
278
  "aria-hidden"
355
279
  ];
356
- var _hoisted_2$39 = ["src"];
357
- var _hoisted_3$26 = {
280
+ var _hoisted_2$42 = ["src"];
281
+ var _hoisted_3$28 = {
358
282
  key: 1,
359
283
  class: "rk-avatar-initials"
360
284
  };
@@ -404,7 +328,7 @@ var BaseAvatar_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
404
328
  alt: "",
405
329
  class: "rk-avatar-img",
406
330
  onError: _cache[0] || (_cache[0] = ($event) => broken.value = true)
407
- }, null, 40, _hoisted_2$39)) : __props.fallback === "initials" && initials.value ? (openBlock(), createElementBlock("span", _hoisted_3$26, toDisplayString(initials.value), 1)) : (openBlock(), createElementBlock("svg", _hoisted_4$20, [..._cache[1] || (_cache[1] = [createElementVNode("circle", {
331
+ }, null, 40, _hoisted_2$42)) : __props.fallback === "initials" && initials.value ? (openBlock(), createElementBlock("span", _hoisted_3$28, toDisplayString(initials.value), 1)) : (openBlock(), createElementBlock("svg", _hoisted_4$20, [..._cache[1] || (_cache[1] = [createElementVNode("circle", {
408
332
  cx: "10",
409
333
  cy: "6.75",
410
334
  r: "3.25",
@@ -413,7 +337,7 @@ var BaseAvatar_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
413
337
  d: "M3.75 17c0-3.05 2.8-5.25 6.25-5.25S16.25 13.95 16.25 17",
414
338
  "stroke-width": "1.5",
415
339
  "stroke-linecap": "round"
416
- }, null, -1)])]))], 10, _hoisted_1$45);
340
+ }, null, -1)])]))], 10, _hoisted_1$48);
417
341
  };
418
342
  }
419
343
  }), [["__scopeId", "data-v-47586bec"]]);
@@ -438,12 +362,12 @@ var BaseBadge_default = /* @__PURE__ */ defineComponent({
438
362
  });
439
363
  //#endregion
440
364
  //#region src/components/BaseMenu.vue?vue&type=script&setup=true&lang.ts
441
- var _hoisted_1$44 = [
365
+ var _hoisted_1$47 = [
442
366
  "aria-label",
443
367
  "aria-expanded",
444
368
  "aria-controls"
445
369
  ];
446
- var _hoisted_2$38 = ["id"];
370
+ var _hoisted_2$41 = ["id"];
447
371
  //#endregion
448
372
  //#region src/components/BaseMenu.vue
449
373
  var BaseMenu_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
@@ -512,17 +436,17 @@ var BaseMenu_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PUR
512
436
  "aria-haspopup": true,
513
437
  "aria-controls": open.value ? unref(id) : void 0,
514
438
  onClick: _cache[0] || (_cache[0] = ($event) => open.value = !open.value)
515
- }, [renderSlot(_ctx.$slots, "trigger", { open: open.value }, void 0, true)], 8, _hoisted_1$44), open.value ? (openBlock(), createElementBlock("div", {
439
+ }, [renderSlot(_ctx.$slots, "trigger", { open: open.value }, void 0, true)], 8, _hoisted_1$47), open.value ? (openBlock(), createElementBlock("div", {
516
440
  key: 0,
517
441
  id: unref(id),
518
442
  ref_key: "panel",
519
443
  ref: panel,
520
444
  class: normalizeClass(["rk-menu-panel surface-overlay", `is-${__props.align}`]),
521
445
  role: "menu"
522
- }, [renderSlot(_ctx.$slots, "default", {}, void 0, true)], 10, _hoisted_2$38)) : createCommentVNode("", true)], 544);
446
+ }, [renderSlot(_ctx.$slots, "default", {}, void 0, true)], 10, _hoisted_2$41)) : createCommentVNode("", true)], 544);
523
447
  };
524
448
  }
525
- }), [["__scopeId", "data-v-ee62de72"]]);
449
+ }), [["__scopeId", "data-v-eaeecb75"]]);
526
450
  //#endregion
527
451
  //#region src/components/BaseCard.vue
528
452
  var BaseCard_default = /* @__PURE__ */ defineComponent({
@@ -589,14 +513,68 @@ var BaseCard_default = /* @__PURE__ */ defineComponent({
589
513
  }
590
514
  });
591
515
  //#endregion
516
+ //#region src/composables/use-virtual-window.ts
517
+ /** Rows of slack each way, so a fast scroll does not show a gap before the
518
+ * next frame fills it. */
519
+ var OVERSCAN_ROWS = 3;
520
+ /**
521
+ * The arithmetic behind a windowed list: which rows are near the viewport,
522
+ * and how much empty space stands in for the rest.
523
+ *
524
+ * This is the part `BaseCombobox` and `VirtualList` share. It was written
525
+ * inside the combobox first, and pulling it out here is the reason there is
526
+ * one copy of it rather than two — the second would have drifted, and the
527
+ * half that drifts silently is the padding, which is what keeps the
528
+ * scrollbar honest about how long the list is.
529
+ *
530
+ * There is no clock and no observer in here: it is a function of the scroll
531
+ * position, and the component that owns the element is what tells it where
532
+ * that is. That is also what makes it testable without a layout.
533
+ */
534
+ function useVirtualWindow({ count, rowHeight, threshold }) {
535
+ /** How far down the list is scrolled. Set by the owner from a scroll event. */
536
+ const scrollTop = ref(0);
537
+ /** How tall the viewport is. Measured by the owner, never guessed here. */
538
+ const viewportHeight = ref(0);
539
+ const active = computed(() => count.value > threshold.value);
540
+ const window_ = computed(() => {
541
+ if (!active.value) return {
542
+ start: 0,
543
+ end: count.value
544
+ };
545
+ const first = Math.max(0, Math.floor(scrollTop.value / rowHeight.value) - OVERSCAN_ROWS);
546
+ const rows = Math.ceil(viewportHeight.value / rowHeight.value) + 6;
547
+ return {
548
+ start: first,
549
+ end: Math.min(count.value, first + rows)
550
+ };
551
+ });
552
+ /** The empty space standing in for the rows above and below the window. */
553
+ const padTop = computed(() => active.value ? window_.value.start * rowHeight.value : 0);
554
+ const padBottom = computed(() => active.value ? (count.value - window_.value.end) * rowHeight.value : 0);
555
+ /** Takes the scroll position straight off the event the owner received. */
556
+ function onScroll(event) {
557
+ scrollTop.value = event.target.scrollTop;
558
+ }
559
+ return {
560
+ active,
561
+ window: window_,
562
+ padTop,
563
+ padBottom,
564
+ scrollTop,
565
+ viewportHeight,
566
+ onScroll
567
+ };
568
+ }
569
+ //#endregion
592
570
  //#region src/components/BaseCombobox.vue?vue&type=script&setup=true&lang.ts
593
- var _hoisted_1$43 = ["for"];
594
- var _hoisted_2$37 = [
571
+ var _hoisted_1$46 = ["for"];
572
+ var _hoisted_2$40 = [
595
573
  "aria-label",
596
574
  "disabled",
597
575
  "onClick"
598
576
  ];
599
- var _hoisted_3$25 = [
577
+ var _hoisted_3$27 = [
600
578
  "id",
601
579
  "placeholder",
602
580
  "disabled",
@@ -606,7 +584,7 @@ var _hoisted_3$25 = [
606
584
  "aria-describedby"
607
585
  ];
608
586
  var _hoisted_4$19 = ["disabled"];
609
- var _hoisted_5$12 = [
587
+ var _hoisted_5$11 = [
610
588
  "aria-label",
611
589
  "aria-multiselectable",
612
590
  "aria-busy"
@@ -720,32 +698,18 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
720
698
  if (timer) clearTimeout(timer);
721
699
  timer = setTimeout(() => emit("search", value.trim()), __props.debounce);
722
700
  }
723
- const virtual = computed(() => matches.value.length > __props.virtualizeAfter);
724
- const scrollTop = ref(0);
725
- /** How tall the list box is; read once it is open, never guessed. */
726
- const viewport = ref(224);
727
- const window_ = computed(() => {
728
- if (!virtual.value) return {
729
- start: 0,
730
- end: matches.value.length
731
- };
732
- const first = Math.max(0, Math.floor(scrollTop.value / __props.rowHeight) - 3);
733
- const count = Math.ceil(viewport.value / __props.rowHeight) + 6;
734
- return {
735
- start: first,
736
- end: Math.min(matches.value.length, first + count)
737
- };
701
+ const { active: virtual, window: window_, padTop, padBottom, viewportHeight: viewport, onScroll } = useVirtualWindow({
702
+ count: computed(() => matches.value.length),
703
+ rowHeight: computed(() => __props.rowHeight),
704
+ threshold: computed(() => __props.virtualizeAfter)
738
705
  });
706
+ /** How tall the list box is; read once it is open, and this until then. */
707
+ viewport.value = 224;
739
708
  const rows = computed(() => matches.value.slice(window_.value.start, window_.value.end).map((option, index) => ({
740
709
  option,
741
710
  /** The row's place in the whole list, not in the window. */
742
711
  index: window_.value.start + index
743
712
  })));
744
- const padTop = computed(() => virtual.value ? window_.value.start * __props.rowHeight : 0);
745
- const padBottom = computed(() => virtual.value ? (matches.value.length - window_.value.end) * __props.rowHeight : 0);
746
- function onScroll(event) {
747
- scrollTop.value = event.target.scrollTop;
748
- }
749
713
  function choose(option) {
750
714
  if (!option) return;
751
715
  if (multiple.value) {
@@ -841,7 +805,7 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
841
805
  createElementVNode("label", {
842
806
  for: unref(id),
843
807
  class: "rk-combo-label"
844
- }, toDisplayString(__props.label), 9, _hoisted_1$43),
808
+ }, toDisplayString(__props.label), 9, _hoisted_1$46),
845
809
  createElementVNode("div", { class: normalizeClass(["rk-combo-field", multiple.value ? "is-multiple control" : ""]) }, [
846
810
  (openBlock(true), createElementBlock(Fragment, null, renderList(multiple.value ? chosenOptions.value : [], (option) => {
847
811
  return openBlock(), createElementBlock("span", {
@@ -854,7 +818,7 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
854
818
  "aria-label": __props.removeLabel(option.label),
855
819
  disabled: __props.disabled,
856
820
  onClick: ($event) => remove(option.value)
857
- }, " × ", 8, _hoisted_2$37)) : createCommentVNode("", true)]);
821
+ }, " × ", 8, _hoisted_2$40)) : createCommentVNode("", true)]);
858
822
  }), 128)),
859
823
  withDirectives(createElementVNode("input", {
860
824
  id: unref(id),
@@ -873,7 +837,7 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
873
837
  "aria-describedby": describedBy.value,
874
838
  onKeydown,
875
839
  onFocus: _cache[1] || (_cache[1] = ($event) => open.value = true)
876
- }, null, 42, _hoisted_3$25), [[vModelText, text.value]]),
840
+ }, null, 42, _hoisted_3$27), [[vModelText, text.value]]),
877
841
  createElementVNode("button", {
878
842
  type: "button",
879
843
  class: "rk-combo-toggle",
@@ -892,11 +856,11 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
892
856
  "aria-label": __props.label,
893
857
  "aria-multiselectable": multiple.value ? true : void 0,
894
858
  "aria-busy": __props.loading ? true : void 0,
895
- onScroll
859
+ onScroll: _cache[3] || (_cache[3] = (...args) => unref(onScroll) && unref(onScroll)(...args))
896
860
  }, [
897
- padTop.value > 0 ? (openBlock(), createElementBlock("li", {
861
+ unref(padTop) > 0 ? (openBlock(), createElementBlock("li", {
898
862
  key: 0,
899
- style: normalizeStyle({ height: `${padTop.value}px` }),
863
+ style: normalizeStyle({ height: `${unref(padTop)}px` }),
900
864
  "aria-hidden": "true"
901
865
  }, null, 4)) : createCommentVNode("", true),
902
866
  (openBlock(true), createElementBlock(Fragment, null, renderList(rows.value, (row) => {
@@ -908,7 +872,7 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
908
872
  "is-highlighted": row.index === highlighted.value,
909
873
  "is-selected": chosen.value.includes(row.option.value)
910
874
  }]),
911
- style: normalizeStyle(virtual.value ? { height: `${__props.rowHeight}px` } : void 0),
875
+ style: normalizeStyle(unref(virtual) ? { height: `${__props.rowHeight}px` } : void 0),
912
876
  "aria-selected": chosen.value.includes(row.option.value),
913
877
  "aria-setsize": matches.value.length,
914
878
  "aria-posinset": row.index + 1,
@@ -916,9 +880,9 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
916
880
  onPointermove: ($event) => highlighted.value = row.index
917
881
  }, toDisplayString(row.option.label), 47, _hoisted_6$7);
918
882
  }), 128)),
919
- padBottom.value > 0 ? (openBlock(), createElementBlock("li", {
883
+ unref(padBottom) > 0 ? (openBlock(), createElementBlock("li", {
920
884
  key: 1,
921
- style: normalizeStyle({ height: `${padBottom.value}px` }),
885
+ style: normalizeStyle({ height: `${unref(padBottom)}px` }),
922
886
  "aria-hidden": "true"
923
887
  }, null, 4)) : createCommentVNode("", true),
924
888
  __props.loading ? (openBlock(), createElementBlock("li", _hoisted_7$4, [__props.loadingLabel ? (openBlock(), createElementBlock("span", _hoisted_8$3, toDisplayString(__props.loadingLabel), 1)) : createCommentVNode("", true), createElementVNode("span", _hoisted_9$3, [(openBlock(), createElementBlock(Fragment, null, renderList(3, (n) => {
@@ -928,7 +892,7 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
928
892
  height: "0.75rem"
929
893
  });
930
894
  }), 64))])])) : matches.value.length === 0 ? (openBlock(), createElementBlock("li", _hoisted_10$3, toDisplayString(__props.emptyLabel), 1)) : createCommentVNode("", true)
931
- ], 40, _hoisted_5$12), [[vShow, open.value]]),
895
+ ], 40, _hoisted_5$11), [[vShow, open.value]]),
932
896
  __props.error ? (openBlock(), createElementBlock("p", {
933
897
  key: 0,
934
898
  id: errorId,
@@ -941,16 +905,16 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
941
905
  ], 512);
942
906
  };
943
907
  }
944
- }), [["__scopeId", "data-v-aa2335fa"]]);
908
+ }), [["__scopeId", "data-v-0ae3b425"]]);
945
909
  //#endregion
946
910
  //#region src/components/BaseRadioGroup.vue?vue&type=script&setup=true&lang.ts
947
- var _hoisted_1$42 = ["aria-describedby"];
948
- var _hoisted_2$36 = [
911
+ var _hoisted_1$45 = ["aria-describedby"];
912
+ var _hoisted_2$39 = [
949
913
  "name",
950
914
  "value",
951
915
  "disabled"
952
916
  ];
953
- var _hoisted_3$24 = { class: "text-ink text-sm" };
917
+ var _hoisted_3$26 = { class: "text-ink text-sm" };
954
918
  //#endregion
955
919
  //#region src/components/BaseRadioGroup.vue
956
920
  var BaseRadioGroup_default = /* @__PURE__ */ defineComponent({
@@ -994,7 +958,7 @@ var BaseRadioGroup_default = /* @__PURE__ */ defineComponent({
994
958
  value: option.value,
995
959
  disabled: option.disabled,
996
960
  class: "accent-primary focus-visible:outline-primary size-4 shrink-0 focus-visible:outline-2 focus-visible:outline-offset-2"
997
- }, null, 8, _hoisted_2$36), [[vModelRadio, unref(model)]]), createElementVNode("span", _hoisted_3$24, toDisplayString(option.label), 1)], 2);
961
+ }, null, 8, _hoisted_2$39), [[vModelRadio, unref(model)]]), createElementVNode("span", _hoisted_3$26, toDisplayString(option.label), 1)], 2);
998
962
  }), 128)),
999
963
  __props.error ? (openBlock(), createElementBlock("p", {
1000
964
  key: 0,
@@ -1005,19 +969,19 @@ var BaseRadioGroup_default = /* @__PURE__ */ defineComponent({
1005
969
  id: hintId,
1006
970
  class: "text-ink-soft text-xs"
1007
971
  }, toDisplayString(__props.hint), 1)) : createCommentVNode("", true)
1008
- ], 8, _hoisted_1$42);
972
+ ], 8, _hoisted_1$45);
1009
973
  };
1010
974
  }
1011
975
  });
1012
976
  //#endregion
1013
977
  //#region src/components/BaseSelect.vue?vue&type=script&setup=true&lang.ts
1014
- var _hoisted_1$41 = { class: "relative" };
1015
- var _hoisted_2$35 = [
978
+ var _hoisted_1$44 = { class: "relative" };
979
+ var _hoisted_2$38 = [
1016
980
  "id",
1017
981
  "aria-invalid",
1018
982
  "aria-describedby"
1019
983
  ];
1020
- var _hoisted_3$23 = {
984
+ var _hoisted_3$25 = {
1021
985
  key: 0,
1022
986
  value: void 0,
1023
987
  disabled: ""
@@ -1058,7 +1022,7 @@ var BaseSelect_default = /* @__PURE__ */ defineComponent({
1058
1022
  "label-hidden": __props.labelHidden,
1059
1023
  size: __props.size
1060
1024
  }, {
1061
- default: withCtx(({ id, describedBy, invalid }) => [createElementVNode("div", _hoisted_1$41, [withDirectives(createElementVNode("select", {
1025
+ default: withCtx(({ id, describedBy, invalid }) => [createElementVNode("div", _hoisted_1$44, [withDirectives(createElementVNode("select", {
1062
1026
  id,
1063
1027
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => model.value = $event),
1064
1028
  "aria-invalid": invalid,
@@ -1068,13 +1032,13 @@ var BaseSelect_default = /* @__PURE__ */ defineComponent({
1068
1032
  __props.variant === "unstyled" ? "" : SIZE_CLASS[__props.size],
1069
1033
  __props.variant !== "unstyled" && invalid ? "border-negative" : ""
1070
1034
  ]])
1071
- }, [__props.placeholder ? (openBlock(), createElementBlock("option", _hoisted_3$23, toDisplayString(__props.placeholder), 1)) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.options, (option) => {
1035
+ }, [__props.placeholder ? (openBlock(), createElementBlock("option", _hoisted_3$25, toDisplayString(__props.placeholder), 1)) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.options, (option) => {
1072
1036
  return openBlock(), createElementBlock("option", {
1073
1037
  key: option.value,
1074
1038
  value: option.value,
1075
1039
  disabled: option.disabled
1076
1040
  }, toDisplayString(option.label), 9, _hoisted_4$18);
1077
- }), 128))], 10, _hoisted_2$35), [[vModelSelect, model.value]]), createVNode(unref(ChevronDown), {
1041
+ }), 128))], 10, _hoisted_2$38), [[vModelSelect, model.value]]), createVNode(unref(ChevronDown), {
1078
1042
  class: "text-ink-soft pointer-events-none absolute top-1/2 right-3 size-4 -translate-y-1/2",
1079
1043
  "aria-hidden": "true"
1080
1044
  })])]),
@@ -1091,11 +1055,11 @@ var BaseSelect_default = /* @__PURE__ */ defineComponent({
1091
1055
  });
1092
1056
  //#endregion
1093
1057
  //#region src/components/BaseSlider.vue?vue&type=script&setup=true&lang.ts
1094
- var _hoisted_1$40 = { class: "rk-slider" };
1095
- var _hoisted_2$34 = { class: "rk-slider-head" };
1096
- var _hoisted_3$22 = ["for"];
1058
+ var _hoisted_1$43 = { class: "rk-slider" };
1059
+ var _hoisted_2$37 = { class: "rk-slider-head" };
1060
+ var _hoisted_3$24 = ["for"];
1097
1061
  var _hoisted_4$17 = ["for"];
1098
- var _hoisted_5$11 = [
1062
+ var _hoisted_5$10 = [
1099
1063
  "id",
1100
1064
  "min",
1101
1065
  "max",
@@ -1139,11 +1103,11 @@ var BaseSlider_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
1139
1103
  return span <= 0 ? 0 : (model.value - __props.min) / span * 100;
1140
1104
  });
1141
1105
  return (_ctx, _cache) => {
1142
- return openBlock(), createElementBlock("div", _hoisted_1$40, [
1143
- createElementVNode("div", _hoisted_2$34, [createElementVNode("label", {
1106
+ return openBlock(), createElementBlock("div", _hoisted_1$43, [
1107
+ createElementVNode("div", _hoisted_2$37, [createElementVNode("label", {
1144
1108
  for: unref(id),
1145
1109
  class: "rk-slider-label"
1146
- }, toDisplayString(__props.label), 9, _hoisted_3$22), __props.showValue ? (openBlock(), createElementBlock("output", {
1110
+ }, toDisplayString(__props.label), 9, _hoisted_3$24), __props.showValue ? (openBlock(), createElementBlock("output", {
1147
1111
  key: 0,
1148
1112
  for: unref(id),
1149
1113
  class: "rk-slider-value"
@@ -1160,7 +1124,7 @@ var BaseSlider_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
1160
1124
  "aria-valuetext": text.value,
1161
1125
  "aria-describedby": __props.hint ? hintId : void 0,
1162
1126
  style: normalizeStyle({ "--rk-slider-filled": `${filled.value}%` })
1163
- }, null, 12, _hoisted_5$11), [[
1127
+ }, null, 12, _hoisted_5$10), [[
1164
1128
  vModelText,
1165
1129
  model.value,
1166
1130
  void 0,
@@ -1177,8 +1141,8 @@ var BaseSlider_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
1177
1141
  }), [["__scopeId", "data-v-7fa2769b"]]);
1178
1142
  //#endregion
1179
1143
  //#region src/components/NumberInput.vue?vue&type=script&setup=true&lang.ts
1180
- var _hoisted_1$39 = ["aria-label", "disabled"];
1181
- var _hoisted_2$33 = [
1144
+ var _hoisted_1$42 = ["aria-label", "disabled"];
1145
+ var _hoisted_2$36 = [
1182
1146
  "id",
1183
1147
  "value",
1184
1148
  "aria-valuenow",
@@ -1188,7 +1152,7 @@ var _hoisted_2$33 = [
1188
1152
  "aria-describedby",
1189
1153
  "disabled"
1190
1154
  ];
1191
- var _hoisted_3$21 = ["aria-label", "disabled"];
1155
+ var _hoisted_3$23 = ["aria-label", "disabled"];
1192
1156
  //#endregion
1193
1157
  //#region src/components/NumberInput.vue
1194
1158
  var NumberInput_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
@@ -1291,7 +1255,7 @@ var NumberInput_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
1291
1255
  }, [createVNode(unref(Minus), {
1292
1256
  class: "size-4",
1293
1257
  "aria-hidden": "true"
1294
- })], 8, _hoisted_1$39),
1258
+ })], 8, _hoisted_1$42),
1295
1259
  createElementVNode("input", {
1296
1260
  id,
1297
1261
  value: draft.value,
@@ -1309,7 +1273,7 @@ var NumberInput_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
1309
1273
  onInput,
1310
1274
  onBlur: commit,
1311
1275
  onKeydown
1312
- }, null, 40, _hoisted_2$33),
1276
+ }, null, 40, _hoisted_2$36),
1313
1277
  createElementVNode("button", {
1314
1278
  type: "button",
1315
1279
  class: "rk-number-step focus-ring",
@@ -1320,7 +1284,7 @@ var NumberInput_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
1320
1284
  }, [createVNode(unref(Plus), {
1321
1285
  class: "size-4",
1322
1286
  "aria-hidden": "true"
1323
- })], 8, _hoisted_3$21)
1287
+ })], 8, _hoisted_3$23)
1324
1288
  ], 2)]),
1325
1289
  _: 1
1326
1290
  }, 8, [
@@ -1335,7 +1299,7 @@ var NumberInput_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
1335
1299
  }), [["__scopeId", "data-v-082bd3d7"]]);
1336
1300
  //#endregion
1337
1301
  //#region src/components/SliderField.vue?vue&type=script&setup=true&lang.ts
1338
- var _hoisted_1$38 = { class: "rk-slider-field" };
1302
+ var _hoisted_1$41 = { class: "rk-slider-field" };
1339
1303
  //#endregion
1340
1304
  //#region src/components/SliderField.vue
1341
1305
  var SliderField_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
@@ -1376,7 +1340,7 @@ var SliderField_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
1376
1340
  }
1377
1341
  });
1378
1342
  return (_ctx, _cache) => {
1379
- return openBlock(), createElementBlock("div", _hoisted_1$38, [createVNode(BaseSlider_default, {
1343
+ return openBlock(), createElementBlock("div", _hoisted_1$41, [createVNode(BaseSlider_default, {
1380
1344
  modelValue: model.value,
1381
1345
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => model.value = $event),
1382
1346
  label: __props.label,
@@ -1424,11 +1388,11 @@ var SliderField_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
1424
1388
  }), [["__scopeId", "data-v-6ec3163a"]]);
1425
1389
  //#endregion
1426
1390
  //#region src/components/BaseSpinner.vue?vue&type=script&setup=true&lang.ts
1427
- var _hoisted_1$37 = {
1391
+ var _hoisted_1$40 = {
1428
1392
  class: "rk-spin-wrap",
1429
1393
  role: "status"
1430
1394
  };
1431
- var _hoisted_2$32 = { class: "rk-spin-label" };
1395
+ var _hoisted_2$35 = { class: "rk-spin-label" };
1432
1396
  //#endregion
1433
1397
  //#region src/components/BaseSpinner.vue
1434
1398
  var BaseSpinner_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
@@ -1456,25 +1420,25 @@ var BaseSpinner_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
1456
1420
  lg: "2.5rem"
1457
1421
  };
1458
1422
  return (_ctx, _cache) => {
1459
- return openBlock(), createElementBlock("span", _hoisted_1$37, [createElementVNode("span", {
1423
+ return openBlock(), createElementBlock("span", _hoisted_1$40, [createElementVNode("span", {
1460
1424
  class: "rk-spin",
1461
1425
  style: normalizeStyle({
1462
1426
  width: SIZES[__props.size],
1463
1427
  height: SIZES[__props.size]
1464
1428
  }),
1465
1429
  "aria-hidden": "true"
1466
- }, null, 4), createElementVNode("span", _hoisted_2$32, toDisplayString(__props.label), 1)]);
1430
+ }, null, 4), createElementVNode("span", _hoisted_2$35, toDisplayString(__props.label), 1)]);
1467
1431
  };
1468
1432
  }
1469
1433
  }), [["__scopeId", "data-v-842da62c"]]);
1470
1434
  //#endregion
1471
1435
  //#region src/components/BaseSwitch.vue?vue&type=script&setup=true&lang.ts
1472
- var _hoisted_1$36 = { class: "flex items-center justify-between gap-4" };
1473
- var _hoisted_2$31 = {
1436
+ var _hoisted_1$39 = { class: "flex items-center justify-between gap-4" };
1437
+ var _hoisted_2$34 = {
1474
1438
  key: 0,
1475
1439
  class: "min-w-0"
1476
1440
  };
1477
- var _hoisted_3$20 = ["id"];
1441
+ var _hoisted_3$22 = ["id"];
1478
1442
  var _hoisted_4$16 = [
1479
1443
  "aria-checked",
1480
1444
  "aria-labelledby",
@@ -1514,10 +1478,10 @@ var BaseSwitch_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
1514
1478
  if (!__props.disabled) model.value = !model.value;
1515
1479
  }
1516
1480
  return (_ctx, _cache) => {
1517
- return openBlock(), createElementBlock("div", _hoisted_1$36, [!__props.labelHidden ? (openBlock(), createElementBlock("span", _hoisted_2$31, [createElementVNode("span", {
1481
+ return openBlock(), createElementBlock("div", _hoisted_1$39, [!__props.labelHidden ? (openBlock(), createElementBlock("span", _hoisted_2$34, [createElementVNode("span", {
1518
1482
  id: unref(id),
1519
1483
  class: "text-ink block text-sm"
1520
- }, toDisplayString(__props.label), 9, _hoisted_3$20), __props.hint ? (openBlock(), createElementBlock("span", {
1484
+ }, toDisplayString(__props.label), 9, _hoisted_3$22), __props.hint ? (openBlock(), createElementBlock("span", {
1521
1485
  key: 0,
1522
1486
  id: hintId,
1523
1487
  class: "text-ink-soft mt-0.5 block text-xs"
@@ -1537,14 +1501,13 @@ var BaseSwitch_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
1537
1501
  }, null, -1)])], 10, _hoisted_4$16)]);
1538
1502
  };
1539
1503
  }
1540
- }), [["__scopeId", "data-v-3f4400a0"]]);
1504
+ }), [["__scopeId", "data-v-d90e1aa6"]]);
1541
1505
  //#endregion
1542
1506
  //#region src/components/BaseTable.vue?vue&type=script&setup=true&lang.ts
1543
- var _hoisted_1$35 = ["aria-label"];
1544
- var _hoisted_2$30 = { class: "rk-table" };
1545
- var _hoisted_3$19 = { key: 0 };
1546
- var _hoisted_4$15 = { key: 1 };
1547
- var _hoisted_5$10 = ["colspan"];
1507
+ var _hoisted_1$38 = { class: "rk-table" };
1508
+ var _hoisted_2$33 = { key: 0 };
1509
+ var _hoisted_3$21 = { key: 1 };
1510
+ var _hoisted_4$15 = ["colspan"];
1548
1511
  //#endregion
1549
1512
  //#region src/components/BaseTable.vue
1550
1513
  var BaseTable_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
@@ -1562,41 +1525,43 @@ var BaseTable_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
1562
1525
  setup(__props) {
1563
1526
  const keyFor = (row, index) => __props.rowKey ? String(row[__props.rowKey]) : index;
1564
1527
  return (_ctx, _cache) => {
1565
- return openBlock(), createElementBlock("div", {
1566
- class: "rk-table-scroll",
1567
- tabindex: "0",
1568
- role: "region",
1569
- "aria-label": __props.caption
1570
- }, [createElementVNode("table", _hoisted_2$30, [
1571
- createElementVNode("caption", { class: normalizeClass(__props.captionHidden ? "rk-table-caption-hidden" : "rk-table-caption") }, toDisplayString(__props.caption), 3),
1572
- createElementVNode("thead", null, [createElementVNode("tr", null, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (column) => {
1573
- return openBlock(), createElementBlock("th", {
1574
- key: column.key,
1575
- scope: "col",
1576
- class: normalizeClass([column.align && `is-${column.align}`, column.nowrap && "is-nowrap"])
1577
- }, toDisplayString(column.label), 3);
1578
- }), 128))])]),
1579
- __props.rows.length > 0 ? (openBlock(), createElementBlock("tbody", _hoisted_3$19, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.rows, (row, index) => {
1580
- return openBlock(), createElementBlock("tr", { key: keyFor(row, index) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (column) => {
1581
- return openBlock(), createElementBlock("td", {
1528
+ return openBlock(), createBlock(ScrollArea_default, {
1529
+ axis: "x",
1530
+ label: __props.caption,
1531
+ class: "rk-table-scroll"
1532
+ }, {
1533
+ default: withCtx(() => [createElementVNode("table", _hoisted_1$38, [
1534
+ createElementVNode("caption", { class: normalizeClass(__props.captionHidden ? "rk-table-caption-hidden" : "rk-table-caption") }, toDisplayString(__props.caption), 3),
1535
+ createElementVNode("thead", null, [createElementVNode("tr", null, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (column) => {
1536
+ return openBlock(), createElementBlock("th", {
1582
1537
  key: column.key,
1538
+ scope: "col",
1583
1539
  class: normalizeClass([column.align && `is-${column.align}`, column.nowrap && "is-nowrap"])
1584
- }, [renderSlot(_ctx.$slots, column.key, {
1585
- row,
1586
- value: row[column.key]
1587
- }, () => [createTextVNode(toDisplayString(row[column.key]), 1)], true)], 2);
1588
- }), 128))]);
1589
- }), 128))])) : (openBlock(), createElementBlock("tbody", _hoisted_4$15, [createElementVNode("tr", null, [createElementVNode("td", {
1590
- colspan: __props.columns.length,
1591
- class: "rk-table-empty"
1592
- }, [renderSlot(_ctx.$slots, "empty", {}, void 0, true)], 8, _hoisted_5$10)])]))
1593
- ])], 8, _hoisted_1$35);
1540
+ }, toDisplayString(column.label), 3);
1541
+ }), 128))])]),
1542
+ __props.rows.length > 0 ? (openBlock(), createElementBlock("tbody", _hoisted_2$33, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.rows, (row, index) => {
1543
+ return openBlock(), createElementBlock("tr", { key: keyFor(row, index) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (column) => {
1544
+ return openBlock(), createElementBlock("td", {
1545
+ key: column.key,
1546
+ class: normalizeClass([column.align && `is-${column.align}`, column.nowrap && "is-nowrap"])
1547
+ }, [renderSlot(_ctx.$slots, column.key, {
1548
+ row,
1549
+ value: row[column.key]
1550
+ }, () => [createTextVNode(toDisplayString(row[column.key]), 1)], true)], 2);
1551
+ }), 128))]);
1552
+ }), 128))])) : (openBlock(), createElementBlock("tbody", _hoisted_3$21, [createElementVNode("tr", null, [createElementVNode("td", {
1553
+ colspan: __props.columns.length,
1554
+ class: "rk-table-empty"
1555
+ }, [renderSlot(_ctx.$slots, "empty", {}, void 0, true)], 8, _hoisted_4$15)])]))
1556
+ ])]),
1557
+ _: 3
1558
+ }, 8, ["label"]);
1594
1559
  };
1595
1560
  }
1596
- }), [["__scopeId", "data-v-ab10e9fa"]]);
1561
+ }), [["__scopeId", "data-v-cc1197ef"]]);
1597
1562
  //#endregion
1598
1563
  //#region src/components/BaseTextarea.vue?vue&type=script&setup=true&lang.ts
1599
- var _hoisted_1$34 = [
1564
+ var _hoisted_1$37 = [
1600
1565
  "id",
1601
1566
  "rows",
1602
1567
  "aria-invalid",
@@ -1642,7 +1607,7 @@ var BaseTextarea_default = /* @__PURE__ */ defineComponent({
1642
1607
  __props.variant === "unstyled" ? "" : "control text-ink rounded-card focus-visible:outline-primary resize-y px-3 py-2 leading-relaxed focus-visible:outline-2 focus-visible:outline-offset-1",
1643
1608
  "text-base",
1644
1609
  __props.variant !== "unstyled" && invalid ? "border-negative" : ""
1645
- ] }), null, 16, _hoisted_1$34), [[vModelText, unref(model)]])]),
1610
+ ] }), null, 16, _hoisted_1$37), [[vModelText, unref(model)]])]),
1646
1611
  _: 1
1647
1612
  }, 8, [
1648
1613
  "label",
@@ -1656,12 +1621,12 @@ var BaseTextarea_default = /* @__PURE__ */ defineComponent({
1656
1621
  });
1657
1622
  //#endregion
1658
1623
  //#region src/components/EmptyState.vue?vue&type=script&setup=true&lang.ts
1659
- var _hoisted_1$33 = { class: "flex flex-col items-center gap-3 px-6 py-10 text-center" };
1660
- var _hoisted_2$29 = {
1624
+ var _hoisted_1$36 = { class: "flex flex-col items-center gap-3 px-6 py-10 text-center" };
1625
+ var _hoisted_2$32 = {
1661
1626
  key: 0,
1662
1627
  class: "bg-muted text-primary rounded-card flex size-12 items-center justify-center"
1663
1628
  };
1664
- var _hoisted_3$18 = { class: "text-ink text-base font-semibold" };
1629
+ var _hoisted_3$20 = { class: "text-ink text-base font-semibold" };
1665
1630
  var _hoisted_4$14 = {
1666
1631
  key: 1,
1667
1632
  class: "text-ink-soft max-w-[36ch] text-sm"
@@ -1688,9 +1653,9 @@ var EmptyState_default = /* @__PURE__ */ defineComponent({
1688
1653
  * goes — the button that creates the first one.
1689
1654
  */
1690
1655
  return (_ctx, _cache) => {
1691
- return openBlock(), createElementBlock("div", _hoisted_1$33, [
1692
- _ctx.$slots.icon ? (openBlock(), createElementBlock("div", _hoisted_2$29, [renderSlot(_ctx.$slots, "icon")])) : createCommentVNode("", true),
1693
- createElementVNode("h3", _hoisted_3$18, toDisplayString(__props.title), 1),
1656
+ return openBlock(), createElementBlock("div", _hoisted_1$36, [
1657
+ _ctx.$slots.icon ? (openBlock(), createElementBlock("div", _hoisted_2$32, [renderSlot(_ctx.$slots, "icon")])) : createCommentVNode("", true),
1658
+ createElementVNode("h3", _hoisted_3$20, toDisplayString(__props.title), 1),
1694
1659
  __props.description ? (openBlock(), createElementBlock("p", _hoisted_4$14, toDisplayString(__props.description), 1)) : createCommentVNode("", true),
1695
1660
  _ctx.$slots.action ? (openBlock(), createElementBlock("div", _hoisted_5$9, [renderSlot(_ctx.$slots, "action")])) : createCommentVNode("", true)
1696
1661
  ]);
@@ -1759,9 +1724,9 @@ var PageContainer_default = /* @__PURE__ */ defineComponent({
1759
1724
  });
1760
1725
  //#endregion
1761
1726
  //#region src/components/PageHeader.vue?vue&type=script&setup=true&lang.ts
1762
- var _hoisted_1$32 = { class: "grid h-12 shrink-0 grid-cols-[2.5rem_1fr_2.5rem] items-center" };
1763
- var _hoisted_2$28 = { class: "justify-self-start" };
1764
- var _hoisted_3$17 = { class: "text-ink flex min-w-0 justify-center text-base font-semibold tabular-nums" };
1727
+ var _hoisted_1$35 = { class: "grid h-12 shrink-0 grid-cols-[2.5rem_1fr_2.5rem] items-center" };
1728
+ var _hoisted_2$31 = { class: "justify-self-start" };
1729
+ var _hoisted_3$19 = { class: "text-ink flex min-w-0 justify-center text-base font-semibold tabular-nums" };
1765
1730
  var _hoisted_4$13 = { class: "truncate" };
1766
1731
  var _hoisted_5$8 = { class: "justify-self-end" };
1767
1732
  //#endregion
@@ -1780,9 +1745,9 @@ var PageHeader_default = /* @__PURE__ */ defineComponent({
1780
1745
  * each other.
1781
1746
  */
1782
1747
  return (_ctx, _cache) => {
1783
- return openBlock(), createElementBlock("header", _hoisted_1$32, [
1784
- createElementVNode("div", _hoisted_2$28, [renderSlot(_ctx.$slots, "left")]),
1785
- createElementVNode("h1", _hoisted_3$17, [renderSlot(_ctx.$slots, "title", {}, () => [createElementVNode("span", _hoisted_4$13, toDisplayString(__props.title), 1)])]),
1748
+ return openBlock(), createElementBlock("header", _hoisted_1$35, [
1749
+ createElementVNode("div", _hoisted_2$31, [renderSlot(_ctx.$slots, "left")]),
1750
+ createElementVNode("h1", _hoisted_3$19, [renderSlot(_ctx.$slots, "title", {}, () => [createElementVNode("span", _hoisted_4$13, toDisplayString(__props.title), 1)])]),
1786
1751
  createElementVNode("div", _hoisted_5$8, [renderSlot(_ctx.$slots, "right")])
1787
1752
  ]);
1788
1753
  };
@@ -1790,7 +1755,7 @@ var PageHeader_default = /* @__PURE__ */ defineComponent({
1790
1755
  });
1791
1756
  //#endregion
1792
1757
  //#region src/components/ProgressBar.vue?vue&type=script&setup=true&lang.ts
1793
- var _hoisted_1$31 = ["aria-valuenow", "aria-label"];
1758
+ var _hoisted_1$34 = ["aria-valuenow", "aria-label"];
1794
1759
  //#endregion
1795
1760
  //#region src/components/ProgressBar.vue
1796
1761
  var ProgressBar_default = /* @__PURE__ */ defineComponent({
@@ -1822,18 +1787,18 @@ var ProgressBar_default = /* @__PURE__ */ defineComponent({
1822
1787
  }, [createElementVNode("div", {
1823
1788
  class: "bg-primary h-full rounded-full transition-[width] duration-700 ease-out",
1824
1789
  style: normalizeStyle({ width: `${portion.value}%` })
1825
- }, null, 4)], 10, _hoisted_1$31);
1790
+ }, null, 4)], 10, _hoisted_1$34);
1826
1791
  };
1827
1792
  }
1828
1793
  });
1829
1794
  //#endregion
1830
1795
  //#region src/components/PriceCard.vue?vue&type=script&setup=true&lang.ts
1831
- var _hoisted_1$30 = {
1796
+ var _hoisted_1$33 = {
1832
1797
  key: 0,
1833
1798
  class: "bg-primary rounded-cell text-on-primary absolute -top-3 left-7 px-3 py-1 text-[0.7rem] font-semibold"
1834
1799
  };
1835
- var _hoisted_2$27 = { class: "flex items-start justify-between gap-4" };
1836
- var _hoisted_3$16 = { class: "text-ink mt-5 text-lg font-semibold" };
1800
+ var _hoisted_2$30 = { class: "flex items-start justify-between gap-4" };
1801
+ var _hoisted_3$18 = { class: "text-ink mt-5 text-lg font-semibold" };
1837
1802
  var _hoisted_4$12 = {
1838
1803
  key: 1,
1839
1804
  class: "text-ink-soft mt-1.5 text-sm leading-relaxed"
@@ -1903,15 +1868,15 @@ var PriceCard_default = /* @__PURE__ */ defineComponent({
1903
1868
  const palette = computed(() => TONE[__props.tone]);
1904
1869
  return (_ctx, _cache) => {
1905
1870
  return openBlock(), createElementBlock("article", { class: normalizeClass(["surface rounded-card ease-standard relative flex h-full flex-col p-7 transition-[border-color,box-shadow,transform] duration-(--duration-slower) hover:[--surface-border-color:color-mix(in_oklab,var(--color-primary)_60%,transparent)] hover:[--surface-shadow:var(--shadow-raised)] sm:p-8", [palette.value.ring, __props.recommended ? "[--surface-shadow:var(--shadow-raised)]" : "hover:-translate-y-0.5"]]) }, [
1906
- __props.badge && __props.recommended ? (openBlock(), createElementBlock("span", _hoisted_1$30, toDisplayString(__props.badge), 1)) : createCommentVNode("", true),
1907
- createElementVNode("div", _hoisted_2$27, [_ctx.$slots.icon ? (openBlock(), createElementBlock("span", {
1871
+ __props.badge && __props.recommended ? (openBlock(), createElementBlock("span", _hoisted_1$33, toDisplayString(__props.badge), 1)) : createCommentVNode("", true),
1872
+ createElementVNode("div", _hoisted_2$30, [_ctx.$slots.icon ? (openBlock(), createElementBlock("span", {
1908
1873
  key: 0,
1909
1874
  class: normalizeClass(["rounded-card grid size-11 place-items-center text-xl", palette.value.icon])
1910
1875
  }, [renderSlot(_ctx.$slots, "icon")], 2)) : createCommentVNode("", true), __props.chip ? (openBlock(), createElementBlock("span", {
1911
1876
  key: 1,
1912
1877
  class: normalizeClass(["rounded-cell ml-auto px-2.5 py-1 text-[0.7rem] font-medium", palette.value.soft])
1913
1878
  }, toDisplayString(__props.chip), 3)) : createCommentVNode("", true)]),
1914
- createElementVNode("h3", _hoisted_3$16, toDisplayString(__props.name), 1),
1879
+ createElementVNode("h3", _hoisted_3$18, toDisplayString(__props.name), 1),
1915
1880
  __props.lead ? (openBlock(), createElementBlock("p", _hoisted_4$12, toDisplayString(__props.lead), 1)) : createCommentVNode("", true),
1916
1881
  createElementVNode("p", _hoisted_5$7, [createElementVNode("span", _hoisted_6$6, toDisplayString(__props.price), 1), __props.period ? (openBlock(), createElementBlock("span", _hoisted_7$3, toDisplayString(__props.period), 1)) : createCommentVNode("", true)]),
1917
1882
  __props.note ? (openBlock(), createElementBlock("p", _hoisted_8$2, toDisplayString(__props.note), 1)) : createCommentVNode("", true),
@@ -1928,8 +1893,8 @@ var PriceCard_default = /* @__PURE__ */ defineComponent({
1928
1893
  });
1929
1894
  //#endregion
1930
1895
  //#region src/components/ToneDot.vue?vue&type=script&setup=true&lang.ts
1931
- var _hoisted_1$29 = { class: "inline-flex items-center gap-1.5" };
1932
- var _hoisted_2$26 = {
1896
+ var _hoisted_1$32 = { class: "inline-flex items-center gap-1.5" };
1897
+ var _hoisted_2$29 = {
1933
1898
  key: 0,
1934
1899
  class: "text-ink-soft text-xs font-medium"
1935
1900
  };
@@ -1950,13 +1915,13 @@ var ToneDot_default = /* @__PURE__ */ defineComponent({
1950
1915
  * priorities — without this component knowing about any of them.
1951
1916
  */
1952
1917
  return (_ctx, _cache) => {
1953
- return openBlock(), createElementBlock("span", _hoisted_1$29, [createElementVNode("span", { class: normalizeClass(["size-2 rounded-full", __props.fill]) }, null, 2), __props.label ? (openBlock(), createElementBlock("span", _hoisted_2$26, toDisplayString(__props.label), 1)) : createCommentVNode("", true)]);
1918
+ return openBlock(), createElementBlock("span", _hoisted_1$32, [createElementVNode("span", { class: normalizeClass(["size-2 rounded-full", __props.fill]) }, null, 2), __props.label ? (openBlock(), createElementBlock("span", _hoisted_2$29, toDisplayString(__props.label), 1)) : createCommentVNode("", true)]);
1954
1919
  };
1955
1920
  }
1956
1921
  });
1957
1922
  //#endregion
1958
1923
  //#region src/components/SectionHeading.vue?vue&type=script&setup=true&lang.ts
1959
- var _hoisted_1$28 = {
1924
+ var _hoisted_1$31 = {
1960
1925
  key: 0,
1961
1926
  class: "text-ink-soft text-xs tabular-nums"
1962
1927
  };
@@ -1974,15 +1939,15 @@ var SectionHeading_default = /* @__PURE__ */ defineComponent({
1974
1939
  return openBlock(), createElementBlock("h2", { class: normalizeClass(["flex w-fit items-center gap-2 self-start rounded-full border px-3 py-1", __props.tone.card]) }, [
1975
1940
  createVNode(ToneDot_default, { fill: __props.tone.fill }, null, 8, ["fill"]),
1976
1941
  createElementVNode("span", { class: normalizeClass(["text-xs font-semibold tracking-wide uppercase", __props.tone.text]) }, toDisplayString(__props.label), 3),
1977
- __props.count > 0 ? (openBlock(), createElementBlock("span", _hoisted_1$28, toDisplayString(__props.count), 1)) : createCommentVNode("", true)
1942
+ __props.count > 0 ? (openBlock(), createElementBlock("span", _hoisted_1$31, toDisplayString(__props.count), 1)) : createCommentVNode("", true)
1978
1943
  ], 2);
1979
1944
  };
1980
1945
  }
1981
1946
  });
1982
1947
  //#endregion
1983
1948
  //#region src/components/SegmentedControl.vue?vue&type=script&setup=true&lang.ts
1984
- var _hoisted_1$27 = { class: "bg-muted rounded-card flex w-full gap-1 p-1" };
1985
- var _hoisted_2$25 = ["value", "name"];
1949
+ var _hoisted_1$30 = { class: "bg-muted rounded-card flex w-full gap-1 p-1" };
1950
+ var _hoisted_2$28 = ["value", "name"];
1986
1951
  //#endregion
1987
1952
  //#region src/components/SegmentedControl.vue
1988
1953
  var SegmentedControl_default = /* @__PURE__ */ defineComponent({
@@ -1996,7 +1961,7 @@ var SegmentedControl_default = /* @__PURE__ */ defineComponent({
1996
1961
  const model = useModel(__props, "modelValue");
1997
1962
  const name = useId();
1998
1963
  return (_ctx, _cache) => {
1999
- return openBlock(), createElementBlock("div", _hoisted_1$27, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.options, (option) => {
1964
+ return openBlock(), createElementBlock("div", _hoisted_1$30, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.options, (option) => {
2000
1965
  return openBlock(), createElementBlock("label", {
2001
1966
  key: String(option.value),
2002
1967
  class: "flex-1 cursor-pointer"
@@ -2006,18 +1971,18 @@ var SegmentedControl_default = /* @__PURE__ */ defineComponent({
2006
1971
  value: option.value,
2007
1972
  name: unref(name),
2008
1973
  class: "peer sr-only"
2009
- }, null, 8, _hoisted_2$25), [[vModelRadio, model.value]]), createElementVNode("span", { class: normalizeClass(["peer-focus-visible:outline-primary flex h-10 items-center justify-center rounded-xl px-2 text-sm font-medium transition-colors select-none peer-focus-visible:outline-2 peer-focus-visible:outline-offset-2", model.value === option.value ? "bg-surface text-ink shadow-(--shadow-control)" : "text-ink-soft"]) }, toDisplayString(option.label), 3)]);
1974
+ }, null, 8, _hoisted_2$28), [[vModelRadio, model.value]]), createElementVNode("span", { class: normalizeClass(["peer-focus-visible:outline-primary flex h-10 items-center justify-center rounded-xl px-2 text-sm font-medium transition-colors select-none peer-focus-visible:outline-2 peer-focus-visible:outline-offset-2", model.value === option.value ? "bg-surface text-ink shadow-(--shadow-control)" : "text-ink-soft"]) }, toDisplayString(option.label), 3)]);
2010
1975
  }), 128))]);
2011
1976
  };
2012
1977
  }
2013
1978
  });
2014
1979
  //#endregion
2015
1980
  //#region src/components/SkeletonList.vue?vue&type=script&setup=true&lang.ts
2016
- var _hoisted_1$26 = {
1981
+ var _hoisted_1$29 = {
2017
1982
  role: "status",
2018
1983
  class: "flex flex-col gap-1"
2019
1984
  };
2020
- var _hoisted_2$24 = { class: "sr-only" };
1985
+ var _hoisted_2$27 = { class: "sr-only" };
2021
1986
  //#endregion
2022
1987
  //#region src/components/SkeletonList.vue
2023
1988
  var SkeletonList_default = /* @__PURE__ */ defineComponent({
@@ -2031,7 +1996,7 @@ var SkeletonList_default = /* @__PURE__ */ defineComponent({
2031
1996
  /** A length starts with a digit, a dot, or opens a CSS function. */
2032
1997
  const isLength = computed(() => /^(?:[.\d]|calc\(|var\(|clamp\(|min\(|max\()/.test(__props.rowHeight));
2033
1998
  return (_ctx, _cache) => {
2034
- return openBlock(), createElementBlock("div", _hoisted_1$26, [createElementVNode("span", _hoisted_2$24, toDisplayString(__props.label), 1), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.rows, (row) => {
1999
+ return openBlock(), createElementBlock("div", _hoisted_1$29, [createElementVNode("span", _hoisted_2$27, toDisplayString(__props.label), 1), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.rows, (row) => {
2035
2000
  return openBlock(), createElementBlock("div", {
2036
2001
  key: row,
2037
2002
  class: normalizeClass(["bg-muted rounded-card animate-pulse", isLength.value ? void 0 : __props.rowHeight]),
@@ -2044,9 +2009,9 @@ var SkeletonList_default = /* @__PURE__ */ defineComponent({
2044
2009
  });
2045
2010
  //#endregion
2046
2011
  //#region src/components/StatCard.vue?vue&type=script&setup=true&lang.ts
2047
- var _hoisted_1$25 = { class: "surface rounded-card flex flex-1 flex-col gap-0.5 p-3" };
2048
- var _hoisted_2$23 = { class: "flex items-baseline gap-1" };
2049
- var _hoisted_3$15 = { class: "text-ink text-xl font-semibold tabular-nums" };
2012
+ var _hoisted_1$28 = { class: "surface rounded-card flex flex-1 flex-col gap-0.5 p-3" };
2013
+ var _hoisted_2$26 = { class: "flex items-baseline gap-1" };
2014
+ var _hoisted_3$17 = { class: "text-ink text-xl font-semibold tabular-nums" };
2050
2015
  var _hoisted_4$11 = { class: "text-ink-soft text-xs" };
2051
2016
  //#endregion
2052
2017
  //#region src/components/StatCard.vue
@@ -2064,7 +2029,7 @@ var StatCard_default = /* @__PURE__ */ defineComponent({
2064
2029
  flat: ArrowRight
2065
2030
  };
2066
2031
  return (_ctx, _cache) => {
2067
- return openBlock(), createElementBlock("div", _hoisted_1$25, [createElementVNode("div", _hoisted_2$23, [createElementVNode("span", _hoisted_3$15, toDisplayString(__props.value), 1), __props.trend ? (openBlock(), createBlock(resolveDynamicComponent(TREND_ICON[__props.trend]), {
2032
+ return openBlock(), createElementBlock("div", _hoisted_1$28, [createElementVNode("div", _hoisted_2$26, [createElementVNode("span", _hoisted_3$17, toDisplayString(__props.value), 1), __props.trend ? (openBlock(), createBlock(resolveDynamicComponent(TREND_ICON[__props.trend]), {
2068
2033
  key: 0,
2069
2034
  class: "text-ink-soft size-3"
2070
2035
  })) : createCommentVNode("", true)]), createElementVNode("span", _hoisted_4$11, toDisplayString(__props.label), 1)]);
@@ -2073,13 +2038,13 @@ var StatCard_default = /* @__PURE__ */ defineComponent({
2073
2038
  });
2074
2039
  //#endregion
2075
2040
  //#region src/components/ToastHost.vue?vue&type=script&setup=true&lang.ts
2076
- var _hoisted_1$24 = [
2041
+ var _hoisted_1$27 = [
2077
2042
  "onMouseenter",
2078
2043
  "onMouseleave",
2079
2044
  "onFocusin",
2080
2045
  "onFocusout"
2081
2046
  ];
2082
- var _hoisted_2$22 = { class: "flex-1 text-sm leading-snug" };
2047
+ var _hoisted_2$25 = { class: "flex-1 text-sm leading-snug" };
2083
2048
  //#endregion
2084
2049
  //#region src/components/ToastHost.vue
2085
2050
  var ToastHost_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
@@ -2140,7 +2105,7 @@ var ToastHost_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
2140
2105
  class: normalizeClass(["mt-0.5 size-5 shrink-0", TONE_CLASS[toast.tone]]),
2141
2106
  "aria-hidden": "true"
2142
2107
  }, null, 8, ["class"])),
2143
- createElementVNode("p", _hoisted_2$22, toDisplayString(toast.message), 1),
2108
+ createElementVNode("p", _hoisted_2$25, toDisplayString(toast.message), 1),
2144
2109
  toast.action ? (openBlock(), createBlock(BaseButton_default, {
2145
2110
  key: 0,
2146
2111
  variant: "link",
@@ -2163,7 +2128,7 @@ var ToastHost_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
2163
2128
  default: withCtx(() => [createVNode(unref(X), { class: "size-4" })]),
2164
2129
  _: 1
2165
2130
  }, 8, ["aria-label", "onClick"])
2166
- ], 40, _hoisted_1$24);
2131
+ ], 40, _hoisted_1$27);
2167
2132
  }), 128))]),
2168
2133
  _: 1
2169
2134
  })], 2)])) : createCommentVNode("", true);
@@ -2172,8 +2137,8 @@ var ToastHost_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
2172
2137
  }), [["__scopeId", "data-v-737eb240"]]);
2173
2138
  //#endregion
2174
2139
  //#region src/components/LocaleLinks.vue?vue&type=script&setup=true&lang.ts
2175
- var _hoisted_1$23 = ["aria-label"];
2176
- var _hoisted_2$21 = [
2140
+ var _hoisted_1$26 = ["aria-label"];
2141
+ var _hoisted_2$24 = [
2177
2142
  "lang",
2178
2143
  "aria-pressed",
2179
2144
  "onClick"
@@ -2217,16 +2182,16 @@ var LocaleLinks_default = /* @__PURE__ */ defineComponent({
2217
2182
  class: normalizeClass(["focus-ring rounded-full px-2.5 py-1.5 text-xs transition-colors", preference.value === locale ? "bg-muted text-ink font-semibold" : "text-ink-soft hover:text-ink"]),
2218
2183
  "aria-pressed": preference.value === locale,
2219
2184
  onClick: ($event) => preference.value = locale
2220
- }, toDisplayString(__props.labels[locale]), 11, _hoisted_2$21);
2221
- }), 128))], 8, _hoisted_1$23);
2185
+ }, toDisplayString(__props.labels[locale]), 11, _hoisted_2$24);
2186
+ }), 128))], 8, _hoisted_1$26);
2222
2187
  };
2223
2188
  }
2224
2189
  });
2225
2190
  //#endregion
2226
2191
  //#region src/components/TabBar.vue?vue&type=script&setup=true&lang.ts
2227
- var _hoisted_1$22 = { class: "tab-bar" };
2228
- var _hoisted_2$20 = ["aria-label"];
2229
- var _hoisted_3$14 = { class: "tab-icon-slot" };
2192
+ var _hoisted_1$25 = { class: "tab-bar" };
2193
+ var _hoisted_2$23 = ["aria-label"];
2194
+ var _hoisted_3$16 = { class: "tab-icon-slot" };
2230
2195
  var _hoisted_4$10 = { class: "tab-label" };
2231
2196
  //#endregion
2232
2197
  //#region src/components/TabBar.vue
@@ -2239,7 +2204,7 @@ var TabBar_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
2239
2204
  },
2240
2205
  setup(__props) {
2241
2206
  return (_ctx, _cache) => {
2242
- return openBlock(), createElementBlock("header", _hoisted_1$22, [createElementVNode("nav", {
2207
+ return openBlock(), createElementBlock("header", _hoisted_1$25, [createElementVNode("nav", {
2243
2208
  class: "tab-bar-inner",
2244
2209
  "aria-label": __props.label || void 0
2245
2210
  }, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item) => {
@@ -2250,22 +2215,22 @@ var TabBar_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
2250
2215
  "aria-current": item.key === __props.active ? "page" : void 0,
2251
2216
  onClick: _cache[0] || (_cache[0] = ($event) => unref(tapFeedback)())
2252
2217
  }, {
2253
- default: withCtx(() => [createElementVNode("span", _hoisted_3$14, [(openBlock(), createBlock(resolveDynamicComponent(item.icon), { class: "tab-icon" }))]), createElementVNode("span", _hoisted_4$10, toDisplayString(item.label), 1)]),
2218
+ default: withCtx(() => [createElementVNode("span", _hoisted_3$16, [(openBlock(), createBlock(resolveDynamicComponent(item.icon), { class: "tab-icon" }))]), createElementVNode("span", _hoisted_4$10, toDisplayString(item.label), 1)]),
2254
2219
  _: 2
2255
2220
  }, 1032, [
2256
2221
  "to",
2257
2222
  "class",
2258
2223
  "aria-current"
2259
2224
  ]);
2260
- }), 128))], 8, _hoisted_2$20)]);
2225
+ }), 128))], 8, _hoisted_2$23)]);
2261
2226
  };
2262
2227
  }
2263
2228
  }), [["__scopeId", "data-v-a76891c4"]]);
2264
2229
  //#endregion
2265
2230
  //#region src/components/ActivityGrid.vue?vue&type=script&setup=true&lang.ts
2266
- var _hoisted_1$21 = ["aria-label"];
2267
- var _hoisted_2$19 = ["colspan"];
2268
- var _hoisted_3$13 = {
2231
+ var _hoisted_1$24 = ["aria-label"];
2232
+ var _hoisted_2$22 = ["colspan"];
2233
+ var _hoisted_3$15 = {
2269
2234
  scope: "row",
2270
2235
  class: "rk-activity-weekday"
2271
2236
  };
@@ -2428,9 +2393,9 @@ var ActivityGrid_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
2428
2393
  key: month.key,
2429
2394
  colspan: month.span,
2430
2395
  scope: "colgroup"
2431
- }, toDisplayString(month.label), 9, _hoisted_2$19);
2396
+ }, toDisplayString(month.label), 9, _hoisted_2$22);
2432
2397
  }), 128))])]), createElementVNode("tbody", null, [(openBlock(true), createElementBlock(Fragment, null, renderList(weekdays.value, (weekday, row) => {
2433
- return openBlock(), createElementBlock("tr", { key: weekday }, [createElementVNode("th", _hoisted_3$13, [createElementVNode("span", _hoisted_4$9, toDisplayString(weekday), 1)]), (openBlock(true), createElementBlock(Fragment, null, renderList(weeks.value, (week, column) => {
2398
+ return openBlock(), createElementBlock("tr", { key: weekday }, [createElementVNode("th", _hoisted_3$15, [createElementVNode("span", _hoisted_4$9, toDisplayString(weekday), 1)]), (openBlock(true), createElementBlock(Fragment, null, renderList(weeks.value, (week, column) => {
2434
2399
  return openBlock(), createElementBlock(Fragment, { key: column }, [week[row] ? (openBlock(), createElementBlock("td", mergeProps({
2435
2400
  key: 0,
2436
2401
  class: "rk-activity-cell"
@@ -2440,11 +2405,224 @@ var ActivityGrid_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
2440
2405
  class: [__props.levelFor(week[row]), { "is-pickable": __props.isSelectable?.(week[row]) }]
2441
2406
  }), null, 16, _hoisted_5$6)) : (openBlock(), createElementBlock("td", _hoisted_6$5))], 64);
2442
2407
  }), 128))]);
2443
- }), 128))])], 40, _hoisted_1$21)], 512);
2408
+ }), 128))])], 40, _hoisted_1$24)], 512);
2444
2409
  };
2445
2410
  }
2446
2411
  }), [["__scopeId", "data-v-9f622328"]]);
2447
2412
  //#endregion
2413
+ //#region src/components/VirtualList.vue?vue&type=script&setup=true&lang.ts
2414
+ var _hoisted_1$23 = ["aria-label"];
2415
+ var _hoisted_2$21 = ["aria-setsize", "aria-posinset"];
2416
+ //#endregion
2417
+ //#region src/components/VirtualList.vue
2418
+ var VirtualList_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
2419
+ __name: "VirtualList",
2420
+ props: {
2421
+ items: {},
2422
+ rowHeight: {},
2423
+ label: {},
2424
+ virtualizeAfter: { default: 50 },
2425
+ scrollbar: { default: "auto" }
2426
+ },
2427
+ setup(__props, { expose: __expose }) {
2428
+ const area = useTemplateRef("area");
2429
+ const { window: shown, padTop, padBottom, viewportHeight, onScroll } = useVirtualWindow({
2430
+ count: computed(() => __props.items.length),
2431
+ rowHeight: computed(() => __props.rowHeight),
2432
+ threshold: computed(() => __props.virtualizeAfter)
2433
+ });
2434
+ const rows = computed(() => __props.items.slice(shown.value.start, shown.value.end).map((item, offset) => ({
2435
+ item,
2436
+ /** The row's place in the whole list, which is what a reader is told. */
2437
+ index: shown.value.start + offset
2438
+ })));
2439
+ function measure() {
2440
+ const element = area.value?.viewport;
2441
+ if (element) viewportHeight.value = element.clientHeight;
2442
+ }
2443
+ onMounted(measure);
2444
+ watch(() => __props.items.length, measure);
2445
+ /** Scrolls a row into view by its index, for an app driving the list itself. */
2446
+ function scrollToIndex(index) {
2447
+ const element = area.value?.viewport;
2448
+ if (!element) return;
2449
+ const top = Math.max(0, Math.min(__props.items.length - 1, index)) * __props.rowHeight;
2450
+ if (top < element.scrollTop) element.scrollTop = top;
2451
+ else if (top + __props.rowHeight > element.scrollTop + element.clientHeight) element.scrollTop = top + __props.rowHeight - element.clientHeight;
2452
+ }
2453
+ __expose({ scrollToIndex });
2454
+ return (_ctx, _cache) => {
2455
+ return openBlock(), createBlock(ScrollArea_default, {
2456
+ ref_key: "area",
2457
+ ref: area,
2458
+ axis: "y",
2459
+ label: __props.label,
2460
+ scrollbar: __props.scrollbar,
2461
+ class: "rk-vlist",
2462
+ onScroll: unref(onScroll)
2463
+ }, {
2464
+ default: withCtx(() => [createElementVNode("ul", {
2465
+ class: "rk-vlist-rows",
2466
+ "aria-label": __props.label
2467
+ }, [
2468
+ unref(padTop) > 0 ? (openBlock(), createElementBlock("li", {
2469
+ key: 0,
2470
+ style: normalizeStyle({ height: `${unref(padTop)}px` }),
2471
+ "aria-hidden": "true"
2472
+ }, null, 4)) : createCommentVNode("", true),
2473
+ (openBlock(true), createElementBlock(Fragment, null, renderList(rows.value, (row) => {
2474
+ return openBlock(), createElementBlock("li", {
2475
+ key: row.index,
2476
+ class: "rk-vlist-row",
2477
+ style: normalizeStyle({ height: `${__props.rowHeight}px` }),
2478
+ "aria-setsize": __props.items.length,
2479
+ "aria-posinset": row.index + 1
2480
+ }, [renderSlot(_ctx.$slots, "default", {
2481
+ item: row.item,
2482
+ index: row.index
2483
+ }, void 0, true)], 12, _hoisted_2$21);
2484
+ }), 128)),
2485
+ unref(padBottom) > 0 ? (openBlock(), createElementBlock("li", {
2486
+ key: 1,
2487
+ style: normalizeStyle({ height: `${unref(padBottom)}px` }),
2488
+ "aria-hidden": "true"
2489
+ }, null, 4)) : createCommentVNode("", true)
2490
+ ], 8, _hoisted_1$23)]),
2491
+ _: 3
2492
+ }, 8, [
2493
+ "label",
2494
+ "scrollbar",
2495
+ "onScroll"
2496
+ ]);
2497
+ };
2498
+ }
2499
+ }), [["__scopeId", "data-v-936ed40c"]]);
2500
+ //#endregion
2501
+ //#region src/components/AnnounceHost.vue?vue&type=script&setup=true&lang.ts
2502
+ var _hoisted_1$22 = { class: "rk-announcer" };
2503
+ var _hoisted_2$20 = {
2504
+ role: "status",
2505
+ "aria-live": "polite",
2506
+ "aria-atomic": "true"
2507
+ };
2508
+ var _hoisted_3$14 = {
2509
+ role: "alert",
2510
+ "aria-live": "assertive",
2511
+ "aria-atomic": "true"
2512
+ };
2513
+ //#endregion
2514
+ //#region src/components/AnnounceHost.vue
2515
+ var AnnounceHost_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
2516
+ __name: "AnnounceHost",
2517
+ setup(__props) {
2518
+ const { polite, assertive } = useAnnounce();
2519
+ return (_ctx, _cache) => {
2520
+ return openBlock(), createElementBlock("div", _hoisted_1$22, [createElementVNode("p", _hoisted_2$20, toDisplayString(unref(polite)), 1), createElementVNode("p", _hoisted_3$14, toDisplayString(unref(assertive)), 1)]);
2521
+ };
2522
+ }
2523
+ }), [["__scopeId", "data-v-205d6703"]]);
2524
+ //#endregion
2525
+ //#region src/components/ErrorSummary.vue?vue&type=script&setup=true&lang.ts
2526
+ var _hoisted_1$21 = { class: "rk-errsum-title" };
2527
+ var _hoisted_2$19 = { class: "rk-errsum-list" };
2528
+ var _hoisted_3$13 = ["href", "onClick"];
2529
+ //#endregion
2530
+ //#region src/components/ErrorSummary.vue
2531
+ var ErrorSummary_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
2532
+ __name: "ErrorSummary",
2533
+ props: {
2534
+ errors: {},
2535
+ title: {},
2536
+ labelFor: { type: Function },
2537
+ fieldId: {
2538
+ type: Function,
2539
+ default: (field) => field
2540
+ },
2541
+ fields: { default: () => void 0 }
2542
+ },
2543
+ setup(__props, { expose: __expose }) {
2544
+ const panel = useTemplateRef("panel");
2545
+ const listed = computed(() => {
2546
+ return (__props.fields ?? Object.keys(__props.errors)).filter((field) => __props.errors[field] !== void 0).map((field) => ({
2547
+ field,
2548
+ message: __props.errors[field],
2549
+ id: __props.fieldId(field)
2550
+ }));
2551
+ });
2552
+ const hasErrors = computed(() => listed.value.length > 0);
2553
+ /** Moves focus into the summary. Call it on every failed submit. */
2554
+ function focus() {
2555
+ focusTarget(panel.value);
2556
+ }
2557
+ function goToField(event, id) {
2558
+ if (focusTarget(id)) event.preventDefault();
2559
+ }
2560
+ watch(hasErrors, async (now) => {
2561
+ if (!now) return;
2562
+ await nextTick();
2563
+ focus();
2564
+ });
2565
+ __expose({ focus });
2566
+ return (_ctx, _cache) => {
2567
+ return hasErrors.value ? (openBlock(), createElementBlock("div", {
2568
+ key: 0,
2569
+ ref_key: "panel",
2570
+ ref: panel,
2571
+ class: "rk-errsum",
2572
+ tabindex: "-1"
2573
+ }, [createElementVNode("p", _hoisted_1$21, toDisplayString(__props.title), 1), createElementVNode("ul", _hoisted_2$19, [(openBlock(true), createElementBlock(Fragment, null, renderList(listed.value, (item) => {
2574
+ return openBlock(), createElementBlock("li", { key: item.field }, [createElementVNode("a", {
2575
+ href: `#${item.id}`,
2576
+ class: "rk-errsum-link",
2577
+ onClick: ($event) => goToField($event, item.id)
2578
+ }, toDisplayString(__props.labelFor(item.field)) + ": " + toDisplayString(item.message), 9, _hoisted_3$13)]);
2579
+ }), 128))])], 512)) : createCommentVNode("", true);
2580
+ };
2581
+ }
2582
+ }), [["__scopeId", "data-v-4a68e342"]]);
2583
+ //#endregion
2584
+ //#region src/utils/direction.ts
2585
+ var RTL = /* @__PURE__ */ new Set([
2586
+ "ar",
2587
+ "arc",
2588
+ "ckb",
2589
+ "dv",
2590
+ "fa",
2591
+ "he",
2592
+ "ks",
2593
+ "ku",
2594
+ "nqo",
2595
+ "ps",
2596
+ "sd",
2597
+ "syr",
2598
+ "ug",
2599
+ "ur",
2600
+ "yi"
2601
+ ]);
2602
+ /**
2603
+ * Which way a locale tag is written.
2604
+ *
2605
+ * The kit is built on logical properties and `start`/`end` props all the
2606
+ * way through — `BaseDrawer`'s side, every inset, every margin — and none
2607
+ * of that does anything at all until `dir` is set on the document. So the
2608
+ * direction has to come from somewhere, and a locale tag is the only thing
2609
+ * that knows it.
2610
+ *
2611
+ * Only the language subtag is read, so `ar-EG` and `ar` answer the same.
2612
+ *
2613
+ * @example
2614
+ * ```ts
2615
+ * textDirection('he-IL') // 'rtl'
2616
+ * textDirection('tr') // 'ltr'
2617
+ * ```
2618
+ */
2619
+ function textDirection(locale) {
2620
+ const parts = locale.toLowerCase().split(/[-_]/);
2621
+ const script = parts[1];
2622
+ if (script === "arab" || script === "hebr" || script === "thaa" || script === "syrc") return "rtl";
2623
+ return RTL.has(parts[0] ?? "") ? "rtl" : "ltr";
2624
+ }
2625
+ //#endregion
2448
2626
  //#region src/components/AvatarStack.vue?vue&type=script&setup=true&lang.ts
2449
2627
  var _hoisted_1$20 = ["aria-label"];
2450
2628
  var _hoisted_2$18 = {
@@ -2488,7 +2666,7 @@ var AvatarStack_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
2488
2666
  }), 128)), rest.value ? (openBlock(), createElementBlock("span", _hoisted_2$18, "+" + toDisplayString(rest.value), 1)) : createCommentVNode("", true)], 10, _hoisted_1$20);
2489
2667
  };
2490
2668
  }
2491
- }), [["__scopeId", "data-v-db629481"]]);
2669
+ }), [["__scopeId", "data-v-1f87913c"]]);
2492
2670
  //#endregion
2493
2671
  //#region src/components/BaseCalendar.vue?vue&type=script&setup=true&lang.ts
2494
2672
  var _hoisted_1$19 = { class: "rk-cal" };
@@ -3441,7 +3619,7 @@ var FileDrop_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PUR
3441
3619
  ]);
3442
3620
  };
3443
3621
  }
3444
- }), [["__scopeId", "data-v-a42eab69"]]);
3622
+ }), [["__scopeId", "data-v-6e903baf"]]);
3445
3623
  //#endregion
3446
3624
  //#region src/components/TagsInput.vue?vue&type=script&setup=true&lang.ts
3447
3625
  var _hoisted_1$9 = [
@@ -3698,7 +3876,7 @@ var BasePopover_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
3698
3876
  })], 544);
3699
3877
  };
3700
3878
  }
3701
- }), [["__scopeId", "data-v-1371bff2"]]);
3879
+ }), [["__scopeId", "data-v-22d8f397"]]);
3702
3880
  //#endregion
3703
3881
  //#region src/components/TimePicker.vue?vue&type=script&setup=true&lang.ts
3704
3882
  var _hoisted_1$7 = [
@@ -3843,7 +4021,7 @@ var TimePicker_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
3843
4021
  ]);
3844
4022
  };
3845
4023
  }
3846
- }), [["__scopeId", "data-v-0037adb2"]]);
4024
+ }), [["__scopeId", "data-v-ad58b4f3"]]);
3847
4025
  //#endregion
3848
4026
  //#region src/components/BaseTimeline.vue?vue&type=script&setup=true&lang.ts
3849
4027
  var _hoisted_1$6 = ["aria-label"];
@@ -3897,7 +4075,7 @@ var BaseTimeline_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
3897
4075
  }), 128))], 8, _hoisted_1$6);
3898
4076
  };
3899
4077
  }
3900
- }), [["__scopeId", "data-v-08b15ce8"]]);
4078
+ }), [["__scopeId", "data-v-8a452f82"]]);
3901
4079
  //#endregion
3902
4080
  //#region src/components/BaseDatePicker.vue?vue&type=script&setup=true&lang.ts
3903
4081
  var _hoisted_1$5 = [
@@ -4044,7 +4222,7 @@ var BaseDatePicker_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/*
4044
4222
  ]);
4045
4223
  };
4046
4224
  }
4047
- }), [["__scopeId", "data-v-154e27fb"]]);
4225
+ }), [["__scopeId", "data-v-42390973"]]);
4048
4226
  //#endregion
4049
4227
  //#region src/components/BasePopconfirm.vue?vue&type=script&setup=true&lang.ts
4050
4228
  var _hoisted_1$4 = { class: "rk-confirm" };
@@ -4510,7 +4688,7 @@ var BaseStepper_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
4510
4688
  }), 128))], 2)], 8, _hoisted_1);
4511
4689
  };
4512
4690
  }
4513
- }), [["__scopeId", "data-v-6aa3221b"]]);
4691
+ }), [["__scopeId", "data-v-f7513d9a"]]);
4514
4692
  //#endregion
4515
4693
  //#region src/i18n/runtime.ts
4516
4694
  /**
@@ -4604,7 +4782,10 @@ function createI18nRuntime(options) {
4604
4782
  watchEffect(() => {
4605
4783
  core.locale.value = activeLocale.value;
4606
4784
  setFormatLocale(intlLocale.value);
4607
- if (typeof document !== "undefined") document.documentElement.lang = activeLocale.value;
4785
+ if (typeof document !== "undefined") {
4786
+ document.documentElement.lang = activeLocale.value;
4787
+ document.documentElement.dir = textDirection(intlLocale.value);
4788
+ }
4608
4789
  });
4609
4790
  /** Read and write the language preference. */
4610
4791
  function useLocalePreference() {
@@ -4654,8 +4835,8 @@ function createI18nRuntime(options) {
4654
4835
  *
4655
4836
  * The fallback keeps `vitest` and `vite dev` honest, where no define runs.
4656
4837
  */
4657
- var VERSION = "2.20.0";
4838
+ var VERSION = "2.22.0";
4658
4839
  //#endregion
4659
- export { ActivityGrid_default as ActivityGrid, AppError, AvatarStack_default as AvatarStack, BaseAlert_default as BaseAlert, BaseAvatar_default as BaseAvatar, BaseBadge_default as BaseBadge, BaseButton_default as BaseButton, BaseCalendar_default as BaseCalendar, BaseCard_default as BaseCard, BaseCheckbox_default as BaseCheckbox, BaseChip_default as BaseChip, BaseCombobox_default as BaseCombobox, BaseDatePicker_default as BaseDatePicker, BaseInput_default as BaseInput, BaseKbd_default as BaseKbd, BaseLink_default as BaseLink, BaseListbox_default as BaseListbox, BaseMenu_default as BaseMenu, BasePopconfirm_default as BasePopconfirm, BasePopover_default as BasePopover, BaseRadioGroup_default as BaseRadioGroup, BaseRating_default as BaseRating, BaseSelect_default as BaseSelect, BaseSeparator_default as BaseSeparator, BaseSheet_default as BaseSheet, BaseSkeleton_default as BaseSkeleton, BaseSlider_default as BaseSlider, BaseSpinner_default as BaseSpinner, BaseStepper_default as BaseStepper, BaseSwitch_default as BaseSwitch, BaseTable_default as BaseTable, BaseTextarea_default as BaseTextarea, BaseTimeline_default as BaseTimeline, CircularProgress_default as CircularProgress, CodeBlock_default as CodeBlock, ColorPicker_default as ColorPicker, CopyButton_default as CopyButton, DescriptionList_default as DescriptionList, EmptyState_default as EmptyState, ErrorBoundary_default as ErrorBoundary, FileDrop_default as FileDrop, FormField_default as FormField, GoogleButton_default as GoogleButton, LocaleLinks_default as LocaleLinks, MATERIALS, NumberInput_default as NumberInput, PALETTES, PageContainer_default as PageContainer, PageHeader_default as PageHeader, PinInput_default as PinInput, PriceCard_default as PriceCard, ProgressBar_default as ProgressBar, SHEET_ROOT_ID, SectionHeading_default as SectionHeading, SegmentedControl_default as SegmentedControl, SettingsGroup_default as SettingsGroup, SettingsRow_default as SettingsRow, SkeletonList_default as SkeletonList, SliderField_default as SliderField, StatCard_default as StatCard, TabBar_default as TabBar, TagsInput_default as TagsInput, TimePicker_default as TimePicker, ToastHost_default as ToastHost, ToggleGroup_default as ToggleGroup, ToneDot_default as ToneDot, VERSION, addDays, applyMaterial, applyPalette, applyTheme, createI18nRuntime, downloadJson, eachDayOfYear, ensureSheetRoot, formatDate, formatNumber, fromDateKey, isApplePortable, isInstalled, isMaterial, isPaletteName, isThemePreference, lastNDays, leadingBlanks, needsIosInstall, readStoredTheme, registerErrorMapper, relativeDayLabel, safeRedirect, setFormatLocale, setMaterialStorageKey, setPaletteStorageKey, setThemeStorageKey, startOfWeek, tapFeedback, toAppError, toDateKey, toRedirectPath, todayKey, useDebouncedCallback, useDragScroll, useMaterial, useMediaQuery, useOnline, usePalette, useTheme, useToast, useToday, useVisualViewport };
4840
+ export { ActivityGrid_default as ActivityGrid, AnnounceHost_default as AnnounceHost, AppError, AvatarStack_default as AvatarStack, BaseAlert_default as BaseAlert, BaseAvatar_default as BaseAvatar, BaseBadge_default as BaseBadge, BaseButton_default as BaseButton, BaseCalendar_default as BaseCalendar, BaseCard_default as BaseCard, BaseCheckbox_default as BaseCheckbox, BaseChip_default as BaseChip, BaseCombobox_default as BaseCombobox, BaseDatePicker_default as BaseDatePicker, BaseInput_default as BaseInput, BaseKbd_default as BaseKbd, BaseLink_default as BaseLink, BaseListbox_default as BaseListbox, BaseMenu_default as BaseMenu, BasePopconfirm_default as BasePopconfirm, BasePopover_default as BasePopover, BaseRadioGroup_default as BaseRadioGroup, BaseRating_default as BaseRating, BaseSelect_default as BaseSelect, BaseSeparator_default as BaseSeparator, BaseSheet_default as BaseSheet, BaseSkeleton_default as BaseSkeleton, BaseSlider_default as BaseSlider, BaseSpinner_default as BaseSpinner, BaseStepper_default as BaseStepper, BaseSwitch_default as BaseSwitch, BaseTable_default as BaseTable, BaseTextarea_default as BaseTextarea, BaseTimeline_default as BaseTimeline, CircularProgress_default as CircularProgress, CodeBlock_default as CodeBlock, ColorPicker_default as ColorPicker, CopyButton_default as CopyButton, DescriptionList_default as DescriptionList, EmptyState_default as EmptyState, ErrorBoundary_default as ErrorBoundary, ErrorSummary_default as ErrorSummary, FileDrop_default as FileDrop, FormField_default as FormField, GoogleButton_default as GoogleButton, LocaleLinks_default as LocaleLinks, MATERIALS, NumberInput_default as NumberInput, PALETTES, PageContainer_default as PageContainer, PageHeader_default as PageHeader, PinInput_default as PinInput, PriceCard_default as PriceCard, ProgressBar_default as ProgressBar, SHEET_ROOT_ID, ScrollArea_default as ScrollArea, SectionHeading_default as SectionHeading, SegmentedControl_default as SegmentedControl, SettingsGroup_default as SettingsGroup, SettingsRow_default as SettingsRow, SkeletonList_default as SkeletonList, SliderField_default as SliderField, StatCard_default as StatCard, TabBar_default as TabBar, TagsInput_default as TagsInput, TimePicker_default as TimePicker, ToastHost_default as ToastHost, ToggleGroup_default as ToggleGroup, ToneDot_default as ToneDot, VERSION, VirtualList_default as VirtualList, addDays, announce, applyMaterial, applyPalette, applyTheme, createI18nRuntime, downloadJson, eachDayOfYear, ensureSheetRoot, formatDate, formatNumber, fromDateKey, isApplePortable, isInstalled, isMaterial, isPaletteName, isThemePreference, lastNDays, leadingBlanks, needsIosInstall, readStoredTheme, registerErrorMapper, relativeDayLabel, safeRedirect, setFormatLocale, setMaterialStorageKey, setPaletteStorageKey, setThemeStorageKey, startOfWeek, tapFeedback, textDirection, toAppError, toDateKey, toRedirectPath, todayKey, useAnnounce, useDebouncedCallback, useDragScroll, useMaterial, useMediaQuery, useOnline, usePalette, useTheme, useToast, useToday, useVisualViewport };
4660
4841
 
4661
4842
  //# sourceMappingURL=index.js.map