@tamagui/create-menu 2.7.7 → 3.0.0-beta.643.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/dist/cjs/createBaseMenu.cjs +1033 -1247
  2. package/dist/cjs/createBaseMenu.native.cjs +1217 -0
  3. package/dist/cjs/createBaseMenu.native.js +1155 -1387
  4. package/dist/cjs/createBaseMenu.native.js.map +1 -1
  5. package/dist/cjs/createNativeMenu/createNativeMenu.cjs +346 -377
  6. package/dist/cjs/createNativeMenu/createNativeMenu.native.cjs +439 -0
  7. package/dist/cjs/createNativeMenu/createNativeMenu.native.js +405 -439
  8. package/dist/cjs/createNativeMenu/createNativeMenu.native.js.map +1 -1
  9. package/dist/cjs/createNativeMenu/createNativeMenuTypes.cjs +10 -11
  10. package/dist/cjs/createNativeMenu/createNativeMenuTypes.native.cjs +19 -0
  11. package/dist/cjs/createNativeMenu/createNativeMenuTypes.native.js +10 -10
  12. package/dist/cjs/createNativeMenu/createNativeMenuTypes.native.js.map +1 -1
  13. package/dist/cjs/createNativeMenu/utils.cjs +76 -86
  14. package/dist/cjs/createNativeMenu/utils.native.cjs +107 -0
  15. package/dist/cjs/createNativeMenu/utils.native.js +82 -92
  16. package/dist/cjs/createNativeMenu/utils.native.js.map +1 -1
  17. package/dist/cjs/createNativeMenu/withNativeMenu.cjs +27 -35
  18. package/dist/cjs/createNativeMenu/withNativeMenu.native.cjs +42 -0
  19. package/dist/cjs/createNativeMenu/withNativeMenu.native.js +27 -34
  20. package/dist/cjs/createNativeMenu/withNativeMenu.native.js.map +1 -1
  21. package/dist/cjs/index.cjs +9 -20
  22. package/dist/cjs/index.native.cjs +23 -0
  23. package/dist/cjs/index.native.js +10 -20
  24. package/dist/cjs/index.native.js.map +1 -1
  25. package/dist/esm/createBaseMenu.mjs +1021 -1225
  26. package/dist/esm/createBaseMenu.mjs.map +1 -1
  27. package/dist/esm/createBaseMenu.native.js +1144 -1367
  28. package/dist/esm/createBaseMenu.native.js.map +1 -1
  29. package/dist/esm/createNativeMenu/createNativeMenu.mjs +332 -353
  30. package/dist/esm/createNativeMenu/createNativeMenu.mjs.map +1 -1
  31. package/dist/esm/createNativeMenu/createNativeMenu.native.js +392 -417
  32. package/dist/esm/createNativeMenu/createNativeMenu.native.js.map +1 -1
  33. package/dist/esm/createNativeMenu/createNativeMenuTypes.mjs +0 -2
  34. package/dist/esm/createNativeMenu/createNativeMenuTypes.native.js +0 -2
  35. package/dist/esm/createNativeMenu/utils.mjs +55 -57
  36. package/dist/esm/createNativeMenu/utils.mjs.map +1 -1
  37. package/dist/esm/createNativeMenu/utils.native.js +62 -65
  38. package/dist/esm/createNativeMenu/utils.native.js.map +1 -1
  39. package/dist/esm/createNativeMenu/withNativeMenu.mjs +14 -17
  40. package/dist/esm/createNativeMenu/withNativeMenu.mjs.map +1 -1
  41. package/dist/esm/createNativeMenu/withNativeMenu.native.js +15 -18
  42. package/dist/esm/createNativeMenu/withNativeMenu.native.js.map +1 -1
  43. package/dist/esm/index.js +5 -6
  44. package/dist/esm/index.mjs +5 -6
  45. package/dist/esm/index.native.js +5 -6
  46. package/dist/jsx/createBaseMenu.mjs +1021 -1225
  47. package/dist/jsx/createBaseMenu.mjs.map +1 -1
  48. package/dist/jsx/createBaseMenu.native.cjs +1217 -0
  49. package/dist/jsx/createBaseMenu.native.js +1155 -1387
  50. package/dist/jsx/createBaseMenu.native.js.map +1 -1
  51. package/dist/jsx/createNativeMenu/createNativeMenu.mjs +332 -353
  52. package/dist/jsx/createNativeMenu/createNativeMenu.mjs.map +1 -1
  53. package/dist/jsx/createNativeMenu/createNativeMenu.native.cjs +439 -0
  54. package/dist/jsx/createNativeMenu/createNativeMenu.native.js +405 -439
  55. package/dist/jsx/createNativeMenu/createNativeMenu.native.js.map +1 -1
  56. package/dist/jsx/createNativeMenu/createNativeMenuTypes.mjs +0 -2
  57. package/dist/jsx/createNativeMenu/createNativeMenuTypes.native.cjs +19 -0
  58. package/dist/jsx/createNativeMenu/createNativeMenuTypes.native.js +10 -10
  59. package/dist/jsx/createNativeMenu/createNativeMenuTypes.native.js.map +1 -1
  60. package/dist/jsx/createNativeMenu/utils.mjs +55 -57
  61. package/dist/jsx/createNativeMenu/utils.mjs.map +1 -1
  62. package/dist/jsx/createNativeMenu/utils.native.cjs +107 -0
  63. package/dist/jsx/createNativeMenu/utils.native.js +82 -92
  64. package/dist/jsx/createNativeMenu/utils.native.js.map +1 -1
  65. package/dist/jsx/createNativeMenu/withNativeMenu.mjs +14 -17
  66. package/dist/jsx/createNativeMenu/withNativeMenu.mjs.map +1 -1
  67. package/dist/jsx/createNativeMenu/withNativeMenu.native.cjs +42 -0
  68. package/dist/jsx/createNativeMenu/withNativeMenu.native.js +27 -34
  69. package/dist/jsx/createNativeMenu/withNativeMenu.native.js.map +1 -1
  70. package/dist/jsx/index.js +5 -6
  71. package/dist/jsx/index.mjs +5 -6
  72. package/dist/jsx/index.native.cjs +23 -0
  73. package/dist/jsx/index.native.js +10 -20
  74. package/dist/jsx/index.native.js.map +1 -1
  75. package/package.json +23 -22
  76. package/src/createBaseMenu.tsx +211 -231
  77. package/src/createNativeMenu/createNativeMenuTypes.ts +0 -6
  78. package/src/createNativeMenu/utils.tsx +6 -6
  79. package/src/createNativeMenu/withNativeMenu.tsx +1 -2
  80. package/src/index.tsx +0 -1
  81. package/types/createBaseMenu.d.ts +38 -126
  82. package/types/createBaseMenu.d.ts.map +1 -1
  83. package/types/createNativeMenu/createNativeMenu.d.ts +1 -1
  84. package/types/createNativeMenu/createNativeMenu.d.ts.map +1 -1
  85. package/types/createNativeMenu/createNativeMenuTypes.d.ts +0 -6
  86. package/types/createNativeMenu/createNativeMenuTypes.d.ts.map +1 -1
  87. package/types/createNativeMenu/utils.d.ts +5 -5
  88. package/types/createNativeMenu/utils.d.ts.map +1 -1
  89. package/types/createNativeMenu/withNativeMenu.d.ts.map +1 -1
  90. package/types/index.d.ts +0 -1
  91. package/types/index.d.ts.map +1 -1
  92. package/dist/cjs/MenuPredefined.cjs +0 -191
  93. package/dist/cjs/MenuPredefined.native.js +0 -194
  94. package/dist/cjs/MenuPredefined.native.js.map +0 -1
  95. package/dist/esm/MenuPredefined.mjs +0 -166
  96. package/dist/esm/MenuPredefined.mjs.map +0 -1
  97. package/dist/esm/MenuPredefined.native.js +0 -166
  98. package/dist/esm/MenuPredefined.native.js.map +0 -1
  99. package/dist/esm/createNativeMenu/createNativeMenuTypes.mjs.map +0 -1
  100. package/dist/esm/createNativeMenu/createNativeMenuTypes.native.js.map +0 -1
  101. package/dist/esm/index.js.map +0 -1
  102. package/dist/esm/index.mjs.map +0 -1
  103. package/dist/esm/index.native.js.map +0 -1
  104. package/dist/jsx/MenuPredefined.mjs +0 -166
  105. package/dist/jsx/MenuPredefined.mjs.map +0 -1
  106. package/dist/jsx/MenuPredefined.native.js +0 -194
  107. package/dist/jsx/MenuPredefined.native.js.map +0 -1
  108. package/dist/jsx/createNativeMenu/createNativeMenuTypes.mjs.map +0 -1
  109. package/dist/jsx/index.js.map +0 -1
  110. package/dist/jsx/index.mjs.map +0 -1
  111. package/src/MenuPredefined.tsx +0 -204
  112. package/types/MenuPredefined.d.ts +0 -31
  113. package/types/MenuPredefined.d.ts.map +0 -1
