rei-kit 2.23.0 → 2.24.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
- import { n as formatNumber, r as setFormatLocale, t as formatDate } from "./format-BEvBK1SJ.js";
2
+ import { a as formatNumber, i as formatDate, o as setFormatLocale, r as watchVisibility } from "./environment-Cz5KiC1t.js";
3
3
  import { a as BaseCheckbox_default, c as useBoundValue, d as ensureSheetRoot, i as textDirection, l as useVisualViewport, n as elementDirection, o as BaseSheet_default, r as horizontalStep, t as focusTarget, u as SHEET_ROOT_ID } from "./focus-target-DRgd8UnQ.js";
4
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-qM0ZD9Ey.js";
5
5
  import { n as registerErrorMapper, r as toAppError, t as AppError } from "./app-error-DF9cijE0.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-BrIZxUmx.js";
6
+ import { a as BaseSkeleton_default, c as useMediaQuery, l as useDragScroll, n as ScrollArea_default, o as useMenuKeys, s as useAnchoredPanel, t as BaseListbox_default } from "./BaseListbox-BQoSwYdJ.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";
@@ -272,17 +272,17 @@ function useDebouncedCallback(callback, delay = 800) {
272
272
  }
273
273
  //#endregion
274
274
  //#region src/components/BaseAvatar.vue?vue&type=script&setup=true&lang.ts
275
- var _hoisted_1$49 = [
275
+ var _hoisted_1$51 = [
276
276
  "role",
277
277
  "aria-label",
278
278
  "aria-hidden"
279
279
  ];
280
- var _hoisted_2$43 = ["src"];
281
- var _hoisted_3$29 = {
280
+ var _hoisted_2$45 = ["src"];
281
+ var _hoisted_3$31 = {
282
282
  key: 1,
283
283
  class: "rk-avatar-initials"
284
284
  };
285
- var _hoisted_4$20 = {
285
+ var _hoisted_4$22 = {
286
286
  key: 2,
287
287
  viewBox: "0 0 20 20",
288
288
  class: "rk-avatar-figure",
@@ -328,7 +328,7 @@ var BaseAvatar_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
328
328
  alt: "",
329
329
  class: "rk-avatar-img",
330
330
  onError: _cache[0] || (_cache[0] = ($event) => broken.value = true)
331
- }, null, 40, _hoisted_2$43)) : __props.fallback === "initials" && initials.value ? (openBlock(), createElementBlock("span", _hoisted_3$29, toDisplayString(initials.value), 1)) : (openBlock(), createElementBlock("svg", _hoisted_4$20, [..._cache[1] || (_cache[1] = [createElementVNode("circle", {
331
+ }, null, 40, _hoisted_2$45)) : __props.fallback === "initials" && initials.value ? (openBlock(), createElementBlock("span", _hoisted_3$31, toDisplayString(initials.value), 1)) : (openBlock(), createElementBlock("svg", _hoisted_4$22, [..._cache[1] || (_cache[1] = [createElementVNode("circle", {
332
332
  cx: "10",
333
333
  cy: "6.75",
334
334
  r: "3.25",
@@ -337,7 +337,7 @@ var BaseAvatar_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
337
337
  d: "M3.75 17c0-3.05 2.8-5.25 6.25-5.25S16.25 13.95 16.25 17",
338
338
  "stroke-width": "1.5",
339
339
  "stroke-linecap": "round"
340
- }, null, -1)])]))], 10, _hoisted_1$49);
340
+ }, null, -1)])]))], 10, _hoisted_1$51);
341
341
  };
342
342
  }
343
343
  }), [["__scopeId", "data-v-47586bec"]]);
@@ -362,12 +362,12 @@ var BaseBadge_default = /* @__PURE__ */ defineComponent({
362
362
  });
363
363
  //#endregion
364
364
  //#region src/components/BaseMenu.vue?vue&type=script&setup=true&lang.ts
365
- var _hoisted_1$48 = [
365
+ var _hoisted_1$50 = [
366
366
  "aria-label",
367
367
  "aria-expanded",
368
368
  "aria-controls"
369
369
  ];
370
- var _hoisted_2$42 = ["id"];
370
+ var _hoisted_2$44 = ["id"];
371
371
  //#endregion
372
372
  //#region src/components/BaseMenu.vue
373
373
  var BaseMenu_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
@@ -389,6 +389,11 @@ var BaseMenu_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PUR
389
389
  const panel = ref(null);
390
390
  const trigger = ref(null);
391
391
  const id = useId();
392
+ const { placed, shift } = useAnchoredPanel({
393
+ root,
394
+ panel,
395
+ open
396
+ });
392
397
  const { items: menuItems, onKeydown: onMenuKeydown } = useMenuKeys({
393
398
  panel,
394
399
  onClose: () => open.value = false
@@ -436,17 +441,18 @@ var BaseMenu_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PUR
436
441
  "aria-haspopup": true,
437
442
  "aria-controls": open.value ? unref(id) : void 0,
438
443
  onClick: _cache[0] || (_cache[0] = ($event) => open.value = !open.value)
439
- }, [renderSlot(_ctx.$slots, "trigger", { open: open.value }, void 0, true)], 8, _hoisted_1$48), open.value ? (openBlock(), createElementBlock("div", {
444
+ }, [renderSlot(_ctx.$slots, "trigger", { open: open.value }, void 0, true)], 8, _hoisted_1$50), open.value ? (openBlock(), createElementBlock("div", {
440
445
  key: 0,
441
446
  id: unref(id),
442
447
  ref_key: "panel",
443
448
  ref: panel,
444
- class: normalizeClass(["rk-menu-panel surface-overlay", `is-${__props.align}`]),
449
+ class: normalizeClass(["rk-menu-panel surface-overlay", [`is-${__props.align}`, `is-${unref(placed)}`]]),
450
+ style: normalizeStyle(unref(shift) ? { "--rk-menu-shift": `${unref(shift)}px` } : void 0),
445
451
  role: "menu"
446
- }, [renderSlot(_ctx.$slots, "default", {}, void 0, true)], 10, _hoisted_2$42)) : createCommentVNode("", true)], 544);
452
+ }, [renderSlot(_ctx.$slots, "default", {}, void 0, true)], 14, _hoisted_2$44)) : createCommentVNode("", true)], 544);
447
453
  };
448
454
  }
449
- }), [["__scopeId", "data-v-eaeecb75"]]);
455
+ }), [["__scopeId", "data-v-657b2528"]]);
450
456
  //#endregion
451
457
  //#region src/components/BaseCard.vue
