@robot-admin/naive-ui-components 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/dist/C_ActionBar-nnfbZCea.css.map +1 -0
  2. package/dist/C_ActionBar2.js +2 -2
  3. package/dist/C_ActionBar2.js.map +1 -1
  4. package/dist/C_AntV-DGjscTWa.css.map +1 -0
  5. package/dist/C_AntV2.js +6 -6
  6. package/dist/C_AntV2.js.map +1 -1
  7. package/dist/C_Barcode-DjTmDkbQ.css.map +1 -0
  8. package/dist/C_Barcode2.js +1 -1
  9. package/dist/C_Barcode2.js.map +1 -1
  10. package/dist/C_Captcha-Ccq3DMrR.css.map +1 -0
  11. package/dist/C_Captcha2.js +1 -1
  12. package/dist/C_Captcha2.js.map +1 -1
  13. package/dist/C_Cascade-IUUHIh7r.css.map +1 -0
  14. package/dist/C_Cascade2.js +2 -2
  15. package/dist/C_Cascade2.js.map +1 -1
  16. package/dist/C_City-Cv5BESaN.css.map +1 -0
  17. package/dist/C_City2.js +2 -2
  18. package/dist/C_City2.js.map +1 -1
  19. package/dist/C_Code-DPZlNSxL.css.map +1 -0
  20. package/dist/C_Code2.js +8 -7
  21. package/dist/C_Code2.js.map +1 -1
  22. package/dist/C_CollapsePanel-Fap-lv_5.css.map +1 -0
  23. package/dist/C_CollapsePanel2.js +1 -1
  24. package/dist/C_CollapsePanel2.js.map +1 -1
  25. package/dist/C_Cron-C0-8b5af.css.map +1 -0
  26. package/dist/C_Cron2.js +15 -14
  27. package/dist/C_Cron2.js.map +1 -1
  28. package/dist/C_Date2.js +1 -1
  29. package/dist/C_Date2.js.map +1 -1
  30. package/dist/C_Draggable-Bq6o0qXn.css.map +1 -0
  31. package/dist/C_Draggable2.js +1 -1
  32. package/dist/C_Draggable2.js.map +1 -1
  33. package/dist/C_Editor-OlxIF9-5.css.map +1 -0
  34. package/dist/C_Editor2.js +1 -1
  35. package/dist/C_Editor2.js.map +1 -1
  36. package/dist/C_FilePreview-B4XgTv-h.css.map +1 -0
  37. package/dist/C_FilePreview.cjs +1 -0
  38. package/dist/C_FilePreview.js +1 -0
  39. package/dist/C_FilePreview2.js +10 -9
  40. package/dist/C_FilePreview2.js.map +1 -1
  41. package/dist/C_Form-Cr9oX037.css.map +1 -0
  42. package/dist/C_Form.cjs +1 -0
  43. package/dist/C_Form.js +1 -0
  44. package/dist/C_Form2.js +69 -72
  45. package/dist/C_Form2.js.map +1 -1
  46. package/dist/C_FormSearch-DlIEoh7X.css.map +1 -0
  47. package/dist/C_FormSearch2.js +2 -2
  48. package/dist/C_FormSearch2.js.map +1 -1
  49. package/dist/C_FormulaEditor-Cm0CokN5.css.map +1 -0
  50. package/dist/C_FormulaEditor2.js +6 -6
  51. package/dist/C_FormulaEditor2.js.map +1 -1
  52. package/dist/C_FullCalendar-BULCIlVK.css.map +1 -0
  53. package/dist/C_FullCalendar2.js +2 -2
  54. package/dist/C_FullCalendar2.js.map +1 -1
  55. package/dist/C_Guide2.js +1 -1
  56. package/dist/C_Guide2.js.map +1 -1
  57. package/dist/C_Icon2.js.map +1 -1
  58. package/dist/C_ImageCropper-DrmUlaLi.css.map +1 -0
  59. package/dist/C_ImageCropper2.js +4 -4
  60. package/dist/C_ImageCropper2.js.map +1 -1
  61. package/dist/C_Language2.js +1 -1
  62. package/dist/C_Language2.js.map +1 -1
  63. package/dist/C_Map-WUMXSAfy.css.map +1 -0
  64. package/dist/C_Map2.js +2 -2
  65. package/dist/C_Map2.js.map +1 -1
  66. package/dist/C_Markdown-Dmv8yaM4.css.map +1 -0
  67. package/dist/C_Markdown2.js +4 -4
  68. package/dist/C_Markdown2.js.map +1 -1
  69. package/dist/C_NotificationCenter-DbgBiyqB.css.map +1 -0
  70. package/dist/C_NotificationCenter2.js +21 -20
  71. package/dist/C_NotificationCenter2.js.map +1 -1
  72. package/dist/C_Progress2.js +1 -1
  73. package/dist/C_Progress2.js.map +1 -1
  74. package/dist/C_QRCode-G7fiAkm4.css.map +1 -0
  75. package/dist/C_QRCode2.js +1 -1
  76. package/dist/C_QRCode2.js.map +1 -1
  77. package/dist/C_Signature-es-ZNPzr.css.map +1 -0
  78. package/dist/C_Signature2.js +2 -2
  79. package/dist/C_Signature2.js.map +1 -1
  80. package/dist/C_SplitPane-Br2eK8IG.css.map +1 -0
  81. package/dist/C_SplitPane2.js +1 -1
  82. package/dist/C_SplitPane2.js.map +1 -1
  83. package/dist/C_Steps-P9Qj9iDd.css.map +1 -0
  84. package/dist/C_Steps2.js +1 -1
  85. package/dist/C_Steps2.js.map +1 -1
  86. package/dist/C_Table-DAwAxr72.css.map +1 -0
  87. package/dist/C_Table.cjs +1 -0
  88. package/dist/C_Table.js +1 -0
  89. package/dist/C_Table2.js +3 -3
  90. package/dist/C_Table2.js.map +1 -1
  91. package/dist/C_Theme2.js +1 -1
  92. package/dist/C_Theme2.js.map +1 -1
  93. package/dist/C_Time-Bd_e1YDN.css.map +1 -0
  94. package/dist/C_Time2.js +2 -2
  95. package/dist/C_Time2.js.map +1 -1
  96. package/dist/C_Tree-DnGc_MPb.css.map +1 -0
  97. package/dist/C_Tree2.js +2 -2
  98. package/dist/C_Tree2.js.map +1 -1
  99. package/dist/C_Upload-i8LB_29U.css.map +1 -0
  100. package/dist/C_Upload2.js +5 -5
  101. package/dist/C_Upload2.js.map +1 -1
  102. package/dist/C_VideoPlayer-rm0MODUv.css.map +1 -0
  103. package/dist/C_VideoPlayer2.js +21 -20
  104. package/dist/C_VideoPlayer2.js.map +1 -1
  105. package/dist/C_VtableGantt-BpY-Rng3.css.map +1 -0
  106. package/dist/C_VtableGantt2.js +2 -2
  107. package/dist/C_VtableGantt2.js.map +1 -1
  108. package/dist/C_WaterFall-HWB-gPON.css.map +1 -0
  109. package/dist/C_WaterFall2.js +2 -2
  110. package/dist/C_WaterFall2.js.map +1 -1
  111. package/dist/C_WorkFlow-CSO86Cuc.css.map +1 -0
  112. package/dist/C_WorkFlow2.js +6 -6
  113. package/dist/C_WorkFlow2.js.map +1 -1
  114. package/dist/constants.d.ts +4 -4
  115. package/dist/constants2.d.ts +4 -4
  116. package/dist/constants3.d.ts +4 -4
  117. package/dist/constants4.d.ts +5 -5
  118. package/dist/constants5.d.ts +2 -2
  119. package/dist/data.d.ts +1 -1
  120. package/dist/index.js.map +1 -1
  121. package/dist/index.vue.d.ts +1 -1
  122. package/dist/index10.vue.d.ts +7 -7
  123. package/dist/index11.vue.d.ts +2 -2
  124. package/dist/index12.vue.d.ts +5 -5
  125. package/dist/index12.vue.d.ts.map +1 -1
  126. package/dist/index13.vue.d.ts +1 -1
  127. package/dist/index14.vue.d.ts +1 -1
  128. package/dist/index16.vue.d.ts +1 -1
  129. package/dist/index2.vue.d.ts +6 -6
  130. package/dist/index3.vue.d.ts +2 -2
  131. package/dist/index4.vue.d.ts +2 -2
  132. package/dist/index5.vue.d.ts +2 -2
  133. package/dist/index6.vue.d.ts +1 -1
  134. package/dist/index8.vue.d.ts +3 -3
  135. package/dist/resolver.js.map +1 -1
  136. package/dist/style.css +1555 -1555
  137. package/dist/useCalendarEvents.d.ts +2 -2
  138. package/dist/useCollapsePanel.d.ts +2 -2
  139. package/dist/useCropperCore.d.ts +3 -3
  140. package/dist/useDraggableLayout.d.ts +8 -8
  141. package/dist/useDynamicFormState.d.ts +111 -111
  142. package/dist/useDynamicFormState.d.ts.map +1 -1
  143. package/dist/useEdgeInteraction.d.ts +2 -2
  144. package/dist/useInfiniteScroll.d.ts +1 -1
  145. package/dist/useModalEdit.d.ts +4 -4
  146. package/dist/useModalEdit.d.ts.map +1 -1
  147. package/dist/useQRCode.d.ts +4 -4
  148. package/dist/useQRCode.d.ts.map +1 -1
  149. package/dist/useSearchState.d.ts +2 -2
  150. package/dist/useSignatureHistory.d.ts +4 -4
  151. package/dist/useSplitResize.d.ts +6 -6
  152. package/dist/useSplitResize.d.ts.map +1 -1
  153. package/dist/useTimeSelection.d.ts +2 -2
  154. package/dist/useTreeOperations.d.ts +6 -6
  155. package/dist/useWorkflowValidation.d.ts +5 -5
  156. package/package.json +2 -1
  157. package/dist/C_ActionBar-DWN-woTc.css.map +0 -1
  158. package/dist/C_AntV-AFKyK6hH.css.map +0 -1
  159. package/dist/C_Barcode-P_EFj8dC.css.map +0 -1
  160. package/dist/C_Captcha-C-ef41xw.css.map +0 -1
  161. package/dist/C_Cascade-D9kNsjsV.css.map +0 -1
  162. package/dist/C_City-BCQ4ipiK.css.map +0 -1
  163. package/dist/C_Code-C9kvvEmO.css.map +0 -1
  164. package/dist/C_CollapsePanel-BUJHuYcU.css.map +0 -1
  165. package/dist/C_Cron-yx2Ob4Jl.css.map +0 -1
  166. package/dist/C_Draggable-C483syRC.css.map +0 -1
  167. package/dist/C_Editor-Bp0SyIEw.css.map +0 -1
  168. package/dist/C_FilePreview-CPqvhoCy.css.map +0 -1
  169. package/dist/C_Form-Jx7PY3sT.css.map +0 -1
  170. package/dist/C_FormSearch-DvRgxlRn.css.map +0 -1
  171. package/dist/C_FormulaEditor-DtGkt4T_.css.map +0 -1
  172. package/dist/C_FullCalendar-BF7H0YIx.css.map +0 -1
  173. package/dist/C_ImageCropper-BVJfUufl.css.map +0 -1
  174. package/dist/C_Map-DpzeuWdX.css.map +0 -1
  175. package/dist/C_Markdown-BEjxknqd.css.map +0 -1
  176. package/dist/C_NotificationCenter-0l3TY2Gn.css.map +0 -1
  177. package/dist/C_QRCode-DbdiAIPg.css.map +0 -1
  178. package/dist/C_Signature-zhHCbra9.css.map +0 -1
  179. package/dist/C_SplitPane-C6sBsfKY.css.map +0 -1
  180. package/dist/C_Steps-CODHN5Hs.css.map +0 -1
  181. package/dist/C_Table-DSNsntmT.css.map +0 -1
  182. package/dist/C_Time-BvZLYraL.css.map +0 -1
  183. package/dist/C_Tree-0GDv--jX.css.map +0 -1
  184. package/dist/C_Upload-BXd3YYLx.css.map +0 -1
  185. package/dist/C_VideoPlayer-DYG3RL0Q.css.map +0 -1
  186. package/dist/C_VtableGantt-fhItIiHE.css.map +0 -1
  187. package/dist/C_WaterFall-8sQDFXKg.css.map +0 -1
  188. package/dist/C_WorkFlow-J-dyIuh9.css.map +0 -1
