@tamagui/menu 1.138.0 → 1.138.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 (124) hide show
  1. package/dist/cjs/createMenu.cjs +952 -0
  2. package/dist/cjs/createMenu.js +751 -0
  3. package/dist/cjs/createMenu.js.map +6 -0
  4. package/dist/cjs/createMenu.native.js +1136 -0
  5. package/dist/cjs/createMenu.native.js.map +1 -0
  6. package/dist/cjs/createNativeMenu/createNativeMenu.android.js +261 -0
  7. package/dist/cjs/createNativeMenu/createNativeMenu.android.js.map +6 -0
  8. package/dist/cjs/createNativeMenu/createNativeMenu.cjs +47 -0
  9. package/dist/cjs/createNativeMenu/createNativeMenu.ios.js +373 -0
  10. package/dist/cjs/createNativeMenu/createNativeMenu.ios.js.map +6 -0
  11. package/dist/cjs/createNativeMenu/createNativeMenu.js +42 -0
  12. package/dist/cjs/createNativeMenu/createNativeMenu.js.map +6 -0
  13. package/dist/cjs/createNativeMenu/createNativeMenu.native.js +356 -0
  14. package/dist/cjs/createNativeMenu/createNativeMenu.native.js.map +1 -0
  15. package/dist/cjs/createNativeMenu/createNativeMenuTypes.cjs +16 -0
  16. package/dist/cjs/createNativeMenu/createNativeMenuTypes.js +14 -0
  17. package/dist/cjs/createNativeMenu/createNativeMenuTypes.js.map +6 -0
  18. package/dist/cjs/createNativeMenu/createNativeMenuTypes.native.js +19 -0
  19. package/dist/cjs/createNativeMenu/createNativeMenuTypes.native.js.map +1 -0
  20. package/dist/cjs/createNativeMenu/index.cjs +19 -0
  21. package/dist/cjs/createNativeMenu/index.js +16 -0
  22. package/dist/cjs/createNativeMenu/index.js.map +6 -0
  23. package/dist/cjs/createNativeMenu/index.native.js +22 -0
  24. package/dist/cjs/createNativeMenu/index.native.js.map +1 -0
  25. package/dist/cjs/createNativeMenu/utils.cjs +68 -0
  26. package/dist/cjs/createNativeMenu/utils.js +66 -0
  27. package/dist/cjs/createNativeMenu/utils.js.map +6 -0
  28. package/dist/cjs/createNativeMenu/utils.native.js +94 -0
  29. package/dist/cjs/createNativeMenu/utils.native.js.map +1 -0
  30. package/dist/cjs/createNativeMenu/withNativeMenu.cjs +45 -0
  31. package/dist/cjs/createNativeMenu/withNativeMenu.js +35 -0
  32. package/dist/cjs/createNativeMenu/withNativeMenu.js.map +6 -0
  33. package/dist/cjs/createNativeMenu/withNativeMenu.native.js +49 -0
  34. package/dist/cjs/createNativeMenu/withNativeMenu.native.js.map +1 -0
  35. package/dist/esm/createMenu.js +757 -0
  36. package/dist/esm/createMenu.js.map +6 -0
  37. package/dist/esm/createMenu.mjs +916 -0
  38. package/dist/esm/createMenu.mjs.map +1 -0
  39. package/dist/esm/createMenu.native.js +1097 -0
  40. package/dist/esm/createMenu.native.js.map +1 -0
  41. package/dist/esm/createNativeMenu/createNativeMenu.android.js +251 -0
  42. package/dist/esm/createNativeMenu/createNativeMenu.android.js.map +6 -0
  43. package/dist/esm/createNativeMenu/createNativeMenu.ios.js +363 -0
  44. package/dist/esm/createNativeMenu/createNativeMenu.ios.js.map +6 -0
  45. package/dist/esm/createNativeMenu/createNativeMenu.js +26 -0
  46. package/dist/esm/createNativeMenu/createNativeMenu.js.map +6 -0
  47. package/dist/esm/createNativeMenu/createNativeMenu.mjs +24 -0
  48. package/dist/esm/createNativeMenu/createNativeMenu.mjs.map +1 -0
  49. package/dist/esm/createNativeMenu/createNativeMenu.native.js +330 -0
  50. package/dist/esm/createNativeMenu/createNativeMenu.native.js.map +1 -0
  51. package/dist/esm/createNativeMenu/createNativeMenuTypes.js +1 -0
  52. package/dist/esm/createNativeMenu/createNativeMenuTypes.js.map +6 -0
  53. package/dist/esm/createNativeMenu/createNativeMenuTypes.mjs +2 -0
  54. package/dist/esm/createNativeMenu/createNativeMenuTypes.mjs.map +1 -0
  55. package/dist/esm/createNativeMenu/createNativeMenuTypes.native.js +2 -0
  56. package/dist/esm/createNativeMenu/createNativeMenuTypes.native.js.map +1 -0
  57. package/dist/esm/createNativeMenu/index.js +3 -0
  58. package/dist/esm/createNativeMenu/index.js.map +6 -0
  59. package/dist/esm/createNativeMenu/index.mjs +3 -0
  60. package/dist/esm/createNativeMenu/index.mjs.map +1 -0
  61. package/dist/esm/createNativeMenu/index.native.js +3 -0
  62. package/dist/esm/createNativeMenu/index.native.js.map +1 -0
  63. package/dist/esm/createNativeMenu/utils.js +47 -0
  64. package/dist/esm/createNativeMenu/utils.js.map +6 -0
  65. package/dist/esm/createNativeMenu/utils.mjs +29 -0
  66. package/dist/esm/createNativeMenu/utils.mjs.map +1 -0
  67. package/dist/esm/createNativeMenu/utils.native.js +52 -0
  68. package/dist/esm/createNativeMenu/utils.native.js.map +1 -0
  69. package/dist/esm/createNativeMenu/withNativeMenu.js +20 -0
  70. package/dist/esm/createNativeMenu/withNativeMenu.js.map +6 -0
  71. package/dist/esm/createNativeMenu/withNativeMenu.mjs +22 -0
  72. package/dist/esm/createNativeMenu/withNativeMenu.mjs.map +1 -0
  73. package/dist/esm/createNativeMenu/withNativeMenu.native.js +23 -0
  74. package/dist/esm/createNativeMenu/withNativeMenu.native.js.map +1 -0
  75. package/dist/jsx/createMenu.js +757 -0
  76. package/dist/jsx/createMenu.js.map +6 -0
  77. package/dist/jsx/createMenu.mjs +916 -0
  78. package/dist/jsx/createMenu.mjs.map +1 -0
  79. package/dist/jsx/createMenu.native.js +1136 -0
  80. package/dist/jsx/createMenu.native.js.map +1 -0
  81. package/dist/jsx/createNativeMenu/createNativeMenu.android.js +261 -0
  82. package/dist/jsx/createNativeMenu/createNativeMenu.android.js.map +6 -0
  83. package/dist/jsx/createNativeMenu/createNativeMenu.ios.js +373 -0
  84. package/dist/jsx/createNativeMenu/createNativeMenu.ios.js.map +6 -0
  85. package/dist/jsx/createNativeMenu/createNativeMenu.js +26 -0
  86. package/dist/jsx/createNativeMenu/createNativeMenu.js.map +6 -0
  87. package/dist/jsx/createNativeMenu/createNativeMenu.mjs +24 -0
  88. package/dist/jsx/createNativeMenu/createNativeMenu.mjs.map +1 -0
  89. package/dist/jsx/createNativeMenu/createNativeMenu.native.js +356 -0
  90. package/dist/jsx/createNativeMenu/createNativeMenu.native.js.map +1 -0
  91. package/dist/jsx/createNativeMenu/createNativeMenuTypes.js +1 -0
  92. package/dist/jsx/createNativeMenu/createNativeMenuTypes.js.map +6 -0
  93. package/dist/jsx/createNativeMenu/createNativeMenuTypes.mjs +2 -0
  94. package/dist/jsx/createNativeMenu/createNativeMenuTypes.mjs.map +1 -0
  95. package/dist/jsx/createNativeMenu/createNativeMenuTypes.native.js +19 -0
  96. package/dist/jsx/createNativeMenu/createNativeMenuTypes.native.js.map +1 -0
  97. package/dist/jsx/createNativeMenu/index.js +3 -0
  98. package/dist/jsx/createNativeMenu/index.js.map +6 -0
  99. package/dist/jsx/createNativeMenu/index.mjs +3 -0
  100. package/dist/jsx/createNativeMenu/index.mjs.map +1 -0
  101. package/dist/jsx/createNativeMenu/index.native.js +22 -0
  102. package/dist/jsx/createNativeMenu/index.native.js.map +1 -0
  103. package/dist/jsx/createNativeMenu/utils.js +47 -0
  104. package/dist/jsx/createNativeMenu/utils.js.map +6 -0
  105. package/dist/jsx/createNativeMenu/utils.mjs +29 -0
  106. package/dist/jsx/createNativeMenu/utils.mjs.map +1 -0
  107. package/dist/jsx/createNativeMenu/utils.native.js +94 -0
  108. package/dist/jsx/createNativeMenu/utils.native.js.map +1 -0
  109. package/dist/jsx/createNativeMenu/withNativeMenu.js +20 -0
  110. package/dist/jsx/createNativeMenu/withNativeMenu.js.map +6 -0
  111. package/dist/jsx/createNativeMenu/withNativeMenu.mjs +22 -0
  112. package/dist/jsx/createNativeMenu/withNativeMenu.mjs.map +1 -0
  113. package/dist/jsx/createNativeMenu/withNativeMenu.native.js +49 -0
  114. package/dist/jsx/createNativeMenu/withNativeMenu.native.js.map +1 -0
  115. package/package.json +6 -6
  116. package/types/createMenu.d.ts.map +1 -0
  117. package/types/createNativeMenu/createNativeMenu.android.d.ts.map +1 -0
  118. package/types/createNativeMenu/createNativeMenu.d.ts.map +1 -0
  119. package/types/createNativeMenu/createNativeMenu.ios.d.ts.map +1 -0
  120. package/types/createNativeMenu/createNativeMenu.native.d.ts.map +1 -0
  121. package/types/createNativeMenu/createNativeMenuTypes.d.ts.map +1 -0
  122. package/types/createNativeMenu/index.d.ts.map +1 -0
  123. package/types/createNativeMenu/utils.d.ts.map +1 -0
  124. package/types/createNativeMenu/withNativeMenu.d.ts.map +1 -0
