@jackuait/blok 0.19.1 → 0.20.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 (478) hide show
  1. package/dist/blok.cjs +1 -1
  2. package/dist/blok.iife.js +13 -13
  3. package/dist/blok.mjs +2 -2
  4. package/dist/blok.umd.js +30 -30
  5. package/dist/chunks/{APEv2Parser-WvRvu4zL.mjs → APEv2Parser-dFboX-HT.mjs} +5 -5
  6. package/dist/chunks/{AbstractID3Parser-DM9acVTg.mjs → AbstractID3Parser-qvoGRhB4.mjs} +5 -5
  7. package/dist/chunks/{AiffParser-C_VaWeb5.mjs → AiffParser-DVe3cNKY.mjs} +5 -5
  8. package/dist/chunks/{AsfParser-CH5F_9Wp.mjs → AsfParser-DrzvMHO9.mjs} +7 -7
  9. package/dist/chunks/{BasicParser-BFTgNkp-.mjs → BasicParser-BLAlEKys.mjs} +2 -2
  10. package/dist/chunks/{DsdiffParser-BAdYwB7y.mjs → DsdiffParser-uZBv6Bc_.mjs} +5 -5
  11. package/dist/chunks/{DsfParser-DWMLfBH1.mjs → DsfParser-DLra1i8X.mjs} +5 -5
  12. package/dist/chunks/{FlacParser-BdKXrY7L.mjs → FlacParser-DGd7sQuD.mjs} +6 -6
  13. package/dist/chunks/{ID3v1Parser-DoxlznrE.mjs → ID3v1Parser-CJMR_CT_.mjs} +3 -3
  14. package/dist/chunks/{ID3v2Parser-BIrxzjBm.mjs → ID3v2Parser-DIc0X1ee.mjs} +8 -8
  15. package/dist/chunks/{ID3v2Token-D5v9lCfb.mjs → ID3v2Token-BqnbpNYB.mjs} +3 -3
  16. package/dist/chunks/{MP4Parser-0KMJ-q2k.mjs → MP4Parser-BqrCfJyp.mjs} +6 -6
  17. package/dist/chunks/{MatroskaParser-fxFuCddu.mjs → MatroskaParser-CCbZmX7j.mjs} +5 -5
  18. package/dist/chunks/{MpegParser-R-6QiuhU.mjs → MpegParser-C-6l3Wrf.mjs} +6 -6
  19. package/dist/chunks/{MusepackParser-DFLoF47O.mjs → MusepackParser-C_PhW_BV.mjs} +5 -5
  20. package/dist/chunks/{OggParser-C1qP2qC7.mjs → OggParser-DJhcSH9h.mjs} +6 -6
  21. package/dist/chunks/{Util-DiBcLCh8.mjs → Util-B42SDwrM.mjs} +3 -3
  22. package/dist/chunks/{WavPackParser-Ck8xXsNf.mjs → WavPackParser-CuHju62S.mjs} +4 -4
  23. package/dist/chunks/{WaveParser-hxQlWijT.mjs → WaveParser-DvEqNnGt.mjs} +6 -6
  24. package/dist/chunks/{aiden0z-pptx-renderer.es-Y1OhS20L.mjs → aiden0z-pptx-renderer.es-Dfc1LJvS.mjs} +2 -2
  25. package/dist/chunks/{arc-Cu-PSKKo.mjs → arc-8pYAfiNC.mjs} +3 -3
  26. package/dist/chunks/architecture-7EHR7CIX-ByEay9F_.mjs +3 -0
  27. package/dist/chunks/{architectureDiagram-3BPJPVTR-BwW1QjqZ.mjs → architectureDiagram-3BPJPVTR-BiykAn02.mjs} +9 -9
  28. package/dist/chunks/{blockDiagram-GPEHLZMM-BAgQo64R.mjs → blockDiagram-GPEHLZMM-CozNEkEK.mjs} +13 -13
  29. package/dist/chunks/{blok-C52qeiPg.mjs → blok-C72PuzIT.mjs} +2514 -2109
  30. package/dist/chunks/{blok-gFn3FI95.cjs → blok-uBjibRae.cjs} +11 -11
  31. package/dist/chunks/{c4Diagram-AAUBKEIU-BQe-CDb8.mjs → c4Diagram-AAUBKEIU-DN5cpztO.mjs} +6 -6
  32. package/dist/chunks/channel-DCfRAw7p.mjs +5 -0
  33. package/dist/chunks/{chunk-2J33WTMH-CMyTQPbw.mjs → chunk-2J33WTMH-CHv7Whe1.mjs} +3 -3
  34. package/dist/chunks/{chunk-3OPIFGDE-_lgEHnzc.mjs → chunk-3OPIFGDE-BRLjwZDG.mjs} +8 -8
  35. package/dist/chunks/{chunk-4BX2VUAB-8PQvWn-w.mjs → chunk-4BX2VUAB-CrVP7ooQ.mjs} +2 -2
  36. package/dist/chunks/{chunk-4EGX6M5U-D4gnRnMD.mjs → chunk-4EGX6M5U-t1h05MXS.mjs} +2 -2
  37. package/dist/chunks/{chunk-55IACEB6-eQD6P1N8.mjs → chunk-55IACEB6-Cq7FTvxb.mjs} +2 -2
  38. package/dist/chunks/{chunk-5DO6E6H7-CN3lZIoE.mjs → chunk-5DO6E6H7-Z2pYCl69.mjs} +2 -2
  39. package/dist/chunks/{chunk-5ZQYHXKU-CPXVTQ_e.mjs → chunk-5ZQYHXKU-fs0GqOvF.mjs} +43 -43
  40. package/dist/chunks/{chunk-727SXJPM-DZUlPaIu.mjs → chunk-727SXJPM-BKsM41W3.mjs} +9 -9
  41. package/dist/chunks/{chunk-AQP2D5EJ-D7G094pS.mjs → chunk-AQP2D5EJ-YdXH_I-o.mjs} +7 -7
  42. package/dist/chunks/{chunk-BR22UD5L-B6NbSBJl.mjs → chunk-BR22UD5L-CqFDPfGM.mjs} +2 -2
  43. package/dist/chunks/{chunk-BSJP7CBP-C7FGlEZG.mjs → chunk-BSJP7CBP-DpGSyAQh.mjs} +2 -2
  44. package/dist/chunks/{chunk-CSCIHK7Q-C4qT3Yrk.mjs → chunk-CSCIHK7Q-BO7tl9ID.mjs} +4 -4
  45. package/dist/chunks/{chunk-FHYWG6QK-CgSYG-YQ.mjs → chunk-FHYWG6QK-5Het-98V.mjs} +2 -2
  46. package/dist/chunks/{chunk-FMBD7UC4-2p6fg26u.mjs → chunk-FMBD7UC4-P_kboMJT.mjs} +2 -2
  47. package/dist/chunks/{chunk-KSCS5N6A-BVWs3LbG.mjs → chunk-KSCS5N6A-CvZAQU-1.mjs} +11 -11
  48. package/dist/chunks/{chunk-L5ZTLDWV-BFEdycvM.mjs → chunk-L5ZTLDWV-DZEL0gsI.mjs} +4 -4
  49. package/dist/chunks/{chunk-LZXEDZCA-6drnUsNy.mjs → chunk-LZXEDZCA-CRJ7-DY6.mjs} +8 -8
  50. package/dist/chunks/{chunk-MPE355IW-DHYWughe.mjs → chunk-MPE355IW-DLg3CsBw.mjs} +2 -2
  51. package/dist/chunks/{chunk-MZUSXYTE-BmUr1KX3.mjs → chunk-MZUSXYTE-CvsgXeJO.mjs} +2 -2
  52. package/dist/chunks/{chunk-N66VUXT2-D_6jZ3Vo.mjs → chunk-N66VUXT2-DoC3ggTc.mjs} +2 -2
  53. package/dist/chunks/{chunk-ND2GUHAM-DooE8X6i.mjs → chunk-ND2GUHAM-BcJIrltI.mjs} +4 -4
  54. package/dist/chunks/{chunk-NNHCCRGN-rJnsUrWl.mjs → chunk-NNHCCRGN-CH81dTHf.mjs} +1 -1
  55. package/dist/chunks/{chunk-NZK2D7GU-JW_qgPqa.mjs → chunk-NZK2D7GU-BnVJr7kf.mjs} +3 -3
  56. package/dist/chunks/{chunk-O5CBEL6O-GY6nZ-N7.mjs → chunk-O5CBEL6O-BeYkA-8N.mjs} +16 -16
  57. package/dist/chunks/{chunk-PUPMXCY4-DCIdSRFi.mjs → chunk-PUPMXCY4-D3Ub4pDo.mjs} +2 -2
  58. package/dist/chunks/{chunk-QZHKN3VN-C3N0_vEC.mjs → chunk-QZHKN3VN-ChiFJWT0.mjs} +2 -2
  59. package/dist/chunks/{chunk-UIBZB4QT-pyTElNc2.mjs → chunk-UIBZB4QT-BwApNyrQ.mjs} +2 -2
  60. package/dist/chunks/{chunk-WCWK7LTN-ClqBpBku.mjs → chunk-WCWK7LTN-D4OBOUIK.mjs} +2 -2
  61. package/dist/chunks/{chunk-WU5MYG2G-DLQN-5vb.mjs → chunk-WU5MYG2G-wN4cJZ_G.mjs} +3 -3
  62. package/dist/chunks/{chunk-XPW4576I-IlnbQHaA.mjs → chunk-XPW4576I-yOZxg2iY.mjs} +2 -2
  63. package/dist/chunks/classDiagram-4FO5ZUOK-BgQLsKDL.mjs +29 -0
  64. package/dist/chunks/classDiagram-v2-Q7XG4LA2-DS7F_M1n.mjs +29 -0
  65. package/dist/chunks/constants-PI1xjAeG.cjs +606 -0
  66. package/dist/chunks/{constants-DzQOOvgv.mjs → constants-vvNFp6FG.mjs} +392 -267
  67. package/dist/chunks/{core-DdDpt2u7.mjs → core-CJGckLsY.mjs} +31 -31
  68. package/dist/chunks/{core-CqiEzfU3.mjs → core-DeCMWrgN.mjs} +4 -4
  69. package/dist/chunks/{cose-bilkent-S5V4N54A-BronfFB-.mjs → cose-bilkent-S5V4N54A-NIONAJnp.mjs} +3 -3
  70. package/dist/chunks/{cytoscape.esm-QxDq63HI.mjs → cytoscape.esm-fziZOrCG.mjs} +1 -1
  71. package/dist/chunks/{dagre-BM42HDAG-B4WVdKOZ.mjs → dagre-BM42HDAG-DcOrN3pc.mjs} +14 -14
  72. package/dist/chunks/{dagre-DzOGad9N.mjs → dagre-CILRucyd.mjs} +107 -107
  73. package/dist/chunks/default-DFm_GbQ-.mjs +4 -0
  74. package/dist/chunks/{defaultLocale-BJwYPC-h.mjs → defaultLocale-C2VD4mLA.mjs} +12 -12
  75. package/dist/chunks/{diagram-2AECGRRQ-C22ThgiO.mjs → diagram-2AECGRRQ-DDwBTlvz.mjs} +7 -7
  76. package/dist/chunks/{diagram-5GNKFQAL-COelHuJn.mjs → diagram-5GNKFQAL-1sbWUr5e.mjs} +8 -8
  77. package/dist/chunks/{diagram-KO2AKTUF-CjLVtM94.mjs → diagram-KO2AKTUF-DhTFFKgx.mjs} +7 -7
  78. package/dist/chunks/{diagram-LMA3HP47-DqkuYFi9.mjs → diagram-LMA3HP47-DRr_84ZZ.mjs} +7 -7
  79. package/dist/chunks/{diagram-OG6HWLK6-390_YOO-.mjs → diagram-OG6HWLK6-C_5eu9Kf.mjs} +32 -32
  80. package/dist/chunks/{dist-CCXeNeCQ.mjs → dist-DRqr67zQ.mjs} +2 -2
  81. package/dist/chunks/{docx-preview-ulpDsaxt.mjs → docx-preview-CQ4QUFrd.mjs} +2 -2
  82. package/dist/chunks/{erDiagram-TEJ5UH35-BH0f96Pn.mjs → erDiagram-TEJ5UH35-C3Ohfkqu.mjs} +14 -14
  83. package/dist/chunks/eventmodeling-FCH6USID-BqDo_Sav.mjs +3 -0
  84. package/dist/chunks/{flowDiagram-I6XJVG4X-kZaqJYK1.mjs → flowDiagram-I6XJVG4X-DyXB0QVM.mjs} +17 -17
  85. package/dist/chunks/{ganttDiagram-6RSMTGT7-C3uQIARG.mjs → ganttDiagram-6RSMTGT7-82Iyg78i.mjs} +27 -27
  86. package/dist/chunks/gitGraph-WXDBUCRP-D-utqQiN.mjs +3 -0
  87. package/dist/chunks/{gitGraphDiagram-PVQCEYII-DQSTvBjy.mjs → gitGraphDiagram-PVQCEYII-D9V6dxzm.mjs} +7 -7
  88. package/dist/chunks/{graphlib-B0ANG2M6.mjs → graphlib-RxhPMq8I.mjs} +135 -135
  89. package/dist/chunks/{i18next-gGTtSkQg.mjs → i18next-C2REZNw2.mjs} +1 -1
  90. package/dist/chunks/{i18next-loader-BBPMegxc.cjs → i18next-loader-DVakgVCy.cjs} +1 -1
  91. package/dist/chunks/{i18next-loader-K-ir8UKk.mjs → i18next-loader-Dh4fP9we.mjs} +2 -2
  92. package/dist/chunks/info-J43DQDTF-D72knbmq.mjs +3 -0
  93. package/dist/chunks/{infoDiagram-5YYISTIA-CGpT_mPZ.mjs → infoDiagram-5YYISTIA-BxEJ_ib3.mjs} +5 -5
  94. package/dist/chunks/{init-hkDiJKhJ.mjs → init-BR8veUec.mjs} +1 -1
  95. package/dist/chunks/{ishikawaDiagram-YF4QCWOH-Ch9fmsWb.mjs → ishikawaDiagram-YF4QCWOH-CXe2kJsO.mjs} +6 -6
  96. package/dist/chunks/{journeyDiagram-JHISSGLW-CWv40lgD.mjs → journeyDiagram-JHISSGLW-DBhSi7Qg.mjs} +6 -6
  97. package/dist/chunks/{jszip.min-DoBCcllU.mjs → jszip.min-BsbMNjJg.mjs} +1 -1
  98. package/dist/chunks/{kanban-definition-UN3LZRKU-DSbXvrBB.mjs → kanban-definition-UN3LZRKU-CE4yr6J6.mjs} +11 -11
  99. package/dist/chunks/{katex-BIACU78Y.mjs → katex-DxQaNCxg.mjs} +1 -1
  100. package/dist/chunks/{lightweight-i18n-LFW8S8u-.cjs → lightweight-i18n-BnIqQ5Cf.cjs} +1 -1
  101. package/dist/chunks/{lightweight-i18n-DJpMke7a.mjs → lightweight-i18n-Cj88c8gl.mjs} +15 -0
  102. package/dist/chunks/{line-DU9tI1Tb.mjs → line-CQUUULPd.mjs} +4 -4
  103. package/dist/chunks/{linear-CPgdjDZh.mjs → linear-CAfvVXJc.mjs} +23 -23
  104. package/dist/chunks/{mdast-util-math-BNabERqA.mjs → mdast-util-math-Cpp9XOMP.mjs} +3 -3
  105. package/dist/chunks/{mermaid-parser.core-CRFj5ZQJ.mjs → mermaid-parser.core-B92FGYsA.mjs} +22 -22
  106. package/dist/chunks/{mermaid.core-D_2I8mjo.mjs → mermaid.core-BA9GkGKf.mjs} +52 -52
  107. package/dist/{messages-BI5B9bxE.mjs → chunks/messages-0EAci1N0.mjs} +15 -0
  108. package/dist/chunks/{messages-BkgBVEiE.cjs → messages-1jzEPeW5.cjs} +1 -1
  109. package/dist/chunks/{messages-CATH_uz1.mjs → messages-4CqVAaCY.mjs} +16 -1
  110. package/dist/chunks/{messages-DFHNw6PQ.cjs → messages-4Qka94cm.cjs} +1 -1
  111. package/dist/chunks/{messages-CBbgEXuO.cjs → messages-7wDDggws.cjs} +1 -1
  112. package/dist/chunks/{messages-B7st3eF_.cjs → messages-9VzB9Djh.cjs} +1 -1
  113. package/dist/chunks/{messages-B_cHWyWC.cjs → messages-9bK437Rh.cjs} +1 -1
  114. package/dist/chunks/{messages-CZddldga.cjs → messages-AtTKtjsQ.cjs} +1 -1
  115. package/dist/{messages-BOWDzfkH.mjs → chunks/messages-B1inw201.mjs} +16 -1
  116. package/dist/chunks/{messages-B-u5B7tY.cjs → messages-B4ZVgIh5.cjs} +1 -1
  117. package/dist/chunks/{messages-CJFSq8Fl.cjs → messages-B5bSFRCa.cjs} +1 -1
  118. package/dist/chunks/{messages-BRTWvTAP.mjs → messages-B705gxqz.mjs} +16 -1
  119. package/dist/{messages-Dq_RdEny2.mjs → chunks/messages-B7F3tX4u.mjs} +16 -1
  120. package/dist/chunks/{messages-NJAjMFXd.cjs → messages-BDer7I67.cjs} +1 -1
  121. package/dist/chunks/{messages-BV22YIZ_.cjs → messages-BEEGgtPo.cjs} +1 -1
  122. package/dist/{messages-bN4Zmk2m.mjs → chunks/messages-BGlEWmsB.mjs} +16 -1
  123. package/dist/{messages-Ao2vCNAH2.mjs → chunks/messages-BJJsuZhy.mjs} +16 -1
  124. package/dist/chunks/{messages-DjrfovG0.cjs → messages-BJcc9h6p.cjs} +1 -1
  125. package/dist/chunks/{messages-Hfo6uCIC.cjs → messages-BL-E2Kw3.cjs} +1 -1
  126. package/dist/chunks/{messages-5339ApgH.mjs → messages-BLJGzntb.mjs} +16 -1
  127. package/dist/chunks/{messages-Au1UpgkX.cjs → messages-BLNieIb-.cjs} +1 -1
  128. package/dist/chunks/{messages-DQJcAz4s.cjs → messages-BRbGk1-Z.cjs} +1 -1
  129. package/dist/chunks/{messages-BwOUSDJR.mjs → messages-BUlZRNoO.mjs} +15 -0
  130. package/dist/{messages-BKGg4XYm2.mjs → chunks/messages-BWQF9y2r.mjs} +16 -1
  131. package/dist/chunks/{messages-UXS3zL9A2.cjs → messages-BWh9I5Jv2.cjs} +1 -1
  132. package/dist/chunks/{messages-B6dbtt1c.cjs → messages-BX86v7Ev.cjs} +1 -1
  133. package/dist/chunks/{messages-DIFwztFo.cjs → messages-BYpvkG9S.cjs} +1 -1
  134. package/dist/chunks/{messages-C8_r3iTR2.mjs → messages-Bdw_vAdq2.mjs} +16 -1
  135. package/dist/chunks/{messages-DIetNXTx.cjs → messages-BeQVEC9q.cjs} +1 -1
  136. package/dist/{messages-CusWGsl42.mjs → chunks/messages-BeTZTXZm.mjs} +16 -1
  137. package/dist/chunks/{messages-CmsAbu_A.cjs → messages-BhTlR4PP.cjs} +1 -1
  138. package/dist/{messages-B2YnZIU2.mjs → chunks/messages-BhnZTZbQ.mjs} +16 -1
  139. package/dist/{messages-BpwhHkFb2.mjs → chunks/messages-BqJdoBHm.mjs} +16 -1
  140. package/dist/chunks/{messages-zPUQsksJ.mjs → messages-BqPiH7QC.mjs} +16 -1
  141. package/dist/chunks/{messages-CjfEt9bg.cjs → messages-Br_qu_wR.cjs} +1 -1
  142. package/dist/chunks/{messages-DtaPHADA.cjs → messages-BscUmD6D.cjs} +1 -1
  143. package/dist/{messages-Cg6a88Bb2.mjs → chunks/messages-Btapuvxo.mjs} +16 -1
  144. package/dist/chunks/{messages-CEySIig9.cjs → messages-BwCw0TJ1.cjs} +1 -1
  145. package/dist/chunks/{messages-BO-L5oN9.mjs → messages-C3RDWmXV.mjs} +15 -0
  146. package/dist/chunks/{messages-CZJZ-au3.cjs → messages-C3SZsVB9.cjs} +1 -1
  147. package/dist/chunks/{messages-DQr7bXMD.mjs → messages-C65mLRVK.mjs} +16 -1
  148. package/dist/chunks/{messages-CT8djlV6.cjs → messages-C73dKqPT.cjs} +1 -1
  149. package/dist/chunks/{messages-DOqJ6ogK.cjs → messages-C8f4kUOB.cjs} +1 -1
  150. package/dist/chunks/{messages-CIBYzzFy.mjs → messages-C9vfrzKQ.mjs} +16 -1
  151. package/dist/{messages-Grhv5SE_.mjs → chunks/messages-CEbe34zh.mjs} +15 -0
  152. package/dist/chunks/{messages-CcsM8Q7g.cjs → messages-CHEpECGv.cjs} +1 -1
  153. package/dist/chunks/{messages-DEg5FAg1.cjs → messages-CHP0nYRn.cjs} +1 -1
  154. package/dist/chunks/{messages-CjCn5IsF.mjs → messages-CIbh-0oJ.mjs} +16 -1
  155. package/dist/chunks/{messages-BHCepNsI.cjs → messages-CJC94Hci.cjs} +1 -1
  156. package/dist/chunks/{messages-ByNR9m9W.cjs → messages-CMP5dbqQ.cjs} +1 -1
  157. package/dist/chunks/{messages-DpNmnBjK.cjs → messages-CMm8FeOL.cjs} +1 -1
  158. package/dist/chunks/{messages-Da8yFc7l.cjs → messages-CNMPtWiq.cjs} +1 -1
  159. package/dist/chunks/{messages-Xh-c7d4C.mjs → messages-CQUr4lBa.mjs} +16 -1
  160. package/dist/{messages-Cvq2EFPT2.mjs → chunks/messages-CUuOX1k3.mjs} +16 -1
  161. package/dist/chunks/{messages-BsTzdfZF.cjs → messages-CVerbLou.cjs} +1 -1
  162. package/dist/{messages-CGiVoFTi.mjs → chunks/messages-CWW9OwKO.mjs} +16 -1
  163. package/dist/{messages-Da1woCgt2.mjs → chunks/messages-CWqap54p.mjs} +16 -1
  164. package/dist/{messages-CEGqNXnP.mjs → chunks/messages-CXNQBFHp.mjs} +16 -1
  165. package/dist/chunks/{messages-DgF8OkNr.mjs → messages-CYDhuSF4.mjs} +16 -1
  166. package/dist/chunks/{messages-Bp0LdGKj.mjs → messages-CYy3Zd3F.mjs} +15 -0
  167. package/dist/chunks/{messages-DHv7knYB.mjs → messages-C_BM_XHo.mjs} +16 -1
  168. package/dist/chunks/{messages-IqNWRaNS.cjs → messages-CbKOqXT6.cjs} +1 -1
  169. package/dist/chunks/{messages-Bmq--WTx.mjs → messages-CbxXU_Um.mjs} +15 -0
  170. package/dist/chunks/{messages-CVrOxu3J.cjs → messages-CcO-3_4k.cjs} +1 -1
  171. package/dist/chunks/{messages-D41fO84y.cjs → messages-CcTkC677.cjs} +1 -1
  172. package/dist/chunks/{messages-Cy-2_lIA.cjs → messages-CdEZ98_p.cjs} +1 -1
  173. package/dist/{messages-KyJQtOkh2.mjs → chunks/messages-CeZ1lo-o.mjs} +16 -1
  174. package/dist/chunks/{messages-D7H9JUDr.cjs → messages-CgFAGUJX.cjs} +1 -1
  175. package/dist/chunks/{messages-Dwl878eS.mjs → messages-CprMp4Va.mjs} +16 -1
  176. package/dist/chunks/{messages-DuD4ut1b.mjs → messages-CtXDxPOq.mjs} +16 -1
  177. package/dist/chunks/{messages-B_d857cA.mjs → messages-Cutnm4AZ.mjs} +15 -0
  178. package/dist/chunks/{messages-cSBZ5qVe.mjs → messages-CwIC_sse.mjs} +16 -1
  179. package/dist/chunks/{messages-7LWW3BVh.mjs → messages-CwbTr9lL.mjs} +16 -1
  180. package/dist/chunks/{messages-ETJ7tQ9O.cjs → messages-CxIknrw4.cjs} +1 -1
  181. package/dist/chunks/{messages-DjZoCJ00.mjs → messages-D0Jj7Dtw.mjs} +15 -0
  182. package/dist/chunks/{messages-SozFksSf.cjs → messages-D0th-I9S.cjs} +1 -1
  183. package/dist/chunks/{messages-gh5G15J1.cjs → messages-D1XTyTJz.cjs} +1 -1
  184. package/dist/chunks/{messages-DNtAzacv.mjs → messages-D24EoKbO.mjs} +16 -1
  185. package/dist/{messages-BlvF3pot.mjs → chunks/messages-D2chjyLM.mjs} +16 -1
  186. package/dist/chunks/{messages-CqRtDVFO.cjs → messages-D6y13edn.cjs} +1 -1
  187. package/dist/chunks/{messages-EsX3eikv.cjs → messages-D86p1eQY.cjs} +1 -1
  188. package/dist/{messages-BwCgJUdq.mjs → chunks/messages-D8L_8amv.mjs} +16 -1
  189. package/dist/chunks/{messages-C2ptZOWh.cjs → messages-DC-yFRyF.cjs} +1 -1
  190. package/dist/chunks/{messages-D4u2PSQw.mjs → messages-DEPxxCNU.mjs} +16 -1
  191. package/dist/chunks/{messages-VeyvtTce.cjs → messages-DG9l5agQ.cjs} +1 -1
  192. package/dist/chunks/{messages-B6794_2J.cjs → messages-DIeUb2w-.cjs} +1 -1
  193. package/dist/chunks/{messages-COx3hDcP.cjs → messages-DJ-RX5EJ.cjs} +1 -1
  194. package/dist/chunks/{messages-Cvg_uTfy.mjs → messages-DJ7lbpBX.mjs} +16 -1
  195. package/dist/{messages-Cn3uvFq3.mjs → chunks/messages-DJH_kd46.mjs} +16 -1
  196. package/dist/chunks/{messages-CWFSMzug2.cjs → messages-DLYl6KdK2.cjs} +1 -1
  197. package/dist/chunks/{messages-3jkCmB_A.mjs → messages-DMcCkOtN.mjs} +16 -1
  198. package/dist/chunks/{messages-BdL8bmTL.mjs → messages-DQks74hq.mjs} +16 -1
  199. package/dist/{messages-UJx6PvCL.mjs → chunks/messages-DTiqggtG.mjs} +16 -1
  200. package/dist/chunks/{messages-typO_i_k.mjs → messages-DTsSYToI.mjs} +15 -0
  201. package/dist/{messages-CwvHO8gp2.mjs → chunks/messages-DU6TOz6v.mjs} +16 -1
  202. package/dist/chunks/{messages-DmjccFHq.cjs → messages-DUbZA-w_.cjs} +1 -1
  203. package/dist/chunks/{messages-DCwrXfck.cjs → messages-DVAU-8rH.cjs} +1 -1
  204. package/dist/chunks/{messages-Z4LYgfWc.cjs → messages-Df6vXDrY.cjs} +1 -1
  205. package/dist/chunks/{messages-9B1F-k48.cjs → messages-Dh79ToYM.cjs} +1 -1
  206. package/dist/chunks/{messages-CuMtymEs.cjs → messages-Dh9psewW.cjs} +1 -1
  207. package/dist/chunks/{messages-BjYhwRk7.cjs → messages-Dln2T0zJ.cjs} +1 -1
  208. package/dist/chunks/{messages-DT-JnTnw.cjs → messages-DoA0Ecoi.cjs} +1 -1
  209. package/dist/{messages-RXQKVFCJ.mjs → chunks/messages-Dre_MB7o.mjs} +16 -1
  210. package/dist/chunks/{messages-BveiGA2x.cjs → messages-Dv4oyF7T.cjs} +1 -1
  211. package/dist/chunks/{messages-CkosWGGH.mjs → messages-FMAQkmg4.mjs} +15 -0
  212. package/dist/{messages-CQzOV7VE2.mjs → chunks/messages-GownDU-J.mjs} +16 -1
  213. package/dist/chunks/{messages-CH9SBR-i.cjs → messages-JYea02IT.cjs} +1 -1
  214. package/dist/chunks/{messages-BXp_U3uS.cjs → messages-JyzorVPx.cjs} +1 -1
  215. package/dist/chunks/{messages-jEbEE90_.mjs → messages-L70TFQAY.mjs} +16 -1
  216. package/dist/chunks/{messages-C0swL9CY.mjs → messages-L8CslBBZ.mjs} +16 -1
  217. package/dist/chunks/{messages-CM8uUnPx.cjs → messages-LX9PuLsT.cjs} +1 -1
  218. package/dist/chunks/{messages-BUvlOqll.mjs → messages-NFUr7Sxk.mjs} +16 -1
  219. package/dist/chunks/{messages-CGdCpNZ62.cjs → messages-PpRvDwOa2.cjs} +1 -1
  220. package/dist/chunks/{messages-ZMG7qQ3D.mjs → messages-QQ5-ET8y.mjs} +16 -1
  221. package/dist/chunks/{messages-DiODNXET.mjs → messages-Stf6rn2I.mjs} +16 -1
  222. package/dist/chunks/{messages-D7sU-NqL.cjs → messages-T8hCmys7.cjs} +1 -1
  223. package/dist/{messages-lnxRz5rM.mjs → chunks/messages-TZtv60nI.mjs} +16 -1
  224. package/dist/chunks/{messages-CeLv1whu2.mjs → messages-V9bvFOFc2.mjs} +16 -1
  225. package/dist/chunks/{messages-tR0BdeVG.cjs → messages-Vp8CpYh3.cjs} +1 -1
  226. package/dist/chunks/{messages-DUWCkLYR.cjs → messages-XqCqLy0k.cjs} +1 -1
  227. package/dist/{messages-CcF4SO9W.mjs → chunks/messages-_1y6EX7X.mjs} +16 -1
  228. package/dist/chunks/{messages-CXk-iM-i.mjs → messages-aTZglEV9.mjs} +16 -1
  229. package/dist/chunks/{messages-BHdKd7pH.cjs → messages-cSHh8Zgv.cjs} +1 -1
  230. package/dist/{messages-P5B61L1J2.mjs → chunks/messages-e8gxPi7a.mjs} +16 -1
  231. package/dist/chunks/{messages-CI2W7P-j.mjs → messages-hiwlrrr-.mjs} +16 -1
  232. package/dist/{messages-CeqpzGl9.mjs → chunks/messages-icPZhZ81.mjs} +15 -0
  233. package/dist/{messages-4drvqPN8.mjs → chunks/messages-lbwOYFxS2.mjs} +16 -1
  234. package/dist/chunks/{messages-B6yMdb3B.cjs → messages-lvo-9Be0.cjs} +1 -1
  235. package/dist/chunks/{messages-B2iaIrIu.mjs → messages-rm6jXexA.mjs} +16 -1
  236. package/dist/chunks/{messages-Ciq5_PsP.cjs → messages-sTyGkmbu.cjs} +1 -1
  237. package/dist/{messages-CF5MeYEt2.mjs → chunks/messages-uBwK-Ze2.mjs} +16 -1
  238. package/dist/chunks/{messages-BaVZgTrw.cjs → messages-uOISsfmj.cjs} +1 -1
  239. package/dist/chunks/{messages-MPe9FjYe.mjs → messages-wq0vxJ3p.mjs} +16 -1
  240. package/dist/chunks/{messages-CQT8TtiF.cjs → messages-z2DzBRgO.cjs} +1 -1
  241. package/dist/chunks/{micromark-extension-math-CJDP6iIU.mjs → micromark-extension-math-COSLlhTC.mjs} +6 -6
  242. package/dist/chunks/{micromark-factory-space-C6wz33de.mjs → micromark-factory-space-CLWSfTEG.mjs} +2 -2
  243. package/dist/chunks/{mindmap-definition-RKZ34NQL-Bh7eb0sP.mjs → mindmap-definition-RKZ34NQL-Dklc3Py2.mjs} +16 -16
  244. package/dist/chunks/{native-RS5RJIVO.mjs → native-BE2uW7dn.mjs} +1 -1
  245. package/dist/chunks/{ordinal-FCgpEo3E.mjs → ordinal-Qrn6pSTz.mjs} +3 -3
  246. package/dist/chunks/packet-YPE3B663-BehYuyRA.mjs +3 -0
  247. package/dist/chunks/{path-CCKeP0zq.mjs → path-CMz47XM0.mjs} +3 -3
  248. package/dist/chunks/pie-LRSECV5Y-C85c3T2E.mjs +3 -0
  249. package/dist/chunks/{pieDiagram-4H26LBE5-Bn2IEjeH.mjs → pieDiagram-4H26LBE5-DgCAhu_N.mjs} +14 -14
  250. package/dist/chunks/{prism-bash-D4zr_u8t.mjs → prism-bash-C0O3w7uz.mjs} +1 -1
  251. package/dist/chunks/{prism-cpp-CrBJjuu5.mjs → prism-cpp-2GQhW27l.mjs} +1 -1
  252. package/dist/chunks/{prism-csharp-lrMxvYpL.mjs → prism-csharp-DL7dZG1j.mjs} +1 -1
  253. package/dist/chunks/{prism-css-VQTID_HR.mjs → prism-css-CNvzB07F.mjs} +1 -1
  254. package/dist/chunks/{prism-dart-Q-9Z_W9B.mjs → prism-dart-DfjFPoDv.mjs} +1 -1
  255. package/dist/chunks/{prism-docker-DWAQ3dDD.mjs → prism-docker-BYbfweTi.mjs} +1 -1
  256. package/dist/chunks/{prism-java-_m72Vn1f.mjs → prism-java-DVDstRX2.mjs} +1 -1
  257. package/dist/chunks/{prism-kotlin-BTT9anu1.mjs → prism-kotlin-B4yZP901.mjs} +1 -1
  258. package/dist/chunks/{prism-latex-CL8zDJwm.mjs → prism-latex-D6GsLRnS.mjs} +1 -1
  259. package/dist/chunks/{prism-lua-D6JJ7p-A.mjs → prism-lua-CJX1SQiz.mjs} +1 -1
  260. package/dist/chunks/{prism-markdown-D6D8BprH.mjs → prism-markdown-C4FwQHMu.mjs} +1 -1
  261. package/dist/chunks/{prism-markup-templating-DfRjv0mn.mjs → prism-markup-templating-CmFWyrMp.mjs} +1 -1
  262. package/dist/chunks/{prism-php-DffX-wRi.mjs → prism-php-D1En1wGd.mjs} +1 -1
  263. package/dist/chunks/{prism-r-CU9se1Na.mjs → prism-r-DmduEoWu.mjs} +1 -1
  264. package/dist/chunks/{prism-ruby-DuQ4syPd.mjs → prism-ruby-BX9M-ggZ.mjs} +1 -1
  265. package/dist/chunks/{prism-rust-DRurCx4W.mjs → prism-rust-CW_lhKyK.mjs} +1 -1
  266. package/dist/chunks/{prism-sql-Au3VVcw1.mjs → prism-sql-CsK4eHq9.mjs} +1 -1
  267. package/dist/chunks/{prism-typescript-BKj96rmj.mjs → prism-typescript-Ca1YH5jC.mjs} +1 -1
  268. package/dist/chunks/{prism-yaml-Bk31kvSd.mjs → prism-yaml-CA6Sp5jk.mjs} +1 -1
  269. package/dist/chunks/{purify.es-Cg3Sx1In.mjs → purify.es-W8MRy_-c.mjs} +1 -1
  270. package/dist/chunks/{quadrantDiagram-W4KKPZXB-CGpTgKv9.mjs → quadrantDiagram-W4KKPZXB-BwDXU7bs.mjs} +4 -4
  271. package/dist/chunks/radar-GUYGQ44K-DGjR4vAz.mjs +3 -0
  272. package/dist/chunks/{requirementDiagram-4Y6WPE33-CdEklBE5.mjs → requirementDiagram-4Y6WPE33-C8uQNZti.mjs} +13 -13
  273. package/dist/chunks/{rough.esm-D0yWqsMu.mjs → rough.esm-BMiXn97a.mjs} +1 -1
  274. package/dist/chunks/{sanitize-url-DzTIH3XF.mjs → sanitize-url-Pw_yecwg.mjs} +70 -70
  275. package/dist/chunks/{sankeyDiagram-5OEKKPKP-C7B8TYyO.mjs → sankeyDiagram-5OEKKPKP-BJwtjvLG.mjs} +18 -18
  276. package/dist/chunks/{sequenceDiagram-3UESZ5HK-Wb1gzfDh.mjs → sequenceDiagram-3UESZ5HK-BHEbMtdM.mjs} +8 -8
  277. package/dist/chunks/{src-BMRCbUmP.mjs → src-uHD1i8ix.mjs} +86 -86
  278. package/dist/chunks/{stateDiagram-AJRCARHV-B1UbFikz.mjs → stateDiagram-AJRCARHV-D2di7cb4.mjs} +17 -17
  279. package/dist/chunks/stateDiagram-v2-BHNVJYJU-uJvNkDGf.mjs +27 -0
  280. package/dist/chunks/{timeline-definition-PNZ67QCA-Dr0oEljt.mjs → timeline-definition-PNZ67QCA-CkldAvjX.mjs} +6 -6
  281. package/dist/chunks/tools-B6rEBe-4.cjs +208 -0
  282. package/dist/chunks/{tools-CelSzJoA.mjs → tools-BQo4iaMe.mjs} +2565 -2497
  283. package/dist/chunks/treeView-BLDUP644-DhLdRehp.mjs +3 -0
  284. package/dist/chunks/treemap-LRROVOQU-CgXHb4o7.mjs +3 -0
  285. package/dist/chunks/{types-gj36fzRQ.mjs → types-BdXoqAkw.mjs} +1 -1
  286. package/dist/chunks/{vennDiagram-CIIHVFJN-Bc4yalKA.mjs → vennDiagram-CIIHVFJN-BuYgzRtw.mjs} +7 -7
  287. package/dist/chunks/wardley-L42UT6IY-sN5mOUNm.mjs +3 -0
  288. package/dist/chunks/{wardleyDiagram-YWT4CUSO-Ce_btexJ.mjs → wardleyDiagram-YWT4CUSO-CN5Jfm2D.mjs} +7 -7
  289. package/dist/chunks/{webm-muxer-Doy8JtlV.mjs → webm-muxer-B4_guPR0.mjs} +1 -1
  290. package/dist/chunks/{xychartDiagram-2RQKCTM6-HhACbhVa.mjs → xychartDiagram-2RQKCTM6-DAcdK50J.mjs} +12 -12
  291. package/dist/full.cjs +1 -1
  292. package/dist/full.mjs +3 -3
  293. package/dist/locales.mjs +82 -67
  294. package/dist/markdown.mjs +2 -2
  295. package/dist/{chunks/messages-DDJkNbJy.mjs → messages--sHkn4PD.mjs} +16 -1
  296. package/dist/{chunks/messages-QCaF3d92.mjs → messages-4mxgsYKZ2.mjs} +16 -1
  297. package/dist/{messages-zOl6jpOa.mjs → messages-6fQMeTiI.mjs} +16 -1
  298. package/dist/{messages-BRLWpOnP.mjs → messages-B22G0fir.mjs} +16 -1
  299. package/dist/{chunks/messages-kqnzps-X.mjs → messages-B908tGhl.mjs} +16 -1
  300. package/dist/{messages-CDueJTe8.mjs → messages-BAUvKI0_.mjs} +16 -1
  301. package/dist/{chunks/messages-BpMWMH9_.mjs → messages-BAfMwQnT2.mjs} +16 -1
  302. package/dist/{messages-Bmu3rJwO.mjs → messages-BCk7o4Pz.mjs} +16 -1
  303. package/dist/{messages-D4dovFzY2.mjs → messages-BG2BE6Sg2.mjs} +16 -1
  304. package/dist/{messages-DR2JBU-H.mjs → messages-BGe6GS_j.mjs} +16 -1
  305. package/dist/{chunks/messages-CeIzWL_4.mjs → messages-BHLrVFmZ2.mjs} +16 -1
  306. package/dist/{chunks/messages-HJnG9r2l.mjs → messages-BJjffJIu.mjs} +16 -1
  307. package/dist/{messages-CUcUO5bC2.mjs → messages-BSGZSOH32.mjs} +16 -1
  308. package/dist/{messages-HVgCKIww2.mjs → messages-BT6TyDYQ2.mjs} +16 -1
  309. package/dist/{messages-jQsl7cga2.mjs → messages-BWZ0_zUi2.mjs} +16 -1
  310. package/dist/{chunks/messages-DDX6I6MX.mjs → messages-BWhJgyhl.mjs} +16 -1
  311. package/dist/{messages-CqZgsrVP2.mjs → messages-BXqLaS2g2.mjs} +16 -1
  312. package/dist/{messages-gTUy3xjb.mjs → messages-BZiuFv_O.mjs} +15 -0
  313. package/dist/{messages-DcQNeoPB.mjs → messages-Bb-XEtyl.mjs} +15 -0
  314. package/dist/{messages-C9Kq8259.mjs → messages-BkKAnFz_.mjs} +15 -0
  315. package/dist/{messages-BarhGl2S2.mjs → messages-BoLu5_Wp2.mjs} +16 -1
  316. package/dist/{chunks/messages-D-p-omWy.mjs → messages-BpqRzil6.mjs} +16 -1
  317. package/dist/{messages-C6R0bzW5.mjs → messages-C2E8rQjb.mjs} +15 -0
  318. package/dist/{messages-BIgvPd6I2.mjs → messages-C2JJxi5D2.mjs} +16 -1
  319. package/dist/{messages-jsrzDVZy2.mjs → messages-C4d1_z432.mjs} +16 -1
  320. package/dist/{messages-L4sYfXpM.mjs → messages-C5Igyij0.mjs} +16 -1
  321. package/dist/{messages-CAnOyxrm.mjs → messages-C8fscB2J.mjs} +16 -1
  322. package/dist/{chunks/messages-CX0tJpOb.mjs → messages-CD8CgT1F.mjs} +16 -1
  323. package/dist/{messages-BKG0QHVl.mjs → messages-CDxPk3xE.mjs} +15 -0
  324. package/dist/{messages-hGop1gbF.mjs → messages-CGXrIdHT.mjs} +15 -0
  325. package/dist/{chunks/messages-DuHFGMCJ.mjs → messages-CHfkCxGQ2.mjs} +16 -1
  326. package/dist/{messages-fAEKzdUq.mjs → messages-CMvNzksb.mjs} +16 -1
  327. package/dist/{chunks/messages-t26x8wxB.mjs → messages-CSIhcdDx2.mjs} +16 -1
  328. package/dist/{chunks/messages-D-QWtvWg.mjs → messages-CW5z5hSz.mjs} +16 -1
  329. package/dist/{chunks/messages-CUPup5e3.mjs → messages-CYvpDx4p2.mjs} +16 -1
  330. package/dist/{chunks/messages-Ca9zIrBo.mjs → messages-CcTlmrYs.mjs} +16 -1
  331. package/dist/{chunks/messages-B01D7aHY.mjs → messages-Ce8ShL0-.mjs} +16 -1
  332. package/dist/{chunks/messages-CbyVDo8y.mjs → messages-CgT32m3D.mjs} +15 -0
  333. package/dist/{chunks/messages-ypIHI9Fr.mjs → messages-CmCBnNtA2.mjs} +16 -1
  334. package/dist/{messages-DGAWjKQZ.mjs → messages-CneVTJSN.mjs} +16 -1
  335. package/dist/{messages-C5IE9mXm.mjs → messages-CpNerer8.mjs} +15 -0
  336. package/dist/{chunks/messages-D-s4_vnU.mjs → messages-Cs0L1gyv.mjs} +16 -1
  337. package/dist/{chunks/messages-BYCHzM7F.mjs → messages-CsGnp1wE2.mjs} +16 -1
  338. package/dist/{messages-BgPDPIkO.mjs → messages-CvbIxcr7.mjs} +16 -1
  339. package/dist/{messages-wmS6Z2m82.mjs → messages-Cx6oQfMR2.mjs} +16 -1
  340. package/dist/{messages-BvutXmgt.mjs → messages-DBESJOhQ.mjs} +16 -1
  341. package/dist/{chunks/messages-Cl_pM31G.mjs → messages-DGOBPnKC2.mjs} +16 -1
  342. package/dist/{messages-B13GEFFu.mjs → messages-DK2AwXAp.mjs} +16 -1
  343. package/dist/{messages-CUFac9Qe.mjs → messages-DMbnesQ9.mjs} +16 -1
  344. package/dist/{chunks/messages-Byn9-dhb2.mjs → messages-DOiSOenW.mjs} +16 -1
  345. package/dist/{messages-8__-vX3U.mjs → messages-DQqp_ANL.mjs} +16 -1
  346. package/dist/{chunks/messages-Ck1-ddbo.mjs → messages-DThG2jW-2.mjs} +16 -1
  347. package/dist/{chunks/messages-DQfi2DoY.mjs → messages-DXlB7Vpm.mjs} +16 -1
  348. package/dist/{messages-VIQ8vjvS.mjs → messages-De0NAxJt.mjs} +15 -0
  349. package/dist/{chunks/messages-Bb80Csl3.mjs → messages-Depz8d3Q.mjs} +15 -0
  350. package/dist/{messages-BQaiScU1.mjs → messages-Dfsw3a8v.mjs} +16 -1
  351. package/dist/{messages-D9qgYMU82.mjs → messages-Dhmmqob82.mjs} +16 -1
  352. package/dist/{messages-DbE-riR52.mjs → messages-DmNUAv0e2.mjs} +16 -1
  353. package/dist/{messages-Ch-SytN8.mjs → messages-DrQaJrDO.mjs} +16 -1
  354. package/dist/{chunks/messages-C3rGCBi_.mjs → messages-DsksuHtZ.mjs} +16 -1
  355. package/dist/{chunks/messages-m-A6ArIM.mjs → messages-DzOVTq3E2.mjs} +16 -1
  356. package/dist/{messages-CskLLTiG2.mjs → messages-Igpt5WIA2.mjs} +16 -1
  357. package/dist/{messages-yuNINyS1.mjs → messages-JhpGtjjS.mjs} +16 -1
  358. package/dist/{chunks/messages-BbZz_Anm.mjs → messages-WCy1wiGS2.mjs} +16 -1
  359. package/dist/{chunks/messages-CRUb9o5k.mjs → messages-XbA-jXKc.mjs} +15 -0
  360. package/dist/{chunks/messages-BeS9EOEO.mjs → messages-imHGm9SI2.mjs} +16 -1
  361. package/dist/{messages-BQhHthxq2.mjs → messages-yTNyxXRV2.mjs} +16 -1
  362. package/dist/react.cjs +1 -1
  363. package/dist/react.mjs +1 -1
  364. package/dist/tools.cjs +1 -1
  365. package/dist/tools.mjs +2 -2
  366. package/package.json +3 -3
  367. package/src/components/i18n/locales/am/messages.json +16 -1
  368. package/src/components/i18n/locales/ar/messages.json +16 -1
  369. package/src/components/i18n/locales/az/messages.json +16 -1
  370. package/src/components/i18n/locales/bg/messages.json +16 -1
  371. package/src/components/i18n/locales/bn/messages.json +16 -1
  372. package/src/components/i18n/locales/bs/messages.json +16 -1
  373. package/src/components/i18n/locales/cs/messages.json +16 -1
  374. package/src/components/i18n/locales/da/messages.json +16 -1
  375. package/src/components/i18n/locales/de/messages.json +16 -1
  376. package/src/components/i18n/locales/dv/messages.json +16 -1
  377. package/src/components/i18n/locales/el/messages.json +16 -1
  378. package/src/components/i18n/locales/en/messages.json +15 -0
  379. package/src/components/i18n/locales/es/messages.json +15 -0
  380. package/src/components/i18n/locales/et/messages.json +15 -0
  381. package/src/components/i18n/locales/fa/messages.json +15 -0
  382. package/src/components/i18n/locales/fi/messages.json +15 -0
  383. package/src/components/i18n/locales/fil/messages.json +15 -0
  384. package/src/components/i18n/locales/fr/messages.json +15 -0
  385. package/src/components/i18n/locales/gu/messages.json +15 -0
  386. package/src/components/i18n/locales/he/messages.json +15 -0
  387. package/src/components/i18n/locales/hi/messages.json +15 -0
  388. package/src/components/i18n/locales/hr/messages.json +15 -0
  389. package/src/components/i18n/locales/hu/messages.json +15 -0
  390. package/src/components/i18n/locales/hy/messages.json +16 -1
  391. package/src/components/i18n/locales/id/messages.json +16 -1
  392. package/src/components/i18n/locales/it/messages.json +16 -1
  393. package/src/components/i18n/locales/ja/messages.json +16 -1
  394. package/src/components/i18n/locales/ka/messages.json +16 -1
  395. package/src/components/i18n/locales/km/messages.json +16 -1
  396. package/src/components/i18n/locales/kn/messages.json +16 -1
  397. package/src/components/i18n/locales/ko/messages.json +16 -1
  398. package/src/components/i18n/locales/ku/messages.json +16 -1
  399. package/src/components/i18n/locales/lo/messages.json +16 -1
  400. package/src/components/i18n/locales/lt/messages.json +16 -1
  401. package/src/components/i18n/locales/lv/messages.json +16 -1
  402. package/src/components/i18n/locales/mk/messages.json +16 -1
  403. package/src/components/i18n/locales/ml/messages.json +16 -1
  404. package/src/components/i18n/locales/mn/messages.json +16 -1
  405. package/src/components/i18n/locales/mr/messages.json +16 -1
  406. package/src/components/i18n/locales/ms/messages.json +16 -1
  407. package/src/components/i18n/locales/my/messages.json +16 -1
  408. package/src/components/i18n/locales/ne/messages.json +16 -1
  409. package/src/components/i18n/locales/nl/messages.json +16 -1
  410. package/src/components/i18n/locales/no/messages.json +16 -1
  411. package/src/components/i18n/locales/pa/messages.json +16 -1
  412. package/src/components/i18n/locales/pl/messages.json +16 -1
  413. package/src/components/i18n/locales/ps/messages.json +16 -1
  414. package/src/components/i18n/locales/pt/messages.json +16 -1
  415. package/src/components/i18n/locales/ro/messages.json +16 -1
  416. package/src/components/i18n/locales/ru/messages.json +16 -1
  417. package/src/components/i18n/locales/sd/messages.json +16 -1
  418. package/src/components/i18n/locales/si/messages.json +16 -1
  419. package/src/components/i18n/locales/sk/messages.json +16 -1
  420. package/src/components/i18n/locales/sl/messages.json +16 -1
  421. package/src/components/i18n/locales/sq/messages.json +16 -1
  422. package/src/components/i18n/locales/sr/messages.json +16 -1
  423. package/src/components/i18n/locales/sv/messages.json +16 -1
  424. package/src/components/i18n/locales/sw/messages.json +16 -1
  425. package/src/components/i18n/locales/ta/messages.json +16 -1
  426. package/src/components/i18n/locales/te/messages.json +16 -1
  427. package/src/components/i18n/locales/th/messages.json +16 -1
  428. package/src/components/i18n/locales/tr/messages.json +16 -1
  429. package/src/components/i18n/locales/ug/messages.json +16 -1
  430. package/src/components/i18n/locales/uk/messages.json +16 -1
  431. package/src/components/i18n/locales/ur/messages.json +16 -1
  432. package/src/components/i18n/locales/vi/messages.json +16 -1
  433. package/src/components/i18n/locales/yi/messages.json +16 -1
  434. package/src/components/i18n/locales/zh/messages.json +16 -1
  435. package/src/components/modules/api/blocks.ts +1 -1
  436. package/src/components/modules/blockManager/blockManager.ts +2 -2
  437. package/src/components/modules/paste/index.ts +31 -2
  438. package/src/components/modules/paste/notion-blocks-v3.ts +654 -0
  439. package/src/components/modules/paste/notion-preprocessor.ts +67 -0
  440. package/src/components/modules/yjs/serializer.ts +1 -1
  441. package/src/components/utils/data-model-transform.ts +15 -15
  442. package/src/components/utils/media-empty-state.ts +48 -5
  443. package/src/components/utils/popover/popover-desktop.ts +6 -3
  444. package/src/components/utils/tooltip.ts +5 -38
  445. package/src/markdown/markdown-handler.ts +1 -2
  446. package/src/styles/audio.css +348 -36
  447. package/src/styles/tables.css +10 -0
  448. package/src/tools/audio/constants.ts +6 -0
  449. package/src/tools/audio/controls.ts +53 -7
  450. package/src/tools/audio/cover-picker.ts +126 -0
  451. package/src/tools/audio/disc.ts +137 -0
  452. package/src/tools/audio/index.ts +114 -6
  453. package/src/tools/audio/liveliness.ts +26 -8
  454. package/src/tools/audio/ui.ts +39 -4
  455. package/types/api/tooltip.d.ts +40 -1
  456. package/types/data-formats/output-data.d.ts +5 -2
  457. package/types/index.d.ts +1 -4
  458. package/types/tools/database.d.ts +1 -1
  459. package/types/tools/header.d.ts +2 -1
  460. package/types/tools/list.d.ts +2 -1
  461. package/types/utils/popover/popover.d.ts +42 -1
  462. package/dist/chunks/architecture-7EHR7CIX-CGYZJshv.mjs +0 -3
  463. package/dist/chunks/channel-dq5ps1Yn.mjs +0 -5
  464. package/dist/chunks/classDiagram-4FO5ZUOK-C3CxSQxy.mjs +0 -29
  465. package/dist/chunks/classDiagram-v2-Q7XG4LA2-Ci_JeHz0.mjs +0 -29
  466. package/dist/chunks/constants-DmKwEMyC.cjs +0 -606
  467. package/dist/chunks/default-qigT1Xpq.mjs +0 -4
  468. package/dist/chunks/eventmodeling-FCH6USID-nCBtSITo.mjs +0 -3
  469. package/dist/chunks/gitGraph-WXDBUCRP-CN_MBj94.mjs +0 -3
  470. package/dist/chunks/info-J43DQDTF-xmJNmT0e.mjs +0 -3
  471. package/dist/chunks/packet-YPE3B663-3bNcBJRE.mjs +0 -3
  472. package/dist/chunks/pie-LRSECV5Y-YTwc-ZG1.mjs +0 -3
  473. package/dist/chunks/radar-GUYGQ44K-vfGwdTFY.mjs +0 -3
  474. package/dist/chunks/stateDiagram-v2-BHNVJYJU-D6E4HlFi.mjs +0 -27
  475. package/dist/chunks/tools-BcF1rHBg.cjs +0 -208
  476. package/dist/chunks/treeView-BLDUP644-BptrPFA0.mjs +0 -3
  477. package/dist/chunks/treemap-LRROVOQU-BbiNBKy3.mjs +0 -3
  478. package/dist/chunks/wardley-L42UT6IY-Ck6iMjTG.mjs +0 -3