452
458
  var BaseCard_default = /* @__PURE__ */ defineComponent({
@@ -568,13 +574,13 @@ function useVirtualWindow({ count, rowHeight, threshold }) {
568
574
  }
569
575
  //#endregion
570
576
  //#region src/components/BaseCombobox.vue?vue&type=script&setup=true&lang.ts
571
- var _hoisted_1$47 = ["for"];
572
- var _hoisted_2$41 = [
577
+ var _hoisted_1$49 = ["for"];
578
+ var _hoisted_2$43 = [
573
579
  "aria-label",
574
580
  "disabled",
575
581
  "onClick"
576
582
  ];
577
- var _hoisted_3$28 = [
583
+ var _hoisted_3$30 = [
578
584
  "id",
579
585
  "placeholder",
580
586
  "disabled",
@@ -583,13 +589,13 @@ var _hoisted_3$28 = [
583
589
  "aria-invalid",
584
590
  "aria-describedby"
585
591
  ];
586
- var _hoisted_4$19 = ["disabled"];
587
- var _hoisted_5$11 = [
592
+ var _hoisted_4$21 = ["disabled"];
593
+ var _hoisted_5$12 = [
588
594
  "aria-label",
589
595
  "aria-multiselectable",
590
596
  "aria-busy"
591
597
  ];
592
- var _hoisted_6$7 = [
598
+ var _hoisted_6$8 = [
593
599
  "id",
594
600
  "aria-selected",
595
601
  "aria-setsize",
@@ -597,7 +603,7 @@ var _hoisted_6$7 = [
597
603
  "onPointerdown",
598
604
  "onPointermove"
599
605
  ];
600
- var _hoisted_7$4 = {
606
+ var _hoisted_7$5 = {
601
607
  key: 2,
602
608
  class: "rk-combo-status"
603
609
  };
@@ -667,6 +673,11 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
667
673
  const highlighted = ref(0);
668
674
  const root = ref(null);
669
675
  const list = ref(null);
676
+ const { placed, shift } = useAnchoredPanel({
677
+ root,
678
+ panel: list,
679
+ open
680
+ });
670
681
  const single = computed(() => multiple.value ? void 0 : chosenOptions.value[0]);
671
682
  /**
672
683
  * What the input shows.
@@ -805,7 +816,7 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
805
816
  createElementVNode("label", {
806
817
  for: unref(id),
807
818
  class: "rk-combo-label"
808
- }, toDisplayString(__props.label), 9, _hoisted_1$47),
819
+ }, toDisplayString(__props.label), 9, _hoisted_1$49),
809
820
  createElementVNode("div", { class: normalizeClass(["rk-combo-field", multiple.value ? "is-multiple control" : ""]) }, [
810
821
  (openBlock(true), createElementBlock(Fragment, null, renderList(multiple.value ? chosenOptions.value : [], (option) => {
811
822
  return openBlock(), createElementBlock("span", {
@@ -818,7 +829,7 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
818
829
  "aria-label": __props.removeLabel(option.label),
819
830
  disabled: __props.disabled,
820
831
  onClick: ($event) => remove(option.value)
821
- }, " × ", 8, _hoisted_2$41)) : createCommentVNode("", true)]);
832
+ }, " × ", 8, _hoisted_2$43)) : createCommentVNode("", true)]);
822
833
  }), 128)),
823
834
  withDirectives(createElementVNode("input", {
824
835
  id: unref(id),
@@ -837,7 +848,7 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
837
848
  "aria-describedby": describedBy.value,
838
849
  onKeydown,
839
850
  onFocus: _cache[1] || (_cache[1] = ($event) => open.value = true)
840
- }, null, 42, _hoisted_3$28), [[vModelText, text.value]]),
851
+ }, null, 42, _hoisted_3$30), [[vModelText, text.value]]),
841
852
  createElementVNode("button", {
842
853
  type: "button",
843
854
  class: "rk-combo-toggle",
@@ -845,14 +856,15 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
845
856
  "aria-hidden": "true",
846
857
  disabled: __props.disabled,
847
858
  onClick: _cache[2] || (_cache[2] = ($event) => open.value = !open.value)
848
- }, " ▾ ", 8, _hoisted_4$19)
859
+ }, " ▾ ", 8, _hoisted_4$21)
849
860
  ], 2),
850
861
  withDirectives(createElementVNode("ul", {
851
862
  id: listId,
852
863
  ref_key: "list",
853
864
  ref: list,
854
865
  role: "listbox",
855
- class: "rk-combo-list surface-overlay",
866
+ class: normalizeClass(["rk-combo-list surface-overlay", `is-${unref(placed)}`]),
867
+ style: normalizeStyle(unref(shift) ? { "--rk-combo-shift": `${unref(shift)}px` } : void 0),
856
868
  "aria-label": __props.label,
857
869
  "aria-multiselectable": multiple.value ? true : void 0,
858
870
  "aria-busy": __props.loading ? true : void 0,
@@ -878,21 +890,21 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
878
890
  "aria-posinset": row.index + 1,
879
891
  onPointerdown: withModifiers(($event) => choose(row.option), ["prevent"]),
880
892
  onPointermove: ($event) => highlighted.value = row.index
881
- }, toDisplayString(row.option.label), 47, _hoisted_6$7);
893
+ }, toDisplayString(row.option.label), 47, _hoisted_6$8);
882
894
  }), 128)),
883
895
  unref(padBottom) > 0 ? (openBlock(), createElementBlock("li", {
884
896
  key: 1,
885
897
  style: normalizeStyle({ height: `${unref(padBottom)}px` }),
886
898
  "aria-hidden": "true"
887
899
  }, null, 4)) : createCommentVNode("", true),
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) => {
900
+ __props.loading ? (openBlock(), createElementBlock("li", _hoisted_7$5, [__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) => {
889
901
  return createVNode(BaseSkeleton_default, {
890
902
  key: n,
891
903
  shape: "text",
892
904
  height: "0.75rem"
893
905
  });
894
906
  }), 64))])])) : matches.value.length === 0 ? (openBlock(), createElementBlock("li", _hoisted_10$3, toDisplayString(__props.emptyLabel), 1)) : createCommentVNode("", true)
895
- ], 40, _hoisted_5$11), [[vShow, open.value]]),
907
+ ], 46, _hoisted_5$12), [[vShow, open.value]]),
896
908
  __props.error ? (openBlock(), createElementBlock("p", {
897
909
  key: 0,
898
910
  id: errorId,
@@ -905,16 +917,16 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
905
917
  ], 512);
906
918
  };
907
919
  }
908
- }), [["__scopeId", "data-v-0ae3b425"]]);
920
+ }), [["__scopeId", "data-v-f02a0924"]]);
909
921
  //#endregion
910
922
  //#region src/components/BaseRadioGroup.vue?vue&type=script&setup=true&lang.ts
911
- var _hoisted_1$46 = ["aria-describedby"];
912
- var _hoisted_2$40 = [
923
+ var _hoisted_1$48 = ["aria-describedby"];
924
+ var _hoisted_2$42 = [
913
925
  "name",
914
926
  "value",
915
927
  "disabled"
916
928
  ];
917
- var _hoisted_3$27 = { class: "text-ink text-sm" };
929
+ var _hoisted_3$29 = { class: "text-ink text-sm" };
918
930
  //#endregion
919
931
  //#region src/components/BaseRadioGroup.vue
920
932
  var BaseRadioGroup_default = /* @__PURE__ */ defineComponent({
@@ -958,7 +970,7 @@ var BaseRadioGroup_default = /* @__PURE__ */ defineComponent({
958
970
  value: option.value,
959
971
  disabled: option.disabled,
960
972
  class: "accent-primary focus-visible:outline-primary size-4 shrink-0 focus-visible:outline-2 focus-visible:outline-offset-2"
961
- }, null, 8, _hoisted_2$40), [[vModelRadio, unref(model)]]), createElementVNode("span", _hoisted_3$27, toDisplayString(option.label), 1)], 2);
973
+ }, null, 8, _hoisted_2$42), [[vModelRadio, unref(model)]]), createElementVNode("span", _hoisted_3$29, toDisplayString(option.label), 1)], 2);
962
974
  }), 128)),
963
975
  __props.error ? (openBlock(), createElementBlock("p", {
964
976
  key: 0,
@@ -969,24 +981,24 @@ var BaseRadioGroup_default = /* @__PURE__ */ defineComponent({
969
981
  id: hintId,
970
982
  class: "text-ink-soft text-xs"
971
983
  }, toDisplayString(__props.hint), 1)) : createCommentVNode("", true)
972
- ], 8, _hoisted_1$46);
984
+ ], 8, _hoisted_1$48);
973
985
  };
974
986
  }
975
987
  });
976
988
  //#endregion
977
989
  //#region src/components/BaseSelect.vue?vue&type=script&setup=true&lang.ts
978
- var _hoisted_1$45 = { class: "relative" };
979
- var _hoisted_2$39 = [
990
+ var _hoisted_1$47 = { class: "relative" };
991
+ var _hoisted_2$41 = [
980
992
  "id",
981
993
  "aria-invalid",
982
994
  "aria-describedby"
983
995
  ];
984
- var _hoisted_3$26 = {
996
+ var _hoisted_3$28 = {
985
997
  key: 0,
986
998
  value: void 0,
987
999
  disabled: ""
988
1000
  };
989
- var _hoisted_4$18 = ["value", "disabled"];
1001
+ var _hoisted_4$20 = ["value", "disabled"];
990
1002
  //#endregion
991
1003
  //#region src/components/BaseSelect.vue
992
1004
  var BaseSelect_default = /* @__PURE__ */ defineComponent({
@@ -1022,7 +1034,7 @@ var BaseSelect_default = /* @__PURE__ */ defineComponent({
1022
1034
  "label-hidden": __props.labelHidden,
1023
1035
  size: __props.size
1024
1036
  }, {
1025
- default: withCtx(({ id, describedBy, invalid }) => [createElementVNode("div", _hoisted_1$45, [withDirectives(createElementVNode("select", {
1037
+ default: withCtx(({ id, describedBy, invalid }) => [createElementVNode("div", _hoisted_1$47, [withDirectives(createElementVNode("select", {
1026
1038
  id,
1027
1039
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => model.value = $event),
1028
1040
  "aria-invalid": invalid,
@@ -1032,13 +1044,13 @@ var BaseSelect_default = /* @__PURE__ */ defineComponent({
1032
1044
  __props.variant === "unstyled" ? "" : SIZE_CLASS[__props.size],
1033
1045
  __props.variant !== "unstyled" && invalid ? "border-negative" : ""
1034
1046
  ]])
1035
- }, [__props.placeholder ? (openBlock(), createElementBlock("option", _hoisted_3$26, toDisplayString(__props.placeholder), 1)) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.options, (option) => {
1047
+ }, [__props.placeholder ? (openBlock(), createElementBlock("option", _hoisted_3$28, toDisplayString(__props.placeholder), 1)) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.options, (option) => {
1036
1048
  return openBlock(), createElementBlock("option", {
1037
1049
  key: option.value,
1038
1050
  value: option.value,
1039
1051
  disabled: option.disabled
1040
- }, toDisplayString(option.label), 9, _hoisted_4$18);
1041
- }), 128))], 10, _hoisted_2$39), [[vModelSelect, model.value]]), createVNode(unref(ChevronDown), {
1052
+ }, toDisplayString(option.label), 9, _hoisted_4$20);
1053
+ }), 128))], 10, _hoisted_2$41), [[vModelSelect, model.value]]), createVNode(unref(ChevronDown), {
1042
1054
  class: "text-ink-soft pointer-events-none absolute top-1/2 right-3 size-4 -translate-y-1/2",
1043
1055
  "aria-hidden": "true"
1044
1056
  })])]),
@@ -1055,11 +1067,11 @@ var BaseSelect_default = /* @__PURE__ */ defineComponent({
1055
1067
  });
1056
1068
  //#endregion
1057
1069
  //#region src/components/BaseSlider.vue?vue&type=script&setup=true&lang.ts
1058
- var _hoisted_1$44 = { class: "rk-slider" };
1059
- var _hoisted_2$38 = { class: "rk-slider-head" };
1060
- var _hoisted_3$25 = ["for"];
1061
- var _hoisted_4$17 = ["for"];
1062
- var _hoisted_5$10 = [
1070
+ var _hoisted_1$46 = { class: "rk-slider" };
1071
+ var _hoisted_2$40 = { class: "rk-slider-head" };
1072
+ var _hoisted_3$27 = ["for"];
1073
+ var _hoisted_4$19 = ["for"];
1074
+ var _hoisted_5$11 = [
1063
1075
  "id",
1064
1076
  "min",
1065
1077
  "max",
@@ -1103,15 +1115,15 @@ var BaseSlider_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
1103
1115
  return span <= 0 ? 0 : (model.value - __props.min) / span * 100;
1104
1116
  });
1105
1117
  return (_ctx, _cache) => {
1106
- return openBlock(), createElementBlock("div", _hoisted_1$44, [
1107
- createElementVNode("div", _hoisted_2$38, [createElementVNode("label", {
1118
+ return openBlock(), createElementBlock("div", _hoisted_1$46, [
1119
+ createElementVNode("div", _hoisted_2$40, [createElementVNode("label", {
1108
1120
  for: unref(id),
1109
1121
  class: "rk-slider-label"
1110
- }, toDisplayString(__props.label), 9, _hoisted_3$25), __props.showValue ? (openBlock(), createElementBlock("output", {
1122
+ }, toDisplayString(__props.label), 9, _hoisted_3$27), __props.showValue ? (openBlock(), createElementBlock("output", {
1111
1123
  key: 0,
1112
1124
  for: unref(id),
1113
1125
  class: "rk-slider-value"
1114
- }, toDisplayString(text.value), 9, _hoisted_4$17)) : createCommentVNode("", true)]),
1126
+ }, toDisplayString(text.value), 9, _hoisted_4$19)) : createCommentVNode("", true)]),
1115
1127
  withDirectives(createElementVNode("input", {
1116
1128
  id: unref(id),
1117
1129
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => model.value = $event),
@@ -1124,7 +1136,7 @@ var BaseSlider_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
1124
1136
  "aria-valuetext": text.value,
1125
1137
  "aria-describedby": __props.hint ? hintId : void 0,
1126
1138
  style: normalizeStyle({ "--rk-slider-filled": `${filled.value}%` })
1127
- }, null, 12, _hoisted_5$10), [[
1139
+ }, null, 12, _hoisted_5$11), [[
1128
1140
  vModelText,
1129
1141
  model.value,
1130
1142
  void 0,
@@ -1141,8 +1153,8 @@ var BaseSlider_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
1141
1153
  }), [["__scopeId", "data-v-8f8ae87b"]]);
1142
1154
  //#endregion
1143
1155
  //#region src/components/NumberInput.vue?vue&type=script&setup=true&lang.ts
1144
- var _hoisted_1$43 = ["aria-label", "disabled"];
1145
- var _hoisted_2$37 = [
1156
+ var _hoisted_1$45 = ["aria-label", "disabled"];
1157
+ var _hoisted_2$39 = [
1146
1158
  "id",
1147
1159
  "value",
1148
1160
  "aria-valuenow",
@@ -1152,7 +1164,7 @@ var _hoisted_2$37 = [
1152
1164
  "aria-describedby",
1153
1165
  "disabled"
1154
1166
  ];
1155
- var _hoisted_3$24 = ["aria-label", "disabled"];
1167
+ var _hoisted_3$26 = ["aria-label", "disabled"];
1156
1168
  //#endregion
1157
1169
  //#region src/components/NumberInput.vue
1158
1170
  var NumberInput_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
@@ -1255,7 +1267,7 @@ var NumberInput_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
1255
1267
  }, [createVNode(unref(Minus), {
1256
1268
  class: "size-4",
1257
1269
  "aria-hidden": "true"
1258
- })], 8, _hoisted_1$43),
1270
+ })], 8, _hoisted_1$45),
1259
1271
  createElementVNode("input", {
1260
1272
  id,
1261
1273
  value: draft.value,
@@ -1273,7 +1285,7 @@ var NumberInput_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
1273
1285
  onInput,
1274
1286
  onBlur: commit,
1275
1287
  onKeydown
1276
- }, null, 40, _hoisted_2$37),
1288
+ }, null, 40, _hoisted_2$39),
1277
1289
  createElementVNode("button", {
1278
1290
  type: "button",
1279
1291
  class: "rk-number-step focus-ring",
@@ -1284,7 +1296,7 @@ var NumberInput_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
1284
1296
  }, [createVNode(unref(Plus), {
1285
1297
  class: "size-4",
1286
1298
  "aria-hidden": "true"
1287
- })], 8, _hoisted_3$24)
1299
+ })], 8, _hoisted_3$26)
1288
1300
  ], 2)]),
