@overmap-ai/blocks 1.0.40-overlay.1 → 1.0.40-slide-out-resize-handle.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) 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/SelectedIndicator.d.ts +2 -3
  7. package/dist/CommandMenu/context.d.ts +2 -3
  8. package/dist/Heading/cva.d.ts +1 -1
  9. package/dist/HoverUtility/HoverUtility.d.ts +2 -2
  10. package/dist/Layout/SlideOutClose.d.ts +5 -0
  11. package/dist/Layout/SlideOutContent.d.ts +6 -0
  12. package/dist/Layout/SlideOutHandle.d.ts +5 -0
  13. package/dist/Layout/SlideOutOverlay.d.ts +2 -5
  14. package/dist/Layout/SlideOutRoot.d.ts +10 -0
  15. package/dist/Layout/SlideOutTrigger.d.ts +2 -6
  16. package/dist/Layout/SlideOutViewport.d.ts +5 -0
  17. package/dist/Layout/context.d.ts +0 -1
  18. package/dist/Layout/index.d.ts +11 -3
  19. package/dist/Layout/typings.d.ts +3 -0
  20. package/dist/Link/cva.d.ts +1 -1
  21. package/dist/LuIcon/LuIcon.d.ts +4 -6
  22. package/dist/LuIcon/index.d.ts +1 -1
  23. package/dist/LuIcon/typings.d.ts +2 -2
  24. package/dist/Menu/{CheckboxItem/CheckboxItem.d.ts → CheckboxItem.d.ts} +1 -1
  25. package/dist/Menu/{CheckboxItemIndicator/CheckboxItemIndicator.d.ts → CheckboxItemIndicator.d.ts} +1 -1
  26. package/dist/Menu/{ClickTrigger/ClickTrigger.d.ts → ClickTrigger.d.ts} +1 -1
  27. package/dist/Menu/{Content/Content.d.ts → Content.d.ts} +1 -1
  28. package/dist/Menu/{ContextTrigger/ContextTrigger.d.ts → ContextTrigger.d.ts} +1 -1
  29. package/dist/Menu/{Group/Group.d.ts → Group.d.ts} +1 -1
  30. package/dist/Menu/{Input/Field.d.ts → InputField.d.ts} +1 -1
  31. package/dist/Menu/{Input/Root.d.ts → InputRoot.d.ts} +1 -1
  32. package/dist/Menu/{Input/Slot.d.ts → InputSlot.d.ts} +1 -1
  33. package/dist/Menu/{Item/Item.d.ts → Item.d.ts} +1 -1
  34. package/dist/Menu/{MultiSelectGroup/MultiSelectGroup.d.ts → MultiSelectGroup.d.ts} +1 -1
  35. package/dist/Menu/{MultiSelectItem/MultiSelectItem.d.ts → MultiSelectItem.d.ts} +1 -1
  36. package/dist/Menu/PageContent.d.ts +2 -0
  37. package/dist/Menu/{PageTrigger/PageTrigger.d.ts → PageTrigger.d.ts} +1 -1
  38. package/dist/Menu/{Pages/Pages.d.ts → Pages.d.ts} +1 -1
  39. package/dist/Menu/{root/Root.d.ts → Root.d.ts} +1 -1
  40. package/dist/Menu/{Scroll/Scroll.d.ts → Scroll.d.ts} +1 -1
  41. package/dist/Menu/{SelectAll/SelectAllItem.d.ts → SelectAllItem.d.ts} +1 -1
  42. package/dist/Menu/{SelectGroup/SelectGroup.d.ts → SelectGroup.d.ts} +1 -1
  43. package/dist/Menu/{SelectItem/SelectItem.d.ts → SelectItem.d.ts} +1 -1
  44. package/dist/Menu/SelectedIndicator.d.ts +4 -0
  45. package/dist/Menu/{Separator/Separator.d.ts → Separator.d.ts} +1 -1
  46. package/dist/Menu/{Sub/Sub.d.ts → Sub.d.ts} +1 -1
  47. package/dist/Menu/{SubContent/SubContent.d.ts → SubContent.d.ts} +1 -1
  48. package/dist/Menu/{SubTrigger/SubTrigger.d.ts → SubTrigger.d.ts} +1 -1
  49. package/dist/Menu/{VirtualTrigger/VirtualTrigger.d.ts → VirtualTrigger.d.ts} +1 -1
  50. package/dist/Menu/index.d.ts +9 -7
  51. package/dist/Menu/{Content/context.d.ts → menuContentContext.d.ts} +2 -2
  52. package/dist/Menu/{root/context.d.ts → rootContext.d.ts} +1 -1
  53. package/dist/Menu/{Sub/context.d.ts → subContentContext.d.ts} +1 -1
  54. package/dist/Menu/utils.d.ts +0 -6
  55. package/dist/MenuV2/CheckboxItem.d.ts +6 -0
  56. package/dist/MenuV2/CheckboxItemIndicator.d.ts +3 -0
  57. package/dist/MenuV2/Group.d.ts +4 -0
  58. package/dist/MenuV2/GroupLabel.d.ts +4 -0
  59. package/dist/MenuV2/Item.d.ts +6 -0
  60. package/dist/MenuV2/MultiSelectAllItem.d.ts +4 -0
  61. package/dist/MenuV2/MultiSelectGroup.d.ts +5 -0
  62. package/dist/MenuV2/MultiSelectItem.d.ts +5 -0
  63. package/dist/MenuV2/Page.d.ts +5 -0
  64. package/dist/MenuV2/PageTriggerItem.d.ts +5 -0
  65. package/dist/MenuV2/Pages.d.ts +7 -0
  66. package/dist/MenuV2/Root.d.ts +6 -0
  67. package/dist/MenuV2/SelectGroup.d.ts +4 -0
  68. package/dist/MenuV2/SelectItem.d.ts +5 -0
  69. package/dist/MenuV2/SelectedIndicator.d.ts +3 -0
  70. package/dist/MenuV2/Separator.d.ts +5 -0
  71. package/dist/MenuV2/constants.d.ts +9 -0
  72. package/dist/MenuV2/context.d.ts +17 -0
  73. package/dist/MenuV2/cva.d.ts +14 -0
  74. package/dist/MenuV2/index.d.ts +36 -0
  75. package/dist/MenuV2/typings.d.ts +9 -0
  76. package/dist/MenuV2/utils.d.ts +1 -0
  77. package/dist/Rating/Item.d.ts +6 -0
  78. package/dist/Rating/ItemIndicator.d.ts +5 -0
  79. package/dist/Rating/Root.d.ts +8 -0
  80. package/dist/Rating/context.d.ts +9 -0
  81. package/dist/Rating/index.d.ts +9 -0
  82. package/dist/SelectedIndicator/SelectedIndicator.d.ts +5 -0
  83. package/dist/{Menu/SelectedIndicator → SelectedIndicator}/context.d.ts +0 -1
  84. package/dist/SelectedIndicator/index.d.ts +2 -0
  85. package/dist/SlideOut/Close.d.ts +4 -0
  86. package/dist/SlideOut/Content.d.ts +12 -0
  87. package/dist/SlideOut/Handle.d.ts +5 -0
  88. package/dist/SlideOut/Overlay.d.ts +4 -0
  89. package/dist/SlideOut/Root.d.ts +8 -0
  90. package/dist/SlideOut/Trigger.d.ts +4 -0
  91. package/dist/SlideOut/Viewport.d.ts +4 -0
  92. package/dist/SlideOut/constants.d.ts +1 -0
  93. package/dist/SlideOut/context.d.ts +16 -0
  94. package/dist/SlideOut/index.d.ts +18 -1
  95. package/dist/SlideOut/typings.d.ts +2 -0
  96. package/dist/Text/cva.d.ts +1 -1
  97. package/dist/blocks.js +1637 -1124
  98. package/dist/blocks.js.map +1 -1
  99. package/dist/blocks.umd.cjs +1748 -1236
  100. package/dist/blocks.umd.cjs.map +1 -1
  101. package/dist/hooks.d.ts +20 -0
  102. package/dist/index.d.ts +4 -2
  103. package/dist/typings.d.ts +0 -5
  104. package/dist/utils.d.ts +7 -30
  105. package/package.json +1 -1
  106. package/dist/CheckboxGroup/utils.d.ts +0 -1
  107. package/dist/CollapsibleTree/CollapsibleTree.d.ts +0 -5
  108. package/dist/CollapsibleTree/context.d.ts +0 -11
  109. package/dist/CollapsibleTree/index.d.ts +0 -2
  110. package/dist/CollapsibleTree/typings.d.ts +0 -58
  111. package/dist/CommandMenu/utils.d.ts +0 -4
  112. package/dist/Layout/SlideOut.d.ts +0 -20
  113. package/dist/Menu/ClickTrigger/index.d.ts +0 -1
  114. package/dist/Menu/Content/index.d.ts +0 -2
  115. package/dist/Menu/ContextTrigger/index.d.ts +0 -1
  116. package/dist/Menu/Group/index.d.ts +0 -1
  117. package/dist/Menu/Input/index.d.ts +0 -3
  118. package/dist/Menu/Item/index.d.ts +0 -1
  119. package/dist/Menu/Label/index.d.ts +0 -1
  120. package/dist/Menu/MultiSelectGroup/index.d.ts +0 -1
  121. package/dist/Menu/MultiSelectItem/index.d.ts +0 -1
  122. package/dist/Menu/PageContent/PageContent.d.ts +0 -3
  123. package/dist/Menu/PageContent/index.d.ts +0 -1
  124. package/dist/Menu/PageTrigger/index.d.ts +0 -1
  125. package/dist/Menu/Pages/index.d.ts +0 -2
  126. package/dist/Menu/SelectAll/index.d.ts +0 -1
  127. package/dist/Menu/SelectGroup/index.d.ts +0 -1
  128. package/dist/Menu/SelectItem/index.d.ts +0 -1
  129. package/dist/Menu/SelectedIndicator/SelectedIndicator.d.ts +0 -4
  130. package/dist/Menu/SelectedIndicator/index.d.ts +0 -2
  131. package/dist/Menu/Separator/index.d.ts +0 -1
  132. package/dist/Menu/Sub/index.d.ts +0 -2
  133. package/dist/Menu/SubContent/index.d.ts +0 -1
  134. package/dist/Menu/SubTrigger/index.d.ts +0 -1
  135. package/dist/Menu/VirtualTrigger/index.d.ts +0 -1
  136. package/dist/Menu/root/index.d.ts +0 -2
  137. package/dist/SlideOut/SlideOut.d.ts +0 -50
  138. /package/dist/Menu/{Label/Label.d.ts → Label.d.ts} +0 -0
  139. /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, useEffect, useId, useLayoutEffect, use, useRef } 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 } 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";
@@ -788,82 +787,6 @@ const Checkbox = {
788
787
  };
789
788
  const SelectContext = createContext({});
790
789
  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
790
  const useViewportSize = (props) => {
868
791
  const { xs: xsProps, sm: smProps, md: mdProps, lg: lgProps, xl: xlProps } = props;
869
792
  const [prevSize, setPrevSize] = useState("initial");
@@ -881,33 +804,14 @@ const useViewportSize = (props) => {
881
804
  }, [lg, md, sm, xl, xs]);
882
805
  return { size: size2, prevSize, xs, sm, md, lg, xl };
883
806
  };
884
- const useStopEventPropagation = () => {
885
- return useCallback((event) => {
886
- event.stopPropagation();
887
- }, []);
888
- };
889
- function useTextFilter(values, filterFunction) {
807
+ function useTextFilter(items, filterFunction) {
890
808
  const [filteredOptions, setFilteredOptions] = useState([]);
891
809
  const [filterValue, setFilterValue] = useState("");
892
810
  useEffect(() => {
893
- setFilteredOptions(values.filter((value) => filterFunction(value, filterValue)));
894
- }, [filterFunction, filterValue, values]);
811
+ setFilteredOptions(items.filter((value) => filterFunction(value, filterValue)));
812
+ }, [filterFunction, filterValue, items]);
895
813
  return [filteredOptions, filterValue, setFilterValue];
896
814
  }
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
815
  function useControlledState(initialState, state, setState) {
912
816
  const [uncontrolledState, setUncontrolledState] = useState(initialState);
913
817
  const handleStateChange = useCallback(
@@ -924,26 +828,34 @@ function useControlledState(initialState, state, setState) {
924
828
  }, [state]);
925
829
  return [state ?? uncontrolledState, handleStateChange];
926
830
  }
