@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
@@ -71,6 +71,8 @@
71
71
  "tools.table.clearSelection": "清除",
72
72
  "tools.table.copySelection": "复制",
73
73
  "tools.table.cellColor": "颜色",
74
+ "tools.table.mergeCells": "合并单元格",
75
+ "tools.table.splitCell": "拆分单元格",
74
76
  "tools.table.headerColumn": "标题列",
75
77
  "tools.table.insertColumnLeft": "在左侧插入列",
76
78
  "tools.table.insertColumnRight": "在右侧插入列",
@@ -88,6 +90,42 @@
88
90
  "toolNames.strikethrough": "删除线",
89
91
  "toolNames.callout": "标注",
90
92
  "toolNames.divider": "分隔线",
93
+ "toolNames.quote": "引用",
94
+ "searchTerms.divider": "分割线",
95
+ "searchTerms.separator": "分隔符",
96
+ "searchTerms.delimiter": "定界符",
97
+ "searchTerms.splitter": "拆分线",
98
+ "searchTerms.paragraph": "段落",
99
+ "searchTerms.plain": "纯文本",
100
+ "searchTerms.title": "名称",
101
+ "searchTerms.header": "标头",
102
+ "searchTerms.heading": "标题",
103
+ "searchTerms.toggle": "折叠",
104
+ "searchTerms.collapsible": "可折叠",
105
+ "searchTerms.bullet": "项目符号",
106
+ "searchTerms.unordered": "无序",
107
+ "searchTerms.list": "列表",
108
+ "searchTerms.ordered": "有序",
109
+ "searchTerms.number": "编号",
110
+ "searchTerms.checkbox": "复选框",
111
+ "searchTerms.task": "任务",
112
+ "searchTerms.todo": "待办",
113
+ "searchTerms.check": "勾选",
114
+ "searchTerms.collapse": "收起",
115
+ "searchTerms.expand": "展开",
116
+ "searchTerms.accordion": "折叠面板",
117
+ "searchTerms.table": "表格",
118
+ "searchTerms.grid": "网格",
119
+ "searchTerms.spreadsheet": "电子表格",
120
+ "searchTerms.callout": "标注",
121
+ "searchTerms.note": "备注",
122
+ "searchTerms.info": "信息",
123
+ "searchTerms.warning": "警告",
124
+ "searchTerms.tip": "提示",
125
+ "searchTerms.alert": "提醒",
126
+ "searchTerms.quote": "引用",
127
+ "searchTerms.blockquote": "块引用",
128
+ "searchTerms.citation": "出处",
91
129
  "tools.callout.placeholder": "标注",
92
130
  "tools.callout.addEmoji": "添加表情",
93
131
  "tools.callout.editIcon": "编辑图标",
@@ -116,5 +154,34 @@
116
154
  "tools.callout.colorBlue": "蓝色",
117
155
  "tools.callout.colorPurple": "紫色",
118
156
  "tools.callout.colorPink": "粉色",
119
- "tools.callout.colorRed": "红色"
157
+ "tools.callout.colorRed": "红色",
158
+ "tools.quote.size": "引用大小",
159
+ "tools.quote.placeholder": "引用",
160
+ "tools.quote.defaultSize": "默认",
161
+ "tools.quote.largeSize": "大",
162
+ "tools.code.codeTab": "代码",
163
+ "tools.code.previewTab": "预览",
164
+ "tools.table.placement": "位置",
165
+ "tools.table.placementTopLeft": "左上",
166
+ "tools.table.placementTopCenter": "居中上",
167
+ "tools.table.placementTopRight": "右上",
168
+ "tools.table.placementMiddleLeft": "左中",
169
+ "tools.table.placementMiddleCenter": "居中",
170
+ "tools.table.placementMiddleRight": "右中",
171
+ "tools.table.placementBottomLeft": "左下",
172
+ "tools.table.placementBottomCenter": "居中下",
173
+ "tools.table.placementBottomRight": "右下",
174
+ "toolNames.code": "代码",
175
+ "toolNames.inlineCode": "代码",
176
+ "tools.code.placeholder": "编写代码…",
177
+ "tools.code.language": "语言",
178
+ "tools.code.copied": "已复制!",
179
+ "tools.code.copyCode": "复制代码",
180
+ "tools.code.wrapLines": "自动换行",
181
+ "tools.code.searchLanguage": "搜索语言...",
182
+ "tools.code.lineNumbers": "行号",
183
+ "searchTerms.code": "代码",
184
+ "searchTerms.snippet": "片段",
185
+ "searchTerms.program": "程序",
186
+ "searchTerms.pre": "pre"
120
187
  }
