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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (471) hide show
  1. package/codemod/migrate-editorjs-to-blok.js +0 -2
  2. package/codemod/test.js +0 -6
  3. package/dist/blok.mjs +3 -3
  4. package/dist/chunks/_basePickBy-BHRNO12X.mjs +410 -0
  5. package/dist/chunks/_baseUniq-DtFPDBML.mjs +1045 -0
  6. package/dist/chunks/_getTag-ozrhqxk_.mjs +26 -0
  7. package/dist/chunks/arc-BEqJP9HX.mjs +80 -0
  8. package/dist/chunks/architecture-YZFGNWBL-Bcu-90pi.mjs +3 -0
  9. package/dist/chunks/architectureDiagram-Q4EWVU46-BMno5LCn.mjs +4066 -0
  10. package/dist/chunks/array-Cyf-61SV.mjs +6 -0
  11. package/dist/chunks/blockDiagram-DXYQGD6D-DlP_cPth.mjs +3259 -0
  12. package/dist/chunks/{blok-DH-WEcA8.mjs → blok-CiLRmoHI.mjs} +2030 -1996
  13. package/dist/chunks/c4Diagram-AHTNJAMY-BbVV8EXj.mjs +2956 -0
  14. package/dist/chunks/channel-DPcniO2B.mjs +5 -0
  15. package/dist/chunks/chunk-2KRD3SAO-CazES4VS.mjs +20 -0
  16. package/dist/chunks/chunk-336JU56O-heO72r_k.mjs +49 -0
  17. package/dist/chunks/chunk-426QAEUC-CmCcml1z.mjs +13 -0
  18. package/dist/chunks/chunk-4BX2VUAB-B10DxOza.mjs +19 -0
  19. package/dist/chunks/chunk-4TB4RGXK-B0snhZOU.mjs +3250 -0
  20. package/dist/chunks/chunk-55IACEB6-CGkn5ABd.mjs +8 -0
  21. package/dist/chunks/chunk-5FUZZQ4R-USdumo_u.mjs +3786 -0
  22. package/dist/chunks/chunk-5PVQY5BW-CxUGVzQL.mjs +1692 -0
  23. package/dist/chunks/chunk-67CJDMHE-Bvw55oRa.mjs +20 -0
  24. package/dist/chunks/chunk-7N4EOEYR-Bs2qDy88.mjs +29 -0
  25. package/dist/chunks/chunk-AA7GKIK3-Bss0LgrN.mjs +24 -0
  26. package/dist/chunks/chunk-BSJP7CBP-CpUW7gi5.mjs +83 -0
  27. package/dist/chunks/chunk-CIAEETIT-DlRbLLf3.mjs +20 -0
  28. package/dist/chunks/chunk-D6kmoKXy.mjs +20 -0
  29. package/dist/chunks/chunk-EDXVE4YY-DEcX4XWm.mjs +26 -0
  30. package/dist/chunks/chunk-ENJZ2VHE-B4THRZkR.mjs +566 -0
  31. package/dist/chunks/chunk-FMBD7UC4-CF6BKEiV.mjs +5 -0
  32. package/dist/chunks/chunk-FOC6F5B3--xuza7Yn.mjs +20 -0
  33. package/dist/chunks/chunk-ICPOFSXX-BMja8cuy.mjs +3290 -0
  34. package/dist/chunks/chunk-K5T4RW27-CHEqGHFS.mjs +16370 -0
  35. package/dist/chunks/chunk-KGLVRYIC-DHYYpR8v.mjs +20 -0
  36. package/dist/chunks/chunk-LIHQZDEY-AvbOvyLE.mjs +55 -0
  37. package/dist/chunks/chunk-ORNJ4GCN-38fbR5OS.mjs +25 -0
  38. package/dist/chunks/chunk-OYMX7WX6-BiqlATPA.mjs +2038 -0
  39. package/dist/chunks/chunk-QZHKN3VN-DitZIvj8.mjs +12 -0
  40. package/dist/chunks/chunk-U2HBQHQK-DJytnHmZ.mjs +1875 -0
  41. package/dist/chunks/chunk-X2U36JSP-DlOifw1K.mjs +68 -0
  42. package/dist/chunks/chunk-XPW4576I-s4fsi4XO.mjs +1146 -0
  43. package/dist/chunks/chunk-YZCP3GAM-Ch258bXC.mjs +60 -0
  44. package/dist/chunks/chunk-ZZ45TVLE-DWziaKxP.mjs +33 -0
  45. package/dist/chunks/classDiagram-6PBFFD2Q-BOkAe08u.mjs +30 -0
  46. package/dist/chunks/classDiagram-v2-HSJHXN6E-DeKatSvh.mjs +30 -0
  47. package/dist/chunks/clone-CJCz7VRp.mjs +8 -0
  48. package/dist/chunks/{constants-Ccno9NZS.mjs → constants-DFS8l39Y.mjs} +525 -552
  49. package/dist/chunks/cose-bilkent-S5V4N54A-CzLGVqvr.mjs +2246 -0
  50. package/dist/chunks/cytoscape.esm-D0iglm-M.mjs +18108 -0
  51. package/dist/chunks/dagre-KV5264BT-XbHSjleO.mjs +298 -0
  52. package/dist/chunks/dagre-XY8CZ1sg.mjs +1536 -0
  53. package/dist/chunks/default-DIfXCS2E.mjs +4 -0
  54. package/dist/chunks/defaultLocale-DFhS1600.mjs +201 -0
  55. package/dist/chunks/diagram-5BDNPKRD-CM7c3UTI.mjs +112 -0
  56. package/dist/chunks/diagram-G4DWMVQ6-Bhg4ps6b.mjs +546 -0
  57. package/dist/chunks/diagram-MMDJMWI5-C-UCVaxB.mjs +234 -0
  58. package/dist/chunks/diagram-TYMM5635-BOHSujSD.mjs +144 -0
  59. package/dist/chunks/dist-DHsXIYdd.mjs +59 -0
  60. package/dist/chunks/erDiagram-SMLLAGMA-CwKxXFMB.mjs +1712 -0
  61. package/dist/chunks/flowDiagram-DWJPFMVM-rQJKfyuO.mjs +4175 -0
  62. package/dist/chunks/ganttDiagram-T4ZO3ILL-DfaZirLX.mjs +3083 -0
  63. package/dist/chunks/gitGraph-7Q5UKJZL-BKG8cHGz.mjs +3 -0
  64. package/dist/chunks/gitGraphDiagram-UUTBAWPF-CRa-ymsI.mjs +792 -0
  65. package/dist/chunks/graphlib-CuDElSdG.mjs +223 -0
  66. package/dist/chunks/{i18next-G6FKbZqA.mjs → i18next-BBGW2sDE.mjs} +1 -1
  67. package/dist/chunks/{i18next-loader-CwNimni3.mjs → i18next-loader-CasQQb5s.mjs} +2 -2
  68. package/dist/chunks/info-OMHHGYJF-FKqYyUn9.mjs +3 -0
  69. package/dist/chunks/infoDiagram-42DDH7IO-CvyJU2nE.mjs +29 -0
  70. package/dist/chunks/init-JlKGZtuT.mjs +15 -0
  71. package/dist/chunks/ishikawaDiagram-UXIWVN3A-CIpbw1BK.mjs +719 -0
  72. package/dist/chunks/journeyDiagram-VCZTEJTY-H96UcUK9.mjs +885 -0
  73. package/dist/chunks/kanban-definition-6JOO6SKY-BYZT3srA.mjs +980 -0
  74. package/dist/chunks/katex-JyOgX6MW.mjs +22026 -0
  75. package/dist/chunks/{lightweight-i18n-DWCdzAw0.mjs → lightweight-i18n-Cvv8CWh4.mjs} +29 -18
  76. package/dist/chunks/line-B9xUUA7k.mjs +34 -0
  77. package/dist/chunks/linear-Dj-1yA_B.mjs +289 -0
  78. package/dist/chunks/mdast-util-math-CHYUxOHk.mjs +151 -0
  79. package/dist/chunks/mermaid-parser.core-D6OPAUtM.mjs +57 -0
  80. package/dist/chunks/mermaid.core-BPN9ZHKQ.mjs +989 -0
  81. package/dist/{messages-B-4fku2H2.mjs → chunks/messages--YKhFEDE.mjs} +30 -19
  82. package/dist/{messages-BCG_evLg.mjs → chunks/messages-0Uwu1AMJ2.mjs} +28 -17
  83. package/dist/{messages-CdlsTFB1.mjs → chunks/messages-1__0Ph4Q.mjs} +28 -17
  84. package/dist/chunks/{messages-wLSVQbsA2.mjs → messages-4sm9Pb0C.mjs} +28 -17
  85. package/dist/chunks/{messages-R2W_rGOo2.mjs → messages-4uxjtzKW.mjs} +28 -17
  86. package/dist/chunks/{messages-Dm4YVlrm.mjs → messages-B-SwLgkQ.mjs} +30 -19
  87. package/dist/{messages--S8_taOd2.mjs → chunks/messages-B1ylBxXQ.mjs} +28 -17
  88. package/dist/chunks/{messages-B7MIRzCa2.mjs → messages-B5m3dhKc.mjs} +28 -17
  89. package/dist/chunks/{messages-Dplnp19q.mjs → messages-B6n2zDtv.mjs} +29 -18
  90. package/dist/chunks/{messages-DD7BI6BK.mjs → messages-BC9w4zAT.mjs} +28 -17
  91. package/dist/chunks/{messages-BrFl5773.mjs → messages-BOj-7N3p.mjs} +28 -17
  92. package/dist/chunks/{messages-BbdNugdi.mjs → messages-BRYHTS18.mjs} +28 -17
  93. package/dist/chunks/{messages-JQKFJo7C.mjs → messages-BSBbVjor.mjs} +35 -24
  94. package/dist/{messages-CBzd_x7H.mjs → chunks/messages-BUUkmUGc.mjs} +28 -17
  95. package/dist/{messages-CjmSrt1D.mjs → chunks/messages-Bb3YEV2P.mjs} +33 -22
  96. package/dist/{messages-BvgXeMSL2.mjs → chunks/messages-Be_6YLzJ.mjs} +29 -18
  97. package/dist/{messages-pgPcitDH.mjs → chunks/messages-BevRhv5d.mjs} +28 -17
  98. package/dist/chunks/{messages-BW_7lfqG2.mjs → messages-Bhqr7Im2.mjs} +28 -17
  99. package/dist/chunks/{messages-LxumrNue2.mjs → messages-BpJFjSKa.mjs} +29 -18
  100. package/dist/{messages-xEI8gEDK.mjs → chunks/messages-BqYlq_Bn.mjs} +28 -17
  101. package/dist/{messages-CBdQ3XP9.mjs → chunks/messages-BtAwCUfD.mjs} +28 -17
  102. package/dist/{messages-D3cAcyzj.mjs → chunks/messages-Bthbp65G.mjs} +29 -18
  103. package/dist/{messages-CYX48nfg.mjs → chunks/messages-BvHMZ8Pi2.mjs} +28 -17
  104. package/dist/{messages-Dddxv8-f2.mjs → chunks/messages-Bw1BE9jW.mjs} +28 -17
  105. package/dist/chunks/{messages-d0Ky6QjR.mjs → messages-Bx6Wt285.mjs} +28 -17
  106. package/dist/chunks/{messages-BPog17132.mjs → messages-BzslJRYv.mjs} +29 -18
  107. package/dist/{messages-hTpeKUaW.mjs → chunks/messages-C02M0Tpw.mjs} +28 -17
  108. package/dist/chunks/{messages-C-b6tPad2.mjs → messages-C1u3E9qg.mjs} +28 -17
  109. package/dist/{messages-BJ7BuFZi.mjs → chunks/messages-C68WgSKk.mjs} +29 -18
  110. package/dist/chunks/{messages-Bpda_3PM2.mjs → messages-C8w8JCP0.mjs} +30 -19
  111. package/dist/chunks/{messages-CmrMwBv3.mjs → messages-CFOZdSk4.mjs} +28 -17
  112. package/dist/{messages-DVQNjdPk.mjs → chunks/messages-CGOY79lr.mjs} +28 -17
  113. package/dist/chunks/{messages-DAVsuDWh2.mjs → messages-CGaSMZPu.mjs} +28 -17
  114. package/dist/{messages-DtrSrdfE2.mjs → chunks/messages-CJJgQ0BH.mjs} +28 -17
  115. package/dist/{messages-CgzbJ8_l2.mjs → chunks/messages-CTD6rtQj2.mjs} +28 -17
  116. package/dist/chunks/{messages-p4byLfvR.mjs → messages-CZymJML9.mjs} +32 -21
  117. package/dist/{messages-CqkRG9mH.mjs → chunks/messages-CfeFJbiv.mjs} +32 -21
  118. package/dist/{messages-DjJQoYvP2.mjs → chunks/messages-Cgatzu_z.mjs} +30 -19
  119. package/dist/{messages-CM5fsPo02.mjs → chunks/messages-Ch2zBI602.mjs} +28 -17
  120. package/dist/chunks/{messages-CyNsByCY.mjs → messages-CiAHsUfO.mjs} +28 -17
  121. package/dist/{messages-BXI3qIos.mjs → chunks/messages-Cuzq-tNW.mjs} +28 -17
  122. package/dist/chunks/{messages-FHrCEJmY2.mjs → messages-Cw4qiMwb.mjs} +28 -17
  123. package/dist/chunks/{messages-xfjdrZmx.mjs → messages-Cyh-mz40.mjs} +28 -17
  124. package/dist/{messages-Bo_FUvVH.mjs → chunks/messages-D-I2QO8H.mjs} +28 -17
  125. package/dist/chunks/{messages-Ct7AMBS82.mjs → messages-D0D2gruy.mjs} +28 -17
  126. package/dist/chunks/{messages-CrMfiGu5.mjs → messages-D1BKxfLD.mjs} +29 -18
  127. package/dist/chunks/{messages-CmXADeab2.mjs → messages-D4eDs6R_.mjs} +28 -17
  128. package/dist/chunks/{messages-ClRHDxzh.mjs → messages-D9Xr-hES.mjs} +28 -17
  129. package/dist/{messages-tsHpMdDT2.mjs → chunks/messages-D9eJPHia.mjs} +30 -19
  130. package/dist/{messages-DUBHHfEt.mjs → chunks/messages-DBFWSzKY2.mjs} +28 -17
  131. package/dist/{messages-i4S6q64n2.mjs → chunks/messages-DC0wu2S7.mjs} +28 -17
  132. package/dist/chunks/{messages-BnznaKEP2.mjs → messages-DF9o19rG.mjs} +28 -17
  133. package/dist/{messages-DA-o8X3A.mjs → chunks/messages-DFS_n986.mjs} +51 -40
  134. package/dist/{messages-BGsDZTQp2.mjs → chunks/messages-DGS4H30T.mjs} +28 -17
  135. package/dist/chunks/{messages-Cdx4QMR1.mjs → messages-DKjddpzJ.mjs} +30 -19
  136. package/dist/chunks/{messages-B3s2vra72.mjs → messages-DMvTdUXC.mjs} +30 -19
  137. package/dist/{messages-Dcyrzdxa2.mjs → chunks/messages-DQUX-QYI2.mjs} +28 -17
  138. package/dist/chunks/{messages-BS1nOvZ-.mjs → messages-DUigq8FO2.mjs} +28 -17
  139. package/dist/{messages-BKjqW08U.mjs → chunks/messages-DY0FJdpH.mjs} +28 -17
  140. package/dist/{messages-BBvDbp62.mjs → chunks/messages-DfVXiqt-2.mjs} +28 -17
  141. package/dist/chunks/{messages-DHCVA7XQ.mjs → messages-DgZc9TJw.mjs} +28 -17
  142. package/dist/chunks/{messages-1Raf1IK82.mjs → messages-QD4BCUDP.mjs} +28 -17
  143. package/dist/{messages-JhoVMjfX2.mjs → chunks/messages-USmweex9.mjs} +28 -17
  144. package/dist/chunks/{messages-DBpXyvRe2.mjs → messages-a1JTi0Qm.mjs} +31 -20
  145. package/dist/chunks/{messages-D5IgUbBD2.mjs → messages-jcgCHPRn.mjs} +28 -17
  146. package/dist/chunks/{messages-Dfpi8pDY.mjs → messages-tnnqHpbd.mjs} +29 -18
  147. package/dist/{messages-DZEcrbmH.mjs → chunks/messages-vzWKPLJO.mjs} +28 -17
  148. package/dist/chunks/micromark-extension-math-Cz_ZZ_0Y.mjs +169 -0
  149. package/dist/chunks/micromark-factory-space-WwmyBO_J.mjs +36 -0
  150. package/dist/chunks/mindmap-definition-QFDTVHPH-BswFuNN6.mjs +1013 -0
  151. package/dist/chunks/{notifier-Butv4Dvo.mjs → notifier-B1zCi9G1.mjs} +1 -1
  152. package/dist/chunks/{objectSpread2-BY4mgzrQ.mjs → objectSpread2-CWwMYL_U.mjs} +1 -1
  153. package/dist/chunks/ordinal-D1_lEgAO.mjs +65 -0
  154. package/dist/chunks/packet-4T2RLAQJ-DTUW2U0C.mjs +3 -0
  155. package/dist/chunks/path-6nYPAvNb.mjs +85 -0
  156. package/dist/chunks/pie-ZZUOXDRM-D-umqvEM.mjs +3 -0
  157. package/dist/chunks/pieDiagram-DEJITSTG-1WJgvK1w.mjs +179 -0
  158. package/dist/chunks/quadrantDiagram-34T5L4WZ-B_YH8QGl.mjs +1960 -0
  159. package/dist/chunks/radar-PYXPWWZC-DkQelf08.mjs +3 -0
  160. package/dist/chunks/requirementDiagram-MS252O5E-DRl0YJRI.mjs +2224 -0
  161. package/dist/chunks/rough.esm-CSWJruu5.mjs +1353 -0
  162. package/dist/chunks/sankeyDiagram-XADWPNL6-B-8IrknH.mjs +909 -0
  163. package/dist/chunks/sequenceDiagram-FGHM5R23-DTLb8qmO.mjs +4181 -0
  164. package/dist/chunks/src-CRgEHLPW.mjs +2149 -0
  165. package/dist/chunks/stateDiagram-FHFEXIEX-B0JFjLFy.mjs +218 -0
  166. package/dist/chunks/stateDiagram-v2-QKLJ7IA2-Co9CUU_z.mjs +28 -0
  167. package/dist/chunks/timeline-definition-GMOUNBTQ-CS9KTh-Q.mjs +1084 -0
  168. package/dist/chunks/{tools-C2_IVsQY.mjs → tools-CSYsrnud.mjs} +2846 -3098
  169. package/dist/chunks/treeView-SZITEDCU-DOOoyNP9.mjs +3 -0
  170. package/dist/chunks/treemap-W4RFUUIX-CsOoUA-u.mjs +3 -0
  171. package/dist/chunks/vennDiagram-DHZGUBPP-0BNu5Wna.mjs +1876 -0
  172. package/dist/chunks/wardley-RL74JXVD-CCzZcmEk.mjs +3 -0
  173. package/dist/chunks/wardleyDiagram-NUSXRM2D-Ca9XByNH.mjs +594 -0
  174. package/dist/chunks/xychartDiagram-5P7HB3ND-C8AyKUAE.mjs +2017 -0
  175. package/dist/cli.mjs +1 -1
  176. package/dist/full.mjs +14 -14
  177. package/dist/locales.mjs +95 -84
  178. package/dist/markdown.mjs +3962 -0
  179. package/dist/{chunks/messages-6mikOS4D2.mjs → messages-5jvKxQNu2.mjs} +28 -17
  180. package/dist/{messages-BAcH6PtT2.mjs → messages-7QD-X6XT2.mjs} +28 -17
  181. package/dist/{messages-DbxbxUiK2.mjs → messages-96iaAUds2.mjs} +29 -18
  182. package/dist/{messages-CVcQD-9u.mjs → messages-B19o-Teb.mjs} +30 -19
  183. package/dist/{messages-Ccd587Yn.mjs → messages-B1ZUQagA.mjs} +28 -17
  184. package/dist/{messages-upqrRZQH2.mjs → messages-B7ieAJBd2.mjs} +28 -17
  185. package/dist/{chunks/messages-Csvm4mtA.mjs → messages-BECMxmfX.mjs} +28 -17
  186. package/dist/{chunks/messages-DA7Zk-Cy.mjs → messages-BIHc0KHY.mjs} +29 -18
  187. package/dist/{chunks/messages-BdnSVKOw.mjs → messages-BIoeoik5.mjs} +28 -17
  188. package/dist/{chunks/messages-DQ5AyNCU.mjs → messages-BJeGJksD.mjs} +28 -17
  189. package/dist/{messages-C5XPUD9T2.mjs → messages-BRZX964b2.mjs} +29 -18
  190. package/dist/{messages-Dkg99bfr2.mjs → messages-BTQPpoM42.mjs} +31 -20
  191. package/dist/{messages-fLi0P2dP.mjs → messages-BYNcD6uR.mjs} +28 -17
  192. package/dist/{messages-BvgTQLf72.mjs → messages-BYmmMDrN2.mjs} +28 -17
  193. package/dist/{chunks/messages-CgRvtOEY.mjs → messages-BbYq1pk-.mjs} +28 -17
  194. package/dist/{chunks/messages-DUDgFEEe2.mjs → messages-BiUGXvYr2.mjs} +28 -17
  195. package/dist/{chunks/messages-DJkIeapn.mjs → messages-BiiongNz2.mjs} +28 -17
  196. package/dist/{messages-BBq0M604.mjs → messages-Bm0Feca1.mjs} +32 -21
  197. package/dist/{messages-eTourT12.mjs → messages-BmAn22OX.mjs} +28 -17
  198. package/dist/{messages-C6Y4Jv2N.mjs → messages-Bq3F2Tp_.mjs} +28 -17
  199. package/dist/{messages-DIRha_gg2.mjs → messages-BsycN_JI2.mjs} +28 -17
  200. package/dist/{chunks/messages-CljStrYi.mjs → messages-BwHs4cm1.mjs} +32 -21
  201. package/dist/{chunks/messages-Cs9XBt4T.mjs → messages-CJTy6JZt.mjs} +28 -17
  202. package/dist/{messages-BokEflKa.mjs → messages-CR_L_UtK.mjs} +28 -17
  203. package/dist/{chunks/messages-ZJ0b1C3a.mjs → messages-CSUHBs4c2.mjs} +28 -17
  204. package/dist/{messages-BcFQFcJ92.mjs → messages-CWIXvnDf2.mjs} +28 -17
  205. package/dist/{messages-DnatBKPm.mjs → messages-CcF4y-E4.mjs} +28 -17
  206. package/dist/{messages-BywbKcPC.mjs → messages-Ce6KVEbT.mjs} +29 -18
  207. package/dist/{messages-DOTJ2NvJ.mjs → messages-Ci0KqX-J.mjs} +35 -24
  208. package/dist/{messages-BtxaN-xx.mjs → messages-CjbnogEC.mjs} +28 -17
  209. package/dist/{messages-BSe3QDnQ.mjs → messages-CmB406HW.mjs} +30 -19
  210. package/dist/{messages-BVKZK-3t.mjs → messages-CqXtJTpU.mjs} +28 -17
  211. package/dist/{chunks/messages-DJA6fb_P2.mjs → messages-D0aw5_0k2.mjs} +30 -19
  212. package/dist/{chunks/messages-DPykxECP2.mjs → messages-D8FQWulF2.mjs} +28 -17
  213. package/dist/{chunks/messages-CpzO7KRA.mjs → messages-DBiVgUs2.mjs} +29 -18
  214. package/dist/{chunks/messages-B0ffBqzr.mjs → messages-DIJlIqlQ2.mjs} +28 -17
  215. package/dist/{chunks/messages-BaPZuLjN.mjs → messages-DLX_iBDJ.mjs} +28 -17
  216. package/dist/{chunks/messages-CvfKofOP.mjs → messages-DLlc9QPw.mjs} +28 -17
  217. package/dist/{chunks/messages-Czny5pPT2.mjs → messages-DMr62KiO2.mjs} +28 -17
  218. package/dist/{chunks/messages-IDEUsFhQ2.mjs → messages-DPA-mMWC2.mjs} +29 -18
  219. package/dist/{messages-BCuTVHBV.mjs → messages-DTh9a8mR.mjs} +28 -17
  220. package/dist/{chunks/messages-DT7fRpCy.mjs → messages-DY4IqlhY.mjs} +28 -17
  221. package/dist/{chunks/messages-BgVEGd4c.mjs → messages-DYTTu0O12.mjs} +28 -17
  222. package/dist/{messages-Bk984gRE2.mjs → messages-DbySKTKt2.mjs} +30 -19
  223. package/dist/{chunks/messages-ID1PHnMv.mjs → messages-Ddnj2iTG2.mjs} +28 -17
  224. package/dist/{messages-BmNaAyKS.mjs → messages-DkLU_rWm.mjs} +28 -17
  225. package/dist/{messages-C6OJvnJg2.mjs → messages-Dl3Sv6Rq2.mjs} +29 -18
  226. package/dist/{chunks/messages-C1OqT_nL.mjs → messages-Dl5Y2-Ia.mjs} +51 -40
  227. package/dist/{chunks/messages-Cqc-6rfh2.mjs → messages-DnG0ef8t2.mjs} +30 -19
  228. package/dist/{chunks/messages-BkCjgGxc.mjs → messages-DnGJD4TL.mjs} +28 -17
  229. package/dist/{messages-Bio7KYsr2.mjs → messages-Dnp9N6RU2.mjs} +28 -17
  230. package/dist/{chunks/messages-Df87zXXG.mjs → messages-Dvn35ksS.mjs} +28 -17
  231. package/dist/{messages-CHJ5SOZI.mjs → messages-Dw__BcTj.mjs} +28 -17
  232. package/dist/{chunks/messages-DC7TX-YT.mjs → messages-Dy-Y_nEI.mjs} +28 -17
  233. package/dist/{messages-DV9e1DW7.mjs → messages-E_ZuzGDt.mjs} +28 -17
  234. package/dist/{messages-DD5pW0zJ.mjs → messages-F2xRoY1w.mjs} +28 -17
  235. package/dist/{chunks/messages-BgsPQXfP.mjs → messages-Smt4GBbj.mjs} +33 -22
  236. package/dist/{messages-DJT4Bt_02.mjs → messages-aMXpHt5X2.mjs} +28 -17
  237. package/dist/{chunks/messages-B2pW6jO_.mjs → messages-aWZH50vu2.mjs} +30 -19
  238. package/dist/{chunks/messages-u2yxkNTE2.mjs → messages-dv19AkyJ.mjs} +28 -17
  239. package/dist/{messages-DJKLtW7u.mjs → messages-hWwSRF-2.mjs} +28 -17
  240. package/dist/{messages-tK67CBqn.mjs → messages-j7o5rT9s.mjs} +28 -17
  241. package/dist/{messages-DqyqEw1_.mjs → messages-nUVjeh7K.mjs} +29 -18
  242. package/dist/{chunks/messages-DSjXen8E.mjs → messages-nlhESX9t.mjs} +28 -17
  243. package/dist/{messages-C30Vz-UZ2.mjs → messages-rk-A1Wa42.mjs} +30 -19
  244. package/dist/{chunks/messages-DR09nkcZ.mjs → messages-xh2eOLvs.mjs} +28 -17
  245. package/dist/{chunks/messages-C11byid72.mjs → messages-ynAe7ewZ.mjs} +28 -17
  246. package/dist/react.mjs +3 -3
  247. package/dist/tools.mjs +3 -3
  248. package/dist/vendor.LICENSE.txt +4609 -212
  249. package/package.json +21 -3
  250. package/src/components/blocks.ts +26 -1
  251. package/src/components/constants/data-attributes.ts +0 -2
  252. package/src/components/i18n/locales/am/messages.json +28 -17
  253. package/src/components/i18n/locales/ar/messages.json +28 -17
  254. package/src/components/i18n/locales/az/messages.json +28 -17
  255. package/src/components/i18n/locales/bg/messages.json +28 -17
  256. package/src/components/i18n/locales/bn/messages.json +28 -17
  257. package/src/components/i18n/locales/bs/messages.json +30 -19
  258. package/src/components/i18n/locales/cs/messages.json +32 -21
  259. package/src/components/i18n/locales/da/messages.json +35 -24
  260. package/src/components/i18n/locales/de/messages.json +33 -22
  261. package/src/components/i18n/locales/dv/messages.json +28 -17
  262. package/src/components/i18n/locales/el/messages.json +28 -17
  263. package/src/components/i18n/locales/en/messages.json +28 -17
  264. package/src/components/i18n/locales/es/messages.json +29 -18
  265. package/src/components/i18n/locales/et/messages.json +32 -21
  266. package/src/components/i18n/locales/fa/messages.json +28 -17
  267. package/src/components/i18n/locales/fi/messages.json +28 -17
  268. package/src/components/i18n/locales/fil/messages.json +51 -40
  269. package/src/components/i18n/locales/fr/messages.json +29 -18
  270. package/src/components/i18n/locales/gu/messages.json +28 -17
  271. package/src/components/i18n/locales/he/messages.json +28 -17
  272. package/src/components/i18n/locales/hi/messages.json +28 -17
  273. package/src/components/i18n/locales/hr/messages.json +30 -19
  274. package/src/components/i18n/locales/hu/messages.json +29 -18
  275. package/src/components/i18n/locales/hy/messages.json +28 -17
  276. package/src/components/i18n/locales/id/messages.json +28 -17
  277. package/src/components/i18n/locales/it/messages.json +29 -18
  278. package/src/components/i18n/locales/ja/messages.json +28 -17
  279. package/src/components/i18n/locales/ka/messages.json +28 -17
  280. package/src/components/i18n/locales/km/messages.json +28 -17
  281. package/src/components/i18n/locales/kn/messages.json +28 -17
  282. package/src/components/i18n/locales/ko/messages.json +28 -17
  283. package/src/components/i18n/locales/ku/messages.json +28 -17
  284. package/src/components/i18n/locales/lo/messages.json +28 -17
  285. package/src/components/i18n/locales/lt/messages.json +28 -17
  286. package/src/components/i18n/locales/lv/messages.json +28 -17
  287. package/src/components/i18n/locales/mk/messages.json +28 -17
  288. package/src/components/i18n/locales/ml/messages.json +28 -17
  289. package/src/components/i18n/locales/mn/messages.json +28 -17
  290. package/src/components/i18n/locales/mr/messages.json +28 -17
  291. package/src/components/i18n/locales/ms/messages.json +30 -19
  292. package/src/components/i18n/locales/my/messages.json +28 -17
  293. package/src/components/i18n/locales/ne/messages.json +28 -17
  294. package/src/components/i18n/locales/nl/messages.json +30 -19
  295. package/src/components/i18n/locales/no/messages.json +31 -20
  296. package/src/components/i18n/locales/pa/messages.json +28 -17
  297. package/src/components/i18n/locales/pl/messages.json +29 -18
  298. package/src/components/i18n/locales/ps/messages.json +28 -17
  299. package/src/components/i18n/locales/pt/messages.json +29 -18
  300. package/src/components/i18n/locales/ro/messages.json +29 -18
  301. package/src/components/i18n/locales/ru/messages.json +28 -17
  302. package/src/components/i18n/locales/sd/messages.json +28 -17
  303. package/src/components/i18n/locales/si/messages.json +28 -17
  304. package/src/components/i18n/locales/sk/messages.json +30 -19
  305. package/src/components/i18n/locales/sl/messages.json +30 -19
  306. package/src/components/i18n/locales/sq/messages.json +29 -18
  307. package/src/components/i18n/locales/sr/messages.json +28 -17
  308. package/src/components/i18n/locales/sv/messages.json +30 -19
  309. package/src/components/i18n/locales/sw/messages.json +28 -17
  310. package/src/components/i18n/locales/ta/messages.json +28 -17
  311. package/src/components/i18n/locales/te/messages.json +28 -17
  312. package/src/components/i18n/locales/th/messages.json +28 -17
  313. package/src/components/i18n/locales/tr/messages.json +28 -17
  314. package/src/components/i18n/locales/ug/messages.json +28 -17
  315. package/src/components/i18n/locales/uk/messages.json +28 -17
  316. package/src/components/i18n/locales/ur/messages.json +28 -17
  317. package/src/components/i18n/locales/vi/messages.json +28 -17
  318. package/src/components/i18n/locales/yi/messages.json +28 -17
  319. package/src/components/i18n/locales/zh/messages.json +28 -17
  320. package/src/components/icons/index.ts +59 -47
  321. package/src/components/inline-tools/inline-tool-code.ts +399 -0
  322. package/src/components/modules/api/blocks.ts +17 -0
  323. package/src/components/modules/api/tools.ts +0 -19
  324. package/src/components/modules/blockEvents/composers/blockSelectionKeys.ts +20 -3
  325. package/src/components/modules/blockEvents/composers/keyboardNavigation.ts +5 -5
  326. package/src/components/modules/blockManager/blockManager.ts +0 -11
  327. package/src/components/modules/blockManager/event-binder.ts +1 -12
  328. package/src/components/modules/paste/handlers/html-handler.ts +13 -10
  329. package/src/components/modules/paste/handlers/index.ts +1 -0
  330. package/src/components/modules/paste/index.ts +6 -0
  331. package/src/components/modules/themeManager.ts +1 -3
  332. package/src/components/modules/toolbar/blockSettings.ts +1 -0
  333. package/src/components/modules/toolbar/inline/index.ts +3 -0
  334. package/src/components/modules/ui.ts +0 -13
  335. package/src/components/modules/uiControllers/controllers/keyboard.ts +0 -29
  336. package/src/components/modules/uiControllers/controllers/selection.ts +2 -14
  337. package/src/components/ui/toolbox.ts +1 -0
  338. package/src/components/utils/popover/popover-position.ts +2 -4
  339. package/src/markdown/index.ts +63 -0
  340. package/src/markdown/markdown-handler.ts +110 -0
  341. package/src/markdown/mdast-to-blocks.ts +418 -0
  342. package/src/markdown/phrasing-to-html.ts +60 -0
  343. package/src/markdown/types.ts +42 -0
  344. package/src/stories/EditorModes.stories.ts +0 -60
  345. package/src/styles/main.css +39 -1140
  346. package/src/tools/callout/emoji-picker/index.ts +3 -2
  347. package/src/tools/callout/index.ts +24 -0
  348. package/src/tools/code/code-keyboard.ts +142 -0
  349. package/src/tools/code/constants.ts +96 -0
  350. package/src/tools/code/dom-builder.ts +181 -0
  351. package/src/tools/code/highlight-applier.ts +229 -0
  352. package/src/tools/code/index.ts +462 -0
  353. package/src/tools/code/katex-loader.ts +50 -0
  354. package/src/tools/code/language-picker.ts +241 -0
  355. package/src/tools/code/mermaid-loader.ts +45 -0
  356. package/src/tools/code/shiki-loader.ts +135 -0
  357. package/src/tools/divider/index.ts +9 -1
  358. package/src/tools/index.ts +4 -2
  359. package/src/tools/list/block-operations.ts +3 -1
  360. package/src/tools/list/depth-validator.ts +4 -7
  361. package/src/tools/list/dom-builder.ts +5 -3
  362. package/src/tools/list/index.ts +21 -3
  363. package/src/tools/list/list-helpers.ts +9 -2
  364. package/src/tools/list/list-keyboard.ts +56 -14
  365. package/src/tools/list/list-lifecycle.ts +3 -1
  366. package/src/tools/list/marker-calculator.ts +37 -0
  367. package/src/tools/list/ordered-marker-manager.ts +4 -2
  368. package/src/tools/table/core/table-commands.ts +16 -0
  369. package/src/tools/table/core/table-controller.ts +29 -0
  370. package/src/tools/table/core/table-events.ts +17 -0
  371. package/src/tools/table/index.ts +196 -13
  372. package/src/tools/table/table-cell-blocks.ts +9 -6
  373. package/src/tools/table/table-cell-clipboard.ts +7 -2
  374. package/src/tools/table/table-cell-placement-picker.ts +133 -0
  375. package/src/tools/table/table-cell-selection.ts +174 -19
  376. package/src/tools/table/table-core.ts +321 -113
  377. package/src/tools/table/table-map.ts +279 -0
  378. package/src/tools/table/table-model.ts +901 -1
  379. package/src/tools/table/table-operations.ts +78 -44
  380. package/src/tools/table/table-resize.ts +19 -17
  381. package/src/tools/table/table-row-col-drag.ts +24 -10
  382. package/src/tools/table/types.ts +24 -2
  383. package/types/api/tools.d.ts +0 -18
  384. package/types/data-attributes.d.ts +0 -1
  385. package/types/index.d.ts +0 -16
  386. package/types/markdown.d.ts +2 -0
  387. package/types/tools/code.d.ts +13 -0
  388. package/src/tools/database/database-backend-sync.ts +0 -101
  389. package/src/tools/database/database-board-view.ts +0 -301
  390. package/src/tools/database/database-card-drag.ts +0 -306
  391. package/src/tools/database/database-card-drawer.ts +0 -546
  392. package/src/tools/database/database-column-controls.ts +0 -46
  393. package/src/tools/database/database-column-drag.ts +0 -262
  394. package/src/tools/database/database-keyboard.ts +0 -35
  395. package/src/tools/database/database-list-row-drag.ts +0 -245
  396. package/src/tools/database/database-list-view.ts +0 -333
  397. package/src/tools/database/database-model.ts +0 -246
  398. package/src/tools/database/database-property-type-popover.ts +0 -108
  399. package/src/tools/database/database-tab-bar.ts +0 -532
  400. package/src/tools/database/database-view-popover.ts +0 -109
  401. package/src/tools/database/database-view-renderer.ts +0 -25
  402. package/src/tools/database/index.ts +0 -948
  403. package/src/tools/database/types.ts +0 -144
  404. package/types/tools/database.d.ts +0 -145
  405. /package/dist/chunks/{am-CHDDMHkd.mjs → am-rVzV1W41.mjs} +0 -0
  406. /package/dist/chunks/{ar-DoqfNqut.mjs → ar-C710lkoH.mjs} +0 -0
  407. /package/dist/chunks/{az-C34P9iEa.mjs → az-BOp1pgua.mjs} +0 -0
  408. /package/dist/chunks/{bg-jroXLY8Y.mjs → bg-CL9p09ZD.mjs} +0 -0
  409. /package/dist/chunks/{bn-BRI-WqxY.mjs → bn-CNmSeyAy.mjs} +0 -0
  410. /package/dist/chunks/{bs-CCGUpNHu.mjs → bs-BRzMGqzk.mjs} +0 -0
  411. /package/dist/chunks/{cs-D5qZOGuc.mjs → cs-BYPBLmnF.mjs} +0 -0
  412. /package/dist/chunks/{da-DrJ7W37K.mjs → da-CBC_LR1c.mjs} +0 -0
  413. /package/dist/chunks/{de-BW6-kp2c.mjs → de-DxRFMoAj.mjs} +0 -0
  414. /package/dist/chunks/{el-C-Vc_Otu.mjs → el-Bk6YbySf.mjs} +0 -0
  415. /package/dist/chunks/{es-B6fI5K9i.mjs → es-DpT3FCMR.mjs} +0 -0
  416. /package/dist/chunks/{et-BhVlZ-Yz.mjs → et-DE9Dr_g9.mjs} +0 -0
  417. /package/dist/chunks/{fa-D55Ijdqa.mjs → fa-Banj1QUE.mjs} +0 -0
  418. /package/dist/chunks/{fi-jNLjhKUQ.mjs → fi-DfN3M5ER.mjs} +0 -0
  419. /package/dist/chunks/{fil-DYd0T5aX.mjs → fil-DbCsRS1d.mjs} +0 -0
  420. /package/dist/chunks/{fr-yxy5xWw_.mjs → fr-D1clKhgt.mjs} +0 -0
  421. /package/dist/chunks/{gu-CcY_LJe7.mjs → gu-1CsZyRwT.mjs} +0 -0
  422. /package/dist/chunks/{he-DL9s7wNw.mjs → he-qQdnL6eK.mjs} +0 -0
  423. /package/dist/chunks/{hi-C8eGXgw5.mjs → hi-DxM0Nff1.mjs} +0 -0
  424. /package/dist/chunks/{hr-DLpybOhU.mjs → hr-Onldyi-u.mjs} +0 -0
  425. /package/dist/chunks/{hu-BkT0gT00.mjs → hu-CAn3pBuY.mjs} +0 -0
  426. /package/dist/chunks/{hy-CVFDCp2S.mjs → hy-D43q7NxE.mjs} +0 -0
  427. /package/dist/chunks/{id-0P4W9Az0.mjs → id-Xrw5Dd0Y.mjs} +0 -0
  428. /package/dist/chunks/{it-mLY6_uoW.mjs → it-CA9ZDMSc.mjs} +0 -0
  429. /package/dist/chunks/{ja-7RkeRNWG.mjs → ja-D0J6WRFh.mjs} +0 -0
  430. /package/dist/chunks/{ka-C7Lx-Qsh.mjs → ka-BZL7xDuY.mjs} +0 -0
  431. /package/dist/chunks/{km-Q8udaraH.mjs → km-BimgQZVU.mjs} +0 -0
  432. /package/dist/chunks/{kn-BiETM-iq.mjs → kn-C2n2cPHK.mjs} +0 -0
  433. /package/dist/chunks/{ko-tiB80pF1.mjs → ko-n4Cn93D3.mjs} +0 -0
  434. /package/dist/chunks/{ku-CY-OABkR.mjs → ku-BYZCgT44.mjs} +0 -0
  435. /package/dist/chunks/{lo-CTBhEnyk.mjs → lo-DVXiAE4N.mjs} +0 -0
  436. /package/dist/chunks/{lt-BHKHEtqK.mjs → lt-B9KlQFnY.mjs} +0 -0
  437. /package/dist/chunks/{lv-DWxgtfUg.mjs → lv-BINeOdyx.mjs} +0 -0
  438. /package/dist/chunks/{mk-BjookGdx.mjs → mk-_-QrPrLN.mjs} +0 -0
  439. /package/dist/chunks/{ml-L-NnZcp9.mjs → ml-KvJSC1KT.mjs} +0 -0
  440. /package/dist/chunks/{mn-OMWi7Hl_.mjs → mn-CjFjWnRG.mjs} +0 -0
  441. /package/dist/chunks/{mr-B6JPzITo.mjs → mr-DqAZ7FRX.mjs} +0 -0
  442. /package/dist/chunks/{ms-CG3S-sPB.mjs → ms-BZcV4UG_.mjs} +0 -0
  443. /package/dist/chunks/{my-BLAmGfhT.mjs → my-97SC9jYN.mjs} +0 -0
  444. /package/dist/chunks/{native-BPcABu9z.mjs → native-CzYG0YgY.mjs} +0 -0
  445. /package/dist/chunks/{ne-D1JHLfYw.mjs → ne-Bs-M2TyF.mjs} +0 -0
  446. /package/dist/chunks/{nl-Ca7Q8FnY.mjs → nl-2ZwQilo-.mjs} +0 -0
  447. /package/dist/chunks/{no-Coxcohcz.mjs → no-fOQTpFq1.mjs} +0 -0
  448. /package/dist/chunks/{pa-CCaXqpaI.mjs → pa-DLOqkMi0.mjs} +0 -0
  449. /package/dist/chunks/{pl-Cl_fAZ84.mjs → pl-FYs9QrXU.mjs} +0 -0
  450. /package/dist/chunks/{ps-WD5qGAWy.mjs → ps-CTXe6pSe.mjs} +0 -0
  451. /package/dist/chunks/{pt-C4zvLfvq.mjs → pt-B1X4x7d1.mjs} +0 -0
  452. /package/dist/chunks/{ro-DbefHcmM.mjs → ro-Bf7S2FaR.mjs} +0 -0
  453. /package/dist/chunks/{ru-uU1J14jd.mjs → ru-B8lqnu_j.mjs} +0 -0
  454. /package/dist/chunks/{sd-DKu368Ip.mjs → sd-CHRYJm2r.mjs} +0 -0
  455. /package/dist/chunks/{si-BsJCiPkZ.mjs → si-CI0Hs6vH.mjs} +0 -0
  456. /package/dist/chunks/{sk-CD-a3SN6.mjs → sk-Bdvq1Kb_.mjs} +0 -0
  457. /package/dist/chunks/{sl-CXhrPJe_.mjs → sl-B_qiFTV5.mjs} +0 -0
  458. /package/dist/chunks/{sq-CTctCoFQ.mjs → sq-E0j1hysP.mjs} +0 -0
  459. /package/dist/chunks/{sr-BZkhBwXj.mjs → sr-VPpVNTZw.mjs} +0 -0
  460. /package/dist/chunks/{sv-NmRZb_xi.mjs → sv-gKmDSR3d.mjs} +0 -0
  461. /package/dist/chunks/{sw-Be5ik3H6.mjs → sw-zeFLiO23.mjs} +0 -0
  462. /package/dist/chunks/{ta-DsXh6neL.mjs → ta-Ci-j89hR.mjs} +0 -0
  463. /package/dist/chunks/{te-CwpCbM8M.mjs → te-qyMI0M7a.mjs} +0 -0
  464. /package/dist/chunks/{th-CcZ15OLk.mjs → th-DPxHtpdb.mjs} +0 -0
  465. /package/dist/chunks/{tr-q3bTgvhW.mjs → tr-CRV6GS-G.mjs} +0 -0
  466. /package/dist/chunks/{tw-DmW6-pCY.mjs → tw-CqxBf-1Y.mjs} +0 -0
  467. /package/dist/chunks/{ug-919EhLsL.mjs → ug-DW0YFpo5.mjs} +0 -0
  468. /package/dist/chunks/{uk-aNMEzd0Y.mjs → uk-ssteuphK.mjs} +0 -0
  469. /package/dist/chunks/{ur-BwQI77sh.mjs → ur-qhY3-jY7.mjs} +0 -0
  470. /package/dist/chunks/{vi-Dxq806-F.mjs → vi-CHriMMC8.mjs} +0 -0
  471. /package/dist/chunks/{zh-BcHuy1Ti.mjs → zh-BJktawVN.mjs} +0 -0
