@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
@@ -0,0 +1,532 @@
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 warning = require("@v-c/util/dist/warning");
7
+ const IdContext = require("../context/IdContext.cjs");
8
+ const MenuContext = require("../context/MenuContext.cjs");
9
+ const PathContext = require("../context/PathContext.cjs");
10
+ const PrivateContext = require("../context/PrivateContext.cjs");
11
+ const useActive = require("../hooks/useActive.cjs");
12
+ const useDirectionStyle = require("../hooks/useDirectionStyle.cjs");
13
+ const Icon = require("../Icon.cjs");
14
+ const commonUtil = require("../utils/commonUtil.cjs");
15
+ const InlineSubMenuList = require("./InlineSubMenuList.cjs");
16
+ const PopupTrigger = require("./PopupTrigger.cjs");
17
+ const SubMenuList = require("./SubMenuList.cjs");
18
+ function _isSlot(s) {
19
+ return typeof s === "function" || Object.prototype.toString.call(s) === "[object Object]" && !vue.isVNode(s);
20
+ }
21
+ const InternalSubMenu = /* @__PURE__ */ vue.defineComponent((props, {
22
+ slots,
23
+ attrs
24
+ }) => {
25
+ const eventKeyRef = vue.computed(() => props?.eventKey || "");
26
+ const domDataId = IdContext.useMenuId(eventKeyRef);
27
+ const menuContext = MenuContext.useMenuContext();
28
+ const {
29
+ _internalRenderSubMenuItem
30
+ } = PrivateContext.usePrivateContext();
31
+ const pathUserContext = PathContext.usePathUserContext();
32
+ const connectedPath = PathContext.useFullPath();
33
+ const validConnectedPath = vue.computed(() => connectedPath.value.filter((k) => k !== void 0));
34
+ const prefixCls = vue.computed(() => menuContext?.value?.prefixCls || "vc-menu");
35
+ const mode = vue.computed(() => menuContext?.value?.mode || "vertical");
36
+ const openKeys = vue.computed(() => menuContext?.value?.openKeys || []);
37
+ const contextDisabled = vue.computed(() => menuContext?.value?.disabled);
38
+ const overflowDisabled = vue.computed(() => menuContext?.value?.overflowDisabled);
39
+ const activeKey = vue.computed(() => menuContext?.value?.activeKey);
40
+ const selectedKeys = vue.computed(() => menuContext?.value?.selectedKeys || []);
41
+ const contextExpandIcon = vue.computed(() => menuContext?.value?.expandIcon);
42
+ const contextPopupRender = vue.computed(() => menuContext?.value?.popupRender);
43
+ const onOpenChange = (key, open2) => {
44
+ menuContext?.value?.onOpenChange?.(key, open2);
45
+ };
46
+ const onActive = (key) => {
47
+ menuContext?.value?.onActive?.(key);
48
+ };
49
+ const subMenuPrefixCls = vue.computed(() => `${prefixCls.value}-submenu`);
50
+ const mergedDisabled = vue.computed(() => !!(contextDisabled.value || props?.disabled));
51
+ if (process.env.NODE_ENV !== "production" && props?.warnKey) {
52
+ warning(false, "SubMenu should not leave undefined `key`.");
53
+ }
54
+ const mergedExpandIcon = vue.computed(() => props?.expandIcon ?? contextExpandIcon.value);
55
+ const originOpen = vue.computed(() => {
56
+ const key = props?.eventKey;
57
+ return key ? openKeys.value.includes(key) : false;
58
+ });
59
+ const open = vue.computed(() => !overflowDisabled.value && originOpen.value);
60
+ const childrenSelected = vue.computed(() => {
61
+ const key = props?.eventKey;
62
+ return key ? pathUserContext.isSubPathKey(selectedKeys.value, key) : false;
63
+ });
64
+ const eventKeyForActive = vue.computed(() => props?.eventKey || "");
65
+ const {
66
+ active,
67
+ ...activeProps
68
+ } = useActive.default(eventKeyForActive, mergedDisabled, (e) => props?.onTitleMouseEnter?.(e), (e) => props?.onTitleMouseLeave?.(e));
69
+ const childrenActive = vue.ref(false);
70
+ const triggerChildrenActive = (newActive) => {
71
+ if (!mergedDisabled.value) {
72
+ childrenActive.value = newActive;
73
+ }
74
+ };
75
+ const onInternalMouseEnter = (domEvent) => {
76
+ triggerChildrenActive(true);
77
+ props?.onMouseEnter?.({
78
+ key: props.eventKey,
79
+ domEvent
80
+ });
81
+ };
82
+ const onInternalMouseLeave = (domEvent) => {
83
+ triggerChildrenActive(false);
84
+ props?.onMouseLeave?.({
85
+ key: props.eventKey,
86
+ domEvent
87
+ });
88
+ };
89
+ const mergedActive = vue.computed(() => {
90
+ if (active.value) {
91
+ return active.value;
92
+ }
93
+ if (mode.value !== "inline") {
94
+ const key = props?.eventKey;
95
+ const currentActiveKey = activeKey.value;
96
+ return childrenActive.value || (key && currentActiveKey ? pathUserContext.isSubPathKey([currentActiveKey], key) : false);
97
+ }
98
+ return false;
99
+ });
100
+ const pathLength = vue.computed(() => connectedPath.value.length);
101
+ const directionStyle = useDirectionStyle.default(pathLength);
102
+ const onInternalTitleClick = (e) => {
103
+ if (mergedDisabled.value) {
104
+ return;
105
+ }
106
+ const key = props?.eventKey;
107
+ props?.onTitleClick?.({
108
+ key,
109
+ domEvent: e
110
+ });
111
+ if (mode.value === "inline" && key) {
112
+ onOpenChange(key, !originOpen.value);
113
+ }
114
+ };
115
+ const onPopupVisibleChange = (newVisible) => {
116
+ const key = props?.eventKey;
117
+ if (mode.value !== "inline" && key) {
118
+ onOpenChange(key, newVisible);
119
+ }
120
+ };
121
+ const onInternalFocus = () => {
122
+ const key = props?.eventKey;
123
+ if (key) {
124
+ onActive(key);
125
+ }
126
+ };
127
+ const triggerModeRef = vue.ref(mode.value);
128
+ vue.watch(mode, () => {
129
+ if (mode.value !== "inline" && validConnectedPath.value.length > 1) {
130
+ triggerModeRef.value = "vertical";
131
+ } else {
132
+ triggerModeRef.value = mode.value;
133
+ }
134
+ }, {
135
+ immediate: true
136
+ });
137
+ return () => {
138
+ const {
139
+ style,
140
+ title,
141
+ class: className,
142
+ popupClassName,
143
+ popupOffset,
144
+ popupStyle,
145
+ ...restProps
146
+ } = props;
147
+ const children = slots.default?.();
148
+ const popupId = domDataId.value && `${domDataId.value}-popup`;
149
+ const expandIconProps = {
150
+ isOpen: open.value,
151
+ isSelected: childrenSelected.value,
152
+ isSubMenu: true,
153
+ disabled: mergedDisabled.value
154
+ };
155
+ const expandIconNode = vue.createVNode(Icon.default, {
156
+ "icon": mode.value !== "horizontal" ? mergedExpandIcon.value : void 0,
157
+ "props": {
158
+ ...props,
159
+ ...expandIconProps
160
+ }
161
+ }, {
162
+ default: () => [vue.createVNode("i", {
163
+ "class": `${subMenuPrefixCls.value}-arrow`
164
+ }, null)]
165
+ });
166
+ let titleNode = vue.createVNode("div", vue.mergeProps({
167
+ "role": "menuitem",
168
+ "style": directionStyle.value,
169
+ "class": `${subMenuPrefixCls.value}-title`,
170
+ "tabindex": mergedDisabled.value ? void 0 : -1,
171
+ "title": typeof title === "string" ? title : void 0,
172
+ "data-menu-id": overflowDisabled.value && domDataId.value ? void 0 : domDataId.value,
173
+ "aria-expanded": open.value,
174
+ "aria-haspopup": true,
175
+ "aria-controls": popupId,
176
+ "aria-disabled": mergedDisabled.value,
177
+ "onClick": onInternalTitleClick,
178
+ "onFocus": onInternalFocus
179
+ }, activeProps), [title, expandIconNode]);
180
+ const popupContentTriggerMode = triggerModeRef.value;
181
+ const renderPopupContent = () => {
182
+ const originNode = vue.createVNode(MenuContext.default, {
183
+ "classNames": props.classNames,
184
+ "styles": props.styles,
185
+ "mode": popupContentTriggerMode === "horizontal" ? "vertical" : popupContentTriggerMode
186
+ }, {
187
+ default: () => [vue.createVNode(SubMenuList.default, {
188
+ "id": popupId
189
+ }, _isSlot(children) ? children : {
190
+ default: () => [children]
191
+ })]
192
+ });
193
+ const mergedPopupRender = props?.popupRender || contextPopupRender.value;
194
+ if (mergedPopupRender) {
195
+ return mergedPopupRender(originNode, {
196
+ item: props,
197
+ keys: validConnectedPath.value
198
+ });
199
+ }
200
+ return originNode;
201
+ };
202
+ if (!overflowDisabled.value) {
203
+ const triggerMode = triggerModeRef.value;
204
+ const _titleNode = /* @__PURE__ */ (function() {
205
+ return titleNode;
206
+ })();
207
+ titleNode = vue.createVNode(PopupTrigger.default, {
208
+ "mode": triggerMode,
209
+ "prefixCls": subMenuPrefixCls.value,
210
+ "visible": !props?.internalPopupClose && open.value && mode.value !== "inline",
211
+ "popupClassName": popupClassName,
212
+ "popupOffset": popupOffset,
213
+ "popupStyle": popupStyle,
214
+ "popup": renderPopupContent(),
215
+ "disabled": mergedDisabled.value,
216
+ "onVisibleChange": onPopupVisibleChange
217
+ }, _isSlot(titleNode) ? titleNode : {
218
+ default: () => [_titleNode]
219
+ });
220
+ }
221
+ let listNode = vue.createVNode(Overflow.Item, vue.mergeProps({
222
+ "role": "none"
223
+ }, attrs, restProps, {
224
+ "component": "li",
225
+ "style": style,
226
+ "class": util.classNames(subMenuPrefixCls.value, `${subMenuPrefixCls.value}-${mode.value}`, className, {
227
+ [`${subMenuPrefixCls.value}-open`]: open.value,
228
+ [`${subMenuPrefixCls.value}-active`]: mergedActive.value,
229
+ [`${subMenuPrefixCls.value}-selected`]: childrenSelected.value,
230
+ [`${subMenuPrefixCls.value}-disabled`]: mergedDisabled.value
231
+ }),
232
+ "onMouseenter": onInternalMouseEnter,
233
+ "onMouseleave": onInternalMouseLeave
234
+ }), {
235
+ default: () => [titleNode, !overflowDisabled.value && vue.createVNode(InlineSubMenuList.default, {
236
+ "id": popupId,
237
+ "open": open.value,
238
+ "keyPath": validConnectedPath.value
239
+ }, _isSlot(children) ? children : {
240
+ default: () => [children]
241
+ })]
242
+ });
243
+ if (_internalRenderSubMenuItem) {
244
+ listNode = _internalRenderSubMenuItem(listNode, props, {
245
+ selected: childrenSelected.value,
246
+ active: mergedActive.value,
247
+ open: open.value,
248
+ disabled: mergedDisabled.value
249
+ });
250
+ }
251
+ return listNode;
252
+ };
253
+ }, {
254
+ props: {
255
+ classNames: {
256
+ type: Object,
257
+ required: false,
258
+ default: void 0
259
+ },
260
+ styles: {
261
+ type: Object,
262
+ required: false,
263
+ default: void 0
264
+ },
265
+ title: {
266
+ type: null,
267
+ required: false,
268
+ default: void 0
269
+ },
270
+ internalPopupClose: {
271
+ type: Boolean,
272
+ required: false,
273
+ default: void 0
274
+ },
275
+ eventKey: {
276
+ type: String,
277
+ required: false,
278
+ default: void 0
279
+ },
280
+ warnKey: {
281
+ type: Boolean,
282
+ required: false,
283
+ default: void 0
284
+ },
285
+ popupRender: {
286
+ type: Function,
287
+ required: false,
288
+ default: void 0
289
+ },
290
+ type: {
291
+ type: String,
292
+ required: false,
293
+ default: void 0
294
+ },
295
+ disabled: {
296
+ type: Boolean,
297
+ required: false,
298
+ default: void 0
299
+ },
300
+ rootClassName: {
301
+ type: String,
302
+ required: false,
303
+ default: void 0
304
+ },
305
+ itemIcon: {
306
+ type: [String, Number, null, Array, Function, Boolean],
307
+ required: false,
308
+ skipCheck: true,
309
+ default: void 0
310
+ },
311
+ expandIcon: {
312
+ type: [String, Number, null, Array, Function, Boolean],
313
+ required: false,
314
+ skipCheck: true,
315
+ default: void 0
316
+ },
317
+ onMouseEnter: {
318
+ type: Function,
319
+ required: false,
320
+ default: void 0
321
+ },
322
+ onMouseLeave: {
323
+ type: Function,
324
+ required: false,
325
+ default: void 0
326
+ },
327
+ popupClassName: {
328
+ type: String,
329
+ required: false,
330
+ default: void 0
331
+ },
332
+ popupOffset: {
333
+ type: Array,
334
+ required: false,
335
+ default: void 0
336
+ },
337
+ popupStyle: {
338
+ type: null,
339
+ required: false,
340
+ default: void 0
341
+ },
342
+ onClick: {
343
+ type: Function,
344
+ required: false,
345
+ default: void 0
346
+ },
347
+ onTitleClick: {
348
+ type: Function,
349
+ required: false,
350
+ default: void 0
351
+ },
352
+ onTitleMouseEnter: {
353
+ type: Function,
354
+ required: false,
355
+ default: void 0
356
+ },
357
+ onTitleMouseLeave: {
358
+ type: Function,
359
+ required: false,
360
+ default: void 0
361
+ },
362
+ style: {
363
+ type: null,
364
+ required: false,
365
+ default: void 0
366
+ },
367
+ class: {
368
+ type: String,
369
+ required: false,
370
+ default: void 0
371
+ }
372
+ },
373
+ name: "InternalSubMenu",
374
+ inheritAttrs: false
375
+ });
376
+ const SubMenu = /* @__PURE__ */ vue.defineComponent((props, {
377
+ slots
378
+ }) => {
379
+ const eventKeyRef = vue.computed(() => props?.eventKey);
380
+ const connectedKeyPath = PathContext.useFullPath(eventKeyRef);
381
+ const measure = PathContext.useMeasure();
382
+ const validKeyPath = vue.computed(() => connectedKeyPath.value.filter((k) => k !== void 0));
383
+ vue.watch(
384
+ [validKeyPath, () => props.eventKey],
385
+ () => {
386
+ if (measure && props.eventKey) {
387
+ measure.registerPath(props.eventKey, validKeyPath.value);
388
+ }
389
+ }
390
+ // { immediate: true, flush: 'post' },
391
+ );
392
+ return () => {
393
+ const children = slots.default?.();
394
+ const childList = commonUtil.parseChildren(children, validKeyPath.value);
395
+ let renderNode;
396
+ if (measure) {
397
+ renderNode = childList;
398
+ } else {
399
+ renderNode = vue.createVNode(InternalSubMenu, props, _isSlot(childList) ? childList : {
400
+ default: () => [childList]
401
+ });
402
+ }
403
+ return vue.createVNode(PathContext.PathTrackerContext.Provider, {
404
+ "value": validKeyPath.value
405
+ }, _isSlot(renderNode) ? renderNode : {
406
+ default: () => [renderNode]
407
+ });
408
+ };
409
+ }, {
410
+ props: {
411
+ classNames: {
412
+ type: Object,
413
+ required: false,
414
+ default: void 0
415
+ },
416
+ styles: {
417
+ type: Object,
418
+ required: false,
419
+ default: void 0
420
+ },
421
+ title: {
422
+ type: null,
423
+ required: false,
424
+ default: void 0
425
+ },
426
+ internalPopupClose: {
427
+ type: Boolean,
428
+ required: false,
429
+ default: void 0
430
+ },
431
+ eventKey: {
432
+ type: String,
433
+ required: false,
434
+ default: void 0
435
+ },
436
+ warnKey: {
437
+ type: Boolean,
438
+ required: false,
439
+ default: void 0
440
+ },
441
+ popupRender: {
442
+ type: Function,
443
+ required: false,
444
+ default: void 0
445
+ },
446
+ type: {
447
+ type: String,
448
+ required: false,
449
+ default: void 0
450
+ },
451
+ disabled: {
452
+ type: Boolean,
453
+ required: false,
454
+ default: void 0
455
+ },
456
+ rootClassName: {
457
+ type: String,
458
+ required: false,
459
+ default: void 0
460
+ },
461
+ itemIcon: {
462
+ type: [String, Number, null, Array, Function, Boolean],
463
+ required: false,
464
+ skipCheck: true,
465
+ default: void 0
466
+ },
467
+ expandIcon: {
468
+ type: [String, Number, null, Array, Function, Boolean],
469
+ required: false,
470
+ skipCheck: true,
471
+ default: void 0
472
+ },
473
+ onMouseEnter: {
474
+ type: Function,
475
+ required: false,
476
+ default: void 0
477
+ },
478
+ onMouseLeave: {
479
+ type: Function,
480
+ required: false,
481
+ default: void 0
482
+ },
483
+ popupClassName: {
484
+ type: String,
485
+ required: false,
486
+ default: void 0
487
+ },
488
+ popupOffset: {
489
+ type: Array,
490
+ required: false,
491
+ default: void 0
492
+ },
493
+ popupStyle: {
494
+ type: null,
495
+ required: false,
496
+ default: void 0
497
+ },
498
+ onClick: {
499
+ type: Function,
500
+ required: false,
501
+ default: void 0
502
+ },
503
+ onTitleClick: {
504
+ type: Function,
505
+ required: false,
506
+ default: void 0
507
+ },
508
+ onTitleMouseEnter: {
509
+ type: Function,
510
+ required: false,
511
+ default: void 0
512
+ },
513
+ onTitleMouseLeave: {
514
+ type: Function,
515
+ required: false,
516
+ default: void 0
517
+ },
518
+ style: {
519
+ type: null,
520
+ required: false,
521
+ default: void 0
522
+ },
523
+ class: {
524
+ type: String,
525
+ required: false,
526
+ default: void 0
527
+ }
528
+ },
529
+ name: "SubMenu",
530
+ inheritAttrs: false
531
+ });
532
+ exports.default = SubMenu;
@@ -0,0 +1,18 @@
1
+ import { VueNode } from '@v-c/util/dist/type';
2
+ import { CSSProperties } from 'vue';
3
+ import { PopupRender, SubMenuType } from '../interface';
4
+ export type SemanticName = 'list' | 'listTitle';
5
+ export interface SubMenuProps extends Omit<SubMenuType, 'key' | 'children' | 'label'> {
6
+ classNames?: Partial<Record<SemanticName, string>>;
7
+ styles?: Partial<Record<SemanticName, CSSProperties>>;
8
+ title?: VueNode;
9
+ /** @private Used for rest popup. Do not use in your prod */
10
+ internalPopupClose?: boolean;
11
+ /** @private Internal filled key. Do not set it directly */
12
+ eventKey?: string;
13
+ /** @private Do not use. Private warning empty usage */
14
+ warnKey?: boolean;
15
+ popupRender?: PopupRender;
16
+ }
17
+ declare const SubMenu: import('vue').DefineSetupFnComponent<SubMenuProps, {}, {}, SubMenuProps & {}, import('vue').PublicProps>;
18
+ export default SubMenu;