@will-ui/vue 1.0.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 (699) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +48 -0
  3. package/TAILWIND.md +282 -0
  4. package/dist/_virtual/_rolldown/runtime.js +13 -0
  5. package/dist/components/audioPlayer/AudioPlayer.d.ts +123 -0
  6. package/dist/components/audioPlayer/AudioPlayer.js +375 -0
  7. package/dist/components/audioPlayer/AudioPlayer.js.map +1 -0
  8. package/dist/components/audioPlayer/index.d.ts +2 -0
  9. package/dist/components/audioPlayer/style/index.css +1 -0
  10. package/dist/components/btn/Btn.d.ts +45 -0
  11. package/dist/components/btn/Btn.js +165 -0
  12. package/dist/components/btn/Btn.js.map +1 -0
  13. package/dist/components/btn/config.d.ts +33 -0
  14. package/dist/components/btn/config.js +20 -0
  15. package/dist/components/btn/config.js.map +1 -0
  16. package/dist/components/btn/context.d.ts +12 -0
  17. package/dist/components/btn/context.js +6 -0
  18. package/dist/components/btn/context.js.map +1 -0
  19. package/dist/components/btn/index.d.ts +5 -0
  20. package/dist/components/btn/style/index.css +1 -0
  21. package/dist/components/btnGroup/BtnGroup.d.ts +46 -0
  22. package/dist/components/btnGroup/BtnGroup.js +43 -0
  23. package/dist/components/btnGroup/BtnGroup.js.map +1 -0
  24. package/dist/components/btnGroup/config.d.ts +14 -0
  25. package/dist/components/btnGroup/config.js +11 -0
  26. package/dist/components/btnGroup/config.js.map +1 -0
  27. package/dist/components/btnGroup/index.d.ts +3 -0
  28. package/dist/components/btnGroup/style/index.css +1 -0
  29. package/dist/components/cascade/Cascade.d.ts +1957 -0
  30. package/dist/components/cascade/Cascade.js +283 -0
  31. package/dist/components/cascade/Cascade.js.map +1 -0
  32. package/dist/components/cascade/config.d.ts +30 -0
  33. package/dist/components/cascade/config.js +18 -0
  34. package/dist/components/cascade/config.js.map +1 -0
  35. package/dist/components/cascade/index.d.ts +3 -0
  36. package/dist/components/cascade/style/index.css +1 -0
  37. package/dist/components/checkbox/Checkbox.d.ts +241 -0
  38. package/dist/components/checkbox/Checkbox.js +182 -0
  39. package/dist/components/checkbox/Checkbox.js.map +1 -0
  40. package/dist/components/checkbox/config.d.ts +18 -0
  41. package/dist/components/checkbox/config.js +11 -0
  42. package/dist/components/checkbox/config.js.map +1 -0
  43. package/dist/components/checkbox/index.d.ts +3 -0
  44. package/dist/components/checkbox/style/index.css +1 -0
  45. package/dist/components/choose/Choose.d.ts +1016 -0
  46. package/dist/components/choose/Choose.js +402 -0
  47. package/dist/components/choose/Choose.js.map +1 -0
  48. package/dist/components/choose/config.d.ts +37 -0
  49. package/dist/components/choose/config.js +21 -0
  50. package/dist/components/choose/config.js.map +1 -0
  51. package/dist/components/choose/index.d.ts +3 -0
  52. package/dist/components/choose/injectionKey.d.ts +12 -0
  53. package/dist/components/choose/injectionKey.js +11 -0
  54. package/dist/components/choose/injectionKey.js.map +1 -0
  55. package/dist/components/choose/style/index.css +1 -0
  56. package/dist/components/choose2/Choose2.d.ts +1711 -0
  57. package/dist/components/choose2/Choose2.js +403 -0
  58. package/dist/components/choose2/Choose2.js.map +1 -0
  59. package/dist/components/choose2/config.d.ts +37 -0
  60. package/dist/components/choose2/config.js +20 -0
  61. package/dist/components/choose2/config.js.map +1 -0
  62. package/dist/components/choose2/index.d.ts +3 -0
  63. package/dist/components/choose2/style/index.css +1 -0
  64. package/dist/components/chooseItem/ChooseItem.d.ts +46 -0
  65. package/dist/components/chooseItem/ChooseItem.js +72 -0
  66. package/dist/components/chooseItem/ChooseItem.js.map +1 -0
  67. package/dist/components/chooseItem/config.d.ts +12 -0
  68. package/dist/components/chooseItem/config.js +9 -0
  69. package/dist/components/chooseItem/config.js.map +1 -0
  70. package/dist/components/chooseItem/index.d.ts +3 -0
  71. package/dist/components/chooseItem/style/index.css +1 -0
  72. package/dist/components/circleProgress/CircleProgress.d.ts +83 -0
  73. package/dist/components/circleProgress/CircleProgress.js +108 -0
  74. package/dist/components/circleProgress/CircleProgress.js.map +1 -0
  75. package/dist/components/circleProgress/index.d.ts +1 -0
  76. package/dist/components/circleProgress/style/index.css +1 -0
  77. package/dist/components/close/Close.d.ts +114 -0
  78. package/dist/components/close/Close.js +82 -0
  79. package/dist/components/close/Close.js.map +1 -0
  80. package/dist/components/close/index.d.ts +1 -0
  81. package/dist/components/close/style/index.css +1 -0
  82. package/dist/components/colorPicker/ColorPicker.d.ts +138 -0
  83. package/dist/components/colorPicker/ColorPicker.js +404 -0
  84. package/dist/components/colorPicker/ColorPicker.js.map +1 -0
  85. package/dist/components/colorPicker/config.d.ts +24 -0
  86. package/dist/components/colorPicker/config.js +14 -0
  87. package/dist/components/colorPicker/config.js.map +1 -0
  88. package/dist/components/colorPicker/index.d.ts +4 -0
  89. package/dist/components/colorPicker/style/index.css +1 -0
  90. package/dist/components/confirm/index.d.ts +73 -0
  91. package/dist/components/confirm/index.js +177 -0
  92. package/dist/components/confirm/index.js.map +1 -0
  93. package/dist/components/confirm/src/style/index.css +1 -0
  94. package/dist/components/copy/Copy.d.ts +28 -0
  95. package/dist/components/copy/Copy.js +110 -0
  96. package/dist/components/copy/Copy.js.map +1 -0
  97. package/dist/components/copy/config.d.ts +25 -0
  98. package/dist/components/copy/config.js +13 -0
  99. package/dist/components/copy/config.js.map +1 -0
  100. package/dist/components/copy/index.d.ts +5 -0
  101. package/dist/components/copy/spawnCopyToast.d.ts +13 -0
  102. package/dist/components/copy/spawnCopyToast.js +150 -0
  103. package/dist/components/copy/spawnCopyToast.js.map +1 -0
  104. package/dist/components/copy/style/index.css +1 -0
  105. package/dist/components/cornerEars/CornerEars.d.ts +24 -0
  106. package/dist/components/cornerEars/CornerEars.js +108 -0
  107. package/dist/components/cornerEars/CornerEars.js.map +1 -0
  108. package/dist/components/cornerEars/cornerGeometry.d.ts +8 -0
  109. package/dist/components/cornerEars/cornerGeometry.js +63 -0
  110. package/dist/components/cornerEars/cornerGeometry.js.map +1 -0
  111. package/dist/components/cornerEars/index.d.ts +2 -0
  112. package/dist/components/cornerEars/style/index.css +1 -0
  113. package/dist/components/date/DatePanel.js +398 -0
  114. package/dist/components/date/DatePanel.js.map +1 -0
  115. package/dist/components/date/DatePicker.d.ts +226 -0
  116. package/dist/components/date/DatePicker.js +349 -0
  117. package/dist/components/date/DatePicker.js.map +1 -0
  118. package/dist/components/date/Days.d.ts +44 -0
  119. package/dist/components/date/Days.js +93 -0
  120. package/dist/components/date/Days.js.map +1 -0
  121. package/dist/components/date/Months.d.ts +32 -0
  122. package/dist/components/date/Months.js +87 -0
  123. package/dist/components/date/Months.js.map +1 -0
  124. package/dist/components/date/QuickDate.d.ts +24 -0
  125. package/dist/components/date/QuickDate.js +48 -0
  126. package/dist/components/date/QuickDate.js.map +1 -0
  127. package/dist/components/date/Years.d.ts +38 -0
  128. package/dist/components/date/Years.js +85 -0
  129. package/dist/components/date/Years.js.map +1 -0
  130. package/dist/components/date/_use/quickDate.d.ts +4 -0
  131. package/dist/components/date/_use/quickDate.js +30 -0
  132. package/dist/components/date/_use/quickDate.js.map +1 -0
  133. package/dist/components/date/_use/useDateModules.d.ts +37 -0
  134. package/dist/components/date/_use/useDateModules.js +100 -0
  135. package/dist/components/date/_use/useDateModules.js.map +1 -0
  136. package/dist/components/date/config.d.ts +32 -0
  137. package/dist/components/date/config.js +18 -0
  138. package/dist/components/date/config.js.map +1 -0
  139. package/dist/components/date/index.d.ts +3 -0
  140. package/dist/components/date/style/index.css +1 -0
  141. package/dist/components/date/types.d.ts +32 -0
  142. package/dist/components/drawer/Drawer.d.ts +332 -0
  143. package/dist/components/drawer/Drawer.js +329 -0
  144. package/dist/components/drawer/Drawer.js.map +1 -0
  145. package/dist/components/drawer/config.d.ts +28 -0
  146. package/dist/components/drawer/config.js +16 -0
  147. package/dist/components/drawer/config.js.map +1 -0
  148. package/dist/components/drawer/index.d.ts +3 -0
  149. package/dist/components/drawer/src/style/drawer.css +1 -0
  150. package/dist/components/ellipsis/Ellipsis.d.ts +74 -0
  151. package/dist/components/ellipsis/Ellipsis.js +103 -0
  152. package/dist/components/ellipsis/Ellipsis.js.map +1 -0
  153. package/dist/components/ellipsis/index.d.ts +1 -0
  154. package/dist/components/ellipsis/style/index.css +1 -0
  155. package/dist/components/empty/Empty.d.ts +92 -0
  156. package/dist/components/empty/Empty.js +85 -0
  157. package/dist/components/empty/Empty.js.map +1 -0
  158. package/dist/components/empty/config.d.ts +23 -0
  159. package/dist/components/empty/config.js +14 -0
  160. package/dist/components/empty/config.js.map +1 -0
  161. package/dist/components/empty/index.d.ts +3 -0
  162. package/dist/components/empty/style/index.css +1 -0
  163. package/dist/components/empty/type.d.ts +9 -0
  164. package/dist/components/equalizer/Equalizer.d.ts +62 -0
  165. package/dist/components/equalizer/Equalizer.js +56 -0
  166. package/dist/components/equalizer/Equalizer.js.map +1 -0
  167. package/dist/components/equalizer/index.d.ts +1 -0
  168. package/dist/components/equalizer/style/index.css +1 -0
  169. package/dist/components/fallback/Fallback.d.ts +44 -0
  170. package/dist/components/fallback/Fallback.js +55 -0
  171. package/dist/components/fallback/Fallback.js.map +1 -0
  172. package/dist/components/fallback/index.d.ts +1 -0
  173. package/dist/components/fallback/style/index.css +1 -0
  174. package/dist/components/form/Form.d.ts +169 -0
  175. package/dist/components/form/Form.js +235 -0
  176. package/dist/components/form/Form.js.map +1 -0
  177. package/dist/components/form/_use/formRules.d.ts +18 -0
  178. package/dist/components/form/_use/formRules.js +80 -0
  179. package/dist/components/form/_use/formRules.js.map +1 -0
  180. package/dist/components/form/config.d.ts +35 -0
  181. package/dist/components/form/config.js +20 -0
  182. package/dist/components/form/config.js.map +1 -0
  183. package/dist/components/form/context.d.ts +34 -0
  184. package/dist/components/form/context.js +8 -0
  185. package/dist/components/form/context.js.map +1 -0
  186. package/dist/components/form/index.d.ts +3 -0
  187. package/dist/components/form/style/index.css +1 -0
  188. package/dist/components/formItem/FormItem.d.ts +144 -0
  189. package/dist/components/formItem/FormItem.js +218 -0
  190. package/dist/components/formItem/FormItem.js.map +1 -0
  191. package/dist/components/formItem/config.d.ts +21 -0
  192. package/dist/components/formItem/config.js +12 -0
  193. package/dist/components/formItem/config.js.map +1 -0
  194. package/dist/components/formItem/context.d.ts +22 -0
  195. package/dist/components/formItem/context.js +8 -0
  196. package/dist/components/formItem/context.js.map +1 -0
  197. package/dist/components/formItem/index.d.ts +3 -0
  198. package/dist/components/formItem/style/index.css +1 -0
  199. package/dist/components/icon/Icon.d.ts +117 -0
  200. package/dist/components/icon/Icon.js +116 -0
  201. package/dist/components/icon/Icon.js.map +1 -0
  202. package/dist/components/icon/config.d.ts +28 -0
  203. package/dist/components/icon/config.js +16 -0
  204. package/dist/components/icon/config.js.map +1 -0
  205. package/dist/components/icon/index.d.ts +4 -0
  206. package/dist/components/icon/style/index.css +1 -0
  207. package/dist/components/icon/type.d.ts +16 -0
  208. package/dist/components/image/Image.d.ts +21 -0
  209. package/dist/components/image/Image.js +68 -0
  210. package/dist/components/image/Image.js.map +1 -0
  211. package/dist/components/image/config.d.ts +21 -0
  212. package/dist/components/image/config.js +11 -0
  213. package/dist/components/image/config.js.map +1 -0
  214. package/dist/components/image/index.d.ts +4 -0
  215. package/dist/components/image/style/index.css +1 -0
  216. package/dist/components/index.d.ts +79 -0
  217. package/dist/components/index.js +124 -0
  218. package/dist/components/index.js.map +1 -0
  219. package/dist/components/layer/Layer.d.ts +410 -0
  220. package/dist/components/layer/Layer.js +557 -0
  221. package/dist/components/layer/Layer.js.map +1 -0
  222. package/dist/components/layer/index.d.ts +2 -0
  223. package/dist/components/layer/injectionKey.d.ts +5 -0
  224. package/dist/components/layer/injectionKey.js +6 -0
  225. package/dist/components/layer/injectionKey.js.map +1 -0
  226. package/dist/components/layer/style/index.css +1 -0
  227. package/dist/components/lcdFont/LcdFont.d.ts +126 -0
  228. package/dist/components/lcdFont/LcdFont.js +232 -0
  229. package/dist/components/lcdFont/LcdFont.js.map +1 -0
  230. package/dist/components/lcdFont/config.d.ts +43 -0
  231. package/dist/components/lcdFont/config.js +41 -0
  232. package/dist/components/lcdFont/config.js.map +1 -0
  233. package/dist/components/lcdFont/format.d.ts +8 -0
  234. package/dist/components/lcdFont/format.js +39 -0
  235. package/dist/components/lcdFont/format.js.map +1 -0
  236. package/dist/components/lcdFont/index.d.ts +5 -0
  237. package/dist/components/lcdFont/segments.d.ts +32 -0
  238. package/dist/components/lcdFont/segments.js +326 -0
  239. package/dist/components/lcdFont/segments.js.map +1 -0
  240. package/dist/components/lcdFont/style/index.css +1 -0
  241. package/dist/components/lcdFont/type.d.ts +26 -0
  242. package/dist/components/list/List.d.ts +480 -0
  243. package/dist/components/list/List.js +289 -0
  244. package/dist/components/list/List.js.map +1 -0
  245. package/dist/components/list/config.d.ts +3 -0
  246. package/dist/components/list/index.d.ts +3 -0
  247. package/dist/components/list/style/index.css +1 -0
  248. package/dist/components/loading/Loading.d.ts +97 -0
  249. package/dist/components/loading/Loading.js +124 -0
  250. package/dist/components/loading/Loading.js.map +1 -0
  251. package/dist/components/loading/config.d.ts +22 -0
  252. package/dist/components/loading/config.js +13 -0
  253. package/dist/components/loading/config.js.map +1 -0
  254. package/dist/components/loading/index.d.ts +3 -0
  255. package/dist/components/loading/style/index.css +1 -0
  256. package/dist/components/loading/type.d.ts +13 -0
  257. package/dist/components/mask/Mask.d.ts +79 -0
  258. package/dist/components/mask/Mask.js +82 -0
  259. package/dist/components/mask/Mask.js.map +1 -0
  260. package/dist/components/mask/config.d.ts +21 -0
  261. package/dist/components/mask/config.js +14 -0
  262. package/dist/components/mask/config.js.map +1 -0
  263. package/dist/components/mask/index.d.ts +3 -0
  264. package/dist/components/mask/style/mask.css +1 -0
  265. package/dist/components/match/Match copy.d.ts +1600 -0
  266. package/dist/components/match/Match.d.ts +1621 -0
  267. package/dist/components/match/Match.js +343 -0
  268. package/dist/components/match/Match.js.map +1 -0
  269. package/dist/components/match/config.d.ts +29 -0
  270. package/dist/components/match/config.js +17 -0
  271. package/dist/components/match/config.js.map +1 -0
  272. package/dist/components/match/index.d.ts +3 -0
  273. package/dist/components/match/style/index.css +1 -0
  274. package/dist/components/modal/Modal.d.ts +460 -0
  275. package/dist/components/modal/Modal.js +297 -0
  276. package/dist/components/modal/Modal.js.map +1 -0
  277. package/dist/components/modal/config.d.ts +33 -0
  278. package/dist/components/modal/config.js +19 -0
  279. package/dist/components/modal/config.js.map +1 -0
  280. package/dist/components/modal/index.d.ts +3 -0
  281. package/dist/components/modal/style/index.css +1 -0
  282. package/dist/components/notice/Notice.d.ts +137 -0
  283. package/dist/components/notice/Notice.js +192 -0
  284. package/dist/components/notice/Notice.js.map +1 -0
  285. package/dist/components/notice/index.d.ts +51 -0
  286. package/dist/components/notice/index.js +243 -0
  287. package/dist/components/notice/index.js.map +1 -0
  288. package/dist/components/notice/src/_util/index.d.ts +11 -0
  289. package/dist/components/notice/src/_util/index.js +50 -0
  290. package/dist/components/notice/src/_util/index.js.map +1 -0
  291. package/dist/components/notice/src/style/index.css +1 -0
  292. package/dist/components/notice/types.d.ts +98 -0
  293. package/dist/components/number/Number copy.d.ts +966 -0
  294. package/dist/components/number/Number.d.ts +1034 -0
  295. package/dist/components/number/Number.js +241 -0
  296. package/dist/components/number/Number.js.map +1 -0
  297. package/dist/components/number/config.d.ts +26 -0
  298. package/dist/components/number/config.js +15 -0
  299. package/dist/components/number/config.js.map +1 -0
  300. package/dist/components/number/index.d.ts +3 -0
  301. package/dist/components/number/style/index.css +1 -0
  302. package/dist/components/pagination/index.d.ts +3 -0
  303. package/dist/components/pagination/src/Pagination.d.ts +2830 -0
  304. package/dist/components/pagination/src/Pagination.js +288 -0
  305. package/dist/components/pagination/src/Pagination.js.map +1 -0
  306. package/dist/components/pagination/src/config.d.ts +25 -0
  307. package/dist/components/pagination/src/config.js +20 -0
  308. package/dist/components/pagination/src/config.js.map +1 -0
  309. package/dist/components/pagination/src/style/index.css +1 -0
  310. package/dist/components/picture/Picture.d.ts +18 -0
  311. package/dist/components/picture/Picture.js +254 -0
  312. package/dist/components/picture/Picture.js.map +1 -0
  313. package/dist/components/picture/PictureToolbar.d.ts +29 -0
  314. package/dist/components/picture/PictureToolbar.js +97 -0
  315. package/dist/components/picture/PictureToolbar.js.map +1 -0
  316. package/dist/components/picture/PictureViewport.d.ts +47 -0
  317. package/dist/components/picture/PictureViewport.js +203 -0
  318. package/dist/components/picture/PictureViewport.js.map +1 -0
  319. package/dist/components/picture/config.d.ts +16 -0
  320. package/dist/components/picture/config.js +16 -0
  321. package/dist/components/picture/config.js.map +1 -0
  322. package/dist/components/picture/index.d.ts +5 -0
  323. package/dist/components/picture/pictureFlip.d.ts +16 -0
  324. package/dist/components/picture/pictureFlip.js +103 -0
  325. package/dist/components/picture/pictureFlip.js.map +1 -0
  326. package/dist/components/picture/style/index.css +1 -0
  327. package/dist/components/progress/Progress.d.ts +94 -0
  328. package/dist/components/progress/Progress.js +112 -0
  329. package/dist/components/progress/Progress.js.map +1 -0
  330. package/dist/components/progress/index.d.ts +1 -0
  331. package/dist/components/progress/style/index.css +1 -0
  332. package/dist/components/radio/Radio.d.ts +112 -0
  333. package/dist/components/radio/Radio.js +130 -0
  334. package/dist/components/radio/Radio.js.map +1 -0
  335. package/dist/components/radio/config.d.ts +29 -0
  336. package/dist/components/radio/config.js +18 -0
  337. package/dist/components/radio/config.js.map +1 -0
  338. package/dist/components/radio/index.d.ts +3 -0
  339. package/dist/components/radio/style/index.css +1 -0
  340. package/dist/components/scrollbar/Scrollbar.d.ts +93 -0
  341. package/dist/components/scrollbar/Scrollbar.js +515 -0
  342. package/dist/components/scrollbar/Scrollbar.js.map +1 -0
  343. package/dist/components/scrollbar/index.d.ts +1 -0
  344. package/dist/components/scrollbar/style/index.css +1 -0
  345. package/dist/components/sheet/Sheet.d.ts +1448 -0
  346. package/dist/components/sheet/Sheet.js +592 -0
  347. package/dist/components/sheet/Sheet.js.map +1 -0
  348. package/dist/components/sheet/_cell.d.ts +181 -0
  349. package/dist/components/sheet/_cell.js +132 -0
  350. package/dist/components/sheet/_cell.js.map +1 -0
  351. package/dist/components/sheet/_props.d.ts +170 -0
  352. package/dist/components/sheet/_props.js +183 -0
  353. package/dist/components/sheet/_props.js.map +1 -0
  354. package/dist/components/sheet/_row.d.ts +2 -0
  355. package/dist/components/sheet/_row.js +14 -0
  356. package/dist/components/sheet/_row.js.map +1 -0
  357. package/dist/components/sheet/_tbody.d.ts +348 -0
  358. package/dist/components/sheet/_tbody.js +255 -0
  359. package/dist/components/sheet/_tbody.js.map +1 -0
  360. package/dist/components/sheet/_tfoot.d.ts +195 -0
  361. package/dist/components/sheet/_tfoot.js +78 -0
  362. package/dist/components/sheet/_tfoot.js.map +1 -0
  363. package/dist/components/sheet/_thead.d.ts +529 -0
  364. package/dist/components/sheet/_thead.js +148 -0
  365. package/dist/components/sheet/_thead.js.map +1 -0
  366. package/dist/components/sheet/_use.d.ts +38 -0
  367. package/dist/components/sheet/_use.js +493 -0
  368. package/dist/components/sheet/_use.js.map +1 -0
  369. package/dist/components/sheet/_util.d.ts +34 -0
  370. package/dist/components/sheet/_util.js +111 -0
  371. package/dist/components/sheet/_util.js.map +1 -0
  372. package/dist/components/sheet/index.d.ts +1 -0
  373. package/dist/components/sheet/style/index.css +1 -0
  374. package/dist/components/slideDown/SlideDown.d.ts +62 -0
  375. package/dist/components/slideDown/SlideDown.js +128 -0
  376. package/dist/components/slideDown/SlideDown.js.map +1 -0
  377. package/dist/components/slideDown/index.d.ts +1 -0
  378. package/dist/components/slider/Slider.d.ts +1726 -0
  379. package/dist/components/slider/Slider.js +471 -0
  380. package/dist/components/slider/Slider.js.map +1 -0
  381. package/dist/components/slider/index.d.ts +1 -0
  382. package/dist/components/slider/style/index.css +1 -0
  383. package/dist/components/svgIcon/SvgIcon.d.ts +37 -0
  384. package/dist/components/svgIcon/SvgIcon.js +78 -0
  385. package/dist/components/svgIcon/SvgIcon.js.map +1 -0
  386. package/dist/components/svgIcon/index.d.ts +3 -0
  387. package/dist/components/svgIcon/style/index.css +1 -0
  388. package/dist/components/switch/Switch.d.ts +105 -0
  389. package/dist/components/switch/Switch.js +158 -0
  390. package/dist/components/switch/Switch.js.map +1 -0
  391. package/dist/components/switch/config.d.ts +16 -0
  392. package/dist/components/switch/config.js +11 -0
  393. package/dist/components/switch/config.js.map +1 -0
  394. package/dist/components/switch/index.d.ts +1 -0
  395. package/dist/components/switch/style/index.css +1 -0
  396. package/dist/components/tab/Tab.d.ts +113 -0
  397. package/dist/components/tab/Tab.js +485 -0
  398. package/dist/components/tab/Tab.js.map +1 -0
  399. package/dist/components/tab/index.d.ts +2 -0
  400. package/dist/components/tab/style/index.css +1 -0
  401. package/dist/components/textarea/Textarea.d.ts +37 -0
  402. package/dist/components/textarea/Textarea.js +193 -0
  403. package/dist/components/textarea/Textarea.js.map +1 -0
  404. package/dist/components/textarea/config.d.ts +30 -0
  405. package/dist/components/textarea/config.js +16 -0
  406. package/dist/components/textarea/config.js.map +1 -0
  407. package/dist/components/textarea/index.d.ts +4 -0
  408. package/dist/components/textarea/style/index.css +1 -0
  409. package/dist/components/time/Dial.js +7 -0
  410. package/dist/components/time/Dial.js.map +1 -0
  411. package/dist/components/time/Dial.vue_vue_type_script_setup_true_lang.js +178 -0
  412. package/dist/components/time/Dial.vue_vue_type_script_setup_true_lang.js.map +1 -0
  413. package/dist/components/time/TimePicker.d.ts +1301 -0
  414. package/dist/components/time/TimePicker.js +162 -0
  415. package/dist/components/time/TimePicker.js.map +1 -0
  416. package/dist/components/time/_use/useTimeModules.d.ts +1 -0
  417. package/dist/components/time/index.d.ts +1 -0
  418. package/dist/components/time/style/dial.css +1 -0
  419. package/dist/components/time/style/index.css +1 -0
  420. package/dist/components/toggle/Toggle.d.ts +140 -0
  421. package/dist/components/toggle/Toggle.js +209 -0
  422. package/dist/components/toggle/Toggle.js.map +1 -0
  423. package/dist/components/toggle/index.d.ts +1 -0
  424. package/dist/components/toggle/style/index.css +1 -0
  425. package/dist/components/toggle/style/scale.css +1 -0
  426. package/dist/components/toggle/style/translate.css +1 -0
  427. package/dist/components/tooltip/Tooltip.d.ts +536 -0
  428. package/dist/components/tooltip/Tooltip.js +51 -0
  429. package/dist/components/tooltip/Tooltip.js.map +1 -0
  430. package/dist/components/tooltip/index.d.ts +1 -0
  431. package/dist/components/tooltip/style/index.css +1 -0
  432. package/dist/components/tree/Tree.d.ts +187 -0
  433. package/dist/components/tree/Tree.js +229 -0
  434. package/dist/components/tree/Tree.js.map +1 -0
  435. package/dist/components/tree/TreeItem.d.ts +86 -0
  436. package/dist/components/tree/TreeItem.js +152 -0
  437. package/dist/components/tree/TreeItem.js.map +1 -0
  438. package/dist/components/tree/TreeList.d.ts +86 -0
  439. package/dist/components/tree/TreeList.js +52 -0
  440. package/dist/components/tree/TreeList.js.map +1 -0
  441. package/dist/components/tree/_use/treeState.d.ts +45 -0
  442. package/dist/components/tree/_use/treeState.js +417 -0
  443. package/dist/components/tree/_use/treeState.js.map +1 -0
  444. package/dist/components/tree/config.d.ts +27 -0
  445. package/dist/components/tree/config.js +16 -0
  446. package/dist/components/tree/config.js.map +1 -0
  447. package/dist/components/tree/index.d.ts +4 -0
  448. package/dist/components/tree/style/index.css +1 -0
  449. package/dist/components/tree-choose/TreeChoose.d.ts +833 -0
  450. package/dist/components/tree-choose/TreeChoose.js +320 -0
  451. package/dist/components/tree-choose/TreeChoose.js.map +1 -0
  452. package/dist/components/tree-choose/config.d.ts +41 -0
  453. package/dist/components/tree-choose/config.js +19 -0
  454. package/dist/components/tree-choose/config.js.map +1 -0
  455. package/dist/components/tree-choose/index.d.ts +4 -0
  456. package/dist/components/tree-choose/style/index.css +1 -0
  457. package/dist/components/trigger/Trigger.d.ts +921 -0
  458. package/dist/components/trigger/Trigger.js +105 -0
  459. package/dist/components/trigger/Trigger.js.map +1 -0
  460. package/dist/components/trigger/index.d.ts +1 -0
  461. package/dist/components/trigger/style/index.css +2 -0
  462. package/dist/components/upload/Upload.d.ts +249 -0
  463. package/dist/components/upload/Upload.js +342 -0
  464. package/dist/components/upload/Upload.js.map +1 -0
  465. package/dist/components/upload/config.d.ts +39 -0
  466. package/dist/components/upload/config.js +21 -0
  467. package/dist/components/upload/config.js.map +1 -0
  468. package/dist/components/upload/index.d.ts +4 -0
  469. package/dist/components/upload/style/index.css +1 -0
  470. package/dist/components/upload/types.d.ts +47 -0
  471. package/dist/components/virtual/Virtual.d.ts +57 -0
  472. package/dist/components/virtual/Virtual.js +62 -0
  473. package/dist/components/virtual/Virtual.js.map +1 -0
  474. package/dist/components/virtual/Virtual/345/216/237/347/211/210.d.ts +44 -0
  475. package/dist/components/virtual/index.d.ts +4 -0
  476. package/dist/components/virtual/style/index.css +1 -0
  477. package/dist/components/virtual/useVirtualList.d.ts +50 -0
  478. package/dist/components/virtual/useVirtualList.js +376 -0
  479. package/dist/components/virtual/useVirtualList.js.map +1 -0
  480. package/dist/components/write/Write.d.ts +532 -0
  481. package/dist/components/write/Write.js +228 -0
  482. package/dist/components/write/Write.js.map +1 -0
  483. package/dist/components/write/index.d.ts +1 -0
  484. package/dist/components/write/style/index.css +1 -0
  485. package/dist/config/dictionary.d.ts +21 -0
  486. package/dist/config/dictionary.js +28 -0
  487. package/dist/config/dictionary.js.map +1 -0
  488. package/dist/config/i18n.d.ts +22 -0
  489. package/dist/config/i18n.js +53 -0
  490. package/dist/config/i18n.js.map +1 -0
  491. package/dist/config/plugin.d.ts +88 -0
  492. package/dist/config/plugin.js +13 -0
  493. package/dist/config/plugin.js.map +1 -0
  494. package/dist/config/types.d.ts +56 -0
  495. package/dist/directives/clickOutside.d.ts +10 -0
  496. package/dist/directives/clickOutside.js +69 -0
  497. package/dist/directives/clickOutside.js.map +1 -0
  498. package/dist/directives/index.d.ts +3 -0
  499. package/dist/directives/index.js +13 -0
  500. package/dist/directives/index.js.map +1 -0
  501. package/dist/directives/loading.d.ts +19 -0
  502. package/dist/directives/loading.js +64 -0
  503. package/dist/directives/loading.js.map +1 -0
  504. package/dist/index.d.ts +127 -0
  505. package/dist/index.js +91 -0
  506. package/dist/locales/de-DE/index.d.ts +144 -0
  507. package/dist/locales/de-DE/index.js +140 -0
  508. package/dist/locales/de-DE/index.js.map +1 -0
  509. package/dist/locales/en-US/index.d.ts +144 -0
  510. package/dist/locales/en-US/index.js +140 -0
  511. package/dist/locales/en-US/index.js.map +1 -0
  512. package/dist/locales/index.d.ts +3 -0
  513. package/dist/locales/zh-CN/index.d.ts +144 -0
  514. package/dist/locales/zh-CN/index.js +140 -0
  515. package/dist/locales/zh-CN/index.js.map +1 -0
  516. package/dist/plugin.d.ts +6 -0
  517. package/dist/plugin.js +38 -0
  518. package/dist/plugin.js.map +1 -0
  519. package/dist/styles/index.css +49 -0
  520. package/dist/theme/_transition.css +169 -0
  521. package/dist/theme/index.css +5 -0
  522. package/dist/theme/tokens/_base.css +7 -0
  523. package/dist/theme/tokens/_common.css +37 -0
  524. package/dist/theme/tokens/_scrollbar.css +53 -0
  525. package/dist/theme/tokens/_size.css +18 -0
  526. package/dist/theme/tokens/_text.css +16 -0
  527. package/dist/theme/tokens/_var.css +1087 -0
  528. package/dist/theme/tokens/components/audioPlayer.css +542 -0
  529. package/dist/theme/tokens/components/btn.css +253 -0
  530. package/dist/theme/tokens/components/btnGroup.css +68 -0
  531. package/dist/theme/tokens/components/cascade.css +77 -0
  532. package/dist/theme/tokens/components/checkbox.css +100 -0
  533. package/dist/theme/tokens/components/choose.css +175 -0
  534. package/dist/theme/tokens/components/choose2.css +242 -0
  535. package/dist/theme/tokens/components/chooseItem.css +54 -0
  536. package/dist/theme/tokens/components/circleProgress.css +61 -0
  537. package/dist/theme/tokens/components/close.css +12 -0
  538. package/dist/theme/tokens/components/colorPicker.css +404 -0
  539. package/dist/theme/tokens/components/confirm.css +128 -0
  540. package/dist/theme/tokens/components/copy.css +80 -0
  541. package/dist/theme/tokens/components/cornerEars.css +102 -0
  542. package/dist/theme/tokens/components/date/days.css +79 -0
  543. package/dist/theme/tokens/components/date/index.css +249 -0
  544. package/dist/theme/tokens/components/date/months.css +68 -0
  545. package/dist/theme/tokens/components/drawer.css +189 -0
  546. package/dist/theme/tokens/components/ellipsis.css +46 -0
  547. package/dist/theme/tokens/components/empty.css +24 -0
  548. package/dist/theme/tokens/components/equalizer.css +51 -0
  549. package/dist/theme/tokens/components/fallback.css +4 -0
  550. package/dist/theme/tokens/components/form.css +50 -0
  551. package/dist/theme/tokens/components/formItem.css +194 -0
  552. package/dist/theme/tokens/components/icon.css +41 -0
  553. package/dist/theme/tokens/components/image.css +70 -0
  554. package/dist/theme/tokens/components/layer.css +190 -0
  555. package/dist/theme/tokens/components/lcdFont.css +121 -0
  556. package/dist/theme/tokens/components/list.css +97 -0
  557. package/dist/theme/tokens/components/loading.css +64 -0
  558. package/dist/theme/tokens/components/mask.css +26 -0
  559. package/dist/theme/tokens/components/match.css +119 -0
  560. package/dist/theme/tokens/components/modal.css +136 -0
  561. package/dist/theme/tokens/components/notice.css +264 -0
  562. package/dist/theme/tokens/components/number.css +150 -0
  563. package/dist/theme/tokens/components/pagination.css +215 -0
  564. package/dist/theme/tokens/components/picture.css +299 -0
  565. package/dist/theme/tokens/components/progress.css +101 -0
  566. package/dist/theme/tokens/components/radio.css +183 -0
  567. package/dist/theme/tokens/components/scrollbar.css +160 -0
  568. package/dist/theme/tokens/components/sheet.css +518 -0
  569. package/dist/theme/tokens/components/slider.css +171 -0
  570. package/dist/theme/tokens/components/svgIcon.css +6 -0
  571. package/dist/theme/tokens/components/switch.css +67 -0
  572. package/dist/theme/tokens/components/tab.css +215 -0
  573. package/dist/theme/tokens/components/textarea.css +109 -0
  574. package/dist/theme/tokens/components/time/dial.css +123 -0
  575. package/dist/theme/tokens/components/time/index.css +29 -0
  576. package/dist/theme/tokens/components/toggle/index.css +14 -0
  577. package/dist/theme/tokens/components/toggle/scale.css +34 -0
  578. package/dist/theme/tokens/components/toggle/translate.css +41 -0
  579. package/dist/theme/tokens/components/tooltip.css +77 -0
  580. package/dist/theme/tokens/components/tree-choose.css +154 -0
  581. package/dist/theme/tokens/components/tree.css +172 -0
  582. package/dist/theme/tokens/components/trigger.css +90 -0
  583. package/dist/theme/tokens/components/upload.css +302 -0
  584. package/dist/theme/tokens/components/virtual.css +6 -0
  585. package/dist/theme/tokens/components/write.css +155 -0
  586. package/dist/theme/tokens/iconfont/iconfont.css +103 -0
  587. package/dist/theme/tokens/iconfont/iconfont.ttf +0 -0
  588. package/dist/theme/tokens/iconfont/iconfont.woff +0 -0
  589. package/dist/theme/tokens/iconfont/iconfont.woff2 +0 -0
  590. package/dist/theme/tokens/index.css +19 -0
  591. package/dist/use/index.d.ts +34 -0
  592. package/dist/use/toggle/types.d.ts +27 -0
  593. package/dist/use/toggle/useToggle.d.ts +22 -0
  594. package/dist/use/toggle/useToggleArray.d.ts +14 -0
  595. package/dist/use/toggle/useToggleArray.js +36 -0
  596. package/dist/use/toggle/useToggleArray.js.map +1 -0
  597. package/dist/use/toggle/useToggleCycle.d.ts +11 -0
  598. package/dist/use/toggle/useToggleCycle.js +88 -0
  599. package/dist/use/toggle/useToggleCycle.js.map +1 -0
  600. package/dist/use/toggle/useToggleMap.d.ts +10 -0
  601. package/dist/use/toggle/useToggleObject.d.ts +13 -0
  602. package/dist/use/useAudioPlayer.d.ts +160 -0
  603. package/dist/use/useAudioPlayer.js +799 -0
  604. package/dist/use/useAudioPlayer.js.map +1 -0
  605. package/dist/use/useBoundingClientRect.d.ts +14 -0
  606. package/dist/use/useBoundingClientRect.js +54 -0
  607. package/dist/use/useBoundingClientRect.js.map +1 -0
  608. package/dist/use/useChildComponentsCollector.js +30 -0
  609. package/dist/use/useChildComponentsCollector.js.map +1 -0
  610. package/dist/use/useComponentClass.d.ts +1 -0
  611. package/dist/use/useComponentClass.js +6 -0
  612. package/dist/use/useComponentClass.js.map +1 -0
  613. package/dist/use/useComponentConfig.d.ts +10 -0
  614. package/dist/use/useComponentConfig.js +31 -0
  615. package/dist/use/useComponentConfig.js.map +1 -0
  616. package/dist/use/useCount.d.ts +13 -0
  617. package/dist/use/useCount.js +36 -0
  618. package/dist/use/useCount.js.map +1 -0
  619. package/dist/use/useDate.d.ts +53 -0
  620. package/dist/use/useDate.js +280 -0
  621. package/dist/use/useDate.js.map +1 -0
  622. package/dist/use/useDelay.d.ts +5 -0
  623. package/dist/use/useDelay.js +38 -0
  624. package/dist/use/useDelay.js.map +1 -0
  625. package/dist/use/useDrag.d.ts +17 -0
  626. package/dist/use/useElement.d.ts +15 -0
  627. package/dist/use/useElement.js +41 -0
  628. package/dist/use/useElement.js.map +1 -0
  629. package/dist/use/useEscStack.d.ts +14 -0
  630. package/dist/use/useEscStack.js +62 -0
  631. package/dist/use/useEscStack.js.map +1 -0
  632. package/dist/use/useEvent.d.ts +9 -0
  633. package/dist/use/useEvent.js +43 -0
  634. package/dist/use/useEvent.js.map +1 -0
  635. package/dist/use/useFormItem.d.ts +9 -0
  636. package/dist/use/useFormItem.js +20 -0
  637. package/dist/use/useFormItem.js.map +1 -0
  638. package/dist/use/useGlobalZIndex.d.ts +6 -0
  639. package/dist/use/useGlobalZIndex.js +28 -0
  640. package/dist/use/useGlobalZIndex.js.map +1 -0
  641. package/dist/use/useMouse.d.ts +15 -0
  642. package/dist/use/useMouse.js +36 -0
  643. package/dist/use/useMouse.js.map +1 -0
  644. package/dist/use/useMousePositionInElement.d.ts +6 -0
  645. package/dist/use/useMousePositionInElement.js +27 -0
  646. package/dist/use/useMousePositionInElement.js.map +1 -0
  647. package/dist/use/useParentNode.d.ts +3 -0
  648. package/dist/use/useParentNode.js +25 -0
  649. package/dist/use/useParentNode.js.map +1 -0
  650. package/dist/use/usePercentDrag.d.ts +20 -0
  651. package/dist/use/usePercentDrag.js +59 -0
  652. package/dist/use/usePercentDrag.js.map +1 -0
  653. package/dist/use/usePictureViewport.d.ts +57 -0
  654. package/dist/use/usePictureViewport.js +229 -0
  655. package/dist/use/usePictureViewport.js.map +1 -0
  656. package/dist/use/useRequest.d.ts +7 -0
  657. package/dist/use/useRequest.js +31 -0
  658. package/dist/use/useRequest.js.map +1 -0
  659. package/dist/use/useScaleFromPoint.d.ts +57 -0
  660. package/dist/use/useScaleFromPoint.js +325 -0
  661. package/dist/use/useScaleFromPoint.js.map +1 -0
  662. package/dist/use/useScroll.d.ts +9 -0
  663. package/dist/use/useScroll.js +60 -0
  664. package/dist/use/useScroll.js.map +1 -0
  665. package/dist/use/useSearch.d.ts +11 -0
  666. package/dist/use/useSearch.js +65 -0
  667. package/dist/use/useSearch.js.map +1 -0
  668. package/dist/use/useSlot.d.ts +10 -0
  669. package/dist/use/useSlot.js +57 -0
  670. package/dist/use/useSlot.js.map +1 -0
  671. package/dist/use/useTabIndex.d.ts +1 -0
  672. package/dist/use/useTabIndex.js +18 -0
  673. package/dist/use/useTabIndex.js.map +1 -0
  674. package/dist/use/useUII18n.js +26 -0
  675. package/dist/use/useUII18n.js.map +1 -0
  676. package/dist/use/useUpload.d.ts +49 -0
  677. package/dist/use/useUpload.js +396 -0
  678. package/dist/use/useUpload.js.map +1 -0
  679. package/dist/use/useVisibleResize.d.ts +6 -0
  680. package/dist/use/useVisibleResize.js +77 -0
  681. package/dist/use/useVisibleResize.js.map +1 -0
  682. package/dist/util/calc.d.ts +40 -0
  683. package/dist/util/calc.js +239 -0
  684. package/dist/util/calc.js.map +1 -0
  685. package/dist/util/colors.d.ts +78 -0
  686. package/dist/util/colors.js +320 -0
  687. package/dist/util/colors.js.map +1 -0
  688. package/dist/util/cssVars.d.ts +62 -0
  689. package/dist/util/cssVars.js +170 -0
  690. package/dist/util/cssVars.js.map +1 -0
  691. package/dist/util/dom.d.ts +65 -0
  692. package/dist/util/dom.js +212 -0
  693. package/dist/util/dom.js.map +1 -0
  694. package/dist/util/index.d.ts +5 -0
  695. package/dist/util/tools.d.ts +54 -0
  696. package/dist/util/tools.js +90 -0
  697. package/dist/util/tools.js.map +1 -0
  698. package/dist/util/vnode.d.ts +2 -0
  699. package/package.json +88 -0
