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