@robot-admin/naive-ui-components 0.6.10 → 0.6.12

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 (350) hide show
  1. package/CHANGELOG.md +48 -48
  2. package/README.md +36 -20
  3. package/dist/C_ActionBar-jZPsiXtT.css.map +1 -0
  4. package/dist/C_ActionBar-nnfbZCea.css.map +1 -0
  5. package/dist/C_ActionBar.css +47 -47
  6. package/dist/C_ActionBar.js.map +1 -1
  7. package/dist/C_ActionBar2.js +1 -1
  8. package/dist/C_ActionBar2.js.map +1 -1
  9. package/dist/{C_AntV-BY8jqqmi.css.map → C_AntV-A3NXx_sF.css.map} +1 -1
  10. package/dist/{C_AntV-BbkHc-_a.css.map → C_AntV-D2Zp2qQF.css.map} +1 -1
  11. package/dist/C_AntV.css +78 -78
  12. package/dist/C_AntV.js.map +1 -1
  13. package/dist/C_AntV2.js +2 -2
  14. package/dist/C_AntV2.js.map +1 -1
  15. package/dist/C_AudioPlayer-CXl4yP_m.css.map +1 -0
  16. package/dist/C_AudioPlayer-CcBtt71m.css.map +1 -0
  17. package/dist/C_AudioPlayer.cjs +1 -0
  18. package/dist/C_AudioPlayer.css +283 -0
  19. package/dist/C_AudioPlayer.d.cts +2 -0
  20. package/dist/C_AudioPlayer.d.ts +2 -0
  21. package/dist/C_AudioPlayer.js +1 -0
  22. package/dist/C_AudioPlayer.js.map +1 -0
  23. package/dist/C_AudioPlayer2.js +2 -0
  24. package/dist/C_AudioPlayer2.js.map +1 -0
  25. package/dist/C_AvatarGroup-CtPhfH9h.css.map +1 -0
  26. package/dist/C_AvatarGroup-M1dNPH3E.css.map +1 -0
  27. package/dist/C_AvatarGroup.cjs +1 -0
  28. package/dist/C_AvatarGroup.css +107 -0
  29. package/dist/C_AvatarGroup.d.cts +2 -0
  30. package/dist/C_AvatarGroup.d.ts +2 -0
  31. package/dist/C_AvatarGroup.js +1 -0
  32. package/dist/C_AvatarGroup.js.map +1 -0
  33. package/dist/C_AvatarGroup2.js +2 -0
  34. package/dist/C_AvatarGroup2.js.map +1 -0
  35. package/dist/{C_Barcode-DYDRDe2O.css.map → C_Barcode-DjTmDkbQ.css.map} +1 -1
  36. package/dist/{C_Barcode-muJdc_O4.css.map → C_Barcode-Do1Ozsmh.css.map} +1 -1
  37. package/dist/C_Barcode.css +7 -7
  38. package/dist/C_Barcode.d.cts +1 -1
  39. package/dist/C_Barcode.d.ts +1 -1
  40. package/dist/C_Barcode.js.map +1 -1
  41. package/dist/C_Barcode2.js +1 -1
  42. package/dist/C_Barcode2.js.map +1 -1
  43. package/dist/C_Breadcrumb.d.cts +1 -1
  44. package/dist/C_Breadcrumb.d.ts +1 -1
  45. package/dist/C_Breadcrumb.js.map +1 -1
  46. package/dist/C_Breadcrumb2.js.map +1 -1
  47. package/dist/{C_Captcha-9_hk6VmY.css.map → C_Captcha-CZmAETly.css.map} +1 -1
  48. package/dist/{C_Captcha-MtASlJ0f.css.map → C_Captcha-Ccq3DMrR.css.map} +1 -1
  49. package/dist/C_Captcha.css +19 -19
  50. package/dist/C_Captcha.d.cts +1 -1
  51. package/dist/C_Captcha.d.ts +1 -1
  52. package/dist/C_Captcha.js.map +1 -1
  53. package/dist/C_Captcha2.js +1 -1
  54. package/dist/C_Captcha2.js.map +1 -1
  55. package/dist/C_Cascade.d.cts +1 -1
  56. package/dist/C_Cascade.d.ts +1 -1
  57. package/dist/C_Chat-CcdWgVE8.css.map +1 -0
  58. package/dist/C_Chat-Cx0woEEe.css.map +1 -0
  59. package/dist/C_Chat.cjs +1 -0
  60. package/dist/C_Chat.css +395 -0
  61. package/dist/C_Chat.d.cts +2 -0
  62. package/dist/C_Chat.d.ts +2 -0
  63. package/dist/C_Chat.js +1 -0
  64. package/dist/C_Chat.js.map +1 -0
  65. package/dist/C_Chat2.js +2 -0
  66. package/dist/C_Chat2.js.map +1 -0
  67. package/dist/{C_City-Bam08Qv3.css.map → C_City-Cv5BESaN.css.map} +1 -1
  68. package/dist/{C_City-Bb3W-KaN.css.map → C_City-DNKv4MpH.css.map} +1 -1
  69. package/dist/C_City.css +29 -29
  70. package/dist/C_City.d.cts +1 -1
  71. package/dist/C_City.d.ts +1 -1
  72. package/dist/C_City.js.map +1 -1
  73. package/dist/C_City2.js +1 -1
  74. package/dist/C_City2.js.map +1 -1
  75. package/dist/C_Code-DPZlNSxL.css.map +1 -0
  76. package/dist/C_Code-avZjAnHD.css.map +1 -0
  77. package/dist/C_Code.css +3 -3
  78. package/dist/C_Code.d.cts +1 -1
  79. package/dist/C_Code.d.ts +1 -1
  80. package/dist/C_Code.js.map +1 -1
  81. package/dist/C_Code2.js +1 -1
  82. package/dist/C_Code2.js.map +1 -1
  83. package/dist/{C_CollapsePanel-BCmTFuDz.css.map → C_CollapsePanel-BpofCDyl.css.map} +1 -1
  84. package/dist/{C_CollapsePanel-Bxnh4Zy-.css.map → C_CollapsePanel-Fap-lv_5.css.map} +1 -1
  85. package/dist/C_CollapsePanel.css +35 -35
  86. package/dist/C_CollapsePanel.js.map +1 -1
  87. package/dist/C_CollapsePanel2.js +1 -1
  88. package/dist/C_CollapsePanel2.js.map +1 -1
  89. package/dist/C_ContextMenu-CCsCeI39.css.map +1 -0
  90. package/dist/C_ContextMenu-DOTBeltf.css.map +1 -0
  91. package/dist/C_ContextMenu.cjs +1 -0
  92. package/dist/C_ContextMenu.css +115 -0
  93. package/dist/C_ContextMenu.d.cts +2 -0
  94. package/dist/C_ContextMenu.d.ts +2 -0
  95. package/dist/C_ContextMenu.js +1 -0
  96. package/dist/C_ContextMenu.js.map +1 -0
  97. package/dist/C_ContextMenu2.js +2 -0
  98. package/dist/C_ContextMenu2.js.map +1 -0
  99. package/dist/{C_Cron-Civir5-I.css.map → C_Cron-C0-8b5af.css.map} +1 -1
  100. package/dist/{C_Cron-iw3qpMsy.css.map → C_Cron-DqHQ92LN.css.map} +1 -1
  101. package/dist/C_Cron.css +37 -37
  102. package/dist/C_Cron.js.map +1 -1
  103. package/dist/C_Cron2.js +1 -1
  104. package/dist/C_Cron2.js.map +1 -1
  105. package/dist/C_Date.d.cts +1 -1
  106. package/dist/C_Date.d.ts +1 -1
  107. package/dist/{C_Draggable-BCjIvIwT.css.map → C_Draggable-Bq6o0qXn.css.map} +1 -1
  108. package/dist/{C_Draggable-DwkSlCOS.css.map → C_Draggable-r6nhx3yM.css.map} +1 -1
  109. package/dist/C_Draggable.css +46 -46
  110. package/dist/C_Draggable.js.map +1 -1
  111. package/dist/C_Draggable2.js +1 -1
  112. package/dist/C_Draggable2.js.map +1 -1
  113. package/dist/C_Editor.d.cts +1 -1
  114. package/dist/C_Editor.d.ts +1 -1
  115. package/dist/{C_FilePreview-BhcbiXsV.css.map → C_FilePreview-BVarVvnD.css.map} +1 -1
  116. package/dist/{C_FilePreview-DJudcIbW.css.map → C_FilePreview-DHGlV4OR.css.map} +1 -1
  117. package/dist/C_FilePreview.css +91 -91
  118. package/dist/C_FilePreview.js.map +1 -1
  119. package/dist/C_FilePreview2.js +1 -1
  120. package/dist/C_FilePreview2.js.map +1 -1
  121. package/dist/{C_Form-BtcAPIRi.css.map → C_Form-BciQUPpS.css.map} +1 -1
  122. package/dist/{C_Form-D_gwQ7hC.css.map → C_Form-CKHvXL3O.css.map} +1 -1
  123. package/dist/C_Form.css +222 -222
  124. package/dist/C_Form.js.map +1 -1
  125. package/dist/C_Form2.js +1 -1
  126. package/dist/C_Form2.js.map +1 -1
  127. package/dist/{C_FormSearch-Bi4XYjjk.css.map → C_FormSearch-Bmd2CmG6.css.map} +1 -1
  128. package/dist/{C_FormSearch-DUGOoX0u.css.map → C_FormSearch-DBNtnjaL.css.map} +1 -1
  129. package/dist/C_FormSearch.css +45 -45
  130. package/dist/C_FormSearch.js.map +1 -1
  131. package/dist/C_FormSearch2.js +1 -1
  132. package/dist/C_FormSearch2.js.map +1 -1
  133. package/dist/{C_FormulaEditor-CJk3SSUJ.css.map → C_FormulaEditor-3WG2vtQl.css.map} +1 -1
  134. package/dist/{C_FormulaEditor-Cy7mjfVO.css.map → C_FormulaEditor-Cm0CokN5.css.map} +1 -1
  135. package/dist/C_FormulaEditor.css +78 -78
  136. package/dist/C_FormulaEditor.js.map +1 -1
  137. package/dist/C_FormulaEditor2.js +1 -1
  138. package/dist/C_FormulaEditor2.js.map +1 -1
  139. package/dist/C_FullCalendar-1U4VlG7X.css.map +1 -0
  140. package/dist/C_FullCalendar-DLUdCtqf.css.map +1 -0
  141. package/dist/C_FullCalendar.css +3 -3
  142. package/dist/C_FullCalendar.js.map +1 -1
  143. package/dist/C_FullCalendar2.js +1 -1
  144. package/dist/C_FullCalendar2.js.map +1 -1
  145. package/dist/C_Guide.d.cts +1 -1
  146. package/dist/C_Guide.d.ts +1 -1
  147. package/dist/C_Icon.d.cts +1 -1
  148. package/dist/C_Icon.d.ts +1 -1
  149. package/dist/C_Icon.js.map +1 -1
  150. package/dist/C_Icon2.js.map +1 -1
  151. package/dist/{C_ImageCropper-BqZpkZfU.css.map → C_ImageCropper-D3L2-J_J.css.map} +1 -1
  152. package/dist/{C_ImageCropper-CylwGuzS.css.map → C_ImageCropper-DrmUlaLi.css.map} +1 -1
  153. package/dist/C_ImageCropper.css +10 -10
  154. package/dist/C_ImageCropper.js.map +1 -1
  155. package/dist/C_ImageCropper2.js +1 -1
  156. package/dist/C_ImageCropper2.js.map +1 -1
  157. package/dist/C_Language.d.cts +1 -1
  158. package/dist/C_Language.d.ts +1 -1
  159. package/dist/C_Login-Cst_W1XC.css.map +1 -0
  160. package/dist/C_Login-DWZ_6K1x.css.map +1 -0
  161. package/dist/C_Login.cjs +1 -0
  162. package/dist/C_Login.css +515 -0
  163. package/dist/C_Login.d.cts +2 -0
  164. package/dist/C_Login.d.ts +2 -0
  165. package/dist/C_Login.js +1 -0
  166. package/dist/C_Login.js.map +1 -0
  167. package/dist/C_Login2.js +2 -0
  168. package/dist/C_Login2.js.map +1 -0
  169. package/dist/{C_Map-DNnBcY70.css.map → C_Map-BCJmDnJT.css.map} +1 -1
  170. package/dist/{C_Map-LEXIx6zM.css.map → C_Map-WUMXSAfy.css.map} +1 -1
  171. package/dist/C_Map.css +4 -4
  172. package/dist/C_Map.js.map +1 -1
  173. package/dist/C_Map2.js +1 -1
  174. package/dist/C_Map2.js.map +1 -1
  175. package/dist/{C_Markdown-Kujzx1qG.css.map → C_Markdown-7iBnLDtL.css.map} +1 -1
  176. package/dist/{C_Markdown-YCAmBbNF.css.map → C_Markdown-BbTvdFCl.css.map} +1 -1
  177. package/dist/C_Markdown.css +33 -33
  178. package/dist/C_Markdown.d.cts +1 -1
  179. package/dist/C_Markdown.d.ts +1 -1
  180. package/dist/C_Markdown.js.map +1 -1
  181. package/dist/C_Markdown2.js +1 -1
  182. package/dist/C_Markdown2.js.map +1 -1
  183. package/dist/C_Menu.d.cts +1 -1
  184. package/dist/C_Menu.d.ts +1 -1
  185. package/dist/C_Progress.d.cts +1 -1
  186. package/dist/C_Progress.d.ts +1 -1
  187. package/dist/{C_QRCode-CFNTda_1.css.map → C_QRCode-DMxSyogU.css.map} +1 -1
  188. package/dist/{C_QRCode-CmWr9lK-.css.map → C_QRCode-G7fiAkm4.css.map} +1 -1
  189. package/dist/C_QRCode.css +9 -9
  190. package/dist/C_QRCode.js.map +1 -1
  191. package/dist/C_QRCode2.js +1 -1
  192. package/dist/C_QRCode2.js.map +1 -1
  193. package/dist/{C_Signature-PN4GOLRX.css.map → C_Signature-B5fFz6RD.css.map} +1 -1
  194. package/dist/{C_Signature-fWQqGIZ-.css.map → C_Signature-es-ZNPzr.css.map} +1 -1
  195. package/dist/C_Signature.css +14 -14
  196. package/dist/C_Signature.js.map +1 -1
  197. package/dist/C_Signature2.js +1 -1
  198. package/dist/C_Signature2.js.map +1 -1
  199. package/dist/{C_SplitPane-BOwr1C7K.css.map → C_SplitPane-Br2eK8IG.css.map} +1 -1
  200. package/dist/{C_SplitPane-N-a_D-7F.css.map → C_SplitPane-DuyzUhKB.css.map} +1 -1
  201. package/dist/C_SplitPane.css +31 -31
  202. package/dist/C_SplitPane.js.map +1 -1
  203. package/dist/C_SplitPane2.js +1 -1
  204. package/dist/C_SplitPane2.js.map +1 -1
  205. package/dist/C_Steps-B1Wf3E73.css.map +1 -0
  206. package/dist/C_Steps-C8cOf_tu.css.map +1 -0
  207. package/dist/C_Steps.css +41 -41
  208. package/dist/C_Steps.d.cts +1 -1
  209. package/dist/C_Steps.d.ts +1 -1
  210. package/dist/C_Steps.js.map +1 -1
  211. package/dist/C_Steps2.js +1 -1
  212. package/dist/C_Steps2.js.map +1 -1
  213. package/dist/{C_Table-BV1wUw6f.css.map → C_Table-vZlcgH6x.css.map} +1 -1
  214. package/dist/{C_Table-LlJ-JEdm.css.map → C_Table-wzAO43l0.css.map} +1 -1
  215. package/dist/C_Table.css +93 -93
  216. package/dist/C_Table.js.map +1 -1
  217. package/dist/C_Table2.js +1 -1
  218. package/dist/C_Table2.js.map +1 -1
  219. package/dist/{C_TagsView-DX3LecK1.css.map → C_TagsView-BsutyC3U.css.map} +1 -1
  220. package/dist/{C_TagsView-DqOTa8bL.css.map → C_TagsView-Crm7yWg9.css.map} +1 -1
  221. package/dist/C_TagsView.css +36 -36
  222. package/dist/C_TagsView.d.cts +1 -1
  223. package/dist/C_TagsView.d.ts +1 -1
  224. package/dist/C_TagsView.js.map +1 -1
  225. package/dist/C_TagsView2.js +1 -1
  226. package/dist/C_TagsView2.js.map +1 -1
  227. package/dist/C_Theme.d.cts +1 -1
  228. package/dist/C_Theme.d.ts +1 -1
  229. package/dist/C_Time-Bd_e1YDN.css.map +1 -0
  230. package/dist/C_Time-CKb_fwdm.css.map +1 -0
  231. package/dist/C_Time.css +5 -5
  232. package/dist/C_Time.js.map +1 -1
  233. package/dist/C_Time2.js +1 -1
  234. package/dist/C_Time2.js.map +1 -1
  235. package/dist/C_Timeline-CGTFTMX0.css.map +1 -0
  236. package/dist/C_Timeline-DxKyvKer.css.map +1 -0
  237. package/dist/C_Timeline.cjs +1 -0
  238. package/dist/C_Timeline.css +271 -0
  239. package/dist/C_Timeline.d.cts +2 -0
  240. package/dist/C_Timeline.d.ts +2 -0
  241. package/dist/C_Timeline.js +1 -0
  242. package/dist/C_Timeline.js.map +1 -0
  243. package/dist/C_Timeline2.js +2 -0
  244. package/dist/C_Timeline2.js.map +1 -0
  245. package/dist/C_Transfer-CCEqnC-v.css.map +1 -0
  246. package/dist/C_Transfer-CStPm4NP.css.map +1 -0
  247. package/dist/C_Transfer.cjs +1 -0
  248. package/dist/C_Transfer.css +193 -0
  249. package/dist/C_Transfer.d.cts +2 -0
  250. package/dist/C_Transfer.d.ts +2 -0
  251. package/dist/C_Transfer.js +1 -0
  252. package/dist/C_Transfer.js.map +1 -0
  253. package/dist/C_Transfer2.js +2 -0
  254. package/dist/C_Transfer2.js.map +1 -0
  255. package/dist/{C_Tree-D98nX9qT.css.map → C_Tree-B-Le4hjQ.css.map} +1 -1
  256. package/dist/{C_Tree-ulfm7b-P.css.map → C_Tree-DnGc_MPb.css.map} +1 -1
  257. package/dist/C_Tree.css +33 -33
  258. package/dist/C_Tree.js.map +1 -1
  259. package/dist/C_Tree2.js +1 -1
  260. package/dist/C_Tree2.js.map +1 -1
  261. package/dist/{C_VideoPlayer-4J96tKfK.css.map → C_VideoPlayer-Cdgv4Zq0.css.map} +1 -1
  262. package/dist/{C_VideoPlayer-D35seHkm.css.map → C_VideoPlayer-rm0MODUv.css.map} +1 -1
  263. package/dist/C_VideoPlayer.css +13 -13
  264. package/dist/C_VideoPlayer.js.map +1 -1
  265. package/dist/C_VideoPlayer2.js +1 -1
  266. package/dist/C_VideoPlayer2.js.map +1 -1
  267. package/dist/{C_VtableGantt-C2lxFmWg.css.map → C_VtableGantt-BpY-Rng3.css.map} +1 -1
  268. package/dist/{C_VtableGantt-Dwnkw_WL.css.map → C_VtableGantt-DB87-jdS.css.map} +1 -1
  269. package/dist/C_VtableGantt.css +15 -15
  270. package/dist/C_VtableGantt.d.cts +1 -1
  271. package/dist/C_VtableGantt.d.ts +1 -1
  272. package/dist/C_VtableGantt.js.map +1 -1
  273. package/dist/C_VtableGantt2.js +1 -1
  274. package/dist/C_VtableGantt2.js.map +1 -1
  275. package/dist/{C_WorkFlow-2hJfvvTK.css.map → C_WorkFlow-7F6op6qN.css.map} +1 -1
  276. package/dist/{C_WorkFlow-DHoNjl8-.css.map → C_WorkFlow-Cy3HWA6A.css.map} +1 -1
  277. package/dist/C_WorkFlow.css +108 -108
  278. package/dist/C_WorkFlow.js.map +1 -1
  279. package/dist/C_WorkFlow2.js +1 -1
  280. package/dist/C_WorkFlow2.js.map +1 -1
  281. package/dist/constants.d.ts +4 -4
  282. package/dist/constants2.d.ts +4 -4
  283. package/dist/constants3.d.ts +5 -5
  284. package/dist/constants4.d.ts +2 -2
  285. package/dist/data.d.ts +1 -1
  286. package/dist/index.cjs +1 -1
  287. package/dist/index.cjs.map +1 -1
  288. package/dist/index.d.cts +48 -41
  289. package/dist/index.d.ts +48 -41
  290. package/dist/index.js +1 -1
  291. package/dist/index.js.map +1 -1
  292. package/dist/index10.vue.d.ts +41 -23
  293. package/dist/index11.vue.d.ts +80 -63
  294. package/dist/index12.vue.d.ts +48 -20
  295. package/dist/index13.vue.d.ts +23 -63
  296. package/dist/index14.vue.d.ts +21 -58
  297. package/dist/index15.vue.d.ts +65 -48
  298. package/dist/index16.vue.d.ts +16 -21
  299. package/dist/index17.vue.d.ts +106 -77
  300. package/dist/index18.vue.d.ts +74 -11
  301. package/dist/index19.vue.d.ts +58 -653
  302. package/dist/index2.vue.d.ts +75 -30
  303. package/dist/index20.vue.d.ts +55 -0
  304. package/dist/index21.vue.d.ts +33 -0
  305. package/dist/index22.vue.d.ts +88 -0
  306. package/dist/index23.vue.d.ts +18 -0
  307. package/dist/index24.vue.d.ts +112 -0
  308. package/dist/index25.vue.d.ts +81 -0
  309. package/dist/index26.vue.d.ts +662 -0
  310. package/dist/index3.vue.d.ts +77 -19
  311. package/dist/index4.vue.d.ts +29 -36
  312. package/dist/index5.vue.d.ts +19 -20
  313. package/dist/index6.vue.d.ts +36 -26
  314. package/dist/index7.vue.d.ts +23 -40
  315. package/dist/index8.vue.d.ts +117 -45
  316. package/dist/index9.vue.d.ts +19 -25
  317. package/dist/menuAdapter.js.map +1 -1
  318. package/dist/resolver.cjs +1 -1
  319. package/dist/resolver.cjs.map +1 -1
  320. package/dist/resolver.d.cts +1 -1
  321. package/dist/resolver.d.ts +1 -1
  322. package/dist/resolver.js +1 -1
  323. package/dist/resolver.js.map +1 -1
  324. package/dist/style.css +3121 -1228
  325. package/dist/useCollapsePanel.d.ts +2 -2
  326. package/dist/useCropperCore.d.ts +5 -5
  327. package/dist/useDraggableLayout.d.ts +2 -2
  328. package/dist/useDynamicFormState.d.ts +4 -4
  329. package/dist/useEdgeInteraction.d.ts +2 -2
  330. package/dist/useFullscreen.d.ts +2 -2
  331. package/dist/useInfiniteScroll.d.ts +3 -3
  332. package/dist/useModalEdit.d.ts +2 -2
  333. package/dist/useQRCode.d.ts +1 -1
  334. package/dist/useSearchState.d.ts +2 -2
  335. package/dist/useSignatureHistory.d.ts +2 -2
  336. package/dist/useSplitResize.d.ts +6 -6
  337. package/dist/useTimeSelection.d.ts +1 -1
  338. package/dist/useTreeOperations.d.ts +2 -2
  339. package/dist/useWorkflowValidation.d.ts +3 -3
  340. package/package.json +2 -2
  341. package/dist/C_ActionBar-DYG0Yf3A.css.map +0 -1
  342. package/dist/C_ActionBar-MAjRhqcI.css.map +0 -1
  343. package/dist/C_Code-BFi5xxnM.css.map +0 -1
  344. package/dist/C_Code-CZ7yfnri.css.map +0 -1
  345. package/dist/C_FullCalendar-BQA0OjGB.css.map +0 -1
  346. package/dist/C_FullCalendar-ChJUosAi.css.map +0 -1
  347. package/dist/C_Steps-DLW2vbqC.css.map +0 -1
  348. package/dist/C_Steps-DwMRHbG2.css.map +0 -1
  349. package/dist/C_Time-BzyQVvTS.css.map +0 -1
  350. package/dist/C_Time-DmpKLQHc.css.map +0 -1
