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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (409) hide show
  1. package/codemod/migrate-editorjs-to-blok.js +0 -2
  2. package/codemod/test.js +0 -6
  3. package/dist/blok.mjs +2 -2
  4. package/dist/chunks/_basePickBy-BHRNO12X.mjs +410 -0
  5. package/dist/chunks/_baseUniq-DtFPDBML.mjs +1045 -0
  6. package/dist/chunks/_getTag-ozrhqxk_.mjs +26 -0
  7. package/dist/chunks/arc-BEqJP9HX.mjs +80 -0
  8. package/dist/chunks/architecture-YZFGNWBL-Bcu-90pi.mjs +3 -0
  9. package/dist/chunks/architectureDiagram-Q4EWVU46-BMno5LCn.mjs +4066 -0
  10. package/dist/chunks/array-Cyf-61SV.mjs +6 -0
  11. package/dist/chunks/blockDiagram-DXYQGD6D-DlP_cPth.mjs +3259 -0
  12. package/dist/chunks/{blok-BdlR_lX6.mjs → blok-CiLRmoHI.mjs} +850 -855
  13. package/dist/chunks/c4Diagram-AHTNJAMY-BbVV8EXj.mjs +2956 -0
  14. package/dist/chunks/channel-DPcniO2B.mjs +5 -0
  15. package/dist/chunks/chunk-2KRD3SAO-CazES4VS.mjs +20 -0
  16. package/dist/chunks/chunk-336JU56O-heO72r_k.mjs +49 -0
  17. package/dist/chunks/chunk-426QAEUC-CmCcml1z.mjs +13 -0
  18. package/dist/chunks/chunk-4BX2VUAB-B10DxOza.mjs +19 -0
  19. package/dist/chunks/chunk-4TB4RGXK-B0snhZOU.mjs +3250 -0
  20. package/dist/chunks/chunk-55IACEB6-CGkn5ABd.mjs +8 -0
  21. package/dist/chunks/chunk-5FUZZQ4R-USdumo_u.mjs +3786 -0
  22. package/dist/chunks/chunk-5PVQY5BW-CxUGVzQL.mjs +1692 -0
  23. package/dist/chunks/chunk-67CJDMHE-Bvw55oRa.mjs +20 -0
  24. package/dist/chunks/chunk-7N4EOEYR-Bs2qDy88.mjs +29 -0
  25. package/dist/chunks/chunk-AA7GKIK3-Bss0LgrN.mjs +24 -0
  26. package/dist/chunks/chunk-BSJP7CBP-CpUW7gi5.mjs +83 -0
  27. package/dist/chunks/chunk-CIAEETIT-DlRbLLf3.mjs +20 -0
  28. package/dist/chunks/{chunk-Byubey_H.mjs → chunk-D6kmoKXy.mjs} +5 -5
  29. package/dist/chunks/chunk-EDXVE4YY-DEcX4XWm.mjs +26 -0
  30. package/dist/chunks/chunk-ENJZ2VHE-B4THRZkR.mjs +566 -0
  31. package/dist/chunks/chunk-FMBD7UC4-CF6BKEiV.mjs +5 -0
  32. package/dist/chunks/chunk-FOC6F5B3--xuza7Yn.mjs +20 -0
  33. package/dist/chunks/chunk-ICPOFSXX-BMja8cuy.mjs +3290 -0
  34. package/dist/chunks/chunk-K5T4RW27-CHEqGHFS.mjs +16370 -0
  35. package/dist/chunks/chunk-KGLVRYIC-DHYYpR8v.mjs +20 -0
  36. package/dist/chunks/chunk-LIHQZDEY-AvbOvyLE.mjs +55 -0
  37. package/dist/chunks/chunk-ORNJ4GCN-38fbR5OS.mjs +25 -0
  38. package/dist/chunks/chunk-OYMX7WX6-BiqlATPA.mjs +2038 -0
  39. package/dist/chunks/chunk-QZHKN3VN-DitZIvj8.mjs +12 -0
  40. package/dist/chunks/chunk-U2HBQHQK-DJytnHmZ.mjs +1875 -0
  41. package/dist/chunks/chunk-X2U36JSP-DlOifw1K.mjs +68 -0
  42. package/dist/chunks/chunk-XPW4576I-s4fsi4XO.mjs +1146 -0
  43. package/dist/chunks/chunk-YZCP3GAM-Ch258bXC.mjs +60 -0
  44. package/dist/chunks/chunk-ZZ45TVLE-DWziaKxP.mjs +33 -0
  45. package/dist/chunks/classDiagram-6PBFFD2Q-BOkAe08u.mjs +30 -0
  46. package/dist/chunks/classDiagram-v2-HSJHXN6E-DeKatSvh.mjs +30 -0
  47. package/dist/chunks/clone-CJCz7VRp.mjs +8 -0
  48. package/dist/chunks/{constants-Cp8O0UfP.mjs → constants-DFS8l39Y.mjs} +49 -50
  49. package/dist/chunks/cose-bilkent-S5V4N54A-CzLGVqvr.mjs +2246 -0
  50. package/dist/chunks/cytoscape.esm-D0iglm-M.mjs +18108 -0
  51. package/dist/chunks/dagre-KV5264BT-XbHSjleO.mjs +298 -0
  52. package/dist/chunks/dagre-XY8CZ1sg.mjs +1536 -0
  53. package/dist/chunks/defaultLocale-DFhS1600.mjs +201 -0
  54. package/dist/chunks/diagram-5BDNPKRD-CM7c3UTI.mjs +112 -0
  55. package/dist/chunks/diagram-G4DWMVQ6-Bhg4ps6b.mjs +546 -0
  56. package/dist/chunks/diagram-MMDJMWI5-C-UCVaxB.mjs +234 -0
  57. package/dist/chunks/diagram-TYMM5635-BOHSujSD.mjs +144 -0
  58. package/dist/chunks/dist-DHsXIYdd.mjs +59 -0
  59. package/dist/chunks/erDiagram-SMLLAGMA-CwKxXFMB.mjs +1712 -0
  60. package/dist/chunks/flowDiagram-DWJPFMVM-rQJKfyuO.mjs +4175 -0
  61. package/dist/chunks/ganttDiagram-T4ZO3ILL-DfaZirLX.mjs +3083 -0
  62. package/dist/chunks/gitGraph-7Q5UKJZL-BKG8cHGz.mjs +3 -0
  63. package/dist/chunks/gitGraphDiagram-UUTBAWPF-CRa-ymsI.mjs +792 -0
  64. package/dist/chunks/graphlib-CuDElSdG.mjs +223 -0
  65. package/dist/chunks/{i18next-loader-oDO9ZKUV.mjs → i18next-loader-CasQQb5s.mjs} +2 -2
  66. package/dist/chunks/info-OMHHGYJF-FKqYyUn9.mjs +3 -0
  67. package/dist/chunks/infoDiagram-42DDH7IO-CvyJU2nE.mjs +29 -0
  68. package/dist/chunks/init-JlKGZtuT.mjs +15 -0
  69. package/dist/chunks/ishikawaDiagram-UXIWVN3A-CIpbw1BK.mjs +719 -0
  70. package/dist/chunks/journeyDiagram-VCZTEJTY-H96UcUK9.mjs +885 -0
  71. package/dist/chunks/kanban-definition-6JOO6SKY-BYZT3srA.mjs +980 -0
  72. package/dist/chunks/{katex-NjLaA6AJ.mjs → katex-JyOgX6MW.mjs} +1 -1
  73. package/dist/chunks/{lightweight-i18n-DTySD6f6.mjs → lightweight-i18n-Cvv8CWh4.mjs} +13 -0
  74. package/dist/chunks/line-B9xUUA7k.mjs +34 -0
  75. package/dist/chunks/linear-Dj-1yA_B.mjs +289 -0
  76. package/dist/chunks/mermaid-parser.core-D6OPAUtM.mjs +57 -0
  77. package/dist/chunks/mermaid.core-BPN9ZHKQ.mjs +989 -0
  78. package/dist/{messages-B4lhNMKm2.mjs → chunks/messages--YKhFEDE.mjs} +28 -3
  79. package/dist/chunks/{messages-CF_PfacZ.mjs → messages-0Uwu1AMJ2.mjs} +26 -1
  80. package/dist/{messages-Bug6Du35.mjs → chunks/messages-1__0Ph4Q.mjs} +26 -1
  81. package/dist/chunks/{messages-CnQydQJd2.mjs → messages-4sm9Pb0C.mjs} +26 -1
  82. package/dist/chunks/{messages-BDXl53cy2.mjs → messages-4uxjtzKW.mjs} +26 -1
  83. package/dist/{messages-DQN1y6E9.mjs → chunks/messages-B-SwLgkQ.mjs} +28 -3
  84. package/dist/chunks/{messages-BlcRm2I3.mjs → messages-B1ylBxXQ.mjs} +26 -1
  85. package/dist/{messages-12_eyAo-.mjs → chunks/messages-B5m3dhKc.mjs} +26 -1
  86. package/dist/chunks/{messages-D8-N0FmU.mjs → messages-B6n2zDtv.mjs} +27 -2
  87. package/dist/chunks/{messages-BMq9k_lI.mjs → messages-BC9w4zAT.mjs} +26 -1
  88. package/dist/{messages-CsiGzUSP2.mjs → chunks/messages-BOj-7N3p.mjs} +26 -1
  89. package/dist/chunks/{messages-CvlMT1e62.mjs → messages-BRYHTS18.mjs} +26 -1
  90. package/dist/{messages-hrSlVSHp.mjs → chunks/messages-BSBbVjor.mjs} +33 -8
  91. package/dist/{messages-uCsQjz7M.mjs → chunks/messages-BUUkmUGc.mjs} +26 -1
  92. package/dist/chunks/{messages-DopbvJlg.mjs → messages-Bb3YEV2P.mjs} +31 -6
  93. package/dist/{messages-KqWQKmIu2.mjs → chunks/messages-Be_6YLzJ.mjs} +27 -2
  94. package/dist/chunks/{messages-BXn9Vzbx2.mjs → messages-BevRhv5d.mjs} +26 -1
  95. package/dist/chunks/{messages-DQ5ng0_t2.mjs → messages-Bhqr7Im2.mjs} +26 -1
  96. package/dist/{messages-B3Yhiycb2.mjs → chunks/messages-BpJFjSKa.mjs} +27 -2
  97. package/dist/chunks/{messages-BaoJwsEZ.mjs → messages-BqYlq_Bn.mjs} +26 -1
  98. package/dist/chunks/{messages-vN4T4r67.mjs → messages-BtAwCUfD.mjs} +26 -1
  99. package/dist/{messages-Cb3wXGnc.mjs → chunks/messages-Bthbp65G.mjs} +27 -2
  100. package/dist/{messages-x353UCBI.mjs → chunks/messages-BvHMZ8Pi2.mjs} +26 -1
  101. package/dist/{messages-BOE2mzCj2.mjs → chunks/messages-Bw1BE9jW.mjs} +26 -1
  102. package/dist/chunks/{messages-C5aCWL7B.mjs → messages-Bx6Wt285.mjs} +26 -1
  103. package/dist/{messages-C8f1I5EQ2.mjs → chunks/messages-BzslJRYv.mjs} +27 -2
  104. package/dist/chunks/{messages-CZ5Sbf8U.mjs → messages-C02M0Tpw.mjs} +26 -1
  105. package/dist/chunks/{messages-DN-194c32.mjs → messages-C1u3E9qg.mjs} +26 -1
  106. package/dist/chunks/{messages-DdmWzF5M.mjs → messages-C68WgSKk.mjs} +27 -2
  107. package/dist/chunks/{messages-Dgng6KN8.mjs → messages-C8w8JCP0.mjs} +28 -3
  108. package/dist/chunks/{messages-B5fKJXd6.mjs → messages-CFOZdSk4.mjs} +26 -1
  109. package/dist/chunks/{messages-5ArOv8cj.mjs → messages-CGOY79lr.mjs} +26 -1
  110. package/dist/{messages-mipkPgwQ2.mjs → chunks/messages-CGaSMZPu.mjs} +26 -1
  111. package/dist/{messages-Dq_v7slw2.mjs → chunks/messages-CJJgQ0BH.mjs} +26 -1
  112. package/dist/chunks/{messages-DUGEqDEG.mjs → messages-CTD6rtQj2.mjs} +26 -1
  113. package/dist/{messages-DIKCwGog.mjs → chunks/messages-CZymJML9.mjs} +30 -5
  114. package/dist/chunks/{messages-CcyIKgGU.mjs → messages-CfeFJbiv.mjs} +30 -5
  115. package/dist/chunks/{messages-BXSXk3oS2.mjs → messages-Cgatzu_z.mjs} +28 -3
  116. package/dist/{messages-CBPiFbEf2.mjs → chunks/messages-Ch2zBI602.mjs} +26 -1
  117. package/dist/chunks/{messages-yszqJukE.mjs → messages-CiAHsUfO.mjs} +26 -1
  118. package/dist/chunks/{messages-bmwto4UV.mjs → messages-Cuzq-tNW.mjs} +26 -1
  119. package/dist/{messages-JK9Okzsy2.mjs → chunks/messages-Cw4qiMwb.mjs} +26 -1
  120. package/dist/chunks/{messages-DSO2U-ul.mjs → messages-Cyh-mz40.mjs} +26 -1
  121. package/dist/{messages-DbZsJAff.mjs → chunks/messages-D-I2QO8H.mjs} +26 -1
  122. package/dist/chunks/{messages-BhcYsC_M2.mjs → messages-D0D2gruy.mjs} +26 -1
  123. package/dist/{messages-X80Nh0ib.mjs → chunks/messages-D1BKxfLD.mjs} +27 -2
  124. package/dist/chunks/{messages-CjVPwkVy.mjs → messages-D4eDs6R_.mjs} +26 -1
  125. package/dist/{messages-C5Uufygq.mjs → chunks/messages-D9Xr-hES.mjs} +26 -1
  126. package/dist/{messages-DkvQ-6HC2.mjs → chunks/messages-D9eJPHia.mjs} +28 -3
  127. package/dist/chunks/{messages-DRv4g-IA.mjs → messages-DBFWSzKY2.mjs} +26 -1
  128. package/dist/chunks/{messages-SSDr5fGF2.mjs → messages-DC0wu2S7.mjs} +26 -1
  129. package/dist/{messages-Bdk4ocMI.mjs → chunks/messages-DF9o19rG.mjs} +26 -1
  130. package/dist/chunks/{messages-DVKifYlq.mjs → messages-DFS_n986.mjs} +49 -24
  131. package/dist/{messages-CvvbLyTy2.mjs → chunks/messages-DGS4H30T.mjs} +26 -1
  132. package/dist/{messages-PvMdmlxI.mjs → chunks/messages-DKjddpzJ.mjs} +28 -3
  133. package/dist/chunks/{messages-DGD6BiGd.mjs → messages-DMvTdUXC.mjs} +28 -3
  134. package/dist/{messages-CD8K1g_t2.mjs → chunks/messages-DQUX-QYI2.mjs} +26 -1
  135. package/dist/chunks/{messages-CqgEz7C5.mjs → messages-DUigq8FO2.mjs} +26 -1
  136. package/dist/chunks/{messages-ByAqzAhB.mjs → messages-DY0FJdpH.mjs} +26 -1
  137. package/dist/{messages-DACg1XAu.mjs → chunks/messages-DfVXiqt-2.mjs} +26 -1
  138. package/dist/{messages-BYQ769S5.mjs → chunks/messages-DgZc9TJw.mjs} +26 -1
  139. package/dist/{messages-Dj79y02X.mjs → chunks/messages-QD4BCUDP.mjs} +26 -1
  140. package/dist/{messages-BeI2HORe2.mjs → chunks/messages-USmweex9.mjs} +26 -1
  141. package/dist/{messages-CEEzfqMO2.mjs → chunks/messages-a1JTi0Qm.mjs} +29 -4
  142. package/dist/chunks/{messages-Dz3UhEco2.mjs → messages-jcgCHPRn.mjs} +26 -1
  143. package/dist/{messages--cUQf9JX.mjs → chunks/messages-tnnqHpbd.mjs} +27 -2
  144. package/dist/chunks/{messages-DZwCufSb.mjs → messages-vzWKPLJO.mjs} +26 -1
  145. package/dist/chunks/{micromark-extension-math-CCEGWpdz.mjs → micromark-extension-math-Cz_ZZ_0Y.mjs} +1 -1
  146. package/dist/chunks/mindmap-definition-QFDTVHPH-BswFuNN6.mjs +1013 -0
  147. package/dist/chunks/ordinal-D1_lEgAO.mjs +65 -0
  148. package/dist/chunks/packet-4T2RLAQJ-DTUW2U0C.mjs +3 -0
  149. package/dist/chunks/path-6nYPAvNb.mjs +85 -0
  150. package/dist/chunks/pie-ZZUOXDRM-D-umqvEM.mjs +3 -0
  151. package/dist/chunks/pieDiagram-DEJITSTG-1WJgvK1w.mjs +179 -0
  152. package/dist/chunks/quadrantDiagram-34T5L4WZ-B_YH8QGl.mjs +1960 -0
  153. package/dist/chunks/radar-PYXPWWZC-DkQelf08.mjs +3 -0
  154. package/dist/chunks/requirementDiagram-MS252O5E-DRl0YJRI.mjs +2224 -0
  155. package/dist/chunks/rough.esm-CSWJruu5.mjs +1353 -0
  156. package/dist/chunks/sankeyDiagram-XADWPNL6-B-8IrknH.mjs +909 -0
  157. package/dist/chunks/sequenceDiagram-FGHM5R23-DTLb8qmO.mjs +4181 -0
  158. package/dist/chunks/src-CRgEHLPW.mjs +2149 -0
  159. package/dist/chunks/stateDiagram-FHFEXIEX-B0JFjLFy.mjs +218 -0
  160. package/dist/chunks/stateDiagram-v2-QKLJ7IA2-Co9CUU_z.mjs +28 -0
  161. package/dist/chunks/timeline-definition-GMOUNBTQ-CS9KTh-Q.mjs +1084 -0
  162. package/dist/chunks/{tools-DGOsJbHH.mjs → tools-CSYsrnud.mjs} +2116 -1268
  163. package/dist/chunks/treeView-SZITEDCU-DOOoyNP9.mjs +3 -0
  164. package/dist/chunks/treemap-W4RFUUIX-CsOoUA-u.mjs +3 -0
  165. package/dist/chunks/vennDiagram-DHZGUBPP-0BNu5Wna.mjs +1876 -0
  166. package/dist/chunks/wardley-RL74JXVD-CCzZcmEk.mjs +3 -0
  167. package/dist/chunks/wardleyDiagram-NUSXRM2D-Ca9XByNH.mjs +594 -0
  168. package/dist/chunks/xychartDiagram-5P7HB3ND-C8AyKUAE.mjs +2017 -0
  169. package/dist/cli.mjs +1 -1
  170. package/dist/full.mjs +3 -3
  171. package/dist/locales.mjs +80 -67
  172. package/dist/markdown.mjs +2 -2
  173. package/dist/{chunks/messages-9l49jauY.mjs → messages-5jvKxQNu2.mjs} +26 -1
  174. package/dist/{messages-CkySRhtd2.mjs → messages-7QD-X6XT2.mjs} +26 -1
  175. package/dist/{chunks/messages-Btr121zI2.mjs → messages-96iaAUds2.mjs} +27 -2
  176. package/dist/{chunks/messages-BAP2OAQk.mjs → messages-B19o-Teb.mjs} +28 -3
  177. package/dist/{messages-DJU4YLij.mjs → messages-B1ZUQagA.mjs} +26 -1
  178. package/dist/{messages-Dg2CDXZi2.mjs → messages-B7ieAJBd2.mjs} +26 -1
  179. package/dist/{messages-CByBLxWk.mjs → messages-BECMxmfX.mjs} +26 -1
  180. package/dist/{messages-CwCEcbWG.mjs → messages-BIHc0KHY.mjs} +27 -2
  181. package/dist/{messages-D8WvwU42.mjs → messages-BIoeoik5.mjs} +26 -1
  182. package/dist/{messages-D38h5XlF.mjs → messages-BJeGJksD.mjs} +26 -1
  183. package/dist/{messages-Cd23UgLV2.mjs → messages-BRZX964b2.mjs} +27 -2
  184. package/dist/{chunks/messages-B9N__q552.mjs → messages-BTQPpoM42.mjs} +29 -4
  185. package/dist/{messages-CUzBNjnc.mjs → messages-BYNcD6uR.mjs} +26 -1
  186. package/dist/{messages-DjWfVYHS2.mjs → messages-BYmmMDrN2.mjs} +26 -1
  187. package/dist/{chunks/messages-DkTxBa1V.mjs → messages-BbYq1pk-.mjs} +26 -1
  188. package/dist/{chunks/messages-BHhbHLoq.mjs → messages-BiUGXvYr2.mjs} +26 -1
  189. package/dist/{messages-So3SHdIc2.mjs → messages-BiiongNz2.mjs} +26 -1
  190. package/dist/{chunks/messages-BxBID_0B.mjs → messages-Bm0Feca1.mjs} +30 -5
  191. package/dist/{messages-C2veeQpU.mjs → messages-BmAn22OX.mjs} +26 -1
  192. package/dist/{messages-KbYSpNrE.mjs → messages-Bq3F2Tp_.mjs} +26 -1
  193. package/dist/{chunks/messages-Dux1S0-D2.mjs → messages-BsycN_JI2.mjs} +26 -1
  194. package/dist/{messages-DRU_IgoW.mjs → messages-BwHs4cm1.mjs} +30 -5
  195. package/dist/{messages-Cv-DKlZd.mjs → messages-CJTy6JZt.mjs} +26 -1
  196. package/dist/{chunks/messages-D7n_wJK7.mjs → messages-CR_L_UtK.mjs} +26 -1
  197. package/dist/{messages-DnhEzmXJ2.mjs → messages-CSUHBs4c2.mjs} +26 -1
  198. package/dist/{messages-C_HmWyXc2.mjs → messages-CWIXvnDf2.mjs} +26 -1
  199. package/dist/{messages-KSxF8eib.mjs → messages-CcF4y-E4.mjs} +26 -1
  200. package/dist/{chunks/messages-CL3mCbi6.mjs → messages-Ce6KVEbT.mjs} +27 -2
  201. package/dist/{chunks/messages-C-jA6Rf7.mjs → messages-Ci0KqX-J.mjs} +33 -8
  202. package/dist/{chunks/messages-DMyRdafk2.mjs → messages-CjbnogEC.mjs} +26 -1
  203. package/dist/{chunks/messages-BlO_37l_.mjs → messages-CmB406HW.mjs} +28 -3
  204. package/dist/{messages-Cho2VTAX.mjs → messages-CqXtJTpU.mjs} +26 -1
  205. package/dist/{messages-CWEL1WDy2.mjs → messages-D0aw5_0k2.mjs} +28 -3
  206. package/dist/{messages-CgEDVri-2.mjs → messages-D8FQWulF2.mjs} +26 -1
  207. package/dist/{chunks/messages-B5aAzExz.mjs → messages-DBiVgUs2.mjs} +27 -2
  208. package/dist/{chunks/messages-DYizZHT2.mjs → messages-DIJlIqlQ2.mjs} +26 -1
  209. package/dist/{messages-BPL7riv-.mjs → messages-DLX_iBDJ.mjs} +26 -1
  210. package/dist/{messages-vptt-pVF.mjs → messages-DLlc9QPw.mjs} +26 -1
  211. package/dist/{chunks/messages-876bKyUj2.mjs → messages-DMr62KiO2.mjs} +26 -1
  212. package/dist/{chunks/messages-CgedvWCf.mjs → messages-DPA-mMWC2.mjs} +27 -2
  213. package/dist/{messages-vcoib5Ga.mjs → messages-DTh9a8mR.mjs} +26 -1
  214. package/dist/{chunks/messages-DgEGJECT.mjs → messages-DY4IqlhY.mjs} +26 -1
  215. package/dist/{chunks/messages-CdzF0Hvl.mjs → messages-DYTTu0O12.mjs} +26 -1
  216. package/dist/{messages-rbox5gSb2.mjs → messages-DbySKTKt2.mjs} +28 -3
  217. package/dist/{chunks/messages-BGCQCeWd.mjs → messages-Ddnj2iTG2.mjs} +26 -1
  218. package/dist/{chunks/messages-CNEJxD8q2.mjs → messages-DkLU_rWm.mjs} +26 -1
  219. package/dist/{chunks/messages-FYl9woii2.mjs → messages-Dl3Sv6Rq2.mjs} +27 -2
  220. package/dist/{messages-Clsh86WQ.mjs → messages-Dl5Y2-Ia.mjs} +49 -24
  221. package/dist/{chunks/messages-CKRJDX0K2.mjs → messages-DnG0ef8t2.mjs} +28 -3
  222. package/dist/{chunks/messages-CyxDkx8a.mjs → messages-DnGJD4TL.mjs} +26 -1
  223. package/dist/{chunks/messages-DnJHflSh.mjs → messages-Dnp9N6RU2.mjs} +26 -1
  224. package/dist/{chunks/messages-Jps5Tc77.mjs → messages-Dvn35ksS.mjs} +26 -1
  225. package/dist/{messages-ChTWmxS8.mjs → messages-Dw__BcTj.mjs} +26 -1
  226. package/dist/{messages-D7juvhHp.mjs → messages-Dy-Y_nEI.mjs} +26 -1
  227. package/dist/{messages-CNNcKuGH.mjs → messages-E_ZuzGDt.mjs} +26 -1
  228. package/dist/{chunks/messages-DJO0ERQT.mjs → messages-F2xRoY1w.mjs} +26 -1
  229. package/dist/{messages-DqJTZbwt.mjs → messages-Smt4GBbj.mjs} +31 -6
  230. package/dist/{chunks/messages-D8dKkyII2.mjs → messages-aMXpHt5X2.mjs} +26 -1
  231. package/dist/{chunks/messages-DWD0ry9x.mjs → messages-aWZH50vu2.mjs} +28 -3
  232. package/dist/{chunks/messages-BbfLRqLh2.mjs → messages-dv19AkyJ.mjs} +26 -1
  233. package/dist/{chunks/messages-Dw2rmKMi2.mjs → messages-hWwSRF-2.mjs} +26 -1
  234. package/dist/{messages-En8LDjUB.mjs → messages-j7o5rT9s.mjs} +26 -1
  235. package/dist/{chunks/messages-NJsvFwJj.mjs → messages-nUVjeh7K.mjs} +27 -2
  236. package/dist/{messages-Cg1CF4pw.mjs → messages-nlhESX9t.mjs} +26 -1
  237. package/dist/{messages-CSl0Wla62.mjs → messages-rk-A1Wa42.mjs} +28 -3
  238. package/dist/{messages-nOe1gJYu.mjs → messages-xh2eOLvs.mjs} +26 -1
  239. package/dist/{messages-B_sKqaeK.mjs → messages-ynAe7ewZ.mjs} +26 -1
  240. package/dist/react.mjs +2 -2
  241. package/dist/tools.mjs +2 -2
  242. package/dist/vendor.LICENSE.txt +3254 -297
  243. package/package.json +7 -2
  244. package/src/components/constants/data-attributes.ts +0 -2
  245. package/src/components/i18n/locales/am/messages.json +26 -1
  246. package/src/components/i18n/locales/ar/messages.json +26 -1
  247. package/src/components/i18n/locales/az/messages.json +26 -1
  248. package/src/components/i18n/locales/bg/messages.json +26 -1
  249. package/src/components/i18n/locales/bn/messages.json +26 -1
  250. package/src/components/i18n/locales/bs/messages.json +28 -3
  251. package/src/components/i18n/locales/cs/messages.json +30 -5
  252. package/src/components/i18n/locales/da/messages.json +33 -8
  253. package/src/components/i18n/locales/de/messages.json +31 -6
  254. package/src/components/i18n/locales/dv/messages.json +26 -1
  255. package/src/components/i18n/locales/el/messages.json +26 -1
  256. package/src/components/i18n/locales/en/messages.json +13 -0
  257. package/src/components/i18n/locales/es/messages.json +27 -2
  258. package/src/components/i18n/locales/et/messages.json +30 -5
  259. package/src/components/i18n/locales/fa/messages.json +26 -1
  260. package/src/components/i18n/locales/fi/messages.json +26 -1
  261. package/src/components/i18n/locales/fil/messages.json +49 -24
  262. package/src/components/i18n/locales/fr/messages.json +27 -2
  263. package/src/components/i18n/locales/gu/messages.json +26 -1
  264. package/src/components/i18n/locales/he/messages.json +26 -1
  265. package/src/components/i18n/locales/hi/messages.json +26 -1
  266. package/src/components/i18n/locales/hr/messages.json +28 -3
  267. package/src/components/i18n/locales/hu/messages.json +27 -2
  268. package/src/components/i18n/locales/hy/messages.json +26 -1
  269. package/src/components/i18n/locales/id/messages.json +26 -1
  270. package/src/components/i18n/locales/it/messages.json +27 -2
  271. package/src/components/i18n/locales/ja/messages.json +26 -1
  272. package/src/components/i18n/locales/ka/messages.json +26 -1
  273. package/src/components/i18n/locales/km/messages.json +26 -1
  274. package/src/components/i18n/locales/kn/messages.json +26 -1
  275. package/src/components/i18n/locales/ko/messages.json +26 -1
  276. package/src/components/i18n/locales/ku/messages.json +26 -1
  277. package/src/components/i18n/locales/lo/messages.json +26 -1
  278. package/src/components/i18n/locales/lt/messages.json +26 -1
  279. package/src/components/i18n/locales/lv/messages.json +26 -1
  280. package/src/components/i18n/locales/mk/messages.json +26 -1
  281. package/src/components/i18n/locales/ml/messages.json +26 -1
  282. package/src/components/i18n/locales/mn/messages.json +26 -1
  283. package/src/components/i18n/locales/mr/messages.json +26 -1
  284. package/src/components/i18n/locales/ms/messages.json +28 -3
  285. package/src/components/i18n/locales/my/messages.json +26 -1
  286. package/src/components/i18n/locales/ne/messages.json +26 -1
  287. package/src/components/i18n/locales/nl/messages.json +28 -3
  288. package/src/components/i18n/locales/no/messages.json +29 -4
  289. package/src/components/i18n/locales/pa/messages.json +26 -1
  290. package/src/components/i18n/locales/pl/messages.json +27 -2
  291. package/src/components/i18n/locales/ps/messages.json +26 -1
  292. package/src/components/i18n/locales/pt/messages.json +27 -2
  293. package/src/components/i18n/locales/ro/messages.json +27 -2
  294. package/src/components/i18n/locales/ru/messages.json +26 -1
  295. package/src/components/i18n/locales/sd/messages.json +26 -1
  296. package/src/components/i18n/locales/si/messages.json +26 -1
  297. package/src/components/i18n/locales/sk/messages.json +28 -3
  298. package/src/components/i18n/locales/sl/messages.json +28 -3
  299. package/src/components/i18n/locales/sq/messages.json +27 -2
  300. package/src/components/i18n/locales/sr/messages.json +26 -1
  301. package/src/components/i18n/locales/sv/messages.json +28 -3
  302. package/src/components/i18n/locales/sw/messages.json +26 -1
  303. package/src/components/i18n/locales/ta/messages.json +26 -1
  304. package/src/components/i18n/locales/te/messages.json +26 -1
  305. package/src/components/i18n/locales/th/messages.json +26 -1
  306. package/src/components/i18n/locales/tr/messages.json +26 -1
  307. package/src/components/i18n/locales/ug/messages.json +26 -1
  308. package/src/components/i18n/locales/uk/messages.json +26 -1
  309. package/src/components/i18n/locales/ur/messages.json +26 -1
  310. package/src/components/i18n/locales/vi/messages.json +26 -1
  311. package/src/components/i18n/locales/yi/messages.json +26 -1
  312. package/src/components/i18n/locales/zh/messages.json +26 -1
  313. package/src/components/icons/index.ts +38 -0
  314. package/src/components/modules/ui.ts +0 -13
  315. package/src/stories/EditorModes.stories.ts +0 -60
  316. package/src/styles/main.css +39 -1
  317. package/src/tools/callout/emoji-picker/index.ts +3 -2
  318. package/src/tools/code/code-keyboard.ts +16 -9
  319. package/src/tools/code/constants.ts +26 -3
  320. package/src/tools/code/dom-builder.ts +40 -5
  321. package/src/tools/code/highlight-applier.ts +229 -0
  322. package/src/tools/code/index.ts +141 -1
  323. package/src/tools/code/mermaid-loader.ts +45 -0
  324. package/src/tools/code/shiki-loader.ts +135 -0
  325. package/src/tools/table/core/table-commands.ts +16 -0
  326. package/src/tools/table/core/table-controller.ts +29 -0
  327. package/src/tools/table/core/table-events.ts +17 -0
  328. package/src/tools/table/index.ts +194 -11
  329. package/src/tools/table/table-cell-blocks.ts +9 -6
  330. package/src/tools/table/table-cell-clipboard.ts +6 -1
  331. package/src/tools/table/table-cell-placement-picker.ts +133 -0
  332. package/src/tools/table/table-cell-selection.ts +174 -19
  333. package/src/tools/table/table-core.ts +321 -113
  334. package/src/tools/table/table-map.ts +279 -0
  335. package/src/tools/table/table-model.ts +901 -1
  336. package/src/tools/table/table-operations.ts +78 -44
  337. package/src/tools/table/table-resize.ts +19 -17
  338. package/src/tools/table/table-row-col-drag.ts +24 -10
  339. package/src/tools/table/types.ts +24 -2
  340. package/types/data-attributes.d.ts +0 -1
  341. package/types/tools/code.d.ts +2 -0
  342. /package/dist/chunks/{am-CS-JjQ0N.mjs → am-rVzV1W41.mjs} +0 -0
  343. /package/dist/chunks/{ar-Dt4XzR5U.mjs → ar-C710lkoH.mjs} +0 -0
  344. /package/dist/chunks/{az-CaDTXby8.mjs → az-BOp1pgua.mjs} +0 -0
  345. /package/dist/chunks/{bg-D1pLog-R.mjs → bg-CL9p09ZD.mjs} +0 -0
  346. /package/dist/chunks/{bn-Db_ae60m.mjs → bn-CNmSeyAy.mjs} +0 -0
  347. /package/dist/chunks/{bs-DJTg1R9e.mjs → bs-BRzMGqzk.mjs} +0 -0
  348. /package/dist/chunks/{cs-_Gc21gSL.mjs → cs-BYPBLmnF.mjs} +0 -0
  349. /package/dist/chunks/{da-xDB8uhCd.mjs → da-CBC_LR1c.mjs} +0 -0
  350. /package/dist/chunks/{de-B6gVjh1Z.mjs → de-DxRFMoAj.mjs} +0 -0
  351. /package/dist/chunks/{el-ClbRSnOs.mjs → el-Bk6YbySf.mjs} +0 -0
  352. /package/dist/chunks/{es-CuY9rnLK.mjs → es-DpT3FCMR.mjs} +0 -0
  353. /package/dist/chunks/{et-BLu5lDVc.mjs → et-DE9Dr_g9.mjs} +0 -0
  354. /package/dist/chunks/{fa-P3gnrZH8.mjs → fa-Banj1QUE.mjs} +0 -0
  355. /package/dist/chunks/{fi-B8PVHLjq.mjs → fi-DfN3M5ER.mjs} +0 -0
  356. /package/dist/chunks/{fil-B9JII5iF.mjs → fil-DbCsRS1d.mjs} +0 -0
  357. /package/dist/chunks/{fr-BWLDZdcc.mjs → fr-D1clKhgt.mjs} +0 -0
  358. /package/dist/chunks/{gu-BH3R_s4c.mjs → gu-1CsZyRwT.mjs} +0 -0
  359. /package/dist/chunks/{he-CCmeCVR_.mjs → he-qQdnL6eK.mjs} +0 -0
  360. /package/dist/chunks/{hi-BBav00DN.mjs → hi-DxM0Nff1.mjs} +0 -0
  361. /package/dist/chunks/{hr-B5ZX0r9G.mjs → hr-Onldyi-u.mjs} +0 -0
  362. /package/dist/chunks/{hu-1jgDa3YU.mjs → hu-CAn3pBuY.mjs} +0 -0
  363. /package/dist/chunks/{hy-LX4Kp2PE.mjs → hy-D43q7NxE.mjs} +0 -0
  364. /package/dist/chunks/{i18next-KNC_XV5x.mjs → i18next-BBGW2sDE.mjs} +0 -0
  365. /package/dist/chunks/{id-CcG40D1H.mjs → id-Xrw5Dd0Y.mjs} +0 -0
  366. /package/dist/chunks/{it-Cb8_K72W.mjs → it-CA9ZDMSc.mjs} +0 -0
  367. /package/dist/chunks/{ja-ipCH91mv.mjs → ja-D0J6WRFh.mjs} +0 -0
  368. /package/dist/chunks/{ka-BRvREIgq.mjs → ka-BZL7xDuY.mjs} +0 -0
  369. /package/dist/chunks/{km-BJwVw7Fg.mjs → km-BimgQZVU.mjs} +0 -0
  370. /package/dist/chunks/{kn-BPgUazCC.mjs → kn-C2n2cPHK.mjs} +0 -0
  371. /package/dist/chunks/{ko-CQLzxe7k.mjs → ko-n4Cn93D3.mjs} +0 -0
  372. /package/dist/chunks/{ku-BHhHu8Iz.mjs → ku-BYZCgT44.mjs} +0 -0
  373. /package/dist/chunks/{lo-DsTgYblY.mjs → lo-DVXiAE4N.mjs} +0 -0
  374. /package/dist/chunks/{lt-CDzHJm71.mjs → lt-B9KlQFnY.mjs} +0 -0
  375. /package/dist/chunks/{lv-MLLIAnIX.mjs → lv-BINeOdyx.mjs} +0 -0
  376. /package/dist/chunks/{mdast-util-math-yS0EygZV.mjs → mdast-util-math-CHYUxOHk.mjs} +0 -0
  377. /package/dist/chunks/{mk-DQdmUquZ.mjs → mk-_-QrPrLN.mjs} +0 -0
  378. /package/dist/chunks/{ml-DqehZnra.mjs → ml-KvJSC1KT.mjs} +0 -0
  379. /package/dist/chunks/{mn-4cFkKFjW.mjs → mn-CjFjWnRG.mjs} +0 -0
  380. /package/dist/chunks/{mr-DWiztOP4.mjs → mr-DqAZ7FRX.mjs} +0 -0
  381. /package/dist/chunks/{ms-BSz-iSnc.mjs → ms-BZcV4UG_.mjs} +0 -0
  382. /package/dist/chunks/{my-DbtbM1MW.mjs → my-97SC9jYN.mjs} +0 -0
  383. /package/dist/chunks/{ne-CqALWw_f.mjs → ne-Bs-M2TyF.mjs} +0 -0
  384. /package/dist/chunks/{nl-D_ra6RvH.mjs → nl-2ZwQilo-.mjs} +0 -0
  385. /package/dist/chunks/{no-Cg_kz_jl.mjs → no-fOQTpFq1.mjs} +0 -0
  386. /package/dist/chunks/{notifier-BOwxj_Ok.mjs → notifier-B1zCi9G1.mjs} +0 -0
  387. /package/dist/chunks/{pa-NLAsNqwY.mjs → pa-DLOqkMi0.mjs} +0 -0
  388. /package/dist/chunks/{pl-NHKp4YDg.mjs → pl-FYs9QrXU.mjs} +0 -0
  389. /package/dist/chunks/{ps-D1zEqNeg.mjs → ps-CTXe6pSe.mjs} +0 -0
  390. /package/dist/chunks/{pt-DBtqbUEB.mjs → pt-B1X4x7d1.mjs} +0 -0
  391. /package/dist/chunks/{ro-lqr63ai5.mjs → ro-Bf7S2FaR.mjs} +0 -0
  392. /package/dist/chunks/{ru-BycNnDyN.mjs → ru-B8lqnu_j.mjs} +0 -0
  393. /package/dist/chunks/{sd-DpHpIN9Z.mjs → sd-CHRYJm2r.mjs} +0 -0
  394. /package/dist/chunks/{si-BwiwaC7N.mjs → si-CI0Hs6vH.mjs} +0 -0
  395. /package/dist/chunks/{sk-CqRHT2Gp.mjs → sk-Bdvq1Kb_.mjs} +0 -0
  396. /package/dist/chunks/{sl-DA348uQ_.mjs → sl-B_qiFTV5.mjs} +0 -0
  397. /package/dist/chunks/{sq-D7JNgve1.mjs → sq-E0j1hysP.mjs} +0 -0
  398. /package/dist/chunks/{sr-D8RK6Kwp.mjs → sr-VPpVNTZw.mjs} +0 -0
  399. /package/dist/chunks/{sv-dwgT67ZG.mjs → sv-gKmDSR3d.mjs} +0 -0
  400. /package/dist/chunks/{sw-ZRRJnkem.mjs → sw-zeFLiO23.mjs} +0 -0
  401. /package/dist/chunks/{ta-5x4L5Krl.mjs → ta-Ci-j89hR.mjs} +0 -0
  402. /package/dist/chunks/{te-BZpEimwA.mjs → te-qyMI0M7a.mjs} +0 -0
  403. /package/dist/chunks/{th-Bhr-33kv.mjs → th-DPxHtpdb.mjs} +0 -0
  404. /package/dist/chunks/{tr-6tSNKGNB.mjs → tr-CRV6GS-G.mjs} +0 -0
  405. /package/dist/chunks/{ug-_e-jvr2b.mjs → ug-DW0YFpo5.mjs} +0 -0
  406. /package/dist/chunks/{uk-DooSc2Ja.mjs → uk-ssteuphK.mjs} +0 -0
  407. /package/dist/chunks/{ur-rb-krkIO.mjs → ur-qhY3-jY7.mjs} +0 -0
  408. /package/dist/chunks/{vi-CQkLn2AQ.mjs → vi-CHriMMC8.mjs} +0 -0
  409. /package/dist/chunks/{zh-CXQ40Q2_.mjs → zh-BJktawVN.mjs} +0 -0
