@robot-admin/naive-ui-components 0.6.28 → 0.6.30

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 (142) hide show
  1. package/dist/C_Chat-CJ8KESTM.css.map +1 -0
  2. package/dist/C_Chat-DzV4AFLd.css.map +1 -0
  3. package/dist/C_Chat.css +14 -8
  4. package/dist/{C_CollapsePanel-CWkFCqNQ.css.map → C_CollapsePanel-BkOivqn3.css.map} +1 -1
  5. package/dist/{C_CollapsePanel-pcVJA_4z.css.map → C_CollapsePanel-CedsEM0N.css.map} +1 -1
  6. package/dist/C_CollapsePanel.css +35 -35
  7. package/dist/C_CollapsePanel.js.map +1 -1
  8. package/dist/C_CollapsePanel2.js +1 -1
  9. package/dist/C_CollapsePanel2.js.map +1 -1
  10. package/dist/C_Editor-C49qURgb.css.map +1 -0
  11. package/dist/C_Editor-DuxBD9Qg.css.map +1 -0
  12. package/dist/C_Editor.css +60 -29
  13. package/dist/C_Editor.js.map +1 -1
  14. package/dist/C_Editor2.js +1 -1
  15. package/dist/C_Editor2.js.map +1 -1
  16. package/dist/C_Guide.d.cts +2 -2
  17. package/dist/C_Guide.d.ts +2 -2
  18. package/dist/C_Guide.js.map +1 -1
  19. package/dist/C_Guide2.js +1 -1
  20. package/dist/C_Guide2.js.map +1 -1
  21. package/dist/C_Markdown-7J0uPEuk.css.map +1 -0
  22. package/dist/C_Markdown-C7Lg0_9z.css.map +1 -0
  23. package/dist/C_Markdown.css +16 -10
  24. package/dist/C_OrgChart-ChZu346B.css.map +1 -0
  25. package/dist/C_OrgChart-DqBufOv5.css.map +1 -0
  26. package/dist/C_OrgChart.cjs +1 -0
  27. package/dist/C_OrgChart.css +282 -0
  28. package/dist/C_OrgChart.d.cts +2 -0
  29. package/dist/C_OrgChart.d.ts +2 -0
  30. package/dist/C_OrgChart.js +1 -0
  31. package/dist/C_OrgChart.js.map +1 -0
  32. package/dist/C_OrgChart2.js +2 -0
  33. package/dist/C_OrgChart2.js.map +1 -0
  34. package/dist/C_Progress.d.cts +1 -1
  35. package/dist/C_Progress.d.ts +1 -1
  36. package/dist/C_Signature.js.map +1 -1
  37. package/dist/C_Signature2.js.map +1 -1
  38. package/dist/C_Skeleton-BNPbaut7.css.map +1 -0
  39. package/dist/C_Skeleton-Djsjw8XY.css.map +1 -0
  40. package/dist/C_Skeleton.cjs +1 -0
  41. package/dist/C_Skeleton.css +253 -0
  42. package/dist/C_Skeleton.d.cts +2 -0
  43. package/dist/C_Skeleton.d.ts +2 -0
  44. package/dist/C_Skeleton.js +1 -0
  45. package/dist/C_Skeleton.js.map +1 -0
  46. package/dist/C_Skeleton2.js +2 -0
  47. package/dist/C_Skeleton2.js.map +1 -0
  48. package/dist/C_Steps.d.cts +1 -1
  49. package/dist/C_Steps.d.ts +1 -1
  50. package/dist/C_Table-B8hpzOcR.css.map +1 -0
  51. package/dist/C_Table-CGP3n_u0.css.map +1 -0
  52. package/dist/C_Table.css +94 -69
  53. package/dist/C_Table.d.cts +2 -2
  54. package/dist/C_Table.d.ts +2 -2
  55. package/dist/C_Table.js.map +1 -1
  56. package/dist/C_Table2.js +1 -1
  57. package/dist/C_Table2.js.map +1 -1
  58. package/dist/C_TagsView.d.cts +1 -1
  59. package/dist/C_TagsView.d.ts +1 -1
  60. package/dist/C_Theme.d.cts +1 -1
  61. package/dist/C_Theme.d.ts +1 -1
  62. package/dist/{C_Timeline-BKkimrZx.css.map → C_Timeline-DG70WtJP.css.map} +1 -1
  63. package/dist/{C_Timeline-DTuSCX6p.css.map → C_Timeline-Dzxmmdjg.css.map} +1 -1
  64. package/dist/C_Timeline.css +45 -45
  65. package/dist/C_Timeline.d.cts +1 -1
  66. package/dist/C_Timeline.d.ts +1 -1
  67. package/dist/C_Timeline.js.map +1 -1
  68. package/dist/C_Timeline2.js +1 -1
  69. package/dist/C_Timeline2.js.map +1 -1
  70. package/dist/C_Transfer.d.cts +1 -1
  71. package/dist/C_Transfer.d.ts +1 -1
  72. package/dist/{C_Upload-S30RmC9t.css.map → C_Upload-CFAxVGVz.css.map} +1 -1
  73. package/dist/{C_Upload-i8LB_29U.css.map → C_Upload-D8_QeSV0.css.map} +1 -1
  74. package/dist/C_Upload.css +14 -9
  75. package/dist/C_Upload.js.map +1 -1
  76. package/dist/C_Upload2.js +1 -1
  77. package/dist/C_Upload2.js.map +1 -1
  78. package/dist/C_VtableGantt.d.cts +1 -1
  79. package/dist/C_VtableGantt.d.ts +1 -1
  80. package/dist/constants.d.ts +1 -1
  81. package/dist/constants2.d.ts +2 -2
  82. package/dist/constants3.d.ts +3 -3
  83. package/dist/constants4.d.ts +5 -5
  84. package/dist/constants5.d.ts +2 -2
  85. package/dist/data.d.ts +1 -1
  86. package/dist/index.cjs +1 -1
  87. package/dist/index.cjs.map +1 -1
  88. package/dist/index.d.cts +22 -20
  89. package/dist/index.d.ts +22 -20
  90. package/dist/index.js +1 -1
  91. package/dist/index.js.map +1 -1
  92. package/dist/index.vue.d.ts +1 -1
  93. package/dist/index13.vue.d.ts +3 -3
  94. package/dist/index14.vue.d.ts +85 -7
  95. package/dist/index15.vue.d.ts +6 -6
  96. package/dist/index17.vue.d.ts +1 -1
  97. package/dist/index18.vue.d.ts +4 -4
  98. package/dist/index20.vue.d.ts +87 -40
  99. package/dist/index21.vue.d.ts +47 -27
  100. package/dist/index22.vue.d.ts +95 -79
  101. package/dist/index23.vue.d.ts +24 -7
  102. package/dist/index24.vue.d.ts +76 -100
  103. package/dist/index25.vue.d.ts +7 -70
  104. package/dist/index26.vue.d.ts +99 -649
  105. package/dist/index27.vue.d.ts +81 -0
  106. package/dist/index28.vue.d.ts +662 -0
  107. package/dist/index3.vue.d.ts +3 -3
  108. package/dist/index4.vue.d.ts +6 -6
  109. package/dist/index6.vue.d.ts +2 -2
  110. package/dist/index8.vue.d.ts +1 -1
  111. package/dist/resolver.cjs +1 -1
  112. package/dist/resolver.cjs.map +1 -1
  113. package/dist/resolver.d.cts +1 -1
  114. package/dist/resolver.d.ts +1 -1
  115. package/dist/resolver.js +1 -1
  116. package/dist/resolver.js.map +1 -1
  117. package/dist/style.css +832 -220
  118. package/dist/useCalendarEvents.d.ts +1 -1
  119. package/dist/useCollapsePanel.d.ts +8 -8
  120. package/dist/useCropperCore.d.ts +4 -4
  121. package/dist/useDraggableLayout.d.ts +8 -8
  122. package/dist/useDynamicFormState.d.ts +10 -10
  123. package/dist/useEdgeInteraction.d.ts +1 -1
  124. package/dist/useFullscreen.d.ts +2 -2
  125. package/dist/useInfiniteScroll.d.ts +2 -2
  126. package/dist/useModalEdit.d.ts +52 -6
  127. package/dist/useQRCode.d.ts +5 -5
  128. package/dist/useSearchState.d.ts +2 -2
  129. package/dist/useSignatureHistory.d.ts +3 -3
  130. package/dist/useSplitResize.d.ts +8 -8
  131. package/dist/useTimeSelection.d.ts +2 -2
  132. package/dist/useTreeOperations.d.ts +4 -4
  133. package/dist/useWorkflowValidation.d.ts +2 -2
  134. package/package.json +5 -1
  135. package/dist/C_Chat-CcdWgVE8.css.map +0 -1
  136. package/dist/C_Chat-Cx0woEEe.css.map +0 -1
  137. package/dist/C_Editor-D0_6UhIa.css.map +0 -1
  138. package/dist/C_Editor-OlxIF9-5.css.map +0 -1
  139. package/dist/C_Markdown-7iBnLDtL.css.map +0 -1
  140. package/dist/C_Markdown-BbTvdFCl.css.map +0 -1
  141. package/dist/C_Table-vZlcgH6x.css.map +0 -1
  142. package/dist/C_Table-wzAO43l0.css.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"C_Chat-CJ8KESTM.css","names":[],"sources":["../src/components/C_Chat/index.vue?vue&type=style&index=0&scoped=5e7f3fe9&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//* ─── CSS 变量(基于项目主题变量,自动适配明暗) ───────────────────────── */\n.c-chat[data-v-5e7f3fe9] {\n --chat-bg: var(--card-color);\n --chat-sidebar-bg: var(--body-color);\n --chat-sidebar-width: 280px;\n --chat-header-bg: var(--card-color);\n --chat-header-height: 56px;\n --chat-input-bg: var(--body-color);\n --chat-input-height: 56px;\n --chat-bubble-self: var(--primary-color);\n --chat-bubble-other: var(--body-color);\n --chat-bubble-system: transparent;\n --chat-text-primary: var(--app-text-primary);\n --chat-text-secondary: var(--text-color-3);\n --chat-text-self: #fff;\n --chat-border: var(--border-color);\n --chat-online-color: #22c55e;\n --chat-unread-bg: #ef4444;\n --chat-unread-color: #fff;\n --chat-failed-color: #ef4444;\n --chat-shadow: rgba(0, 0, 0, 0.06);\n --chat-shadow-light: rgba(0, 0, 0, 0.03);\n --chat-radius: 12px;\n --chat-avatar-size: 36px;\n --chat-scrollbar-thumb: var(--border-color);\n display: flex;\n width: 100%;\n height: 100%;\n min-height: 0;\n border-radius: var(--chat-radius);\n overflow: hidden;\n background: var(--chat-bg);\n color: var(--chat-text-primary);\n font-size: 14px;\n border: 1px solid var(--chat-border);\n box-shadow: 0 2px 12px var(--chat-shadow);\n}\n\n/* ─── 联系人侧栏 ──────────────────────────────────────── */\n.c-chat__sidebar[data-v-5e7f3fe9] {\n display: flex;\n flex-direction: column;\n width: var(--chat-sidebar-width);\n min-width: var(--chat-sidebar-width);\n background: var(--chat-sidebar-bg);\n border-right: 1px solid var(--chat-border);\n box-shadow: 2px 0 8px var(--chat-shadow-light);\n}\n.c-chat__sidebar-header[data-v-5e7f3fe9] {\n display: flex;\n align-items: center;\n gap: 8px;\n height: var(--chat-header-height);\n padding: 0 16px;\n border-bottom: 1px solid var(--chat-border);\n font-weight: 600;\n font-size: 15px;\n}\n.c-chat__search[data-v-5e7f3fe9] {\n padding: 8px 12px;\n}\n.c-chat__contact-list[data-v-5e7f3fe9] {\n flex: 1;\n overflow-y: auto;\n overscroll-behavior: contain;\n}\n.c-chat__contact-list[data-v-5e7f3fe9]::-webkit-scrollbar {\n width: 4px;\n}\n.c-chat__contact-list[data-v-5e7f3fe9]::-webkit-scrollbar-thumb {\n background: var(--chat-scrollbar-thumb);\n border-radius: 2px;\n}\n.c-chat__contact[data-v-5e7f3fe9] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 16px;\n cursor: pointer;\n transition: background 0.15s;\n}\n.c-chat__contact[data-v-5e7f3fe9]:hover {\n background: color-mix(in srgb, var(--primary-color) 6%, transparent);\n}\n.c-chat__contact.is-active[data-v-5e7f3fe9] {\n background: color-mix(in srgb, var(--primary-color) 12%, transparent);\n}\n.c-chat__contact-avatar[data-v-5e7f3fe9] {\n position: relative;\n flex-shrink: 0;\n}\n.c-chat__avatar[data-v-5e7f3fe9] {\n width: var(--chat-avatar-size);\n height: var(--chat-avatar-size);\n border-radius: 50%;\n object-fit: cover;\n background: color-mix(in srgb, var(--border-color) 50%, transparent);\n}\n.c-chat__avatar-fallback[data-v-5e7f3fe9] {\n width: var(--chat-avatar-size);\n height: var(--chat-avatar-size);\n border-radius: 50%;\n background: color-mix(in srgb, var(--primary-color) 25%, transparent);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n font-weight: 600;\n color: var(--app-text-primary);\n}\n.c-chat__online-dot[data-v-5e7f3fe9] {\n position: absolute;\n bottom: 0;\n right: 0;\n width: 10px;\n height: 10px;\n border-radius: 50%;\n background: var(--chat-online-color);\n border: 2px solid var(--chat-sidebar-bg);\n}\n.c-chat__contact-info[data-v-5e7f3fe9] {\n flex: 1;\n min-width: 0;\n}\n.c-chat__contact-name[data-v-5e7f3fe9] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 13px;\n font-weight: 500;\n}\n.c-chat__contact-time[data-v-5e7f3fe9] {\n font-size: 11px;\n color: var(--chat-text-secondary);\n margin-left: 8px;\n flex-shrink: 0;\n}\n.c-chat__contact-last[data-v-5e7f3fe9] {\n font-size: 12px;\n color: var(--chat-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-top: 2px;\n}\n.c-chat__unread[data-v-5e7f3fe9] {\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n border-radius: 9px;\n background: var(--chat-unread-bg);\n color: var(--chat-unread-color);\n font-size: 11px;\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n/* ─── 主聊天区域 ──────────────────────────────────────── */\n.c-chat__main[data-v-5e7f3fe9] {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n.c-chat__header[data-v-5e7f3fe9] {\n display: flex;\n align-items: center;\n gap: 10px;\n height: var(--chat-header-height);\n padding: 0 20px;\n background: var(--chat-header-bg);\n border-bottom: 1px solid var(--chat-border);\n box-shadow: 0 1px 4px var(--chat-shadow-light);\n font-weight: 600;\n font-size: 15px;\n}\n.c-chat__header-status[data-v-5e7f3fe9] {\n font-size: 12px;\n font-weight: 400;\n color: var(--chat-text-secondary);\n}\n\n/* ─── 消息区域 ────────────────────────────────────────── */\n.c-chat__messages[data-v-5e7f3fe9] {\n flex: 1;\n overflow-y: auto;\n overscroll-behavior: contain;\n padding: 16px 20px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n background: color-mix(in srgb, var(--body-color) 50%, var(--card-color));\n}\n.c-chat__messages[data-v-5e7f3fe9]::-webkit-scrollbar {\n width: 4px;\n}\n.c-chat__messages[data-v-5e7f3fe9]::-webkit-scrollbar-thumb {\n background: var(--chat-scrollbar-thumb);\n border-radius: 2px;\n}\n.c-chat__load-more[data-v-5e7f3fe9] {\n text-align: center;\n padding: 8px;\n}\n.c-chat__empty[data-v-5e7f3fe9] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--chat-text-secondary);\n font-size: 13px;\n}\n\n/* ─── 消息气泡 ────────────────────────────────────────── */\n.c-chat__msg[data-v-5e7f3fe9] {\n display: flex;\n gap: 8px;\n max-width: 75%;\n}\n.c-chat__msg.is-self[data-v-5e7f3fe9] {\n margin-left: auto;\n flex-direction: row-reverse;\n}\n.c-chat__msg.is-system[data-v-5e7f3fe9] {\n max-width: 100%;\n justify-content: center;\n align-self: center;\n}\n.c-chat__msg-avatar[data-v-5e7f3fe9] {\n flex-shrink: 0;\n margin-top: 2px;\n}\n.c-chat__msg-body[data-v-5e7f3fe9] {\n display: flex;\n flex-direction: column;\n}\n.c-chat__msg-username[data-v-5e7f3fe9] {\n font-size: 12px;\n color: var(--chat-text-secondary);\n margin-bottom: 2px;\n}\n.is-self .c-chat__msg-username[data-v-5e7f3fe9] {\n text-align: right;\n}\n.c-chat__bubble[data-v-5e7f3fe9] {\n padding: 10px 14px;\n border-radius: 16px;\n line-height: 1.5;\n word-break: break-word;\n white-space: pre-wrap;\n}\n.is-other .c-chat__bubble[data-v-5e7f3fe9] {\n background: var(--chat-bubble-other);\n border: 1px solid var(--chat-border);\n border-top-left-radius: 4px;\n}\n.is-self .c-chat__bubble[data-v-5e7f3fe9] {\n background: var(--chat-bubble-self);\n color: var(--chat-text-self);\n border-top-right-radius: 4px;\n}\n.is-system .c-chat__bubble[data-v-5e7f3fe9] {\n background: var(--chat-bubble-system);\n color: var(--chat-text-secondary);\n font-size: 12px;\n padding: 4px 12px;\n}\n.c-chat__msg-image[data-v-5e7f3fe9] {\n max-width: 240px;\n max-height: 180px;\n border-radius: 12px;\n cursor: pointer;\n object-fit: cover;\n}\n.is-self .c-chat__msg-image[data-v-5e7f3fe9] {\n border-top-right-radius: 4px;\n}\n.is-other .c-chat__msg-image[data-v-5e7f3fe9] {\n border-top-left-radius: 4px;\n}\n.c-chat__msg-file[data-v-5e7f3fe9] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-radius: 12px;\n cursor: pointer;\n}\n.is-other .c-chat__msg-file[data-v-5e7f3fe9] {\n background: var(--chat-bubble-other);\n border: 1px solid var(--chat-border);\n border-top-left-radius: 4px;\n}\n.is-self .c-chat__msg-file[data-v-5e7f3fe9] {\n background: var(--chat-bubble-self);\n color: var(--chat-text-self);\n border-top-right-radius: 4px;\n}\n.c-chat__file-info[data-v-5e7f3fe9] {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n.c-chat__file-name[data-v-5e7f3fe9] {\n font-size: 13px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.c-chat__file-size[data-v-5e7f3fe9] {\n font-size: 11px;\n opacity: 0.6;\n}\n.c-chat__msg-time[data-v-5e7f3fe9] {\n font-size: 11px;\n color: var(--chat-text-secondary);\n margin-top: 4px;\n}\n.is-self .c-chat__msg-time[data-v-5e7f3fe9] {\n text-align: right;\n}\n.c-chat__msg-status[data-v-5e7f3fe9] {\n font-size: 11px;\n margin-top: 2px;\n text-align: right;\n}\n.c-chat__msg-status.is-sending[data-v-5e7f3fe9] {\n color: var(--chat-text-secondary);\n}\n.c-chat__msg-status.is-failed[data-v-5e7f3fe9] {\n color: var(--chat-failed-color);\n cursor: pointer;\n}\n\n/* ─── 时间分割线 ──────────────────────────────────────── */\n.c-chat__time-divider[data-v-5e7f3fe9] {\n text-align: center;\n font-size: 11px;\n color: var(--chat-text-secondary);\n padding: 4px 0;\n}\n\n/* ─── 输入区域 ────────────────────────────────────────── */\n.c-chat__input-area[data-v-5e7f3fe9] {\n display: flex;\n align-items: center;\n gap: 8px;\n min-height: var(--chat-input-height);\n padding: 10px 16px;\n background: var(--chat-input-bg);\n border-top: 1px solid var(--chat-border);\n}\n.c-chat__input-actions[data-v-5e7f3fe9] {\n display: flex;\n gap: 4px;\n flex-shrink: 0;\n}\n.c-chat__input-wrap[data-v-5e7f3fe9] {\n flex: 1;\n min-width: 0;\n}\n.c-chat__send-btn[data-v-5e7f3fe9] {\n flex-shrink: 0;\n}\n\n/* ─── 空态 ────────────────────────────────────────────── */\n.c-chat__no-chat[data-v-5e7f3fe9] {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n color: var(--chat-text-secondary);\n}\n.c-chat__no-chat-icon[data-v-5e7f3fe9] {\n font-size: 48px;\n opacity: 0.3;\n}\n\n/* ─── 响应式 ──────────────────────────────────────────── */\n@media (max-width: 640px) {\n.c-chat[data-v-5e7f3fe9] {\n --chat-sidebar-width: 72px;\n}\n.c-chat__contact-info[data-v-5e7f3fe9],\n .c-chat__search[data-v-5e7f3fe9],\n .c-chat__unread[data-v-5e7f3fe9] {\n display: none;\n}\n.c-chat__contact[data-v-5e7f3fe9] {\n justify-content: center;\n padding: 10px 8px;\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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"C_Chat-DzV4AFLd.css","names":[],"sources":["../src/components/C_Chat/index.vue?vue&type=style&index=0&scoped=5e7f3fe9&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//* ─── CSS 变量(基于项目主题变量,自动适配明暗) ───────────────────────── */\n.c-chat[data-v-5e7f3fe9] {\n --chat-bg: var(--card-color);\n --chat-sidebar-bg: var(--body-color);\n --chat-sidebar-width: 280px;\n --chat-header-bg: var(--card-color);\n --chat-header-height: 56px;\n --chat-input-bg: var(--body-color);\n --chat-input-height: 56px;\n --chat-bubble-self: var(--primary-color);\n --chat-bubble-other: var(--body-color);\n --chat-bubble-system: transparent;\n --chat-text-primary: var(--app-text-primary);\n --chat-text-secondary: var(--text-color-3);\n --chat-text-self: #fff;\n --chat-border: var(--border-color);\n --chat-online-color: #22c55e;\n --chat-unread-bg: #ef4444;\n --chat-unread-color: #fff;\n --chat-failed-color: #ef4444;\n --chat-shadow: rgba(0, 0, 0, 0.06);\n --chat-shadow-light: rgba(0, 0, 0, 0.03);\n --chat-radius: 12px;\n --chat-avatar-size: 36px;\n --chat-scrollbar-thumb: var(--border-color);\n display: flex;\n width: 100%;\n height: 100%;\n min-height: 0;\n border-radius: var(--chat-radius);\n overflow: hidden;\n background: var(--chat-bg);\n color: var(--chat-text-primary);\n font-size: 14px;\n border: 1px solid var(--chat-border);\n box-shadow: 0 2px 12px var(--chat-shadow);\n}\n\n/* ─── 联系人侧栏 ──────────────────────────────────────── */\n.c-chat__sidebar[data-v-5e7f3fe9] {\n display: flex;\n flex-direction: column;\n width: var(--chat-sidebar-width);\n min-width: var(--chat-sidebar-width);\n background: var(--chat-sidebar-bg);\n border-right: 1px solid var(--chat-border);\n box-shadow: 2px 0 8px var(--chat-shadow-light);\n}\n.c-chat__sidebar-header[data-v-5e7f3fe9] {\n display: flex;\n align-items: center;\n gap: 8px;\n height: var(--chat-header-height);\n padding: 0 16px;\n border-bottom: 1px solid var(--chat-border);\n font-weight: 600;\n font-size: 15px;\n}\n.c-chat__search[data-v-5e7f3fe9] {\n padding: 8px 12px;\n}\n.c-chat__contact-list[data-v-5e7f3fe9] {\n flex: 1;\n overflow-y: auto;\n overscroll-behavior: contain;\n}\n.c-chat__contact-list[data-v-5e7f3fe9]::-webkit-scrollbar {\n width: 4px;\n}\n.c-chat__contact-list[data-v-5e7f3fe9]::-webkit-scrollbar-thumb {\n background: var(--chat-scrollbar-thumb);\n border-radius: 2px;\n}\n.c-chat__contact[data-v-5e7f3fe9] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 16px;\n cursor: pointer;\n transition: background 0.15s;\n}\n.c-chat__contact[data-v-5e7f3fe9]:hover {\n background: color-mix(in srgb, var(--primary-color) 6%, transparent);\n}\n.c-chat__contact.is-active[data-v-5e7f3fe9] {\n background: color-mix(in srgb, var(--primary-color) 12%, transparent);\n}\n.c-chat__contact-avatar[data-v-5e7f3fe9] {\n position: relative;\n flex-shrink: 0;\n}\n.c-chat__avatar[data-v-5e7f3fe9] {\n width: var(--chat-avatar-size);\n height: var(--chat-avatar-size);\n border-radius: 50%;\n object-fit: cover;\n background: color-mix(in srgb, var(--border-color) 50%, transparent);\n}\n.c-chat__avatar-fallback[data-v-5e7f3fe9] {\n width: var(--chat-avatar-size);\n height: var(--chat-avatar-size);\n border-radius: 50%;\n background: color-mix(in srgb, var(--primary-color) 25%, transparent);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n font-weight: 600;\n color: var(--app-text-primary);\n}\n.c-chat__online-dot[data-v-5e7f3fe9] {\n position: absolute;\n bottom: 0;\n right: 0;\n width: 10px;\n height: 10px;\n border-radius: 50%;\n background: var(--chat-online-color);\n border: 2px solid var(--chat-sidebar-bg);\n}\n.c-chat__contact-info[data-v-5e7f3fe9] {\n flex: 1;\n min-width: 0;\n}\n.c-chat__contact-name[data-v-5e7f3fe9] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 13px;\n font-weight: 500;\n}\n.c-chat__contact-time[data-v-5e7f3fe9] {\n font-size: 11px;\n color: var(--chat-text-secondary);\n margin-left: 8px;\n flex-shrink: 0;\n}\n.c-chat__contact-last[data-v-5e7f3fe9] {\n font-size: 12px;\n color: var(--chat-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n margin-top: 2px;\n}\n.c-chat__unread[data-v-5e7f3fe9] {\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n border-radius: 9px;\n background: var(--chat-unread-bg);\n color: var(--chat-unread-color);\n font-size: 11px;\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n/* ─── 主聊天区域 ──────────────────────────────────────── */\n.c-chat__main[data-v-5e7f3fe9] {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n.c-chat__header[data-v-5e7f3fe9] {\n display: flex;\n align-items: center;\n gap: 10px;\n height: var(--chat-header-height);\n padding: 0 20px;\n background: var(--chat-header-bg);\n border-bottom: 1px solid var(--chat-border);\n box-shadow: 0 1px 4px var(--chat-shadow-light);\n font-weight: 600;\n font-size: 15px;\n}\n.c-chat__header-status[data-v-5e7f3fe9] {\n font-size: 12px;\n font-weight: 400;\n color: var(--chat-text-secondary);\n}\n\n/* ─── 消息区域 ────────────────────────────────────────── */\n.c-chat__messages[data-v-5e7f3fe9] {\n flex: 1;\n overflow-y: auto;\n overscroll-behavior: contain;\n padding: 16px 20px;\n display: flex;\n flex-direction: column;\n gap: 12px;\n background: color-mix(in srgb, var(--body-color) 50%, var(--card-color));\n}\n.c-chat__messages[data-v-5e7f3fe9]::-webkit-scrollbar {\n width: 4px;\n}\n.c-chat__messages[data-v-5e7f3fe9]::-webkit-scrollbar-thumb {\n background: var(--chat-scrollbar-thumb);\n border-radius: 2px;\n}\n.c-chat__load-more[data-v-5e7f3fe9] {\n text-align: center;\n padding: 8px;\n}\n.c-chat__empty[data-v-5e7f3fe9] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--chat-text-secondary);\n font-size: 13px;\n}\n\n/* ─── 消息气泡 ────────────────────────────────────────── */\n.c-chat__msg[data-v-5e7f3fe9] {\n display: flex;\n gap: 8px;\n max-width: 75%;\n}\n.c-chat__msg.is-self[data-v-5e7f3fe9] {\n margin-left: auto;\n flex-direction: row-reverse;\n}\n.c-chat__msg.is-system[data-v-5e7f3fe9] {\n max-width: 100%;\n justify-content: center;\n align-self: center;\n}\n.c-chat__msg-avatar[data-v-5e7f3fe9] {\n flex-shrink: 0;\n margin-top: 2px;\n}\n.c-chat__msg-body[data-v-5e7f3fe9] {\n display: flex;\n flex-direction: column;\n}\n.c-chat__msg-username[data-v-5e7f3fe9] {\n font-size: 12px;\n color: var(--chat-text-secondary);\n margin-bottom: 2px;\n}\n.is-self .c-chat__msg-username[data-v-5e7f3fe9] {\n text-align: right;\n}\n.c-chat__bubble[data-v-5e7f3fe9] {\n padding: 10px 14px;\n border-radius: 16px;\n line-height: 1.5;\n word-break: break-word;\n white-space: pre-wrap;\n}\n.is-other .c-chat__bubble[data-v-5e7f3fe9] {\n background: var(--chat-bubble-other);\n border: 1px solid var(--chat-border);\n border-top-left-radius: 4px;\n}\n.is-self .c-chat__bubble[data-v-5e7f3fe9] {\n background: var(--chat-bubble-self);\n color: var(--chat-text-self);\n border-top-right-radius: 4px;\n}\n.is-system .c-chat__bubble[data-v-5e7f3fe9] {\n background: var(--chat-bubble-system);\n color: var(--chat-text-secondary);\n font-size: 12px;\n padding: 4px 12px;\n}\n.c-chat__msg-image[data-v-5e7f3fe9] {\n max-width: 240px;\n max-height: 180px;\n border-radius: 12px;\n cursor: pointer;\n object-fit: cover;\n}\n.is-self .c-chat__msg-image[data-v-5e7f3fe9] {\n border-top-right-radius: 4px;\n}\n.is-other .c-chat__msg-image[data-v-5e7f3fe9] {\n border-top-left-radius: 4px;\n}\n.c-chat__msg-file[data-v-5e7f3fe9] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 14px;\n border-radius: 12px;\n cursor: pointer;\n}\n.is-other .c-chat__msg-file[data-v-5e7f3fe9] {\n background: var(--chat-bubble-other);\n border: 1px solid var(--chat-border);\n border-top-left-radius: 4px;\n}\n.is-self .c-chat__msg-file[data-v-5e7f3fe9] {\n background: var(--chat-bubble-self);\n color: var(--chat-text-self);\n border-top-right-radius: 4px;\n}\n.c-chat__file-info[data-v-5e7f3fe9] {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n.c-chat__file-name[data-v-5e7f3fe9] {\n font-size: 13px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.c-chat__file-size[data-v-5e7f3fe9] {\n font-size: 11px;\n opacity: 0.6;\n}\n.c-chat__msg-time[data-v-5e7f3fe9] {\n font-size: 11px;\n color: var(--chat-text-secondary);\n margin-top: 4px;\n}\n.is-self .c-chat__msg-time[data-v-5e7f3fe9] {\n text-align: right;\n}\n.c-chat__msg-status[data-v-5e7f3fe9] {\n font-size: 11px;\n margin-top: 2px;\n text-align: right;\n}\n.c-chat__msg-status.is-sending[data-v-5e7f3fe9] {\n color: var(--chat-text-secondary);\n}\n.c-chat__msg-status.is-failed[data-v-5e7f3fe9] {\n color: var(--chat-failed-color);\n cursor: pointer;\n}\n\n/* ─── 时间分割线 ──────────────────────────────────────── */\n.c-chat__time-divider[data-v-5e7f3fe9] {\n text-align: center;\n font-size: 11px;\n color: var(--chat-text-secondary);\n padding: 4px 0;\n}\n\n/* ─── 输入区域 ────────────────────────────────────────── */\n.c-chat__input-area[data-v-5e7f3fe9] {\n display: flex;\n align-items: center;\n gap: 8px;\n min-height: var(--chat-input-height);\n padding: 10px 16px;\n background: var(--chat-input-bg);\n border-top: 1px solid var(--chat-border);\n}\n.c-chat__input-actions[data-v-5e7f3fe9] {\n display: flex;\n gap: 4px;\n flex-shrink: 0;\n}\n.c-chat__input-wrap[data-v-5e7f3fe9] {\n flex: 1;\n min-width: 0;\n}\n.c-chat__send-btn[data-v-5e7f3fe9] {\n flex-shrink: 0;\n}\n\n/* ─── 空态 ────────────────────────────────────────────── */\n.c-chat__no-chat[data-v-5e7f3fe9] {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n color: var(--chat-text-secondary);\n}\n.c-chat__no-chat-icon[data-v-5e7f3fe9] {\n font-size: 48px;\n opacity: 0.3;\n}\n\n/* ─── 响应式 ──────────────────────────────────────────── */\n@media (max-width: 640px) {\n.c-chat[data-v-5e7f3fe9] {\n --chat-sidebar-width: 72px;\n}\n.c-chat__contact-info[data-v-5e7f3fe9],\n .c-chat__search[data-v-5e7f3fe9],\n .c-chat__unread[data-v-5e7f3fe9] {\n display: none;\n}\n.c-chat__contact[data-v-5e7f3fe9] {\n justify-content: center;\n padding: 10px 8px;\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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
package/dist/C_Chat.css CHANGED
@@ -14,6 +14,12 @@
14
14
  --chat-text-secondary: var(--text-color-3);
15
15
  --chat-text-self: #fff;
16
16
  --chat-border: var(--border-color);
17
+ --chat-online-color: #22c55e;
18
+ --chat-unread-bg: #ef4444;
19
+ --chat-unread-color: #fff;
20
+ --chat-failed-color: #ef4444;
21
+ --chat-shadow: rgba(0, 0, 0, 0.06);
22
+ --chat-shadow-light: rgba(0, 0, 0, 0.03);
17
23
  --chat-radius: 12px;
18
24
  --chat-avatar-size: 36px;
19
25
  --chat-scrollbar-thumb: var(--border-color);
@@ -27,7 +33,7 @@
27
33
  color: var(--chat-text-primary);
28
34
  font-size: 14px;
29
35
  border: 1px solid var(--chat-border);
30
- box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
36
+ box-shadow: 0 2px 12px var(--chat-shadow);
31
37
  }