@@ -0,0 +1,799 @@
1
+ import { computed, onUnmounted, ref, toValue, watch } from "vue";
2
+ //#region use/useAudioPlayer.ts
3
+ var PLAY_MODES = [
4
+ "sequential",
5
+ "random",
6
+ "single-loop",
7
+ "list-loop"
8
+ ];
9
+ var clamp = (value, min, max) => {
10
+ if (!Number.isFinite(value)) return min;
11
+ return Math.min(Math.max(value, min), max);
12
+ };
13
+ var normalizePercentInput = (value) => {
14
+ const safeValue = Number.isFinite(value) ? value : 0;
15
+ return clamp(safeValue <= 1 ? safeValue * 100 : safeValue, 0, 100);
16
+ };
17
+ var createId = (prefix) => {
18
+ return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
19
+ };
20
+ var formatAudioTime = (seconds) => {
21
+ if (!Number.isFinite(seconds) || seconds < 0) return "00:00";
22
+ const totalSeconds = Math.floor(seconds);
23
+ const hour = Math.floor(totalSeconds / 3600);
24
+ const minute = Math.floor(totalSeconds % 3600 / 60);
25
+ const second = totalSeconds % 60;
26
+ if (hour > 0) return [
27
+ hour,
28
+ minute,
29
+ second
30
+ ].map((item) => String(item).padStart(2, "0")).join(":");
31
+ return [minute, second].map((item) => String(item).padStart(2, "0")).join(":");
32
+ };
33
+ var normalizeTrack = (track, fallbackId) => {
34
+ return {
35
+ ...track,
36
+ id: track.id != null ? String(track.id) : fallbackId
37
+ };
38
+ };
39
+ var normalizePlaylist = (playlist, playlistIndex) => {
40
+ const playlistId = playlist.id != null ? String(playlist.id) : `playlist-${playlistIndex}`;
41
+ return {
42
+ ...playlist,
43
+ id: playlistId,
44
+ tracks: (playlist.tracks || []).map((track, trackIndex) => normalizeTrack(track, `${playlistId}-track-${trackIndex}`))
45
+ };
46
+ };
47
+ var clonePlaylists = (playlists) => {
48
+ return playlists.map((playlist) => ({
49
+ ...playlist,
50
+ tracks: playlist.tracks.map((track) => ({ ...track }))
51
+ }));
52
+ };
53
+ function useAudioPlayer(options = {}) {
54
+ const { defaultVolume = 100, defaultMuted = false, onPlay, onPause, onEnded, onTimeUpdate, onVolumeChange, onTrackChange, onPlaylistChange, onPlaylistsChange, onPlayModeChange, onLoaded, onError, onUpdateActivePlaylistId, onUpdateActiveTrackId, onUpdatePlayMode } = options;
55
+ const getPlaylists = () => toValue(options.playlists) ?? [];
56
+ const getSource = () => toValue(options.source) ?? null;
57
+ const getActivePlaylistId = () => toValue(options.activePlaylistId);
58
+ const getActiveTrackId = () => toValue(options.activeTrackId);
59
+ const getPlayMode = () => toValue(options.playMode) ?? "sequential";
60
+ const getAutoplay = () => toValue(options.autoplay) ?? false;
61
+ const getPreload = () => toValue(options.preload) ?? "metadata";
62
+ const audioElement = typeof Audio !== "undefined" ? new Audio() : null;
63
+ if (audioElement) {
64
+ audioElement.preload = getPreload();
65
+ audioElement.volume = clamp(defaultVolume, 0, 100) / 100;
66
+ audioElement.muted = defaultMuted;
67
+ }
68
+ const playlists = ref(getPlaylists().map((item, index) => normalizePlaylist(item, index)));
69
+ const directTrack = ref(null);
70
+ const playbackContext = ref(getSource() ? "direct" : "playlist");
71
+ const currentPlaylistId = ref(getActivePlaylistId() != null ? String(getActivePlaylistId()) : null);
72
+ const currentTrackId = ref(getActiveTrackId() != null ? String(getActiveTrackId()) : null);
73
+ const playMode = ref(PLAY_MODES.includes(getPlayMode()) ? getPlayMode() : "sequential");
74
+ const isReady = ref(false);
75
+ const isPlaying = ref(false);
76
+ const isLoading = ref(false);
77
+ const isMuted = ref(defaultMuted);
78
+ const isSeeking = ref(false);
79
+ const currentTime = ref(0);
80
+ const duration = ref(0);
81
+ const bufferedTime = ref(0);
82
+ const volumePercent = ref(clamp(defaultVolume, 0, 100));
83
+ const lastVolumeBeforeMute = ref(volumePercent.value || 100);
84
+ const seekPreviewPercent = ref(0);
85
+ const seekPreviewTime = ref(0);
86
+ const errorMessage = ref("");
87
+ const currentObjectUrl = ref(null);
88
+ /** 用于取消过期的 load/play,避免切歌时 play 被 pause 打断报错 */
89
+ let loadSession = 0;
90
+ const currentPlaylist = computed(() => {
91
+ if (playbackContext.value !== "playlist") return null;
92
+ return playlists.value.find((item) => item.id === currentPlaylistId.value) || null;
93
+ });
94
+ const currentTrackIndex = computed(() => {
95
+ if (playbackContext.value !== "playlist" || !currentPlaylist.value) return -1;
96
+ return currentPlaylist.value.tracks.findIndex((item) => item.id === currentTrackId.value);
97
+ });
98
+ const currentTrack = computed(() => {
99
+ if (playbackContext.value === "direct") return directTrack.value;
100
+ if (!currentPlaylist.value) return null;
101
+ return currentPlaylist.value.tracks.find((item) => item.id === currentTrackId.value) || null;
102
+ });
103
+ const hasTrack = computed(() => Boolean(currentTrack.value));
104
+ const progressPercent = computed(() => {
105
+ if (!duration.value) return 0;
106
+ return clamp(currentTime.value / duration.value * 100, 0, 100);
107
+ });
108
+ const displayProgressPercent = computed(() => {
109
+ return isSeeking.value ? seekPreviewPercent.value : progressPercent.value;
110
+ });
111
+ const displayCurrentTime = computed(() => {
112
+ return isSeeking.value ? seekPreviewTime.value : currentTime.value;
113
+ });
114
+ const bufferedPercent = computed(() => {
115
+ if (!duration.value) return 0;
116
+ return clamp(bufferedTime.value / duration.value * 100, 0, 100);
117
+ });
118
+ const formattedCurrentTime = computed(() => formatAudioTime(currentTime.value));
119
+ const formattedDuration = computed(() => formatAudioTime(duration.value));
120
+ const formattedDisplayCurrentTime = computed(() => formatAudioTime(displayCurrentTime.value));
121
+ const canPlayPrev = computed(() => {
122
+ if (playbackContext.value !== "playlist" || !currentPlaylist.value) return false;
123
+ if (playMode.value === "random" || playMode.value === "list-loop") return currentPlaylist.value.tracks.length > 1;
124
+ return currentTrackIndex.value > 0;
125
+ });
126
+ const canPlayNext = computed(() => {
127
+ if (playbackContext.value !== "playlist" || !currentPlaylist.value) return false;
128
+ if (playMode.value === "random" || playMode.value === "list-loop") return currentPlaylist.value.tracks.length > 1;
129
+ return currentTrackIndex.value > -1 && currentTrackIndex.value < currentPlaylist.value.tracks.length - 1;
130
+ });
131
+ const isPaused = computed(() => !isPlaying.value);
132
+ const revokeObjectUrl = () => {
133
+ if (currentObjectUrl.value) {
134
+ URL.revokeObjectURL(currentObjectUrl.value);
135
+ currentObjectUrl.value = null;
136
+ }
137
+ };
138
+ const clearAudioState = () => {
139
+ currentTime.value = 0;
140
+ duration.value = 0;
141
+ bufferedTime.value = 0;
142
+ isPlaying.value = false;
143
+ isLoading.value = false;
144
+ isReady.value = false;
145
+ isSeeking.value = false;
146
+ seekPreviewPercent.value = 0;
147
+ seekPreviewTime.value = 0;
148
+ errorMessage.value = "";
149
+ };
150
+ const detachMediaSource = () => {
151
+ if (!audioElement) return;
152
+ audioElement.removeAttribute("src");
153
+ try {
154
+ audioElement.srcObject = null;
155
+ } catch {}
156
+ };
157
+ const clearAudioSource = () => {
158
+ loadSession += 1;
159
+ if (!audioElement) {
160
+ revokeObjectUrl();
161
+ clearAudioState();
162
+ return;
163
+ }
164
+ audioElement.pause();
165
+ detachMediaSource();
166
+ revokeObjectUrl();
167
+ clearAudioState();
168
+ };
169
+ const hasMediaSource = () => {
170
+ if (!audioElement) return false;
171
+ return Boolean(audioElement.getAttribute("src") || audioElement.srcObject);
172
+ };
173
+ /** 媒体处于错误态或尚未挂源时需要重新加载 */
174
+ const needsMediaReload = () => {
175
+ if (!audioElement) return true;
176
+ if (!hasMediaSource()) return true;
177
+ return Boolean(audioElement.error);
178
+ };
179
+ /**
180
+ * 挂载媒体地址。同地址强制重载时先卸源再赋值;不要在空 src 时 load()。
181
+ * 赋值 src 本身会触发资源选择,再调 load() 容易与进行中的请求打架导致 Format error。
182
+ */
183
+ const applyMediaSource = (source, forceReload = false) => {
184
+ if (!audioElement) return;
185
+ const current = audioElement.getAttribute("src");
186
+ if (!forceReload && current === source && !audioElement.error) return;
187
+ if (current) detachMediaSource();
188
+ audioElement.preload = getPreload();
189
+ audioElement.src = source;
190
+ };
191
+ const getTimeByPercent = (percent) => {
192
+ if (!duration.value) return 0;
193
+ return duration.value * (normalizePercentInput(percent) / 100);
194
+ };
195
+ const resolveTrackSource = (track) => {
196
+ if (!track) return "";
197
+ const source = track.src || track.url;
198
+ if (source) return source;
199
+ const binarySource = track.file || track.blob;
200
+ if (binarySource) {
201
+ revokeObjectUrl();
202
+ currentObjectUrl.value = URL.createObjectURL(binarySource);
203
+ return currentObjectUrl.value;
204
+ }
205
+ if (track.arrayBuffer) {
206
+ revokeObjectUrl();
207
+ const blob = new Blob([track.arrayBuffer], { type: track.mimeType || "audio/mpeg" });
208
+ currentObjectUrl.value = URL.createObjectURL(blob);
209
+ return currentObjectUrl.value;
210
+ }
211
+ return "";
212
+ };
213
+ const emitPlaylistChange = () => {
214
+ onPlaylistChange?.(currentPlaylist.value);
215
+ onPlaylistsChange?.(clonePlaylists(playlists.value));
216
+ };
217
+ const syncSelection = () => {
218
+ if (playbackContext.value === "direct") {
219
+ currentPlaylistId.value = null;
220
+ currentTrackId.value = directTrack.value?.id || null;
221
+ return;
222
+ }
223
+ if (!playlists.value.length) {
224
+ currentPlaylistId.value = null;
225
+ currentTrackId.value = null;
226
+ if (playbackContext.value === "playlist") clearAudioSource();
227
+ return;
228
+ }
229
+ const matchedPlaylist = playlists.value.find((item) => item.id === currentPlaylistId.value) || playlists.value[0];
230
+ currentPlaylistId.value = matchedPlaylist.id;
231
+ if (!matchedPlaylist.tracks.length) {
232
+ currentTrackId.value = null;
233
+ if (playbackContext.value === "playlist") clearAudioSource();
234
+ return;
235
+ }
236
+ const matchedTrack = matchedPlaylist.tracks.find((item) => item.id === currentTrackId.value) || matchedPlaylist.tracks[0];
237
+ currentTrackId.value = matchedTrack.id;
238
+ };
239
+ const isPlayInterruptedError = (error) => {
240
+ if (!(error instanceof DOMException) && !(error instanceof Error)) return false;
241
+ return error.name === "AbortError" || /interrupted by a call to pause/i.test(error.message);
242
+ };
243
+ const waitForCanPlay = (session) => {
244
+ return new Promise((resolve) => {
245
+ if (!audioElement) {
246
+ resolve(false);
247
+ return;
248
+ }
249
+ if (audioElement.readyState >= HTMLMediaElement.HAVE_FUTURE_DATA) {
250
+ resolve(session === loadSession);
251
+ return;
252
+ }
253
+ const onReady = () => {
254
+ cleanup();
255
+ resolve(session === loadSession);
256
+ };
257
+ const onError = () => {
258
+ cleanup();
259
+ resolve(false);
260
+ };
261
+ const cleanup = () => {
262
+ audioElement.removeEventListener("canplay", onReady);
263
+ audioElement.removeEventListener("loadeddata", onReady);
264
+ audioElement.removeEventListener("error", onError);
265
+ };
266
+ audioElement.addEventListener("canplay", onReady);
267
+ audioElement.addEventListener("loadeddata", onReady);
268
+ audioElement.addEventListener("error", onError);
269
+ });
270
+ };
271
+ const syncDurationFromElement = () => {
272
+ if (!audioElement) return 0;
273
+ const next = audioElement.duration;
274
+ if (Number.isFinite(next) && next > 0) {
275
+ duration.value = next;
276
+ return next;
277
+ }
278
+ return duration.value;
279
+ };
280
+ /** 确保当前曲目已挂上 src 且拿到 duration(初始化不预拉流时首次 seek 需要) */
281
+ const ensureMediaReady = async () => {
282
+ if (!audioElement || !currentTrack.value) return false;
283
+ if (!needsMediaReload() && syncDurationFromElement() > 0) return true;
284
+ if (needsMediaReload()) {
285
+ if (!await loadCurrentTrack({
286
+ autoplay: false,
287
+ forceReload: Boolean(audioElement.error)
288
+ })) return false;
289
+ }
290
+ const session = loadSession;
291
+ if (syncDurationFromElement() > 0) return session === loadSession;
292
+ return new Promise((resolve) => {
293
+ if (!audioElement) {
294
+ resolve(false);
295
+ return;
296
+ }
297
+ const onReady = () => {
298
+ syncDurationFromElement();
299
+ cleanup();
300
+ resolve(session === loadSession && duration.value > 0);
301
+ };
302
+ const onError = () => {
303
+ cleanup();
304
+ resolve(false);
305
+ };
306
+ const cleanup = () => {
307
+ audioElement.removeEventListener("loadedmetadata", onReady);
308
+ audioElement.removeEventListener("durationchange", onReady);
309
+ audioElement.removeEventListener("error", onError);
310
+ };
311
+ audioElement.addEventListener("loadedmetadata", onReady);
312
+ audioElement.addEventListener("durationchange", onReady);
313
+ audioElement.addEventListener("error", onError);
314
+ });
315
+ };
316
+ const play = async () => {
317
+ if (!audioElement || !currentTrack.value) return false;
318
+ if (needsMediaReload()) return loadCurrentTrack({
319
+ autoplay: true,
320
+ forceReload: Boolean(audioElement.error)
321
+ });
322
+ const session = loadSession;
323
+ try {
324
+ await audioElement.play();
325
+ return session === loadSession;
326
+ } catch (error) {
327
+ if (isPlayInterruptedError(error) || session !== loadSession) return false;
328
+ if (audioElement.error || /format error/i.test(String(error))) return loadCurrentTrack({
329
+ autoplay: true,
330
+ forceReload: true
331
+ });
332
+ const message = error instanceof Error ? error.message : "Audio playback failed.";
333
+ errorMessage.value = message;
334
+ onError?.(error);
335
+ return false;
336
+ }
337
+ };
338
+ const pause = () => {
339
+ audioElement?.pause();
340
+ };
341
+ const togglePlay = async () => {
342
+ if (isPlaying.value) {
343
+ pause();
344
+ return true;
345
+ }
346
+ return play();
347
+ };
348
+ const seek = (time) => {
349
+ if (!audioElement || !duration.value) return;
350
+ if (audioElement.readyState < HTMLMediaElement.HAVE_METADATA) return;
351
+ if (audioElement.error) return;
352
+ const targetTime = clamp(time, 0, duration.value);
353
+ try {
354
+ audioElement.currentTime = targetTime;
355
+ currentTime.value = targetTime;
356
+ } catch {}
357
+ };
358
+ const seekByPercent = (percent) => {
359
+ seek(getTimeByPercent(percent));
360
+ };
361
+ const beginSeeking = (percent) => {
362
+ isSeeking.value = true;
363
+ if (percent == null) {
364
+ seekPreviewPercent.value = progressPercent.value;
365
+ seekPreviewTime.value = currentTime.value;
366
+ return;
367
+ }
368
+ updateSeekingByPercent(percent);
369
+ };
370
+ const updateSeekingByPercent = (percent) => {
371
+ const nextPercent = normalizePercentInput(percent);
372
+ isSeeking.value = true;
373
+ seekPreviewPercent.value = nextPercent;
374
+ seekPreviewTime.value = getTimeByPercent(nextPercent);
375
+ };
376
+ const commitSeeking = async (percent) => {
377
+ if (percent != null) updateSeekingByPercent(percent);
378
+ const targetPercent = seekPreviewPercent.value;
379
+ isSeeking.value = false;
380
+ if (!await ensureMediaReady()) return;
381
+ seekByPercent(targetPercent);
382
+ };
383
+ const cancelSeeking = () => {
384
+ isSeeking.value = false;
385
+ seekPreviewPercent.value = progressPercent.value;
386
+ seekPreviewTime.value = currentTime.value;
387
+ };
388
+ const setVolume = (volume) => {
389
+ setVolumeByPercent(volume);
390
+ };
391
+ const setVolumeByPercent = (percent) => {
392
+ if (!audioElement) return;
393
+ const nextVolume = normalizePercentInput(percent);
394
+ volumePercent.value = nextVolume;
395
+ audioElement.volume = nextVolume / 100;
396
+ audioElement.muted = nextVolume === 0;
397
+ if (nextVolume > 0) lastVolumeBeforeMute.value = nextVolume;
398
+ };
399
+ const toggleMute = () => {
400
+ if (!audioElement) return;
401
+ if (audioElement.muted || volumePercent.value === 0) {
402
+ const restoredVolume = lastVolumeBeforeMute.value || 100;
403
+ audioElement.volume = clamp(restoredVolume, 0, 100) / 100;
404
+ audioElement.muted = false;
405
+ volumePercent.value = clamp(restoredVolume, 0, 100);
406
+ return;
407
+ }
408
+ lastVolumeBeforeMute.value = volumePercent.value || 100;
409
+ audioElement.muted = true;
410
+ };
411
+ const setPlayMode = (mode) => {
412
+ if (!PLAY_MODES.includes(mode)) return;
413
+ playMode.value = mode;
414
+ onUpdatePlayMode?.(mode);
415
+ onPlayModeChange?.(mode);
416
+ };
417
+ const loadCurrentTrack = async (loadOptions = {}) => {
418
+ if (!audioElement || !currentTrack.value) {
419
+ clearAudioSource();
420
+ return false;
421
+ }
422
+ const source = resolveTrackSource(currentTrack.value);
423
+ if (!source) {
424
+ const message = "Audio source is empty.";
425
+ errorMessage.value = message;
426
+ onError?.(/* @__PURE__ */ new Error(message));
427
+ clearAudioSource();
428
+ return false;
429
+ }
430
+ const session = ++loadSession;
431
+ errorMessage.value = "";
432
+ isLoading.value = true;
433
+ isReady.value = false;
434
+ currentTime.value = 0;
435
+ bufferedTime.value = 0;
436
+ seekPreviewPercent.value = 0;
437
+ seekPreviewTime.value = 0;
438
+ isSeeking.value = false;
439
+ try {
440
+ audioElement.pause();
441
+ } catch {}
442
+ const forceReload = Boolean(loadOptions.forceReload) || Boolean(audioElement.error);
443
+ if (forceReload || audioElement.getAttribute("src") !== source) applyMediaSource(source, forceReload);
444
+ onTrackChange?.(currentTrack.value);
445
+ if (!loadOptions.autoplay) return session === loadSession;
446
+ if (!await waitForCanPlay(session) || session !== loadSession) {
447
+ if (session === loadSession && !errorMessage.value) {
448
+ errorMessage.value = audioElement.error ? "音频格式不支持或资源无效。" : "音频加载失败。";
449
+ isLoading.value = false;
450
+ }
451
+ return false;
452
+ }
453
+ try {
454
+ audioElement.currentTime = 0;
455
+ } catch {}
456
+ currentTime.value = 0;
457
+ try {
458
+ await audioElement.play();
459
+ return session === loadSession;
460
+ } catch (error) {
461
+ if (isPlayInterruptedError(error) || session !== loadSession) return false;
462
+ const message = error instanceof Error ? error.message : "Audio playback failed.";
463
+ errorMessage.value = message;
464
+ onError?.(error);
465
+ return false;
466
+ }
467
+ };
468
+ const getRandomTrackIndex = (size, excludeIndex) => {
469
+ if (size <= 1) return excludeIndex;
470
+ let nextIndex = excludeIndex;
471
+ while (nextIndex === excludeIndex) nextIndex = Math.floor(Math.random() * size);
472
+ return nextIndex;
473
+ };
474
+ const moveTrack = async (direction, fromEnded = false) => {
475
+ if (playbackContext.value !== "playlist" || !currentPlaylist.value) return false;
476
+ const tracks = currentPlaylist.value.tracks;
477
+ if (!tracks.length || currentTrackIndex.value < 0) return false;
478
+ let nextIndex = currentTrackIndex.value;
479
+ if (playMode.value === "random") nextIndex = getRandomTrackIndex(tracks.length, currentTrackIndex.value);
480
+ else if (fromEnded && playMode.value === "single-loop") nextIndex = currentTrackIndex.value;
481
+ else if (direction === "prev") {
482
+ if (playMode.value === "list-loop") nextIndex = (currentTrackIndex.value - 1 + tracks.length) % tracks.length;
483
+ else nextIndex = currentTrackIndex.value - 1;
484
+ } else if (playMode.value === "list-loop") nextIndex = (currentTrackIndex.value + 1) % tracks.length;
485
+ else nextIndex = currentTrackIndex.value + 1;
486
+ if (nextIndex < 0 || nextIndex >= tracks.length) {
487
+ if (fromEnded) pause();
488
+ return false;
489
+ }
490
+ currentTrackId.value = tracks[nextIndex].id;
491
+ onUpdateActiveTrackId?.(currentTrackId.value);
492
+ return loadCurrentTrack({ autoplay: true });
493
+ };
494
+ const prev = async () => {
495
+ if (playbackContext.value === "playlist" && currentPlaylist.value && currentTime.value > 5) {
496
+ seek(0);
497
+ return true;
498
+ }
499
+ return moveTrack("prev");
500
+ };
501
+ const next = async () => {
502
+ return moveTrack("next");
503
+ };
504
+ const playTrack = async (trackIdOrIndex, playlistId) => {
505
+ const targetPlaylist = playlists.value.find((item) => item.id === String(playlistId != null ? playlistId : currentPlaylistId.value || "")) || currentPlaylist.value;
506
+ if (!targetPlaylist || !targetPlaylist.tracks.length) return false;
507
+ const targetTrack = typeof trackIdOrIndex === "number" ? targetPlaylist.tracks[trackIdOrIndex] : targetPlaylist.tracks.find((item) => item.id === String(trackIdOrIndex));
508
+ if (!targetTrack) return false;
509
+ playbackContext.value = "playlist";
510
+ directTrack.value = null;
511
+ currentPlaylistId.value = targetPlaylist.id;
512
+ currentTrackId.value = targetTrack.id;
513
+ onUpdateActivePlaylistId?.(targetPlaylist.id);
514
+ onUpdateActiveTrackId?.(targetTrack.id);
515
+ return loadCurrentTrack({
516
+ autoplay: true,
517
+ forceReload: true
518
+ });
519
+ };
520
+ const switchPlaylist = async (playlistId, switchOptions = {}) => {
521
+ const targetPlaylist = playlists.value.find((item) => item.id === String(playlistId)) || null;
522
+ if (!targetPlaylist) return false;
523
+ playbackContext.value = "playlist";
524
+ directTrack.value = null;
525
+ currentPlaylistId.value = targetPlaylist.id;
526
+ currentTrackId.value = switchOptions.trackId != null ? String(switchOptions.trackId) : targetPlaylist.tracks[0]?.id || null;
527
+ onUpdateActivePlaylistId?.(currentPlaylistId.value);
528
+ onUpdateActiveTrackId?.(currentTrackId.value);
529
+ emitPlaylistChange();
530
+ return loadCurrentTrack({ autoplay: switchOptions.autoplay });
531
+ };
532
+ const loadSource = async (source, loadOptions = {}) => {
533
+ playbackContext.value = "direct";
534
+ directTrack.value = normalizeTrack(source, "direct-track");
535
+ currentPlaylistId.value = null;
536
+ currentTrackId.value = directTrack.value.id;
537
+ onUpdateActivePlaylistId?.(null);
538
+ onUpdateActiveTrackId?.(directTrack.value.id);
539
+ return loadCurrentTrack({ autoplay: loadOptions.autoplay ?? getAutoplay() });
540
+ };
541
+ const clearSource = () => {
542
+ directTrack.value = null;
543
+ if (playbackContext.value === "direct") {
544
+ currentPlaylistId.value = null;
545
+ currentTrackId.value = null;
546
+ clearAudioSource();
547
+ onUpdateActivePlaylistId?.(null);
548
+ onUpdateActiveTrackId?.(null);
549
+ }
550
+ };
551
+ const createPlaylist = (name, tracks = []) => {
552
+ const playlist = normalizePlaylist({
553
+ id: createId("playlist"),
554
+ name,
555
+ tracks
556
+ }, playlists.value.length);
557
+ playlists.value = [...playlists.value, playlist];
558
+ if (!currentPlaylistId.value) currentPlaylistId.value = playlist.id;
559
+ emitPlaylistChange();
560
+ return playlist;
561
+ };
562
+ const renamePlaylist = (playlistId, name) => {
563
+ const target = playlists.value.find((item) => item.id === String(playlistId));
564
+ if (!target) return false;
565
+ target.name = name;
566
+ emitPlaylistChange();
567
+ return true;
568
+ };
569
+ const deletePlaylist = (playlistId) => {
570
+ const targetId = String(playlistId);
571
+ const nextPlaylists = playlists.value.filter((item) => item.id !== targetId);
572
+ if (nextPlaylists.length === playlists.value.length) return false;
573
+ const deletingCurrent = playbackContext.value === "playlist" && currentPlaylistId.value === targetId;
574
+ playlists.value = nextPlaylists;
575
+ syncSelection();
576
+ if (deletingCurrent && currentTrack.value) loadCurrentTrack({ autoplay: isPlaying.value });
577
+ emitPlaylistChange();
578
+ return true;
579
+ };
580
+ const addTracksToPlaylist = (playlistId, tracks) => {
581
+ const target = playlists.value.find((item) => item.id === String(playlistId));
582
+ if (!target || !tracks.length) return [];
583
+ const appendedTracks = tracks.map((track, index) => normalizeTrack(track, createId(`${target.id}-track-${target.tracks.length + index}`)));
584
+ target.tracks.push(...appendedTracks);
585
+ if (playbackContext.value === "playlist" && target.id === currentPlaylistId.value && !currentTrackId.value) currentTrackId.value = target.tracks[0]?.id || null;
586
+ emitPlaylistChange();
587
+ return appendedTracks;
588
+ };
589
+ const removeTracksFromPlaylist = (playlistId, trackIds) => {
590
+ const target = playlists.value.find((item) => item.id === String(playlistId));
591
+ if (!target || !trackIds.length) return false;
592
+ const removingIds = new Set(trackIds.map((item) => String(item)));
593
+ const existed = target.tracks.length;
594
+ target.tracks = target.tracks.filter((item) => !removingIds.has(item.id));
595
+ if (existed === target.tracks.length) return false;
596
+ if (playbackContext.value === "playlist" && target.id === currentPlaylistId.value && currentTrackId.value && removingIds.has(currentTrackId.value)) {
597
+ currentTrackId.value = target.tracks[0]?.id || null;
598
+ if (currentTrackId.value) loadCurrentTrack({ autoplay: isPlaying.value });
599
+ else clearAudioSource();
600
+ }
601
+ emitPlaylistChange();
602
+ return true;
603
+ };
604
+ const setPlaylists = (nextPlaylists) => {
605
+ playlists.value = nextPlaylists.map((item, index) => normalizePlaylist(item, index));
606
+ syncSelection();
607
+ if (playbackContext.value === "playlist" && currentTrack.value) loadCurrentTrack({ autoplay: isPlaying.value });
608
+ emitPlaylistChange();
609
+ };
610
+ const reset = () => {
611
+ pause();
612
+ seek(0);
613
+ isSeeking.value = false;
614
+ errorMessage.value = "";
615
+ };
616
+ if (audioElement) {
617
+ audioElement.addEventListener("play", () => {
618
+ isPlaying.value = true;
619
+ onPlay?.(currentTrack.value);
620
+ });
621
+ audioElement.addEventListener("pause", () => {
622
+ isPlaying.value = false;
623
+ onPause?.(currentTrack.value);
624
+ });
625
+ audioElement.addEventListener("waiting", () => {
626
+ isLoading.value = true;
627
+ });
628
+ audioElement.addEventListener("canplay", () => {
629
+ isLoading.value = false;
630
+ isReady.value = true;
631
+ });
632
+ audioElement.addEventListener("loadedmetadata", () => {
633
+ duration.value = Number.isFinite(audioElement.duration) ? audioElement.duration : currentTrack.value?.duration || 0;
634
+ isReady.value = true;
635
+ isLoading.value = false;
636
+ onLoaded?.(currentTrack.value);
637
+ });
638
+ audioElement.addEventListener("durationchange", () => {
639
+ duration.value = Number.isFinite(audioElement.duration) ? audioElement.duration : duration.value;
640
+ });
641
+ audioElement.addEventListener("timeupdate", () => {
642
+ currentTime.value = audioElement.currentTime || 0;
643
+ onTimeUpdate?.({
644
+ currentTime: currentTime.value,
645
+ duration: duration.value,
646
+ progressPercent: progressPercent.value,
647
+ track: currentTrack.value
648
+ });
649
+ });
650
+ audioElement.addEventListener("progress", () => {
651
+ if (!audioElement.buffered.length) return;
652
+ bufferedTime.value = audioElement.buffered.end(audioElement.buffered.length - 1);
653
+ });
654
+ audioElement.addEventListener("volumechange", () => {
655
+ isMuted.value = audioElement.muted;
656
+ volumePercent.value = Math.round(audioElement.volume * 100);
657
+ if (!audioElement.muted && volumePercent.value > 0) lastVolumeBeforeMute.value = volumePercent.value;
658
+ onVolumeChange?.({
659
+ muted: isMuted.value,
660
+ volumePercent: volumePercent.value
661
+ });
662
+ });
663
+ audioElement.addEventListener("ended", async () => {
664
+ onEnded?.(currentTrack.value);
665
+ await moveTrack("next", true);
666
+ });
667
+ audioElement.addEventListener("error", () => {
668
+ if (!hasMediaSource()) return;
669
+ const srcWhenError = audioElement.getAttribute("src");
670
+ const sessionWhenError = loadSession;
671
+ const mediaError = audioElement.error;
672
+ window.setTimeout(() => {
673
+ if (sessionWhenError !== loadSession) return;
674
+ if (!hasMediaSource()) return;
675
+ if (audioElement.getAttribute("src") !== srcWhenError) return;
676
+ if (audioElement.readyState >= HTMLMediaElement.HAVE_METADATA) return;
677
+ if (!audioElement.error) return;
678
+ if (audioElement.error.code === MediaError.MEDIA_ERR_ABORTED) return;
679
+ const code = audioElement.error.code;
680
+ const rawMessage = audioElement.error.message || mediaError?.message || "";
681
+ const isFormatError = code === MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED || /format error/i.test(rawMessage);
682
+ errorMessage.value = isFormatError ? "音频格式不支持或资源无效。" : rawMessage || "Audio load failed.";
683
+ isLoading.value = false;
684
+ onError?.(audioElement.error || new Error(errorMessage.value));
685
+ }, 80);
686
+ });
687
+ }
688
+ watch(() => getPlayMode(), (value) => {
689
+ if (PLAY_MODES.includes(value)) playMode.value = value;
690
+ });
691
+ watch(() => getPlaylists(), (value) => {
692
+ const prevTrackId = currentTrackId.value;
693
+ const prevSource = currentTrack.value ? currentTrack.value.src || currentTrack.value.url || "" : "";
694
+ const wasPlaying = isPlaying.value;
695
+ playlists.value = value.map((item, index) => normalizePlaylist(item, index));
696
+ syncSelection();
697
+ if (playbackContext.value !== "playlist" || !currentTrack.value) return;
698
+ const nextSource = currentTrack.value.src || currentTrack.value.url || "";
699
+ if (currentTrackId.value === prevTrackId && nextSource === prevSource) return;
700
+ loadCurrentTrack({ autoplay: wasPlaying });
701
+ }, { deep: true });
702
+ watch(() => getActivePlaylistId(), (value) => {
703
+ if (value == null) return;
704
+ const nextPlaylistId = String(value);
705
+ if (currentPlaylistId.value === nextPlaylistId) return;
706
+ playbackContext.value = "playlist";
707
+ directTrack.value = null;
708
+ currentPlaylistId.value = nextPlaylistId;
709
+ syncSelection();
710
+ if (currentTrack.value) {
711
+ onUpdateActiveTrackId?.(currentTrack.value.id);
712
+ loadCurrentTrack({ autoplay: false });
713
+ }
714
+ });
715
+ watch(() => getActiveTrackId(), (value) => {
716
+ if (value == null) return;
717
+ const nextTrackId = String(value);
718
+ if (currentTrackId.value === nextTrackId) return;
719
+ playbackContext.value = "playlist";
720
+ directTrack.value = null;
721
+ currentTrackId.value = nextTrackId;
722
+ if (currentTrack.value) loadCurrentTrack({ autoplay: false });
723
+ });
724
+ watch(() => getSource(), (value) => {
725
+ if (!value) return;
726
+ loadSource(value, { autoplay: getAutoplay() });
727
+ }, {
728
+ deep: true,
729
+ immediate: true
730
+ });
731
+ syncSelection();
732
+ onUnmounted(() => {
733
+ clearAudioSource();
734
+ });
735
+ return {
736
+ audioElement,
737
+ playlists,
738
+ currentPlaylist,
739
+ currentPlaylistId,
740
+ currentTrack,
741
+ currentTrackId,
742
+ currentTrackIndex,
743
+ playMode,
744
+ isPlaying,
745
+ isPaused,
746
+ isLoading,
747
+ isReady,
748
+ isMuted,
749
+ isSeeking,
750
+ hasTrack,
751
+ currentTime,
752
+ duration,
753
+ bufferedTime,
754
+ progressPercent,
755
+ displayProgressPercent,
756
+ bufferedPercent,
757
+ seekPreviewPercent,
758
+ volumePercent,
759
+ displayCurrentTime,
760
+ formattedCurrentTime,
761
+ formattedDuration,
762
+ formattedDisplayCurrentTime,
763
+ canPlayPrev,
764
+ canPlayNext,
765
+ errorMessage,
766
+ play,
767
+ pause,
768
+ togglePlay,
769
+ seek,
770
+ seekByPercent,
771
+ beginSeeking,
772
+ updateSeekingByPercent,
773
+ commitSeeking,
774
+ cancelSeeking,
775
+ getTimeByPercent,
776
+ setVolume,
777
+ setVolumeByPercent,
778
+ toggleMute,
779
+ setPlayMode,
780
+ prev,
781
+ next,
782
+ playTrack,
783
+ switchPlaylist,
784
+ loadSource,
785
+ clearSource,
786
+ createPlaylist,
787
+ renamePlaylist,
788
+ deletePlaylist,
789
+ addTracksToPlaylist,
790
+ removeTracksFromPlaylist,
791
+ setPlaylists,
792
+ reset,
793
+ formatTime: formatAudioTime
794
+ };
795
+ }
796
+ //#endregion
797
+ export { useAudioPlayer as default, formatAudioTime };
798
+
799
+ //# sourceMappingURL=useAudioPlayer.js.map