@robot-admin/naive-ui-components 0.3.0

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 (352) hide show
  1. package/README.md +257 -0
  2. package/dist/C_ActionBar-DWN-woTc.css.map +1 -0
  3. package/dist/C_ActionBar.cjs +5 -0
  4. package/dist/C_ActionBar.d.cts +2 -0
  5. package/dist/C_ActionBar.d.ts +2 -0
  6. package/dist/C_ActionBar.js +4 -0
  7. package/dist/C_ActionBar2.js +196 -0
  8. package/dist/C_ActionBar2.js.map +1 -0
  9. package/dist/C_AntV-AFKyK6hH.css.map +1 -0
  10. package/dist/C_AntV.cjs +8 -0
  11. package/dist/C_AntV.d.cts +2 -0
  12. package/dist/C_AntV.d.ts +2 -0
  13. package/dist/C_AntV.js +4 -0
  14. package/dist/C_AntV2.js +3150 -0
  15. package/dist/C_AntV2.js.map +1 -0
  16. package/dist/C_Barcode-P_EFj8dC.css.map +1 -0
  17. package/dist/C_Barcode.cjs +4 -0
  18. package/dist/C_Barcode.d.cts +2 -0
  19. package/dist/C_Barcode.d.ts +2 -0
  20. package/dist/C_Barcode.js +3 -0
  21. package/dist/C_Barcode2.js +68 -0
  22. package/dist/C_Barcode2.js.map +1 -0
  23. package/dist/C_Captcha-C-ef41xw.css.map +1 -0
  24. package/dist/C_Captcha.cjs +4 -0
  25. package/dist/C_Captcha.d.cts +2 -0
  26. package/dist/C_Captcha.d.ts +2 -0
  27. package/dist/C_Captcha.js +3 -0
  28. package/dist/C_Captcha2.js +155 -0
  29. package/dist/C_Captcha2.js.map +1 -0
  30. package/dist/C_Cascade-D9kNsjsV.css.map +1 -0
  31. package/dist/C_Cascade.cjs +4 -0
  32. package/dist/C_Cascade.d.cts +2 -0
  33. package/dist/C_Cascade.d.ts +2 -0
  34. package/dist/C_Cascade.js +3 -0
  35. package/dist/C_Cascade2.js +103 -0
  36. package/dist/C_Cascade2.js.map +1 -0
  37. package/dist/C_City-BCQ4ipiK.css.map +1 -0
  38. package/dist/C_City.cjs +4 -0
  39. package/dist/C_City.d.cts +2 -0
  40. package/dist/C_City.d.ts +2 -0
  41. package/dist/C_City.js +3 -0
  42. package/dist/C_City2.js +841 -0
  43. package/dist/C_City2.js.map +1 -0
  44. package/dist/C_Code-C9kvvEmO.css.map +1 -0
  45. package/dist/C_Code.cjs +5 -0
  46. package/dist/C_Code.d.cts +2 -0
  47. package/dist/C_Code.d.ts +2 -0
  48. package/dist/C_Code.js +4 -0
  49. package/dist/C_Code2.js +346 -0
  50. package/dist/C_Code2.js.map +1 -0
  51. package/dist/C_CollapsePanel-BUJHuYcU.css.map +1 -0
  52. package/dist/C_CollapsePanel.cjs +6 -0
  53. package/dist/C_CollapsePanel.d.cts +2 -0
  54. package/dist/C_CollapsePanel.d.ts +2 -0
  55. package/dist/C_CollapsePanel.js +4 -0
  56. package/dist/C_CollapsePanel2.js +319 -0
  57. package/dist/C_CollapsePanel2.js.map +1 -0
  58. package/dist/C_Cron-yx2Ob4Jl.css.map +1 -0
  59. package/dist/C_Cron.cjs +15 -0
  60. package/dist/C_Cron.d.cts +2 -0
  61. package/dist/C_Cron.d.ts +2 -0
  62. package/dist/C_Cron.js +4 -0
  63. package/dist/C_Cron2.js +1209 -0
  64. package/dist/C_Cron2.js.map +1 -0
  65. package/dist/C_Date.cjs +4 -0
  66. package/dist/C_Date.d.cts +2 -0
  67. package/dist/C_Date.d.ts +2 -0
  68. package/dist/C_Date.js +3 -0
  69. package/dist/C_Date2.js +219 -0
  70. package/dist/C_Date2.js.map +1 -0
  71. package/dist/C_Draggable-C483syRC.css.map +1 -0
  72. package/dist/C_Draggable.cjs +5 -0
  73. package/dist/C_Draggable.d.cts +2 -0
  74. package/dist/C_Draggable.d.ts +2 -0
  75. package/dist/C_Draggable.js +3 -0
  76. package/dist/C_Draggable2.js +295 -0
  77. package/dist/C_Draggable2.js.map +1 -0
  78. package/dist/C_Editor-Bp0SyIEw.css.map +1 -0
  79. package/dist/C_Editor.cjs +4 -0
  80. package/dist/C_Editor.d.cts +2 -0
  81. package/dist/C_Editor.d.ts +2 -0
  82. package/dist/C_Editor.js +3 -0
  83. package/dist/C_Editor2.js +160 -0
  84. package/dist/C_Editor2.js.map +1 -0
  85. package/dist/C_FilePreview-CPqvhoCy.css.map +1 -0
  86. package/dist/C_FilePreview.cjs +6 -0
  87. package/dist/C_FilePreview.d.cts +2 -0
  88. package/dist/C_FilePreview.d.ts +2 -0
  89. package/dist/C_FilePreview.js +3 -0
  90. package/dist/C_FilePreview2.js +1031 -0
  91. package/dist/C_FilePreview2.js.map +1 -0
  92. package/dist/C_Form-Jx7PY3sT.css.map +1 -0
  93. package/dist/C_Form.cjs +15 -0
  94. package/dist/C_Form.d.cts +2 -0
  95. package/dist/C_Form.d.ts +2 -0
  96. package/dist/C_Form.js +4 -0
  97. package/dist/C_Form2.js +2510 -0
  98. package/dist/C_Form2.js.map +1 -0
  99. package/dist/C_FormSearch-DvRgxlRn.css.map +1 -0
  100. package/dist/C_FormSearch.cjs +6 -0
  101. package/dist/C_FormSearch.d.cts +2 -0
  102. package/dist/C_FormSearch.d.ts +2 -0
  103. package/dist/C_FormSearch.js +3 -0
  104. package/dist/C_FormSearch2.js +356 -0
  105. package/dist/C_FormSearch2.js.map +1 -0
  106. package/dist/C_FormulaEditor-DtGkt4T_.css.map +1 -0
  107. package/dist/C_FormulaEditor.cjs +13 -0
  108. package/dist/C_FormulaEditor.d.cts +2 -0
  109. package/dist/C_FormulaEditor.d.ts +2 -0
  110. package/dist/C_FormulaEditor.js +4 -0
  111. package/dist/C_FormulaEditor2.js +1433 -0
  112. package/dist/C_FormulaEditor2.js.map +1 -0
  113. package/dist/C_FullCalendar-BF7H0YIx.css.map +1 -0
  114. package/dist/C_FullCalendar.cjs +9 -0
  115. package/dist/C_FullCalendar.d.cts +2 -0
  116. package/dist/C_FullCalendar.d.ts +2 -0
  117. package/dist/C_FullCalendar.js +3 -0
  118. package/dist/C_FullCalendar2.js +377 -0
  119. package/dist/C_FullCalendar2.js.map +1 -0
  120. package/dist/C_Guide.cjs +4 -0
  121. package/dist/C_Guide.d.cts +2 -0
  122. package/dist/C_Guide.d.ts +2 -0
  123. package/dist/C_Guide.js +3 -0
  124. package/dist/C_Guide2.js +58 -0
  125. package/dist/C_Guide2.js.map +1 -0
  126. package/dist/C_Icon.cjs +4 -0
  127. package/dist/C_Icon.d.cts +2 -0
  128. package/dist/C_Icon.d.ts +2 -0
  129. package/dist/C_Icon.js +3 -0
  130. package/dist/C_Icon2.js +286 -0
  131. package/dist/C_Icon2.js.map +1 -0
  132. package/dist/C_ImageCropper-BVJfUufl.css.map +1 -0
  133. package/dist/C_ImageCropper.cjs +6 -0
  134. package/dist/C_ImageCropper.d.cts +2 -0
  135. package/dist/C_ImageCropper.d.ts +2 -0
  136. package/dist/C_ImageCropper.js +4 -0
  137. package/dist/C_ImageCropper2.js +723 -0
  138. package/dist/C_ImageCropper2.js.map +1 -0
  139. package/dist/C_Language.cjs +4 -0
  140. package/dist/C_Language.d.cts +2 -0
  141. package/dist/C_Language.d.ts +2 -0
  142. package/dist/C_Language.js +3 -0
  143. package/dist/C_Language2.js +72 -0
  144. package/dist/C_Language2.js.map +1 -0
  145. package/dist/C_Map-DpzeuWdX.css.map +1 -0
  146. package/dist/C_Map.cjs +7 -0
  147. package/dist/C_Map.d.cts +2 -0
  148. package/dist/C_Map.d.ts +2 -0
  149. package/dist/C_Map.js +3 -0
  150. package/dist/C_Map2.js +199 -0
  151. package/dist/C_Map2.js.map +1 -0
  152. package/dist/C_Markdown-BEjxknqd.css.map +1 -0
  153. package/dist/C_Markdown.cjs +4 -0
  154. package/dist/C_Markdown.d.cts +2 -0
  155. package/dist/C_Markdown.d.ts +2 -0
  156. package/dist/C_Markdown.js +3 -0
  157. package/dist/C_Markdown2.js +186 -0
  158. package/dist/C_Markdown2.js.map +1 -0
  159. package/dist/C_NotificationCenter-0l3TY2Gn.css.map +1 -0
  160. package/dist/C_NotificationCenter.cjs +20 -0
  161. package/dist/C_NotificationCenter.d.cts +2 -0
  162. package/dist/C_NotificationCenter.d.ts +2 -0
  163. package/dist/C_NotificationCenter.js +4 -0
  164. package/dist/C_NotificationCenter2.js +1383 -0
  165. package/dist/C_NotificationCenter2.js.map +1 -0
  166. package/dist/C_Progress.cjs +4 -0
  167. package/dist/C_Progress.d.cts +2 -0
  168. package/dist/C_Progress.d.ts +2 -0
  169. package/dist/C_Progress.js +3 -0
  170. package/dist/C_Progress2.js +103 -0
  171. package/dist/C_Progress2.js.map +1 -0
  172. package/dist/C_QRCode-DbdiAIPg.css.map +1 -0
  173. package/dist/C_QRCode.cjs +5 -0
  174. package/dist/C_QRCode.d.cts +2 -0
  175. package/dist/C_QRCode.d.ts +2 -0
  176. package/dist/C_QRCode.js +3 -0
  177. package/dist/C_QRCode2.js +218 -0
  178. package/dist/C_QRCode2.js.map +1 -0
  179. package/dist/C_Signature-zhHCbra9.css.map +1 -0
  180. package/dist/C_Signature.cjs +8 -0
  181. package/dist/C_Signature.d.cts +2 -0
  182. package/dist/C_Signature.d.ts +2 -0
  183. package/dist/C_Signature.js +4 -0
  184. package/dist/C_Signature2.js +618 -0
  185. package/dist/C_Signature2.js.map +1 -0
  186. package/dist/C_SplitPane-C6sBsfKY.css.map +1 -0
  187. package/dist/C_SplitPane.cjs +6 -0
  188. package/dist/C_SplitPane.d.cts +2 -0
  189. package/dist/C_SplitPane.d.ts +2 -0
  190. package/dist/C_SplitPane.js +4 -0
  191. package/dist/C_SplitPane2.js +356 -0
  192. package/dist/C_SplitPane2.js.map +1 -0
  193. package/dist/C_Steps-CODHN5Hs.css.map +1 -0
  194. package/dist/C_Steps.cjs +4 -0
  195. package/dist/C_Steps.d.cts +2 -0
  196. package/dist/C_Steps.d.ts +2 -0
  197. package/dist/C_Steps.js +3 -0
  198. package/dist/C_Steps2.js +82 -0
  199. package/dist/C_Steps2.js.map +1 -0
  200. package/dist/C_Table-DSNsntmT.css.map +1 -0
  201. package/dist/C_Table.cjs +19 -0
  202. package/dist/C_Table.d.cts +2 -0
  203. package/dist/C_Table.d.ts +2 -0
  204. package/dist/C_Table.js +5 -0
  205. package/dist/C_Table2.js +3009 -0
  206. package/dist/C_Table2.js.map +1 -0
  207. package/dist/C_Theme.cjs +4 -0
  208. package/dist/C_Theme.d.cts +2 -0
  209. package/dist/C_Theme.d.ts +2 -0
  210. package/dist/C_Theme.js +3 -0
  211. package/dist/C_Theme2.js +60 -0
  212. package/dist/C_Theme2.js.map +1 -0
  213. package/dist/C_Time-BvZLYraL.css.map +1 -0
  214. package/dist/C_Time.cjs +5 -0
  215. package/dist/C_Time.d.cts +2 -0
  216. package/dist/C_Time.d.ts +2 -0
  217. package/dist/C_Time.js +3 -0
  218. package/dist/C_Time2.js +199 -0
  219. package/dist/C_Time2.js.map +1 -0
  220. package/dist/C_Tree-0GDv--jX.css.map +1 -0
  221. package/dist/C_Tree.cjs +7 -0
  222. package/dist/C_Tree.d.cts +2 -0
  223. package/dist/C_Tree.d.ts +2 -0
  224. package/dist/C_Tree.js +4 -0
  225. package/dist/C_Tree2.js +441 -0
  226. package/dist/C_Tree2.js.map +1 -0
  227. package/dist/C_Upload-BXd3YYLx.css.map +1 -0
  228. package/dist/C_Upload.cjs +12 -0
  229. package/dist/C_Upload.d.cts +2 -0
  230. package/dist/C_Upload.d.ts +2 -0
  231. package/dist/C_Upload.js +4 -0
  232. package/dist/C_Upload2.js +1388 -0
  233. package/dist/C_Upload2.js.map +1 -0
  234. package/dist/C_VideoPlayer-DYG3RL0Q.css.map +1 -0
  235. package/dist/C_VideoPlayer.cjs +23 -0
  236. package/dist/C_VideoPlayer.d.cts +2 -0
  237. package/dist/C_VideoPlayer.d.ts +2 -0
  238. package/dist/C_VideoPlayer.js +3 -0
  239. package/dist/C_VideoPlayer2.js +1932 -0
  240. package/dist/C_VideoPlayer2.js.map +1 -0
  241. package/dist/C_VtableGantt-fhItIiHE.css.map +1 -0
  242. package/dist/C_VtableGantt.cjs +6 -0
  243. package/dist/C_VtableGantt.d.cts +2 -0
  244. package/dist/C_VtableGantt.d.ts +2 -0
  245. package/dist/C_VtableGantt.js +4 -0
  246. package/dist/C_VtableGantt2.js +873 -0
  247. package/dist/C_VtableGantt2.js.map +1 -0
  248. package/dist/C_WaterFall-8sQDFXKg.css.map +1 -0
  249. package/dist/C_WaterFall.cjs +13 -0
  250. package/dist/C_WaterFall.d.cts +2 -0
  251. package/dist/C_WaterFall.d.ts +2 -0
  252. package/dist/C_WaterFall.js +3 -0
  253. package/dist/C_WaterFall2.js +365 -0
  254. package/dist/C_WaterFall2.js.map +1 -0
  255. package/dist/C_WorkFlow-J-dyIuh9.css.map +1 -0
  256. package/dist/C_WorkFlow.cjs +8 -0
  257. package/dist/C_WorkFlow.d.cts +2 -0
  258. package/dist/C_WorkFlow.d.ts +2 -0
  259. package/dist/C_WorkFlow.js +4 -0
  260. package/dist/C_WorkFlow2.js +1984 -0
  261. package/dist/C_WorkFlow2.js.map +1 -0
  262. package/dist/chunk.js +22 -0
  263. package/dist/city.js +4817 -0
  264. package/dist/city.js.map +1 -0
  265. package/dist/constants.d.ts +273 -0
  266. package/dist/constants.d.ts.map +1 -0
  267. package/dist/constants2.d.ts +178 -0
  268. package/dist/constants2.d.ts.map +1 -0
  269. package/dist/constants3.d.ts +475 -0
  270. package/dist/constants3.d.ts.map +1 -0
  271. package/dist/constants4.d.ts +430 -0
  272. package/dist/constants4.d.ts.map +1 -0
  273. package/dist/constants5.d.ts +4283 -0
  274. package/dist/constants5.d.ts.map +1 -0
  275. package/dist/data.d.ts +67 -0
  276. package/dist/data.d.ts.map +1 -0
  277. package/dist/export-helper.js +9 -0
  278. package/dist/index.cjs +409 -0
  279. package/dist/index.d.cts +96 -0
  280. package/dist/index.d.cts.map +1 -0
  281. package/dist/index.d.ts +103 -0
  282. package/dist/index.d.ts.map +1 -0
  283. package/dist/index.js +230 -0
  284. package/dist/index.js.map +1 -0
  285. package/dist/index.vue.d.ts +80 -0
  286. package/dist/index.vue.d.ts.map +1 -0
  287. package/dist/index10.vue.d.ts +72 -0
  288. package/dist/index10.vue.d.ts.map +1 -0
  289. package/dist/index11.vue.d.ts +26 -0
  290. package/dist/index11.vue.d.ts.map +1 -0
  291. package/dist/index12.vue.d.ts +81 -0
  292. package/dist/index12.vue.d.ts.map +1 -0
  293. package/dist/index13.vue.d.ts +55 -0
  294. package/dist/index13.vue.d.ts.map +1 -0
  295. package/dist/index14.vue.d.ts +33 -0
  296. package/dist/index14.vue.d.ts.map +1 -0
  297. package/dist/index15.vue.d.ts +18 -0
  298. package/dist/index15.vue.d.ts.map +1 -0
  299. package/dist/index16.vue.d.ts +662 -0
  300. package/dist/index16.vue.d.ts.map +1 -0
  301. package/dist/index2.vue.d.ts +38 -0
  302. package/dist/index2.vue.d.ts.map +1 -0
  303. package/dist/index3.vue.d.ts +45 -0
  304. package/dist/index3.vue.d.ts.map +1 -0
  305. package/dist/index4.vue.d.ts +31 -0
  306. package/dist/index4.vue.d.ts.map +1 -0
  307. package/dist/index5.vue.d.ts +35 -0
  308. package/dist/index5.vue.d.ts.map +1 -0
  309. package/dist/index6.vue.d.ts +48 -0
  310. package/dist/index6.vue.d.ts.map +1 -0
  311. package/dist/index7.vue.d.ts +56 -0
  312. package/dist/index7.vue.d.ts.map +1 -0
  313. package/dist/index8.vue.d.ts +41 -0
  314. package/dist/index8.vue.d.ts.map +1 -0
  315. package/dist/index9.vue.d.ts +30 -0
  316. package/dist/index9.vue.d.ts.map +1 -0
  317. package/dist/storage.js +31 -0
  318. package/dist/storage.js.map +1 -0
  319. package/dist/style.css +7725 -0
  320. package/dist/useCalendarEvents.d.ts +148 -0
  321. package/dist/useCalendarEvents.d.ts.map +1 -0
  322. package/dist/useCollapsePanel.d.ts +132 -0
  323. package/dist/useCollapsePanel.d.ts.map +1 -0
  324. package/dist/useCropperCore.d.ts +102 -0
  325. package/dist/useCropperCore.d.ts.map +1 -0
  326. package/dist/useDraggableLayout.d.ts +194 -0
  327. package/dist/useDraggableLayout.d.ts.map +1 -0
  328. package/dist/useDynamicFormState.d.ts +4248 -0
  329. package/dist/useDynamicFormState.d.ts.map +1 -0
  330. package/dist/useEdgeInteraction.d.ts +7614 -0
  331. package/dist/useEdgeInteraction.d.ts.map +1 -0
  332. package/dist/useFullscreen.d.ts +166 -0
  333. package/dist/useFullscreen.d.ts.map +1 -0
  334. package/dist/useInfiniteScroll.d.ts +169 -0
  335. package/dist/useInfiniteScroll.d.ts.map +1 -0
  336. package/dist/useModalEdit.d.ts +960 -0
  337. package/dist/useModalEdit.d.ts.map +1 -0
  338. package/dist/useQRCode.d.ts +87 -0
  339. package/dist/useQRCode.d.ts.map +1 -0
  340. package/dist/useSearchState.d.ts +180 -0
  341. package/dist/useSearchState.d.ts.map +1 -0
  342. package/dist/useSignatureHistory.d.ts +189 -0
  343. package/dist/useSignatureHistory.d.ts.map +1 -0
  344. package/dist/useSplitResize.d.ts +158 -0
  345. package/dist/useSplitResize.d.ts.map +1 -0
  346. package/dist/useTimeSelection.d.ts +105 -0
  347. package/dist/useTimeSelection.d.ts.map +1 -0
  348. package/dist/useTreeOperations.d.ts +183 -0
  349. package/dist/useTreeOperations.d.ts.map +1 -0
  350. package/dist/useWorkflowValidation.d.ts +1052 -0
  351. package/dist/useWorkflowValidation.d.ts.map +1 -0
  352. package/package.json +342 -0
