@tamagui/menu 2.7.7 → 3.0.0-beta.643.1

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