@@ -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
@@ -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 };
@@ -0,0 +1,133 @@
1
+ import type { I18n } from '../../../types/api';
2
+ import type { CellPlacement } from './types';
3
+
4
+ interface PlacementPickerOptions {
5
+ i18n: I18n;
6
+ currentPlacement: CellPlacement | undefined;
7
+ onPlacementSelect: (placement: CellPlacement) => void;
8
+ }
9
+
10
+ interface PlacementPickerResult {
11
+ element: HTMLDivElement;
12
+ }
13
+
14
+ const PLACEMENTS: CellPlacement[] = [
15
+ 'top-left', 'top-center', 'top-right',
16
+ 'middle-left', 'middle-center', 'middle-right',
17
+ 'bottom-left', 'bottom-center', 'bottom-right',
18
+ ];
19
+
20
+ const I18N_KEYS: Record<CellPlacement, string> = {
21
+ 'top-left': 'tools.table.placementTopLeft',
22
+ 'top-center': 'tools.table.placementTopCenter',
23
+ 'top-right': 'tools.table.placementTopRight',
24
+ 'middle-left': 'tools.table.placementMiddleLeft',
25
+ 'middle-center': 'tools.table.placementMiddleCenter',
26
+ 'middle-right': 'tools.table.placementMiddleRight',
27
+ 'bottom-left': 'tools.table.placementBottomLeft',
28
+ 'bottom-center': 'tools.table.placementBottomCenter',
29
+ 'bottom-right': 'tools.table.placementBottomRight',
30
+ };
31
+
32
+ const V_ALIGN: Record<string, string> = {
33
+ top: 'flex-start',
34
+ middle: 'center',
35
+ bottom: 'flex-end',
36
+ };
37
+
38
+ const H_ALIGN: Record<string, string> = {
39
+ left: 'flex-start',
40
+ center: 'center',
41
+ right: 'flex-end',
42
+ };
43
+
44
+ export const createCellPlacementPicker = (options: PlacementPickerOptions): PlacementPickerResult => {
45
+ const current = options.currentPlacement ?? 'top-left';
46
+ const wrapper = document.createElement('div');
47
+
48
+ wrapper.style.padding = '8px';
49
+
50
+ const grid = document.createElement('div');
51
+
52
+ grid.style.display = 'grid';
53
+ grid.style.gridTemplateColumns = 'repeat(3, 1fr)';
54
+ grid.style.gap = '3px';
55
+
56
+ const label = document.createElement('div');
57
+
58
+ label.style.textAlign = 'center';
59
+ label.style.fontSize = '11px';
60
+ label.style.marginTop = '6px';
61
+ label.style.color = 'var(--blok-text-secondary, #707684)';
62
+ label.textContent = options.i18n.t(I18N_KEYS[current]);
63
+
64
+ for (const placement of PLACEMENTS) {
65
+ const [vKey, hKey] = placement.split('-');
66
+ const cell = document.createElement('div');
67
+
68
+ cell.setAttribute('data-placement', placement);
69
+ cell.style.width = '32px';
70
+ cell.style.height = '26px';
71
+ cell.style.borderRadius = '3px';
72
+ cell.style.display = 'flex';
73
+ cell.style.flexDirection = 'column';
74
+ cell.style.alignItems = H_ALIGN[hKey];
75
+ cell.style.justifyContent = V_ALIGN[vKey];
76
+ cell.style.padding = '3px';
77
+ cell.style.cursor = 'pointer';
78
+ cell.style.gap = '1px';
79
+
80
+ if (placement === current) {
81
+ cell.setAttribute('data-active', 'true');
82
+ cell.style.outline = '2px solid var(--blok-color-primary, #388AE5)';
83
+ cell.style.outlineOffset = '-2px';
84
+ cell.style.backgroundColor = 'var(--blok-item-focus-bg, rgba(35, 131, 226, 0.14))';
85
+ } else {
86
+ cell.style.backgroundColor = 'var(--blok-bg-light, #eff2f5)';
87
+ }
88
+
89
+ const line1 = document.createElement('div');
90
+
91
+ line1.style.width = '14px';
92
+ line1.style.height = '2px';
93
+ line1.style.borderRadius = '1px';
94
+ line1.style.backgroundColor = 'currentColor';
95
+ line1.style.opacity = '0.6';
96
+
97
+ const line2 = document.createElement('div');
98
+
99
+ line2.style.width = '9px';
100
+ line2.style.height = '2px';
101
+ line2.style.borderRadius = '1px';
102
+ line2.style.backgroundColor = 'currentColor';
103
+ line2.style.opacity = '0.3';
104
+
105
+ cell.appendChild(line1);
106
+ cell.appendChild(line2);
107
+
108
+ cell.addEventListener('click', () => {
109
+ grid.querySelectorAll('[data-placement]').forEach(el => {
110
+ const element = el as HTMLElement;
111
+ element.removeAttribute('data-active');
112
+ element.style.outline = '';
113
+ element.style.outlineOffset = '';
114
+ element.style.backgroundColor = 'var(--blok-bg-tertiary, #f0f0f0)';
115
+ });
116
+
117
+ cell.setAttribute('data-active', 'true');
118
+ cell.style.outline = '2px solid var(--blok-color-primary, #388AE5)';
119
+ cell.style.outlineOffset = '-2px';
120
+ cell.style.backgroundColor = 'var(--blok-item-focus-bg, rgba(35, 131, 226, 0.14))';
121
+ label.textContent = options.i18n.t(I18N_KEYS[placement]);
122
+
123
+ options.onPlacementSelect(placement);
124
+ });
125
+
126
+ grid.appendChild(cell);
127
+ }
128
+
129
+ wrapper.appendChild(grid);
130
+ wrapper.appendChild(label);
131
+
132
+ return { element: wrapper };
133
+ };