@jackuait/blok 0.10.0-beta.6 → 0.10.0-beta.7

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 (409) hide show
  1. package/codemod/migrate-editorjs-to-blok.js +0 -2
  2. package/codemod/test.js +0 -6
  3. package/dist/blok.mjs +2 -2
  4. package/dist/chunks/_basePickBy-BHRNO12X.mjs +410 -0
  5. package/dist/chunks/_baseUniq-DtFPDBML.mjs +1045 -0
  6. package/dist/chunks/_getTag-ozrhqxk_.mjs +26 -0
  7. package/dist/chunks/arc-BEqJP9HX.mjs +80 -0
  8. package/dist/chunks/architecture-YZFGNWBL-Bcu-90pi.mjs +3 -0
  9. package/dist/chunks/architectureDiagram-Q4EWVU46-BMno5LCn.mjs +4066 -0
  10. package/dist/chunks/array-Cyf-61SV.mjs +6 -0
  11. package/dist/chunks/blockDiagram-DXYQGD6D-DlP_cPth.mjs +3259 -0
  12. package/dist/chunks/{blok-BdlR_lX6.mjs → blok-CiLRmoHI.mjs} +850 -855
  13. package/dist/chunks/c4Diagram-AHTNJAMY-BbVV8EXj.mjs +2956 -0
  14. package/dist/chunks/channel-DPcniO2B.mjs +5 -0
  15. package/dist/chunks/chunk-2KRD3SAO-CazES4VS.mjs +20 -0
  16. package/dist/chunks/chunk-336JU56O-heO72r_k.mjs +49 -0
  17. package/dist/chunks/chunk-426QAEUC-CmCcml1z.mjs +13 -0
  18. package/dist/chunks/chunk-4BX2VUAB-B10DxOza.mjs +19 -0
  19. package/dist/chunks/chunk-4TB4RGXK-B0snhZOU.mjs +3250 -0
  20. package/dist/chunks/chunk-55IACEB6-CGkn5ABd.mjs +8 -0
  21. package/dist/chunks/chunk-5FUZZQ4R-USdumo_u.mjs +3786 -0
  22. package/dist/chunks/chunk-5PVQY5BW-CxUGVzQL.mjs +1692 -0
  23. package/dist/chunks/chunk-67CJDMHE-Bvw55oRa.mjs +20 -0
  24. package/dist/chunks/chunk-7N4EOEYR-Bs2qDy88.mjs +29 -0
  25. package/dist/chunks/chunk-AA7GKIK3-Bss0LgrN.mjs +24 -0
  26. package/dist/chunks/chunk-BSJP7CBP-CpUW7gi5.mjs +83 -0
  27. package/dist/chunks/chunk-CIAEETIT-DlRbLLf3.mjs +20 -0
  28. package/dist/chunks/{chunk-Byubey_H.mjs → chunk-D6kmoKXy.mjs} +5 -5
  29. package/dist/chunks/chunk-EDXVE4YY-DEcX4XWm.mjs +26 -0
  30. package/dist/chunks/chunk-ENJZ2VHE-B4THRZkR.mjs +566 -0
  31. package/dist/chunks/chunk-FMBD7UC4-CF6BKEiV.mjs +5 -0
  32. package/dist/chunks/chunk-FOC6F5B3--xuza7Yn.mjs +20 -0
  33. package/dist/chunks/chunk-ICPOFSXX-BMja8cuy.mjs +3290 -0
  34. package/dist/chunks/chunk-K5T4RW27-CHEqGHFS.mjs +16370 -0
  35. package/dist/chunks/chunk-KGLVRYIC-DHYYpR8v.mjs +20 -0
  36. package/dist/chunks/chunk-LIHQZDEY-AvbOvyLE.mjs +55 -0
  37. package/dist/chunks/chunk-ORNJ4GCN-38fbR5OS.mjs +25 -0
  38. package/dist/chunks/chunk-OYMX7WX6-BiqlATPA.mjs +2038 -0
  39. package/dist/chunks/chunk-QZHKN3VN-DitZIvj8.mjs +12 -0
  40. package/dist/chunks/chunk-U2HBQHQK-DJytnHmZ.mjs +1875 -0
  41. package/dist/chunks/chunk-X2U36JSP-DlOifw1K.mjs +68 -0
  42. package/dist/chunks/chunk-XPW4576I-s4fsi4XO.mjs +1146 -0
  43. package/dist/chunks/chunk-YZCP3GAM-Ch258bXC.mjs +60 -0
  44. package/dist/chunks/chunk-ZZ45TVLE-DWziaKxP.mjs +33 -0
  45. package/dist/chunks/classDiagram-6PBFFD2Q-BOkAe08u.mjs +30 -0
  46. package/dist/chunks/classDiagram-v2-HSJHXN6E-DeKatSvh.mjs +30 -0
  47. package/dist/chunks/clone-CJCz7VRp.mjs +8 -0
  48. package/dist/chunks/{constants-Cp8O0UfP.mjs → constants-DFS8l39Y.mjs} +49 -50
  49. package/dist/chunks/cose-bilkent-S5V4N54A-CzLGVqvr.mjs +2246 -0
  50. package/dist/chunks/cytoscape.esm-D0iglm-M.mjs +18108 -0
  51. package/dist/chunks/dagre-KV5264BT-XbHSjleO.mjs +298 -0
  52. package/dist/chunks/dagre-XY8CZ1sg.mjs +1536 -0
  53. package/dist/chunks/defaultLocale-DFhS1600.mjs +201 -0
  54. package/dist/chunks/diagram-5BDNPKRD-CM7c3UTI.mjs +112 -0
  55. package/dist/chunks/diagram-G4DWMVQ6-Bhg4ps6b.mjs +546 -0
  56. package/dist/chunks/diagram-MMDJMWI5-C-UCVaxB.mjs +234 -0
  57. package/dist/chunks/diagram-TYMM5635-BOHSujSD.mjs +144 -0
  58. package/dist/chunks/dist-DHsXIYdd.mjs +59 -0
  59. package/dist/chunks/erDiagram-SMLLAGMA-CwKxXFMB.mjs +1712 -0
  60. package/dist/chunks/flowDiagram-DWJPFMVM-rQJKfyuO.mjs +4175 -0
  61. package/dist/chunks/ganttDiagram-T4ZO3ILL-DfaZirLX.mjs +3083 -0
  62. package/dist/chunks/gitGraph-7Q5UKJZL-BKG8cHGz.mjs +3 -0
  63. package/dist/chunks/gitGraphDiagram-UUTBAWPF-CRa-ymsI.mjs +792 -0
  64. package/dist/chunks/graphlib-CuDElSdG.mjs +223 -0
  65. package/dist/chunks/{i18next-loader-oDO9ZKUV.mjs → i18next-loader-CasQQb5s.mjs} +2 -2
  66. package/dist/chunks/info-OMHHGYJF-FKqYyUn9.mjs +3 -0
  67. package/dist/chunks/infoDiagram-42DDH7IO-CvyJU2nE.mjs +29 -0
  68. package/dist/chunks/init-JlKGZtuT.mjs +15 -0
  69. package/dist/chunks/ishikawaDiagram-UXIWVN3A-CIpbw1BK.mjs +719 -0
  70. package/dist/chunks/journeyDiagram-VCZTEJTY-H96UcUK9.mjs +885 -0
  71. package/dist/chunks/kanban-definition-6JOO6SKY-BYZT3srA.mjs +980 -0
  72. package/dist/chunks/{katex-NjLaA6AJ.mjs → katex-JyOgX6MW.mjs} +1 -1
  73. package/dist/chunks/{lightweight-i18n-DTySD6f6.mjs → lightweight-i18n-Cvv8CWh4.mjs} +13 -0
  74. package/dist/chunks/line-B9xUUA7k.mjs +34 -0
  75. package/dist/chunks/linear-Dj-1yA_B.mjs +289 -0
  76. package/dist/chunks/mermaid-parser.core-D6OPAUtM.mjs +57 -0
  77. package/dist/chunks/mermaid.core-BPN9ZHKQ.mjs +989 -0
  78. package/dist/{messages-B4lhNMKm2.mjs → chunks/messages--YKhFEDE.mjs} +28 -3
  79. package/dist/chunks/{messages-CF_PfacZ.mjs → messages-0Uwu1AMJ2.mjs} +26 -1
  80. package/dist/{messages-Bug6Du35.mjs → chunks/messages-1__0Ph4Q.mjs} +26 -1
  81. package/dist/chunks/{messages-CnQydQJd2.mjs → messages-4sm9Pb0C.mjs} +26 -1
  82. package/dist/chunks/{messages-BDXl53cy2.mjs → messages-4uxjtzKW.mjs} +26 -1
  83. package/dist/{messages-DQN1y6E9.mjs → chunks/messages-B-SwLgkQ.mjs} +28 -3
  84. package/dist/chunks/{messages-BlcRm2I3.mjs → messages-B1ylBxXQ.mjs} +26 -1
  85. package/dist/{messages-12_eyAo-.mjs → chunks/messages-B5m3dhKc.mjs} +26 -1
  86. package/dist/chunks/{messages-D8-N0FmU.mjs → messages-B6n2zDtv.mjs} +27 -2
  87. package/dist/chunks/{messages-BMq9k_lI.mjs → messages-BC9w4zAT.mjs} +26 -1
  88. package/dist/{messages-CsiGzUSP2.mjs → chunks/messages-BOj-7N3p.mjs} +26 -1
  89. package/dist/chunks/{messages-CvlMT1e62.mjs → messages-BRYHTS18.mjs} +26 -1
  90. package/dist/{messages-hrSlVSHp.mjs → chunks/messages-BSBbVjor.mjs} +33 -8
  91. package/dist/{messages-uCsQjz7M.mjs → chunks/messages-BUUkmUGc.mjs} +26 -1
  92. package/dist/chunks/{messages-DopbvJlg.mjs → messages-Bb3YEV2P.mjs} +31 -6
  93. package/dist/{messages-KqWQKmIu2.mjs → chunks/messages-Be_6YLzJ.mjs} +27 -2
  94. package/dist/chunks/{messages-BXn9Vzbx2.mjs → messages-BevRhv5d.mjs} +26 -1
  95. package/dist/chunks/{messages-DQ5ng0_t2.mjs → messages-Bhqr7Im2.mjs} +26 -1
  96. package/dist/{messages-B3Yhiycb2.mjs → chunks/messages-BpJFjSKa.mjs} +27 -2
  97. package/dist/chunks/{messages-BaoJwsEZ.mjs → messages-BqYlq_Bn.mjs} +26 -1
  98. package/dist/chunks/{messages-vN4T4r67.mjs → messages-BtAwCUfD.mjs} +26 -1
  99. package/dist/{messages-Cb3wXGnc.mjs → chunks/messages-Bthbp65G.mjs} +27 -2
  100. package/dist/{messages-x353UCBI.mjs → chunks/messages-BvHMZ8Pi2.mjs} +26 -1
  101. package/dist/{messages-BOE2mzCj2.mjs → chunks/messages-Bw1BE9jW.mjs} +26 -1
  102. package/dist/chunks/{messages-C5aCWL7B.mjs → messages-Bx6Wt285.mjs} +26 -1
  103. package/dist/{messages-C8f1I5EQ2.mjs → chunks/messages-BzslJRYv.mjs} +27 -2
  104. package/dist/chunks/{messages-CZ5Sbf8U.mjs → messages-C02M0Tpw.mjs} +26 -1
  105. package/dist/chunks/{messages-DN-194c32.mjs → messages-C1u3E9qg.mjs} +26 -1
  106. package/dist/chunks/{messages-DdmWzF5M.mjs → messages-C68WgSKk.mjs} +27 -2
  107. package/dist/chunks/{messages-Dgng6KN8.mjs → messages-C8w8JCP0.mjs} +28 -3
  108. package/dist/chunks/{messages-B5fKJXd6.mjs → messages-CFOZdSk4.mjs} +26 -1
  109. package/dist/chunks/{messages-5ArOv8cj.mjs → messages-CGOY79lr.mjs} +26 -1
  110. package/dist/{messages-mipkPgwQ2.mjs → chunks/messages-CGaSMZPu.mjs} +26 -1
  111. package/dist/{messages-Dq_v7slw2.mjs → chunks/messages-CJJgQ0BH.mjs} +26 -1
  112. package/dist/chunks/{messages-DUGEqDEG.mjs → messages-CTD6rtQj2.mjs} +26 -1
  113. package/dist/{messages-DIKCwGog.mjs → chunks/messages-CZymJML9.mjs} +30 -5
  114. package/dist/chunks/{messages-CcyIKgGU.mjs → messages-CfeFJbiv.mjs} +30 -5
  115. package/dist/chunks/{messages-BXSXk3oS2.mjs → messages-Cgatzu_z.mjs} +28 -3
  116. package/dist/{messages-CBPiFbEf2.mjs → chunks/messages-Ch2zBI602.mjs} +26 -1
  117. package/dist/chunks/{messages-yszqJukE.mjs → messages-CiAHsUfO.mjs} +26 -1
  118. package/dist/chunks/{messages-bmwto4UV.mjs → messages-Cuzq-tNW.mjs} +26 -1
  119. package/dist/{messages-JK9Okzsy2.mjs → chunks/messages-Cw4qiMwb.mjs} +26 -1
  120. package/dist/chunks/{messages-DSO2U-ul.mjs → messages-Cyh-mz40.mjs} +26 -1
  121. package/dist/{messages-DbZsJAff.mjs → chunks/messages-D-I2QO8H.mjs} +26 -1
  122. package/dist/chunks/{messages-BhcYsC_M2.mjs → messages-D0D2gruy.mjs} +26 -1
  123. package/dist/{messages-X80Nh0ib.mjs → chunks/messages-D1BKxfLD.mjs} +27 -2
  124. package/dist/chunks/{messages-CjVPwkVy.mjs → messages-D4eDs6R_.mjs} +26 -1
  125. package/dist/{messages-C5Uufygq.mjs → chunks/messages-D9Xr-hES.mjs} +26 -1
  126. package/dist/{messages-DkvQ-6HC2.mjs → chunks/messages-D9eJPHia.mjs} +28 -3
  127. package/dist/chunks/{messages-DRv4g-IA.mjs → messages-DBFWSzKY2.mjs} +26 -1
  128. package/dist/chunks/{messages-SSDr5fGF2.mjs → messages-DC0wu2S7.mjs} +26 -1
  129. package/dist/{messages-Bdk4ocMI.mjs → chunks/messages-DF9o19rG.mjs} +26 -1
  130. package/dist/chunks/{messages-DVKifYlq.mjs → messages-DFS_n986.mjs} +49 -24
  131. package/dist/{messages-CvvbLyTy2.mjs → chunks/messages-DGS4H30T.mjs} +26 -1
  132. package/dist/{messages-PvMdmlxI.mjs → chunks/messages-DKjddpzJ.mjs} +28 -3
  133. package/dist/chunks/{messages-DGD6BiGd.mjs → messages-DMvTdUXC.mjs} +28 -3
  134. package/dist/{messages-CD8K1g_t2.mjs → chunks/messages-DQUX-QYI2.mjs} +26 -1
  135. package/dist/chunks/{messages-CqgEz7C5.mjs → messages-DUigq8FO2.mjs} +26 -1
  136. package/dist/chunks/{messages-ByAqzAhB.mjs → messages-DY0FJdpH.mjs} +26 -1
  137. package/dist/{messages-DACg1XAu.mjs → chunks/messages-DfVXiqt-2.mjs} +26 -1
  138. package/dist/{messages-BYQ769S5.mjs → chunks/messages-DgZc9TJw.mjs} +26 -1
  139. package/dist/{messages-Dj79y02X.mjs → chunks/messages-QD4BCUDP.mjs} +26 -1
  140. package/dist/{messages-BeI2HORe2.mjs → chunks/messages-USmweex9.mjs} +26 -1
  141. package/dist/{messages-CEEzfqMO2.mjs → chunks/messages-a1JTi0Qm.mjs} +29 -4
  142. package/dist/chunks/{messages-Dz3UhEco2.mjs → messages-jcgCHPRn.mjs} +26 -1
  143. package/dist/{messages--cUQf9JX.mjs → chunks/messages-tnnqHpbd.mjs} +27 -2
  144. package/dist/chunks/{messages-DZwCufSb.mjs → messages-vzWKPLJO.mjs} +26 -1
  145. package/dist/chunks/{micromark-extension-math-CCEGWpdz.mjs → micromark-extension-math-Cz_ZZ_0Y.mjs} +1 -1
  146. package/dist/chunks/mindmap-definition-QFDTVHPH-BswFuNN6.mjs +1013 -0
  147. package/dist/chunks/ordinal-D1_lEgAO.mjs +65 -0
  148. package/dist/chunks/packet-4T2RLAQJ-DTUW2U0C.mjs +3 -0
  149. package/dist/chunks/path-6nYPAvNb.mjs +85 -0
  150. package/dist/chunks/pie-ZZUOXDRM-D-umqvEM.mjs +3 -0
  151. package/dist/chunks/pieDiagram-DEJITSTG-1WJgvK1w.mjs +179 -0
  152. package/dist/chunks/quadrantDiagram-34T5L4WZ-B_YH8QGl.mjs +1960 -0
  153. package/dist/chunks/radar-PYXPWWZC-DkQelf08.mjs +3 -0
  154. package/dist/chunks/requirementDiagram-MS252O5E-DRl0YJRI.mjs +2224 -0
  155. package/dist/chunks/rough.esm-CSWJruu5.mjs +1353 -0
  156. package/dist/chunks/sankeyDiagram-XADWPNL6-B-8IrknH.mjs +909 -0
  157. package/dist/chunks/sequenceDiagram-FGHM5R23-DTLb8qmO.mjs +4181 -0
  158. package/dist/chunks/src-CRgEHLPW.mjs +2149 -0
  159. package/dist/chunks/stateDiagram-FHFEXIEX-B0JFjLFy.mjs +218 -0
  160. package/dist/chunks/stateDiagram-v2-QKLJ7IA2-Co9CUU_z.mjs +28 -0
  161. package/dist/chunks/timeline-definition-GMOUNBTQ-CS9KTh-Q.mjs +1084 -0
  162. package/dist/chunks/{tools-DGOsJbHH.mjs → tools-CSYsrnud.mjs} +2116 -1268
  163. package/dist/chunks/treeView-SZITEDCU-DOOoyNP9.mjs +3 -0
  164. package/dist/chunks/treemap-W4RFUUIX-CsOoUA-u.mjs +3 -0
  165. package/dist/chunks/vennDiagram-DHZGUBPP-0BNu5Wna.mjs +1876 -0
  166. package/dist/chunks/wardley-RL74JXVD-CCzZcmEk.mjs +3 -0
  167. package/dist/chunks/wardleyDiagram-NUSXRM2D-Ca9XByNH.mjs +594 -0
  168. package/dist/chunks/xychartDiagram-5P7HB3ND-C8AyKUAE.mjs +2017 -0
  169. package/dist/cli.mjs +1 -1
  170. package/dist/full.mjs +3 -3
  171. package/dist/locales.mjs +80 -67
  172. package/dist/markdown.mjs +2 -2
  173. package/dist/{chunks/messages-9l49jauY.mjs → messages-5jvKxQNu2.mjs} +26 -1
  174. package/dist/{messages-CkySRhtd2.mjs → messages-7QD-X6XT2.mjs} +26 -1
  175. package/dist/{chunks/messages-Btr121zI2.mjs → messages-96iaAUds2.mjs} +27 -2
  176. package/dist/{chunks/messages-BAP2OAQk.mjs → messages-B19o-Teb.mjs} +28 -3
  177. package/dist/{messages-DJU4YLij.mjs → messages-B1ZUQagA.mjs} +26 -1
  178. package/dist/{messages-Dg2CDXZi2.mjs → messages-B7ieAJBd2.mjs} +26 -1
  179. package/dist/{messages-CByBLxWk.mjs → messages-BECMxmfX.mjs} +26 -1
  180. package/dist/{messages-CwCEcbWG.mjs → messages-BIHc0KHY.mjs} +27 -2
  181. package/dist/{messages-D8WvwU42.mjs → messages-BIoeoik5.mjs} +26 -1
  182. package/dist/{messages-D38h5XlF.mjs → messages-BJeGJksD.mjs} +26 -1
  183. package/dist/{messages-Cd23UgLV2.mjs → messages-BRZX964b2.mjs} +27 -2
  184. package/dist/{chunks/messages-B9N__q552.mjs → messages-BTQPpoM42.mjs} +29 -4
  185. package/dist/{messages-CUzBNjnc.mjs → messages-BYNcD6uR.mjs} +26 -1
  186. package/dist/{messages-DjWfVYHS2.mjs → messages-BYmmMDrN2.mjs} +26 -1
  187. package/dist/{chunks/messages-DkTxBa1V.mjs → messages-BbYq1pk-.mjs} +26 -1
  188. package/dist/{chunks/messages-BHhbHLoq.mjs → messages-BiUGXvYr2.mjs} +26 -1
  189. package/dist/{messages-So3SHdIc2.mjs → messages-BiiongNz2.mjs} +26 -1
  190. package/dist/{chunks/messages-BxBID_0B.mjs → messages-Bm0Feca1.mjs} +30 -5
  191. package/dist/{messages-C2veeQpU.mjs → messages-BmAn22OX.mjs} +26 -1
  192. package/dist/{messages-KbYSpNrE.mjs → messages-Bq3F2Tp_.mjs} +26 -1
  193. package/dist/{chunks/messages-Dux1S0-D2.mjs → messages-BsycN_JI2.mjs} +26 -1
  194. package/dist/{messages-DRU_IgoW.mjs → messages-BwHs4cm1.mjs} +30 -5
  195. package/dist/{messages-Cv-DKlZd.mjs → messages-CJTy6JZt.mjs} +26 -1
  196. package/dist/{chunks/messages-D7n_wJK7.mjs → messages-CR_L_UtK.mjs} +26 -1
  197. package/dist/{messages-DnhEzmXJ2.mjs → messages-CSUHBs4c2.mjs} +26 -1
  198. package/dist/{messages-C_HmWyXc2.mjs → messages-CWIXvnDf2.mjs} +26 -1
  199. package/dist/{messages-KSxF8eib.mjs → messages-CcF4y-E4.mjs} +26 -1
  200. package/dist/{chunks/messages-CL3mCbi6.mjs → messages-Ce6KVEbT.mjs} +27 -2
  201. package/dist/{chunks/messages-C-jA6Rf7.mjs → messages-Ci0KqX-J.mjs} +33 -8
  202. package/dist/{chunks/messages-DMyRdafk2.mjs → messages-CjbnogEC.mjs} +26 -1
  203. package/dist/{chunks/messages-BlO_37l_.mjs → messages-CmB406HW.mjs} +28 -3
  204. package/dist/{messages-Cho2VTAX.mjs → messages-CqXtJTpU.mjs} +26 -1
  205. package/dist/{messages-CWEL1WDy2.mjs → messages-D0aw5_0k2.mjs} +28 -3
  206. package/dist/{messages-CgEDVri-2.mjs → messages-D8FQWulF2.mjs} +26 -1
  207. package/dist/{chunks/messages-B5aAzExz.mjs → messages-DBiVgUs2.mjs} +27 -2
  208. package/dist/{chunks/messages-DYizZHT2.mjs → messages-DIJlIqlQ2.mjs} +26 -1
  209. package/dist/{messages-BPL7riv-.mjs → messages-DLX_iBDJ.mjs} +26 -1
  210. package/dist/{messages-vptt-pVF.mjs → messages-DLlc9QPw.mjs} +26 -1
  211. package/dist/{chunks/messages-876bKyUj2.mjs → messages-DMr62KiO2.mjs} +26 -1
  212. package/dist/{chunks/messages-CgedvWCf.mjs → messages-DPA-mMWC2.mjs} +27 -2
  213. package/dist/{messages-vcoib5Ga.mjs → messages-DTh9a8mR.mjs} +26 -1
  214. package/dist/{chunks/messages-DgEGJECT.mjs → messages-DY4IqlhY.mjs} +26 -1
  215. package/dist/{chunks/messages-CdzF0Hvl.mjs → messages-DYTTu0O12.mjs} +26 -1
  216. package/dist/{messages-rbox5gSb2.mjs → messages-DbySKTKt2.mjs} +28 -3
  217. package/dist/{chunks/messages-BGCQCeWd.mjs → messages-Ddnj2iTG2.mjs} +26 -1
  218. package/dist/{chunks/messages-CNEJxD8q2.mjs → messages-DkLU_rWm.mjs} +26 -1
  219. package/dist/{chunks/messages-FYl9woii2.mjs → messages-Dl3Sv6Rq2.mjs} +27 -2
  220. package/dist/{messages-Clsh86WQ.mjs → messages-Dl5Y2-Ia.mjs} +49 -24
  221. package/dist/{chunks/messages-CKRJDX0K2.mjs → messages-DnG0ef8t2.mjs} +28 -3
  222. package/dist/{chunks/messages-CyxDkx8a.mjs → messages-DnGJD4TL.mjs} +26 -1
  223. package/dist/{chunks/messages-DnJHflSh.mjs → messages-Dnp9N6RU2.mjs} +26 -1
  224. package/dist/{chunks/messages-Jps5Tc77.mjs → messages-Dvn35ksS.mjs} +26 -1
  225. package/dist/{messages-ChTWmxS8.mjs → messages-Dw__BcTj.mjs} +26 -1
  226. package/dist/{messages-D7juvhHp.mjs → messages-Dy-Y_nEI.mjs} +26 -1
  227. package/dist/{messages-CNNcKuGH.mjs → messages-E_ZuzGDt.mjs} +26 -1
  228. package/dist/{chunks/messages-DJO0ERQT.mjs → messages-F2xRoY1w.mjs} +26 -1
  229. package/dist/{messages-DqJTZbwt.mjs → messages-Smt4GBbj.mjs} +31 -6
  230. package/dist/{chunks/messages-D8dKkyII2.mjs → messages-aMXpHt5X2.mjs} +26 -1
  231. package/dist/{chunks/messages-DWD0ry9x.mjs → messages-aWZH50vu2.mjs} +28 -3
  232. package/dist/{chunks/messages-BbfLRqLh2.mjs → messages-dv19AkyJ.mjs} +26 -1
  233. package/dist/{chunks/messages-Dw2rmKMi2.mjs → messages-hWwSRF-2.mjs} +26 -1
  234. package/dist/{messages-En8LDjUB.mjs → messages-j7o5rT9s.mjs} +26 -1
  235. package/dist/{chunks/messages-NJsvFwJj.mjs → messages-nUVjeh7K.mjs} +27 -2
  236. package/dist/{messages-Cg1CF4pw.mjs → messages-nlhESX9t.mjs} +26 -1
  237. package/dist/{messages-CSl0Wla62.mjs → messages-rk-A1Wa42.mjs} +28 -3
  238. package/dist/{messages-nOe1gJYu.mjs → messages-xh2eOLvs.mjs} +26 -1
  239. package/dist/{messages-B_sKqaeK.mjs → messages-ynAe7ewZ.mjs} +26 -1
  240. package/dist/react.mjs +2 -2
  241. package/dist/tools.mjs +2 -2
  242. package/dist/vendor.LICENSE.txt +3254 -297
  243. package/package.json +7 -2
  244. package/src/components/constants/data-attributes.ts +0 -2
  245. package/src/components/i18n/locales/am/messages.json +26 -1
  246. package/src/components/i18n/locales/ar/messages.json +26 -1
  247. package/src/components/i18n/locales/az/messages.json +26 -1
  248. package/src/components/i18n/locales/bg/messages.json +26 -1
  249. package/src/components/i18n/locales/bn/messages.json +26 -1
  250. package/src/components/i18n/locales/bs/messages.json +28 -3
  251. package/src/components/i18n/locales/cs/messages.json +30 -5
  252. package/src/components/i18n/locales/da/messages.json +33 -8
  253. package/src/components/i18n/locales/de/messages.json +31 -6
  254. package/src/components/i18n/locales/dv/messages.json +26 -1
  255. package/src/components/i18n/locales/el/messages.json +26 -1
  256. package/src/components/i18n/locales/en/messages.json +13 -0
  257. package/src/components/i18n/locales/es/messages.json +27 -2
  258. package/src/components/i18n/locales/et/messages.json +30 -5
  259. package/src/components/i18n/locales/fa/messages.json +26 -1
  260. package/src/components/i18n/locales/fi/messages.json +26 -1
  261. package/src/components/i18n/locales/fil/messages.json +49 -24
  262. package/src/components/i18n/locales/fr/messages.json +27 -2
  263. package/src/components/i18n/locales/gu/messages.json +26 -1
  264. package/src/components/i18n/locales/he/messages.json +26 -1
  265. package/src/components/i18n/locales/hi/messages.json +26 -1
  266. package/src/components/i18n/locales/hr/messages.json +28 -3
  267. package/src/components/i18n/locales/hu/messages.json +27 -2
  268. package/src/components/i18n/locales/hy/messages.json +26 -1
  269. package/src/components/i18n/locales/id/messages.json +26 -1
  270. package/src/components/i18n/locales/it/messages.json +27 -2
  271. package/src/components/i18n/locales/ja/messages.json +26 -1
  272. package/src/components/i18n/locales/ka/messages.json +26 -1
  273. package/src/components/i18n/locales/km/messages.json +26 -1
  274. package/src/components/i18n/locales/kn/messages.json +26 -1
  275. package/src/components/i18n/locales/ko/messages.json +26 -1
  276. package/src/components/i18n/locales/ku/messages.json +26 -1
  277. package/src/components/i18n/locales/lo/messages.json +26 -1
  278. package/src/components/i18n/locales/lt/messages.json +26 -1
  279. package/src/components/i18n/locales/lv/messages.json +26 -1
  280. package/src/components/i18n/locales/mk/messages.json +26 -1
  281. package/src/components/i18n/locales/ml/messages.json +26 -1
  282. package/src/components/i18n/locales/mn/messages.json +26 -1
  283. package/src/components/i18n/locales/mr/messages.json +26 -1
  284. package/src/components/i18n/locales/ms/messages.json +28 -3
  285. package/src/components/i18n/locales/my/messages.json +26 -1
  286. package/src/components/i18n/locales/ne/messages.json +26 -1
  287. package/src/components/i18n/locales/nl/messages.json +28 -3
  288. package/src/components/i18n/locales/no/messages.json +29 -4
  289. package/src/components/i18n/locales/pa/messages.json +26 -1
  290. package/src/components/i18n/locales/pl/messages.json +27 -2
  291. package/src/components/i18n/locales/ps/messages.json +26 -1
  292. package/src/components/i18n/locales/pt/messages.json +27 -2
  293. package/src/components/i18n/locales/ro/messages.json +27 -2
  294. package/src/components/i18n/locales/ru/messages.json +26 -1
  295. package/src/components/i18n/locales/sd/messages.json +26 -1
  296. package/src/components/i18n/locales/si/messages.json +26 -1
  297. package/src/components/i18n/locales/sk/messages.json +28 -3
  298. package/src/components/i18n/locales/sl/messages.json +28 -3
  299. package/src/components/i18n/locales/sq/messages.json +27 -2
  300. package/src/components/i18n/locales/sr/messages.json +26 -1
  301. package/src/components/i18n/locales/sv/messages.json +28 -3
  302. package/src/components/i18n/locales/sw/messages.json +26 -1
  303. package/src/components/i18n/locales/ta/messages.json +26 -1
  304. package/src/components/i18n/locales/te/messages.json +26 -1
  305. package/src/components/i18n/locales/th/messages.json +26 -1
  306. package/src/components/i18n/locales/tr/messages.json +26 -1
  307. package/src/components/i18n/locales/ug/messages.json +26 -1
  308. package/src/components/i18n/locales/uk/messages.json +26 -1
  309. package/src/components/i18n/locales/ur/messages.json +26 -1
  310. package/src/components/i18n/locales/vi/messages.json +26 -1
  311. package/src/components/i18n/locales/yi/messages.json +26 -1
  312. package/src/components/i18n/locales/zh/messages.json +26 -1
  313. package/src/components/icons/index.ts +38 -0
  314. package/src/components/modules/ui.ts +0 -13
  315. package/src/stories/EditorModes.stories.ts +0 -60
  316. package/src/styles/main.css +39 -1
  317. package/src/tools/callout/emoji-picker/index.ts +3 -2
  318. package/src/tools/code/code-keyboard.ts +16 -9
  319. package/src/tools/code/constants.ts +26 -3
  320. package/src/tools/code/dom-builder.ts +40 -5
  321. package/src/tools/code/highlight-applier.ts +229 -0
  322. package/src/tools/code/index.ts +141 -1
  323. package/src/tools/code/mermaid-loader.ts +45 -0
  324. package/src/tools/code/shiki-loader.ts +135 -0
  325. package/src/tools/table/core/table-commands.ts +16 -0
  326. package/src/tools/table/core/table-controller.ts +29 -0
  327. package/src/tools/table/core/table-events.ts +17 -0
  328. package/src/tools/table/index.ts +194 -11
  329. package/src/tools/table/table-cell-blocks.ts +9 -6
  330. package/src/tools/table/table-cell-clipboard.ts +6 -1
  331. package/src/tools/table/table-cell-placement-picker.ts +133 -0
  332. package/src/tools/table/table-cell-selection.ts +174 -19
  333. package/src/tools/table/table-core.ts +321 -113
  334. package/src/tools/table/table-map.ts +279 -0
  335. package/src/tools/table/table-model.ts +901 -1
  336. package/src/tools/table/table-operations.ts +78 -44
  337. package/src/tools/table/table-resize.ts +19 -17
  338. package/src/tools/table/table-row-col-drag.ts +24 -10
  339. package/src/tools/table/types.ts +24 -2
  340. package/types/data-attributes.d.ts +0 -1
  341. package/types/tools/code.d.ts +2 -0
  342. /package/dist/chunks/{am-CS-JjQ0N.mjs → am-rVzV1W41.mjs} +0 -0
  343. /package/dist/chunks/{ar-Dt4XzR5U.mjs → ar-C710lkoH.mjs} +0 -0
  344. /package/dist/chunks/{az-CaDTXby8.mjs → az-BOp1pgua.mjs} +0 -0
  345. /package/dist/chunks/{bg-D1pLog-R.mjs → bg-CL9p09ZD.mjs} +0 -0
  346. /package/dist/chunks/{bn-Db_ae60m.mjs → bn-CNmSeyAy.mjs} +0 -0
  347. /package/dist/chunks/{bs-DJTg1R9e.mjs → bs-BRzMGqzk.mjs} +0 -0
  348. /package/dist/chunks/{cs-_Gc21gSL.mjs → cs-BYPBLmnF.mjs} +0 -0
  349. /package/dist/chunks/{da-xDB8uhCd.mjs → da-CBC_LR1c.mjs} +0 -0
  350. /package/dist/chunks/{de-B6gVjh1Z.mjs → de-DxRFMoAj.mjs} +0 -0
  351. /package/dist/chunks/{el-ClbRSnOs.mjs → el-Bk6YbySf.mjs} +0 -0
  352. /package/dist/chunks/{es-CuY9rnLK.mjs → es-DpT3FCMR.mjs} +0 -0
  353. /package/dist/chunks/{et-BLu5lDVc.mjs → et-DE9Dr_g9.mjs} +0 -0
  354. /package/dist/chunks/{fa-P3gnrZH8.mjs → fa-Banj1QUE.mjs} +0 -0
  355. /package/dist/chunks/{fi-B8PVHLjq.mjs → fi-DfN3M5ER.mjs} +0 -0
  356. /package/dist/chunks/{fil-B9JII5iF.mjs → fil-DbCsRS1d.mjs} +0 -0
  357. /package/dist/chunks/{fr-BWLDZdcc.mjs → fr-D1clKhgt.mjs} +0 -0
  358. /package/dist/chunks/{gu-BH3R_s4c.mjs → gu-1CsZyRwT.mjs} +0 -0
  359. /package/dist/chunks/{he-CCmeCVR_.mjs → he-qQdnL6eK.mjs} +0 -0
  360. /package/dist/chunks/{hi-BBav00DN.mjs → hi-DxM0Nff1.mjs} +0 -0
  361. /package/dist/chunks/{hr-B5ZX0r9G.mjs → hr-Onldyi-u.mjs} +0 -0
  362. /package/dist/chunks/{hu-1jgDa3YU.mjs → hu-CAn3pBuY.mjs} +0 -0
  363. /package/dist/chunks/{hy-LX4Kp2PE.mjs → hy-D43q7NxE.mjs} +0 -0
  364. /package/dist/chunks/{i18next-KNC_XV5x.mjs → i18next-BBGW2sDE.mjs} +0 -0
  365. /package/dist/chunks/{id-CcG40D1H.mjs → id-Xrw5Dd0Y.mjs} +0 -0
  366. /package/dist/chunks/{it-Cb8_K72W.mjs → it-CA9ZDMSc.mjs} +0 -0
  367. /package/dist/chunks/{ja-ipCH91mv.mjs → ja-D0J6WRFh.mjs} +0 -0
  368. /package/dist/chunks/{ka-BRvREIgq.mjs → ka-BZL7xDuY.mjs} +0 -0
  369. /package/dist/chunks/{km-BJwVw7Fg.mjs → km-BimgQZVU.mjs} +0 -0
  370. /package/dist/chunks/{kn-BPgUazCC.mjs → kn-C2n2cPHK.mjs} +0 -0
  371. /package/dist/chunks/{ko-CQLzxe7k.mjs → ko-n4Cn93D3.mjs} +0 -0
  372. /package/dist/chunks/{ku-BHhHu8Iz.mjs → ku-BYZCgT44.mjs} +0 -0
  373. /package/dist/chunks/{lo-DsTgYblY.mjs → lo-DVXiAE4N.mjs} +0 -0
  374. /package/dist/chunks/{lt-CDzHJm71.mjs → lt-B9KlQFnY.mjs} +0 -0
  375. /package/dist/chunks/{lv-MLLIAnIX.mjs → lv-BINeOdyx.mjs} +0 -0
  376. /package/dist/chunks/{mdast-util-math-yS0EygZV.mjs → mdast-util-math-CHYUxOHk.mjs} +0 -0
  377. /package/dist/chunks/{mk-DQdmUquZ.mjs → mk-_-QrPrLN.mjs} +0 -0
  378. /package/dist/chunks/{ml-DqehZnra.mjs → ml-KvJSC1KT.mjs} +0 -0
  379. /package/dist/chunks/{mn-4cFkKFjW.mjs → mn-CjFjWnRG.mjs} +0 -0
  380. /package/dist/chunks/{mr-DWiztOP4.mjs → mr-DqAZ7FRX.mjs} +0 -0
  381. /package/dist/chunks/{ms-BSz-iSnc.mjs → ms-BZcV4UG_.mjs} +0 -0
  382. /package/dist/chunks/{my-DbtbM1MW.mjs → my-97SC9jYN.mjs} +0 -0
  383. /package/dist/chunks/{ne-CqALWw_f.mjs → ne-Bs-M2TyF.mjs} +0 -0
  384. /package/dist/chunks/{nl-D_ra6RvH.mjs → nl-2ZwQilo-.mjs} +0 -0
  385. /package/dist/chunks/{no-Cg_kz_jl.mjs → no-fOQTpFq1.mjs} +0 -0
  386. /package/dist/chunks/{notifier-BOwxj_Ok.mjs → notifier-B1zCi9G1.mjs} +0 -0
  387. /package/dist/chunks/{pa-NLAsNqwY.mjs → pa-DLOqkMi0.mjs} +0 -0
  388. /package/dist/chunks/{pl-NHKp4YDg.mjs → pl-FYs9QrXU.mjs} +0 -0
  389. /package/dist/chunks/{ps-D1zEqNeg.mjs → ps-CTXe6pSe.mjs} +0 -0
  390. /package/dist/chunks/{pt-DBtqbUEB.mjs → pt-B1X4x7d1.mjs} +0 -0
  391. /package/dist/chunks/{ro-lqr63ai5.mjs → ro-Bf7S2FaR.mjs} +0 -0
  392. /package/dist/chunks/{ru-BycNnDyN.mjs → ru-B8lqnu_j.mjs} +0 -0
  393. /package/dist/chunks/{sd-DpHpIN9Z.mjs → sd-CHRYJm2r.mjs} +0 -0
  394. /package/dist/chunks/{si-BwiwaC7N.mjs → si-CI0Hs6vH.mjs} +0 -0
  395. /package/dist/chunks/{sk-CqRHT2Gp.mjs → sk-Bdvq1Kb_.mjs} +0 -0
  396. /package/dist/chunks/{sl-DA348uQ_.mjs → sl-B_qiFTV5.mjs} +0 -0
  397. /package/dist/chunks/{sq-D7JNgve1.mjs → sq-E0j1hysP.mjs} +0 -0
  398. /package/dist/chunks/{sr-D8RK6Kwp.mjs → sr-VPpVNTZw.mjs} +0 -0
  399. /package/dist/chunks/{sv-dwgT67ZG.mjs → sv-gKmDSR3d.mjs} +0 -0
  400. /package/dist/chunks/{sw-ZRRJnkem.mjs → sw-zeFLiO23.mjs} +0 -0
  401. /package/dist/chunks/{ta-5x4L5Krl.mjs → ta-Ci-j89hR.mjs} +0 -0
  402. /package/dist/chunks/{te-BZpEimwA.mjs → te-qyMI0M7a.mjs} +0 -0
  403. /package/dist/chunks/{th-Bhr-33kv.mjs → th-DPxHtpdb.mjs} +0 -0
  404. /package/dist/chunks/{tr-6tSNKGNB.mjs → tr-CRV6GS-G.mjs} +0 -0
  405. /package/dist/chunks/{ug-_e-jvr2b.mjs → ug-DW0YFpo5.mjs} +0 -0
  406. /package/dist/chunks/{uk-DooSc2Ja.mjs → uk-ssteuphK.mjs} +0 -0
  407. /package/dist/chunks/{ur-rb-krkIO.mjs → ur-qhY3-jY7.mjs} +0 -0
  408. /package/dist/chunks/{vi-CQkLn2AQ.mjs → vi-CHriMMC8.mjs} +0 -0
  409. /package/dist/chunks/{zh-CXQ40Q2_.mjs → zh-BJktawVN.mjs} +0 -0