@@ -297,6 +297,14 @@ export const IconHeaderRow = `
297
297
  </svg>
298
298
  `;
299
299
 
300
+ // Preview/Eye icon
301
+ export const IconPreview = `
302
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
303
+ <path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/>
304
+ <circle cx="12" cy="12" r="3"/>
305
+ </svg>
306
+ `;
307
+
300
308
  // Table with highlighted left column (header column)
301
309
  export const IconHeaderColumn = `
302
310
  <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
@@ -433,6 +441,16 @@ export const IconHash = `
433
441
  </svg>
434
442
  `;
435
443
 
444
+ // Quote icon
445
+ export const IconQuote = `
446
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
447
+ <path d="M4 4v12" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"/>
448
+ <path d="M9 6h7" stroke="currentColor" stroke-width="1.25" stroke-linecap="round"/>
449
+ <path d="M9 10h7" stroke="currentColor" stroke-width="1.25" stroke-linecap="round"/>
450
+ <path d="M9 14h5" stroke="currentColor" stroke-width="1.25" stroke-linecap="round"/>
451
+ </svg>
452
+ `;
453
+
436
454
  export const IconCallout = `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/><line x1="9" y1="10" x2="15" y2="10"/><line x1="12" y1="7" x2="12" y2="13"/></svg>`;
437
455
 
438
456
  export const IconPaintRoller = `<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none">
@@ -448,6 +466,39 @@ export const IconDivider = `
448
466
  </svg>
449
467
  `;
450
468
 
469
+ // Code inline icon (angle brackets: </>)
470
+ export const IconCode = `
471
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
472
+ <path d="m7 6-4 4 4 4m6-8 4 4-4 4" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
473
+ </svg>
474
+ `;
475
+
476
+ // Code block icon (brackets with slash)
477
+ export const IconCodeBlock = `
478
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
479
+ <path d="m6 7-3 3 3 3m8-6 3 3-3 3" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
480
+ <path d="m12 5-4 10" stroke="currentColor" stroke-width="1.25" stroke-linecap="round"/>
481
+ </svg>
482
+ `;
483
+
484
+ // Line wrap icon
485
+ export const IconWrap = `
486
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
487
+ <path d="M4 6h12M4 10h8a2 2 0 0 1 2 2v0a2 2 0 0 1-2 2H9m0 0 2-2m-2 2 2 2" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
488
+ </svg>
489
+ `;
490
+
491
+ // Line numbers icon (gutter marks + code lines)
492
+ export const IconLineNumbers = `
493
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
494
+ <path d="M7 4v12" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" opacity="0.35"/>
495
+ <circle cx="4.5" cy="7" r="0.75" fill="currentColor"/>
496
+ <circle cx="4.5" cy="10" r="0.75" fill="currentColor"/>
497
+ <circle cx="4.5" cy="13" r="0.75" fill="currentColor"/>
498
+ <path d="M10 7h6M10 10h6M10 13h4" stroke="currentColor" stroke-width="1.25" stroke-linecap="round"/>
499
+ </svg>
500
+ `;
501
+
451
502
  // Emoji Picker Category Icons
452
503
 
453
504
  // Star icon (Callout category)
@@ -537,3 +588,30 @@ export const IconEmojiFlag = `
537
588
  <path d="M5 3c2 0 3 1.5 5 1.5S14 3 16 3v8c-2 0-3 1.5-5 1.5S7 11 5 11" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
538
589
  </svg>
539
590
  `;
