@v-c/menu 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 (80) hide show
  1. package/LICENSE +21 -0
  2. package/dist/Divider.cjs +38 -0
  3. package/dist/Divider.d.ts +4 -0
  4. package/dist/Divider.js +38 -0
  5. package/dist/Icon.cjs +38 -0
  6. package/dist/Icon.d.ts +7 -0
  7. package/dist/Icon.js +38 -0
  8. package/dist/Menu.cjs +580 -0
  9. package/dist/Menu.d.ts +77 -0
  10. package/dist/Menu.js +580 -0
  11. package/dist/MenuItem.cjs +350 -0
  12. package/dist/MenuItem.d.ts +14 -0
  13. package/dist/MenuItem.js +350 -0
  14. package/dist/MenuItemGroup.cjs +120 -0
  15. package/dist/MenuItemGroup.d.ts +16 -0
  16. package/dist/MenuItemGroup.js +120 -0
  17. package/dist/SubMenu/InlineSubMenuList.cjs +84 -0
  18. package/dist/SubMenu/InlineSubMenuList.d.ts +7 -0
  19. package/dist/SubMenu/InlineSubMenuList.js +84 -0
  20. package/dist/SubMenu/PopupTrigger.cjs +168 -0
  21. package/dist/SubMenu/PopupTrigger.d.ts +16 -0
  22. package/dist/SubMenu/PopupTrigger.js +168 -0
  23. package/dist/SubMenu/SubMenuList.cjs +28 -0
  24. package/dist/SubMenu/SubMenuList.d.ts +2 -0
  25. package/dist/SubMenu/SubMenuList.js +28 -0
  26. package/dist/SubMenu/index.cjs +532 -0
  27. package/dist/SubMenu/index.d.ts +18 -0
  28. package/dist/SubMenu/index.js +532 -0
  29. package/dist/context/IdContext.cjs +33 -0
  30. package/dist/context/IdContext.d.ts +12 -0
  31. package/dist/context/IdContext.js +33 -0
  32. package/dist/context/MenuContext.cjs +184 -0
  33. package/dist/context/MenuContext.d.ts +42 -0
  34. package/dist/context/MenuContext.js +184 -0
  35. package/dist/context/PathContext.cjs +100 -0
  36. package/dist/context/PathContext.d.ts +33 -0
  37. package/dist/context/PathContext.js +100 -0
  38. package/dist/context/PrivateContext.cjs +24 -0
  39. package/dist/context/PrivateContext.d.ts +8 -0
  40. package/dist/context/PrivateContext.js +24 -0
  41. package/dist/hooks/useAccessibility.cjs +210 -0
  42. package/dist/hooks/useAccessibility.d.ts +12 -0
  43. package/dist/hooks/useAccessibility.js +210 -0
  44. package/dist/hooks/useActive.cjs +31 -0
  45. package/dist/hooks/useActive.d.ts +9 -0
  46. package/dist/hooks/useActive.js +31 -0
  47. package/dist/hooks/useDirectionStyle.cjs +20 -0
  48. package/dist/hooks/useDirectionStyle.d.ts +2 -0
  49. package/dist/hooks/useDirectionStyle.js +20 -0
  50. package/dist/hooks/useKeyRecords.cjs +93 -0
  51. package/dist/hooks/useKeyRecords.d.ts +10 -0
  52. package/dist/hooks/useKeyRecords.js +93 -0
  53. package/dist/hooks/useMemoCallback.cjs +12 -0
  54. package/dist/hooks/useMemoCallback.d.ts +4 -0
  55. package/dist/hooks/useMemoCallback.js +12 -0
  56. package/dist/index.cjs +21 -0
  57. package/dist/index.d.ts +19 -0
  58. package/dist/index.js +21 -0
  59. package/dist/interface.cjs +1 -0
  60. package/dist/interface.d.ts +94 -0
  61. package/dist/interface.js +1 -0
  62. package/dist/placements.cjs +77 -0
  63. package/dist/placements.d.ts +117 -0
  64. package/dist/placements.js +77 -0
  65. package/dist/utils/commonUtil.cjs +29 -0
  66. package/dist/utils/commonUtil.d.ts +1 -0
  67. package/dist/utils/commonUtil.js +29 -0
  68. package/dist/utils/motionUtil.cjs +12 -0
  69. package/dist/utils/motionUtil.d.ts +2 -0
  70. package/dist/utils/motionUtil.js +12 -0
  71. package/dist/utils/nodeUtil.cjs +82 -0
  72. package/dist/utils/nodeUtil.d.ts +3 -0
  73. package/dist/utils/nodeUtil.js +82 -0
  74. package/dist/utils/timeUtil.cjs +6 -0
  75. package/dist/utils/timeUtil.d.ts +1 -0
  76. package/dist/utils/timeUtil.js +6 -0
  77. package/dist/utils/warnUtil.cjs +16 -0
  78. package/dist/utils/warnUtil.d.ts +7 -0
  79. package/dist/utils/warnUtil.js +16 -0
  80. package/package.json +37 -0
