rei-kit 2.21.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.
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,94 +271,18 @@ 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$47 = [
275
+ var _hoisted_1$48 = [
352
276
  "role",
353
277
  "aria-label",
354
278
  "aria-hidden"
355
279
  ];
356
- var _hoisted_2$41 = ["src"];
357
- var _hoisted_3$27 = {
280
+ var _hoisted_2$42 = ["src"];
281
+ var _hoisted_3$28 = {
358
282
  key: 1,
359
283
  class: "rk-avatar-initials"
360
284
  };
361
- var _hoisted_4$21 = {
285
+ var _hoisted_4$20 = {
362
286
  key: 2,
363
287
  viewBox: "0 0 20 20",
364
288
  class: "rk-avatar-figure",
@@ -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$41)) : __props.fallback === "initials" && initials.value ? (openBlock(), createElementBlock("span", _hoisted_3$27, toDisplayString(initials.value), 1)) : (openBlock(), createElementBlock("svg", _hoisted_4$21, [..._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$47);
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$46 = [
365
+ var _hoisted_1$47 = [
442
366
  "aria-label",
443
367
  "aria-expanded",
444
368
  "aria-controls"
445
369
  ];
446
- var _hoisted_2$40 = ["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$46), 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$40)) : 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({
@@ -644,13 +568,13 @@ function useVirtualWindow({ count, rowHeight, threshold }) {
644
568
  }
645
569
  //#endregion
646
570
  //#region src/components/BaseCombobox.vue?vue&type=script&setup=true&lang.ts
647
- var _hoisted_1$45 = ["for"];
648
- var _hoisted_2$39 = [
571
+ var _hoisted_1$46 = ["for"];
572
+ var _hoisted_2$40 = [
649
573
  "aria-label",
650
574
  "disabled",
651
575
  "onClick"
652
576
  ];
653
- var _hoisted_3$26 = [
577
+ var _hoisted_3$27 = [
654
578
  "id",
655
579
  "placeholder",
656
580
  "disabled",
@@ -659,13 +583,13 @@ var _hoisted_3$26 = [
659
583
  "aria-invalid",
660
584
  "aria-describedby"
661
585
  ];
662
- var _hoisted_4$20 = ["disabled"];
663
- var _hoisted_5$13 = [
586
+ var _hoisted_4$19 = ["disabled"];
587
+ var _hoisted_5$11 = [
664
588
  "aria-label",
665
589
  "aria-multiselectable",
666
590
  "aria-busy"
667
591
  ];
668
- var _hoisted_6$8 = [
592
+ var _hoisted_6$7 = [
669
593
  "id",
670
594
  "aria-selected",
671
595
  "aria-setsize",
@@ -881,7 +805,7 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
881
805
  createElementVNode("label", {
882
806
  for: unref(id),
883
807
  class: "rk-combo-label"
884
- }, toDisplayString(__props.label), 9, _hoisted_1$45),
808
+ }, toDisplayString(__props.label), 9, _hoisted_1$46),
885
809
  createElementVNode("div", { class: normalizeClass(["rk-combo-field", multiple.value ? "is-multiple control" : ""]) }, [
886
810
  (openBlock(true), createElementBlock(Fragment, null, renderList(multiple.value ? chosenOptions.value : [], (option) => {
887
811
  return openBlock(), createElementBlock("span", {
@@ -894,7 +818,7 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
894
818
  "aria-label": __props.removeLabel(option.label),
895
819
  disabled: __props.disabled,
896
820
  onClick: ($event) => remove(option.value)
897
- }, " × ", 8, _hoisted_2$39)) : createCommentVNode("", true)]);
821
+ }, " × ", 8, _hoisted_2$40)) : createCommentVNode("", true)]);
898
822
  }), 128)),
899
823
  withDirectives(createElementVNode("input", {
900
824
  id: unref(id),
@@ -913,7 +837,7 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
913
837
  "aria-describedby": describedBy.value,
914
838
  onKeydown,
915
839
  onFocus: _cache[1] || (_cache[1] = ($event) => open.value = true)
916
- }, null, 42, _hoisted_3$26), [[vModelText, text.value]]),
840
+ }, null, 42, _hoisted_3$27), [[vModelText, text.value]]),
917
841
  createElementVNode("button", {
918
842
  type: "button",
919
843
  class: "rk-combo-toggle",
@@ -921,7 +845,7 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
921
845
  "aria-hidden": "true",
922
846
  disabled: __props.disabled,
923
847
  onClick: _cache[2] || (_cache[2] = ($event) => open.value = !open.value)
924
- }, " ▾ ", 8, _hoisted_4$20)
848
+ }, " ▾ ", 8, _hoisted_4$19)
925
849
  ], 2),
926
850
  withDirectives(createElementVNode("ul", {
927
851
  id: listId,
@@ -954,7 +878,7 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
954
878
  "aria-posinset": row.index + 1,
955
879
  onPointerdown: withModifiers(($event) => choose(row.option), ["prevent"]),
956
880
  onPointermove: ($event) => highlighted.value = row.index
957
- }, toDisplayString(row.option.label), 47, _hoisted_6$8);
881
+ }, toDisplayString(row.option.label), 47, _hoisted_6$7);
958
882
  }), 128)),
959
883
  unref(padBottom) > 0 ? (openBlock(), createElementBlock("li", {
960
884
  key: 1,
@@ -968,7 +892,7 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
968
892
  height: "0.75rem"
969
893
  });
970
894
  }), 64))])])) : matches.value.length === 0 ? (openBlock(), createElementBlock("li", _hoisted_10$3, toDisplayString(__props.emptyLabel), 1)) : createCommentVNode("", true)
971
- ], 40, _hoisted_5$13), [[vShow, open.value]]),
895
+ ], 40, _hoisted_5$11), [[vShow, open.value]]),
972
896
  __props.error ? (openBlock(), createElementBlock("p", {
973
897
  key: 0,
974
898
  id: errorId,
@@ -981,16 +905,16 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
981
905
  ], 512);
982
906
  };
983
907
  }
984
- }), [["__scopeId", "data-v-006740dc"]]);
908
+ }), [["__scopeId", "data-v-0ae3b425"]]);
985
909
  //#endregion
986
910
  //#region src/components/BaseRadioGroup.vue?vue&type=script&setup=true&lang.ts
987
- var _hoisted_1$44 = ["aria-describedby"];
988
- var _hoisted_2$38 = [
911
+ var _hoisted_1$45 = ["aria-describedby"];
912
+ var _hoisted_2$39 = [
989
913
  "name",
990
914
  "value",
991
915
  "disabled"
992
916
  ];
993
- var _hoisted_3$25 = { class: "text-ink text-sm" };
917
+ var _hoisted_3$26 = { class: "text-ink text-sm" };
994
918
  //#endregion
995
919
  //#region src/components/BaseRadioGroup.vue
996
920
  var BaseRadioGroup_default = /* @__PURE__ */ defineComponent({
@@ -1034,7 +958,7 @@ var BaseRadioGroup_default = /* @__PURE__ */ defineComponent({
1034
958
  value: option.value,
1035
959
  disabled: option.disabled,
1036
960
  class: "accent-primary focus-visible:outline-primary size-4 shrink-0 focus-visible:outline-2 focus-visible:outline-offset-2"
1037
- }, null, 8, _hoisted_2$38), [[vModelRadio, unref(model)]]), createElementVNode("span", _hoisted_3$25, toDisplayString(option.label), 1)], 2);
961
+ }, null, 8, _hoisted_2$39), [[vModelRadio, unref(model)]]), createElementVNode("span", _hoisted_3$26, toDisplayString(option.label), 1)], 2);
1038
962
  }), 128)),
1039
963
  __props.error ? (openBlock(), createElementBlock("p", {
1040
964
  key: 0,
@@ -1045,24 +969,24 @@ var BaseRadioGroup_default = /* @__PURE__ */ defineComponent({
1045
969
  id: hintId,
1046
970
  class: "text-ink-soft text-xs"
1047
971
  }, toDisplayString(__props.hint), 1)) : createCommentVNode("", true)
1048
- ], 8, _hoisted_1$44);
972
+ ], 8, _hoisted_1$45);
1049
973
  };