@@ -0,0 +1,1136 @@
1
+ "use strict";
2
+
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf,
8
+ __hasOwnProp = Object.prototype.hasOwnProperty;
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, {
17
+ get: () => from[key],
18
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
19
+ });
20
+ return to;
21
+ };
22
+ 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);
34
+ var createMenu_exports = {};
35
+ __export(createMenu_exports, {
36
+ NativePropProvider: () => NativePropProvider,
37
+ createMenu: () => createMenu,
38
+ useNativeProp: () => useNativeProp
39
+ });
40
+ module.exports = __toCommonJS(createMenu_exports);
41
+ var import_jsx_runtime = require("react/jsx-runtime"),
42
+ import_animate = require("@tamagui/animate"),
43
+ import_animate_presence = require("@tamagui/animate-presence"),
44
+ import_collection = require("@tamagui/collection"),
45
+ import_core = require("@tamagui/core"),
46
+ import_dismissable = require("@tamagui/dismissable"),
47
+ import_focus_guard = require("@tamagui/focus-guard"),
48
+ import_focus_scope = require("@tamagui/focus-scope"),
49
+ PopperPrimitive = __toESM(require("@tamagui/popper"), 1),
50
+ import_portal = require("@tamagui/portal"),
51
+ import_remove_scroll = require("@tamagui/remove-scroll"),
52
+ import_roving_focus = require("@tamagui/roving-focus"),
53
+ import_stacks = require("@tamagui/stacks"),
54
+ import_use_callback_ref = require("@tamagui/use-callback-ref"),
55
+ import_use_direction = require("@tamagui/use-direction"),
56
+ import_web = require("@tamagui/web"),
57
+ React = __toESM(require("react"), 1),
58
+ import_react = require("react"),
59
+ import_Menu = require("./Menu.native.js"),
60
+ SELECTION_KEYS = ["Enter", " "],
61
+ FIRST_KEYS = ["ArrowDown", "PageUp", "Home"],
62
+ LAST_KEYS = ["ArrowUp", "PageDown", "End"],
63
+ FIRST_LAST_KEYS = [...FIRST_KEYS, ...LAST_KEYS],
64
+ SUB_OPEN_KEYS = {
65
+ ltr: [...SELECTION_KEYS, "ArrowRight"],
66
+ rtl: [...SELECTION_KEYS, "ArrowLeft"]
67
+ },
68
+ SUB_CLOSE_KEYS = {
69
+ ltr: ["ArrowLeft"],
70
+ rtl: ["ArrowRight"]
71
+ },
72
+ MENU_NAME = "Menu",
73
+ [Collection, useCollection] = (0, import_collection.createCollection)(MENU_NAME),
74
+ {
75
+ Provider: MenuProvider,
76
+ useStyledContext: useMenuContext
77
+ } = (0, import_core.createStyledContext)(),
78
+ {
79
+ Provider: MenuRootProvider,
80
+ useStyledContext: useMenuRootContext
81
+ } = (0, import_core.createStyledContext)(),
82
+ MENU_CONTEXT = "MenuContext",
83
+ {
84
+ Provider: NativePropProvider,
85
+ useStyledContext: useNativeProp
86
+ } = (0, import_core.createStyledContext)({
87
+ native: !1
88
+ });
89
+ function createMenu(param) {
90
+ var {
91
+ Item: _Item = import_Menu.MenuPredefinied.MenuItem,
92
+ Title: _Title = import_Menu.MenuPredefinied.Title,
93
+ SubTitle: _SubTitle = import_Menu.MenuPredefinied.SubTitle,
94
+ Image: _Image = import_Menu.MenuPredefinied.MenuImage,
95
+ Icon: _Icon = import_Menu.MenuPredefinied.MenuIcon,
96
+ Indicator: _Indicator = import_Menu.MenuPredefinied.MenuIndicator,
97
+ Separator: _Separator = import_Menu.MenuPredefinied.MenuSeparator,
98
+ MenuGroup: _MenuGroup = import_Menu.MenuPredefinied.MenuGroup,
99
+ Label: _Label = import_Menu.MenuPredefinied.MenuLabel
100
+ } = param,
101
+ MenuComp = function (props) {
102
+ var {
103
+ scope,
104
+ open = !1,
105
+ children,
106
+ dir,
107
+ onOpenChange,
108
+ modal = !0,
109
+ ...rest
110
+ } = props,
111
+ [content, setContent] = React.useState(null),
112
+ isUsingKeyboardRef = React.useRef(!1),
113
+ handleOpenChange = (0, import_use_callback_ref.useCallbackRef)(onOpenChange),
114
+ direction = (0, import_use_direction.useDirection)(dir);
115
+ return import_web.isWeb && React.useEffect(function () {
116
+ var handleKeyDown = function () {
117
+ isUsingKeyboardRef.current = !0, document.addEventListener("pointerdown", handlePointer, {
118
+ capture: !0,
119
+ once: !0
120
+ }), document.addEventListener("pointermove", handlePointer, {
121
+ capture: !0,
122
+ once: !0
123
+ });
124
+ },
125
+ handlePointer = function () {
126
+ return isUsingKeyboardRef.current = !1;
127
+ };
128
+ return document.addEventListener("keydown", handleKeyDown, {
129
+ capture: !0
130
+ }), function () {
131
+ document.removeEventListener("keydown", handleKeyDown, {
132
+ capture: !0
133
+ }), document.removeEventListener("pointerdown", handlePointer, {
134
+ capture: !0
135
+ }), document.removeEventListener("pointermove", handlePointer, {
136
+ capture: !0
137
+ });
138
+ };
139
+ }, []), /* @__PURE__ */(0, import_jsx_runtime.jsx)(PopperPrimitive.Popper, {
140
+ scope: scope || MENU_CONTEXT,
141
+ ...rest,
142
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(MenuProvider, {
143
+ scope,
144
+ open,
145
+ onOpenChange: handleOpenChange,
146
+ content,
147
+ onContentChange: setContent,
148
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(NativePropProvider, {
149
+ native: !1,
150
+ scope,
151
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(MenuRootProvider, {
152
+ scope,
153
+ onClose: React.useCallback(function () {
154
+ return handleOpenChange(!1);
155
+ }, [handleOpenChange]),
156
+ isUsingKeyboardRef,
157
+ dir: direction,
158
+ modal,
159
+ children: (/** this provider is just to avoid crashing when using useSubMenuContext() inside MenuPortal */
160
+ /* @__PURE__ */(0, import_jsx_runtime.jsx)(MenuSubProvider, {
161
+ scope,
162
+ children
163
+ }))
164
+ })
165
+ })
166
+ })
167
+ });
168
+ },
169
+ RepropagateMenuAndMenuRootProvider = function (props) {
170
+ var {
171
+ scope,
172
+ menuContext,
173
+ rootContext,
174
+ popperContext,
175
+ menuSubContext,
176
+ children
177
+ } = props;
178
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(PopperPrimitive.PopperProvider, {
179
+ ...popperContext,
180
+ scope: scope || MENU_CONTEXT,
181
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(NativePropProvider, {
182
+ native: !1,
183
+ scope,
184
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(MenuProvider, {
185
+ scope,
186
+ ...menuContext,
187
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(MenuRootProvider, {
188
+ scope,
189
+ ...rootContext,
190
+ children: menuSubContext ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(MenuSubProvider, {
191
+ scope,
192
+ ...menuSubContext,
193
+ children
194
+ }) : children
195
+ })
196
+ })
197
+ })
198
+ });
199
+ };
200
+ MenuComp.displayName = MENU_NAME;
201
+ var ANCHOR_NAME = "MenuAnchor",
202
+ MenuAnchor = function (props) {
203
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(PopperPrimitive.PopperAnchor, {
204
+ scope: MENU_CONTEXT,
205
+ ...props
206
+ });
207
+ };
208
+ MenuAnchor.displayName = ANCHOR_NAME;
209
+ var PORTAL_NAME = "MenuPortal",
210
+ {
211
+ Provider: PortalProvider,
212
+ useStyledContext: usePortalContext
213
+ } = (0, import_core.createStyledContext)(void 0, "Portal"),
214
+ MenuPortal = function (props) {
215
+ var {
216
+ scope,
217
+ forceMount,
218
+ zIndex,
219
+ children
220
+ } =
221
+ // TODO removed
222
+ // host
223
+ props,
224
+ menuContext = useMenuContext(scope),
225
+ rootContext = useMenuRootContext(scope),
226
+ popperContext = PopperPrimitive.usePopperContext(scope || MENU_CONTEXT),
227
+ menuSubContext = useMenuSubContext(scope),
228
+ content = import_web.isAndroid ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(RepropagateMenuAndMenuRootProvider, {
229
+ menuContext,
230
+ rootContext,
231
+ popperContext,
232
+ menuSubContext,
233
+ scope,
234
+ children
235
+ }) : children;
236
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_animate.Animate, {
237
+ type: "presence",
238
+ present: forceMount || menuContext.open,
239
+ children: (/* @ts-expect-error TODO */
240
+ /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_portal.Portal, {
241
+ host,
242
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, {
243
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(PortalProvider, {
244
+ scope,
245
+ forceMount,
246
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_stacks.YStack, {
247
+ zIndex: zIndex || 100,
248
+ fullscreen: !0,
249
+ children: [!!menuContext.open && !import_web.isWeb && /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_stacks.YStack, {
250
+ fullscreen: !0,
251
+ onPress: function () {
252
+ return menuContext.onOpenChange(!menuContext.open);
253
+ }
254
+ }), content]
255
+ })
256
+ })
257
+ })
258
+ }))
259
+ });
260
+ };
261
+ MenuPortal.displayName = PORTAL_NAME;
262
+ var CONTENT_NAME = "MenuContent",
263
+ {
264
+ Provider: MenuContentProvider,
265
+ useStyledContext: useMenuContentContext
266
+ } = (0, import_core.createStyledContext)(),
267
+ MenuContent = /* @__PURE__ */React.forwardRef(function (props, forwardedRef) {
268
+ var portalContext = usePortalContext(props.scope),
269
+ {
270
+ forceMount = portalContext.forceMount,
271
+ ...contentProps
272
+ } = props,
273
+ rootContext = useMenuRootContext(props.scope);
274
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(Collection.Provider, {
275
+ scope: props.scope || MENU_CONTEXT,
276
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(Collection.Slot, {
277
+ scope: props.scope || MENU_CONTEXT,
278
+ children: rootContext.modal ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(MenuRootContentModal, {
279
+ ...contentProps,
280
+ ref: forwardedRef
281
+ }) : /* @__PURE__ */(0, import_jsx_runtime.jsx)(MenuRootContentNonModal, {
282
+ ...contentProps,
283
+ ref: forwardedRef
284
+ })
285
+ })
286
+ });
287
+ }),
288
+ MenuRootContentModal = /* @__PURE__ */React.forwardRef(function (props, forwardedRef) {
289
+ var context = useMenuContext(props.scope),
290
+ ref = React.useRef(null),
291
+ composedRefs = (0, import_core.useComposedRefs)(forwardedRef, ref);
292
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(MenuContentImpl, {
293
+ ...props,
294
+ ref: composedRefs,
295
+ // we make sure we're not trapping once it's been closed
296
+ // (closed !== unmounted when animating out)
297
+ trapFocus: context.open,
298
+ // make sure to only disable pointer events when open
299
+ // this avoids blocking interactions while animating out
300
+ disableOutsidePointerEvents: context.open,
301
+ disableOutsideScroll: !0,
302
+ // When focus is trapped, a `focusout` event may still happen.
303
+ // We make sure we don't trigger our `onDismiss` in such case.
304
+ onFocusOutside: (0, import_core.composeEventHandlers)(props.onFocusOutside, function (event) {
305
+ return event.preventDefault();
306
+ }, {
307
+ checkDefaultPrevented: !1
308
+ }),
309
+ onDismiss: function () {
310
+ return context.onOpenChange(!1);
311
+ }
312
+ });
313
+ }),
314
+ MenuRootContentNonModal = /* @__PURE__ */React.forwardRef(function (props, forwardedRef) {
315
+ var context = useMenuContext(props.scope);
316
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(MenuContentImpl, {
317
+ ...props,
318
+ ref: forwardedRef,
319
+ trapFocus: !1,
320
+ disableOutsidePointerEvents: !1,
321
+ disableOutsideScroll: !1,
322
+ onDismiss: function () {
323
+ return context.onOpenChange(!1);
324
+ }
325
+ });
326
+ }),
327
+ Fragment = /* @__PURE__ */React.forwardRef(function (props, ref) {
328
+ return props.children;
329
+ }),
330
+ MenuContentImpl = /* @__PURE__ */React.forwardRef(function (props, forwardedRef) {
331
+ var {
332
+ scope = MENU_CONTEXT,
333
+ loop = !1,
334
+ trapFocus,
335
+ onOpenAutoFocus,
336
+ onCloseAutoFocus,
337
+ disableOutsidePointerEvents,
338
+ onEntryFocus,
339
+ onEscapeKeyDown,
340
+ onPointerDownOutside,
341
+ onFocusOutside,
342
+ onInteractOutside,
343
+ onDismiss,
344
+ disableOutsideScroll,
345
+ unstyled = process.env.TAMAGUI_HEADLESS === "1",
346
+ ...contentProps
347
+ } = props,
348
+ context = useMenuContext(scope),
349
+ rootContext = useMenuRootContext(scope),
350
+ getItems = useCollection(scope),
351
+ [currentItemId, setCurrentItemId] = React.useState(null),
352
+ contentRef = React.useRef(null),
353
+ composedRefs = (0, import_core.useComposedRefs)(forwardedRef, contentRef, context.onContentChange),
354
+ timerRef = React.useRef(0),
355
+ searchRef = React.useRef(""),
356
+ pointerGraceTimerRef = React.useRef(0),
357
+ pointerGraceIntentRef = React.useRef(null),
358
+ pointerDirRef = React.useRef("right"),
359
+ lastPointerXRef = React.useRef(0),
360
+ handleTypeaheadSearch = function (key) {
361
+ var _items_find,
362
+ _items_find1,
363
+ search = searchRef.current + key,
364
+ items = getItems().filter(function (item) {
365
+ return !item.disabled;
366
+ }),
367
+ currentItem = document.activeElement,
368
+ currentMatch = (_items_find = items.find(function (item) {
369
+ return item.ref.current === currentItem;
370
+ })) === null || _items_find === void 0 ? void 0 : _items_find.textValue,
371
+ values = items.map(function (item) {
372
+ return item.textValue;
373
+ }),
374
+ nextMatch = getNextMatch(values, search, currentMatch),
375
+ newItem = (_items_find1 = items.find(function (item) {
376
+ return item.textValue === nextMatch;
377
+ })) === null || _items_find1 === void 0 ? void 0 : _items_find1.ref.current;
378
+ (function updateSearch(value) {
379
+ searchRef.current = value, clearTimeout(timerRef.current), value !== "" && (timerRef.current = setTimeout(function () {
380
+ return updateSearch("");
381
+ }, 1e3));
382
+ })(search), newItem && setTimeout(function () {
383
+ return newItem.focus();
384
+ });
385
+ };
386
+ React.useEffect(function () {
387
+ return function () {
388
+ return clearTimeout(timerRef.current);
389
+ };
390
+ }, []), import_web.isWeb && (0, import_focus_guard.useFocusGuards)();
391
+ var isPointerMovingToSubmenu = React.useCallback(function (event) {
392
+ var _pointerGraceIntentRef_current,
393
+ _pointerGraceIntentRef_current1,
394
+ isMovingTowards = pointerDirRef.current === ((_pointerGraceIntentRef_current = pointerGraceIntentRef.current) === null || _pointerGraceIntentRef_current === void 0 ? void 0 : _pointerGraceIntentRef_current.side);
395
+ return isMovingTowards && isPointerInGraceArea(event, (_pointerGraceIntentRef_current1 = pointerGraceIntentRef.current) === null || _pointerGraceIntentRef_current1 === void 0 ? void 0 : _pointerGraceIntentRef_current1.area);
396
+ }, []),
397
+ content = /* @__PURE__ */(0, import_jsx_runtime.jsx)(PopperPrimitive.PopperContent, {
398
+ role: "menu",
399
+ ...(!unstyled && {
400
+ elevation: 30,
401
+ paddingVertical: "$2",
402
+ backgroundColor: "$background",
403
+ borderColor: "$borderColor",
404
+ outlineWidth: 0
405
+ }),
406
+ "aria-orientation": "vertical",
407
+ "data-state": getOpenState(context.open),
408
+ "data-tamagui-menu-content": "",
409
+ // @ts-ignore
410
+ dir: rootContext.dir,
411
+ scope: scope || MENU_CONTEXT,
412
+ ...contentProps,
413
+ ref: composedRefs,
414
+ className: contentProps.animation ? void 0 : contentProps.className,
415
+ ...(import_web.isWeb ? {
416
+ onKeyDown: (0, import_core.composeEventHandlers)(
417
+ //@ts-ignore
418
+ contentProps.onKeyDown, function (event) {
419
+ var target = event.target,
420
+ isKeyDownInside = target.closest("[data-tamagui-menu-content]") === event.currentTarget,
421
+ isModifierKey = event.ctrlKey || event.altKey || event.metaKey,
422
+ isCharacterKey = event.key.length === 1;
423
+ isKeyDownInside && (event.key === "Tab" && event.preventDefault(), !isModifierKey && isCharacterKey && handleTypeaheadSearch(event.key));
424
+ var content2 = contentRef.current;
425
+ if (event.target === content2 && FIRST_LAST_KEYS.includes(event.key)) {
426
+ event.preventDefault();
427
+ var items = getItems().filter(function (item) {
428
+ return !item.disabled;
429
+ }),
430
+ candidateNodes = items.map(function (item) {
431
+ return item.ref.current;
432
+ });
433
+ LAST_KEYS.includes(event.key) && candidateNodes.reverse(), focusFirst(candidateNodes);
434
+ }
435
+ }),
436
+ // @ts-ignore
437
+ onBlur: (0, import_core.composeEventHandlers)(props.onBlur, function (event) {
438
+ var _event_currentTarget;
439
+ !((_event_currentTarget = event.currentTarget) === null || _event_currentTarget === void 0) && _event_currentTarget.contains(event.target) || (clearTimeout(timerRef.current), searchRef.current = "");
440
+ }),
441
+ onPointerMove: (0, import_core.composeEventHandlers)(
442
+ // @ts-ignore
443
+ props.onPointerMove,
444
+ // @ts-ignore
445
+ whenMouse(function (event) {
446
+ var _event_currentTarget,
447
+ target = event.target,
448
+ pointerXHasChanged = lastPointerXRef.current !== event.clientX;
449
+ if (!((_event_currentTarget = event.currentTarget) === null || _event_currentTarget === void 0) && _event_currentTarget.contains(target) && pointerXHasChanged) {
450
+ var newDir = event.clientX > lastPointerXRef.current ? "right" : "left";
451
+ pointerDirRef.current = newDir, lastPointerXRef.current = event.clientX;
452
+ }
453
+ }))
454
+ } : {})
455
+ });
456
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(MenuContentProvider, {
457
+ scope,
458
+ searchRef,
459
+ onItemEnter: React.useCallback(function (event) {
460
+ isPointerMovingToSubmenu(event) && event.preventDefault();
461
+ }, [isPointerMovingToSubmenu]),
462
+ onItemLeave: React.useCallback(function (event) {
463
+ var _contentRef_current;
464
+ isPointerMovingToSubmenu(event) || ((_contentRef_current = contentRef.current) === null || _contentRef_current === void 0 || _contentRef_current.focus(), setCurrentItemId(null));
465
+ }, [isPointerMovingToSubmenu]),
466
+ onTriggerLeave: React.useCallback(function (event) {
467
+ isPointerMovingToSubmenu(event) && event.preventDefault();
468
+ }, [isPointerMovingToSubmenu]),
469
+ pointerGraceTimerRef,
470
+ onPointerGraceIntentChange: React.useCallback(function (intent) {
471
+ pointerGraceIntentRef.current = intent;
472
+ }, []),
473
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_remove_scroll.RemoveScroll, {
474
+ enabled: disableOutsideScroll,
475
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_focus_scope.FocusScope, {
476
+ asChild: !1,
477
+ trapped: trapFocus,
478
+ onMountAutoFocus: (0, import_core.composeEventHandlers)(onOpenAutoFocus, function (event) {
479
+ var _contentRef_current;
480
+ event.preventDefault(), (_contentRef_current = contentRef.current) === null || _contentRef_current === void 0 || _contentRef_current.focus();
481
+ }),
482
+ onUnmountAutoFocus: onCloseAutoFocus,
483
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_dismissable.Dismissable, {
484
+ disableOutsidePointerEvents,
485
+ onEscapeKeyDown,
486
+ onPointerDownOutside,
487
+ onFocusOutside,
488
+ onInteractOutside,
489
+ onDismiss,
490
+ asChild: !0,
491
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_roving_focus.RovingFocusGroup, {
492
+ asChild: !0,
493
+ __scopeRovingFocusGroup: scope || MENU_CONTEXT,
494
+ dir: rootContext.dir,
495
+ orientation: "vertical",
496
+ loop,
497
+ currentTabStopId: currentItemId,
498
+ onCurrentTabStopIdChange: setCurrentItemId,
499
+ onEntryFocus: (0, import_core.composeEventHandlers)(onEntryFocus, function (event) {
500
+ rootContext.isUsingKeyboardRef.current || event.preventDefault();
501
+ }),
502
+ children: content
503
+ })
504
+ })
505
+ })
506
+ })
507
+ });
508
+ });
509
+ MenuContent.displayName = CONTENT_NAME;
510
+ var ITEM_NAME = "MenuItem",
511
+ ITEM_SELECT = "menu.itemSelect",
512
+ MenuItem = import_stacks.ThemeableStack.styleable(function (props, forwardedRef) {
513
+ var {
514
+ disabled = !1,
515
+ onSelect,
516
+ children,
517
+ ...itemProps
518
+ } = props,
519
+ ref = React.useRef(null),
520
+ rootContext = useMenuRootContext(props.scope),
521
+ contentContext = useMenuContentContext(props.scope),
522
+ composedRefs = (0, import_core.useComposedRefs)(forwardedRef, ref),
523
+ isPointerDownRef = React.useRef(!1),
524
+ handleSelect = function () {
525
+ var menuItem = ref.current;
526
+ if (!disabled && menuItem) if (import_web.isWeb) {
527
+ var itemSelectEvent = new CustomEvent(ITEM_SELECT, {
528
+ bubbles: !0,
529
+ cancelable: !0
530
+ });
531
+ menuItem.addEventListener(ITEM_SELECT, function (event) {
532
+ return onSelect?.(event);
533
+ }, {
534
+ once: !0
535
+ }), (0, import_dismissable.dispatchDiscreteCustomEvent)(menuItem, itemSelectEvent), itemSelectEvent.defaultPrevented ? isPointerDownRef.current = !1 : rootContext.onClose();
536
+ } else onSelect?.({
537
+ target: menuItem
538
+ }), isPointerDownRef.current = !1, rootContext.onClose();
539
+ },
540
+ content = typeof children == "string" ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_core.Text, {
541
+ children
542
+ }) : children;
543
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(MenuItemImpl, {
544
+ outlineStyle: "none",
545
+ ...itemProps,
546
+ // @ts-ignore
547
+ ref: composedRefs,
548
+ disabled,
549
+ onPress: (0, import_core.composeEventHandlers)(props.onPress, handleSelect),
550
+ onPointerDown: function (event) {
551
+ var _props_onPointerDown;
552
+ (_props_onPointerDown = props.onPointerDown) === null || _props_onPointerDown === void 0 || _props_onPointerDown.call(props, event), isPointerDownRef.current = !0;
553
+ },
554
+ onPointerUp: (0, import_core.composeEventHandlers)(props.onPointerUp, function (event) {
555
+ if (import_web.isWeb) {
556
+ var _event_currentTarget;
557
+ isPointerDownRef.current || (_event_currentTarget = event.currentTarget) === null || _event_currentTarget === void 0 || _event_currentTarget.click();
558
+ }
559
+ }),
560
+ ...(import_web.isWeb ? {
561
+ onKeyDown: (0, import_core.composeEventHandlers)(
562
+ // @ts-ignore
563
+ props.onKeyDown, function (event) {
564
+ var isTypingAhead = contentContext.searchRef.current !== "";
565
+ if (!(disabled || isTypingAhead && event.key === " ") && SELECTION_KEYS.includes(event.key)) {
566
+ var _event_currentTarget;
567
+ (_event_currentTarget = event.currentTarget) === null || _event_currentTarget === void 0 || _event_currentTarget.click(), event.preventDefault();
568
+ }
569
+ })
570
+ } : {}),
571
+ children: content
572
+ });
573
+ }),
574
+ MenuItemImpl = /* @__PURE__ */React.forwardRef(function (props, forwardedRef) {
575
+ var {
576
+ scope,
577
+ disabled = !1,
578
+ textValue,
579
+ unstyled = process.env.TAMAGUI_HEADLESS === "1",
580
+ ...itemProps
581
+ } = props,
582
+ contentContext = useMenuContentContext(scope),
583
+ ref = React.useRef(null),
584
+ composedRefs = (0, import_core.useComposedRefs)(forwardedRef, ref),
585
+ [isFocused, setIsFocused] = React.useState(!1),
586
+ [textContent, setTextContent] = React.useState("");
587
+ return import_web.isWeb && React.useEffect(function () {
588
+ var menuItem = ref.current;
589
+ if (menuItem) {
590
+ var _menuItem_textContent;
591
+ setTextContent(((_menuItem_textContent = menuItem.textContent) !== null && _menuItem_textContent !== void 0 ? _menuItem_textContent : "").trim());
592
+ }
593
+ }, [itemProps.children]), /* @__PURE__ */(0, import_jsx_runtime.jsx)(Collection.ItemSlot, {
594
+ scope: scope || MENU_CONTEXT,
595
+ disabled,
596
+ textValue: textValue ?? textContent,
597
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_roving_focus.RovingFocusGroup.Item, {
598
+ asChild: !0,
599
+ __scopeRovingFocusGroup: scope || MENU_CONTEXT,
600
+ focusable: !disabled,
601
+ ...(!unstyled && {
602
+ flexDirection: "row",
603
+ alignItems: "center"
604
+ }),
605
+ ...itemProps,
606
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(_Item, {
607
+ ...(!unstyled && {
608
+ hoverTheme: !0,
609
+ pressTheme: !0,
610
+ focusTheme: !0,
611
+ paddingVertical: "$2",
612
+ paddingHorizontal: "$4",
613
+ width: "100%"
614
+ }),
615
+ componentName: ITEM_NAME,
616
+ role: "menuitem",
617
+ "data-highlighted": isFocused ? "" : void 0,
618
+ "aria-disabled": disabled || void 0,
619
+ "data-disabled": disabled ? "" : void 0,
620
+ ...itemProps,
621
+ ref: composedRefs,
622
+ /**
623
+ * We focus items on `pointerMove` to achieve the following:
624
+ *
625
+ * - Mouse over an item (it focuses)
626
+ * - Leave mouse where it is and use keyboard to focus a different item
627
+ * - Wiggle mouse without it leaving previously focused item
628
+ * - Previously focused item should re-focus
629
+ *
630
+ * If we used `mouseOver`/`mouseEnter` it would not re-focus when the mouse
631
+ * wiggles. This is to match native menu implementation.
632
+ */
633
+ onPointerMove: (0, import_core.composeEventHandlers)(props.onPointerMove,
634
+ // @ts-ignore
635
+ whenMouse(function (event) {
636
+ if (disabled) contentContext.onItemLeave(event);else if (contentContext.onItemEnter(event), !event.defaultPrevented) {
637
+ var item = event.currentTarget;
638
+ item.focus();
639
+ }
640
+ })),
641
+ onPointerLeave: (0, import_core.composeEventHandlers)(
642
+ // @ts-ignore
643
+ props.onPointerLeave,
644
+ // @ts-ignore
645
+ whenMouse(function (event) {
646
+ return contentContext.onItemLeave(event);
647
+ })),
648
+ onFocus: (0, import_core.composeEventHandlers)(props.onFocus, function () {
649
+ return setIsFocused(!0);
650
+ }),
651
+ onBlur: (0, import_core.composeEventHandlers)(props.onBlur, function () {
652
+ return setIsFocused(!1);
653
+ })
654
+ })
655
+ })
656
+ });
657
+ });
658
+ MenuItem.displayName = ITEM_NAME;
659
+ var ITEM_TITLE_NAME = "MenuItemTitle",
660
+ MenuItemTitle = _Title.styleable(function (props, forwardedRef) {
661
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(_Title, {
662
+ ...props,
663
+ ref: forwardedRef
664
+ });
665
+ });
666
+ MenuItemTitle.displayName = ITEM_TITLE_NAME;
667
+ var ITEM_SUB_TITLE_NAME = "MenuItemSubTitle",
668
+ MenuItemSubTitle = _SubTitle.styleable(function (props, forwardedRef) {
669
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(_SubTitle, {
670
+ ...props,
671
+ ref: forwardedRef
672
+ });
673
+ });
674
+ MenuItemSubTitle.displayName = ITEM_SUB_TITLE_NAME;
675
+ var ITEM_IMAGE = "MenuItemImage",
676
+ MenuItemImage = /* @__PURE__ */React.forwardRef(function (props, forwardedRef) {
677
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(_Image, {
678
+ ...props,
679
+ ref: forwardedRef
680
+ });
681
+ });
682
+ MenuItemImage.displayName = ITEM_IMAGE;
683
+ var ITEM_ICON = "MenuItemIcon",
684
+ MenuItemIcon = _Icon.styleable(function (props, forwardedRef) {
685
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(_Icon, {
686
+ ...props,
687
+ ref: forwardedRef
688
+ });
689
+ });
690
+ MenuItemIcon.displayName = ITEM_ICON;
691
+ var CHECKBOX_ITEM_NAME = "MenuCheckboxItem",
692
+ MenuCheckboxItem = import_stacks.ThemeableStack.styleable(function (props, forwardedRef) {
693
+ var {
694
+ checked = !1,
695
+ onCheckedChange,
696
+ ...checkboxItemProps
697
+ } = props;
698
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(ItemIndicatorProvider, {
699
+ scope: props.scope,
700
+ checked,
701
+ children: (/* @ts-ignore */
702
+ /* @__PURE__ */(0, import_jsx_runtime.jsx)(MenuItem, {
703
+ componentName: CHECKBOX_ITEM_NAME,
704
+ role: import_web.isWeb ? "menuitemcheckbox" : "menuitem",
705
+ "aria-checked": isIndeterminate(checked) ? "mixed" : checked,
706
+ ...checkboxItemProps,
707
+ ref: forwardedRef,
708
+ "data-state": getCheckedState(checked),
709
+ onSelect: (0, import_core.composeEventHandlers)(checkboxItemProps.onSelect, function () {
710
+ return onCheckedChange?.(isIndeterminate(checked) ? !0 : !checked);
711
+ }, {
712
+ checkDefaultPrevented: !1
713
+ })
714
+ }))
715
+ });
716
+ });
717
+ MenuCheckboxItem.displayName = CHECKBOX_ITEM_NAME;
718
+ var RADIO_GROUP_NAME = "MenuRadioGroup",
719
+ {
720
+ Provider: RadioGroupProvider,
721
+ useStyledContext: useRadioGroupContext
722
+ } = (0, import_core.createStyledContext)(),
723
+ MenuRadioGroup = _MenuGroup.styleable(function (props, forwardedRef) {
724
+ var {
725
+ value,
726
+ onValueChange,
727
+ scope,
728
+ ...groupProps
729
+ } = props,
730
+ handleValueChange = (0, import_use_callback_ref.useCallbackRef)(onValueChange);
731
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(RadioGroupProvider, {
732
+ scope,
733
+ value,
734
+ onValueChange: handleValueChange,
735
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(_MenuGroup, {
736
+ componentName: RADIO_GROUP_NAME,
737
+ ...groupProps,
738
+ ref: forwardedRef
739
+ })
740
+ });
741
+ });
742
+ MenuRadioGroup.displayName = RADIO_GROUP_NAME;
743
+ var RADIO_ITEM_NAME = "MenuRadioItem",
744
+ MenuRadioItem = import_stacks.ThemeableStack.styleable(function (props, forwardedRef) {
745
+ var {
746
+ value,
747
+ ...radioItemProps
748
+ } = props,
749
+ context = useRadioGroupContext(props.scope),
750
+ checked = value === context.value;
751
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(ItemIndicatorProvider, {
752
+ scope: props.scope,
753
+ checked,
754
+ children: (/* @ts-ignore */
755
+ /* @__PURE__ */(0, import_jsx_runtime.jsx)(MenuItem, {
756
+ componentName: RADIO_ITEM_NAME,
757
+ ...radioItemProps,
758
+ "aria-checked": checked,
759
+ ref: forwardedRef,
760
+ role: import_web.isWeb ? "menuitemradio" : "menuitem",
761
+ "data-state": getCheckedState(checked),
762
+ onSelect: (0, import_core.composeEventHandlers)(radioItemProps.onSelect, function () {
763
+ var _context_onValueChange;
764
+ return (_context_onValueChange = context.onValueChange) === null || _context_onValueChange === void 0 ? void 0 : _context_onValueChange.call(context, value);
765
+ }, {
766
+ checkDefaultPrevented: !1
767
+ })
768
+ }))
769
+ });
770
+ });
771
+ MenuRadioItem.displayName = RADIO_ITEM_NAME;
772
+ var ITEM_INDICATOR_NAME = "MenuItemIndicator",
773
+ {
774
+ Provider: ItemIndicatorProvider,
775
+ useStyledContext: useItemIndicatorContext
776
+ } = (0, import_core.createStyledContext)(),
777
+ MenuItemIndicator = _Indicator.styleable(function (props, forwardedRef) {
778
+ var {
779
+ scope,
780
+ forceMount,
781
+ ...itemIndicatorProps
782
+ } = props,
783
+ indicatorContext = useItemIndicatorContext(scope);
784
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_animate_presence.AnimatePresence, {
785
+ children: forceMount || isIndeterminate(indicatorContext.checked) || indicatorContext.checked === !0 ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(_Indicator, {
786
+ componentName: ITEM_INDICATOR_NAME,
787
+ tag: "span",
788
+ ...itemIndicatorProps,
789
+ ref: forwardedRef,
790
+ "data-state": getCheckedState(indicatorContext.checked)
791
+ }) : null
792
+ });
793
+ });
794
+ MenuItemIndicator.displayName = ITEM_INDICATOR_NAME;
795
+ var MenuArrow = /* @__PURE__ */React.forwardRef(function (props, forwardedRef) {
796
+ var {
797
+ scope,
798
+ unstyled = process.env.TAMAGUI_HEADLESS === "1",
799
+ ...rest
800
+ } = props;
801
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(PopperPrimitive.PopperArrow, {
802
+ scope: scope || MENU_CONTEXT,
803
+ componentName: "PopperArrow",
804
+ ...(!unstyled && {
805
+ backgroundColor: "$background"
806
+ }),
807
+ ...rest,
808
+ ref: forwardedRef
809
+ });
810
+ }),
811
+ SUB_NAME = "MenuSub",
812
+ {
813
+ Provider: MenuSubProvider,
814
+ useStyledContext: useMenuSubContext
815
+ } = (0, import_core.createStyledContext)(),
816
+ MenuSub = function (props) {
817
+ var {
818
+ scope,
819
+ children,
820
+ open = !1,
821
+ onOpenChange,
822
+ ...rest
823
+ } = props,
824
+ parentMenuContext = useMenuContext(scope),
825
+ [trigger, setTrigger] = React.useState(null),
826
+ [content, setContent] = React.useState(null),
827
+ handleOpenChange = (0, import_use_callback_ref.useCallbackRef)(onOpenChange);
828
+ return React.useEffect(function () {
829
+ return parentMenuContext.open === !1 && handleOpenChange(!1), function () {
830
+ return handleOpenChange(!1);
831
+ };
832
+ }, [parentMenuContext.open, handleOpenChange]), /* @__PURE__ */(0, import_jsx_runtime.jsx)(PopperPrimitive.Popper, {
833
+ ...rest,
834
+ scope: scope || MENU_CONTEXT,
835
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(MenuProvider, {
836
+ scope,
837
+ open,
838
+ onOpenChange: handleOpenChange,
839
+ content,
840
+ onContentChange: setContent,
841
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(MenuSubProvider, {
842
+ scope,
843
+ contentId: (0, import_react.useId)(),
844
+ triggerId: (0, import_react.useId)(),
845
+ trigger,
846
+ onTriggerChange: setTrigger,
847
+ children
848
+ })
849
+ })
850
+ });
851
+ };
852
+ MenuSub.displayName = SUB_NAME;
853
+ var SUB_TRIGGER_NAME = "MenuSubTrigger",
854
+ MenuSubTrigger = import_stacks.YStack.styleable(function (props, forwardedRef) {
855
+ var context = useMenuContext(props.scope),
856
+ rootContext = useMenuRootContext(props.scope),
857
+ subContext = useMenuSubContext(props.scope),
858
+ contentContext = useMenuContentContext(props.scope),
859
+ openTimerRef = React.useRef(null),
860
+ {
861
+ pointerGraceTimerRef,
862
+ onPointerGraceIntentChange
863
+ } = contentContext,
864
+ clearOpenTimer = React.useCallback(function () {
865
+ openTimerRef.current && window.clearTimeout(openTimerRef.current), openTimerRef.current = null;
866
+ }, []);
867
+ return React.useEffect(function () {
868
+ return clearOpenTimer;
869
+ }, [clearOpenTimer]), React.useEffect(function () {
870
+ var pointerGraceTimer = pointerGraceTimerRef.current;
871
+ return function () {
872
+ window.clearTimeout(pointerGraceTimer), onPointerGraceIntentChange(null);
873
+ };
874
+ }, [pointerGraceTimerRef, onPointerGraceIntentChange]), /* @__PURE__ */(0, import_jsx_runtime.jsx)(MenuAnchor, {
875
+ componentName: SUB_TRIGGER_NAME,
876
+ asChild: !0,
877
+ scope: props.scope || MENU_CONTEXT,
878
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(MenuItemImpl, {
879
+ id: subContext.triggerId,
880
+ "aria-haspopup": "menu",
881
+ "aria-expanded": context.open,
882
+ "aria-controls": subContext.contentId,
883
+ "data-state": getOpenState(context.open),
884
+ outlineStyle: "none",
885
+ ...props,
886
+ ref: (0, import_core.composeRefs)(forwardedRef, subContext.onTriggerChange),
887
+ // This is redundant for mouse users but we cannot determine pointer type from
888
+ // click event and we cannot use pointerup event (see git history for reasons why)
889
+ onPress: function (event) {
890
+ var _props_onPress;
891
+ (_props_onPress = props.onPress) === null || _props_onPress === void 0 || _props_onPress.call(props, event), !(props.disabled || event.defaultPrevented) && (import_web.isWeb && event.currentTarget.focus(), context.open || context.onOpenChange(!0));
892
+ },
893
+ onPointerMove: (0, import_core.composeEventHandlers)(props.onPointerMove,
894
+ // @ts-ignore
895
+ whenMouse(function (event) {
896
+ contentContext.onItemEnter(event), !event.defaultPrevented && !props.disabled && !context.open && !openTimerRef.current && (contentContext.onPointerGraceIntentChange(null), openTimerRef.current = window.setTimeout(function () {
897
+ context.onOpenChange(!0), clearOpenTimer();
898
+ }, 100));
899
+ })),
900
+ onPointerLeave: (0, import_core.composeEventHandlers)(props.onPointerLeave,
901
+ // @ts-ignore
902
+ whenMouse(function (event) {
903
+ var _context_content;
904
+ clearOpenTimer();
905
+ var contentRect = (_context_content = context.content) === null || _context_content === void 0 ? void 0 : _context_content.getBoundingClientRect();
906
+ if (contentRect) {
907
+ var _context_content1,
908
+ side = (_context_content1 = context.content) === null || _context_content1 === void 0 ? void 0 : _context_content1.dataset.side,
909
+ rightSide = side === "right",
910
+ bleed = rightSide ? -5 : 5,
911
+ contentNearEdge = contentRect[rightSide ? "left" : "right"],
912
+ contentFarEdge = contentRect[rightSide ? "right" : "left"];
913
+ contentContext.onPointerGraceIntentChange({
914
+ area: [
915
+ // Apply a bleed on clientX to ensure that our exit point is
916
+ // consistently within polygon bounds
917
+ {
918
+ x: event.clientX + bleed,
919
+ y: event.clientY
920
+ }, {
921
+ x: contentNearEdge,
922
+ y: contentRect.top
923
+ }, {
924
+ x: contentFarEdge,
925
+ y: contentRect.top
926
+ }, {
927
+ x: contentFarEdge,
928
+ y: contentRect.bottom
929
+ }, {
930
+ x: contentNearEdge,
931
+ y: contentRect.bottom
932
+ }],
933
+ side
934
+ }), window.clearTimeout(pointerGraceTimerRef.current), pointerGraceTimerRef.current = window.setTimeout(function () {
935
+ return contentContext.onPointerGraceIntentChange(null);
936
+ }, 300);
937
+ } else {
938
+ if (contentContext.onTriggerLeave(event), event.defaultPrevented) return;
939
+ contentContext.onPointerGraceIntentChange(null);
940
+ }
941
+ })),
942
+ ...(import_web.isWeb ? {
943
+ onKeyDown: (0, import_core.composeEventHandlers)(
944
+ // @ts-ignore
945
+ props.onKeyDown, function (event) {
946
+ var isTypingAhead = contentContext.searchRef.current !== "";
947
+ if (!(props.disabled || isTypingAhead && event.key === " ") && SUB_OPEN_KEYS[rootContext.dir].includes(event.key)) {
948
+ var _context_content;
949
+ context.onOpenChange(!0), (_context_content = context.content) === null || _context_content === void 0 || _context_content.focus(), event.preventDefault();
950
+ }
951
+ })
952
+ } : null)
953
+ })
954
+ });
955
+ });
956
+ MenuSubTrigger.displayName = SUB_TRIGGER_NAME;
957
+ var SUB_CONTENT_NAME = "MenuSubContent",
958
+ MenuSubContent = /* @__PURE__ */React.forwardRef(function (props, forwardedRef) {
959
+ var portalContext = usePortalContext(props.scope),
960
+ {
961
+ forceMount = portalContext.forceMount,
962
+ ...subContentProps
963
+ } = props,
964
+ context = useMenuContext(props.scope),
965
+ rootContext = useMenuRootContext(props.scope),
966
+ subContext = useMenuSubContext(props.scope),
967
+ ref = React.useRef(null),
968
+ composedRefs = (0, import_core.useComposedRefs)(forwardedRef, ref);
969
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(Collection.Provider, {
970
+ scope: props.scope || MENU_CONTEXT,
971
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(Collection.Slot, {
972
+ scope: props.scope || MENU_CONTEXT,
973
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(MenuContentImpl, {
974
+ id: subContext.contentId,
975
+ "aria-labelledby": subContext.triggerId,
976
+ ...subContentProps,
977
+ ref: composedRefs,
978
+ "data-side": rootContext.dir === "rtl" ? "left" : "right",
979
+ disableOutsidePointerEvents: !1,
980
+ disableOutsideScroll: !1,
981
+ trapFocus: !1,
982
+ onOpenAutoFocus: function (event) {
983
+ var _ref_current;
984
+ rootContext.isUsingKeyboardRef.current && ((_ref_current = ref.current) === null || _ref_current === void 0 || _ref_current.focus()), event.preventDefault();
985
+ },
986
+ // The menu might close because of focusing another menu item in the parent menu. We
987
+ // don't want it to refocus the trigger in that case so we handle trigger focus ourselves.
988
+ onCloseAutoFocus: function (event) {
989
+ return event.preventDefault();
990
+ },
991
+ onFocusOutside: (0, import_core.composeEventHandlers)(props.onFocusOutside, function (event) {
992
+ event.target !== subContext.trigger && context.onOpenChange(!1);
993
+ }),
994
+ onEscapeKeyDown: (0, import_core.composeEventHandlers)(props.onEscapeKeyDown, function (event) {
995
+ rootContext.onClose(), event.preventDefault();
996
+ }),
997
+ ...(import_web.isWeb ? {
998
+ // @ts-ignore
999
+ onKeyDown: (0, import_core.composeEventHandlers)(
1000
+ // @ts-ignore
1001
+ props.onKeyDown, function (event) {
1002
+ var isKeyDownInside = event.currentTarget.contains(event.target),
1003
+ isCloseKey = SUB_CLOSE_KEYS[rootContext.dir].includes(event.key);
1004
+ if (isKeyDownInside && isCloseKey) {
1005
+ var _subContext_trigger;
1006
+ context.onOpenChange(!1), (_subContext_trigger = subContext.trigger) === null || _subContext_trigger === void 0 || _subContext_trigger.focus(), event.preventDefault();
1007
+ }
1008
+ })
1009
+ } : null)
1010
+ })
1011
+ })
1012
+ });
1013
+ });
1014
+ MenuSubContent.displayName = SUB_CONTENT_NAME;
1015
+ var Anchor = MenuAnchor,
1016
+ Portal = MenuPortal,
1017
+ Content = MenuContent,
1018
+ Group = _MenuGroup,
1019
+ Label = _Label,
1020
+ Item = MenuItem,
1021
+ CheckboxItem = MenuCheckboxItem,
1022
+ RadioGroup = MenuRadioGroup,
1023
+ RadioItem = MenuRadioItem,
1024
+ ItemIndicator = MenuItemIndicator,
1025
+ Separator = _Separator,
1026
+ Arrow = MenuArrow,
1027
+ Sub = MenuSub,
1028
+ SubTrigger = MenuSubTrigger,
1029
+ SubContent = MenuSubContent,
1030
+ ItemTitle = MenuItemTitle,
1031
+ ItemSubtitle = MenuItemSubTitle,
1032
+ ItemImage = MenuItemImage,
1033
+ ItemIcon = MenuItemIcon,
1034
+ Menu = (0, import_web.withStaticProperties)(MenuComp, {
1035
+ Anchor,
1036
+ Portal,
1037
+ Content,
1038
+ Group,
1039
+ Label,
1040
+ Item,
1041
+ CheckboxItem,
1042
+ RadioGroup,
1043
+ RadioItem,
1044
+ ItemIndicator,
1045
+ Separator,
1046
+ Arrow,
1047
+ Sub,
1048
+ SubTrigger,
1049
+ SubContent,
1050
+ ItemTitle,
1051
+ ItemSubtitle,
1052
+ ItemImage,
1053
+ ItemIcon
1054
+ });
1055
+ return {
1056
+ Menu
1057
+ };
1058
+ }
1059
+ function getOpenState(open) {
1060
+ return open ? "open" : "closed";
1061
+ }
1062
+ function isIndeterminate(checked) {
1063
+ return checked === "indeterminate";
1064
+ }
1065
+ function getCheckedState(checked) {
1066
+ return isIndeterminate(checked) ? "indeterminate" : checked ? "checked" : "unchecked";
1067
+ }
1068
+ function focusFirst(candidates) {
1069
+ var PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement,
1070
+ _iteratorNormalCompletion = !0,
1071
+ _didIteratorError = !1,
1072
+ _iteratorError = void 0;
1073
+ try {
1074
+ for (var _iterator = candidates[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) {
1075
+ var candidate = _step.value;
1076
+ if (candidate === PREVIOUSLY_FOCUSED_ELEMENT || (candidate.focus(), document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT)) return;
1077
+ }
1078
+ } catch (err) {
1079
+ _didIteratorError = !0, _iteratorError = err;
1080
+ } finally {
1081
+ try {
1082
+ !_iteratorNormalCompletion && _iterator.return != null && _iterator.return();
1083
+ } finally {
1084
+ if (_didIteratorError) throw _iteratorError;
1085
+ }
1086
+ }
1087
+ }
1088
+ function wrapArray(array, startIndex) {
1089
+ return array.map(function (_, index) {
1090
+ return array[(startIndex + index) % array.length];
1091
+ });
1092
+ }
1093
+ function getNextMatch(values, search, currentMatch) {
1094
+ var isRepeated = search.length > 1 && Array.from(search).every(function (char) {
1095
+ return char === search[0];
1096
+ }),
1097
+ normalizedSearch = isRepeated ? search[0] : search,
1098
+ currentMatchIndex = currentMatch ? values.indexOf(currentMatch) : -1,
1099
+ wrappedValues = wrapArray(values, Math.max(currentMatchIndex, 0)),
1100
+ excludeCurrentMatch = normalizedSearch.length === 1;
1101
+ excludeCurrentMatch && (wrappedValues = wrappedValues.filter(function (v) {
1102
+ return v !== currentMatch;
1103
+ }));
1104
+ var nextMatch = wrappedValues.find(function (value) {
1105
+ return value.toLowerCase().startsWith(normalizedSearch.toLowerCase());
1106
+ });
1107
+ return nextMatch !== currentMatch ? nextMatch : void 0;
1108
+ }
1109
+ function isPointInPolygon(point, polygon) {
1110
+ for (var {
1111
+ x,
1112
+ y
1113
+ } = point, inside = !1, i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
1114
+ var xi = polygon[i].x,
1115
+ yi = polygon[i].y,
1116
+ xj = polygon[j].x,
1117
+ yj = polygon[j].y,
1118
+ intersect = yi > y != yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi;
1119
+ intersect && (inside = !inside);
1120
+ }
1121
+ return inside;
1122
+ }
1123
+ function isPointerInGraceArea(event, area) {
1124
+ if (!area) return !1;
1125
+ var cursorPos = {
1126
+ x: event.clientX,
1127
+ y: event.clientY
1128
+ };
1129
+ return isPointInPolygon(cursorPos, area);
1130
+ }
1131
+ function whenMouse(handler) {
1132
+ return function (event) {
1133
+ return event.pointerType === "mouse" ? handler(event) : void 0;
1134
+ };
1135
+ }
1136
+ //# sourceMappingURL=createMenu.native.js.map