package/dist/Menu.js ADDED
@@ -0,0 +1,580 @@
1
+ import { defineComponent, shallowRef, computed, ref, watch, onMounted, onUnmounted, createVNode, mergeProps, mergeDefaults, nextTick, isVNode } from "vue";
2
+ import Overflow from "@v-c/overflow";
3
+ import { classNames } from "@v-c/util";
4
+ import useId from "@v-c/util/dist/hooks/useId.ts";
5
+ import isEqual from "@v-c/util/dist/isEqual.ts";
6
+ import { filterEmpty } from "@v-c/util/dist/props-util";
7
+ import { useIdContextProvide } from "./context/IdContext.js";
8
+ import InheritableContextProvider, { useMenuContextProvider } from "./context/MenuContext.js";
9
+ import { PathUserProvider, MeasureProvider } from "./context/PathContext.js";
10
+ import { PrivateContextProvider } from "./context/PrivateContext.js";
11
+ import useAccessibility, { refreshElements, getFocusableElements } from "./hooks/useAccessibility.js";
12
+ import useKeyRecords, { OVERFLOW_KEY } from "./hooks/useKeyRecords.js";
13
+ import useMemoCallback from "./hooks/useMemoCallback.js";
14
+ import MenuItem from "./MenuItem.js";
15
+ import SubMenu from "./SubMenu/index.js";
16
+ import { parseItems } from "./utils/nodeUtil.js";
17
+ import { warnItemProp } from "./utils/warnUtil.js";
18
+ function _isSlot(s) {
19
+ return typeof s === "function" || Object.prototype.toString.call(s) === "[object Object]" && !isVNode(s);
20
+ }
21
+ const EMPTY_LIST = [];
22
+ const defaults = {
23
+ prefixCls: "vc-menu",
24
+ mode: "vertical",
25
+ subMenuOpenDelay: 0.1,
26
+ subMenuCloseDelay: 0.1,
27
+ selectable: true,
28
+ multiple: false,
29
+ inlineIndent: 24,
30
+ triggerSubMenuAction: "hover",
31
+ overflowedIndicator: "..."
32
+ };
33
+ const Menu = /* @__PURE__ */ defineComponent((props, {
34
+ slots,
35
+ expose,
36
+ attrs: _attrs
37
+ }) => {
38
+ const containerRef = shallowRef();
39
+ const uuid = useId(props?.id ? `rc-menu-uuid-${props.id}` : "rc-menu-uuid");
40
+ const isRtl = computed(() => props?.direction === "rtl");
41
+ const childList = shallowRef([]);
42
+ const mergedOverflowIndicator = computed(() => props.overflowedIndicator ?? defaults.overflowedIndicator);
43
+ const overflowIndicatorVersion = ref(0);
44
+ watch(mergedOverflowIndicator, () => {
45
+ overflowIndicatorVersion.value += 1;
46
+ }, {
47
+ immediate: true
48
+ });
49
+ useIdContextProvide(computed(() => uuid));
50
+ const innerOpenKeys = ref(props?.openKeys ?? props?.defaultOpenKeys);
51
+ watch(() => props.openKeys, () => {
52
+ innerOpenKeys.value = props?.openKeys;
53
+ });
54
+ const mergedOpenKeys = computed({
55
+ get() {
56
+ if (props.openKeys) {
57
+ return props.openKeys;
58
+ }
59
+ return innerOpenKeys.value ?? EMPTY_LIST;
60
+ },
61
+ set(value) {
62
+ innerOpenKeys.value = value;
63
+ }
64
+ });
65
+ const triggerOpenKeys = (keys, forceFlush = false) => {
66
+ function doUpdate() {
67
+ mergedOpenKeys.value = keys;
68
+ props?.onOpenChange?.(keys);
69
+ }
70
+ if (forceFlush) {
71
+ nextTick(doUpdate);
72
+ } else {
73
+ doUpdate();
74
+ }
75
+ };
76
+ const inlineCacheOpenKeys = shallowRef(mergedOpenKeys.value);
77
+ const mountRef = shallowRef(false);
78
+ const modeMerged = computed(() => {
79
+ const {
80
+ mode,
81
+ inlineCollapsed
82
+ } = props;
83
+ if ((mode === "inline" || mode === "vertical") && inlineCollapsed) {
84
+ return ["vertical", inlineCollapsed];
85
+ }
86
+ return [mode, false];
87
+ });
88
+ const mergedMode = computed(() => modeMerged.value[0]);
89
+ const mergedInlineCollapsed = computed(() => modeMerged.value[1]);
90
+ const isInlineMode = computed(() => mergedMode.value === "inline");
91
+ const internalMode = shallowRef(mergedMode.value);
92
+ const internalInlineCollapsed = shallowRef(mergedInlineCollapsed.value);
93
+ watch([mergedMode, mergedInlineCollapsed], () => {
94
+ internalMode.value = mergedMode.value;
95
+ internalInlineCollapsed.value = mergedInlineCollapsed.value;
96
+ if (!mountRef.value) {
97
+ return;
98
+ }
99
+ if (isInlineMode.value) {
100
+ mergedOpenKeys.value = inlineCacheOpenKeys.value;
101
+ } else {
102
+ triggerOpenKeys(EMPTY_LIST);
103
+ }
104
+ });
105
+ const lastVisibleIndex = shallowRef(0);
106
+ watch(mergedOpenKeys, () => {
107
+ if (isInlineMode.value) {
108
+ inlineCacheOpenKeys.value = mergedOpenKeys.value;
109
+ }
110
+ });
111
+ onMounted(() => {
112
+ mountRef.value = true;
113
+ });
114
+ onUnmounted(() => {
115
+ mountRef.value = false;
116
+ });
117
+ const {
118
+ registerPath,
119
+ unregisterPath,
120
+ refreshOverflowKeys,
121
+ isSubPathKey,
122
+ getKeyPath,
123
+ getKeys,
124
+ getSubPathKeys
125
+ } = useKeyRecords();
126
+ const registerPathContext = computed(() => ({
127
+ registerPath,
128
+ unregisterPath
129
+ }));
130
+ const pathUserContext = computed(() => ({
131
+ isSubPathKey
132
+ }));
133
+ const mergedActiveKey = shallowRef(props?.activeKey);
134
+ watch(() => props.activeKey, () => {
135
+ mergedActiveKey.value = props?.activeKey;
136
+ });
137
+ const onActive = useMemoCallback((key) => {
138
+ mergedActiveKey.value = key;
139
+ });
140
+ const onInactive = useMemoCallback(() => {
141
+ mergedActiveKey.value = void 0;
142
+ });
143
+ const innerSelectKeys = ref(props?.selectedKeys ?? props?.defaultSelectedKeys ?? EMPTY_LIST);
144
+ watch(() => props.selectedKeys, () => {
145
+ if (props.selectedKeys) {
146
+ innerSelectKeys.value = props.selectedKeys;
147
+ }
148
+ });
149
+ const mergedSelectKeys = computed(() => {
150
+ const keys = innerSelectKeys.value;
151
+ if (Array.isArray(keys)) {
152
+ return keys;
153
+ }
154
+ if (keys === null || keys === void 0) {
155
+ return EMPTY_LIST;
156
+ }
157
+ return [keys];
158
+ });
159
+ const triggerSelection = (info) => {
160
+ if (props.selectable) {
161
+ const {
162
+ key: targetKey
163
+ } = info;
164
+ const exist = mergedSelectKeys.value.includes(targetKey);
165
+ let newSelectKeys;
166
+ if (props.multiple) {
167
+ if (exist) {
168
+ newSelectKeys = mergedSelectKeys.value.filter((key) => key !== targetKey);
169
+ } else {
170
+ newSelectKeys = [...mergedSelectKeys.value, targetKey];
171
+ }
172
+ } else {
173
+ newSelectKeys = [targetKey];
174
+ }
175
+ innerSelectKeys.value = newSelectKeys;
176
+ const selectInfo = {
177
+ ...info,
178
+ selectedKeys: newSelectKeys
179
+ };
180
+ if (exist) {
181
+ props.onDeselect?.(selectInfo);
182
+ } else {
183
+ props.onSelect?.(selectInfo);
184
+ }
185
+ }
186
+ if (!props.multiple && mergedOpenKeys.value.length && internalMode.value !== "inline") {
187
+ triggerOpenKeys(EMPTY_LIST);
188
+ }
189
+ };
190
+ const onInternalClick = useMemoCallback((info) => {
191
+ props.onClick?.(warnItemProp(info));
192
+ triggerSelection(info);
193
+ });
194
+ const onInternalOpenChange = useMemoCallback((key, open) => {
195
+ let newOpenKeys = mergedOpenKeys.value.filter((k) => k !== key);
196
+ if (open) {
197
+ newOpenKeys.push(key);
198
+ } else if (internalMode.value !== "inline") {
199
+ const subPathKeys = getSubPathKeys(key);
200
+ newOpenKeys = newOpenKeys.filter((k) => !subPathKeys.has(k));
201
+ }
202
+ if (!isEqual(mergedOpenKeys.value, newOpenKeys, true)) {
203
+ triggerOpenKeys(newOpenKeys, true);
204
+ }
205
+ });
206
+ const triggerAccessibilityOpen = (key, open) => {
207
+ const nextOpen = open ?? !mergedOpenKeys.value.includes(key);
208
+ onInternalOpenChange(key, nextOpen);
209
+ };
210
+ const setMergedActiveKey = (key) => {
211
+ mergedActiveKey.value = key;
212
+ };
213
+ const onInternalKeyDown = useAccessibility(internalMode, mergedActiveKey, isRtl, uuid, containerRef, getKeys, getKeyPath, setMergedActiveKey, triggerAccessibilityOpen, (...args) => {
214
+ _attrs?.onKeydown?.(...args);
215
+ });
216
+ watch(() => [props.activeKey, () => props.defaultActiveFirst, childList.value], () => {
217
+ if (props.activeKey !== void 0) {
218
+ mergedActiveKey.value = props.activeKey;
219
+ } else if (props.defaultActiveFirst && childList.value[0]) {
220
+ mergedActiveKey.value = childList.value[0]?.key;
221
+ }
222
+ }, {
223
+ immediate: true
224
+ });
225
+ const allVisible = computed(() => lastVisibleIndex.value >= childList.value.length - 1 || internalMode.value !== "horizontal" || props?.disabledOverflow);
226
+ watch(allVisible, () => {
227
+ refreshOverflowKeys(allVisible.value ? EMPTY_LIST : childList.value.slice(lastVisibleIndex.value + 1).map((child) => child.key));
228
+ });
229
+ const privateContext = computed(() => ({
230
+ _internalRenderMenuItem: props._internalRenderMenuItem,
231
+ _internalRenderSubMenuItem: props._internalRenderSubMenuItem
232
+ }));
233
+ const menuContext = computed(() => {
234
+ return {
235
+ prefixCls: props.prefixCls || defaults.prefixCls,
236
+ rootClassName: props.rootClassName,
237
+ classNames: props.classNames,
238
+ styles: props.styles,
239
+ mode: internalMode.value,
240
+ openKeys: mergedOpenKeys.value,
241
+ rtl: isRtl.value,
242
+ // Disabled
243
+ disabled: props.disabled,
244
+ // Motion
245
+ motion: props.motion,
246
+ defaultMotions: props.defaultMotions,
247
+ // Active
248
+ activeKey: mergedActiveKey.value,
249
+ onActive,
250
+ onInactive,
251
+ // Selection
252
+ selectedKeys: mergedSelectKeys.value,
253
+ // Level
254
+ inlineIndent: props.inlineIndent || defaults.inlineIndent,
255
+ // Popup
256
+ subMenuOpenDelay: props.subMenuOpenDelay || defaults.subMenuOpenDelay,
257
+ subMenuCloseDelay: props.subMenuCloseDelay || defaults.subMenuCloseDelay,
258
+ forceSubMenuRender: props.forceSubMenuRender,
259
+ builtinPlacements: props.builtinPlacements,
260
+ triggerSubMenuAction: props.triggerSubMenuAction || defaults.triggerSubMenuAction,
261
+ getPopupContainer: props.getPopupContainer,
262
+ // Icon
263
+ itemIcon: props.itemIcon,
264
+ expandIcon: props.expandIcon,
265
+ // Events
266
+ onItemClick: onInternalClick,
267
+ onOpenChange: onInternalOpenChange,
268
+ popupRender: props.popupRender
269
+ };
270
+ });
271
+ useMenuContextProvider(menuContext);
272
+ expose({
273
+ list: containerRef,
274
+ focus: (options) => {
275
+ const keys = getKeys();
276
+ const {
277
+ elements,
278
+ key2element,
279
+ element2key
280
+ } = refreshElements(keys, uuid);
281
+ const focusableElements = getFocusableElements(containerRef.value, elements);
282
+ let shouldFocusKey;
283
+ if (mergedActiveKey.value && keys.includes(mergedActiveKey.value)) {
284
+ shouldFocusKey = mergedActiveKey.value;
285
+ } else {
286
+ shouldFocusKey = focusableElements[0] ? element2key.get(focusableElements[0]) : childList.value.find((node) => !node.props.disabled)?.key;
287
+ }
288
+ const elementToFocus = key2element.get(shouldFocusKey);
289
+ if (shouldFocusKey && elementToFocus) {
290
+ elementToFocus?.focus?.(options);
291
+ }
292
+ },
293
+ findItem: ({
294
+ key: itemKey
295
+ }) => {
296
+ const keys = getKeys();
297
+ const {
298
+ key2element
299
+ } = refreshElements(keys, uuid);
300
+ return key2element.get(itemKey) || null;
301
+ }
302
+ });
303
+ return () => {
304
+ const children = filterEmpty(slots.default?.());
305
+ const parsedChildList = parseItems(children, props?.items, EMPTY_LIST, props?._internalComponents || {}, props?.prefixCls || defaults.prefixCls);
306
+ const shouldUpdate = childList.value.length !== parsedChildList.length || !isEqual(childList.value.map((n) => n?.key), parsedChildList.map((n) => n?.key));
307
+ if (shouldUpdate) {
308
+ childList.value = parsedChildList;
309
+ }
310
+ const measureChildList = parseItems(children, props?.items, EMPTY_LIST, {}, props?.prefixCls || defaults.prefixCls);
311
+ const wrappedChildList = internalMode.value !== "horizontal" || props?.disabledOverflow ? childList.value : childList.value.map((child, index) => (
312
+ // Always wrap provider to avoid sub node re-mount
313
+ createVNode(InheritableContextProvider, {
314
+ "key": child.key,
315
+ "overflowDisabled": index > lastVisibleIndex.value,
316
+ "classNames": props.classNames,
317
+ "styles": props.styles
318
+ }, _isSlot(child) ? child : {
319
+ default: () => [child]
320
+ })
321
+ ));
322
+ const container = createVNode(Overflow, mergeProps({
323
+ "ref": containerRef,
324
+ "prefixCls": `${props.prefixCls || defaults.prefixCls}-overflow`,
325
+ "component": "ul",
326
+ "itemComponent": MenuItem,
327
+ "class": classNames(props.prefixCls || defaults.prefixCls, `${props.prefixCls || defaults.prefixCls}-root`, `${props.prefixCls || defaults.prefixCls}-${internalMode.value}`, _attrs.class || "", {
328
+ [`${props.prefixCls || defaults.prefixCls}-inline-collapsed`]: internalInlineCollapsed.value,
329
+ [`${props.prefixCls || defaults.prefixCls}-rtl`]: isRtl.value
330
+ }, props.rootClassName),
331
+ "style": _attrs.style,
332
+ "data": wrappedChildList,
333
+ "renderRawItem": (node) => {
334
+ return node;
335
+ },
336
+ "renderRawRest": (omitItems) => {
337
+ const len = omitItems.length;
338
+ const originOmitItems = len ? childList.value.slice(-len) : null;
339
+ return createVNode(SubMenu, {
340
+ "eventKey": OVERFLOW_KEY,
341
+ "title": mergedOverflowIndicator.value,
342
+ "disabled": allVisible.value,
343
+ "internalPopupClose": len === 0,
344
+ "popupClassName": props.overflowedIndicatorPopupClassName
345
+ }, _isSlot(originOmitItems) ? originOmitItems : {
346
+ default: () => [originOmitItems]
347
+ });
348
+ },
349
+ "maxCount": internalMode.value !== "horizontal" || props?.disabledOverflow ? Overflow.INVALIDATE : Overflow.RESPONSIVE,
350
+ "ssr": "full",
351
+ "data-menu-list": true,
352
+ "onVisibleChange": (newLastIndex) => {
353
+ lastVisibleIndex.value = newLastIndex;
354
+ }
355
+ }, {
356
+ onKeydown: onInternalKeyDown
357
+ }), null);
358
+ return createVNode(PrivateContextProvider, privateContext.value, {
359
+ default: () => [createVNode(PathUserProvider, pathUserContext.value, _isSlot(container) ? container : {
360
+ default: () => [container]
361
+ }), createVNode("div", {
362
+ "style": {
363
+ display: "none"
364
+ },
365
+ "aria-hidden": true
366
+ }, [createVNode(MeasureProvider, registerPathContext.value, _isSlot(measureChildList) ? measureChildList : {
367
+ default: () => [measureChildList]
368
+ })])]
369
+ });
370
+ };
371
+ }, {
372
+ props: /* @__PURE__ */ mergeDefaults({
373
+ prefixCls: {
374
+ type: String,
375
+ required: false,
376
+ default: void 0
377
+ },
378
+ rootClassName: {
379
+ type: String,
380
+ required: false,
381
+ default: void 0
382
+ },
383
+ classNames: {
384
+ type: Object,
385
+ required: false,
386
+ default: void 0
387
+ },
388
+ styles: {
389
+ type: Object,
390
+ required: false,
391
+ default: void 0
392
+ },
393
+ items: {
394
+ type: Array,
395
+ required: false,
396
+ default: void 0
397
+ },
398
+ disabled: {
399
+ type: Boolean,
400
+ required: false,
401
+ default: void 0
402
+ },
403
+ disabledOverflow: {
404
+ type: Boolean,
405
+ required: false,
406
+ default: void 0
407
+ },
408
+ direction: {
409
+ type: String,
410
+ required: false,
411
+ default: void 0
412
+ },
413
+ mode: {
414
+ type: String,
415
+ required: false,
416
+ default: void 0
417
+ },
418
+ inlineCollapsed: {
419
+ type: Boolean,
420
+ required: false,
421
+ default: void 0
422
+ },
423
+ defaultOpenKeys: {
424
+ type: Array,
425
+ required: false,
426
+ default: void 0
427
+ },
428
+ openKeys: {
429
+ type: Array,
430
+ required: false,
431
+ default: void 0
432
+ },
433
+ activeKey: {
434
+ type: String,
435
+ required: false,
436
+ default: void 0
437
+ },
438
+ defaultActiveFirst: {
439
+ type: Boolean,
440
+ required: false,
441
+ default: void 0
442
+ },
443
+ selectable: {
444
+ type: Boolean,
445
+ required: false,
446
+ default: void 0
447
+ },
448
+ multiple: {
449
+ type: Boolean,
450
+ required: false,
451
+ default: void 0
452
+ },
453
+ defaultSelectedKeys: {
454
+ type: Array,
455
+ required: false,
456
+ default: void 0
457
+ },
458
+ selectedKeys: {
459
+ type: Array,
460
+ required: false,
461
+ default: void 0
462
+ },
463
+ onSelect: {
464
+ type: Function,
465
+ required: false,
466
+ default: void 0
467
+ },
468
+ onDeselect: {
469
+ type: Function,
470
+ required: false,
471
+ default: void 0
472
+ },
473
+ inlineIndent: {
474
+ type: Number,
475
+ required: false,
476
+ default: void 0
477
+ },
478
+ motion: {
479
+ type: Object,
480
+ required: false,
481
+ default: void 0
482
+ },
483
+ defaultMotions: {
484
+ type: Object,
485
+ required: false,
486
+ default: void 0
487
+ },
488
+ subMenuOpenDelay: {
489
+ type: Number,
490
+ required: false,
491
+ default: void 0
492
+ },
493
+ subMenuCloseDelay: {
494
+ type: Number,
495
+ required: false,
496
+ default: void 0
497
+ },
498
+ forceSubMenuRender: {
499
+ type: Boolean,
500
+ required: false,
501
+ default: void 0
502
+ },
503
+ triggerSubMenuAction: {
504
+ type: String,
505
+ required: false,
506
+ default: void 0
507
+ },
508
+ builtinPlacements: {
509
+ type: Object,
510
+ required: false,
511
+ default: void 0
512
+ },
513
+ itemIcon: {
514
+ type: [String, Number, null, Array, Function, Boolean],
515
+ required: false,
516
+ skipCheck: true,
517
+ default: void 0
518
+ },
519
+ expandIcon: {
520
+ type: [String, Number, null, Array, Function, Boolean],
521
+ required: false,
522
+ skipCheck: true,
523
+ default: void 0
524
+ },
525
+ overflowedIndicator: {
526
+ type: null,
527
+ required: false,
528
+ default: void 0
529
+ },
530
+ overflowedIndicatorPopupClassName: {
531
+ type: String,
532
+ required: false,
533
+ default: void 0
534
+ },
535
+ getPopupContainer: {
536
+ type: Function,
537
+ required: false,
538
+ default: void 0
539
+ },
540
+ onClick: {
541
+ type: Function,
542
+ required: false,
543
+ default: void 0
544
+ },
545
+ onOpenChange: {
546
+ type: Function,
547
+ required: false,
548
+ default: void 0
549
+ },
550
+ _internalRenderMenuItem: {
551
+ type: Function,
552
+ required: false,
553
+ default: void 0
554
+ },
555
+ _internalRenderSubMenuItem: {
556
+ type: Function,
557
+ required: false,
558
+ default: void 0
559
+ },
560
+ _internalComponents: {
561
+ type: Object,
562
+ required: false,
563
+ default: void 0
564
+ },
565
+ popupRender: {
566
+ type: Function,
567
+ required: false,
568
+ default: void 0
569
+ },
570
+ id: {
571
+ type: String,
572
+ required: false,
573
+ default: void 0
574
+ }
575
+ }, defaults),
576
+ name: "VcMenu"
577
+ });
578
+ export {
579
+ Menu as default
580
+ };