@overmap-ai/blocks 1.0.40 → 1.0.41

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.
Files changed (155) hide show
  1. package/dist/ButtonGroup/ButtonGroup.d.ts +1 -2
  2. package/dist/ButtonGroup/context.d.ts +2 -7
  3. package/dist/CheckboxGroup/context.d.ts +2 -6
  4. package/dist/CheckedIndicator/CheckedIndicator.d.ts +4 -3
  5. package/dist/CommandMenu/CheckboxIndicator.d.ts +2 -4
  6. package/dist/CommandMenu/CheckboxItem.d.ts +1 -1
  7. package/dist/CommandMenu/SelectedIndicator.d.ts +2 -3
  8. package/dist/CommandMenu/context.d.ts +2 -3
  9. package/dist/DayPicker/typings.d.ts +1 -1
  10. package/dist/Dialog/typings.d.ts +2 -2
  11. package/dist/Heading/cva.d.ts +1 -1
  12. package/dist/HoverUtility/HoverUtility.d.ts +2 -2
  13. package/dist/Layout/SlideOutClose.d.ts +5 -0
  14. package/dist/Layout/SlideOutContent.d.ts +6 -0
  15. package/dist/Layout/SlideOutHandle.d.ts +5 -0
  16. package/dist/Layout/SlideOutOverlay.d.ts +2 -5
  17. package/dist/Layout/SlideOutRoot.d.ts +10 -0
  18. package/dist/Layout/SlideOutTrigger.d.ts +2 -6
  19. package/dist/Layout/SlideOutViewport.d.ts +5 -0
  20. package/dist/Layout/context.d.ts +1 -3
  21. package/dist/Layout/hooks.d.ts +1 -0
  22. package/dist/Layout/index.d.ts +11 -3
  23. package/dist/Layout/typings.d.ts +3 -0
  24. package/dist/Link/cva.d.ts +1 -1
  25. package/dist/LuIcon/LuIcon.d.ts +4 -6
  26. package/dist/LuIcon/index.d.ts +1 -1
  27. package/dist/LuIcon/typings.d.ts +2 -2
  28. package/dist/Menu/{CheckboxItem/CheckboxItem.d.ts → CheckboxItem.d.ts} +1 -1
  29. package/dist/Menu/{CheckboxItemIndicator/CheckboxItemIndicator.d.ts → CheckboxItemIndicator.d.ts} +1 -1
  30. package/dist/Menu/{ClickTrigger/ClickTrigger.d.ts → ClickTrigger.d.ts} +1 -1
  31. package/dist/Menu/{Content/Content.d.ts → Content.d.ts} +1 -1
  32. package/dist/Menu/{ContextTrigger/ContextTrigger.d.ts → ContextTrigger.d.ts} +1 -1
  33. package/dist/Menu/{Group/Group.d.ts → Group.d.ts} +1 -1
  34. package/dist/Menu/{Input/Field.d.ts → InputField.d.ts} +1 -1
  35. package/dist/Menu/{Input/Root.d.ts → InputRoot.d.ts} +1 -1
  36. package/dist/Menu/{Input/Slot.d.ts → InputSlot.d.ts} +1 -1
  37. package/dist/Menu/{Item/Item.d.ts → Item.d.ts} +1 -1
  38. package/dist/Menu/{MultiSelectGroup/MultiSelectGroup.d.ts → MultiSelectGroup.d.ts} +1 -1
  39. package/dist/Menu/{MultiSelectItem/MultiSelectItem.d.ts → MultiSelectItem.d.ts} +1 -1
  40. package/dist/Menu/PageContent.d.ts +2 -0
  41. package/dist/Menu/{PageTrigger/PageTrigger.d.ts → PageTrigger.d.ts} +1 -1
  42. package/dist/Menu/{Pages/Pages.d.ts → Pages.d.ts} +1 -1
  43. package/dist/Menu/{root/Root.d.ts → Root.d.ts} +1 -1
  44. package/dist/Menu/{Scroll/Scroll.d.ts → Scroll.d.ts} +1 -1
  45. package/dist/Menu/{SelectAll/SelectAllItem.d.ts → SelectAllItem.d.ts} +1 -1
  46. package/dist/Menu/{SelectGroup/SelectGroup.d.ts → SelectGroup.d.ts} +1 -1
  47. package/dist/Menu/{SelectItem/SelectItem.d.ts → SelectItem.d.ts} +1 -1
  48. package/dist/Menu/SelectedIndicator.d.ts +4 -0
  49. package/dist/Menu/{Separator/Separator.d.ts → Separator.d.ts} +1 -1
  50. package/dist/Menu/{Sub/Sub.d.ts → Sub.d.ts} +1 -1
  51. package/dist/Menu/{SubContent/SubContent.d.ts → SubContent.d.ts} +1 -1
  52. package/dist/Menu/{SubTrigger/SubTrigger.d.ts → SubTrigger.d.ts} +1 -1
  53. package/dist/Menu/{VirtualTrigger/VirtualTrigger.d.ts → VirtualTrigger.d.ts} +1 -1
  54. package/dist/Menu/index.d.ts +9 -7
  55. package/dist/Menu/{Content/context.d.ts → menuContentContext.d.ts} +2 -2
  56. package/dist/Menu/{root/context.d.ts → rootContext.d.ts} +1 -1
  57. package/dist/Menu/{Sub/context.d.ts → subContentContext.d.ts} +1 -1
  58. package/dist/Menu/typings.d.ts +1 -1
  59. package/dist/Menu/utils.d.ts +0 -6
  60. package/dist/MenuV2/CheckboxItem.d.ts +6 -0
  61. package/dist/MenuV2/CheckboxItemIndicator.d.ts +3 -0
  62. package/dist/MenuV2/Group.d.ts +4 -0
  63. package/dist/MenuV2/GroupLabel.d.ts +4 -0
  64. package/dist/MenuV2/Item.d.ts +6 -0
  65. package/dist/MenuV2/MultiSelectAllItem.d.ts +4 -0
  66. package/dist/MenuV2/MultiSelectGroup.d.ts +5 -0
  67. package/dist/MenuV2/MultiSelectItem.d.ts +5 -0
  68. package/dist/MenuV2/Page.d.ts +5 -0
  69. package/dist/MenuV2/PageTriggerItem.d.ts +5 -0
  70. package/dist/MenuV2/Pages.d.ts +7 -0
  71. package/dist/MenuV2/Root.d.ts +6 -0
  72. package/dist/MenuV2/SelectGroup.d.ts +4 -0
  73. package/dist/MenuV2/SelectItem.d.ts +5 -0
  74. package/dist/MenuV2/SelectedIndicator.d.ts +3 -0
  75. package/dist/MenuV2/Separator.d.ts +5 -0
  76. package/dist/MenuV2/constants.d.ts +9 -0
  77. package/dist/MenuV2/context.d.ts +17 -0
  78. package/dist/MenuV2/cva.d.ts +14 -0
  79. package/dist/MenuV2/index.d.ts +36 -0
  80. package/dist/MenuV2/typings.d.ts +9 -0
  81. package/dist/MenuV2/utils.d.ts +1 -0
  82. package/dist/OneTimePasswordField/context.d.ts +1 -1
  83. package/dist/RadioCards/Item.d.ts +2 -2
  84. package/dist/RadioCards/Root.d.ts +2 -2
  85. package/dist/SegmentedControl/context.d.ts +1 -1
  86. package/dist/SelectContext/typings.d.ts +3 -0
  87. package/dist/SelectedIndicator/SelectedIndicator.d.ts +5 -0
  88. package/dist/{Menu/SelectedIndicator → SelectedIndicator}/context.d.ts +0 -1
  89. package/dist/SelectedIndicator/index.d.ts +2 -0
  90. package/dist/SlideOut/Close.d.ts +4 -0
  91. package/dist/SlideOut/Content.d.ts +11 -0
  92. package/dist/SlideOut/Handle.d.ts +5 -0
  93. package/dist/SlideOut/Overlay.d.ts +4 -0
  94. package/dist/SlideOut/Root.d.ts +9 -0
  95. package/dist/SlideOut/Trigger.d.ts +4 -0
  96. package/dist/SlideOut/Viewport.d.ts +4 -0
  97. package/dist/SlideOut/constants.d.ts +1 -0
  98. package/dist/SlideOut/context.d.ts +17 -0
  99. package/dist/SlideOut/index.d.ts +18 -1
  100. package/dist/SlideOut/typings.d.ts +2 -0
  101. package/dist/Slider/Slider.d.ts +2 -2
  102. package/dist/Text/cva.d.ts +1 -1
  103. package/dist/Toast/CustomToast.d.ts +6 -0
  104. package/dist/Toast/Toaster.d.ts +4 -0
  105. package/dist/Toast/index.d.ts +3 -4
  106. package/dist/Toast/toast.d.ts +12 -0
  107. package/dist/Toast/typings.d.ts +5 -52
  108. package/dist/blocks.js +1720 -1212
  109. package/dist/blocks.js.map +1 -1
  110. package/dist/blocks.umd.cjs +2042 -1534
  111. package/dist/blocks.umd.cjs.map +1 -1
  112. package/dist/hooks.d.ts +21 -0
  113. package/dist/index.d.ts +3 -2
  114. package/dist/typings.d.ts +0 -5
  115. package/dist/utils.d.ts +7 -30
  116. package/package.json +19 -45
  117. package/dist/CheckboxGroup/cva.d.ts +0 -0
  118. package/dist/CheckboxGroup/utils.d.ts +0 -1
  119. package/dist/CollapsibleTree/CollapsibleTree.d.ts +0 -5
  120. package/dist/CollapsibleTree/context.d.ts +0 -11
  121. package/dist/CollapsibleTree/index.d.ts +0 -2
  122. package/dist/CollapsibleTree/typings.d.ts +0 -58
  123. package/dist/CommandMenu/utils.d.ts +0 -4
  124. package/dist/Layout/SlideOut.d.ts +0 -20
  125. package/dist/Menu/ClickTrigger/index.d.ts +0 -1
  126. package/dist/Menu/Content/index.d.ts +0 -2
  127. package/dist/Menu/ContextTrigger/index.d.ts +0 -1
  128. package/dist/Menu/Group/index.d.ts +0 -1
  129. package/dist/Menu/Input/index.d.ts +0 -3
  130. package/dist/Menu/Item/index.d.ts +0 -1
  131. package/dist/Menu/Label/index.d.ts +0 -1
  132. package/dist/Menu/MultiSelectGroup/index.d.ts +0 -1
  133. package/dist/Menu/MultiSelectItem/index.d.ts +0 -1
  134. package/dist/Menu/PageContent/PageContent.d.ts +0 -3
  135. package/dist/Menu/PageContent/index.d.ts +0 -1
  136. package/dist/Menu/PageTrigger/index.d.ts +0 -1
  137. package/dist/Menu/Pages/index.d.ts +0 -2
  138. package/dist/Menu/SelectAll/index.d.ts +0 -1
  139. package/dist/Menu/SelectGroup/index.d.ts +0 -1
  140. package/dist/Menu/SelectItem/index.d.ts +0 -1
  141. package/dist/Menu/SelectedIndicator/SelectedIndicator.d.ts +0 -4
  142. package/dist/Menu/SelectedIndicator/index.d.ts +0 -2
  143. package/dist/Menu/Separator/index.d.ts +0 -1
  144. package/dist/Menu/Sub/index.d.ts +0 -2
  145. package/dist/Menu/SubContent/index.d.ts +0 -1
  146. package/dist/Menu/SubTrigger/index.d.ts +0 -1
  147. package/dist/Menu/VirtualTrigger/index.d.ts +0 -1
  148. package/dist/Menu/root/index.d.ts +0 -2
  149. package/dist/SlideOut/SlideOut.d.ts +0 -50
  150. package/dist/Toast/Toast.d.ts +0 -17
  151. package/dist/Toast/ToastContext.d.ts +0 -3
  152. package/dist/Toast/ToastProvider.d.ts +0 -13
  153. package/dist/Toast/cva.d.ts +0 -4
  154. /package/dist/Menu/{Label/Label.d.ts → Label.d.ts} +0 -0
  155. /package/dist/Menu/{Pages/context.d.ts → menuPagesContext.d.ts} +0 -0
package/dist/blocks.js CHANGED
@@ -1,22 +1,21 @@
1
1
  import * as RadixAlertDialog from "@radix-ui/react-alert-dialog";
2
- import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import { cva, cx } from "class-variance-authority";
4
- import * as React from "react";
5
- import React__default, { createContext, useContext, memo, useMemo, useState, useCallback, useEffect, useLayoutEffect, use, useRef } from "react";
4
+ import { createContext, useContext, memo, useMemo, useState, useCallback, useRef, useEffect, useId, useLayoutEffect, use } from "react";
6
5
  import * as RadixAvatar from "@radix-ui/react-avatar";
7
6
  import * as RadixCheckbox from "@radix-ui/react-checkbox";
8
7
  import { useMediaQuery } from "react-responsive";
9
- import * as RadixPrimitiveCollapsible from "@radix-ui/react-collapsible";
10
8
  import { CommandItem, CommandRoot, CommandEmpty, CommandGroup, CommandInput, useCommandState, CommandList, CommandSeparator } from "cmdk";
11
9
  import * as RadixDialog from "@radix-ui/react-dialog";
12
10
  import { DialogPortal, DialogContent as DialogContent$1, DialogTitle, DialogDescription, DialogOverlay as DialogOverlay$1, DialogTrigger } from "@radix-ui/react-dialog";
13
11
  import { DayPicker as DayPicker$1 } from "react-day-picker";
14
- import { DynamicIcon } from "lucide-react/dynamic";
12
+ import { ChevronRight, ChevronLeft, ChevronDown, ChevronUp, AlertTriangle, RotateCcw, X, CircleAlertIcon, TriangleAlertIcon, InfoIcon, Check } from "lucide-react";
15
13
  import * as RadixHoverCard from "@radix-ui/react-hover-card";
14
+ import { Slot } from "@radix-ui/react-slot";
16
15
  import { CSSTransition } from "react-transition-group";
16
+ import "react-transition-group/CSSTransition";
17
17
  import ReactDOM from "react-dom";
18
- import { Slot } from "@radix-ui/react-slot";
19
- import { useFloatingNodeId, useFloating, offset, size, flip, shift, hide, autoUpdate, useRole, useDismiss, useClick, useListNavigation, useInteractions, FloatingTree, FloatingNode, FloatingPortal, FloatingOverlay, FloatingFocusManager, FloatingList, useHover, safePolygon, useListItem, useMergeRefs } from "@floating-ui/react";
18
+ import { useListItem, useMergeRefs, FloatingNode, FloatingPortal, FloatingOverlay, FloatingFocusManager, FloatingList, useFloatingNodeId, useFloating, offset, size, flip, shift, hide, autoUpdate, useRole, useDismiss, useClick, useListNavigation, useInteractions, FloatingTree, useHover, safePolygon } from "@floating-ui/react";
20
19
  import * as RadixSeparator from "@radix-ui/react-separator";
21
20
  import * as RadixOneTimePasswordField from "@radix-ui/react-one-time-password-field";
22
21
  import { useErrorBoundary, ErrorBoundary } from "react-error-boundary";
@@ -27,8 +26,7 @@ import * as RadixToggleGroup from "@radix-ui/react-toggle-group";
27
26
  import * as RadixTabs from "@radix-ui/react-tabs";
28
27
  import * as RadixSlider from "@radix-ui/react-slider";
29
28
  import * as RadixSwitch from "@radix-ui/react-switch";
30
- import * as RadixToast from "@radix-ui/react-toast";
31
- import { ToastProvider as ToastProvider$1, ToastViewport } from "@radix-ui/react-toast";
29
+ import { toast as toast$1, Toaster as Toaster$1 } from "sonner";
32
30
  import * as Toggle from "@radix-ui/react-toggle";
33
31
  import * as RadixTooltip from "@radix-ui/react-tooltip";
34
32
  const floating = cva(
@@ -788,82 +786,6 @@ const Checkbox = {
788
786
  };
789
787
  const SelectContext = createContext({});
790
788
  const MultiSelectContext = createContext({});
791
- const usePassiveLayoutEffect = React__default[typeof document !== "undefined" && document.createElement !== void 0 ? "useLayoutEffect" : "useEffect"];
792
- const useLatest = (current) => {
793
- const storedValue = React.useRef(current);
794
- React.useEffect(() => {
795
- storedValue.current = current;
796
- });
797
- return storedValue;
798
- };
799
- function _ref() {
800
- }
801
- function useResizeObserver(target, callback, options = {}) {
802
- const resizeObserver = getResizeObserver(options.polyfill);
803
- const storedCallback = useLatest(callback);
804
- usePassiveLayoutEffect(() => {
805
- let didUnsubscribe = false;
806
- const targetEl = target && "current" in target ? target.current : target;
807
- if (!targetEl) return _ref;
808
- function cb(entry, observer) {
809
- if (didUnsubscribe) return;
810
- storedCallback.current(entry, observer);
811
- }
812
- resizeObserver.subscribe(targetEl, cb);
813
- return () => {
814
- didUnsubscribe = true;
815
- resizeObserver.unsubscribe(targetEl, cb);
816
- };
817
- }, [target, resizeObserver, storedCallback]);
818
- return resizeObserver.observer;
819
- }
820
- function createResizeObserver(polyfill) {
821
- let ticking = false;
822
- let allEntries = [];
823
- const callbacks = /* @__PURE__ */ new Map();
824
- const observer = new (polyfill || window.ResizeObserver)((entries, obs) => {
825
- allEntries = allEntries.concat(entries);
826
- function _ref2() {
827
- const triggered = /* @__PURE__ */ new Set();
828
- for (let i = 0; i < allEntries.length; i++) {
829
- if (triggered.has(allEntries[i].target)) continue;
830
- triggered.add(allEntries[i].target);
831
- const cbs = callbacks.get(allEntries[i].target);
832
- cbs === null || cbs === void 0 ? void 0 : cbs.forEach((cb) => cb(allEntries[i], obs));
833
- }
834
- allEntries = [];
835
- ticking = false;
836
- }
837
- if (!ticking) {
838
- window.requestAnimationFrame(_ref2);
839
- }
840
- ticking = true;
841
- });
842
- return {
843
- observer,
844
- subscribe(target, callback) {
845
- var _callbacks$get;
846
- observer.observe(target);
847
- const cbs = (_callbacks$get = callbacks.get(target)) !== null && _callbacks$get !== void 0 ? _callbacks$get : [];
848
- cbs.push(callback);
849
- callbacks.set(target, cbs);
850
- },
851
- unsubscribe(target, callback) {
852
- var _callbacks$get2;
853
- const cbs = (_callbacks$get2 = callbacks.get(target)) !== null && _callbacks$get2 !== void 0 ? _callbacks$get2 : [];
854
- if (cbs.length === 1) {
855
- observer.unobserve(target);
856
- callbacks.delete(target);
857
- return;
858
- }
859
- const cbIndex = cbs.indexOf(callback);
860
- if (cbIndex !== -1) cbs.splice(cbIndex, 1);
861
- callbacks.set(target, cbs);
862
- }
863
- };
864
- }
865
- let _resizeObserver;
866
- const getResizeObserver = (polyfill) => !_resizeObserver ? _resizeObserver = createResizeObserver(polyfill) : _resizeObserver;
867
789
  const useViewportSize = (props) => {
868
790
  const { xs: xsProps, sm: smProps, md: mdProps, lg: lgProps, xl: xlProps } = props;
869
791
  const [prevSize, setPrevSize] = useState("initial");
@@ -881,33 +803,14 @@ const useViewportSize = (props) => {
881
803
  }, [lg, md, sm, xl, xs]);
882
804
  return { size: size2, prevSize, xs, sm, md, lg, xl };
883
805
  };
884
- const useStopEventPropagation = () => {
885
- return useCallback((event) => {
886
- event.stopPropagation();
887
- }, []);
888
- };
889
- function useTextFilter(values, filterFunction) {
806
+ function useTextFilter(items, filterFunction) {
890
807
  const [filteredOptions, setFilteredOptions] = useState([]);
891
808
  const [filterValue, setFilterValue] = useState("");
892
809
  useEffect(() => {
893
- setFilteredOptions(values.filter((value) => filterFunction(value, filterValue)));
894
- }, [filterFunction, filterValue, values]);
810
+ setFilteredOptions(items.filter((value) => filterFunction(value, filterValue)));
811
+ }, [filterFunction, filterValue, items]);
895
812
  return [filteredOptions, filterValue, setFilterValue];
896
813
  }
897
- const useSize = (target) => {
898
- const [size2, setSize] = useState();
899
- useLayoutEffect(() => {
900
- var _a;
901
- setSize((_a = target.current) == null ? void 0 : _a.getBoundingClientRect());
902
- }, [target]);
903
- const handleResize = useCallback((entry) => {
904
- const rect = entry.contentRect;
905
- setSize(rect);
906
- }, []);
907
- useResizeObserver(target, handleResize);
908
- return size2;
909
- };
910
- const genericMemo = memo;
911
814
  function useControlledState(initialState, state, setState) {
912
815
  const [uncontrolledState, setUncontrolledState] = useState(initialState);
913
816
  const handleStateChange = useCallback(
@@ -924,26 +827,39 @@ function useControlledState(initialState, state, setState) {
924
827
  }, [state]);
925
828
  return [state ?? uncontrolledState, handleStateChange];
926
829
  }
