@tamagui/context-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 (61) hide show
  1. package/dist/cjs/ContextMenu.cjs +182 -0
  2. package/dist/cjs/ContextMenu.js +145 -0
  3. package/dist/cjs/ContextMenu.js.map +6 -0
  4. package/dist/cjs/ContextMenu.native.js +191 -0
  5. package/dist/cjs/ContextMenu.native.js.map +1 -0
  6. package/dist/cjs/createNonNativeContextMenu.cjs +394 -0
  7. package/dist/cjs/createNonNativeContextMenu.js +318 -0
  8. package/dist/cjs/createNonNativeContextMenu.js.map +6 -0
  9. package/dist/cjs/createNonNativeContextMenu.native.js +420 -0
  10. package/dist/cjs/createNonNativeContextMenu.native.js.map +1 -0
  11. package/dist/cjs/index.cjs +39 -0
  12. package/dist/cjs/index.js +32 -0
  13. package/dist/cjs/index.js.map +6 -0
  14. package/dist/cjs/index.native.js +42 -0
  15. package/dist/cjs/index.native.js.map +1 -0
  16. package/dist/esm/ContextMenu.js +127 -0
  17. package/dist/esm/ContextMenu.js.map +6 -0
  18. package/dist/esm/ContextMenu.mjs +148 -0
  19. package/dist/esm/ContextMenu.mjs.map +1 -0
  20. package/dist/esm/ContextMenu.native.js +154 -0
  21. package/dist/esm/ContextMenu.native.js.map +1 -0
  22. package/dist/esm/createNonNativeContextMenu.js +307 -0
  23. package/dist/esm/createNonNativeContextMenu.js.map +6 -0
  24. package/dist/esm/createNonNativeContextMenu.mjs +359 -0
  25. package/dist/esm/createNonNativeContextMenu.mjs.map +1 -0
  26. package/dist/esm/createNonNativeContextMenu.native.js +382 -0
  27. package/dist/esm/createNonNativeContextMenu.native.js.map +1 -0
  28. package/dist/esm/index.js +18 -0
  29. package/dist/esm/index.js.map +6 -0
  30. package/dist/esm/index.mjs +16 -0
  31. package/dist/esm/index.mjs.map +1 -0
  32. package/dist/esm/index.native.js +16 -0
  33. package/dist/esm/index.native.js.map +1 -0
  34. package/dist/jsx/ContextMenu.js +127 -0
  35. package/dist/jsx/ContextMenu.js.map +6 -0
  36. package/dist/jsx/ContextMenu.mjs +148 -0
  37. package/dist/jsx/ContextMenu.mjs.map +1 -0
  38. package/dist/jsx/ContextMenu.native.js +191 -0
  39. package/dist/jsx/ContextMenu.native.js.map +1 -0
  40. package/dist/jsx/createNonNativeContextMenu.js +307 -0
  41. package/dist/jsx/createNonNativeContextMenu.js.map +6 -0
  42. package/dist/jsx/createNonNativeContextMenu.mjs +359 -0
  43. package/dist/jsx/createNonNativeContextMenu.mjs.map +1 -0
  44. package/dist/jsx/createNonNativeContextMenu.native.js +420 -0
  45. package/dist/jsx/createNonNativeContextMenu.native.js.map +1 -0
  46. package/dist/jsx/index.js +18 -0
  47. package/dist/jsx/index.js.map +6 -0
  48. package/dist/jsx/index.mjs +16 -0
  49. package/dist/jsx/index.mjs.map +1 -0
  50. package/dist/jsx/index.native.js +42 -0
  51. package/dist/jsx/index.native.js.map +1 -0
  52. package/package.json +56 -0
  53. package/src/ContextMenu.tsx +187 -0
  54. package/src/createNonNativeContextMenu.tsx +607 -0
  55. package/src/index.tsx +17 -0
  56. package/types/ContextMenu.d.ts +98 -0
  57. package/types/ContextMenu.d.ts.map +1 -0
  58. package/types/createNonNativeContextMenu.d.ts +123 -0
  59. package/types/createNonNativeContextMenu.d.ts.map +1 -0
  60. package/types/index.d.ts +96 -0
  61. package/types/index.d.ts.map +1 -0
