rei-kit 2.11.0 → 2.13.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
@@ -3,7 +3,7 @@ import { n as formatNumber, r as setFormatLocale, t as formatDate } from "./form
3
3
  import { a as SHEET_ROOT_ID, i as useVisualViewport, o as ensureSheetRoot, r as useBoundValue, t as BaseSheet_default } from "./BaseSheet-B7401rS7.js";
4
4
  import { a as BaseAlert_default, c as applyTheme, d as setThemeStorageKey, f as useTheme, h as toRedirectPath, i as FormField_default, l as isThemePreference, m as safeRedirect, n as BaseCheckbox_default, o as useToast, p as tapFeedback, r as BaseInput_default, s as useOnline, t as GoogleButton_default, u as readStoredTheme } from "./GoogleButton-mCqGbrXm.js";
5
5
  import { n as registerErrorMapper, r as toAppError, t as AppError } from "./app-error-DF9cijE0.js";
6
- import { n as BaseListbox_default, r as useMediaQuery, t as BaseSkeleton_default } from "./BaseSkeleton-DnqwogzV.js";
6
+ import { n as BaseSkeleton_default, r as useMediaQuery, t as BaseListbox_default } from "./BaseListbox-BnaHlmMN.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";
@@ -621,7 +621,11 @@ var BaseCard_default = /* @__PURE__ */ defineComponent({
621
621
  //#endregion
622
622
  //#region src/components/BaseCombobox.vue?vue&type=script&setup=true&lang.ts
623
623
  var _hoisted_1$38 = ["for"];
624
- var _hoisted_2$32 = { class: "rk-combo-field" };
624
+ var _hoisted_2$32 = [
625
+ "aria-label",
626
+ "disabled",
627
+ "onClick"
628
+ ];
625
629
  var _hoisted_3$21 = [
626
630
  "id",
627
631
  "placeholder",
@@ -632,22 +636,38 @@ var _hoisted_3$21 = [
632
636
  "aria-describedby"
633
637
  ];
634
638
  var _hoisted_4$16 = ["disabled"];
635
- var _hoisted_5$9 = ["aria-label"];
639
+ var _hoisted_5$9 = [
640
+ "aria-label",
641
+ "aria-multiselectable",
642
+ "aria-busy"
643
+ ];
636
644
  var _hoisted_6$5 = [
637
645
  "id",
638
646
  "aria-selected",
647
+ "aria-setsize",
648
+ "aria-posinset",
639
649
  "onPointerdown",
640
650
  "onPointermove"
641
651
  ];
642
652
  var _hoisted_7$4 = {
643
- key: 0,
653
+ key: 2,
654
+ class: "rk-combo-status"
655
+ };
656
+ var _hoisted_8$3 = { key: 0 };
657
+ var _hoisted_9$3 = {
658
+ class: "rk-combo-status-rows",
659
+ "aria-hidden": "true"
660
+ };
661
+ var _hoisted_10$3 = {
662
+ key: 3,
644
663
  class: "rk-combo-empty"
645
664
  };
646
665
  //#endregion
647
666
  //#region src/components/BaseCombobox.vue
648
667
  var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
649
668
  __name: "BaseCombobox",
650
- props: /*@__PURE__*/ mergeModels({
669
+ props: {
670
+ modelValue: { default: () => void 0 },
651
671
  label: {},
652
672
  options: {},
653
673
  placeholder: { default: "" },
@@ -657,14 +677,38 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
657
677
  type: Boolean,
658
678
  default: false
659
679
  },
660
- emptyLabel: {}
661
- }, {
662
- "modelValue": { default: "" },
663
- "modelModifiers": {}
664
- }),
665
- emits: ["update:modelValue"],
666
- setup(__props) {
667
- const model = useModel(__props, "modelValue");
680
+ emptyLabel: {},
681
+ mode: { default: "single" },
682
+ removeLabel: {
683
+ type: Function,
684
+ default: void 0
685
+ },
686
+ loading: {
687
+ type: Boolean,
688
+ default: false
689
+ },
690
+ loadingLabel: { default: "" },
691
+ filter: { default: "local" },
692
+ debounce: { default: 200 },
693
+ virtualizeAfter: { default: 150 },
694
+ rowHeight: { default: 36 }
695
+ },
696
+ emits: ["update:modelValue", "search"],
697
+ setup(__props, { emit: __emit }) {
698
+ /** Multiple always hands back an array; a single choice is the value or ''. */
699
+ const emit = __emit;
700
+ const model = useBoundValue(() => __props.modelValue, (value) => emit("update:modelValue", value));
701
+ const multiple = computed(() => __props.mode === "multiple");
702
+ /** The chosen values, however many there are, as a plain array. */
703
+ const chosen = computed(() => {
704
+ const value = model.value;
705
+ if (Array.isArray(value)) return value;
706
+ return value === void 0 || value === "" ? [] : [value];
707
+ });
708
+ const chosenOptions = computed(() => chosen.value.map((value) => __props.options.find((option) => option.value === value) ?? {
709
+ value,
710
+ label: value
711
+ }));
668
712
  const id = useId();
669
713
  const listId = `${id}-list`;
670
714
  const hintId = `${id}-hint`;
@@ -675,31 +719,79 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
675
719
  const highlighted = ref(0);
676
720
  const root = ref(null);
677
721
  const list = ref(null);
678
- const selected = computed(() => __props.options.find((option) => option.value === model.value));
679
- /** What the input shows: the query while typing, the chosen label otherwise. */
722
+ const single = computed(() => multiple.value ? void 0 : chosenOptions.value[0]);
723
+ /**
724
+ * What the input shows.
725
+ *
726
+ * In multiple mode it is always the query: the answers are the chips beside
727
+ * it, and writing one of them into the field would mean deleting it to search
728
+ * for the next.
729
+ */
680
730
  const text = computed({
681
- get: () => open.value ? query.value : selected.value?.label ?? "",
731
+ get: () => multiple.value || open.value ? query.value : single.value?.label ?? "",
682
732
  set: (value) => {
683
733
  query.value = value;
684
734
  open.value = true;
685
735
  highlighted.value = 0;
736
+ announce(value);
686
737
  }
687
738
  });
688
739
  const matches = computed(() => {
689
740
  const needle = query.value.trim().toLowerCase();
690
- if (!open.value || needle === "") return __props.options;
741
+ if (__props.filter === "none" || !open.value || needle === "") return __props.options;
691
742
  return __props.options.filter((option) => option.label.toLowerCase().includes(needle));
692
743
  });
693
744
  const describedBy = computed(() => {
694
745
  if (__props.error) return errorId;
695
746
  if (__props.hint) return hintId;
696
747
  });
748
+ let timer;
749
+ function announce(value) {
750
+ if (timer) clearTimeout(timer);
751
+ timer = setTimeout(() => emit("search", value.trim()), __props.debounce);
752
+ }
753
+ const virtual = computed(() => matches.value.length > __props.virtualizeAfter);
754
+ const scrollTop = ref(0);
755
+ /** How tall the list box is; read once it is open, never guessed. */
756
+ const viewport = ref(224);
757
+ const window_ = computed(() => {
758
+ if (!virtual.value) return {
759
+ start: 0,
760
+ end: matches.value.length
761
+ };
762
+ const first = Math.max(0, Math.floor(scrollTop.value / __props.rowHeight) - 3);
763
+ const count = Math.ceil(viewport.value / __props.rowHeight) + 6;
764
+ return {
765
+ start: first,
766
+ end: Math.min(matches.value.length, first + count)
767
+ };
768
+ });
769
+ const rows = computed(() => matches.value.slice(window_.value.start, window_.value.end).map((option, index) => ({
770
+ option,
771
+ /** The row's place in the whole list, not in the window. */
772
+ index: window_.value.start + index
773
+ })));
774
+ const padTop = computed(() => virtual.value ? window_.value.start * __props.rowHeight : 0);
775
+ const padBottom = computed(() => virtual.value ? (matches.value.length - window_.value.end) * __props.rowHeight : 0);
776
+ function onScroll(event) {
777
+ scrollTop.value = event.target.scrollTop;
778
+ }
697
779
  function choose(option) {
698
780
  if (!option) return;
781
+ if (multiple.value) {
782
+ const next = chosen.value.includes(option.value) ? chosen.value.filter((one) => one !== option.value) : [...chosen.value, option.value];
783
+ model.value = next;
784
+ query.value = "";
785
+ return;
786
+ }
699
787
  model.value = option.value;
700
788
  query.value = "";
701
789
  open.value = false;
702
790
  }
791
+ function remove(value) {
792
+ if (!multiple.value) return;
793
+ model.value = chosen.value.filter((one) => one !== value);
794
+ }
703
795
  function move(delta) {
704
796
  const count = matches.value.length;
705
797
  if (count === 0) return;
@@ -709,6 +801,13 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
709
801
  }
710
802
  async function scrollHighlightIntoView() {
711
803
  await nextTick();
804
+ if (virtual.value && list.value) {
805
+ const top = highlighted.value * __props.rowHeight;
806
+ const bottom = top + __props.rowHeight;
807
+ if (top < list.value.scrollTop) list.value.scrollTop = top;
808
+ else if (bottom > list.value.scrollTop + viewport.value) list.value.scrollTop = bottom - viewport.value;
809
+ return;
810
+ }
712
811
  (list.value?.children[highlighted.value])?.scrollIntoView?.({ block: "nearest" });
713
812
  }
714
813
  function onKeydown(event) {
@@ -726,12 +825,18 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
726
825
  event.preventDefault();
727
826
  choose(matches.value[highlighted.value]);
728
827
  break;
828
+ case "Backspace":
829
+ if (multiple.value && query.value === "" && chosen.value.length > 0) {
830
+ event.preventDefault();
831
+ remove(chosen.value[chosen.value.length - 1]);
832
+ }
833
+ break;
729
834
  case "Escape":
730
835
  event.preventDefault();
731
836
  if (open.value) {
732
837
  open.value = false;
733
838
  query.value = "";
734
- } else model.value = "";
839
+ } else if (!multiple.value) model.value = "";
735
840
  break;
736
841
  case "Tab": open.value = false;
737
842
  }
@@ -742,12 +847,19 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
742
847
  query.value = "";
743
848
  }
744
849
  }
745
- watch(open, (isOpen) => {
850
+ watch(open, async (isOpen) => {
746
851
  if (typeof document === "undefined") return;
747
- if (isOpen) document.addEventListener("pointerdown", onDocumentPointer);
748
- else document.removeEventListener("pointerdown", onDocumentPointer);
852
+ if (isOpen) {
853
+ document.addEventListener("pointerdown", onDocumentPointer);
854
+ await nextTick();
855
+ if (list.value) viewport.value = list.value.clientHeight || viewport.value;
856
+ } else document.removeEventListener("pointerdown", onDocumentPointer);
749
857
  }, { immediate: true });
858
+ watch(matches, () => {
859
+ if (highlighted.value >= matches.value.length) highlighted.value = 0;
860
+ });
750
861
  onBeforeUnmount(() => {
862
+ if (timer) clearTimeout(timer);
751
863
  if (typeof document !== "undefined") document.removeEventListener("pointerdown", onDocumentPointer);
752
864
  });
753
865
  return (_ctx, _cache) => {
@@ -760,52 +872,93 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
760
872
  for: unref(id),
761
873
  class: "rk-combo-label"
762
874
  }, toDisplayString(__props.label), 9, _hoisted_1$38),
763
- createElementVNode("div", _hoisted_2$32, [withDirectives(createElementVNode("input", {
764
- id: unref(id),
765
- "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => text.value = $event),
766
- type: "text",
767
- role: "combobox",
768
- class: "rk-combo-input control",
769
- autocomplete: "off",
770
- placeholder: __props.placeholder,
771
- disabled: __props.disabled,
772
- "aria-expanded": open.value,
773
- "aria-controls": listId,
774
- "aria-autocomplete": "list",
775
- "aria-activedescendant": open.value ? optionId(highlighted.value) : void 0,
776
- "aria-invalid": Boolean(__props.error),
777
- "aria-describedby": describedBy.value,
778
- onKeydown,
779
- onFocus: _cache[1] || (_cache[1] = ($event) => open.value = true)
780
- }, null, 40, _hoisted_3$21), [[vModelText, text.value]]), createElementVNode("button", {
781
- type: "button",
782
- class: "rk-combo-toggle",
783
- tabindex: "-1",
784
- "aria-hidden": "true",
785
- disabled: __props.disabled,
786
- onClick: _cache[2] || (_cache[2] = ($event) => open.value = !open.value)
787
- }, "", 8, _hoisted_4$16)]),
875
+ createElementVNode("div", { class: normalizeClass(["rk-combo-field", multiple.value ? "is-multiple control" : ""]) }, [
876
+ (openBlock(true), createElementBlock(Fragment, null, renderList(multiple.value ? chosenOptions.value : [], (option) => {
877
+ return openBlock(), createElementBlock("span", {
878
+ key: option.value,
879
+ class: "rk-combo-chip"
880
+ }, [createElementVNode("span", null, toDisplayString(option.label), 1), __props.removeLabel ? (openBlock(), createElementBlock("button", {
881
+ key: 0,
882
+ type: "button",
883
+ class: "rk-combo-chip-x focus-ring",
884
+ "aria-label": __props.removeLabel(option.label),
885
+ disabled: __props.disabled,
886
+ onClick: ($event) => remove(option.value)
887
+ }, " × ", 8, _hoisted_2$32)) : createCommentVNode("", true)]);
888
+ }), 128)),
889
+ withDirectives(createElementVNode("input", {
890
+ id: unref(id),
891
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => text.value = $event),
892
+ type: "text",
893
+ role: "combobox",
894
+ class: normalizeClass(["rk-combo-input", { control: !multiple.value }]),
895
+ autocomplete: "off",
896
+ placeholder: __props.placeholder,
897
+ disabled: __props.disabled,
898
+ "aria-expanded": open.value,
899
+ "aria-controls": listId,
900
+ "aria-autocomplete": "list",
901
+ "aria-activedescendant": open.value ? optionId(highlighted.value) : void 0,
902
+ "aria-invalid": Boolean(__props.error),
903
+ "aria-describedby": describedBy.value,
904
+ onKeydown,
905
+ onFocus: _cache[1] || (_cache[1] = ($event) => open.value = true)
906
+ }, null, 42, _hoisted_3$21), [[vModelText, text.value]]),
907
+ createElementVNode("button", {
908
+ type: "button",
909
+ class: "rk-combo-toggle",
910
+ tabindex: "-1",
911
+ "aria-hidden": "true",
912
+ disabled: __props.disabled,
913
+ onClick: _cache[2] || (_cache[2] = ($event) => open.value = !open.value)
914
+ }, " ▾ ", 8, _hoisted_4$16)
915
+ ], 2),
788
916
  withDirectives(createElementVNode("ul", {
789
917
  id: listId,
790
918
  ref_key: "list",
791
919
  ref: list,
792
920
  role: "listbox",
793
921
  class: "rk-combo-list surface-overlay",
794
- "aria-label": __props.label
795
- }, [(openBlock(true), createElementBlock(Fragment, null, renderList(matches.value, (option, index) => {
796
- return openBlock(), createElementBlock("li", {
797
- id: optionId(index),
798
- key: option.value,
799
- role: "option",
800
- class: normalizeClass(["rk-combo-option", {
801
- "is-highlighted": index === highlighted.value,
802
- "is-selected": option.value === model.value
803
- }]),
804
- "aria-selected": option.value === model.value,
805
- onPointerdown: withModifiers(($event) => choose(option), ["prevent"]),
806
- onPointermove: ($event) => highlighted.value = index
807
- }, toDisplayString(option.label), 43, _hoisted_6$5);
808
- }), 128)), matches.value.length === 0 ? (openBlock(), createElementBlock("li", _hoisted_7$4, toDisplayString(__props.emptyLabel), 1)) : createCommentVNode("", true)], 8, _hoisted_5$9), [[vShow, open.value]]),
922
+ "aria-label": __props.label,
923
+ "aria-multiselectable": multiple.value ? true : void 0,
924
+ "aria-busy": __props.loading ? true : void 0,
925
+ onScroll
926
+ }, [
927
+ padTop.value > 0 ? (openBlock(), createElementBlock("li", {
928
+ key: 0,
929
+ style: normalizeStyle({ height: `${padTop.value}px` }),
930
+ "aria-hidden": "true"
931
+ }, null, 4)) : createCommentVNode("", true),
932
+ (openBlock(true), createElementBlock(Fragment, null, renderList(rows.value, (row) => {
933
+ return openBlock(), createElementBlock("li", {
934
+ id: optionId(row.index),
935
+ key: row.option.value,
936
+ role: "option",
937
+ class: normalizeClass(["rk-combo-option", {
938
+ "is-highlighted": row.index === highlighted.value,
939
+ "is-selected": chosen.value.includes(row.option.value)
940
+ }]),
941
+ style: normalizeStyle(virtual.value ? { height: `${__props.rowHeight}px` } : void 0),
942
+ "aria-selected": chosen.value.includes(row.option.value),
943
+ "aria-setsize": matches.value.length,
944
+ "aria-posinset": row.index + 1,
945
+ onPointerdown: withModifiers(($event) => choose(row.option), ["prevent"]),
946
+ onPointermove: ($event) => highlighted.value = row.index
947
+ }, toDisplayString(row.option.label), 47, _hoisted_6$5);
948
+ }), 128)),
949
+ padBottom.value > 0 ? (openBlock(), createElementBlock("li", {
950
+ key: 1,
951
+ style: normalizeStyle({ height: `${padBottom.value}px` }),
952
+ "aria-hidden": "true"
953
+ }, null, 4)) : createCommentVNode("", true),
954
+ __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) => {
955
+ return createVNode(BaseSkeleton_default, {
956
+ key: n,
957
+ shape: "text",
958
+ height: "0.75rem"
959
+ });
960
+ }), 64))])])) : matches.value.length === 0 ? (openBlock(), createElementBlock("li", _hoisted_10$3, toDisplayString(__props.emptyLabel), 1)) : createCommentVNode("", true)
961
+ ], 40, _hoisted_5$9), [[vShow, open.value]]),
809
962
  __props.error ? (openBlock(), createElementBlock("p", {
810
963
  key: 0,
811
964
  id: errorId,
@@ -818,7 +971,7 @@ var BaseCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
818
971
  ], 512);
819
972
  };