1289
1301
  _: 1
1290
1302
  }, 8, [
@@ -1299,7 +1311,7 @@ var NumberInput_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
1299
1311
  }), [["__scopeId", "data-v-082bd3d7"]]);
1300
1312
  //#endregion
1301
1313
  //#region src/components/SliderField.vue?vue&type=script&setup=true&lang.ts
1302
- var _hoisted_1$42 = { class: "rk-slider-field" };
1314
+ var _hoisted_1$44 = { class: "rk-slider-field" };
1303
1315
  //#endregion
1304
1316
  //#region src/components/SliderField.vue
1305
1317
  var SliderField_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
@@ -1340,7 +1352,7 @@ var SliderField_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
1340
1352
  }
1341
1353
  });
1342
1354
  return (_ctx, _cache) => {
1343
- return openBlock(), createElementBlock("div", _hoisted_1$42, [createVNode(BaseSlider_default, {
1355
+ return openBlock(), createElementBlock("div", _hoisted_1$44, [createVNode(BaseSlider_default, {
1344
1356
  modelValue: model.value,
1345
1357
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => model.value = $event),
1346
1358
  label: __props.label,
@@ -1388,11 +1400,11 @@ var SliderField_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
1388
1400
  }), [["__scopeId", "data-v-6ec3163a"]]);
1389
1401
  //#endregion
1390
1402
  //#region src/components/BaseSpinner.vue?vue&type=script&setup=true&lang.ts
1391
- var _hoisted_1$41 = {
1403
+ var _hoisted_1$43 = {
1392
1404
  class: "rk-spin-wrap",
1393
1405
  role: "status"
1394
1406
  };
1395
- var _hoisted_2$36 = { class: "rk-spin-label" };
1407
+ var _hoisted_2$38 = { class: "rk-spin-label" };
1396
1408
  //#endregion
1397
1409
  //#region src/components/BaseSpinner.vue
1398
1410
  var BaseSpinner_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
@@ -1420,26 +1432,26 @@ var BaseSpinner_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
1420
1432
  lg: "2.5rem"
1421
1433
  };
1422
1434
  return (_ctx, _cache) => {
1423
- return openBlock(), createElementBlock("span", _hoisted_1$41, [createElementVNode("span", {
1435
+ return openBlock(), createElementBlock("span", _hoisted_1$43, [createElementVNode("span", {
1424
1436
  class: "rk-spin",
1425
1437
  style: normalizeStyle({
1426
1438
  width: SIZES[__props.size],
1427
1439
  height: SIZES[__props.size]
1428
1440
  }),
1429
1441
  "aria-hidden": "true"
1430
- }, null, 4), createElementVNode("span", _hoisted_2$36, toDisplayString(__props.label), 1)]);
1442
+ }, null, 4), createElementVNode("span", _hoisted_2$38, toDisplayString(__props.label), 1)]);
1431
1443
  };
1432
1444
  }
1433
1445
  }), [["__scopeId", "data-v-842da62c"]]);
1434
1446
  //#endregion
1435
1447
  //#region src/components/BaseSwitch.vue?vue&type=script&setup=true&lang.ts
1436
- var _hoisted_1$40 = { class: "flex items-center justify-between gap-4" };
1437
- var _hoisted_2$35 = {
1448
+ var _hoisted_1$42 = { class: "flex items-center justify-between gap-4" };
1449
+ var _hoisted_2$37 = {
1438
1450
  key: 0,
1439
1451
  class: "min-w-0"
1440
1452
  };
1441
- var _hoisted_3$23 = ["id"];
1442
- var _hoisted_4$16 = [
1453
+ var _hoisted_3$25 = ["id"];
1454
+ var _hoisted_4$18 = [
1443
1455
  "aria-checked",
1444
1456
  "aria-labelledby",
1445
1457
  "aria-label",
@@ -1478,10 +1490,10 @@ var BaseSwitch_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
1478
1490
  if (!__props.disabled) model.value = !model.value;
1479
1491
  }
1480
1492
  return (_ctx, _cache) => {
1481
- return openBlock(), createElementBlock("div", _hoisted_1$40, [!__props.labelHidden ? (openBlock(), createElementBlock("span", _hoisted_2$35, [createElementVNode("span", {
1493
+ return openBlock(), createElementBlock("div", _hoisted_1$42, [!__props.labelHidden ? (openBlock(), createElementBlock("span", _hoisted_2$37, [createElementVNode("span", {
1482
1494
  id: unref(id),
1483
1495
  class: "text-ink block text-sm"
1484
- }, toDisplayString(__props.label), 9, _hoisted_3$23), __props.hint ? (openBlock(), createElementBlock("span", {
1496
+ }, toDisplayString(__props.label), 9, _hoisted_3$25), __props.hint ? (openBlock(), createElementBlock("span", {
1485
1497
  key: 0,
1486
1498
  id: hintId,
1487
1499
  class: "text-ink-soft mt-0.5 block text-xs"
@@ -1498,16 +1510,16 @@ var BaseSwitch_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
1498
1510
  }, [..._cache[0] || (_cache[0] = [createElementVNode("span", {
1499
1511
  class: "rk-switch-knob",
1500
1512
  "aria-hidden": "true"
1501
- }, null, -1)])], 10, _hoisted_4$16)]);
1513
+ }, null, -1)])], 10, _hoisted_4$18)]);
1502
1514
  };
1503
1515
  }
1504
1516
  }), [["__scopeId", "data-v-d90e1aa6"]]);
1505
1517
  //#endregion
1506
1518
  //#region src/components/BaseTable.vue?vue&type=script&setup=true&lang.ts
1507
- var _hoisted_1$39 = { class: "rk-table" };
1508
- var _hoisted_2$34 = { key: 0 };
1509
- var _hoisted_3$22 = { key: 1 };
1510
- var _hoisted_4$15 = ["colspan"];
1519
+ var _hoisted_1$41 = { class: "rk-table" };
1520
+ var _hoisted_2$36 = { key: 0 };
1521
+ var _hoisted_3$24 = { key: 1 };
1522
+ var _hoisted_4$17 = ["colspan"];
1511
1523
  //#endregion
1512
1524
  //#region src/components/BaseTable.vue
1513
1525
  var BaseTable_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
@@ -1530,7 +1542,7 @@ var BaseTable_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
1530
1542
  label: __props.caption,
1531
1543
  class: "rk-table-scroll"
1532
1544
  }, {
1533
- default: withCtx(() => [createElementVNode("table", _hoisted_1$39, [
1545
+ default: withCtx(() => [createElementVNode("table", _hoisted_1$41, [
1534
1546
  createElementVNode("caption", { class: normalizeClass(__props.captionHidden ? "rk-table-caption-hidden" : "rk-table-caption") }, toDisplayString(__props.caption), 3),
1535
1547
  createElementVNode("thead", null, [createElementVNode("tr", null, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (column) => {
1536
1548
  return openBlock(), createElementBlock("th", {
@@ -1539,7 +1551,7 @@ var BaseTable_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
1539
1551
  class: normalizeClass([column.align && `is-${column.align}`, column.nowrap && "is-nowrap"])
1540
1552
  }, toDisplayString(column.label), 3);
1541
1553
  }), 128))])]),
1542
- __props.rows.length > 0 ? (openBlock(), createElementBlock("tbody", _hoisted_2$34, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.rows, (row, index) => {
1554
+ __props.rows.length > 0 ? (openBlock(), createElementBlock("tbody", _hoisted_2$36, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.rows, (row, index) => {
1543
1555
  return openBlock(), createElementBlock("tr", { key: keyFor(row, index) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (column) => {
1544
1556
  return openBlock(), createElementBlock("td", {
1545
1557
  key: column.key,
@@ -1549,10 +1561,10 @@ var BaseTable_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
1549
1561
  value: row[column.key]
1550
1562
  }, () => [createTextVNode(toDisplayString(row[column.key]), 1)], true)], 2);
1551
1563
  }), 128))]);
1552
- }), 128))])) : (openBlock(), createElementBlock("tbody", _hoisted_3$22, [createElementVNode("tr", null, [createElementVNode("td", {
1564
+ }), 128))])) : (openBlock(), createElementBlock("tbody", _hoisted_3$24, [createElementVNode("tr", null, [createElementVNode("td", {
1553
1565
  colspan: __props.columns.length,
1554
1566
  class: "rk-table-empty"
1555
- }, [renderSlot(_ctx.$slots, "empty", {}, void 0, true)], 8, _hoisted_4$15)])]))
1567
+ }, [renderSlot(_ctx.$slots, "empty", {}, void 0, true)], 8, _hoisted_4$17)])]))
1556
1568
  ])]),
