rei-kit 0.7.1 → 0.8.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,6 +1,6 @@
1
1
  import { n as registerErrorMapper, r as toAppError, t as AppError } from "./app-error-DF9cijE0.js";
2
- import { Fragment, Teleport, Transition, 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";
3
- import { ArrowDown, ArrowRight, ArrowUp, ChevronDown, ChevronRight, X } from "lucide-vue-next";
2
+ 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";
3
+ import { ArrowDown, ArrowRight, ArrowUp, CheckCircle2, ChevronDown, ChevronRight, Info, TriangleAlert, X, XCircle } from "lucide-vue-next";
4
4
  import { RouterLink } from "vue-router";
5
5
  import { createI18n } from "vue-i18n";
6
6
  //#region src/utils/date.ts
@@ -727,9 +727,119 @@ function useVisualViewport() {
727
727
  return readonly(rect);
728
728
  }
729
729
  //#endregion
730
+ //#region src/composables/use-toast.ts
731
+ /**
732
+ * Four seconds: long enough to read a short sentence twice, short enough that
733
+ * a second action does not queue behind it.
734
+ */
735
+ var DEFAULT_DURATION = 4e3;
736
+ /**
737
+ * A failure is read more slowly than a confirmation, and more often twice.
738
+ */
739
+ var DANGER_DURATION = 7e3;
740
+ /**
741
+ * Three at once. A fourth pushes the oldest out rather than growing the stack
742
+ * off the top of the screen — an action that produces ten toasts is a loop,
743
+ * and a loop should not be able to cover the app it is running in.
744
+ */
745
+ var MAX_VISIBLE = 3;
746
+ var items = ref([]);
747
+ var nextId = 0;
748
+ var countdowns = /* @__PURE__ */ new Map();
749
+ function clearCountdown(id) {
750
+ const countdown = countdowns.get(id);
751
+ if (countdown === void 0) return;
752
+ clearTimeout(countdown.handle);
753
+ countdowns.delete(id);
754
+ }
755
+ /** Removes a toast, whether it timed out or was dismissed. */
756
+ function dismiss(id) {
757
+ clearCountdown(id);
758
+ items.value = items.value.filter((item) => item.id !== id);
759
+ }
760
+ /** Removes everything on screen. For a route change, or a sign-out. */
761
+ function dismissAll() {
762
+ for (const id of countdowns.keys()) clearCountdown(id);
763
+ items.value = [];
764
+ }
765
+ function arm(id, remaining) {
766
+ if (typeof window === "undefined" || remaining <= 0) return;
767
+ countdowns.set(id, {
768
+ handle: setTimeout(() => dismiss(id), remaining),
769
+ remaining,
770
+ startedAt: Date.now()
771
+ });
772
+ }
773
+ /**
774
+ * Stops the clock on a toast the reader is pointing at.
775
+ *
776
+ * Somebody who has moved the pointer onto it is reading it, and taking it away
777
+ * mid-sentence is the one thing a notification must not do.
778
+ */
779
+ function pause(id) {
780
+ const countdown = countdowns.get(id);
781
+ if (countdown === void 0) return;
782
+ clearTimeout(countdown.handle);
783
+ countdowns.set(id, {
784
+ ...countdown,
785
+ remaining: Math.max(0, countdown.remaining - (Date.now() - countdown.startedAt))
786
+ });
787
+ }
788
+ /** Starts it again, from where it stopped rather than from the beginning. */
789
+ function resume(id) {
790
+ const countdown = countdowns.get(id);
791
+ if (countdown === void 0) return;
792
+ arm(id, countdown.remaining);
793
+ }
794
+ function push(tone, message, options = {}) {
795
+ const id = ++nextId;
796
+ const duration = options.duration ?? (tone === "danger" ? DANGER_DURATION : DEFAULT_DURATION);
797
+ const next = [...items.value, {
798
+ id,
799
+ message,
800
+ tone,
801
+ duration
802
+ }];
803
+ while (next.length > MAX_VISIBLE) {
804
+ const oldest = next.shift();
805
+ if (oldest !== void 0) clearCountdown(oldest.id);
806
+ }
807
+ items.value = next;
808
+ arm(id, duration);
809
+ return id;
810
+ }
811
+ /**
812
+ * The stack, and the four ways to add to it.
813
+ *
814
+ * @example
815
+ * ```ts
816
+ * const toast = useToast()
817
+ *
818
+ * toast.success(t('habit.saved'))
819
+ * toast.danger(t('common.failed'), { duration: 0 }) // stays until dismissed
820
+ *
821
+ * const id = toast.info(t('export.preparing'), { duration: 0 })
822
+ * toast.dismiss(id)
823
+ * ```
824
+ */
825
+ function useToast() {
826
+ return {
827
+ /** Every toast on screen, oldest first. `ToastHost` renders this. */
828
+ toasts: readonly(items),
829
+ info: (message, options) => push("info", message, options),
830
+ success: (message, options) => push("success", message, options),
831
+ warning: (message, options) => push("warning", message, options),
832
+ danger: (message, options) => push("danger", message, options),
833
+ dismiss,
834
+ dismissAll,
835
+ pause,
836
+ resume
837
+ };
838
+ }
839
+ //#endregion
730
840
  //#region src/components/BaseAlert.vue?vue&type=script&setup=true&lang.ts
731
- var _hoisted_1$22 = ["role", "aria-live"];
732
- var _hoisted_2$16 = { class: "min-w-0 flex-1" };
841
+ var _hoisted_1$23 = ["role", "aria-live"];
842
+ var _hoisted_2$17 = { class: "min-w-0 flex-1" };
733
843
  var _hoisted_3$12 = {
734
844
  key: 0,
735
845
  class: "text-ink font-semibold"
@@ -771,9 +881,9 @@ var BaseAlert_default = /* @__PURE__ */ defineComponent({
771
881
  class: normalizeClass(["mt-px grid size-6 shrink-0 place-items-center rounded-full text-xs font-semibold", mark.value]),
772
882
  "aria-hidden": "true"
773
883
  }, [renderSlot(_ctx.$slots, "mark")], 2)) : createCommentVNode("", true),
774
- createElementVNode("div", _hoisted_2$16, [_ctx.$slots.title ? (openBlock(), createElementBlock("p", _hoisted_3$12, [renderSlot(_ctx.$slots, "title")])) : createCommentVNode("", true), createElementVNode("div", { class: normalizeClass(_ctx.$slots.title ? "mt-1" : "") }, [renderSlot(_ctx.$slots, "default")], 2)]),
884
+ createElementVNode("div", _hoisted_2$17, [_ctx.$slots.title ? (openBlock(), createElementBlock("p", _hoisted_3$12, [renderSlot(_ctx.$slots, "title")])) : createCommentVNode("", true), createElementVNode("div", { class: normalizeClass(_ctx.$slots.title ? "mt-1" : "") }, [renderSlot(_ctx.$slots, "default")], 2)]),
775
885
  renderSlot(_ctx.$slots, "action")
776
- ], 10, _hoisted_1$22);
886
+ ], 10, _hoisted_1$23);
777
887
  };