1050
974
  }
1051
975
  });
1052
976
  //#endregion
1053
977
  //#region src/components/BaseSelect.vue?vue&type=script&setup=true&lang.ts
1054
- var _hoisted_1$43 = { class: "relative" };
1055
- var _hoisted_2$37 = [
978
+ var _hoisted_1$44 = { class: "relative" };
979
+ var _hoisted_2$38 = [
1056
980
  "id",
1057
981
  "aria-invalid",
1058
982
  "aria-describedby"
1059
983
  ];
1060
- var _hoisted_3$24 = {
984
+ var _hoisted_3$25 = {
1061
985
  key: 0,
1062
986
  value: void 0,
1063
987
  disabled: ""
1064
988
  };
1065
- var _hoisted_4$19 = ["value", "disabled"];
989
+ var _hoisted_4$18 = ["value", "disabled"];
1066
990
  //#endregion
1067
991
  //#region src/components/BaseSelect.vue
1068
992
  var BaseSelect_default = /* @__PURE__ */ defineComponent({
@@ -1098,7 +1022,7 @@ var BaseSelect_default = /* @__PURE__ */ defineComponent({
1098
1022
  "label-hidden": __props.labelHidden,
1099
1023
  size: __props.size
1100
1024
  }, {
1101
- default: withCtx(({ id, describedBy, invalid }) => [createElementVNode("div", _hoisted_1$43, [withDirectives(createElementVNode("select", {
1025
+ default: withCtx(({ id, describedBy, invalid }) => [createElementVNode("div", _hoisted_1$44, [withDirectives(createElementVNode("select", {
1102
1026
  id,
1103
1027
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => model.value = $event),
1104
1028
  "aria-invalid": invalid,
@@ -1108,13 +1032,13 @@ var BaseSelect_default = /* @__PURE__ */ defineComponent({
1108
1032
  __props.variant === "unstyled" ? "" : SIZE_CLASS[__props.size],
1109
1033
  __props.variant !== "unstyled" && invalid ? "border-negative" : ""
1110
1034
  ]])
1111
- }, [__props.placeholder ? (openBlock(), createElementBlock("option", _hoisted_3$24, 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) => {
1112
1036
  return openBlock(), createElementBlock("option", {
1113
1037
  key: option.value,
1114
1038
  value: option.value,
1115
1039
  disabled: option.disabled
1116
- }, toDisplayString(option.label), 9, _hoisted_4$19);
1117
- }), 128))], 10, _hoisted_2$37), [[vModelSelect, model.value]]), createVNode(unref(ChevronDown), {
1040
+ }, toDisplayString(option.label), 9, _hoisted_4$18);
1041
+ }), 128))], 10, _hoisted_2$38), [[vModelSelect, model.value]]), createVNode(unref(ChevronDown), {
1118
1042
  class: "text-ink-soft pointer-events-none absolute top-1/2 right-3 size-4 -translate-y-1/2",
1119
1043
  "aria-hidden": "true"
1120
1044
  })])]),
@@ -1131,11 +1055,11 @@ var BaseSelect_default = /* @__PURE__ */ defineComponent({
1131
1055
  });
1132
1056
  //#endregion
1133
1057
  //#region src/components/BaseSlider.vue?vue&type=script&setup=true&lang.ts
1134
- var _hoisted_1$42 = { class: "rk-slider" };
1135
- var _hoisted_2$36 = { class: "rk-slider-head" };
1136
- var _hoisted_3$23 = ["for"];
1137
- var _hoisted_4$18 = ["for"];
1138
- var _hoisted_5$12 = [
1058
+ var _hoisted_1$43 = { class: "rk-slider" };
1059
+ var _hoisted_2$37 = { class: "rk-slider-head" };
1060
+ var _hoisted_3$24 = ["for"];
1061
+ var _hoisted_4$17 = ["for"];
1062
+ var _hoisted_5$10 = [
1139
1063
  "id",
1140
1064
  "min",
1141
1065
  "max",
@@ -1179,15 +1103,15 @@ var BaseSlider_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
1179
1103
  return span <= 0 ? 0 : (model.value - __props.min) / span * 100;
1180
1104
  });
1181
1105
  return (_ctx, _cache) => {
1182
- return openBlock(), createElementBlock("div", _hoisted_1$42, [
1183
- createElementVNode("div", _hoisted_2$36, [createElementVNode("label", {
1106
+ return openBlock(), createElementBlock("div", _hoisted_1$43, [
1107
+ createElementVNode("div", _hoisted_2$37, [createElementVNode("label", {
1184
1108
  for: unref(id),
1185
1109
  class: "rk-slider-label"
1186
- }, toDisplayString(__props.label), 9, _hoisted_3$23), __props.showValue ? (openBlock(), createElementBlock("output", {
1110
+ }, toDisplayString(__props.label), 9, _hoisted_3$24), __props.showValue ? (openBlock(), createElementBlock("output", {
1187
1111
  key: 0,
1188
1112
  for: unref(id),
1189
1113
  class: "rk-slider-value"
1190
- }, toDisplayString(text.value), 9, _hoisted_4$18)) : createCommentVNode("", true)]),
1114
+ }, toDisplayString(text.value), 9, _hoisted_4$17)) : createCommentVNode("", true)]),
1191
1115
  withDirectives(createElementVNode("input", {
1192
1116
  id: unref(id),
1193
1117
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => model.value = $event),
@@ -1200,7 +1124,7 @@ var BaseSlider_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
1200
1124
  "aria-valuetext": text.value,
1201
1125
  "aria-describedby": __props.hint ? hintId : void 0,
1202
1126
  style: normalizeStyle({ "--rk-slider-filled": `${filled.value}%` })
1203
- }, null, 12, _hoisted_5$12), [[
1127
+ }, null, 12, _hoisted_5$10), [[
1204
1128
  vModelText,
1205
1129
  model.value,
1206
1130
  void 0,
@@ -1217,8 +1141,8 @@ var BaseSlider_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
1217
1141
  }), [["__scopeId", "data-v-7fa2769b"]]);
1218
1142
  //#endregion
1219
1143
  //#region src/components/NumberInput.vue?vue&type=script&setup=true&lang.ts
1220
- var _hoisted_1$41 = ["aria-label", "disabled"];
1221
- var _hoisted_2$35 = [
1144
+ var _hoisted_1$42 = ["aria-label", "disabled"];
1145
+ var _hoisted_2$36 = [
1222
1146
  "id",
1223
1147
  "value",
1224
1148
  "aria-valuenow",
@@ -1228,7 +1152,7 @@ var _hoisted_2$35 = [
1228
1152
  "aria-describedby",
1229
1153
  "disabled"
1230
1154
  ];
1231
- var _hoisted_3$22 = ["aria-label", "disabled"];
1155
+ var _hoisted_3$23 = ["aria-label", "disabled"];
1232
1156
  //#endregion
1233
1157
  //#region src/components/NumberInput.vue
1234
1158
  var NumberInput_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
@@ -1331,7 +1255,7 @@ var NumberInput_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
1331
1255
  }, [createVNode(unref(Minus), {
1332
1256
  class: "size-4",
1333
1257
  "aria-hidden": "true"
1334
- })], 8, _hoisted_1$41),
1258
+ })], 8, _hoisted_1$42),
1335
1259
  createElementVNode("input", {
1336
1260
  id,
1337
1261
  value: draft.value,
@@ -1349,7 +1273,7 @@ var NumberInput_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
1349
1273
  onInput,
1350
1274
  onBlur: commit,
1351
1275
  onKeydown
1352
- }, null, 40, _hoisted_2$35),
1276
+ }, null, 40, _hoisted_2$36),
1353
1277
  createElementVNode("button", {
1354
1278
  type: "button",
1355
1279
  class: "rk-number-step focus-ring",
@@ -1360,7 +1284,7 @@ var NumberInput_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
1360
1284
  }, [createVNode(unref(Plus), {
1361
1285
  class: "size-4",
1362
1286
  "aria-hidden": "true"
1363
- })], 8, _hoisted_3$22)
1287
+ })], 8, _hoisted_3$23)
1364
1288
  ], 2)]),