831
+ function useFallbackId(id) {
832
+ const fallbackId = useId();
833
+ return id ?? fallbackId;
834
+ }
835
+ const genericMemo = memo;
927
836
  function mergeRefs(refs) {
928
837
  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 {
838
+ const cleanups = refs.reduce(
839
+ (cleanups2, ref) => {
840
+ if (typeof ref === "function") {
841
+ const cleanup = ref(value);
842
+ if (typeof cleanup === "function") {
843
+ cleanups2.push(cleanup);
844
+ } else {
845
+ cleanups2.push(() => {
846
+ ref(null);
847
+ });
848
+ }
849
+ } else if (ref != null) {
850
+ ref.current = value;
935
851
  cleanups2.push(() => {
936
- ref(null);
852
+ ref.current = null;
937
853
  });
938
854
  }
939
- } else if (ref != null) {
940
- ref.current = value;
941
- cleanups2.push(() => {
942
- ref.current = null;
943
- });
944
- }
945
- return cleanups2;
946
- }, []);
855
+ return cleanups2;
856
+ },
857
+ []
858
+ );
947
859
  return () => {
948
860
  cleanups.forEach((cleanup) => {
949
861
  cleanup();
@@ -954,6 +866,21 @@ function mergeRefs(refs) {
954
866
  const stopPropagation = (e) => {
955
867
  e.stopPropagation();
956
868
  };
869
+ function getSelectedState(selected) {
870
+ return selected ? "selected" : "unselected";
871
+ }
872
+ function getCheckedState(checked) {
873
+ return checked === true ? "checked" : checked === false ? "unchecked" : "indeterminate";
874
+ }
875
+ function getActiveState(active) {
876
+ return active ? "active" : "inactive";
877
+ }
878
+ function getBooleanState(value) {
879
+ return value ? "true" : "false";
880
+ }
881
+ function getOpenState(open) {
882
+ return open ? "open" : "closed";
883
+ }
957
884
  const MultiSelectProvider = genericMemo(function MultiSelectProvider2(props) {
958
885
  const { children, defaultValues, values: controlledValues, onValuesChange } = props;
959
886
  const [itemValueMapping, setItemValueMapping] = useState(/* @__PURE__ */ new Set());
@@ -1036,8 +963,8 @@ const CheckboxGroupItem = memo((props) => {
1036
963
  ref,
1037
964
  className,
1038
965
  value,
1039
- accentColor,
1040
966
  disabled,
967
+ accentColor = groupContext.accentColor,
1041
968
  variant = groupContext.variant,
1042
969
  size: size2 = groupContext.size,
1043
970
  radius = groupContext.radius,
@@ -1074,9 +1001,6 @@ const CheckboxGroupItemIndicator = memo((props) => {
1074
1001
  return /* @__PURE__ */ jsx(RadixCheckbox.Indicator, { className: cx("flex items-center justify-center", className), ref, ...rest });
1075
1002
  });
1076
1003
  CheckboxGroupItemIndicator.displayName = "CheckboxGroupItemIndicator";
1077
- function getBooleanState$1(value) {
1078
- return value ? "true" : "false";
1079
- }
1080
1004
  const CheckboxGroupRoot = memo((props) => {
1081
1005
  const providerContext = useProvider();
1082
1006
  const {
@@ -1099,20 +1023,22 @@ const CheckboxGroupRoot = memo((props) => {
1099
1023
  name,
1100
1024
  required,
1101
1025
  disabled,
1026
+ // style props
1027
+ accentColor,
1102
1028
  size: size2,
1103
1029
  variant,
1104
1030
  radius
1105
1031
  }),
1106
- [disabled, name, radius, required, size2, variant]
1032
+ [accentColor, disabled, name, radius, required, size2, variant]
1107
1033
  );
1108
1034
  return /* @__PURE__ */ jsx(
1109
1035
  "div",
1110
1036
  {
1111
1037
  ref,
1112
1038
  role: "group",
1113
- "data-disabled": getBooleanState$1(!!disabled),
1039
+ "data-disabled": getBooleanState(!!disabled),
1114
1040
  "data-accent-color": accentColor,
1115
- "aria-disabled": getBooleanState$1(!!disabled),
1041
+ "aria-disabled": getBooleanState(!!disabled),
1116
1042
  ...rest,
1117
1043
  children: /* @__PURE__ */ jsx(CheckboxGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(
1118
1044
  MultiSelectProvider,
@@ -1132,8 +1058,8 @@ const CheckboxGroupSelectAllItem = memo((props) => {
1132
1058
  const {
1133
1059
  ref,
1134
1060
  className,
1135
- accentColor,
1136
1061
  disabled,
1062
+ accentColor = groupContext.accentColor,
1137
1063
  variant = groupContext.variant,
1138
1064
  size: size2 = groupContext.size,
1139
1065
  radius = groupContext.radius,
@@ -1164,137 +1090,39 @@ const CheckboxGroup = {
1164
1090
  SelectAllItem: CheckboxGroupSelectAllItem,
1165
1091
  ItemIndicator: CheckboxGroupItemIndicator
1166
1092
  };
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]);
1093
+ const CheckedIndicatorContext = createContext({});
1094
+ const CheckedIndicator = memo((props) => {
1095
+ const { children, ref, className, ...rest } = props;
1096
+ const checked = useContext(CheckedIndicatorContext);
1097
+ const computedChildren = typeof children === "function" ? children(checked) : children;
1280
1098
  return /* @__PURE__ */ jsx(
1281
1099
  "span",
1282
1100
  {
1283
1101
  ref,
1284
- "data-state": getCheckedState$1(checkedState),
1285
1102
  className: cx(
1286
- "inline-block size-max",
1103
+ "flex size-max items-center",
1287
1104
  {
1288
- invisible: checkedState === false
1105
+ invisible: checked === false
1289
1106
  },
1290
1107
  className
1291
1108
  ),
1109
+ "data-state": getCheckedState(checked),
1292
1110
  ...rest,
1293
1111
  children: computedChildren
1294
1112
  }
1295
1113
  );
1296
1114
  });
1115
+ CheckedIndicator.displayName = "CheckedIndicator";
1116
+ const CommandMenuCheckboxIndicator = memo((props) => {
1117
+ const { ref, children, ...rest } = props;
1118
+ return /* @__PURE__ */ jsx(CheckedIndicator, { ref, ...rest, children });
1119
+ });
1297
1120
  CommandMenuCheckboxIndicator.displayName = "CommandMenuCheckboxIndicator";
1121
+ const CommandMenuContext = createContext({});
1122
+ const SelectedIndicatorContext$1 = createContext(false);
1123
+ const CheckboxIndicatorContext = createContext(false);
1124
+ const CommandMenuPageContext = createContext({});
1125
+ const CommandMenuDialogContext = createContext({});
1298
1126
  const commandMenuContentCva = cva(
1299
1127
  [
1300
1128
  "ring",
@@ -1531,7 +1359,7 @@ const CommandMenuCheckboxItem = memo((props) => {
1531
1359
  onSelect == null ? void 0 : onSelect();
1532
1360
  onCheckedChange(checked !== true);
1533
1361
  }, [checked, onCheckedChange, onSelect]);
1534
- return /* @__PURE__ */ jsx(CheckboxIndicatorContext, { value: checked, children: /* @__PURE__ */ jsx(CommandMenuItem, { ref, onSelect: handleSelect, "data-state": getCheckedState$1(checked), ...rest, children }) });
1362
+ return /* @__PURE__ */ jsx(CheckboxIndicatorContext, { value: checked, children: /* @__PURE__ */ jsx(CommandMenuItem, { ref, onSelect: handleSelect, "data-state": getCheckedState(checked), ...rest, children }) });
1535
1363
  });
1536
1364
  CommandMenuCheckboxItem.displayName = "CommandMenuCheckboxItem";
1537
1365
  const CommandMenuContent = memo((props) => {
@@ -1558,9 +1386,10 @@ const CommandMenuContent = memo((props) => {
1558
1386
  return {
1559
1387
  variant,
1560
1388
  size: size2,
1561
- radius
1389
+ radius,
1390
+ accentColor
1562
1391
  };
1563
- }, [radius, size2, variant]);
1392
+ }, [accentColor, radius, size2, variant]);
1564
1393
  return /* @__PURE__ */ jsx(DialogPortal, { children: /* @__PURE__ */ jsx(
1565
1394
  DialogContent$1,
1566
1395
  {
@@ -1647,7 +1476,7 @@ const CommandMenuMultiSelectItem = genericMemo(function(props) {
1647
1476
  {
1648
1477
  ref,
1649
1478
  onSelect: handleSelect,
1650
- "data-state": getSelectedState$1(isSelected),
1479
+ "data-state": getSelectedState(isSelected),
1651
1480
  "aria-selected": isSelected,
1652
1481
  closeOnSelect,
1653
1482
  ...rest,
@@ -1721,7 +1550,7 @@ const CommandMenuRadioItem = genericMemo(function(props) {
1721
1550
  selectValue(value);
1722
1551
  }, [onSelect, selectValue, value]);
1723
1552
  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 }) });
1553
+ return /* @__PURE__ */ jsx(SelectedIndicatorContext$1, { value: isSelected, children: /* @__PURE__ */ jsx(CommandMenuItem, { ref, onSelect: handleSelect, "data-state": getSelectedState(isSelected), ...rest, children }) });
1725
1554
  });
1726
1555
  const CommandMenuRoot = memo((props) => {
1727
1556
  const { children, defaultOpen, open: controlledOpen, onOpenChange, modal } = props;
@@ -1749,35 +1578,39 @@ const CommandMenuSelectAllItem = genericMemo(function(props) {
1749
1578
  ref,
1750
1579
  role: "menuitemcheckbox",
1751
1580
  onSelect: handleSelect,
1752
- "data-state": getCheckedState$1(selectedState),
1581
+ "data-state": getCheckedState(selectedState),
1753
1582
  closeOnSelect,
1754
1583
  ...rest
1755
1584
  }
1756
1585
  ) });
1757
1586
  });
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]);
1587
+ const SelectedIndicatorContext = createContext(false);
1588
+ const SelectedIndicator = memo((props) => {
1589
+ const { ref, children, className, ...rest } = props;
1590
+ const isSelected = use(SelectedIndicatorContext);
1591
+ const computedChildren = typeof children === "function" ? children(isSelected) : children;
1764
1592
  return /* @__PURE__ */ jsx(
1765
1593
  "span",
1766
1594
  {
1767
1595
  ref,
1768
- "data-state": getSelectedState$1(isSelected),
1769
1596
  className: cx(
1770
- "inline-block size-max",
1597
+ "flex size-max items-center",
1771
1598
  {
1772
1599
  invisible: !isSelected
1773
1600
  },
1774
1601
  className
1775
1602
  ),
1603
+ "data-state": getSelectedState(isSelected),
1776
1604
  ...rest,
1777
1605
  children: computedChildren
1778
1606
  }
1779
1607
  );
1780
1608
  });
1609
+ SelectedIndicator.displayName = "SelectedIndicator";
1610
+ const CommandMenuSelectedIndicator = memo((props) => {
1611
+ const { ref, children, ...rest } = props;
1612
+ return /* @__PURE__ */ jsx(SelectedIndicator, { ref, ...rest, children });
1613
+ });
1781
1614
  CommandMenuSelectedIndicator.displayName = "CommandMenuSelectedIndicator";
1782
1615
  const CommandMenuSeparator = memo((props) => {
1783
1616
  const { className, ref, spacing = false, ...rest } = props;
@@ -1817,21 +1650,21 @@ const CommandMenu = {
1817
1650
  PageTriggerItem: CommandMenuPageTriggerItem
1818
1651
  };
1819
1652
  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 });
1653
+ const { ref, icon: Icon, className, size: size2 = "1em", ...rest } = props;
1654
+ return /* @__PURE__ */ jsx(Icon, { ref, className: cx("shrink-0", className), size: size2, ...rest });
1822
1655
  });
1823
1656
  LuIcon.displayName = "LuIcon";
1824
1657
  const Chevron = (props) => {
1825
1658
  const { orientation, ...rest } = props;
1826
1659
  switch (orientation) {
1827
1660
  case "up":
1828
- return /* @__PURE__ */ jsx(LuIcon, { icon: "chevron-up", ...rest });
1661
+ return /* @__PURE__ */ jsx(LuIcon, { icon: ChevronUp, ...rest });
1829
1662
  case "down":
1830
- return /* @__PURE__ */ jsx(LuIcon, { icon: "chevron-down", ...rest });
1663
+ return /* @__PURE__ */ jsx(LuIcon, { icon: ChevronDown, ...rest });
1831
1664
  case "left":
1832
- return /* @__PURE__ */ jsx(LuIcon, { icon: "chevron-left", ...rest });
1665
+ return /* @__PURE__ */ jsx(LuIcon, { icon: ChevronLeft, ...rest });
1833
1666
  default:
1834
- return /* @__PURE__ */ jsx(LuIcon, { icon: "chevron-right", ...rest });
1667
+ return /* @__PURE__ */ jsx(LuIcon, { icon: ChevronRight, ...rest });
1835
1668
  }
1836
1669
  };
1837
1670
  const rootCva = cva(["relative", "size-max"], {
@@ -2254,7 +2087,7 @@ const HoverCard = {
2254
2087
  Root: RadixHoverCard.Root,
2255
2088
  Trigger: RadixHoverCard.Trigger
2256
2089
  };
2257
- const HoverUtility = memo(function Root({ children, forceHover }) {
2090
+ const HoverUtility = memo(({ children, forceHover }) => {
2258
2091
  const [isHovered, setIsHovered] = useState(false);
2259
2092
  const handlePointerEnter = useCallback(() => {
2260
2093
  setIsHovered(true);
@@ -2268,6 +2101,7 @@ const HoverUtility = memo(function Root({ children, forceHover }) {
2268
2101
  onPointerLeave: handlePointerLeave
2269
2102
  });
2270
2103
  });
2104
+ HoverUtility.displayName = "HoverUtility";
2271
2105
  const InputContext = createContext({});
2272
2106
  const inputRoot$1 = cva(
2273
2107
  [
@@ -2395,9 +2229,9 @@ const Input = {
2395
2229
  const LayoutContext = createContext({});
2396
2230
  const useLayoutContext = () => useContext(LayoutContext);
2397
2231
  const LayoutContainer = memo((props) => {
2398
- const { ref, children, className, ...rest } = props;
2232
+ const { ref, children, ...rest } = props;
2399
2233
  const { hideLayout = false } = useLayoutContext();
2400
- return !hideLayout && /* @__PURE__ */ jsx("div", { className: cx("flex h-full grow", className), ref, ...rest, children });
2234
+ return !hideLayout && /* @__PURE__ */ jsx("div", { ref, ...rest, children });
2401
2235
  });
2402
2236
  LayoutContainer.displayName = "LayoutContainer";
2403
2237
  const LayoutRoot = memo((props) => {
@@ -2424,6 +2258,23 @@ const LayoutRoot = memo((props) => {
2424
2258
  return /* @__PURE__ */ jsx(LayoutContext.Provider, { value: contextValue, children });
2425
2259
  });
2426
2260
  LayoutRoot.displayName = "LayoutRoot";
2261
+ const SlideOutRootContext = createContext({});
2262
+ const SlideOutContextContext = createContext({});
2263
+ const SlideOutClose = memo((props) => {
2264
+ const { ref, onClick, disabled, ...rest } = props;
2265
+ const { setOpen } = use(SlideOutRootContext);
2266
+ const handleClick = useCallback(
2267
+ (e) => {
2268
+ onClick == null ? void 0 : onClick(e);
2269
+ if (e.defaultPrevented) return;
2270
+ setOpen(false);
2271
+ },
2272
+ [onClick, setOpen]
2273
+ );
2274
+ return /* @__PURE__ */ jsx(Slot, { ref, onClick: handleClick, "data-disabled": disabled ?? false, ...rest });
2275
+ });
2276
+ SlideOutClose.displayName = "SlideOutClose";
2277
+ const TIMEOUT_DURATION = 200;
2427
2278
  function usePointerDownOutside(onPointerDownOutside, ownerElement = globalThis == null ? void 0 : globalThis.document.body) {
2428
2279
  const handlePointerDownOutside = useCallbackRef(onPointerDownOutside);
2429
2280
  const isPointerInsideReactTreeRef = useRef(false);
@@ -2485,327 +2336,372 @@ function useCallbackRef(callback) {
2485
2336
  return (_a = callbackRef.current) == null ? void 0 : _a.call(callbackRef, ...args);
2486
2337
  }, []);
2487
2338
  }
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);
2339
+ const SlideOutContent = memo((props) => {
2340
+ const { ref, children, style, side, type, resizeable = false, initialSize, minSize, maxSize, hide: hide2, ...rest } = props;
2341
+ const internalRef = useRef(null);
2342
+ const { open, setOpen, parentElement, modal } = use(SlideOutRootContext);
2343
+ const [computedSize, setComputedSize] = useState(null);
2344
+ const handleClose = useCallback(() => {
2345
+ if (modal) setOpen(false);
2346
+ }, [modal, setOpen]);
2347
+ const { onPointerDownCapture: handlePointerDownCapture } = usePointerDownOutside(
2348
+ handleClose,
2349
+ parentElement ?? void 0
2350
+ );
2351
+ useLayoutEffect(() => {
2352
+ if (!open || !internalRef.current) return;
2353
+ const { offsetWidth, offsetHeight } = internalRef.current;
2354
+ switch (side) {
2355
+ case "left":
2356
+ case "right":
2357
+ setComputedSize(offsetWidth);
2358
+ break;
2359
+ case "top":
2360
+ case "bottom":
2361
+ setComputedSize(offsetHeight);
2362
+ }
2363
+ }, [open, side]);
2364
+ const computedStyle = useMemo(() => {
2365
+ switch (side) {
2366
+ case "left":
2367
+ return {
2368
+ ...style,
2369
+ left: 0,
2370
+ width: computedSize ?? initialSize,
2371
+ maxWidth: maxSize,
2372
+ minWidth: minSize,
2373
+ position: type === "inline" ? "relative" : "absolute",
2374
+ "--slide-out-size": `${computedSize}px`
2375
+ };
2376
+ case "right":
2377
+ return {
2378
+ ...style,
2379
+ right: 0,
2380
+ width: computedSize ?? initialSize,
2381
+ maxWidth: maxSize,
2382
+ minWidth: minSize,
2383
+ position: type === "inline" ? "relative" : "absolute",
2384
+ "--slide-out-size": `${computedSize}px`
2385
+ };
2386
+ case "top":
2387
+ return {
2388
+ ...style,
2389
+ top: 0,
2390
+ height: computedSize ?? initialSize,
2391
+ maxHeight: maxSize,
2392
+ minHeight: minSize,
2393
+ position: type === "inline" ? "relative" : "absolute",
2394
+ "--slide-out-size": `${computedSize}px`
2395
+ };
2396
+ case "bottom":
2397
+ return {
2398
+ ...style,
2399
+ bottom: 0,
2400
+ height: computedSize ?? initialSize,
2401
+ maxHeight: maxSize,
2402
+ minHeight: minSize,
2403
+ position: type === "inline" ? "relative" : "absolute",
2404
+ "--slide-out-size": `${computedSize}px`
2405
+ };
2528
2406
  }
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";
2407
+ }, [computedSize, initialSize, maxSize, minSize, side, style, type]);
2408
+ const transitionClassNames = useMemo(() => {
2409
+ switch (side) {
2410
+ case "left":
2411
+ return {
2412
+ enter: "-ml-(--slide-out-size)",
2413
+ enterActive: "ease-linear duration-200 transition-[margin-left] ml-0",
2414
+ enterDone: "ml-0",
2415
+ exitActive: "ease-linear duration-200 transition-[margin-left] -ml-(--slide-out-size)",
2416
+ exitDone: "-ml-(--slide-out-size)"
2417
+ };
2418
+ case "right":
2419
+ return {
2420
+ enter: "-mr-(--slide-out-size)",
2421
+ enterActive: "ease-linear duration-200 transition-[margin-right] mr-0",
2422
+ enterDone: "mr-0",
2423
+ exitActive: "ease-linear duration-200 transition-[margin-right] -mr-(--slide-out-size)",
2424
+ exitDone: "-mr-(--slide-out-size)"
2425
+ };
2426
+ case "top":
2427
+ return {
2428
+ enter: "-mt-(--slide-out-size)",
2429
+ enterActive: "ease-linear duration-200 transition-[margin-top] mt-0",
2430
+ enterDone: "mt-0",
2431
+ exitActive: "ease-linear duration-200 transition-[margin-top] -mt-(--slide-out-size)",
2432
+ exitDone: "-mt-(--slide-out-size)"
2433
+ };
2434
+ case "bottom":
2435
+ return {
2436
+ enter: "-mb-(--slide-out-size)",
2437
+ enterActive: "ease-linear duration-200 transition-[margin-bottom] mb-0",
2438
+ enterDone: "mb-0",
2439
+ exitActive: "ease-linear duration-200 transition-[margin-bottom] -mb-(--slide-out-size)",
2440
+ exitDone: "-mb-(--slide-out-size)"
2441
+ };
2535
2442
  }
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(
2443
+ }, [side]);
2444
+ const contextValue = useMemo(
2544
2445
  () => ({
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)"
2446
+ side,
2447
+ type,
2448
+ resizeable,
2449
+ computedSize,
2450
+ setComputedSize
2550
2451
  }),
2551
- [isLeft]
2452
+ [computedSize, resizeable, side, type]
2552
2453
  );
2553
- const handleMouseDown = useCallback((e) => {
2554
- const { clientX } = e;
2555
- prevClientX.current = clientX;
2556
- setIsResizing(true);
2557
- }, []);
2558
- const handleMouseMove = useCallback(
2454
+ return !hide2 ? (
2455
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
2456
+ // @ts-ignore
2457
+ /* @__PURE__ */ jsx(
2458
+ CSSTransition,
2459
+ {
2460
+ classNames: transitionClassNames,
2461
+ in: open,
2462
+ timeout: TIMEOUT_DURATION,
2463
+ unmountOnExit: true,
2464
+ mountOnEnter: true,
2465
+ nodeRef: internalRef,
2466
+ children: /* @__PURE__ */ jsx(
2467
+ "div",
2468
+ {
2469
+ ref: mergeRefs([ref, internalRef]),
2470
+ onPointerDownCapture: handlePointerDownCapture,
2471
+ "data-open": open,
2472
+ "data-side": side,
2473
+ "data-type": type,
2474
+ style: computedStyle,
2475
+ ...rest,
2476
+ children: /* @__PURE__ */ jsx(SlideOutContextContext, { value: contextValue, children })
2477
+ }
2478
+ )
2479
+ }
2480
+ )
2481
+ ) : null;
2482
+ });
2483
+ SlideOutContent.displayName = "SlideOutContent";
2484
+ const SlideOutHandle = memo((props) => {
2485
+ const { ref, onMouseDown, disabled, ...rest } = props;
2486
+ const prevClientCoord = useRef(null);
2487
+ const [isResizing, setIsResizing] = useState(false);
2488
+ const { side, resizeable, computedSize, setComputedSize } = use(SlideOutContextContext);
2489
+ const computedDisabled = disabled ?? !resizeable;
2490
+ const setPrevClientCoord = useCallback(
2491
+ (clientX, clientY) => {
2492
+ switch (side) {
2493
+ case "left":
2494
+ prevClientCoord.current = clientX;
2495
+ break;
2496
+ case "right":
2497
+ prevClientCoord.current = clientX;
2498
+ break;
2499
+ case "top":
2500
+ prevClientCoord.current = clientY;
2501
+ break;
2502
+ case "bottom":
2503
+ prevClientCoord.current = clientY;
2504
+ break;
2505
+ }
2506
+ },
2507
+ [side]
2508
+ );
2509
+ const handlePointerDown = useCallback(
2510
+ (e) => {
2511
+ onMouseDown == null ? void 0 : onMouseDown(e);
2512
+ if (e.defaultPrevented || computedDisabled) return;
2513
+ e.preventDefault();
2514
+ setPrevClientCoord(e.clientX, e.clientY);
2515
+ setIsResizing(true);
2516
+ },
2517
+ [computedDisabled, onMouseDown, setPrevClientCoord]
2518
+ );
2519
+ const handlePointerMove = useCallback(
2559
2520
  (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);
2521
+ if (!isResizing || !prevClientCoord.current || computedDisabled) return;
2522
+ e.preventDefault();
2523
+ const { clientX, clientY } = e;
2524
+ let delta = 0;
2525
+ switch (side) {
2526
+ case "left":
2527
+ delta = clientX - prevClientCoord.current;
2528
+ break;
2529
+ case "right":
2530
+ delta = (clientX - prevClientCoord.current) * -1;
2531
+ break;
2532
+ case "top":
2533
+ delta = clientY - prevClientCoord.current;
2534
+ break;
2535
+ case "bottom":
2536
+ delta = (clientY - prevClientCoord.current) * -1;
2537
+ break;
2538
+ }
2539
+ setPrevClientCoord(clientX, clientY);
2540
+ setComputedSize(computedSize + delta);
2565
2541
  },
2566
- [isLeft, isResizing]
2542
+ [computedDisabled, computedSize, isResizing, setComputedSize, setPrevClientCoord, side]
2567
2543
  );
2568
- const handleMouseUp = useCallback(() => {
2569
- if (!isResizing) return;
2570
- prevClientX.current = null;
2544
+ const handlePointerUp = useCallback(() => {
2545
+ if (!isResizing || computedDisabled) return;
2546
+ prevClientCoord.current = null;
2571
2547
  setIsResizing(false);
2572
- }, [isResizing]);
2548
+ }, [computedDisabled, isResizing]);
2573
2549
  useEffect(() => {
2574
- window.addEventListener("mousemove", handleMouseMove);
2575
- window.addEventListener("mouseup", handleMouseUp);
2550
+ document.addEventListener("pointermove", handlePointerMove);
2551
+ document.addEventListener("pointerup", handlePointerUp);
2576
2552
  return () => {
2577
- window.removeEventListener("mousemove", handleMouseMove);
2578
- window.removeEventListener("mouseup", handleMouseUp);
2553
+ document.removeEventListener("pointermove", handlePointerMove);
2554
+ document.removeEventListener("pointerup", handlePointerUp);
2579
2555
  };
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(
2556
+ }, [handlePointerMove, handlePointerUp]);
2557
+ return /* @__PURE__ */ jsx(
2672
2558
  "div",
2673
2559
  {
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
- ]
2560
+ ref,
2561
+ onPointerDown: handlePointerDown,
2562
+ "data-resizing": isResizing,
2563
+ "data-side": side,
2564
+ "data-disabled": computedDisabled,
2565
+ ...rest
2690
2566
  }
2691
2567
  );
2692
2568
  });
2693
- SlideOut.displayName = "SlideOut";
2694
- const DEFAULT_INITIAL_WIDTH = "30%";
2695
- const LayoutSlideOut = memo((props) => {
2696
- const { small, hideLayout, isOpen, setOpen } = useLayoutContext();
2697
- const {
2698
- ref,
2699
- id,
2700
- children,
2701
- className,
2702
- defaultOpen,
2703
- side,
2704
- initialWidth = DEFAULT_INITIAL_WIDTH,
2705
- onDismiss,
2706
- ...rest
2707
- } = 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,
2569
+ SlideOutHandle.displayName = "SlideOutHandle";
2570
+ const SlideOutOverlay = memo((props) => {
2571
+ const { ref, ...rest } = props;
2572
+ const { open } = use(SlideOutRootContext);
2573
+ return open ? /* @__PURE__ */ jsx("div", { ref, "data-open": open, ...rest }) : null;
2574
+ });
2575
+ SlideOutOverlay.displayName = "SlideOutOverlay";
2576
+ const SlideOutRoot = memo((props) => {
2577
+ const { ref, children, defaultOpen = false, open: controlledOpen, onOpenChange, modal = false, ...rest } = props;
2578
+ const [parentElement, setParentElement] = useState(null);
2579
+ const [open, setOpen] = useControlledState(defaultOpen, controlledOpen, onOpenChange);
2580
+ const contextValue = useMemo(
2581
+ () => ({
2582
+ parentElement,
2726
2583
  open,
2727
- initialWidth,
2728
- modal: small,
2729
- onDismiss: handleDismiss,
2730
- position: small ? "absolute" : "relative",
2731
- ...rest,
2732
- children
2733
- }
2584
+ setOpen,
2585
+ modal
2586
+ }),
2587
+ [modal, open, parentElement, setOpen]
2588
+ );
2589
+ return /* @__PURE__ */ jsx("div", { ref: mergeRefs([ref, setParentElement]), ...rest, children: /* @__PURE__ */ jsx(SlideOutRootContext, { value: contextValue, children }) });
2590
+ });
2591
+ SlideOutRoot.displayName = "SlideOutRoot";
2592
+ const SlideOutTrigger = memo((props) => {
2593
+ const { ref, onClick, ...rest } = props;
2594
+ const { open, setOpen } = use(SlideOutRootContext);
2595
+ const handleClick = useCallback(
2596
+ (e) => {
2597
+ onClick == null ? void 0 : onClick(e);
2598
+ if (e.defaultPrevented) return;
2599
+ setOpen(!open);
2600
+ },
2601
+ [onClick, open, setOpen]
2734
2602
  );
2603
+ return /* @__PURE__ */ jsx(Slot, { ref, onClick: handleClick, "data-disabled": props.disabled ?? false, ...rest });
2604
+ });
2605
+ SlideOutTrigger.displayName = "SlideOutTrigger";
2606
+ const SlideOutViewport = memo((props) => {
2607
+ const { ref, ...rest } = props;
2608
+ const internalRef = useRef(null);
2609
+ const { open, modal, parentElement } = use(SlideOutRootContext);
2610
+ useEffect(() => {
2611
+ if (!internalRef.current) return;
2612
+ const internalElement = internalRef.current;
2613
+ const originalParentPointerEvents = internalElement.style.pointerEvents;
2614
+ if (open && modal) {
2615
+ internalElement.style.pointerEvents = "none";
2616
+ }
2617
+ return () => {
2618
+ internalElement.style.pointerEvents = originalParentPointerEvents;
2619
+ };
2620
+ }, [modal, open, parentElement == null ? void 0 : parentElement.style]);
2621
+ return /* @__PURE__ */ jsx("div", { ref: mergeRefs([ref, internalRef]), ...rest });
2622
+ });
2623
+ SlideOutViewport.displayName = "SlideOutViewport";
2624
+ const SlideOut = {
2625
+ Close: SlideOutClose,
2626
+ Content: SlideOutContent,
2627
+ Handle: SlideOutHandle,
2628
+ Overlay: SlideOutOverlay,
2629
+ Root: SlideOutRoot,
2630
+ Trigger: SlideOutTrigger,
2631
+ Viewport: SlideOutViewport
2632
+ };
2633
+ const LayoutSlideOutClose = memo((props) => {
2634
+ const { ref, ...rest } = props;
2635
+ return /* @__PURE__ */ jsx(SlideOutClose, { ref, ...rest });
2735
2636
  });
2736
- LayoutSlideOut.displayName = "LayoutSlideOut";
2637
+ LayoutSlideOutClose.displayName = "LayoutSlideOutClose";
2638
+ const LayoutSlideOutContent = memo((props) => {
2639
+ const { ref, type, hide: hide2, ...rest } = props;
2640
+ const { small, hideLayout } = use(LayoutContext);
2641
+ return /* @__PURE__ */ jsx(SlideOutContent, { ref, type: type ?? (small ? "overlay" : "inline"), hide: hide2 ?? hideLayout, ...rest });
2642
+ });
2643
+ LayoutSlideOutContent.displayName = "LayoutSlideOutContent";
2644
+ const LayoutSlideOutHandle = memo((props) => {
2645
+ const { ref, ...rest } = props;
2646
+ return /* @__PURE__ */ jsx(SlideOutHandle, { ref, ...rest });
2647
+ });
2648
+ LayoutSlideOutHandle.displayName = "LayoutSlideOutHandle";
2737
2649
  const LayoutSlideOutOverlay = memo((props) => {
2738
- const { ref, children, className, active, slideOutId, smallModeOnly = false, ...rest } = props;
2739
- const { small, hideLayout, isOpen } = useLayoutContext();
2650
+ const { ref, smallModeOnly = false, ...rest } = props;
2651
+ const { small, hideLayout } = useLayoutContext();
2740
2652
  const showOverlay = useMemo(() => {
2741
- if (active !== void 0) return active;
2742
2653
  if (hideLayout) return false;
2743
2654
  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 });
2655
+ return true;
2656
+ }, [hideLayout, small, smallModeOnly]);
2657
+ return showOverlay ? /* @__PURE__ */ jsx(SlideOutOverlay, { ref, ...rest }) : null;
2747
2658
  });
2748
2659
  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 };
2770
- };
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
- }
2660
+ const LayoutSlideOutRoot = memo((props) => {
2661
+ const { ref, slideOutId, defaultOpen, ...rest } = props;
2662
+ const { isOpen, setOpen, small } = use(LayoutContext);
2663
+ const open = isOpen(slideOutId);
2664
+ const handleOpenChange = useCallback(
2665
+ (open2) => {
2666
+ if (!open2) setOpen(slideOutId, false);
2667
+ },
2668
+ [setOpen, slideOutId]
2669
+ );
2670
+ useEffect(() => {
2671
+ if (small && (defaultOpen == null ? void 0 : defaultOpen.small) !== void 0) {
2672
+ setOpen(slideOutId, defaultOpen == null ? void 0 : defaultOpen.small);
2673
+ } else if (!small && (defaultOpen == null ? void 0 : defaultOpen.large) !== void 0) {
2674
+ setOpen(slideOutId, defaultOpen == null ? void 0 : defaultOpen.large);
2675
+ }
2676
+ }, [defaultOpen, slideOutId, setOpen, small]);
2677
+ return /* @__PURE__ */ jsx(SlideOutRoot, { ref, open, onOpenChange: handleOpenChange, modal: small, ...rest });
2678
+ });
2679
+ LayoutSlideOutRoot.displayName = "LayoutSlideOutRoot";
2793
2680
  const LayoutSlideOutTrigger = memo((props) => {
2794
- const { ref, slideOutId, type = "toggle", children, ...rest } = props;
2681
+ const { ref, slideOutId, children, ...rest } = props;
2795
2682
  const { isOpen, setOpen } = useLayoutContext();
2796
2683
  const open = isOpen(slideOutId);
2797
2684
  const handleClick = useCallback(() => {
2798
- setOpen(slideOutId, nextStateBasedOnType(open, type));
2799
- }, [open, setOpen, slideOutId, type]);
2685
+ setOpen(slideOutId, !open);
2686
+ }, [open, setOpen, slideOutId]);
2800
2687
  return /* @__PURE__ */ jsx(Slot, { "data-state": getOpenState(open), ref, onClick: handleClick, ...rest, children });
2801
2688
  });
2802
- LayoutSlideOutTrigger.displayName = "SlideOutTrigger";
2689
+ LayoutSlideOutTrigger.displayName = "LayoutSlideOutTrigger";
2690
+ const LayoutSlideOutViewport = memo((props) => {
2691
+ const { ref, ...rest } = props;
2692
+ return /* @__PURE__ */ jsx(SlideOutViewport, { ref, ...rest });
2693
+ });
2694
+ LayoutSlideOutViewport.displayName = "LayoutSlideOutViewport";
2803
2695
  const Layout = {
2804
2696
  Root: LayoutRoot,
2805
2697
  Container: LayoutContainer,
2698
+ SlideOutClose: LayoutSlideOutClose,
2699
+ SlideOutContent: LayoutSlideOutContent,
2700
+ SlideOutHandle: LayoutSlideOutHandle,
2806
2701
  SlideOutOverlay: LayoutSlideOutOverlay,
2807
- SlideOut: LayoutSlideOut,
2808
- SlideOutTrigger: LayoutSlideOutTrigger
2702
+ SlideOutRoot: LayoutSlideOutRoot,
2703
+ SlideOutTrigger: LayoutSlideOutTrigger,
2704
+ SlideOutViewport: LayoutSlideOutViewport
2809
2705
  };
2810
2706
  const linkCva = cva(["cursor-pointer"], {
2811
2707
  variants: {
@@ -2875,28 +2771,6 @@ const Link = memo((props) => {
2875
2771
  );
2876
2772
  });
2877
2773
  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
2774
  const menuItem = cva(
2901
2775
  [
2902
2776
  "select-none",
@@ -3042,100 +2916,115 @@ const inputRoot = cva(
3042
2916
  }
3043
2917
  }
3044
2918
  );
2919
+ const MenuContentContext = createContext({});
3045
2920
  const MenuContext = createContext({});
3046
- const useMenuContext = () => useContext(MenuContext);
3047
- const DEFAULT_OFFSET = 5;
3048
- const MenuRoot = memo((props) => {
2921
+ const SubContext = createContext({});
2922
+ const TRIGGER_SELECT_KEYS = ["Enter", " "];
2923
+ const MenuItem = memo((props) => {
2924
+ const rootMenuContext = use(MenuContext);
2925
+ const { getItemProps, activeIndex, setOpen, size: size2, variant, radius } = use(MenuContentContext);
2926
+ const { closeRoot } = use(SubContext);
3049
2927
  const {
2928
+ ref: forwardedRef,
2929
+ className,
3050
2930
  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
2931
+ onSelect,
2932
+ onClick,
2933
+ onKeyDown,
2934
+ closeOnSelect = true,
2935
+ disabled = false,
2936
+ ...rest
3060
2937
  } = 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
2938
+ const { ref, index } = useListItem();
2939
+ const mergeRefs2 = useMergeRefs([ref, forwardedRef]);
2940
+ const handleClick = useCallback(
2941
+ (e) => {
2942
+ e.stopPropagation();
2943
+ if (disabled) return;
2944
+ onClick == null ? void 0 : onClick(e);
2945
+ onSelect == null ? void 0 : onSelect();
2946
+ if (closeOnSelect) setOpen(false);
2947
+ if (closeRoot) rootMenuContext.setOpen(false);
2948
+ },
2949
+ [closeOnSelect, closeRoot, disabled, rootMenuContext, onClick, onSelect, setOpen]
2950
+ );
2951
+ const handleKeyDown = useCallback(
2952
+ (e) => {
2953
+ if (disabled) return;
2954
+ onKeyDown == null ? void 0 : onKeyDown(e);
2955
+ if (TRIGGER_SELECT_KEYS.includes(e.key)) {
2956
+ onSelect == null ? void 0 : onSelect();
2957
+ if (closeOnSelect) setOpen(false);
2958
+ }
2959
+ },
2960
+ [closeOnSelect, disabled, onKeyDown, onSelect, setOpen]
2961
+ );
2962
+ const isActive = useMemo(() => index === activeIndex, [activeIndex, index]);
2963
+ const computedChildren = useMemo(() => {
2964
+ return typeof children === "function" ? children({ active: isActive, selected: false }) : children;
2965
+ }, [children, isActive]);
2966
+ return /* @__PURE__ */ jsx(
2967
+ "li",
2968
+ {
2969
+ className: cx(menuItem({ size: size2, variant }), radiusCva({ radius, maxLarge: true }), className),
2970
+ ref: mergeRefs2,
2971
+ role: "menuitem",
2972
+ "data-disabled": getBooleanState(disabled),
2973
+ "aria-disabled": disabled,
2974
+ "data-highlighted": isActive ? "" : void 0,
2975
+ ...getItemProps({
2976
+ onClick: handleClick,
2977
+ onKeyDown: handleKeyDown,
2978
+ tabIndex: isActive ? 0 : -1,
2979
+ ...rest
3083
2980
  }),
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,
2981
+ children: computedChildren
2982
+ }
2983
+ );
2984
+ });
2985
+ MenuItem.displayName = "MenuItem";
2986
+ const MenuCheckboxItem = memo((props) => {
2987
+ const { ref, checked, onCheckedChange, onSelect, ...rest } = props;
2988
+ const handleSelect = useCallback(() => {
2989
+ onSelect == null ? void 0 : onSelect();
2990
+ switch (checked) {
2991
+ case true:
2992
+ onCheckedChange(false);
2993
+ break;
2994
+ case "indeterminate":
2995
+ case false:
2996
+ onCheckedChange(true);
2997
+ break;
2998
+ }
2999
+ }, [checked, onCheckedChange, onSelect]);
3000
+ return /* @__PURE__ */ jsx(CheckedIndicatorContext.Provider, { value: checked, children: /* @__PURE__ */ jsx(MenuItem, { ref, onSelect: handleSelect, ...rest }) });
3001
+ });
3002
+ MenuCheckboxItem.displayName = "MenuCheckboxItem";
3003
+ const MenuCheckboxItemIndicator = memo((props) => {
3004
+ const { ref, children, ...rest } = props;
3005
+ return /* @__PURE__ */ jsx(CheckedIndicator, { ref, ...rest, children });
3006
+ });
3007
+ MenuCheckboxItemIndicator.displayName = "MenuCheckboxItemIndicator";
3008
+ const MenuClickTrigger = memo((props) => {
3009
+ const { ref: forwardedRef, children, disabled = false } = props;
3010
+ const { getReferenceProps, refs, setTriggerType, open } = use(MenuContext);
3011
+ const mergedRefs = useMergeRefs([refs.setReference, forwardedRef]);
3012
+ useEffect(() => {
3013
+ setTriggerType("click");
3014
+ }, [setTriggerType]);
3015
+ return /* @__PURE__ */ jsx(
3016
+ Slot,
3113
3017
  {
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
- },
3018
+ ref: mergedRefs,
3019
+ "aria-disabled": disabled,
3020
+ "data-disabled": getBooleanState(disabled),
3021
+ "data-state": getOpenState(open),
3022
+ ...getReferenceProps({ disabled }),
3132
3023
  children
3133
3024
  }
3134
- ) });
3025
+ );
3135
3026
  });
3136
- MenuRoot.displayName = "Root";
3137
- const MenuContentContext = createContext({});
3138
- const useMenuContentContext = () => useContext(MenuContentContext);
3027
+ MenuClickTrigger.displayName = "MenuClickTrigger";
3139
3028
  const MenuContent = memo((props) => {
3140
3029
  var _a;
3141
3030
  const providerContext = useProvider();
@@ -3164,7 +3053,7 @@ const MenuContent = memo((props) => {
3164
3053
  floatingStyles,
3165
3054
  modal,
3166
3055
  side
3167
- } = useMenuContext();
3056
+ } = use(MenuContext);
3168
3057
  const computedFloatingStyles = useMemo(() => {
3169
3058
  var _a2;
3170
3059
  return {
@@ -3236,216 +3125,10 @@ const MenuContent = memo((props) => {
3236
3125
  ) }) });
3237
3126
  });
3238
3127
  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",
3385
- {
3386
- className: cx(menuItem({ size: size2, variant }), radiusCva({ radius, maxLarge: true }), className),
3387
- ref: mergeRefs2,
3388
- role: "menuitem",
3389
- "data-disabled": getBooleanState(disabled),
3390
- "aria-disabled": disabled,
3391
- "data-highlighted": isActive ? "" : void 0,
3392
- ...getItemProps({
3393
- onClick: handleClick,
3394
- onKeyDown: handleKeyDown,
3395
- tabIndex: isActive ? 0 : -1,
3396
- ...rest
3397
- }),
3398
- children: computedChildren
3399
- }
3400
- );
3401
- });
3402
- MenuItem.displayName = "MenuItem";
3403
- const MenuCheckboxItem = memo((props) => {
3404
- const { ref, checked, onCheckedChange, onSelect, ...rest } = props;
3405
- const handleSelect = useCallback(() => {
3406
- onSelect == null ? void 0 : onSelect();
3407
- switch (checked) {
3408
- case true:
3409
- onCheckedChange(false);
3410
- break;
3411
- case "indeterminate":
3412
- case false:
3413
- onCheckedChange(true);
3414
- break;
3415
- }
3416
- }, [checked, onCheckedChange, onSelect]);
3417
- return /* @__PURE__ */ jsx(CheckedIndicatorContext.Provider, { value: checked, children: /* @__PURE__ */ jsx(MenuItem, { ref, onSelect: handleSelect, ...rest }) });
3418
- });
3419
- MenuCheckboxItem.displayName = "MenuCheckboxItem";
3420
- const MenuCheckboxItemIndicator = memo((props) => {
3421
- const { ref, children, ...rest } = props;
3422
- return /* @__PURE__ */ jsx(CheckedIndicator, { ref, ...rest, children });
3423
- });
3424
- MenuCheckboxItemIndicator.displayName = "MenuCheckboxItemIndicator";
3425
- const MenuClickTrigger = memo((props) => {
3426
- const { ref: forwardedRef, children, disabled = false } = props;
3427
- const { getReferenceProps, refs, setTriggerType, open } = useMenuContext();
3428
- const mergedRefs = useMergeRefs([refs.setReference, forwardedRef]);
3429
- useEffect(() => {
3430
- setTriggerType("click");
3431
- }, [setTriggerType]);
3432
- return /* @__PURE__ */ jsx(
3433
- Slot,
3434
- {
3435
- ref: mergedRefs,
3436
- "aria-disabled": disabled,
3437
- "data-disabled": getBooleanState(disabled),
3438
- "data-state": getOpenState(open),
3439
- ...getReferenceProps({ disabled }),
3440
- children
3441
- }
3442
- );
3443
- });
3444
- MenuClickTrigger.displayName = "MenuClickTrigger";
3445
3128
  const MenuContextTrigger = memo((props) => {
3446
3129
  const { ref: forwardedRef, children, disabled = false } = props;
3447
3130
  const ref = useRef(null);
3448
- const { setOpen, refs, setTriggerType, open } = useMenuContext();
3131
+ const { setOpen, refs, setTriggerType, open } = use(MenuContext);
3449
3132
  const mergedRefs = useMergeRefs([forwardedRef, ref]);
3450
3133
  useEffect(() => {
3451
3134
  setTriggerType("context");
@@ -3496,7 +3179,7 @@ const MenuGroup = memo((props) => {
3496
3179
  MenuGroup.displayName = "MenuGroup";
3497
3180
  const MenuInputField = memo((props) => {
3498
3181
  const { ref: forwardedRef, className, onValueChange, onChange, disabled = false, ...rest } = props;
3499
- const { activeIndex, getItemProps } = useMenuContentContext();
3182
+ const { activeIndex, getItemProps } = use(MenuContentContext);
3500
3183
  const { index, ref } = useListItem();
3501
3184
  const mergedRefs = useMergeRefs([ref, forwardedRef]);
3502
3185
  const handleChange = useCallback(
@@ -3529,7 +3212,7 @@ const MenuInputField = memo((props) => {
3529
3212
  MenuInputField.displayName = "MenuInputField";
3530
3213
  const MenuInputRoot = memo((props) => {
3531
3214
  const { ref, className, ...rest } = props;
3532
- const { size: size2 } = useMenuContentContext();
3215
+ const { size: size2 } = use(MenuContentContext);
3533
3216
  return /* @__PURE__ */ jsx("div", { className: cx(inputRoot({ size: size2 }), className), ref, ...rest });
3534
3217
  });
3535
3218
  MenuInputRoot.displayName = "MenuInputRoot";
@@ -3540,7 +3223,7 @@ const MenuInputSlot = memo((props) => {
3540
3223
  MenuInputSlot.displayName = "MenuInputSlot";
3541
3224
  const MenuLabel = memo((props) => {
3542
3225
  const { ref, className, ...rest } = props;
3543
- const { size: size2 } = useMenuContentContext();
3226
+ const { size: size2 } = use(MenuContentContext);
3544
3227
  return /* @__PURE__ */ jsx("div", { ref, className: cx(menuLabelCva({ size: size2 }), className), ...rest });
3545
3228
  });
3546
3229
  MenuLabel.displayName = "MenuLabel";
@@ -3548,29 +3231,6 @@ const MenuMultiSelectGroup = genericMemo(function MenuMultiSelectGroup2(props) {
3548
3231
  const { ref, children, defaultValues, values, onValuesChange, ...rest } = props;
3549
3232
  return /* @__PURE__ */ jsx(MenuGroup, { ref, ...rest, children: /* @__PURE__ */ jsx(MultiSelectProvider, { defaultValues, values, onValuesChange, children }) });
3550
3233
  });
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
3234
  const MenuMultiSelectItem = genericMemo(function(props) {
3575
3235
  const { ref, onSelect, children, closeOnSelect = false, value, ...rest } = props;
3576
3236
  const { selected, selectValue, registerValue } = use(MultiSelectContext);
@@ -3599,7 +3259,12 @@ const MenuMultiSelectItem = genericMemo(function(props) {
3599
3259
  ) });
3600
3260
  });
3601
3261
  const PagesContext = createContext({});
3602
- const usePagesContext = () => useContext(PagesContext);
3262
+ const MenuPageContent = memo((props) => {
3263
+ const { page, children } = props;
3264
+ const { activePage } = use(PagesContext);
3265
+ return activePage === page ? children : null;
3266
+ });
3267
+ MenuPageContent.displayName = "PageContent";
3603
3268
  const MenuPages = memo((props) => {
3604
3269
  const { children, defaultPage, page, onPageChange } = props;
3605
3270
  const [activePage, setActivePage] = useControlledState(defaultPage ?? "", page, onPageChange);
@@ -3607,67 +3272,958 @@ const MenuPages = memo((props) => {
3607
3272
  return /* @__PURE__ */ jsx(PagesContext.Provider, { value: contextValue, children });
3608
3273
  });
3609
3274
  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
3275
  const MenuPageTrigger = memo((props) => {
3617
3276
  const { ref, onSelect, page, ...rest } = props;
3618
- const { refs, setActiveIndex } = useMenuContentContext();
3619
- const { setActivePage } = usePagesContext();
3277
+ const { refs, setActiveIndex } = use(MenuContentContext);
3278
+ const { setActivePage } = use(PagesContext);
3620
3279
  const handleSelect = useCallback(() => {
3621
3280
  var _a;
3622
- onSelect == null ? void 0 : onSelect();
3623
- setActivePage(page);
3624
- (_a = refs.floating.current) == null ? void 0 : _a.focus();
3625
- setActiveIndex(null);
3626
- }, [onSelect, page, refs.floating, setActiveIndex, setActivePage]);
3627
- return /* @__PURE__ */ jsx(MenuItem, { ref, onSelect: handleSelect, closeOnSelect: false, ...rest });
3628
- });
3629
- MenuPageTrigger.displayName = "MenuPageTrigger";
3630
- const MenuScroll = memo((props) => {
3631
- const { ref, className, ...rest } = props;
3281
+ onSelect == null ? void 0 : onSelect();
3282
+ setActivePage(page);
3283
+ (_a = refs.floating.current) == null ? void 0 : _a.focus();
3284
+ setActiveIndex(null);
3285
+ }, [onSelect, page, refs.floating, setActiveIndex, setActivePage]);
3286
+ return /* @__PURE__ */ jsx(MenuItem, { ref, onSelect: handleSelect, closeOnSelect: false, ...rest });
3287
+ });
3288
+ MenuPageTrigger.displayName = "MenuPageTrigger";
3289
+ const MENU_OVERFLOW_PADDING = 20;
3290
+ const MENU_CONTENT_PADDING = 8;
3291
+ const MENU_MINIMUM_MAX_HEIGHT = 250;
3292
+ const DEFAULT_OFFSET = 5;
3293
+ const MenuRoot = memo((props) => {
3294
+ const {
3295
+ children,
3296
+ side = "bottom",
3297
+ align = "center",
3298
+ offset: offset$1,
3299
+ loop = false,
3300
+ modal = false,
3301
+ // open state related props
3302
+ open: controlledOpen,
3303
+ onOpenChange,
3304
+ defaultOpen
3305
+ } = props;
3306
+ const [open, setOpen] = useControlledState(defaultOpen ?? false, controlledOpen, onOpenChange);
3307
+ const [activeIndex, setActiveIndex] = useState(null);
3308
+ const [triggerType, setTriggerType] = useState(null);
3309
+ const elementsRef = useRef([]);
3310
+ const nodeId = useFloatingNodeId();
3311
+ const { refs, floatingStyles, context, middlewareData } = useFloating({
3312
+ nodeId,
3313
+ strategy: "fixed",
3314
+ // TODO: probably some way with template string types to not need the "as Placement"
3315
+ placement: side + (align !== "center" ? "-" + align : ""),
3316
+ whileElementsMounted: autoUpdate,
3317
+ open,
3318
+ onOpenChange: setOpen,
3319
+ middleware: [
3320
+ offset({ mainAxis: offset$1 ?? DEFAULT_OFFSET }),
3321
+ size({
3322
+ apply({ availableHeight, elements }) {
3323
+ elements.floating.style.setProperty(
3324
+ "--overmap-menu-available-height",
3325
+ `${Math.max(availableHeight, MENU_MINIMUM_MAX_HEIGHT)}px`
3326
+ );
3327
+ },
3328
+ padding: MENU_OVERFLOW_PADDING
3329
+ }),
3330
+ flip({ fallbackStrategy: "initialPlacement" }),
3331
+ shift({ padding: MENU_OVERFLOW_PADDING }),
3332
+ hide()
3333
+ ]
3334
+ });
3335
+ const role = useRole(context, {
3336
+ role: "menu"
3337
+ });
3338
+ const dismiss = useDismiss(context, {
3339
+ capture: true,
3340
+ ancestorScroll: triggerType === "context" || triggerType === "virtual"
3341
+ });
3342
+ const click = useClick(context, {
3343
+ enabled: triggerType === "click"
3344
+ });
3345
+ const listNavigation = useListNavigation(context, {
3346
+ listRef: elementsRef,
3347
+ activeIndex,
3348
+ onNavigate: setActiveIndex,
3349
+ loop
3350
+ });
3351
+ const { getFloatingProps, getItemProps, getReferenceProps } = useInteractions([
3352
+ dismiss,
3353
+ listNavigation,
3354
+ click,
3355
+ role
3356
+ ]);
3357
+ return /* @__PURE__ */ jsx(FloatingTree, { children: /* @__PURE__ */ jsx(
3358
+ MenuContext.Provider,
3359
+ {
3360
+ value: {
3361
+ open,
3362
+ setOpen,
3363
+ refs,
3364
+ context,
3365
+ floatingStyles,
3366
+ elementsRef,
3367
+ getFloatingProps,
3368
+ getItemProps,
3369
+ getReferenceProps,
3370
+ nodeId,
3371
+ activeIndex,
3372
+ setActiveIndex,
3373
+ middlewareData,
3374
+ side,
3375
+ modal,
3376
+ setTriggerType
3377
+ },
3378
+ children
3379
+ }
3380
+ ) });
3381
+ });
3382
+ MenuRoot.displayName = "Root";
3383
+ const MenuScroll = memo((props) => {
3384
+ const { ref, className, ...rest } = props;
3385
+ return /* @__PURE__ */ jsx(
3386
+ "div",
3387
+ {
3388
+ ref,
3389
+ className: cx(
3390
+ "h-full overflow-x-hidden overflow-y-auto [scrollbar-color:var(--base-6)_transparent] [scrollbar-width:thin]",
3391
+ className
3392
+ ),
3393
+ ...rest
3394
+ }
3395
+ );
3396
+ });
3397
+ MenuScroll.displayName = "MenuScroll";
3398
+ const MenuSelectAllItem = genericMemo((props) => {
3399
+ const { ref, children, onSelect, closeOnSelect = false, ...rest } = props;
3400
+ const { allSelected, someSelected, toggleSelectAll } = use(MultiSelectContext);
3401
+ const selectedState = allSelected ? true : someSelected ? "indeterminate" : false;
3402
+ const handleSelect = useCallback(() => {
3403
+ onSelect == null ? void 0 : onSelect();
3404
+ toggleSelectAll();
3405
+ }, [onSelect, toggleSelectAll]);
3406
+ const computedChildren = useMemo(() => {
3407
+ return typeof children === "function" ? ({ active }) => children({ selected: selectedState, active }) : children;
3408
+ }, [children, selectedState]);
3409
+ return /* @__PURE__ */ jsx(CheckedIndicatorContext, { value: selectedState, children: /* @__PURE__ */ jsx(
3410
+ MenuItem,
3411
+ {
3412
+ onSelect: handleSelect,
3413
+ ref,
3414
+ "data-state": getCheckedState(selectedState),
3415
+ closeOnSelect,
3416
+ ...rest,
3417
+ children: computedChildren
3418
+ }
3419
+ ) });
3420
+ });
3421
+ const MenuSelectedIndicator = memo((props) => {
3422
+ const { ref, children, ...rest } = props;
3423
+ return /* @__PURE__ */ jsx(SelectedIndicator, { ref, ...rest, children });
3424
+ });
3425
+ MenuSelectedIndicator.displayName = "MenuSelectedIndicator";
3426
+ const MenuSelectGroup = genericMemo(function MenuSelectGroup2(props) {
3427
+ const { ref, children, required, defaultValue, value, onValueChange, ...rest } = props;
3428
+ return /* @__PURE__ */ jsx(MenuGroup, { ref, ...rest, children: required ? /* @__PURE__ */ jsx(SingleSelectRequiredProvider, { defaultValue, value, onValueChange, children }) : /* @__PURE__ */ jsx(
3429
+ SingleSelectNotRequiredProvider,
3430
+ {
3431
+ defaultValue,
3432
+ value,
3433
+ onValueChange,
3434
+ children
3435
+ }
3436
+ ) });
3437
+ });
3438
+ const MenuSelectItem = genericMemo(function(props) {
3439
+ const { ref, value, onSelect, children, closeOnSelect = true, ...rest } = props;
3440
+ const { selected, selectValue } = use(SelectContext);
3441
+ const isSelected = selected(value);
3442
+ const handleSelect = useCallback(() => {
3443
+ onSelect == null ? void 0 : onSelect();
3444
+ selectValue(value);
3445
+ }, [onSelect, selectValue, value]);
3446
+ const computedChildren = useMemo(() => {
3447
+ return typeof children === "function" ? ({ active }) => children({ selected: isSelected, active }) : children;
3448
+ }, [children, isSelected]);
3449
+ return /* @__PURE__ */ jsx(SelectedIndicatorContext.Provider, { value: isSelected, children: /* @__PURE__ */ jsx(
3450
+ MenuItem,
3451
+ {
3452
+ ref,
3453
+ role: "menuitemcheckbox",
3454
+ onSelect: handleSelect,
3455
+ closeOnSelect,
3456
+ "data-state": getSelectedState(isSelected),
3457
+ ...rest,
3458
+ children: computedChildren
3459
+ }
3460
+ ) });
3461
+ });
3462
+ const MenuSeparator = memo((props) => {
3463
+ const { ref, className, ...rest } = props;
3464
+ const { size: size2 } = use(MenuContentContext);
3465
+ return /* @__PURE__ */ jsx(RadixSeparator.Root, { className: cx(menuSeparator({ size: size2 }), className), ref, ...rest });
3466
+ });
3467
+ MenuSeparator.displayName = "MenuSeparator";
3468
+ const computeOffsets = (side, alignment) => {
3469
+ switch (side) {
3470
+ case "right":
3471
+ if (alignment === "start") {
3472
+ return { mainAxis: MENU_CONTENT_PADDING + 1, crossAxis: -MENU_CONTENT_PADDING };
3473
+ } else if (alignment === "end") {
3474
+ return { mainAxis: MENU_CONTENT_PADDING + 1, crossAxis: MENU_CONTENT_PADDING };
3475
+ }
3476
+ break;
3477
+ case "left":
3478
+ if (alignment === "start") {
3479
+ return { mainAxis: MENU_CONTENT_PADDING + 1, crossAxis: -MENU_CONTENT_PADDING };
3480
+ } else if (alignment === "end") {
3481
+ return { mainAxis: MENU_CONTENT_PADDING + 1, crossAxis: MENU_CONTENT_PADDING };
3482
+ }
3483
+ break;
3484
+ }
3485
+ return { mainAxis: MENU_CONTENT_PADDING + 1, crossAxis: 0 };
3486
+ };
3487
+ const MenuSub = memo((props) => {
3488
+ const {
3489
+ children,
3490
+ disabled = false,
3491
+ side = "right",
3492
+ align = "start",
3493
+ closeRoot = false,
3494
+ loop = false,
3495
+ modal = false,
3496
+ // open state related props
3497
+ open: controlledOpen,
3498
+ onOpenChange,
3499
+ defaultOpen
3500
+ } = props;
3501
+ const [open, setOpen] = useControlledState(defaultOpen ?? false, controlledOpen, onOpenChange);
3502
+ const nodeId = useFloatingNodeId();
3503
+ const { refs, floatingStyles, context } = useFloating({
3504
+ nodeId,
3505
+ strategy: "fixed",
3506
+ whileElementsMounted: autoUpdate,
3507
+ open,
3508
+ onOpenChange: (open2, _event, reason) => {
3509
+ if (reason) setOpen(open2);
3510
+ },
3511
+ placement: side + (align !== "center" ? "-" + align : ""),
3512
+ middleware: [
3513
+ offset({ ...computeOffsets(side, align) }),
3514
+ size({
3515
+ padding: MENU_OVERFLOW_PADDING,
3516
+ apply({ availableHeight, elements }) {
3517
+ elements.floating.style.setProperty(
3518
+ "--overmap-menu-available-height",
3519
+ `${Math.max(availableHeight, MENU_MINIMUM_MAX_HEIGHT)}px`
3520
+ );
3521
+ }
3522
+ }),
3523
+ flip(),
3524
+ shift({ padding: MENU_OVERFLOW_PADDING }),
3525
+ hide()
3526
+ ]
3527
+ });
3528
+ const dismiss = useDismiss(context, {
3529
+ bubbles: closeRoot,
3530
+ outsidePress: closeRoot
3531
+ });
3532
+ const hover = useHover(context, {
3533
+ restMs: 50,
3534
+ handleClose: safePolygon({
3535
+ blockPointerEvents: true,
3536
+ requireIntent: false
3537
+ }),
3538
+ enabled: !disabled
3539
+ });
3540
+ const click = useClick(context, {
3541
+ enabled: !disabled
3542
+ });
3543
+ const elementsRef = useRef([]);
3544
+ const [activeIndex, setActiveIndex] = useState(null);
3545
+ const listNavigation = useListNavigation(context, {
3546
+ listRef: elementsRef,
3547
+ nested: true,
3548
+ activeIndex,
3549
+ onNavigate: setActiveIndex,
3550
+ loop,
3551
+ rtl: side === "left"
3552
+ });
3553
+ const { getFloatingProps, getItemProps, getReferenceProps } = useInteractions([
3554
+ listNavigation,
3555
+ dismiss,
3556
+ hover,
3557
+ click
3558
+ ]);
3559
+ return /* @__PURE__ */ jsx(
3560
+ SubContext.Provider,
3561
+ {
3562
+ value: {
3563
+ open,
3564
+ setOpen,
3565
+ nodeId,
3566
+ refs,
3567
+ floatingStyles,
3568
+ context,
3569
+ elementsRef,
3570
+ activeIndex,
3571
+ setActiveIndex,
3572
+ getFloatingProps,
3573
+ getItemProps,
3574
+ getReferenceProps,
3575
+ disabled,
3576
+ side,
3577
+ closeRoot,
3578
+ modal
3579
+ },
3580
+ children
3581
+ }
3582
+ );
3583
+ });
3584
+ MenuSub.displayName = "SubMenu";
3585
+ const MenuSubContent = memo((props) => {
3586
+ var _a;
3587
+ const { ref: forwardedRef, children, ...rest } = props;
3588
+ const { middlewareData } = use(MenuContext);
3589
+ const { accentColor, radius, variant, size: size2 } = use(MenuContentContext);
3590
+ const {
3591
+ open,
3592
+ nodeId,
3593
+ refs,
3594
+ context,
3595
+ getFloatingProps,
3596
+ getItemProps,
3597
+ activeIndex,
3598
+ setActiveIndex,
3599
+ elementsRef,
3600
+ floatingStyles,
3601
+ setOpen,
3602
+ side
3603
+ } = use(SubContext);
3604
+ const wrapperRef = useRef(null);
3605
+ const mergeRefs2 = useMergeRefs([refs.setFloating, wrapperRef]);
3606
+ const computedFloatingStyles = useMemo(() => {
3607
+ var _a2;
3608
+ return {
3609
+ ...floatingStyles,
3610
+ visibility: ((_a2 = middlewareData.hide) == null ? void 0 : _a2.referenceHidden) ? "hidden" : "visible"
3611
+ };
3612
+ }, [floatingStyles, (_a = middlewareData.hide) == null ? void 0 : _a.referenceHidden]);
3613
+ return /* @__PURE__ */ jsx(FloatingNode, { id: nodeId, children: open && /* @__PURE__ */ jsx(FloatingPortal, { children: /* @__PURE__ */ jsx(FloatingFocusManager, { context, initialFocus: wrapperRef, children: /* @__PURE__ */ jsx(FloatingList, { elementsRef, children: /* @__PURE__ */ jsx(
3614
+ MenuContentContext.Provider,
3615
+ {
3616
+ value: {
3617
+ getItemProps,
3618
+ activeIndex,
3619
+ setActiveIndex,
3620
+ elementsRef,
3621
+ open,
3622
+ setOpen,
3623
+ refs,
3624
+ size: size2,
3625
+ radius,
3626
+ accentColor,
3627
+ variant
3628
+ },
3629
+ children: /* @__PURE__ */ jsx(
3630
+ "div",
3631
+ {
3632
+ className: "outline-none",
3633
+ ref: mergeRefs2,
3634
+ style: computedFloatingStyles,
3635
+ ...getFloatingProps(),
3636
+ children: /* @__PURE__ */ jsx(
3637
+ "ul",
3638
+ {
3639
+ className: cx(
3640
+ "overmap-menu-sub-content",
3641
+ menuContent({ size: size2 }),
3642
+ floating({ side, shadow: "3" }),
3643
+ radiusCva({ radius, maxLarge: true }),
3644
+ "max-h-(--overmap-menu-available-height)"
3645
+ ),
3646
+ ref: forwardedRef,
3647
+ "data-state": getOpenState(open),
3648
+ "data-side": side,
3649
+ "data-accent-color": accentColor,
3650
+ ...rest,
3651
+ children
3652
+ }
3653
+ )
3654
+ }
3655
+ )
3656
+ }
3657
+ ) }) }) }) });
3658
+ });
3659
+ MenuSubContent.displayName = "MenuSubContent";
3660
+ const MenuSubTrigger = memo((props) => {
3661
+ const { ref: forwardedRef, children, ...rest } = props;
3662
+ const { refs, getReferenceProps, open, disabled } = use(SubContext);
3663
+ const mergedRefs = useMergeRefs([forwardedRef, refs.setReference]);
3664
+ return /* @__PURE__ */ jsx(
3665
+ MenuItem,
3666
+ {
3667
+ ref: mergedRefs,
3668
+ closeOnSelect: false,
3669
+ "aria-haspopup": "menu",
3670
+ "data-state": getOpenState(open),
3671
+ disabled,
3672
+ ...getReferenceProps(rest),
3673
+ children
3674
+ }
3675
+ );
3676
+ });
3677
+ MenuSubTrigger.displayName = "MenuSubTrigger";
3678
+ const MenuVirtualTrigger = memo((props) => {
3679
+ const { virtualElement, disabled } = props;
3680
+ const { refs, setTriggerType, setOpen } = use(MenuContext);
3681
+ useEffect(() => {
3682
+ setTriggerType("virtual");
3683
+ }, [setTriggerType]);
3684
+ useEffect(() => {
3685
+ if (!disabled && virtualElement) {
3686
+ refs.setPositionReference(virtualElement);
3687
+ setOpen(true);
3688
+ } else {
3689
+ refs.setPositionReference(null);
3690
+ setOpen(false);
3691
+ }
3692
+ }, [disabled, refs, setOpen, virtualElement]);
3693
+ return null;
3694
+ });
3695
+ MenuVirtualTrigger.displayName = "VirtualTrigger";
3696
+ const Menu = {
3697
+ Root: MenuRoot,
3698
+ Content: MenuContent,
3699
+ // sub
3700
+ Sub: MenuSub,
3701
+ SubContent: MenuSubContent,
3702
+ SubTrigger: MenuSubTrigger,
3703
+ // pages
3704
+ Pages: MenuPages,
3705
+ PageContent: MenuPageContent,
3706
+ PageTrigger: MenuPageTrigger,
3707
+ // triggers
3708
+ ClickTrigger: MenuClickTrigger,
3709
+ ContextTrigger: MenuContextTrigger,
3710
+ VirtualTrigger: MenuVirtualTrigger,
3711
+ // groups
3712
+ Group: MenuGroup,
3713
+ SelectGroup: MenuSelectGroup,
3714
+ MultiSelectGroup: MenuMultiSelectGroup,
3715
+ // items
3716
+ Item: MenuItem,
3717
+ SelectItem: MenuSelectItem,
3718
+ MultiSelectItem: MenuMultiSelectItem,
3719
+ SelectAllItem: MenuSelectAllItem,
3720
+ CheckboxItem: MenuCheckboxItem,
3721
+ // indicators
3722
+ SelectedIndicator: MenuSelectedIndicator,
3723
+ CheckboxItemIndicator: MenuCheckboxItemIndicator,
3724
+ // input
3725
+ InputRoot: MenuInputRoot,
3726
+ InputField: MenuInputField,
3727
+ InputSlot: MenuInputSlot,
3728
+ // others
3729
+ Label: MenuLabel,
3730
+ Separator: MenuSeparator,
3731
+ Scroll: MenuScroll
3732
+ };
3733
+ const KEY_MAPPING = {
3734
+ next: "ArrowDown",
3735
+ prev: "ArrowUp",
3736
+ first: "PageUp",
3737
+ last: "PageDown",
3738
+ selectItem: "Enter"
3739
+ };
3740
+ const ITEM_SELECTOR = "menu-item";
3741
+ const GROUP_SELECTOR = "menu-group";
3742
+ const MenuRootContext = createContext({});
3743
+ const MenuGroupContext = createContext({});
3744
+ const MenuPageContext = createContext({});
3745
+ const menuRootCva = cva(["w-full", "outline-none"], {
3746
+ variants: {
3747
+ size: {
3748
+ xs: ["p-0.5", "text-xs", "min-w-30"],
3749
+ sm: ["p-0.75", "text-sm", "min-w-35"],
3750
+ md: ["p-1", "text-md", "min-w-40"],
3751
+ lg: ["p-1.25", "text-lg", "min-w-45"],
3752
+ xl: ["p-1.5", "text-xl", "min-w-50"]
3753
+ },
3754
+ radius: {
3755
+ none: ["rounded-none"],
3756
+ xs: ["rounded-xs"],
3757
+ sm: ["rounded-sm"],
3758
+ md: ["rounded-md"],
3759
+ lg: ["rounded-lg"],
3760
+ xl: ["rounded-lg"],
3761
+ full: ["rounded-lg"]
3762
+ }
3763
+ }
3764
+ });
3765
+ const menuItemCva = cva(
3766
+ [
3767
+ "select-none",
3768
+ "relative",
3769
+ "flex",
3770
+ "items-center",
3771
+ "outline-none",
3772
+ "data-[disabled=true]:text-(--base-a8)",
3773
+ "data-[disabled=true]:pointer-events-none",
3774
+ "shrink-0",
3775
+ "py-1",
3776
+ "text-(--base-12)"
3777
+ ],
3778
+ {
3779
+ variants: {
3780
+ size: {
3781
+ xs: ["gap-1.5", "px-3"],
3782
+ sm: ["gap-1.75", "px-3.5"],
3783
+ md: ["gap-2", "px-4"],
3784
+ lg: ["gap-2.25", "px-4.5"],
3785
+ xl: ["gap-2.5", "px-5"]
3786
+ },
3787
+ variant: {
3788
+ solid: [
3789
+ "data-[active=true]:not-[data-[disabled=true]]:text-(--accent-contrast)",
3790
+ "data-[active=true]:not-[data-[disabled=true]]:bg-(--accent-a9)",
3791
+ "data-[active=true]:not-[data-[disabled=true]]:active:brightness-110"
3792
+ ],
3793
+ soft: [
3794
+ "data-[active=true]:not-[data-[disabled=true]]:bg-(--accent-a3)",
3795
+ "data-[active=true]:not-[data-[disabled=true]]:active:bg-(--accent-a4)"
3796
+ ]
3797
+ }
3798
+ }
3799
+ }
3800
+ );
3801
+ const menuGroupLabelCva = cva(["text-(--base-a11)", "flex", "items-center", "select-none", "py-1"], {
3802
+ variants: {
3803
+ size: {
3804
+ xs: ["gap-1.5", "px-3", "text-xs"],
3805
+ sm: ["gap-1.75", "px-3.5", "text-xs"],
3806
+ md: ["gap-2", "px-4", "text-sm"],
3807
+ lg: ["gap-2.25", "px-4.5", "text-base"],
3808
+ xl: ["gap-2.5", "px-5", "text-lg"]
3809
+ }
3810
+ }
3811
+ });
3812
+ const menuSeparatorCva = cva(["h-px", "bg-(--base-a6)", "w-auto", "shrink-0"], {
3813
+ variants: {
3814
+ size: {
3815
+ xs: ["-mx-0.5", "my-0.5"],
3816
+ sm: ["-mx-0.75", "my-0.75"],
3817
+ md: ["-mx-1", "my-1"],
3818
+ lg: ["-mx-1.25", "my-1.25"],
3819
+ xl: ["-mx-1.5", "my-1.5"]
3820
+ }
3821
+ }
3822
+ });
3823
+ const MenuV2Item = memo((props) => {
3824
+ const {
3825
+ ref,
3826
+ children,
3827
+ className,
3828
+ disabled = false,
3829
+ onClick,
3830
+ onSelect,
3831
+ onPointerEnter,
3832
+ onPointerLeave,
3833
+ onPointerMove,
3834
+ ...rest
3835
+ } = props;
3836
+ const internalRef = useRef(null);
3837
+ const itemId = useId();
3838
+ const { activeItemId, setActiveItemId, size: size2, variant, radius } = use(MenuRootContext);
3839
+ const isActive = itemId === activeItemId;
3840
+ const handleSelect = useCallback(
3841
+ (e) => {
3842
+ onSelect == null ? void 0 : onSelect(e);
3843
+ },
3844
+ [onSelect]
3845
+ );
3846
+ const handleClick = useCallback(
3847
+ (e) => {
3848
+ onClick == null ? void 0 : onClick(e);
3849
+ handleSelect(new Event("menu-select"));
3850
+ },
3851
+ [handleSelect, onClick]
3852
+ );
3853
+ const handlePointerEnter = useCallback(
3854
+ (e) => {
3855
+ onPointerEnter == null ? void 0 : onPointerEnter(e);
3856
+ if (e.defaultPrevented) return;
3857
+ setActiveItemId(itemId);
3858
+ },
3859
+ [onPointerEnter, setActiveItemId, itemId]
3860
+ );
3861
+ const handlePointerLeave = useCallback(
3862
+ (e) => {
3863
+ onPointerLeave == null ? void 0 : onPointerLeave(e);
3864
+ if (e.defaultPrevented) return;
3865
+ setActiveItemId(null);
3866
+ },
3867
+ [onPointerLeave, setActiveItemId]
3868
+ );
3869
+ const handlePointerMove = useCallback(
3870
+ (e) => {
3871
+ onPointerMove == null ? void 0 : onPointerMove(e);
3872
+ if (e.defaultPrevented) return;
3873
+ setActiveItemId(itemId);
3874
+ },
3875
+ [onPointerMove, itemId, setActiveItemId]
3876
+ );
3877
+ useEffect(() => {
3878
+ if (!internalRef.current) return;
3879
+ const element = internalRef.current;
3880
+ element.addEventListener("menu-select", handleSelect);
3881
+ return () => {
3882
+ element.removeEventListener("menu-select", handleSelect);
3883
+ };
3884
+ }, [handleSelect]);
3885
+ return /* @__PURE__ */ jsx(
3886
+ "div",
3887
+ {
3888
+ ref: mergeRefs([ref, internalRef]),
3889
+ className: cx(menuItemCva({ size: size2, variant }), radiusCva({ radius, maxLarge: true }), className),
3890
+ role: "menuitem",
3891
+ onClick: handleClick,
3892
+ onPointerEnter: handlePointerEnter,
3893
+ onPointerLeave: handlePointerLeave,
3894
+ onPointerMove: handlePointerMove,
3895
+ ...{ [ITEM_SELECTOR]: itemId },
3896
+ "data-active": getBooleanState(isActive),
3897
+ "data-disabled": getBooleanState(disabled),
3898
+ "aria-disabled": getBooleanState(disabled),
3899
+ ...rest,
3900
+ children
3901
+ }
3902
+ );
3903
+ });
3904
+ MenuV2Item.displayName = "MenuItem";
3905
+ const MenuV2CheckboxItem = memo((props) => {
3906
+ const { ref, checked, onCheckedChange, onSelect, ...rest } = props;
3907
+ const handleSelect = useCallback(
3908
+ (e) => {
3909
+ onSelect == null ? void 0 : onSelect(e);
3910
+ if (e.defaultPrevented) return;
3911
+ switch (checked) {
3912
+ case true:
3913
+ onCheckedChange(false);
3914
+ break;
3915
+ case "indeterminate":
3916
+ onCheckedChange(true);
3917
+ break;
3918
+ case false:
3919
+ onCheckedChange(true);
3920
+ break;
3921
+ }
3922
+ },
3923
+ [checked, onCheckedChange, onSelect]
3924
+ );
3925
+ return /* @__PURE__ */ jsx(CheckedIndicatorContext.Provider, { value: checked, children: /* @__PURE__ */ jsx(MenuV2Item, { ref, onSelect: handleSelect, ...rest }) });
3926
+ });
3927
+ MenuV2CheckboxItem.displayName = "MenuCheckboxItem";
3928
+ const MenuV2CheckedIndicator = memo((props) => {
3929
+ const { ref, children, ...rest } = props;
3930
+ return /* @__PURE__ */ jsx(CheckedIndicator, { ref, ...rest, children });
3931
+ });
3932
+ MenuV2CheckedIndicator.displayName = "MenuCheckboxItemIndicator";
3933
+ const MenuV2Group = memo((props) => {
3934
+ const { ref, children, ...rest } = props;
3935
+ const groupId = useId();
3936
+ const [labelId, setLabelId] = useState(null);
3937
+ const contextValue = useMemo(
3938
+ () => ({
3939
+ labelId,
3940
+ setLabelId
3941
+ }),
3942
+ [labelId]
3943
+ );
3944
+ return /* @__PURE__ */ jsx("div", { ref, role: "group", ...{ [GROUP_SELECTOR]: groupId }, "aria-labelledby": labelId ?? void 0, ...rest, children: /* @__PURE__ */ jsx(MenuGroupContext, { value: contextValue, children }) });
3945
+ });
3946
+ MenuV2Group.displayName = "MenuGroup";
3947
+ const MenuV2GroupLabel = memo((props) => {
3948
+ const { ref, children, id, className, ...rest } = props;
3949
+ const labelId = useFallbackId(id);
3950
+ const { size: size2 } = use(MenuRootContext);
3951
+ const { setLabelId } = use(MenuGroupContext);
3952
+ useEffect(() => {
3953
+ setLabelId(labelId);
3954
+ }, [labelId, setLabelId]);
3955
+ return /* @__PURE__ */ jsx("div", { ref, id: labelId, className: cx(menuGroupLabelCva({ size: size2 }), className), ...rest, children });
3956
+ });
3957
+ MenuV2GroupLabel.displayName = "MenuGroupLabel";
3958
+ const MenuV2SelectAllItem = genericMemo((props) => {
3959
+ const { ref, children, onSelect, ...rest } = props;
3960
+ const { allSelected, someSelected, toggleSelectAll } = use(MultiSelectContext);
3961
+ const selectedState = allSelected ? true : someSelected ? "indeterminate" : false;
3962
+ const handleSelect = useCallback(
3963
+ (e) => {
3964
+ onSelect == null ? void 0 : onSelect(e);
3965
+ if (e.defaultPrevented) return;
3966
+ toggleSelectAll();
3967
+ },
3968
+ [onSelect, toggleSelectAll]
3969
+ );
3970
+ return /* @__PURE__ */ jsx(MenuV2Item, { onSelect: handleSelect, ref, "data-state": getCheckedState(selectedState), ...rest, children: /* @__PURE__ */ jsx(CheckedIndicatorContext, { value: selectedState, children }) });
3971
+ });
3972
+ const MenuV2MultiSelectGroup = genericMemo(function MenuMultiSelectGroup3(props) {
3973
+ const { ref, children, defaultValues, values, onValuesChange, ...rest } = props;
3974
+ return /* @__PURE__ */ jsx(MenuV2Group, { ref, ...rest, children: /* @__PURE__ */ jsx(MultiSelectProvider, { defaultValues, values, onValuesChange, children }) });
3975
+ });
3976
+ const MenuV2MultiSelectItem = genericMemo(function(props) {
3977
+ const { ref, onSelect, children, value, ...rest } = props;
3978
+ const { selected, selectValue, registerValue } = use(MultiSelectContext);
3979
+ useLayoutEffect(() => {
3980
+ return registerValue(value);
3981
+ }, [registerValue, value]);
3982
+ const isSelected = selected(value);
3983
+ const handleSelect = useCallback(
3984
+ (e) => {
3985
+ onSelect == null ? void 0 : onSelect(e);
3986
+ if (e.defaultPrevented) return;
3987
+ selectValue(value);
3988
+ },
3989
+ [onSelect, selectValue, value]
3990
+ );
3991
+ return /* @__PURE__ */ jsx(
3992
+ MenuV2Item,
3993
+ {
3994
+ ref,
3995
+ role: "menuitemcheckbox",
3996
+ onSelect: handleSelect,
3997
+ "data-state": getSelectedState(isSelected),
3998
+ ...rest,
3999
+ children: /* @__PURE__ */ jsx(SelectedIndicatorContext, { value: isSelected, children })
4000
+ }
4001
+ );
4002
+ });
4003
+ const MenuV2Page = memo((props) => {
4004
+ const { children, ref, page, ...rest } = props;
4005
+ const { page: activePage } = use(MenuPageContext);
4006
+ const isActive = page === activePage;
4007
+ return /* @__PURE__ */ jsx("div", { ref, "data-active": getActiveState(isActive), hidden: !isActive, ...rest, children: isActive ? children : null });
4008
+ });
4009
+ MenuV2Page.displayName = "MenuPage";
4010
+ const MenuV2Pages = memo((props) => {
4011
+ const { children, defaultPage = "", page: controlledPage, onPageChange } = props;
4012
+ const [page, setPage] = useControlledState(defaultPage, controlledPage, onPageChange);
4013
+ const contextValue = useMemo(
4014
+ () => ({
4015
+ page,
4016
+ setPage
4017
+ }),
4018
+ [page, setPage]
4019
+ );
4020
+ return /* @__PURE__ */ jsx(MenuPageContext, { value: contextValue, children });
4021
+ });
4022
+ MenuV2Pages.displayName = "MenuPages";
4023
+ const MenuV2PageTriggerItem = memo((props) => {
4024
+ const { ref, children, page, onSelect, ...rest } = props;
4025
+ const { page: activePage, setPage } = use(MenuPageContext);
4026
+ const isActive = page === activePage;
4027
+ const handleSelect = useCallback(
4028
+ (e) => {
4029
+ onSelect == null ? void 0 : onSelect(e);
4030
+ if (e.defaultPrevented) return;
4031
+ setPage(page);
4032
+ },
4033
+ [onSelect, page, setPage]
4034
+ );
4035
+ return /* @__PURE__ */ jsx(MenuV2Item, { ref, onSelect: handleSelect, "data-state": getActiveState(isActive), ...rest, children: /* @__PURE__ */ jsx(SelectedIndicatorContext, { value: isActive, children }) });
4036
+ });
4037
+ MenuV2PageTriggerItem.displayName = "CommandMenuPageTriggerItem";
4038
+ const computeNextIndex = (index, length, direction, loop) => {
4039
+ switch (direction) {
4040
+ case "next":
4041
+ return index === length - 1 ? loop ? 0 : index : index + 1;
4042
+ case "prev":
4043
+ return index === 0 ? loop ? length - 1 : index : index - 1;
4044
+ }
4045
+ };
4046
+ const MenuV2Root = memo((props) => {
4047
+ const providerContext = useProvider();
4048
+ const {
4049
+ ref,
4050
+ children,
4051
+ className,
4052
+ onKeyDown,
4053
+ loop = false,
4054
+ // style props
4055
+ radius = providerContext.radius,
4056
+ accentColor = "base",
4057
+ size: size2 = "md",
4058
+ variant = "soft",
4059
+ ...rest
4060
+ } = props;
4061
+ const internalRef = useRef(null);
4062
+ const [activeItemId, setActiveItemId] = useState(null);
4063
+ const getItems = useCallback((element) => {
4064
+ return Array.from(element.querySelectorAll(`[${ITEM_SELECTOR}]:not([data-disabled=true]`));
4065
+ }, []);
4066
+ const getFirstItem = useCallback(
4067
+ (element) => {
4068
+ return getItems(element).at(0);
4069
+ },
4070
+ [getItems]
4071
+ );
4072
+ const getLastItem = useCallback(
4073
+ (element) => {
4074
+ return getItems(element).at(-1);
4075
+ },
4076
+ [getItems]
4077
+ );
4078
+ const getActiveItem = useCallback(
4079
+ (element) => {
4080
+ return getItems(element).find((itemEle) => itemEle.getAttribute(ITEM_SELECTOR) === activeItemId);
4081
+ },
4082
+ [activeItemId, getItems]
4083
+ );
4084
+ const getNextItem = useCallback(
4085
+ (element, direction) => {
4086
+ const items = getItems(element);
4087
+ const activeItem = getActiveItem(element);
4088
+ const activeItemIndex = items.findIndex((itemEle) => itemEle === activeItem);
4089
+ const nextItemIndex = computeNextIndex(activeItemIndex, items.length, direction, loop);
4090
+ return items[nextItemIndex];
4091
+ },
4092
+ [getActiveItem, getItems, loop]
4093
+ );
4094
+ const getGroups = useCallback(() => {
4095
+ if (!internalRef.current) return [];
4096
+ return Array.from(internalRef.current.querySelectorAll(`[${GROUP_SELECTOR}]`));
4097
+ }, []);
4098
+ const getActiveGroup = useCallback(() => {
4099
+ var _a;
4100
+ return ((_a = getActiveItem(internalRef.current)) == null ? void 0 : _a.closest(`[${GROUP_SELECTOR}]`)) ?? void 0;
4101
+ }, [getActiveItem]);
4102
+ const getNextGroup = useCallback(
4103
+ (direction) => {
4104
+ const groups = getGroups();
4105
+ const activeGroup = getActiveGroup();
4106
+ const activeGroupIndex = groups.findIndex((groupEle) => groupEle === activeGroup);
4107
+ const nextGroupIndex = computeNextIndex(activeGroupIndex, groups.length, direction, loop);
4108
+ return groups[nextGroupIndex];
4109
+ },
4110
+ [getActiveGroup, getGroups, loop]
4111
+ );
4112
+ const getFirstGroup = useCallback(() => {
4113
+ return getGroups().at(0);
4114
+ }, [getGroups]);
4115
+ const getLastGroup = useCallback(() => {
4116
+ return getGroups().at(-1);
4117
+ }, [getGroups]);
4118
+ const handleKeyDown = useCallback(
4119
+ (e) => {
4120
+ onKeyDown == null ? void 0 : onKeyDown(e);
4121
+ if (e.defaultPrevented) return;
4122
+ switch (e.code) {
4123
+ case KEY_MAPPING.selectItem: {
4124
+ const activeItem = getActiveItem(internalRef.current);
4125
+ if (activeItem) activeItem.dispatchEvent(new Event("menu-select"));
4126
+ break;
4127
+ }
4128
+ case KEY_MAPPING.next: {
4129
+ let nextItem;
4130
+ if (e.shiftKey) {
4131
+ const nextGroup = getNextGroup("next");
4132
+ if (!nextGroup) return;
4133
+ nextItem = getFirstItem(nextGroup);
4134
+ } else {
4135
+ nextItem = getNextItem(internalRef.current, "next");
4136
+ }
4137
+ if (!nextItem) return;
4138
+ setActiveItemId(nextItem.getAttribute(ITEM_SELECTOR));
4139
+ break;
4140
+ }
4141
+ case KEY_MAPPING.prev: {
4142
+ let prevItem;
4143
+ if (e.shiftKey) {
4144
+ const prevGroup = getNextGroup("prev");
4145
+ if (!prevGroup) return;
4146
+ prevItem = getFirstItem(prevGroup);
4147
+ } else {
4148
+ prevItem = getNextItem(internalRef.current, "prev");
4149
+ }
4150
+ if (!prevItem) return;
4151
+ setActiveItemId(prevItem.getAttribute(ITEM_SELECTOR));
4152
+ break;
4153
+ }
4154
+ case KEY_MAPPING.first: {
4155
+ let firstItem;
4156
+ if (e.shiftKey) {
4157
+ const firstGroup = getFirstGroup();
4158
+ if (!firstGroup) return;
4159
+ firstItem = getFirstItem(firstGroup);
4160
+ } else {
4161
+ firstItem = getFirstItem(internalRef.current);
4162
+ }
4163
+ if (!firstItem) return;
4164
+ setActiveItemId(firstItem.getAttribute(ITEM_SELECTOR));
4165
+ break;
4166
+ }
4167
+ case KEY_MAPPING.last: {
4168
+ let lastItem;
4169
+ if (e.shiftKey) {
4170
+ const lastGroup = getLastGroup();
4171
+ if (!lastGroup) return;
4172
+ lastItem = getFirstItem(lastGroup);
4173
+ } else {
4174
+ lastItem = getLastItem(internalRef.current);
4175
+ }
4176
+ if (!lastItem) return;
4177
+ setActiveItemId(lastItem.getAttribute(ITEM_SELECTOR));
4178
+ break;
4179
+ }
4180
+ }
4181
+ },
4182
+ [getActiveItem, getFirstGroup, getFirstItem, getLastGroup, getLastItem, getNextGroup, getNextItem, onKeyDown]
4183
+ );
4184
+ useEffect(() => {
4185
+ var _a;
4186
+ const firstItem = getFirstItem(internalRef.current);
4187
+ if (!firstItem) return;
4188
+ (_a = internalRef.current) == null ? void 0 : _a.focus();
4189
+ setActiveItemId(firstItem.getAttribute(ITEM_SELECTOR));
4190
+ }, [getFirstItem]);
4191
+ const contextValue = useMemo(
4192
+ () => ({
4193
+ activeItemId,
4194
+ setActiveItemId,
4195
+ // style props
4196
+ accentColor,
4197
+ radius,
4198
+ variant,
4199
+ size: size2
4200
+ }),
4201
+ [accentColor, activeItemId, radius, size2, variant]
4202
+ );
3632
4203
  return /* @__PURE__ */ jsx(
3633
4204
  "div",
3634
4205
  {
3635
- ref,
3636
- className: cx(
3637
- "h-full overflow-x-hidden overflow-y-auto [scrollbar-color:var(--base-6)_transparent] [scrollbar-width:thin]",
3638
- className
3639
- ),
3640
- ...rest
4206
+ ref: mergeRefs([ref, internalRef]),
4207
+ className: cx(menuRootCva({ size: size2 }), radiusCva({ radius, maxLarge: true }), className),
4208
+ role: "menu",
4209
+ onKeyDown: handleKeyDown,
4210
+ tabIndex: 0,
4211
+ "aria-activedescendant": activeItemId ?? void 0,
4212
+ "data-accent-color": accentColor,
4213
+ ...rest,
4214
+ children: /* @__PURE__ */ jsx(MenuRootContext, { value: contextValue, children })
3641
4215
  }
3642
4216
  );
3643
4217
  });
3644
- MenuScroll.displayName = "MenuScroll";
3645
- const MenuSelectAllItem = genericMemo((props) => {
3646
- const { ref, children, onSelect, closeOnSelect = false, ...rest } = props;
3647
- const { allSelected, someSelected, toggleSelectAll } = use(MultiSelectContext);
3648
- const selectedState = allSelected ? true : someSelected ? "indeterminate" : false;
3649
- const handleSelect = useCallback(() => {
3650
- onSelect == null ? void 0 : onSelect();
3651
- toggleSelectAll();
3652
- }, [onSelect, toggleSelectAll]);
3653
- const computedChildren = useMemo(() => {
3654
- return typeof children === "function" ? ({ active }) => children({ selected: selectedState, active }) : children;
3655
- }, [children, selectedState]);
3656
- return /* @__PURE__ */ jsx(CheckedIndicatorContext, { value: selectedState, children: /* @__PURE__ */ jsx(
3657
- MenuItem,
3658
- {
3659
- onSelect: handleSelect,
3660
- ref,
3661
- "data-state": getCheckedState(selectedState),
3662
- closeOnSelect,
3663
- ...rest,
3664
- children: computedChildren
3665
- }
3666
- ) });
4218
+ MenuV2Root.displayName = "MenuRoot";
4219
+ const MenuV2SelectedIndicator = memo((props) => {
4220
+ const { ref, children, ...rest } = props;
4221
+ return /* @__PURE__ */ jsx(SelectedIndicator, { ref, ...rest, children });
3667
4222
  });
3668
- const MenuSelectGroup = genericMemo(function MenuSelectGroup2(props) {
4223
+ MenuV2SelectedIndicator.displayName = "MenuCheckboxItemIndicator";
4224
+ const MenuV2SelectGroup = genericMemo(function MenuSelectGroup3(props) {
3669
4225
  const { ref, children, required, defaultValue, value, onValueChange, ...rest } = props;
3670
- return /* @__PURE__ */ jsx(MenuGroup, { ref, ...rest, children: required ? /* @__PURE__ */ jsx(SingleSelectRequiredProvider, { defaultValue, value, onValueChange, children }) : /* @__PURE__ */ jsx(
4226
+ return /* @__PURE__ */ jsx(MenuV2Group, { ref, ...rest, children: required ? /* @__PURE__ */ jsx(SingleSelectRequiredProvider, { defaultValue, value, onValueChange, children }) : /* @__PURE__ */ jsx(
3671
4227
  SingleSelectNotRequiredProvider,
3672
4228
  {
3673
4229
  defaultValue,
@@ -3677,183 +4233,53 @@ const MenuSelectGroup = genericMemo(function MenuSelectGroup2(props) {
3677
4233
  }
3678
4234
  ) });
3679
4235
  });
3680
- const MenuSelectItem = genericMemo(function(props) {
3681
- const { ref, value, onSelect, children, closeOnSelect = true, ...rest } = props;
4236
+ const MenuV2SelectItem = genericMemo(function(props) {
4237
+ const { ref, value, onSelect, children, ...rest } = props;
3682
4238
  const { selected, selectValue } = use(SelectContext);
3683
- const isSelected = useMemo(() => selected(value), [selected, value]);
3684
- const handleSelect = useCallback(() => {
3685
- onSelect == null ? void 0 : onSelect();
3686
- selectValue(value);
3687
- }, [onSelect, selectValue, value]);
3688
- const computedChildren = useMemo(() => {
3689
- return typeof children === "function" ? ({ active }) => children({ selected: isSelected, active }) : children;
3690
- }, [children, isSelected]);
3691
- return /* @__PURE__ */ jsx(SelectedIndicatorContext.Provider, { value: isSelected, children: /* @__PURE__ */ jsx(
3692
- MenuItem,
4239
+ const isSelected = selected(value);
4240
+ const handleSelect = useCallback(
4241
+ (e) => {
4242
+ onSelect == null ? void 0 : onSelect(e);
4243
+ if (e.defaultPrevented) return;
4244
+ selectValue(value);
4245
+ },
4246
+ [onSelect, selectValue, value]
4247
+ );
4248
+ return /* @__PURE__ */ jsx(
4249
+ MenuV2Item,
3693
4250
  {
3694
4251
  ref,
3695
4252
  role: "menuitemcheckbox",
3696
4253
  onSelect: handleSelect,
3697
- closeOnSelect,
3698
4254
  "data-state": getSelectedState(isSelected),
3699
4255
  ...rest,
3700
- children: computedChildren
3701
- }
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 });
3708
- });
3709
- MenuSeparator.displayName = "MenuSeparator";
3710
- const MenuSubContent = memo((props) => {
3711
- var _a;
3712
- const { ref: forwardedRef, children, ...rest } = props;
3713
- const { middlewareData } = useMenuContext();
3714
- const { accentColor, radius, variant, size: size2 } = useMenuContentContext();
3715
- const {
3716
- open,
3717
- nodeId,
3718
- refs,
3719
- context,
3720
- getFloatingProps,
3721
- getItemProps,
3722
- activeIndex,
3723
- setActiveIndex,
3724
- elementsRef,
3725
- floatingStyles,
3726
- setOpen,
3727
- side
3728
- } = useSubContext();
3729
- const wrapperRef = useRef(null);
3730
- const mergeRefs2 = useMergeRefs([refs.setFloating, wrapperRef]);
3731
- const computedFloatingStyles = useMemo(() => {
3732
- var _a2;
3733
- return {
3734
- ...floatingStyles,
3735
- visibility: ((_a2 = middlewareData.hide) == null ? void 0 : _a2.referenceHidden) ? "hidden" : "visible"
3736
- };
3737
- }, [floatingStyles, (_a = middlewareData.hide) == null ? void 0 : _a.referenceHidden]);
3738
- return /* @__PURE__ */ jsx(FloatingNode, { id: nodeId, children: open && /* @__PURE__ */ jsx(FloatingPortal, { children: /* @__PURE__ */ jsx(FloatingFocusManager, { context, initialFocus: wrapperRef, children: /* @__PURE__ */ jsx(FloatingList, { elementsRef, children: /* @__PURE__ */ jsx(
3739
- MenuContentContext.Provider,
3740
- {
3741
- value: {
3742
- getItemProps,
3743
- activeIndex,
3744
- setActiveIndex,
3745
- elementsRef,
3746
- open,
3747
- setOpen,
3748
- refs,
3749
- size: size2,
3750
- radius,
3751
- accentColor,
3752
- variant
3753
- },
3754
- children: /* @__PURE__ */ jsx(
3755
- "div",
3756
- {
3757
- className: "outline-none",
3758
- ref: mergeRefs2,
3759
- style: computedFloatingStyles,
3760
- ...getFloatingProps(),
3761
- children: /* @__PURE__ */ jsx(
3762
- "ul",
3763
- {
3764
- className: cx(
3765
- "overmap-menu-sub-content",
3766
- menuContent({ size: size2 }),
3767
- floating({ side, shadow: "3" }),
3768
- radiusCva({ radius, maxLarge: true }),
3769
- "max-h-(--overmap-menu-available-height)"
3770
- ),
3771
- ref: forwardedRef,
3772
- "data-state": getOpenState(open),
3773
- "data-side": side,
3774
- "data-accent-color": accentColor,
3775
- ...rest,
3776
- children
3777
- }
3778
- )
3779
- }
3780
- )
3781
- }
3782
- ) }) }) }) });
3783
- });
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,
3791
- {
3792
- ref: mergedRefs,
3793
- closeOnSelect: false,
3794
- "aria-haspopup": "menu",
3795
- "data-state": getOpenState(open),
3796
- disabled,
3797
- ...getReferenceProps(rest),
3798
- children
4256
+ children: /* @__PURE__ */ jsx(SelectedIndicatorContext, { value: isSelected, children })
3799
4257
  }
3800
4258
  );
3801
4259
  });
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);
3816
- }
3817
- }, [disabled, refs, setOpen, virtualElement]);
3818
- return null;
3819
- });
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
4260
+ const MenuV2Separator = memo((props) => {
4261
+ const { ref, className, ...rest } = props;
4262
+ const { size: size2 } = use(MenuRootContext);
4263
+ return /* @__PURE__ */ jsx(RadixSeparator.Root, { className: cx(menuSeparatorCva({ size: size2 }), className), ref, ...rest });
4264
+ });
4265
+ MenuV2Separator.displayName = "MenuSeparator";
4266
+ const MenuV2 = {
4267
+ Root: MenuV2Root,
4268
+ Group: MenuV2Group,
4269
+ GroupLabel: MenuV2GroupLabel,
4270
+ Item: MenuV2Item,
4271
+ Separator: MenuV2Separator,
4272
+ SelectGroup: MenuV2SelectGroup,
4273
+ SelectItem: MenuV2SelectItem,
4274
+ MultiSelectGroup: MenuV2MultiSelectGroup,
4275
+ MultiSelectItem: MenuV2MultiSelectItem,
4276
+ SelectAllItem: MenuV2SelectAllItem,
4277
+ SelectedIndicator: MenuV2SelectedIndicator,
4278
+ CheckboxItem: MenuV2CheckboxItem,
4279
+ CheckedIndicator: MenuV2CheckedIndicator,
4280
+ Pages: MenuV2Pages,
4281
+ Page: MenuV2Page,
4282
+ PageTriggerItem: MenuV2PageTriggerItem
3857
4283
  };
3858
4284
  const OneTimePasswordFieldHiddenInput = memo((props) => {
3859
4285
  return /* @__PURE__ */ jsx(RadixOneTimePasswordField.HiddenInput, { ...props });
@@ -4022,9 +4448,9 @@ const ErrorFallback = memo((props) => {
4022
4448
  }, [onRetry, resetBoundary]);
4023
4449
  return /* @__PURE__ */ jsxs("div", { className: "flex w-full gap-2", style: outerFlexStyles, children: [
4024
4450
  /* @__PURE__ */ jsx("div", { style: { flexGrow: 1 } }),
4025
- /* @__PURE__ */ jsx(LuIcon, { icon: "alert-triangle", size: height, style: centerStyles }),
4451
+ /* @__PURE__ */ jsx(LuIcon, { icon: AlertTriangle, size: height, style: centerStyles }),
4026
4452
  /* @__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 }) }),
4453
+ /* @__PURE__ */ jsx(IconButton, { "aria-label": "Try again", variant: "soft", onClick: handleRetry, style: centerStyles, children: /* @__PURE__ */ jsx(LuIcon, { icon: RotateCcw, size: height }) }),
4028
4454
  /* @__PURE__ */ jsx("div", { style: { flexGrow: 1 } })
4029
4455
  ] });
4030
4456
  });
@@ -4373,6 +4799,65 @@ const RadioGroup = {
4373
4799
  Item: RadioGroupItem,
4374
4800
  Root: RadioGroupRoot
4375
4801
  };
4802
+ const RatingRootContext = createContext({});
4803
+ const RatingItemContext = createContext({});
4804
+ const RatingItem = memo((props) => {
4805
+ const { ref, children, value, ...rest } = props;
4806
+ const { value: activeValue } = use(RatingRootContext);
4807
+ const active = !!activeValue && value <= activeValue;
4808
+ const contextValue = useMemo(() => ({ value }), [value]);
4809
+ return /* @__PURE__ */ jsx(RadixRadioGroup.Item, { ref, value: value.toString(), "data-active": active, ...rest, children: /* @__PURE__ */ jsx(RatingItemContext, { value: contextValue, children }) });
4810
+ });
4811
+ RatingItem.displayName = "RatingItem";
4812
+ const RatingItemIndicator = memo((props) => {
4813
+ const { ref, children, forceMount, ...rest } = props;
4814
+ const { value: activeValue } = use(RatingRootContext);
4815
+ const { value } = use(RatingItemContext);
4816
+ const active = !!activeValue && value <= activeValue;
4817
+ return /* @__PURE__ */ jsx(
4818
+ RadixRadioGroup.Indicator,
4819
+ {
4820
+ ref,
4821
+ forceMount: forceMount ?? (active || void 0),
4822
+ "data-active": active,
4823
+ ...rest,
4824
+ children
4825
+ }
4826
+ );
4827
+ });
4828
+ RatingItemIndicator.displayName = "RatingItemIndicator";
4829
+ const RatingRoot = memo((props) => {
4830
+ const { ref, children, defaultValue, value: controlledValue, onValueChange, ...rest } = props;
4831
+ const [value, setValue] = useControlledState(defaultValue ?? null, controlledValue, onValueChange);
4832
+ const handleValueChange = useCallback(
4833
+ (value2) => {
4834
+ setValue(parseInt(value2));
4835
+ },
4836
+ [setValue]
4837
+ );
4838
+ const contextValue = useMemo(
4839
+ () => ({
4840
+ value
4841
+ }),
4842
+ [value]
4843
+ );
4844
+ return /* @__PURE__ */ jsx(
4845
+ RadixRadioGroup.Root,
4846
+ {
4847
+ ref,
4848
+ value: value ? value.toString() : null,
4849
+ onValueChange: handleValueChange,
4850
+ ...rest,
4851
+ children: /* @__PURE__ */ jsx(RatingRootContext, { value: contextValue, children })
4852
+ }
4853
+ );
4854
+ });
4855
+ RatingRoot.displayName = "RatingRoot";
4856
+ const Rating = {
4857
+ Item: RatingItem,
4858
+ ItemIndicator: RatingItemIndicator,
4859
+ Root: RatingRoot
4860
+ };
4376
4861
  const segmentedControlRootCva = cva(
4377
4862
  ["shrink-0", "transition-colors", "inline-flex", "box-border", "min-w-max", "text-center"],
4378
4863
  {
@@ -5641,7 +6126,7 @@ const _Toast = function Toast2(props) {
5641
6126
  action && /* @__PURE__ */ jsx(RadixToast.Action, { className: "w-max", altText: action.altText, asChild: true, children: action.content })
5642
6127
  ] })
5643
6128
  ] }),
5644
- /* @__PURE__ */ jsx(RadixToast.Close, { asChild: true, children: /* @__PURE__ */ jsx(IconButton, { size: size2, "aria-label": "Close", variant: "ghost", accentColor, children: /* @__PURE__ */ jsx(LuIcon, { icon: "x" }) }) })
6129
+ /* @__PURE__ */ jsx(RadixToast.Close, { asChild: true, children: /* @__PURE__ */ jsx(IconButton, { size: size2, "aria-label": "Close", variant: "ghost", accentColor, children: /* @__PURE__ */ jsx(LuIcon, { icon: X }) }) })
5645
6130
  ]
5646
6131
  }
5647
6132
  );
@@ -6150,7 +6635,6 @@ export {
6150
6635
  CheckboxGroupSelectAllItem,
6151
6636
  CheckboxIndicator,
6152
6637
  CheckboxRoot,
6153
- CollapsibleTree,
6154
6638
  CommandMenu,
6155
6639
  CommandMenuCheckboxIndicator,
6156
6640
  CommandMenuCheckboxItem,
@@ -6191,10 +6675,12 @@ export {
6191
6675
  InputSlot,
6192
6676
  Layout,
6193
6677
  LayoutContainer,
6194
- LayoutContext,
6195
6678
  LayoutRoot,
6196
- LayoutSlideOut,
6679
+ LayoutSlideOutClose,
6680
+ LayoutSlideOutContent,
6681
+ LayoutSlideOutHandle,
6197
6682
  LayoutSlideOutOverlay,
6683
+ LayoutSlideOutRoot,
6198
6684
  LayoutSlideOutTrigger,
6199
6685
  Link,
6200
6686
  LuIcon,
@@ -6225,6 +6711,23 @@ export {
6225
6711
  MenuSub,
6226
6712
  MenuSubContent,
6227
6713
  MenuSubTrigger,
6714
+ MenuV2,
6715
+ MenuV2CheckboxItem,
6716
+ MenuV2CheckedIndicator,
6717
+ MenuV2Group,
6718
+ MenuV2GroupLabel,
6719
+ MenuV2Item,
6720
+ MenuV2MultiSelectGroup,
6721
+ MenuV2MultiSelectItem,
6722
+ MenuV2Page,
6723
+ MenuV2PageTriggerItem,
6724
+ MenuV2Pages,
6725
+ MenuV2Root,
6726
+ MenuV2SelectAllItem,
6727
+ MenuV2SelectGroup,
6728
+ MenuV2SelectItem,
6729
+ MenuV2SelectedIndicator,
6730
+ MenuV2Separator,
6228
6731
  MenuVirtualTrigger,
6229
6732
  OneTimePasswordField,
6230
6733
  OneTimePasswordFieldHiddenInput,
@@ -6250,6 +6753,10 @@ export {
6250
6753
  RadioGroupIndicator,
6251
6754
  RadioGroupItem,
6252
6755
  RadioGroupRoot,
6756
+ Rating,
6757
+ RatingItem,
6758
+ RatingItemIndicator,
6759
+ RatingRoot,
6253
6760
  SegmentedControl,
6254
6761
  SegmentedControlItem,
6255
6762
  SegmentedControlRoot,
@@ -6257,9 +6764,15 @@ export {
6257
6764
  SegmentedTabsList,
6258
6765
  SegmentedTabsRoot,
6259
6766
  SegmentedTabsTrigger,
6260
- SelectedIndicatorContext,
6261
6767
  Separator,
6262
6768
  SlideOut,
6769
+ SlideOutClose,
6770
+ SlideOutContent,
6771
+ SlideOutHandle,
6772
+ SlideOutOverlay,
6773
+ SlideOutRoot,
6774
+ SlideOutTrigger,
6775
+ SlideOutViewport,
6263
6776
  Slider,
6264
6777
  Spinner,
6265
6778
  Switch,
@@ -6294,6 +6807,12 @@ export {
6294
6807
  badge,
6295
6808
  buttonCva,
6296
6809
  floating,
6810
+ genericMemo,
6811
+ getActiveState,
6812
+ getBooleanState,
6813
+ getCheckedState,
6814
+ getOpenState,
6815
+ getSelectedState,
6297
6816
  mergeRefs,
6298
6817
  radiusCva,
6299
6818
  stopPropagation,
@@ -6301,15 +6820,9 @@ export {
6301
6820
  useAlertDialog,
6302
6821
  useButtonGroup,
6303
6822
  useControlledState,
6823
+ useFallbackId,
6304
6824
  useLayoutContext,
6305
- useMenuContentContext,
6306
- useMenuContext,
6307
- usePagesContext,
6308
6825
  useProvider,
6309
- useSelectedIndicatorContext,
6310
- useSize,
6311
- useStopEventPropagation,
6312
- useSubContext,
6313
6826
  useTextFilter,
6314
6827
  useToast,
6315
6828
  useViewportSize