591
+
592
+ // Merge cells icon (two cells merging into one)
593
+ export const IconMergeCells = `
594
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
595
+ <path d="M10 4v12" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-dasharray="1.5 2"/>
596
+ <path d="M5.5 7 8.5 10 5.5 13" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
597
+ <path d="M14.5 7 11.5 10 14.5 13" stroke="currentColor" stroke-width="1.25" stroke-linecap="round" stroke-linejoin="round"/>
598
+ </svg>
599
+ `;
600
+
601
+ // Split cell icon (one cell splitting into two)
602
+ export const IconSplitCell = `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="2"/><path d="M12 3v18"/><path d="M8 8l4 4-4 4"/><path d="M16 8l-4 4 4 4"/></svg>`;
603
+
604
+ // Placement icon (3x3 alignment dot grid)
605
+ export const IconPlacement = `
606
+ <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
607
+ <circle cx="6" cy="6" r="1.25" fill="currentColor"/>
608
+ <circle cx="10" cy="6" r="1.25" fill="currentColor"/>
609
+ <circle cx="14" cy="6" r="1.25" fill="currentColor"/>
610
+ <circle cx="6" cy="10" r="1.25" fill="currentColor"/>
611
+ <circle cx="10" cy="10" r="1.25" fill="currentColor"/>
612
+ <circle cx="14" cy="10" r="1.25" fill="currentColor"/>
613
+ <circle cx="6" cy="14" r="1.25" fill="currentColor"/>
614
+ <circle cx="10" cy="14" r="1.25" fill="currentColor"/>
615
+ <circle cx="14" cy="14" r="1.25" fill="currentColor"/>
616
+ </svg>
617
+ `;
@@ -0,0 +1,399 @@
1
+ import type { InlineTool, SanitizerConfig } from '../../../types';
2
+ import type { MenuConfig } from '../../../types/tools';
3
+ import { IconCode } from '../icons';
4
+
5
+ import {
6
+ isRangeFormatted,
7
+ findFormattingAncestor,
8
+ collectFormattingAncestors,
9
+ } from './utils/formatting-range-utils';
10
+
11
+ /**
12
+ * Check if an element is a code tag (<code>)
13
+ * @param element - The element to check
14
+ */
15
+ const isCodeTag = (element: Element): boolean => {
16
+ return element.tagName === 'CODE';
17
+ };
18
+
19
+ /**
20
+ * Code Inline Tool
21
+ *
22
+ * Inline Toolbar Tool
23
+ *
24
+ * Style selected text with inline code
25
+ */
26
+ export class CodeInlineTool implements InlineTool {
27
+ /**
28
+ * Specifies Tool as Inline Toolbar Tool
29
+ * @returns {boolean}
30
+ */
31
+ public static isInline = true;
32
+
33
+ /**
34
+ * Title for the Inline Tool
35
+ */
36
+ public static title = 'Code';
37
+
38
+ /**
39
+ * Translation key for i18n
40
+ */
41
+ public static titleKey = 'inlineCode';
42
+
43
+ /**
44
+ * Sanitizer Rule
45
+ * Leave <code> tags
46
+ * @returns {object}
47
+ */
48
+ public static get sanitize(): SanitizerConfig {
49
+ return {
50
+ code: {},
51
+ } as SanitizerConfig;
52
+ }
53
+
54
+ /**
55
+ * Create button for Inline Toolbar
56
+ */
57
+ public render(): MenuConfig {
58
+ return {
59
+ icon: IconCode,
60
+ name: 'code',
61
+ onActivate: () => {
62
+ this.toggleCode();
63
+ },
64
+ isActive: () => {
65
+ const selection = window.getSelection();
66
+
67
+ return selection ? this.isSelectionVisuallyCode(selection) : false;
68
+ },
69
+ };
70
+ }
71
+
72
+ /**
73
+ * Shortcut for code tool
74
+ */
75
+ public static shortcut = 'CMD+E';
76
+
77
+ /**
78
+ * Apply or remove code formatting using modern Selection API
79
+ */
80
+ private toggleCode(): void {
81
+ const selection = window.getSelection();
82
+
83
+ if (!selection || selection.rangeCount === 0) {
84
+ return;
85
+ }
86
+
87
+ const range = selection.getRangeAt(0);
88
+
89
+ if (range.collapsed) {
90
+ this.toggleCollapsedCode(range, selection);
91
+
92
+ return;
93
+ }
94
+
95
+ const shouldUnwrap = this.isRangeCode(range, { ignoreWhitespace: true });
96
+
97
+ if (shouldUnwrap) {
98
+ this.unwrapCodeTags(range);
99
+ } else {
100
+ this.wrapWithCode(range);
101
+ }
102
+ }
103
+
104
+ /**
105
+ * Handle toggle for collapsed selection (caret)
106
+ * @param range - Current range
107
+ * @param selection - Current selection
108
+ */
109
+ private toggleCollapsedCode(range: Range, selection: Selection): void {
110
+ const isCode = this.isRangeCode(range, { ignoreWhitespace: true });
111
+
112
+ if (isCode) {
113
+ const textNode = document.createTextNode('\u200B');
114
+
115
+ range.insertNode(textNode);
116
+ range.selectNode(textNode);
117
+ this.unwrapCodeTags(range);
118
+
119
+ const newRange = document.createRange();
120
+
121
+ newRange.setStart(textNode, 1);
122
+ newRange.setEnd(textNode, 1);
123
+
124
+ selection.removeAllRanges();
125
+ selection.addRange(newRange);
126
+ } else {
127
+ const code = document.createElement('code');
128
+ const textNode = document.createTextNode('\u200B');
129
+
130
+ code.appendChild(textNode);
131
+ range.insertNode(code);
132
+
133
+ const newRange = document.createRange();
134
+
135
+ newRange.setStart(textNode, 1);
136
+ newRange.setEnd(textNode, 1);
137
+
138
+ selection.removeAllRanges();
139
+ selection.addRange(newRange);
140
+ }
141
+ }
142
+
143
+ /**
144
+ * Check if current selection is within a code tag
145
+ * @param selection - The Selection object to check
146
+ */
147
+ private isSelectionVisuallyCode(selection: Selection): boolean {
148
+ if (selection.rangeCount === 0) {
149
+ return false;
150
+ }
151
+
152
+ const range = selection.getRangeAt(0);
153
+
154
+ return this.isRangeCode(range, { ignoreWhitespace: true });
155
+ }
156
+
157
+ /**
158
+ * Check if a range contains code text
159
+ * @param range - The range to check
160
+ * @param options - Options for checking code status
161
+ */
162
+ private isRangeCode(range: Range, options: { ignoreWhitespace: boolean }): boolean {
163
+ return isRangeFormatted(range, isCodeTag, options);
164
+ }
165
+
166
+ /**
167
+ * Wrap selection with <code> tag
168
+ * @param range - The Range object containing the selection to wrap
169
+ */
170
+ private wrapWithCode(range: Range): void {
171
+ const html = this.getRangeHtmlWithoutCode(range);
172
+ const insertedRange = this.replaceRangeWithHtml(range, `<code>${html}</code>`);
173
+ const selection = window.getSelection();
174
+
175
+ if (selection && insertedRange) {
176
+ selection.removeAllRanges();
177
+ selection.addRange(insertedRange);
178
+ }
179
+ }
180
+
181
+ /**
182
+ * Remove code tags (<code>) while preserving content
183
+ * @param range - The Range object containing the selection to unwrap
184
+ */
185
+ private unwrapCodeTags(range: Range): void {
186
+ const codeAncestors = this.collectCodeAncestors(range);
187
+ const selection = window.getSelection();
188
+
189
+ if (!selection) {
190
+ return;
191
+ }
192
+
193
+ const marker = document.createElement('span');
194
+ const fragment = range.extractContents();
195
+
196
+ marker.appendChild(fragment);
197
+ this.removeNestedCode(marker);
198
+
199
+ range.insertNode(marker);
200
+
201
+ const markerRange = document.createRange();
202
+
203
+ markerRange.selectNodeContents(marker);
204
+ selection.removeAllRanges();
205
+ selection.addRange(markerRange);
206
+
207
+ for (; ;) {
208
+ const currentCode = this.findCodeElement(marker);
209
+
210
+ if (!currentCode) {
211
+ break;
212
+ }
213
+
214
+ this.moveMarkerOutOfCode(marker, currentCode);
215
+ }
216
+
217
+ const firstChild = marker.firstChild;
218
+ const lastChild = marker.lastChild;
219
+
220
+ this.unwrapElement(marker);
221
+
222
+ const finalRange = firstChild && lastChild ? (() => {
223
+ const newRange = document.createRange();
224
+
225
+ newRange.setStartBefore(firstChild);
226
+ newRange.setEndAfter(lastChild);
227
+
228
+ selection.removeAllRanges();
229
+ selection.addRange(newRange);
230
+
231
+ return newRange;
232
+ })() : undefined;
233
+
234
+ if (!finalRange) {
235
+ selection.removeAllRanges();
236
+ }
237
+
238
+ codeAncestors.forEach((element) => {
239
+ if (element.textContent.length === 0) {
240
+ element.remove();
241
+ }
242
+ });
243
+ }
244
+
245
+ /**
246
+ * Find a code element in the parent chain
247
+ * @param node - The node to start searching from
248
+ */
249
+ private findCodeElement(node: Node | null): HTMLElement | null {
250
+ return findFormattingAncestor(node, isCodeTag);
251
+ }
252
+
253
+ /**
254
+ * Collect all code ancestor elements within a range
255
+ * @param range - The range to search for code ancestors
256
+ */
257
+ private collectCodeAncestors(range: Range): HTMLElement[] {
258
+ return collectFormattingAncestors(range, isCodeTag);
259
+ }
260
+
261
+ /**
262
+ * Get HTML content of a range with code tags removed
263
+ * @param range - The range to extract HTML from
264
+ */
265
+ private getRangeHtmlWithoutCode(range: Range): string {
266
+ const contents = range.cloneContents();
267
+
268
+ this.removeNestedCode(contents);
269
+
270
+ const container = document.createElement('div');
271
+
272
+ container.appendChild(contents);
273
+
274
+ return container.innerHTML;
275
+ }
276
+
277
+ /**
278
+ * Remove nested code tags from a root node
279
+ * @param root - The root node to process
280
+ */
281
+ private removeNestedCode(root: ParentNode): void {
282
+ const codeNodes = root.querySelectorAll('code');
283
+
284
+ codeNodes.forEach((node) => {
285
+ this.unwrapElement(node);
286
+ });
287
+ }
288
+
289
+ /**
290
+ * Unwrap an element by moving its children to the parent
291
+ * @param element - The element to unwrap
292
+ */
293
+ private unwrapElement(element: Element): void {
294
+ const parent = element.parentNode;
295
+
296
+ if (!parent) {
297
+ element.remove();
298
+
299
+ return;
300
+ }
301
+
302
+ while (element.firstChild) {
303
+ parent.insertBefore(element.firstChild, element);
304
+ }
305
+
306
+ parent.removeChild(element);
307
+ }
308
+
309
+ /**
310
+ * Replace the current range contents with provided HTML snippet
311
+ * @param range - Range to replace
312
+ * @param html - HTML string to insert
313
+ */
314
+ private replaceRangeWithHtml(range: Range, html: string): Range | undefined {
315
+ const fragment = this.createFragmentFromHtml(html);
316
+ const firstInserted = fragment.firstChild ?? null;
317
+ const lastInserted = fragment.lastChild ?? null;
318
+
319
+ range.deleteContents();
320
+
321
+ if (!firstInserted || !lastInserted) {
322
+ return;
323
+ }
324
+
325
+ range.insertNode(fragment);
326
+
327
+ const newRange = document.createRange();
328
+
329
+ newRange.setStartBefore(firstInserted);
330
+ newRange.setEndAfter(lastInserted);
331
+
332
+ return newRange;
333
+ }
334
+
335
+ /**
336
+ * Convert an HTML snippet to a document fragment
337
+ * @param html - HTML string to convert
338
+ */
339
+ private createFragmentFromHtml(html: string): DocumentFragment {
340
+ const template = document.createElement('template');
341
+
342
+ template.innerHTML = html;
343
+
344
+ return template.content;
345
+ }
346
+
347
+ /**
348
+ * Move a temporary marker element outside of a code ancestor while preserving content order
349
+ * @param marker - Marker element wrapping the selection contents
350
+ * @param codeElement - Code ancestor containing the marker
351
+ */
352
+ private moveMarkerOutOfCode(marker: HTMLElement, codeElement: HTMLElement): void {
353
+ const parent = codeElement.parentNode;
354
+
355
+ if (!parent) {
356
+ return;
357
+ }
358
+
359
+ // Remove empty text nodes to ensure accurate child count
360
+ Array.from(codeElement.childNodes).forEach((node) => {
361
+ if (node.nodeType === Node.TEXT_NODE && (node.textContent ?? '').length === 0) {
362
+ node.remove();
363
+ }
364
+ });
365
+
366
+ const isOnlyChild = codeElement.childNodes.length === 1 && codeElement.firstChild === marker;
367
+
368
+ if (isOnlyChild) {
369
+ codeElement.replaceWith(marker);
370
+
371
+ return;
372
+ }
373
+
374
+ const isFirstChild = codeElement.firstChild === marker;
375
+
376
+ if (isFirstChild) {
377
+ parent.insertBefore(marker, codeElement);
378
+
379
+ return;
380
+ }
381
+
382
+ const isLastChild = codeElement.lastChild === marker;
383
+
384
+ if (isLastChild) {
385
+ parent.insertBefore(marker, codeElement.nextSibling);
386
+
387
+ return;
388
+ }
389
+
390
+ const trailingClone = codeElement.cloneNode(false) as HTMLElement;
391
+
392
+ while (marker.nextSibling) {
393
+ trailingClone.appendChild(marker.nextSibling);
394
+ }
395
+
396
+ parent.insertBefore(trailingClone, codeElement.nextSibling);
397
+ parent.insertBefore(marker, trailingClone);
398
+ }
399
+ }
@@ -1,6 +1,7 @@
1
1
  import type { BlockToolData, OutputBlockData, OutputData, ToolConfig } from '../../../../types';
