@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.
Files changed (285) hide show
  1. package/dist/C_ActionBar.cjs +1 -5
  2. package/dist/C_ActionBar.js +1 -4
  3. package/dist/C_ActionBar.js.map +1 -0
  4. package/dist/C_ActionBar2.js +1 -195
  5. package/dist/C_ActionBar2.js.map +1 -1
  6. package/dist/C_AntV.cjs +1 -8
  7. package/dist/C_AntV.js +1 -4
  8. package/dist/C_AntV.js.map +1 -0
  9. package/dist/C_AntV2.js +4 -3149
  10. package/dist/C_AntV2.js.map +1 -1
  11. package/dist/C_Barcode.cjs +1 -4
  12. package/dist/C_Barcode.js +1 -3
  13. package/dist/C_Barcode.js.map +1 -0
  14. package/dist/C_Barcode2.js +1 -67
  15. package/dist/C_Barcode2.js.map +1 -1
  16. package/dist/C_Captcha.cjs +1 -4
  17. package/dist/C_Captcha.js +1 -3
  18. package/dist/C_Captcha.js.map +1 -0
  19. package/dist/C_Captcha2.js +1 -154
  20. package/dist/C_Captcha2.js.map +1 -1
  21. package/dist/C_Cascade.cjs +1 -4
  22. package/dist/C_Cascade.js +1 -3
  23. package/dist/C_Cascade.js.map +1 -0
  24. package/dist/C_Cascade2.js +1 -102
  25. package/dist/C_Cascade2.js.map +1 -1
  26. package/dist/C_City.cjs +1 -4
  27. package/dist/C_City.js +1 -3
  28. package/dist/C_City.js.map +1 -0
  29. package/dist/C_City2.js +1 -840
  30. package/dist/C_City2.js.map +1 -1
  31. package/dist/C_Code.cjs +1 -5
  32. package/dist/C_Code.js +1 -4
  33. package/dist/C_Code.js.map +1 -0
  34. package/dist/C_Code2.js +1 -346
  35. package/dist/C_Code2.js.map +1 -1
  36. package/dist/C_CollapsePanel.cjs +1 -6
  37. package/dist/C_CollapsePanel.js +1 -4
  38. package/dist/C_CollapsePanel.js.map +1 -0
  39. package/dist/C_CollapsePanel2.js +1 -318
  40. package/dist/C_CollapsePanel2.js.map +1 -1
  41. package/dist/C_Cron.cjs +1 -15
  42. package/dist/C_Cron.js +1 -4
  43. package/dist/C_Cron.js.map +1 -0
  44. package/dist/C_Cron2.js +1 -1209
  45. package/dist/C_Cron2.js.map +1 -1
  46. package/dist/C_Date.cjs +1 -4
  47. package/dist/C_Date.js +1 -3
  48. package/dist/C_Date.js.map +1 -0
  49. package/dist/C_Date2.js +1 -218
  50. package/dist/C_Date2.js.map +1 -1
  51. package/dist/C_Draggable.cjs +1 -5
  52. package/dist/C_Draggable.js +1 -3
  53. package/dist/C_Draggable.js.map +1 -0
  54. package/dist/C_Draggable2.js +1 -294
  55. package/dist/C_Draggable2.js.map +1 -1
  56. package/dist/C_Editor.cjs +1 -4
  57. package/dist/C_Editor.js +1 -3
  58. package/dist/C_Editor.js.map +1 -0
  59. package/dist/C_Editor2.js +1 -159
  60. package/dist/C_Editor2.js.map +1 -1
  61. package/dist/C_FilePreview.cjs +1 -7
  62. package/dist/C_FilePreview.js +1 -4
  63. package/dist/C_FilePreview.js.map +1 -0
  64. package/dist/C_FilePreview2.js +1 -1031
  65. package/dist/C_FilePreview2.js.map +1 -1
  66. package/dist/C_Form.cjs +1 -16
  67. package/dist/C_Form.js +1 -5
  68. package/dist/C_Form.js.map +1 -0
  69. package/dist/C_Form2.js +1 -2569
  70. package/dist/C_Form2.js.map +1 -1
  71. package/dist/C_FormSearch.cjs +1 -6
  72. package/dist/C_FormSearch.js +1 -3
  73. package/dist/C_FormSearch.js.map +1 -0
  74. package/dist/C_FormSearch2.js +1 -355
  75. package/dist/C_FormSearch2.js.map +1 -1
  76. package/dist/C_FormulaEditor.cjs +1 -13
  77. package/dist/C_FormulaEditor.js +1 -4
  78. package/dist/C_FormulaEditor.js.map +1 -0
  79. package/dist/C_FormulaEditor2.js +1 -1432
  80. package/dist/C_FormulaEditor2.js.map +1 -1
  81. package/dist/C_FullCalendar.cjs +1 -9
  82. package/dist/C_FullCalendar.js +1 -3
  83. package/dist/C_FullCalendar.js.map +1 -0
  84. package/dist/C_FullCalendar2.js +1 -376
  85. package/dist/C_FullCalendar2.js.map +1 -1
  86. package/dist/C_GlobalSearch.cjs +1 -5
  87. package/dist/C_GlobalSearch.js +1 -3
  88. package/dist/C_GlobalSearch.js.map +1 -0
  89. package/dist/C_GlobalSearch2.js +1 -335
  90. package/dist/C_GlobalSearch2.js.map +1 -1
  91. package/dist/C_Guide.cjs +1 -5
  92. package/dist/C_Guide.js +1 -4
  93. package/dist/C_Guide.js.map +1 -0
  94. package/dist/C_Guide2.js +1 -60
  95. package/dist/C_Guide2.js.map +1 -1
  96. package/dist/C_Icon.cjs +1 -4
  97. package/dist/C_Icon.js +1 -3
  98. package/dist/C_Icon.js.map +1 -0
  99. package/dist/C_Icon2.js +1 -285
  100. package/dist/C_Icon2.js.map +1 -1
  101. package/dist/C_ImageCropper.cjs +1 -6
  102. package/dist/C_ImageCropper.js +1 -4
  103. package/dist/C_ImageCropper.js.map +1 -0
  104. package/dist/C_ImageCropper2.js +1 -722
  105. package/dist/C_ImageCropper2.js.map +1 -1
  106. package/dist/C_Language.cjs +1 -5
  107. package/dist/C_Language.js +1 -4
  108. package/dist/C_Language.js.map +1 -0
  109. package/dist/C_Language2.js +1 -78
  110. package/dist/C_Language2.js.map +1 -1
  111. package/dist/C_Map.cjs +1 -7
  112. package/dist/C_Map.js +1 -3
  113. package/dist/C_Map.js.map +1 -0
  114. package/dist/C_Map2.js +1 -198
  115. package/dist/C_Map2.js.map +1 -1
  116. package/dist/C_Markdown.cjs +1 -4
  117. package/dist/C_Markdown.js +1 -3
  118. package/dist/C_Markdown.js.map +1 -0
  119. package/dist/C_Markdown2.js +1 -185
  120. package/dist/C_Markdown2.js.map +1 -1
  121. package/dist/C_NotificationCenter.cjs +1 -20
  122. package/dist/C_NotificationCenter.js +1 -4
  123. package/dist/C_NotificationCenter.js.map +1 -0
  124. package/dist/C_NotificationCenter2.js +1 -1383
  125. package/dist/C_NotificationCenter2.js.map +1 -1
  126. package/dist/C_Progress.cjs +1 -4
  127. package/dist/C_Progress.js +1 -3
  128. package/dist/C_Progress.js.map +1 -0
  129. package/dist/C_Progress2.js +1 -102
  130. package/dist/C_Progress2.js.map +1 -1
  131. package/dist/C_QRCode.cjs +1 -5
  132. package/dist/C_QRCode.js +1 -3
  133. package/dist/C_QRCode.js.map +1 -0
  134. package/dist/C_QRCode2.js +1 -217
  135. package/dist/C_QRCode2.js.map +1 -1
  136. package/dist/C_Signature.cjs +1 -8
  137. package/dist/C_Signature.js +1 -4
  138. package/dist/C_Signature.js.map +1 -0
  139. package/dist/C_Signature2.js +1 -617
  140. package/dist/C_Signature2.js.map +1 -1
  141. package/dist/C_SplitPane.cjs +1 -6
  142. package/dist/C_SplitPane.js +1 -4
  143. package/dist/C_SplitPane.js.map +1 -0
  144. package/dist/C_SplitPane2.js +1 -355
  145. package/dist/C_SplitPane2.js.map +1 -1
  146. package/dist/C_Steps.cjs +1 -4
  147. package/dist/C_Steps.js +1 -3
  148. package/dist/C_Steps.js.map +1 -0
  149. package/dist/C_Steps2.js +1 -81
  150. package/dist/C_Steps2.js.map +1 -1
  151. package/dist/C_Table.cjs +1 -20
  152. package/dist/C_Table.js +1 -6
  153. package/dist/C_Table.js.map +1 -0
  154. package/dist/C_Table2.js +1 -3023
  155. package/dist/C_Table2.js.map +1 -1
  156. package/dist/C_Theme.cjs +1 -5
  157. package/dist/C_Theme.js +1 -4
  158. package/dist/C_Theme.js.map +1 -0
  159. package/dist/C_Theme2.js +1 -63
  160. package/dist/C_Theme2.js.map +1 -1
  161. package/dist/C_Time.cjs +1 -5
  162. package/dist/C_Time.js +1 -3
  163. package/dist/C_Time.js.map +1 -0
  164. package/dist/C_Time2.js +1 -198
  165. package/dist/C_Time2.js.map +1 -1
  166. package/dist/C_Tree.cjs +1 -7
  167. package/dist/C_Tree.js +1 -4
  168. package/dist/C_Tree.js.map +1 -0
  169. package/dist/C_Tree2.js +1 -440
  170. package/dist/C_Tree2.js.map +1 -1
  171. package/dist/C_Upload.cjs +1 -12
  172. package/dist/C_Upload.js +1 -4
  173. package/dist/C_Upload.js.map +1 -0
  174. package/dist/C_Upload2.js +2 -1365
  175. package/dist/C_Upload2.js.map +1 -1
  176. package/dist/C_VideoPlayer.cjs +1 -23
  177. package/dist/C_VideoPlayer.js +1 -3
  178. package/dist/C_VideoPlayer.js.map +1 -0
  179. package/dist/C_VideoPlayer2.js +3 -1932
  180. package/dist/C_VideoPlayer2.js.map +1 -1
  181. package/dist/C_VtableGantt.cjs +1 -6
  182. package/dist/C_VtableGantt.js +1 -4
  183. package/dist/C_VtableGantt.js.map +1 -0
  184. package/dist/C_VtableGantt2.js +1 -872
  185. package/dist/C_VtableGantt2.js.map +1 -1
  186. package/dist/C_WaterFall.cjs +1 -13
  187. package/dist/C_WaterFall.js +1 -3
  188. package/dist/C_WaterFall.js.map +1 -0
  189. package/dist/C_WaterFall2.js +1 -364
  190. package/dist/C_WaterFall2.js.map +1 -1
  191. package/dist/C_WorkFlow.cjs +1 -8
  192. package/dist/C_WorkFlow.js +1 -4
  193. package/dist/C_WorkFlow.js.map +1 -0
  194. package/dist/C_WorkFlow2.js +1 -1983
  195. package/dist/C_WorkFlow2.js.map +1 -1
  196. package/dist/chunk.js +1 -18
  197. package/dist/city.js +1 -4816
  198. package/dist/constants.d.ts +2 -2
  199. package/dist/constants2.d.ts +3 -3
  200. package/dist/constants3.d.ts +3 -3
  201. package/dist/constants4.d.ts +5 -5
  202. package/dist/constants5.d.ts +2 -2
  203. package/dist/data.d.ts +1 -1
  204. package/dist/export-helper.js +1 -9
  205. package/dist/index.cjs +2 -413
  206. package/dist/index.cjs.map +1 -0
  207. package/dist/index.d.cts +1 -2
  208. package/dist/index.d.ts +1 -2
  209. package/dist/index.js +1 -231
  210. package/dist/index.js.map +1 -1
  211. package/dist/index.vue.d.ts +2 -2
  212. package/dist/index10.vue.d.ts +5 -5
  213. package/dist/index12.vue.d.ts +3 -3
  214. package/dist/index13.vue.d.ts +3 -3
  215. package/dist/index14.vue.d.ts +3 -3
  216. package/dist/index16.vue.d.ts +3 -3
  217. package/dist/index3.vue.d.ts +3 -3
  218. package/dist/index5.vue.d.ts +1 -1
  219. package/dist/index7.vue.d.ts +4 -4
  220. package/dist/index8.vue.d.ts +2 -2
  221. package/dist/resolver.cjs +2 -89
  222. package/dist/resolver.cjs.map +1 -0
  223. package/dist/resolver.js +1 -86
  224. package/dist/resolver.js.map +1 -1
  225. package/dist/storage.js +1 -30
  226. package/dist/storage.js.map +1 -1
  227. package/dist/useCollapsePanel.d.ts +2 -2
  228. package/dist/useCropperCore.d.ts +8 -8
  229. package/dist/useDraggableLayout.d.ts +4 -4
  230. package/dist/useDynamicFormState.d.ts +7 -7
  231. package/dist/useEdgeInteraction.d.ts +1 -1
  232. package/dist/useFullscreen.d.ts +2 -2
  233. package/dist/useInfiniteScroll.d.ts +1 -1
  234. package/dist/useModalEdit.d.ts +1 -1
  235. package/dist/useQRCode.d.ts +3 -3
  236. package/dist/useSearchState.d.ts +2 -2
  237. package/dist/useSignatureHistory.d.ts +1 -1
  238. package/dist/useSplitResize.d.ts +6 -6
  239. package/dist/useTimeSelection.d.ts +2 -2
  240. package/dist/useTreeOperations.d.ts +6 -6
  241. package/dist/useWorkflowValidation.d.ts +4 -4
  242. package/package.json +1 -2
  243. package/dist/constants.d.ts.map +0 -1
  244. package/dist/constants2.d.ts.map +0 -1
  245. package/dist/constants3.d.ts.map +0 -1
  246. package/dist/constants4.d.ts.map +0 -1
  247. package/dist/constants5.d.ts.map +0 -1
  248. package/dist/data.d.ts.map +0 -1
  249. package/dist/index.d.cts.map +0 -1
  250. package/dist/index.d.ts.map +0 -1
  251. package/dist/index.vue.d.ts.map +0 -1
  252. package/dist/index10.vue.d.ts.map +0 -1
  253. package/dist/index11.vue.d.ts.map +0 -1
  254. package/dist/index12.vue.d.ts.map +0 -1
  255. package/dist/index13.vue.d.ts.map +0 -1
  256. package/dist/index14.vue.d.ts.map +0 -1
  257. package/dist/index15.vue.d.ts.map +0 -1
  258. package/dist/index16.vue.d.ts.map +0 -1
  259. package/dist/index2.vue.d.ts.map +0 -1
  260. package/dist/index3.vue.d.ts.map +0 -1
  261. package/dist/index4.vue.d.ts.map +0 -1
  262. package/dist/index5.vue.d.ts.map +0 -1
  263. package/dist/index6.vue.d.ts.map +0 -1
  264. package/dist/index7.vue.d.ts.map +0 -1
  265. package/dist/index8.vue.d.ts.map +0 -1
  266. package/dist/index9.vue.d.ts.map +0 -1
  267. package/dist/resolver.d.cts.map +0 -1
  268. package/dist/resolver.d.ts.map +0 -1
  269. package/dist/useCalendarEvents.d.ts.map +0 -1
  270. package/dist/useCollapsePanel.d.ts.map +0 -1
  271. package/dist/useCropperCore.d.ts.map +0 -1
  272. package/dist/useDraggableLayout.d.ts.map +0 -1
  273. package/dist/useDynamicFormState.d.ts.map +0 -1
  274. package/dist/useEdgeInteraction.d.ts.map +0 -1
  275. package/dist/useFullscreen.d.ts.map +0 -1
  276. package/dist/useGlobalSearch.d.ts.map +0 -1
  277. package/dist/useInfiniteScroll.d.ts.map +0 -1
  278. package/dist/useModalEdit.d.ts.map +0 -1
  279. package/dist/useQRCode.d.ts.map +0 -1
  280. package/dist/useSearchState.d.ts.map +0 -1
  281. package/dist/useSignatureHistory.d.ts.map +0 -1
  282. package/dist/useSplitResize.d.ts.map +0 -1
  283. package/dist/useTimeSelection.d.ts.map +0 -1
  284. package/dist/useTreeOperations.d.ts.map +0 -1
  285. package/dist/useWorkflowValidation.d.ts.map +0 -1
