@v-c/menu 0.0.1 → 0.0.3

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