@@ -0,0 +1,229 @@
1
+ import { DARK_MODE_SELECTOR } from './constants';
2
+
3
+ export interface HighlightToken {
4
+ content: string;
5
+ color: string;
6
+ /** Character offset from the start of the LINE (not document) */
7
+ offset: number;
8
+ }
9
+
10
+ export interface ThemeTokens {
11
+ tokens: HighlightToken[][];
12
+ fg: string;
13
+ }
14
+
15
+ export interface DualThemeTokens {
16
+ light: ThemeTokens;
17
+ dark: ThemeTokens;
18
+ }
19
+
20
+ /** Typed subset of Highlight (Set-like, as per the CSS Custom Highlight API spec) */
21
+ interface HighlightSet extends Highlight {
22
+ add(range: Range): void;
23
+ delete(range: Range): boolean;
24
+ size: number;
25
+ }
26
+
27
+ /** Typed subset of the CSS Custom Highlight API HighlightRegistry (Map-like) */
28
+ interface HighlightMap {
29
+ get(name: string): HighlightSet | undefined;
30
+ set(name: string, highlight: HighlightSet): void;
31
+ delete(name: string): void;
32
+ keys(): IterableIterator<string>;
33
+ size: number;
34
+ }
35
+
36
+ /** CSS global augmented with the highlights registry (feature-detected at runtime) */
37
+ interface CSSWithHighlights {
38
+ highlights: HighlightMap;
39
+ }
40
+
41
+ const state = {
42
+ stylesheet: null as CSSStyleSheet | null,
43
+ knownRules: new Set<string>(),
44
+ };
45
+
46
+ export function isHighlightingSupported(): boolean {
47
+ return typeof CSS !== 'undefined' && 'highlights' in CSS;
48
+ }
49
+
50
+ function getHighlights(): HighlightMap {
51
+ return (CSS as unknown as CSSWithHighlights).highlights;
52
+ }
53
+
54
+ function ensureStylesheet(): CSSStyleSheet {
55
+ if (!state.stylesheet) {
56
+ state.stylesheet = new CSSStyleSheet();
57
+ document.adoptedStyleSheets = [...document.adoptedStyleSheets, state.stylesheet];
58
+ }
59
+ return state.stylesheet;
60
+ }
61
+
62
+ function colorToId(hex: string): string {
63
+ const clean = hex.replace('#', '').toLowerCase();
64
+ return clean.length > 6 ? clean.substring(0, 6) : clean;
65
+ }
66
+
67
+ function ensureRule(stylesheet: CSSStyleSheet, name: string, color: string, scope?: string): void {
68
+ const key = `${scope ?? ''}::${name}`;
69
+ if (state.knownRules.has(key)) return;
70
+
71
+ const rule = scope
72
+ ? `${scope} ::highlight(${name}) { color: ${color}; }`
73
+ : `::highlight(${name}) { color: ${color}; }`;
74
+
75
+ stylesheet.insertRule(rule, stylesheet.cssRules.length);
76
+ state.knownRules.add(key);
77
+ }
78
+
79
+ function findTextNode(
80
+ element: HTMLElement,
81
+ targetOffset: number
82
+ ): { node: Node; offset: number } | null {
83
+ const walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT);
84
+
85
+ const find = (node: Node | null, accumulated: number): { node: Node; offset: number } | null => {
86
+ if (!node) {
87
+ if (targetOffset === accumulated && element.lastChild) {
88
+ return { node: element.lastChild, offset: element.lastChild.textContent?.length ?? 0 };
89
+ }
90
+ return null;
91
+ }
92
+ const len = node.textContent?.length ?? 0;
93
+ if (accumulated + len > targetOffset) {
94
+ return { node, offset: targetOffset - accumulated };
95
+ }
96
+ return find(walker.nextNode(), accumulated + len);
97
+ };
98
+
99
+ return find(walker.nextNode(), 0);
100
+ }
101
+
102
+ function buildLineOffsets(text: string): number[] {
103
+ return text.split('\n').reduce<{ offsets: number[]; pos: number }>(
104
+ (acc, line) => ({
105
+ offsets: [...acc.offsets, acc.pos],
106
+ pos: acc.pos + line.length + 1,
107
+ }),
108
+ { offsets: [], pos: 0 }
109
+ ).offsets;
110
+ }
111
+
112
+ function applyToken(
113
+ element: HTMLElement,
114
+ text: string,
115
+ lineBase: number,
116
+ token: HighlightToken,
117
+ themeKey: string,
118
+ scope: string | undefined,
119
+ priority: number,
120
+ stylesheet: CSSStyleSheet,
121
+ ownedRanges: Array<[string, Range]>
122
+ ): void {
123
+ if (!token.content.trim()) return;
124
+
125
+ const start = lineBase + token.offset;
126
+ const end = start + token.content.length;
127
+ if (end > text.length) return;
128
+
129
+ const startPos = findTextNode(element, start);
130
+ const endPos = findTextNode(element, end);
131
+ if (!startPos || !endPos) return;
132
+
133
+ try {
134
+ const range = new Range();
135
+ range.setStart(startPos.node, startPos.offset);
136
+ range.setEnd(endPos.node, endPos.offset);
137
+
138
+ const colorId = colorToId(token.color);
139
+ const hlName = `blok-${themeKey}-${colorId}`;
140
+ const highlights = getHighlights();
141
+
142
+ ensureRule(stylesheet, hlName, token.color, scope);
143
+
144
+ const existing = highlights.get(hlName);
145
+ const highlight = existing ?? (new Highlight() as unknown as HighlightSet);
146
+ if (!existing) {
147
+ highlight.priority = priority;
148
+ highlights.set(hlName, highlight);
149
+ }
150
+
151
+ highlight.add(range);
152
+ ownedRanges.push([hlName, range]);
153
+ } catch {
154
+ // Skip invalid ranges
155
+ }
156
+ }
157
+
158
+ function applyThemeTokens(
159
+ element: HTMLElement,
160
+ text: string,
161
+ lineOffsets: number[],
162
+ themeData: ThemeTokens,
163
+ themeKey: string,
164
+ scope: string | undefined,
165
+ priority: number,
166
+ stylesheet: CSSStyleSheet,
167
+ ownedRanges: Array<[string, Range]>
168
+ ): void {
169
+ for (const [lineIdx, lineTokens] of themeData.tokens.entries()) {
170
+ const lineBase = lineOffsets[lineIdx];
171
+ if (lineBase === undefined) continue;
172
+
173
+ for (const token of lineTokens) {
174
+ applyToken(element, text, lineBase, token, themeKey, scope, priority, stylesheet, ownedRanges);
175
+ }
176
+ }
177
+ }
178
+
179
+ export function applyHighlights(element: HTMLElement, themes: DualThemeTokens): () => void {
180
+ if (!isHighlightingSupported()) return () => {};
181
+
182
+ const stylesheet = ensureStylesheet();
183
+ const ownedRanges: Array<[string, Range]> = [];
184
+ const text = element.textContent ?? '';
185
+ const lineOffsets = buildLineOffsets(text);
186
+
187
+ const themeEntries: Array<[string, ThemeTokens, string | undefined, number]> = [
188
+ ['l', themes.light, undefined, 0],
189
+ ['d', themes.dark, DARK_MODE_SELECTOR, 1],
190
+ ];
191
+
192
+ for (const [themeKey, themeData, scope, priority] of themeEntries) {
193
+ applyThemeTokens(element, text, lineOffsets, themeData, themeKey, scope, priority, stylesheet, ownedRanges);
194
+ }
195
+
196
+ return () => cleanupRanges(ownedRanges, getHighlights());
197
+ }
198
+
199
+ function cleanupRanges(ownedRanges: Array<[string, Range]>, highlights: HighlightMap): void {
200
+ for (const [name, range] of ownedRanges) {
201
+ const hl = highlights.get(name);
202
+ if (!hl) continue;
203
+ hl.delete(range);
204
+ if (hl.size === 0) {
205
+ highlights.delete(name);
206
+ }
207
+ }
208
+ }
209
+
210
+ function removeBlokHighlights(highlights: HighlightMap): void {
211
+ const blokNames = [...highlights.keys()].filter((name) => name.startsWith('blok-'));
212
+ for (const name of blokNames) {
213
+ highlights.delete(name);
214
+ }
215
+ }
216
+
217
+ export function disposeAllHighlights(): void {
218
+ if (isHighlightingSupported()) {
219
+ removeBlokHighlights(getHighlights());
220
+ }
221
+
222
+ if (state.stylesheet) {
223
+ document.adoptedStyleSheets = document.adoptedStyleSheets.filter(
224
+ (s) => s !== state.stylesheet
225
+ );
226
+ state.stylesheet = null;
227
+ state.knownRules.clear();
228
+ }
229
+ }
@@ -21,6 +21,7 @@ import {
21
21
  CODE_AREA_STYLES,
22
22
  COPY_CODE_KEY,
23
23
  WRAP_LINES_KEY,
24
+ LINE_NUMBERS_KEY,
24
25
  COPIED_KEY,
25
26
  LANGUAGE_KEY,
26
27
  COPIED_FEEDBACK_STYLES,
@@ -31,8 +32,12 @@ import {
31
32
  TAB_ACTIVE_STYLES,
32
33
  TAB_INACTIVE_STYLES,
33
34
  PREVIEW_AREA_STYLES,
35
+ GUTTER_LINE_STYLES,
34
36
  } from './constants';
35
37
  import { renderLatex } from './katex-loader';
38
+ import { renderMermaid } from './mermaid-loader';
39
+ import { tokenizeCode, isHighlightable } from './shiki-loader';
40
+ import { applyHighlights, isHighlightingSupported } from './highlight-applier';
36
41
 
37
42
  const COPIED_FEEDBACK_DURATION = 1500;
38
43
 
@@ -42,9 +47,12 @@ export class CodeTool implements BlockTool {
42
47
  private _data: CodeData;
43
48
  private _dom: CodeDOMRefs | null = null;
44
49
  private _wrapping = true;
50
+ private _lineNumbers = true;
45
51
  private _picker: LanguagePicker | null = null;
46
52
  private _previewActive = false;
47
53
  private _previewContainer: HTMLElement | null = null;
54
+ private _disposeHighlights: (() => void) | null = null;
55
+ private _highlightRafId: number | null = null;
48
56
 
49
57
  constructor({ data, api, readOnly }: BlockToolConstructorOptions<CodeData>) {
50
58
  this.api = api;
@@ -52,7 +60,9 @@ export class CodeTool implements BlockTool {
52
60
  this._data = {
53
61
  code: data?.code ?? '',
54
62
  language: data?.language ?? DEFAULT_LANGUAGE,
63
+ lineNumbers: data?.lineNumbers,
55
64
  };
65
+ this._lineNumbers = data?.lineNumbers ?? true;
56
66
  }
57
67
 
58
68
  public render(): HTMLElement {
@@ -64,6 +74,7 @@ export class CodeTool implements BlockTool {
64
74
  readOnly: this.readOnly,
65
75
  copyLabel: this.api.i18n.t(COPY_CODE_KEY),
66
76
  wrapLabel: this.api.i18n.t(WRAP_LINES_KEY),
77
+ lineNumbersLabel: this.api.i18n.t(LINE_NUMBERS_KEY),
67
78
  previewable: this.readOnly ? false : isPreviewable,
68
79
  codeTabLabel: this.api.i18n.t(CODE_TAB_KEY),
69
80
  previewTabLabel: this.api.i18n.t(PREVIEW_TAB_KEY),
@@ -71,6 +82,10 @@ export class CodeTool implements BlockTool {
71
82
 
72
83
  this._dom = dom;
73
84
 
85
+ // Line numbers gutter visibility
86
+ dom.gutterElement.hidden = !this._lineNumbers;
87
+ dom.lineNumbersButton.addEventListener('click', () => this.toggleLineNumbers());
88
+
74
89
  // Read-only + previewable: show preview only, hide code, no tabs
75
90
  if (this.readOnly && isPreviewable) {
76
91
  const previewEl = document.createElement('div');
@@ -79,6 +94,7 @@ export class CodeTool implements BlockTool {
79
94
  previewEl.setAttribute('data-blok-testid', 'code-preview');
80
95
  dom.wrapper.appendChild(previewEl);
81
96
  dom.preElement.hidden = true;
97
+ dom.gutterElement.hidden = true;
82
98
  this._previewContainer = previewEl;
83
99
  void this.renderPreview();
84
100
  }
@@ -87,6 +103,7 @@ export class CodeTool implements BlockTool {
87
103
  if (!this.readOnly && isPreviewable && dom.codeTab && dom.previewTab && dom.previewElement) {
88
104
  this._previewActive = true;
89
105
  dom.preElement.hidden = true;
106
+ dom.gutterElement.hidden = true;
90
107
  dom.previewElement.hidden = false;
91
108
  this._previewContainer = dom.previewElement;
92
109
  void this.renderPreview();
@@ -101,8 +118,17 @@ export class CodeTool implements BlockTool {
101
118
 
102
119
  if (handled) {
103
120
  event.preventDefault();
121
+ this.syncTrailingBr();
122
+ this.updateGutter();
123
+ this.scheduleHighlight();
104
124
  }
105
125
  });
126
+
127
+ dom.codeElement.addEventListener('input', () => {
128
+ this.syncTrailingBr();
129
+ this.updateGutter();
130
+ this.scheduleHighlight();
131
+ });
106
132
  }
107
133
 
108
134
  dom.copyButton.addEventListener('click', () => this.copyCode());
@@ -126,6 +152,10 @@ export class CodeTool implements BlockTool {
126
152
  return dom.wrapper;
127
153
  }
128
154
 
155
+ public rendered(): void {
156
+ void this.highlightCode();
157
+ }
158
+
129
159
  private showCode(): void {
130
160
  if (!this._dom?.previewElement || !this._dom.codeTab || !this._dom.previewTab) {
131
161
  return;
@@ -133,6 +163,7 @@ export class CodeTool implements BlockTool {
133
163
 
134
164
  this._previewActive = false;
135
165
  this._dom.preElement.hidden = false;
166
+ this._dom.gutterElement.hidden = !this._lineNumbers;
136
167
  this._dom.previewElement.hidden = true;
137
168
  this._dom.codeTab.className = `${TAB_STYLES} ${TAB_ACTIVE_STYLES}`;
138
169
  this._dom.previewTab.className = `${TAB_STYLES} ${TAB_INACTIVE_STYLES}`;
@@ -145,6 +176,7 @@ export class CodeTool implements BlockTool {
145
176
 
146
177
  this._previewActive = true;
147
178
  this._dom.preElement.hidden = true;
179
+ this._dom.gutterElement.hidden = true;
148
180
  this._dom.previewElement.hidden = false;
149
181
  this._dom.codeTab.className = `${TAB_STYLES} ${TAB_INACTIVE_STYLES}`;
150
182
  this._dom.previewTab.className = `${TAB_STYLES} ${TAB_ACTIVE_STYLES}`;
@@ -159,7 +191,9 @@ export class CodeTool implements BlockTool {
159
191
  }
160
192
 
161
193
  const code = this._dom?.codeElement.textContent ?? this._data.code;
162
- const rendered = await renderLatex(code);
194
+ const rendered = this._data.language === 'mermaid'
195
+ ? await renderMermaid(code)
196
+ : await renderLatex(code);
163
197
 
164
198
  this._previewContainer.innerHTML = rendered;
165
199
  }
@@ -168,6 +202,7 @@ export class CodeTool implements BlockTool {
168
202
  return {
169
203
  code: this._dom?.codeElement.textContent ?? '',
170
204
  language: this._data.language,
205
+ lineNumbers: this._lineNumbers,
171
206
  };
172
207
  }
173
208
 
@@ -181,6 +216,8 @@ export class CodeTool implements BlockTool {
181
216
  if (this._dom) {
182
217
  this._dom.codeElement.textContent = this._data.code;
183
218
  }
219
+
220
+ void this.highlightCode();
184
221
  }
185
222
 
186
223
  public renderSettings(): MenuConfig {
@@ -220,6 +257,8 @@ export class CodeTool implements BlockTool {
220
257
  if (this._dom) {
221
258
  this._dom.codeElement.textContent = this._data.code;
222
259
  }
260
+
261
+ void this.highlightCode();
223
262
  }
224
263
 
225
264
  private setLanguage(id: string): void {
@@ -230,6 +269,7 @@ export class CodeTool implements BlockTool {
230
269
  }
231
270
 
232
271
  this._picker?.setActiveLanguage(id);
272
+ void this.highlightCode();
233
273
  }
234
274
 
235
275
  private getLanguageName(id: string): string {
@@ -271,6 +311,98 @@ export class CodeTool implements BlockTool {
271
311
  }
272
312
  }
273
313
 
314
+ private toggleLineNumbers(): void {
315
+ this._lineNumbers = !this._lineNumbers;
316
+
317
+ if (this._dom) {
318
+ this._dom.gutterElement.hidden = !this._lineNumbers;
319
+ }
320
+ }
321
+
322
+ private updateGutter(): void {
323
+ if (!this._dom) {
324
+ return;
325
+ }
326
+
327
+ const code = this._dom.codeElement.textContent ?? '';
328
+ const lineCount = code ? code.split('\n').length : 1;
329
+ const gutter = this._dom.gutterElement;
330
+ const currentCount = gutter.children.length;
331
+
332
+ if (currentCount === lineCount) {
333
+ return;
334
+ }
335
+
336
+ // Rebuild gutter lines
337
+ gutter.innerHTML = '';
338
+ Array.from({ length: lineCount }, (_, idx) => {
339
+ const lineEl = document.createElement('div');
340
+ lineEl.className = GUTTER_LINE_STYLES;
341
+ lineEl.textContent = String(idx + 1);
342
+ gutter.appendChild(lineEl);
343
+ });
344
+ }
345
+
346
+ /**
347
+ * Ensure a trailing <br> exists when the text content ends with '\n'.
348
+ * Browsers collapse a trailing newline in contenteditable — no visible
349
+ * empty line is rendered, so the caret has nowhere to go. A sentinel
350
+ * <br> forces the browser to create the line box. It is invisible to
351
+ * textContent, so save() and updateGutter() need no changes.
352
+ */
353
+ private syncTrailingBr(): void {
354
+ if (!this._dom) {
355
+ return;
356
+ }
357
+
358
+ const code = this._dom.codeElement;
359
+ const text = code.textContent ?? '';
360
+ const hasBr = code.lastChild instanceof HTMLBRElement;
361
+
362
+ if (text.endsWith('\n') && !hasBr) {
363
+ code.appendChild(document.createElement('br'));
364
+ } else if (!text.endsWith('\n') && hasBr) {
365
+ code.lastChild.remove();
366
+ }
367
+ }
368
+
369
+ private scheduleHighlight(): void {
370
+ if (this._highlightRafId !== null) {
371
+ return;
372
+ }
373
+
374
+ this._highlightRafId = requestAnimationFrame(() => {
375
+ this._highlightRafId = null;
376
+ void this.highlightCode();
377
+ });
378
+ }
379
+
380
+ private async highlightCode(): Promise<void> {
381
+ if (!isHighlightingSupported() || !isHighlightable(this._data.language)) {
382
+ this._disposeHighlights?.();
383
+ this._disposeHighlights = null;
384
+ return;
385
+ }
386
+
387
+ const code = this._dom?.codeElement.textContent ?? '';
388
+
389
+ if (!code.trim()) {
390
+ this._disposeHighlights?.();
391
+ this._disposeHighlights = null;
392
+ return;
393
+ }
394
+
395
+ const tokens = await tokenizeCode(code, this._data.language);
396
+
397
+ if (!tokens || !this._dom) {
398
+ return;
399
+ }
400
+
401
+ // Clean up previous highlights before applying new ones
402
+ this._disposeHighlights?.();
403
+ this._disposeHighlights = applyHighlights(this._dom.codeElement, tokens);
404
+ }
405
+
274
406
  private exitBlock(): void {
275
407
  const currentIndex = this.api.blocks.getCurrentBlockIndex();
276
408
 
@@ -278,6 +410,14 @@ export class CodeTool implements BlockTool {
278
410
  }
279
411
 
280
412
  public removed(): void {
413
+ this._disposeHighlights?.();
414
+ this._disposeHighlights = null;
415
+
416
+ if (this._highlightRafId !== null) {
417
+ cancelAnimationFrame(this._highlightRafId);
418
+ this._highlightRafId = null;
419
+ }
420
+
281
421
  if (this._picker) {
282
422
  this._picker.getElement().remove();
283
423
  this._picker = null;
@@ -0,0 +1,45 @@
1
+ import type mermaidType from 'mermaid';
2
+
3
+ const state = {
4
+ mermaidPromise: null as Promise<typeof mermaidType> | null,
5
+ initialized: false,
6
+ };
7
+
8
+ async function loadMermaid(): Promise<typeof mermaidType> {
9
+ if (!state.mermaidPromise) {
10
+ state.mermaidPromise = import('mermaid').then((mod) => mod.default);
11
+ }
12
+
13
+ const mermaid = await state.mermaidPromise;
14
+
15
+ if (!state.initialized) {
16
+ state.initialized = true;
17
+ mermaid.initialize({ startOnLoad: false, securityLevel: 'strict' });
18
+ }
19
+
20
+ return mermaid;
21
+ }
22
+
23
+ /**
24
+ * Render a Mermaid diagram string to SVG. Lazy-loads Mermaid on first call.
25
+ */
26
+ export async function renderMermaid(code: string): Promise<string> {
27
+ try {
28
+ const mermaid = await loadMermaid();
29
+
30
+ const parseResult = await mermaid.parse(code, { suppressErrors: true });
31
+
32
+ if (parseResult === false) {
33
+ return '<span class="text-red-500 text-sm">Invalid Mermaid syntax</span>';
34
+ }
35
+
36
+ const id = `mermaid-${crypto.randomUUID()}`;
37
+ const result = await mermaid.render(id, code);
38
+
39
+ return result.svg;
40
+ } catch (error) {
41
+ const message = error instanceof Error ? error.message : 'Unknown error';
42
+
43
+ return `<span class="text-red-500 text-sm">${message}</span>`;
44
+ }
45
+ }
@@ -0,0 +1,135 @@
1
+ import type { HighlightToken, DualThemeTokens, ThemeTokens } from './highlight-applier';
2
+ import { HIGHLIGHTABLE_LANGUAGES, SHIKI_LIGHT_THEME, SHIKI_DARK_THEME } from './constants';
3
+
4
+ const LANG_IMPORTS: Record<string, () => Promise<unknown>> = {
5
+ javascript: () => import('@shikijs/langs/javascript'),
6
+ typescript: () => import('@shikijs/langs/typescript'),
7
+ python: () => import('@shikijs/langs/python'),
8
+ java: () => import('@shikijs/langs/java'),
9
+ c: () => import('@shikijs/langs/c'),
10
+ cpp: () => import('@shikijs/langs/cpp'),
11
+ csharp: () => import('@shikijs/langs/csharp'),
12
+ go: () => import('@shikijs/langs/go'),
13
+ rust: () => import('@shikijs/langs/rust'),
14
+ ruby: () => import('@shikijs/langs/ruby'),
15
+ php: () => import('@shikijs/langs/php'),
16
+ swift: () => import('@shikijs/langs/swift'),
17
+ kotlin: () => import('@shikijs/langs/kotlin'),
18
+ sql: () => import('@shikijs/langs/sql'),
19
+ html: () => import('@shikijs/langs/html'),
20
+ css: () => import('@shikijs/langs/css'),
21
+ json: () => import('@shikijs/langs/json'),
22
+ yaml: () => import('@shikijs/langs/yaml'),
23
+ markdown: () => import('@shikijs/langs/markdown'),
24
+ bash: () => import('@shikijs/langs/shellscript'),
25
+ shell: () => import('@shikijs/langs/shellscript'),
26
+ dockerfile: () => import('@shikijs/langs/dockerfile'),
27
+ xml: () => import('@shikijs/langs/xml'),
28
+ graphql: () => import('@shikijs/langs/graphql'),
29
+ r: () => import('@shikijs/langs/r'),
30
+ scala: () => import('@shikijs/langs/scala'),
31
+ dart: () => import('@shikijs/langs/dart'),
32
+ lua: () => import('@shikijs/langs/lua'),
33
+ latex: () => import('@shikijs/langs/latex'),
34
+ mermaid: () => import('@shikijs/langs/mermaid'),
35
+ };
36
+
37
+ interface ShikiTokenResult {
38
+ tokens: Array<Array<{ content: string; color?: string; offset: number }>>;
39
+ fg: string;
40
+ }
41
+
42
+ interface ShikiHighlighter {
43
+ getLoadedLanguages(): string[];
44
+ loadLanguage(lang: unknown): Promise<void>;
45
+ codeToTokens(code: string, options: { lang: string; theme: string }): ShikiTokenResult;
46
+ dispose(): void;
47
+ }
48
+
49
+ const state = {
50
+ highlighterPromise: null as Promise<ShikiHighlighter> | null,
51
+ highlighter: null as ShikiHighlighter | null,
52
+ };
53
+
54
+ export function isHighlightable(lang: string): boolean {
55
+ return HIGHLIGHTABLE_LANGUAGES.has(lang);
56
+ }
57
+
58
+ async function ensureHighlighter(): Promise<ShikiHighlighter> {
59
+ if (!state.highlighterPromise) {
60
+ state.highlighterPromise = (async (): Promise<ShikiHighlighter> => {
61
+ const { createHighlighterCore } = await import('shiki/core');
62
+ const { createJavaScriptRegexEngine } = await import('shiki/engine/javascript');
63
+
64
+ const hl: ShikiHighlighter = await createHighlighterCore({
65
+ themes: [
66
+ import('@shikijs/themes/one-light'),
67
+ import('@shikijs/themes/vitesse-dark'),
68
+ ],
69
+ langs: [],
70
+ engine: createJavaScriptRegexEngine(),
71
+ }) as ShikiHighlighter;
72
+ state.highlighter = hl;
73
+ return hl;
74
+ })();
75
+ }
76
+ return state.highlighterPromise;
77
+ }
78
+
79
+ async function ensureLanguage(highlighter: ShikiHighlighter, lang: string): Promise<void> {
80
+ const loaded: string[] = highlighter.getLoadedLanguages();
81
+ if (loaded.includes(lang)) return;
82
+
83
+ const importer = LANG_IMPORTS[lang];
84
+ if (!importer) return;
85
+
86
+ await highlighter.loadLanguage(await importer());
87
+ }
88
+
89
+ function mapTokens(result: ShikiTokenResult): ThemeTokens {
90
+ return {
91
+ tokens: result.tokens.map((line) =>
92
+ line.map((token): HighlightToken => ({
93
+ content: token.content,
94
+ color: token.color ?? result.fg,
95
+ offset: token.offset,
96
+ }))
97
+ ),
98
+ fg: result.fg,
99
+ };
100
+ }
101
+
102
+ export async function tokenizeCode(code: string, lang: string): Promise<DualThemeTokens | null> {
103
+ if (!isHighlightable(lang)) return null;
104
+
105
+ try {
106
+ const highlighter = await ensureHighlighter();
107
+ await ensureLanguage(highlighter, lang);
108
+
109
+ const lightResult: ShikiTokenResult = highlighter.codeToTokens(code, {
110
+ lang,
111
+ theme: SHIKI_LIGHT_THEME,
112
+ });
113
+ const darkResult: ShikiTokenResult = highlighter.codeToTokens(code, {
114
+ lang,
115
+ theme: SHIKI_DARK_THEME,
116
+ });
117
+
118
+ return {
119
+ light: mapTokens(lightResult),
120
+ dark: mapTokens(darkResult),
121
+ };
122
+ } catch {
123
+ state.highlighterPromise = null;
124
+ state.highlighter = null;
125
+ return null;
126
+ }
127
+ }
128
+
129
+ export function disposeHighlighter(): void {
130
+ if (state.highlighter) {
131
+ state.highlighter.dispose();
132
+ state.highlighter = null;
133
+ }
134
+ state.highlighterPromise = null;
135
+ }
@@ -77,6 +77,20 @@ export interface SetColWidthsCommand {
77
77
  readonly widths: readonly number[] | undefined;
78
78
  }
79
79
 
80
+ export interface MergeCellsCommand {
81
+ readonly type: 'merge-cells';
82
+ readonly minRow: number;
83
+ readonly maxRow: number;
84
+ readonly minCol: number;
85
+ readonly maxCol: number;
86
+ }
87
+
88
+ export interface SplitCellCommand {
89
+ readonly type: 'split-cell';
90
+ readonly row: number;
91
+ readonly col: number;
92
+ }
93
+
80
94
  export interface ReplaceAllCommand {
81
95
  readonly type: 'replace-all';
82
96
  readonly data: TableData;
@@ -96,4 +110,6 @@ export type TableCommand =
96
110
  | RemoveBlockFromCellCommand
97
111
  | SetCellBlocksCommand
98
112
  | SetColWidthsCommand
113
+ | MergeCellsCommand
114
+ | SplitCellCommand
99
115
  | ReplaceAllCommand;