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