1557
1569
  _: 3
1558
1570
  }, 8, ["label"]);
@@ -1561,7 +1573,7 @@ var BaseTable_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
1561
1573
  }), [["__scopeId", "data-v-cc1197ef"]]);
1562
1574
  //#endregion
1563
1575
  //#region src/components/BaseTextarea.vue?vue&type=script&setup=true&lang.ts
1564
- var _hoisted_1$38 = [
1576
+ var _hoisted_1$40 = [
1565
1577
  "id",
1566
1578
  "rows",
1567
1579
  "aria-invalid",
@@ -1607,7 +1619,7 @@ var BaseTextarea_default = /* @__PURE__ */ defineComponent({
1607
1619
  __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",
1608
1620
  "text-base",
1609
1621
  __props.variant !== "unstyled" && invalid ? "border-negative" : ""
1610
- ] }), null, 16, _hoisted_1$38), [[vModelText, unref(model)]])]),
1622
+ ] }), null, 16, _hoisted_1$40), [[vModelText, unref(model)]])]),
1611
1623
  _: 1
1612
1624
  }, 8, [
1613
1625
  "label",
@@ -1621,17 +1633,17 @@ var BaseTextarea_default = /* @__PURE__ */ defineComponent({
1621
1633
  });
1622
1634
  //#endregion
1623
1635
  //#region src/components/EmptyState.vue?vue&type=script&setup=true&lang.ts
1624
- var _hoisted_1$37 = { class: "flex flex-col items-center gap-3 px-6 py-10 text-center" };
1625
- var _hoisted_2$33 = {
1636
+ var _hoisted_1$39 = { class: "flex flex-col items-center gap-3 px-6 py-10 text-center" };
1637
+ var _hoisted_2$35 = {
1626
1638
  key: 0,
1627
1639
  class: "bg-muted text-primary rounded-card flex size-12 items-center justify-center"
1628
1640
  };
1629
- var _hoisted_3$21 = { class: "text-ink text-base font-semibold" };
1630
- var _hoisted_4$14 = {
1641
+ var _hoisted_3$23 = { class: "text-ink text-base font-semibold" };
1642
+ var _hoisted_4$16 = {
1631
1643
  key: 1,
1632
1644
  class: "text-ink-soft max-w-[36ch] text-sm"
1633
1645
  };
1634
- var _hoisted_5$9 = {
1646
+ var _hoisted_5$10 = {
1635
1647
  key: 2,
1636
1648
  class: "mt-2 flex w-full flex-col gap-2"
1637
1649
  };
@@ -1653,11 +1665,11 @@ var EmptyState_default = /* @__PURE__ */ defineComponent({
1653
1665
  * goes — the button that creates the first one.
1654
1666
  */
1655
1667
  return (_ctx, _cache) => {
1656
- return openBlock(), createElementBlock("div", _hoisted_1$37, [
1657
- _ctx.$slots.icon ? (openBlock(), createElementBlock("div", _hoisted_2$33, [renderSlot(_ctx.$slots, "icon")])) : createCommentVNode("", true),
1658
- createElementVNode("h3", _hoisted_3$21, 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)
1668
+ return openBlock(), createElementBlock("div", _hoisted_1$39, [
1669
+ _ctx.$slots.icon ? (openBlock(), createElementBlock("div", _hoisted_2$35, [renderSlot(_ctx.$slots, "icon")])) : createCommentVNode("", true),
1670
+ createElementVNode("h3", _hoisted_3$23, toDisplayString(__props.title), 1),
1671
+ __props.description ? (openBlock(), createElementBlock("p", _hoisted_4$16, toDisplayString(__props.description), 1)) : createCommentVNode("", true),
1672
+ _ctx.$slots.action ? (openBlock(), createElementBlock("div", _hoisted_5$10, [renderSlot(_ctx.$slots, "action")])) : createCommentVNode("", true)
1661
1673
  ]);
1662
1674
  };
1663
1675
  }
@@ -1724,11 +1736,11 @@ var PageContainer_default = /* @__PURE__ */ defineComponent({
1724
1736
  });
1725
1737
  //#endregion
1726
1738
  //#region src/components/PageHeader.vue?vue&type=script&setup=true&lang.ts
1727
- var _hoisted_1$36 = { class: "grid h-12 shrink-0 grid-cols-[2.5rem_1fr_2.5rem] items-center" };
1728
- var _hoisted_2$32 = { class: "justify-self-start" };
1729
- var _hoisted_3$20 = { 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" };
1739
+ var _hoisted_1$38 = { class: "grid h-12 shrink-0 grid-cols-[2.5rem_1fr_2.5rem] items-center" };
1740
+ var _hoisted_2$34 = { class: "justify-self-start" };
1741
+ var _hoisted_3$22 = { class: "text-ink flex min-w-0 justify-center text-base font-semibold tabular-nums" };
1742
+ var _hoisted_4$15 = { class: "truncate" };
1743
+ var _hoisted_5$9 = { class: "justify-self-end" };
1732
1744
  //#endregion
1733
1745
  //#region src/components/PageHeader.vue
1734
1746
  var PageHeader_default = /* @__PURE__ */ defineComponent({
@@ -1745,17 +1757,17 @@ var PageHeader_default = /* @__PURE__ */ defineComponent({
1745
1757
  * each other.
1746
1758
  */
1747
1759
  return (_ctx, _cache) => {
1748
- return openBlock(), createElementBlock("header", _hoisted_1$36, [
1749
- createElementVNode("div", _hoisted_2$32, [renderSlot(_ctx.$slots, "left")]),
1750
- createElementVNode("h1", _hoisted_3$20, [renderSlot(_ctx.$slots, "title", {}, () => [createElementVNode("span", _hoisted_4$13, toDisplayString(__props.title), 1)])]),
1751
- createElementVNode("div", _hoisted_5$8, [renderSlot(_ctx.$slots, "right")])
1760
+ return openBlock(), createElementBlock("header", _hoisted_1$38, [
1761
+ createElementVNode("div", _hoisted_2$34, [renderSlot(_ctx.$slots, "left")]),
1762
+ createElementVNode("h1", _hoisted_3$22, [renderSlot(_ctx.$slots, "title", {}, () => [createElementVNode("span", _hoisted_4$15, toDisplayString(__props.title), 1)])]),
1763
+ createElementVNode("div", _hoisted_5$9, [renderSlot(_ctx.$slots, "right")])
1752
1764
  ]);
1753
1765
  };
1754
1766
  }
1755
1767
  });
1756
1768
  //#endregion
1757
1769
  //#region src/components/ProgressBar.vue?vue&type=script&setup=true&lang.ts
1758
- var _hoisted_1$35 = ["aria-valuenow", "aria-label"];
1770
+ var _hoisted_1$37 = ["aria-valuenow", "aria-label"];
1759
1771
  //#endregion
1760
1772
  //#region src/components/ProgressBar.vue
1761
1773
  var ProgressBar_default = /* @__PURE__ */ defineComponent({
@@ -1787,25 +1799,25 @@ var ProgressBar_default = /* @__PURE__ */ defineComponent({
1787
1799
  }, [createElementVNode("div", {
1788
1800
  class: "bg-primary h-full rounded-full transition-[width] duration-700 ease-out",
1789
1801
  style: normalizeStyle({ width: `${portion.value}%` })
1790
- }, null, 4)], 10, _hoisted_1$35);
1802
+ }, null, 4)], 10, _hoisted_1$37);
1791
1803
  };
1792
1804
  }
1793
1805
  });
1794
1806
  //#endregion
1795
1807
  //#region src/components/PriceCard.vue?vue&type=script&setup=true&lang.ts
1796
- var _hoisted_1$34 = {
1808
+ var _hoisted_1$36 = {
1797
1809
  key: 0,
1798
1810
  class: "bg-primary rounded-cell text-on-primary absolute -top-3 left-7 px-3 py-1 text-[0.7rem] font-semibold"
1799
1811
  };
1800
- var _hoisted_2$31 = { class: "flex items-start justify-between gap-4" };
1801
- var _hoisted_3$19 = { class: "text-ink mt-5 text-lg font-semibold" };
1802
- var _hoisted_4$12 = {
1812
+ var _hoisted_2$33 = { class: "flex items-start justify-between gap-4" };
1813
+ var _hoisted_3$21 = { class: "text-ink mt-5 text-lg font-semibold" };
1814
+ var _hoisted_4$14 = {
1803
1815
  key: 1,
1804
1816
  class: "text-ink-soft mt-1.5 text-sm leading-relaxed"
1805
1817
  };
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" };
1808
- var _hoisted_7$3 = {
1818
+ var _hoisted_5$8 = { class: "mt-6 flex items-baseline gap-1.5" };
1819
+ var _hoisted_6$7 = { class: "text-ink text-3xl font-semibold tracking-tight tabular-nums" };
1820
+ var _hoisted_7$4 = {
1809
1821
  key: 0,
1810
1822
  class: "text-ink-soft text-sm"
1811
1823
  };
@@ -1868,17 +1880,17 @@ var PriceCard_default = /* @__PURE__ */ defineComponent({
1868
1880
  const palette = computed(() => TONE[__props.tone]);
1869
1881
  return (_ctx, _cache) => {
1870
1882
  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"]]) }, [
1871
- __props.badge && __props.recommended ? (openBlock(), createElementBlock("span", _hoisted_1$34, toDisplayString(__props.badge), 1)) : createCommentVNode("", true),
1872
- createElementVNode("div", _hoisted_2$31, [_ctx.$slots.icon ? (openBlock(), createElementBlock("span", {
1883
+ __props.badge && __props.recommended ? (openBlock(), createElementBlock("span", _hoisted_1$36, toDisplayString(__props.badge), 1)) : createCommentVNode("", true),
1884
+ createElementVNode("div", _hoisted_2$33, [_ctx.$slots.icon ? (openBlock(), createElementBlock("span", {
1873
1885
  key: 0,
1874
1886
  class: normalizeClass(["rounded-card grid size-11 place-items-center text-xl", palette.value.icon])
1875
1887
  }, [renderSlot(_ctx.$slots, "icon")], 2)) : createCommentVNode("", true), __props.chip ? (openBlock(), createElementBlock("span", {
1876
1888
  key: 1,
1877
1889
  class: normalizeClass(["rounded-cell ml-auto px-2.5 py-1 text-[0.7rem] font-medium", palette.value.soft])
1878
1890
  }, toDisplayString(__props.chip), 3)) : createCommentVNode("", true)]),
1879
- createElementVNode("h3", _hoisted_3$19, 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)]),
1891
+ createElementVNode("h3", _hoisted_3$21, toDisplayString(__props.name), 1),
1892
+ __props.lead ? (openBlock(), createElementBlock("p", _hoisted_4$14, toDisplayString(__props.lead), 1)) : createCommentVNode("", true),
1893
+ createElementVNode("p", _hoisted_5$8, [createElementVNode("span", _hoisted_6$7, toDisplayString(__props.price), 1), __props.period ? (openBlock(), createElementBlock("span", _hoisted_7$4, toDisplayString(__props.period), 1)) : createCommentVNode("", true)]),
1882
1894
  __props.note ? (openBlock(), createElementBlock("p", _hoisted_8$2, toDisplayString(__props.note), 1)) : createCommentVNode("", true),
1883
1895
  createElementVNode("ul", _hoisted_9$2, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.features, (feature) => {
1884
1896
  return openBlock(), createElementBlock("li", {
@@ -1893,8 +1905,8 @@ var PriceCard_default = /* @__PURE__ */ defineComponent({
1893
1905
  });
1894
1906
  //#endregion
1895
1907
  //#region src/components/ToneDot.vue?vue&type=script&setup=true&lang.ts
1896
- var _hoisted_1$33 = { class: "inline-flex items-center gap-1.5" };
1897
- var _hoisted_2$30 = {
1908
+ var _hoisted_1$35 = { class: "inline-flex items-center gap-1.5" };
1909
+ var _hoisted_2$32 = {
1898
1910
  key: 0,
1899
1911
  class: "text-ink-soft text-xs font-medium"
1900
1912
  };
@@ -1915,13 +1927,13 @@ var ToneDot_default = /* @__PURE__ */ defineComponent({
1915
1927
  * priorities — without this component knowing about any of them.
1916
1928
  */
1917
1929
  return (_ctx, _cache) => {
1918
- return openBlock(), createElementBlock("span", _hoisted_1$33, [createElementVNode("span", { class: normalizeClass(["size-2 rounded-full", __props.fill]) }, null, 2), __props.label ? (openBlock(), createElementBlock("span", _hoisted_2$30, toDisplayString(__props.label), 1)) : createCommentVNode("", true)]);
1930
+ return openBlock(), createElementBlock("span", _hoisted_1$35, [createElementVNode("span", { class: normalizeClass(["size-2 rounded-full", __props.fill]) }, null, 2), __props.label ? (openBlock(), createElementBlock("span", _hoisted_2$32, toDisplayString(__props.label), 1)) : createCommentVNode("", true)]);
1919
1931
  };
1920
1932
  }
1921
1933
  });
1922
1934
  //#endregion
1923
1935
  //#region src/components/SectionHeading.vue?vue&type=script&setup=true&lang.ts
1924
- var _hoisted_1$32 = {
1936
+ var _hoisted_1$34 = {
1925
1937
  key: 0,
1926
1938
  class: "text-ink-soft text-xs tabular-nums"
1927
1939
  };
@@ -1939,15 +1951,15 @@ var SectionHeading_default = /* @__PURE__ */ defineComponent({
1939
1951
  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]) }, [
1940
1952
  createVNode(ToneDot_default, { fill: __props.tone.fill }, null, 8, ["fill"]),
1941
1953
  createElementVNode("span", { class: normalizeClass(["text-xs font-semibold tracking-wide uppercase", __props.tone.text]) }, toDisplayString(__props.label), 3),
1942
- __props.count > 0 ? (openBlock(), createElementBlock("span", _hoisted_1$32, toDisplayString(__props.count), 1)) : createCommentVNode("", true)
1954
+ __props.count > 0 ? (openBlock(), createElementBlock("span", _hoisted_1$34, toDisplayString(__props.count), 1)) : createCommentVNode("", true)
1943
1955
  ], 2);
1944
1956
  };
1945
1957
  }
1946
1958
  });
1947
1959
  //#endregion
1948
1960
  //#region src/components/SegmentedControl.vue?vue&type=script&setup=true&lang.ts
1949
- var _hoisted_1$31 = { class: "bg-muted rounded-card flex w-full gap-1 p-1" };
1950
- var _hoisted_2$29 = ["value", "name"];
1961
+ var _hoisted_1$33 = { class: "bg-muted rounded-card flex w-full gap-1 p-1" };
1962
+ var _hoisted_2$31 = ["value", "name"];
1951
1963
  //#endregion
1952
1964
  //#region src/components/SegmentedControl.vue
1953
1965
  var SegmentedControl_default = /* @__PURE__ */ defineComponent({
@@ -1961,7 +1973,7 @@ var SegmentedControl_default = /* @__PURE__ */ defineComponent({
1961
1973
  const model = useModel(__props, "modelValue");
1962
1974
  const name = useId();
1963
1975
  return (_ctx, _cache) => {
1964
- return openBlock(), createElementBlock("div", _hoisted_1$31, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.options, (option) => {
1976
+ return openBlock(), createElementBlock("div", _hoisted_1$33, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.options, (option) => {
1965
1977
  return openBlock(), createElementBlock("label", {
1966
1978
  key: String(option.value),
1967
1979
  class: "flex-1 cursor-pointer"
@@ -1971,18 +1983,18 @@ var SegmentedControl_default = /* @__PURE__ */ defineComponent({
1971
1983
  value: option.value,
1972
1984
  name: unref(name),
1973
1985
  class: "peer sr-only"
1974
- }, null, 8, _hoisted_2$29), [[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)]);
1986
+ }, null, 8, _hoisted_2$31), [[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)]);
1975
1987
  }), 128))]);
1976
1988
  };
1977
1989
  }
1978
1990
  });
1979
1991
  //#endregion
1980
1992
  //#region src/components/SkeletonList.vue?vue&type=script&setup=true&lang.ts
1981
- var _hoisted_1$30 = {
1993
+ var _hoisted_1$32 = {
1982
1994
  role: "status",
1983
1995
  class: "flex flex-col gap-1"
1984
1996
  };
1985
- var _hoisted_2$28 = { class: "sr-only" };
1997
+ var _hoisted_2$30 = { class: "sr-only" };
1986
1998
  //#endregion
1987
1999
  //#region src/components/SkeletonList.vue
1988
2000
  var SkeletonList_default = /* @__PURE__ */ defineComponent({
@@ -1996,7 +2008,7 @@ var SkeletonList_default = /* @__PURE__ */ defineComponent({
1996
2008
  /** A length starts with a digit, a dot, or opens a CSS function. */
1997
2009
  const isLength = computed(() => /^(?:[.\d]|calc\(|var\(|clamp\(|min\(|max\()/.test(__props.rowHeight));
1998
2010
  return (_ctx, _cache) => {
1999
- return openBlock(), createElementBlock("div", _hoisted_1$30, [createElementVNode("span", _hoisted_2$28, toDisplayString(__props.label), 1), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.rows, (row) => {
2011
+ return openBlock(), createElementBlock("div", _hoisted_1$32, [createElementVNode("span", _hoisted_2$30, toDisplayString(__props.label), 1), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.rows, (row) => {
2000
2012
  return openBlock(), createElementBlock("div", {
2001
2013
  key: row,
2002
2014
  class: normalizeClass(["bg-muted rounded-card animate-pulse", isLength.value ? void 0 : __props.rowHeight]),
@@ -2009,10 +2021,10 @@ var SkeletonList_default = /* @__PURE__ */ defineComponent({
2009
2021
  });
2010
2022
  //#endregion
2011
2023
  //#region src/components/StatCard.vue?vue&type=script&setup=true&lang.ts
2012
- var _hoisted_1$29 = { class: "surface rounded-card flex flex-1 flex-col gap-0.5 p-3" };
2013
- var _hoisted_2$27 = { class: "flex items-baseline gap-1" };
2014
- var _hoisted_3$18 = { class: "text-ink text-xl font-semibold tabular-nums" };
2015
- var _hoisted_4$11 = { class: "text-ink-soft text-xs" };
2024
+ var _hoisted_1$31 = { class: "surface rounded-card flex flex-1 flex-col gap-0.5 p-3" };
2025
+ var _hoisted_2$29 = { class: "flex items-baseline gap-1" };
2026
+ var _hoisted_3$20 = { class: "text-ink text-xl font-semibold tabular-nums" };
2027
+ var _hoisted_4$13 = { class: "text-ink-soft text-xs" };
2016
2028
  //#endregion
2017
2029
  //#region src/components/StatCard.vue
2018
2030
  var StatCard_default = /* @__PURE__ */ defineComponent({
@@ -2029,22 +2041,22 @@ var StatCard_default = /* @__PURE__ */ defineComponent({
2029
2041
  flat: ArrowRight
2030
2042
  };
2031
2043
  return (_ctx, _cache) => {
2032
- return openBlock(), createElementBlock("div", _hoisted_1$29, [createElementVNode("div", _hoisted_2$27, [createElementVNode("span", _hoisted_3$18, toDisplayString(__props.value), 1), __props.trend ? (openBlock(), createBlock(resolveDynamicComponent(TREND_ICON[__props.trend]), {
2044
+ return openBlock(), createElementBlock("div", _hoisted_1$31, [createElementVNode("div", _hoisted_2$29, [createElementVNode("span", _hoisted_3$20, toDisplayString(__props.value), 1), __props.trend ? (openBlock(), createBlock(resolveDynamicComponent(TREND_ICON[__props.trend]), {
2033
2045
  key: 0,
2034
2046
  class: "text-ink-soft size-3"
2035
- })) : createCommentVNode("", true)]), createElementVNode("span", _hoisted_4$11, toDisplayString(__props.label), 1)]);
2047
+ })) : createCommentVNode("", true)]), createElementVNode("span", _hoisted_4$13, toDisplayString(__props.label), 1)]);
2036
2048
  };
2037
2049
  }
2038
2050
  });
2039
2051
  //#endregion
2040
2052
  //#region src/components/ToastHost.vue?vue&type=script&setup=true&lang.ts
2041
- var _hoisted_1$28 = [
2053
+ var _hoisted_1$30 = [
2042
2054
  "onMouseenter",
2043
2055
  "onMouseleave",
2044
2056
  "onFocusin",
2045
2057
  "onFocusout"
2046
2058
  ];
2047
- var _hoisted_2$26 = { class: "flex-1 text-sm leading-snug" };
2059
+ var _hoisted_2$28 = { class: "flex-1 text-sm leading-snug" };
2048
2060
  //#endregion
2049
2061
  //#region src/components/ToastHost.vue
2050
2062
  var ToastHost_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
@@ -2105,7 +2117,7 @@ var ToastHost_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
2105
2117
  class: normalizeClass(["mt-0.5 size-5 shrink-0", TONE_CLASS[toast.tone]]),
2106
2118
  "aria-hidden": "true"
2107
2119
  }, null, 8, ["class"])),
2108
- createElementVNode("p", _hoisted_2$26, toDisplayString(toast.message), 1),
2120
+ createElementVNode("p", _hoisted_2$28, toDisplayString(toast.message), 1),
2109
2121
  toast.action ? (openBlock(), createBlock(BaseButton_default, {
2110
2122
  key: 0,
2111
2123
  variant: "link",
@@ -2128,7 +2140,7 @@ var ToastHost_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
2128
2140
  default: withCtx(() => [createVNode(unref(X), { class: "size-4" })]),
2129
2141
  _: 1
2130
2142
  }, 8, ["aria-label", "onClick"])
2131
- ], 40, _hoisted_1$28);
2143
+ ], 40, _hoisted_1$30);
2132
2144
  }), 128))]),
2133
2145
  _: 1
2134
2146
  })], 2)])) : createCommentVNode("", true);
@@ -2137,8 +2149,8 @@ var ToastHost_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
2137
2149
  }), [["__scopeId", "data-v-737eb240"]]);
2138
2150
  //#endregion
2139
2151
  //#region src/components/LocaleLinks.vue?vue&type=script&setup=true&lang.ts
2140
- var _hoisted_1$27 = ["aria-label"];
2141
- var _hoisted_2$25 = [
2152
+ var _hoisted_1$29 = ["aria-label"];
2153
+ var _hoisted_2$27 = [
2142
2154
  "lang",
2143
2155
  "aria-pressed",
2144
2156
  "onClick"
@@ -2182,17 +2194,17 @@ var LocaleLinks_default = /* @__PURE__ */ defineComponent({
2182
2194
  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"]),
2183
2195
  "aria-pressed": preference.value === locale,
2184
2196
  onClick: ($event) => preference.value = locale
2185
- }, toDisplayString(__props.labels[locale]), 11, _hoisted_2$25);
2186
- }), 128))], 8, _hoisted_1$27);
2197
+ }, toDisplayString(__props.labels[locale]), 11, _hoisted_2$27);
2198
+ }), 128))], 8, _hoisted_1$29);
2187
2199
  };
