rei-kit 0.13.0 → 0.14.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,8 +1,9 @@
1
- import { a as needsIosInstall, c as fromDateKey, d as startOfWeek, f as toDateKey, i as isInstalled, l as lastNDays, n as BaseButton_default, o as addDays, p as todayKey, r as isApplePortable, s as eachDayOfYear, t as _plugin_vue_export_helper_default, u as leadingBlanks } from "./_plugin-vue_export-helper-3AcMDTtW.js";
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-DtEB_Hrd.js";
2
2
  import { n as registerErrorMapper, r as toAppError, t as AppError } from "./app-error-DF9cijE0.js";
3
- import { a as useTheme, i as setThemeStorageKey, n as isThemePreference, r as readStoredTheme, t as applyTheme } from "./use-theme-_MnaDD5v.js";
4
- import { Fragment, Teleport, Transition, TransitionGroup, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createStaticVNode, createTextVNode, createVNode, defineComponent, mergeModels, mergeProps, nextTick, normalizeClass, normalizeStyle, onBeforeUnmount, onErrorCaptured, onMounted, onScopeDispose, onUnmounted, openBlock, readonly, ref, renderList, renderSlot, resolveDynamicComponent, toDisplayString, unref, useId, useModel, vModelCheckbox, vModelDynamic, vModelRadio, vModelSelect, vModelText, watch, watchEffect, withCtx, withDirectives } from "vue";
5
- import { ArrowDown, ArrowRight, ArrowUp, CheckCircle2, ChevronDown, ChevronRight, Info, TriangleAlert, X, XCircle } from "lucide-vue-next";
3
+ import { a as readStoredTheme, i as isThemePreference, n as useVisualViewport, o as setThemeStorageKey, r as applyTheme, s as useTheme, t as BaseSheet_default } from "./BaseSheet-CLIhXDwe.js";
4
+ import { n as _plugin_vue_export_helper_default, r as BaseButton_default, t as SettingsRow_default } from "./SettingsRow-MnVleeTR.js";
5
+ import { Fragment, Teleport, TransitionGroup, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createStaticVNode, createTextVNode, createVNode, defineComponent, mergeModels, mergeProps, normalizeClass, normalizeStyle, onBeforeUnmount, onErrorCaptured, onMounted, onScopeDispose, onUnmounted, openBlock, readonly, ref, renderList, renderSlot, resolveDynamicComponent, toDisplayString, unref, useId, useModel, vModelCheckbox, vModelDynamic, vModelRadio, vModelSelect, vModelText, watch, watchEffect, withCtx, withDirectives } from "vue";
6
+ import { ArrowDown, ArrowRight, ArrowUp, CheckCircle2, ChevronDown, Info, TriangleAlert, X, XCircle } from "lucide-vue-next";
6
7
  import { RouterLink } from "vue-router";
7
8
  import { createI18n } from "vue-i18n";
8
9
  //#region src/utils/format.ts
@@ -415,47 +416,6 @@ function useMediaQuery(query) {
415
416
  return matches;
416
417
  }
417
418
  //#endregion
418
- //#region src/composables/use-visual-viewport.ts
419
- /**
420
- * Tracks the visual viewport.
421
- *
422
- * Chrome and Android browsers honour `interactive-widget=resizes-content`, so
423
- * the layout viewport already shrinks for the keyboard there. Safari on iOS
424
- * does not implement it: it shrinks only the *visual* viewport, leaving a sheet
425
- * sized in `dvh` sitting partly underneath the keyboard.
426
- *
427
- * `null` means the API is unavailable, which callers should read as "trust the
428
- * layout viewport" rather than as zero. A server has no viewport at all, so it
429
- * gets that same `null` — this runs during `setup`, and a component using it
430
- * has to survive being rendered there.
431
- *
432
- * @example
433
- * ```ts
434
- * const viewport = useVisualViewport()
435
- * // :style="viewport ? { height: `${viewport.height}px` } : undefined"
436
- * ```
437
- */
438
- function useVisualViewport() {
439
- const rect = ref(null);
440
- const viewport = typeof window === "undefined" ? void 0 : window.visualViewport;
441
- if (!viewport) return readonly(rect);
442
- function read() {
443
- if (!viewport) return;
444
- rect.value = {
445
- height: viewport.height,
446
- offsetTop: viewport.offsetTop
447
- };
448
- }
449
- read();
450
- viewport.addEventListener("resize", read);
451
- viewport.addEventListener("scroll", read);
452
- onScopeDispose(() => {
453
- viewport.removeEventListener("resize", read);
454
- viewport.removeEventListener("scroll", read);
455
- });
456
- return readonly(rect);
457
- }
458
- //#endregion
459
419
  //#region src/composables/use-toast.ts
460
420
  /**
461
421
  * Four seconds: long enough to read a short sentence twice, short enough that
@@ -567,9 +527,9 @@ function useToast() {
567
527
  }
568
528
  //#endregion
569
529
  //#region src/components/BaseAlert.vue?vue&type=script&setup=true&lang.ts
570
- var _hoisted_1$21 = ["role", "aria-live"];
571
- var _hoisted_2$16 = { class: "min-w-0 flex-1" };
572
- var _hoisted_3$11 = {
530
+ var _hoisted_1$18 = ["role", "aria-live"];
531
+ var _hoisted_2$13 = { class: "min-w-0 flex-1" };
532
+ var _hoisted_3$8 = {
573
533
  key: 0,
574
534
  class: "text-ink font-semibold"
575
535
  };
@@ -610,9 +570,9 @@ var BaseAlert_default = /* @__PURE__ */ defineComponent({
610
570
  class: normalizeClass(["mt-px grid size-6 shrink-0 place-items-center rounded-full text-xs font-semibold", mark.value]),
611
571
  "aria-hidden": "true"
612
572
  }, [renderSlot(_ctx.$slots, "mark")], 2)) : createCommentVNode("", true),
