@tamagui/menu 1.138.5 → 1.138.6

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