@overmap-ai/blocks 1.0.40-improvements.1 → 1.0.40

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 (114) hide show
  1. package/dist/ButtonGroup/ButtonGroup.d.ts +2 -1
  2. package/dist/ButtonGroup/context.d.ts +7 -2
  3. package/dist/CheckboxGroup/context.d.ts +6 -2
  4. package/dist/CheckboxGroup/utils.d.ts +1 -0
  5. package/dist/CheckedIndicator/CheckedIndicator.d.ts +3 -4
  6. package/dist/CollapsibleTree/CollapsibleTree.d.ts +5 -0
  7. package/dist/CollapsibleTree/context.d.ts +11 -0
  8. package/dist/CollapsibleTree/index.d.ts +2 -0
  9. package/dist/CollapsibleTree/typings.d.ts +58 -0
  10. package/dist/CommandMenu/CheckboxIndicator.d.ts +4 -2
  11. package/dist/CommandMenu/SelectedIndicator.d.ts +3 -2
  12. package/dist/CommandMenu/context.d.ts +3 -2
  13. package/dist/CommandMenu/utils.d.ts +4 -0
  14. package/dist/Heading/cva.d.ts +1 -1
  15. package/dist/HoverUtility/HoverUtility.d.ts +2 -2
  16. package/dist/Link/cva.d.ts +1 -1
  17. package/dist/Menu/{CheckboxItem.d.ts → CheckboxItem/CheckboxItem.d.ts} +1 -1
  18. package/dist/Menu/{CheckboxItemIndicator.d.ts → CheckboxItemIndicator/CheckboxItemIndicator.d.ts} +1 -1
  19. package/dist/Menu/{ClickTrigger.d.ts → ClickTrigger/ClickTrigger.d.ts} +1 -1
  20. package/dist/Menu/ClickTrigger/index.d.ts +1 -0
  21. package/dist/Menu/{Content.d.ts → Content/Content.d.ts} +1 -1
  22. package/dist/Menu/{menuContentContext.d.ts → Content/context.d.ts} +2 -2
  23. package/dist/Menu/Content/index.d.ts +2 -0
  24. package/dist/Menu/{ContextTrigger.d.ts → ContextTrigger/ContextTrigger.d.ts} +1 -1
  25. package/dist/Menu/ContextTrigger/index.d.ts +1 -0
  26. package/dist/Menu/{Group.d.ts → Group/Group.d.ts} +1 -1
  27. package/dist/Menu/Group/index.d.ts +1 -0
  28. package/dist/Menu/{InputField.d.ts → Input/Field.d.ts} +1 -1
  29. package/dist/Menu/{InputRoot.d.ts → Input/Root.d.ts} +1 -1
  30. package/dist/Menu/{InputSlot.d.ts → Input/Slot.d.ts} +1 -1
  31. package/dist/Menu/Input/index.d.ts +3 -0
  32. package/dist/Menu/{Item.d.ts → Item/Item.d.ts} +1 -1
  33. package/dist/Menu/Item/index.d.ts +1 -0
  34. package/dist/Menu/Label/index.d.ts +1 -0
  35. package/dist/Menu/{MultiSelectGroup.d.ts → MultiSelectGroup/MultiSelectGroup.d.ts} +1 -1
  36. package/dist/Menu/MultiSelectGroup/index.d.ts +1 -0
  37. package/dist/Menu/{MultiSelectItem.d.ts → MultiSelectItem/MultiSelectItem.d.ts} +1 -1
  38. package/dist/Menu/MultiSelectItem/index.d.ts +1 -0
  39. package/dist/Menu/PageContent/PageContent.d.ts +3 -0
  40. package/dist/Menu/PageContent/index.d.ts +1 -0
  41. package/dist/Menu/{PageTrigger.d.ts → PageTrigger/PageTrigger.d.ts} +1 -1
  42. package/dist/Menu/PageTrigger/index.d.ts +1 -0
  43. package/dist/Menu/{Pages.d.ts → Pages/Pages.d.ts} +1 -1
  44. package/dist/Menu/Pages/index.d.ts +2 -0
  45. package/dist/Menu/{Scroll.d.ts → Scroll/Scroll.d.ts} +1 -1
  46. package/dist/Menu/{SelectAllItem.d.ts → SelectAll/SelectAllItem.d.ts} +1 -1
  47. package/dist/Menu/SelectAll/index.d.ts +1 -0
  48. package/dist/Menu/{SelectGroup.d.ts → SelectGroup/SelectGroup.d.ts} +1 -1
  49. package/dist/Menu/SelectGroup/index.d.ts +1 -0
  50. package/dist/Menu/{SelectItem.d.ts → SelectItem/SelectItem.d.ts} +1 -1
  51. package/dist/Menu/SelectItem/index.d.ts +1 -0
  52. package/dist/Menu/SelectedIndicator/SelectedIndicator.d.ts +4 -0
  53. package/dist/{SelectedIndicator → Menu/SelectedIndicator}/context.d.ts +1 -0
  54. package/dist/Menu/SelectedIndicator/index.d.ts +2 -0
  55. package/dist/Menu/{Separator.d.ts → Separator/Separator.d.ts} +1 -1
  56. package/dist/Menu/Separator/index.d.ts +1 -0
  57. package/dist/Menu/{Sub.d.ts → Sub/Sub.d.ts} +1 -1
  58. package/dist/Menu/{subContentContext.d.ts → Sub/context.d.ts} +1 -1
  59. package/dist/Menu/Sub/index.d.ts +2 -0
  60. package/dist/Menu/{SubContent.d.ts → SubContent/SubContent.d.ts} +1 -1
  61. package/dist/Menu/SubContent/index.d.ts +1 -0
  62. package/dist/Menu/{SubTrigger.d.ts → SubTrigger/SubTrigger.d.ts} +1 -1
  63. package/dist/Menu/SubTrigger/index.d.ts +1 -0
  64. package/dist/Menu/{VirtualTrigger.d.ts → VirtualTrigger/VirtualTrigger.d.ts} +1 -1
  65. package/dist/Menu/VirtualTrigger/index.d.ts +1 -0
  66. package/dist/Menu/index.d.ts +7 -9
  67. package/dist/Menu/{Root.d.ts → root/Root.d.ts} +1 -1
  68. package/dist/Menu/{rootContext.d.ts → root/context.d.ts} +1 -1
  69. package/dist/Menu/root/index.d.ts +2 -0
  70. package/dist/Menu/utils.d.ts +6 -0
  71. package/dist/Rating/Item.d.ts +6 -0
  72. package/dist/Rating/ItemIndicator.d.ts +5 -0
  73. package/dist/Rating/Root.d.ts +8 -0
  74. package/dist/Rating/context.d.ts +9 -0
  75. package/dist/Rating/index.d.ts +9 -0
  76. package/dist/SlideOut/SlideOut.d.ts +2 -1
  77. package/dist/Text/cva.d.ts +1 -1
  78. package/dist/blocks.js +981 -1262
  79. package/dist/blocks.js.map +1 -1
  80. package/dist/blocks.umd.cjs +1050 -1331
  81. package/dist/blocks.umd.cjs.map +1 -1
  82. package/dist/index.d.ts +3 -3
  83. package/dist/typings.d.ts +5 -0
  84. package/dist/utils.d.ts +30 -7
  85. package/package.json +1 -1
  86. package/dist/Menu/PageContent.d.ts +0 -2
  87. package/dist/Menu/SelectedIndicator.d.ts +0 -4
  88. package/dist/MenuV2/CheckboxItem.d.ts +0 -6
  89. package/dist/MenuV2/CheckboxItemIndicator.d.ts +0 -3
  90. package/dist/MenuV2/Group.d.ts +0 -4
  91. package/dist/MenuV2/GroupLabel.d.ts +0 -4
  92. package/dist/MenuV2/Item.d.ts +0 -6
  93. package/dist/MenuV2/MultiSelectAllItem.d.ts +0 -4
  94. package/dist/MenuV2/MultiSelectGroup.d.ts +0 -5
  95. package/dist/MenuV2/MultiSelectItem.d.ts +0 -5
  96. package/dist/MenuV2/Page.d.ts +0 -5
  97. package/dist/MenuV2/PageTriggerItem.d.ts +0 -5
  98. package/dist/MenuV2/Pages.d.ts +0 -7
  99. package/dist/MenuV2/Root.d.ts +0 -6
  100. package/dist/MenuV2/SelectGroup.d.ts +0 -4
  101. package/dist/MenuV2/SelectItem.d.ts +0 -5
  102. package/dist/MenuV2/SelectedIndicator.d.ts +0 -3
  103. package/dist/MenuV2/Separator.d.ts +0 -5
  104. package/dist/MenuV2/constants.d.ts +0 -9
  105. package/dist/MenuV2/context.d.ts +0 -17
  106. package/dist/MenuV2/cva.d.ts +0 -14
  107. package/dist/MenuV2/index.d.ts +0 -36
  108. package/dist/MenuV2/typings.d.ts +0 -9
  109. package/dist/MenuV2/utils.d.ts +0 -1
  110. package/dist/SelectedIndicator/SelectedIndicator.d.ts +0 -5
  111. package/dist/SelectedIndicator/index.d.ts +0 -2
  112. package/dist/hooks.d.ts +0 -20
  113. /package/dist/Menu/{Label.d.ts → Label/Label.d.ts} +0 -0
  114. /package/dist/Menu/{menuPagesContext.d.ts → Pages/context.d.ts} +0 -0
package/dist/blocks.js CHANGED
@@ -1,10 +1,12 @@
1
1
  import * as RadixAlertDialog from "@radix-ui/react-alert-dialog";
2
2
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
3
3
  import { cva, cx } from "class-variance-authority";
4
- import { createContext, useContext, memo, useMemo, useState, useCallback, useEffect, useId, useLayoutEffect, use, useRef } from "react";
4
+ import * as React from "react";
5
+ import React__default, { createContext, useContext, memo, useMemo, useState, useCallback, useEffect, useLayoutEffect, use, useRef } from "react";
5
6
  import * as RadixAvatar from "@radix-ui/react-avatar";
6
7
  import * as RadixCheckbox from "@radix-ui/react-checkbox";
7
8
  import { useMediaQuery } from "react-responsive";
9
+ import * as RadixPrimitiveCollapsible from "@radix-ui/react-collapsible";
8
10
  import { CommandItem, CommandRoot, CommandEmpty, CommandGroup, CommandInput, useCommandState, CommandList, CommandSeparator } from "cmdk";
9
11
  import * as RadixDialog from "@radix-ui/react-dialog";
10
12
  import { DialogPortal, DialogContent as DialogContent$1, DialogTitle, DialogDescription, DialogOverlay as DialogOverlay$1, DialogTrigger } from "@radix-ui/react-dialog";
@@ -14,7 +16,7 @@ import * as RadixHoverCard from "@radix-ui/react-hover-card";
14
16
  import { CSSTransition } from "react-transition-group";
15
17
  import ReactDOM from "react-dom";
16
18
  import { Slot } from "@radix-ui/react-slot";
17
- 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";
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
20
  import * as RadixSeparator from "@radix-ui/react-separator";
19
21
  import * as RadixOneTimePasswordField from "@radix-ui/react-one-time-password-field";
20
22
  import { useErrorBoundary, ErrorBoundary } from "react-error-boundary";
@@ -786,6 +788,82 @@ const Checkbox = {
786
788
  };
787
789
  const SelectContext = createContext({});
788
790
  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;
789
867
  const useViewportSize = (props) => {
790
868
  const { xs: xsProps, sm: smProps, md: mdProps, lg: lgProps, xl: xlProps } = props;
791
869
  const [prevSize, setPrevSize] = useState("initial");
@@ -803,14 +881,33 @@ const useViewportSize = (props) => {
803
881
  }, [lg, md, sm, xl, xs]);
804
882
  return { size: size2, prevSize, xs, sm, md, lg, xl };
805
883
  };