@@ -0,0 +1,319 @@
1
+ import { t as C_Icon_default } from "./C_Icon2.js";
2
+ import { t as export_helper_default } from "./export-helper.js";
3
+ import { Fragment, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, normalizeClass, openBlock, ref, renderList, renderSlot, toDisplayString, toRef, unref, vShow, watch, withCtx, withDirectives, withModifiers } from "vue";
4
+
5
+ //#region src/components/C_CollapsePanel/composables/useCollapsePanel.ts
6
+ /**
7
+ * 折叠面板展开/折叠核心逻辑
8
+ */
9
+ function useCollapsePanel(options) {
10
+ const { items, activeKeys: externalKeys, defaultActiveKeys, accordion, persistKey, onChange, onExpand, onCollapse } = options;
11
+ const loadPersistedKeys = () => {
12
+ if (!persistKey.value) return null;
13
+ try {
14
+ const raw = localStorage.getItem(`collapse-panel:${persistKey.value}`);
15
+ return raw ? JSON.parse(raw) : null;
16
+ } catch {
17
+ return null;
18
+ }
19
+ };
20
+ const savePersistedKeys = (keys) => {
21
+ if (!persistKey.value) return;
22
+ try {
23
+ localStorage.setItem(`collapse-panel:${persistKey.value}`, JSON.stringify(keys));
24
+ } catch {}
25
+ };
26
+ const resolveInitialKeys = () => {
27
+ if (externalKeys.value !== void 0) return [...externalKeys.value];
28
+ const persisted = loadPersistedKeys();
29
+ if (persisted) return persisted;
30
+ return [...defaultActiveKeys];
31
+ };
32
+ const internalKeys = ref(resolveInitialKeys());
33
+ /** 懒渲染追踪:记录哪些面板曾被展开过 */
34
+ const renderedOnce = ref(new Set(internalKeys.value));
35
+ /** 当前激活的 key 数组(兼容受控 / 非受控) */
36
+ const currentKeys = computed({
37
+ get: () => externalKeys.value !== void 0 ? externalKeys.value : internalKeys.value,
38
+ set: (val) => {
39
+ internalKeys.value = val;
40
+ }
41
+ });
42
+ /**
43
+ * 判断面板是否展开
44
+ */
45
+ const isExpanded = (key) => {
46
+ return currentKeys.value.includes(key);
47
+ };
48
+ /**
49
+ * 判断面板是否应该渲染内容
50
+ * - lazy 面板只有被展开过至少一次后才渲染
51
+ * - destroyOnCollapse 面板在折叠后销毁 DOM
52
+ */
53
+ const shouldRender = (item) => {
54
+ const expanded = isExpanded(item.key);
55
+ if (item.destroyOnCollapse) return expanded;
56
+ if (item.lazy) return renderedOnce.value.has(item.key);
57
+ return true;
58
+ };
59
+ const updateKeys = (newKeys) => {
60
+ currentKeys.value = newKeys;
61
+ onChange?.(newKeys);
62
+ savePersistedKeys(newKeys);
63
+ };
64
+ const toggle = (key) => {
65
+ const item = items.value.find((i) => i.key === key);
66
+ if (!item || item.disabled) return;
67
+ if (isExpanded(key)) {
68
+ updateKeys(currentKeys.value.filter((k) => k !== key));
69
+ onCollapse?.(key);
70
+ } else {
71
+ renderedOnce.value.add(key);
72
+ if (accordion.value) {
73
+ const prevKeys = currentKeys.value;
74
+ updateKeys([key]);
75
+ prevKeys.forEach((k) => {
76
+ if (k !== key) onCollapse?.(k);
77
+ });
78
+ } else updateKeys([...currentKeys.value, key]);
79
+ onExpand?.(key);
80
+ }
81
+ };
82
+ const expandAll = () => {
83
+ if (accordion.value) return;
84
+ const allKeys = items.value.filter((i) => !i.disabled).map((i) => i.key);
85
+ allKeys.forEach((k) => renderedOnce.value.add(k));
86
+ updateKeys(allKeys);
87
+ };
88
+ const collapseAll = () => {
89
+ updateKeys([]);
90
+ };
91
+ const getActiveKeys = () => {
92
+ return [...currentKeys.value];
93
+ };
94
+ const handleKeyDown = (e, key) => {
95
+ if (["Enter", " "].includes(e.key)) {
96
+ e.preventDefault();
97
+ toggle(key);
98
+ }
99
+ };
100
+ watch(() => externalKeys.value, (newVal) => {
101
+ if (newVal !== void 0) {
102
+ internalKeys.value = [...newVal];
103
+ newVal.forEach((k) => renderedOnce.value.add(k));
104
+ savePersistedKeys(newVal);
105
+ }
106
+ });
107
+ return {
108
+ currentKeys,
109
+ renderedOnce,
110
+ isExpanded,
111
+ shouldRender,
112
+ toggle,
113
+ expandAll,
114
+ collapseAll,
115
+ getActiveKeys,
116
+ handleKeyDown
117
+ };
118
+ }
119
+
120
+ //#endregion
121
+ //#region src/components/C_CollapsePanel/index.vue?vue&type=script&setup=true&lang.ts
122
+ const _hoisted_1 = [
123
+ "aria-expanded",
124
+ "aria-controls",
125
+ "aria-disabled",
126
+ "tabindex",
127
+ "onClick",
128
+ "onKeydown"
129
+ ];
130
+ const _hoisted_2 = { class: "collapse-item__title-area" };
131
+ const _hoisted_3 = { class: "collapse-item__title-group" };
132
+ const _hoisted_4 = { class: "collapse-item__title" };
133
+ const _hoisted_5 = {
134
+ key: 1,
135
+ class: "collapse-item__subtitle"
136
+ };
137
+ const _hoisted_6 = ["id", "aria-labelledby"];
138
+ const _hoisted_7 = {
139
+ key: 0,
140
+ class: "collapse-item__content"
141
+ };
142
+ var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
143
+ name: "C_CollapsePanel",
144
+ __name: "index",
145
+ props: {
146
+ items: {},
147
+ activeKeys: { default: void 0 },
148
+ defaultActiveKeys: { default: () => [] },
149
+ accordion: {
150
+ type: Boolean,
151
+ default: false
152
+ },
153
+ variant: { default: "default" },
154
+ expandIconPosition: { default: "left" },
155
+ bordered: {
156
+ type: Boolean,
157
+ default: true
158
+ },
159
+ persistKey: { default: void 0 }
160
+ },
161
+ emits: [
162
+ "update:activeKeys",
163
+ "expand",
164
+ "collapse",
165
+ "change"
166
+ ],
167
+ setup(__props, { expose: __expose, emit: __emit }) {
168
+ const props = __props;
169
+ const emit = __emit;
170
+ const containerRef = ref(null);
171
+ const panelRefs = ref(/* @__PURE__ */ new Map());
172
+ const setPanelRef = (key, el) => {
173
+ if (el) panelRefs.value.set(key, el);
174
+ else panelRefs.value.delete(key);
175
+ };
176
+ const { isExpanded, shouldRender, toggle, expandAll, collapseAll, getActiveKeys, handleKeyDown } = useCollapsePanel({
177
+ items: toRef(props, "items"),
178
+ activeKeys: toRef(props, "activeKeys"),
179
+ defaultActiveKeys: props.defaultActiveKeys,
180
+ accordion: toRef(props, "accordion"),
181
+ persistKey: toRef(props, "persistKey"),
182
+ onChange: (keys) => {
183
+ emit("update:activeKeys", keys);
184
+ emit("change", keys);
185
+ },
186
+ onExpand: (key) => emit("expand", key),
187
+ onCollapse: (key) => emit("collapse", key)
188
+ });
189
+ const onEnter = (el) => {
190
+ const element = el;
191
+ element.style.height = "0";
192
+ element.style.overflow = "hidden";
193
+ element.offsetHeight;
194
+ element.style.height = `${element.scrollHeight}px`;
195
+ };
196
+ const onAfterEnter = (el) => {
197
+ const element = el;
198
+ element.style.height = "";
199
+ element.style.overflow = "";
200
+ };
201
+ const onLeave = (el) => {
202
+ const element = el;
203
+ element.style.height = `${element.scrollHeight}px`;
204
+ element.style.overflow = "hidden";
205
+ element.offsetHeight;
206
+ element.style.height = "0";
207
+ };
208
+ const onAfterLeave = (el) => {
209
+ const element = el;
210
+ element.style.height = "";
211
+ element.style.overflow = "";
212
+ };
213
+ const scrollToPanel = (key) => {
214
+ const el = panelRefs.value.get(key);
215
+ if (el) el.scrollIntoView({
216
+ behavior: "smooth",
217
+ block: "start"
218
+ });
219
+ };
220
+ __expose({
221
+ expandAll,
222
+ collapseAll,
223
+ toggle,
224
+ getActiveKeys,
225
+ scrollToPanel
226
+ });
227
+ return (_ctx, _cache) => {
228
+ return openBlock(), createElementBlock("div", {
229
+ ref_key: "containerRef",
230
+ ref: containerRef,
231
+ class: normalizeClass(["c-collapse-panel", [`c-collapse-panel--${_ctx.variant}`, {
232
+ "c-collapse-panel--bordered": _ctx.bordered,
233
+ "c-collapse-panel--icon-right": _ctx.expandIconPosition === "right"
234
+ }]])
235
+ }, [(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.items, (item) => {
236
+ return openBlock(), createElementBlock("div", {
237
+ key: item.key,
238
+ ref_for: true,
239
+ ref: (el) => setPanelRef(item.key, el),
240
+ class: normalizeClass(["collapse-item", {
241
+ "collapse-item--active": unref(isExpanded)(item.key),
242
+ "collapse-item--disabled": item.disabled
243
+ }])
244
+ }, [
245
+ createCommentVNode(" 面板头部 "),
246
+ createElementVNode("div", {
247
+ class: "collapse-item__header",
248
+ role: "button",
249
+ "aria-expanded": unref(isExpanded)(item.key),
250
+ "aria-controls": `collapse-content-${item.key}`,
251
+ "aria-disabled": item.disabled,
252
+ tabindex: item.disabled ? -1 : 0,
253
+ onClick: ($event) => !item.disabled && unref(toggle)(item.key),
254
+ onKeydown: ($event) => unref(handleKeyDown)($event, item.key)
255
+ }, [
256
+ createCommentVNode(" 展开图标 "),
257
+ createElementVNode("span", { class: normalizeClass(["collapse-item__arrow", { "collapse-item__arrow--expanded": unref(isExpanded)(item.key) }]) }, [createVNode(C_Icon_default, {
258
+ name: "mdi:chevron-right",
259
+ size: 16,
260
+ color: "currentColor"
261
+ })], 2),
262
+ createCommentVNode(" 标题区域 "),
263
+ createElementVNode("div", _hoisted_2, [renderSlot(_ctx.$slots, `header-${item.key}`, {
264
+ item,
265
+ expanded: unref(isExpanded)(item.key)
266
+ }, () => [createElementVNode("div", _hoisted_3, [
267
+ item.icon ? (openBlock(), createBlock(C_Icon_default, {
268
+ key: 0,
269
+ name: item.icon,
270
+ size: 18,
271
+ color: "currentColor",
272
+ class: "collapse-item__icon"
273
+ }, null, 8, ["name"])) : createCommentVNode("v-if", true),
274
+ createElementVNode("span", _hoisted_4, toDisplayString(item.title), 1),
275
+ item.subtitle ? (openBlock(), createElementBlock("span", _hoisted_5, toDisplayString(item.subtitle), 1)) : createCommentVNode("v-if", true)
276
+ ])], true)]),
277
+ createCommentVNode(" 头部右侧操作区 "),
278
+ _ctx.$slots[`extra-${item.key}`] ? (openBlock(), createElementBlock("div", {
279
+ key: 0,
280
+ class: "collapse-item__extra",
281
+ onClick: _cache[0] || (_cache[0] = withModifiers(() => {}, ["stop"]))
282
+ }, [renderSlot(_ctx.$slots, `extra-${item.key}`, {
283
+ item,
284
+ expanded: unref(isExpanded)(item.key)
285
+ }, void 0, true)])) : createCommentVNode("v-if", true)
286
+ ], 40, _hoisted_1),
287
+ createCommentVNode(" 面板内容 "),
288
+ createVNode(Transition, {
289
+ name: "collapse-slide",
290
+ onEnter,
291
+ onAfterEnter,
292
+ onLeave,
293
+ onAfterLeave,
294
+ persisted: ""
295
+ }, {
296
+ default: withCtx(() => [withDirectives(createElementVNode("div", {
297
+ id: `collapse-content-${item.key}`,
298
+ class: "collapse-item__content-wrapper",
299
+ role: "region",
300
+ "aria-labelledby": `collapse-header-${item.key}`
301
+ }, [unref(shouldRender)(item) ? (openBlock(), createElementBlock("div", _hoisted_7, [renderSlot(_ctx.$slots, `panel-${item.key}`, {
302
+ item,
303
+ expanded: unref(isExpanded)(item.key)
304
+ }, void 0, true)])) : createCommentVNode("v-if", true)], 8, _hoisted_6), [[vShow, unref(isExpanded)(item.key)]])]),
305
+ _: 2
306
+ }, 1024)
307
+ ], 2);
308
+ }), 128))], 2);
309
+ };
310
+ }
311
+ });
312
+
313
+ //#endregion
314
+ //#region src/components/C_CollapsePanel/index.vue
315
+ var C_CollapsePanel_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-b9cfb91a"]]);
316
+
317
+ //#endregion
318
+ export { useCollapsePanel as n, C_CollapsePanel_default as t };
319
+ //# sourceMappingURL=C_CollapsePanel2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"C_CollapsePanel2.js","names":["variant","bordered","expandIconPosition","items","$slots"],"sources":["../src/components/C_CollapsePanel/composables/useCollapsePanel.ts","../src/components/C_CollapsePanel/index.vue","../src/components/C_CollapsePanel/index.vue","../src/components/C_CollapsePanel/index.vue"],"sourcesContent":["import { ref, computed, watch } from 'vue'\r\nimport type { Ref } from 'vue'\r\nimport type { CollapsePanelItem } from '../types'\r\n\r\ninterface UseCollapsePanelOptions {\r\n /** 面板项配置 */\r\n items: Ref<CollapsePanelItem[]>\r\n /** 外部 v-model activeKeys */\r\n activeKeys: Ref<string[] | undefined>\r\n /** 非受控时的默认激活 key */\r\n defaultActiveKeys: string[]\r\n /** 是否手风琴模式 */\r\n accordion: Ref<boolean>\r\n /** localStorage 持久化 key */\r\n persistKey: Ref<string | undefined>\r\n /** activeKeys 变化回调 */\r\n onChange?: (keys: string[]) => void\r\n /** 单面板展开回调 */\r\n onExpand?: (key: string) => void\r\n /** 单面板折叠回调 */\r\n onCollapse?: (key: string) => void\r\n}\r\n\r\n/**\r\n * 折叠面板展开/折叠核心逻辑\r\n */\r\nexport function useCollapsePanel(options: UseCollapsePanelOptions) {\r\n const {\r\n items,\r\n activeKeys: externalKeys,\r\n defaultActiveKeys,\r\n accordion,\r\n persistKey,\r\n onChange,\r\n onExpand,\r\n onCollapse,\r\n } = options\r\n\r\n /* ─── 持久化读取 ──────────────────────────────── */\r\n const loadPersistedKeys = (): string[] | null => {\r\n if (!persistKey.value) return null\r\n try {\r\n const raw = localStorage.getItem(`collapse-panel:${persistKey.value}`)\r\n return raw ? JSON.parse(raw) : null\r\n } catch {\r\n return null\r\n }\r\n }\r\n\r\n const savePersistedKeys = (keys: string[]) => {\r\n if (!persistKey.value) return\r\n try {\r\n localStorage.setItem(\r\n `collapse-panel:${persistKey.value}`,\r\n JSON.stringify(keys),\r\n )\r\n } catch {\r\n /* 静默失败 */\r\n }\r\n }\r\n\r\n /* ─── 内部状态 ────────────────────────────────── */\r\n const resolveInitialKeys = (): string[] => {\r\n /* 优先级:外部 v-model > 持久化 > 默认值 */\r\n if (externalKeys.value !== undefined) return [...externalKeys.value]\r\n const persisted = loadPersistedKeys()\r\n if (persisted) return persisted\r\n return [...defaultActiveKeys]\r\n }\r\n\r\n const internalKeys = ref<string[]>(resolveInitialKeys())\r\n\r\n /** 懒渲染追踪:记录哪些面板曾被展开过 */\r\n const renderedOnce = ref<Set<string>>(new Set(internalKeys.value))\r\n\r\n /* ─── 计算属性 ────────────────────────────────── */\r\n /** 当前激活的 key 数组(兼容受控 / 非受控) */\r\n const currentKeys = computed<string[]>({\r\n get: () =>\r\n externalKeys.value !== undefined\r\n ? externalKeys.value\r\n : internalKeys.value,\r\n set: (val) => {\r\n internalKeys.value = val\r\n },\r\n })\r\n\r\n /**\r\n * 判断面板是否展开\r\n */\r\n const isExpanded = (key: string): boolean => {\r\n return currentKeys.value.includes(key)\r\n }\r\n\r\n /**\r\n * 判断面板是否应该渲染内容\r\n * - lazy 面板只有被展开过至少一次后才渲染\r\n * - destroyOnCollapse 面板在折叠后销毁 DOM\r\n */\r\n const shouldRender = (item: CollapsePanelItem): boolean => {\r\n const expanded = isExpanded(item.key)\r\n\r\n if (item.destroyOnCollapse) return expanded\r\n if (item.lazy) return renderedOnce.value.has(item.key)\r\n return true\r\n }\r\n\r\n /* ─── 操作方法 ────────────────────────────────── */\r\n const updateKeys = (newKeys: string[]) => {\r\n currentKeys.value = newKeys\r\n onChange?.(newKeys)\r\n savePersistedKeys(newKeys)\r\n }\r\n\r\n const toggle = (key: string) => {\r\n const item = items.value.find((i) => i.key === key)\r\n if (!item || item.disabled) return\r\n\r\n const expanded = isExpanded(key)\r\n\r\n if (expanded) {\r\n /* 折叠 */\r\n updateKeys(currentKeys.value.filter((k) => k !== key))\r\n onCollapse?.(key)\r\n } else {\r\n /* 展开 */\r\n renderedOnce.value.add(key)\r\n\r\n if (accordion.value) {\r\n /* 手风琴模式:关闭其他面板 */\r\n const prevKeys = currentKeys.value\r\n updateKeys([key])\r\n /* 通知被折叠的面板 */\r\n prevKeys.forEach((k) => {\r\n if (k !== key) onCollapse?.(k)\r\n })\r\n } else {\r\n updateKeys([...currentKeys.value, key])\r\n }\r\n onExpand?.(key)\r\n }\r\n }\r\n\r\n const expandAll = () => {\r\n if (accordion.value) return /* 手风琴模式不支持全展开 */\r\n\r\n const allKeys = items.value.filter((i) => !i.disabled).map((i) => i.key)\r\n\r\n allKeys.forEach((k) => renderedOnce.value.add(k))\r\n updateKeys(allKeys)\r\n }\r\n\r\n const collapseAll = () => {\r\n updateKeys([])\r\n }\r\n\r\n const getActiveKeys = (): string[] => {\r\n return [...currentKeys.value]\r\n }\r\n\r\n /* ─── 键盘导航 ────────────────────────────────── */\r\n const handleKeyDown = (e: KeyboardEvent, key: string) => {\r\n if (['Enter', ' '].includes(e.key)) {\r\n e.preventDefault()\r\n toggle(key)\r\n }\r\n }\r\n\r\n /* ─── 同步外部 v-model 变化 ───────────────────── */\r\n watch(\r\n () => externalKeys.value,\r\n (newVal) => {\r\n if (newVal !== undefined) {\r\n internalKeys.value = [...newVal]\r\n newVal.forEach((k) => renderedOnce.value.add(k))\r\n savePersistedKeys(newVal)\r\n }\r\n },\r\n )\r\n\r\n return {\r\n currentKeys,\r\n renderedOnce,\r\n isExpanded,\r\n shouldRender,\r\n toggle,\r\n expandAll,\r\n collapseAll,\r\n getActiveKeys,\r\n handleKeyDown,\r\n }\r\n}\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2026-02-25\r\n * @Description: 折叠面板组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n ref=\"containerRef\"\r\n class=\"c-collapse-panel\"\r\n :class=\"[\r\n `c-collapse-panel--${variant}`,\r\n {\r\n 'c-collapse-panel--bordered': bordered,\r\n 'c-collapse-panel--icon-right': expandIconPosition === 'right',\r\n },\r\n ]\"\r\n >\r\n <div\r\n v-for=\"item in items\"\r\n :key=\"item.key\"\r\n :ref=\"(el) => setPanelRef(item.key, el as HTMLElement)\"\r\n class=\"collapse-item\"\r\n :class=\"{\r\n 'collapse-item--active': isExpanded(item.key),\r\n 'collapse-item--disabled': item.disabled,\r\n }\"\r\n >\r\n <!-- 面板头部 -->\r\n <div\r\n class=\"collapse-item__header\"\r\n role=\"button\"\r\n :aria-expanded=\"isExpanded(item.key)\"\r\n :aria-controls=\"`collapse-content-${item.key}`\"\r\n :aria-disabled=\"item.disabled\"\r\n :tabindex=\"item.disabled ? -1 : 0\"\r\n @click=\"!item.disabled && toggle(item.key)\"\r\n @keydown=\"handleKeyDown($event, item.key)\"\r\n >\r\n <!-- 展开图标 -->\r\n <span\r\n class=\"collapse-item__arrow\"\r\n :class=\"{ 'collapse-item__arrow--expanded': isExpanded(item.key) }\"\r\n >\r\n <C_Icon name=\"mdi:chevron-right\" :size=\"16\" color=\"currentColor\" />\r\n </span>\r\n\r\n <!-- 标题区域 -->\r\n <div class=\"collapse-item__title-area\">\r\n <slot\r\n :name=\"`header-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n >\r\n <div class=\"collapse-item__title-group\">\r\n <C_Icon\r\n v-if=\"item.icon\"\r\n :name=\"item.icon\"\r\n :size=\"18\"\r\n color=\"currentColor\"\r\n class=\"collapse-item__icon\"\r\n />\r\n <span class=\"collapse-item__title\">{{ item.title }}</span>\r\n <span v-if=\"item.subtitle\" class=\"collapse-item__subtitle\">\r\n {{ item.subtitle }}\r\n </span>\r\n </div>\r\n </slot>\r\n </div>\r\n\r\n <!-- 头部右侧操作区 -->\r\n <div\r\n v-if=\"$slots[`extra-${item.key}`]\"\r\n class=\"collapse-item__extra\"\r\n @click.stop\r\n >\r\n <slot\r\n :name=\"`extra-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- 面板内容 -->\r\n <Transition\r\n name=\"collapse-slide\"\r\n @enter=\"onEnter\"\r\n @after-enter=\"onAfterEnter\"\r\n @leave=\"onLeave\"\r\n @after-leave=\"onAfterLeave\"\r\n >\r\n <div\r\n v-show=\"isExpanded(item.key)\"\r\n :id=\"`collapse-content-${item.key}`\"\r\n class=\"collapse-item__content-wrapper\"\r\n role=\"region\"\r\n :aria-labelledby=\"`collapse-header-${item.key}`\"\r\n >\r\n <div v-if=\"shouldRender(item)\" class=\"collapse-item__content\">\r\n <slot\r\n :name=\"`panel-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n />\r\n </div>\r\n </div>\r\n </Transition>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, toRef } from \"vue\";\r\nimport C_Icon from \"../C_Icon/index.vue\";\r\nimport { useCollapsePanel } from \"./composables/useCollapsePanel\";\r\nimport type {\r\n CollapsePanelExpose,\r\n CollapsePanelItem,\r\n CollapsePanelVariant,\r\n ExpandIconPosition,\r\n} from \"./types\";\r\n\r\ndefineOptions({ name: \"C_CollapsePanel\" });\r\n\r\ninterface Props {\r\n /** 面板项配置数组 */\r\n items: CollapsePanelItem[];\r\n /** 当前激活面板的 key 数组(v-model) */\r\n activeKeys?: string[];\r\n /** 默认展开的面板 key 数组 */\r\n defaultActiveKeys?: string[];\r\n /** 是否手风琴模式 */\r\n accordion?: boolean;\r\n /** 面板样式变体 */\r\n variant?: CollapsePanelVariant;\r\n /** 展开图标位置 */\r\n expandIconPosition?: ExpandIconPosition;\r\n /** 是否显示边框 */\r\n bordered?: boolean;\r\n /** 展开状态 localStorage 持久化 key */\r\n persistKey?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n activeKeys: undefined,\r\n defaultActiveKeys: () => [],\r\n accordion: false,\r\n variant: \"default\",\r\n expandIconPosition: \"left\",\r\n bordered: true,\r\n persistKey: undefined,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n \"update:activeKeys\": [keys: string[]];\r\n expand: [key: string];\r\n collapse: [key: string];\r\n change: [activeKeys: string[]];\r\n}>();\r\n\r\nconst containerRef = ref<HTMLElement | null>(null);\r\nconst panelRefs = ref<Map<string, HTMLElement>>(new Map());\r\n\r\nconst setPanelRef = (key: string, el: HTMLElement | null) => {\r\n if (el) {\r\n panelRefs.value.set(key, el);\r\n } else {\r\n panelRefs.value.delete(key);\r\n }\r\n};\r\n\r\nconst {\r\n isExpanded,\r\n shouldRender,\r\n toggle,\r\n expandAll,\r\n collapseAll,\r\n getActiveKeys,\r\n handleKeyDown,\r\n} = useCollapsePanel({\r\n items: toRef(props, \"items\"),\r\n activeKeys: toRef(props, \"activeKeys\"),\r\n defaultActiveKeys: props.defaultActiveKeys,\r\n accordion: toRef(props, \"accordion\"),\r\n persistKey: toRef(props, \"persistKey\"),\r\n onChange: (keys) => {\r\n emit(\"update:activeKeys\", keys);\r\n emit(\"change\", keys);\r\n },\r\n onExpand: (key) => emit(\"expand\", key),\r\n onCollapse: (key) => emit(\"collapse\", key),\r\n});\r\n\r\n/* ─── 展开/折叠动画 ──────────────────────────── */\r\nconst onEnter = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = \"0\";\r\n element.style.overflow = \"hidden\";\r\n /* 强制 reflow */\r\n void element.offsetHeight;\r\n element.style.height = `${element.scrollHeight}px`;\r\n};\r\n\r\nconst onAfterEnter = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = \"\";\r\n element.style.overflow = \"\";\r\n};\r\n\r\nconst onLeave = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = `${element.scrollHeight}px`;\r\n element.style.overflow = \"hidden\";\r\n void element.offsetHeight;\r\n element.style.height = \"0\";\r\n};\r\n\r\nconst onAfterLeave = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = \"\";\r\n element.style.overflow = \"\";\r\n};\r\n\r\n/* ─── 滚动到指定面板 ─────────────────────────── */\r\nconst scrollToPanel = (key: string) => {\r\n const el = panelRefs.value.get(key);\r\n if (el) {\r\n el.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\r\n }\r\n};\r\n\r\n/* ─── 暴露方法 ──────────────────────────────── */\r\ndefineExpose<CollapsePanelExpose>({\r\n expandAll,\r\n collapseAll,\r\n toggle,\r\n getActiveKeys,\r\n scrollToPanel,\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2026-02-25\r\n * @Description: 折叠面板组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n ref=\"containerRef\"\r\n class=\"c-collapse-panel\"\r\n :class=\"[\r\n `c-collapse-panel--${variant}`,\r\n {\r\n 'c-collapse-panel--bordered': bordered,\r\n 'c-collapse-panel--icon-right': expandIconPosition === 'right',\r\n },\r\n ]\"\r\n >\r\n <div\r\n v-for=\"item in items\"\r\n :key=\"item.key\"\r\n :ref=\"(el) => setPanelRef(item.key, el as HTMLElement)\"\r\n class=\"collapse-item\"\r\n :class=\"{\r\n 'collapse-item--active': isExpanded(item.key),\r\n 'collapse-item--disabled': item.disabled,\r\n }\"\r\n >\r\n <!-- 面板头部 -->\r\n <div\r\n class=\"collapse-item__header\"\r\n role=\"button\"\r\n :aria-expanded=\"isExpanded(item.key)\"\r\n :aria-controls=\"`collapse-content-${item.key}`\"\r\n :aria-disabled=\"item.disabled\"\r\n :tabindex=\"item.disabled ? -1 : 0\"\r\n @click=\"!item.disabled && toggle(item.key)\"\r\n @keydown=\"handleKeyDown($event, item.key)\"\r\n >\r\n <!-- 展开图标 -->\r\n <span\r\n class=\"collapse-item__arrow\"\r\n :class=\"{ 'collapse-item__arrow--expanded': isExpanded(item.key) }\"\r\n >\r\n <C_Icon name=\"mdi:chevron-right\" :size=\"16\" color=\"currentColor\" />\r\n </span>\r\n\r\n <!-- 标题区域 -->\r\n <div class=\"collapse-item__title-area\">\r\n <slot\r\n :name=\"`header-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n >\r\n <div class=\"collapse-item__title-group\">\r\n <C_Icon\r\n v-if=\"item.icon\"\r\n :name=\"item.icon\"\r\n :size=\"18\"\r\n color=\"currentColor\"\r\n class=\"collapse-item__icon\"\r\n />\r\n <span class=\"collapse-item__title\">{{ item.title }}</span>\r\n <span v-if=\"item.subtitle\" class=\"collapse-item__subtitle\">\r\n {{ item.subtitle }}\r\n </span>\r\n </div>\r\n </slot>\r\n </div>\r\n\r\n <!-- 头部右侧操作区 -->\r\n <div\r\n v-if=\"$slots[`extra-${item.key}`]\"\r\n class=\"collapse-item__extra\"\r\n @click.stop\r\n >\r\n <slot\r\n :name=\"`extra-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- 面板内容 -->\r\n <Transition\r\n name=\"collapse-slide\"\r\n @enter=\"onEnter\"\r\n @after-enter=\"onAfterEnter\"\r\n @leave=\"onLeave\"\r\n @after-leave=\"onAfterLeave\"\r\n >\r\n <div\r\n v-show=\"isExpanded(item.key)\"\r\n :id=\"`collapse-content-${item.key}`\"\r\n class=\"collapse-item__content-wrapper\"\r\n role=\"region\"\r\n :aria-labelledby=\"`collapse-header-${item.key}`\"\r\n >\r\n <div v-if=\"shouldRender(item)\" class=\"collapse-item__content\">\r\n <slot\r\n :name=\"`panel-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n />\r\n </div>\r\n </div>\r\n </Transition>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, toRef } from \"vue\";\r\nimport C_Icon from \"../C_Icon/index.vue\";\r\nimport { useCollapsePanel } from \"./composables/useCollapsePanel\";\r\nimport type {\r\n CollapsePanelExpose,\r\n CollapsePanelItem,\r\n CollapsePanelVariant,\r\n ExpandIconPosition,\r\n} from \"./types\";\r\n\r\ndefineOptions({ name: \"C_CollapsePanel\" });\r\n\r\ninterface Props {\r\n /** 面板项配置数组 */\r\n items: CollapsePanelItem[];\r\n /** 当前激活面板的 key 数组(v-model) */\r\n activeKeys?: string[];\r\n /** 默认展开的面板 key 数组 */\r\n defaultActiveKeys?: string[];\r\n /** 是否手风琴模式 */\r\n accordion?: boolean;\r\n /** 面板样式变体 */\r\n variant?: CollapsePanelVariant;\r\n /** 展开图标位置 */\r\n expandIconPosition?: ExpandIconPosition;\r\n /** 是否显示边框 */\r\n bordered?: boolean;\r\n /** 展开状态 localStorage 持久化 key */\r\n persistKey?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n activeKeys: undefined,\r\n defaultActiveKeys: () => [],\r\n accordion: false,\r\n variant: \"default\",\r\n expandIconPosition: \"left\",\r\n bordered: true,\r\n persistKey: undefined,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n \"update:activeKeys\": [keys: string[]];\r\n expand: [key: string];\r\n collapse: [key: string];\r\n change: [activeKeys: string[]];\r\n}>();\r\n\r\nconst containerRef = ref<HTMLElement | null>(null);\r\nconst panelRefs = ref<Map<string, HTMLElement>>(new Map());\r\n\r\nconst setPanelRef = (key: string, el: HTMLElement | null) => {\r\n if (el) {\r\n panelRefs.value.set(key, el);\r\n } else {\r\n panelRefs.value.delete(key);\r\n }\r\n};\r\n\r\nconst {\r\n isExpanded,\r\n shouldRender,\r\n toggle,\r\n expandAll,\r\n collapseAll,\r\n getActiveKeys,\r\n handleKeyDown,\r\n} = useCollapsePanel({\r\n items: toRef(props, \"items\"),\r\n activeKeys: toRef(props, \"activeKeys\"),\r\n defaultActiveKeys: props.defaultActiveKeys,\r\n accordion: toRef(props, \"accordion\"),\r\n persistKey: toRef(props, \"persistKey\"),\r\n onChange: (keys) => {\r\n emit(\"update:activeKeys\", keys);\r\n emit(\"change\", keys);\r\n },\r\n onExpand: (key) => emit(\"expand\", key),\r\n onCollapse: (key) => emit(\"collapse\", key),\r\n});\r\n\r\n/* ─── 展开/折叠动画 ──────────────────────────── */\r\nconst onEnter = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = \"0\";\r\n element.style.overflow = \"hidden\";\r\n /* 强制 reflow */\r\n void element.offsetHeight;\r\n element.style.height = `${element.scrollHeight}px`;\r\n};\r\n\r\nconst onAfterEnter = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = \"\";\r\n element.style.overflow = \"\";\r\n};\r\n\r\nconst onLeave = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = `${element.scrollHeight}px`;\r\n element.style.overflow = \"hidden\";\r\n void element.offsetHeight;\r\n element.style.height = \"0\";\r\n};\r\n\r\nconst onAfterLeave = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = \"\";\r\n element.style.overflow = \"\";\r\n};\r\n\r\n/* ─── 滚动到指定面板 ─────────────────────────── */\r\nconst scrollToPanel = (key: string) => {\r\n const el = panelRefs.value.get(key);\r\n if (el) {\r\n el.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\r\n }\r\n};\r\n\r\n/* ─── 暴露方法 ──────────────────────────────── */\r\ndefineExpose<CollapsePanelExpose>({\r\n expandAll,\r\n collapseAll,\r\n toggle,\r\n getActiveKeys,\r\n scrollToPanel,\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2026-02-25\r\n * @Description: 折叠面板组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n ref=\"containerRef\"\r\n class=\"c-collapse-panel\"\r\n :class=\"[\r\n `c-collapse-panel--${variant}`,\r\n {\r\n 'c-collapse-panel--bordered': bordered,\r\n 'c-collapse-panel--icon-right': expandIconPosition === 'right',\r\n },\r\n ]\"\r\n >\r\n <div\r\n v-for=\"item in items\"\r\n :key=\"item.key\"\r\n :ref=\"(el) => setPanelRef(item.key, el as HTMLElement)\"\r\n class=\"collapse-item\"\r\n :class=\"{\r\n 'collapse-item--active': isExpanded(item.key),\r\n 'collapse-item--disabled': item.disabled,\r\n }\"\r\n >\r\n <!-- 面板头部 -->\r\n <div\r\n class=\"collapse-item__header\"\r\n role=\"button\"\r\n :aria-expanded=\"isExpanded(item.key)\"\r\n :aria-controls=\"`collapse-content-${item.key}`\"\r\n :aria-disabled=\"item.disabled\"\r\n :tabindex=\"item.disabled ? -1 : 0\"\r\n @click=\"!item.disabled && toggle(item.key)\"\r\n @keydown=\"handleKeyDown($event, item.key)\"\r\n >\r\n <!-- 展开图标 -->\r\n <span\r\n class=\"collapse-item__arrow\"\r\n :class=\"{ 'collapse-item__arrow--expanded': isExpanded(item.key) }\"\r\n >\r\n <C_Icon name=\"mdi:chevron-right\" :size=\"16\" color=\"currentColor\" />\r\n </span>\r\n\r\n <!-- 标题区域 -->\r\n <div class=\"collapse-item__title-area\">\r\n <slot\r\n :name=\"`header-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n >\r\n <div class=\"collapse-item__title-group\">\r\n <C_Icon\r\n v-if=\"item.icon\"\r\n :name=\"item.icon\"\r\n :size=\"18\"\r\n color=\"currentColor\"\r\n class=\"collapse-item__icon\"\r\n />\r\n <span class=\"collapse-item__title\">{{ item.title }}</span>\r\n <span v-if=\"item.subtitle\" class=\"collapse-item__subtitle\">\r\n {{ item.subtitle }}\r\n </span>\r\n </div>\r\n </slot>\r\n </div>\r\n\r\n <!-- 头部右侧操作区 -->\r\n <div\r\n v-if=\"$slots[`extra-${item.key}`]\"\r\n class=\"collapse-item__extra\"\r\n @click.stop\r\n >\r\n <slot\r\n :name=\"`extra-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- 面板内容 -->\r\n <Transition\r\n name=\"collapse-slide\"\r\n @enter=\"onEnter\"\r\n @after-enter=\"onAfterEnter\"\r\n @leave=\"onLeave\"\r\n @after-leave=\"onAfterLeave\"\r\n >\r\n <div\r\n v-show=\"isExpanded(item.key)\"\r\n :id=\"`collapse-content-${item.key}`\"\r\n class=\"collapse-item__content-wrapper\"\r\n role=\"region\"\r\n :aria-labelledby=\"`collapse-header-${item.key}`\"\r\n >\r\n <div v-if=\"shouldRender(item)\" class=\"collapse-item__content\">\r\n <slot\r\n :name=\"`panel-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n />\r\n </div>\r\n </div>\r\n </Transition>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, toRef } from \"vue\";\r\nimport C_Icon from \"../C_Icon/index.vue\";\r\nimport { useCollapsePanel } from \"./composables/useCollapsePanel\";\r\nimport type {\r\n CollapsePanelExpose,\r\n CollapsePanelItem,\r\n CollapsePanelVariant,\r\n ExpandIconPosition,\r\n} from \"./types\";\r\n\r\ndefineOptions({ name: \"C_CollapsePanel\" });\r\n\r\ninterface Props {\r\n /** 面板项配置数组 */\r\n items: CollapsePanelItem[];\r\n /** 当前激活面板的 key 数组(v-model) */\r\n activeKeys?: string[];\r\n /** 默认展开的面板 key 数组 */\r\n defaultActiveKeys?: string[];\r\n /** 是否手风琴模式 */\r\n accordion?: boolean;\r\n /** 面板样式变体 */\r\n variant?: CollapsePanelVariant;\r\n /** 展开图标位置 */\r\n expandIconPosition?: ExpandIconPosition;\r\n /** 是否显示边框 */\r\n bordered?: boolean;\r\n /** 展开状态 localStorage 持久化 key */\r\n persistKey?: string;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n activeKeys: undefined,\r\n defaultActiveKeys: () => [],\r\n accordion: false,\r\n variant: \"default\",\r\n expandIconPosition: \"left\",\r\n bordered: true,\r\n persistKey: undefined,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n \"update:activeKeys\": [keys: string[]];\r\n expand: [key: string];\r\n collapse: [key: string];\r\n change: [activeKeys: string[]];\r\n}>();\r\n\r\nconst containerRef = ref<HTMLElement | null>(null);\r\nconst panelRefs = ref<Map<string, HTMLElement>>(new Map());\r\n\r\nconst setPanelRef = (key: string, el: HTMLElement | null) => {\r\n if (el) {\r\n panelRefs.value.set(key, el);\r\n } else {\r\n panelRefs.value.delete(key);\r\n }\r\n};\r\n\r\nconst {\r\n isExpanded,\r\n shouldRender,\r\n toggle,\r\n expandAll,\r\n collapseAll,\r\n getActiveKeys,\r\n handleKeyDown,\r\n} = useCollapsePanel({\r\n items: toRef(props, \"items\"),\r\n activeKeys: toRef(props, \"activeKeys\"),\r\n defaultActiveKeys: props.defaultActiveKeys,\r\n accordion: toRef(props, \"accordion\"),\r\n persistKey: toRef(props, \"persistKey\"),\r\n onChange: (keys) => {\r\n emit(\"update:activeKeys\", keys);\r\n emit(\"change\", keys);\r\n },\r\n onExpand: (key) => emit(\"expand\", key),\r\n onCollapse: (key) => emit(\"collapse\", key),\r\n});\r\n\r\n/* ─── 展开/折叠动画 ──────────────────────────── */\r\nconst onEnter = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = \"0\";\r\n element.style.overflow = \"hidden\";\r\n /* 强制 reflow */\r\n void element.offsetHeight;\r\n element.style.height = `${element.scrollHeight}px`;\r\n};\r\n\r\nconst onAfterEnter = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = \"\";\r\n element.style.overflow = \"\";\r\n};\r\n\r\nconst onLeave = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = `${element.scrollHeight}px`;\r\n element.style.overflow = \"hidden\";\r\n void element.offsetHeight;\r\n element.style.height = \"0\";\r\n};\r\n\r\nconst onAfterLeave = (el: Element) => {\r\n const element = el as HTMLElement;\r\n element.style.height = \"\";\r\n element.style.overflow = \"\";\r\n};\r\n\r\n/* ─── 滚动到指定面板 ─────────────────────────── */\r\nconst scrollToPanel = (key: string) => {\r\n const el = panelRefs.value.get(key);\r\n if (el) {\r\n el.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\r\n }\r\n};\r\n\r\n/* ─── 暴露方法 ──────────────────────────────── */\r\ndefineExpose<CollapsePanelExpose>({\r\n expandAll,\r\n collapseAll,\r\n toggle,\r\n getActiveKeys,\r\n scrollToPanel,\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"C_Cron-yx2Ob4Jl.css","names":[],"sources":["../src/components/C_Cron/components/CronFieldEditor.vue?vue&type=style&index=0&scoped=e6fa8e5b&lang.scss","../src/components/C_Cron/components/CronPreview.vue?vue&type=style&index=0&scoped=a695bb32&lang.scss","../src/components/C_Cron/components/CronTemplates.vue?vue&type=style&index=0&scoped=fe320f38&lang.scss","../src/components/C_Cron/index.vue?vue&type=style&index=0&scoped=43228b05&lang.scss"],"sourcesContent":[".cron-field-editor__grid[data-v-e6fa8e5b] {\n display: grid;\n grid-template-columns: repeat(var(--cols, 10), 1fr);\n gap: 4px;\n}\n.cron-field-editor__cell[data-v-e6fa8e5b] {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 34px;\n border-radius: 6px;\n font-size: 13px;\n font-variant-numeric: tabular-nums;\n transition: all var(--c-transition, 0.2s ease);\n user-select: none;\n color: var(--c-text-2);\n /* 非交互高亮(every / range / step 的视觉反馈) */\n /* 可交互模式(specific) */\n}\n.cron-field-editor__cell--on[data-v-e6fa8e5b]:not(.cron-field-editor__cell--pick) {\n background: color-mix(in srgb, var(--c-primary) 12%, transparent);\n color: var(--c-primary);\n}\n.cron-field-editor__cell--pick[data-v-e6fa8e5b] {\n cursor: pointer;\n}\n.cron-field-editor__cell--pick[data-v-e6fa8e5b]:hover:not(.cron-field-editor__cell--on) {\n background: var(--c-bg-card);\n}\n.cron-field-editor__cell--pick.cron-field-editor__cell--on[data-v-e6fa8e5b] {\n background: var(--c-primary);\n color: #fff;\n font-weight: 600;\n}",".cron-preview__header[data-v-a695bb32] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 600;\n font-size: 13px;\n margin-bottom: 6px;\n color: var(--c-text-1);\n}\n.cron-preview__list[data-v-a695bb32] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n.cron-preview__item[data-v-a695bb32] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 3px 4px;\n border-radius: 4px;\n font-size: 12px;\n transition: background var(--c-transition, 0.2s ease);\n}\n.cron-preview__item[data-v-a695bb32]:hover {\n background: var(--c-bg-card);\n}\n.cron-preview__idx[data-v-a695bb32] {\n width: 16px;\n text-align: center;\n color: var(--c-text-4);\n flex-shrink: 0;\n font-size: 11px;\n}\n.cron-preview__date[data-v-a695bb32] {\n font-family: \"Courier New\", Courier, monospace;\n flex: 1;\n font-size: 12px;\n}\n.cron-preview__week[data-v-a695bb32] {\n color: var(--c-text-4);\n font-size: 12px;\n flex-shrink: 0;\n}",".cron-templates__header[data-v-fe320f38] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 600;\n font-size: 13px;\n margin-bottom: 10px;\n color: var(--c-text-1);\n}\n.cron-templates__cards[data-v-fe320f38] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));\n gap: 8px;\n}\n.cron-templates__card[data-v-fe320f38] {\n padding: 10px 12px;\n border-radius: 8px;\n border: 1px solid var(--c-border);\n cursor: pointer;\n transition: all var(--c-transition, 0.2s ease);\n}\n.cron-templates__card[data-v-fe320f38]:hover {\n border-color: var(--c-primary);\n background: color-mix(in srgb, var(--c-primary) 4%, transparent);\n}\n.cron-templates__card--active[data-v-fe320f38] {\n border-color: var(--c-primary);\n background: color-mix(in srgb, var(--c-primary) 8%, transparent);\n}\n.cron-templates__card-name[data-v-fe320f38] {\n font-size: 13px;\n font-weight: 500;\n line-height: 1.4;\n}\n.cron-templates__card-expr[data-v-fe320f38] {\n font-family: \"Courier New\", Courier, monospace;\n font-size: 11px;\n color: var(--c-text-4);\n margin-top: 2px;\n}","/* Cron 表达式编辑器 - 组件级全局样式 */\n.c-cron[data-v-43228b05] {\n padding: 20px;\n border-radius: 10px;\n border: 1px solid var(--c-border);\n background: var(--c-bg-card);\n /* ═══════ 顶部 ═══════ */\n /* ─── 分段式字段选择器 ──────────────────── */\n /* ─── 表达式行 ─────────────────────────── */\n /* ═══════ 主内容 ═══════ */\n /* ─── 右侧控制面板 ────────────────────── */\n /* ═══════ 底部模板 ═══════ */\n}\n.c-cron__header[data-v-43228b05] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding-bottom: 16px;\n border-bottom: 1px solid var(--c-border);\n margin-bottom: 16px;\n}\n.c-cron__title-row[data-v-43228b05] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n.c-cron__title[data-v-43228b05] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 600;\n font-size: 15px;\n}\n.c-cron__segments[data-v-43228b05] {\n display: flex;\n gap: 2px;\n padding: 3px;\n border-radius: 10px;\n background: var(--c-bg);\n}\n.c-cron__segment[data-v-43228b05] {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 8px 6px 5px;\n border-radius: 8px;\n cursor: pointer;\n transition: all var(--c-transition, 0.2s ease);\n user-select: none;\n min-width: 0;\n}\n.c-cron__segment[data-v-43228b05]:not(.c-cron__segment--active):hover {\n background: color-mix(in srgb, var(--c-bg-card) 60%, transparent);\n}\n.c-cron__segment--active[data-v-43228b05] {\n background: var(--c-bg-card);\n box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08);\n}\n.c-cron__segment--active .c-cron__segment-value[data-v-43228b05] {\n color: var(--c-primary);\n}\n.c-cron__segment--wildcard:not(.c-cron__segment--active) .c-cron__segment-value[data-v-43228b05] {\n opacity: 0.35;\n}\n.c-cron__segment-value[data-v-43228b05] {\n font-family: \"Courier New\", Courier, monospace;\n font-size: 15px;\n font-weight: 700;\n line-height: 1.3;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-align: center;\n}\n.c-cron__segment-label[data-v-43228b05] {\n font-size: 11px;\n color: var(--c-text-4);\n margin-top: 2px;\n}\n.c-cron__expr-row[data-v-43228b05] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.c-cron__expr-input[data-v-43228b05] {\n width: 240px;\n flex-shrink: 0;\n}\n.c-cron__expr-desc[data-v-43228b05] {\n flex: 1;\n font-size: 13px;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.c-cron__description[data-v-43228b05] {\n color: var(--c-text-2);\n}\n.c-cron__error[data-v-43228b05] {\n color: var(--error-color);\n}\n.c-cron__body[data-v-43228b05] {\n display: flex;\n gap: 24px;\n}\n.c-cron__main[data-v-43228b05] {\n flex: 1;\n min-width: 0;\n}\n.c-cron__panel[data-v-43228b05] {\n width: 260px;\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n.c-cron__config[data-v-43228b05] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.c-cron__config-row[data-v-43228b05] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n color: var(--c-text-2);\n flex-wrap: wrap;\n}\n.c-cron__config-num[data-v-43228b05] {\n width: 68px;\n}\n.c-cron__quick[data-v-43228b05] {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 13px;\n}\n.c-cron__quick a[data-v-43228b05] {\n color: var(--c-primary);\n cursor: pointer;\n user-select: none;\n}\n.c-cron__quick a[data-v-43228b05]:hover {\n text-decoration: underline;\n}\n.c-cron__quick-sep[data-v-43228b05] {\n color: var(--c-text-4);\n}\n.c-cron__quick-count[data-v-43228b05] {\n margin-left: 4px;\n font-size: 12px;\n color: var(--c-text-4);\n}\n.c-cron__panel-line[data-v-43228b05] {\n height: 1px;\n background: var(--c-border);\n}\n.c-cron__footer[data-v-43228b05] {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid var(--c-border);\n}\n\n/* ─── 响应式 ────────────────────────────────── */\n@media (max-width: 768px) {\n.c-cron__body[data-v-43228b05] {\n flex-direction: column;\n}\n.c-cron__panel[data-v-43228b05] {\n width: 100%;\n}\n.c-cron__segments[data-v-43228b05] {\n flex-wrap: wrap;\n}\n.c-cron__segment[data-v-43228b05] {\n min-width: calc(33% - 4px);\n}\n.c-cron__expr-row[data-v-43228b05] {\n flex-wrap: wrap;\n}\n.c-cron__expr-input[data-v-43228b05] {\n width: 100%;\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;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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"}
@@ -0,0 +1,15 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ require('./C_Icon.js');
3
+ const require_C_Cron = require('./C_Cron.js');
4
+
5
+ exports.CRON_FIELD_META = require_C_Cron.CRON_FIELD_META;
6
+ exports.CRON_TEMPLATES = require_C_Cron.CRON_TEMPLATES;
7
+ exports.C_Cron = require_C_Cron.C_Cron_default;
8
+ exports.DEFAULT_CRON_EXPRESSION = require_C_Cron.DEFAULT_CRON_EXPRESSION;
9
+ exports.DEFAULT_CRON_VALUE = require_C_Cron.DEFAULT_CRON_VALUE;
10
+ exports.DEFAULT_FIELD_VALUE = require_C_Cron.DEFAULT_FIELD_VALUE;
11
+ exports.MONTH_LABELS = require_C_Cron.MONTH_LABELS;
12
+ exports.WEEK_LABELS = require_C_Cron.WEEK_LABELS;
13
+ exports.useCronDescription = require_C_Cron.useCronDescription;
14
+ exports.useCronParser = require_C_Cron.useCronParser;
15
+ exports.useCronPreview = require_C_Cron.useCronPreview;
@@ -0,0 +1,2 @@
1
+ import { _ as CronFieldValue, a as DEFAULT_FIELD_VALUE, b as CronValidation, c as useCronDescription, d as _default, f as CronEmits, g as CronFieldType, h as CronFieldMode, i as DEFAULT_CRON_VALUE, l as useCronPreview, m as CronFieldMeta, n as CRON_TEMPLATES, o as MONTH_LABELS, p as CronExpose, r as DEFAULT_CRON_EXPRESSION, s as WEEK_LABELS, t as CRON_FIELD_META, u as useCronParser, v as CronProps, x as CronValue, y as CronTemplate } from "./constants.js";
2
+ export { CRON_FIELD_META, CRON_TEMPLATES, _default as C_Cron, type CronEmits, type CronExpose, type CronFieldMeta, type CronFieldMode, type CronFieldType, type CronFieldValue, type CronProps, type CronTemplate, type CronValidation, type CronValue, DEFAULT_CRON_EXPRESSION, DEFAULT_CRON_VALUE, DEFAULT_FIELD_VALUE, MONTH_LABELS, WEEK_LABELS, useCronDescription, useCronParser, useCronPreview };
@@ -0,0 +1,2 @@
1
+ import { _ as CronFieldValue, a as DEFAULT_FIELD_VALUE, b as CronValidation, c as useCronDescription, d as _default, f as CronEmits, g as CronFieldType, h as CronFieldMode, i as DEFAULT_CRON_VALUE, l as useCronPreview, m as CronFieldMeta, n as CRON_TEMPLATES, o as MONTH_LABELS, p as CronExpose, r as DEFAULT_CRON_EXPRESSION, s as WEEK_LABELS, t as CRON_FIELD_META, u as useCronParser, v as CronProps, x as CronValue, y as CronTemplate } from "./constants.js";
2
+ export { CRON_FIELD_META, CRON_TEMPLATES, _default as C_Cron, type CronEmits, type CronExpose, type CronFieldMeta, type CronFieldMode, type CronFieldType, type CronFieldValue, type CronProps, type CronTemplate, type CronValidation, type CronValue, DEFAULT_CRON_EXPRESSION, DEFAULT_CRON_VALUE, DEFAULT_FIELD_VALUE, MONTH_LABELS, WEEK_LABELS, useCronDescription, useCronParser, useCronPreview };
package/dist/C_Cron.js ADDED
@@ -0,0 +1,4 @@
1
+ import "./C_Icon2.js";
2
+ import { a as CRON_FIELD_META, c as DEFAULT_CRON_VALUE, d as WEEK_LABELS, i as useCronParser, l as DEFAULT_FIELD_VALUE, n as useCronDescription, o as CRON_TEMPLATES, r as useCronPreview, s as DEFAULT_CRON_EXPRESSION, t as C_Cron_default, u as MONTH_LABELS } from "./C_Cron2.js";
3
+
4
+ export { CRON_FIELD_META, CRON_TEMPLATES, C_Cron_default as C_Cron, DEFAULT_CRON_EXPRESSION, DEFAULT_CRON_VALUE, DEFAULT_FIELD_VALUE, MONTH_LABELS, WEEK_LABELS, useCronDescription, useCronParser, useCronPreview };