@jackuait/blok 0.17.0 → 0.19.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 (592) hide show
  1. package/dist/blok.cjs +1 -1
  2. package/dist/blok.iife.js +5 -5
  3. package/dist/blok.mjs +2 -2
  4. package/dist/blok.umd.js +4 -4
  5. package/dist/chunks/APEv2Parser-4KTzNuV0.cjs +1 -0
  6. package/dist/chunks/APEv2Parser-WvRvu4zL.mjs +187 -0
  7. package/dist/chunks/AbstractID3Parser-DM9acVTg.mjs +34 -0
  8. package/dist/chunks/AbstractID3Parser-o6LG6Iyj.cjs +1 -0
  9. package/dist/chunks/AiffParser-C_VaWeb5.mjs +109 -0
  10. package/dist/chunks/AiffParser-DVmZ6jG0.cjs +1 -0
  11. package/dist/chunks/AsfParser-CH5F_9Wp.mjs +419 -0
  12. package/dist/chunks/AsfParser-Dwm_MRPg.cjs +1 -0
  13. package/dist/chunks/BasicParser-BFTgNkp-.mjs +743 -0
  14. package/dist/chunks/BasicParser-CLAKKNEs.cjs +1 -0
  15. package/dist/chunks/DsdiffParser-BAdYwB7y.mjs +108 -0
  16. package/dist/chunks/DsdiffParser-DRFw1wX0.cjs +1 -0
  17. package/dist/chunks/DsfParser-DWMLfBH1.mjs +61 -0
  18. package/dist/chunks/DsfParser-DjS_tBuv.cjs +1 -0
  19. package/dist/chunks/FlacParser-BdKXrY7L.mjs +255 -0
  20. package/dist/chunks/FlacParser-CPQ0VqXv.cjs +1 -0
  21. package/dist/chunks/ID3v1Parser-CPjEHype.cjs +1 -0
  22. package/dist/chunks/ID3v1Parser-DoxlznrE.mjs +75 -0
  23. package/dist/chunks/ID3v2Parser-BIrxzjBm.mjs +518 -0
  24. package/dist/chunks/ID3v2Parser-CMd_Ayt7.cjs +1 -0
  25. package/dist/chunks/ID3v2Token-Cc901eYL.cjs +1 -0
  26. package/dist/chunks/ID3v2Token-D5v9lCfb.mjs +107 -0
  27. package/dist/chunks/MP4Parser-0KMJ-q2k.mjs +811 -0
  28. package/dist/chunks/MP4Parser-B8kU67Xi.cjs +1 -0
  29. package/dist/chunks/MatroskaParser-CzZTyUP-.cjs +1 -0
  30. package/dist/chunks/MatroskaParser-fxFuCddu.mjs +814 -0
  31. package/dist/chunks/MpegParser-DX5r4iE7.cjs +1 -0
  32. package/dist/chunks/MpegParser-R-6QiuhU.mjs +513 -0
  33. package/dist/chunks/MusepackParser-DFLoF47O.mjs +187 -0
  34. package/dist/chunks/MusepackParser-OgeWmD5G.cjs +1 -0
  35. package/dist/chunks/OggParser-C1qP2qC7.mjs +251 -0
  36. package/dist/chunks/OggParser-DjscM3J-.cjs +1 -0
  37. package/dist/chunks/Util-BL3wIJcu.cjs +1 -0
  38. package/dist/chunks/Util-DiBcLCh8.mjs +109 -0
  39. package/dist/chunks/WavPackParser-3J7J92gh.cjs +1 -0
  40. package/dist/chunks/WavPackParser-Ck8xXsNf.mjs +116 -0
  41. package/dist/chunks/WaveParser-CiNJ-5JL.cjs +1 -0
  42. package/dist/chunks/WaveParser-hxQlWijT.mjs +187 -0
  43. package/dist/chunks/{blok-BPd65xOj.cjs → blok-BosfCfPX.cjs} +4 -4
  44. package/dist/chunks/{blok-D4ApwnD7.mjs → blok-CXB-exXU.mjs} +99 -75
  45. package/dist/chunks/{constants-DObdf8NU.mjs → constants-BmCvHbkL.mjs} +2 -1
  46. package/dist/chunks/{constants-C3wBsvmH.cjs → constants-ChsAFZ8F.cjs} +1 -1
  47. package/dist/chunks/core-CqiEzfU3.mjs +292 -0
  48. package/dist/chunks/core-DdDpt2u7.mjs +3931 -0
  49. package/dist/chunks/core-YGVcFb_q.cjs +1 -0
  50. package/dist/chunks/core-uWDvHWK7.cjs +6 -0
  51. package/dist/chunks/{i18next-loader-CNLosgId.cjs → i18next-loader-BBPMegxc.cjs} +1 -1
  52. package/dist/chunks/{i18next-loader-BMhspWFn.mjs → i18next-loader-K-ir8UKk.mjs} +1 -1
  53. package/dist/chunks/{lightweight-i18n-Ck1HlVxq.mjs → lightweight-i18n-DJpMke7a.mjs} +27 -0
  54. package/dist/chunks/lightweight-i18n-LFW8S8u-.cjs +1 -0
  55. package/dist/chunks/{messages-1H2SY5H1.mjs → messages-3jkCmB_A.mjs} +28 -1
  56. package/dist/{messages-CSf1g9n_.mjs → chunks/messages-5339ApgH.mjs} +28 -1
  57. package/dist/{messages-BlInN8XP2.mjs → chunks/messages-7LWW3BVh.mjs} +28 -1
  58. package/dist/chunks/messages-9B1F-k48.cjs +1 -0
  59. package/dist/chunks/messages-Au1UpgkX.cjs +1 -0
  60. package/dist/chunks/messages-B-u5B7tY.cjs +1 -0
  61. package/dist/chunks/{messages-hhT3Vii-.mjs → messages-B01D7aHY.mjs} +28 -1
  62. package/dist/chunks/{messages-CbdaJSfC2.mjs → messages-B2iaIrIu.mjs} +28 -1
  63. package/dist/chunks/messages-B6794_2J.cjs +1 -0
  64. package/dist/chunks/{messages-B0o3rVBB.cjs → messages-B6dbtt1c.cjs} +1 -1
  65. package/dist/chunks/{messages-BlOVJtaj.cjs → messages-B6yMdb3B.cjs} +1 -1
  66. package/dist/chunks/{messages-D5CeQW1e2.cjs → messages-B7st3eF_.cjs} +1 -1
  67. package/dist/chunks/{messages-CEZ528TO2.cjs → messages-BHCepNsI.cjs} +1 -1
  68. package/dist/chunks/{messages-CrwZs1Gq.cjs → messages-BHdKd7pH.cjs} +1 -1
  69. package/dist/{messages-Dc1aAz5V.mjs → chunks/messages-BO-L5oN9.mjs} +28 -1
  70. package/dist/{messages-BhGHyHKC2.mjs → chunks/messages-BRTWvTAP.mjs} +28 -1
  71. package/dist/chunks/{messages-BMNmXaC8.mjs → messages-BUvlOqll.mjs} +28 -1
  72. package/dist/chunks/messages-BV22YIZ_.cjs +1 -0
  73. package/dist/chunks/messages-BXp_U3uS.cjs +1 -0
  74. package/dist/{messages-CLkbvdRh2.mjs → chunks/messages-BYCHzM7F.mjs} +28 -1
  75. package/dist/chunks/messages-B_cHWyWC.cjs +1 -0
  76. package/dist/{messages-B95smO_C.mjs → chunks/messages-B_d857cA.mjs} +28 -1
  77. package/dist/chunks/messages-BaVZgTrw.cjs +1 -0
  78. package/dist/chunks/{messages-BQUzqXIO.mjs → messages-Bb80Csl3.mjs} +28 -1
  79. package/dist/{messages-BH5AKf_i2.mjs → chunks/messages-BbZz_Anm.mjs} +28 -1
  80. package/dist/chunks/{messages-Dna-8bQq.mjs → messages-BdL8bmTL.mjs} +28 -1
  81. package/dist/chunks/{messages-CMFcaa9C.mjs → messages-BeS9EOEO.mjs} +28 -1
  82. package/dist/chunks/{messages-BQOx3XGd.cjs → messages-BjYhwRk7.cjs} +1 -1
  83. package/dist/chunks/{messages-79WWudxY.cjs → messages-BkgBVEiE.cjs} +1 -1
  84. package/dist/{messages-B5xy5hCa.mjs → chunks/messages-Bmq--WTx.mjs} +28 -1
  85. package/dist/{messages-BLslMhf-.mjs → chunks/messages-Bp0LdGKj.mjs} +28 -1
  86. package/dist/chunks/{messages-BaWaLwcn2.mjs → messages-BpMWMH9_.mjs} +28 -1
  87. package/dist/chunks/{messages-_ECIn1VC2.cjs → messages-BsTzdfZF.cjs} +1 -1
  88. package/dist/chunks/{messages-Dl6VC9Q9.cjs → messages-BveiGA2x.cjs} +1 -1
  89. package/dist/{messages-DFDw0nkI.mjs → chunks/messages-BwOUSDJR.mjs} +28 -1
  90. package/dist/chunks/messages-ByNR9m9W.cjs +1 -0
  91. package/dist/chunks/{messages-CrFIbrXr2.mjs → messages-Byn9-dhb2.mjs} +28 -1
  92. package/dist/chunks/{messages-B4BvJtlu.mjs → messages-C0swL9CY.mjs} +28 -1
  93. package/dist/chunks/{messages-3B44ZmLZ.cjs → messages-C2ptZOWh.cjs} +1 -1
  94. package/dist/chunks/{messages-CpcZgGYg.mjs → messages-C3rGCBi_.mjs} +28 -1
  95. package/dist/{messages-BvwVDbII.mjs → chunks/messages-C8_r3iTR2.mjs} +28 -1
  96. package/dist/{messages-STUXoPH72.mjs → chunks/messages-CATH_uz1.mjs} +28 -1
  97. package/dist/chunks/{messages-DeXUZcFn2.cjs → messages-CBbgEXuO.cjs} +1 -1
  98. package/dist/chunks/messages-CEySIig9.cjs +1 -0
  99. package/dist/chunks/messages-CGdCpNZ62.cjs +1 -0
  100. package/dist/chunks/{messages-Cgph4q9d.cjs → messages-CH9SBR-i.cjs} +1 -1
  101. package/dist/chunks/{messages-X90YfYzG2.mjs → messages-CI2W7P-j.mjs} +28 -1
  102. package/dist/{messages-Bumbqs6s.mjs → chunks/messages-CIBYzzFy.mjs} +28 -1
  103. package/dist/chunks/{messages-BE6rW2R-.cjs → messages-CJFSq8Fl.cjs} +1 -1
  104. package/dist/chunks/{messages-Dlc1DdZ22.cjs → messages-CM8uUnPx.cjs} +1 -1
  105. package/dist/chunks/{messages-cYjlWqco.cjs → messages-COx3hDcP.cjs} +1 -1
  106. package/dist/chunks/messages-CQT8TtiF.cjs +1 -0
  107. package/dist/chunks/{messages-Byntrl2c.mjs → messages-CRUb9o5k.mjs} +28 -1
  108. package/dist/chunks/messages-CT8djlV6.cjs +1 -0
  109. package/dist/chunks/{messages-k4Do3gkF.mjs → messages-CUPup5e3.mjs} +28 -1
  110. package/dist/chunks/{messages-BfWGa4V82.cjs → messages-CVrOxu3J.cjs} +1 -1
  111. package/dist/chunks/messages-CWFSMzug2.cjs +1 -0
  112. package/dist/{messages-DaKjx7Gh.mjs → chunks/messages-CX0tJpOb.mjs} +28 -1
  113. package/dist/chunks/{messages-BChCPw99.mjs → messages-CXk-iM-i.mjs} +28 -1
  114. package/dist/chunks/{messages-8uD5ctYP.cjs → messages-CZJZ-au3.cjs} +1 -1
  115. package/dist/chunks/messages-CZddldga.cjs +1 -0
  116. package/dist/chunks/{messages-0ZOxg81Y.mjs → messages-Ca9zIrBo.mjs} +28 -1
  117. package/dist/chunks/{messages-BFcq7wsx.mjs → messages-CbyVDo8y.mjs} +28 -1
  118. package/dist/chunks/{messages-C3fAHxfE2.cjs → messages-CcsM8Q7g.cjs} +1 -1
  119. package/dist/chunks/{messages-C_s-wv1r2.mjs → messages-CeIzWL_4.mjs} +28 -1
  120. package/dist/chunks/{messages-DBPkzBZO2.mjs → messages-CeLv1whu2.mjs} +28 -1
  121. package/dist/chunks/messages-Ciq5_PsP.cjs +1 -0
  122. package/dist/{messages-CRL2ecWR.mjs → chunks/messages-CjCn5IsF.mjs} +28 -1
  123. package/dist/chunks/messages-CjfEt9bg.cjs +1 -0
  124. package/dist/{messages-DKoeDmZV2.mjs → chunks/messages-Ck1-ddbo.mjs} +28 -1
  125. package/dist/chunks/{messages-C79Ef9MU.mjs → messages-CkosWGGH.mjs} +28 -1
  126. package/dist/chunks/{messages-oLqnmqJf2.mjs → messages-Cl_pM31G.mjs} +28 -1
  127. package/dist/chunks/messages-CmsAbu_A.cjs +1 -0
  128. package/dist/chunks/messages-CqRtDVFO.cjs +1 -0
  129. package/dist/chunks/{messages-CO4J7Nns.cjs → messages-CuMtymEs.cjs} +1 -1
  130. package/dist/{messages-B6J8l1aF.mjs → chunks/messages-Cvg_uTfy.mjs} +28 -1
  131. package/dist/chunks/messages-Cy-2_lIA.cjs +1 -0
  132. package/dist/{messages-DvIPbDsq.mjs → chunks/messages-D-QWtvWg.mjs} +28 -1
  133. package/dist/chunks/{messages-CV3U2Vsm.mjs → messages-D-p-omWy.mjs} +28 -1
  134. package/dist/{messages-bCZW7LiC.mjs → chunks/messages-D-s4_vnU.mjs} +28 -1
  135. package/dist/chunks/messages-D41fO84y.cjs +1 -0
  136. package/dist/chunks/{messages-FIgYAomz2.mjs → messages-D4u2PSQw.mjs} +28 -1
  137. package/dist/chunks/messages-D7H9JUDr.cjs +1 -0
  138. package/dist/chunks/{messages-CpZneXUI.cjs → messages-D7sU-NqL.cjs} +1 -1
  139. package/dist/chunks/{messages-BGoJHXUk2.cjs → messages-DCwrXfck.cjs} +1 -1
  140. package/dist/chunks/{messages-dp4NwDVM.mjs → messages-DDJkNbJy.mjs} +28 -1
  141. package/dist/{messages-Dy3mYP_n.mjs → chunks/messages-DDX6I6MX.mjs} +28 -1
  142. package/dist/chunks/messages-DEg5FAg1.cjs +1 -0
  143. package/dist/chunks/{messages-B_lkWkPQ.cjs → messages-DFHNw6PQ.cjs} +1 -1
  144. package/dist/chunks/{messages-DZwozMZD2.mjs → messages-DHv7knYB.mjs} +28 -1
  145. package/dist/chunks/{messages-YhmR1nl02.cjs → messages-DIFwztFo.cjs} +1 -1
  146. package/dist/chunks/{messages-BjFB8sow.cjs → messages-DIetNXTx.cjs} +1 -1
  147. package/dist/{messages-D_ql7LL-2.mjs → chunks/messages-DNtAzacv.mjs} +28 -1
  148. package/dist/chunks/messages-DOqJ6ogK.cjs +1 -0
  149. package/dist/chunks/messages-DQJcAz4s.cjs +1 -0
  150. package/dist/chunks/{messages-C93gDUHr.mjs → messages-DQfi2DoY.mjs} +28 -1
  151. package/dist/chunks/{messages-61uWTg1y.mjs → messages-DQr7bXMD.mjs} +28 -1
  152. package/dist/chunks/messages-DT-JnTnw.cjs +1 -0
  153. package/dist/chunks/{messages-CpbireNX.cjs → messages-DUWCkLYR.cjs} +1 -1
  154. package/dist/chunks/{messages-BXvKhyQH.cjs → messages-Da8yFc7l.cjs} +1 -1
  155. package/dist/{messages-ByntluqZ.mjs → chunks/messages-DgF8OkNr.mjs} +28 -1
  156. package/dist/chunks/{messages-DtTgOx9a.mjs → messages-DiODNXET.mjs} +28 -1
  157. package/dist/{messages-BBb_hXxm.mjs → chunks/messages-DjZoCJ00.mjs} +28 -1
  158. package/dist/chunks/messages-DjrfovG0.cjs +1 -0
  159. package/dist/chunks/messages-DmjccFHq.cjs +1 -0
  160. package/dist/chunks/{messages-sLVwrcar.cjs → messages-DpNmnBjK.cjs} +1 -1
  161. package/dist/chunks/messages-DtaPHADA.cjs +1 -0
  162. package/dist/chunks/{messages-BFGgLdIA2.mjs → messages-DuD4ut1b.mjs} +28 -1
  163. package/dist/chunks/{messages-DKJ5CX9h2.mjs → messages-DuHFGMCJ.mjs} +28 -1
  164. package/dist/{messages-B7E1zFAv.mjs → chunks/messages-Dwl878eS.mjs} +28 -1
  165. package/dist/chunks/{messages-5Rp1xyL4.cjs → messages-ETJ7tQ9O.cjs} +1 -1
  166. package/dist/chunks/messages-EsX3eikv.cjs +1 -0
  167. package/dist/chunks/{messages-BK32XCpH.mjs → messages-HJnG9r2l.mjs} +28 -1
  168. package/dist/chunks/{messages-DjU1jbKf.cjs → messages-Hfo6uCIC.cjs} +1 -1
  169. package/dist/chunks/{messages-Ywb6VdfO2.cjs → messages-IqNWRaNS.cjs} +1 -1
  170. package/dist/{messages-CQ6A0zI9.mjs → chunks/messages-MPe9FjYe.mjs} +28 -1
  171. package/dist/chunks/messages-NJAjMFXd.cjs +1 -0
  172. package/dist/{messages-BctWdAZP2.mjs → chunks/messages-QCaF3d92.mjs} +28 -1
  173. package/dist/chunks/messages-SozFksSf.cjs +1 -0
  174. package/dist/chunks/messages-UXS3zL9A2.cjs +1 -0
  175. package/dist/chunks/{messages-3iZ6jJ6e.cjs → messages-VeyvtTce.cjs} +1 -1
  176. package/dist/chunks/{messages--uPFKcl3.mjs → messages-Xh-c7d4C.mjs} +28 -1
  177. package/dist/chunks/{messages-l0nKmGOV.cjs → messages-Z4LYgfWc.cjs} +1 -1
  178. package/dist/{messages-CQnz6pXD2.mjs → chunks/messages-ZMG7qQ3D.mjs} +28 -1
  179. package/dist/chunks/{messages-R2RH1RLt.mjs → messages-cSBZ5qVe.mjs} +28 -1
  180. package/dist/chunks/{messages-DvxZjb5g2.cjs → messages-gh5G15J1.cjs} +1 -1
  181. package/dist/{messages-BqFRlEJE2.mjs → chunks/messages-jEbEE90_.mjs} +28 -1
  182. package/dist/{messages-CqtZ_gtb.mjs → chunks/messages-kqnzps-X.mjs} +28 -1
  183. package/dist/chunks/{messages-LW9Kd-vn.mjs → messages-m-A6ArIM.mjs} +28 -1
  184. package/dist/chunks/{messages-CEUDK26P2.mjs → messages-t26x8wxB.mjs} +28 -1
  185. package/dist/chunks/{messages-DKjhx7Y3.cjs → messages-tR0BdeVG.cjs} +1 -1
  186. package/dist/{messages-Vfl9lWod.mjs → chunks/messages-typO_i_k.mjs} +28 -1
  187. package/dist/{messages-Co2GV7rA2.mjs → chunks/messages-ypIHI9Fr.mjs} +28 -1
  188. package/dist/chunks/{messages-DR5DyRRY2.mjs → messages-zPUQsksJ.mjs} +28 -1
  189. package/dist/chunks/{tools-CM6aPuR4.mjs → tools-BdoYHyV0.mjs} +2625 -1873
  190. package/dist/chunks/tools-DmEzyrn3.cjs +208 -0
  191. package/dist/chunks/types-BNsalfLy.cjs +1 -0
  192. package/dist/chunks/types-gj36fzRQ.mjs +28 -0
  193. package/dist/full.cjs +1 -1
  194. package/dist/full.mjs +10 -10
  195. package/dist/locales.mjs +94 -67
  196. package/dist/{messages-aPBlKHzr.mjs → messages-4drvqPN8.mjs} +28 -1
  197. package/dist/{chunks/messages-BIQ2VT8X2.mjs → messages-8__-vX3U.mjs} +28 -1
  198. package/dist/{chunks/messages-C3B8l3Hy.mjs → messages-Ao2vCNAH2.mjs} +28 -1
  199. package/dist/{messages-B0Gc0lBw.mjs → messages-B13GEFFu.mjs} +28 -1
  200. package/dist/{messages-CxK_Vgra.mjs → messages-B2YnZIU2.mjs} +28 -1
  201. package/dist/{messages-AK_9q2yu.mjs → messages-BI5B9bxE.mjs} +28 -1
  202. package/dist/{chunks/messages-Db_L5RNl.mjs → messages-BIgvPd6I2.mjs} +28 -1
  203. package/dist/{chunks/messages-BwxzN2q3.mjs → messages-BKG0QHVl.mjs} +28 -1
  204. package/dist/{messages-un7M6YZC2.mjs → messages-BKGg4XYm2.mjs} +28 -1
  205. package/dist/{messages-DZlYqaxx.mjs → messages-BOWDzfkH.mjs} +28 -1
  206. package/dist/{chunks/messages-C56BTPcC.mjs → messages-BQaiScU1.mjs} +28 -1
  207. package/dist/{messages-B5THTOwb2.mjs → messages-BQhHthxq2.mjs} +28 -1
  208. package/dist/{messages-CCgDqF-e.mjs → messages-BRLWpOnP.mjs} +28 -1
  209. package/dist/{messages-C8QB980F2.mjs → messages-BarhGl2S2.mjs} +28 -1
  210. package/dist/{messages-BPsdJnwT.mjs → messages-BgPDPIkO.mjs} +28 -1
  211. package/dist/{messages-BTrok9K8.mjs → messages-BlvF3pot.mjs} +28 -1
  212. package/dist/{chunks/messages-ZPOc6IQC.mjs → messages-Bmu3rJwO.mjs} +28 -1
  213. package/dist/{chunks/messages-BQEh67Mi2.mjs → messages-BpwhHkFb2.mjs} +28 -1
  214. package/dist/{messages-DlxBkSUv.mjs → messages-BvutXmgt.mjs} +28 -1
  215. package/dist/{chunks/messages-D4UnR6e52.mjs → messages-BwCgJUdq.mjs} +28 -1
  216. package/dist/{chunks/messages-Ccng4hJ2.mjs → messages-C5IE9mXm.mjs} +28 -1
  217. package/dist/{messages-DLKTwtBI.mjs → messages-C6R0bzW5.mjs} +28 -1
  218. package/dist/{chunks/messages-9gvi5jul.mjs → messages-C9Kq8259.mjs} +28 -1
  219. package/dist/{messages-YPF71WjJ.mjs → messages-CAnOyxrm.mjs} +28 -1
  220. package/dist/{chunks/messages-D0_Mxuh62.mjs → messages-CDueJTe8.mjs} +28 -1
  221. package/dist/{chunks/messages-BNuGVAEy.mjs → messages-CEGqNXnP.mjs} +28 -1
  222. package/dist/{messages-CQotju8u2.mjs → messages-CF5MeYEt2.mjs} +28 -1
  223. package/dist/{messages-CCdDP2DE.mjs → messages-CGiVoFTi.mjs} +28 -1
  224. package/dist/{messages-DoahmNMI2.mjs → messages-CQzOV7VE2.mjs} +28 -1
  225. package/dist/{messages-D08TSj5Q.mjs → messages-CUFac9Qe.mjs} +28 -1
  226. package/dist/{messages-Bt5Sbl952.mjs → messages-CUcUO5bC2.mjs} +28 -1
  227. package/dist/{messages-DpbHfnge.mjs → messages-CcF4SO9W.mjs} +28 -1
  228. package/dist/{messages-B87GXoqt.mjs → messages-CeqpzGl9.mjs} +28 -1
  229. package/dist/{chunks/messages-DFA5OVrs2.mjs → messages-Cg6a88Bb2.mjs} +28 -1
  230. package/dist/{messages-CYuTyoK6.mjs → messages-Ch-SytN8.mjs} +28 -1
  231. package/dist/{messages-Bwese2OQ.mjs → messages-Cn3uvFq3.mjs} +28 -1
  232. package/dist/{messages-Da09byG42.mjs → messages-CqZgsrVP2.mjs} +28 -1
  233. package/dist/{messages-DrwEVbKk2.mjs → messages-CskLLTiG2.mjs} +28 -1
  234. package/dist/{chunks/messages-Bvge__AJ2.mjs → messages-CusWGsl42.mjs} +28 -1
  235. package/dist/{messages-C-ytN6Dz2.mjs → messages-Cvq2EFPT2.mjs} +28 -1
  236. package/dist/{messages-DQaDNQat2.mjs → messages-CwvHO8gp2.mjs} +28 -1
  237. package/dist/{chunks/messages-D3kC7iDa2.mjs → messages-D4dovFzY2.mjs} +28 -1
  238. package/dist/{chunks/messages-BKSDnjOs.mjs → messages-D9qgYMU82.mjs} +28 -1
  239. package/dist/{messages-BDJfFuXR.mjs → messages-DGAWjKQZ.mjs} +28 -1
  240. package/dist/{chunks/messages-Bgzyr5Lh.mjs → messages-DR2JBU-H.mjs} +28 -1
  241. package/dist/{messages-1ZSVxDYN2.mjs → messages-Da1woCgt2.mjs} +28 -1
  242. package/dist/{messages-B9h-mKVO2.mjs → messages-DbE-riR52.mjs} +28 -1
  243. package/dist/{chunks/messages-BGaAuDRS.mjs → messages-DcQNeoPB.mjs} +28 -1
  244. package/dist/{messages-C-8BMvSp2.mjs → messages-Dq_RdEny2.mjs} +28 -1
  245. package/dist/{messages-Bx5KWmyJ.mjs → messages-Grhv5SE_.mjs} +28 -1
  246. package/dist/{chunks/messages-BIHeeP7X2.mjs → messages-HVgCKIww2.mjs} +28 -1
  247. package/dist/{messages-kjO2WeG-2.mjs → messages-KyJQtOkh2.mjs} +28 -1
  248. package/dist/{chunks/messages-CqhQuuRo2.mjs → messages-L4sYfXpM.mjs} +28 -1
  249. package/dist/{chunks/messages-CHx6m_Bo.mjs → messages-P5B61L1J2.mjs} +28 -1
  250. package/dist/{messages-DrjZz7u9.mjs → messages-RXQKVFCJ.mjs} +28 -1
  251. package/dist/{chunks/messages-DWjHAdb3.mjs → messages-UJx6PvCL.mjs} +28 -1
  252. package/dist/{chunks/messages-DkqiXPS7.mjs → messages-VIQ8vjvS.mjs} +28 -1
  253. package/dist/{chunks/messages-CYOersvL.mjs → messages-bN4Zmk2m.mjs} +28 -1
  254. package/dist/{chunks/messages-BTKPcoLu.mjs → messages-fAEKzdUq.mjs} +28 -1
  255. package/dist/{chunks/messages-DYsO5SIA.mjs → messages-gTUy3xjb.mjs} +28 -1
  256. package/dist/{chunks/messages-BnW_Fwro.mjs → messages-hGop1gbF.mjs} +28 -1
  257. package/dist/{chunks/messages-yGQn67fw2.mjs → messages-jQsl7cga2.mjs} +28 -1
  258. package/dist/{chunks/messages-Duj8jpve2.mjs → messages-jsrzDVZy2.mjs} +28 -1
  259. package/dist/{chunks/messages-C6vijVZv2.mjs → messages-lnxRz5rM.mjs} +28 -1
  260. package/dist/{messages-CRhhyqEy2.mjs → messages-wmS6Z2m82.mjs} +28 -1
  261. package/dist/{chunks/messages-D1q601Wg.mjs → messages-yuNINyS1.mjs} +28 -1
  262. package/dist/{messages-Bn19MGza.mjs → messages-zOl6jpOa.mjs} +28 -1
  263. package/dist/react.cjs +1 -1
  264. package/dist/react.mjs +1 -1
  265. package/dist/tools.cjs +1 -1
  266. package/dist/tools.mjs +3 -3
  267. package/dist/vendor.LICENSE.txt +360 -1
  268. package/package.json +2 -1
  269. package/src/blok.ts +43 -1
  270. package/src/components/constants/data-attributes.ts +2 -0
  271. package/src/components/i18n/locales/am/messages.json +28 -1
  272. package/src/components/i18n/locales/ar/messages.json +28 -1
  273. package/src/components/i18n/locales/az/messages.json +28 -1
  274. package/src/components/i18n/locales/bg/messages.json +28 -1
  275. package/src/components/i18n/locales/bn/messages.json +28 -1
  276. package/src/components/i18n/locales/bs/messages.json +28 -1
  277. package/src/components/i18n/locales/cs/messages.json +28 -1
  278. package/src/components/i18n/locales/da/messages.json +28 -1
  279. package/src/components/i18n/locales/de/messages.json +28 -1
  280. package/src/components/i18n/locales/dv/messages.json +28 -1
  281. package/src/components/i18n/locales/el/messages.json +28 -1
  282. package/src/components/i18n/locales/en/messages.json +27 -0
  283. package/src/components/i18n/locales/es/messages.json +28 -1
  284. package/src/components/i18n/locales/et/messages.json +28 -1
  285. package/src/components/i18n/locales/fa/messages.json +28 -1
  286. package/src/components/i18n/locales/fi/messages.json +28 -1
  287. package/src/components/i18n/locales/fil/messages.json +28 -1
  288. package/src/components/i18n/locales/fr/messages.json +28 -1
  289. package/src/components/i18n/locales/gu/messages.json +28 -1
  290. package/src/components/i18n/locales/he/messages.json +28 -1
  291. package/src/components/i18n/locales/hi/messages.json +28 -1
  292. package/src/components/i18n/locales/hr/messages.json +28 -1
  293. package/src/components/i18n/locales/hu/messages.json +28 -1
  294. package/src/components/i18n/locales/hy/messages.json +28 -1
  295. package/src/components/i18n/locales/id/messages.json +28 -1
  296. package/src/components/i18n/locales/it/messages.json +28 -1
  297. package/src/components/i18n/locales/ja/messages.json +28 -1
  298. package/src/components/i18n/locales/ka/messages.json +28 -1
  299. package/src/components/i18n/locales/km/messages.json +28 -1
  300. package/src/components/i18n/locales/kn/messages.json +28 -1
  301. package/src/components/i18n/locales/ko/messages.json +28 -1
  302. package/src/components/i18n/locales/ku/messages.json +28 -1
  303. package/src/components/i18n/locales/lo/messages.json +28 -1
  304. package/src/components/i18n/locales/lt/messages.json +28 -1
  305. package/src/components/i18n/locales/lv/messages.json +28 -1
  306. package/src/components/i18n/locales/mk/messages.json +28 -1
  307. package/src/components/i18n/locales/ml/messages.json +28 -1
  308. package/src/components/i18n/locales/mn/messages.json +28 -1
  309. package/src/components/i18n/locales/mr/messages.json +28 -1
  310. package/src/components/i18n/locales/ms/messages.json +28 -1
  311. package/src/components/i18n/locales/my/messages.json +28 -1
  312. package/src/components/i18n/locales/ne/messages.json +28 -1
  313. package/src/components/i18n/locales/nl/messages.json +28 -1
  314. package/src/components/i18n/locales/no/messages.json +28 -1
  315. package/src/components/i18n/locales/pa/messages.json +28 -1
  316. package/src/components/i18n/locales/pl/messages.json +28 -1
  317. package/src/components/i18n/locales/ps/messages.json +28 -1
  318. package/src/components/i18n/locales/pt/messages.json +28 -1
  319. package/src/components/i18n/locales/ro/messages.json +28 -1
  320. package/src/components/i18n/locales/ru/messages.json +28 -1
  321. package/src/components/i18n/locales/sd/messages.json +28 -1
  322. package/src/components/i18n/locales/si/messages.json +28 -1
  323. package/src/components/i18n/locales/sk/messages.json +28 -1
  324. package/src/components/i18n/locales/sl/messages.json +28 -1
  325. package/src/components/i18n/locales/sq/messages.json +28 -1
  326. package/src/components/i18n/locales/sr/messages.json +28 -1
  327. package/src/components/i18n/locales/sv/messages.json +28 -1
  328. package/src/components/i18n/locales/sw/messages.json +28 -1
  329. package/src/components/i18n/locales/ta/messages.json +28 -1
  330. package/src/components/i18n/locales/te/messages.json +28 -1
  331. package/src/components/i18n/locales/th/messages.json +28 -1
  332. package/src/components/i18n/locales/tr/messages.json +28 -1
  333. package/src/components/i18n/locales/ug/messages.json +28 -1
  334. package/src/components/i18n/locales/uk/messages.json +28 -1
  335. package/src/components/i18n/locales/ur/messages.json +28 -1
  336. package/src/components/i18n/locales/vi/messages.json +28 -1
  337. package/src/components/i18n/locales/yi/messages.json +28 -1
  338. package/src/components/i18n/locales/zh/messages.json +28 -1
  339. package/src/components/modules/ui.ts +30 -0
  340. package/src/components/utils/media-empty-state.ts +3 -2
  341. package/src/components/utils/mime-match.ts +22 -0
  342. package/src/styles/audio.css +531 -0
  343. package/src/styles/main.css +12 -0
  344. package/src/tools/audio/constants.ts +21 -0
  345. package/src/tools/audio/controls.ts +416 -0
  346. package/src/tools/audio/empty-state.ts +45 -0
  347. package/src/tools/audio/i18n.ts +13 -0
  348. package/src/tools/audio/index.ts +482 -0
  349. package/src/tools/audio/liveliness.ts +136 -0
  350. package/src/tools/audio/metadata.ts +56 -0
  351. package/src/tools/audio/ui.ts +104 -0
  352. package/src/tools/audio/uploader.ts +76 -0
  353. package/src/tools/audio/waveform.ts +277 -0
  354. package/src/tools/file/constants.ts +2 -3
  355. package/src/tools/image/constants.ts +2 -7
  356. package/src/tools/image/uploader.ts +2 -1
  357. package/src/tools/index.ts +2 -0
  358. package/src/tools/video/constants.ts +2 -5
  359. package/src/tools/video/uploader.ts +2 -1
  360. package/types/api/index.d.ts +1 -0
  361. package/types/api/width.d.ts +31 -0
  362. package/types/data-attributes.d.ts +1 -0
  363. package/types/index.d.ts +5 -0
  364. package/types/tools/audio.d.ts +40 -0
  365. package/types/tools/image.d.ts +4 -1
  366. package/types/tools/video.d.ts +4 -1
  367. package/types/tools-entry.d.ts +9 -0
  368. package/dist/chunks/lightweight-i18n-ByswFbdt.cjs +0 -1
  369. package/dist/chunks/messages-1bAMgAsO.cjs +0 -1
  370. package/dist/chunks/messages-5Vbzn-DL2.cjs +0 -1
  371. package/dist/chunks/messages-6lqZ4lhc2.cjs +0 -1
  372. package/dist/chunks/messages-795D2ldP2.cjs +0 -1
  373. package/dist/chunks/messages-B1h0nDQW.cjs +0 -1
  374. package/dist/chunks/messages-B37vUkBi.cjs +0 -1
  375. package/dist/chunks/messages-BDs_gdD_.cjs +0 -1
  376. package/dist/chunks/messages-BXgTHDIw.cjs +0 -1
  377. package/dist/chunks/messages-BYW-U0iT.cjs +0 -1
  378. package/dist/chunks/messages-BeTQxvmX2.cjs +0 -1
  379. package/dist/chunks/messages-Bjmg_8lv2.cjs +0 -1
  380. package/dist/chunks/messages-Bpvja9xW2.cjs +0 -1
  381. package/dist/chunks/messages-BtMQ6v_L.cjs +0 -1
  382. package/dist/chunks/messages-BvChjyuU2.cjs +0 -1
  383. package/dist/chunks/messages-CAix8jdZ.cjs +0 -1
  384. package/dist/chunks/messages-CKiWXTe1.cjs +0 -1
  385. package/dist/chunks/messages-COTP4ZJ_2.cjs +0 -1
  386. package/dist/chunks/messages-Cp7wFDrY2.cjs +0 -1
  387. package/dist/chunks/messages-D8UH8jc6.cjs +0 -1
  388. package/dist/chunks/messages-DAmOTPVW2.cjs +0 -1
  389. package/dist/chunks/messages-DEduQerF.cjs +0 -1
  390. package/dist/chunks/messages-DHah-frn.cjs +0 -1
  391. package/dist/chunks/messages-DI1ZLPxM.cjs +0 -1
  392. package/dist/chunks/messages-Dgp7Wk4H.cjs +0 -1
  393. package/dist/chunks/messages-DhnCZQEY.cjs +0 -1
  394. package/dist/chunks/messages-Dz8AmvFq.cjs +0 -1
  395. package/dist/chunks/messages-DzarYc1J2.cjs +0 -1
  396. package/dist/chunks/messages-FM0KHIkQ2.cjs +0 -1
  397. package/dist/chunks/messages-JsmKjXPZ.cjs +0 -1
  398. package/dist/chunks/messages-RWVOHsZu.cjs +0 -1
  399. package/dist/chunks/messages-iwzDjgrP.cjs +0 -1
  400. package/dist/chunks/messages-l7DqwqOu2.cjs +0 -1
  401. package/dist/chunks/messages-zkunMjZf2.cjs +0 -1
  402. package/dist/chunks/tools-kfoXLTzY.cjs +0 -208
  403. /package/dist/chunks/{am-BA02TqF9.cjs → am-Dc8fykoi.cjs} +0 -0
  404. /package/dist/chunks/{am-C9_6r8HY.mjs → am-DyT_H_W5.mjs} +0 -0
  405. /package/dist/chunks/{ar-CB4IsGCa.cjs → ar-B4htcHv2.cjs} +0 -0
  406. /package/dist/chunks/{ar-BM96nSXF.mjs → ar-DxcVoX26.mjs} +0 -0
  407. /package/dist/chunks/{az-FykE_aDi.cjs → az-CddDVVCC.cjs} +0 -0
  408. /package/dist/chunks/{az-DnZSY5ok.mjs → az-Ck_jWtwp.mjs} +0 -0
  409. /package/dist/chunks/{bg-D6r90gqH.cjs → bg-BExJFlqx.cjs} +0 -0
  410. /package/dist/chunks/{bg-BplUvPeX.mjs → bg-C4_DlJ7m.mjs} +0 -0
  411. /package/dist/chunks/{bn-B7w2dbK4.cjs → bn-B3CWOlDr.cjs} +0 -0
  412. /package/dist/chunks/{bn-CdP9lnfr.mjs → bn-D0PWjX6h.mjs} +0 -0
  413. /package/dist/chunks/{bs-BtX-qLsk.mjs → bs-BjqCqh8B.mjs} +0 -0
  414. /package/dist/chunks/{bs-DztHHorM.cjs → bs-BylFYMjB.cjs} +0 -0
  415. /package/dist/chunks/{cs-CLMsCdIt.cjs → cs-BzXww59F.cjs} +0 -0
  416. /package/dist/chunks/{cs-NcDYS-aU.mjs → cs-R_vXAqRw.mjs} +0 -0
  417. /package/dist/chunks/{da-sJ7EsHcO.cjs → da-Be_YGjP-.cjs} +0 -0
  418. /package/dist/chunks/{da-ANg6gK3-.mjs → da-BuzQWEfl.mjs} +0 -0
  419. /package/dist/chunks/{de-CTxvRxuE.mjs → de-BuXrJCQB.mjs} +0 -0
  420. /package/dist/chunks/{de-CxMqLKhy.cjs → de-CuXVxRU3.cjs} +0 -0
  421. /package/dist/chunks/{el-Bg6QXLt5.cjs → el-CkLmGPX-.cjs} +0 -0
  422. /package/dist/chunks/{el-CgOoJaXB.mjs → el-d_XP5H44.mjs} +0 -0
  423. /package/dist/chunks/{es-7zUbslPJ.cjs → es-CpevBSzX.cjs} +0 -0
  424. /package/dist/chunks/{es-D5YDFRu-.mjs → es-D79FXk9q.mjs} +0 -0
  425. /package/dist/chunks/{et-57a7ees8.mjs → et-BmawyEOM.mjs} +0 -0
  426. /package/dist/chunks/{et-D_rhRdDD.cjs → et-Dm53D0Mw.cjs} +0 -0
  427. /package/dist/chunks/{fa-JBr2zsfI.cjs → fa-BLZQhg44.cjs} +0 -0
  428. /package/dist/chunks/{fa-Dp_BXnBP.mjs → fa-Cyzee-uD.mjs} +0 -0
  429. /package/dist/chunks/{fi-DjbYN6MA.cjs → fi-CktzJP0P.cjs} +0 -0
  430. /package/dist/chunks/{fi-at45xjOS.mjs → fi-zVk232gP.mjs} +0 -0
  431. /package/dist/chunks/{fil-dcVBIQoi.cjs → fil-BGEDSfA3.cjs} +0 -0
  432. /package/dist/chunks/{fil-D_HT2vGt.mjs → fil-DQcS9VcY.mjs} +0 -0
  433. /package/dist/chunks/{fr-ByR9PLTE.mjs → fr-CUoxzxMy.mjs} +0 -0
  434. /package/dist/chunks/{fr-Ch4zj1rM.cjs → fr-DRFIW1vC.cjs} +0 -0
  435. /package/dist/chunks/{gu-CvfPvH3Y.mjs → gu-BSL13JVA.mjs} +0 -0
  436. /package/dist/chunks/{gu-CoLW5Saq.cjs → gu-DCZgQPh1.cjs} +0 -0
  437. /package/dist/chunks/{he-Bmqypvkq.mjs → he-B4fsDXlD.mjs} +0 -0
  438. /package/dist/chunks/{he-2wS2DK0D.cjs → he-CrJki_kT.cjs} +0 -0
  439. /package/dist/chunks/{hi-f4gshON3.cjs → hi-B7MYHNXb.cjs} +0 -0
  440. /package/dist/chunks/{hi-DbcN0x64.mjs → hi-Df_jRvP-.mjs} +0 -0
  441. /package/dist/chunks/{hr-DMExeWwd.cjs → hr-CHeiPUjb.cjs} +0 -0
  442. /package/dist/chunks/{hr-D5mydeyn.mjs → hr-DC4ZNI8T.mjs} +0 -0
  443. /package/dist/chunks/{hu-DVCPn8un.mjs → hu-ClC3NxqC.mjs} +0 -0
  444. /package/dist/chunks/{hu-COmlHkse.cjs → hu-x4Ga7znM.cjs} +0 -0
  445. /package/dist/chunks/{hy-BoBSSiJc.cjs → hy-dXGxcAjA.cjs} +0 -0
  446. /package/dist/chunks/{hy-CP6oqcK_.mjs → hy-fpToCZeQ.mjs} +0 -0
  447. /package/dist/chunks/{id-Dk2AQ6-R.cjs → id-BETj6SOy.cjs} +0 -0
  448. /package/dist/chunks/{id-COwan-Bb.mjs → id-zXVZ_-tD.mjs} +0 -0
  449. /package/dist/chunks/{it-BCmU3zOg.cjs → it-CblE5NNx.cjs} +0 -0
  450. /package/dist/chunks/{it-DJqN-zLs.mjs → it-Cp7EdTdT.mjs} +0 -0
  451. /package/dist/chunks/{ja-DcMqJvnV.cjs → ja-D4CP2G3w.cjs} +0 -0
  452. /package/dist/chunks/{ja-CvoLNAXS.mjs → ja-DoaPxTyV.mjs} +0 -0
  453. /package/dist/chunks/{ka-BdyjQFkv.cjs → ka-C6DxbxxH.cjs} +0 -0
  454. /package/dist/chunks/{ka-BsqbDXqr.mjs → ka-CwoyhuWu.mjs} +0 -0
  455. /package/dist/chunks/{km-BShH0mB9.cjs → km-BdZJI-qn.cjs} +0 -0
  456. /package/dist/chunks/{km-C9FxSKv0.mjs → km-D8jrJ9sv.mjs} +0 -0
  457. /package/dist/chunks/{kn-bNx6e6NK.cjs → kn-DsGMDyW7.cjs} +0 -0
  458. /package/dist/chunks/{kn-BKTm-E-A.mjs → kn-IsuZc30u.mjs} +0 -0
  459. /package/dist/chunks/{ko-LmGjEODJ.cjs → ko-CFVvGmVE.cjs} +0 -0
  460. /package/dist/chunks/{ko-BLEDr4t_.mjs → ko-DxAtBe72.mjs} +0 -0
  461. /package/dist/chunks/{ku-BekLwcHQ.cjs → ku-B-43xPpS.cjs} +0 -0
  462. /package/dist/chunks/{ku-DGpIv9vX.mjs → ku-Da-1BcEg.mjs} +0 -0
  463. /package/dist/chunks/{lo-YgZPFD63.cjs → lo-DtVyNkq4.cjs} +0 -0
  464. /package/dist/chunks/{lo-C3wsS73b.mjs → lo-p9PUOxXA.mjs} +0 -0
  465. /package/dist/chunks/{lt-CIvBJk2h.cjs → lt-BaHJn9M4.cjs} +0 -0
  466. /package/dist/chunks/{lt-DWWjfR4Z.mjs → lt-C4lGuzQq.mjs} +0 -0
  467. /package/dist/chunks/{lv-D4nb-9oK.mjs → lv-B5Cp4JEf.mjs} +0 -0
  468. /package/dist/chunks/{lv-B6Djmvjl.cjs → lv-BHXmLxXV.cjs} +0 -0
  469. /package/dist/chunks/{mk-BPUvDORf.mjs → mk-B5rDdPUj.mjs} +0 -0
  470. /package/dist/chunks/{mk-Ck56Emvp.cjs → mk-BhwKijB_.cjs} +0 -0
  471. /package/dist/chunks/{ml-DsibsgSA.cjs → ml-DxZv3Mzc.cjs} +0 -0
  472. /package/dist/chunks/{ml-qo0n1JHs.mjs → ml-gamedfCk.mjs} +0 -0
  473. /package/dist/chunks/{mn-BAQnLAOv.mjs → mn-BbhhPusH.mjs} +0 -0
  474. /package/dist/chunks/{mn-Db0fVNYE.cjs → mn-Bzi4YTMA.cjs} +0 -0
  475. /package/dist/chunks/{mr-BTz5VL4u.cjs → mr-BENatxZg.cjs} +0 -0
  476. /package/dist/chunks/{mr-CFEPrQYy.mjs → mr-DO_kNyu7.mjs} +0 -0
  477. /package/dist/chunks/{ms-ItzWfmiu.cjs → ms-BVop2DJc.cjs} +0 -0
  478. /package/dist/chunks/{ms-C9p2_6EB.mjs → ms-eIjFVRpo.mjs} +0 -0
  479. /package/dist/chunks/{my-BQhcHK_d.mjs → my-nf0gvOOX.mjs} +0 -0
  480. /package/dist/chunks/{my-Bq1EPoFX.cjs → my-qLePPAWv.cjs} +0 -0
  481. /package/dist/chunks/{ne-Cf4GpHyI.mjs → ne-DOaubYly.mjs} +0 -0
  482. /package/dist/chunks/{ne-Mog3kAWt.cjs → ne-DfryA0M8.cjs} +0 -0
  483. /package/dist/chunks/{nl-Do9Y1u3F.cjs → nl-BehqWHBh.cjs} +0 -0
  484. /package/dist/chunks/{nl-7DE7AKK5.mjs → nl-VHkGK6MK.mjs} +0 -0
  485. /package/dist/chunks/{no-DNuo9wW6.cjs → no-CR9Fxz1X.cjs} +0 -0
  486. /package/dist/chunks/{no-J4jj2fW7.mjs → no-CdtSCHJr.mjs} +0 -0
  487. /package/dist/chunks/{notifier-BW5H3Ctc.cjs → notifier-CFYHvVe5.cjs} +0 -0
  488. /package/dist/chunks/{notifier-BDNwSr07.mjs → notifier-DJ3Shryh.mjs} +0 -0
  489. /package/dist/chunks/{pa-BVCDv2EV.cjs → pa-DgC4LF8q.cjs} +0 -0
  490. /package/dist/chunks/{pa-DMuUOUxa.mjs → pa-TMcUvGQV.mjs} +0 -0
  491. /package/dist/chunks/{pl-DIZm5XzV.mjs → pl-BfQYJ9y_.mjs} +0 -0
  492. /package/dist/chunks/{pl-Ct8v4d8V.cjs → pl-a2nheY_J.cjs} +0 -0
  493. /package/dist/chunks/{prism-bash-CZ6DBzIk.mjs → prism-bash-D4zr_u8t.mjs} +0 -0
  494. /package/dist/chunks/{prism-bash-qitAYJtY.cjs → prism-bash-DDQ2u01V.cjs} +0 -0
  495. /package/dist/chunks/{prism-c-nnJdAhPL.mjs → prism-c-CVyw1BOu.mjs} +0 -0
  496. /package/dist/chunks/{prism-c-BLyB6e2K.cjs → prism-c-DfVjTtJG.cjs} +0 -0
  497. /package/dist/chunks/{prism-cpp-DYNCFS3K.mjs → prism-cpp-CrBJjuu5.mjs} +0 -0
  498. /package/dist/chunks/{prism-cpp-OSmmdLuG.cjs → prism-cpp-DqxJDZfM.cjs} +0 -0
  499. /package/dist/chunks/{prism-csharp-16T9Ewqf.cjs → prism-csharp-BbJ6Sp-b.cjs} +0 -0
  500. /package/dist/chunks/{prism-csharp-Dxs2I4ua.mjs → prism-csharp-lrMxvYpL.mjs} +0 -0
  501. /package/dist/chunks/{prism-css-DwTbu-Ar.mjs → prism-css-VQTID_HR.mjs} +0 -0
  502. /package/dist/chunks/{prism-css-CMFNwvrI.cjs → prism-css-w2kan9uc.cjs} +0 -0
  503. /package/dist/chunks/{prism-dart-DX2YtTGt.cjs → prism-dart-B374T6OY.cjs} +0 -0
  504. /package/dist/chunks/{prism-dart-Cqhjl8Zt.mjs → prism-dart-Q-9Z_W9B.mjs} +0 -0
  505. /package/dist/chunks/{prism-docker-CF7dhvYh.mjs → prism-docker-DWAQ3dDD.mjs} +0 -0
  506. /package/dist/chunks/{prism-docker-CR4lKITl.cjs → prism-docker-DsFNc9i3.cjs} +0 -0
  507. /package/dist/chunks/{prism-go-DUV4QMTT.cjs → prism-go-C4e52XbO.cjs} +0 -0
  508. /package/dist/chunks/{prism-go-h9KLdAE9.mjs → prism-go-CrXe2RS9.mjs} +0 -0
  509. /package/dist/chunks/{prism-graphql-CaH0gD6e.mjs → prism-graphql-BG5mfdhd.mjs} +0 -0
  510. /package/dist/chunks/{prism-graphql-Cw4U0rOD.cjs → prism-graphql-DzWE15JS.cjs} +0 -0
  511. /package/dist/chunks/{prism-java-BpQ0ReAC.cjs → prism-java-Bth7ny8U.cjs} +0 -0
  512. /package/dist/chunks/{prism-java-DvKEtgSw.mjs → prism-java-_m72Vn1f.mjs} +0 -0
  513. /package/dist/chunks/{prism-javascript-D2ecWeeN.mjs → prism-javascript-B74it_3Q.mjs} +0 -0
  514. /package/dist/chunks/{prism-javascript-ELk9U7yv.cjs → prism-javascript-CZHuhUqG.cjs} +0 -0
  515. /package/dist/chunks/{prism-json-BdNUnMGb.cjs → prism-json-C7yjuPaa.cjs} +0 -0
  516. /package/dist/chunks/{prism-json-eqh92QZC.mjs → prism-json-CFsf0S_6.mjs} +0 -0
  517. /package/dist/chunks/{prism-kotlin-22Gr2SxK.mjs → prism-kotlin-BTT9anu1.mjs} +0 -0
  518. /package/dist/chunks/{prism-kotlin-WNUAhuoa.cjs → prism-kotlin-BwlhXHxp.cjs} +0 -0
  519. /package/dist/chunks/{prism-latex-DKge5vOJ.mjs → prism-latex-CL8zDJwm.mjs} +0 -0
  520. /package/dist/chunks/{prism-latex-BtyYjHKE.cjs → prism-latex-dRhujmiF.cjs} +0 -0
  521. /package/dist/chunks/{prism-lua-DhVb-IBs.cjs → prism-lua-CC8iHZy0.cjs} +0 -0
  522. /package/dist/chunks/{prism-lua-BySMQWvB.mjs → prism-lua-D6JJ7p-A.mjs} +0 -0
  523. /package/dist/chunks/{prism-markdown-Bvv1_ifb.mjs → prism-markdown-D6D8BprH.mjs} +0 -0
  524. /package/dist/chunks/{prism-markdown-DonI20ta.cjs → prism-markdown-DMW4QHo8.cjs} +0 -0
  525. /package/dist/chunks/{prism-markup-DaGlO8wQ.cjs → prism-markup-DmQlWhRx.cjs} +0 -0
  526. /package/dist/chunks/{prism-markup-DPDFrSBO.mjs → prism-markup-fK-1ADZ0.mjs} +0 -0
  527. /package/dist/chunks/{prism-markup-templating-DKZ_F63l.cjs → prism-markup-templating-CKDQaPgk.cjs} +0 -0
  528. /package/dist/chunks/{prism-markup-templating-B1u1wroF.mjs → prism-markup-templating-DfRjv0mn.mjs} +0 -0
  529. /package/dist/chunks/{prism-php-V_A4SMVC.cjs → prism-php-BJVLLh_W.cjs} +0 -0
  530. /package/dist/chunks/{prism-php-CjjweiQK.mjs → prism-php-DffX-wRi.mjs} +0 -0
  531. /package/dist/chunks/{prism-python-6eBEySe7.mjs → prism-python-2BrUkjbB.mjs} +0 -0
  532. /package/dist/chunks/{prism-python-DLqiSiAQ.cjs → prism-python-Bhf5rXub.cjs} +0 -0
  533. /package/dist/chunks/{prism-r-uOZv1a7d.mjs → prism-r-CU9se1Na.mjs} +0 -0
  534. /package/dist/chunks/{prism-r-zh9-I3-j.cjs → prism-r-ChFoLzAP.cjs} +0 -0
  535. /package/dist/chunks/{prism-ruby-M4mhoFF5.cjs → prism-ruby-BvGZJs6t.cjs} +0 -0
  536. /package/dist/chunks/{prism-ruby-Cr-3Y89S.mjs → prism-ruby-DuQ4syPd.mjs} +0 -0
  537. /package/dist/chunks/{prism-rust-g2dmV4wL.cjs → prism-rust-6eFXbDzh.cjs} +0 -0
  538. /package/dist/chunks/{prism-rust-DxlMe9N8.mjs → prism-rust-DRurCx4W.mjs} +0 -0
  539. /package/dist/chunks/{prism-scala-byYaK-Hs.mjs → prism-scala-CU8N2Vpe.mjs} +0 -0
  540. /package/dist/chunks/{prism-scala-DdSRpf_v.cjs → prism-scala-De4Tbjij.cjs} +0 -0
  541. /package/dist/chunks/{prism-sql-W4S9Ag3H.mjs → prism-sql-Au3VVcw1.mjs} +0 -0
  542. /package/dist/chunks/{prism-sql-BjDuRopl.cjs → prism-sql-_JMPMWu-.cjs} +0 -0
  543. /package/dist/chunks/{prism-swift-KjqbhTlS.mjs → prism-swift-B-r5qNUT.mjs} +0 -0
  544. /package/dist/chunks/{prism-swift-CqOmCgZp.cjs → prism-swift-DdWKYFH_.cjs} +0 -0
  545. /package/dist/chunks/{prism-typescript-CjqcJxVT.mjs → prism-typescript-BKj96rmj.mjs} +0 -0
  546. /package/dist/chunks/{prism-typescript-DGlZWX5K.cjs → prism-typescript-DYxN8s4t.cjs} +0 -0
  547. /package/dist/chunks/{prism-yaml-W11WcDBZ.mjs → prism-yaml-Bk31kvSd.mjs} +0 -0
  548. /package/dist/chunks/{prism-yaml-HqOYDhYZ.cjs → prism-yaml-CAlRa1Lr.cjs} +0 -0
  549. /package/dist/chunks/{ps-X3--6pS3.mjs → ps-Dv4lWz5A.mjs} +0 -0
  550. /package/dist/chunks/{ps-DT4DAHOy.cjs → ps-f5JFPQUh.cjs} +0 -0
  551. /package/dist/chunks/{pt-BMT2BIpj.mjs → pt-CtgGcY6X.mjs} +0 -0
  552. /package/dist/chunks/{pt-Dwe6Dinw.cjs → pt-I7qQ_R8a.cjs} +0 -0
  553. /package/dist/chunks/{ro-CoHEUo3b.cjs → ro-BNo9EVkV.cjs} +0 -0
  554. /package/dist/chunks/{ro-Ndh2J4Fv.mjs → ro-Dxs4TSRR.mjs} +0 -0
  555. /package/dist/chunks/{ru-DEoON4H0.mjs → ru-B5A2vGqQ.mjs} +0 -0
  556. /package/dist/chunks/{ru-Pmgo28Kt.cjs → ru-Q0YDL_7B.cjs} +0 -0
  557. /package/dist/chunks/{sd-DxSmw84d.cjs → sd-56aE3AgX.cjs} +0 -0
  558. /package/dist/chunks/{sd-B46KwBlt.mjs → sd-DcBvM0yY.mjs} +0 -0
  559. /package/dist/chunks/{si-attpuQg-.cjs → si-B1k5DPe9.cjs} +0 -0
  560. /package/dist/chunks/{si-CEX6-_X4.mjs → si-JTOFsZCj.mjs} +0 -0
  561. /package/dist/chunks/{sk-Crsvi9aQ.mjs → sk-B0LtwsAp.mjs} +0 -0
  562. /package/dist/chunks/{sk-CvkpO0ti.cjs → sk-DKWs0Fly.cjs} +0 -0
  563. /package/dist/chunks/{sl-BT19lhkA.cjs → sl-3aOunask.cjs} +0 -0
  564. /package/dist/chunks/{sl-Cqe1IKhE.mjs → sl-CE_B7j6P.mjs} +0 -0
  565. /package/dist/chunks/{sq-rY2-arjV.cjs → sq-BjtxgRqp.cjs} +0 -0
  566. /package/dist/chunks/{sq-BOQb1hx9.mjs → sq-DG9X-8jF.mjs} +0 -0
  567. /package/dist/chunks/{sr-jnkxoHkR.cjs → sr-DLHLW9qM.cjs} +0 -0
  568. /package/dist/chunks/{sr-WVqhi-MV.mjs → sr-LJKaTtNM.mjs} +0 -0
  569. /package/dist/chunks/{sv-cjssSK3x.mjs → sv-Cm3jSTt-.mjs} +0 -0
  570. /package/dist/chunks/{sv-BiWSYdw7.cjs → sv-DJ6Kywac.cjs} +0 -0
  571. /package/dist/chunks/{sw-DFyk62c4.cjs → sw-BnvydNkI.cjs} +0 -0
  572. /package/dist/chunks/{sw-BNNAgQNn.mjs → sw-C2rm3bwF.mjs} +0 -0
  573. /package/dist/chunks/{ta-jg4mBsL9.mjs → ta-5k36G0kU.mjs} +0 -0
  574. /package/dist/chunks/{ta-DowDx1bh.cjs → ta-e_T5Y_TH.cjs} +0 -0
  575. /package/dist/chunks/{te-G0buJU1V.cjs → te-DJd9mdke.cjs} +0 -0
  576. /package/dist/chunks/{te-BiLupA2T.mjs → te-Qw6ZgfXC.mjs} +0 -0
  577. /package/dist/chunks/{th-DsjA6OWh.cjs → th-BFvK-kez.cjs} +0 -0
  578. /package/dist/chunks/{th-Dtb_u833.mjs → th-DFCnkeU5.mjs} +0 -0
  579. /package/dist/chunks/{tr-DN1xdxQn.cjs → tr-Bio2iyuW.cjs} +0 -0
  580. /package/dist/chunks/{tr-01MbT9-l.mjs → tr-QoYDqZZE.mjs} +0 -0
  581. /package/dist/chunks/{ug-BFlA2VRZ.mjs → ug-CYVvHjDo.mjs} +0 -0
  582. /package/dist/chunks/{ug-DEJ9cNGH.cjs → ug-_E9uEBC5.cjs} +0 -0
  583. /package/dist/chunks/{uk-Bv6aB1Nd.cjs → uk-CiihPsrk.cjs} +0 -0
  584. /package/dist/chunks/{uk-DY7rBPyo.mjs → uk-KrD9Hdx7.mjs} +0 -0
  585. /package/dist/chunks/{ur-C3CFfx9s.cjs → ur-B9A13pT4.cjs} +0 -0
  586. /package/dist/chunks/{ur-DHfULZeF.mjs → ur-Bgtl4YGa.mjs} +0 -0
  587. /package/dist/chunks/{vi-BFuaq2Tk.mjs → vi-CwW9u4Ww.mjs} +0 -0
  588. /package/dist/chunks/{vi-DQrrRkmq.cjs → vi-l243K5Tb.cjs} +0 -0
  589. /package/dist/chunks/{webm-muxer-CC98PYSV.cjs → webm-muxer-BEeYNPIp.cjs} +0 -0
  590. /package/dist/chunks/{webm-muxer-CUUz719e.mjs → webm-muxer-Doy8JtlV.mjs} +0 -0
  591. /package/dist/chunks/{zh-BGpl7x7W.mjs → zh-BdCF4Hao.mjs} +0 -0
  592. /package/dist/chunks/{zh-5rdSdLkR.cjs → zh-DPZR_81P.cjs} +0 -0