@@ -0,0 +1,126 @@
1
+ import { matchesMime } from '../../components/utils/mime-match';
2
+ import type { I18nInstance } from '../../components/utils/tools';
3
+ import { tr } from './i18n';
4
+ import { COVER_TYPES, COVER_MAX_SIZE } from './constants';
5
+ import { promoteToTopLayer, removeFromTopLayer } from '../../components/utils/top-layer';
6
+ import {
7
+ renderMediaEmptyState,
8
+ type MediaEmptyStateElement,
9
+ } from '../../components/utils/media-empty-state';
10
+
11
+ /** Validate a chosen cover file. Returns an error message, or null when valid. */
12
+ export function validateCoverFile(file: File, i18n?: I18nInstance): string | null {
13
+ if (file.type && !matchesMime(file.type, [...COVER_TYPES])) {
14
+ return tr(i18n, 'tools.audio.coverErrorType', 'Choose an image file');
15
+ }
16
+ if (file.size > COVER_MAX_SIZE) {
17
+ return tr(i18n, 'tools.audio.coverErrorTooLarge', 'Image is too large');
18
+ }
19
+ return null;
20
+ }
21
+
22
+ export interface OpenCoverPickerOptions {
23
+ anchor: HTMLElement;
24
+ onFile(file: File): void;
25
+ onUrl(url: string): void;
26
+ onClose?(): void;
27
+ i18n?: I18nInstance;
28
+ }
29
+
30
+ export interface CoverPickerHandle {
31
+ close(): void;
32
+ setError(message: string | null): void;
33
+ }
34
+
35
+ export function openCoverPicker(opts: OpenCoverPickerOptions): CoverPickerHandle {
36
+ const dialog = document.createElement('div');
37
+ dialog.className = 'blok-audio-cover-picker';
38
+ dialog.setAttribute('data-role', 'audio-cover-picker');
39
+ dialog.setAttribute('role', 'dialog');
40
+ dialog.setAttribute('aria-label', tr(opts.i18n, 'tools.audio.coverSet', 'Set cover image'));
41
+
42
+ const surface: MediaEmptyStateElement = renderMediaEmptyState({
43
+ acceptTypes: [...COVER_TYPES],
44
+ onFile: opts.onFile,
45
+ onUrl: opts.onUrl,
46
+ // The picker is a floating popover, so the inline height tween only reads as
47
+ // lag here. Slide the incoming panel in from the travel direction instead —
48
+ // the swap keeps its personality while the popover resizes instantly.
49
+ swap: 'slide',
50
+ labels: {
51
+ add: tr(opts.i18n, 'tools.audio.coverAdd', 'Add a cover'),
52
+ upload: tr(opts.i18n, 'tools.audio.coverUpload', 'Upload'),
53
+ embed: tr(opts.i18n, 'tools.audio.coverLink', 'Link'),
54
+ chooseFile: tr(opts.i18n, 'tools.audio.coverChooseFile', 'Choose file'),
55
+ orDropHere: tr(opts.i18n, 'tools.audio.coverOrDropHere', 'or drop an image here'),
56
+ dropToUpload: tr(opts.i18n, 'tools.audio.coverDropToUpload', 'Drop to upload'),
57
+ urlPlaceholder: tr(opts.i18n, 'tools.audio.coverUrlPlaceholder', 'Paste an image URL…'),
58
+ urlAria: tr(opts.i18n, 'tools.audio.coverUrlAria', 'Image URL'),
59
+ submit: tr(opts.i18n, 'tools.audio.coverInsert', 'Insert'),
60
+ sourceAria: tr(opts.i18n, 'tools.audio.coverSourceAria', 'Cover source'),
61
+ },
62
+ });
63
+ dialog.appendChild(surface);
64
+
65
+ document.body.appendChild(dialog);
66
+ promoteToTopLayer(dialog);
67
+ position(dialog, opts.anchor);
68
+
69
+ const state = { detached: false };
70
+
71
+ const detach = (): void => {
72
+ if (state.detached) return;
73
+ state.detached = true;
74
+ document.removeEventListener('keydown', onKeyDown, true);
75
+ document.removeEventListener('mousedown', onOutside);
76
+ window.removeEventListener('resize', reposition);
77
+ window.removeEventListener('scroll', reposition, true);
78
+ removeFromTopLayer(dialog);
79
+ dialog.remove();
80
+ };
81
+
82
+ const close = (): void => {
83
+ detach();
84
+ opts.onClose?.();
85
+ };
86
+
87
+ const onKeyDown = (event: KeyboardEvent): void => {
88
+ if (event.key === 'Escape') {
89
+ event.preventDefault();
90
+ event.stopPropagation();
91
+ close();
92
+ }
93
+ };
94
+
95
+ const onOutside = (event: MouseEvent): void => {
96
+ const target = event.target as Node | null;
97
+ if (target && (dialog.contains(target) || opts.anchor.contains(target))) return;
98
+ close();
99
+ };
100
+
101
+ function reposition(): void {
102
+ if (state.detached) return;
103
+ position(dialog, opts.anchor);
104
+ }
105
+
106
+ // Capture phase for Escape so it beats the editor's own key handling.
107
+ document.addEventListener('keydown', onKeyDown, true);
108
+ document.addEventListener('mousedown', onOutside);
109
+ window.addEventListener('resize', reposition);
110
+ window.addEventListener('scroll', reposition, true);
111
+
112
+ return {
113
+ close,
114
+ setError: (message) => surface.setError(message),
115
+ };
116
+ }
117
+
118
+ function position(dialog: HTMLElement, anchor: HTMLElement): void {
119
+ const rect = anchor.getBoundingClientRect();
120
+ const gap = 8;
121
+ const { style } = dialog;
122
+ style.position = 'fixed';
123
+ style.top = `${rect.bottom + gap}px`;
124
+ style.left = `${Math.max(8, rect.left)}px`;
125
+ style.right = 'auto';
126
+ }
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Inertial platter spin for the no-cover vinyl record.
3
+ *
4
+ * With the tonearm gone, the disc is the whole show — so it shouldn't just snap
5
+ * on and off. A real platter has mass: it spins UP when the motor engages and
6
+ * COASTS DOWN when power is cut. We model that with an angular velocity that
7
+ * eases toward a target (full speed while playing, 0 when stopped) and integrate
8
+ * it into an accumulated angle each animation frame, driving the disc's
9
+ * `transform: rotate()` directly. Spin-up is brisk; the wind-down uses a longer
10
+ * time constant, so pausing reads as a heavy record slowing to rest rather than
11
+ * stopping dead.
12
+ *
13
+ * The velocity easing is exponential (frame-rate independent — see stepPlatter),
14
+ * so it behaves identically on a 60Hz or 120Hz display. All of it is gated on
15
+ * prefers-reduced-motion: the record simply holds still.
16
+ */
17
+
18
+ /** Platter motion state: accumulated angle (deg, wrapped) + angular speed (deg/s). */
19
+ export interface PlatterState {
20
+ angle: number;
21
+ velocity: number;
22
+ }
23
+
24
+ /** Target speed at a 33⅓-feel — one full turn every ~4s. */
25
+ export const PLATTER_FULL_DPS = 90;
26
+ /** Time constant (s) for the motor coming up to speed — brisk. */
27
+ export const PLATTER_SPINUP_TAU = 0.5;
28
+ /** Time constant (s) for the platter coasting to rest — heavier, slower. */
29
+ export const PLATTER_SPINDOWN_TAU = 1.2;
30
+ /** Below this speed (deg/s) the coast is over — snap to rest and park the loop. */
31
+ const PLATTER_REST_DPS = 0.5;
32
+ /** Clamp per-frame dt so a backgrounded tab doesn't fling the disc on return. */
33
+ const MAX_FRAME_S = 0.05;
34
+
35
+ /**
36
+ * Advance the platter one frame (pure). Velocity eases toward `targetDps` with an
37
+ * exponential approach over `tauSec`, then the angle integrates that velocity.
38
+ *
39
+ * The approach uses `1 - e^(-dt/tau)`, which composes exactly across substeps
40
+ * (one step of 2·dt equals two steps of dt), so the spin speed is frame-rate
41
+ * independent. A non-positive dt is treated as a no-op.
42
+ */
43
+ export function stepPlatter(
44
+ state: PlatterState,
45
+ dtSec: number,
46
+ targetDps: number,
47
+ tauSec: number,
48
+ ): PlatterState {
49
+ if (dtSec <= 0) return { angle: state.angle, velocity: state.velocity };
50
+ const approach = 1 - Math.exp(-dtSec / tauSec);
51
+ const velocity = state.velocity + (targetDps - state.velocity) * approach;
52
+ const angle = ((state.angle + velocity * dtSec) % 360 + 360) % 360;
53
+ return { angle, velocity };
54
+ }
55
+
56
+ export interface PlatterHandle {
57
+ /** Engage the motor — the disc spins up to full speed. */
58
+ start(): void;
59
+ /** Cut the motor — the disc coasts down to rest. */
60
+ stop(): void;
61
+ /** Permanent teardown — cancels the frame loop. */
62
+ destroy(): void;
63
+ }
64
+
65
+ function prefersReduced(): boolean {
66
+ return globalThis.matchMedia?.('(prefers-reduced-motion: reduce)').matches ?? false;
67
+ }
68
+
69
+ /**
70
+ * Drive the no-cover record's spin with inertia. `start()`/`stop()` set the
71
+ * target speed; a single rAF loop eases velocity toward it and writes the disc's
72
+ * rotation each frame, parking itself once the platter has fully coasted to rest.
73
+ */
74
+ export function createPlatterSpin(figure: HTMLElement): PlatterHandle {
75
+ // Mutable state on a const record (the repo bans `let`).
76
+ const state: {
77
+ angle: number;
78
+ velocity: number;
79
+ target: number;
80
+ raf: number | null;
81
+ last: number;
82
+ } = { angle: 0, velocity: 0, target: 0, raf: null, last: 0 };
83
+
84
+ const disc = (): HTMLElement | null => figure.querySelector('.blok-audio-cover__disc');
85
+
86
+ const tick = (now: number): void => {
87
+ const dt = state.last ? Math.min((now - state.last) / 1000, MAX_FRAME_S) : 0;
88
+ state.last = now;
89
+ // Spin-up while accelerating toward the target; the heavier coast on the way down.
90
+ const tau = state.target > state.velocity ? PLATTER_SPINUP_TAU : PLATTER_SPINDOWN_TAU;
91
+ const next = stepPlatter({ angle: state.angle, velocity: state.velocity }, dt, state.target, tau);
92
+ state.angle = next.angle;
93
+ state.velocity = next.velocity;
94
+
95
+ const el = disc();
96
+ if (el) el.style.transform = `rotate(${state.angle.toFixed(2)}deg)`;
97
+
98
+ // Coasted to a halt — snap clean and let the loop sleep until the next start().
99
+ if (state.target === 0 && state.velocity < PLATTER_REST_DPS) {
100
+ state.velocity = 0;
101
+ state.raf = null;
102
+ return;
103
+ }
104
+ state.raf = globalThis.requestAnimationFrame(tick);
105
+ };
106
+
107
+ const ensureRunning = (): void => {
108
+ if (state.raf !== null) return;
109
+ state.last = 0; // first frame measures dt=0, so no jump from a stale timestamp
110
+ state.raf = globalThis.requestAnimationFrame(tick);
111
+ };
112
+
113
+ const start = (): void => {
114
+ if (prefersReduced()) return; // reduced motion: the record holds still
115
+ if (!disc()) return; // cover image shown (no placeholder disc) — nothing to spin
116
+ state.target = PLATTER_FULL_DPS;
117
+ ensureRunning();
118
+ };
119
+
120
+ const stop = (): void => {
121
+ state.target = 0;
122
+ // Keep the loop alive to animate the wind-down; if it's already at rest
123
+ // (or never spun up under reduced motion) there's nothing to coast.
124
+ if (state.velocity > 0) ensureRunning();
125
+ };
126
+
127
+ const destroy = (): void => {
128
+ if (state.raf !== null) {
129
+ globalThis.cancelAnimationFrame(state.raf);
130
+ state.raf = null;
131
+ }
132
+ state.velocity = 0;
133
+ state.target = 0;
134
+ };
135
+
136
+ return { start, stop, destroy };
137
+ }
@@ -18,15 +18,18 @@ import {
18
18
  IconCaption,
19
19
  IconCopy,
20
20
  IconDownload,
21
+ IconImage,
21
22
  IconMusic,
22
23
  IconPlayerLoop,
23
24
  IconReplace,
25
+ IconTrash,
24
26
  } from '../../components/icons';
