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