@robot-admin/naive-ui-components 0.10.2 → 0.10.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +5 -2
  3. package/dist/{C_AudioPlayer-Cj4lUdZo.css.map → C_AudioPlayer-ldTy9Y34.css.map} +1 -1
  4. package/dist/{C_AvatarGroup-D3PwsKME.css.map → C_AvatarGroup-SIzxuuZr.css.map} +1 -1
  5. package/dist/{C_Breadcrumb-DOcLt9uX.css.map → C_Breadcrumb-Bqqrl8nX.css.map} +1 -1
  6. package/dist/C_Breadcrumb.d.cts +2 -2
  7. package/dist/C_Breadcrumb.d.ts +2 -1
  8. package/dist/C_Captcha.d.cts +1 -1
  9. package/dist/C_Cascade.d.cts +1 -1
  10. package/dist/{C_Chat-DwatUQqu.css.map → C_Chat-CF1SU7mc.css.map} +1 -1
  11. package/dist/C_Chat.css +1 -1
  12. package/dist/C_Chat.d.cts +1 -1
  13. package/dist/C_City.d.cts +1 -1
  14. package/dist/C_Code.d.cts +1 -1
  15. package/dist/{C_ContextMenu-CD0iaSju.css.map → C_ContextMenu-Bn_uhJSo.css.map} +1 -1
  16. package/dist/C_ContextMenu.css +1 -1
  17. package/dist/C_ContextMenu.d.cts +1 -1
  18. package/dist/C_Date.d.cts +1 -1
  19. package/dist/C_Editor.d.cts +1 -1
  20. package/dist/C_Guide.d.cts +1 -1
  21. package/dist/C_Icon.d.cts +1 -1
  22. package/dist/C_Language.d.cts +1 -1
  23. package/dist/{C_Login-BrQBs_m4.css.map → C_Login-B3qYkLrN.css.map} +1 -1
  24. package/dist/C_Login.css +1 -1
  25. package/dist/C_Login.d.cts +1 -1
  26. package/dist/C_Markdown.d.cts +1 -1
  27. package/dist/C_Menu.cjs +1 -1
  28. package/dist/C_Menu.d.cts +2 -2
  29. package/dist/C_Menu.d.ts +2 -1
  30. package/dist/C_Menu.js +1 -1
  31. package/dist/C_Menu.js.map +1 -1
  32. package/dist/C_Menu2.js +1 -1
  33. package/dist/C_Menu2.js.map +1 -1
  34. package/dist/{C_OrgChart-BXEp4i4w.css.map → C_OrgChart-ChZu346B.css.map} +1 -1
  35. package/dist/C_OrgChart.css +1 -1
  36. package/dist/{C_Skeleton-BJoFYwrF.css.map → C_Skeleton-BNPbaut7.css.map} +1 -1
  37. package/dist/C_Skeleton.css +1 -1
  38. package/dist/{C_TagsView-DtGtYhBH.css.map → C_TagsView-BN8vMRsY.css.map} +1 -1
  39. package/dist/C_TagsView.css +1 -1
  40. package/dist/C_TagsView.d.cts +1 -1
  41. package/dist/C_TagsView.d.ts +2 -1
  42. package/dist/{C_Timeline-irQcO-b7.css.map → C_Timeline-4rk0Dzgn.css.map} +1 -1
  43. package/dist/C_Timeline.css +1 -1
  44. package/dist/{C_Transfer-11y3k-WD.css.map → C_Transfer-B-vjvhjI.css.map} +1 -1
  45. package/dist/C_Transfer.css +1 -1
  46. package/dist/_shared.cjs +1 -0
  47. package/dist/_shared.d.cts +2 -0
  48. package/dist/_shared.d.ts +2 -0
  49. package/dist/_shared.js +1 -0
  50. package/dist/constants.d.ts +5 -5
  51. package/dist/constants2.d.ts +4 -4
  52. package/dist/constants3.d.ts +3 -3
  53. package/dist/constants4.d.ts +5 -5
  54. package/dist/constants5.d.ts +2 -2
  55. package/dist/data.d.ts +2 -2
  56. package/dist/index.cjs +1 -1
  57. package/dist/index.cjs.map +1 -1
  58. package/dist/index.d.cts +16 -16
  59. package/dist/index.d.ts +107 -154
  60. package/dist/index.js +1 -1
  61. package/dist/index.js.map +1 -1
  62. package/dist/index10.vue.d.ts +1 -1
  63. package/dist/index11.vue.d.ts +1 -1
  64. package/dist/index12.vue.d.ts +3 -3
  65. package/dist/index13.vue.d.ts +3 -3
  66. package/dist/index14.vue.d.ts +3 -3
  67. package/dist/index15.vue.d.ts +5 -5
  68. package/dist/index16.vue.d.ts +2 -2
  69. package/dist/index17.vue.d.ts +1 -1
  70. package/dist/index18.vue.d.ts +5 -5
  71. package/dist/index19.vue.d.ts +2 -2
  72. package/dist/index2.vue.d.ts +6 -6
  73. package/dist/index20.vue.d.ts +1 -1
  74. package/dist/index21.vue.d.ts +1 -1
  75. package/dist/index22.vue.d.ts +1 -1
  76. package/dist/index23.vue.d.ts +2 -2
  77. package/dist/index24.vue.d.ts +2 -2
  78. package/dist/index26.vue.d.ts +4 -4
  79. package/dist/index27.vue.d.ts +3 -3
  80. package/dist/index28.vue.d.ts +4 -4
  81. package/dist/index3.vue.d.ts +2 -2
  82. package/dist/index4.vue.d.ts +4 -4
  83. package/dist/index5.vue.d.ts +1 -1
  84. package/dist/index6.vue.d.ts +2 -2
  85. package/dist/index7.vue.d.ts +2 -2
  86. package/dist/index8.vue.d.ts +1 -1
  87. package/dist/index9.vue.d.ts +2 -2
  88. package/dist/{types.d.ts → menuAdapter.d.ts} +61 -2
  89. package/dist/menuAdapter.js +2 -0
  90. package/dist/menuAdapter.js.map +1 -0
  91. package/dist/style.css +16 -16
  92. package/dist/useCollapsePanel.d.ts +1 -1
  93. package/dist/useCropperCore.d.ts +5 -5
  94. package/dist/useDraggableLayout.d.ts +5 -5
  95. package/dist/useDynamicFormState.d.ts +2 -2
  96. package/dist/useEdgeInteraction.d.ts +1 -1
  97. package/dist/useInfiniteScroll.d.ts +3 -3
  98. package/dist/useModalEdit.d.ts +3 -3
  99. package/dist/useQRCode.d.ts +3 -3
  100. package/dist/useSearchState.d.ts +2 -2
  101. package/dist/useSignatureHistory.d.ts +3 -3
  102. package/dist/useSplitResize.d.ts +1 -1
  103. package/dist/useTimeSelection.d.ts +3 -3
  104. package/dist/useTreeOperations.d.ts +2 -2
  105. package/dist/useWorkflowValidation.d.ts +7 -7
  106. package/package.json +3 -2
  107. package/dist/index2.d.ts +0 -120
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @robot-admin/naive-ui-components
2
2
 
3
+ ## 0.10.3
4
+
5
+ ### Patch Changes
6
+
7
+ - 修复内部共享入口与根声明文件重名导致的类型导出丢失,并增加构建后公共 JS/DTS 入口校验。
8
+
3
9
  ## 0.10.2
4
10
 
5
11
  ### Patch Changes
package/README.md CHANGED
@@ -204,14 +204,15 @@ bun add expr-eval
204
204
 
205
205
  ### 🏗️ 构建架构
206
206
 
207
- #### 四阶段构建流水线
207
+ #### 五阶段构建流水线
208
208
 
209
209
  ```
210
210
  bun run build
211
211
  ├── 1. tsdown → 多入口打包(51 组件 ESM/CJS/DTS)
212
212
  ├── 2. sass CLI → 编译 global.scss → global-scss.css
213
213
  ├── 3. merge-css.js → 合并 SFC CSS + global SCSS → style.css
214
- └── 4. gen-exports.js → 自动生成 package.json exports 映射
214
+ ├── 4. gen-exports.js → 自动生成 package.json exports 映射
215
+ └── 5. check:dist → 校验根入口、子路径及 DTS 公共导出
215
216
  ```
216
217
 
217
218
  #### 技术要点
@@ -222,6 +223,7 @@ bun run build
222
223
  - **类型导出**:统一 `export *` barrel 模式,自动生成完整 `.d.ts`
223
224
  - **子路径导出**:`gen-exports.js` 自动扫描 `dist/` 并写入 `package.json` 的 `exports` 字段
224
225
  - **导出冲突检测**:`check-export-conflicts.js` 确保组件间无命名冲突
226
+ - **产物入口校验**:`check-dist-entries.js` 防止内部 chunk 覆盖根声明,并保证组件工具的子路径类型完整
225
227
 
226
228
  #### 输出产物
227
229
 
@@ -243,6 +245,7 @@ bun run build:scss # 仅编译全局 SCSS
243
245
  bun run build:css # 仅合并 CSS
244
246
  bun run build:exports # 仅生成 exports 映射
245
247
  bun run check:exports # 检测导出命名冲突
248
+ bun run check:dist # 校验构建后的 JS / DTS 公共入口
246
249
  bun run type-check # TypeScript 类型检查
247
250
  bun run test # 运行 Bun 单元测试
248
251
  bun run lint:check # 强制 Oxlint 正确性检查