613
- createElementVNode("div", _hoisted_2$16, [_ctx.$slots.title ? (openBlock(), createElementBlock("p", _hoisted_3$11, [renderSlot(_ctx.$slots, "title")])) : createCommentVNode("", true), createElementVNode("div", { class: normalizeClass(_ctx.$slots.title ? "mt-1" : "") }, [renderSlot(_ctx.$slots, "default")], 2)]),
573
+ createElementVNode("div", _hoisted_2$13, [_ctx.$slots.title ? (openBlock(), createElementBlock("p", _hoisted_3$8, [renderSlot(_ctx.$slots, "title")])) : createCommentVNode("", true), createElementVNode("div", { class: normalizeClass(_ctx.$slots.title ? "mt-1" : "") }, [renderSlot(_ctx.$slots, "default")], 2)]),
614
574
  renderSlot(_ctx.$slots, "action")
615
- ], 10, _hoisted_1$21);
575
+ ], 10, _hoisted_1$18);
616
576
  };
617
577
  }
618
578
  });
@@ -637,7 +597,7 @@ var BaseBadge_default = /* @__PURE__ */ defineComponent({
637
597
  });
638
598
  //#endregion
639
599
  //#region src/components/FormField.vue?vue&type=script&setup=true&lang.ts
640
- var _hoisted_1$20 = ["for"];
600
+ var _hoisted_1$17 = ["for"];
641
601
  //#endregion
642
602
  //#region src/components/FormField.vue
643
603
  var FormField_default = /* @__PURE__ */ defineComponent({
@@ -665,7 +625,7 @@ var FormField_default = /* @__PURE__ */ defineComponent({
665
625
  createElementVNode("label", {
666
626
  for: unref(id),
667
627
  class: normalizeClass(["font-medium", [__props.labelHidden ? "sr-only" : "", __props.size === "sm" ? "text-ink-soft text-xs" : "text-ink text-sm"]])
668
- }, toDisplayString(__props.label), 11, _hoisted_1$20),
628
+ }, toDisplayString(__props.label), 11, _hoisted_1$17),
669
629
  renderSlot(_ctx.$slots, "default", {
670
630
  id: unref(id),
671
631
  describedBy: describedBy.value,
@@ -687,7 +647,7 @@ var FormField_default = /* @__PURE__ */ defineComponent({
687
647
  });
688
648
  //#endregion
689
649
  //#region src/components/BaseInput.vue?vue&type=script&setup=true&lang.ts
690
- var _hoisted_1$19 = [
650
+ var _hoisted_1$16 = [
691
651
  "id",
692
652
  "type",
693
653
  "aria-invalid",
@@ -735,7 +695,7 @@ var BaseInput_default = /* @__PURE__ */ defineComponent({
735
695
  __props.variant === "unstyled" ? "" : "border-hair bg-surface text-ink rounded-card focus-visible:outline-primary border px-3 focus-visible:outline-2 focus-visible:outline-offset-1",
736
696
  __props.variant === "unstyled" ? "text-base" : CONTROL_CLASS,
737
697
  __props.variant !== "unstyled" && invalid ? "border-negative" : ""
738
- ] }), null, 16, _hoisted_1$19), [[vModelDynamic, model.value]])]),
698
+ ] }), null, 16, _hoisted_1$16), [[vModelDynamic, model.value]])]),
739
699
  _: 1
740
700
  }, 8, [
741
701
  "label",
@@ -748,122 +708,6 @@ var BaseInput_default = /* @__PURE__ */ defineComponent({
748
708
  }
749
709
  });
750
710
  //#endregion