@@ -1,3 +1,4 @@
1
+
1
2
  var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -5,404 +6,372 @@ var __getOwnPropNames = Object.getOwnPropertyNames;
5
6
  var __getProtoOf = Object.getPrototypeOf;
6
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
7
8
  var __export = (target, all) => {
8
- for (var name in all) __defProp(target, name, {
9
- get: all[name],
10
- enumerable: true
11
- });
9
+ for (var name in all) __defProp(target, name, {
10
+ get: all[name],
11
+ enumerable: true
12
+ });
12
13
  };
13
14
  var __copyProps = (to, from, except, desc) => {
14
- if (from && typeof from === "object" || typeof from === "function") {
15
- for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
16
- get: () => from[key],
17
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
18
- });
19
- }
20
- return to;
15
+ if (from && typeof from === "object" || typeof from === "function") {
16
+ for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
17
+ get: () => from[key],
18
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
19
+ });
20
+ }
21
+ return to;
21
22
  };
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: true
23
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
24
+ value: mod,
25
+ enumerable: true
30
26
  }) : target, mod));
31
- var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
32
- value: true
33
- }), mod);
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
34
28
  var createNativeMenu_exports = {};
35
- __export(createNativeMenu_exports, {
36
- createNativeMenu: () => createNativeMenu
37
- });
29
+ __export(createNativeMenu_exports, { createNativeMenu: () => createNativeMenu });
38
30
  module.exports = __toCommonJS(createNativeMenu_exports);
