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