751
- //#region src/components/BaseSheet.vue?vue&type=script&setup=true&lang.ts
752
- var _hoisted_1$18 = { class: "shell-frame md:rounded-shell relative flex max-h-full flex-col justify-end overflow-hidden" };
753
- var _hoisted_2$15 = ["aria-label"];
754
- var _hoisted_3$10 = { class: "flex shrink-0 items-start gap-3 px-6 pt-4 pb-5" };
755
- var _hoisted_4$7 = { class: "min-w-0 flex-1" };
756
- var _hoisted_5$4 = { class: "text-ink text-xl leading-tight font-semibold" };
757
- var _hoisted_6$2 = {
758
- key: 0,
759
- class: "text-ink-soft mt-1 text-sm leading-snug"
760
- };
761
- var _hoisted_7$2 = { class: "min-h-0 flex-1 overflow-y-auto px-6 pb-[calc(2rem+env(safe-area-inset-bottom,0px))]" };
762
- //#endregion
763
- //#region src/components/BaseSheet.vue
764
- var BaseSheet_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
765
- __name: "BaseSheet",
766
- props: /*@__PURE__*/ mergeModels({
767
- title: {},
768
- subtitle: { default: "" },
769
- closeLabel: { default: "Close" }
770
- }, {
771
- "modelValue": {
772
- type: Boolean,
773
- required: true
774
- },
775
- "modelModifiers": {}
776
- }),
777
- emits: ["update:modelValue"],
778
- setup(__props) {
779
- const open = useModel(__props, "modelValue");
780
- const viewport = useVisualViewport();
781
- /**
782
- * Pins the sheet to the area the keyboard has left visible.
783
- *
784
- * Only needed where the layout viewport does not shrink on its own — iOS. On
785
- * Android the numbers already agree, so this is a no-op there rather than a
786
- * second, competing adjustment.
787
- */
788
- const viewportStyle = computed(() => viewport.value ? {
789
- height: `${viewport.value.height}px`,
790
- top: `${viewport.value.offsetTop}px`
791
- } : void 0);
792
- const panel = ref(null);
793
- let lastFocused = null;
794
- function close() {
795
- open.value = false;
796
- }
797
- function onKeydown(event) {
798
- if (event.key === "Escape") close();
799
- }
800
- watch(open, async (isOpen) => {
801
- if (isOpen) {
802
- setBackgroundInert(true);
803
- lastFocused = document.activeElement instanceof HTMLElement ? document.activeElement : null;
804
- window.addEventListener("keydown", onKeydown);
805
- await nextTick();
806
- panel.value?.focus();
807
- } else {
808
- window.removeEventListener("keydown", onKeydown);
809
- lastFocused?.focus();
810
- lastFocused = null;
811
- setBackgroundInert(false);
812
- }
813
- });
814
- /**
815
- * `inert` takes the whole app out of tab order and pointer events while the
816
- * sheet is open — a real focus trap without keydown bookkeeping.
817
- *
818
- * The sheet itself is teleported to `#sheet-root`, a sibling of `#app`, so it
819
- * stays interactive.
820
- */
821
- function setBackgroundInert(isInert) {
822
- document.getElementById("app")?.toggleAttribute("inert", isInert);
823
- }
824
- onUnmounted(() => {
825
- window.removeEventListener("keydown", onKeydown);
826
- setBackgroundInert(false);
827
- });
828
- return (_ctx, _cache) => {
829
- return openBlock(), createBlock(Teleport, { to: "#sheet-root" }, [createVNode(Transition, { name: "sheet" }, {
830
- default: withCtx(() => [open.value ? (openBlock(), createElementBlock("div", {
831
- key: 0,
832
- class: "fixed inset-x-0 top-0 bottom-0 z-50 flex items-center justify-center",
833
- style: normalizeStyle(viewportStyle.value)
834
- }, [createElementVNode("div", _hoisted_1$18, [createElementVNode("div", {
835
- class: "bg-ink/45 absolute inset-0 backdrop-blur-[2px]",
836
- onClick: close
837
- }), createElementVNode("section", {
838
- ref_key: "panel",
839
- ref: panel,
840
- role: "dialog",
841
- "aria-modal": "true",
842
- "aria-label": __props.title,
843
- tabindex: "-1",
844
- class: "sheet-panel bg-surface relative flex max-h-[94%] min-h-[56dvh] flex-col rounded-t-[28px] shadow-2xl outline-none"
845
- }, [
846
- _cache[0] || (_cache[0] = createElementVNode("div", {
847
- class: "flex shrink-0 justify-center pt-3",
848
- "aria-hidden": "true"
849
- }, [createElementVNode("span", { class: "bg-hair h-1.5 w-10 rounded-full" })], -1)),
850
- createElementVNode("header", _hoisted_3$10, [createElementVNode("div", _hoisted_4$7, [createElementVNode("h2", _hoisted_5$4, toDisplayString(__props.title), 1), __props.subtitle ? (openBlock(), createElementBlock("p", _hoisted_6$2, toDisplayString(__props.subtitle), 1)) : createCommentVNode("", true)]), createVNode(BaseButton_default, {
851
- variant: "unstyled",
852
- class: "text-ink-soft hover:bg-muted hover:text-ink -mt-1 flex size-10 shrink-0 items-center justify-center rounded-full transition-colors active:scale-90",
853
- "aria-label": __props.closeLabel,
854
- onClick: close
855
- }, {
856
- default: withCtx(() => [createVNode(unref(X), { class: "size-5" })]),
857
- _: 1
858
- }, 8, ["aria-label"])]),
859
- createElementVNode("div", _hoisted_7$2, [renderSlot(_ctx.$slots, "default", {}, void 0, true)])
860
- ], 8, _hoisted_2$15)])], 4)) : createCommentVNode("", true)]),
861
- _: 3
862
- })]);
863
- };
864
- }
865
- }), [["__scopeId", "data-v-51709579"]]);
866
- //#endregion
867
711
  //#region src/components/BaseCard.vue
868
712
  var BaseCard_default = /* @__PURE__ */ defineComponent({
869
713
  __name: "BaseCard",
@@ -930,9 +774,9 @@ var BaseCard_default = /* @__PURE__ */ defineComponent({
930
774
  });
931
775
  //#endregion
932
776
  //#region src/components/BaseCheckbox.vue?vue&type=script&setup=true&lang.ts
933
- var _hoisted_1$17 = { class: "flex flex-col gap-1.5" };
934
- var _hoisted_2$14 = ["for"];
935
- var _hoisted_3$9 = [
777
+ var _hoisted_1$15 = { class: "flex flex-col gap-1.5" };
778
+ var _hoisted_2$12 = ["for"];
779
+ var _hoisted_3$7 = [
936
780
  "id",
937
781
  "disabled",
938
782
  "aria-invalid",
@@ -969,7 +813,7 @@ var BaseCheckbox_default = /* @__PURE__ */ defineComponent({
969
813
  if (__props.hint) return hintId;
970
814
  });
971
815
  return (_ctx, _cache) => {
972
- return openBlock(), createElementBlock("div", _hoisted_1$17, [createElementVNode("label", {
816
+ return openBlock(), createElementBlock("div", _hoisted_1$15, [createElementVNode("label", {
973
817
  for: unref(id),
974
818
  class: normalizeClass(["flex items-center", [__props.size === "sm" ? "gap-2" : "gap-3", __props.disabled ? "opacity-50" : "cursor-pointer"]])
975
819
  }, [withDirectives(createElementVNode("input", {
@@ -980,7 +824,7 @@ var BaseCheckbox_default = /* @__PURE__ */ defineComponent({
980
824
  "aria-invalid": Boolean(__props.error),
981
825
  "aria-describedby": describedBy.value,
982
826
  class: "accent-primary focus-visible:outline-primary size-4 shrink-0 focus-visible:outline-2 focus-visible:outline-offset-2"
983
- }, null, 8, _hoisted_3$9), [[vModelCheckbox, model.value]]), createElementVNode("span", { class: normalizeClass(["text-sm", __props.size === "sm" ? "text-ink-soft" : "text-ink"]) }, toDisplayString(__props.label), 3)], 10, _hoisted_2$14), __props.error ? (openBlock(), createElementBlock("p", {
827
+ }, null, 8, _hoisted_3$7), [[vModelCheckbox, model.value]]), createElementVNode("span", { class: normalizeClass(["text-sm", __props.size === "sm" ? "text-ink-soft" : "text-ink"]) }, toDisplayString(__props.label), 3)], 10, _hoisted_2$12), __props.error ? (openBlock(), createElementBlock("p", {
984
828
  key: 0,
985
829
  id: errorId,
986
830
  class: "text-negative text-xs"
@@ -994,13 +838,13 @@ var BaseCheckbox_default = /* @__PURE__ */ defineComponent({
994
838
  });
995
839
  //#endregion
996
840
  //#region src/components/BaseRadioGroup.vue?vue&type=script&setup=true&lang.ts
997
- var _hoisted_1$16 = ["aria-describedby"];
998
- var _hoisted_2$13 = [
841
+ var _hoisted_1$14 = ["aria-describedby"];
842
+ var _hoisted_2$11 = [
999
843
  "name",
1000
844
  "value",
1001
845
  "disabled"
1002
846
  ];
1003
- var _hoisted_3$8 = { class: "text-ink text-sm" };
847
+ var _hoisted_3$6 = { class: "text-ink text-sm" };
1004
848
  //#endregion
1005
849
  //#region src/components/BaseRadioGroup.vue
1006
850
  var BaseRadioGroup_default = /* @__PURE__ */ defineComponent({
@@ -1045,7 +889,7 @@ var BaseRadioGroup_default = /* @__PURE__ */ defineComponent({
1045
889
  value: option.value,
1046
890
  disabled: option.disabled,
1047
891
  class: "accent-primary focus-visible:outline-primary size-4 shrink-0 focus-visible:outline-2 focus-visible:outline-offset-2"
1048
- }, null, 8, _hoisted_2$13), [[vModelRadio, model.value]]), createElementVNode("span", _hoisted_3$8, toDisplayString(option.label), 1)], 2);
892
+ }, null, 8, _hoisted_2$11), [[vModelRadio, model.value]]), createElementVNode("span", _hoisted_3$6, toDisplayString(option.label), 1)], 2);
1049
893
  }), 128)),
1050
894
  __props.error ? (openBlock(), createElementBlock("p", {
1051
895
  key: 0,
@@ -1056,24 +900,24 @@ var BaseRadioGroup_default = /* @__PURE__ */ defineComponent({
1056
900
  id: hintId,
1057
901
  class: "text-ink-soft text-xs"
1058
902
  }, toDisplayString(__props.hint), 1)) : createCommentVNode("", true)
1059
- ], 8, _hoisted_1$16);
903
+ ], 8, _hoisted_1$14);
1060
904
  };
1061
905
  }
1062
906
  });
