@octanejs/base-ui 0.1.31 → 0.1.33

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 (201) hide show
  1. package/dist/cjs/accordion.cjs +497 -0
  2. package/dist/cjs/alert-dialog.cjs +65 -0
  3. package/dist/cjs/avatar.cjs +234 -0
  4. package/dist/cjs/button.cjs +54 -0
  5. package/dist/cjs/checkbox-group.cjs +165 -0
  6. package/dist/cjs/checkbox.cjs +475 -0
  7. package/dist/cjs/collapsible.cjs +700 -0
  8. package/dist/cjs/context-menu.cjs +257 -0
  9. package/dist/cjs/csp-provider.cjs +40 -0
  10. package/dist/cjs/dialog.cjs +741 -0
  11. package/dist/cjs/direction-provider.cjs +35 -0
  12. package/dist/cjs/field.cjs +559 -0
  13. package/dist/cjs/fieldset.cjs +101 -0
  14. package/dist/cjs/form.cjs +177 -0
  15. package/dist/cjs/index.cjs +133 -0
  16. package/dist/cjs/input.cjs +32 -0
  17. package/dist/cjs/internal.cjs +51 -0
  18. package/dist/cjs/menu.cjs +2420 -0
  19. package/dist/cjs/menubar.cjs +132 -0
  20. package/dist/cjs/merge-props.cjs +34 -0
  21. package/dist/cjs/meter.cjs +169 -0
  22. package/dist/cjs/number-field.cjs +812 -0
  23. package/dist/cjs/popover.cjs +966 -0
  24. package/dist/cjs/preview-card.cjs +632 -0
  25. package/dist/cjs/progress.cjs +206 -0
  26. package/dist/cjs/radio-group.cjs +264 -0
  27. package/dist/cjs/radio.cjs +327 -0
  28. package/dist/cjs/separator.cjs +44 -0
  29. package/dist/cjs/slider.cjs +1384 -0
  30. package/dist/cjs/switch.cjs +306 -0
  31. package/dist/cjs/tabs.cjs +727 -0
  32. package/dist/cjs/toast.cjs +1766 -0
  33. package/dist/cjs/toggle-group.cjs +118 -0
  34. package/dist/cjs/toggle.cjs +121 -0
  35. package/dist/cjs/tooltip.cjs +835 -0
  36. package/dist/cjs/unstable-use-media-query.cjs +79 -0
  37. package/dist/cjs/use-render.cjs +40 -0
  38. package/dist/cjs/utils/CSPContext.cjs +38 -0
  39. package/dist/cjs/utils/CheckboxGroupContext.cjs +40 -0
  40. package/dist/cjs/utils/CompositeRootContext.cjs +40 -0
  41. package/dist/cjs/utils/ContextMenuRootContext.cjs +42 -0
  42. package/dist/cjs/utils/DirectionContext.cjs +34 -0
  43. package/dist/cjs/utils/FloatingPortalLite.cjs +47 -0
  44. package/dist/cjs/utils/InternalBackdrop.cjs +49 -0
  45. package/dist/cjs/utils/MenubarContext.cjs +40 -0
  46. package/dist/cjs/utils/RadioGroupContext.cjs +34 -0
  47. package/dist/cjs/utils/RequestQueue.cjs +111 -0
  48. package/dist/cjs/utils/TimeoutManager.cjs +50 -0
  49. package/dist/cjs/utils/ToggleGroupContext.cjs +40 -0
  50. package/dist/cjs/utils/adaptiveOriginMiddleware.cjs +94 -0
  51. package/dist/cjs/utils/addEventListener.cjs +33 -0
  52. package/dist/cjs/utils/areArraysEqual.cjs +30 -0
  53. package/dist/cjs/utils/clamp.cjs +30 -0
  54. package/dist/cjs/utils/closePart.cjs +70 -0
  55. package/dist/cjs/utils/collapsibleOpenStateMapping.cjs +42 -0
  56. package/dist/cjs/utils/composeRefs.cjs +68 -0
  57. package/dist/cjs/utils/composite/CompositeItem.cjs +59 -0
  58. package/dist/cjs/utils/composite/CompositeList.cjs +177 -0
  59. package/dist/cjs/utils/composite/CompositeListContext.cjs +43 -0
  60. package/dist/cjs/utils/composite/CompositeRoot.cjs +118 -0
  61. package/dist/cjs/utils/composite/grid-utils.cjs +343 -0
  62. package/dist/cjs/utils/composite/gridNavigation.cjs +92 -0
  63. package/dist/cjs/utils/composite/keys.cjs +174 -0
  64. package/dist/cjs/utils/composite/list-utils.cjs +90 -0
  65. package/dist/cjs/utils/composite/useCompositeItem.cjs +63 -0
  66. package/dist/cjs/utils/composite/useCompositeListItem.cjs +104 -0
  67. package/dist/cjs/utils/composite/useCompositeRoot.cjs +263 -0
  68. package/dist/cjs/utils/constants.cjs +56 -0
  69. package/dist/cjs/utils/contains.cjs +46 -0
  70. package/dist/cjs/utils/createChangeEventDetails.cjs +92 -0
  71. package/dist/cjs/utils/dom.cjs +35 -0
  72. package/dist/cjs/utils/empty.cjs +34 -0
  73. package/dist/cjs/utils/field/FieldItemContext.cjs +34 -0
  74. package/dist/cjs/utils/field/FieldRootContext.cjs +80 -0
  75. package/dist/cjs/utils/field/FormContext.cjs +41 -0
  76. package/dist/cjs/utils/field/LabelableContext.cjs +43 -0
  77. package/dist/cjs/utils/field/LabelableProvider.cjs +115 -0
  78. package/dist/cjs/utils/field/constants.cjs +68 -0
  79. package/dist/cjs/utils/field/getCombinedFieldValidityData.cjs +36 -0
  80. package/dist/cjs/utils/field/useAriaLabelledBy.cjs +87 -0
  81. package/dist/cjs/utils/field/useFieldControlRegistration.cjs +165 -0
  82. package/dist/cjs/utils/field/useFieldValidation.cjs +285 -0
  83. package/dist/cjs/utils/field/useLabel.cjs +99 -0
  84. package/dist/cjs/utils/field/useLabelableId.cjs +105 -0
  85. package/dist/cjs/utils/field/useRegisterFieldControl.cjs +60 -0
  86. package/dist/cjs/utils/findRootOwnerId.cjs +37 -0
  87. package/dist/cjs/utils/floating/FloatingDelayGroup.cjs +219 -0
  88. package/dist/cjs/utils/floating/FloatingFocusManager.cjs +685 -0
  89. package/dist/cjs/utils/floating/FloatingPortal.cjs +230 -0
  90. package/dist/cjs/utils/floating/FloatingRootStore.cjs +87 -0
  91. package/dist/cjs/utils/floating/FloatingTree.cjs +86 -0
  92. package/dist/cjs/utils/floating/FloatingTreeStore.cjs +41 -0
  93. package/dist/cjs/utils/floating/FocusGuard.cjs +54 -0
  94. package/dist/cjs/utils/floating/composite.cjs +42 -0
  95. package/dist/cjs/utils/floating/constants.cjs +34 -0
  96. package/dist/cjs/utils/floating/createAttribute.cjs +30 -0
  97. package/dist/cjs/utils/floating/createEventEmitter.cjs +44 -0
  98. package/dist/cjs/utils/floating/element.cjs +103 -0
  99. package/dist/cjs/utils/floating/enqueueFocus.cjs +51 -0
  100. package/dist/cjs/utils/floating/event.cjs +65 -0
  101. package/dist/cjs/utils/floating/getEmptyRootContext.cjs +42 -0
  102. package/dist/cjs/utils/floating/gridNavigation.cjs +45 -0
  103. package/dist/cjs/utils/floating/markOthers.cjs +181 -0
  104. package/dist/cjs/utils/floating/nodes.cjs +48 -0
  105. package/dist/cjs/utils/floating/safePolygon.cjs +301 -0
  106. package/dist/cjs/utils/floating/tabbable.cjs +242 -0
  107. package/dist/cjs/utils/floating/types.cjs +16 -0
  108. package/dist/cjs/utils/floating/useClick.cjs +153 -0
  109. package/dist/cjs/utils/floating/useClientPoint.cjs +225 -0
  110. package/dist/cjs/utils/floating/useDismiss.cjs +506 -0
  111. package/dist/cjs/utils/floating/useFloating.cjs +186 -0
  112. package/dist/cjs/utils/floating/useFloatingRootContext.cjs +75 -0
  113. package/dist/cjs/utils/floating/useFocus.cjs +184 -0
  114. package/dist/cjs/utils/floating/useHoverFloatingInteraction.cjs +231 -0
  115. package/dist/cjs/utils/floating/useHoverInteractionSharedState.cjs +113 -0
  116. package/dist/cjs/utils/floating/useHoverReferenceInteraction.cjs +380 -0
  117. package/dist/cjs/utils/floating/useHoverShared.cjs +65 -0
  118. package/dist/cjs/utils/floating/useListNavigation.cjs +665 -0
  119. package/dist/cjs/utils/floating/useSyncedFloatingRootContext.cjs +91 -0
  120. package/dist/cjs/utils/floating/useTypeahead.cjs +187 -0
  121. package/dist/cjs/utils/formatNumber.cjs +60 -0
  122. package/dist/cjs/utils/generateId.cjs +32 -0
  123. package/dist/cjs/utils/getCssDimensions.cjs +42 -0
  124. package/dist/cjs/utils/getDefaultFormSubmitter.cjs +42 -0
  125. package/dist/cjs/utils/getDisabledMountTransitionStyles.cjs +32 -0
  126. package/dist/cjs/utils/getElementRef.cjs +35 -0
  127. package/dist/cjs/utils/getPseudoElementBounds.cjs +56 -0
  128. package/dist/cjs/utils/getStateAttributesProps.cjs +46 -0
  129. package/dist/cjs/utils/hideMiddleware.cjs +42 -0
  130. package/dist/cjs/utils/inertValue.cjs +30 -0
  131. package/dist/cjs/utils/matchesFocusVisible.cjs +38 -0
  132. package/dist/cjs/utils/mergeCleanups.cjs +37 -0
  133. package/dist/cjs/utils/mergeObjects.cjs +39 -0
  134. package/dist/cjs/utils/mergeProps.cjs +182 -0
  135. package/dist/cjs/utils/noop.cjs +29 -0
  136. package/dist/cjs/utils/number/constants.cjs +34 -0
  137. package/dist/cjs/utils/number/parse.cjs +258 -0
  138. package/dist/cjs/utils/number/types.cjs +16 -0
  139. package/dist/cjs/utils/number/validate.cjs +104 -0
  140. package/dist/cjs/utils/owner.cjs +35 -0
  141. package/dist/cjs/utils/platform.cjs +83 -0
  142. package/dist/cjs/utils/popupStateMapping.cjs +74 -0
  143. package/dist/cjs/utils/popups/index.cjs +39 -0
  144. package/dist/cjs/utils/popups/inlineRect.cjs +218 -0
  145. package/dist/cjs/utils/popups/popupStoreUtils.cjs +379 -0
  146. package/dist/cjs/utils/popups/popupTriggerMap.cjs +76 -0
  147. package/dist/cjs/utils/popups/store.cjs +118 -0
  148. package/dist/cjs/utils/popups/useTriggerFocusGuards.cjs +72 -0
  149. package/dist/cjs/utils/resolveAriaLabelledBy.cjs +35 -0
  150. package/dist/cjs/utils/resolveClassName.cjs +30 -0
  151. package/dist/cjs/utils/resolveRef.cjs +33 -0
  152. package/dist/cjs/utils/resolveStyle.cjs +30 -0
  153. package/dist/cjs/utils/serializeValue.cjs +40 -0
  154. package/dist/cjs/utils/slider/asc.cjs +30 -0
  155. package/dist/cjs/utils/slider/getMidpoint.cjs +34 -0
  156. package/dist/cjs/utils/slider/getPushedThumbValues.cjs +73 -0
  157. package/dist/cjs/utils/slider/getSliderValue.cjs +42 -0
  158. package/dist/cjs/utils/slider/replaceArrayItemAtIndex.cjs +33 -0
  159. package/dist/cjs/utils/slider/resolveThumbCollision.cjs +155 -0
  160. package/dist/cjs/utils/slider/roundValueToStep.cjs +45 -0
  161. package/dist/cjs/utils/slider/validateMinimumDistance.cjs +40 -0
  162. package/dist/cjs/utils/slider/valueArrayToPercentages.cjs +36 -0
  163. package/dist/cjs/utils/store/ReactStore.cjs +135 -0
  164. package/dist/cjs/utils/store/Store.cjs +83 -0
  165. package/dist/cjs/utils/store/createSelector.cjs +74 -0
  166. package/dist/cjs/utils/store/useStore.cjs +51 -0
  167. package/dist/cjs/utils/stringifyLocale.cjs +36 -0
  168. package/dist/cjs/utils/useAnchorPositioning.cjs +421 -0
  169. package/dist/cjs/utils/useAnchoredPopupScrollLock.cjs +59 -0
  170. package/dist/cjs/utils/useAnimationFrame.cjs +93 -0
  171. package/dist/cjs/utils/useAnimationsFinished.cjs +98 -0
  172. package/dist/cjs/utils/useBaseUiId.cjs +36 -0
  173. package/dist/cjs/utils/useButton.cjs +177 -0
  174. package/dist/cjs/utils/useCheckboxGroupParent.cjs +114 -0
  175. package/dist/cjs/utils/useControlled.cjs +47 -0
  176. package/dist/cjs/utils/useEnhancedClickHandler.cjs +60 -0
  177. package/dist/cjs/utils/useFocusableWhenDisabled.cjs +77 -0
  178. package/dist/cjs/utils/useForcedRerendering.cjs +35 -0
  179. package/dist/cjs/utils/useIsHydrating.cjs +44 -0
  180. package/dist/cjs/utils/useMixedToggleClickHandler.cjs +66 -0
  181. package/dist/cjs/utils/useOnFirstRender.cjs +35 -0
  182. package/dist/cjs/utils/useOnMount.cjs +36 -0
  183. package/dist/cjs/utils/useOpenChangeComplete.cjs +57 -0
  184. package/dist/cjs/utils/useOpenInteractionType.cjs +69 -0
  185. package/dist/cjs/utils/usePopupAutoResize.cjs +191 -0
  186. package/dist/cjs/utils/usePopupViewport.cjs +283 -0
  187. package/dist/cjs/utils/usePositioner.cjs +53 -0
  188. package/dist/cjs/utils/usePressAndHold.cjs +51 -0
  189. package/dist/cjs/utils/usePreviousValue.cjs +47 -0
  190. package/dist/cjs/utils/useRefWithInit.cjs +41 -0
  191. package/dist/cjs/utils/useRegisteredLabelId.cjs +48 -0
  192. package/dist/cjs/utils/useRenderElement.cjs +106 -0
  193. package/dist/cjs/utils/useScrollLock.cjs +232 -0
  194. package/dist/cjs/utils/useStableCallback.cjs +41 -0
  195. package/dist/cjs/utils/useTimeout.cjs +66 -0
  196. package/dist/cjs/utils/useTransitionStatus.cjs +116 -0
  197. package/dist/cjs/utils/useValueAsRef.cjs +43 -0
  198. package/dist/cjs/utils/useValueChanged.cjs +55 -0
  199. package/dist/cjs/utils/valueToPercent.cjs +30 -0
  200. package/dist/cjs/utils/visuallyHidden.cjs +49 -0
  201. package/package.json +20 -8