@@ -1,356 +1,2 @@
1
- import { t as C_Icon_default } from "./C_Icon2.js";
2
- import { t as export_helper_default } from "./export-helper.js";
3
- import { Fragment, computed, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, normalizeClass, normalizeStyle, onUnmounted, openBlock, ref, renderList, renderSlot, toRef, unref, withModifiers } from "vue";
4
-
5
- //#region src/components/C_SplitPane/composables/useSplitResize.ts
6
- /**
7
- * 分割面板拖拽调整逻辑
8
- */
9
- function useSplitResize(options) {
10
- const { containerRef, direction, defaultSize, minSize, maxSize, disabled, collapsible, step, onResize, onCollapse, onExpand, onDragStart, onDragEnd } = options;
11
- /** 首面板当前大小(百分比) */
12
- const panelSize = ref(defaultSize);
13
- /** 是否正在拖拽 */
14
- const isDragging = ref(false);
15
- /** 折叠状态 */
16
- const collapsedTarget = ref(null);
17
- /** 折叠前记住的面板大小 */
18
- const sizeBeforeCollapse = ref(defaultSize);
19
- /** 首面板是否折叠 */
20
- const isFirstCollapsed = computed(() => collapsedTarget.value === "first");
21
- /** 第二面板是否折叠 */
22
- const isSecondCollapsed = computed(() => collapsedTarget.value === "second");
23
- /**
24
- * 将大小限制在 min/max 范围内
25
- */
26
- const clampSize = (size) => {
27
- return Math.min(maxSize, Math.max(minSize, size));
28
- };
29
- /**
30
- * 获取容器在分割方向上的总长度(px)
31
- */
32
- const getContainerLength = () => {
33
- const container = containerRef.value;
34
- if (!container) return 0;
35
- return direction.value === "horizontal" ? container.offsetWidth : container.offsetHeight;
36
- };
37
- /**
38
- * 获取容器在分割方向上的起始坐标
39
- */
40
- const getContainerStart = () => {
41
- const container = containerRef.value;
42
- if (!container) return 0;
43
- const rect = container.getBoundingClientRect();
44
- return direction.value === "horizontal" ? rect.left : rect.top;
45
- };
46
- /**
47
- * 根据鼠标/触摸位置计算面板大小(百分比)
48
- */
49
- const calcSizeFromPosition = (clientPos) => {
50
- const containerLength = getContainerLength();
51
- if (containerLength === 0) return panelSize.value;
52
- return clampSize((clientPos - getContainerStart()) / containerLength * 100);
53
- };
54
- /**
55
- * 获取事件的位置坐标
56
- */
57
- const getClientPos = (e) => {
58
- if (e instanceof TouchEvent) return direction.value === "horizontal" ? e.touches[0].clientX : e.touches[0].clientY;
59
- return direction.value === "horizontal" ? e.clientX : e.clientY;
60
- };
61
- /**
62
- * 更新面板大小
63
- */
64
- const updateSize = (newSize) => {
65
- const clamped = clampSize(newSize);
66
- panelSize.value = clamped;
67
- onResize?.(clamped, 100 - clamped);
68
- };
69
- const handleMouseMove = (e) => {
70
- if (!isDragging.value || disabled.value) return;
71
- e.preventDefault();
72
- const newSize = calcSizeFromPosition(getClientPos(e));
73
- if (collapsedTarget.value) collapsedTarget.value = null;
74
- updateSize(newSize);
75
- };
76
- const handleMouseUp = () => {
77
- if (!isDragging.value) return;
78
- isDragging.value = false;
79
- document.body.style.cursor = "";
80
- document.body.style.userSelect = "";
81
- onDragEnd?.(panelSize.value);
82
- document.removeEventListener("mousemove", handleMouseMove);
83
- document.removeEventListener("mouseup", handleMouseUp);
84
- document.removeEventListener("touchmove", handleMouseMove);
85
- document.removeEventListener("touchend", handleMouseUp);
86
- };
87
- const handleMouseDown = (e) => {
88
- if (disabled.value) return;
89
- e.preventDefault();
90
- e.currentTarget?.focus();
91
- isDragging.value = true;
92
- document.body.style.cursor = direction.value === "horizontal" ? "col-resize" : "row-resize";
93
- document.body.style.userSelect = "none";
94
- onDragStart?.(panelSize.value);
95
- document.addEventListener("mousemove", handleMouseMove);
96
- document.addEventListener("mouseup", handleMouseUp);
97
- document.addEventListener("touchmove", handleMouseMove, { passive: false });
98
- document.addEventListener("touchend", handleMouseUp);
99
- };
100
- const handleDoubleClick = () => {
101
- if (disabled.value || !collapsible.value) return;
102
- toggle("first");
103
- };
104
- const collapse = (target = "first") => {
105
- if (!collapsible.value || collapsedTarget.value === target) return;
106
- if (!collapsedTarget.value) sizeBeforeCollapse.value = panelSize.value;
107
- collapsedTarget.value = target;
108
- if (target === "first") panelSize.value = 0;
109
- else panelSize.value = 100;
110
- onCollapse?.(target);
111
- onResize?.(panelSize.value, 100 - panelSize.value);
112
- };
113
- const expand = () => {
114
- if (!collapsedTarget.value) return;
115
- const target = collapsedTarget.value;
116
- collapsedTarget.value = null;
117
- panelSize.value = sizeBeforeCollapse.value;
118
- onExpand?.(target);
119
- onResize?.(panelSize.value, 100 - panelSize.value);
120
- };
121
- const toggle = (target = "first") => {
122
- if (collapsedTarget.value) expand();
123
- else collapse(target);
124
- };
125
- /**
126
- * 根据按键获取增量
127
- */
128
- const getKeyDelta = (key, isHorizontal) => {
129
- return {
130
- ArrowLeft: isHorizontal ? -step : 0,
131
- ArrowRight: isHorizontal ? step : 0,
132
- ArrowUp: !isHorizontal ? -step : 0,
133
- ArrowDown: !isHorizontal ? step : 0
134
- }[key] ?? null;
135
- };
136
- const handleKeyDown = (e) => {
137
- if (disabled.value) return;
138
- if (e.key === "Home") {
139
- updateSize(minSize);
140
- e.preventDefault();
141
- return;
142
- }
143
- if (e.key === "End") {
144
- updateSize(maxSize);
145
- e.preventDefault();
146
- return;
147
- }
148
- const delta = getKeyDelta(e.key, direction.value === "horizontal");
149
- if (delta === null || delta === 0) return;
150
- e.preventDefault();
151
- if (collapsedTarget.value) collapsedTarget.value = null;
152
- updateSize(panelSize.value + delta);
153
- };
154
- const resetSize = () => {
155
- collapsedTarget.value = null;
156
- panelSize.value = defaultSize;
157
- onResize?.(defaultSize, 100 - defaultSize);
158
- };
159
- const setSize = (size) => {
160
- collapsedTarget.value = null;
161
- updateSize(size);
162
- };
163
- const getPanelInfo = () => ({
164
- first: {
165
- size: panelSize.value,
166
- collapsed: isFirstCollapsed.value
167
- },
168
- second: {
169
- size: 100 - panelSize.value,
170
- collapsed: isSecondCollapsed.value
171
- }
172
- });
173
- onUnmounted(() => {
174
- document.removeEventListener("mousemove", handleMouseMove);
175
- document.removeEventListener("mouseup", handleMouseUp);
176
- document.removeEventListener("touchmove", handleMouseMove);
177
- document.removeEventListener("touchend", handleMouseUp);
178
- });
179
- return {
180
- panelSize,
181
- isDragging,
182
- collapsedTarget,
183
- isFirstCollapsed,
184
- isSecondCollapsed,
185
- handleMouseDown,
186
- handleDoubleClick,
187
- handleKeyDown,
188
- collapse,
189
- expand,
190
- toggle,
191
- resetSize,
192
- setSize,
193
- getPanelInfo
194
- };
195
- }
196
-
197
- //#endregion
198
- //#region src/components/C_SplitPane/index.vue?vue&type=script&setup=true&lang.ts
199
- const _hoisted_1 = { class: "split-panel__content" };
200
- const _hoisted_2 = ["aria-orientation", "aria-valuenow"];
201
- const _hoisted_3 = { class: "split-gutter__visual" };
202
- const _hoisted_4 = { class: "split-gutter__dots" };
203
- const _hoisted_5 = ["title"];
204
- const _hoisted_6 = ["title"];
205
- const _hoisted_7 = { class: "split-panel__content" };
206
- var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
207
- name: "C_SplitPane",
208
- __name: "index",
209
- props: {
210
- direction: { default: "horizontal" },
211
- defaultSize: { default: 50 },
212
- minSize: { default: 0 },
213
- maxSize: { default: 100 },
214
- disabled: {
215
- type: Boolean,
216
- default: false
217
- },
218
- collapsible: {
219
- type: Boolean,
220
- default: true
221
- },
222
- showCollapseButton: {
223
- type: Boolean,
224
- default: true
225
- },
226
- gutterSize: { default: 6 },
227
- step: { default: 2 }
228
- },
229
- emits: [
230
- "resize",
231
- "collapse",
232
- "expand",
233
- "drag-start",
234
- "drag-end"
235
- ],
236
- setup(__props, { expose: __expose, emit: __emit }) {
237
- const props = __props;
238
- const emit = __emit;
239
- const containerRef = ref(null);
240
- const { panelSize, isDragging, isFirstCollapsed, isSecondCollapsed, handleMouseDown, handleDoubleClick, handleKeyDown, collapse, expand, toggle, resetSize, setSize, getPanelInfo } = useSplitResize({
241
- containerRef,
242
- direction: toRef(props, "direction"),
243
- defaultSize: props.defaultSize,
244
- minSize: props.minSize,
245
- maxSize: props.maxSize,
246
- disabled: toRef(props, "disabled"),
247
- collapsible: toRef(props, "collapsible"),
248
- step: props.step,
249
- onResize: (first, second) => emit("resize", first, second),
250
- onCollapse: (target) => emit("collapse", target),
251
- onExpand: (target) => emit("expand", target),
252
- onDragStart: (size) => emit("drag-start", size),
253
- onDragEnd: (size) => emit("drag-end", size)
254
- });
255
- const firstPanelStyle = computed(() => {
256
- const sizeValue = `calc(${panelSize.value}% - ${props.gutterSize / 2}px)`;
257
- return props.direction === "horizontal" ? { width: sizeValue } : { height: sizeValue };
258
- });
259
- const secondPanelStyle = computed(() => {
260
- const sizeValue = `calc(${100 - panelSize.value}% - ${props.gutterSize / 2}px)`;
261
- return props.direction === "horizontal" ? { width: sizeValue } : { height: sizeValue };
262
- });
263
- const gutterStyle = computed(() => {
264
- return props.direction === "horizontal" ? { width: `${props.gutterSize}px` } : { height: `${props.gutterSize}px` };
265
- });
266
- const collapseFirstIcon = computed(() => {
267
- if (props.direction === "horizontal") return isFirstCollapsed.value ? "mdi:chevron-right" : "mdi:chevron-left";
268
- return isFirstCollapsed.value ? "mdi:chevron-down" : "mdi:chevron-up";
269
- });
270
- const collapseSecondIcon = computed(() => {
271
- if (props.direction === "horizontal") return isSecondCollapsed.value ? "mdi:chevron-left" : "mdi:chevron-right";
272
- return isSecondCollapsed.value ? "mdi:chevron-up" : "mdi:chevron-down";
273
- });
274
- __expose({
275
- collapse,
276
- expand,
277
- toggle,
278
- resetSize,
279
- getPanelInfo,
280
- setSize
281
- });
282
- return (_ctx, _cache) => {
283
- return openBlock(), createElementBlock("div", {
284
- ref_key: "containerRef",
285
- ref: containerRef,
286
- class: normalizeClass(["c-split-pane", [`c-split-pane--${_ctx.direction}`, {
287
- "c-split-pane--dragging": unref(isDragging),
288
- "c-split-pane--disabled": _ctx.disabled,
289
- "c-split-pane--collapsed-first": unref(isFirstCollapsed),
290
- "c-split-pane--collapsed-second": unref(isSecondCollapsed)
291
- }]])
292
- }, [
293
- createCommentVNode(" 首面板 "),
294
- createElementVNode("div", {
295
- class: "split-panel split-panel--first",
296
- style: normalizeStyle(firstPanelStyle.value)
297
- }, [createElementVNode("div", _hoisted_1, [renderSlot(_ctx.$slots, "first", {}, void 0, true)])], 4),
298
- createCommentVNode(" 分割线手柄 "),
299
- createElementVNode("div", {
300
- class: "split-gutter",
301
- style: normalizeStyle(gutterStyle.value),
302
- role: "separator",
303
- "aria-orientation": _ctx.direction === "horizontal" ? "vertical" : "horizontal",
304
- "aria-valuenow": Math.round(unref(panelSize)),
305
- "aria-valuemin": 0,
306
- "aria-valuemax": 100,
307
- tabindex: "0",
308
- onMousedown: _cache[4] || (_cache[4] = (...args) => unref(handleMouseDown) && unref(handleMouseDown)(...args)),
309
- onTouchstart: _cache[5] || (_cache[5] = withModifiers((...args) => unref(handleMouseDown) && unref(handleMouseDown)(...args), ["prevent"])),
310
- onDblclick: _cache[6] || (_cache[6] = (...args) => unref(handleDoubleClick) && unref(handleDoubleClick)(...args)),
311
- onKeydown: _cache[7] || (_cache[7] = (...args) => unref(handleKeyDown) && unref(handleKeyDown)(...args))
312
- }, [
313
- createElementVNode("div", _hoisted_3, [createElementVNode("div", _hoisted_4, [(openBlock(), createElementBlock(Fragment, null, renderList(3, (i) => {
314
- return createElementVNode("span", {
315
- key: i,
316
- class: "split-gutter__dot"
317
- });
318
- }), 64))])]),
319
- createCommentVNode(" 折叠按钮 "),
320
- _ctx.showCollapseButton && _ctx.collapsible ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createElementVNode("button", {
321
- class: "split-gutter__collapse-btn split-gutter__collapse-btn--first",
322
- title: unref(isFirstCollapsed) ? "展开首面板" : "折叠首面板",
323
- onClick: _cache[0] || (_cache[0] = withModifiers(($event) => unref(toggle)("first"), ["stop"])),
324
- onMousedown: _cache[1] || (_cache[1] = withModifiers(() => {}, ["stop"]))
325
- }, [createVNode(C_Icon_default, {
326
- name: collapseFirstIcon.value,
327
- size: 16,
328
- color: "currentColor"
329
- }, null, 8, ["name"])], 40, _hoisted_5), createElementVNode("button", {
330
- class: "split-gutter__collapse-btn split-gutter__collapse-btn--second",
331
- title: unref(isSecondCollapsed) ? "展开第二面板" : "折叠第二面板",
332
- onClick: _cache[2] || (_cache[2] = withModifiers(($event) => unref(toggle)("second"), ["stop"])),
333
- onMousedown: _cache[3] || (_cache[3] = withModifiers(() => {}, ["stop"]))
334
- }, [createVNode(C_Icon_default, {
335
- name: collapseSecondIcon.value,
336
- size: 16,
337
- color: "currentColor"
338
- }, null, 8, ["name"])], 40, _hoisted_6)], 64)) : createCommentVNode("v-if", true)
339
- ], 44, _hoisted_2),
340
- createCommentVNode(" 第二面板 "),
341
- createElementVNode("div", {
342
- class: "split-panel split-panel--second",
343
- style: normalizeStyle(secondPanelStyle.value)
344
- }, [createElementVNode("div", _hoisted_7, [renderSlot(_ctx.$slots, "second", {}, void 0, true)])], 4)
345
- ], 2);
346
- };
347
- }
348
- });
349
-
350
- //#endregion
351
- //#region src/components/C_SplitPane/index.vue
352
- var C_SplitPane_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-396d0f5b"]]);
353
-
354
- //#endregion
355
- export { useSplitResize as n, C_SplitPane_default as t };
1
+ import{t as e}from"./C_Icon2.js";import{t}from"./export-helper.js";import{Fragment as n,computed as r,createCommentVNode as i,createElementBlock as a,createElementVNode as o,createVNode as s,defineComponent as c,normalizeClass as l,normalizeStyle as u,onUnmounted as d,openBlock as f,ref as p,renderList as m,renderSlot as h,toRef as g,unref as _,withModifiers as v}from"vue";function y(e){let{containerRef:t,direction:n,defaultSize:i,minSize:a,maxSize:o,disabled:s,collapsible:c,step:l,onResize:u,onCollapse:f,onExpand:m,onDragStart:h,onDragEnd:g}=e,_=p(i),v=p(!1),y=p(null),b=p(i),x=r(()=>y.value===`first`),S=r(()=>y.value===`second`),C=e=>Math.min(o,Math.max(a,e)),w=()=>{let e=t.value;return e?n.value===`horizontal`?e.offsetWidth:e.offsetHeight:0},T=()=>{let e=t.value;if(!e)return 0;let r=e.getBoundingClientRect();return n.value===`horizontal`?r.left:r.top},E=e=>{let t=w();return t===0?_.value:C((e-T())/t*100)},D=e=>e instanceof TouchEvent?n.value===`horizontal`?e.touches[0].clientX:e.touches[0].clientY:n.value===`horizontal`?e.clientX:e.clientY,O=e=>{let t=C(e);_.value=t,u?.(t,100-t)},k=e=>{if(!v.value||s.value)return;e.preventDefault();let t=E(D(e));y.value&&=null,O(t)},A=()=>{v.value&&(v.value=!1,document.body.style.cursor=``,document.body.style.userSelect=``,g?.(_.value),document.removeEventListener(`mousemove`,k),document.removeEventListener(`mouseup`,A),document.removeEventListener(`touchmove`,k),document.removeEventListener(`touchend`,A))},j=e=>{s.value||(e.preventDefault(),e.currentTarget?.focus(),v.value=!0,document.body.style.cursor=n.value===`horizontal`?`col-resize`:`row-resize`,document.body.style.userSelect=`none`,h?.(_.value),document.addEventListener(`mousemove`,k),document.addEventListener(`mouseup`,A),document.addEventListener(`touchmove`,k,{passive:!1}),document.addEventListener(`touchend`,A))},M=()=>{s.value||!c.value||F(`first`)},N=(e=`first`)=>{!c.value||y.value===e||(y.value||(b.value=_.value),y.value=e,e===`first`?_.value=0:_.value=100,f?.(e),u?.(_.value,100-_.value))},P=()=>{if(!y.value)return;let e=y.value;y.value=null,_.value=b.value,m?.(e),u?.(_.value,100-_.value)},F=(e=`first`)=>{y.value?P():N(e)},I=(e,t)=>({ArrowLeft:t?-l:0,ArrowRight:t?l:0,ArrowUp:t?0:-l,ArrowDown:t?0:l})[e]??null;return d(()=>{document.removeEventListener(`mousemove`,k),document.removeEventListener(`mouseup`,A),document.removeEventListener(`touchmove`,k),document.removeEventListener(`touchend`,A)}),{panelSize:_,isDragging:v,collapsedTarget:y,isFirstCollapsed:x,isSecondCollapsed:S,handleMouseDown:j,handleDoubleClick:M,handleKeyDown:e=>{if(s.value)return;if(e.key===`Home`){O(a),e.preventDefault();return}if(e.key===`End`){O(o),e.preventDefault();return}let t=I(e.key,n.value===`horizontal`);t===null||t===0||(e.preventDefault(),y.value&&=null,O(_.value+t))},collapse:N,expand:P,toggle:F,resetSize:()=>{y.value=null,_.value=i,u?.(i,100-i)},setSize:e=>{y.value=null,O(e)},getPanelInfo:()=>({first:{size:_.value,collapsed:x.value},second:{size:100-_.value,collapsed:S.value}})}}const b={class:`split-panel__content`},x=[`aria-orientation`,`aria-valuenow`],S={class:`split-gutter__visual`},C={class:`split-gutter__dots`},w=[`title`],T=[`title`],E={class:`split-panel__content`};var D=t(c({name:`C_SplitPane`,__name:`index`,props:{direction:{default:`horizontal`},defaultSize:{default:50},minSize:{default:0},maxSize:{default:100},disabled:{type:Boolean,default:!1},collapsible:{type:Boolean,default:!0},showCollapseButton:{type:Boolean,default:!0},gutterSize:{default:6},step:{default:2}},emits:[`resize`,`collapse`,`expand`,`drag-start`,`drag-end`],setup(t,{expose:c,emit:d}){let D=t,O=d,k=p(null),{panelSize:A,isDragging:j,isFirstCollapsed:M,isSecondCollapsed:N,handleMouseDown:P,handleDoubleClick:F,handleKeyDown:I,collapse:L,expand:R,toggle:z,resetSize:B,setSize:V,getPanelInfo:H}=y({containerRef:k,direction:g(D,`direction`),defaultSize:D.defaultSize,minSize:D.minSize,maxSize:D.maxSize,disabled:g(D,`disabled`),collapsible:g(D,`collapsible`),step:D.step,onResize:(e,t)=>O(`resize`,e,t),onCollapse:e=>O(`collapse`,e),onExpand:e=>O(`expand`,e),onDragStart:e=>O(`drag-start`,e),onDragEnd:e=>O(`drag-end`,e)}),U=r(()=>{let e=`calc(${A.value}% - ${D.gutterSize/2}px)`;return D.direction===`horizontal`?{width:e}:{height:e}}),W=r(()=>{let e=`calc(${100-A.value}% - ${D.gutterSize/2}px)`;return D.direction===`horizontal`?{width:e}:{height:e}}),G=r(()=>D.direction===`horizontal`?{width:`${D.gutterSize}px`}:{height:`${D.gutterSize}px`}),K=r(()=>D.direction===`horizontal`?M.value?`mdi:chevron-right`:`mdi:chevron-left`:M.value?`mdi:chevron-down`:`mdi:chevron-up`),q=r(()=>D.direction===`horizontal`?N.value?`mdi:chevron-left`:`mdi:chevron-right`:N.value?`mdi:chevron-up`:`mdi:chevron-down`);return c({collapse:L,expand:R,toggle:z,resetSize:B,getPanelInfo:H,setSize:V}),(t,r)=>(f(),a(`div`,{ref_key:`containerRef`,ref:k,class:l([`c-split-pane`,[`c-split-pane--${t.direction}`,{"c-split-pane--dragging":_(j),"c-split-pane--disabled":t.disabled,"c-split-pane--collapsed-first":_(M),"c-split-pane--collapsed-second":_(N)}]])},[i(` 首面板 `),o(`div`,{class:`split-panel split-panel--first`,style:u(U.value)},[o(`div`,b,[h(t.$slots,`first`,{},void 0,!0)])],4),i(` 分割线手柄 `),o(`div`,{class:`split-gutter`,style:u(G.value),role:`separator`,"aria-orientation":t.direction===`horizontal`?`vertical`:`horizontal`,"aria-valuenow":Math.round(_(A)),"aria-valuemin":0,"aria-valuemax":100,tabindex:`0`,onMousedown:r[4]||=(...e)=>_(P)&&_(P)(...e),onTouchstart:r[5]||=v((...e)=>_(P)&&_(P)(...e),[`prevent`]),onDblclick:r[6]||=(...e)=>_(F)&&_(F)(...e),onKeydown:r[7]||=(...e)=>_(I)&&_(I)(...e)},[o(`div`,S,[o(`div`,C,[(f(),a(n,null,m(3,e=>o(`span`,{key:e,class:`split-gutter__dot`})),64))])]),i(` 折叠按钮 `),t.showCollapseButton&&t.collapsible?(f(),a(n,{key:0},[o(`button`,{class:`split-gutter__collapse-btn split-gutter__collapse-btn--first`,title:_(M)?`展开首面板`:`折叠首面板`,onClick:r[0]||=v(e=>_(z)(`first`),[`stop`]),onMousedown:r[1]||=v(()=>{},[`stop`])},[s(e,{name:K.value,size:16,color:`currentColor`},null,8,[`name`])],40,w),o(`button`,{class:`split-gutter__collapse-btn split-gutter__collapse-btn--second`,title:_(N)?`展开第二面板`:`折叠第二面板`,onClick:r[2]||=v(e=>_(z)(`second`),[`stop`]),onMousedown:r[3]||=v(()=>{},[`stop`])},[s(e,{name:q.value,size:16,color:`currentColor`},null,8,[`name`])],40,T)],64)):i(`v-if`,!0)],44,x),i(` 第二面板 `),o(`div`,{class:`split-panel split-panel--second`,style:u(W.value)},[o(`div`,E,[h(t.$slots,`second`,{},void 0,!0)])],4)],2))}}),[[`__scopeId`,`data-v-396d0f5b`]]);export{y as n,D as t};
356
2
  //# sourceMappingURL=C_SplitPane2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"C_SplitPane2.js","names":["direction","disabled","showCollapseButton","collapsible"],"sources":["../src/components/C_SplitPane/composables/useSplitResize.ts","../src/components/C_SplitPane/index.vue","../src/components/C_SplitPane/index.vue","../src/components/C_SplitPane/index.vue"],"sourcesContent":["import { ref, computed, onUnmounted } from \"vue\";\r\nimport type { Ref } from \"vue\";\r\nimport type { CollapseTarget, SplitDirection } from \"../types\";\r\n\r\ninterface UseSplitResizeOptions {\r\n /** 容器引用 */\r\n containerRef: Ref<HTMLElement | null>;\r\n /** 分割方向 */\r\n direction: Ref<SplitDirection>;\r\n /** 首面板默认大小(百分比) */\r\n defaultSize: number;\r\n /** 首面板最小大小(百分比) */\r\n minSize: number;\r\n /** 首面板最大大小(百分比) */\r\n maxSize: number;\r\n /** 是否禁用 */\r\n disabled: Ref<boolean>;\r\n /** 是否可折叠 */\r\n collapsible: Ref<boolean>;\r\n /** 键盘微调步长(百分比) */\r\n step: number;\r\n /** resize 回调 */\r\n onResize?: (firstSize: number, secondSize: number) => void;\r\n /** 折叠回调 */\r\n onCollapse?: (target: CollapseTarget) => void;\r\n /** 展开回调 */\r\n onExpand?: (target: CollapseTarget) => void;\r\n /** 拖拽开始回调 */\r\n onDragStart?: (size: number) => void;\r\n /** 拖拽结束回调 */\r\n onDragEnd?: (size: number) => void;\r\n}\r\n\r\n/**\r\n * 分割面板拖拽调整逻辑\r\n */\r\nexport function useSplitResize(options: UseSplitResizeOptions) {\r\n const {\r\n containerRef,\r\n direction,\r\n defaultSize,\r\n minSize,\r\n maxSize,\r\n disabled,\r\n collapsible,\r\n step,\r\n onResize,\r\n onCollapse,\r\n onExpand,\r\n onDragStart,\r\n onDragEnd,\r\n } = options;\r\n\r\n /** 首面板当前大小(百分比) */\r\n const panelSize = ref(defaultSize);\r\n /** 是否正在拖拽 */\r\n const isDragging = ref(false);\r\n /** 折叠状态 */\r\n const collapsedTarget = ref<CollapseTarget | null>(null);\r\n /** 折叠前记住的面板大小 */\r\n const sizeBeforeCollapse = ref(defaultSize);\r\n\r\n /** 首面板是否折叠 */\r\n const isFirstCollapsed = computed(() => collapsedTarget.value === \"first\");\r\n /** 第二面板是否折叠 */\r\n const isSecondCollapsed = computed(() => collapsedTarget.value === \"second\");\r\n\r\n /**\r\n * 将大小限制在 min/max 范围内\r\n */\r\n const clampSize = (size: number): number => {\r\n return Math.min(maxSize, Math.max(minSize, size));\r\n };\r\n\r\n /**\r\n * 获取容器在分割方向上的总长度(px)\r\n */\r\n const getContainerLength = (): number => {\r\n const container = containerRef.value;\r\n if (!container) return 0;\r\n return direction.value === \"horizontal\"\r\n ? container.offsetWidth\r\n : container.offsetHeight;\r\n };\r\n\r\n /**\r\n * 获取容器在分割方向上的起始坐标\r\n */\r\n const getContainerStart = (): number => {\r\n const container = containerRef.value;\r\n if (!container) return 0;\r\n const rect = container.getBoundingClientRect();\r\n return direction.value === \"horizontal\" ? rect.left : rect.top;\r\n };\r\n\r\n /**\r\n * 根据鼠标/触摸位置计算面板大小(百分比)\r\n */\r\n const calcSizeFromPosition = (clientPos: number): number => {\r\n const containerLength = getContainerLength();\r\n if (containerLength === 0) return panelSize.value;\r\n\r\n const containerStart = getContainerStart();\r\n const offset = clientPos - containerStart;\r\n const percentage = (offset / containerLength) * 100;\r\n\r\n return clampSize(percentage);\r\n };\r\n\r\n /**\r\n * 获取事件的位置坐标\r\n */\r\n const getClientPos = (e: MouseEvent | TouchEvent): number => {\r\n if (e instanceof TouchEvent) {\r\n return direction.value === \"horizontal\"\r\n ? e.touches[0].clientX\r\n : e.touches[0].clientY;\r\n }\r\n return direction.value === \"horizontal\" ? e.clientX : e.clientY;\r\n };\r\n\r\n /**\r\n * 更新面板大小\r\n */\r\n const updateSize = (newSize: number) => {\r\n const clamped = clampSize(newSize);\r\n panelSize.value = clamped;\r\n onResize?.(clamped, 100 - clamped);\r\n };\r\n\r\n /* ─── 拖拽逻辑 ──────────────────────────────── */\r\n const handleMouseMove = (e: MouseEvent | TouchEvent) => {\r\n if (!isDragging.value || disabled.value) return;\r\n\r\n e.preventDefault();\r\n const pos = getClientPos(e);\r\n const newSize = calcSizeFromPosition(pos);\r\n\r\n /* 拖拽过程中取消折叠状态 */\r\n if (collapsedTarget.value) {\r\n collapsedTarget.value = null;\r\n }\r\n updateSize(newSize);\r\n };\r\n\r\n const handleMouseUp = () => {\r\n if (!isDragging.value) return;\r\n\r\n isDragging.value = false;\r\n document.body.style.cursor = \"\";\r\n document.body.style.userSelect = \"\";\r\n\r\n onDragEnd?.(panelSize.value);\r\n\r\n document.removeEventListener(\"mousemove\", handleMouseMove);\r\n document.removeEventListener(\"mouseup\", handleMouseUp);\r\n document.removeEventListener(\"touchmove\", handleMouseMove);\r\n document.removeEventListener(\"touchend\", handleMouseUp);\r\n };\r\n\r\n const handleMouseDown = (e: MouseEvent | TouchEvent) => {\r\n if (disabled.value) return;\r\n\r\n e.preventDefault();\r\n /* preventDefault 会阻止默认聚焦行为,需手动 focus 以支持键盘控制 */\r\n (e.currentTarget as HTMLElement)?.focus();\r\n isDragging.value = true;\r\n\r\n document.body.style.cursor =\r\n direction.value === \"horizontal\" ? \"col-resize\" : \"row-resize\";\r\n document.body.style.userSelect = \"none\";\r\n\r\n onDragStart?.(panelSize.value);\r\n\r\n document.addEventListener(\"mousemove\", handleMouseMove);\r\n document.addEventListener(\"mouseup\", handleMouseUp);\r\n document.addEventListener(\"touchmove\", handleMouseMove, { passive: false });\r\n document.addEventListener(\"touchend\", handleMouseUp);\r\n };\r\n\r\n /* ─── 双击折叠 ──────────────────────────────── */\r\n const handleDoubleClick = () => {\r\n if (disabled.value || !collapsible.value) return;\r\n toggle(\"first\");\r\n };\r\n\r\n /* ─── 折叠 / 展开 ───────────────────────────── */\r\n const collapse = (target: CollapseTarget = \"first\") => {\r\n if (!collapsible.value || collapsedTarget.value === target) return;\r\n\r\n /* 记住折叠前的大小 */\r\n if (!collapsedTarget.value) {\r\n sizeBeforeCollapse.value = panelSize.value;\r\n }\r\n\r\n collapsedTarget.value = target;\r\n\r\n if (target === \"first\") {\r\n panelSize.value = 0;\r\n } else {\r\n panelSize.value = 100;\r\n }\r\n\r\n onCollapse?.(target);\r\n onResize?.(panelSize.value, 100 - panelSize.value);\r\n };\r\n\r\n const expand = () => {\r\n if (!collapsedTarget.value) return;\r\n\r\n const target = collapsedTarget.value;\r\n collapsedTarget.value = null;\r\n panelSize.value = sizeBeforeCollapse.value;\r\n\r\n onExpand?.(target);\r\n onResize?.(panelSize.value, 100 - panelSize.value);\r\n };\r\n\r\n const toggle = (target: CollapseTarget = \"first\") => {\r\n if (collapsedTarget.value) {\r\n expand();\r\n } else {\r\n collapse(target);\r\n }\r\n };\r\n\r\n /* ─── 键盘微调 ──────────────────────────────── */\r\n /**\r\n * 根据按键获取增量\r\n */\r\n const getKeyDelta = (key: string, isHorizontal: boolean): number | null => {\r\n const keyMap: Record<string, number | null> = {\r\n ArrowLeft: isHorizontal ? -step : 0,\r\n ArrowRight: isHorizontal ? step : 0,\r\n ArrowUp: !isHorizontal ? -step : 0,\r\n ArrowDown: !isHorizontal ? step : 0,\r\n };\r\n return keyMap[key] ?? null;\r\n };\r\n\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (disabled.value) return;\r\n\r\n /* Home / End 直接跳到极值 */\r\n if (e.key === \"Home\") {\r\n updateSize(minSize);\r\n e.preventDefault();\r\n return;\r\n }\r\n if (e.key === \"End\") {\r\n updateSize(maxSize);\r\n e.preventDefault();\r\n return;\r\n }\r\n\r\n const delta = getKeyDelta(e.key, direction.value === \"horizontal\");\r\n if (delta === null || delta === 0) return;\r\n\r\n e.preventDefault();\r\n if (collapsedTarget.value) collapsedTarget.value = null;\r\n updateSize(panelSize.value + delta);\r\n };\r\n\r\n /* ─── 重置 / 查询 ───────────────────────────── */\r\n const resetSize = () => {\r\n collapsedTarget.value = null;\r\n panelSize.value = defaultSize;\r\n onResize?.(defaultSize, 100 - defaultSize);\r\n };\r\n\r\n const setSize = (size: number) => {\r\n collapsedTarget.value = null;\r\n updateSize(size);\r\n };\r\n\r\n const getPanelInfo = () => ({\r\n first: {\r\n size: panelSize.value,\r\n collapsed: isFirstCollapsed.value,\r\n },\r\n second: {\r\n size: 100 - panelSize.value,\r\n collapsed: isSecondCollapsed.value,\r\n },\r\n });\r\n\r\n /* 清理 */\r\n onUnmounted(() => {\r\n document.removeEventListener(\"mousemove\", handleMouseMove);\r\n document.removeEventListener(\"mouseup\", handleMouseUp);\r\n document.removeEventListener(\"touchmove\", handleMouseMove);\r\n document.removeEventListener(\"touchend\", handleMouseUp);\r\n });\r\n\r\n return {\r\n panelSize,\r\n isDragging,\r\n collapsedTarget,\r\n isFirstCollapsed,\r\n isSecondCollapsed,\r\n handleMouseDown,\r\n handleDoubleClick,\r\n handleKeyDown,\r\n collapse,\r\n expand,\r\n toggle,\r\n resetSize,\r\n setSize,\r\n getPanelInfo,\r\n };\r\n}\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-16\r\n * @Description: 分割面板组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n ref=\"containerRef\"\r\n class=\"c-split-pane\"\r\n :class=\"[\r\n `c-split-pane--${direction}`,\r\n {\r\n 'c-split-pane--dragging': isDragging,\r\n 'c-split-pane--disabled': disabled,\r\n 'c-split-pane--collapsed-first': isFirstCollapsed,\r\n 'c-split-pane--collapsed-second': isSecondCollapsed,\r\n },\r\n ]\"\r\n >\r\n <!-- 首面板 -->\r\n <div class=\"split-panel split-panel--first\" :style=\"firstPanelStyle\">\r\n <div class=\"split-panel__content\">\r\n <slot name=\"first\" />\r\n </div>\r\n </div>\r\n\r\n <!-- 分割线手柄 -->\r\n <div\r\n class=\"split-gutter\"\r\n :style=\"gutterStyle\"\r\n role=\"separator\"\r\n :aria-orientation=\"direction === 'horizontal' ? 'vertical' : 'horizontal'\"\r\n :aria-valuenow=\"Math.round(panelSize)\"\r\n :aria-valuemin=\"0\"\r\n :aria-valuemax=\"100\"\r\n tabindex=\"0\"\r\n @mousedown=\"handleMouseDown\"\r\n @touchstart.prevent=\"handleMouseDown\"\r\n @dblclick=\"handleDoubleClick\"\r\n @keydown=\"handleKeyDown\"\r\n >\r\n <div class=\"split-gutter__visual\">\r\n <div class=\"split-gutter__dots\">\r\n <span v-for=\"i in 3\" :key=\"i\" class=\"split-gutter__dot\" />\r\n </div>\r\n </div>\r\n\r\n <!-- 折叠按钮 -->\r\n <template v-if=\"showCollapseButton && collapsible\">\r\n <button\r\n class=\"split-gutter__collapse-btn split-gutter__collapse-btn--first\"\r\n :title=\"isFirstCollapsed ? '展开首面板' : '折叠首面板'\"\r\n @click.stop=\"toggle('first')\"\r\n @mousedown.stop\r\n >\r\n <C_Icon :name=\"collapseFirstIcon\" :size=\"16\" color=\"currentColor\" />\r\n </button>\r\n <button\r\n class=\"split-gutter__collapse-btn split-gutter__collapse-btn--second\"\r\n :title=\"isSecondCollapsed ? '展开第二面板' : '折叠第二面板'\"\r\n @click.stop=\"toggle('second')\"\r\n @mousedown.stop\r\n >\r\n <C_Icon :name=\"collapseSecondIcon\" :size=\"16\" color=\"currentColor\" />\r\n </button>\r\n </template>\r\n </div>\r\n\r\n <!-- 第二面板 -->\r\n <div class=\"split-panel split-panel--second\" :style=\"secondPanelStyle\">\r\n <div class=\"split-panel__content\">\r\n <slot name=\"second\" />\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, toRef } from \"vue\";\r\nimport C_Icon from \"../C_Icon/index.vue\";\r\nimport { useSplitResize } from \"./composables/useSplitResize\";\r\nimport type { CollapseTarget, SplitDirection, SplitPaneExpose } from \"./types\";\r\n\r\ndefineOptions({ name: \"C_SplitPane\" });\r\n\r\ninterface Props {\r\n /** 分割方向 */\r\n direction?: SplitDirection;\r\n /** 首面板默认大小(百分比 0-100) */\r\n defaultSize?: number;\r\n /** 首面板最小大小(百分比 0-100) */\r\n minSize?: number;\r\n /** 首面板最大大小(百分比 0-100) */\r\n maxSize?: number;\r\n /** 是否禁用拖拽调整 */\r\n disabled?: boolean;\r\n /** 是否可折叠 */\r\n collapsible?: boolean;\r\n /** 是否显示折叠按钮 */\r\n showCollapseButton?: boolean;\r\n /** 分割线宽度(px) */\r\n gutterSize?: number;\r\n /** 键盘微调步长(百分比) */\r\n step?: number;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n direction: \"horizontal\",\r\n defaultSize: 50,\r\n minSize: 0,\r\n maxSize: 100,\r\n disabled: false,\r\n collapsible: true,\r\n showCollapseButton: true,\r\n gutterSize: 6,\r\n step: 2,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n resize: [firstSize: number, secondSize: number];\r\n collapse: [target: CollapseTarget];\r\n expand: [target: CollapseTarget];\r\n \"drag-start\": [size: number];\r\n \"drag-end\": [size: number];\r\n}>();\r\n\r\nconst containerRef = ref<HTMLElement | null>(null);\r\n\r\nconst {\r\n panelSize,\r\n isDragging,\r\n isFirstCollapsed,\r\n isSecondCollapsed,\r\n handleMouseDown,\r\n handleDoubleClick,\r\n handleKeyDown,\r\n collapse,\r\n expand,\r\n toggle,\r\n resetSize,\r\n setSize,\r\n getPanelInfo,\r\n} = useSplitResize({\r\n containerRef,\r\n direction: toRef(props, \"direction\"),\r\n defaultSize: props.defaultSize,\r\n minSize: props.minSize,\r\n maxSize: props.maxSize,\r\n disabled: toRef(props, \"disabled\"),\r\n collapsible: toRef(props, \"collapsible\"),\r\n step: props.step,\r\n onResize: (first, second) => emit(\"resize\", first, second),\r\n onCollapse: (target) => emit(\"collapse\", target),\r\n onExpand: (target) => emit(\"expand\", target),\r\n onDragStart: (size) => emit(\"drag-start\", size),\r\n onDragEnd: (size) => emit(\"drag-end\", size),\r\n});\r\n\r\n/* ─── 计算样式 ──────────────────────────────── */\r\nconst firstPanelStyle = computed(() => {\r\n const sizeValue = `calc(${panelSize.value}% - ${props.gutterSize / 2}px)`;\r\n return props.direction === \"horizontal\"\r\n ? { width: sizeValue }\r\n : { height: sizeValue };\r\n});\r\n\r\nconst secondPanelStyle = computed(() => {\r\n const sizeValue = `calc(${100 - panelSize.value}% - ${props.gutterSize / 2}px)`;\r\n return props.direction === \"horizontal\"\r\n ? { width: sizeValue }\r\n : { height: sizeValue };\r\n});\r\n\r\nconst gutterStyle = computed(() => {\r\n return props.direction === \"horizontal\"\r\n ? { width: `${props.gutterSize}px` }\r\n : { height: `${props.gutterSize}px` };\r\n});\r\n\r\n/* ─── 折叠按钮图标 ──────────────────────────── */\r\nconst collapseFirstIcon = computed(() => {\r\n if (props.direction === \"horizontal\") {\r\n return isFirstCollapsed.value ? \"mdi:chevron-right\" : \"mdi:chevron-left\";\r\n }\r\n return isFirstCollapsed.value ? \"mdi:chevron-down\" : \"mdi:chevron-up\";\r\n});\r\n\r\nconst collapseSecondIcon = computed(() => {\r\n if (props.direction === \"horizontal\") {\r\n return isSecondCollapsed.value ? \"mdi:chevron-left\" : \"mdi:chevron-right\";\r\n }\r\n return isSecondCollapsed.value ? \"mdi:chevron-up\" : \"mdi:chevron-down\";\r\n});\r\n\r\n/* ─── 暴露方法 ──────────────────────────────── */\r\ndefineExpose<SplitPaneExpose>({\r\n collapse,\r\n expand,\r\n toggle,\r\n resetSize,\r\n getPanelInfo,\r\n setSize,\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: 2025-06-16\r\n * @Description: 分割面板组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n ref=\"containerRef\"\r\n class=\"c-split-pane\"\r\n :class=\"[\r\n `c-split-pane--${direction}`,\r\n {\r\n 'c-split-pane--dragging': isDragging,\r\n 'c-split-pane--disabled': disabled,\r\n 'c-split-pane--collapsed-first': isFirstCollapsed,\r\n 'c-split-pane--collapsed-second': isSecondCollapsed,\r\n },\r\n ]\"\r\n >\r\n <!-- 首面板 -->\r\n <div class=\"split-panel split-panel--first\" :style=\"firstPanelStyle\">\r\n <div class=\"split-panel__content\">\r\n <slot name=\"first\" />\r\n </div>\r\n </div>\r\n\r\n <!-- 分割线手柄 -->\r\n <div\r\n class=\"split-gutter\"\r\n :style=\"gutterStyle\"\r\n role=\"separator\"\r\n :aria-orientation=\"direction === 'horizontal' ? 'vertical' : 'horizontal'\"\r\n :aria-valuenow=\"Math.round(panelSize)\"\r\n :aria-valuemin=\"0\"\r\n :aria-valuemax=\"100\"\r\n tabindex=\"0\"\r\n @mousedown=\"handleMouseDown\"\r\n @touchstart.prevent=\"handleMouseDown\"\r\n @dblclick=\"handleDoubleClick\"\r\n @keydown=\"handleKeyDown\"\r\n >\r\n <div class=\"split-gutter__visual\">\r\n <div class=\"split-gutter__dots\">\r\n <span v-for=\"i in 3\" :key=\"i\" class=\"split-gutter__dot\" />\r\n </div>\r\n </div>\r\n\r\n <!-- 折叠按钮 -->\r\n <template v-if=\"showCollapseButton && collapsible\">\r\n <button\r\n class=\"split-gutter__collapse-btn split-gutter__collapse-btn--first\"\r\n :title=\"isFirstCollapsed ? '展开首面板' : '折叠首面板'\"\r\n @click.stop=\"toggle('first')\"\r\n @mousedown.stop\r\n >\r\n <C_Icon :name=\"collapseFirstIcon\" :size=\"16\" color=\"currentColor\" />\r\n </button>\r\n <button\r\n class=\"split-gutter__collapse-btn split-gutter__collapse-btn--second\"\r\n :title=\"isSecondCollapsed ? '展开第二面板' : '折叠第二面板'\"\r\n @click.stop=\"toggle('second')\"\r\n @mousedown.stop\r\n >\r\n <C_Icon :name=\"collapseSecondIcon\" :size=\"16\" color=\"currentColor\" />\r\n </button>\r\n </template>\r\n </div>\r\n\r\n <!-- 第二面板 -->\r\n <div class=\"split-panel split-panel--second\" :style=\"secondPanelStyle\">\r\n <div class=\"split-panel__content\">\r\n <slot name=\"second\" />\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, toRef } from \"vue\";\r\nimport C_Icon from \"../C_Icon/index.vue\";\r\nimport { useSplitResize } from \"./composables/useSplitResize\";\r\nimport type { CollapseTarget, SplitDirection, SplitPaneExpose } from \"./types\";\r\n\r\ndefineOptions({ name: \"C_SplitPane\" });\r\n\r\ninterface Props {\r\n /** 分割方向 */\r\n direction?: SplitDirection;\r\n /** 首面板默认大小(百分比 0-100) */\r\n defaultSize?: number;\r\n /** 首面板最小大小(百分比 0-100) */\r\n minSize?: number;\r\n /** 首面板最大大小(百分比 0-100) */\r\n maxSize?: number;\r\n /** 是否禁用拖拽调整 */\r\n disabled?: boolean;\r\n /** 是否可折叠 */\r\n collapsible?: boolean;\r\n /** 是否显示折叠按钮 */\r\n showCollapseButton?: boolean;\r\n /** 分割线宽度(px) */\r\n gutterSize?: number;\r\n /** 键盘微调步长(百分比) */\r\n step?: number;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n direction: \"horizontal\",\r\n defaultSize: 50,\r\n minSize: 0,\r\n maxSize: 100,\r\n disabled: false,\r\n collapsible: true,\r\n showCollapseButton: true,\r\n gutterSize: 6,\r\n step: 2,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n resize: [firstSize: number, secondSize: number];\r\n collapse: [target: CollapseTarget];\r\n expand: [target: CollapseTarget];\r\n \"drag-start\": [size: number];\r\n \"drag-end\": [size: number];\r\n}>();\r\n\r\nconst containerRef = ref<HTMLElement | null>(null);\r\n\r\nconst {\r\n panelSize,\r\n isDragging,\r\n isFirstCollapsed,\r\n isSecondCollapsed,\r\n handleMouseDown,\r\n handleDoubleClick,\r\n handleKeyDown,\r\n collapse,\r\n expand,\r\n toggle,\r\n resetSize,\r\n setSize,\r\n getPanelInfo,\r\n} = useSplitResize({\r\n containerRef,\r\n direction: toRef(props, \"direction\"),\r\n defaultSize: props.defaultSize,\r\n minSize: props.minSize,\r\n maxSize: props.maxSize,\r\n disabled: toRef(props, \"disabled\"),\r\n collapsible: toRef(props, \"collapsible\"),\r\n step: props.step,\r\n onResize: (first, second) => emit(\"resize\", first, second),\r\n onCollapse: (target) => emit(\"collapse\", target),\r\n onExpand: (target) => emit(\"expand\", target),\r\n onDragStart: (size) => emit(\"drag-start\", size),\r\n onDragEnd: (size) => emit(\"drag-end\", size),\r\n});\r\n\r\n/* ─── 计算样式 ──────────────────────────────── */\r\nconst firstPanelStyle = computed(() => {\r\n const sizeValue = `calc(${panelSize.value}% - ${props.gutterSize / 2}px)`;\r\n return props.direction === \"horizontal\"\r\n ? { width: sizeValue }\r\n : { height: sizeValue };\r\n});\r\n\r\nconst secondPanelStyle = computed(() => {\r\n const sizeValue = `calc(${100 - panelSize.value}% - ${props.gutterSize / 2}px)`;\r\n return props.direction === \"horizontal\"\r\n ? { width: sizeValue }\r\n : { height: sizeValue };\r\n});\r\n\r\nconst gutterStyle = computed(() => {\r\n return props.direction === \"horizontal\"\r\n ? { width: `${props.gutterSize}px` }\r\n : { height: `${props.gutterSize}px` };\r\n});\r\n\r\n/* ─── 折叠按钮图标 ──────────────────────────── */\r\nconst collapseFirstIcon = computed(() => {\r\n if (props.direction === \"horizontal\") {\r\n return isFirstCollapsed.value ? \"mdi:chevron-right\" : \"mdi:chevron-left\";\r\n }\r\n return isFirstCollapsed.value ? \"mdi:chevron-down\" : \"mdi:chevron-up\";\r\n});\r\n\r\nconst collapseSecondIcon = computed(() => {\r\n if (props.direction === \"horizontal\") {\r\n return isSecondCollapsed.value ? \"mdi:chevron-left\" : \"mdi:chevron-right\";\r\n }\r\n return isSecondCollapsed.value ? \"mdi:chevron-up\" : \"mdi:chevron-down\";\r\n});\r\n\r\n/* ─── 暴露方法 ──────────────────────────────── */\r\ndefineExpose<SplitPaneExpose>({\r\n collapse,\r\n expand,\r\n toggle,\r\n resetSize,\r\n getPanelInfo,\r\n setSize,\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: 2025-06-16\r\n * @Description: 分割面板组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n ref=\"containerRef\"\r\n class=\"c-split-pane\"\r\n :class=\"[\r\n `c-split-pane--${direction}`,\r\n {\r\n 'c-split-pane--dragging': isDragging,\r\n 'c-split-pane--disabled': disabled,\r\n 'c-split-pane--collapsed-first': isFirstCollapsed,\r\n 'c-split-pane--collapsed-second': isSecondCollapsed,\r\n },\r\n ]\"\r\n >\r\n <!-- 首面板 -->\r\n <div class=\"split-panel split-panel--first\" :style=\"firstPanelStyle\">\r\n <div class=\"split-panel__content\">\r\n <slot name=\"first\" />\r\n </div>\r\n </div>\r\n\r\n <!-- 分割线手柄 -->\r\n <div\r\n class=\"split-gutter\"\r\n :style=\"gutterStyle\"\r\n role=\"separator\"\r\n :aria-orientation=\"direction === 'horizontal' ? 'vertical' : 'horizontal'\"\r\n :aria-valuenow=\"Math.round(panelSize)\"\r\n :aria-valuemin=\"0\"\r\n :aria-valuemax=\"100\"\r\n tabindex=\"0\"\r\n @mousedown=\"handleMouseDown\"\r\n @touchstart.prevent=\"handleMouseDown\"\r\n @dblclick=\"handleDoubleClick\"\r\n @keydown=\"handleKeyDown\"\r\n >\r\n <div class=\"split-gutter__visual\">\r\n <div class=\"split-gutter__dots\">\r\n <span v-for=\"i in 3\" :key=\"i\" class=\"split-gutter__dot\" />\r\n </div>\r\n </div>\r\n\r\n <!-- 折叠按钮 -->\r\n <template v-if=\"showCollapseButton && collapsible\">\r\n <button\r\n class=\"split-gutter__collapse-btn split-gutter__collapse-btn--first\"\r\n :title=\"isFirstCollapsed ? '展开首面板' : '折叠首面板'\"\r\n @click.stop=\"toggle('first')\"\r\n @mousedown.stop\r\n >\r\n <C_Icon :name=\"collapseFirstIcon\" :size=\"16\" color=\"currentColor\" />\r\n </button>\r\n <button\r\n class=\"split-gutter__collapse-btn split-gutter__collapse-btn--second\"\r\n :title=\"isSecondCollapsed ? '展开第二面板' : '折叠第二面板'\"\r\n @click.stop=\"toggle('second')\"\r\n @mousedown.stop\r\n >\r\n <C_Icon :name=\"collapseSecondIcon\" :size=\"16\" color=\"currentColor\" />\r\n </button>\r\n </template>\r\n </div>\r\n\r\n <!-- 第二面板 -->\r\n <div class=\"split-panel split-panel--second\" :style=\"secondPanelStyle\">\r\n <div class=\"split-panel__content\">\r\n <slot name=\"second\" />\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, toRef } from \"vue\";\r\nimport C_Icon from \"../C_Icon/index.vue\";\r\nimport { useSplitResize } from \"./composables/useSplitResize\";\r\nimport type { CollapseTarget, SplitDirection, SplitPaneExpose } from \"./types\";\r\n\r\ndefineOptions({ name: \"C_SplitPane\" });\r\n\r\ninterface Props {\r\n /** 分割方向 */\r\n direction?: SplitDirection;\r\n /** 首面板默认大小(百分比 0-100) */\r\n defaultSize?: number;\r\n /** 首面板最小大小(百分比 0-100) */\r\n minSize?: number;\r\n /** 首面板最大大小(百分比 0-100) */\r\n maxSize?: number;\r\n /** 是否禁用拖拽调整 */\r\n disabled?: boolean;\r\n /** 是否可折叠 */\r\n collapsible?: boolean;\r\n /** 是否显示折叠按钮 */\r\n showCollapseButton?: boolean;\r\n /** 分割线宽度(px) */\r\n gutterSize?: number;\r\n /** 键盘微调步长(百分比) */\r\n step?: number;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n direction: \"horizontal\",\r\n defaultSize: 50,\r\n minSize: 0,\r\n maxSize: 100,\r\n disabled: false,\r\n collapsible: true,\r\n showCollapseButton: true,\r\n gutterSize: 6,\r\n step: 2,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n resize: [firstSize: number, secondSize: number];\r\n collapse: [target: CollapseTarget];\r\n expand: [target: CollapseTarget];\r\n \"drag-start\": [size: number];\r\n \"drag-end\": [size: number];\r\n}>();\r\n\r\nconst containerRef = ref<HTMLElement | null>(null);\r\n\r\nconst {\r\n panelSize,\r\n isDragging,\r\n isFirstCollapsed,\r\n isSecondCollapsed,\r\n handleMouseDown,\r\n handleDoubleClick,\r\n handleKeyDown,\r\n collapse,\r\n expand,\r\n toggle,\r\n resetSize,\r\n setSize,\r\n getPanelInfo,\r\n} = useSplitResize({\r\n containerRef,\r\n direction: toRef(props, \"direction\"),\r\n defaultSize: props.defaultSize,\r\n minSize: props.minSize,\r\n maxSize: props.maxSize,\r\n disabled: toRef(props, \"disabled\"),\r\n collapsible: toRef(props, \"collapsible\"),\r\n step: props.step,\r\n onResize: (first, second) => emit(\"resize\", first, second),\r\n onCollapse: (target) => emit(\"collapse\", target),\r\n onExpand: (target) => emit(\"expand\", target),\r\n onDragStart: (size) => emit(\"drag-start\", size),\r\n onDragEnd: (size) => emit(\"drag-end\", size),\r\n});\r\n\r\n/* ─── 计算样式 ──────────────────────────────── */\r\nconst firstPanelStyle = computed(() => {\r\n const sizeValue = `calc(${panelSize.value}% - ${props.gutterSize / 2}px)`;\r\n return props.direction === \"horizontal\"\r\n ? { width: sizeValue }\r\n : { height: sizeValue };\r\n});\r\n\r\nconst secondPanelStyle = computed(() => {\r\n const sizeValue = `calc(${100 - panelSize.value}% - ${props.gutterSize / 2}px)`;\r\n return props.direction === \"horizontal\"\r\n ? { width: sizeValue }\r\n : { height: sizeValue };\r\n});\r\n\r\nconst gutterStyle = computed(() => {\r\n return props.direction === \"horizontal\"\r\n ? { width: `${props.gutterSize}px` }\r\n : { height: `${props.gutterSize}px` };\r\n});\r\n\r\n/* ─── 折叠按钮图标 ──────────────────────────── */\r\nconst collapseFirstIcon = computed(() => {\r\n if (props.direction === \"horizontal\") {\r\n return isFirstCollapsed.value ? \"mdi:chevron-right\" : \"mdi:chevron-left\";\r\n }\r\n return isFirstCollapsed.value ? \"mdi:chevron-down\" : \"mdi:chevron-up\";\r\n});\r\n\r\nconst collapseSecondIcon = computed(() => {\r\n if (props.direction === \"horizontal\") {\r\n return isSecondCollapsed.value ? \"mdi:chevron-left\" : \"mdi:chevron-right\";\r\n }\r\n return isSecondCollapsed.value ? \"mdi:chevron-up\" : \"mdi:chevron-down\";\r\n});\r\n\r\n/* ─── 暴露方法 ──────────────────────────────── */\r\ndefineExpose<SplitPaneExpose>({\r\n collapse,\r\n expand,\r\n toggle,\r\n resetSize,\r\n getPanelInfo,\r\n setSize,\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_SplitPane2.js","names":["direction","disabled","showCollapseButton","collapsible"],"sources":["../src/components/C_SplitPane/composables/useSplitResize.ts","../src/components/C_SplitPane/index.vue","../src/components/C_SplitPane/index.vue","../src/components/C_SplitPane/index.vue"],"sourcesContent":["import { ref, computed, onUnmounted } from \"vue\";\r\nimport type { Ref } from \"vue\";\r\nimport type { CollapseTarget, SplitDirection } from \"../types\";\r\n\r\ninterface UseSplitResizeOptions {\r\n /** 容器引用 */\r\n containerRef: Ref<HTMLElement | null>;\r\n /** 分割方向 */\r\n direction: Ref<SplitDirection>;\r\n /** 首面板默认大小(百分比) */\r\n defaultSize: number;\r\n /** 首面板最小大小(百分比) */\r\n minSize: number;\r\n /** 首面板最大大小(百分比) */\r\n maxSize: number;\r\n /** 是否禁用 */\r\n disabled: Ref<boolean>;\r\n /** 是否可折叠 */\r\n collapsible: Ref<boolean>;\r\n /** 键盘微调步长(百分比) */\r\n step: number;\r\n /** resize 回调 */\r\n onResize?: (firstSize: number, secondSize: number) => void;\r\n /** 折叠回调 */\r\n onCollapse?: (target: CollapseTarget) => void;\r\n /** 展开回调 */\r\n onExpand?: (target: CollapseTarget) => void;\r\n /** 拖拽开始回调 */\r\n onDragStart?: (size: number) => void;\r\n /** 拖拽结束回调 */\r\n onDragEnd?: (size: number) => void;\r\n}\r\n\r\n/**\r\n * 分割面板拖拽调整逻辑\r\n */\r\nexport function useSplitResize(options: UseSplitResizeOptions) {\r\n const {\r\n containerRef,\r\n direction,\r\n defaultSize,\r\n minSize,\r\n maxSize,\r\n disabled,\r\n collapsible,\r\n step,\r\n onResize,\r\n onCollapse,\r\n onExpand,\r\n onDragStart,\r\n onDragEnd,\r\n } = options;\r\n\r\n /** 首面板当前大小(百分比) */\r\n const panelSize = ref(defaultSize);\r\n /** 是否正在拖拽 */\r\n const isDragging = ref(false);\r\n /** 折叠状态 */\r\n const collapsedTarget = ref<CollapseTarget | null>(null);\r\n /** 折叠前记住的面板大小 */\r\n const sizeBeforeCollapse = ref(defaultSize);\r\n\r\n /** 首面板是否折叠 */\r\n const isFirstCollapsed = computed(() => collapsedTarget.value === \"first\");\r\n /** 第二面板是否折叠 */\r\n const isSecondCollapsed = computed(() => collapsedTarget.value === \"second\");\r\n\r\n /**\r\n * 将大小限制在 min/max 范围内\r\n */\r\n const clampSize = (size: number): number => {\r\n return Math.min(maxSize, Math.max(minSize, size));\r\n };\r\n\r\n /**\r\n * 获取容器在分割方向上的总长度(px)\r\n */\r\n const getContainerLength = (): number => {\r\n const container = containerRef.value;\r\n if (!container) return 0;\r\n return direction.value === \"horizontal\"\r\n ? container.offsetWidth\r\n : container.offsetHeight;\r\n };\r\n\r\n /**\r\n * 获取容器在分割方向上的起始坐标\r\n */\r\n const getContainerStart = (): number => {\r\n const container = containerRef.value;\r\n if (!container) return 0;\r\n const rect = container.getBoundingClientRect();\r\n return direction.value === \"horizontal\" ? rect.left : rect.top;\r\n };\r\n\r\n /**\r\n * 根据鼠标/触摸位置计算面板大小(百分比)\r\n */\r\n const calcSizeFromPosition = (clientPos: number): number => {\r\n const containerLength = getContainerLength();\r\n if (containerLength === 0) return panelSize.value;\r\n\r\n const containerStart = getContainerStart();\r\n const offset = clientPos - containerStart;\r\n const percentage = (offset / containerLength) * 100;\r\n\r\n return clampSize(percentage);\r\n };\r\n\r\n /**\r\n * 获取事件的位置坐标\r\n */\r\n const getClientPos = (e: MouseEvent | TouchEvent): number => {\r\n if (e instanceof TouchEvent) {\r\n return direction.value === \"horizontal\"\r\n ? e.touches[0].clientX\r\n : e.touches[0].clientY;\r\n }\r\n return direction.value === \"horizontal\" ? e.clientX : e.clientY;\r\n };\r\n\r\n /**\r\n * 更新面板大小\r\n */\r\n const updateSize = (newSize: number) => {\r\n const clamped = clampSize(newSize);\r\n panelSize.value = clamped;\r\n onResize?.(clamped, 100 - clamped);\r\n };\r\n\r\n /* ─── 拖拽逻辑 ──────────────────────────────── */\r\n const handleMouseMove = (e: MouseEvent | TouchEvent) => {\r\n if (!isDragging.value || disabled.value) return;\r\n\r\n e.preventDefault();\r\n const pos = getClientPos(e);\r\n const newSize = calcSizeFromPosition(pos);\r\n\r\n /* 拖拽过程中取消折叠状态 */\r\n if (collapsedTarget.value) {\r\n collapsedTarget.value = null;\r\n }\r\n updateSize(newSize);\r\n };\r\n\r\n const handleMouseUp = () => {\r\n if (!isDragging.value) return;\r\n\r\n isDragging.value = false;\r\n document.body.style.cursor = \"\";\r\n document.body.style.userSelect = \"\";\r\n\r\n onDragEnd?.(panelSize.value);\r\n\r\n document.removeEventListener(\"mousemove\", handleMouseMove);\r\n document.removeEventListener(\"mouseup\", handleMouseUp);\r\n document.removeEventListener(\"touchmove\", handleMouseMove);\r\n document.removeEventListener(\"touchend\", handleMouseUp);\r\n };\r\n\r\n const handleMouseDown = (e: MouseEvent | TouchEvent) => {\r\n if (disabled.value) return;\r\n\r\n e.preventDefault();\r\n /* preventDefault 会阻止默认聚焦行为,需手动 focus 以支持键盘控制 */\r\n (e.currentTarget as HTMLElement)?.focus();\r\n isDragging.value = true;\r\n\r\n document.body.style.cursor =\r\n direction.value === \"horizontal\" ? \"col-resize\" : \"row-resize\";\r\n document.body.style.userSelect = \"none\";\r\n\r\n onDragStart?.(panelSize.value);\r\n\r\n document.addEventListener(\"mousemove\", handleMouseMove);\r\n document.addEventListener(\"mouseup\", handleMouseUp);\r\n document.addEventListener(\"touchmove\", handleMouseMove, { passive: false });\r\n document.addEventListener(\"touchend\", handleMouseUp);\r\n };\r\n\r\n /* ─── 双击折叠 ──────────────────────────────── */\r\n const handleDoubleClick = () => {\r\n if (disabled.value || !collapsible.value) return;\r\n toggle(\"first\");\r\n };\r\n\r\n /* ─── 折叠 / 展开 ───────────────────────────── */\r\n const collapse = (target: CollapseTarget = \"first\") => {\r\n if (!collapsible.value || collapsedTarget.value === target) return;\r\n\r\n /* 记住折叠前的大小 */\r\n if (!collapsedTarget.value) {\r\n sizeBeforeCollapse.value = panelSize.value;\r\n }\r\n\r\n collapsedTarget.value = target;\r\n\r\n if (target === \"first\") {\r\n panelSize.value = 0;\r\n } else {\r\n panelSize.value = 100;\r\n }\r\n\r\n onCollapse?.(target);\r\n onResize?.(panelSize.value, 100 - panelSize.value);\r\n };\r\n\r\n const expand = () => {\r\n if (!collapsedTarget.value) return;\r\n\r\n const target = collapsedTarget.value;\r\n collapsedTarget.value = null;\r\n panelSize.value = sizeBeforeCollapse.value;\r\n\r\n onExpand?.(target);\r\n onResize?.(panelSize.value, 100 - panelSize.value);\r\n };\r\n\r\n const toggle = (target: CollapseTarget = \"first\") => {\r\n if (collapsedTarget.value) {\r\n expand();\r\n } else {\r\n collapse(target);\r\n }\r\n };\r\n\r\n /* ─── 键盘微调 ──────────────────────────────── */\r\n /**\r\n * 根据按键获取增量\r\n */\r\n const getKeyDelta = (key: string, isHorizontal: boolean): number | null => {\r\n const keyMap: Record<string, number | null> = {\r\n ArrowLeft: isHorizontal ? -step : 0,\r\n ArrowRight: isHorizontal ? step : 0,\r\n ArrowUp: !isHorizontal ? -step : 0,\r\n ArrowDown: !isHorizontal ? step : 0,\r\n };\r\n return keyMap[key] ?? null;\r\n };\r\n\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (disabled.value) return;\r\n\r\n /* Home / End 直接跳到极值 */\r\n if (e.key === \"Home\") {\r\n updateSize(minSize);\r\n e.preventDefault();\r\n return;\r\n }\r\n if (e.key === \"End\") {\r\n updateSize(maxSize);\r\n e.preventDefault();\r\n return;\r\n }\r\n\r\n const delta = getKeyDelta(e.key, direction.value === \"horizontal\");\r\n if (delta === null || delta === 0) return;\r\n\r\n e.preventDefault();\r\n if (collapsedTarget.value) collapsedTarget.value = null;\r\n updateSize(panelSize.value + delta);\r\n };\r\n\r\n /* ─── 重置 / 查询 ───────────────────────────── */\r\n const resetSize = () => {\r\n collapsedTarget.value = null;\r\n panelSize.value = defaultSize;\r\n onResize?.(defaultSize, 100 - defaultSize);\r\n };\r\n\r\n const setSize = (size: number) => {\r\n collapsedTarget.value = null;\r\n updateSize(size);\r\n };\r\n\r\n const getPanelInfo = () => ({\r\n first: {\r\n size: panelSize.value,\r\n collapsed: isFirstCollapsed.value,\r\n },\r\n second: {\r\n size: 100 - panelSize.value,\r\n collapsed: isSecondCollapsed.value,\r\n },\r\n });\r\n\r\n /* 清理 */\r\n onUnmounted(() => {\r\n document.removeEventListener(\"mousemove\", handleMouseMove);\r\n document.removeEventListener(\"mouseup\", handleMouseUp);\r\n document.removeEventListener(\"touchmove\", handleMouseMove);\r\n document.removeEventListener(\"touchend\", handleMouseUp);\r\n });\r\n\r\n return {\r\n panelSize,\r\n isDragging,\r\n collapsedTarget,\r\n isFirstCollapsed,\r\n isSecondCollapsed,\r\n handleMouseDown,\r\n handleDoubleClick,\r\n handleKeyDown,\r\n collapse,\r\n expand,\r\n toggle,\r\n resetSize,\r\n setSize,\r\n getPanelInfo,\r\n };\r\n}\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-16\r\n * @Description: 分割面板组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n ref=\"containerRef\"\r\n class=\"c-split-pane\"\r\n :class=\"[\r\n `c-split-pane--${direction}`,\r\n {\r\n 'c-split-pane--dragging': isDragging,\r\n 'c-split-pane--disabled': disabled,\r\n 'c-split-pane--collapsed-first': isFirstCollapsed,\r\n 'c-split-pane--collapsed-second': isSecondCollapsed,\r\n },\r\n ]\"\r\n >\r\n <!-- 首面板 -->\r\n <div class=\"split-panel split-panel--first\" :style=\"firstPanelStyle\">\r\n <div class=\"split-panel__content\">\r\n <slot name=\"first\" />\r\n </div>\r\n </div>\r\n\r\n <!-- 分割线手柄 -->\r\n <div\r\n class=\"split-gutter\"\r\n :style=\"gutterStyle\"\r\n role=\"separator\"\r\n :aria-orientation=\"direction === 'horizontal' ? 'vertical' : 'horizontal'\"\r\n :aria-valuenow=\"Math.round(panelSize)\"\r\n :aria-valuemin=\"0\"\r\n :aria-valuemax=\"100\"\r\n tabindex=\"0\"\r\n @mousedown=\"handleMouseDown\"\r\n @touchstart.prevent=\"handleMouseDown\"\r\n @dblclick=\"handleDoubleClick\"\r\n @keydown=\"handleKeyDown\"\r\n >\r\n <div class=\"split-gutter__visual\">\r\n <div class=\"split-gutter__dots\">\r\n <span v-for=\"i in 3\" :key=\"i\" class=\"split-gutter__dot\" />\r\n </div>\r\n </div>\r\n\r\n <!-- 折叠按钮 -->\r\n <template v-if=\"showCollapseButton && collapsible\">\r\n <button\r\n class=\"split-gutter__collapse-btn split-gutter__collapse-btn--first\"\r\n :title=\"isFirstCollapsed ? '展开首面板' : '折叠首面板'\"\r\n @click.stop=\"toggle('first')\"\r\n @mousedown.stop\r\n >\r\n <C_Icon :name=\"collapseFirstIcon\" :size=\"16\" color=\"currentColor\" />\r\n </button>\r\n <button\r\n class=\"split-gutter__collapse-btn split-gutter__collapse-btn--second\"\r\n :title=\"isSecondCollapsed ? '展开第二面板' : '折叠第二面板'\"\r\n @click.stop=\"toggle('second')\"\r\n @mousedown.stop\r\n >\r\n <C_Icon :name=\"collapseSecondIcon\" :size=\"16\" color=\"currentColor\" />\r\n </button>\r\n </template>\r\n </div>\r\n\r\n <!-- 第二面板 -->\r\n <div class=\"split-panel split-panel--second\" :style=\"secondPanelStyle\">\r\n <div class=\"split-panel__content\">\r\n <slot name=\"second\" />\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, toRef } from \"vue\";\r\nimport C_Icon from \"../C_Icon/index.vue\";\r\nimport { useSplitResize } from \"./composables/useSplitResize\";\r\nimport type { CollapseTarget, SplitDirection, SplitPaneExpose } from \"./types\";\r\n\r\ndefineOptions({ name: \"C_SplitPane\" });\r\n\r\ninterface Props {\r\n /** 分割方向 */\r\n direction?: SplitDirection;\r\n /** 首面板默认大小(百分比 0-100) */\r\n defaultSize?: number;\r\n /** 首面板最小大小(百分比 0-100) */\r\n minSize?: number;\r\n /** 首面板最大大小(百分比 0-100) */\r\n maxSize?: number;\r\n /** 是否禁用拖拽调整 */\r\n disabled?: boolean;\r\n /** 是否可折叠 */\r\n collapsible?: boolean;\r\n /** 是否显示折叠按钮 */\r\n showCollapseButton?: boolean;\r\n /** 分割线宽度(px) */\r\n gutterSize?: number;\r\n /** 键盘微调步长(百分比) */\r\n step?: number;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n direction: \"horizontal\",\r\n defaultSize: 50,\r\n minSize: 0,\r\n maxSize: 100,\r\n disabled: false,\r\n collapsible: true,\r\n showCollapseButton: true,\r\n gutterSize: 6,\r\n step: 2,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n resize: [firstSize: number, secondSize: number];\r\n collapse: [target: CollapseTarget];\r\n expand: [target: CollapseTarget];\r\n \"drag-start\": [size: number];\r\n \"drag-end\": [size: number];\r\n}>();\r\n\r\nconst containerRef = ref<HTMLElement | null>(null);\r\n\r\nconst {\r\n panelSize,\r\n isDragging,\r\n isFirstCollapsed,\r\n isSecondCollapsed,\r\n handleMouseDown,\r\n handleDoubleClick,\r\n handleKeyDown,\r\n collapse,\r\n expand,\r\n toggle,\r\n resetSize,\r\n setSize,\r\n getPanelInfo,\r\n} = useSplitResize({\r\n containerRef,\r\n direction: toRef(props, \"direction\"),\r\n defaultSize: props.defaultSize,\r\n minSize: props.minSize,\r\n maxSize: props.maxSize,\r\n disabled: toRef(props, \"disabled\"),\r\n collapsible: toRef(props, \"collapsible\"),\r\n step: props.step,\r\n onResize: (first, second) => emit(\"resize\", first, second),\r\n onCollapse: (target) => emit(\"collapse\", target),\r\n onExpand: (target) => emit(\"expand\", target),\r\n onDragStart: (size) => emit(\"drag-start\", size),\r\n onDragEnd: (size) => emit(\"drag-end\", size),\r\n});\r\n\r\n/* ─── 计算样式 ──────────────────────────────── */\r\nconst firstPanelStyle = computed(() => {\r\n const sizeValue = `calc(${panelSize.value}% - ${props.gutterSize / 2}px)`;\r\n return props.direction === \"horizontal\"\r\n ? { width: sizeValue }\r\n : { height: sizeValue };\r\n});\r\n\r\nconst secondPanelStyle = computed(() => {\r\n const sizeValue = `calc(${100 - panelSize.value}% - ${props.gutterSize / 2}px)`;\r\n return props.direction === \"horizontal\"\r\n ? { width: sizeValue }\r\n : { height: sizeValue };\r\n});\r\n\r\nconst gutterStyle = computed(() => {\r\n return props.direction === \"horizontal\"\r\n ? { width: `${props.gutterSize}px` }\r\n : { height: `${props.gutterSize}px` };\r\n});\r\n\r\n/* ─── 折叠按钮图标 ──────────────────────────── */\r\nconst collapseFirstIcon = computed(() => {\r\n if (props.direction === \"horizontal\") {\r\n return isFirstCollapsed.value ? \"mdi:chevron-right\" : \"mdi:chevron-left\";\r\n }\r\n return isFirstCollapsed.value ? \"mdi:chevron-down\" : \"mdi:chevron-up\";\r\n});\r\n\r\nconst collapseSecondIcon = computed(() => {\r\n if (props.direction === \"horizontal\") {\r\n return isSecondCollapsed.value ? \"mdi:chevron-left\" : \"mdi:chevron-right\";\r\n }\r\n return isSecondCollapsed.value ? \"mdi:chevron-up\" : \"mdi:chevron-down\";\r\n});\r\n\r\n/* ─── 暴露方法 ──────────────────────────────── */\r\ndefineExpose<SplitPaneExpose>({\r\n collapse,\r\n expand,\r\n toggle,\r\n resetSize,\r\n getPanelInfo,\r\n setSize,\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: 2025-06-16\r\n * @Description: 分割面板组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n ref=\"containerRef\"\r\n class=\"c-split-pane\"\r\n :class=\"[\r\n `c-split-pane--${direction}`,\r\n {\r\n 'c-split-pane--dragging': isDragging,\r\n 'c-split-pane--disabled': disabled,\r\n 'c-split-pane--collapsed-first': isFirstCollapsed,\r\n 'c-split-pane--collapsed-second': isSecondCollapsed,\r\n },\r\n ]\"\r\n >\r\n <!-- 首面板 -->\r\n <div class=\"split-panel split-panel--first\" :style=\"firstPanelStyle\">\r\n <div class=\"split-panel__content\">\r\n <slot name=\"first\" />\r\n </div>\r\n </div>\r\n\r\n <!-- 分割线手柄 -->\r\n <div\r\n class=\"split-gutter\"\r\n :style=\"gutterStyle\"\r\n role=\"separator\"\r\n :aria-orientation=\"direction === 'horizontal' ? 'vertical' : 'horizontal'\"\r\n :aria-valuenow=\"Math.round(panelSize)\"\r\n :aria-valuemin=\"0\"\r\n :aria-valuemax=\"100\"\r\n tabindex=\"0\"\r\n @mousedown=\"handleMouseDown\"\r\n @touchstart.prevent=\"handleMouseDown\"\r\n @dblclick=\"handleDoubleClick\"\r\n @keydown=\"handleKeyDown\"\r\n >\r\n <div class=\"split-gutter__visual\">\r\n <div class=\"split-gutter__dots\">\r\n <span v-for=\"i in 3\" :key=\"i\" class=\"split-gutter__dot\" />\r\n </div>\r\n </div>\r\n\r\n <!-- 折叠按钮 -->\r\n <template v-if=\"showCollapseButton && collapsible\">\r\n <button\r\n class=\"split-gutter__collapse-btn split-gutter__collapse-btn--first\"\r\n :title=\"isFirstCollapsed ? '展开首面板' : '折叠首面板'\"\r\n @click.stop=\"toggle('first')\"\r\n @mousedown.stop\r\n >\r\n <C_Icon :name=\"collapseFirstIcon\" :size=\"16\" color=\"currentColor\" />\r\n </button>\r\n <button\r\n class=\"split-gutter__collapse-btn split-gutter__collapse-btn--second\"\r\n :title=\"isSecondCollapsed ? '展开第二面板' : '折叠第二面板'\"\r\n @click.stop=\"toggle('second')\"\r\n @mousedown.stop\r\n >\r\n <C_Icon :name=\"collapseSecondIcon\" :size=\"16\" color=\"currentColor\" />\r\n </button>\r\n </template>\r\n </div>\r\n\r\n <!-- 第二面板 -->\r\n <div class=\"split-panel split-panel--second\" :style=\"secondPanelStyle\">\r\n <div class=\"split-panel__content\">\r\n <slot name=\"second\" />\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, toRef } from \"vue\";\r\nimport C_Icon from \"../C_Icon/index.vue\";\r\nimport { useSplitResize } from \"./composables/useSplitResize\";\r\nimport type { CollapseTarget, SplitDirection, SplitPaneExpose } from \"./types\";\r\n\r\ndefineOptions({ name: \"C_SplitPane\" });\r\n\r\ninterface Props {\r\n /** 分割方向 */\r\n direction?: SplitDirection;\r\n /** 首面板默认大小(百分比 0-100) */\r\n defaultSize?: number;\r\n /** 首面板最小大小(百分比 0-100) */\r\n minSize?: number;\r\n /** 首面板最大大小(百分比 0-100) */\r\n maxSize?: number;\r\n /** 是否禁用拖拽调整 */\r\n disabled?: boolean;\r\n /** 是否可折叠 */\r\n collapsible?: boolean;\r\n /** 是否显示折叠按钮 */\r\n showCollapseButton?: boolean;\r\n /** 分割线宽度(px) */\r\n gutterSize?: number;\r\n /** 键盘微调步长(百分比) */\r\n step?: number;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n direction: \"horizontal\",\r\n defaultSize: 50,\r\n minSize: 0,\r\n maxSize: 100,\r\n disabled: false,\r\n collapsible: true,\r\n showCollapseButton: true,\r\n gutterSize: 6,\r\n step: 2,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n resize: [firstSize: number, secondSize: number];\r\n collapse: [target: CollapseTarget];\r\n expand: [target: CollapseTarget];\r\n \"drag-start\": [size: number];\r\n \"drag-end\": [size: number];\r\n}>();\r\n\r\nconst containerRef = ref<HTMLElement | null>(null);\r\n\r\nconst {\r\n panelSize,\r\n isDragging,\r\n isFirstCollapsed,\r\n isSecondCollapsed,\r\n handleMouseDown,\r\n handleDoubleClick,\r\n handleKeyDown,\r\n collapse,\r\n expand,\r\n toggle,\r\n resetSize,\r\n setSize,\r\n getPanelInfo,\r\n} = useSplitResize({\r\n containerRef,\r\n direction: toRef(props, \"direction\"),\r\n defaultSize: props.defaultSize,\r\n minSize: props.minSize,\r\n maxSize: props.maxSize,\r\n disabled: toRef(props, \"disabled\"),\r\n collapsible: toRef(props, \"collapsible\"),\r\n step: props.step,\r\n onResize: (first, second) => emit(\"resize\", first, second),\r\n onCollapse: (target) => emit(\"collapse\", target),\r\n onExpand: (target) => emit(\"expand\", target),\r\n onDragStart: (size) => emit(\"drag-start\", size),\r\n onDragEnd: (size) => emit(\"drag-end\", size),\r\n});\r\n\r\n/* ─── 计算样式 ──────────────────────────────── */\r\nconst firstPanelStyle = computed(() => {\r\n const sizeValue = `calc(${panelSize.value}% - ${props.gutterSize / 2}px)`;\r\n return props.direction === \"horizontal\"\r\n ? { width: sizeValue }\r\n : { height: sizeValue };\r\n});\r\n\r\nconst secondPanelStyle = computed(() => {\r\n const sizeValue = `calc(${100 - panelSize.value}% - ${props.gutterSize / 2}px)`;\r\n return props.direction === \"horizontal\"\r\n ? { width: sizeValue }\r\n : { height: sizeValue };\r\n});\r\n\r\nconst gutterStyle = computed(() => {\r\n return props.direction === \"horizontal\"\r\n ? { width: `${props.gutterSize}px` }\r\n : { height: `${props.gutterSize}px` };\r\n});\r\n\r\n/* ─── 折叠按钮图标 ──────────────────────────── */\r\nconst collapseFirstIcon = computed(() => {\r\n if (props.direction === \"horizontal\") {\r\n return isFirstCollapsed.value ? \"mdi:chevron-right\" : \"mdi:chevron-left\";\r\n }\r\n return isFirstCollapsed.value ? \"mdi:chevron-down\" : \"mdi:chevron-up\";\r\n});\r\n\r\nconst collapseSecondIcon = computed(() => {\r\n if (props.direction === \"horizontal\") {\r\n return isSecondCollapsed.value ? \"mdi:chevron-left\" : \"mdi:chevron-right\";\r\n }\r\n return isSecondCollapsed.value ? \"mdi:chevron-up\" : \"mdi:chevron-down\";\r\n});\r\n\r\n/* ─── 暴露方法 ──────────────────────────────── */\r\ndefineExpose<SplitPaneExpose>({\r\n collapse,\r\n expand,\r\n toggle,\r\n resetSize,\r\n getPanelInfo,\r\n setSize,\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: 2025-06-16\r\n * @Description: 分割面板组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n ref=\"containerRef\"\r\n class=\"c-split-pane\"\r\n :class=\"[\r\n `c-split-pane--${direction}`,\r\n {\r\n 'c-split-pane--dragging': isDragging,\r\n 'c-split-pane--disabled': disabled,\r\n 'c-split-pane--collapsed-first': isFirstCollapsed,\r\n 'c-split-pane--collapsed-second': isSecondCollapsed,\r\n },\r\n ]\"\r\n >\r\n <!-- 首面板 -->\r\n <div class=\"split-panel split-panel--first\" :style=\"firstPanelStyle\">\r\n <div class=\"split-panel__content\">\r\n <slot name=\"first\" />\r\n </div>\r\n </div>\r\n\r\n <!-- 分割线手柄 -->\r\n <div\r\n class=\"split-gutter\"\r\n :style=\"gutterStyle\"\r\n role=\"separator\"\r\n :aria-orientation=\"direction === 'horizontal' ? 'vertical' : 'horizontal'\"\r\n :aria-valuenow=\"Math.round(panelSize)\"\r\n :aria-valuemin=\"0\"\r\n :aria-valuemax=\"100\"\r\n tabindex=\"0\"\r\n @mousedown=\"handleMouseDown\"\r\n @touchstart.prevent=\"handleMouseDown\"\r\n @dblclick=\"handleDoubleClick\"\r\n @keydown=\"handleKeyDown\"\r\n >\r\n <div class=\"split-gutter__visual\">\r\n <div class=\"split-gutter__dots\">\r\n <span v-for=\"i in 3\" :key=\"i\" class=\"split-gutter__dot\" />\r\n </div>\r\n </div>\r\n\r\n <!-- 折叠按钮 -->\r\n <template v-if=\"showCollapseButton && collapsible\">\r\n <button\r\n class=\"split-gutter__collapse-btn split-gutter__collapse-btn--first\"\r\n :title=\"isFirstCollapsed ? '展开首面板' : '折叠首面板'\"\r\n @click.stop=\"toggle('first')\"\r\n @mousedown.stop\r\n >\r\n <C_Icon :name=\"collapseFirstIcon\" :size=\"16\" color=\"currentColor\" />\r\n </button>\r\n <button\r\n class=\"split-gutter__collapse-btn split-gutter__collapse-btn--second\"\r\n :title=\"isSecondCollapsed ? '展开第二面板' : '折叠第二面板'\"\r\n @click.stop=\"toggle('second')\"\r\n @mousedown.stop\r\n >\r\n <C_Icon :name=\"collapseSecondIcon\" :size=\"16\" color=\"currentColor\" />\r\n </button>\r\n </template>\r\n </div>\r\n\r\n <!-- 第二面板 -->\r\n <div class=\"split-panel split-panel--second\" :style=\"secondPanelStyle\">\r\n <div class=\"split-panel__content\">\r\n <slot name=\"second\" />\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, computed, toRef } from \"vue\";\r\nimport C_Icon from \"../C_Icon/index.vue\";\r\nimport { useSplitResize } from \"./composables/useSplitResize\";\r\nimport type { CollapseTarget, SplitDirection, SplitPaneExpose } from \"./types\";\r\n\r\ndefineOptions({ name: \"C_SplitPane\" });\r\n\r\ninterface Props {\r\n /** 分割方向 */\r\n direction?: SplitDirection;\r\n /** 首面板默认大小(百分比 0-100) */\r\n defaultSize?: number;\r\n /** 首面板最小大小(百分比 0-100) */\r\n minSize?: number;\r\n /** 首面板最大大小(百分比 0-100) */\r\n maxSize?: number;\r\n /** 是否禁用拖拽调整 */\r\n disabled?: boolean;\r\n /** 是否可折叠 */\r\n collapsible?: boolean;\r\n /** 是否显示折叠按钮 */\r\n showCollapseButton?: boolean;\r\n /** 分割线宽度(px) */\r\n gutterSize?: number;\r\n /** 键盘微调步长(百分比) */\r\n step?: number;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n direction: \"horizontal\",\r\n defaultSize: 50,\r\n minSize: 0,\r\n maxSize: 100,\r\n disabled: false,\r\n collapsible: true,\r\n showCollapseButton: true,\r\n gutterSize: 6,\r\n step: 2,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n resize: [firstSize: number, secondSize: number];\r\n collapse: [target: CollapseTarget];\r\n expand: [target: CollapseTarget];\r\n \"drag-start\": [size: number];\r\n \"drag-end\": [size: number];\r\n}>();\r\n\r\nconst containerRef = ref<HTMLElement | null>(null);\r\n\r\nconst {\r\n panelSize,\r\n isDragging,\r\n isFirstCollapsed,\r\n isSecondCollapsed,\r\n handleMouseDown,\r\n handleDoubleClick,\r\n handleKeyDown,\r\n collapse,\r\n expand,\r\n toggle,\r\n resetSize,\r\n setSize,\r\n getPanelInfo,\r\n} = useSplitResize({\r\n containerRef,\r\n direction: toRef(props, \"direction\"),\r\n defaultSize: props.defaultSize,\r\n minSize: props.minSize,\r\n maxSize: props.maxSize,\r\n disabled: toRef(props, \"disabled\"),\r\n collapsible: toRef(props, \"collapsible\"),\r\n step: props.step,\r\n onResize: (first, second) => emit(\"resize\", first, second),\r\n onCollapse: (target) => emit(\"collapse\", target),\r\n onExpand: (target) => emit(\"expand\", target),\r\n onDragStart: (size) => emit(\"drag-start\", size),\r\n onDragEnd: (size) => emit(\"drag-end\", size),\r\n});\r\n\r\n/* ─── 计算样式 ──────────────────────────────── */\r\nconst firstPanelStyle = computed(() => {\r\n const sizeValue = `calc(${panelSize.value}% - ${props.gutterSize / 2}px)`;\r\n return props.direction === \"horizontal\"\r\n ? { width: sizeValue }\r\n : { height: sizeValue };\r\n});\r\n\r\nconst secondPanelStyle = computed(() => {\r\n const sizeValue = `calc(${100 - panelSize.value}% - ${props.gutterSize / 2}px)`;\r\n return props.direction === \"horizontal\"\r\n ? { width: sizeValue }\r\n : { height: sizeValue };\r\n});\r\n\r\nconst gutterStyle = computed(() => {\r\n return props.direction === \"horizontal\"\r\n ? { width: `${props.gutterSize}px` }\r\n : { height: `${props.gutterSize}px` };\r\n});\r\n\r\n/* ─── 折叠按钮图标 ──────────────────────────── */\r\nconst collapseFirstIcon = computed(() => {\r\n if (props.direction === \"horizontal\") {\r\n return isFirstCollapsed.value ? \"mdi:chevron-right\" : \"mdi:chevron-left\";\r\n }\r\n return isFirstCollapsed.value ? \"mdi:chevron-down\" : \"mdi:chevron-up\";\r\n});\r\n\r\nconst collapseSecondIcon = computed(() => {\r\n if (props.direction === \"horizontal\") {\r\n return isSecondCollapsed.value ? \"mdi:chevron-left\" : \"mdi:chevron-right\";\r\n }\r\n return isSecondCollapsed.value ? \"mdi:chevron-up\" : \"mdi:chevron-down\";\r\n});\r\n\r\n/* ─── 暴露方法 ──────────────────────────────── */\r\ndefineExpose<SplitPaneExpose>({\r\n collapse,\r\n expand,\r\n toggle,\r\n resetSize,\r\n getPanelInfo,\r\n setSize,\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_Steps.cjs CHANGED