820
973
  }
821
- }), [["__scopeId", "data-v-ce4c503f"]]);
974
+ }), [["__scopeId", "data-v-aa2335fa"]]);
822
975
  //#endregion
823
976
  //#region src/components/BaseRadioGroup.vue?vue&type=script&setup=true&lang.ts
824
977
  var _hoisted_1$37 = ["aria-describedby"];
@@ -1203,14 +1356,14 @@ var BaseTable_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
1203
1356
  return openBlock(), createElementBlock("th", {
1204
1357
  key: column.key,
1205
1358
  scope: "col",
1206
- class: normalizeClass([column.align === "end" && "is-end", column.nowrap && "is-nowrap"])
1359
+ class: normalizeClass([column.align && `is-${column.align}`, column.nowrap && "is-nowrap"])
1207
1360
  }, toDisplayString(column.label), 3);
1208
1361
  }), 128))])]),
1209
1362
  __props.rows.length > 0 ? (openBlock(), createElementBlock("tbody", _hoisted_3$16, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.rows, (row, index) => {
1210
1363
  return openBlock(), createElementBlock("tr", { key: keyFor(row, index) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (column) => {
1211
1364
  return openBlock(), createElementBlock("td", {
1212
1365
  key: column.key,
1213
- class: normalizeClass([column.align === "end" && "is-end", column.nowrap && "is-nowrap"])
1366
+ class: normalizeClass([column.align && `is-${column.align}`, column.nowrap && "is-nowrap"])
1214
1367
  }, [renderSlot(_ctx.$slots, column.key, {
1215
1368
  row,
1216
1369
  value: row[column.key]
@@ -1223,7 +1376,7 @@ var BaseTable_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PU
1223
1376
  ])], 8, _hoisted_1$32);
1224
1377
  };
1225
1378
  }
1226
- }), [["__scopeId", "data-v-89958b5a"]]);
1379
+ }), [["__scopeId", "data-v-ab10e9fa"]]);
1227
1380
  //#endregion
