@robot-admin/naive-ui-components 0.9.1 → 0.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (327) hide show
  1. package/dist/C_ActionBar-BAcfOfRw.css.map +1 -0
  2. package/dist/C_ActionBar-DG2HW7t5.css.map +1 -0
  3. package/dist/C_ActionBar.css +47 -47
  4. package/dist/C_ActionBar.js.map +1 -1
  5. package/dist/C_ActionBar2.js +1 -1
  6. package/dist/C_ActionBar2.js.map +1 -1
  7. package/dist/{C_AntV-BY8jqqmi.css.map → C_AntV-D_jTK8oZ.css.map} +1 -1
  8. package/dist/{C_AntV-BbkHc-_a.css.map → C_AntV-DanTAq22.css.map} +1 -1
  9. package/dist/C_AntV.css +79 -79
  10. package/dist/C_AntV.js.map +1 -1
  11. package/dist/C_AntV2.js +3 -3
  12. package/dist/C_AntV2.js.map +1 -1
  13. package/dist/{C_AudioPlayer-DKRIGhi7.css.map → C_AudioPlayer-BnYIJXPD.css.map} +1 -1
  14. package/dist/{C_AudioPlayer-DlB6eNsa.css.map → C_AudioPlayer-ldTy9Y34.css.map} +1 -1
  15. package/dist/C_AudioPlayer.css +47 -47
  16. package/dist/C_AudioPlayer.js.map +1 -1
  17. package/dist/C_AudioPlayer2.js +1 -1
  18. package/dist/C_AudioPlayer2.js.map +1 -1
  19. package/dist/{C_AvatarGroup-D02zci-i.css.map → C_AvatarGroup-B9d-GJ9c.css.map} +1 -1
  20. package/dist/{C_AvatarGroup-DatHaUlY.css.map → C_AvatarGroup-SIzxuuZr.css.map} +1 -1
  21. package/dist/C_AvatarGroup.css +21 -21
  22. package/dist/C_AvatarGroup.js.map +1 -1
  23. package/dist/C_AvatarGroup2.js +1 -1
  24. package/dist/C_AvatarGroup2.js.map +1 -1
  25. package/dist/{C_Barcode-DYDRDe2O.css.map → C_Barcode-CAU2mFcx.css.map} +1 -1
  26. package/dist/{C_Barcode-muJdc_O4.css.map → C_Barcode-D2oJaEg3.css.map} +1 -1
  27. package/dist/C_Barcode.css +7 -7
  28. package/dist/C_Barcode.js.map +1 -1
  29. package/dist/C_Barcode2.js +1 -1
  30. package/dist/C_Barcode2.js.map +1 -1
  31. package/dist/C_Breadcrumb.js.map +1 -1
  32. package/dist/C_Breadcrumb2.js +1 -1
  33. package/dist/C_Breadcrumb2.js.map +1 -1
  34. package/dist/{C_Captcha-9_hk6VmY.css.map → C_Captcha-B3yrtG7t.css.map} +1 -1
  35. package/dist/{C_Captcha-MtASlJ0f.css.map → C_Captcha-D4hDdWDu.css.map} +1 -1
  36. package/dist/C_Captcha.css +19 -19
  37. package/dist/C_Captcha.js.map +1 -1
  38. package/dist/C_Captcha2.js +1 -1
  39. package/dist/C_Captcha2.js.map +1 -1
  40. package/dist/C_Cascade-BE7t1OX5.css.map +1 -0
  41. package/dist/C_Cascade-CpDiau1y.css.map +1 -0
  42. package/dist/C_Cascade.css +3 -3
  43. package/dist/C_Cascade.js.map +1 -1
  44. package/dist/C_Cascade2.js +1 -1
  45. package/dist/C_Cascade2.js.map +1 -1
  46. package/dist/{C_Chat-Csjz_BFw.css.map → C_Chat-CF1SU7mc.css.map} +1 -1
  47. package/dist/{C_Chat-DO1ZBA_0.css.map → C_Chat-DeUv6uuI.css.map} +1 -1
  48. package/dist/C_Chat.css +65 -65
  49. package/dist/C_Chat.js.map +1 -1
  50. package/dist/C_Chat2.js +1 -1
  51. package/dist/C_Chat2.js.map +1 -1
  52. package/dist/{C_City-Bam08Qv3.css.map → C_City-DdkX6u64.css.map} +1 -1
  53. package/dist/{C_City-Bb3W-KaN.css.map → C_City-iP-dIvui.css.map} +1 -1
  54. package/dist/C_City.css +29 -29
  55. package/dist/C_City.js.map +1 -1
  56. package/dist/C_City2.js +1 -1
  57. package/dist/C_City2.js.map +1 -1
  58. package/dist/C_Code-BWmJMNS7.css.map +1 -0
  59. package/dist/C_Code-k14vjgVl.css.map +1 -0
  60. package/dist/C_Code.css +3 -3
  61. package/dist/C_Code.js.map +1 -1
  62. package/dist/C_Code2.js +1 -1
  63. package/dist/C_Code2.js.map +1 -1
  64. package/dist/{C_CollapsePanel-CWkFCqNQ.css.map → C_CollapsePanel-BSKcWSmY.css.map} +1 -1
  65. package/dist/{C_CollapsePanel-pcVJA_4z.css.map → C_CollapsePanel-DRvRq8tB.css.map} +1 -1
  66. package/dist/C_CollapsePanel.css +35 -35
  67. package/dist/C_CollapsePanel.js.map +1 -1
  68. package/dist/C_CollapsePanel2.js +1 -1
  69. package/dist/C_CollapsePanel2.js.map +1 -1
  70. package/dist/{C_ContextMenu-B3Cgz_wJ.css.map → C_ContextMenu-Bn_uhJSo.css.map} +1 -1
  71. package/dist/{C_ContextMenu-u1LixF3_.css.map → C_ContextMenu-C9iuxG2n.css.map} +1 -1
  72. package/dist/C_ContextMenu.css +17 -17
  73. package/dist/C_ContextMenu.js.map +1 -1
  74. package/dist/C_ContextMenu2.js +1 -1
  75. package/dist/C_ContextMenu2.js.map +1 -1
  76. package/dist/{C_Cron-Civir5-I.css.map → C_Cron-BIQ2By9v.css.map} +1 -1
  77. package/dist/{C_Cron-iw3qpMsy.css.map → C_Cron-BNSAGD6A.css.map} +1 -1
  78. package/dist/C_Cron.css +57 -57
  79. package/dist/C_Cron.js.map +1 -1
  80. package/dist/C_Cron2.js +1 -1
  81. package/dist/C_Cron2.js.map +1 -1
  82. package/dist/C_Date.js.map +1 -1
  83. package/dist/C_Date2.js +1 -1
  84. package/dist/C_Date2.js.map +1 -1
  85. package/dist/{C_Draggable-BCjIvIwT.css.map → C_Draggable-BDAbk4s5.css.map} +1 -1
  86. package/dist/{C_Draggable-DwkSlCOS.css.map → C_Draggable-UhfDLXop.css.map} +1 -1
  87. package/dist/C_Draggable.css +46 -46
  88. package/dist/C_Draggable.js.map +1 -1
  89. package/dist/C_Draggable2.js +1 -1
  90. package/dist/C_Draggable2.js.map +1 -1
  91. package/dist/{C_Editor-BfjjYQ9B.css.map → C_Editor-CZOaChru.css.map} +1 -1
  92. package/dist/{C_Editor-Do2StvoJ.css.map → C_Editor-kJAQq5z6.css.map} +1 -1
  93. package/dist/C_Editor.css +14 -14
  94. package/dist/C_Editor.js.map +1 -1
  95. package/dist/C_Editor2.js +1 -1
  96. package/dist/C_Editor2.js.map +1 -1
  97. package/dist/{C_FilePreview-BhcbiXsV.css.map → C_FilePreview-Bs_omgJS.css.map} +1 -1
  98. package/dist/{C_FilePreview-DJudcIbW.css.map → C_FilePreview-DbwoyF2j.css.map} +1 -1
  99. package/dist/C_FilePreview.css +91 -91
  100. package/dist/C_FilePreview.js.map +1 -1
  101. package/dist/C_FilePreview2.js +1 -1
  102. package/dist/C_FilePreview2.js.map +1 -1
  103. package/dist/{C_Form-BtcAPIRi.css.map → C_Form-SCq-DZaZ.css.map} +1 -1
  104. package/dist/{C_Form-D_gwQ7hC.css.map → C_Form-mcd1nKvF.css.map} +1 -1
  105. package/dist/C_Form.css +223 -223
  106. package/dist/C_Form.js.map +1 -1
  107. package/dist/C_Form2.js +1 -1
  108. package/dist/C_Form2.js.map +1 -1
  109. package/dist/{C_FormSearch-Bi4XYjjk.css.map → C_FormSearch-C3F8peAY.css.map} +1 -1
  110. package/dist/{C_FormSearch-DUGOoX0u.css.map → C_FormSearch-qW56bJPo.css.map} +1 -1
  111. package/dist/C_FormSearch.css +45 -45
  112. package/dist/C_FormSearch.js.map +1 -1
  113. package/dist/C_FormSearch2.js +1 -1
  114. package/dist/C_FormSearch2.js.map +1 -1
  115. package/dist/{C_FormulaEditor-CJk3SSUJ.css.map → C_FormulaEditor-ChOvDbsZ.css.map} +1 -1
  116. package/dist/{C_FormulaEditor-Cy7mjfVO.css.map → C_FormulaEditor-mfiIUDY4.css.map} +1 -1
  117. package/dist/C_FormulaEditor.css +78 -78
  118. package/dist/C_FormulaEditor.js.map +1 -1
  119. package/dist/C_FormulaEditor2.js +1 -1
  120. package/dist/C_FormulaEditor2.js.map +1 -1
  121. package/dist/C_FullCalendar-C2nsqrgS.css.map +1 -0
  122. package/dist/C_FullCalendar-DdFtXVhy.css.map +1 -0
  123. package/dist/C_FullCalendar.css +2 -2
  124. package/dist/C_FullCalendar.js.map +1 -1
  125. package/dist/C_FullCalendar2.js +1 -1
  126. package/dist/C_FullCalendar2.js.map +1 -1
  127. package/dist/{C_GlobalSearch-B6wK3m3k.css.map → C_GlobalSearch-Dq4Wo01K.css.map} +1 -1
  128. package/dist/{C_GlobalSearch-DoPjldFm.css.map → C_GlobalSearch-RB7J43gu.css.map} +1 -1
  129. package/dist/C_GlobalSearch.css +112 -112
  130. package/dist/C_GlobalSearch.js.map +1 -1
  131. package/dist/C_GlobalSearch2.js +1 -1
  132. package/dist/C_GlobalSearch2.js.map +1 -1
  133. package/dist/C_Guide.js.map +1 -1
  134. package/dist/C_Guide2.js +1 -1
  135. package/dist/C_Guide2.js.map +1 -1
  136. package/dist/C_Icon.js.map +1 -1
  137. package/dist/C_Icon2.js.map +1 -1
  138. package/dist/{C_ImageCropper-BqZpkZfU.css.map → C_ImageCropper-CdTX2nxU.css.map} +1 -1
  139. package/dist/{C_ImageCropper-CylwGuzS.css.map → C_ImageCropper-ilOqPklJ.css.map} +1 -1
  140. package/dist/C_ImageCropper.css +23 -23
  141. package/dist/C_ImageCropper.js.map +1 -1
  142. package/dist/C_ImageCropper2.js +1 -1
  143. package/dist/C_ImageCropper2.js.map +1 -1
  144. package/dist/C_Language.js.map +1 -1
  145. package/dist/C_Language2.js +1 -1
  146. package/dist/C_Language2.js.map +1 -1
  147. package/dist/{C_Login-BkdnkBKX.css.map → C_Login-B3qYkLrN.css.map} +1 -1
  148. package/dist/{C_Login-VkMM6OJ2.css.map → C_Login-xMI1_ojE.css.map} +1 -1
  149. package/dist/C_Login.css +72 -72
  150. package/dist/C_Login.js.map +1 -1
  151. package/dist/C_Login2.js +1 -1
  152. package/dist/C_Login2.js.map +1 -1
  153. package/dist/{C_Map-DNnBcY70.css.map → C_Map-CWMMN58_.css.map} +1 -1
  154. package/dist/{C_Map-LEXIx6zM.css.map → C_Map-xSR2H-9o.css.map} +1 -1
  155. package/dist/C_Map.css +4 -4
  156. package/dist/C_Map.js.map +1 -1
  157. package/dist/C_Map2.js +1 -1
  158. package/dist/C_Map2.js.map +1 -1
  159. package/dist/{C_Markdown-DwmI0_0Q.css.map → C_Markdown-C7lTVJ1S.css.map} +1 -1
  160. package/dist/{C_Markdown-k0794RW0.css.map → C_Markdown-CZDm_baQ.css.map} +1 -1
  161. package/dist/C_Markdown.css +33 -33
  162. package/dist/C_Markdown.js.map +1 -1
  163. package/dist/C_Markdown2.js +1 -1
  164. package/dist/C_Markdown2.js.map +1 -1
  165. package/dist/C_Menu.js.map +1 -1
  166. package/dist/C_Menu2.js +1 -1
  167. package/dist/C_Menu2.js.map +1 -1
  168. package/dist/{C_NotificationCenter-DT6fQ79O.css.map → C_NotificationCenter-D7GGGWg7.css.map} +1 -1
  169. package/dist/{C_NotificationCenter-DbgBiyqB.css.map → C_NotificationCenter-SSmeHA45.css.map} +1 -1
  170. package/dist/C_NotificationCenter.css +89 -89
  171. package/dist/C_NotificationCenter.js.map +1 -1
  172. package/dist/C_NotificationCenter2.js +1 -1
  173. package/dist/C_NotificationCenter2.js.map +1 -1
  174. package/dist/C_OrgChart.js.map +1 -1
  175. package/dist/C_OrgChart2.js.map +1 -1
  176. package/dist/C_Progress.js.map +1 -1
  177. package/dist/C_Progress2.js +1 -1
  178. package/dist/C_Progress2.js.map +1 -1
  179. package/dist/{C_QRCode-CFNTda_1.css.map → C_QRCode-B_1lHUdx.css.map} +1 -1
  180. package/dist/{C_QRCode-CmWr9lK-.css.map → C_QRCode-CuQRYu0s.css.map} +1 -1
  181. package/dist/C_QRCode.css +9 -9
  182. package/dist/C_QRCode.js.map +1 -1
  183. package/dist/C_QRCode2.js +1 -1
  184. package/dist/C_QRCode2.js.map +1 -1
  185. package/dist/{C_Signature-BDx4ctsE.css.map → C_Signature-Bp-RBpAl.css.map} +1 -1
  186. package/dist/{C_Signature-Bz_uNbwv.css.map → C_Signature-Cb2VW1ok.css.map} +1 -1
  187. package/dist/C_Signature.css +15 -15
  188. package/dist/C_Signature.js.map +1 -1
  189. package/dist/C_Signature2.js +1 -1
  190. package/dist/C_Signature2.js.map +1 -1
  191. package/dist/C_Skeleton.js.map +1 -1
  192. package/dist/C_Skeleton2.js.map +1 -1
  193. package/dist/{C_SplitPane-BOwr1C7K.css.map → C_SplitPane-CgGWYsRE.css.map} +1 -1
  194. package/dist/{C_SplitPane-N-a_D-7F.css.map → C_SplitPane-DGf6WEeR.css.map} +1 -1
  195. package/dist/C_SplitPane.css +31 -31
  196. package/dist/C_SplitPane.js.map +1 -1
  197. package/dist/C_SplitPane2.js +1 -1
  198. package/dist/C_SplitPane2.js.map +1 -1
  199. package/dist/C_Steps-Buyg7Axn.css.map +1 -0
  200. package/dist/C_Steps-DNY91VbQ.css.map +1 -0
  201. package/dist/C_Steps.css +38 -38
  202. package/dist/C_Steps.js.map +1 -1
  203. package/dist/C_Steps2.js +1 -1
  204. package/dist/C_Steps2.js.map +1 -1
  205. package/dist/{C_Table-BcM5LqAM.css.map → C_Table--kbQaaBv.css.map} +1 -1
  206. package/dist/{C_Table-HATVoq1F.css.map → C_Table-D631kdXC.css.map} +1 -1
  207. package/dist/C_Table.css +104 -104
  208. package/dist/C_Table.js.map +1 -1
  209. package/dist/C_Table2.js +2 -2
  210. package/dist/C_Table2.js.map +1 -1
  211. package/dist/{C_TagsView-DX3LecK1.css.map → C_TagsView-COjGNM9h.css.map} +1 -1
  212. package/dist/{C_TagsView-DqOTa8bL.css.map → C_TagsView-zUDj9S06.css.map} +1 -1
  213. package/dist/C_TagsView.css +36 -36
  214. package/dist/C_TagsView.js.map +1 -1
  215. package/dist/C_TagsView2.js +1 -1
  216. package/dist/C_TagsView2.js.map +1 -1
  217. package/dist/C_Theme.js.map +1 -1
  218. package/dist/C_Theme2.js +1 -1
  219. package/dist/C_Theme2.js.map +1 -1
  220. package/dist/C_Time-BQ9PGy8B.css.map +1 -0
  221. package/dist/C_Time-CO73krC6.css.map +1 -0
  222. package/dist/C_Time.css +5 -5
  223. package/dist/C_Time.js.map +1 -1
  224. package/dist/C_Time2.js +1 -1
  225. package/dist/C_Time2.js.map +1 -1
  226. package/dist/{C_Timeline-BKkimrZx.css.map → C_Timeline-4rk0Dzgn.css.map} +1 -1
  227. package/dist/{C_Timeline-DTuSCX6p.css.map → C_Timeline-DdESmqwL.css.map} +1 -1
  228. package/dist/C_Timeline.css +45 -45
  229. package/dist/C_Timeline.js.map +1 -1
  230. package/dist/C_Timeline2.js +1 -1
  231. package/dist/C_Timeline2.js.map +1 -1
  232. package/dist/{C_Transfer-BOB6OBqS.css.map → C_Transfer-B-vjvhjI.css.map} +1 -1
  233. package/dist/{C_Transfer-Dpq7ezWC.css.map → C_Transfer-EzdHzZNv.css.map} +1 -1
  234. package/dist/C_Transfer.css +31 -31
  235. package/dist/C_Transfer.js.map +1 -1
  236. package/dist/C_Transfer2.js +1 -1
  237. package/dist/C_Transfer2.js.map +1 -1
  238. package/dist/{C_Tree-D98nX9qT.css.map → C_Tree-CsXgGfhn.css.map} +1 -1
  239. package/dist/{C_Tree-ulfm7b-P.css.map → C_Tree-P7eRpnOa.css.map} +1 -1
  240. package/dist/C_Tree.css +33 -33
  241. package/dist/C_Tree.js.map +1 -1
  242. package/dist/C_Tree2.js +1 -1
  243. package/dist/C_Tree2.js.map +1 -1
  244. package/dist/{C_Upload-BR9fg5r4.css.map → C_Upload-CHjiVVh7.css.map} +1 -1
  245. package/dist/{C_Upload-CPqf74Ea.css.map → C_Upload-DE3OLsZD.css.map} +1 -1
  246. package/dist/C_Upload.css +50 -50
  247. package/dist/C_Upload.js.map +1 -1
  248. package/dist/C_Upload2.js +2 -2
  249. package/dist/C_Upload2.js.map +1 -1
  250. package/dist/{C_VideoPlayer-4J96tKfK.css.map → C_VideoPlayer-CnaNOFtW.css.map} +1 -1
  251. package/dist/{C_VideoPlayer-D35seHkm.css.map → C_VideoPlayer-cnP88zNV.css.map} +1 -1
  252. package/dist/C_VideoPlayer.css +68 -68
  253. package/dist/C_VideoPlayer.js.map +1 -1
  254. package/dist/C_VideoPlayer2.js +3 -3
  255. package/dist/C_VideoPlayer2.js.map +1 -1
  256. package/dist/{C_VtableGantt-C2lxFmWg.css.map → C_VtableGantt-CZlJgvpC.css.map} +1 -1
  257. package/dist/{C_VtableGantt-Dwnkw_WL.css.map → C_VtableGantt-DKfQkql0.css.map} +1 -1
  258. package/dist/C_VtableGantt.css +15 -15
  259. package/dist/C_VtableGantt.js.map +1 -1
  260. package/dist/C_VtableGantt2.js +1 -1
  261. package/dist/C_VtableGantt2.js.map +1 -1
  262. package/dist/{C_WaterFall-C4HDqf-a.css.map → C_WaterFall-BJ_39ext.css.map} +1 -1
  263. package/dist/{C_WaterFall-HWB-gPON.css.map → C_WaterFall-cYc1vntE.css.map} +1 -1
  264. package/dist/C_WaterFall.css +16 -16
  265. package/dist/C_WaterFall.js.map +1 -1
  266. package/dist/C_WaterFall2.js +1 -1
  267. package/dist/C_WaterFall2.js.map +1 -1
  268. package/dist/{C_WorkFlow-2hJfvvTK.css.map → C_WorkFlow-BFzRGGhJ.css.map} +1 -1
  269. package/dist/{C_WorkFlow-DHoNjl8-.css.map → C_WorkFlow-DSyCOvRp.css.map} +1 -1
  270. package/dist/C_WorkFlow.css +193 -193
  271. package/dist/C_WorkFlow.js.map +1 -1
  272. package/dist/C_WorkFlow2.js +1 -1
  273. package/dist/C_WorkFlow2.js.map +1 -1
  274. package/dist/constants.d.ts +1 -1
  275. package/dist/constants2.d.ts +2 -2
  276. package/dist/constants3.d.ts +1 -1
  277. package/dist/constants4.d.ts +1 -1
  278. package/dist/constants5.d.ts +2 -2
  279. package/dist/data.d.ts +1 -1
  280. package/dist/index.vue.d.ts +2 -2
  281. package/dist/index11.vue.d.ts +2 -2
  282. package/dist/index12.vue.d.ts +1 -1
  283. package/dist/index13.vue.d.ts +2 -2
  284. package/dist/index14.vue.d.ts +3 -3
  285. package/dist/index15.vue.d.ts +6 -6
  286. package/dist/index17.vue.d.ts +1 -1
  287. package/dist/index18.vue.d.ts +2 -2
  288. package/dist/index2.vue.d.ts +6 -6
  289. package/dist/index20.vue.d.ts +1 -1
  290. package/dist/index21.vue.d.ts +2 -2
  291. package/dist/index22.vue.d.ts +2 -2
  292. package/dist/index24.vue.d.ts +1 -1
  293. package/dist/index26.vue.d.ts +3 -3
  294. package/dist/index27.vue.d.ts +1 -1
  295. package/dist/index28.vue.d.ts +2 -2
  296. package/dist/index3.vue.d.ts +2 -2
  297. package/dist/index4.vue.d.ts +2 -2
  298. package/dist/index6.vue.d.ts +3 -3
  299. package/dist/style.css +1991 -1991
  300. package/dist/useCalendarEvents.d.ts +1 -1
  301. package/dist/useCollapsePanel.d.ts +3 -3
  302. package/dist/useCropperCore.d.ts +4 -4
  303. package/dist/useDraggableLayout.d.ts +2 -2
  304. package/dist/useDynamicFormState.d.ts +13 -13
  305. package/dist/useEdgeInteraction.d.ts +1 -1
  306. package/dist/useInfiniteScroll.d.ts +3 -3
  307. package/dist/useModalEdit.d.ts +3 -3
  308. package/dist/useQRCode.d.ts +3 -3
  309. package/dist/useSignatureHistory.d.ts +1 -1
  310. package/dist/useSplitResize.d.ts +5 -5
  311. package/dist/useTimeSelection.d.ts +2 -2
  312. package/dist/useTreeOperations.d.ts +4 -4
  313. package/dist/useWorkflowValidation.d.ts +4 -4
  314. package/package.json +4 -7
  315. package/dist/C_ActionBar-DYG0Yf3A.css.map +0 -1
  316. package/dist/C_ActionBar-MAjRhqcI.css.map +0 -1
  317. package/dist/C_Cascade-Dq0S5Jkm.css.map +0 -1
  318. package/dist/C_Cascade-IUUHIh7r.css.map +0 -1
  319. package/dist/C_Code-BFi5xxnM.css.map +0 -1
  320. package/dist/C_Code-CZ7yfnri.css.map +0 -1
  321. package/dist/C_FullCalendar-BQA0OjGB.css.map +0 -1
  322. package/dist/C_FullCalendar-ChJUosAi.css.map +0 -1
  323. package/dist/C_Steps-Bk1krgiR.css.map +0 -1
  324. package/dist/C_Steps-Dn2CMpy1.css.map +0 -1
  325. package/dist/C_Time-BzyQVvTS.css.map +0 -1
  326. package/dist/C_Time-DmpKLQHc.css.map +0 -1
  327. package/dist/themes/glass-morphism.css +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"C_Map-LEXIx6zM.css","names":[],"sources":["../src/components/C_Map/index.vue?vue&type=style&index=0&scoped=340816cd&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled */.c-map[data-v-340816cd] {\n position: relative;\n width: 100%;\n min-height: 300px;\n background: #f5f5f5;\n border-radius: 4px;\n overflow: hidden;\n}\n.c-map .map-container[data-v-340816cd] {\n width: 100%;\n height: 100%;\n border-radius: 4px;\n overflow: hidden;\n}\n.c-map .map-loading[data-v-340816cd] {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255, 255, 255, 0.9);\n border-radius: 4px;\n z-index: 1000;\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"}