2
2
  import type { BlockAPI as BlockAPIInterface, Blocks } from '../../../../types/api';
3
3
  import type { BlockTuneData } from '../../../../types/block-tunes/block-tune-data';
4
+ import type { MarkdownImportConfig } from '../../../markdown/types';
4
5
  import { isInsideTableCell, isRestrictedInTableCell } from '../../../tools/table/table-restrictions';
5
6
  import { Module } from '../../__module';
6
7
  import { Block } from '../../block';
@@ -245,6 +246,22 @@ export class BlocksAPI extends Module {
245
246
  }
246
247
  }
247
248
 
249
+ /**
250
+ * Import Markdown string as blocks.
251
+ * Lazy-loads the markdown converter on first call.
252
+ * @param md - Markdown source string
253
+ * @param options - Optional configuration for tool mapping and extensions
254
+ */
255
+ public async importMarkdown(md: string, options?: MarkdownImportConfig): Promise<OutputData> {
256
+ const { markdownToBlocks } = await import('../../../markdown/index');
257
+ const blocks = await markdownToBlocks(md, options);
258
+ const data: OutputData = { blocks };
259
+
260
+ await this.render(data);
261
+
262
+ return data;
263
+ }
264
+
248
265
  /**
249
266
  * Insert new Block and returns it's API
250
267
  * @param {string} type — Tool name
@@ -17,9 +17,6 @@ export class UiAPI extends Module {
17
17
  get isMobile(): boolean {
18
18
  return uiModule.isMobile;
19
19
  },
20
- /**
21
- * There can be added some UI methods, like toggleThinMode() etc
22
- */
23
20
  };