830
+ function useFallbackId(id) {
831
+ const fallbackId = useId();
832
+ return id ?? fallbackId;
833
+ }
834
+ function useLatest(value) {
835
+ const ref = useRef(value);
836
+ ref.current = value;
837
+ return ref;
838
+ }
839
+ const genericMemo = memo;
927
840
  function mergeRefs(refs) {
928
841
  return (value) => {
929
- const cleanups = refs.reduce((cleanups2, ref) => {
930
- if (typeof ref === "function") {
931
- const cleanup = ref(value);
932
- if (typeof cleanup === "function") {
933
- cleanups2.push(cleanup);
934
- } else {
842
+ const cleanups = refs.reduce(
843
+ (cleanups2, ref) => {
844
+ if (typeof ref === "function") {
845
+ const cleanup = ref(value);
846
+ if (typeof cleanup === "function") {
847
+ cleanups2.push(cleanup);
848
+ } else {
849
+ cleanups2.push(() => {
850
+ ref(null);
851
+ });
852
+ }
853
+ } else if (ref != null) {
854
+ ref.current = value;
935
855
  cleanups2.push(() => {
936
- ref(null);
856
+ ref.current = null;
937
857
  });
938
858
  }
939
- } else if (ref != null) {
940
- ref.current = value;
941
- cleanups2.push(() => {
942
- ref.current = null;
943
- });
944
- }
945
- return cleanups2;
946
- }, []);
859
+ return cleanups2;
860
+ },
861
+ []
862
+ );
947
863
  return () => {
948
864
  cleanups.forEach((cleanup) => {
949
865
  cleanup();
@@ -954,10 +870,30 @@ function mergeRefs(refs) {
954
870
  const stopPropagation = (e) => {
955
871
  e.stopPropagation();
956
872
  };
873
+ function getSelectedState(selected) {
874
+ return selected ? "selected" : "unselected";
875
+ }
876
+ function getCheckedState(checked) {
877
+ return checked === true ? "checked" : checked === false ? "unchecked" : "indeterminate";
878
+ }
879
+ function getActiveState(active) {
880
+ return active ? "active" : "inactive";
881
+ }
882
+ function getBooleanState(value) {
883
+ return value ? "true" : "false";
884
+ }
885
+ function getOpenState(open) {
886
+ return open ? "open" : "closed";
887
+ }
957
888
  const MultiSelectProvider = genericMemo(function MultiSelectProvider2(props) {
958
- const { children, defaultValues, values: controlledValues, onValuesChange } = props;
889
+ const { children, defaultValues, values: controlledValues, onValuesChange, equalityFn } = props;
890
+ const equalityFnRef = useLatest(equalityFn);
959
891
  const [itemValueMapping, setItemValueMapping] = useState(/* @__PURE__ */ new Set());
960
892
  const [values, setValues] = useControlledState(defaultValues ?? [], controlledValues, onValuesChange);
893
+ const isValueIncluded = useCallback(
894
+ (value, arr) => equalityFnRef.current ? arr.some((v) => equalityFnRef.current(v, value)) : arr.includes(value),
895
+ [equalityFnRef]
896
+ );
961
897
  const registerValue = useCallback((value) => {
962
898
  setItemValueMapping((prev) => {
963
899
  const newSet = new Set(prev);
@@ -972,23 +908,25 @@ const MultiSelectProvider = genericMemo(function MultiSelectProvider2(props) {
972
908
  });
973
909
  };
974
910
  }, []);
975
- const selected = useCallback((value) => values.includes(value), [values]);
911
+ const selected = useCallback((value) => isValueIncluded(value, values), [isValueIncluded, values]);
976
912
  const selectValue = useCallback(
977
913
  (value) => {
978
914
  if (selected(value)) {
979
- setValues(values.filter((v) => v !== value));
915
+ setValues(
916
+ values.filter((v) => equalityFnRef.current ? !equalityFnRef.current(v, value) : v !== value)
917
+ );
980
918
  } else {
981
919
  setValues([...values, value]);
982
920
  }
983
921
  },
984
- [selected, setValues, values]
922
+ [equalityFnRef, selected, setValues, values]
985
923
  );
986
924
  const allSelected = useMemo(() => {
987
- return Array.from(itemValueMapping.values()).every((value) => values.includes(value));
988
- }, [itemValueMapping, values]);
925
+ return Array.from(itemValueMapping.values()).every((value) => isValueIncluded(value, values));
926
+ }, [isValueIncluded, itemValueMapping, values]);
989
927
  const someSelected = useMemo(() => {
990
- return Array.from(itemValueMapping.values()).some((value) => values.includes(value));
991
- }, [itemValueMapping, values]);
928
+ return Array.from(itemValueMapping.values()).some((value) => isValueIncluded(value, values));
929
+ }, [isValueIncluded, itemValueMapping, values]);
992
930
  const toggleSelectAll = useCallback(() => {
993
931
  if (allSelected) {
994
932
  setValues([]);
@@ -1003,9 +941,13 @@ const MultiSelectProvider = genericMemo(function MultiSelectProvider2(props) {
1003
941
  return /* @__PURE__ */ jsx(MultiSelectContext, { value: contextValue, children });
1004
942
  });
1005
943
  const SingleSelectRequiredProvider = genericMemo(function SingleSelectRequiredProvider2(props) {
1006
- const { children, defaultValue, value, onValueChange } = props;
944
+ const { children, defaultValue, value, onValueChange, equalityFn } = props;
945
+ const equalityFnRef = useLatest(equalityFn);
1007
946
  const [controlledValue, setControlledValue] = useControlledState(defaultValue, value, onValueChange);
1008
- const selected = useCallback((v) => v === controlledValue, [controlledValue]);
947
+ const selected = useCallback(
948
+ (v) => equalityFnRef.current ? equalityFnRef.current(v, controlledValue) : v === controlledValue,
949
+ [controlledValue, equalityFnRef]
950
+ );
1009
951
  const selectValue = useCallback(
1010
952
  (v) => {
1011
953
  if (selected(v)) return;
@@ -1017,9 +959,13 @@ const SingleSelectRequiredProvider = genericMemo(function SingleSelectRequiredPr
1017
959
  return /* @__PURE__ */ jsx(SelectContext, { value: contextValue, children });
1018
960
  });
1019
961
  const SingleSelectNotRequiredProvider = genericMemo(function SingleSelectNotRequiredProvider2(props) {
1020
- const { children, defaultValue = void 0, value: controlledValue, onValueChange } = props;
962
+ const { children, defaultValue = void 0, value: controlledValue, onValueChange, equalityFn } = props;
963
+ const equalityFnRef = useLatest(equalityFn);
1021
964
  const [value, setValue] = useControlledState(defaultValue, controlledValue, onValueChange);
1022
- const selected = useCallback((v) => v === value, [value]);
965
+ const selected = useCallback(
966
+ (v) => value !== void 0 && (equalityFnRef.current ? equalityFnRef.current(v, value) : v === value),
967
+ [value, equalityFnRef]
968
+ );
1023
969
  const selectValue = useCallback(
1024
970
  (v) => {
1025
971
  setValue(selected(v) ? void 0 : v);
@@ -1036,8 +982,8 @@ const CheckboxGroupItem = memo((props) => {
1036
982
  ref,
1037
983
  className,
1038
984
  value,
1039
- accentColor,
1040
985
  disabled,
986
+ accentColor = groupContext.accentColor,
1041
987
  variant = groupContext.variant,
1042
988
  size: size2 = groupContext.size,
1043
989
  radius = groupContext.radius,
@@ -1074,9 +1020,6 @@ const CheckboxGroupItemIndicator = memo((props) => {
1074
1020
  return /* @__PURE__ */ jsx(RadixCheckbox.Indicator, { className: cx("flex items-center justify-center", className), ref, ...rest });
1075
1021
  });
1076
1022
  CheckboxGroupItemIndicator.displayName = "CheckboxGroupItemIndicator";
1077
- function getBooleanState$1(value) {
1078
- return value ? "true" : "false";
1079
- }
1080
1023
  const CheckboxGroupRoot = memo((props) => {
1081
1024
  const providerContext = useProvider();
1082
1025
  const {
@@ -1099,20 +1042,22 @@ const CheckboxGroupRoot = memo((props) => {
1099
1042
  name,
1100
1043
  required,
1101
1044
  disabled,
1045
+ // style props
1046
+ accentColor,
1102
1047
  size: size2,
1103
1048
  variant,
1104
1049
  radius
1105
1050
  }),
1106
- [disabled, name, radius, required, size2, variant]
1051
+ [accentColor, disabled, name, radius, required, size2, variant]
1107
1052
  );
1108
1053
  return /* @__PURE__ */ jsx(
1109
1054
  "div",
1110
1055
  {
1111
1056
  ref,
1112
1057
  role: "group",
1113
- "data-disabled": getBooleanState$1(!!disabled),
1058
+ "data-disabled": getBooleanState(!!disabled),
1114
1059
  "data-accent-color": accentColor,
1115
- "aria-disabled": getBooleanState$1(!!disabled),
1060
+ "aria-disabled": getBooleanState(!!disabled),
1116
1061
  ...rest,
1117
1062
  children: /* @__PURE__ */ jsx(CheckboxGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(
1118
1063
  MultiSelectProvider,
@@ -1132,8 +1077,8 @@ const CheckboxGroupSelectAllItem = memo((props) => {
1132
1077
  const {
1133
1078
  ref,
1134
1079
  className,
1135
- accentColor,
1136
1080
  disabled,
1081
+ accentColor = groupContext.accentColor,
1137
1082
  variant = groupContext.variant,
1138
1083
  size: size2 = groupContext.size,
1139
1084
  radius = groupContext.radius,
@@ -1164,137 +1109,39 @@ const CheckboxGroup = {
1164
1109
  SelectAllItem: CheckboxGroupSelectAllItem,
1165
1110
  ItemIndicator: CheckboxGroupItemIndicator
1166
1111
  };
1167
- const CollapsibleTreeContext = createContext(
1168
- {}
1169
- );
1170
- function useCollapsibleTreeContext() {
1171
- return useContext(CollapsibleTreeContext);
1172
- }
1173
- const CollapsibleNode = genericMemo(function(props) {
1174
- const { meta, nodes, level = 0, disabled } = props;
1175
- const [controlledOpenState, setControlledOpenState] = useState(false);
1176
- const {
1177
- nodeRenderer,
1178
- disabled: disabledFromContext,
1179
- onNodeOpen,
1180
- onNodeClose,
1181
- onNodeClick,
1182
- nodeStyles,
1183
- nodeClassName
1184
- } = useCollapsibleTreeContext();
1185
- const isDisabled = disabled ?? disabledFromContext;
1186
- const handleClick = useCallback(() => {
1187
- if (onNodeClick) onNodeClick(meta);
1188
- }, [meta, onNodeClick]);
1189
- const toggleOpenState = useCallback(() => {
1190
- setControlledOpenState(!controlledOpenState);
1191
- if (!controlledOpenState && onNodeOpen) onNodeOpen(meta);
1192
- if (controlledOpenState && onNodeClose) onNodeClose(meta);
1193
- }, [meta, onNodeClose, onNodeOpen, controlledOpenState]);
1194
- const { children, style, className } = useMemo(() => {
1195
- return nodeRenderer({
1196
- meta,
1197
- toggleOpen: toggleOpenState,
1198
- open: controlledOpenState,
1199
- disabled: isDisabled
1200
- });
1201
- }, [isDisabled, meta, nodeRenderer, toggleOpenState, controlledOpenState]);
1202
- const combinedStyles = useMemo(
1203
- () => ({
1204
- // want node specific styles to overwrite and global node styles
1205
- ...nodeStyles,
1206
- ...style
1207
- }),
1208
- [nodeStyles, style]
1209
- );
1210
- return /* @__PURE__ */ jsx(RadixPrimitiveCollapsible.Root, { asChild: true, open: controlledOpenState, disabled: isDisabled, children: /* @__PURE__ */ jsxs("div", { className: "flex w-full flex-col", children: [
1211
- /* @__PURE__ */ jsx(
1212
- "div",
1213
- {
1214
- onClick: handleClick,
1215
- className: cx(nodeClassName, "flex w-full shrink-0 items-center", className),
1216
- style: combinedStyles,
1217
- "data-state": controlledOpenState ? "open" : "closed",
1218
- "data-disabled": isDisabled,
1219
- children
1220
- }
1221
- ),
1222
- nodes && nodes.length > 0 && /* @__PURE__ */ jsx(RadixPrimitiveCollapsible.Content, { asChild: true, children: /* @__PURE__ */ jsx("div", { className: "flex h-max w-full flex-col pl-2", children: nodes.map((treeNodeProps, index) => /* @__PURE__ */ jsx(
1223
- CollapsibleNode,
1224
- {
1225
- level: level + 1,
1226
- ...treeNodeProps
1227
- },
1228
- `${level},${index}`
1229
- )) }) })
1230
- ] }) });
1231
- });
1232
- const CollapsibleTree = genericMemo(function(props) {
1233
- const {
1234
- nodes,
1235
- disabled = false,
1236
- nodeClassName,
1237
- nodeStyles,
1238
- onNodeClick,
1239
- onNodeClose,
1240
- onNodeOpen,
1241
- nodeRenderer,
1242
- ...rest
1243
- } = props;
1244
- return /* @__PURE__ */ jsx(
1245
- CollapsibleTreeContext.Provider,
1246
- {
1247
- value: {
1248
- nodeRenderer,
1249
- nodeClassName,
1250
- nodeStyles,
1251
- disabled,
1252
- onNodeClick,
1253
- onNodeClose,
1254
- onNodeOpen
1255
- },
1256
- children: /* @__PURE__ */ jsx("div", { className: "flex h-max w-full flex-col", ...rest, children: nodes.map((treeNodeProps, index) => /* @__PURE__ */ jsx(CollapsibleNode, { ...treeNodeProps }, `${0},${index}`)) })
1257
- }
1258
- );
1259
- });
1260
- const CommandMenuContext = createContext({});
1261
- const SelectedIndicatorContext$1 = createContext(false);
1262
- const CheckboxIndicatorContext = createContext(false);
1263
- const CommandMenuPageContext = createContext({});
1264
- const CommandMenuDialogContext = createContext({});
1265
- function getSelectedState$1(selected) {
1266
- return selected ? "selected" : "unselected";
1267
- }
1268
- function getCheckedState$1(checked) {
1269
- return checked === true ? "checked" : checked === false ? "unchecked" : "indeterminate";
1270
- }
1271
- function getActiveState(active) {
1272
- return active ? "active" : "inactive";
1273
- }
1274
- const CommandMenuCheckboxIndicator = memo((props) => {
1275
- const { ref, className, children, ...rest } = props;
1276
- const checkedState = use(CheckboxIndicatorContext);
1277
- const computedChildren = useMemo(() => {
1278
- return typeof children === "function" ? children(checkedState) : children;
1279
- }, [checkedState, children]);
1112
+ const CheckedIndicatorContext = createContext({});
1113
+ const CheckedIndicator = memo((props) => {
1114
+ const { children, ref, className, ...rest } = props;
1115
+ const checked = useContext(CheckedIndicatorContext);
1116
+ const computedChildren = typeof children === "function" ? children(checked) : children;
1280
1117
  return /* @__PURE__ */ jsx(
1281
1118
  "span",
1282
1119
  {
1283
1120
  ref,
1284
- "data-state": getCheckedState$1(checkedState),
1285
1121
  className: cx(
1286
- "inline-block size-max",
1122
+ "flex size-max items-center",
1287
1123
  {
1288
- invisible: checkedState === false
1124
+ invisible: checked === false
1289
1125
  },
1290
1126
  className
1291
1127
  ),
1128
+ "data-state": getCheckedState(checked),
1292
1129
  ...rest,
1293
1130
  children: computedChildren
1294
1131
  }
1295
1132
  );
1296
1133
  });
1134
+ CheckedIndicator.displayName = "CheckedIndicator";
1135
+ const CommandMenuCheckboxIndicator = memo((props) => {
1136
+ const { ref, children, ...rest } = props;
1137
+ return /* @__PURE__ */ jsx(CheckedIndicator, { ref, ...rest, children });
1138
+ });
1297
1139
  CommandMenuCheckboxIndicator.displayName = "CommandMenuCheckboxIndicator";
1140
+ const CommandMenuContext = createContext({});
1141
+ const SelectedIndicatorContext$1 = createContext(false);
1142
+ const CheckboxIndicatorContext = createContext(false);
1143
+ const CommandMenuPageContext = createContext({});
1144
+ const CommandMenuDialogContext = createContext({});
1298
1145
  const commandMenuContentCva = cva(
1299
1146
  [
1300
1147
  "ring",
@@ -1531,7 +1378,7 @@ const CommandMenuCheckboxItem = memo((props) => {
1531
1378
  onSelect == null ? void 0 : onSelect();
1532
1379
  onCheckedChange(checked !== true);
1533
1380
  }, [checked, onCheckedChange, onSelect]);
1534
- return /* @__PURE__ */ jsx(CheckboxIndicatorContext, { value: checked, children: /* @__PURE__ */ jsx(CommandMenuItem, { ref, onSelect: handleSelect, "data-state": getCheckedState$1(checked), ...rest, children }) });
1381
+ return /* @__PURE__ */ jsx(CheckboxIndicatorContext, { value: checked, children: /* @__PURE__ */ jsx(CommandMenuItem, { ref, onSelect: handleSelect, "data-state": getCheckedState(checked), ...rest, children }) });
1535
1382
  });
1536
1383
  CommandMenuCheckboxItem.displayName = "CommandMenuCheckboxItem";
1537
1384
  const CommandMenuContent = memo((props) => {
@@ -1558,9 +1405,10 @@ const CommandMenuContent = memo((props) => {
1558
1405
  return {
1559
1406
  variant,
1560
1407
  size: size2,
1561
- radius
1408
+ radius,
1409
+ accentColor
1562
1410
  };
1563
- }, [radius, size2, variant]);
1411
+ }, [accentColor, radius, size2, variant]);
1564
1412
  return /* @__PURE__ */ jsx(DialogPortal, { children: /* @__PURE__ */ jsx(
1565
1413
  DialogContent$1,
1566
1414
  {
@@ -1647,7 +1495,7 @@ const CommandMenuMultiSelectItem = genericMemo(function(props) {
1647
1495
  {
1648
1496
  ref,
1649
1497
  onSelect: handleSelect,
1650
- "data-state": getSelectedState$1(isSelected),
1498
+ "data-state": getSelectedState(isSelected),
1651
1499
  "aria-selected": isSelected,
1652
1500
  closeOnSelect,
1653
1501
  ...rest,
@@ -1721,10 +1569,17 @@ const CommandMenuRadioItem = genericMemo(function(props) {
1721
1569
  selectValue(value);
1722
1570
  }, [onSelect, selectValue, value]);
1723
1571
  const isSelected = selected(value);
1724
- return /* @__PURE__ */ jsx(SelectedIndicatorContext$1, { value: isSelected, children: /* @__PURE__ */ jsx(CommandMenuItem, { ref, onSelect: handleSelect, "data-state": getSelectedState$1(isSelected), ...rest, children }) });
1572
+ return /* @__PURE__ */ jsx(SelectedIndicatorContext$1, { value: isSelected, children: /* @__PURE__ */ jsx(CommandMenuItem, { ref, onSelect: handleSelect, "data-state": getSelectedState(isSelected), ...rest, children }) });
1725
1573
  });
1726
1574
  const CommandMenuRoot = memo((props) => {
1727
- const { children, defaultOpen, open: controlledOpen, onOpenChange, modal } = props;
1575
+ const {
1576
+ children,
1577
+ defaultOpen,
1578
+ open: controlledOpen,
1579
+ // oxlint-disable-next-line typescript/unbound-method
1580
+ onOpenChange,
1581
+ modal
1582
+ } = props;
1728
1583
  const [open, setOpen] = useControlledState(defaultOpen ?? false, controlledOpen, onOpenChange);
1729
1584
  const contextValue = useMemo(() => {
1730
1585
  return {
@@ -1749,35 +1604,39 @@ const CommandMenuSelectAllItem = genericMemo(function(props) {
1749
1604
  ref,
1750
1605
  role: "menuitemcheckbox",
1751
1606
  onSelect: handleSelect,
1752
- "data-state": getCheckedState$1(selectedState),
1607
+ "data-state": getCheckedState(selectedState),
1753
1608
  closeOnSelect,
1754
1609
  ...rest
1755
1610
  }
1756
1611
  ) });
1757
1612
  });
1758
- const CommandMenuSelectedIndicator = memo((props) => {
1759
- const { ref, className, children, ...rest } = props;
1760
- const isSelected = use(SelectedIndicatorContext$1);
1761
- const computedChildren = useMemo(() => {
1762
- return typeof children === "function" ? children(isSelected) : children;
1763
- }, [isSelected, children]);
1613
+ const SelectedIndicatorContext = createContext(false);
1614
+ const SelectedIndicator = memo((props) => {
1615
+ const { ref, children, className, ...rest } = props;
1616
+ const isSelected = use(SelectedIndicatorContext);
1617
+ const computedChildren = typeof children === "function" ? children(isSelected) : children;
1764
1618
  return /* @__PURE__ */ jsx(
1765
1619
  "span",
1766
1620
  {
1767
1621
  ref,
1768
- "data-state": getSelectedState$1(isSelected),
1769
1622
  className: cx(
1770
- "inline-block size-max",
1623
+ "flex size-max items-center",
1771
1624
  {
1772
1625
  invisible: !isSelected
1773
1626
  },
1774
1627
  className
1775
1628
  ),
1629
+ "data-state": getSelectedState(isSelected),
1776
1630
  ...rest,
1777
1631
  children: computedChildren
1778
1632
  }
1779
1633
  );
1780
1634
  });
1635
+ SelectedIndicator.displayName = "SelectedIndicator";
1636
+ const CommandMenuSelectedIndicator = memo((props) => {
1637
+ const { ref, children, ...rest } = props;
1638
+ return /* @__PURE__ */ jsx(SelectedIndicator, { ref, ...rest, children });
1639
+ });
1781
1640
  CommandMenuSelectedIndicator.displayName = "CommandMenuSelectedIndicator";
1782
1641
  const CommandMenuSeparator = memo((props) => {
1783
1642
  const { className, ref, spacing = false, ...rest } = props;
@@ -1817,21 +1676,21 @@ const CommandMenu = {
1817
1676
  PageTriggerItem: CommandMenuPageTriggerItem
1818
1677
  };
1819
1678
  const LuIcon = memo((props) => {
1820
- const { ref, icon, className, size: size2 = "1em", ...rest } = props;
1821
- return /* @__PURE__ */ jsx(DynamicIcon, { ref, className: cx("shrink-0", className), size: size2, name: icon, ...rest });
1679
+ const { ref, icon: Icon, className, size: size2 = "1em", ...rest } = props;
1680
+ return /* @__PURE__ */ jsx(Icon, { ref, className: cx("shrink-0", className), size: size2, ...rest });
1822
1681
  });
1823
1682
  LuIcon.displayName = "LuIcon";
1824
1683
  const Chevron = (props) => {
1825
1684
  const { orientation, ...rest } = props;
1826
1685
  switch (orientation) {
1827
1686
  case "up":
1828
- return /* @__PURE__ */ jsx(LuIcon, { icon: "chevron-up", ...rest });
1687
+ return /* @__PURE__ */ jsx(LuIcon, { icon: ChevronUp, ...rest });
1829
1688
  case "down":
1830
- return /* @__PURE__ */ jsx(LuIcon, { icon: "chevron-down", ...rest });
1689
+ return /* @__PURE__ */ jsx(LuIcon, { icon: ChevronDown, ...rest });
1831
1690
  case "left":
1832
- return /* @__PURE__ */ jsx(LuIcon, { icon: "chevron-left", ...rest });
1691
+ return /* @__PURE__ */ jsx(LuIcon, { icon: ChevronLeft, ...rest });
1833
1692
  default:
1834
- return /* @__PURE__ */ jsx(LuIcon, { icon: "chevron-right", ...rest });
1693
+ return /* @__PURE__ */ jsx(LuIcon, { icon: ChevronRight, ...rest });
1835
1694
  }
1836
1695
  };
1837
1696
  const rootCva = cva(["relative", "size-max"], {
@@ -2081,6 +1940,7 @@ const DialogRoot = memo((props) => {
2081
1940
  defaultOpen,
2082
1941
  onCloseInterrupt,
2083
1942
  open: externalOpen,
1943
+ // oxlint-disable-next-line typescript/unbound-method
2084
1944
  onOpenChange: externalOpenChange
2085
1945
  } = props;
2086
1946
  const [innerOpen, setInnerOpen] = useState(defaultOpen ?? false);
@@ -2254,7 +2114,7 @@ const HoverCard = {
2254
2114
  Root: RadixHoverCard.Root,
2255
2115
  Trigger: RadixHoverCard.Trigger
2256
2116
  };
2257
- const HoverUtility = memo(function Root({ children, forceHover }) {
2117
+ const HoverUtility = memo(({ children, forceHover }) => {
2258
2118
  const [isHovered, setIsHovered] = useState(false);
2259
2119
  const handlePointerEnter = useCallback(() => {
2260
2120
  setIsHovered(true);
@@ -2268,6 +2128,7 @@ const HoverUtility = memo(function Root({ children, forceHover }) {
2268
2128
  onPointerLeave: handlePointerLeave
2269
2129
  });
2270
2130
  });
2131
+ HoverUtility.displayName = "HoverUtility";
2271
2132
  const InputContext = createContext({});
2272
2133
  const inputRoot$1 = cva(
2273
2134
  [
@@ -2344,15 +2205,14 @@ const inputSlot = cva(["peer/slot", "slot"], {
2344
2205
  }
2345
2206
  });
2346
2207
  const InputField = memo((props) => {
2347
- const { ref, children, className, ...rest } = props;
2208
+ const { ref, className, ...rest } = props;
2348
2209
  const { size: size2, variant } = useContext(InputContext);
2349
2210
  return /* @__PURE__ */ jsx(
2350
2211
  "input",
2351
2212
  {
2352
2213
  className: cx(inputField({ size: size2, variant }), "grow bg-transparent outline-0", className),
2353
2214
  ref,
2354
- ...rest,
2355
- children
2215
+ ...rest
2356
2216
  }
2357
2217
  );
2358
2218
  });
@@ -2395,9 +2255,9 @@ const Input = {
2395
2255
  const LayoutContext = createContext({});
2396
2256
  const useLayoutContext = () => useContext(LayoutContext);
2397
2257
  const LayoutContainer = memo((props) => {
2398
- const { ref, children, className, ...rest } = props;
2258
+ const { ref, children, ...rest } = props;
2399
2259
  const { hideLayout = false } = useLayoutContext();
2400
- return !hideLayout && /* @__PURE__ */ jsx("div", { className: cx("flex h-full grow", className), ref, ...rest, children });
2260
+ return !hideLayout && /* @__PURE__ */ jsx("div", { ref, ...rest, children });
2401
2261
  });
2402
2262
  LayoutContainer.displayName = "LayoutContainer";
2403
2263
  const LayoutRoot = memo((props) => {
@@ -2424,6 +2284,23 @@ const LayoutRoot = memo((props) => {
2424
2284
  return /* @__PURE__ */ jsx(LayoutContext.Provider, { value: contextValue, children });
2425
2285
  });
2426
2286
  LayoutRoot.displayName = "LayoutRoot";
2287
+ const SlideOutRootContext = createContext({});
2288
+ const SlideOutContextContext = createContext({});
2289
+ const SlideOutClose = memo((props) => {
2290
+ const { ref, onClick, disabled, ...rest } = props;
2291
+ const { setOpen } = use(SlideOutRootContext);
2292
+ const handleClick = useCallback(
2293
+ (e) => {
2294
+ onClick == null ? void 0 : onClick(e);
2295
+ if (e.defaultPrevented) return;
2296
+ setOpen(false);
2297
+ },
2298
+ [onClick, setOpen]
2299
+ );
2300
+ return /* @__PURE__ */ jsx(Slot, { ref, onClick: handleClick, "data-disabled": disabled ?? false, ...rest });
2301
+ });
2302
+ SlideOutClose.displayName = "SlideOutClose";
2303
+ const TIMEOUT_DURATION = 200;
2427
2304
  function usePointerDownOutside(onPointerDownOutside, ownerElement = globalThis == null ? void 0 : globalThis.document.body) {
2428
2305
  const handlePointerDownOutside = useCallbackRef(onPointerDownOutside);
2429
2306
  const isPointerInsideReactTreeRef = useRef(false);
@@ -2485,327 +2362,392 @@ function useCallbackRef(callback) {
2485
2362
  return (_a = callbackRef.current) == null ? void 0 : _a.call(callbackRef, ...args);
2486
2363
  }, []);
2487
2364
  }
2488
- const TIMEOUT_DURATION = 200;
2489
- const SlideOut = memo((props) => {
2490
- const {
2491
- ref,
2492
- children,
2493
- className,
2494
- style,
2495
- open,
2496
- hide: hide2 = false,
2497
- modal = false,
2498
- overlayComponent,
2499
- resizeable = true,
2500
- side,
2501
- position = "relative",
2502
- initialWidth,
2503
- minWidth,
2504
- maxWidth,
2505
- onDismiss,
2506
- onOpening,
2507
- onClosed,
2508
- content,
2509
- ...otherProps
2510
- } = props;
2511
- const isLeft = side === "left";
2512
- const [parentContainer, setParentContainer] = useState(document.body);
2513
- const childrenContainerRef = useRef(null);
2514
- const localRef = useRef(null);
2515
- const nodeRef = useRef(null);
2516
- const mergedRefs = mergeRefs([ref, localRef, nodeRef]);
2517
- const [isResizing, setIsResizing] = useState(false);
2518
- const [computedWidth, setComputedWidth] = useState(null);
2519
- const prevClientX = useRef(null);
2520
- const handleDismiss = useCallback(() => {
2521
- if (modal && onDismiss) {
2522
- onDismiss();
2523
- }
2524
- }, [modal, onDismiss]);
2525
- const handleAssignParentContainer = useCallback((element) => {
2526
- if (element) {
2527
- setParentContainer(element);
2365
+ const SlideOutContent = memo((props) => {
2366
+ const { ref, children, style, side, type, resizeable = false, initialSize, minSize, maxSize, ...rest } = props;
2367
+ const internalRef = useRef(null);
2368
+ const { open, setOpen, parentElement, modal, hide: hide2 } = use(SlideOutRootContext);
2369
+ const [computedSize, setComputedSize] = useState(null);
2370
+ const handleClose = useCallback(() => {
2371
+ if (modal) setOpen(false);
2372
+ }, [modal, setOpen]);
2373
+ const { onPointerDownCapture: handlePointerDownCapture } = usePointerDownOutside(
2374
+ handleClose,
2375
+ parentElement ?? void 0
2376
+ );
2377
+ useLayoutEffect(() => {
2378
+ if (!open || !internalRef.current) return;
2379
+ const { offsetWidth, offsetHeight } = internalRef.current;
2380
+ switch (side) {
2381
+ case "left":
2382
+ case "right":
2383
+ setComputedSize(offsetWidth);
2384
+ break;
2385
+ case "top":
2386
+ case "bottom":
2387
+ setComputedSize(offsetHeight);
2388
+ }
2389
+ }, [open, side]);
2390
+ const computedStyle = useMemo(() => {
2391
+ switch (side) {
2392
+ case "left":
2393
+ return {
2394
+ ...style,
2395
+ left: 0,
2396
+ width: computedSize ?? initialSize,
2397
+ maxWidth: maxSize,
2398
+ minWidth: minSize,
2399
+ position: type === "inline" ? "relative" : "absolute",
2400
+ "--slide-out-size": `${computedSize}px`
2401
+ };
2402
+ case "right":
2403
+ return {
2404
+ ...style,
2405
+ right: 0,
2406
+ width: computedSize ?? initialSize,
2407
+ maxWidth: maxSize,
2408
+ minWidth: minSize,
2409
+ position: type === "inline" ? "relative" : "absolute",
2410
+ "--slide-out-size": `${computedSize}px`
2411
+ };
2412
+ case "top":
2413
+ return {
2414
+ ...style,
2415
+ top: 0,
2416
+ height: computedSize ?? initialSize,
2417
+ maxHeight: maxSize,
2418
+ minHeight: minSize,
2419
+ position: type === "inline" ? "relative" : "absolute",
2420
+ "--slide-out-size": `${computedSize}px`
2421
+ };
2422
+ case "bottom":
2423
+ return {
2424
+ ...style,
2425
+ bottom: 0,
2426
+ height: computedSize ?? initialSize,
2427
+ maxHeight: maxSize,
2428
+ minHeight: minSize,
2429
+ position: type === "inline" ? "relative" : "absolute",
2430
+ "--slide-out-size": `${computedSize}px`
2431
+ };
2528
2432
  }
2529
- }, []);
2530
- useEffect(() => {
2531
- if (!childrenContainerRef.current) return;
2532
- const originalParentPointerEvents = childrenContainerRef.current.style.pointerEvents;
2533
- if (open && modal) {
2534
- childrenContainerRef.current.style.pointerEvents = "none";
2433
+ }, [computedSize, initialSize, maxSize, minSize, side, style, type]);
2434
+ const transitionClassNames = useMemo(() => {
2435
+ switch (side) {
2436
+ case "left":
2437
+ return {
2438
+ enter: "-ml-(--slide-out-size)",
2439
+ enterActive: "ease-linear duration-200 transition-[margin-left] ml-0",
2440
+ enterDone: "ml-0",
2441
+ exitActive: "ease-linear duration-200 transition-[margin-left] -ml-(--slide-out-size)",
2442
+ exitDone: "-ml-(--slide-out-size)"
2443
+ };
2444
+ case "right":
2445
+ return {
2446
+ enter: "-mr-(--slide-out-size)",
2447
+ enterActive: "ease-linear duration-200 transition-[margin-right] mr-0",
2448
+ enterDone: "mr-0",
2449
+ exitActive: "ease-linear duration-200 transition-[margin-right] -mr-(--slide-out-size)",
2450
+ exitDone: "-mr-(--slide-out-size)"
2451
+ };
2452
+ case "top":
2453
+ return {
2454
+ enter: "-mt-(--slide-out-size)",
2455
+ enterActive: "ease-linear duration-200 transition-[margin-top] mt-0",
2456
+ enterDone: "mt-0",
2457
+ exitActive: "ease-linear duration-200 transition-[margin-top] -mt-(--slide-out-size)",
2458
+ exitDone: "-mt-(--slide-out-size)"
2459
+ };
2460
+ case "bottom":
2461
+ return {
2462
+ enter: "-mb-(--slide-out-size)",
2463
+ enterActive: "ease-linear duration-200 transition-[margin-bottom] mb-0",
2464
+ enterDone: "mb-0",
2465
+ exitActive: "ease-linear duration-200 transition-[margin-bottom] -mb-(--slide-out-size)",
2466
+ exitDone: "-mb-(--slide-out-size)"
2467
+ };
2535
2468
  }
2536
- return () => {
2537
- if (childrenContainerRef.current) {
2538
- childrenContainerRef.current.style.pointerEvents = originalParentPointerEvents;
2539
- }
2540
- };
2541
- }, [modal, open, parentContainer.style]);
2542
- const { onPointerDownCapture: handlePointerDownCapture } = usePointerDownOutside(handleDismiss, parentContainer);
2543
- const CSSTransitionClassNames = useMemo(
2469
+ }, [side]);
2470
+ const contextValue = useMemo(
2544
2471
  () => ({
2545
- enter: isLeft ? "-ml-(--slide-out-width)" : "-mr-(--slide-out-width)",
2546
- enterActive: isLeft ? "ease-linear duration-200 transition-[margin-left] ml-0" : "ease-linear duration-200 transition-[margin-right] mr-0",
2547
- enterDone: isLeft ? "ml-0" : "mr-0",
2548
- exitActive: isLeft ? "ease-linear duration-200 transition-[margin-left] -ml-(--slide-out-width)" : "ease-linear duration-200 transition-[margin-right] -mr-(--slide-out-width)",
2549
- exitDone: isLeft ? "-ml-(--slide-out-width)" : "-mr-(--slide-out-width)"
2472
+ side,
2473
+ type,
2474
+ resizeable,
2475
+ computedSize,
2476
+ setComputedSize
2550
2477
  }),
2551
- [isLeft]
2478
+ [computedSize, resizeable, side, type]
2552
2479
  );
2553
- const handleMouseDown = useCallback((e) => {
2554
- const { clientX } = e;
2555
- prevClientX.current = clientX;
2556
- setIsResizing(true);
2557
- }, []);
2558
- const handleMouseMove = useCallback(
2480
+ return !hide2 ? (
2481
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
2482
+ // @ts-ignore
2483
+ /* @__PURE__ */ jsx(
2484
+ CSSTransition,
2485
+ {
2486
+ classNames: transitionClassNames,
2487
+ in: open,
2488
+ timeout: TIMEOUT_DURATION,
2489
+ unmountOnExit: true,
2490
+ mountOnEnter: true,
2491
+ nodeRef: internalRef,
2492
+ children: /* @__PURE__ */ jsx(
2493
+ "div",
2494
+ {
2495
+ ref: mergeRefs([ref, internalRef]),
2496
+ onPointerDownCapture: handlePointerDownCapture,
2497
+ "data-open": open,
2498
+ "data-side": side,
2499
+ "data-type": type,
2500
+ style: computedStyle,
2501
+ ...rest,
2502
+ children: /* @__PURE__ */ jsx(SlideOutContextContext, { value: contextValue, children })
2503
+ }
2504
+ )
2505
+ }
2506
+ )
2507
+ ) : null;
2508
+ });
2509
+ SlideOutContent.displayName = "SlideOutContent";
2510
+ const SlideOutHandle = memo((props) => {
2511
+ const { ref, onMouseDown, disabled, ...rest } = props;
2512
+ const prevClientCoord = useRef(null);
2513
+ const [isResizing, setIsResizing] = useState(false);
2514
+ const { side, resizeable, computedSize, setComputedSize } = use(SlideOutContextContext);
2515
+ const computedDisabled = disabled ?? !resizeable;
2516
+ const setPrevClientCoord = useCallback(
2517
+ (clientX, clientY) => {
2518
+ switch (side) {
2519
+ case "left":
2520
+ prevClientCoord.current = clientX;
2521
+ break;
2522
+ case "right":
2523
+ prevClientCoord.current = clientX;
2524
+ break;
2525
+ case "top":
2526
+ prevClientCoord.current = clientY;
2527
+ break;
2528
+ case "bottom":
2529
+ prevClientCoord.current = clientY;
2530
+ break;
2531
+ }
2532
+ },
2533
+ [side]
2534
+ );
2535
+ const handlePointerDown = useCallback(
2536
+ (e) => {
2537
+ onMouseDown == null ? void 0 : onMouseDown(e);
2538
+ if (e.defaultPrevented || computedDisabled) return;
2539
+ e.preventDefault();
2540
+ setPrevClientCoord(e.clientX, e.clientY);
2541
+ setIsResizing(true);
2542
+ },
2543
+ [computedDisabled, onMouseDown, setPrevClientCoord]
2544
+ );
2545
+ const handlePointerMove = useCallback(
2559
2546
  (e) => {
2560
- if (!isResizing) return;
2561
- const { clientX } = e;
2562
- const deltaX = (clientX - prevClientX.current) * (isLeft ? 1 : -1);
2563
- prevClientX.current = clientX;
2564
- setComputedWidth((prevWidth) => prevWidth + deltaX);
2547
+ if (!isResizing || !prevClientCoord.current || computedDisabled) return;
2548
+ e.preventDefault();
2549
+ const { clientX, clientY } = e;
2550
+ let delta = 0;
2551
+ switch (side) {
2552
+ case "left":
2553
+ delta = clientX - prevClientCoord.current;
2554
+ break;
2555
+ case "right":
2556
+ delta = (clientX - prevClientCoord.current) * -1;
2557
+ break;
2558
+ case "top":
2559
+ delta = clientY - prevClientCoord.current;
2560
+ break;
2561
+ case "bottom":
2562
+ delta = (clientY - prevClientCoord.current) * -1;
2563
+ break;
2564
+ }
2565
+ setPrevClientCoord(clientX, clientY);
2566
+ setComputedSize(computedSize + delta);
2565
2567
  },
2566
- [isLeft, isResizing]
2568
+ [computedDisabled, computedSize, isResizing, setComputedSize, setPrevClientCoord, side]
2567
2569
  );
2568
- const handleMouseUp = useCallback(() => {
2569
- if (!isResizing) return;
2570
- prevClientX.current = null;
2570
+ const handlePointerUp = useCallback(() => {
2571
+ if (!isResizing || computedDisabled) return;
2572
+ prevClientCoord.current = null;
2571
2573
  setIsResizing(false);
2572
- }, [isResizing]);
2574
+ }, [computedDisabled, isResizing]);
2573
2575
  useEffect(() => {
2574
- window.addEventListener("mousemove", handleMouseMove);
2575
- window.addEventListener("mouseup", handleMouseUp);
2576
+ document.addEventListener("pointermove", handlePointerMove);
2577
+ document.addEventListener("pointerup", handlePointerUp);
2576
2578
  return () => {
2577
- window.removeEventListener("mousemove", handleMouseMove);
2578
- window.removeEventListener("mouseup", handleMouseUp);
2579
+ document.removeEventListener("pointermove", handlePointerMove);
2580
+ document.removeEventListener("pointerup", handlePointerUp);
2579
2581
  };
2580
- }, [handleMouseMove, handleMouseUp]);
2581
- useLayoutEffect(() => {
2582
- if (!open) return;
2583
- setComputedWidth(localRef.current.offsetWidth);
2584
- }, [open]);
2585
- const resizableStyle = useMemo(
2586
- () => ({
2587
- ...style,
2588
- width: computedWidth ?? initialWidth,
2589
- maxWidth,
2590
- minWidth,
2591
- position,
2592
- "--slide-out-width": `${computedWidth}${typeof computedWidth === "number" ? "px" : ""}`
2593
- }),
2594
- [computedWidth, initialWidth, maxWidth, minWidth, position, style]
2595
- );
2596
- const resizableEnable = useMemo(
2597
- () => ({ left: resizeable && !isLeft, right: resizeable && isLeft }),
2598
- [isLeft, resizeable]
2599
- );
2600
- const SlideOut2 = useMemo(
2601
- () => (
2602
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
2603
- // @ts-ignore
2604
- /* @__PURE__ */ jsx(
2605
- CSSTransition,
2606
- {
2607
- classNames: CSSTransitionClassNames,
2608
- in: open,
2609
- timeout: TIMEOUT_DURATION,
2610
- unmountOnExit: true,
2611
- mountOnEnter: true,
2612
- onEntering: onOpening,
2613
- onExited: onClosed,
2614
- nodeRef,
2615
- children: /* @__PURE__ */ jsxs(
2616
- "div",
2617
- {
2618
- className: cx(
2619
- "top-0",
2620
- "bottom-0",
2621
- {
2622
- "left-0": isLeft,
2623
- "right-0": !isLeft,
2624
- absolute: position === "absolute",
2625
- relative: position === "relative"
2626
- },
2627
- className
2628
- ),
2629
- ref: mergedRefs,
2630
- onPointerDownCapture: handlePointerDownCapture,
2631
- "data-side": side,
2632
- style: resizableStyle,
2633
- children: [
2634
- /* @__PURE__ */ jsx(
2635
- "div",
2636
- {
2637
- className: cx("absolute top-0 bottom-0 w-[3px]", {
2638
- "right-0": isLeft,
2639
- "left-0": !isLeft,
2640
- "pointer-events-none": !resizableEnable
2641
- }),
2642
- onMouseDown: handleMouseDown,
2643
- "data-resizing": isResizing ? "" : void 0
2644
- }
2645
- ),
2646
- content
2647
- ]
2648
- }
2649
- )
2650
- }
2651
- )
2652
- ),
2653
- [
2654
- CSSTransitionClassNames,
2655
- open,
2656
- onOpening,
2657
- onClosed,
2658
- className,
2659
- isLeft,
2660
- position,
2661
- mergedRefs,
2662
- handlePointerDownCapture,
2663
- side,
2664
- resizableStyle,
2665
- handleMouseDown,
2666
- isResizing,
2667
- resizableEnable,
2668
- content
2669
- ]
2670
- );
2671
- return /* @__PURE__ */ jsxs(
2582
+ }, [handlePointerMove, handlePointerUp]);
2583
+ return /* @__PURE__ */ jsx(
2672
2584
  "div",
2673
2585
  {
2674
- className: "relative flex h-full max-h-full w-full max-w-full overflow-hidden",
2675
- ref: handleAssignParentContainer,
2676
- ...otherProps,
2677
- children: [
2678
- side === "left" && !hide2 && /* @__PURE__ */ jsxs(Fragment, { children: [
2679
- open && overlayComponent,
2680
- " ",
2681
- content && SlideOut2
2682
- ] }),
2683
- /* @__PURE__ */ jsx("div", { className: "flex h-full max-w-full grow overflow-hidden", ref: childrenContainerRef, children }),
2684
- side === "right" && !hide2 && /* @__PURE__ */ jsxs(Fragment, { children: [
2685
- open && overlayComponent,
2686
- " ",
2687
- content && SlideOut2
2688
- ] })
2689
- ]
2586
+ ref,
2587
+ onPointerDown: handlePointerDown,
2588
+ "data-resizing": isResizing,
2589
+ "data-side": side,
2590
+ "data-disabled": computedDisabled,
2591
+ ...rest
2690
2592
  }
2691
2593
  );
2692
2594
  });
2693
- SlideOut.displayName = "SlideOut";
2694
- const DEFAULT_INITIAL_WIDTH = "30%";
2695
- const LayoutSlideOut = memo((props) => {
2696
- const { small, hideLayout, isOpen, setOpen } = useLayoutContext();
2595
+ SlideOutHandle.displayName = "SlideOutHandle";
2596
+ const SlideOutOverlay = memo((props) => {
2597
+ const { ref, ...rest } = props;
2598
+ const { open, hide: hide2 } = use(SlideOutRootContext);
2599
+ return open && !hide2 ? /* @__PURE__ */ jsx("div", { ref, "data-open": open, ...rest }) : null;
2600
+ });
2601
+ SlideOutOverlay.displayName = "SlideOutOverlay";
2602
+ const SlideOutRoot = memo((props) => {
2697
2603
  const {
2698
2604
  ref,
2699
- id,
2700
2605
  children,
2701
- className,
2702
- defaultOpen,
2703
- side,
2704
- initialWidth = DEFAULT_INITIAL_WIDTH,
2705
- onDismiss,
2606
+ defaultOpen = false,
2607
+ open: controlledOpen,
2608
+ onOpenChange,
2609
+ modal = false,
2610
+ hide: hide2 = false,
2706
2611
  ...rest
2707
2612
  } = props;
2708
- const open = isOpen(id);
2709
- useEffect(() => {
2710
- if (small && (defaultOpen == null ? void 0 : defaultOpen.small) !== void 0) {
2711
- setOpen(id, defaultOpen == null ? void 0 : defaultOpen.small);
2712
- } else if (!small && (defaultOpen == null ? void 0 : defaultOpen.large) !== void 0) {
2713
- setOpen(id, defaultOpen == null ? void 0 : defaultOpen.large);
2714
- }
2715
- }, [defaultOpen, id, setOpen, small]);
2716
- const handleDismiss = useCallback(() => {
2717
- setOpen(id, false);
2718
- onDismiss == null ? void 0 : onDismiss();
2719
- }, [id, onDismiss, setOpen]);
2720
- return !hideLayout && /* @__PURE__ */ jsx(
2721
- SlideOut,
2722
- {
2723
- className: cx(`overmap-layout-slideOut-${side}`, className),
2724
- side,
2725
- ref,
2613
+ const [parentElement, setParentElement] = useState(null);
2614
+ const [open, setOpen] = useControlledState(defaultOpen, controlledOpen, onOpenChange);
2615
+ const contextValue = useMemo(
2616
+ () => ({
2617
+ parentElement,
2726
2618
  open,
2727
- initialWidth,
2728
- modal: small,
2729
- onDismiss: handleDismiss,
2730
- position: small ? "absolute" : "relative",
2731
- ...rest,
2732
- children
2733
- }
2619
+ setOpen,
2620
+ modal,
2621
+ hide: hide2
2622
+ }),
2623
+ [hide2, modal, open, parentElement, setOpen]
2734
2624
  );
2625
+ return /* @__PURE__ */ jsx("div", { ref: mergeRefs([ref, setParentElement]), ...rest, children: /* @__PURE__ */ jsx(SlideOutRootContext, { value: contextValue, children }) });
2735
2626
  });
2736
- LayoutSlideOut.displayName = "LayoutSlideOut";
2737
- const LayoutSlideOutOverlay = memo((props) => {
2738
- const { ref, children, className, active, slideOutId, smallModeOnly = false, ...rest } = props;
2739
- const { small, hideLayout, isOpen } = useLayoutContext();
2740
- const showOverlay = useMemo(() => {
2741
- if (active !== void 0) return active;
2742
- if (hideLayout) return false;
2743
- if (smallModeOnly && !small) return false;
2744
- return isOpen(slideOutId);
2745
- }, [active, hideLayout, isOpen, slideOutId, small, smallModeOnly]);
2746
- return showOverlay && /* @__PURE__ */ jsx("div", { className: cx("overmap-layout-overlay", "fixed inset-0", className), ref, ...rest, children });
2627
+ SlideOutRoot.displayName = "SlideOutRoot";
2628
+ const SlideOutTrigger = memo((props) => {
2629
+ const { ref, onClick, ...rest } = props;
2630
+ const { open, setOpen } = use(SlideOutRootContext);
2631
+ const handleClick = useCallback(
2632
+ (e) => {
2633
+ onClick == null ? void 0 : onClick(e);
2634
+ if (e.defaultPrevented) return;
2635
+ setOpen(!open);
2636
+ },
2637
+ [onClick, open, setOpen]
2638
+ );
2639
+ return /* @__PURE__ */ jsx(Slot, { ref, onClick: handleClick, "data-disabled": props.disabled ?? false, ...rest });
2747
2640
  });
2748
- LayoutSlideOutOverlay.displayName = "SlideOutOverlay";
2749
- const MENU_OVERFLOW_PADDING = 20;
2750
- const MENU_CONTENT_PADDING = 8;
2751
- const MENU_MINIMUM_MAX_HEIGHT = 250;
2752
- const computeOffsets = (side, alignment) => {
2753
- switch (side) {
2754
- case "right":
2755
- if (alignment === "start") {
2756
- return { mainAxis: MENU_CONTENT_PADDING + 1, crossAxis: -MENU_CONTENT_PADDING };
2757
- } else if (alignment === "end") {
2758
- return { mainAxis: MENU_CONTENT_PADDING + 1, crossAxis: MENU_CONTENT_PADDING };
2759
- }
2760
- break;
2761
- case "left":
2762
- if (alignment === "start") {
2763
- return { mainAxis: MENU_CONTENT_PADDING + 1, crossAxis: -MENU_CONTENT_PADDING };
2764
- } else if (alignment === "end") {
2765
- return { mainAxis: MENU_CONTENT_PADDING + 1, crossAxis: MENU_CONTENT_PADDING };
2766
- }
2767
- break;
2768
- }
2769
- return { mainAxis: MENU_CONTENT_PADDING + 1, crossAxis: 0 };
2641
+ SlideOutTrigger.displayName = "SlideOutTrigger";
2642
+ const SlideOutViewport = memo((props) => {
2643
+ const { ref, ...rest } = props;
2644
+ const internalRef = useRef(null);
2645
+ const { open, modal, parentElement } = use(SlideOutRootContext);
2646
+ useEffect(() => {
2647
+ if (!internalRef.current) return;
2648
+ const internalElement = internalRef.current;
2649
+ const originalParentPointerEvents = internalElement.style.pointerEvents;
2650
+ if (open && modal) {
2651
+ internalElement.style.pointerEvents = "none";
2652
+ }
2653
+ return () => {
2654
+ internalElement.style.pointerEvents = originalParentPointerEvents;
2655
+ };
2656
+ }, [modal, open, parentElement == null ? void 0 : parentElement.style]);
2657
+ return /* @__PURE__ */ jsx("div", { ref: mergeRefs([ref, internalRef]), ...rest });
2658
+ });
2659
+ SlideOutViewport.displayName = "SlideOutViewport";
2660
+ const SlideOut = {
2661
+ Close: SlideOutClose,
2662
+ Content: SlideOutContent,
2663
+ Handle: SlideOutHandle,
2664
+ Overlay: SlideOutOverlay,
2665
+ Root: SlideOutRoot,
2666
+ Trigger: SlideOutTrigger,
2667
+ Viewport: SlideOutViewport
2770
2668
  };
2771
- function getSelectedState(selected) {
2772
- return selected ? "selected" : "unselected";
2773
- }
2774
- function getCheckedState(checked) {
2775
- return checked === true ? "checked" : checked === false ? "unchecked" : "indeterminate";
2776
- }
2777
- function getBooleanState(value) {
2778
- return value ? "true" : "false";
2779
- }
2780
- function getOpenState(open) {
2781
- return open ? "open" : "closed";
2782
- }
2783
- function nextStateBasedOnType(open, type) {
2784
- switch (type) {
2785
- case "toggle":
2786
- return !open;
2787
- case "open":
2788
- return true;
2789
- case "close":
2790
- return false;
2791
- }
2792
- }
2669
+ const LayoutSlideOutClose = memo((props) => {
2670
+ const { ref, ...rest } = props;
2671
+ return /* @__PURE__ */ jsx(SlideOutClose, { ref, ...rest });
2672
+ });
2673
+ LayoutSlideOutClose.displayName = "LayoutSlideOutClose";
2674
+ const LayoutSlideOutContent = memo((props) => {
2675
+ const { ref, type, ...rest } = props;
2676
+ const { small } = use(LayoutContext);
2677
+ return /* @__PURE__ */ jsx(SlideOutContent, { ref, type: type ?? (small ? "overlay" : "inline"), ...rest });
2678
+ });
2679
+ LayoutSlideOutContent.displayName = "LayoutSlideOutContent";
2680
+ const LayoutSlideOutHandle = memo((props) => {
2681
+ const { ref, ...rest } = props;
2682
+ return /* @__PURE__ */ jsx(SlideOutHandle, { ref, ...rest });
2683
+ });
2684
+ LayoutSlideOutHandle.displayName = "LayoutSlideOutHandle";
2685
+ const LayoutSlideOutOverlay = memo((props) => {
2686
+ const { ref, smallModeOnly = false, ...rest } = props;
2687
+ const { small, hideLayout } = useLayoutContext();
2688
+ const showOverlay = useMemo(() => {
2689
+ if (hideLayout) return false;
2690
+ if (smallModeOnly && !small) return false;
2691
+ return true;
2692
+ }, [hideLayout, small, smallModeOnly]);
2693
+ return showOverlay ? /* @__PURE__ */ jsx(SlideOutOverlay, { ref, ...rest }) : null;
2694
+ });
2695
+ LayoutSlideOutOverlay.displayName = "SlideOutOverlay";
2696
+ const LayoutSlideOutRoot = memo((props) => {
2697
+ const { ref, slideOutId, defaultOpen, hide: hide2, ...rest } = props;
2698
+ const { isOpen, setOpen, small, hideLayout } = use(LayoutContext);
2699
+ const open = isOpen(slideOutId);
2700
+ const handleOpenChange = useCallback(
2701
+ (open2) => {
2702
+ if (!open2) setOpen(slideOutId, false);
2703
+ },
2704
+ [setOpen, slideOutId]
2705
+ );
2706
+ useEffect(() => {
2707
+ if (small && (defaultOpen == null ? void 0 : defaultOpen.small) !== void 0) {
2708
+ setOpen(slideOutId, defaultOpen == null ? void 0 : defaultOpen.small);
2709
+ } else if (!small && (defaultOpen == null ? void 0 : defaultOpen.large) !== void 0) {
2710
+ setOpen(slideOutId, defaultOpen == null ? void 0 : defaultOpen.large);
2711
+ }
2712
+ }, [defaultOpen, slideOutId, setOpen, small]);
2713
+ return /* @__PURE__ */ jsx(
2714
+ SlideOutRoot,
2715
+ {
2716
+ ref,
2717
+ open,
2718
+ onOpenChange: handleOpenChange,
2719
+ modal: small,
2720
+ hide: hide2 ?? hideLayout,
2721
+ ...rest
2722
+ }
2723
+ );
2724
+ });
2725
+ LayoutSlideOutRoot.displayName = "LayoutSlideOutRoot";
2793
2726
  const LayoutSlideOutTrigger = memo((props) => {
2794
- const { ref, slideOutId, type = "toggle", children, ...rest } = props;
2727
+ const { ref, slideOutId, children, ...rest } = props;
2795
2728
  const { isOpen, setOpen } = useLayoutContext();
2796
2729
  const open = isOpen(slideOutId);
2797
2730
  const handleClick = useCallback(() => {
2798
- setOpen(slideOutId, nextStateBasedOnType(open, type));
2799
- }, [open, setOpen, slideOutId, type]);
2731
+ setOpen(slideOutId, !open);
2732
+ }, [open, setOpen, slideOutId]);
2800
2733
  return /* @__PURE__ */ jsx(Slot, { "data-state": getOpenState(open), ref, onClick: handleClick, ...rest, children });
2801
2734
  });
2802
- LayoutSlideOutTrigger.displayName = "SlideOutTrigger";
2735
+ LayoutSlideOutTrigger.displayName = "LayoutSlideOutTrigger";
2736
+ const LayoutSlideOutViewport = memo((props) => {
2737
+ const { ref, ...rest } = props;
2738
+ return /* @__PURE__ */ jsx(SlideOutViewport, { ref, ...rest });
2739
+ });
2740
+ LayoutSlideOutViewport.displayName = "LayoutSlideOutViewport";
2803
2741
  const Layout = {
2804
2742
  Root: LayoutRoot,
2805
2743
  Container: LayoutContainer,
2744
+ SlideOutClose: LayoutSlideOutClose,
2745
+ SlideOutContent: LayoutSlideOutContent,
2746
+ SlideOutHandle: LayoutSlideOutHandle,
2806
2747
  SlideOutOverlay: LayoutSlideOutOverlay,
2807
- SlideOut: LayoutSlideOut,
2808
- SlideOutTrigger: LayoutSlideOutTrigger
2748
+ SlideOutRoot: LayoutSlideOutRoot,
2749
+ SlideOutTrigger: LayoutSlideOutTrigger,
2750
+ SlideOutViewport: LayoutSlideOutViewport
2809
2751
  };
2810
2752
  const linkCva = cva(["cursor-pointer"], {
2811
2753
  variants: {
@@ -2875,28 +2817,6 @@ const Link = memo((props) => {
2875
2817
  );
2876
2818
  });
2877
2819
  Link.displayName = "Link";
2878
- const CheckedIndicatorContext = createContext({});
2879
- const CheckedIndicator = (props) => {
2880
- const { children, ref, className, ...rest } = props;
2881
- const checked = useContext(CheckedIndicatorContext);
2882
- const computedChildren = typeof children === "function" ? children(checked === "indeterminate") : children;
2883
- return /* @__PURE__ */ jsx(
2884
- "span",
2885
- {
2886
- ref,
2887
- className: cx(
2888
- "flex size-max items-center",
2889
- {
2890
- invisible: checked === false
2891
- },
2892
- className
2893
- ),
2894
- "data-state": getCheckedState$1(checked),
2895
- ...rest,
2896
- children: computedChildren
2897
- }
2898
- );
2899
- };
2900
2820
  const menuItem = cva(
2901
2821
  [
2902
2822
  "select-none",
@@ -3042,346 +2962,55 @@ const inputRoot = cva(
3042
2962
  }
3043
2963
  }
3044
2964
  );
3045
- const MenuContext = createContext({});
3046
- const useMenuContext = () => useContext(MenuContext);
3047
- const DEFAULT_OFFSET = 5;
3048
- const MenuRoot = memo((props) => {
3049
- const {
3050
- children,
3051
- side = "bottom",
3052
- align = "center",
3053
- offset: offset$1,
3054
- loop = false,
3055
- modal = false,
3056
- // open state related props
3057
- open: controlledOpen,
3058
- onOpenChange,
3059
- defaultOpen
3060
- } = props;
3061
- const [open, setOpen] = useControlledState(defaultOpen ?? false, controlledOpen, onOpenChange);
3062
- const [activeIndex, setActiveIndex] = useState(null);
3063
- const [triggerType, setTriggerType] = useState(null);
3064
- const elementsRef = useRef([]);
3065
- const nodeId = useFloatingNodeId();
3066
- const { refs, floatingStyles, context, middlewareData } = useFloating({
3067
- nodeId,
3068
- strategy: "fixed",
3069
- placement: side + (align !== "center" ? "-" + align : ""),
3070
- whileElementsMounted: autoUpdate,
3071
- open,
3072
- onOpenChange: setOpen,
3073
- middleware: [
3074
- offset({ mainAxis: offset$1 ?? DEFAULT_OFFSET }),
3075
- size({
3076
- apply({ availableHeight, elements }) {
3077
- elements.floating.style.setProperty(
3078
- "--overmap-menu-available-height",
3079
- `${Math.max(availableHeight, MENU_MINIMUM_MAX_HEIGHT)}px`
3080
- );
3081
- },
3082
- padding: MENU_OVERFLOW_PADDING
3083
- }),
3084
- flip({ fallbackStrategy: "initialPlacement" }),
3085
- shift({ padding: MENU_OVERFLOW_PADDING }),
3086
- hide()
3087
- ]
3088
- });
3089
- const role = useRole(context, {
3090
- role: "menu"
3091
- });
3092
- const dismiss = useDismiss(context, {
3093
- capture: true,
3094
- ancestorScroll: triggerType === "context" || triggerType === "virtual"
3095
- });
3096
- const click = useClick(context, {
3097
- enabled: triggerType === "click"
3098
- });
3099
- const listNavigation = useListNavigation(context, {
3100
- listRef: elementsRef,
3101
- activeIndex,
3102
- onNavigate: setActiveIndex,
3103
- loop
3104
- });
3105
- const { getFloatingProps, getItemProps, getReferenceProps } = useInteractions([
3106
- dismiss,
3107
- listNavigation,
3108
- click,
3109
- role
3110
- ]);
3111
- return /* @__PURE__ */ jsx(FloatingTree, { children: /* @__PURE__ */ jsx(
3112
- MenuContext.Provider,
3113
- {
3114
- value: {
3115
- open,
3116
- setOpen,
3117
- refs,
3118
- context,
3119
- floatingStyles,
3120
- elementsRef,
3121
- getFloatingProps,
3122
- getItemProps,
3123
- getReferenceProps,
3124
- nodeId,
3125
- activeIndex,
3126
- setActiveIndex,
3127
- middlewareData,
3128
- side,
3129
- modal,
3130
- setTriggerType
3131
- },
3132
- children
3133
- }
3134
- ) });
3135
- });
3136
- MenuRoot.displayName = "Root";
3137
2965
  const MenuContentContext = createContext({});
3138
- const useMenuContentContext = () => useContext(MenuContentContext);
3139
- const MenuContent = memo((props) => {
3140
- var _a;
3141
- const providerContext = useProvider();
2966
+ const MenuContext = createContext({});
2967
+ const SubContext = createContext({});
2968
+ const TRIGGER_SELECT_KEYS = ["Enter", " "];
2969
+ const MenuItem = memo((props) => {
2970
+ const rootMenuContext = use(MenuContext);
2971
+ const { getItemProps, activeIndex, setOpen, size: size2, variant, radius } = use(MenuContentContext);
2972
+ const { closeRoot } = use(SubContext);
3142
2973
  const {
3143
2974
  ref: forwardedRef,
3144
2975
  className,
3145
2976
  children,
3146
- size: size2 = "md",
3147
- variant = "soft",
3148
- radius = providerContext.radius,
3149
- accentColor = "base",
2977
+ onSelect,
2978
+ onClick,
2979
+ onKeyDown,
2980
+ closeOnSelect = true,
2981
+ disabled = false,
3150
2982
  ...rest
3151
2983
  } = props;
3152
- const {
3153
- refs,
3154
- getFloatingProps,
3155
- middlewareData,
3156
- elementsRef,
3157
- activeIndex,
3158
- setActiveIndex,
3159
- getItemProps,
3160
- open,
3161
- setOpen,
3162
- nodeId,
3163
- context,
3164
- floatingStyles,
3165
- modal,
3166
- side
3167
- } = useMenuContext();
3168
- const computedFloatingStyles = useMemo(() => {
3169
- var _a2;
3170
- return {
3171
- ...floatingStyles,
3172
- visibility: ((_a2 = middlewareData.hide) == null ? void 0 : _a2.referenceHidden) ? "hidden" : "visible"
3173
- };
3174
- }, [floatingStyles, (_a = middlewareData.hide) == null ? void 0 : _a.referenceHidden]);
3175
- const handleOverlayPointerDown = useCallback(
2984
+ const { ref, index } = useListItem();
2985
+ const mergeRefs2 = useMergeRefs([ref, forwardedRef]);
2986
+ const handleClick = useCallback(
3176
2987
  (e) => {
3177
- if (modal) stopPropagation(e);
2988
+ e.stopPropagation();
2989
+ if (disabled) return;
2990
+ onClick == null ? void 0 : onClick(e);
2991
+ onSelect == null ? void 0 : onSelect();
2992
+ if (closeOnSelect) setOpen(false);
2993
+ if (closeRoot) rootMenuContext.setOpen(false);
3178
2994
  },
3179
- [modal]
2995
+ [closeOnSelect, closeRoot, disabled, rootMenuContext, onClick, onSelect, setOpen]
3180
2996
  );
3181
- return /* @__PURE__ */ jsx(FloatingNode, { id: nodeId, children: open && /* @__PURE__ */ jsx(FloatingPortal, { children: /* @__PURE__ */ jsx(
3182
- FloatingOverlay,
3183
- {
3184
- className: menuOverlay({ modal }),
3185
- onClick: handleOverlayPointerDown,
3186
- lockScroll: true,
3187
- "data-floating-content": "",
3188
- children: /* @__PURE__ */ jsx(FloatingFocusManager, { context, children: /* @__PURE__ */ jsx(FloatingList, { elementsRef, children: /* @__PURE__ */ jsx(
3189
- MenuContentContext.Provider,
3190
- {
3191
- value: {
3192
- getItemProps,
3193
- activeIndex,
3194
- elementsRef,
3195
- open,
3196
- setOpen,
3197
- refs,
3198
- setActiveIndex,
3199
- size: size2,
3200
- variant,
3201
- accentColor,
3202
- radius
3203
- },
3204
- children: /* @__PURE__ */ jsx(
3205
- "div",
3206
- {
3207
- className: "border-box w-max outline-none",
3208
- ref: refs.setFloating,
3209
- tabIndex: -1,
3210
- style: computedFloatingStyles,
3211
- "data-floating-content": "",
3212
- ...getFloatingProps(),
3213
- children: /* @__PURE__ */ jsx(
3214
- "ul",
3215
- {
3216
- className: cx(
3217
- menuContent({ size: size2 }),
3218
- floating({ side, shadow: "3" }),
3219
- radiusCva({ radius, maxLarge: true }),
3220
- "max-h-(--overmap-menu-available-height)",
3221
- className
3222
- ),
3223
- ref: forwardedRef,
3224
- "data-state": getOpenState(open),
3225
- "data-side": side,
3226
- "data-accent-color": accentColor,
3227
- ...rest,
3228
- children
3229
- }
3230
- )
3231
- }
3232
- )
3233
- }
3234
- ) }) })
3235
- }
3236
- ) }) });
3237
- });
3238
- MenuContent.displayName = "Menu.Content";
3239
- const SubContext = createContext({});
3240
- const useSubContext = () => useContext(SubContext);
3241
- const MenuSub = memo((props) => {
3242
- const {
3243
- children,
3244
- disabled = false,
3245
- side = "right",
3246
- align = "start",
3247
- closeRoot = false,
3248
- loop = false,
3249
- modal = false,
3250
- // open state related props
3251
- open: controlledOpen,
3252
- onOpenChange,
3253
- defaultOpen
3254
- } = props;
3255
- const [open, setOpen] = useControlledState(defaultOpen ?? false, controlledOpen, onOpenChange);
3256
- const nodeId = useFloatingNodeId();
3257
- const { refs, floatingStyles, context } = useFloating({
3258
- nodeId,
3259
- strategy: "fixed",
3260
- whileElementsMounted: autoUpdate,
3261
- open,
3262
- onOpenChange: (open2, _event, reason) => {
3263
- if (reason) setOpen(open2);
3264
- },
3265
- placement: side + (align !== "center" ? "-" + align : ""),
3266
- middleware: [
3267
- offset({ ...computeOffsets(side, align) }),
3268
- size({
3269
- padding: MENU_OVERFLOW_PADDING,
3270
- apply({ availableHeight, elements }) {
3271
- elements.floating.style.setProperty(
3272
- "--overmap-menu-available-height",
3273
- `${Math.max(availableHeight, MENU_MINIMUM_MAX_HEIGHT)}px`
3274
- );
3275
- }
3276
- }),
3277
- flip(),
3278
- shift({ padding: MENU_OVERFLOW_PADDING }),
3279
- hide()
3280
- ]
3281
- });
3282
- const dismiss = useDismiss(context, {
3283
- bubbles: closeRoot,
3284
- outsidePress: closeRoot
3285
- });
3286
- const hover = useHover(context, {
3287
- restMs: 50,
3288
- handleClose: safePolygon({
3289
- blockPointerEvents: true,
3290
- requireIntent: false
3291
- }),
3292
- enabled: !disabled
3293
- });
3294
- const click = useClick(context, {
3295
- enabled: !disabled
3296
- });
3297
- const elementsRef = useRef([]);
3298
- const [activeIndex, setActiveIndex] = useState(null);
3299
- const listNavigation = useListNavigation(context, {
3300
- listRef: elementsRef,
3301
- nested: true,
3302
- activeIndex,
3303
- onNavigate: setActiveIndex,
3304
- loop,
3305
- rtl: side === "left"
3306
- });
3307
- const { getFloatingProps, getItemProps, getReferenceProps } = useInteractions([
3308
- listNavigation,
3309
- dismiss,
3310
- hover,
3311
- click
3312
- ]);
3313
- return /* @__PURE__ */ jsx(
3314
- SubContext.Provider,
3315
- {
3316
- value: {
3317
- open,
3318
- setOpen,
3319
- nodeId,
3320
- refs,
3321
- floatingStyles,
3322
- context,
3323
- elementsRef,
3324
- activeIndex,
3325
- setActiveIndex,
3326
- getFloatingProps,
3327
- getItemProps,
3328
- getReferenceProps,
3329
- disabled,
3330
- side,
3331
- closeRoot,
3332
- modal
3333
- },
3334
- children
3335
- }
3336
- );
3337
- });
3338
- MenuSub.displayName = "SubMenu";
3339
- const TRIGGER_SELECT_KEYS = ["Enter", " "];
3340
- const MenuItem = memo((props) => {
3341
- const rootMenuContext = useMenuContext();
3342
- const { getItemProps, activeIndex, setOpen, size: size2, variant, radius } = useMenuContentContext();
3343
- const { closeRoot } = useSubContext();
3344
- const {
3345
- ref: forwardedRef,
3346
- className,
3347
- children,
3348
- onSelect,
3349
- onClick,
3350
- onKeyDown,
3351
- closeOnSelect = true,
3352
- disabled = false,
3353
- ...rest
3354
- } = props;
3355
- const { ref, index } = useListItem();
3356
- const mergeRefs2 = useMergeRefs([ref, forwardedRef]);
3357
- const handleClick = useCallback(
3358
- (e) => {
3359
- e.stopPropagation();
3360
- if (disabled) return;
3361
- onClick == null ? void 0 : onClick(e);
3362
- onSelect == null ? void 0 : onSelect();
3363
- if (closeOnSelect) setOpen(false);
3364
- if (closeRoot) rootMenuContext.setOpen(false);
3365
- },
3366
- [closeOnSelect, closeRoot, disabled, rootMenuContext, onClick, onSelect, setOpen]
3367
- );
3368
- const handleKeyDown = useCallback(
3369
- (e) => {
3370
- if (disabled) return;
3371
- onKeyDown == null ? void 0 : onKeyDown(e);
3372
- if (TRIGGER_SELECT_KEYS.includes(e.key)) {
3373
- onSelect == null ? void 0 : onSelect();
3374
- if (closeOnSelect) setOpen(false);
3375
- }
3376
- },
3377
- [closeOnSelect, disabled, onKeyDown, onSelect, setOpen]
3378
- );
3379
- const isActive = useMemo(() => index === activeIndex, [activeIndex, index]);
3380
- const computedChildren = useMemo(() => {
3381
- return typeof children === "function" ? children({ active: isActive, selected: false }) : children;
3382
- }, [children, isActive]);
3383
- return /* @__PURE__ */ jsx(
3384
- "li",
2997
+ const handleKeyDown = useCallback(
2998
+ (e) => {
2999
+ if (disabled) return;
3000
+ onKeyDown == null ? void 0 : onKeyDown(e);
3001
+ if (TRIGGER_SELECT_KEYS.includes(e.key)) {
3002
+ onSelect == null ? void 0 : onSelect();
3003
+ if (closeOnSelect) setOpen(false);
3004
+ }
3005
+ },
3006
+ [closeOnSelect, disabled, onKeyDown, onSelect, setOpen]
3007
+ );
3008
+ const isActive = useMemo(() => index === activeIndex, [activeIndex, index]);
3009
+ const computedChildren = useMemo(() => {
3010
+ return typeof children === "function" ? children({ active: isActive, selected: false }) : children;
3011
+ }, [children, isActive]);
3012
+ return /* @__PURE__ */ jsx(
3013
+ "li",
3385
3014
  {
3386
3015
  className: cx(menuItem({ size: size2, variant }), radiusCva({ radius, maxLarge: true }), className),
3387
3016
  ref: mergeRefs2,
@@ -3424,7 +3053,7 @@ const MenuCheckboxItemIndicator = memo((props) => {
3424
3053
  MenuCheckboxItemIndicator.displayName = "MenuCheckboxItemIndicator";
3425
3054
  const MenuClickTrigger = memo((props) => {
3426
3055
  const { ref: forwardedRef, children, disabled = false } = props;
3427
- const { getReferenceProps, refs, setTriggerType, open } = useMenuContext();
3056
+ const { getReferenceProps, refs, setTriggerType, open } = use(MenuContext);
3428
3057
  const mergedRefs = useMergeRefs([refs.setReference, forwardedRef]);
3429
3058
  useEffect(() => {
3430
3059
  setTriggerType("click");
@@ -3439,13 +3068,113 @@ const MenuClickTrigger = memo((props) => {
3439
3068
  ...getReferenceProps({ disabled }),
3440
3069
  children
3441
3070
  }
3442
- );
3071
+ );
3072
+ });
3073
+ MenuClickTrigger.displayName = "MenuClickTrigger";
3074
+ const MenuContent = memo((props) => {
3075
+ var _a;
3076
+ const providerContext = useProvider();
3077
+ const {
3078
+ ref: forwardedRef,
3079
+ className,
3080
+ children,
3081
+ size: size2 = "md",
3082
+ variant = "soft",
3083
+ radius = providerContext.radius,
3084
+ accentColor = "base",
3085
+ ...rest
3086
+ } = props;
3087
+ const {
3088
+ refs,
3089
+ getFloatingProps,
3090
+ middlewareData,
3091
+ elementsRef,
3092
+ activeIndex,
3093
+ setActiveIndex,
3094
+ getItemProps,
3095
+ open,
3096
+ setOpen,
3097
+ nodeId,
3098
+ context,
3099
+ floatingStyles,
3100
+ modal,
3101
+ side
3102
+ } = use(MenuContext);
3103
+ const computedFloatingStyles = useMemo(() => {
3104
+ var _a2;
3105
+ return {
3106
+ ...floatingStyles,
3107
+ visibility: ((_a2 = middlewareData.hide) == null ? void 0 : _a2.referenceHidden) ? "hidden" : "visible"
3108
+ };
3109
+ }, [floatingStyles, (_a = middlewareData.hide) == null ? void 0 : _a.referenceHidden]);
3110
+ const handleOverlayPointerDown = useCallback(
3111
+ (e) => {
3112
+ if (modal) stopPropagation(e);
3113
+ },
3114
+ [modal]
3115
+ );
3116
+ return /* @__PURE__ */ jsx(FloatingNode, { id: nodeId, children: open && /* @__PURE__ */ jsx(FloatingPortal, { children: /* @__PURE__ */ jsx(
3117
+ FloatingOverlay,
3118
+ {
3119
+ className: menuOverlay({ modal }),
3120
+ onClick: handleOverlayPointerDown,
3121
+ lockScroll: true,
3122
+ "data-floating-content": "",
3123
+ children: /* @__PURE__ */ jsx(FloatingFocusManager, { context, children: /* @__PURE__ */ jsx(FloatingList, { elementsRef, children: /* @__PURE__ */ jsx(
3124
+ MenuContentContext.Provider,
3125
+ {
3126
+ value: {
3127
+ getItemProps,
3128
+ activeIndex,
3129
+ elementsRef,
3130
+ open,
3131
+ setOpen,
3132
+ refs,
3133
+ setActiveIndex,
3134
+ size: size2,
3135
+ variant,
3136
+ accentColor,
3137
+ radius
3138
+ },
3139
+ children: /* @__PURE__ */ jsx(
3140
+ "div",
3141
+ {
3142
+ className: "border-box w-max outline-none",
3143
+ ref: refs.setFloating,
3144
+ tabIndex: -1,
3145
+ style: computedFloatingStyles,
3146
+ "data-floating-content": "",
3147
+ ...getFloatingProps(),
3148
+ children: /* @__PURE__ */ jsx(
3149
+ "ul",
3150
+ {
3151
+ className: cx(
3152
+ menuContent({ size: size2 }),
3153
+ floating({ side, shadow: "3" }),
3154
+ radiusCva({ radius, maxLarge: true }),
3155
+ "max-h-(--overmap-menu-available-height)",
3156
+ className
3157
+ ),
3158
+ ref: forwardedRef,
3159
+ "data-state": getOpenState(open),
3160
+ "data-side": side,
3161
+ "data-accent-color": accentColor,
3162
+ ...rest,
3163
+ children
3164
+ }
3165
+ )
3166
+ }
3167
+ )
3168
+ }
3169
+ ) }) })
3170
+ }
3171
+ ) }) });
3443
3172
  });
3444
- MenuClickTrigger.displayName = "MenuClickTrigger";
3173
+ MenuContent.displayName = "Menu.Content";
3445
3174
  const MenuContextTrigger = memo((props) => {
3446
3175
  const { ref: forwardedRef, children, disabled = false } = props;
3447
3176
  const ref = useRef(null);
3448
- const { setOpen, refs, setTriggerType, open } = useMenuContext();
3177
+ const { setOpen, refs, setTriggerType, open } = use(MenuContext);
3449
3178
  const mergedRefs = useMergeRefs([forwardedRef, ref]);
3450
3179
  useEffect(() => {
3451
3180
  setTriggerType("context");
@@ -3496,7 +3225,7 @@ const MenuGroup = memo((props) => {
3496
3225
  MenuGroup.displayName = "MenuGroup";
3497
3226
  const MenuInputField = memo((props) => {
3498
3227
  const { ref: forwardedRef, className, onValueChange, onChange, disabled = false, ...rest } = props;
3499
- const { activeIndex, getItemProps } = useMenuContentContext();
3228
+ const { activeIndex, getItemProps } = use(MenuContentContext);
3500
3229
  const { index, ref } = useListItem();
3501
3230
  const mergedRefs = useMergeRefs([ref, forwardedRef]);
3502
3231
  const handleChange = useCallback(
@@ -3529,7 +3258,7 @@ const MenuInputField = memo((props) => {
3529
3258
  MenuInputField.displayName = "MenuInputField";
3530
3259
  const MenuInputRoot = memo((props) => {
3531
3260
  const { ref, className, ...rest } = props;
3532
- const { size: size2 } = useMenuContentContext();
3261
+ const { size: size2 } = use(MenuContentContext);
3533
3262
  return /* @__PURE__ */ jsx("div", { className: cx(inputRoot({ size: size2 }), className), ref, ...rest });
3534
3263
  });
3535
3264
  MenuInputRoot.displayName = "MenuInputRoot";
@@ -3540,7 +3269,7 @@ const MenuInputSlot = memo((props) => {
3540
3269
  MenuInputSlot.displayName = "MenuInputSlot";
3541
3270
  const MenuLabel = memo((props) => {
3542
3271
  const { ref, className, ...rest } = props;
3543
- const { size: size2 } = useMenuContentContext();
3272
+ const { size: size2 } = use(MenuContentContext);
3544
3273
  return /* @__PURE__ */ jsx("div", { ref, className: cx(menuLabelCva({ size: size2 }), className), ...rest });
3545
3274
  });
3546
3275
  MenuLabel.displayName = "MenuLabel";
@@ -3548,29 +3277,6 @@ const MenuMultiSelectGroup = genericMemo(function MenuMultiSelectGroup2(props) {
3548
3277
  const { ref, children, defaultValues, values, onValuesChange, ...rest } = props;
3549
3278
  return /* @__PURE__ */ jsx(MenuGroup, { ref, ...rest, children: /* @__PURE__ */ jsx(MultiSelectProvider, { defaultValues, values, onValuesChange, children }) });
3550
3279
  });
3551
- const SelectedIndicatorContext = createContext(false);
3552
- const useSelectedIndicatorContext = () => useContext(SelectedIndicatorContext);
3553
- const MenuSelectedIndicator = memo((props) => {
3554
- const { ref, children, className, ...rest } = props;
3555
- const isSelected = useSelectedIndicatorContext();
3556
- return /* @__PURE__ */ jsx(
3557
- "span",
3558
- {
3559
- ref,
3560
- className: cx(
3561
- "flex size-max items-center",
3562
- {
3563
- invisible: !isSelected
3564
- },
3565
- className
3566
- ),
3567
- "data-state": getSelectedState(isSelected),
3568
- ...rest,
3569
- children
3570
- }
3571
- );
3572
- });
3573
- MenuSelectedIndicator.displayName = "SelectedIndicator";
3574
3280
  const MenuMultiSelectItem = genericMemo(function(props) {
3575
3281
  const { ref, onSelect, children, closeOnSelect = false, value, ...rest } = props;
3576
3282
  const { selected, selectValue, registerValue } = use(MultiSelectContext);
@@ -3599,7 +3305,12 @@ const MenuMultiSelectItem = genericMemo(function(props) {
3599
3305
  ) });
3600
3306
  });
3601
3307
  const PagesContext = createContext({});
3602
- const usePagesContext = () => useContext(PagesContext);
3308
+ const MenuPageContent = memo((props) => {
3309
+ const { page, children } = props;
3310
+ const { activePage } = use(PagesContext);
3311
+ return activePage === page ? children : null;
3312
+ });
3313
+ MenuPageContent.displayName = "PageContent";
3603
3314
  const MenuPages = memo((props) => {
3604
3315
  const { children, defaultPage, page, onPageChange } = props;
3605
3316
  const [activePage, setActivePage] = useControlledState(defaultPage ?? "", page, onPageChange);
@@ -3607,16 +3318,10 @@ const MenuPages = memo((props) => {
3607
3318
  return /* @__PURE__ */ jsx(PagesContext.Provider, { value: contextValue, children });
3608
3319
  });
3609
3320
  MenuPages.displayName = "MenuPages";
3610
- const MenuPageContent = (props) => {
3611
- const { page, children } = props;
3612
- const { activePage } = usePagesContext();
3613
- return activePage === page ? children : null;
3614
- };
3615
- MenuPageContent.displayName = "PageContent";
3616
3321
  const MenuPageTrigger = memo((props) => {
3617
3322
  const { ref, onSelect, page, ...rest } = props;
3618
- const { refs, setActiveIndex } = useMenuContentContext();
3619
- const { setActivePage } = usePagesContext();
3323
+ const { refs, setActiveIndex } = use(MenuContentContext);
3324
+ const { setActivePage } = use(PagesContext);
3620
3325
  const handleSelect = useCallback(() => {
3621
3326
  var _a;
3622
3327
  onSelect == null ? void 0 : onSelect();
@@ -3627,6 +3332,100 @@ const MenuPageTrigger = memo((props) => {
3627
3332
  return /* @__PURE__ */ jsx(MenuItem, { ref, onSelect: handleSelect, closeOnSelect: false, ...rest });
3628
3333
  });
3629
3334
  MenuPageTrigger.displayName = "MenuPageTrigger";
3335
+ const MENU_OVERFLOW_PADDING = 20;
3336
+ const MENU_CONTENT_PADDING = 8;
3337
+ const MENU_MINIMUM_MAX_HEIGHT = 250;
3338
+ const DEFAULT_OFFSET = 5;
3339
+ const MenuRoot = memo((props) => {
3340
+ const {
3341
+ children,
3342
+ side = "bottom",
3343
+ align = "center",
3344
+ offset: offset$1,
3345
+ loop = false,
3346
+ modal = false,
3347
+ // open state related props
3348
+ open: controlledOpen,
3349
+ onOpenChange,
3350
+ defaultOpen
3351
+ } = props;
3352
+ const [open, setOpen] = useControlledState(defaultOpen ?? false, controlledOpen, onOpenChange);
3353
+ const [activeIndex, setActiveIndex] = useState(null);
3354
+ const [triggerType, setTriggerType] = useState(null);
3355
+ const elementsRef = useRef([]);
3356
+ const nodeId = useFloatingNodeId();
3357
+ const { refs, floatingStyles, context, middlewareData } = useFloating({
3358
+ nodeId,
3359
+ strategy: "fixed",
3360
+ // TODO: probably some way with template string types to not need the "as Placement"
3361
+ placement: side + (align !== "center" ? "-" + align : ""),
3362
+ whileElementsMounted: autoUpdate,
3363
+ open,
3364
+ onOpenChange: setOpen,
3365
+ middleware: [
3366
+ offset({ mainAxis: offset$1 ?? DEFAULT_OFFSET }),
3367
+ size({
3368
+ apply({ availableHeight, elements }) {
3369
+ elements.floating.style.setProperty(
3370
+ "--overmap-menu-available-height",
3371
+ `${Math.max(availableHeight, MENU_MINIMUM_MAX_HEIGHT)}px`
3372
+ );
3373
+ },
3374
+ padding: MENU_OVERFLOW_PADDING
3375
+ }),
3376
+ flip({ fallbackStrategy: "initialPlacement" }),
3377
+ shift({ padding: MENU_OVERFLOW_PADDING }),
3378
+ hide()
3379
+ ]
3380
+ });
3381
+ const role = useRole(context, {
3382
+ role: "menu"
3383
+ });
3384
+ const dismiss = useDismiss(context, {
3385
+ capture: true,
3386
+ ancestorScroll: triggerType === "context" || triggerType === "virtual"
3387
+ });
3388
+ const click = useClick(context, {
3389
+ enabled: triggerType === "click"
3390
+ });
3391
+ const listNavigation = useListNavigation(context, {
3392
+ listRef: elementsRef,
3393
+ activeIndex,
3394
+ onNavigate: setActiveIndex,
3395
+ loop
3396
+ });
3397
+ const { getFloatingProps, getItemProps, getReferenceProps } = useInteractions([
3398
+ dismiss,
3399
+ listNavigation,
3400
+ click,
3401
+ role
3402
+ ]);
3403
+ return /* @__PURE__ */ jsx(FloatingTree, { children: /* @__PURE__ */ jsx(
3404
+ MenuContext.Provider,
3405
+ {
3406
+ value: {
3407
+ open,
3408
+ setOpen,
3409
+ refs,
3410
+ context,
3411
+ floatingStyles,
3412
+ elementsRef,
3413
+ getFloatingProps,
3414
+ getItemProps,
3415
+ getReferenceProps,
3416
+ nodeId,
3417
+ activeIndex,
3418
+ setActiveIndex,
3419
+ middlewareData,
3420
+ side,
3421
+ modal,
3422
+ setTriggerType
3423
+ },
3424
+ children
3425
+ }
3426
+ ) });
3427
+ });
3428
+ MenuRoot.displayName = "Root";
3630
3429
  const MenuScroll = memo((props) => {
3631
3430
  const { ref, className, ...rest } = props;
3632
3431
  return /* @__PURE__ */ jsx(
@@ -3665,6 +3464,11 @@ const MenuSelectAllItem = genericMemo((props) => {
3665
3464
  }
3666
3465
  ) });
3667
3466
  });
3467
+ const MenuSelectedIndicator = memo((props) => {
3468
+ const { ref, children, ...rest } = props;
3469
+ return /* @__PURE__ */ jsx(SelectedIndicator, { ref, ...rest, children });
3470
+ });
3471
+ MenuSelectedIndicator.displayName = "MenuSelectedIndicator";
3668
3472
  const MenuSelectGroup = genericMemo(function MenuSelectGroup2(props) {
3669
3473
  const { ref, children, required, defaultValue, value, onValueChange, ...rest } = props;
3670
3474
  return /* @__PURE__ */ jsx(MenuGroup, { ref, ...rest, children: required ? /* @__PURE__ */ jsx(SingleSelectRequiredProvider, { defaultValue, value, onValueChange, children }) : /* @__PURE__ */ jsx(
@@ -3680,7 +3484,7 @@ const MenuSelectGroup = genericMemo(function MenuSelectGroup2(props) {
3680
3484
  const MenuSelectItem = genericMemo(function(props) {
3681
3485
  const { ref, value, onSelect, children, closeOnSelect = true, ...rest } = props;
3682
3486
  const { selected, selectValue } = use(SelectContext);
3683
- const isSelected = useMemo(() => selected(value), [selected, value]);
3487
+ const isSelected = selected(value);
3684
3488
  const handleSelect = useCallback(() => {
3685
3489
  onSelect == null ? void 0 : onSelect();
3686
3490
  selectValue(value);
@@ -3691,27 +3495,144 @@ const MenuSelectItem = genericMemo(function(props) {
3691
3495
  return /* @__PURE__ */ jsx(SelectedIndicatorContext.Provider, { value: isSelected, children: /* @__PURE__ */ jsx(
3692
3496
  MenuItem,
3693
3497
  {
3694
- ref,
3695
- role: "menuitemcheckbox",
3696
- onSelect: handleSelect,
3697
- closeOnSelect,
3698
- "data-state": getSelectedState(isSelected),
3699
- ...rest,
3700
- children: computedChildren
3498
+ ref,
3499
+ role: "menuitemcheckbox",
3500
+ onSelect: handleSelect,
3501
+ closeOnSelect,
3502
+ "data-state": getSelectedState(isSelected),
3503
+ ...rest,
3504
+ children: computedChildren
3505
+ }
3506
+ ) });
3507
+ });
3508
+ const MenuSeparator = memo((props) => {
3509
+ const { ref, className, ...rest } = props;
3510
+ const { size: size2 } = use(MenuContentContext);
3511
+ return /* @__PURE__ */ jsx(RadixSeparator.Root, { className: cx(menuSeparator({ size: size2 }), className), ref, ...rest });
3512
+ });
3513
+ MenuSeparator.displayName = "MenuSeparator";
3514
+ const computeOffsets = (side, alignment) => {
3515
+ switch (side) {
3516
+ case "right":
3517
+ if (alignment === "start") {
3518
+ return { mainAxis: MENU_CONTENT_PADDING + 1, crossAxis: -MENU_CONTENT_PADDING };
3519
+ } else if (alignment === "end") {
3520
+ return { mainAxis: MENU_CONTENT_PADDING + 1, crossAxis: MENU_CONTENT_PADDING };
3521
+ }
3522
+ break;
3523
+ case "left":
3524
+ if (alignment === "start") {
3525
+ return { mainAxis: MENU_CONTENT_PADDING + 1, crossAxis: -MENU_CONTENT_PADDING };
3526
+ } else if (alignment === "end") {
3527
+ return { mainAxis: MENU_CONTENT_PADDING + 1, crossAxis: MENU_CONTENT_PADDING };
3528
+ }
3529
+ break;
3530
+ }
3531
+ return { mainAxis: MENU_CONTENT_PADDING + 1, crossAxis: 0 };
3532
+ };
3533
+ const MenuSub = memo((props) => {
3534
+ const {
3535
+ children,
3536
+ disabled = false,
3537
+ side = "right",
3538
+ align = "start",
3539
+ closeRoot = false,
3540
+ loop = false,
3541
+ modal = false,
3542
+ // open state related props
3543
+ open: controlledOpen,
3544
+ onOpenChange,
3545
+ defaultOpen
3546
+ } = props;
3547
+ const [open, setOpen] = useControlledState(defaultOpen ?? false, controlledOpen, onOpenChange);
3548
+ const nodeId = useFloatingNodeId();
3549
+ const { refs, floatingStyles, context } = useFloating({
3550
+ nodeId,
3551
+ strategy: "fixed",
3552
+ whileElementsMounted: autoUpdate,
3553
+ open,
3554
+ onOpenChange: (open2, _event, reason) => {
3555
+ if (reason) setOpen(open2);
3556
+ },
3557
+ placement: side + (align !== "center" ? "-" + align : ""),
3558
+ middleware: [
3559
+ offset({ ...computeOffsets(side, align) }),
3560
+ size({
3561
+ padding: MENU_OVERFLOW_PADDING,
3562
+ apply({ availableHeight, elements }) {
3563
+ elements.floating.style.setProperty(
3564
+ "--overmap-menu-available-height",
3565
+ `${Math.max(availableHeight, MENU_MINIMUM_MAX_HEIGHT)}px`
3566
+ );
3567
+ }
3568
+ }),
3569
+ flip(),
3570
+ shift({ padding: MENU_OVERFLOW_PADDING }),
3571
+ hide()
3572
+ ]
3573
+ });
3574
+ const dismiss = useDismiss(context, {
3575
+ bubbles: closeRoot,
3576
+ outsidePress: closeRoot
3577
+ });
3578
+ const hover = useHover(context, {
3579
+ restMs: 50,
3580
+ handleClose: safePolygon({
3581
+ blockPointerEvents: true,
3582
+ requireIntent: false
3583
+ }),
3584
+ enabled: !disabled
3585
+ });
3586
+ const click = useClick(context, {
3587
+ enabled: !disabled
3588
+ });
3589
+ const elementsRef = useRef([]);
3590
+ const [activeIndex, setActiveIndex] = useState(null);
3591
+ const listNavigation = useListNavigation(context, {
3592
+ listRef: elementsRef,
3593
+ nested: true,
3594
+ activeIndex,
3595
+ onNavigate: setActiveIndex,
3596
+ loop,
3597
+ rtl: side === "left"
3598
+ });
3599
+ const { getFloatingProps, getItemProps, getReferenceProps } = useInteractions([
3600
+ listNavigation,
3601
+ dismiss,
3602
+ hover,
3603
+ click
3604
+ ]);
3605
+ return /* @__PURE__ */ jsx(
3606
+ SubContext.Provider,
3607
+ {
3608
+ value: {
3609
+ open,
3610
+ setOpen,
3611
+ nodeId,
3612
+ refs,
3613
+ floatingStyles,
3614
+ context,
3615
+ elementsRef,
3616
+ activeIndex,
3617
+ setActiveIndex,
3618
+ getFloatingProps,
3619
+ getItemProps,
3620
+ getReferenceProps,
3621
+ disabled,
3622
+ side,
3623
+ closeRoot,
3624
+ modal
3625
+ },
3626
+ children
3701
3627
  }
3702
- ) });
3703
- });
3704
- const MenuSeparator = memo((props) => {
3705
- const { ref, className, ...rest } = props;
3706
- const { size: size2 } = useMenuContentContext();
3707
- return /* @__PURE__ */ jsx(RadixSeparator.Root, { className: cx(menuSeparator({ size: size2 }), className), ref, ...rest });
3628
+ );
3708
3629
  });
3709
- MenuSeparator.displayName = "MenuSeparator";
3630
+ MenuSub.displayName = "SubMenu";
3710
3631
  const MenuSubContent = memo((props) => {
3711
3632
  var _a;
3712
3633
  const { ref: forwardedRef, children, ...rest } = props;
3713
- const { middlewareData } = useMenuContext();
3714
- const { accentColor, radius, variant, size: size2 } = useMenuContentContext();
3634
+ const { middlewareData } = use(MenuContext);
3635
+ const { accentColor, radius, variant, size: size2 } = use(MenuContentContext);
3715
3636
  const {
3716
3637
  open,
3717
3638
  nodeId,
@@ -3725,7 +3646,7 @@ const MenuSubContent = memo((props) => {
3725
3646
  floatingStyles,
3726
3647
  setOpen,
3727
3648
  side
3728
- } = useSubContext();
3649
+ } = use(SubContext);
3729
3650
  const wrapperRef = useRef(null);
3730
3651
  const mergeRefs2 = useMergeRefs([refs.setFloating, wrapperRef]);
3731
3652
  const computedFloatingStyles = useMemo(() => {
@@ -3777,83 +3698,634 @@ const MenuSubContent = memo((props) => {
3777
3698
  }
3778
3699
  )
3779
3700
  }
3780
- )
3701
+ )
3702
+ }
3703
+ ) }) }) }) });
3704
+ });
3705
+ MenuSubContent.displayName = "MenuSubContent";
3706
+ const MenuSubTrigger = memo((props) => {
3707
+ const { ref: forwardedRef, children, ...rest } = props;
3708
+ const { refs, getReferenceProps, open, disabled } = use(SubContext);
3709
+ const mergedRefs = useMergeRefs([forwardedRef, refs.setReference]);
3710
+ return /* @__PURE__ */ jsx(
3711
+ MenuItem,
3712
+ {
3713
+ ref: mergedRefs,
3714
+ closeOnSelect: false,
3715
+ "aria-haspopup": "menu",
3716
+ "data-state": getOpenState(open),
3717
+ disabled,
3718
+ ...getReferenceProps(rest),
3719
+ children
3720
+ }
3721
+ );
3722
+ });
3723
+ MenuSubTrigger.displayName = "MenuSubTrigger";
3724
+ const MenuVirtualTrigger = memo((props) => {
3725
+ const { virtualElement, disabled } = props;
3726
+ const { refs, setTriggerType, setOpen } = use(MenuContext);
3727
+ useEffect(() => {
3728
+ setTriggerType("virtual");
3729
+ }, [setTriggerType]);
3730
+ useEffect(() => {
3731
+ if (!disabled && virtualElement) {
3732
+ refs.setPositionReference(virtualElement);
3733
+ setOpen(true);
3734
+ } else {
3735
+ refs.setPositionReference(null);
3736
+ setOpen(false);
3737
+ }
3738
+ }, [disabled, refs, setOpen, virtualElement]);
3739
+ return null;
3740
+ });
3741
+ MenuVirtualTrigger.displayName = "VirtualTrigger";
3742
+ const Menu = {
3743
+ Root: MenuRoot,
3744
+ Content: MenuContent,
3745
+ // sub
3746
+ Sub: MenuSub,
3747
+ SubContent: MenuSubContent,
3748
+ SubTrigger: MenuSubTrigger,
3749
+ // pages
3750
+ Pages: MenuPages,
3751
+ PageContent: MenuPageContent,
3752
+ PageTrigger: MenuPageTrigger,
3753
+ // triggers
3754
+ ClickTrigger: MenuClickTrigger,
3755
+ ContextTrigger: MenuContextTrigger,
3756
+ VirtualTrigger: MenuVirtualTrigger,
3757
+ // groups
3758
+ Group: MenuGroup,
3759
+ SelectGroup: MenuSelectGroup,
3760
+ MultiSelectGroup: MenuMultiSelectGroup,
3761
+ // items
3762
+ Item: MenuItem,
3763
+ SelectItem: MenuSelectItem,
3764
+ MultiSelectItem: MenuMultiSelectItem,
3765
+ SelectAllItem: MenuSelectAllItem,
3766
+ CheckboxItem: MenuCheckboxItem,
3767
+ // indicators
3768
+ SelectedIndicator: MenuSelectedIndicator,
3769
+ CheckboxItemIndicator: MenuCheckboxItemIndicator,
3770
+ // input
3771
+ InputRoot: MenuInputRoot,
3772
+ InputField: MenuInputField,
3773
+ InputSlot: MenuInputSlot,
3774
+ // others
3775
+ Label: MenuLabel,
3776
+ Separator: MenuSeparator,
3777
+ Scroll: MenuScroll
3778
+ };
3779
+ const KEY_MAPPING = {
3780
+ next: "ArrowDown",
3781
+ prev: "ArrowUp",
3782
+ first: "PageUp",
3783
+ last: "PageDown",
3784
+ selectItem: "Enter"
3785
+ };
3786
+ const ITEM_SELECTOR = "menu-item";
3787
+ const GROUP_SELECTOR = "menu-group";
3788
+ const MenuRootContext = createContext({});
3789
+ const MenuGroupContext = createContext({});
3790
+ const MenuPageContext = createContext({});
3791
+ const menuRootCva = cva(["w-full", "outline-none"], {
3792
+ variants: {
3793
+ size: {
3794
+ xs: ["p-0.5", "text-xs", "min-w-30"],
3795
+ sm: ["p-0.75", "text-sm", "min-w-35"],
3796
+ md: ["p-1", "text-md", "min-w-40"],
3797
+ lg: ["p-1.25", "text-lg", "min-w-45"],
3798
+ xl: ["p-1.5", "text-xl", "min-w-50"]
3799
+ },
3800
+ radius: {
3801
+ none: ["rounded-none"],
3802
+ xs: ["rounded-xs"],
3803
+ sm: ["rounded-sm"],
3804
+ md: ["rounded-md"],
3805
+ lg: ["rounded-lg"],
3806
+ xl: ["rounded-lg"],
3807
+ full: ["rounded-lg"]
3808
+ }
3809
+ }
3810
+ });
3811
+ const menuItemCva = cva(
3812
+ [
3813
+ "select-none",
3814
+ "relative",
3815
+ "flex",
3816
+ "items-center",
3817
+ "outline-none",
3818
+ "data-[disabled=true]:text-(--base-a8)",
3819
+ "data-[disabled=true]:pointer-events-none",
3820
+ "shrink-0",
3821
+ "py-1",
3822
+ "text-(--base-12)"
3823
+ ],
3824
+ {
3825
+ variants: {
3826
+ size: {
3827
+ xs: ["gap-1.5", "px-3"],
3828
+ sm: ["gap-1.75", "px-3.5"],
3829
+ md: ["gap-2", "px-4"],
3830
+ lg: ["gap-2.25", "px-4.5"],
3831
+ xl: ["gap-2.5", "px-5"]
3832
+ },
3833
+ variant: {
3834
+ solid: [
3835
+ "data-[active=true]:not-[data-[disabled=true]]:text-(--accent-contrast)",
3836
+ "data-[active=true]:not-[data-[disabled=true]]:bg-(--accent-a9)",
3837
+ "data-[active=true]:not-[data-[disabled=true]]:active:brightness-110"
3838
+ ],
3839
+ soft: [
3840
+ "data-[active=true]:not-[data-[disabled=true]]:bg-(--accent-a3)",
3841
+ "data-[active=true]:not-[data-[disabled=true]]:active:bg-(--accent-a4)"
3842
+ ]
3843
+ }
3844
+ }
3845
+ }
3846
+ );
3847
+ const menuGroupLabelCva = cva(["text-(--base-a11)", "flex", "items-center", "select-none", "py-1"], {
3848
+ variants: {
3849
+ size: {
3850
+ xs: ["gap-1.5", "px-3", "text-xs"],
3851
+ sm: ["gap-1.75", "px-3.5", "text-xs"],
3852
+ md: ["gap-2", "px-4", "text-sm"],
3853
+ lg: ["gap-2.25", "px-4.5", "text-base"],
3854
+ xl: ["gap-2.5", "px-5", "text-lg"]
3855
+ }
3856
+ }
3857
+ });
3858
+ const menuSeparatorCva = cva(["h-px", "bg-(--base-a6)", "w-auto", "shrink-0"], {
3859
+ variants: {
3860
+ size: {
3861
+ xs: ["-mx-0.5", "my-0.5"],
3862
+ sm: ["-mx-0.75", "my-0.75"],
3863
+ md: ["-mx-1", "my-1"],
3864
+ lg: ["-mx-1.25", "my-1.25"],
3865
+ xl: ["-mx-1.5", "my-1.5"]
3866
+ }
3867
+ }
3868
+ });
3869
+ const MenuV2Item = memo((props) => {
3870
+ const {
3871
+ ref,
3872
+ children,
3873
+ className,
3874
+ disabled = false,
3875
+ onClick,
3876
+ onSelect,
3877
+ onPointerEnter,
3878
+ onPointerLeave,
3879
+ onPointerMove,
3880
+ ...rest
3881
+ } = props;
3882
+ const internalRef = useRef(null);
3883
+ const itemId = useId();
3884
+ const { activeItemId, setActiveItemId, size: size2, variant, radius } = use(MenuRootContext);
3885
+ const isActive = itemId === activeItemId;
3886
+ const handleSelect = useCallback(
3887
+ (e) => {
3888
+ onSelect == null ? void 0 : onSelect(e);
3889
+ },
3890
+ [onSelect]
3891
+ );
3892
+ const handleClick = useCallback(
3893
+ (e) => {
3894
+ onClick == null ? void 0 : onClick(e);
3895
+ handleSelect(new Event("menu-select"));
3896
+ },
3897
+ [handleSelect, onClick]
3898
+ );
3899
+ const handlePointerEnter = useCallback(
3900
+ (e) => {
3901
+ onPointerEnter == null ? void 0 : onPointerEnter(e);
3902
+ if (e.defaultPrevented) return;
3903
+ setActiveItemId(itemId);
3904
+ },
3905
+ [onPointerEnter, setActiveItemId, itemId]
3906
+ );
3907
+ const handlePointerLeave = useCallback(
3908
+ (e) => {
3909
+ onPointerLeave == null ? void 0 : onPointerLeave(e);
3910
+ if (e.defaultPrevented) return;
3911
+ setActiveItemId(null);
3912
+ },
3913
+ [onPointerLeave, setActiveItemId]
3914
+ );
3915
+ const handlePointerMove = useCallback(
3916
+ (e) => {
3917
+ onPointerMove == null ? void 0 : onPointerMove(e);
3918
+ if (e.defaultPrevented) return;
3919
+ setActiveItemId(itemId);
3920
+ },
3921
+ [onPointerMove, itemId, setActiveItemId]
3922
+ );
3923
+ useEffect(() => {
3924
+ if (!internalRef.current) return;
3925
+ const element = internalRef.current;
3926
+ element.addEventListener("menu-select", handleSelect);
3927
+ return () => {
3928
+ element.removeEventListener("menu-select", handleSelect);
3929
+ };
3930
+ }, [handleSelect]);
3931
+ return /* @__PURE__ */ jsx(
3932
+ "div",
3933
+ {
3934
+ ref: mergeRefs([ref, internalRef]),
3935
+ className: cx(menuItemCva({ size: size2, variant }), radiusCva({ radius, maxLarge: true }), className),
3936
+ role: "menuitem",
3937
+ onClick: handleClick,
3938
+ onPointerEnter: handlePointerEnter,
3939
+ onPointerLeave: handlePointerLeave,
3940
+ onPointerMove: handlePointerMove,
3941
+ ...{ [ITEM_SELECTOR]: itemId },
3942
+ "data-active": getBooleanState(isActive),
3943
+ "data-disabled": getBooleanState(disabled),
3944
+ "aria-disabled": getBooleanState(disabled),
3945
+ ...rest,
3946
+ children
3947
+ }
3948
+ );
3949
+ });
3950
+ MenuV2Item.displayName = "MenuItem";
3951
+ const MenuV2CheckboxItem = memo((props) => {
3952
+ const { ref, checked, onCheckedChange, onSelect, ...rest } = props;
3953
+ const handleSelect = useCallback(
3954
+ (e) => {
3955
+ onSelect == null ? void 0 : onSelect(e);
3956
+ if (e.defaultPrevented) return;
3957
+ switch (checked) {
3958
+ case true:
3959
+ onCheckedChange(false);
3960
+ break;
3961
+ case "indeterminate":
3962
+ onCheckedChange(true);
3963
+ break;
3964
+ case false:
3965
+ onCheckedChange(true);
3966
+ break;
3967
+ }
3968
+ },
3969
+ [checked, onCheckedChange, onSelect]
3970
+ );
3971
+ return /* @__PURE__ */ jsx(CheckedIndicatorContext.Provider, { value: checked, children: /* @__PURE__ */ jsx(MenuV2Item, { ref, onSelect: handleSelect, ...rest }) });
3972
+ });
3973
+ MenuV2CheckboxItem.displayName = "MenuCheckboxItem";
3974
+ const MenuV2CheckedIndicator = memo((props) => {
3975
+ const { ref, children, ...rest } = props;
3976
+ return /* @__PURE__ */ jsx(CheckedIndicator, { ref, ...rest, children });
3977
+ });
3978
+ MenuV2CheckedIndicator.displayName = "MenuCheckboxItemIndicator";
3979
+ const MenuV2Group = memo((props) => {
3980
+ const { ref, children, ...rest } = props;
3981
+ const groupId = useId();
3982
+ const [labelId, setLabelId] = useState(null);
3983
+ const contextValue = useMemo(
3984
+ () => ({
3985
+ labelId,
3986
+ setLabelId
3987
+ }),
3988
+ [labelId]
3989
+ );
3990
+ return /* @__PURE__ */ jsx("div", { ref, role: "group", ...{ [GROUP_SELECTOR]: groupId }, "aria-labelledby": labelId ?? void 0, ...rest, children: /* @__PURE__ */ jsx(MenuGroupContext, { value: contextValue, children }) });
3991
+ });
3992
+ MenuV2Group.displayName = "MenuGroup";
3993
+ const MenuV2GroupLabel = memo((props) => {
3994
+ const { ref, children, id, className, ...rest } = props;
3995
+ const labelId = useFallbackId(id);
3996
+ const { size: size2 } = use(MenuRootContext);
3997
+ const { setLabelId } = use(MenuGroupContext);
3998
+ useEffect(() => {
3999
+ setLabelId(labelId);
4000
+ }, [labelId, setLabelId]);
4001
+ return /* @__PURE__ */ jsx("div", { ref, id: labelId, className: cx(menuGroupLabelCva({ size: size2 }), className), ...rest, children });
4002
+ });
4003
+ MenuV2GroupLabel.displayName = "MenuGroupLabel";
4004
+ const MenuV2SelectAllItem = genericMemo((props) => {
4005
+ const { ref, children, onSelect, ...rest } = props;
4006
+ const { allSelected, someSelected, toggleSelectAll } = use(MultiSelectContext);
4007
+ const selectedState = allSelected ? true : someSelected ? "indeterminate" : false;
4008
+ const handleSelect = useCallback(
4009
+ (e) => {
4010
+ onSelect == null ? void 0 : onSelect(e);
4011
+ if (e.defaultPrevented) return;
4012
+ toggleSelectAll();
4013
+ },
4014
+ [onSelect, toggleSelectAll]
4015
+ );
4016
+ return /* @__PURE__ */ jsx(MenuV2Item, { onSelect: handleSelect, ref, "data-state": getCheckedState(selectedState), ...rest, children: /* @__PURE__ */ jsx(CheckedIndicatorContext, { value: selectedState, children }) });
4017
+ });
4018
+ const MenuV2MultiSelectGroup = genericMemo(function MenuMultiSelectGroup3(props) {
4019
+ const { ref, children, defaultValues, values, onValuesChange, ...rest } = props;
4020
+ return /* @__PURE__ */ jsx(MenuV2Group, { ref, ...rest, children: /* @__PURE__ */ jsx(MultiSelectProvider, { defaultValues, values, onValuesChange, children }) });
4021
+ });
4022
+ const MenuV2MultiSelectItem = genericMemo(function(props) {
4023
+ const { ref, onSelect, children, value, ...rest } = props;
4024
+ const { selected, selectValue, registerValue } = use(MultiSelectContext);
4025
+ useLayoutEffect(() => {
4026
+ return registerValue(value);
4027
+ }, [registerValue, value]);
4028
+ const isSelected = selected(value);
4029
+ const handleSelect = useCallback(
4030
+ (e) => {
4031
+ onSelect == null ? void 0 : onSelect(e);
4032
+ if (e.defaultPrevented) return;
4033
+ selectValue(value);
4034
+ },
4035
+ [onSelect, selectValue, value]
4036
+ );
4037
+ return /* @__PURE__ */ jsx(
4038
+ MenuV2Item,
4039
+ {
4040
+ ref,
4041
+ role: "menuitemcheckbox",
4042
+ onSelect: handleSelect,
4043
+ "data-state": getSelectedState(isSelected),
4044
+ ...rest,
4045
+ children: /* @__PURE__ */ jsx(SelectedIndicatorContext, { value: isSelected, children })
4046
+ }
4047
+ );
4048
+ });
4049
+ const MenuV2Page = memo((props) => {
4050
+ const { children, ref, page, ...rest } = props;
4051
+ const { page: activePage } = use(MenuPageContext);
4052
+ const isActive = page === activePage;
4053
+ return /* @__PURE__ */ jsx("div", { ref, "data-active": getActiveState(isActive), hidden: !isActive, ...rest, children: isActive ? children : null });
4054
+ });
4055
+ MenuV2Page.displayName = "MenuPage";
4056
+ const MenuV2Pages = memo((props) => {
4057
+ const { children, defaultPage = "", page: controlledPage, onPageChange } = props;
4058
+ const [page, setPage] = useControlledState(defaultPage, controlledPage, onPageChange);
4059
+ const contextValue = useMemo(
4060
+ () => ({
4061
+ page,
4062
+ setPage
4063
+ }),
4064
+ [page, setPage]
4065
+ );
4066
+ return /* @__PURE__ */ jsx(MenuPageContext, { value: contextValue, children });
4067
+ });
4068
+ MenuV2Pages.displayName = "MenuPages";
4069
+ const MenuV2PageTriggerItem = memo((props) => {
4070
+ const { ref, children, page, onSelect, ...rest } = props;
4071
+ const { page: activePage, setPage } = use(MenuPageContext);
4072
+ const isActive = page === activePage;
4073
+ const handleSelect = useCallback(
4074
+ (e) => {
4075
+ onSelect == null ? void 0 : onSelect(e);
4076
+ if (e.defaultPrevented) return;
4077
+ setPage(page);
4078
+ },
4079
+ [onSelect, page, setPage]
4080
+ );
4081
+ return /* @__PURE__ */ jsx(MenuV2Item, { ref, onSelect: handleSelect, "data-state": getActiveState(isActive), ...rest, children: /* @__PURE__ */ jsx(SelectedIndicatorContext, { value: isActive, children }) });
4082
+ });
4083
+ MenuV2PageTriggerItem.displayName = "CommandMenuPageTriggerItem";
4084
+ const computeNextIndex = (index, length, direction, loop) => {
4085
+ switch (direction) {
4086
+ case "next":
4087
+ return index === length - 1 ? loop ? 0 : index : index + 1;
4088
+ case "prev":
4089
+ return index === 0 ? loop ? length - 1 : index : index - 1;
4090
+ }
4091
+ };
4092
+ const MenuV2Root = memo((props) => {
4093
+ const providerContext = useProvider();
4094
+ const {
4095
+ ref,
4096
+ children,
4097
+ className,
4098
+ onKeyDown,
4099
+ loop = false,
4100
+ // style props
4101
+ radius = providerContext.radius,
4102
+ accentColor = "base",
4103
+ size: size2 = "md",
4104
+ variant = "soft",
4105
+ ...rest
4106
+ } = props;
4107
+ const internalRef = useRef(null);
4108
+ const [activeItemId, setActiveItemId] = useState(null);
4109
+ const getItems = useCallback((element) => {
4110
+ return Array.from(element.querySelectorAll(`[${ITEM_SELECTOR}]:not([data-disabled=true]`));
4111
+ }, []);
4112
+ const getFirstItem = useCallback(
4113
+ (element) => {
4114
+ return getItems(element).at(0);
4115
+ },
4116
+ [getItems]
4117
+ );
4118
+ const getLastItem = useCallback(
4119
+ (element) => {
4120
+ return getItems(element).at(-1);
4121
+ },
4122
+ [getItems]
4123
+ );
4124
+ const getActiveItem = useCallback(
4125
+ (element) => {
4126
+ return getItems(element).find((itemEle) => itemEle.getAttribute(ITEM_SELECTOR) === activeItemId);
4127
+ },
4128
+ [activeItemId, getItems]
4129
+ );
4130
+ const getNextItem = useCallback(
4131
+ (element, direction) => {
4132
+ const items = getItems(element);
4133
+ const activeItem = getActiveItem(element);
4134
+ const activeItemIndex = items.findIndex((itemEle) => itemEle === activeItem);
4135
+ const nextItemIndex = computeNextIndex(activeItemIndex, items.length, direction, loop);
4136
+ return items[nextItemIndex];
4137
+ },
4138
+ [getActiveItem, getItems, loop]
4139
+ );
4140
+ const getGroups = useCallback(() => {
4141
+ if (!internalRef.current) return [];
4142
+ return Array.from(internalRef.current.querySelectorAll(`[${GROUP_SELECTOR}]`));
4143
+ }, []);
4144
+ const getActiveGroup = useCallback(() => {
4145
+ var _a;
4146
+ return ((_a = getActiveItem(internalRef.current)) == null ? void 0 : _a.closest(`[${GROUP_SELECTOR}]`)) ?? void 0;
4147
+ }, [getActiveItem]);
4148
+ const getNextGroup = useCallback(
4149
+ (direction) => {
4150
+ const groups = getGroups();
4151
+ const activeGroup = getActiveGroup();
4152
+ const activeGroupIndex = groups.findIndex((groupEle) => groupEle === activeGroup);
4153
+ const nextGroupIndex = computeNextIndex(activeGroupIndex, groups.length, direction, loop);
4154
+ return groups[nextGroupIndex];
4155
+ },
4156
+ [getActiveGroup, getGroups, loop]
4157
+ );
4158
+ const getFirstGroup = useCallback(() => {
4159
+ return getGroups().at(0);
4160
+ }, [getGroups]);
4161
+ const getLastGroup = useCallback(() => {
4162
+ return getGroups().at(-1);
4163
+ }, [getGroups]);
4164
+ const handleKeyDown = useCallback(
4165
+ (e) => {
4166
+ onKeyDown == null ? void 0 : onKeyDown(e);
4167
+ if (e.defaultPrevented) return;
4168
+ switch (e.code) {
4169
+ case KEY_MAPPING.selectItem: {
4170
+ const activeItem = getActiveItem(internalRef.current);
4171
+ if (activeItem) activeItem.dispatchEvent(new Event("menu-select"));
4172
+ break;
4173
+ }
4174
+ case KEY_MAPPING.next: {
4175
+ let nextItem;
4176
+ if (e.shiftKey) {
4177
+ const nextGroup = getNextGroup("next");
4178
+ if (!nextGroup) return;
4179
+ nextItem = getFirstItem(nextGroup);
4180
+ } else {
4181
+ nextItem = getNextItem(internalRef.current, "next");
4182
+ }
4183
+ if (!nextItem) return;
4184
+ setActiveItemId(nextItem.getAttribute(ITEM_SELECTOR));
4185
+ break;
4186
+ }
4187
+ case KEY_MAPPING.prev: {
4188
+ let prevItem;
4189
+ if (e.shiftKey) {
4190
+ const prevGroup = getNextGroup("prev");
4191
+ if (!prevGroup) return;
4192
+ prevItem = getFirstItem(prevGroup);
4193
+ } else {
4194
+ prevItem = getNextItem(internalRef.current, "prev");
4195
+ }
4196
+ if (!prevItem) return;
4197
+ setActiveItemId(prevItem.getAttribute(ITEM_SELECTOR));
4198
+ break;
4199
+ }
4200
+ case KEY_MAPPING.first: {
4201
+ let firstItem;
4202
+ if (e.shiftKey) {
4203
+ const firstGroup = getFirstGroup();
4204
+ if (!firstGroup) return;
4205
+ firstItem = getFirstItem(firstGroup);
4206
+ } else {
4207
+ firstItem = getFirstItem(internalRef.current);
4208
+ }
4209
+ if (!firstItem) return;
4210
+ setActiveItemId(firstItem.getAttribute(ITEM_SELECTOR));
4211
+ break;
4212
+ }
4213
+ case KEY_MAPPING.last: {
4214
+ let lastItem;
4215
+ if (e.shiftKey) {
4216
+ const lastGroup = getLastGroup();
4217
+ if (!lastGroup) return;
4218
+ lastItem = getFirstItem(lastGroup);
4219
+ } else {
4220
+ lastItem = getLastItem(internalRef.current);
4221
+ }
4222
+ if (!lastItem) return;
4223
+ setActiveItemId(lastItem.getAttribute(ITEM_SELECTOR));
4224
+ break;
4225
+ }
4226
+ }
4227
+ },
4228
+ [getActiveItem, getFirstGroup, getFirstItem, getLastGroup, getLastItem, getNextGroup, getNextItem, onKeyDown]
4229
+ );
4230
+ useEffect(() => {
4231
+ var _a;
4232
+ const firstItem = getFirstItem(internalRef.current);
4233
+ if (!firstItem) return;
4234
+ (_a = internalRef.current) == null ? void 0 : _a.focus();
4235
+ setActiveItemId(firstItem.getAttribute(ITEM_SELECTOR));
4236
+ }, [getFirstItem]);
4237
+ const contextValue = useMemo(
4238
+ () => ({
4239
+ activeItemId,
4240
+ setActiveItemId,
4241
+ // style props
4242
+ accentColor,
4243
+ radius,
4244
+ variant,
4245
+ size: size2
4246
+ }),
4247
+ [accentColor, activeItemId, radius, size2, variant]
4248
+ );
4249
+ return /* @__PURE__ */ jsx(
4250
+ "div",
4251
+ {
4252
+ ref: mergeRefs([ref, internalRef]),
4253
+ className: cx(menuRootCva({ size: size2 }), radiusCva({ radius, maxLarge: true }), className),
4254
+ role: "menu",
4255
+ onKeyDown: handleKeyDown,
4256
+ tabIndex: 0,
4257
+ "aria-activedescendant": activeItemId ?? void 0,
4258
+ "data-accent-color": accentColor,
4259
+ ...rest,
4260
+ children: /* @__PURE__ */ jsx(MenuRootContext, { value: contextValue, children })
3781
4261
  }
3782
- ) }) }) }) });
4262
+ );
3783
4263
  });
3784
- MenuSubContent.displayName = "MenuSubContent";
3785
- const MenuSubTrigger = memo((props) => {
3786
- const { ref: forwardedRef, children, ...rest } = props;
3787
- const { refs, getReferenceProps, open, disabled } = useSubContext();
3788
- const mergedRefs = useMergeRefs([forwardedRef, refs.setReference]);
3789
- return /* @__PURE__ */ jsx(
3790
- MenuItem,
4264
+ MenuV2Root.displayName = "MenuRoot";
4265
+ const MenuV2SelectedIndicator = memo((props) => {
4266
+ const { ref, children, ...rest } = props;
4267
+ return /* @__PURE__ */ jsx(SelectedIndicator, { ref, ...rest, children });
4268
+ });
4269
+ MenuV2SelectedIndicator.displayName = "MenuCheckboxItemIndicator";
4270
+ const MenuV2SelectGroup = genericMemo(function MenuSelectGroup3(props) {
4271
+ const { ref, children, required, defaultValue, value, onValueChange, ...rest } = props;
4272
+ return /* @__PURE__ */ jsx(MenuV2Group, { ref, ...rest, children: required ? /* @__PURE__ */ jsx(SingleSelectRequiredProvider, { defaultValue, value, onValueChange, children }) : /* @__PURE__ */ jsx(
4273
+ SingleSelectNotRequiredProvider,
3791
4274
  {
3792
- ref: mergedRefs,
3793
- closeOnSelect: false,
3794
- "aria-haspopup": "menu",
3795
- "data-state": getOpenState(open),
3796
- disabled,
3797
- ...getReferenceProps(rest),
4275
+ defaultValue,
4276
+ value,
4277
+ onValueChange,
3798
4278
  children
3799
4279
  }
3800
- );
4280
+ ) });
3801
4281
  });
3802
- MenuSubTrigger.displayName = "MenuSubTrigger";
3803
- const MenuVirtualTrigger = memo((props) => {
3804
- const { virtualElement, disabled } = props;
3805
- const { refs, setTriggerType, setOpen } = useMenuContext();
3806
- useEffect(() => {
3807
- setTriggerType("virtual");
3808
- }, [setTriggerType]);
3809
- useEffect(() => {
3810
- if (!disabled && virtualElement) {
3811
- refs.setPositionReference(virtualElement);
3812
- setOpen(true);
3813
- } else {
3814
- refs.setPositionReference(null);
3815
- setOpen(false);
4282
+ const MenuV2SelectItem = genericMemo(function(props) {
4283
+ const { ref, value, onSelect, children, ...rest } = props;
4284
+ const { selected, selectValue } = use(SelectContext);
4285
+ const isSelected = selected(value);
4286
+ const handleSelect = useCallback(
4287
+ (e) => {
4288
+ onSelect == null ? void 0 : onSelect(e);
4289
+ if (e.defaultPrevented) return;
4290
+ selectValue(value);
4291
+ },
4292
+ [onSelect, selectValue, value]
4293
+ );
4294
+ return /* @__PURE__ */ jsx(
4295
+ MenuV2Item,
4296
+ {
4297
+ ref,
4298
+ role: "menuitemcheckbox",
4299
+ onSelect: handleSelect,
4300
+ "data-state": getSelectedState(isSelected),
4301
+ ...rest,
4302
+ children: /* @__PURE__ */ jsx(SelectedIndicatorContext, { value: isSelected, children })
3816
4303
  }
3817
- }, [disabled, refs, setOpen, virtualElement]);
3818
- return null;
4304
+ );
3819
4305
  });
3820
- MenuVirtualTrigger.displayName = "VirtualTrigger";
3821
- const Menu = {
3822
- Root: MenuRoot,
3823
- Content: MenuContent,
3824
- // sub
3825
- Sub: MenuSub,
3826
- SubContent: MenuSubContent,
3827
- SubTrigger: MenuSubTrigger,
3828
- // pages
3829
- Pages: MenuPages,
3830
- PageContent: MenuPageContent,
3831
- PageTrigger: MenuPageTrigger,
3832
- // triggers
3833
- ClickTrigger: MenuClickTrigger,
3834
- ContextTrigger: MenuContextTrigger,
3835
- VirtualTrigger: MenuVirtualTrigger,
3836
- // groups
3837
- Group: MenuGroup,
3838
- SelectGroup: MenuSelectGroup,
3839
- MultiSelectGroup: MenuMultiSelectGroup,
3840
- // items
3841
- Item: MenuItem,
3842
- SelectItem: MenuSelectItem,
3843
- MultiSelectItem: MenuMultiSelectItem,
3844
- SelectAllItem: MenuSelectAllItem,
3845
- CheckboxItem: MenuCheckboxItem,
3846
- // indicators
3847
- SelectedIndicator: MenuSelectedIndicator,
3848
- CheckboxItemIndicator: MenuCheckboxItemIndicator,
3849
- // input
3850
- InputRoot: MenuInputRoot,
3851
- InputField: MenuInputField,
3852
- InputSlot: MenuInputSlot,
3853
- // others
3854
- Label: MenuLabel,
3855
- Separator: MenuSeparator,
3856
- Scroll: MenuScroll
4306
+ const MenuV2Separator = memo((props) => {
4307
+ const { ref, className, ...rest } = props;
4308
+ const { size: size2 } = use(MenuRootContext);
4309
+ return /* @__PURE__ */ jsx(RadixSeparator.Root, { className: cx(menuSeparatorCva({ size: size2 }), className), ref, ...rest });
4310
+ });
4311
+ MenuV2Separator.displayName = "MenuSeparator";
4312
+ const MenuV2 = {
4313
+ Root: MenuV2Root,
4314
+ Group: MenuV2Group,
4315
+ GroupLabel: MenuV2GroupLabel,
4316
+ Item: MenuV2Item,
4317
+ Separator: MenuV2Separator,
4318
+ SelectGroup: MenuV2SelectGroup,
4319
+ SelectItem: MenuV2SelectItem,
4320
+ MultiSelectGroup: MenuV2MultiSelectGroup,
4321
+ MultiSelectItem: MenuV2MultiSelectItem,
4322
+ SelectAllItem: MenuV2SelectAllItem,
4323
+ SelectedIndicator: MenuV2SelectedIndicator,
4324
+ CheckboxItem: MenuV2CheckboxItem,
4325
+ CheckedIndicator: MenuV2CheckedIndicator,
4326
+ Pages: MenuV2Pages,
4327
+ Page: MenuV2Page,
4328
+ PageTriggerItem: MenuV2PageTriggerItem
3857
4329
  };
3858
4330
  const OneTimePasswordFieldHiddenInput = memo((props) => {
3859
4331
  return /* @__PURE__ */ jsx(RadixOneTimePasswordField.HiddenInput, { ...props });
@@ -4022,9 +4494,9 @@ const ErrorFallback = memo((props) => {
4022
4494
  }, [onRetry, resetBoundary]);
4023
4495
  return /* @__PURE__ */ jsxs("div", { className: "flex w-full gap-2", style: outerFlexStyles, children: [
4024
4496
  /* @__PURE__ */ jsx("div", { style: { flexGrow: 1 } }),
4025
- /* @__PURE__ */ jsx(LuIcon, { icon: "alert-triangle", size: height, style: centerStyles }),
4497
+ /* @__PURE__ */ jsx(LuIcon, { icon: AlertTriangle, size: height, style: centerStyles }),
4026
4498
  /* @__PURE__ */ jsx("span", { style: { lineHeight: height, ...centerStyles }, children: message }),
4027
- /* @__PURE__ */ jsx(IconButton, { "aria-label": "Try again", variant: "soft", onClick: handleRetry, style: centerStyles, children: /* @__PURE__ */ jsx(LuIcon, { icon: "rotate-ccw", size: height }) }),
4499
+ /* @__PURE__ */ jsx(IconButton, { "aria-label": "Try again", variant: "soft", onClick: handleRetry, style: centerStyles, children: /* @__PURE__ */ jsx(LuIcon, { icon: RotateCcw, size: height }) }),
4028
4500
  /* @__PURE__ */ jsx("div", { style: { flexGrow: 1 } })
4029
4501
  ] });
4030
4502
  });
@@ -4032,8 +4504,8 @@ ErrorFallback.displayName = "ErrorFallback";
4032
4504
  const OvermapErrorBoundary = memo((props) => {
4033
4505
  const { absoluteCentering, message } = props;
4034
4506
  const [attempt, setAttempt] = useState(0);
4035
- const logError = useCallback((error, info) => {
4036
- console.error("Error in OvermapErrorBoundary:", error, info);
4507
+ const logError = useCallback((error2, info2) => {
4508
+ console.error("Error in OvermapErrorBoundary:", error2, info2);
4037
4509
  setAttempt((prev) => prev + 1);
4038
4510
  }, []);
4039
4511
  const handleRetry = useCallback(() => {
@@ -5387,7 +5859,7 @@ const TableRowHeaderCell = memo((props) => {
5387
5859
  const { size: size2, border, variant } = useContext(TableContext);
5388
5860
  return /* @__PURE__ */ jsx("th", { ref, className: cx(tableCellCva({ size: size2, border, cell: true, variant }), className), ...rest });
5389
5861
  });
5390
- TableRowHeaderCell.displayName = "TableRow";
5862
+ TableRowHeaderCell.displayName = "TableRowHeaderCell";
5391
5863
  const Table = {
5392
5864
  Root: TableRoot,
5393
5865
  Header: TableHeader,
@@ -5620,170 +6092,184 @@ const TextArea = memo((props) => {
5620
6092
  );
5621
6093
  });
5622
6094
  TextArea.displayName = "TextArea";
5623
- const toastCva = cva(
5624
- [
5625
- "shadow-md",
5626
- "duration-200",
5627
- "data-[state='open']:animate-in",
5628
- "data-[state='open']:fade-in-0",
5629
- "data-[state='open']:zoom-in-95",
5630
- "data-[state='closed']:animate-out",
5631
- "data-[state='closed']:fade-out-0",
5632
- "data-[state='closed']:zoom-out-95"
5633
- ],
5634
- {
5635
- variants: {
5636
- variant: {
5637
- surface: ["bg-(--accent-1)", "text-(--accent-11)", "ring-1", "ring-inset", "ring-(--accent-6)"],
5638
- soft: ["bg-(--accent-1)", "text-(--accent-11)"]
5639
- },
5640
- size: {
5641
- xs: ["text-xs", "p-2"],
5642
- sm: ["text-sm", "p-3"],
5643
- md: ["text-base", "p-4"],
5644
- lg: ["text-lg", "p-5"],
5645
- xl: ["text-xl", "p-6"]
5646
- }
5647
- },
5648
- defaultVariants: {
5649
- variant: "surface",
5650
- size: "md"
5651
- }
5652
- }
5653
- );
5654
- const _Toast = function Toast2(props) {
5655
- const { radius, ...restProviderContext } = useProvider();
5656
- const {
5657
- ref,
5658
- title,
5659
- description,
5660
- icon,
5661
- size: size2 = "md",
5662
- accentColor = restProviderContext.accentColor,
5663
- variant,
5664
- onClose,
5665
- sensitivity,
5666
- action,
5667
- ...rest
5668
- } = props;
5669
- const [open, setOpen] = useState(true);
5670
- const handleOpenChange = useCallback(
5671
- (open2) => {
5672
- if (!open2 && onClose) onClose();
5673
- setOpen(open2);
5674
- },
5675
- [onClose]
5676
- );
6095
+ const CustomToast = memo((props) => {
6096
+ const { toastId, title, description, icon, accentColor, closeButton, action } = props;
6097
+ const { radius } = useProvider();
6098
+ const handleAction = useCallback(() => {
6099
+ toast$1.dismiss(toastId);
6100
+ }, [toastId]);
6101
+ const handleClose = useCallback(() => {
6102
+ toast$1.dismiss(toastId);
6103
+ }, [toastId]);
5677
6104
  return /* @__PURE__ */ jsxs(
5678
- RadixToast.Root,
6105
+ "div",
5679
6106
  {
5680
6107
  className: cx(
5681
- "flex w-max max-w-full items-center gap-4",
5682
- toastCva({ size: size2, variant }),
6108
+ "flex items-center gap-2 bg-(--base-2) p-4 ring ring-(--base-6) shadow-md max-w-full max-h-full",
5683
6109
  radiusCva({ radius, maxLarge: true })
5684
6110
  ),
5685
- ref,
5686
- open,
5687
- type: sensitivity,
5688
- onOpenChange: handleOpenChange,
5689
6111
  "data-accent-color": accentColor,
5690
- "data-floating-content": "",
5691
- ...rest,
5692
6112
  children: [
5693
- /* @__PURE__ */ jsxs("div", { className: "flex grow items-center gap-3", children: [
6113
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-4 grow min-w-0", children: [
5694
6114
  icon,
5695
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
5696
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
5697
- /* @__PURE__ */ jsx(RadixToast.Title, { className: "font-medium", children: title }),
5698
- /* @__PURE__ */ jsx(RadixToast.Description, { children: description })
5699
- ] }),
5700
- action && /* @__PURE__ */ jsx(RadixToast.Action, { className: "w-max", altText: action.altText, asChild: true, children: action.content })
6115
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col min-w-0 select-none", children: [
6116
+ /* @__PURE__ */ jsx(Text, { className: "truncate", children: title }),
6117
+ description && /* @__PURE__ */ jsx(Text, { accentColor: "base", size: "sm", weight: "regular", children: description })
5701
6118
  ] })
5702
6119
  ] }),
5703
- /* @__PURE__ */ jsx(RadixToast.Close, { asChild: true, children: /* @__PURE__ */ jsx(IconButton, { size: size2, "aria-label": "Close", variant: "ghost", accentColor, children: /* @__PURE__ */ jsx(LuIcon, { icon: "x" }) }) })
6120
+ /* @__PURE__ */ jsx(Slot, { onClick: handleAction, children: action }),
6121
+ closeButton && /* @__PURE__ */ jsx(
6122
+ IconButton,
6123
+ {
6124
+ type: "button",
6125
+ onClick: handleClose,
6126
+ "aria-label": "Close",
6127
+ accentColor: "base",
6128
+ variant: "ghost",
6129
+ size: "xs",
6130
+ children: /* @__PURE__ */ jsx(LuIcon, { icon: X })
6131
+ }
6132
+ )
5704
6133
  ]
5705
6134
  }
5706
6135
  );
6136
+ });
6137
+ const basic = (options) => {
6138
+ const { icon, description, title, closeButton, action, ...rest } = options;
6139
+ return toast$1.custom(
6140
+ (id) => /* @__PURE__ */ jsx(
6141
+ CustomToast,
6142
+ {
6143
+ toastId: id,
6144
+ icon,
6145
+ description,
6146
+ title,
6147
+ closeButton,
6148
+ action
6149
+ }
6150
+ ),
6151
+ rest
6152
+ );
5707
6153
  };
5708
- const Toast = memo(_Toast);
5709
- Toast.displayName = "Toast";
5710
- const ToastContext = createContext({});
5711
- const useToast = () => {
5712
- const context = useContext(ToastContext);
5713
- if (!context) {
5714
- throw new Error("useToast must be used within a ToastProvider");
5715
- }
5716
- return context;
6154
+ const success = (options) => {
6155
+ const {
6156
+ icon = /* @__PURE__ */ jsx(LuIcon, { icon: Check, color: "var(--accent-9)" }),
6157
+ description,
6158
+ title,
6159
+ closeButton,
6160
+ action,
6161
+ ...rest
6162
+ } = options;
6163
+ return toast$1.custom(
6164
+ (id) => /* @__PURE__ */ jsx(
6165
+ CustomToast,
6166
+ {
6167
+ accentColor: "success",
6168
+ toastId: id,
6169
+ icon,
6170
+ description,
6171
+ title,
6172
+ closeButton,
6173
+ action
6174
+ }
6175
+ ),
6176
+ rest
6177
+ );
6178
+ };
6179
+ const info = (options) => {
6180
+ const {
6181
+ icon = /* @__PURE__ */ jsx(LuIcon, { icon: InfoIcon, color: "var(--base-11)" }),
6182
+ description,
6183
+ title,
6184
+ closeButton,
6185
+ action,
6186
+ ...rest
6187
+ } = options;
6188
+ return toast$1.custom(
6189
+ (id) => /* @__PURE__ */ jsx(
6190
+ CustomToast,
6191
+ {
6192
+ accentColor: "base",
6193
+ toastId: id,
6194
+ icon,
6195
+ description,
6196
+ title,
6197
+ closeButton,
6198
+ action
6199
+ }
6200
+ ),
6201
+ rest
6202
+ );
5717
6203
  };
5718
- const WORDS_PER_SECOND = 240 / 60;
5719
- const MIN_DURATION = 5e3;
5720
- const calculatedDuration = (toast) => {
5721
- if (toast.duration && toast.duration >= MIN_DURATION) return toast.duration;
5722
- const words = toast.description.split(" ").length + toast.title.split(" ").length;
5723
- return MIN_DURATION + words / WORDS_PER_SECOND;
6204
+ const warning = (options) => {
6205
+ const {
6206
+ icon = /* @__PURE__ */ jsx(LuIcon, { icon: TriangleAlertIcon, color: "var(--accent-9)" }),
6207
+ description,
6208
+ title,
6209
+ closeButton,
6210
+ action,
6211
+ ...rest
6212
+ } = options;
6213
+ return toast$1.custom(
6214
+ (id) => /* @__PURE__ */ jsx(
6215
+ CustomToast,
6216
+ {
6217
+ accentColor: "warning",
6218
+ toastId: id,
6219
+ icon,
6220
+ description,
6221
+ title,
6222
+ closeButton,
6223
+ action
6224
+ }
6225
+ ),
6226
+ rest
6227
+ );
5724
6228
  };
5725
- let unsafeShowToast = void 0;
5726
- const ToastProvider = memo(function ToastContextProvider({
5727
- children,
5728
- // Use this class to change where the viewport for the toasts should be
5729
- className,
5730
- hotkey,
5731
- ...rest
5732
- }) {
5733
- const [toasts, setToasts] = useState([]);
5734
- const handleCloseToast = useCallback((id, reason, callback) => {
5735
- setToasts((prevToasts) => {
5736
- const toast = prevToasts.find((toast2) => toast2.id === id);
5737
- if (toast && reason === 0) clearTimeout(toast.timeout);
5738
- return prevToasts.filter((toast2) => toast2.id !== id);
5739
- });
5740
- if (callback) callback();
5741
- }, []);
5742
- const toastContextValue = useMemo(() => {
5743
- let counter = 0;
5744
- const showToast = (toastProps) => {
5745
- const duration = calculatedDuration(toastProps);
5746
- const id = counter.toString();
5747
- counter += 1;
5748
- const pending = setTimeout(() => handleCloseToast(id, 1, toastProps.onClose), duration);
5749
- setToasts((prevToasts) => [...prevToasts, { ...toastProps, timeout: pending, duration, id }]);
5750
- };
5751
- const showPrimary = (toastProps) => showToast(toastProps);
5752
- const showSuccess = (toastProps) => showToast({ ...toastProps, accentColor: "success" });
5753
- const showError = (toastProps) => showToast({ ...toastProps, accentColor: "danger" });
5754
- const showInfo = (toastProps) => showToast({ ...toastProps, accentColor: "base" });
5755
- const showWarning = (toastProps) => showToast({ ...toastProps, accentColor: "warning" });
5756
- unsafeShowToast = showToast;
5757
- return {
5758
- showToast,
5759
- showPrimary,
5760
- showSuccess,
5761
- showError,
5762
- showInfo,
5763
- showWarning
5764
- };
5765
- }, [handleCloseToast]);
5766
- useEffect(() => {
5767
- return () => {
5768
- for (const { timeout } of toasts) clearTimeout(timeout);
5769
- };
5770
- }, []);
5771
- return /* @__PURE__ */ jsx(ToastContext.Provider, { value: toastContextValue, children: /* @__PURE__ */ jsxs(ToastProvider$1, { ...rest, children: [
5772
- children,
5773
- /* @__PURE__ */ jsx(
5774
- ToastViewport,
6229
+ const error = (options) => {
6230
+ const {
6231
+ icon = /* @__PURE__ */ jsx(LuIcon, { icon: CircleAlertIcon, color: "var(--accent-9)" }),
6232
+ description,
6233
+ title,
6234
+ closeButton,
6235
+ action,
6236
+ ...rest
6237
+ } = options;
6238
+ return toast$1.custom(
6239
+ (id) => /* @__PURE__ */ jsx(
6240
+ CustomToast,
5775
6241
  {
5776
- className: cx(
5777
- "fixed top-0 right-0 z-[2147483647] flex w-full max-w-md list-none flex-col items-end gap-3 overflow-x-hidden overflow-y-auto p-5 outline-none",
5778
- className
5779
- ),
5780
- hotkey
6242
+ accentColor: "danger",
6243
+ toastId: id,
6244
+ icon,
6245
+ description,
6246
+ title,
6247
+ closeButton,
6248
+ action
5781
6249
  }
5782
6250
  ),
5783
- toasts.map(({ id, onClose, ...toastProps }) => /* @__PURE__ */ jsx(Toast, { ...toastProps, onClose: () => handleCloseToast(id, 0, onClose) }, id))
5784
- ] }) });
6251
+ rest
6252
+ );
6253
+ };
6254
+ const toast = Object.assign(
6255
+ basic,
6256
+ {
6257
+ success,
6258
+ info,
6259
+ warning,
6260
+ error,
6261
+ custom: toast$1.custom,
6262
+ dismiss: toast$1.dismiss
6263
+ },
6264
+ { getHistory: toast$1.getHistory, getToasts: toast$1.getToasts }
6265
+ );
6266
+ const TOAST_OPTIONS = {
6267
+ unstyled: true
6268
+ };
6269
+ const Toaster = memo((props) => {
6270
+ return /* @__PURE__ */ jsx(Toaster$1, { toastOptions: TOAST_OPTIONS, richColors: false, closeButton: false, theme: "system", ...props });
5785
6271
  });
5786
- ToastProvider.displayName = "ToastProvider";
6272
+ Toaster.displayName = "Toaster";
5787
6273
  const toggleButtonCva = cva(
5788
6274
  [
5789
6275
  "flex",
@@ -6209,7 +6695,6 @@ export {
6209
6695
  CheckboxGroupSelectAllItem,
6210
6696
  CheckboxIndicator,
6211
6697
  CheckboxRoot,
6212
- CollapsibleTree,
6213
6698
  CommandMenu,
6214
6699
  CommandMenuCheckboxIndicator,
6215
6700
  CommandMenuCheckboxItem,
@@ -6250,10 +6735,12 @@ export {
6250
6735
  InputSlot,
6251
6736
  Layout,
6252
6737
  LayoutContainer,
6253
- LayoutContext,
6254
6738
  LayoutRoot,
6255
- LayoutSlideOut,
6739
+ LayoutSlideOutClose,
6740
+ LayoutSlideOutContent,
6741
+ LayoutSlideOutHandle,
6256
6742
  LayoutSlideOutOverlay,
6743
+ LayoutSlideOutRoot,
6257
6744
  LayoutSlideOutTrigger,
6258
6745
  Link,
6259
6746
  LuIcon,
@@ -6284,6 +6771,23 @@ export {
6284
6771
  MenuSub,
6285
6772
  MenuSubContent,
6286
6773
  MenuSubTrigger,
6774
+ MenuV2,
6775
+ MenuV2CheckboxItem,
6776
+ MenuV2CheckedIndicator,
6777
+ MenuV2Group,
6778
+ MenuV2GroupLabel,
6779
+ MenuV2Item,
6780
+ MenuV2MultiSelectGroup,
6781
+ MenuV2MultiSelectItem,
6782
+ MenuV2Page,
6783
+ MenuV2PageTriggerItem,
6784
+ MenuV2Pages,
6785
+ MenuV2Root,
6786
+ MenuV2SelectAllItem,
6787
+ MenuV2SelectGroup,
6788
+ MenuV2SelectItem,
6789
+ MenuV2SelectedIndicator,
6790
+ MenuV2Separator,
6287
6791
  MenuVirtualTrigger,
6288
6792
  OneTimePasswordField,
6289
6793
  OneTimePasswordFieldHiddenInput,
@@ -6320,9 +6824,15 @@ export {
6320
6824
  SegmentedTabsList,
6321
6825
  SegmentedTabsRoot,
6322
6826
  SegmentedTabsTrigger,
6323
- SelectedIndicatorContext,
6324
6827
  Separator,
6325
6828
  SlideOut,
6829
+ SlideOutClose,
6830
+ SlideOutContent,
6831
+ SlideOutHandle,
6832
+ SlideOutOverlay,
6833
+ SlideOutRoot,
6834
+ SlideOutTrigger,
6835
+ SlideOutViewport,
6326
6836
  Slider,
6327
6837
  Spinner,
6328
6838
  Switch,
@@ -6343,9 +6853,7 @@ export {
6343
6853
  TabsTrigger,
6344
6854
  Text,
6345
6855
  TextArea,
6346
- Toast,
6347
- ToastContext,
6348
- ToastProvider,
6856
+ Toaster,
6349
6857
  ToggleButton,
6350
6858
  ToggleGroup,
6351
6859
  ToggleGroupIconItem,
@@ -6357,24 +6865,24 @@ export {
6357
6865
  badge,
6358
6866
  buttonCva,
6359
6867
  floating,
6868
+ genericMemo,
6869
+ getActiveState,
6870
+ getBooleanState,
6871
+ getCheckedState,
6872
+ getOpenState,
6873
+ getSelectedState,
6360
6874
  mergeRefs,
6361
6875
  radiusCva,
6362
6876
  stopPropagation,
6363
- unsafeShowToast,
6877
+ toast,
6364
6878
  useAlertDialog,
6365
6879
  useButtonGroup,
6366
6880
  useControlledState,
6881
+ useFallbackId,
6882
+ useLatest,
6367
6883
  useLayoutContext,
6368
- useMenuContentContext,
6369
- useMenuContext,
6370
- usePagesContext,
6371
6884
  useProvider,
6372
- useSelectedIndicatorContext,
6373
- useSize,
6374
- useStopEventPropagation,
6375
- useSubContext,
6376
6885
  useTextFilter,
6377
- useToast,
6378
6886
  useViewportSize
6379
6887
  };
6380
6888
  //# sourceMappingURL=blocks.js.map