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