@jackuait/blok 0.9.0 → 0.10.0-beta.10

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 (492) hide show
  1. package/codemod/migrate-editorjs-to-blok.js +50 -2
  2. package/codemod/test.js +39 -6
  3. package/dist/blok.mjs +3 -3
  4. package/dist/chunks/_basePickBy-DISiGhsr.mjs +410 -0
  5. package/dist/chunks/_baseUniq-gAuHRtRF.mjs +1045 -0
  6. package/dist/chunks/_getTag-Aj56Wgor.mjs +26 -0
  7. package/dist/chunks/arc-D-pL2Ftf.mjs +80 -0
  8. package/dist/chunks/architecture-YZFGNWBL-CuqTb_ae.mjs +3 -0
  9. package/dist/chunks/architectureDiagram-Q4EWVU46-DS7mqjL2.mjs +4066 -0
  10. package/dist/chunks/array-BsrkCVSZ.mjs +6 -0
  11. package/dist/chunks/blockDiagram-DXYQGD6D-BTtcn4NG.mjs +3259 -0
  12. package/dist/chunks/{blok-RJ3hyzDH.mjs → blok-Bg3-zpSu.mjs} +2192 -2156
  13. package/dist/chunks/c-C6JXJf5K.mjs +5 -0
  14. package/dist/chunks/c4Diagram-AHTNJAMY-Y4Dcwcoo.mjs +2956 -0
  15. package/dist/chunks/ccount-C9Y7nqDe.mjs +10 -0
  16. package/dist/chunks/channel-Cln-eWE0.mjs +5 -0
  17. package/dist/chunks/chunk-2KRD3SAO-DkM7qh-k.mjs +20 -0
  18. package/dist/chunks/chunk-336JU56O-B17AtzlK.mjs +49 -0
  19. package/dist/chunks/chunk-426QAEUC-D6UAVUog.mjs +13 -0
  20. package/dist/chunks/chunk-4BX2VUAB-CgIkjF7Z.mjs +19 -0
  21. package/dist/chunks/chunk-4TB4RGXK-BUP4eON3.mjs +3250 -0
  22. package/dist/chunks/chunk-55IACEB6-zZ-IgaSt.mjs +8 -0
  23. package/dist/chunks/chunk-5FUZZQ4R-DsZnJYxM.mjs +3786 -0
  24. package/dist/chunks/chunk-5PVQY5BW-CORl9dnu.mjs +1692 -0
  25. package/dist/chunks/chunk-67CJDMHE-m0UKdcSH.mjs +20 -0
  26. package/dist/chunks/chunk-7N4EOEYR-DKNajFZd.mjs +29 -0
  27. package/dist/chunks/chunk-AA7GKIK3-BeLhNzKa.mjs +24 -0
  28. package/dist/chunks/chunk-BSJP7CBP-CJExmx8a.mjs +83 -0
  29. package/dist/chunks/chunk-CIAEETIT-CTikoJ19.mjs +20 -0
  30. package/dist/chunks/chunk-D6kmoKXy.mjs +20 -0
  31. package/dist/chunks/chunk-EDXVE4YY-DjInnnwb.mjs +26 -0
  32. package/dist/chunks/chunk-ENJZ2VHE-CIl5FRDA.mjs +566 -0
  33. package/dist/chunks/chunk-FMBD7UC4-DjV0W7UE.mjs +5 -0
  34. package/dist/chunks/chunk-FOC6F5B3-LmHCCWYY.mjs +20 -0
  35. package/dist/chunks/chunk-ICPOFSXX-BHZIN46A.mjs +3290 -0
  36. package/dist/chunks/chunk-K5T4RW27-BPZ6fFnW.mjs +16370 -0
  37. package/dist/chunks/chunk-KGLVRYIC-S1OQdW76.mjs +20 -0
  38. package/dist/chunks/chunk-LIHQZDEY-CjtyJlI6.mjs +55 -0
  39. package/dist/chunks/chunk-ORNJ4GCN-CdO0hAge.mjs +25 -0
  40. package/dist/chunks/chunk-OYMX7WX6-ApX8eV4o.mjs +2038 -0
  41. package/dist/chunks/chunk-QZHKN3VN-BGFuA6-k.mjs +12 -0
  42. package/dist/chunks/chunk-U2HBQHQK-B88ZUOTL.mjs +1875 -0
  43. package/dist/chunks/chunk-X2U36JSP-1VS5TyCr.mjs +68 -0
  44. package/dist/chunks/chunk-XPW4576I-BMupdrvo.mjs +1146 -0
  45. package/dist/chunks/chunk-YZCP3GAM-BQ7eEsm2.mjs +60 -0
  46. package/dist/chunks/chunk-ZZ45TVLE-D1xks9zd.mjs +33 -0
  47. package/dist/chunks/classDiagram-6PBFFD2Q-C59BZJxp.mjs +30 -0
  48. package/dist/chunks/classDiagram-v2-HSJHXN6E-7a0qeMsE.mjs +30 -0
  49. package/dist/chunks/clone-Ckjt1LtE.mjs +8 -0
  50. package/dist/chunks/{constants-A3iVmQL8.mjs → constants-D7zjGD5W.mjs} +529 -530
  51. package/dist/chunks/core-Bm6DWt7D.mjs +4501 -0
  52. package/dist/chunks/cose-bilkent-S5V4N54A-Bpcs2jA_.mjs +2246 -0
  53. package/dist/chunks/cpp-BdjvAny0.mjs +16 -0
  54. package/dist/chunks/csharp-YHxeHpeH.mjs +3 -0
  55. package/dist/chunks/css-DdLevFaX.mjs +3 -0
  56. package/dist/chunks/cytoscape.esm-BvD8wo00.mjs +18108 -0
  57. package/dist/chunks/dagre-CGNbYTKq.mjs +1536 -0
  58. package/dist/chunks/dagre-KV5264BT-DUD9ikgN.mjs +298 -0
  59. package/dist/chunks/dart-DrPWqfcC.mjs +3 -0
  60. package/dist/chunks/default-qigT1Xpq.mjs +4 -0
  61. package/dist/chunks/defaultLocale-ChuSeAxU.mjs +201 -0
  62. package/dist/chunks/diagram-5BDNPKRD-CZGfTYEe.mjs +112 -0
  63. package/dist/chunks/diagram-G4DWMVQ6-CuS0-h95.mjs +546 -0
  64. package/dist/chunks/diagram-MMDJMWI5-C-AEApYz.mjs +234 -0
  65. package/dist/chunks/diagram-TYMM5635-CiwAJVMq.mjs +144 -0
  66. package/dist/chunks/dist-Ctq-pyfb.mjs +59 -0
  67. package/dist/chunks/dockerfile-C68ALcaN.mjs +3 -0
  68. package/dist/chunks/engine-javascript-CJpnSvzf.mjs +2373 -0
  69. package/dist/chunks/erDiagram-SMLLAGMA-DeH5yck2.mjs +1712 -0
  70. package/dist/chunks/flowDiagram-DWJPFMVM-Cr6dwmQ5.mjs +4175 -0
  71. package/dist/chunks/ganttDiagram-T4ZO3ILL-K-divBg_.mjs +3083 -0
  72. package/dist/chunks/gitGraph-7Q5UKJZL-Dl-vQzrq.mjs +3 -0
  73. package/dist/chunks/gitGraphDiagram-UUTBAWPF-UytPZv72.mjs +792 -0
  74. package/dist/chunks/go-Fm5N96DN.mjs +3 -0
  75. package/dist/chunks/graphlib-Cye9EPNq.mjs +223 -0
  76. package/dist/chunks/graphql-BSnqmqgO.mjs +11 -0
  77. package/dist/chunks/html-BLNeZvnp.mjs +10 -0
  78. package/dist/chunks/{i18next-Ch0gVA3V.mjs → i18next-CXx5niYF.mjs} +1 -1
  79. package/dist/chunks/{i18next-loader-dH3UPF7S.mjs → i18next-loader-CwsYu0n6.mjs} +2 -2
  80. package/dist/chunks/info-OMHHGYJF-BOejJvJR.mjs +3 -0
  81. package/dist/chunks/infoDiagram-42DDH7IO-DuYnDbF3.mjs +29 -0
  82. package/dist/chunks/init-C6T-mugb.mjs +15 -0
  83. package/dist/chunks/ishikawaDiagram-UXIWVN3A-CHc59dLn.mjs +719 -0
  84. package/dist/chunks/java-83DWBpzu.mjs +5 -0
  85. package/dist/chunks/javascript-CBgeF1Xx.mjs +3 -0
  86. package/dist/chunks/journeyDiagram-VCZTEJTY-CD25C4_n.mjs +885 -0
  87. package/dist/chunks/json-BI17y-1H.mjs +3 -0
  88. package/dist/chunks/kanban-definition-6JOO6SKY-CTCT6N_p.mjs +980 -0
  89. package/dist/chunks/katex-CmTPfM0f.mjs +22026 -0
  90. package/dist/chunks/kotlin-DjnvsrfO.mjs +3 -0
  91. package/dist/chunks/latex-24n3TcOR.mjs +5 -0
  92. package/dist/chunks/{lightweight-i18n-1rbaxIZW.mjs → lightweight-i18n-Cvv8CWh4.mjs} +69 -2
  93. package/dist/chunks/line-Dct5pMmw.mjs +34 -0
  94. package/dist/chunks/linear-BRCpMvtr.mjs +289 -0
  95. package/dist/chunks/lua-DV0fuZWx.mjs +5 -0
  96. package/dist/chunks/markdown-BqQYT45f.mjs +3 -0
  97. package/dist/chunks/mdast-util-math-BlK2Zu-1.mjs +151 -0
  98. package/dist/chunks/mermaid-parser.core-CA3DKkuk.mjs +57 -0
  99. package/dist/chunks/mermaid-vF0cEnZ0.mjs +3 -0
  100. package/dist/chunks/mermaid.core-CA8nc1sZ.mjs +989 -0
  101. package/dist/{messages-DaOnbI6d.mjs → chunks/messages-8IHf7ZP3.mjs} +68 -1
  102. package/dist/chunks/{messages-C9aKfCro.mjs → messages-A_MkXDlG.mjs} +68 -1
  103. package/dist/{messages-BLEVLZve.mjs → chunks/messages-B0vPBsWq.mjs} +68 -1
  104. package/dist/chunks/{messages-C0hQPZmh2.mjs → messages-B2N4fUi72.mjs} +68 -1
  105. package/dist/{messages-HNAtlVax.mjs → chunks/messages-B4UMuyjT.mjs} +73 -6
  106. package/dist/chunks/{messages-DRUkmDVZ.mjs → messages-B9kmbUWV.mjs} +68 -1
  107. package/dist/{messages-Dbsx9m5q2.mjs → chunks/messages-BA8Iv99Y2.mjs} +68 -1
  108. package/dist/chunks/{messages-Da-SOTFW.mjs → messages-BAsb5CgZ.mjs} +68 -1
  109. package/dist/{messages-D1P0QGLz2.mjs → chunks/messages-BDZA10kl2.mjs} +68 -1
  110. package/dist/chunks/{messages-ComLU2T32.mjs → messages-BE6lHKwf.mjs} +68 -1
  111. package/dist/chunks/{messages-gaxTO-87.mjs → messages-BQYvBqm2.mjs} +68 -1
  112. package/dist/chunks/{messages-BwKs-9DF.mjs → messages-BSghd0ez.mjs} +68 -1
  113. package/dist/{messages-BPRR6TMf.mjs → chunks/messages-BUVhHx0q2.mjs} +68 -1
  114. package/dist/{messages-B7jZvo-m.mjs → chunks/messages-BVjoM7P0.mjs} +68 -1
  115. package/dist/{messages-C-4z1-Dh.mjs → chunks/messages-BXM80fdr2.mjs} +68 -1
  116. package/dist/{messages-Bm0nvUuj2.mjs → chunks/messages-BYlSMRkd.mjs} +68 -1
  117. package/dist/chunks/{messages-DLPrj3Dh.mjs → messages-BYxLFj7y.mjs} +68 -1
  118. package/dist/{messages-BRcLIBCd2.mjs → chunks/messages-BeFqtIrc2.mjs} +68 -1
  119. package/dist/{messages-zHkURG6V2.mjs → chunks/messages-Bfnq1xv4.mjs} +68 -1
  120. package/dist/chunks/{messages-Z762-GLL.mjs → messages-BhzzNkN-.mjs} +68 -1
  121. package/dist/chunks/{messages-COJ0CbVV2.mjs → messages-BjadX8jR2.mjs} +68 -1
  122. package/dist/{messages-B2ZwD4n9.mjs → chunks/messages-Bp8qin1R.mjs} +68 -1
  123. package/dist/chunks/{messages-DdEWnfAR.mjs → messages-Bphq_Bt3.mjs} +71 -4
  124. package/dist/{messages-CUDbNJG5.mjs → chunks/messages-Bxvi1ebN.mjs} +68 -1
  125. package/dist/chunks/{messages-B0t2L3bi.mjs → messages-C0HvoMPb.mjs} +68 -1
  126. package/dist/{messages-D6qfWi6H2.mjs → chunks/messages-C3aX3q0H.mjs} +68 -1
  127. package/dist/chunks/{messages-v9NkxRcL.mjs → messages-C6Mpiacw.mjs} +68 -1
  128. package/dist/chunks/{messages-CqZ9vFyx.mjs → messages-C7VGpihw.mjs} +69 -2
  129. package/dist/chunks/{messages-Yj4Q1_uX2.mjs → messages-CKBhDGI3.mjs} +69 -2
  130. package/dist/chunks/{messages-DxtnwNPo.mjs → messages-COO5xmcA.mjs} +68 -1
  131. package/dist/{messages-CZTcgUzd.mjs → chunks/messages-CSJ_zb3a2.mjs} +68 -1
  132. package/dist/{messages-A8aZS7d_2.mjs → chunks/messages-CSL-6xfb2.mjs} +68 -1
  133. package/dist/{messages-CxruHsuD2.mjs → chunks/messages-CVdpweyf2.mjs} +69 -2
  134. package/dist/{messages-D2Mf9z2D.mjs → chunks/messages-Cdf0W9H02.mjs} +68 -1
  135. package/dist/chunks/{messages-DAbCNake2.mjs → messages-Ck81cQkn2.mjs} +68 -1
  136. package/dist/chunks/{messages-Dyku8Cut.mjs → messages-Cmf6NhSC.mjs} +68 -1
  137. package/dist/chunks/{messages-DQ6bFum9.mjs → messages-Cs81Z_Bh.mjs} +68 -1
  138. package/dist/chunks/{messages-cegxHurd2.mjs → messages-Cu-Wevxs2.mjs} +68 -1
  139. package/dist/{messages-D2HwpoUE.mjs → chunks/messages-D3zojZ94.mjs} +69 -2
  140. package/dist/{messages-BfTBVFd9.mjs → chunks/messages-D55HRx5O2.mjs} +68 -1
  141. package/dist/chunks/{messages-Dl03jd4b2.mjs → messages-D9N2MvQx2.mjs} +68 -1
  142. package/dist/{messages-DfXh-i9o.mjs → chunks/messages-DG-4DPmP.mjs} +68 -1
  143. package/dist/chunks/{messages-DmJf9laH2.mjs → messages-DGL1ySqb2.mjs} +68 -1
  144. package/dist/chunks/{messages-DfU4yvkL.mjs → messages-DJoNVjqP.mjs} +68 -1
  145. package/dist/{messages-Bsd4ruEY.mjs → chunks/messages-DMVXnAYj.mjs} +70 -3
  146. package/dist/{messages-3WhPEFd7.mjs → chunks/messages-DOuS1Qge.mjs} +68 -1
  147. package/dist/chunks/{messages-B1kDfIN82.mjs → messages-DWu1r4gc2.mjs} +68 -1
  148. package/dist/{messages-Dtih3ffa2.mjs → chunks/messages-DlLXpgWM2.mjs} +68 -1
  149. package/dist/chunks/{messages-DKNULJpc.mjs → messages-DlonA3wa.mjs} +69 -2
  150. package/dist/{messages-C5pBfa_W.mjs → chunks/messages-Dr0Ekmbz.mjs} +81 -14
  151. package/dist/{messages-Du62vI49.mjs → chunks/messages-DzTk8bJ5.mjs} +68 -1
  152. package/dist/{messages-DNAp0U4l2.mjs → chunks/messages-FWfsxpBz.mjs} +68 -1
  153. package/dist/{messages-B2YeJw8s2.mjs → chunks/messages-G416eyjY.mjs} +68 -1
  154. package/dist/chunks/{messages-C5-aaU2b.mjs → messages-Je5YvxiY.mjs} +68 -1
  155. package/dist/chunks/{messages-DHHZUf_H2.mjs → messages-JyvWu4rf2.mjs} +68 -1
  156. package/dist/chunks/{messages-D_6vPBzT.mjs → messages-KdawW5Na.mjs} +68 -1
  157. package/dist/chunks/{messages-DnuhgHG0.mjs → messages-MxpWO1db.mjs} +68 -1
  158. package/dist/{messages-DT4rHATO2.mjs → chunks/messages-NEqrrYvE2.mjs} +68 -1
  159. package/dist/chunks/{messages-DeSSxLsh.mjs → messages-RInp1ytX.mjs} +68 -1
  160. package/dist/{messages-DfEPVRdJ.mjs → chunks/messages-TRUuyiFB.mjs} +68 -1
  161. package/dist/chunks/{messages--eH7tTJV2.mjs → messages-aZcy0JQq2.mjs} +68 -1
  162. package/dist/{messages-O6z1uabG.mjs → chunks/messages-iS34FHFB.mjs} +68 -1
  163. package/dist/{messages-BE0DjTEC.mjs → chunks/messages-ihCjSFJI2.mjs} +68 -1
  164. package/dist/chunks/{messages-_5Pg5fKy2.mjs → messages-jfVpL9c-2.mjs} +68 -1
  165. package/dist/chunks/{messages-CaRSYuhO.mjs → messages-p1mbe__S.mjs} +68 -1
  166. package/dist/chunks/{messages-BGssMBWM2.mjs → messages-rCd0Rrw6.mjs} +69 -2
  167. package/dist/{messages-COgvIEeW.mjs → chunks/messages-xuqyb6Ff2.mjs} +68 -1
  168. package/dist/chunks/micromark-extension-math-BbkUb36G.mjs +169 -0
  169. package/dist/chunks/micromark-factory-space-y4SDWQKm.mjs +36 -0
  170. package/dist/chunks/mindmap-definition-QFDTVHPH-hNnyBkEP.mjs +1013 -0
  171. package/dist/chunks/{notifier-Butv4Dvo.mjs → notifier-CuvTt9pe.mjs} +1 -1
  172. package/dist/chunks/objectWithoutProperties-D0XxKB4n.mjs +23 -0
  173. package/dist/chunks/one-light-DmNO_Y4X.mjs +4 -0
  174. package/dist/chunks/ordinal-B-kolV-i.mjs +65 -0
  175. package/dist/chunks/packet-4T2RLAQJ-B5ZMgwzZ.mjs +3 -0
  176. package/dist/chunks/path-rIMjg_tH.mjs +85 -0
  177. package/dist/chunks/php-DmXKyPwJ.mjs +18 -0
  178. package/dist/chunks/pie-ZZUOXDRM-B9l6y0XJ.mjs +3 -0
  179. package/dist/chunks/pieDiagram-DEJITSTG-Gw-fsc6U.mjs +179 -0
  180. package/dist/chunks/python-DfwfY9t5.mjs +3 -0
  181. package/dist/chunks/quadrantDiagram-34T5L4WZ-CQ5fGYI5.mjs +1960 -0
  182. package/dist/chunks/r-BD2D7qEW.mjs +5 -0
  183. package/dist/chunks/radar-PYXPWWZC-D5kYmUaB.mjs +3 -0
  184. package/dist/chunks/requirementDiagram-MS252O5E-DjWKB42c.mjs +2224 -0
  185. package/dist/chunks/rough.esm-cmMIcj7N.mjs +1353 -0
  186. package/dist/chunks/ruby-DdOo03Kg.mjs +33 -0
  187. package/dist/chunks/rust-DEDueB5R.mjs +3 -0
  188. package/dist/chunks/sankeyDiagram-XADWPNL6-BIN2evSB.mjs +909 -0
  189. package/dist/chunks/scala-CsjqvxE4.mjs +3 -0
  190. package/dist/chunks/sequenceDiagram-FGHM5R23-CQz2lMoS.mjs +4181 -0
  191. package/dist/chunks/shellscript-Bh5zEpnQ.mjs +3 -0
  192. package/dist/chunks/sql-D9CrOi1i.mjs +3 -0
  193. package/dist/chunks/src-DVJl6f6s.mjs +2149 -0
  194. package/dist/chunks/stateDiagram-FHFEXIEX-BIBFsF65.mjs +218 -0
  195. package/dist/chunks/stateDiagram-v2-QKLJ7IA2-BZUmAVw7.mjs +28 -0
  196. package/dist/chunks/swift-Dpyt0s2c.mjs +3 -0
  197. package/dist/chunks/timeline-definition-GMOUNBTQ-CzvQ7Lav.mjs +1084 -0
  198. package/dist/chunks/{tools-nT6zA9QL.mjs → tools-CrRhWn8L.mjs} +3043 -1303
  199. package/dist/chunks/treeView-SZITEDCU-BNtnNxpI.mjs +3 -0
  200. package/dist/chunks/treemap-W4RFUUIX-DYENULz2.mjs +3 -0
  201. package/dist/chunks/typescript-DO5cd4m8.mjs +5 -0
  202. package/dist/chunks/vennDiagram-DHZGUBPP-B0DmLQqe.mjs +1876 -0
  203. package/dist/chunks/vitesse-dark-CcorSKT2.mjs +4 -0
  204. package/dist/chunks/wardley-RL74JXVD-ByNHVBTb.mjs +3 -0
  205. package/dist/chunks/wardleyDiagram-NUSXRM2D-CzoKesUw.mjs +594 -0
  206. package/dist/chunks/xml-g8kXXALs.mjs +5 -0
  207. package/dist/chunks/xychartDiagram-5P7HB3ND-CixwR8r2.mjs +2017 -0
  208. package/dist/chunks/yaml-CrNNZyLb.mjs +3 -0
  209. package/dist/cli.mjs +1 -1
  210. package/dist/full.mjs +14 -14
  211. package/dist/locales.mjs +135 -68
  212. package/dist/markdown.mjs +3954 -0
  213. package/dist/{messages-D_CUdqU12.mjs → messages-5jvKxQNu2.mjs} +68 -1
  214. package/dist/{chunks/messages-CFfpHyTU.mjs → messages-7QD-X6XT2.mjs} +68 -1
  215. package/dist/{messages-CdX1odk_2.mjs → messages-96iaAUds2.mjs} +68 -1
  216. package/dist/{messages-C8ca-jEa.mjs → messages-B19o-Teb.mjs} +69 -2
  217. package/dist/{messages-I03yFhup.mjs → messages-B1ZUQagA.mjs} +68 -1
  218. package/dist/{chunks/messages-BSw88lIo2.mjs → messages-B7ieAJBd2.mjs} +68 -1
  219. package/dist/{messages-sNSXCkeB.mjs → messages-BECMxmfX.mjs} +68 -1
  220. package/dist/{messages-DgGZsxBB.mjs → messages-BIHc0KHY.mjs} +68 -1
  221. package/dist/{messages-yZj20Fvf.mjs → messages-BIoeoik5.mjs} +68 -1
  222. package/dist/{chunks/messages-D8JFu42v.mjs → messages-BJeGJksD.mjs} +68 -1
  223. package/dist/{messages-BSLErTnW2.mjs → messages-BRZX964b2.mjs} +68 -1
  224. package/dist/{chunks/messages-BW8arxf72.mjs → messages-BTQPpoM42.mjs} +68 -1
  225. package/dist/{messages-C52AiyVV.mjs → messages-BYNcD6uR.mjs} +68 -1
  226. package/dist/{messages-BxJv0qBn2.mjs → messages-BYmmMDrN2.mjs} +68 -1
  227. package/dist/{messages-CoCy2JIP.mjs → messages-BbYq1pk-.mjs} +68 -1
  228. package/dist/{messages-Cnz_SHE32.mjs → messages-BiUGXvYr2.mjs} +68 -1
  229. package/dist/{chunks/messages-Dl6SVT1Z.mjs → messages-BiiongNz2.mjs} +68 -1
  230. package/dist/{chunks/messages-C912bk5I.mjs → messages-Bm0Feca1.mjs} +69 -2
  231. package/dist/{chunks/messages-CTuCPqpJ.mjs → messages-BmAn22OX.mjs} +68 -1
  232. package/dist/{messages-DdiPWkV8.mjs → messages-Bq3F2Tp_.mjs} +68 -1
  233. package/dist/{chunks/messages-DJxXZi1D2.mjs → messages-BsycN_JI2.mjs} +68 -1
  234. package/dist/{chunks/messages-OdEuBvgf.mjs → messages-BwHs4cm1.mjs} +70 -3
  235. package/dist/{chunks/messages-C4ZAJzBh.mjs → messages-CJTy6JZt.mjs} +68 -1
  236. package/dist/{chunks/messages-D2OZ9dbO.mjs → messages-CR_L_UtK.mjs} +68 -1
  237. package/dist/{messages-ypuLZyw12.mjs → messages-CSUHBs4c2.mjs} +68 -1
  238. package/dist/{chunks/messages-BkES2MDr2.mjs → messages-CWIXvnDf2.mjs} +68 -1
  239. package/dist/{messages-Cpeko5kB.mjs → messages-CcF4y-E4.mjs} +68 -1
  240. package/dist/{messages-BmnC-s4X.mjs → messages-Ce6KVEbT.mjs} +68 -1
  241. package/dist/{messages-DTNfG4ZH.mjs → messages-Ci0KqX-J.mjs} +71 -4
  242. package/dist/{chunks/messages-CGh56r-H2.mjs → messages-CjbnogEC.mjs} +68 -1
  243. package/dist/{messages-B3jq5Hpa.mjs → messages-CmB406HW.mjs} +69 -2
  244. package/dist/{chunks/messages-BsZz1Hnn2.mjs → messages-CqXtJTpU.mjs} +68 -1
  245. package/dist/{messages-DL000FUf2.mjs → messages-D0aw5_0k2.mjs} +68 -1
  246. package/dist/{chunks/messages-Df2RYuup2.mjs → messages-D8FQWulF2.mjs} +68 -1
  247. package/dist/{messages-CxHn7cs2.mjs → messages-DBiVgUs2.mjs} +68 -1
  248. package/dist/{chunks/messages-Dsapm4K9.mjs → messages-DIJlIqlQ2.mjs} +68 -1
  249. package/dist/{chunks/messages-517llQmh.mjs → messages-DLX_iBDJ.mjs} +68 -1
  250. package/dist/{chunks/messages-BG8Nq35G.mjs → messages-DLlc9QPw.mjs} +68 -1
  251. package/dist/{messages-cokJPuUp2.mjs → messages-DMr62KiO2.mjs} +68 -1
  252. package/dist/{chunks/messages-Dkp-Eyu02.mjs → messages-DPA-mMWC2.mjs} +68 -1
  253. package/dist/{chunks/messages-7uCUVFea.mjs → messages-DTh9a8mR.mjs} +68 -1
  254. package/dist/{messages-VBFioL2M.mjs → messages-DY4IqlhY.mjs} +68 -1
  255. package/dist/{chunks/messages-C4X0xP3h.mjs → messages-DYTTu0O12.mjs} +68 -1
  256. package/dist/{messages-diSPQ2Da2.mjs → messages-DbySKTKt2.mjs} +69 -2
  257. package/dist/{chunks/messages-BGE43_6M.mjs → messages-Ddnj2iTG2.mjs} +68 -1
  258. package/dist/{chunks/messages-BtUqUzMG2.mjs → messages-DkLU_rWm.mjs} +68 -1
  259. package/dist/{messages-DSX2HaeN2.mjs → messages-Dl3Sv6Rq2.mjs} +68 -1
  260. package/dist/{chunks/messages-BDvpl6Ox.mjs → messages-Dl5Y2-Ia.mjs} +81 -14
  261. package/dist/{chunks/messages-C7plNvNE2.mjs → messages-DnG0ef8t2.mjs} +69 -2
  262. package/dist/{chunks/messages-qS8tM3Dk.mjs → messages-DnGJD4TL.mjs} +68 -1
  263. package/dist/{messages-Ct468oX22.mjs → messages-Dnp9N6RU2.mjs} +68 -1
  264. package/dist/{chunks/messages-CjIA--kO.mjs → messages-Dvn35ksS.mjs} +68 -1
  265. package/dist/{messages-BRxNqmJ8.mjs → messages-Dw__BcTj.mjs} +68 -1
  266. package/dist/{chunks/messages-0zhE8A9X.mjs → messages-Dy-Y_nEI.mjs} +68 -1
  267. package/dist/{chunks/messages-CCH4OETw2.mjs → messages-E_ZuzGDt.mjs} +68 -1
  268. package/dist/{chunks/messages-DZzoT0T_.mjs → messages-F2xRoY1w.mjs} +68 -1
  269. package/dist/{chunks/messages-zGdqNZbH.mjs → messages-Smt4GBbj.mjs} +73 -6
  270. package/dist/{messages-CvIxHHp92.mjs → messages-aMXpHt5X2.mjs} +68 -1
  271. package/dist/{messages-C8JVJUp12.mjs → messages-aWZH50vu2.mjs} +68 -1
  272. package/dist/{messages-Phrqr7a6.mjs → messages-dv19AkyJ.mjs} +68 -1
  273. package/dist/{chunks/messages-DngM4hda2.mjs → messages-hWwSRF-2.mjs} +68 -1
  274. package/dist/{messages-DpGo_Da5.mjs → messages-j7o5rT9s.mjs} +68 -1
  275. package/dist/{messages-C6WJx6Z0.mjs → messages-nUVjeh7K.mjs} +68 -1
  276. package/dist/{messages-CbVilNPE.mjs → messages-nlhESX9t.mjs} +68 -1
  277. package/dist/{messages-C6o0FVy02.mjs → messages-rk-A1Wa42.mjs} +69 -2
  278. package/dist/{messages-D4mCIODv.mjs → messages-xh2eOLvs.mjs} +68 -1
  279. package/dist/{chunks/messages-Ct9UUOrl2.mjs → messages-ynAe7ewZ.mjs} +68 -1
  280. package/dist/react.mjs +26 -25
  281. package/dist/tools.mjs +3 -3
  282. package/dist/vendor.LICENSE.txt +5404 -80
  283. package/package.json +16 -1
  284. package/src/components/blocks.ts +26 -1
  285. package/src/components/constants/data-attributes.ts +2 -2
  286. package/src/components/i18n/locales/am/messages.json +68 -1
  287. package/src/components/i18n/locales/ar/messages.json +68 -1
  288. package/src/components/i18n/locales/az/messages.json +68 -1
  289. package/src/components/i18n/locales/bg/messages.json +68 -1
  290. package/src/components/i18n/locales/bn/messages.json +68 -1
  291. package/src/components/i18n/locales/bs/messages.json +69 -2
  292. package/src/components/i18n/locales/cs/messages.json +70 -3
  293. package/src/components/i18n/locales/da/messages.json +71 -4
  294. package/src/components/i18n/locales/de/messages.json +73 -6
  295. package/src/components/i18n/locales/dv/messages.json +68 -1
  296. package/src/components/i18n/locales/el/messages.json +68 -1
  297. package/src/components/i18n/locales/en/messages.json +68 -1
  298. package/src/components/i18n/locales/es/messages.json +68 -1
  299. package/src/components/i18n/locales/et/messages.json +69 -2
  300. package/src/components/i18n/locales/fa/messages.json +68 -1
  301. package/src/components/i18n/locales/fi/messages.json +68 -1
  302. package/src/components/i18n/locales/fil/messages.json +81 -14
  303. package/src/components/i18n/locales/fr/messages.json +68 -1
  304. package/src/components/i18n/locales/gu/messages.json +68 -1
  305. package/src/components/i18n/locales/he/messages.json +68 -1
  306. package/src/components/i18n/locales/hi/messages.json +68 -1
  307. package/src/components/i18n/locales/hr/messages.json +69 -2
  308. package/src/components/i18n/locales/hu/messages.json +68 -1
  309. package/src/components/i18n/locales/hy/messages.json +68 -1
  310. package/src/components/i18n/locales/id/messages.json +68 -1
  311. package/src/components/i18n/locales/it/messages.json +68 -1
  312. package/src/components/i18n/locales/ja/messages.json +68 -1
  313. package/src/components/i18n/locales/ka/messages.json +68 -1
  314. package/src/components/i18n/locales/km/messages.json +68 -1
  315. package/src/components/i18n/locales/kn/messages.json +68 -1
  316. package/src/components/i18n/locales/ko/messages.json +68 -1
  317. package/src/components/i18n/locales/ku/messages.json +68 -1
  318. package/src/components/i18n/locales/lo/messages.json +68 -1
  319. package/src/components/i18n/locales/lt/messages.json +68 -1
  320. package/src/components/i18n/locales/lv/messages.json +68 -1
  321. package/src/components/i18n/locales/mk/messages.json +68 -1
  322. package/src/components/i18n/locales/ml/messages.json +68 -1
  323. package/src/components/i18n/locales/mn/messages.json +68 -1
  324. package/src/components/i18n/locales/mr/messages.json +68 -1
  325. package/src/components/i18n/locales/ms/messages.json +69 -2
  326. package/src/components/i18n/locales/my/messages.json +68 -1
  327. package/src/components/i18n/locales/ne/messages.json +68 -1
  328. package/src/components/i18n/locales/nl/messages.json +68 -1
  329. package/src/components/i18n/locales/no/messages.json +68 -1
  330. package/src/components/i18n/locales/pa/messages.json +68 -1
  331. package/src/components/i18n/locales/pl/messages.json +68 -1
  332. package/src/components/i18n/locales/ps/messages.json +68 -1
  333. package/src/components/i18n/locales/pt/messages.json +68 -1
  334. package/src/components/i18n/locales/ro/messages.json +68 -1
  335. package/src/components/i18n/locales/ru/messages.json +68 -1
  336. package/src/components/i18n/locales/sd/messages.json +68 -1
  337. package/src/components/i18n/locales/si/messages.json +68 -1
  338. package/src/components/i18n/locales/sk/messages.json +69 -2
  339. package/src/components/i18n/locales/sl/messages.json +69 -2
  340. package/src/components/i18n/locales/sq/messages.json +68 -1
  341. package/src/components/i18n/locales/sr/messages.json +68 -1
  342. package/src/components/i18n/locales/sv/messages.json +68 -1
  343. package/src/components/i18n/locales/sw/messages.json +68 -1
  344. package/src/components/i18n/locales/ta/messages.json +68 -1
  345. package/src/components/i18n/locales/te/messages.json +68 -1
  346. package/src/components/i18n/locales/th/messages.json +68 -1
  347. package/src/components/i18n/locales/tr/messages.json +68 -1
  348. package/src/components/i18n/locales/ug/messages.json +68 -1
  349. package/src/components/i18n/locales/uk/messages.json +68 -1
  350. package/src/components/i18n/locales/ur/messages.json +68 -1
  351. package/src/components/i18n/locales/vi/messages.json +68 -1
  352. package/src/components/i18n/locales/yi/messages.json +68 -1
  353. package/src/components/i18n/locales/zh/messages.json +68 -1
  354. package/src/components/icons/index.ts +78 -0
  355. package/src/components/inline-tools/inline-tool-code.ts +399 -0
  356. package/src/components/modules/api/blocks.ts +17 -0
  357. package/src/components/modules/api/ui.ts +0 -3
  358. package/src/components/modules/blockEvents/composers/blockSelectionKeys.ts +20 -3
  359. package/src/components/modules/paste/handlers/html-handler.ts +13 -10
  360. package/src/components/modules/paste/handlers/index.ts +1 -0
  361. package/src/components/modules/paste/index.ts +6 -0
  362. package/src/components/modules/renderer.ts +17 -0
  363. package/src/components/modules/ui.ts +1 -13
  364. package/src/components/ui/toolbox.ts +9 -0
  365. package/src/components/utils/caret/boundaries.ts +15 -4
  366. package/src/components/utils/popover/popover-desktop.ts +11 -0
  367. package/src/markdown/index.ts +63 -0
  368. package/src/markdown/markdown-handler.ts +110 -0
  369. package/src/markdown/mdast-to-blocks.ts +418 -0
  370. package/src/markdown/phrasing-to-html.ts +60 -0
  371. package/src/markdown/types.ts +42 -0
  372. package/src/stories/EditorModes.stories.ts +0 -60
  373. package/src/styles/main.css +57 -2
  374. package/src/tools/callout/constants.ts +2 -1
  375. package/src/tools/callout/emoji-picker/index.ts +41 -2
  376. package/src/tools/callout/index.ts +25 -0
  377. package/src/tools/code/code-keyboard.ts +142 -0
  378. package/src/tools/code/constants.ts +96 -0
  379. package/src/tools/code/dom-builder.ts +181 -0
  380. package/src/tools/code/highlight-applier.ts +229 -0
  381. package/src/tools/code/index.ts +462 -0
  382. package/src/tools/code/katex-loader.ts +50 -0
  383. package/src/tools/code/language-picker.ts +241 -0
  384. package/src/tools/code/mermaid-loader.ts +45 -0
  385. package/src/tools/code/shiki-loader.ts +135 -0
  386. package/src/tools/divider/index.ts +11 -2
  387. package/src/tools/header/index.ts +2 -0
  388. package/src/tools/index.ts +6 -0
  389. package/src/tools/list/block-operations.ts +3 -1
  390. package/src/tools/list/depth-validator.ts +4 -7
  391. package/src/tools/list/dom-builder.ts +5 -3
  392. package/src/tools/list/index.ts +21 -3
  393. package/src/tools/list/list-helpers.ts +9 -2
  394. package/src/tools/list/list-keyboard.ts +56 -14
  395. package/src/tools/list/list-lifecycle.ts +3 -1
  396. package/src/tools/list/marker-calculator.ts +37 -0
  397. package/src/tools/list/ordered-marker-manager.ts +4 -2
  398. package/src/tools/list/style-config.ts +3 -0
  399. package/src/tools/paragraph/index.ts +1 -0
  400. package/src/tools/quote/index.ts +229 -0
  401. package/src/tools/table/core/table-commands.ts +16 -0
  402. package/src/tools/table/core/table-controller.ts +29 -0
  403. package/src/tools/table/core/table-events.ts +17 -0
  404. package/src/tools/table/index.ts +220 -14
  405. package/src/tools/table/table-cell-blocks.ts +51 -6
  406. package/src/tools/table/table-cell-clipboard.ts +7 -2
  407. package/src/tools/table/table-cell-placement-picker.ts +133 -0
  408. package/src/tools/table/table-cell-selection.ts +174 -19
  409. package/src/tools/table/table-core.ts +321 -113
  410. package/src/tools/table/table-map.ts +279 -0
  411. package/src/tools/table/table-model.ts +901 -1
  412. package/src/tools/table/table-operations.ts +87 -44
  413. package/src/tools/table/table-resize.ts +19 -17
  414. package/src/tools/table/table-row-col-drag.ts +24 -10
  415. package/src/tools/table/types.ts +24 -2
  416. package/src/tools/toggle/index.ts +1 -0
  417. package/types/configs/blok-config.d.ts +7 -0
  418. package/types/data-attributes.d.ts +0 -1
  419. package/types/markdown.d.ts +2 -0
  420. package/types/tools/callout.d.ts +16 -0
  421. package/types/tools/code.d.ts +13 -0
  422. package/types/tools/quote.d.ts +13 -0
  423. package/types/tools/tool-settings.d.ts +7 -0
  424. package/types/tools-entry.d.ts +7 -0
  425. /package/dist/chunks/{am-CHDDMHkd.mjs → am-BxlkYGsI.mjs} +0 -0
  426. /package/dist/chunks/{ar-DoqfNqut.mjs → ar-9vlpr9V8.mjs} +0 -0
  427. /package/dist/chunks/{az-C34P9iEa.mjs → az-ON63W_FP.mjs} +0 -0
  428. /package/dist/chunks/{bg-jroXLY8Y.mjs → bg-CtXWTP5w.mjs} +0 -0
  429. /package/dist/chunks/{bn-BRI-WqxY.mjs → bn-BERvhXM4.mjs} +0 -0
  430. /package/dist/chunks/{bs-CCGUpNHu.mjs → bs-CBg8NVPG.mjs} +0 -0
  431. /package/dist/chunks/{cs-D5qZOGuc.mjs → cs-DeQddxS7.mjs} +0 -0
  432. /package/dist/chunks/{da-DrJ7W37K.mjs → da-DyTo-ec_.mjs} +0 -0
  433. /package/dist/chunks/{de-BW6-kp2c.mjs → de-Cu7545m1.mjs} +0 -0
  434. /package/dist/chunks/{el-C-Vc_Otu.mjs → el-oiubLRBq.mjs} +0 -0
  435. /package/dist/chunks/{es-B6fI5K9i.mjs → es-DZUC6Klv.mjs} +0 -0
  436. /package/dist/chunks/{et-BhVlZ-Yz.mjs → et-CDeklAog.mjs} +0 -0
  437. /package/dist/chunks/{fa-D55Ijdqa.mjs → fa-Cafp7_Li.mjs} +0 -0
  438. /package/dist/chunks/{fi-jNLjhKUQ.mjs → fi-BD_V_aVW.mjs} +0 -0
  439. /package/dist/chunks/{fil-DYd0T5aX.mjs → fil-Crsfbtx4.mjs} +0 -0
  440. /package/dist/chunks/{fr-yxy5xWw_.mjs → fr-BGGc04Zv.mjs} +0 -0
  441. /package/dist/chunks/{gu-CcY_LJe7.mjs → gu-Vg_BgCTp.mjs} +0 -0
  442. /package/dist/chunks/{he-DL9s7wNw.mjs → he-DTY9chlZ.mjs} +0 -0
  443. /package/dist/chunks/{hi-C8eGXgw5.mjs → hi-DChMXk0x.mjs} +0 -0
  444. /package/dist/chunks/{hr-DLpybOhU.mjs → hr-BWVgNU8k.mjs} +0 -0
  445. /package/dist/chunks/{hu-BkT0gT00.mjs → hu-B37awHXA.mjs} +0 -0
  446. /package/dist/chunks/{hy-CVFDCp2S.mjs → hy-DGC_GDHh.mjs} +0 -0
  447. /package/dist/chunks/{id-0P4W9Az0.mjs → id-V7cw6La2.mjs} +0 -0
  448. /package/dist/chunks/{it-mLY6_uoW.mjs → it-DrTGP8Rn.mjs} +0 -0
  449. /package/dist/chunks/{ja-7RkeRNWG.mjs → ja-DS4pbJEG.mjs} +0 -0
  450. /package/dist/chunks/{ka-C7Lx-Qsh.mjs → ka-BueyosRh.mjs} +0 -0
  451. /package/dist/chunks/{km-Q8udaraH.mjs → km-B0K891yW.mjs} +0 -0
  452. /package/dist/chunks/{kn-BiETM-iq.mjs → kn-BQ__skg8.mjs} +0 -0
  453. /package/dist/chunks/{ko-tiB80pF1.mjs → ko-BuPxi_7e.mjs} +0 -0
  454. /package/dist/chunks/{ku-CY-OABkR.mjs → ku-nQjwPRw2.mjs} +0 -0
  455. /package/dist/chunks/{lo-CTBhEnyk.mjs → lo-K5NVFoq1.mjs} +0 -0
  456. /package/dist/chunks/{lt-BHKHEtqK.mjs → lt-D3xD6Eb2.mjs} +0 -0
  457. /package/dist/chunks/{lv-DWxgtfUg.mjs → lv-DH13mzZj.mjs} +0 -0
  458. /package/dist/chunks/{mk-BjookGdx.mjs → mk-Bb48BcDA.mjs} +0 -0
  459. /package/dist/chunks/{ml-L-NnZcp9.mjs → ml-BHPEj1kD.mjs} +0 -0
  460. /package/dist/chunks/{mn-OMWi7Hl_.mjs → mn-BNGzpdI6.mjs} +0 -0
  461. /package/dist/chunks/{mr-B6JPzITo.mjs → mr-D5PgU-cH.mjs} +0 -0
  462. /package/dist/chunks/{ms-CG3S-sPB.mjs → ms-DPkxqKz5.mjs} +0 -0
  463. /package/dist/chunks/{my-BLAmGfhT.mjs → my-DZGcyfxy.mjs} +0 -0
  464. /package/dist/chunks/{native-BPcABu9z.mjs → native-D0cfLXsM.mjs} +0 -0
  465. /package/dist/chunks/{ne-D1JHLfYw.mjs → ne-BU_Wh4Wv.mjs} +0 -0
  466. /package/dist/chunks/{nl-Ca7Q8FnY.mjs → nl-DtAPk1mK.mjs} +0 -0
  467. /package/dist/chunks/{no-Coxcohcz.mjs → no-CdW3n3BY.mjs} +0 -0
  468. /package/dist/chunks/{objectSpread2-CyPxu8-u.mjs → objectSpread2-CWwMYL_U.mjs} +0 -0
  469. /package/dist/chunks/{pa-CCaXqpaI.mjs → pa-BacCHz87.mjs} +0 -0
  470. /package/dist/chunks/{pl-Cl_fAZ84.mjs → pl-8zBJbmhZ.mjs} +0 -0
  471. /package/dist/chunks/{ps-WD5qGAWy.mjs → ps-c6nGXD-W.mjs} +0 -0
  472. /package/dist/chunks/{pt-C4zvLfvq.mjs → pt-B5yR8Qhr.mjs} +0 -0
  473. /package/dist/chunks/{ro-DbefHcmM.mjs → ro-Nscylsqb.mjs} +0 -0
  474. /package/dist/chunks/{ru-uU1J14jd.mjs → ru-DxERQkVJ.mjs} +0 -0
  475. /package/dist/chunks/{sd-DKu368Ip.mjs → sd-5z-QY3q9.mjs} +0 -0
  476. /package/dist/chunks/{si-BsJCiPkZ.mjs → si-DTL0mzrx.mjs} +0 -0
  477. /package/dist/chunks/{sk-CD-a3SN6.mjs → sk-DrGczTvY.mjs} +0 -0
  478. /package/dist/chunks/{sl-CXhrPJe_.mjs → sl-D8nJjig4.mjs} +0 -0
  479. /package/dist/chunks/{sq-CTctCoFQ.mjs → sq-C74Hm3YL.mjs} +0 -0
  480. /package/dist/chunks/{sr-BZkhBwXj.mjs → sr-DAwB05Gj.mjs} +0 -0
  481. /package/dist/chunks/{sv-NmRZb_xi.mjs → sv-BkHBsN4y.mjs} +0 -0
  482. /package/dist/chunks/{sw-Be5ik3H6.mjs → sw-BBQLTq_z.mjs} +0 -0
  483. /package/dist/chunks/{ta-DsXh6neL.mjs → ta-DRRzdKky.mjs} +0 -0
  484. /package/dist/chunks/{te-CwpCbM8M.mjs → te-CedXLsKM.mjs} +0 -0
  485. /package/dist/chunks/{th-CcZ15OLk.mjs → th-DDOlGA0W.mjs} +0 -0
  486. /package/dist/chunks/{tr-q3bTgvhW.mjs → tr-ClgvwOlL.mjs} +0 -0
  487. /package/dist/chunks/{tw-DmW6-pCY.mjs → tw-CqxBf-1Y.mjs} +0 -0
  488. /package/dist/chunks/{ug-919EhLsL.mjs → ug-bXxwiinM.mjs} +0 -0
  489. /package/dist/chunks/{uk-aNMEzd0Y.mjs → uk-Dp46o_VT.mjs} +0 -0
  490. /package/dist/chunks/{ur-BwQI77sh.mjs → ur-MfEEhdFq.mjs} +0 -0
  491. /package/dist/chunks/{vi-Dxq806-F.mjs → vi-bt-3LPGO.mjs} +0 -0
  492. /package/dist/chunks/{zh-BcHuy1Ti.mjs → zh-Dgyb5Ly8.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
+ }
@@ -0,0 +1,462 @@
1
+ import type {
2
+ API,
3
+ BlockTool,
4
+ BlockToolConstructorOptions,
5
+ PasteConfig,
6
+ PasteEvent,
7
+ ToolboxConfig,
8
+ ConversionConfig,
9
+ ToolSanitizerConfig,
10
+ } from '../../../types';
11
+ import type { MenuConfig } from '../../../types/tools/menu-config';
12
+ import type { CodeData } from '../../../types/tools/code';
13
+ import { IconCodeBlock } from '../../components/icons';
14
+ import { buildCodeDOM } from './dom-builder';
15
+ import type { CodeDOMRefs } from './dom-builder';
16
+ import { handleCodeKeydown } from './code-keyboard';
17
+ import { LanguagePicker } from './language-picker';
18
+ import {
19
+ DEFAULT_LANGUAGE,
20
+ LANGUAGES,
21
+ CODE_AREA_STYLES,
22
+ COPY_CODE_KEY,
23
+ WRAP_LINES_KEY,
24
+ LINE_NUMBERS_KEY,
25
+ COPIED_KEY,
26
+ LANGUAGE_KEY,
27
+ COPIED_FEEDBACK_STYLES,
28
+ PREVIEWABLE_LANGUAGES,
29
+ CODE_TAB_KEY,
30
+ PREVIEW_TAB_KEY,
31
+ TAB_STYLES,
32
+ TAB_ACTIVE_STYLES,
33
+ TAB_INACTIVE_STYLES,
34
+ PREVIEW_AREA_STYLES,
35
+ GUTTER_LINE_STYLES,
36
+ } from './constants';
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';
41
+
42
+ const COPIED_FEEDBACK_DURATION = 1500;
43
+
44
+ export class CodeTool implements BlockTool {
45
+ private api: API;
46
+ private readOnly: boolean;
47
+ private _data: CodeData;
48
+ private _dom: CodeDOMRefs | null = null;
49
+ private _wrapping = true;
50
+ private _lineNumbers = true;
51
+ private _picker: LanguagePicker | null = null;
52
+ private _previewActive = false;
53
+ private _previewContainer: HTMLElement | null = null;
54
+ private _disposeHighlights: (() => void) | null = null;
55
+ private _highlightRafId: number | null = null;
56
+
57
+ constructor({ data, api, readOnly }: BlockToolConstructorOptions<CodeData>) {
58
+ this.api = api;
59
+ this.readOnly = readOnly;
60
+ this._data = {
61
+ code: data?.code ?? '',
62
+ language: data?.language ?? DEFAULT_LANGUAGE,
63
+ lineNumbers: data?.lineNumbers,
64
+ };
65
+ this._lineNumbers = data?.lineNumbers ?? true;
66
+ }
67
+
68
+ public render(): HTMLElement {
69
+ const isPreviewable = PREVIEWABLE_LANGUAGES.has(this._data.language);
70
+
71
+ const dom = buildCodeDOM({
72
+ code: this._data.code,
73
+ languageName: this.getLanguageName(this._data.language),
74
+ readOnly: this.readOnly,
75
+ copyLabel: this.api.i18n.t(COPY_CODE_KEY),
76
+ wrapLabel: this.api.i18n.t(WRAP_LINES_KEY),
77
+ lineNumbersLabel: this.api.i18n.t(LINE_NUMBERS_KEY),
78
+ previewable: this.readOnly ? false : isPreviewable,
79
+ codeTabLabel: this.api.i18n.t(CODE_TAB_KEY),
80
+ previewTabLabel: this.api.i18n.t(PREVIEW_TAB_KEY),
81
+ });
82
+
83
+ this._dom = dom;
84
+
85
+ // Line numbers gutter visibility
86
+ dom.gutterElement.hidden = !this._lineNumbers;
87
+ dom.lineNumbersButton.addEventListener('click', () => this.toggleLineNumbers());
88
+
89
+ // Read-only + previewable: show preview only, hide code, no tabs
90
+ if (this.readOnly && isPreviewable) {
91
+ const previewEl = document.createElement('div');
92
+
93
+ previewEl.className = PREVIEW_AREA_STYLES;
94
+ previewEl.setAttribute('data-blok-testid', 'code-preview');
95
+ dom.wrapper.appendChild(previewEl);
96
+ dom.preElement.hidden = true;
97
+ dom.gutterElement.hidden = true;
98
+ this._previewContainer = previewEl;
99
+ void this.renderPreview();
100
+ }
101
+
102
+ // Edit mode + previewable: show tabs, default to preview
103
+ if (!this.readOnly && isPreviewable && dom.codeTab && dom.previewTab && dom.previewElement) {
104
+ this._previewActive = true;
105
+ dom.preElement.hidden = true;
106
+ dom.gutterElement.hidden = true;
107
+ dom.previewElement.hidden = false;
108
+ this._previewContainer = dom.previewElement;
109
+ void this.renderPreview();
110
+
111
+ dom.codeTab.addEventListener('click', () => this.showCode());
112
+ dom.previewTab.addEventListener('click', () => this.showPreview());
113
+ }
114
+
115
+ if (!this.readOnly) {
116
+ dom.codeElement.addEventListener('keydown', (event: KeyboardEvent) => {
117
+ const handled = handleCodeKeydown(event, dom.codeElement, () => this.exitBlock());
118
+
119
+ if (handled) {
120
+ event.preventDefault();
121
+ this.syncTrailingBr();
122
+ this.updateGutter();
123
+ this.scheduleHighlight();
124
+ }
125
+ });
126
+
127
+ dom.codeElement.addEventListener('input', () => {
128
+ this.syncTrailingBr();
129
+ this.updateGutter();
130
+ this.scheduleHighlight();
131
+ });
132
+ }
133
+
134
+ dom.copyButton.addEventListener('click', () => this.copyCode());
135
+ dom.wrapButton.addEventListener('click', () => this.toggleWrap());
136
+
137
+ if (!this.readOnly) {
138
+ this._picker = new LanguagePicker({
139
+ languages: LANGUAGES,
140
+ onSelect: (id: string) => this.setLanguage(id),
141
+ i18n: this.api.i18n,
142
+ activeLanguageId: this._data.language,
143
+ });
144
+
145
+ document.body.appendChild(this._picker.getElement());
146
+
147
+ dom.languageButton.addEventListener('click', () => {
148
+ this._picker?.open(dom.languageButton);
149
+ });
150
+ }
151
+
152
+ return dom.wrapper;
153
+ }
154
+
155
+ public rendered(): void {
156
+ void this.highlightCode();
157
+ }
158
+
159
+ private showCode(): void {
160
+ if (!this._dom?.previewElement || !this._dom.codeTab || !this._dom.previewTab) {
161
+ return;
162
+ }
163
+
164
+ this._previewActive = false;
165
+ this._dom.preElement.hidden = false;
166
+ this._dom.gutterElement.hidden = !this._lineNumbers;
167
+ this._dom.previewElement.hidden = true;
168
+ this._dom.codeTab.className = `${TAB_STYLES} ${TAB_ACTIVE_STYLES}`;
169
+ this._dom.previewTab.className = `${TAB_STYLES} ${TAB_INACTIVE_STYLES}`;
170
+ }
171
+
172
+ private showPreview(): void {
173
+ if (!this._dom?.previewElement || !this._dom.codeTab || !this._dom.previewTab) {
174
+ return;
175
+ }
176
+
177
+ this._previewActive = true;
178
+ this._dom.preElement.hidden = true;
179
+ this._dom.gutterElement.hidden = true;
180
+ this._dom.previewElement.hidden = false;
181
+ this._dom.codeTab.className = `${TAB_STYLES} ${TAB_INACTIVE_STYLES}`;
182
+ this._dom.previewTab.className = `${TAB_STYLES} ${TAB_ACTIVE_STYLES}`;
183
+
184
+ // Re-render preview with current code content
185
+ void this.renderPreview();
186
+ }
187
+
188
+ private async renderPreview(): Promise<void> {
189
+ if (!this._previewContainer) {
190
+ return;
191
+ }
192
+
193
+ const code = this._dom?.codeElement.textContent ?? this._data.code;
194
+ const rendered = this._data.language === 'mermaid'
195
+ ? await renderMermaid(code)
196
+ : await renderLatex(code);
197
+
198
+ this._previewContainer.innerHTML = rendered;
199
+ }
200
+
201
+ public save(_blockContent: HTMLElement): CodeData {
202
+ return {
203
+ code: this._dom?.codeElement.textContent ?? '',
204
+ language: this._data.language,
205
+ lineNumbers: this._lineNumbers,
206
+ };
207
+ }
208
+
209
+ public validate(savedData: CodeData): boolean {
210
+ return savedData.code.trim() !== '';
211
+ }
212
+
213
+ public merge(data: CodeData): void {
214
+ this._data.code += '\n' + data.code;
215
+
216
+ if (this._dom) {
217
+ this._dom.codeElement.textContent = this._data.code;
218
+ }
219
+
220
+ void this.highlightCode();
221
+ }
222
+
223
+ public renderSettings(): MenuConfig {
224
+ return [
225
+ {
226
+ icon: IconCodeBlock,
227
+ title: this.api.i18n.t(LANGUAGE_KEY),
228
+ name: 'code-language',
229
+ children: {
230
+ items: LANGUAGES.map((lang) => ({
231
+ title: lang.name,
232
+ onActivate: (): void => this.setLanguage(lang.id),
233
+ closeOnActivate: true,
234
+ isActive: this._data.language === lang.id,
235
+ })),
236
+ },
237
+ },
238
+ ];
239
+ }
240
+
241
+ public onPaste(event: PasteEvent): void {
242
+ const detail = event.detail;
243
+
244
+ if ('data' in detail) {
245
+ const content = detail.data;
246
+
247
+ if (content instanceof HTMLElement) {
248
+ this._data.code = content.textContent ?? '';
249
+ } else if (typeof content === 'string') {
250
+ // Pattern match — strip triple backtick fences
251
+ const stripped = content.replace(/^```[^\n]*\n?/, '').replace(/\n?```$/, '');
252
+
253
+ this._data.code = stripped;
254
+ }
255
+ }
256
+
257
+ if (this._dom) {
258
+ this._dom.codeElement.textContent = this._data.code;
259
+ }
260
+
261
+ void this.highlightCode();
262
+ }
263
+
264
+ private setLanguage(id: string): void {
265
+ this._data.language = id;
266
+
267
+ if (this._dom) {
268
+ this._dom.languageButton.textContent = this.getLanguageName(id);
269
+ }
270
+
271
+ this._picker?.setActiveLanguage(id);
272
+ void this.highlightCode();
273
+ }
274
+
275
+ private getLanguageName(id: string): string {
276
+ const entry = LANGUAGES.find((lang) => lang.id === id);
277
+
278
+ return entry ? entry.name : id;
279
+ }
280
+
281
+ private copyCode(): void {
282
+ const code = this._dom?.codeElement.textContent ?? '';
283
+
284
+ void navigator.clipboard.writeText(code).then(() => {
285
+ if (!this._dom) {
286
+ return;
287
+ }
288
+
289
+ const btn = this._dom.copyButton;
290
+ const originalHTML = btn.innerHTML;
291
+
292
+ btn.innerHTML = `<span class="${COPIED_FEEDBACK_STYLES}">${this.api.i18n.t(COPIED_KEY)}</span>`;
293
+
294
+ setTimeout(() => {
295
+ btn.innerHTML = originalHTML;
296
+ }, COPIED_FEEDBACK_DURATION);
297
+ }).catch(() => { /* clipboard unavailable */ });
298
+ }
299
+
300
+ private toggleWrap(): void {
301
+ this._wrapping = !this._wrapping;
302
+
303
+ if (!this._dom) {
304
+ return;
305
+ }
306
+
307
+ if (this._wrapping) {
308
+ this._dom.codeElement.className = CODE_AREA_STYLES;
309
+ } else {
310
+ this._dom.codeElement.className = CODE_AREA_STYLES.replace('whitespace-pre-wrap', 'whitespace-pre');
311
+ }
312
+ }
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
+
406
+ private exitBlock(): void {
407
+ const currentIndex = this.api.blocks.getCurrentBlockIndex();
408
+
409
+ this.api.blocks.insert(undefined, undefined, undefined, currentIndex + 1);
410
+ }
411
+
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
+
421
+ if (this._picker) {
422
+ this._picker.getElement().remove();
423
+ this._picker = null;
424
+ }
425
+ }
426
+
427
+ public static get toolbox(): ToolboxConfig {
428
+ return {
429
+ icon: IconCodeBlock,
430
+ title: 'Code',
431
+ titleKey: 'code',
432
+ searchTerms: ['code', 'pre', 'snippet', 'program'],
433
+ searchTermKeys: ['code', 'pre', 'snippet', 'program'],
434
+ };
435
+ }
436
+
437
+ public static get conversionConfig(): ConversionConfig {
438
+ return {
439
+ export: 'code',
440
+ import: 'code',
441
+ };
442
+ }
443
+
444
+ public static get sanitize(): ToolSanitizerConfig {
445
+ return {
446
+ code: true,
447
+ };
448
+ }
449
+
450
+ public static get isReadOnlySupported(): boolean {
451
+ return true;
452
+ }
453
+
454
+ public static get pasteConfig(): PasteConfig {
455
+ return {
456
+ tags: ['PRE'],
457
+ patterns: {
458
+ code: /^```/,
459
+ },
460
+ };
461
+ }
462
+ }