@@ -0,0 +1,482 @@
1
+ import type {
2
+ API,
3
+ BlockAPI,
4
+ BlockTool,
5
+ BlockToolConstructorOptions,
6
+ FilePasteEvent,
7
+ PasteConfig,
8
+ PasteEvent,
9
+ PatternPasteEvent,
10
+ ToolboxConfig,
11
+ } from '../../../types';
12
+ import type { MenuConfig } from '../../../types/tools/menu-config';
13
+ import type { AudioAlignment, AudioConfig, AudioData } from '../../../types/tools/audio';
14
+ import {
15
+ IconAlignCenter,
16
+ IconAlignLeft,
17
+ IconAlignRight,
18
+ IconCaption,
19
+ IconCopy,
20
+ IconDownload,
21
+ IconMusic,
22
+ IconPlayerLoop,
23
+ IconReplace,
24
+ } from '../../components/icons';
25
+ import { renderUploadingState, type UploadingStateElement } from '../image/uploading-state';
26
+ import { DEFAULT_CAPTION_PLACEHOLDER, URL_PATTERN } from './constants';
27
+ import { renderEmptyState, type EmptyStateElement } from './empty-state';
28
+ import { tr } from './i18n';
29
+ import { renderCaptionRow, renderNowPlaying } from './ui';
30
+ import { attachControls, type ControlsHandle } from './controls';
31
+ import { attachWaveform, decodePeaks, type WaveformHandle } from './waveform';
32
+ import { readTrackMetadata, resolveCover } from './metadata';
33
+ import { Uploader, AudioUploadError, type UploadResult } from './uploader';
34
+ import { uploadErrorMessage } from '../../components/utils/upload-error-message';
35
+ import { pickDisplayMaxSize } from '../../components/utils/max-size';
36
+
37
+ type ToolState = 'EMPTY' | 'LOADING' | 'RENDERED' | 'ERROR';
38
+
39
+ export class AudioTool implements BlockTool {
40
+ private readonly api: API;
41
+ private readonly block: BlockAPI;
42
+ private readonly config: AudioConfig;
43
+ private readonly uploader: Uploader;
44
+ private data: AudioData;
45
+ private readOnly: boolean;
46
+ private root: HTMLElement | null = null;
47
+ private state: ToolState;
48
+ private uploadingEl: UploadingStateElement | null = null;
49
+ private lastFileName: string | null = null;
50
+ private errorMessage: string | null = null;
51
+ private lastSource: { kind: 'file'; file: File } | { kind: 'url'; url: string } | null = null;
52
+ private controlsHandle: ControlsHandle | null = null;
53
+ private waveformHandle: WaveformHandle | null = null;
54
+ private destroyed = false;
55
+
56
+ constructor(options: BlockToolConstructorOptions<AudioData, AudioConfig>) {
57
+ this.api = options.api;
58
+ this.block = options.block;
59
+ this.config = options.config ?? {};
60
+ this.readOnly = options.readOnly;
61
+ this.data = { ...options.data, url: options.data?.url ?? '' };
62
+ this.state = this.data.url ? 'RENDERED' : 'EMPTY';
63
+ this.uploader = new Uploader(this.config);
64
+ }
65
+
66
+ public render(): HTMLElement {
67
+ const root = document.createElement('div');
68
+ root.setAttribute('data-blok-tool', 'audio');
69
+ this.root = root;
70
+ this.renderState();
71
+ return root;
72
+ }
73
+
74
+ public save(_block?: HTMLElement): AudioData {
75
+ const out: AudioData = { url: this.data.url };
76
+ if (this.data.caption !== undefined) out.caption = this.data.caption;
77
+ if (this.data.captionVisible !== undefined) out.captionVisible = this.data.captionVisible;
78
+ if (this.data.title !== undefined) out.title = this.data.title;
79
+ if (this.data.artist !== undefined) out.artist = this.data.artist;
80
+ if (this.data.coverUrl !== undefined) out.coverUrl = this.data.coverUrl;
81
+ if (this.data.loop) out.loop = true;
82
+ if (this.data.width !== undefined) out.width = this.data.width;
83
+ if (this.data.alignment !== undefined) out.alignment = this.data.alignment;
84
+ if (this.data.fileName !== undefined) out.fileName = this.data.fileName;
85
+ if (this.data.mimeType !== undefined) out.mimeType = this.data.mimeType;
86
+ if (this.data.duration !== undefined) out.duration = this.data.duration;
87
+ if (this.data.peaks !== undefined) out.peaks = this.data.peaks;
88
+ return out;
89
+ }
90
+
91
+ public validate(data: AudioData): boolean {
92
+ return typeof data.url === 'string' && data.url.length > 0;
93
+ }
94
+
95
+ public static get toolbox(): ToolboxConfig {
96
+ return {
97
+ icon: IconMusic,
98
+ titleKey: 'audio',
99
+ searchTerms: ['audio', 'music', 'sound', 'song', 'mp3', 'track', 'media'],
100
+ };
101
+ }
102
+
103
+ public static get isReadOnlySupported(): boolean {
104
+ return true;
105
+ }
106
+
107
+ public static get pasteConfig(): PasteConfig {
108
+ return {
109
+ patterns: { audio: URL_PATTERN },
110
+ files: { mimeTypes: ['audio/*'] },
111
+ };
112
+ }
113
+
114
+ public onPaste(event: PasteEvent): void {
115
+ if (event.type === 'pattern') {
116
+ this.applyResult({ url: (event as PatternPasteEvent).detail.data });
117
+ return;
118
+ }
119
+ if (event.type === 'file') {
120
+ this.startUpload((event as FilePasteEvent).detail.file);
121
+ }
122
+ }
123
+
124
+ public getToolbarAnchorElement(): HTMLElement | undefined {
125
+ return this.root?.querySelector<HTMLElement>('[data-role="audio-figure"]') ?? undefined;
126
+ }
127
+
128
+ public setReadOnly(state: boolean): void {
129
+ this.readOnly = state;
130
+ this.renderState();
131
+ }
132
+
133
+ public renderSettings(): MenuConfig {
134
+ const i18n = this.api.i18n;
135
+ const current: AudioAlignment = this.data.alignment ?? 'center';
136
+ const captionVisible = this.data.captionVisible !== false;
137
+ const alignments: { value: AudioAlignment; title: string; icon: string }[] = [
138
+ { value: 'left', title: tr(i18n, 'tools.audio.alignmentLeft', 'Align left'), icon: IconAlignLeft },
139
+ { value: 'center', title: tr(i18n, 'tools.audio.alignmentCenter', 'Align center'), icon: IconAlignCenter },
140
+ { value: 'right', title: tr(i18n, 'tools.audio.alignmentRight', 'Align right'), icon: IconAlignRight },
141
+ ];
142
+ const alignIcon = alignments.find((a) => a.value === current)?.icon ?? alignments[1].icon;
143
+
144
+ return [
145
+ {
146
+ icon: alignIcon,
147
+ title: tr(i18n, 'tools.audio.alignment', 'Alignment'),
148
+ name: 'audio-alignment',
149
+ children: {
150
+ items: alignments.map((a) => ({
151
+ icon: a.icon,
152
+ title: a.title,
153
+ name: `audio-alignment-${a.value}`,
154
+ isActive: current === a.value,
155
+ closeOnActivate: true,
156
+ onActivate: (): void => this.setAlignment(a.value),
157
+ })),
158
+ },
159
+ },
160
+ {
161
+ icon: IconCaption,
162
+ title: tr(i18n, 'tools.audio.caption', 'Caption'),
163
+ name: 'audio-caption',
164
+ isActive: captionVisible,
165
+ closeOnActivate: true,
166
+ onActivate: (): void => this.toggleCaption(),
167
+ },
168
+ {
169
+ icon: IconPlayerLoop,
170
+ title: tr(i18n, 'tools.audio.loop', 'Loop'),
171
+ name: 'audio-loop',
172
+ isActive: this.data.loop === true,
173
+ closeOnActivate: true,
174
+ onActivate: (): void => this.toggleLoop(),
175
+ },
176
+ {
177
+ icon: IconReplace,
178
+ title: tr(i18n, 'tools.audio.replace', 'Replace audio'),
179
+ name: 'audio-replace',
180
+ closeOnActivate: true,
181
+ onActivate: (): void => this.transitionToEmpty(),
182
+ },
183
+ {
184
+ icon: IconDownload,
185
+ title: tr(i18n, 'tools.audio.download', 'Download'),
186
+ name: 'audio-download',
187
+ closeOnActivate: true,
188
+ onActivate: (): void => this.download(),
189
+ },
190
+ {
191
+ icon: IconCopy,
192
+ title: tr(i18n, 'tools.audio.copyUrl', 'Copy URL'),
193
+ name: 'audio-copy-url',
194
+ closeOnActivate: true,
195
+ onActivate: (): void => this.copyUrl(),
196
+ },
197
+ ];
198
+ }
199
+
200
+ public removed(): void {
201
+ this.destroyed = true;
202
+ this.controlsHandle?.destroy();
203
+ this.controlsHandle = null;
204
+ this.waveformHandle?.destroy();
205
+ this.waveformHandle = null;
206
+ if (this.data.url.startsWith('blob:')) {
207
+ URL.revokeObjectURL(this.data.url);
208
+ }
209
+ }
210
+
211
+ private startUpload(file: File): void {
212
+ this.lastFileName = file.name;
213
+ this.lastSource = { kind: 'file', file };
214
+ this.state = 'LOADING';
215
+ this.renderState();
216
+ void this.uploader
217
+ .handleFile(file, { onProgress: (p) => this.uploadingEl?.setProgress(p) })
218
+ .then((result) => this.applyResult(result, file))
219
+ .catch((err) => this.applyError(err));
220
+ }
221
+
222
+ private startUrl(url: string): void {
223
+ this.lastFileName = null;
224
+ this.lastSource = { kind: 'url', url };
225
+ this.state = 'LOADING';
226
+ this.renderState();
227
+ void this.uploader
228
+ .handleUrl(url, { onProgress: (p) => this.uploadingEl?.setProgress(p) })
229
+ .then((result) => this.applyResult(result))
230
+ .catch((err) => this.applyError(err));
231
+ }
232
+
233
+ private applyResult(result: UploadResult, file?: File): void {
234
+ this.data = {
235
+ ...this.data,
236
+ url: result.url,
237
+ fileName: result.fileName ?? this.lastFileName ?? this.data.fileName,
238
+ mimeType: file?.type || this.data.mimeType,
239
+ };
240
+ this.errorMessage = null;
241
+ this.state = 'RENDERED';
242
+ this.renderState();
243
+ this.block.dispatchChange();
244
+
245
+ // Asynchronous enrichment from a real File upload (not URL paste).
246
+ if (file) {
247
+ // Metadata: title, artist, cover
248
+ void readTrackMetadata(file)
249
+ .then(async (meta) => {
250
+ if (this.destroyed) return;
251
+ const dirty = { value: false };
252
+ if (meta.title) { this.data.title = meta.title; dirty.value = true; }
253
+ if (meta.artist) { this.data.artist = meta.artist; dirty.value = true; }
254
+ if (meta.cover) {
255
+ const coverUrl = await resolveCover(meta.cover, this.config.uploader).catch(() => undefined);
256
+ if (coverUrl) { this.data.coverUrl = coverUrl; dirty.value = true; }
257
+ }
258
+ if (this.destroyed) return;
259
+ if (dirty.value) {
260
+ this.renderState();
261
+ this.block.dispatchChange();
262
+ }
263
+ })
264
+ .catch(() => { /* leave player working without metadata */ });
265
+
266
+ // Waveform peaks + duration
267
+ void decodePeaks(file)
268
+ .then((decoded) => {
269
+ if (this.destroyed) return;
270
+ if (decoded && decoded.peaks.length) {
271
+ this.data.peaks = decoded.peaks;
272
+ this.data.duration = decoded.duration;
273
+ this.renderState();
274
+ this.block.dispatchChange();
275
+ }
276
+ })
277
+ .catch(() => { /* leave player working without waveform */ });
278
+ }
279
+ }
280
+
281
+ private applyError(err?: unknown): void {
282
+ this.errorMessage = err instanceof AudioUploadError
283
+ ? uploadErrorMessage(err, (key) => this.api.i18n.t(key), {
284
+ tooLarge: 'tools.audio.errorFileTooLarge',
285
+ generic: 'tools.audio.errorUploadFailed',
286
+ })
287
+ : null;
288
+ this.state = 'ERROR';
289
+ this.renderState();
290
+ }
291
+
292
+ private syncRootAttributes(): void {
293
+ if (!this.root) return;
294
+ const r = this.root;
295
+ r.setAttribute('data-state', this.state.toLowerCase());
296
+ r.setAttribute('data-align', this.data.alignment ?? 'center');
297
+ r.setAttribute('data-caption', this.data.captionVisible === false ? 'off' : 'on');
298
+ }
299
+
300
+ private renderState(): void {
301
+ if (!this.root) return;
302
+ this.controlsHandle?.destroy();
303
+ this.controlsHandle = null;
304
+ this.waveformHandle?.destroy();
305
+ this.waveformHandle = null;
306
+ this.root.replaceChildren();
307
+ this.uploadingEl = null;
308
+ this.syncRootAttributes();
309
+
310
+ if (this.state === 'EMPTY') {
311
+ this.renderEmpty();
312
+ return;
313
+ }
314
+ if (this.state === 'LOADING') {
315
+ this.renderLoading();
316
+ return;
317
+ }
318
+ if (this.state === 'ERROR') {
319
+ this.renderError();
320
+ return;
321
+ }
322
+ this.renderRendered();
323
+ }
324
+
325
+ private renderEmpty(): void {
326
+ if (!this.root) return;
327
+ const el: EmptyStateElement = renderEmptyState({
328
+ onFile: (file) => this.startUpload(file),
329
+ onUrl: (url) => this.startUrl(url),
330
+ acceptTypes: this.config.types,
331
+ maxSize: pickDisplayMaxSize(this.config.maxSize),
332
+ i18n: this.api.i18n,
333
+ });
334
+ this.root.appendChild(el);
335
+ }
336
+
337
+ private renderLoading(): void {
338
+ if (!this.root) return;
339
+ this.uploadingEl = renderUploadingState({
340
+ fileName: this.lastFileName ?? tr(this.api.i18n, 'tools.audio.uploading', 'Uploading…'),
341
+ onCancel: () => this.transitionToEmpty(),
342
+ i18n: this.api.i18n,
343
+ });
344
+ this.root.appendChild(this.uploadingEl);
345
+ }
346
+
347
+ private renderError(): void {
348
+ if (!this.root) return;
349
+ const wrap = document.createElement('div');
350
+ wrap.className = 'blok-audio-error-state';
351
+ wrap.setAttribute('data-role', 'audio-error');
352
+
353
+ const message = document.createElement('span');
354
+ message.textContent = this.errorMessage ?? tr(this.api.i18n, 'tools.audio.errorUploadFailed', 'Upload failed');
355
+
356
+ const retry = document.createElement('button');
357
+ retry.type = 'button';
358
+ retry.className = 'blok-audio-retry';
359
+ retry.setAttribute('data-action', 'replace');
360
+ retry.textContent = tr(this.api.i18n, 'tools.audio.errorReplace', 'Replace');
361
+ retry.addEventListener('click', () => this.transitionToEmpty());
362
+
363
+ wrap.append(message, retry);
364
+ this.root.appendChild(wrap);
365
+ }
366
+
367
+ private renderRendered(): void {
368
+ if (!this.root) return;
369
+ const titlePlaceholder = tr(this.api.i18n, 'tools.audio.titlePlaceholder', 'Track title');
370
+ const artistPlaceholder = tr(this.api.i18n, 'tools.audio.artistPlaceholder', 'Artist');
371
+
372
+ const { figure, audio, waveformMount, title, artist, body } = renderNowPlaying(this.data, {
373
+ editable: !this.readOnly,
374
+ titlePlaceholder,
375
+ artistPlaceholder,
376
+ });
377
+
378
+ // Waveform (if peaks are available)
379
+ if (this.data.peaks?.length) {
380
+ this.waveformHandle = attachWaveform({ mount: waveformMount, media: audio, peaks: this.data.peaks });
381
+ }
382
+
383
+ // Transport controls — appended into the right-column body (under waveform)
384
+ this.controlsHandle = attachControls({
385
+ media: audio,
386
+ figure,
387
+ data: this.data,
388
+ onLoopChange: (loop) => {
389
+ this.data.loop = loop || undefined;
390
+ this.block.dispatchChange();
391
+ },
392
+ });
393
+ body.appendChild(this.controlsHandle.element);
394
+
395
+ // Caption row — outside body, below the card
396
+ const placeholder = this.config.captionPlaceholder ?? DEFAULT_CAPTION_PLACEHOLDER;
397
+ const captionVisible = this.data.captionVisible !== false;
398
+ if (captionVisible || !this.readOnly) {
399
+ figure.appendChild(renderCaptionRow({
400
+ value: this.data.caption ?? '',
401
+ placeholder,
402
+ editable: !this.readOnly,
403
+ }));
404
+ }
405
+
406
+ // Wire title/artist blur handlers
407
+ title.addEventListener('blur', () => {
408
+ const next = title.textContent ?? '';
409
+ if (next !== this.data.title) {
410
+ this.data.title = next || undefined;
411
+ this.block.dispatchChange();
412
+ }
413
+ });
414
+ artist.addEventListener('blur', () => {
415
+ const next = artist.textContent ?? '';
416
+ if (next !== this.data.artist) {
417
+ this.data.artist = next || undefined;
418
+ this.block.dispatchChange();
419
+ }
420
+ });
421
+
422
+ // Wire caption blur handler
423
+ const captionEl = figure.querySelector<HTMLElement>('[data-role="audio-caption"]');
424
+ if (captionEl) {
425
+ captionEl.addEventListener('blur', () => {
426
+ const next = captionEl.textContent ?? '';
427
+ if (next !== this.data.caption) {
428
+ this.data.caption = next || undefined;
429
+ this.block.dispatchChange();
430
+ }
431
+ });
432
+ }
433
+
434
+ this.root.appendChild(figure);
435
+ }
436
+
437
+ private setAlignment(next: AudioAlignment): void {
438
+ if (this.data.alignment === next) return;
439
+ this.data.alignment = next;
440
+ this.block.dispatchChange();
441
+ this.renderState();
442
+ }
443
+
444
+ private toggleCaption(): void {
445
+ this.data.captionVisible = this.data.captionVisible === false;
446
+ this.block.dispatchChange();
447
+ this.renderState();
448
+ }
449
+
450
+ private toggleLoop(): void {
451
+ this.data.loop = this.data.loop !== true ? true : undefined;
452
+ this.block.dispatchChange();
453
+ this.renderState();
454
+ }
455
+
456
+ private transitionToEmpty(): void {
457
+ this.data = { ...this.data, url: '' };
458
+ this.state = 'EMPTY';
459
+ this.lastSource = null;
460
+ this.lastFileName = null;
461
+ this.renderState();
462
+ this.block.dispatchChange();
463
+ }
464
+
465
+ private download(): void {
466
+ const a = document.createElement('a');
467
+ a.href = this.data.url;
468
+ a.download = this.data.fileName ?? '';
469
+ a.target = '_blank';
470
+ a.rel = 'noopener';
471
+ document.body.appendChild(a);
472
+ a.click();
473
+ a.remove();
474
+ }
475
+
476
+ private copyUrl(): void {
477
+ const clip = navigator.clipboard;
478
+ if (clip && typeof clip.writeText === 'function') {
479
+ void clip.writeText(this.data.url);
480
+ }
481
+ }
482
+ }
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Waveform "now playing" liveliness math.
3
+ *
4
+ * The cached peaks are static — there's no real-time FFT — so the sense of a
5
+ * live visualizer is composed from two layers:
6
+ *
7
+ * 1. A focal **comet** at the playhead: a bright head spike, a tight leading
8
+ * edge, and a longer decaying wake trailing into the already-played bars.
9
+ * It travels left→right as playback advances.
10
+ * 2. A global **ambient** ripple that flows across the entire field so no bar
11
+ * sits frozen. It's biased stronger on the played side (a shimmering wake
12
+ * of music) and faint on the not-yet-played preview ahead.
13
+ *
14
+ * All functions are pure so the behaviour is unit-testable; the canvas in
15
+ * waveform.ts just samples them per bar, per frame.
16
+ */
17
+
18
+ /** Bars ahead of the playhead (not yet played) that still react. */
19
+ export const REACH_AHEAD = 4;
20
+ /** Bars behind the playhead (already played) that keep a decaying wake. */
21
+ export const REACH_BEHIND = 9;
22
+
23
+ /**
24
+ * Asymmetric "comet" falloff around the playhead. `distance` is the bar index
25
+ * minus the fractional playhead index: negative = behind (already-played wake),
26
+ * positive = ahead (not yet played). The wake reaches further than the leading
27
+ * edge so the energy reads as travelling with momentum. 1 at the playhead,
28
+ * easing to 0 at the respective reach.
29
+ */
30
+ export function cometEnvelope(distance: number, reachAhead = REACH_AHEAD, reachBehind = REACH_BEHIND): number {
31
+ const reach = distance < 0 ? reachBehind : reachAhead;
32
+ const d = Math.abs(distance);
33
+ if (d >= reach) return 0;
34
+ const t = 1 - d / reach;
35
+ return t * t;
36
+ }
37
+
38
+ /**
39
+ * Tight symmetric spike centred on the playhead so the bar under it stands
40
+ * clearly proud of its neighbours — the bright head of the comet. Falls off
41
+ * faster (cubed) than the comet body.
42
+ */
43
+ export function headFocus(distance: number, reach = 3): number {
44
+ const d = Math.abs(distance);
45
+ if (d >= reach) return 0;
46
+ const t = 1 - d / reach;
47
+ return t * t * t;
48
+ }
49
+
50
+ /**
51
+ * Deterministic per-bar wobble in [-1, 1]. Two out-of-phase sines keyed to the
52
+ * bar index so neighbouring bars rise and fall independently — the cluster
53
+ * reads as a dancing equalizer rather than one uniform swell.
54
+ */
55
+ export function barWobble(index: number, timeSeconds: number): number {
56
+ const a = Math.sin(timeSeconds * 8.5 + index * 0.7);
57
+ const b = Math.sin(timeSeconds * 5.3 + index * 1.9);
58
+ return a * 0.6 + b * 0.4;
59
+ }
60
+
61
+ /**
62
+ * Slow travelling undulation across the whole bar field, in [-1, 1]. Two waves
63
+ * propagate in opposite directions (the `-index`/`+index` phase terms) so the
64
+ * field gently churns rather than sliding uniformly. Kept low-frequency so the
65
+ * motion is graceful, not busy.
66
+ */
67
+ export function ambientWave(index: number, timeSeconds: number): number {
68
+ const a = Math.sin(timeSeconds * 2.1 - index * 0.35);
69
+ const b = Math.sin(timeSeconds * 1.3 + index * 0.21);
70
+ return a * 0.6 + b * 0.4;
71
+ }
72
+
73
+ /** Ambient swing applied to every bar (the faint preview-side breath). */
74
+ const AMBIENT_BASE = 0.035;
75
+ /** Extra ambient swing layered onto the played side (the shimmering wake). */
76
+ const AMBIENT_PLAYED = 0.06;
77
+ /** Bars ahead of the playhead over which the played-side shimmer fades out. */
78
+ const AMBIENT_AHEAD_FADE = 26;
79
+
80
+ /**
81
+ * Ease-out cubic for the head-colour entrance ramp: 0→1 with most of the travel
82
+ * up front, so the colour blooms in quickly then settles. Clamped to [0, 1].
83
+ */
84
+ export function entranceEase(progress: number): number {
85
+ const t = Math.min(1, Math.max(0, progress));
86
+ return 1 - (1 - t) ** 3;
87
+ }
88
+
89
+ /**
90
+ * 0..1 tint strength for a bar's comet-head colour overlay. Peaks at the
91
+ * playhead (via {@link headFocus}) and scales with both the live `energy` (so it
92
+ * fades out on the pause settle) and the `entrance` ramp (so it animates in when
93
+ * playback starts).
94
+ */
95
+ export function headColorBlend(opts: { distance: number; energy: number; entrance: number }): number {
96
+ return headFocus(opts.distance) * opts.energy * opts.entrance;
97
+ }
98
+
99
+ interface LiveAmplitudeOptions {
100
+ basePeak: number;
101
+ index: number;
102
+ /** Fractional bar position of the playhead (played * peaks.length). */
103
+ playheadIndex: number;
104
+ timeSeconds: number;
105
+ reduced: boolean;
106
+ /** 0..1 multiplier on the live boost — 1 while playing, ramps to 0 on the pause settle. */
107
+ energy?: number;
108
+ }
109
+
110
+ /**
111
+ * Final 0..1 bar amplitude, blending the static peak with two live layers: the
112
+ * playhead-localized comet (body swell + bright head spike + bidirectional
113
+ * dance) and a global ambient ripple biased toward the played side. The
114
+ * combined boost is scaled by `energy` (for the pause settle) and zeroed under
115
+ * `reduced` (prefers-reduced-motion).
116
+ */
117
+ export function liveAmplitude(opts: LiveAmplitudeOptions): number {
118
+ const { basePeak, index, playheadIndex, timeSeconds, reduced, energy = 1 } = opts;
119
+ if (reduced || energy <= 0) return basePeak;
120
+
121
+ const distance = index - playheadIndex;
122
+
123
+ // Layer 1 — focal comet near the playhead.
124
+ const env = cometEnvelope(distance);
125
+ const head = headFocus(distance);
126
+ const comet = env * 0.15 + head * 0.2 + env * 0.28 * barWobble(index, timeSeconds);
127
+
128
+ // Layer 2 — global ambient ripple. Full strength behind the playhead (the
129
+ // played wake), fading across AMBIENT_AHEAD_FADE bars into the preview ahead.
130
+ const playedBias = distance <= 0 ? 1 : Math.max(0, 1 - distance / AMBIENT_AHEAD_FADE);
131
+ const ambient = ambientWave(index, timeSeconds) * (AMBIENT_BASE + AMBIENT_PLAYED * playedBias);
132
+
133
+ const amp = basePeak + (comet + ambient) * energy;
134
+
135
+ return Math.min(1, Math.max(0, amp));
136
+ }
@@ -0,0 +1,56 @@
1
+ import type { AudioUploader } from '../../../types/tools/audio';
2
+ import { COVER_DATA_URL_CAP_BYTES } from './constants';
3
+
4
+ export interface RawPicture {
5
+ data: Uint8Array;
6
+ format?: string;
7
+ }
8
+ export interface RawTags {
9
+ common?: { title?: string; artist?: string; picture?: RawPicture[] };
10
+ }
11
+ export interface TrackMeta {
12
+ title?: string;
13
+ artist?: string;
14
+ cover?: { data: Uint8Array; mimeType: string };
15
+ }
16
+
17
+ export function mapMetadata(raw: RawTags): TrackMeta {
18
+ const common = raw.common ?? {};
19
+ const meta: TrackMeta = {};
20
+ if (common.title) meta.title = common.title;
21
+ if (common.artist) meta.artist = common.artist;
22
+ const pic = common.picture?.[0];
23
+ if (pic) meta.cover = { data: pic.data, mimeType: pic.format ?? 'image/jpeg' };
24
+ return meta;
25
+ }
26
+
27
+ function toBase64(bytes: Uint8Array): string {
28
+ return btoa(Array.from(bytes, (b) => String.fromCharCode(b)).join(''));
29
+ }
30
+
31
+ export async function resolveCover(
32
+ cover: { data: Uint8Array; mimeType: string },
33
+ uploader?: AudioUploader,
34
+ ): Promise<string | undefined> {
35
+ if (uploader?.uploadByFile) {
36
+ const file = new File([new Uint8Array(cover.data)], 'cover', { type: cover.mimeType });
37
+ const res = await uploader.uploadByFile(file);
38
+ return res.url;
39
+ }
40
+ if (cover.data.byteLength <= COVER_DATA_URL_CAP_BYTES) {
41
+ return `data:${cover.mimeType};base64,${toBase64(cover.data)}`;
42
+ }
43
+ return undefined;
44
+ }
45
+
46
+ export async function readTrackMetadata(file: File): Promise<TrackMeta> {
47
+ try {
48
+ const mm = await import('music-metadata');
49
+ const buf = new Uint8Array(await file.arrayBuffer());
50
+ // parseBuffer(uint8Array, fileInfo?: IFileInfo | string) — passing mimeType string is valid
51
+ const parsed = await mm.parseBuffer(buf, file.type);
52
+ return mapMetadata(parsed as RawTags);
53
+ } catch {
54
+ return {};
55
+ }
56
+ }