1063
907
  //#endregion
1064
908
  //#region src/components/BaseSelect.vue?vue&type=script&setup=true&lang.ts
1065
- var _hoisted_1$15 = { class: "relative" };
1066
- var _hoisted_2$12 = [
909
+ var _hoisted_1$13 = { class: "relative" };
910
+ var _hoisted_2$10 = [
1067
911
  "id",
1068
912
  "aria-invalid",
1069
913
  "aria-describedby"
1070
914
  ];
1071
- var _hoisted_3$7 = {
915
+ var _hoisted_3$5 = {
1072
916
  key: 0,
1073
917
  value: void 0,
1074
918
  disabled: ""
1075
919
  };
1076
- var _hoisted_4$6 = ["value", "disabled"];
920
+ var _hoisted_4$5 = ["value", "disabled"];
1077
921
  //#endregion
1078
922
  //#region src/components/BaseSelect.vue
1079
923
  var BaseSelect_default = /* @__PURE__ */ defineComponent({
@@ -1109,7 +953,7 @@ var BaseSelect_default = /* @__PURE__ */ defineComponent({
1109
953
  "label-hidden": __props.labelHidden,
1110
954
  size: __props.size
1111
955
  }, {
1112
- default: withCtx(({ id, describedBy, invalid }) => [createElementVNode("div", _hoisted_1$15, [withDirectives(createElementVNode("select", {
956
+ default: withCtx(({ id, describedBy, invalid }) => [createElementVNode("div", _hoisted_1$13, [withDirectives(createElementVNode("select", {
1113
957
  id,
1114
958
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => model.value = $event),
1115
959
  "aria-invalid": invalid,
@@ -1119,13 +963,13 @@ var BaseSelect_default = /* @__PURE__ */ defineComponent({
1119
963
  __props.variant === "unstyled" ? "" : SIZE_CLASS[__props.size],
1120
964
  __props.variant !== "unstyled" && invalid ? "border-negative" : ""
1121
965
  ]])
1122
- }, [__props.placeholder ? (openBlock(), createElementBlock("option", _hoisted_3$7, toDisplayString(__props.placeholder), 1)) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.options, (option) => {
966
+ }, [__props.placeholder ? (openBlock(), createElementBlock("option", _hoisted_3$5, toDisplayString(__props.placeholder), 1)) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.options, (option) => {
1123
967
  return openBlock(), createElementBlock("option", {
1124
968
  key: option.value,
1125
969
  value: option.value,
1126
970
  disabled: option.disabled
1127
- }, toDisplayString(option.label), 9, _hoisted_4$6);
1128
- }), 128))], 10, _hoisted_2$12), [[vModelSelect, model.value]]), createVNode(unref(ChevronDown), {
971
+ }, toDisplayString(option.label), 9, _hoisted_4$5);
972
+ }), 128))], 10, _hoisted_2$10), [[vModelSelect, model.value]]), createVNode(unref(ChevronDown), {
1129
973
  class: "text-ink-soft pointer-events-none absolute top-1/2 right-3 size-4 -translate-y-1/2",
1130
974
  "aria-hidden": "true"
1131
975
  })])]),
@@ -1142,7 +986,7 @@ var BaseSelect_default = /* @__PURE__ */ defineComponent({
1142
986
  });
1143
987
  //#endregion
1144
988
  //#region src/components/BaseTextarea.vue?vue&type=script&setup=true&lang.ts
1145
- var _hoisted_1$14 = [
989
+ var _hoisted_1$12 = [
1146
990
  "id",
1147
991
  "rows",
1148
992
  "aria-invalid",
@@ -1189,7 +1033,7 @@ var BaseTextarea_default = /* @__PURE__ */ defineComponent({
1189
1033
  __props.variant === "unstyled" ? "" : "border-hair bg-surface text-ink rounded-card focus-visible:outline-primary resize-y border px-3 py-2 leading-relaxed focus-visible:outline-2 focus-visible:outline-offset-1",
1190
1034
  "text-base",
1191
1035
  __props.variant !== "unstyled" && invalid ? "border-negative" : ""
1192
- ] }), null, 16, _hoisted_1$14), [[vModelText, model.value]])]),
1036
+ ] }), null, 16, _hoisted_1$12), [[vModelText, model.value]])]),
1193
1037
  _: 1