32
38
 
33
39
  /* ─── 联系人侧栏 ──────────────────────────────────────── */
@@ -38,7 +44,7 @@
38
44
  min-width: var(--chat-sidebar-width);
39
45
  background: var(--chat-sidebar-bg);
40
46
  border-right: 1px solid var(--chat-border);
41
- box-shadow: 2px 0 8px rgba(0, 0, 0, 0.03);
47
+ box-shadow: 2px 0 8px var(--chat-shadow-light);
42
48
  }
43
49
  .c-chat__sidebar-header[data-v-5e7f3fe9] {
44
50
  display: flex;
@@ -109,7 +115,7 @@
109
115
  width: 10px;
110
116
  height: 10px;
111
117
  border-radius: 50%;
112
- background: #22c55e;
118
+ background: var(--chat-online-color);
113
119
  border: 2px solid var(--chat-sidebar-bg);
114
120
  }
115
121
  .c-chat__contact-info[data-v-5e7f3fe9] {
@@ -142,8 +148,8 @@
142
148
  height: 18px;
143
149
  padding: 0 5px;
144
150
  border-radius: 9px;
145
- background: #ef4444;
146
- color: #fff;
151
+ background: var(--chat-unread-bg);
152
+ color: var(--chat-unread-color);
147
153
  font-size: 11px;
148
154
  font-weight: 600;
149
155
  display: flex;
@@ -167,7 +173,7 @@
167
173
  padding: 0 20px;
168
174
  background: var(--chat-header-bg);
169
175
  border-bottom: 1px solid var(--chat-border);
170
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.03);
176
+ box-shadow: 0 1px 4px var(--chat-shadow-light);
171
177
  font-weight: 600;