@@ -0,0 +1,107 @@
1
+ /* unplugin-vue-components disabled *//**
2
+ * C_AvatarGroup — 头像组组件样式
3
+ */
4
+ .c-avatar-group[data-v-1b2d9e6f] {
5
+ display: inline-flex;
6
+ align-items: center;
7
+ /* ======================== 单个头像 ======================== */
8
+ /* ---- 头像图片 ---- */
9
+ /* ---- 首字母 fallback ---- */
10
+ /* ---- 状态指示点 ---- */
11
+ /* ======================== 溢出 +N ======================== */
12
+ }
13
+ .c-avatar-group.is-rtl[data-v-1b2d9e6f] {
14
+ flex-direction: row-reverse;
15
+ }
16
+ .c-avatar-group__item[data-v-1b2d9e6f] {
17
+ position: relative;
18
+ flex-shrink: 0;
19
+ border: 2px solid var(--card-color);
20
+ background: var(--card-color);
21
+ transition: transform 0.2s, z-index 0.2s, box-shadow 0.2s;
22
+ cursor: default;
23
+ z-index: 1;
24
+ }
25
+ .c-avatar-group__item.is-circle[data-v-1b2d9e6f] {
26
+ border-radius: 50%;
27
+ }
28
+ .c-avatar-group__item.is-square[data-v-1b2d9e6f] {
29
+ border-radius: 6px;
30
+ }
31
+ .c-avatar-group__item.is-clickable[data-v-1b2d9e6f] {
32
+ cursor: pointer;
33
+ }
34
+ .c-avatar-group__item.is-clickable[data-v-1b2d9e6f]:hover {
35
+ transform: translateY(-3px) scale(1.08);
36
+ z-index: 10;
37
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
38
+ }
39
+ .c-avatar-group__item[data-v-1b2d9e6f]:hover {
40
+ z-index: 10;
41
+ }
42
+ .c-avatar-group__img[data-v-1b2d9e6f] {
43
+ display: block;
44
+ width: 100%;
45
+ height: 100%;
46
+ object-fit: cover;
47
+ }
48
+ .is-circle .c-avatar-group__img[data-v-1b2d9e6f] {
49
+ border-radius: 50%;
50
+ }
51
+ .is-square .c-avatar-group__img[data-v-1b2d9e6f] {
52
+ border-radius: 4px;
53
+ }
54
+ .c-avatar-group__initials[data-v-1b2d9e6f] {
55
+ display: flex;
56
+ align-items: center;
57
+ justify-content: center;
58
+ width: 100%;
59
+ height: 100%;
60
+ color: #fff;
61
+ font-weight: 600;
62
+ user-select: none;
63
+ }
64
+ .is-circle .c-avatar-group__initials[data-v-1b2d9e6f] {
65
+ border-radius: 50%;
66
+ }
67
+ .is-square .c-avatar-group__initials[data-v-1b2d9e6f] {
68
+ border-radius: 4px;
69
+ }
70
+ .c-avatar-group__status[data-v-1b2d9e6f] {
71
+ position: absolute;
72
+ bottom: 0;
73
+ right: 0;
74
+ border-radius: 50%;
75
+ border: 2px solid var(--card-color);
76
+ z-index: 2;
77
+ }
78
+ .c-avatar-group__overflow[data-v-1b2d9e6f] {
79
+ position: relative;
80
+ flex-shrink: 0;
81
+ display: flex;
82
+ align-items: center;
83
+ justify-content: center;
84
+ border: 2px solid var(--card-color);
85
+ background: color-mix(in srgb, var(--primary-color) 12%, var(--card-color));
86
+ color: var(--primary-color);
87
+ font-weight: 700;
88
+ z-index: 0;
89
+ transition: transform 0.2s, box-shadow 0.2s;
90
+ }
91
+ .c-avatar-group__overflow.is-circle[data-v-1b2d9e6f] {
92
+ border-radius: 50%;
93
+ }
94
+ .c-avatar-group__overflow.is-square[data-v-1b2d9e6f] {
95
+ border-radius: 6px;
96
+ }
97
+ .c-avatar-group__overflow.is-clickable[data-v-1b2d9e6f] {
98
+ cursor: pointer;
99
+ }
100
+ .c-avatar-group__overflow.is-clickable[data-v-1b2d9e6f]:hover {
101
+ transform: translateY(-3px) scale(1.08);
102
+ z-index: 10;
103
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);
104
+ background: color-mix(in srgb, var(--primary-color) 20%, var(--card-color));
105
+ }
106
+
107
+ /*# sourceMappingURL=C_AvatarGroup-CtPhfH9h.css.map*/
@@ -0,0 +1,2 @@
1
+ import { a as STATUS_COLOR_MAP, i as DEFAULT_AVATAR_GROUP_PROPS, n as AvatarGroupProps, o as getInitials, r as AvatarItem, s as nameToColor, t as _default } from "./index3.vue.js";
2
+ export { type AvatarGroupProps, type AvatarItem, _default as C_AvatarGroup, DEFAULT_AVATAR_GROUP_PROPS, STATUS_COLOR_MAP, getInitials, nameToColor };
@@ -0,0 +1,2 @@
1
+ import { a as STATUS_COLOR_MAP, i as DEFAULT_AVATAR_GROUP_PROPS, n as AvatarGroupProps, o as getInitials, r as AvatarItem, s as nameToColor, t as _default } from "./index3.vue.js";
2
+ export { type AvatarGroupProps, type AvatarItem, _default as C_AvatarGroup, DEFAULT_AVATAR_GROUP_PROPS, STATUS_COLOR_MAP, getInitials, nameToColor };
@@ -0,0 +1 @@
1
+ import{a as e,i as t,n,r,t as i}from"./C_AvatarGroup2.js";export{i as C_AvatarGroup,n as DEFAULT_AVATAR_GROUP_PROPS,r as STATUS_COLOR_MAP,t as getInitials,e as nameToColor};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"C_AvatarGroup.js","names":[],"sources":["../src/components/C_AvatarGroup/types.ts","../src/components/C_AvatarGroup/index.vue","../src/components/C_AvatarGroup/index.vue","../src/components/C_AvatarGroup/index.vue"],"sourcesContent":["/**\r\n * @Description: 头像组组件类型定义\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\r\n */\r\n\r\n/** 单个头像数据 */\r\nexport interface AvatarItem {\r\n /** 唯一标识 */\r\n id: string | number\r\n /** 头像图片 URL */\r\n src?: string\r\n /** 姓名(用于首字母 fallback 和 tooltip) */\r\n name: string\r\n /** 悬浮提示(默认取 name) */\r\n tooltip?: string\r\n /** 在线状态 */\r\n status?: 'online' | 'offline' | 'busy' | 'away'\r\n /** 额外数据 */\r\n extra?: Record<string, unknown>\r\n}\r\n\r\n/** 组件 Props */\r\nexport interface AvatarGroupProps {\r\n /** 头像数据列表 */\r\n items: AvatarItem[]\r\n /** 最多显示数量(超出 +N) */\r\n max?: number\r\n /** 头像尺寸 (px) */\r\n size?: number\r\n /** 头像间重叠偏移量 (px),负值表示堆叠 */\r\n overlap?: number\r\n /** 形状 */\r\n shape?: 'circle' | 'square'\r\n /** 是否显示状态指示点 */\r\n showStatus?: boolean\r\n /** 是否显示悬浮提示 */\r\n showTooltip?: boolean\r\n /** 是否可点击 */\r\n clickable?: boolean\r\n /** +N 溢出按钮是否可点击 */\r\n overflowClickable?: boolean\r\n /** 堆叠方向 */\r\n direction?: 'ltr' | 'rtl'\r\n}\r\n\r\n/** 默认 Props */\r\nexport const DEFAULT_AVATAR_GROUP_PROPS: Partial<AvatarGroupProps> = {\r\n max: 5,\r\n size: 40,\r\n overlap: -10,\r\n shape: 'circle',\r\n showStatus: true,\r\n showTooltip: true,\r\n clickable: false,\r\n overflowClickable: true,\r\n direction: 'ltr',\r\n}\r\n\r\n/** 状态颜色映射 */\r\nexport const STATUS_COLOR_MAP: Record<string, string> = {\r\n online: '#18a058',\r\n offline: '#909399',\r\n busy: '#e53e3e',\r\n away: '#f0a020',\r\n}\r\n\r\n/** 从名字中提取首字母 */\r\nexport function getInitials(name: string): string {\r\n if (!name) return '?'\r\n const parts = name.trim().split(/\\s+/)\r\n if (parts.length >= 2) return (parts[0][0] + parts[1][0]).toUpperCase()\r\n // 中文直接取最后一个字\r\n if (/[\\u4E00-\\u9FFF]/.test(name)) return name.slice(-1)\r\n return name.slice(0, 2).toUpperCase()\r\n}\r\n\r\n/** 根据名字生成稳定的背景色 */\r\nexport function nameToColor(name: string): string {\r\n const palette = [\r\n '#6366f1',\r\n '#8b5cf6',\r\n '#a855f7',\r\n '#d946ef',\r\n '#ec4899',\r\n '#f43f5e',\r\n '#ef4444',\r\n '#f97316',\r\n '#eab308',\r\n '#84cc16',\r\n '#22c55e',\r\n '#14b8a6',\r\n '#06b6d4',\r\n '#0ea5e9',\r\n '#3b82f6',\r\n '#6d28d9',\r\n ]\r\n let hash = 0\r\n for (let i = 0; i < name.length; i++) {\r\n hash = name.charCodeAt(i) + ((hash * 31) | 0)\r\n }\r\n return palette[Math.abs(hash) % palette.length]\r\n}\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Description: 头像组组件\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\r\n-->\r\n<template>\r\n <div\r\n class=\"c-avatar-group\"\r\n :class=\"{ 'is-rtl': mergedProps.direction === 'rtl' }\"\r\n >\r\n <NTooltip\r\n v-for=\"(item, idx) in visibleItems\"\r\n :key=\"item.id\"\r\n :disabled=\"!mergedProps.showTooltip\"\r\n placement=\"top\"\r\n >\r\n <template #trigger>\r\n <div\r\n class=\"c-avatar-group__item\"\r\n :class=\"[\r\n `is-${mergedProps.shape}`,\r\n { 'is-clickable': mergedProps.clickable },\r\n ]\"\r\n :style=\"itemStyle(idx)\"\r\n @click=\"mergedProps.clickable && emit('itemClick', item)\"\r\n >\r\n <img\r\n v-if=\"item.src\"\r\n :src=\"item.src\"\r\n :alt=\"item.name\"\r\n class=\"c-avatar-group__img\"\r\n />\r\n <div\r\n v-else\r\n class=\"c-avatar-group__initials\"\r\n :style=\"{\r\n background: nameToColor(item.name),\r\n fontSize: initialsFontSize,\r\n }\"\r\n >\r\n {{ getInitials(item.name) }}\r\n </div>\r\n\r\n <span\r\n v-if=\"mergedProps.showStatus && item.status\"\r\n class=\"c-avatar-group__status\"\r\n :style=\"statusStyle(item.status)\"\r\n />\r\n </div>\r\n </template>\r\n {{ item.tooltip ?? item.name }}\r\n </NTooltip>\r\n\r\n <!-- 溢出 +N -->\r\n <NTooltip\r\n v-if=\"overflowCount > 0\"\r\n placement=\"top\"\r\n >\r\n <template #trigger>\r\n <div\r\n class=\"c-avatar-group__overflow\"\r\n :class=\"[\r\n `is-${mergedProps.shape}`,\r\n { 'is-clickable': mergedProps.overflowClickable },\r\n ]\"\r\n :style=\"overflowStyle\"\r\n @click=\"\r\n mergedProps.overflowClickable && emit('overflowClick', hiddenItems)\r\n \"\r\n >\r\n +{{ overflowCount }}\r\n </div>\r\n </template>\r\n <div style=\"max-width: 200px\">\r\n <div\r\n v-for=\"h in hiddenItems\"\r\n :key=\"h.id\"\r\n style=\"line-height: 1.6\"\r\n >\r\n {{ h.name }}\r\n </div>\r\n </div>\r\n </NTooltip>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { computed } from 'vue'\r\n import {\r\n DEFAULT_AVATAR_GROUP_PROPS,\r\n getInitials,\r\n nameToColor,\r\n STATUS_COLOR_MAP,\r\n type AvatarGroupProps,\r\n type AvatarItem,\r\n } from './types'\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n items: AvatarGroupProps['items']\r\n max?: number\r\n size?: number\r\n overlap?: number\r\n shape?: AvatarGroupProps['shape']\r\n showStatus?: boolean\r\n showTooltip?: boolean\r\n clickable?: boolean\r\n overflowClickable?: boolean\r\n direction?: AvatarGroupProps['direction']\r\n }>(),\r\n {\r\n max: DEFAULT_AVATAR_GROUP_PROPS.max,\r\n size: DEFAULT_AVATAR_GROUP_PROPS.size,\r\n overlap: DEFAULT_AVATAR_GROUP_PROPS.overlap,\r\n shape: DEFAULT_AVATAR_GROUP_PROPS.shape,\r\n showStatus: DEFAULT_AVATAR_GROUP_PROPS.showStatus,\r\n showTooltip: DEFAULT_AVATAR_GROUP_PROPS.showTooltip,\r\n clickable: DEFAULT_AVATAR_GROUP_PROPS.clickable,\r\n overflowClickable: DEFAULT_AVATAR_GROUP_PROPS.overflowClickable,\r\n direction: DEFAULT_AVATAR_GROUP_PROPS.direction,\r\n }\r\n )\r\n\r\n const emit = defineEmits<{\r\n itemClick: [item: AvatarItem]\r\n overflowClick: [hiddenItems: AvatarItem[]]\r\n }>()\r\n\r\n const mergedProps = computed(() => ({\r\n ...DEFAULT_AVATAR_GROUP_PROPS,\r\n ...props,\r\n }))\r\n\r\n const visibleItems = computed(() => {\r\n const max = mergedProps.value.max!\r\n return props.items.length > max ? props.items.slice(0, max) : props.items\r\n })\r\n\r\n const hiddenItems = computed(() => {\r\n const max = mergedProps.value.max!\r\n return props.items.length > max ? props.items.slice(max) : []\r\n })\r\n\r\n const overflowCount = computed(() => hiddenItems.value.length)\r\n\r\n const initialsFontSize = computed(\r\n () => `${Math.round(mergedProps.value.size! * 0.38)}px`\r\n )\r\n\r\n /** 计算头像项定位样式 */\r\n function itemStyle(idx: number) {\r\n const s = mergedProps.value.size!\r\n const overlap = mergedProps.value.overlap!\r\n return {\r\n width: `${s}px`,\r\n height: `${s}px`,\r\n marginLeft: idx === 0 ? '0' : `${overlap}px`,\r\n }\r\n }\r\n\r\n const overflowStyle = computed(() => {\r\n const s = mergedProps.value.size!\r\n const overlap = mergedProps.value.overlap!\r\n return {\r\n width: `${s}px`,\r\n height: `${s}px`,\r\n marginLeft: `${overlap}px`,\r\n fontSize: `${Math.round(s * 0.32)}px`,\r\n }\r\n })\r\n\r\n /** 计算状态指示点样式 */\r\n function statusStyle(status: string) {\r\n const dotSize = Math.max(8, Math.round(mergedProps.value.size! * 0.24))\r\n return {\r\n width: `${dotSize}px`,\r\n height: `${dotSize}px`,\r\n backgroundColor: STATUS_COLOR_MAP[status] ?? STATUS_COLOR_MAP.offline,\r\n }\r\n }\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n @use './index.scss';\r\n</style>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Description: 头像组组件\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\r\n-->\r\n<template>\r\n <div\r\n class=\"c-avatar-group\"\r\n :class=\"{ 'is-rtl': mergedProps.direction === 'rtl' }\"\r\n >\r\n <NTooltip\r\n v-for=\"(item, idx) in visibleItems\"\r\n :key=\"item.id\"\r\n :disabled=\"!mergedProps.showTooltip\"\r\n placement=\"top\"\r\n >\r\n <template #trigger>\r\n <div\r\n class=\"c-avatar-group__item\"\r\n :class=\"[\r\n `is-${mergedProps.shape}`,\r\n { 'is-clickable': mergedProps.clickable },\r\n ]\"\r\n :style=\"itemStyle(idx)\"\r\n @click=\"mergedProps.clickable && emit('itemClick', item)\"\r\n >\r\n <img\r\n v-if=\"item.src\"\r\n :src=\"item.src\"\r\n :alt=\"item.name\"\r\n class=\"c-avatar-group__img\"\r\n />\r\n <div\r\n v-else\r\n class=\"c-avatar-group__initials\"\r\n :style=\"{\r\n background: nameToColor(item.name),\r\n fontSize: initialsFontSize,\r\n }\"\r\n >\r\n {{ getInitials(item.name) }}\r\n </div>\r\n\r\n <span\r\n v-if=\"mergedProps.showStatus && item.status\"\r\n class=\"c-avatar-group__status\"\r\n :style=\"statusStyle(item.status)\"\r\n />\r\n </div>\r\n </template>\r\n {{ item.tooltip ?? item.name }}\r\n </NTooltip>\r\n\r\n <!-- 溢出 +N -->\r\n <NTooltip\r\n v-if=\"overflowCount > 0\"\r\n placement=\"top\"\r\n >\r\n <template #trigger>\r\n <div\r\n class=\"c-avatar-group__overflow\"\r\n :class=\"[\r\n `is-${mergedProps.shape}`,\r\n { 'is-clickable': mergedProps.overflowClickable },\r\n ]\"\r\n :style=\"overflowStyle\"\r\n @click=\"\r\n mergedProps.overflowClickable && emit('overflowClick', hiddenItems)\r\n \"\r\n >\r\n +{{ overflowCount }}\r\n </div>\r\n </template>\r\n <div style=\"max-width: 200px\">\r\n <div\r\n v-for=\"h in hiddenItems\"\r\n :key=\"h.id\"\r\n style=\"line-height: 1.6\"\r\n >\r\n {{ h.name }}\r\n </div>\r\n </div>\r\n </NTooltip>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { computed } from 'vue'\r\n import {\r\n DEFAULT_AVATAR_GROUP_PROPS,\r\n getInitials,\r\n nameToColor,\r\n STATUS_COLOR_MAP,\r\n type AvatarGroupProps,\r\n type AvatarItem,\r\n } from './types'\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n items: AvatarGroupProps['items']\r\n max?: number\r\n size?: number\r\n overlap?: number\r\n shape?: AvatarGroupProps['shape']\r\n showStatus?: boolean\r\n showTooltip?: boolean\r\n clickable?: boolean\r\n overflowClickable?: boolean\r\n direction?: AvatarGroupProps['direction']\r\n }>(),\r\n {\r\n max: DEFAULT_AVATAR_GROUP_PROPS.max,\r\n size: DEFAULT_AVATAR_GROUP_PROPS.size,\r\n overlap: DEFAULT_AVATAR_GROUP_PROPS.overlap,\r\n shape: DEFAULT_AVATAR_GROUP_PROPS.shape,\r\n showStatus: DEFAULT_AVATAR_GROUP_PROPS.showStatus,\r\n showTooltip: DEFAULT_AVATAR_GROUP_PROPS.showTooltip,\r\n clickable: DEFAULT_AVATAR_GROUP_PROPS.clickable,\r\n overflowClickable: DEFAULT_AVATAR_GROUP_PROPS.overflowClickable,\r\n direction: DEFAULT_AVATAR_GROUP_PROPS.direction,\r\n }\r\n )\r\n\r\n const emit = defineEmits<{\r\n itemClick: [item: AvatarItem]\r\n overflowClick: [hiddenItems: AvatarItem[]]\r\n }>()\r\n\r\n const mergedProps = computed(() => ({\r\n ...DEFAULT_AVATAR_GROUP_PROPS,\r\n ...props,\r\n }))\r\n\r\n const visibleItems = computed(() => {\r\n const max = mergedProps.value.max!\r\n return props.items.length > max ? props.items.slice(0, max) : props.items\r\n })\r\n\r\n const hiddenItems = computed(() => {\r\n const max = mergedProps.value.max!\r\n return props.items.length > max ? props.items.slice(max) : []\r\n })\r\n\r\n const overflowCount = computed(() => hiddenItems.value.length)\r\n\r\n const initialsFontSize = computed(\r\n () => `${Math.round(mergedProps.value.size! * 0.38)}px`\r\n )\r\n\r\n /** 计算头像项定位样式 */\r\n function itemStyle(idx: number) {\r\n const s = mergedProps.value.size!\r\n const overlap = mergedProps.value.overlap!\r\n return {\r\n width: `${s}px`,\r\n height: `${s}px`,\r\n marginLeft: idx === 0 ? '0' : `${overlap}px`,\r\n }\r\n }\r\n\r\n const overflowStyle = computed(() => {\r\n const s = mergedProps.value.size!\r\n const overlap = mergedProps.value.overlap!\r\n return {\r\n width: `${s}px`,\r\n height: `${s}px`,\r\n marginLeft: `${overlap}px`,\r\n fontSize: `${Math.round(s * 0.32)}px`,\r\n }\r\n })\r\n\r\n /** 计算状态指示点样式 */\r\n function statusStyle(status: string) {\r\n const dotSize = Math.max(8, Math.round(mergedProps.value.size! * 0.24))\r\n return {\r\n width: `${dotSize}px`,\r\n height: `${dotSize}px`,\r\n backgroundColor: STATUS_COLOR_MAP[status] ?? STATUS_COLOR_MAP.offline,\r\n }\r\n }\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n @use './index.scss';\r\n</style>\r\n","<!--\r\n * @Description: 头像组组件\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\r\n-->\r\n<template>\r\n <div\r\n class=\"c-avatar-group\"\r\n :class=\"{ 'is-rtl': mergedProps.direction === 'rtl' }\"\r\n >\r\n <NTooltip\r\n v-for=\"(item, idx) in visibleItems\"\r\n :key=\"item.id\"\r\n :disabled=\"!mergedProps.showTooltip\"\r\n placement=\"top\"\r\n >\r\n <template #trigger>\r\n <div\r\n class=\"c-avatar-group__item\"\r\n :class=\"[\r\n `is-${mergedProps.shape}`,\r\n { 'is-clickable': mergedProps.clickable },\r\n ]\"\r\n :style=\"itemStyle(idx)\"\r\n @click=\"mergedProps.clickable && emit('itemClick', item)\"\r\n >\r\n <img\r\n v-if=\"item.src\"\r\n :src=\"item.src\"\r\n :alt=\"item.name\"\r\n class=\"c-avatar-group__img\"\r\n />\r\n <div\r\n v-else\r\n class=\"c-avatar-group__initials\"\r\n :style=\"{\r\n background: nameToColor(item.name),\r\n fontSize: initialsFontSize,\r\n }\"\r\n >\r\n {{ getInitials(item.name) }}\r\n </div>\r\n\r\n <span\r\n v-if=\"mergedProps.showStatus && item.status\"\r\n class=\"c-avatar-group__status\"\r\n :style=\"statusStyle(item.status)\"\r\n />\r\n </div>\r\n </template>\r\n {{ item.tooltip ?? item.name }}\r\n </NTooltip>\r\n\r\n <!-- 溢出 +N -->\r\n <NTooltip\r\n v-if=\"overflowCount > 0\"\r\n placement=\"top\"\r\n >\r\n <template #trigger>\r\n <div\r\n class=\"c-avatar-group__overflow\"\r\n :class=\"[\r\n `is-${mergedProps.shape}`,\r\n { 'is-clickable': mergedProps.overflowClickable },\r\n ]\"\r\n :style=\"overflowStyle\"\r\n @click=\"\r\n mergedProps.overflowClickable && emit('overflowClick', hiddenItems)\r\n \"\r\n >\r\n +{{ overflowCount }}\r\n </div>\r\n </template>\r\n <div style=\"max-width: 200px\">\r\n <div\r\n v-for=\"h in hiddenItems\"\r\n :key=\"h.id\"\r\n style=\"line-height: 1.6\"\r\n >\r\n {{ h.name }}\r\n </div>\r\n </div>\r\n </NTooltip>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { computed } from 'vue'\r\n import {\r\n DEFAULT_AVATAR_GROUP_PROPS,\r\n getInitials,\r\n nameToColor,\r\n STATUS_COLOR_MAP,\r\n type AvatarGroupProps,\r\n type AvatarItem,\r\n } from './types'\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n items: AvatarGroupProps['items']\r\n max?: number\r\n size?: number\r\n overlap?: number\r\n shape?: AvatarGroupProps['shape']\r\n showStatus?: boolean\r\n showTooltip?: boolean\r\n clickable?: boolean\r\n overflowClickable?: boolean\r\n direction?: AvatarGroupProps['direction']\r\n }>(),\r\n {\r\n max: DEFAULT_AVATAR_GROUP_PROPS.max,\r\n size: DEFAULT_AVATAR_GROUP_PROPS.size,\r\n overlap: DEFAULT_AVATAR_GROUP_PROPS.overlap,\r\n shape: DEFAULT_AVATAR_GROUP_PROPS.shape,\r\n showStatus: DEFAULT_AVATAR_GROUP_PROPS.showStatus,\r\n showTooltip: DEFAULT_AVATAR_GROUP_PROPS.showTooltip,\r\n clickable: DEFAULT_AVATAR_GROUP_PROPS.clickable,\r\n overflowClickable: DEFAULT_AVATAR_GROUP_PROPS.overflowClickable,\r\n direction: DEFAULT_AVATAR_GROUP_PROPS.direction,\r\n }\r\n )\r\n\r\n const emit = defineEmits<{\r\n itemClick: [item: AvatarItem]\r\n overflowClick: [hiddenItems: AvatarItem[]]\r\n }>()\r\n\r\n const mergedProps = computed(() => ({\r\n ...DEFAULT_AVATAR_GROUP_PROPS,\r\n ...props,\r\n }))\r\n\r\n const visibleItems = computed(() => {\r\n const max = mergedProps.value.max!\r\n return props.items.length > max ? props.items.slice(0, max) : props.items\r\n })\r\n\r\n const hiddenItems = computed(() => {\r\n const max = mergedProps.value.max!\r\n return props.items.length > max ? props.items.slice(max) : []\r\n })\r\n\r\n const overflowCount = computed(() => hiddenItems.value.length)\r\n\r\n const initialsFontSize = computed(\r\n () => `${Math.round(mergedProps.value.size! * 0.38)}px`\r\n )\r\n\r\n /** 计算头像项定位样式 */\r\n function itemStyle(idx: number) {\r\n const s = mergedProps.value.size!\r\n const overlap = mergedProps.value.overlap!\r\n return {\r\n width: `${s}px`,\r\n height: `${s}px`,\r\n marginLeft: idx === 0 ? '0' : `${overlap}px`,\r\n }\r\n }\r\n\r\n const overflowStyle = computed(() => {\r\n const s = mergedProps.value.size!\r\n const overlap = mergedProps.value.overlap!\r\n return {\r\n width: `${s}px`,\r\n height: `${s}px`,\r\n marginLeft: `${overlap}px`,\r\n fontSize: `${Math.round(s * 0.32)}px`,\r\n }\r\n })\r\n\r\n /** 计算状态指示点样式 */\r\n function statusStyle(status: string) {\r\n const dotSize = Math.max(8, Math.round(mergedProps.value.size! * 0.24))\r\n return {\r\n width: `${dotSize}px`,\r\n height: `${dotSize}px`,\r\n backgroundColor: STATUS_COLOR_MAP[status] ?? STATUS_COLOR_MAP.offline,\r\n }\r\n }\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n @use './index.scss';\r\n</style>\r\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{t as e}from"./export-helper.js";import{NTooltip as t}from"naive-ui";import{Fragment as n,computed as r,createBlock as i,createCommentVNode as a,createElementBlock as o,createElementVNode as s,createTextVNode as c,defineComponent as l,normalizeClass as u,normalizeStyle as d,openBlock as f,renderList as p,toDisplayString as m,unref as h,withCtx as g}from"vue";const _={max:5,size:40,overlap:-10,shape:`circle`,showStatus:!0,showTooltip:!0,clickable:!1,overflowClickable:!0,direction:`ltr`},v={online:`#18a058`,offline:`#909399`,busy:`#e53e3e`,away:`#f0a020`};function y(e){if(!e)return`?`;let t=e.trim().split(/\s+/);return t.length>=2?(t[0][0]+t[1][0]).toUpperCase():/[\u4E00-\u9FFF]/.test(e)?e.slice(-1):e.slice(0,2).toUpperCase()}function b(e){let t=[`#6366f1`,`#8b5cf6`,`#a855f7`,`#d946ef`,`#ec4899`,`#f43f5e`,`#ef4444`,`#f97316`,`#eab308`,`#84cc16`,`#22c55e`,`#14b8a6`,`#06b6d4`,`#0ea5e9`,`#3b82f6`,`#6d28d9`],n=0;for(let t=0;t<e.length;t++)n=e.charCodeAt(t)+(n*31|0);return t[Math.abs(n)%t.length]}const x=[`onClick`],S=[`src`,`alt`],C={style:{"max-width":`200px`}};var w=e(l({__name:`index`,props:{items:{},max:{default:_.max},size:{default:_.size},overlap:{default:_.overlap},shape:{default:_.shape},showStatus:{type:Boolean,default:_.showStatus},showTooltip:{type:Boolean,default:_.showTooltip},clickable:{type:Boolean,default:_.clickable},overflowClickable:{type:Boolean,default:_.overflowClickable},direction:{default:_.direction}},emits:[`itemClick`,`overflowClick`],setup(e,{emit:l}){let w=e,T=l,E=r(()=>({..._,...w})),D=r(()=>{let e=E.value.max;return w.items.length>e?w.items.slice(0,e):w.items}),O=r(()=>{let e=E.value.max;return w.items.length>e?w.items.slice(e):[]}),k=r(()=>O.value.length),A=r(()=>`${Math.round(E.value.size*.38)}px`);function j(e){let t=E.value.size,n=E.value.overlap;return{width:`${t}px`,height:`${t}px`,marginLeft:e===0?`0`:`${n}px`}}let M=r(()=>{let e=E.value.size,t=E.value.overlap;return{width:`${e}px`,height:`${e}px`,marginLeft:`${t}px`,fontSize:`${Math.round(e*.32)}px`}});function N(e){let t=Math.max(8,Math.round(E.value.size*.24));return{width:`${t}px`,height:`${t}px`,backgroundColor:v[e]??v.offline}}return(e,r)=>{let l=t;return f(),o(`div`,{class:u([`c-avatar-group`,{"is-rtl":E.value.direction===`rtl`}])},[(f(!0),o(n,null,p(D.value,(e,t)=>(f(),i(l,{key:e.id,disabled:!E.value.showTooltip,placement:`top`},{trigger:g(()=>[s(`div`,{class:u([`c-avatar-group__item`,[`is-${E.value.shape}`,{"is-clickable":E.value.clickable}]]),style:d(j(t)),onClick:t=>E.value.clickable&&T(`itemClick`,e)},[e.src?(f(),o(`img`,{key:0,src:e.src,alt:e.name,class:`c-avatar-group__img`},null,8,S)):(f(),o(`div`,{key:1,class:`c-avatar-group__initials`,style:d({background:h(b)(e.name),fontSize:A.value})},m(h(y)(e.name)),5)),E.value.showStatus&&e.status?(f(),o(`span`,{key:2,class:`c-avatar-group__status`,style:d(N(e.status))},null,4)):a(`v-if`,!0)],14,x)]),default:g(()=>[c(` `+m(e.tooltip??e.name),1)]),_:2},1032,[`disabled`]))),128)),a(` 溢出 +N `),k.value>0?(f(),i(l,{key:0,placement:`top`},{trigger:g(()=>[s(`div`,{class:u([`c-avatar-group__overflow`,[`is-${E.value.shape}`,{"is-clickable":E.value.overflowClickable}]]),style:d(M.value),onClick:r[0]||=e=>E.value.overflowClickable&&T(`overflowClick`,O.value)},` +`+m(k.value),7)]),default:g(()=>[s(`div`,C,[(f(!0),o(n,null,p(O.value,e=>(f(),o(`div`,{key:e.id,style:{"line-height":`1.6`}},m(e.name),1))),128))])]),_:1})):a(`v-if`,!0)],2)}}}),[[`__scopeId`,`data-v-1b2d9e6f`]]);export{b as a,y as i,_ as n,v as r,w as t};
2
+ //# sourceMappingURL=C_AvatarGroup2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"C_AvatarGroup2.js","names":[],"sources":["../src/components/C_AvatarGroup/types.ts","../src/components/C_AvatarGroup/index.vue","../src/components/C_AvatarGroup/index.vue","../src/components/C_AvatarGroup/index.vue"],"sourcesContent":["/**\r\n * @Description: 头像组组件类型定义\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\r\n */\r\n\r\n/** 单个头像数据 */\r\nexport interface AvatarItem {\r\n /** 唯一标识 */\r\n id: string | number\r\n /** 头像图片 URL */\r\n src?: string\r\n /** 姓名(用于首字母 fallback 和 tooltip) */\r\n name: string\r\n /** 悬浮提示(默认取 name) */\r\n tooltip?: string\r\n /** 在线状态 */\r\n status?: 'online' | 'offline' | 'busy' | 'away'\r\n /** 额外数据 */\r\n extra?: Record<string, unknown>\r\n}\r\n\r\n/** 组件 Props */\r\nexport interface AvatarGroupProps {\r\n /** 头像数据列表 */\r\n items: AvatarItem[]\r\n /** 最多显示数量(超出 +N) */\r\n max?: number\r\n /** 头像尺寸 (px) */\r\n size?: number\r\n /** 头像间重叠偏移量 (px),负值表示堆叠 */\r\n overlap?: number\r\n /** 形状 */\r\n shape?: 'circle' | 'square'\r\n /** 是否显示状态指示点 */\r\n showStatus?: boolean\r\n /** 是否显示悬浮提示 */\r\n showTooltip?: boolean\r\n /** 是否可点击 */\r\n clickable?: boolean\r\n /** +N 溢出按钮是否可点击 */\r\n overflowClickable?: boolean\r\n /** 堆叠方向 */\r\n direction?: 'ltr' | 'rtl'\r\n}\r\n\r\n/** 默认 Props */\r\nexport const DEFAULT_AVATAR_GROUP_PROPS: Partial<AvatarGroupProps> = {\r\n max: 5,\r\n size: 40,\r\n overlap: -10,\r\n shape: 'circle',\r\n showStatus: true,\r\n showTooltip: true,\r\n clickable: false,\r\n overflowClickable: true,\r\n direction: 'ltr',\r\n}\r\n\r\n/** 状态颜色映射 */\r\nexport const STATUS_COLOR_MAP: Record<string, string> = {\r\n online: '#18a058',\r\n offline: '#909399',\r\n busy: '#e53e3e',\r\n away: '#f0a020',\r\n}\r\n\r\n/** 从名字中提取首字母 */\r\nexport function getInitials(name: string): string {\r\n if (!name) return '?'\r\n const parts = name.trim().split(/\\s+/)\r\n if (parts.length >= 2) return (parts[0][0] + parts[1][0]).toUpperCase()\r\n // 中文直接取最后一个字\r\n if (/[\\u4E00-\\u9FFF]/.test(name)) return name.slice(-1)\r\n return name.slice(0, 2).toUpperCase()\r\n}\r\n\r\n/** 根据名字生成稳定的背景色 */\r\nexport function nameToColor(name: string): string {\r\n const palette = [\r\n '#6366f1',\r\n '#8b5cf6',\r\n '#a855f7',\r\n '#d946ef',\r\n '#ec4899',\r\n '#f43f5e',\r\n '#ef4444',\r\n '#f97316',\r\n '#eab308',\r\n '#84cc16',\r\n '#22c55e',\r\n '#14b8a6',\r\n '#06b6d4',\r\n '#0ea5e9',\r\n '#3b82f6',\r\n '#6d28d9',\r\n ]\r\n let hash = 0\r\n for (let i = 0; i < name.length; i++) {\r\n hash = name.charCodeAt(i) + ((hash * 31) | 0)\r\n }\r\n return palette[Math.abs(hash) % palette.length]\r\n}\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Description: 头像组组件\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\r\n-->\r\n<template>\r\n <div\r\n class=\"c-avatar-group\"\r\n :class=\"{ 'is-rtl': mergedProps.direction === 'rtl' }\"\r\n >\r\n <NTooltip\r\n v-for=\"(item, idx) in visibleItems\"\r\n :key=\"item.id\"\r\n :disabled=\"!mergedProps.showTooltip\"\r\n placement=\"top\"\r\n >\r\n <template #trigger>\r\n <div\r\n class=\"c-avatar-group__item\"\r\n :class=\"[\r\n `is-${mergedProps.shape}`,\r\n { 'is-clickable': mergedProps.clickable },\r\n ]\"\r\n :style=\"itemStyle(idx)\"\r\n @click=\"mergedProps.clickable && emit('itemClick', item)\"\r\n >\r\n <img\r\n v-if=\"item.src\"\r\n :src=\"item.src\"\r\n :alt=\"item.name\"\r\n class=\"c-avatar-group__img\"\r\n />\r\n <div\r\n v-else\r\n class=\"c-avatar-group__initials\"\r\n :style=\"{\r\n background: nameToColor(item.name),\r\n fontSize: initialsFontSize,\r\n }\"\r\n >\r\n {{ getInitials(item.name) }}\r\n </div>\r\n\r\n <span\r\n v-if=\"mergedProps.showStatus && item.status\"\r\n class=\"c-avatar-group__status\"\r\n :style=\"statusStyle(item.status)\"\r\n />\r\n </div>\r\n </template>\r\n {{ item.tooltip ?? item.name }}\r\n </NTooltip>\r\n\r\n <!-- 溢出 +N -->\r\n <NTooltip\r\n v-if=\"overflowCount > 0\"\r\n placement=\"top\"\r\n >\r\n <template #trigger>\r\n <div\r\n class=\"c-avatar-group__overflow\"\r\n :class=\"[\r\n `is-${mergedProps.shape}`,\r\n { 'is-clickable': mergedProps.overflowClickable },\r\n ]\"\r\n :style=\"overflowStyle\"\r\n @click=\"\r\n mergedProps.overflowClickable && emit('overflowClick', hiddenItems)\r\n \"\r\n >\r\n +{{ overflowCount }}\r\n </div>\r\n </template>\r\n <div style=\"max-width: 200px\">\r\n <div\r\n v-for=\"h in hiddenItems\"\r\n :key=\"h.id\"\r\n style=\"line-height: 1.6\"\r\n >\r\n {{ h.name }}\r\n </div>\r\n </div>\r\n </NTooltip>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { computed } from 'vue'\r\n import {\r\n DEFAULT_AVATAR_GROUP_PROPS,\r\n getInitials,\r\n nameToColor,\r\n STATUS_COLOR_MAP,\r\n type AvatarGroupProps,\r\n type AvatarItem,\r\n } from './types'\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n items: AvatarGroupProps['items']\r\n max?: number\r\n size?: number\r\n overlap?: number\r\n shape?: AvatarGroupProps['shape']\r\n showStatus?: boolean\r\n showTooltip?: boolean\r\n clickable?: boolean\r\n overflowClickable?: boolean\r\n direction?: AvatarGroupProps['direction']\r\n }>(),\r\n {\r\n max: DEFAULT_AVATAR_GROUP_PROPS.max,\r\n size: DEFAULT_AVATAR_GROUP_PROPS.size,\r\n overlap: DEFAULT_AVATAR_GROUP_PROPS.overlap,\r\n shape: DEFAULT_AVATAR_GROUP_PROPS.shape,\r\n showStatus: DEFAULT_AVATAR_GROUP_PROPS.showStatus,\r\n showTooltip: DEFAULT_AVATAR_GROUP_PROPS.showTooltip,\r\n clickable: DEFAULT_AVATAR_GROUP_PROPS.clickable,\r\n overflowClickable: DEFAULT_AVATAR_GROUP_PROPS.overflowClickable,\r\n direction: DEFAULT_AVATAR_GROUP_PROPS.direction,\r\n }\r\n )\r\n\r\n const emit = defineEmits<{\r\n itemClick: [item: AvatarItem]\r\n overflowClick: [hiddenItems: AvatarItem[]]\r\n }>()\r\n\r\n const mergedProps = computed(() => ({\r\n ...DEFAULT_AVATAR_GROUP_PROPS,\r\n ...props,\r\n }))\r\n\r\n const visibleItems = computed(() => {\r\n const max = mergedProps.value.max!\r\n return props.items.length > max ? props.items.slice(0, max) : props.items\r\n })\r\n\r\n const hiddenItems = computed(() => {\r\n const max = mergedProps.value.max!\r\n return props.items.length > max ? props.items.slice(max) : []\r\n })\r\n\r\n const overflowCount = computed(() => hiddenItems.value.length)\r\n\r\n const initialsFontSize = computed(\r\n () => `${Math.round(mergedProps.value.size! * 0.38)}px`\r\n )\r\n\r\n /** 计算头像项定位样式 */\r\n function itemStyle(idx: number) {\r\n const s = mergedProps.value.size!\r\n const overlap = mergedProps.value.overlap!\r\n return {\r\n width: `${s}px`,\r\n height: `${s}px`,\r\n marginLeft: idx === 0 ? '0' : `${overlap}px`,\r\n }\r\n }\r\n\r\n const overflowStyle = computed(() => {\r\n const s = mergedProps.value.size!\r\n const overlap = mergedProps.value.overlap!\r\n return {\r\n width: `${s}px`,\r\n height: `${s}px`,\r\n marginLeft: `${overlap}px`,\r\n fontSize: `${Math.round(s * 0.32)}px`,\r\n }\r\n })\r\n\r\n /** 计算状态指示点样式 */\r\n function statusStyle(status: string) {\r\n const dotSize = Math.max(8, Math.round(mergedProps.value.size! * 0.24))\r\n return {\r\n width: `${dotSize}px`,\r\n height: `${dotSize}px`,\r\n backgroundColor: STATUS_COLOR_MAP[status] ?? STATUS_COLOR_MAP.offline,\r\n }\r\n }\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n @use './index.scss';\r\n</style>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Description: 头像组组件\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\r\n-->\r\n<template>\r\n <div\r\n class=\"c-avatar-group\"\r\n :class=\"{ 'is-rtl': mergedProps.direction === 'rtl' }\"\r\n >\r\n <NTooltip\r\n v-for=\"(item, idx) in visibleItems\"\r\n :key=\"item.id\"\r\n :disabled=\"!mergedProps.showTooltip\"\r\n placement=\"top\"\r\n >\r\n <template #trigger>\r\n <div\r\n class=\"c-avatar-group__item\"\r\n :class=\"[\r\n `is-${mergedProps.shape}`,\r\n { 'is-clickable': mergedProps.clickable },\r\n ]\"\r\n :style=\"itemStyle(idx)\"\r\n @click=\"mergedProps.clickable && emit('itemClick', item)\"\r\n >\r\n <img\r\n v-if=\"item.src\"\r\n :src=\"item.src\"\r\n :alt=\"item.name\"\r\n class=\"c-avatar-group__img\"\r\n />\r\n <div\r\n v-else\r\n class=\"c-avatar-group__initials\"\r\n :style=\"{\r\n background: nameToColor(item.name),\r\n fontSize: initialsFontSize,\r\n }\"\r\n >\r\n {{ getInitials(item.name) }}\r\n </div>\r\n\r\n <span\r\n v-if=\"mergedProps.showStatus && item.status\"\r\n class=\"c-avatar-group__status\"\r\n :style=\"statusStyle(item.status)\"\r\n />\r\n </div>\r\n </template>\r\n {{ item.tooltip ?? item.name }}\r\n </NTooltip>\r\n\r\n <!-- 溢出 +N -->\r\n <NTooltip\r\n v-if=\"overflowCount > 0\"\r\n placement=\"top\"\r\n >\r\n <template #trigger>\r\n <div\r\n class=\"c-avatar-group__overflow\"\r\n :class=\"[\r\n `is-${mergedProps.shape}`,\r\n { 'is-clickable': mergedProps.overflowClickable },\r\n ]\"\r\n :style=\"overflowStyle\"\r\n @click=\"\r\n mergedProps.overflowClickable && emit('overflowClick', hiddenItems)\r\n \"\r\n >\r\n +{{ overflowCount }}\r\n </div>\r\n </template>\r\n <div style=\"max-width: 200px\">\r\n <div\r\n v-for=\"h in hiddenItems\"\r\n :key=\"h.id\"\r\n style=\"line-height: 1.6\"\r\n >\r\n {{ h.name }}\r\n </div>\r\n </div>\r\n </NTooltip>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { computed } from 'vue'\r\n import {\r\n DEFAULT_AVATAR_GROUP_PROPS,\r\n getInitials,\r\n nameToColor,\r\n STATUS_COLOR_MAP,\r\n type AvatarGroupProps,\r\n type AvatarItem,\r\n } from './types'\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n items: AvatarGroupProps['items']\r\n max?: number\r\n size?: number\r\n overlap?: number\r\n shape?: AvatarGroupProps['shape']\r\n showStatus?: boolean\r\n showTooltip?: boolean\r\n clickable?: boolean\r\n overflowClickable?: boolean\r\n direction?: AvatarGroupProps['direction']\r\n }>(),\r\n {\r\n max: DEFAULT_AVATAR_GROUP_PROPS.max,\r\n size: DEFAULT_AVATAR_GROUP_PROPS.size,\r\n overlap: DEFAULT_AVATAR_GROUP_PROPS.overlap,\r\n shape: DEFAULT_AVATAR_GROUP_PROPS.shape,\r\n showStatus: DEFAULT_AVATAR_GROUP_PROPS.showStatus,\r\n showTooltip: DEFAULT_AVATAR_GROUP_PROPS.showTooltip,\r\n clickable: DEFAULT_AVATAR_GROUP_PROPS.clickable,\r\n overflowClickable: DEFAULT_AVATAR_GROUP_PROPS.overflowClickable,\r\n direction: DEFAULT_AVATAR_GROUP_PROPS.direction,\r\n }\r\n )\r\n\r\n const emit = defineEmits<{\r\n itemClick: [item: AvatarItem]\r\n overflowClick: [hiddenItems: AvatarItem[]]\r\n }>()\r\n\r\n const mergedProps = computed(() => ({\r\n ...DEFAULT_AVATAR_GROUP_PROPS,\r\n ...props,\r\n }))\r\n\r\n const visibleItems = computed(() => {\r\n const max = mergedProps.value.max!\r\n return props.items.length > max ? props.items.slice(0, max) : props.items\r\n })\r\n\r\n const hiddenItems = computed(() => {\r\n const max = mergedProps.value.max!\r\n return props.items.length > max ? props.items.slice(max) : []\r\n })\r\n\r\n const overflowCount = computed(() => hiddenItems.value.length)\r\n\r\n const initialsFontSize = computed(\r\n () => `${Math.round(mergedProps.value.size! * 0.38)}px`\r\n )\r\n\r\n /** 计算头像项定位样式 */\r\n function itemStyle(idx: number) {\r\n const s = mergedProps.value.size!\r\n const overlap = mergedProps.value.overlap!\r\n return {\r\n width: `${s}px`,\r\n height: `${s}px`,\r\n marginLeft: idx === 0 ? '0' : `${overlap}px`,\r\n }\r\n }\r\n\r\n const overflowStyle = computed(() => {\r\n const s = mergedProps.value.size!\r\n const overlap = mergedProps.value.overlap!\r\n return {\r\n width: `${s}px`,\r\n height: `${s}px`,\r\n marginLeft: `${overlap}px`,\r\n fontSize: `${Math.round(s * 0.32)}px`,\r\n }\r\n })\r\n\r\n /** 计算状态指示点样式 */\r\n function statusStyle(status: string) {\r\n const dotSize = Math.max(8, Math.round(mergedProps.value.size! * 0.24))\r\n return {\r\n width: `${dotSize}px`,\r\n height: `${dotSize}px`,\r\n backgroundColor: STATUS_COLOR_MAP[status] ?? STATUS_COLOR_MAP.offline,\r\n }\r\n }\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n @use './index.scss';\r\n</style>\r\n","<!--\r\n * @Description: 头像组组件\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\r\n-->\r\n<template>\r\n <div\r\n class=\"c-avatar-group\"\r\n :class=\"{ 'is-rtl': mergedProps.direction === 'rtl' }\"\r\n >\r\n <NTooltip\r\n v-for=\"(item, idx) in visibleItems\"\r\n :key=\"item.id\"\r\n :disabled=\"!mergedProps.showTooltip\"\r\n placement=\"top\"\r\n >\r\n <template #trigger>\r\n <div\r\n class=\"c-avatar-group__item\"\r\n :class=\"[\r\n `is-${mergedProps.shape}`,\r\n { 'is-clickable': mergedProps.clickable },\r\n ]\"\r\n :style=\"itemStyle(idx)\"\r\n @click=\"mergedProps.clickable && emit('itemClick', item)\"\r\n >\r\n <img\r\n v-if=\"item.src\"\r\n :src=\"item.src\"\r\n :alt=\"item.name\"\r\n class=\"c-avatar-group__img\"\r\n />\r\n <div\r\n v-else\r\n class=\"c-avatar-group__initials\"\r\n :style=\"{\r\n background: nameToColor(item.name),\r\n fontSize: initialsFontSize,\r\n }\"\r\n >\r\n {{ getInitials(item.name) }}\r\n </div>\r\n\r\n <span\r\n v-if=\"mergedProps.showStatus && item.status\"\r\n class=\"c-avatar-group__status\"\r\n :style=\"statusStyle(item.status)\"\r\n />\r\n </div>\r\n </template>\r\n {{ item.tooltip ?? item.name }}\r\n </NTooltip>\r\n\r\n <!-- 溢出 +N -->\r\n <NTooltip\r\n v-if=\"overflowCount > 0\"\r\n placement=\"top\"\r\n >\r\n <template #trigger>\r\n <div\r\n class=\"c-avatar-group__overflow\"\r\n :class=\"[\r\n `is-${mergedProps.shape}`,\r\n { 'is-clickable': mergedProps.overflowClickable },\r\n ]\"\r\n :style=\"overflowStyle\"\r\n @click=\"\r\n mergedProps.overflowClickable && emit('overflowClick', hiddenItems)\r\n \"\r\n >\r\n +{{ overflowCount }}\r\n </div>\r\n </template>\r\n <div style=\"max-width: 200px\">\r\n <div\r\n v-for=\"h in hiddenItems\"\r\n :key=\"h.id\"\r\n style=\"line-height: 1.6\"\r\n >\r\n {{ h.name }}\r\n </div>\r\n </div>\r\n </NTooltip>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { computed } from 'vue'\r\n import {\r\n DEFAULT_AVATAR_GROUP_PROPS,\r\n getInitials,\r\n nameToColor,\r\n STATUS_COLOR_MAP,\r\n type AvatarGroupProps,\r\n type AvatarItem,\r\n } from './types'\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n items: AvatarGroupProps['items']\r\n max?: number\r\n size?: number\r\n overlap?: number\r\n shape?: AvatarGroupProps['shape']\r\n showStatus?: boolean\r\n showTooltip?: boolean\r\n clickable?: boolean\r\n overflowClickable?: boolean\r\n direction?: AvatarGroupProps['direction']\r\n }>(),\r\n {\r\n max: DEFAULT_AVATAR_GROUP_PROPS.max,\r\n size: DEFAULT_AVATAR_GROUP_PROPS.size,\r\n overlap: DEFAULT_AVATAR_GROUP_PROPS.overlap,\r\n shape: DEFAULT_AVATAR_GROUP_PROPS.shape,\r\n showStatus: DEFAULT_AVATAR_GROUP_PROPS.showStatus,\r\n showTooltip: DEFAULT_AVATAR_GROUP_PROPS.showTooltip,\r\n clickable: DEFAULT_AVATAR_GROUP_PROPS.clickable,\r\n overflowClickable: DEFAULT_AVATAR_GROUP_PROPS.overflowClickable,\r\n direction: DEFAULT_AVATAR_GROUP_PROPS.direction,\r\n }\r\n )\r\n\r\n const emit = defineEmits<{\r\n itemClick: [item: AvatarItem]\r\n overflowClick: [hiddenItems: AvatarItem[]]\r\n }>()\r\n\r\n const mergedProps = computed(() => ({\r\n ...DEFAULT_AVATAR_GROUP_PROPS,\r\n ...props,\r\n }))\r\n\r\n const visibleItems = computed(() => {\r\n const max = mergedProps.value.max!\r\n return props.items.length > max ? props.items.slice(0, max) : props.items\r\n })\r\n\r\n const hiddenItems = computed(() => {\r\n const max = mergedProps.value.max!\r\n return props.items.length > max ? props.items.slice(max) : []\r\n })\r\n\r\n const overflowCount = computed(() => hiddenItems.value.length)\r\n\r\n const initialsFontSize = computed(\r\n () => `${Math.round(mergedProps.value.size! * 0.38)}px`\r\n )\r\n\r\n /** 计算头像项定位样式 */\r\n function itemStyle(idx: number) {\r\n const s = mergedProps.value.size!\r\n const overlap = mergedProps.value.overlap!\r\n return {\r\n width: `${s}px`,\r\n height: `${s}px`,\r\n marginLeft: idx === 0 ? '0' : `${overlap}px`,\r\n }\r\n }\r\n\r\n const overflowStyle = computed(() => {\r\n const s = mergedProps.value.size!\r\n const overlap = mergedProps.value.overlap!\r\n return {\r\n width: `${s}px`,\r\n height: `${s}px`,\r\n marginLeft: `${overlap}px`,\r\n fontSize: `${Math.round(s * 0.32)}px`,\r\n }\r\n })\r\n\r\n /** 计算状态指示点样式 */\r\n function statusStyle(status: string) {\r\n const dotSize = Math.max(8, Math.round(mergedProps.value.size! * 0.24))\r\n return {\r\n width: `${dotSize}px`,\r\n height: `${dotSize}px`,\r\n backgroundColor: STATUS_COLOR_MAP[status] ?? STATUS_COLOR_MAP.offline,\r\n }\r\n }\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n @use './index.scss';\r\n</style>\r\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"C_Barcode-DYDRDe2O.css","names":[],"sources":["../src/components/C_Barcode/index.vue?vue&type=style&index=0&scoped=03c1988e&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled */.c-barcode[data-v-03c1988e] {\n display: inline-flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n max-width: 100%;\n}\n.c-barcode .barcode-wrapper[data-v-03c1988e] {\n display: inline-block;\n padding: 8px;\n background: #ffffff;\n border-radius: 4px;\n transition: all 0.3s ease;\n overflow: hidden;\n max-width: 100%;\n}\n.c-barcode .barcode-wrapper.with-border[data-v-03c1988e] {\n border: 1px dashed #e0e0e0;\n}\n.c-barcode .barcode-wrapper[data-v-03c1988e]:hover {\n border-color: var(--c-primary, #409eff);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n}\n.c-barcode .barcode-wrapper[data-v-03c1988e] svg {\n max-width: 100%;\n height: auto;\n display: block;\n overflow: visible;\n}\n.c-barcode .barcode-label[data-v-03c1988e] {\n font-size: 14px;\n color: #666;\n text-align: center;\n font-weight: 500;\n word-break: break-all;\n max-width: 100%;\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"}
1
+ {"version":3,"file":"C_Barcode-DjTmDkbQ.css","names":[],"sources":["../src/components/C_Barcode/index.vue?vue&type=style&index=0&scoped=e44c361d&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled */.c-barcode[data-v-e44c361d] {\n display: inline-flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n max-width: 100%;\n}\n.c-barcode .barcode-wrapper[data-v-e44c361d] {\n display: inline-block;\n padding: 8px;\n background: #ffffff;\n border-radius: 4px;\n transition: all 0.3s ease;\n overflow: hidden;\n max-width: 100%;\n}\n.c-barcode .barcode-wrapper.with-border[data-v-e44c361d] {\n border: 1px dashed #e0e0e0;\n}\n.c-barcode .barcode-wrapper[data-v-e44c361d]:hover {\n border-color: var(--c-primary, #409eff);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n}\n.c-barcode .barcode-wrapper[data-v-e44c361d] svg {\n max-width: 100%;\n height: auto;\n display: block;\n overflow: visible;\n}\n.c-barcode .barcode-label[data-v-e44c361d] {\n font-size: 14px;\n color: #666;\n text-align: center;\n font-weight: 500;\n word-break: break-all;\n max-width: 100%;\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"}
@@ -1 +1 @@
1
- {"version":3,"file":"C_Barcode-muJdc_O4.css","names":[],"sources":["../src/components/C_Barcode/index.vue?vue&type=style&index=0&scoped=03c1988e&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled */.c-barcode[data-v-03c1988e] {\n display: inline-flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n max-width: 100%;\n}\n.c-barcode .barcode-wrapper[data-v-03c1988e] {\n display: inline-block;\n padding: 8px;\n background: #ffffff;\n border-radius: 4px;\n transition: all 0.3s ease;\n overflow: hidden;\n max-width: 100%;\n}\n.c-barcode .barcode-wrapper.with-border[data-v-03c1988e] {\n border: 1px dashed #e0e0e0;\n}\n.c-barcode .barcode-wrapper[data-v-03c1988e]:hover {\n border-color: var(--c-primary, #409eff);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n}\n.c-barcode .barcode-wrapper[data-v-03c1988e] svg {\n max-width: 100%;\n height: auto;\n display: block;\n overflow: visible;\n}\n.c-barcode .barcode-label[data-v-03c1988e] {\n font-size: 14px;\n color: #666;\n text-align: center;\n font-weight: 500;\n word-break: break-all;\n max-width: 100%;\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"}
1
+ {"version":3,"file":"C_Barcode-Do1Ozsmh.css","names":[],"sources":["../src/components/C_Barcode/index.vue?vue&type=style&index=0&scoped=e44c361d&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled */.c-barcode[data-v-e44c361d] {\n display: inline-flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n max-width: 100%;\n}\n.c-barcode .barcode-wrapper[data-v-e44c361d] {\n display: inline-block;\n padding: 8px;\n background: #ffffff;\n border-radius: 4px;\n transition: all 0.3s ease;\n overflow: hidden;\n max-width: 100%;\n}\n.c-barcode .barcode-wrapper.with-border[data-v-e44c361d] {\n border: 1px dashed #e0e0e0;\n}\n.c-barcode .barcode-wrapper[data-v-e44c361d]:hover {\n border-color: var(--c-primary, #409eff);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n}\n.c-barcode .barcode-wrapper[data-v-e44c361d] svg {\n max-width: 100%;\n height: auto;\n display: block;\n overflow: visible;\n}\n.c-barcode .barcode-label[data-v-e44c361d] {\n font-size: 14px;\n color: #666;\n text-align: center;\n font-weight: 500;\n word-break: break-all;\n max-width: 100%;\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"}
@@ -1,11 +1,11 @@
1
- /* unplugin-vue-components disabled */.c-barcode[data-v-03c1988e] {
1
+ /* unplugin-vue-components disabled */.c-barcode[data-v-e44c361d] {
2
2
  display: inline-flex;
3
3
  flex-direction: column;
4
4
  align-items: center;
5
5
  gap: 8px;
6
6
  max-width: 100%;
7
7
  }
8
- .c-barcode .barcode-wrapper[data-v-03c1988e] {
8
+ .c-barcode .barcode-wrapper[data-v-e44c361d] {
9
9
  display: inline-block;
10
10
  padding: 8px;
11
11
  background: #ffffff;
@@ -14,20 +14,20 @@
14
14
  overflow: hidden;
15
15
  max-width: 100%;
16
16
  }
17
- .c-barcode .barcode-wrapper.with-border[data-v-03c1988e] {
17
+ .c-barcode .barcode-wrapper.with-border[data-v-e44c361d] {
18
18
  border: 1px dashed #e0e0e0;
19
19
  }
20
- .c-barcode .barcode-wrapper[data-v-03c1988e]:hover {
20
+ .c-barcode .barcode-wrapper[data-v-e44c361d]:hover {
21
21
  border-color: var(--c-primary, #409eff);
22
22
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
23
23
  }
24
- .c-barcode .barcode-wrapper[data-v-03c1988e] svg {
24
+ .c-barcode .barcode-wrapper[data-v-e44c361d] svg {
25
25
  max-width: 100%;
26
26
  height: auto;
27
27
  display: block;
28
28
  overflow: visible;
29
29
  }
30
- .c-barcode .barcode-label[data-v-03c1988e] {
30
+ .c-barcode .barcode-label[data-v-e44c361d] {
31
31
  font-size: 14px;
32
32
  color: #666;
33
33
  text-align: center;
@@ -36,4 +36,4 @@
36
36
  max-width: 100%;
37
37
  }
38
38
 
39
- /*# sourceMappingURL=C_Barcode-DYDRDe2O.css.map*/
39
+ /*# sourceMappingURL=C_Barcode-DjTmDkbQ.css.map*/
@@ -1,2 +1,2 @@
1
- import { t as _default } from "./index2.vue.js";
1
+ import { t as _default } from "./index4.vue.js";
2
2
  export { _default as C_Barcode };
@@ -1,2 +1,2 @@
1
- import { t as _default } from "./index2.vue.js";
1
+ import { t as _default } from "./index4.vue.js";
2
2
  export { _default as C_Barcode };
@@ -1 +1 @@
1
- {"version":3,"file":"C_Barcode.js","names":["showBorder","showLabel","label"],"sources":["../src/components/C_Barcode/index.vue","../src/components/C_Barcode/index.vue","../src/components/C_Barcode/index.vue"],"sourcesContent":["/* unplugin-vue-components disabled */<!--\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2025-12-02\n * @Description: 条形码组件\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <div class=\"c-barcode\">\n <div class=\"barcode-wrapper\" :class=\"{ 'with-border': showBorder }\">\n <VueBarcode v-bind=\"barcodeProps\" @error=\"handleError\" />\n </div>\n <div v-if=\"showLabel && label\" class=\"barcode-label\">\n {{ label }}\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport VueBarcode from \"@chenfengyuan/vue-barcode\";\n\ndefineOptions({ name: \"C_Barcode\" });\n\ninterface Props {\n value: string;\n format?:\n | \"CODE128\"\n | \"CODE39\"\n | \"EAN13\"\n | \"EAN8\"\n | \"UPC\"\n | \"ITF14\"\n | \"MSI\"\n | \"pharmacode\";\n width?: number;\n height?: number;\n showText?: boolean;\n fontSize?: number;\n textPosition?: \"bottom\" | \"top\";\n lineColor?: string;\n background?: string;\n showBorder?: boolean;\n label?: string;\n showLabel?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n format: \"CODE128\",\n width: 2,\n height: 80,\n showText: true,\n fontSize: 20,\n textPosition: \"bottom\",\n lineColor: \"#000000\",\n background: \"#FFFFFF\",\n showBorder: true,\n label: \"\",\n showLabel: false,\n});\n\nconst emit = defineEmits<{\n error: [error: Error];\n}>();\n\nconst barcodeProps = computed(() => ({\n value: props.value,\n format: props.format,\n width: props.width,\n height: props.height,\n displayValue: props.showText,\n fontSize: props.fontSize,\n textPosition: props.textPosition,\n lineColor: props.lineColor,\n background: props.background,\n}));\n\nconst handleError = (error: Error) => {\n console.error(\"条形码生成失败:\", error);\n emit(\"error\", error);\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@use \"./index.scss\";\n</style>\n","/* unplugin-vue-components disabled */<!--\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2025-12-02\n * @Description: 条形码组件\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <div class=\"c-barcode\">\n <div class=\"barcode-wrapper\" :class=\"{ 'with-border': showBorder }\">\n <VueBarcode v-bind=\"barcodeProps\" @error=\"handleError\" />\n </div>\n <div v-if=\"showLabel && label\" class=\"barcode-label\">\n {{ label }}\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport VueBarcode from \"@chenfengyuan/vue-barcode\";\n\ndefineOptions({ name: \"C_Barcode\" });\n\ninterface Props {\n value: string;\n format?:\n | \"CODE128\"\n | \"CODE39\"\n | \"EAN13\"\n | \"EAN8\"\n | \"UPC\"\n | \"ITF14\"\n | \"MSI\"\n | \"pharmacode\";\n width?: number;\n height?: number;\n showText?: boolean;\n fontSize?: number;\n textPosition?: \"bottom\" | \"top\";\n lineColor?: string;\n background?: string;\n showBorder?: boolean;\n label?: string;\n showLabel?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n format: \"CODE128\",\n width: 2,\n height: 80,\n showText: true,\n fontSize: 20,\n textPosition: \"bottom\",\n lineColor: \"#000000\",\n background: \"#FFFFFF\",\n showBorder: true,\n label: \"\",\n showLabel: false,\n});\n\nconst emit = defineEmits<{\n error: [error: Error];\n}>();\n\nconst barcodeProps = computed(() => ({\n value: props.value,\n format: props.format,\n width: props.width,\n height: props.height,\n displayValue: props.showText,\n fontSize: props.fontSize,\n textPosition: props.textPosition,\n lineColor: props.lineColor,\n background: props.background,\n}));\n\nconst handleError = (error: Error) => {\n console.error(\"条形码生成失败:\", error);\n emit(\"error\", error);\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@use \"./index.scss\";\n</style>\n","<!--\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2025-12-02\n * @Description: 条形码组件\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <div class=\"c-barcode\">\n <div class=\"barcode-wrapper\" :class=\"{ 'with-border': showBorder }\">\n <VueBarcode v-bind=\"barcodeProps\" @error=\"handleError\" />\n </div>\n <div v-if=\"showLabel && label\" class=\"barcode-label\">\n {{ label }}\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport VueBarcode from \"@chenfengyuan/vue-barcode\";\n\ndefineOptions({ name: \"C_Barcode\" });\n\ninterface Props {\n value: string;\n format?:\n | \"CODE128\"\n | \"CODE39\"\n | \"EAN13\"\n | \"EAN8\"\n | \"UPC\"\n | \"ITF14\"\n | \"MSI\"\n | \"pharmacode\";\n width?: number;\n height?: number;\n showText?: boolean;\n fontSize?: number;\n textPosition?: \"bottom\" | \"top\";\n lineColor?: string;\n background?: string;\n showBorder?: boolean;\n label?: string;\n showLabel?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n format: \"CODE128\",\n width: 2,\n height: 80,\n showText: true,\n fontSize: 20,\n textPosition: \"bottom\",\n lineColor: \"#000000\",\n background: \"#FFFFFF\",\n showBorder: true,\n label: \"\",\n showLabel: false,\n});\n\nconst emit = defineEmits<{\n error: [error: Error];\n}>();\n\nconst barcodeProps = computed(() => ({\n value: props.value,\n format: props.format,\n width: props.width,\n height: props.height,\n displayValue: props.showText,\n fontSize: props.fontSize,\n textPosition: props.textPosition,\n lineColor: props.lineColor,\n background: props.background,\n}));\n\nconst handleError = (error: Error) => {\n console.error(\"条形码生成失败:\", error);\n emit(\"error\", error);\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@use \"./index.scss\";\n</style>\n"],"mappings":"kmBE+CA,IAAM,EAAQ,EAcR,EAAO,EAIP,GAAA,EAAA,EAAA,eAA+B,CACnC,MAAO,EAAM,MACb,OAAQ,EAAM,OACd,MAAO,EAAM,MACb,OAAQ,EAAM,OACd,aAAc,EAAM,SACpB,SAAU,EAAM,SAChB,aAAc,EAAM,aACpB,UAAW,EAAM,UACjB,WAAY,EAAM,WACnB,EAAE,CAEG,EAAe,GAAiB,CACpC,QAAQ,MAAM,WAAY,EAAM,CAChC,EAAK,QAAS,EAAM,2DAhEd,MAPN,EAOM,EAAA,EAAA,EAAA,oBAJE,MAAA,CAFD,OAAA,EAAA,EAAA,gBAAK,CAAC,kBAAiB,CAAA,cAA0BA,EAAAA,WAAU,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,EAAA,cAAA,EAAA,EAAA,OACL,EAAA,QAAA,EAAA,EAAA,EAAA,YAArC,EAAqC,MAAzB,CAAG,QAAO,EAAW,CAAA,CAAA,KAAA,GAAA,CAAA,CAAA,EAAA,CAE5CC,EAAAA,WAAaC,EAAAA,QAAAA,EAAAA,EAAAA,YAAAA,EAAAA,EAAAA,EAAAA,oBAElB,MAFN,GAAA,EAAA,EAAA,iBACKA,EAAAA,MAAK,CAAA,EAAA,GAAA,EAAA,EAAA,oBAAA,OAAA,GAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"C_Barcode.js","names":["showBorder","showLabel","label"],"sources":["../src/components/C_Barcode/index.vue","../src/components/C_Barcode/index.vue","../src/components/C_Barcode/index.vue"],"sourcesContent":["/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-12-02\r\n * @Description: 条形码组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-barcode\">\r\n <div class=\"barcode-wrapper\" :class=\"{ 'with-border': showBorder }\">\r\n <VueBarcode v-bind=\"barcodeProps\" @error=\"handleError\" />\r\n </div>\r\n <div v-if=\"showLabel && label\" class=\"barcode-label\">\r\n {{ label }}\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed } from \"vue\";\r\nimport VueBarcode from \"@chenfengyuan/vue-barcode\";\r\n\r\ndefineOptions({ name: \"C_Barcode\" });\r\n\r\ninterface Props {\r\n value: string;\r\n format?:\r\n | \"CODE128\"\r\n | \"CODE39\"\r\n | \"EAN13\"\r\n | \"EAN8\"\r\n | \"UPC\"\r\n | \"ITF14\"\r\n | \"MSI\"\r\n | \"pharmacode\";\r\n width?: number;\r\n height?: number;\r\n showText?: boolean;\r\n fontSize?: number;\r\n textPosition?: \"bottom\" | \"top\";\r\n lineColor?: string;\r\n background?: string;\r\n showBorder?: boolean;\r\n label?: string;\r\n showLabel?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n format: \"CODE128\",\r\n width: 2,\r\n height: 80,\r\n showText: true,\r\n fontSize: 20,\r\n textPosition: \"bottom\",\r\n lineColor: \"#000000\",\r\n background: \"#FFFFFF\",\r\n showBorder: true,\r\n label: \"\",\r\n showLabel: false,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n error: [error: Error];\r\n}>();\r\n\r\nconst barcodeProps = computed(() => ({\r\n value: props.value,\r\n format: props.format,\r\n width: props.width,\r\n height: props.height,\r\n displayValue: props.showText,\r\n fontSize: props.fontSize,\r\n textPosition: props.textPosition,\r\n lineColor: props.lineColor,\r\n background: props.background,\r\n}));\r\n\r\nconst handleError = (error: Error) => {\r\n console.error(\"条形码生成失败:\", error);\r\n emit(\"error\", error);\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-12-02\r\n * @Description: 条形码组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-barcode\">\r\n <div class=\"barcode-wrapper\" :class=\"{ 'with-border': showBorder }\">\r\n <VueBarcode v-bind=\"barcodeProps\" @error=\"handleError\" />\r\n </div>\r\n <div v-if=\"showLabel && label\" class=\"barcode-label\">\r\n {{ label }}\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed } from \"vue\";\r\nimport VueBarcode from \"@chenfengyuan/vue-barcode\";\r\n\r\ndefineOptions({ name: \"C_Barcode\" });\r\n\r\ninterface Props {\r\n value: string;\r\n format?:\r\n | \"CODE128\"\r\n | \"CODE39\"\r\n | \"EAN13\"\r\n | \"EAN8\"\r\n | \"UPC\"\r\n | \"ITF14\"\r\n | \"MSI\"\r\n | \"pharmacode\";\r\n width?: number;\r\n height?: number;\r\n showText?: boolean;\r\n fontSize?: number;\r\n textPosition?: \"bottom\" | \"top\";\r\n lineColor?: string;\r\n background?: string;\r\n showBorder?: boolean;\r\n label?: string;\r\n showLabel?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n format: \"CODE128\",\r\n width: 2,\r\n height: 80,\r\n showText: true,\r\n fontSize: 20,\r\n textPosition: \"bottom\",\r\n lineColor: \"#000000\",\r\n background: \"#FFFFFF\",\r\n showBorder: true,\r\n label: \"\",\r\n showLabel: false,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n error: [error: Error];\r\n}>();\r\n\r\nconst barcodeProps = computed(() => ({\r\n value: props.value,\r\n format: props.format,\r\n width: props.width,\r\n height: props.height,\r\n displayValue: props.showText,\r\n fontSize: props.fontSize,\r\n textPosition: props.textPosition,\r\n lineColor: props.lineColor,\r\n background: props.background,\r\n}));\r\n\r\nconst handleError = (error: Error) => {\r\n console.error(\"条形码生成失败:\", error);\r\n emit(\"error\", error);\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-12-02\r\n * @Description: 条形码组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-barcode\">\r\n <div class=\"barcode-wrapper\" :class=\"{ 'with-border': showBorder }\">\r\n <VueBarcode v-bind=\"barcodeProps\" @error=\"handleError\" />\r\n </div>\r\n <div v-if=\"showLabel && label\" class=\"barcode-label\">\r\n {{ label }}\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed } from \"vue\";\r\nimport VueBarcode from \"@chenfengyuan/vue-barcode\";\r\n\r\ndefineOptions({ name: \"C_Barcode\" });\r\n\r\ninterface Props {\r\n value: string;\r\n format?:\r\n | \"CODE128\"\r\n | \"CODE39\"\r\n | \"EAN13\"\r\n | \"EAN8\"\r\n | \"UPC\"\r\n | \"ITF14\"\r\n | \"MSI\"\r\n | \"pharmacode\";\r\n width?: number;\r\n height?: number;\r\n showText?: boolean;\r\n fontSize?: number;\r\n textPosition?: \"bottom\" | \"top\";\r\n lineColor?: string;\r\n background?: string;\r\n showBorder?: boolean;\r\n label?: string;\r\n showLabel?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n format: \"CODE128\",\r\n width: 2,\r\n height: 80,\r\n showText: true,\r\n fontSize: 20,\r\n textPosition: \"bottom\",\r\n lineColor: \"#000000\",\r\n background: \"#FFFFFF\",\r\n showBorder: true,\r\n label: \"\",\r\n showLabel: false,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n error: [error: Error];\r\n}>();\r\n\r\nconst barcodeProps = computed(() => ({\r\n value: props.value,\r\n format: props.format,\r\n width: props.width,\r\n height: props.height,\r\n displayValue: props.showText,\r\n fontSize: props.fontSize,\r\n textPosition: props.textPosition,\r\n lineColor: props.lineColor,\r\n background: props.background,\r\n}));\r\n\r\nconst handleError = (error: Error) => {\r\n console.error(\"条形码生成失败:\", error);\r\n emit(\"error\", error);\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n"],"mappings":"kmBE+CA,IAAM,EAAQ,EAcR,EAAO,EAIP,GAAA,EAAA,EAAA,eAA+B,CACnC,MAAO,EAAM,MACb,OAAQ,EAAM,OACd,MAAO,EAAM,MACb,OAAQ,EAAM,OACd,aAAc,EAAM,SACpB,SAAU,EAAM,SAChB,aAAc,EAAM,aACpB,UAAW,EAAM,UACjB,WAAY,EAAM,WACnB,EAAE,CAEG,EAAe,GAAiB,CACpC,QAAQ,MAAM,WAAY,EAAM,CAChC,EAAK,QAAS,EAAM,2DAhEd,MAPN,EAOM,EAAA,EAAA,EAAA,oBAJE,MAAA,CAFD,OAAA,EAAA,EAAA,gBAAK,CAAC,kBAAiB,CAAA,cAA0BA,EAAAA,WAAU,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,EAAA,cAAA,EAAA,EAAA,OACL,EAAA,QAAA,EAAA,EAAA,EAAA,YAArC,EAAqC,MAAzB,CAAG,QAAO,EAAW,CAAA,CAAA,KAAA,GAAA,CAAA,CAAA,EAAA,CAE5CC,EAAAA,WAAaC,EAAAA,QAAAA,EAAAA,EAAAA,YAAAA,EAAAA,EAAAA,EAAAA,oBAElB,MAFN,GAAA,EAAA,EAAA,iBACKA,EAAAA,MAAK,CAAA,EAAA,GAAA,EAAA,EAAA,oBAAA,OAAA,GAAA,CAAA,CAAA"}
@@ -1,2 +1,2 @@
1
- import{t as e}from"./export-helper.js";import{computed as t,createCommentVNode as n,createElementBlock as r,createElementVNode as i,createVNode as a,defineComponent as o,mergeProps as s,normalizeClass as c,openBlock as l,toDisplayString as u,unref as d}from"vue";import f from"@chenfengyuan/vue-barcode";const p={class:`c-barcode`},m={key:0,class:`barcode-label`};var h=e(o({name:`C_Barcode`,__name:`index`,props:{value:{},format:{default:`CODE128`},width:{default:2},height:{default:80},showText:{type:Boolean,default:!0},fontSize:{default:20},textPosition:{default:`bottom`},lineColor:{default:`#000000`},background:{default:`#FFFFFF`},showBorder:{type:Boolean,default:!0},label:{default:``},showLabel:{type:Boolean,default:!1}},emits:[`error`],setup(e,{emit:o}){let h=e,g=o,_=t(()=>({value:h.value,format:h.format,width:h.width,height:h.height,displayValue:h.showText,fontSize:h.fontSize,textPosition:h.textPosition,lineColor:h.lineColor,background:h.background})),v=e=>{console.error(`条形码生成失败:`,e),g(`error`,e)};return(e,t)=>(l(),r(`div`,p,[i(`div`,{class:c([`barcode-wrapper`,{"with-border":e.showBorder}])},[a(d(f),s(_.value,{onError:v}),null,16)],2),e.showLabel&&e.label?(l(),r(`div`,m,u(e.label),1)):n(`v-if`,!0)]))}}),[[`__scopeId`,`data-v-03c1988e`]]);export{h as t};
1
+ import{t as e}from"./export-helper.js";import{computed as t,createCommentVNode as n,createElementBlock as r,createElementVNode as i,createVNode as a,defineComponent as o,mergeProps as s,normalizeClass as c,openBlock as l,toDisplayString as u,unref as d}from"vue";import f from"@chenfengyuan/vue-barcode";const p={class:`c-barcode`},m={key:0,class:`barcode-label`};var h=e(o({name:`C_Barcode`,__name:`index`,props:{value:{},format:{default:`CODE128`},width:{default:2},height:{default:80},showText:{type:Boolean,default:!0},fontSize:{default:20},textPosition:{default:`bottom`},lineColor:{default:`#000000`},background:{default:`#FFFFFF`},showBorder:{type:Boolean,default:!0},label:{default:``},showLabel:{type:Boolean,default:!1}},emits:[`error`],setup(e,{emit:o}){let h=e,g=o,_=t(()=>({value:h.value,format:h.format,width:h.width,height:h.height,displayValue:h.showText,fontSize:h.fontSize,textPosition:h.textPosition,lineColor:h.lineColor,background:h.background})),v=e=>{console.error(`条形码生成失败:`,e),g(`error`,e)};return(e,t)=>(l(),r(`div`,p,[i(`div`,{class:c([`barcode-wrapper`,{"with-border":e.showBorder}])},[a(d(f),s(_.value,{onError:v}),null,16)],2),e.showLabel&&e.label?(l(),r(`div`,m,u(e.label),1)):n(`v-if`,!0)]))}}),[[`__scopeId`,`data-v-e44c361d`]]);export{h as t};
2
2
  //# sourceMappingURL=C_Barcode2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"C_Barcode2.js","names":["showBorder","showLabel","label"],"sources":["../src/components/C_Barcode/index.vue","../src/components/C_Barcode/index.vue","../src/components/C_Barcode/index.vue"],"sourcesContent":["/* unplugin-vue-components disabled */<!--\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2025-12-02\n * @Description: 条形码组件\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <div class=\"c-barcode\">\n <div class=\"barcode-wrapper\" :class=\"{ 'with-border': showBorder }\">\n <VueBarcode v-bind=\"barcodeProps\" @error=\"handleError\" />\n </div>\n <div v-if=\"showLabel && label\" class=\"barcode-label\">\n {{ label }}\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport VueBarcode from \"@chenfengyuan/vue-barcode\";\n\ndefineOptions({ name: \"C_Barcode\" });\n\ninterface Props {\n value: string;\n format?:\n | \"CODE128\"\n | \"CODE39\"\n | \"EAN13\"\n | \"EAN8\"\n | \"UPC\"\n | \"ITF14\"\n | \"MSI\"\n | \"pharmacode\";\n width?: number;\n height?: number;\n showText?: boolean;\n fontSize?: number;\n textPosition?: \"bottom\" | \"top\";\n lineColor?: string;\n background?: string;\n showBorder?: boolean;\n label?: string;\n showLabel?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n format: \"CODE128\",\n width: 2,\n height: 80,\n showText: true,\n fontSize: 20,\n textPosition: \"bottom\",\n lineColor: \"#000000\",\n background: \"#FFFFFF\",\n showBorder: true,\n label: \"\",\n showLabel: false,\n});\n\nconst emit = defineEmits<{\n error: [error: Error];\n}>();\n\nconst barcodeProps = computed(() => ({\n value: props.value,\n format: props.format,\n width: props.width,\n height: props.height,\n displayValue: props.showText,\n fontSize: props.fontSize,\n textPosition: props.textPosition,\n lineColor: props.lineColor,\n background: props.background,\n}));\n\nconst handleError = (error: Error) => {\n console.error(\"条形码生成失败:\", error);\n emit(\"error\", error);\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@use \"./index.scss\";\n</style>\n","/* unplugin-vue-components disabled */<!--\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2025-12-02\n * @Description: 条形码组件\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <div class=\"c-barcode\">\n <div class=\"barcode-wrapper\" :class=\"{ 'with-border': showBorder }\">\n <VueBarcode v-bind=\"barcodeProps\" @error=\"handleError\" />\n </div>\n <div v-if=\"showLabel && label\" class=\"barcode-label\">\n {{ label }}\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport VueBarcode from \"@chenfengyuan/vue-barcode\";\n\ndefineOptions({ name: \"C_Barcode\" });\n\ninterface Props {\n value: string;\n format?:\n | \"CODE128\"\n | \"CODE39\"\n | \"EAN13\"\n | \"EAN8\"\n | \"UPC\"\n | \"ITF14\"\n | \"MSI\"\n | \"pharmacode\";\n width?: number;\n height?: number;\n showText?: boolean;\n fontSize?: number;\n textPosition?: \"bottom\" | \"top\";\n lineColor?: string;\n background?: string;\n showBorder?: boolean;\n label?: string;\n showLabel?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n format: \"CODE128\",\n width: 2,\n height: 80,\n showText: true,\n fontSize: 20,\n textPosition: \"bottom\",\n lineColor: \"#000000\",\n background: \"#FFFFFF\",\n showBorder: true,\n label: \"\",\n showLabel: false,\n});\n\nconst emit = defineEmits<{\n error: [error: Error];\n}>();\n\nconst barcodeProps = computed(() => ({\n value: props.value,\n format: props.format,\n width: props.width,\n height: props.height,\n displayValue: props.showText,\n fontSize: props.fontSize,\n textPosition: props.textPosition,\n lineColor: props.lineColor,\n background: props.background,\n}));\n\nconst handleError = (error: Error) => {\n console.error(\"条形码生成失败:\", error);\n emit(\"error\", error);\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@use \"./index.scss\";\n</style>\n","<!--\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2025-12-02\n * @Description: 条形码组件\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <div class=\"c-barcode\">\n <div class=\"barcode-wrapper\" :class=\"{ 'with-border': showBorder }\">\n <VueBarcode v-bind=\"barcodeProps\" @error=\"handleError\" />\n </div>\n <div v-if=\"showLabel && label\" class=\"barcode-label\">\n {{ label }}\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from \"vue\";\nimport VueBarcode from \"@chenfengyuan/vue-barcode\";\n\ndefineOptions({ name: \"C_Barcode\" });\n\ninterface Props {\n value: string;\n format?:\n | \"CODE128\"\n | \"CODE39\"\n | \"EAN13\"\n | \"EAN8\"\n | \"UPC\"\n | \"ITF14\"\n | \"MSI\"\n | \"pharmacode\";\n width?: number;\n height?: number;\n showText?: boolean;\n fontSize?: number;\n textPosition?: \"bottom\" | \"top\";\n lineColor?: string;\n background?: string;\n showBorder?: boolean;\n label?: string;\n showLabel?: boolean;\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n format: \"CODE128\",\n width: 2,\n height: 80,\n showText: true,\n fontSize: 20,\n textPosition: \"bottom\",\n lineColor: \"#000000\",\n background: \"#FFFFFF\",\n showBorder: true,\n label: \"\",\n showLabel: false,\n});\n\nconst emit = defineEmits<{\n error: [error: Error];\n}>();\n\nconst barcodeProps = computed(() => ({\n value: props.value,\n format: props.format,\n width: props.width,\n height: props.height,\n displayValue: props.showText,\n fontSize: props.fontSize,\n textPosition: props.textPosition,\n lineColor: props.lineColor,\n background: props.background,\n}));\n\nconst handleError = (error: Error) => {\n console.error(\"条形码生成失败:\", error);\n emit(\"error\", error);\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@use \"./index.scss\";\n</style>\n"],"mappings":"6vBE+CA,IAAM,EAAQ,EAcR,EAAO,EAIP,EAAe,OAAgB,CACnC,MAAO,EAAM,MACb,OAAQ,EAAM,OACd,MAAO,EAAM,MACb,OAAQ,EAAM,OACd,aAAc,EAAM,SACpB,SAAU,EAAM,SAChB,aAAc,EAAM,aACpB,UAAW,EAAM,UACjB,WAAY,EAAM,WACnB,EAAE,CAEG,EAAe,GAAiB,CACpC,QAAQ,MAAM,WAAY,EAAM,CAChC,EAAK,QAAS,EAAM,oBAvEpB,EAOM,MAPN,EAOM,CANJ,EAEM,MAAA,CAFD,MAAK,EAAA,CAAC,kBAAiB,CAAA,cAA0BA,EAAAA,WAAU,CAAA,CAAA,CAAA,CAAA,CAC9D,EAAyD,EAAA,EAAA,CAAzD,EAAoB,EAAqC,MAAzB,CAAG,QAAO,EAAW,CAAA,CAAA,KAAA,GAAA,CAAA,CAAA,EAAA,CAE5CC,EAAAA,WAAaC,EAAAA,OAAAA,GAAAA,CAAxB,EAEM,MAFN,EAEM,EADDA,EAAAA,MAAK,CAAA,EAAA,EAAA,EAAA,OAAA,GAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"C_Barcode2.js","names":["showBorder","showLabel","label"],"sources":["../src/components/C_Barcode/index.vue","../src/components/C_Barcode/index.vue","../src/components/C_Barcode/index.vue"],"sourcesContent":["/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-12-02\r\n * @Description: 条形码组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-barcode\">\r\n <div class=\"barcode-wrapper\" :class=\"{ 'with-border': showBorder }\">\r\n <VueBarcode v-bind=\"barcodeProps\" @error=\"handleError\" />\r\n </div>\r\n <div v-if=\"showLabel && label\" class=\"barcode-label\">\r\n {{ label }}\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed } from \"vue\";\r\nimport VueBarcode from \"@chenfengyuan/vue-barcode\";\r\n\r\ndefineOptions({ name: \"C_Barcode\" });\r\n\r\ninterface Props {\r\n value: string;\r\n format?:\r\n | \"CODE128\"\r\n | \"CODE39\"\r\n | \"EAN13\"\r\n | \"EAN8\"\r\n | \"UPC\"\r\n | \"ITF14\"\r\n | \"MSI\"\r\n | \"pharmacode\";\r\n width?: number;\r\n height?: number;\r\n showText?: boolean;\r\n fontSize?: number;\r\n textPosition?: \"bottom\" | \"top\";\r\n lineColor?: string;\r\n background?: string;\r\n showBorder?: boolean;\r\n label?: string;\r\n showLabel?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n format: \"CODE128\",\r\n width: 2,\r\n height: 80,\r\n showText: true,\r\n fontSize: 20,\r\n textPosition: \"bottom\",\r\n lineColor: \"#000000\",\r\n background: \"#FFFFFF\",\r\n showBorder: true,\r\n label: \"\",\r\n showLabel: false,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n error: [error: Error];\r\n}>();\r\n\r\nconst barcodeProps = computed(() => ({\r\n value: props.value,\r\n format: props.format,\r\n width: props.width,\r\n height: props.height,\r\n displayValue: props.showText,\r\n fontSize: props.fontSize,\r\n textPosition: props.textPosition,\r\n lineColor: props.lineColor,\r\n background: props.background,\r\n}));\r\n\r\nconst handleError = (error: Error) => {\r\n console.error(\"条形码生成失败:\", error);\r\n emit(\"error\", error);\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-12-02\r\n * @Description: 条形码组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-barcode\">\r\n <div class=\"barcode-wrapper\" :class=\"{ 'with-border': showBorder }\">\r\n <VueBarcode v-bind=\"barcodeProps\" @error=\"handleError\" />\r\n </div>\r\n <div v-if=\"showLabel && label\" class=\"barcode-label\">\r\n {{ label }}\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed } from \"vue\";\r\nimport VueBarcode from \"@chenfengyuan/vue-barcode\";\r\n\r\ndefineOptions({ name: \"C_Barcode\" });\r\n\r\ninterface Props {\r\n value: string;\r\n format?:\r\n | \"CODE128\"\r\n | \"CODE39\"\r\n | \"EAN13\"\r\n | \"EAN8\"\r\n | \"UPC\"\r\n | \"ITF14\"\r\n | \"MSI\"\r\n | \"pharmacode\";\r\n width?: number;\r\n height?: number;\r\n showText?: boolean;\r\n fontSize?: number;\r\n textPosition?: \"bottom\" | \"top\";\r\n lineColor?: string;\r\n background?: string;\r\n showBorder?: boolean;\r\n label?: string;\r\n showLabel?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n format: \"CODE128\",\r\n width: 2,\r\n height: 80,\r\n showText: true,\r\n fontSize: 20,\r\n textPosition: \"bottom\",\r\n lineColor: \"#000000\",\r\n background: \"#FFFFFF\",\r\n showBorder: true,\r\n label: \"\",\r\n showLabel: false,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n error: [error: Error];\r\n}>();\r\n\r\nconst barcodeProps = computed(() => ({\r\n value: props.value,\r\n format: props.format,\r\n width: props.width,\r\n height: props.height,\r\n displayValue: props.showText,\r\n fontSize: props.fontSize,\r\n textPosition: props.textPosition,\r\n lineColor: props.lineColor,\r\n background: props.background,\r\n}));\r\n\r\nconst handleError = (error: Error) => {\r\n console.error(\"条形码生成失败:\", error);\r\n emit(\"error\", error);\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-12-02\r\n * @Description: 条形码组件\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div class=\"c-barcode\">\r\n <div class=\"barcode-wrapper\" :class=\"{ 'with-border': showBorder }\">\r\n <VueBarcode v-bind=\"barcodeProps\" @error=\"handleError\" />\r\n </div>\r\n <div v-if=\"showLabel && label\" class=\"barcode-label\">\r\n {{ label }}\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed } from \"vue\";\r\nimport VueBarcode from \"@chenfengyuan/vue-barcode\";\r\n\r\ndefineOptions({ name: \"C_Barcode\" });\r\n\r\ninterface Props {\r\n value: string;\r\n format?:\r\n | \"CODE128\"\r\n | \"CODE39\"\r\n | \"EAN13\"\r\n | \"EAN8\"\r\n | \"UPC\"\r\n | \"ITF14\"\r\n | \"MSI\"\r\n | \"pharmacode\";\r\n width?: number;\r\n height?: number;\r\n showText?: boolean;\r\n fontSize?: number;\r\n textPosition?: \"bottom\" | \"top\";\r\n lineColor?: string;\r\n background?: string;\r\n showBorder?: boolean;\r\n label?: string;\r\n showLabel?: boolean;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n format: \"CODE128\",\r\n width: 2,\r\n height: 80,\r\n showText: true,\r\n fontSize: 20,\r\n textPosition: \"bottom\",\r\n lineColor: \"#000000\",\r\n background: \"#FFFFFF\",\r\n showBorder: true,\r\n label: \"\",\r\n showLabel: false,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n error: [error: Error];\r\n}>();\r\n\r\nconst barcodeProps = computed(() => ({\r\n value: props.value,\r\n format: props.format,\r\n width: props.width,\r\n height: props.height,\r\n displayValue: props.showText,\r\n fontSize: props.fontSize,\r\n textPosition: props.textPosition,\r\n lineColor: props.lineColor,\r\n background: props.background,\r\n}));\r\n\r\nconst handleError = (error: Error) => {\r\n console.error(\"条形码生成失败:\", error);\r\n emit(\"error\", error);\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n"],"mappings":"6vBE+CA,IAAM,EAAQ,EAcR,EAAO,EAIP,EAAe,OAAgB,CACnC,MAAO,EAAM,MACb,OAAQ,EAAM,OACd,MAAO,EAAM,MACb,OAAQ,EAAM,OACd,aAAc,EAAM,SACpB,SAAU,EAAM,SAChB,aAAc,EAAM,aACpB,UAAW,EAAM,UACjB,WAAY,EAAM,WACnB,EAAE,CAEG,EAAe,GAAiB,CACpC,QAAQ,MAAM,WAAY,EAAM,CAChC,EAAK,QAAS,EAAM,oBAvEpB,EAOM,MAPN,EAOM,CANJ,EAEM,MAAA,CAFD,MAAK,EAAA,CAAC,kBAAiB,CAAA,cAA0BA,EAAAA,WAAU,CAAA,CAAA,CAAA,CAAA,CAC9D,EAAyD,EAAA,EAAA,CAAzD,EAAoB,EAAqC,MAAzB,CAAG,QAAO,EAAW,CAAA,CAAA,KAAA,GAAA,CAAA,CAAA,EAAA,CAE5CC,EAAAA,WAAaC,EAAAA,OAAAA,GAAAA,CAAxB,EAEM,MAFN,EAEM,EADDA,EAAAA,MAAK,CAAA,EAAA,EAAA,EAAA,OAAA,GAAA,CAAA,CAAA"}
@@ -1,2 +1,2 @@
1
- import { t as _default } from "./index3.vue.js";
1
+ import { t as _default } from "./index5.vue.js";
2
2
  export { _default as C_Breadcrumb };
@@ -1,3 +1,3 @@
1
1
  import "./menuAdapter.js";
2
- import { t as _default } from "./index3.vue.js";
2
+ import { t as _default } from "./index5.vue.js";
3
3
  export { _default as C_Breadcrumb };
@@ -1 +1 @@
1
- {"version":3,"file":"C_Breadcrumb.js","names":["iconSize","showIcon"],"sources":["../src/components/C_Breadcrumb/index.vue","../src/components/C_Breadcrumb/index.vue","../src/components/C_Breadcrumb/index.vue"],"sourcesContent":["/* unplugin-vue-components disabled */<!--\n * @Description: 通用面包屑组件 — 基于 NBreadcrumb 的路由面包屑导航\n *\n * 支持两种模式:\n * 1. 自动模式(默认)— 从 `route.matched` 自动生成面包屑\n * 2. 手动模式 — 传入 `items` 完全自定义\n *\n * @example 自动模式(零配置)\n * ```vue\n * <C_Breadcrumb\n * :label-formatter=\"$t\"\n * @select=\"router.push\"\n * />\n * ```\n *\n * @example 手动模式\n * ```vue\n * <C_Breadcrumb\n * :items=\"customBreadcrumbs\"\n * @select=\"handleSelect\"\n * />\n * ```\n *\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <div\n class=\"c-breadcrumb flex-1 min-w-0\"\n :style=\"{\n '--c-breadcrumb-icon-size': `${iconSize}px`,\n '--c-breadcrumb-gap': `${Math.max(Math.round(iconSize / 4), 2)}px`,\n }\"\n >\n <NBreadcrumb>\n <NBreadcrumbItem\n v-for=\"(item, index) in breadcrumbItems\"\n :key=\"index\"\n >\n <NDropdown\n v-if=\"item.children?.length\"\n :options=\"item.children\"\n @select=\"handleSelect\"\n >\n <div class=\"c-breadcrumb__trigger\">\n <C_Icon\n v-if=\"showIcon\"\n :name=\"item.icon\"\n :size=\"iconSize\"\n />\n {{ item.label }}\n </div>\n </NDropdown>\n <span\n v-else\n class=\"c-breadcrumb__link\"\n @click=\"handleSelect(item.key)\"\n >\n <C_Icon\n v-if=\"showIcon\"\n :name=\"item.icon\"\n :size=\"iconSize\"\n />\n {{ item.label }}\n </span>\n </NBreadcrumbItem>\n </NBreadcrumb>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { useRoute } from 'vue-router'\n import { C_Icon } from '../C_Icon'\n import type { BreadcrumbItem } from '../_shared'\n\n defineOptions({ name: 'C_Breadcrumb' })\n\n const props = withDefaults(\n defineProps<{\n /**\n * 手动传入面包屑数据\n * 不传时自动从 `route.matched` 生成(零配置)\n */\n items?: BreadcrumbItem[]\n /** 是否显示图标 */\n showIcon?: boolean\n /** 图标大小 (px),默认 16 */\n iconSize?: number\n /**\n * 标签文本格式化函数(用于 i18n)\n * 仅在自动模式下生效\n */\n labelFormatter?: (label: string) => string\n }>(),\n {\n showIcon: true,\n iconSize: 16,\n }\n )\n\n const emit = defineEmits<{\n /** 面包屑项被选中(返回路径 key) */\n select: [path: string]\n }>()\n\n const route = useRoute()\n\n const formatLabel = (title: string): string =>\n props.labelFormatter ? props.labelFormatter(title) : title\n\n /** 从 route.matched 自动生成面包屑 */\n const autoBreadcrumb = computed<BreadcrumbItem[]>(() => {\n return route.matched\n .filter((record: any) => record.meta?.title)\n .map((record: any) => ({\n key: record.path,\n label: formatLabel((record.meta.title || '') as string),\n icon: record.meta.icon as string | undefined,\n children: record.children?.length\n ? record.children.map((child: any) => ({\n key: child.path,\n label: formatLabel((child.meta?.title || '') as string),\n ...(child.children?.length && {\n children: child.children.map((grandChild: any) => ({\n key: grandChild.path,\n label: formatLabel((grandChild.meta?.title || '') as string),\n })),\n }),\n }))\n : [],\n }))\n })\n\n const breadcrumbItems = computed<BreadcrumbItem[]>(\n () => props.items ?? autoBreadcrumb.value\n )\n\n const handleSelect = (key: string) => {\n emit('select', key)\n }\n</script>\n\n<style lang=\"scss\">\n .c-breadcrumb {\n // 暴露 CSS 变量,方便主项目覆盖\n --c-breadcrumb-icon-size: 16px;\n --c-breadcrumb-gap: 4px;\n --c-breadcrumb-font-size: inherit;\n\n display: flex;\n align-items: center;\n height: 100%;\n\n &__trigger,\n &__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\n // 确保 C_Icon 在面包屑中尺寸一致\n .c-icon {\n flex-shrink: 0;\n }\n\n // 修复分隔符 \"/\" 与文本/图标垂直居中对齐\n // 原因:Naive UI 分隔符默认 line-height (~1.4) 导致 \"/\" 基线偏低\n .n-breadcrumb-item {\n display: inline-flex !important;\n align-items: center;\n\n .n-breadcrumb-item__separator {\n display: inline-flex;\n align-items: center;\n line-height: 1;\n margin-top: -4px;\n }\n }\n }\n</style>\n","/* unplugin-vue-components disabled */<!--\n * @Description: 通用面包屑组件 — 基于 NBreadcrumb 的路由面包屑导航\n *\n * 支持两种模式:\n * 1. 自动模式(默认)— 从 `route.matched` 自动生成面包屑\n * 2. 手动模式 — 传入 `items` 完全自定义\n *\n * @example 自动模式(零配置)\n * ```vue\n * <C_Breadcrumb\n * :label-formatter=\"$t\"\n * @select=\"router.push\"\n * />\n * ```\n *\n * @example 手动模式\n * ```vue\n * <C_Breadcrumb\n * :items=\"customBreadcrumbs\"\n * @select=\"handleSelect\"\n * />\n * ```\n *\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <div\n class=\"c-breadcrumb flex-1 min-w-0\"\n :style=\"{\n '--c-breadcrumb-icon-size': `${iconSize}px`,\n '--c-breadcrumb-gap': `${Math.max(Math.round(iconSize / 4), 2)}px`,\n }\"\n >\n <NBreadcrumb>\n <NBreadcrumbItem\n v-for=\"(item, index) in breadcrumbItems\"\n :key=\"index\"\n >\n <NDropdown\n v-if=\"item.children?.length\"\n :options=\"item.children\"\n @select=\"handleSelect\"\n >\n <div class=\"c-breadcrumb__trigger\">\n <C_Icon\n v-if=\"showIcon\"\n :name=\"item.icon\"\n :size=\"iconSize\"\n />\n {{ item.label }}\n </div>\n </NDropdown>\n <span\n v-else\n class=\"c-breadcrumb__link\"\n @click=\"handleSelect(item.key)\"\n >\n <C_Icon\n v-if=\"showIcon\"\n :name=\"item.icon\"\n :size=\"iconSize\"\n />\n {{ item.label }}\n </span>\n </NBreadcrumbItem>\n </NBreadcrumb>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { useRoute } from 'vue-router'\n import { C_Icon } from '../C_Icon'\n import type { BreadcrumbItem } from '../_shared'\n\n defineOptions({ name: 'C_Breadcrumb' })\n\n const props = withDefaults(\n defineProps<{\n /**\n * 手动传入面包屑数据\n * 不传时自动从 `route.matched` 生成(零配置)\n */\n items?: BreadcrumbItem[]\n /** 是否显示图标 */\n showIcon?: boolean\n /** 图标大小 (px),默认 16 */\n iconSize?: number\n /**\n * 标签文本格式化函数(用于 i18n)\n * 仅在自动模式下生效\n */\n labelFormatter?: (label: string) => string\n }>(),\n {\n showIcon: true,\n iconSize: 16,\n }\n )\n\n const emit = defineEmits<{\n /** 面包屑项被选中(返回路径 key) */\n select: [path: string]\n }>()\n\n const route = useRoute()\n\n const formatLabel = (title: string): string =>\n props.labelFormatter ? props.labelFormatter(title) : title\n\n /** 从 route.matched 自动生成面包屑 */\n const autoBreadcrumb = computed<BreadcrumbItem[]>(() => {\n return route.matched\n .filter((record: any) => record.meta?.title)\n .map((record: any) => ({\n key: record.path,\n label: formatLabel((record.meta.title || '') as string),\n icon: record.meta.icon as string | undefined,\n children: record.children?.length\n ? record.children.map((child: any) => ({\n key: child.path,\n label: formatLabel((child.meta?.title || '') as string),\n ...(child.children?.length && {\n children: child.children.map((grandChild: any) => ({\n key: grandChild.path,\n label: formatLabel((grandChild.meta?.title || '') as string),\n })),\n }),\n }))\n : [],\n }))\n })\n\n const breadcrumbItems = computed<BreadcrumbItem[]>(\n () => props.items ?? autoBreadcrumb.value\n )\n\n const handleSelect = (key: string) => {\n emit('select', key)\n }\n</script>\n\n<style lang=\"scss\">\n .c-breadcrumb {\n // 暴露 CSS 变量,方便主项目覆盖\n --c-breadcrumb-icon-size: 16px;\n --c-breadcrumb-gap: 4px;\n --c-breadcrumb-font-size: inherit;\n\n display: flex;\n align-items: center;\n height: 100%;\n\n &__trigger,\n &__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\n // 确保 C_Icon 在面包屑中尺寸一致\n .c-icon {\n flex-shrink: 0;\n }\n\n // 修复分隔符 \"/\" 与文本/图标垂直居中对齐\n // 原因:Naive UI 分隔符默认 line-height (~1.4) 导致 \"/\" 基线偏低\n .n-breadcrumb-item {\n display: inline-flex !important;\n align-items: center;\n\n .n-breadcrumb-item__separator {\n display: inline-flex;\n align-items: center;\n line-height: 1;\n margin-top: -4px;\n }\n }\n }\n</style>\n","<!--\n * @Description: 通用面包屑组件 — 基于 NBreadcrumb 的路由面包屑导航\n *\n * 支持两种模式:\n * 1. 自动模式(默认)— 从 `route.matched` 自动生成面包屑\n * 2. 手动模式 — 传入 `items` 完全自定义\n *\n * @example 自动模式(零配置)\n * ```vue\n * <C_Breadcrumb\n * :label-formatter=\"$t\"\n * @select=\"router.push\"\n * />\n * ```\n *\n * @example 手动模式\n * ```vue\n * <C_Breadcrumb\n * :items=\"customBreadcrumbs\"\n * @select=\"handleSelect\"\n * />\n * ```\n *\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <div\n class=\"c-breadcrumb flex-1 min-w-0\"\n :style=\"{\n '--c-breadcrumb-icon-size': `${iconSize}px`,\n '--c-breadcrumb-gap': `${Math.max(Math.round(iconSize / 4), 2)}px`,\n }\"\n >\n <NBreadcrumb>\n <NBreadcrumbItem\n v-for=\"(item, index) in breadcrumbItems\"\n :key=\"index\"\n >\n <NDropdown\n v-if=\"item.children?.length\"\n :options=\"item.children\"\n @select=\"handleSelect\"\n >\n <div class=\"c-breadcrumb__trigger\">\n <C_Icon\n v-if=\"showIcon\"\n :name=\"item.icon\"\n :size=\"iconSize\"\n />\n {{ item.label }}\n </div>\n </NDropdown>\n <span\n v-else\n class=\"c-breadcrumb__link\"\n @click=\"handleSelect(item.key)\"\n >\n <C_Icon\n v-if=\"showIcon\"\n :name=\"item.icon\"\n :size=\"iconSize\"\n />\n {{ item.label }}\n </span>\n </NBreadcrumbItem>\n </NBreadcrumb>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { computed } from 'vue'\n import { useRoute } from 'vue-router'\n import { C_Icon } from '../C_Icon'\n import type { BreadcrumbItem } from '../_shared'\n\n defineOptions({ name: 'C_Breadcrumb' })\n\n const props = withDefaults(\n defineProps<{\n /**\n * 手动传入面包屑数据\n * 不传时自动从 `route.matched` 生成(零配置)\n */\n items?: BreadcrumbItem[]\n /** 是否显示图标 */\n showIcon?: boolean\n /** 图标大小 (px),默认 16 */\n iconSize?: number\n /**\n * 标签文本格式化函数(用于 i18n)\n * 仅在自动模式下生效\n */\n labelFormatter?: (label: string) => string\n }>(),\n {\n showIcon: true,\n iconSize: 16,\n }\n )\n\n const emit = defineEmits<{\n /** 面包屑项被选中(返回路径 key) */\n select: [path: string]\n }>()\n\n const route = useRoute()\n\n const formatLabel = (title: string): string =>\n props.labelFormatter ? props.labelFormatter(title) : title\n\n /** 从 route.matched 自动生成面包屑 */\n const autoBreadcrumb = computed<BreadcrumbItem[]>(() => {\n return route.matched\n .filter((record: any) => record.meta?.title)\n .map((record: any) => ({\n key: record.path,\n label: formatLabel((record.meta.title || '') as string),\n icon: record.meta.icon as string | undefined,\n children: record.children?.length\n ? record.children.map((child: any) => ({\n key: child.path,\n label: formatLabel((child.meta?.title || '') as string),\n ...(child.children?.length && {\n children: child.children.map((grandChild: any) => ({\n key: grandChild.path,\n label: formatLabel((grandChild.meta?.title || '') as string),\n })),\n }),\n }))\n : [],\n }))\n })\n\n const breadcrumbItems = computed<BreadcrumbItem[]>(\n () => props.items ?? autoBreadcrumb.value\n )\n\n const handleSelect = (key: string) => {\n emit('select', key)\n }\n</script>\n\n<style lang=\"scss\">\n .c-breadcrumb {\n // 暴露 CSS 变量,方便主项目覆盖\n --c-breadcrumb-icon-size: 16px;\n --c-breadcrumb-gap: 4px;\n --c-breadcrumb-font-size: inherit;\n\n display: flex;\n align-items: center;\n height: 100%;\n\n &__trigger,\n &__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\n // 确保 C_Icon 在面包屑中尺寸一致\n .c-icon {\n flex-shrink: 0;\n }\n\n // 修复分隔符 \"/\" 与文本/图标垂直居中对齐\n // 原因:Naive UI 分隔符默认 line-height (~1.4) 导致 \"/\" 基线偏低\n .n-breadcrumb-item {\n display: inline-flex !important;\n align-items: center;\n\n .n-breadcrumb-item__separator {\n display: inline-flex;\n align-items: center;\n line-height: 1;\n margin-top: -4px;\n }\n }\n }\n</style>\n"],"mappings":"6WE6EE,IAAM,EAAQ,EAuBR,EAAO,EAKP,GAAA,EAAA,EAAA,WAAiB,CAEjB,EAAe,GACnB,EAAM,eAAiB,EAAM,eAAe,EAAM,CAAG,EAGjD,GAAA,EAAA,EAAA,cACG,EAAM,QACV,OAAQ,GAAgB,EAAO,MAAM,MAAK,CAC1C,IAAK,IAAiB,CACrB,IAAK,EAAO,KACZ,MAAO,EAAa,EAAO,KAAK,OAAS,GAAc,CACvD,KAAM,EAAO,KAAK,KAClB,SAAU,EAAO,UAAU,OACvB,EAAO,SAAS,IAAK,IAAgB,CACnC,IAAK,EAAM,KACX,MAAO,EAAa,EAAM,MAAM,OAAS,GAAc,CACvD,GAAI,EAAM,UAAU,QAAU,CAC5B,SAAU,EAAM,SAAS,IAAK,IAAqB,CACjD,IAAK,EAAW,KAChB,MAAO,EAAa,EAAW,MAAM,OAAS,GAAc,CAC7D,EAAE,CACJ,CACF,EAAC,CACF,EAAE,CACP,EAAC,CACL,CAEK,GAAA,EAAA,EAAA,cACE,EAAM,OAAS,EAAe,MACtC,CAEM,EAAgB,GAAgB,CACpC,EAAK,SAAU,EAAG,uHAxEd,MAAA,CAvCJ,MAAM,8BACL,OAAA,EAAA,EAAA,gBAAK,+BAAyCA,EAAAA,SAAQ,4BAAqC,KAAK,IAAI,KAAK,MAAMA,EAAAA,SAAQ,EAAA,CAAA,EAAA,CAAA,0BAqC1G,EAAA,KAAA,2BA9B8B,GAAA,EAAA,EAAA,WAAA,GAAA,EAAA,EAAA,EAAA,oBA6BxB,EAAA,SAAA,MAAA,EAAA,EAAA,YA7BQ,EAAA,OAAhB,EAAM,yCA6BE,EAAA,CA5Bf,IAAK,EAAK,CAAA,2BAkBb,CAfU,EAAK,UAAU,SAAA,EAAA,EAAA,YAAA,EAAA,EAAA,EAAA,aAYX,EAAA,OAXT,QAAS,EAAK,SACd,SAAQ,8BASH,EAAA,EAAA,EAAA,oBAAA,MAPN,EAOM,CALIC,EAAAA,WAAAA,EAAAA,EAAAA,YAAAA,EAAAA,EAAAA,EAAAA,cAAAA,EAAAA,EAAAA,OAGN,EAAA,EAAA,CAAA,OAFC,KAAM,EAAK,KACX,KAAMD,EAAAA,6FACP,KAAA,EAAA,EAAA,iBACC,EAAK,MAAK,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,qEAcV,OAAA,OATL,MAAM,qBACL,QAAK,GAAE,EAAa,EAAK,IAAG,GAGrBC,EAAAA,WAAAA,EAAAA,EAAAA,YAAAA,EAAAA,EAAAA,EAAAA,cAAAA,EAAAA,EAAAA,OAGN,EAAA,EAAA,CAAA,OAFC,KAAM,EAAK,KACX,KAAMD,EAAAA,6FACP,KAAA,EAAA,EAAA,iBACC,EAAK,MAAK,CAAA,EAAA,CAAA,CAAA,EAAA,EAAA,EAAA,CAAA"}
1
+ {"version":3,"file":"C_Breadcrumb.js","names":["iconSize","showIcon"],"sources":["../src/components/C_Breadcrumb/index.vue","../src/components/C_Breadcrumb/index.vue","../src/components/C_Breadcrumb/index.vue"],"sourcesContent":["/* unplugin-vue-components disabled */<!--\r\n * @Description: 通用面包屑组件 — 基于 NBreadcrumb 的路由面包屑导航\r\n *\r\n * 支持两种模式:\r\n * 1. 自动模式(默认)— 从 `route.matched` 自动生成面包屑\r\n * 2. 手动模式 — 传入 `items` 完全自定义\r\n *\r\n * @example 自动模式(零配置)\r\n * ```vue\r\n * <C_Breadcrumb\r\n * :label-formatter=\"$t\"\r\n * @select=\"router.push\"\r\n * />\r\n * ```\r\n *\r\n * @example 手动模式\r\n * ```vue\r\n * <C_Breadcrumb\r\n * :items=\"customBreadcrumbs\"\r\n * @select=\"handleSelect\"\r\n * />\r\n * ```\r\n *\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n class=\"c-breadcrumb flex-1 min-w-0\"\r\n :style=\"{\r\n '--c-breadcrumb-icon-size': `${iconSize}px`,\r\n '--c-breadcrumb-gap': `${Math.max(Math.round(iconSize / 4), 2)}px`,\r\n }\"\r\n >\r\n <NBreadcrumb>\r\n <NBreadcrumbItem\r\n v-for=\"(item, index) in breadcrumbItems\"\r\n :key=\"index\"\r\n >\r\n <NDropdown\r\n v-if=\"item.children?.length\"\r\n :options=\"item.children\"\r\n @select=\"handleSelect\"\r\n >\r\n <div class=\"c-breadcrumb__trigger\">\r\n <C_Icon\r\n v-if=\"showIcon\"\r\n :name=\"item.icon\"\r\n :size=\"iconSize\"\r\n />\r\n {{ item.label }}\r\n </div>\r\n </NDropdown>\r\n <span\r\n v-else\r\n class=\"c-breadcrumb__link\"\r\n @click=\"handleSelect(item.key)\"\r\n >\r\n <C_Icon\r\n v-if=\"showIcon\"\r\n :name=\"item.icon\"\r\n :size=\"iconSize\"\r\n />\r\n {{ item.label }}\r\n </span>\r\n </NBreadcrumbItem>\r\n </NBreadcrumb>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { computed } from 'vue'\r\n import { useRoute } from 'vue-router'\r\n import { C_Icon } from '../C_Icon'\r\n import type { BreadcrumbItem } from '../_shared'\r\n\r\n defineOptions({ name: 'C_Breadcrumb' })\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n /**\r\n * 手动传入面包屑数据\r\n * 不传时自动从 `route.matched` 生成(零配置)\r\n */\r\n items?: BreadcrumbItem[]\r\n /** 是否显示图标 */\r\n showIcon?: boolean\r\n /** 图标大小 (px),默认 16 */\r\n iconSize?: number\r\n /**\r\n * 标签文本格式化函数(用于 i18n)\r\n * 仅在自动模式下生效\r\n */\r\n labelFormatter?: (label: string) => string\r\n }>(),\r\n {\r\n showIcon: true,\r\n iconSize: 16,\r\n }\r\n )\r\n\r\n const emit = defineEmits<{\r\n /** 面包屑项被选中(返回路径 key) */\r\n select: [path: string]\r\n }>()\r\n\r\n const route = useRoute()\r\n\r\n const formatLabel = (title: string): string =>\r\n props.labelFormatter ? props.labelFormatter(title) : title\r\n\r\n /** 从 route.matched 自动生成面包屑 */\r\n const autoBreadcrumb = computed<BreadcrumbItem[]>(() => {\r\n return route.matched\r\n .filter((record: any) => record.meta?.title)\r\n .map((record: any) => ({\r\n key: record.path,\r\n label: formatLabel((record.meta.title || '') as string),\r\n icon: record.meta.icon as string | undefined,\r\n children: record.children?.length\r\n ? record.children.map((child: any) => ({\r\n key: child.path,\r\n label: formatLabel((child.meta?.title || '') as string),\r\n ...(child.children?.length && {\r\n children: child.children.map((grandChild: any) => ({\r\n key: grandChild.path,\r\n label: formatLabel((grandChild.meta?.title || '') as string),\r\n })),\r\n }),\r\n }))\r\n : [],\r\n }))\r\n })\r\n\r\n const breadcrumbItems = computed<BreadcrumbItem[]>(\r\n () => props.items ?? autoBreadcrumb.value\r\n )\r\n\r\n const handleSelect = (key: string) => {\r\n emit('select', key)\r\n }\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n .c-breadcrumb {\r\n // 暴露 CSS 变量,方便主项目覆盖\r\n --c-breadcrumb-icon-size: 16px;\r\n --c-breadcrumb-gap: 4px;\r\n --c-breadcrumb-font-size: inherit;\r\n\r\n display: flex;\r\n align-items: center;\r\n height: 100%;\r\n\r\n &__trigger,\r\n &__link {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--c-breadcrumb-gap);\r\n font-size: var(--c-breadcrumb-font-size);\r\n line-height: 1;\r\n cursor: pointer;\r\n }\r\n\r\n // 确保 C_Icon 在面包屑中尺寸一致\r\n .c-icon {\r\n flex-shrink: 0;\r\n }\r\n\r\n // 修复分隔符 \"/\" 与文本/图标垂直居中对齐\r\n // 原因:Naive UI 分隔符默认 line-height (~1.4) 导致 \"/\" 基线偏低\r\n .n-breadcrumb-item {\r\n display: inline-flex !important;\r\n align-items: center;\r\n\r\n .n-breadcrumb-item__separator {\r\n display: inline-flex;\r\n align-items: center;\r\n line-height: 1;\r\n margin-top: -4px;\r\n }\r\n }\r\n }\r\n</style>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Description: 通用面包屑组件 — 基于 NBreadcrumb 的路由面包屑导航\r\n *\r\n * 支持两种模式:\r\n * 1. 自动模式(默认)— 从 `route.matched` 自动生成面包屑\r\n * 2. 手动模式 — 传入 `items` 完全自定义\r\n *\r\n * @example 自动模式(零配置)\r\n * ```vue\r\n * <C_Breadcrumb\r\n * :label-formatter=\"$t\"\r\n * @select=\"router.push\"\r\n * />\r\n * ```\r\n *\r\n * @example 手动模式\r\n * ```vue\r\n * <C_Breadcrumb\r\n * :items=\"customBreadcrumbs\"\r\n * @select=\"handleSelect\"\r\n * />\r\n * ```\r\n *\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n class=\"c-breadcrumb flex-1 min-w-0\"\r\n :style=\"{\r\n '--c-breadcrumb-icon-size': `${iconSize}px`,\r\n '--c-breadcrumb-gap': `${Math.max(Math.round(iconSize / 4), 2)}px`,\r\n }\"\r\n >\r\n <NBreadcrumb>\r\n <NBreadcrumbItem\r\n v-for=\"(item, index) in breadcrumbItems\"\r\n :key=\"index\"\r\n >\r\n <NDropdown\r\n v-if=\"item.children?.length\"\r\n :options=\"item.children\"\r\n @select=\"handleSelect\"\r\n >\r\n <div class=\"c-breadcrumb__trigger\">\r\n <C_Icon\r\n v-if=\"showIcon\"\r\n :name=\"item.icon\"\r\n :size=\"iconSize\"\r\n />\r\n {{ item.label }}\r\n </div>\r\n </NDropdown>\r\n <span\r\n v-else\r\n class=\"c-breadcrumb__link\"\r\n @click=\"handleSelect(item.key)\"\r\n >\r\n <C_Icon\r\n v-if=\"showIcon\"\r\n :name=\"item.icon\"\r\n :size=\"iconSize\"\r\n />\r\n {{ item.label }}\r\n </span>\r\n </NBreadcrumbItem>\r\n </NBreadcrumb>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { computed } from 'vue'\r\n import { useRoute } from 'vue-router'\r\n import { C_Icon } from '../C_Icon'\r\n import type { BreadcrumbItem } from '../_shared'\r\n\r\n defineOptions({ name: 'C_Breadcrumb' })\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n /**\r\n * 手动传入面包屑数据\r\n * 不传时自动从 `route.matched` 生成(零配置)\r\n */\r\n items?: BreadcrumbItem[]\r\n /** 是否显示图标 */\r\n showIcon?: boolean\r\n /** 图标大小 (px),默认 16 */\r\n iconSize?: number\r\n /**\r\n * 标签文本格式化函数(用于 i18n)\r\n * 仅在自动模式下生效\r\n */\r\n labelFormatter?: (label: string) => string\r\n }>(),\r\n {\r\n showIcon: true,\r\n iconSize: 16,\r\n }\r\n )\r\n\r\n const emit = defineEmits<{\r\n /** 面包屑项被选中(返回路径 key) */\r\n select: [path: string]\r\n }>()\r\n\r\n const route = useRoute()\r\n\r\n const formatLabel = (title: string): string =>\r\n props.labelFormatter ? props.labelFormatter(title) : title\r\n\r\n /** 从 route.matched 自动生成面包屑 */\r\n const autoBreadcrumb = computed<BreadcrumbItem[]>(() => {\r\n return route.matched\r\n .filter((record: any) => record.meta?.title)\r\n .map((record: any) => ({\r\n key: record.path,\r\n label: formatLabel((record.meta.title || '') as string),\r\n icon: record.meta.icon as string | undefined,\r\n children: record.children?.length\r\n ? record.children.map((child: any) => ({\r\n key: child.path,\r\n label: formatLabel((child.meta?.title || '') as string),\r\n ...(child.children?.length && {\r\n children: child.children.map((grandChild: any) => ({\r\n key: grandChild.path,\r\n label: formatLabel((grandChild.meta?.title || '') as string),\r\n })),\r\n }),\r\n }))\r\n : [],\r\n }))\r\n })\r\n\r\n const breadcrumbItems = computed<BreadcrumbItem[]>(\r\n () => props.items ?? autoBreadcrumb.value\r\n )\r\n\r\n const handleSelect = (key: string) => {\r\n emit('select', key)\r\n }\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n .c-breadcrumb {\r\n // 暴露 CSS 变量,方便主项目覆盖\r\n --c-breadcrumb-icon-size: 16px;\r\n --c-breadcrumb-gap: 4px;\r\n --c-breadcrumb-font-size: inherit;\r\n\r\n display: flex;\r\n align-items: center;\r\n height: 100%;\r\n\r\n &__trigger,\r\n &__link {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--c-breadcrumb-gap);\r\n font-size: var(--c-breadcrumb-font-size);\r\n line-height: 1;\r\n cursor: pointer;\r\n }\r\n\r\n // 确保 C_Icon 在面包屑中尺寸一致\r\n .c-icon {\r\n flex-shrink: 0;\r\n }\r\n\r\n // 修复分隔符 \"/\" 与文本/图标垂直居中对齐\r\n // 原因:Naive UI 分隔符默认 line-height (~1.4) 导致 \"/\" 基线偏低\r\n .n-breadcrumb-item {\r\n display: inline-flex !important;\r\n align-items: center;\r\n\r\n .n-breadcrumb-item__separator {\r\n display: inline-flex;\r\n align-items: center;\r\n line-height: 1;\r\n margin-top: -4px;\r\n }\r\n }\r\n }\r\n</style>\r\n","<!--\r\n * @Description: 通用面包屑组件 — 基于 NBreadcrumb 的路由面包屑导航\r\n *\r\n * 支持两种模式:\r\n * 1. 自动模式(默认)— 从 `route.matched` 自动生成面包屑\r\n * 2. 手动模式 — 传入 `items` 完全自定义\r\n *\r\n * @example 自动模式(零配置)\r\n * ```vue\r\n * <C_Breadcrumb\r\n * :label-formatter=\"$t\"\r\n * @select=\"router.push\"\r\n * />\r\n * ```\r\n *\r\n * @example 手动模式\r\n * ```vue\r\n * <C_Breadcrumb\r\n * :items=\"customBreadcrumbs\"\r\n * @select=\"handleSelect\"\r\n * />\r\n * ```\r\n *\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <div\r\n class=\"c-breadcrumb flex-1 min-w-0\"\r\n :style=\"{\r\n '--c-breadcrumb-icon-size': `${iconSize}px`,\r\n '--c-breadcrumb-gap': `${Math.max(Math.round(iconSize / 4), 2)}px`,\r\n }\"\r\n >\r\n <NBreadcrumb>\r\n <NBreadcrumbItem\r\n v-for=\"(item, index) in breadcrumbItems\"\r\n :key=\"index\"\r\n >\r\n <NDropdown\r\n v-if=\"item.children?.length\"\r\n :options=\"item.children\"\r\n @select=\"handleSelect\"\r\n >\r\n <div class=\"c-breadcrumb__trigger\">\r\n <C_Icon\r\n v-if=\"showIcon\"\r\n :name=\"item.icon\"\r\n :size=\"iconSize\"\r\n />\r\n {{ item.label }}\r\n </div>\r\n </NDropdown>\r\n <span\r\n v-else\r\n class=\"c-breadcrumb__link\"\r\n @click=\"handleSelect(item.key)\"\r\n >\r\n <C_Icon\r\n v-if=\"showIcon\"\r\n :name=\"item.icon\"\r\n :size=\"iconSize\"\r\n />\r\n {{ item.label }}\r\n </span>\r\n </NBreadcrumbItem>\r\n </NBreadcrumb>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { computed } from 'vue'\r\n import { useRoute } from 'vue-router'\r\n import { C_Icon } from '../C_Icon'\r\n import type { BreadcrumbItem } from '../_shared'\r\n\r\n defineOptions({ name: 'C_Breadcrumb' })\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n /**\r\n * 手动传入面包屑数据\r\n * 不传时自动从 `route.matched` 生成(零配置)\r\n */\r\n items?: BreadcrumbItem[]\r\n /** 是否显示图标 */\r\n showIcon?: boolean\r\n /** 图标大小 (px),默认 16 */\r\n iconSize?: number\r\n /**\r\n * 标签文本格式化函数(用于 i18n)\r\n * 仅在自动模式下生效\r\n */\r\n labelFormatter?: (label: string) => string\r\n }>(),\r\n {\r\n showIcon: true,\r\n iconSize: 16,\r\n }\r\n )\r\n\r\n const emit = defineEmits<{\r\n /** 面包屑项被选中(返回路径 key) */\r\n select: [path: string]\r\n }>()\r\n\r\n const route = useRoute()\r\n\r\n const formatLabel = (title: string): string =>\r\n props.labelFormatter ? props.labelFormatter(title) : title\r\n\r\n /** 从 route.matched 自动生成面包屑 */\r\n const autoBreadcrumb = computed<BreadcrumbItem[]>(() => {\r\n return route.matched\r\n .filter((record: any) => record.meta?.title)\r\n .map((record: any) => ({\r\n key: record.path,\r\n label: formatLabel((record.meta.title || '') as string),\r\n icon: record.meta.icon as string | undefined,\r\n children: record.children?.length\r\n ? record.children.map((child: any) => ({\r\n key: child.path,\r\n label: formatLabel((child.meta?.title || '') as string),\r\n ...(child.children?.length && {\r\n children: child.children.map((grandChild: any) => ({\r\n key: grandChild.path,\r\n label: formatLabel((grandChild.meta?.title || '') as string),\r\n })),\r\n }),\r\n }))\r\n : [],\r\n }))\r\n })\r\n\r\n const breadcrumbItems = computed<BreadcrumbItem[]>(\r\n () => props.items ?? autoBreadcrumb.value\r\n )\r\n\r\n const handleSelect = (key: string) => {\r\n emit('select', key)\r\n }\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n .c-breadcrumb {\r\n // 暴露 CSS 变量,方便主项目覆盖\r\n --c-breadcrumb-icon-size: 16px;\r\n --c-breadcrumb-gap: 4px;\r\n --c-breadcrumb-font-size: inherit;\r\n\r\n display: flex;\r\n align-items: center;\r\n height: 100%;\r\n\r\n &__trigger,\r\n &__link {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: var(--c-breadcrumb-gap);\r\n font-size: var(--c-breadcrumb-font-size);\r\n line-height: 1;\r\n cursor: pointer;\r\n }\r\n\r\n // 确保 C_Icon 在面包屑中尺寸一致\r\n .c-icon {\r\n flex-shrink: 0;\r\n }\r\n\r\n // 修复分隔符 \"/\" 与文本/图标垂直居中对齐\r\n // 原因:Naive UI 分隔符默认 line-height (~1.4) 导致 \"/\" 基线偏低\r\n .n-breadcrumb-item {\r\n display: inline-flex !important;\r\n align-items: center;\r\n\r\n .n-breadcrumb-item__separator {\r\n display: inline-flex;\r\n align-items: center;\r\n line-height: 1;\r\n margin-top: -4px;\r\n }\r\n }\r\n }\r\n</style>\r\n"],"mappings":"6WE6EE,IAAM,EAAQ,EAuBR,EAAO,EAKP,GAAA,EAAA,EAAA,WAAkB,CAElB,EAAe,GACnB,EAAM,eAAiB,EAAM,eAAe,EAAM,CAAG,EAGjD,GAAA,EAAA,EAAA,cACG,EAAM,QACV,OAAQ,GAAgB,EAAO,MAAM,MAAM,CAC3C,IAAK,IAAiB,CACrB,IAAK,EAAO,KACZ,MAAO,EAAa,EAAO,KAAK,OAAS,GAAc,CACvD,KAAM,EAAO,KAAK,KAClB,SAAU,EAAO,UAAU,OACvB,EAAO,SAAS,IAAK,IAAgB,CACnC,IAAK,EAAM,KACX,MAAO,EAAa,EAAM,MAAM,OAAS,GAAc,CACvD,GAAI,EAAM,UAAU,QAAU,CAC5B,SAAU,EAAM,SAAS,IAAK,IAAqB,CACjD,IAAK,EAAW,KAChB,MAAO,EAAa,EAAW,MAAM,OAAS,GAAc,CAC7D,EAAE,CACJ,CACF,EAAE,CACH,EAAE,CACP,EAAE,CACL,CAEI,GAAA,EAAA,EAAA,cACE,EAAM,OAAS,EAAe,MACrC,CAEK,EAAgB,GAAgB,CACpC,EAAK,SAAU,EAAI,uHAxEf,MAAA,CAvCJ,MAAM,8BACL,OAAA,EAAA,EAAA,gBAAK,+BAA0CA,EAAAA,SAAQ,4BAAsC,KAAK,IAAI,KAAK,MAAMA,EAAAA,SAAQ,EAAA,CAAA,EAAA,CAAA,0BAqC5G,EAAA,KAAA,2BA9B8B,GAAA,EAAA,EAAA,WAAA,GAAA,EAAA,EAAA,EAAA,oBA6BxB,EAAA,SAAA,MAAA,EAAA,EAAA,YA7BQ,EAAA,OAAhB,EAAM,yCA6BE,EAAA,CA5Bf,IAAK,EAAK,CAAA,2BAkBhB,CAfa,EAAK,UAAU,SAAA,EAAA,EAAA,YAAA,EAAA,EAAA,EAAA,aAYX,EAAA,OAXT,QAAS,EAAK,SACd,SAAQ,8BASH,EAAA,EAAA,EAAA,oBAAA,MAPN,EAOM,CALIC,EAAAA,WAAAA,EAAAA,EAAAA,YAAAA,EAAAA,EAAAA,EAAAA,cAAAA,EAAAA,EAAAA,OAGN,EAAA,EAAA,CAAA,OAFC,KAAM,EAAK,KACX,KAAMD,EAAAA,6FACP,KAAA,EAAA,EAAA,iBACC,EAAK,MAAK,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,qEAcV,OAAA,OATL,MAAM,qBACL,QAAK,GAAE,EAAa,EAAK,IAAG,GAGrBC,EAAAA,WAAAA,EAAAA,EAAAA,YAAAA,EAAAA,EAAAA,EAAAA,cAAAA,EAAAA,EAAAA,OAGN,EAAA,EAAA,CAAA,OAFC,KAAM,EAAK,KACX,KAAMD,EAAAA,6FACP,KAAA,EAAA,EAAA,iBACC,EAAK,MAAK,CAAA,EAAA,CAAA,CAAA,EAAA,EAAA,EAAA,CAAA"}