39
31
  var import_native = require("@tamagui/native");
40
32
  var import_web = require("@tamagui/web");
41
33
  var import_react = __toESM(require("react"), 1);
42
34
  var import_jsx_runtime = require("react/jsx-runtime");
43
- const MAPPED_TYPES = ["SubContent", "SubTrigger", "Content", "Sub", "Group", "Item", "ItemTitle", "ItemSubtitle", "ItemIcon", "ItemImage", "ItemIndicator", "Label", "Separator", "CheckboxItem", "Preview", "Auxiliary"];
44
- const CONTAINER_TYPES = ["SubContent", "SubTrigger", "Content", "Sub", "Group", "Item"];
35
+ const MAPPED_TYPES = [
36
+ "SubContent",
37
+ "SubTrigger",
38
+ "Content",
39
+ "Sub",
40
+ "Group",
41
+ "Item",
42
+ "ItemTitle",
43
+ "ItemSubtitle",
44
+ "ItemIcon",
45
+ "ItemImage",
46
+ "ItemIndicator",
47
+ "Label",
48
+ "Separator",
49
+ "CheckboxItem",
50
+ "Preview",
51
+ "Auxiliary"
52
+ ];
53
+ const CONTAINER_TYPES = [
54
+ "SubContent",
55
+ "SubTrigger",
56
+ "Content",
57
+ "Sub",
58
+ "Group",
59
+ "Item"
60
+ ];
45
61
  function getComponentType(displayName) {
46
- for (const type of MAPPED_TYPES) {
47
- if (displayName === type || displayName === `Menu${type}` || displayName === `ContextMenu${type}` || displayName.includes(`(${type})`)) {
48
- return type;
49
- }
50
- }
51
- return null;
62
+ for (const type of MAPPED_TYPES) {
63
+ if (displayName === type || displayName === `Menu${type}` || displayName === `ContextMenu${type}` || displayName.includes(`(${type})`)) {
64
+ return type;
65
+ }
66
+ }
67
+ return null;
52
68
  }
53
69
  function isItemLike(props, displayName) {
54
- if (getComponentType(displayName)) return false;
55
- return "onSelect" in props || "textValue" in props;
70
+ if (getComponentType(displayName)) return false;
71
+ return "onSelect" in props || "textValue" in props;
56
72
  }
57
73
  function isPortalLike(displayName) {
58
- return displayName === "Portal" || displayName.includes("Portal");
74
+ return displayName === "Portal" || displayName.includes("Portal");
59
75
  }
60
76
  function isTriggerLike(displayName) {
61
- return displayName === "Trigger" || displayName.includes("(Trigger)");
77
+ return displayName === "Trigger" || displayName.includes("(Trigger)");
62
78
  }
63
79
  function composeHandlers(first, second) {
64
- return (...args) => {
65
- first?.(...args);
66
- second?.(...args);
67
- };
80
+ return (...args) => {
81
+ first?.(...args);
82
+ second?.(...args);
83
+ };
68
84
  }
69
85
  function getTriggerDebugName(menuType, props) {
70
- const childProps = import_react.default.isValidElement(props.children) && props.children.props ? props.children.props : null;
71
- const prefix = menuType === "ContextMenu" ? "ContextMenuTrigger" : "MenuTrigger";
72
- const detail = childProps?.testID ?? childProps?.accessibilityLabel ?? (typeof props.textValue === "string" ? props.textValue : null);
73
- return [prefix, detail].filter(Boolean).join(":") || prefix;
86
+ const childProps = import_react.default.isValidElement(props.children) && props.children.props ? props.children.props : null;
87
+ const prefix = menuType === "ContextMenu" ? "ContextMenuTrigger" : "MenuTrigger";
88
+ const detail = childProps?.testID ?? childProps?.accessibilityLabel ?? (typeof props.textValue === "string" ? props.textValue : null);
89
+ return [prefix, detail].filter(Boolean).join(":") || prefix;
74
90
  }
75
- const emptyStub = () => null;
91
+ const emptyStub = (() => null);
76
92
  function createWebStubs() {
77
- return {
78
- Menu: (0, import_web.withStaticProperties)(emptyStub, {
79
- Trigger: emptyStub,
80
- Content: emptyStub,
81
- Item: emptyStub,
82
- ItemTitle: emptyStub,
83
- ItemSubtitle: emptyStub,
84
- SubTrigger: emptyStub,
85
- Group: emptyStub,
86
- ItemIcon: emptyStub,
87
- Separator: emptyStub,
88
- CheckboxItem: emptyStub,
89
- ItemIndicator: emptyStub,
90
- ItemImage: emptyStub,
91
- Label: emptyStub,
92
- Arrow: emptyStub,
93
- Sub: emptyStub,
94
- SubContent: emptyStub,
95
- Preview: emptyStub,
96
- Portal: emptyStub,
97
- RadioGroup: emptyStub,
98
- RadioItem: emptyStub,
99
- Auxiliary: emptyStub
100
- })
101
- };
93
+ return { Menu: (0, import_web.withStaticProperties)(emptyStub, {
94
+ Trigger: emptyStub,
95
+ Content: emptyStub,
96
+ Item: emptyStub,
97
+ ItemTitle: emptyStub,
98
+ ItemSubtitle: emptyStub,
99
+ SubTrigger: emptyStub,
100
+ Group: emptyStub,
101
+ ItemIcon: emptyStub,
102
+ Separator: emptyStub,
103
+ CheckboxItem: emptyStub,
104
+ ItemIndicator: emptyStub,
105
+ ItemImage: emptyStub,
106
+ Label: emptyStub,
107
+ Arrow: emptyStub,
108
+ Sub: emptyStub,
109
+ SubContent: emptyStub,
110
+ Preview: emptyStub,
111
+ Portal: emptyStub,
112
+ RadioGroup: emptyStub,
113
+ RadioItem: emptyStub,
114
+ Auxiliary: emptyStub
115
+ }) };
102
116
  }