@@ -1,4 +1 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_C_Steps = require('./C_Steps.js');
3
-
4
- exports.C_Steps = require_C_Steps.C_Steps_default;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./C_Steps.js`);exports.C_Steps=e.t;
package/dist/C_Steps.js CHANGED
@@ -1,3 +1 @@
1
- import { t as C_Steps_default } from "./C_Steps2.js";
2
-
3
- export { C_Steps_default as C_Steps };
1
+ import{t as e}from"./C_Steps2.js";export{e as C_Steps};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"C_Steps.js","names":["direction","steps","clickable"],"sources":["../src/components/C_Steps/index.vue","../src/components/C_Steps/index.vue","../src/components/C_Steps/index.vue"],"sourcesContent":["/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-01\r\n * @Description: 步骤条组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-steps\" :class=\"[`steps-${direction}`]\">\r\n <div\r\n v-for=\"(step, index) in steps\"\r\n :key=\"index\"\r\n class=\"step-item\"\r\n :class=\"[\r\n `step-${getStatus(index)}`,\r\n { 'step-clickable': clickable && !step.disabled },\r\n ]\"\r\n @click=\"handleClick(index)\"\r\n >\r\n <div class=\"step-indicator\">\r\n <div class=\"step-icon\">\r\n <i v-if=\"step.icon\" :class=\"step.icon\"></i>\r\n <i v-else-if=\"getStatus(index) === 'finish'\" class=\"i-mdi:check\"></i>\r\n <span v-else class=\"step-index\">{{ index + 1 }}</span>\r\n </div>\r\n <div v-if=\"index < steps.length - 1\" class=\"step-line\" />\r\n </div>\r\n <div class=\"step-content\">\r\n <div class=\"step-title\">{{ step.title }}</div>\r\n <div v-if=\"step.time\" class=\"step-time\">{{ step.time }}</div>\r\n <div v-if=\"step.description\" class=\"step-description\">\r\n {{ step.description }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\ndefineOptions({ name: \"C_Steps\" });\r\n\r\nexport interface StepItem {\r\n title: string;\r\n description?: string;\r\n time?: string;\r\n icon?: string;\r\n status?: \"wait\" | \"process\" | \"finish\" | \"error\";\r\n disabled?: boolean;\r\n detail?: string;\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n steps: StepItem[];\r\n current?: number;\r\n direction?: \"horizontal\" | \"vertical\";\r\n clickable?: boolean;\r\n }>(),\r\n {\r\n current: 0,\r\n direction: \"horizontal\",\r\n clickable: false,\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n \"update:current\": [number];\r\n change: [number];\r\n}>();\r\n\r\nconst getStatus = (index: number) => {\r\n if (props.steps[index].status) {\r\n return props.steps[index].status;\r\n }\r\n if (index < props.current) return \"finish\";\r\n if (index === props.current) return \"process\";\r\n return \"wait\";\r\n};\r\n\r\nconst handleClick = (index: number) => {\r\n if (!props.clickable || props.steps[index].disabled) return;\r\n emit(\"update:current\", index);\r\n emit(\"change\", index);\r\n};\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n@use \"./index.scss\";\r\n</style>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-01\r\n * @Description: 步骤条组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-steps\" :class=\"[`steps-${direction}`]\">\r\n <div\r\n v-for=\"(step, index) in steps\"\r\n :key=\"index\"\r\n class=\"step-item\"\r\n :class=\"[\r\n `step-${getStatus(index)}`,\r\n { 'step-clickable': clickable && !step.disabled },\r\n ]\"\r\n @click=\"handleClick(index)\"\r\n >\r\n <div class=\"step-indicator\">\r\n <div class=\"step-icon\">\r\n <i v-if=\"step.icon\" :class=\"step.icon\"></i>\r\n <i v-else-if=\"getStatus(index) === 'finish'\" class=\"i-mdi:check\"></i>\r\n <span v-else class=\"step-index\">{{ index + 1 }}</span>\r\n </div>\r\n <div v-if=\"index < steps.length - 1\" class=\"step-line\" />\r\n </div>\r\n <div class=\"step-content\">\r\n <div class=\"step-title\">{{ step.title }}</div>\r\n <div v-if=\"step.time\" class=\"step-time\">{{ step.time }}</div>\r\n <div v-if=\"step.description\" class=\"step-description\">\r\n {{ step.description }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\ndefineOptions({ name: \"C_Steps\" });\r\n\r\nexport interface StepItem {\r\n title: string;\r\n description?: string;\r\n time?: string;\r\n icon?: string;\r\n status?: \"wait\" | \"process\" | \"finish\" | \"error\";\r\n disabled?: boolean;\r\n detail?: string;\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n steps: StepItem[];\r\n current?: number;\r\n direction?: \"horizontal\" | \"vertical\";\r\n clickable?: boolean;\r\n }>(),\r\n {\r\n current: 0,\r\n direction: \"horizontal\",\r\n clickable: false,\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n \"update:current\": [number];\r\n change: [number];\r\n}>();\r\n\r\nconst getStatus = (index: number) => {\r\n if (props.steps[index].status) {\r\n return props.steps[index].status;\r\n }\r\n if (index < props.current) return \"finish\";\r\n if (index === props.current) return \"process\";\r\n return \"wait\";\r\n};\r\n\r\nconst handleClick = (index: number) => {\r\n if (!props.clickable || props.steps[index].disabled) return;\r\n emit(\"update:current\", index);\r\n emit(\"change\", index);\r\n};\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n@use \"./index.scss\";\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-01\r\n * @Description: 步骤条组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-steps\" :class=\"[`steps-${direction}`]\">\r\n <div\r\n v-for=\"(step, index) in steps\"\r\n :key=\"index\"\r\n class=\"step-item\"\r\n :class=\"[\r\n `step-${getStatus(index)}`,\r\n { 'step-clickable': clickable && !step.disabled },\r\n ]\"\r\n @click=\"handleClick(index)\"\r\n >\r\n <div class=\"step-indicator\">\r\n <div class=\"step-icon\">\r\n <i v-if=\"step.icon\" :class=\"step.icon\"></i>\r\n <i v-else-if=\"getStatus(index) === 'finish'\" class=\"i-mdi:check\"></i>\r\n <span v-else class=\"step-index\">{{ index + 1 }}</span>\r\n </div>\r\n <div v-if=\"index < steps.length - 1\" class=\"step-line\" />\r\n </div>\r\n <div class=\"step-content\">\r\n <div class=\"step-title\">{{ step.title }}</div>\r\n <div v-if=\"step.time\" class=\"step-time\">{{ step.time }}</div>\r\n <div v-if=\"step.description\" class=\"step-description\">\r\n {{ step.description }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\ndefineOptions({ name: \"C_Steps\" });\r\n\r\nexport interface StepItem {\r\n title: string;\r\n description?: string;\r\n time?: string;\r\n icon?: string;\r\n status?: \"wait\" | \"process\" | \"finish\" | \"error\";\r\n disabled?: boolean;\r\n detail?: string;\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n steps: StepItem[];\r\n current?: number;\r\n direction?: \"horizontal\" | \"vertical\";\r\n clickable?: boolean;\r\n }>(),\r\n {\r\n current: 0,\r\n direction: \"horizontal\",\r\n clickable: false,\r\n },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n \"update:current\": [number];\r\n change: [number];\r\n}>();\r\n\r\nconst getStatus = (index: number) => {\r\n if (props.steps[index].status) {\r\n return props.steps[index].status;\r\n }\r\n if (index < props.current) return \"finish\";\r\n if (index === props.current) return \"process\";\r\n return \"wait\";\r\n};\r\n\r\nconst handleClick = (index: number) => {\r\n if (!props.clickable || props.steps[index].disabled) return;\r\n emit(\"update:current\", index);\r\n emit(\"change\", index);\r\n};\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n@use \"./index.scss\";\r\n</style>\r\n"],"mappings":"qjBEmDA,IAAM,EAAQ,EAcR,EAAO,EAKP,EAAa,GACb,EAAM,MAAM,GAAO,OACd,EAAM,MAAM,GAAO,OAExB,EAAQ,EAAM,QAAgB,SAC9B,IAAU,EAAM,QAAgB,UAC7B,OAGH,EAAe,GAAkB,CACjC,CAAC,EAAM,WAAa,EAAM,MAAM,GAAO,WAC3C,EAAK,iBAAkB,EAAM,CAC7B,EAAK,SAAU,EAAM,4DA/Cf,MAAA,CA3BD,OAAA,EAAA,EAAA,gBAAK,CAAC,UAAS,CAAA,SAAmBA,EAAAA,YAAS,CAAA,CAAA,CAAA,CAAA,GAAA,EAAA,EAAA,WAAA,GAAA,EAAA,EAAA,EAAA,oBA0BxC,EAAA,SAAA,MAAA,EAAA,EAAA,YAxBoBC,EAAAA,OAAhB,EAAM,gDAwBV,MAAA,CAvBH,IAAK,EACN,OAAA,EAAA,EAAA,gBAAK,CAAC,YAAW,CAAA,QACU,EAAU,EAAK,GAAA,CAAA,iBAAkCC,EAAAA,WAAS,CAAK,EAAK,SAAQ,CAAA,CAAA,CAAA,CAItG,QAAK,GAAE,EAAY,EAAK,4BASnB,MAPN,EAOM,EAAA,EAAA,EAAA,oBAFE,MAJN,EAIM,CAHK,EAAK,OAAA,EAAA,EAAA,YAAA,EAAA,EAAA,EAAA,oBAA6B,IAAA,OAAtB,OAAA,EAAA,EAAA,gBAAO,EAAK,KAAI,WACvB,EAAU,EAAK,GAAA,WAAA,EAAA,EAAA,YAAA,EAAA,EAAA,EAAA,oBAAwC,IAArE,EAAqE,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,EAAA,oBACf,OAAtD,GAAA,EAAA,EAAA,iBAAmC,EAAK,EAAA,CAAA,EAAA,EAAA,CAAA,CAE/B,EAAQD,EAAAA,MAAM,OAAM,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,EAAA,oBAA0B,MAAzD,EAAyD,GAAA,EAAA,EAAA,oBAAA,OAAA,GAAA,CAAA,CAAA,EAAA,EAAA,EAAA,oBAQrD,MANN,EAMM,0BAL0C,MAA9C,GAAA,EAAA,EAAA,iBAA2B,EAAK,MAAK,CAAA,EAAA,CAC1B,EAAK,OAAA,EAAA,EAAA,YAAA,EAAA,EAAA,EAAA,oBAA6C,MAA7D,GAAA,EAAA,EAAA,iBAA2C,EAAK,KAAI,CAAA,EAAA,GAAA,EAAA,EAAA,oBAAA,OAAA,GAAA,CACzC,EAAK,cAAA,EAAA,EAAA,YAAA,EAAA,EAAA,EAAA,oBAEV,MAFN,GAAA,EAAA,EAAA,iBACK,EAAK,YAAW,CAAA,EAAA,GAAA,EAAA,EAAA,oBAAA,OAAA,GAAA"}