@tamagui/menu 2.0.0-rc.4 → 2.0.0-rc.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/dist/cjs/Menu.cjs +156 -140
  2. package/dist/cjs/Menu.native.js +182 -164
  3. package/dist/cjs/Menu.native.js.map +1 -1
  4. package/dist/cjs/createNonNativeMenu.cjs +346 -330
  5. package/dist/cjs/createNonNativeMenu.native.js +359 -352
  6. package/dist/cjs/createNonNativeMenu.native.js.map +1 -1
  7. package/dist/cjs/index.cjs +15 -13
  8. package/dist/cjs/index.native.js +26 -24
  9. package/dist/cjs/index.native.js.map +1 -1
  10. package/dist/esm/Menu.mjs +129 -115
  11. package/dist/esm/Menu.mjs.map +1 -1
  12. package/dist/esm/Menu.native.js +155 -139
  13. package/dist/esm/Menu.native.js.map +1 -1
  14. package/dist/esm/createNonNativeMenu.mjs +317 -303
  15. package/dist/esm/createNonNativeMenu.mjs.map +1 -1
  16. package/dist/esm/createNonNativeMenu.native.js +330 -325
  17. package/dist/esm/createNonNativeMenu.native.js.map +1 -1
  18. package/dist/esm/index.js +2 -5
  19. package/dist/esm/index.js.map +1 -6
  20. package/dist/esm/index.mjs +0 -1
  21. package/dist/esm/index.mjs.map +1 -1
  22. package/dist/esm/index.native.js +0 -1
  23. package/dist/esm/index.native.js.map +1 -1
  24. package/dist/jsx/Menu.mjs +129 -115
  25. package/dist/jsx/Menu.mjs.map +1 -1
  26. package/dist/jsx/Menu.native.js +182 -164
  27. package/dist/jsx/Menu.native.js.map +1 -1
  28. package/dist/jsx/createNonNativeMenu.mjs +317 -303
  29. package/dist/jsx/createNonNativeMenu.mjs.map +1 -1
  30. package/dist/jsx/createNonNativeMenu.native.js +359 -352
  31. package/dist/jsx/createNonNativeMenu.native.js.map +1 -1
  32. package/dist/jsx/index.js +2 -5
  33. package/dist/jsx/index.js.map +1 -6
  34. package/dist/jsx/index.mjs +0 -1
  35. package/dist/jsx/index.mjs.map +1 -1
  36. package/dist/jsx/index.native.js +26 -24
  37. package/dist/jsx/index.native.js.map +1 -1
  38. package/package.json +12 -14
  39. package/src/Menu.tsx +11 -3
  40. package/src/createNonNativeMenu.tsx +220 -290
  41. package/types/Menu.d.ts +81 -46
  42. package/types/Menu.d.ts.map +1 -1
  43. package/types/createNonNativeMenu.d.ts +116 -68
  44. package/types/createNonNativeMenu.d.ts.map +1 -1
  45. package/types/index.d.ts +81 -46
  46. package/types/index.d.ts.map +1 -1
  47. package/dist/cjs/Menu.js +0 -137
  48. package/dist/cjs/Menu.js.map +0 -6
  49. package/dist/cjs/createNonNativeMenu.js +0 -334
  50. package/dist/cjs/createNonNativeMenu.js.map +0 -6
  51. package/dist/cjs/index.js +0 -32
  52. package/dist/cjs/index.js.map +0 -6
  53. package/dist/esm/Menu.js +0 -119
  54. package/dist/esm/Menu.js.map +0 -6
  55. package/dist/esm/createNonNativeMenu.js +0 -325
  56. package/dist/esm/createNonNativeMenu.js.map +0 -6
  57. package/dist/jsx/Menu.js +0 -119
  58. package/dist/jsx/Menu.js.map +0 -6
  59. package/dist/jsx/createNonNativeMenu.js +0 -325
  60. package/dist/jsx/createNonNativeMenu.js.map +0 -6
@@ -1,357 +1,361 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { createBaseMenu } from "@tamagui/create-menu";
3
+ import { usePopperContextSlow } from "@tamagui/popper";
4
+ import { ScrollView } from "@tamagui/scroll-view";
3
5
  import { useControllableState } from "@tamagui/use-controllable-state";