1365
1289
  _: 1
1366
1290
  }, 8, [
@@ -1375,7 +1299,7 @@ var NumberInput_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
1375
1299
  }), [["__scopeId", "data-v-082bd3d7"]]);
1376
1300
  //#endregion
1377
1301
  //#region src/components/SliderField.vue?vue&type=script&setup=true&lang.ts
1378
- var _hoisted_1$40 = { class: "rk-slider-field" };
1302
+ var _hoisted_1$41 = { class: "rk-slider-field" };
1379
1303
  //#endregion
1380
1304
  //#region src/components/SliderField.vue
1381
1305
  var SliderField_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
@@ -1416,7 +1340,7 @@ var SliderField_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
1416
1340
  }
1417
1341
  });
1418
1342
  return (_ctx, _cache) => {
1419
- return openBlock(), createElementBlock("div", _hoisted_1$40, [createVNode(BaseSlider_default, {
1343
+ return openBlock(), createElementBlock("div", _hoisted_1$41, [createVNode(BaseSlider_default, {
1420
1344
  modelValue: model.value,
1421
1345
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => model.value = $event),
1422
1346
  label: __props.label,
@@ -1464,11 +1388,11 @@ var SliderField_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
1464
1388
  }), [["__scopeId", "data-v-6ec3163a"]]);
1465
1389
  //#endregion
1466
1390
  //#region src/components/BaseSpinner.vue?vue&type=script&setup=true&lang.ts
1467
- var _hoisted_1$39 = {
1391
+ var _hoisted_1$40 = {
1468
1392
  class: "rk-spin-wrap",
1469
1393
  role: "status"
1470
1394
  };
1471
- var _hoisted_2$34 = { class: "rk-spin-label" };
1395
+ var _hoisted_2$35 = { class: "rk-spin-label" };
1472
1396
  //#endregion
1473
1397
  //#region src/components/BaseSpinner.vue
1474
1398
  var BaseSpinner_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
@@ -1496,26 +1420,26 @@ var BaseSpinner_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
1496
1420
  lg: "2.5rem"
1497
1421
  };
1498
1422
  return (_ctx, _cache) => {
1499
- return openBlock(), createElementBlock("span", _hoisted_1$39, [createElementVNode("span", {
1423
+ return openBlock(), createElementBlock("span", _hoisted_1$40, [createElementVNode("span", {
1500
1424
  class: "rk-spin",
1501
1425
  style: normalizeStyle({
1502
1426
  width: SIZES[__props.size],
1503
1427
  height: SIZES[__props.size]
1504
1428
  }),
1505
1429
  "aria-hidden": "true"
1506
- }, null, 4), createElementVNode("span", _hoisted_2$34, toDisplayString(__props.label), 1)]);
1430
+ }, null, 4), createElementVNode("span", _hoisted_2$35, toDisplayString(__props.label), 1)]);
1507
1431
  };
1508
1432
  }
1509
1433
  }), [["__scopeId", "data-v-842da62c"]]);
1510
1434
  //#endregion
1511
1435
  //#region src/components/BaseSwitch.vue?vue&type=script&setup=true&lang.ts
1512
- var _hoisted_1$38 = { class: "flex items-center justify-between gap-4" };
1513
- var _hoisted_2$33 = {
1436
+ var _hoisted_1$39 = { class: "flex items-center justify-between gap-4" };
1437
+ var _hoisted_2$34 = {
1514
1438
  key: 0,
1515
1439
  class: "min-w-0"
1516
1440
  };
1517
- var _hoisted_3$21 = ["id"];
1518
- var _hoisted_4$17 = [
1441
+ var _hoisted_3$22 = ["id"];
1442
+ var _hoisted_4$16 = [
1519
1443
  "aria-checked",
1520
1444
  "aria-labelledby",
1521
1445
  "aria-label",
@@ -1554,10 +1478,10 @@ var BaseSwitch_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
1554
1478
  if (!__props.disabled) model.value = !model.value;
1555
1479
  }
1556
1480
  return (_ctx, _cache) => {
1557
- return openBlock(), createElementBlock("div", _hoisted_1$38, [!__props.labelHidden ? (openBlock(), createElementBlock("span", _hoisted_2$33, [createElementVNode("span", {
1481
+ return openBlock(), createElementBlock("div", _hoisted_1$39, [!__props.labelHidden ? (openBlock(), createElementBlock("span", _hoisted_2$34, [createElementVNode("span", {
1558
1482
  id: unref(id),
1559
1483
  class: "text-ink block text-sm"
1560
- }, toDisplayString(__props.label), 9, _hoisted_3$21), __props.hint ? (openBlock(), createElementBlock("span", {
1484
+ }, toDisplayString(__props.label), 9, _hoisted_3$22), __props.hint ? (openBlock(), createElementBlock("span", {
1561
1485
  key: 0,
1562
1486
  id: hintId,
1563
1487
  class: "text-ink-soft mt-0.5 block text-xs"
@@ -1574,17 +1498,16 @@ var BaseSwitch_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
1574
1498
  }, [..._cache[0] || (_cache[0] = [createElementVNode("span", {
1575
1499
  class: "rk-switch-knob",
1576
1500
  "aria-hidden": "true"
1577
- }, null, -1)])], 10, _hoisted_4$17)]);
1501
+ }, null, -1)])], 10, _hoisted_4$16)]);
1578
1502
  };
1579
1503
  }
1580
- }), [["__scopeId", "data-v-3f4400a0"]]);
1504
+ }), [["__scopeId", "data-v-d90e1aa6"]]);
1581
1505
  //#endregion
1582
1506
  //#region src/components/BaseTable.vue?vue&type=script&setup=true&lang.ts
1583
- var _hoisted_1$37 = ["aria-label"];
1584
- var _hoisted_2$32 = { class: "rk-table" };
1585
- var _hoisted_3$20 = { key: 0 };
1586
- var _hoisted_4$16 = { key: 1 };
1587
- var _hoisted_5$11 = ["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"];
1588
1511
  //#endregion
1589
1512
  //#region src/components/BaseTable.vue
1590
1513
  var BaseTable_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
@@ -1602,41 +1525,43 @@ var BaseTable_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
1602
1525
  setup(__props) {
1603
1526
  const keyFor = (row, index) => __props.rowKey ? String(row[__props.rowKey]) : index;
1604
1527
  return (_ctx, _cache) => {
1605
- return openBlock(), createElementBlock("div", {
1606
- class: "rk-table-scroll",
1607
- tabindex: "0",
1608
- role: "region",
1609
- "aria-label": __props.caption
1610
- }, [createElementVNode("table", _hoisted_2$32, [
1611
- createElementVNode("caption", { class: normalizeClass(__props.captionHidden ? "rk-table-caption-hidden" : "rk-table-caption") }, toDisplayString(__props.caption), 3),
1612
- createElementVNode("thead", null, [createElementVNode("tr", null, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (column) => {
1613
- return openBlock(), createElementBlock("th", {
1614
- key: column.key,
1615
- scope: "col",
1616
- class: normalizeClass([column.align && `is-${column.align}`, column.nowrap && "is-nowrap"])
1617
- }, toDisplayString(column.label), 3);
1618
- }), 128))])]),
1619
- __props.rows.length > 0 ? (openBlock(), createElementBlock("tbody", _hoisted_3$20, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.rows, (row, index) => {
1620
- return openBlock(), createElementBlock("tr", { key: keyFor(row, index) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (column) => {
1621
- 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", {
1622
1537
  key: column.key,
1538
+ scope: "col",
1623
1539
  class: normalizeClass([column.align && `is-${column.align}`, column.nowrap && "is-nowrap"])
1624
- }, [renderSlot(_ctx.$slots, column.key, {
1625
- row,
1626
- value: row[column.key]
1627
- }, () => [createTextVNode(toDisplayString(row[column.key]), 1)], true)], 2);
1628
- }), 128))]);
1629
- }), 128))])) : (openBlock(), createElementBlock("tbody", _hoisted_4$16, [createElementVNode("tr", null, [createElementVNode("td", {
1630
- colspan: __props.columns.length,
1631
- class: "rk-table-empty"
1632
- }, [renderSlot(_ctx.$slots, "empty", {}, void 0, true)], 8, _hoisted_5$11)])]))
1633
- ])], 8, _hoisted_1$37);
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"]);
1634
1559
  };