172
178
  font-size: 15px;
173
179
  }
@@ -326,7 +332,7 @@
326
332
  color: var(--chat-text-secondary);
327
333
  }
328
334
  .c-chat__msg-status.is-failed[data-v-5e7f3fe9] {
329
- color: #ef4444;
335
+ color: var(--chat-failed-color);
330
336
  cursor: pointer;
331
337
  }
332
338
 
@@ -392,4 +398,4 @@
392
398
  }
393
399
  }
394
400
 
395
- /*# sourceMappingURL=C_Chat-CcdWgVE8.css.map*/
401
+ /*# sourceMappingURL=C_Chat-CJ8KESTM.css.map*/
@@ -1 +1 @@
1
- {"version":3,"file":"C_CollapsePanel-CWkFCqNQ.css","names":[],"sources":["../src/components/C_CollapsePanel/index.vue?vue&type=style&index=0&scoped=4e11a983&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//* ─── 变量 ───────────────────────────────────────── */\n/* ─── 容器 ───────────────────────────────────────── */\n.c-collapse-panel[data-v-4e11a983] {\n width: 100%;\n /* ── default 变体 ────────────────────────────── */\n /* ── card 变体 ───────────────────────────────── */\n /* ── ghost 变体(无边框极简) ──────────────────── */\n /* ── bordered 修饰符 ─────────────────────────── */\n /* ── 图标右侧模式 ────────────────────────────── */\n}\n.c-collapse-panel--default .collapse-item[data-v-4e11a983] {\n border-bottom: 1px solid var(--c-border, #e1e4e8);\n}\n.c-collapse-panel--default .collapse-item[data-v-4e11a983]:last-child {\n border-bottom: none;\n}\n.c-collapse-panel--card[data-v-4e11a983] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.c-collapse-panel--card .collapse-item[data-v-4e11a983] {\n border: 1px solid var(--c-border, #e1e4e8);\n border-radius: 8px;\n background: var(--c-bg-card, #fff);\n transition: box-shadow 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.c-collapse-panel--card .collapse-item--active[data-v-4e11a983] {\n box-shadow: 0 1px 6px rgba(0, 0, 0, 0.08);\n}\n.c-collapse-panel--card .collapse-item[data-v-4e11a983]:hover:not(.collapse-item--disabled) {\n border-color: var(--c-primary, #409eff);\n}\n.c-collapse-panel--ghost .collapse-item__header[data-v-4e11a983] {\n background: transparent;\n}\n.c-collapse-panel--ghost .collapse-item__header[data-v-4e11a983]:hover {\n background: var(--c-bg-card, #fff);\n}\n.c-collapse-panel--ghost .collapse-item__content[data-v-4e11a983] {\n padding-left: 28px;\n}\n.c-collapse-panel--bordered.c-collapse-panel--default[data-v-4e11a983] {\n border: 1px solid var(--c-border, #e1e4e8);\n border-radius: 8px;\n}\n.c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:first-child .collapse-item__header[data-v-4e11a983] {\n border-radius: 8px 8px 0 0;\n}\n.c-collapse-panel--bordered.c-collapse-panel--default .collapse-item[data-v-4e11a983]:last-child {\n border-bottom: none;\n}\n.c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:last-child .collapse-item__header[data-v-4e11a983] {\n border-radius: 0 0 8px 8px;\n}\n.c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:last-child.collapse-item--active .collapse-item__header[data-v-4e11a983] {\n border-radius: 0;\n}\n.c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:only-child .collapse-item__header[data-v-4e11a983] {\n border-radius: 8px;\n}\n.c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:only-child.collapse-item--active .collapse-item__header[data-v-4e11a983] {\n border-radius: 8px 8px 0 0;\n}\n.c-collapse-panel--icon-right .collapse-item__header[data-v-4e11a983] {\n flex-direction: row-reverse;\n}\n.c-collapse-panel--icon-right .collapse-item__arrow[data-v-4e11a983] {\n margin-left: auto;\n margin-right: 0;\n}\n.c-collapse-panel--icon-right .collapse-item__title-area[data-v-4e11a983] {\n margin-left: 0;\n}\n\n/* ─── 面板项 ─────────────────────────────────────── */\n.collapse-item--disabled .collapse-item__header[data-v-4e11a983] {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/* ─── 面板头部 ───────────────────────────────────── */\n.collapse-item__header[data-v-4e11a983] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n cursor: pointer;\n user-select: none;\n background: transparent;\n transition: background-color 0.15s ease;\n outline: none;\n}\n.collapse-item__header[data-v-4e11a983]:hover:not([aria-disabled=true]) {\n background: var(--c-bg-hover, rgba(0, 0, 0, 0.04));\n}\n.collapse-item__header[data-v-4e11a983]:focus-visible {\n outline: 2px solid var(--c-primary, #409eff);\n outline-offset: -2px;\n border-radius: 4px;\n}\n\n/* ─── 展开箭头 ───────────────────────────────────── */\n.collapse-item__arrow[data-v-4e11a983] {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 20px;\n height: 20px;\n font-size: 16px;\n color: var(--c-text-3, #999);\n transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.collapse-item__arrow--expanded[data-v-4e11a983] {\n transform: rotate(90deg);\n}\n\n/* ─── 标题区域 ───────────────────────────────────── */\n.collapse-item__title-area[data-v-4e11a983] {\n flex: 1;\n min-width: 0;\n}\n.collapse-item__title-group[data-v-4e11a983] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.collapse-item__icon[data-v-4e11a983] {\n flex-shrink: 0;\n font-size: 18px;\n color: var(--c-primary, #409eff);\n}\n.collapse-item__title[data-v-4e11a983] {\n font-size: 14px;\n font-weight: 600;\n color: var(--c-text-1, #333);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.collapse-item__subtitle[data-v-4e11a983] {\n font-size: 12px;\n color: var(--c-text-4, #ccc);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* ─── 头部右侧操作区 ────────────────────────────── */\n.collapse-item__extra[data-v-4e11a983] {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n gap: 6px;\n margin-left: auto;\n}\n\n/* ─── 内容区域 ───────────────────────────────────── */\n.collapse-item__content-wrapper[data-v-4e11a983] {\n transition: height 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n will-change: height;\n}\n.collapse-item__content[data-v-4e11a983] {\n padding: 0 16px 16px;\n font-size: 14px;\n line-height: 1.6;\n color: var(--c-text-2, #666);\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;;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;;AAEA;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
1
+ {"version":3,"file":"C_CollapsePanel-BkOivqn3.css","names":[],"sources":["../src/components/C_CollapsePanel/index.vue?vue&type=style&index=0&scoped=08dc96f9&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//* ─── 变量 ───────────────────────────────────────── */\n/* ─── 容器 ───────────────────────────────────────── */\n.c-collapse-panel[data-v-08dc96f9] {\n width: 100%;\n /* ── default 变体 ────────────────────────────── */\n /* ── card 变体 ───────────────────────────────── */\n /* ── ghost 变体(无边框极简) ──────────────────── */\n /* ── bordered 修饰符 ─────────────────────────── */\n /* ── 图标右侧模式 ────────────────────────────── */\n}\n.c-collapse-panel--default .collapse-item[data-v-08dc96f9] {\n border-bottom: 1px solid var(--c-border, #e1e4e8);\n}\n.c-collapse-panel--default .collapse-item[data-v-08dc96f9]:last-child {\n border-bottom: none;\n}\n.c-collapse-panel--card[data-v-08dc96f9] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.c-collapse-panel--card .collapse-item[data-v-08dc96f9] {\n border: 1px solid var(--c-border, #e1e4e8);\n border-radius: 8px;\n background: var(--c-bg-card, #fff);\n transition: box-shadow 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.c-collapse-panel--card .collapse-item--active[data-v-08dc96f9] {\n box-shadow: 0 1px 6px rgba(0, 0, 0, 0.08);\n}\n.c-collapse-panel--card .collapse-item[data-v-08dc96f9]:hover:not(.collapse-item--disabled) {\n border-color: var(--c-primary, #409eff);\n}\n.c-collapse-panel--ghost .collapse-item__header[data-v-08dc96f9] {\n background: transparent;\n}\n.c-collapse-panel--ghost .collapse-item__header[data-v-08dc96f9]:hover {\n background: var(--c-bg-card, #fff);\n}\n.c-collapse-panel--ghost .collapse-item__content[data-v-08dc96f9] {\n padding-left: 28px;\n}\n.c-collapse-panel--bordered.c-collapse-panel--default[data-v-08dc96f9] {\n border: 1px solid var(--c-border, #e1e4e8);\n border-radius: 8px;\n}\n.c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:first-child .collapse-item__header[data-v-08dc96f9] {\n border-radius: 8px 8px 0 0;\n}\n.c-collapse-panel--bordered.c-collapse-panel--default .collapse-item[data-v-08dc96f9]:last-child {\n border-bottom: none;\n}\n.c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:last-child .collapse-item__header[data-v-08dc96f9] {\n border-radius: 0 0 8px 8px;\n}\n.c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:last-child.collapse-item--active .collapse-item__header[data-v-08dc96f9] {\n border-radius: 0;\n}\n.c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:only-child .collapse-item__header[data-v-08dc96f9] {\n border-radius: 8px;\n}\n.c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:only-child.collapse-item--active .collapse-item__header[data-v-08dc96f9] {\n border-radius: 8px 8px 0 0;\n}\n.c-collapse-panel--icon-right .collapse-item__header[data-v-08dc96f9] {\n flex-direction: row-reverse;\n}\n.c-collapse-panel--icon-right .collapse-item__arrow[data-v-08dc96f9] {\n margin-left: auto;\n margin-right: 0;\n}\n.c-collapse-panel--icon-right .collapse-item__title-area[data-v-08dc96f9] {\n margin-left: 0;\n}\n\n/* ─── 面板项 ─────────────────────────────────────── */\n.collapse-item--disabled .collapse-item__header[data-v-08dc96f9] {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/* ─── 面板头部 ───────────────────────────────────── */\n.collapse-item__header[data-v-08dc96f9] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n cursor: pointer;\n user-select: none;\n background: transparent;\n transition: background-color 0.15s ease;\n outline: none;\n}\n.collapse-item__header[data-v-08dc96f9]:hover:not([aria-disabled=true]) {\n background: var(--c-bg-hover, rgba(0, 0, 0, 0.04));\n}\n.collapse-item__header[data-v-08dc96f9]:focus-visible {\n outline: 2px solid var(--c-primary, #409eff);\n outline-offset: -2px;\n border-radius: 4px;\n}\n\n/* ─── 展开箭头 ───────────────────────────────────── */\n.collapse-item__arrow[data-v-08dc96f9] {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 20px;\n height: 20px;\n font-size: 16px;\n color: var(--c-text-3, #999);\n transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.collapse-item__arrow--expanded[data-v-08dc96f9] {\n transform: rotate(90deg);\n}\n\n/* ─── 标题区域 ───────────────────────────────────── */\n.collapse-item__title-area[data-v-08dc96f9] {\n flex: 1;\n min-width: 0;\n}\n.collapse-item__title-group[data-v-08dc96f9] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.collapse-item__icon[data-v-08dc96f9] {\n flex-shrink: 0;\n font-size: 18px;\n color: var(--c-primary, #409eff);\n}\n.collapse-item__title[data-v-08dc96f9] {\n font-size: 14px;\n font-weight: 600;\n color: var(--c-text-1, #333);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.collapse-item__subtitle[data-v-08dc96f9] {\n font-size: 12px;\n color: var(--c-text-4, #ccc);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* ─── 头部右侧操作区 ────────────────────────────── */\n.collapse-item__extra[data-v-08dc96f9] {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n gap: 6px;\n margin-left: auto;\n}\n\n/* ─── 内容区域 ───────────────────────────────────── */\n.collapse-item__content-wrapper[data-v-08dc96f9] {\n transition: height 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n will-change: height;\n}\n.collapse-item__content[data-v-08dc96f9] {\n padding: 0 16px 16px;\n font-size: 14px;\n line-height: 1.6;\n color: var(--c-text-2, #666);\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;;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;;AAEA;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
@@ -1 +1 @@
1
- {"version":3,"file":"C_CollapsePanel-pcVJA_4z.css","names":[],"sources":["../src/components/C_CollapsePanel/index.vue?vue&type=style&index=0&scoped=4e11a983&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//* ─── 变量 ───────────────────────────────────────── */\n/* ─── 容器 ───────────────────────────────────────── */\n.c-collapse-panel[data-v-4e11a983] {\n width: 100%;\n /* ── default 变体 ────────────────────────────── */\n /* ── card 变体 ───────────────────────────────── */\n /* ── ghost 变体(无边框极简) ──────────────────── */\n /* ── bordered 修饰符 ─────────────────────────── */\n /* ── 图标右侧模式 ────────────────────────────── */\n}\n.c-collapse-panel--default .collapse-item[data-v-4e11a983] {\n border-bottom: 1px solid var(--c-border, #e1e4e8);\n}\n.c-collapse-panel--default .collapse-item[data-v-4e11a983]:last-child {\n border-bottom: none;\n}\n.c-collapse-panel--card[data-v-4e11a983] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.c-collapse-panel--card .collapse-item[data-v-4e11a983] {\n border: 1px solid var(--c-border, #e1e4e8);\n border-radius: 8px;\n background: var(--c-bg-card, #fff);\n transition: box-shadow 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.c-collapse-panel--card .collapse-item--active[data-v-4e11a983] {\n box-shadow: 0 1px 6px rgba(0, 0, 0, 0.08);\n}\n.c-collapse-panel--card .collapse-item[data-v-4e11a983]:hover:not(.collapse-item--disabled) {\n border-color: var(--c-primary, #409eff);\n}\n.c-collapse-panel--ghost .collapse-item__header[data-v-4e11a983] {\n background: transparent;\n}\n.c-collapse-panel--ghost .collapse-item__header[data-v-4e11a983]:hover {\n background: var(--c-bg-card, #fff);\n}\n.c-collapse-panel--ghost .collapse-item__content[data-v-4e11a983] {\n padding-left: 28px;\n}\n.c-collapse-panel--bordered.c-collapse-panel--default[data-v-4e11a983] {\n border: 1px solid var(--c-border, #e1e4e8);\n border-radius: 8px;\n}\n.c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:first-child .collapse-item__header[data-v-4e11a983] {\n border-radius: 8px 8px 0 0;\n}\n.c-collapse-panel--bordered.c-collapse-panel--default .collapse-item[data-v-4e11a983]:last-child {\n border-bottom: none;\n}\n.c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:last-child .collapse-item__header[data-v-4e11a983] {\n border-radius: 0 0 8px 8px;\n}\n.c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:last-child.collapse-item--active .collapse-item__header[data-v-4e11a983] {\n border-radius: 0;\n}\n.c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:only-child .collapse-item__header[data-v-4e11a983] {\n border-radius: 8px;\n}\n.c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:only-child.collapse-item--active .collapse-item__header[data-v-4e11a983] {\n border-radius: 8px 8px 0 0;\n}\n.c-collapse-panel--icon-right .collapse-item__header[data-v-4e11a983] {\n flex-direction: row-reverse;\n}\n.c-collapse-panel--icon-right .collapse-item__arrow[data-v-4e11a983] {\n margin-left: auto;\n margin-right: 0;\n}\n.c-collapse-panel--icon-right .collapse-item__title-area[data-v-4e11a983] {\n margin-left: 0;\n}\n\n/* ─── 面板项 ─────────────────────────────────────── */\n.collapse-item--disabled .collapse-item__header[data-v-4e11a983] {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/* ─── 面板头部 ───────────────────────────────────── */\n.collapse-item__header[data-v-4e11a983] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n cursor: pointer;\n user-select: none;\n background: transparent;\n transition: background-color 0.15s ease;\n outline: none;\n}\n.collapse-item__header[data-v-4e11a983]:hover:not([aria-disabled=true]) {\n background: var(--c-bg-hover, rgba(0, 0, 0, 0.04));\n}\n.collapse-item__header[data-v-4e11a983]:focus-visible {\n outline: 2px solid var(--c-primary, #409eff);\n outline-offset: -2px;\n border-radius: 4px;\n}\n\n/* ─── 展开箭头 ───────────────────────────────────── */\n.collapse-item__arrow[data-v-4e11a983] {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 20px;\n height: 20px;\n font-size: 16px;\n color: var(--c-text-3, #999);\n transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.collapse-item__arrow--expanded[data-v-4e11a983] {\n transform: rotate(90deg);\n}\n\n/* ─── 标题区域 ───────────────────────────────────── */\n.collapse-item__title-area[data-v-4e11a983] {\n flex: 1;\n min-width: 0;\n}\n.collapse-item__title-group[data-v-4e11a983] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.collapse-item__icon[data-v-4e11a983] {\n flex-shrink: 0;\n font-size: 18px;\n color: var(--c-primary, #409eff);\n}\n.collapse-item__title[data-v-4e11a983] {\n font-size: 14px;\n font-weight: 600;\n color: var(--c-text-1, #333);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.collapse-item__subtitle[data-v-4e11a983] {\n font-size: 12px;\n color: var(--c-text-4, #ccc);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* ─── 头部右侧操作区 ────────────────────────────── */\n.collapse-item__extra[data-v-4e11a983] {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n gap: 6px;\n margin-left: auto;\n}\n\n/* ─── 内容区域 ───────────────────────────────────── */\n.collapse-item__content-wrapper[data-v-4e11a983] {\n transition: height 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n will-change: height;\n}\n.collapse-item__content[data-v-4e11a983] {\n padding: 0 16px 16px;\n font-size: 14px;\n line-height: 1.6;\n color: var(--c-text-2, #666);\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;;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;;AAEA;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
1
+ {"version":3,"file":"C_CollapsePanel-CedsEM0N.css","names":[],"sources":["../src/components/C_CollapsePanel/index.vue?vue&type=style&index=0&scoped=08dc96f9&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//* ─── 变量 ───────────────────────────────────────── */\n/* ─── 容器 ───────────────────────────────────────── */\n.c-collapse-panel[data-v-08dc96f9] {\n width: 100%;\n /* ── default 变体 ────────────────────────────── */\n /* ── card 变体 ───────────────────────────────── */\n /* ── ghost 变体(无边框极简) ──────────────────── */\n /* ── bordered 修饰符 ─────────────────────────── */\n /* ── 图标右侧模式 ────────────────────────────── */\n}\n.c-collapse-panel--default .collapse-item[data-v-08dc96f9] {\n border-bottom: 1px solid var(--c-border, #e1e4e8);\n}\n.c-collapse-panel--default .collapse-item[data-v-08dc96f9]:last-child {\n border-bottom: none;\n}\n.c-collapse-panel--card[data-v-08dc96f9] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.c-collapse-panel--card .collapse-item[data-v-08dc96f9] {\n border: 1px solid var(--c-border, #e1e4e8);\n border-radius: 8px;\n background: var(--c-bg-card, #fff);\n transition: box-shadow 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.c-collapse-panel--card .collapse-item--active[data-v-08dc96f9] {\n box-shadow: 0 1px 6px rgba(0, 0, 0, 0.08);\n}\n.c-collapse-panel--card .collapse-item[data-v-08dc96f9]:hover:not(.collapse-item--disabled) {\n border-color: var(--c-primary, #409eff);\n}\n.c-collapse-panel--ghost .collapse-item__header[data-v-08dc96f9] {\n background: transparent;\n}\n.c-collapse-panel--ghost .collapse-item__header[data-v-08dc96f9]:hover {\n background: var(--c-bg-card, #fff);\n}\n.c-collapse-panel--ghost .collapse-item__content[data-v-08dc96f9] {\n padding-left: 28px;\n}\n.c-collapse-panel--bordered.c-collapse-panel--default[data-v-08dc96f9] {\n border: 1px solid var(--c-border, #e1e4e8);\n border-radius: 8px;\n}\n.c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:first-child .collapse-item__header[data-v-08dc96f9] {\n border-radius: 8px 8px 0 0;\n}\n.c-collapse-panel--bordered.c-collapse-panel--default .collapse-item[data-v-08dc96f9]:last-child {\n border-bottom: none;\n}\n.c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:last-child .collapse-item__header[data-v-08dc96f9] {\n border-radius: 0 0 8px 8px;\n}\n.c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:last-child.collapse-item--active .collapse-item__header[data-v-08dc96f9] {\n border-radius: 0;\n}\n.c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:only-child .collapse-item__header[data-v-08dc96f9] {\n border-radius: 8px;\n}\n.c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:only-child.collapse-item--active .collapse-item__header[data-v-08dc96f9] {\n border-radius: 8px 8px 0 0;\n}\n.c-collapse-panel--icon-right .collapse-item__header[data-v-08dc96f9] {\n flex-direction: row-reverse;\n}\n.c-collapse-panel--icon-right .collapse-item__arrow[data-v-08dc96f9] {\n margin-left: auto;\n margin-right: 0;\n}\n.c-collapse-panel--icon-right .collapse-item__title-area[data-v-08dc96f9] {\n margin-left: 0;\n}\n\n/* ─── 面板项 ─────────────────────────────────────── */\n.collapse-item--disabled .collapse-item__header[data-v-08dc96f9] {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/* ─── 面板头部 ───────────────────────────────────── */\n.collapse-item__header[data-v-08dc96f9] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n cursor: pointer;\n user-select: none;\n background: transparent;\n transition: background-color 0.15s ease;\n outline: none;\n}\n.collapse-item__header[data-v-08dc96f9]:hover:not([aria-disabled=true]) {\n background: var(--c-bg-hover, rgba(0, 0, 0, 0.04));\n}\n.collapse-item__header[data-v-08dc96f9]:focus-visible {\n outline: 2px solid var(--c-primary, #409eff);\n outline-offset: -2px;\n border-radius: 4px;\n}\n\n/* ─── 展开箭头 ───────────────────────────────────── */\n.collapse-item__arrow[data-v-08dc96f9] {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 20px;\n height: 20px;\n font-size: 16px;\n color: var(--c-text-3, #999);\n transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n}\n.collapse-item__arrow--expanded[data-v-08dc96f9] {\n transform: rotate(90deg);\n}\n\n/* ─── 标题区域 ───────────────────────────────────── */\n.collapse-item__title-area[data-v-08dc96f9] {\n flex: 1;\n min-width: 0;\n}\n.collapse-item__title-group[data-v-08dc96f9] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.collapse-item__icon[data-v-08dc96f9] {\n flex-shrink: 0;\n font-size: 18px;\n color: var(--c-primary, #409eff);\n}\n.collapse-item__title[data-v-08dc96f9] {\n font-size: 14px;\n font-weight: 600;\n color: var(--c-text-1, #333);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.collapse-item__subtitle[data-v-08dc96f9] {\n font-size: 12px;\n color: var(--c-text-4, #ccc);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* ─── 头部右侧操作区 ────────────────────────────── */\n.collapse-item__extra[data-v-08dc96f9] {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n gap: 6px;\n margin-left: auto;\n}\n\n/* ─── 内容区域 ───────────────────────────────────── */\n.collapse-item__content-wrapper[data-v-08dc96f9] {\n transition: height 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n will-change: height;\n}\n.collapse-item__content[data-v-08dc96f9] {\n padding: 0 16px 16px;\n font-size: 14px;\n line-height: 1.6;\n color: var(--c-text-2, #666);\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;;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;;AAEA;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
@@ -1,6 +1,6 @@
1
1
  /* unplugin-vue-components disabled *//* ─── 变量 ───────────────────────────────────────── */
2
2
  /* ─── 容器 ───────────────────────────────────────── */
3
- .c-collapse-panel[data-v-4e11a983] {
3
+ .c-collapse-panel[data-v-08dc96f9] {
4
4
  width: 100%;
5
5
  /* ── default 变体 ────────────────────────────── */
6
6
  /* ── card 变体 ───────────────────────────────── */
@@ -8,79 +8,79 @@
8
8
  /* ── bordered 修饰符 ─────────────────────────── */
9
9
  /* ── 图标右侧模式 ────────────────────────────── */
10
10
  }
11
- .c-collapse-panel--default .collapse-item[data-v-4e11a983] {
11
+ .c-collapse-panel--default .collapse-item[data-v-08dc96f9] {
12
12
  border-bottom: 1px solid var(--c-border, #e1e4e8);
13
13
  }
14
- .c-collapse-panel--default .collapse-item[data-v-4e11a983]:last-child {
14
+ .c-collapse-panel--default .collapse-item[data-v-08dc96f9]:last-child {
15
15
  border-bottom: none;
16
16
  }
17
- .c-collapse-panel--card[data-v-4e11a983] {
17
+ .c-collapse-panel--card[data-v-08dc96f9] {
18
18
  display: flex;
19
19
  flex-direction: column;
20
20
  gap: 8px;
21
21
  }
22
- .c-collapse-panel--card .collapse-item[data-v-4e11a983] {
22
+ .c-collapse-panel--card .collapse-item[data-v-08dc96f9] {
23
23
  border: 1px solid var(--c-border, #e1e4e8);
24
24
  border-radius: 8px;
25
25
  background: var(--c-bg-card, #fff);
26
26
  transition: box-shadow 0.25s cubic-bezier(0.4, 0, 0.2, 1);
27
27
  }
28
- .c-collapse-panel--card .collapse-item--active[data-v-4e11a983] {
28
+ .c-collapse-panel--card .collapse-item--active[data-v-08dc96f9] {
29
29
  box-shadow: 0 1px 6px rgba(0, 0, 0, 0.08);
30
30
  }
31
- .c-collapse-panel--card .collapse-item[data-v-4e11a983]:hover:not(.collapse-item--disabled) {
31
+ .c-collapse-panel--card .collapse-item[data-v-08dc96f9]:hover:not(.collapse-item--disabled) {
32
32
  border-color: var(--c-primary, #409eff);
33
33
  }
34
- .c-collapse-panel--ghost .collapse-item__header[data-v-4e11a983] {
34
+ .c-collapse-panel--ghost .collapse-item__header[data-v-08dc96f9] {
35
35
  background: transparent;
36
36
  }
37
- .c-collapse-panel--ghost .collapse-item__header[data-v-4e11a983]:hover {
37
+ .c-collapse-panel--ghost .collapse-item__header[data-v-08dc96f9]:hover {
38
38
  background: var(--c-bg-card, #fff);
39
39
  }
40
- .c-collapse-panel--ghost .collapse-item__content[data-v-4e11a983] {
40
+ .c-collapse-panel--ghost .collapse-item__content[data-v-08dc96f9] {
41
41
  padding-left: 28px;
42
42
  }
43
- .c-collapse-panel--bordered.c-collapse-panel--default[data-v-4e11a983] {
43
+ .c-collapse-panel--bordered.c-collapse-panel--default[data-v-08dc96f9] {
44
44
  border: 1px solid var(--c-border, #e1e4e8);
45
45
  border-radius: 8px;
46
46
  }
47
- .c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:first-child .collapse-item__header[data-v-4e11a983] {
47
+ .c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:first-child .collapse-item__header[data-v-08dc96f9] {
48
48
  border-radius: 8px 8px 0 0;
49
49
  }
50
- .c-collapse-panel--bordered.c-collapse-panel--default .collapse-item[data-v-4e11a983]:last-child {
50
+ .c-collapse-panel--bordered.c-collapse-panel--default .collapse-item[data-v-08dc96f9]:last-child {
51
51
  border-bottom: none;
52
52
  }
53
- .c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:last-child .collapse-item__header[data-v-4e11a983] {
53
+ .c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:last-child .collapse-item__header[data-v-08dc96f9] {
54
54
  border-radius: 0 0 8px 8px;
55
55
  }
56
- .c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:last-child.collapse-item--active .collapse-item__header[data-v-4e11a983] {
56
+ .c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:last-child.collapse-item--active .collapse-item__header[data-v-08dc96f9] {
57
57
  border-radius: 0;
58
58
  }
59
- .c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:only-child .collapse-item__header[data-v-4e11a983] {
59
+ .c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:only-child .collapse-item__header[data-v-08dc96f9] {
60
60
  border-radius: 8px;
61
61
  }
62
- .c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:only-child.collapse-item--active .collapse-item__header[data-v-4e11a983] {
62
+ .c-collapse-panel--bordered.c-collapse-panel--default .collapse-item:only-child.collapse-item--active .collapse-item__header[data-v-08dc96f9] {
63
63
  border-radius: 8px 8px 0 0;
64
64
  }
65
- .c-collapse-panel--icon-right .collapse-item__header[data-v-4e11a983] {
65
+ .c-collapse-panel--icon-right .collapse-item__header[data-v-08dc96f9] {
66
66
  flex-direction: row-reverse;
67
67
  }
68
- .c-collapse-panel--icon-right .collapse-item__arrow[data-v-4e11a983] {
68
+ .c-collapse-panel--icon-right .collapse-item__arrow[data-v-08dc96f9] {
69
69
  margin-left: auto;
70
70
  margin-right: 0;
71
71
  }
72
- .c-collapse-panel--icon-right .collapse-item__title-area[data-v-4e11a983] {
72
+ .c-collapse-panel--icon-right .collapse-item__title-area[data-v-08dc96f9] {
73
73
  margin-left: 0;
74
74
  }
75
75
 
76
76
  /* ─── 面板项 ─────────────────────────────────────── */
77
- .collapse-item--disabled .collapse-item__header[data-v-4e11a983] {
77
+ .collapse-item--disabled .collapse-item__header[data-v-08dc96f9] {
78
78
  cursor: not-allowed;
79
79
  opacity: 0.5;
80
80
  }
81
81
 
82
82
  /* ─── 面板头部 ───────────────────────────────────── */
83
- .collapse-item__header[data-v-4e11a983] {
83
+ .collapse-item__header[data-v-08dc96f9] {
84
84
  display: flex;
85
85
  align-items: center;
86
86
  gap: 8px;
@@ -91,17 +91,17 @@
91
91
  transition: background-color 0.15s ease;
92
92
  outline: none;
93
93
  }
94
- .collapse-item__header[data-v-4e11a983]:hover:not([aria-disabled=true]) {
94
+ .collapse-item__header[data-v-08dc96f9]:hover:not([aria-disabled=true]) {
95
95
  background: var(--c-bg-hover, rgba(0, 0, 0, 0.04));
96
96
  }
97
- .collapse-item__header[data-v-4e11a983]:focus-visible {
97
+ .collapse-item__header[data-v-08dc96f9]:focus-visible {
98
98
  outline: 2px solid var(--c-primary, #409eff);
99
99
  outline-offset: -2px;
100
100
  border-radius: 4px;
101
101
  }
102
102
 
103
103
  /* ─── 展开箭头 ───────────────────────────────────── */
104
- .collapse-item__arrow[data-v-4e11a983] {
104
+ .collapse-item__arrow[data-v-08dc96f9] {
105
105
  display: flex;
106
106
  align-items: center;
107
107
  justify-content: center;
@@ -112,26 +112,26 @@
112
112
  color: var(--c-text-3, #999);
113
113
  transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);
114
114
  }
115
- .collapse-item__arrow--expanded[data-v-4e11a983] {
115
+ .collapse-item__arrow--expanded[data-v-08dc96f9] {
116
116
  transform: rotate(90deg);
117
117
  }
118
118
 
119
119
  /* ─── 标题区域 ───────────────────────────────────── */
120
- .collapse-item__title-area[data-v-4e11a983] {
120
+ .collapse-item__title-area[data-v-08dc96f9] {
121
121
  flex: 1;
122
122
  min-width: 0;
123
123
  }
124
- .collapse-item__title-group[data-v-4e11a983] {
124
+ .collapse-item__title-group[data-v-08dc96f9] {
125
125
  display: flex;
126
126
  align-items: center;
127
127
  gap: 8px;
128
128
  }
129
- .collapse-item__icon[data-v-4e11a983] {
129
+ .collapse-item__icon[data-v-08dc96f9] {
130
130
  flex-shrink: 0;
131
131
  font-size: 18px;
132
132
  color: var(--c-primary, #409eff);
133
133
  }
134
- .collapse-item__title[data-v-4e11a983] {
134
+ .collapse-item__title[data-v-08dc96f9] {
135
135
  font-size: 14px;
136
136
  font-weight: 600;
137
137
  color: var(--c-text-1, #333);
@@ -139,7 +139,7 @@
139
139
  overflow: hidden;
140
140
  text-overflow: ellipsis;
141
141
  }
142
- .collapse-item__subtitle[data-v-4e11a983] {
142
+ .collapse-item__subtitle[data-v-08dc96f9] {
143
143
  font-size: 12px;
144
144
  color: var(--c-text-4, #ccc);
145
145
  white-space: nowrap;
@@ -148,7 +148,7 @@
148
148
  }
149
149
 
150
150
  /* ─── 头部右侧操作区 ────────────────────────────── */
151
- .collapse-item__extra[data-v-4e11a983] {
151
+ .collapse-item__extra[data-v-08dc96f9] {
152
152
  flex-shrink: 0;
153
153
  display: flex;
154
154
  align-items: center;
@@ -157,15 +157,15 @@
157
157
  }
158
158
 
159
159
  /* ─── 内容区域 ───────────────────────────────────── */
160
- .collapse-item__content-wrapper[data-v-4e11a983] {
160
+ .collapse-item__content-wrapper[data-v-08dc96f9] {
161
161
  transition: height 0.25s cubic-bezier(0.4, 0, 0.2, 1);
162
162
  will-change: height;
163
163
  }
164
- .collapse-item__content[data-v-4e11a983] {
164
+ .collapse-item__content[data-v-08dc96f9] {
165
165
  padding: 0 16px 16px;
166
166
  font-size: 14px;
167
167
  line-height: 1.6;
168
168
  color: var(--c-text-2, #666);
169
169
  }
170
170
 
171
- /*# sourceMappingURL=C_CollapsePanel-CWkFCqNQ.css.map*/
171
+ /*# sourceMappingURL=C_CollapsePanel-BkOivqn3.css.map*/
@@ -1 +1 @@
1
- {"version":3,"file":"C_CollapsePanel.js","names":["variant","bordered","expandIconPosition","items","$slots"],"sources":["../src/components/C_CollapsePanel/composables/useCollapsePanel.ts","../src/components/C_CollapsePanel/index.vue","../src/components/C_CollapsePanel/index.vue","../src/components/C_CollapsePanel/index.vue"],"sourcesContent":["import { ref, computed, watch } from 'vue'\r\nimport type { Ref } from 'vue'\r\nimport type { CollapsePanelItem } from '../types'\r\n\r\ninterface UseCollapsePanelOptions {\r\n /** 面板项配置 */\r\n items: Ref<CollapsePanelItem[]>\r\n /** 外部 v-model activeKeys */\r\n activeKeys: Ref<string[] | undefined>\r\n /** 非受控时的默认激活 key */\r\n defaultActiveKeys: string[]\r\n /** 是否手风琴模式 */\r\n accordion: Ref<boolean>\r\n /** localStorage 持久化 key */\r\n persistKey: Ref<string | undefined>\r\n /** activeKeys 变化回调 */\r\n onChange?: (keys: string[]) => void\r\n /** 单面板展开回调 */\r\n onExpand?: (key: string) => void\r\n /** 单面板折叠回调 */\r\n onCollapse?: (key: string) => void\r\n}\r\n\r\n/**\r\n * 折叠面板展开/折叠核心逻辑\r\n */\r\nexport function useCollapsePanel(options: UseCollapsePanelOptions) {\r\n const {\r\n items,\r\n activeKeys: externalKeys,\r\n defaultActiveKeys,\r\n accordion,\r\n persistKey,\r\n onChange,\r\n onExpand,\r\n onCollapse,\r\n } = options\r\n\r\n /* ─── 持久化读取 ──────────────────────────────── */\r\n const loadPersistedKeys = (): string[] | null => {\r\n if (!persistKey.value) return null\r\n try {\r\n const raw = localStorage.getItem(`collapse-panel:${persistKey.value}`)\r\n return raw ? JSON.parse(raw) : null\r\n } catch {\r\n return null\r\n }\r\n }\r\n\r\n const savePersistedKeys = (keys: string[]) => {\r\n if (!persistKey.value) return\r\n try {\r\n localStorage.setItem(\r\n `collapse-panel:${persistKey.value}`,\r\n JSON.stringify(keys),\r\n )\r\n } catch {\r\n /* 静默失败 */\r\n }\r\n }\r\n\r\n /* ─── 内部状态 ────────────────────────────────── */\r\n const resolveInitialKeys = (): string[] => {\r\n /* 优先级:外部 v-model > 持久化 > 默认值 */\r\n if (externalKeys.value !== undefined) return [...externalKeys.value]\r\n const persisted = loadPersistedKeys()\r\n if (persisted) return persisted\r\n return [...defaultActiveKeys]\r\n }\r\n\r\n const internalKeys = ref<string[]>(resolveInitialKeys())\r\n\r\n /** 懒渲染追踪:记录哪些面板曾被展开过 */\r\n const renderedOnce = ref<Set<string>>(new Set(internalKeys.value))\r\n\r\n /* ─── 计算属性 ────────────────────────────────── */\r\n /** 当前激活的 key 数组(兼容受控 / 非受控) */\r\n const currentKeys = computed<string[]>({\r\n get: () =>\r\n externalKeys.value !== undefined\r\n ? externalKeys.value\r\n : internalKeys.value,\r\n set: (val) => {\r\n internalKeys.value = val\r\n },\r\n })\r\n\r\n /**\r\n * 判断面板是否展开\r\n */\r\n const isExpanded = (key: string): boolean => {\r\n return currentKeys.value.includes(key)\r\n }\r\n\r\n /**\r\n * 判断面板是否应该渲染内容\r\n * - lazy 面板只有被展开过至少一次后才渲染\r\n * - destroyOnCollapse 面板在折叠后销毁 DOM\r\n */\r\n const shouldRender = (item: CollapsePanelItem): boolean => {\r\n const expanded = isExpanded(item.key)\r\n\r\n if (item.destroyOnCollapse) return expanded\r\n if (item.lazy) return renderedOnce.value.has(item.key)\r\n return true\r\n }\r\n\r\n /* ─── 操作方法 ────────────────────────────────── */\r\n const updateKeys = (newKeys: string[]) => {\r\n currentKeys.value = newKeys\r\n onChange?.(newKeys)\r\n savePersistedKeys(newKeys)\r\n }\r\n\r\n const toggle = (key: string) => {\r\n const item = items.value.find((i) => i.key === key)\r\n if (!item || item.disabled) return\r\n\r\n const expanded = isExpanded(key)\r\n\r\n if (expanded) {\r\n /* 折叠 */\r\n updateKeys(currentKeys.value.filter((k) => k !== key))\r\n onCollapse?.(key)\r\n } else {\r\n /* 展开 */\r\n renderedOnce.value.add(key)\r\n\r\n if (accordion.value) {\r\n /* 手风琴模式:关闭其他面板 */\r\n const prevKeys = currentKeys.value\r\n updateKeys([key])\r\n /* 通知被折叠的面板 */\r\n prevKeys.forEach((k) => {\r\n if (k !== key) onCollapse?.(k)\r\n })\r\n } else {\r\n updateKeys([...currentKeys.value, key])\r\n }\r\n onExpand?.(key)\r\n }\r\n }\r\n\r\n const expandAll = () => {\r\n if (accordion.value) return /* 手风琴模式不支持全展开 */\r\n\r\n const allKeys = items.value.filter((i) => !i.disabled).map((i) => i.key)\r\n\r\n allKeys.forEach((k) => renderedOnce.value.add(k))\r\n updateKeys(allKeys)\r\n }\r\n\r\n const collapseAll = () => {\r\n updateKeys([])\r\n }\r\n\r\n const getActiveKeys = (): string[] => {\r\n return [...currentKeys.value]\r\n }\r\n\r\n /* ─── 键盘导航 ────────────────────────────────── */\r\n const handleKeyDown = (e: KeyboardEvent, key: string) => {\r\n if (['Enter', ' '].includes(e.key)) {\r\n e.preventDefault()\r\n toggle(key)\r\n }\r\n }\r\n\r\n /* ─── 同步外部 v-model 变化 ───────────────────── */\r\n watch(\r\n () => externalKeys.value,\r\n (newVal) => {\r\n if (newVal !== undefined) {\r\n internalKeys.value = [...newVal]\r\n newVal.forEach((k) => renderedOnce.value.add(k))\r\n savePersistedKeys(newVal)\r\n }\r\n },\r\n )\r\n\r\n return {\r\n currentKeys,\r\n renderedOnce,\r\n isExpanded,\r\n shouldRender,\r\n toggle,\r\n expandAll,\r\n collapseAll,\r\n getActiveKeys,\r\n handleKeyDown,\r\n }\r\n}\r\n","/* unplugin-vue-components disabled */<!--\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2026-02-25\n * @Description: 折叠面板组件\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2026 by CHENY, All Rights Reserved.\n-->\n<template>\n <div\n ref=\"containerRef\"\n class=\"c-collapse-panel\"\n :class=\"[\n `c-collapse-panel--${variant}`,\n {\n 'c-collapse-panel--bordered': bordered,\n 'c-collapse-panel--icon-right': expandIconPosition === 'right',\n },\n ]\"\n >\n <div\n v-for=\"item in items\"\n :key=\"item.key\"\n :ref=\"el => setPanelRef(item.key, el as HTMLElement)\"\n class=\"collapse-item\"\n :class=\"{\n 'collapse-item--active': isExpanded(item.key),\n 'collapse-item--disabled': item.disabled,\n }\"\n >\n <!-- 面板头部 -->\n <div\n class=\"collapse-item__header\"\n role=\"button\"\n :aria-expanded=\"isExpanded(item.key)\"\n :aria-controls=\"`collapse-content-${item.key}`\"\n :aria-disabled=\"item.disabled\"\n :tabindex=\"item.disabled ? -1 : 0\"\n @click=\"!item.disabled && toggle(item.key)\"\n @keydown=\"handleKeyDown($event, item.key)\"\n >\n <!-- 展开图标 -->\n <span\n class=\"collapse-item__arrow\"\n :class=\"{ 'collapse-item__arrow--expanded': isExpanded(item.key) }\"\n >\n <C_Icon\n name=\"mdi:chevron-right\"\n :size=\"16\"\n color=\"currentColor\"\n />\n </span>\n\n <!-- 标题区域 -->\n <div class=\"collapse-item__title-area\">\n <slot\n :name=\"`header-${item.key}`\"\n :item=\"item\"\n :expanded=\"isExpanded(item.key)\"\n >\n <div class=\"collapse-item__title-group\">\n <C_Icon\n v-if=\"item.icon\"\n :name=\"item.icon\"\n :size=\"18\"\n color=\"currentColor\"\n class=\"collapse-item__icon\"\n />\n <span class=\"collapse-item__title\">{{ item.title }}</span>\n <span\n v-if=\"item.subtitle\"\n class=\"collapse-item__subtitle\"\n >\n {{ item.subtitle }}\n </span>\n </div>\n </slot>\n </div>\n\n <!-- 头部右侧操作区 -->\n <div\n v-if=\"$slots[`extra-${item.key}`]\"\n class=\"collapse-item__extra\"\n @click.stop\n >\n <slot\n :name=\"`extra-${item.key}`\"\n :item=\"item\"\n :expanded=\"isExpanded(item.key)\"\n />\n </div>\n </div>\n\n <!-- 面板内容 -->\n <Transition\n name=\"collapse-slide\"\n @enter=\"onEnter\"\n @after-enter=\"onAfterEnter\"\n @leave=\"onLeave\"\n @after-leave=\"onAfterLeave\"\n >\n <div\n v-show=\"isExpanded(item.key)\"\n :id=\"`collapse-content-${item.key}`\"\n class=\"collapse-item__content-wrapper\"\n role=\"region\"\n :aria-labelledby=\"`collapse-header-${item.key}`\"\n >\n <div\n v-if=\"shouldRender(item)\"\n class=\"collapse-item__content\"\n >\n <slot\n :name=\"`panel-${item.key}`\"\n :item=\"item\"\n :expanded=\"isExpanded(item.key)\"\n >\n <component\n :is=\"item.content\"\n v-if=\"item.content && typeof item.content !== 'string'\"\n />\n <template v-else-if=\"item.content\">{{ item.content }}</template>\n </slot>\n </div>\n </div>\n </Transition>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { ref, toRef } from 'vue'\n import C_Icon from '../C_Icon/index.vue'\n import { useCollapsePanel } from './composables/useCollapsePanel'\n import type {\n CollapsePanelExpose,\n CollapsePanelItem,\n CollapsePanelVariant,\n ExpandIconPosition,\n } from './types'\n\n defineOptions({ name: 'C_CollapsePanel' })\n\n interface Props {\n /** 面板项配置数组 */\n items: CollapsePanelItem[]\n /** 当前激活面板的 key 数组(v-model) */\n activeKeys?: string[]\n /** 默认展开的面板 key 数组 */\n defaultActiveKeys?: string[]\n /** 是否手风琴模式 */\n accordion?: boolean\n /** 面板样式变体 */\n variant?: CollapsePanelVariant\n /** 展开图标位置 */\n expandIconPosition?: ExpandIconPosition\n /** 是否显示边框 */\n bordered?: boolean\n /** 展开状态 localStorage 持久化 key */\n persistKey?: string\n }\n\n const props = withDefaults(defineProps<Props>(), {\n activeKeys: undefined,\n defaultActiveKeys: () => [],\n accordion: false,\n variant: 'default',\n expandIconPosition: 'left',\n bordered: true,\n persistKey: undefined,\n })\n\n const emit = defineEmits<{\n 'update:activeKeys': [keys: string[]]\n expand: [key: string]\n collapse: [key: string]\n change: [activeKeys: string[]]\n }>()\n\n const containerRef = ref<HTMLElement | null>(null)\n const panelRefs = ref<Map<string, HTMLElement>>(new Map())\n\n const setPanelRef = (key: string, el: HTMLElement | null) => {\n if (el) {\n panelRefs.value.set(key, el)\n } else {\n panelRefs.value.delete(key)\n }\n }\n\n const {\n isExpanded,\n shouldRender,\n toggle,\n expandAll,\n collapseAll,\n getActiveKeys,\n handleKeyDown,\n } = useCollapsePanel({\n items: toRef(props, 'items'),\n activeKeys: toRef(props, 'activeKeys'),\n defaultActiveKeys: props.defaultActiveKeys,\n accordion: toRef(props, 'accordion'),\n persistKey: toRef(props, 'persistKey'),\n onChange: keys => {\n emit('update:activeKeys', keys)\n emit('change', keys)\n },\n onExpand: key => emit('expand', key),\n onCollapse: key => emit('collapse', key),\n })\n\n /* ─── 展开/折叠动画 ──────────────────────────── */\n const onEnter = (el: Element) => {\n const element = el as HTMLElement\n element.style.height = '0'\n element.style.overflow = 'hidden'\n /* 强制 reflow */\n void element.offsetHeight\n element.style.height = `${element.scrollHeight}px`\n }\n\n const onAfterEnter = (el: Element) => {\n const element = el as HTMLElement\n element.style.height = ''\n element.style.overflow = ''\n }\n\n const onLeave = (el: Element) => {\n const element = el as HTMLElement\n element.style.height = `${element.scrollHeight}px`\n element.style.overflow = 'hidden'\n void element.offsetHeight\n element.style.height = '0'\n }\n\n const onAfterLeave = (el: Element) => {\n const element = el as HTMLElement\n element.style.height = ''\n element.style.overflow = ''\n }\n\n /* ─── 滚动到指定面板 ─────────────────────────── */\n const scrollToPanel = (key: string) => {\n const el = panelRefs.value.get(key)\n if (el) {\n el.scrollIntoView({ behavior: 'smooth', block: 'start' })\n }\n }\n\n /* ─── 暴露方法 ──────────────────────────────── */\n defineExpose<CollapsePanelExpose>({\n expandAll,\n collapseAll,\n toggle,\n getActiveKeys,\n scrollToPanel,\n })\n</script>\n\n<style lang=\"scss\" scoped>\n @use './index.scss';\n</style>\n","/* unplugin-vue-components disabled */<!--\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2026-02-25\n * @Description: 折叠面板组件\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2026 by CHENY, All Rights Reserved.\n-->\n<template>\n <div\n ref=\"containerRef\"\n class=\"c-collapse-panel\"\n :class=\"[\n `c-collapse-panel--${variant}`,\n {\n 'c-collapse-panel--bordered': bordered,\n 'c-collapse-panel--icon-right': expandIconPosition === 'right',\n },\n ]\"\n >\n <div\n v-for=\"item in items\"\n :key=\"item.key\"\n :ref=\"el => setPanelRef(item.key, el as HTMLElement)\"\n class=\"collapse-item\"\n :class=\"{\n 'collapse-item--active': isExpanded(item.key),\n 'collapse-item--disabled': item.disabled,\n }\"\n >\n <!-- 面板头部 -->\n <div\n class=\"collapse-item__header\"\n role=\"button\"\n :aria-expanded=\"isExpanded(item.key)\"\n :aria-controls=\"`collapse-content-${item.key}`\"\n :aria-disabled=\"item.disabled\"\n :tabindex=\"item.disabled ? -1 : 0\"\n @click=\"!item.disabled && toggle(item.key)\"\n @keydown=\"handleKeyDown($event, item.key)\"\n >\n <!-- 展开图标 -->\n <span\n class=\"collapse-item__arrow\"\n :class=\"{ 'collapse-item__arrow--expanded': isExpanded(item.key) }\"\n >\n <C_Icon\n name=\"mdi:chevron-right\"\n :size=\"16\"\n color=\"currentColor\"\n />\n </span>\n\n <!-- 标题区域 -->\n <div class=\"collapse-item__title-area\">\n <slot\n :name=\"`header-${item.key}`\"\n :item=\"item\"\n :expanded=\"isExpanded(item.key)\"\n >\n <div class=\"collapse-item__title-group\">\n <C_Icon\n v-if=\"item.icon\"\n :name=\"item.icon\"\n :size=\"18\"\n color=\"currentColor\"\n class=\"collapse-item__icon\"\n />\n <span class=\"collapse-item__title\">{{ item.title }}</span>\n <span\n v-if=\"item.subtitle\"\n class=\"collapse-item__subtitle\"\n >\n {{ item.subtitle }}\n </span>\n </div>\n </slot>\n </div>\n\n <!-- 头部右侧操作区 -->\n <div\n v-if=\"$slots[`extra-${item.key}`]\"\n class=\"collapse-item__extra\"\n @click.stop\n >\n <slot\n :name=\"`extra-${item.key}`\"\n :item=\"item\"\n :expanded=\"isExpanded(item.key)\"\n />\n </div>\n </div>\n\n <!-- 面板内容 -->\n <Transition\n name=\"collapse-slide\"\n @enter=\"onEnter\"\n @after-enter=\"onAfterEnter\"\n @leave=\"onLeave\"\n @after-leave=\"onAfterLeave\"\n >\n <div\n v-show=\"isExpanded(item.key)\"\n :id=\"`collapse-content-${item.key}`\"\n class=\"collapse-item__content-wrapper\"\n role=\"region\"\n :aria-labelledby=\"`collapse-header-${item.key}`\"\n >\n <div\n v-if=\"shouldRender(item)\"\n class=\"collapse-item__content\"\n >\n <slot\n :name=\"`panel-${item.key}`\"\n :item=\"item\"\n :expanded=\"isExpanded(item.key)\"\n >\n <component\n :is=\"item.content\"\n v-if=\"item.content && typeof item.content !== 'string'\"\n />\n <template v-else-if=\"item.content\">{{ item.content }}</template>\n </slot>\n </div>\n </div>\n </Transition>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { ref, toRef } from 'vue'\n import C_Icon from '../C_Icon/index.vue'\n import { useCollapsePanel } from './composables/useCollapsePanel'\n import type {\n CollapsePanelExpose,\n CollapsePanelItem,\n CollapsePanelVariant,\n ExpandIconPosition,\n } from './types'\n\n defineOptions({ name: 'C_CollapsePanel' })\n\n interface Props {\n /** 面板项配置数组 */\n items: CollapsePanelItem[]\n /** 当前激活面板的 key 数组(v-model) */\n activeKeys?: string[]\n /** 默认展开的面板 key 数组 */\n defaultActiveKeys?: string[]\n /** 是否手风琴模式 */\n accordion?: boolean\n /** 面板样式变体 */\n variant?: CollapsePanelVariant\n /** 展开图标位置 */\n expandIconPosition?: ExpandIconPosition\n /** 是否显示边框 */\n bordered?: boolean\n /** 展开状态 localStorage 持久化 key */\n persistKey?: string\n }\n\n const props = withDefaults(defineProps<Props>(), {\n activeKeys: undefined,\n defaultActiveKeys: () => [],\n accordion: false,\n variant: 'default',\n expandIconPosition: 'left',\n bordered: true,\n persistKey: undefined,\n })\n\n const emit = defineEmits<{\n 'update:activeKeys': [keys: string[]]\n expand: [key: string]\n collapse: [key: string]\n change: [activeKeys: string[]]\n }>()\n\n const containerRef = ref<HTMLElement | null>(null)\n const panelRefs = ref<Map<string, HTMLElement>>(new Map())\n\n const setPanelRef = (key: string, el: HTMLElement | null) => {\n if (el) {\n panelRefs.value.set(key, el)\n } else {\n panelRefs.value.delete(key)\n }\n }\n\n const {\n isExpanded,\n shouldRender,\n toggle,\n expandAll,\n collapseAll,\n getActiveKeys,\n handleKeyDown,\n } = useCollapsePanel({\n items: toRef(props, 'items'),\n activeKeys: toRef(props, 'activeKeys'),\n defaultActiveKeys: props.defaultActiveKeys,\n accordion: toRef(props, 'accordion'),\n persistKey: toRef(props, 'persistKey'),\n onChange: keys => {\n emit('update:activeKeys', keys)\n emit('change', keys)\n },\n onExpand: key => emit('expand', key),\n onCollapse: key => emit('collapse', key),\n })\n\n /* ─── 展开/折叠动画 ──────────────────────────── */\n const onEnter = (el: Element) => {\n const element = el as HTMLElement\n element.style.height = '0'\n element.style.overflow = 'hidden'\n /* 强制 reflow */\n void element.offsetHeight\n element.style.height = `${element.scrollHeight}px`\n }\n\n const onAfterEnter = (el: Element) => {\n const element = el as HTMLElement\n element.style.height = ''\n element.style.overflow = ''\n }\n\n const onLeave = (el: Element) => {\n const element = el as HTMLElement\n element.style.height = `${element.scrollHeight}px`\n element.style.overflow = 'hidden'\n void element.offsetHeight\n element.style.height = '0'\n }\n\n const onAfterLeave = (el: Element) => {\n const element = el as HTMLElement\n element.style.height = ''\n element.style.overflow = ''\n }\n\n /* ─── 滚动到指定面板 ─────────────────────────── */\n const scrollToPanel = (key: string) => {\n const el = panelRefs.value.get(key)\n if (el) {\n el.scrollIntoView({ behavior: 'smooth', block: 'start' })\n }\n }\n\n /* ─── 暴露方法 ──────────────────────────────── */\n defineExpose<CollapsePanelExpose>({\n expandAll,\n collapseAll,\n toggle,\n getActiveKeys,\n scrollToPanel,\n })\n</script>\n\n<style lang=\"scss\" scoped>\n @use './index.scss';\n</style>\n","<!--\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2026-02-25\n * @Description: 折叠面板组件\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2026 by CHENY, All Rights Reserved.\n-->\n<template>\n <div\n ref=\"containerRef\"\n class=\"c-collapse-panel\"\n :class=\"[\n `c-collapse-panel--${variant}`,\n {\n 'c-collapse-panel--bordered': bordered,\n 'c-collapse-panel--icon-right': expandIconPosition === 'right',\n },\n ]\"\n >\n <div\n v-for=\"item in items\"\n :key=\"item.key\"\n :ref=\"el => setPanelRef(item.key, el as HTMLElement)\"\n class=\"collapse-item\"\n :class=\"{\n 'collapse-item--active': isExpanded(item.key),\n 'collapse-item--disabled': item.disabled,\n }\"\n >\n <!-- 面板头部 -->\n <div\n class=\"collapse-item__header\"\n role=\"button\"\n :aria-expanded=\"isExpanded(item.key)\"\n :aria-controls=\"`collapse-content-${item.key}`\"\n :aria-disabled=\"item.disabled\"\n :tabindex=\"item.disabled ? -1 : 0\"\n @click=\"!item.disabled && toggle(item.key)\"\n @keydown=\"handleKeyDown($event, item.key)\"\n >\n <!-- 展开图标 -->\n <span\n class=\"collapse-item__arrow\"\n :class=\"{ 'collapse-item__arrow--expanded': isExpanded(item.key) }\"\n >\n <C_Icon\n name=\"mdi:chevron-right\"\n :size=\"16\"\n color=\"currentColor\"\n />\n </span>\n\n <!-- 标题区域 -->\n <div class=\"collapse-item__title-area\">\n <slot\n :name=\"`header-${item.key}`\"\n :item=\"item\"\n :expanded=\"isExpanded(item.key)\"\n >\n <div class=\"collapse-item__title-group\">\n <C_Icon\n v-if=\"item.icon\"\n :name=\"item.icon\"\n :size=\"18\"\n color=\"currentColor\"\n class=\"collapse-item__icon\"\n />\n <span class=\"collapse-item__title\">{{ item.title }}</span>\n <span\n v-if=\"item.subtitle\"\n class=\"collapse-item__subtitle\"\n >\n {{ item.subtitle }}\n </span>\n </div>\n </slot>\n </div>\n\n <!-- 头部右侧操作区 -->\n <div\n v-if=\"$slots[`extra-${item.key}`]\"\n class=\"collapse-item__extra\"\n @click.stop\n >\n <slot\n :name=\"`extra-${item.key}`\"\n :item=\"item\"\n :expanded=\"isExpanded(item.key)\"\n />\n </div>\n </div>\n\n <!-- 面板内容 -->\n <Transition\n name=\"collapse-slide\"\n @enter=\"onEnter\"\n @after-enter=\"onAfterEnter\"\n @leave=\"onLeave\"\n @after-leave=\"onAfterLeave\"\n >\n <div\n v-show=\"isExpanded(item.key)\"\n :id=\"`collapse-content-${item.key}`\"\n class=\"collapse-item__content-wrapper\"\n role=\"region\"\n :aria-labelledby=\"`collapse-header-${item.key}`\"\n >\n <div\n v-if=\"shouldRender(item)\"\n class=\"collapse-item__content\"\n >\n <slot\n :name=\"`panel-${item.key}`\"\n :item=\"item\"\n :expanded=\"isExpanded(item.key)\"\n >\n <component\n :is=\"item.content\"\n v-if=\"item.content && typeof item.content !== 'string'\"\n />\n <template v-else-if=\"item.content\">{{ item.content }}</template>\n </slot>\n </div>\n </div>\n </Transition>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { ref, toRef } from 'vue'\n import C_Icon from '../C_Icon/index.vue'\n import { useCollapsePanel } from './composables/useCollapsePanel'\n import type {\n CollapsePanelExpose,\n CollapsePanelItem,\n CollapsePanelVariant,\n ExpandIconPosition,\n } from './types'\n\n defineOptions({ name: 'C_CollapsePanel' })\n\n interface Props {\n /** 面板项配置数组 */\n items: CollapsePanelItem[]\n /** 当前激活面板的 key 数组(v-model) */\n activeKeys?: string[]\n /** 默认展开的面板 key 数组 */\n defaultActiveKeys?: string[]\n /** 是否手风琴模式 */\n accordion?: boolean\n /** 面板样式变体 */\n variant?: CollapsePanelVariant\n /** 展开图标位置 */\n expandIconPosition?: ExpandIconPosition\n /** 是否显示边框 */\n bordered?: boolean\n /** 展开状态 localStorage 持久化 key */\n persistKey?: string\n }\n\n const props = withDefaults(defineProps<Props>(), {\n activeKeys: undefined,\n defaultActiveKeys: () => [],\n accordion: false,\n variant: 'default',\n expandIconPosition: 'left',\n bordered: true,\n persistKey: undefined,\n })\n\n const emit = defineEmits<{\n 'update:activeKeys': [keys: string[]]\n expand: [key: string]\n collapse: [key: string]\n change: [activeKeys: string[]]\n }>()\n\n const containerRef = ref<HTMLElement | null>(null)\n const panelRefs = ref<Map<string, HTMLElement>>(new Map())\n\n const setPanelRef = (key: string, el: HTMLElement | null) => {\n if (el) {\n panelRefs.value.set(key, el)\n } else {\n panelRefs.value.delete(key)\n }\n }\n\n const {\n isExpanded,\n shouldRender,\n toggle,\n expandAll,\n collapseAll,\n getActiveKeys,\n handleKeyDown,\n } = useCollapsePanel({\n items: toRef(props, 'items'),\n activeKeys: toRef(props, 'activeKeys'),\n defaultActiveKeys: props.defaultActiveKeys,\n accordion: toRef(props, 'accordion'),\n persistKey: toRef(props, 'persistKey'),\n onChange: keys => {\n emit('update:activeKeys', keys)\n emit('change', keys)\n },\n onExpand: key => emit('expand', key),\n onCollapse: key => emit('collapse', key),\n })\n\n /* ─── 展开/折叠动画 ──────────────────────────── */\n const onEnter = (el: Element) => {\n const element = el as HTMLElement\n element.style.height = '0'\n element.style.overflow = 'hidden'\n /* 强制 reflow */\n void element.offsetHeight\n element.style.height = `${element.scrollHeight}px`\n }\n\n const onAfterEnter = (el: Element) => {\n const element = el as HTMLElement\n element.style.height = ''\n element.style.overflow = ''\n }\n\n const onLeave = (el: Element) => {\n const element = el as HTMLElement\n element.style.height = `${element.scrollHeight}px`\n element.style.overflow = 'hidden'\n void element.offsetHeight\n element.style.height = '0'\n }\n\n const onAfterLeave = (el: Element) => {\n const element = el as HTMLElement\n element.style.height = ''\n element.style.overflow = ''\n }\n\n /* ─── 滚动到指定面板 ─────────────────────────── */\n const scrollToPanel = (key: string) => {\n const el = panelRefs.value.get(key)\n if (el) {\n el.scrollIntoView({ behavior: 'smooth', block: 'start' })\n }\n }\n\n /* ─── 暴露方法 ──────────────────────────────── */\n defineExpose<CollapsePanelExpose>({\n expandAll,\n collapseAll,\n toggle,\n getActiveKeys,\n scrollToPanel,\n })\n</script>\n\n<style lang=\"scss\" scoped>\n @use './index.scss';\n</style>\n"],"mappings":"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"}
1
+ {"version":3,"file":"C_CollapsePanel.js","names":["variant","bordered","expandIconPosition","items","$slots"],"sources":["../src/components/C_CollapsePanel/composables/useCollapsePanel.ts","../src/components/C_CollapsePanel/index.vue","../src/components/C_CollapsePanel/index.vue","../src/components/C_CollapsePanel/index.vue"],"sourcesContent":["import { ref, computed, watch } from 'vue'\r\nimport type { Ref } from 'vue'\r\nimport type { CollapsePanelItem } from '../types'\r\n\r\ninterface UseCollapsePanelOptions {\r\n /** 面板项配置 */\r\n items: Ref<CollapsePanelItem[]>\r\n /** 外部 v-model activeKeys */\r\n activeKeys: Ref<string[] | undefined>\r\n /** 非受控时的默认激活 key */\r\n defaultActiveKeys: string[]\r\n /** 是否手风琴模式 */\r\n accordion: Ref<boolean>\r\n /** localStorage 持久化 key */\r\n persistKey: Ref<string | undefined>\r\n /** activeKeys 变化回调 */\r\n onChange?: (keys: string[]) => void\r\n /** 单面板展开回调 */\r\n onExpand?: (key: string) => void\r\n /** 单面板折叠回调 */\r\n onCollapse?: (key: string) => void\r\n}\r\n\r\n/**\r\n * 折叠面板展开/折叠核心逻辑\r\n */\r\nexport function useCollapsePanel(options: UseCollapsePanelOptions) {\r\n const {\r\n items,\r\n activeKeys: externalKeys,\r\n defaultActiveKeys,\r\n accordion,\r\n persistKey,\r\n onChange,\r\n onExpand,\r\n onCollapse,\r\n } = options\r\n\r\n /* ─── 持久化读取 ──────────────────────────────── */\r\n const loadPersistedKeys = (): string[] | null => {\r\n if (!persistKey.value) return null\r\n try {\r\n const raw = localStorage.getItem(`collapse-panel:${persistKey.value}`)\r\n return raw ? JSON.parse(raw) : null\r\n } catch {\r\n return null\r\n }\r\n }\r\n\r\n const savePersistedKeys = (keys: string[]) => {\r\n if (!persistKey.value) return\r\n try {\r\n localStorage.setItem(\r\n `collapse-panel:${persistKey.value}`,\r\n JSON.stringify(keys),\r\n )\r\n } catch {\r\n /* 静默失败 */\r\n }\r\n }\r\n\r\n /* ─── 内部状态 ────────────────────────────────── */\r\n const resolveInitialKeys = (): string[] => {\r\n /* 优先级:外部 v-model > 持久化 > 默认值 */\r\n if (externalKeys.value !== undefined) return [...externalKeys.value]\r\n const persisted = loadPersistedKeys()\r\n if (persisted) return persisted\r\n return [...defaultActiveKeys]\r\n }\r\n\r\n const internalKeys = ref<string[]>(resolveInitialKeys())\r\n\r\n /** 懒渲染追踪:记录哪些面板曾被展开过 */\r\n const renderedOnce = ref<Set<string>>(new Set(internalKeys.value))\r\n\r\n /* ─── 计算属性 ────────────────────────────────── */\r\n /** 当前激活的 key 数组(兼容受控 / 非受控) */\r\n const currentKeys = computed<string[]>({\r\n get: () =>\r\n externalKeys.value !== undefined\r\n ? externalKeys.value\r\n : internalKeys.value,\r\n set: (val) => {\r\n internalKeys.value = val\r\n },\r\n })\r\n\r\n /**\r\n * 判断面板是否展开\r\n */\r\n const isExpanded = (key: string): boolean => {\r\n return currentKeys.value.includes(key)\r\n }\r\n\r\n /**\r\n * 判断面板是否应该渲染内容\r\n * - lazy 面板只有被展开过至少一次后才渲染\r\n * - destroyOnCollapse 面板在折叠后销毁 DOM\r\n */\r\n const shouldRender = (item: CollapsePanelItem): boolean => {\r\n const expanded = isExpanded(item.key)\r\n\r\n if (item.destroyOnCollapse) return expanded\r\n if (item.lazy) return renderedOnce.value.has(item.key)\r\n return true\r\n }\r\n\r\n /* ─── 操作方法 ────────────────────────────────── */\r\n const updateKeys = (newKeys: string[]) => {\r\n currentKeys.value = newKeys\r\n onChange?.(newKeys)\r\n savePersistedKeys(newKeys)\r\n }\r\n\r\n const toggle = (key: string) => {\r\n const item = items.value.find((i) => i.key === key)\r\n if (!item || item.disabled) return\r\n\r\n const expanded = isExpanded(key)\r\n\r\n if (expanded) {\r\n /* 折叠 */\r\n updateKeys(currentKeys.value.filter((k) => k !== key))\r\n onCollapse?.(key)\r\n } else {\r\n /* 展开 */\r\n renderedOnce.value.add(key)\r\n\r\n if (accordion.value) {\r\n /* 手风琴模式:关闭其他面板 */\r\n const prevKeys = currentKeys.value\r\n updateKeys([key])\r\n /* 通知被折叠的面板 */\r\n prevKeys.forEach((k) => {\r\n if (k !== key) onCollapse?.(k)\r\n })\r\n } else {\r\n updateKeys([...currentKeys.value, key])\r\n }\r\n onExpand?.(key)\r\n }\r\n }\r\n\r\n const expandAll = () => {\r\n if (accordion.value) return /* 手风琴模式不支持全展开 */\r\n\r\n const allKeys = items.value.filter((i) => !i.disabled).map((i) => i.key)\r\n\r\n allKeys.forEach((k) => renderedOnce.value.add(k))\r\n updateKeys(allKeys)\r\n }\r\n\r\n const collapseAll = () => {\r\n updateKeys([])\r\n }\r\n\r\n const getActiveKeys = (): string[] => {\r\n return [...currentKeys.value]\r\n }\r\n\r\n /* ─── 键盘导航 ────────────────────────────────── */\r\n const handleKeyDown = (e: KeyboardEvent, key: string) => {\r\n if (['Enter', ' '].includes(e.key)) {\r\n e.preventDefault()\r\n toggle(key)\r\n }\r\n }\r\n\r\n /* ─── 同步外部 v-model 变化 ───────────────────── */\r\n watch(\r\n () => externalKeys.value,\r\n (newVal) => {\r\n if (newVal !== undefined) {\r\n internalKeys.value = [...newVal]\r\n newVal.forEach((k) => renderedOnce.value.add(k))\r\n savePersistedKeys(newVal)\r\n }\r\n },\r\n )\r\n\r\n return {\r\n currentKeys,\r\n renderedOnce,\r\n isExpanded,\r\n shouldRender,\r\n toggle,\r\n expandAll,\r\n collapseAll,\r\n getActiveKeys,\r\n handleKeyDown,\r\n }\r\n}\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2026-02-25\r\n * @Description: 折叠面板组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n ref=\"containerRef\"\r\n class=\"c-collapse-panel\"\r\n :class=\"[\r\n `c-collapse-panel--${variant}`,\r\n {\r\n 'c-collapse-panel--bordered': bordered,\r\n 'c-collapse-panel--icon-right': expandIconPosition === 'right',\r\n },\r\n ]\"\r\n >\r\n <div\r\n v-for=\"item in items\"\r\n :key=\"item.key\"\r\n :ref=\"el => setPanelRef(item.key, el as HTMLElement)\"\r\n class=\"collapse-item\"\r\n :class=\"{\r\n 'collapse-item--active': isExpanded(item.key),\r\n 'collapse-item--disabled': item.disabled,\r\n }\"\r\n >\r\n <!-- 面板头部 -->\r\n <div\r\n class=\"collapse-item__header\"\r\n role=\"button\"\r\n :aria-expanded=\"isExpanded(item.key)\"\r\n :aria-controls=\"`collapse-content-${item.key}`\"\r\n :aria-disabled=\"item.disabled\"\r\n :tabindex=\"item.disabled ? -1 : 0\"\r\n @click=\"!item.disabled && toggle(item.key)\"\r\n @keydown=\"handleKeyDown($event, item.key)\"\r\n >\r\n <!-- 展开图标 -->\r\n <span\r\n class=\"collapse-item__arrow\"\r\n :class=\"{ 'collapse-item__arrow--expanded': isExpanded(item.key) }\"\r\n >\r\n <C_Icon\r\n name=\"mdi:chevron-right\"\r\n :size=\"16\"\r\n color=\"currentColor\"\r\n />\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\r\n v-if=\"item.subtitle\"\r\n class=\"collapse-item__subtitle\"\r\n >\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\r\n v-if=\"shouldRender(item)\"\r\n class=\"collapse-item__content\"\r\n >\r\n <slot\r\n :name=\"`panel-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n >\r\n <component\r\n :is=\"item.content\"\r\n v-if=\"item.content && typeof item.content !== 'string'\"\r\n />\r\n <template v-else-if=\"item.content\">{{ item.content }}</template>\r\n </slot>\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\n import { ref, toRef } from 'vue'\r\n import C_Icon from '../C_Icon/index.vue'\r\n import { useCollapsePanel } from './composables/useCollapsePanel'\r\n import type {\r\n CollapsePanelExpose,\r\n CollapsePanelItem,\r\n CollapsePanelVariant,\r\n ExpandIconPosition,\r\n } from './types'\r\n\r\n defineOptions({ name: 'C_CollapsePanel' })\r\n\r\n interface 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\n const 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\n const 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\n const containerRef = ref<HTMLElement | null>(null)\r\n const panelRefs = ref<Map<string, HTMLElement>>(new Map())\r\n\r\n const 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\n const {\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\n const 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\n const 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\n const 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\n const 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\n const 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\n defineExpose<CollapsePanelExpose>({\r\n expandAll,\r\n collapseAll,\r\n toggle,\r\n getActiveKeys,\r\n scrollToPanel,\r\n })\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n @use './index.scss';\r\n</style>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2026-02-25\r\n * @Description: 折叠面板组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n ref=\"containerRef\"\r\n class=\"c-collapse-panel\"\r\n :class=\"[\r\n `c-collapse-panel--${variant}`,\r\n {\r\n 'c-collapse-panel--bordered': bordered,\r\n 'c-collapse-panel--icon-right': expandIconPosition === 'right',\r\n },\r\n ]\"\r\n >\r\n <div\r\n v-for=\"item in items\"\r\n :key=\"item.key\"\r\n :ref=\"el => setPanelRef(item.key, el as HTMLElement)\"\r\n class=\"collapse-item\"\r\n :class=\"{\r\n 'collapse-item--active': isExpanded(item.key),\r\n 'collapse-item--disabled': item.disabled,\r\n }\"\r\n >\r\n <!-- 面板头部 -->\r\n <div\r\n class=\"collapse-item__header\"\r\n role=\"button\"\r\n :aria-expanded=\"isExpanded(item.key)\"\r\n :aria-controls=\"`collapse-content-${item.key}`\"\r\n :aria-disabled=\"item.disabled\"\r\n :tabindex=\"item.disabled ? -1 : 0\"\r\n @click=\"!item.disabled && toggle(item.key)\"\r\n @keydown=\"handleKeyDown($event, item.key)\"\r\n >\r\n <!-- 展开图标 -->\r\n <span\r\n class=\"collapse-item__arrow\"\r\n :class=\"{ 'collapse-item__arrow--expanded': isExpanded(item.key) }\"\r\n >\r\n <C_Icon\r\n name=\"mdi:chevron-right\"\r\n :size=\"16\"\r\n color=\"currentColor\"\r\n />\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\r\n v-if=\"item.subtitle\"\r\n class=\"collapse-item__subtitle\"\r\n >\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\r\n v-if=\"shouldRender(item)\"\r\n class=\"collapse-item__content\"\r\n >\r\n <slot\r\n :name=\"`panel-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n >\r\n <component\r\n :is=\"item.content\"\r\n v-if=\"item.content && typeof item.content !== 'string'\"\r\n />\r\n <template v-else-if=\"item.content\">{{ item.content }}</template>\r\n </slot>\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\n import { ref, toRef } from 'vue'\r\n import C_Icon from '../C_Icon/index.vue'\r\n import { useCollapsePanel } from './composables/useCollapsePanel'\r\n import type {\r\n CollapsePanelExpose,\r\n CollapsePanelItem,\r\n CollapsePanelVariant,\r\n ExpandIconPosition,\r\n } from './types'\r\n\r\n defineOptions({ name: 'C_CollapsePanel' })\r\n\r\n interface 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\n const 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\n const 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\n const containerRef = ref<HTMLElement | null>(null)\r\n const panelRefs = ref<Map<string, HTMLElement>>(new Map())\r\n\r\n const 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\n const {\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\n const 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\n const 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\n const 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\n const 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\n const 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\n defineExpose<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\r\n name=\"mdi:chevron-right\"\r\n :size=\"16\"\r\n color=\"currentColor\"\r\n />\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\r\n v-if=\"item.subtitle\"\r\n class=\"collapse-item__subtitle\"\r\n >\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\r\n v-if=\"shouldRender(item)\"\r\n class=\"collapse-item__content\"\r\n >\r\n <slot\r\n :name=\"`panel-${item.key}`\"\r\n :item=\"item\"\r\n :expanded=\"isExpanded(item.key)\"\r\n >\r\n <component\r\n :is=\"item.content\"\r\n v-if=\"item.content && typeof item.content !== 'string'\"\r\n />\r\n <template v-else-if=\"item.content\">{{ item.content }}</template>\r\n </slot>\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\n import { ref, toRef } from 'vue'\r\n import C_Icon from '../C_Icon/index.vue'\r\n import { useCollapsePanel } from './composables/useCollapsePanel'\r\n import type {\r\n CollapsePanelExpose,\r\n CollapsePanelItem,\r\n CollapsePanelVariant,\r\n ExpandIconPosition,\r\n } from './types'\r\n\r\n defineOptions({ name: 'C_CollapsePanel' })\r\n\r\n interface 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\n const 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\n const 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\n const containerRef = ref<HTMLElement | null>(null)\r\n const panelRefs = ref<Map<string, HTMLElement>>(new Map())\r\n\r\n const 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\n const {\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\n const 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\n const 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\n const 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\n const 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\n const 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\n defineExpose<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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"}