1
+ {"version":3,"file":"C_Map-xSR2H-9o.css","names":[],"sources":["../src/components/C_Map/index.vue?vue&type=style&index=0&scoped=35363772&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled */.c-map[data-v-35363772] {\n position: relative;\n width: 100%;\n min-height: 300px;\n background: #f5f5f5;\n border-radius: 4px;\n overflow: hidden;\n}\n.c-map .map-container[data-v-35363772] {\n width: 100%;\n height: 100%;\n border-radius: 4px;\n overflow: hidden;\n}\n.c-map .map-loading[data-v-35363772] {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255, 255, 255, 0.9);\n border-radius: 4px;\n z-index: 1000;\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"}
package/dist/C_Map.css CHANGED
@@ -1,4 +1,4 @@
1
- /* unplugin-vue-components disabled */.c-map[data-v-340816cd] {
1
+ /* unplugin-vue-components disabled */.c-map[data-v-35363772] {
2
2
  position: relative;
3
3
  width: 100%;
4
4
  min-height: 300px;
@@ -6,13 +6,13 @@
6
6
  border-radius: 4px;
7
7
  overflow: hidden;
8
8
  }
9
- .c-map .map-container[data-v-340816cd] {
9
+ .c-map .map-container[data-v-35363772] {
10
10
  width: 100%;
11
11
  height: 100%;
12
12
  border-radius: 4px;
13
13
  overflow: hidden;
14
14
  }
15
- .c-map .map-loading[data-v-340816cd] {
15
+ .c-map .map-loading[data-v-35363772] {
16
16
  position: absolute;
17
17
  top: 0;
18
18
  left: 0;
@@ -26,4 +26,4 @@
26
26
  z-index: 1000;
27
27
  }
28
28
 
29
- /*# sourceMappingURL=C_Map-DNnBcY70.css.map*/
29
+ /*# sourceMappingURL=C_Map-CWMMN58_.css.map*/
package/dist/C_Map.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"C_Map.js","names":[],"sources":["../src/components/C_Map/data.ts","../src/components/C_Map/index.vue"],"sourcesContent":["export const MAP_TYPES = [\r\n { label: \"OpenStreetMap\", value: \"osm\" },\r\n { label: \"高德地图\", value: \"amap\" },\r\n] as const;\r\n\r\nexport type MapType = (typeof MAP_TYPES)[number][\"value\"];\r\n\r\nexport interface MapMarker {\r\n lat: number;\r\n lng: number;\r\n popup?: string;\r\n}\r\n\r\nexport interface MapConfig {\r\n height?: string;\r\n center?: [number, number];\r\n zoom?: number;\r\n markers?: MapMarker[];\r\n mapType?: MapType;\r\n amapKey?: string;\r\n}\r\n\r\nexport const DEFAULT_MAP_CONFIG: Required<\r\n Omit<MapConfig, \"markers\" | \"amapKey\">\r\n> = {\r\n height: \"400px\",\r\n center: [39.9042, 116.4074],\r\n zoom: 10,\r\n mapType: \"osm\",\r\n};\r\n\r\nexport const OSM_TILE_CONFIG = {\r\n url: \"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\",\r\n attribution: \"© OpenStreetMap contributors\",\r\n maxZoom: 19,\r\n minZoom: 1,\r\n tileSize: 256,\r\n detectRetina: true,\r\n} as const;\r\n\r\nexport const AMAP_CONFIG = {\r\n apiUrl: \"https://webapi.amap.com/maps?v=2.0&key=\",\r\n note: \"高德地图需要API Key,如需使用请申请:https://lbs.amap.com/api/javascript-api/guide/create/\",\r\n} as const;\r\n\r\nexport const MAP_ICONS = {\r\n iconRetinaUrl:\r\n \"https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-icon-2x.png\",\r\n iconUrl:\r\n \"https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-icon.png\",\r\n shadowUrl:\r\n \"https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-shadow.png\",\r\n} as const;\r\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-map\">\n <div\n ref=\"mapContainer\"\n class=\"map-container\"\n :style=\"{ height: height }\"\n ></div>\n <div v-if=\"loading\" class=\"map-loading\">\n <NSpin size=\"large\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, nextTick, onMounted, onUnmounted } from \"vue\";\nimport { NSpin } from \"naive-ui\";\nimport L from \"leaflet\";\nimport \"leaflet/dist/leaflet.css\";\nimport { OSM_TILE_CONFIG, AMAP_CONFIG, MAP_ICONS } from \"./data\";\n\ndefineOptions({ name: \"C_Map\" });\n\ndelete (L.Icon.Default.prototype as any)._getIconUrl;\nL.Icon.Default.mergeOptions(MAP_ICONS);\n\ninterface MapMarker {\n lat: number;\n lng: number;\n popup?: string;\n}\n\nconst props = withDefaults(\n defineProps<{\n height?: string;\n center?: [number, number];\n zoom?: number;\n markers?: MapMarker[];\n mapType?: \"osm\" | \"amap\";\n amapKey?: string;\n }>(),\n {\n height: \"400px\",\n center: () => [39.9042, 116.4074],\n zoom: 10,\n markers: () => [],\n mapType: \"osm\",\n amapKey: \"\",\n },\n);\n\nconst emit = defineEmits<{\n ready: [map: any];\n markerClick: [marker: MapMarker, event: any];\n}>();\n\nconst mapContainer = ref<HTMLElement>();\nconst loading = ref(true);\nlet map: any = null;\n\nconst initOSMMap = async () => {\n if (!mapContainer.value) return;\n try {\n mapContainer.value.innerHTML = \"\";\n map = L.map(mapContainer.value, {\n center: props.center,\n zoom: props.zoom,\n zoomControl: true,\n preferCanvas: true,\n });\n const tileLayer = L.tileLayer(OSM_TILE_CONFIG.url, OSM_TILE_CONFIG);\n tileLayer.addTo(map);\n addMarkers();\n await nextTick();\n requestAnimationFrame(() => {\n map?.invalidateSize({ reset: true, pan: false });\n });\n loading.value = false;\n emit(\"ready\", map);\n } catch (error) {\n console.error(\"OpenStreetMap初始化失败:\", error);\n loading.value = false;\n }\n};\n\nconst initAMap = async () => {\n if (!mapContainer.value || !props.amapKey) return;\n try {\n mapContainer.value.innerHTML = \"\";\n const script = document.createElement(\"script\");\n script.type = \"text/javascript\";\n script.src = `${AMAP_CONFIG.apiUrl}${props.amapKey}`;\n script.onload = () => {\n if ((window as any).AMap) {\n const amap = new (window as any).AMap.Map(mapContainer.value, {\n zoom: props.zoom,\n center: props.center,\n });\n addAMapMarkers(amap);\n loading.value = false;\n emit(\"ready\", amap);\n }\n };\n script.onerror = () => {\n loading.value = false;\n };\n document.head.appendChild(script);\n } catch {\n loading.value = false;\n }\n};\n\nconst addMarkers = () => {\n if (!map || props.mapType !== \"osm\" || !props.markers) return;\n map.eachLayer((layer: any) => {\n if (layer instanceof L.Marker) {\n map.removeLayer(layer);\n }\n });\n props.markers.forEach((marker) => {\n const leafletMarker = L.marker([marker.lat, marker.lng]);\n if (marker.popup) {\n leafletMarker.bindPopup(marker.popup);\n leafletMarker.on(\"click\", (event: any) => {\n emit(\"markerClick\", marker, event);\n });\n }\n leafletMarker.addTo(map);\n });\n};\n\nconst addAMapMarkers = (amap: any) => {\n if (!amap || props.mapType !== \"amap\" || !props.markers) return;\n props.markers.forEach((marker) => {\n const amapMarker = new (window as any).AMap.Marker({\n position: [marker.lat, marker.lng],\n title: marker.popup || \"\",\n });\n if (marker.popup) {\n const infoWindow = new (window as any).AMap.InfoWindow({\n content: marker.popup,\n offset: new (window as any).AMap.Pixel(0, -30),\n });\n amapMarker.on(\"click\", () => {\n infoWindow.open(amap, amapMarker.getPosition());\n emit(\"markerClick\", marker, null);\n });\n }\n amapMarker.setMap(amap);\n });\n};\n\nwatch(\n () => props.markers,\n () => {\n if (map && props.mapType === \"osm\") addMarkers();\n },\n { deep: true },\n);\n\nwatch(\n () => props.mapType,\n async (newType, oldType) => {\n if (newType === oldType) return;\n if (map) {\n map.remove();\n map = null;\n loading.value = true;\n await nextTick();\n if (newType === \"amap\" && props.amapKey) await initAMap();\n else await initOSMMap();\n }\n },\n);\n\nwatch(\n [() => props.center, () => props.zoom],\n () => {\n if (map) map.setView(props.center, props.zoom);\n },\n { deep: true },\n);\n\nonMounted(async () => {\n await nextTick();\n if (props.mapType === \"amap\" && props.amapKey) await initAMap();\n else await initOSMMap();\n});\n\nonUnmounted(() => {\n if (map) {\n map.remove();\n map = null;\n }\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@use \"./index.scss\";\n</style>\n"],"mappings":"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"}
1
+ {"version":3,"file":"C_Map.js","names":["height"],"sources":["../src/components/C_Map/data.ts","../src/components/C_Map/index.vue","../src/components/C_Map/index.vue"],"sourcesContent":["export const MAP_TYPES = [\r\n { label: \"OpenStreetMap\", value: \"osm\" },\r\n { label: \"高德地图\", value: \"amap\" },\r\n] as const;\r\n\r\nexport type MapType = (typeof MAP_TYPES)[number][\"value\"];\r\n\r\nexport interface MapMarker {\r\n lat: number;\r\n lng: number;\r\n popup?: string;\r\n}\r\n\r\nexport interface MapConfig {\r\n height?: string;\r\n center?: [number, number];\r\n zoom?: number;\r\n markers?: MapMarker[];\r\n mapType?: MapType;\r\n amapKey?: string;\r\n}\r\n\r\nexport const DEFAULT_MAP_CONFIG: Required<\r\n Omit<MapConfig, \"markers\" | \"amapKey\">\r\n> = {\r\n height: \"400px\",\r\n center: [39.9042, 116.4074],\r\n zoom: 10,\r\n mapType: \"osm\",\r\n};\r\n\r\nexport const OSM_TILE_CONFIG = {\r\n url: \"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\",\r\n attribution: \"© OpenStreetMap contributors\",\r\n maxZoom: 19,\r\n minZoom: 1,\r\n tileSize: 256,\r\n detectRetina: true,\r\n} as const;\r\n\r\nexport const AMAP_CONFIG = {\r\n apiUrl: \"https://webapi.amap.com/maps?v=2.0&key=\",\r\n note: \"高德地图需要API Key,如需使用请申请:https://lbs.amap.com/api/javascript-api/guide/create/\",\r\n} as const;\r\n\r\nexport const MAP_ICONS = {\r\n iconRetinaUrl:\r\n \"https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-icon-2x.png\",\r\n iconUrl:\r\n \"https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-icon.png\",\r\n shadowUrl:\r\n \"https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-shadow.png\",\r\n} as const;\r\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-map\">\n <div\n ref=\"mapContainer\"\n class=\"map-container\"\n :style=\"{ height: height }\"\n ></div>\n <div v-if=\"loading\" class=\"map-loading\">\n <NSpin size=\"large\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, nextTick, onMounted, onUnmounted } from \"vue\";\nimport { NSpin } from \"naive-ui\";\nimport L from \"leaflet\";\nimport \"leaflet/dist/leaflet.css\";\nimport { OSM_TILE_CONFIG, AMAP_CONFIG, MAP_ICONS } from \"./data\";\n\ndefineOptions({ name: \"C_Map\" });\n\ndelete (L.Icon.Default.prototype as any)._getIconUrl;\nL.Icon.Default.mergeOptions(MAP_ICONS);\n\ninterface MapMarker {\n lat: number;\n lng: number;\n popup?: string;\n}\n\nconst props = withDefaults(\n defineProps<{\n height?: string;\n center?: [number, number];\n zoom?: number;\n markers?: MapMarker[];\n mapType?: \"osm\" | \"amap\";\n amapKey?: string;\n }>(),\n {\n height: \"400px\",\n center: () => [39.9042, 116.4074],\n zoom: 10,\n markers: () => [],\n mapType: \"osm\",\n amapKey: \"\",\n },\n);\n\nconst emit = defineEmits<{\n ready: [map: any];\n markerClick: [marker: MapMarker, event: any];\n}>();\n\nconst mapContainer = ref<HTMLElement>();\nconst loading = ref(true);\nlet map: any = null;\n\nconst initOSMMap = async () => {\n if (!mapContainer.value) return;\n try {\n mapContainer.value.innerHTML = \"\";\n map = L.map(mapContainer.value, {\n center: props.center,\n zoom: props.zoom,\n zoomControl: true,\n preferCanvas: true,\n });\n const tileLayer = L.tileLayer(OSM_TILE_CONFIG.url, OSM_TILE_CONFIG);\n tileLayer.addTo(map);\n addMarkers();\n await nextTick();\n requestAnimationFrame(() => {\n map?.invalidateSize({ reset: true, pan: false });\n });\n loading.value = false;\n emit(\"ready\", map);\n } catch (error) {\n console.error(\"OpenStreetMap初始化失败:\", error);\n loading.value = false;\n }\n};\n\nconst initAMap = async () => {\n if (!mapContainer.value || !props.amapKey) return;\n try {\n mapContainer.value.innerHTML = \"\";\n const script = document.createElement(\"script\");\n script.type = \"text/javascript\";\n script.src = `${AMAP_CONFIG.apiUrl}${props.amapKey}`;\n script.onload = () => {\n if ((window as any).AMap) {\n const amap = new (window as any).AMap.Map(mapContainer.value, {\n zoom: props.zoom,\n center: props.center,\n });\n addAMapMarkers(amap);\n loading.value = false;\n emit(\"ready\", amap);\n }\n };\n script.onerror = () => {\n loading.value = false;\n };\n document.head.appendChild(script);\n } catch {\n loading.value = false;\n }\n};\n\nconst addMarkers = () => {\n if (!map || props.mapType !== \"osm\" || !props.markers) return;\n map.eachLayer((layer: any) => {\n if (layer instanceof L.Marker) {\n map.removeLayer(layer);\n }\n });\n props.markers.forEach((marker) => {\n const leafletMarker = L.marker([marker.lat, marker.lng]);\n if (marker.popup) {\n leafletMarker.bindPopup(marker.popup);\n leafletMarker.on(\"click\", (event: any) => {\n emit(\"markerClick\", marker, event);\n });\n }\n leafletMarker.addTo(map);\n });\n};\n\nconst addAMapMarkers = (amap: any) => {\n if (!amap || props.mapType !== \"amap\" || !props.markers) return;\n props.markers.forEach((marker) => {\n const amapMarker = new (window as any).AMap.Marker({\n position: [marker.lat, marker.lng],\n title: marker.popup || \"\",\n });\n if (marker.popup) {\n const infoWindow = new (window as any).AMap.InfoWindow({\n content: marker.popup,\n offset: new (window as any).AMap.Pixel(0, -30),\n });\n amapMarker.on(\"click\", () => {\n infoWindow.open(amap, amapMarker.getPosition());\n emit(\"markerClick\", marker, null);\n });\n }\n amapMarker.setMap(amap);\n });\n};\n\nwatch(\n () => props.markers,\n () => {\n if (map && props.mapType === \"osm\") addMarkers();\n },\n { deep: true },\n);\n\nwatch(\n () => props.mapType,\n async (newType, oldType) => {\n if (newType === oldType) return;\n if (map) {\n map.remove();\n map = null;\n loading.value = true;\n await nextTick();\n if (newType === \"amap\" && props.amapKey) await initAMap();\n else await initOSMMap();\n }\n },\n);\n\nwatch(\n [() => props.center, () => props.zoom],\n () => {\n if (map) map.setView(props.center, props.zoom);\n },\n { deep: true },\n);\n\nonMounted(async () => {\n await nextTick();\n if (props.mapType === \"amap\" && props.amapKey) await initAMap();\n else await initOSMMap();\n});\n\nonUnmounted(() => {\n if (map) {\n map.remove();\n map = null;\n }\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-map\">\n <div\n ref=\"mapContainer\"\n class=\"map-container\"\n :style=\"{ height: height }\"\n ></div>\n <div v-if=\"loading\" class=\"map-loading\">\n <NSpin size=\"large\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, nextTick, onMounted, onUnmounted } from \"vue\";\nimport { NSpin } from \"naive-ui\";\nimport L from \"leaflet\";\nimport \"leaflet/dist/leaflet.css\";\nimport { OSM_TILE_CONFIG, AMAP_CONFIG, MAP_ICONS } from \"./data\";\n\ndefineOptions({ name: \"C_Map\" });\n\ndelete (L.Icon.Default.prototype as any)._getIconUrl;\nL.Icon.Default.mergeOptions(MAP_ICONS);\n\ninterface MapMarker {\n lat: number;\n lng: number;\n popup?: string;\n}\n\nconst props = withDefaults(\n defineProps<{\n height?: string;\n center?: [number, number];\n zoom?: number;\n markers?: MapMarker[];\n mapType?: \"osm\" | \"amap\";\n amapKey?: string;\n }>(),\n {\n height: \"400px\",\n center: () => [39.9042, 116.4074],\n zoom: 10,\n markers: () => [],\n mapType: \"osm\",\n amapKey: \"\",\n },\n);\n\nconst emit = defineEmits<{\n ready: [map: any];\n markerClick: [marker: MapMarker, event: any];\n}>();\n\nconst mapContainer = ref<HTMLElement>();\nconst loading = ref(true);\nlet map: any = null;\n\nconst initOSMMap = async () => {\n if (!mapContainer.value) return;\n try {\n mapContainer.value.innerHTML = \"\";\n map = L.map(mapContainer.value, {\n center: props.center,\n zoom: props.zoom,\n zoomControl: true,\n preferCanvas: true,\n });\n const tileLayer = L.tileLayer(OSM_TILE_CONFIG.url, OSM_TILE_CONFIG);\n tileLayer.addTo(map);\n addMarkers();\n await nextTick();\n requestAnimationFrame(() => {\n map?.invalidateSize({ reset: true, pan: false });\n });\n loading.value = false;\n emit(\"ready\", map);\n } catch (error) {\n console.error(\"OpenStreetMap初始化失败:\", error);\n loading.value = false;\n }\n};\n\nconst initAMap = async () => {\n if (!mapContainer.value || !props.amapKey) return;\n try {\n mapContainer.value.innerHTML = \"\";\n const script = document.createElement(\"script\");\n script.type = \"text/javascript\";\n script.src = `${AMAP_CONFIG.apiUrl}${props.amapKey}`;\n script.onload = () => {\n if ((window as any).AMap) {\n const amap = new (window as any).AMap.Map(mapContainer.value, {\n zoom: props.zoom,\n center: props.center,\n });\n addAMapMarkers(amap);\n loading.value = false;\n emit(\"ready\", amap);\n }\n };\n script.onerror = () => {\n loading.value = false;\n };\n document.head.appendChild(script);\n } catch {\n loading.value = false;\n }\n};\n\nconst addMarkers = () => {\n if (!map || props.mapType !== \"osm\" || !props.markers) return;\n map.eachLayer((layer: any) => {\n if (layer instanceof L.Marker) {\n map.removeLayer(layer);\n }\n });\n props.markers.forEach((marker) => {\n const leafletMarker = L.marker([marker.lat, marker.lng]);\n if (marker.popup) {\n leafletMarker.bindPopup(marker.popup);\n leafletMarker.on(\"click\", (event: any) => {\n emit(\"markerClick\", marker, event);\n });\n }\n leafletMarker.addTo(map);\n });\n};\n\nconst addAMapMarkers = (amap: any) => {\n if (!amap || props.mapType !== \"amap\" || !props.markers) return;\n props.markers.forEach((marker) => {\n const amapMarker = new (window as any).AMap.Marker({\n position: [marker.lat, marker.lng],\n title: marker.popup || \"\",\n });\n if (marker.popup) {\n const infoWindow = new (window as any).AMap.InfoWindow({\n content: marker.popup,\n offset: new (window as any).AMap.Pixel(0, -30),\n });\n amapMarker.on(\"click\", () => {\n infoWindow.open(amap, amapMarker.getPosition());\n emit(\"markerClick\", marker, null);\n });\n }\n amapMarker.setMap(amap);\n });\n};\n\nwatch(\n () => props.markers,\n () => {\n if (map && props.mapType === \"osm\") addMarkers();\n },\n { deep: true },\n);\n\nwatch(\n () => props.mapType,\n async (newType, oldType) => {\n if (newType === oldType) return;\n if (map) {\n map.remove();\n map = null;\n loading.value = true;\n await nextTick();\n if (newType === \"amap\" && props.amapKey) await initAMap();\n else await initOSMMap();\n }\n },\n);\n\nwatch(\n [() => props.center, () => props.zoom],\n () => {\n if (map) map.setView(props.center, props.zoom);\n },\n { deep: true },\n);\n\nonMounted(async () => {\n await nextTick();\n if (props.mapType === \"amap\" && props.amapKey) await initAMap();\n else await initOSMMap();\n});\n\nonUnmounted(() => {\n if (map) {\n map.remove();\n map = null;\n }\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@use \"./index.scss\";\n</style>\n"],"mappings":"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"}
package/dist/C_Map2.js CHANGED
@@ -1,2 +1,2 @@
1
- import{t as e}from"./export-helper.js";import{createCommentVNode as t,createElementBlock as n,createElementVNode as r,createVNode as i,defineComponent as a,nextTick as o,normalizeStyle as s,onMounted as c,onUnmounted as l,openBlock as u,ref as d,unref as f,watch as p}from"vue";import{NSpin as m}from"naive-ui";import h from"leaflet";import"leaflet/dist/leaflet.css";const g=[{label:`OpenStreetMap`,value:`osm`},{label:`高德地图`,value:`amap`}],_={height:`400px`,center:[39.9042,116.4074],zoom:10,mapType:`osm`},v={url:`https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png`,attribution:`© OpenStreetMap contributors`,maxZoom:19,minZoom:1,tileSize:256,detectRetina:!0},y={apiUrl:`https://webapi.amap.com/maps?v=2.0&key=`,note:`高德地图需要API Key,如需使用请申请:https://lbs.amap.com/api/javascript-api/guide/create/`},b={iconRetinaUrl:`https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-icon-2x.png`,iconUrl:`https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-icon.png`,shadowUrl:`https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-shadow.png`},x={class:`c-map`},S={key:0,class:`map-loading`};var C=e(a({name:`C_Map`,__name:`index`,props:{height:{default:`400px`},center:{default:()=>[39.9042,116.4074]},zoom:{default:10},markers:{default:()=>[]},mapType:{default:`osm`},amapKey:{default:``}},emits:[`ready`,`markerClick`],setup(e,{emit:a}){delete h.Icon.Default.prototype._getIconUrl,h.Icon.Default.mergeOptions(b);let g=e,_=a,C=d(),w=d(!0),T=null,E=async()=>{if(C.value)try{C.value.innerHTML=``,T=h.map(C.value,{center:g.center,zoom:g.zoom,zoomControl:!0,preferCanvas:!0}),h.tileLayer(v.url,v).addTo(T),O(),await o(),requestAnimationFrame(()=>{T?.invalidateSize({reset:!0,pan:!1})}),w.value=!1,_(`ready`,T)}catch(e){console.error(`OpenStreetMap初始化失败:`,e),w.value=!1}},D=async()=>{if(!(!C.value||!g.amapKey))try{C.value.innerHTML=``;let e=document.createElement(`script`);e.type=`text/javascript`,e.src=`${y.apiUrl}${g.amapKey}`,e.onload=()=>{if(window.AMap){let e=new window.AMap.Map(C.value,{zoom:g.zoom,center:g.center});k(e),w.value=!1,_(`ready`,e)}},e.onerror=()=>{w.value=!1},document.head.appendChild(e)}catch{w.value=!1}},O=()=>{!T||g.mapType!==`osm`||!g.markers||(T.eachLayer(e=>{e instanceof h.Marker&&T.removeLayer(e)}),g.markers.forEach(e=>{let t=h.marker([e.lat,e.lng]);e.popup&&(t.bindPopup(e.popup),t.on(`click`,t=>{_(`markerClick`,e,t)})),t.addTo(T)}))},k=e=>{!e||g.mapType!==`amap`||!g.markers||g.markers.forEach(t=>{let n=new window.AMap.Marker({position:[t.lat,t.lng],title:t.popup||``});if(t.popup){let r=new window.AMap.InfoWindow({content:t.popup,offset:new window.AMap.Pixel(0,-30)});n.on(`click`,()=>{r.open(e,n.getPosition()),_(`markerClick`,t,null)})}n.setMap(e)})};return p(()=>g.markers,()=>{T&&g.mapType===`osm`&&O()},{deep:!0}),p(()=>g.mapType,async(e,t)=>{e!==t&&T&&(T.remove(),T=null,w.value=!0,await o(),e===`amap`&&g.amapKey?await D():await E())}),p([()=>g.center,()=>g.zoom],()=>{T&&T.setView(g.center,g.zoom)},{deep:!0}),c(async()=>{await o(),g.mapType===`amap`&&g.amapKey?await D():await E()}),l(()=>{T&&=(T.remove(),null)}),(e,a)=>(u(),n(`div`,x,[r(`div`,{ref_key:`mapContainer`,ref:C,class:`map-container`,style:s({height:e.height})},null,4),w.value?(u(),n(`div`,S,[i(f(m),{size:`large`})])):t(`v-if`,!0)]))}}),[[`__scopeId`,`data-v-340816cd`]]);export{v as i,_ as n,g as r,C as t};
1
+ import{t as e}from"./export-helper.js";import{NSpin as t}from"naive-ui";import{createCommentVNode as n,createElementBlock as r,createElementVNode as i,createVNode as a,defineComponent as o,nextTick as s,normalizeStyle as c,onMounted as l,onUnmounted as u,openBlock as d,ref as f,unref as p,watch as m}from"vue";import h from"leaflet";import"leaflet/dist/leaflet.css";const g=[{label:`OpenStreetMap`,value:`osm`},{label:`高德地图`,value:`amap`}],_={height:`400px`,center:[39.9042,116.4074],zoom:10,mapType:`osm`},v={url:`https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png`,attribution:`© OpenStreetMap contributors`,maxZoom:19,minZoom:1,tileSize:256,detectRetina:!0},y={apiUrl:`https://webapi.amap.com/maps?v=2.0&key=`,note:`高德地图需要API Key,如需使用请申请:https://lbs.amap.com/api/javascript-api/guide/create/`},b={iconRetinaUrl:`https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-icon-2x.png`,iconUrl:`https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-icon.png`,shadowUrl:`https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-shadow.png`},x={class:`c-map`},S={key:0,class:`map-loading`};var C=e(o({name:`C_Map`,__name:`index`,props:{height:{default:`400px`},center:{default:()=>[39.9042,116.4074]},zoom:{default:10},markers:{default:()=>[]},mapType:{default:`osm`},amapKey:{default:``}},emits:[`ready`,`markerClick`],setup(e,{emit:o}){delete h.Icon.Default.prototype._getIconUrl,h.Icon.Default.mergeOptions(b);let g=e,_=o,C=f(),w=f(!0),T=null,E=async()=>{if(C.value)try{C.value.innerHTML=``,T=h.map(C.value,{center:g.center,zoom:g.zoom,zoomControl:!0,preferCanvas:!0}),h.tileLayer(v.url,v).addTo(T),O(),await s(),requestAnimationFrame(()=>{T?.invalidateSize({reset:!0,pan:!1})}),w.value=!1,_(`ready`,T)}catch(e){console.error(`OpenStreetMap初始化失败:`,e),w.value=!1}},D=async()=>{if(!(!C.value||!g.amapKey))try{C.value.innerHTML=``;let e=document.createElement(`script`);e.type=`text/javascript`,e.src=`${y.apiUrl}${g.amapKey}`,e.onload=()=>{if(window.AMap){let e=new window.AMap.Map(C.value,{zoom:g.zoom,center:g.center});k(e),w.value=!1,_(`ready`,e)}},e.onerror=()=>{w.value=!1},document.head.appendChild(e)}catch{w.value=!1}},O=()=>{!T||g.mapType!==`osm`||!g.markers||(T.eachLayer(e=>{e instanceof h.Marker&&T.removeLayer(e)}),g.markers.forEach(e=>{let t=h.marker([e.lat,e.lng]);e.popup&&(t.bindPopup(e.popup),t.on(`click`,t=>{_(`markerClick`,e,t)})),t.addTo(T)}))},k=e=>{!e||g.mapType!==`amap`||!g.markers||g.markers.forEach(t=>{let n=new window.AMap.Marker({position:[t.lat,t.lng],title:t.popup||``});if(t.popup){let r=new window.AMap.InfoWindow({content:t.popup,offset:new window.AMap.Pixel(0,-30)});n.on(`click`,()=>{r.open(e,n.getPosition()),_(`markerClick`,t,null)})}n.setMap(e)})};return m(()=>g.markers,()=>{T&&g.mapType===`osm`&&O()},{deep:!0}),m(()=>g.mapType,async(e,t)=>{e!==t&&T&&(T.remove(),T=null,w.value=!0,await s(),e===`amap`&&g.amapKey?await D():await E())}),m([()=>g.center,()=>g.zoom],()=>{T&&T.setView(g.center,g.zoom)},{deep:!0}),l(async()=>{await s(),g.mapType===`amap`&&g.amapKey?await D():await E()}),u(()=>{T&&=(T.remove(),null)}),(e,o)=>(d(),r(`div`,x,[i(`div`,{ref_key:`mapContainer`,ref:C,class:`map-container`,style:c({height:e.height})},null,4),w.value?(d(),r(`div`,S,[a(p(t),{size:`large`})])):n(`v-if`,!0)]))}}),[[`__scopeId`,`data-v-35363772`]]);export{v as i,_ as n,g as r,C as t};
2
2
  //# sourceMappingURL=C_Map2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"C_Map2.js","names":[],"sources":["../src/components/C_Map/data.ts","../src/components/C_Map/index.vue"],"sourcesContent":["export const MAP_TYPES = [\r\n { label: \"OpenStreetMap\", value: \"osm\" },\r\n { label: \"高德地图\", value: \"amap\" },\r\n] as const;\r\n\r\nexport type MapType = (typeof MAP_TYPES)[number][\"value\"];\r\n\r\nexport interface MapMarker {\r\n lat: number;\r\n lng: number;\r\n popup?: string;\r\n}\r\n\r\nexport interface MapConfig {\r\n height?: string;\r\n center?: [number, number];\r\n zoom?: number;\r\n markers?: MapMarker[];\r\n mapType?: MapType;\r\n amapKey?: string;\r\n}\r\n\r\nexport const DEFAULT_MAP_CONFIG: Required<\r\n Omit<MapConfig, \"markers\" | \"amapKey\">\r\n> = {\r\n height: \"400px\",\r\n center: [39.9042, 116.4074],\r\n zoom: 10,\r\n mapType: \"osm\",\r\n};\r\n\r\nexport const OSM_TILE_CONFIG = {\r\n url: \"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\",\r\n attribution: \"© OpenStreetMap contributors\",\r\n maxZoom: 19,\r\n minZoom: 1,\r\n tileSize: 256,\r\n detectRetina: true,\r\n} as const;\r\n\r\nexport const AMAP_CONFIG = {\r\n apiUrl: \"https://webapi.amap.com/maps?v=2.0&key=\",\r\n note: \"高德地图需要API Key,如需使用请申请:https://lbs.amap.com/api/javascript-api/guide/create/\",\r\n} as const;\r\n\r\nexport const MAP_ICONS = {\r\n iconRetinaUrl:\r\n \"https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-icon-2x.png\",\r\n iconUrl:\r\n \"https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-icon.png\",\r\n shadowUrl:\r\n \"https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-shadow.png\",\r\n} as const;\r\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-map\">\n <div\n ref=\"mapContainer\"\n class=\"map-container\"\n :style=\"{ height: height }\"\n ></div>\n <div v-if=\"loading\" class=\"map-loading\">\n <NSpin size=\"large\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, nextTick, onMounted, onUnmounted } from \"vue\";\nimport { NSpin } from \"naive-ui\";\nimport L from \"leaflet\";\nimport \"leaflet/dist/leaflet.css\";\nimport { OSM_TILE_CONFIG, AMAP_CONFIG, MAP_ICONS } from \"./data\";\n\ndefineOptions({ name: \"C_Map\" });\n\ndelete (L.Icon.Default.prototype as any)._getIconUrl;\nL.Icon.Default.mergeOptions(MAP_ICONS);\n\ninterface MapMarker {\n lat: number;\n lng: number;\n popup?: string;\n}\n\nconst props = withDefaults(\n defineProps<{\n height?: string;\n center?: [number, number];\n zoom?: number;\n markers?: MapMarker[];\n mapType?: \"osm\" | \"amap\";\n amapKey?: string;\n }>(),\n {\n height: \"400px\",\n center: () => [39.9042, 116.4074],\n zoom: 10,\n markers: () => [],\n mapType: \"osm\",\n amapKey: \"\",\n },\n);\n\nconst emit = defineEmits<{\n ready: [map: any];\n markerClick: [marker: MapMarker, event: any];\n}>();\n\nconst mapContainer = ref<HTMLElement>();\nconst loading = ref(true);\nlet map: any = null;\n\nconst initOSMMap = async () => {\n if (!mapContainer.value) return;\n try {\n mapContainer.value.innerHTML = \"\";\n map = L.map(mapContainer.value, {\n center: props.center,\n zoom: props.zoom,\n zoomControl: true,\n preferCanvas: true,\n });\n const tileLayer = L.tileLayer(OSM_TILE_CONFIG.url, OSM_TILE_CONFIG);\n tileLayer.addTo(map);\n addMarkers();\n await nextTick();\n requestAnimationFrame(() => {\n map?.invalidateSize({ reset: true, pan: false });\n });\n loading.value = false;\n emit(\"ready\", map);\n } catch (error) {\n console.error(\"OpenStreetMap初始化失败:\", error);\n loading.value = false;\n }\n};\n\nconst initAMap = async () => {\n if (!mapContainer.value || !props.amapKey) return;\n try {\n mapContainer.value.innerHTML = \"\";\n const script = document.createElement(\"script\");\n script.type = \"text/javascript\";\n script.src = `${AMAP_CONFIG.apiUrl}${props.amapKey}`;\n script.onload = () => {\n if ((window as any).AMap) {\n const amap = new (window as any).AMap.Map(mapContainer.value, {\n zoom: props.zoom,\n center: props.center,\n });\n addAMapMarkers(amap);\n loading.value = false;\n emit(\"ready\", amap);\n }\n };\n script.onerror = () => {\n loading.value = false;\n };\n document.head.appendChild(script);\n } catch {\n loading.value = false;\n }\n};\n\nconst addMarkers = () => {\n if (!map || props.mapType !== \"osm\" || !props.markers) return;\n map.eachLayer((layer: any) => {\n if (layer instanceof L.Marker) {\n map.removeLayer(layer);\n }\n });\n props.markers.forEach((marker) => {\n const leafletMarker = L.marker([marker.lat, marker.lng]);\n if (marker.popup) {\n leafletMarker.bindPopup(marker.popup);\n leafletMarker.on(\"click\", (event: any) => {\n emit(\"markerClick\", marker, event);\n });\n }\n leafletMarker.addTo(map);\n });\n};\n\nconst addAMapMarkers = (amap: any) => {\n if (!amap || props.mapType !== \"amap\" || !props.markers) return;\n props.markers.forEach((marker) => {\n const amapMarker = new (window as any).AMap.Marker({\n position: [marker.lat, marker.lng],\n title: marker.popup || \"\",\n });\n if (marker.popup) {\n const infoWindow = new (window as any).AMap.InfoWindow({\n content: marker.popup,\n offset: new (window as any).AMap.Pixel(0, -30),\n });\n amapMarker.on(\"click\", () => {\n infoWindow.open(amap, amapMarker.getPosition());\n emit(\"markerClick\", marker, null);\n });\n }\n amapMarker.setMap(amap);\n });\n};\n\nwatch(\n () => props.markers,\n () => {\n if (map && props.mapType === \"osm\") addMarkers();\n },\n { deep: true },\n);\n\nwatch(\n () => props.mapType,\n async (newType, oldType) => {\n if (newType === oldType) return;\n if (map) {\n map.remove();\n map = null;\n loading.value = true;\n await nextTick();\n if (newType === \"amap\" && props.amapKey) await initAMap();\n else await initOSMMap();\n }\n },\n);\n\nwatch(\n [() => props.center, () => props.zoom],\n () => {\n if (map) map.setView(props.center, props.zoom);\n },\n { deep: true },\n);\n\nonMounted(async () => {\n await nextTick();\n if (props.mapType === \"amap\" && props.amapKey) await initAMap();\n else await initOSMMap();\n});\n\nonUnmounted(() => {\n if (map) {\n map.remove();\n map = null;\n }\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@use \"./index.scss\";\n</style>\n"],"mappings":"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"}
1
+ {"version":3,"file":"C_Map2.js","names":["height"],"sources":["../src/components/C_Map/data.ts","../src/components/C_Map/index.vue","../src/components/C_Map/index.vue"],"sourcesContent":["export const MAP_TYPES = [\r\n { label: \"OpenStreetMap\", value: \"osm\" },\r\n { label: \"高德地图\", value: \"amap\" },\r\n] as const;\r\n\r\nexport type MapType = (typeof MAP_TYPES)[number][\"value\"];\r\n\r\nexport interface MapMarker {\r\n lat: number;\r\n lng: number;\r\n popup?: string;\r\n}\r\n\r\nexport interface MapConfig {\r\n height?: string;\r\n center?: [number, number];\r\n zoom?: number;\r\n markers?: MapMarker[];\r\n mapType?: MapType;\r\n amapKey?: string;\r\n}\r\n\r\nexport const DEFAULT_MAP_CONFIG: Required<\r\n Omit<MapConfig, \"markers\" | \"amapKey\">\r\n> = {\r\n height: \"400px\",\r\n center: [39.9042, 116.4074],\r\n zoom: 10,\r\n mapType: \"osm\",\r\n};\r\n\r\nexport const OSM_TILE_CONFIG = {\r\n url: \"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\",\r\n attribution: \"© OpenStreetMap contributors\",\r\n maxZoom: 19,\r\n minZoom: 1,\r\n tileSize: 256,\r\n detectRetina: true,\r\n} as const;\r\n\r\nexport const AMAP_CONFIG = {\r\n apiUrl: \"https://webapi.amap.com/maps?v=2.0&key=\",\r\n note: \"高德地图需要API Key,如需使用请申请:https://lbs.amap.com/api/javascript-api/guide/create/\",\r\n} as const;\r\n\r\nexport const MAP_ICONS = {\r\n iconRetinaUrl:\r\n \"https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-icon-2x.png\",\r\n iconUrl:\r\n \"https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-icon.png\",\r\n shadowUrl:\r\n \"https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/images/marker-shadow.png\",\r\n} as const;\r\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-map\">\n <div\n ref=\"mapContainer\"\n class=\"map-container\"\n :style=\"{ height: height }\"\n ></div>\n <div v-if=\"loading\" class=\"map-loading\">\n <NSpin size=\"large\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, nextTick, onMounted, onUnmounted } from \"vue\";\nimport { NSpin } from \"naive-ui\";\nimport L from \"leaflet\";\nimport \"leaflet/dist/leaflet.css\";\nimport { OSM_TILE_CONFIG, AMAP_CONFIG, MAP_ICONS } from \"./data\";\n\ndefineOptions({ name: \"C_Map\" });\n\ndelete (L.Icon.Default.prototype as any)._getIconUrl;\nL.Icon.Default.mergeOptions(MAP_ICONS);\n\ninterface MapMarker {\n lat: number;\n lng: number;\n popup?: string;\n}\n\nconst props = withDefaults(\n defineProps<{\n height?: string;\n center?: [number, number];\n zoom?: number;\n markers?: MapMarker[];\n mapType?: \"osm\" | \"amap\";\n amapKey?: string;\n }>(),\n {\n height: \"400px\",\n center: () => [39.9042, 116.4074],\n zoom: 10,\n markers: () => [],\n mapType: \"osm\",\n amapKey: \"\",\n },\n);\n\nconst emit = defineEmits<{\n ready: [map: any];\n markerClick: [marker: MapMarker, event: any];\n}>();\n\nconst mapContainer = ref<HTMLElement>();\nconst loading = ref(true);\nlet map: any = null;\n\nconst initOSMMap = async () => {\n if (!mapContainer.value) return;\n try {\n mapContainer.value.innerHTML = \"\";\n map = L.map(mapContainer.value, {\n center: props.center,\n zoom: props.zoom,\n zoomControl: true,\n preferCanvas: true,\n });\n const tileLayer = L.tileLayer(OSM_TILE_CONFIG.url, OSM_TILE_CONFIG);\n tileLayer.addTo(map);\n addMarkers();\n await nextTick();\n requestAnimationFrame(() => {\n map?.invalidateSize({ reset: true, pan: false });\n });\n loading.value = false;\n emit(\"ready\", map);\n } catch (error) {\n console.error(\"OpenStreetMap初始化失败:\", error);\n loading.value = false;\n }\n};\n\nconst initAMap = async () => {\n if (!mapContainer.value || !props.amapKey) return;\n try {\n mapContainer.value.innerHTML = \"\";\n const script = document.createElement(\"script\");\n script.type = \"text/javascript\";\n script.src = `${AMAP_CONFIG.apiUrl}${props.amapKey}`;\n script.onload = () => {\n if ((window as any).AMap) {\n const amap = new (window as any).AMap.Map(mapContainer.value, {\n zoom: props.zoom,\n center: props.center,\n });\n addAMapMarkers(amap);\n loading.value = false;\n emit(\"ready\", amap);\n }\n };\n script.onerror = () => {\n loading.value = false;\n };\n document.head.appendChild(script);\n } catch {\n loading.value = false;\n }\n};\n\nconst addMarkers = () => {\n if (!map || props.mapType !== \"osm\" || !props.markers) return;\n map.eachLayer((layer: any) => {\n if (layer instanceof L.Marker) {\n map.removeLayer(layer);\n }\n });\n props.markers.forEach((marker) => {\n const leafletMarker = L.marker([marker.lat, marker.lng]);\n if (marker.popup) {\n leafletMarker.bindPopup(marker.popup);\n leafletMarker.on(\"click\", (event: any) => {\n emit(\"markerClick\", marker, event);\n });\n }\n leafletMarker.addTo(map);\n });\n};\n\nconst addAMapMarkers = (amap: any) => {\n if (!amap || props.mapType !== \"amap\" || !props.markers) return;\n props.markers.forEach((marker) => {\n const amapMarker = new (window as any).AMap.Marker({\n position: [marker.lat, marker.lng],\n title: marker.popup || \"\",\n });\n if (marker.popup) {\n const infoWindow = new (window as any).AMap.InfoWindow({\n content: marker.popup,\n offset: new (window as any).AMap.Pixel(0, -30),\n });\n amapMarker.on(\"click\", () => {\n infoWindow.open(amap, amapMarker.getPosition());\n emit(\"markerClick\", marker, null);\n });\n }\n amapMarker.setMap(amap);\n });\n};\n\nwatch(\n () => props.markers,\n () => {\n if (map && props.mapType === \"osm\") addMarkers();\n },\n { deep: true },\n);\n\nwatch(\n () => props.mapType,\n async (newType, oldType) => {\n if (newType === oldType) return;\n if (map) {\n map.remove();\n map = null;\n loading.value = true;\n await nextTick();\n if (newType === \"amap\" && props.amapKey) await initAMap();\n else await initOSMMap();\n }\n },\n);\n\nwatch(\n [() => props.center, () => props.zoom],\n () => {\n if (map) map.setView(props.center, props.zoom);\n },\n { deep: true },\n);\n\nonMounted(async () => {\n await nextTick();\n if (props.mapType === \"amap\" && props.amapKey) await initAMap();\n else await initOSMMap();\n});\n\nonUnmounted(() => {\n if (map) {\n map.remove();\n map = null;\n }\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-map\">\n <div\n ref=\"mapContainer\"\n class=\"map-container\"\n :style=\"{ height: height }\"\n ></div>\n <div v-if=\"loading\" class=\"map-loading\">\n <NSpin size=\"large\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, nextTick, onMounted, onUnmounted } from \"vue\";\nimport { NSpin } from \"naive-ui\";\nimport L from \"leaflet\";\nimport \"leaflet/dist/leaflet.css\";\nimport { OSM_TILE_CONFIG, AMAP_CONFIG, MAP_ICONS } from \"./data\";\n\ndefineOptions({ name: \"C_Map\" });\n\ndelete (L.Icon.Default.prototype as any)._getIconUrl;\nL.Icon.Default.mergeOptions(MAP_ICONS);\n\ninterface MapMarker {\n lat: number;\n lng: number;\n popup?: string;\n}\n\nconst props = withDefaults(\n defineProps<{\n height?: string;\n center?: [number, number];\n zoom?: number;\n markers?: MapMarker[];\n mapType?: \"osm\" | \"amap\";\n amapKey?: string;\n }>(),\n {\n height: \"400px\",\n center: () => [39.9042, 116.4074],\n zoom: 10,\n markers: () => [],\n mapType: \"osm\",\n amapKey: \"\",\n },\n);\n\nconst emit = defineEmits<{\n ready: [map: any];\n markerClick: [marker: MapMarker, event: any];\n}>();\n\nconst mapContainer = ref<HTMLElement>();\nconst loading = ref(true);\nlet map: any = null;\n\nconst initOSMMap = async () => {\n if (!mapContainer.value) return;\n try {\n mapContainer.value.innerHTML = \"\";\n map = L.map(mapContainer.value, {\n center: props.center,\n zoom: props.zoom,\n zoomControl: true,\n preferCanvas: true,\n });\n const tileLayer = L.tileLayer(OSM_TILE_CONFIG.url, OSM_TILE_CONFIG);\n tileLayer.addTo(map);\n addMarkers();\n await nextTick();\n requestAnimationFrame(() => {\n map?.invalidateSize({ reset: true, pan: false });\n });\n loading.value = false;\n emit(\"ready\", map);\n } catch (error) {\n console.error(\"OpenStreetMap初始化失败:\", error);\n loading.value = false;\n }\n};\n\nconst initAMap = async () => {\n if (!mapContainer.value || !props.amapKey) return;\n try {\n mapContainer.value.innerHTML = \"\";\n const script = document.createElement(\"script\");\n script.type = \"text/javascript\";\n script.src = `${AMAP_CONFIG.apiUrl}${props.amapKey}`;\n script.onload = () => {\n if ((window as any).AMap) {\n const amap = new (window as any).AMap.Map(mapContainer.value, {\n zoom: props.zoom,\n center: props.center,\n });\n addAMapMarkers(amap);\n loading.value = false;\n emit(\"ready\", amap);\n }\n };\n script.onerror = () => {\n loading.value = false;\n };\n document.head.appendChild(script);\n } catch {\n loading.value = false;\n }\n};\n\nconst addMarkers = () => {\n if (!map || props.mapType !== \"osm\" || !props.markers) return;\n map.eachLayer((layer: any) => {\n if (layer instanceof L.Marker) {\n map.removeLayer(layer);\n }\n });\n props.markers.forEach((marker) => {\n const leafletMarker = L.marker([marker.lat, marker.lng]);\n if (marker.popup) {\n leafletMarker.bindPopup(marker.popup);\n leafletMarker.on(\"click\", (event: any) => {\n emit(\"markerClick\", marker, event);\n });\n }\n leafletMarker.addTo(map);\n });\n};\n\nconst addAMapMarkers = (amap: any) => {\n if (!amap || props.mapType !== \"amap\" || !props.markers) return;\n props.markers.forEach((marker) => {\n const amapMarker = new (window as any).AMap.Marker({\n position: [marker.lat, marker.lng],\n title: marker.popup || \"\",\n });\n if (marker.popup) {\n const infoWindow = new (window as any).AMap.InfoWindow({\n content: marker.popup,\n offset: new (window as any).AMap.Pixel(0, -30),\n });\n amapMarker.on(\"click\", () => {\n infoWindow.open(amap, amapMarker.getPosition());\n emit(\"markerClick\", marker, null);\n });\n }\n amapMarker.setMap(amap);\n });\n};\n\nwatch(\n () => props.markers,\n () => {\n if (map && props.mapType === \"osm\") addMarkers();\n },\n { deep: true },\n);\n\nwatch(\n () => props.mapType,\n async (newType, oldType) => {\n if (newType === oldType) return;\n if (map) {\n map.remove();\n map = null;\n loading.value = true;\n await nextTick();\n if (newType === \"amap\" && props.amapKey) await initAMap();\n else await initOSMMap();\n }\n },\n);\n\nwatch(\n [() => props.center, () => props.zoom],\n () => {\n if (map) map.setView(props.center, props.zoom);\n },\n { deep: true },\n);\n\nonMounted(async () => {\n await nextTick();\n if (props.mapType === \"amap\" && props.amapKey) await initAMap();\n else await initOSMMap();\n});\n\nonUnmounted(() => {\n if (map) {\n map.remove();\n map = null;\n }\n});\n</script>\n\n<style lang=\"scss\" scoped>\n@use \"./index.scss\";\n</style>\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"C_Markdown-DwmI0_0Q.css","names":[],"sources":["../src/components/C_Markdown/index.vue?vue&type=style&index=0&scoped=b64c492a&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//* C_Markdown 组件样式文件 */\n.c-markdown-wrapper[data-v-b64c492a] {\n --c-markdown-dark-icon-color: #ffffff;\n --c-markdown-dark-hover-bg: rgba(255, 255, 255, 0.08);\n --c-markdown-dark-active-bg: rgba(255, 255, 255, 0.12);\n --c-markdown-dark-scrollbar-track: rgba(255, 255, 255, 0.05);\n --c-markdown-dark-scrollbar-thumb: rgba(255, 255, 255, 0.2);\n --c-markdown-dark-scrollbar-hover: rgba(255, 255, 255, 0.3);\n position: relative;\n}\n.c-markdown-wrapper[data-v-b64c492a] .v-md-editor {\n border-radius: 6px;\n border: 1px solid var(--c-border);\n background-color: var(--c-bg-card);\n /* 禁用状态样式 */\n}\n.c-markdown-wrapper[data-v-b64c492a] .v-md-editor:hover {\n border-color: var(--c-primary);\n}\n.c-markdown-wrapper[data-v-b64c492a] .v-md-editor:focus-within {\n border-color: var(--c-primary);\n box-shadow: 0 0 0 2px var(--c-primary-opacity, rgba(24, 160, 88, 0.2));\n}\n.c-markdown-wrapper[data-v-b64c492a] .v-md-editor.disabled {\n background-color: var(--c-bg-disabled, #fafafc);\n cursor: not-allowed;\n}\n.c-markdown-wrapper[data-v-b64c492a] .v-md-editor.disabled .v-md-editor__editor {\n cursor: not-allowed;\n}\n.c-markdown-wrapper[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar {\n background-color: var(--c-bg-card);\n border-bottom: 1px solid var(--c-border);\n}\n.c-markdown-wrapper[data-v-b64c492a] .v-md-editor .v-md-editor__editor-wrapper {\n background-color: var(--c-bg-card);\n}\n.c-markdown-wrapper[data-v-b64c492a] .v-md-editor .v-md-editor__editor {\n background-color: var(--c-bg-card);\n color: var(--c-text-1);\n}\n.c-markdown-wrapper[data-v-b64c492a] .v-md-editor .v-md-editor__editor textarea {\n color: var(--c-text-1);\n caret-color: var(--c-text-1);\n}\n.c-markdown-wrapper[data-v-b64c492a] .v-md-editor .v-md-editor__preview-wrapper {\n background-color: var(--c-bg-card);\n}\n.c-markdown-wrapper[data-v-b64c492a] .v-md-editor .v-md-editor__preview {\n background-color: var(--c-bg-card);\n color: var(--c-text-1);\n}\n.c-markdown-wrapper[data-v-b64c492a] .v-md-editor .v-md-editor__toc-nav-wrapper {\n background-color: var(--c-bg-card);\n border-left: 1px solid var(--c-border);\n}\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar-item {\n color: var(--c-markdown-dark-icon-color);\n}\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar-item:hover {\n background-color: var(--c-markdown-dark-hover-bg);\n}\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar-item.is-active {\n background-color: var(--c-markdown-dark-active-bg);\n}\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar-item svg {\n fill: var(--c-markdown-dark-icon-color);\n opacity: 0.9;\n}\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar-item:hover svg {\n opacity: 1;\n}\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item {\n background-color: transparent;\n}\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item svg {\n fill: var(--c-markdown-dark-icon-color);\n}\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item:hover {\n background-color: var(--c-markdown-dark-hover-bg);\n}\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar-divider {\n background-color: var(--c-border);\n}\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__editor::-webkit-scrollbar,\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__preview::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-track,\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-track {\n background-color: var(--c-markdown-dark-scrollbar-track);\n}\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-thumb,\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-thumb {\n background-color: var(--c-markdown-dark-scrollbar-thumb);\n border-radius: 4px;\n}\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-thumb:hover,\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-thumb:hover {\n background-color: var(--c-markdown-dark-scrollbar-hover);\n}\n.c-markdown-wrapper .word-count[data-v-b64c492a] {\n position: absolute;\n bottom: 8px;\n right: 12px;\n font-size: 12px;\n color: var(--c-text-4);\n background: var(--c-bg-card);\n padding: 2px 6px;\n border-radius: 4px;\n z-index: 10;\n}\n.c-markdown-wrapper .word-count.exceed[data-v-b64c492a] {\n color: var(--c-error);\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
1
+ {"version":3,"file":"C_Markdown-C7lTVJ1S.css","names":[],"sources":["../src/components/C_Markdown/index.vue?vue&type=style&index=0&scoped=7f0dd6ff&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//* C_Markdown 组件样式文件 */\n.c-markdown-wrapper[data-v-7f0dd6ff] {\n --c-markdown-dark-icon-color: #ffffff;\n --c-markdown-dark-hover-bg: rgba(255, 255, 255, 0.08);\n --c-markdown-dark-active-bg: rgba(255, 255, 255, 0.12);\n --c-markdown-dark-scrollbar-track: rgba(255, 255, 255, 0.05);\n --c-markdown-dark-scrollbar-thumb: rgba(255, 255, 255, 0.2);\n --c-markdown-dark-scrollbar-hover: rgba(255, 255, 255, 0.3);\n position: relative;\n}\n.c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor {\n border-radius: 6px;\n border: 1px solid var(--c-border);\n background-color: var(--c-bg-card);\n /* 禁用状态样式 */\n}\n.c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor:hover {\n border-color: var(--c-primary);\n}\n.c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor:focus-within {\n border-color: var(--c-primary);\n box-shadow: 0 0 0 2px var(--c-primary-opacity, rgba(24, 160, 88, 0.2));\n}\n.c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor.disabled {\n background-color: var(--c-bg-disabled, #fafafc);\n cursor: not-allowed;\n}\n.c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor.disabled .v-md-editor__editor {\n cursor: not-allowed;\n}\n.c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar {\n background-color: var(--c-bg-card);\n border-bottom: 1px solid var(--c-border);\n}\n.c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor .v-md-editor__editor-wrapper {\n background-color: var(--c-bg-card);\n}\n.c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor .v-md-editor__editor {\n background-color: var(--c-bg-card);\n color: var(--c-text-1);\n}\n.c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor .v-md-editor__editor textarea {\n color: var(--c-text-1);\n caret-color: var(--c-text-1);\n}\n.c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor .v-md-editor__preview-wrapper {\n background-color: var(--c-bg-card);\n}\n.c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor .v-md-editor__preview {\n background-color: var(--c-bg-card);\n color: var(--c-text-1);\n}\n.c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toc-nav-wrapper {\n background-color: var(--c-bg-card);\n border-left: 1px solid var(--c-border);\n}\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar-item {\n color: var(--c-markdown-dark-icon-color);\n}\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar-item:hover {\n background-color: var(--c-markdown-dark-hover-bg);\n}\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar-item.is-active {\n background-color: var(--c-markdown-dark-active-bg);\n}\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar-item svg {\n fill: var(--c-markdown-dark-icon-color);\n opacity: 0.9;\n}\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar-item:hover svg {\n opacity: 1;\n}\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item {\n background-color: transparent;\n}\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item svg {\n fill: var(--c-markdown-dark-icon-color);\n}\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item:hover {\n background-color: var(--c-markdown-dark-hover-bg);\n}\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar-divider {\n background-color: var(--c-border);\n}\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__editor::-webkit-scrollbar,\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__preview::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-track,\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-track {\n background-color: var(--c-markdown-dark-scrollbar-track);\n}\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-thumb,\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-thumb {\n background-color: var(--c-markdown-dark-scrollbar-thumb);\n border-radius: 4px;\n}\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-thumb:hover,\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-thumb:hover {\n background-color: var(--c-markdown-dark-scrollbar-hover);\n}\n.c-markdown-wrapper .word-count[data-v-7f0dd6ff] {\n position: absolute;\n bottom: 8px;\n right: 12px;\n font-size: 12px;\n color: var(--c-text-4);\n background: var(--c-bg-card);\n padding: 2px 6px;\n border-radius: 4px;\n z-index: 10;\n}\n.c-markdown-wrapper .word-count.exceed[data-v-7f0dd6ff] {\n color: var(--c-error);\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
@@ -1 +1 @@
1
- {"version":3,"file":"C_Markdown-k0794RW0.css","names":[],"sources":["../src/components/C_Markdown/index.vue?vue&type=style&index=0&scoped=b64c492a&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//* C_Markdown 组件样式文件 */\n.c-markdown-wrapper[data-v-b64c492a] {\n --c-markdown-dark-icon-color: #ffffff;\n --c-markdown-dark-hover-bg: rgba(255, 255, 255, 0.08);\n --c-markdown-dark-active-bg: rgba(255, 255, 255, 0.12);\n --c-markdown-dark-scrollbar-track: rgba(255, 255, 255, 0.05);\n --c-markdown-dark-scrollbar-thumb: rgba(255, 255, 255, 0.2);\n --c-markdown-dark-scrollbar-hover: rgba(255, 255, 255, 0.3);\n position: relative;\n}\n.c-markdown-wrapper[data-v-b64c492a] .v-md-editor {\n border-radius: 6px;\n border: 1px solid var(--c-border);\n background-color: var(--c-bg-card);\n /* 禁用状态样式 */\n}\n.c-markdown-wrapper[data-v-b64c492a] .v-md-editor:hover {\n border-color: var(--c-primary);\n}\n.c-markdown-wrapper[data-v-b64c492a] .v-md-editor:focus-within {\n border-color: var(--c-primary);\n box-shadow: 0 0 0 2px var(--c-primary-opacity, rgba(24, 160, 88, 0.2));\n}\n.c-markdown-wrapper[data-v-b64c492a] .v-md-editor.disabled {\n background-color: var(--c-bg-disabled, #fafafc);\n cursor: not-allowed;\n}\n.c-markdown-wrapper[data-v-b64c492a] .v-md-editor.disabled .v-md-editor__editor {\n cursor: not-allowed;\n}\n.c-markdown-wrapper[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar {\n background-color: var(--c-bg-card);\n border-bottom: 1px solid var(--c-border);\n}\n.c-markdown-wrapper[data-v-b64c492a] .v-md-editor .v-md-editor__editor-wrapper {\n background-color: var(--c-bg-card);\n}\n.c-markdown-wrapper[data-v-b64c492a] .v-md-editor .v-md-editor__editor {\n background-color: var(--c-bg-card);\n color: var(--c-text-1);\n}\n.c-markdown-wrapper[data-v-b64c492a] .v-md-editor .v-md-editor__editor textarea {\n color: var(--c-text-1);\n caret-color: var(--c-text-1);\n}\n.c-markdown-wrapper[data-v-b64c492a] .v-md-editor .v-md-editor__preview-wrapper {\n background-color: var(--c-bg-card);\n}\n.c-markdown-wrapper[data-v-b64c492a] .v-md-editor .v-md-editor__preview {\n background-color: var(--c-bg-card);\n color: var(--c-text-1);\n}\n.c-markdown-wrapper[data-v-b64c492a] .v-md-editor .v-md-editor__toc-nav-wrapper {\n background-color: var(--c-bg-card);\n border-left: 1px solid var(--c-border);\n}\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar-item {\n color: var(--c-markdown-dark-icon-color);\n}\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar-item:hover {\n background-color: var(--c-markdown-dark-hover-bg);\n}\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar-item.is-active {\n background-color: var(--c-markdown-dark-active-bg);\n}\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar-item svg {\n fill: var(--c-markdown-dark-icon-color);\n opacity: 0.9;\n}\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar-item:hover svg {\n opacity: 1;\n}\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item {\n background-color: transparent;\n}\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item svg {\n fill: var(--c-markdown-dark-icon-color);\n}\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item:hover {\n background-color: var(--c-markdown-dark-hover-bg);\n}\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar-divider {\n background-color: var(--c-border);\n}\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__editor::-webkit-scrollbar,\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__preview::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-track,\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-track {\n background-color: var(--c-markdown-dark-scrollbar-track);\n}\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-thumb,\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-thumb {\n background-color: var(--c-markdown-dark-scrollbar-thumb);\n border-radius: 4px;\n}\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-thumb:hover,\n.c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-thumb:hover {\n background-color: var(--c-markdown-dark-scrollbar-hover);\n}\n.c-markdown-wrapper .word-count[data-v-b64c492a] {\n position: absolute;\n bottom: 8px;\n right: 12px;\n font-size: 12px;\n color: var(--c-text-4);\n background: var(--c-bg-card);\n padding: 2px 6px;\n border-radius: 4px;\n z-index: 10;\n}\n.c-markdown-wrapper .word-count.exceed[data-v-b64c492a] {\n color: var(--c-error);\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
1
+ {"version":3,"file":"C_Markdown-CZDm_baQ.css","names":[],"sources":["../src/components/C_Markdown/index.vue?vue&type=style&index=0&scoped=7f0dd6ff&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//* C_Markdown 组件样式文件 */\n.c-markdown-wrapper[data-v-7f0dd6ff] {\n --c-markdown-dark-icon-color: #ffffff;\n --c-markdown-dark-hover-bg: rgba(255, 255, 255, 0.08);\n --c-markdown-dark-active-bg: rgba(255, 255, 255, 0.12);\n --c-markdown-dark-scrollbar-track: rgba(255, 255, 255, 0.05);\n --c-markdown-dark-scrollbar-thumb: rgba(255, 255, 255, 0.2);\n --c-markdown-dark-scrollbar-hover: rgba(255, 255, 255, 0.3);\n position: relative;\n}\n.c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor {\n border-radius: 6px;\n border: 1px solid var(--c-border);\n background-color: var(--c-bg-card);\n /* 禁用状态样式 */\n}\n.c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor:hover {\n border-color: var(--c-primary);\n}\n.c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor:focus-within {\n border-color: var(--c-primary);\n box-shadow: 0 0 0 2px var(--c-primary-opacity, rgba(24, 160, 88, 0.2));\n}\n.c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor.disabled {\n background-color: var(--c-bg-disabled, #fafafc);\n cursor: not-allowed;\n}\n.c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor.disabled .v-md-editor__editor {\n cursor: not-allowed;\n}\n.c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar {\n background-color: var(--c-bg-card);\n border-bottom: 1px solid var(--c-border);\n}\n.c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor .v-md-editor__editor-wrapper {\n background-color: var(--c-bg-card);\n}\n.c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor .v-md-editor__editor {\n background-color: var(--c-bg-card);\n color: var(--c-text-1);\n}\n.c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor .v-md-editor__editor textarea {\n color: var(--c-text-1);\n caret-color: var(--c-text-1);\n}\n.c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor .v-md-editor__preview-wrapper {\n background-color: var(--c-bg-card);\n}\n.c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor .v-md-editor__preview {\n background-color: var(--c-bg-card);\n color: var(--c-text-1);\n}\n.c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toc-nav-wrapper {\n background-color: var(--c-bg-card);\n border-left: 1px solid var(--c-border);\n}\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar-item {\n color: var(--c-markdown-dark-icon-color);\n}\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar-item:hover {\n background-color: var(--c-markdown-dark-hover-bg);\n}\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar-item.is-active {\n background-color: var(--c-markdown-dark-active-bg);\n}\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar-item svg {\n fill: var(--c-markdown-dark-icon-color);\n opacity: 0.9;\n}\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar-item:hover svg {\n opacity: 1;\n}\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item {\n background-color: transparent;\n}\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item svg {\n fill: var(--c-markdown-dark-icon-color);\n}\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item:hover {\n background-color: var(--c-markdown-dark-hover-bg);\n}\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar-divider {\n background-color: var(--c-border);\n}\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__editor::-webkit-scrollbar,\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__preview::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-track,\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-track {\n background-color: var(--c-markdown-dark-scrollbar-track);\n}\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-thumb,\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-thumb {\n background-color: var(--c-markdown-dark-scrollbar-thumb);\n border-radius: 4px;\n}\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-thumb:hover,\n.c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-thumb:hover {\n background-color: var(--c-markdown-dark-scrollbar-hover);\n}\n.c-markdown-wrapper .word-count[data-v-7f0dd6ff] {\n position: absolute;\n bottom: 8px;\n right: 12px;\n font-size: 12px;\n color: var(--c-text-4);\n background: var(--c-bg-card);\n padding: 2px 6px;\n border-radius: 4px;\n z-index: 10;\n}\n.c-markdown-wrapper .word-count.exceed[data-v-7f0dd6ff] {\n color: var(--c-error);\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
@@ -1,5 +1,5 @@
1
1
  /* unplugin-vue-components disabled *//* C_Markdown 组件样式文件 */
2
- .c-markdown-wrapper[data-v-b64c492a] {
2
+ .c-markdown-wrapper[data-v-7f0dd6ff] {
3
3
  --c-markdown-dark-icon-color: #ffffff;
4
4
  --c-markdown-dark-hover-bg: rgba(255, 255, 255, 0.08);
5
5
  --c-markdown-dark-active-bg: rgba(255, 255, 255, 0.12);
@@ -8,99 +8,99 @@
8
8
  --c-markdown-dark-scrollbar-hover: rgba(255, 255, 255, 0.3);
9
9
  position: relative;
10
10
  }
11
- .c-markdown-wrapper[data-v-b64c492a] .v-md-editor {
11
+ .c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor {
12
12
  border-radius: 6px;
13
13
  border: 1px solid var(--c-border);
14
14
  background-color: var(--c-bg-card);
15
15
  /* 禁用状态样式 */
16
16
  }
17
- .c-markdown-wrapper[data-v-b64c492a] .v-md-editor:hover {
17
+ .c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor:hover {
18
18
  border-color: var(--c-primary);
19
19
  }
20
- .c-markdown-wrapper[data-v-b64c492a] .v-md-editor:focus-within {
20
+ .c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor:focus-within {
21
21
  border-color: var(--c-primary);
22
22
  box-shadow: 0 0 0 2px var(--c-primary-opacity, rgba(24, 160, 88, 0.2));
23
23
  }
24
- .c-markdown-wrapper[data-v-b64c492a] .v-md-editor.disabled {
24
+ .c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor.disabled {
25
25
  background-color: var(--c-bg-disabled, #fafafc);
26
26
  cursor: not-allowed;
27
27
  }
28
- .c-markdown-wrapper[data-v-b64c492a] .v-md-editor.disabled .v-md-editor__editor {
28
+ .c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor.disabled .v-md-editor__editor {
29
29
  cursor: not-allowed;
30
30
  }
31
- .c-markdown-wrapper[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar {
31
+ .c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar {
32
32
  background-color: var(--c-bg-card);
33
33
  border-bottom: 1px solid var(--c-border);
34
34
  }
35
- .c-markdown-wrapper[data-v-b64c492a] .v-md-editor .v-md-editor__editor-wrapper {
35
+ .c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor .v-md-editor__editor-wrapper {
36
36
  background-color: var(--c-bg-card);
37
37
  }
38
- .c-markdown-wrapper[data-v-b64c492a] .v-md-editor .v-md-editor__editor {
38
+ .c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor .v-md-editor__editor {
39
39
  background-color: var(--c-bg-card);
40
40
  color: var(--c-text-1);
41
41
  }
42
- .c-markdown-wrapper[data-v-b64c492a] .v-md-editor .v-md-editor__editor textarea {
42
+ .c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor .v-md-editor__editor textarea {
43
43
  color: var(--c-text-1);
44
44
  caret-color: var(--c-text-1);
45
45
  }
46
- .c-markdown-wrapper[data-v-b64c492a] .v-md-editor .v-md-editor__preview-wrapper {
46
+ .c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor .v-md-editor__preview-wrapper {
47
47
  background-color: var(--c-bg-card);
48
48
  }
49
- .c-markdown-wrapper[data-v-b64c492a] .v-md-editor .v-md-editor__preview {
49
+ .c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor .v-md-editor__preview {
50
50
  background-color: var(--c-bg-card);
51
51
  color: var(--c-text-1);
52
52
  }
53
- .c-markdown-wrapper[data-v-b64c492a] .v-md-editor .v-md-editor__toc-nav-wrapper {
53
+ .c-markdown-wrapper[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toc-nav-wrapper {
54
54
  background-color: var(--c-bg-card);
55
55
  border-left: 1px solid var(--c-border);
56
56
  }
57
- .c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar-item {
57
+ .c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar-item {
58
58
  color: var(--c-markdown-dark-icon-color);
59
59
  }
60
- .c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar-item:hover {
60
+ .c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar-item:hover {
61
61
  background-color: var(--c-markdown-dark-hover-bg);
62
62
  }
63
- .c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar-item.is-active {
63
+ .c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar-item.is-active {
64
64
  background-color: var(--c-markdown-dark-active-bg);
65
65
  }
66
- .c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar-item svg {
66
+ .c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar-item svg {
67
67
  fill: var(--c-markdown-dark-icon-color);
68
68
  opacity: 0.9;
69
69
  }
70
- .c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar-item:hover svg {
70
+ .c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar-item:hover svg {
71
71
  opacity: 1;
72
72
  }
73
- .c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item {
73
+ .c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item {
74
74
  background-color: transparent;
75
75
  }
76
- .c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item svg {
76
+ .c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item svg {
77
77
  fill: var(--c-markdown-dark-icon-color);
78
78
  }
79
- .c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item:hover {
79
+ .c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar-right .v-md-editor__toolbar-item:hover {
80
80
  background-color: var(--c-markdown-dark-hover-bg);
81
81
  }
82
- .c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__toolbar-divider {
82
+ .c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__toolbar-divider {
83
83
  background-color: var(--c-border);
84
84
  }
85
- .c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__editor::-webkit-scrollbar,
86
- .c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__preview::-webkit-scrollbar {
85
+ .c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__editor::-webkit-scrollbar,
86
+ .c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__preview::-webkit-scrollbar {
87
87
  width: 8px;
88
88
  height: 8px;
89
89
  }
90
- .c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-track,
91
- .c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-track {
90
+ .c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-track,
91
+ .c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-track {
92
92
  background-color: var(--c-markdown-dark-scrollbar-track);
93
93
  }
94
- .c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-thumb,
95
- .c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-thumb {
94
+ .c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-thumb,
95
+ .c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-thumb {
96
96
  background-color: var(--c-markdown-dark-scrollbar-thumb);
97
97
  border-radius: 4px;
98
98
  }
99
- .c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-thumb:hover,
100
- .c-markdown-wrapper.is-dark[data-v-b64c492a] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-thumb:hover {
99
+ .c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__editor::-webkit-scrollbar-thumb:hover,
100
+ .c-markdown-wrapper.is-dark[data-v-7f0dd6ff] .v-md-editor .v-md-editor__preview::-webkit-scrollbar-thumb:hover {
101
101
  background-color: var(--c-markdown-dark-scrollbar-hover);
102
102
  }
103
- .c-markdown-wrapper .word-count[data-v-b64c492a] {
103
+ .c-markdown-wrapper .word-count[data-v-7f0dd6ff] {
104
104
  position: absolute;
105
105
  bottom: 8px;
106
106
  right: 12px;
@@ -111,8 +111,8 @@
111
111
  border-radius: 4px;
112
112
  z-index: 10;
113
113
  }
114
- .c-markdown-wrapper .word-count.exceed[data-v-b64c492a] {
114
+ .c-markdown-wrapper .word-count.exceed[data-v-7f0dd6ff] {
115
115
  color: var(--c-error);
116
116
  }
117
117
 
118
- /*# sourceMappingURL=C_Markdown-DwmI0_0Q.css.map*/
118
+ /*# sourceMappingURL=C_Markdown-C7lTVJ1S.css.map*/
@@ -1 +1 @@
1
- {"version":3,"file":"C_Markdown.js","names":[],"sources":["../src/components/C_Markdown/index.vue"],"sourcesContent":["<!--\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2025-06-20\n * @Description: Markdown 编辑器封装组件\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <div\n class=\"c-markdown-wrapper\"\n :class=\"{ 'is-dark': isDark }\"\n >\n <VMdEditor\n ref=\"editorRef\"\n :model-value=\"modelValue\"\n :height=\"height\"\n :placeholder=\"placeholder\"\n :toolbar=\"toolbar\"\n :mode=\"mode\"\n :upload-image-config=\"computedUploadImageConfig\"\n :toc-nav-position=\"tocNavPosition\"\n :default-fullscreen=\"defaultFullscreen\"\n :autofocus=\"autofocus\"\n :include-level=\"includeLevel\"\n :left-toolbar=\"leftToolbar\"\n :right-toolbar=\"rightToolbar\"\n :default-show-toc=\"true\"\n @update:model-value=\"handleInput\"\n @change=\"handleChange\"\n @save=\"handleSave\"\n @upload-image=\"handleUploadImage\"\n @fullscreen-change=\"handleFullscreenChange\"\n @copy-code-success=\"handleCopyCodeSuccess\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { ref, computed, watch, onMounted } from 'vue'\n import VMdEditor from '@kangc/v-md-editor'\n\n defineOptions({ name: 'C_Markdown' })\n\n export type InsertImageFunction = (config: {\n url: string\n desc?: string\n width?: string | number\n height?: string | number\n }) => void\n\n interface Props {\n modelValue?: string\n height?: string | number\n disabled?: boolean\n placeholder?: string\n mode?: 'edit' | 'editable' | 'preview'\n toolbar?: object\n uploadImageConfig?: {\n accept?: string\n multiple?: boolean\n [key: string]: any\n }\n tocNavPosition?: 'left' | 'right'\n defaultFullscreen?: boolean\n autofocus?: boolean\n includeLevel?: number[]\n leftToolbar?: string\n rightToolbar?: string\n maxLength?: number\n showWordCount?: boolean\n autoSave?: boolean\n autoSaveInterval?: number\n /** 是否为暗色主题(外部传入) */\n isDark?: boolean\n }\n\n const props = withDefaults(defineProps<Props>(), {\n modelValue: '',\n height: '400px',\n disabled: false,\n placeholder: '请输入 Markdown 内容...',\n mode: 'editable',\n tocNavPosition: 'right',\n defaultFullscreen: false,\n autofocus: false,\n includeLevel: () => [1, 2, 3, 4, 5, 6],\n leftToolbar:\n 'undo redo clear | h bold italic strikethrough quote | ul ol table hr | link image code | save',\n rightToolbar: 'preview toc sync-scroll fullscreen',\n maxLength: 50000,\n showWordCount: true,\n autoSave: false,\n autoSaveInterval: 30000,\n isDark: false,\n })\n\n interface Emits {\n 'update:modelValue': [value: string]\n change: [text: string, html: string]\n save: [text: string, html: string]\n 'upload-image': [\n event: Event,\n insertImage: InsertImageFunction,\n files: FileList,\n ]\n 'fullscreen-change': [isFullscreen: boolean]\n 'copy-code-success': [text: string]\n 'word-count-change': [count: number]\n 'auto-save': [text: string]\n 'max-length-exceeded': [currentLength: number, maxLength: number]\n }\n\n const emit = defineEmits<Emits>()\n\n const editorRef = ref<any>(null)\n const cachedHtml = ref('')\n\n const wordCount = computed(() => {\n return props.modelValue?.length || 0\n })\n\n const computedUploadImageConfig = computed(() => {\n const defaultConfig = {\n accept: 'image/*',\n multiple: false,\n }\n return props.uploadImageConfig\n ? { ...defaultConfig, ...props.uploadImageConfig }\n : defaultConfig\n })\n\n onMounted(() => {\n if (props.showWordCount && props.modelValue) {\n emit('word-count-change', props.modelValue.length)\n }\n })\n\n watch(\n () => props.modelValue,\n newValue => {\n if (props.showWordCount) {\n emit('word-count-change', newValue?.length || 0)\n }\n },\n { immediate: true }\n )\n\n const handleInput = (value: string) => {\n if (value.length > props.maxLength) {\n emit('max-length-exceeded', value.length, props.maxLength)\n return\n }\n emit('update:modelValue', value)\n if (props.showWordCount) {\n emit('word-count-change', value.length)\n }\n }\n\n const handleChange = (text: string, html: string) => {\n cachedHtml.value = html\n emit('change', text, html)\n if (props.autoSave) {\n autoSave(text)\n }\n }\n\n const handleSave = (text: string, html: string) => {\n emit('save', text, html)\n }\n\n const handleUploadImage = (\n event: Event,\n insertImage: InsertImageFunction,\n files: FileList\n ) => {\n emit('upload-image', event, insertImage, files)\n }\n\n const handleFullscreenChange = (isFullscreen: boolean) => {\n emit('fullscreen-change', isFullscreen)\n }\n\n const handleCopyCodeSuccess = (text: string) => {\n emit('copy-code-success', text)\n }\n\n let autoSaveTimer: ReturnType<typeof setTimeout> | null = null\n\n const autoSave = (text: string) => {\n if (autoSaveTimer) clearTimeout(autoSaveTimer)\n autoSaveTimer = setTimeout(() => {\n emit('auto-save', text)\n }, props.autoSaveInterval)\n }\n\n const focus = () => {\n editorRef.value?.focus()\n }\n\n const getHtml = (): string => {\n return cachedHtml.value\n }\n\n const insertText = (text: string) => {\n editorRef.value?.insert((selected: string) => ({\n text: `${selected}${text}`,\n selected: text,\n }))\n }\n\n defineExpose({\n focus,\n getHtml,\n insertText,\n wordCount,\n })\n</script>\n\n<style lang=\"scss\" scoped>\n @use './index.scss';\n</style>\n"],"mappings":"giCA4EE,IAAM,EAAQ,EAoCR,EAAO,EAEP,GAAA,EAAA,EAAA,KAAqB,KAAI,CACzB,GAAA,EAAA,EAAA,KAAiB,GAAE,CAEnB,GAAA,EAAA,EAAA,cACG,EAAM,YAAY,QAAU,EACpC,CAEK,GAAA,EAAA,EAAA,cAA2C,CAC/C,IAAM,EAAgB,CACpB,OAAQ,UACR,SAAU,GACZ,CACA,OAAO,EAAM,kBACT,CAAE,GAAG,EAAe,GAAG,EAAM,kBAAkB,CAC/C,GACL,EAED,EAAA,EAAA,eAAgB,CACV,EAAM,eAAiB,EAAM,YAC/B,EAAK,oBAAqB,EAAM,WAAW,OAAM,EAEpD,EAED,EAAA,EAAA,WACQ,EAAM,WACZ,GAAY,CACN,EAAM,eACR,EAAK,oBAAqB,GAAU,QAAU,EAAC,EAGnD,CAAE,UAAW,GAAK,CACpB,CAEA,IAAM,EAAe,GAAkB,CACrC,GAAI,EAAM,OAAS,EAAM,UAAW,CAClC,EAAK,sBAAuB,EAAM,OAAQ,EAAM,UAAS,CACzD,OAEF,EAAK,oBAAqB,EAAK,CAC3B,EAAM,eACR,EAAK,oBAAqB,EAAM,OAAM,EAIpC,GAAgB,EAAc,IAAiB,CACnD,EAAW,MAAQ,EACnB,EAAK,SAAU,EAAM,EAAI,CACrB,EAAM,UACR,EAAS,EAAI,EAIX,GAAc,EAAc,IAAiB,CACjD,EAAK,OAAQ,EAAM,EAAI,EAGnB,GACJ,EACA,EACA,IACG,CACH,EAAK,eAAgB,EAAO,EAAa,EAAK,EAG1C,EAA0B,GAA0B,CACxD,EAAK,oBAAqB,EAAY,EAGlC,EAAyB,GAAiB,CAC9C,EAAK,oBAAqB,EAAI,EAG5B,EAAsD,KAEpD,EAAY,GAAiB,CAC7B,GAAe,aAAa,EAAa,CAC7C,EAAgB,eAAiB,CAC/B,EAAK,YAAa,EAAI,EACrB,EAAM,iBAAgB,SAkB3B,EAAa,CACX,UAhBkB,CAClB,EAAU,OAAO,OAAM,EAgBvB,YAZO,EAAW,MAalB,WAVkB,GAAiB,CACnC,EAAU,OAAO,OAAQ,IAAsB,CAC7C,KAAM,GAAG,IAAW,IACpB,SAAU,EACX,EAAC,EAOF,YACD,CAAA,oDArLI,MAAA,CAzBH,OAAA,EAAA,EAAA,gBAAK,CAAC,qBAAmB,CAAA,UACJ,EAAA,OAAM,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,EAAA,cAAA,EAAA,EAAA,OAuB1B,EAAA,QAAA,CAAA,SApBK,YAAJ,IAAI,EACH,cAAa,EAAA,WACb,OAAQ,EAAA,OACR,YAAa,EAAA,YACb,QAAS,EAAA,QACT,KAAM,EAAA,KACN,sBAAqB,EAAA,MACrB,mBAAkB,EAAA,eAClB,qBAAoB,EAAA,kBACpB,UAAW,EAAA,UACX,gBAAe,EAAA,aACf,eAAc,EAAA,YACd,gBAAe,EAAA,aACf,mBAAkB,GAClB,sBAAoB,EACpB,SAAQ,EACR,OAAM,EACN,cAAc,EACd,mBAAmB,EACnB,kBAAmB"}
1
+ {"version":3,"file":"C_Markdown.js","names":["isDark","modelValue","height","placeholder","toolbar","mode","tocNavPosition","defaultFullscreen","autofocus","includeLevel","leftToolbar","rightToolbar"],"sources":["../src/components/C_Markdown/index.vue","../src/components/C_Markdown/index.vue"],"sourcesContent":["<!--\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2025-06-20\n * @Description: Markdown 编辑器封装组件\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <div\n class=\"c-markdown-wrapper\"\n :class=\"{ 'is-dark': isDark }\"\n >\n <VMdEditor\n ref=\"editorRef\"\n :model-value=\"modelValue\"\n :height=\"height\"\n :placeholder=\"placeholder\"\n :toolbar=\"toolbar\"\n :mode=\"mode\"\n :upload-image-config=\"computedUploadImageConfig\"\n :toc-nav-position=\"tocNavPosition\"\n :default-fullscreen=\"defaultFullscreen\"\n :autofocus=\"autofocus\"\n :include-level=\"includeLevel\"\n :left-toolbar=\"leftToolbar\"\n :right-toolbar=\"rightToolbar\"\n :default-show-toc=\"true\"\n @update:model-value=\"handleInput\"\n @change=\"handleChange\"\n @save=\"handleSave\"\n @upload-image=\"handleUploadImage\"\n @fullscreen-change=\"handleFullscreenChange\"\n @copy-code-success=\"handleCopyCodeSuccess\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { ref, computed, watch, onMounted } from 'vue'\n import VMdEditor from '@kangc/v-md-editor'\n\n defineOptions({ name: 'C_Markdown' })\n\n export type InsertImageFunction = (config: {\n url: string\n desc?: string\n width?: string | number\n height?: string | number\n }) => void\n\n interface Props {\n modelValue?: string\n height?: string | number\n disabled?: boolean\n placeholder?: string\n mode?: 'edit' | 'editable' | 'preview'\n toolbar?: object\n uploadImageConfig?: {\n accept?: string\n multiple?: boolean\n [key: string]: any\n }\n tocNavPosition?: 'left' | 'right'\n defaultFullscreen?: boolean\n autofocus?: boolean\n includeLevel?: number[]\n leftToolbar?: string\n rightToolbar?: string\n maxLength?: number\n showWordCount?: boolean\n autoSave?: boolean\n autoSaveInterval?: number\n /** 是否为暗色主题(外部传入) */\n isDark?: boolean\n }\n\n const props = withDefaults(defineProps<Props>(), {\n modelValue: '',\n height: '400px',\n disabled: false,\n placeholder: '请输入 Markdown 内容...',\n mode: 'editable',\n tocNavPosition: 'right',\n defaultFullscreen: false,\n autofocus: false,\n includeLevel: () => [1, 2, 3, 4, 5, 6],\n leftToolbar:\n 'undo redo clear | h bold italic strikethrough quote | ul ol table hr | link image code | save',\n rightToolbar: 'preview toc sync-scroll fullscreen',\n maxLength: 50000,\n showWordCount: true,\n autoSave: false,\n autoSaveInterval: 30000,\n isDark: false,\n })\n\n interface Emits {\n 'update:modelValue': [value: string]\n change: [text: string, html: string]\n save: [text: string, html: string]\n 'upload-image': [\n event: Event,\n insertImage: InsertImageFunction,\n files: FileList,\n ]\n 'fullscreen-change': [isFullscreen: boolean]\n 'copy-code-success': [text: string]\n 'word-count-change': [count: number]\n 'auto-save': [text: string]\n 'max-length-exceeded': [currentLength: number, maxLength: number]\n }\n\n const emit = defineEmits<Emits>()\n\n const editorRef = ref<any>(null)\n const cachedHtml = ref('')\n\n const wordCount = computed(() => {\n return props.modelValue?.length || 0\n })\n\n const computedUploadImageConfig = computed(() => {\n const defaultConfig = {\n accept: 'image/*',\n multiple: false,\n }\n return props.uploadImageConfig\n ? { ...defaultConfig, ...props.uploadImageConfig }\n : defaultConfig\n })\n\n onMounted(() => {\n if (props.showWordCount && props.modelValue) {\n emit('word-count-change', props.modelValue.length)\n }\n })\n\n watch(\n () => props.modelValue,\n newValue => {\n if (props.showWordCount) {\n emit('word-count-change', newValue?.length || 0)\n }\n },\n { immediate: true }\n )\n\n const handleInput = (value: string) => {\n if (value.length > props.maxLength) {\n emit('max-length-exceeded', value.length, props.maxLength)\n return\n }\n emit('update:modelValue', value)\n if (props.showWordCount) {\n emit('word-count-change', value.length)\n }\n }\n\n const handleChange = (text: string, html: string) => {\n cachedHtml.value = html\n emit('change', text, html)\n if (props.autoSave) {\n autoSave(text)\n }\n }\n\n const handleSave = (text: string, html: string) => {\n emit('save', text, html)\n }\n\n const handleUploadImage = (\n event: Event,\n insertImage: InsertImageFunction,\n files: FileList\n ) => {\n emit('upload-image', event, insertImage, files)\n }\n\n const handleFullscreenChange = (isFullscreen: boolean) => {\n emit('fullscreen-change', isFullscreen)\n }\n\n const handleCopyCodeSuccess = (text: string) => {\n emit('copy-code-success', text)\n }\n\n let autoSaveTimer: ReturnType<typeof setTimeout> | null = null\n\n const autoSave = (text: string) => {\n if (autoSaveTimer) clearTimeout(autoSaveTimer)\n autoSaveTimer = setTimeout(() => {\n emit('auto-save', text)\n }, props.autoSaveInterval)\n }\n\n const focus = () => {\n editorRef.value?.focus()\n }\n\n const getHtml = (): string => {\n return cachedHtml.value\n }\n\n const insertText = (text: string) => {\n editorRef.value?.insert((selected: string) => ({\n text: `${selected}${text}`,\n selected: text,\n }))\n }\n\n defineExpose({\n focus,\n getHtml,\n insertText,\n wordCount,\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-06-20\n * @Description: Markdown 编辑器封装组件\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <div\n class=\"c-markdown-wrapper\"\n :class=\"{ 'is-dark': isDark }\"\n >\n <VMdEditor\n ref=\"editorRef\"\n :model-value=\"modelValue\"\n :height=\"height\"\n :placeholder=\"placeholder\"\n :toolbar=\"toolbar\"\n :mode=\"mode\"\n :upload-image-config=\"computedUploadImageConfig\"\n :toc-nav-position=\"tocNavPosition\"\n :default-fullscreen=\"defaultFullscreen\"\n :autofocus=\"autofocus\"\n :include-level=\"includeLevel\"\n :left-toolbar=\"leftToolbar\"\n :right-toolbar=\"rightToolbar\"\n :default-show-toc=\"true\"\n @update:model-value=\"handleInput\"\n @change=\"handleChange\"\n @save=\"handleSave\"\n @upload-image=\"handleUploadImage\"\n @fullscreen-change=\"handleFullscreenChange\"\n @copy-code-success=\"handleCopyCodeSuccess\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { ref, computed, watch, onMounted } from 'vue'\n import VMdEditor from '@kangc/v-md-editor'\n\n defineOptions({ name: 'C_Markdown' })\n\n export type InsertImageFunction = (config: {\n url: string\n desc?: string\n width?: string | number\n height?: string | number\n }) => void\n\n interface Props {\n modelValue?: string\n height?: string | number\n disabled?: boolean\n placeholder?: string\n mode?: 'edit' | 'editable' | 'preview'\n toolbar?: object\n uploadImageConfig?: {\n accept?: string\n multiple?: boolean\n [key: string]: any\n }\n tocNavPosition?: 'left' | 'right'\n defaultFullscreen?: boolean\n autofocus?: boolean\n includeLevel?: number[]\n leftToolbar?: string\n rightToolbar?: string\n maxLength?: number\n showWordCount?: boolean\n autoSave?: boolean\n autoSaveInterval?: number\n /** 是否为暗色主题(外部传入) */\n isDark?: boolean\n }\n\n const props = withDefaults(defineProps<Props>(), {\n modelValue: '',\n height: '400px',\n disabled: false,\n placeholder: '请输入 Markdown 内容...',\n mode: 'editable',\n tocNavPosition: 'right',\n defaultFullscreen: false,\n autofocus: false,\n includeLevel: () => [1, 2, 3, 4, 5, 6],\n leftToolbar:\n 'undo redo clear | h bold italic strikethrough quote | ul ol table hr | link image code | save',\n rightToolbar: 'preview toc sync-scroll fullscreen',\n maxLength: 50000,\n showWordCount: true,\n autoSave: false,\n autoSaveInterval: 30000,\n isDark: false,\n })\n\n interface Emits {\n 'update:modelValue': [value: string]\n change: [text: string, html: string]\n save: [text: string, html: string]\n 'upload-image': [\n event: Event,\n insertImage: InsertImageFunction,\n files: FileList,\n ]\n 'fullscreen-change': [isFullscreen: boolean]\n 'copy-code-success': [text: string]\n 'word-count-change': [count: number]\n 'auto-save': [text: string]\n 'max-length-exceeded': [currentLength: number, maxLength: number]\n }\n\n const emit = defineEmits<Emits>()\n\n const editorRef = ref<any>(null)\n const cachedHtml = ref('')\n\n const wordCount = computed(() => {\n return props.modelValue?.length || 0\n })\n\n const computedUploadImageConfig = computed(() => {\n const defaultConfig = {\n accept: 'image/*',\n multiple: false,\n }\n return props.uploadImageConfig\n ? { ...defaultConfig, ...props.uploadImageConfig }\n : defaultConfig\n })\n\n onMounted(() => {\n if (props.showWordCount && props.modelValue) {\n emit('word-count-change', props.modelValue.length)\n }\n })\n\n watch(\n () => props.modelValue,\n newValue => {\n if (props.showWordCount) {\n emit('word-count-change', newValue?.length || 0)\n }\n },\n { immediate: true }\n )\n\n const handleInput = (value: string) => {\n if (value.length > props.maxLength) {\n emit('max-length-exceeded', value.length, props.maxLength)\n return\n }\n emit('update:modelValue', value)\n if (props.showWordCount) {\n emit('word-count-change', value.length)\n }\n }\n\n const handleChange = (text: string, html: string) => {\n cachedHtml.value = html\n emit('change', text, html)\n if (props.autoSave) {\n autoSave(text)\n }\n }\n\n const handleSave = (text: string, html: string) => {\n emit('save', text, html)\n }\n\n const handleUploadImage = (\n event: Event,\n insertImage: InsertImageFunction,\n files: FileList\n ) => {\n emit('upload-image', event, insertImage, files)\n }\n\n const handleFullscreenChange = (isFullscreen: boolean) => {\n emit('fullscreen-change', isFullscreen)\n }\n\n const handleCopyCodeSuccess = (text: string) => {\n emit('copy-code-success', text)\n }\n\n let autoSaveTimer: ReturnType<typeof setTimeout> | null = null\n\n const autoSave = (text: string) => {\n if (autoSaveTimer) clearTimeout(autoSaveTimer)\n autoSaveTimer = setTimeout(() => {\n emit('auto-save', text)\n }, props.autoSaveInterval)\n }\n\n const focus = () => {\n editorRef.value?.focus()\n }\n\n const getHtml = (): string => {\n return cachedHtml.value\n }\n\n const insertText = (text: string) => {\n editorRef.value?.insert((selected: string) => ({\n text: `${selected}${text}`,\n selected: text,\n }))\n }\n\n defineExpose({\n focus,\n getHtml,\n insertText,\n wordCount,\n })\n</script>\n\n<style lang=\"scss\" scoped>\n @use './index.scss';\n</style>\n"],"mappings":"giCA4EE,IAAM,EAAQ,EAoCR,EAAO,EAEP,GAAA,EAAA,EAAA,KAAqB,KAAI,CACzB,GAAA,EAAA,EAAA,KAAiB,GAAE,CAEnB,GAAA,EAAA,EAAA,cACG,EAAM,YAAY,QAAU,EACpC,CAEK,GAAA,EAAA,EAAA,cAA2C,CAC/C,IAAM,EAAgB,CACpB,OAAQ,UACR,SAAU,GACZ,CACA,OAAO,EAAM,kBACT,CAAE,GAAG,EAAe,GAAG,EAAM,kBAAkB,CAC/C,GACL,EAED,EAAA,EAAA,eAAgB,CACV,EAAM,eAAiB,EAAM,YAC/B,EAAK,oBAAqB,EAAM,WAAW,OAAM,EAEpD,EAED,EAAA,EAAA,WACQ,EAAM,WACZ,GAAY,CACN,EAAM,eACR,EAAK,oBAAqB,GAAU,QAAU,EAAC,EAGnD,CAAE,UAAW,GAAK,CACpB,CAEA,IAAM,EAAe,GAAkB,CACrC,GAAI,EAAM,OAAS,EAAM,UAAW,CAClC,EAAK,sBAAuB,EAAM,OAAQ,EAAM,UAAS,CACzD,OAEF,EAAK,oBAAqB,EAAK,CAC3B,EAAM,eACR,EAAK,oBAAqB,EAAM,OAAM,EAIpC,GAAgB,EAAc,IAAiB,CACnD,EAAW,MAAQ,EACnB,EAAK,SAAU,EAAM,EAAI,CACrB,EAAM,UACR,EAAS,EAAI,EAIX,GAAc,EAAc,IAAiB,CACjD,EAAK,OAAQ,EAAM,EAAI,EAGnB,GACJ,EACA,EACA,IACG,CACH,EAAK,eAAgB,EAAO,EAAa,EAAK,EAG1C,EAA0B,GAA0B,CACxD,EAAK,oBAAqB,EAAY,EAGlC,EAAyB,GAAiB,CAC9C,EAAK,oBAAqB,EAAI,EAG5B,EAAsD,KAEpD,EAAY,GAAiB,CAC7B,GAAe,aAAa,EAAa,CAC7C,EAAgB,eAAiB,CAC/B,EAAK,YAAa,EAAI,EACrB,EAAM,iBAAgB,SAkB3B,EAAa,CACX,UAhBkB,CAClB,EAAU,OAAO,OAAM,EAgBvB,YAZO,EAAW,MAalB,WAVkB,GAAiB,CACnC,EAAU,OAAO,OAAQ,IAAsB,CAC7C,KAAM,GAAG,IAAW,IACpB,SAAU,EACX,EAAC,EAOF,YACD,CAAA,oDCrLK,MAAA,CAzBJ,OAAA,EAAA,EAAA,gBAAK,CAAC,qBAAoB,CAAA,UACLA,EAAAA,OAAM,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,EAAA,cAAA,EAAA,EAAA,OAuBzB,EAAA,QAAA,CAAA,SApBI,YAAJ,IAAI,EACH,cAAaC,EAAAA,WACb,OAAQC,EAAAA,OACR,YAAaC,EAAAA,YACb,QAASC,EAAAA,QACT,KAAMC,EAAAA,KACN,sBAAqB,EAAA,MACrB,mBAAkBC,EAAAA,eAClB,qBAAoBC,EAAAA,kBACpB,UAAWC,EAAAA,UACX,gBAAeC,EAAAA,aACf,eAAcC,EAAAA,YACd,gBAAeC,EAAAA,aACf,mBAAkB,GAClB,sBAAoB,EACpB,SAAQ,EACR,OAAM,EACN,cAAc,EACd,mBAAmB,EACnB,kBAAmB"}
@@ -1,2 +1,2 @@
1
- import{t as e}from"./export-helper.js";import{computed as t,createElementBlock as n,createVNode as r,defineComponent as i,normalizeClass as a,onMounted as o,openBlock as s,ref as c,unref as l,watch as u}from"vue";import d from"@kangc/v-md-editor";var f=e(i({name:`C_Markdown`,__name:`index`,props:{modelValue:{default:``},height:{default:`400px`},disabled:{type:Boolean,default:!1},placeholder:{default:`请输入 Markdown 内容...`},mode:{default:`editable`},toolbar:{},uploadImageConfig:{},tocNavPosition:{default:`right`},defaultFullscreen:{type:Boolean,default:!1},autofocus:{type:Boolean,default:!1},includeLevel:{default:()=>[1,2,3,4,5,6]},leftToolbar:{default:`undo redo clear | h bold italic strikethrough quote | ul ol table hr | link image code | save`},rightToolbar:{default:`preview toc sync-scroll fullscreen`},maxLength:{default:5e4},showWordCount:{type:Boolean,default:!0},autoSave:{type:Boolean,default:!1},autoSaveInterval:{default:3e4},isDark:{type:Boolean,default:!1}},emits:[`update:modelValue`,`change`,`save`,`upload-image`,`fullscreen-change`,`copy-code-success`,`word-count-change`,`auto-save`,`max-length-exceeded`],setup(e,{expose:i,emit:f}){let p=e,m=f,h=c(null),g=c(``),_=t(()=>p.modelValue?.length||0),v=t(()=>{let e={accept:`image/*`,multiple:!1};return p.uploadImageConfig?{...e,...p.uploadImageConfig}:e});o(()=>{p.showWordCount&&p.modelValue&&m(`word-count-change`,p.modelValue.length)}),u(()=>p.modelValue,e=>{p.showWordCount&&m(`word-count-change`,e?.length||0)},{immediate:!0});let y=e=>{if(e.length>p.maxLength){m(`max-length-exceeded`,e.length,p.maxLength);return}m(`update:modelValue`,e),p.showWordCount&&m(`word-count-change`,e.length)},b=(e,t)=>{g.value=t,m(`change`,e,t),p.autoSave&&E(e)},x=(e,t)=>{m(`save`,e,t)},S=(e,t,n)=>{m(`upload-image`,e,t,n)},C=e=>{m(`fullscreen-change`,e)},w=e=>{m(`copy-code-success`,e)},T=null,E=e=>{T&&clearTimeout(T),T=setTimeout(()=>{m(`auto-save`,e)},p.autoSaveInterval)};return i({focus:()=>{h.value?.focus()},getHtml:()=>g.value,insertText:e=>{h.value?.insert(t=>({text:`${t}${e}`,selected:e}))},wordCount:_}),(e,t)=>(s(),n(`div`,{class:a([`c-markdown-wrapper`,{"is-dark":e.isDark}])},[r(l(d),{ref_key:`editorRef`,ref:h,"model-value":e.modelValue,height:e.height,placeholder:e.placeholder,toolbar:e.toolbar,mode:e.mode,"upload-image-config":v.value,"toc-nav-position":e.tocNavPosition,"default-fullscreen":e.defaultFullscreen,autofocus:e.autofocus,"include-level":e.includeLevel,"left-toolbar":e.leftToolbar,"right-toolbar":e.rightToolbar,"default-show-toc":!0,"onUpdate:modelValue":y,onChange:b,onSave:x,onUploadImage:S,onFullscreenChange:C,onCopyCodeSuccess:w},null,8,[`model-value`,`height`,`placeholder`,`toolbar`,`mode`,`upload-image-config`,`toc-nav-position`,`default-fullscreen`,`autofocus`,`include-level`,`left-toolbar`,`right-toolbar`])],2))}}),[[`__scopeId`,`data-v-b64c492a`]]);export{f as t};
1
+ import{t as e}from"./export-helper.js";import{computed as t,createElementBlock as n,createVNode as r,defineComponent as i,normalizeClass as a,onMounted as o,openBlock as s,ref as c,unref as l,watch as u}from"vue";import d from"@kangc/v-md-editor";var f=e(i({name:`C_Markdown`,__name:`index`,props:{modelValue:{default:``},height:{default:`400px`},disabled:{type:Boolean,default:!1},placeholder:{default:`请输入 Markdown 内容...`},mode:{default:`editable`},toolbar:{},uploadImageConfig:{},tocNavPosition:{default:`right`},defaultFullscreen:{type:Boolean,default:!1},autofocus:{type:Boolean,default:!1},includeLevel:{default:()=>[1,2,3,4,5,6]},leftToolbar:{default:`undo redo clear | h bold italic strikethrough quote | ul ol table hr | link image code | save`},rightToolbar:{default:`preview toc sync-scroll fullscreen`},maxLength:{default:5e4},showWordCount:{type:Boolean,default:!0},autoSave:{type:Boolean,default:!1},autoSaveInterval:{default:3e4},isDark:{type:Boolean,default:!1}},emits:[`update:modelValue`,`change`,`save`,`upload-image`,`fullscreen-change`,`copy-code-success`,`word-count-change`,`auto-save`,`max-length-exceeded`],setup(e,{expose:i,emit:f}){let p=e,m=f,h=c(null),g=c(``),_=t(()=>p.modelValue?.length||0),v=t(()=>{let e={accept:`image/*`,multiple:!1};return p.uploadImageConfig?{...e,...p.uploadImageConfig}:e});o(()=>{p.showWordCount&&p.modelValue&&m(`word-count-change`,p.modelValue.length)}),u(()=>p.modelValue,e=>{p.showWordCount&&m(`word-count-change`,e?.length||0)},{immediate:!0});let y=e=>{if(e.length>p.maxLength){m(`max-length-exceeded`,e.length,p.maxLength);return}m(`update:modelValue`,e),p.showWordCount&&m(`word-count-change`,e.length)},b=(e,t)=>{g.value=t,m(`change`,e,t),p.autoSave&&E(e)},x=(e,t)=>{m(`save`,e,t)},S=(e,t,n)=>{m(`upload-image`,e,t,n)},C=e=>{m(`fullscreen-change`,e)},w=e=>{m(`copy-code-success`,e)},T=null,E=e=>{T&&clearTimeout(T),T=setTimeout(()=>{m(`auto-save`,e)},p.autoSaveInterval)};return i({focus:()=>{h.value?.focus()},getHtml:()=>g.value,insertText:e=>{h.value?.insert(t=>({text:`${t}${e}`,selected:e}))},wordCount:_}),(e,t)=>(s(),n(`div`,{class:a([`c-markdown-wrapper`,{"is-dark":e.isDark}])},[r(l(d),{ref_key:`editorRef`,ref:h,"model-value":e.modelValue,height:e.height,placeholder:e.placeholder,toolbar:e.toolbar,mode:e.mode,"upload-image-config":v.value,"toc-nav-position":e.tocNavPosition,"default-fullscreen":e.defaultFullscreen,autofocus:e.autofocus,"include-level":e.includeLevel,"left-toolbar":e.leftToolbar,"right-toolbar":e.rightToolbar,"default-show-toc":!0,"onUpdate:modelValue":y,onChange:b,onSave:x,onUploadImage:S,onFullscreenChange:C,onCopyCodeSuccess:w},null,8,[`model-value`,`height`,`placeholder`,`toolbar`,`mode`,`upload-image-config`,`toc-nav-position`,`default-fullscreen`,`autofocus`,`include-level`,`left-toolbar`,`right-toolbar`])],2))}}),[[`__scopeId`,`data-v-7f0dd6ff`]]);export{f as t};
2
2
  //# sourceMappingURL=C_Markdown2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"C_Markdown2.js","names":[],"sources":["../src/components/C_Markdown/index.vue"],"sourcesContent":["<!--\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2025-06-20\n * @Description: Markdown 编辑器封装组件\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <div\n class=\"c-markdown-wrapper\"\n :class=\"{ 'is-dark': isDark }\"\n >\n <VMdEditor\n ref=\"editorRef\"\n :model-value=\"modelValue\"\n :height=\"height\"\n :placeholder=\"placeholder\"\n :toolbar=\"toolbar\"\n :mode=\"mode\"\n :upload-image-config=\"computedUploadImageConfig\"\n :toc-nav-position=\"tocNavPosition\"\n :default-fullscreen=\"defaultFullscreen\"\n :autofocus=\"autofocus\"\n :include-level=\"includeLevel\"\n :left-toolbar=\"leftToolbar\"\n :right-toolbar=\"rightToolbar\"\n :default-show-toc=\"true\"\n @update:model-value=\"handleInput\"\n @change=\"handleChange\"\n @save=\"handleSave\"\n @upload-image=\"handleUploadImage\"\n @fullscreen-change=\"handleFullscreenChange\"\n @copy-code-success=\"handleCopyCodeSuccess\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { ref, computed, watch, onMounted } from 'vue'\n import VMdEditor from '@kangc/v-md-editor'\n\n defineOptions({ name: 'C_Markdown' })\n\n export type InsertImageFunction = (config: {\n url: string\n desc?: string\n width?: string | number\n height?: string | number\n }) => void\n\n interface Props {\n modelValue?: string\n height?: string | number\n disabled?: boolean\n placeholder?: string\n mode?: 'edit' | 'editable' | 'preview'\n toolbar?: object\n uploadImageConfig?: {\n accept?: string\n multiple?: boolean\n [key: string]: any\n }\n tocNavPosition?: 'left' | 'right'\n defaultFullscreen?: boolean\n autofocus?: boolean\n includeLevel?: number[]\n leftToolbar?: string\n rightToolbar?: string\n maxLength?: number\n showWordCount?: boolean\n autoSave?: boolean\n autoSaveInterval?: number\n /** 是否为暗色主题(外部传入) */\n isDark?: boolean\n }\n\n const props = withDefaults(defineProps<Props>(), {\n modelValue: '',\n height: '400px',\n disabled: false,\n placeholder: '请输入 Markdown 内容...',\n mode: 'editable',\n tocNavPosition: 'right',\n defaultFullscreen: false,\n autofocus: false,\n includeLevel: () => [1, 2, 3, 4, 5, 6],\n leftToolbar:\n 'undo redo clear | h bold italic strikethrough quote | ul ol table hr | link image code | save',\n rightToolbar: 'preview toc sync-scroll fullscreen',\n maxLength: 50000,\n showWordCount: true,\n autoSave: false,\n autoSaveInterval: 30000,\n isDark: false,\n })\n\n interface Emits {\n 'update:modelValue': [value: string]\n change: [text: string, html: string]\n save: [text: string, html: string]\n 'upload-image': [\n event: Event,\n insertImage: InsertImageFunction,\n files: FileList,\n ]\n 'fullscreen-change': [isFullscreen: boolean]\n 'copy-code-success': [text: string]\n 'word-count-change': [count: number]\n 'auto-save': [text: string]\n 'max-length-exceeded': [currentLength: number, maxLength: number]\n }\n\n const emit = defineEmits<Emits>()\n\n const editorRef = ref<any>(null)\n const cachedHtml = ref('')\n\n const wordCount = computed(() => {\n return props.modelValue?.length || 0\n })\n\n const computedUploadImageConfig = computed(() => {\n const defaultConfig = {\n accept: 'image/*',\n multiple: false,\n }\n return props.uploadImageConfig\n ? { ...defaultConfig, ...props.uploadImageConfig }\n : defaultConfig\n })\n\n onMounted(() => {\n if (props.showWordCount && props.modelValue) {\n emit('word-count-change', props.modelValue.length)\n }\n })\n\n watch(\n () => props.modelValue,\n newValue => {\n if (props.showWordCount) {\n emit('word-count-change', newValue?.length || 0)\n }\n },\n { immediate: true }\n )\n\n const handleInput = (value: string) => {\n if (value.length > props.maxLength) {\n emit('max-length-exceeded', value.length, props.maxLength)\n return\n }\n emit('update:modelValue', value)\n if (props.showWordCount) {\n emit('word-count-change', value.length)\n }\n }\n\n const handleChange = (text: string, html: string) => {\n cachedHtml.value = html\n emit('change', text, html)\n if (props.autoSave) {\n autoSave(text)\n }\n }\n\n const handleSave = (text: string, html: string) => {\n emit('save', text, html)\n }\n\n const handleUploadImage = (\n event: Event,\n insertImage: InsertImageFunction,\n files: FileList\n ) => {\n emit('upload-image', event, insertImage, files)\n }\n\n const handleFullscreenChange = (isFullscreen: boolean) => {\n emit('fullscreen-change', isFullscreen)\n }\n\n const handleCopyCodeSuccess = (text: string) => {\n emit('copy-code-success', text)\n }\n\n let autoSaveTimer: ReturnType<typeof setTimeout> | null = null\n\n const autoSave = (text: string) => {\n if (autoSaveTimer) clearTimeout(autoSaveTimer)\n autoSaveTimer = setTimeout(() => {\n emit('auto-save', text)\n }, props.autoSaveInterval)\n }\n\n const focus = () => {\n editorRef.value?.focus()\n }\n\n const getHtml = (): string => {\n return cachedHtml.value\n }\n\n const insertText = (text: string) => {\n editorRef.value?.insert((selected: string) => ({\n text: `${selected}${text}`,\n selected: text,\n }))\n }\n\n defineExpose({\n focus,\n getHtml,\n insertText,\n wordCount,\n })\n</script>\n\n<style lang=\"scss\" scoped>\n @use './index.scss';\n</style>\n"],"mappings":"uoCA4EE,IAAM,EAAQ,EAoCR,EAAO,EAEP,EAAY,EAAS,KAAI,CACzB,EAAa,EAAI,GAAE,CAEnB,EAAY,MACT,EAAM,YAAY,QAAU,EACpC,CAEK,EAA4B,MAAe,CAC/C,IAAM,EAAgB,CACpB,OAAQ,UACR,SAAU,GACZ,CACA,OAAO,EAAM,kBACT,CAAE,GAAG,EAAe,GAAG,EAAM,kBAAkB,CAC/C,GACL,CAED,MAAgB,CACV,EAAM,eAAiB,EAAM,YAC/B,EAAK,oBAAqB,EAAM,WAAW,OAAM,EAEpD,CAED,MACQ,EAAM,WACZ,GAAY,CACN,EAAM,eACR,EAAK,oBAAqB,GAAU,QAAU,EAAC,EAGnD,CAAE,UAAW,GAAK,CACpB,CAEA,IAAM,EAAe,GAAkB,CACrC,GAAI,EAAM,OAAS,EAAM,UAAW,CAClC,EAAK,sBAAuB,EAAM,OAAQ,EAAM,UAAS,CACzD,OAEF,EAAK,oBAAqB,EAAK,CAC3B,EAAM,eACR,EAAK,oBAAqB,EAAM,OAAM,EAIpC,GAAgB,EAAc,IAAiB,CACnD,EAAW,MAAQ,EACnB,EAAK,SAAU,EAAM,EAAI,CACrB,EAAM,UACR,EAAS,EAAI,EAIX,GAAc,EAAc,IAAiB,CACjD,EAAK,OAAQ,EAAM,EAAI,EAGnB,GACJ,EACA,EACA,IACG,CACH,EAAK,eAAgB,EAAO,EAAa,EAAK,EAG1C,EAA0B,GAA0B,CACxD,EAAK,oBAAqB,EAAY,EAGlC,EAAyB,GAAiB,CAC9C,EAAK,oBAAqB,EAAI,EAG5B,EAAsD,KAEpD,EAAY,GAAiB,CAC7B,GAAe,aAAa,EAAa,CAC7C,EAAgB,eAAiB,CAC/B,EAAK,YAAa,EAAI,EACrB,EAAM,iBAAgB,SAkB3B,EAAa,CACX,UAhBkB,CAClB,EAAU,OAAO,OAAM,EAgBvB,YAZO,EAAW,MAalB,WAVkB,GAAiB,CACnC,EAAU,OAAO,OAAQ,IAAsB,CAC7C,KAAM,GAAG,IAAW,IACpB,SAAU,EACX,EAAC,EAOF,YACD,CAAA,aA/MD,EA0BK,MAAA,CAzBH,MAAK,EAAA,CAAC,qBAAmB,CAAA,UACJ,EAAA,OAAM,CAAA,CAAA,CAAA,CAAA,CAE3B,EAqBC,EAAA,EAAA,CAAA,SApBK,YAAJ,IAAI,EACH,cAAa,EAAA,WACb,OAAQ,EAAA,OACR,YAAa,EAAA,YACb,QAAS,EAAA,QACT,KAAM,EAAA,KACN,sBAAqB,EAAA,MACrB,mBAAkB,EAAA,eAClB,qBAAoB,EAAA,kBACpB,UAAW,EAAA,UACX,gBAAe,EAAA,aACf,eAAc,EAAA,YACd,gBAAe,EAAA,aACf,mBAAkB,GAClB,sBAAoB,EACpB,SAAQ,EACR,OAAM,EACN,cAAc,EACd,mBAAmB,EACnB,kBAAmB"}
1
+ {"version":3,"file":"C_Markdown2.js","names":["isDark","modelValue","height","placeholder","toolbar","mode","tocNavPosition","defaultFullscreen","autofocus","includeLevel","leftToolbar","rightToolbar"],"sources":["../src/components/C_Markdown/index.vue","../src/components/C_Markdown/index.vue"],"sourcesContent":["<!--\n * @Author: ChenYu ycyplus@gmail.com\n * @Date: 2025-06-20\n * @Description: Markdown 编辑器封装组件\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <div\n class=\"c-markdown-wrapper\"\n :class=\"{ 'is-dark': isDark }\"\n >\n <VMdEditor\n ref=\"editorRef\"\n :model-value=\"modelValue\"\n :height=\"height\"\n :placeholder=\"placeholder\"\n :toolbar=\"toolbar\"\n :mode=\"mode\"\n :upload-image-config=\"computedUploadImageConfig\"\n :toc-nav-position=\"tocNavPosition\"\n :default-fullscreen=\"defaultFullscreen\"\n :autofocus=\"autofocus\"\n :include-level=\"includeLevel\"\n :left-toolbar=\"leftToolbar\"\n :right-toolbar=\"rightToolbar\"\n :default-show-toc=\"true\"\n @update:model-value=\"handleInput\"\n @change=\"handleChange\"\n @save=\"handleSave\"\n @upload-image=\"handleUploadImage\"\n @fullscreen-change=\"handleFullscreenChange\"\n @copy-code-success=\"handleCopyCodeSuccess\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { ref, computed, watch, onMounted } from 'vue'\n import VMdEditor from '@kangc/v-md-editor'\n\n defineOptions({ name: 'C_Markdown' })\n\n export type InsertImageFunction = (config: {\n url: string\n desc?: string\n width?: string | number\n height?: string | number\n }) => void\n\n interface Props {\n modelValue?: string\n height?: string | number\n disabled?: boolean\n placeholder?: string\n mode?: 'edit' | 'editable' | 'preview'\n toolbar?: object\n uploadImageConfig?: {\n accept?: string\n multiple?: boolean\n [key: string]: any\n }\n tocNavPosition?: 'left' | 'right'\n defaultFullscreen?: boolean\n autofocus?: boolean\n includeLevel?: number[]\n leftToolbar?: string\n rightToolbar?: string\n maxLength?: number\n showWordCount?: boolean\n autoSave?: boolean\n autoSaveInterval?: number\n /** 是否为暗色主题(外部传入) */\n isDark?: boolean\n }\n\n const props = withDefaults(defineProps<Props>(), {\n modelValue: '',\n height: '400px',\n disabled: false,\n placeholder: '请输入 Markdown 内容...',\n mode: 'editable',\n tocNavPosition: 'right',\n defaultFullscreen: false,\n autofocus: false,\n includeLevel: () => [1, 2, 3, 4, 5, 6],\n leftToolbar:\n 'undo redo clear | h bold italic strikethrough quote | ul ol table hr | link image code | save',\n rightToolbar: 'preview toc sync-scroll fullscreen',\n maxLength: 50000,\n showWordCount: true,\n autoSave: false,\n autoSaveInterval: 30000,\n isDark: false,\n })\n\n interface Emits {\n 'update:modelValue': [value: string]\n change: [text: string, html: string]\n save: [text: string, html: string]\n 'upload-image': [\n event: Event,\n insertImage: InsertImageFunction,\n files: FileList,\n ]\n 'fullscreen-change': [isFullscreen: boolean]\n 'copy-code-success': [text: string]\n 'word-count-change': [count: number]\n 'auto-save': [text: string]\n 'max-length-exceeded': [currentLength: number, maxLength: number]\n }\n\n const emit = defineEmits<Emits>()\n\n const editorRef = ref<any>(null)\n const cachedHtml = ref('')\n\n const wordCount = computed(() => {\n return props.modelValue?.length || 0\n })\n\n const computedUploadImageConfig = computed(() => {\n const defaultConfig = {\n accept: 'image/*',\n multiple: false,\n }\n return props.uploadImageConfig\n ? { ...defaultConfig, ...props.uploadImageConfig }\n : defaultConfig\n })\n\n onMounted(() => {\n if (props.showWordCount && props.modelValue) {\n emit('word-count-change', props.modelValue.length)\n }\n })\n\n watch(\n () => props.modelValue,\n newValue => {\n if (props.showWordCount) {\n emit('word-count-change', newValue?.length || 0)\n }\n },\n { immediate: true }\n )\n\n const handleInput = (value: string) => {\n if (value.length > props.maxLength) {\n emit('max-length-exceeded', value.length, props.maxLength)\n return\n }\n emit('update:modelValue', value)\n if (props.showWordCount) {\n emit('word-count-change', value.length)\n }\n }\n\n const handleChange = (text: string, html: string) => {\n cachedHtml.value = html\n emit('change', text, html)\n if (props.autoSave) {\n autoSave(text)\n }\n }\n\n const handleSave = (text: string, html: string) => {\n emit('save', text, html)\n }\n\n const handleUploadImage = (\n event: Event,\n insertImage: InsertImageFunction,\n files: FileList\n ) => {\n emit('upload-image', event, insertImage, files)\n }\n\n const handleFullscreenChange = (isFullscreen: boolean) => {\n emit('fullscreen-change', isFullscreen)\n }\n\n const handleCopyCodeSuccess = (text: string) => {\n emit('copy-code-success', text)\n }\n\n let autoSaveTimer: ReturnType<typeof setTimeout> | null = null\n\n const autoSave = (text: string) => {\n if (autoSaveTimer) clearTimeout(autoSaveTimer)\n autoSaveTimer = setTimeout(() => {\n emit('auto-save', text)\n }, props.autoSaveInterval)\n }\n\n const focus = () => {\n editorRef.value?.focus()\n }\n\n const getHtml = (): string => {\n return cachedHtml.value\n }\n\n const insertText = (text: string) => {\n editorRef.value?.insert((selected: string) => ({\n text: `${selected}${text}`,\n selected: text,\n }))\n }\n\n defineExpose({\n focus,\n getHtml,\n insertText,\n wordCount,\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-06-20\n * @Description: Markdown 编辑器封装组件\n * @Migration: naive-ui-components 组件库迁移版本\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <div\n class=\"c-markdown-wrapper\"\n :class=\"{ 'is-dark': isDark }\"\n >\n <VMdEditor\n ref=\"editorRef\"\n :model-value=\"modelValue\"\n :height=\"height\"\n :placeholder=\"placeholder\"\n :toolbar=\"toolbar\"\n :mode=\"mode\"\n :upload-image-config=\"computedUploadImageConfig\"\n :toc-nav-position=\"tocNavPosition\"\n :default-fullscreen=\"defaultFullscreen\"\n :autofocus=\"autofocus\"\n :include-level=\"includeLevel\"\n :left-toolbar=\"leftToolbar\"\n :right-toolbar=\"rightToolbar\"\n :default-show-toc=\"true\"\n @update:model-value=\"handleInput\"\n @change=\"handleChange\"\n @save=\"handleSave\"\n @upload-image=\"handleUploadImage\"\n @fullscreen-change=\"handleFullscreenChange\"\n @copy-code-success=\"handleCopyCodeSuccess\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { ref, computed, watch, onMounted } from 'vue'\n import VMdEditor from '@kangc/v-md-editor'\n\n defineOptions({ name: 'C_Markdown' })\n\n export type InsertImageFunction = (config: {\n url: string\n desc?: string\n width?: string | number\n height?: string | number\n }) => void\n\n interface Props {\n modelValue?: string\n height?: string | number\n disabled?: boolean\n placeholder?: string\n mode?: 'edit' | 'editable' | 'preview'\n toolbar?: object\n uploadImageConfig?: {\n accept?: string\n multiple?: boolean\n [key: string]: any\n }\n tocNavPosition?: 'left' | 'right'\n defaultFullscreen?: boolean\n autofocus?: boolean\n includeLevel?: number[]\n leftToolbar?: string\n rightToolbar?: string\n maxLength?: number\n showWordCount?: boolean\n autoSave?: boolean\n autoSaveInterval?: number\n /** 是否为暗色主题(外部传入) */\n isDark?: boolean\n }\n\n const props = withDefaults(defineProps<Props>(), {\n modelValue: '',\n height: '400px',\n disabled: false,\n placeholder: '请输入 Markdown 内容...',\n mode: 'editable',\n tocNavPosition: 'right',\n defaultFullscreen: false,\n autofocus: false,\n includeLevel: () => [1, 2, 3, 4, 5, 6],\n leftToolbar:\n 'undo redo clear | h bold italic strikethrough quote | ul ol table hr | link image code | save',\n rightToolbar: 'preview toc sync-scroll fullscreen',\n maxLength: 50000,\n showWordCount: true,\n autoSave: false,\n autoSaveInterval: 30000,\n isDark: false,\n })\n\n interface Emits {\n 'update:modelValue': [value: string]\n change: [text: string, html: string]\n save: [text: string, html: string]\n 'upload-image': [\n event: Event,\n insertImage: InsertImageFunction,\n files: FileList,\n ]\n 'fullscreen-change': [isFullscreen: boolean]\n 'copy-code-success': [text: string]\n 'word-count-change': [count: number]\n 'auto-save': [text: string]\n 'max-length-exceeded': [currentLength: number, maxLength: number]\n }\n\n const emit = defineEmits<Emits>()\n\n const editorRef = ref<any>(null)\n const cachedHtml = ref('')\n\n const wordCount = computed(() => {\n return props.modelValue?.length || 0\n })\n\n const computedUploadImageConfig = computed(() => {\n const defaultConfig = {\n accept: 'image/*',\n multiple: false,\n }\n return props.uploadImageConfig\n ? { ...defaultConfig, ...props.uploadImageConfig }\n : defaultConfig\n })\n\n onMounted(() => {\n if (props.showWordCount && props.modelValue) {\n emit('word-count-change', props.modelValue.length)\n }\n })\n\n watch(\n () => props.modelValue,\n newValue => {\n if (props.showWordCount) {\n emit('word-count-change', newValue?.length || 0)\n }\n },\n { immediate: true }\n )\n\n const handleInput = (value: string) => {\n if (value.length > props.maxLength) {\n emit('max-length-exceeded', value.length, props.maxLength)\n return\n }\n emit('update:modelValue', value)\n if (props.showWordCount) {\n emit('word-count-change', value.length)\n }\n }\n\n const handleChange = (text: string, html: string) => {\n cachedHtml.value = html\n emit('change', text, html)\n if (props.autoSave) {\n autoSave(text)\n }\n }\n\n const handleSave = (text: string, html: string) => {\n emit('save', text, html)\n }\n\n const handleUploadImage = (\n event: Event,\n insertImage: InsertImageFunction,\n files: FileList\n ) => {\n emit('upload-image', event, insertImage, files)\n }\n\n const handleFullscreenChange = (isFullscreen: boolean) => {\n emit('fullscreen-change', isFullscreen)\n }\n\n const handleCopyCodeSuccess = (text: string) => {\n emit('copy-code-success', text)\n }\n\n let autoSaveTimer: ReturnType<typeof setTimeout> | null = null\n\n const autoSave = (text: string) => {\n if (autoSaveTimer) clearTimeout(autoSaveTimer)\n autoSaveTimer = setTimeout(() => {\n emit('auto-save', text)\n }, props.autoSaveInterval)\n }\n\n const focus = () => {\n editorRef.value?.focus()\n }\n\n const getHtml = (): string => {\n return cachedHtml.value\n }\n\n const insertText = (text: string) => {\n editorRef.value?.insert((selected: string) => ({\n text: `${selected}${text}`,\n selected: text,\n }))\n }\n\n defineExpose({\n focus,\n getHtml,\n insertText,\n wordCount,\n })\n</script>\n\n<style lang=\"scss\" scoped>\n @use './index.scss';\n</style>\n"],"mappings":"uoCA4EE,IAAM,EAAQ,EAoCR,EAAO,EAEP,EAAY,EAAS,KAAI,CACzB,EAAa,EAAI,GAAE,CAEnB,EAAY,MACT,EAAM,YAAY,QAAU,EACpC,CAEK,EAA4B,MAAe,CAC/C,IAAM,EAAgB,CACpB,OAAQ,UACR,SAAU,GACZ,CACA,OAAO,EAAM,kBACT,CAAE,GAAG,EAAe,GAAG,EAAM,kBAAkB,CAC/C,GACL,CAED,MAAgB,CACV,EAAM,eAAiB,EAAM,YAC/B,EAAK,oBAAqB,EAAM,WAAW,OAAM,EAEpD,CAED,MACQ,EAAM,WACZ,GAAY,CACN,EAAM,eACR,EAAK,oBAAqB,GAAU,QAAU,EAAC,EAGnD,CAAE,UAAW,GAAK,CACpB,CAEA,IAAM,EAAe,GAAkB,CACrC,GAAI,EAAM,OAAS,EAAM,UAAW,CAClC,EAAK,sBAAuB,EAAM,OAAQ,EAAM,UAAS,CACzD,OAEF,EAAK,oBAAqB,EAAK,CAC3B,EAAM,eACR,EAAK,oBAAqB,EAAM,OAAM,EAIpC,GAAgB,EAAc,IAAiB,CACnD,EAAW,MAAQ,EACnB,EAAK,SAAU,EAAM,EAAI,CACrB,EAAM,UACR,EAAS,EAAI,EAIX,GAAc,EAAc,IAAiB,CACjD,EAAK,OAAQ,EAAM,EAAI,EAGnB,GACJ,EACA,EACA,IACG,CACH,EAAK,eAAgB,EAAO,EAAa,EAAK,EAG1C,EAA0B,GAA0B,CACxD,EAAK,oBAAqB,EAAY,EAGlC,EAAyB,GAAiB,CAC9C,EAAK,oBAAqB,EAAI,EAG5B,EAAsD,KAEpD,EAAY,GAAiB,CAC7B,GAAe,aAAa,EAAa,CAC7C,EAAgB,eAAiB,CAC/B,EAAK,YAAa,EAAI,EACrB,EAAM,iBAAgB,SAkB3B,EAAa,CACX,UAhBkB,CAClB,EAAU,OAAO,OAAM,EAgBvB,YAZO,EAAW,MAalB,WAVkB,GAAiB,CACnC,EAAU,OAAO,OAAQ,IAAsB,CAC7C,KAAM,GAAG,IAAW,IACpB,SAAU,EACX,EAAC,EAOF,YACD,CAAA,aC/MD,EA0BM,MAAA,CAzBJ,MAAK,EAAA,CAAC,qBAAoB,CAAA,UACLA,EAAAA,OAAM,CAAA,CAAA,CAAA,CAAA,CAE3B,EAqBE,EAAA,EAAA,CAAA,SApBI,YAAJ,IAAI,EACH,cAAaC,EAAAA,WACb,OAAQC,EAAAA,OACR,YAAaC,EAAAA,YACb,QAASC,EAAAA,QACT,KAAMC,EAAAA,KACN,sBAAqB,EAAA,MACrB,mBAAkBC,EAAAA,eAClB,qBAAoBC,EAAAA,kBACpB,UAAWC,EAAAA,UACX,gBAAeC,EAAAA,aACf,eAAcC,EAAAA,YACd,gBAAeC,EAAAA,aACf,mBAAkB,GAClB,sBAAoB,EACpB,SAAQ,EACR,OAAM,EACN,cAAc,EACd,mBAAmB,EACnB,kBAAmB"}
@@ -1 +1 @@
1
- {"version":3,"file":"C_Menu.js","names":[],"sources":["../src/components/C_Menu/index.vue"],"sourcesContent":["<!--\n * @Description: 通用菜单组件 — 基于 NMenu 的树形导航菜单\n *\n * 支持两种数据输入模式:\n * 1. `options` — 直传 NMenu 原生 MenuOption[](零转换,高级用户)\n * 2. `routes` — 传入路由数据,自动通过内置适配器转换为 MenuOption[]\n *\n * @example 路由模式(推荐)\n * ```vue\n * <C_Menu\n * :routes=\"menuData\"\n * :label-formatter=\"$t\"\n * @select=\"router.push\"\n * />\n * ```\n *\n * @example 原生模式\n * ```vue\n * <C_Menu\n * :options=\"nMenuOptions\"\n * @select=\"router.push\"\n * />\n * ```\n *\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <NMenu\n ref=\"menuRef\"\n :options=\"mergedOptions\"\n :expanded-keys=\"expandedKeys\"\n :value=\"activeKey\"\n :mode=\"mode\"\n :collapsed=\"collapsed\"\n :collapsed-width=\"collapsedWidth\"\n :collapsed-icon-size=\"collapsedIconSize\"\n :inverted=\"inverted\"\n :theme-overrides=\"themeOverrides\"\n :dropdown-props=\"dropdownProps\"\n :indent=\"indent\"\n :root-indent=\"rootIndent\"\n @update:value=\"handleMenuClick\"\n @update:expanded-keys=\"onExpandedKeysChange\"\n />\n</template>\n\n<script setup lang=\"ts\">\n import { ref, computed, watch, nextTick, onMounted } from 'vue'\n import {\n type MenuOption,\n type MenuInst,\n type DropdownProps,\n } from 'naive-ui/es'\n import {\n createMenuOptions,\n type RouteItem,\n type MenuAdapterConfig,\n } from '../_shared'\n\n defineOptions({ name: 'C_Menu' })\n\n const props = withDefaults(\n defineProps<{\n /**\n * 模式一:直传 NMenu 原生 MenuOption[]\n * 与 `routes` 二选一,`options` 优先级更高\n */\n options?: MenuOption[]\n /**\n * 模式二:传入路由数据,自动转换为 MenuOption[]\n * 兼容 Vue Router RouteRecordRaw / 后端 JSON 路由表\n */\n routes?: RouteItem[]\n /**\n * 适配器配置(仅 routes 模式生效)\n * 可自定义 key/label/icon 取值、过滤逻辑等\n */\n adapterConfig?: MenuAdapterConfig\n /**\n * 标签文本格式化函数(routes 模式的快捷方式)\n * 等同于 `adapterConfig.labelFormatter`,但优先级更高\n */\n labelFormatter?: (label: string) => string\n /** 当前激活的菜单 key */\n value?: string\n /** 菜单模式 */\n mode?: 'vertical' | 'horizontal'\n /** 是否折叠 */\n collapsed?: boolean\n /** 折叠宽度 */\n collapsedWidth?: number\n /** 折叠图标大小 */\n collapsedIconSize?: number\n /** 是否反色 */\n inverted?: boolean\n /** 主题覆盖 */\n themeOverrides?: Record<string, any>\n /** 缩进像素 */\n indent?: number\n /** 根缩进像素 */\n rootIndent?: number\n /** 下拉菜单属性(折叠模式) */\n dropdownProps?: DropdownProps\n }>(),\n {\n mode: 'vertical',\n collapsed: false,\n collapsedWidth: 64,\n collapsedIconSize: 22,\n inverted: false,\n indent: 24,\n rootIndent: 16,\n dropdownProps: () => ({\n placement: 'right-start' as const,\n trigger: 'hover' as const,\n arrowStyle: { color: 'var(--n-color)' },\n }),\n }\n )\n\n const emit = defineEmits<{\n /** 菜单项被选中 */\n select: [key: string]\n /** 展开项变化 */\n 'update:expandedKeys': [keys: string[]]\n }>()\n\n const menuRef = ref<MenuInst | null>(null)\n const expandedKeys = ref<string[]>([])\n\n const activeKey = computed(() => props.value ?? '')\n\n // ====== 数据合成 ======\n\n /** 合并后的最终 MenuOption[] */\n const mergedOptions = computed<MenuOption[]>(() => {\n // 优先使用 options 直传模式\n if (props.options) return props.options\n\n // routes 模式 → 适配器转换\n if (props.routes) {\n const config: MenuAdapterConfig = {\n ...props.adapterConfig,\n ...(props.labelFormatter && { labelFormatter: props.labelFormatter }),\n }\n return createMenuOptions(props.routes, config)\n }\n\n return []\n })\n\n // ====== 展开逻辑 ======\n\n /** 从 MenuOption[] 中查找所有祖先 key */\n const findParentKeys = (\n items: MenuOption[],\n targetKey: string,\n parentKeys: string[] = []\n ): string[] => {\n for (const item of items) {\n const children = item.children as MenuOption[] | undefined\n if (children?.length) {\n const currentKeys = [...parentKeys, item.key as string]\n if (children.some(child => child.key === targetKey)) {\n return currentKeys\n }\n const result = findParentKeys(children, targetKey, currentKeys)\n if (result.length > 0) return result\n }\n }\n return []\n }\n\n /** 通过路径段推导展开 key + 查找祖先 key */\n const computeExpandedKeys = (path: string): Set<string> => {\n const segments = path.split('/').filter(Boolean)\n const keys = new Set<string>()\n let currentPath = ''\n segments.forEach(segment => {\n currentPath += `/${segment}`\n keys.add(currentPath)\n })\n findParentKeys(mergedOptions.value, path).forEach(key => keys.add(key))\n return keys\n }\n\n // ====== 事件处理 ======\n\n const handleMenuClick = (key: string) => {\n if (key && key !== activeKey.value) {\n emit('select', key)\n }\n }\n\n const onExpandedKeysChange = (keys: string[]) => {\n expandedKeys.value = keys\n emit('update:expandedKeys', keys)\n }\n\n // ====== 暴露方法 ======\n const showOption = (key: string) => menuRef.value?.showOption(key)\n defineExpose({ showOption, menuRef })\n\n // ====== 路由跟踪 ======\n\n watch(\n () => activeKey.value,\n newKey => {\n if (!newKey) return\n const newKeys = computeExpandedKeys(newKey)\n expandedKeys.value = Array.from(\n new Set([...expandedKeys.value, ...newKeys])\n )\n nextTick(() => menuRef.value?.showOption(newKey))\n },\n { immediate: true }\n )\n\n onMounted(() => {\n nextTick(() => {\n if (activeKey.value) {\n expandedKeys.value = Array.from(computeExpandedKeys(activeKey.value))\n menuRef.value?.showOption(activeKey.value)\n }\n })\n })\n</script>\n"],"mappings":"4lBA6DE,IAAM,EAAQ,EA2DR,EAAO,EAOP,GAAA,EAAA,EAAA,KAA+B,KAAI,CACnC,GAAA,EAAA,EAAA,KAA6B,EAAE,CAAA,CAE/B,GAAA,EAAA,EAAA,cAA2B,EAAM,OAAS,GAAE,CAK5C,GAAA,EAAA,EAAA,cAA6C,CAEjD,GAAI,EAAM,QAAS,OAAO,EAAM,QAGhC,GAAI,EAAM,OAAQ,CAChB,IAAM,EAA4B,CAChC,GAAG,EAAM,cACT,GAAI,EAAM,gBAAkB,CAAE,eAAgB,EAAM,eAAgB,CACtE,CACA,OAAO,EAAA,EAAkB,EAAM,OAAQ,EAAM,CAG/C,MAAO,EAAC,EACT,CAKK,GACJ,EACA,EACA,EAAuB,EAAC,GACX,CACb,IAAK,IAAM,KAAQ,EAAO,CACxB,IAAM,EAAW,EAAK,SACtB,GAAI,GAAU,OAAQ,CACpB,IAAM,EAAc,CAAC,GAAG,EAAY,EAAK,IAAa,CACtD,GAAI,EAAS,KAAK,GAAS,EAAM,MAAQ,EAAU,CACjD,OAAO,EAET,IAAM,EAAS,EAAe,EAAU,EAAW,EAAW,CAC9D,GAAI,EAAO,OAAS,EAAG,OAAO,GAGlC,MAAO,EAAC,EAIJ,EAAuB,GAA8B,CACzD,IAAM,EAAW,EAAK,MAAM,IAAI,CAAC,OAAO,QAAO,CACzC,EAAO,IAAI,IACb,EAAc,GAMlB,OALA,EAAS,QAAQ,GAAW,CAC1B,GAAe,IAAI,IACnB,EAAK,IAAI,EAAW,EACrB,CACD,EAAe,EAAc,MAAO,EAAK,CAAC,QAAQ,GAAO,EAAK,IAAI,EAAI,CAAA,CAC/D,GAKH,EAAmB,GAAgB,CACnC,GAAO,IAAQ,EAAU,OAC3B,EAAK,SAAU,EAAG,EAIhB,EAAwB,GAAmB,CAC/C,EAAa,MAAQ,EACrB,EAAK,sBAAuB,EAAI,SAKlC,EAAa,CAAE,WADK,GAAgB,EAAQ,OAAO,WAAW,EAAG,CACtC,UAAS,CAAA,EAIpC,EAAA,EAAA,WACQ,EAAU,MAChB,GAAU,CACR,GAAI,CAAC,EAAQ,OACb,IAAM,EAAU,EAAoB,EAAM,CAC1C,EAAa,MAAQ,MAAM,KACzB,IAAI,IAAI,CAAC,GAAG,EAAa,MAAO,GAAG,EAAQ,CAAA,CAC7C,EACA,EAAA,EAAA,cAAe,EAAQ,OAAO,WAAW,EAAO,CAAA,EAElD,CAAE,UAAW,GAAK,CACpB,EAEA,EAAA,EAAA,eAAgB,EACd,EAAA,EAAA,cAAe,CACT,EAAU,QACZ,EAAa,MAAQ,MAAM,KAAK,EAAoB,EAAU,MAAM,CAAA,CACpE,EAAQ,OAAO,WAAW,EAAU,MAAK,GAE5C,EACF,yFAtLA,EAAA,SAfK,UAAJ,IAAI,EACH,QAAS,EAAA,MACT,gBAAe,EAAA,MACf,MAAO,EAAA,MACP,KAAM,EAAA,KACN,UAAW,EAAA,UACX,kBAAiB,EAAA,eACjB,sBAAqB,EAAA,kBACrB,SAAU,EAAA,SACV,kBAAiB,EAAA,eACjB,iBAAgB,EAAA,cAChB,OAAQ,EAAA,OACR,cAAa,EAAA,WACb,iBAAc,EACd,wBAAsB"}
1
+ {"version":3,"file":"C_Menu.js","names":["mode","collapsed","collapsedWidth","collapsedIconSize","inverted","themeOverrides","dropdownProps","indent","rootIndent"],"sources":["../src/components/C_Menu/index.vue","../src/components/C_Menu/index.vue"],"sourcesContent":["<!--\n * @Description: 通用菜单组件 — 基于 NMenu 的树形导航菜单\n *\n * 支持两种数据输入模式:\n * 1. `options` — 直传 NMenu 原生 MenuOption[](零转换,高级用户)\n * 2. `routes` — 传入路由数据,自动通过内置适配器转换为 MenuOption[]\n *\n * @example 路由模式(推荐)\n * ```vue\n * <C_Menu\n * :routes=\"menuData\"\n * :label-formatter=\"$t\"\n * @select=\"router.push\"\n * />\n * ```\n *\n * @example 原生模式\n * ```vue\n * <C_Menu\n * :options=\"nMenuOptions\"\n * @select=\"router.push\"\n * />\n * ```\n *\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <NMenu\n ref=\"menuRef\"\n :options=\"mergedOptions\"\n :expanded-keys=\"expandedKeys\"\n :value=\"activeKey\"\n :mode=\"mode\"\n :collapsed=\"collapsed\"\n :collapsed-width=\"collapsedWidth\"\n :collapsed-icon-size=\"collapsedIconSize\"\n :inverted=\"inverted\"\n :theme-overrides=\"themeOverrides\"\n :dropdown-props=\"dropdownProps\"\n :indent=\"indent\"\n :root-indent=\"rootIndent\"\n @update:value=\"handleMenuClick\"\n @update:expanded-keys=\"onExpandedKeysChange\"\n />\n</template>\n\n<script setup lang=\"ts\">\n import { ref, computed, watch, nextTick, onMounted } from 'vue'\n import {\n type MenuOption,\n type MenuInst,\n type DropdownProps,\n } from 'naive-ui/es'\n import {\n createMenuOptions,\n type RouteItem,\n type MenuAdapterConfig,\n } from '../_shared'\n\n defineOptions({ name: 'C_Menu' })\n\n const props = withDefaults(\n defineProps<{\n /**\n * 模式一:直传 NMenu 原生 MenuOption[]\n * 与 `routes` 二选一,`options` 优先级更高\n */\n options?: MenuOption[]\n /**\n * 模式二:传入路由数据,自动转换为 MenuOption[]\n * 兼容 Vue Router RouteRecordRaw / 后端 JSON 路由表\n */\n routes?: RouteItem[]\n /**\n * 适配器配置(仅 routes 模式生效)\n * 可自定义 key/label/icon 取值、过滤逻辑等\n */\n adapterConfig?: MenuAdapterConfig\n /**\n * 标签文本格式化函数(routes 模式的快捷方式)\n * 等同于 `adapterConfig.labelFormatter`,但优先级更高\n */\n labelFormatter?: (label: string) => string\n /** 当前激活的菜单 key */\n value?: string\n /** 菜单模式 */\n mode?: 'vertical' | 'horizontal'\n /** 是否折叠 */\n collapsed?: boolean\n /** 折叠宽度 */\n collapsedWidth?: number\n /** 折叠图标大小 */\n collapsedIconSize?: number\n /** 是否反色 */\n inverted?: boolean\n /** 主题覆盖 */\n themeOverrides?: Record<string, any>\n /** 缩进像素 */\n indent?: number\n /** 根缩进像素 */\n rootIndent?: number\n /** 下拉菜单属性(折叠模式) */\n dropdownProps?: DropdownProps\n }>(),\n {\n mode: 'vertical',\n collapsed: false,\n collapsedWidth: 64,\n collapsedIconSize: 22,\n inverted: false,\n indent: 24,\n rootIndent: 16,\n dropdownProps: () => ({\n placement: 'right-start' as const,\n trigger: 'hover' as const,\n arrowStyle: { color: 'var(--n-color)' },\n }),\n }\n )\n\n const emit = defineEmits<{\n /** 菜单项被选中 */\n select: [key: string]\n /** 展开项变化 */\n 'update:expandedKeys': [keys: string[]]\n }>()\n\n const menuRef = ref<MenuInst | null>(null)\n const expandedKeys = ref<string[]>([])\n\n const activeKey = computed(() => props.value ?? '')\n\n // ====== 数据合成 ======\n\n /** 合并后的最终 MenuOption[] */\n const mergedOptions = computed<MenuOption[]>(() => {\n // 优先使用 options 直传模式\n if (props.options) return props.options\n\n // routes 模式 → 适配器转换\n if (props.routes) {\n const config: MenuAdapterConfig = {\n ...props.adapterConfig,\n ...(props.labelFormatter && { labelFormatter: props.labelFormatter }),\n }\n return createMenuOptions(props.routes, config)\n }\n\n return []\n })\n\n // ====== 展开逻辑 ======\n\n /** 从 MenuOption[] 中查找所有祖先 key */\n const findParentKeys = (\n items: MenuOption[],\n targetKey: string,\n parentKeys: string[] = []\n ): string[] => {\n for (const item of items) {\n const children = item.children as MenuOption[] | undefined\n if (children?.length) {\n const currentKeys = [...parentKeys, item.key as string]\n if (children.some(child => child.key === targetKey)) {\n return currentKeys\n }\n const result = findParentKeys(children, targetKey, currentKeys)\n if (result.length > 0) return result\n }\n }\n return []\n }\n\n /** 通过路径段推导展开 key + 查找祖先 key */\n const computeExpandedKeys = (path: string): Set<string> => {\n const segments = path.split('/').filter(Boolean)\n const keys = new Set<string>()\n let currentPath = ''\n segments.forEach(segment => {\n currentPath += `/${segment}`\n keys.add(currentPath)\n })\n findParentKeys(mergedOptions.value, path).forEach(key => keys.add(key))\n return keys\n }\n\n // ====== 事件处理 ======\n\n const handleMenuClick = (key: string) => {\n if (key && key !== activeKey.value) {\n emit('select', key)\n }\n }\n\n const onExpandedKeysChange = (keys: string[]) => {\n expandedKeys.value = keys\n emit('update:expandedKeys', keys)\n }\n\n // ====== 暴露方法 ======\n const showOption = (key: string) => menuRef.value?.showOption(key)\n defineExpose({ showOption, menuRef })\n\n // ====== 路由跟踪 ======\n\n watch(\n () => activeKey.value,\n newKey => {\n if (!newKey) return\n const newKeys = computeExpandedKeys(newKey)\n expandedKeys.value = Array.from(\n new Set([...expandedKeys.value, ...newKeys])\n )\n nextTick(() => menuRef.value?.showOption(newKey))\n },\n { immediate: true }\n )\n\n onMounted(() => {\n nextTick(() => {\n if (activeKey.value) {\n expandedKeys.value = Array.from(computeExpandedKeys(activeKey.value))\n menuRef.value?.showOption(activeKey.value)\n }\n })\n })\n</script>\n","<!--\n * @Description: 通用菜单组件 — 基于 NMenu 的树形导航菜单\n *\n * 支持两种数据输入模式:\n * 1. `options` — 直传 NMenu 原生 MenuOption[](零转换,高级用户)\n * 2. `routes` — 传入路由数据,自动通过内置适配器转换为 MenuOption[]\n *\n * @example 路由模式(推荐)\n * ```vue\n * <C_Menu\n * :routes=\"menuData\"\n * :label-formatter=\"$t\"\n * @select=\"router.push\"\n * />\n * ```\n *\n * @example 原生模式\n * ```vue\n * <C_Menu\n * :options=\"nMenuOptions\"\n * @select=\"router.push\"\n * />\n * ```\n *\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\n-->\n<template>\n <NMenu\n ref=\"menuRef\"\n :options=\"mergedOptions\"\n :expanded-keys=\"expandedKeys\"\n :value=\"activeKey\"\n :mode=\"mode\"\n :collapsed=\"collapsed\"\n :collapsed-width=\"collapsedWidth\"\n :collapsed-icon-size=\"collapsedIconSize\"\n :inverted=\"inverted\"\n :theme-overrides=\"themeOverrides\"\n :dropdown-props=\"dropdownProps\"\n :indent=\"indent\"\n :root-indent=\"rootIndent\"\n @update:value=\"handleMenuClick\"\n @update:expanded-keys=\"onExpandedKeysChange\"\n />\n</template>\n\n<script setup lang=\"ts\">\n import { ref, computed, watch, nextTick, onMounted } from 'vue'\n import {\n type MenuOption,\n type MenuInst,\n type DropdownProps,\n } from 'naive-ui/es'\n import {\n createMenuOptions,\n type RouteItem,\n type MenuAdapterConfig,\n } from '../_shared'\n\n defineOptions({ name: 'C_Menu' })\n\n const props = withDefaults(\n defineProps<{\n /**\n * 模式一:直传 NMenu 原生 MenuOption[]\n * 与 `routes` 二选一,`options` 优先级更高\n */\n options?: MenuOption[]\n /**\n * 模式二:传入路由数据,自动转换为 MenuOption[]\n * 兼容 Vue Router RouteRecordRaw / 后端 JSON 路由表\n */\n routes?: RouteItem[]\n /**\n * 适配器配置(仅 routes 模式生效)\n * 可自定义 key/label/icon 取值、过滤逻辑等\n */\n adapterConfig?: MenuAdapterConfig\n /**\n * 标签文本格式化函数(routes 模式的快捷方式)\n * 等同于 `adapterConfig.labelFormatter`,但优先级更高\n */\n labelFormatter?: (label: string) => string\n /** 当前激活的菜单 key */\n value?: string\n /** 菜单模式 */\n mode?: 'vertical' | 'horizontal'\n /** 是否折叠 */\n collapsed?: boolean\n /** 折叠宽度 */\n collapsedWidth?: number\n /** 折叠图标大小 */\n collapsedIconSize?: number\n /** 是否反色 */\n inverted?: boolean\n /** 主题覆盖 */\n themeOverrides?: Record<string, any>\n /** 缩进像素 */\n indent?: number\n /** 根缩进像素 */\n rootIndent?: number\n /** 下拉菜单属性(折叠模式) */\n dropdownProps?: DropdownProps\n }>(),\n {\n mode: 'vertical',\n collapsed: false,\n collapsedWidth: 64,\n collapsedIconSize: 22,\n inverted: false,\n indent: 24,\n rootIndent: 16,\n dropdownProps: () => ({\n placement: 'right-start' as const,\n trigger: 'hover' as const,\n arrowStyle: { color: 'var(--n-color)' },\n }),\n }\n )\n\n const emit = defineEmits<{\n /** 菜单项被选中 */\n select: [key: string]\n /** 展开项变化 */\n 'update:expandedKeys': [keys: string[]]\n }>()\n\n const menuRef = ref<MenuInst | null>(null)\n const expandedKeys = ref<string[]>([])\n\n const activeKey = computed(() => props.value ?? '')\n\n // ====== 数据合成 ======\n\n /** 合并后的最终 MenuOption[] */\n const mergedOptions = computed<MenuOption[]>(() => {\n // 优先使用 options 直传模式\n if (props.options) return props.options\n\n // routes 模式 → 适配器转换\n if (props.routes) {\n const config: MenuAdapterConfig = {\n ...props.adapterConfig,\n ...(props.labelFormatter && { labelFormatter: props.labelFormatter }),\n }\n return createMenuOptions(props.routes, config)\n }\n\n return []\n })\n\n // ====== 展开逻辑 ======\n\n /** 从 MenuOption[] 中查找所有祖先 key */\n const findParentKeys = (\n items: MenuOption[],\n targetKey: string,\n parentKeys: string[] = []\n ): string[] => {\n for (const item of items) {\n const children = item.children as MenuOption[] | undefined\n if (children?.length) {\n const currentKeys = [...parentKeys, item.key as string]\n if (children.some(child => child.key === targetKey)) {\n return currentKeys\n }\n const result = findParentKeys(children, targetKey, currentKeys)\n if (result.length > 0) return result\n }\n }\n return []\n }\n\n /** 通过路径段推导展开 key + 查找祖先 key */\n const computeExpandedKeys = (path: string): Set<string> => {\n const segments = path.split('/').filter(Boolean)\n const keys = new Set<string>()\n let currentPath = ''\n segments.forEach(segment => {\n currentPath += `/${segment}`\n keys.add(currentPath)\n })\n findParentKeys(mergedOptions.value, path).forEach(key => keys.add(key))\n return keys\n }\n\n // ====== 事件处理 ======\n\n const handleMenuClick = (key: string) => {\n if (key && key !== activeKey.value) {\n emit('select', key)\n }\n }\n\n const onExpandedKeysChange = (keys: string[]) => {\n expandedKeys.value = keys\n emit('update:expandedKeys', keys)\n }\n\n // ====== 暴露方法 ======\n const showOption = (key: string) => menuRef.value?.showOption(key)\n defineExpose({ showOption, menuRef })\n\n // ====== 路由跟踪 ======\n\n watch(\n () => activeKey.value,\n newKey => {\n if (!newKey) return\n const newKeys = computeExpandedKeys(newKey)\n expandedKeys.value = Array.from(\n new Set([...expandedKeys.value, ...newKeys])\n )\n nextTick(() => menuRef.value?.showOption(newKey))\n },\n { immediate: true }\n )\n\n onMounted(() => {\n nextTick(() => {\n if (activeKey.value) {\n expandedKeys.value = Array.from(computeExpandedKeys(activeKey.value))\n menuRef.value?.showOption(activeKey.value)\n }\n })\n })\n</script>\n"],"mappings":"knBA6DE,IAAM,EAAQ,EA2DR,EAAO,EAOP,GAAA,EAAA,EAAA,KAA+B,KAAI,CACnC,GAAA,EAAA,EAAA,KAA6B,EAAE,CAAA,CAE/B,GAAA,EAAA,EAAA,cAA2B,EAAM,OAAS,GAAE,CAK5C,GAAA,EAAA,EAAA,cAA6C,CAEjD,GAAI,EAAM,QAAS,OAAO,EAAM,QAGhC,GAAI,EAAM,OAAQ,CAChB,IAAM,EAA4B,CAChC,GAAG,EAAM,cACT,GAAI,EAAM,gBAAkB,CAAE,eAAgB,EAAM,eAAA,CACtD,CACA,OAAO,EAAA,EAAkB,EAAM,OAAQ,EAAM,CAG/C,MAAO,EAAC,EACT,CAKK,GACJ,EACA,EACA,EAAuB,EAAC,GACX,CACb,IAAK,IAAM,KAAQ,EAAO,CACxB,IAAM,EAAW,EAAK,SACtB,GAAI,GAAU,OAAQ,CACpB,IAAM,EAAc,CAAC,GAAG,EAAY,EAAK,IAAa,CACtD,GAAI,EAAS,KAAK,GAAS,EAAM,MAAQ,EAAU,CACjD,OAAO,EAET,IAAM,EAAS,EAAe,EAAU,EAAW,EAAW,CAC9D,GAAI,EAAO,OAAS,EAAG,OAAO,GAGlC,MAAO,EAAC,EAIJ,EAAuB,GAA8B,CACzD,IAAM,EAAW,EAAK,MAAM,IAAI,CAAC,OAAO,QAAO,CACzC,EAAO,IAAI,IACb,EAAc,GAMlB,OALA,EAAS,QAAQ,GAAW,CAC1B,GAAe,IAAI,IACnB,EAAK,IAAI,EAAW,EACrB,CACD,EAAe,EAAc,MAAO,EAAK,CAAC,QAAQ,GAAO,EAAK,IAAI,EAAI,CAAA,CAC/D,GAKH,EAAmB,GAAgB,CACnC,GAAO,IAAQ,EAAU,OAC3B,EAAK,SAAU,EAAG,EAIhB,EAAwB,GAAmB,CAC/C,EAAa,MAAQ,EACrB,EAAK,sBAAuB,EAAI,SAKlC,EAAa,CAAE,WADK,GAAgB,EAAQ,OAAO,WAAW,EAAG,CACtC,UAAS,CAAA,EAIpC,EAAA,EAAA,WACQ,EAAU,MAChB,GAAU,CACR,GAAI,CAAC,EAAQ,OACb,IAAM,EAAU,EAAoB,EAAM,CAC1C,EAAa,MAAQ,MAAM,KACzB,IAAI,IAAI,CAAC,GAAG,EAAa,MAAO,GAAG,EAAQ,CAAA,CAC7C,EACA,EAAA,EAAA,cAAe,EAAQ,OAAO,WAAW,EAAO,CAAA,EAElD,CAAE,UAAW,GAAK,CACpB,EAEA,EAAA,EAAA,eAAgB,EACd,EAAA,EAAA,cAAe,CACT,EAAU,QACZ,EAAa,MAAQ,MAAM,KAAK,EAAoB,EAAU,MAAM,CAAA,CACpE,EAAQ,OAAO,WAAW,EAAU,MAAK,GAE5C,EACF,iECtLC,EAAA,SAfI,UAAJ,IAAI,EACH,QAAS,EAAA,MACT,gBAAe,EAAA,MACf,MAAO,EAAA,MACP,KAAMA,EAAAA,KACN,UAAWC,EAAAA,UACX,kBAAiBC,EAAAA,eACjB,sBAAqBC,EAAAA,kBACrB,SAAUC,EAAAA,SACV,kBAAiBC,EAAAA,eACjB,iBAAgBC,EAAAA,cAChB,OAAQC,EAAAA,OACR,cAAaC,EAAAA,WACb,iBAAc,EACd,wBAAsB"}