1635
1560
  }
1636
- }), [["__scopeId", "data-v-ab10e9fa"]]);
1561
+ }), [["__scopeId", "data-v-cc1197ef"]]);
1637
1562
  //#endregion
1638
1563
  //#region src/components/BaseTextarea.vue?vue&type=script&setup=true&lang.ts
1639
- var _hoisted_1$36 = [
1564
+ var _hoisted_1$37 = [
1640
1565
  "id",
1641
1566
  "rows",
1642
1567
  "aria-invalid",
@@ -1682,7 +1607,7 @@ var BaseTextarea_default = /* @__PURE__ */ defineComponent({
1682
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",
1683
1608
  "text-base",
1684
1609
  __props.variant !== "unstyled" && invalid ? "border-negative" : ""
1685
- ] }), null, 16, _hoisted_1$36), [[vModelText, unref(model)]])]),
1610
+ ] }), null, 16, _hoisted_1$37), [[vModelText, unref(model)]])]),
1686
1611
  _: 1
1687
1612
  }, 8, [
1688
1613
  "label",
@@ -1696,17 +1621,17 @@ var BaseTextarea_default = /* @__PURE__ */ defineComponent({
1696
1621
  });
1697
1622
  //#endregion
1698
1623
  //#region src/components/EmptyState.vue?vue&type=script&setup=true&lang.ts
1699
- var _hoisted_1$35 = { class: "flex flex-col items-center gap-3 px-6 py-10 text-center" };
1700
- var _hoisted_2$31 = {
1624
+ var _hoisted_1$36 = { class: "flex flex-col items-center gap-3 px-6 py-10 text-center" };
1625
+ var _hoisted_2$32 = {
1701
1626
  key: 0,
1702
1627
  class: "bg-muted text-primary rounded-card flex size-12 items-center justify-center"
1703
1628
  };
1704
- var _hoisted_3$19 = { class: "text-ink text-base font-semibold" };
1705
- var _hoisted_4$15 = {
1629
+ var _hoisted_3$20 = { class: "text-ink text-base font-semibold" };
1630
+ var _hoisted_4$14 = {
1706
1631
  key: 1,
1707
1632
  class: "text-ink-soft max-w-[36ch] text-sm"
1708
1633
  };
1709
- var _hoisted_5$10 = {
1634
+ var _hoisted_5$9 = {
1710
1635
  key: 2,
1711
1636
  class: "mt-2 flex w-full flex-col gap-2"
1712
1637
  };
@@ -1728,11 +1653,11 @@ var EmptyState_default = /* @__PURE__ */ defineComponent({
1728
1653
  * goes — the button that creates the first one.
1729
1654
  */
1730
1655
  return (_ctx, _cache) => {
1731
- return openBlock(), createElementBlock("div", _hoisted_1$35, [
1732
- _ctx.$slots.icon ? (openBlock(), createElementBlock("div", _hoisted_2$31, [renderSlot(_ctx.$slots, "icon")])) : createCommentVNode("", true),
1733
- createElementVNode("h3", _hoisted_3$19, toDisplayString(__props.title), 1),
1734
- __props.description ? (openBlock(), createElementBlock("p", _hoisted_4$15, toDisplayString(__props.description), 1)) : createCommentVNode("", true),
1735
- _ctx.$slots.action ? (openBlock(), createElementBlock("div", _hoisted_5$10, [renderSlot(_ctx.$slots, "action")])) : createCommentVNode("", true)
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),
1659
+ __props.description ? (openBlock(), createElementBlock("p", _hoisted_4$14, toDisplayString(__props.description), 1)) : createCommentVNode("", true),
1660
+ _ctx.$slots.action ? (openBlock(), createElementBlock("div", _hoisted_5$9, [renderSlot(_ctx.$slots, "action")])) : createCommentVNode("", true)
1736
1661
  ]);
1737
1662
  };
1738
1663
  }
@@ -1799,11 +1724,11 @@ var PageContainer_default = /* @__PURE__ */ defineComponent({
1799
1724
  });
1800
1725
  //#endregion
1801
1726
  //#region src/components/PageHeader.vue?vue&type=script&setup=true&lang.ts
1802
- var _hoisted_1$34 = { class: "grid h-12 shrink-0 grid-cols-[2.5rem_1fr_2.5rem] items-center" };
1803
- var _hoisted_2$30 = { class: "justify-self-start" };
1804
- var _hoisted_3$18 = { class: "text-ink flex min-w-0 justify-center text-base font-semibold tabular-nums" };
1805
- var _hoisted_4$14 = { class: "truncate" };
1806
- var _hoisted_5$9 = { class: "justify-self-end" };
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" };
1730
+ var _hoisted_4$13 = { class: "truncate" };
1731
+ var _hoisted_5$8 = { class: "justify-self-end" };
1807
1732
  //#endregion
1808
1733
  //#region src/components/PageHeader.vue
1809
1734
  var PageHeader_default = /* @__PURE__ */ defineComponent({
@@ -1820,17 +1745,17 @@ var PageHeader_default = /* @__PURE__ */ defineComponent({
1820
1745
  * each other.
1821
1746
  */
1822
1747
  return (_ctx, _cache) => {
1823
- return openBlock(), createElementBlock("header", _hoisted_1$34, [
1824
- createElementVNode("div", _hoisted_2$30, [renderSlot(_ctx.$slots, "left")]),
1825
- createElementVNode("h1", _hoisted_3$18, [renderSlot(_ctx.$slots, "title", {}, () => [createElementVNode("span", _hoisted_4$14, toDisplayString(__props.title), 1)])]),
1826
- createElementVNode("div", _hoisted_5$9, [renderSlot(_ctx.$slots, "right")])
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)])]),
1751
+ createElementVNode("div", _hoisted_5$8, [renderSlot(_ctx.$slots, "right")])
1827
1752
  ]);
1828
1753
  };
1829
1754
  }
1830
1755
  });
1831
1756
  //#endregion
1832
1757
  //#region src/components/ProgressBar.vue?vue&type=script&setup=true&lang.ts
1833
- var _hoisted_1$33 = ["aria-valuenow", "aria-label"];
1758
+ var _hoisted_1$34 = ["aria-valuenow", "aria-label"];
1834
1759
  //#endregion
1835
1760
  //#region src/components/ProgressBar.vue
1836
1761
  var ProgressBar_default = /* @__PURE__ */ defineComponent({
@@ -1862,24 +1787,24 @@ var ProgressBar_default = /* @__PURE__ */ defineComponent({
1862
1787
  }, [createElementVNode("div", {
1863
1788
  class: "bg-primary h-full rounded-full transition-[width] duration-700 ease-out",
1864
1789
  style: normalizeStyle({ width: `${portion.value}%` })
1865
- }, null, 4)], 10, _hoisted_1$33);
1790
+ }, null, 4)], 10, _hoisted_1$34);
1866
1791
  };
1867
1792
  }
1868
1793
  });
1869
1794
  //#endregion
1870
1795
  //#region src/components/PriceCard.vue?vue&type=script&setup=true&lang.ts
