@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,654 @@
1
+ /**
2
+ * Parser for Notion's proprietary lossless clipboard flavor
3
+ * `text/_notion-blocks-v3-production`.
4
+ *
5
+ * When you copy blocks in Notion's web app, the clipboard carries — alongside
6
+ * `text/plain` and `text/html` — a JSON "record-map" under this MIME type that
7
+ * preserves EVERY block's state (checked, language, collapsed, icon, colour,
8
+ * nesting…). The HTML flavour cannot carry that state, so this JSON is the
9
+ * high-fidelity migration source for Notion-web → Blok-web paste.
10
+ *
11
+ * IMPORTANT: this is Notion's INTERNAL record-map, NOT the public REST API.
12
+ * Type names are internal (`text`, `header`, `sub_header`, `sub_sub_header`,
13
+ * `to_do`, `bulleted_list`…), rich-text is nested flag-arrays (NOT
14
+ * `annotations:{bold:true}`), and `checked` is `[["Yes"|"No"]]` (NOT boolean).
15
+ * See docs/plans/2026-06-22-notion-paste-migration-design.md §0.1.
16
+ *
17
+ * The output is a flat array of {@link NotionParsedBlock} (the same
18
+ * `{ id, tool, data, parentId }` shape the Blok clipboard handler consumes),
19
+ * which the two-pass `BlokDataHandler.insertBlokBlocks` builder turns into a
20
+ * correctly-nested block tree.
21
+ */
22
+
23
+ import { colorVarName } from '../../shared/color-presets';
24
+ import { DEFAULT_EMOJI } from '../../../tools/callout/constants';
25
+ import { DEFAULT_LANGUAGE, LANGUAGES } from '../../../tools/code/constants';
26
+ import { matchEmbedService } from '../../../tools/link/registry';
27
+
28
+ /** MIME flavour that carries Notion's lossless block record-map. */
29
+ export const NOTION_BLOCKS_V3_MIME = 'text/_notion-blocks-v3-production';
30
+
31
+ /**
32
+ * A single Blok-ready block produced from the Notion record-map.
33
+ * Shape-compatible with the clipboard handler's `BlokClipboardBlock`.
34
+ */
35
+ export interface NotionParsedBlock {
36
+ id: string;
37
+ tool: string;
38
+ data: Record<string, unknown>;
39
+ parentId?: string | null;
40
+ }
41
+
42
+ /** A Notion record-map block `value` (loosely typed — fields are optional). */
43
+ interface NotionValue {
44
+ id: string;
45
+ type: string;
46
+ content?: string[];
47
+ properties?: Record<string, unknown>;
48
+ format?: Record<string, unknown>;
49
+ [key: string]: unknown;
50
+ }
51
+
52
+ /** Result of mapping one Notion value: tool + data, or `null` to skip-promote. */
53
+ interface Mapped {
54
+ tool: string;
55
+ data: Record<string, unknown>;
56
+ }
57
+
58
+ /**
59
+ * Parse the `text/_notion-blocks-v3-production` clipboard payload into a flat
60
+ * array of Blok-ready blocks. Returns `null` when the payload is not valid
61
+ * JSON or does not look like the Notion record-map (so callers can fall back
62
+ * to the HTML path).
63
+ */
64
+ export function parseNotionBlocksV3(json: string): NotionParsedBlock[] | null {
65
+ const parsed = safeJsonParse(json);
66
+
67
+ if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
68
+ return null;
69
+ }
70
+
71
+ const blocks = (parsed as { blocks?: unknown }).blocks;
72
+
73
+ if (!Array.isArray(blocks)) {
74
+ return null;
75
+ }
76
+
77
+ // Merge every subtree's block map into one id → value lookup, and remember
78
+ // the top-level (selected) order from the `blocks` array.
79
+ const byId = new Map<string, NotionValue>();
80
+
81
+ blocks.forEach((entry) => {
82
+ const map = (entry as { blockSubtree?: { block?: Record<string, { value?: NotionValue }> } })
83
+ ?.blockSubtree?.block;
84
+
85
+ if (map === undefined || map === null) {
86
+ return;
87
+ }
88
+
89
+ Object.keys(map).forEach((id) => {
90
+ const value = map[id]?.value;
91
+
92
+ if (value !== undefined && value !== null && typeof value === 'object') {
93
+ byId.set(id, value);
94
+ }
95
+ });
96
+ });
97
+
98
+ // Require record-map structure: at least one resolvable block value.
99
+ if (byId.size === 0) {
100
+ return null;
101
+ }
102
+
103
+ const topLevelOrder = blocks
104
+ .map((entry) => (entry as { blockId?: string })?.blockId)
105
+ .filter((id): id is string => typeof id === 'string' && byId.has(id));
106
+
107
+ const result: NotionParsedBlock[] = [];
108
+ const visited = new Set<string>();
109
+
110
+ /**
111
+ * Depth-first emit in document order. `parentId` is the id of the nearest
112
+ * EMITTED ancestor (null at the top), so skip-promoted wrappers (page/tab)
113
+ * lift their children to the grandparent without leaving a dangling parent.
114
+ */
115
+ const walk = (id: string, parentId: string | null): void => {
116
+ if (visited.has(id)) {
117
+ return;
118
+ }
119
+
120
+ const value = byId.get(id);
121
+
122
+ if (value === undefined) {
123
+ return;
124
+ }
125
+
126
+ visited.add(id);
127
+
128
+ // Tables expand into a grid block plus one paragraph block per cell, and
129
+ // consume their `table_row` children — handle them before the leaf mapping.
130
+ if (value.type === 'table') {
131
+ expandTable(value, parentId, byId, visited, result);
132
+
133
+ return;
134
+ }
135
+
136
+ const mapped = mapValue(value, byId);
137
+ const children = Array.isArray(value.content) ? value.content : [];
138
+
139
+ if (mapped === null) {
140
+ // Structural wrapper (page / tab): drop it, promote its children.
141
+ children.forEach((childId) => walk(childId, parentId));
142
+
143
+ return;
144
+ }
145
+
146
+ const block: NotionParsedBlock = { id, tool: mapped.tool, data: mapped.data };
147
+
148
+ if (parentId !== null) {
149
+ block.parentId = parentId;
150
+ }
151
+
152
+ result.push(block);
153
+
154
+ children.forEach((childId) => walk(childId, id));
155
+ };
156
+
157
+ topLevelOrder.forEach((id) => walk(id, null));
158
+
159
+ return result;
160
+ }
161
+
162
+ /**
163
+ * Expand a Notion `table` into a Blok table block (a grid of cell references)
164
+ * plus one paragraph block per cell — Blok stores cell content as child blocks
165
+ * referenced by id, not inline. The owning `table_row` children are marked
166
+ * visited so the walker never emits them separately.
167
+ */
168
+ function expandTable(
169
+ table: NotionValue,
170
+ parentId: string | null,
171
+ byId: Map<string, NotionValue>,
172
+ visited: Set<string>,
173
+ result: NotionParsedBlock[]
174
+ ): void {
175
+ const tableId = table.id;
176
+ const format = table.format ?? {};
177
+ const rowIds = (Array.isArray(table.content) ? table.content : []).filter(
178
+ (rowId): rowId is string => typeof rowId === 'string'
179
+ );
180
+ const columnOrder = resolveColumnOrder(format.table_block_column_order, rowIds, byId);
181
+ const cells: NotionParsedBlock[] = [];
182
+ const content: { blocks: string[] }[][] = rowIds.map((rowId) => {
183
+ visited.add(rowId);
184
+
185
+ const rowProperties = byId.get(rowId)?.properties ?? {};
186
+
187
+ return columnOrder.map((columnId) => {
188
+ const cellId = `${rowId}:${columnId}`;
189
+
190
+ cells.push({ id: cellId, tool: 'paragraph', data: { text: richText(rowProperties[columnId], byId) }, parentId: tableId });
191
+
192
+ return { blocks: [cellId] };
193
+ });
194
+ });
195
+
196
+ const tableBlock: NotionParsedBlock = {
197
+ id: tableId,
198
+ tool: 'table',
199
+ data: {
200
+ withHeadings: format.table_block_row_header === true,
201
+ withHeadingColumn: format.table_block_column_header === true,
202
+ content,
203
+ },
204
+ };
205
+
206
+ if (parentId !== null) {
207
+ tableBlock.parentId = parentId;
208
+ }
209
+
210
+ result.push(tableBlock);
211
+ cells.forEach((cell) => result.push(cell));
212
+ }
213
+
214
+ /**
215
+ * The column id order for a table: the explicit `table_block_column_order`, or
216
+ * (when absent) the property keys of the first populated row.
217
+ */
218
+ function resolveColumnOrder(
219
+ order: unknown,
220
+ rowIds: string[],
221
+ byId: Map<string, NotionValue>
222
+ ): string[] {
223
+ if (Array.isArray(order) && order.length > 0) {
224
+ return order.filter((columnId): columnId is string => typeof columnId === 'string');
225
+ }
226
+
227
+ for (const rowId of rowIds) {
228
+ const properties = byId.get(rowId)?.properties;
229
+ const keys = properties === undefined || properties === null ? [] : Object.keys(properties);
230
+
231
+ if (keys.length > 0) {
232
+ return keys;
233
+ }
234
+ }
235
+
236
+ return [];
237
+ }
238
+
239
+ /**
240
+ * Map one Notion block value to a Blok tool + data, or `null` for structural
241
+ * wrappers that should be dropped while their children are promoted.
242
+ */
243
+ function mapValue(value: NotionValue, byId: Map<string, NotionValue>): Mapped | null {
244
+ const props = value.properties ?? {};
245
+ const text = richText(props.title, byId);
246
+
247
+ switch (value.type) {
248
+ case 'text':
249
+ return { tool: 'paragraph', data: { text } };
250
+ case 'header':
251
+ return { tool: 'header', data: { text, level: 1 } };
252
+ case 'sub_header':
253
+ return { tool: 'header', data: { text, level: 2 } };
254
+ case 'sub_sub_header':
255
+ return { tool: 'header', data: { text, level: 3 } };
256
+ case 'quote':
257
+ return { tool: 'quote', data: { text } };
258
+ case 'divider':
259
+ return { tool: 'divider', data: {} };
260
+ case 'code':
261
+ return {
262
+ tool: 'code',
263
+ data: { code: plainText(props.title), language: mapLanguage(props.language), lineNumbers: false },
264
+ };
265
+ case 'to_do':
266
+ return { tool: 'list', data: { text, style: 'checklist', checked: isChecked(props.checked) } };
267
+ case 'bulleted_list':
268
+ return { tool: 'list', data: { text, style: 'unordered' } };
269
+ case 'numbered_list':
270
+ return { tool: 'list', data: { text, style: 'ordered' } };
271
+ case 'toggle':
272
+ return { tool: 'toggle', data: { text, isOpen: true } };
273
+ case 'column_list':
274
+ return { tool: 'column_list', data: {} };
275
+ case 'column': {
276
+ const ratio = value.format?.column_ratio;
277
+
278
+ return { tool: 'column', data: typeof ratio === 'number' && ratio !== 1 ? { widthRatio: ratio } : {} };
279
+ }
280
+ case 'table_row':
281
+ // Consumed by `expandTable`; a stray row should never surface as a block.
282
+ return null;
283
+ case 'equation':
284
+ return { tool: 'code', data: { code: plainText(props.title), language: 'latex', lineNumbers: false } };
285
+ case 'bookmark':
286
+ return mapBookmark(props, value.format ?? {}, text);
287
+ case 'image':
288
+ return mapMediaFile('image', props, value.format ?? {}, text);
289
+ case 'file':
290
+ return mapMediaFile('file', props, value.format ?? {}, text);
291
+ case 'video':
292
+ return mapVideo(props, value.format ?? {}, text);
293
+ case 'drive':
294
+ return mapDrive(props, value.format ?? {}, text);
295
+ case 'callout': {
296
+ const format = value.format ?? {};
297
+ const emoji = typeof format.page_icon === 'string' && format.page_icon.length > 0 ? format.page_icon : DEFAULT_EMOJI;
298
+ const { textColor, backgroundColor } = parseBlockColor(format.block_color);
299
+
300
+ return { tool: 'callout', data: { emoji, text, textColor, backgroundColor } };
301
+ }
302
+ case 'page':
303
+ case 'tab':
304
+ // Document/tab wrappers — skip, promote children. (Sub-page references
305
+ // are handled in a later phase.)
306
+ return null;
307
+ default:
308
+ // Unmapped types (media, columns, tables, equation…) fall back to a
309
+ // paragraph for now; later phases give each its own mapping.
310
+ return { tool: 'paragraph', data: { text } };
311
+ }
312
+ }
313
+
314
+ /** Parse JSON, returning `null` instead of throwing on malformed input. */
315
+ function safeJsonParse(json: string): unknown {
316
+ try {
317
+ return JSON.parse(json);
318
+ } catch {
319
+ return null;
320
+ }
321
+ }
322
+
323
+ /** Map a Notion bookmark to the Blok bookmark tool (or a text fallback). */
324
+ function mapBookmark(
325
+ props: Record<string, unknown>,
326
+ format: Record<string, unknown>,
327
+ text: string
328
+ ): Mapped {
329
+ const url = firstHttpUrl(props.link);
330
+
331
+ if (url === null) {
332
+ return { tool: 'paragraph', data: { text } };
333
+ }
334
+
335
+ const data: Record<string, unknown> = { url };
336
+ const bookmarkTitle = plainText(props.title);
337
+ const description = plainText(props.description);
338
+
339
+ if (bookmarkTitle.length > 0) {
340
+ data.title = bookmarkTitle;
341
+ }
342
+
343
+ if (description.length > 0) {
344
+ data.description = description;
345
+ }
346
+
347
+ if (typeof format.bookmark_cover === 'string') {
348
+ data.image = format.bookmark_cover;
349
+ }
350
+
351
+ if (typeof format.bookmark_icon === 'string') {
352
+ data.favicon = format.bookmark_icon;
353
+ }
354
+
355
+ return { tool: 'bookmark', data };
356
+ }
357
+
358
+ /**
359
+ * Map a Notion image/file to the Blok image/file tool when it has a usable
360
+ * http(s) URL. Notion-uploaded media uses `attachment:` refs that require auth
361
+ * and carry no loadable URL, so those fall back to a filename paragraph.
362
+ */
363
+ function mapMediaFile(
364
+ tool: 'image' | 'file',
365
+ props: Record<string, unknown>,
366
+ format: Record<string, unknown>,
367
+ text: string
368
+ ): Mapped {
369
+ const url = firstHttpUrl(props.source, format.display_source);
370
+
371
+ if (url === null) {
372
+ return { tool: 'paragraph', data: { text } };
373
+ }
374
+
375
+ if (tool === 'image') {
376
+ return { tool: 'image', data: { url } };
377
+ }
378
+
379
+ const data: Record<string, unknown> = { url };
380
+ const fileName = plainText(props.title);
381
+
382
+ if (fileName.length > 0) {
383
+ data.fileName = fileName;
384
+ }
385
+
386
+ return { tool: 'file', data };
387
+ }
388
+
389
+ /** Map a Notion video to an embed (provider match) or a direct video block. */
390
+ function mapVideo(props: Record<string, unknown>, format: Record<string, unknown>, text: string): Mapped {
391
+ const url = firstHttpUrl(props.source, format.display_source);
392
+
393
+ if (url === null) {
394
+ return { tool: 'paragraph', data: { text } };
395
+ }
396
+
397
+ const embed = resolveEmbed(url);
398
+
399
+ return embed ?? { tool: 'video', data: { url } };
400
+ }
401
+
402
+ /** Map a Notion drive embed to an embed (provider match) or a bookmark. */
403
+ function mapDrive(props: Record<string, unknown>, format: Record<string, unknown>, text: string): Mapped {
404
+ const url = firstHttpUrl(props.source, format.display_source);
405
+
406
+ if (url === null) {
407
+ return { tool: 'paragraph', data: { text } };
408
+ }
409
+
410
+ return resolveEmbed(url) ?? { tool: 'bookmark', data: { url } };
411
+ }
412
+
413
+ /** Resolve a URL against the embed registry into Blok embed data, or `null`. */
414
+ function resolveEmbed(url: string): Mapped | null {
415
+ const match = matchEmbedService(url);
416
+
417
+ if (match === null) {
418
+ return null;
419
+ }
420
+
421
+ return { tool: 'embed', data: { service: match.service, source: url, embed: match.embedUrl, kind: match.kind } };
422
+ }
423
+
424
+ /** First candidate that resolves to an http(s) URL (string or rich-text array). */
425
+ function firstHttpUrl(...candidates: unknown[]): string | null {
426
+ for (const candidate of candidates) {
427
+ const raw = typeof candidate === 'string' ? candidate : plainText(candidate);
428
+ const trimmed = raw.trim();
429
+
430
+ if (/^https?:\/\//i.test(trimmed)) {
431
+ return trimmed;
432
+ }
433
+ }
434
+
435
+ return null;
436
+ }
437
+
438
+ /** Whether a Notion `checked` property (`[["Yes"|"No"]]`) is checked. */
439
+ function isChecked(checked: unknown): boolean {
440
+ return Array.isArray(checked) && Array.isArray(checked[0]) && checked[0][0] === 'Yes';
441
+ }
442
+
443
+ /** Pre-built lower-cased display-name → language-id lookup for code blocks. */
444
+ const LANGUAGE_BY_NAME = new Map(LANGUAGES.map((l) => [l.name.toLowerCase(), l.id]));
445
+
446
+ /** Map a Notion `language` property (`[["JavaScript"]]`) to a Blok language id. */
447
+ function mapLanguage(language: unknown): string {
448
+ if (!Array.isArray(language) || !Array.isArray(language[0]) || typeof language[0][0] !== 'string') {
449
+ return DEFAULT_LANGUAGE;
450
+ }
451
+
452
+ return LANGUAGE_BY_NAME.get(language[0][0].toLowerCase()) ?? DEFAULT_LANGUAGE;
453
+ }
454
+
455
+ /** Concatenate a rich-text array into raw plain text (no escaping, no markup). */
456
+ function plainText(title: unknown): string {
457
+ if (!Array.isArray(title)) {
458
+ return '';
459
+ }
460
+
461
+ return title.map((seg) => (Array.isArray(seg) && typeof seg[0] === 'string' ? seg[0] : '')).join('');
462
+ }
463
+
464
+ /**
465
+ * Convert a Notion rich-text array into Blok inline HTML. `byId` resolves
466
+ * page-mention (`p`) flags to their referenced page title when that page is
467
+ * present in the pasted payload.
468
+ */
469
+ function richText(title: unknown, byId?: Map<string, NotionValue>): string {
470
+ if (!Array.isArray(title)) {
471
+ return '';
472
+ }
473
+
474
+ return title.map((seg) => segmentHtml(seg, byId)).join('');
475
+ }
476
+
477
+ /** Convert one rich-text segment `[text, [[flag, …args], …]]` to HTML. */
478
+ function segmentHtml(segment: unknown, byId?: Map<string, NotionValue>): string {
479
+ if (!Array.isArray(segment)) {
480
+ return '';
481
+ }
482
+
483
+ const raw = typeof segment[0] === 'string' ? segment[0] : '';
484
+ const annotations = Array.isArray(segment[1]) ? segment[1] : [];
485
+
486
+ // Colour flags ('h') collapse into ONE <mark>; content flags ('e' equation,
487
+ // 'p' page mention) replace the placeholder glyph. Every other flag wraps the
488
+ // resulting content from the inside out.
489
+ const isColour = (a: unknown): boolean => Array.isArray(a) && a[0] === 'h';
490
+ const isContent = (a: unknown): boolean => Array.isArray(a) && (a[0] === 'e' || a[0] === 'p');
491
+ const inner = annotations
492
+ .filter((a) => !isColour(a) && !isContent(a))
493
+ .reduce<string>((html, annotation) => wrapMark(annotation, html), segmentContent(raw, annotations, byId));
494
+ const style = buildColourStyle(annotations.filter(isColour));
495
+
496
+ return style.length > 0 ? `<mark style="${style}">${inner}</mark>` : inner;
497
+ }
498
+
499
+ /**
500
+ * The base inner content of a segment: an inline `<code>` LaTeX equation (`e`),
501
+ * a resolved page-mention title (`p`), or the plain escaped text. Equation and
502
+ * mention flags carry their content in the flag args / record-map, so they
503
+ * replace the segment's placeholder glyph (`⁍` / `‣`) entirely.
504
+ */
505
+ function segmentContent(raw: string, annotations: unknown[], byId?: Map<string, NotionValue>): string {
506
+ const latex = flagArg(annotations, 'e');
507
+
508
+ if (latex !== null) {
509
+ return `<code>${escapeHtml(latex)}</code>`;
510
+ }
511
+
512
+ const pageId = flagArg(annotations, 'p');
513
+
514
+ if (pageId !== null) {
515
+ return pageMentionContent(pageId, raw, byId);
516
+ }
517
+
518
+ return escapeHtml(raw);
519
+ }
520
+
521
+ /** The string argument of the first `[flag, arg, …]` annotation, or `null`. */
522
+ function flagArg(annotations: unknown[], flag: string): string | null {
523
+ for (const annotation of annotations) {
524
+ if (Array.isArray(annotation) && annotation[0] === flag && typeof annotation[1] === 'string') {
525
+ return annotation[1];
526
+ }
527
+ }
528
+
529
+ return null;
530
+ }
531
+
532
+ /**
533
+ * Resolve a page-mention to the referenced page's title when it is present in
534
+ * the pasted payload; otherwise keep the original placeholder text. (Mentions
535
+ * usually point at pages outside the copied selection, which are unresolvable.)
536
+ */
537
+ function pageMentionContent(pageId: string, raw: string, byId?: Map<string, NotionValue>): string {
538
+ const titleText = plainText(byId?.get(pageId)?.properties?.title);
539
+
540
+ return escapeHtml(titleText.length > 0 ? titleText : raw);
541
+ }
542
+
543
+ /** A parsed Notion colour token: a preset name applied as text or background. */
544
+ interface NotionColour {
545
+ mode: 'text' | 'bg';
546
+ name: string;
547
+ }
548
+
549
+ /**
550
+ * Parse a Notion colour token (`orange`, `gray_background`, `default`) into a
551
+ * preset name + mode, or `null` for the no-colour `default` token.
552
+ */
553
+ function parseNotionColour(token: unknown): NotionColour | null {
554
+ if (typeof token !== 'string' || token.length === 0 || token === 'default') {
555
+ return null;
556
+ }
557
+
558
+ const suffix = '_background';
559
+ const colour: NotionColour = token.endsWith(suffix)
560
+ ? { mode: 'bg', name: token.slice(0, -suffix.length) }
561
+ : { mode: 'text', name: token };
562
+
563
+ // `default` / `default_background` mean "no tint" — surface as no colour.
564
+ return colour.name === 'default' ? null : colour;
565
+ }
566
+
567
+ /** Build a `<mark>` style string from one or more Notion colour flags. */
568
+ function buildColourStyle(colourFlags: unknown[]): string {
569
+ const colours = colourFlags
570
+ .map((flag) => parseNotionColour(Array.isArray(flag) ? flag[1] : undefined))
571
+ .filter((colour): colour is NotionColour => colour !== null);
572
+ const text = colours.find((colour) => colour.mode === 'text');
573
+ const background = colours.find((colour) => colour.mode === 'bg');
574
+ const parts: string[] = [];
575
+
576
+ if (text) {
577
+ parts.push(`color: ${colorVarName(text.name, 'text')}`);
578
+ }
579
+
580
+ if (background) {
581
+ parts.push(`background-color: ${colorVarName(background.name, 'bg')}`);
582
+ }
583
+
584
+ return parts.join('; ');
585
+ }
586
+
587
+ /** Map a Notion `block_color` to callout `{ textColor, backgroundColor }` names. */
588
+ function parseBlockColor(token: unknown): { textColor: string | null; backgroundColor: string | null } {
589
+ const colour = parseNotionColour(token);
590
+
591
+ if (colour === null) {
592
+ return { textColor: null, backgroundColor: null };
593
+ }
594
+
595
+ return colour.mode === 'text'
596
+ ? { textColor: colour.name, backgroundColor: null }
597
+ : { textColor: null, backgroundColor: colour.name };
598
+ }
599
+
600
+ /** Wrap inner HTML with the Blok inline tag for a single Notion mark flag. */
601
+ function wrapMark(annotation: unknown, inner: string): string {
602
+ if (!Array.isArray(annotation)) {
603
+ return inner;
604
+ }
605
+
606
+ switch (annotation[0]) {
607
+ case 'b':
608
+ return `<b>${inner}</b>`;
609
+ case 'i':
610
+ return `<i>${inner}</i>`;
611
+ case 's':
612
+ return `<s>${inner}</s>`;
613
+ case 'c':
614
+ return `<code>${inner}</code>`;
615
+ case '_':
616
+ return `<u>${inner}</u>`;
617
+ case 'a': {
618
+ const href = safeHref(annotation[1]);
619
+
620
+ return href === null ? inner : `<a href="${escapeAttr(href)}">${inner}</a>`;
621
+ }
622
+ default:
623
+ // 'h' (colour), 'e' (equation) and 'p' (page mention) are handled before
624
+ // wrapping (in segmentHtml / segmentContent), not here.
625
+ return inner;
626
+ }
627
+ }
628
+
629
+ /**
630
+ * Validate a link href against a scheme allow-list, returning the trimmed URL
631
+ * or `null` for dangerous schemes (`javascript:`, `data:`, `vbscript:`…).
632
+ * A malicious Notion clipboard payload could otherwise smuggle a script URI
633
+ * into `data.text`, which the link tool's sanitizer preserves verbatim.
634
+ */
635
+ function safeHref(raw: unknown): string | null {
636
+ if (typeof raw !== 'string') {
637
+ return null;
638
+ }
639
+
640
+ const trimmed = raw.trim();
641
+
642
+ // http(s), mailto, tel, and relative/anchor links only.
643
+ return /^(?:https?:|mailto:|tel:|#|\/|\.\/|\.\.\/)/i.test(trimmed) ? trimmed : null;
644
+ }
645
+
646
+ /** Escape `&`, `<`, `>` for HTML text content. */
647
+ function escapeHtml(text: string): string {
648
+ return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
649
+ }
650
+
651
+ /** Escape a string for use inside a double-quoted HTML attribute. */
652
+ function escapeAttr(text: string): string {
653
+ return escapeHtml(text).replace(/"/g, '&quot;');
654
+ }