1228
1381
  //#region src/components/BaseTextarea.vue?vue&type=script&setup=true&lang.ts
1229
1382
  var _hoisted_1$31 = [
@@ -4021,7 +4174,7 @@ function createI18nRuntime(options) {
4021
4174
  *
4022
4175
  * The fallback keeps `vitest` and `vite dev` honest, where no define runs.
4023
4176
  */
4024
- var VERSION = "2.11.0";
4177
+ var VERSION = "2.13.0";
4025
4178
  //#endregion
4026
4179
  export { 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, CircularProgress_default as CircularProgress, CopyButton_default as CopyButton, DescriptionList_default as DescriptionList, EmptyState_default as EmptyState, ErrorBoundary_default as ErrorBoundary, FileDrop_default as FileDrop, FormField_default as FormField, GoogleButton_default as GoogleButton, LocaleLinks_default as LocaleLinks, MATERIALS, NumberInput_default as NumberInput, PALETTES, PageContainer_default as PageContainer, PageHeader_default as PageHeader, PinInput_default as PinInput, PriceCard_default as PriceCard, ProgressBar_default as ProgressBar, SHEET_ROOT_ID, SectionHeading_default as SectionHeading, SegmentedControl_default as SegmentedControl, SettingsGroup_default as SettingsGroup, SettingsRow_default as SettingsRow, SkeletonList_default as SkeletonList, StatCard_default as StatCard, TabBar_default as TabBar, TagsInput_default as TagsInput, TimePicker_default as TimePicker, ToastHost_default as ToastHost, ToggleGroup_default as ToggleGroup, ToneDot_default as ToneDot, VERSION, addDays, applyMaterial, applyPalette, applyTheme, createI18nRuntime, downloadJson, eachDayOfYear, ensureSheetRoot, formatDate, formatNumber, fromDateKey, isApplePortable, isInstalled, isMaterial, isPaletteName, isThemePreference, lastNDays, leadingBlanks, needsIosInstall, readStoredTheme, registerErrorMapper, relativeDayLabel, safeRedirect, setFormatLocale, setMaterialStorageKey, setPaletteStorageKey, setThemeStorageKey, startOfWeek, tapFeedback, toAppError, toDateKey, toRedirectPath, todayKey, useDebouncedCallback, useDragScroll, useMaterial, useMediaQuery, useOnline, usePalette, useTheme, useToast, useToday, useVisualViewport };
4027
4180