1871
- var _hoisted_1$32 = {
1796
+ var _hoisted_1$33 = {
1872
1797
  key: 0,
1873
1798
  class: "bg-primary rounded-cell text-on-primary absolute -top-3 left-7 px-3 py-1 text-[0.7rem] font-semibold"
1874
1799
  };
1875
- var _hoisted_2$29 = { class: "flex items-start justify-between gap-4" };
1876
- var _hoisted_3$17 = { class: "text-ink mt-5 text-lg font-semibold" };
1877
- var _hoisted_4$13 = {
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" };
1802
+ var _hoisted_4$12 = {
1878
1803
  key: 1,
1879
1804
  class: "text-ink-soft mt-1.5 text-sm leading-relaxed"
1880
1805
  };
1881
- var _hoisted_5$8 = { class: "mt-6 flex items-baseline gap-1.5" };
1882
- var _hoisted_6$7 = { class: "text-ink text-3xl font-semibold tracking-tight tabular-nums" };
1806
+ var _hoisted_5$7 = { class: "mt-6 flex items-baseline gap-1.5" };
1807
+ var _hoisted_6$6 = { class: "text-ink text-3xl font-semibold tracking-tight tabular-nums" };
1883
1808
  var _hoisted_7$3 = {
1884
1809
  key: 0,
1885
1810
  class: "text-ink-soft text-sm"
@@ -1943,17 +1868,17 @@ var PriceCard_default = /* @__PURE__ */ defineComponent({
1943
1868
  const palette = computed(() => TONE[__props.tone]);
1944
1869
  return (_ctx, _cache) => {
1945
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"]]) }, [
1946
- __props.badge && __props.recommended ? (openBlock(), createElementBlock("span", _hoisted_1$32, toDisplayString(__props.badge), 1)) : createCommentVNode("", true),
1947
- createElementVNode("div", _hoisted_2$29, [_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", {
1948
1873
  key: 0,
1949
1874
  class: normalizeClass(["rounded-card grid size-11 place-items-center text-xl", palette.value.icon])
1950
1875
  }, [renderSlot(_ctx.$slots, "icon")], 2)) : createCommentVNode("", true), __props.chip ? (openBlock(), createElementBlock("span", {
1951
1876
  key: 1,
1952
1877
  class: normalizeClass(["rounded-cell ml-auto px-2.5 py-1 text-[0.7rem] font-medium", palette.value.soft])
1953
1878
  }, toDisplayString(__props.chip), 3)) : createCommentVNode("", true)]),
1954
- createElementVNode("h3", _hoisted_3$17, toDisplayString(__props.name), 1),
1955
- __props.lead ? (openBlock(), createElementBlock("p", _hoisted_4$13, toDisplayString(__props.lead), 1)) : createCommentVNode("", true),
1956
- createElementVNode("p", _hoisted_5$8, [createElementVNode("span", _hoisted_6$7, toDisplayString(__props.price), 1), __props.period ? (openBlock(), createElementBlock("span", _hoisted_7$3, toDisplayString(__props.period), 1)) : createCommentVNode("", true)]),
1879
+ createElementVNode("h3", _hoisted_3$18, toDisplayString(__props.name), 1),
1880
+ __props.lead ? (openBlock(), createElementBlock("p", _hoisted_4$12, toDisplayString(__props.lead), 1)) : createCommentVNode("", true),
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)]),
1957
1882
  __props.note ? (openBlock(), createElementBlock("p", _hoisted_8$2, toDisplayString(__props.note), 1)) : createCommentVNode("", true),
1958
1883
  createElementVNode("ul", _hoisted_9$2, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.features, (feature) => {
1959
1884
  return openBlock(), createElementBlock("li", {
@@ -1968,8 +1893,8 @@ var PriceCard_default = /* @__PURE__ */ defineComponent({
1968
1893
  });
1969
1894
  //#endregion
1970
1895
  //#region src/components/ToneDot.vue?vue&type=script&setup=true&lang.ts
1971
- var _hoisted_1$31 = { class: "inline-flex items-center gap-1.5" };
1972
- var _hoisted_2$28 = {
1896
+ var _hoisted_1$32 = { class: "inline-flex items-center gap-1.5" };
1897
+ var _hoisted_2$29 = {
1973
1898
  key: 0,
1974
1899
  class: "text-ink-soft text-xs font-medium"
1975
1900
  };
@@ -1990,13 +1915,13 @@ var ToneDot_default = /* @__PURE__ */ defineComponent({
1990
1915
  * priorities — without this component knowing about any of them.
1991
1916
  */
1992
1917
  return (_ctx, _cache) => {
1993
- return openBlock(), createElementBlock("span", _hoisted_1$31, [createElementVNode("span", { class: normalizeClass(["size-2 rounded-full", __props.fill]) }, null, 2), __props.label ? (openBlock(), createElementBlock("span", _hoisted_2$28, 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)]);
1994
1919
  };
1995
1920
  }
1996
1921
  });
1997
1922
  //#endregion
1998
1923
  //#region src/components/SectionHeading.vue?vue&type=script&setup=true&lang.ts
1999
- var _hoisted_1$30 = {
1924
+ var _hoisted_1$31 = {
2000
1925
  key: 0,
2001
1926
  class: "text-ink-soft text-xs tabular-nums"
2002
1927
  };
@@ -2014,15 +1939,15 @@ var SectionHeading_default = /* @__PURE__ */ defineComponent({
2014
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]) }, [
2015
1940
  createVNode(ToneDot_default, { fill: __props.tone.fill }, null, 8, ["fill"]),
2016
1941
  createElementVNode("span", { class: normalizeClass(["text-xs font-semibold tracking-wide uppercase", __props.tone.text]) }, toDisplayString(__props.label), 3),
2017
- __props.count > 0 ? (openBlock(), createElementBlock("span", _hoisted_1$30, toDisplayString(__props.count), 1)) : createCommentVNode("", true)
1942
+ __props.count > 0 ? (openBlock(), createElementBlock("span", _hoisted_1$31, toDisplayString(__props.count), 1)) : createCommentVNode("", true)
2018
1943
  ], 2);
2019
1944
  };
2020
1945
  }
2021
1946
  });
2022
1947
  //#endregion
2023
1948
  //#region src/components/SegmentedControl.vue?vue&type=script&setup=true&lang.ts
2024
- var _hoisted_1$29 = { class: "bg-muted rounded-card flex w-full gap-1 p-1" };
2025
- var _hoisted_2$27 = ["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"];
2026
1951
  //#endregion
2027
1952
  //#region src/components/SegmentedControl.vue
2028
1953
  var SegmentedControl_default = /* @__PURE__ */ defineComponent({
@@ -2036,7 +1961,7 @@ var SegmentedControl_default = /* @__PURE__ */ defineComponent({
2036
1961
  const model = useModel(__props, "modelValue");
2037
1962
  const name = useId();
2038
1963
  return (_ctx, _cache) => {
2039
- return openBlock(), createElementBlock("div", _hoisted_1$29, [(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) => {
2040
1965
  return openBlock(), createElementBlock("label", {
2041
1966
  key: String(option.value),
2042
1967
  class: "flex-1 cursor-pointer"
@@ -2046,18 +1971,18 @@ var SegmentedControl_default = /* @__PURE__ */ defineComponent({
2046
1971
  value: option.value,
2047
1972
  name: unref(name),
2048
1973
  class: "peer sr-only"
2049
- }, null, 8, _hoisted_2$27), [[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)]);
2050
1975
  }), 128))]);
2051
1976
  };
2052
1977
  }
2053
1978
  });
2054
1979
  //#endregion
2055
1980
  //#region src/components/SkeletonList.vue?vue&type=script&setup=true&lang.ts
