@robot-admin/naive-ui-components 0.8.1 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (381) hide show
  1. package/README.md +294 -279
  2. package/dist/C_ActionBar-DYG0Yf3A.css.map +1 -0
  3. package/dist/C_ActionBar-MAjRhqcI.css.map +1 -0
  4. package/dist/C_ActionBar.cjs +1 -1
  5. package/dist/C_ActionBar.css +47 -47
  6. package/dist/C_ActionBar.js +1 -1
  7. package/dist/C_ActionBar.js.map +1 -1
  8. package/dist/C_ActionBar2.js +1 -1
  9. package/dist/C_ActionBar2.js.map +1 -1
  10. package/dist/{C_AntV-A3NXx_sF.css.map → C_AntV-BY8jqqmi.css.map} +1 -1
  11. package/dist/{C_AntV-D2Zp2qQF.css.map → C_AntV-BbkHc-_a.css.map} +1 -1
  12. package/dist/C_AntV.cjs +1 -1
  13. package/dist/C_AntV.css +78 -78
  14. package/dist/C_AntV.js +1 -1
  15. package/dist/C_AntV.js.map +1 -1
  16. package/dist/C_AntV2.js +3 -3
  17. package/dist/C_AntV2.js.map +1 -1
  18. package/dist/{C_AudioPlayer-CXl4yP_m.css.map → C_AudioPlayer-DKRIGhi7.css.map} +1 -1
  19. package/dist/{C_AudioPlayer-CcBtt71m.css.map → C_AudioPlayer-DlB6eNsa.css.map} +1 -1
  20. package/dist/C_AudioPlayer.cjs +1 -1
  21. package/dist/C_AudioPlayer.css +47 -47
  22. package/dist/C_AudioPlayer.js +1 -1
  23. package/dist/C_AudioPlayer.js.map +1 -1
  24. package/dist/C_AudioPlayer2.js +1 -1
  25. package/dist/C_AudioPlayer2.js.map +1 -1
  26. package/dist/{C_AvatarGroup-CtPhfH9h.css.map → C_AvatarGroup-D02zci-i.css.map} +1 -1
  27. package/dist/{C_AvatarGroup-M1dNPH3E.css.map → C_AvatarGroup-DatHaUlY.css.map} +1 -1
  28. package/dist/C_AvatarGroup.css +21 -21
  29. package/dist/C_AvatarGroup.js.map +1 -1
  30. package/dist/C_AvatarGroup2.js +1 -1
  31. package/dist/C_AvatarGroup2.js.map +1 -1
  32. package/dist/{C_Barcode-DjTmDkbQ.css.map → C_Barcode-DYDRDe2O.css.map} +1 -1
  33. package/dist/{C_Barcode-Do1Ozsmh.css.map → C_Barcode-muJdc_O4.css.map} +1 -1
  34. package/dist/C_Barcode.css +7 -7
  35. package/dist/C_Barcode.js.map +1 -1
  36. package/dist/C_Barcode2.js +1 -1
  37. package/dist/C_Barcode2.js.map +1 -1
  38. package/dist/C_Breadcrumb.cjs +1 -1
  39. package/dist/C_Breadcrumb.js +1 -1
  40. package/dist/C_Breadcrumb.js.map +1 -1
  41. package/dist/C_Breadcrumb2.js +1 -1
  42. package/dist/C_Breadcrumb2.js.map +1 -1
  43. package/dist/{C_Captcha-CZmAETly.css.map → C_Captcha-9_hk6VmY.css.map} +1 -1
  44. package/dist/{C_Captcha-Ccq3DMrR.css.map → C_Captcha-MtASlJ0f.css.map} +1 -1
  45. package/dist/C_Captcha.css +19 -19
  46. package/dist/C_Captcha.js.map +1 -1
  47. package/dist/C_Captcha2.js +1 -1
  48. package/dist/C_Captcha2.js.map +1 -1
  49. package/dist/C_Cascade.js.map +1 -1
  50. package/dist/C_Cascade2.js +1 -1
  51. package/dist/C_Cascade2.js.map +1 -1
  52. package/dist/{C_Chat-CJ8KESTM.css.map → C_Chat-Csjz_BFw.css.map} +1 -1
  53. package/dist/{C_Chat-DzV4AFLd.css.map → C_Chat-DO1ZBA_0.css.map} +1 -1
  54. package/dist/C_Chat.cjs +1 -1
  55. package/dist/C_Chat.css +65 -65
  56. package/dist/C_Chat.js +1 -1
  57. package/dist/C_Chat.js.map +1 -1
  58. package/dist/C_Chat2.js +1 -1
  59. package/dist/C_Chat2.js.map +1 -1
  60. package/dist/{C_City-Cv5BESaN.css.map → C_City-Bam08Qv3.css.map} +1 -1
  61. package/dist/{C_City-DNKv4MpH.css.map → C_City-Bb3W-KaN.css.map} +1 -1
  62. package/dist/C_City.css +29 -29
  63. package/dist/C_City.js.map +1 -1
  64. package/dist/C_City2.js +1 -1
  65. package/dist/C_City2.js.map +1 -1
  66. package/dist/C_Code-BFi5xxnM.css.map +1 -0
  67. package/dist/C_Code-CZ7yfnri.css.map +1 -0
  68. package/dist/C_Code.cjs +1 -1
  69. package/dist/C_Code.css +3 -3
  70. package/dist/C_Code.js +1 -1
  71. package/dist/C_Code.js.map +1 -1
  72. package/dist/C_Code2.js +1 -1
  73. package/dist/C_Code2.js.map +1 -1
  74. package/dist/{C_CollapsePanel-CedsEM0N.css.map → C_CollapsePanel-CWkFCqNQ.css.map} +1 -1
  75. package/dist/{C_CollapsePanel-BkOivqn3.css.map → C_CollapsePanel-pcVJA_4z.css.map} +1 -1
  76. package/dist/C_CollapsePanel.cjs +1 -1
  77. package/dist/C_CollapsePanel.css +35 -35
  78. package/dist/C_CollapsePanel.js +1 -1
  79. package/dist/C_CollapsePanel.js.map +1 -1
  80. package/dist/C_CollapsePanel2.js +1 -1
  81. package/dist/C_CollapsePanel2.js.map +1 -1
  82. package/dist/{C_ContextMenu-CCsCeI39.css.map → C_ContextMenu-B3Cgz_wJ.css.map} +1 -1
  83. package/dist/{C_ContextMenu-DOTBeltf.css.map → C_ContextMenu-u1LixF3_.css.map} +1 -1
  84. package/dist/C_ContextMenu.cjs +1 -1
  85. package/dist/C_ContextMenu.css +17 -17
  86. package/dist/C_ContextMenu.js +1 -1
  87. package/dist/C_ContextMenu.js.map +1 -1
  88. package/dist/C_ContextMenu2.js +1 -1
  89. package/dist/C_ContextMenu2.js.map +1 -1
  90. package/dist/{C_Cron-C0-8b5af.css.map → C_Cron-Civir5-I.css.map} +1 -1
  91. package/dist/{C_Cron-DqHQ92LN.css.map → C_Cron-iw3qpMsy.css.map} +1 -1
  92. package/dist/C_Cron.cjs +1 -1
  93. package/dist/C_Cron.css +37 -37
  94. package/dist/C_Cron.js +1 -1
  95. package/dist/C_Cron.js.map +1 -1
  96. package/dist/C_Cron2.js +1 -1
  97. package/dist/C_Cron2.js.map +1 -1
  98. package/dist/C_Date.js.map +1 -1
  99. package/dist/C_Date2.js +1 -1
  100. package/dist/C_Date2.js.map +1 -1
  101. package/dist/{C_Draggable-Bq6o0qXn.css.map → C_Draggable-BCjIvIwT.css.map} +1 -1
  102. package/dist/{C_Draggable-r6nhx3yM.css.map → C_Draggable-DwkSlCOS.css.map} +1 -1
  103. package/dist/C_Draggable.css +46 -46
  104. package/dist/C_Draggable.js.map +1 -1
  105. package/dist/C_Draggable2.js +1 -1
  106. package/dist/C_Draggable2.js.map +1 -1
  107. package/dist/C_Editor-BfjjYQ9B.css.map +1 -0
  108. package/dist/C_Editor-Do2StvoJ.css.map +1 -0
  109. package/dist/C_Editor.css +55 -55
  110. package/dist/C_Editor.js.map +1 -1
  111. package/dist/C_Editor2.js +1 -1
  112. package/dist/C_Editor2.js.map +1 -1
  113. package/dist/{C_FilePreview-BVarVvnD.css.map → C_FilePreview-BhcbiXsV.css.map} +1 -1
  114. package/dist/{C_FilePreview-DHGlV4OR.css.map → C_FilePreview-DJudcIbW.css.map} +1 -1
  115. package/dist/C_FilePreview.cjs +1 -1
  116. package/dist/C_FilePreview.css +91 -91
  117. package/dist/C_FilePreview.js +1 -1
  118. package/dist/C_FilePreview.js.map +1 -1
  119. package/dist/C_FilePreview2.js +1 -1
  120. package/dist/C_FilePreview2.js.map +1 -1
  121. package/dist/{C_Form-BciQUPpS.css.map → C_Form-BtcAPIRi.css.map} +1 -1
  122. package/dist/{C_Form-CKHvXL3O.css.map → C_Form-D_gwQ7hC.css.map} +1 -1
  123. package/dist/C_Form.cjs +1 -1
  124. package/dist/C_Form.css +222 -222
  125. package/dist/C_Form.js +1 -1
  126. package/dist/C_Form.js.map +1 -1
  127. package/dist/C_Form2.js +1 -1
  128. package/dist/C_Form2.js.map +1 -1
  129. package/dist/{C_FormSearch-Bmd2CmG6.css.map → C_FormSearch-Bi4XYjjk.css.map} +1 -1
  130. package/dist/{C_FormSearch-DBNtnjaL.css.map → C_FormSearch-DUGOoX0u.css.map} +1 -1
  131. package/dist/C_FormSearch.css +45 -45
  132. package/dist/C_FormSearch.js.map +1 -1
  133. package/dist/C_FormSearch2.js +1 -1
  134. package/dist/C_FormSearch2.js.map +1 -1
  135. package/dist/{C_FormulaEditor-3WG2vtQl.css.map → C_FormulaEditor-CJk3SSUJ.css.map} +1 -1
  136. package/dist/{C_FormulaEditor-Cm0CokN5.css.map → C_FormulaEditor-Cy7mjfVO.css.map} +1 -1
  137. package/dist/C_FormulaEditor.cjs +1 -1
  138. package/dist/C_FormulaEditor.css +78 -78
  139. package/dist/C_FormulaEditor.js +1 -1
  140. package/dist/C_FormulaEditor.js.map +1 -1
  141. package/dist/C_FormulaEditor2.js +1 -1
  142. package/dist/C_FormulaEditor2.js.map +1 -1
  143. package/dist/C_FullCalendar-BQA0OjGB.css.map +1 -0
  144. package/dist/C_FullCalendar-ChJUosAi.css.map +1 -0
  145. package/dist/C_FullCalendar.css +3 -3
  146. package/dist/C_FullCalendar.js.map +1 -1
  147. package/dist/C_FullCalendar2.js +1 -1
  148. package/dist/C_FullCalendar2.js.map +1 -1
  149. package/dist/C_GlobalSearch.js.map +1 -1
  150. package/dist/C_GlobalSearch2.js.map +1 -1
  151. package/dist/C_Guide.cjs +1 -1
  152. package/dist/C_Guide.js +1 -1
  153. package/dist/C_Guide.js.map +1 -1
  154. package/dist/C_Guide2.js +1 -1
  155. package/dist/C_Guide2.js.map +1 -1
  156. package/dist/C_Icon.js.map +1 -1
  157. package/dist/C_Icon2.js +1 -1
  158. package/dist/C_Icon2.js.map +1 -1
  159. package/dist/{C_ImageCropper-D3L2-J_J.css.map → C_ImageCropper-BqZpkZfU.css.map} +1 -1
  160. package/dist/{C_ImageCropper-DrmUlaLi.css.map → C_ImageCropper-CylwGuzS.css.map} +1 -1
  161. package/dist/C_ImageCropper.cjs +1 -1
  162. package/dist/C_ImageCropper.css +10 -10
  163. package/dist/C_ImageCropper.js +1 -1
  164. package/dist/C_ImageCropper.js.map +1 -1
  165. package/dist/C_ImageCropper2.js +1 -1
  166. package/dist/C_ImageCropper2.js.map +1 -1
  167. package/dist/C_Language.cjs +1 -1
  168. package/dist/C_Language.js +1 -1
  169. package/dist/C_Language.js.map +1 -1
  170. package/dist/C_Language2.js +1 -1
  171. package/dist/C_Language2.js.map +1 -1
  172. package/dist/{C_Login-Cst_W1XC.css.map → C_Login-BkdnkBKX.css.map} +1 -1
  173. package/dist/{C_Login-DWZ_6K1x.css.map → C_Login-VkMM6OJ2.css.map} +1 -1
  174. package/dist/C_Login.cjs +1 -1
  175. package/dist/C_Login.css +72 -72
  176. package/dist/C_Login.js +1 -1
  177. package/dist/C_Login.js.map +1 -1
  178. package/dist/C_Login2.js +1 -1
  179. package/dist/C_Login2.js.map +1 -1
  180. package/dist/{C_Map-BCJmDnJT.css.map → C_Map-DNnBcY70.css.map} +1 -1
  181. package/dist/{C_Map-WUMXSAfy.css.map → C_Map-LEXIx6zM.css.map} +1 -1
  182. package/dist/C_Map.css +4 -4
  183. package/dist/C_Map.js.map +1 -1
  184. package/dist/C_Map2.js +1 -1
  185. package/dist/C_Map2.js.map +1 -1
  186. package/dist/{C_Markdown-7J0uPEuk.css.map → C_Markdown-DwmI0_0Q.css.map} +1 -1
  187. package/dist/{C_Markdown-C7Lg0_9z.css.map → C_Markdown-k0794RW0.css.map} +1 -1
  188. package/dist/C_Markdown.css +33 -33
  189. package/dist/C_Markdown.js.map +1 -1
  190. package/dist/C_Markdown2.js +1 -1
  191. package/dist/C_Markdown2.js.map +1 -1
  192. package/dist/C_Menu.js.map +1 -1
  193. package/dist/C_Menu2.js +1 -1
  194. package/dist/C_Menu2.js.map +1 -1
  195. package/dist/C_NotificationCenter.cjs +1 -1
  196. package/dist/C_NotificationCenter.js +1 -1
  197. package/dist/C_NotificationCenter.js.map +1 -1
  198. package/dist/C_NotificationCenter2.js +1 -1
  199. package/dist/C_NotificationCenter2.js.map +1 -1
  200. package/dist/C_OrgChart.js.map +1 -1
  201. package/dist/C_OrgChart2.js +1 -1
  202. package/dist/C_OrgChart2.js.map +1 -1
  203. package/dist/C_Progress.js.map +1 -1
  204. package/dist/C_Progress2.js +1 -1
  205. package/dist/C_Progress2.js.map +1 -1
  206. package/dist/{C_QRCode-DMxSyogU.css.map → C_QRCode-CFNTda_1.css.map} +1 -1
  207. package/dist/{C_QRCode-G7fiAkm4.css.map → C_QRCode-CmWr9lK-.css.map} +1 -1
  208. package/dist/C_QRCode.css +9 -9
  209. package/dist/C_QRCode.js.map +1 -1
  210. package/dist/C_QRCode2.js +1 -1
  211. package/dist/C_QRCode2.js.map +1 -1
  212. package/dist/{C_Signature-BJMvVPWT.css.map → C_Signature-BDx4ctsE.css.map} +1 -1
  213. package/dist/{C_Signature-BJUHx2BF.css.map → C_Signature-Bz_uNbwv.css.map} +1 -1
  214. package/dist/C_Signature.cjs +1 -1
  215. package/dist/C_Signature.css +15 -15
  216. package/dist/C_Signature.js +1 -1
  217. package/dist/C_Signature.js.map +1 -1
  218. package/dist/C_Signature2.js +1 -1
  219. package/dist/C_Signature2.js.map +1 -1
  220. package/dist/C_Skeleton.js.map +1 -1
  221. package/dist/C_Skeleton2.js +1 -1
  222. package/dist/C_Skeleton2.js.map +1 -1
  223. package/dist/{C_SplitPane-Br2eK8IG.css.map → C_SplitPane-BOwr1C7K.css.map} +1 -1
  224. package/dist/{C_SplitPane-DuyzUhKB.css.map → C_SplitPane-N-a_D-7F.css.map} +1 -1
  225. package/dist/C_SplitPane.cjs +1 -1
  226. package/dist/C_SplitPane.css +31 -31
  227. package/dist/C_SplitPane.js +1 -1
  228. package/dist/C_SplitPane.js.map +1 -1
  229. package/dist/C_SplitPane2.js +1 -1
  230. package/dist/C_SplitPane2.js.map +1 -1
  231. package/dist/C_Steps-Bk1krgiR.css.map +1 -0
  232. package/dist/C_Steps-Dn2CMpy1.css.map +1 -0
  233. package/dist/C_Steps.css +38 -38
  234. package/dist/C_Steps.js.map +1 -1
  235. package/dist/C_Steps2.js +1 -1
  236. package/dist/C_Steps2.js.map +1 -1
  237. package/dist/C_Table.cjs +1 -1
  238. package/dist/C_Table.js +1 -1
  239. package/dist/C_Table.js.map +1 -1
  240. package/dist/C_Table2.js +2 -2
  241. package/dist/C_Table2.js.map +1 -1
  242. package/dist/{C_TagsView-BsutyC3U.css.map → C_TagsView-DX3LecK1.css.map} +1 -1
  243. package/dist/{C_TagsView-Crm7yWg9.css.map → C_TagsView-DqOTa8bL.css.map} +1 -1
  244. package/dist/C_TagsView.cjs +1 -1
  245. package/dist/C_TagsView.css +36 -36
  246. package/dist/C_TagsView.js +1 -1
  247. package/dist/C_TagsView.js.map +1 -1
  248. package/dist/C_TagsView2.js +1 -1
  249. package/dist/C_TagsView2.js.map +1 -1
  250. package/dist/C_Theme.cjs +1 -1
  251. package/dist/C_Theme.js +1 -1
  252. package/dist/C_Theme.js.map +1 -1
  253. package/dist/C_Theme2.js +1 -1
  254. package/dist/C_Theme2.js.map +1 -1
  255. package/dist/C_Time-BzyQVvTS.css.map +1 -0
  256. package/dist/C_Time-DmpKLQHc.css.map +1 -0
  257. package/dist/C_Time.css +5 -5
  258. package/dist/C_Time.js.map +1 -1
  259. package/dist/C_Time2.js +1 -1
  260. package/dist/C_Time2.js.map +1 -1
  261. package/dist/{C_Timeline-DG70WtJP.css.map → C_Timeline-BKkimrZx.css.map} +1 -1
  262. package/dist/{C_Timeline-Dzxmmdjg.css.map → C_Timeline-DTuSCX6p.css.map} +1 -1
  263. package/dist/C_Timeline.cjs +1 -1
  264. package/dist/C_Timeline.css +45 -45
  265. package/dist/C_Timeline.js +1 -1
  266. package/dist/C_Timeline.js.map +1 -1
  267. package/dist/C_Timeline2.js +1 -1
  268. package/dist/C_Timeline2.js.map +1 -1
  269. package/dist/{C_Transfer-CCEqnC-v.css.map → C_Transfer-BOB6OBqS.css.map} +1 -1
  270. package/dist/{C_Transfer-CStPm4NP.css.map → C_Transfer-Dpq7ezWC.css.map} +1 -1
  271. package/dist/C_Transfer.cjs +1 -1
  272. package/dist/C_Transfer.css +31 -31
  273. package/dist/C_Transfer.js +1 -1
  274. package/dist/C_Transfer.js.map +1 -1
  275. package/dist/C_Transfer2.js +1 -1
  276. package/dist/C_Transfer2.js.map +1 -1
  277. package/dist/{C_Tree-B-Le4hjQ.css.map → C_Tree-D98nX9qT.css.map} +1 -1
  278. package/dist/{C_Tree-DnGc_MPb.css.map → C_Tree-ulfm7b-P.css.map} +1 -1
  279. package/dist/C_Tree.cjs +1 -1
  280. package/dist/C_Tree.css +33 -33
  281. package/dist/C_Tree.js +1 -1
  282. package/dist/C_Tree.js.map +1 -1
  283. package/dist/C_Tree2.js +1 -1
  284. package/dist/C_Tree2.js.map +1 -1
  285. package/dist/{C_Upload-CFAxVGVz.css.map → C_Upload-BR9fg5r4.css.map} +1 -1
  286. package/dist/{C_Upload-D8_QeSV0.css.map → C_Upload-CPqf74Ea.css.map} +1 -1
  287. package/dist/C_Upload.cjs +1 -1
  288. package/dist/C_Upload.css +4 -4
  289. package/dist/C_Upload.js +1 -1
  290. package/dist/C_Upload.js.map +1 -1
  291. package/dist/C_Upload2.js +2 -2
  292. package/dist/C_Upload2.js.map +1 -1
  293. package/dist/{C_VideoPlayer-Cdgv4Zq0.css.map → C_VideoPlayer-4J96tKfK.css.map} +1 -1
  294. package/dist/{C_VideoPlayer-rm0MODUv.css.map → C_VideoPlayer-D35seHkm.css.map} +1 -1
  295. package/dist/C_VideoPlayer.css +13 -13
  296. package/dist/C_VideoPlayer.js.map +1 -1
  297. package/dist/C_VideoPlayer2.js +3 -3
  298. package/dist/C_VideoPlayer2.js.map +1 -1
  299. package/dist/{C_VtableGantt-BpY-Rng3.css.map → C_VtableGantt-C2lxFmWg.css.map} +1 -1
  300. package/dist/{C_VtableGantt-DB87-jdS.css.map → C_VtableGantt-Dwnkw_WL.css.map} +1 -1
  301. package/dist/C_VtableGantt.cjs +1 -1
  302. package/dist/C_VtableGantt.css +15 -15
  303. package/dist/C_VtableGantt.js +1 -1
  304. package/dist/C_VtableGantt.js.map +1 -1
  305. package/dist/C_VtableGantt2.js +1 -1
  306. package/dist/C_VtableGantt2.js.map +1 -1
  307. package/dist/C_WaterFall.js.map +1 -1
  308. package/dist/C_WaterFall2.js +1 -1
  309. package/dist/C_WaterFall2.js.map +1 -1
  310. package/dist/{C_WorkFlow-7F6op6qN.css.map → C_WorkFlow-2hJfvvTK.css.map} +1 -1
  311. package/dist/{C_WorkFlow-Cy3HWA6A.css.map → C_WorkFlow-DHoNjl8-.css.map} +1 -1
  312. package/dist/C_WorkFlow.cjs +1 -1
  313. package/dist/C_WorkFlow.css +108 -108
  314. package/dist/C_WorkFlow.js +1 -1
  315. package/dist/C_WorkFlow.js.map +1 -1
  316. package/dist/C_WorkFlow2.js +1 -1
  317. package/dist/C_WorkFlow2.js.map +1 -1
  318. package/dist/constants.d.ts +3 -3
  319. package/dist/constants2.d.ts +4 -4
  320. package/dist/constants3.d.ts +3 -3
  321. package/dist/constants4.d.ts +4 -4
  322. package/dist/constants5.d.ts +2 -2
  323. package/dist/data.d.ts +2 -2
  324. package/dist/index.cjs.map +1 -1
  325. package/dist/index.js.map +1 -1
  326. package/dist/index.vue.d.ts +1 -1
  327. package/dist/index10.vue.d.ts +1 -1
  328. package/dist/index11.vue.d.ts +4 -4
  329. package/dist/index12.vue.d.ts +1 -1
  330. package/dist/index13.vue.d.ts +2 -2
  331. package/dist/index14.vue.d.ts +3 -3
  332. package/dist/index15.vue.d.ts +3 -3
  333. package/dist/index16.vue.d.ts +2 -2
  334. package/dist/index17.vue.d.ts +1 -1
  335. package/dist/index18.vue.d.ts +5 -5
  336. package/dist/index2.vue.d.ts +1 -1
  337. package/dist/index20.vue.d.ts +1 -1
  338. package/dist/index22.vue.d.ts +1 -1
  339. package/dist/index23.vue.d.ts +2 -2
  340. package/dist/index24.vue.d.ts +1 -1
  341. package/dist/index26.vue.d.ts +3 -3
  342. package/dist/index27.vue.d.ts +2 -2
  343. package/dist/index28.vue.d.ts +3 -3
  344. package/dist/index3.vue.d.ts +3 -3
  345. package/dist/index4.vue.d.ts +2 -2
  346. package/dist/index6.vue.d.ts +6 -6
  347. package/dist/index7.vue.d.ts +2 -2
  348. package/dist/index8.vue.d.ts +1 -1
  349. package/dist/index9.vue.d.ts +2 -2
  350. package/dist/menuAdapter.js.map +1 -1
  351. package/dist/resolver.cjs.map +1 -1
  352. package/dist/resolver.js.map +1 -1
  353. package/dist/style.css +1483 -1483
  354. package/dist/themes/glass-morphism.css +1 -0
  355. package/dist/useCalendarEvents.d.ts +1 -1
  356. package/dist/useCollapsePanel.d.ts +1 -1
  357. package/dist/useCropperCore.d.ts +2 -2
  358. package/dist/useDraggableLayout.d.ts +4 -4
  359. package/dist/useDynamicFormState.d.ts +21 -21
  360. package/dist/useEdgeInteraction.d.ts +2 -2
  361. package/dist/useModalEdit.d.ts +1 -1
  362. package/dist/useQRCode.d.ts +3 -3
  363. package/dist/useSearchState.d.ts +2 -2
  364. package/dist/useSignatureHistory.d.ts +4 -4
  365. package/dist/useSplitResize.d.ts +2 -2
  366. package/dist/useTimeSelection.d.ts +2 -2
  367. package/dist/useTreeOperations.d.ts +3 -3
  368. package/dist/useWorkflowValidation.d.ts +6 -6
  369. package/package.json +11 -8
  370. package/dist/C_ActionBar-jZPsiXtT.css.map +0 -1
  371. package/dist/C_ActionBar-nnfbZCea.css.map +0 -1
  372. package/dist/C_Code-DPZlNSxL.css.map +0 -1
  373. package/dist/C_Code-avZjAnHD.css.map +0 -1
  374. package/dist/C_Editor-C49qURgb.css.map +0 -1
  375. package/dist/C_Editor-DuxBD9Qg.css.map +0 -1
  376. package/dist/C_FullCalendar-1U4VlG7X.css.map +0 -1
  377. package/dist/C_FullCalendar-DLUdCtqf.css.map +0 -1
  378. package/dist/C_Steps-BHYNJI1l.css.map +0 -1
  379. package/dist/C_Steps-DY7vl-4I.css.map +0 -1
  380. package/dist/C_Time-Bd_e1YDN.css.map +0 -1
  381. package/dist/C_Time-CKb_fwdm.css.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"C_AudioPlayer-CXl4yP_m.css","names":[],"sources":["../src/components/C_AudioPlayer/index.vue?vue&type=style&index=0&scoped=16f18960&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//**\n * C_AudioPlayer — 音频播放器样式\n */\n.c-audio-player[data-v-16f18960] {\n --ap-bg: var(--card-color);\n --ap-border: var(--border-color);\n --ap-accent: var(--primary-color);\n --ap-text: var(--text-color-1);\n --ap-text-sub: var(--text-color-3);\n --ap-progress-bg: color-mix(in srgb, var(--primary-color) 15%, var(--border-color));\n --ap-progress-fill: var(--primary-color);\n display: flex;\n flex-direction: column;\n border-radius: 12px;\n border: 1px solid var(--ap-border);\n background: var(--ap-bg);\n overflow: hidden;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);\n /* ======================== Now Playing ======================== */\n /* ======================== Progress ======================== */\n /* ======================== Controls ======================== */\n /* ======================== Volume ======================== */\n /* ======================== Playlist ======================== */\n /* ======================== Minimal Theme ======================== */\n}\n.c-audio-player__now-playing[data-v-16f18960] {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 20px;\n}\n.c-audio-player__cover[data-v-16f18960] {\n flex-shrink: 0;\n width: 72px;\n height: 72px;\n border-radius: 10px;\n overflow: hidden;\n background: color-mix(in srgb, var(--ap-accent) 10%, var(--ap-bg));\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n.c-audio-player__cover img[data-v-16f18960] {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n.c-audio-player__cover-placeholder[data-v-16f18960] {\n font-size: 32px;\n color: var(--ap-accent);\n opacity: 0.5;\n}\n.c-audio-player__info[data-v-16f18960] {\n flex: 1;\n min-width: 0;\n}\n.c-audio-player__title[data-v-16f18960] {\n font-size: 15px;\n font-weight: 600;\n color: var(--ap-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.c-audio-player__artist[data-v-16f18960] {\n font-size: 12px;\n color: var(--ap-text-sub);\n margin-top: 2px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.c-audio-player__progress[data-v-16f18960] {\n padding: 0 20px;\n}\n.c-audio-player__progress-bar[data-v-16f18960] {\n position: relative;\n width: 100%;\n height: 6px;\n border-radius: 3px;\n background: var(--ap-progress-bg);\n cursor: pointer;\n transition: height 0.15s;\n}\n.c-audio-player__progress-bar[data-v-16f18960]:hover {\n height: 8px;\n}\n.c-audio-player__progress-fill[data-v-16f18960] {\n height: 100%;\n border-radius: 3px;\n background: var(--ap-progress-fill);\n position: relative;\n transition: width 0.1s linear;\n}\n.c-audio-player__progress-fill[data-v-16f18960]::after {\n content: \"\";\n position: absolute;\n right: -5px;\n top: 50%;\n transform: translateY(-50%);\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background: var(--ap-accent);\n box-shadow: 0 0 4px rgba(0, 0, 0, 0.15);\n opacity: 0;\n transition: opacity 0.15s;\n}\n.c-audio-player__progress-bar:hover .c-audio-player__progress-fill[data-v-16f18960]::after {\n opacity: 1;\n}\n.c-audio-player__time[data-v-16f18960] {\n display: flex;\n justify-content: space-between;\n font-size: 11px;\n color: var(--ap-text-sub);\n margin-top: 4px;\n padding-bottom: 4px;\n}\n.c-audio-player__controls[data-v-16f18960] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 12px 20px;\n}\n.c-audio-player__ctrl-btn[data-v-16f18960] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n color: var(--ap-text);\n cursor: pointer;\n border-radius: 50%;\n transition: background 0.2s, color 0.2s, transform 0.15s;\n}\n.c-audio-player__ctrl-btn[data-v-16f18960]:hover {\n color: var(--ap-accent);\n background: color-mix(in srgb, var(--ap-accent) 10%, transparent);\n}\n.c-audio-player__ctrl-btn[data-v-16f18960]:active {\n transform: scale(0.92);\n}\n.c-audio-player__ctrl-btn.is-mode[data-v-16f18960] {\n font-size: 18px;\n width: 34px;\n height: 34px;\n}\n.c-audio-player__ctrl-btn.is-skip[data-v-16f18960] {\n font-size: 22px;\n width: 38px;\n height: 38px;\n}\n.c-audio-player__ctrl-btn.is-play[data-v-16f18960] {\n font-size: 28px;\n width: 48px;\n height: 48px;\n background: var(--ap-accent);\n color: #fff;\n}\n.c-audio-player__ctrl-btn.is-play[data-v-16f18960]:hover {\n background: color-mix(in srgb, var(--ap-accent) 85%, #000);\n color: #fff;\n box-shadow: 0 2px 10px color-mix(in srgb, var(--ap-accent) 35%, transparent);\n}\n.c-audio-player__volume[data-v-16f18960] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 0 20px 12px;\n justify-content: flex-end;\n}\n.c-audio-player__volume-icon[data-v-16f18960] {\n font-size: 18px;\n color: var(--ap-text-sub);\n cursor: pointer;\n}\n.c-audio-player__volume-icon[data-v-16f18960]:hover {\n color: var(--ap-accent);\n}\n.c-audio-player__volume-slider[data-v-16f18960] {\n width: 100px;\n}\n.c-audio-player__playlist[data-v-16f18960] {\n border-top: 1px solid var(--ap-border);\n max-height: 260px;\n overflow-y: auto;\n}\n.c-audio-player__playlist-header[data-v-16f18960] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 20px;\n font-size: 12px;\n font-weight: 600;\n color: var(--ap-text-sub);\n background: color-mix(in srgb, var(--ap-accent) 4%, var(--ap-bg));\n border-bottom: 1px solid var(--ap-border);\n position: sticky;\n top: 0;\n z-index: 1;\n}\n.c-audio-player__track[data-v-16f18960] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 20px;\n cursor: pointer;\n transition: background 0.15s;\n}\n.c-audio-player__track[data-v-16f18960]:hover {\n background: color-mix(in srgb, var(--ap-accent) 6%, var(--ap-bg));\n}\n.c-audio-player__track.is-active[data-v-16f18960] {\n background: color-mix(in srgb, var(--ap-accent) 10%, var(--ap-bg));\n}\n.c-audio-player__track.is-active .c-audio-player__track-title[data-v-16f18960] {\n color: var(--ap-accent);\n font-weight: 600;\n}\n.c-audio-player__track-index[data-v-16f18960] {\n font-size: 12px;\n width: 20px;\n text-align: center;\n color: var(--ap-text-sub);\n flex-shrink: 0;\n}\n.c-audio-player__track-info[data-v-16f18960] {\n flex: 1;\n min-width: 0;\n}\n.c-audio-player__track-title[data-v-16f18960] {\n font-size: 13px;\n color: var(--ap-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.c-audio-player__track-artist[data-v-16f18960] {\n font-size: 11px;\n color: var(--ap-text-sub);\n margin-top: 1px;\n}\n.c-audio-player__track-duration[data-v-16f18960] {\n font-size: 11px;\n color: var(--ap-text-sub);\n flex-shrink: 0;\n}\n.c-audio-player.is-minimal[data-v-16f18960] {\n border-radius: 99px;\n padding: 6px 16px;\n flex-direction: row;\n align-items: center;\n gap: 10px;\n box-shadow: 0 1px 6px rgba(0, 0, 0, 0.05);\n}\n.c-audio-player.is-minimal .c-audio-player__now-playing[data-v-16f18960] {\n padding: 0;\n gap: 10px;\n}\n.c-audio-player.is-minimal .c-audio-player__cover[data-v-16f18960] {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n}\n.c-audio-player.is-minimal .c-audio-player__progress[data-v-16f18960],\n.c-audio-player.is-minimal .c-audio-player__playlist[data-v-16f18960],\n.c-audio-player.is-minimal .c-audio-player__volume[data-v-16f18960] {\n display: none;\n}\n.c-audio-player.is-minimal .c-audio-player__controls[data-v-16f18960] {\n padding: 4px 0;\n gap: 2px;\n}\n.c-audio-player.is-minimal .c-audio-player__ctrl-btn.is-play[data-v-16f18960] {\n width: 34px;\n height: 34px;\n font-size: 20px;\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
1
+ {"version":3,"file":"C_AudioPlayer-DKRIGhi7.css","names":[],"sources":["../src/components/C_AudioPlayer/index.vue?vue&type=style&index=0&scoped=3cb14639&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//**\n * C_AudioPlayer — 音频播放器样式\n */\n.c-audio-player[data-v-3cb14639] {\n --ap-bg: var(--card-color);\n --ap-border: var(--border-color);\n --ap-accent: var(--primary-color);\n --ap-text: var(--text-color-1);\n --ap-text-sub: var(--text-color-3);\n --ap-progress-bg: color-mix(in srgb, var(--primary-color) 15%, var(--border-color));\n --ap-progress-fill: var(--primary-color);\n display: flex;\n flex-direction: column;\n border-radius: 12px;\n border: 1px solid var(--ap-border);\n background: var(--ap-bg);\n overflow: hidden;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);\n /* ======================== Now Playing ======================== */\n /* ======================== Progress ======================== */\n /* ======================== Controls ======================== */\n /* ======================== Volume ======================== */\n /* ======================== Playlist ======================== */\n /* ======================== Minimal Theme ======================== */\n}\n.c-audio-player__now-playing[data-v-3cb14639] {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 20px;\n}\n.c-audio-player__cover[data-v-3cb14639] {\n flex-shrink: 0;\n width: 72px;\n height: 72px;\n border-radius: 10px;\n overflow: hidden;\n background: color-mix(in srgb, var(--ap-accent) 10%, var(--ap-bg));\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n.c-audio-player__cover img[data-v-3cb14639] {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n.c-audio-player__cover-placeholder[data-v-3cb14639] {\n font-size: 32px;\n color: var(--ap-accent);\n opacity: 0.5;\n}\n.c-audio-player__info[data-v-3cb14639] {\n flex: 1;\n min-width: 0;\n}\n.c-audio-player__title[data-v-3cb14639] {\n font-size: 15px;\n font-weight: 600;\n color: var(--ap-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.c-audio-player__artist[data-v-3cb14639] {\n font-size: 12px;\n color: var(--ap-text-sub);\n margin-top: 2px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.c-audio-player__progress[data-v-3cb14639] {\n padding: 0 20px;\n}\n.c-audio-player__progress-bar[data-v-3cb14639] {\n position: relative;\n width: 100%;\n height: 6px;\n border-radius: 3px;\n background: var(--ap-progress-bg);\n cursor: pointer;\n transition: height 0.15s;\n}\n.c-audio-player__progress-bar[data-v-3cb14639]:hover {\n height: 8px;\n}\n.c-audio-player__progress-fill[data-v-3cb14639] {\n height: 100%;\n border-radius: 3px;\n background: var(--ap-progress-fill);\n position: relative;\n transition: width 0.1s linear;\n}\n.c-audio-player__progress-fill[data-v-3cb14639]::after {\n content: \"\";\n position: absolute;\n right: -5px;\n top: 50%;\n transform: translateY(-50%);\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background: var(--ap-accent);\n box-shadow: 0 0 4px rgba(0, 0, 0, 0.15);\n opacity: 0;\n transition: opacity 0.15s;\n}\n.c-audio-player__progress-bar:hover .c-audio-player__progress-fill[data-v-3cb14639]::after {\n opacity: 1;\n}\n.c-audio-player__time[data-v-3cb14639] {\n display: flex;\n justify-content: space-between;\n font-size: 11px;\n color: var(--ap-text-sub);\n margin-top: 4px;\n padding-bottom: 4px;\n}\n.c-audio-player__controls[data-v-3cb14639] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 12px 20px;\n}\n.c-audio-player__ctrl-btn[data-v-3cb14639] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n color: var(--ap-text);\n cursor: pointer;\n border-radius: 50%;\n transition: background 0.2s, color 0.2s, transform 0.15s;\n}\n.c-audio-player__ctrl-btn[data-v-3cb14639]:hover {\n color: var(--ap-accent);\n background: color-mix(in srgb, var(--ap-accent) 10%, transparent);\n}\n.c-audio-player__ctrl-btn[data-v-3cb14639]:active {\n transform: scale(0.92);\n}\n.c-audio-player__ctrl-btn.is-mode[data-v-3cb14639] {\n font-size: 18px;\n width: 34px;\n height: 34px;\n}\n.c-audio-player__ctrl-btn.is-skip[data-v-3cb14639] {\n font-size: 22px;\n width: 38px;\n height: 38px;\n}\n.c-audio-player__ctrl-btn.is-play[data-v-3cb14639] {\n font-size: 28px;\n width: 48px;\n height: 48px;\n background: var(--ap-accent);\n color: #fff;\n}\n.c-audio-player__ctrl-btn.is-play[data-v-3cb14639]:hover {\n background: color-mix(in srgb, var(--ap-accent) 85%, #000);\n color: #fff;\n box-shadow: 0 2px 10px color-mix(in srgb, var(--ap-accent) 35%, transparent);\n}\n.c-audio-player__volume[data-v-3cb14639] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 0 20px 12px;\n justify-content: flex-end;\n}\n.c-audio-player__volume-icon[data-v-3cb14639] {\n font-size: 18px;\n color: var(--ap-text-sub);\n cursor: pointer;\n}\n.c-audio-player__volume-icon[data-v-3cb14639]:hover {\n color: var(--ap-accent);\n}\n.c-audio-player__volume-slider[data-v-3cb14639] {\n width: 100px;\n}\n.c-audio-player__playlist[data-v-3cb14639] {\n border-top: 1px solid var(--ap-border);\n max-height: 260px;\n overflow-y: auto;\n}\n.c-audio-player__playlist-header[data-v-3cb14639] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 20px;\n font-size: 12px;\n font-weight: 600;\n color: var(--ap-text-sub);\n background: color-mix(in srgb, var(--ap-accent) 4%, var(--ap-bg));\n border-bottom: 1px solid var(--ap-border);\n position: sticky;\n top: 0;\n z-index: 1;\n}\n.c-audio-player__track[data-v-3cb14639] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 20px;\n cursor: pointer;\n transition: background 0.15s;\n}\n.c-audio-player__track[data-v-3cb14639]:hover {\n background: color-mix(in srgb, var(--ap-accent) 6%, var(--ap-bg));\n}\n.c-audio-player__track.is-active[data-v-3cb14639] {\n background: color-mix(in srgb, var(--ap-accent) 10%, var(--ap-bg));\n}\n.c-audio-player__track.is-active .c-audio-player__track-title[data-v-3cb14639] {\n color: var(--ap-accent);\n font-weight: 600;\n}\n.c-audio-player__track-index[data-v-3cb14639] {\n font-size: 12px;\n width: 20px;\n text-align: center;\n color: var(--ap-text-sub);\n flex-shrink: 0;\n}\n.c-audio-player__track-info[data-v-3cb14639] {\n flex: 1;\n min-width: 0;\n}\n.c-audio-player__track-title[data-v-3cb14639] {\n font-size: 13px;\n color: var(--ap-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.c-audio-player__track-artist[data-v-3cb14639] {\n font-size: 11px;\n color: var(--ap-text-sub);\n margin-top: 1px;\n}\n.c-audio-player__track-duration[data-v-3cb14639] {\n font-size: 11px;\n color: var(--ap-text-sub);\n flex-shrink: 0;\n}\n.c-audio-player.is-minimal[data-v-3cb14639] {\n border-radius: 99px;\n padding: 6px 16px;\n flex-direction: row;\n align-items: center;\n gap: 10px;\n box-shadow: 0 1px 6px rgba(0, 0, 0, 0.05);\n}\n.c-audio-player.is-minimal .c-audio-player__now-playing[data-v-3cb14639] {\n padding: 0;\n gap: 10px;\n}\n.c-audio-player.is-minimal .c-audio-player__cover[data-v-3cb14639] {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n}\n.c-audio-player.is-minimal .c-audio-player__progress[data-v-3cb14639],\n.c-audio-player.is-minimal .c-audio-player__playlist[data-v-3cb14639],\n.c-audio-player.is-minimal .c-audio-player__volume[data-v-3cb14639] {\n display: none;\n}\n.c-audio-player.is-minimal .c-audio-player__controls[data-v-3cb14639] {\n padding: 4px 0;\n gap: 2px;\n}\n.c-audio-player.is-minimal .c-audio-player__ctrl-btn.is-play[data-v-3cb14639] {\n width: 34px;\n height: 34px;\n font-size: 20px;\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
@@ -1 +1 @@
1
- {"version":3,"file":"C_AudioPlayer-CcBtt71m.css","names":[],"sources":["../src/components/C_AudioPlayer/index.vue?vue&type=style&index=0&scoped=16f18960&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//**\n * C_AudioPlayer — 音频播放器样式\n */\n.c-audio-player[data-v-16f18960] {\n --ap-bg: var(--card-color);\n --ap-border: var(--border-color);\n --ap-accent: var(--primary-color);\n --ap-text: var(--text-color-1);\n --ap-text-sub: var(--text-color-3);\n --ap-progress-bg: color-mix(in srgb, var(--primary-color) 15%, var(--border-color));\n --ap-progress-fill: var(--primary-color);\n display: flex;\n flex-direction: column;\n border-radius: 12px;\n border: 1px solid var(--ap-border);\n background: var(--ap-bg);\n overflow: hidden;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);\n /* ======================== Now Playing ======================== */\n /* ======================== Progress ======================== */\n /* ======================== Controls ======================== */\n /* ======================== Volume ======================== */\n /* ======================== Playlist ======================== */\n /* ======================== Minimal Theme ======================== */\n}\n.c-audio-player__now-playing[data-v-16f18960] {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 20px;\n}\n.c-audio-player__cover[data-v-16f18960] {\n flex-shrink: 0;\n width: 72px;\n height: 72px;\n border-radius: 10px;\n overflow: hidden;\n background: color-mix(in srgb, var(--ap-accent) 10%, var(--ap-bg));\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n.c-audio-player__cover img[data-v-16f18960] {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n.c-audio-player__cover-placeholder[data-v-16f18960] {\n font-size: 32px;\n color: var(--ap-accent);\n opacity: 0.5;\n}\n.c-audio-player__info[data-v-16f18960] {\n flex: 1;\n min-width: 0;\n}\n.c-audio-player__title[data-v-16f18960] {\n font-size: 15px;\n font-weight: 600;\n color: var(--ap-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.c-audio-player__artist[data-v-16f18960] {\n font-size: 12px;\n color: var(--ap-text-sub);\n margin-top: 2px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.c-audio-player__progress[data-v-16f18960] {\n padding: 0 20px;\n}\n.c-audio-player__progress-bar[data-v-16f18960] {\n position: relative;\n width: 100%;\n height: 6px;\n border-radius: 3px;\n background: var(--ap-progress-bg);\n cursor: pointer;\n transition: height 0.15s;\n}\n.c-audio-player__progress-bar[data-v-16f18960]:hover {\n height: 8px;\n}\n.c-audio-player__progress-fill[data-v-16f18960] {\n height: 100%;\n border-radius: 3px;\n background: var(--ap-progress-fill);\n position: relative;\n transition: width 0.1s linear;\n}\n.c-audio-player__progress-fill[data-v-16f18960]::after {\n content: \"\";\n position: absolute;\n right: -5px;\n top: 50%;\n transform: translateY(-50%);\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background: var(--ap-accent);\n box-shadow: 0 0 4px rgba(0, 0, 0, 0.15);\n opacity: 0;\n transition: opacity 0.15s;\n}\n.c-audio-player__progress-bar:hover .c-audio-player__progress-fill[data-v-16f18960]::after {\n opacity: 1;\n}\n.c-audio-player__time[data-v-16f18960] {\n display: flex;\n justify-content: space-between;\n font-size: 11px;\n color: var(--ap-text-sub);\n margin-top: 4px;\n padding-bottom: 4px;\n}\n.c-audio-player__controls[data-v-16f18960] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 12px 20px;\n}\n.c-audio-player__ctrl-btn[data-v-16f18960] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n color: var(--ap-text);\n cursor: pointer;\n border-radius: 50%;\n transition: background 0.2s, color 0.2s, transform 0.15s;\n}\n.c-audio-player__ctrl-btn[data-v-16f18960]:hover {\n color: var(--ap-accent);\n background: color-mix(in srgb, var(--ap-accent) 10%, transparent);\n}\n.c-audio-player__ctrl-btn[data-v-16f18960]:active {\n transform: scale(0.92);\n}\n.c-audio-player__ctrl-btn.is-mode[data-v-16f18960] {\n font-size: 18px;\n width: 34px;\n height: 34px;\n}\n.c-audio-player__ctrl-btn.is-skip[data-v-16f18960] {\n font-size: 22px;\n width: 38px;\n height: 38px;\n}\n.c-audio-player__ctrl-btn.is-play[data-v-16f18960] {\n font-size: 28px;\n width: 48px;\n height: 48px;\n background: var(--ap-accent);\n color: #fff;\n}\n.c-audio-player__ctrl-btn.is-play[data-v-16f18960]:hover {\n background: color-mix(in srgb, var(--ap-accent) 85%, #000);\n color: #fff;\n box-shadow: 0 2px 10px color-mix(in srgb, var(--ap-accent) 35%, transparent);\n}\n.c-audio-player__volume[data-v-16f18960] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 0 20px 12px;\n justify-content: flex-end;\n}\n.c-audio-player__volume-icon[data-v-16f18960] {\n font-size: 18px;\n color: var(--ap-text-sub);\n cursor: pointer;\n}\n.c-audio-player__volume-icon[data-v-16f18960]:hover {\n color: var(--ap-accent);\n}\n.c-audio-player__volume-slider[data-v-16f18960] {\n width: 100px;\n}\n.c-audio-player__playlist[data-v-16f18960] {\n border-top: 1px solid var(--ap-border);\n max-height: 260px;\n overflow-y: auto;\n}\n.c-audio-player__playlist-header[data-v-16f18960] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 20px;\n font-size: 12px;\n font-weight: 600;\n color: var(--ap-text-sub);\n background: color-mix(in srgb, var(--ap-accent) 4%, var(--ap-bg));\n border-bottom: 1px solid var(--ap-border);\n position: sticky;\n top: 0;\n z-index: 1;\n}\n.c-audio-player__track[data-v-16f18960] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 20px;\n cursor: pointer;\n transition: background 0.15s;\n}\n.c-audio-player__track[data-v-16f18960]:hover {\n background: color-mix(in srgb, var(--ap-accent) 6%, var(--ap-bg));\n}\n.c-audio-player__track.is-active[data-v-16f18960] {\n background: color-mix(in srgb, var(--ap-accent) 10%, var(--ap-bg));\n}\n.c-audio-player__track.is-active .c-audio-player__track-title[data-v-16f18960] {\n color: var(--ap-accent);\n font-weight: 600;\n}\n.c-audio-player__track-index[data-v-16f18960] {\n font-size: 12px;\n width: 20px;\n text-align: center;\n color: var(--ap-text-sub);\n flex-shrink: 0;\n}\n.c-audio-player__track-info[data-v-16f18960] {\n flex: 1;\n min-width: 0;\n}\n.c-audio-player__track-title[data-v-16f18960] {\n font-size: 13px;\n color: var(--ap-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.c-audio-player__track-artist[data-v-16f18960] {\n font-size: 11px;\n color: var(--ap-text-sub);\n margin-top: 1px;\n}\n.c-audio-player__track-duration[data-v-16f18960] {\n font-size: 11px;\n color: var(--ap-text-sub);\n flex-shrink: 0;\n}\n.c-audio-player.is-minimal[data-v-16f18960] {\n border-radius: 99px;\n padding: 6px 16px;\n flex-direction: row;\n align-items: center;\n gap: 10px;\n box-shadow: 0 1px 6px rgba(0, 0, 0, 0.05);\n}\n.c-audio-player.is-minimal .c-audio-player__now-playing[data-v-16f18960] {\n padding: 0;\n gap: 10px;\n}\n.c-audio-player.is-minimal .c-audio-player__cover[data-v-16f18960] {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n}\n.c-audio-player.is-minimal .c-audio-player__progress[data-v-16f18960],\n.c-audio-player.is-minimal .c-audio-player__playlist[data-v-16f18960],\n.c-audio-player.is-minimal .c-audio-player__volume[data-v-16f18960] {\n display: none;\n}\n.c-audio-player.is-minimal .c-audio-player__controls[data-v-16f18960] {\n padding: 4px 0;\n gap: 2px;\n}\n.c-audio-player.is-minimal .c-audio-player__ctrl-btn.is-play[data-v-16f18960] {\n width: 34px;\n height: 34px;\n font-size: 20px;\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
1
+ {"version":3,"file":"C_AudioPlayer-DlB6eNsa.css","names":[],"sources":["../src/components/C_AudioPlayer/index.vue?vue&type=style&index=0&scoped=3cb14639&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//**\n * C_AudioPlayer — 音频播放器样式\n */\n.c-audio-player[data-v-3cb14639] {\n --ap-bg: var(--card-color);\n --ap-border: var(--border-color);\n --ap-accent: var(--primary-color);\n --ap-text: var(--text-color-1);\n --ap-text-sub: var(--text-color-3);\n --ap-progress-bg: color-mix(in srgb, var(--primary-color) 15%, var(--border-color));\n --ap-progress-fill: var(--primary-color);\n display: flex;\n flex-direction: column;\n border-radius: 12px;\n border: 1px solid var(--ap-border);\n background: var(--ap-bg);\n overflow: hidden;\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);\n /* ======================== Now Playing ======================== */\n /* ======================== Progress ======================== */\n /* ======================== Controls ======================== */\n /* ======================== Volume ======================== */\n /* ======================== Playlist ======================== */\n /* ======================== Minimal Theme ======================== */\n}\n.c-audio-player__now-playing[data-v-3cb14639] {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 20px;\n}\n.c-audio-player__cover[data-v-3cb14639] {\n flex-shrink: 0;\n width: 72px;\n height: 72px;\n border-radius: 10px;\n overflow: hidden;\n background: color-mix(in srgb, var(--ap-accent) 10%, var(--ap-bg));\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n}\n.c-audio-player__cover img[data-v-3cb14639] {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n.c-audio-player__cover-placeholder[data-v-3cb14639] {\n font-size: 32px;\n color: var(--ap-accent);\n opacity: 0.5;\n}\n.c-audio-player__info[data-v-3cb14639] {\n flex: 1;\n min-width: 0;\n}\n.c-audio-player__title[data-v-3cb14639] {\n font-size: 15px;\n font-weight: 600;\n color: var(--ap-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.c-audio-player__artist[data-v-3cb14639] {\n font-size: 12px;\n color: var(--ap-text-sub);\n margin-top: 2px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.c-audio-player__progress[data-v-3cb14639] {\n padding: 0 20px;\n}\n.c-audio-player__progress-bar[data-v-3cb14639] {\n position: relative;\n width: 100%;\n height: 6px;\n border-radius: 3px;\n background: var(--ap-progress-bg);\n cursor: pointer;\n transition: height 0.15s;\n}\n.c-audio-player__progress-bar[data-v-3cb14639]:hover {\n height: 8px;\n}\n.c-audio-player__progress-fill[data-v-3cb14639] {\n height: 100%;\n border-radius: 3px;\n background: var(--ap-progress-fill);\n position: relative;\n transition: width 0.1s linear;\n}\n.c-audio-player__progress-fill[data-v-3cb14639]::after {\n content: \"\";\n position: absolute;\n right: -5px;\n top: 50%;\n transform: translateY(-50%);\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background: var(--ap-accent);\n box-shadow: 0 0 4px rgba(0, 0, 0, 0.15);\n opacity: 0;\n transition: opacity 0.15s;\n}\n.c-audio-player__progress-bar:hover .c-audio-player__progress-fill[data-v-3cb14639]::after {\n opacity: 1;\n}\n.c-audio-player__time[data-v-3cb14639] {\n display: flex;\n justify-content: space-between;\n font-size: 11px;\n color: var(--ap-text-sub);\n margin-top: 4px;\n padding-bottom: 4px;\n}\n.c-audio-player__controls[data-v-3cb14639] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 12px 20px;\n}\n.c-audio-player__ctrl-btn[data-v-3cb14639] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n background: transparent;\n color: var(--ap-text);\n cursor: pointer;\n border-radius: 50%;\n transition: background 0.2s, color 0.2s, transform 0.15s;\n}\n.c-audio-player__ctrl-btn[data-v-3cb14639]:hover {\n color: var(--ap-accent);\n background: color-mix(in srgb, var(--ap-accent) 10%, transparent);\n}\n.c-audio-player__ctrl-btn[data-v-3cb14639]:active {\n transform: scale(0.92);\n}\n.c-audio-player__ctrl-btn.is-mode[data-v-3cb14639] {\n font-size: 18px;\n width: 34px;\n height: 34px;\n}\n.c-audio-player__ctrl-btn.is-skip[data-v-3cb14639] {\n font-size: 22px;\n width: 38px;\n height: 38px;\n}\n.c-audio-player__ctrl-btn.is-play[data-v-3cb14639] {\n font-size: 28px;\n width: 48px;\n height: 48px;\n background: var(--ap-accent);\n color: #fff;\n}\n.c-audio-player__ctrl-btn.is-play[data-v-3cb14639]:hover {\n background: color-mix(in srgb, var(--ap-accent) 85%, #000);\n color: #fff;\n box-shadow: 0 2px 10px color-mix(in srgb, var(--ap-accent) 35%, transparent);\n}\n.c-audio-player__volume[data-v-3cb14639] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 0 20px 12px;\n justify-content: flex-end;\n}\n.c-audio-player__volume-icon[data-v-3cb14639] {\n font-size: 18px;\n color: var(--ap-text-sub);\n cursor: pointer;\n}\n.c-audio-player__volume-icon[data-v-3cb14639]:hover {\n color: var(--ap-accent);\n}\n.c-audio-player__volume-slider[data-v-3cb14639] {\n width: 100px;\n}\n.c-audio-player__playlist[data-v-3cb14639] {\n border-top: 1px solid var(--ap-border);\n max-height: 260px;\n overflow-y: auto;\n}\n.c-audio-player__playlist-header[data-v-3cb14639] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 20px;\n font-size: 12px;\n font-weight: 600;\n color: var(--ap-text-sub);\n background: color-mix(in srgb, var(--ap-accent) 4%, var(--ap-bg));\n border-bottom: 1px solid var(--ap-border);\n position: sticky;\n top: 0;\n z-index: 1;\n}\n.c-audio-player__track[data-v-3cb14639] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 20px;\n cursor: pointer;\n transition: background 0.15s;\n}\n.c-audio-player__track[data-v-3cb14639]:hover {\n background: color-mix(in srgb, var(--ap-accent) 6%, var(--ap-bg));\n}\n.c-audio-player__track.is-active[data-v-3cb14639] {\n background: color-mix(in srgb, var(--ap-accent) 10%, var(--ap-bg));\n}\n.c-audio-player__track.is-active .c-audio-player__track-title[data-v-3cb14639] {\n color: var(--ap-accent);\n font-weight: 600;\n}\n.c-audio-player__track-index[data-v-3cb14639] {\n font-size: 12px;\n width: 20px;\n text-align: center;\n color: var(--ap-text-sub);\n flex-shrink: 0;\n}\n.c-audio-player__track-info[data-v-3cb14639] {\n flex: 1;\n min-width: 0;\n}\n.c-audio-player__track-title[data-v-3cb14639] {\n font-size: 13px;\n color: var(--ap-text);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.c-audio-player__track-artist[data-v-3cb14639] {\n font-size: 11px;\n color: var(--ap-text-sub);\n margin-top: 1px;\n}\n.c-audio-player__track-duration[data-v-3cb14639] {\n font-size: 11px;\n color: var(--ap-text-sub);\n flex-shrink: 0;\n}\n.c-audio-player.is-minimal[data-v-3cb14639] {\n border-radius: 99px;\n padding: 6px 16px;\n flex-direction: row;\n align-items: center;\n gap: 10px;\n box-shadow: 0 1px 6px rgba(0, 0, 0, 0.05);\n}\n.c-audio-player.is-minimal .c-audio-player__now-playing[data-v-3cb14639] {\n padding: 0;\n gap: 10px;\n}\n.c-audio-player.is-minimal .c-audio-player__cover[data-v-3cb14639] {\n width: 36px;\n height: 36px;\n border-radius: 50%;\n}\n.c-audio-player.is-minimal .c-audio-player__progress[data-v-3cb14639],\n.c-audio-player.is-minimal .c-audio-player__playlist[data-v-3cb14639],\n.c-audio-player.is-minimal .c-audio-player__volume[data-v-3cb14639] {\n display: none;\n}\n.c-audio-player.is-minimal .c-audio-player__controls[data-v-3cb14639] {\n padding: 4px 0;\n gap: 2px;\n}\n.c-audio-player.is-minimal .c-audio-player__ctrl-btn.is-play[data-v-3cb14639] {\n width: 34px;\n height: 34px;\n font-size: 20px;\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`}),require(`./C_Icon.js`);const e=require(`./C_AudioPlayer.js`);exports.C_AudioPlayer=e.t,exports.DEFAULT_AUDIO_PLAYER_PROPS=e.n,exports.MODE_ICON_MAP=e.r,exports.formatTime=e.i;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./C_AudioPlayer.js`);exports.C_AudioPlayer=e.t,exports.DEFAULT_AUDIO_PLAYER_PROPS=e.n,exports.MODE_ICON_MAP=e.r,exports.formatTime=e.i;
@@ -1,7 +1,7 @@
1
1
  /* unplugin-vue-components disabled *//**
2
2
  * C_AudioPlayer — 音频播放器样式
3
3
  */
4
- .c-audio-player[data-v-16f18960] {
4
+ .c-audio-player[data-v-3cb14639] {
5
5
  --ap-bg: var(--card-color);
6
6
  --ap-border: var(--border-color);
7
7
  --ap-accent: var(--primary-color);
@@ -23,13 +23,13 @@
23
23
  /* ======================== Playlist ======================== */
24
24
  /* ======================== Minimal Theme ======================== */
25
25
  }
26
- .c-audio-player__now-playing[data-v-16f18960] {
26
+ .c-audio-player__now-playing[data-v-3cb14639] {
27
27
  display: flex;
28
28
  align-items: center;
29
29
  gap: 16px;
30
30
  padding: 20px;
31
31
  }
32
- .c-audio-player__cover[data-v-16f18960] {
32
+ .c-audio-player__cover[data-v-3cb14639] {
33
33
  flex-shrink: 0;
34
34
  width: 72px;
35
35
  height: 72px;
@@ -41,21 +41,21 @@
41
41
  justify-content: center;
42
42
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
43
43
  }
44
- .c-audio-player__cover img[data-v-16f18960] {
44
+ .c-audio-player__cover img[data-v-3cb14639] {
45
45
  width: 100%;
46
46
  height: 100%;
47
47
  object-fit: cover;
48
48
  }
49
- .c-audio-player__cover-placeholder[data-v-16f18960] {
49
+ .c-audio-player__cover-placeholder[data-v-3cb14639] {
50
50
  font-size: 32px;
51
51
  color: var(--ap-accent);
52
52
  opacity: 0.5;
53
53
  }
54
- .c-audio-player__info[data-v-16f18960] {
54
+ .c-audio-player__info[data-v-3cb14639] {
55
55
  flex: 1;
56
56
  min-width: 0;
57
57
  }
58
- .c-audio-player__title[data-v-16f18960] {
58
+ .c-audio-player__title[data-v-3cb14639] {
59
59
  font-size: 15px;
60
60
  font-weight: 600;
61
61
  color: var(--ap-text);
@@ -63,7 +63,7 @@
63
63
  text-overflow: ellipsis;
64
64
  white-space: nowrap;
65
65
  }
66
- .c-audio-player__artist[data-v-16f18960] {
66
+ .c-audio-player__artist[data-v-3cb14639] {
67
67
  font-size: 12px;
68
68
  color: var(--ap-text-sub);
69
69
  margin-top: 2px;
@@ -71,10 +71,10 @@
71
71
  text-overflow: ellipsis;
72
72
  white-space: nowrap;
73
73
  }
74
- .c-audio-player__progress[data-v-16f18960] {
74
+ .c-audio-player__progress[data-v-3cb14639] {
75
75
  padding: 0 20px;
76
76
  }
77
- .c-audio-player__progress-bar[data-v-16f18960] {
77
+ .c-audio-player__progress-bar[data-v-3cb14639] {
78
78
  position: relative;
79
79
  width: 100%;
80
80
  height: 6px;
@@ -83,17 +83,17 @@
83
83
  cursor: pointer;
84
84
  transition: height 0.15s;
85
85
  }
86
- .c-audio-player__progress-bar[data-v-16f18960]:hover {
86
+ .c-audio-player__progress-bar[data-v-3cb14639]:hover {
87
87
  height: 8px;
88
88
  }
89
- .c-audio-player__progress-fill[data-v-16f18960] {
89
+ .c-audio-player__progress-fill[data-v-3cb14639] {
90
90
  height: 100%;
91
91
  border-radius: 3px;
92
92
  background: var(--ap-progress-fill);
93
93
  position: relative;
94
94
  transition: width 0.1s linear;
95
95
  }
96
- .c-audio-player__progress-fill[data-v-16f18960]::after {
96
+ .c-audio-player__progress-fill[data-v-3cb14639]::after {
97
97
  content: "";
98
98
  position: absolute;
99
99
  right: -5px;
@@ -107,10 +107,10 @@
107
107
  opacity: 0;
108
108
  transition: opacity 0.15s;
109
109
  }
110
- .c-audio-player__progress-bar:hover .c-audio-player__progress-fill[data-v-16f18960]::after {
110
+ .c-audio-player__progress-bar:hover .c-audio-player__progress-fill[data-v-3cb14639]::after {
111
111
  opacity: 1;
112
112
  }
113
- .c-audio-player__time[data-v-16f18960] {
113
+ .c-audio-player__time[data-v-3cb14639] {
114
114
  display: flex;
115
115
  justify-content: space-between;
116
116
  font-size: 11px;
@@ -118,14 +118,14 @@
118
118
  margin-top: 4px;
119
119
  padding-bottom: 4px;
120
120
  }
121
- .c-audio-player__controls[data-v-16f18960] {
121
+ .c-audio-player__controls[data-v-3cb14639] {
122
122
  display: flex;
123
123
  align-items: center;
124
124
  justify-content: center;
125
125
  gap: 8px;
126
126
  padding: 12px 20px;
127
127
  }
128
- .c-audio-player__ctrl-btn[data-v-16f18960] {
128
+ .c-audio-player__ctrl-btn[data-v-3cb14639] {
129
129
  display: inline-flex;
130
130
  align-items: center;
131
131
  justify-content: center;
@@ -136,59 +136,59 @@
136
136
  border-radius: 50%;
137
137
  transition: background 0.2s, color 0.2s, transform 0.15s;
138
138
  }
139
- .c-audio-player__ctrl-btn[data-v-16f18960]:hover {
139
+ .c-audio-player__ctrl-btn[data-v-3cb14639]:hover {
140
140
  color: var(--ap-accent);
141
141
  background: color-mix(in srgb, var(--ap-accent) 10%, transparent);
142
142
  }
143
- .c-audio-player__ctrl-btn[data-v-16f18960]:active {
143
+ .c-audio-player__ctrl-btn[data-v-3cb14639]:active {
144
144
  transform: scale(0.92);
145
145
  }
146
- .c-audio-player__ctrl-btn.is-mode[data-v-16f18960] {
146
+ .c-audio-player__ctrl-btn.is-mode[data-v-3cb14639] {
147
147
  font-size: 18px;
148
148
  width: 34px;
149
149
  height: 34px;
150
150
  }
151
- .c-audio-player__ctrl-btn.is-skip[data-v-16f18960] {
151
+ .c-audio-player__ctrl-btn.is-skip[data-v-3cb14639] {
152
152
  font-size: 22px;
153
153
  width: 38px;
154
154
  height: 38px;
155
155
  }
156
- .c-audio-player__ctrl-btn.is-play[data-v-16f18960] {
156
+ .c-audio-player__ctrl-btn.is-play[data-v-3cb14639] {
157
157
  font-size: 28px;
158
158
  width: 48px;
159
159
  height: 48px;
160
160
  background: var(--ap-accent);
161
161
  color: #fff;
162
162
  }
163
- .c-audio-player__ctrl-btn.is-play[data-v-16f18960]:hover {
163
+ .c-audio-player__ctrl-btn.is-play[data-v-3cb14639]:hover {
164
164
  background: color-mix(in srgb, var(--ap-accent) 85%, #000);
165
165
  color: #fff;
166
166
  box-shadow: 0 2px 10px color-mix(in srgb, var(--ap-accent) 35%, transparent);
167
167
  }
168
- .c-audio-player__volume[data-v-16f18960] {
168
+ .c-audio-player__volume[data-v-3cb14639] {
169
169
  display: flex;
170
170
  align-items: center;
171
171
  gap: 6px;
172
172
  padding: 0 20px 12px;
173
173
  justify-content: flex-end;
174
174
  }
175
- .c-audio-player__volume-icon[data-v-16f18960] {
175
+ .c-audio-player__volume-icon[data-v-3cb14639] {
176
176
  font-size: 18px;
177
177
  color: var(--ap-text-sub);
178
178
  cursor: pointer;
179
179
  }
180
- .c-audio-player__volume-icon[data-v-16f18960]:hover {
180
+ .c-audio-player__volume-icon[data-v-3cb14639]:hover {
181
181
  color: var(--ap-accent);
182
182
  }
183
- .c-audio-player__volume-slider[data-v-16f18960] {
183
+ .c-audio-player__volume-slider[data-v-3cb14639] {
184
184
  width: 100px;
185
185
  }
186
- .c-audio-player__playlist[data-v-16f18960] {
186
+ .c-audio-player__playlist[data-v-3cb14639] {
187
187
  border-top: 1px solid var(--ap-border);
188
188
  max-height: 260px;
189
189
  overflow-y: auto;
190
190
  }
191
- .c-audio-player__playlist-header[data-v-16f18960] {
191
+ .c-audio-player__playlist-header[data-v-3cb14639] {
192
192
  display: flex;
193
193
  align-items: center;
194
194
  justify-content: space-between;
@@ -202,7 +202,7 @@
202
202
  top: 0;
203
203
  z-index: 1;
204
204
  }
205
- .c-audio-player__track[data-v-16f18960] {
205
+ .c-audio-player__track[data-v-3cb14639] {
206
206
  display: flex;
207
207
  align-items: center;
208
208
  gap: 12px;
@@ -210,45 +210,45 @@
210
210
  cursor: pointer;
211
211
  transition: background 0.15s;
212
212
  }
213
- .c-audio-player__track[data-v-16f18960]:hover {
213
+ .c-audio-player__track[data-v-3cb14639]:hover {
214
214
  background: color-mix(in srgb, var(--ap-accent) 6%, var(--ap-bg));
215
215
  }
216
- .c-audio-player__track.is-active[data-v-16f18960] {
216
+ .c-audio-player__track.is-active[data-v-3cb14639] {
217
217
  background: color-mix(in srgb, var(--ap-accent) 10%, var(--ap-bg));
218
218
  }
219
- .c-audio-player__track.is-active .c-audio-player__track-title[data-v-16f18960] {
219
+ .c-audio-player__track.is-active .c-audio-player__track-title[data-v-3cb14639] {
220
220
  color: var(--ap-accent);
221
221
  font-weight: 600;
222
222
  }
223
- .c-audio-player__track-index[data-v-16f18960] {
223
+ .c-audio-player__track-index[data-v-3cb14639] {
224
224
  font-size: 12px;
225
225
  width: 20px;
226
226
  text-align: center;
227
227
  color: var(--ap-text-sub);
228
228
  flex-shrink: 0;
229
229
  }
230
- .c-audio-player__track-info[data-v-16f18960] {
230
+ .c-audio-player__track-info[data-v-3cb14639] {
231
231
  flex: 1;
232
232
  min-width: 0;
233
233
  }
234
- .c-audio-player__track-title[data-v-16f18960] {
234
+ .c-audio-player__track-title[data-v-3cb14639] {
235
235
  font-size: 13px;
236
236
  color: var(--ap-text);
237
237
  overflow: hidden;
238
238
  text-overflow: ellipsis;
239
239
  white-space: nowrap;
240
240
  }
241
- .c-audio-player__track-artist[data-v-16f18960] {
241
+ .c-audio-player__track-artist[data-v-3cb14639] {
242
242
  font-size: 11px;
243
243
  color: var(--ap-text-sub);
244
244
  margin-top: 1px;
245
245
  }
246
- .c-audio-player__track-duration[data-v-16f18960] {
246
+ .c-audio-player__track-duration[data-v-3cb14639] {
247
247
  font-size: 11px;
248
248
  color: var(--ap-text-sub);
249
249
  flex-shrink: 0;
250
250
  }
251
- .c-audio-player.is-minimal[data-v-16f18960] {
251
+ .c-audio-player.is-minimal[data-v-3cb14639] {
252
252
  border-radius: 99px;
253
253
  padding: 6px 16px;
254
254
  flex-direction: row;
@@ -256,28 +256,28 @@
256
256
  gap: 10px;
257
257
  box-shadow: 0 1px 6px rgba(0, 0, 0, 0.05);
258
258
  }
259
- .c-audio-player.is-minimal .c-audio-player__now-playing[data-v-16f18960] {
259
+ .c-audio-player.is-minimal .c-audio-player__now-playing[data-v-3cb14639] {
260
260
  padding: 0;
261
261
  gap: 10px;
262
262
  }
263
- .c-audio-player.is-minimal .c-audio-player__cover[data-v-16f18960] {
263
+ .c-audio-player.is-minimal .c-audio-player__cover[data-v-3cb14639] {
264
264
  width: 36px;
265
265
  height: 36px;
266
266
  border-radius: 50%;
267
267
  }
268
- .c-audio-player.is-minimal .c-audio-player__progress[data-v-16f18960],
269
- .c-audio-player.is-minimal .c-audio-player__playlist[data-v-16f18960],
270
- .c-audio-player.is-minimal .c-audio-player__volume[data-v-16f18960] {
268
+ .c-audio-player.is-minimal .c-audio-player__progress[data-v-3cb14639],
269
+ .c-audio-player.is-minimal .c-audio-player__playlist[data-v-3cb14639],
270
+ .c-audio-player.is-minimal .c-audio-player__volume[data-v-3cb14639] {
271
271
  display: none;
272
272
  }
273
- .c-audio-player.is-minimal .c-audio-player__controls[data-v-16f18960] {
273
+ .c-audio-player.is-minimal .c-audio-player__controls[data-v-3cb14639] {
274
274
  padding: 4px 0;
275
275
  gap: 2px;
276
276
  }
277
- .c-audio-player.is-minimal .c-audio-player__ctrl-btn.is-play[data-v-16f18960] {
277
+ .c-audio-player.is-minimal .c-audio-player__ctrl-btn.is-play[data-v-3cb14639] {
278
278
  width: 34px;
279
279
  height: 34px;
280
280
  font-size: 20px;
281
281
  }
282
282
 
283
- /*# sourceMappingURL=C_AudioPlayer-CXl4yP_m.css.map*/
283
+ /*# sourceMappingURL=C_AudioPlayer-DKRIGhi7.css.map*/
@@ -1 +1 @@
1
- import"./C_Icon2.js";import{i as e,n as t,r as n,t as r}from"./C_AudioPlayer2.js";export{r as C_AudioPlayer,t as DEFAULT_AUDIO_PLAYER_PROPS,n as MODE_ICON_MAP,e as formatTime};
1
+ import{i as e,n as t,r as n,t as r}from"./C_AudioPlayer2.js";export{r as C_AudioPlayer,t as DEFAULT_AUDIO_PLAYER_PROPS,n as MODE_ICON_MAP,e as formatTime};
@@ -1 +1 @@
1
- {"version":3,"file":"C_AudioPlayer.js","names":["theme","showCover","showPlaylist","tracks"],"sources":["../src/components/C_AudioPlayer/types.ts","../src/components/C_AudioPlayer/index.vue","../src/components/C_AudioPlayer/index.vue","../src/components/C_AudioPlayer/index.vue"],"sourcesContent":["/**\r\n * @Description: Audio player component type definitions\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved.\r\n */\r\n\r\n/** Single audio track */\r\nexport interface AudioTrack {\r\n /** Unique identifier */\r\n id: string | number\r\n /** Track title */\r\n title: string\r\n /** Artist / author */\r\n artist?: string\r\n /** Audio source URL */\r\n src: string\r\n /** Cover image URL */\r\n cover?: string\r\n /** Duration in seconds (optional, for static display) */\r\n duration?: number\r\n /** Extra data */\r\n extra?: Record<string, unknown>\r\n}\r\n\r\n/** Component props */\r\nexport interface AudioPlayerProps {\r\n /** Playlist */\r\n tracks: AudioTrack[]\r\n /** Initial active index */\r\n initialIndex?: number\r\n /** Whether to show the playlist panel */\r\n showPlaylist?: boolean\r\n /** Whether to show the cover art */\r\n showCover?: boolean\r\n /** Whether to auto-play on mount */\r\n autoplay?: boolean\r\n /** Playback mode */\r\n mode?: 'list' | 'loop' | 'single' | 'shuffle'\r\n /** Theme appearance */\r\n theme?: 'default' | 'minimal'\r\n}\r\n\r\n/** Default props */\r\nexport const DEFAULT_AUDIO_PLAYER_PROPS: Partial<AudioPlayerProps> = {\r\n initialIndex: 0,\r\n showPlaylist: true,\r\n showCover: true,\r\n autoplay: false,\r\n mode: 'list',\r\n theme: 'default',\r\n}\r\n\r\n/** Playback mode icon map */\r\nexport const MODE_ICON_MAP: Record<string, { icon: string; label: string }> = {\r\n list: { icon: 'mdi:repeat', label: 'List Loop' },\r\n loop: { icon: 'mdi:repeat-once', label: 'Single Loop' },\r\n single: { icon: 'mdi:numeric-1-box', label: 'Play Once' },\r\n shuffle: { icon: 'mdi:shuffle-variant', label: 'Shuffle' },\r\n}\r\n\r\n/** Format seconds to mm:ss */\r\nexport function formatTime(seconds: number): string {\r\n if (!Number.isFinite(seconds) || seconds < 0) return '00:00'\r\n const m = Math.floor(seconds / 60)\r\n const s = Math.floor(seconds % 60)\r\n return `${String(m).padStart(2, '0')}:${String(s).padStart(2, '0')}`\r\n}\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Description: 音频播放器组件\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\r\n-->\r\n<template>\r\n <div\r\n class=\"c-audio-player\"\r\n :class=\"{ 'is-minimal': theme === 'minimal' }\"\r\n >\r\n <!-- ================ Now Playing ================ -->\r\n <div class=\"c-audio-player__now-playing\">\r\n <div\r\n v-if=\"showCover\"\r\n class=\"c-audio-player__cover\"\r\n >\r\n <img\r\n v-if=\"currentTrack?.cover\"\r\n :src=\"currentTrack.cover\"\r\n :alt=\"currentTrack.title\"\r\n />\r\n <C_Icon\r\n v-else\r\n name=\"mdi:music-note\"\r\n class=\"c-audio-player__cover-placeholder\"\r\n />\r\n </div>\r\n <div class=\"c-audio-player__info\">\r\n <div class=\"c-audio-player__title\">{{\r\n currentTrack?.title ?? '未选择曲目'\r\n }}</div>\r\n <div\r\n v-if=\"currentTrack?.artist\"\r\n class=\"c-audio-player__artist\"\r\n >\r\n {{ currentTrack.artist }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ================ Progress ================ -->\r\n <div\r\n v-if=\"theme !== 'minimal'\"\r\n class=\"c-audio-player__progress\"\r\n >\r\n <div\r\n class=\"c-audio-player__progress-bar\"\r\n @click=\"seekByClick\"\r\n >\r\n <div\r\n class=\"c-audio-player__progress-fill\"\r\n :style=\"{ width: `${progressPercent}%` }\"\r\n />\r\n </div>\r\n <div class=\"c-audio-player__time\">\r\n <span>{{ formatTime(currentTime) }}</span>\r\n <span>{{ formatTime(totalDuration) }}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- ================ Controls ================ -->\r\n <div class=\"c-audio-player__controls\">\r\n <button\r\n class=\"c-audio-player__ctrl-btn is-mode\"\r\n :title=\"currentModeLabel\"\r\n @click=\"cycleMode\"\r\n >\r\n <C_Icon :name=\"currentModeIcon\" />\r\n </button>\r\n <button\r\n class=\"c-audio-player__ctrl-btn is-skip\"\r\n title=\"上一曲\"\r\n @click=\"prev\"\r\n >\r\n <C_Icon name=\"mdi:skip-previous\" />\r\n </button>\r\n <button\r\n class=\"c-audio-player__ctrl-btn is-play\"\r\n :title=\"isPlaying ? '暂停' : '播放'\"\r\n @click=\"togglePlay\"\r\n >\r\n <C_Icon :name=\"isPlaying ? 'mdi:pause' : 'mdi:play'\" />\r\n </button>\r\n <button\r\n class=\"c-audio-player__ctrl-btn is-skip\"\r\n title=\"下一曲\"\r\n @click=\"next\"\r\n >\r\n <C_Icon name=\"mdi:skip-next\" />\r\n </button>\r\n <button\r\n class=\"c-audio-player__ctrl-btn is-mode\"\r\n title=\"播放列表\"\r\n @click=\"playlistVisible = !playlistVisible\"\r\n >\r\n <C_Icon name=\"mdi:playlist-music\" />\r\n </button>\r\n </div>\r\n\r\n <!-- ================ Volume ================ -->\r\n <div\r\n v-if=\"theme !== 'minimal'\"\r\n class=\"c-audio-player__volume\"\r\n >\r\n <C_Icon\r\n :name=\"volumeIcon\"\r\n class=\"c-audio-player__volume-icon\"\r\n @click=\"toggleMute\"\r\n />\r\n <NSlider\r\n v-model:value=\"volume\"\r\n :min=\"0\"\r\n :max=\"100\"\r\n :step=\"1\"\r\n class=\"c-audio-player__volume-slider\"\r\n @update:value=\"handleVolumeChange\"\r\n />\r\n </div>\r\n\r\n <!-- ================ Playlist ================ -->\r\n <div\r\n v-if=\"showPlaylist && playlistVisible && theme !== 'minimal'\"\r\n class=\"c-audio-player__playlist\"\r\n >\r\n <div class=\"c-audio-player__playlist-header\">\r\n <span>播放列表</span>\r\n <span>{{ tracks.length }} 首</span>\r\n </div>\r\n <div\r\n v-for=\"(track, idx) in tracks\"\r\n :key=\"track.id\"\r\n class=\"c-audio-player__track\"\r\n :class=\"{ 'is-active': idx === activeIndex }\"\r\n @click=\"playTrack(idx)\"\r\n >\r\n <span class=\"c-audio-player__track-index\">\r\n <C_Icon\r\n v-if=\"idx === activeIndex && isPlaying\"\r\n name=\"mdi:volume-high\"\r\n />\r\n <template v-else>{{ idx + 1 }}</template>\r\n </span>\r\n <div class=\"c-audio-player__track-info\">\r\n <div class=\"c-audio-player__track-title\">{{ track.title }}</div>\r\n <div\r\n v-if=\"track.artist\"\r\n class=\"c-audio-player__track-artist\"\r\n >\r\n {{ track.artist }}\r\n </div>\r\n </div>\r\n <span\r\n v-if=\"track.duration\"\r\n class=\"c-audio-player__track-duration\"\r\n >\r\n {{ formatTime(track.duration) }}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { computed, onBeforeUnmount, ref, watch } from 'vue'\r\n import C_Icon from '../C_Icon/index.vue'\r\n import {\r\n DEFAULT_AUDIO_PLAYER_PROPS,\r\n formatTime,\r\n MODE_ICON_MAP,\r\n type AudioPlayerProps,\r\n } from './types'\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n tracks: AudioPlayerProps['tracks']\r\n initialIndex?: number\r\n showPlaylist?: boolean\r\n showCover?: boolean\r\n autoplay?: boolean\r\n mode?: AudioPlayerProps['mode']\r\n theme?: AudioPlayerProps['theme']\r\n }>(),\r\n {\r\n initialIndex: DEFAULT_AUDIO_PLAYER_PROPS.initialIndex,\r\n showPlaylist: DEFAULT_AUDIO_PLAYER_PROPS.showPlaylist,\r\n showCover: true,\r\n autoplay: DEFAULT_AUDIO_PLAYER_PROPS.autoplay,\r\n mode: DEFAULT_AUDIO_PLAYER_PROPS.mode,\r\n theme: DEFAULT_AUDIO_PLAYER_PROPS.theme,\r\n }\r\n )\r\n\r\n const emit = defineEmits<{\r\n play: [index: number]\r\n pause: []\r\n ended: [index: number]\r\n modeChange: [mode: string]\r\n }>()\r\n\r\n // ==================== Audio Core ====================\r\n\r\n let audio: HTMLAudioElement | null = null\r\n\r\n const activeIndex = ref(props.initialIndex ?? 0)\r\n const isPlaying = ref(false)\r\n const currentTime = ref(0)\r\n const totalDuration = ref(0)\r\n const volume = ref(70)\r\n const prevVolume = ref(70)\r\n const playlistVisible = ref(props.showPlaylist)\r\n const playMode = ref(props.mode ?? 'list')\r\n\r\n const currentTrack = computed(() => props.tracks[activeIndex.value])\r\n\r\n const progressPercent = computed(() => {\r\n if (totalDuration.value === 0) return 0\r\n return (currentTime.value / totalDuration.value) * 100\r\n })\r\n\r\n const volumeIcon = computed(() => {\r\n if (volume.value === 0) return 'mdi:volume-off'\r\n if (volume.value < 40) return 'mdi:volume-low'\r\n if (volume.value < 70) return 'mdi:volume-medium'\r\n return 'mdi:volume-high'\r\n })\r\n\r\n const currentModeIcon = computed(\r\n () => MODE_ICON_MAP[playMode.value]?.icon ?? 'mdi:repeat'\r\n )\r\n const currentModeLabel = computed(\r\n () => MODE_ICON_MAP[playMode.value]?.label ?? '循环'\r\n )\r\n\r\n /** 初始化音频实例 */\r\n function initAudio() {\r\n if (audio) {\r\n audio.pause()\r\n audio.removeEventListener('timeupdate', onTimeUpdate)\r\n audio.removeEventListener('loadedmetadata', onMetaLoaded)\r\n audio.removeEventListener('ended', onEnded)\r\n }\r\n const track = currentTrack.value\r\n if (!track) return\r\n\r\n audio = new Audio(track.src)\r\n audio.volume = volume.value / 100\r\n audio.addEventListener('timeupdate', onTimeUpdate)\r\n audio.addEventListener('loadedmetadata', onMetaLoaded)\r\n audio.addEventListener('ended', onEnded)\r\n }\r\n\r\n /** 播放进度更新回调 */\r\n function onTimeUpdate() {\r\n if (audio) currentTime.value = audio.currentTime\r\n }\r\n\r\n /** 音频元数据加载完成回调 */\r\n function onMetaLoaded() {\r\n if (audio) totalDuration.value = audio.duration\r\n }\r\n\r\n /** 播放结束回调,根据模式决定下一步 */\r\n function onEnded() {\r\n emit('ended', activeIndex.value)\r\n switch (playMode.value) {\r\n case 'loop':\r\n audio?.play().catch(() => {})\r\n break\r\n case 'single':\r\n isPlaying.value = false\r\n break\r\n case 'shuffle':\r\n playTrack(Math.floor(Math.random() * props.tracks.length))\r\n break\r\n default: // list\r\n if (activeIndex.value < props.tracks.length - 1) next()\r\n else {\r\n activeIndex.value = 0\r\n initAudio()\r\n audio?.play().catch(() => {})\r\n }\r\n }\r\n }\r\n\r\n /** 切换播放/暂停 */\r\n function togglePlay() {\r\n if (!audio) initAudio()\r\n if (isPlaying.value) {\r\n audio?.pause()\r\n isPlaying.value = false\r\n emit('pause')\r\n } else {\r\n audio?.play().catch(() => {})\r\n isPlaying.value = true\r\n emit('play', activeIndex.value)\r\n }\r\n }\r\n\r\n /** 播放指定索引的曲目 */\r\n function playTrack(idx: number) {\r\n activeIndex.value = idx\r\n initAudio()\r\n audio?.play().catch(() => {})\r\n isPlaying.value = true\r\n emit('play', idx)\r\n }\r\n\r\n /** 上一曲 */\r\n function prev() {\r\n const idx =\r\n activeIndex.value <= 0 ? props.tracks.length - 1 : activeIndex.value - 1\r\n playTrack(idx)\r\n }\r\n\r\n /** 下一曲 */\r\n function next() {\r\n const idx =\r\n activeIndex.value >= props.tracks.length - 1 ? 0 : activeIndex.value + 1\r\n playTrack(idx)\r\n }\r\n\r\n /** 点击进度条跳转播放位置 */\r\n function seekByClick(e: MouseEvent) {\r\n if (!audio || !totalDuration.value) return\r\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect()\r\n const ratio = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width))\r\n audio.currentTime = ratio * totalDuration.value\r\n currentTime.value = audio.currentTime\r\n }\r\n\r\n /** 处理音量变更 */\r\n function handleVolumeChange(val: number) {\r\n volume.value = val\r\n if (audio) audio.volume = val / 100\r\n }\r\n\r\n /** 切换静音状态 */\r\n function toggleMute() {\r\n if (volume.value > 0) {\r\n prevVolume.value = volume.value\r\n volume.value = 0\r\n } else {\r\n volume.value = prevVolume.value || 70\r\n }\r\n if (audio) audio.volume = volume.value / 100\r\n }\r\n\r\n const MODES = ['list', 'loop', 'single', 'shuffle'] as const\r\n /** 循环切换播放模式 */\r\n function cycleMode() {\r\n const idx = MODES.indexOf(playMode.value as (typeof MODES)[number])\r\n playMode.value = MODES[(idx + 1) % MODES.length]\r\n emit('modeChange', playMode.value)\r\n }\r\n\r\n // ==================== Lifecycle ====================\r\n\r\n watch(\r\n () => props.tracks,\r\n () => {\r\n activeIndex.value = 0\r\n initAudio()\r\n }\r\n )\r\n\r\n watch(\r\n () => props.initialIndex,\r\n val => {\r\n if (val !== undefined && val !== activeIndex.value) {\r\n activeIndex.value = val\r\n initAudio()\r\n }\r\n }\r\n )\r\n\r\n onBeforeUnmount(() => {\r\n if (audio) {\r\n audio.pause()\r\n audio.removeEventListener('timeupdate', onTimeUpdate)\r\n audio.removeEventListener('loadedmetadata', onMetaLoaded)\r\n audio.removeEventListener('ended', onEnded)\r\n audio = null\r\n }\r\n })\r\n\r\n // 自动播放\r\n if (props.autoplay && props.tracks.length > 0) {\r\n playTrack(activeIndex.value)\r\n }\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n @use './index.scss';\r\n</style>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Description: 音频播放器组件\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\r\n-->\r\n<template>\r\n <div\r\n class=\"c-audio-player\"\r\n :class=\"{ 'is-minimal': theme === 'minimal' }\"\r\n >\r\n <!-- ================ Now Playing ================ -->\r\n <div class=\"c-audio-player__now-playing\">\r\n <div\r\n v-if=\"showCover\"\r\n class=\"c-audio-player__cover\"\r\n >\r\n <img\r\n v-if=\"currentTrack?.cover\"\r\n :src=\"currentTrack.cover\"\r\n :alt=\"currentTrack.title\"\r\n />\r\n <C_Icon\r\n v-else\r\n name=\"mdi:music-note\"\r\n class=\"c-audio-player__cover-placeholder\"\r\n />\r\n </div>\r\n <div class=\"c-audio-player__info\">\r\n <div class=\"c-audio-player__title\">{{\r\n currentTrack?.title ?? '未选择曲目'\r\n }}</div>\r\n <div\r\n v-if=\"currentTrack?.artist\"\r\n class=\"c-audio-player__artist\"\r\n >\r\n {{ currentTrack.artist }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ================ Progress ================ -->\r\n <div\r\n v-if=\"theme !== 'minimal'\"\r\n class=\"c-audio-player__progress\"\r\n >\r\n <div\r\n class=\"c-audio-player__progress-bar\"\r\n @click=\"seekByClick\"\r\n >\r\n <div\r\n class=\"c-audio-player__progress-fill\"\r\n :style=\"{ width: `${progressPercent}%` }\"\r\n />\r\n </div>\r\n <div class=\"c-audio-player__time\">\r\n <span>{{ formatTime(currentTime) }}</span>\r\n <span>{{ formatTime(totalDuration) }}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- ================ Controls ================ -->\r\n <div class=\"c-audio-player__controls\">\r\n <button\r\n class=\"c-audio-player__ctrl-btn is-mode\"\r\n :title=\"currentModeLabel\"\r\n @click=\"cycleMode\"\r\n >\r\n <C_Icon :name=\"currentModeIcon\" />\r\n </button>\r\n <button\r\n class=\"c-audio-player__ctrl-btn is-skip\"\r\n title=\"上一曲\"\r\n @click=\"prev\"\r\n >\r\n <C_Icon name=\"mdi:skip-previous\" />\r\n </button>\r\n <button\r\n class=\"c-audio-player__ctrl-btn is-play\"\r\n :title=\"isPlaying ? '暂停' : '播放'\"\r\n @click=\"togglePlay\"\r\n >\r\n <C_Icon :name=\"isPlaying ? 'mdi:pause' : 'mdi:play'\" />\r\n </button>\r\n <button\r\n class=\"c-audio-player__ctrl-btn is-skip\"\r\n title=\"下一曲\"\r\n @click=\"next\"\r\n >\r\n <C_Icon name=\"mdi:skip-next\" />\r\n </button>\r\n <button\r\n class=\"c-audio-player__ctrl-btn is-mode\"\r\n title=\"播放列表\"\r\n @click=\"playlistVisible = !playlistVisible\"\r\n >\r\n <C_Icon name=\"mdi:playlist-music\" />\r\n </button>\r\n </div>\r\n\r\n <!-- ================ Volume ================ -->\r\n <div\r\n v-if=\"theme !== 'minimal'\"\r\n class=\"c-audio-player__volume\"\r\n >\r\n <C_Icon\r\n :name=\"volumeIcon\"\r\n class=\"c-audio-player__volume-icon\"\r\n @click=\"toggleMute\"\r\n />\r\n <NSlider\r\n v-model:value=\"volume\"\r\n :min=\"0\"\r\n :max=\"100\"\r\n :step=\"1\"\r\n class=\"c-audio-player__volume-slider\"\r\n @update:value=\"handleVolumeChange\"\r\n />\r\n </div>\r\n\r\n <!-- ================ Playlist ================ -->\r\n <div\r\n v-if=\"showPlaylist && playlistVisible && theme !== 'minimal'\"\r\n class=\"c-audio-player__playlist\"\r\n >\r\n <div class=\"c-audio-player__playlist-header\">\r\n <span>播放列表</span>\r\n <span>{{ tracks.length }} 首</span>\r\n </div>\r\n <div\r\n v-for=\"(track, idx) in tracks\"\r\n :key=\"track.id\"\r\n class=\"c-audio-player__track\"\r\n :class=\"{ 'is-active': idx === activeIndex }\"\r\n @click=\"playTrack(idx)\"\r\n >\r\n <span class=\"c-audio-player__track-index\">\r\n <C_Icon\r\n v-if=\"idx === activeIndex && isPlaying\"\r\n name=\"mdi:volume-high\"\r\n />\r\n <template v-else>{{ idx + 1 }}</template>\r\n </span>\r\n <div class=\"c-audio-player__track-info\">\r\n <div class=\"c-audio-player__track-title\">{{ track.title }}</div>\r\n <div\r\n v-if=\"track.artist\"\r\n class=\"c-audio-player__track-artist\"\r\n >\r\n {{ track.artist }}\r\n </div>\r\n </div>\r\n <span\r\n v-if=\"track.duration\"\r\n class=\"c-audio-player__track-duration\"\r\n >\r\n {{ formatTime(track.duration) }}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { computed, onBeforeUnmount, ref, watch } from 'vue'\r\n import C_Icon from '../C_Icon/index.vue'\r\n import {\r\n DEFAULT_AUDIO_PLAYER_PROPS,\r\n formatTime,\r\n MODE_ICON_MAP,\r\n type AudioPlayerProps,\r\n } from './types'\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n tracks: AudioPlayerProps['tracks']\r\n initialIndex?: number\r\n showPlaylist?: boolean\r\n showCover?: boolean\r\n autoplay?: boolean\r\n mode?: AudioPlayerProps['mode']\r\n theme?: AudioPlayerProps['theme']\r\n }>(),\r\n {\r\n initialIndex: DEFAULT_AUDIO_PLAYER_PROPS.initialIndex,\r\n showPlaylist: DEFAULT_AUDIO_PLAYER_PROPS.showPlaylist,\r\n showCover: true,\r\n autoplay: DEFAULT_AUDIO_PLAYER_PROPS.autoplay,\r\n mode: DEFAULT_AUDIO_PLAYER_PROPS.mode,\r\n theme: DEFAULT_AUDIO_PLAYER_PROPS.theme,\r\n }\r\n )\r\n\r\n const emit = defineEmits<{\r\n play: [index: number]\r\n pause: []\r\n ended: [index: number]\r\n modeChange: [mode: string]\r\n }>()\r\n\r\n // ==================== Audio Core ====================\r\n\r\n let audio: HTMLAudioElement | null = null\r\n\r\n const activeIndex = ref(props.initialIndex ?? 0)\r\n const isPlaying = ref(false)\r\n const currentTime = ref(0)\r\n const totalDuration = ref(0)\r\n const volume = ref(70)\r\n const prevVolume = ref(70)\r\n const playlistVisible = ref(props.showPlaylist)\r\n const playMode = ref(props.mode ?? 'list')\r\n\r\n const currentTrack = computed(() => props.tracks[activeIndex.value])\r\n\r\n const progressPercent = computed(() => {\r\n if (totalDuration.value === 0) return 0\r\n return (currentTime.value / totalDuration.value) * 100\r\n })\r\n\r\n const volumeIcon = computed(() => {\r\n if (volume.value === 0) return 'mdi:volume-off'\r\n if (volume.value < 40) return 'mdi:volume-low'\r\n if (volume.value < 70) return 'mdi:volume-medium'\r\n return 'mdi:volume-high'\r\n })\r\n\r\n const currentModeIcon = computed(\r\n () => MODE_ICON_MAP[playMode.value]?.icon ?? 'mdi:repeat'\r\n )\r\n const currentModeLabel = computed(\r\n () => MODE_ICON_MAP[playMode.value]?.label ?? '循环'\r\n )\r\n\r\n /** 初始化音频实例 */\r\n function initAudio() {\r\n if (audio) {\r\n audio.pause()\r\n audio.removeEventListener('timeupdate', onTimeUpdate)\r\n audio.removeEventListener('loadedmetadata', onMetaLoaded)\r\n audio.removeEventListener('ended', onEnded)\r\n }\r\n const track = currentTrack.value\r\n if (!track) return\r\n\r\n audio = new Audio(track.src)\r\n audio.volume = volume.value / 100\r\n audio.addEventListener('timeupdate', onTimeUpdate)\r\n audio.addEventListener('loadedmetadata', onMetaLoaded)\r\n audio.addEventListener('ended', onEnded)\r\n }\r\n\r\n /** 播放进度更新回调 */\r\n function onTimeUpdate() {\r\n if (audio) currentTime.value = audio.currentTime\r\n }\r\n\r\n /** 音频元数据加载完成回调 */\r\n function onMetaLoaded() {\r\n if (audio) totalDuration.value = audio.duration\r\n }\r\n\r\n /** 播放结束回调,根据模式决定下一步 */\r\n function onEnded() {\r\n emit('ended', activeIndex.value)\r\n switch (playMode.value) {\r\n case 'loop':\r\n audio?.play().catch(() => {})\r\n break\r\n case 'single':\r\n isPlaying.value = false\r\n break\r\n case 'shuffle':\r\n playTrack(Math.floor(Math.random() * props.tracks.length))\r\n break\r\n default: // list\r\n if (activeIndex.value < props.tracks.length - 1) next()\r\n else {\r\n activeIndex.value = 0\r\n initAudio()\r\n audio?.play().catch(() => {})\r\n }\r\n }\r\n }\r\n\r\n /** 切换播放/暂停 */\r\n function togglePlay() {\r\n if (!audio) initAudio()\r\n if (isPlaying.value) {\r\n audio?.pause()\r\n isPlaying.value = false\r\n emit('pause')\r\n } else {\r\n audio?.play().catch(() => {})\r\n isPlaying.value = true\r\n emit('play', activeIndex.value)\r\n }\r\n }\r\n\r\n /** 播放指定索引的曲目 */\r\n function playTrack(idx: number) {\r\n activeIndex.value = idx\r\n initAudio()\r\n audio?.play().catch(() => {})\r\n isPlaying.value = true\r\n emit('play', idx)\r\n }\r\n\r\n /** 上一曲 */\r\n function prev() {\r\n const idx =\r\n activeIndex.value <= 0 ? props.tracks.length - 1 : activeIndex.value - 1\r\n playTrack(idx)\r\n }\r\n\r\n /** 下一曲 */\r\n function next() {\r\n const idx =\r\n activeIndex.value >= props.tracks.length - 1 ? 0 : activeIndex.value + 1\r\n playTrack(idx)\r\n }\r\n\r\n /** 点击进度条跳转播放位置 */\r\n function seekByClick(e: MouseEvent) {\r\n if (!audio || !totalDuration.value) return\r\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect()\r\n const ratio = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width))\r\n audio.currentTime = ratio * totalDuration.value\r\n currentTime.value = audio.currentTime\r\n }\r\n\r\n /** 处理音量变更 */\r\n function handleVolumeChange(val: number) {\r\n volume.value = val\r\n if (audio) audio.volume = val / 100\r\n }\r\n\r\n /** 切换静音状态 */\r\n function toggleMute() {\r\n if (volume.value > 0) {\r\n prevVolume.value = volume.value\r\n volume.value = 0\r\n } else {\r\n volume.value = prevVolume.value || 70\r\n }\r\n if (audio) audio.volume = volume.value / 100\r\n }\r\n\r\n const MODES = ['list', 'loop', 'single', 'shuffle'] as const\r\n /** 循环切换播放模式 */\r\n function cycleMode() {\r\n const idx = MODES.indexOf(playMode.value as (typeof MODES)[number])\r\n playMode.value = MODES[(idx + 1) % MODES.length]\r\n emit('modeChange', playMode.value)\r\n }\r\n\r\n // ==================== Lifecycle ====================\r\n\r\n watch(\r\n () => props.tracks,\r\n () => {\r\n activeIndex.value = 0\r\n initAudio()\r\n }\r\n )\r\n\r\n watch(\r\n () => props.initialIndex,\r\n val => {\r\n if (val !== undefined && val !== activeIndex.value) {\r\n activeIndex.value = val\r\n initAudio()\r\n }\r\n }\r\n )\r\n\r\n onBeforeUnmount(() => {\r\n if (audio) {\r\n audio.pause()\r\n audio.removeEventListener('timeupdate', onTimeUpdate)\r\n audio.removeEventListener('loadedmetadata', onMetaLoaded)\r\n audio.removeEventListener('ended', onEnded)\r\n audio = null\r\n }\r\n })\r\n\r\n // 自动播放\r\n if (props.autoplay && props.tracks.length > 0) {\r\n playTrack(activeIndex.value)\r\n }\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n @use './index.scss';\r\n</style>\r\n","<!--\r\n * @Description: 音频播放器组件\r\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\r\n-->\r\n<template>\r\n <div\r\n class=\"c-audio-player\"\r\n :class=\"{ 'is-minimal': theme === 'minimal' }\"\r\n >\r\n <!-- ================ Now Playing ================ -->\r\n <div class=\"c-audio-player__now-playing\">\r\n <div\r\n v-if=\"showCover\"\r\n class=\"c-audio-player__cover\"\r\n >\r\n <img\r\n v-if=\"currentTrack?.cover\"\r\n :src=\"currentTrack.cover\"\r\n :alt=\"currentTrack.title\"\r\n />\r\n <C_Icon\r\n v-else\r\n name=\"mdi:music-note\"\r\n class=\"c-audio-player__cover-placeholder\"\r\n />\r\n </div>\r\n <div class=\"c-audio-player__info\">\r\n <div class=\"c-audio-player__title\">{{\r\n currentTrack?.title ?? '未选择曲目'\r\n }}</div>\r\n <div\r\n v-if=\"currentTrack?.artist\"\r\n class=\"c-audio-player__artist\"\r\n >\r\n {{ currentTrack.artist }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ================ Progress ================ -->\r\n <div\r\n v-if=\"theme !== 'minimal'\"\r\n class=\"c-audio-player__progress\"\r\n >\r\n <div\r\n class=\"c-audio-player__progress-bar\"\r\n @click=\"seekByClick\"\r\n >\r\n <div\r\n class=\"c-audio-player__progress-fill\"\r\n :style=\"{ width: `${progressPercent}%` }\"\r\n />\r\n </div>\r\n <div class=\"c-audio-player__time\">\r\n <span>{{ formatTime(currentTime) }}</span>\r\n <span>{{ formatTime(totalDuration) }}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- ================ Controls ================ -->\r\n <div class=\"c-audio-player__controls\">\r\n <button\r\n class=\"c-audio-player__ctrl-btn is-mode\"\r\n :title=\"currentModeLabel\"\r\n @click=\"cycleMode\"\r\n >\r\n <C_Icon :name=\"currentModeIcon\" />\r\n </button>\r\n <button\r\n class=\"c-audio-player__ctrl-btn is-skip\"\r\n title=\"上一曲\"\r\n @click=\"prev\"\r\n >\r\n <C_Icon name=\"mdi:skip-previous\" />\r\n </button>\r\n <button\r\n class=\"c-audio-player__ctrl-btn is-play\"\r\n :title=\"isPlaying ? '暂停' : '播放'\"\r\n @click=\"togglePlay\"\r\n >\r\n <C_Icon :name=\"isPlaying ? 'mdi:pause' : 'mdi:play'\" />\r\n </button>\r\n <button\r\n class=\"c-audio-player__ctrl-btn is-skip\"\r\n title=\"下一曲\"\r\n @click=\"next\"\r\n >\r\n <C_Icon name=\"mdi:skip-next\" />\r\n </button>\r\n <button\r\n class=\"c-audio-player__ctrl-btn is-mode\"\r\n title=\"播放列表\"\r\n @click=\"playlistVisible = !playlistVisible\"\r\n >\r\n <C_Icon name=\"mdi:playlist-music\" />\r\n </button>\r\n </div>\r\n\r\n <!-- ================ Volume ================ -->\r\n <div\r\n v-if=\"theme !== 'minimal'\"\r\n class=\"c-audio-player__volume\"\r\n >\r\n <C_Icon\r\n :name=\"volumeIcon\"\r\n class=\"c-audio-player__volume-icon\"\r\n @click=\"toggleMute\"\r\n />\r\n <NSlider\r\n v-model:value=\"volume\"\r\n :min=\"0\"\r\n :max=\"100\"\r\n :step=\"1\"\r\n class=\"c-audio-player__volume-slider\"\r\n @update:value=\"handleVolumeChange\"\r\n />\r\n </div>\r\n\r\n <!-- ================ Playlist ================ -->\r\n <div\r\n v-if=\"showPlaylist && playlistVisible && theme !== 'minimal'\"\r\n class=\"c-audio-player__playlist\"\r\n >\r\n <div class=\"c-audio-player__playlist-header\">\r\n <span>播放列表</span>\r\n <span>{{ tracks.length }} 首</span>\r\n </div>\r\n <div\r\n v-for=\"(track, idx) in tracks\"\r\n :key=\"track.id\"\r\n class=\"c-audio-player__track\"\r\n :class=\"{ 'is-active': idx === activeIndex }\"\r\n @click=\"playTrack(idx)\"\r\n >\r\n <span class=\"c-audio-player__track-index\">\r\n <C_Icon\r\n v-if=\"idx === activeIndex && isPlaying\"\r\n name=\"mdi:volume-high\"\r\n />\r\n <template v-else>{{ idx + 1 }}</template>\r\n </span>\r\n <div class=\"c-audio-player__track-info\">\r\n <div class=\"c-audio-player__track-title\">{{ track.title }}</div>\r\n <div\r\n v-if=\"track.artist\"\r\n class=\"c-audio-player__track-artist\"\r\n >\r\n {{ track.artist }}\r\n </div>\r\n </div>\r\n <span\r\n v-if=\"track.duration\"\r\n class=\"c-audio-player__track-duration\"\r\n >\r\n {{ formatTime(track.duration) }}\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\n import { computed, onBeforeUnmount, ref, watch } from 'vue'\r\n import C_Icon from '../C_Icon/index.vue'\r\n import {\r\n DEFAULT_AUDIO_PLAYER_PROPS,\r\n formatTime,\r\n MODE_ICON_MAP,\r\n type AudioPlayerProps,\r\n } from './types'\r\n\r\n const props = withDefaults(\r\n defineProps<{\r\n tracks: AudioPlayerProps['tracks']\r\n initialIndex?: number\r\n showPlaylist?: boolean\r\n showCover?: boolean\r\n autoplay?: boolean\r\n mode?: AudioPlayerProps['mode']\r\n theme?: AudioPlayerProps['theme']\r\n }>(),\r\n {\r\n initialIndex: DEFAULT_AUDIO_PLAYER_PROPS.initialIndex,\r\n showPlaylist: DEFAULT_AUDIO_PLAYER_PROPS.showPlaylist,\r\n showCover: true,\r\n autoplay: DEFAULT_AUDIO_PLAYER_PROPS.autoplay,\r\n mode: DEFAULT_AUDIO_PLAYER_PROPS.mode,\r\n theme: DEFAULT_AUDIO_PLAYER_PROPS.theme,\r\n }\r\n )\r\n\r\n const emit = defineEmits<{\r\n play: [index: number]\r\n pause: []\r\n ended: [index: number]\r\n modeChange: [mode: string]\r\n }>()\r\n\r\n // ==================== Audio Core ====================\r\n\r\n let audio: HTMLAudioElement | null = null\r\n\r\n const activeIndex = ref(props.initialIndex ?? 0)\r\n const isPlaying = ref(false)\r\n const currentTime = ref(0)\r\n const totalDuration = ref(0)\r\n const volume = ref(70)\r\n const prevVolume = ref(70)\r\n const playlistVisible = ref(props.showPlaylist)\r\n const playMode = ref(props.mode ?? 'list')\r\n\r\n const currentTrack = computed(() => props.tracks[activeIndex.value])\r\n\r\n const progressPercent = computed(() => {\r\n if (totalDuration.value === 0) return 0\r\n return (currentTime.value / totalDuration.value) * 100\r\n })\r\n\r\n const volumeIcon = computed(() => {\r\n if (volume.value === 0) return 'mdi:volume-off'\r\n if (volume.value < 40) return 'mdi:volume-low'\r\n if (volume.value < 70) return 'mdi:volume-medium'\r\n return 'mdi:volume-high'\r\n })\r\n\r\n const currentModeIcon = computed(\r\n () => MODE_ICON_MAP[playMode.value]?.icon ?? 'mdi:repeat'\r\n )\r\n const currentModeLabel = computed(\r\n () => MODE_ICON_MAP[playMode.value]?.label ?? '循环'\r\n )\r\n\r\n /** 初始化音频实例 */\r\n function initAudio() {\r\n if (audio) {\r\n audio.pause()\r\n audio.removeEventListener('timeupdate', onTimeUpdate)\r\n audio.removeEventListener('loadedmetadata', onMetaLoaded)\r\n audio.removeEventListener('ended', onEnded)\r\n }\r\n const track = currentTrack.value\r\n if (!track) return\r\n\r\n audio = new Audio(track.src)\r\n audio.volume = volume.value / 100\r\n audio.addEventListener('timeupdate', onTimeUpdate)\r\n audio.addEventListener('loadedmetadata', onMetaLoaded)\r\n audio.addEventListener('ended', onEnded)\r\n }\r\n\r\n /** 播放进度更新回调 */\r\n function onTimeUpdate() {\r\n if (audio) currentTime.value = audio.currentTime\r\n }\r\n\r\n /** 音频元数据加载完成回调 */\r\n function onMetaLoaded() {\r\n if (audio) totalDuration.value = audio.duration\r\n }\r\n\r\n /** 播放结束回调,根据模式决定下一步 */\r\n function onEnded() {\r\n emit('ended', activeIndex.value)\r\n switch (playMode.value) {\r\n case 'loop':\r\n audio?.play().catch(() => {})\r\n break\r\n case 'single':\r\n isPlaying.value = false\r\n break\r\n case 'shuffle':\r\n playTrack(Math.floor(Math.random() * props.tracks.length))\r\n break\r\n default: // list\r\n if (activeIndex.value < props.tracks.length - 1) next()\r\n else {\r\n activeIndex.value = 0\r\n initAudio()\r\n audio?.play().catch(() => {})\r\n }\r\n }\r\n }\r\n\r\n /** 切换播放/暂停 */\r\n function togglePlay() {\r\n if (!audio) initAudio()\r\n if (isPlaying.value) {\r\n audio?.pause()\r\n isPlaying.value = false\r\n emit('pause')\r\n } else {\r\n audio?.play().catch(() => {})\r\n isPlaying.value = true\r\n emit('play', activeIndex.value)\r\n }\r\n }\r\n\r\n /** 播放指定索引的曲目 */\r\n function playTrack(idx: number) {\r\n activeIndex.value = idx\r\n initAudio()\r\n audio?.play().catch(() => {})\r\n isPlaying.value = true\r\n emit('play', idx)\r\n }\r\n\r\n /** 上一曲 */\r\n function prev() {\r\n const idx =\r\n activeIndex.value <= 0 ? props.tracks.length - 1 : activeIndex.value - 1\r\n playTrack(idx)\r\n }\r\n\r\n /** 下一曲 */\r\n function next() {\r\n const idx =\r\n activeIndex.value >= props.tracks.length - 1 ? 0 : activeIndex.value + 1\r\n playTrack(idx)\r\n }\r\n\r\n /** 点击进度条跳转播放位置 */\r\n function seekByClick(e: MouseEvent) {\r\n if (!audio || !totalDuration.value) return\r\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect()\r\n const ratio = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width))\r\n audio.currentTime = ratio * totalDuration.value\r\n currentTime.value = audio.currentTime\r\n }\r\n\r\n /** 处理音量变更 */\r\n function handleVolumeChange(val: number) {\r\n volume.value = val\r\n if (audio) audio.volume = val / 100\r\n }\r\n\r\n /** 切换静音状态 */\r\n function toggleMute() {\r\n if (volume.value > 0) {\r\n prevVolume.value = volume.value\r\n volume.value = 0\r\n } else {\r\n volume.value = prevVolume.value || 70\r\n }\r\n if (audio) audio.volume = volume.value / 100\r\n }\r\n\r\n const MODES = ['list', 'loop', 'single', 'shuffle'] as const\r\n /** 循环切换播放模式 */\r\n function cycleMode() {\r\n const idx = MODES.indexOf(playMode.value as (typeof MODES)[number])\r\n playMode.value = MODES[(idx + 1) % MODES.length]\r\n emit('modeChange', playMode.value)\r\n }\r\n\r\n // ==================== Lifecycle ====================\r\n\r\n watch(\r\n () => props.tracks,\r\n () => {\r\n activeIndex.value = 0\r\n initAudio()\r\n }\r\n )\r\n\r\n watch(\r\n () => props.initialIndex,\r\n val => {\r\n if (val !== undefined && val !== activeIndex.value) {\r\n activeIndex.value = val\r\n initAudio()\r\n }\r\n }\r\n )\r\n\r\n onBeforeUnmount(() => {\r\n if (audio) {\r\n audio.pause()\r\n audio.removeEventListener('timeupdate', onTimeUpdate)\r\n audio.removeEventListener('loadedmetadata', onMetaLoaded)\r\n audio.removeEventListener('ended', onEnded)\r\n audio = null\r\n }\r\n })\r\n\r\n // 自动播放\r\n if (props.autoplay && props.tracks.length > 0) {\r\n playTrack(activeIndex.value)\r\n }\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n @use './index.scss';\r\n</style>\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"C_AudioPlayer.js","names":[],"sources":["../src/components/C_AudioPlayer/types.ts","../src/components/C_AudioPlayer/index.vue"],"sourcesContent":["/**\n * @Description: Audio player component type definitions\n * Copyright (c) 2026 by CHENY, All Rights Reserved.\n */\n\n/** Single audio track */\nexport interface AudioTrack {\n /** Unique identifier */\n id: string | number\n /** Track title */\n title: string\n /** Artist / author */\n artist?: string\n /** Audio source URL */\n src: string\n /** Cover image URL */\n cover?: string\n /** Duration in seconds (optional, for static display) */\n duration?: number\n /** Extra data */\n extra?: Record<string, unknown>\n}\n\n/** Component props */\nexport interface AudioPlayerProps {\n /** Playlist */\n tracks: AudioTrack[]\n /** Initial active index */\n initialIndex?: number\n /** Whether to show the playlist panel */\n showPlaylist?: boolean\n /** Whether to show the cover art */\n showCover?: boolean\n /** Whether to auto-play on mount */\n autoplay?: boolean\n /** Playback mode */\n mode?: 'list' | 'loop' | 'single' | 'shuffle'\n /** Theme appearance */\n theme?: 'default' | 'minimal'\n}\n\n/** Default props */\nexport const DEFAULT_AUDIO_PLAYER_PROPS: Partial<AudioPlayerProps> = {\n initialIndex: 0,\n showPlaylist: true,\n showCover: true,\n autoplay: false,\n mode: 'list',\n theme: 'default',\n}\n\n/** Playback mode icon map */\nexport const MODE_ICON_MAP: Record<string, { icon: string; label: string }> = {\n list: { icon: 'mdi:repeat', label: 'List Loop' },\n loop: { icon: 'mdi:repeat-once', label: 'Single Loop' },\n single: { icon: 'mdi:numeric-1-box', label: 'Play Once' },\n shuffle: { icon: 'mdi:shuffle-variant', label: 'Shuffle' },\n}\n\n/** Format seconds to mm:ss */\nexport function formatTime(seconds: number): string {\n if (!Number.isFinite(seconds) || seconds < 0) return '00:00'\n const m = Math.floor(seconds / 60)\n const s = Math.floor(seconds % 60)\n return `${String(m).padStart(2, '0')}:${String(s).padStart(2, '0')}`\n}\n","<!--\n * @Description: 音频播放器组件\n * Copyright (c) 2026 by CHENY, All Rights Reserved 😎.\n-->\n<template>\n <div\n class=\"c-audio-player\"\n :class=\"{ 'is-minimal': theme === 'minimal' }\"\n >\n <!-- ================ Now Playing ================ -->\n <div class=\"c-audio-player__now-playing\">\n <div\n v-if=\"showCover\"\n class=\"c-audio-player__cover\"\n >\n <img\n v-if=\"currentTrack?.cover\"\n :src=\"currentTrack.cover\"\n :alt=\"currentTrack.title\"\n />\n <C_Icon\n v-else\n name=\"mdi:music-note\"\n class=\"c-audio-player__cover-placeholder\"\n />\n </div>\n <div class=\"c-audio-player__info\">\n <div class=\"c-audio-player__title\">{{\n currentTrack?.title ?? '未选择曲目'\n }}</div>\n <div\n v-if=\"currentTrack?.artist\"\n class=\"c-audio-player__artist\"\n >\n {{ currentTrack.artist }}\n </div>\n </div>\n </div>\n\n <!-- ================ Progress ================ -->\n <div\n v-if=\"theme !== 'minimal'\"\n class=\"c-audio-player__progress\"\n >\n <div\n class=\"c-audio-player__progress-bar\"\n @click=\"seekByClick\"\n >\n <div\n class=\"c-audio-player__progress-fill\"\n :style=\"{ width: `${progressPercent}%` }\"\n />\n </div>\n <div class=\"c-audio-player__time\">\n <span>{{ formatTime(currentTime) }}</span>\n <span>{{ formatTime(totalDuration) }}</span>\n </div>\n </div>\n\n <!-- ================ Controls ================ -->\n <div class=\"c-audio-player__controls\">\n <button\n class=\"c-audio-player__ctrl-btn is-mode\"\n :title=\"currentModeLabel\"\n @click=\"cycleMode\"\n >\n <C_Icon :name=\"currentModeIcon\" />\n </button>\n <button\n class=\"c-audio-player__ctrl-btn is-skip\"\n title=\"上一曲\"\n @click=\"prev\"\n >\n <C_Icon name=\"mdi:skip-previous\" />\n </button>\n <button\n class=\"c-audio-player__ctrl-btn is-play\"\n :title=\"isPlaying ? '暂停' : '播放'\"\n @click=\"togglePlay\"\n >\n <C_Icon :name=\"isPlaying ? 'mdi:pause' : 'mdi:play'\" />\n </button>\n <button\n class=\"c-audio-player__ctrl-btn is-skip\"\n title=\"下一曲\"\n @click=\"next\"\n >\n <C_Icon name=\"mdi:skip-next\" />\n </button>\n <button\n class=\"c-audio-player__ctrl-btn is-mode\"\n title=\"播放列表\"\n @click=\"playlistVisible = !playlistVisible\"\n >\n <C_Icon name=\"mdi:playlist-music\" />\n </button>\n </div>\n\n <!-- ================ Volume ================ -->\n <div\n v-if=\"theme !== 'minimal'\"\n class=\"c-audio-player__volume\"\n >\n <C_Icon\n :name=\"volumeIcon\"\n class=\"c-audio-player__volume-icon\"\n @click=\"toggleMute\"\n />\n <NSlider\n v-model:value=\"volume\"\n :min=\"0\"\n :max=\"100\"\n :step=\"1\"\n class=\"c-audio-player__volume-slider\"\n @update:value=\"handleVolumeChange\"\n />\n </div>\n\n <!-- ================ Playlist ================ -->\n <div\n v-if=\"showPlaylist && playlistVisible && theme !== 'minimal'\"\n class=\"c-audio-player__playlist\"\n >\n <div class=\"c-audio-player__playlist-header\">\n <span>播放列表</span>\n <span>{{ tracks.length }} 首</span>\n </div>\n <div\n v-for=\"(track, idx) in tracks\"\n :key=\"track.id\"\n class=\"c-audio-player__track\"\n :class=\"{ 'is-active': idx === activeIndex }\"\n @click=\"playTrack(idx)\"\n >\n <span class=\"c-audio-player__track-index\">\n <C_Icon\n v-if=\"idx === activeIndex && isPlaying\"\n name=\"mdi:volume-high\"\n />\n <template v-else>{{ idx + 1 }}</template>\n </span>\n <div class=\"c-audio-player__track-info\">\n <div class=\"c-audio-player__track-title\">{{ track.title }}</div>\n <div\n v-if=\"track.artist\"\n class=\"c-audio-player__track-artist\"\n >\n {{ track.artist }}\n </div>\n </div>\n <span\n v-if=\"track.duration\"\n class=\"c-audio-player__track-duration\"\n >\n {{ formatTime(track.duration) }}\n </span>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { computed, onBeforeUnmount, ref, watch } from 'vue'\n import C_Icon from '../C_Icon/index.vue'\n import {\n DEFAULT_AUDIO_PLAYER_PROPS,\n formatTime,\n MODE_ICON_MAP,\n type AudioPlayerProps,\n } from './types'\n\n const props = withDefaults(\n defineProps<{\n tracks: AudioPlayerProps['tracks']\n initialIndex?: number\n showPlaylist?: boolean\n showCover?: boolean\n autoplay?: boolean\n mode?: AudioPlayerProps['mode']\n theme?: AudioPlayerProps['theme']\n }>(),\n {\n initialIndex: DEFAULT_AUDIO_PLAYER_PROPS.initialIndex,\n showPlaylist: DEFAULT_AUDIO_PLAYER_PROPS.showPlaylist,\n showCover: true,\n autoplay: DEFAULT_AUDIO_PLAYER_PROPS.autoplay,\n mode: DEFAULT_AUDIO_PLAYER_PROPS.mode,\n theme: DEFAULT_AUDIO_PLAYER_PROPS.theme,\n }\n )\n\n const emit = defineEmits<{\n play: [index: number]\n pause: []\n ended: [index: number]\n modeChange: [mode: string]\n }>()\n\n // ==================== Audio Core ====================\n\n let audio: HTMLAudioElement | null = null\n\n const activeIndex = ref(props.initialIndex ?? 0)\n const isPlaying = ref(false)\n const currentTime = ref(0)\n const totalDuration = ref(0)\n const volume = ref(70)\n const prevVolume = ref(70)\n const playlistVisible = ref(props.showPlaylist)\n const playMode = ref(props.mode ?? 'list')\n\n const currentTrack = computed(() => props.tracks[activeIndex.value])\n\n const progressPercent = computed(() => {\n if (totalDuration.value === 0) return 0\n return (currentTime.value / totalDuration.value) * 100\n })\n\n const volumeIcon = computed(() => {\n if (volume.value === 0) return 'mdi:volume-off'\n if (volume.value < 40) return 'mdi:volume-low'\n if (volume.value < 70) return 'mdi:volume-medium'\n return 'mdi:volume-high'\n })\n\n const currentModeIcon = computed(\n () => MODE_ICON_MAP[playMode.value]?.icon ?? 'mdi:repeat'\n )\n const currentModeLabel = computed(\n () => MODE_ICON_MAP[playMode.value]?.label ?? '循环'\n )\n\n /** 初始化音频实例 */\n function initAudio() {\n if (audio) {\n audio.pause()\n audio.removeEventListener('timeupdate', onTimeUpdate)\n audio.removeEventListener('loadedmetadata', onMetaLoaded)\n audio.removeEventListener('ended', onEnded)\n }\n const track = currentTrack.value\n if (!track) return\n\n audio = new Audio(track.src)\n audio.volume = volume.value / 100\n audio.addEventListener('timeupdate', onTimeUpdate)\n audio.addEventListener('loadedmetadata', onMetaLoaded)\n audio.addEventListener('ended', onEnded)\n }\n\n /** 播放进度更新回调 */\n function onTimeUpdate() {\n if (audio) currentTime.value = audio.currentTime\n }\n\n /** 音频元数据加载完成回调 */\n function onMetaLoaded() {\n if (audio) totalDuration.value = audio.duration\n }\n\n /** 播放结束回调,根据模式决定下一步 */\n function onEnded() {\n emit('ended', activeIndex.value)\n switch (playMode.value) {\n case 'loop':\n audio?.play().catch(() => {})\n break\n case 'single':\n isPlaying.value = false\n break\n case 'shuffle':\n playTrack(Math.floor(Math.random() * props.tracks.length))\n break\n default: // list\n if (activeIndex.value < props.tracks.length - 1) next()\n else {\n activeIndex.value = 0\n initAudio()\n audio?.play().catch(() => {})\n }\n }\n }\n\n /** 切换播放/暂停 */\n function togglePlay() {\n if (!audio) initAudio()\n if (isPlaying.value) {\n audio?.pause()\n isPlaying.value = false\n emit('pause')\n } else {\n audio?.play().catch(() => {})\n isPlaying.value = true\n emit('play', activeIndex.value)\n }\n }\n\n /** 播放指定索引的曲目 */\n function playTrack(idx: number) {\n activeIndex.value = idx\n initAudio()\n audio?.play().catch(() => {})\n isPlaying.value = true\n emit('play', idx)\n }\n\n /** 上一曲 */\n function prev() {\n const idx =\n activeIndex.value <= 0 ? props.tracks.length - 1 : activeIndex.value - 1\n playTrack(idx)\n }\n\n /** 下一曲 */\n function next() {\n const idx =\n activeIndex.value >= props.tracks.length - 1 ? 0 : activeIndex.value + 1\n playTrack(idx)\n }\n\n /** 点击进度条跳转播放位置 */\n function seekByClick(e: MouseEvent) {\n if (!audio || !totalDuration.value) return\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect()\n const ratio = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width))\n audio.currentTime = ratio * totalDuration.value\n currentTime.value = audio.currentTime\n }\n\n /** 处理音量变更 */\n function handleVolumeChange(val: number) {\n volume.value = val\n if (audio) audio.volume = val / 100\n }\n\n /** 切换静音状态 */\n function toggleMute() {\n if (volume.value > 0) {\n prevVolume.value = volume.value\n volume.value = 0\n } else {\n volume.value = prevVolume.value || 70\n }\n if (audio) audio.volume = volume.value / 100\n }\n\n const MODES = ['list', 'loop', 'single', 'shuffle'] as const\n /** 循环切换播放模式 */\n function cycleMode() {\n const idx = MODES.indexOf(playMode.value as (typeof MODES)[number])\n playMode.value = MODES[(idx + 1) % MODES.length]\n emit('modeChange', playMode.value)\n }\n\n // ==================== Lifecycle ====================\n\n watch(\n () => props.tracks,\n () => {\n activeIndex.value = 0\n initAudio()\n }\n )\n\n watch(\n () => props.initialIndex,\n val => {\n if (val !== undefined && val !== activeIndex.value) {\n activeIndex.value = val\n initAudio()\n }\n }\n )\n\n onBeforeUnmount(() => {\n if (audio) {\n audio.pause()\n audio.removeEventListener('timeupdate', onTimeUpdate)\n audio.removeEventListener('loadedmetadata', onMetaLoaded)\n audio.removeEventListener('ended', onEnded)\n audio = null\n }\n })\n\n // 自动播放\n if (props.autoplay && props.tracks.length > 0) {\n playTrack(activeIndex.value)\n }\n</script>\n\n<style scoped lang=\"scss\">\n @use './index.scss';\n</style>\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{t as e}from"./C_Icon2.js";import{t}from"./export-helper.js";import{NSlider as n}from"naive-ui";import{Fragment as r,computed as i,createBlock as a,createCommentVNode as o,createElementBlock as s,createElementVNode as c,createTextVNode as l,createVNode as u,defineComponent as d,normalizeClass as f,normalizeStyle as p,onBeforeUnmount as m,openBlock as h,ref as g,renderList as _,toDisplayString as v,unref as y,watch as b}from"vue";const x={initialIndex:0,showPlaylist:!0,showCover:!0,autoplay:!1,mode:`list`,theme:`default`},S={list:{icon:`mdi:repeat`,label:`List Loop`},loop:{icon:`mdi:repeat-once`,label:`Single Loop`},single:{icon:`mdi:numeric-1-box`,label:`Play Once`},shuffle:{icon:`mdi:shuffle-variant`,label:`Shuffle`}};function C(e){if(!Number.isFinite(e)||e<0)return`00:00`;let t=Math.floor(e/60),n=Math.floor(e%60);return`${String(t).padStart(2,`0`)}:${String(n).padStart(2,`0`)}`}const w={class:`c-audio-player__now-playing`},T={key:0,class:`c-audio-player__cover`},E=[`src`,`alt`],D={class:`c-audio-player__info`},O={class:`c-audio-player__title`},k={key:0,class:`c-audio-player__artist`},A={key:0,class:`c-audio-player__progress`},ee={class:`c-audio-player__time`},te={class:`c-audio-player__controls`},ne=[`title`],re=[`title`],ie={key:1,class:`c-audio-player__volume`},ae={key:2,class:`c-audio-player__playlist`},oe={class:`c-audio-player__playlist-header`},se=[`onClick`],ce={class:`c-audio-player__track-index`},j={class:`c-audio-player__track-info`},M={class:`c-audio-player__track-title`},N={key:0,class:`c-audio-player__track-artist`},P={key:0,class:`c-audio-player__track-duration`};var F=t(d({__name:`index`,props:{tracks:{},initialIndex:{default:x.initialIndex},showPlaylist:{type:Boolean,default:x.showPlaylist},showCover:{type:Boolean,default:!0},autoplay:{type:Boolean,default:x.autoplay},mode:{default:x.mode},theme:{default:x.theme}},emits:[`play`,`pause`,`ended`,`modeChange`],setup(t,{emit:d}){let x=t,F=d,I=null,L=g(x.initialIndex??0),R=g(!1),z=g(0),B=g(0),V=g(70),H=g(70),U=g(x.showPlaylist),W=g(x.mode??`list`),G=i(()=>x.tracks[L.value]),le=i(()=>B.value===0?0:z.value/B.value*100),ue=i(()=>V.value===0?`mdi:volume-off`:V.value<40?`mdi:volume-low`:V.value<70?`mdi:volume-medium`:`mdi:volume-high`),de=i(()=>S[W.value]?.icon??`mdi:repeat`),fe=i(()=>S[W.value]?.label??`循环`);function K(){I&&(I.pause(),I.removeEventListener(`timeupdate`,q),I.removeEventListener(`loadedmetadata`,J),I.removeEventListener(`ended`,Y));let e=G.value;e&&(I=new Audio(e.src),I.volume=V.value/100,I.addEventListener(`timeupdate`,q),I.addEventListener(`loadedmetadata`,J),I.addEventListener(`ended`,Y))}function q(){I&&(z.value=I.currentTime)}function J(){I&&(B.value=I.duration)}function Y(){switch(F(`ended`,L.value),W.value){case`loop`:I?.play().catch(()=>{});break;case`single`:R.value=!1;break;case`shuffle`:X(Math.floor(Math.random()*x.tracks.length));break;default:L.value<x.tracks.length-1?Z():(L.value=0,K(),I?.play().catch(()=>{}))}}function pe(){I||K(),R.value?(I?.pause(),R.value=!1,F(`pause`)):(I?.play().catch(()=>{}),R.value=!0,F(`play`,L.value))}function X(e){L.value=e,K(),I?.play().catch(()=>{}),R.value=!0,F(`play`,e)}function me(){X(L.value<=0?x.tracks.length-1:L.value-1)}function Z(){X(L.value>=x.tracks.length-1?0:L.value+1)}function Q(e){if(!I||!B.value)return;let t=e.currentTarget.getBoundingClientRect(),n=Math.max(0,Math.min(1,(e.clientX-t.left)/t.width));I.currentTime=n*B.value,z.value=I.currentTime}function he(e){V.value=e,I&&(I.volume=e/100)}function ge(){V.value>0?(H.value=V.value,V.value=0):V.value=H.value||70,I&&(I.volume=V.value/100)}let $=[`list`,`loop`,`single`,`shuffle`];function _e(){W.value=$[($.indexOf(W.value)+1)%$.length],F(`modeChange`,W.value)}return b(()=>x.tracks,()=>{L.value=0,K()}),b(()=>x.initialIndex,e=>{e!==void 0&&e!==L.value&&(L.value=e,K())}),m(()=>{I&&=(I.pause(),I.removeEventListener(`timeupdate`,q),I.removeEventListener(`loadedmetadata`,J),I.removeEventListener(`ended`,Y),null)}),x.autoplay&&x.tracks.length>0&&X(L.value),(t,i)=>{let d=n;return h(),s(`div`,{class:f([`c-audio-player`,{"is-minimal":t.theme===`minimal`}])},[o(` ================ Now Playing ================ `),c(`div`,w,[t.showCover?(h(),s(`div`,T,[G.value?.cover?(h(),s(`img`,{key:0,src:G.value.cover,alt:G.value.title},null,8,E)):(h(),a(e,{key:1,name:`mdi:music-note`,class:`c-audio-player__cover-placeholder`}))])):o(`v-if`,!0),c(`div`,D,[c(`div`,O,v(G.value?.title??`未选择曲目`),1),G.value?.artist?(h(),s(`div`,k,v(G.value.artist),1)):o(`v-if`,!0)])]),o(` ================ Progress ================ `),t.theme===`minimal`?o(`v-if`,!0):(h(),s(`div`,A,[c(`div`,{class:`c-audio-player__progress-bar`,onClick:Q},[c(`div`,{class:`c-audio-player__progress-fill`,style:p({width:`${le.value}%`})},null,4)]),c(`div`,ee,[c(`span`,null,v(y(C)(z.value)),1),c(`span`,null,v(y(C)(B.value)),1)])])),o(` ================ Controls ================ `),c(`div`,te,[c(`button`,{class:`c-audio-player__ctrl-btn is-mode`,title:fe.value,onClick:_e},[u(e,{name:de.value},null,8,[`name`])],8,ne),c(`button`,{class:`c-audio-player__ctrl-btn is-skip`,title:`上一曲`,onClick:me},[u(e,{name:`mdi:skip-previous`})]),c(`button`,{class:`c-audio-player__ctrl-btn is-play`,title:R.value?`暂停`:`播放`,onClick:pe},[u(e,{name:R.value?`mdi:pause`:`mdi:play`},null,8,[`name`])],8,re),c(`button`,{class:`c-audio-player__ctrl-btn is-skip`,title:`下一曲`,onClick:Z},[u(e,{name:`mdi:skip-next`})]),c(`button`,{class:`c-audio-player__ctrl-btn is-mode`,title:`播放列表`,onClick:i[0]||=e=>U.value=!U.value},[u(e,{name:`mdi:playlist-music`})])]),o(` ================ Volume ================ `),t.theme===`minimal`?o(`v-if`,!0):(h(),s(`div`,ie,[u(e,{name:ue.value,class:`c-audio-player__volume-icon`,onClick:ge},null,8,[`name`]),u(d,{value:V.value,"onUpdate:value":[i[1]||=e=>V.value=e,he],min:0,max:100,step:1,class:`c-audio-player__volume-slider`},null,8,[`value`])])),o(` ================ Playlist ================ `),t.showPlaylist&&U.value&&t.theme!==`minimal`?(h(),s(`div`,ae,[c(`div`,oe,[i[2]||=c(`span`,null,`播放列表`,-1),c(`span`,null,v(t.tracks.length)+` 首`,1)]),(h(!0),s(r,null,_(t.tracks,(t,n)=>(h(),s(`div`,{key:t.id,class:f([`c-audio-player__track`,{"is-active":n===L.value}]),onClick:e=>X(n)},[c(`span`,ce,[n===L.value&&R.value?(h(),a(e,{key:0,name:`mdi:volume-high`})):(h(),s(r,{key:1},[l(v(n+1),1)],64))]),c(`div`,j,[c(`div`,M,v(t.title),1),t.artist?(h(),s(`div`,N,v(t.artist),1)):o(`v-if`,!0)]),t.duration?(h(),s(`span`,P,v(y(C)(t.duration)),1)):o(`v-if`,!0)],10,se))),128))])):o(`v-if`,!0)],2)}}}),[[`__scopeId`,`data-v-16f18960`]]);export{C as i,x as n,S as r,F as t};
1
+ import{t as e}from"./C_Icon2.js";import{t}from"./export-helper.js";import{Fragment as n,computed as r,createBlock as i,createCommentVNode as a,createElementBlock as o,createElementVNode as s,createTextVNode as c,createVNode as l,defineComponent as u,normalizeClass as d,normalizeStyle as f,onBeforeUnmount as p,openBlock as m,ref as h,renderList as g,resolveComponent as _,toDisplayString as v,unref as y,watch as b}from"vue";const x={initialIndex:0,showPlaylist:!0,showCover:!0,autoplay:!1,mode:`list`,theme:`default`},S={list:{icon:`mdi:repeat`,label:`List Loop`},loop:{icon:`mdi:repeat-once`,label:`Single Loop`},single:{icon:`mdi:numeric-1-box`,label:`Play Once`},shuffle:{icon:`mdi:shuffle-variant`,label:`Shuffle`}};function C(e){if(!Number.isFinite(e)||e<0)return`00:00`;let t=Math.floor(e/60),n=Math.floor(e%60);return`${String(t).padStart(2,`0`)}:${String(n).padStart(2,`0`)}`}const w={class:`c-audio-player__now-playing`},T={key:0,class:`c-audio-player__cover`},E=[`src`,`alt`],D={class:`c-audio-player__info`},O={class:`c-audio-player__title`},ee={key:0,class:`c-audio-player__artist`},te={key:0,class:`c-audio-player__progress`},ne={class:`c-audio-player__time`},re={class:`c-audio-player__controls`},ie=[`title`],ae=[`title`],oe={key:1,class:`c-audio-player__volume`},se={key:2,class:`c-audio-player__playlist`},ce={class:`c-audio-player__playlist-header`},k=[`onClick`],A={class:`c-audio-player__track-index`},j={class:`c-audio-player__track-info`},M={class:`c-audio-player__track-title`},N={key:0,class:`c-audio-player__track-artist`},P={key:0,class:`c-audio-player__track-duration`};var F=t(u({__name:`index`,props:{tracks:{},initialIndex:{default:x.initialIndex},showPlaylist:{type:Boolean,default:x.showPlaylist},showCover:{type:Boolean,default:!0},autoplay:{type:Boolean,default:x.autoplay},mode:{default:x.mode},theme:{default:x.theme}},emits:[`play`,`pause`,`ended`,`modeChange`],setup(t,{emit:u}){let x=t,F=u,I=null,L=h(x.initialIndex??0),R=h(!1),z=h(0),B=h(0),V=h(70),H=h(70),U=h(x.showPlaylist),W=h(x.mode??`list`),G=r(()=>x.tracks[L.value]),le=r(()=>B.value===0?0:z.value/B.value*100),ue=r(()=>V.value===0?`mdi:volume-off`:V.value<40?`mdi:volume-low`:V.value<70?`mdi:volume-medium`:`mdi:volume-high`),de=r(()=>S[W.value]?.icon??`mdi:repeat`),fe=r(()=>S[W.value]?.label??`循环`);function K(){I&&(I.pause(),I.removeEventListener(`timeupdate`,q),I.removeEventListener(`loadedmetadata`,J),I.removeEventListener(`ended`,Y));let e=G.value;e&&(I=new Audio(e.src),I.volume=V.value/100,I.addEventListener(`timeupdate`,q),I.addEventListener(`loadedmetadata`,J),I.addEventListener(`ended`,Y))}function q(){I&&(z.value=I.currentTime)}function J(){I&&(B.value=I.duration)}function Y(){switch(F(`ended`,L.value),W.value){case`loop`:I?.play().catch(()=>{});break;case`single`:R.value=!1;break;case`shuffle`:X(Math.floor(Math.random()*x.tracks.length));break;default:L.value<x.tracks.length-1?Z():(L.value=0,K(),I?.play().catch(()=>{}))}}function pe(){I||K(),R.value?(I?.pause(),R.value=!1,F(`pause`)):(I?.play().catch(()=>{}),R.value=!0,F(`play`,L.value))}function X(e){L.value=e,K(),I?.play().catch(()=>{}),R.value=!0,F(`play`,e)}function me(){X(L.value<=0?x.tracks.length-1:L.value-1)}function Z(){X(L.value>=x.tracks.length-1?0:L.value+1)}function Q(e){if(!I||!B.value)return;let t=e.currentTarget.getBoundingClientRect(),n=Math.max(0,Math.min(1,(e.clientX-t.left)/t.width));I.currentTime=n*B.value,z.value=I.currentTime}function he(e){V.value=e,I&&(I.volume=e/100)}function ge(){V.value>0?(H.value=V.value,V.value=0):V.value=H.value||70,I&&(I.volume=V.value/100)}let $=[`list`,`loop`,`single`,`shuffle`];function _e(){W.value=$[($.indexOf(W.value)+1)%$.length],F(`modeChange`,W.value)}return b(()=>x.tracks,()=>{L.value=0,K()}),b(()=>x.initialIndex,e=>{e!==void 0&&e!==L.value&&(L.value=e,K())}),p(()=>{I&&=(I.pause(),I.removeEventListener(`timeupdate`,q),I.removeEventListener(`loadedmetadata`,J),I.removeEventListener(`ended`,Y),null)}),x.autoplay&&x.tracks.length>0&&X(L.value),(t,r)=>{let u=_(`NSlider`);return m(),o(`div`,{class:d([`c-audio-player`,{"is-minimal":t.theme===`minimal`}])},[a(` ================ Now Playing ================ `),s(`div`,w,[t.showCover?(m(),o(`div`,T,[G.value?.cover?(m(),o(`img`,{key:0,src:G.value.cover,alt:G.value.title},null,8,E)):(m(),i(e,{key:1,name:`mdi:music-note`,class:`c-audio-player__cover-placeholder`}))])):a(`v-if`,!0),s(`div`,D,[s(`div`,O,v(G.value?.title??`未选择曲目`),1),G.value?.artist?(m(),o(`div`,ee,v(G.value.artist),1)):a(`v-if`,!0)])]),a(` ================ Progress ================ `),t.theme===`minimal`?a(`v-if`,!0):(m(),o(`div`,te,[s(`div`,{class:`c-audio-player__progress-bar`,onClick:Q},[s(`div`,{class:`c-audio-player__progress-fill`,style:f({width:`${le.value}%`})},null,4)]),s(`div`,ne,[s(`span`,null,v(y(C)(z.value)),1),s(`span`,null,v(y(C)(B.value)),1)])])),a(` ================ Controls ================ `),s(`div`,re,[s(`button`,{class:`c-audio-player__ctrl-btn is-mode`,title:fe.value,onClick:_e},[l(e,{name:de.value},null,8,[`name`])],8,ie),s(`button`,{class:`c-audio-player__ctrl-btn is-skip`,title:`上一曲`,onClick:me},[l(e,{name:`mdi:skip-previous`})]),s(`button`,{class:`c-audio-player__ctrl-btn is-play`,title:R.value?`暂停`:`播放`,onClick:pe},[l(e,{name:R.value?`mdi:pause`:`mdi:play`},null,8,[`name`])],8,ae),s(`button`,{class:`c-audio-player__ctrl-btn is-skip`,title:`下一曲`,onClick:Z},[l(e,{name:`mdi:skip-next`})]),s(`button`,{class:`c-audio-player__ctrl-btn is-mode`,title:`播放列表`,onClick:r[0]||=e=>U.value=!U.value},[l(e,{name:`mdi:playlist-music`})])]),a(` ================ Volume ================ `),t.theme===`minimal`?a(`v-if`,!0):(m(),o(`div`,oe,[l(e,{name:ue.value,class:`c-audio-player__volume-icon`,onClick:ge},null,8,[`name`]),l(u,{value:V.value,"onUpdate:value":[r[1]||=e=>V.value=e,he],min:0,max:100,step:1,class:`c-audio-player__volume-slider`},null,8,[`value`])])),a(` ================ Playlist ================ `),t.showPlaylist&&U.value&&t.theme!==`minimal`?(m(),o(`div`,se,[s(`div`,ce,[r[2]||=s(`span`,null,`播放列表`,-1),s(`span`,null,v(t.tracks.length)+` 首`,1)]),(m(!0),o(n,null,g(t.tracks,(t,r)=>(m(),o(`div`,{key:t.id,class:d([`c-audio-player__track`,{"is-active":r===L.value}]),onClick:e=>X(r)},[s(`span`,A,[r===L.value&&R.value?(m(),i(e,{key:0,name:`mdi:volume-high`})):(m(),o(n,{key:1},[c(v(r+1),1)],64))]),s(`div`,j,[s(`div`,M,v(t.title),1),t.artist?(m(),o(`div`,N,v(t.artist),1)):a(`v-if`,!0)]),t.duration?(m(),o(`span`,P,v(y(C)(t.duration)),1)):a(`v-if`,!0)],10,k))),128))])):a(`v-if`,!0)],2)}}}),[[`__scopeId`,`data-v-3cb14639`]]);export{C as i,x as n,S as r,F as t};
2
2
  //# sourceMappingURL=C_AudioPlayer2.js.map