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