@@ -0,0 +1,2420 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var menu_exports = {};
20
+ __export(menu_exports, {
21
+ Menu: () => Menu,
22
+ MenuHandle: () => MenuHandle,
23
+ MenuRootContext: () => MenuRootContext,
24
+ MenuStore: () => MenuStore,
25
+ MenuSubmenuRootContext: () => MenuSubmenuRootContext,
26
+ MenuViewportCssVars: () => MenuViewportCssVars,
27
+ REGULAR_ITEM: () => REGULAR_ITEM,
28
+ createMenuHandle: () => createMenuHandle,
29
+ itemMapping: () => itemMapping,
30
+ useMenuCheckboxItemContext: () => useMenuCheckboxItemContext,
31
+ useMenuGroupRootContext: () => useMenuGroupRootContext,
32
+ useMenuItem: () => useMenuItem,
33
+ useMenuItemCommonProps: () => useMenuItemCommonProps,
34
+ useMenuPortalContext: () => useMenuPortalContext,
35
+ useMenuPositionerContext: () => useMenuPositionerContext,
36
+ useMenuRadioGroupContext: () => useMenuRadioGroupContext,
37
+ useMenuRadioItemContext: () => useMenuRadioItemContext,
38
+ useMenuRootContext: () => useMenuRootContext,
39
+ useMenuSubmenuRootContext: () => useMenuSubmenuRootContext
40
+ });
41
+ module.exports = __toCommonJS(menu_exports);
42
+ var import_octane = require("octane");
43
+ var import_internal = require("./internal.cjs");
44
+ var import_separator = require("./separator.cjs");
45
+ var import_useRenderElement = require("./utils/useRenderElement.cjs");
46
+ var import_mergeProps = require("./utils/mergeProps.cjs");
47
+ var import_useButton = require("./utils/useButton.cjs");
48
+ var import_useBaseUiId = require("./utils/useBaseUiId.cjs");
49
+ var import_useStableCallback = require("./utils/useStableCallback.cjs");
50
+ var import_useControlled = require("./utils/useControlled.cjs");
51
+ var import_useRefWithInit = require("./utils/useRefWithInit.cjs");
52
+ var import_useTimeout = require("./utils/useTimeout.cjs");
53
+ var import_composeRefs = require("./utils/composeRefs.cjs");
54
+ var import_useTransitionStatus = require("./utils/useTransitionStatus.cjs");
55
+ var import_usePopupViewport = require("./utils/usePopupViewport.cjs");
56
+ var import_useCompositeListItem = require("./utils/composite/useCompositeListItem.cjs");
57
+ var import_platform = require("./utils/platform.cjs");
58
+ var import_createChangeEventDetails = require("./utils/createChangeEventDetails.cjs");
59
+ var import_empty = require("./utils/empty.cjs");
60
+ var import_ReactStore = require("./utils/store/ReactStore.cjs");
61
+ var import_createSelector = require("./utils/store/createSelector.cjs");
62
+ var import_owner = require("./utils/owner.cjs");
63
+ var import_contains = require("./utils/contains.cjs");
64
+ var import_inertValue = require("./utils/inertValue.cjs");
65
+ var import_getPseudoElementBounds = require("./utils/getPseudoElementBounds.cjs");
66
+ var import_getDisabledMountTransitionStyles = require("./utils/getDisabledMountTransitionStyles.cjs");
67
+ var import_useMixedToggleClickHandler = require("./utils/useMixedToggleClickHandler.cjs");
68
+ var import_useOpenInteractionType = require("./utils/useOpenInteractionType.cjs");
69
+ var import_useOpenChangeComplete = require("./utils/useOpenChangeComplete.cjs");
70
+ var import_useAnimationsFinished = require("./utils/useAnimationsFinished.cjs");
71
+ var import_useAnchoredPopupScrollLock = require("./utils/useAnchoredPopupScrollLock.cjs");
72
+ var import_usePositioner = require("./utils/usePositioner.cjs");
73
+ var import_InternalBackdrop = require("./utils/InternalBackdrop.cjs");
74
+ var import_adaptiveOriginMiddleware = require("./utils/adaptiveOriginMiddleware.cjs");
75
+ var import_findRootOwnerId = require("./utils/findRootOwnerId.cjs");
76
+ var import_DirectionContext = require("./utils/DirectionContext.cjs");
77
+ var import_constants = require("./utils/constants.cjs");
78
+ var import_popupStateMapping = require("./utils/popupStateMapping.cjs");
79
+ var import_useTransitionStatus2 = require("./utils/useTransitionStatus.cjs");
80
+ var import_keys = require("./utils/composite/keys.cjs");
81
+ var import_CompositeList = require("./utils/composite/CompositeList.cjs");
82
+ var import_CompositeItem = require("./utils/composite/CompositeItem.cjs");
83
+ var import_CompositeRootContext = require("./utils/CompositeRootContext.cjs");
84
+ var import_useAnchorPositioning = require("./utils/useAnchorPositioning.cjs");
85
+ var import_useClick = require("./utils/floating/useClick.cjs");
86
+ var import_useFocus = require("./utils/floating/useFocus.cjs");
87
+ var import_useDismiss = require("./utils/floating/useDismiss.cjs");
88
+ var import_useListNavigation = require("./utils/floating/useListNavigation.cjs");
89
+ var import_useTypeahead = require("./utils/floating/useTypeahead.cjs");
90
+ var import_useHoverReferenceInteraction = require("./utils/floating/useHoverReferenceInteraction.cjs");
91
+ var import_useHoverFloatingInteraction = require("./utils/floating/useHoverFloatingInteraction.cjs");
92
+ var import_useSyncedFloatingRootContext = require("./utils/floating/useSyncedFloatingRootContext.cjs");
93
+ var import_FloatingFocusManager = require("./utils/floating/FloatingFocusManager.cjs");
94
+ var import_FloatingPortal = require("./utils/floating/FloatingPortal.cjs");
95
+ var import_FocusGuard = require("./utils/floating/FocusGuard.cjs");
96
+ var import_FloatingTree = require("./utils/floating/FloatingTree.cjs");
97
+ var import_MenubarContext = require("./utils/MenubarContext.cjs");
98
+ var import_ContextMenuRootContext = require("./utils/ContextMenuRootContext.cjs");
99
+ var import_popups = require("./utils/popups/index.cjs");
100
+ var import_useTriggerFocusGuards = require("./utils/popups/useTriggerFocusGuards.cjs");
101
+ const BOUNDARY_OFFSET = 2;
102
+ const menuSelectors = {
103
+ ...import_popups.popupStoreSelectors,
104
+ disabled: (0, import_createSelector.createSelector)(
105
+ (state) => state.parent.type === "menubar" ? state.parent.context.disabled || state.disabled : state.disabled
106
+ ),
107
+ modal: (0, import_createSelector.createSelector)(
108
+ (state) => (state.parent.type === void 0 || state.parent.type === "context-menu") && (state.modal ?? true)
109
+ ),
110
+ openMethod: (0, import_createSelector.createSelector)((state) => state.openMethod),
111
+ allowMouseEnter: (0, import_createSelector.createSelector)((state) => state.allowMouseEnter),
112
+ highlightItemOnHover: (0, import_createSelector.createSelector)((state) => state.highlightItemOnHover),
113
+ stickIfOpen: (0, import_createSelector.createSelector)((state) => state.stickIfOpen),
114
+ parent: (0, import_createSelector.createSelector)((state) => state.parent),
115
+ rootId: (0, import_createSelector.createSelector)((state) => {
116
+ if (state.parent.type === "menu") {
117
+ return state.parent.store.select("rootId");
118
+ }
119
+ return state.parent.type !== void 0 ? state.parent.context.rootId : state.rootId;
120
+ }),
121
+ activeIndex: (0, import_createSelector.createSelector)((state) => state.activeIndex),
122
+ isActive: (0, import_createSelector.createSelector)(
123
+ (state, itemIndex) => state.activeIndex === itemIndex
124
+ ),
125
+ hoverEnabled: (0, import_createSelector.createSelector)((state) => state.hoverEnabled),
126
+ instantType: (0, import_createSelector.createSelector)((state) => state.instantType),
127
+ lastOpenChangeReason: (0, import_createSelector.createSelector)((state) => state.openChangeReason),
128
+ floatingTreeRoot: (0, import_createSelector.createSelector)((state) => {
129
+ if (state.parent.type === "menu") {
130
+ return state.parent.store.select("floatingTreeRoot");
131
+ }
132
+ return state.floatingTreeRoot;
133
+ }),
134
+ floatingNodeId: (0, import_createSelector.createSelector)((state) => state.floatingNodeId),
135
+ floatingParentNodeId: (0, import_createSelector.createSelector)((state) => state.floatingParentNodeId),
136
+ itemProps: (0, import_createSelector.createSelector)((state) => state.itemProps),
137
+ closeDelay: (0, import_createSelector.createSelector)((state) => state.closeDelay),
138
+ hasViewport: (0, import_createSelector.createSelector)((state) => state.hasViewport),
139
+ keyboardEventRelay: (0, import_createSelector.createSelector)(
140
+ (state) => {
141
+ if (state.keyboardEventRelay) {
142
+ return state.keyboardEventRelay;
143
+ }
144
+ if (state.parent.type === "menu") {
145
+ return state.parent.store.select("keyboardEventRelay");
146
+ }
147
+ return void 0;
148
+ }
149
+ )
150
+ };
151
+ function createInitialMenuState() {
152
+ return {
153
+ ...(0, import_popups.createInitialPopupStoreState)(),
154
+ disabled: false,
155
+ modal: true,
156
+ openMethod: null,
157
+ allowMouseEnter: false,
158
+ highlightItemOnHover: true,
159
+ stickIfOpen: true,
160
+ parent: {
161
+ type: void 0
162
+ },
163
+ rootId: void 0,
164
+ activeIndex: null,
165
+ hoverEnabled: true,
166
+ instantType: void 0,
167
+ openChangeReason: null,
168
+ floatingTreeRoot: new import_FloatingTree.FloatingTreeStore(),
169
+ floatingNodeId: void 0,
170
+ floatingParentNodeId: null,
171
+ itemProps: import_empty.EMPTY_OBJECT,
172
+ keyboardEventRelay: void 0,
173
+ closeDelay: 0,
174
+ hasViewport: false
175
+ };
176
+ }
177
+ class MenuStore extends import_ReactStore.ReactStore {
178
+ unsubscribeParentListener = null;
179
+ constructor(initialState) {
180
+ super(
181
+ { ...createInitialMenuState(), ...initialState },
182
+ {
183
+ positionerRef: { current: null },
184
+ popupRef: { current: null },
185
+ typingRef: { current: false },
186
+ itemDomElements: { current: [] },
187
+ itemLabels: { current: [] },
188
+ allowMouseUpTriggerRef: { current: false },
189
+ triggerFocusTargetRef: { current: null },
190
+ beforeContentFocusGuardRef: { current: null },
191
+ onOpenChangeComplete: void 0,
192
+ triggerElements: new import_popups.PopupTriggerMap()
193
+ },
194
+ menuSelectors
195
+ );
196
+ this.unsubscribeParentListener = this.observe("parent", (parent) => {
197
+ this.unsubscribeParentListener?.();
198
+ if (parent.type === "menu") {
199
+ let rootId = parent.store.select("rootId");
200
+ let floatingTreeRoot = parent.store.select("floatingTreeRoot");
201
+ let keyboardEventRelay = parent.store.select("keyboardEventRelay");
202
+ this.unsubscribeParentListener = parent.store.subscribe(() => {
203
+ const nextRootId = parent.store.select("rootId");
204
+ const nextFloatingTreeRoot = parent.store.select("floatingTreeRoot");
205
+ const nextKeyboardEventRelay = parent.store.select("keyboardEventRelay");
206
+ if (rootId === nextRootId && floatingTreeRoot === nextFloatingTreeRoot && keyboardEventRelay === nextKeyboardEventRelay) {
207
+ return;
208
+ }
209
+ rootId = nextRootId;
210
+ floatingTreeRoot = nextFloatingTreeRoot;
211
+ keyboardEventRelay = nextKeyboardEventRelay;
212
+ this.notifyAll();
213
+ });
214
+ this.context.allowMouseUpTriggerRef = parent.store.context.allowMouseUpTriggerRef;
215
+ return;
216
+ }
217
+ if (parent.type !== void 0) {
218
+ this.context.allowMouseUpTriggerRef = parent.context.allowMouseUpTriggerRef;
219
+ }
220
+ this.unsubscribeParentListener = null;
221
+ });
222
+ }
223
+ // Routed through the floating root context's event bus rather than applied directly, so that
224
+ // `Menu.Root` owns the one `setOpen` implementation even when the caller is a DETACHED trigger
225
+ // (or `MenuHandle`) that only holds the store.
226
+ setOpen(open, eventDetails) {
227
+ this.state.floatingRootContext.context.events.emit("setOpen", { open, eventDetails });
228
+ }
229
+ static useStore(externalStore, initialState, slot) {
230
+ const internalStore = (0, import_useRefWithInit.useRefWithInit)(
231
+ () => new MenuStore(initialState),
232
+ (0, import_internal.subSlot)(slot, "ref")
233
+ ).current;
234
+ return externalStore ?? internalStore;
235
+ }
236
+ }
237
+ class MenuHandle {
238
+ /** Internal store holding the menu's state. */
239
+ store;
240
+ constructor() {
241
+ this.store = new MenuStore();
242
+ }
243
+ /**
244
+ * Opens the menu and associates it with the trigger with the given id. The trigger must be a
245
+ * `Menu.Trigger` with this handle passed as a prop.
246
+ */
247
+ open(triggerId) {
248
+ const triggerElement = triggerId ? this.store.context.triggerElements.getById(triggerId) : void 0;
249
+ if (triggerId && !triggerElement) {
250
+ throw new Error(`Base UI: MenuHandle.open: No trigger found with id "${triggerId}".`);
251
+ }
252
+ this.store.setOpen(
253
+ true,
254
+ (0, import_createChangeEventDetails.createChangeEventDetails)(import_createChangeEventDetails.REASONS.imperativeAction, void 0, triggerElement)
255
+ );
256
+ }
257
+ /** Closes the menu. */
258
+ close() {
259
+ this.store.setOpen(
260
+ false,
261
+ (0, import_createChangeEventDetails.createChangeEventDetails)(import_createChangeEventDetails.REASONS.imperativeAction, void 0, void 0)
262
+ );
263
+ }
264
+ /** Indicates whether the menu is currently open. */
265
+ get isOpen() {
266
+ return this.store.select("open");
267
+ }
268
+ }
269
+ function createMenuHandle() {
270
+ return new MenuHandle();
271
+ }
272
+ const MenuRootContext = (0, import_octane.createContext)(void 0);
273
+ function useMenuRootContext(optional) {
274
+ const context = (0, import_octane.useContext)(MenuRootContext);
275
+ if (context === void 0 && !optional) {
276
+ throw new Error(
277
+ "Base UI: MenuRootContext is missing. Menu parts must be placed within <Menu.Root>."
278
+ );
279
+ }
280
+ return context;
281
+ }
282
+ const MenuSubmenuRootContext = (0, import_octane.createContext)(
283
+ void 0
284
+ );
285
+ function useMenuSubmenuRootContext() {
286
+ return (0, import_octane.useContext)(MenuSubmenuRootContext);
287
+ }
288
+ const MenuPortalContext = (0, import_octane.createContext)(void 0);
289
+ function useMenuPortalContext() {
290
+ const value = (0, import_octane.useContext)(MenuPortalContext);
291
+ if (value === void 0) {
292
+ throw new Error("Base UI: <Menu.Portal> is missing.");
293
+ }
294
+ return value;
295
+ }
296
+ const MenuPositionerContext = (0, import_octane.createContext)(void 0);
297
+ function useMenuPositionerContext(optional) {
298
+ const context = (0, import_octane.useContext)(MenuPositionerContext);
299
+ if (!context && !optional) {
300
+ throw new Error(
301
+ "Base UI: MenuPositionerContext is missing. Menu parts must be placed within <Menu.Positioner>."
302
+ );
303
+ }
304
+ return context;
305
+ }
306
+ function MenuRoot(props) {
307
+ const slot = (0, import_internal.S)("MenuRoot");
308
+ const {
309
+ children,
310
+ open: openProp,
311
+ onOpenChange,
312
+ onOpenChangeComplete,
313
+ defaultOpen = false,
314
+ disabled: disabledProp = false,
315
+ modal: modalProp,
316
+ loopFocus = true,
317
+ orientation = "vertical",
318
+ actionsRef,
319
+ closeParentOnEsc = false,
320
+ handle,
321
+ triggerId: triggerIdProp,
322
+ defaultTriggerId: defaultTriggerIdProp = null,
323
+ highlightItemOnHover = true
324
+ } = props;
325
+ const contextMenuContext = (0, import_ContextMenuRootContext.useContextMenuRootContext)(true);
326
+ const parentMenuRootContext = useMenuRootContext(true);
327
+ const menubarContext = (0, import_MenubarContext.useMenubarContext)(true);
328
+ const isSubmenu = useMenuSubmenuRootContext();
329
+ const parentFromContext = (0, import_octane.useMemo)(
330
+ () => {
331
+ if (isSubmenu && parentMenuRootContext) {
332
+ return {
333
+ type: "menu",
334
+ store: parentMenuRootContext.store
335
+ };
336
+ }
337
+ if (menubarContext) {
338
+ return {
339
+ type: "menubar",
340
+ context: menubarContext
341
+ };
342
+ }
343
+ if (contextMenuContext && !parentMenuRootContext) {
344
+ return {
345
+ type: "context-menu",
346
+ context: contextMenuContext
347
+ };
348
+ }
349
+ return {
350
+ type: void 0
351
+ };
352
+ },
353
+ [contextMenuContext, parentMenuRootContext, menubarContext, isSubmenu],
354
+ (0, import_internal.subSlot)(slot, "parent")
355
+ );
356
+ const store = MenuStore.useStore(
357
+ handle?.store,
358
+ {
359
+ open: defaultOpen,
360
+ openProp,
361
+ activeTriggerId: defaultTriggerIdProp,
362
+ triggerIdProp,
363
+ parent: parentFromContext
364
+ },
365
+ (0, import_internal.subSlot)(slot, "store")
366
+ );
367
+ (0, import_popups.useInitialOpenSync)(
368
+ store,
369
+ openProp,
370
+ defaultOpen,
371
+ defaultTriggerIdProp,
372
+ (0, import_internal.subSlot)(slot, "ios")
373
+ );
374
+ store.useControlledProp("openProp", openProp, (0, import_internal.subSlot)(slot, "cp-open"));
375
+ store.useControlledProp("triggerIdProp", triggerIdProp, (0, import_internal.subSlot)(slot, "cp-tid"));
376
+ store.useContextCallback("onOpenChangeComplete", onOpenChangeComplete, (0, import_internal.subSlot)(slot, "cc"));
377
+ const rootId = (0, import_octane.useId)((0, import_internal.subSlot)(slot, "rootId"));
378
+ const floatingId = (0, import_octane.useId)((0, import_internal.subSlot)(slot, "floatingId"));
379
+ const floatingTreeRoot = store.useState("floatingTreeRoot", (0, import_internal.subSlot)(slot, "ftr"));
380
+ const floatingNodeIdFromContext = (0, import_FloatingTree.useFloatingNodeId)(floatingTreeRoot, (0, import_internal.subSlot)(slot, "nodeId"));
381
+ const floatingParentNodeIdFromContext = (0, import_FloatingTree.useFloatingParentNodeId)();
382
+ const open = store.useState("open", (0, import_internal.subSlot)(slot, "open"));
383
+ const activeTriggerElement = store.useState("activeTriggerElement", (0, import_internal.subSlot)(slot, "ate"));
384
+ const positionerElement = store.useState("positionerElement", (0, import_internal.subSlot)(slot, "posEl"));
385
+ const hoverEnabled = store.useState("hoverEnabled", (0, import_internal.subSlot)(slot, "he"));
386
+ const disabled = store.useState("disabled", (0, import_internal.subSlot)(slot, "disabled"));
387
+ const lastOpenChangeReason = store.useState("lastOpenChangeReason", (0, import_internal.subSlot)(slot, "locr"));
388
+ const parent = store.useState("parent", (0, import_internal.subSlot)(slot, "p"));
389
+ const activeIndex = store.useState("activeIndex", (0, import_internal.subSlot)(slot, "ai"));
390
+ const payload = store.useState("payload", (0, import_internal.subSlot)(slot, "payload"));
391
+ const floatingParentNodeId = store.useState("floatingParentNodeId", (0, import_internal.subSlot)(slot, "fpni"));
392
+ const openEventRef = (0, import_octane.useRef)(null, (0, import_internal.subSlot)(slot, "oer"));
393
+ const allowOutsidePressDismissalRef = (0, import_octane.useRef)(
394
+ parent.type !== "context-menu",
395
+ (0, import_internal.subSlot)(slot, "aopdr")
396
+ );
397
+ const allowOutsidePressDismissalTimeout = (0, import_useTimeout.useTimeout)((0, import_internal.subSlot)(slot, "aopdt"));
398
+ const allowTouchToCloseRef = (0, import_octane.useRef)(true, (0, import_internal.subSlot)(slot, "attcr"));
399
+ const allowTouchToCloseTimeout = (0, import_useTimeout.useTimeout)((0, import_internal.subSlot)(slot, "attct"));
400
+ const nested = floatingParentNodeId != null;
401
+ const { openMethod, triggerProps: interactionTypeProps } = (0, import_useOpenInteractionType.useOpenInteractionType)(
402
+ open,
403
+ (0, import_internal.subSlot)(slot, "oit")
404
+ );
405
+ store.useSyncedValues(
406
+ {
407
+ disabled: disabledProp,
408
+ highlightItemOnHover,
409
+ modal: parent.type === void 0 ? modalProp : void 0,
410
+ openMethod,
411
+ rootId
412
+ },
413
+ (0, import_internal.subSlot)(slot, "sv")
414
+ );
415
+ (0, import_popups.useImplicitActiveTrigger)(store, {}, (0, import_internal.subSlot)(slot, "iat"));
416
+ const { forceUnmount } = (0, import_popups.useOpenStateTransitions)(
417
+ open,
418
+ store,
419
+ () => {
420
+ store.update({ allowMouseEnter: false, stickIfOpen: true });
421
+ },
422
+ (0, import_internal.subSlot)(slot, "ost")
423
+ );
424
+ (0, import_octane.useLayoutEffect)(
425
+ () => {
426
+ if (contextMenuContext && !parentMenuRootContext) {
427
+ store.update({
428
+ parent: {
429
+ type: "context-menu",
430
+ context: contextMenuContext
431
+ },
432
+ floatingNodeId: floatingNodeIdFromContext,
433
+ floatingParentNodeId: floatingParentNodeIdFromContext
434
+ });
435
+ } else if (parentMenuRootContext) {
436
+ store.update({
437
+ floatingNodeId: floatingNodeIdFromContext,
438
+ floatingParentNodeId: floatingParentNodeIdFromContext
439
+ });
440
+ }
441
+ },
442
+ [
443
+ contextMenuContext,
444
+ parentMenuRootContext,
445
+ floatingNodeIdFromContext,
446
+ floatingParentNodeIdFromContext,
447
+ store
448
+ ],
449
+ (0, import_internal.subSlot)(slot, "e:parentSync")
450
+ );
451
+ (0, import_octane.useEffect)(
452
+ () => {
453
+ if (!open) {
454
+ openEventRef.current = null;
455
+ }
456
+ if (parent.type !== "context-menu") {
457
+ return;
458
+ }
459
+ if (!open) {
460
+ allowOutsidePressDismissalTimeout.clear();
461
+ allowOutsidePressDismissalRef.current = false;
462
+ return;
463
+ }
464
+ allowOutsidePressDismissalTimeout.start(500, () => {
465
+ allowOutsidePressDismissalRef.current = true;
466
+ });
467
+ },
468
+ [allowOutsidePressDismissalTimeout, open, parent.type],
469
+ (0, import_internal.subSlot)(slot, "e:outsidePress")
470
+ );
471
+ (0, import_octane.useLayoutEffect)(
472
+ () => {
473
+ if (!open && !hoverEnabled) {
474
+ store.set("hoverEnabled", true);
475
+ }
476
+ },
477
+ [open, hoverEnabled, store],
478
+ (0, import_internal.subSlot)(slot, "e:hover")
479
+ );
480
+ const setOpen = (0, import_useStableCallback.useStableCallback)(
481
+ (nextOpen, eventDetails) => {
482
+ const reason = eventDetails.reason;
483
+ if (open === nextOpen && eventDetails.trigger === activeTriggerElement && lastOpenChangeReason === reason) {
484
+ return;
485
+ }
486
+ const shouldPreventUnmountOnClose = (0, import_popups.attachPreventUnmountOnClose)(eventDetails);
487
+ if (!nextOpen && eventDetails.trigger == null) {
488
+ eventDetails.trigger = activeTriggerElement ?? void 0;
489
+ }
490
+ onOpenChange?.(nextOpen, eventDetails);
491
+ if (eventDetails.isCanceled) {
492
+ return;
493
+ }
494
+ store.state.floatingRootContext.dispatchOpenChange(nextOpen, eventDetails);
495
+ const nativeEvent = eventDetails.event;
496
+ if (nextOpen === false && nativeEvent?.type === "click" && nativeEvent.pointerType === "touch" && !allowTouchToCloseRef.current) {
497
+ return;
498
+ }
499
+ if (nextOpen && reason === import_createChangeEventDetails.REASONS.triggerFocus) {
500
+ allowTouchToCloseRef.current = false;
501
+ allowTouchToCloseTimeout.start(300, () => {
502
+ allowTouchToCloseRef.current = true;
503
+ });
504
+ } else {
505
+ allowTouchToCloseRef.current = true;
506
+ allowTouchToCloseTimeout.clear();
507
+ }
508
+ const isKeyboardClick = (reason === import_createChangeEventDetails.REASONS.triggerPress || reason === import_createChangeEventDetails.REASONS.itemPress) && nativeEvent.detail === 0 && nativeEvent?.isTrusted;
509
+ const isDismissClose = !nextOpen && (reason === import_createChangeEventDetails.REASONS.escapeKey || reason == null);
510
+ const updatedState = {
511
+ open: nextOpen,
512
+ openChangeReason: reason
513
+ };
514
+ openEventRef.current = eventDetails.event ?? null;
515
+ (0, import_popups.setPopupOpenState)(
516
+ updatedState,
517
+ nextOpen,
518
+ eventDetails.trigger,
519
+ shouldPreventUnmountOnClose()
520
+ );
521
+ store.update(updatedState);
522
+ if (parent.type === "menubar" && (reason === import_createChangeEventDetails.REASONS.triggerFocus || reason === import_createChangeEventDetails.REASONS.focusOut || reason === import_createChangeEventDetails.REASONS.triggerHover || reason === import_createChangeEventDetails.REASONS.listNavigation || reason === import_createChangeEventDetails.REASONS.siblingOpen)) {
523
+ store.set("instantType", "group");
524
+ } else if (isKeyboardClick || isDismissClose) {
525
+ store.set("instantType", isKeyboardClick ? "click" : "dismiss");
526
+ } else {
527
+ store.set("instantType", void 0);
528
+ }
529
+ },
530
+ (0, import_internal.subSlot)(slot, "setOpen")
531
+ );
532
+ const floatingRootContext = (0, import_useSyncedFloatingRootContext.useSyncedFloatingRootContext)(
533
+ {
534
+ popupStore: store,
535
+ floatingId,
536
+ nested: floatingParentNodeIdFromContext != null,
537
+ onOpenChange: setOpen
538
+ },
539
+ (0, import_internal.subSlot)(slot, "sfrc")
540
+ );
541
+ const floatingEvents = floatingRootContext.context.events;
542
+ (0, import_octane.useEffect)(
543
+ () => {
544
+ const handleSetOpenEvent = ({
545
+ open: nextOpen,
546
+ eventDetails
547
+ }) => setOpen(nextOpen, eventDetails);
548
+ floatingEvents.on("setOpen", handleSetOpenEvent);
549
+ return () => {
550
+ floatingEvents?.off("setOpen", handleSetOpenEvent);
551
+ };
552
+ },
553
+ [floatingEvents, setOpen],
554
+ (0, import_internal.subSlot)(slot, "e:setOpen")
555
+ );
556
+ const handleImperativeClose = (0, import_octane.useCallback)(
557
+ () => {
558
+ store.setOpen(false, (0, import_createChangeEventDetails.createChangeEventDetails)(import_createChangeEventDetails.REASONS.imperativeAction));
559
+ },
560
+ [store],
561
+ (0, import_internal.subSlot)(slot, "close")
562
+ );
563
+ (0, import_octane.useImperativeHandle)(
564
+ actionsRef,
565
+ () => ({ unmount: forceUnmount, close: handleImperativeClose }),
566
+ [forceUnmount, handleImperativeClose],
567
+ (0, import_internal.subSlot)(slot, "imp")
568
+ );
569
+ let ctx;
570
+ if (parent.type === "context-menu") {
571
+ ctx = parent.context;
572
+ }
573
+ (0, import_octane.useImperativeHandle)(
574
+ ctx?.positionerRef,
575
+ () => positionerElement,
576
+ [positionerElement],
577
+ (0, import_internal.subSlot)(slot, "imp-pos")
578
+ );
579
+ (0, import_octane.useImperativeHandle)(ctx?.actionsRef, () => ({ setOpen }), [setOpen], (0, import_internal.subSlot)(slot, "imp-act"));
580
+ const dismiss = (0, import_useDismiss.useDismiss)(
581
+ floatingRootContext,
582
+ {
583
+ enabled: !disabled,
584
+ bubbles: { escapeKey: closeParentOnEsc && parent.type === "menu" },
585
+ outsidePress() {
586
+ if (parent.type !== "context-menu" || openEventRef.current?.type === "contextmenu") {
587
+ return true;
588
+ }
589
+ return allowOutsidePressDismissalRef.current;
590
+ },
591
+ externalTree: nested ? floatingTreeRoot : void 0
592
+ },
593
+ (0, import_internal.subSlot)(slot, "dismiss")
594
+ );
595
+ const direction = (0, import_DirectionContext.useDirection)();
596
+ const setActiveIndex = (0, import_octane.useCallback)(
597
+ (index) => {
598
+ if (store.select("activeIndex") === index) {
599
+ return;
600
+ }
601
+ store.set("activeIndex", index);
602
+ },
603
+ [store],
604
+ (0, import_internal.subSlot)(slot, "sai")
605
+ );
606
+ const listNavigation = (0, import_useListNavigation.useListNavigation)(
607
+ floatingRootContext,
608
+ {
609
+ enabled: !disabled,
610
+ listRef: store.context.itemDomElements,
611
+ activeIndex,
612
+ nested: parent.type !== void 0,
613
+ loopFocus,
614
+ orientation,
615
+ parentOrientation: parent.type === "menubar" ? parent.context.orientation : void 0,
616
+ rtl: direction === "rtl",
617
+ disabledIndices: import_empty.EMPTY_ARRAY,
618
+ onNavigate: setActiveIndex,
619
+ openOnArrowKeyDown: parent.type !== "context-menu",
620
+ externalTree: nested ? floatingTreeRoot : void 0,
621
+ focusItemOnHover: highlightItemOnHover
622
+ },
623
+ (0, import_internal.subSlot)(slot, "listNav")
624
+ );
625
+ const onTyping = (0, import_octane.useCallback)(
626
+ (nextTyping) => {
627
+ store.context.typingRef.current = nextTyping;
628
+ },
629
+ [store],
630
+ (0, import_internal.subSlot)(slot, "onTyping")
631
+ );
632
+ const typeahead = (0, import_useTypeahead.useTypeahead)(
633
+ floatingRootContext,
634
+ {
635
+ enabled: !disabled,
636
+ listRef: store.context.itemLabels,
637
+ elementsRef: store.context.itemDomElements,
638
+ activeIndex,
639
+ resetMs: import_constants.TYPEAHEAD_RESET_MS,
640
+ onMatch: (index) => {
641
+ if (open && index !== activeIndex) {
642
+ store.set("activeIndex", index);
643
+ }
644
+ },
645
+ onTyping
646
+ },
647
+ (0, import_internal.subSlot)(slot, "typeahead")
648
+ );
649
+ const activeTriggerProps = (0, import_octane.useMemo)(
650
+ () => {
651
+ const mergedProps = (0, import_mergeProps.mergeProps)(
652
+ typeahead.reference,
653
+ listNavigation.reference,
654
+ dismiss.reference,
655
+ {
656
+ onMouseMove() {
657
+ store.set("allowMouseEnter", true);
658
+ }
659
+ },
660
+ interactionTypeProps
661
+ );
662
+ mergedProps["aria-haspopup"] = "menu";
663
+ mergedProps["aria-expanded"] = open;
664
+ return mergedProps;
665
+ },
666
+ [
667
+ store,
668
+ typeahead.reference,
669
+ listNavigation.reference,
670
+ dismiss.reference,
671
+ interactionTypeProps,
672
+ open
673
+ ],
674
+ (0, import_internal.subSlot)(slot, "atp")
675
+ );
676
+ const inactiveTriggerProps = (0, import_octane.useMemo)(
677
+ () => {
678
+ const mergedProps = (0, import_mergeProps.mergeProps)(listNavigation.trigger, dismiss.trigger, interactionTypeProps);
679
+ mergedProps["aria-haspopup"] = "menu";
680
+ mergedProps["aria-expanded"] = false;
681
+ return mergedProps;
682
+ },
683
+ [listNavigation.trigger, dismiss.trigger, interactionTypeProps],
684
+ (0, import_internal.subSlot)(slot, "itp")
685
+ );
686
+ const popupProps = (0, import_octane.useMemo)(
687
+ () => (0, import_mergeProps.mergeProps)(
688
+ import_popups.FOCUSABLE_POPUP_PROPS,
689
+ {
690
+ id: floatingId,
691
+ role: "menu",
692
+ "aria-labelledby": activeTriggerElement?.id,
693
+ onMouseMove() {
694
+ store.set("allowMouseEnter", true);
695
+ if (parent.type === "menu") {
696
+ store.set("hoverEnabled", false);
697
+ }
698
+ },
699
+ onClick() {
700
+ if (store.select("hoverEnabled")) {
701
+ store.set("hoverEnabled", false);
702
+ }
703
+ },
704
+ onKeyDown(event) {
705
+ const relay = store.select("keyboardEventRelay");
706
+ if (relay && !event.cancelBubble) {
707
+ relay(event);
708
+ }
709
+ }
710
+ },
711
+ typeahead.floating,
712
+ listNavigation.floating,
713
+ dismiss.floating
714
+ ),
715
+ [
716
+ activeTriggerElement,
717
+ floatingId,
718
+ parent.type,
719
+ store,
720
+ typeahead.floating,
721
+ listNavigation.floating,
722
+ dismiss.floating
723
+ ],
724
+ (0, import_internal.subSlot)(slot, "pp")
725
+ );
726
+ const itemProps = listNavigation.item ?? import_empty.EMPTY_OBJECT;
727
+ (0, import_popups.usePopupInteractionProps)(
728
+ store,
729
+ {
730
+ floatingRootContext,
731
+ activeTriggerProps,
732
+ inactiveTriggerProps,
733
+ popupProps,
734
+ itemProps
735
+ },
736
+ (0, import_internal.subSlot)(slot, "pip")
737
+ );
738
+ const context = (0, import_octane.useMemo)(
739
+ () => ({
740
+ store,
741
+ parent: parentFromContext
742
+ }),
743
+ [store, parentFromContext],
744
+ (0, import_internal.subSlot)(slot, "ctx")
745
+ );
746
+ const resolvedChildren = typeof children === "function" && !(0, import_octane.isChildrenBlock)(children) ? children({ payload }) : children;
747
+ const content = (0, import_octane.createElement)(MenuRootContext.Provider, {
748
+ value: context,
749
+ children: resolvedChildren
750
+ });
751
+ if (parent.type === void 0 || parent.type === "context-menu") {
752
+ return (0, import_octane.createElement)(import_FloatingTree.FloatingTree, { externalTree: floatingTreeRoot, children: content });
753
+ }
754
+ return content;
755
+ }
756
+ function useMenuParent(slot) {
757
+ const contextMenuContext = (0, import_ContextMenuRootContext.useContextMenuRootContext)(true);
758
+ const parentContext = useMenuRootContext(true);
759
+ const menubarContext = (0, import_MenubarContext.useMenubarContext)(true);
760
+ return (0, import_octane.useMemo)(
761
+ () => {
762
+ if (menubarContext) {
763
+ return {
764
+ type: "menubar",
765
+ context: menubarContext
766
+ };
767
+ }
768
+ if (contextMenuContext && !parentContext) {
769
+ return {
770
+ type: "context-menu",
771
+ context: contextMenuContext
772
+ };
773
+ }
774
+ return {
775
+ type: void 0
776
+ };
777
+ },
778
+ [contextMenuContext, parentContext, menubarContext],
779
+ (0, import_internal.subSlot)(slot, "parent")
780
+ );
781
+ }
782
+ function useStickIfOpen(open, openReason, slot) {
783
+ const stickIfOpenTimeout = (0, import_useTimeout.useTimeout)((0, import_internal.subSlot)(slot, "to"));
784
+ const [stickIfOpen, setStickIfOpen] = (0, import_octane.useState)(false, (0, import_internal.subSlot)(slot, "s"));
785
+ (0, import_octane.useLayoutEffect)(
786
+ () => {
787
+ if (open && openReason === import_createChangeEventDetails.REASONS.triggerHover) {
788
+ setStickIfOpen(true);
789
+ stickIfOpenTimeout.start(import_constants.PATIENT_CLICK_THRESHOLD, () => {
790
+ setStickIfOpen(false);
791
+ });
792
+ } else if (!open) {
793
+ stickIfOpenTimeout.clear();
794
+ setStickIfOpen(false);
795
+ }
796
+ },
797
+ [open, openReason, stickIfOpenTimeout],
798
+ (0, import_internal.subSlot)(slot, "e")
799
+ );
800
+ return stickIfOpen;
801
+ }
802
+ function MenuTrigger(componentProps) {
803
+ const slot = (0, import_internal.S)("MenuTrigger");
804
+ const {
805
+ render,
806
+ className,
807
+ style,
808
+ disabled: disabledProp = false,
809
+ nativeButton = true,
810
+ id: idProp,
811
+ openOnHover: openOnHoverProp,
812
+ delay = 100,
813
+ closeDelay = 0,
814
+ handle,
815
+ payload,
816
+ ref: forwardedRef,
817
+ ...elementProps
818
+ } = componentProps;
819
+ const rootContext = useMenuRootContext(true);
820
+ const store = handle?.store ?? rootContext?.store;
821
+ if (!store) {
822
+ throw new Error(
823
+ "Base UI: <Menu.Trigger> must be either used within a <Menu.Root> component or provided with a handle."
824
+ );
825
+ }
826
+ const thisTriggerId = (0, import_useBaseUiId.useBaseUiId)(idProp, (0, import_internal.subSlot)(slot, "id"));
827
+ const isTriggerActive = store.useState("isTriggerActive", (0, import_internal.subSlot)(slot, "ita"), thisTriggerId);
828
+ const floatingRootContext = store.useState("floatingRootContext", (0, import_internal.subSlot)(slot, "frc"));
829
+ const isOpenedByThisTrigger = store.useState(
830
+ "isOpenedByTrigger",
831
+ (0, import_internal.subSlot)(slot, "obt"),
832
+ thisTriggerId
833
+ );
834
+ const popupId = store.useState("triggerPopupId", (0, import_internal.subSlot)(slot, "tpid"), thisTriggerId);
835
+ const triggerElementRef = (0, import_octane.useRef)(null, (0, import_internal.subSlot)(slot, "ter"));
836
+ const parent = useMenuParent((0, import_internal.subSlot)(slot, "mp"));
837
+ const compositeRootContext = (0, import_CompositeRootContext.useCompositeRootContext)(true);
838
+ const floatingTreeRootFromContext = (0, import_FloatingTree.useFloatingTree)();
839
+ const floatingTreeRoot = (0, import_octane.useMemo)(
840
+ () => floatingTreeRootFromContext ?? new import_FloatingTree.FloatingTreeStore(),
841
+ [floatingTreeRootFromContext],
842
+ (0, import_internal.subSlot)(slot, "ftr")
843
+ );
844
+ const floatingNodeId = (0, import_FloatingTree.useFloatingNodeId)(floatingTreeRoot, (0, import_internal.subSlot)(slot, "nodeId"));
845
+ const floatingParentNodeId = (0, import_FloatingTree.useFloatingParentNodeId)();
846
+ const { registerTrigger, isMountedByThisTrigger } = (0, import_popups.useTriggerDataForwarding)(
847
+ thisTriggerId,
848
+ triggerElementRef,
849
+ store,
850
+ {
851
+ payload,
852
+ closeDelay,
853
+ parent,
854
+ floatingTreeRoot,
855
+ floatingNodeId,
856
+ floatingParentNodeId,
857
+ keyboardEventRelay: compositeRootContext?.relayKeyboardEvent
858
+ },
859
+ (0, import_internal.subSlot)(slot, "tdf")
860
+ );
861
+ const isInMenubar = parent.type === "menubar";
862
+ const rootDisabled = store.useState("disabled", (0, import_internal.subSlot)(slot, "rd"));
863
+ const disabled = disabledProp || rootDisabled || isInMenubar && parent.context.disabled;
864
+ const { getButtonProps, buttonRef } = (0, import_useButton.useButton)(
865
+ { disabled, native: nativeButton },
866
+ (0, import_internal.subSlot)(slot, "btn")
867
+ );
868
+ (0, import_octane.useEffect)(
869
+ () => {
870
+ if (!isOpenedByThisTrigger && parent.type === void 0) {
871
+ store.context.allowMouseUpTriggerRef.current = false;
872
+ }
873
+ },
874
+ [store, isOpenedByThisTrigger, parent.type],
875
+ (0, import_internal.subSlot)(slot, "e:allowMouseUp")
876
+ );
877
+ const triggerRef = (0, import_octane.useRef)(null, (0, import_internal.subSlot)(slot, "tr"));
878
+ const allowMouseUpTriggerTimeout = (0, import_useTimeout.useTimeout)((0, import_internal.subSlot)(slot, "amutt"));
879
+ const handleDocumentMouseUp = (0, import_useStableCallback.useStableCallback)(
880
+ (mouseEvent) => {
881
+ if (!triggerRef.current) {
882
+ return;
883
+ }
884
+ allowMouseUpTriggerTimeout.clear();
885
+ store.context.allowMouseUpTriggerRef.current = false;
886
+ const mouseUpTarget = mouseEvent.target;
887
+ if ((0, import_contains.contains)(triggerRef.current, mouseUpTarget) || (0, import_contains.contains)(store.select("positionerElement"), mouseUpTarget) || mouseUpTarget === triggerRef.current) {
888
+ return;
889
+ }
890
+ if (mouseUpTarget != null && (0, import_findRootOwnerId.findRootOwnerId)(mouseUpTarget) === store.select("rootId")) {
891
+ return;
892
+ }
893
+ const bounds = (0, import_getPseudoElementBounds.getPseudoElementBounds)(triggerRef.current);
894
+ if (mouseEvent.clientX >= bounds.left - BOUNDARY_OFFSET && mouseEvent.clientX <= bounds.right + BOUNDARY_OFFSET && mouseEvent.clientY >= bounds.top - BOUNDARY_OFFSET && mouseEvent.clientY <= bounds.bottom + BOUNDARY_OFFSET) {
895
+ return;
896
+ }
897
+ floatingTreeRoot.events.emit("close", {
898
+ domEvent: mouseEvent,
899
+ reason: import_createChangeEventDetails.REASONS.cancelOpen
900
+ });
901
+ },
902
+ (0, import_internal.subSlot)(slot, "hdmu")
903
+ );
904
+ (0, import_octane.useEffect)(
905
+ () => {
906
+ if (isOpenedByThisTrigger && store.select("lastOpenChangeReason") === import_createChangeEventDetails.REASONS.triggerHover) {
907
+ const doc = (0, import_owner.ownerDocument)(triggerRef.current);
908
+ doc.addEventListener("mouseup", handleDocumentMouseUp, { once: true });
909
+ }
910
+ },
911
+ [isOpenedByThisTrigger, handleDocumentMouseUp, store],
912
+ (0, import_internal.subSlot)(slot, "e:mouseup")
913
+ );
914
+ const parentMenubarHasSubmenuOpen = isInMenubar && parent.context.hasSubmenuOpen;
915
+ const openOnHover = openOnHoverProp ?? parentMenubarHasSubmenuOpen;
916
+ const hoverProps = (0, import_useHoverReferenceInteraction.useHoverReferenceInteraction)(
917
+ floatingRootContext,
918
+ {
919
+ enabled: openOnHover && !disabled && parent.type !== "context-menu" && (!isInMenubar || parentMenubarHasSubmenuOpen && !isMountedByThisTrigger),
920
+ handleClose: (0, import_useHoverReferenceInteraction.safePolygon)({ blockPointerEvents: !isInMenubar }),
921
+ mouseOnly: true,
922
+ move: false,
923
+ restMs: parent.type === void 0 ? delay : void 0,
924
+ delay: { close: closeDelay },
925
+ triggerElementRef,
926
+ externalTree: floatingTreeRoot,
927
+ isActiveTrigger: isTriggerActive,
928
+ isClosing: () => store.select("transitionStatus") === "ending"
929
+ },
930
+ (0, import_internal.subSlot)(slot, "hover")
931
+ );
932
+ const stickIfOpen = useStickIfOpen(
933
+ isOpenedByThisTrigger,
934
+ store.select("lastOpenChangeReason"),
935
+ (0, import_internal.subSlot)(slot, "sio")
936
+ );
937
+ const click = (0, import_useClick.useClick)(
938
+ floatingRootContext,
939
+ {
940
+ enabled: !disabled && parent.type !== "context-menu",
941
+ event: isOpenedByThisTrigger && isInMenubar ? "click" : "mousedown",
942
+ toggle: true,
943
+ ignoreMouse: false,
944
+ stickIfOpen: parent.type === void 0 ? stickIfOpen : false
945
+ },
946
+ (0, import_internal.subSlot)(slot, "click")
947
+ );
948
+ const focus = (0, import_useFocus.useFocus)(
949
+ floatingRootContext,
950
+ { enabled: !disabled && parentMenubarHasSubmenuOpen },
951
+ (0, import_internal.subSlot)(slot, "focus")
952
+ );
953
+ const mixedToggleHandlers = (0, import_useMixedToggleClickHandler.useMixedToggleClickHandler)(
954
+ {
955
+ open: isOpenedByThisTrigger,
956
+ enabled: isInMenubar,
957
+ mouseDownAction: "open"
958
+ },
959
+ (0, import_internal.subSlot)(slot, "mixed")
960
+ );
961
+ const localInteractionProps = (0, import_octane.useMemo)(
962
+ () => (0, import_mergeProps.mergeProps)(focus.reference, click.reference),
963
+ [focus.reference, click.reference],
964
+ (0, import_internal.subSlot)(slot, "lip")
965
+ );
966
+ const rootTriggerProps = store.useState(
967
+ "triggerProps",
968
+ (0, import_internal.subSlot)(slot, "tp"),
969
+ isMountedByThisTrigger
970
+ );
971
+ const { preFocusGuardRef, handlePreFocusGuardFocus, handleFocusTargetFocus } = (0, import_useTriggerFocusGuards.useTriggerFocusGuards)(store, triggerElementRef, (0, import_internal.subSlot)(slot, "tfg"));
972
+ const state = {
973
+ disabled,
974
+ open: isOpenedByThisTrigger
975
+ };
976
+ const refs = [triggerRef, forwardedRef, buttonRef, registerTrigger, triggerElementRef];
977
+ const props = [
978
+ localInteractionProps,
979
+ hoverProps ?? import_empty.EMPTY_OBJECT,
980
+ rootTriggerProps,
981
+ {
982
+ "aria-haspopup": "menu",
983
+ "aria-controls": popupId,
984
+ id: thisTriggerId,
985
+ onMouseDown: (event) => {
986
+ if (store.select("open")) {
987
+ return;
988
+ }
989
+ allowMouseUpTriggerTimeout.start(200, () => {
990
+ store.context.allowMouseUpTriggerRef.current = true;
991
+ });
992
+ const doc = (0, import_owner.ownerDocument)(event.currentTarget);
993
+ doc.addEventListener("mouseup", handleDocumentMouseUp, { once: true });
994
+ }
995
+ },
996
+ isInMenubar ? { role: "menuitem" } : {},
997
+ mixedToggleHandlers,
998
+ elementProps,
999
+ getButtonProps
1000
+ ];
1001
+ const element = (0, import_useRenderElement.useRenderElement)(
1002
+ "button",
1003
+ componentProps,
1004
+ {
1005
+ enabled: !isInMenubar,
1006
+ stateAttributesMapping: import_popupStateMapping.pressableTriggerOpenStateMapping,
1007
+ state,
1008
+ ref: refs,
1009
+ props
1010
+ },
1011
+ (0, import_internal.subSlot)(slot, "re")
1012
+ );
1013
+ if (isInMenubar) {
1014
+ return (0, import_octane.createElement)(import_CompositeItem.CompositeItem, {
1015
+ tag: "button",
1016
+ render,
1017
+ className,
1018
+ style,
1019
+ state,
1020
+ refs,
1021
+ props,
1022
+ stateAttributesMapping: import_popupStateMapping.pressableTriggerOpenStateMapping
1023
+ });
1024
+ }
1025
+ const keyedElement = (0, import_octane.createElement)(import_octane.Fragment, { key: thisTriggerId, children: element });
1026
+ if (isOpenedByThisTrigger) {
1027
+ return [
1028
+ (0, import_octane.createElement)(import_FocusGuard.FocusGuard, {
1029
+ key: `${thisTriggerId}-pre-focus-guard`,
1030
+ ref: preFocusGuardRef,
1031
+ onFocus: handlePreFocusGuardFocus
1032
+ }),
1033
+ keyedElement,
1034
+ (0, import_octane.createElement)(import_FocusGuard.FocusGuard, {
1035
+ key: `${thisTriggerId}-post-focus-guard`,
1036
+ ref: store.context.triggerFocusTargetRef,
1037
+ onFocus: handleFocusTargetFocus
1038
+ })
1039
+ ];
1040
+ }
1041
+ return keyedElement;
1042
+ }
1043
+ function MenuPortal(props) {
1044
+ const slot = (0, import_internal.S)("MenuPortal");
1045
+ const { keepMounted = false, ref, ...portalProps } = props;
1046
+ const { store } = useMenuRootContext();
1047
+ const mounted = store.useState("mounted", (0, import_internal.subSlot)(slot, "mounted"));
1048
+ const shouldRender = mounted || keepMounted;
1049
+ if (!shouldRender) {
1050
+ return null;
1051
+ }
1052
+ return (0, import_octane.createElement)(MenuPortalContext.Provider, {
1053
+ value: keepMounted,
1054
+ children: (0, import_octane.createElement)(import_FloatingPortal.FloatingPortal, { ref, ...portalProps })
1055
+ });
1056
+ }
1057
+ function MenuPositioner(componentProps) {
1058
+ const slot = (0, import_internal.S)("MenuPositioner");
1059
+ const {
1060
+ anchor: anchorProp,
1061
+ positionMethod: positionMethodProp = "absolute",
1062
+ className,
1063
+ render,
1064
+ side,
1065
+ align: alignProp,
1066
+ sideOffset: sideOffsetProp = 0,
1067
+ alignOffset: alignOffsetProp = 0,
1068
+ collisionBoundary = "clipping-ancestors",
1069
+ collisionPadding = 5,
1070
+ arrowPadding = 5,
1071
+ sticky = false,
1072
+ disableAnchorTracking = false,
1073
+ collisionAvoidance: collisionAvoidanceProp = import_constants.DROPDOWN_COLLISION_AVOIDANCE,
1074
+ style,
1075
+ ref: forwardedRef,
1076
+ ...elementProps
1077
+ } = componentProps;
1078
+ const { store } = useMenuRootContext();
1079
+ const keepMounted = useMenuPortalContext();
1080
+ const contextMenuContext = (0, import_ContextMenuRootContext.useContextMenuRootContext)(true);
1081
+ const parent = store.useState("parent", (0, import_internal.subSlot)(slot, "parent"));
1082
+ const floatingRootContext = store.useState("floatingRootContext", (0, import_internal.subSlot)(slot, "frc"));
1083
+ const floatingTreeRoot = store.useState("floatingTreeRoot", (0, import_internal.subSlot)(slot, "ftr"));
1084
+ const mounted = store.useState("mounted", (0, import_internal.subSlot)(slot, "mounted"));
1085
+ const open = store.useState("open", (0, import_internal.subSlot)(slot, "open"));
1086
+ const modal = store.useState("modal", (0, import_internal.subSlot)(slot, "modal"));
1087
+ const openMethod = store.useState("openMethod", (0, import_internal.subSlot)(slot, "method"));
1088
+ const triggerElement = store.useState("activeTriggerElement", (0, import_internal.subSlot)(slot, "trigger"));
1089
+ const transitionStatus = store.useState("transitionStatus", (0, import_internal.subSlot)(slot, "trans"));
1090
+ const positionerElement = store.useState("positionerElement", (0, import_internal.subSlot)(slot, "posEl"));
1091
+ const instantType = store.useState("instantType", (0, import_internal.subSlot)(slot, "instant"));
1092
+ const hasViewport = store.useState("hasViewport", (0, import_internal.subSlot)(slot, "viewport"));
1093
+ const lastOpenChangeReason = store.useState("lastOpenChangeReason", (0, import_internal.subSlot)(slot, "locr"));
1094
+ const floatingNodeId = store.useState("floatingNodeId", (0, import_internal.subSlot)(slot, "nodeId"));
1095
+ const floatingParentNodeId = store.useState("floatingParentNodeId", (0, import_internal.subSlot)(slot, "parentId"));
1096
+ const domReference = floatingRootContext.useState("domReferenceElement", (0, import_internal.subSlot)(slot, "domRef"));
1097
+ const previousTriggerRef = (0, import_octane.useRef)(null, (0, import_internal.subSlot)(slot, "prevTrigger"));
1098
+ const runOnceAnimationsFinish = (0, import_useAnimationsFinished.useAnimationsFinished)(
1099
+ positionerElement,
1100
+ false,
1101
+ false,
1102
+ (0, import_internal.subSlot)(slot, "anim")
1103
+ );
1104
+ let anchor = anchorProp;
1105
+ let sideOffset = sideOffsetProp;
1106
+ let alignOffset = alignOffsetProp;
1107
+ let align = alignProp;
1108
+ let collisionAvoidance = collisionAvoidanceProp;
1109
+ if (parent.type === "context-menu") {
1110
+ anchor = anchorProp ?? parent.context?.anchor;
1111
+ align = align ?? "start";
1112
+ if (!side && align !== "center") {
1113
+ alignOffset = componentProps.alignOffset ?? 2;
1114
+ sideOffset = componentProps.sideOffset ?? -5;
1115
+ }
1116
+ }
1117
+ let computedSide = side;
1118
+ let computedAlign = align;
1119
+ if (parent.type === "menu") {
1120
+ computedSide = computedSide ?? "inline-end";
1121
+ computedAlign = computedAlign ?? "start";
1122
+ collisionAvoidance = componentProps.collisionAvoidance ?? import_constants.POPUP_COLLISION_AVOIDANCE;
1123
+ } else if (parent.type === "menubar") {
1124
+ computedSide = computedSide ?? (parent.context.orientation === "vertical" ? "inline-end" : "bottom");
1125
+ computedAlign = computedAlign ?? "start";
1126
+ }
1127
+ const contextMenu = parent.type === "context-menu";
1128
+ const positioner = (0, import_useAnchorPositioning.useAnchorPositioning)(
1129
+ {
1130
+ anchor,
1131
+ floatingRootContext,
1132
+ positionMethod: contextMenuContext ? "fixed" : positionMethodProp,
1133
+ mounted,
1134
+ side: computedSide,
1135
+ sideOffset,
1136
+ align: computedAlign,
1137
+ alignOffset,
1138
+ arrowPadding: contextMenu ? 0 : arrowPadding,
1139
+ collisionBoundary,
1140
+ collisionPadding,
1141
+ sticky,
1142
+ nodeId: floatingNodeId,
1143
+ keepMounted,
1144
+ disableAnchorTracking,
1145
+ collisionAvoidance,
1146
+ shiftCrossAxis: contextMenu && !("side" in collisionAvoidance && collisionAvoidance.side === "flip"),
1147
+ externalTree: floatingTreeRoot,
1148
+ adaptiveOrigin: hasViewport ? import_adaptiveOriginMiddleware.adaptiveOrigin : void 0
1149
+ },
1150
+ (0, import_internal.subSlot)(slot, "positioning")
1151
+ );
1152
+ (0, import_octane.useEffect)(
1153
+ () => {
1154
+ function onMenuOpenChange(details) {
1155
+ if (details.open) {
1156
+ if (details.parentNodeId === floatingNodeId) {
1157
+ store.set("hoverEnabled", false);
1158
+ }
1159
+ if (details.nodeId !== floatingNodeId && details.parentNodeId === store.select("floatingParentNodeId")) {
1160
+ store.setOpen(false, (0, import_createChangeEventDetails.createChangeEventDetails)(import_createChangeEventDetails.REASONS.siblingOpen));
1161
+ }
1162
+ }
1163
+ }
1164
+ floatingTreeRoot.events.on("menuopenchange", onMenuOpenChange);
1165
+ return () => {
1166
+ floatingTreeRoot.events.off("menuopenchange", onMenuOpenChange);
1167
+ };
1168
+ },
1169
+ [store, floatingTreeRoot.events, floatingNodeId],
1170
+ (0, import_internal.subSlot)(slot, "e:openChange")
1171
+ );
1172
+ (0, import_octane.useEffect)(
1173
+ () => {
1174
+ if (store.select("floatingParentNodeId") == null) {
1175
+ return void 0;
1176
+ }
1177
+ function onParentClose(details) {
1178
+ if (details.open || details.nodeId !== store.select("floatingParentNodeId")) {
1179
+ return;
1180
+ }
1181
+ const reason = details.reason ?? import_createChangeEventDetails.REASONS.siblingOpen;
1182
+ store.setOpen(false, (0, import_createChangeEventDetails.createChangeEventDetails)(reason));
1183
+ }
1184
+ floatingTreeRoot.events.on("menuopenchange", onParentClose);
1185
+ return () => {
1186
+ floatingTreeRoot.events.off("menuopenchange", onParentClose);
1187
+ };
1188
+ },
1189
+ [floatingTreeRoot.events, store],
1190
+ (0, import_internal.subSlot)(slot, "e:parentClose")
1191
+ );
1192
+ const closeTimeout = (0, import_useTimeout.useTimeout)((0, import_internal.subSlot)(slot, "closeTimeout"));
1193
+ (0, import_octane.useEffect)(
1194
+ () => {
1195
+ if (!open) {
1196
+ closeTimeout.clear();
1197
+ }
1198
+ },
1199
+ [open, closeTimeout],
1200
+ (0, import_internal.subSlot)(slot, "e:clearClose")
1201
+ );
1202
+ (0, import_octane.useEffect)(
1203
+ () => {
1204
+ function onItemHover(event) {
1205
+ if (!open || event.nodeId !== store.select("floatingParentNodeId")) {
1206
+ return;
1207
+ }
1208
+ if (event.target && triggerElement && triggerElement !== event.target) {
1209
+ const delay = store.select("closeDelay");
1210
+ if (delay > 0) {
1211
+ if (!closeTimeout.isStarted()) {
1212
+ closeTimeout.start(delay, () => {
1213
+ store.setOpen(false, (0, import_createChangeEventDetails.createChangeEventDetails)(import_createChangeEventDetails.REASONS.siblingOpen));
1214
+ });
1215
+ }
1216
+ } else {
1217
+ store.setOpen(false, (0, import_createChangeEventDetails.createChangeEventDetails)(import_createChangeEventDetails.REASONS.siblingOpen));
1218
+ }
1219
+ } else {
1220
+ closeTimeout.clear();
1221
+ }
1222
+ }
1223
+ floatingTreeRoot.events.on("itemhover", onItemHover);
1224
+ return () => {
1225
+ floatingTreeRoot.events.off("itemhover", onItemHover);
1226
+ };
1227
+ },
1228
+ [floatingTreeRoot.events, open, triggerElement, store, closeTimeout],
1229
+ (0, import_internal.subSlot)(slot, "e:itemHover")
1230
+ );
1231
+ (0, import_octane.useEffect)(
1232
+ () => {
1233
+ const eventDetails = {
1234
+ open,
1235
+ nodeId: floatingNodeId,
1236
+ parentNodeId: floatingParentNodeId,
1237
+ reason: store.select("lastOpenChangeReason")
1238
+ };
1239
+ floatingTreeRoot.events.emit("menuopenchange", eventDetails);
1240
+ },
1241
+ [floatingTreeRoot.events, open, store, floatingNodeId, floatingParentNodeId],
1242
+ (0, import_internal.subSlot)(slot, "e:emit")
1243
+ );
1244
+ (0, import_octane.useLayoutEffect)(
1245
+ () => {
1246
+ const currentTrigger = domReference;
1247
+ const previousTrigger = previousTriggerRef.current;
1248
+ if (currentTrigger) {
1249
+ previousTriggerRef.current = currentTrigger;
1250
+ }
1251
+ if (previousTrigger && currentTrigger && currentTrigger !== previousTrigger) {
1252
+ store.set("instantType", void 0);
1253
+ const abortController = new AbortController();
1254
+ runOnceAnimationsFinish(() => {
1255
+ store.set("instantType", "trigger-change");
1256
+ }, abortController.signal);
1257
+ return () => {
1258
+ abortController.abort();
1259
+ };
1260
+ }
1261
+ return void 0;
1262
+ },
1263
+ [domReference, runOnceAnimationsFinish, store],
1264
+ (0, import_internal.subSlot)(slot, "e:triggerChange")
1265
+ );
1266
+ const state = {
1267
+ open,
1268
+ side: positioner.side,
1269
+ align: positioner.align,
1270
+ anchorHidden: positioner.anchorHidden,
1271
+ nested: parent.type === "menu",
1272
+ instant: instantType
1273
+ };
1274
+ const menubarModal = parent.type === "menubar" && parent.context.modal;
1275
+ const popupModal = modal && lastOpenChangeReason !== import_createChangeEventDetails.REASONS.triggerHover;
1276
+ (0, import_useAnchoredPopupScrollLock.useAnchoredPopupScrollLock)(
1277
+ open && (menubarModal || popupModal),
1278
+ openMethod === "touch",
1279
+ positionerElement,
1280
+ triggerElement
1281
+ );
1282
+ const setPositionerElement = store.useStateSetter("positionerElement", (0, import_internal.subSlot)(slot, "setPosEl"));
1283
+ const element = (0, import_usePositioner.usePositioner)(
1284
+ componentProps,
1285
+ state,
1286
+ {
1287
+ styles: positioner.positionerStyles,
1288
+ transitionStatus,
1289
+ props: elementProps,
1290
+ refs: [forwardedRef, setPositionerElement],
1291
+ hidden: !mounted,
1292
+ inert: !open
1293
+ },
1294
+ (0, import_internal.subSlot)(slot, "positioner")
1295
+ );
1296
+ const shouldRenderBackdrop = mounted && parent.type !== "menu" && (parent.type !== "menubar" && modal && lastOpenChangeReason !== import_createChangeEventDetails.REASONS.triggerHover || parent.type === "menubar" && parent.context.modal);
1297
+ let backdropCutout = null;
1298
+ if (parent.type === "menubar") {
1299
+ backdropCutout = parent.context.contentElement;
1300
+ } else if (parent.type === void 0) {
1301
+ backdropCutout = triggerElement;
1302
+ }
1303
+ return (0, import_octane.createElement)(MenuPositionerContext.Provider, {
1304
+ value: positioner,
1305
+ children: [
1306
+ shouldRenderBackdrop ? (0, import_octane.createElement)(import_InternalBackdrop.InternalBackdrop, {
1307
+ key: "backdrop",
1308
+ ref: parent.type === "context-menu" || parent.type === "nested-context-menu" ? parent.context.internalBackdropRef : null,
1309
+ inert: (0, import_inertValue.inertValue)(!open),
1310
+ cutout: backdropCutout
1311
+ }) : null,
1312
+ (0, import_octane.createElement)(import_FloatingTree.FloatingNode, {
1313
+ key: "node",
1314
+ id: floatingNodeId,
1315
+ children: (0, import_octane.createElement)(import_CompositeList.CompositeList, {
1316
+ elementsRef: store.context.itemDomElements,
1317
+ labelsRef: store.context.itemLabels,
1318
+ children: element
1319
+ })
1320
+ })
1321
+ ]
1322
+ });
1323
+ }
1324
+ const menuPopupStateAttributesMapping = {
1325
+ ...import_popupStateMapping.popupStateMapping,
1326
+ ...import_useTransitionStatus2.transitionStatusMapping
1327
+ };
1328
+ function MenuPopup(componentProps) {
1329
+ const slot = (0, import_internal.S)("MenuPopup");
1330
+ const {
1331
+ render,
1332
+ className,
1333
+ style,
1334
+ finalFocus,
1335
+ ref: forwardedRef,
1336
+ ...elementProps
1337
+ } = componentProps;
1338
+ const { store } = useMenuRootContext();
1339
+ const { side, align } = useMenuPositionerContext();
1340
+ const insideToolbar = false;
1341
+ const open = store.useState("open", (0, import_internal.subSlot)(slot, "open"));
1342
+ const transitionStatus = store.useState("transitionStatus", (0, import_internal.subSlot)(slot, "trans"));
1343
+ const popupProps = store.useState("popupProps", (0, import_internal.subSlot)(slot, "popupProps"));
1344
+ const mounted = store.useState("mounted", (0, import_internal.subSlot)(slot, "mounted"));
1345
+ const instantType = store.useState("instantType", (0, import_internal.subSlot)(slot, "instant"));
1346
+ const triggerElement = store.useState("activeTriggerElement", (0, import_internal.subSlot)(slot, "trigger"));
1347
+ const parent = store.useState("parent", (0, import_internal.subSlot)(slot, "parent"));
1348
+ const lastOpenChangeReason = store.useState("lastOpenChangeReason", (0, import_internal.subSlot)(slot, "locr"));
1349
+ const rootId = store.useState("rootId", (0, import_internal.subSlot)(slot, "rootId"));
1350
+ const floatingContext = store.useState("floatingRootContext", (0, import_internal.subSlot)(slot, "frc"));
1351
+ const floatingTreeRoot = store.useState("floatingTreeRoot", (0, import_internal.subSlot)(slot, "ftr"));
1352
+ const closeDelay = store.useState("closeDelay", (0, import_internal.subSlot)(slot, "closeDelay"));
1353
+ const hoverEnabled = store.useState("hoverEnabled", (0, import_internal.subSlot)(slot, "hover"));
1354
+ const disabled = store.useState("disabled", (0, import_internal.subSlot)(slot, "disabled"));
1355
+ const openMethod = store.useState("openMethod", (0, import_internal.subSlot)(slot, "method"));
1356
+ const isContextMenu = parent.type === "context-menu";
1357
+ (0, import_useOpenChangeComplete.useOpenChangeComplete)(
1358
+ {
1359
+ open,
1360
+ ref: store.context.popupRef,
1361
+ onComplete() {
1362
+ if (open) {
1363
+ store.context.onOpenChangeComplete?.(true);
1364
+ }
1365
+ }
1366
+ },
1367
+ (0, import_internal.subSlot)(slot, "occ")
1368
+ );
1369
+ (0, import_octane.useEffect)(
1370
+ () => {
1371
+ function handleClose(event) {
1372
+ store.setOpen(false, (0, import_createChangeEventDetails.createChangeEventDetails)(event.reason, event.domEvent));
1373
+ }
1374
+ floatingTreeRoot.events.on("close", handleClose);
1375
+ return () => {
1376
+ floatingTreeRoot.events.off("close", handleClose);
1377
+ };
1378
+ },
1379
+ [floatingTreeRoot.events, store],
1380
+ (0, import_internal.subSlot)(slot, "e:close")
1381
+ );
1382
+ (0, import_useHoverFloatingInteraction.useHoverFloatingInteraction)(
1383
+ floatingContext,
1384
+ {
1385
+ enabled: hoverEnabled && !disabled && !isContextMenu && parent.type !== "menubar",
1386
+ closeDelay
1387
+ },
1388
+ (0, import_internal.subSlot)(slot, "hoverInteraction")
1389
+ );
1390
+ const setPopupElement = store.useStateSetter("popupElement", (0, import_internal.subSlot)(slot, "setPopupEl"));
1391
+ const state = {
1392
+ transitionStatus,
1393
+ side,
1394
+ align,
1395
+ open,
1396
+ nested: parent.type === "menu",
1397
+ instant: instantType
1398
+ };
1399
+ const element = (0, import_useRenderElement.useRenderElement)(
1400
+ "div",
1401
+ componentProps,
1402
+ {
1403
+ state,
1404
+ ref: [forwardedRef, store.context.popupRef, setPopupElement],
1405
+ stateAttributesMapping: menuPopupStateAttributesMapping,
1406
+ props: [
1407
+ popupProps,
1408
+ {
1409
+ onKeyDown(event) {
1410
+ if (insideToolbar && import_keys.COMPOSITE_KEYS.has(event.key)) {
1411
+ event.stopPropagation();
1412
+ }
1413
+ }
1414
+ },
1415
+ (0, import_getDisabledMountTransitionStyles.getDisabledMountTransitionStyles)(transitionStatus),
1416
+ elementProps,
1417
+ { "data-rootownerid": rootId }
1418
+ ]
1419
+ },
1420
+ (0, import_internal.subSlot)(slot, "re")
1421
+ );
1422
+ let returnFocus = parent.type === void 0 || isContextMenu;
1423
+ if (triggerElement || parent.type === "menubar" && lastOpenChangeReason !== import_createChangeEventDetails.REASONS.outsidePress) {
1424
+ returnFocus = true;
1425
+ }
1426
+ return (0, import_octane.createElement)(import_FloatingFocusManager.FloatingFocusManager, {
1427
+ context: floatingContext,
1428
+ openInteractionType: openMethod,
1429
+ modal: isContextMenu,
1430
+ disabled: !mounted,
1431
+ returnFocus: finalFocus === void 0 ? returnFocus : finalFocus,
1432
+ initialFocus: parent.type !== "menu",
1433
+ restoreFocus: true,
1434
+ externalTree: parent.type !== "menubar" ? floatingTreeRoot : void 0,
1435
+ previousFocusableElement: triggerElement,
1436
+ nextFocusableElement: parent.type === void 0 ? store.context.triggerFocusTargetRef : void 0,
1437
+ beforeContentFocusGuardRef: parent.type === void 0 ? store.context.beforeContentFocusGuardRef : void 0,
1438
+ children: element
1439
+ });
1440
+ }
1441
+ const itemMapping = {
1442
+ checked(value) {
1443
+ if (value) {
1444
+ return { "data-checked": "" };
1445
+ }
1446
+ return { "data-unchecked": "" };
1447
+ },
1448
+ ...import_useTransitionStatus2.transitionStatusMapping
1449
+ };
1450
+ const REGULAR_ITEM = {
1451
+ type: "regular-item"
1452
+ };
1453
+ function useMenuItemCommonProps(params, slot) {
1454
+ const { closeOnClick, highlighted, id, nodeId, store, typingRef, itemRef, itemMetadata } = params;
1455
+ const { events: menuEvents } = store.useState("floatingTreeRoot", (0, import_internal.subSlot)(slot, "ftr"));
1456
+ const open = store.useState("open", (0, import_internal.subSlot)(slot, "open"));
1457
+ const contextMenuContext = (0, import_ContextMenuRootContext.useContextMenuRootContext)(true);
1458
+ const isContextMenu = contextMenuContext !== void 0;
1459
+ return (0, import_octane.useMemo)(
1460
+ () => ({
1461
+ id,
1462
+ role: "menuitem",
1463
+ tabIndex: open && highlighted ? 0 : -1,
1464
+ onKeyDown(event) {
1465
+ if (event.key === " " && typingRef?.current) {
1466
+ event.preventDefault();
1467
+ }
1468
+ },
1469
+ onMouseMove(event) {
1470
+ if (!nodeId) {
1471
+ return;
1472
+ }
1473
+ menuEvents.emit("itemhover", {
1474
+ nodeId,
1475
+ target: event.currentTarget
1476
+ });
1477
+ },
1478
+ onClick(event) {
1479
+ if (closeOnClick) {
1480
+ menuEvents.emit("close", { domEvent: event, reason: import_createChangeEventDetails.REASONS.itemPress });
1481
+ }
1482
+ },
1483
+ onMouseUp(event) {
1484
+ if (contextMenuContext) {
1485
+ const initialCursorPoint = contextMenuContext.initialCursorPointRef.current;
1486
+ contextMenuContext.initialCursorPointRef.current = null;
1487
+ if (isContextMenu && initialCursorPoint && Math.abs(event.clientX - initialCursorPoint.x) <= 1 && Math.abs(event.clientY - initialCursorPoint.y) <= 1) {
1488
+ return;
1489
+ }
1490
+ if (isContextMenu && !import_platform.platform.os.mac && event.button === 2) {
1491
+ return;
1492
+ }
1493
+ }
1494
+ if (itemRef.current && store.context.allowMouseUpTriggerRef.current && (!isContextMenu || event.button === 2)) {
1495
+ if (!itemMetadata || itemMetadata.type === "regular-item") {
1496
+ itemRef.current.click();
1497
+ }
1498
+ }
1499
+ }
1500
+ }),
1501
+ [
1502
+ closeOnClick,
1503
+ highlighted,
1504
+ id,
1505
+ menuEvents,
1506
+ nodeId,
1507
+ open,
1508
+ store,
1509
+ typingRef,
1510
+ itemRef,
1511
+ contextMenuContext,
1512
+ isContextMenu,
1513
+ itemMetadata
1514
+ ],
1515
+ (0, import_internal.subSlot)(slot, "m")
1516
+ );
1517
+ }
1518
+ function useMenuItem(params, slot) {
1519
+ const {
1520
+ closeOnClick,
1521
+ disabled: disabledProp = false,
1522
+ highlighted,
1523
+ id,
1524
+ store,
1525
+ typingRef = store.context.typingRef,
1526
+ nativeButton,
1527
+ itemMetadata,
1528
+ nodeId
1529
+ } = params;
1530
+ const rootDisabled = store.useState("disabled", (0, import_internal.subSlot)(slot, "rd"));
1531
+ const disabled = disabledProp || rootDisabled;
1532
+ const itemRef = (0, import_octane.useRef)(null, (0, import_internal.subSlot)(slot, "ref"));
1533
+ const { getButtonProps, buttonRef } = (0, import_useButton.useButton)(
1534
+ {
1535
+ disabled,
1536
+ focusableWhenDisabled: true,
1537
+ native: nativeButton,
1538
+ composite: true
1539
+ },
1540
+ (0, import_internal.subSlot)(slot, "btn")
1541
+ );
1542
+ const commonProps = useMenuItemCommonProps(
1543
+ {
1544
+ closeOnClick,
1545
+ highlighted,
1546
+ id,
1547
+ nodeId,
1548
+ store,
1549
+ typingRef,
1550
+ itemRef,
1551
+ itemMetadata
1552
+ },
1553
+ (0, import_internal.subSlot)(slot, "common")
1554
+ );
1555
+ const getItemProps = (0, import_octane.useCallback)(
1556
+ (externalProps) => {
1557
+ return (0, import_mergeProps.mergeProps)(
1558
+ commonProps,
1559
+ {
1560
+ onMouseEnter() {
1561
+ if (itemMetadata.type !== "submenu-trigger") {
1562
+ return;
1563
+ }
1564
+ itemMetadata.setActive();
1565
+ }
1566
+ },
1567
+ externalProps,
1568
+ getButtonProps
1569
+ );
1570
+ },
1571
+ [commonProps, getButtonProps, itemMetadata],
1572
+ (0, import_internal.subSlot)(slot, "gip")
1573
+ );
1574
+ const mergedRef = (0, import_composeRefs.useComposedRefs)(itemRef, buttonRef, (0, import_internal.subSlot)(slot, "refs"));
1575
+ return (0, import_octane.useMemo)(
1576
+ () => ({
1577
+ getItemProps,
1578
+ itemRef: mergedRef
1579
+ }),
1580
+ [getItemProps, mergedRef],
1581
+ (0, import_internal.subSlot)(slot, "ret")
1582
+ );
1583
+ }
1584
+ function MenuItem(componentProps) {
1585
+ const slot = (0, import_internal.S)("MenuItem");
1586
+ const {
1587
+ render,
1588
+ className,
1589
+ id: idProp,
1590
+ label,
1591
+ nativeButton = false,
1592
+ disabled = false,
1593
+ closeOnClick = true,
1594
+ style,
1595
+ ref: forwardedRef,
1596
+ ...elementProps
1597
+ } = componentProps;
1598
+ const listItem = (0, import_useCompositeListItem.useCompositeListItem)({ label }, (0, import_internal.subSlot)(slot, "li"));
1599
+ const menuPositionerContext = useMenuPositionerContext(true);
1600
+ const id = (0, import_useBaseUiId.useBaseUiId)(idProp, (0, import_internal.subSlot)(slot, "id"));
1601
+ const { store } = useMenuRootContext();
1602
+ const highlighted = store.useState("isActive", (0, import_internal.subSlot)(slot, "hl"), listItem.index);
1603
+ const itemProps = store.useState("itemProps", (0, import_internal.subSlot)(slot, "ip"));
1604
+ const { getItemProps, itemRef } = useMenuItem(
1605
+ {
1606
+ closeOnClick,
1607
+ disabled,
1608
+ highlighted,
1609
+ id,
1610
+ store,
1611
+ nativeButton,
1612
+ nodeId: menuPositionerContext?.context.nodeId,
1613
+ itemMetadata: REGULAR_ITEM
1614
+ },
1615
+ (0, import_internal.subSlot)(slot, "item")
1616
+ );
1617
+ const state = {
1618
+ disabled,
1619
+ highlighted
1620
+ };
1621
+ return (0, import_useRenderElement.useRenderElement)(
1622
+ "div",
1623
+ componentProps,
1624
+ {
1625
+ state,
1626
+ props: [itemProps, elementProps, getItemProps],
1627
+ ref: [itemRef, forwardedRef, listItem.ref]
1628
+ },
1629
+ (0, import_internal.subSlot)(slot, "re")
1630
+ );
1631
+ }
1632
+ function MenuLinkItem(componentProps) {
1633
+ const slot = (0, import_internal.S)("MenuLinkItem");
1634
+ const {
1635
+ render,
1636
+ className,
1637
+ id: idProp,
1638
+ label,
1639
+ closeOnClick = false,
1640
+ style,
1641
+ ref: forwardedRef,
1642
+ ...elementProps
1643
+ } = componentProps;
1644
+ const linkRef = (0, import_octane.useRef)(null, (0, import_internal.subSlot)(slot, "link"));
1645
+ const listItem = (0, import_useCompositeListItem.useCompositeListItem)({ label }, (0, import_internal.subSlot)(slot, "li"));
1646
+ const menuPositionerContext = useMenuPositionerContext(true);
1647
+ const nodeId = menuPositionerContext?.context.nodeId;
1648
+ const id = (0, import_useBaseUiId.useBaseUiId)(idProp, (0, import_internal.subSlot)(slot, "id"));
1649
+ const { store } = useMenuRootContext();
1650
+ const highlighted = store.useState("isActive", (0, import_internal.subSlot)(slot, "hl"), listItem.index);
1651
+ const itemProps = store.useState("itemProps", (0, import_internal.subSlot)(slot, "ip"));
1652
+ const typingRef = store.context.typingRef;
1653
+ const { getButtonProps, buttonRef } = (0, import_useButton.useButton)(
1654
+ { native: false, composite: true },
1655
+ (0, import_internal.subSlot)(slot, "btn")
1656
+ );
1657
+ const commonProps = useMenuItemCommonProps(
1658
+ {
1659
+ closeOnClick,
1660
+ highlighted,
1661
+ id,
1662
+ nodeId,
1663
+ store,
1664
+ typingRef,
1665
+ itemRef: linkRef
1666
+ },
1667
+ (0, import_internal.subSlot)(slot, "common")
1668
+ );
1669
+ function getItemProps(externalProps) {
1670
+ return (0, import_mergeProps.mergeProps)(commonProps, externalProps, getButtonProps);
1671
+ }
1672
+ const state = { highlighted };
1673
+ return (0, import_useRenderElement.useRenderElement)(
1674
+ "a",
1675
+ componentProps,
1676
+ {
1677
+ state,
1678
+ props: [itemProps, elementProps, getItemProps],
1679
+ ref: [linkRef, buttonRef, forwardedRef, listItem.ref]
1680
+ },
1681
+ (0, import_internal.subSlot)(slot, "re")
1682
+ );
1683
+ }
1684
+ const MenuCheckboxItemContext = (0, import_octane.createContext)(void 0);
1685
+ function useMenuCheckboxItemContext() {
1686
+ const context = (0, import_octane.useContext)(MenuCheckboxItemContext);
1687
+ if (context === void 0) {
1688
+ throw new Error(
1689
+ "Base UI: MenuCheckboxItemContext is missing. MenuCheckboxItem parts must be placed within <Menu.CheckboxItem>."
1690
+ );
1691
+ }
1692
+ return context;
1693
+ }
1694
+ function MenuCheckboxItem(componentProps) {
1695
+ const slot = (0, import_internal.S)("MenuCheckboxItem");
1696
+ const {
1697
+ render,
1698
+ className,
1699
+ id: idProp,
1700
+ label,
1701
+ nativeButton = false,
1702
+ disabled = false,
1703
+ closeOnClick = false,
1704
+ checked: checkedProp,
1705
+ defaultChecked,
1706
+ onCheckedChange,
1707
+ style,
1708
+ ref: forwardedRef,
1709
+ ...elementProps
1710
+ } = componentProps;
1711
+ const listItem = (0, import_useCompositeListItem.useCompositeListItem)({ label }, (0, import_internal.subSlot)(slot, "li"));
1712
+ const menuPositionerContext = useMenuPositionerContext(true);
1713
+ const id = (0, import_useBaseUiId.useBaseUiId)(idProp, (0, import_internal.subSlot)(slot, "id"));
1714
+ const { store } = useMenuRootContext();
1715
+ const highlighted = store.useState("isActive", (0, import_internal.subSlot)(slot, "hl"), listItem.index);
1716
+ const itemProps = store.useState("itemProps", (0, import_internal.subSlot)(slot, "ip"));
1717
+ const [checked, setChecked] = (0, import_useControlled.useControlled)(
1718
+ {
1719
+ controlled: checkedProp,
1720
+ default: defaultChecked ?? false
1721
+ },
1722
+ (0, import_internal.subSlot)(slot, "ctrl")
1723
+ );
1724
+ const { getItemProps, itemRef } = useMenuItem(
1725
+ {
1726
+ closeOnClick,
1727
+ disabled,
1728
+ highlighted,
1729
+ id,
1730
+ store,
1731
+ nativeButton,
1732
+ nodeId: menuPositionerContext?.context.nodeId,
1733
+ itemMetadata: REGULAR_ITEM
1734
+ },
1735
+ (0, import_internal.subSlot)(slot, "item")
1736
+ );
1737
+ const state = (0, import_octane.useMemo)(
1738
+ () => ({
1739
+ disabled,
1740
+ highlighted,
1741
+ checked
1742
+ }),
1743
+ [disabled, highlighted, checked],
1744
+ (0, import_internal.subSlot)(slot, "state")
1745
+ );
1746
+ function handleClick(event) {
1747
+ const details = (0, import_createChangeEventDetails.createChangeEventDetails)(import_createChangeEventDetails.REASONS.itemPress, event, void 0, {
1748
+ preventUnmountOnClose() {
1749
+ }
1750
+ });
1751
+ onCheckedChange?.(!checked, details);
1752
+ if (details.isCanceled) {
1753
+ return;
1754
+ }
1755
+ setChecked((currentlyChecked) => !currentlyChecked);
1756
+ }
1757
+ const element = (0, import_useRenderElement.useRenderElement)(
1758
+ "div",
1759
+ componentProps,
1760
+ {
1761
+ state,
1762
+ stateAttributesMapping: itemMapping,
1763
+ props: [
1764
+ itemProps,
1765
+ {
1766
+ role: "menuitemcheckbox",
1767
+ "aria-checked": checked,
1768
+ onClick: handleClick
1769
+ },
1770
+ elementProps,
1771
+ getItemProps
1772
+ ],
1773
+ ref: [itemRef, forwardedRef, listItem.ref]
1774
+ },
1775
+ (0, import_internal.subSlot)(slot, "re")
1776
+ );
1777
+ return (0, import_octane.createElement)(MenuCheckboxItemContext.Provider, { value: state, children: element });
1778
+ }
1779
+ function MenuCheckboxItemIndicator(componentProps) {
1780
+ const slot = (0, import_internal.S)("MenuCheckboxItemIndicator");
1781
+ const {
1782
+ render,
1783
+ className,
1784
+ style,
1785
+ keepMounted = false,
1786
+ ref: forwardedRef,
1787
+ ...elementProps
1788
+ } = componentProps;
1789
+ const item = useMenuCheckboxItemContext();
1790
+ const indicatorRef = (0, import_octane.useRef)(null, (0, import_internal.subSlot)(slot, "ref"));
1791
+ const { transitionStatus, setMounted } = (0, import_useTransitionStatus.useTransitionStatus)(
1792
+ item.checked,
1793
+ void 0,
1794
+ void 0,
1795
+ (0, import_internal.subSlot)(slot, "ts")
1796
+ );
1797
+ (0, import_useOpenChangeComplete.useOpenChangeComplete)(
1798
+ {
1799
+ open: item.checked,
1800
+ ref: indicatorRef,
1801
+ onComplete() {
1802
+ if (!item.checked) {
1803
+ setMounted(false);
1804
+ }
1805
+ }
1806
+ },
1807
+ (0, import_internal.subSlot)(slot, "occ")
1808
+ );
1809
+ const state = {
1810
+ checked: item.checked,
1811
+ disabled: item.disabled,
1812
+ highlighted: item.highlighted,
1813
+ transitionStatus
1814
+ };
1815
+ return (0, import_useRenderElement.useRenderElement)(
1816
+ "span",
1817
+ componentProps,
1818
+ {
1819
+ state,
1820
+ ref: [forwardedRef, indicatorRef],
1821
+ stateAttributesMapping: itemMapping,
1822
+ props: {
1823
+ "aria-hidden": true,
1824
+ ...elementProps
1825
+ },
1826
+ enabled: keepMounted || item.checked
1827
+ },
1828
+ (0, import_internal.subSlot)(slot, "re")
1829
+ );
1830
+ }
1831
+ const MenuGroupContext = (0, import_octane.createContext)(void 0);
1832
+ function useMenuGroupRootContext() {
1833
+ const context = (0, import_octane.useContext)(MenuGroupContext);
1834
+ if (context === void 0) {
1835
+ throw new Error(
1836
+ "Base UI: MenuGroupContext is missing. Menu group parts must be used within <Menu.Group> or <Menu.RadioGroup>."
1837
+ );
1838
+ }
1839
+ return context;
1840
+ }
1841
+ function MenuGroup(componentProps) {
1842
+ const slot = (0, import_internal.S)("MenuGroup");
1843
+ const { render, className, style, ref: forwardedRef, ...elementProps } = componentProps;
1844
+ const [labelId, setLabelId] = (0, import_octane.useState)(void 0, (0, import_internal.subSlot)(slot, "label"));
1845
+ const element = (0, import_useRenderElement.useRenderElement)(
1846
+ "div",
1847
+ componentProps,
1848
+ {
1849
+ ref: forwardedRef,
1850
+ props: {
1851
+ role: "group",
1852
+ "aria-labelledby": labelId,
1853
+ ...elementProps
1854
+ }
1855
+ },
1856
+ (0, import_internal.subSlot)(slot, "re")
1857
+ );
1858
+ return (0, import_octane.createElement)(MenuGroupContext.Provider, { value: setLabelId, children: element });
1859
+ }
1860
+ function MenuGroupLabel(componentProps) {
1861
+ const slot = (0, import_internal.S)("MenuGroupLabel");
1862
+ const {
1863
+ render,
1864
+ className,
1865
+ style,
1866
+ id: idProp,
1867
+ ref: forwardedRef,
1868
+ ...elementProps
1869
+ } = componentProps;
1870
+ const id = (0, import_useBaseUiId.useBaseUiId)(idProp, (0, import_internal.subSlot)(slot, "id"));
1871
+ const setLabelId = useMenuGroupRootContext();
1872
+ (0, import_octane.useLayoutEffect)(
1873
+ () => {
1874
+ setLabelId(id);
1875
+ return () => {
1876
+ setLabelId(void 0);
1877
+ };
1878
+ },
1879
+ [setLabelId, id],
1880
+ (0, import_internal.subSlot)(slot, "e")
1881
+ );
1882
+ return (0, import_useRenderElement.useRenderElement)(
1883
+ "div",
1884
+ componentProps,
1885
+ {
1886
+ ref: forwardedRef,
1887
+ props: {
1888
+ id,
1889
+ role: "presentation",
1890
+ ...elementProps
1891
+ }
1892
+ },
1893
+ (0, import_internal.subSlot)(slot, "re")
1894
+ );
1895
+ }
1896
+ const MenuRadioGroupContext = (0, import_octane.createContext)(void 0);
1897
+ function useMenuRadioGroupContext() {
1898
+ const context = (0, import_octane.useContext)(MenuRadioGroupContext);
1899
+ if (context === void 0) {
1900
+ throw new Error(
1901
+ "Base UI: MenuRadioGroupContext is missing. MenuRadioGroup parts must be placed within <Menu.RadioGroup>."
1902
+ );
1903
+ }
1904
+ return context;
1905
+ }
1906
+ function MenuRadioGroup(componentProps) {
1907
+ const slot = (0, import_internal.S)("MenuRadioGroup");
1908
+ const {
1909
+ render,
1910
+ className,
1911
+ value: valueProp,
1912
+ defaultValue,
1913
+ onValueChange: onValueChangeProp,
1914
+ disabled = false,
1915
+ style,
1916
+ "aria-labelledby": ariaLabelledByProp,
1917
+ ref: forwardedRef,
1918
+ ...elementProps
1919
+ } = componentProps;
1920
+ const [labelId, setLabelId] = (0, import_octane.useState)(void 0, (0, import_internal.subSlot)(slot, "label"));
1921
+ const [value, setValueUnwrapped] = (0, import_useControlled.useControlled)(
1922
+ {
1923
+ controlled: valueProp,
1924
+ default: defaultValue
1925
+ },
1926
+ (0, import_internal.subSlot)(slot, "ctrl")
1927
+ );
1928
+ const setValue = (0, import_useStableCallback.useStableCallback)(
1929
+ (newValue, eventDetails) => {
1930
+ onValueChangeProp?.(newValue, eventDetails);
1931
+ if (eventDetails.isCanceled) {
1932
+ return;
1933
+ }
1934
+ setValueUnwrapped(newValue);
1935
+ },
1936
+ (0, import_internal.subSlot)(slot, "setValue")
1937
+ );
1938
+ const state = { disabled };
1939
+ const element = (0, import_useRenderElement.useRenderElement)(
1940
+ "div",
1941
+ componentProps,
1942
+ {
1943
+ state,
1944
+ ref: forwardedRef,
1945
+ props: {
1946
+ role: "group",
1947
+ "aria-labelledby": ariaLabelledByProp ?? labelId,
1948
+ "aria-disabled": disabled || void 0,
1949
+ ...elementProps
1950
+ }
1951
+ },
1952
+ (0, import_internal.subSlot)(slot, "re")
1953
+ );
1954
+ const context = (0, import_octane.useMemo)(
1955
+ () => ({
1956
+ value,
1957
+ setValue,
1958
+ disabled
1959
+ }),
1960
+ [value, setValue, disabled],
1961
+ (0, import_internal.subSlot)(slot, "ctx")
1962
+ );
1963
+ return (0, import_octane.createElement)(MenuGroupContext.Provider, {
1964
+ value: setLabelId,
1965
+ children: (0, import_octane.createElement)(MenuRadioGroupContext.Provider, { value: context, children: element })
1966
+ });
1967
+ }
1968
+ const MenuRadioItemContext = (0, import_octane.createContext)(void 0);
1969
+ function useMenuRadioItemContext() {
1970
+ const context = (0, import_octane.useContext)(MenuRadioItemContext);
1971
+ if (context === void 0) {
1972
+ throw new Error(
1973
+ "Base UI: MenuRadioItemContext is missing. MenuRadioItem parts must be placed within <Menu.RadioItem>."
1974
+ );
1975
+ }
1976
+ return context;
1977
+ }
1978
+ function MenuRadioItem(componentProps) {
1979
+ const slot = (0, import_internal.S)("MenuRadioItem");
1980
+ const {
1981
+ render,
1982
+ className,
1983
+ id: idProp,
1984
+ label,
1985
+ nativeButton = false,
1986
+ disabled: disabledProp = false,
1987
+ closeOnClick = false,
1988
+ value,
1989
+ style,
1990
+ ref: forwardedRef,
1991
+ ...elementProps
1992
+ } = componentProps;
1993
+ const listItem = (0, import_useCompositeListItem.useCompositeListItem)({ label }, (0, import_internal.subSlot)(slot, "li"));
1994
+ const menuPositionerContext = useMenuPositionerContext(true);
1995
+ const id = (0, import_useBaseUiId.useBaseUiId)(idProp, (0, import_internal.subSlot)(slot, "id"));
1996
+ const { store } = useMenuRootContext();
1997
+ const highlighted = store.useState("isActive", (0, import_internal.subSlot)(slot, "hl"), listItem.index);
1998
+ const itemProps = store.useState("itemProps", (0, import_internal.subSlot)(slot, "ip"));
1999
+ const {
2000
+ value: selectedValue,
2001
+ setValue: setSelectedValue,
2002
+ disabled: groupDisabled
2003
+ } = useMenuRadioGroupContext();
2004
+ const disabled = groupDisabled || disabledProp;
2005
+ const checked = selectedValue === value;
2006
+ const { getItemProps, itemRef } = useMenuItem(
2007
+ {
2008
+ closeOnClick,
2009
+ disabled,
2010
+ highlighted,
2011
+ id,
2012
+ store,
2013
+ nativeButton,
2014
+ nodeId: menuPositionerContext?.context.nodeId,
2015
+ itemMetadata: REGULAR_ITEM
2016
+ },
2017
+ (0, import_internal.subSlot)(slot, "item")
2018
+ );
2019
+ const state = (0, import_octane.useMemo)(
2020
+ () => ({
2021
+ disabled,
2022
+ highlighted,
2023
+ checked
2024
+ }),
2025
+ [disabled, highlighted, checked],
2026
+ (0, import_internal.subSlot)(slot, "state")
2027
+ );
2028
+ function handleClick(event) {
2029
+ const details = (0, import_createChangeEventDetails.createChangeEventDetails)(import_createChangeEventDetails.REASONS.itemPress, event, void 0, {
2030
+ preventUnmountOnClose() {
2031
+ }
2032
+ });
2033
+ setSelectedValue(value, details);
2034
+ }
2035
+ const element = (0, import_useRenderElement.useRenderElement)(
2036
+ "div",
2037
+ componentProps,
2038
+ {
2039
+ state,
2040
+ stateAttributesMapping: itemMapping,
2041
+ props: [
2042
+ itemProps,
2043
+ {
2044
+ role: "menuitemradio",
2045
+ "aria-checked": checked,
2046
+ onClick: handleClick
2047
+ },
2048
+ elementProps,
2049
+ getItemProps
2050
+ ],
2051
+ ref: [itemRef, forwardedRef, listItem.ref]
2052
+ },
2053
+ (0, import_internal.subSlot)(slot, "re")
2054
+ );
2055
+ return (0, import_octane.createElement)(MenuRadioItemContext.Provider, { value: state, children: element });
2056
+ }
2057
+ function MenuRadioItemIndicator(componentProps) {
2058
+ const slot = (0, import_internal.S)("MenuRadioItemIndicator");
2059
+ const {
2060
+ render,
2061
+ className,
2062
+ style,
2063
+ keepMounted = false,
2064
+ ref: forwardedRef,
2065
+ ...elementProps
2066
+ } = componentProps;
2067
+ const item = useMenuRadioItemContext();
2068
+ const indicatorRef = (0, import_octane.useRef)(null, (0, import_internal.subSlot)(slot, "ref"));
2069
+ const { transitionStatus, setMounted } = (0, import_useTransitionStatus.useTransitionStatus)(
2070
+ item.checked,
2071
+ void 0,
2072
+ void 0,
2073
+ (0, import_internal.subSlot)(slot, "ts")
2074
+ );
2075
+ (0, import_useOpenChangeComplete.useOpenChangeComplete)(
2076
+ {
2077
+ open: item.checked,
2078
+ ref: indicatorRef,
2079
+ onComplete() {
2080
+ if (!item.checked) {
2081
+ setMounted(false);
2082
+ }
2083
+ }
2084
+ },
2085
+ (0, import_internal.subSlot)(slot, "occ")
2086
+ );
2087
+ const state = {
2088
+ checked: item.checked,
2089
+ disabled: item.disabled,
2090
+ highlighted: item.highlighted,
2091
+ transitionStatus
2092
+ };
2093
+ return (0, import_useRenderElement.useRenderElement)(
2094
+ "span",
2095
+ componentProps,
2096
+ {
2097
+ state,
2098
+ stateAttributesMapping: itemMapping,
2099
+ ref: [forwardedRef, indicatorRef],
2100
+ props: {
2101
+ "aria-hidden": true,
2102
+ ...elementProps
2103
+ },
2104
+ enabled: keepMounted || item.checked
2105
+ },
2106
+ (0, import_internal.subSlot)(slot, "re")
2107
+ );
2108
+ }
2109
+ function MenuArrow(componentProps) {
2110
+ const slot = (0, import_internal.S)("MenuArrow");
2111
+ const { render, className, style, ref: forwardedRef, ...elementProps } = componentProps;
2112
+ const { store } = useMenuRootContext();
2113
+ const { arrowRef, side, align, arrowUncentered, arrowStyles } = useMenuPositionerContext();
2114
+ const open = store.useState("open", (0, import_internal.subSlot)(slot, "open"));
2115
+ const state = {
2116
+ open,
2117
+ side,
2118
+ align,
2119
+ uncentered: arrowUncentered
2120
+ };
2121
+ return (0, import_useRenderElement.useRenderElement)(
2122
+ "div",
2123
+ componentProps,
2124
+ {
2125
+ ref: [arrowRef, forwardedRef],
2126
+ stateAttributesMapping: import_popupStateMapping.popupStateMapping,
2127
+ state,
2128
+ props: {
2129
+ style: arrowStyles,
2130
+ "aria-hidden": true,
2131
+ ...elementProps
2132
+ }
2133
+ },
2134
+ (0, import_internal.subSlot)(slot, "re")
2135
+ );
2136
+ }
2137
+ const menuBackdropStateAttributesMapping = {
2138
+ ...import_popupStateMapping.popupStateMapping,
2139
+ ...import_useTransitionStatus2.transitionStatusMapping
2140
+ };
2141
+ function MenuBackdrop(componentProps) {
2142
+ const slot = (0, import_internal.S)("MenuBackdrop");
2143
+ const { render, className, style, ref: forwardedRef, ...elementProps } = componentProps;
2144
+ const { store } = useMenuRootContext();
2145
+ const open = store.useState("open", (0, import_internal.subSlot)(slot, "open"));
2146
+ const mounted = store.useState("mounted", (0, import_internal.subSlot)(slot, "mounted"));
2147
+ const transitionStatus = store.useState("transitionStatus", (0, import_internal.subSlot)(slot, "trans"));
2148
+ const lastOpenChangeReason = store.useState("lastOpenChangeReason", (0, import_internal.subSlot)(slot, "locr"));
2149
+ const contextMenuContext = (0, import_ContextMenuRootContext.useContextMenuRootContext)();
2150
+ const state = {
2151
+ open,
2152
+ transitionStatus
2153
+ };
2154
+ return (0, import_useRenderElement.useRenderElement)(
2155
+ "div",
2156
+ componentProps,
2157
+ {
2158
+ ref: contextMenuContext?.backdropRef ? [forwardedRef, contextMenuContext.backdropRef] : forwardedRef,
2159
+ state,
2160
+ stateAttributesMapping: menuBackdropStateAttributesMapping,
2161
+ props: [
2162
+ {
2163
+ role: "presentation",
2164
+ hidden: !mounted,
2165
+ style: {
2166
+ pointerEvents: lastOpenChangeReason === import_createChangeEventDetails.REASONS.triggerHover ? "none" : void 0,
2167
+ userSelect: "none",
2168
+ WebkitUserSelect: "none"
2169
+ }
2170
+ },
2171
+ elementProps
2172
+ ]
2173
+ },
2174
+ (0, import_internal.subSlot)(slot, "re")
2175
+ );
2176
+ }
2177
+ const MenuViewportCssVars = {
2178
+ /**
2179
+ * The width of the parent popup when the previous content was rendered. Placed on the
2180
+ * 'previous' container so the popup's dimensions can be frozen while content animates.
2181
+ */
2182
+ popupWidth: "--popup-width",
2183
+ /** The height of the parent popup when the previous content was rendered. */
2184
+ popupHeight: "--popup-height"
2185
+ };
2186
+ const menuViewportStateAttributesMapping = {
2187
+ activationDirection: (value) => value ? { "data-activation-direction": value } : null
2188
+ };
2189
+ function MenuViewport(componentProps) {
2190
+ const slot = (0, import_internal.S)("MenuViewport");
2191
+ const { render, className, style, children, ref: forwardedRef, ...elementProps } = componentProps;
2192
+ const { store } = useMenuRootContext();
2193
+ const { side } = useMenuPositionerContext();
2194
+ const instantType = store.useState("instantType", (0, import_internal.subSlot)(slot, "instant"));
2195
+ const { children: childrenToRender, state: viewportState } = (0, import_usePopupViewport.usePopupViewport)(
2196
+ { store, side, cssVars: MenuViewportCssVars, children },
2197
+ (0, import_internal.subSlot)(slot, "vp")
2198
+ );
2199
+ const state = {
2200
+ activationDirection: viewportState.activationDirection,
2201
+ transitioning: viewportState.transitioning,
2202
+ instant: instantType
2203
+ };
2204
+ return (0, import_useRenderElement.useRenderElement)(
2205
+ "div",
2206
+ componentProps,
2207
+ {
2208
+ state,
2209
+ ref: forwardedRef,
2210
+ props: [elementProps, { children: childrenToRender }],
2211
+ stateAttributesMapping: menuViewportStateAttributesMapping
2212
+ },
2213
+ (0, import_internal.subSlot)(slot, "re")
2214
+ );
2215
+ }
2216
+ function MenuSubmenuRoot(props) {
2217
+ const slot = (0, import_internal.S)("MenuSubmenuRoot");
2218
+ const parentMenu = useMenuRootContext().store;
2219
+ const contextValue = (0, import_octane.useMemo)(() => ({ parentMenu }), [parentMenu], (0, import_internal.subSlot)(slot, "ctx"));
2220
+ return (0, import_octane.createElement)(MenuSubmenuRootContext.Provider, {
2221
+ value: contextValue,
2222
+ children: (0, import_octane.createElement)(MenuRoot, props)
2223
+ });
2224
+ }
2225
+ function MenuSubmenuTrigger(componentProps) {
2226
+ const slot = (0, import_internal.S)("MenuSubmenuTrigger");
2227
+ const {
2228
+ render,
2229
+ className,
2230
+ style,
2231
+ label,
2232
+ id: idProp,
2233
+ nativeButton = false,
2234
+ openOnHover = true,
2235
+ delay = 100,
2236
+ closeDelay = 0,
2237
+ disabled: disabledProp = false,
2238
+ ref: forwardedRef,
2239
+ ...elementProps
2240
+ } = componentProps;
2241
+ const listItem = (0, import_useCompositeListItem.useCompositeListItem)({ label }, (0, import_internal.subSlot)(slot, "li"));
2242
+ const menuPositionerContext = useMenuPositionerContext();
2243
+ const { store } = useMenuRootContext();
2244
+ const thisTriggerId = (0, import_useBaseUiId.useBaseUiId)(idProp, (0, import_internal.subSlot)(slot, "id"));
2245
+ const open = store.useState("open", (0, import_internal.subSlot)(slot, "open"));
2246
+ const floatingRootContext = store.useState("floatingRootContext", (0, import_internal.subSlot)(slot, "frc"));
2247
+ const floatingTreeRoot = store.useState("floatingTreeRoot", (0, import_internal.subSlot)(slot, "ftr"));
2248
+ const popupId = store.useState("triggerPopupId", (0, import_internal.subSlot)(slot, "tpid"), thisTriggerId);
2249
+ const baseRegisterTrigger = (0, import_popups.useTriggerRegistration)(
2250
+ thisTriggerId,
2251
+ store,
2252
+ (0, import_internal.subSlot)(slot, "reg")
2253
+ );
2254
+ const registerTrigger = (0, import_octane.useCallback)(
2255
+ (element) => {
2256
+ const cleanup = baseRegisterTrigger(element);
2257
+ if (element !== null && store.select("open") && store.select("activeTriggerId") == null) {
2258
+ store.update({
2259
+ activeTriggerId: thisTriggerId,
2260
+ activeTriggerElement: element,
2261
+ closeDelay
2262
+ });
2263
+ }
2264
+ return cleanup;
2265
+ },
2266
+ [baseRegisterTrigger, closeDelay, store, thisTriggerId],
2267
+ (0, import_internal.subSlot)(slot, "regcb")
2268
+ );
2269
+ const triggerElementRef = (0, import_octane.useRef)(null, (0, import_internal.subSlot)(slot, "ter"));
2270
+ const handleTriggerElementRef = (0, import_octane.useCallback)(
2271
+ (el) => {
2272
+ triggerElementRef.current = el;
2273
+ store.set("activeTriggerElement", el);
2274
+ },
2275
+ [store],
2276
+ (0, import_internal.subSlot)(slot, "tercb")
2277
+ );
2278
+ const submenuRootContext = useMenuSubmenuRootContext();
2279
+ if (!submenuRootContext?.parentMenu) {
2280
+ throw new Error("Base UI: <Menu.SubmenuTrigger> must be placed in <Menu.SubmenuRoot>.");
2281
+ }
2282
+ store.useSyncedValue("closeDelay", closeDelay, (0, import_internal.subSlot)(slot, "cd"));
2283
+ const parentMenuStore = submenuRootContext.parentMenu;
2284
+ const rootDisabled = store.useState("disabled", (0, import_internal.subSlot)(slot, "rd"));
2285
+ const parentDisabled = parentMenuStore.useState("disabled", (0, import_internal.subSlot)(slot, "pd"));
2286
+ const disabled = disabledProp || rootDisabled || parentDisabled;
2287
+ const itemProps = parentMenuStore.useState("itemProps", (0, import_internal.subSlot)(slot, "ip"));
2288
+ const highlighted = parentMenuStore.useState("isActive", (0, import_internal.subSlot)(slot, "hl"), listItem.index);
2289
+ const itemMetadata = (0, import_octane.useMemo)(
2290
+ () => ({
2291
+ type: "submenu-trigger",
2292
+ setActive() {
2293
+ if (parentMenuStore.select("highlightItemOnHover")) {
2294
+ parentMenuStore.set("activeIndex", listItem.index);
2295
+ }
2296
+ }
2297
+ }),
2298
+ [parentMenuStore, listItem.index],
2299
+ (0, import_internal.subSlot)(slot, "meta")
2300
+ );
2301
+ const { getItemProps, itemRef } = useMenuItem(
2302
+ {
2303
+ closeOnClick: false,
2304
+ disabled,
2305
+ highlighted,
2306
+ id: thisTriggerId,
2307
+ store,
2308
+ typingRef: parentMenuStore.context.typingRef,
2309
+ nativeButton,
2310
+ itemMetadata,
2311
+ nodeId: menuPositionerContext?.context.nodeId
2312
+ },
2313
+ (0, import_internal.subSlot)(slot, "item")
2314
+ );
2315
+ const hoverEnabled = store.useState("hoverEnabled", (0, import_internal.subSlot)(slot, "he"));
2316
+ const hoverProps = (0, import_useHoverReferenceInteraction.useHoverReferenceInteraction)(
2317
+ floatingRootContext,
2318
+ {
2319
+ enabled: hoverEnabled && openOnHover && !disabled,
2320
+ handleClose: (0, import_useHoverReferenceInteraction.safePolygon)({ blockPointerEvents: true }),
2321
+ mouseOnly: true,
2322
+ move: true,
2323
+ restMs: delay,
2324
+ delay: { open: delay, close: closeDelay },
2325
+ shouldOpen: delay > 0 ? () => parentMenuStore.select("allowMouseEnter") : void 0,
2326
+ triggerElementRef,
2327
+ externalTree: floatingTreeRoot,
2328
+ isClosing: () => store.select("transitionStatus") === "ending"
2329
+ },
2330
+ (0, import_internal.subSlot)(slot, "hover")
2331
+ );
2332
+ const click = (0, import_useClick.useClick)(
2333
+ floatingRootContext,
2334
+ {
2335
+ enabled: !disabled,
2336
+ event: "mousedown",
2337
+ toggle: !openOnHover,
2338
+ ignoreMouse: openOnHover,
2339
+ stickIfOpen: false
2340
+ },
2341
+ (0, import_internal.subSlot)(slot, "click")
2342
+ );
2343
+ const localInteractionProps = click.reference ?? import_empty.EMPTY_OBJECT;
2344
+ const rootTriggerProps = store.useState("triggerProps", (0, import_internal.subSlot)(slot, "tp"), true);
2345
+ delete rootTriggerProps.id;
2346
+ const state = { disabled, highlighted, open };
2347
+ return (0, import_useRenderElement.useRenderElement)(
2348
+ "div",
2349
+ componentProps,
2350
+ {
2351
+ state,
2352
+ stateAttributesMapping: import_popupStateMapping.triggerOpenStateMapping,
2353
+ props: [
2354
+ localInteractionProps,
2355
+ hoverProps,
2356
+ rootTriggerProps,
2357
+ itemProps,
2358
+ {
2359
+ "aria-controls": popupId,
2360
+ tabIndex: open || highlighted ? 0 : -1,
2361
+ onBlur() {
2362
+ if (highlighted) {
2363
+ parentMenuStore.set("activeIndex", null);
2364
+ }
2365
+ }
2366
+ },
2367
+ elementProps,
2368
+ getItemProps
2369
+ ],
2370
+ ref: [forwardedRef, listItem.ref, itemRef, registerTrigger, handleTriggerElementRef]
2371
+ },
2372
+ (0, import_internal.subSlot)(slot, "re")
2373
+ );
2374
+ }
2375
+ const Menu = {
2376
+ Root: MenuRoot,
2377
+ Trigger: MenuTrigger,
2378
+ Portal: MenuPortal,
2379
+ Positioner: MenuPositioner,
2380
+ Popup: MenuPopup,
2381
+ Arrow: MenuArrow,
2382
+ Backdrop: MenuBackdrop,
2383
+ Viewport: MenuViewport,
2384
+ Item: MenuItem,
2385
+ LinkItem: MenuLinkItem,
2386
+ CheckboxItem: MenuCheckboxItem,
2387
+ CheckboxItemIndicator: MenuCheckboxItemIndicator,
2388
+ RadioGroup: MenuRadioGroup,
2389
+ RadioItem: MenuRadioItem,
2390
+ RadioItemIndicator: MenuRadioItemIndicator,
2391
+ Group: MenuGroup,
2392
+ GroupLabel: MenuGroupLabel,
2393
+ Separator: import_separator.Separator,
2394
+ SubmenuRoot: MenuSubmenuRoot,
2395
+ SubmenuTrigger: MenuSubmenuTrigger,
2396
+ createHandle: createMenuHandle,
2397
+ Handle: MenuHandle
2398
+ };
2399
+ // Annotate the CommonJS export names for ESM import in node:
2400
+ 0 && (module.exports = {
2401
+ Menu,
2402
+ MenuHandle,
2403
+ MenuRootContext,
2404
+ MenuStore,
2405
+ MenuSubmenuRootContext,
2406
+ MenuViewportCssVars,
2407
+ REGULAR_ITEM,
2408
+ createMenuHandle,
2409
+ itemMapping,
2410
+ useMenuCheckboxItemContext,
2411
+ useMenuGroupRootContext,
2412
+ useMenuItem,
2413
+ useMenuItemCommonProps,
2414
+ useMenuPortalContext,
2415
+ useMenuPositionerContext,
2416
+ useMenuRadioGroupContext,
2417
+ useMenuRadioItemContext,
2418
+ useMenuRootContext,
2419
+ useMenuSubmenuRootContext
2420
+ });