@@ -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","<!--\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","<!--\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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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"C_Steps-P9Qj9iDd.css","names":[],"sources":["../src/components/C_Steps/index.vue?vue&type=style&index=0&scoped=ecd7bf0c&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled */.c-steps[data-v-ecd7bf0c] {\n --step-gap: 24px;\n --icon-size: 32px;\n --line-width: 2px;\n --primary: var(--c-primary, #18a058);\n --success: var(--c-success, #18a058);\n --warning: var(--c-warning, #f0a020);\n --error: var(--c-error, #d03050);\n --border: var(--c-border, rgba(0, 0, 0, 0.09));\n --bg-hover: rgba(0, 0, 0, 0.04);\n display: flex;\n}\n.steps-horizontal[data-v-ecd7bf0c] {\n flex-direction: row;\n align-items: flex-start;\n}\n.steps-vertical[data-v-ecd7bf0c] {\n flex-direction: column;\n}\n.step-item[data-v-ecd7bf0c] {\n display: flex;\n position: relative;\n flex: 1;\n gap: 12px;\n}\n.steps-horizontal .step-item[data-v-ecd7bf0c] {\n flex-direction: column;\n align-items: center;\n text-align: center;\n min-width: 0;\n}\n.steps-vertical .step-item[data-v-ecd7bf0c] {\n flex-direction: row;\n min-height: 72px;\n flex: none;\n width: 100%;\n}\n.step-indicator[data-v-ecd7bf0c] {\n position: relative;\n display: flex;\n align-items: center;\n flex-shrink: 0;\n}\n.steps-horizontal .step-indicator[data-v-ecd7bf0c] {\n width: 100%;\n justify-content: center;\n}\n.steps-vertical .step-indicator[data-v-ecd7bf0c] {\n flex-direction: column;\n}\n.step-icon[data-v-ecd7bf0c] {\n width: var(--icon-size);\n height: var(--icon-size);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n border: var(--line-width) solid var(--border);\n background: var(--c-bg-card, #fff);\n position: relative;\n z-index: 1;\n transition: all 0.2s ease;\n font-size: 16px;\n}\n.step-finish .step-icon[data-v-ecd7bf0c] {\n border-color: var(--success);\n color: var(--success);\n}\n.step-process .step-icon[data-v-ecd7bf0c] {\n border-color: var(--primary);\n background: var(--primary);\n color: white;\n}\n.step-error .step-icon[data-v-ecd7bf0c] {\n border-color: var(--error);\n color: var(--error);\n}\n.step-index[data-v-ecd7bf0c] {\n font-size: 14px;\n font-weight: 500;\n}\n.step-line[data-v-ecd7bf0c] {\n background: var(--border);\n position: absolute;\n transition: background 0.2s ease;\n}\n.steps-horizontal .step-line[data-v-ecd7bf0c] {\n height: var(--line-width);\n left: calc(50% + var(--icon-size) / 2);\n right: calc(-50% + var(--icon-size) / 2 + var(--step-gap));\n top: calc(var(--icon-size) / 2);\n}\n.steps-vertical .step-line[data-v-ecd7bf0c] {\n width: var(--line-width);\n top: calc(var(--icon-size) + 4px);\n bottom: calc(-72px + var(--icon-size) + 4px);\n left: calc(var(--icon-size) / 2 - 1px);\n}\n.step-finish .step-line[data-v-ecd7bf0c] {\n background: var(--success);\n}\n.step-content[data-v-ecd7bf0c] {\n flex: 1;\n min-width: 0;\n}\n.steps-vertical .step-content[data-v-ecd7bf0c] {\n padding-top: 4px;\n}\n.step-title[data-v-ecd7bf0c] {\n font-size: 14px;\n font-weight: 500;\n line-height: 22px;\n margin-bottom: 2px;\n word-break: break-word;\n}\n.step-time[data-v-ecd7bf0c] {\n font-size: 12px;\n line-height: 20px;\n margin-bottom: 2px;\n opacity: 0.65;\n}\n.step-finish .step-time[data-v-ecd7bf0c] {\n color: var(--success);\n}\n.step-description[data-v-ecd7bf0c] {\n font-size: 12px;\n line-height: 20px;\n opacity: 0.65;\n}\n.step-wait .step-title[data-v-ecd7bf0c] {\n opacity: 0.65;\n}\n.step-process .step-title[data-v-ecd7bf0c] {\n color: var(--primary);\n font-weight: 600;\n}\n.step-error .step-title[data-v-ecd7bf0c] {\n color: var(--error);\n}\n.step-clickable[data-v-ecd7bf0c] {\n cursor: pointer;\n}\n.step-clickable:hover .step-icon[data-v-ecd7bf0c] {\n transform: scale(1.05);\n}\n.step-clickable:not(.step-process):hover .step-icon[data-v-ecd7bf0c] {\n background: var(--bg-hover);\n}\n.step-clickable:hover .step-title[data-v-ecd7bf0c] {\n color: var(--primary);\n}\n@media (max-width: 768px) {\n.steps-horizontal[data-v-ecd7bf0c] {\n flex-wrap: wrap;\n}\n.steps-horizontal .step-item[data-v-ecd7bf0c] {\n flex: 0 0 50%;\n margin-bottom: 24px;\n}\n.steps-horizontal .step-line[data-v-ecd7bf0c] {\n display: none;\n}\n}\n@media (prefers-reduced-motion: reduce) {\n.step-icon[data-v-ecd7bf0c],\n .step-line[data-v-ecd7bf0c] {\n transition: none;\n}\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
package/dist/C_Steps2.js CHANGED
@@ -75,7 +75,7 @@ var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCo
75
75
 
76
76
  //#endregion
77
77
  //#region src/components/C_Steps/index.vue
78
- var C_Steps_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-0ccfa846"]]);
78
+ var C_Steps_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-ecd7bf0c"]]);
79
79
 
80
80
  //#endregion
81
81
  export { C_Steps_default as t };
@@ -1 +1 @@
1
- {"version":3,"file":"C_Steps2.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":["<!--\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","<!--\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECmDA,MAAM,QAAQ;EAcd,MAAM,OAAO;EAKb,MAAM,aAAa,UAAkB;AACnC,OAAI,MAAM,MAAM,OAAO,OACrB,QAAO,MAAM,MAAM,OAAO;AAE5B,OAAI,QAAQ,MAAM,QAAS,QAAO;AAClC,OAAI,UAAU,MAAM,QAAS,QAAO;AACpC,UAAO;;EAGT,MAAM,eAAe,UAAkB;AACrC,OAAI,CAAC,MAAM,aAAa,MAAM,MAAM,OAAO,SAAU;AACrD,QAAK,kBAAkB,MAAM;AAC7B,QAAK,UAAU,MAAM;;;uBA1ErB,mBA2BM,OAAA,EA3BD,OAAK,eAAA,CAAC,WAAS,CAAA,SAAmBA,KAAAA,YAAS,CAAA,CAAA,uBAC9C,mBAyBM,UAAA,MAAA,WAxBoBC,KAAAA,QAAhB,MAAM,UAAK;wBADrB,mBAyBM,OAAA;KAvBH,KAAK;KACN,OAAK,eAAA,CAAC,aAAW,SACU,UAAU,MAAK,wBAAkCC,KAAAA,aAAS,CAAK,KAAK,UAAQ;KAItG,UAAK,WAAE,YAAY,MAAK;QAEzB,mBAOM,OAPN,YAOM,CANJ,mBAIM,OAJN,YAIM,CAHK,KAAK,qBAAd,mBAA2C,KAAA;;KAAtB,OAAK,eAAE,KAAK,KAAI;mBACvB,UAAU,MAAK,KAAA,yBAA7B,mBAAqE,KAArE,WAAqE,kBACrE,mBAAsD,QAAtD,YAAsD,gBAAnB,QAAK,EAAA,EAAA,EAAA,KAE/B,QAAQD,KAAAA,MAAM,SAAM,kBAA/B,mBAAyD,OAAzD,WAAyD,wCAE3D,mBAMM,OANN,YAMM;KALJ,mBAA8C,OAA9C,YAA8C,gBAAnB,KAAK,MAAK,EAAA,EAAA;KAC1B,KAAK,qBAAhB,mBAA6D,OAA7D,YAA6D,gBAAlB,KAAK,KAAI,EAAA,EAAA;KACzC,KAAK,4BAAhB,mBAEM,OAFN,aAEM,gBADD,KAAK,YAAW,EAAA,EAAA"}
1
+ {"version":3,"file":"C_Steps2.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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECmDA,MAAM,QAAQ;EAcd,MAAM,OAAO;EAKb,MAAM,aAAa,UAAkB;AACnC,OAAI,MAAM,MAAM,OAAO,OACrB,QAAO,MAAM,MAAM,OAAO;AAE5B,OAAI,QAAQ,MAAM,QAAS,QAAO;AAClC,OAAI,UAAU,MAAM,QAAS,QAAO;AACpC,UAAO;;EAGT,MAAM,eAAe,UAAkB;AACrC,OAAI,CAAC,MAAM,aAAa,MAAM,MAAM,OAAO,SAAU;AACrD,QAAK,kBAAkB,MAAM;AAC7B,QAAK,UAAU,MAAM;;;uBA1ErB,mBA2BM,OAAA,EA3BD,OAAK,eAAA,CAAC,WAAS,CAAA,SAAmBA,KAAAA,YAAS,CAAA,CAAA,uBAC9C,mBAyBM,UAAA,MAAA,WAxBoBC,KAAAA,QAAhB,MAAM,UAAK;wBADrB,mBAyBM,OAAA;KAvBH,KAAK;KACN,OAAK,eAAA,CAAC,aAAW,SACU,UAAU,MAAK,wBAAkCC,KAAAA,aAAS,CAAK,KAAK,UAAQ;KAItG,UAAK,WAAE,YAAY,MAAK;QAEzB,mBAOM,OAPN,YAOM,CANJ,mBAIM,OAJN,YAIM,CAHK,KAAK,qBAAd,mBAA2C,KAAA;;KAAtB,OAAK,eAAE,KAAK,KAAI;mBACvB,UAAU,MAAK,KAAA,yBAA7B,mBAAqE,KAArE,WAAqE,kBACrE,mBAAsD,QAAtD,YAAsD,gBAAnB,QAAK,EAAA,EAAA,EAAA,KAE/B,QAAQD,KAAAA,MAAM,SAAM,kBAA/B,mBAAyD,OAAzD,WAAyD,wCAE3D,mBAMM,OANN,YAMM;KALJ,mBAA8C,OAA9C,YAA8C,gBAAnB,KAAK,MAAK,EAAA,EAAA;KAC1B,KAAK,qBAAhB,mBAA6D,OAA7D,YAA6D,gBAAlB,KAAK,KAAI,EAAA,EAAA;KACzC,KAAK,4BAAhB,mBAEM,OAFN,aAEM,gBADD,KAAK,YAAW,EAAA,EAAA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"C_Table-DAwAxr72.css","names":[],"sources":["../src/components/C_Table/components/ColumnSettings/index.vue?vue&type=style&index=0&scoped=a4d013ea&lang.scss","../src/components/C_Table/index.vue?vue&type=style&index=0&scoped=99d893d9&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled */.column-management-tab .search-row[data-v-a4d013ea] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 12px;\n}\n.column-management-tab .search-row .search-input[data-v-a4d013ea] {\n flex: 1;\n min-width: 0;\n}\n.column-management-tab .search-row .resizable-control[data-v-a4d013ea] {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n padding: 0 10px;\n height: 34px;\n background: var(--n-color-target);\n border-radius: 6px;\n white-space: nowrap;\n}\n.column-management-tab .top-actions-bar[data-v-a4d013ea] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n padding: 10px 12px;\n background: var(--n-color-target);\n border-radius: 6px;\n}\n.column-management-tab .top-actions-bar .stats-info[data-v-a4d013ea] {\n flex: 1;\n}\n.column-management-tab .top-actions-bar .quick-actions[data-v-a4d013ea] {\n flex-shrink: 0;\n}\n.column-management-tab .column-list .column-item[data-v-a4d013ea] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 6px 4px;\n margin-bottom: 4px;\n border-radius: 4px;\n background: transparent;\n cursor: move;\n transition: all 0.2s ease;\n}\n.column-management-tab .column-list .column-item[data-v-a4d013ea]:hover {\n background: var(--n-color-target);\n}\n.column-management-tab .column-list .column-item.disabled[data-v-a4d013ea] {\n opacity: 0.6;\n cursor: not-allowed;\n}\n.column-management-tab .column-list .column-item.fixed-left[data-v-a4d013ea] {\n background: rgba(24, 160, 88, 0.08);\n}\n.column-management-tab .column-list .column-item.fixed-right[data-v-a4d013ea] {\n background: rgba(240, 138, 0, 0.08);\n}\n.column-management-tab .column-list .column-item .column-info[data-v-a4d013ea] {\n display: flex;\n align-items: center;\n flex: 1;\n gap: 10px;\n min-width: 0;\n}\n.column-management-tab .column-list .column-item .column-info .column-controls[data-v-a4d013ea] {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n}\n.column-management-tab .column-list .column-item .column-info .column-controls .drag-handle[data-v-a4d013ea] {\n color: var(--n-text-color-3);\n cursor: grab;\n}\n.column-management-tab .column-list .column-item .column-info .column-controls .drag-handle[data-v-a4d013ea]:active {\n cursor: grabbing;\n}\n.column-management-tab .column-list .column-item .column-info .column-controls .drag-handle.disabled[data-v-a4d013ea] {\n cursor: not-allowed;\n opacity: 0.3;\n}\n.column-management-tab .column-list .column-item .column-info .column-details[data-v-a4d013ea] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1;\n min-width: 0;\n overflow: hidden;\n}\n.column-management-tab .column-list .column-item .column-actions[data-v-a4d013ea] {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-shrink: 0;\n}\n.column-management-tab .column-list .column-item .column-actions .drag-controls[data-v-a4d013ea] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n.column-management-tab .column-list .column-item .column-actions .drag-controls .c-icon[data-v-a4d013ea] {\n opacity: 0.6;\n transition: all 0.2s ease;\n}\n.column-management-tab .column-list .column-item .column-actions .drag-controls .c-icon[data-v-a4d013ea]:not(.disabled):hover {\n opacity: 1;\n transform: scale(1.15);\n}\n.column-management-tab .column-list .column-item .column-actions .drag-controls .c-icon.disabled[data-v-a4d013ea] {\n opacity: 0.3;\n cursor: not-allowed;\n}\n.column-management-tab .column-list .column-item .column-actions .c-icon[data-v-a4d013ea] {\n transition: all 0.2s ease;\n}\n.column-management-tab .column-list .column-item .column-actions .c-icon[data-v-a4d013ea]:hover {\n transform: scale(1.15);\n}","/* unplugin-vue-components disabled *//* ================= 1. 组件根容器 ================= */\n.c-table-wrapper[data-v-99d893d9] {\n width: 100%;\n position: relative;\n}\n\n/* ================= 2. 表格工具栏 ================= */\n.table-toolbar[data-v-99d893d9] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n}\n.table-toolbar .toolbar-left[data-v-99d893d9] {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n.table-toolbar .toolbar-right[data-v-99d893d9] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.table-toolbar .toolbar-right .column-settings-btn[data-v-99d893d9] {\n opacity: 0.6;\n transition: opacity 0.2s ease, transform 0.2s ease;\n cursor: pointer;\n}\n.table-toolbar .toolbar-right .column-settings-btn[data-v-99d893d9]:hover {\n opacity: 1;\n transform: scale(1.1);\n}\n\n/* ================= 3. 动态行工具栏 ================= */\n.dynamic-rows-toolbar[data-v-99d893d9] {\n margin-bottom: 16px;\n padding: 16px;\n border-radius: 8px;\n border: 1px solid var(--n-border-color);\n background-color: var(--n-card-color);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n transition: all 0.2s ease;\n}\n.dynamic-rows-toolbar[data-v-99d893d9]:hover {\n border-color: var(--n-primary-color-suppl);\n}\n\n/* ================= 4. 表格布局基础 ================= */\n[data-v-99d893d9] .n-data-table {\n table-layout: auto !important;\n width: 100% !important;\n border-radius: 8px;\n overflow: hidden;\n}\n\n/* 确保表格容器允许横向滚动(固定列必需) */\n[data-v-99d893d9] .n-data-table-wrapper {\n overflow-x: auto !important;\n}\n\n/* 分页组件样式 */\n.pagination-wrapper[data-v-99d893d9] {\n margin-top: 16px;\n display: flex;\n justify-content: flex-end;\n}\n\n/* ================= 5. 表格列宽度管理 ================= */\n/* 普通列的最小宽度保护 */\n[data-v-99d893d9] .n-data-table-th:not(:last-child) {\n min-width: 80px !important;\n}\n\n/* 操作列固定宽度(适应4个按钮的布局) */\n[data-v-99d893d9] .n-data-table-th:last-child {\n width: 180px !important;\n min-width: 160px !important;\n max-width: 200px !important;\n text-align: center !important;\n padding: 8px 12px !important;\n}\n\n/* 操作按钮容器居中 */\n[data-v-99d893d9] .n-data-table-td:last-child .n-space {\n justify-content: center !important;\n align-items: center !important;\n}\n\n/* ================= 6. 可编辑单元格样式 ================= */\n/* 单元格编辑容器 - 精致化设计 */\n.cell-edit-wrapper[data-v-99d893d9] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n padding: 6px 8px;\n min-height: 36px;\n border-radius: 4px;\n transition: all 0.2s ease;\n cursor: pointer;\n position: relative;\n /* 悬停效果 */\n /* 激活状态 */\n}\n.cell-edit-wrapper[data-v-99d893d9]:hover {\n background-color: var(--n-color-target);\n}\n.cell-edit-wrapper:hover .cell-edit-icon[data-v-99d893d9] {\n opacity: 1;\n color: var(--n-color-success);\n transform: scale(1.05);\n}\n.cell-edit-wrapper[data-v-99d893d9]:active {\n transform: translateY(1px);\n}\n\n/* 单元格内容 */\n.cell-value[data-v-99d893d9] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n margin-right: 16px;\n line-height: 1.4;\n font-size: 13px;\n}\n\n/* 编辑图标 - 使用全局选择器确保动态创建的元素也能被选中 */\n.cell-edit-icon[data-v-99d893d9],.cell-edit-icon {\n flex-shrink: 0;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n cursor: pointer;\n margin-left: 4px;\n transition: all 0.25s ease;\n color: var(--n-color-success);\n opacity: 0;\n position: relative;\n /* 悬停效果 */\n /* 激活效果 */\n /* 图标尺寸 */\n}\n.cell-edit-icon[data-v-99d893d9]:hover,.cell-edit-icon {\n opacity: 1 !important;\n color: var(--n-color-success-hover) !important;\n background-color: var(--n-color-success-pressed);\n transform: scale(1.1);\n}\n.cell-edit-icon[data-v-99d893d9]:active,.cell-edit-icon {\n transform: scale(0.95);\n}\n.cell-edit-icon svg[data-v-99d893d9],.cell-edit-icon {\n width: 14px;\n height: 14px;\n}\n\n/* ================= 7. 单元格编辑状态样式 ================= */\n/* 编辑容器 - 确保水平布局不换行 */\n.cell-editing-container[data-v-99d893d9],[data-v-99d893d9] .cell-editing-container {\n display: flex !important;\n align-items: center !important;\n width: 100% !important;\n min-height: 36px !important;\n background-color: var(--n-input-color) !important;\n border: 1px solid var(--n-primary-color) !important;\n border-radius: 6px !important;\n padding: 4px 6px !important;\n box-shadow: 0 0 0 2px var(--n-primary-color-suppl) !important;\n gap: 8px !important;\n}\n\n/* 编辑输入区域 - 占据剩余空间 */\n.cell-editing-input[data-v-99d893d9],[data-v-99d893d9] .cell-editing-input {\n flex: 1 !important;\n min-width: 0 !important;\n}\n\n/* 深度选择器处理输入框样式 */\n[data-v-99d893d9] .cell-editing-input .n-input {\n border: none !important;\n box-shadow: none !important;\n background: transparent !important;\n}\n[data-v-99d893d9] .cell-editing-input .n-input.n-input--focus {\n border: none !important;\n box-shadow: none !important;\n}\n[data-v-99d893d9] .cell-editing-input .n-input-number {\n border: none !important;\n box-shadow: none !important;\n background: transparent !important;\n}\n[data-v-99d893d9] .cell-editing-input .n-select {\n border: none !important;\n box-shadow: none !important;\n background: transparent !important;\n}\n[data-v-99d893d9] .cell-editing-input .n-select .n-base-selection {\n border: none !important;\n box-shadow: none !important;\n background: transparent !important;\n}\n\n/* 编辑操作按钮容器 */\n.cell-editing-actions[data-v-99d893d9],[data-v-99d893d9] .cell-editing-actions {\n display: flex !important;\n flex-shrink: 0 !important;\n align-items: center !important;\n gap: 4px !important;\n background: var(--n-color-popover) !important;\n border: 1px solid var(--n-border-color) !important;\n border-radius: 4px !important;\n padding: 2px !important;\n box-shadow: var(--n-box-shadow) !important;\n}\n\n/* 编辑操作按钮 */\n.cell-action-btn[data-v-99d893d9],[data-v-99d893d9] .cell-action-btn {\n display: flex !important;\n align-items: center !important;\n justify-content: center !important;\n width: 20px !important;\n height: 20px !important;\n border: none !important;\n border-radius: 3px !important;\n cursor: pointer !important;\n transition: all 0.2s ease !important;\n background: transparent !important;\n /* 保存按钮 */\n /* 取消按钮 */\n /* 图标尺寸 */\n}\n.cell-action-btn.cell-action-save[data-v-99d893d9],[data-v-99d893d9] .cell-action-btn.cell-action-save {\n color: var(--n-color-success) !important;\n}\n.cell-action-btn.cell-action-save[data-v-99d893d9]:hover,[data-v-99d893d9] .cell-action-btn.cell-action-save:hover {\n background: var(--n-color-success-pressed) !important;\n transform: scale(1.1) !important;\n}\n.cell-action-btn.cell-action-cancel[data-v-99d893d9],[data-v-99d893d9] .cell-action-btn.cell-action-cancel {\n color: var(--n-color-error) !important;\n}\n.cell-action-btn.cell-action-cancel[data-v-99d893d9]:hover,[data-v-99d893d9] .cell-action-btn.cell-action-cancel:hover {\n background: var(--n-color-error-pressed) !important;\n transform: scale(1.1) !important;\n}\n.cell-action-btn svg[data-v-99d893d9],[data-v-99d893d9] .cell-action-btn svg {\n width: 11px !important;\n height: 11px !important;\n}\n\n/* ================= 7. 操作按钮样式 ================= */\n/* 通用按钮样式 */\n[data-v-99d893d9] .n-button {\n white-space: nowrap;\n font-size: 12px !important;\n flex-shrink: 0 !important;\n border-radius: 6px;\n transition: all 0.2s ease;\n font-weight: 500;\n /* 图标间距 */\n /* 小尺寸按钮优化 */\n /* 四元按钮样式 */\n}\n[data-v-99d893d9] .n-button .n-icon {\n margin-right: 4px !important;\n}\n[data-v-99d893d9] .n-button.n-button--small-type {\n padding: 4px 8px;\n height: 28px;\n line-height: 20px;\n}\n[data-v-99d893d9] .n-button.n-button--quaternary-type:hover {\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n[data-v-99d893d9] .n-button.n-button--quaternary-type:active {\n transform: translateY(0);\n}\n\n/* ================= 8. 按钮组间距优化 ================= */\n/* 操作按钮组 */\n[data-v-99d893d9] .n-space.n-space--horizontal .n-space-item:not(:last-child) {\n margin-right: 6px !important;\n}\n\n/* ================= 9. 模态框样式优化 ================= */\n/* 编辑模态框 */\n[data-v-99d893d9] .n-modal .n-card {\n border-radius: 12px;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12);\n}\n[data-v-99d893d9] .n-modal .n-card__header {\n padding: 20px 24px 16px;\n font-weight: 600;\n font-size: 16px;\n}\n[data-v-99d893d9] .n-modal .n-card__content {\n padding: 0 24px 16px;\n}\n[data-v-99d893d9] .n-modal .n-card__action {\n padding: 16px 24px 20px;\n border-top: 1px solid var(--n-divider-color);\n}\n\n/* ================= 10. 描述列表样式 ================= */\n/* 详情模态框描述列表 */\n[data-v-99d893d9] .n-descriptions .n-descriptions-item-label {\n font-weight: 500;\n color: var(--n-text-color-2);\n}\n[data-v-99d893d9] .n-descriptions .n-descriptions-item-content {\n color: var(--n-text-color-1);\n word-break: break-all;\n}\n\n/* ================= 11. 响应式设计 ================= */\n/* 移动端适配 */\n@media (max-width: 768px) {\n.c-table-wrapper[data-v-99d893d9] {\n overflow-x: auto;\n}\n /* 操作列在移动端的适配 */\n[data-v-99d893d9] .n-data-table-th:last-child {\n width: 160px !important;\n min-width: 160px !important;\n}\n /* 按钮在移动端的优化 */\n[data-v-99d893d9] .n-button {\n font-size: 11px !important;\n padding: 3px 6px;\n}\n[data-v-99d893d9] .n-button .n-icon {\n margin-right: 2px !important;\n}\n /* 单元格编辑图标在移动端始终显示 */\n.cell-edit-icon[data-v-99d893d9] {\n opacity: 0.6;\n}\n}\n/* ================= 12. 主题适配 ================= */\n/* 暗色主题适配 - 已通过 CSS 变量自动适配 */\n[data-theme=dark][data-v-99d893d9] {\n /* CSS 变量已自动适配,如有特殊需求可在此添加 */\n}\n\n/* ================= 13. 响应式优化 ================= */\n/* 小屏幕下的单元格编辑优化 */\n@media (max-width: 768px) {\n.cell-editing-container[data-v-99d893d9],[data-v-99d893d9] .cell-editing-container {\n gap: 6px !important;\n}\n.cell-editing-actions[data-v-99d893d9],[data-v-99d893d9] .cell-editing-actions {\n gap: 3px !important;\n padding: 2px !important;\n}\n.cell-action-btn[data-v-99d893d9],[data-v-99d893d9] .cell-action-btn {\n width: 18px !important;\n height: 18px !important;\n}\n.cell-action-btn svg[data-v-99d893d9],[data-v-99d893d9] .cell-action-btn svg {\n width: 10px !important;\n height: 10px !important;\n}\n /* 移动端编辑图标 */\n.cell-edit-icon[data-v-99d893d9] {\n opacity: 0.6 !important;\n}\n.cell-value[data-v-99d893d9] {\n margin-right: 12px !important;\n}\n}\n/* ================= 14. 性能优化 ================= */\n/* 使用 GPU 加速的动画 */\n.cell-edit-icon[data-v-99d893d9],\n.cell-action-btn[data-v-99d893d9] {\n will-change: transform;\n backface-visibility: hidden;\n}\n[data-v-99d893d9] .n-button {\n will-change: transform;\n backface-visibility: hidden;\n}\n\n/* ================= 15. 可访问性优化 ================= */\n/* 聚焦状态 */\n.cell-edit-wrapper[data-v-99d893d9]:focus-within,\n.cell-editing-container[data-v-99d893d9]:focus-within {\n outline: 2px solid var(--n-primary-color);\n outline-offset: 2px;\n}\n\n/* 高对比度模式支持 */\n@media (prefers-contrast: high) {\n.cell-edit-icon[data-v-99d893d9] {\n opacity: 0.8;\n}\n.cell-editing-actions[data-v-99d893d9] {\n border-width: 2px;\n}\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvHA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
package/dist/C_Table.cjs CHANGED
@@ -1,5 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  require('./C_Icon.js');
3
+ require('./C_Editor.js');
3
4
  require('./C_Form.js');
4
5
  const require_C_Table = require('./C_Table.js');
5
6
 
package/dist/C_Table.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import "./C_Icon2.js";
2
+ import "./C_Editor2.js";
2
3
  import "./C_Form2.js";
3
4
  import { a as useTableManager, c as usePrintWatermark, d as useCellEdit, f as useRowEdit, i as usePagination, l as useTableExpand, m as resolveConfig, n as useTableColumns, o as useDynamicRows, p as createEditModeChecker, r as useTableActions, s as printPresets, t as C_Table_default, u as useModalEdit } from "./C_Table2.js";
4
5
 
package/dist/C_Table2.js CHANGED
@@ -2,8 +2,8 @@ import { n as __require } from "./chunk.js";
2
2
  import { t as C_Icon_default } from "./C_Icon2.js";
3
3
  import { t as export_helper_default } from "./export-helper.js";
4
4
  import { t as C_Form_default } from "./C_Form2.js";
5
- import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, h, isRef, mergeProps, nextTick, normalizeClass, normalizeStyle, onBeforeUnmount, onMounted, openBlock, ref, renderList, renderSlot, resolveDynamicComponent, toDisplayString, unref, watch, watchEffect, withCtx } from "vue";
6
5
  import { NButton, NDatePicker, NDropdown, NInput, NInputNumber, NSelect, NSpace, NSwitch, useDialog, useMessage } from "naive-ui";