778
888
  }
779
889
  });
@@ -798,7 +908,7 @@ var BaseBadge_default = /* @__PURE__ */ defineComponent({
798
908
  });
799
909
  //#endregion
800
910
  //#region src/components/BaseButton.vue?vue&type=script&setup=true&lang.ts
801
- var _hoisted_1$21 = {
911
+ var _hoisted_1$22 = {
802
912
  key: 0,
803
913
  class: "size-4 animate-spin rounded-full border-2 border-current border-t-transparent",
804
914
  "aria-hidden": "true"
@@ -912,7 +1022,7 @@ var BaseButton_default = /* @__PURE__ */ defineComponent({
912
1022
  __props.block ? "w-full" : ""
913
1023
  ]]
914
1024
  }), {
915
- default: withCtx(() => [__props.loading ? (openBlock(), createElementBlock("span", _hoisted_1$21)) : createCommentVNode("", true), renderSlot(_ctx.$slots, "default")]),
1025
+ default: withCtx(() => [__props.loading ? (openBlock(), createElementBlock("span", _hoisted_1$22)) : createCommentVNode("", true), renderSlot(_ctx.$slots, "default")]),
916
1026
  _: 3
917
1027
  }, 16, [
918
1028
  "type",
@@ -927,7 +1037,7 @@ var BaseButton_default = /* @__PURE__ */ defineComponent({
927
1037
  });
928
1038
  //#endregion
929
1039
  //#region src/components/FormField.vue?vue&type=script&setup=true&lang.ts
930
- var _hoisted_1$20 = ["for"];
1040
+ var _hoisted_1$21 = ["for"];
931
1041
  //#endregion
932
1042
  //#region src/components/FormField.vue
933
1043
  var FormField_default = /* @__PURE__ */ defineComponent({
@@ -955,7 +1065,7 @@ var FormField_default = /* @__PURE__ */ defineComponent({
955
1065
  createElementVNode("label", {
956
1066
  for: unref(id),
957
1067
  class: normalizeClass(["font-medium", [__props.labelHidden ? "sr-only" : "", __props.size === "sm" ? "text-ink-soft text-xs" : "text-ink text-sm"]])
958
- }, toDisplayString(__props.label), 11, _hoisted_1$20),
1068
+ }, toDisplayString(__props.label), 11, _hoisted_1$21),
959
1069
  renderSlot(_ctx.$slots, "default", {
960
1070
  id: unref(id),
961
1071
  describedBy: describedBy.value,
@@ -977,7 +1087,7 @@ var FormField_default = /* @__PURE__ */ defineComponent({
977
1087
  });
978
1088
  //#endregion
979
1089
  //#region src/components/BaseInput.vue?vue&type=script&setup=true&lang.ts
980
- var _hoisted_1$19 = [
1090
+ var _hoisted_1$20 = [
981
1091
  "id",
982
1092
  "type",
983
1093
  "aria-invalid",
@@ -1023,7 +1133,7 @@ var BaseInput_default = /* @__PURE__ */ defineComponent({
1023
1133
  type: __props.type,
1024
1134
  "aria-invalid": invalid,
1025
1135
  "aria-describedby": describedBy
1026
- }, _ctx.$attrs, { class: ["border-hair bg-surface text-ink rounded-card focus-visible:outline-primary border px-3 focus-visible:outline-2 focus-visible:outline-offset-1", [SIZE_CLASS[__props.size], invalid ? "border-negative" : ""]] }), null, 16, _hoisted_1$19), [[vModelDynamic, model.value]])]),
1136
+ }, _ctx.$attrs, { class: ["border-hair bg-surface text-ink rounded-card focus-visible:outline-primary border px-3 focus-visible:outline-2 focus-visible:outline-offset-1", [SIZE_CLASS[__props.size], invalid ? "border-negative" : ""]] }), null, 16, _hoisted_1$20), [[vModelDynamic, model.value]])]),
1027
1137
  _: 1