@@ -0,0 +1,394 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf,
6
+ __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all) __defProp(target, name, {
9
+ get: all[name],
10
+ enumerable: !0
11
+ });
12
+ },
13
+ __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from == "object" || typeof from == "function") for (let key of __getOwnPropNames(from)) !__hasOwnProp.call(to, key) && key !== except && __defProp(to, key, {
15
+ get: () => from[key],
16
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
17
+ });
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
26
+ value: mod,
27
+ enumerable: !0
28
+ }) : target, mod)),
29
+ __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
30
+ value: !0
31
+ }), mod);
32
+ var createNonNativeContextMenu_exports = {};
33
+ __export(createNonNativeContextMenu_exports, {
34
+ CONTEXTMENU_CONTEXT: () => CONTEXTMENU_CONTEXT,
35
+ createNonNativeContextMenu: () => createNonNativeContextMenu
36
+ });
37
+ module.exports = __toCommonJS(createNonNativeContextMenu_exports);
38
+ var import_create_menu = require("@tamagui/create-menu"),
39
+ import_use_controllable_state = require("@tamagui/use-controllable-state"),
40
+ import_web = require("@tamagui/web"),
41
+ import_react = __toESM(require("react")),
42
+ import_jsx_runtime = require("react/jsx-runtime");
43
+ const CONTEXTMENU_CONTEXT = "ContextMenuContext";
44
+ function createNonNativeContextMenu(params) {
45
+ const {
46
+ Menu
47
+ } = (0, import_create_menu.createBaseMenu)(params),
48
+ CONTEXT_MENU_NAME = "ContextMenu",
49
+ {
50
+ Provider: ContextMenuProvider,
51
+ useStyledContext: useContextMenuContext
52
+ } = (0, import_web.createStyledContext)(),
53
+ ContextMenuComp = props => {
54
+ const {
55
+ scope,
56
+ children,
57
+ onOpenChange,
58
+ dir,
59
+ modal = !0,
60
+ ...rest
61
+ } = props,
62
+ [open, setOpen] = import_react.default.useState(!1),
63
+ triggerRef = import_react.default.useRef(null),
64
+ handleOpenChange = import_react.default.useCallback(open2 => {
65
+ setOpen(open2), onOpenChange?.(open2);
66
+ }, [onOpenChange]);
67
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(ContextMenuProvider, {
68
+ scope,
69
+ triggerId: (0, import_react.useId)(),
70
+ triggerRef,
71
+ contentId: (0, import_react.useId)(),
72
+ open,
73
+ onOpenChange: handleOpenChange,
74
+ modal,
75
+ children: /* @__PURE__ */(0, import_jsx_runtime.jsx)(Menu, {
76
+ scope: scope || CONTEXTMENU_CONTEXT,
77
+ dir,
78
+ open,
79
+ onOpenChange: handleOpenChange,
80
+ modal,
81
+ ...rest,
82
+ children
83
+ })
84
+ });
85
+ };
86
+ ContextMenuComp.displayName = CONTEXT_MENU_NAME;
87
+ const TRIGGER_NAME = "ContextMenuTrigger",
88
+ ContextMenuTrigger = import_web.View.styleable((props, forwardedRef) => {
89
+ const {
90
+ scope,
91
+ style,
92
+ disabled = !1,
93
+ asChild,
94
+ children,
95
+ ...triggerProps
96
+ } = props,
97
+ context = useContextMenuContext(scope),
98
+ pointRef = import_react.default.useRef({
99
+ x: 0,
100
+ y: 0
101
+ }),
102
+ virtualRef = import_react.default.useMemo(() => ({
103
+ current: {
104
+ getBoundingClientRect: () => import_web.isWeb ? DOMRect.fromRect({
105
+ width: 0,
106
+ height: 0,
107
+ ...pointRef.current
108
+ }) : {
109
+ width: 0,
110
+ height: 0,
111
+ top: 0,
112
+ left: 0,
113
+ ...pointRef.current
114
+ },
115
+ ...(!import_web.isWeb && {
116
+ measure: c => c(pointRef.current.x, pointRef.current.y, 0, 0),
117
+ measureInWindow: c => c(pointRef.current.x, pointRef.current.y, 0, 0)
118
+ })
119
+ }
120
+ }), [pointRef.current.x, pointRef.current.y]),
121
+ longPressTimerRef = import_react.default.useRef(0),
122
+ clearLongPress = import_react.default.useCallback(() => window.clearTimeout(longPressTimerRef.current), []),
123
+ handleOpen = event => {
124
+ import_web.isWeb && (event instanceof MouseEvent || event instanceof PointerEvent) ? pointRef.current = {
125
+ x: event.clientX,
126
+ y: event.clientY
127
+ } : pointRef.current = {
128
+ x: event.nativeEvent.pageX,
129
+ y: event.nativeEvent.pageY
130
+ }, context.onOpenChange(!0);
131
+ };
132
+ import_react.default.useEffect(() => clearLongPress, [clearLongPress]), import_react.default.useEffect(() => void (disabled && clearLongPress()), [disabled, clearLongPress]);
133
+ const Comp = asChild ? import_web.Slot : import_web.View;
134
+ return /* @__PURE__ */(0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, {
135
+ children: [/* @__PURE__ */(0, import_jsx_runtime.jsx)(Menu.Anchor, {
136
+ scope: scope || CONTEXTMENU_CONTEXT,
137
+ virtualRef
138
+ }), /* @__PURE__ */(0, import_jsx_runtime.jsx)(Comp, {
139
+ tag: "span",
140
+ componentName: TRIGGER_NAME,
141
+ id: context.triggerId,
142
+ "data-state": context.open ? "open" : "closed",
143
+ "data-disabled": disabled ? "" : void 0,
144
+ ...triggerProps,
145
+ ref: (0, import_web.composeRefs)(forwardedRef, context.triggerRef),
146
+ style: import_web.isWeb ? {
147
+ WebkitTouchCallout: "none",
148
+ ...style
149
+ } : null,
150
+ ...(import_web.isWeb && {
151
+ onContextMenu: disabled ? props.onContextMenu : (0, import_web.composeEventHandlers)(props.onContextMenu, event => {
152
+ clearLongPress(), handleOpen(event), event.preventDefault();
153
+ }),
154
+ onPointerDown: disabled ? props.onPointerDown : (0, import_web.composeEventHandlers)(props.onPointerDown, event => {
155
+ event.pointerType !== "mouse" && (clearLongPress(), longPressTimerRef.current = window.setTimeout(() => handleOpen(event), 700));
156
+ }),
157
+ onPointerMove: disabled ? props.onPointerMove : (0, import_web.composeEventHandlers)(props.onPointerMove, event => {
158
+ event.pointerType !== "mouse" && clearLongPress();
159
+ }),
160
+ onPointerCancel: disabled ? props.onPointerCancel : (0, import_web.composeEventHandlers)(props.onPointerCancel, event => {
161
+ event.pointerType !== "mouse" && clearLongPress();
162
+ }),
163
+ onPointerUp: disabled ? props.onPointerUp : (0, import_web.composeEventHandlers)(props.onPointerUp, event => {
164
+ event.pointerType !== "mouse" && clearLongPress();
165
+ })
166
+ }),
167
+ ...(!import_web.isWeb && {
168
+ onLongPress: disabled ? props.onLongPress : (0, import_web.composeEventHandlers)(props.onLongPress, event => {
169
+ clearLongPress(), handleOpen(event), event.preventDefault();
170
+ })
171
+ }),
172
+ children
173
+ })]
174
+ });
175
+ });
176
+ ContextMenuTrigger.displayName = TRIGGER_NAME;
177
+ const PORTAL_NAME = "ContextMenuPortal",
178
+ ContextMenuPortal = props => {
179
+ const {
180
+ scope,
181
+ children,
182
+ ...portalProps
183
+ } = props,
184
+ context = import_web.isAndroid ? useContextMenuContext(scope) : null,
185
+ content = import_web.isAndroid ? /* @__PURE__ */(0, import_jsx_runtime.jsx)(ContextMenuProvider, {
186
+ ...context,
187
+ children
188
+ }) : children;
189
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(Menu.Portal, {
190
+ scope: scope || CONTEXTMENU_CONTEXT,
191
+ ...portalProps,
192
+ children: content
193
+ });
194
+ };
195
+ ContextMenuPortal.displayName = PORTAL_NAME;
196
+ const CONTENT_NAME = "ContextMenuContent",
197
+ ContextMenuContent = import_react.default.forwardRef((props, forwardedRef) => {
198
+ const {
199
+ scope,
200
+ ...contentProps
201
+ } = props,
202
+ context = useContextMenuContext(scope),
203
+ hasInteractedOutsideRef = import_react.default.useRef(!1);
204
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(Menu.Content, {
205
+ id: context.contentId,
206
+ "aria-labelledby": context.triggerId,
207
+ scope: scope || CONTEXTMENU_CONTEXT,
208
+ ...contentProps,
209
+ ref: forwardedRef,
210
+ onCloseAutoFocus: (0, import_web.composeEventHandlers)(props.onCloseAutoFocus, event => {
211
+ hasInteractedOutsideRef.current || context.triggerRef.current?.focus(), hasInteractedOutsideRef.current = !1, event.preventDefault();
212
+ }),
213
+ onInteractOutside: (0, import_web.composeEventHandlers)(props.onInteractOutside, event => {
214
+ const originalEvent = event.detail.originalEvent,
215
+ ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === !0,
216
+ isRightClick = originalEvent.button === 2 || ctrlLeftClick;
217
+ (!context.modal || isRightClick) && (hasInteractedOutsideRef.current = !0);
218
+ })
219
+ });
220
+ });
221
+ ContextMenuContent.displayName = CONTENT_NAME;
222
+ const ITEM_NAME = "ContextMenuItem",
223
+ ContextMenuItem = import_react.default.forwardRef((props, forwardedRef) => {
224
+ const {
225
+ scope,
226
+ ...itemProps
227
+ } = props;
228
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(Menu.Item, {
229
+ componentName: ITEM_NAME,
230
+ scope: scope || CONTEXTMENU_CONTEXT,
231
+ ...itemProps,
232
+ ref: forwardedRef
233
+ });
234
+ });
235
+ ContextMenuItem.displayName = ITEM_NAME;
236
+ const CHECKBOX_ITEM_NAME = "ContextMenuCheckboxItem",
237
+ ContextMenuCheckboxItem = import_react.default.forwardRef((props, forwardedRef) => {
238
+ const {
239
+ scope,
240
+ ...checkboxItemProps
241
+ } = props;
242
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(Menu.CheckboxItem, {
243
+ componentName: CHECKBOX_ITEM_NAME,
244
+ scope: scope || CONTEXTMENU_CONTEXT,
245
+ ...checkboxItemProps,
246
+ ref: forwardedRef
247
+ });
248
+ });
249
+ ContextMenuCheckboxItem.displayName = CHECKBOX_ITEM_NAME;
250
+ const RADIO_GROUP_NAME = "ContextMenuRadioGroup",
251
+ ContextMenuRadioGroup = import_react.default.forwardRef((props, forwardedRef) => {
252
+ const {
253
+ scope,
254
+ ...radioGroupProps
255
+ } = props;
256
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(Menu.RadioGroup, {
257
+ scope: scope || CONTEXTMENU_CONTEXT,
258
+ ...radioGroupProps,
259
+ ref: forwardedRef
260
+ });
261
+ });
262
+ ContextMenuRadioGroup.displayName = RADIO_GROUP_NAME;
263
+ const RADIO_ITEM_NAME = "ContextMenuRadioItem",
264
+ ContextMenuRadioItem = import_react.default.forwardRef((props, forwardedRef) => {
265
+ const {
266
+ scope,
267
+ ...radioItemProps
268
+ } = props;
269
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(Menu.RadioItem, {
270
+ componentName: RADIO_ITEM_NAME,
271
+ scope: scope || CONTEXTMENU_CONTEXT,
272
+ ...radioItemProps,
273
+ ref: forwardedRef
274
+ });
275
+ });
276
+ ContextMenuRadioItem.displayName = RADIO_ITEM_NAME;
277
+ const INDICATOR_NAME = "ContextMenuItemIndicator",
278
+ ContextMenuItemIndicator = Menu.ItemIndicator.styleable((props, forwardedRef) => {
279
+ const {
280
+ scope,
281
+ ...itemIndicatorProps
282
+ } = props;
283
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(Menu.ItemIndicator, {
284
+ componentName: INDICATOR_NAME,
285
+ scope: scope || CONTEXTMENU_CONTEXT,
286
+ ...itemIndicatorProps,
287
+ ref: forwardedRef
288
+ });
289
+ });
290
+ ContextMenuItemIndicator.displayName = INDICATOR_NAME;
291
+ const SUB_NAME = "ContextMenuSub",
292
+ ContextMenuSub = props => {
293
+ const {
294
+ scope,
295
+ children,
296
+ onOpenChange,
297
+ open: openProp,
298
+ defaultOpen,
299
+ ...rest
300
+ } = props,
301
+ [open, setOpen] = (0, import_use_controllable_state.useControllableState)({
302
+ prop: openProp,
303
+ defaultProp: defaultOpen,
304
+ onChange: onOpenChange
305
+ });
306
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(Menu.Sub, {
307
+ scope: scope || CONTEXTMENU_CONTEXT,
308
+ open,
309
+ onOpenChange: setOpen,
310
+ ...rest,
311
+ children
312
+ });
313
+ };
314
+ ContextMenuSub.displayName = SUB_NAME;
315
+ const SUB_TRIGGER_NAME = "ContextMenuSubTrigger",
316
+ ContextMenuSubTrigger = import_web.View.styleable((props, forwardedRef) => {
317
+ const {
318
+ scope,
319
+ ...subTriggerProps
320
+ } = props;
321
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(Menu.SubTrigger, {
322
+ componentName: SUB_TRIGGER_NAME,
323
+ scope: scope || CONTEXTMENU_CONTEXT,
324
+ ...subTriggerProps,
325
+ ref: forwardedRef
326
+ });
327
+ });
328
+ ContextMenuSubTrigger.displayName = SUB_TRIGGER_NAME;
329
+ const SUB_CONTENT_NAME = "ContextMenuSubContent",
330
+ ContextMenuSubContent = import_react.default.forwardRef((props, forwardedRef) => {
331
+ const {
332
+ scope,
333
+ ...subContentProps
334
+ } = props;
335
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(Menu.SubContent, {
336
+ scope: scope || CONTEXTMENU_CONTEXT,
337
+ ...subContentProps,
338
+ ref: forwardedRef,
339
+ style: import_web.isWeb ? {
340
+ ...props.style,
341
+ "--tamagui-context-menu-content-transform-origin": "var(--tamagui-popper-transform-origin)",
342
+ "--tamagui-context-menu-content-available-width": "var(--tamagui-popper-available-width)",
343
+ "--tamagui-context-menu-content-available-height": "var(--tamagui-popper-available-height)",
344
+ "--tamagui-context-menu-trigger-width": "var(--tamagui-popper-anchor-width)",
345
+ "--tamagui-context-menu-trigger-height": "var(--tamagui-popper-anchor-height)"
346
+ } : null
347
+ });
348
+ });
349
+ ContextMenuSubContent.displayName = SUB_CONTENT_NAME;
350
+ const ARROW_NAME = "ContextMenuArrow",
351
+ ContextMenuArrow = import_react.default.forwardRef((props, forwardedRef) => {
352
+ const {
353
+ scope,
354
+ ...arrowProps
355
+ } = props;
356
+ return /* @__PURE__ */(0, import_jsx_runtime.jsx)(Menu.Arrow, {
357
+ componentName: ARROW_NAME,
358
+ scope: scope || CONTEXTMENU_CONTEXT,
359
+ ...arrowProps,
360
+ ref: forwardedRef
361
+ });
362
+ });
363
+ ContextMenuArrow.displayName = ARROW_NAME;
364
+ const ContextMenuGroup = Menu.Group,
365
+ ContextMenuLabel = Menu.Label,
366
+ ContextMenuSeparator = Menu.Separator,
367
+ ContextMenuItemTitle = Menu.ItemTitle,
368
+ ContextMenuItemSubTitle = Menu.ItemSubtitle,
369
+ ContextMenuItemImage = Menu.ItemImage,
370
+ ContextMenuItemIcon = Menu.ItemIcon;
371
+ return (0, import_web.withStaticProperties)(ContextMenuComp, {
372
+ Root: ContextMenuComp,
373
+ Trigger: ContextMenuTrigger,
374
+ Portal: ContextMenuPortal,
375
+ Content: ContextMenuContent,
376
+ Group: ContextMenuGroup,
377
+ Label: ContextMenuLabel,
378
+ Item: ContextMenuItem,
379
+ CheckboxItem: ContextMenuCheckboxItem,
380
+ RadioGroup: ContextMenuRadioGroup,
381
+ RadioItem: ContextMenuRadioItem,
382
+ ItemIndicator: ContextMenuItemIndicator,
383
+ Separator: ContextMenuSeparator,
384
+ Arrow: ContextMenuArrow,
385
+ Sub: ContextMenuSub,
386
+ SubTrigger: ContextMenuSubTrigger,
387
+ SubContent: ContextMenuSubContent,
388
+ ItemTitle: ContextMenuItemTitle,
389
+ ItemSubtitle: ContextMenuItemSubTitle,
390
+ ItemIcon: ContextMenuItemIcon,
391
+ ItemImage: ContextMenuItemImage,
392
+ Preview: () => null
393
+ });
394
+ }