@v-c/menu 1.0.7 → 1.0.8

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