806
- function useTextFilter(items, filterFunction) {
884
+ const useStopEventPropagation = () => {
885
+ return useCallback((event) => {
886
+ event.stopPropagation();
887
+ }, []);
888
+ };
889
+ function useTextFilter(values, filterFunction) {
807
890
  const [filteredOptions, setFilteredOptions] = useState([]);
808
891
  const [filterValue, setFilterValue] = useState("");
809
892
  useEffect(() => {
810
- setFilteredOptions(items.filter((value) => filterFunction(value, filterValue)));
811
- }, [filterFunction, filterValue, items]);
893
+ setFilteredOptions(values.filter((value) => filterFunction(value, filterValue)));
894
+ }, [filterFunction, filterValue, values]);
812
895
  return [filteredOptions, filterValue, setFilterValue];
813
896
  }
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;
814
911
  function useControlledState(initialState, state, setState) {
815
912
  const [uncontrolledState, setUncontrolledState] = useState(initialState);
816
913
  const handleStateChange = useCallback(
@@ -827,34 +924,26 @@ function useControlledState(initialState, state, setState) {
827
924
  }, [state]);
828
925
  return [state ?? uncontrolledState, handleStateChange];
829
926
  }
830
- function useFallbackId(id) {
831
- const fallbackId = useId();
832
- return id ?? fallbackId;
833
- }
834
- const genericMemo = memo;
835
927
  function mergeRefs(refs) {
836
928
  return (value) => {
837
- const cleanups = refs.reduce(
838
- (cleanups2, ref) => {
839
- if (typeof ref === "function") {
840
- const cleanup = ref(value);
841
- if (typeof cleanup === "function") {
842
- cleanups2.push(cleanup);
843
- } else {
844
- cleanups2.push(() => {
845
- ref(null);
846
- });
847
- }
848
- } else if (ref != null) {
849
- ref.current = 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 {
850
935
  cleanups2.push(() => {
851
- ref.current = null;
936
+ ref(null);
852
937
  });
853
938
  }
854
- return cleanups2;
855
- },
856
- []
857
- );
939
+ } else if (ref != null) {
940
+ ref.current = value;
941
+ cleanups2.push(() => {
942
+ ref.current = null;
943
+ });
944
+ }
945
+ return cleanups2;
946
+ }, []);
858
947
  return () => {
859
948
  cleanups.forEach((cleanup) => {
860
949
  cleanup();
@@ -865,21 +954,6 @@ function mergeRefs(refs) {
865
954
  const stopPropagation = (e) => {
866
955
  e.stopPropagation();
867
956
  };
868
- function getSelectedState(selected) {
869
- return selected ? "selected" : "unselected";
870
- }
871
- function getCheckedState(checked) {
872
- return checked === true ? "checked" : checked === false ? "unchecked" : "indeterminate";
873
- }
874
- function getActiveState(active) {
875
- return active ? "active" : "inactive";
876
- }
877
- function getBooleanState(value) {
878
- return value ? "true" : "false";
879
- }
880
- function getOpenState(open) {
881
- return open ? "open" : "closed";
882
- }
883
957
  const MultiSelectProvider = genericMemo(function MultiSelectProvider2(props) {
884
958
  const { children, defaultValues, values: controlledValues, onValuesChange } = props;
885
959
  const [itemValueMapping, setItemValueMapping] = useState(/* @__PURE__ */ new Set());
@@ -962,8 +1036,8 @@ const CheckboxGroupItem = memo((props) => {
962
1036
  ref,
963
1037
  className,
964
1038
  value,
1039
+ accentColor,
965
1040
  disabled,
966
- accentColor = groupContext.accentColor,
967
1041
  variant = groupContext.variant,
968
1042
  size: size2 = groupContext.size,
969
1043
  radius = groupContext.radius,
@@ -1000,6 +1074,9 @@ const CheckboxGroupItemIndicator = memo((props) => {
1000
1074
  return /* @__PURE__ */ jsx(RadixCheckbox.Indicator, { className: cx("flex items-center justify-center", className), ref, ...rest });
1001
1075
  });
1002
1076
  CheckboxGroupItemIndicator.displayName = "CheckboxGroupItemIndicator";
1077
+ function getBooleanState$1(value) {
1078
+ return value ? "true" : "false";
1079
+ }
1003
1080
  const CheckboxGroupRoot = memo((props) => {
1004
1081
  const providerContext = useProvider();
1005
1082
  const {
@@ -1022,22 +1099,20 @@ const CheckboxGroupRoot = memo((props) => {
1022
1099
  name,
1023
1100
  required,
1024
1101
  disabled,
1025
- // style props
1026
- accentColor,
1027
1102
  size: size2,
1028
1103
  variant,
1029
1104
  radius
1030
1105
  }),
1031
- [accentColor, disabled, name, radius, required, size2, variant]
1106
+ [disabled, name, radius, required, size2, variant]
1032
1107
  );
1033
1108
  return /* @__PURE__ */ jsx(
1034
1109
  "div",
1035
1110
  {
1036
1111
  ref,
1037
1112
  role: "group",
1038
- "data-disabled": getBooleanState(!!disabled),
1113
+ "data-disabled": getBooleanState$1(!!disabled),
1039
1114
  "data-accent-color": accentColor,
1040
- "aria-disabled": getBooleanState(!!disabled),
1115
+ "aria-disabled": getBooleanState$1(!!disabled),
1041
1116
  ...rest,
1042
1117
  children: /* @__PURE__ */ jsx(CheckboxGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(
1043
1118
  MultiSelectProvider,
@@ -1057,8 +1132,8 @@ const CheckboxGroupSelectAllItem = memo((props) => {
1057
1132
  const {
1058
1133
  ref,
1059
1134
  className,
1135
+ accentColor,
1060
1136
  disabled,
1061
- accentColor = groupContext.accentColor,
1062
1137
  variant = groupContext.variant,
1063
1138
  size: size2 = groupContext.size,
1064
1139
  radius = groupContext.radius,
@@ -1089,39 +1164,137 @@ const CheckboxGroup = {
1089
1164
  SelectAllItem: CheckboxGroupSelectAllItem,
1090
1165
  ItemIndicator: CheckboxGroupItemIndicator
1091
1166
  };
1092
- const CheckedIndicatorContext = createContext({});
1093
- const CheckedIndicator = memo((props) => {
1094
- const { children, ref, className, ...rest } = props;
1095
- const checked = useContext(CheckedIndicatorContext);
1096
- const computedChildren = typeof children === "function" ? children(checked) : children;
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]);
1097
1280
  return /* @__PURE__ */ jsx(
1098
1281
  "span",
1099
1282
  {
1100
1283
  ref,
1284
+ "data-state": getCheckedState$1(checkedState),
1101
1285
  className: cx(
1102
- "flex size-max items-center",
1286
+ "inline-block size-max",
1103
1287
  {
1104
- invisible: checked === false
1288
+ invisible: checkedState === false
1105
1289
  },
1106
1290
  className
1107
1291
  ),
1108
- "data-state": getCheckedState(checked),
1109
1292
  ...rest,
1110
1293
  children: computedChildren
1111
1294
  }
1112
1295
  );
1113
1296
  });
1114
- CheckedIndicator.displayName = "CheckedIndicator";
1115
- const CommandMenuCheckboxIndicator = memo((props) => {
1116
- const { ref, children, ...rest } = props;
1117
- return /* @__PURE__ */ jsx(CheckedIndicator, { ref, ...rest, children });
1118
- });
1119
1297
  CommandMenuCheckboxIndicator.displayName = "CommandMenuCheckboxIndicator";
1120
- const CommandMenuContext = createContext({});
1121
- const SelectedIndicatorContext$1 = createContext(false);
1122
- const CheckboxIndicatorContext = createContext(false);
1123
- const CommandMenuPageContext = createContext({});
1124
- const CommandMenuDialogContext = createContext({});
1125
1298
  const commandMenuContentCva = cva(
1126
1299
  [
1127
1300
  "ring",
@@ -1358,7 +1531,7 @@ const CommandMenuCheckboxItem = memo((props) => {
1358
1531
  onSelect == null ? void 0 : onSelect();
1359
1532
  onCheckedChange(checked !== true);
1360
1533
  }, [checked, onCheckedChange, onSelect]);
1361
- return /* @__PURE__ */ jsx(CheckboxIndicatorContext, { value: checked, children: /* @__PURE__ */ jsx(CommandMenuItem, { ref, onSelect: handleSelect, "data-state": getCheckedState(checked), ...rest, children }) });
1534
+ return /* @__PURE__ */ jsx(CheckboxIndicatorContext, { value: checked, children: /* @__PURE__ */ jsx(CommandMenuItem, { ref, onSelect: handleSelect, "data-state": getCheckedState$1(checked), ...rest, children }) });
1362
1535
  });
1363
1536
  CommandMenuCheckboxItem.displayName = "CommandMenuCheckboxItem";
1364
1537
  const CommandMenuContent = memo((props) => {
@@ -1385,10 +1558,9 @@ const CommandMenuContent = memo((props) => {
1385
1558
  return {
1386
1559
  variant,
1387
1560
  size: size2,
1388
- radius,
1389
- accentColor
1561
+ radius
1390
1562
  };
1391
- }, [accentColor, radius, size2, variant]);
1563
+ }, [radius, size2, variant]);
1392
1564
  return /* @__PURE__ */ jsx(DialogPortal, { children: /* @__PURE__ */ jsx(
1393
1565
  DialogContent$1,
1394
1566
  {
@@ -1475,7 +1647,7 @@ const CommandMenuMultiSelectItem = genericMemo(function(props) {
1475
1647
  {
1476
1648
  ref,
1477
1649
  onSelect: handleSelect,
1478
- "data-state": getSelectedState(isSelected),
1650
+ "data-state": getSelectedState$1(isSelected),
1479
1651
  "aria-selected": isSelected,
1480
1652
  closeOnSelect,
1481
1653
  ...rest,
@@ -1549,7 +1721,7 @@ const CommandMenuRadioItem = genericMemo(function(props) {
1549
1721
  selectValue(value);
1550
1722
  }, [onSelect, selectValue, value]);
1551
1723
  const isSelected = selected(value);
1552
- return /* @__PURE__ */ jsx(SelectedIndicatorContext$1, { value: isSelected, children: /* @__PURE__ */ jsx(CommandMenuItem, { ref, onSelect: handleSelect, "data-state": getSelectedState(isSelected), ...rest, children }) });
1724
+ return /* @__PURE__ */ jsx(SelectedIndicatorContext$1, { value: isSelected, children: /* @__PURE__ */ jsx(CommandMenuItem, { ref, onSelect: handleSelect, "data-state": getSelectedState$1(isSelected), ...rest, children }) });
1553
1725
  });
1554
1726
  const CommandMenuRoot = memo((props) => {
1555
1727
  const { children, defaultOpen, open: controlledOpen, onOpenChange, modal } = props;
@@ -1577,39 +1749,35 @@ const CommandMenuSelectAllItem = genericMemo(function(props) {
1577
1749
  ref,
1578
1750
  role: "menuitemcheckbox",
1579
1751
  onSelect: handleSelect,
1580
- "data-state": getCheckedState(selectedState),
1752
+ "data-state": getCheckedState$1(selectedState),
1581
1753
  closeOnSelect,
1582
1754
  ...rest
1583
1755
  }
1584
1756
  ) });
1585
1757
  });
1586
- const SelectedIndicatorContext = createContext(false);
1587
- const SelectedIndicator = memo((props) => {
1588
- const { ref, children, className, ...rest } = props;
1589
- const isSelected = use(SelectedIndicatorContext);
1590
- const computedChildren = typeof children === "function" ? children(isSelected) : children;
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]);
1591
1764
  return /* @__PURE__ */ jsx(
1592
1765
  "span",
1593
1766
  {
1594
1767
  ref,
1768
+ "data-state": getSelectedState$1(isSelected),
1595
1769
  className: cx(
1596
- "flex size-max items-center",
1770
+ "inline-block size-max",
1597
1771
  {
1598
1772
  invisible: !isSelected
1599
1773
  },
1600
1774
  className
1601
1775
  ),
1602
- "data-state": getSelectedState(isSelected),
1603
1776
  ...rest,
1604
1777
  children: computedChildren
1605
1778
  }
1606
1779
  );
1607
1780
  });
1608
- SelectedIndicator.displayName = "SelectedIndicator";
1609
- const CommandMenuSelectedIndicator = memo((props) => {
1610
- const { ref, children, ...rest } = props;
1611
- return /* @__PURE__ */ jsx(SelectedIndicator, { ref, ...rest, children });
1612
- });
1613
1781
  CommandMenuSelectedIndicator.displayName = "CommandMenuSelectedIndicator";
1614
1782
  const CommandMenuSeparator = memo((props) => {
1615
1783
  const { className, ref, spacing = false, ...rest } = props;
@@ -2086,7 +2254,7 @@ const HoverCard = {
2086
2254
  Root: RadixHoverCard.Root,
2087
2255
  Trigger: RadixHoverCard.Trigger
2088
2256
  };
2089
- const HoverUtility = memo(({ children, forceHover }) => {
2257
+ const HoverUtility = memo(function Root({ children, forceHover }) {
2090
2258
  const [isHovered, setIsHovered] = useState(false);
2091
2259
  const handlePointerEnter = useCallback(() => {
2092
2260
  setIsHovered(true);
@@ -2100,7 +2268,6 @@ const HoverUtility = memo(({ children, forceHover }) => {
2100
2268
  onPointerLeave: handlePointerLeave
2101
2269
  });
2102
2270
  });
2103
- HoverUtility.displayName = "HoverUtility";
2104
2271
  const InputContext = createContext({});
2105
2272
  const inputRoot$1 = cva(
2106
2273
  [
@@ -2579,6 +2746,40 @@ const LayoutSlideOutOverlay = memo((props) => {
2579
2746
  return showOverlay && /* @__PURE__ */ jsx("div", { className: cx("overmap-layout-overlay", "fixed inset-0", className), ref, ...rest, children });
2580
2747
  });
2581
2748
  LayoutSlideOutOverlay.displayName = "SlideOutOverlay";
2749
+ const MENU_OVERFLOW_PADDING = 20;
2750
+ const MENU_CONTENT_PADDING = 8;
2751
+ const MENU_MINIMUM_MAX_HEIGHT = 250;
2752
+ const computeOffsets = (side, alignment) => {
2753
+ switch (side) {
2754
+ case "right":
2755
+ if (alignment === "start") {
2756
+ return { mainAxis: MENU_CONTENT_PADDING + 1, crossAxis: -MENU_CONTENT_PADDING };
2757
+ } else if (alignment === "end") {
2758
+ return { mainAxis: MENU_CONTENT_PADDING + 1, crossAxis: MENU_CONTENT_PADDING };
2759
+ }
2760
+ break;
2761
+ case "left":
2762
+ if (alignment === "start") {
2763
+ return { mainAxis: MENU_CONTENT_PADDING + 1, crossAxis: -MENU_CONTENT_PADDING };
2764
+ } else if (alignment === "end") {
2765
+ return { mainAxis: MENU_CONTENT_PADDING + 1, crossAxis: MENU_CONTENT_PADDING };
2766
+ }
2767
+ break;
2768
+ }
2769
+ return { mainAxis: MENU_CONTENT_PADDING + 1, crossAxis: 0 };
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
+ }
2582
2783
  function nextStateBasedOnType(open, type) {
2583
2784
  switch (type) {
2584
2785
  case "toggle":
@@ -2674,6 +2875,28 @@ const Link = memo((props) => {
2674
2875
  );
2675
2876
  });
2676
2877
  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
+ };
2677
2900
  const menuItem = cva(
2678
2901
  [
2679
2902
  "select-none",
@@ -2819,115 +3042,100 @@ const inputRoot = cva(
2819
3042
  }
2820
3043
  }
2821
3044
  );
2822
- const MenuContentContext = createContext({});
2823
3045
  const MenuContext = createContext({});
2824
- const SubContext = createContext({});
2825
- const TRIGGER_SELECT_KEYS = ["Enter", " "];
2826
- const MenuItem = memo((props) => {
2827
- const rootMenuContext = use(MenuContext);
2828
- const { getItemProps, activeIndex, setOpen, size: size2, variant, radius } = use(MenuContentContext);
2829
- const { closeRoot } = use(SubContext);
3046
+ const useMenuContext = () => useContext(MenuContext);
3047
+ const DEFAULT_OFFSET = 5;
3048
+ const MenuRoot = memo((props) => {
2830
3049
  const {
2831
- ref: forwardedRef,
2832
- className,
2833
3050
  children,
2834
- onSelect,
2835
- onClick,
2836
- onKeyDown,
2837
- closeOnSelect = true,
2838
- disabled = false,
2839
- ...rest
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
2840
3060
  } = props;
2841
- const { ref, index } = useListItem();
2842
- const mergeRefs2 = useMergeRefs([ref, forwardedRef]);
2843
- const handleClick = useCallback(
2844
- (e) => {
2845
- e.stopPropagation();
2846
- if (disabled) return;
2847
- onClick == null ? void 0 : onClick(e);
2848
- onSelect == null ? void 0 : onSelect();
2849
- if (closeOnSelect) setOpen(false);
2850
- if (closeRoot) rootMenuContext.setOpen(false);
2851
- },
2852
- [closeOnSelect, closeRoot, disabled, rootMenuContext, onClick, onSelect, setOpen]
2853
- );
2854
- const handleKeyDown = useCallback(
2855
- (e) => {
2856
- if (disabled) return;
2857
- onKeyDown == null ? void 0 : onKeyDown(e);
2858
- if (TRIGGER_SELECT_KEYS.includes(e.key)) {
2859
- onSelect == null ? void 0 : onSelect();
2860
- if (closeOnSelect) setOpen(false);
2861
- }
2862
- },
2863
- [closeOnSelect, disabled, onKeyDown, onSelect, setOpen]
2864
- );
2865
- const isActive = useMemo(() => index === activeIndex, [activeIndex, index]);
2866
- const computedChildren = useMemo(() => {
2867
- return typeof children === "function" ? children({ active: isActive, selected: false }) : children;
2868
- }, [children, isActive]);
2869
- return /* @__PURE__ */ jsx(
2870
- "li",
2871
- {
2872
- className: cx(menuItem({ size: size2, variant }), radiusCva({ radius, maxLarge: true }), className),
2873
- ref: mergeRefs2,
2874
- role: "menuitem",
2875
- "data-disabled": getBooleanState(disabled),
2876
- "aria-disabled": disabled,
2877
- "data-highlighted": isActive ? "" : void 0,
2878
- ...getItemProps({
2879
- onClick: handleClick,
2880
- onKeyDown: handleKeyDown,
2881
- tabIndex: isActive ? 0 : -1,
2882
- ...rest
2883
- }),
2884
- children: computedChildren
2885
- }
2886
- );
2887
- });
2888
- MenuItem.displayName = "MenuItem";
2889
- const MenuCheckboxItem = memo((props) => {
2890
- const { ref, checked, onCheckedChange, onSelect, ...rest } = props;
2891
- const handleSelect = useCallback(() => {
2892
- onSelect == null ? void 0 : onSelect();
2893
- switch (checked) {
2894
- case true:
2895
- onCheckedChange(false);
2896
- break;
2897
- case "indeterminate":
2898
- case false:
2899
- onCheckedChange(true);
2900
- break;
2901
- }
2902
- }, [checked, onCheckedChange, onSelect]);
2903
- return /* @__PURE__ */ jsx(CheckedIndicatorContext.Provider, { value: checked, children: /* @__PURE__ */ jsx(MenuItem, { ref, onSelect: handleSelect, ...rest }) });
2904
- });
2905
- MenuCheckboxItem.displayName = "MenuCheckboxItem";
2906
- const MenuCheckboxItemIndicator = memo((props) => {
2907
- const { ref, children, ...rest } = props;
2908
- return /* @__PURE__ */ jsx(CheckedIndicator, { ref, ...rest, children });
2909
- });
2910
- MenuCheckboxItemIndicator.displayName = "MenuCheckboxItemIndicator";
2911
- const MenuClickTrigger = memo((props) => {
2912
- const { ref: forwardedRef, children, disabled = false } = props;
2913
- const { getReferenceProps, refs, setTriggerType, open } = use(MenuContext);
2914
- const mergedRefs = useMergeRefs([refs.setReference, forwardedRef]);
2915
- useEffect(() => {
2916
- setTriggerType("click");
2917
- }, [setTriggerType]);
2918
- return /* @__PURE__ */ jsx(
2919
- Slot,
3061
+ const [open, setOpen] = useControlledState(defaultOpen ?? false, controlledOpen, onOpenChange);
3062
+ const [activeIndex, setActiveIndex] = useState(null);
3063
+ const [triggerType, setTriggerType] = useState(null);
3064
+ const elementsRef = useRef([]);
3065
+ const nodeId = useFloatingNodeId();
3066
+ const { refs, floatingStyles, context, middlewareData } = useFloating({
3067
+ nodeId,
3068
+ strategy: "fixed",
3069
+ placement: side + (align !== "center" ? "-" + align : ""),
3070
+ whileElementsMounted: autoUpdate,
3071
+ open,
3072
+ onOpenChange: setOpen,
3073
+ middleware: [
3074
+ offset({ mainAxis: offset$1 ?? DEFAULT_OFFSET }),
3075
+ size({
3076
+ apply({ availableHeight, elements }) {
3077
+ elements.floating.style.setProperty(
3078
+ "--overmap-menu-available-height",
3079
+ `${Math.max(availableHeight, MENU_MINIMUM_MAX_HEIGHT)}px`
3080
+ );
3081
+ },
3082
+ padding: MENU_OVERFLOW_PADDING
3083
+ }),
3084
+ flip({ fallbackStrategy: "initialPlacement" }),
3085
+ shift({ padding: MENU_OVERFLOW_PADDING }),
3086
+ hide()
3087
+ ]
3088
+ });
3089
+ const role = useRole(context, {
3090
+ role: "menu"
3091
+ });
3092
+ const dismiss = useDismiss(context, {
3093
+ capture: true,
3094
+ ancestorScroll: triggerType === "context" || triggerType === "virtual"
3095
+ });
3096
+ const click = useClick(context, {
3097
+ enabled: triggerType === "click"
3098
+ });
3099
+ const listNavigation = useListNavigation(context, {
3100
+ listRef: elementsRef,
3101
+ activeIndex,
3102
+ onNavigate: setActiveIndex,
3103
+ loop
3104
+ });
3105
+ const { getFloatingProps, getItemProps, getReferenceProps } = useInteractions([
3106
+ dismiss,
3107
+ listNavigation,
3108
+ click,
3109
+ role
3110
+ ]);
3111
+ return /* @__PURE__ */ jsx(FloatingTree, { children: /* @__PURE__ */ jsx(
3112
+ MenuContext.Provider,
2920
3113
  {
2921
- ref: mergedRefs,
2922
- "aria-disabled": disabled,
2923
- "data-disabled": getBooleanState(disabled),
2924
- "data-state": getOpenState(open),
2925
- ...getReferenceProps({ disabled }),
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
+ },
2926
3132
  children
2927
3133
  }
2928
- );
3134
+ ) });
2929
3135
  });
2930
- MenuClickTrigger.displayName = "MenuClickTrigger";
3136
+ MenuRoot.displayName = "Root";
3137
+ const MenuContentContext = createContext({});
3138
+ const useMenuContentContext = () => useContext(MenuContentContext);
2931
3139
  const MenuContent = memo((props) => {
2932
3140
  var _a;
2933
3141
  const providerContext = useProvider();
@@ -2956,7 +3164,7 @@ const MenuContent = memo((props) => {
2956
3164
  floatingStyles,
2957
3165
  modal,
2958
3166
  side
2959
- } = use(MenuContext);
3167
+ } = useMenuContext();
2960
3168
  const computedFloatingStyles = useMemo(() => {
2961
3169
  var _a2;
2962
3170
  return {
@@ -3028,64 +3236,270 @@ const MenuContent = memo((props) => {
3028
3236
  ) }) });
3029
3237
  });
3030
3238
  MenuContent.displayName = "Menu.Content";
3031
- const MenuContextTrigger = memo((props) => {
3032
- const { ref: forwardedRef, children, disabled = false } = props;
3033
- const ref = useRef(null);
3034
- const { setOpen, refs, setTriggerType, open } = use(MenuContext);
3035
- const mergedRefs = useMergeRefs([forwardedRef, ref]);
3036
- useEffect(() => {
3037
- setTriggerType("context");
3038
- }, [setTriggerType]);
3039
- const handleContextMenu = useCallback(
3040
- (e) => {
3041
- const { clientY, clientX } = e;
3042
- if (!disabled && ref.current) {
3043
- e.preventDefault();
3044
- refs.setPositionReference({
3045
- getBoundingClientRect() {
3046
- return {
3047
- x: clientX,
3048
- y: clientY,
3049
- top: clientY,
3050
- left: clientX,
3051
- height: 0,
3052
- width: 0,
3053
- bottom: clientY,
3054
- right: clientX
3055
- };
3056
- },
3057
- contextElement: ref.current
3058
- });
3059
- setOpen(true);
3060
- }
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);
3061
3264
  },
3062
- [disabled, refs, setOpen]
3063
- );
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
+ ]);
3064
3313
  return /* @__PURE__ */ jsx(
3065
- Slot,
3314
+ SubContext.Provider,
3066
3315
  {
3067
- ref: mergedRefs,
3068
- style: { WebkitTouchCallout: disabled ? "none" : "unset" },
3069
- "aria-disabled": disabled,
3070
- "data-disabled": getBooleanState(disabled),
3071
- "data-state": getOpenState(open),
3072
- onContextMenu: handleContextMenu,
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
+ },
3073
3334
  children
3074
3335
  }
3075
3336
  );
3076
3337
  });
3077
- MenuContextTrigger.displayName = "MenuContextTrigger";
3078
- const MenuGroup = memo((props) => {
3079
- const { ref, children, ...rest } = props;
3080
- return /* @__PURE__ */ jsx("div", { ref, role: "group", ...rest, children });
3081
- });
3082
- MenuGroup.displayName = "MenuGroup";
3083
- const MenuInputField = memo((props) => {
3084
- const { ref: forwardedRef, className, onValueChange, onChange, disabled = false, ...rest } = props;
3085
- const { activeIndex, getItemProps } = use(MenuContentContext);
3086
- const { index, ref } = useListItem();
3087
- const mergedRefs = useMergeRefs([ref, forwardedRef]);
3088
- const handleChange = useCallback(
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
+ const MenuContextTrigger = memo((props) => {
3446
+ const { ref: forwardedRef, children, disabled = false } = props;
3447
+ const ref = useRef(null);
3448
+ const { setOpen, refs, setTriggerType, open } = useMenuContext();
3449
+ const mergedRefs = useMergeRefs([forwardedRef, ref]);
3450
+ useEffect(() => {
3451
+ setTriggerType("context");
3452
+ }, [setTriggerType]);
3453
+ const handleContextMenu = useCallback(
3454
+ (e) => {
3455
+ const { clientY, clientX } = e;
3456
+ if (!disabled && ref.current) {
3457
+ e.preventDefault();
3458
+ refs.setPositionReference({
3459
+ getBoundingClientRect() {
3460
+ return {
3461
+ x: clientX,
3462
+ y: clientY,
3463
+ top: clientY,
3464
+ left: clientX,
3465
+ height: 0,
3466
+ width: 0,
3467
+ bottom: clientY,
3468
+ right: clientX
3469
+ };
3470
+ },
3471
+ contextElement: ref.current
3472
+ });
3473
+ setOpen(true);
3474
+ }
3475
+ },
3476
+ [disabled, refs, setOpen]
3477
+ );
3478
+ return /* @__PURE__ */ jsx(
3479
+ Slot,
3480
+ {
3481
+ ref: mergedRefs,
3482
+ style: { WebkitTouchCallout: disabled ? "none" : "unset" },
3483
+ "aria-disabled": disabled,
3484
+ "data-disabled": getBooleanState(disabled),
3485
+ "data-state": getOpenState(open),
3486
+ onContextMenu: handleContextMenu,
3487
+ children
3488
+ }
3489
+ );
3490
+ });
3491
+ MenuContextTrigger.displayName = "MenuContextTrigger";
3492
+ const MenuGroup = memo((props) => {
3493
+ const { ref, children, ...rest } = props;
3494
+ return /* @__PURE__ */ jsx("div", { ref, role: "group", ...rest, children });
3495
+ });
3496
+ MenuGroup.displayName = "MenuGroup";
3497
+ const MenuInputField = memo((props) => {
3498
+ const { ref: forwardedRef, className, onValueChange, onChange, disabled = false, ...rest } = props;
3499
+ const { activeIndex, getItemProps } = useMenuContentContext();
3500
+ const { index, ref } = useListItem();
3501
+ const mergedRefs = useMergeRefs([ref, forwardedRef]);
3502
+ const handleChange = useCallback(
3089
3503
  (e) => {
3090
3504
  onChange == null ? void 0 : onChange(e);
3091
3505
  onValueChange == null ? void 0 : onValueChange(e.target.value);
@@ -3115,7 +3529,7 @@ const MenuInputField = memo((props) => {
3115
3529
  MenuInputField.displayName = "MenuInputField";
3116
3530
  const MenuInputRoot = memo((props) => {
3117
3531
  const { ref, className, ...rest } = props;
3118
- const { size: size2 } = use(MenuContentContext);
3532
+ const { size: size2 } = useMenuContentContext();
3119
3533
  return /* @__PURE__ */ jsx("div", { className: cx(inputRoot({ size: size2 }), className), ref, ...rest });
3120
3534
  });
3121
3535
  MenuInputRoot.displayName = "MenuInputRoot";
@@ -3126,7 +3540,7 @@ const MenuInputSlot = memo((props) => {
3126
3540
  MenuInputSlot.displayName = "MenuInputSlot";
3127
3541
  const MenuLabel = memo((props) => {
3128
3542
  const { ref, className, ...rest } = props;
3129
- const { size: size2 } = use(MenuContentContext);
3543
+ const { size: size2 } = useMenuContentContext();
3130
3544
  return /* @__PURE__ */ jsx("div", { ref, className: cx(menuLabelCva({ size: size2 }), className), ...rest });
3131
3545
  });
3132
3546
  MenuLabel.displayName = "MenuLabel";
@@ -3134,6 +3548,29 @@ const MenuMultiSelectGroup = genericMemo(function MenuMultiSelectGroup2(props) {
3134
3548
  const { ref, children, defaultValues, values, onValuesChange, ...rest } = props;
3135
3549
  return /* @__PURE__ */ jsx(MenuGroup, { ref, ...rest, children: /* @__PURE__ */ jsx(MultiSelectProvider, { defaultValues, values, onValuesChange, children }) });
3136
3550
  });
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";
3137
3574
  const MenuMultiSelectItem = genericMemo(function(props) {
3138
3575
  const { ref, onSelect, children, closeOnSelect = false, value, ...rest } = props;
3139
3576
  const { selected, selectValue, registerValue } = use(MultiSelectContext);
@@ -3161,972 +3598,76 @@ const MenuMultiSelectItem = genericMemo(function(props) {
3161
3598
  }
3162
3599
  ) });
3163
3600
  });
3164
- const PagesContext = createContext({});
3165
- const MenuPageContent = memo((props) => {
3166
- const { page, children } = props;
3167
- const { activePage } = use(PagesContext);
3168
- return activePage === page ? children : null;
3169
- });
3170
- MenuPageContent.displayName = "PageContent";
3171
- const MenuPages = memo((props) => {
3172
- const { children, defaultPage, page, onPageChange } = props;
3173
- const [activePage, setActivePage] = useControlledState(defaultPage ?? "", page, onPageChange);
3174
- const contextValue = useMemo(() => ({ activePage, setActivePage }), [activePage, setActivePage]);
3175
- return /* @__PURE__ */ jsx(PagesContext.Provider, { value: contextValue, children });
3176
- });
3177
- MenuPages.displayName = "MenuPages";
3178
- const MenuPageTrigger = memo((props) => {
3179
- const { ref, onSelect, page, ...rest } = props;
3180
- const { refs, setActiveIndex } = use(MenuContentContext);
3181
- const { setActivePage } = use(PagesContext);
3182
- const handleSelect = useCallback(() => {
3183
- var _a;
3184
- onSelect == null ? void 0 : onSelect();
3185
- setActivePage(page);
3186
- (_a = refs.floating.current) == null ? void 0 : _a.focus();
3187
- setActiveIndex(null);
3188
- }, [onSelect, page, refs.floating, setActiveIndex, setActivePage]);
3189
- return /* @__PURE__ */ jsx(MenuItem, { ref, onSelect: handleSelect, closeOnSelect: false, ...rest });
3190
- });
3191
- MenuPageTrigger.displayName = "MenuPageTrigger";
3192
- const MENU_OVERFLOW_PADDING = 20;
3193
- const MENU_CONTENT_PADDING = 8;
3194
- const MENU_MINIMUM_MAX_HEIGHT = 250;
3195
- const DEFAULT_OFFSET = 5;
3196
- const MenuRoot = memo((props) => {
3197
- const {
3198
- children,
3199
- side = "bottom",
3200
- align = "center",
3201
- offset: offset$1,
3202
- loop = false,
3203
- modal = false,
3204
- // open state related props
3205
- open: controlledOpen,
3206
- onOpenChange,
3207
- defaultOpen
3208
- } = props;
3209
- const [open, setOpen] = useControlledState(defaultOpen ?? false, controlledOpen, onOpenChange);
3210
- const [activeIndex, setActiveIndex] = useState(null);
3211
- const [triggerType, setTriggerType] = useState(null);
3212
- const elementsRef = useRef([]);
3213
- const nodeId = useFloatingNodeId();
3214
- const { refs, floatingStyles, context, middlewareData } = useFloating({
3215
- nodeId,
3216
- strategy: "fixed",
3217
- // TODO: probably some way with template string types to not need the "as Placement"
3218
- placement: side + (align !== "center" ? "-" + align : ""),
3219
- whileElementsMounted: autoUpdate,
3220
- open,
3221
- onOpenChange: setOpen,
3222
- middleware: [
3223
- offset({ mainAxis: offset$1 ?? DEFAULT_OFFSET }),
3224
- size({
3225
- apply({ availableHeight, elements }) {
3226
- elements.floating.style.setProperty(
3227
- "--overmap-menu-available-height",
3228
- `${Math.max(availableHeight, MENU_MINIMUM_MAX_HEIGHT)}px`
3229
- );
3230
- },
3231
- padding: MENU_OVERFLOW_PADDING
3232
- }),
3233
- flip({ fallbackStrategy: "initialPlacement" }),
3234
- shift({ padding: MENU_OVERFLOW_PADDING }),
3235
- hide()
3236
- ]
3237
- });
3238
- const role = useRole(context, {
3239
- role: "menu"
3240
- });
3241
- const dismiss = useDismiss(context, {
3242
- capture: true,
3243
- ancestorScroll: triggerType === "context" || triggerType === "virtual"
3244
- });
3245
- const click = useClick(context, {
3246
- enabled: triggerType === "click"
3247
- });
3248
- const listNavigation = useListNavigation(context, {
3249
- listRef: elementsRef,
3250
- activeIndex,
3251
- onNavigate: setActiveIndex,
3252
- loop
3253
- });
3254
- const { getFloatingProps, getItemProps, getReferenceProps } = useInteractions([
3255
- dismiss,
3256
- listNavigation,
3257
- click,
3258
- role
3259
- ]);
3260
- return /* @__PURE__ */ jsx(FloatingTree, { children: /* @__PURE__ */ jsx(
3261
- MenuContext.Provider,
3262
- {
3263
- value: {
3264
- open,
3265
- setOpen,
3266
- refs,
3267
- context,
3268
- floatingStyles,
3269
- elementsRef,
3270
- getFloatingProps,
3271
- getItemProps,
3272
- getReferenceProps,
3273
- nodeId,
3274
- activeIndex,
3275
- setActiveIndex,
3276
- middlewareData,
3277
- side,
3278
- modal,
3279
- setTriggerType
3280
- },
3281
- children
3282
- }
3283
- ) });
3284
- });
3285
- MenuRoot.displayName = "Root";
3286
- const MenuScroll = memo((props) => {
3287
- const { ref, className, ...rest } = props;
3288
- return /* @__PURE__ */ jsx(
3289
- "div",
3290
- {
3291
- ref,
3292
- className: cx(
3293
- "h-full overflow-x-hidden overflow-y-auto [scrollbar-color:var(--base-6)_transparent] [scrollbar-width:thin]",
3294
- className
3295
- ),
3296
- ...rest
3297
- }
3298
- );
3299
- });
3300
- MenuScroll.displayName = "MenuScroll";
3301
- const MenuSelectAllItem = genericMemo((props) => {
3302
- const { ref, children, onSelect, closeOnSelect = false, ...rest } = props;
3303
- const { allSelected, someSelected, toggleSelectAll } = use(MultiSelectContext);
3304
- const selectedState = allSelected ? true : someSelected ? "indeterminate" : false;
3305
- const handleSelect = useCallback(() => {
3306
- onSelect == null ? void 0 : onSelect();
3307
- toggleSelectAll();
3308
- }, [onSelect, toggleSelectAll]);
3309
- const computedChildren = useMemo(() => {
3310
- return typeof children === "function" ? ({ active }) => children({ selected: selectedState, active }) : children;
3311
- }, [children, selectedState]);
3312
- return /* @__PURE__ */ jsx(CheckedIndicatorContext, { value: selectedState, children: /* @__PURE__ */ jsx(
3313
- MenuItem,
3314
- {
3315
- onSelect: handleSelect,
3316
- ref,
3317
- "data-state": getCheckedState(selectedState),
3318
- closeOnSelect,
3319
- ...rest,
3320
- children: computedChildren
3321
- }
3322
- ) });
3323
- });
3324
- const MenuSelectedIndicator = memo((props) => {
3325
- const { ref, children, ...rest } = props;
3326
- return /* @__PURE__ */ jsx(SelectedIndicator, { ref, ...rest, children });
3327
- });
3328
- MenuSelectedIndicator.displayName = "MenuSelectedIndicator";
3329
- const MenuSelectGroup = genericMemo(function MenuSelectGroup2(props) {
3330
- const { ref, children, required, defaultValue, value, onValueChange, ...rest } = props;
3331
- return /* @__PURE__ */ jsx(MenuGroup, { ref, ...rest, children: required ? /* @__PURE__ */ jsx(SingleSelectRequiredProvider, { defaultValue, value, onValueChange, children }) : /* @__PURE__ */ jsx(
3332
- SingleSelectNotRequiredProvider,
3333
- {
3334
- defaultValue,
3335
- value,
3336
- onValueChange,
3337
- children
3338
- }
3339
- ) });
3340
- });
3341
- const MenuSelectItem = genericMemo(function(props) {
3342
- const { ref, value, onSelect, children, closeOnSelect = true, ...rest } = props;
3343
- const { selected, selectValue } = use(SelectContext);
3344
- const isSelected = selected(value);
3345
- const handleSelect = useCallback(() => {
3346
- onSelect == null ? void 0 : onSelect();
3347
- selectValue(value);
3348
- }, [onSelect, selectValue, value]);
3349
- const computedChildren = useMemo(() => {
3350
- return typeof children === "function" ? ({ active }) => children({ selected: isSelected, active }) : children;
3351
- }, [children, isSelected]);
3352
- return /* @__PURE__ */ jsx(SelectedIndicatorContext.Provider, { value: isSelected, children: /* @__PURE__ */ jsx(
3353
- MenuItem,
3354
- {
3355
- ref,
3356
- role: "menuitemcheckbox",
3357
- onSelect: handleSelect,
3358
- closeOnSelect,
3359
- "data-state": getSelectedState(isSelected),
3360
- ...rest,
3361
- children: computedChildren
3362
- }
3363
- ) });
3364
- });
3365
- const MenuSeparator = memo((props) => {
3366
- const { ref, className, ...rest } = props;
3367
- const { size: size2 } = use(MenuContentContext);
3368
- return /* @__PURE__ */ jsx(RadixSeparator.Root, { className: cx(menuSeparator({ size: size2 }), className), ref, ...rest });
3369
- });
3370
- MenuSeparator.displayName = "MenuSeparator";
3371
- const computeOffsets = (side, alignment) => {
3372
- switch (side) {
3373
- case "right":
3374
- if (alignment === "start") {
3375
- return { mainAxis: MENU_CONTENT_PADDING + 1, crossAxis: -MENU_CONTENT_PADDING };
3376
- } else if (alignment === "end") {
3377
- return { mainAxis: MENU_CONTENT_PADDING + 1, crossAxis: MENU_CONTENT_PADDING };
3378
- }
3379
- break;
3380
- case "left":
3381
- if (alignment === "start") {
3382
- return { mainAxis: MENU_CONTENT_PADDING + 1, crossAxis: -MENU_CONTENT_PADDING };
3383
- } else if (alignment === "end") {
3384
- return { mainAxis: MENU_CONTENT_PADDING + 1, crossAxis: MENU_CONTENT_PADDING };
3385
- }
3386
- break;
3387
- }
3388
- return { mainAxis: MENU_CONTENT_PADDING + 1, crossAxis: 0 };
3389
- };
3390
- const MenuSub = memo((props) => {
3391
- const {
3392
- children,
3393
- disabled = false,
3394
- side = "right",
3395
- align = "start",
3396
- closeRoot = false,
3397
- loop = false,
3398
- modal = false,
3399
- // open state related props
3400
- open: controlledOpen,
3401
- onOpenChange,
3402
- defaultOpen
3403
- } = props;
3404
- const [open, setOpen] = useControlledState(defaultOpen ?? false, controlledOpen, onOpenChange);
3405
- const nodeId = useFloatingNodeId();
3406
- const { refs, floatingStyles, context } = useFloating({
3407
- nodeId,
3408
- strategy: "fixed",
3409
- whileElementsMounted: autoUpdate,
3410
- open,
3411
- onOpenChange: (open2, _event, reason) => {
3412
- if (reason) setOpen(open2);
3413
- },
3414
- placement: side + (align !== "center" ? "-" + align : ""),
3415
- middleware: [
3416
- offset({ ...computeOffsets(side, align) }),
3417
- size({
3418
- padding: MENU_OVERFLOW_PADDING,
3419
- apply({ availableHeight, elements }) {
3420
- elements.floating.style.setProperty(
3421
- "--overmap-menu-available-height",
3422
- `${Math.max(availableHeight, MENU_MINIMUM_MAX_HEIGHT)}px`
3423
- );
3424
- }
3425
- }),
3426
- flip(),
3427
- shift({ padding: MENU_OVERFLOW_PADDING }),
3428
- hide()
3429
- ]
3430
- });
3431
- const dismiss = useDismiss(context, {
3432
- bubbles: closeRoot,
3433
- outsidePress: closeRoot
3434
- });
3435
- const hover = useHover(context, {
3436
- restMs: 50,
3437
- handleClose: safePolygon({
3438
- blockPointerEvents: true,
3439
- requireIntent: false
3440
- }),
3441
- enabled: !disabled
3442
- });
3443
- const click = useClick(context, {
3444
- enabled: !disabled
3445
- });
3446
- const elementsRef = useRef([]);
3447
- const [activeIndex, setActiveIndex] = useState(null);
3448
- const listNavigation = useListNavigation(context, {
3449
- listRef: elementsRef,
3450
- nested: true,
3451
- activeIndex,
3452
- onNavigate: setActiveIndex,
3453
- loop,
3454
- rtl: side === "left"
3455
- });
3456
- const { getFloatingProps, getItemProps, getReferenceProps } = useInteractions([
3457
- listNavigation,
3458
- dismiss,
3459
- hover,
3460
- click
3461
- ]);
3462
- return /* @__PURE__ */ jsx(
3463
- SubContext.Provider,
3464
- {
3465
- value: {
3466
- open,
3467
- setOpen,
3468
- nodeId,
3469
- refs,
3470
- floatingStyles,
3471
- context,
3472
- elementsRef,
3473
- activeIndex,
3474
- setActiveIndex,
3475
- getFloatingProps,
3476
- getItemProps,
3477
- getReferenceProps,
3478
- disabled,
3479
- side,
3480
- closeRoot,
3481
- modal
3482
- },
3483
- children
3484
- }
3485
- );
3486
- });
3487
- MenuSub.displayName = "SubMenu";
3488
- const MenuSubContent = memo((props) => {
3489
- var _a;
3490
- const { ref: forwardedRef, children, ...rest } = props;
3491
- const { middlewareData } = use(MenuContext);
3492
- const { accentColor, radius, variant, size: size2 } = use(MenuContentContext);
3493
- const {
3494
- open,
3495
- nodeId,
3496
- refs,
3497
- context,
3498
- getFloatingProps,
3499
- getItemProps,
3500
- activeIndex,
3501
- setActiveIndex,
3502
- elementsRef,
3503
- floatingStyles,
3504
- setOpen,
3505
- side
3506
- } = use(SubContext);
3507
- const wrapperRef = useRef(null);
3508
- const mergeRefs2 = useMergeRefs([refs.setFloating, wrapperRef]);
3509
- const computedFloatingStyles = useMemo(() => {
3510
- var _a2;
3511
- return {
3512
- ...floatingStyles,
3513
- visibility: ((_a2 = middlewareData.hide) == null ? void 0 : _a2.referenceHidden) ? "hidden" : "visible"
3514
- };
3515
- }, [floatingStyles, (_a = middlewareData.hide) == null ? void 0 : _a.referenceHidden]);
3516
- 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(
3517
- MenuContentContext.Provider,
3518
- {
3519
- value: {
3520
- getItemProps,
3521
- activeIndex,
3522
- setActiveIndex,
3523
- elementsRef,
3524
- open,
3525
- setOpen,
3526
- refs,
3527
- size: size2,
3528
- radius,
3529
- accentColor,
3530
- variant
3531
- },
3532
- children: /* @__PURE__ */ jsx(
3533
- "div",
3534
- {
3535
- className: "outline-none",
3536
- ref: mergeRefs2,
3537
- style: computedFloatingStyles,
3538
- ...getFloatingProps(),
3539
- children: /* @__PURE__ */ jsx(
3540
- "ul",
3541
- {
3542
- className: cx(
3543
- "overmap-menu-sub-content",
3544
- menuContent({ size: size2 }),
3545
- floating({ side, shadow: "3" }),
3546
- radiusCva({ radius, maxLarge: true }),
3547
- "max-h-(--overmap-menu-available-height)"
3548
- ),
3549
- ref: forwardedRef,
3550
- "data-state": getOpenState(open),
3551
- "data-side": side,
3552
- "data-accent-color": accentColor,
3553
- ...rest,
3554
- children
3555
- }
3556
- )
3557
- }
3558
- )
3559
- }
3560
- ) }) }) }) });
3561
- });
3562
- MenuSubContent.displayName = "MenuSubContent";
3563
- const MenuSubTrigger = memo((props) => {
3564
- const { ref: forwardedRef, children, ...rest } = props;
3565
- const { refs, getReferenceProps, open, disabled } = use(SubContext);
3566
- const mergedRefs = useMergeRefs([forwardedRef, refs.setReference]);
3567
- return /* @__PURE__ */ jsx(
3568
- MenuItem,
3569
- {
3570
- ref: mergedRefs,
3571
- closeOnSelect: false,
3572
- "aria-haspopup": "menu",
3573
- "data-state": getOpenState(open),
3574
- disabled,
3575
- ...getReferenceProps(rest),
3576
- children
3577
- }
3578
- );
3579
- });
3580
- MenuSubTrigger.displayName = "MenuSubTrigger";
3581
- const MenuVirtualTrigger = memo((props) => {
3582
- const { virtualElement, disabled } = props;
3583
- const { refs, setTriggerType, setOpen } = use(MenuContext);
3584
- useEffect(() => {
3585
- setTriggerType("virtual");
3586
- }, [setTriggerType]);
3587
- useEffect(() => {
3588
- if (!disabled && virtualElement) {
3589
- refs.setPositionReference(virtualElement);
3590
- setOpen(true);
3591
- } else {
3592
- refs.setPositionReference(null);
3593
- setOpen(false);
3594
- }
3595
- }, [disabled, refs, setOpen, virtualElement]);
3596
- return null;
3597
- });
3598
- MenuVirtualTrigger.displayName = "VirtualTrigger";
3599
- const Menu = {
3600
- Root: MenuRoot,
3601
- Content: MenuContent,
3602
- // sub
3603
- Sub: MenuSub,
3604
- SubContent: MenuSubContent,
3605
- SubTrigger: MenuSubTrigger,
3606
- // pages
3607
- Pages: MenuPages,
3608
- PageContent: MenuPageContent,
3609
- PageTrigger: MenuPageTrigger,
3610
- // triggers
3611
- ClickTrigger: MenuClickTrigger,
3612
- ContextTrigger: MenuContextTrigger,
3613
- VirtualTrigger: MenuVirtualTrigger,
3614
- // groups
3615
- Group: MenuGroup,
3616
- SelectGroup: MenuSelectGroup,
3617
- MultiSelectGroup: MenuMultiSelectGroup,
3618
- // items
3619
- Item: MenuItem,
3620
- SelectItem: MenuSelectItem,
3621
- MultiSelectItem: MenuMultiSelectItem,
3622
- SelectAllItem: MenuSelectAllItem,
3623
- CheckboxItem: MenuCheckboxItem,
3624
- // indicators
3625
- SelectedIndicator: MenuSelectedIndicator,
3626
- CheckboxItemIndicator: MenuCheckboxItemIndicator,
3627
- // input
3628
- InputRoot: MenuInputRoot,
3629
- InputField: MenuInputField,
3630
- InputSlot: MenuInputSlot,
3631
- // others
3632
- Label: MenuLabel,
3633
- Separator: MenuSeparator,
3634
- Scroll: MenuScroll
3635
- };
3636
- const KEY_MAPPING = {
3637
- next: "ArrowDown",
3638
- prev: "ArrowUp",
3639
- first: "PageUp",
3640
- last: "PageDown",
3641
- selectItem: "Enter"
3642
- };
3643
- const ITEM_SELECTOR = "menu-item";
3644
- const GROUP_SELECTOR = "menu-group";
3645
- const MenuRootContext = createContext({});
3646
- const MenuGroupContext = createContext({});
3647
- const MenuPageContext = createContext({});
3648
- const menuRootCva = cva(["w-full", "outline-none"], {
3649
- variants: {
3650
- size: {
3651
- xs: ["p-0.5", "text-xs", "min-w-30"],
3652
- sm: ["p-0.75", "text-sm", "min-w-35"],
3653
- md: ["p-1", "text-md", "min-w-40"],
3654
- lg: ["p-1.25", "text-lg", "min-w-45"],
3655
- xl: ["p-1.5", "text-xl", "min-w-50"]
3656
- },
3657
- radius: {
3658
- none: ["rounded-none"],
3659
- xs: ["rounded-xs"],
3660
- sm: ["rounded-sm"],
3661
- md: ["rounded-md"],
3662
- lg: ["rounded-lg"],
3663
- xl: ["rounded-lg"],
3664
- full: ["rounded-lg"]
3665
- }
3666
- }
3667
- });
3668
- const menuItemCva = cva(
3669
- [
3670
- "select-none",
3671
- "relative",
3672
- "flex",
3673
- "items-center",
3674
- "outline-none",
3675
- "data-[disabled=true]:text-(--base-a8)",
3676
- "data-[disabled=true]:pointer-events-none",
3677
- "shrink-0",
3678
- "py-1",
3679
- "text-(--base-12)"
3680
- ],
3681
- {
3682
- variants: {
3683
- size: {
3684
- xs: ["gap-1.5", "px-3"],
3685
- sm: ["gap-1.75", "px-3.5"],
3686
- md: ["gap-2", "px-4"],
3687
- lg: ["gap-2.25", "px-4.5"],
3688
- xl: ["gap-2.5", "px-5"]
3689
- },
3690
- variant: {
3691
- solid: [
3692
- "data-[active=true]:not-[data-[disabled=true]]:text-(--accent-contrast)",
3693
- "data-[active=true]:not-[data-[disabled=true]]:bg-(--accent-a9)",
3694
- "data-[active=true]:not-[data-[disabled=true]]:active:brightness-110"
3695
- ],
3696
- soft: [
3697
- "data-[active=true]:not-[data-[disabled=true]]:bg-(--accent-a3)",
3698
- "data-[active=true]:not-[data-[disabled=true]]:active:bg-(--accent-a4)"
3699
- ]
3700
- }
3701
- }
3702
- }
3703
- );
3704
- const menuGroupLabelCva = cva(["text-(--base-a11)", "flex", "items-center", "select-none", "py-1"], {
3705
- variants: {
3706
- size: {
3707
- xs: ["gap-1.5", "px-3", "text-xs"],
3708
- sm: ["gap-1.75", "px-3.5", "text-xs"],
3709
- md: ["gap-2", "px-4", "text-sm"],
3710
- lg: ["gap-2.25", "px-4.5", "text-base"],
3711
- xl: ["gap-2.5", "px-5", "text-lg"]
3712
- }
3713
- }
3714
- });
3715
- const menuSeparatorCva = cva(["h-px", "bg-(--base-a6)", "w-auto", "shrink-0"], {
3716
- variants: {
3717
- size: {
3718
- xs: ["-mx-0.5", "my-0.5"],
3719
- sm: ["-mx-0.75", "my-0.75"],
3720
- md: ["-mx-1", "my-1"],
3721
- lg: ["-mx-1.25", "my-1.25"],
3722
- xl: ["-mx-1.5", "my-1.5"]
3723
- }
3724
- }
3725
- });
3726
- const MenuV2Item = memo((props) => {
3727
- const {
3728
- ref,
3729
- children,
3730
- className,
3731
- disabled = false,
3732
- onClick,
3733
- onSelect,
3734
- onPointerEnter,
3735
- onPointerLeave,
3736
- onPointerMove,
3737
- ...rest
3738
- } = props;
3739
- const internalRef = useRef(null);
3740
- const itemId = useId();
3741
- const { activeItemId, setActiveItemId, size: size2, variant, radius } = use(MenuRootContext);
3742
- const isActive = itemId === activeItemId;
3743
- const handleSelect = useCallback(
3744
- (e) => {
3745
- onSelect == null ? void 0 : onSelect(e);
3746
- },
3747
- [onSelect]
3748
- );
3749
- const handleClick = useCallback(
3750
- (e) => {
3751
- onClick == null ? void 0 : onClick(e);
3752
- handleSelect(new Event("menu-select"));
3753
- },
3754
- [handleSelect, onClick]
3755
- );
3756
- const handlePointerEnter = useCallback(
3757
- (e) => {
3758
- onPointerEnter == null ? void 0 : onPointerEnter(e);
3759
- if (e.defaultPrevented) return;
3760
- setActiveItemId(itemId);
3761
- },
3762
- [onPointerEnter, setActiveItemId, itemId]
3763
- );
3764
- const handlePointerLeave = useCallback(
3765
- (e) => {
3766
- onPointerLeave == null ? void 0 : onPointerLeave(e);
3767
- if (e.defaultPrevented) return;
3768
- setActiveItemId(null);
3769
- },
3770
- [onPointerLeave, setActiveItemId]
3771
- );
3772
- const handlePointerMove = useCallback(
3773
- (e) => {
3774
- onPointerMove == null ? void 0 : onPointerMove(e);
3775
- if (e.defaultPrevented) return;
3776
- setActiveItemId(itemId);
3777
- },
3778
- [onPointerMove, itemId, setActiveItemId]
3779
- );
3780
- useEffect(() => {
3781
- if (!internalRef.current) return;
3782
- const element = internalRef.current;
3783
- element.addEventListener("menu-select", handleSelect);
3784
- return () => {
3785
- element.removeEventListener("menu-select", handleSelect);
3786
- };
3787
- }, [handleSelect]);
3788
- return /* @__PURE__ */ jsx(
3789
- "div",
3790
- {
3791
- ref: mergeRefs([ref, internalRef]),
3792
- className: cx(menuItemCva({ size: size2, variant }), radiusCva({ radius, maxLarge: true }), className),
3793
- role: "menuitem",
3794
- onClick: handleClick,
3795
- onPointerEnter: handlePointerEnter,
3796
- onPointerLeave: handlePointerLeave,
3797
- onPointerMove: handlePointerMove,
3798
- ...{ [ITEM_SELECTOR]: itemId },
3799
- "data-active": getBooleanState(isActive),
3800
- "data-disabled": getBooleanState(disabled),
3801
- "aria-disabled": getBooleanState(disabled),
3802
- ...rest,
3803
- children
3804
- }
3805
- );
3806
- });
3807
- MenuV2Item.displayName = "MenuItem";
3808
- const MenuV2CheckboxItem = memo((props) => {
3809
- const { ref, checked, onCheckedChange, onSelect, ...rest } = props;
3810
- const handleSelect = useCallback(
3811
- (e) => {
3812
- onSelect == null ? void 0 : onSelect(e);
3813
- if (e.defaultPrevented) return;
3814
- switch (checked) {
3815
- case true:
3816
- onCheckedChange(false);
3817
- break;
3818
- case "indeterminate":
3819
- onCheckedChange(true);
3820
- break;
3821
- case false:
3822
- onCheckedChange(true);
3823
- break;
3824
- }
3825
- },
3826
- [checked, onCheckedChange, onSelect]
3827
- );
3828
- return /* @__PURE__ */ jsx(CheckedIndicatorContext.Provider, { value: checked, children: /* @__PURE__ */ jsx(MenuV2Item, { ref, onSelect: handleSelect, ...rest }) });
3829
- });
3830
- MenuV2CheckboxItem.displayName = "MenuCheckboxItem";
3831
- const MenuV2CheckedIndicator = memo((props) => {
3832
- const { ref, children, ...rest } = props;
3833
- return /* @__PURE__ */ jsx(CheckedIndicator, { ref, ...rest, children });
3834
- });
3835
- MenuV2CheckedIndicator.displayName = "MenuCheckboxItemIndicator";
3836
- const MenuV2Group = memo((props) => {
3837
- const { ref, children, ...rest } = props;
3838
- const groupId = useId();
3839
- const [labelId, setLabelId] = useState(null);
3840
- const contextValue = useMemo(
3841
- () => ({
3842
- labelId,
3843
- setLabelId
3844
- }),
3845
- [labelId]
3846
- );
3847
- return /* @__PURE__ */ jsx("div", { ref, role: "group", ...{ [GROUP_SELECTOR]: groupId }, "aria-labelledby": labelId ?? void 0, ...rest, children: /* @__PURE__ */ jsx(MenuGroupContext, { value: contextValue, children }) });
3848
- });
3849
- MenuV2Group.displayName = "MenuGroup";
3850
- const MenuV2GroupLabel = memo((props) => {
3851
- const { ref, children, id, className, ...rest } = props;
3852
- const labelId = useFallbackId(id);
3853
- const { size: size2 } = use(MenuRootContext);
3854
- const { setLabelId } = use(MenuGroupContext);
3855
- useEffect(() => {
3856
- setLabelId(labelId);
3857
- }, [labelId, setLabelId]);
3858
- return /* @__PURE__ */ jsx("div", { ref, id: labelId, className: cx(menuGroupLabelCva({ size: size2 }), className), ...rest, children });
3859
- });
3860
- MenuV2GroupLabel.displayName = "MenuGroupLabel";
3861
- const MenuV2SelectAllItem = genericMemo((props) => {
3862
- const { ref, children, onSelect, ...rest } = props;
3863
- const { allSelected, someSelected, toggleSelectAll } = use(MultiSelectContext);
3864
- const selectedState = allSelected ? true : someSelected ? "indeterminate" : false;
3865
- const handleSelect = useCallback(
3866
- (e) => {
3867
- onSelect == null ? void 0 : onSelect(e);
3868
- if (e.defaultPrevented) return;
3869
- toggleSelectAll();
3870
- },
3871
- [onSelect, toggleSelectAll]
3872
- );
3873
- return /* @__PURE__ */ jsx(MenuV2Item, { onSelect: handleSelect, ref, "data-state": getCheckedState(selectedState), ...rest, children: /* @__PURE__ */ jsx(CheckedIndicatorContext, { value: selectedState, children }) });
3874
- });
3875
- const MenuV2MultiSelectGroup = genericMemo(function MenuMultiSelectGroup3(props) {
3876
- const { ref, children, defaultValues, values, onValuesChange, ...rest } = props;
3877
- return /* @__PURE__ */ jsx(MenuV2Group, { ref, ...rest, children: /* @__PURE__ */ jsx(MultiSelectProvider, { defaultValues, values, onValuesChange, children }) });
3878
- });
3879
- const MenuV2MultiSelectItem = genericMemo(function(props) {
3880
- const { ref, onSelect, children, value, ...rest } = props;
3881
- const { selected, selectValue, registerValue } = use(MultiSelectContext);
3882
- useLayoutEffect(() => {
3883
- return registerValue(value);
3884
- }, [registerValue, value]);
3885
- const isSelected = selected(value);
3886
- const handleSelect = useCallback(
3887
- (e) => {
3888
- onSelect == null ? void 0 : onSelect(e);
3889
- if (e.defaultPrevented) return;
3890
- selectValue(value);
3891
- },
3892
- [onSelect, selectValue, value]
3893
- );
3894
- return /* @__PURE__ */ jsx(
3895
- MenuV2Item,
3896
- {
3897
- ref,
3898
- role: "menuitemcheckbox",
3899
- onSelect: handleSelect,
3900
- "data-state": getSelectedState(isSelected),
3901
- ...rest,
3902
- children: /* @__PURE__ */ jsx(SelectedIndicatorContext, { value: isSelected, children })
3903
- }
3904
- );
3905
- });
3906
- const MenuV2Page = memo((props) => {
3907
- const { children, ref, page, ...rest } = props;
3908
- const { page: activePage } = use(MenuPageContext);
3909
- const isActive = page === activePage;
3910
- return /* @__PURE__ */ jsx("div", { ref, "data-active": getActiveState(isActive), hidden: !isActive, ...rest, children: isActive ? children : null });
3911
- });
3912
- MenuV2Page.displayName = "MenuPage";
3913
- const MenuV2Pages = memo((props) => {
3914
- const { children, defaultPage = "", page: controlledPage, onPageChange } = props;
3915
- const [page, setPage] = useControlledState(defaultPage, controlledPage, onPageChange);
3916
- const contextValue = useMemo(
3917
- () => ({
3918
- page,
3919
- setPage
3920
- }),
3921
- [page, setPage]
3922
- );
3923
- return /* @__PURE__ */ jsx(MenuPageContext, { value: contextValue, children });
3924
- });
3925
- MenuV2Pages.displayName = "MenuPages";
3926
- const MenuV2PageTriggerItem = memo((props) => {
3927
- const { ref, children, page, onSelect, ...rest } = props;
3928
- const { page: activePage, setPage } = use(MenuPageContext);
3929
- const isActive = page === activePage;
3930
- const handleSelect = useCallback(
3931
- (e) => {
3932
- onSelect == null ? void 0 : onSelect(e);
3933
- if (e.defaultPrevented) return;
3934
- setPage(page);
3935
- },
3936
- [onSelect, page, setPage]
3937
- );
3938
- return /* @__PURE__ */ jsx(MenuV2Item, { ref, onSelect: handleSelect, "data-state": getActiveState(isActive), ...rest, children: /* @__PURE__ */ jsx(SelectedIndicatorContext, { value: isActive, children }) });
3939
- });
3940
- MenuV2PageTriggerItem.displayName = "CommandMenuPageTriggerItem";
3941
- const computeNextIndex = (index, length, direction, loop) => {
3942
- switch (direction) {
3943
- case "next":
3944
- return index === length - 1 ? loop ? 0 : index : index + 1;
3945
- case "prev":
3946
- return index === 0 ? loop ? length - 1 : index : index - 1;
3947
- }
3948
- };
3949
- const MenuV2Root = memo((props) => {
3950
- const providerContext = useProvider();
3951
- const {
3952
- ref,
3953
- children,
3954
- className,
3955
- onKeyDown,
3956
- loop = false,
3957
- // style props
3958
- radius = providerContext.radius,
3959
- accentColor = "base",
3960
- size: size2 = "md",
3961
- variant = "soft",
3962
- ...rest
3963
- } = props;
3964
- const internalRef = useRef(null);
3965
- const [activeItemId, setActiveItemId] = useState(null);
3966
- const getItems = useCallback((element) => {
3967
- return Array.from(element.querySelectorAll(`[${ITEM_SELECTOR}]:not([data-disabled=true]`));
3968
- }, []);
3969
- const getFirstItem = useCallback(
3970
- (element) => {
3971
- return getItems(element).at(0);
3972
- },
3973
- [getItems]
3974
- );
3975
- const getLastItem = useCallback(
3976
- (element) => {
3977
- return getItems(element).at(-1);
3978
- },
3979
- [getItems]
3980
- );
3981
- const getActiveItem = useCallback(
3982
- (element) => {
3983
- return getItems(element).find((itemEle) => itemEle.getAttribute(ITEM_SELECTOR) === activeItemId);
3984
- },
3985
- [activeItemId, getItems]
3986
- );
3987
- const getNextItem = useCallback(
3988
- (element, direction) => {
3989
- const items = getItems(element);
3990
- const activeItem = getActiveItem(element);
3991
- const activeItemIndex = items.findIndex((itemEle) => itemEle === activeItem);
3992
- const nextItemIndex = computeNextIndex(activeItemIndex, items.length, direction, loop);
3993
- return items[nextItemIndex];
3994
- },
3995
- [getActiveItem, getItems, loop]
3996
- );
3997
- const getGroups = useCallback(() => {
3998
- if (!internalRef.current) return [];
3999
- return Array.from(internalRef.current.querySelectorAll(`[${GROUP_SELECTOR}]`));
4000
- }, []);
4001
- const getActiveGroup = useCallback(() => {
4002
- var _a;
4003
- return ((_a = getActiveItem(internalRef.current)) == null ? void 0 : _a.closest(`[${GROUP_SELECTOR}]`)) ?? void 0;
4004
- }, [getActiveItem]);
4005
- const getNextGroup = useCallback(
4006
- (direction) => {
4007
- const groups = getGroups();
4008
- const activeGroup = getActiveGroup();
4009
- const activeGroupIndex = groups.findIndex((groupEle) => groupEle === activeGroup);
4010
- const nextGroupIndex = computeNextIndex(activeGroupIndex, groups.length, direction, loop);
4011
- return groups[nextGroupIndex];
4012
- },
4013
- [getActiveGroup, getGroups, loop]
4014
- );
4015
- const getFirstGroup = useCallback(() => {
4016
- return getGroups().at(0);
4017
- }, [getGroups]);
4018
- const getLastGroup = useCallback(() => {
4019
- return getGroups().at(-1);
4020
- }, [getGroups]);
4021
- const handleKeyDown = useCallback(
4022
- (e) => {
4023
- onKeyDown == null ? void 0 : onKeyDown(e);
4024
- if (e.defaultPrevented) return;
4025
- switch (e.code) {
4026
- case KEY_MAPPING.selectItem: {
4027
- const activeItem = getActiveItem(internalRef.current);
4028
- if (activeItem) activeItem.dispatchEvent(new Event("menu-select"));
4029
- break;
4030
- }
4031
- case KEY_MAPPING.next: {
4032
- let nextItem;
4033
- if (e.shiftKey) {
4034
- const nextGroup = getNextGroup("next");
4035
- if (!nextGroup) return;
4036
- nextItem = getFirstItem(nextGroup);
4037
- } else {
4038
- nextItem = getNextItem(internalRef.current, "next");
4039
- }
4040
- if (!nextItem) return;
4041
- setActiveItemId(nextItem.getAttribute(ITEM_SELECTOR));
4042
- break;
4043
- }
4044
- case KEY_MAPPING.prev: {
4045
- let prevItem;
4046
- if (e.shiftKey) {
4047
- const prevGroup = getNextGroup("prev");
4048
- if (!prevGroup) return;
4049
- prevItem = getFirstItem(prevGroup);
4050
- } else {
4051
- prevItem = getNextItem(internalRef.current, "prev");
4052
- }
4053
- if (!prevItem) return;
4054
- setActiveItemId(prevItem.getAttribute(ITEM_SELECTOR));
4055
- break;
4056
- }
4057
- case KEY_MAPPING.first: {
4058
- let firstItem;
4059
- if (e.shiftKey) {
4060
- const firstGroup = getFirstGroup();
4061
- if (!firstGroup) return;
4062
- firstItem = getFirstItem(firstGroup);
4063
- } else {
4064
- firstItem = getFirstItem(internalRef.current);
4065
- }
4066
- if (!firstItem) return;
4067
- setActiveItemId(firstItem.getAttribute(ITEM_SELECTOR));
4068
- break;
4069
- }
4070
- case KEY_MAPPING.last: {
4071
- let lastItem;
4072
- if (e.shiftKey) {
4073
- const lastGroup = getLastGroup();
4074
- if (!lastGroup) return;
4075
- lastItem = getFirstItem(lastGroup);
4076
- } else {
4077
- lastItem = getLastItem(internalRef.current);
4078
- }
4079
- if (!lastItem) return;
4080
- setActiveItemId(lastItem.getAttribute(ITEM_SELECTOR));
4081
- break;
4082
- }
4083
- }
4084
- },
4085
- [getActiveItem, getFirstGroup, getFirstItem, getLastGroup, getLastItem, getNextGroup, getNextItem, onKeyDown]
4086
- );
4087
- useEffect(() => {
3601
+ const PagesContext = createContext({});
3602
+ const usePagesContext = () => useContext(PagesContext);
3603
+ const MenuPages = memo((props) => {
3604
+ const { children, defaultPage, page, onPageChange } = props;
3605
+ const [activePage, setActivePage] = useControlledState(defaultPage ?? "", page, onPageChange);
3606
+ const contextValue = useMemo(() => ({ activePage, setActivePage }), [activePage, setActivePage]);
3607
+ return /* @__PURE__ */ jsx(PagesContext.Provider, { value: contextValue, children });
3608
+ });
3609
+ 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
+ const MenuPageTrigger = memo((props) => {
3617
+ const { ref, onSelect, page, ...rest } = props;
3618
+ const { refs, setActiveIndex } = useMenuContentContext();
3619
+ const { setActivePage } = usePagesContext();
3620
+ const handleSelect = useCallback(() => {
4088
3621
  var _a;
4089
- const firstItem = getFirstItem(internalRef.current);
4090
- if (!firstItem) return;
4091
- (_a = internalRef.current) == null ? void 0 : _a.focus();
4092
- setActiveItemId(firstItem.getAttribute(ITEM_SELECTOR));
4093
- }, [getFirstItem]);
4094
- const contextValue = useMemo(
4095
- () => ({
4096
- activeItemId,
4097
- setActiveItemId,
4098
- // style props
4099
- accentColor,
4100
- radius,
4101
- variant,
4102
- size: size2
4103
- }),
4104
- [accentColor, activeItemId, radius, size2, variant]
4105
- );
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;
4106
3632
  return /* @__PURE__ */ jsx(
4107
3633
  "div",
4108
3634
  {
4109
- ref: mergeRefs([ref, internalRef]),
4110
- className: cx(menuRootCva({ size: size2 }), radiusCva({ radius, maxLarge: true }), className),
4111
- role: "menu",
4112
- onKeyDown: handleKeyDown,
4113
- tabIndex: 0,
4114
- "aria-activedescendant": activeItemId ?? void 0,
4115
- "data-accent-color": accentColor,
4116
- ...rest,
4117
- children: /* @__PURE__ */ jsx(MenuRootContext, { value: contextValue, children })
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
4118
3641
  }
4119
3642
  );
4120
3643
  });
4121
- MenuV2Root.displayName = "MenuRoot";
4122
- const MenuV2SelectedIndicator = memo((props) => {
4123
- const { ref, children, ...rest } = props;
4124
- return /* @__PURE__ */ jsx(SelectedIndicator, { ref, ...rest, children });
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
+ ) });
4125
3667
  });
4126
- MenuV2SelectedIndicator.displayName = "MenuCheckboxItemIndicator";
4127
- const MenuV2SelectGroup = genericMemo(function MenuSelectGroup3(props) {
3668
+ const MenuSelectGroup = genericMemo(function MenuSelectGroup2(props) {
4128
3669
  const { ref, children, required, defaultValue, value, onValueChange, ...rest } = props;
4129
- return /* @__PURE__ */ jsx(MenuV2Group, { ref, ...rest, children: required ? /* @__PURE__ */ jsx(SingleSelectRequiredProvider, { defaultValue, value, onValueChange, children }) : /* @__PURE__ */ jsx(
3670
+ return /* @__PURE__ */ jsx(MenuGroup, { ref, ...rest, children: required ? /* @__PURE__ */ jsx(SingleSelectRequiredProvider, { defaultValue, value, onValueChange, children }) : /* @__PURE__ */ jsx(
4130
3671
  SingleSelectNotRequiredProvider,
4131
3672
  {
4132
3673
  defaultValue,
@@ -4136,53 +3677,183 @@ const MenuV2SelectGroup = genericMemo(function MenuSelectGroup3(props) {
4136
3677
  }
4137
3678
  ) });
4138
3679
  });
4139
- const MenuV2SelectItem = genericMemo(function(props) {
4140
- const { ref, value, onSelect, children, ...rest } = props;
3680
+ const MenuSelectItem = genericMemo(function(props) {
3681
+ const { ref, value, onSelect, children, closeOnSelect = true, ...rest } = props;
4141
3682
  const { selected, selectValue } = use(SelectContext);
4142
- const isSelected = selected(value);
4143
- const handleSelect = useCallback(
4144
- (e) => {
4145
- onSelect == null ? void 0 : onSelect(e);
4146
- if (e.defaultPrevented) return;
4147
- selectValue(value);
4148
- },
4149
- [onSelect, selectValue, value]
4150
- );
4151
- return /* @__PURE__ */ jsx(
4152
- MenuV2Item,
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,
4153
3693
  {
4154
3694
  ref,
4155
3695
  role: "menuitemcheckbox",
4156
3696
  onSelect: handleSelect,
3697
+ closeOnSelect,
4157
3698
  "data-state": getSelectedState(isSelected),
4158
3699
  ...rest,
4159
- children: /* @__PURE__ */ jsx(SelectedIndicatorContext, { value: isSelected, children })
3700
+ children: computedChildren
4160
3701
  }
4161
- );
3702
+ ) });
4162
3703
  });
4163
- const MenuV2Separator = memo((props) => {
3704
+ const MenuSeparator = memo((props) => {
4164
3705
  const { ref, className, ...rest } = props;
4165
- const { size: size2 } = use(MenuRootContext);
4166
- return /* @__PURE__ */ jsx(RadixSeparator.Root, { className: cx(menuSeparatorCva({ size: size2 }), className), ref, ...rest });
4167
- });
4168
- MenuV2Separator.displayName = "MenuSeparator";
4169
- const MenuV2 = {
4170
- Root: MenuV2Root,
4171
- Group: MenuV2Group,
4172
- GroupLabel: MenuV2GroupLabel,
4173
- Item: MenuV2Item,
4174
- Separator: MenuV2Separator,
4175
- SelectGroup: MenuV2SelectGroup,
4176
- SelectItem: MenuV2SelectItem,
4177
- MultiSelectGroup: MenuV2MultiSelectGroup,
4178
- MultiSelectItem: MenuV2MultiSelectItem,
4179
- SelectAllItem: MenuV2SelectAllItem,
4180
- SelectedIndicator: MenuV2SelectedIndicator,
4181
- CheckboxItem: MenuV2CheckboxItem,
4182
- CheckedIndicator: MenuV2CheckedIndicator,
4183
- Pages: MenuV2Pages,
4184
- Page: MenuV2Page,
4185
- PageTriggerItem: MenuV2PageTriggerItem
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
3799
+ }
3800
+ );
3801
+ });
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
4186
3857
  };
4187
3858
  const OneTimePasswordFieldHiddenInput = memo((props) => {
4188
3859
  return /* @__PURE__ */ jsx(RadixOneTimePasswordField.HiddenInput, { ...props });
@@ -4702,6 +4373,65 @@ const RadioGroup = {
4702
4373
  Item: RadioGroupItem,
4703
4374
  Root: RadioGroupRoot
4704
4375
  };
4376
+ const RatingRootContext = createContext({});
4377
+ const RatingItemContext = createContext({});
4378
+ const RatingItem = memo((props) => {
4379
+ const { ref, children, value, ...rest } = props;
4380
+ const { value: activeValue } = use(RatingRootContext);
4381
+ const active = !!activeValue && value <= activeValue;
4382
+ const contextValue = useMemo(() => ({ value }), [value]);
4383
+ return /* @__PURE__ */ jsx(RadixRadioGroup.Item, { ref, value: value.toString(), "data-active": active, ...rest, children: /* @__PURE__ */ jsx(RatingItemContext, { value: contextValue, children }) });
4384
+ });
4385
+ RatingItem.displayName = "RatingItem";
4386
+ const RatingItemIndicator = memo((props) => {
4387
+ const { ref, children, forceMount, ...rest } = props;
4388
+ const { value: activeValue } = use(RatingRootContext);
4389
+ const { value } = use(RatingItemContext);
4390
+ const active = !!activeValue && value <= activeValue;
4391
+ return /* @__PURE__ */ jsx(
4392
+ RadixRadioGroup.Indicator,
4393
+ {
4394
+ ref,
4395
+ forceMount: forceMount ?? (active || void 0),
4396
+ "data-active": active,
4397
+ ...rest,
4398
+ children
4399
+ }
4400
+ );
4401
+ });
4402
+ RatingItemIndicator.displayName = "RatingItemIndicator";
4403
+ const RatingRoot = memo((props) => {
4404
+ const { ref, children, defaultValue, value: controlledValue, onValueChange, ...rest } = props;
4405
+ const [value, setValue] = useControlledState(defaultValue ?? null, controlledValue, onValueChange);
4406
+ const handleValueChange = useCallback(
4407
+ (value2) => {
4408
+ setValue(parseInt(value2));
4409
+ },
4410
+ [setValue]
4411
+ );
4412
+ const contextValue = useMemo(
4413
+ () => ({
4414
+ value
4415
+ }),
4416
+ [value]
4417
+ );
4418
+ return /* @__PURE__ */ jsx(
4419
+ RadixRadioGroup.Root,
4420
+ {
4421
+ ref,
4422
+ value: value ? value.toString() : null,
4423
+ onValueChange: handleValueChange,
4424
+ ...rest,
4425
+ children: /* @__PURE__ */ jsx(RatingRootContext, { value: contextValue, children })
4426
+ }
4427
+ );
4428
+ });
4429
+ RatingRoot.displayName = "RatingRoot";
4430
+ const Rating = {
4431
+ Item: RatingItem,
4432
+ ItemIndicator: RatingItemIndicator,
4433
+ Root: RatingRoot
4434
+ };
4705
4435
  const segmentedControlRootCva = cva(
4706
4436
  ["shrink-0", "transition-colors", "inline-flex", "box-border", "min-w-max", "text-center"],
4707
4437
  {
@@ -6479,6 +6209,7 @@ export {
6479
6209
  CheckboxGroupSelectAllItem,
6480
6210
  CheckboxIndicator,
6481
6211
  CheckboxRoot,
6212
+ CollapsibleTree,
6482
6213
  CommandMenu,
6483
6214
  CommandMenuCheckboxIndicator,
6484
6215
  CommandMenuCheckboxItem,
@@ -6553,23 +6284,6 @@ export {
6553
6284
  MenuSub,
6554
6285
  MenuSubContent,
6555
6286
  MenuSubTrigger,
6556
- MenuV2,
6557
- MenuV2CheckboxItem,
6558
- MenuV2CheckedIndicator,
6559
- MenuV2Group,
6560
- MenuV2GroupLabel,
6561
- MenuV2Item,
6562
- MenuV2MultiSelectGroup,
6563
- MenuV2MultiSelectItem,
6564
- MenuV2Page,
6565
- MenuV2PageTriggerItem,
6566
- MenuV2Pages,
6567
- MenuV2Root,
6568
- MenuV2SelectAllItem,
6569
- MenuV2SelectGroup,
6570
- MenuV2SelectItem,
6571
- MenuV2SelectedIndicator,
6572
- MenuV2Separator,
6573
6287
  MenuVirtualTrigger,
6574
6288
  OneTimePasswordField,
6575
6289
  OneTimePasswordFieldHiddenInput,
@@ -6595,6 +6309,10 @@ export {
6595
6309
  RadioGroupIndicator,
6596
6310
  RadioGroupItem,
6597
6311
  RadioGroupRoot,
6312
+ Rating,
6313
+ RatingItem,
6314
+ RatingItemIndicator,
6315
+ RatingRoot,
6598
6316
  SegmentedControl,
6599
6317
  SegmentedControlItem,
6600
6318
  SegmentedControlRoot,
@@ -6602,6 +6320,7 @@ export {
6602
6320
  SegmentedTabsList,
6603
6321
  SegmentedTabsRoot,
6604
6322
  SegmentedTabsTrigger,
6323
+ SelectedIndicatorContext,
6605
6324
  Separator,
6606
6325
  SlideOut,
6607
6326
  Slider,
@@ -6638,12 +6357,6 @@ export {
6638
6357
  badge,
6639
6358
  buttonCva,
6640
6359
  floating,
6641
- genericMemo,
6642
- getActiveState,
6643
- getBooleanState,
6644
- getCheckedState,
6645
- getOpenState,
6646
- getSelectedState,
6647
6360
  mergeRefs,
6648
6361
  radiusCva,
6649
6362
  stopPropagation,
@@ -6651,9 +6364,15 @@ export {
6651
6364
  useAlertDialog,
6652
6365
  useButtonGroup,
6653
6366
  useControlledState,
6654
- useFallbackId,
6655
6367
  useLayoutContext,
6368
+ useMenuContentContext,
6369
+ useMenuContext,
6370
+ usePagesContext,
6656
6371
  useProvider,
6372
+ useSelectedIndicatorContext,
6373
+ useSize,
6374
+ useStopEventPropagation,
6375
+ useSubContext,
6657
6376
  useTextFilter,
6658
6377
  useToast,
6659
6378
  useViewportSize