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