@@ -32,7 +32,10 @@ export interface KeyboardContext {
32
32
  /**
33
33
  * Handle Enter key - split content or exit list
34
34
  */
35
- export const handleEnter = async (context: KeyboardContext): Promise<void> => {
35
+ export const handleEnter = async (
36
+ context: KeyboardContext,
37
+ depthValidator?: ListDepthValidator
38
+ ): Promise<void> => {
36
39
  const { api, blockId, data, element, getContentElement } = context;
37
40
 
38
41
  const selection = window.getSelection();
@@ -45,7 +48,7 @@ export const handleEnter = async (context: KeyboardContext): Promise<void> => {
45
48
 
46
49
  // If current item is empty, handle based on depth
47
50
  if (currentContent === '' || currentContent === '<br>') {
48
- await exitListOrOutdent(context);
51
+ await exitListOrOutdent(context, depthValidator);
49
52
  return;
50
53
  }
51
54
 
@@ -98,13 +101,16 @@ export const handleEnter = async (context: KeyboardContext): Promise<void> => {
98
101
  /**
99
102
  * Exit list or outdent when pressing Enter on empty item
100
103
  */
101
- const exitListOrOutdent = async (context: KeyboardContext): Promise<void> => {
104
+ const exitListOrOutdent = async (
105
+ context: KeyboardContext,
106
+ depthValidator?: ListDepthValidator
107
+ ): Promise<void> => {
102
108
  const { api, blockId, getDepth } = context;
103
109
  const currentDepth = getDepth();
104
110
 
105
111
  // If nested, outdent instead of exiting
106
112
  if (currentDepth > 0) {
107
- await handleOutdent(context);
113
+ await handleOutdent(context, depthValidator);
108
114
  return;
109
115
  }
110
116
 
@@ -193,16 +199,11 @@ export const handleIndent = async(
193
199
  const { api, blockId, data, syncContentFromDOM, getDepth } = context;
194
200
 
195
201
  const currentBlockIndex = api.blocks.getCurrentBlockIndex();
196
- if (currentBlockIndex === 0) return;
197
-
198
- const previousBlock = api.blocks.getBlockByIndex(currentBlockIndex - 1);
199
- if (!previousBlock || previousBlock.name !== TOOL_NAME) return;
200
-
201
202
  const currentDepth = getDepth();
202
- const previousBlockDepth = depthValidator.getBlockDepth(previousBlock);
203
+ const maxAllowedDepth = depthValidator.getMaxAllowedDepth(currentBlockIndex);
203
204
 
204
- // Can only indent to at most one level deeper than the previous item
205
- if (currentDepth > previousBlockDepth) return;
205
+ // Can only indent if current depth is below the maximum
206
+ if (currentDepth >= maxAllowedDepth) return;
206
207
 
207
208
  // Sync current content before updating
208
209
  syncContentFromDOM();
@@ -222,9 +223,45 @@ export const handleIndent = async(
222
223
  };
223
224
 
224
225
  /**
225
- * Handle Shift+Tab key - outdent the list item
226
+ * Reduce depth by 1 for all descendant list items following the given block.
227
+ * Stops at non-list blocks or blocks with depth <= the parent's original depth.
226
228
  */
227
- export const handleOutdent = async(context: KeyboardContext): Promise<void> => {
229
+ const cascadeDepthReduction = async (
230
+ api: API,
231
+ blockId: string | undefined,
232
+ parentOriginalDepth: number,
233
+ depthValidator: ListDepthValidator
234
+ ): Promise<void> => {
235
+ const startIndex = blockId
236
+ ? api.blocks.getBlockIndex(blockId) ?? api.blocks.getCurrentBlockIndex()
237
+ : api.blocks.getCurrentBlockIndex();
238
+ const blocksCount = api.blocks.getBlocksCount();
239
+
240
+ const processDescendant = async (index: number): Promise<void> => {
241
+ if (index >= blocksCount) return;
242
+
243
+ const block = api.blocks.getBlockByIndex(index);
244
+
245
+ if (!block || block.name !== TOOL_NAME) return;
246
+
247
+ const blockDepth = depthValidator.getBlockDepth(block);
248
+
249
+ if (blockDepth <= parentOriginalDepth) return;
250
+
251
+ await api.blocks.update(block.id, { depth: blockDepth - 1 });
252
+ await processDescendant(index + 1);
253
+ };
254
+
255
+ await processDescendant(startIndex + 1);
256
+ };
257
+
258
+ /**
259
+ * Handle Shift+Tab key - outdent the list item and cascade to descendants
260
+ */
261
+ export const handleOutdent = async(
262
+ context: KeyboardContext,
263
+ depthValidator?: ListDepthValidator
264
+ ): Promise<void> => {
228
265
  const { api, blockId, data, syncContentFromDOM, getDepth } = context;
229
266
 
230
267
  const currentDepth = getDepth();
@@ -245,6 +282,11 @@ export const handleOutdent = async(context: KeyboardContext): Promise<void> => {
245
282
  depth: newDepth,
246
283
  });
247
284
 
285
+ // Cascade depth reduction to descendant list items
286
+ if (depthValidator) {
287
+ await cascadeDepthReduction(api, blockId, currentDepth, depthValidator);
288
+ }
289
+
248
290
  // Restore focus to the updated block after DOM has been updated
249
291
  setCaretToBlockContent(api, updatedBlock);
250
292
  };
@@ -16,6 +16,7 @@ export interface RenderContext {
16
16
  placeholder: string;
17
17
  itemColor: string | undefined;
18
18
  itemSize: string | undefined;
19
+ markerDepth?: number;
19
20
  setupItemPlaceholder: (element: HTMLElement) => void;
20
21
  onCheckboxChange: (checked: boolean, content: HTMLElement | null) => void;
21
22
  keydownHandler: ((event: KeyboardEvent) => void) | undefined;
@@ -25,7 +26,7 @@ export interface RenderContext {
25
26
  * Render the list item
26
27
  */
27
28
  export const renderListItem = (context: RenderContext): HTMLElement => {
28
- const { data, readOnly, placeholder, itemColor, itemSize, setupItemPlaceholder, onCheckboxChange, keydownHandler } = context;
29
+ const { data, readOnly, placeholder, itemColor, itemSize, markerDepth, setupItemPlaceholder, onCheckboxChange, keydownHandler } = context;
29
30
 
30
31
  const result = buildListItem({
31
32
  data,
@@ -33,6 +34,7 @@ export const renderListItem = (context: RenderContext): HTMLElement => {
33
34
  placeholder,
34
35
  itemColor,
35
36
  itemSize,
37
+ markerDepth,
36
38
  keydownHandler,
37
39
  });
38
40
 
@@ -191,6 +191,43 @@ export class ListMarkerCalculator {
191
191
  return this.findFirstItemIndex(index - 1, targetDepth, remainingCount - 1, targetStyle);
192
192
  }
193
193
 
194
+ /**
195
+ * Get the base depth of the contiguous list run containing the block at blockIndex.
196
+ * Walks backward until a non-list block or the start of the editor is reached,
197
+ * then returns the depth of the first list item in that run.
198
+ *
199
+ * @param blockIndex - The block index to look up
200
+ * @returns The depth of the first list item in the run
201
+ */
202
+ getGroupBaseDepth(blockIndex: number): number {
203
+ const findFirstListIndex = (index: number): number => {
204
+ if (index <= 0) {
205
+ return 0;
206
+ }
207
+ const prevBlock = this.blocks.getBlockByIndex(index - 1);
208
+ if (!prevBlock || prevBlock.name !== TOOL_NAME) {
209
+ return index;
210
+ }
211
+ return findFirstListIndex(index - 1);
212
+ };
213
+
214
+ const firstListIndex = findFirstListIndex(blockIndex);
215
+ const firstBlock = this.blocks.getBlockByIndex(firstListIndex);
216
+ return this.getBlockDepth(firstBlock);
217
+ }
218
+
219
+ /**
220
+ * Get the visual depth for marker display.
221
+ * Returns the depth relative to the list group's base, clamped to >= 0.
222
+ *
223
+ * @param blockIndex - The block index
224
+ * @param actualDepth - The block's actual depth
225
+ * @returns The visual depth for marker formatting
226
+ */
227
+ getVisualDepth(blockIndex: number, actualDepth: number): number {
228
+ return Math.max(0, actualDepth - this.getGroupBaseDepth(blockIndex));
229
+ }
230
+
194
231
  /**
195
232
  * Get the depth of a block by reading from its DOM.
196
233
  */
@@ -77,7 +77,8 @@ export class OrderedMarkerManager {
77
77
  : startValue;
78
78
 
79
79
  const actualNumber = actualStartValue + siblingIndex;
80
- const markerText = this.markerCalculator.formatNumber(actualNumber, blockDepth);
80
+ const visualDepth = this.markerCalculator.getVisualDepth(blockIndex, blockDepth);
81
+ const markerText = this.markerCalculator.formatNumber(actualNumber, visualDepth);
81
82
 
82
83
  marker.textContent = markerText;
83
84
  }
@@ -241,7 +242,8 @@ export class OrderedMarkerManager {
241
242
  : startValue;
242
243
 
243
244
  const actualNumber = actualStartValue + siblingIndex;
244
- const markerText = this.markerCalculator.formatNumber(actualNumber, blockDepth);
245
+ const visualDepth = this.markerCalculator.getVisualDepth(blockIndex, blockDepth);
246
+ const markerText = this.markerCalculator.formatNumber(actualNumber, visualDepth);
245
247
 
246
248
  marker.textContent = markerText;
247
249
  }
@@ -77,6 +77,20 @@ export interface SetColWidthsCommand {
77
77
  readonly widths: readonly number[] | undefined;
78
78
  }
79
79
 
80
+ export interface MergeCellsCommand {
81
+ readonly type: 'merge-cells';
82
+ readonly minRow: number;
83
+ readonly maxRow: number;
84
+ readonly minCol: number;
85
+ readonly maxCol: number;
86
+ }
87
+
88
+ export interface SplitCellCommand {
89
+ readonly type: 'split-cell';
90
+ readonly row: number;
91
+ readonly col: number;
92
+ }
93
+
80
94
  export interface ReplaceAllCommand {
81
95
  readonly type: 'replace-all';
82
96
  readonly data: TableData;
@@ -96,4 +110,6 @@ export type TableCommand =
96
110
  | RemoveBlockFromCellCommand
97
111
  | SetCellBlocksCommand
98
112
  | SetColWidthsCommand
113
+ | MergeCellsCommand
114
+ | SplitCellCommand
99
115
  | ReplaceAllCommand;
@@ -83,6 +83,12 @@ export class TableController {
83
83
  case 'set-col-widths':
84
84
  return this.handleSetColWidths(command.widths ? [...command.widths] : undefined);
85
85
 
86
+ case 'merge-cells':
87
+ return this.handleMergeCells(command.minRow, command.maxRow, command.minCol, command.maxCol);
88
+
89
+ case 'split-cell':
90
+ return this.handleSplitCell(command.row, command.col);
91
+
86
92
  case 'replace-all':
87
93
  return this.handleReplaceAll(command.data);
88
94
  }
@@ -223,6 +229,29 @@ export class TableController {
223
229
  };
224
230
  }
225
231
 
232
+ private handleMergeCells(minRow: number, maxRow: number, minCol: number, maxCol: number): TableDomainEvent {
233
+ const result = this.model.mergeCells({ minRow, maxRow, minCol, maxCol });
234
+
235
+ return {
236
+ type: 'cells-merged',
237
+ minRow,
238
+ maxRow,
239
+ minCol,
240
+ maxCol,
241
+ blocksToRelocate: result.blocksToRelocate,
242
+ };
243
+ }
244
+
245
+ private handleSplitCell(row: number, col: number): TableDomainEvent {
246
+ this.model.splitCell(row, col);
247
+
248
+ return {
249
+ type: 'cell-split',
250
+ row,
251
+ col,
252
+ };
253
+ }
254
+
226
255
  private handleReplaceAll(data: TableData): TableDomainEvent {
227
256
  this.model.replaceAll(data);
228
257
 
@@ -81,6 +81,21 @@ export interface ColWidthsChangedEvent {
81
81
  readonly widths: readonly number[] | undefined;
82
82
  }
83
83
 
84
+ export interface CellsMergedEvent {
85
+ readonly type: 'cells-merged';
86
+ readonly minRow: number;
87
+ readonly maxRow: number;
88
+ readonly minCol: number;
89
+ readonly maxCol: number;
90
+ readonly blocksToRelocate: readonly string[];
91
+ }
92
+
93
+ export interface CellSplitEvent {
94
+ readonly type: 'cell-split';
95
+ readonly row: number;
96
+ readonly col: number;
97
+ }
98
+
84
99
  export interface ModelReplacedEvent {
85
100
  readonly type: 'model-replaced';
86
101
  }
@@ -99,4 +114,6 @@ export type TableDomainEvent =
99
114
  | BlockRemovedFromCellEvent
100
115
  | CellBlocksSetEvent
101
116
  | ColWidthsChangedEvent
117
+ | CellsMergedEvent
118
+ | CellSplitEvent
102
119
  | ModelReplacedEvent;
@@ -25,9 +25,10 @@ import {
25
25
  } from './table-cell-clipboard';
26
26
  import type { CellColorMode } from './table-cell-color-picker';
27
27
  import { TableCellSelection } from './table-cell-selection';
28
- import { TableGrid, ROW_ATTR, CELL_ATTR } from './table-core';
28
+ import { TableGrid, ROW_ATTR, CELL_ATTR, CELL_ROW_ATTR, CELL_COL_ATTR } from './table-core';
29
29
  import {
30
30
  applyCellColors,
31
+ applyCellPlacements,
31
32
  applyPixelWidths,
32
33
  computeHalfAvgWidth,
33
34
  computeInitialColWidth,
@@ -54,7 +55,7 @@ import { TableRowColControls } from './table-row-col-controls';
54
55
  import type { RowColAction } from './table-row-col-controls';
55
56
  import { registerAdditionalRestrictedTools } from './table-restrictions';
56
57
  import { TableScrollHaze } from './table-scroll-haze';
57
- import type { ClipboardBlockData, LegacyCellContent, TableCellsClipboard, TableData, TableConfig } from './types';
58
+ import type { CellPlacement, ClipboardBlockData, LegacyCellContent, TableCellsClipboard, TableData, TableConfig } from './types';
58
59
 
59
60
  const DEFAULT_ROWS = 3;
60
61
  const DEFAULT_COLS = 3;
@@ -200,6 +201,120 @@ export class Table implements BlockTool {
200
201
  this.scrollHaze = null;
201
202
  }
202
203
 
204
+ /**
205
+ * Rebuild the <tbody> from the current model state.
206
+ * Generates a new table via createGridFromModel (with correct colspan/rowspan),
207
+ * transplants existing block holders into the new cells, and swaps the tbody.
208
+ */
209
+ private rebuildTableBody(): void {
210
+ const gridEl = this.gridElement;
211
+
212
+ if (!gridEl) {
213
+ return;
214
+ }
215
+
216
+ const oldTbody = gridEl.querySelector('tbody');
217
+
218
+ if (!oldTbody) {
219
+ return;
220
+ }
221
+
222
+ // Collect all existing block holders by ID before replacing tbody
223
+ const blockHolders = new Map<string, HTMLElement>();
224
+
225
+ oldTbody.querySelectorAll('[data-blok-id]').forEach(el => {
226
+ const id = el.getAttribute('data-blok-id');
227
+
228
+ if (id) {
229
+ blockHolders.set(id, el as HTMLElement);
230
+ }
231
+ });
232
+
233
+ // Build new table from model (has correct colspan/rowspan structure)
234
+ const newTable = this.grid.createGridFromModel(this.model);
235
+ const newTbody = newTable.querySelector('tbody');
236
+
237
+ if (!newTbody) {
238
+ return;
239
+ }
240
+
241
+ // Move block holders from old cells to new cells
242
+ const content = this.model.snapshot().content;
243
+
244
+ this.mountBlockHoldersInNewTbody(content, newTbody, blockHolders);
245
+
246
+ // Replace old tbody with new
247
+ oldTbody.replaceWith(newTbody);
248
+ }
249
+
250
+ /**
251
+ * Mount block holders into the new tbody cells based on model content.
252
+ * Extracted to keep rebuildTableBody under nesting depth limit.
253
+ */
254
+ private mountBlockHoldersInNewTbody(
255
+ content: TableData['content'],
256
+ newTbody: Element,
257
+ blockHolders: Map<string, HTMLElement>
258
+ ): void {
259
+ content.forEach((rowData, r) => {
260
+ rowData.forEach((cellContent, c) => {
261
+ if (typeof cellContent === 'string') {
262
+ return;
263
+ }
264
+
265
+ if (cellContent.mergedInto) {
266
+ return;
267
+ }
268
+
269
+ const newCell = newTbody.querySelector(
270
+ `[${CELL_ROW_ATTR}="${r}"][${CELL_COL_ATTR}="${c}"]`
271
+ );
272
+
273
+ if (!newCell) {
274
+ return;
275
+ }
276
+
277
+ const container = newCell.querySelector(`[${CELL_BLOCKS_ATTR}]`);
278
+
279
+ if (!container) {
280
+ return;
281
+ }
282
+
283
+ cellContent.blocks.forEach(blockId => {
284
+ const holder = blockHolders.get(blockId);
285
+
286
+ if (holder) {
287
+ container.appendChild(holder);
288
+ }
289
+ });
290
+ });
291
+ });
292
+ }
293
+
294
+ /**
295
+ * Check if the model's content contains any merged cells.
296
+ */
297
+ private modelHasMerges(): boolean {
298
+ const snapshot = this.model.snapshot();
299
+
300
+ return snapshot.content.some(row =>
301
+ row.some(cell =>
302
+ typeof cell !== 'string' && ((cell.colspan ?? 1) > 1 || (cell.rowspan ?? 1) > 1)
303
+ )
304
+ );
305
+ }
306
+
307
+ /**
308
+ * Create a flat grid (no merge handling) using createGrid.
309
+ * Extracted from render() to keep it readable.
310
+ */
311
+ private createFlatGrid(): HTMLTableElement {
312
+ const rows = this.initialContent?.length || this.config.rows || DEFAULT_ROWS;
313
+ const cols = this.initialContent?.reduce((max, row) => Math.max(max, row?.length ?? 0), 0) || this.config.cols || DEFAULT_COLS;
314
+
315
+ return this.grid.createGrid(rows, cols, this.model.colWidths);
316
+ }
317
+
203
318
  /**
204
319
  * Initialize all visual subsystems on a grid element.
205
320
  * Shared by rendered(), setData(), and onPaste() to ensure consistent
@@ -234,7 +349,7 @@ export class Table implements BlockTool {
234
349
 
235
350
  public static get pasteConfig(): PasteConfig {
236
351
  return {
237
- tags: ['TABLE', 'TR', 'TH', 'TD'],
352
+ tags: ['TABLE', 'TR', { TH: { style: true } }, { TD: { style: true } }],
238
353
  };
239
354
  }
240
355
 
@@ -260,7 +375,7 @@ export class Table implements BlockTool {
260
375
 
261
376
  return style.length > 0 ? { style: true } : {};
262
377
  },
263
- a: { href: true },
378
+ a: { href: true, target: '_blank', rel: 'nofollow' },
264
379
  input: { type: true, checked: true },
265
380
  },
266
381
  };
@@ -309,12 +424,14 @@ export class Table implements BlockTool {
309
424
 
310
425
  this.isNewTable = (this.initialContent?.length ?? 0) === 0;
311
426
 
312
- const rows = this.initialContent?.length || this.config.rows || DEFAULT_ROWS;
313
- const cols = this.initialContent?.reduce((max, row) => Math.max(max, row?.length ?? 0), 0) || this.config.cols || DEFAULT_COLS;
427
+ const hasContent = (this.initialContent?.length ?? 0) > 0;
428
+ const hasMerges = hasContent && this.modelHasMerges();
314
429
 
315
- const gridEl = this.grid.createGrid(rows, cols, this.model.colWidths);
430
+ const gridEl = hasMerges
431
+ ? this.grid.createGridFromModel(this.model)
432
+ : this.createFlatGrid();
316
433
 
317
- if ((this.initialContent?.length ?? 0) > 0) {
434
+ if (hasContent && !hasMerges) {
318
435
  this.grid.fillGrid(gridEl, this.initialContent ?? []);
319
436
  }
320
437
 
@@ -388,7 +505,9 @@ export class Table implements BlockTool {
388
505
 
389
506
  if (this.readOnly) {
390
507
  mountCellBlocksReadOnly(gridEl, content, this.api, this.blockId ?? '');
391
- applyCellColors(gridEl, this.model.snapshot().content);
508
+ const snap = this.model.snapshot();
509
+ applyCellColors(gridEl, snap.content);
510
+ applyCellPlacements(gridEl, snap.content);
392
511
  this.initScrollHaze();
393
512
 
394
513
  return;
@@ -430,7 +549,9 @@ export class Table implements BlockTool {
430
549
  }
431
550
 
432
551
  this.initSubsystems(gridEl);
433
- applyCellColors(gridEl, this.model.snapshot().content);
552
+ const snapInit = this.model.snapshot();
553
+ applyCellColors(gridEl, snapInit.content);
554
+ applyCellPlacements(gridEl, snapInit.content);
434
555
 
435
556
  if (this.isNewTable) {
436
557
  this.cellSelection?.selectRange({ minRow: 0, maxRow: 0, minCol: 0, maxCol: 0 });
@@ -541,7 +662,9 @@ export class Table implements BlockTool {
541
662
  }
542
663
 
543
664
  if (this.readOnly) {
544
- applyCellColors(gridEl, this.model.snapshot().content);
665
+ const snapRO = this.model.snapshot();
666
+ applyCellColors(gridEl, snapRO.content);
667
+ applyCellPlacements(gridEl, snapRO.content);
545
668
 
546
669
  return;
547
670
  }
@@ -602,7 +725,9 @@ export class Table implements BlockTool {
602
725
  this.rowColControls.restoreVisibleGrips(savedGripIndices.col, savedGripIndices.row);
603
726
  }
604
727
 
605
- applyCellColors(gridEl, this.model.snapshot().content);
728
+ const snapSet = this.model.snapshot();
729
+ applyCellColors(gridEl, snapSet.content);
730
+ applyCellPlacements(gridEl, snapSet.content);
606
731
  }
607
732
 
608
733
  public onPaste(event: HTMLPasteEvent): void {
@@ -695,7 +820,9 @@ export class Table implements BlockTool {
695
820
  }, true);
696
821
 
697
822
  this.initSubsystems(gridEl);
698
- applyCellColors(gridEl, this.model.snapshot().content);
823
+ const snapPaste = this.model.snapshot();
824
+ applyCellColors(gridEl, snapPaste.content);
825
+ applyCellPlacements(gridEl, snapPaste.content);
699
826
  }
700
827
  }
701
828
 
@@ -1183,6 +1310,38 @@ export class Table implements BlockTool {
1183
1310
  });
1184
1311
  }
1185
1312
 
1313
+ private handleCellPlacementChange(cells: HTMLElement[], placement: CellPlacement): void {
1314
+ const gridEl = this.gridElement;
1315
+
1316
+ if (!gridEl) {
1317
+ return;
1318
+ }
1319
+
1320
+ this.runTransactedStructuralOp(() => {
1321
+ for (const cell of cells) {
1322
+ const coord = getCellPosition(gridEl, cell);
1323
+
1324
+ if (!coord) {
1325
+ continue;
1326
+ }
1327
+
1328
+ this.model.setCellPlacement(coord.row, coord.col, placement === 'top-left' ? undefined : placement);
1329
+
1330
+ const blocksContainer = cell.querySelector<HTMLElement>(`[${CELL_BLOCKS_ATTR}]`);
1331
+
1332
+ if (!blocksContainer) {
1333
+ continue;
1334
+ }
1335
+
1336
+ if (placement === 'top-left') {
1337
+ blocksContainer.removeAttribute('data-blok-cell-placement');
1338
+ } else {
1339
+ blocksContainer.setAttribute('data-blok-cell-placement', placement);
1340
+ }
1341
+ }
1342
+ });
1343
+ }
1344
+
1186
1345
  private collectCellBlockData(
1187
1346
  cells: HTMLElement[],
1188
1347
  ): Array<{ row: number; col: number; blocks: ClipboardBlockData[]; color?: string; textColor?: string }> {
@@ -1333,6 +1492,30 @@ export class Table implements BlockTool {
1333
1492
  onColorChange: (cells, color, mode) => {
1334
1493
  this.handleCellColorChange(cells, color, mode);
1335
1494
  },
1495
+ onPlacementChange: (cells, placement) => {
1496
+ this.handleCellPlacementChange(cells, placement);
1497
+ },
1498
+ getCellPlacement: (row, col) => {
1499
+ return this.model.getCellPlacement(row, col);
1500
+ },
1501
+ canMergeCells: (range) => {
1502
+ return this.model.canMergeCells(range);
1503
+ },
1504
+ onMergeCells: (range) => {
1505
+ this.runTransactedStructuralOp(() => {
1506
+ this.model.mergeCells(range);
1507
+ this.rebuildTableBody();
1508
+ });
1509
+ },
1510
+ isMergedCell: (row, col) => {
1511
+ return this.model.isMergedCell(row, col);
1512
+ },
1513
+ onSplitCell: (row, col) => {
1514
+ this.runTransactedStructuralOp(() => {
1515
+ this.model.splitCell(row, col);
1516
+ this.rebuildTableBody();
1517
+ });
1518
+ },
1336
1519
  });
1337
1520
  }
1338
1521
 
@@ -1,6 +1,6 @@
1
1
  import type { API } from '../../../types';
2
2
 
3
- import { CELL_ATTR, ROW_ATTR } from './table-core';
3
+ import { CELL_ATTR, ROW_ATTR, CELL_COL_ATTR } from './table-core';
4
4
  import type { TableModel } from './table-model';
5
5
  import type { LegacyCellContent, CellContent } from './types';
6
6
  import { isCellWithBlocks } from './types';
@@ -330,6 +330,12 @@ export class TableCellBlocks {
330
330
  * Get the number of columns in the table (based on first row)
331
331
  */
332
332
  private getColumnCount(): number {
333
+ const colgroup = this.gridElement.querySelector('colgroup');
334
+
335
+ if (colgroup) {
336
+ return colgroup.querySelectorAll('col').length;
337
+ }
338
+
333
339
  const firstRow = this.gridElement.querySelector('[data-blok-table-row]');
334
340
 
335
341
  return firstRow?.querySelectorAll('[data-blok-table-cell]').length ?? 0;
@@ -346,9 +352,7 @@ export class TableCellBlocks {
346
352
  return null;
347
353
  }
348
354
 
349
- const cells = rowEl.querySelectorAll('[data-blok-table-cell]');
350
-
351
- return (cells[col] as HTMLElement | undefined) ?? null;
355
+ return rowEl.querySelector<HTMLElement>(`[${CELL_COL_ATTR}="${col}"]`) ?? null;
352
356
  }
353
357
 
354
358
  /**
@@ -368,11 +372,10 @@ export class TableCellBlocks {
368
372
  return;
369
373
  }
370
374
 
371
- const cells = row.querySelectorAll(`[${CELL_ATTR}]`);
372
375
  const normalizedRow: CellContent[] = [];
373
376
 
374
377
  rowData.forEach((cellContent, colIndex) => {
375
- const cell = cells[colIndex] as HTMLElement | undefined;
378
+ const cell = row.querySelector<HTMLElement>(`[${CELL_COL_ATTR}="${colIndex}"]`);
376
379
 
377
380
  if (!cell) {
378
381
  return;
@@ -1,5 +1,5 @@
1
1
  import type { SanitizerConfig } from '../../../types/configs/sanitizer-config';
2
- import type { ClipboardBlockData, TableCellsClipboard } from './types';
2
+ import type { CellPlacement, ClipboardBlockData, TableCellsClipboard } from './types';
3
3
  import { mapToNearestPresetColor } from '../../components/utils/color-mapping';
4
4
  import { clean } from '../../components/utils/sanitizer';
5
5
 
@@ -33,6 +33,7 @@ interface CellEntry {
33
33
  blocks: ClipboardBlockData[];
34
34
  color?: string;
35
35
  textColor?: string;
36
+ placement?: CellPlacement;
36
37
  }
37
38
 
38
39
  /**
@@ -73,6 +74,10 @@ export function serializeCellsToClipboard(entries: CellEntry[]): TableCellsClipb
73
74
  if (entry.textColor !== undefined) {
74
75
  cells[r][c].textColor = entry.textColor;
75
76
  }
77
+
78
+ if (entry.placement !== undefined) {
79
+ cells[r][c].placement = entry.placement;
80
+ }
76
81
  }
77
82
 
78
83
  return { rows, cols, cells };
@@ -185,7 +190,7 @@ const CELL_SANITIZE_CONFIG: SanitizerConfig = {
185
190
  i: true,
186
191
  em: true,
187
192
  br: true,
188
- a: { href: true },
193
+ a: { href: true, target: '_blank', rel: 'nofollow' },
189
194
  mark: (node: Element): { [attr: string]: boolean | string } => {
190
195
  const el = node as HTMLElement;
191
196
  const style = el.style;