2188
2200
  }
2189
2201
  });
2190
2202
  //#endregion
2191
2203
  //#region src/components/TabBar.vue?vue&type=script&setup=true&lang.ts
2192
- var _hoisted_1$26 = { class: "tab-bar" };
2193
- var _hoisted_2$24 = ["aria-label"];
2194
- var _hoisted_3$17 = { class: "tab-icon-slot" };
2195
- var _hoisted_4$10 = { class: "tab-label" };
2204
+ var _hoisted_1$28 = { class: "tab-bar" };
2205
+ var _hoisted_2$26 = ["aria-label"];
2206
+ var _hoisted_3$19 = { class: "tab-icon-slot" };
2207
+ var _hoisted_4$12 = { class: "tab-label" };
2196
2208
  //#endregion
2197
2209
  //#region src/components/TabBar.vue
2198
2210
  var TabBar_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
@@ -2204,7 +2216,7 @@ var TabBar_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
2204
2216
  },
2205
2217
  setup(__props) {
2206
2218
  return (_ctx, _cache) => {
2207
- return openBlock(), createElementBlock("header", _hoisted_1$26, [createElementVNode("nav", {
2219
+ return openBlock(), createElementBlock("header", _hoisted_1$28, [createElementVNode("nav", {
2208
2220
  class: "tab-bar-inner",
2209
2221
  "aria-label": __props.label || void 0
2210
2222
  }, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item) => {
@@ -2215,28 +2227,28 @@ var TabBar_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE_
2215
2227
  "aria-current": item.key === __props.active ? "page" : void 0,
2216
2228
  onClick: _cache[0] || (_cache[0] = ($event) => unref(tapFeedback)())
2217
2229
  }, {
2218
- default: withCtx(() => [createElementVNode("span", _hoisted_3$17, [(openBlock(), createBlock(resolveDynamicComponent(item.icon), { class: "tab-icon" }))]), createElementVNode("span", _hoisted_4$10, toDisplayString(item.label), 1)]),
2230
+ default: withCtx(() => [createElementVNode("span", _hoisted_3$19, [(openBlock(), createBlock(resolveDynamicComponent(item.icon), { class: "tab-icon" }))]), createElementVNode("span", _hoisted_4$12, toDisplayString(item.label), 1)]),
2219
2231
  _: 2
2220
2232
  }, 1032, [
2221
2233
  "to",
2222
2234
  "class",
2223
2235
  "aria-current"
2224
2236
  ]);
2225
- }), 128))], 8, _hoisted_2$24)]);
2237
+ }), 128))], 8, _hoisted_2$26)]);
2226
2238
  };
