@robot-admin/naive-ui-components 0.4.3 → 0.4.4
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/C_ActionBar.cjs +1 -5
- package/dist/C_ActionBar.js +1 -4
- package/dist/C_ActionBar.js.map +1 -0
- package/dist/C_ActionBar2.js +1 -195
- package/dist/C_ActionBar2.js.map +1 -1
- package/dist/C_AntV.cjs +1 -8
- package/dist/C_AntV.js +1 -4
- package/dist/C_AntV.js.map +1 -0
- package/dist/C_AntV2.js +4 -3149
- package/dist/C_AntV2.js.map +1 -1
- package/dist/C_Barcode.cjs +1 -4
- package/dist/C_Barcode.js +1 -3
- package/dist/C_Barcode.js.map +1 -0
- package/dist/C_Barcode2.js +1 -67
- package/dist/C_Barcode2.js.map +1 -1
- package/dist/C_Captcha.cjs +1 -4
- package/dist/C_Captcha.js +1 -3
- package/dist/C_Captcha.js.map +1 -0
- package/dist/C_Captcha2.js +1 -154
- package/dist/C_Captcha2.js.map +1 -1
- package/dist/C_Cascade.cjs +1 -4
- package/dist/C_Cascade.js +1 -3
- package/dist/C_Cascade.js.map +1 -0
- package/dist/C_Cascade2.js +1 -102
- package/dist/C_Cascade2.js.map +1 -1
- package/dist/C_City.cjs +1 -4
- package/dist/C_City.js +1 -3
- package/dist/C_City.js.map +1 -0
- package/dist/C_City2.js +1 -840
- package/dist/C_City2.js.map +1 -1
- package/dist/C_Code.cjs +1 -5
- package/dist/C_Code.js +1 -4
- package/dist/C_Code.js.map +1 -0
- package/dist/C_Code2.js +1 -346
- package/dist/C_Code2.js.map +1 -1
- package/dist/C_CollapsePanel.cjs +1 -6
- package/dist/C_CollapsePanel.js +1 -4
- package/dist/C_CollapsePanel.js.map +1 -0
- package/dist/C_CollapsePanel2.js +1 -318
- package/dist/C_CollapsePanel2.js.map +1 -1
- package/dist/C_Cron.cjs +1 -15
- package/dist/C_Cron.js +1 -4
- package/dist/C_Cron.js.map +1 -0
- package/dist/C_Cron2.js +1 -1209
- package/dist/C_Cron2.js.map +1 -1
- package/dist/C_Date.cjs +1 -4
- package/dist/C_Date.js +1 -3
- package/dist/C_Date.js.map +1 -0
- package/dist/C_Date2.js +1 -218
- package/dist/C_Date2.js.map +1 -1
- package/dist/C_Draggable.cjs +1 -5
- package/dist/C_Draggable.js +1 -3
- package/dist/C_Draggable.js.map +1 -0
- package/dist/C_Draggable2.js +1 -294
- package/dist/C_Draggable2.js.map +1 -1
- package/dist/C_Editor.cjs +1 -4
- package/dist/C_Editor.js +1 -3
- package/dist/C_Editor.js.map +1 -0
- package/dist/C_Editor2.js +1 -159
- package/dist/C_Editor2.js.map +1 -1
- package/dist/C_FilePreview.cjs +1 -7
- package/dist/C_FilePreview.js +1 -4
- package/dist/C_FilePreview.js.map +1 -0
- package/dist/C_FilePreview2.js +1 -1031
- package/dist/C_FilePreview2.js.map +1 -1
- package/dist/C_Form.cjs +1 -16
- package/dist/C_Form.js +1 -5
- package/dist/C_Form.js.map +1 -0
- package/dist/C_Form2.js +1 -2569
- package/dist/C_Form2.js.map +1 -1
- package/dist/C_FormSearch.cjs +1 -6
- package/dist/C_FormSearch.js +1 -3
- package/dist/C_FormSearch.js.map +1 -0
- package/dist/C_FormSearch2.js +1 -355
- package/dist/C_FormSearch2.js.map +1 -1
- package/dist/C_FormulaEditor.cjs +1 -13
- package/dist/C_FormulaEditor.js +1 -4
- package/dist/C_FormulaEditor.js.map +1 -0
- package/dist/C_FormulaEditor2.js +1 -1432
- package/dist/C_FormulaEditor2.js.map +1 -1
- package/dist/C_FullCalendar.cjs +1 -9
- package/dist/C_FullCalendar.js +1 -3
- package/dist/C_FullCalendar.js.map +1 -0
- package/dist/C_FullCalendar2.js +1 -376
- package/dist/C_FullCalendar2.js.map +1 -1
- package/dist/C_GlobalSearch.cjs +1 -5
- package/dist/C_GlobalSearch.js +1 -3
- package/dist/C_GlobalSearch.js.map +1 -0
- package/dist/C_GlobalSearch2.js +1 -335
- package/dist/C_GlobalSearch2.js.map +1 -1
- package/dist/C_Guide.cjs +1 -5
- package/dist/C_Guide.js +1 -4
- package/dist/C_Guide.js.map +1 -0
- package/dist/C_Guide2.js +1 -60
- package/dist/C_Guide2.js.map +1 -1
- package/dist/C_Icon.cjs +1 -4
- package/dist/C_Icon.js +1 -3
- package/dist/C_Icon.js.map +1 -0
- package/dist/C_Icon2.js +1 -285
- package/dist/C_Icon2.js.map +1 -1
- package/dist/C_ImageCropper.cjs +1 -6
- package/dist/C_ImageCropper.js +1 -4
- package/dist/C_ImageCropper.js.map +1 -0
- package/dist/C_ImageCropper2.js +1 -722
- package/dist/C_ImageCropper2.js.map +1 -1
- package/dist/C_Language.cjs +1 -5
- package/dist/C_Language.js +1 -4
- package/dist/C_Language.js.map +1 -0
- package/dist/C_Language2.js +1 -78
- package/dist/C_Language2.js.map +1 -1
- package/dist/C_Map.cjs +1 -7
- package/dist/C_Map.js +1 -3
- package/dist/C_Map.js.map +1 -0
- package/dist/C_Map2.js +1 -198
- package/dist/C_Map2.js.map +1 -1
- package/dist/C_Markdown.cjs +1 -4
- package/dist/C_Markdown.js +1 -3
- package/dist/C_Markdown.js.map +1 -0
- package/dist/C_Markdown2.js +1 -185
- package/dist/C_Markdown2.js.map +1 -1
- package/dist/C_NotificationCenter.cjs +1 -20
- package/dist/C_NotificationCenter.js +1 -4
- package/dist/C_NotificationCenter.js.map +1 -0
- package/dist/C_NotificationCenter2.js +1 -1383
- package/dist/C_NotificationCenter2.js.map +1 -1
- package/dist/C_Progress.cjs +1 -4
- package/dist/C_Progress.js +1 -3
- package/dist/C_Progress.js.map +1 -0
- package/dist/C_Progress2.js +1 -102
- package/dist/C_Progress2.js.map +1 -1
- package/dist/C_QRCode.cjs +1 -5
- package/dist/C_QRCode.js +1 -3
- package/dist/C_QRCode.js.map +1 -0
- package/dist/C_QRCode2.js +1 -217
- package/dist/C_QRCode2.js.map +1 -1
- package/dist/C_Signature.cjs +1 -8
- package/dist/C_Signature.js +1 -4
- package/dist/C_Signature.js.map +1 -0
- package/dist/C_Signature2.js +1 -617
- package/dist/C_Signature2.js.map +1 -1
- package/dist/C_SplitPane.cjs +1 -6
- package/dist/C_SplitPane.js +1 -4
- package/dist/C_SplitPane.js.map +1 -0
- package/dist/C_SplitPane2.js +1 -355
- package/dist/C_SplitPane2.js.map +1 -1
- package/dist/C_Steps.cjs +1 -4
- package/dist/C_Steps.js +1 -3
- package/dist/C_Steps.js.map +1 -0
- package/dist/C_Steps2.js +1 -81
- package/dist/C_Steps2.js.map +1 -1
- package/dist/C_Table.cjs +1 -20
- package/dist/C_Table.js +1 -6
- package/dist/C_Table.js.map +1 -0
- package/dist/C_Table2.js +1 -3023
- package/dist/C_Table2.js.map +1 -1
- package/dist/C_Theme.cjs +1 -5
- package/dist/C_Theme.js +1 -4
- package/dist/C_Theme.js.map +1 -0
- package/dist/C_Theme2.js +1 -63
- package/dist/C_Theme2.js.map +1 -1
- package/dist/C_Time.cjs +1 -5
- package/dist/C_Time.js +1 -3
- package/dist/C_Time.js.map +1 -0
- package/dist/C_Time2.js +1 -198
- package/dist/C_Time2.js.map +1 -1
- package/dist/C_Tree.cjs +1 -7
- package/dist/C_Tree.js +1 -4
- package/dist/C_Tree.js.map +1 -0
- package/dist/C_Tree2.js +1 -440
- package/dist/C_Tree2.js.map +1 -1
- package/dist/C_Upload.cjs +1 -12
- package/dist/C_Upload.js +1 -4
- package/dist/C_Upload.js.map +1 -0
- package/dist/C_Upload2.js +2 -1365
- package/dist/C_Upload2.js.map +1 -1
- package/dist/C_VideoPlayer.cjs +1 -23
- package/dist/C_VideoPlayer.js +1 -3
- package/dist/C_VideoPlayer.js.map +1 -0
- package/dist/C_VideoPlayer2.js +3 -1932
- package/dist/C_VideoPlayer2.js.map +1 -1
- package/dist/C_VtableGantt.cjs +1 -6
- package/dist/C_VtableGantt.js +1 -4
- package/dist/C_VtableGantt.js.map +1 -0
- package/dist/C_VtableGantt2.js +1 -872
- package/dist/C_VtableGantt2.js.map +1 -1
- package/dist/C_WaterFall.cjs +1 -13
- package/dist/C_WaterFall.js +1 -3
- package/dist/C_WaterFall.js.map +1 -0
- package/dist/C_WaterFall2.js +1 -364
- package/dist/C_WaterFall2.js.map +1 -1
- package/dist/C_WorkFlow.cjs +1 -8
- package/dist/C_WorkFlow.js +1 -4
- package/dist/C_WorkFlow.js.map +1 -0
- package/dist/C_WorkFlow2.js +1 -1983
- package/dist/C_WorkFlow2.js.map +1 -1
- package/dist/chunk.js +1 -18
- package/dist/city.js +1 -4816
- package/dist/constants.d.ts +2 -2
- package/dist/constants2.d.ts +3 -3
- package/dist/constants3.d.ts +3 -3
- package/dist/constants4.d.ts +5 -5
- package/dist/constants5.d.ts +2 -2
- package/dist/data.d.ts +1 -1
- package/dist/export-helper.js +1 -9
- package/dist/index.cjs +2 -413
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1 -2
- package/dist/index.d.ts +1 -2
- package/dist/index.js +1 -231
- package/dist/index.js.map +1 -1
- package/dist/index.vue.d.ts +2 -2
- package/dist/index10.vue.d.ts +5 -5
- package/dist/index12.vue.d.ts +3 -3
- package/dist/index13.vue.d.ts +3 -3
- package/dist/index14.vue.d.ts +3 -3
- package/dist/index16.vue.d.ts +3 -3
- package/dist/index3.vue.d.ts +3 -3
- package/dist/index5.vue.d.ts +1 -1
- package/dist/index7.vue.d.ts +4 -4
- package/dist/index8.vue.d.ts +2 -2
- package/dist/resolver.cjs +2 -89
- package/dist/resolver.cjs.map +1 -0
- package/dist/resolver.js +1 -86
- package/dist/resolver.js.map +1 -1
- package/dist/storage.js +1 -30
- package/dist/storage.js.map +1 -1
- package/dist/useCollapsePanel.d.ts +2 -2
- package/dist/useCropperCore.d.ts +8 -8
- package/dist/useDraggableLayout.d.ts +4 -4
- package/dist/useDynamicFormState.d.ts +7 -7
- package/dist/useEdgeInteraction.d.ts +1 -1
- package/dist/useFullscreen.d.ts +2 -2
- package/dist/useInfiniteScroll.d.ts +1 -1
- package/dist/useModalEdit.d.ts +1 -1
- package/dist/useQRCode.d.ts +3 -3
- package/dist/useSearchState.d.ts +2 -2
- package/dist/useSignatureHistory.d.ts +1 -1
- package/dist/useSplitResize.d.ts +6 -6
- package/dist/useTimeSelection.d.ts +2 -2
- package/dist/useTreeOperations.d.ts +6 -6
- package/dist/useWorkflowValidation.d.ts +4 -4
- package/package.json +1 -2
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants2.d.ts.map +0 -1
- package/dist/constants3.d.ts.map +0 -1
- package/dist/constants4.d.ts.map +0 -1
- package/dist/constants5.d.ts.map +0 -1
- package/dist/data.d.ts.map +0 -1
- package/dist/index.d.cts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.vue.d.ts.map +0 -1
- package/dist/index10.vue.d.ts.map +0 -1
- package/dist/index11.vue.d.ts.map +0 -1
- package/dist/index12.vue.d.ts.map +0 -1
- package/dist/index13.vue.d.ts.map +0 -1
- package/dist/index14.vue.d.ts.map +0 -1
- package/dist/index15.vue.d.ts.map +0 -1
- package/dist/index16.vue.d.ts.map +0 -1
- package/dist/index2.vue.d.ts.map +0 -1
- package/dist/index3.vue.d.ts.map +0 -1
- package/dist/index4.vue.d.ts.map +0 -1
- package/dist/index5.vue.d.ts.map +0 -1
- package/dist/index6.vue.d.ts.map +0 -1
- package/dist/index7.vue.d.ts.map +0 -1
- package/dist/index8.vue.d.ts.map +0 -1
- package/dist/index9.vue.d.ts.map +0 -1
- package/dist/resolver.d.cts.map +0 -1
- package/dist/resolver.d.ts.map +0 -1
- package/dist/useCalendarEvents.d.ts.map +0 -1
- package/dist/useCollapsePanel.d.ts.map +0 -1
- package/dist/useCropperCore.d.ts.map +0 -1
- package/dist/useDraggableLayout.d.ts.map +0 -1
- package/dist/useDynamicFormState.d.ts.map +0 -1
- package/dist/useEdgeInteraction.d.ts.map +0 -1
- package/dist/useFullscreen.d.ts.map +0 -1
- package/dist/useGlobalSearch.d.ts.map +0 -1
- package/dist/useInfiniteScroll.d.ts.map +0 -1
- package/dist/useModalEdit.d.ts.map +0 -1
- package/dist/useQRCode.d.ts.map +0 -1
- package/dist/useSearchState.d.ts.map +0 -1
- package/dist/useSignatureHistory.d.ts.map +0 -1
- package/dist/useSplitResize.d.ts.map +0 -1
- package/dist/useTimeSelection.d.ts.map +0 -1
- package/dist/useTreeOperations.d.ts.map +0 -1
- package/dist/useWorkflowValidation.d.ts.map +0 -1
package/dist/C_CollapsePanel2.js
CHANGED
|
@@ -1,319 +1,2 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { t as export_helper_default } from "./export-helper.js";
|
|
3
|
-
import { Fragment, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, normalizeClass, openBlock, ref, renderList, renderSlot, toDisplayString, toRef, unref, vShow, watch, withCtx, withDirectives, withModifiers } from "vue";
|
|
4
|
-
|
|
5
|
-
//#region src/components/C_CollapsePanel/composables/useCollapsePanel.ts
|
|
6
|
-
/**
|
|
7
|
-
* 折叠面板展开/折叠核心逻辑
|
|
8
|
-
*/
|
|
9
|
-
function useCollapsePanel(options) {
|
|
10
|
-
const { items, activeKeys: externalKeys, defaultActiveKeys, accordion, persistKey, onChange, onExpand, onCollapse } = options;
|
|
11
|
-
const loadPersistedKeys = () => {
|
|
12
|
-
if (!persistKey.value) return null;
|
|
13
|
-
try {
|
|
14
|
-
const raw = localStorage.getItem(`collapse-panel:${persistKey.value}`);
|
|
15
|
-
return raw ? JSON.parse(raw) : null;
|
|
16
|
-
} catch {
|
|
17
|
-
return null;
|
|
18
|
-
}
|
|
19
|
-
};
|
|
20
|
-
const savePersistedKeys = (keys) => {
|
|
21
|
-
if (!persistKey.value) return;
|
|
22
|
-
try {
|
|
23
|
-
localStorage.setItem(`collapse-panel:${persistKey.value}`, JSON.stringify(keys));
|
|
24
|
-
} catch {}
|
|
25
|
-
};
|
|
26
|
-
const resolveInitialKeys = () => {
|
|
27
|
-
if (externalKeys.value !== void 0) return [...externalKeys.value];
|
|
28
|
-
const persisted = loadPersistedKeys();
|
|
29
|
-
if (persisted) return persisted;
|
|
30
|
-
return [...defaultActiveKeys];
|
|
31
|
-
};
|
|
32
|
-
const internalKeys = ref(resolveInitialKeys());
|
|
33
|
-
/** 懒渲染追踪:记录哪些面板曾被展开过 */
|
|
34
|
-
const renderedOnce = ref(new Set(internalKeys.value));
|
|
35
|
-
/** 当前激活的 key 数组(兼容受控 / 非受控) */
|
|
36
|
-
const currentKeys = computed({
|
|
37
|
-
get: () => externalKeys.value !== void 0 ? externalKeys.value : internalKeys.value,
|
|
38
|
-
set: (val) => {
|
|
39
|
-
internalKeys.value = val;
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
/**
|
|
43
|
-
* 判断面板是否展开
|
|
44
|
-
*/
|
|
45
|
-
const isExpanded = (key) => {
|
|
46
|
-
return currentKeys.value.includes(key);
|
|
47
|
-
};
|
|
48
|
-
/**
|
|
49
|
-
* 判断面板是否应该渲染内容
|
|
50
|
-
* - lazy 面板只有被展开过至少一次后才渲染
|
|
51
|
-
* - destroyOnCollapse 面板在折叠后销毁 DOM
|
|
52
|
-
*/
|
|
53
|
-
const shouldRender = (item) => {
|
|
54
|
-
const expanded = isExpanded(item.key);
|
|
55
|
-
if (item.destroyOnCollapse) return expanded;
|
|
56
|
-
if (item.lazy) return renderedOnce.value.has(item.key);
|
|
57
|
-
return true;
|
|
58
|
-
};
|
|
59
|
-
const updateKeys = (newKeys) => {
|
|
60
|
-
currentKeys.value = newKeys;
|
|
61
|
-
onChange?.(newKeys);
|
|
62
|
-
savePersistedKeys(newKeys);
|
|
63
|
-
};
|
|
64
|
-
const toggle = (key) => {
|
|
65
|
-
const item = items.value.find((i) => i.key === key);
|
|
66
|
-
if (!item || item.disabled) return;
|
|
67
|
-
if (isExpanded(key)) {
|
|
68
|
-
updateKeys(currentKeys.value.filter((k) => k !== key));
|
|
69
|
-
onCollapse?.(key);
|
|
70
|
-
} else {
|
|
71
|
-
renderedOnce.value.add(key);
|
|
72
|
-
if (accordion.value) {
|
|
73
|
-
const prevKeys = currentKeys.value;
|
|
74
|
-
updateKeys([key]);
|
|
75
|
-
prevKeys.forEach((k) => {
|
|
76
|
-
if (k !== key) onCollapse?.(k);
|
|
77
|
-
});
|
|
78
|
-
} else updateKeys([...currentKeys.value, key]);
|
|
79
|
-
onExpand?.(key);
|
|
80
|
-
}
|
|
81
|
-
};
|
|
82
|
-
const expandAll = () => {
|
|
83
|
-
if (accordion.value) return;
|
|
84
|
-
const allKeys = items.value.filter((i) => !i.disabled).map((i) => i.key);
|
|
85
|
-
allKeys.forEach((k) => renderedOnce.value.add(k));
|
|
86
|
-
updateKeys(allKeys);
|
|
87
|
-
};
|
|
88
|
-
const collapseAll = () => {
|
|
89
|
-
updateKeys([]);
|
|
90
|
-
};
|
|
91
|
-
const getActiveKeys = () => {
|
|
92
|
-
return [...currentKeys.value];
|
|
93
|
-
};
|
|
94
|
-
const handleKeyDown = (e, key) => {
|
|
95
|
-
if (["Enter", " "].includes(e.key)) {
|
|
96
|
-
e.preventDefault();
|
|
97
|
-
toggle(key);
|
|
98
|
-
}
|
|
99
|
-
};
|
|
100
|
-
watch(() => externalKeys.value, (newVal) => {
|
|
101
|
-
if (newVal !== void 0) {
|
|
102
|
-
internalKeys.value = [...newVal];
|
|
103
|
-
newVal.forEach((k) => renderedOnce.value.add(k));
|
|
104
|
-
savePersistedKeys(newVal);
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
|
-
return {
|
|
108
|
-
currentKeys,
|
|
109
|
-
renderedOnce,
|
|
110
|
-
isExpanded,
|
|
111
|
-
shouldRender,
|
|
112
|
-
toggle,
|
|
113
|
-
expandAll,
|
|
114
|
-
collapseAll,
|
|
115
|
-
getActiveKeys,
|
|
116
|
-
handleKeyDown
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
//#endregion
|
|
121
|
-
//#region src/components/C_CollapsePanel/index.vue?vue&type=script&setup=true&lang.ts
|
|
122
|
-
const _hoisted_1 = [
|
|
123
|
-
"aria-expanded",
|
|
124
|
-
"aria-controls",
|
|
125
|
-
"aria-disabled",
|
|
126
|
-
"tabindex",
|
|
127
|
-
"onClick",
|
|
128
|
-
"onKeydown"
|
|
129
|
-
];
|
|
130
|
-
const _hoisted_2 = { class: "collapse-item__title-area" };
|
|
131
|
-
const _hoisted_3 = { class: "collapse-item__title-group" };
|
|
132
|
-
const _hoisted_4 = { class: "collapse-item__title" };
|
|
133
|
-
const _hoisted_5 = {
|
|
134
|
-
key: 1,
|
|
135
|
-
class: "collapse-item__subtitle"
|
|
136
|
-
};
|
|
137
|
-
const _hoisted_6 = ["id", "aria-labelledby"];
|
|
138
|
-
const _hoisted_7 = {
|
|
139
|
-
key: 0,
|
|
140
|
-
class: "collapse-item__content"
|
|
141
|
-
};
|
|
142
|
-
var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
|
|
143
|
-
name: "C_CollapsePanel",
|
|
144
|
-
__name: "index",
|
|
145
|
-
props: {
|
|
146
|
-
items: {},
|
|
147
|
-
activeKeys: { default: void 0 },
|
|
148
|
-
defaultActiveKeys: { default: () => [] },
|
|
149
|
-
accordion: {
|
|
150
|
-
type: Boolean,
|
|
151
|
-
default: false
|
|
152
|
-
},
|
|
153
|
-
variant: { default: "default" },
|
|
154
|
-
expandIconPosition: { default: "left" },
|
|
155
|
-
bordered: {
|
|
156
|
-
type: Boolean,
|
|
157
|
-
default: true
|
|
158
|
-
},
|
|
159
|
-
persistKey: { default: void 0 }
|
|
160
|
-
},
|
|
161
|
-
emits: [
|
|
162
|
-
"update:activeKeys",
|
|
163
|
-
"expand",
|
|
164
|
-
"collapse",
|
|
165
|
-
"change"
|
|
166
|
-
],
|
|
167
|
-
setup(__props, { expose: __expose, emit: __emit }) {
|
|
168
|
-
const props = __props;
|
|
169
|
-
const emit = __emit;
|
|
170
|
-
const containerRef = ref(null);
|
|
171
|
-
const panelRefs = ref(/* @__PURE__ */ new Map());
|
|
172
|
-
const setPanelRef = (key, el) => {
|
|
173
|
-
if (el) panelRefs.value.set(key, el);
|
|
174
|
-
else panelRefs.value.delete(key);
|
|
175
|
-
};
|
|
176
|
-
const { isExpanded, shouldRender, toggle, expandAll, collapseAll, getActiveKeys, handleKeyDown } = useCollapsePanel({
|
|
177
|
-
items: toRef(props, "items"),
|
|
178
|
-
activeKeys: toRef(props, "activeKeys"),
|
|
179
|
-
defaultActiveKeys: props.defaultActiveKeys,
|
|
180
|
-
accordion: toRef(props, "accordion"),
|
|
181
|
-
persistKey: toRef(props, "persistKey"),
|
|
182
|
-
onChange: (keys) => {
|
|
183
|
-
emit("update:activeKeys", keys);
|
|
184
|
-
emit("change", keys);
|
|
185
|
-
},
|
|
186
|
-
onExpand: (key) => emit("expand", key),
|
|
187
|
-
onCollapse: (key) => emit("collapse", key)
|
|
188
|
-
});
|
|
189
|
-
const onEnter = (el) => {
|
|
190
|
-
const element = el;
|
|
191
|
-
element.style.height = "0";
|
|
192
|
-
element.style.overflow = "hidden";
|
|
193
|
-
element.offsetHeight;
|
|
194
|
-
element.style.height = `${element.scrollHeight}px`;
|
|
195
|
-
};
|
|
196
|
-
const onAfterEnter = (el) => {
|
|
197
|
-
const element = el;
|
|
198
|
-
element.style.height = "";
|
|
199
|
-
element.style.overflow = "";
|
|
200
|
-
};
|
|
201
|
-
const onLeave = (el) => {
|
|
202
|
-
const element = el;
|
|
203
|
-
element.style.height = `${element.scrollHeight}px`;
|
|
204
|
-
element.style.overflow = "hidden";
|
|
205
|
-
element.offsetHeight;
|
|
206
|
-
element.style.height = "0";
|
|
207
|
-
};
|
|
208
|
-
const onAfterLeave = (el) => {
|
|
209
|
-
const element = el;
|
|
210
|
-
element.style.height = "";
|
|
211
|
-
element.style.overflow = "";
|
|
212
|
-
};
|
|
213
|
-
const scrollToPanel = (key) => {
|
|
214
|
-
const el = panelRefs.value.get(key);
|
|
215
|
-
if (el) el.scrollIntoView({
|
|
216
|
-
behavior: "smooth",
|
|
217
|
-
block: "start"
|
|
218
|
-
});
|
|
219
|
-
};
|
|
220
|
-
__expose({
|
|
221
|
-
expandAll,
|
|
222
|
-
collapseAll,
|
|
223
|
-
toggle,
|
|
224
|
-
getActiveKeys,
|
|
225
|
-
scrollToPanel
|
|
226
|
-
});
|
|
227
|
-
return (_ctx, _cache) => {
|
|
228
|
-
return openBlock(), createElementBlock("div", {
|
|
229
|
-
ref_key: "containerRef",
|
|
230
|
-
ref: containerRef,
|
|
231
|
-
class: normalizeClass(["c-collapse-panel", [`c-collapse-panel--${_ctx.variant}`, {
|
|
232
|
-
"c-collapse-panel--bordered": _ctx.bordered,
|
|
233
|
-
"c-collapse-panel--icon-right": _ctx.expandIconPosition === "right"
|
|
234
|
-
}]])
|
|
235
|
-
}, [(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.items, (item) => {
|
|
236
|
-
return openBlock(), createElementBlock("div", {
|
|
237
|
-
key: item.key,
|
|
238
|
-
ref_for: true,
|
|
239
|
-
ref: (el) => setPanelRef(item.key, el),
|
|
240
|
-
class: normalizeClass(["collapse-item", {
|
|
241
|
-
"collapse-item--active": unref(isExpanded)(item.key),
|
|
242
|
-
"collapse-item--disabled": item.disabled
|
|
243
|
-
}])
|
|
244
|
-
}, [
|
|
245
|
-
createCommentVNode(" 面板头部 "),
|
|
246
|
-
createElementVNode("div", {
|
|
247
|
-
class: "collapse-item__header",
|
|
248
|
-
role: "button",
|
|
249
|
-
"aria-expanded": unref(isExpanded)(item.key),
|
|
250
|
-
"aria-controls": `collapse-content-${item.key}`,
|
|
251
|
-
"aria-disabled": item.disabled,
|
|
252
|
-
tabindex: item.disabled ? -1 : 0,
|
|
253
|
-
onClick: ($event) => !item.disabled && unref(toggle)(item.key),
|
|
254
|
-
onKeydown: ($event) => unref(handleKeyDown)($event, item.key)
|
|
255
|
-
}, [
|
|
256
|
-
createCommentVNode(" 展开图标 "),
|
|
257
|
-
createElementVNode("span", { class: normalizeClass(["collapse-item__arrow", { "collapse-item__arrow--expanded": unref(isExpanded)(item.key) }]) }, [createVNode(C_Icon_default, {
|
|
258
|
-
name: "mdi:chevron-right",
|
|
259
|
-
size: 16,
|
|
260
|
-
color: "currentColor"
|
|
261
|
-
})], 2),
|
|
262
|
-
createCommentVNode(" 标题区域 "),
|
|
263
|
-
createElementVNode("div", _hoisted_2, [renderSlot(_ctx.$slots, `header-${item.key}`, {
|
|
264
|
-
item,
|
|
265
|
-
expanded: unref(isExpanded)(item.key)
|
|
266
|
-
}, () => [createElementVNode("div", _hoisted_3, [
|
|
267
|
-
item.icon ? (openBlock(), createBlock(C_Icon_default, {
|
|
268
|
-
key: 0,
|
|
269
|
-
name: item.icon,
|
|
270
|
-
size: 18,
|
|
271
|
-
color: "currentColor",
|
|
272
|
-
class: "collapse-item__icon"
|
|
273
|
-
}, null, 8, ["name"])) : createCommentVNode("v-if", true),
|
|
274
|
-
createElementVNode("span", _hoisted_4, toDisplayString(item.title), 1),
|
|
275
|
-
item.subtitle ? (openBlock(), createElementBlock("span", _hoisted_5, toDisplayString(item.subtitle), 1)) : createCommentVNode("v-if", true)
|
|
276
|
-
])], true)]),
|
|
277
|
-
createCommentVNode(" 头部右侧操作区 "),
|
|
278
|
-
_ctx.$slots[`extra-${item.key}`] ? (openBlock(), createElementBlock("div", {
|
|
279
|
-
key: 0,
|
|
280
|
-
class: "collapse-item__extra",
|
|
281
|
-
onClick: _cache[0] || (_cache[0] = withModifiers(() => {}, ["stop"]))
|
|
282
|
-
}, [renderSlot(_ctx.$slots, `extra-${item.key}`, {
|
|
283
|
-
item,
|
|
284
|
-
expanded: unref(isExpanded)(item.key)
|
|
285
|
-
}, void 0, true)])) : createCommentVNode("v-if", true)
|
|
286
|
-
], 40, _hoisted_1),
|
|
287
|
-
createCommentVNode(" 面板内容 "),
|
|
288
|
-
createVNode(Transition, {
|
|
289
|
-
name: "collapse-slide",
|
|
290
|
-
onEnter,
|
|
291
|
-
onAfterEnter,
|
|
292
|
-
onLeave,
|
|
293
|
-
onAfterLeave,
|
|
294
|
-
persisted: ""
|
|
295
|
-
}, {
|
|
296
|
-
default: withCtx(() => [withDirectives(createElementVNode("div", {
|
|
297
|
-
id: `collapse-content-${item.key}`,
|
|
298
|
-
class: "collapse-item__content-wrapper",
|
|
299
|
-
role: "region",
|
|
300
|
-
"aria-labelledby": `collapse-header-${item.key}`
|
|
301
|
-
}, [unref(shouldRender)(item) ? (openBlock(), createElementBlock("div", _hoisted_7, [renderSlot(_ctx.$slots, `panel-${item.key}`, {
|
|
302
|
-
item,
|
|
303
|
-
expanded: unref(isExpanded)(item.key)
|
|
304
|
-
}, void 0, true)])) : createCommentVNode("v-if", true)], 8, _hoisted_6), [[vShow, unref(isExpanded)(item.key)]])]),
|
|
305
|
-
_: 2
|
|
306
|
-
}, 1024)
|
|
307
|
-
], 2);
|
|
308
|
-
}), 128))], 2);
|
|
309
|
-
};
|
|
310
|
-
}
|
|
311
|
-
});
|
|
312
|
-
|
|
313
|
-
//#endregion
|
|
314
|
-
//#region src/components/C_CollapsePanel/index.vue
|
|
315
|
-
var C_CollapsePanel_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-0ab400c1"]]);
|
|
316
|
-
|
|
317
|
-
//#endregion
|
|
318
|
-
export { useCollapsePanel as n, C_CollapsePanel_default as t };
|
|
1
|
+
import{t as e}from"./C_Icon2.js";import{t}from"./export-helper.js";import{Fragment as n,Transition as r,computed as i,createBlock as a,createCommentVNode as o,createElementBlock as s,createElementVNode as c,createVNode as l,defineComponent as u,normalizeClass as d,openBlock as f,ref as p,renderList as m,renderSlot as h,toDisplayString as g,toRef as _,unref as v,vShow as y,watch as b,withCtx as x,withDirectives as S,withModifiers as C}from"vue";function w(e){let{items:t,activeKeys:n,defaultActiveKeys:r,accordion:a,persistKey:o,onChange:s,onExpand:c,onCollapse:l}=e,u=()=>{if(!o.value)return null;try{let e=localStorage.getItem(`collapse-panel:${o.value}`);return e?JSON.parse(e):null}catch{return null}},d=e=>{if(o.value)try{localStorage.setItem(`collapse-panel:${o.value}`,JSON.stringify(e))}catch{}},f=p(n.value===void 0?u()||[...r]:[...n.value]),m=p(new Set(f.value)),h=i({get:()=>n.value===void 0?f.value:n.value,set:e=>{f.value=e}}),g=e=>h.value.includes(e),_=e=>{let t=g(e.key);return e.destroyOnCollapse?t:e.lazy?m.value.has(e.key):!0},v=e=>{h.value=e,s?.(e),d(e)},y=e=>{let n=t.value.find(t=>t.key===e);if(!(!n||n.disabled))if(g(e))v(h.value.filter(t=>t!==e)),l?.(e);else{if(m.value.add(e),a.value){let t=h.value;v([e]),t.forEach(t=>{t!==e&&l?.(t)})}else v([...h.value,e]);c?.(e)}};return b(()=>n.value,e=>{e!==void 0&&(f.value=[...e],e.forEach(e=>m.value.add(e)),d(e))}),{currentKeys:h,renderedOnce:m,isExpanded:g,shouldRender:_,toggle:y,expandAll:()=>{if(a.value)return;let e=t.value.filter(e=>!e.disabled).map(e=>e.key);e.forEach(e=>m.value.add(e)),v(e)},collapseAll:()=>{v([])},getActiveKeys:()=>[...h.value],handleKeyDown:(e,t)=>{[`Enter`,` `].includes(e.key)&&(e.preventDefault(),y(t))}}}const T=[`aria-expanded`,`aria-controls`,`aria-disabled`,`tabindex`,`onClick`,`onKeydown`],E={class:`collapse-item__title-area`},D={class:`collapse-item__title-group`},O={class:`collapse-item__title`},k={key:1,class:`collapse-item__subtitle`},A=[`id`,`aria-labelledby`],j={key:0,class:`collapse-item__content`};var M=t(u({name:`C_CollapsePanel`,__name:`index`,props:{items:{},activeKeys:{default:void 0},defaultActiveKeys:{default:()=>[]},accordion:{type:Boolean,default:!1},variant:{default:`default`},expandIconPosition:{default:`left`},bordered:{type:Boolean,default:!0},persistKey:{default:void 0}},emits:[`update:activeKeys`,`expand`,`collapse`,`change`],setup(t,{expose:i,emit:u}){let b=t,M=u,N=p(null),P=p(new Map),F=(e,t)=>{t?P.value.set(e,t):P.value.delete(e)},{isExpanded:I,shouldRender:L,toggle:R,expandAll:z,collapseAll:B,getActiveKeys:V,handleKeyDown:H}=w({items:_(b,`items`),activeKeys:_(b,`activeKeys`),defaultActiveKeys:b.defaultActiveKeys,accordion:_(b,`accordion`),persistKey:_(b,`persistKey`),onChange:e=>{M(`update:activeKeys`,e),M(`change`,e)},onExpand:e=>M(`expand`,e),onCollapse:e=>M(`collapse`,e)}),U=e=>{let t=e;t.style.height=`0`,t.style.overflow=`hidden`,t.offsetHeight,t.style.height=`${t.scrollHeight}px`},W=e=>{let t=e;t.style.height=``,t.style.overflow=``},G=e=>{let t=e;t.style.height=`${t.scrollHeight}px`,t.style.overflow=`hidden`,t.offsetHeight,t.style.height=`0`},K=e=>{let t=e;t.style.height=``,t.style.overflow=``};return i({expandAll:z,collapseAll:B,toggle:R,getActiveKeys:V,scrollToPanel:e=>{let t=P.value.get(e);t&&t.scrollIntoView({behavior:`smooth`,block:`start`})}}),(t,i)=>(f(),s(`div`,{ref_key:`containerRef`,ref:N,class:d([`c-collapse-panel`,[`c-collapse-panel--${t.variant}`,{"c-collapse-panel--bordered":t.bordered,"c-collapse-panel--icon-right":t.expandIconPosition===`right`}]])},[(f(!0),s(n,null,m(t.items,n=>(f(),s(`div`,{key:n.key,ref_for:!0,ref:e=>F(n.key,e),class:d([`collapse-item`,{"collapse-item--active":v(I)(n.key),"collapse-item--disabled":n.disabled}])},[o(` 面板头部 `),c(`div`,{class:`collapse-item__header`,role:`button`,"aria-expanded":v(I)(n.key),"aria-controls":`collapse-content-${n.key}`,"aria-disabled":n.disabled,tabindex:n.disabled?-1:0,onClick:e=>!n.disabled&&v(R)(n.key),onKeydown:e=>v(H)(e,n.key)},[o(` 展开图标 `),c(`span`,{class:d([`collapse-item__arrow`,{"collapse-item__arrow--expanded":v(I)(n.key)}])},[l(e,{name:`mdi:chevron-right`,size:16,color:`currentColor`})],2),o(` 标题区域 `),c(`div`,E,[h(t.$slots,`header-${n.key}`,{item:n,expanded:v(I)(n.key)},()=>[c(`div`,D,[n.icon?(f(),a(e,{key:0,name:n.icon,size:18,color:`currentColor`,class:`collapse-item__icon`},null,8,[`name`])):o(`v-if`,!0),c(`span`,O,g(n.title),1),n.subtitle?(f(),s(`span`,k,g(n.subtitle),1)):o(`v-if`,!0)])],!0)]),o(` 头部右侧操作区 `),t.$slots[`extra-${n.key}`]?(f(),s(`div`,{key:0,class:`collapse-item__extra`,onClick:i[0]||=C(()=>{},[`stop`])},[h(t.$slots,`extra-${n.key}`,{item:n,expanded:v(I)(n.key)},void 0,!0)])):o(`v-if`,!0)],40,T),o(` 面板内容 `),l(r,{name:`collapse-slide`,onEnter:U,onAfterEnter:W,onLeave:G,onAfterLeave:K,persisted:``},{default:x(()=>[S(c(`div`,{id:`collapse-content-${n.key}`,class:`collapse-item__content-wrapper`,role:`region`,"aria-labelledby":`collapse-header-${n.key}`},[v(L)(n)?(f(),s(`div`,j,[h(t.$slots,`panel-${n.key}`,{item:n,expanded:v(I)(n.key)},void 0,!0)])):o(`v-if`,!0)],8,A),[[y,v(I)(n.key)]])]),_:2},1024)],2))),128))],2))}}),[[`__scopeId`,`data-v-0ab400c1`]]);export{w as n,M as t};
|
|
319
2
|
//# sourceMappingURL=C_CollapsePanel2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"C_CollapsePanel2.js","names":["variant","bordered","expandIconPosition","items","$slots"],"sources":["../src/components/C_CollapsePanel/composables/useCollapsePanel.ts","../src/components/C_CollapsePanel/index.vue","../src/components/C_CollapsePanel/index.vue","../src/components/C_CollapsePanel/index.vue"],"sourcesContent":["import { ref, computed, watch } from 'vue'\r\nimport type { Ref } from 'vue'\r\nimport type { CollapsePanelItem } from '../types'\r\n\r\ninterface UseCollapsePanelOptions {\r\n /** 面板项配置 */\r\n items: Ref<CollapsePanelItem[]>\r\n /** 外部 v-model activeKeys */\r\n activeKeys: Ref<string[] | undefined>\r\n /** 非受控时的默认激活 key */\r\n defaultActiveKeys: string[]\r\n /** 是否手风琴模式 */\r\n accordion: Ref<boolean>\r\n /** localStorage 持久化 key */\r\n persistKey: Ref<string | undefined>\r\n /** activeKeys 变化回调 */\r\n onChange?: (keys: string[]) => void\r\n /** 单面板展开回调 */\r\n onExpand?: (key: string) => void\r\n /** 单面板折叠回调 */\r\n onCollapse?: (key: string) => void\r\n}\r\n\r\n/**\r\n * 折叠面板展开/折叠核心逻辑\r\n */\r\nexport function useCollapsePanel(options: UseCollapsePanelOptions) {\r\n const {\r\n items,\r\n activeKeys: externalKeys,\r\n defaultActiveKeys,\r\n accordion,\r\n persistKey,\r\n onChange,\r\n onExpand,\r\n onCollapse,\r\n } = options\r\n\r\n /* ─── 持久化读取 ──────────────────────────────── */\r\n const loadPersistedKeys = (): string[] | null => {\r\n if (!persistKey.value) return null\r\n try {\r\n const raw = localStorage.getItem(`collapse-panel:${persistKey.value}`)\r\n return raw ? JSON.parse(raw) : null\r\n } catch {\r\n return null\r\n }\r\n }\r\n\r\n const savePersistedKeys = (keys: string[]) => {\r\n if (!persistKey.value) return\r\n try {\r\n localStorage.setItem(\r\n `collapse-panel:${persistKey.value}`,\r\n JSON.stringify(keys),\r\n )\r\n } catch {\r\n /* 静默失败 */\r\n }\r\n }\r\n\r\n /* ─── 内部状态 ────────────────────────────────── */\r\n const resolveInitialKeys = (): string[] => {\r\n /* 优先级:外部 v-model > 持久化 > 默认值 */\r\n if (externalKeys.value !== undefined) return [...externalKeys.value]\r\n const persisted = loadPersistedKeys()\r\n if (persisted) return persisted\r\n return [...defaultActiveKeys]\r\n }\r\n\r\n const internalKeys = ref<string[]>(resolveInitialKeys())\r\n\r\n /** 懒渲染追踪:记录哪些面板曾被展开过 */\r\n const renderedOnce = ref<Set<string>>(new Set(internalKeys.value))\r\n\r\n /* ─── 计算属性 ────────────────────────────────── */\r\n /** 当前激活的 key 数组(兼容受控 / 非受控) */\r\n const currentKeys = computed<string[]>({\r\n get: () =>\r\n externalKeys.value !== undefined\r\n ? externalKeys.value\r\n : internalKeys.value,\r\n set: (val) => {\r\n internalKeys.value = val\r\n },\r\n })\r\n\r\n /**\r\n * 判断面板是否展开\r\n */\r\n const isExpanded = (key: string): boolean => {\r\n return currentKeys.value.includes(key)\r\n }\r\n\r\n /**\r\n * 判断面板是否应该渲染内容\r\n * - lazy 面板只有被展开过至少一次后才渲染\r\n * - destroyOnCollapse 面板在折叠后销毁 DOM\r\n */\r\n const shouldRender = (item: CollapsePanelItem): boolean => {\r\n const expanded = isExpanded(item.key)\r\n\r\n if (item.destroyOnCollapse) return expanded\r\n if (item.lazy) return renderedOnce.value.has(item.key)\r\n return true\r\n }\r\n\r\n /* ─── 操作方法 ────────────────────────────────── */\r\n const updateKeys = (newKeys: string[]) => {\r\n currentKeys.value = newKeys\r\n onChange?.(newKeys)\r\n savePersistedKeys(newKeys)\r\n }\r\n\r\n const toggle = (key: string) => {\r\n const item = items.value.find((i) => i.key === key)\r\n if (!item || item.disabled) return\r\n\r\n const expanded = isExpanded(key)\r\n\r\n if (expanded) {\r\n /* 折叠 */\r\n updateKeys(currentKeys.value.filter((k) => k !== key))\r\n onCollapse?.(key)\r\n } else {\r\n /* 展开 */\r\n renderedOnce.value.add(key)\r\n\r\n if (accordion.value) {\r\n /* 手风琴模式:关闭其他面板 */\r\n const prevKeys = currentKeys.value\r\n updateKeys([key])\r\n /* 通知被折叠的面板 */\r\n prevKeys.forEach((k) => {\r\n if (k !== key) onCollapse?.(k)\r\n })\r\n } else {\r\n updateKeys([...currentKeys.value, key])\r\n }\r\n onExpand?.(key)\r\n }\r\n }\r\n\r\n const expandAll = () => {\r\n if (accordion.value) return /* 手风琴模式不支持全展开 */\r\n\r\n const allKeys = items.value.filter((i) => !i.disabled).map((i) => i.key)\r\n\r\n allKeys.forEach((k) => renderedOnce.value.add(k))\r\n updateKeys(allKeys)\r\n }\r\n\r\n const collapseAll = () => {\r\n updateKeys([])\r\n }\r\n\r\n const getActiveKeys = (): string[] => {\r\n return [...currentKeys.value]\r\n }\r\n\r\n /* ─── 键盘导航 ────────────────────────────────── */\r\n const handleKeyDown = (e: KeyboardEvent, key: string) => {\r\n if (['Enter', ' '].includes(e.key)) {\r\n e.preventDefault()\r\n toggle(key)\r\n }\r\n }\r\n\r\n /* ─── 同步外部 v-model 变化 ───────────────────── */\r\n watch(\r\n () => externalKeys.value,\r\n (newVal) => {\r\n if (newVal !== undefined) {\r\n internalKeys.value = [...newVal]\r\n newVal.forEach((k) => renderedOnce.value.add(k))\r\n savePersistedKeys(newVal)\r\n }\r\n },\r\n )\r\n\r\n return {\r\n currentKeys,\r\n renderedOnce,\r\n isExpanded,\r\n shouldRender,\r\n toggle,\r\n expandAll,\r\n collapseAll,\r\n getActiveKeys,\r\n handleKeyDown,\r\n }\r\n}\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2026-02-25\r\n * @Description: 折叠面板组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n ref=\"containerRef\"\r\n class=\"c-collapse-panel\"\r\n :class=\"[\r\n `c-collapse-panel--${variant}`,\r\n {\r\n 'c-collapse-panel--bordered': bordered,\r\n 'c-collapse-panel--icon-right': expandIconPosition === 'right',\r\n },\r\n ]\"\r\n >\r\n <div\r\n v-for=\"item in items\"\r\n :key=\"item.key\"\r\n :ref=\"(el) => setPanelRef(item.key, el as HTMLElement)\"\r\n class=\"collapse-item\"\r\n :class=\"{\r\n 'collapse-item--active': isExpanded(item.key),\r\n 'collapse-item--disabled': item.disabled,\r\n }\"\r\n >\r\n <!-- 面板头部 -->\r\n <div\r\n class=\"collapse-item__header\"\r\n role=\"button\"\r\n :aria-expanded=\"isExpanded(item.key)\"\r\n :aria-controls=\"`collapse-content-${item.key}`\"\r\n :aria-disabled=\"item.disabled\"\r\n :tabindex=\"item.disabled ? -1 : 0\"\r\n @click=\"!item.disabled && toggle(item.key)\"\r\n @keydown=\"handleKeyDown($event, item.key)\"\r\n >\r\n <!-- 展开图标 -->\r\n <span\r\n class=\"collapse-item__arrow\"\r\n :class=\"{ 'collapse-item__arrow--expanded': isExpanded(item.key) }\"\r\n >\r\n <C_Icon name=\"mdi:chevron-right\" :size=\"16\" color=\"currentColor\" />\r\n </span>\r\n\r\n <!-- 标题区域 -->\r\n <div class=\"collapse-item__title-area\">\r\n <slot\r\n :name=\"`header-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n >\r\n <div class=\"collapse-item__title-group\">\r\n <C_Icon\r\n v-if=\"item.icon\"\r\n :name=\"item.icon\"\r\n :size=\"18\"\r\n color=\"currentColor\"\r\n class=\"collapse-item__icon\"\r\n />\r\n <span class=\"collapse-item__title\">{{ item.title }}</span>\r\n <span v-if=\"item.subtitle\" class=\"collapse-item__subtitle\">\r\n {{ item.subtitle }}\r\n </span>\r\n </div>\r\n </slot>\r\n </div>\r\n\r\n <!-- 头部右侧操作区 -->\r\n <div\r\n v-if=\"$slots[`extra-${item.key}`]\"\r\n class=\"collapse-item__extra\"\r\n @click.stop\r\n >\r\n <slot\r\n :name=\"`extra-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- 面板内容 -->\r\n <Transition\r\n name=\"collapse-slide\"\r\n @enter=\"onEnter\"\r\n @after-enter=\"onAfterEnter\"\r\n @leave=\"onLeave\"\r\n @after-leave=\"onAfterLeave\"\r\n >\r\n <div\r\n v-show=\"isExpanded(item.key)\"\r\n :id=\"`collapse-content-${item.key}`\"\r\n class=\"collapse-item__content-wrapper\"\r\n role=\"region\"\r\n :aria-labelledby=\"`collapse-header-${item.key}`\"\r\n >\r\n <div v-if=\"shouldRender(item)\" class=\"collapse-item__content\">\r\n <slot\r\n :name=\"`panel-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n />\r\n </div>\r\n </div>\r\n </Transition>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, toRef } from \"vue\";\r\nimport C_Icon from \"../C_Icon/index.vue\";\r\nimport { useCollapsePanel } from \"./composables/useCollapsePanel\";\r\nimport type {\r\n CollapsePanelExpose,\r\n CollapsePanelItem,\r\n CollapsePanelVariant,\r\n ExpandIconPosition,\r\n} from \"./types\";\r\n\r\ndefineOptions({ name: \"C_CollapsePanel\" });\r\n\r\ninterface Props {\r\n /** 面板项配置数组 */\r\n items: CollapsePanelItem[];\r\n /** 当前激活面板的 key 数组(v-model) */\r\n activeKeys?: string[];\r\n /** 默认展开的面板 key 数组 */\r\n defaultActiveKeys?: string[];\r\n /** 是否手风琴模式 */\r\n accordion?: boolean;\r\n /** 面板样式变体 */\r\n variant?: CollapsePanelVariant;\r\n /** 展开图标位置 */\r\n expandIconPosition?: ExpandIconPosition;\r\n /** 是否显示边框 */\r\n bordered?: boolean;\r\n /** 展开状态 localStorage 持久化 key */\r\n persistKey?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n activeKeys: undefined,\r\n defaultActiveKeys: () => [],\r\n accordion: false,\r\n variant: \"default\",\r\n expandIconPosition: \"left\",\r\n bordered: true,\r\n persistKey: undefined,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n \"update:activeKeys\": [keys: string[]];\r\n expand: [key: string];\r\n collapse: [key: string];\r\n change: [activeKeys: string[]];\r\n}>();\r\n\r\nconst containerRef = ref<HTMLElement | null>(null);\r\nconst panelRefs = ref<Map<string, HTMLElement>>(new Map());\r\n\r\nconst setPanelRef = (key: string, el: HTMLElement | null) => {\r\n if (el) {\r\n panelRefs.value.set(key, el);\r\n } else {\r\n panelRefs.value.delete(key);\r\n }\r\n};\r\n\r\nconst {\r\n isExpanded,\r\n shouldRender,\r\n toggle,\r\n expandAll,\r\n collapseAll,\r\n getActiveKeys,\r\n handleKeyDown,\r\n} = useCollapsePanel({\r\n items: toRef(props, \"items\"),\r\n activeKeys: toRef(props, \"activeKeys\"),\r\n defaultActiveKeys: props.defaultActiveKeys,\r\n accordion: toRef(props, \"accordion\"),\r\n persistKey: toRef(props, \"persistKey\"),\r\n onChange: (keys) => {\r\n emit(\"update:activeKeys\", keys);\r\n emit(\"change\", keys);\r\n },\r\n onExpand: (key) => emit(\"expand\", key),\r\n onCollapse: (key) => emit(\"collapse\", key),\r\n});\r\n\r\n/* ─── 展开/折叠动画 ──────────────────────────── */\r\nconst onEnter = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = \"0\";\r\n element.style.overflow = \"hidden\";\r\n /* 强制 reflow */\r\n void element.offsetHeight;\r\n element.style.height = `${element.scrollHeight}px`;\r\n};\r\n\r\nconst onAfterEnter = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = \"\";\r\n element.style.overflow = \"\";\r\n};\r\n\r\nconst onLeave = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = `${element.scrollHeight}px`;\r\n element.style.overflow = \"hidden\";\r\n void element.offsetHeight;\r\n element.style.height = \"0\";\r\n};\r\n\r\nconst onAfterLeave = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = \"\";\r\n element.style.overflow = \"\";\r\n};\r\n\r\n/* ─── 滚动到指定面板 ─────────────────────────── */\r\nconst scrollToPanel = (key: string) => {\r\n const el = panelRefs.value.get(key);\r\n if (el) {\r\n el.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\r\n }\r\n};\r\n\r\n/* ─── 暴露方法 ──────────────────────────────── */\r\ndefineExpose<CollapsePanelExpose>({\r\n expandAll,\r\n collapseAll,\r\n toggle,\r\n getActiveKeys,\r\n scrollToPanel,\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2026-02-25\r\n * @Description: 折叠面板组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n ref=\"containerRef\"\r\n class=\"c-collapse-panel\"\r\n :class=\"[\r\n `c-collapse-panel--${variant}`,\r\n {\r\n 'c-collapse-panel--bordered': bordered,\r\n 'c-collapse-panel--icon-right': expandIconPosition === 'right',\r\n },\r\n ]\"\r\n >\r\n <div\r\n v-for=\"item in items\"\r\n :key=\"item.key\"\r\n :ref=\"(el) => setPanelRef(item.key, el as HTMLElement)\"\r\n class=\"collapse-item\"\r\n :class=\"{\r\n 'collapse-item--active': isExpanded(item.key),\r\n 'collapse-item--disabled': item.disabled,\r\n }\"\r\n >\r\n <!-- 面板头部 -->\r\n <div\r\n class=\"collapse-item__header\"\r\n role=\"button\"\r\n :aria-expanded=\"isExpanded(item.key)\"\r\n :aria-controls=\"`collapse-content-${item.key}`\"\r\n :aria-disabled=\"item.disabled\"\r\n :tabindex=\"item.disabled ? -1 : 0\"\r\n @click=\"!item.disabled && toggle(item.key)\"\r\n @keydown=\"handleKeyDown($event, item.key)\"\r\n >\r\n <!-- 展开图标 -->\r\n <span\r\n class=\"collapse-item__arrow\"\r\n :class=\"{ 'collapse-item__arrow--expanded': isExpanded(item.key) }\"\r\n >\r\n <C_Icon name=\"mdi:chevron-right\" :size=\"16\" color=\"currentColor\" />\r\n </span>\r\n\r\n <!-- 标题区域 -->\r\n <div class=\"collapse-item__title-area\">\r\n <slot\r\n :name=\"`header-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n >\r\n <div class=\"collapse-item__title-group\">\r\n <C_Icon\r\n v-if=\"item.icon\"\r\n :name=\"item.icon\"\r\n :size=\"18\"\r\n color=\"currentColor\"\r\n class=\"collapse-item__icon\"\r\n />\r\n <span class=\"collapse-item__title\">{{ item.title }}</span>\r\n <span v-if=\"item.subtitle\" class=\"collapse-item__subtitle\">\r\n {{ item.subtitle }}\r\n </span>\r\n </div>\r\n </slot>\r\n </div>\r\n\r\n <!-- 头部右侧操作区 -->\r\n <div\r\n v-if=\"$slots[`extra-${item.key}`]\"\r\n class=\"collapse-item__extra\"\r\n @click.stop\r\n >\r\n <slot\r\n :name=\"`extra-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- 面板内容 -->\r\n <Transition\r\n name=\"collapse-slide\"\r\n @enter=\"onEnter\"\r\n @after-enter=\"onAfterEnter\"\r\n @leave=\"onLeave\"\r\n @after-leave=\"onAfterLeave\"\r\n >\r\n <div\r\n v-show=\"isExpanded(item.key)\"\r\n :id=\"`collapse-content-${item.key}`\"\r\n class=\"collapse-item__content-wrapper\"\r\n role=\"region\"\r\n :aria-labelledby=\"`collapse-header-${item.key}`\"\r\n >\r\n <div v-if=\"shouldRender(item)\" class=\"collapse-item__content\">\r\n <slot\r\n :name=\"`panel-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n />\r\n </div>\r\n </div>\r\n </Transition>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, toRef } from \"vue\";\r\nimport C_Icon from \"../C_Icon/index.vue\";\r\nimport { useCollapsePanel } from \"./composables/useCollapsePanel\";\r\nimport type {\r\n CollapsePanelExpose,\r\n CollapsePanelItem,\r\n CollapsePanelVariant,\r\n ExpandIconPosition,\r\n} from \"./types\";\r\n\r\ndefineOptions({ name: \"C_CollapsePanel\" });\r\n\r\ninterface Props {\r\n /** 面板项配置数组 */\r\n items: CollapsePanelItem[];\r\n /** 当前激活面板的 key 数组(v-model) */\r\n activeKeys?: string[];\r\n /** 默认展开的面板 key 数组 */\r\n defaultActiveKeys?: string[];\r\n /** 是否手风琴模式 */\r\n accordion?: boolean;\r\n /** 面板样式变体 */\r\n variant?: CollapsePanelVariant;\r\n /** 展开图标位置 */\r\n expandIconPosition?: ExpandIconPosition;\r\n /** 是否显示边框 */\r\n bordered?: boolean;\r\n /** 展开状态 localStorage 持久化 key */\r\n persistKey?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n activeKeys: undefined,\r\n defaultActiveKeys: () => [],\r\n accordion: false,\r\n variant: \"default\",\r\n expandIconPosition: \"left\",\r\n bordered: true,\r\n persistKey: undefined,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n \"update:activeKeys\": [keys: string[]];\r\n expand: [key: string];\r\n collapse: [key: string];\r\n change: [activeKeys: string[]];\r\n}>();\r\n\r\nconst containerRef = ref<HTMLElement | null>(null);\r\nconst panelRefs = ref<Map<string, HTMLElement>>(new Map());\r\n\r\nconst setPanelRef = (key: string, el: HTMLElement | null) => {\r\n if (el) {\r\n panelRefs.value.set(key, el);\r\n } else {\r\n panelRefs.value.delete(key);\r\n }\r\n};\r\n\r\nconst {\r\n isExpanded,\r\n shouldRender,\r\n toggle,\r\n expandAll,\r\n collapseAll,\r\n getActiveKeys,\r\n handleKeyDown,\r\n} = useCollapsePanel({\r\n items: toRef(props, \"items\"),\r\n activeKeys: toRef(props, \"activeKeys\"),\r\n defaultActiveKeys: props.defaultActiveKeys,\r\n accordion: toRef(props, \"accordion\"),\r\n persistKey: toRef(props, \"persistKey\"),\r\n onChange: (keys) => {\r\n emit(\"update:activeKeys\", keys);\r\n emit(\"change\", keys);\r\n },\r\n onExpand: (key) => emit(\"expand\", key),\r\n onCollapse: (key) => emit(\"collapse\", key),\r\n});\r\n\r\n/* ─── 展开/折叠动画 ──────────────────────────── */\r\nconst onEnter = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = \"0\";\r\n element.style.overflow = \"hidden\";\r\n /* 强制 reflow */\r\n void element.offsetHeight;\r\n element.style.height = `${element.scrollHeight}px`;\r\n};\r\n\r\nconst onAfterEnter = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = \"\";\r\n element.style.overflow = \"\";\r\n};\r\n\r\nconst onLeave = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = `${element.scrollHeight}px`;\r\n element.style.overflow = \"hidden\";\r\n void element.offsetHeight;\r\n element.style.height = \"0\";\r\n};\r\n\r\nconst onAfterLeave = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = \"\";\r\n element.style.overflow = \"\";\r\n};\r\n\r\n/* ─── 滚动到指定面板 ─────────────────────────── */\r\nconst scrollToPanel = (key: string) => {\r\n const el = panelRefs.value.get(key);\r\n if (el) {\r\n el.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\r\n }\r\n};\r\n\r\n/* ─── 暴露方法 ──────────────────────────────── */\r\ndefineExpose<CollapsePanelExpose>({\r\n expandAll,\r\n collapseAll,\r\n toggle,\r\n getActiveKeys,\r\n scrollToPanel,\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2026-02-25\r\n * @Description: 折叠面板组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n ref=\"containerRef\"\r\n class=\"c-collapse-panel\"\r\n :class=\"[\r\n `c-collapse-panel--${variant}`,\r\n {\r\n 'c-collapse-panel--bordered': bordered,\r\n 'c-collapse-panel--icon-right': expandIconPosition === 'right',\r\n },\r\n ]\"\r\n >\r\n <div\r\n v-for=\"item in items\"\r\n :key=\"item.key\"\r\n :ref=\"(el) => setPanelRef(item.key, el as HTMLElement)\"\r\n class=\"collapse-item\"\r\n :class=\"{\r\n 'collapse-item--active': isExpanded(item.key),\r\n 'collapse-item--disabled': item.disabled,\r\n }\"\r\n >\r\n <!-- 面板头部 -->\r\n <div\r\n class=\"collapse-item__header\"\r\n role=\"button\"\r\n :aria-expanded=\"isExpanded(item.key)\"\r\n :aria-controls=\"`collapse-content-${item.key}`\"\r\n :aria-disabled=\"item.disabled\"\r\n :tabindex=\"item.disabled ? -1 : 0\"\r\n @click=\"!item.disabled && toggle(item.key)\"\r\n @keydown=\"handleKeyDown($event, item.key)\"\r\n >\r\n <!-- 展开图标 -->\r\n <span\r\n class=\"collapse-item__arrow\"\r\n :class=\"{ 'collapse-item__arrow--expanded': isExpanded(item.key) }\"\r\n >\r\n <C_Icon name=\"mdi:chevron-right\" :size=\"16\" color=\"currentColor\" />\r\n </span>\r\n\r\n <!-- 标题区域 -->\r\n <div class=\"collapse-item__title-area\">\r\n <slot\r\n :name=\"`header-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n >\r\n <div class=\"collapse-item__title-group\">\r\n <C_Icon\r\n v-if=\"item.icon\"\r\n :name=\"item.icon\"\r\n :size=\"18\"\r\n color=\"currentColor\"\r\n class=\"collapse-item__icon\"\r\n />\r\n <span class=\"collapse-item__title\">{{ item.title }}</span>\r\n <span v-if=\"item.subtitle\" class=\"collapse-item__subtitle\">\r\n {{ item.subtitle }}\r\n </span>\r\n </div>\r\n </slot>\r\n </div>\r\n\r\n <!-- 头部右侧操作区 -->\r\n <div\r\n v-if=\"$slots[`extra-${item.key}`]\"\r\n class=\"collapse-item__extra\"\r\n @click.stop\r\n >\r\n <slot\r\n :name=\"`extra-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- 面板内容 -->\r\n <Transition\r\n name=\"collapse-slide\"\r\n @enter=\"onEnter\"\r\n @after-enter=\"onAfterEnter\"\r\n @leave=\"onLeave\"\r\n @after-leave=\"onAfterLeave\"\r\n >\r\n <div\r\n v-show=\"isExpanded(item.key)\"\r\n :id=\"`collapse-content-${item.key}`\"\r\n class=\"collapse-item__content-wrapper\"\r\n role=\"region\"\r\n :aria-labelledby=\"`collapse-header-${item.key}`\"\r\n >\r\n <div v-if=\"shouldRender(item)\" class=\"collapse-item__content\">\r\n <slot\r\n :name=\"`panel-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n />\r\n </div>\r\n </div>\r\n </Transition>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, toRef } from \"vue\";\r\nimport C_Icon from \"../C_Icon/index.vue\";\r\nimport { useCollapsePanel } from \"./composables/useCollapsePanel\";\r\nimport type {\r\n CollapsePanelExpose,\r\n CollapsePanelItem,\r\n CollapsePanelVariant,\r\n ExpandIconPosition,\r\n} from \"./types\";\r\n\r\ndefineOptions({ name: \"C_CollapsePanel\" });\r\n\r\ninterface Props {\r\n /** 面板项配置数组 */\r\n items: CollapsePanelItem[];\r\n /** 当前激活面板的 key 数组(v-model) */\r\n activeKeys?: string[];\r\n /** 默认展开的面板 key 数组 */\r\n defaultActiveKeys?: string[];\r\n /** 是否手风琴模式 */\r\n accordion?: boolean;\r\n /** 面板样式变体 */\r\n variant?: CollapsePanelVariant;\r\n /** 展开图标位置 */\r\n expandIconPosition?: ExpandIconPosition;\r\n /** 是否显示边框 */\r\n bordered?: boolean;\r\n /** 展开状态 localStorage 持久化 key */\r\n persistKey?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n activeKeys: undefined,\r\n defaultActiveKeys: () => [],\r\n accordion: false,\r\n variant: \"default\",\r\n expandIconPosition: \"left\",\r\n bordered: true,\r\n persistKey: undefined,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n \"update:activeKeys\": [keys: string[]];\r\n expand: [key: string];\r\n collapse: [key: string];\r\n change: [activeKeys: string[]];\r\n}>();\r\n\r\nconst containerRef = ref<HTMLElement | null>(null);\r\nconst panelRefs = ref<Map<string, HTMLElement>>(new Map());\r\n\r\nconst setPanelRef = (key: string, el: HTMLElement | null) => {\r\n if (el) {\r\n panelRefs.value.set(key, el);\r\n } else {\r\n panelRefs.value.delete(key);\r\n }\r\n};\r\n\r\nconst {\r\n isExpanded,\r\n shouldRender,\r\n toggle,\r\n expandAll,\r\n collapseAll,\r\n getActiveKeys,\r\n handleKeyDown,\r\n} = useCollapsePanel({\r\n items: toRef(props, \"items\"),\r\n activeKeys: toRef(props, \"activeKeys\"),\r\n defaultActiveKeys: props.defaultActiveKeys,\r\n accordion: toRef(props, \"accordion\"),\r\n persistKey: toRef(props, \"persistKey\"),\r\n onChange: (keys) => {\r\n emit(\"update:activeKeys\", keys);\r\n emit(\"change\", keys);\r\n },\r\n onExpand: (key) => emit(\"expand\", key),\r\n onCollapse: (key) => emit(\"collapse\", key),\r\n});\r\n\r\n/* ─── 展开/折叠动画 ──────────────────────────── */\r\nconst onEnter = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = \"0\";\r\n element.style.overflow = \"hidden\";\r\n /* 强制 reflow */\r\n void element.offsetHeight;\r\n element.style.height = `${element.scrollHeight}px`;\r\n};\r\n\r\nconst onAfterEnter = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = \"\";\r\n element.style.overflow = \"\";\r\n};\r\n\r\nconst onLeave = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = `${element.scrollHeight}px`;\r\n element.style.overflow = \"hidden\";\r\n void element.offsetHeight;\r\n element.style.height = \"0\";\r\n};\r\n\r\nconst onAfterLeave = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = \"\";\r\n element.style.overflow = \"\";\r\n};\r\n\r\n/* ─── 滚动到指定面板 ─────────────────────────── */\r\nconst scrollToPanel = (key: string) => {\r\n const el = panelRefs.value.get(key);\r\n if (el) {\r\n el.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\r\n }\r\n};\r\n\r\n/* ─── 暴露方法 ──────────────────────────────── */\r\ndefineExpose<CollapsePanelExpose>({\r\n expandAll,\r\n collapseAll,\r\n toggle,\r\n getActiveKeys,\r\n scrollToPanel,\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"C_CollapsePanel2.js","names":["variant","bordered","expandIconPosition","items","$slots"],"sources":["../src/components/C_CollapsePanel/composables/useCollapsePanel.ts","../src/components/C_CollapsePanel/index.vue","../src/components/C_CollapsePanel/index.vue","../src/components/C_CollapsePanel/index.vue"],"sourcesContent":["import { ref, computed, watch } from 'vue'\r\nimport type { Ref } from 'vue'\r\nimport type { CollapsePanelItem } from '../types'\r\n\r\ninterface UseCollapsePanelOptions {\r\n /** 面板项配置 */\r\n items: Ref<CollapsePanelItem[]>\r\n /** 外部 v-model activeKeys */\r\n activeKeys: Ref<string[] | undefined>\r\n /** 非受控时的默认激活 key */\r\n defaultActiveKeys: string[]\r\n /** 是否手风琴模式 */\r\n accordion: Ref<boolean>\r\n /** localStorage 持久化 key */\r\n persistKey: Ref<string | undefined>\r\n /** activeKeys 变化回调 */\r\n onChange?: (keys: string[]) => void\r\n /** 单面板展开回调 */\r\n onExpand?: (key: string) => void\r\n /** 单面板折叠回调 */\r\n onCollapse?: (key: string) => void\r\n}\r\n\r\n/**\r\n * 折叠面板展开/折叠核心逻辑\r\n */\r\nexport function useCollapsePanel(options: UseCollapsePanelOptions) {\r\n const {\r\n items,\r\n activeKeys: externalKeys,\r\n defaultActiveKeys,\r\n accordion,\r\n persistKey,\r\n onChange,\r\n onExpand,\r\n onCollapse,\r\n } = options\r\n\r\n /* ─── 持久化读取 ──────────────────────────────── */\r\n const loadPersistedKeys = (): string[] | null => {\r\n if (!persistKey.value) return null\r\n try {\r\n const raw = localStorage.getItem(`collapse-panel:${persistKey.value}`)\r\n return raw ? JSON.parse(raw) : null\r\n } catch {\r\n return null\r\n }\r\n }\r\n\r\n const savePersistedKeys = (keys: string[]) => {\r\n if (!persistKey.value) return\r\n try {\r\n localStorage.setItem(\r\n `collapse-panel:${persistKey.value}`,\r\n JSON.stringify(keys),\r\n )\r\n } catch {\r\n /* 静默失败 */\r\n }\r\n }\r\n\r\n /* ─── 内部状态 ────────────────────────────────── */\r\n const resolveInitialKeys = (): string[] => {\r\n /* 优先级:外部 v-model > 持久化 > 默认值 */\r\n if (externalKeys.value !== undefined) return [...externalKeys.value]\r\n const persisted = loadPersistedKeys()\r\n if (persisted) return persisted\r\n return [...defaultActiveKeys]\r\n }\r\n\r\n const internalKeys = ref<string[]>(resolveInitialKeys())\r\n\r\n /** 懒渲染追踪:记录哪些面板曾被展开过 */\r\n const renderedOnce = ref<Set<string>>(new Set(internalKeys.value))\r\n\r\n /* ─── 计算属性 ────────────────────────────────── */\r\n /** 当前激活的 key 数组(兼容受控 / 非受控) */\r\n const currentKeys = computed<string[]>({\r\n get: () =>\r\n externalKeys.value !== undefined\r\n ? externalKeys.value\r\n : internalKeys.value,\r\n set: (val) => {\r\n internalKeys.value = val\r\n },\r\n })\r\n\r\n /**\r\n * 判断面板是否展开\r\n */\r\n const isExpanded = (key: string): boolean => {\r\n return currentKeys.value.includes(key)\r\n }\r\n\r\n /**\r\n * 判断面板是否应该渲染内容\r\n * - lazy 面板只有被展开过至少一次后才渲染\r\n * - destroyOnCollapse 面板在折叠后销毁 DOM\r\n */\r\n const shouldRender = (item: CollapsePanelItem): boolean => {\r\n const expanded = isExpanded(item.key)\r\n\r\n if (item.destroyOnCollapse) return expanded\r\n if (item.lazy) return renderedOnce.value.has(item.key)\r\n return true\r\n }\r\n\r\n /* ─── 操作方法 ────────────────────────────────── */\r\n const updateKeys = (newKeys: string[]) => {\r\n currentKeys.value = newKeys\r\n onChange?.(newKeys)\r\n savePersistedKeys(newKeys)\r\n }\r\n\r\n const toggle = (key: string) => {\r\n const item = items.value.find((i) => i.key === key)\r\n if (!item || item.disabled) return\r\n\r\n const expanded = isExpanded(key)\r\n\r\n if (expanded) {\r\n /* 折叠 */\r\n updateKeys(currentKeys.value.filter((k) => k !== key))\r\n onCollapse?.(key)\r\n } else {\r\n /* 展开 */\r\n renderedOnce.value.add(key)\r\n\r\n if (accordion.value) {\r\n /* 手风琴模式:关闭其他面板 */\r\n const prevKeys = currentKeys.value\r\n updateKeys([key])\r\n /* 通知被折叠的面板 */\r\n prevKeys.forEach((k) => {\r\n if (k !== key) onCollapse?.(k)\r\n })\r\n } else {\r\n updateKeys([...currentKeys.value, key])\r\n }\r\n onExpand?.(key)\r\n }\r\n }\r\n\r\n const expandAll = () => {\r\n if (accordion.value) return /* 手风琴模式不支持全展开 */\r\n\r\n const allKeys = items.value.filter((i) => !i.disabled).map((i) => i.key)\r\n\r\n allKeys.forEach((k) => renderedOnce.value.add(k))\r\n updateKeys(allKeys)\r\n }\r\n\r\n const collapseAll = () => {\r\n updateKeys([])\r\n }\r\n\r\n const getActiveKeys = (): string[] => {\r\n return [...currentKeys.value]\r\n }\r\n\r\n /* ─── 键盘导航 ────────────────────────────────── */\r\n const handleKeyDown = (e: KeyboardEvent, key: string) => {\r\n if (['Enter', ' '].includes(e.key)) {\r\n e.preventDefault()\r\n toggle(key)\r\n }\r\n }\r\n\r\n /* ─── 同步外部 v-model 变化 ───────────────────── */\r\n watch(\r\n () => externalKeys.value,\r\n (newVal) => {\r\n if (newVal !== undefined) {\r\n internalKeys.value = [...newVal]\r\n newVal.forEach((k) => renderedOnce.value.add(k))\r\n savePersistedKeys(newVal)\r\n }\r\n },\r\n )\r\n\r\n return {\r\n currentKeys,\r\n renderedOnce,\r\n isExpanded,\r\n shouldRender,\r\n toggle,\r\n expandAll,\r\n collapseAll,\r\n getActiveKeys,\r\n handleKeyDown,\r\n }\r\n}\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2026-02-25\r\n * @Description: 折叠面板组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n ref=\"containerRef\"\r\n class=\"c-collapse-panel\"\r\n :class=\"[\r\n `c-collapse-panel--${variant}`,\r\n {\r\n 'c-collapse-panel--bordered': bordered,\r\n 'c-collapse-panel--icon-right': expandIconPosition === 'right',\r\n },\r\n ]\"\r\n >\r\n <div\r\n v-for=\"item in items\"\r\n :key=\"item.key\"\r\n :ref=\"(el) => setPanelRef(item.key, el as HTMLElement)\"\r\n class=\"collapse-item\"\r\n :class=\"{\r\n 'collapse-item--active': isExpanded(item.key),\r\n 'collapse-item--disabled': item.disabled,\r\n }\"\r\n >\r\n <!-- 面板头部 -->\r\n <div\r\n class=\"collapse-item__header\"\r\n role=\"button\"\r\n :aria-expanded=\"isExpanded(item.key)\"\r\n :aria-controls=\"`collapse-content-${item.key}`\"\r\n :aria-disabled=\"item.disabled\"\r\n :tabindex=\"item.disabled ? -1 : 0\"\r\n @click=\"!item.disabled && toggle(item.key)\"\r\n @keydown=\"handleKeyDown($event, item.key)\"\r\n >\r\n <!-- 展开图标 -->\r\n <span\r\n class=\"collapse-item__arrow\"\r\n :class=\"{ 'collapse-item__arrow--expanded': isExpanded(item.key) }\"\r\n >\r\n <C_Icon name=\"mdi:chevron-right\" :size=\"16\" color=\"currentColor\" />\r\n </span>\r\n\r\n <!-- 标题区域 -->\r\n <div class=\"collapse-item__title-area\">\r\n <slot\r\n :name=\"`header-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n >\r\n <div class=\"collapse-item__title-group\">\r\n <C_Icon\r\n v-if=\"item.icon\"\r\n :name=\"item.icon\"\r\n :size=\"18\"\r\n color=\"currentColor\"\r\n class=\"collapse-item__icon\"\r\n />\r\n <span class=\"collapse-item__title\">{{ item.title }}</span>\r\n <span v-if=\"item.subtitle\" class=\"collapse-item__subtitle\">\r\n {{ item.subtitle }}\r\n </span>\r\n </div>\r\n </slot>\r\n </div>\r\n\r\n <!-- 头部右侧操作区 -->\r\n <div\r\n v-if=\"$slots[`extra-${item.key}`]\"\r\n class=\"collapse-item__extra\"\r\n @click.stop\r\n >\r\n <slot\r\n :name=\"`extra-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- 面板内容 -->\r\n <Transition\r\n name=\"collapse-slide\"\r\n @enter=\"onEnter\"\r\n @after-enter=\"onAfterEnter\"\r\n @leave=\"onLeave\"\r\n @after-leave=\"onAfterLeave\"\r\n >\r\n <div\r\n v-show=\"isExpanded(item.key)\"\r\n :id=\"`collapse-content-${item.key}`\"\r\n class=\"collapse-item__content-wrapper\"\r\n role=\"region\"\r\n :aria-labelledby=\"`collapse-header-${item.key}`\"\r\n >\r\n <div v-if=\"shouldRender(item)\" class=\"collapse-item__content\">\r\n <slot\r\n :name=\"`panel-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n />\r\n </div>\r\n </div>\r\n </Transition>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, toRef } from \"vue\";\r\nimport C_Icon from \"../C_Icon/index.vue\";\r\nimport { useCollapsePanel } from \"./composables/useCollapsePanel\";\r\nimport type {\r\n CollapsePanelExpose,\r\n CollapsePanelItem,\r\n CollapsePanelVariant,\r\n ExpandIconPosition,\r\n} from \"./types\";\r\n\r\ndefineOptions({ name: \"C_CollapsePanel\" });\r\n\r\ninterface Props {\r\n /** 面板项配置数组 */\r\n items: CollapsePanelItem[];\r\n /** 当前激活面板的 key 数组(v-model) */\r\n activeKeys?: string[];\r\n /** 默认展开的面板 key 数组 */\r\n defaultActiveKeys?: string[];\r\n /** 是否手风琴模式 */\r\n accordion?: boolean;\r\n /** 面板样式变体 */\r\n variant?: CollapsePanelVariant;\r\n /** 展开图标位置 */\r\n expandIconPosition?: ExpandIconPosition;\r\n /** 是否显示边框 */\r\n bordered?: boolean;\r\n /** 展开状态 localStorage 持久化 key */\r\n persistKey?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n activeKeys: undefined,\r\n defaultActiveKeys: () => [],\r\n accordion: false,\r\n variant: \"default\",\r\n expandIconPosition: \"left\",\r\n bordered: true,\r\n persistKey: undefined,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n \"update:activeKeys\": [keys: string[]];\r\n expand: [key: string];\r\n collapse: [key: string];\r\n change: [activeKeys: string[]];\r\n}>();\r\n\r\nconst containerRef = ref<HTMLElement | null>(null);\r\nconst panelRefs = ref<Map<string, HTMLElement>>(new Map());\r\n\r\nconst setPanelRef = (key: string, el: HTMLElement | null) => {\r\n if (el) {\r\n panelRefs.value.set(key, el);\r\n } else {\r\n panelRefs.value.delete(key);\r\n }\r\n};\r\n\r\nconst {\r\n isExpanded,\r\n shouldRender,\r\n toggle,\r\n expandAll,\r\n collapseAll,\r\n getActiveKeys,\r\n handleKeyDown,\r\n} = useCollapsePanel({\r\n items: toRef(props, \"items\"),\r\n activeKeys: toRef(props, \"activeKeys\"),\r\n defaultActiveKeys: props.defaultActiveKeys,\r\n accordion: toRef(props, \"accordion\"),\r\n persistKey: toRef(props, \"persistKey\"),\r\n onChange: (keys) => {\r\n emit(\"update:activeKeys\", keys);\r\n emit(\"change\", keys);\r\n },\r\n onExpand: (key) => emit(\"expand\", key),\r\n onCollapse: (key) => emit(\"collapse\", key),\r\n});\r\n\r\n/* ─── 展开/折叠动画 ──────────────────────────── */\r\nconst onEnter = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = \"0\";\r\n element.style.overflow = \"hidden\";\r\n /* 强制 reflow */\r\n void element.offsetHeight;\r\n element.style.height = `${element.scrollHeight}px`;\r\n};\r\n\r\nconst onAfterEnter = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = \"\";\r\n element.style.overflow = \"\";\r\n};\r\n\r\nconst onLeave = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = `${element.scrollHeight}px`;\r\n element.style.overflow = \"hidden\";\r\n void element.offsetHeight;\r\n element.style.height = \"0\";\r\n};\r\n\r\nconst onAfterLeave = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = \"\";\r\n element.style.overflow = \"\";\r\n};\r\n\r\n/* ─── 滚动到指定面板 ─────────────────────────── */\r\nconst scrollToPanel = (key: string) => {\r\n const el = panelRefs.value.get(key);\r\n if (el) {\r\n el.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\r\n }\r\n};\r\n\r\n/* ─── 暴露方法 ──────────────────────────────── */\r\ndefineExpose<CollapsePanelExpose>({\r\n expandAll,\r\n collapseAll,\r\n toggle,\r\n getActiveKeys,\r\n scrollToPanel,\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2026-02-25\r\n * @Description: 折叠面板组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n ref=\"containerRef\"\r\n class=\"c-collapse-panel\"\r\n :class=\"[\r\n `c-collapse-panel--${variant}`,\r\n {\r\n 'c-collapse-panel--bordered': bordered,\r\n 'c-collapse-panel--icon-right': expandIconPosition === 'right',\r\n },\r\n ]\"\r\n >\r\n <div\r\n v-for=\"item in items\"\r\n :key=\"item.key\"\r\n :ref=\"(el) => setPanelRef(item.key, el as HTMLElement)\"\r\n class=\"collapse-item\"\r\n :class=\"{\r\n 'collapse-item--active': isExpanded(item.key),\r\n 'collapse-item--disabled': item.disabled,\r\n }\"\r\n >\r\n <!-- 面板头部 -->\r\n <div\r\n class=\"collapse-item__header\"\r\n role=\"button\"\r\n :aria-expanded=\"isExpanded(item.key)\"\r\n :aria-controls=\"`collapse-content-${item.key}`\"\r\n :aria-disabled=\"item.disabled\"\r\n :tabindex=\"item.disabled ? -1 : 0\"\r\n @click=\"!item.disabled && toggle(item.key)\"\r\n @keydown=\"handleKeyDown($event, item.key)\"\r\n >\r\n <!-- 展开图标 -->\r\n <span\r\n class=\"collapse-item__arrow\"\r\n :class=\"{ 'collapse-item__arrow--expanded': isExpanded(item.key) }\"\r\n >\r\n <C_Icon name=\"mdi:chevron-right\" :size=\"16\" color=\"currentColor\" />\r\n </span>\r\n\r\n <!-- 标题区域 -->\r\n <div class=\"collapse-item__title-area\">\r\n <slot\r\n :name=\"`header-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n >\r\n <div class=\"collapse-item__title-group\">\r\n <C_Icon\r\n v-if=\"item.icon\"\r\n :name=\"item.icon\"\r\n :size=\"18\"\r\n color=\"currentColor\"\r\n class=\"collapse-item__icon\"\r\n />\r\n <span class=\"collapse-item__title\">{{ item.title }}</span>\r\n <span v-if=\"item.subtitle\" class=\"collapse-item__subtitle\">\r\n {{ item.subtitle }}\r\n </span>\r\n </div>\r\n </slot>\r\n </div>\r\n\r\n <!-- 头部右侧操作区 -->\r\n <div\r\n v-if=\"$slots[`extra-${item.key}`]\"\r\n class=\"collapse-item__extra\"\r\n @click.stop\r\n >\r\n <slot\r\n :name=\"`extra-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- 面板内容 -->\r\n <Transition\r\n name=\"collapse-slide\"\r\n @enter=\"onEnter\"\r\n @after-enter=\"onAfterEnter\"\r\n @leave=\"onLeave\"\r\n @after-leave=\"onAfterLeave\"\r\n >\r\n <div\r\n v-show=\"isExpanded(item.key)\"\r\n :id=\"`collapse-content-${item.key}`\"\r\n class=\"collapse-item__content-wrapper\"\r\n role=\"region\"\r\n :aria-labelledby=\"`collapse-header-${item.key}`\"\r\n >\r\n <div v-if=\"shouldRender(item)\" class=\"collapse-item__content\">\r\n <slot\r\n :name=\"`panel-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n />\r\n </div>\r\n </div>\r\n </Transition>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, toRef } from \"vue\";\r\nimport C_Icon from \"../C_Icon/index.vue\";\r\nimport { useCollapsePanel } from \"./composables/useCollapsePanel\";\r\nimport type {\r\n CollapsePanelExpose,\r\n CollapsePanelItem,\r\n CollapsePanelVariant,\r\n ExpandIconPosition,\r\n} from \"./types\";\r\n\r\ndefineOptions({ name: \"C_CollapsePanel\" });\r\n\r\ninterface Props {\r\n /** 面板项配置数组 */\r\n items: CollapsePanelItem[];\r\n /** 当前激活面板的 key 数组(v-model) */\r\n activeKeys?: string[];\r\n /** 默认展开的面板 key 数组 */\r\n defaultActiveKeys?: string[];\r\n /** 是否手风琴模式 */\r\n accordion?: boolean;\r\n /** 面板样式变体 */\r\n variant?: CollapsePanelVariant;\r\n /** 展开图标位置 */\r\n expandIconPosition?: ExpandIconPosition;\r\n /** 是否显示边框 */\r\n bordered?: boolean;\r\n /** 展开状态 localStorage 持久化 key */\r\n persistKey?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n activeKeys: undefined,\r\n defaultActiveKeys: () => [],\r\n accordion: false,\r\n variant: \"default\",\r\n expandIconPosition: \"left\",\r\n bordered: true,\r\n persistKey: undefined,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n \"update:activeKeys\": [keys: string[]];\r\n expand: [key: string];\r\n collapse: [key: string];\r\n change: [activeKeys: string[]];\r\n}>();\r\n\r\nconst containerRef = ref<HTMLElement | null>(null);\r\nconst panelRefs = ref<Map<string, HTMLElement>>(new Map());\r\n\r\nconst setPanelRef = (key: string, el: HTMLElement | null) => {\r\n if (el) {\r\n panelRefs.value.set(key, el);\r\n } else {\r\n panelRefs.value.delete(key);\r\n }\r\n};\r\n\r\nconst {\r\n isExpanded,\r\n shouldRender,\r\n toggle,\r\n expandAll,\r\n collapseAll,\r\n getActiveKeys,\r\n handleKeyDown,\r\n} = useCollapsePanel({\r\n items: toRef(props, \"items\"),\r\n activeKeys: toRef(props, \"activeKeys\"),\r\n defaultActiveKeys: props.defaultActiveKeys,\r\n accordion: toRef(props, \"accordion\"),\r\n persistKey: toRef(props, \"persistKey\"),\r\n onChange: (keys) => {\r\n emit(\"update:activeKeys\", keys);\r\n emit(\"change\", keys);\r\n },\r\n onExpand: (key) => emit(\"expand\", key),\r\n onCollapse: (key) => emit(\"collapse\", key),\r\n});\r\n\r\n/* ─── 展开/折叠动画 ──────────────────────────── */\r\nconst onEnter = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = \"0\";\r\n element.style.overflow = \"hidden\";\r\n /* 强制 reflow */\r\n void element.offsetHeight;\r\n element.style.height = `${element.scrollHeight}px`;\r\n};\r\n\r\nconst onAfterEnter = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = \"\";\r\n element.style.overflow = \"\";\r\n};\r\n\r\nconst onLeave = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = `${element.scrollHeight}px`;\r\n element.style.overflow = \"hidden\";\r\n void element.offsetHeight;\r\n element.style.height = \"0\";\r\n};\r\n\r\nconst onAfterLeave = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = \"\";\r\n element.style.overflow = \"\";\r\n};\r\n\r\n/* ─── 滚动到指定面板 ─────────────────────────── */\r\nconst scrollToPanel = (key: string) => {\r\n const el = panelRefs.value.get(key);\r\n if (el) {\r\n el.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\r\n }\r\n};\r\n\r\n/* ─── 暴露方法 ──────────────────────────────── */\r\ndefineExpose<CollapsePanelExpose>({\r\n expandAll,\r\n collapseAll,\r\n toggle,\r\n getActiveKeys,\r\n scrollToPanel,\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2026-02-25\r\n * @Description: 折叠面板组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n ref=\"containerRef\"\r\n class=\"c-collapse-panel\"\r\n :class=\"[\r\n `c-collapse-panel--${variant}`,\r\n {\r\n 'c-collapse-panel--bordered': bordered,\r\n 'c-collapse-panel--icon-right': expandIconPosition === 'right',\r\n },\r\n ]\"\r\n >\r\n <div\r\n v-for=\"item in items\"\r\n :key=\"item.key\"\r\n :ref=\"(el) => setPanelRef(item.key, el as HTMLElement)\"\r\n class=\"collapse-item\"\r\n :class=\"{\r\n 'collapse-item--active': isExpanded(item.key),\r\n 'collapse-item--disabled': item.disabled,\r\n }\"\r\n >\r\n <!-- 面板头部 -->\r\n <div\r\n class=\"collapse-item__header\"\r\n role=\"button\"\r\n :aria-expanded=\"isExpanded(item.key)\"\r\n :aria-controls=\"`collapse-content-${item.key}`\"\r\n :aria-disabled=\"item.disabled\"\r\n :tabindex=\"item.disabled ? -1 : 0\"\r\n @click=\"!item.disabled && toggle(item.key)\"\r\n @keydown=\"handleKeyDown($event, item.key)\"\r\n >\r\n <!-- 展开图标 -->\r\n <span\r\n class=\"collapse-item__arrow\"\r\n :class=\"{ 'collapse-item__arrow--expanded': isExpanded(item.key) }\"\r\n >\r\n <C_Icon name=\"mdi:chevron-right\" :size=\"16\" color=\"currentColor\" />\r\n </span>\r\n\r\n <!-- 标题区域 -->\r\n <div class=\"collapse-item__title-area\">\r\n <slot\r\n :name=\"`header-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n >\r\n <div class=\"collapse-item__title-group\">\r\n <C_Icon\r\n v-if=\"item.icon\"\r\n :name=\"item.icon\"\r\n :size=\"18\"\r\n color=\"currentColor\"\r\n class=\"collapse-item__icon\"\r\n />\r\n <span class=\"collapse-item__title\">{{ item.title }}</span>\r\n <span v-if=\"item.subtitle\" class=\"collapse-item__subtitle\">\r\n {{ item.subtitle }}\r\n </span>\r\n </div>\r\n </slot>\r\n </div>\r\n\r\n <!-- 头部右侧操作区 -->\r\n <div\r\n v-if=\"$slots[`extra-${item.key}`]\"\r\n class=\"collapse-item__extra\"\r\n @click.stop\r\n >\r\n <slot\r\n :name=\"`extra-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- 面板内容 -->\r\n <Transition\r\n name=\"collapse-slide\"\r\n @enter=\"onEnter\"\r\n @after-enter=\"onAfterEnter\"\r\n @leave=\"onLeave\"\r\n @after-leave=\"onAfterLeave\"\r\n >\r\n <div\r\n v-show=\"isExpanded(item.key)\"\r\n :id=\"`collapse-content-${item.key}`\"\r\n class=\"collapse-item__content-wrapper\"\r\n role=\"region\"\r\n :aria-labelledby=\"`collapse-header-${item.key}`\"\r\n >\r\n <div v-if=\"shouldRender(item)\" class=\"collapse-item__content\">\r\n <slot\r\n :name=\"`panel-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n />\r\n </div>\r\n </div>\r\n </Transition>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, toRef } from \"vue\";\r\nimport C_Icon from \"../C_Icon/index.vue\";\r\nimport { useCollapsePanel } from \"./composables/useCollapsePanel\";\r\nimport type {\r\n CollapsePanelExpose,\r\n CollapsePanelItem,\r\n CollapsePanelVariant,\r\n ExpandIconPosition,\r\n} from \"./types\";\r\n\r\ndefineOptions({ name: \"C_CollapsePanel\" });\r\n\r\ninterface Props {\r\n /** 面板项配置数组 */\r\n items: CollapsePanelItem[];\r\n /** 当前激活面板的 key 数组(v-model) */\r\n activeKeys?: string[];\r\n /** 默认展开的面板 key 数组 */\r\n defaultActiveKeys?: string[];\r\n /** 是否手风琴模式 */\r\n accordion?: boolean;\r\n /** 面板样式变体 */\r\n variant?: CollapsePanelVariant;\r\n /** 展开图标位置 */\r\n expandIconPosition?: ExpandIconPosition;\r\n /** 是否显示边框 */\r\n bordered?: boolean;\r\n /** 展开状态 localStorage 持久化 key */\r\n persistKey?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n activeKeys: undefined,\r\n defaultActiveKeys: () => [],\r\n accordion: false,\r\n variant: \"default\",\r\n expandIconPosition: \"left\",\r\n bordered: true,\r\n persistKey: undefined,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n \"update:activeKeys\": [keys: string[]];\r\n expand: [key: string];\r\n collapse: [key: string];\r\n change: [activeKeys: string[]];\r\n}>();\r\n\r\nconst containerRef = ref<HTMLElement | null>(null);\r\nconst panelRefs = ref<Map<string, HTMLElement>>(new Map());\r\n\r\nconst setPanelRef = (key: string, el: HTMLElement | null) => {\r\n if (el) {\r\n panelRefs.value.set(key, el);\r\n } else {\r\n panelRefs.value.delete(key);\r\n }\r\n};\r\n\r\nconst {\r\n isExpanded,\r\n shouldRender,\r\n toggle,\r\n expandAll,\r\n collapseAll,\r\n getActiveKeys,\r\n handleKeyDown,\r\n} = useCollapsePanel({\r\n items: toRef(props, \"items\"),\r\n activeKeys: toRef(props, \"activeKeys\"),\r\n defaultActiveKeys: props.defaultActiveKeys,\r\n accordion: toRef(props, \"accordion\"),\r\n persistKey: toRef(props, \"persistKey\"),\r\n onChange: (keys) => {\r\n emit(\"update:activeKeys\", keys);\r\n emit(\"change\", keys);\r\n },\r\n onExpand: (key) => emit(\"expand\", key),\r\n onCollapse: (key) => emit(\"collapse\", key),\r\n});\r\n\r\n/* ─── 展开/折叠动画 ──────────────────────────── */\r\nconst onEnter = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = \"0\";\r\n element.style.overflow = \"hidden\";\r\n /* 强制 reflow */\r\n void element.offsetHeight;\r\n element.style.height = `${element.scrollHeight}px`;\r\n};\r\n\r\nconst onAfterEnter = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = \"\";\r\n element.style.overflow = \"\";\r\n};\r\n\r\nconst onLeave = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = `${element.scrollHeight}px`;\r\n element.style.overflow = \"hidden\";\r\n void element.offsetHeight;\r\n element.style.height = \"0\";\r\n};\r\n\r\nconst onAfterLeave = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = \"\";\r\n element.style.overflow = \"\";\r\n};\r\n\r\n/* ─── 滚动到指定面板 ─────────────────────────── */\r\nconst scrollToPanel = (key: string) => {\r\n const el = panelRefs.value.get(key);\r\n if (el) {\r\n el.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\r\n }\r\n};\r\n\r\n/* ─── 暴露方法 ──────────────────────────────── */\r\ndefineExpose<CollapsePanelExpose>({\r\n expandAll,\r\n collapseAll,\r\n toggle,\r\n getActiveKeys,\r\n scrollToPanel,\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n"],"mappings":"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"}
|
package/dist/C_Cron.cjs
CHANGED
|
@@ -1,15 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,
|
|
2
|
-
require('./C_Icon.js');
|
|
3
|
-
const require_C_Cron = require('./C_Cron.js');
|
|
4
|
-
|
|
5
|
-
exports.CRON_FIELD_META = require_C_Cron.CRON_FIELD_META;
|
|
6
|
-
exports.CRON_TEMPLATES = require_C_Cron.CRON_TEMPLATES;
|
|
7
|
-
exports.C_Cron = require_C_Cron.C_Cron_default;
|
|
8
|
-
exports.DEFAULT_CRON_EXPRESSION = require_C_Cron.DEFAULT_CRON_EXPRESSION;
|
|
9
|
-
exports.DEFAULT_CRON_VALUE = require_C_Cron.DEFAULT_CRON_VALUE;
|
|
10
|
-
exports.DEFAULT_FIELD_VALUE = require_C_Cron.DEFAULT_FIELD_VALUE;
|
|
11
|
-
exports.MONTH_LABELS = require_C_Cron.MONTH_LABELS;
|
|
12
|
-
exports.WEEK_LABELS = require_C_Cron.WEEK_LABELS;
|
|
13
|
-
exports.useCronDescription = require_C_Cron.useCronDescription;
|
|
14
|
-
exports.useCronParser = require_C_Cron.useCronParser;
|
|
15
|
-
exports.useCronPreview = require_C_Cron.useCronPreview;
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./C_Icon.js`);const e=require(`./C_Cron.js`);exports.CRON_FIELD_META=e.a,exports.CRON_TEMPLATES=e.o,exports.C_Cron=e.t,exports.DEFAULT_CRON_EXPRESSION=e.s,exports.DEFAULT_CRON_VALUE=e.c,exports.DEFAULT_FIELD_VALUE=e.l,exports.MONTH_LABELS=e.u,exports.WEEK_LABELS=e.d,exports.useCronDescription=e.n,exports.useCronParser=e.i,exports.useCronPreview=e.r;
|
package/dist/C_Cron.js
CHANGED
|
@@ -1,4 +1 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { a as CRON_FIELD_META, c as DEFAULT_CRON_VALUE, d as WEEK_LABELS, i as useCronParser, l as DEFAULT_FIELD_VALUE, n as useCronDescription, o as CRON_TEMPLATES, r as useCronPreview, s as DEFAULT_CRON_EXPRESSION, t as C_Cron_default, u as MONTH_LABELS } from "./C_Cron2.js";
|
|
3
|
-
|
|
4
|
-
export { CRON_FIELD_META, CRON_TEMPLATES, C_Cron_default as C_Cron, DEFAULT_CRON_EXPRESSION, DEFAULT_CRON_VALUE, DEFAULT_FIELD_VALUE, MONTH_LABELS, WEEK_LABELS, useCronDescription, useCronParser, useCronPreview };
|
|
1
|
+
import"./C_Icon2.js";import{a as e,c as t,d as n,i as r,l as i,n as a,o,r as s,s as c,t as l,u}from"./C_Cron2.js";export{e as CRON_FIELD_META,o as CRON_TEMPLATES,l as C_Cron,c as DEFAULT_CRON_EXPRESSION,t as DEFAULT_CRON_VALUE,i as DEFAULT_FIELD_VALUE,u as MONTH_LABELS,n as WEEK_LABELS,a as useCronDescription,r as useCronParser,s as useCronPreview};
|