103
- const createNativeMenu = MenuType => {
104
- if (import_web.isWeb) {
105
- return createWebStubs();
106
- }
107
- const isContextMenu = MenuType === "ContextMenu";
108
- const isAndroid = !import_web.isIos && !import_web.isWeb;
109
- let resolved = null;
110
- let warned = false;
111
- function resolve() {
112
- if (resolved) return resolved;
113
- const adapter = (0, import_native.getNativeMenuAdapter)();
114
- if (!adapter) {
115
- if (!warned) {
116
- warned = true;
117
- console.warn(`Warning: Register a native menu adapter before rendering Tamagui native menus`);
118
- }
119
- return null;
120
- }
121
- const menu = isContextMenu ? adapter.ContextMenu : adapter.Menu;
122
- resolved = {
123
- menu,
124
- componentMap: {
125
- SubContent: menu.SubContent,
126
- SubTrigger: menu.SubTrigger,
127
- Content: menu.Content,
128
- Sub: menu.Sub,
129
- Group: menu.Group,
130
- Item: menu.Item,
131
- ItemTitle: menu.ItemTitle,
132
- ItemSubtitle: menu.ItemSubtitle,
133
- ItemIcon: menu.ItemIcon,
134
- ItemImage: menu.ItemImage,
135
- ItemIndicator: menu.ItemIndicator,
136
- Label: menu.Label,
137
- Separator: menu.Separator,
138
- CheckboxItem: menu.CheckboxItem,
139
- Preview: menu.Preview,
140
- Auxiliary: menu.Auxiliary
141
- }
142
- };
143
- return resolved;
144
- }
145
- function transformChildren(menu, map, children, shouldReverseOnIos = false, triggerBoundaryHandlers, radioContext) {
146
- const result = [];
147
- import_react.default.Children.forEach(children, child => {
148
- if (!import_react.default.isValidElement(child)) {
149
- result.push(child);
150
- return;
151
- }
152
- const displayName = child.type?.displayName || "";
153
- const props = child.props;
154
- if (isPortalLike(displayName)) {
155
- const inner = transformChildren(menu, map, props.children, false, triggerBoundaryHandlers, radioContext);
156
- import_react.default.Children.forEach(inner, c => result.push(c));
157
- return;
158
- }
159
- if (displayName.includes("ScrollView")) {
160
- const inner = transformChildren(menu, map, props.children, false, triggerBoundaryHandlers, radioContext);
161
- import_react.default.Children.forEach(inner, c => result.push(c));
162
- return;
163
- }
164
- if (isTriggerLike(displayName)) {
165
- const debugName = getTriggerDebugName(MenuType, props);
166
- const claim = () => triggerBoundaryHandlers?.claim(debugName);
167
- const release = () => triggerBoundaryHandlers?.release(debugName);
168
- const {
169
- children: triggerChildren,
170
- ...triggerProps
171
- } = props;
172
- result.push(import_react.default.createElement(menu.Trigger, {
173
- ...triggerProps,
174
- key: child.key,
175
- onTouchStart: composeHandlers(claim, props.onTouchStart),
176
- onTouchEnd: composeHandlers(props.onTouchEnd, release),
177
- onTouchCancel: composeHandlers(props.onTouchCancel, release),
178
- onResponderGrant: composeHandlers(claim, props.onResponderGrant),
179
- onResponderRelease: composeHandlers(props.onResponderRelease, release),
180
- onResponderTerminate: composeHandlers(props.onResponderTerminate, release),
181
- onPressIn: composeHandlers(claim, props.onPressIn),
182
- onPressOut: composeHandlers(props.onPressOut, release)
183
- }, triggerChildren));
184
- return;
185
- }
186
- if (displayName.includes("RadioGroup")) {
187
- const {
188
- value: rgValue,
189
- onValueChange: rgOnValueChange,
190
- children: rgChildren,
191
- ...rest
192
- } = props;
193
- result.push(import_react.default.createElement(menu.Group, {
194
- ...rest,
195
- key: child.key
196
- }, transformChildren(menu, map, rgChildren, false, triggerBoundaryHandlers, {
197
- value: rgValue,
198
- onValueChange: rgOnValueChange
199
- })));
200
- return;
201
- }
202
- if (displayName.includes("RadioItem") && radioContext) {
203
- const {
204
- value: itemValue,
205
- children: rChildren,
206
- ...rest
207
- } = props;
208
- const cleanChildren = import_react.default.Children.map(rChildren, c => {
209
- if (!import_react.default.isValidElement(c)) return c;
210
- const dn = c.type?.displayName || "";
211
- if (dn.includes("ItemIndicator")) return null;
212
- return c;
213
- });
214
- result.push(import_react.default.createElement(menu.CheckboxItem, {
215
- ...rest,
216
- key: child.key,
217
- value: itemValue === radioContext.value ? "on" : "off",
218
- onValueChange: () => radioContext.onValueChange?.(itemValue)
219
- }, transformChildren(menu, map, cleanChildren, false, triggerBoundaryHandlers, radioContext)));
220
- return;
221
- }
222
- const componentType = getComponentType(displayName);
223
- if (componentType === "CheckboxItem") {
224
- const {
225
- checked,
226
- onCheckedChange,
227
- value,
228
- onValueChange,
229
- children: cbChildren,
230
- ...rest
231
- } = props;
232
- const finalValue = value ?? (checked ? "on" : "off");
233
- const finalOnValueChange = onValueChange ?? (onCheckedChange && (v => onCheckedChange(v === "on")));
234
- const cleanChildren = import_react.default.Children.map(cbChildren, c => {
235
- if (!import_react.default.isValidElement(c)) return c;
236
- const dn = c.type?.displayName || "";
237
- if (dn.includes("ItemIndicator")) return null;
238
- return c;
239
- });
240
- result.push(import_react.default.createElement(menu.CheckboxItem, {
241
- ...rest,
242
- key: child.key,
243
- value: finalValue,
244
- onValueChange: finalOnValueChange
245
- }, transformChildren(menu, map, cleanChildren, false, triggerBoundaryHandlers, radioContext)));
246
- return;
247
- }
248
- if (componentType) {
249
- const {
250
- children: childChildren,
251
- ...restProps
252
- } = props;
253
- const AdapterComponent = map[componentType];
254
- const isContainer = CONTAINER_TYPES.includes(componentType);
255
- const shouldReverse = componentType === "Content" || componentType === "SubContent";
256
- result.push(import_react.default.createElement(AdapterComponent, {
257
- ...restProps,
258
- key: child.key
259
- }, isContainer ? transformChildren(menu, map, childChildren, shouldReverse, triggerBoundaryHandlers, radioContext) : childChildren));
260
- return;
261
- }
262
- if (isItemLike(props, displayName)) {
263
- const {
264
- children: itemChildren,
265
- ...itemProps
266
- } = props;
267
- result.push(import_react.default.createElement(menu.Item, {
268
- ...itemProps,
269
- key: child.key
270
- }, transformChildren(menu, map, itemChildren, false, triggerBoundaryHandlers, radioContext)));
271
- return;
272
- }
273
- result.push(child);
274
- });
275
- if (import_web.isIos && shouldReverseOnIos && !isContextMenu) {
276
- result.reverse();
277
- }
278
- return result;
279
- }
280
- function lazyAdapter(name, displayName) {
281
- const Comp = props => {
282
- const z = resolve();
283
- if (!z) return null;
284
- return import_react.default.createElement(z.menu[name], props);
285
- };
286
- Comp.displayName = displayName || name;
287
- return Comp;
288
- }
289
- const Trigger = lazyAdapter("Trigger");
290
- const Content = lazyAdapter("Content");
291
- const Item = lazyAdapter("Item");
292
- const ItemTitle = lazyAdapter("ItemTitle");
293
- const ItemSubtitle = lazyAdapter("ItemSubtitle");
294
- const ItemIcon = lazyAdapter("ItemIcon");
295
- const ItemImage = lazyAdapter("ItemImage");
296
- const ItemIndicator = lazyAdapter("ItemIndicator");
297
- const Group = lazyAdapter("Group");
298
- const Label = lazyAdapter("Label");
299
- const Separator = lazyAdapter("Separator");
300
- const Sub = lazyAdapter("Sub");
301
- const SubTrigger = lazyAdapter("SubTrigger");
302
- const SubContent = lazyAdapter("SubContent");
303
- const Portal = ({
304
- children
305
- }) => /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, {
306
- children
307
- });
308
- Portal.displayName = "Portal";
309
- const Arrow = () => null;
310
- Arrow.displayName = "Arrow";
311
- const RadioGroup = ({
312
- children
313
- }) => /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, {
314
- children
315
- });
316
- RadioGroup.displayName = `${MenuType}RadioGroup`;
317
- const RadioItem = ({
318
- children
319
- }) => /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, {
320
- children
321
- });
322
- RadioItem.displayName = `${MenuType}RadioItem`;
323
- const CheckboxItem = () => null;
324
- CheckboxItem.displayName = "CheckboxItem";
325
- const Preview = isContextMenu ? lazyAdapter("Preview", `${MenuType}Preview`) : () => null;
326
- Preview.displayName = `${MenuType}Preview`;
327
- const Auxiliary = isContextMenu ? lazyAdapter("Auxiliary", `${MenuType}Auxiliary`) : () => null;
328
- Auxiliary.displayName = `${MenuType}Auxiliary`;
329
- const Menu = ({
330
- children,
331
- onOpenChange,
332
- onOpenWillChange
333
- }) => {
334
- const triggerOwnerRef = import_react.default.useRef(null);
335
- const claimTriggerBoundary = import_react.default.useCallback(debugName => {
336
- if (triggerOwnerRef.current) {
337
- (0, import_native.unstable_releaseExternalPressOwnership)(triggerOwnerRef.current, debugName);
338
- }
339
- triggerOwnerRef.current = (0, import_native.unstable_claimExternalPressOwnership)(debugName);
340
- }, []);
341
- const releaseTriggerBoundary = import_react.default.useCallback(debugName => {
342
- if (!triggerOwnerRef.current) return;
343
- (0, import_native.unstable_releaseExternalPressOwnership)(triggerOwnerRef.current, debugName);
344
- triggerOwnerRef.current = null;
345
- }, []);
346
- import_react.default.useEffect(() => releaseTriggerBoundary, [releaseTriggerBoundary]);
347
- const z = resolve();
348
- if (!z) return null;
349
- const handleOpenChange = import_react.default.useCallback(isOpen => {
350
- if (!isOpen) {
351
- releaseTriggerBoundary();
352
- }
353
- onOpenChange?.(isOpen);
354
- }, [onOpenChange, releaseTriggerBoundary]);
355
- const handleOpenWillChange = import_react.default.useCallback(willOpen => {
356
- if (!willOpen) {
357
- releaseTriggerBoundary();
358
- }
359
- onOpenWillChange?.(willOpen);
360
- }, [onOpenWillChange, releaseTriggerBoundary]);
361
- const rootProps = {
362
- onOpenChange: handleOpenChange
363
- };
364
- if (isContextMenu && onOpenWillChange) {
365
- rootProps.onOpenWillChange = handleOpenWillChange;
366
- }
367
- const content = /* @__PURE__ */(0, import_jsx_runtime.jsx)(z.menu.Root, {
368
- ...rootProps,
369
- children: transformChildren(z.menu, z.componentMap, children, false, {
370
- claim: claimTriggerBoundary,
371
- release: releaseTriggerBoundary
372
- })
373
- });
374
- if (isAndroid) {
375
- return /* @__PURE__ */(0, import_jsx_runtime.jsx)(import_native.NativeMenuContext.Provider, {
376
- value: true,
377
- children: content
378
- });
379
- }
380
- return content;
381
- };
382
- Menu.displayName = MenuType;
383
- return {
384
- Menu: (0, import_web.withStaticProperties)(Menu, {
385
- Trigger,
386
- Content,
387
- Item,
388
- ItemTitle,
389
- ItemSubtitle,
390
- ItemIcon,
391
- ItemImage,
392
- ItemIndicator,
393
- Group,
394
- Label,
395
- Separator,
396
- Sub,
397
- SubTrigger,
398
- SubContent,
399
- CheckboxItem,
400
- Portal,
401
- RadioGroup,
402
- RadioItem,
403
- Arrow,
404
- Preview,
405
- Auxiliary
406
- })
407
- };
408
- };
117
+ const createNativeMenu = (MenuType) => {
118
+ if (import_web.isWeb) {
119
+ return createWebStubs();
120
+ }
121
+ const isContextMenu = MenuType === "ContextMenu";
122
+ const isAndroid = !import_web.isIos && !import_web.isWeb;
123
+ let resolved = null;
124
+ let warned = false;
125
+ function resolve() {
126
+ if (resolved) return resolved;
127
+ const adapter = (0, import_native.getNativeMenuAdapter)();
128
+ if (!adapter) {
129
+ if (!warned) {
130
+ warned = true;
131
+ console.warn(`Warning: Register a native menu adapter before rendering Tamagui native menus`);
132
+ }
133
+ return null;
134
+ }
135
+ const menu = isContextMenu ? adapter.ContextMenu : adapter.Menu;
136
+ resolved = {
137
+ menu,
138
+ componentMap: {
139
+ SubContent: menu.SubContent,
140
+ SubTrigger: menu.SubTrigger,
141
+ Content: menu.Content,
142
+ Sub: menu.Sub,
143
+ Group: menu.Group,
144
+ Item: menu.Item,
145
+ ItemTitle: menu.ItemTitle,
146
+ ItemSubtitle: menu.ItemSubtitle,
147
+ ItemIcon: menu.ItemIcon,
148
+ ItemImage: menu.ItemImage,
149
+ ItemIndicator: menu.ItemIndicator,
150
+ Label: menu.Label,
151
+ Separator: menu.Separator,
152
+ CheckboxItem: menu.CheckboxItem,
153
+ Preview: menu.Preview,
154
+ Auxiliary: menu.Auxiliary
155
+ }
156
+ };
157
+ return resolved;
158
+ }
159
+ function transformChildren(menu, map, children, shouldReverseOnIos = false, triggerBoundaryHandlers, radioContext) {
160
+ const result = [];
161
+ import_react.default.Children.forEach(children, (child) => {
162
+ if (!import_react.default.isValidElement(child)) {
163
+ result.push(child);
164
+ return;
165
+ }
166
+ const displayName = child.type?.displayName || "";
167
+ const props = child.props;
168
+ if (isPortalLike(displayName)) {
169
+ const inner = transformChildren(menu, map, props.children, false, triggerBoundaryHandlers, radioContext);
170
+ import_react.default.Children.forEach(inner, (c) => result.push(c));
171
+ return;
172
+ }
173
+ if (displayName.includes("ScrollView")) {
174
+ const inner = transformChildren(menu, map, props.children, false, triggerBoundaryHandlers, radioContext);
175
+ import_react.default.Children.forEach(inner, (c) => result.push(c));
176
+ return;
177
+ }
178
+ if (isTriggerLike(displayName)) {
179
+ const debugName = getTriggerDebugName(MenuType, props);
180
+ const claim = () => triggerBoundaryHandlers?.claim(debugName);
181
+ const release = () => triggerBoundaryHandlers?.release(debugName);
182
+ const { children: triggerChildren, ...triggerProps } = props;
183
+ result.push(import_react.default.createElement(menu.Trigger, {
184
+ ...triggerProps,
185
+ key: child.key,
186
+ onTouchStart: composeHandlers(claim, props.onTouchStart),
187
+ onTouchEnd: composeHandlers(props.onTouchEnd, release),
188
+ onTouchCancel: composeHandlers(props.onTouchCancel, release),
189
+ onResponderGrant: composeHandlers(claim, props.onResponderGrant),
190
+ onResponderRelease: composeHandlers(props.onResponderRelease, release),
191
+ onResponderTerminate: composeHandlers(props.onResponderTerminate, release),
192
+ onPressIn: composeHandlers(claim, props.onPressIn),
193
+ onPressOut: composeHandlers(props.onPressOut, release)
194
+ }, triggerChildren));
195
+ return;
196
+ }
197
+ if (displayName.includes("RadioGroup")) {
198
+ const { value: rgValue, onValueChange: rgOnValueChange, children: rgChildren, ...rest } = props;
199
+ result.push(import_react.default.createElement(menu.Group, {
200
+ ...rest,
201
+ key: child.key
202
+ }, transformChildren(menu, map, rgChildren, false, triggerBoundaryHandlers, {
203
+ value: rgValue,
204
+ onValueChange: rgOnValueChange
205
+ })));
206
+ return;
207
+ }
208
+ if (displayName.includes("RadioItem") && radioContext) {
209
+ const { value: itemValue, children: rChildren, ...rest } = props;
210
+ const cleanChildren = import_react.default.Children.map(rChildren, (c) => {
211
+ if (!import_react.default.isValidElement(c)) return c;
212
+ const dn = c.type?.displayName || "";
213
+ if (dn.includes("ItemIndicator")) return null;
214
+ return c;
215
+ });
216
+ result.push(import_react.default.createElement(menu.CheckboxItem, {
217
+ ...rest,
218
+ key: child.key,
219
+ value: itemValue === radioContext.value ? "on" : "off",
220
+ onValueChange: () => radioContext.onValueChange?.(itemValue)
221
+ }, transformChildren(menu, map, cleanChildren, false, triggerBoundaryHandlers, radioContext)));
222
+ return;
223
+ }
224
+ const componentType = getComponentType(displayName);
225
+ if (componentType === "CheckboxItem") {
226
+ const { checked, onCheckedChange, value, onValueChange, children: cbChildren, ...rest } = props;
227
+ const finalValue = value ?? (checked ? "on" : "off");
228
+ const finalOnValueChange = onValueChange ?? (onCheckedChange && ((v) => onCheckedChange(v === "on")));
229
+ const cleanChildren = import_react.default.Children.map(cbChildren, (c) => {
230
+ if (!import_react.default.isValidElement(c)) return c;
231
+ const dn = c.type?.displayName || "";
232
+ if (dn.includes("ItemIndicator")) return null;
233
+ return c;
234
+ });
235
+ result.push(import_react.default.createElement(menu.CheckboxItem, {
236
+ ...rest,
237
+ key: child.key,
238
+ value: finalValue,
239
+ onValueChange: finalOnValueChange
240
+ }, transformChildren(menu, map, cleanChildren, false, triggerBoundaryHandlers, radioContext)));
241
+ return;
242
+ }
243
+ if (componentType) {
244
+ const { children: childChildren, ...restProps } = props;
245
+ const AdapterComponent = map[componentType];
246
+ const isContainer = CONTAINER_TYPES.includes(componentType);
247
+ const shouldReverse = componentType === "Content" || componentType === "SubContent";
248
+ result.push(import_react.default.createElement(AdapterComponent, {
249
+ ...restProps,
250
+ key: child.key
251
+ }, isContainer ? transformChildren(menu, map, childChildren, shouldReverse, triggerBoundaryHandlers, radioContext) : childChildren));
252
+ return;
253
+ }
254
+ if (isItemLike(props, displayName)) {
255
+ const { children: itemChildren, ...itemProps } = props;
256
+ result.push(import_react.default.createElement(menu.Item, {
257
+ ...itemProps,
258
+ key: child.key
259
+ }, transformChildren(menu, map, itemChildren, false, triggerBoundaryHandlers, radioContext)));
260
+ return;
261
+ }
262
+ result.push(child);
263
+ });
264
+ if (import_web.isIos && shouldReverseOnIos && !isContextMenu) {
265
+ result.reverse();
266
+ }
267
+ return result;
268
+ }
269
+ function lazyAdapter(name, displayName) {
270
+ const Comp = (props) => {
271
+ const z = resolve();
272
+ if (!z) return null;
273
+ return import_react.default.createElement(z.menu[name], props);
274
+ };
275
+ Comp.displayName = displayName || name;
276
+ return Comp;
277
+ }
278
+ const Trigger = lazyAdapter("Trigger");
279
+ const Content = lazyAdapter("Content");
280
+ const Item = lazyAdapter("Item");
281
+ const ItemTitle = lazyAdapter("ItemTitle");
282
+ const ItemSubtitle = lazyAdapter("ItemSubtitle");
283
+ const ItemIcon = lazyAdapter("ItemIcon");
284
+ const ItemImage = lazyAdapter("ItemImage");
285
+ const ItemIndicator = lazyAdapter("ItemIndicator");
286
+ const Group = lazyAdapter("Group");
287
+ const Label = lazyAdapter("Label");
288
+ const Separator = lazyAdapter("Separator");
289
+ const Sub = lazyAdapter("Sub");
290
+ const SubTrigger = lazyAdapter("SubTrigger");
291
+ const SubContent = lazyAdapter("SubContent");
292
+ const Portal = ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children });
293
+ Portal.displayName = "Portal";
294
+ const Arrow = () => null;
295
+ Arrow.displayName = "Arrow";
296
+ const RadioGroup = ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children });
297
+ RadioGroup.displayName = `${MenuType}RadioGroup`;
298
+ const RadioItem = ({ children }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children });
299
+ RadioItem.displayName = `${MenuType}RadioItem`;
300
+ const CheckboxItem = () => null;
301
+ CheckboxItem.displayName = "CheckboxItem";
302
+ const Preview = isContextMenu ? lazyAdapter("Preview", `${MenuType}Preview`) : () => null;
303
+ Preview.displayName = `${MenuType}Preview`;
304
+ const Auxiliary = isContextMenu ? lazyAdapter("Auxiliary", `${MenuType}Auxiliary`) : () => null;
305
+ Auxiliary.displayName = `${MenuType}Auxiliary`;
306
+ const Menu = ({ children, onOpenChange, onOpenWillChange }) => {
307
+ const triggerOwnerRef = import_react.default.useRef(null);
308
+ const claimTriggerBoundary = import_react.default.useCallback((debugName) => {
309
+ if (triggerOwnerRef.current) {
310
+ (0, import_native.unstable_releaseExternalPressOwnership)(triggerOwnerRef.current, debugName);
311
+ }
312
+ triggerOwnerRef.current = (0, import_native.unstable_claimExternalPressOwnership)(debugName);
313
+ }, []);
314
+ const releaseTriggerBoundary = import_react.default.useCallback((debugName) => {
315
+ if (!triggerOwnerRef.current) return;
316
+ (0, import_native.unstable_releaseExternalPressOwnership)(triggerOwnerRef.current, debugName);
317
+ triggerOwnerRef.current = null;
318
+ }, []);
319
+ import_react.default.useEffect(() => releaseTriggerBoundary, [releaseTriggerBoundary]);
320
+ const z = resolve();
321
+ if (!z) return null;
322
+ const handleOpenChange = import_react.default.useCallback((isOpen) => {
323
+ if (!isOpen) {
324
+ releaseTriggerBoundary();
325
+ }
326
+ onOpenChange?.(isOpen);
327
+ }, [onOpenChange, releaseTriggerBoundary]);
328
+ const handleOpenWillChange = import_react.default.useCallback((willOpen) => {
329
+ if (!willOpen) {
330
+ releaseTriggerBoundary();
331
+ }
332
+ onOpenWillChange?.(willOpen);
333
+ }, [onOpenWillChange, releaseTriggerBoundary]);
334
+ const rootProps = { onOpenChange: handleOpenChange };
335
+ if (isContextMenu && onOpenWillChange) {
336
+ rootProps.onOpenWillChange = handleOpenWillChange;
337
+ }
338
+ const content = /* @__PURE__ */ (0, import_jsx_runtime.jsx)(z.menu.Root, {
339
+ ...rootProps,
340
+ children: transformChildren(z.menu, z.componentMap, children, false, {
341
+ claim: claimTriggerBoundary,
342
+ release: releaseTriggerBoundary
343
+ })
344
+ });
345
+ if (isAndroid) {
346
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_native.NativeMenuContext.Provider, {
347
+ value: true,
348
+ children: content
349
+ });
350
+ }
351
+ return content;
352
+ };
353
+ Menu.displayName = MenuType;
354
+ return { Menu: (0, import_web.withStaticProperties)(Menu, {
355
+ Trigger,
356
+ Content,
357
+ Item,
358
+ ItemTitle,
359
+ ItemSubtitle,
360
+ ItemIcon,
361
+ ItemImage,
362
+ ItemIndicator,
363
+ Group,
364
+ Label,
365
+ Separator,
366
+ Sub,
367
+ SubTrigger,
368
+ SubContent,
369
+ CheckboxItem,
370
+ Portal,
371
+ RadioGroup,
372
+ RadioItem,
373
+ Arrow,
374
+ Preview,
375
+ Auxiliary
376
+ }) };
377
+ };