1028
1138
  }, 8, [
1029
1139
  "label",
@@ -1037,8 +1147,8 @@ var BaseInput_default = /* @__PURE__ */ defineComponent({
1037
1147
  });
1038
1148
  //#endregion
1039
1149
  //#region src/components/BaseSheet.vue?vue&type=script&setup=true&lang.ts
1040
- var _hoisted_1$18 = { class: "shell-frame md:rounded-shell relative flex max-h-full flex-col justify-end overflow-hidden" };
1041
- var _hoisted_2$15 = ["aria-label"];
1150
+ var _hoisted_1$19 = { class: "shell-frame md:rounded-shell relative flex max-h-full flex-col justify-end overflow-hidden" };
1151
+ var _hoisted_2$16 = ["aria-label"];
1042
1152
  var _hoisted_3$11 = { class: "flex shrink-0 items-start gap-3 px-6 pt-4 pb-5" };
1043
1153
  var _hoisted_4$7 = { class: "min-w-0 flex-1" };
1044
1154
  var _hoisted_5$4 = { class: "text-ink text-xl leading-tight font-semibold" };
@@ -1046,8 +1156,7 @@ var _hoisted_6$2 = {
1046
1156
  key: 0,
1047
1157
  class: "text-ink-soft mt-1 text-sm leading-snug"
1048
1158
  };
1049
- var _hoisted_7$2 = ["aria-label"];
1050
- var _hoisted_8$1 = { class: "min-h-0 flex-1 overflow-y-auto px-6 pb-[calc(2rem+env(safe-area-inset-bottom,0px))]" };
1159
+ var _hoisted_7$2 = { class: "min-h-0 flex-1 overflow-y-auto px-6 pb-[calc(2rem+env(safe-area-inset-bottom,0px))]" };
1051
1160
  var BaseSheet_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
1052
1161
  __name: "BaseSheet",
1053
1162
  props: /*@__PURE__*/ mergeModels({
@@ -1118,7 +1227,7 @@ var BaseSheet_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
1118
1227
  key: 0,
1119
1228
  class: "fixed inset-x-0 top-0 bottom-0 z-50 flex items-center justify-center",
1120
1229
  style: normalizeStyle(viewportStyle.value)
1121
- }, [createElementVNode("div", _hoisted_1$18, [createElementVNode("div", {
1230
+ }, [createElementVNode("div", _hoisted_1$19, [createElementVNode("div", {
1122
1231
  class: "bg-ink/45 absolute inset-0 backdrop-blur-[2px]",
1123
1232
  onClick: close
1124
1233
  }), createElementVNode("section", {
@@ -1134,14 +1243,17 @@ var BaseSheet_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
1134
1243
  class: "flex shrink-0 justify-center pt-3",
1135
1244
  "aria-hidden": "true"
1136
1245
  }, [createElementVNode("span", { class: "bg-hair h-1.5 w-10 rounded-full" })], -1)),
1137
- createElementVNode("header", _hoisted_3$11, [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)]), createElementVNode("button", {
1138
- type: "button",
1246
+ createElementVNode("header", _hoisted_3$11, [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, {
1247
+ variant: "unstyled",
1139
1248
  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",
1140
1249
  "aria-label": __props.closeLabel,
1141
1250
  onClick: close
1142
- }, [createVNode(unref(X), { class: "size-5" })], 8, _hoisted_7$2)]),
1143
- createElementVNode("div", _hoisted_8$1, [renderSlot(_ctx.$slots, "default", {}, void 0, true)])
1144
- ], 8, _hoisted_2$15)])], 4)) : createCommentVNode("", true)]),
1251
+ }, {
1252
+ default: withCtx(() => [createVNode(unref(X), { class: "size-5" })]),
1253
+ _: 1
1254
+ }, 8, ["aria-label"])]),
1255
+ createElementVNode("div", _hoisted_7$2, [renderSlot(_ctx.$slots, "default", {}, void 0, true)])
1256
+ ], 8, _hoisted_2$16)])], 4)) : createCommentVNode("", true)]),
1145
1257
  _: 3
1146
1258
  })]);
1147
1259
  };
@@ -1156,14 +1268,14 @@ var _plugin_vue_export_helper_default = (sfc, props) => {
1156
1268
  };
1157
1269
  //#endregion
1158
1270
  //#region src/components/BaseSheet.vue
