@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.
- package/dist/blok.cjs +1 -1
- package/dist/blok.iife.js +13 -13
- package/dist/blok.mjs +2 -2
- package/dist/blok.umd.js +30 -30
- package/dist/chunks/{APEv2Parser-WvRvu4zL.mjs → APEv2Parser-dFboX-HT.mjs} +5 -5
- package/dist/chunks/{AbstractID3Parser-DM9acVTg.mjs → AbstractID3Parser-qvoGRhB4.mjs} +5 -5
- package/dist/chunks/{AiffParser-C_VaWeb5.mjs → AiffParser-DVe3cNKY.mjs} +5 -5
- package/dist/chunks/{AsfParser-CH5F_9Wp.mjs → AsfParser-DrzvMHO9.mjs} +7 -7
- package/dist/chunks/{BasicParser-BFTgNkp-.mjs → BasicParser-BLAlEKys.mjs} +2 -2
- package/dist/chunks/{DsdiffParser-BAdYwB7y.mjs → DsdiffParser-uZBv6Bc_.mjs} +5 -5
- package/dist/chunks/{DsfParser-DWMLfBH1.mjs → DsfParser-DLra1i8X.mjs} +5 -5
- package/dist/chunks/{FlacParser-BdKXrY7L.mjs → FlacParser-DGd7sQuD.mjs} +6 -6
- package/dist/chunks/{ID3v1Parser-DoxlznrE.mjs → ID3v1Parser-CJMR_CT_.mjs} +3 -3
- package/dist/chunks/{ID3v2Parser-BIrxzjBm.mjs → ID3v2Parser-DIc0X1ee.mjs} +8 -8
- package/dist/chunks/{ID3v2Token-D5v9lCfb.mjs → ID3v2Token-BqnbpNYB.mjs} +3 -3
- package/dist/chunks/{MP4Parser-0KMJ-q2k.mjs → MP4Parser-BqrCfJyp.mjs} +6 -6
- package/dist/chunks/{MatroskaParser-fxFuCddu.mjs → MatroskaParser-CCbZmX7j.mjs} +5 -5
- package/dist/chunks/{MpegParser-R-6QiuhU.mjs → MpegParser-C-6l3Wrf.mjs} +6 -6
- package/dist/chunks/{MusepackParser-DFLoF47O.mjs → MusepackParser-C_PhW_BV.mjs} +5 -5
- package/dist/chunks/{OggParser-C1qP2qC7.mjs → OggParser-DJhcSH9h.mjs} +6 -6
- package/dist/chunks/{Util-DiBcLCh8.mjs → Util-B42SDwrM.mjs} +3 -3
- package/dist/chunks/{WavPackParser-Ck8xXsNf.mjs → WavPackParser-CuHju62S.mjs} +4 -4
- package/dist/chunks/{WaveParser-hxQlWijT.mjs → WaveParser-DvEqNnGt.mjs} +6 -6
- package/dist/chunks/{aiden0z-pptx-renderer.es-Y1OhS20L.mjs → aiden0z-pptx-renderer.es-Dfc1LJvS.mjs} +2 -2
- package/dist/chunks/{arc-Cu-PSKKo.mjs → arc-8pYAfiNC.mjs} +3 -3
- package/dist/chunks/architecture-7EHR7CIX-ByEay9F_.mjs +3 -0
- package/dist/chunks/{architectureDiagram-3BPJPVTR-BwW1QjqZ.mjs → architectureDiagram-3BPJPVTR-BiykAn02.mjs} +9 -9
- package/dist/chunks/{blockDiagram-GPEHLZMM-BAgQo64R.mjs → blockDiagram-GPEHLZMM-CozNEkEK.mjs} +13 -13
- package/dist/chunks/{blok-C52qeiPg.mjs → blok-C72PuzIT.mjs} +2514 -2109
- package/dist/chunks/{blok-gFn3FI95.cjs → blok-uBjibRae.cjs} +11 -11
- package/dist/chunks/{c4Diagram-AAUBKEIU-BQe-CDb8.mjs → c4Diagram-AAUBKEIU-DN5cpztO.mjs} +6 -6
- package/dist/chunks/channel-DCfRAw7p.mjs +5 -0
- package/dist/chunks/{chunk-2J33WTMH-CMyTQPbw.mjs → chunk-2J33WTMH-CHv7Whe1.mjs} +3 -3
- package/dist/chunks/{chunk-3OPIFGDE-_lgEHnzc.mjs → chunk-3OPIFGDE-BRLjwZDG.mjs} +8 -8
- package/dist/chunks/{chunk-4BX2VUAB-8PQvWn-w.mjs → chunk-4BX2VUAB-CrVP7ooQ.mjs} +2 -2
- package/dist/chunks/{chunk-4EGX6M5U-D4gnRnMD.mjs → chunk-4EGX6M5U-t1h05MXS.mjs} +2 -2
- package/dist/chunks/{chunk-55IACEB6-eQD6P1N8.mjs → chunk-55IACEB6-Cq7FTvxb.mjs} +2 -2
- package/dist/chunks/{chunk-5DO6E6H7-CN3lZIoE.mjs → chunk-5DO6E6H7-Z2pYCl69.mjs} +2 -2
- package/dist/chunks/{chunk-5ZQYHXKU-CPXVTQ_e.mjs → chunk-5ZQYHXKU-fs0GqOvF.mjs} +43 -43
- package/dist/chunks/{chunk-727SXJPM-DZUlPaIu.mjs → chunk-727SXJPM-BKsM41W3.mjs} +9 -9
- package/dist/chunks/{chunk-AQP2D5EJ-D7G094pS.mjs → chunk-AQP2D5EJ-YdXH_I-o.mjs} +7 -7
- package/dist/chunks/{chunk-BR22UD5L-B6NbSBJl.mjs → chunk-BR22UD5L-CqFDPfGM.mjs} +2 -2
- package/dist/chunks/{chunk-BSJP7CBP-C7FGlEZG.mjs → chunk-BSJP7CBP-DpGSyAQh.mjs} +2 -2
- package/dist/chunks/{chunk-CSCIHK7Q-C4qT3Yrk.mjs → chunk-CSCIHK7Q-BO7tl9ID.mjs} +4 -4
- package/dist/chunks/{chunk-FHYWG6QK-CgSYG-YQ.mjs → chunk-FHYWG6QK-5Het-98V.mjs} +2 -2
- package/dist/chunks/{chunk-FMBD7UC4-2p6fg26u.mjs → chunk-FMBD7UC4-P_kboMJT.mjs} +2 -2
- package/dist/chunks/{chunk-KSCS5N6A-BVWs3LbG.mjs → chunk-KSCS5N6A-CvZAQU-1.mjs} +11 -11
- package/dist/chunks/{chunk-L5ZTLDWV-BFEdycvM.mjs → chunk-L5ZTLDWV-DZEL0gsI.mjs} +4 -4
- package/dist/chunks/{chunk-LZXEDZCA-6drnUsNy.mjs → chunk-LZXEDZCA-CRJ7-DY6.mjs} +8 -8
- package/dist/chunks/{chunk-MPE355IW-DHYWughe.mjs → chunk-MPE355IW-DLg3CsBw.mjs} +2 -2
- package/dist/chunks/{chunk-MZUSXYTE-BmUr1KX3.mjs → chunk-MZUSXYTE-CvsgXeJO.mjs} +2 -2
- package/dist/chunks/{chunk-N66VUXT2-D_6jZ3Vo.mjs → chunk-N66VUXT2-DoC3ggTc.mjs} +2 -2
- package/dist/chunks/{chunk-ND2GUHAM-DooE8X6i.mjs → chunk-ND2GUHAM-BcJIrltI.mjs} +4 -4
- package/dist/chunks/{chunk-NNHCCRGN-rJnsUrWl.mjs → chunk-NNHCCRGN-CH81dTHf.mjs} +1 -1
- package/dist/chunks/{chunk-NZK2D7GU-JW_qgPqa.mjs → chunk-NZK2D7GU-BnVJr7kf.mjs} +3 -3
- package/dist/chunks/{chunk-O5CBEL6O-GY6nZ-N7.mjs → chunk-O5CBEL6O-BeYkA-8N.mjs} +16 -16
- package/dist/chunks/{chunk-PUPMXCY4-DCIdSRFi.mjs → chunk-PUPMXCY4-D3Ub4pDo.mjs} +2 -2
- package/dist/chunks/{chunk-QZHKN3VN-C3N0_vEC.mjs → chunk-QZHKN3VN-ChiFJWT0.mjs} +2 -2
- package/dist/chunks/{chunk-UIBZB4QT-pyTElNc2.mjs → chunk-UIBZB4QT-BwApNyrQ.mjs} +2 -2
- package/dist/chunks/{chunk-WCWK7LTN-ClqBpBku.mjs → chunk-WCWK7LTN-D4OBOUIK.mjs} +2 -2
- package/dist/chunks/{chunk-WU5MYG2G-DLQN-5vb.mjs → chunk-WU5MYG2G-wN4cJZ_G.mjs} +3 -3
- package/dist/chunks/{chunk-XPW4576I-IlnbQHaA.mjs → chunk-XPW4576I-yOZxg2iY.mjs} +2 -2
- package/dist/chunks/classDiagram-4FO5ZUOK-BgQLsKDL.mjs +29 -0
- package/dist/chunks/classDiagram-v2-Q7XG4LA2-DS7F_M1n.mjs +29 -0
- package/dist/chunks/constants-PI1xjAeG.cjs +606 -0
- package/dist/chunks/{constants-DzQOOvgv.mjs → constants-vvNFp6FG.mjs} +392 -267
- package/dist/chunks/{core-DdDpt2u7.mjs → core-CJGckLsY.mjs} +31 -31
- package/dist/chunks/{core-CqiEzfU3.mjs → core-DeCMWrgN.mjs} +4 -4
- package/dist/chunks/{cose-bilkent-S5V4N54A-BronfFB-.mjs → cose-bilkent-S5V4N54A-NIONAJnp.mjs} +3 -3
- package/dist/chunks/{cytoscape.esm-QxDq63HI.mjs → cytoscape.esm-fziZOrCG.mjs} +1 -1
- package/dist/chunks/{dagre-BM42HDAG-B4WVdKOZ.mjs → dagre-BM42HDAG-DcOrN3pc.mjs} +14 -14
- package/dist/chunks/{dagre-DzOGad9N.mjs → dagre-CILRucyd.mjs} +107 -107
- package/dist/chunks/default-DFm_GbQ-.mjs +4 -0
- package/dist/chunks/{defaultLocale-BJwYPC-h.mjs → defaultLocale-C2VD4mLA.mjs} +12 -12
- package/dist/chunks/{diagram-2AECGRRQ-C22ThgiO.mjs → diagram-2AECGRRQ-DDwBTlvz.mjs} +7 -7
- package/dist/chunks/{diagram-5GNKFQAL-COelHuJn.mjs → diagram-5GNKFQAL-1sbWUr5e.mjs} +8 -8
- package/dist/chunks/{diagram-KO2AKTUF-CjLVtM94.mjs → diagram-KO2AKTUF-DhTFFKgx.mjs} +7 -7
- package/dist/chunks/{diagram-LMA3HP47-DqkuYFi9.mjs → diagram-LMA3HP47-DRr_84ZZ.mjs} +7 -7
- package/dist/chunks/{diagram-OG6HWLK6-390_YOO-.mjs → diagram-OG6HWLK6-C_5eu9Kf.mjs} +32 -32
- package/dist/chunks/{dist-CCXeNeCQ.mjs → dist-DRqr67zQ.mjs} +2 -2
- package/dist/chunks/{docx-preview-ulpDsaxt.mjs → docx-preview-CQ4QUFrd.mjs} +2 -2
- package/dist/chunks/{erDiagram-TEJ5UH35-BH0f96Pn.mjs → erDiagram-TEJ5UH35-C3Ohfkqu.mjs} +14 -14
- package/dist/chunks/eventmodeling-FCH6USID-BqDo_Sav.mjs +3 -0
- package/dist/chunks/{flowDiagram-I6XJVG4X-kZaqJYK1.mjs → flowDiagram-I6XJVG4X-DyXB0QVM.mjs} +17 -17
- package/dist/chunks/{ganttDiagram-6RSMTGT7-C3uQIARG.mjs → ganttDiagram-6RSMTGT7-82Iyg78i.mjs} +27 -27
- package/dist/chunks/gitGraph-WXDBUCRP-D-utqQiN.mjs +3 -0
- package/dist/chunks/{gitGraphDiagram-PVQCEYII-DQSTvBjy.mjs → gitGraphDiagram-PVQCEYII-D9V6dxzm.mjs} +7 -7
- package/dist/chunks/{graphlib-B0ANG2M6.mjs → graphlib-RxhPMq8I.mjs} +135 -135
- package/dist/chunks/{i18next-gGTtSkQg.mjs → i18next-C2REZNw2.mjs} +1 -1
- package/dist/chunks/{i18next-loader-BBPMegxc.cjs → i18next-loader-DVakgVCy.cjs} +1 -1
- package/dist/chunks/{i18next-loader-K-ir8UKk.mjs → i18next-loader-Dh4fP9we.mjs} +2 -2
- package/dist/chunks/info-J43DQDTF-D72knbmq.mjs +3 -0
- package/dist/chunks/{infoDiagram-5YYISTIA-CGpT_mPZ.mjs → infoDiagram-5YYISTIA-BxEJ_ib3.mjs} +5 -5
- package/dist/chunks/{init-hkDiJKhJ.mjs → init-BR8veUec.mjs} +1 -1
- package/dist/chunks/{ishikawaDiagram-YF4QCWOH-Ch9fmsWb.mjs → ishikawaDiagram-YF4QCWOH-CXe2kJsO.mjs} +6 -6
- package/dist/chunks/{journeyDiagram-JHISSGLW-CWv40lgD.mjs → journeyDiagram-JHISSGLW-DBhSi7Qg.mjs} +6 -6
- package/dist/chunks/{jszip.min-DoBCcllU.mjs → jszip.min-BsbMNjJg.mjs} +1 -1
- package/dist/chunks/{kanban-definition-UN3LZRKU-DSbXvrBB.mjs → kanban-definition-UN3LZRKU-CE4yr6J6.mjs} +11 -11
- package/dist/chunks/{katex-BIACU78Y.mjs → katex-DxQaNCxg.mjs} +1 -1
- package/dist/chunks/{lightweight-i18n-LFW8S8u-.cjs → lightweight-i18n-BnIqQ5Cf.cjs} +1 -1
- package/dist/chunks/{lightweight-i18n-DJpMke7a.mjs → lightweight-i18n-Cj88c8gl.mjs} +15 -0
- package/dist/chunks/{line-DU9tI1Tb.mjs → line-CQUUULPd.mjs} +4 -4
- package/dist/chunks/{linear-CPgdjDZh.mjs → linear-CAfvVXJc.mjs} +23 -23
- package/dist/chunks/{mdast-util-math-BNabERqA.mjs → mdast-util-math-Cpp9XOMP.mjs} +3 -3
- package/dist/chunks/{mermaid-parser.core-CRFj5ZQJ.mjs → mermaid-parser.core-B92FGYsA.mjs} +22 -22
- package/dist/chunks/{mermaid.core-D_2I8mjo.mjs → mermaid.core-BA9GkGKf.mjs} +52 -52
- package/dist/{messages-BI5B9bxE.mjs → chunks/messages-0EAci1N0.mjs} +15 -0
- package/dist/chunks/{messages-BkgBVEiE.cjs → messages-1jzEPeW5.cjs} +1 -1
- package/dist/chunks/{messages-CATH_uz1.mjs → messages-4CqVAaCY.mjs} +16 -1
- package/dist/chunks/{messages-DFHNw6PQ.cjs → messages-4Qka94cm.cjs} +1 -1
- package/dist/chunks/{messages-CBbgEXuO.cjs → messages-7wDDggws.cjs} +1 -1
- package/dist/chunks/{messages-B7st3eF_.cjs → messages-9VzB9Djh.cjs} +1 -1
- package/dist/chunks/{messages-B_cHWyWC.cjs → messages-9bK437Rh.cjs} +1 -1
- package/dist/chunks/{messages-CZddldga.cjs → messages-AtTKtjsQ.cjs} +1 -1
- package/dist/{messages-BOWDzfkH.mjs → chunks/messages-B1inw201.mjs} +16 -1
- package/dist/chunks/{messages-B-u5B7tY.cjs → messages-B4ZVgIh5.cjs} +1 -1
- package/dist/chunks/{messages-CJFSq8Fl.cjs → messages-B5bSFRCa.cjs} +1 -1
- package/dist/chunks/{messages-BRTWvTAP.mjs → messages-B705gxqz.mjs} +16 -1
- package/dist/{messages-Dq_RdEny2.mjs → chunks/messages-B7F3tX4u.mjs} +16 -1
- package/dist/chunks/{messages-NJAjMFXd.cjs → messages-BDer7I67.cjs} +1 -1
- package/dist/chunks/{messages-BV22YIZ_.cjs → messages-BEEGgtPo.cjs} +1 -1
- package/dist/{messages-bN4Zmk2m.mjs → chunks/messages-BGlEWmsB.mjs} +16 -1
- package/dist/{messages-Ao2vCNAH2.mjs → chunks/messages-BJJsuZhy.mjs} +16 -1
- package/dist/chunks/{messages-DjrfovG0.cjs → messages-BJcc9h6p.cjs} +1 -1
- package/dist/chunks/{messages-Hfo6uCIC.cjs → messages-BL-E2Kw3.cjs} +1 -1
- package/dist/chunks/{messages-5339ApgH.mjs → messages-BLJGzntb.mjs} +16 -1
- package/dist/chunks/{messages-Au1UpgkX.cjs → messages-BLNieIb-.cjs} +1 -1
- package/dist/chunks/{messages-DQJcAz4s.cjs → messages-BRbGk1-Z.cjs} +1 -1
- package/dist/chunks/{messages-BwOUSDJR.mjs → messages-BUlZRNoO.mjs} +15 -0
- package/dist/{messages-BKGg4XYm2.mjs → chunks/messages-BWQF9y2r.mjs} +16 -1
- package/dist/chunks/{messages-UXS3zL9A2.cjs → messages-BWh9I5Jv2.cjs} +1 -1
- package/dist/chunks/{messages-B6dbtt1c.cjs → messages-BX86v7Ev.cjs} +1 -1
- package/dist/chunks/{messages-DIFwztFo.cjs → messages-BYpvkG9S.cjs} +1 -1
- package/dist/chunks/{messages-C8_r3iTR2.mjs → messages-Bdw_vAdq2.mjs} +16 -1
- package/dist/chunks/{messages-DIetNXTx.cjs → messages-BeQVEC9q.cjs} +1 -1
- package/dist/{messages-CusWGsl42.mjs → chunks/messages-BeTZTXZm.mjs} +16 -1
- package/dist/chunks/{messages-CmsAbu_A.cjs → messages-BhTlR4PP.cjs} +1 -1
- package/dist/{messages-B2YnZIU2.mjs → chunks/messages-BhnZTZbQ.mjs} +16 -1
- package/dist/{messages-BpwhHkFb2.mjs → chunks/messages-BqJdoBHm.mjs} +16 -1
- package/dist/chunks/{messages-zPUQsksJ.mjs → messages-BqPiH7QC.mjs} +16 -1
- package/dist/chunks/{messages-CjfEt9bg.cjs → messages-Br_qu_wR.cjs} +1 -1
- package/dist/chunks/{messages-DtaPHADA.cjs → messages-BscUmD6D.cjs} +1 -1
- package/dist/{messages-Cg6a88Bb2.mjs → chunks/messages-Btapuvxo.mjs} +16 -1
- package/dist/chunks/{messages-CEySIig9.cjs → messages-BwCw0TJ1.cjs} +1 -1
- package/dist/chunks/{messages-BO-L5oN9.mjs → messages-C3RDWmXV.mjs} +15 -0
- package/dist/chunks/{messages-CZJZ-au3.cjs → messages-C3SZsVB9.cjs} +1 -1
- package/dist/chunks/{messages-DQr7bXMD.mjs → messages-C65mLRVK.mjs} +16 -1
- package/dist/chunks/{messages-CT8djlV6.cjs → messages-C73dKqPT.cjs} +1 -1
- package/dist/chunks/{messages-DOqJ6ogK.cjs → messages-C8f4kUOB.cjs} +1 -1
- package/dist/chunks/{messages-CIBYzzFy.mjs → messages-C9vfrzKQ.mjs} +16 -1
- package/dist/{messages-Grhv5SE_.mjs → chunks/messages-CEbe34zh.mjs} +15 -0
- package/dist/chunks/{messages-CcsM8Q7g.cjs → messages-CHEpECGv.cjs} +1 -1
- package/dist/chunks/{messages-DEg5FAg1.cjs → messages-CHP0nYRn.cjs} +1 -1
- package/dist/chunks/{messages-CjCn5IsF.mjs → messages-CIbh-0oJ.mjs} +16 -1
- package/dist/chunks/{messages-BHCepNsI.cjs → messages-CJC94Hci.cjs} +1 -1
- package/dist/chunks/{messages-ByNR9m9W.cjs → messages-CMP5dbqQ.cjs} +1 -1
- package/dist/chunks/{messages-DpNmnBjK.cjs → messages-CMm8FeOL.cjs} +1 -1
- package/dist/chunks/{messages-Da8yFc7l.cjs → messages-CNMPtWiq.cjs} +1 -1
- package/dist/chunks/{messages-Xh-c7d4C.mjs → messages-CQUr4lBa.mjs} +16 -1
- package/dist/{messages-Cvq2EFPT2.mjs → chunks/messages-CUuOX1k3.mjs} +16 -1
- package/dist/chunks/{messages-BsTzdfZF.cjs → messages-CVerbLou.cjs} +1 -1
- package/dist/{messages-CGiVoFTi.mjs → chunks/messages-CWW9OwKO.mjs} +16 -1
- package/dist/{messages-Da1woCgt2.mjs → chunks/messages-CWqap54p.mjs} +16 -1
- package/dist/{messages-CEGqNXnP.mjs → chunks/messages-CXNQBFHp.mjs} +16 -1
- package/dist/chunks/{messages-DgF8OkNr.mjs → messages-CYDhuSF4.mjs} +16 -1
- package/dist/chunks/{messages-Bp0LdGKj.mjs → messages-CYy3Zd3F.mjs} +15 -0
- package/dist/chunks/{messages-DHv7knYB.mjs → messages-C_BM_XHo.mjs} +16 -1
- package/dist/chunks/{messages-IqNWRaNS.cjs → messages-CbKOqXT6.cjs} +1 -1
- package/dist/chunks/{messages-Bmq--WTx.mjs → messages-CbxXU_Um.mjs} +15 -0
- package/dist/chunks/{messages-CVrOxu3J.cjs → messages-CcO-3_4k.cjs} +1 -1
- package/dist/chunks/{messages-D41fO84y.cjs → messages-CcTkC677.cjs} +1 -1
- package/dist/chunks/{messages-Cy-2_lIA.cjs → messages-CdEZ98_p.cjs} +1 -1
- package/dist/{messages-KyJQtOkh2.mjs → chunks/messages-CeZ1lo-o.mjs} +16 -1
- package/dist/chunks/{messages-D7H9JUDr.cjs → messages-CgFAGUJX.cjs} +1 -1
- package/dist/chunks/{messages-Dwl878eS.mjs → messages-CprMp4Va.mjs} +16 -1
- package/dist/chunks/{messages-DuD4ut1b.mjs → messages-CtXDxPOq.mjs} +16 -1
- package/dist/chunks/{messages-B_d857cA.mjs → messages-Cutnm4AZ.mjs} +15 -0
- package/dist/chunks/{messages-cSBZ5qVe.mjs → messages-CwIC_sse.mjs} +16 -1
- package/dist/chunks/{messages-7LWW3BVh.mjs → messages-CwbTr9lL.mjs} +16 -1
- package/dist/chunks/{messages-ETJ7tQ9O.cjs → messages-CxIknrw4.cjs} +1 -1
- package/dist/chunks/{messages-DjZoCJ00.mjs → messages-D0Jj7Dtw.mjs} +15 -0
- package/dist/chunks/{messages-SozFksSf.cjs → messages-D0th-I9S.cjs} +1 -1
- package/dist/chunks/{messages-gh5G15J1.cjs → messages-D1XTyTJz.cjs} +1 -1
- package/dist/chunks/{messages-DNtAzacv.mjs → messages-D24EoKbO.mjs} +16 -1
- package/dist/{messages-BlvF3pot.mjs → chunks/messages-D2chjyLM.mjs} +16 -1
- package/dist/chunks/{messages-CqRtDVFO.cjs → messages-D6y13edn.cjs} +1 -1
- package/dist/chunks/{messages-EsX3eikv.cjs → messages-D86p1eQY.cjs} +1 -1
- package/dist/{messages-BwCgJUdq.mjs → chunks/messages-D8L_8amv.mjs} +16 -1
- package/dist/chunks/{messages-C2ptZOWh.cjs → messages-DC-yFRyF.cjs} +1 -1
- package/dist/chunks/{messages-D4u2PSQw.mjs → messages-DEPxxCNU.mjs} +16 -1
- package/dist/chunks/{messages-VeyvtTce.cjs → messages-DG9l5agQ.cjs} +1 -1
- package/dist/chunks/{messages-B6794_2J.cjs → messages-DIeUb2w-.cjs} +1 -1
- package/dist/chunks/{messages-COx3hDcP.cjs → messages-DJ-RX5EJ.cjs} +1 -1
- package/dist/chunks/{messages-Cvg_uTfy.mjs → messages-DJ7lbpBX.mjs} +16 -1
- package/dist/{messages-Cn3uvFq3.mjs → chunks/messages-DJH_kd46.mjs} +16 -1
- package/dist/chunks/{messages-CWFSMzug2.cjs → messages-DLYl6KdK2.cjs} +1 -1
- package/dist/chunks/{messages-3jkCmB_A.mjs → messages-DMcCkOtN.mjs} +16 -1
- package/dist/chunks/{messages-BdL8bmTL.mjs → messages-DQks74hq.mjs} +16 -1
- package/dist/{messages-UJx6PvCL.mjs → chunks/messages-DTiqggtG.mjs} +16 -1
- package/dist/chunks/{messages-typO_i_k.mjs → messages-DTsSYToI.mjs} +15 -0
- package/dist/{messages-CwvHO8gp2.mjs → chunks/messages-DU6TOz6v.mjs} +16 -1
- package/dist/chunks/{messages-DmjccFHq.cjs → messages-DUbZA-w_.cjs} +1 -1
- package/dist/chunks/{messages-DCwrXfck.cjs → messages-DVAU-8rH.cjs} +1 -1
- package/dist/chunks/{messages-Z4LYgfWc.cjs → messages-Df6vXDrY.cjs} +1 -1
- package/dist/chunks/{messages-9B1F-k48.cjs → messages-Dh79ToYM.cjs} +1 -1
- package/dist/chunks/{messages-CuMtymEs.cjs → messages-Dh9psewW.cjs} +1 -1
- package/dist/chunks/{messages-BjYhwRk7.cjs → messages-Dln2T0zJ.cjs} +1 -1
- package/dist/chunks/{messages-DT-JnTnw.cjs → messages-DoA0Ecoi.cjs} +1 -1
- package/dist/{messages-RXQKVFCJ.mjs → chunks/messages-Dre_MB7o.mjs} +16 -1
- package/dist/chunks/{messages-BveiGA2x.cjs → messages-Dv4oyF7T.cjs} +1 -1
- package/dist/chunks/{messages-CkosWGGH.mjs → messages-FMAQkmg4.mjs} +15 -0
- package/dist/{messages-CQzOV7VE2.mjs → chunks/messages-GownDU-J.mjs} +16 -1
- package/dist/chunks/{messages-CH9SBR-i.cjs → messages-JYea02IT.cjs} +1 -1
- package/dist/chunks/{messages-BXp_U3uS.cjs → messages-JyzorVPx.cjs} +1 -1
- package/dist/chunks/{messages-jEbEE90_.mjs → messages-L70TFQAY.mjs} +16 -1
- package/dist/chunks/{messages-C0swL9CY.mjs → messages-L8CslBBZ.mjs} +16 -1
- package/dist/chunks/{messages-CM8uUnPx.cjs → messages-LX9PuLsT.cjs} +1 -1
- package/dist/chunks/{messages-BUvlOqll.mjs → messages-NFUr7Sxk.mjs} +16 -1
- package/dist/chunks/{messages-CGdCpNZ62.cjs → messages-PpRvDwOa2.cjs} +1 -1
- package/dist/chunks/{messages-ZMG7qQ3D.mjs → messages-QQ5-ET8y.mjs} +16 -1
- package/dist/chunks/{messages-DiODNXET.mjs → messages-Stf6rn2I.mjs} +16 -1
- package/dist/chunks/{messages-D7sU-NqL.cjs → messages-T8hCmys7.cjs} +1 -1
- package/dist/{messages-lnxRz5rM.mjs → chunks/messages-TZtv60nI.mjs} +16 -1
- package/dist/chunks/{messages-CeLv1whu2.mjs → messages-V9bvFOFc2.mjs} +16 -1
- package/dist/chunks/{messages-tR0BdeVG.cjs → messages-Vp8CpYh3.cjs} +1 -1
- package/dist/chunks/{messages-DUWCkLYR.cjs → messages-XqCqLy0k.cjs} +1 -1
- package/dist/{messages-CcF4SO9W.mjs → chunks/messages-_1y6EX7X.mjs} +16 -1
- package/dist/chunks/{messages-CXk-iM-i.mjs → messages-aTZglEV9.mjs} +16 -1
- package/dist/chunks/{messages-BHdKd7pH.cjs → messages-cSHh8Zgv.cjs} +1 -1
- package/dist/{messages-P5B61L1J2.mjs → chunks/messages-e8gxPi7a.mjs} +16 -1
- package/dist/chunks/{messages-CI2W7P-j.mjs → messages-hiwlrrr-.mjs} +16 -1
- package/dist/{messages-CeqpzGl9.mjs → chunks/messages-icPZhZ81.mjs} +15 -0
- package/dist/{messages-4drvqPN8.mjs → chunks/messages-lbwOYFxS2.mjs} +16 -1
- package/dist/chunks/{messages-B6yMdb3B.cjs → messages-lvo-9Be0.cjs} +1 -1
- package/dist/chunks/{messages-B2iaIrIu.mjs → messages-rm6jXexA.mjs} +16 -1
- package/dist/chunks/{messages-Ciq5_PsP.cjs → messages-sTyGkmbu.cjs} +1 -1
- package/dist/{messages-CF5MeYEt2.mjs → chunks/messages-uBwK-Ze2.mjs} +16 -1
- package/dist/chunks/{messages-BaVZgTrw.cjs → messages-uOISsfmj.cjs} +1 -1
- package/dist/chunks/{messages-MPe9FjYe.mjs → messages-wq0vxJ3p.mjs} +16 -1
- package/dist/chunks/{messages-CQT8TtiF.cjs → messages-z2DzBRgO.cjs} +1 -1
- package/dist/chunks/{micromark-extension-math-CJDP6iIU.mjs → micromark-extension-math-COSLlhTC.mjs} +6 -6
- package/dist/chunks/{micromark-factory-space-C6wz33de.mjs → micromark-factory-space-CLWSfTEG.mjs} +2 -2
- package/dist/chunks/{mindmap-definition-RKZ34NQL-Bh7eb0sP.mjs → mindmap-definition-RKZ34NQL-Dklc3Py2.mjs} +16 -16
- package/dist/chunks/{native-RS5RJIVO.mjs → native-BE2uW7dn.mjs} +1 -1
- package/dist/chunks/{ordinal-FCgpEo3E.mjs → ordinal-Qrn6pSTz.mjs} +3 -3
- package/dist/chunks/packet-YPE3B663-BehYuyRA.mjs +3 -0
- package/dist/chunks/{path-CCKeP0zq.mjs → path-CMz47XM0.mjs} +3 -3
- package/dist/chunks/pie-LRSECV5Y-C85c3T2E.mjs +3 -0
- package/dist/chunks/{pieDiagram-4H26LBE5-Bn2IEjeH.mjs → pieDiagram-4H26LBE5-DgCAhu_N.mjs} +14 -14
- package/dist/chunks/{prism-bash-D4zr_u8t.mjs → prism-bash-C0O3w7uz.mjs} +1 -1
- package/dist/chunks/{prism-cpp-CrBJjuu5.mjs → prism-cpp-2GQhW27l.mjs} +1 -1
- package/dist/chunks/{prism-csharp-lrMxvYpL.mjs → prism-csharp-DL7dZG1j.mjs} +1 -1
- package/dist/chunks/{prism-css-VQTID_HR.mjs → prism-css-CNvzB07F.mjs} +1 -1
- package/dist/chunks/{prism-dart-Q-9Z_W9B.mjs → prism-dart-DfjFPoDv.mjs} +1 -1
- package/dist/chunks/{prism-docker-DWAQ3dDD.mjs → prism-docker-BYbfweTi.mjs} +1 -1
- package/dist/chunks/{prism-java-_m72Vn1f.mjs → prism-java-DVDstRX2.mjs} +1 -1
- package/dist/chunks/{prism-kotlin-BTT9anu1.mjs → prism-kotlin-B4yZP901.mjs} +1 -1
- package/dist/chunks/{prism-latex-CL8zDJwm.mjs → prism-latex-D6GsLRnS.mjs} +1 -1
- package/dist/chunks/{prism-lua-D6JJ7p-A.mjs → prism-lua-CJX1SQiz.mjs} +1 -1
- package/dist/chunks/{prism-markdown-D6D8BprH.mjs → prism-markdown-C4FwQHMu.mjs} +1 -1
- package/dist/chunks/{prism-markup-templating-DfRjv0mn.mjs → prism-markup-templating-CmFWyrMp.mjs} +1 -1
- package/dist/chunks/{prism-php-DffX-wRi.mjs → prism-php-D1En1wGd.mjs} +1 -1
- package/dist/chunks/{prism-r-CU9se1Na.mjs → prism-r-DmduEoWu.mjs} +1 -1
- package/dist/chunks/{prism-ruby-DuQ4syPd.mjs → prism-ruby-BX9M-ggZ.mjs} +1 -1
- package/dist/chunks/{prism-rust-DRurCx4W.mjs → prism-rust-CW_lhKyK.mjs} +1 -1
- package/dist/chunks/{prism-sql-Au3VVcw1.mjs → prism-sql-CsK4eHq9.mjs} +1 -1
- package/dist/chunks/{prism-typescript-BKj96rmj.mjs → prism-typescript-Ca1YH5jC.mjs} +1 -1
- package/dist/chunks/{prism-yaml-Bk31kvSd.mjs → prism-yaml-CA6Sp5jk.mjs} +1 -1
- package/dist/chunks/{purify.es-Cg3Sx1In.mjs → purify.es-W8MRy_-c.mjs} +1 -1
- package/dist/chunks/{quadrantDiagram-W4KKPZXB-CGpTgKv9.mjs → quadrantDiagram-W4KKPZXB-BwDXU7bs.mjs} +4 -4
- package/dist/chunks/radar-GUYGQ44K-DGjR4vAz.mjs +3 -0
- package/dist/chunks/{requirementDiagram-4Y6WPE33-CdEklBE5.mjs → requirementDiagram-4Y6WPE33-C8uQNZti.mjs} +13 -13
- package/dist/chunks/{rough.esm-D0yWqsMu.mjs → rough.esm-BMiXn97a.mjs} +1 -1
- package/dist/chunks/{sanitize-url-DzTIH3XF.mjs → sanitize-url-Pw_yecwg.mjs} +70 -70
- package/dist/chunks/{sankeyDiagram-5OEKKPKP-C7B8TYyO.mjs → sankeyDiagram-5OEKKPKP-BJwtjvLG.mjs} +18 -18
- package/dist/chunks/{sequenceDiagram-3UESZ5HK-Wb1gzfDh.mjs → sequenceDiagram-3UESZ5HK-BHEbMtdM.mjs} +8 -8
- package/dist/chunks/{src-BMRCbUmP.mjs → src-uHD1i8ix.mjs} +86 -86
- package/dist/chunks/{stateDiagram-AJRCARHV-B1UbFikz.mjs → stateDiagram-AJRCARHV-D2di7cb4.mjs} +17 -17
- package/dist/chunks/stateDiagram-v2-BHNVJYJU-uJvNkDGf.mjs +27 -0
- package/dist/chunks/{timeline-definition-PNZ67QCA-Dr0oEljt.mjs → timeline-definition-PNZ67QCA-CkldAvjX.mjs} +6 -6
- package/dist/chunks/tools-B6rEBe-4.cjs +208 -0
- package/dist/chunks/{tools-CelSzJoA.mjs → tools-BQo4iaMe.mjs} +2565 -2497
- package/dist/chunks/treeView-BLDUP644-DhLdRehp.mjs +3 -0
- package/dist/chunks/treemap-LRROVOQU-CgXHb4o7.mjs +3 -0
- package/dist/chunks/{types-gj36fzRQ.mjs → types-BdXoqAkw.mjs} +1 -1
- package/dist/chunks/{vennDiagram-CIIHVFJN-Bc4yalKA.mjs → vennDiagram-CIIHVFJN-BuYgzRtw.mjs} +7 -7
- package/dist/chunks/wardley-L42UT6IY-sN5mOUNm.mjs +3 -0
- package/dist/chunks/{wardleyDiagram-YWT4CUSO-Ce_btexJ.mjs → wardleyDiagram-YWT4CUSO-CN5Jfm2D.mjs} +7 -7
- package/dist/chunks/{webm-muxer-Doy8JtlV.mjs → webm-muxer-B4_guPR0.mjs} +1 -1
- package/dist/chunks/{xychartDiagram-2RQKCTM6-HhACbhVa.mjs → xychartDiagram-2RQKCTM6-DAcdK50J.mjs} +12 -12
- package/dist/full.cjs +1 -1
- package/dist/full.mjs +3 -3
- package/dist/locales.mjs +82 -67
- package/dist/markdown.mjs +2 -2
- package/dist/{chunks/messages-DDJkNbJy.mjs → messages--sHkn4PD.mjs} +16 -1
- package/dist/{chunks/messages-QCaF3d92.mjs → messages-4mxgsYKZ2.mjs} +16 -1
- package/dist/{messages-zOl6jpOa.mjs → messages-6fQMeTiI.mjs} +16 -1
- package/dist/{messages-BRLWpOnP.mjs → messages-B22G0fir.mjs} +16 -1
- package/dist/{chunks/messages-kqnzps-X.mjs → messages-B908tGhl.mjs} +16 -1
- package/dist/{messages-CDueJTe8.mjs → messages-BAUvKI0_.mjs} +16 -1
- package/dist/{chunks/messages-BpMWMH9_.mjs → messages-BAfMwQnT2.mjs} +16 -1
- package/dist/{messages-Bmu3rJwO.mjs → messages-BCk7o4Pz.mjs} +16 -1
- package/dist/{messages-D4dovFzY2.mjs → messages-BG2BE6Sg2.mjs} +16 -1
- package/dist/{messages-DR2JBU-H.mjs → messages-BGe6GS_j.mjs} +16 -1
- package/dist/{chunks/messages-CeIzWL_4.mjs → messages-BHLrVFmZ2.mjs} +16 -1
- package/dist/{chunks/messages-HJnG9r2l.mjs → messages-BJjffJIu.mjs} +16 -1
- package/dist/{messages-CUcUO5bC2.mjs → messages-BSGZSOH32.mjs} +16 -1
- package/dist/{messages-HVgCKIww2.mjs → messages-BT6TyDYQ2.mjs} +16 -1
- package/dist/{messages-jQsl7cga2.mjs → messages-BWZ0_zUi2.mjs} +16 -1
- package/dist/{chunks/messages-DDX6I6MX.mjs → messages-BWhJgyhl.mjs} +16 -1
- package/dist/{messages-CqZgsrVP2.mjs → messages-BXqLaS2g2.mjs} +16 -1
- package/dist/{messages-gTUy3xjb.mjs → messages-BZiuFv_O.mjs} +15 -0
- package/dist/{messages-DcQNeoPB.mjs → messages-Bb-XEtyl.mjs} +15 -0
- package/dist/{messages-C9Kq8259.mjs → messages-BkKAnFz_.mjs} +15 -0
- package/dist/{messages-BarhGl2S2.mjs → messages-BoLu5_Wp2.mjs} +16 -1
- package/dist/{chunks/messages-D-p-omWy.mjs → messages-BpqRzil6.mjs} +16 -1
- package/dist/{messages-C6R0bzW5.mjs → messages-C2E8rQjb.mjs} +15 -0
- package/dist/{messages-BIgvPd6I2.mjs → messages-C2JJxi5D2.mjs} +16 -1
- package/dist/{messages-jsrzDVZy2.mjs → messages-C4d1_z432.mjs} +16 -1
- package/dist/{messages-L4sYfXpM.mjs → messages-C5Igyij0.mjs} +16 -1
- package/dist/{messages-CAnOyxrm.mjs → messages-C8fscB2J.mjs} +16 -1
- package/dist/{chunks/messages-CX0tJpOb.mjs → messages-CD8CgT1F.mjs} +16 -1
- package/dist/{messages-BKG0QHVl.mjs → messages-CDxPk3xE.mjs} +15 -0
- package/dist/{messages-hGop1gbF.mjs → messages-CGXrIdHT.mjs} +15 -0
- package/dist/{chunks/messages-DuHFGMCJ.mjs → messages-CHfkCxGQ2.mjs} +16 -1
- package/dist/{messages-fAEKzdUq.mjs → messages-CMvNzksb.mjs} +16 -1
- package/dist/{chunks/messages-t26x8wxB.mjs → messages-CSIhcdDx2.mjs} +16 -1
- package/dist/{chunks/messages-D-QWtvWg.mjs → messages-CW5z5hSz.mjs} +16 -1
- package/dist/{chunks/messages-CUPup5e3.mjs → messages-CYvpDx4p2.mjs} +16 -1
- package/dist/{chunks/messages-Ca9zIrBo.mjs → messages-CcTlmrYs.mjs} +16 -1
- package/dist/{chunks/messages-B01D7aHY.mjs → messages-Ce8ShL0-.mjs} +16 -1
- package/dist/{chunks/messages-CbyVDo8y.mjs → messages-CgT32m3D.mjs} +15 -0
- package/dist/{chunks/messages-ypIHI9Fr.mjs → messages-CmCBnNtA2.mjs} +16 -1
- package/dist/{messages-DGAWjKQZ.mjs → messages-CneVTJSN.mjs} +16 -1
- package/dist/{messages-C5IE9mXm.mjs → messages-CpNerer8.mjs} +15 -0
- package/dist/{chunks/messages-D-s4_vnU.mjs → messages-Cs0L1gyv.mjs} +16 -1
- package/dist/{chunks/messages-BYCHzM7F.mjs → messages-CsGnp1wE2.mjs} +16 -1
- package/dist/{messages-BgPDPIkO.mjs → messages-CvbIxcr7.mjs} +16 -1
- package/dist/{messages-wmS6Z2m82.mjs → messages-Cx6oQfMR2.mjs} +16 -1
- package/dist/{messages-BvutXmgt.mjs → messages-DBESJOhQ.mjs} +16 -1
- package/dist/{chunks/messages-Cl_pM31G.mjs → messages-DGOBPnKC2.mjs} +16 -1
- package/dist/{messages-B13GEFFu.mjs → messages-DK2AwXAp.mjs} +16 -1
- package/dist/{messages-CUFac9Qe.mjs → messages-DMbnesQ9.mjs} +16 -1
- package/dist/{chunks/messages-Byn9-dhb2.mjs → messages-DOiSOenW.mjs} +16 -1
- package/dist/{messages-8__-vX3U.mjs → messages-DQqp_ANL.mjs} +16 -1
- package/dist/{chunks/messages-Ck1-ddbo.mjs → messages-DThG2jW-2.mjs} +16 -1
- package/dist/{chunks/messages-DQfi2DoY.mjs → messages-DXlB7Vpm.mjs} +16 -1
- package/dist/{messages-VIQ8vjvS.mjs → messages-De0NAxJt.mjs} +15 -0
- package/dist/{chunks/messages-Bb80Csl3.mjs → messages-Depz8d3Q.mjs} +15 -0
- package/dist/{messages-BQaiScU1.mjs → messages-Dfsw3a8v.mjs} +16 -1
- package/dist/{messages-D9qgYMU82.mjs → messages-Dhmmqob82.mjs} +16 -1
- package/dist/{messages-DbE-riR52.mjs → messages-DmNUAv0e2.mjs} +16 -1
- package/dist/{messages-Ch-SytN8.mjs → messages-DrQaJrDO.mjs} +16 -1
- package/dist/{chunks/messages-C3rGCBi_.mjs → messages-DsksuHtZ.mjs} +16 -1
- package/dist/{chunks/messages-m-A6ArIM.mjs → messages-DzOVTq3E2.mjs} +16 -1
- package/dist/{messages-CskLLTiG2.mjs → messages-Igpt5WIA2.mjs} +16 -1
- package/dist/{messages-yuNINyS1.mjs → messages-JhpGtjjS.mjs} +16 -1
- package/dist/{chunks/messages-BbZz_Anm.mjs → messages-WCy1wiGS2.mjs} +16 -1
- package/dist/{chunks/messages-CRUb9o5k.mjs → messages-XbA-jXKc.mjs} +15 -0
- package/dist/{chunks/messages-BeS9EOEO.mjs → messages-imHGm9SI2.mjs} +16 -1
- package/dist/{messages-BQhHthxq2.mjs → messages-yTNyxXRV2.mjs} +16 -1
- package/dist/react.cjs +1 -1
- package/dist/react.mjs +1 -1
- package/dist/tools.cjs +1 -1
- package/dist/tools.mjs +2 -2
- package/package.json +3 -3
- package/src/components/i18n/locales/am/messages.json +16 -1
- package/src/components/i18n/locales/ar/messages.json +16 -1
- package/src/components/i18n/locales/az/messages.json +16 -1
- package/src/components/i18n/locales/bg/messages.json +16 -1
- package/src/components/i18n/locales/bn/messages.json +16 -1
- package/src/components/i18n/locales/bs/messages.json +16 -1
- package/src/components/i18n/locales/cs/messages.json +16 -1
- package/src/components/i18n/locales/da/messages.json +16 -1
- package/src/components/i18n/locales/de/messages.json +16 -1
- package/src/components/i18n/locales/dv/messages.json +16 -1
- package/src/components/i18n/locales/el/messages.json +16 -1
- package/src/components/i18n/locales/en/messages.json +15 -0
- package/src/components/i18n/locales/es/messages.json +15 -0
- package/src/components/i18n/locales/et/messages.json +15 -0
- package/src/components/i18n/locales/fa/messages.json +15 -0
- package/src/components/i18n/locales/fi/messages.json +15 -0
- package/src/components/i18n/locales/fil/messages.json +15 -0
- package/src/components/i18n/locales/fr/messages.json +15 -0
- package/src/components/i18n/locales/gu/messages.json +15 -0
- package/src/components/i18n/locales/he/messages.json +15 -0
- package/src/components/i18n/locales/hi/messages.json +15 -0
- package/src/components/i18n/locales/hr/messages.json +15 -0
- package/src/components/i18n/locales/hu/messages.json +15 -0
- package/src/components/i18n/locales/hy/messages.json +16 -1
- package/src/components/i18n/locales/id/messages.json +16 -1
- package/src/components/i18n/locales/it/messages.json +16 -1
- package/src/components/i18n/locales/ja/messages.json +16 -1
- package/src/components/i18n/locales/ka/messages.json +16 -1
- package/src/components/i18n/locales/km/messages.json +16 -1
- package/src/components/i18n/locales/kn/messages.json +16 -1
- package/src/components/i18n/locales/ko/messages.json +16 -1
- package/src/components/i18n/locales/ku/messages.json +16 -1
- package/src/components/i18n/locales/lo/messages.json +16 -1
- package/src/components/i18n/locales/lt/messages.json +16 -1
- package/src/components/i18n/locales/lv/messages.json +16 -1
- package/src/components/i18n/locales/mk/messages.json +16 -1
- package/src/components/i18n/locales/ml/messages.json +16 -1
- package/src/components/i18n/locales/mn/messages.json +16 -1
- package/src/components/i18n/locales/mr/messages.json +16 -1
- package/src/components/i18n/locales/ms/messages.json +16 -1
- package/src/components/i18n/locales/my/messages.json +16 -1
- package/src/components/i18n/locales/ne/messages.json +16 -1
- package/src/components/i18n/locales/nl/messages.json +16 -1
- package/src/components/i18n/locales/no/messages.json +16 -1
- package/src/components/i18n/locales/pa/messages.json +16 -1
- package/src/components/i18n/locales/pl/messages.json +16 -1
- package/src/components/i18n/locales/ps/messages.json +16 -1
- package/src/components/i18n/locales/pt/messages.json +16 -1
- package/src/components/i18n/locales/ro/messages.json +16 -1
- package/src/components/i18n/locales/ru/messages.json +16 -1
- package/src/components/i18n/locales/sd/messages.json +16 -1
- package/src/components/i18n/locales/si/messages.json +16 -1
- package/src/components/i18n/locales/sk/messages.json +16 -1
- package/src/components/i18n/locales/sl/messages.json +16 -1
- package/src/components/i18n/locales/sq/messages.json +16 -1
- package/src/components/i18n/locales/sr/messages.json +16 -1
- package/src/components/i18n/locales/sv/messages.json +16 -1
- package/src/components/i18n/locales/sw/messages.json +16 -1
- package/src/components/i18n/locales/ta/messages.json +16 -1
- package/src/components/i18n/locales/te/messages.json +16 -1
- package/src/components/i18n/locales/th/messages.json +16 -1
- package/src/components/i18n/locales/tr/messages.json +16 -1
- package/src/components/i18n/locales/ug/messages.json +16 -1
- package/src/components/i18n/locales/uk/messages.json +16 -1
- package/src/components/i18n/locales/ur/messages.json +16 -1
- package/src/components/i18n/locales/vi/messages.json +16 -1
- package/src/components/i18n/locales/yi/messages.json +16 -1
- package/src/components/i18n/locales/zh/messages.json +16 -1
- package/src/components/modules/api/blocks.ts +1 -1
- package/src/components/modules/blockManager/blockManager.ts +2 -2
- package/src/components/modules/paste/index.ts +31 -2
- package/src/components/modules/paste/notion-blocks-v3.ts +654 -0
- package/src/components/modules/paste/notion-preprocessor.ts +67 -0
- package/src/components/modules/yjs/serializer.ts +1 -1
- package/src/components/utils/data-model-transform.ts +15 -15
- package/src/components/utils/media-empty-state.ts +48 -5
- package/src/components/utils/popover/popover-desktop.ts +6 -3
- package/src/components/utils/tooltip.ts +5 -38
- package/src/markdown/markdown-handler.ts +1 -2
- package/src/styles/audio.css +348 -36
- package/src/styles/tables.css +10 -0
- package/src/tools/audio/constants.ts +6 -0
- package/src/tools/audio/controls.ts +53 -7
- package/src/tools/audio/cover-picker.ts +126 -0
- package/src/tools/audio/disc.ts +137 -0
- package/src/tools/audio/index.ts +114 -6
- package/src/tools/audio/liveliness.ts +26 -8
- package/src/tools/audio/ui.ts +39 -4
- package/types/api/tooltip.d.ts +40 -1
- package/types/data-formats/output-data.d.ts +5 -2
- package/types/index.d.ts +1 -4
- package/types/tools/database.d.ts +1 -1
- package/types/tools/header.d.ts +2 -1
- package/types/tools/list.d.ts +2 -1
- package/types/utils/popover/popover.d.ts +42 -1
- package/dist/chunks/architecture-7EHR7CIX-CGYZJshv.mjs +0 -3
- package/dist/chunks/channel-dq5ps1Yn.mjs +0 -5
- package/dist/chunks/classDiagram-4FO5ZUOK-C3CxSQxy.mjs +0 -29
- package/dist/chunks/classDiagram-v2-Q7XG4LA2-Ci_JeHz0.mjs +0 -29
- package/dist/chunks/constants-DmKwEMyC.cjs +0 -606
- package/dist/chunks/default-qigT1Xpq.mjs +0 -4
- package/dist/chunks/eventmodeling-FCH6USID-nCBtSITo.mjs +0 -3
- package/dist/chunks/gitGraph-WXDBUCRP-CN_MBj94.mjs +0 -3
- package/dist/chunks/info-J43DQDTF-xmJNmT0e.mjs +0 -3
- package/dist/chunks/packet-YPE3B663-3bNcBJRE.mjs +0 -3
- package/dist/chunks/pie-LRSECV5Y-YTwc-ZG1.mjs +0 -3
- package/dist/chunks/radar-GUYGQ44K-vfGwdTFY.mjs +0 -3
- package/dist/chunks/stateDiagram-v2-BHNVJYJU-D6E4HlFi.mjs +0 -27
- package/dist/chunks/tools-BcF1rHBg.cjs +0 -208
- package/dist/chunks/treeView-BLDUP644-BptrPFA0.mjs +0 -3
- package/dist/chunks/treemap-LRROVOQU-BbiNBKy3.mjs +0 -3
- 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
|
+
}
|
package/src/tools/audio/index.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
//
|
|
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
|
-
|
|
499
|
-
if (e.propertyName === '
|
|
500
|
-
}
|
|
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.
|
|
85
|
+
const AMBIENT_BASE = 0.04;
|
|
75
86
|
/** Extra ambient swing layered onto the played side (the shimmering wake). */
|
|
76
|
-
const AMBIENT_PLAYED = 0.
|
|
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
|
|
129
|
-
//
|
|
136
|
+
// Layer 1 — focal 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
|
|
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
|
|
package/src/tools/audio/ui.ts
CHANGED
|
@@ -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
|
-
|
|
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 {
|
package/types/api/tooltip.d.ts
CHANGED
|
@@ -1,7 +1,46 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tooltip API
|
|
3
3
|
*/
|
|
4
|
-
|
|
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 =
|
|
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
|
*/
|