2056
- var _hoisted_1$28 = {
1981
+ var _hoisted_1$29 = {
2057
1982
  role: "status",
2058
1983
  class: "flex flex-col gap-1"
2059
1984
  };
2060
- var _hoisted_2$26 = { class: "sr-only" };
1985
+ var _hoisted_2$27 = { class: "sr-only" };
2061
1986
  //#endregion
2062
1987
  //#region src/components/SkeletonList.vue
2063
1988
  var SkeletonList_default = /* @__PURE__ */ defineComponent({
@@ -2071,7 +1996,7 @@ var SkeletonList_default = /* @__PURE__ */ defineComponent({
2071
1996
  /** A length starts with a digit, a dot, or opens a CSS function. */
2072
1997
  const isLength = computed(() => /^(?:[.\d]|calc\(|var\(|clamp\(|min\(|max\()/.test(__props.rowHeight));
2073
1998
  return (_ctx, _cache) => {
2074
- return openBlock(), createElementBlock("div", _hoisted_1$28, [createElementVNode("span", _hoisted_2$26, 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) => {
2075
2000
  return openBlock(), createElementBlock("div", {
2076
2001
  key: row,
2077
2002
  class: normalizeClass(["bg-muted rounded-card animate-pulse", isLength.value ? void 0 : __props.rowHeight]),
@@ -2084,10 +2009,10 @@ var SkeletonList_default = /* @__PURE__ */ defineComponent({
2084
2009
  });
2085
2010
  //#endregion
2086
2011
  //#region src/components/StatCard.vue?vue&type=script&setup=true&lang.ts
2087
- var _hoisted_1$27 = { class: "surface rounded-card flex flex-1 flex-col gap-0.5 p-3" };
2088
- var _hoisted_2$25 = { class: "flex items-baseline gap-1" };
2089
- var _hoisted_3$16 = { class: "text-ink text-xl font-semibold tabular-nums" };
2090
- var _hoisted_4$12 = { class: "text-ink-soft text-xs" };
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" };
2015
+ var _hoisted_4$11 = { class: "text-ink-soft text-xs" };
2091
2016
  //#endregion
2092
2017
  //#region src/components/StatCard.vue
2093
2018
  var StatCard_default = /* @__PURE__ */ defineComponent({
@@ -2104,22 +2029,22 @@ var StatCard_default = /* @__PURE__ */ defineComponent({
2104
2029
  flat: ArrowRight
2105
2030
  };
2106
2031
  return (_ctx, _cache) => {
2107
- return openBlock(), createElementBlock("div", _hoisted_1$27, [createElementVNode("div", _hoisted_2$25, [createElementVNode("span", _hoisted_3$16, 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]), {
2108
2033
  key: 0,
2109
2034
  class: "text-ink-soft size-3"
2110
- })) : createCommentVNode("", true)]), createElementVNode("span", _hoisted_4$12, toDisplayString(__props.label), 1)]);
2035
+ })) : createCommentVNode("", true)]), createElementVNode("span", _hoisted_4$11, toDisplayString(__props.label), 1)]);
2111
2036
  };
2112
2037
  }
2113
2038
  });
2114
2039
  //#endregion
2115
2040
  //#region src/components/ToastHost.vue?vue&type=script&setup=true&lang.ts
2116
- var _hoisted_1$26 = [
2041
+ var _hoisted_1$27 = [
2117
2042
  "onMouseenter",
2118
2043
  "onMouseleave",
2119
2044
  "onFocusin",
2120
2045
  "onFocusout"
2121
2046
  ];
2122
- var _hoisted_2$24 = { class: "flex-1 text-sm leading-snug" };
2047
+ var _hoisted_2$25 = { class: "flex-1 text-sm leading-snug" };
2123
2048
  //#endregion
2124
2049
  //#region src/components/ToastHost.vue
2125
2050
  var ToastHost_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
@@ -2180,7 +2105,7 @@ var ToastHost_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
2180
2105
  class: normalizeClass(["mt-0.5 size-5 shrink-0", TONE_CLASS[toast.tone]]),
2181
2106
  "aria-hidden": "true"
2182
2107
  }, null, 8, ["class"])),
2183
- createElementVNode("p", _hoisted_2$24, toDisplayString(toast.message), 1),
2108
+ createElementVNode("p", _hoisted_2$25, toDisplayString(toast.message), 1),
2184
2109
  toast.action ? (openBlock(), createBlock(BaseButton_default, {
2185
2110
  key: 0,
2186
2111
  variant: "link",
@@ -2203,7 +2128,7 @@ var ToastHost_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
2203
2128
  default: withCtx(() => [createVNode(unref(X), { class: "size-4" })]),
2204
2129
  _: 1
2205
2130
  }, 8, ["aria-label", "onClick"])
2206
- ], 40, _hoisted_1$26);
2131
+ ], 40, _hoisted_1$27);
2207
2132
  }), 128))]),
2208
2133
  _: 1
2209
2134
  })], 2)])) : createCommentVNode("", true);
@@ -2212,8 +2137,8 @@ var ToastHost_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
2212
2137
  }), [["__scopeId", "data-v-737eb240"]]);
2213
2138
  //#endregion
2214
2139
  //#region src/components/LocaleLinks.vue?vue&type=script&setup=true&lang.ts
2215
- var _hoisted_1$25 = ["aria-label"];
2216
- var _hoisted_2$23 = [
2140
+ var _hoisted_1$26 = ["aria-label"];
2141
+ var _hoisted_2$24 = [
2217
2142
  "lang",
2218
2143
  "aria-pressed",
2219
2144
  "onClick"
@@ -2257,17 +2182,17 @@ var LocaleLinks_default = /* @__PURE__ */ defineComponent({
2257
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"]),
2258
2183
  "aria-pressed": preference.value === locale,
2259
2184
  onClick: ($event) => preference.value = locale
2260
- }, toDisplayString(__props.labels[locale]), 11, _hoisted_2$23);
2261
- }), 128))], 8, _hoisted_1$25);
2185
+ }, toDisplayString(__props.labels[locale]), 11, _hoisted_2$24);
2186
+ }), 128))], 8, _hoisted_1$26);
2262
2187
  };
2263
2188
  }
2264
2189
  });
2265
2190
  //#endregion
2266
2191
  //#region src/components/TabBar.vue?vue&type=script&setup=true&lang.ts
2267
- var _hoisted_1$24 = { class: "tab-bar" };
2268
- var _hoisted_2$22 = ["aria-label"];
2269
- var _hoisted_3$15 = { class: "tab-icon-slot" };
2270
- var _hoisted_4$11 = { class: "tab-label" };
2192
+ var _hoisted_1$25 = { class: "tab-bar" };
2193
+ var _hoisted_2$23 = ["aria-label"];
2194
+ var _hoisted_3$16 = { class: "tab-icon-slot" };
2195
+ var _hoisted_4$10 = { class: "tab-label" };
2271
2196
  //#endregion
2272
2197
  //#region src/components/TabBar.vue
2273
2198
  var TabBar_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
@@ -2279,7 +2204,7 @@ var TabBar_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
2279
2204
  },
2280
2205
  setup(__props) {
2281
2206
  return (_ctx, _cache) => {
2282
- return openBlock(), createElementBlock("header", _hoisted_1$24, [createElementVNode("nav", {
2207
+ return openBlock(), createElementBlock("header", _hoisted_1$25, [createElementVNode("nav", {
2283
2208
  class: "tab-bar-inner",
2284
2209
  "aria-label": __props.label || void 0
2285
2210
  }, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item) => {
@@ -2290,28 +2215,28 @@ var TabBar_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
2290
2215
  "aria-current": item.key === __props.active ? "page" : void 0,
2291
2216
  onClick: _cache[0] || (_cache[0] = ($event) => unref(tapFeedback)())
2292
2217
  }, {
2293
- default: withCtx(() => [createElementVNode("span", _hoisted_3$15, [(openBlock(), createBlock(resolveDynamicComponent(item.icon), { class: "tab-icon" }))]), createElementVNode("span", _hoisted_4$11, 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)]),
2294
2219
  _: 2
2295
2220
  }, 1032, [
2296
2221
  "to",
2297
2222
  "class",
2298
2223
  "aria-current"
2299
2224
  ]);
2300
- }), 128))], 8, _hoisted_2$22)]);
2225
+ }), 128))], 8, _hoisted_2$23)]);
2301
2226
  };
2302
2227
  }
2303
2228
  }), [["__scopeId", "data-v-a76891c4"]]);
2304
2229
  //#endregion
2305
2230
  //#region src/components/ActivityGrid.vue?vue&type=script&setup=true&lang.ts