6
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, h, isRef, mergeProps, nextTick, normalizeClass, normalizeStyle, onBeforeUnmount, onMounted, openBlock, ref, renderList, renderSlot, resolveDynamicComponent, toDisplayString, unref, watch, watchEffect, withCtx } from "vue";
7
7
  import html2canvas from "html2canvas";
8
8
  import { NButton as NButton$1, NButtonGroup as NButtonGroup$1, NCheckbox as NCheckbox$1, NDataTable, NDrawer as NDrawer$1, NDrawerContent as NDrawerContent$1, NDropdown as NDropdown$1, NInput as NInput$1, NModal as NModal$1, NPagination as NPagination$1, NSpace as NSpace$1, NSpin as NSpin$1, NSwitch as NSwitch$1, NTag as NTag$1, NText as NText$1, NTooltip as NTooltip$1, useMessage as useMessage$1 } from "naive-ui/es";
9
9
  import printJS from "print-js";
@@ -2696,7 +2696,7 @@ var index_vue_vue_type_script_setup_true_lang_default$1 = /* @__PURE__ */ define
2696
2696
 
2697
2697
  //#endregion
2698
2698
  //#region src/components/C_Table/components/ColumnSettings/index.vue
2699
- var ColumnSettings_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default$1, [["__scopeId", "data-v-80dbeb1b"]]);
2699
+ var ColumnSettings_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default$1, [["__scopeId", "data-v-a4d013ea"]]);
2700
2700
 
2701
2701
  //#endregion
2702
2702
  //#region src/components/C_Table/index.vue?vue&type=script&setup=true&lang.ts
@@ -3002,7 +3002,7 @@ var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCo
3002
3002
 
3003
3003
  //#endregion
3004
3004
  //#region src/components/C_Table/index.vue
3005
- var C_Table_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-cbdb9723"]]);
3005
+ var C_Table_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-99d893d9"]]);
3006
3006
 
3007
3007
  //#endregion
3008
3008
  export { useTableManager as a, usePrintWatermark as c, useCellEdit as d, useRowEdit as f, usePagination as i, useTableExpand as l, resolveConfig as m, useTableColumns as n, useDynamicRows as o, createEditModeChecker as p, useTableActions as r, printPresets as s, C_Table_default as t, useModalEdit as u };