25
27
  import { renderUploadingState, type UploadingStateElement } from '../image/uploading-state';
26
28
  import { DEFAULT_CAPTION_PLACEHOLDER, URL_PATTERN } from './constants';
27
29
  import { renderEmptyState, type EmptyStateElement } from './empty-state';
28
30
  import { tr } from './i18n';
29
31
  import { renderCaptionRow, renderNowPlaying } from './ui';
32
+ import { openCoverPicker, validateCoverFile, type CoverPickerHandle } from './cover-picker';
30
33
  import { attachControls, type ControlsHandle } from './controls';
31
34
  import { attachWaveform, decodePeaks, type WaveformHandle } from './waveform';
32
35
  import { readTrackMetadata, resolveCover } from './metadata';
@@ -52,6 +55,7 @@ export class AudioTool implements BlockTool {
52
55
  private controlsHandle: ControlsHandle | null = null;
53
56
  private waveformHandle: WaveformHandle | null = null;
54
57
  private destroyed = false;
58
+ private coverPicker: CoverPickerHandle | null = null;
55
59
  /** Pending fallback timer for the caption collapse-out animation. */
56
60
  private captionExitTimer: ReturnType<typeof setTimeout> | null = null;
57
61
 
@@ -124,7 +128,13 @@ export class AudioTool implements BlockTool {
124
128
  }
125
129
 
126
130
  public getToolbarAnchorElement(): HTMLElement | undefined {
127
- return this.root?.querySelector<HTMLElement>('[data-role="audio-figure"]') ?? undefined;
131
+ // Anchor on the top-of-card marker so the +/tunes buttons sit flush with the
132
+ // top of the cover art. Fall back to the figure if the marker isn't present.
133
+ return (
134
+ this.root?.querySelector<HTMLElement>('[data-role="audio-toolbar-anchor"]') ??
135
+ this.root?.querySelector<HTMLElement>('[data-role="audio-figure"]') ??
136
+ undefined
137
+ );
128
138
  }
129
139
 
130
140
  public setReadOnly(state: boolean): void {
@@ -182,6 +192,22 @@ export class AudioTool implements BlockTool {
182
192
  closeOnActivate: true,
183
193
  onActivate: (): void => this.transitionToEmpty(),
184
194
  },
195
+ {
196
+ icon: IconImage,
197
+ title: tr(i18n, 'tools.audio.coverSet', 'Set cover image'),
198
+ name: 'audio-cover-set',
199
+ closeOnActivate: true,
200
+ onActivate: (): void => this.openCoverPicker(),
201
+ },
202
+ ...(this.data.coverUrl
203
+ ? [{
204
+ icon: IconTrash,
205
+ title: tr(i18n, 'tools.audio.coverRemove', 'Remove cover'),
206
+ name: 'audio-cover-remove',
207
+ closeOnActivate: true,
208
+ onActivate: (): void => this.removeCover(),
209
+ }]
210
+ : []),
185
211
  {
186
212
  icon: IconDownload,
187
213
  title: tr(i18n, 'tools.audio.download', 'Download'),
@@ -209,6 +235,11 @@ export class AudioTool implements BlockTool {
209
235
  if (this.data.url.startsWith('blob:')) {
210
236
  URL.revokeObjectURL(this.data.url);
211
237
  }
238
+ if (this.data.coverUrl?.startsWith('blob:')) {
239
+ URL.revokeObjectURL(this.data.coverUrl);
240
+ }
241
+ this.coverPicker?.close();
242
+ this.coverPicker = null;
212
243
  }
213
244
 
214
245
  private startUpload(file: File): void {
@@ -373,10 +404,11 @@ export class AudioTool implements BlockTool {
373
404
  const titlePlaceholder = tr(this.api.i18n, 'tools.audio.titlePlaceholder', 'Track title');
374
405
  const artistPlaceholder = tr(this.api.i18n, 'tools.audio.artistPlaceholder', 'Artist');
375
406
 
376
- const { figure, audio, waveformMount, title, artist, body } = renderNowPlaying(this.data, {
407
+ const { figure, audio, waveformMount, title, artist, body, coverButton } = renderNowPlaying(this.data, {
377
408
  editable: !this.readOnly,
378
409
  titlePlaceholder,
379
410
  artistPlaceholder,
411
+ coverChangeLabel: tr(this.api.i18n, 'tools.audio.coverChange', 'Change cover'),
380
412
  });
381
413
 
382
414
  // Waveform (if peaks are available)
@@ -418,6 +450,8 @@ export class AudioTool implements BlockTool {
418
450
  }
419
451
  });
420
452
 
453
+ coverButton?.addEventListener('click', () => this.openCoverPicker());
454
+
421
455
  this.root.appendChild(figure);
422
456
  }
423
457
 
@@ -480,9 +514,11 @@ export class AudioTool implements BlockTool {
480
514
  return;
481
515
  }
482
516
  const row = this.createCaptionRow();
517
+ // Appended at full height immediately (a single layout step); is-collapsed
518
+ // only offsets/fades the inner, so the reveal animates on the compositor.
483
519
  row.classList.add('is-collapsed');
484
520
  figure.appendChild(row);
485
- // Force a reflow so the collapsed state is committed, then expand into view.
521
+ // Commit the collapsed start frame, then settle the inner into place.
486
522
  void row.offsetHeight;
487
523
  row.classList.remove('is-collapsed');
488
524
  }
@@ -493,11 +529,13 @@ export class AudioTool implements BlockTool {
493
529
  row.classList.add('is-collapsed');
494
530
  const finish = (): void => {
495
531
  if (this.captionExitTimer) { clearTimeout(this.captionExitTimer); this.captionExitTimer = null; }
532
+ row.removeEventListener('transitionend', onEnd);
496
533
  row.remove();
497
534
  };
498
- row.addEventListener('transitionend', (e) => {
499
- if (e.propertyName === 'grid-template-rows') finish();
500
- }, { once: true });
535
+ const onEnd = (e: TransitionEvent): void => {
536
+ if (e.propertyName === 'opacity') finish();
537
+ };
538
+ row.addEventListener('transitionend', onEnd);
501
539
  // Fallback in case transitionend never fires (display:none, interrupted, etc.).
502
540
  this.captionExitTimer = setTimeout(finish, 360);
503
541
  }
@@ -534,4 +572,74 @@ export class AudioTool implements BlockTool {
534
572
  void clip.writeText(this.data.url);
535
573
  }
536
574
  }
575
+
576
+ private openCoverPicker(): void {
577
+ if (this.readOnly) return;
578
+ const anchor = this.root?.querySelector<HTMLElement>('[data-role="audio-cover"]');
579
+ if (!anchor) return;
580
+ this.coverPicker?.close();
581
+ // Keep the cover's hover affordance (scrim + change icon) lit while the
582
+ // picker is open — the pointer has left the cover for the popup, so :hover
583
+ // alone would drop it.
584
+ anchor.classList.add('is-picker-open');
585
+ this.coverPicker = openCoverPicker({
586
+ anchor,
587
+ i18n: this.api.i18n,
588
+ onFile: (file) => this.applyCoverFile(file),
589
+ onUrl: (url) => this.applyCoverUrl(url),
590
+ onClose: () => {
591
+ anchor.classList.remove('is-picker-open');
592
+ this.coverPicker = null;
593
+ },
594
+ });
595
+ }
596
+
597
+ private applyCoverFile(file: File): void {
598
+ const error = validateCoverFile(file, this.api.i18n);
599
+ if (error) {
600
+ this.coverPicker?.setError(error);
601
+ return;
602
+ }
603
+ const uploader = this.config.uploader;
604
+ const upload = uploader?.uploadByFile
605
+ ? uploader.uploadByFile(file).then((res) => res.url)
606
+ : Promise.resolve(URL.createObjectURL(file));
607
+ void upload
608
+ .then((url) => {
609
+ if (this.destroyed) {
610
+ // Block was removed mid-upload: a no-uploader blob URL would otherwise
611
+ // leak (it was never assigned to coverUrl, so removed() can't revoke it).
612
+ if (url.startsWith('blob:')) URL.revokeObjectURL(url);
613
+ return;
614
+ }
615
+ this.setCover(url);
616
+ this.coverPicker?.close();
617
+ })
618
+ .catch(() => {
619
+ this.coverPicker?.setError(
620
+ tr(this.api.i18n, 'tools.audio.errorUploadFailed', 'Upload failed')
621
+ );
622
+ });
623
+ }
624
+
625
+ private applyCoverUrl(url: string): void {
626
+ this.setCover(url);
627
+ this.coverPicker?.close();
628
+ }
629
+
630
+ private setCover(url: string): void {
631
+ const prev = this.data.coverUrl;
632
+ if (prev && prev !== url && prev.startsWith('blob:')) URL.revokeObjectURL(prev);
633
+ this.data.coverUrl = url;
634
+ this.renderState();
635
+ this.block.dispatchChange();
636
+ }
637
+
638
+ private removeCover(): void {
639
+ const prev = this.data.coverUrl;
640
+ if (prev?.startsWith('blob:')) URL.revokeObjectURL(prev);
641
+ this.data.coverUrl = undefined;
642
+ this.renderState();
643
+ this.block.dispatchChange();
644
+ }
537
645
  }
@@ -70,10 +70,21 @@ export function ambientWave(index: number, timeSeconds: number): number {
70
70
  return a * 0.6 + b * 0.4;
71
71
  }
72
72
 
73
+ /** Comet-body lift at the playhead, tapering out along the wake/leading edge. */
74
+ const COMET_FLOOR = 0.34;
75
+ /** Extra lift layered onto the tight head spike right under the playhead. */
76
+ const HEAD_FLOOR = 0.5;
77
+ /**
78
+ * How hard the comet pulses, as a fraction of its floor. Kept < 1 so the
79
+ * downward half of the swing never drops a bar below its lifted base — the
80
+ * dance reads as a strong pump, never a hole punched into the waveform.
81
+ */
82
+ const DANCE_THROW = 0.82;
83
+
73
84
  /** Ambient swing applied to every bar (the faint preview-side breath). */
74
- const AMBIENT_BASE = 0.035;
85
+ const AMBIENT_BASE = 0.04;
75
86
  /** Extra ambient swing layered onto the played side (the shimmering wake). */
76
- const AMBIENT_PLAYED = 0.06;
87
+ const AMBIENT_PLAYED = 0.17;
77
88
  /** Bars ahead of the playhead over which the played-side shimmer fades out. */
78
89
  const AMBIENT_AHEAD_FADE = 26;
79
90
 
@@ -119,16 +130,23 @@ export function liveAmplitude(opts: LiveAmplitudeOptions): number {
119
130
  if (reduced || energy <= 0) return basePeak;
120
131
 
121
132
  const distance = index - playheadIndex;
122
-
123
- // Layer 1 — focal comet near the playhead.
124
133
  const env = cometEnvelope(distance);
125
134
  const head = headFocus(distance);
126
- const comet = env * 0.15 + head * 0.2 + env * 0.28 * barWobble(index, timeSeconds);
127
135
 
128
- // Layer 2global ambient ripple. Full strength behind the playhead (the
129
- // played wake), fading across AMBIENT_AHEAD_FADE bars into the preview ahead.
136
+ // Layer 1focal comet. A guaranteed-positive "alive" floor blooms at the
137
+ // playhead and tapers along the wake, lifting even silent bars into view. A
138
+ // vigorous bidirectional pulse then rides on top — but its swing is capped at
139
+ // DANCE_THROW of the floor, so the trough stays at/above the lifted base. Big
140
+ // visible motion, yet it can never gouge a bar back down to a flat dot.
141
+ const floor = env * COMET_FLOOR + head * HEAD_FLOOR;
142
+ const comet = floor * (1 + DANCE_THROW * barWobble(index, timeSeconds));
143
+
144
+ // Layer 2 — global ambient breath. Rectified to [0, 1] so it only adds, it
145
+ // keeps the whole field shimmering: full strength on the played wake, fading
146
+ // across AMBIENT_AHEAD_FADE bars into the preview ahead.
130
147
  const playedBias = distance <= 0 ? 1 : Math.max(0, 1 - distance / AMBIENT_AHEAD_FADE);
131
- const ambient = ambientWave(index, timeSeconds) * (AMBIENT_BASE + AMBIENT_PLAYED * playedBias);
148
+ const ripple = (ambientWave(index, timeSeconds) + 1) / 2;
149
+ const ambient = ripple * (AMBIENT_BASE + AMBIENT_PLAYED * playedBias);
132
150
 
133
151
  const amp = basePeak + (comet + ambient) * energy;
134
152
 
@@ -1,10 +1,11 @@
1
- import { IconMusic } from '../../components/icons';
2
1
  import type { AudioData } from '../../../types/tools/audio';
2
+ import { IconImage } from '../../components/icons';
3
3
 
4
4
  export interface NowPlayingOptions {
5
5
  editable: boolean;
6
6
  titlePlaceholder?: string;
7
7
  artistPlaceholder?: string;
8
+ coverChangeLabel?: string;
8
9
  }
9
10
 
10
11
  export interface NowPlayingElements {
@@ -15,6 +16,7 @@ export interface NowPlayingElements {
15
16
  waveformMount: HTMLElement;
16
17
  title: HTMLElement;
17
18
  artist: HTMLElement;
19
+ coverButton?: HTMLButtonElement;
18
20
  }
19
21
 
20
22
  function editableLine(role: string, value: string | undefined, editable: boolean, placeholder?: string): HTMLElement {
@@ -32,6 +34,15 @@ export function renderNowPlaying(data: AudioData, opts: NowPlayingOptions): NowP
32
34
  figure.setAttribute('data-role', 'audio-figure');
33
35
  figure.style.margin = '0';
34
36
 
37
+ // Zero-size marker pinned to the top of the card. The editor's toolbar centers
38
+ // the +/tunes buttons on the *first line* of the anchor it's handed; anchoring
39
+ // to this top marker (instead of the whole figure) lands those buttons flush
40
+ // with the top of the cover art rather than a line-height below it.
41
+ const toolbarAnchor = document.createElement('span');
42
+ toolbarAnchor.className = 'blok-audio-toolbar-anchor';
43
+ toolbarAnchor.setAttribute('data-role', 'audio-toolbar-anchor');
44
+ toolbarAnchor.setAttribute('aria-hidden', 'true');
45
+
35
46
  const cover = document.createElement('div');
36
47
  cover.className = 'blok-audio-cover';
37
48
  cover.setAttribute('data-role', 'audio-cover');
@@ -41,10 +52,18 @@ export function renderNowPlaying(data: AudioData, opts: NowPlayingOptions): NowP
41
52
  img.alt = '';
42
53
  cover.appendChild(img);
43
54
  } else {
55
+ // No artwork: stand a glossy black vinyl record in the panel instead of a
56
+ // flat "missing image" glyph. The disc (grooves + cream label + spindle, with
57
+ // a fixed specular it shimmers under) is pure CSS; its rotation is driven by
58
+ // disc.ts, which spins the platter up when the track plays and lets it coast
59
+ // down on pause — like a real turntable with mass.
44
60
  const placeholder = document.createElement('span');
45
61
  placeholder.className = 'blok-audio-cover__placeholder';
46
62
  placeholder.setAttribute('aria-hidden', 'true');
47
- placeholder.innerHTML = IconMusic;
63
+ const disc = document.createElement('span');
64
+ disc.className = 'blok-audio-cover__disc';
65
+ disc.setAttribute('data-role', 'audio-cover-disc');
66
+ placeholder.append(disc);
48
67
  cover.appendChild(placeholder);
49
68
  }
50
69
 
@@ -62,6 +81,22 @@ export function renderNowPlaying(data: AudioData, opts: NowPlayingOptions): NowP
62
81
  });
63
82
  cover.appendChild(eq);
64
83
 
84
+ const coverButton = ((): HTMLButtonElement | undefined => {
85
+ if (!opts.editable) {
86
+ return undefined;
87
+ }
88
+
89
+ const button = document.createElement('button');
90
+ button.type = 'button';
91
+ button.className = 'blok-audio-cover__change';
92
+ button.setAttribute('data-role', 'audio-cover-change');
93
+ button.setAttribute('aria-label', opts.coverChangeLabel ?? 'Change cover');
94
+ button.innerHTML = IconImage;
95
+ cover.appendChild(button);
96
+
97
+ return button;
98
+ })();
99
+
65
100
  const title = editableLine('audio-title', data.title, opts.editable, opts.titlePlaceholder);
66
101
  title.className = 'blok-audio-title';
67
102
  const artist = editableLine('audio-artist', data.artist, opts.editable, opts.artistPlaceholder);
@@ -83,8 +118,8 @@ export function renderNowPlaying(data: AudioData, opts: NowPlayingOptions): NowP
83
118
  audio.tabIndex = 0;
84
119
  if (data.loop) audio.loop = true;
85
120
 
86
- figure.append(cover, body, audio);
87
- return { figure, audio, cover, body, waveformMount, title, artist };
121
+ figure.append(toolbarAnchor, cover, body, audio);
122
+ return { figure, audio, cover, body, waveformMount, title, artist, coverButton };
88
123
  }