2227
2239
  }
2228
2240
  }), [["__scopeId", "data-v-a76891c4"]]);
2229
2241
  //#endregion
2230
2242
  //#region src/components/ActivityGrid.vue?vue&type=script&setup=true&lang.ts
2231
- var _hoisted_1$25 = ["aria-label"];
2232
- var _hoisted_2$23 = ["colspan"];
2233
- var _hoisted_3$16 = {
2243
+ var _hoisted_1$27 = ["aria-label"];
2244
+ var _hoisted_2$25 = ["colspan"];
2245
+ var _hoisted_3$18 = {
2234
2246
  scope: "row",
2235
2247
  class: "rk-activity-weekday"
2236
2248
  };
2237
- var _hoisted_4$9 = { class: "sr-only" };
2238
- var _hoisted_5$6 = ["tabindex", "aria-label"];
2239
- var _hoisted_6$5 = {
2249
+ var _hoisted_4$11 = { class: "sr-only" };
2250
+ var _hoisted_5$7 = ["tabindex", "aria-label"];
2251
+ var _hoisted_6$6 = {
2240
2252
  key: 1,
2241
2253
  class: "rk-activity-cell is-blank",
2242
2254
  "aria-hidden": "true"
@@ -2397,9 +2409,9 @@ var ActivityGrid_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
2397
2409
  key: month.key,
2398
2410
  colspan: month.span,
2399
2411
  scope: "colgroup"
2400
- }, toDisplayString(month.label), 9, _hoisted_2$23);
2412
+ }, toDisplayString(month.label), 9, _hoisted_2$25);
2401
2413
  }), 128))])]), createElementVNode("tbody", null, [(openBlock(true), createElementBlock(Fragment, null, renderList(weekdays.value, (weekday, row) => {
2402
- return openBlock(), createElementBlock("tr", { key: weekday }, [createElementVNode("th", _hoisted_3$16, [createElementVNode("span", _hoisted_4$9, toDisplayString(weekday), 1)]), (openBlock(true), createElementBlock(Fragment, null, renderList(weeks.value, (week, column) => {
2414
+ return openBlock(), createElementBlock("tr", { key: weekday }, [createElementVNode("th", _hoisted_3$18, [createElementVNode("span", _hoisted_4$11, toDisplayString(weekday), 1)]), (openBlock(true), createElementBlock(Fragment, null, renderList(weeks.value, (week, column) => {
2403
2415
  return openBlock(), createElementBlock(Fragment, { key: column }, [week[row] ? (openBlock(), createElementBlock("td", mergeProps({
2404
2416
  key: 0,
2405
2417
  class: "rk-activity-cell"
@@ -2407,15 +2419,197 @@ var ActivityGrid_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
2407
2419
  tabindex: cells.value[focused.value]?.day === week[row] ? 0 : -1,
2408
2420
  "aria-label": __props.dayLabel(week[row]),
2409
2421
  class: [__props.levelFor(week[row]), { "is-pickable": __props.isSelectable?.(week[row]) }]
2410
- }), null, 16, _hoisted_5$6)) : (openBlock(), createElementBlock("td", _hoisted_6$5))], 64);
2422
+ }), null, 16, _hoisted_5$7)) : (openBlock(), createElementBlock("td", _hoisted_6$6))], 64);
2411
2423
  }), 128))]);
2412
- }), 128))])], 40, _hoisted_1$25)]),
2424
+ }), 128))])], 40, _hoisted_1$27)]),
2413
2425
  _: 1