2306
- var _hoisted_1$23 = ["aria-label"];
2307
- var _hoisted_2$21 = ["colspan"];
2308
- var _hoisted_3$14 = {
2231
+ var _hoisted_1$24 = ["aria-label"];
2232
+ var _hoisted_2$22 = ["colspan"];
2233
+ var _hoisted_3$15 = {
2309
2234
  scope: "row",
2310
2235
  class: "rk-activity-weekday"
2311
2236
  };
2312
- var _hoisted_4$10 = { class: "sr-only" };
2313
- var _hoisted_5$7 = ["tabindex", "aria-label"];
2314
- var _hoisted_6$6 = {
2237
+ var _hoisted_4$9 = { class: "sr-only" };
2238
+ var _hoisted_5$6 = ["tabindex", "aria-label"];
2239
+ var _hoisted_6$5 = {
2315
2240
  key: 1,
2316
2241
  class: "rk-activity-cell is-blank",
2317
2242
  "aria-hidden": "true"
@@ -2468,9 +2393,9 @@ var ActivityGrid_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
2468
2393
  key: month.key,
2469
2394
  colspan: month.span,
2470
2395
  scope: "colgroup"
2471
- }, toDisplayString(month.label), 9, _hoisted_2$21);
2396
+ }, toDisplayString(month.label), 9, _hoisted_2$22);
2472
2397
  }), 128))])]), createElementVNode("tbody", null, [(openBlock(true), createElementBlock(Fragment, null, renderList(weekdays.value, (weekday, row) => {
2473
- return openBlock(), createElementBlock("tr", { key: weekday }, [createElementVNode("th", _hoisted_3$14, [createElementVNode("span", _hoisted_4$10, 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) => {
2474
2399
  return openBlock(), createElementBlock(Fragment, { key: column }, [week[row] ? (openBlock(), createElementBlock("td", mergeProps({
2475
2400
  key: 0,
2476
2401
  class: "rk-activity-cell"
@@ -2478,168 +2403,16 @@ var ActivityGrid_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
2478
2403
  tabindex: cells.value[focused.value]?.day === week[row] ? 0 : -1,
2479
2404
  "aria-label": __props.dayLabel(week[row]),
2480
2405
  class: [__props.levelFor(week[row]), { "is-pickable": __props.isSelectable?.(week[row]) }]
2481
- }), null, 16, _hoisted_5$7)) : (openBlock(), createElementBlock("td", _hoisted_6$6))], 64);
2406
+ }), null, 16, _hoisted_5$6)) : (openBlock(), createElementBlock("td", _hoisted_6$5))], 64);
2482
2407
  }), 128))]);
2483
- }), 128))])], 40, _hoisted_1$23)], 512);
2408
+ }), 128))])], 40, _hoisted_1$24)], 512);
2484
2409
  };
2485
2410
  }
2486
2411
  }), [["__scopeId", "data-v-9f622328"]]);
2487
2412
  //#endregion
2488
- //#region src/components/ScrollArea.vue?vue&type=script&setup=true&lang.ts
2489
- var _hoisted_1$22 = { class: "rk-scroll" };
2490
- var _hoisted_2$20 = [
2491
- "tabindex",
2492
- "role",
2493
- "aria-label"
2494
- ];
2495
- var _hoisted_3$13 = {
2496
- key: 0,
2497
- class: "rk-scroll-fade is-start-x",
2498
- "aria-hidden": "true"
2499
- };
2500
- var _hoisted_4$9 = {
2501
- key: 1,
2502
- class: "rk-scroll-fade is-end-x",
2503
- "aria-hidden": "true"
2504
- };
2505
- var _hoisted_5$6 = {
2506
- key: 2,
2507
- class: "rk-scroll-fade is-start-y",
2508
- "aria-hidden": "true"
2509
- };
2510
- var _hoisted_6$5 = {
2511
- key: 3,
2512
- class: "rk-scroll-fade is-end-y",
2513
- "aria-hidden": "true"
2514
- };
2515
- /**
2516
- * A box that scrolls, with the two things a hand-written one leaves out.
2517
- *
2518
- * ## The edge fade is the affordance `no-scrollbar` takes away
2519
- *
2520
- * Every app here hides the scrollbar on a horizontal row — a strip of
2521
- * months, a row of filter chips — because a native bar under a 40px row is
2522
- * louder than the row. What goes with it is the only sign on screen that
2523
- * there is anything further along. So the fades are driven by the actual
2524
- * scroll position: one appears at an edge exactly when there is content
2525
- * past it, and both are gone when everything fits.
2526
- *
2527
- * ## A focus stop, but only when there is no other way in
2528
- *
2529
- * A box that scrolls and cannot take focus cannot be scrolled by a
2530
- * keyboard, so the far end is simply unreachable. That is the fault
2531
- * `CodeBlock` was written for, and it is not about code: it is true of any
2532
- * scrolling box whose contents are not focusable.
2533
- *
2534
- * But it is *only* true of those. A row of buttons already moves under the
2535
- * keyboard — Tab scrolls the next one into view — and giving that row a
2536
- * stop of its own costs a press for nothing, on every row. So this checks:
2537
- * it becomes a named region when it overflows **and** holds nothing
2538
- * focusable, and stays out of the tab order otherwise.
2539
- *
2540
- * The check runs when the box or its contents resize, which covers a list
2541
- * that arrives from a server. A swap that changes neither size — the same
2542
- * number of rows, buttons turned into plain text — will not be noticed;
2543
- * that is a trade against watching every mutation of a scroll container,
2544
- * and the shape it misses is a rare one.
2545
- */
2546
- var FOCUSABLE$1 = "a[href], button, input, select, textarea, summary, [tabindex]:not([tabindex=\"-1\"])";
2547
- //#endregion
2548
- //#region src/components/ScrollArea.vue
2549
- var ScrollArea_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
2550
- __name: "ScrollArea",
2551
- props: {
2552
- label: {},
2553
- axis: { default: "y" },
2554
- scrollbar: { default: "auto" },
2555
- fade: {
2556
- type: Boolean,
2557
- default: true
2558
- },
2559
- drag: {
2560
- type: Boolean,
2561
- default: false
2562
- }
2563
- },
2564
- emits: ["scroll"],
2565
- setup(__props, { expose: __expose, emit: __emit }) {
2566
- const emit = __emit;
2567
- const viewport = useTemplateRef("viewport");
2568
- /** Anything that takes focus on its own, so the box does not need to. */
2569
- const horizontal = computed(() => __props.axis === "x" || __props.axis === "both");
2570
- const vertical = computed(() => __props.axis === "y" || __props.axis === "both");
2571
- const start = ref({
2572
- x: false,
2573
- y: false
2574
- });
2575
- const end = ref({
2576
- x: false,
2577
- y: false
2578
- });
2579
- const overflows = ref(false);
2580
- const hasFocusable = ref(true);
2581
- function measure() {
2582
- const element = viewport.value;
2583
- if (!element) return;
2584
- const overX = element.scrollWidth - element.clientWidth;
2585
- const overY = element.scrollHeight - element.clientHeight;
2586
- const slack = 1;
2587
- const alongX = Math.abs(element.scrollLeft);
2588
- start.value = {
2589
- x: alongX > slack,
2590
- y: element.scrollTop > slack
2591
- };
2592
- end.value = {
2593
- x: overX - alongX > slack,
2594
- y: overY - element.scrollTop > slack
2595
- };
2596
- overflows.value = horizontal.value && overX > slack || vertical.value && overY > slack;
2597
- hasFocusable.value = element.querySelector(FOCUSABLE$1) !== null;
2598
- }
2599
- function onScroll(event) {
2600
- measure();
2601
- emit("scroll", event);
2602
- }
2603
- /** The box itself is the way in only when nothing inside it is. */
2604
- const isStop = computed(() => overflows.value && !hasFocusable.value);
2605
- let observer = null;
2606
- watchEffect(() => {
2607
- observer?.disconnect();
2608
- observer = null;
2609
- const element = viewport.value;
2610
- if (!element || typeof ResizeObserver === "undefined") return;
2611
- observer = new ResizeObserver(measure);
2612
- observer.observe(element);
2613
- for (const child of element.children) observer.observe(child);
2614
- measure();
2615
- });
2616
- onScopeDispose(() => observer?.disconnect());
2617
- useDragScroll(computed(() => __props.drag ? viewport.value : null));
2618
- __expose({
2619
- /** The element that actually scrolls, for a parent that has to measure it. */
2620
- viewport });
2621
- return (_ctx, _cache) => {
2622
- return openBlock(), createElementBlock("div", _hoisted_1$22, [createElementVNode("div", {
2623
- ref_key: "viewport",
2624
- ref: viewport,
2625
- class: normalizeClass(["rk-scroll-viewport", [`is-${__props.axis}`, { "no-scrollbar": __props.scrollbar === "hidden" }]]),
2626
- tabindex: isStop.value ? 0 : void 0,
2627
- role: isStop.value ? "region" : void 0,
2628
- "aria-label": isStop.value ? __props.label : void 0,
2629
- onScroll
2630
- }, [renderSlot(_ctx.$slots, "default", {}, void 0, true)], 42, _hoisted_2$20), __props.fade ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
2631
- horizontal.value && start.value.x ? (openBlock(), createElementBlock("span", _hoisted_3$13)) : createCommentVNode("", true),
2632
- horizontal.value && end.value.x ? (openBlock(), createElementBlock("span", _hoisted_4$9)) : createCommentVNode("", true),
2633
- vertical.value && start.value.y ? (openBlock(), createElementBlock("span", _hoisted_5$6)) : createCommentVNode("", true),
2634
- vertical.value && end.value.y ? (openBlock(), createElementBlock("span", _hoisted_6$5)) : createCommentVNode("", true)
2635
- ], 64)) : createCommentVNode("", true)]);
2636
- };
2637
- }
2638
- }), [["__scopeId", "data-v-4c21cdc9"]]);
2639
- //#endregion
2640
2413
  //#region src/components/VirtualList.vue?vue&type=script&setup=true&lang.ts