89
124
 
90
125
  export interface CaptionRowOptions {
@@ -1,7 +1,46 @@
1
1
  /**
2
2
  * Tooltip API
3
3
  */
4
- import {TooltipContent, TooltipOptions} from '../../src/components/utils/tooltip';
4
+
5
+ /**
6
+ * Tooltip supported content
7
+ */
8
+ export type TooltipContent = HTMLElement | DocumentFragment | Node | string;
9
+
10
+ /**
11
+ * Base options interface for tooltips
12
+ */
13
+ export interface TooltipOptions {
14
+ /**
15
+ * Tooltip placement: top|bottom|left|right
16
+ */
17
+ placement?: string;
18
+
19
+ /**
20
+ * Tooltip top margin
21
+ */
22
+ marginTop?: number;
23
+
24
+ /**
25
+ * Tooltip left margin
26
+ */
27
+ marginLeft?: number;
28
+
29
+ /**
30
+ * Tooltip right margin
31
+ */
32
+ marginRight?: number;
33
+
34
+ /**
35
+ * Tooltip bottom margin
36
+ */
37
+ marginBottom?: number;
38
+
39
+ /**
40
+ * Timeout before showing
41
+ */
42
+ delay?: number;
43
+ }
5
44
 
6
45
  export interface Tooltip {
7
46
  /**
@@ -6,9 +6,12 @@ import { BlockId } from './block-id';
6
6
  * Output of one Tool
7
7
  *
8
8
  * @template Type - the string literal describing a tool type
9
- * @template Data - the structure describing a data object supported by the tool
9
+ * @template Data - the structure describing a data object supported by the tool.
10
+ * Defaults to `Record<string, unknown>` (matching {@link BlockToolData}) so
11
+ * reading saved block data is type-guarded: property access yields `unknown`,
12
+ * not `any`. Pass a concrete shape for fully-typed access.
10
13
  */
11
- export interface OutputBlockData<Type extends string = string, Data extends object = any> {
14
+ export interface OutputBlockData<Type extends string = string, Data extends object = Record<string, unknown>> {
12
15
  /**
13
16
  * Unique Id of the block
14
17
  */