1159
- var BaseSheet_default = /*#__PURE__*/ _plugin_vue_export_helper_default(BaseSheet_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-cb967015"]]);
1271
+ var BaseSheet_default = /*#__PURE__*/ _plugin_vue_export_helper_default(BaseSheet_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-51709579"]]);
1160
1272
  //#endregion
1161
1273
  //#region src/components/BaseCard.vue?vue&type=script&setup=true&lang.ts
1162
- var _hoisted_1$17 = {
1274
+ var _hoisted_1$18 = {
1163
1275
  key: 0,
1164
1276
  class: "border-hair/70 border-b px-5 py-4"
1165
1277
  };
1166
- var _hoisted_2$14 = { class: "px-5 py-4" };
1278
+ var _hoisted_2$15 = { class: "px-5 py-4" };
1167
1279
  var _hoisted_3$10 = {
1168
1280
  key: 1,
1169
1281
  class: "border-hair/70 bg-muted/30 border-t px-5 py-3.5"
@@ -1195,8 +1307,8 @@ var BaseCard_default = /* @__PURE__ */ defineComponent({
1195
1307
  return (_ctx, _cache) => {
1196
1308
  return openBlock(), createBlock(resolveDynamicComponent(__props.as), { class: normalizeClass(["border-hair bg-surface rounded-card border", __props.interactive ? "transition-[transform,box-shadow] duration-300 ease-out hover:-translate-y-0.5 hover:shadow-lg active:translate-y-0 active:shadow-sm" : ""]) }, {
1197
1309
  default: withCtx(() => [
1198
- _ctx.$slots.head ? (openBlock(), createElementBlock("div", _hoisted_1$17, [renderSlot(_ctx.$slots, "head")])) : createCommentVNode("", true),
1199
- createElementVNode("div", _hoisted_2$14, [renderSlot(_ctx.$slots, "default")]),
1310
+ _ctx.$slots.head ? (openBlock(), createElementBlock("div", _hoisted_1$18, [renderSlot(_ctx.$slots, "head")])) : createCommentVNode("", true),
1311
+ createElementVNode("div", _hoisted_2$15, [renderSlot(_ctx.$slots, "default")]),
1200
1312
  _ctx.$slots.foot ? (openBlock(), createElementBlock("div", _hoisted_3$10, [renderSlot(_ctx.$slots, "foot")])) : createCommentVNode("", true)
1201
1313
  ]),
1202
1314
  _: 3
@@ -1206,8 +1318,8 @@ var BaseCard_default = /* @__PURE__ */ defineComponent({
1206
1318
  });
1207
1319
  //#endregion
1208
1320
  //#region src/components/BaseCheckbox.vue?vue&type=script&setup=true&lang.ts
1209
- var _hoisted_1$16 = { class: "flex flex-col gap-1.5" };
1210
- var _hoisted_2$13 = ["for"];
1321
+ var _hoisted_1$17 = { class: "flex flex-col gap-1.5" };
1322
+ var _hoisted_2$14 = ["for"];
1211
1323
  var _hoisted_3$9 = [
1212
1324
  "id",
1213
1325
  "disabled",
@@ -1245,7 +1357,7 @@ var BaseCheckbox_default = /* @__PURE__ */ defineComponent({
1245
1357
  if (__props.hint) return hintId;
1246
1358
  });
1247
1359
  return (_ctx, _cache) => {
1248
- return openBlock(), createElementBlock("div", _hoisted_1$16, [createElementVNode("label", {
1360
+ return openBlock(), createElementBlock("div", _hoisted_1$17, [createElementVNode("label", {
1249
1361
  for: unref(id),
1250
1362
  class: normalizeClass(["flex items-center", [__props.size === "sm" ? "gap-2" : "gap-3", __props.disabled ? "opacity-50" : "cursor-pointer"]])
1251
1363
  }, [withDirectives(createElementVNode("input", {
@@ -1256,7 +1368,7 @@ var BaseCheckbox_default = /* @__PURE__ */ defineComponent({
1256
1368
  "aria-invalid": Boolean(__props.error),
1257
1369
  "aria-describedby": describedBy.value,
1258
1370
  class: "accent-primary focus-visible:outline-primary size-4 shrink-0 focus-visible:outline-2 focus-visible:outline-offset-2"
1259
- }, 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$13), __props.error ? (openBlock(), createElementBlock("p", {
1371
+ }, 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", {
1260
1372
  key: 0,
1261
1373
  id: errorId,
1262
1374
  class: "text-negative text-xs"
@@ -1270,8 +1382,8 @@ var BaseCheckbox_default = /* @__PURE__ */ defineComponent({
1270
1382
  });
1271
1383
  //#endregion
1272
1384
  //#region src/components/BaseRadioGroup.vue?vue&type=script&setup=true&lang.ts
1273
- var _hoisted_1$15 = ["aria-describedby"];
1274
- var _hoisted_2$12 = [
1385
+ var _hoisted_1$16 = ["aria-describedby"];
1386
+ var _hoisted_2$13 = [
1275
1387
  "name",
1276
1388
  "value",
1277
1389
  "disabled"
@@ -1321,7 +1433,7 @@ var BaseRadioGroup_default = /* @__PURE__ */ defineComponent({
1321
1433
  value: option.value,
1322
1434
  disabled: option.disabled,
1323
1435
  class: "accent-primary focus-visible:outline-primary size-4 shrink-0 focus-visible:outline-2 focus-visible:outline-offset-2"
1324
- }, null, 8, _hoisted_2$12), [[vModelRadio, model.value]]), createElementVNode("span", _hoisted_3$8, toDisplayString(option.label), 1)], 2);
1436
+ }, null, 8, _hoisted_2$13), [[vModelRadio, model.value]]), createElementVNode("span", _hoisted_3$8, toDisplayString(option.label), 1)], 2);
1325
1437
  }), 128)),
1326
1438
  __props.error ? (openBlock(), createElementBlock("p", {
1327
1439
  key: 0,
@@ -1332,14 +1444,14 @@ var BaseRadioGroup_default = /* @__PURE__ */ defineComponent({
1332
1444
  id: hintId,
1333
1445
  class: "text-ink-soft text-xs"
1334
1446
  }, toDisplayString(__props.hint), 1)) : createCommentVNode("", true)
1335
- ], 8, _hoisted_1$15);
1447
+ ], 8, _hoisted_1$16);
1336
1448
  };
1337
1449
  }
1338
1450
  });
1339
1451
  //#endregion
1340
1452
  //#region src/components/BaseSelect.vue?vue&type=script&setup=true&lang.ts
1341
- var _hoisted_1$14 = { class: "relative" };
1342
- var _hoisted_2$11 = [
1453
+ var _hoisted_1$15 = { class: "relative" };
1454
+ var _hoisted_2$12 = [
1343
1455
  "id",
1344
1456
  "aria-invalid",
1345
1457
  "aria-describedby"
@@ -1384,7 +1496,7 @@ var BaseSelect_default = /* @__PURE__ */ defineComponent({
1384
1496
  "label-hidden": __props.labelHidden,
1385
1497
  size: __props.size
1386
1498
  }, {
1387
- default: withCtx(({ id, describedBy, invalid }) => [createElementVNode("div", _hoisted_1$14, [withDirectives(createElementVNode("select", {
1499
+ default: withCtx(({ id, describedBy, invalid }) => [createElementVNode("div", _hoisted_1$15, [withDirectives(createElementVNode("select", {
1388
1500
  id,
1389
1501
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => model.value = $event),
1390
1502
  "aria-invalid": invalid,
@@ -1396,7 +1508,7 @@ var BaseSelect_default = /* @__PURE__ */ defineComponent({
1396
1508
  value: option.value,
1397
1509
  disabled: option.disabled
1398
1510
  }, toDisplayString(option.label), 9, _hoisted_4$6);
1399
- }), 128))], 10, _hoisted_2$11), [[vModelSelect, model.value]]), createVNode(unref(ChevronDown), {
1511
+ }), 128))], 10, _hoisted_2$12), [[vModelSelect, model.value]]), createVNode(unref(ChevronDown), {
1400
1512
  class: "text-ink-soft pointer-events-none absolute top-1/2 right-3 size-4 -translate-y-1/2",
1401
1513
  "aria-hidden": "true"
1402
1514
  })])]),
@@ -1413,7 +1525,7 @@ var BaseSelect_default = /* @__PURE__ */ defineComponent({
1413
1525
  });
1414
1526
  //#endregion
1415
1527
  //#region src/components/BaseTextarea.vue?vue&type=script&setup=true&lang.ts
1416
- var _hoisted_1$13 = [
1528
+ var _hoisted_1$14 = [
1417
1529
  "id",
1418
1530
  "rows",
1419
1531
  "aria-invalid",
@@ -1455,7 +1567,7 @@ var BaseTextarea_default = /* @__PURE__ */ defineComponent({
1455
1567
  rows: __props.rows,
1456
1568
  "aria-invalid": invalid,
1457
1569
  "aria-describedby": describedBy
1458
- }, _ctx.$attrs, { class: ["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", [__props.size === "sm" ? "text-sm" : "text-base", invalid ? "border-negative" : ""]] }), null, 16, _hoisted_1$13), [[vModelText, model.value]])]),
1570
+ }, _ctx.$attrs, { class: ["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", [__props.size === "sm" ? "text-sm" : "text-base", invalid ? "border-negative" : ""]] }), null, 16, _hoisted_1$14), [[vModelText, model.value]])]),
1459
1571
  _: 1
1460
1572
  }, 8, [
1461
1573
  "label",
@@ -1469,8 +1581,8 @@ var BaseTextarea_default = /* @__PURE__ */ defineComponent({
1469
1581
  });
1470
1582
  //#endregion
1471
1583
  //#region src/components/EmptyState.vue?vue&type=script&setup=true&lang.ts
1472
- var _hoisted_1$12 = { class: "flex flex-col items-center gap-3 px-6 py-10 text-center" };
1473
- var _hoisted_2$10 = {
1584
+ var _hoisted_1$13 = { class: "flex flex-col items-center gap-3 px-6 py-10 text-center" };
1585
+ var _hoisted_2$11 = {
1474
1586
  key: 0,
1475
1587
  class: "bg-muted text-primary rounded-card flex size-12 items-center justify-center"
1476
1588
  };
@@ -1493,8 +1605,8 @@ var EmptyState_default = /* @__PURE__ */ defineComponent({
1493
1605
  },
1494
1606
  setup(__props) {
1495
1607
  return (_ctx, _cache) => {
1496
- return openBlock(), createElementBlock("div", _hoisted_1$12, [
1497
- _ctx.$slots.icon ? (openBlock(), createElementBlock("div", _hoisted_2$10, [renderSlot(_ctx.$slots, "icon")])) : createCommentVNode("", true),
1608
+ return openBlock(), createElementBlock("div", _hoisted_1$13, [
1609
+ _ctx.$slots.icon ? (openBlock(), createElementBlock("div", _hoisted_2$11, [renderSlot(_ctx.$slots, "icon")])) : createCommentVNode("", true),
1498
1610
  createElementVNode("h3", _hoisted_3$6, toDisplayString(__props.title), 1),
1499
1611
  __props.description ? (openBlock(), createElementBlock("p", _hoisted_4$5, toDisplayString(__props.description), 1)) : createCommentVNode("", true),
1500
1612
  _ctx.$slots.action ? (openBlock(), createElementBlock("div", _hoisted_5$3, [renderSlot(_ctx.$slots, "action")])) : createCommentVNode("", true)
@@ -1564,8 +1676,8 @@ var PageContainer_default = /* @__PURE__ */ defineComponent({
1564
1676
  });
1565
1677
  //#endregion
1566
1678
  //#region src/components/PageHeader.vue?vue&type=script&setup=true&lang.ts
1567
- var _hoisted_1$11 = { class: "grid h-12 shrink-0 grid-cols-[2.5rem_1fr_2.5rem] items-center" };
1568
- var _hoisted_2$9 = { class: "justify-self-start" };
1679
+ var _hoisted_1$12 = { class: "grid h-12 shrink-0 grid-cols-[2.5rem_1fr_2.5rem] items-center" };
1680
+ var _hoisted_2$10 = { class: "justify-self-start" };
1569
1681
  var _hoisted_3$5 = { class: "text-ink flex min-w-0 justify-center text-base font-semibold tabular-nums" };
1570
1682
  var _hoisted_4$4 = { class: "truncate" };
1571
1683
  var _hoisted_5$2 = { class: "justify-self-end" };
@@ -1576,8 +1688,8 @@ var PageHeader_default = /* @__PURE__ */ defineComponent({
1576
1688
  props: { title: {} },
1577
1689
  setup(__props) {
1578
1690
  return (_ctx, _cache) => {
1579
- return openBlock(), createElementBlock("header", _hoisted_1$11, [
1580
- createElementVNode("div", _hoisted_2$9, [renderSlot(_ctx.$slots, "left")]),
1691
+ return openBlock(), createElementBlock("header", _hoisted_1$12, [
1692
+ createElementVNode("div", _hoisted_2$10, [renderSlot(_ctx.$slots, "left")]),
1581
1693
  createElementVNode("h1", _hoisted_3$5, [renderSlot(_ctx.$slots, "title", {}, () => [createElementVNode("span", _hoisted_4$4, toDisplayString(__props.title), 1)])]),
1582
1694
  createElementVNode("div", _hoisted_5$2, [renderSlot(_ctx.$slots, "right")])
1583
1695
  ]);
@@ -1586,7 +1698,7 @@ var PageHeader_default = /* @__PURE__ */ defineComponent({
1586
1698
  });
1587
1699
  //#endregion
1588
1700
  //#region src/components/ProgressBar.vue?vue&type=script&setup=true&lang.ts
1589
- var _hoisted_1$10 = ["aria-valuenow", "aria-label"];
1701
+ var _hoisted_1$11 = ["aria-valuenow", "aria-label"];
1590
1702
  //#endregion
1591
1703
  //#region src/components/ProgressBar.vue
1592
1704
  var ProgressBar_default = /* @__PURE__ */ defineComponent({
@@ -1612,17 +1724,17 @@ var ProgressBar_default = /* @__PURE__ */ defineComponent({
1612
1724
  }, [createElementVNode("div", {
1613
1725
  class: "bg-primary h-full rounded-full transition-[width] duration-700 ease-out",
1614
1726
  style: normalizeStyle({ width: `${portion.value}%` })
1615
- }, null, 4)], 8, _hoisted_1$10);
1727
+ }, null, 4)], 8, _hoisted_1$11);
1616
1728
  };
1617
1729
  }
1618
1730
  });
1619
1731
  //#endregion
1620
1732
  //#region src/components/PriceCard.vue?vue&type=script&setup=true&lang.ts
1621
- var _hoisted_1$9 = {
1733
+ var _hoisted_1$10 = {
1622
1734
  key: 0,
1623
1735
  class: "bg-primary rounded-cell absolute -top-3 left-7 px-3 py-1 text-[0.7rem] font-semibold text-white"
1624
1736
  };
1625
- var _hoisted_2$8 = { class: "flex items-start justify-between gap-4" };
1737
+ var _hoisted_2$9 = { class: "flex items-start justify-between gap-4" };
1626
1738
  var _hoisted_3$4 = { class: "text-ink mt-5 text-lg font-semibold" };
1627
1739
  var _hoisted_4$3 = {
1628
1740
  key: 1,
@@ -1693,8 +1805,8 @@ var PriceCard_default = /* @__PURE__ */ defineComponent({
1693
1805
  const palette = computed(() => TONE[__props.tone]);
1694
1806
  return (_ctx, _cache) => {
1695
1807
  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"]]) }, [
1696
- __props.badge && __props.recommended ? (openBlock(), createElementBlock("span", _hoisted_1$9, toDisplayString(__props.badge), 1)) : createCommentVNode("", true),
1697
- createElementVNode("div", _hoisted_2$8, [_ctx.$slots.icon ? (openBlock(), createElementBlock("span", {
1808
+ __props.badge && __props.recommended ? (openBlock(), createElementBlock("span", _hoisted_1$10, toDisplayString(__props.badge), 1)) : createCommentVNode("", true),
1809
+ createElementVNode("div", _hoisted_2$9, [_ctx.$slots.icon ? (openBlock(), createElementBlock("span", {
1698
1810
  key: 0,
1699
1811
  class: normalizeClass(["rounded-card grid size-11 place-items-center text-xl", palette.value.icon])
1700
1812
  }, [renderSlot(_ctx.$slots, "icon")], 2)) : createCommentVNode("", true), __props.chip ? (openBlock(), createElementBlock("span", {
@@ -1718,8 +1830,8 @@ var PriceCard_default = /* @__PURE__ */ defineComponent({
1718
1830
  });
1719
1831
  //#endregion
1720
1832
  //#region src/components/ToneDot.vue?vue&type=script&setup=true&lang.ts
1721
- var _hoisted_1$8 = { class: "inline-flex items-center gap-1.5" };
1722
- var _hoisted_2$7 = {
1833
+ var _hoisted_1$9 = { class: "inline-flex items-center gap-1.5" };
1834
+ var _hoisted_2$8 = {
1723
1835
  key: 0,
1724
1836
  class: "text-ink-soft text-xs font-medium"
1725
1837
  };
@@ -1740,13 +1852,13 @@ var ToneDot_default = /* @__PURE__ */ defineComponent({
1740
1852
  * priorities — without this component knowing about any of them.
1741
1853
  */
1742
1854
  return (_ctx, _cache) => {
1743
- return openBlock(), createElementBlock("span", _hoisted_1$8, [createElementVNode("span", { class: normalizeClass(["size-2 rounded-full", __props.fill]) }, null, 2), __props.label ? (openBlock(), createElementBlock("span", _hoisted_2$7, toDisplayString(__props.label), 1)) : createCommentVNode("", true)]);
1855
+ 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)]);
1744
1856
  };
1745
1857
  }
1746
1858
  });
1747
1859
  //#endregion
1748
1860
  //#region src/components/SectionHeading.vue?vue&type=script&setup=true&lang.ts
1749
- var _hoisted_1$7 = {
1861
+ var _hoisted_1$8 = {
1750
1862
  key: 0,
1751
1863
  class: "text-ink-soft text-xs tabular-nums"
1752
1864
  };
@@ -1764,15 +1876,15 @@ var SectionHeading_default = /* @__PURE__ */ defineComponent({
1764
1876
  return openBlock(), createElementBlock("h2", { class: normalizeClass(["flex items-center gap-2 self-start rounded-full border px-3 py-1", __props.tone.card]) }, [
1765
1877
  createVNode(ToneDot_default, { fill: __props.tone.fill }, null, 8, ["fill"]),
1766
1878
  createElementVNode("span", { class: normalizeClass(["text-xs font-semibold tracking-wide uppercase", __props.tone.text]) }, toDisplayString(__props.label), 3),
1767
- __props.count > 0 ? (openBlock(), createElementBlock("span", _hoisted_1$7, toDisplayString(__props.count), 1)) : createCommentVNode("", true)
1879
+ __props.count > 0 ? (openBlock(), createElementBlock("span", _hoisted_1$8, toDisplayString(__props.count), 1)) : createCommentVNode("", true)
1768
1880
  ], 2);
1769
1881
  };
1770
1882
  }
1771
1883
  });
1772
1884
  //#endregion
1773
1885
  //#region src/components/SegmentedControl.vue?vue&type=script&setup=true&lang.ts
1774
- var _hoisted_1$6 = { class: "bg-muted rounded-card flex w-full gap-1 p-1" };
1775
- var _hoisted_2$6 = ["value", "name"];
1886
+ var _hoisted_1$7 = { class: "bg-muted rounded-card flex w-full gap-1 p-1" };
1887
+ var _hoisted_2$7 = ["value", "name"];
1776
1888
  //#endregion
1777
1889
  //#region src/components/SegmentedControl.vue
1778
1890
  var SegmentedControl_default = /* @__PURE__ */ defineComponent({
@@ -1786,7 +1898,7 @@ var SegmentedControl_default = /* @__PURE__ */ defineComponent({
1786
1898
  const model = useModel(__props, "modelValue");
1787
1899
  const name = useId();
1788
1900
  return (_ctx, _cache) => {
1789
- return openBlock(), createElementBlock("div", _hoisted_1$6, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.options, (option) => {
1901
+ return openBlock(), createElementBlock("div", _hoisted_1$7, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.options, (option) => {
1790
1902
  return openBlock(), createElementBlock("label", {
1791
1903
  key: String(option.value),
1792
1904
  class: "flex-1 cursor-pointer"
@@ -1796,15 +1908,15 @@ var SegmentedControl_default = /* @__PURE__ */ defineComponent({
1796
1908
  value: option.value,
1797
1909
  name: unref(name),
1798
1910
  class: "sr-only"
1799
- }, null, 8, _hoisted_2$6), [[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)]);
1911
+ }, 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)]);
1800
1912
  }), 128))]);
1801
1913
  };
1802
1914
  }
1803
1915
  });
1804
1916
  //#endregion
1805
1917
  //#region src/components/SettingsGroup.vue?vue&type=script&setup=true&lang.ts
1806
- var _hoisted_1$5 = { class: "flex flex-col gap-2" };
1807
- var _hoisted_2$5 = { class: "text-ink-soft px-1 text-xs font-semibold tracking-wide uppercase" };
1918
+ var _hoisted_1$6 = { class: "flex flex-col gap-2" };
1919
+ var _hoisted_2$6 = { class: "text-ink-soft px-1 text-xs font-semibold tracking-wide uppercase" };
1808
1920
  var _hoisted_3$3 = { class: "border-hair bg-surface rounded-card divide-hair divide-y overflow-hidden border" };
1809
1921
  //#endregion
1810
1922
  //#region src/components/SettingsGroup.vue
@@ -1813,14 +1925,14 @@ var SettingsGroup_default = /* @__PURE__ */ defineComponent({
1813
1925
  props: { title: {} },
1814
1926
  setup(__props) {
1815
1927
  return (_ctx, _cache) => {
1816
- return openBlock(), createElementBlock("section", _hoisted_1$5, [createElementVNode("h2", _hoisted_2$5, toDisplayString(__props.title), 1), createElementVNode("div", _hoisted_3$3, [renderSlot(_ctx.$slots, "default")])]);
1928
+ 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")])]);
1817
1929
  };
1818
1930
  }
1819
1931
  });
1820
1932
  //#endregion
1821
1933
  //#region src/components/SettingsRow.vue?vue&type=script&setup=true&lang.ts
1822
- var _hoisted_1$4 = { class: "flex items-center gap-3" };
1823
- var _hoisted_2$4 = {
1934
+ var _hoisted_1$5 = { class: "flex items-center gap-3" };
1935
+ var _hoisted_2$5 = {
1824
1936
  key: 0,
1825
1937
  class: "bg-muted text-ink-soft flex size-9 shrink-0 items-center justify-center rounded-xl",
1826
1938
  "aria-hidden": "true"
@@ -1862,8 +1974,8 @@ var SettingsRow_default = /* @__PURE__ */ defineComponent({
1862
1974
  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" : ""]]),
1863
1975
  onClick: _cache[0] || (_cache[0] = ($event) => __props.interactive && emit("click"))
1864
1976
  }, {
1865
- default: withCtx(() => [createElementVNode("div", _hoisted_1$4, [
1866
- __props.icon ? (openBlock(), createElementBlock("span", _hoisted_2$4, [(openBlock(), createBlock(resolveDynamicComponent(__props.icon), { class: "size-[18px]" }))])) : createCommentVNode("", true),
1977
+ default: withCtx(() => [createElementVNode("div", _hoisted_1$5, [
1978
+ __props.icon ? (openBlock(), createElementBlock("span", _hoisted_2$5, [(openBlock(), createBlock(resolveDynamicComponent(__props.icon), { class: "size-[18px]" }))])) : createCommentVNode("", true),
1867
1979
  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)]),
1868
1980
  !__props.stacked ? (openBlock(), createElementBlock("div", _hoisted_6, [renderSlot(_ctx.$slots, "default")])) : createCommentVNode("", true),
1869
1981
  __props.interactive ? (openBlock(), createBlock(unref(ChevronRight), {
@@ -1879,11 +1991,11 @@ var SettingsRow_default = /* @__PURE__ */ defineComponent({
1879
1991
  });
1880
1992
  //#endregion
1881
1993
  //#region src/components/SkeletonList.vue?vue&type=script&setup=true&lang.ts
1882
- var _hoisted_1$3 = {
1994
+ var _hoisted_1$4 = {
1883
1995
  role: "status",
1884
1996
  class: "flex flex-col gap-1"
1885
1997
  };
1886
- var _hoisted_2$3 = { class: "sr-only" };
1998
+ var _hoisted_2$4 = { class: "sr-only" };
1887
1999
  //#endregion
1888
2000
  //#region src/components/SkeletonList.vue
1889
2001
  var SkeletonList_default = /* @__PURE__ */ defineComponent({
@@ -1897,7 +2009,7 @@ var SkeletonList_default = /* @__PURE__ */ defineComponent({
1897
2009
  /** A length starts with a digit, a dot, or opens a CSS function. */
1898
2010
  const isLength = computed(() => /^(?:[.\d]|calc\(|var\(|clamp\(|min\(|max\()/.test(__props.rowHeight));
1899
2011
  return (_ctx, _cache) => {
1900
- return openBlock(), createElementBlock("div", _hoisted_1$3, [createElementVNode("span", _hoisted_2$3, toDisplayString(__props.label), 1), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.rows, (row) => {
2012
+ return openBlock(), createElementBlock("div", _hoisted_1$4, [createElementVNode("span", _hoisted_2$4, toDisplayString(__props.label), 1), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.rows, (row) => {
1901
2013
  return openBlock(), createElementBlock("div", {
1902
2014
  key: row,
1903
2015
  class: normalizeClass(["bg-muted rounded-card animate-pulse", isLength.value ? void 0 : __props.rowHeight]),
@@ -1910,8 +2022,8 @@ var SkeletonList_default = /* @__PURE__ */ defineComponent({
1910
2022
  });
1911
2023
  //#endregion
1912
2024
  //#region src/components/StatCard.vue?vue&type=script&setup=true&lang.ts
1913
- var _hoisted_1$2 = { class: "border-hair rounded-card flex flex-1 flex-col gap-0.5 border p-3" };
1914
- var _hoisted_2$2 = { class: "flex items-baseline gap-1" };
2025
+ var _hoisted_1$3 = { class: "border-hair rounded-card flex flex-1 flex-col gap-0.5 border p-3" };
2026
+ var _hoisted_2$3 = { class: "flex items-baseline gap-1" };
1915
2027
  var _hoisted_3$1 = { class: "text-ink text-xl font-semibold tabular-nums" };
1916
2028
  var _hoisted_4$1 = { class: "text-ink-soft text-xs" };
1917
2029
  //#endregion
@@ -1930,7 +2042,7 @@ var StatCard_default = /* @__PURE__ */ defineComponent({
1930
2042
  flat: ArrowRight
1931
2043
  };
1932
2044
  return (_ctx, _cache) => {
1933
- return openBlock(), createElementBlock("div", _hoisted_1$2, [createElementVNode("div", _hoisted_2$2, [createElementVNode("span", _hoisted_3$1, toDisplayString(__props.value), 1), __props.trend ? (openBlock(), createBlock(resolveDynamicComponent(TREND_ICON[__props.trend]), {
2045
+ return openBlock(), createElementBlock("div", _hoisted_1$3, [createElementVNode("div", _hoisted_2$3, [createElementVNode("span", _hoisted_3$1, toDisplayString(__props.value), 1), __props.trend ? (openBlock(), createBlock(resolveDynamicComponent(TREND_ICON[__props.trend]), {
1934
2046
  key: 0,
1935
2047
  class: "text-ink-soft size-3"
1936
2048
  })) : createCommentVNode("", true)]), createElementVNode("span", _hoisted_4$1, toDisplayString(__props.label), 1)]);
@@ -1938,6 +2050,91 @@ var StatCard_default = /* @__PURE__ */ defineComponent({
1938
2050
  }
1939
2051
  });
1940
2052
  //#endregion
2053
+ //#region src/components/ToastHost.vue?vue&type=script&setup=true&lang.ts
2054
+ var _hoisted_1$2 = [
2055
+ "onMouseenter",
2056
+ "onMouseleave",
2057
+ "onFocusin",
2058
+ "onFocusout"
2059
+ ];
2060
+ var _hoisted_2$2 = { class: "flex-1 text-sm leading-snug" };
2061
+ //#endregion
2062
+ //#region src/components/ToastHost.vue
2063
+ var ToastHost_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
2064
+ __name: "ToastHost",
2065
+ props: {
2066
+ closeLabel: {},
2067
+ bottom: {
2068
+ type: Boolean,
2069
+ default: false
2070
+ }
2071
+ },
2072
+ setup(__props) {
2073
+ const { toasts, dismiss, pause, resume } = useToast();
2074
+ /**
2075
+ * Teleport needs a `body`, and a server has none.
2076
+ *
2077
+ * Rendering nothing until mounted is also correct rather than merely safe: a
2078
+ * prerendered page has no toasts in it, so there is nothing to hydrate and
2079
+ * nothing to flash.
2080
+ */
2081
+ const mounted = ref(false);
2082
+ onMounted(() => mounted.value = true);
2083
+ const ICON = {
2084
+ info: Info,
2085
+ success: CheckCircle2,
2086
+ warning: TriangleAlert,
2087
+ danger: XCircle
2088
+ };
2089
+ const TONE_CLASS = {
2090
+ info: "text-primary",
2091
+ success: "text-positive",
2092
+ warning: "text-warning",
2093
+ danger: "text-negative"
2094
+ };
2095
+ return (_ctx, _cache) => {
2096
+ return mounted.value ? (openBlock(), createBlock(Teleport, {
2097
+ key: 0,
2098
+ to: "body"
2099
+ }, [createElementVNode("div", {
2100
+ class: normalizeClass(["pointer-events-none fixed inset-x-0 z-[100] flex flex-col items-center gap-2 px-4", __props.bottom ? "bottom-0 pb-[max(1rem,env(safe-area-inset-bottom))]" : "top-0 pt-4"]),
2101
+ role: "status",
2102
+ "aria-live": "polite"
2103
+ }, [createVNode(TransitionGroup, { name: "toast" }, {
2104
+ default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(toasts), (toast) => {
2105
+ return openBlock(), createElementBlock("div", {
2106
+ key: toast.id,
2107
+ class: "border-hair bg-surface text-ink rounded-card pointer-events-auto flex w-full max-w-sm items-start gap-3 border p-3 shadow-lg",
2108
+ onMouseenter: ($event) => unref(pause)(toast.id),
2109
+ onMouseleave: ($event) => unref(resume)(toast.id),
2110
+ onFocusin: ($event) => unref(pause)(toast.id),
2111
+ onFocusout: ($event) => unref(resume)(toast.id)
2112
+ }, [
2113
+ (openBlock(), createBlock(resolveDynamicComponent(ICON[toast.tone]), {
2114
+ class: normalizeClass(["mt-0.5 size-5 shrink-0", TONE_CLASS[toast.tone]]),
2115
+ "aria-hidden": "true"
2116
+ }, null, 8, ["class"])),
2117
+ createElementVNode("p", _hoisted_2$2, toDisplayString(toast.message), 1),
2118
+ createVNode(BaseButton_default, {
2119
+ variant: "quiet",
2120
+ icon: "",
2121
+ pill: "",
2122
+ size: "sm",
2123
+ class: "-my-1 shrink-0",
2124
+ "aria-label": __props.closeLabel,
2125
+ onClick: ($event) => unref(dismiss)(toast.id)
2126
+ }, {
2127
+ default: withCtx(() => [createVNode(unref(X), { class: "size-4" })]),
2128
+ _: 1
2129
+ }, 8, ["aria-label", "onClick"])
2130
+ ], 40, _hoisted_1$2);
2131
+ }), 128))]),
2132
+ _: 1
2133
+ })], 2)])) : createCommentVNode("", true);
2134
+ };
2135
+ }
2136
+ }), [["__scopeId", "data-v-f1a3439c"]]);
2137
+ //#endregion
1941
2138
  //#region src/components/LocaleLinks.vue?vue&type=script&setup=true&lang.ts
1942
2139
  var _hoisted_1$1 = ["aria-label"];
1943
2140
  var _hoisted_2$1 = [
@@ -2188,8 +2385,8 @@ function createI18nRuntime(options) {
2188
2385
  *
2189
2386
  * The fallback keeps `vitest` and `vite dev` honest, where no define runs.
2190
2387
  */
2191
- var VERSION = "0.7.1";
2388
+ var VERSION = "0.8.0";
2192
2389
  //#endregion
2193
- 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, 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, useToday, useVisualViewport };
2390
+ 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 };
2194
2391
 
2195
2392
  //# sourceMappingURL=index.js.map