2414
2426
  }, 8, ["label"]);
2415
2427
  };
2416
2428
  }
2417
2429
  }), [["__scopeId", "data-v-766e5244"]]);
2418
2430
  //#endregion
2431
+ //#region src/components/BarChart.vue?vue&type=script&setup=true&lang.ts
2432
+ var _hoisted_1$26 = { class: "sr-only" };
2433
+ var _hoisted_2$24 = {
2434
+ scope: "row",
2435
+ class: "rk-bars-label"
2436
+ };
2437
+ var _hoisted_3$17 = { class: "rk-bars-track" };
2438
+ var _hoisted_4$10 = { class: "rk-bars-value" };
2439
+ //#endregion
2440
+ //#region src/components/BarChart.vue
2441
+ var BarChart_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
2442
+ __name: "BarChart",
2443
+ props: {
2444
+ series: {},
2445
+ label: {},
2446
+ valueLabel: { type: Function },
2447
+ fill: {
2448
+ type: Function,
2449
+ default: () => "bg-primary"
2450
+ },
2451
+ max: { default: () => void 0 },
2452
+ animate: {
2453
+ type: Boolean,
2454
+ default: true
2455
+ }
2456
+ },
2457
+ setup(__props) {
2458
+ const root = useTemplateRef("root");
2459
+ const grown = ref(!__props.animate);
2460
+ let stopWatching;
2461
+ onMounted(() => {
2462
+ if (grown.value || !root.value) return;
2463
+ stopWatching = watchVisibility(root.value, (visible) => {
2464
+ if (!visible) return;
2465
+ grown.value = true;
2466
+ stopWatching?.();
2467
+ });
2468
+ });
2469
+ onBeforeUnmount(() => stopWatching?.());
2470
+ const ceiling = computed(() => {
2471
+ const largest = Math.max(0, ...__props.series.map((item) => item.value));
2472
+ return Math.max(__props.max ?? largest, Number.EPSILON);
2473
+ });
2474
+ const rows = computed(() => __props.series.map((item, index) => ({
2475
+ item,
2476
+ index,
2477
+ width: `${Math.min(100, Math.max(0, item.value / ceiling.value * 100))}%`,
2478
+ fill: __props.fill(item, index)
2479
+ })));
2480
+ return (_ctx, _cache) => {
2481
+ return openBlock(), createElementBlock("table", {
2482
+ ref_key: "root",
2483
+ ref: root,
2484
+ class: "rk-bars"
2485
+ }, [createElementVNode("caption", _hoisted_1$26, toDisplayString(__props.label), 1), createElementVNode("tbody", null, [(openBlock(true), createElementBlock(Fragment, null, renderList(rows.value, (row) => {
2486
+ return openBlock(), createElementBlock("tr", {
2487
+ key: row.item.key,
2488
+ class: "rk-bars-row"
2489
+ }, [
2490
+ createElementVNode("th", _hoisted_2$24, toDisplayString(row.item.label), 1),
2491
+ createElementVNode("td", _hoisted_3$17, [createElementVNode("span", {
2492
+ class: normalizeClass(["rk-bars-fill", row.fill]),
2493
+ style: normalizeStyle({ width: grown.value ? row.width : "0%" }),
2494
+ "aria-hidden": "true"
2495
+ }, null, 6)]),
2496
+ createElementVNode("td", _hoisted_4$10, [renderSlot(_ctx.$slots, "value", {
2497
+ item: row.item,
2498
+ index: row.index
2499
+ }, () => [createTextVNode(toDisplayString(__props.valueLabel(row.item.value, row.item)), 1)], true)])
2500
+ ]);
2501
+ }), 128))])], 512);
2502
+ };
2503
+ }
2504
+ }), [["__scopeId", "data-v-12682ed6"]]);
2505
+ //#endregion
2506
+ //#region src/components/DonutChart.vue?vue&type=script&setup=true&lang.ts
2507
+ var _hoisted_1$25 = { class: "rk-donut" };
2508
+ var _hoisted_2$23 = {
2509
+ class: "rk-donut-ring",
2510
+ viewBox: "0 0 40 40",
2511
+ "aria-hidden": "true"
2512
+ };
2513
+ var _hoisted_3$16 = { transform: "rotate(-90 20 20)" };
2514
+ var _hoisted_4$9 = [
2515
+ "stroke-width",
2516
+ "stroke-dasharray",
2517
+ "stroke-dashoffset"
2518
+ ];
2519
+ var _hoisted_5$6 = ["aria-label"];
2520
+ var _hoisted_6$5 = { class: "rk-donut-name" };
2521
+ var _hoisted_7$3 = { class: "rk-donut-value" };
2522
+ /**
2523
+ * Parts of a whole.
2524
+ *
2525
+ * ## Not for comparing things
2526
+ *
2527
+ * This is the chart people reach for when they mean the other one. Judging
2528
+ * the difference between two angles is measurably harder than judging the
2529
+ * difference between two lengths, so six values that need ranking belong in
2530
+ * a `BarChart` and not here. Reach for this when the point is that the
2531
+ * slices *add up* — where a budget went, what a bundle is made of — and
2532
+ * when there are few enough slices to tell apart.
2533
+ *
2534
+ * ## The legend is the chart
2535
+ *
2536
+ * The ring is `aria-hidden`, and every slice's name and value is real text
2537
+ * beside it. Same decision as `BarChart`'s table: the description of a
2538
+ * chart is not a sentence somebody writes once and forgets to update, it
2539
+ * is the data, rendered.
2540
+ *
2541
+ * ## The colours are yours
2542
+ *
2543
+ * `fill` returns a class per slice, like `ToneDot`'s and `ActivityGrid`'s
2544
+ * `levelFor`. It is required here rather than defaulted: a ring whose
2545
+ * slices are all one colour is not a chart, so there is no sensible
2546
+ * default to give it.
2547
+ */
2548
+ var CIRCUMFERENCE = 100;
2549
+ //#endregion
2550
+ //#region src/components/DonutChart.vue
2551
+ var DonutChart_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
2552
+ __name: "DonutChart",
2553
+ props: {
2554
+ slices: {},
2555
+ label: {},
2556
+ valueLabel: { type: Function },
2557
+ fill: { type: Function },
2558
+ thickness: { default: 14 }
2559
+ },
2560
+ setup(__props) {
2561
+ const RADIUS = CIRCUMFERENCE / (2 * Math.PI);
2562
+ const total = computed(() => __props.slices.reduce((sum, slice) => sum + Math.max(0, slice.value), 0));
2563
+ const arcs = computed(() => {
2564
+ let travelled = 0;
2565
+ return __props.slices.map((item, index) => {
2566
+ const share = total.value === 0 ? 0 : Math.max(0, item.value) / total.value * CIRCUMFERENCE;
2567
+ const offset = -travelled;
2568
+ travelled += share;
2569
+ return {
2570
+ item,
2571
+ index,
2572
+ share,
2573
+ offset,
2574
+ percent: total.value === 0 ? 0 : item.value / total.value * 100,
2575
+ fill: __props.fill(item, index)
2576
+ };
2577
+ });
2578
+ });
2579
+ return (_ctx, _cache) => {
2580
+ return openBlock(), createElementBlock("div", _hoisted_1$25, [(openBlock(), createElementBlock("svg", _hoisted_2$23, [createElementVNode("g", _hoisted_3$16, [(openBlock(true), createElementBlock(Fragment, null, renderList(arcs.value, (arc) => {
2581
+ return openBlock(), createElementBlock("circle", {
2582
+ key: arc.item.key,
2583
+ class: normalizeClass(arc.fill),
2584
+ cx: "20",
2585
+ cy: "20",
2586
+ r: RADIUS,
2587
+ fill: "none",
2588
+ stroke: "currentColor",
2589
+ "stroke-width": __props.thickness / 100 * RADIUS * 2,
2590
+ "stroke-dasharray": `${arc.share} ${CIRCUMFERENCE - arc.share}`,
2591
+ "stroke-dashoffset": arc.offset
2592
+ }, null, 10, _hoisted_4$9);
2593
+ }), 128))])])), createElementVNode("ul", {
2594
+ class: "rk-donut-legend",
2595
+ "aria-label": __props.label
2596
+ }, [(openBlock(true), createElementBlock(Fragment, null, renderList(arcs.value, (arc) => {
2597
+ return openBlock(), createElementBlock("li", {
2598
+ key: arc.item.key,
2599
+ class: "rk-donut-item"
2600
+ }, [
2601
+ createElementVNode("span", {
2602
+ class: normalizeClass(["rk-donut-swatch", arc.fill]),
2603
+ "aria-hidden": "true"
2604
+ }, null, 2),
2605
+ createElementVNode("span", _hoisted_6$5, toDisplayString(arc.item.label), 1),
2606
+ createElementVNode("span", _hoisted_7$3, toDisplayString(__props.valueLabel(arc.item.value, arc.item)), 1)
2607
+ ]);
2608
+ }), 128))], 8, _hoisted_5$6)]);
2609
+ };
2610
+ }
2611
+ }), [["__scopeId", "data-v-4ee6aaa6"]]);
2612
+ //#endregion
2419
2613
  //#region src/components/VirtualList.vue?vue&type=script&setup=true&lang.ts