4
- import { composeEventHandlers, composeRefs, createStyledContext, isAndroid, isWeb, Slot, useIsTouchDevice, View, withStaticProperties } from "@tamagui/web";
6
+ import { composeEventHandlers, composeRefs, createStyledContext, isAndroid, isWeb, Slot, styled, useEvent, useIsTouchDevice, View, withStaticProperties } from "@tamagui/web";
5
7
  import * as React from "react";
6
8
  import { useId } from "react";
7
9
  function _instanceof(left, right) {
8
- return right != null && typeof Symbol < "u" && right[Symbol.hasInstance] ? !!right[Symbol.hasInstance](left) : left instanceof right;
10
+ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
11
+ return !!right[Symbol.hasInstance](left);
12
+ } else {
13
+ return left instanceof right;
14
+ }
9
15
  }
10
16
  var DROPDOWN_MENU_CONTEXT = "MenuContext";
17
+ function useMenuTriggerSetup(open) {
18
+ var triggerStateSettersRef = React.useRef(/* @__PURE__ */new Map());
19
+ var activeTriggerIdRef = React.useRef(null);
20
+ var setActiveTrigger = useEvent(function (id) {
21
+ var prevId = activeTriggerIdRef.current;
22
+ if (prevId === id) return;
23
+ if (prevId) {
24
+ var _triggerStateSettersRef_current_get;
25
+ (_triggerStateSettersRef_current_get = triggerStateSettersRef.current.get(prevId)) === null || _triggerStateSettersRef_current_get === void 0 ? void 0 : _triggerStateSettersRef_current_get(false);
26
+ }
27
+ activeTriggerIdRef.current = id;
28
+ if (id && open) {
29
+ var _triggerStateSettersRef_current_get1;
30
+ (_triggerStateSettersRef_current_get1 = triggerStateSettersRef.current.get(id)) === null || _triggerStateSettersRef_current_get1 === void 0 ? void 0 : _triggerStateSettersRef_current_get1(true);
31
+ }
32
+ });
33
+ var registerTrigger = useEvent(function (id, setOpenState) {
34
+ triggerStateSettersRef.current.set(id, setOpenState);
35
+ setOpenState(activeTriggerIdRef.current === id && open);
36
+ });
37
+ var unregisterTrigger = useEvent(function (id) {
38
+ triggerStateSettersRef.current.delete(id);
39
+ if (activeTriggerIdRef.current === id) {
40
+ activeTriggerIdRef.current = null;
41
+ }
42
+ });
43
+ React.useEffect(function () {
44
+ if (!open) {
45
+ setActiveTrigger(null);
46
+ return;
47
+ }
48
+ var activeId = activeTriggerIdRef.current;
49
+ if (activeId) {
50
+ var _triggerStateSettersRef_current_get;
51
+ (_triggerStateSettersRef_current_get = triggerStateSettersRef.current.get(activeId)) === null || _triggerStateSettersRef_current_get === void 0 ? void 0 : _triggerStateSettersRef_current_get(true);
52
+ }
53
+ }, [open, setActiveTrigger]);
54
+ return {
55
+ setActiveTrigger,
56
+ registerTrigger,
57
+ unregisterTrigger
58
+ };
59
+ }
11
60
  function createNonNativeMenu(params) {
12
61
  var {
13
- Menu
14
- } = createBaseMenu(params),
15
- DROPDOWN_MENU_NAME = "Menu",
16
- {
17
- Provider: MenuProvider,
18
- useStyledContext: useMenuContext
19
- } = createStyledContext(),
20
- MenuComp = function (props) {
21
- var {
22
- scope,
23
- children,
24
- dir,
25
- open: openProp,
26
- defaultOpen,
27
- onOpenChange,
28
- modal = !0,
29
- ...rest
30
- } = props,
31
- triggerRef = React.useRef(null),
32
- [open = !1, setOpen] = useControllableState({
33
- prop: openProp,
34
- defaultProp: defaultOpen,
35
- onChange: onOpenChange
62
+ Menu
63
+ } = createBaseMenu(params);
64
+ var DROPDOWN_MENU_NAME = "Menu";
65
+ var {
66
+ Provider: MenuProvider,
67
+ useStyledContext: useMenuContext
68
+ } = createStyledContext();
69
+ var MenuComp = function (props) {
70
+ var {
71
+ scope,
72
+ children,
73
+ dir,
74
+ open: openProp,
75
+ defaultOpen,
76
+ onOpenChange,
77
+ modal = true,
78
+ ...rest
79
+ } = props;
80
+ var triggerRef = React.useRef(null);
81
+ var [open = false, setOpen] = useControllableState({
82
+ prop: openProp,
83
+ defaultProp: defaultOpen,
84
+ onChange: onOpenChange
85
+ });
86
+ var openRef = React.useRef(open);
87
+ openRef.current = open;
88
+ var {
89
+ setActiveTrigger,
90
+ registerTrigger,
91
+ unregisterTrigger
92
+ } = useMenuTriggerSetup(open);
93
+ return /* @__PURE__ */_jsx(MenuProvider, {
94
+ scope,
95
+ triggerId: useId(),
96
+ triggerRef,
97
+ contentId: useId(),
98
+ openRef,
99
+ onOpenChange: React.useCallback(function (nextOpen) {
100
+ return setOpen(nextOpen);
101
+ }, [setOpen]),
102
+ onOpenToggle: React.useCallback(function () {
103
+ return setOpen(function (prevOpen) {
104
+ return !prevOpen;
36
105
  });
37
- return /* @__PURE__ */_jsx(MenuProvider, {
38
- scope,
39
- triggerId: useId(),
40
- // TODO
41
- triggerRef,
42
- contentId: useId(),
106
+ }, [setOpen]),
107
+ modal,
108
+ setActiveTrigger,
109
+ registerTrigger,
110
+ unregisterTrigger,
111
+ children: /* @__PURE__ */_jsx(Menu, {
112
+ scope: scope || DROPDOWN_MENU_CONTEXT,
43
113
  open,
44
114
  onOpenChange: setOpen,
45
- onOpenToggle: React.useCallback(function () {
46
- return setOpen(function (prevOpen) {
47
- return !prevOpen;
48
- });
49
- }, [setOpen]),
115
+ dir,
50
116
  modal,
51
- children: /* @__PURE__ */_jsx(Menu, {
52
- scope: scope || DROPDOWN_MENU_CONTEXT,
53
- open,
54
- onOpenChange: setOpen,
55
- dir,
56
- modal,
57
- ...rest,
58
- children
59
- })
60
- });
61
- };
117
+ ...rest,
118
+ children
119
+ })
120
+ });
121
+ };
62
122
  MenuComp.displayName = DROPDOWN_MENU_NAME;
63
- var TRIGGER_NAME = "MenuTrigger",
64
- MenuTriggerFrame = Menu.Anchor,
65
- MenuTrigger = View.styleable(function (props, forwardedRef) {
66
- var {
67
- scope,
68
- asChild,
69
- children,
70
- disabled = !1,
71
- onKeydown,
72
- ...triggerProps
73
- } = props,
74
- context = useMenuContext(scope),
75
- Comp = asChild ? Slot : View,
76
- isTouchDevice = useIsTouchDevice(),
77
- pressEvent = isWeb ? isTouchDevice ? "onClick" : "onPointerDown" : "onPress";
78
- return /* @__PURE__ */_jsx(MenuTriggerFrame, {
79
- asChild: !0,
80
- componentName: TRIGGER_NAME,
81
- scope: scope || DROPDOWN_MENU_CONTEXT,
82
- children: /* @__PURE__ */_jsx(Comp, {
83
- role: "button",
84
- id: context.triggerId,
85
- "aria-haspopup": "menu",
86
- "aria-expanded": context.open,
87
- "aria-controls": context.open ? context.contentId : void 0,
88
- "data-state": context.open ? "open" : "closed",
89
- "data-disabled": disabled ? "" : void 0,
90
- "aria-disabled": disabled || void 0,
91
- ref: composeRefs(forwardedRef, context.triggerRef),
92
- [pressEvent]: composeEventHandlers(
93
- //@ts-ignore
94
- props[pressEvent], function (event) {
95
- if (!disabled) {
96
- if (isWeb && _instanceof(event, PointerEvent) && event.button !== 0 && event.ctrlKey === !0) return;
97
- context.onOpenToggle(), context.open || event.preventDefault();
123
+ var TRIGGER_NAME = "MenuTrigger";
124
+ var MenuTriggerFrame = Menu.Anchor;
125
+ var MenuTrigger = View.styleable(function (props, forwardedRef) {
126
+ var {
127
+ scope,
128
+ asChild,
129
+ children,
130
+ disabled = false,
131
+ onKeydown,
132
+ ...triggerProps
133
+ } = props;
134
+ var context = useMenuContext(scope);
135
+ var popperCtx = usePopperContextSlow(scope || DROPDOWN_MENU_CONTEXT);
136
+ var Comp = asChild ? Slot : View;
137
+ var isTouchDevice = useIsTouchDevice();
138
+ var triggerElRef = React.useRef(null);
139
+ var triggerId = React.useId();
140
+ var [triggerOpen, setTriggerOpen] = React.useState(false);
141
+ var {
142
+ registerTrigger,
143
+ unregisterTrigger
144
+ } = context;
145
+ React.useEffect(function () {
146
+ registerTrigger(triggerId, setTriggerOpen);
147
+ return function () {
148
+ return unregisterTrigger(triggerId);
149
+ };
150
+ }, [registerTrigger, unregisterTrigger, triggerId]);
151
+ var activateSelf = React.useCallback(function () {
152
+ context.setActiveTrigger(triggerId);
153
+ var el = triggerElRef.current;
154
+ if (el) {
155
+ context.triggerRef.current = el;
156
+ if (_instanceof(el, HTMLElement)) {
157
+ var _popperCtx_refs;
158
+ (_popperCtx_refs = popperCtx.refs) === null || _popperCtx_refs === void 0 ? void 0 : _popperCtx_refs.setReference(el);
159
+ requestAnimationFrame(function () {
160
+ var _popperCtx_update;
161
+ return (_popperCtx_update = popperCtx.update) === null || _popperCtx_update === void 0 ? void 0 : _popperCtx_update.call(popperCtx);
162
+ });
163
+ }
164
+ }
165
+ }, [context, triggerId, popperCtx]);
166
+ var pressEvent = isWeb ? isTouchDevice ? "onClick" : "onPointerDown" : "onPress";
167
+ return /* @__PURE__ */_jsx(MenuTriggerFrame, {
168
+ asChild: true,
169
+ componentName: TRIGGER_NAME,
170
+ scope: scope || DROPDOWN_MENU_CONTEXT,
171
+ children: /* @__PURE__ */_jsx(Comp, {
172
+ role: "button",
173
+ id: context.triggerId,
174
+ "aria-haspopup": "menu",
175
+ "aria-expanded": triggerOpen,
176
+ "aria-controls": triggerOpen ? context.contentId : void 0,
177
+ "data-state": triggerOpen ? "open" : "closed",
178
+ "data-disabled": disabled ? "" : void 0,
179
+ "aria-disabled": disabled || void 0,
180
+ ref: composeRefs(forwardedRef, context.triggerRef, triggerElRef),
181
+ [pressEvent]: composeEventHandlers(
182
+ //@ts-ignore
183
+ props[pressEvent], function (event) {
184
+ if (!disabled) {
185
+ if (isWeb && _instanceof(event, PointerEvent) && event.button !== 0 && event.ctrlKey === true) return;
186
+ if (context.openRef.current) {
187
+ context.setActiveTrigger(null);
188
+ } else {
189
+ activateSelf();
98
190
  }
99
- }),
100
- ...(isWeb && {
101
- onKeyDown: composeEventHandlers(onKeydown, function (event) {
102
- disabled || (["Enter", " "].includes(event.key) && context.onOpenToggle(), event.key === "ArrowDown" && context.onOpenChange(!0), ["Enter", " ", "ArrowDown"].includes(event.key) && event.preventDefault());
103
- })
104
- }),
105
- ...triggerProps,
106
- children
107
- })
108
- });
109
- });
110
- MenuTrigger.displayName = TRIGGER_NAME;
111
- var PORTAL_NAME = "MenuPortal",
112
- MenuPortal = function (props) {
113
- var {
114
- scope,
115
- children,
116
- ...portalProps
117
- } = props,
118
- context = isAndroid ? useMenuContext(scope) : null,
119
- content = isAndroid ? /* @__PURE__ */_jsx(MenuProvider, {
120
- ...context,
121
- children
122
- }) : children;
123
- return /* @__PURE__ */_jsx(Menu.Portal, {
124
- scope: scope || DROPDOWN_MENU_CONTEXT,
125
- ...portalProps,
126
- children: content
127
- });
128
- };
129
- MenuPortal.displayName = PORTAL_NAME;
130
- var CONTENT_NAME = "MenuContent",
131
- MenuContent = /* @__PURE__ */React.forwardRef(function (props, forwardedRef) {
132
- var {
133
- scope,
134
- ...contentProps
135
- } = props,
136
- context = useMenuContext(scope),
137
- hasInteractedOutsideRef = React.useRef(!1);
138
- return /* @__PURE__ */_jsx(Menu.Content, {
139
- id: context.contentId,
140
- "aria-labelledby": context.triggerId,
141
- scope: scope || DROPDOWN_MENU_CONTEXT,
142
- ...contentProps,
143
- ref: forwardedRef,
144
- onCloseAutoFocus: composeEventHandlers(props.onCloseAutoFocus, function (event) {
145
- var _context_triggerRef_current;
146
- hasInteractedOutsideRef.current || (_context_triggerRef_current = context.triggerRef.current) === null || _context_triggerRef_current === void 0 || _context_triggerRef_current.focus(), hasInteractedOutsideRef.current = !1, event.preventDefault();
191
+ context.onOpenToggle();
192
+ if (!context.openRef.current) event.preventDefault();
193
+ }
147
194
  }),
148
- onInteractOutside: composeEventHandlers(props.onInteractOutside, function (event) {
149
- var originalEvent = event.detail.originalEvent,
150
- ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === !0,
151
- isRightClick = originalEvent.button === 2 || ctrlLeftClick;
152
- (!context.modal || isRightClick) && (hasInteractedOutsideRef.current = !0);
195
+ ...(isWeb && {
196
+ onKeyDown: composeEventHandlers(onKeydown, function (event) {
197
+ if (disabled) return;
198
+ if (["Enter", " "].includes(event.key)) {
199
+ if (context.openRef.current) {
200
+ context.setActiveTrigger(null);
201
+ } else {
202
+ activateSelf();
203
+ }
204
+ context.onOpenToggle();
205
+ }
206
+ if (event.key === "ArrowDown") {
207
+ activateSelf();
208
+ context.onOpenChange(true);
209
+ }
210
+ if (["Enter", " ", "ArrowDown"].includes(event.key)) event.preventDefault();
211
+ })
153
212
  }),
154
- ...props.style
155
- });
156
- });
157
- MenuContent.displayName = CONTENT_NAME;
158
- var GROUP_NAME = "MenuGroup",
159
- MenuGroup = Menu.Group;
160
- MenuGroup.displayName = GROUP_NAME;
161
- var LABEL_NAME = "MenuLabel",
162
- MenuLabel = Menu.Label;
163
- MenuLabel.displayName = LABEL_NAME;
164
- var ITEM_NAME = "MenuItem",
165
- MenuItemFrame = Menu.Item,
166
- MenuItem = /* @__PURE__ */React.forwardRef(function (props, forwardedRef) {
167
- var {
168
- scope,
169
- ...itemProps
170
- } = props;
171
- return /* @__PURE__ */_jsx(MenuItemFrame, {
172
- componentName: ITEM_NAME,
173
- scope: scope || DROPDOWN_MENU_CONTEXT,
174
- ...itemProps,
175
- ref: forwardedRef
176
- });
177
- });
178
- MenuItem.displayName = ITEM_NAME;
179
- var ITEM_TITLE_NAME = "MenuItemTitle",
180
- MenuItemTitle = Menu.ItemTitle;
181
- MenuItemTitle.displayName = ITEM_TITLE_NAME;
182
- var ITEM_SUB_TITLE_NAME = "MenuItemSubTitle",
183
- MenuItemSubTitle = Menu.ItemSubtitle;
184
- MenuItemSubTitle.displayName = ITEM_SUB_TITLE_NAME;
185
- var ITEM_IMAGE_NAME = "MenuItemImage",
186
- MenuItemImage = Menu.ItemImage;
187
- MenuItemImage.displayName = ITEM_IMAGE_NAME;
188
- var ITEM_ICON_NAME = "MenuItemIcon",
189
- MenuItemIcon = Menu.ItemIcon;
190
- MenuItemIcon.displayName = ITEM_ICON_NAME;
191
- var CHECKBOX_ITEM_NAME = "MenuCheckboxItem",
192
- MenuCheckboxItemFrame = Menu.CheckboxItem,
193
- MenuCheckboxItem = /* @__PURE__ */React.forwardRef(function (props, forwardedRef) {
194
- var {
195
- scope,
196
- ...checkboxItemProps
197
- } = props;
198
- return /* @__PURE__ */_jsx(MenuCheckboxItemFrame, {
199
- componentName: CHECKBOX_ITEM_NAME,
200
- scope: scope || DROPDOWN_MENU_CONTEXT,
201
- ...checkboxItemProps,
202
- ref: forwardedRef
203
- });
213
+ ...triggerProps,
214
+ children
215
+ })
204
216
  });
205
- MenuCheckboxItem.displayName = CHECKBOX_ITEM_NAME;
206
- var RADIO_GROUP_NAME = "MenuRadioGroup",
207
- MenuRadioGroup = /* @__PURE__ */React.forwardRef(function (props, forwardedRef) {
208
- var {
209
- scope,
210
- ...radioGroupProps
211
- } = props;
212
- return /* @__PURE__ */_jsx(Menu.RadioGroup, {
213
- scope: scope || DROPDOWN_MENU_CONTEXT,
214
- ...radioGroupProps,
215
- ref: forwardedRef
216
- });
217
+ });
218
+ MenuTrigger.displayName = TRIGGER_NAME;
219
+ var PORTAL_NAME = "MenuPortal";
220
+ var MenuPortal = function (props) {
221
+ var {
222
+ scope,
223
+ children,
224
+ ...portalProps
225
+ } = props;
226
+ var context = isAndroid ? useMenuContext(scope) : null;
227
+ var content = isAndroid ? /* @__PURE__ */_jsx(MenuProvider, {
228
+ ...context,
229
+ children
230
+ }) : children;
231
+ return /* @__PURE__ */_jsx(Menu.Portal, {
232
+ scope: scope || DROPDOWN_MENU_CONTEXT,
233
+ ...portalProps,
234
+ children: content
217
235
  });
218
- MenuRadioGroup.displayName = RADIO_GROUP_NAME;
219
- var RADIO_ITEM_NAME = "MenuRadioItem",
220
- MenuRadioItemFrame = Menu.RadioItem,
221
- MenuRadioItem = /* @__PURE__ */React.forwardRef(function (props, forwardedRef) {
222
- var {
223
- scope,
224
- ...radioItemProps
225
- } = props;
226
- return (
227
- // @ts-ignore explanation: deeply nested types typescript limitation
228
- /* @__PURE__ */
229
- _jsx(MenuRadioItemFrame, {
230
- componentName: RADIO_ITEM_NAME,
231
- scope: scope || DROPDOWN_MENU_CONTEXT,
232
- ...radioItemProps,
233
- ref: forwardedRef
234
- })
235
- );
236
+ };
237
+ MenuPortal.displayName = PORTAL_NAME;
238
+ var CONTENT_NAME = "MenuContent";
239
+ var MenuContent = /* @__PURE__ */React.forwardRef(function (props, forwardedRef) {
240
+ var {
241
+ scope,
242
+ ...contentProps
243
+ } = props;
244
+ var context = useMenuContext(scope);
245
+ var hasInteractedOutsideRef = React.useRef(false);
246
+ return /* @__PURE__ */_jsx(Menu.Content, {
247
+ id: context.contentId,
248
+ "aria-labelledby": context.triggerId,
249
+ scope: scope || DROPDOWN_MENU_CONTEXT,
250
+ ...contentProps,
251
+ ref: forwardedRef,
252
+ onCloseAutoFocus: composeEventHandlers(props.onCloseAutoFocus, function (event) {
253
+ if (!hasInteractedOutsideRef.current) {
254
+ requestAnimationFrame(function () {
255
+ var activeEl = document.activeElement;
256
+ if (!activeEl || activeEl === document.body) {
257
+ var _context_triggerRef_current;
258
+ (_context_triggerRef_current = context.triggerRef.current) === null || _context_triggerRef_current === void 0 ? void 0 : _context_triggerRef_current.focus();
259
+ }
260
+ });
261
+ }
262
+ hasInteractedOutsideRef.current = false;
263
+ event.preventDefault();
264
+ }),
265
+ onInteractOutside: composeEventHandlers(props.onInteractOutside, function (event) {
266
+ var originalEvent = event.detail.originalEvent;
267
+ var ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true;
268
+ var isRightClick = originalEvent.button === 2 || ctrlLeftClick;
269
+ if (!context.modal || isRightClick) hasInteractedOutsideRef.current = true;
270
+ }),
271
+ style: isWeb ? {
272
+ ...props.style,
273
+ ...{
274
+ "--tamagui-menu-content-transform-origin": "var(--tamagui-popper-transform-origin)",
275
+ "--tamagui-menu-content-available-width": "var(--tamagui-popper-available-width)",
276
+ "--tamagui-menu-content-available-height": "var(--tamagui-popper-available-height)",
277
+ "--tamagui-menu-trigger-width": "var(--tamagui-popper-anchor-width)",
278
+ "--tamagui-menu-trigger-height": "var(--tamagui-popper-anchor-height)"
279
+ }
280
+ } : props.style
236
281
  });
237
- MenuRadioItem.displayName = RADIO_ITEM_NAME;
238
- var INDICATOR_NAME = "MenuItemIndicator",
239
- MenuItemIndicatorFrame = Menu.ItemIndicator,
240
- MenuItemIndicator = MenuItemIndicatorFrame.styleable(function (props, forwardedRef) {
241
- var {
242
- scope,
243
- ...itemIndicatorProps
244
- } = props;
245
- return /* @__PURE__ */_jsx(MenuItemIndicatorFrame, {
246
- componentName: INDICATOR_NAME,
247
- scope: scope || DROPDOWN_MENU_CONTEXT,
248
- ...itemIndicatorProps,
249
- ref: forwardedRef
250
- });
282
+ });
283
+ MenuContent.displayName = CONTENT_NAME;
284
+ var DROPDOWN_MENU_SUB_NAME = "MenuSub";
285
+ var MenuSub = function (props) {
286
+ var {
287
+ scope,
288
+ children,
289
+ open: openProp,
290
+ onOpenChange,
291
+ defaultOpen,
292
+ ...rest
293
+ } = props;
294
+ var [open = false, setOpen] = useControllableState({
295
+ prop: openProp,
296
+ defaultProp: defaultOpen,
297
+ onChange: onOpenChange
251
298
  });
252
- MenuItemIndicator.displayName = INDICATOR_NAME;
253
- var SEPARATOR_NAME = "MenuSeparator",
254
- MenuSeparator = Menu.Separator;
255
- MenuSeparator.displayName = SEPARATOR_NAME;
256
- var ARROW_NAME = "MenuArrow",
257
- MenuArrow = /* @__PURE__ */React.forwardRef(function (props, forwardedRef) {
258
- var {
259
- scope,
260
- ...arrowProps
261
- } = props;
262
- return /* @__PURE__ */_jsx(Menu.Arrow, {
263
- componentName: ARROW_NAME,
264
- scope: scope || DROPDOWN_MENU_CONTEXT,
265
- ...arrowProps,
266
- ref: forwardedRef
267
- });
299
+ return /* @__PURE__ */_jsx(Menu.Sub, {
300
+ scope: scope || DROPDOWN_MENU_CONTEXT,
301
+ open,
302
+ onOpenChange: setOpen,
303
+ ...rest,
304
+ children
268
305
  });
269
- MenuArrow.displayName = ARROW_NAME;
270
- var DROPDOWN_MENU_SUB_NAME = "MenuSub",
271
- MenuSub = function (props) {
272
- var {
273
- scope,
274
- children,
275
- open: openProp,
276
- onOpenChange,
277
- defaultOpen,
278
- ...rest
279
- } = props,
280
- [open = !1, setOpen] = useControllableState({
281
- prop: openProp,
282
- defaultProp: defaultOpen,
283
- onChange: onOpenChange
284
- });
285
- return /* @__PURE__ */_jsx(Menu.Sub, {
286
- scope: scope || DROPDOWN_MENU_CONTEXT,
287
- open,
288
- onOpenChange: setOpen,
289
- ...rest,
290
- children
291
- });
292
- };
306
+ };
293
307
  MenuSub.displayName = DROPDOWN_MENU_SUB_NAME;
294
- var SUB_TRIGGER_NAME = "MenuSubTrigger",
295
- MenuSubTrigger = View.styleable(function (props, forwardedRef) {
296
- var {
297
- scope,
298
- asChild,
299
- ...subTriggerProps
300
- } = props;
301
- return /* @__PURE__ */_jsx(Menu.SubTrigger, {
302
- componentName: SUB_TRIGGER_NAME,
303
- scope: scope || DROPDOWN_MENU_CONTEXT,
304
- ...subTriggerProps,
305
- ref: forwardedRef
306
- });
307
- });
308
- MenuSubTrigger.displayName = SUB_TRIGGER_NAME;
309
- var SUB_CONTENT_NAME = "MenuSubContent",
310
- MenuSubContent = /* @__PURE__ */React.forwardRef(function (props, forwardedRef) {
311
- var {
312
- scope,
313
- ...subContentProps
314
- } = props;
315
- return /* @__PURE__ */_jsx(Menu.SubContent, {
316
- scope: scope || DROPDOWN_MENU_CONTEXT,
317
- ...subContentProps,
318
- ref: forwardedRef,
319
- style: isWeb ? {
320
- ...props.style,
308
+ var SUB_CONTENT_NAME = "MenuSubContent";
309
+ var MenuSubContent = /* @__PURE__ */React.forwardRef(function (props, forwardedRef) {
310
+ var {
311
+ scope,
312
+ ...subContentProps
313
+ } = props;
314
+ return /* @__PURE__ */_jsx(Menu.SubContent, {
315
+ scope: scope || DROPDOWN_MENU_CONTEXT,
316
+ ...subContentProps,
317
+ ref: forwardedRef,
318
+ style: isWeb ? {
319
+ ...props.style,
320
+ ...{
321
321
  "--tamagui-menu-content-transform-origin": "var(--tamagui-popper-transform-origin)",
322
322
  "--tamagui-menu-content-available-width": "var(--tamagui-popper-available-width)",
323
323
  "--tamagui-menu-content-available-height": "var(--tamagui-popper-available-height)",
324
324
  "--tamagui-menu-trigger-width": "var(--tamagui-popper-anchor-width)",
325
325
  "--tamagui-menu-trigger-height": "var(--tamagui-popper-anchor-height)"
326
- } : null
327
- });
326
+ }
327
+ } : null
328
328
  });
329
+ });
329
330
  MenuSubContent.displayName = SUB_CONTENT_NAME;
330
- var Root = MenuComp,
331
- Trigger = MenuTrigger,
332
- Portal = MenuPortal,
333
- Content = MenuContent,
334
- Group = MenuGroup,
335
- Label = MenuLabel,
336
- Item = MenuItem,
337
- CheckboxItem = MenuCheckboxItem,
338
- RadioGroup = MenuRadioGroup,
339
- RadioItem = MenuRadioItem,
340
- ItemIndicator = MenuItemIndicator,
341
- Separator = MenuSeparator,
342
- Arrow = MenuArrow,
343
- Sub = MenuSub,
344
- SubTrigger = MenuSubTrigger,
345
- SubContent = MenuSubContent,
346
- ItemTitle = MenuItemTitle,
347
- ItemSubtitle = MenuItemSubTitle,
348
- ItemImage = MenuItemImage,
349
- ItemIcon = MenuItemIcon;
331
+ var MenuScrollView = styled(ScrollView, {
332
+ flexShrink: 1,
333
+ alignSelf: "stretch",
334
+ showsHorizontalScrollIndicator: false,
335
+ showsVerticalScrollIndicator: false,
336
+ "$platform-web": {
337
+ maxHeight: "var(--tamagui-menu-content-available-height)"
338
+ }
339
+ });
340
+ var Group = Menu.Group;
341
+ var Label = Menu.Label;
342
+ var Item = Menu.Item;
343
+ var CheckboxItem = Menu.CheckboxItem;
344
+ var RadioGroup = Menu.RadioGroup;
345
+ var RadioItem = Menu.RadioItem;
346
+ var ItemIndicator = Menu.ItemIndicator;
347
+ var Separator = Menu.Separator;
348
+ var Arrow = Menu.Arrow;
349
+ var SubTrigger = Menu.SubTrigger;
350
+ var ItemTitle = Menu.ItemTitle;
351
+ var ItemSubtitle = Menu.ItemSubtitle;
352
+ var ItemImage = Menu.ItemImage;
353
+ var ItemIcon = Menu.ItemIcon;
350
354
  return withStaticProperties(MenuComp, {
351
- Root,
352
- Trigger,
353
- Portal,
354
- Content,
355
+ Root: MenuComp,
356
+ Trigger: MenuTrigger,
357
+ Portal: MenuPortal,
358
+ Content: MenuContent,
355
359
  Group,
356
360
  Label,
357
361
  Item,
@@ -361,13 +365,14 @@ function createNonNativeMenu(params) {
361
365
  ItemIndicator,
362
366
  Separator,
363
367
  Arrow,
364
- Sub,
368
+ Sub: MenuSub,
365
369
  SubTrigger,
366
- SubContent,
370
+ SubContent: MenuSubContent,
367
371
  ItemTitle,
368
372
  ItemSubtitle,
369
373
  ItemImage,
370
- ItemIcon
374
+ ItemIcon,
375
+ ScrollView: MenuScrollView
371
376
  });
372
377
  }
373
378
  export { DROPDOWN_MENU_CONTEXT, createNonNativeMenu };