24
21
  }
25
22
 
@@ -32,19 +32,36 @@ export class BlockSelectionKeys extends BlockEventComposer {
32
32
  */
33
33
  private canIndentSelectedListItems(): boolean {
34
34
  const { BlockSelection, BlockManager } = this.Blok;
35
+ const selectedSet = new Set(BlockSelection.selectedBlocks);
35
36
 
36
37
  for (const block of BlockSelection.selectedBlocks) {
37
38
  const blockIndex = BlockManager.getBlockIndex(block);
38
39
 
39
- if (blockIndex === undefined || blockIndex === 0) {
40
+ if (blockIndex === undefined) {
40
41
  return false;
41
42
  }
42
43
 
43
- const previousBlock = BlockManager.getBlockByIndex(blockIndex - 1);
44
+ const previousBlock = blockIndex > 0
45
+ ? BlockManager.getBlockByIndex(blockIndex - 1)
46
+ : undefined;
44
47
 
45
- if (!previousBlock || previousBlock.name !== LIST_TOOL_NAME) {
48
+ const isFirstInGroup = !previousBlock || previousBlock.name !== LIST_TOOL_NAME;
49
+
50
+ // First-in-group items can nest one level; mid-list items can't exceed previous depth
51
+ if (isFirstInGroup && this.getListBlockDepth(block) >= 1) {
46
52
  return false;
47
53
  }
54
+ if (isFirstInGroup) {
55
+ continue;
56
+ }
57
+
58
+ /**
59
+ * If the predecessor is also selected, both will be indented together,
60
+ * so the relative depth difference is preserved — skip the check.
61
+ */
62
+ if (selectedSet.has(previousBlock)) {
63
+ continue;
64
+ }
48
65
 
49
66
  if (this.getListBlockDepth(block) > this.getListBlockDepth(previousBlock)) {
50
67
  return false;