2420
2614
  var _hoisted_1$24 = ["aria-label"];
2421
2615
  var _hoisted_2$22 = ["aria-setsize", "aria-posinset"];
@@ -2448,6 +2642,16 @@ var VirtualList_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
2448
2642
  }
2449
2643
  onMounted(measure);
2450
2644
  watch(() => __props.items.length, measure);
2645
+ let observer = null;
2646
+ watchEffect(() => {
2647
+ observer?.disconnect();
2648
+ observer = null;
2649
+ const element = area.value?.viewport;
2650
+ if (!element || typeof ResizeObserver === "undefined") return;
2651
+ observer = new ResizeObserver(measure);
2652
+ observer.observe(element);
2653
+ });
2654
+ onScopeDispose(() => observer?.disconnect());
2451
2655
  /** Scrolls a row into view by its index, for an app driving the list itself. */
2452
2656
  function scrollToIndex(index) {
2453
2657
  const element = area.value?.viewport;
@@ -2502,7 +2706,7 @@ var VirtualList_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
2502
2706
  ]);
2503
2707
  };
2504
2708
  }
2505
- }), [["__scopeId", "data-v-936ed40c"]]);
2709
+ }), [["__scopeId", "data-v-5fea77fd"]]);
2506
2710
  //#endregion
2507
2711
  //#region src/components/AnnounceHost.vue?vue&type=script&setup=true&lang.ts
2508
2712
  var _hoisted_1$23 = { class: "rk-announcer" };
@@ -3722,7 +3926,6 @@ var TagsInput_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
3722
3926
  //#endregion
3723
3927
  //#region src/components/BasePopover.vue?vue&type=script&setup=true&lang.ts
3724
3928
  var _hoisted_1$9 = ["id", "aria-label"];
3725
- var FOCUSABLE = "a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])";
3726
3929
  //#endregion
3727
3930
  //#region src/components/BasePopover.vue
3728
3931
  var BasePopover_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
@@ -3745,10 +3948,12 @@ var BasePopover_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
3745
3948
  const id = useId();
3746
3949
  const root = ref(null);
3747
3950
  const panel = ref(null);
3748
- /** Where it actually opened, after measuring. */
3749
- const placed = ref(__props.side);
3750
- /** Pixels slid sideways to stay on screen. */
3751
- const shift = ref(0);
3951
+ const { placed, shift } = useAnchoredPanel({
3952
+ root,
3953
+ panel,
3954
+ open,
3955
+ side: __props.side
3956
+ });
3752
3957
  const triggerProps = computed(() => ({
3753
3958
  "aria-expanded": open.value,
3754
3959
  "aria-controls": id,
@@ -3762,23 +3967,6 @@ var BasePopover_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
3762
3967
  function trigger() {
3763
3968
  return root.value?.querySelector("[data-rk-popover-trigger]") ?? null;
3764
3969
  }
3765
- /**
3766
- * Measured once it is on screen, because only then is there a size to
3767
- * measure. Flips first, then slides: a panel that fits neither above nor
3768
- * below keeps the side it asked for, where it is at least attached.
3769
- */
3770
- function place() {
3771
- if (!panel.value || typeof window === "undefined") return;
3772
- const rect = panel.value.getBoundingClientRect();
3773
- const anchor = root.value.getBoundingClientRect();
3774
- const below = window.innerHeight - anchor.bottom;
3775
- const above = anchor.top;
3776
- if (__props.side === "bottom" && rect.height > below && above > below) placed.value = "top";
3777
- if (__props.side === "top" && rect.height > above && below > above) placed.value = "bottom";
3778
- const margin = 8;
3779
- if (rect.right > window.innerWidth - margin) shift.value = window.innerWidth - margin - rect.right;
3780
- if (rect.left + shift.value < margin) shift.value = margin - rect.left;
3781
- }
3782
3970
  function onKeydown(event) {
3783
3971
  if (event.key !== "Escape" || !open.value) return;
3784
3972
  event.preventDefault();
@@ -3789,12 +3977,6 @@ var BasePopover_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
3789
3977
  const next = event.relatedTarget;
3790
3978
  if (next && root.value && !root.value.contains(next)) close();
3791
3979
  }
3792
- function watchViewport(on) {
3793
- if (typeof window === "undefined") return;
3794
- const method = on ? "addEventListener" : "removeEventListener";
3795
- window[method]("resize", place);
3796
- window[method]("scroll", place, true);
3797
- }
3798
3980
  function onDocumentPointer(event) {
3799
3981
  if (root.value && !root.value.contains(event.target)) close();
3800
3982
  }
@@ -3802,20 +3984,14 @@ var BasePopover_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
3802
3984
  if (typeof document === "undefined") return;
3803
3985
  if (!isOpen) {
3804
3986
  document.removeEventListener("pointerdown", onDocumentPointer);
3805
- watchViewport(false);
3806
3987
  return;
3807
3988
  }
3808
3989
  document.addEventListener("pointerdown", onDocumentPointer);
3809
- watchViewport(true);
3810
- placed.value = __props.side;
3811
- shift.value = 0;
3812
3990
  await nextTick();
3813
- place();
3814
- (panel.value?.querySelector(FOCUSABLE) ?? panel.value)?.focus();
3991
+ (panel.value?.querySelector("a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), summary, [tabindex]:not([tabindex=\"-1\"])") ?? panel.value)?.focus();
3815
3992
  }, { immediate: true });
3816
3993
  onBeforeUnmount(() => {
3817
3994
  if (typeof document !== "undefined") document.removeEventListener("pointerdown", onDocumentPointer);
3818
- watchViewport(false);
3819
3995
  });
3820
3996
  return (_ctx, _cache) => {
3821
3997
  return openBlock(), createElementBlock("div", {
@@ -3833,8 +4009,8 @@ var BasePopover_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
3833
4009
  id: unref(id),
3834
4010
  ref_key: "panel",
3835
4011
  ref: panel,
3836
- class: normalizeClass(["rk-popover-panel surface-overlay", [`is-${placed.value}`, `is-${__props.align}`]]),
3837
- style: normalizeStyle(shift.value ? { "--rk-popover-shift": `${shift.value}px` } : void 0),
4012
+ class: normalizeClass(["rk-popover-panel surface-overlay", [`is-${unref(placed)}`, `is-${__props.align}`]]),
4013
+ style: normalizeStyle(unref(shift) ? { "--rk-popover-shift": `${unref(shift)}px` } : void 0),
3838
4014
  role: "dialog",
3839
4015
  "aria-label": __props.label,
3840
4016
  tabindex: "-1"
@@ -3843,7 +4019,7 @@ var BasePopover_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__
3843
4019
  })], 544);
3844
4020
  };
3845
4021
  }
3846
- }), [["__scopeId", "data-v-22d8f397"]]);
4022
+ }), [["__scopeId", "data-v-86915db6"]]);
3847
4023
  //#endregion
3848
4024
  //#region src/components/TimePicker.vue?vue&type=script&setup=true&lang.ts
3849
4025
  var _hoisted_1$8 = [
@@ -4918,8 +5094,8 @@ function createI18nRuntime(options) {
4918
5094
  *
4919
5095
  * The fallback keeps `vitest` and `vite dev` honest, where no define runs.
4920
5096
  */
4921
- var VERSION = "2.23.0";
5097
+ var VERSION = "2.24.0";
4922
5098
  //#endregion
4923
- 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, PasswordInput_default as PasswordInput, 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, elementDirection, ensureSheetRoot, formatDate, formatNumber, fromDateKey, horizontalStep, 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 };
5099
+ export { ActivityGrid_default as ActivityGrid, AnnounceHost_default as AnnounceHost, AppError, AvatarStack_default as AvatarStack, BarChart_default as BarChart, 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, DonutChart_default as DonutChart, 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, PasswordInput_default as PasswordInput, 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, elementDirection, ensureSheetRoot, formatDate, formatNumber, fromDateKey, horizontalStep, 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 };
4924
5100
 
4925
5101
  //# sourceMappingURL=index.js.map