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