@@ -1 +1 @@
1
- {"version":3,"file":"C_AudioPlayer-Cj4lUdZo.css","names":[],"sources":["../src/components/C_AudioPlayer/index.vue?vue&type=style&index=0&scoped=9ab6a734&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//**\n * C_AudioPlayer — 音频播放器样式\n */\n.c-audio-player[data-v-9ab6a734] {\n --ap-bg: var(--card-color);\n --ap-border: var(--border-color);\n --ap-accent: var(--primary-color);\n --ap-text: var(--text-color-1);\n --ap-text-sub: var(--text-color-3);\n --ap-progress-bg: color-mix(in srgb, var(--primary-color) 15%, var(--border-color));\n --ap-progress-fill: var(--primary-color);\n display: flex;\n flex-direction: column;\n border-radius: 12px;\n border: 1px solid var(--ap-border);\n background: var(--ap-bg);\n overflow: hidden;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);\n /* ======================== Now Playing ======================== */\n /* ======================== Progress ======================== */\n /* ======================== Controls ======================== */\n /* ======================== Volume ======================== */\n /* ======================== Playlist ======================== */\n /* ======================== Minimal Theme ======================== */\n}\n.c-audio-player__now-playing[data-v-9ab6a734] {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 20px;\n}\n.c-audio-player__cover[data-v-9ab6a734] {\n flex-shrink: 0;\n width: 72px;\n height: 72px;\n border-radius: 10px;\n overflow: hidden;\n background: color-mix(in srgb, var(--ap-accent) 10%, var(--ap-bg));\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n.c-audio-player__cover img[data-v-9ab6a734] {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n.c-audio-player__cover-placeholder[data-v-9ab6a734] {\n font-size: 32px;\n color: var(--ap-accent);\n opacity: 0.5;\n}\n.c-audio-player__info[data-v-9ab6a734] {\n flex: 1;\n min-width: 0;\n}\n.c-audio-player__title[data-v-9ab6a734] {\n font-size: 15px;\n font-weight: 600;\n color: var(--ap-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.c-audio-player__artist[data-v-9ab6a734] {\n font-size: 12px;\n color: var(--ap-text-sub);\n margin-top: 2px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.c-audio-player__progress[data-v-9ab6a734] {\n padding: 0 20px;\n}\n.c-audio-player__progress-bar[data-v-9ab6a734] {\n position: relative;\n width: 100%;\n height: 6px;\n border-radius: 3px;\n background: var(--ap-progress-bg);\n cursor: pointer;\n transition: height 0.15s;\n}\n.c-audio-player__progress-bar[data-v-9ab6a734]:hover {\n height: 8px;\n}\n.c-audio-player__progress-fill[data-v-9ab6a734] {\n height: 100%;\n border-radius: 3px;\n background: var(--ap-progress-fill);\n position: relative;\n transition: width 0.1s linear;\n}\n.c-audio-player__progress-fill[data-v-9ab6a734]::after {\n content: \"\";\n position: absolute;\n right: -5px;\n top: 50%;\n transform: translateY(-50%);\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background: var(--ap-accent);\n box-shadow: 0 0 4px rgba(0, 0, 0, 0.15);\n opacity: 0;\n transition: opacity 0.15s;\n}\n.c-audio-player__progress-bar:hover .c-audio-player__progress-fill[data-v-9ab6a734]::after {\n opacity: 1;\n}\n.c-audio-player__time[data-v-9ab6a734] {\n display: flex;\n justify-content: space-between;\n font-size: 11px;\n color: var(--ap-text-sub);\n margin-top: 4px;\n padding-bottom: 4px;\n}\n.c-audio-player__controls[data-v-9ab6a734] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 12px 20px;\n}\n.c-audio-player__ctrl-btn[data-v-9ab6a734] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n color: var(--ap-text);\n cursor: pointer;\n border-radius: 50%;\n transition: background 0.2s, color 0.2s, transform 0.15s;\n}\n.c-audio-player__ctrl-btn[data-v-9ab6a734]:hover {\n color: var(--ap-accent);\n background: color-mix(in srgb, var(--ap-accent) 10%, transparent);\n}\n.c-audio-player__ctrl-btn[data-v-9ab6a734]:active {\n transform: scale(0.92);\n}\n.c-audio-player__ctrl-btn.is-mode[data-v-9ab6a734] {\n font-size: 18px;\n width: 34px;\n height: 34px;\n}\n.c-audio-player__ctrl-btn.is-skip[data-v-9ab6a734] {\n font-size: 22px;\n width: 38px;\n height: 38px;\n}\n.c-audio-player__ctrl-btn.is-play[data-v-9ab6a734] {\n font-size: 28px;\n width: 48px;\n height: 48px;\n background: var(--ap-accent);\n color: #fff;\n}\n.c-audio-player__ctrl-btn.is-play[data-v-9ab6a734]:hover {\n background: color-mix(in srgb, var(--ap-accent) 85%, #000);\n color: #fff;\n box-shadow: 0 2px 10px color-mix(in srgb, var(--ap-accent) 35%, transparent);\n}\n.c-audio-player__volume[data-v-9ab6a734] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 0 20px 12px;\n justify-content: flex-end;\n}\n.c-audio-player__volume-icon[data-v-9ab6a734] {\n font-size: 18px;\n color: var(--ap-text-sub);\n cursor: pointer;\n}\n.c-audio-player__volume-icon[data-v-9ab6a734]:hover {\n color: var(--ap-accent);\n}\n.c-audio-player__volume-slider[data-v-9ab6a734] {\n width: 100px;\n}\n.c-audio-player__playlist[data-v-9ab6a734] {\n border-top: 1px solid var(--ap-border);\n max-height: 260px;\n overflow-y: auto;\n}\n.c-audio-player__playlist-header[data-v-9ab6a734] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 20px;\n font-size: 12px;\n font-weight: 600;\n color: var(--ap-text-sub);\n background: color-mix(in srgb, var(--ap-accent) 4%, var(--ap-bg));\n border-bottom: 1px solid var(--ap-border);\n position: sticky;\n top: 0;\n z-index: 1;\n}\n.c-audio-player__track[data-v-9ab6a734] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 20px;\n cursor: pointer;\n transition: background 0.15s;\n}\n.c-audio-player__track[data-v-9ab6a734]:hover {\n background: color-mix(in srgb, var(--ap-accent) 6%, var(--ap-bg));\n}\n.c-audio-player__track.is-active[data-v-9ab6a734] {\n background: color-mix(in srgb, var(--ap-accent) 10%, var(--ap-bg));\n}\n.c-audio-player__track.is-active .c-audio-player__track-title[data-v-9ab6a734] {\n color: var(--ap-accent);\n font-weight: 600;\n}\n.c-audio-player__track-index[data-v-9ab6a734] {\n font-size: 12px;\n width: 20px;\n text-align: center;\n color: var(--ap-text-sub);\n flex-shrink: 0;\n}\n.c-audio-player__track-info[data-v-9ab6a734] {\n flex: 1;\n min-width: 0;\n}\n.c-audio-player__track-title[data-v-9ab6a734] {\n font-size: 13px;\n color: var(--ap-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.c-audio-player__track-artist[data-v-9ab6a734] {\n font-size: 11px;\n color: var(--ap-text-sub);\n margin-top: 1px;\n}\n.c-audio-player__track-duration[data-v-9ab6a734] {\n font-size: 11px;\n color: var(--ap-text-sub);\n flex-shrink: 0;\n}\n.c-audio-player.is-minimal[data-v-9ab6a734] {\n border-radius: 99px;\n padding: 6px 16px;\n flex-direction: row;\n align-items: center;\n gap: 10px;\n box-shadow: 0 1px 6px rgba(0, 0, 0, 0.05);\n}\n.c-audio-player.is-minimal .c-audio-player__now-playing[data-v-9ab6a734] {\n padding: 0;\n gap: 10px;\n}\n.c-audio-player.is-minimal .c-audio-player__cover[data-v-9ab6a734] {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n}\n.c-audio-player.is-minimal .c-audio-player__progress[data-v-9ab6a734],\n.c-audio-player.is-minimal .c-audio-player__playlist[data-v-9ab6a734],\n.c-audio-player.is-minimal .c-audio-player__volume[data-v-9ab6a734] {\n display: none;\n}\n.c-audio-player.is-minimal .c-audio-player__controls[data-v-9ab6a734] {\n padding: 4px 0;\n gap: 2px;\n}\n.c-audio-player.is-minimal .c-audio-player__ctrl-btn.is-play[data-v-9ab6a734] {\n width: 34px;\n height: 34px;\n font-size: 20px;\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
1
+ {"version":3,"file":"C_AudioPlayer-ldTy9Y34.css","names":[],"sources":["../src/components/C_AudioPlayer/index.vue?vue&type=style&index=0&scoped=9ab6a734&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//**\n * C_AudioPlayer — 音频播放器样式\n */\n.c-audio-player[data-v-9ab6a734] {\n --ap-bg: var(--card-color);\n --ap-border: var(--border-color);\n --ap-accent: var(--primary-color);\n --ap-text: var(--text-color-1);\n --ap-text-sub: var(--text-color-3);\n --ap-progress-bg: color-mix(in srgb, var(--primary-color) 15%, var(--border-color));\n --ap-progress-fill: var(--primary-color);\n display: flex;\n flex-direction: column;\n border-radius: 12px;\n border: 1px solid var(--ap-border);\n background: var(--ap-bg);\n overflow: hidden;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);\n /* ======================== Now Playing ======================== */\n /* ======================== Progress ======================== */\n /* ======================== Controls ======================== */\n /* ======================== Volume ======================== */\n /* ======================== Playlist ======================== */\n /* ======================== Minimal Theme ======================== */\n}\n.c-audio-player__now-playing[data-v-9ab6a734] {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 20px;\n}\n.c-audio-player__cover[data-v-9ab6a734] {\n flex-shrink: 0;\n width: 72px;\n height: 72px;\n border-radius: 10px;\n overflow: hidden;\n background: color-mix(in srgb, var(--ap-accent) 10%, var(--ap-bg));\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n.c-audio-player__cover img[data-v-9ab6a734] {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n.c-audio-player__cover-placeholder[data-v-9ab6a734] {\n font-size: 32px;\n color: var(--ap-accent);\n opacity: 0.5;\n}\n.c-audio-player__info[data-v-9ab6a734] {\n flex: 1;\n min-width: 0;\n}\n.c-audio-player__title[data-v-9ab6a734] {\n font-size: 15px;\n font-weight: 600;\n color: var(--ap-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.c-audio-player__artist[data-v-9ab6a734] {\n font-size: 12px;\n color: var(--ap-text-sub);\n margin-top: 2px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.c-audio-player__progress[data-v-9ab6a734] {\n padding: 0 20px;\n}\n.c-audio-player__progress-bar[data-v-9ab6a734] {\n position: relative;\n width: 100%;\n height: 6px;\n border-radius: 3px;\n background: var(--ap-progress-bg);\n cursor: pointer;\n transition: height 0.15s;\n}\n.c-audio-player__progress-bar[data-v-9ab6a734]:hover {\n height: 8px;\n}\n.c-audio-player__progress-fill[data-v-9ab6a734] {\n height: 100%;\n border-radius: 3px;\n background: var(--ap-progress-fill);\n position: relative;\n transition: width 0.1s linear;\n}\n.c-audio-player__progress-fill[data-v-9ab6a734]::after {\n content: \"\";\n position: absolute;\n right: -5px;\n top: 50%;\n transform: translateY(-50%);\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background: var(--ap-accent);\n box-shadow: 0 0 4px rgba(0, 0, 0, 0.15);\n opacity: 0;\n transition: opacity 0.15s;\n}\n.c-audio-player__progress-bar:hover .c-audio-player__progress-fill[data-v-9ab6a734]::after {\n opacity: 1;\n}\n.c-audio-player__time[data-v-9ab6a734] {\n display: flex;\n justify-content: space-between;\n font-size: 11px;\n color: var(--ap-text-sub);\n margin-top: 4px;\n padding-bottom: 4px;\n}\n.c-audio-player__controls[data-v-9ab6a734] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 12px 20px;\n}\n.c-audio-player__ctrl-btn[data-v-9ab6a734] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n color: var(--ap-text);\n cursor: pointer;\n border-radius: 50%;\n transition: background 0.2s, color 0.2s, transform 0.15s;\n}\n.c-audio-player__ctrl-btn[data-v-9ab6a734]:hover {\n color: var(--ap-accent);\n background: color-mix(in srgb, var(--ap-accent) 10%, transparent);\n}\n.c-audio-player__ctrl-btn[data-v-9ab6a734]:active {\n transform: scale(0.92);\n}\n.c-audio-player__ctrl-btn.is-mode[data-v-9ab6a734] {\n font-size: 18px;\n width: 34px;\n height: 34px;\n}\n.c-audio-player__ctrl-btn.is-skip[data-v-9ab6a734] {\n font-size: 22px;\n width: 38px;\n height: 38px;\n}\n.c-audio-player__ctrl-btn.is-play[data-v-9ab6a734] {\n font-size: 28px;\n width: 48px;\n height: 48px;\n background: var(--ap-accent);\n color: #fff;\n}\n.c-audio-player__ctrl-btn.is-play[data-v-9ab6a734]:hover {\n background: color-mix(in srgb, var(--ap-accent) 85%, #000);\n color: #fff;\n box-shadow: 0 2px 10px color-mix(in srgb, var(--ap-accent) 35%, transparent);\n}\n.c-audio-player__volume[data-v-9ab6a734] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 0 20px 12px;\n justify-content: flex-end;\n}\n.c-audio-player__volume-icon[data-v-9ab6a734] {\n font-size: 18px;\n color: var(--ap-text-sub);\n cursor: pointer;\n}\n.c-audio-player__volume-icon[data-v-9ab6a734]:hover {\n color: var(--ap-accent);\n}\n.c-audio-player__volume-slider[data-v-9ab6a734] {\n width: 100px;\n}\n.c-audio-player__playlist[data-v-9ab6a734] {\n border-top: 1px solid var(--ap-border);\n max-height: 260px;\n overflow-y: auto;\n}\n.c-audio-player__playlist-header[data-v-9ab6a734] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 20px;\n font-size: 12px;\n font-weight: 600;\n color: var(--ap-text-sub);\n background: color-mix(in srgb, var(--ap-accent) 4%, var(--ap-bg));\n border-bottom: 1px solid var(--ap-border);\n position: sticky;\n top: 0;\n z-index: 1;\n}\n.c-audio-player__track[data-v-9ab6a734] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 20px;\n cursor: pointer;\n transition: background 0.15s;\n}\n.c-audio-player__track[data-v-9ab6a734]:hover {\n background: color-mix(in srgb, var(--ap-accent) 6%, var(--ap-bg));\n}\n.c-audio-player__track.is-active[data-v-9ab6a734] {\n background: color-mix(in srgb, var(--ap-accent) 10%, var(--ap-bg));\n}\n.c-audio-player__track.is-active .c-audio-player__track-title[data-v-9ab6a734] {\n color: var(--ap-accent);\n font-weight: 600;\n}\n.c-audio-player__track-index[data-v-9ab6a734] {\n font-size: 12px;\n width: 20px;\n text-align: center;\n color: var(--ap-text-sub);\n flex-shrink: 0;\n}\n.c-audio-player__track-info[data-v-9ab6a734] {\n flex: 1;\n min-width: 0;\n}\n.c-audio-player__track-title[data-v-9ab6a734] {\n font-size: 13px;\n color: var(--ap-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.c-audio-player__track-artist[data-v-9ab6a734] {\n font-size: 11px;\n color: var(--ap-text-sub);\n margin-top: 1px;\n}\n.c-audio-player__track-duration[data-v-9ab6a734] {\n font-size: 11px;\n color: var(--ap-text-sub);\n flex-shrink: 0;\n}\n.c-audio-player.is-minimal[data-v-9ab6a734] {\n border-radius: 99px;\n padding: 6px 16px;\n flex-direction: row;\n align-items: center;\n gap: 10px;\n box-shadow: 0 1px 6px rgba(0, 0, 0, 0.05);\n}\n.c-audio-player.is-minimal .c-audio-player__now-playing[data-v-9ab6a734] {\n padding: 0;\n gap: 10px;\n}\n.c-audio-player.is-minimal .c-audio-player__cover[data-v-9ab6a734] {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n}\n.c-audio-player.is-minimal .c-audio-player__progress[data-v-9ab6a734],\n.c-audio-player.is-minimal .c-audio-player__playlist[data-v-9ab6a734],\n.c-audio-player.is-minimal .c-audio-player__volume[data-v-9ab6a734] {\n display: none;\n}\n.c-audio-player.is-minimal .c-audio-player__controls[data-v-9ab6a734] {\n padding: 4px 0;\n gap: 2px;\n}\n.c-audio-player.is-minimal .c-audio-player__ctrl-btn.is-play[data-v-9ab6a734] {\n width: 34px;\n height: 34px;\n font-size: 20px;\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
@@ -1 +1 @@
1
- {"version":3,"file":"C_AvatarGroup-D3PwsKME.css","names":[],"sources":["../src/components/C_AvatarGroup/index.vue?vue&type=style&index=0&scoped=e9981c87&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//**\n * C_AvatarGroup — 头像组组件样式\n */\n.c-avatar-group[data-v-e9981c87] {\n display: inline-flex;\n align-items: center;\n /* ======================== 单个头像 ======================== */\n /* ---- 头像图片 ---- */\n /* ---- 首字母 fallback ---- */\n /* ---- 状态指示点 ---- */\n /* ======================== 溢出 +N ======================== */\n}\n.c-avatar-group.is-rtl[data-v-e9981c87] {\n flex-direction: row-reverse;\n}\n.c-avatar-group__item[data-v-e9981c87] {\n position: relative;\n flex-shrink: 0;\n border: 2px solid var(--card-color);\n background: var(--card-color);\n transition: transform 0.2s, z-index 0.2s, box-shadow 0.2s;\n cursor: default;\n z-index: 1;\n}\n.c-avatar-group__item.is-circle[data-v-e9981c87] {\n border-radius: 50%;\n}\n.c-avatar-group__item.is-square[data-v-e9981c87] {\n border-radius: 6px;\n}\n.c-avatar-group__item.is-clickable[data-v-e9981c87] {\n cursor: pointer;\n}\n.c-avatar-group__item.is-clickable[data-v-e9981c87]:hover {\n transform: translateY(-3px) scale(1.08);\n z-index: 10;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n}\n.c-avatar-group__item[data-v-e9981c87]:hover {\n z-index: 10;\n}\n.c-avatar-group__img[data-v-e9981c87] {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n.is-circle .c-avatar-group__img[data-v-e9981c87] {\n border-radius: 50%;\n}\n.is-square .c-avatar-group__img[data-v-e9981c87] {\n border-radius: 4px;\n}\n.c-avatar-group__initials[data-v-e9981c87] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n color: #fff;\n font-weight: 600;\n user-select: none;\n}\n.is-circle .c-avatar-group__initials[data-v-e9981c87] {\n border-radius: 50%;\n}\n.is-square .c-avatar-group__initials[data-v-e9981c87] {\n border-radius: 4px;\n}\n.c-avatar-group__status[data-v-e9981c87] {\n position: absolute;\n bottom: 0;\n right: 0;\n border-radius: 50%;\n border: 2px solid var(--card-color);\n z-index: 2;\n}\n.c-avatar-group__overflow[data-v-e9981c87] {\n position: relative;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--card-color);\n background: color-mix(in srgb, var(--primary-color) 12%, var(--card-color));\n color: var(--primary-color);\n font-weight: 700;\n z-index: 0;\n transition: transform 0.2s, box-shadow 0.2s;\n}\n.c-avatar-group__overflow.is-circle[data-v-e9981c87] {\n border-radius: 50%;\n}\n.c-avatar-group__overflow.is-square[data-v-e9981c87] {\n border-radius: 6px;\n}\n.c-avatar-group__overflow.is-clickable[data-v-e9981c87] {\n cursor: pointer;\n}\n.c-avatar-group__overflow.is-clickable[data-v-e9981c87]:hover {\n transform: translateY(-3px) scale(1.08);\n z-index: 10;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);\n background: color-mix(in srgb, var(--primary-color) 20%, var(--card-color));\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
1
+ {"version":3,"file":"C_AvatarGroup-SIzxuuZr.css","names":[],"sources":["../src/components/C_AvatarGroup/index.vue?vue&type=style&index=0&scoped=e9981c87&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//**\n * C_AvatarGroup — 头像组组件样式\n */\n.c-avatar-group[data-v-e9981c87] {\n display: inline-flex;\n align-items: center;\n /* ======================== 单个头像 ======================== */\n /* ---- 头像图片 ---- */\n /* ---- 首字母 fallback ---- */\n /* ---- 状态指示点 ---- */\n /* ======================== 溢出 +N ======================== */\n}\n.c-avatar-group.is-rtl[data-v-e9981c87] {\n flex-direction: row-reverse;\n}\n.c-avatar-group__item[data-v-e9981c87] {\n position: relative;\n flex-shrink: 0;\n border: 2px solid var(--card-color);\n background: var(--card-color);\n transition: transform 0.2s, z-index 0.2s, box-shadow 0.2s;\n cursor: default;\n z-index: 1;\n}\n.c-avatar-group__item.is-circle[data-v-e9981c87] {\n border-radius: 50%;\n}\n.c-avatar-group__item.is-square[data-v-e9981c87] {\n border-radius: 6px;\n}\n.c-avatar-group__item.is-clickable[data-v-e9981c87] {\n cursor: pointer;\n}\n.c-avatar-group__item.is-clickable[data-v-e9981c87]:hover {\n transform: translateY(-3px) scale(1.08);\n z-index: 10;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n}\n.c-avatar-group__item[data-v-e9981c87]:hover {\n z-index: 10;\n}\n.c-avatar-group__img[data-v-e9981c87] {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n.is-circle .c-avatar-group__img[data-v-e9981c87] {\n border-radius: 50%;\n}\n.is-square .c-avatar-group__img[data-v-e9981c87] {\n border-radius: 4px;\n}\n.c-avatar-group__initials[data-v-e9981c87] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n color: #fff;\n font-weight: 600;\n user-select: none;\n}\n.is-circle .c-avatar-group__initials[data-v-e9981c87] {\n border-radius: 50%;\n}\n.is-square .c-avatar-group__initials[data-v-e9981c87] {\n border-radius: 4px;\n}\n.c-avatar-group__status[data-v-e9981c87] {\n position: absolute;\n bottom: 0;\n right: 0;\n border-radius: 50%;\n border: 2px solid var(--card-color);\n z-index: 2;\n}\n.c-avatar-group__overflow[data-v-e9981c87] {\n position: relative;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 2px solid var(--card-color);\n background: color-mix(in srgb, var(--primary-color) 12%, var(--card-color));\n color: var(--primary-color);\n font-weight: 700;\n z-index: 0;\n transition: transform 0.2s, box-shadow 0.2s;\n}\n.c-avatar-group__overflow.is-circle[data-v-e9981c87] {\n border-radius: 50%;\n}\n.c-avatar-group__overflow.is-square[data-v-e9981c87] {\n border-radius: 6px;\n}\n.c-avatar-group__overflow.is-clickable[data-v-e9981c87] {\n cursor: pointer;\n}\n.c-avatar-group__overflow.is-clickable[data-v-e9981c87]:hover {\n transform: translateY(-3px) scale(1.08);\n z-index: 10;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);\n background: color-mix(in srgb, var(--primary-color) 20%, var(--card-color));\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
@@ -1 +1 @@
1
- {"version":3,"file":"C_Breadcrumb-DOcLt9uX.css","names":[],"sources":["../src/components/C_Breadcrumb/index.vue?vue&type=style&index=0&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled */.c-breadcrumb {\n --c-breadcrumb-icon-size: 16px;\n --c-breadcrumb-gap: 4px;\n --c-breadcrumb-font-size: inherit;\n display: flex;\n align-items: center;\n height: 100%;\n}\n.c-breadcrumb__trigger, .c-breadcrumb__link {\n display: inline-flex;\n align-items: center;\n gap: var(--c-breadcrumb-gap);\n font-size: var(--c-breadcrumb-font-size);\n line-height: 1;\n cursor: pointer;\n}\n.c-breadcrumb .c-icon {\n flex-shrink: 0;\n}\n.c-breadcrumb .n-breadcrumb-item {\n display: inline-flex !important;\n align-items: center;\n}\n.c-breadcrumb .n-breadcrumb-item .n-breadcrumb-item__separator {\n display: inline-flex;\n align-items: center;\n line-height: 1;\n margin-top: -4px;\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"}
1
+ {"version":3,"file":"C_Breadcrumb-Bqqrl8nX.css","names":[],"sources":["../src/components/C_Breadcrumb/index.vue?vue&type=style&index=0&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled */.c-breadcrumb {\n --c-breadcrumb-icon-size: 16px;\n --c-breadcrumb-gap: 4px;\n --c-breadcrumb-font-size: inherit;\n display: flex;\n align-items: center;\n height: 100%;\n}\n.c-breadcrumb__trigger, .c-breadcrumb__link {\n display: inline-flex;\n align-items: center;\n gap: var(--c-breadcrumb-gap);\n font-size: var(--c-breadcrumb-font-size);\n line-height: 1;\n cursor: pointer;\n}\n.c-breadcrumb .c-icon {\n flex-shrink: 0;\n}\n.c-breadcrumb .n-breadcrumb-item {\n display: inline-flex !important;\n align-items: center;\n}\n.c-breadcrumb .n-breadcrumb-item .n-breadcrumb-item__separator {\n display: inline-flex;\n align-items: center;\n line-height: 1;\n margin-top: -4px;\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"}
@@ -1,3 +1,3 @@
1
- import { t as BreadcrumbItem } from "./types.js";
2
- import { t as _default } from "./index6.vue.js";
1
+ import { i as BreadcrumbItem } from "./menuAdapter.js";
2
+ import { t as _default } from "./index5.vue.js";
3
3
  export { type BreadcrumbItem, _default as C_Breadcrumb };
@@ -1,3 +1,4 @@
1
- import { i as BreadcrumbItem } from "./index.js";
1
+ import { i as BreadcrumbItem } from "./menuAdapter.js";
2
+ import "./_shared.js";
2
3
  import { t as _default } from "./index5.vue.js";
3
4
  export { type BreadcrumbItem, _default as C_Breadcrumb };
@@ -1,2 +1,2 @@
1
- import { t as _default } from "./index7.vue.js";
1
+ import { t as _default } from "./index6.vue.js";
2
2
  export { _default as C_Captcha };
@@ -1,2 +1,2 @@
1
- import { n as CascadeItem, r as CascadeValue, t as _default } from "./index8.vue.js";
1
+ import { n as CascadeItem, r as CascadeValue, t as _default } from "./index7.vue.js";
2
2
  export { _default as C_Cascade, type CascadeItem, type CascadeValue };
@@ -1 +1 @@
1
- {"version":3,"file":"C_Chat-DwatUQqu.css","names":[],"sources":["../src/components/C_Chat/index.vue?vue&type=style&index=0&scoped=5b4bf8dc&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//* ─── CSS 变量(基于项目主题变量,自动适配明暗) ───────────────────────── */\n.c-chat[data-v-5b4bf8dc] {\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-5b4bf8dc] {\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-5b4bf8dc] {\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-5b4bf8dc] {\n padding: 8px 12px;\n}\n.c-chat__contact-list[data-v-5b4bf8dc] {\n flex: 1;\n overflow-y: auto;\n overscroll-behavior: contain;\n}\n.c-chat__contact-list[data-v-5b4bf8dc]::-webkit-scrollbar {\n width: 4px;\n}\n.c-chat__contact-list[data-v-5b4bf8dc]::-webkit-scrollbar-thumb {\n background: var(--chat-scrollbar-thumb);\n border-radius: 2px;\n}\n.c-chat__contact[data-v-5b4bf8dc] {\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-5b4bf8dc]:hover {\n background: color-mix(in srgb, var(--primary-color) 6%, transparent);\n}\n.c-chat__contact.is-active[data-v-5b4bf8dc] {\n background: color-mix(in srgb, var(--primary-color) 12%, transparent);\n}\n.c-chat__contact-avatar[data-v-5b4bf8dc] {\n position: relative;\n flex-shrink: 0;\n}\n.c-chat__avatar[data-v-5b4bf8dc] {\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-5b4bf8dc] {\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-5b4bf8dc] {\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-5b4bf8dc] {\n flex: 1;\n min-width: 0;\n}\n.c-chat__contact-name[data-v-5b4bf8dc] {\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-5b4bf8dc] {\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-5b4bf8dc] {\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-5b4bf8dc] {\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-5b4bf8dc] {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n.c-chat__header[data-v-5b4bf8dc] {\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-5b4bf8dc] {\n font-size: 12px;\n font-weight: 400;\n color: var(--chat-text-secondary);\n}\n\n/* ─── 消息区域 ────────────────────────────────────────── */\n.c-chat__messages[data-v-5b4bf8dc] {\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-5b4bf8dc]::-webkit-scrollbar {\n width: 4px;\n}\n.c-chat__messages[data-v-5b4bf8dc]::-webkit-scrollbar-thumb {\n background: var(--chat-scrollbar-thumb);\n border-radius: 2px;\n}\n.c-chat__load-more[data-v-5b4bf8dc] {\n text-align: center;\n padding: 8px;\n}\n.c-chat__empty[data-v-5b4bf8dc] {\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-5b4bf8dc] {\n display: flex;\n gap: 8px;\n max-width: 75%;\n}\n.c-chat__msg.is-self[data-v-5b4bf8dc] {\n margin-left: auto;\n flex-direction: row-reverse;\n}\n.c-chat__msg.is-system[data-v-5b4bf8dc] {\n max-width: 100%;\n justify-content: center;\n align-self: center;\n}\n.c-chat__msg-avatar[data-v-5b4bf8dc] {\n flex-shrink: 0;\n margin-top: 2px;\n}\n.c-chat__msg-body[data-v-5b4bf8dc] {\n display: flex;\n flex-direction: column;\n}\n.c-chat__msg-username[data-v-5b4bf8dc] {\n font-size: 12px;\n color: var(--chat-text-secondary);\n margin-bottom: 2px;\n}\n.is-self .c-chat__msg-username[data-v-5b4bf8dc] {\n text-align: right;\n}\n.c-chat__bubble[data-v-5b4bf8dc] {\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-5b4bf8dc] {\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-5b4bf8dc] {\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-5b4bf8dc] {\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-5b4bf8dc] {\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-5b4bf8dc] {\n border-top-right-radius: 4px;\n}\n.is-other .c-chat__msg-image[data-v-5b4bf8dc] {\n border-top-left-radius: 4px;\n}\n.c-chat__msg-file[data-v-5b4bf8dc] {\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-5b4bf8dc] {\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-5b4bf8dc] {\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-5b4bf8dc] {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n.c-chat__file-name[data-v-5b4bf8dc] {\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-5b4bf8dc] {\n font-size: 11px;\n opacity: 0.6;\n}\n.c-chat__msg-time[data-v-5b4bf8dc] {\n font-size: 11px;\n color: var(--chat-text-secondary);\n margin-top: 4px;\n}\n.is-self .c-chat__msg-time[data-v-5b4bf8dc] {\n text-align: right;\n}\n.c-chat__msg-status[data-v-5b4bf8dc] {\n font-size: 11px;\n margin-top: 2px;\n text-align: right;\n}\n.c-chat__msg-status.is-sending[data-v-5b4bf8dc] {\n color: var(--chat-text-secondary);\n}\n.c-chat__msg-status.is-failed[data-v-5b4bf8dc] {\n color: var(--chat-failed-color);\n cursor: pointer;\n}\n\n/* ─── 时间分割线 ──────────────────────────────────────── */\n.c-chat__time-divider[data-v-5b4bf8dc] {\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-5b4bf8dc] {\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-5b4bf8dc] {\n display: flex;\n gap: 4px;\n flex-shrink: 0;\n}\n.c-chat__input-wrap[data-v-5b4bf8dc] {\n flex: 1;\n min-width: 0;\n}\n.c-chat__send-btn[data-v-5b4bf8dc] {\n flex-shrink: 0;\n}\n\n/* ─── 空态 ────────────────────────────────────────────── */\n.c-chat__no-chat[data-v-5b4bf8dc] {\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-5b4bf8dc] {\n font-size: 48px;\n opacity: 0.3;\n}\n\n/* ─── 响应式 ──────────────────────────────────────────── */\n@media (max-width: 640px) {\n.c-chat[data-v-5b4bf8dc] {\n --chat-sidebar-width: 72px;\n}\n.c-chat__contact-info[data-v-5b4bf8dc],\n .c-chat__search[data-v-5b4bf8dc],\n .c-chat__unread[data-v-5b4bf8dc] {\n display: none;\n}\n.c-chat__contact[data-v-5b4bf8dc] {\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"}
1
+ {"version":3,"file":"C_Chat-CF1SU7mc.css","names":[],"sources":["../src/components/C_Chat/index.vue?vue&type=style&index=0&scoped=5b4bf8dc&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//* ─── CSS 变量(基于项目主题变量,自动适配明暗) ───────────────────────── */\n.c-chat[data-v-5b4bf8dc] {\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-5b4bf8dc] {\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-5b4bf8dc] {\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-5b4bf8dc] {\n padding: 8px 12px;\n}\n.c-chat__contact-list[data-v-5b4bf8dc] {\n flex: 1;\n overflow-y: auto;\n overscroll-behavior: contain;\n}\n.c-chat__contact-list[data-v-5b4bf8dc]::-webkit-scrollbar {\n width: 4px;\n}\n.c-chat__contact-list[data-v-5b4bf8dc]::-webkit-scrollbar-thumb {\n background: var(--chat-scrollbar-thumb);\n border-radius: 2px;\n}\n.c-chat__contact[data-v-5b4bf8dc] {\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-5b4bf8dc]:hover {\n background: color-mix(in srgb, var(--primary-color) 6%, transparent);\n}\n.c-chat__contact.is-active[data-v-5b4bf8dc] {\n background: color-mix(in srgb, var(--primary-color) 12%, transparent);\n}\n.c-chat__contact-avatar[data-v-5b4bf8dc] {\n position: relative;\n flex-shrink: 0;\n}\n.c-chat__avatar[data-v-5b4bf8dc] {\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-5b4bf8dc] {\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-5b4bf8dc] {\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-5b4bf8dc] {\n flex: 1;\n min-width: 0;\n}\n.c-chat__contact-name[data-v-5b4bf8dc] {\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-5b4bf8dc] {\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-5b4bf8dc] {\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-5b4bf8dc] {\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-5b4bf8dc] {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n.c-chat__header[data-v-5b4bf8dc] {\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-5b4bf8dc] {\n font-size: 12px;\n font-weight: 400;\n color: var(--chat-text-secondary);\n}\n\n/* ─── 消息区域 ────────────────────────────────────────── */\n.c-chat__messages[data-v-5b4bf8dc] {\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-5b4bf8dc]::-webkit-scrollbar {\n width: 4px;\n}\n.c-chat__messages[data-v-5b4bf8dc]::-webkit-scrollbar-thumb {\n background: var(--chat-scrollbar-thumb);\n border-radius: 2px;\n}\n.c-chat__load-more[data-v-5b4bf8dc] {\n text-align: center;\n padding: 8px;\n}\n.c-chat__empty[data-v-5b4bf8dc] {\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-5b4bf8dc] {\n display: flex;\n gap: 8px;\n max-width: 75%;\n}\n.c-chat__msg.is-self[data-v-5b4bf8dc] {\n margin-left: auto;\n flex-direction: row-reverse;\n}\n.c-chat__msg.is-system[data-v-5b4bf8dc] {\n max-width: 100%;\n justify-content: center;\n align-self: center;\n}\n.c-chat__msg-avatar[data-v-5b4bf8dc] {\n flex-shrink: 0;\n margin-top: 2px;\n}\n.c-chat__msg-body[data-v-5b4bf8dc] {\n display: flex;\n flex-direction: column;\n}\n.c-chat__msg-username[data-v-5b4bf8dc] {\n font-size: 12px;\n color: var(--chat-text-secondary);\n margin-bottom: 2px;\n}\n.is-self .c-chat__msg-username[data-v-5b4bf8dc] {\n text-align: right;\n}\n.c-chat__bubble[data-v-5b4bf8dc] {\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-5b4bf8dc] {\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-5b4bf8dc] {\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-5b4bf8dc] {\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-5b4bf8dc] {\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-5b4bf8dc] {\n border-top-right-radius: 4px;\n}\n.is-other .c-chat__msg-image[data-v-5b4bf8dc] {\n border-top-left-radius: 4px;\n}\n.c-chat__msg-file[data-v-5b4bf8dc] {\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-5b4bf8dc] {\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-5b4bf8dc] {\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-5b4bf8dc] {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n.c-chat__file-name[data-v-5b4bf8dc] {\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-5b4bf8dc] {\n font-size: 11px;\n opacity: 0.6;\n}\n.c-chat__msg-time[data-v-5b4bf8dc] {\n font-size: 11px;\n color: var(--chat-text-secondary);\n margin-top: 4px;\n}\n.is-self .c-chat__msg-time[data-v-5b4bf8dc] {\n text-align: right;\n}\n.c-chat__msg-status[data-v-5b4bf8dc] {\n font-size: 11px;\n margin-top: 2px;\n text-align: right;\n}\n.c-chat__msg-status.is-sending[data-v-5b4bf8dc] {\n color: var(--chat-text-secondary);\n}\n.c-chat__msg-status.is-failed[data-v-5b4bf8dc] {\n color: var(--chat-failed-color);\n cursor: pointer;\n}\n\n/* ─── 时间分割线 ──────────────────────────────────────── */\n.c-chat__time-divider[data-v-5b4bf8dc] {\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-5b4bf8dc] {\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-5b4bf8dc] {\n display: flex;\n gap: 4px;\n flex-shrink: 0;\n}\n.c-chat__input-wrap[data-v-5b4bf8dc] {\n flex: 1;\n min-width: 0;\n}\n.c-chat__send-btn[data-v-5b4bf8dc] {\n flex-shrink: 0;\n}\n\n/* ─── 空态 ────────────────────────────────────────────── */\n.c-chat__no-chat[data-v-5b4bf8dc] {\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-5b4bf8dc] {\n font-size: 48px;\n opacity: 0.3;\n}\n\n/* ─── 响应式 ──────────────────────────────────────────── */\n@media (max-width: 640px) {\n.c-chat[data-v-5b4bf8dc] {\n --chat-sidebar-width: 72px;\n}\n.c-chat__contact-info[data-v-5b4bf8dc],\n .c-chat__search[data-v-5b4bf8dc],\n .c-chat__unread[data-v-5b4bf8dc] {\n display: none;\n}\n.c-chat__contact[data-v-5b4bf8dc] {\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
@@ -398,4 +398,4 @@
398
398
  }
399
399
  }
400
400
 
401
- /*# sourceMappingURL=C_Chat-DeUv6uuI.css.map*/
401
+ /*# sourceMappingURL=C_Chat-CF1SU7mc.css.map*/
package/dist/C_Chat.d.cts CHANGED
@@ -1,2 +1,2 @@
1
- import { a as DEFAULT_CHAT_PROPS, c as MessageType, i as ChatProps, n as ChatContact, o as MessageSender, r as ChatMessage, s as MessageStatus, t as _default } from "./index9.vue.js";
1
+ import { a as DEFAULT_CHAT_PROPS, c as MessageType, i as ChatProps, n as ChatContact, o as MessageSender, r as ChatMessage, s as MessageStatus, t as _default } from "./index8.vue.js";
2
2
  export { _default as C_Chat, type ChatContact, type ChatMessage, type ChatProps, DEFAULT_CHAT_PROPS, type MessageSender, type MessageStatus, type MessageType };
package/dist/C_City.d.cts CHANGED
@@ -1,2 +1,2 @@
1
- import { t as _default } from "./index10.vue.js";
1
+ import { t as _default } from "./index9.vue.js";
2
2
  export { _default as C_City };
package/dist/C_Code.d.cts CHANGED
@@ -1,2 +1,2 @@
1
- import { t as _default } from "./index11.vue.js";
1
+ import { t as _default } from "./index10.vue.js";
2
2
  export { _default as C_Code };
@@ -1 +1 @@
1
- {"version":3,"file":"C_ContextMenu-CD0iaSju.css","names":[],"sources":["../src/components/C_ContextMenu/index.vue?vue&type=style&index=0&scoped=f2de30a3&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled */.c-context-menu[data-v-f2de30a3] {\n --ctx-bg: var(--card-color);\n --ctx-bg-blur: 12px;\n --ctx-border: var(--border-color);\n --ctx-radius: 10px;\n --ctx-shadow: 0 8px 32px rgba(0, 0, 0, 0.15);\n --ctx-padding: 6px;\n --ctx-text-primary: var(--app-text-primary);\n --ctx-text-secondary: var(--text-color-3);\n --ctx-text-danger: #d03050;\n --ctx-text-disabled: var(--text-color-3);\n --ctx-item-height: 32px;\n --ctx-item-padding: 0 12px;\n --ctx-item-radius: 6px;\n --ctx-item-hover-bg: color-mix(in srgb, var(--primary-color) 8%, transparent);\n --ctx-item-active-bg: color-mix(in srgb, var(--primary-color) 14%, transparent);\n --ctx-icon-size: 16px;\n --ctx-icon-gap: 10px;\n --ctx-shortcut-color: var(--text-color-3);\n --ctx-divider-color: var(--border-color);\n --ctx-divider-margin: 4px 8px;\n position: fixed;\n padding: var(--ctx-padding);\n background: var(--ctx-bg);\n backdrop-filter: blur(var(--ctx-bg-blur));\n border: 1px solid var(--ctx-border);\n border-radius: var(--ctx-radius);\n box-shadow: var(--ctx-shadow);\n color: var(--ctx-text-primary);\n font-size: 13px;\n user-select: none;\n outline: none;\n}\n.c-context-menu__item[data-v-f2de30a3] {\n position: relative;\n display: flex;\n align-items: center;\n height: var(--ctx-item-height);\n padding: var(--ctx-item-padding);\n border-radius: var(--ctx-item-radius);\n cursor: pointer;\n transition: background 0.15s;\n white-space: nowrap;\n gap: var(--ctx-icon-gap);\n}\n.c-context-menu__item[data-v-f2de30a3]:hover {\n background: var(--ctx-item-hover-bg);\n}\n.c-context-menu__item[data-v-f2de30a3]:active {\n background: var(--ctx-item-active-bg);\n}\n.c-context-menu__item.is-disabled[data-v-f2de30a3] {\n color: var(--ctx-text-disabled);\n cursor: not-allowed;\n pointer-events: none;\n}\n.c-context-menu__item.is-danger[data-v-f2de30a3] {\n color: var(--ctx-text-danger);\n}\n.c-context-menu__item.is-danger[data-v-f2de30a3]:hover {\n background: color-mix(in srgb, #d03050 12%, transparent);\n}\n.c-context-menu__icon[data-v-f2de30a3] {\n flex-shrink: 0;\n width: var(--ctx-icon-size);\n height: var(--ctx-icon-size);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: var(--ctx-icon-size);\n}\n.c-context-menu__label[data-v-f2de30a3] {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.c-context-menu__shortcut[data-v-f2de30a3] {\n flex-shrink: 0;\n margin-left: 24px;\n font-size: 11px;\n color: var(--ctx-shortcut-color);\n font-family: \"JetBrains Mono\", \"Fira Code\", monospace;\n}\n.c-context-menu__arrow[data-v-f2de30a3] {\n flex-shrink: 0;\n margin-left: 8px;\n font-size: 12px;\n color: var(--ctx-text-secondary);\n transition: transform 0.15s;\n}\n.c-context-menu__divider[data-v-f2de30a3] {\n height: 1px;\n margin: var(--ctx-divider-margin);\n background: var(--ctx-divider-color);\n}\n.c-context-menu__submenu[data-v-f2de30a3] {\n position: absolute;\n top: -6px;\n}\n.c-context-menu__submenu.is-right[data-v-f2de30a3] {\n left: 100%;\n margin-left: 4px;\n}\n.c-context-menu__submenu.is-left[data-v-f2de30a3] {\n right: 100%;\n margin-right: 4px;\n}\n.c-context-menu-overlay[data-v-f2de30a3] {\n position: fixed;\n inset: 0;\n z-index: 9998;\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
1
+ {"version":3,"file":"C_ContextMenu-Bn_uhJSo.css","names":[],"sources":["../src/components/C_ContextMenu/index.vue?vue&type=style&index=0&scoped=f2de30a3&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled */.c-context-menu[data-v-f2de30a3] {\n --ctx-bg: var(--card-color);\n --ctx-bg-blur: 12px;\n --ctx-border: var(--border-color);\n --ctx-radius: 10px;\n --ctx-shadow: 0 8px 32px rgba(0, 0, 0, 0.15);\n --ctx-padding: 6px;\n --ctx-text-primary: var(--app-text-primary);\n --ctx-text-secondary: var(--text-color-3);\n --ctx-text-danger: #d03050;\n --ctx-text-disabled: var(--text-color-3);\n --ctx-item-height: 32px;\n --ctx-item-padding: 0 12px;\n --ctx-item-radius: 6px;\n --ctx-item-hover-bg: color-mix(in srgb, var(--primary-color) 8%, transparent);\n --ctx-item-active-bg: color-mix(in srgb, var(--primary-color) 14%, transparent);\n --ctx-icon-size: 16px;\n --ctx-icon-gap: 10px;\n --ctx-shortcut-color: var(--text-color-3);\n --ctx-divider-color: var(--border-color);\n --ctx-divider-margin: 4px 8px;\n position: fixed;\n padding: var(--ctx-padding);\n background: var(--ctx-bg);\n backdrop-filter: blur(var(--ctx-bg-blur));\n border: 1px solid var(--ctx-border);\n border-radius: var(--ctx-radius);\n box-shadow: var(--ctx-shadow);\n color: var(--ctx-text-primary);\n font-size: 13px;\n user-select: none;\n outline: none;\n}\n.c-context-menu__item[data-v-f2de30a3] {\n position: relative;\n display: flex;\n align-items: center;\n height: var(--ctx-item-height);\n padding: var(--ctx-item-padding);\n border-radius: var(--ctx-item-radius);\n cursor: pointer;\n transition: background 0.15s;\n white-space: nowrap;\n gap: var(--ctx-icon-gap);\n}\n.c-context-menu__item[data-v-f2de30a3]:hover {\n background: var(--ctx-item-hover-bg);\n}\n.c-context-menu__item[data-v-f2de30a3]:active {\n background: var(--ctx-item-active-bg);\n}\n.c-context-menu__item.is-disabled[data-v-f2de30a3] {\n color: var(--ctx-text-disabled);\n cursor: not-allowed;\n pointer-events: none;\n}\n.c-context-menu__item.is-danger[data-v-f2de30a3] {\n color: var(--ctx-text-danger);\n}\n.c-context-menu__item.is-danger[data-v-f2de30a3]:hover {\n background: color-mix(in srgb, #d03050 12%, transparent);\n}\n.c-context-menu__icon[data-v-f2de30a3] {\n flex-shrink: 0;\n width: var(--ctx-icon-size);\n height: var(--ctx-icon-size);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: var(--ctx-icon-size);\n}\n.c-context-menu__label[data-v-f2de30a3] {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.c-context-menu__shortcut[data-v-f2de30a3] {\n flex-shrink: 0;\n margin-left: 24px;\n font-size: 11px;\n color: var(--ctx-shortcut-color);\n font-family: \"JetBrains Mono\", \"Fira Code\", monospace;\n}\n.c-context-menu__arrow[data-v-f2de30a3] {\n flex-shrink: 0;\n margin-left: 8px;\n font-size: 12px;\n color: var(--ctx-text-secondary);\n transition: transform 0.15s;\n}\n.c-context-menu__divider[data-v-f2de30a3] {\n height: 1px;\n margin: var(--ctx-divider-margin);\n background: var(--ctx-divider-color);\n}\n.c-context-menu__submenu[data-v-f2de30a3] {\n position: absolute;\n top: -6px;\n}\n.c-context-menu__submenu.is-right[data-v-f2de30a3] {\n left: 100%;\n margin-left: 4px;\n}\n.c-context-menu__submenu.is-left[data-v-f2de30a3] {\n right: 100%;\n margin-right: 4px;\n}\n.c-context-menu-overlay[data-v-f2de30a3] {\n position: fixed;\n inset: 0;\n z-index: 9998;\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
@@ -112,4 +112,4 @@
112
112
  z-index: 9998;
113
113
  }
114
114
 
115
- /*# sourceMappingURL=C_ContextMenu-C9iuxG2n.css.map*/
115
+ /*# sourceMappingURL=C_ContextMenu-Bn_uhJSo.css.map*/
@@ -1,2 +1,2 @@
1
- import { i as DEFAULT_CONTEXT_MENU_PROPS, n as ContextMenuItem, r as ContextMenuProps, t as _default } from "./index12.vue.js";
1
+ import { i as DEFAULT_CONTEXT_MENU_PROPS, n as ContextMenuItem, r as ContextMenuProps, t as _default } from "./index11.vue.js";
2
2
  export { _default as C_ContextMenu, type ContextMenuItem, type ContextMenuProps, DEFAULT_CONTEXT_MENU_PROPS };
package/dist/C_Date.d.cts CHANGED
@@ -1,2 +1,2 @@
1
- import { t as _default } from "./index13.vue.js";
1
+ import { t as _default } from "./index12.vue.js";
2
2
  export { _default as C_Date };
@@ -1,2 +1,2 @@
1
- import { t as _default } from "./index14.vue.js";
1
+ import { t as _default } from "./index13.vue.js";
2
2
  export { _default as C_Editor };
@@ -1,2 +1,2 @@
1
- import { a as GuideTheme, i as GuideStep, n as GuidePersistence, r as GuideProps, t as _default } from "./index15.vue.js";
1
+ import { a as GuideTheme, i as GuideStep, n as GuidePersistence, r as GuideProps, t as _default } from "./index14.vue.js";
2
2
  export { _default as C_Guide, type GuidePersistence, type GuideProps, type GuideStep, type GuideTheme };
package/dist/C_Icon.d.cts CHANGED
@@ -1,2 +1,2 @@
1
- import { n as IconProps, t as _default } from "./index16.vue.js";
1
+ import { n as IconProps, t as _default } from "./index15.vue.js";
2
2
  export { _default as C_Icon, type IconProps };
@@ -1,2 +1,2 @@
1
- import { n as LanguageOption, t as _default } from "./index17.vue.js";
1
+ import { n as LanguageOption, t as _default } from "./index16.vue.js";
2
2
  export { _default as C_Language, type LanguageOption };
@@ -1 +1 @@
1
- {"version":3,"file":"C_Login-BrQBs_m4.css","names":[],"sources":["../src/components/C_Login/index.vue?vue&type=style&index=0&scoped=c3995da6&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//**\n * C_Login 组件样式\n * 通过 CSS 变量覆盖主题,示例:\n * .my-login-wrapper .c-login-panel {\n * --cl-panel-bg: rgba(255,255,255,0.95);\n * --cl-text-color: #1a1a1a;\n * }\n */\n/* ===== CSS 变量默认值(暗色玻璃风格) ===== */\n.c-login-panel[data-v-c3995da6] {\n /* 面板 */\n --cl-panel-bg: rgba(255, 255, 255, 0.1);\n --cl-panel-border: rgba(255, 255, 255, 0.18);\n --cl-panel-radius: 16px;\n --cl-panel-padding: 20px 26px 16px;\n --cl-panel-width: 400px;\n --cl-panel-backdrop: blur(20px);\n --cl-panel-shadow: 0 8px 32px rgba(0, 10, 60, 0.12), 0 2px 8px rgba(0, 10, 40, 0.06);\n /* 文字 */\n --cl-text-primary: rgba(255, 255, 255, 0.95);\n --cl-text-secondary: rgba(255, 255, 255, 0.55);\n --cl-text-hint: rgba(255, 255, 255, 0.4);\n /* 输入框 */\n --cl-input-bg: transparent;\n --cl-input-border: none;\n --cl-input-underline: rgba(255, 255, 255, 0.25);\n --cl-input-underline-hover: rgba(255, 255, 255, 0.5);\n --cl-input-underline-focus: rgba(24, 89, 233, 0.85);\n --cl-input-text: rgba(255, 255, 255, 0.95);\n --cl-input-placeholder: rgba(255, 255, 255, 0.45);\n --cl-input-icon: rgba(255, 255, 255, 0.6);\n /* Tab */\n --cl-tab-text: rgba(255, 255, 255, 0.55);\n --cl-tab-active: rgba(255, 255, 255, 0.95);\n --cl-tab-bar: #1859e9;\n /* 按钮 */\n --cl-btn-bg: linear-gradient(135deg, #1859e9, #1040a0);\n --cl-btn-bg-hover: linear-gradient(135deg, #2464f0, #1545ad);\n --cl-btn-shadow: 0 4px 15px rgba(24, 89, 233, 0.3);\n --cl-btn-shadow-hover: 0 6px 20px rgba(24, 89, 233, 0.4);\n --cl-btn-height: 40px;\n --cl-btn-radius: 8px;\n /* 社交按钮 */\n --cl-social-btn-bg: rgba(255, 255, 255, 0.08);\n --cl-social-btn-border: rgba(255, 255, 255, 0.18);\n --cl-social-btn-hover-bg: rgba(255, 255, 255, 0.16);\n --cl-social-size: 36px;\n /* 分割线 */\n --cl-divider-color: rgba(255, 255, 255, 0.15);\n /* 链接 */\n --cl-link-color: rgba(255, 255, 255, 0.6);\n --cl-link-hover: rgba(255, 255, 255, 0.95);\n /* 间距 */\n --cl-gap: 10px;\n --cl-gap-sm: 6px;\n}\n\n/* ===== 面板容器 ===== */\n.c-login-panel[data-v-c3995da6] {\n width: var(--cl-panel-width);\n background: var(--cl-panel-bg);\n border: 1px solid var(--cl-panel-border);\n border-radius: var(--cl-panel-radius);\n padding: var(--cl-panel-padding);\n backdrop-filter: var(--cl-panel-backdrop);\n box-shadow: var(--cl-panel-shadow);\n overflow: hidden;\n position: relative;\n transition: box-shadow 0.3s ease;\n /* 顶部光泽线 */\n /* 玻璃内衬 */\n}\n.c-login-panel[data-v-c3995da6]::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: -50%;\n width: 200%;\n height: 1px;\n background: linear-gradient(90deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.45) 50%, rgba(255, 255, 255, 0) 100%);\n pointer-events: none;\n}\n.c-login-panel[data-v-c3995da6]::after {\n content: \"\";\n position: absolute;\n inset: 0;\n background: linear-gradient(135deg, rgba(255, 255, 255, 0.12) 0%, rgba(24, 89, 233, 0.04) 100%);\n pointer-events: none;\n border-radius: inherit;\n z-index: 0;\n}\n.c-login-panel[data-v-c3995da6] > * {\n position: relative;\n z-index: 1;\n}\n\n/* ===== Header ===== */\n.c-login__header[data-v-c3995da6] {\n text-align: center;\n margin-bottom: 10px;\n}\n\n/* ===== 返回按钮(登录/注册下方块级按钮) ===== */\n.c-login__back-btn[data-v-c3995da6] {\n margin-top: 10px;\n height: var(--cl-btn-height) !important;\n border-radius: var(--cl-btn-radius) !important;\n background: transparent !important;\n border: 1px solid var(--cl-input-underline) !important;\n color: var(--cl-text-secondary) !important;\n font-size: 14px;\n font-weight: 400;\n letter-spacing: 2px;\n transition: all 0.25s ease !important;\n}\n.c-login__back-btn[data-v-c3995da6]:hover {\n background: rgba(255, 255, 255, 0.06) !important;\n border-color: var(--cl-input-underline-hover) !important;\n color: var(--cl-text-primary) !important;\n}\n.c-login__logo[data-v-c3995da6] {\n display: flex;\n justify-content: center;\n margin-bottom: 4px;\n}\n.c-login__logo .c-login__logo-icon[data-v-c3995da6] {\n color: var(--cl-text-primary);\n filter: drop-shadow(0 2px 8px rgba(24, 89, 233, 0.4));\n}\n.c-login__title[data-v-c3995da6] {\n margin: 0 0 2px;\n font-size: 20px;\n font-weight: 600;\n color: var(--cl-text-primary);\n letter-spacing: 0.5px;\n}\n.c-login__subtitle[data-v-c3995da6] {\n margin: 0;\n font-size: 13px;\n color: var(--cl-text-secondary);\n}\n\n/* ===== 登录方式切换(底部) ===== */\n.c-login__mode-switch[data-v-c3995da6] {\n margin-top: 14px;\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 10px;\n}\n.c-login__mode-btn[data-v-c3995da6] {\n --n-border: none !important;\n --n-border-hover: none !important;\n --n-border-pressed: none !important;\n --n-border-focus: none !important;\n --n-box-shadow-focus: none !important;\n border-radius: 9px !important;\n border: none !important;\n box-shadow: none !important;\n background: rgba(255, 255, 255, 0.04) !important;\n color: var(--cl-text-secondary) !important;\n transition: all 0.2s ease !important;\n}\n.c-login__mode-btn[data-v-c3995da6]:hover {\n background: rgba(255, 255, 255, 0.1) !important;\n color: var(--cl-text-primary) !important;\n}\n.c-login__mode-btn.is-active[data-v-c3995da6] {\n background: color-mix(in srgb, var(--cl-tab-bar) 22%, transparent) !important;\n color: var(--cl-tab-active) !important;\n}\n\n/* ===== 表单 ===== */\n.c-login__form[data-v-c3995da6] {\n margin-top: 6px;\n}\n.c-login__form-item[data-v-c3995da6] {\n margin-bottom: 6px !important;\n /* 彻底干掉 NaiveUI FormItem 内置间距 CSS 变量 */\n /* 校验信息减少占用 */\n /* 底线风格输入框 */\n}\n.c-login__form-item[data-v-c3995da6] .n-form-item {\n --n-feedback-padding: 2px 0 0 0 !important;\n --n-feedback-height: 0 !important;\n --n-blank-height: 0 !important;\n --n-label-height: 0 !important;\n}\n.c-login__form-item[data-v-c3995da6] .n-form-item-label {\n display: none;\n}\n.c-login__form-item[data-v-c3995da6] .n-form-item-feedback-wrapper {\n min-height: 0 !important;\n padding-top: 0 !important;\n line-height: 1.4;\n}\n.c-login__form-item[data-v-c3995da6] .n-form-item-feedback {\n font-size: 11px !important;\n line-height: 1.4;\n}\n.c-login__form-item[data-v-c3995da6] .n-form-item-blank {\n min-height: 0 !important;\n}\n.c-login__form-item[data-v-c3995da6] .n-input {\n --n-border: none !important;\n --n-border-hover: none !important;\n --n-border-focus: none !important;\n --n-border-disabled: none !important;\n --n-box-shadow: none !important;\n --n-color: var(--cl-input-bg) !important;\n --n-text-color: var(--cl-input-text) !important;\n --n-placeholder-color: var(--cl-input-placeholder) !important;\n --n-caret-color: var(--cl-tab-bar) !important;\n background: var(--cl-input-bg) !important;\n border-bottom: 1px solid var(--cl-input-underline) !important;\n border-radius: 0 !important;\n padding: 5px 2px !important;\n transition: border-color 0.25s ease;\n}\n.c-login__form-item[data-v-c3995da6] .n-input:hover {\n border-bottom-color: var(--cl-input-underline-hover) !important;\n}\n.c-login__form-item[data-v-c3995da6] .n-input:focus-within {\n border-bottom-color: var(--cl-input-underline-focus) !important;\n}\n.c-login__form-item[data-v-c3995da6] .n-input .n-input__input-el {\n color: var(--cl-input-text) !important;\n}\n.c-login__form-item[data-v-c3995da6] .n-input .n-input__input-el::placeholder {\n color: var(--cl-input-placeholder) !important;\n}\n.c-login__form-item[data-v-c3995da6] .n-input .n-input__prefix,\n.c-login__form-item[data-v-c3995da6] .n-input .n-input__suffix {\n color: var(--cl-input-icon) !important;\n}\n\n/* ===== 辅助行:记住我 + 忘记密码 ===== */\n.c-login__aux-row[data-v-c3995da6] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-top: 8px;\n margin-bottom: 14px;\n}\n.c-login__remember[data-v-c3995da6] .n-checkbox__label {\n color: var(--cl-text-secondary) !important;\n font-size: 13px;\n}\n.c-login__remember[data-v-c3995da6] .n-checkbox-box {\n --n-border: 1px solid var(--cl-input-underline) !important;\n}\n.c-login__forgot[data-v-c3995da6] {\n font-size: 13px;\n color: var(--cl-link-color);\n cursor: pointer;\n transition: color 0.2s ease;\n}\n.c-login__forgot[data-v-c3995da6]:hover {\n color: var(--cl-link-hover);\n}\n\n/* ===== 验证码行 ===== */\n.c-login__code-row[data-v-c3995da6] {\n display: flex;\n gap: 10px;\n width: 100%;\n}\n.c-login__code-input[data-v-c3995da6] {\n flex: 1;\n}\n.c-login__send-code-btn[data-v-c3995da6] {\n flex-shrink: 0;\n white-space: nowrap;\n background: rgba(255, 255, 255, 0.08) !important;\n border: 1px solid var(--cl-input-underline) !important;\n color: var(--cl-text-secondary) !important;\n border-radius: 6px !important;\n font-size: 13px;\n transition: all 0.25s ease;\n}\n.c-login__send-code-btn[data-v-c3995da6]:not(:disabled):hover {\n background: rgba(255, 255, 255, 0.16) !important;\n color: var(--cl-text-primary) !important;\n}\n\n/* ===== 登录按钮 ===== */\n.c-login__submit-btn[data-v-c3995da6] {\n height: var(--cl-btn-height) !important;\n background: var(--cl-btn-bg) !important;\n border: none !important;\n border-radius: var(--cl-btn-radius) !important;\n font-weight: 500;\n letter-spacing: 2px;\n font-size: 15px;\n box-shadow: var(--cl-btn-shadow) !important;\n transition: all 0.3s ease !important;\n overflow: hidden;\n position: relative;\n margin-top: 14px;\n /* 光泽扫过动画 */\n}\n.c-login__submit-btn[data-v-c3995da6]::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: -100%;\n width: 50%;\n height: 100%;\n background: linear-gradient(90deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.25) 50%, rgba(255, 255, 255, 0) 100%);\n transform: skewX(-25deg);\n transition: left 0.6s ease;\n}\n.c-login__submit-btn[data-v-c3995da6]:not(:disabled):hover {\n background: var(--cl-btn-bg-hover) !important;\n transform: translateY(-1px);\n box-shadow: var(--cl-btn-shadow-hover) !important;\n}\n.c-login__submit-btn[data-v-c3995da6]:not(:disabled):hover::before {\n left: 150%;\n}\n.c-login__submit-btn[data-v-c3995da6]:active {\n transform: translateY(0) !important;\n}\n\n/* ===== 人机验证 ===== */\n.c-login__captcha-wrap[data-v-c3995da6] {\n margin-top: 10px;\n display: flex;\n justify-content: center;\n}\n\n/* ===== 扫码登录面板 ===== */\n.c-login__qr-panel[data-v-c3995da6] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 8px 0 4px;\n gap: 14px;\n}\n.c-login__qr-frame[data-v-c3995da6] {\n position: relative;\n width: 164px;\n height: 164px;\n border-radius: 12px;\n overflow: hidden;\n background: rgba(0, 0, 0, 0.35);\n box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.08), 0 8px 28px rgba(0, 0, 0, 0.4);\n /* 扫描动画线 */\n}\n@keyframes qr-scan-c3995da6 {\n0% {\n transform: translateY(0);\n opacity: 1;\n}\n90% {\n transform: translateY(144px);\n opacity: 1;\n}\n100% {\n transform: translateY(144px);\n opacity: 0;\n}\n}\n\n/* C_QRCode 居中在 frame 内 */\n.c-login__qr-frame[data-v-c3995da6] {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.c-login__qr-scan-line[data-v-c3995da6] {\n position: absolute;\n top: 10px;\n left: 10px;\n right: 10px;\n height: 2px;\n background: linear-gradient(90deg, transparent 0%, rgba(24, 89, 233, 0.7) 30%, rgb(100, 160, 255) 50%, rgba(24, 89, 233, 0.7) 70%, transparent 100%);\n border-radius: 1px;\n box-shadow: 0 0 6px rgba(24, 89, 233, 0.8);\n animation: qr-scan-c3995da6 2.4s ease-in-out infinite;\n pointer-events: none;\n}\n\n/* 四角刻度装饰 */\n.c-login__qr-corner[data-v-c3995da6] {\n position: absolute;\n width: 14px;\n height: 14px;\n border-color: rgba(24, 89, 233, 0.9);\n border-style: solid;\n pointer-events: none;\n}\n.c-login__qr-corner--tl[data-v-c3995da6] {\n top: 6px;\n left: 6px;\n border-width: 2px 0 0 2px;\n border-radius: 3px 0 0 0;\n}\n.c-login__qr-corner--tr[data-v-c3995da6] {\n top: 6px;\n right: 6px;\n border-width: 2px 2px 0 0;\n border-radius: 0 3px 0 0;\n}\n.c-login__qr-corner--bl[data-v-c3995da6] {\n bottom: 6px;\n left: 6px;\n border-width: 0 0 2px 2px;\n border-radius: 0 0 0 3px;\n}\n.c-login__qr-corner--br[data-v-c3995da6] {\n bottom: 6px;\n right: 6px;\n border-width: 0 2px 2px 0;\n border-radius: 0 0 3px 0;\n}\n.c-login__qr-hint[data-v-c3995da6] {\n margin: 0;\n display: flex;\n align-items: center;\n gap: 5px;\n font-size: 12px;\n color: var(--cl-text-hint);\n letter-spacing: 0.3px;\n}\n.c-login__qr-refresh[data-v-c3995da6] {\n color: var(--cl-text-secondary) !important;\n font-size: 11px !important;\n}\n.c-login__qr-refresh[data-v-c3995da6]:hover {\n color: var(--cl-tab-bar) !important;\n}\n\n/* ===== 分割线 ===== */\n.c-login__divider[data-v-c3995da6] {\n margin: 12px 10px 10px !important;\n}\n.c-login__divider[data-v-c3995da6] .n-divider__line {\n background: var(--cl-divider-color) !important;\n}\n.c-login__divider[data-v-c3995da6] .n-divider__title {\n color: var(--cl-text-hint) !important;\n font-size: 12px;\n white-space: nowrap;\n padding: 0 14px;\n}\n\n/* ===== 社交登录 ===== */\n.c-login__social-row[data-v-c3995da6] {\n display: flex;\n justify-content: center;\n gap: 14px;\n margin-bottom: 6px;\n}\n.c-login__social-btn[data-v-c3995da6] {\n width: var(--cl-social-size) !important;\n height: var(--cl-social-size) !important;\n background: var(--cl-social-btn-bg) !important;\n border: 1px solid var(--cl-social-btn-border) !important;\n color: var(--cl-text-secondary) !important;\n transition: all 0.25s ease !important;\n}\n.c-login__social-btn[data-v-c3995da6]:hover {\n background: var(--cl-social-btn-hover-bg) !important;\n color: var(--cl-text-primary) !important;\n transform: translateY(-2px);\n}\n\n/* ===== 注册 ===== */\n.c-login__register-row[data-v-c3995da6] {\n text-align: center;\n margin-top: 14px;\n font-size: 13px;\n}\n.c-login__register-hint[data-v-c3995da6] {\n color: var(--cl-text-hint);\n}\n.c-login__register-link[data-v-c3995da6] {\n color: var(--cl-tab-bar);\n cursor: pointer;\n margin-left: 4px;\n transition: opacity 0.2s ease;\n}\n.c-login__register-link[data-v-c3995da6]:hover {\n opacity: 0.8;\n}\n\n/* ===== 输入图标 ===== */\n.c-login__input-icon[data-v-c3995da6] {\n color: var(--cl-input-icon);\n}\n\n/* ===== 亮色主题预设(父级加 .c-login--light 类可切换) ===== */\n.c-login--light .c-login-panel[data-v-c3995da6] {\n --cl-panel-bg: rgba(255, 255, 255, 0.96);\n --cl-panel-border: rgba(0, 0, 0, 0.08);\n --cl-panel-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);\n --cl-text-primary: #1a1a1a;\n --cl-text-secondary: #666;\n --cl-text-hint: #999;\n --cl-input-underline: rgba(0, 0, 0, 0.2);\n --cl-input-underline-hover: rgba(0, 0, 0, 0.4);\n --cl-input-text: #1a1a1a;\n --cl-input-placeholder: #aaa;\n --cl-input-icon: #aaa;\n --cl-tab-text: #888;\n --cl-tab-active: #1a1a1a;\n --cl-social-btn-bg: rgba(0, 0, 0, 0.04);\n --cl-social-btn-border: rgba(0, 0, 0, 0.12);\n --cl-social-btn-hover-bg: rgba(0, 0, 0, 0.08);\n --cl-divider-color: rgba(0, 0, 0, 0.1);\n --cl-link-color: #888;\n --cl-link-hover: #1a1a1a;\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;;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;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AAEA;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;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"}
1
+ {"version":3,"file":"C_Login-B3qYkLrN.css","names":[],"sources":["../src/components/C_Login/index.vue?vue&type=style&index=0&scoped=c3995da6&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//**\n * C_Login 组件样式\n * 通过 CSS 变量覆盖主题,示例:\n * .my-login-wrapper .c-login-panel {\n * --cl-panel-bg: rgba(255,255,255,0.95);\n * --cl-text-color: #1a1a1a;\n * }\n */\n/* ===== CSS 变量默认值(暗色玻璃风格) ===== */\n.c-login-panel[data-v-c3995da6] {\n /* 面板 */\n --cl-panel-bg: rgba(255, 255, 255, 0.1);\n --cl-panel-border: rgba(255, 255, 255, 0.18);\n --cl-panel-radius: 16px;\n --cl-panel-padding: 20px 26px 16px;\n --cl-panel-width: 400px;\n --cl-panel-backdrop: blur(20px);\n --cl-panel-shadow: 0 8px 32px rgba(0, 10, 60, 0.12), 0 2px 8px rgba(0, 10, 40, 0.06);\n /* 文字 */\n --cl-text-primary: rgba(255, 255, 255, 0.95);\n --cl-text-secondary: rgba(255, 255, 255, 0.55);\n --cl-text-hint: rgba(255, 255, 255, 0.4);\n /* 输入框 */\n --cl-input-bg: transparent;\n --cl-input-border: none;\n --cl-input-underline: rgba(255, 255, 255, 0.25);\n --cl-input-underline-hover: rgba(255, 255, 255, 0.5);\n --cl-input-underline-focus: rgba(24, 89, 233, 0.85);\n --cl-input-text: rgba(255, 255, 255, 0.95);\n --cl-input-placeholder: rgba(255, 255, 255, 0.45);\n --cl-input-icon: rgba(255, 255, 255, 0.6);\n /* Tab */\n --cl-tab-text: rgba(255, 255, 255, 0.55);\n --cl-tab-active: rgba(255, 255, 255, 0.95);\n --cl-tab-bar: #1859e9;\n /* 按钮 */\n --cl-btn-bg: linear-gradient(135deg, #1859e9, #1040a0);\n --cl-btn-bg-hover: linear-gradient(135deg, #2464f0, #1545ad);\n --cl-btn-shadow: 0 4px 15px rgba(24, 89, 233, 0.3);\n --cl-btn-shadow-hover: 0 6px 20px rgba(24, 89, 233, 0.4);\n --cl-btn-height: 40px;\n --cl-btn-radius: 8px;\n /* 社交按钮 */\n --cl-social-btn-bg: rgba(255, 255, 255, 0.08);\n --cl-social-btn-border: rgba(255, 255, 255, 0.18);\n --cl-social-btn-hover-bg: rgba(255, 255, 255, 0.16);\n --cl-social-size: 36px;\n /* 分割线 */\n --cl-divider-color: rgba(255, 255, 255, 0.15);\n /* 链接 */\n --cl-link-color: rgba(255, 255, 255, 0.6);\n --cl-link-hover: rgba(255, 255, 255, 0.95);\n /* 间距 */\n --cl-gap: 10px;\n --cl-gap-sm: 6px;\n}\n\n/* ===== 面板容器 ===== */\n.c-login-panel[data-v-c3995da6] {\n width: var(--cl-panel-width);\n background: var(--cl-panel-bg);\n border: 1px solid var(--cl-panel-border);\n border-radius: var(--cl-panel-radius);\n padding: var(--cl-panel-padding);\n backdrop-filter: var(--cl-panel-backdrop);\n box-shadow: var(--cl-panel-shadow);\n overflow: hidden;\n position: relative;\n transition: box-shadow 0.3s ease;\n /* 顶部光泽线 */\n /* 玻璃内衬 */\n}\n.c-login-panel[data-v-c3995da6]::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: -50%;\n width: 200%;\n height: 1px;\n background: linear-gradient(90deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.45) 50%, rgba(255, 255, 255, 0) 100%);\n pointer-events: none;\n}\n.c-login-panel[data-v-c3995da6]::after {\n content: \"\";\n position: absolute;\n inset: 0;\n background: linear-gradient(135deg, rgba(255, 255, 255, 0.12) 0%, rgba(24, 89, 233, 0.04) 100%);\n pointer-events: none;\n border-radius: inherit;\n z-index: 0;\n}\n.c-login-panel[data-v-c3995da6] > * {\n position: relative;\n z-index: 1;\n}\n\n/* ===== Header ===== */\n.c-login__header[data-v-c3995da6] {\n text-align: center;\n margin-bottom: 10px;\n}\n\n/* ===== 返回按钮(登录/注册下方块级按钮) ===== */\n.c-login__back-btn[data-v-c3995da6] {\n margin-top: 10px;\n height: var(--cl-btn-height) !important;\n border-radius: var(--cl-btn-radius) !important;\n background: transparent !important;\n border: 1px solid var(--cl-input-underline) !important;\n color: var(--cl-text-secondary) !important;\n font-size: 14px;\n font-weight: 400;\n letter-spacing: 2px;\n transition: all 0.25s ease !important;\n}\n.c-login__back-btn[data-v-c3995da6]:hover {\n background: rgba(255, 255, 255, 0.06) !important;\n border-color: var(--cl-input-underline-hover) !important;\n color: var(--cl-text-primary) !important;\n}\n.c-login__logo[data-v-c3995da6] {\n display: flex;\n justify-content: center;\n margin-bottom: 4px;\n}\n.c-login__logo .c-login__logo-icon[data-v-c3995da6] {\n color: var(--cl-text-primary);\n filter: drop-shadow(0 2px 8px rgba(24, 89, 233, 0.4));\n}\n.c-login__title[data-v-c3995da6] {\n margin: 0 0 2px;\n font-size: 20px;\n font-weight: 600;\n color: var(--cl-text-primary);\n letter-spacing: 0.5px;\n}\n.c-login__subtitle[data-v-c3995da6] {\n margin: 0;\n font-size: 13px;\n color: var(--cl-text-secondary);\n}\n\n/* ===== 登录方式切换(底部) ===== */\n.c-login__mode-switch[data-v-c3995da6] {\n margin-top: 14px;\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 10px;\n}\n.c-login__mode-btn[data-v-c3995da6] {\n --n-border: none !important;\n --n-border-hover: none !important;\n --n-border-pressed: none !important;\n --n-border-focus: none !important;\n --n-box-shadow-focus: none !important;\n border-radius: 9px !important;\n border: none !important;\n box-shadow: none !important;\n background: rgba(255, 255, 255, 0.04) !important;\n color: var(--cl-text-secondary) !important;\n transition: all 0.2s ease !important;\n}\n.c-login__mode-btn[data-v-c3995da6]:hover {\n background: rgba(255, 255, 255, 0.1) !important;\n color: var(--cl-text-primary) !important;\n}\n.c-login__mode-btn.is-active[data-v-c3995da6] {\n background: color-mix(in srgb, var(--cl-tab-bar) 22%, transparent) !important;\n color: var(--cl-tab-active) !important;\n}\n\n/* ===== 表单 ===== */\n.c-login__form[data-v-c3995da6] {\n margin-top: 6px;\n}\n.c-login__form-item[data-v-c3995da6] {\n margin-bottom: 6px !important;\n /* 彻底干掉 NaiveUI FormItem 内置间距 CSS 变量 */\n /* 校验信息减少占用 */\n /* 底线风格输入框 */\n}\n.c-login__form-item[data-v-c3995da6] .n-form-item {\n --n-feedback-padding: 2px 0 0 0 !important;\n --n-feedback-height: 0 !important;\n --n-blank-height: 0 !important;\n --n-label-height: 0 !important;\n}\n.c-login__form-item[data-v-c3995da6] .n-form-item-label {\n display: none;\n}\n.c-login__form-item[data-v-c3995da6] .n-form-item-feedback-wrapper {\n min-height: 0 !important;\n padding-top: 0 !important;\n line-height: 1.4;\n}\n.c-login__form-item[data-v-c3995da6] .n-form-item-feedback {\n font-size: 11px !important;\n line-height: 1.4;\n}\n.c-login__form-item[data-v-c3995da6] .n-form-item-blank {\n min-height: 0 !important;\n}\n.c-login__form-item[data-v-c3995da6] .n-input {\n --n-border: none !important;\n --n-border-hover: none !important;\n --n-border-focus: none !important;\n --n-border-disabled: none !important;\n --n-box-shadow: none !important;\n --n-color: var(--cl-input-bg) !important;\n --n-text-color: var(--cl-input-text) !important;\n --n-placeholder-color: var(--cl-input-placeholder) !important;\n --n-caret-color: var(--cl-tab-bar) !important;\n background: var(--cl-input-bg) !important;\n border-bottom: 1px solid var(--cl-input-underline) !important;\n border-radius: 0 !important;\n padding: 5px 2px !important;\n transition: border-color 0.25s ease;\n}\n.c-login__form-item[data-v-c3995da6] .n-input:hover {\n border-bottom-color: var(--cl-input-underline-hover) !important;\n}\n.c-login__form-item[data-v-c3995da6] .n-input:focus-within {\n border-bottom-color: var(--cl-input-underline-focus) !important;\n}\n.c-login__form-item[data-v-c3995da6] .n-input .n-input__input-el {\n color: var(--cl-input-text) !important;\n}\n.c-login__form-item[data-v-c3995da6] .n-input .n-input__input-el::placeholder {\n color: var(--cl-input-placeholder) !important;\n}\n.c-login__form-item[data-v-c3995da6] .n-input .n-input__prefix,\n.c-login__form-item[data-v-c3995da6] .n-input .n-input__suffix {\n color: var(--cl-input-icon) !important;\n}\n\n/* ===== 辅助行:记住我 + 忘记密码 ===== */\n.c-login__aux-row[data-v-c3995da6] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-top: 8px;\n margin-bottom: 14px;\n}\n.c-login__remember[data-v-c3995da6] .n-checkbox__label {\n color: var(--cl-text-secondary) !important;\n font-size: 13px;\n}\n.c-login__remember[data-v-c3995da6] .n-checkbox-box {\n --n-border: 1px solid var(--cl-input-underline) !important;\n}\n.c-login__forgot[data-v-c3995da6] {\n font-size: 13px;\n color: var(--cl-link-color);\n cursor: pointer;\n transition: color 0.2s ease;\n}\n.c-login__forgot[data-v-c3995da6]:hover {\n color: var(--cl-link-hover);\n}\n\n/* ===== 验证码行 ===== */\n.c-login__code-row[data-v-c3995da6] {\n display: flex;\n gap: 10px;\n width: 100%;\n}\n.c-login__code-input[data-v-c3995da6] {\n flex: 1;\n}\n.c-login__send-code-btn[data-v-c3995da6] {\n flex-shrink: 0;\n white-space: nowrap;\n background: rgba(255, 255, 255, 0.08) !important;\n border: 1px solid var(--cl-input-underline) !important;\n color: var(--cl-text-secondary) !important;\n border-radius: 6px !important;\n font-size: 13px;\n transition: all 0.25s ease;\n}\n.c-login__send-code-btn[data-v-c3995da6]:not(:disabled):hover {\n background: rgba(255, 255, 255, 0.16) !important;\n color: var(--cl-text-primary) !important;\n}\n\n/* ===== 登录按钮 ===== */\n.c-login__submit-btn[data-v-c3995da6] {\n height: var(--cl-btn-height) !important;\n background: var(--cl-btn-bg) !important;\n border: none !important;\n border-radius: var(--cl-btn-radius) !important;\n font-weight: 500;\n letter-spacing: 2px;\n font-size: 15px;\n box-shadow: var(--cl-btn-shadow) !important;\n transition: all 0.3s ease !important;\n overflow: hidden;\n position: relative;\n margin-top: 14px;\n /* 光泽扫过动画 */\n}\n.c-login__submit-btn[data-v-c3995da6]::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: -100%;\n width: 50%;\n height: 100%;\n background: linear-gradient(90deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.25) 50%, rgba(255, 255, 255, 0) 100%);\n transform: skewX(-25deg);\n transition: left 0.6s ease;\n}\n.c-login__submit-btn[data-v-c3995da6]:not(:disabled):hover {\n background: var(--cl-btn-bg-hover) !important;\n transform: translateY(-1px);\n box-shadow: var(--cl-btn-shadow-hover) !important;\n}\n.c-login__submit-btn[data-v-c3995da6]:not(:disabled):hover::before {\n left: 150%;\n}\n.c-login__submit-btn[data-v-c3995da6]:active {\n transform: translateY(0) !important;\n}\n\n/* ===== 人机验证 ===== */\n.c-login__captcha-wrap[data-v-c3995da6] {\n margin-top: 10px;\n display: flex;\n justify-content: center;\n}\n\n/* ===== 扫码登录面板 ===== */\n.c-login__qr-panel[data-v-c3995da6] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 8px 0 4px;\n gap: 14px;\n}\n.c-login__qr-frame[data-v-c3995da6] {\n position: relative;\n width: 164px;\n height: 164px;\n border-radius: 12px;\n overflow: hidden;\n background: rgba(0, 0, 0, 0.35);\n box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.08), 0 8px 28px rgba(0, 0, 0, 0.4);\n /* 扫描动画线 */\n}\n@keyframes qr-scan-c3995da6 {\n0% {\n transform: translateY(0);\n opacity: 1;\n}\n90% {\n transform: translateY(144px);\n opacity: 1;\n}\n100% {\n transform: translateY(144px);\n opacity: 0;\n}\n}\n\n/* C_QRCode 居中在 frame 内 */\n.c-login__qr-frame[data-v-c3995da6] {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.c-login__qr-scan-line[data-v-c3995da6] {\n position: absolute;\n top: 10px;\n left: 10px;\n right: 10px;\n height: 2px;\n background: linear-gradient(90deg, transparent 0%, rgba(24, 89, 233, 0.7) 30%, rgb(100, 160, 255) 50%, rgba(24, 89, 233, 0.7) 70%, transparent 100%);\n border-radius: 1px;\n box-shadow: 0 0 6px rgba(24, 89, 233, 0.8);\n animation: qr-scan-c3995da6 2.4s ease-in-out infinite;\n pointer-events: none;\n}\n\n/* 四角刻度装饰 */\n.c-login__qr-corner[data-v-c3995da6] {\n position: absolute;\n width: 14px;\n height: 14px;\n border-color: rgba(24, 89, 233, 0.9);\n border-style: solid;\n pointer-events: none;\n}\n.c-login__qr-corner--tl[data-v-c3995da6] {\n top: 6px;\n left: 6px;\n border-width: 2px 0 0 2px;\n border-radius: 3px 0 0 0;\n}\n.c-login__qr-corner--tr[data-v-c3995da6] {\n top: 6px;\n right: 6px;\n border-width: 2px 2px 0 0;\n border-radius: 0 3px 0 0;\n}\n.c-login__qr-corner--bl[data-v-c3995da6] {\n bottom: 6px;\n left: 6px;\n border-width: 0 0 2px 2px;\n border-radius: 0 0 0 3px;\n}\n.c-login__qr-corner--br[data-v-c3995da6] {\n bottom: 6px;\n right: 6px;\n border-width: 0 2px 2px 0;\n border-radius: 0 0 3px 0;\n}\n.c-login__qr-hint[data-v-c3995da6] {\n margin: 0;\n display: flex;\n align-items: center;\n gap: 5px;\n font-size: 12px;\n color: var(--cl-text-hint);\n letter-spacing: 0.3px;\n}\n.c-login__qr-refresh[data-v-c3995da6] {\n color: var(--cl-text-secondary) !important;\n font-size: 11px !important;\n}\n.c-login__qr-refresh[data-v-c3995da6]:hover {\n color: var(--cl-tab-bar) !important;\n}\n\n/* ===== 分割线 ===== */\n.c-login__divider[data-v-c3995da6] {\n margin: 12px 10px 10px !important;\n}\n.c-login__divider[data-v-c3995da6] .n-divider__line {\n background: var(--cl-divider-color) !important;\n}\n.c-login__divider[data-v-c3995da6] .n-divider__title {\n color: var(--cl-text-hint) !important;\n font-size: 12px;\n white-space: nowrap;\n padding: 0 14px;\n}\n\n/* ===== 社交登录 ===== */\n.c-login__social-row[data-v-c3995da6] {\n display: flex;\n justify-content: center;\n gap: 14px;\n margin-bottom: 6px;\n}\n.c-login__social-btn[data-v-c3995da6] {\n width: var(--cl-social-size) !important;\n height: var(--cl-social-size) !important;\n background: var(--cl-social-btn-bg) !important;\n border: 1px solid var(--cl-social-btn-border) !important;\n color: var(--cl-text-secondary) !important;\n transition: all 0.25s ease !important;\n}\n.c-login__social-btn[data-v-c3995da6]:hover {\n background: var(--cl-social-btn-hover-bg) !important;\n color: var(--cl-text-primary) !important;\n transform: translateY(-2px);\n}\n\n/* ===== 注册 ===== */\n.c-login__register-row[data-v-c3995da6] {\n text-align: center;\n margin-top: 14px;\n font-size: 13px;\n}\n.c-login__register-hint[data-v-c3995da6] {\n color: var(--cl-text-hint);\n}\n.c-login__register-link[data-v-c3995da6] {\n color: var(--cl-tab-bar);\n cursor: pointer;\n margin-left: 4px;\n transition: opacity 0.2s ease;\n}\n.c-login__register-link[data-v-c3995da6]:hover {\n opacity: 0.8;\n}\n\n/* ===== 输入图标 ===== */\n.c-login__input-icon[data-v-c3995da6] {\n color: var(--cl-input-icon);\n}\n\n/* ===== 亮色主题预设(父级加 .c-login--light 类可切换) ===== */\n.c-login--light .c-login-panel[data-v-c3995da6] {\n --cl-panel-bg: rgba(255, 255, 255, 0.96);\n --cl-panel-border: rgba(0, 0, 0, 0.08);\n --cl-panel-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);\n --cl-text-primary: #1a1a1a;\n --cl-text-secondary: #666;\n --cl-text-hint: #999;\n --cl-input-underline: rgba(0, 0, 0, 0.2);\n --cl-input-underline-hover: rgba(0, 0, 0, 0.4);\n --cl-input-text: #1a1a1a;\n --cl-input-placeholder: #aaa;\n --cl-input-icon: #aaa;\n --cl-tab-text: #888;\n --cl-tab-active: #1a1a1a;\n --cl-social-btn-bg: rgba(0, 0, 0, 0.04);\n --cl-social-btn-border: rgba(0, 0, 0, 0.12);\n --cl-social-btn-hover-bg: rgba(0, 0, 0, 0.08);\n --cl-divider-color: rgba(0, 0, 0, 0.1);\n --cl-link-color: #888;\n --cl-link-hover: #1a1a1a;\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;;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;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;AAEA;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;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;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"}
package/dist/C_Login.css CHANGED
@@ -512,4 +512,4 @@
512
512
  --cl-link-hover: #1a1a1a;
513
513
  }
514
514
 
515
- /*# sourceMappingURL=C_Login-BrQBs_m4.css.map*/
515
+ /*# sourceMappingURL=C_Login-B3qYkLrN.css.map*/
@@ -1,2 +1,2 @@
1
- import { a as LoginFeatures, c as RegisterFormData, i as DEFAULT_SOCIAL_PROVIDERS, l as SocialProvider, n as CaptchaFormData, o as LoginProps, r as DEFAULT_FEATURES, s as PasswordFormData, t as _default } from "./index18.vue.js";
1
+ import { a as LoginFeatures, c as RegisterFormData, i as DEFAULT_SOCIAL_PROVIDERS, l as SocialProvider, n as CaptchaFormData, o as LoginProps, r as DEFAULT_FEATURES, s as PasswordFormData, t as _default } from "./index17.vue.js";
2
2
  export { _default as C_Login, type CaptchaFormData, DEFAULT_FEATURES, DEFAULT_SOCIAL_PROVIDERS, type LoginFeatures, type LoginProps, type PasswordFormData, type RegisterFormData, type SocialProvider };
@@ -1,2 +1,2 @@
1
- import { t as _default } from "./index19.vue.js";
1
+ import { t as _default } from "./index18.vue.js";
2
2
  export { _default as C_Markdown };
package/dist/C_Menu.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./C_Menu.js`);exports.C_Menu=e.t,exports.createMenuOptions=e.n,exports.flattenRoutes=e.r;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./menuAdapter.js`),t=require(`./C_Menu.js`);exports.C_Menu=t.t,exports.createMenuOptions=e.t,exports.flattenRoutes=e.n;
package/dist/C_Menu.d.cts CHANGED
@@ -1,3 +1,3 @@
1
- import { n as RouteItem, r as RouteMeta } from "./types.js";
2
- import { i as flattenRoutes, n as MenuAdapterConfig, r as createMenuOptions, t as _default } from "./index5.vue.js";
1
+ import { a as RouteItem, n as createMenuOptions, o as RouteMeta, r as flattenRoutes, t as MenuAdapterConfig } from "./menuAdapter.js";
2
+ import { t as _default } from "./index19.vue.js";
3
3
  export { _default as C_Menu, type MenuAdapterConfig, type RouteItem, type RouteMeta, createMenuOptions, flattenRoutes };
package/dist/C_Menu.d.ts CHANGED
@@ -1,3 +1,4 @@
1
- import { a as RouteItem, n as createMenuOptions, o as RouteMeta, r as flattenRoutes, t as MenuAdapterConfig } from "./index.js";
1
+ import { a as RouteItem, n as createMenuOptions, o as RouteMeta, r as flattenRoutes, t as MenuAdapterConfig } from "./menuAdapter.js";
2
+ import "./_shared.js";
2
3
  import { t as _default } from "./index19.vue.js";
3
4
  export { _default as C_Menu, type MenuAdapterConfig, type RouteItem, type RouteMeta, createMenuOptions, flattenRoutes };
package/dist/C_Menu.js CHANGED
@@ -1 +1 @@
1
- import{n as e,r as t,t as n}from"./C_Menu2.js";export{n as C_Menu,e as createMenuOptions,t as flattenRoutes};
1
+ import{n as e,t}from"./menuAdapter.js";import{t as n}from"./C_Menu2.js";export{n as C_Menu,t as createMenuOptions,e as flattenRoutes};
@@ -1 +1 @@
1
- {"version":3,"file":"C_Menu.js","names":["Icon","mode","collapsed","collapsedWidth","collapsedIconSize","inverted","themeOverrides","dropdownProps","indent","rootIndent"],"sources":["../src/components/_shared/menuAdapter.ts","../src/components/C_Menu/index.vue","../src/components/C_Menu/index.vue"],"sourcesContent":["/**\n * 菜单适配器 — 将路由数据转换为 NMenu 的 MenuOption[]\n *\n * 设计理念:\n * - 开箱即用:`createMenuOptions(routes)` 零配置即可生成菜单\n * - 完全可控:通过 `MenuAdapterConfig` 定制每一步转换逻辑\n * - i18n 解耦:`labelFormatter` 回调注入翻译函数,不绑定任何 i18n 方案\n *\n * @example 基础用法\n * ```ts\n * import { createMenuOptions } from '@robot-admin/naive-ui-components'\n *\n * const menuOptions = createMenuOptions(routes)\n * ```\n *\n * @example 带 i18n + 过滤\n * ```ts\n * const menuOptions = createMenuOptions(routes, {\n * labelFormatter: t, // vue-i18n 的 t 函数\n * filter: route => !route.meta?.hidden,\n * })\n * ```\n *\n * @example 自定义 key 取值\n * ```ts\n * const menuOptions = createMenuOptions(routes, {\n * getKey: route => route.name || route.path,\n * })\n * ```\n */\n\nimport { h, type VNode } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport type { MenuOption } from 'naive-ui/es'\nimport type { RouteItem } from './types'\n\n/**\n * 菜单适配器配置\n */\nexport interface MenuAdapterConfig {\n /**\n * 标签文本格式化函数(用于 i18n)\n * 默认:原样返回 title\n */\n labelFormatter?: (title: string) => string\n\n /**\n * 获取菜单项的唯一 key\n * 默认:`normalizePath(route.path)`\n */\n getKey?: (route: RouteItem) => string\n\n /**\n * 获取显示文本\n * 默认:`route.meta?.title || route.name || ''`\n */\n getLabel?: (route: RouteItem) => string\n\n /**\n * 路由过滤器 — return false 排除该项\n * 默认:排除 `meta.hidden === true`\n */\n filter?: (route: RouteItem) => boolean\n\n /**\n * 自定义图标渲染\n * 默认:字符串 → Iconify Icon;函数 → 直接调用\n */\n renderIcon?: (\n icon: string | (() => VNode) | undefined\n ) => (() => VNode) | undefined\n\n /**\n * 是否递归处理 children\n * 默认:true\n */\n recursive?: boolean\n}\n\n// ====== 内置默认值 ======\n\nconst normalizePath = (path: string): string =>\n path.startsWith('/') ? path : `/${path}`\n\nconst defaultGetKey = (route: RouteItem): string =>\n route.path ? normalizePath(route.path) : ''\n\nconst defaultGetLabel = (route: RouteItem): string =>\n route.meta?.title || route.name || ''\n\nconst defaultFilter = (route: RouteItem): boolean => !route.meta?.hidden\n\nconst defaultRenderIcon = (\n icon: string | (() => VNode) | undefined\n): (() => VNode) | undefined => {\n if (!icon) return undefined\n if (typeof icon === 'string') {\n return () =>\n h(\n 'span',\n {\n class: 'n-icon',\n style: 'display: inline-flex; align-items: center;',\n },\n [h(Icon, { icon })]\n )\n }\n if (typeof icon === 'function') return icon\n return undefined\n}\n\n/**\n * 将路由数据转换为 NMenu 的 MenuOption[]\n *\n * 支持的输入格式:\n * 1. **Vue Router RouteRecordRaw** — 直接传 `router.getRoutes()` 或手写路由表\n * 2. **后端 JSON 路由表** — `{ path, meta: { title, icon }, children }`\n * 3. **自定义格式** — 通过 config 完全自定义 key/label/icon 的取值逻辑\n *\n * @param routes 路由数据数组\n * @param config 适配器配置\n * @returns NMenu 可直接使用的 MenuOption[]\n */\nexport function createMenuOptions(\n routes: RouteItem[],\n config: MenuAdapterConfig = {}\n): MenuOption[] {\n const {\n labelFormatter = (s: string) => s,\n getKey = defaultGetKey,\n getLabel = defaultGetLabel,\n filter = defaultFilter,\n renderIcon = defaultRenderIcon,\n recursive = true,\n } = config\n\n const convert = (items: RouteItem[]): MenuOption[] => {\n return items.filter(filter).map(item => {\n const icon = item.meta?.icon || (item as any).icon\n const children =\n recursive && item.children?.length ? convert(item.children) : undefined\n\n return {\n key: getKey(item),\n label: labelFormatter(getLabel(item)),\n disabled: item.disabled || false,\n icon: renderIcon(icon),\n ...(item.type && { type: item.type }),\n ...(children?.length && { children }),\n }\n }) as MenuOption[]\n }\n\n return convert(routes)\n}\n\n/**\n * 将路由树扁平化为一维数组(常用于搜索、快捷导航)\n *\n * @param routes 路由数据数组\n * @param filter 过滤器(默认排除 hidden)\n * @returns 扁平化后的路由数组\n */\nexport function flattenRoutes(\n routes: RouteItem[],\n filter: (route: RouteItem) => boolean = defaultFilter\n): RouteItem[] {\n const result: RouteItem[] = []\n const walk = (items: RouteItem[]) => {\n for (const item of items) {\n if (filter(item)) {\n result.push(item)\n }\n if (item.children?.length) {\n walk(item.children)\n }\n }\n }\n walk(routes)\n return result\n}\n","<!--\n * @Description: 通用菜单组件 — 基于 NMenu 的树形导航菜单\n *\n * 支持两种数据输入模式:\n * 1. `options` — 直传 NMenu 原生 MenuOption[](零转换,高级用户)\n * 2. `routes` — 传入路由数据,自动通过内置适配器转换为 MenuOption[]\n *\n * @example 路由模式(推荐)\n * ```vue\n * <C_Menu\n * :routes=\"menuData\"\n * :label-formatter=\"$t\"\n * @select=\"router.push\"\n * />\n * ```\n *\n * @example 原生模式\n * ```vue\n * <C_Menu\n * :options=\"nMenuOptions\"\n * @select=\"router.push\"\n * />\n * ```\n *\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <NMenu\n ref=\"menuRef\"\n :options=\"mergedOptions\"\n :expanded-keys=\"expandedKeys\"\n :value=\"activeKey\"\n :mode=\"mode\"\n :collapsed=\"collapsed\"\n :collapsed-width=\"collapsedWidth\"\n :collapsed-icon-size=\"collapsedIconSize\"\n :inverted=\"inverted\"\n :theme-overrides=\"themeOverrides\"\n :dropdown-props=\"dropdownProps\"\n :indent=\"indent\"\n :root-indent=\"rootIndent\"\n @update:value=\"handleMenuClick\"\n @update:expanded-keys=\"onExpandedKeysChange\"\n />\n</template>\n\n<script setup lang=\"ts\">\n import { ref, computed, watch, nextTick, onMounted } from 'vue'\n import {\n type MenuOption,\n type MenuInst,\n type DropdownProps,\n } from 'naive-ui/es'\n import {\n createMenuOptions,\n type RouteItem,\n type MenuAdapterConfig,\n } from '../_shared'\n\n defineOptions({ name: 'C_Menu' })\n\n const props = withDefaults(\n defineProps<{\n /**\n * 模式一:直传 NMenu 原生 MenuOption[]\n * 与 `routes` 二选一,`options` 优先级更高\n */\n options?: MenuOption[]\n /**\n * 模式二:传入路由数据,自动转换为 MenuOption[]\n * 兼容 Vue Router RouteRecordRaw / 后端 JSON 路由表\n */\n routes?: RouteItem[]\n /**\n * 适配器配置(仅 routes 模式生效)\n * 可自定义 key/label/icon 取值、过滤逻辑等\n */\n adapterConfig?: MenuAdapterConfig\n /**\n * 标签文本格式化函数(routes 模式的快捷方式)\n * 等同于 `adapterConfig.labelFormatter`,但优先级更高\n */\n labelFormatter?: (label: string) => string\n /** 当前激活的菜单 key */\n value?: string\n /** 菜单模式 */\n mode?: 'vertical' | 'horizontal'\n /** 是否折叠 */\n collapsed?: boolean\n /** 折叠宽度 */\n collapsedWidth?: number\n /** 折叠图标大小 */\n collapsedIconSize?: number\n /** 是否反色 */\n inverted?: boolean\n /** 主题覆盖 */\n themeOverrides?: Record<string, any>\n /** 缩进像素 */\n indent?: number\n /** 根缩进像素 */\n rootIndent?: number\n /** 下拉菜单属性(折叠模式) */\n dropdownProps?: DropdownProps\n }>(),\n {\n mode: 'vertical',\n collapsed: false,\n collapsedWidth: 64,\n collapsedIconSize: 22,\n inverted: false,\n indent: 24,\n rootIndent: 16,\n dropdownProps: () => ({\n placement: 'right-start' as const,\n trigger: 'hover' as const,\n arrowStyle: { color: 'var(--n-color)' },\n }),\n }\n )\n\n const emit = defineEmits<{\n /** 菜单项被选中 */\n select: [key: string]\n /** 展开项变化 */\n 'update:expandedKeys': [keys: string[]]\n }>()\n\n const menuRef = ref<MenuInst | null>(null)\n const expandedKeys = ref<string[]>([])\n\n const activeKey = computed(() => props.value ?? '')\n\n // ====== 数据合成 ======\n\n /** 合并后的最终 MenuOption[] */\n const mergedOptions = computed<MenuOption[]>(() => {\n // 优先使用 options 直传模式\n if (props.options) return props.options\n\n // routes 模式 → 适配器转换\n if (props.routes) {\n const config: MenuAdapterConfig = {\n ...props.adapterConfig,\n ...(props.labelFormatter && { labelFormatter: props.labelFormatter }),\n }\n return createMenuOptions(props.routes, config)\n }\n\n return []\n })\n\n // ====== 展开逻辑 ======\n\n /** 从 MenuOption[] 中查找所有祖先 key */\n const findParentKeys = (\n items: MenuOption[],\n targetKey: string,\n parentKeys: string[] = []\n ): string[] => {\n for (const item of items) {\n const children = item.children as MenuOption[] | undefined\n if (children?.length) {\n const currentKeys = [...parentKeys, item.key as string]\n if (children.some(child => child.key === targetKey)) {\n return currentKeys\n }\n const result = findParentKeys(children, targetKey, currentKeys)\n if (result.length > 0) return result\n }\n }\n return []\n }\n\n /** 通过路径段推导展开 key + 查找祖先 key */\n const computeExpandedKeys = (path: string): Set<string> => {\n const segments = path.split('/').filter(Boolean)\n const keys = new Set<string>()\n let currentPath = ''\n segments.forEach(segment => {\n currentPath += `/${segment}`\n keys.add(currentPath)\n })\n findParentKeys(mergedOptions.value, path).forEach(key => keys.add(key))\n return keys\n }\n\n // ====== 事件处理 ======\n\n const handleMenuClick = (key: string) => {\n if (key && key !== activeKey.value) {\n emit('select', key)\n }\n }\n\n const onExpandedKeysChange = (keys: string[]) => {\n expandedKeys.value = keys\n emit('update:expandedKeys', keys)\n }\n\n // ====== 暴露方法 ======\n const showOption = (key: string) => menuRef.value?.showOption(key)\n defineExpose({ showOption, menuRef })\n\n // ====== 路由跟踪 ======\n\n watch(\n () => activeKey.value,\n newKey => {\n if (!newKey) return\n const newKeys = computeExpandedKeys(newKey)\n expandedKeys.value = Array.from(\n new Set([...expandedKeys.value, ...newKeys])\n )\n nextTick(() => menuRef.value?.showOption(newKey))\n },\n { immediate: true }\n )\n\n onMounted(() => {\n nextTick(() => {\n if (activeKey.value) {\n expandedKeys.value = Array.from(computeExpandedKeys(activeKey.value))\n menuRef.value?.showOption(activeKey.value)\n }\n })\n })\n</script>\n","<!--\n * @Description: 通用菜单组件 — 基于 NMenu 的树形导航菜单\n *\n * 支持两种数据输入模式:\n * 1. `options` — 直传 NMenu 原生 MenuOption[](零转换,高级用户)\n * 2. `routes` — 传入路由数据,自动通过内置适配器转换为 MenuOption[]\n *\n * @example 路由模式(推荐)\n * ```vue\n * <C_Menu\n * :routes=\"menuData\"\n * :label-formatter=\"$t\"\n * @select=\"router.push\"\n * />\n * ```\n *\n * @example 原生模式\n * ```vue\n * <C_Menu\n * :options=\"nMenuOptions\"\n * @select=\"router.push\"\n * />\n * ```\n *\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <NMenu\n ref=\"menuRef\"\n :options=\"mergedOptions\"\n :expanded-keys=\"expandedKeys\"\n :value=\"activeKey\"\n :mode=\"mode\"\n :collapsed=\"collapsed\"\n :collapsed-width=\"collapsedWidth\"\n :collapsed-icon-size=\"collapsedIconSize\"\n :inverted=\"inverted\"\n :theme-overrides=\"themeOverrides\"\n :dropdown-props=\"dropdownProps\"\n :indent=\"indent\"\n :root-indent=\"rootIndent\"\n @update:value=\"handleMenuClick\"\n @update:expanded-keys=\"onExpandedKeysChange\"\n />\n</template>\n\n<script setup lang=\"ts\">\n import { ref, computed, watch, nextTick, onMounted } from 'vue'\n import {\n type MenuOption,\n type MenuInst,\n type DropdownProps,\n } from 'naive-ui/es'\n import {\n createMenuOptions,\n type RouteItem,\n type MenuAdapterConfig,\n } from '../_shared'\n\n defineOptions({ name: 'C_Menu' })\n\n const props = withDefaults(\n defineProps<{\n /**\n * 模式一:直传 NMenu 原生 MenuOption[]\n * 与 `routes` 二选一,`options` 优先级更高\n */\n options?: MenuOption[]\n /**\n * 模式二:传入路由数据,自动转换为 MenuOption[]\n * 兼容 Vue Router RouteRecordRaw / 后端 JSON 路由表\n */\n routes?: RouteItem[]\n /**\n * 适配器配置(仅 routes 模式生效)\n * 可自定义 key/label/icon 取值、过滤逻辑等\n */\n adapterConfig?: MenuAdapterConfig\n /**\n * 标签文本格式化函数(routes 模式的快捷方式)\n * 等同于 `adapterConfig.labelFormatter`,但优先级更高\n */\n labelFormatter?: (label: string) => string\n /** 当前激活的菜单 key */\n value?: string\n /** 菜单模式 */\n mode?: 'vertical' | 'horizontal'\n /** 是否折叠 */\n collapsed?: boolean\n /** 折叠宽度 */\n collapsedWidth?: number\n /** 折叠图标大小 */\n collapsedIconSize?: number\n /** 是否反色 */\n inverted?: boolean\n /** 主题覆盖 */\n themeOverrides?: Record<string, any>\n /** 缩进像素 */\n indent?: number\n /** 根缩进像素 */\n rootIndent?: number\n /** 下拉菜单属性(折叠模式) */\n dropdownProps?: DropdownProps\n }>(),\n {\n mode: 'vertical',\n collapsed: false,\n collapsedWidth: 64,\n collapsedIconSize: 22,\n inverted: false,\n indent: 24,\n rootIndent: 16,\n dropdownProps: () => ({\n placement: 'right-start' as const,\n trigger: 'hover' as const,\n arrowStyle: { color: 'var(--n-color)' },\n }),\n }\n )\n\n const emit = defineEmits<{\n /** 菜单项被选中 */\n select: [key: string]\n /** 展开项变化 */\n 'update:expandedKeys': [keys: string[]]\n }>()\n\n const menuRef = ref<MenuInst | null>(null)\n const expandedKeys = ref<string[]>([])\n\n const activeKey = computed(() => props.value ?? '')\n\n // ====== 数据合成 ======\n\n /** 合并后的最终 MenuOption[] */\n const mergedOptions = computed<MenuOption[]>(() => {\n // 优先使用 options 直传模式\n if (props.options) return props.options\n\n // routes 模式 → 适配器转换\n if (props.routes) {\n const config: MenuAdapterConfig = {\n ...props.adapterConfig,\n ...(props.labelFormatter && { labelFormatter: props.labelFormatter }),\n }\n return createMenuOptions(props.routes, config)\n }\n\n return []\n })\n\n // ====== 展开逻辑 ======\n\n /** 从 MenuOption[] 中查找所有祖先 key */\n const findParentKeys = (\n items: MenuOption[],\n targetKey: string,\n parentKeys: string[] = []\n ): string[] => {\n for (const item of items) {\n const children = item.children as MenuOption[] | undefined\n if (children?.length) {\n const currentKeys = [...parentKeys, item.key as string]\n if (children.some(child => child.key === targetKey)) {\n return currentKeys\n }\n const result = findParentKeys(children, targetKey, currentKeys)\n if (result.length > 0) return result\n }\n }\n return []\n }\n\n /** 通过路径段推导展开 key + 查找祖先 key */\n const computeExpandedKeys = (path: string): Set<string> => {\n const segments = path.split('/').filter(Boolean)\n const keys = new Set<string>()\n let currentPath = ''\n segments.forEach(segment => {\n currentPath += `/${segment}`\n keys.add(currentPath)\n })\n findParentKeys(mergedOptions.value, path).forEach(key => keys.add(key))\n return keys\n }\n\n // ====== 事件处理 ======\n\n const handleMenuClick = (key: string) => {\n if (key && key !== activeKey.value) {\n emit('select', key)\n }\n }\n\n const onExpandedKeysChange = (keys: string[]) => {\n expandedKeys.value = keys\n emit('update:expandedKeys', keys)\n }\n\n // ====== 暴露方法 ======\n const showOption = (key: string) => menuRef.value?.showOption(key)\n defineExpose({ showOption, menuRef })\n\n // ====== 路由跟踪 ======\n\n watch(\n () => activeKey.value,\n newKey => {\n if (!newKey) return\n const newKeys = computeExpandedKeys(newKey)\n expandedKeys.value = Array.from(\n new Set([...expandedKeys.value, ...newKeys])\n )\n nextTick(() => menuRef.value?.showOption(newKey))\n },\n { immediate: true }\n )\n\n onMounted(() => {\n nextTick(() => {\n if (activeKey.value) {\n expandedKeys.value = Array.from(computeExpandedKeys(activeKey.value))\n menuRef.value?.showOption(activeKey.value)\n }\n })\n })\n</script>\n"],"mappings":"2FAiFA,MAAM,EAAiB,GACrB,EAAK,WAAW,IAAI,CAAG,EAAO,IAAI,IAE9B,EAAiB,GACrB,EAAM,KAAO,EAAc,EAAM,KAAK,CAAG,GAErC,EAAmB,GACvB,EAAM,MAAM,OAAS,EAAM,MAAQ,GAE/B,EAAiB,GAA8B,CAAC,EAAM,MAAM,OAE5D,EACJ,GAC8B,CACzB,KACL,IAAI,OAAO,GAAS,SAClB,WAAA,EAAA,EAAA,GAEI,OACA,CACE,MAAO,SACP,MAAO,6CACR,CACD,EAAA,EAAA,EAAA,GAAGA,EAAAA,KAAM,CAAE,OAAM,CAAC,CAAC,CACpB,CAEL,GAAI,OAAO,GAAS,WAAY,OAAO,IAgBzC,SAAgB,EACd,EACA,EAA4B,EAAE,CAChB,CACd,GAAM,CACJ,iBAAkB,GAAc,EAChC,SAAS,EACT,WAAW,EACX,SAAS,EACT,aAAa,EACb,YAAY,IACV,EAEE,EAAW,GACR,EAAM,OAAO,EAAO,CAAC,IAAI,GAAQ,CACtC,IAAM,EAAO,EAAK,MAAM,MAAS,EAAa,KACxC,EACJ,GAAa,EAAK,UAAU,OAAS,EAAQ,EAAK,SAAS,CAAG,IAAA,GAEhE,MAAO,CACL,IAAK,EAAO,EAAK,CACjB,MAAO,EAAe,EAAS,EAAK,CAAC,CACrC,SAAU,EAAK,UAAY,GAC3B,KAAM,EAAW,EAAK,CACtB,GAAI,EAAK,MAAQ,CAAE,KAAM,EAAK,KAAM,CACpC,GAAI,GAAU,QAAU,CAAE,WAAU,CACrC,EACD,CAGJ,OAAO,EAAQ,EAAO,CAUxB,SAAgB,EACd,EACA,EAAwC,EAC3B,CACb,IAAM,EAAsB,EAAE,CACxB,EAAQ,GAAuB,CACnC,IAAK,IAAM,KAAQ,EACb,EAAO,EAAK,EACd,EAAO,KAAK,EAAK,CAEf,EAAK,UAAU,QACjB,EAAK,EAAK,SAAS,EAKzB,OADA,EAAK,EAAO,CACL,+gBCtHP,IAAM,EAAQ,EA2DR,EAAO,EAOP,GAAA,EAAA,EAAA,KAA+B,KAAI,CACnC,GAAA,EAAA,EAAA,KAA6B,EAAE,CAAA,CAE/B,GAAA,EAAA,EAAA,cAA2B,EAAM,OAAS,GAAE,CAK5C,GAAA,EAAA,EAAA,cAA6C,CAEjD,GAAI,EAAM,QAAS,OAAO,EAAM,QAGhC,GAAI,EAAM,OAAQ,CAChB,IAAM,EAA4B,CAChC,GAAG,EAAM,cACT,GAAI,EAAM,gBAAkB,CAAE,eAAgB,EAAM,eAAA,CACtD,CACA,OAAO,EAAkB,EAAM,OAAQ,EAAM,CAG/C,MAAO,EAAC,EACT,CAKK,GACJ,EACA,EACA,EAAuB,EAAC,GACX,CACb,IAAK,IAAM,KAAQ,EAAO,CACxB,IAAM,EAAW,EAAK,SACtB,GAAI,GAAU,OAAQ,CACpB,IAAM,EAAc,CAAC,GAAG,EAAY,EAAK,IAAa,CACtD,GAAI,EAAS,KAAK,GAAS,EAAM,MAAQ,EAAU,CACjD,OAAO,EAET,IAAM,EAAS,EAAe,EAAU,EAAW,EAAW,CAC9D,GAAI,EAAO,OAAS,EAAG,OAAO,GAGlC,MAAO,EAAC,EAIJ,EAAuB,GAA8B,CACzD,IAAM,EAAW,EAAK,MAAM,IAAI,CAAC,OAAO,QAAO,CACzC,EAAO,IAAI,IACb,EAAc,GAMlB,OALA,EAAS,QAAQ,GAAW,CAC1B,GAAe,IAAI,IACnB,EAAK,IAAI,EAAW,EACrB,CACD,EAAe,EAAc,MAAO,EAAK,CAAC,QAAQ,GAAO,EAAK,IAAI,EAAI,CAAA,CAC/D,GAKH,EAAmB,GAAgB,CACnC,GAAO,IAAQ,EAAU,OAC3B,EAAK,SAAU,EAAG,EAIhB,EAAwB,GAAmB,CAC/C,EAAa,MAAQ,EACrB,EAAK,sBAAuB,EAAI,SAKlC,EAAa,CAAE,WADK,GAAgB,EAAQ,OAAO,WAAW,EAAG,CACtC,UAAS,CAAA,EAIpC,EAAA,EAAA,WACQ,EAAU,MAChB,GAAU,CACR,GAAI,CAAC,EAAQ,OACb,IAAM,EAAU,EAAoB,EAAM,CAC1C,EAAa,MAAQ,MAAM,KACzB,IAAI,IAAI,CAAC,GAAG,EAAa,MAAO,GAAG,EAAQ,CAAA,CAC7C,EACA,EAAA,EAAA,cAAe,EAAQ,OAAO,WAAW,EAAO,CAAA,EAElD,CAAE,UAAW,GAAK,CACpB,EAEA,EAAA,EAAA,eAAgB,EACd,EAAA,EAAA,cAAe,CACT,EAAU,QACZ,EAAa,MAAQ,MAAM,KAAK,EAAoB,EAAU,MAAM,CAAA,CACpE,EAAQ,OAAO,WAAW,EAAU,MAAK,GAE5C,EACF,iECtLC,EAAA,SAfI,UAAJ,IAAI,EACH,QAAS,EAAA,MACT,gBAAe,EAAA,MACf,MAAO,EAAA,MACP,KAAMC,EAAAA,KACN,UAAWC,EAAAA,UACX,kBAAiBC,EAAAA,eACjB,sBAAqBC,EAAAA,kBACrB,SAAUC,EAAAA,SACV,kBAAiBC,EAAAA,eACjB,iBAAgBC,EAAAA,cAChB,OAAQC,EAAAA,OACR,cAAaC,EAAAA,WACb,iBAAc,EACd,wBAAsB"}
1
+ {"version":3,"file":"C_Menu.js","names":["mode","collapsed","collapsedWidth","collapsedIconSize","inverted","themeOverrides","dropdownProps","indent","rootIndent"],"sources":["../src/components/C_Menu/index.vue","../src/components/C_Menu/index.vue"],"sourcesContent":["<!--\n * @Description: 通用菜单组件 — 基于 NMenu 的树形导航菜单\n *\n * 支持两种数据输入模式:\n * 1. `options` — 直传 NMenu 原生 MenuOption[](零转换,高级用户)\n * 2. `routes` — 传入路由数据,自动通过内置适配器转换为 MenuOption[]\n *\n * @example 路由模式(推荐)\n * ```vue\n * <C_Menu\n * :routes=\"menuData\"\n * :label-formatter=\"$t\"\n * @select=\"router.push\"\n * />\n * ```\n *\n * @example 原生模式\n * ```vue\n * <C_Menu\n * :options=\"nMenuOptions\"\n * @select=\"router.push\"\n * />\n * ```\n *\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <NMenu\n ref=\"menuRef\"\n :options=\"mergedOptions\"\n :expanded-keys=\"expandedKeys\"\n :value=\"activeKey\"\n :mode=\"mode\"\n :collapsed=\"collapsed\"\n :collapsed-width=\"collapsedWidth\"\n :collapsed-icon-size=\"collapsedIconSize\"\n :inverted=\"inverted\"\n :theme-overrides=\"themeOverrides\"\n :dropdown-props=\"dropdownProps\"\n :indent=\"indent\"\n :root-indent=\"rootIndent\"\n @update:value=\"handleMenuClick\"\n @update:expanded-keys=\"onExpandedKeysChange\"\n />\n</template>\n\n<script setup lang=\"ts\">\n import { ref, computed, watch, nextTick, onMounted } from 'vue'\n import {\n type MenuOption,\n type MenuInst,\n type DropdownProps,\n } from 'naive-ui/es'\n import {\n createMenuOptions,\n type RouteItem,\n type MenuAdapterConfig,\n } from '../_shared'\n\n defineOptions({ name: 'C_Menu' })\n\n const props = withDefaults(\n defineProps<{\n /**\n * 模式一:直传 NMenu 原生 MenuOption[]\n * 与 `routes` 二选一,`options` 优先级更高\n */\n options?: MenuOption[]\n /**\n * 模式二:传入路由数据,自动转换为 MenuOption[]\n * 兼容 Vue Router RouteRecordRaw / 后端 JSON 路由表\n */\n routes?: RouteItem[]\n /**\n * 适配器配置(仅 routes 模式生效)\n * 可自定义 key/label/icon 取值、过滤逻辑等\n */\n adapterConfig?: MenuAdapterConfig\n /**\n * 标签文本格式化函数(routes 模式的快捷方式)\n * 等同于 `adapterConfig.labelFormatter`,但优先级更高\n */\n labelFormatter?: (label: string) => string\n /** 当前激活的菜单 key */\n value?: string\n /** 菜单模式 */\n mode?: 'vertical' | 'horizontal'\n /** 是否折叠 */\n collapsed?: boolean\n /** 折叠宽度 */\n collapsedWidth?: number\n /** 折叠图标大小 */\n collapsedIconSize?: number\n /** 是否反色 */\n inverted?: boolean\n /** 主题覆盖 */\n themeOverrides?: Record<string, any>\n /** 缩进像素 */\n indent?: number\n /** 根缩进像素 */\n rootIndent?: number\n /** 下拉菜单属性(折叠模式) */\n dropdownProps?: DropdownProps\n }>(),\n {\n mode: 'vertical',\n collapsed: false,\n collapsedWidth: 64,\n collapsedIconSize: 22,\n inverted: false,\n indent: 24,\n rootIndent: 16,\n dropdownProps: () => ({\n placement: 'right-start' as const,\n trigger: 'hover' as const,\n arrowStyle: { color: 'var(--n-color)' },\n }),\n }\n )\n\n const emit = defineEmits<{\n /** 菜单项被选中 */\n select: [key: string]\n /** 展开项变化 */\n 'update:expandedKeys': [keys: string[]]\n }>()\n\n const menuRef = ref<MenuInst | null>(null)\n const expandedKeys = ref<string[]>([])\n\n const activeKey = computed(() => props.value ?? '')\n\n // ====== 数据合成 ======\n\n /** 合并后的最终 MenuOption[] */\n const mergedOptions = computed<MenuOption[]>(() => {\n // 优先使用 options 直传模式\n if (props.options) return props.options\n\n // routes 模式 → 适配器转换\n if (props.routes) {\n const config: MenuAdapterConfig = {\n ...props.adapterConfig,\n ...(props.labelFormatter && { labelFormatter: props.labelFormatter }),\n }\n return createMenuOptions(props.routes, config)\n }\n\n return []\n })\n\n // ====== 展开逻辑 ======\n\n /** 从 MenuOption[] 中查找所有祖先 key */\n const findParentKeys = (\n items: MenuOption[],\n targetKey: string,\n parentKeys: string[] = []\n ): string[] => {\n for (const item of items) {\n const children = item.children as MenuOption[] | undefined\n if (children?.length) {\n const currentKeys = [...parentKeys, item.key as string]\n if (children.some(child => child.key === targetKey)) {\n return currentKeys\n }\n const result = findParentKeys(children, targetKey, currentKeys)\n if (result.length > 0) return result\n }\n }\n return []\n }\n\n /** 通过路径段推导展开 key + 查找祖先 key */\n const computeExpandedKeys = (path: string): Set<string> => {\n const segments = path.split('/').filter(Boolean)\n const keys = new Set<string>()\n let currentPath = ''\n segments.forEach(segment => {\n currentPath += `/${segment}`\n keys.add(currentPath)\n })\n findParentKeys(mergedOptions.value, path).forEach(key => keys.add(key))\n return keys\n }\n\n // ====== 事件处理 ======\n\n const handleMenuClick = (key: string) => {\n if (key && key !== activeKey.value) {\n emit('select', key)\n }\n }\n\n const onExpandedKeysChange = (keys: string[]) => {\n expandedKeys.value = keys\n emit('update:expandedKeys', keys)\n }\n\n // ====== 暴露方法 ======\n const showOption = (key: string) => menuRef.value?.showOption(key)\n defineExpose({ showOption, menuRef })\n\n // ====== 路由跟踪 ======\n\n watch(\n () => activeKey.value,\n newKey => {\n if (!newKey) return\n const newKeys = computeExpandedKeys(newKey)\n expandedKeys.value = Array.from(\n new Set([...expandedKeys.value, ...newKeys])\n )\n nextTick(() => menuRef.value?.showOption(newKey))\n },\n { immediate: true }\n )\n\n onMounted(() => {\n nextTick(() => {\n if (activeKey.value) {\n expandedKeys.value = Array.from(computeExpandedKeys(activeKey.value))\n menuRef.value?.showOption(activeKey.value)\n }\n })\n })\n</script>\n","<!--\n * @Description: 通用菜单组件 — 基于 NMenu 的树形导航菜单\n *\n * 支持两种数据输入模式:\n * 1. `options` — 直传 NMenu 原生 MenuOption[](零转换,高级用户)\n * 2. `routes` — 传入路由数据,自动通过内置适配器转换为 MenuOption[]\n *\n * @example 路由模式(推荐)\n * ```vue\n * <C_Menu\n * :routes=\"menuData\"\n * :label-formatter=\"$t\"\n * @select=\"router.push\"\n * />\n * ```\n *\n * @example 原生模式\n * ```vue\n * <C_Menu\n * :options=\"nMenuOptions\"\n * @select=\"router.push\"\n * />\n * ```\n *\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <NMenu\n ref=\"menuRef\"\n :options=\"mergedOptions\"\n :expanded-keys=\"expandedKeys\"\n :value=\"activeKey\"\n :mode=\"mode\"\n :collapsed=\"collapsed\"\n :collapsed-width=\"collapsedWidth\"\n :collapsed-icon-size=\"collapsedIconSize\"\n :inverted=\"inverted\"\n :theme-overrides=\"themeOverrides\"\n :dropdown-props=\"dropdownProps\"\n :indent=\"indent\"\n :root-indent=\"rootIndent\"\n @update:value=\"handleMenuClick\"\n @update:expanded-keys=\"onExpandedKeysChange\"\n />\n</template>\n\n<script setup lang=\"ts\">\n import { ref, computed, watch, nextTick, onMounted } from 'vue'\n import {\n type MenuOption,\n type MenuInst,\n type DropdownProps,\n } from 'naive-ui/es'\n import {\n createMenuOptions,\n type RouteItem,\n type MenuAdapterConfig,\n } from '../_shared'\n\n defineOptions({ name: 'C_Menu' })\n\n const props = withDefaults(\n defineProps<{\n /**\n * 模式一:直传 NMenu 原生 MenuOption[]\n * 与 `routes` 二选一,`options` 优先级更高\n */\n options?: MenuOption[]\n /**\n * 模式二:传入路由数据,自动转换为 MenuOption[]\n * 兼容 Vue Router RouteRecordRaw / 后端 JSON 路由表\n */\n routes?: RouteItem[]\n /**\n * 适配器配置(仅 routes 模式生效)\n * 可自定义 key/label/icon 取值、过滤逻辑等\n */\n adapterConfig?: MenuAdapterConfig\n /**\n * 标签文本格式化函数(routes 模式的快捷方式)\n * 等同于 `adapterConfig.labelFormatter`,但优先级更高\n */\n labelFormatter?: (label: string) => string\n /** 当前激活的菜单 key */\n value?: string\n /** 菜单模式 */\n mode?: 'vertical' | 'horizontal'\n /** 是否折叠 */\n collapsed?: boolean\n /** 折叠宽度 */\n collapsedWidth?: number\n /** 折叠图标大小 */\n collapsedIconSize?: number\n /** 是否反色 */\n inverted?: boolean\n /** 主题覆盖 */\n themeOverrides?: Record<string, any>\n /** 缩进像素 */\n indent?: number\n /** 根缩进像素 */\n rootIndent?: number\n /** 下拉菜单属性(折叠模式) */\n dropdownProps?: DropdownProps\n }>(),\n {\n mode: 'vertical',\n collapsed: false,\n collapsedWidth: 64,\n collapsedIconSize: 22,\n inverted: false,\n indent: 24,\n rootIndent: 16,\n dropdownProps: () => ({\n placement: 'right-start' as const,\n trigger: 'hover' as const,\n arrowStyle: { color: 'var(--n-color)' },\n }),\n }\n )\n\n const emit = defineEmits<{\n /** 菜单项被选中 */\n select: [key: string]\n /** 展开项变化 */\n 'update:expandedKeys': [keys: string[]]\n }>()\n\n const menuRef = ref<MenuInst | null>(null)\n const expandedKeys = ref<string[]>([])\n\n const activeKey = computed(() => props.value ?? '')\n\n // ====== 数据合成 ======\n\n /** 合并后的最终 MenuOption[] */\n const mergedOptions = computed<MenuOption[]>(() => {\n // 优先使用 options 直传模式\n if (props.options) return props.options\n\n // routes 模式 → 适配器转换\n if (props.routes) {\n const config: MenuAdapterConfig = {\n ...props.adapterConfig,\n ...(props.labelFormatter && { labelFormatter: props.labelFormatter }),\n }\n return createMenuOptions(props.routes, config)\n }\n\n return []\n })\n\n // ====== 展开逻辑 ======\n\n /** 从 MenuOption[] 中查找所有祖先 key */\n const findParentKeys = (\n items: MenuOption[],\n targetKey: string,\n parentKeys: string[] = []\n ): string[] => {\n for (const item of items) {\n const children = item.children as MenuOption[] | undefined\n if (children?.length) {\n const currentKeys = [...parentKeys, item.key as string]\n if (children.some(child => child.key === targetKey)) {\n return currentKeys\n }\n const result = findParentKeys(children, targetKey, currentKeys)\n if (result.length > 0) return result\n }\n }\n return []\n }\n\n /** 通过路径段推导展开 key + 查找祖先 key */\n const computeExpandedKeys = (path: string): Set<string> => {\n const segments = path.split('/').filter(Boolean)\n const keys = new Set<string>()\n let currentPath = ''\n segments.forEach(segment => {\n currentPath += `/${segment}`\n keys.add(currentPath)\n })\n findParentKeys(mergedOptions.value, path).forEach(key => keys.add(key))\n return keys\n }\n\n // ====== 事件处理 ======\n\n const handleMenuClick = (key: string) => {\n if (key && key !== activeKey.value) {\n emit('select', key)\n }\n }\n\n const onExpandedKeysChange = (keys: string[]) => {\n expandedKeys.value = keys\n emit('update:expandedKeys', keys)\n }\n\n // ====== 暴露方法 ======\n const showOption = (key: string) => menuRef.value?.showOption(key)\n defineExpose({ showOption, menuRef })\n\n // ====== 路由跟踪 ======\n\n watch(\n () => activeKey.value,\n newKey => {\n if (!newKey) return\n const newKeys = computeExpandedKeys(newKey)\n expandedKeys.value = Array.from(\n new Set([...expandedKeys.value, ...newKeys])\n )\n nextTick(() => menuRef.value?.showOption(newKey))\n },\n { immediate: true }\n )\n\n onMounted(() => {\n nextTick(() => {\n if (activeKey.value) {\n expandedKeys.value = Array.from(computeExpandedKeys(activeKey.value))\n menuRef.value?.showOption(activeKey.value)\n }\n })\n })\n</script>\n"],"mappings":"knBA6DE,IAAM,EAAQ,EA2DR,EAAO,EAOP,GAAA,EAAA,EAAA,KAA+B,KAAI,CACnC,GAAA,EAAA,EAAA,KAA6B,EAAE,CAAA,CAE/B,GAAA,EAAA,EAAA,cAA2B,EAAM,OAAS,GAAE,CAK5C,GAAA,EAAA,EAAA,cAA6C,CAEjD,GAAI,EAAM,QAAS,OAAO,EAAM,QAGhC,GAAI,EAAM,OAAQ,CAChB,IAAM,EAA4B,CAChC,GAAG,EAAM,cACT,GAAI,EAAM,gBAAkB,CAAE,eAAgB,EAAM,eAAA,CACtD,CACA,OAAO,EAAA,EAAkB,EAAM,OAAQ,EAAM,CAG/C,MAAO,EAAC,EACT,CAKK,GACJ,EACA,EACA,EAAuB,EAAC,GACX,CACb,IAAK,IAAM,KAAQ,EAAO,CACxB,IAAM,EAAW,EAAK,SACtB,GAAI,GAAU,OAAQ,CACpB,IAAM,EAAc,CAAC,GAAG,EAAY,EAAK,IAAa,CACtD,GAAI,EAAS,KAAK,GAAS,EAAM,MAAQ,EAAU,CACjD,OAAO,EAET,IAAM,EAAS,EAAe,EAAU,EAAW,EAAW,CAC9D,GAAI,EAAO,OAAS,EAAG,OAAO,GAGlC,MAAO,EAAC,EAIJ,EAAuB,GAA8B,CACzD,IAAM,EAAW,EAAK,MAAM,IAAI,CAAC,OAAO,QAAO,CACzC,EAAO,IAAI,IACb,EAAc,GAMlB,OALA,EAAS,QAAQ,GAAW,CAC1B,GAAe,IAAI,IACnB,EAAK,IAAI,EAAW,EACrB,CACD,EAAe,EAAc,MAAO,EAAK,CAAC,QAAQ,GAAO,EAAK,IAAI,EAAI,CAAA,CAC/D,GAKH,EAAmB,GAAgB,CACnC,GAAO,IAAQ,EAAU,OAC3B,EAAK,SAAU,EAAG,EAIhB,EAAwB,GAAmB,CAC/C,EAAa,MAAQ,EACrB,EAAK,sBAAuB,EAAI,SAKlC,EAAa,CAAE,WADK,GAAgB,EAAQ,OAAO,WAAW,EAAG,CACtC,UAAS,CAAA,EAIpC,EAAA,EAAA,WACQ,EAAU,MAChB,GAAU,CACR,GAAI,CAAC,EAAQ,OACb,IAAM,EAAU,EAAoB,EAAM,CAC1C,EAAa,MAAQ,MAAM,KACzB,IAAI,IAAI,CAAC,GAAG,EAAa,MAAO,GAAG,EAAQ,CAAA,CAC7C,EACA,EAAA,EAAA,cAAe,EAAQ,OAAO,WAAW,EAAO,CAAA,EAElD,CAAE,UAAW,GAAK,CACpB,EAEA,EAAA,EAAA,eAAgB,EACd,EAAA,EAAA,cAAe,CACT,EAAU,QACZ,EAAa,MAAQ,MAAM,KAAK,EAAoB,EAAU,MAAM,CAAA,CACpE,EAAQ,OAAO,WAAW,EAAU,MAAK,GAE5C,EACF,iECtLC,EAAA,SAfI,UAAJ,IAAI,EACH,QAAS,EAAA,MACT,gBAAe,EAAA,MACf,MAAO,EAAA,MACP,KAAMA,EAAAA,KACN,UAAWC,EAAAA,UACX,kBAAiBC,EAAAA,eACjB,sBAAqBC,EAAAA,kBACrB,SAAUC,EAAAA,SACV,kBAAiBC,EAAAA,eACjB,iBAAgBC,EAAAA,cAChB,OAAQC,EAAAA,OACR,cAAaC,EAAAA,WACb,iBAAc,EACd,wBAAsB"}
package/dist/C_Menu2.js CHANGED
@@ -1,2 +1,2 @@
1
- import{NMenu as e}from"naive-ui";import{computed as t,createBlock as n,defineComponent as r,h as i,nextTick as a,onMounted as o,openBlock as s,ref as c,resolveComponent as l,watch as u}from"vue";import{Icon as d}from"@iconify/vue";const f=e=>e.startsWith(`/`)?e:`/${e}`,p=e=>e.path?f(e.path):``,m=e=>e.meta?.title||e.name||``,h=e=>!e.meta?.hidden,g=e=>{if(e){if(typeof e==`string`)return()=>i(`span`,{class:`n-icon`,style:`display: inline-flex; align-items: center;`},[i(d,{icon:e})]);if(typeof e==`function`)return e}};function _(e,t={}){let{labelFormatter:n=e=>e,getKey:r=p,getLabel:i=m,filter:a=h,renderIcon:o=g,recursive:s=!0}=t,c=e=>e.filter(a).map(e=>{let t=e.meta?.icon||e.icon,a=s&&e.children?.length?c(e.children):void 0;return{key:r(e),label:n(i(e)),disabled:e.disabled||!1,icon:o(t),...e.type&&{type:e.type},...a?.length&&{children:a}}});return c(e)}function v(e,t=h){let n=[],r=e=>{for(let i of e)t(i)&&n.push(i),i.children?.length&&r(i.children)};return r(e),n}const y=r({name:`C_Menu`,__name:`index`,props:{options:{},routes:{},adapterConfig:{},labelFormatter:{},value:{},mode:{default:`vertical`},collapsed:{type:Boolean,default:!1},collapsedWidth:{default:64},collapsedIconSize:{default:22},inverted:{type:Boolean,default:!1},themeOverrides:{},indent:{default:24},rootIndent:{default:16},dropdownProps:{default:()=>({placement:`right-start`,trigger:`hover`,arrowStyle:{color:`var(--n-color)`}})}},emits:[`select`,`update:expandedKeys`],setup(r,{expose:i,emit:l}){let d=r,f=l,p=c(null),m=c([]),h=t(()=>d.value??``),g=t(()=>{if(d.options)return d.options;if(d.routes){let e={...d.adapterConfig,...d.labelFormatter&&{labelFormatter:d.labelFormatter}};return _(d.routes,e)}return[]}),v=(e,t,n=[])=>{for(let r of e){let e=r.children;if(e?.length){let i=[...n,r.key];if(e.some(e=>e.key===t))return i;let a=v(e,t,i);if(a.length>0)return a}}return[]},y=e=>{let t=e.split(`/`).filter(Boolean),n=new Set,r=``;return t.forEach(e=>{r+=`/${e}`,n.add(r)}),v(g.value,e).forEach(e=>n.add(e)),n},b=e=>{e&&e!==h.value&&f(`select`,e)},x=e=>{m.value=e,f(`update:expandedKeys`,e)};return i({showOption:e=>p.value?.showOption(e),menuRef:p}),u(()=>h.value,e=>{if(!e)return;let t=y(e);m.value=Array.from(new Set([...m.value,...t])),a(()=>p.value?.showOption(e))},{immediate:!0}),o(()=>{a(()=>{h.value&&(m.value=Array.from(y(h.value)),p.value?.showOption(h.value))})}),(t,r)=>{let i=e;return s(),n(i,{ref_key:`menuRef`,ref:p,options:g.value,"expanded-keys":m.value,value:h.value,mode:t.mode,collapsed:t.collapsed,"collapsed-width":t.collapsedWidth,"collapsed-icon-size":t.collapsedIconSize,inverted:t.inverted,"theme-overrides":t.themeOverrides,"dropdown-props":t.dropdownProps,indent:t.indent,"root-indent":t.rootIndent,"onUpdate:value":b,"onUpdate:expandedKeys":x},null,8,[`options`,`expanded-keys`,`value`,`mode`,`collapsed`,`collapsed-width`,`collapsed-icon-size`,`inverted`,`theme-overrides`,`dropdown-props`,`indent`,`root-indent`])}}});export{_ as n,v as r,y as t};
1
+ import{t as e}from"./menuAdapter.js";import{NMenu as t}from"naive-ui";import{computed as n,createBlock as r,defineComponent as i,nextTick as a,onMounted as o,openBlock as s,ref as c,resolveComponent as l,watch as u}from"vue";const d=i({name:`C_Menu`,__name:`index`,props:{options:{},routes:{},adapterConfig:{},labelFormatter:{},value:{},mode:{default:`vertical`},collapsed:{type:Boolean,default:!1},collapsedWidth:{default:64},collapsedIconSize:{default:22},inverted:{type:Boolean,default:!1},themeOverrides:{},indent:{default:24},rootIndent:{default:16},dropdownProps:{default:()=>({placement:`right-start`,trigger:`hover`,arrowStyle:{color:`var(--n-color)`}})}},emits:[`select`,`update:expandedKeys`],setup(i,{expose:l,emit:d}){let f=i,p=d,m=c(null),h=c([]),g=n(()=>f.value??``),_=n(()=>{if(f.options)return f.options;if(f.routes){let t={...f.adapterConfig,...f.labelFormatter&&{labelFormatter:f.labelFormatter}};return e(f.routes,t)}return[]}),v=(e,t,n=[])=>{for(let r of e){let e=r.children;if(e?.length){let i=[...n,r.key];if(e.some(e=>e.key===t))return i;let a=v(e,t,i);if(a.length>0)return a}}return[]},y=e=>{let t=e.split(`/`).filter(Boolean),n=new Set,r=``;return t.forEach(e=>{r+=`/${e}`,n.add(r)}),v(_.value,e).forEach(e=>n.add(e)),n},b=e=>{e&&e!==g.value&&p(`select`,e)},x=e=>{h.value=e,p(`update:expandedKeys`,e)};return l({showOption:e=>m.value?.showOption(e),menuRef:m}),u(()=>g.value,e=>{if(!e)return;let t=y(e);h.value=Array.from(new Set([...h.value,...t])),a(()=>m.value?.showOption(e))},{immediate:!0}),o(()=>{a(()=>{g.value&&(h.value=Array.from(y(g.value)),m.value?.showOption(g.value))})}),(e,n)=>{let i=t;return s(),r(i,{ref_key:`menuRef`,ref:m,options:_.value,"expanded-keys":h.value,value:g.value,mode:e.mode,collapsed:e.collapsed,"collapsed-width":e.collapsedWidth,"collapsed-icon-size":e.collapsedIconSize,inverted:e.inverted,"theme-overrides":e.themeOverrides,"dropdown-props":e.dropdownProps,indent:e.indent,"root-indent":e.rootIndent,"onUpdate:value":b,"onUpdate:expandedKeys":x},null,8,[`options`,`expanded-keys`,`value`,`mode`,`collapsed`,`collapsed-width`,`collapsed-icon-size`,`inverted`,`theme-overrides`,`dropdown-props`,`indent`,`root-indent`])}}});export{d as t};
2
2
  //# sourceMappingURL=C_Menu2.js.map