@hanzogui/context-menu 8.3.0 → 8.3.2

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