1194
1038
  }, 8, [
1195
1039
  "label",
@@ -1203,17 +1047,17 @@ var BaseTextarea_default = /* @__PURE__ */ defineComponent({
1203
1047
  });
1204
1048
  //#endregion
1205
1049
  //#region src/components/EmptyState.vue?vue&type=script&setup=true&lang.ts
1206
- var _hoisted_1$13 = { class: "flex flex-col items-center gap-3 px-6 py-10 text-center" };
1207
- var _hoisted_2$11 = {
1050
+ var _hoisted_1$11 = { class: "flex flex-col items-center gap-3 px-6 py-10 text-center" };
1051
+ var _hoisted_2$9 = {
1208
1052
  key: 0,
1209
1053
  class: "bg-muted text-primary rounded-card flex size-12 items-center justify-center"
1210
1054
  };
1211
- var _hoisted_3$6 = { class: "text-ink text-base font-semibold" };
1212
- var _hoisted_4$5 = {
1055
+ var _hoisted_3$4 = { class: "text-ink text-base font-semibold" };
1056
+ var _hoisted_4$4 = {
1213
1057
  key: 1,
1214
1058
  class: "text-ink-soft max-w-[36ch] text-sm"
1215
1059
  };
1216
- var _hoisted_5$3 = {
1060
+ var _hoisted_5$2 = {
1217
1061
  key: 2,
1218
1062
  class: "mt-2 flex w-full flex-col gap-2"
1219
1063
  };
@@ -1227,11 +1071,11 @@ var EmptyState_default = /* @__PURE__ */ defineComponent({
1227
1071
  },
1228
1072
  setup(__props) {
1229
1073
  return (_ctx, _cache) => {
1230
- return openBlock(), createElementBlock("div", _hoisted_1$13, [
1231
- _ctx.$slots.icon ? (openBlock(), createElementBlock("div", _hoisted_2$11, [renderSlot(_ctx.$slots, "icon")])) : createCommentVNode("", true),
1232
- createElementVNode("h3", _hoisted_3$6, toDisplayString(__props.title), 1),
1233
- __props.description ? (openBlock(), createElementBlock("p", _hoisted_4$5, toDisplayString(__props.description), 1)) : createCommentVNode("", true),
1234
- _ctx.$slots.action ? (openBlock(), createElementBlock("div", _hoisted_5$3, [renderSlot(_ctx.$slots, "action")])) : createCommentVNode("", true)
1074
+ return openBlock(), createElementBlock("div", _hoisted_1$11, [
1075
+ _ctx.$slots.icon ? (openBlock(), createElementBlock("div", _hoisted_2$9, [renderSlot(_ctx.$slots, "icon")])) : createCommentVNode("", true),
1076
+ createElementVNode("h3", _hoisted_3$4, toDisplayString(__props.title), 1),
1077
+ __props.description ? (openBlock(), createElementBlock("p", _hoisted_4$4, toDisplayString(__props.description), 1)) : createCommentVNode("", true),
1078
+ _ctx.$slots.action ? (openBlock(), createElementBlock("div", _hoisted_5$2, [renderSlot(_ctx.$slots, "action")])) : createCommentVNode("", true)
1235
1079
  ]);
1236
1080
  };
1237
1081
  }
@@ -1298,11 +1142,11 @@ var PageContainer_default = /* @__PURE__ */ defineComponent({
1298
1142
  });
1299
1143
  //#endregion
1300
1144
  //#region src/components/PageHeader.vue?vue&type=script&setup=true&lang.ts
1301
- var _hoisted_1$12 = { class: "grid h-12 shrink-0 grid-cols-[2.5rem_1fr_2.5rem] items-center" };
1302
- var _hoisted_2$10 = { class: "justify-self-start" };
1303
- var _hoisted_3$5 = { class: "text-ink flex min-w-0 justify-center text-base font-semibold tabular-nums" };
1304
- var _hoisted_4$4 = { class: "truncate" };
1305
- var _hoisted_5$2 = { class: "justify-self-end" };
1145
+ var _hoisted_1$10 = { class: "grid h-12 shrink-0 grid-cols-[2.5rem_1fr_2.5rem] items-center" };
1146
+ var _hoisted_2$8 = { class: "justify-self-start" };
1147
+ var _hoisted_3$3 = { class: "text-ink flex min-w-0 justify-center text-base font-semibold tabular-nums" };
1148
+ var _hoisted_4$3 = { class: "truncate" };
1149
+ var _hoisted_5$1 = { class: "justify-self-end" };
1306
1150
  //#endregion
1307
1151
  //#region src/components/PageHeader.vue
1308
1152
  var PageHeader_default = /* @__PURE__ */ defineComponent({
@@ -1310,17 +1154,17 @@ var PageHeader_default = /* @__PURE__ */ defineComponent({
1310
1154
  props: { title: {} },
1311
1155
  setup(__props) {
1312
1156
  return (_ctx, _cache) => {
1313
- return openBlock(), createElementBlock("header", _hoisted_1$12, [
1314
- createElementVNode("div", _hoisted_2$10, [renderSlot(_ctx.$slots, "left")]),
1315
- createElementVNode("h1", _hoisted_3$5, [renderSlot(_ctx.$slots, "title", {}, () => [createElementVNode("span", _hoisted_4$4, toDisplayString(__props.title), 1)])]),
1316
- createElementVNode("div", _hoisted_5$2, [renderSlot(_ctx.$slots, "right")])
1157
+ return openBlock(), createElementBlock("header", _hoisted_1$10, [
1158
+ createElementVNode("div", _hoisted_2$8, [renderSlot(_ctx.$slots, "left")]),
1159
+ createElementVNode("h1", _hoisted_3$3, [renderSlot(_ctx.$slots, "title", {}, () => [createElementVNode("span", _hoisted_4$3, toDisplayString(__props.title), 1)])]),
1160
+ createElementVNode("div", _hoisted_5$1, [renderSlot(_ctx.$slots, "right")])
1317
1161
  ]);
1318
1162
  };
1319
1163
  }
1320
1164
  });
1321
1165
  //#endregion
1322
1166
  //#region src/components/ProgressBar.vue?vue&type=script&setup=true&lang.ts
1323
- var _hoisted_1$11 = ["aria-valuenow", "aria-label"];
1167
+ var _hoisted_1$9 = ["aria-valuenow", "aria-label"];
1324
1168
  //#endregion
1325
1169
  //#region src/components/ProgressBar.vue
1326
1170
  var ProgressBar_default = /* @__PURE__ */ defineComponent({
@@ -1352,25 +1196,25 @@ var ProgressBar_default = /* @__PURE__ */ defineComponent({
1352
1196
  }, [createElementVNode("div", {
1353
1197
  class: "bg-primary h-full rounded-full transition-[width] duration-700 ease-out",
1354
1198
  style: normalizeStyle({ width: `${portion.value}%` })
1355
- }, null, 4)], 10, _hoisted_1$11);
1199
+ }, null, 4)], 10, _hoisted_1$9);
1356
1200
  };
1357
1201
  }
1358
1202
  });
1359
1203
  //#endregion
1360
1204
  //#region src/components/PriceCard.vue?vue&type=script&setup=true&lang.ts
1361
- var _hoisted_1$10 = {
1205
+ var _hoisted_1$8 = {
1362
1206
  key: 0,
1363
1207
  class: "bg-primary rounded-cell absolute -top-3 left-7 px-3 py-1 text-[0.7rem] font-semibold text-white"
1364
1208
  };
1365
- var _hoisted_2$9 = { class: "flex items-start justify-between gap-4" };
1366
- var _hoisted_3$4 = { class: "text-ink mt-5 text-lg font-semibold" };
1367
- var _hoisted_4$3 = {
1209
+ var _hoisted_2$7 = { class: "flex items-start justify-between gap-4" };
1210
+ var _hoisted_3$2 = { class: "text-ink mt-5 text-lg font-semibold" };
1211
+ var _hoisted_4$2 = {
1368
1212
  key: 1,
1369
1213
  class: "text-ink-soft mt-1.5 text-sm leading-relaxed"
1370
1214
  };
1371
- var _hoisted_5$1 = { class: "mt-6 flex items-baseline gap-1.5" };
1372
- var _hoisted_6$1 = { class: "text-ink text-3xl font-semibold tracking-tight tabular-nums" };
1373
- var _hoisted_7$1 = {
1215
+ var _hoisted_5 = { class: "mt-6 flex items-baseline gap-1.5" };
1216
+ var _hoisted_6 = { class: "text-ink text-3xl font-semibold tracking-tight tabular-nums" };
1217
+ var _hoisted_7 = {
1374
1218
  key: 0,
1375
1219
  class: "text-ink-soft text-sm"
1376
1220
  };
@@ -1433,17 +1277,17 @@ var PriceCard_default = /* @__PURE__ */ defineComponent({
1433
1277
  const palette = computed(() => TONE[__props.tone]);
1434
1278
  return (_ctx, _cache) => {
1435
1279
  return openBlock(), createElementBlock("article", { class: normalizeClass(["bg-surface rounded-card relative flex h-full flex-col border p-7 shadow-[var(--shadow-card)] transition-[border-color,box-shadow,transform] duration-[420ms] hover:border-[color-mix(in_oklab,var(--color-primary)_60%,transparent)] hover:shadow-[var(--shadow-lift)] sm:p-8", [palette.value.ring, __props.recommended ? "shadow-[var(--shadow-lift)]" : "hover:-translate-y-0.5"]]) }, [
1436
- __props.badge && __props.recommended ? (openBlock(), createElementBlock("span", _hoisted_1$10, toDisplayString(__props.badge), 1)) : createCommentVNode("", true),
1437
- createElementVNode("div", _hoisted_2$9, [_ctx.$slots.icon ? (openBlock(), createElementBlock("span", {
1280
+ __props.badge && __props.recommended ? (openBlock(), createElementBlock("span", _hoisted_1$8, toDisplayString(__props.badge), 1)) : createCommentVNode("", true),
1281
+ createElementVNode("div", _hoisted_2$7, [_ctx.$slots.icon ? (openBlock(), createElementBlock("span", {
1438
1282
  key: 0,
1439
1283
  class: normalizeClass(["rounded-card grid size-11 place-items-center text-xl", palette.value.icon])
1440
1284
  }, [renderSlot(_ctx.$slots, "icon")], 2)) : createCommentVNode("", true), __props.chip ? (openBlock(), createElementBlock("span", {
1441
1285
  key: 1,
1442
1286
  class: normalizeClass(["rounded-cell ml-auto px-2.5 py-1 text-[0.7rem] font-medium", palette.value.soft])
1443
1287
  }, toDisplayString(__props.chip), 3)) : createCommentVNode("", true)]),
1444
- createElementVNode("h3", _hoisted_3$4, toDisplayString(__props.name), 1),
1445
- __props.lead ? (openBlock(), createElementBlock("p", _hoisted_4$3, toDisplayString(__props.lead), 1)) : createCommentVNode("", true),
1446
- createElementVNode("p", _hoisted_5$1, [createElementVNode("span", _hoisted_6$1, toDisplayString(__props.price), 1), __props.period ? (openBlock(), createElementBlock("span", _hoisted_7$1, toDisplayString(__props.period), 1)) : createCommentVNode("", true)]),
1288
+ createElementVNode("h3", _hoisted_3$2, toDisplayString(__props.name), 1),
1289
+ __props.lead ? (openBlock(), createElementBlock("p", _hoisted_4$2, toDisplayString(__props.lead), 1)) : createCommentVNode("", true),
1290
+ createElementVNode("p", _hoisted_5, [createElementVNode("span", _hoisted_6, toDisplayString(__props.price), 1), __props.period ? (openBlock(), createElementBlock("span", _hoisted_7, toDisplayString(__props.period), 1)) : createCommentVNode("", true)]),
1447
1291
  __props.note ? (openBlock(), createElementBlock("p", _hoisted_8, toDisplayString(__props.note), 1)) : createCommentVNode("", true),
1448
1292
  createElementVNode("ul", _hoisted_9, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.features, (feature) => {
1449
1293
  return openBlock(), createElementBlock("li", {
@@ -1458,8 +1302,8 @@ var PriceCard_default = /* @__PURE__ */ defineComponent({
1458
1302
  });
1459
1303
  //#endregion
1460
1304
  //#region src/components/ToneDot.vue?vue&type=script&setup=true&lang.ts
1461
- var _hoisted_1$9 = { class: "inline-flex items-center gap-1.5" };
1462
- var _hoisted_2$8 = {
1305
+ var _hoisted_1$7 = { class: "inline-flex items-center gap-1.5" };
1306
+ var _hoisted_2$6 = {
1463
1307
  key: 0,
1464
1308
  class: "text-ink-soft text-xs font-medium"
1465
1309
  };
@@ -1480,13 +1324,13 @@ var ToneDot_default = /* @__PURE__ */ defineComponent({
1480
1324
  * priorities — without this component knowing about any of them.
1481
1325
  */
1482
1326
  return (_ctx, _cache) => {
1483
- return openBlock(), createElementBlock("span", _hoisted_1$9, [createElementVNode("span", { class: normalizeClass(["size-2 rounded-full", __props.fill]) }, null, 2), __props.label ? (openBlock(), createElementBlock("span", _hoisted_2$8, toDisplayString(__props.label), 1)) : createCommentVNode("", true)]);
1327
+ return openBlock(), createElementBlock("span", _hoisted_1$7, [createElementVNode("span", { class: normalizeClass(["size-2 rounded-full", __props.fill]) }, null, 2), __props.label ? (openBlock(), createElementBlock("span", _hoisted_2$6, toDisplayString(__props.label), 1)) : createCommentVNode("", true)]);
1484
1328
  };
1485
1329
  }
1486
1330
  });
1487
1331
  //#endregion
1488
1332
  //#region src/components/SectionHeading.vue?vue&type=script&setup=true&lang.ts
1489
- var _hoisted_1$8 = {
1333
+ var _hoisted_1$6 = {
1490
1334
  key: 0,
1491
1335
  class: "text-ink-soft text-xs tabular-nums"
1492
1336
  };
@@ -1504,15 +1348,15 @@ var SectionHeading_default = /* @__PURE__ */ defineComponent({
1504
1348
  return openBlock(), createElementBlock("h2", { class: normalizeClass(["flex items-center gap-2 self-start rounded-full border px-3 py-1", __props.tone.card]) }, [
1505
1349
  createVNode(ToneDot_default, { fill: __props.tone.fill }, null, 8, ["fill"]),
1506
1350
  createElementVNode("span", { class: normalizeClass(["text-xs font-semibold tracking-wide uppercase", __props.tone.text]) }, toDisplayString(__props.label), 3),
1507
- __props.count > 0 ? (openBlock(), createElementBlock("span", _hoisted_1$8, toDisplayString(__props.count), 1)) : createCommentVNode("", true)
1351
+ __props.count > 0 ? (openBlock(), createElementBlock("span", _hoisted_1$6, toDisplayString(__props.count), 1)) : createCommentVNode("", true)
1508
1352
  ], 2);
1509
1353
  };
1510
1354
  }
1511
1355
  });
1512
1356
  //#endregion
1513
1357
  //#region src/components/SegmentedControl.vue?vue&type=script&setup=true&lang.ts
1514
- var _hoisted_1$7 = { class: "bg-muted rounded-card flex w-full gap-1 p-1" };
1515
- var _hoisted_2$7 = ["value", "name"];
1358
+ var _hoisted_1$5 = { class: "bg-muted rounded-card flex w-full gap-1 p-1" };
1359
+ var _hoisted_2$5 = ["value", "name"];
1516
1360
  //#endregion
1517
1361
  //#region src/components/SegmentedControl.vue
1518
1362
  var SegmentedControl_default = /* @__PURE__ */ defineComponent({
@@ -1526,7 +1370,7 @@ var SegmentedControl_default = /* @__PURE__ */ defineComponent({
1526
1370
  const model = useModel(__props, "modelValue");
1527
1371
  const name = useId();
1528
1372
  return (_ctx, _cache) => {
1529
- return openBlock(), createElementBlock("div", _hoisted_1$7, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.options, (option) => {
1373
+ return openBlock(), createElementBlock("div", _hoisted_1$5, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.options, (option) => {
1530
1374
  return openBlock(), createElementBlock("label", {
1531
1375
  key: String(option.value),
1532
1376
  class: "flex-1 cursor-pointer"
@@ -1536,88 +1380,12 @@ var SegmentedControl_default = /* @__PURE__ */ defineComponent({
1536
1380
  value: option.value,
1537
1381
  name: unref(name),
1538
1382
  class: "sr-only"
1539
- }, null, 8, _hoisted_2$7), [[vModelRadio, model.value]]), createElementVNode("span", { class: normalizeClass(["flex h-10 items-center justify-center rounded-xl px-2 text-sm font-medium transition-colors select-none", model.value === option.value ? "bg-surface text-ink shadow-sm" : "text-ink-soft"]) }, toDisplayString(option.label), 3)]);
1383
+ }, null, 8, _hoisted_2$5), [[vModelRadio, model.value]]), createElementVNode("span", { class: normalizeClass(["flex h-10 items-center justify-center rounded-xl px-2 text-sm font-medium transition-colors select-none", model.value === option.value ? "bg-surface text-ink shadow-sm" : "text-ink-soft"]) }, toDisplayString(option.label), 3)]);
1540
1384
  }), 128))]);
1541
1385
  };
1542
1386
  }
1543
1387
  });
1544
1388
  //#endregion
1545
- //#region src/components/SettingsGroup.vue?vue&type=script&setup=true&lang.ts
1546
- var _hoisted_1$6 = { class: "flex flex-col gap-2" };
1547
- var _hoisted_2$6 = { class: "text-ink-soft px-1 text-xs font-semibold tracking-wide uppercase" };
1548
- var _hoisted_3$3 = { class: "border-hair bg-surface rounded-card divide-hair divide-y overflow-hidden border" };
1549
- //#endregion
1550
- //#region src/components/SettingsGroup.vue
1551
- var SettingsGroup_default = /* @__PURE__ */ defineComponent({
1552
- __name: "SettingsGroup",
1553
- props: { title: {} },
1554
- setup(__props) {
1555
- return (_ctx, _cache) => {
1556
- return openBlock(), createElementBlock("section", _hoisted_1$6, [createElementVNode("h2", _hoisted_2$6, toDisplayString(__props.title), 1), createElementVNode("div", _hoisted_3$3, [renderSlot(_ctx.$slots, "default")])]);
1557
- };
1558
- }
1559
- });
1560
- //#endregion
1561
- //#region src/components/SettingsRow.vue?vue&type=script&setup=true&lang.ts
1562
- var _hoisted_1$5 = { class: "flex items-center gap-3" };
1563
- var _hoisted_2$5 = {
1564
- key: 0,
1565
- class: "bg-muted text-ink-soft flex size-9 shrink-0 items-center justify-center rounded-xl",
1566
- "aria-hidden": "true"
1567
- };
1568
- var _hoisted_3$2 = { class: "min-w-0 flex-1" };
1569
- var _hoisted_4$2 = { class: "text-ink text-sm font-medium" };
1570
- var _hoisted_5 = {
1571
- key: 0,
1572
- class: "text-ink-soft mt-0.5 text-xs leading-snug"
1573
- };
1574
- var _hoisted_6 = {
1575
- key: 1,
1576
- class: "shrink-0"
1577
- };
1578
- var _hoisted_7 = { key: 0 };
1579
- //#endregion
1580
- //#region src/components/SettingsRow.vue
1581
- var SettingsRow_default = /* @__PURE__ */ defineComponent({
1582
- __name: "SettingsRow",
1583
- props: {
1584
- label: {},
1585
- description: { default: "" },
1586
- icon: { default: () => void 0 },
1587
- interactive: {
1588
- type: Boolean,
1589
- default: false
1590
- },
1591
- stacked: {
1592
- type: Boolean,
1593
- default: false
1594
- }
1595
- },
1596
- emits: ["click"],
1597
- setup(__props, { emit: __emit }) {
1598
- const emit = __emit;
1599
- return (_ctx, _cache) => {
1600
- return openBlock(), createBlock(resolveDynamicComponent(__props.interactive ? "button" : "div"), {
1601
- type: __props.interactive ? "button" : void 0,
1602
- class: normalizeClass(["flex w-full items-center gap-3 px-4 py-3 text-left", [__props.interactive ? "hover:bg-muted/60 transition-colors active:scale-[0.99]" : "", __props.stacked ? "flex-col items-stretch gap-3" : ""]]),
1603
- onClick: _cache[0] || (_cache[0] = ($event) => __props.interactive && emit("click"))
1604
- }, {
1605
- default: withCtx(() => [createElementVNode("div", _hoisted_1$5, [
1606
- __props.icon ? (openBlock(), createElementBlock("span", _hoisted_2$5, [(openBlock(), createBlock(resolveDynamicComponent(__props.icon), { class: "size-[18px]" }))])) : createCommentVNode("", true),
1607
- createElementVNode("div", _hoisted_3$2, [createElementVNode("p", _hoisted_4$2, toDisplayString(__props.label), 1), __props.description ? (openBlock(), createElementBlock("p", _hoisted_5, toDisplayString(__props.description), 1)) : createCommentVNode("", true)]),
1608
- !__props.stacked ? (openBlock(), createElementBlock("div", _hoisted_6, [renderSlot(_ctx.$slots, "default")])) : createCommentVNode("", true),
1609
- __props.interactive ? (openBlock(), createBlock(unref(ChevronRight), {
1610
- key: 2,
1611
- class: "text-ink-soft size-4 shrink-0",
1612
- "aria-hidden": "true"
1613
- })) : createCommentVNode("", true)
1614
- ]), __props.stacked ? (openBlock(), createElementBlock("div", _hoisted_7, [renderSlot(_ctx.$slots, "default")])) : createCommentVNode("", true)]),
1615
- _: 3
1616
- }, 8, ["type", "class"]);
1617
- };
1618
- }
1619
- });
1620
- //#endregion
1621
1389
  //#region src/components/SkeletonList.vue?vue&type=script&setup=true&lang.ts
1622
1390
  var _hoisted_1$4 = {
1623
1391
  role: "status",
@@ -2013,7 +1781,7 @@ function createI18nRuntime(options) {
2013
1781
  *
2014
1782
  * The fallback keeps `vitest` and `vite dev` honest, where no define runs.
2015
1783
  */
2016
- var VERSION = "0.13.0";
1784
+ var VERSION = "0.14.0";
2017
1785
  //#endregion
2018
1786
  export { AppError, BaseAlert_default as BaseAlert, BaseBadge_default as BaseBadge, BaseButton_default as BaseButton, BaseCard_default as BaseCard, BaseCheckbox_default as BaseCheckbox, BaseInput_default as BaseInput, BaseRadioGroup_default as BaseRadioGroup, BaseSelect_default as BaseSelect, BaseSheet_default as BaseSheet, BaseTextarea_default as BaseTextarea, EmptyState_default as EmptyState, ErrorBoundary_default as ErrorBoundary, FormField_default as FormField, GoogleButton_default as GoogleButton, LocaleLinks_default as LocaleLinks, PageContainer_default as PageContainer, PageHeader_default as PageHeader, PriceCard_default as PriceCard, ProgressBar_default as ProgressBar, SectionHeading_default as SectionHeading, SegmentedControl_default as SegmentedControl, SettingsGroup_default as SettingsGroup, SettingsRow_default as SettingsRow, SkeletonList_default as SkeletonList, StatCard_default as StatCard, TabBar_default as TabBar, ToastHost_default as ToastHost, ToneDot_default as ToneDot, VERSION, addDays, applyTheme, createI18nRuntime, downloadJson, eachDayOfYear, formatDate, fromDateKey, isApplePortable, isInstalled, isThemePreference, lastNDays, leadingBlanks, needsIosInstall, readStoredTheme, registerErrorMapper, relativeDayLabel, safeRedirect, setFormatLocale, setThemeStorageKey, startOfWeek, tapFeedback, toAppError, toDateKey, todayKey, useDebouncedCallback, useDragScroll, useMediaQuery, useOnline, useTheme, useToast, useToday, useVisualViewport };
2019
1787