2641
- var _hoisted_1$21 = ["aria-label"];
2642
- var _hoisted_2$19 = ["aria-setsize", "aria-posinset"];
2414
+ var _hoisted_1$23 = ["aria-label"];
2415
+ var _hoisted_2$21 = ["aria-setsize", "aria-posinset"];
2643
2416
  //#endregion
2644
2417
  //#region src/components/VirtualList.vue
2645
2418
  var VirtualList_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
@@ -2707,14 +2480,14 @@ var VirtualList_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
2707
2480
  }, [renderSlot(_ctx.$slots, "default", {
2708
2481
  item: row.item,
2709
2482
  index: row.index
2710
- }, void 0, true)], 12, _hoisted_2$19);
2483
+ }, void 0, true)], 12, _hoisted_2$21);
2711
2484
  }), 128)),
2712
2485
  unref(padBottom) > 0 ? (openBlock(), createElementBlock("li", {
2713
2486
  key: 1,
2714
2487
  style: normalizeStyle({ height: `${unref(padBottom)}px` }),
2715
2488
  "aria-hidden": "true"
2716
2489
  }, null, 4)) : createCommentVNode("", true)
2717
- ], 8, _hoisted_1$21)]),
2490
+ ], 8, _hoisted_1$23)]),
2718
2491
  _: 3
2719
2492
  }, 8, [
2720
2493
  "label",
@@ -2725,6 +2498,131 @@ var VirtualList_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
2725
2498
  }
2726
2499
  }), [["__scopeId", "data-v-936ed40c"]]);
2727
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
2728
2626
  //#region src/components/AvatarStack.vue?vue&type=script&setup=true&lang.ts
2729
2627
  var _hoisted_1$20 = ["aria-label"];
2730
2628
  var _hoisted_2$18 = {
@@ -2768,7 +2666,7 @@ var AvatarStack_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
2768
2666
  }), 128)), rest.value ? (openBlock(), createElementBlock("span", _hoisted_2$18, "+" + toDisplayString(rest.value), 1)) : createCommentVNode("", true)], 10, _hoisted_1$20);
2769
2667
  };
2770
2668
  }
2771
- }), [["__scopeId", "data-v-db629481"]]);
2669
+ }), [["__scopeId", "data-v-1f87913c"]]);
2772
2670
  //#endregion
2773
2671
  //#region src/components/BaseCalendar.vue?vue&type=script&setup=true&lang.ts
2774
2672
  var _hoisted_1$19 = { class: "rk-cal" };
@@ -3721,7 +3619,7 @@ var FileDrop_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PUR
3721
3619
  ]);
3722
3620
  };
3723
3621
  }
3724
- }), [["__scopeId", "data-v-a42eab69"]]);
3622
+ }), [["__scopeId", "data-v-6e903baf"]]);
3725
3623
  //#endregion
3726
3624
  //#region src/components/TagsInput.vue?vue&type=script&setup=true&lang.ts
3727
3625
  var _hoisted_1$9 = [
@@ -3978,7 +3876,7 @@ var BasePopover_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
3978
3876
  })], 544);
3979
3877
  };
3980
3878
  }
3981
- }), [["__scopeId", "data-v-1371bff2"]]);
3879
+ }), [["__scopeId", "data-v-22d8f397"]]);
3982
3880
  //#endregion
3983
3881
  //#region src/components/TimePicker.vue?vue&type=script&setup=true&lang.ts
3984
3882
  var _hoisted_1$7 = [
@@ -4123,7 +4021,7 @@ var TimePicker_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
4123
4021
  ]);
4124
4022
  };
4125
4023
  }
4126
- }), [["__scopeId", "data-v-0037adb2"]]);
4024
+ }), [["__scopeId", "data-v-ad58b4f3"]]);
4127
4025
  //#endregion
4128
4026
  //#region src/components/BaseTimeline.vue?vue&type=script&setup=true&lang.ts
4129
4027
  var _hoisted_1$6 = ["aria-label"];
@@ -4177,7 +4075,7 @@ var BaseTimeline_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
4177
4075
  }), 128))], 8, _hoisted_1$6);
4178
4076
  };
4179
4077
  }
4180
- }), [["__scopeId", "data-v-08b15ce8"]]);
4078
+ }), [["__scopeId", "data-v-8a452f82"]]);
4181
4079
  //#endregion
4182
4080
  //#region src/components/BaseDatePicker.vue?vue&type=script&setup=true&lang.ts
4183
4081
  var _hoisted_1$5 = [
@@ -4324,7 +4222,7 @@ var BaseDatePicker_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/*
4324
4222
  ]);
4325
4223
  };
4326
4224
  }
4327
- }), [["__scopeId", "data-v-154e27fb"]]);
4225
+ }), [["__scopeId", "data-v-42390973"]]);
4328
4226
  //#endregion
4329
4227
  //#region src/components/BasePopconfirm.vue?vue&type=script&setup=true&lang.ts
4330
4228
  var _hoisted_1$4 = { class: "rk-confirm" };
@@ -4790,7 +4688,7 @@ var BaseStepper_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
4790
4688
  }), 128))], 2)], 8, _hoisted_1);
4791
4689
  };
4792
4690
  }
4793
- }), [["__scopeId", "data-v-6aa3221b"]]);
4691
+ }), [["__scopeId", "data-v-f7513d9a"]]);
4794
4692
  //#endregion
4795
4693
  //#region src/i18n/runtime.ts
4796
4694
  /**
@@ -4884,7 +4782,10 @@ function createI18nRuntime(options) {
4884
4782
  watchEffect(() => {
4885
4783
  core.locale.value = activeLocale.value;
4886
4784
  setFormatLocale(intlLocale.value);
4887
- 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
+ }
4888
4789
  });
4889
4790
  /** Read and write the language preference. */
4890
4791
  function useLocalePreference() {
@@ -4934,8 +4835,8 @@ function createI18nRuntime(options) {
4934
4835
  *
4935
4836
  * The fallback keeps `vitest` and `vite dev` honest, where no define runs.
4936
4837
  */
4937
- var VERSION = "2.21.0";
4838
+ var VERSION = "2.22.0";
4938
4839
  //#endregion
4939
- 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, 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, 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 };
4940
4841
 
4941
4842
  //# sourceMappingURL=index.js.map