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