@jackuait/blok 0.13.1 → 0.14.0

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 (395) hide show
  1. package/dist/blok.cjs +1 -1
  2. package/dist/blok.iife.js +30 -30
  3. package/dist/blok.mjs +2 -2
  4. package/dist/chunks/blok-Da-GaWJ8.cjs +17 -0
  5. package/dist/chunks/{blok-BF9i6G_n.mjs → blok-PpFnlqXZ.mjs} +2723 -2323
  6. package/dist/chunks/constants-C-OQpSwB.cjs +457 -0
  7. package/dist/chunks/{constants-jfK6xPl6.mjs → constants-DdfiMdC1.mjs} +390 -299
  8. package/dist/chunks/{i18next-loader-GIrBCFrC.mjs → i18next-loader-BEWWek8j.mjs} +1 -1
  9. package/dist/chunks/{i18next-loader-DC1uN-wc.cjs → i18next-loader-BRLYf-CW.cjs} +1 -1
  10. package/dist/chunks/{lightweight-i18n-DF9Pupws.mjs → lightweight-i18n-GbzxWVgl.mjs} +9 -0
  11. package/dist/chunks/lightweight-i18n-lNYVKCfj.cjs +1 -0
  12. package/dist/chunks/messages-085GG-gT.cjs +1 -0
  13. package/dist/{messages-3j4yi-DF.mjs → chunks/messages-46QopBh4.mjs} +9 -0
  14. package/dist/chunks/messages-5kQujjf1.cjs +1 -0
  15. package/dist/chunks/{messages-CTWXEx_o.mjs → messages-6r3Lrqpf.mjs} +9 -0
  16. package/dist/chunks/messages-8vjbwhvK.cjs +1 -0
  17. package/dist/chunks/messages-ACbZDExx.cjs +1 -0
  18. package/dist/chunks/messages-B05XREvI.cjs +1 -0
  19. package/dist/chunks/{messages-CQg2_vmm.mjs → messages-B0y97-C9.mjs} +9 -0
  20. package/dist/chunks/{messages-ZHNvKiIX.mjs → messages-B26pkAIj.mjs} +9 -0
  21. package/dist/chunks/messages-B2J7kDKI.cjs +1 -0
  22. package/dist/chunks/messages-B3jMjjFG.cjs +1 -0
  23. package/dist/chunks/messages-B4_c-uS0.cjs +1 -0
  24. package/dist/chunks/messages-B6zoVYEd.cjs +1 -0
  25. package/dist/chunks/{messages-DI9Ifrgt.mjs → messages-B73uch0z.mjs} +9 -0
  26. package/dist/chunks/{messages-AgmrT2Id.mjs → messages-B74xK8Ux.mjs} +9 -0
  27. package/dist/chunks/messages-B7efcz_S2.cjs +1 -0
  28. package/dist/chunks/{messages-sqdfYuVj2.mjs → messages-B9u3UJRu2.mjs} +9 -0
  29. package/dist/chunks/messages-BB9huoLU.cjs +1 -0
  30. package/dist/{messages-Cx7sqvx02.mjs → chunks/messages-BEzCtzW3.mjs} +9 -0
  31. package/dist/chunks/messages-BGQdk2zV2.cjs +1 -0
  32. package/dist/chunks/messages-BGmUrVtN2.cjs +1 -0
  33. package/dist/chunks/messages-BH-3FR4b2.cjs +1 -0
  34. package/dist/chunks/{messages-BZ4d5yNH.mjs → messages-BHqAQF6C.mjs} +9 -0
  35. package/dist/{messages-DzkZ434Z.mjs → chunks/messages-BI_-Ub99.mjs} +9 -0
  36. package/dist/chunks/messages-BNa6_BYq2.cjs +1 -0
  37. package/dist/chunks/{messages-BvupGuDw2.mjs → messages-BOMNOs8T2.mjs} +9 -0
  38. package/dist/chunks/{messages-fSeXd6-z.mjs → messages-BPYPnKHy.mjs} +9 -0
  39. package/dist/{messages-B3PWaMcw.mjs → chunks/messages-BQmUOeft.mjs} +9 -0
  40. package/dist/chunks/messages-BRfutnCs.cjs +1 -0
  41. package/dist/chunks/messages-BT_0dgL1.cjs +1 -0
  42. package/dist/chunks/{messages-BWGqOZ9J.mjs → messages-BWSXW4jk.mjs} +9 -0
  43. package/dist/chunks/messages-BWpKvkND2.cjs +1 -0
  44. package/dist/chunks/messages-BY6gCAsA2.cjs +1 -0
  45. package/dist/{messages-BDwU9rYR2.mjs → chunks/messages-BbfZo0kw2.mjs} +9 -0
  46. package/dist/{messages-gQ5PFa2t2.mjs → chunks/messages-BfqzgRP72.mjs} +9 -0
  47. package/dist/chunks/messages-Bk2Xs7_v.cjs +1 -0
  48. package/dist/{messages-CmN2OfuB.mjs → chunks/messages-BmkavfpK.mjs} +9 -0
  49. package/dist/chunks/{messages-B1k4DgVe.mjs → messages-BmzMikmq.mjs} +9 -0
  50. package/dist/chunks/messages-BniEGAW32.cjs +1 -0
  51. package/dist/chunks/{messages-BP77P9ER.mjs → messages-BplwYBhA.mjs} +9 -0
  52. package/dist/chunks/{messages-B1xgsCNQ.cjs → messages-BqJ-xe8R.cjs} +1 -1
  53. package/dist/chunks/messages-Bry43U_U.cjs +1 -0
  54. package/dist/{messages-DFfhoDWZ2.mjs → chunks/messages-BuzGjYKw.mjs} +9 -0
  55. package/dist/chunks/messages-ByT63R7v2.cjs +1 -0
  56. package/dist/{messages-C_gdsU952.mjs → chunks/messages-C0S7KViA2.mjs} +9 -0
  57. package/dist/chunks/{messages-DzY53I67.mjs → messages-C0Tt7Odx.mjs} +9 -0
  58. package/dist/{messages-B8Tq9Txy.mjs → chunks/messages-C3A1iLjY.mjs} +9 -0
  59. package/dist/chunks/{messages-B6You-RA.mjs → messages-C3gh1rpr.mjs} +9 -0
  60. package/dist/chunks/{messages-CXxz5HYQ.mjs → messages-C7JE4SUS.mjs} +9 -0
  61. package/dist/chunks/messages-C9IWDnCh2.cjs +1 -0
  62. package/dist/chunks/messages-CBc3S61g2.cjs +1 -0
  63. package/dist/chunks/{messages-DefZ3ihx.mjs → messages-CHpkDOiI.mjs} +9 -0
  64. package/dist/{messages-BcD7xtJA.mjs → chunks/messages-CImQCp-z2.mjs} +9 -0
  65. package/dist/chunks/messages-CJ--z80t2.cjs +1 -0
  66. package/dist/chunks/messages-CNH8YFuv.cjs +1 -0
  67. package/dist/chunks/{messages-bjSJwsXK2.mjs → messages-CQ2KWTbV2.mjs} +9 -0
  68. package/dist/{messages-C8RMjnBe.mjs → chunks/messages-CWAukiLC.mjs} +9 -0
  69. package/dist/{messages-B3oFjWq3.mjs → chunks/messages-C_BUhMkZ.mjs} +9 -0
  70. package/dist/chunks/{messages-BvuEffoe.mjs → messages-CcBT1o1B.mjs} +9 -0
  71. package/dist/chunks/messages-CdqejEof.cjs +1 -0
  72. package/dist/chunks/messages-Chdejshy2.cjs +1 -0
  73. package/dist/{messages-D-rvoUSJ.mjs → chunks/messages-CijMg_B_.mjs} +9 -0
  74. package/dist/{messages-JKXCsFKZ.mjs → chunks/messages-Ciz80Z2u2.mjs} +9 -0
  75. package/dist/{messages-Dq2WEsEu.mjs → chunks/messages-CjuGKMoT.mjs} +9 -0
  76. package/dist/chunks/{messages-BxKobpJ22.mjs → messages-ClOfUECP2.mjs} +9 -0
  77. package/dist/chunks/messages-CrF-Q_ML.cjs +1 -0
  78. package/dist/chunks/messages-Cww_rBCM.cjs +1 -0
  79. package/dist/chunks/messages-CxPVYl2H2.cjs +1 -0
  80. package/dist/chunks/{messages-BA2sVGrR2.mjs → messages-Cyiqo_dk2.mjs} +9 -0
  81. package/dist/{messages-D788KtGe.mjs → chunks/messages-D-u_SWhb.mjs} +9 -0
  82. package/dist/chunks/messages-D0H-D5FQ2.cjs +1 -0
  83. package/dist/chunks/messages-D195RH3A.cjs +1 -0
  84. package/dist/chunks/{messages-Dd4nzvLj2.mjs → messages-D5-DG-_u2.mjs} +9 -0
  85. package/dist/chunks/messages-D6kDQgDP2.cjs +1 -0
  86. package/dist/{messages-CAGQtm7T.mjs → chunks/messages-D8-hiQgf.mjs} +9 -0
  87. package/dist/{messages-ftPYsH6d2.mjs → chunks/messages-D8nb9CKr2.mjs} +9 -0
  88. package/dist/{messages-DPqFBtJR.mjs → chunks/messages-DAd5yWtH2.mjs} +9 -0
  89. package/dist/chunks/messages-DAdsFLpE.cjs +1 -0
  90. package/dist/chunks/messages-DCUsbiUQ.cjs +1 -0
  91. package/dist/{messages-AycxTjmw.mjs → chunks/messages-DCVZaAT9.mjs} +9 -0
  92. package/dist/chunks/messages-DHXttezt2.cjs +1 -0
  93. package/dist/chunks/messages-DIgxCixa.cjs +1 -0
  94. package/dist/chunks/messages-DJ0Wr-Bt2.cjs +1 -0
  95. package/dist/chunks/messages-DJBdlmxR.cjs +1 -0
  96. package/dist/chunks/{messages-5AxgjKgf2.mjs → messages-DJm-uLwr2.mjs} +9 -0
  97. package/dist/chunks/{messages-BVarbXYD2.mjs → messages-DKF4qWhw2.mjs} +9 -0
  98. package/dist/chunks/messages-DLAWSVlE.cjs +1 -0
  99. package/dist/{messages-Bj03XD-02.mjs → chunks/messages-DLI8m6z_2.mjs} +9 -0
  100. package/dist/{messages-CTzO11jz.mjs → chunks/messages-DNiWBVQr.mjs} +9 -0
  101. package/dist/chunks/messages-DNsgR3ZH.cjs +1 -0
  102. package/dist/{messages-CgaGkQi32.mjs → chunks/messages-DPI5-TrO2.mjs} +9 -0
  103. package/dist/chunks/{messages-CyCl8la6.mjs → messages-DQ1z_srP.mjs} +9 -0
  104. package/dist/chunks/{messages-C4bHKGnB2.mjs → messages-DSxYO-_j2.mjs} +9 -0
  105. package/dist/chunks/messages-DTrrEqf02.cjs +1 -0
  106. package/dist/chunks/{messages-D7YPlNAK.mjs → messages-DYLfoakZ.mjs} +9 -0
  107. package/dist/chunks/messages-DZCWq8nI2.cjs +1 -0
  108. package/dist/{messages-PQVh93mt.mjs → chunks/messages-D_JT9POv.mjs} +9 -0
  109. package/dist/chunks/{messages-Uc3Uc2862.mjs → messages-DaTniq4w2.mjs} +9 -0
  110. package/dist/{messages-DiL61awK.mjs → chunks/messages-De2tXe0o.mjs} +9 -0
  111. package/dist/chunks/{messages-l5xHQb_m.mjs → messages-DiwyN3uU.mjs} +9 -0
  112. package/dist/chunks/messages-DkQGwmom.cjs +1 -0
  113. package/dist/chunks/{messages-B6t1xShv.mjs → messages-Dl-C7Pdf.mjs} +9 -0
  114. package/dist/chunks/{messages-bSVgJ1cu.mjs → messages-DlDyYt5x.mjs} +9 -0
  115. package/dist/chunks/messages-Dmhwr_Ow2.cjs +1 -0
  116. package/dist/chunks/messages-DrQQ1Hky.cjs +1 -0
  117. package/dist/chunks/messages-DtQ_pCWn.cjs +1 -0
  118. package/dist/{messages-uy3FE24_2.mjs → chunks/messages-Du-inLpi2.mjs} +9 -0
  119. package/dist/{messages-DqXJJPx9.mjs → chunks/messages-Duu9LiF32.mjs} +9 -0
  120. package/dist/chunks/messages-DxCc14pu2.cjs +1 -0
  121. package/dist/chunks/{messages-DNqFlfOd.mjs → messages-Dz3cVqxu.mjs} +9 -0
  122. package/dist/chunks/messages-EJkYSgsP.cjs +1 -0
  123. package/dist/chunks/messages-F3QeKduK.cjs +1 -0
  124. package/dist/chunks/messages-HfCZ1oPV.cjs +1 -0
  125. package/dist/chunks/{messages-BVZONUH9.mjs → messages-Ji3WDjrp.mjs} +9 -0
  126. package/dist/chunks/messages-MTnjMh07.cjs +1 -0
  127. package/dist/{messages-DL7JAwpC.mjs → chunks/messages-NU3n_1t9.mjs} +9 -0
  128. package/dist/chunks/messages-NpCBoXqi.cjs +1 -0
  129. package/dist/chunks/messages-PMZIH3mH.cjs +1 -0
  130. package/dist/{messages-7fwJIrld2.mjs → chunks/messages-TFu4tdzc2.mjs} +9 -0
  131. package/dist/{messages-BSHFypGE2.mjs → chunks/messages-Ti4ZdnqM2.mjs} +9 -0
  132. package/dist/chunks/messages-UOTfsDv3.cjs +1 -0
  133. package/dist/chunks/messages-WDBEGpNu.cjs +1 -0
  134. package/dist/chunks/messages-Zg6PFQ87.cjs +1 -0
  135. package/dist/chunks/messages-bdVhFVzt2.cjs +1 -0
  136. package/dist/chunks/messages-dnnjc_oR2.cjs +1 -0
  137. package/dist/{messages-BmWP4vpV2.mjs → chunks/messages-fI_5bRwV2.mjs} +9 -0
  138. package/dist/{messages-CIjSE2_O2.mjs → chunks/messages-g80Luov_2.mjs} +9 -0
  139. package/dist/chunks/messages-hlzAtKI5.cjs +1 -0
  140. package/dist/chunks/messages-kuh4lSUE2.cjs +1 -0
  141. package/dist/chunks/messages-m20Eebmt2.cjs +1 -0
  142. package/dist/chunks/messages-o1__8Rul.cjs +1 -0
  143. package/dist/chunks/messages-pBYvH88_.cjs +1 -0
  144. package/dist/chunks/{messages-CMRjQYxi2.mjs → messages-u1hpTCvK2.mjs} +9 -0
  145. package/dist/chunks/{messages-BoCUgrkI.mjs → messages-vq5ZvFTF.mjs} +9 -0
  146. package/dist/chunks/tools-DeTgjuIK.cjs +116 -0
  147. package/dist/chunks/{tools-CrrBwp7I.mjs → tools-omGeunql.mjs} +1818 -1686
  148. package/dist/full.cjs +1 -1
  149. package/dist/full.mjs +8 -8
  150. package/dist/locales.mjs +76 -67
  151. package/dist/{chunks/messages-DHdoaaFq2.mjs → messages-2hSOMnir2.mjs} +9 -0
  152. package/dist/{chunks/messages-DlcI-0Sy.mjs → messages-3VCxXECx.mjs} +9 -0
  153. package/dist/{messages-CxX23Jsk2.mjs → messages-8xGEIh_m2.mjs} +9 -0
  154. package/dist/{chunks/messages-DmErSGPk2.mjs → messages-B-QcHnuI2.mjs} +9 -0
  155. package/dist/{messages-BKCuCTFM.mjs → messages-B8zoeMf9.mjs} +9 -0
  156. package/dist/{chunks/messages-BmdkDNYv.mjs → messages-B9CF0GcE.mjs} +9 -0
  157. package/dist/{messages-1ufJbdRv2.mjs → messages-B9W0pRCr2.mjs} +9 -0
  158. package/dist/{messages-DQik3_xv2.mjs → messages-BFM2ljkf2.mjs} +9 -0
  159. package/dist/{chunks/messages-BNxTGhHu.mjs → messages-BLm4FSbz2.mjs} +9 -0
  160. package/dist/{chunks/messages-GHsufIGi2.mjs → messages-BLpeYPKv2.mjs} +9 -0
  161. package/dist/{messages-D_WzyzUt.mjs → messages-BM73sjxy.mjs} +9 -0
  162. package/dist/{messages-CX8egsiA2.mjs → messages-BOpqKi6Y2.mjs} +9 -0
  163. package/dist/{chunks/messages-eyGOcbhV.mjs → messages-BUGdUeTK.mjs} +9 -0
  164. package/dist/{chunks/messages-DhZwMl9x2.mjs → messages-BZm7MzSJ2.mjs} +9 -0
  165. package/dist/{messages-C31VIrlL.mjs → messages-BtBhP1sv.mjs} +9 -0
  166. package/dist/{messages-D1Fjr4OK2.mjs → messages-BthFu3bN2.mjs} +9 -0
  167. package/dist/{chunks/messages-COMdnGQV2.mjs → messages-BurjwjCQ2.mjs} +9 -0
  168. package/dist/{messages-DTkd9ND8.mjs → messages-ByIHkus-.mjs} +9 -0
  169. package/dist/{messages-C9GFRcVj.mjs → messages-ByVKFMH3.mjs} +9 -0
  170. package/dist/{chunks/messages-B5CFhyI8.mjs → messages-C6FDRqcf.mjs} +9 -0
  171. package/dist/{chunks/messages-OSIAf0Wk2.mjs → messages-C9dJ_N542.mjs} +9 -0
  172. package/dist/{messages-CRR1VRO6.mjs → messages-CCw8aJgW.mjs} +9 -0
  173. package/dist/{chunks/messages-AtUsRyWK2.mjs → messages-CO3NEwf22.mjs} +9 -0
  174. package/dist/{chunks/messages-CcboYTP8.mjs → messages-CPB2xkpC.mjs} +9 -0
  175. package/dist/{messages-CITYhXUz.mjs → messages-CPDsEORY.mjs} +9 -0
  176. package/dist/{chunks/messages-B2zrJyAc2.mjs → messages-CYyPOGy7.mjs} +9 -0
  177. package/dist/{chunks/messages-C03LZxma.mjs → messages-CZAODRjY.mjs} +9 -0
  178. package/dist/{messages-Duk7VVeY.mjs → messages-C_rns7Ku.mjs} +9 -0
  179. package/dist/{chunks/messages-CdWXgq_r.mjs → messages-CaUUIQvU.mjs} +9 -0
  180. package/dist/{messages-Cp0fjsey.mjs → messages-Cc-A7Vip.mjs} +9 -0
  181. package/dist/{chunks/messages-B7KbtBAE.mjs → messages-Ccf81JsG.mjs} +9 -0
  182. package/dist/{chunks/messages-rEsI_fAk.mjs → messages-CerTDuSC.mjs} +9 -0
  183. package/dist/{messages-BkTBwYet.mjs → messages-CgmDwRRE.mjs} +9 -0
  184. package/dist/{chunks/messages-DsyO86r3.mjs → messages-Cn3PWtLp.mjs} +9 -0
  185. package/dist/{chunks/messages-CWTFEPbA2.mjs → messages-Cu1rTEkB.mjs} +9 -0
  186. package/dist/{messages-oIa8wahx.mjs → messages-CxEHfUNH.mjs} +9 -0
  187. package/dist/{messages-C_mN4lx0.mjs → messages-D1B41i8X.mjs} +9 -0
  188. package/dist/{messages-NVepzgE3.mjs → messages-D6954zcl.mjs} +9 -0
  189. package/dist/{messages-C2TRJroV2.mjs → messages-DBwWssfL2.mjs} +9 -0
  190. package/dist/{messages-Cdgz3urh.mjs → messages-DFHRMYke.mjs} +9 -0
  191. package/dist/{messages-DXCyNanc2.mjs → messages-DJVrq0Xa2.mjs} +9 -0
  192. package/dist/{chunks/messages-OYoN_rp1.mjs → messages-DMJz28kt.mjs} +9 -0
  193. package/dist/{chunks/messages-B_U10evN2.mjs → messages-DOnOpXFJ2.mjs} +9 -0
  194. package/dist/{messages-5USazVPA2.mjs → messages-DR1Tf-Kj2.mjs} +9 -0
  195. package/dist/{chunks/messages-C4sIqArW2.mjs → messages-DSUXwuzH2.mjs} +9 -0
  196. package/dist/{chunks/messages-DGHTTk1S2.mjs → messages-DTNO7tw1.mjs} +9 -0
  197. package/dist/{messages-Ddz6eH0-2.mjs → messages-DWBtyom42.mjs} +9 -0
  198. package/dist/{messages-DKsyrVp5.mjs → messages-DZQALZIU.mjs} +9 -0
  199. package/dist/{chunks/messages-V8K7-1l2.mjs → messages-D_i86vbQ.mjs} +9 -0
  200. package/dist/{chunks/messages-BmiN0JGP2.mjs → messages-Da1VKvvf2.mjs} +9 -0
  201. package/dist/{messages-D5qgCWmB2.mjs → messages-Ddimgqvp2.mjs} +9 -0
  202. package/dist/{chunks/messages-MPF8o3EP.mjs → messages-DdmXBLUC.mjs} +9 -0
  203. package/dist/{messages-D4U4wkYM.mjs → messages-Devcsnrv.mjs} +9 -0
  204. package/dist/{chunks/messages-DiGsu5XN.mjs → messages-DhS-j4Hp.mjs} +9 -0
  205. package/dist/{messages-BGzpwNrz.mjs → messages-DrRVvVPI.mjs} +9 -0
  206. package/dist/{chunks/messages-Z9mDYT3w.mjs → messages-Ds4gQbVR2.mjs} +9 -0
  207. package/dist/{chunks/messages-vQ5kblO8.mjs → messages-DxkB7LL6.mjs} +9 -0
  208. package/dist/{chunks/messages-LTkIIrSe2.mjs → messages-GgHHrLBU2.mjs} +9 -0
  209. package/dist/{messages-CntTlSE22.mjs → messages-IycPaZe22.mjs} +9 -0
  210. package/dist/{messages-BtDz-sw92.mjs → messages-ST8f_nDx2.mjs} +9 -0
  211. package/dist/{messages-CgVEHCQ-.mjs → messages-SV8lf6F0.mjs} +9 -0
  212. package/dist/{messages-Bt4TLGth.mjs → messages-lVrQmsky.mjs} +9 -0
  213. package/dist/{messages-rpO1POP02.mjs → messages-lcoIGSX82.mjs} +9 -0
  214. package/dist/{chunks/messages-BuYnNUtU2.mjs → messages-mqRVfUUq.mjs} +9 -0
  215. package/dist/{chunks/messages-C24IC_eR.mjs → messages-qWFvoPY1.mjs} +9 -0
  216. package/dist/{messages-CacRpQpm.mjs → messages-yte1QPX5.mjs} +9 -0
  217. package/dist/{messages-DNlrcG5Z.mjs → messages-zyiti_A8.mjs} +9 -0
  218. package/dist/react.cjs +1 -1
  219. package/dist/react.mjs +1 -1
  220. package/dist/tools.cjs +1 -1
  221. package/dist/tools.mjs +3 -3
  222. package/package.json +1 -1
  223. package/src/components/blocks.ts +30 -7
  224. package/src/components/i18n/locales/am/messages.json +9 -0
  225. package/src/components/i18n/locales/ar/messages.json +9 -0
  226. package/src/components/i18n/locales/az/messages.json +9 -0
  227. package/src/components/i18n/locales/bg/messages.json +9 -0
  228. package/src/components/i18n/locales/bn/messages.json +9 -0
  229. package/src/components/i18n/locales/bs/messages.json +9 -0
  230. package/src/components/i18n/locales/cs/messages.json +9 -0
  231. package/src/components/i18n/locales/da/messages.json +9 -0
  232. package/src/components/i18n/locales/de/messages.json +9 -0
  233. package/src/components/i18n/locales/dv/messages.json +9 -0
  234. package/src/components/i18n/locales/el/messages.json +9 -0
  235. package/src/components/i18n/locales/en/messages.json +9 -0
  236. package/src/components/i18n/locales/es/messages.json +9 -0
  237. package/src/components/i18n/locales/et/messages.json +9 -0
  238. package/src/components/i18n/locales/fa/messages.json +9 -0
  239. package/src/components/i18n/locales/fi/messages.json +9 -0
  240. package/src/components/i18n/locales/fil/messages.json +9 -0
  241. package/src/components/i18n/locales/fr/messages.json +9 -0
  242. package/src/components/i18n/locales/gu/messages.json +9 -0
  243. package/src/components/i18n/locales/he/messages.json +9 -0
  244. package/src/components/i18n/locales/hi/messages.json +9 -0
  245. package/src/components/i18n/locales/hr/messages.json +9 -0
  246. package/src/components/i18n/locales/hu/messages.json +9 -0
  247. package/src/components/i18n/locales/hy/messages.json +9 -0
  248. package/src/components/i18n/locales/id/messages.json +9 -0
  249. package/src/components/i18n/locales/it/messages.json +9 -0
  250. package/src/components/i18n/locales/ja/messages.json +9 -0
  251. package/src/components/i18n/locales/ka/messages.json +9 -0
  252. package/src/components/i18n/locales/km/messages.json +9 -0
  253. package/src/components/i18n/locales/kn/messages.json +9 -0
  254. package/src/components/i18n/locales/ko/messages.json +9 -0
  255. package/src/components/i18n/locales/ku/messages.json +9 -0
  256. package/src/components/i18n/locales/lo/messages.json +9 -0
  257. package/src/components/i18n/locales/lt/messages.json +9 -0
  258. package/src/components/i18n/locales/lv/messages.json +9 -0
  259. package/src/components/i18n/locales/mk/messages.json +9 -0
  260. package/src/components/i18n/locales/ml/messages.json +9 -0
  261. package/src/components/i18n/locales/mn/messages.json +9 -0
  262. package/src/components/i18n/locales/mr/messages.json +9 -0
  263. package/src/components/i18n/locales/ms/messages.json +9 -0
  264. package/src/components/i18n/locales/my/messages.json +9 -0
  265. package/src/components/i18n/locales/ne/messages.json +9 -0
  266. package/src/components/i18n/locales/nl/messages.json +9 -0
  267. package/src/components/i18n/locales/no/messages.json +9 -0
  268. package/src/components/i18n/locales/pa/messages.json +9 -0
  269. package/src/components/i18n/locales/pl/messages.json +9 -0
  270. package/src/components/i18n/locales/ps/messages.json +9 -0
  271. package/src/components/i18n/locales/pt/messages.json +9 -0
  272. package/src/components/i18n/locales/ro/messages.json +9 -0
  273. package/src/components/i18n/locales/ru/messages.json +9 -0
  274. package/src/components/i18n/locales/sd/messages.json +9 -0
  275. package/src/components/i18n/locales/si/messages.json +9 -0
  276. package/src/components/i18n/locales/sk/messages.json +9 -0
  277. package/src/components/i18n/locales/sl/messages.json +9 -0
  278. package/src/components/i18n/locales/sq/messages.json +9 -0
  279. package/src/components/i18n/locales/sr/messages.json +9 -0
  280. package/src/components/i18n/locales/sv/messages.json +9 -0
  281. package/src/components/i18n/locales/sw/messages.json +9 -0
  282. package/src/components/i18n/locales/ta/messages.json +9 -0
  283. package/src/components/i18n/locales/te/messages.json +9 -0
  284. package/src/components/i18n/locales/th/messages.json +9 -0
  285. package/src/components/i18n/locales/tr/messages.json +9 -0
  286. package/src/components/i18n/locales/ug/messages.json +9 -0
  287. package/src/components/i18n/locales/uk/messages.json +9 -0
  288. package/src/components/i18n/locales/ur/messages.json +9 -0
  289. package/src/components/i18n/locales/vi/messages.json +9 -0
  290. package/src/components/i18n/locales/yi/messages.json +9 -0
  291. package/src/components/i18n/locales/zh/messages.json +9 -0
  292. package/src/components/icons/index.ts +24 -0
  293. package/src/components/modules/blockEvents/composers/keyboardNavigation.ts +67 -6
  294. package/src/components/modules/blockManager/hierarchy.ts +150 -8
  295. package/src/components/modules/blockManager/operations.ts +207 -8
  296. package/src/components/modules/blockManager/yjs-sync.ts +36 -1
  297. package/src/components/modules/caret.ts +205 -31
  298. package/src/components/modules/drag/DragController.ts +219 -2
  299. package/src/components/modules/drag/a11y/DragA11y.ts +9 -1
  300. package/src/components/modules/drag/state/DragStateMachine.ts +1 -1
  301. package/src/components/modules/drag/target/DropTargetDetector.ts +513 -3
  302. package/src/components/modules/drag/utils/drag.constants.ts +9 -0
  303. package/src/components/modules/toolbar/blockSettings.ts +75 -5
  304. package/src/components/modules/toolbar/index.ts +12 -1
  305. package/src/components/modules/ui.ts +9 -0
  306. package/src/components/modules/uiControllers/controllers/blockHover.ts +24 -2
  307. package/src/components/modules/uiControllers/controllers/selection.ts +50 -0
  308. package/src/components/utils/blocks.ts +21 -7
  309. package/src/styles/colors.css +3 -0
  310. package/src/styles/columns.css +105 -0
  311. package/src/styles/main.css +48 -3
  312. package/src/styles/popover-animation.css +8 -0
  313. package/src/tools/column/index.ts +189 -0
  314. package/src/tools/column/types.ts +26 -0
  315. package/src/tools/column-drop.ts +273 -0
  316. package/src/tools/column-list/index.ts +142 -0
  317. package/src/tools/column-list/types.ts +17 -0
  318. package/src/tools/columns-shared.ts +343 -0
  319. package/src/tools/divider/index.ts +1 -0
  320. package/src/tools/index.ts +4 -0
  321. package/src/tools/nested-blocks.ts +23 -2
  322. package/src/tools/table/table-restrictions.ts +1 -1
  323. package/types/tools/column-list.d.ts +15 -0
  324. package/types/tools/column.d.ts +13 -0
  325. package/types/tools-entry.d.ts +8 -0
  326. package/dist/chunks/blok-C7mseAhu.cjs +0 -17
  327. package/dist/chunks/constants-BZ9pK9tm.cjs +0 -457
  328. package/dist/chunks/lightweight-i18n-Bbl1cNYK.cjs +0 -1
  329. package/dist/chunks/messages-1qYt6EhZ2.cjs +0 -1
  330. package/dist/chunks/messages-2fxvN3Nb.cjs +0 -1
  331. package/dist/chunks/messages-B1Vs2HmR.cjs +0 -1
  332. package/dist/chunks/messages-B780gS332.cjs +0 -1
  333. package/dist/chunks/messages-B7T5Notn.cjs +0 -1
  334. package/dist/chunks/messages-BE9aZQ1Q.cjs +0 -1
  335. package/dist/chunks/messages-BIQpTYfm.cjs +0 -1
  336. package/dist/chunks/messages-BIRvUJ0t.cjs +0 -1
  337. package/dist/chunks/messages-BIodfkjv.cjs +0 -1
  338. package/dist/chunks/messages-BL-zBcuM.cjs +0 -1
  339. package/dist/chunks/messages-BQr0zpmu2.cjs +0 -1
  340. package/dist/chunks/messages-BTHi6rVW2.cjs +0 -1
  341. package/dist/chunks/messages-BZOAdcmO2.cjs +0 -1
  342. package/dist/chunks/messages-BbsGeVs_2.cjs +0 -1
  343. package/dist/chunks/messages-Bc1NYJVS.cjs +0 -1
  344. package/dist/chunks/messages-BdORNG8X.cjs +0 -1
  345. package/dist/chunks/messages-Bg2kheTv.cjs +0 -1
  346. package/dist/chunks/messages-Bj1eQtQw.cjs +0 -1
  347. package/dist/chunks/messages-BkJJCHNK.cjs +0 -1
  348. package/dist/chunks/messages-BkdGQfIX.cjs +0 -1
  349. package/dist/chunks/messages-BkgsB-cj2.cjs +0 -1
  350. package/dist/chunks/messages-Bn0vGFEP.cjs +0 -1
  351. package/dist/chunks/messages-BoIUXwWe.cjs +0 -1
  352. package/dist/chunks/messages-BpDEh8rW.cjs +0 -1
  353. package/dist/chunks/messages-BwknPZJ8.cjs +0 -1
  354. package/dist/chunks/messages-ByicRCge2.cjs +0 -1
  355. package/dist/chunks/messages-C2oBmyTn.cjs +0 -1
  356. package/dist/chunks/messages-C9wBMmxr2.cjs +0 -1
  357. package/dist/chunks/messages-CDK5-8vW.cjs +0 -1
  358. package/dist/chunks/messages-CKHbPcfh.cjs +0 -1
  359. package/dist/chunks/messages-CNFfwTfw.cjs +0 -1
  360. package/dist/chunks/messages-CNiuofck2.cjs +0 -1
  361. package/dist/chunks/messages-CWszAGkF.cjs +0 -1
  362. package/dist/chunks/messages-CWzQNagc2.cjs +0 -1
  363. package/dist/chunks/messages-CYf1gv722.cjs +0 -1
  364. package/dist/chunks/messages-CfcCwbQo.cjs +0 -1
  365. package/dist/chunks/messages-CkvqOnAR.cjs +0 -1
  366. package/dist/chunks/messages-Cnrug7nz2.cjs +0 -1
  367. package/dist/chunks/messages-Cr51zCHy.cjs +0 -1
  368. package/dist/chunks/messages-CsLvvl2F2.cjs +0 -1
  369. package/dist/chunks/messages-CuO-Rx4g.cjs +0 -1
  370. package/dist/chunks/messages-Cv4I3k1W2.cjs +0 -1
  371. package/dist/chunks/messages-CwHRv6g8.cjs +0 -1
  372. package/dist/chunks/messages-CzXnHfGb2.cjs +0 -1
  373. package/dist/chunks/messages-D2QxLx1a.cjs +0 -1
  374. package/dist/chunks/messages-D4LUPpX_.cjs +0 -1
  375. package/dist/chunks/messages-DJFL-bxd2.cjs +0 -1
  376. package/dist/chunks/messages-DLEeNpMi2.cjs +0 -1
  377. package/dist/chunks/messages-DTNU_cq0.cjs +0 -1
  378. package/dist/chunks/messages-DVKsYqpJ.cjs +0 -1
  379. package/dist/chunks/messages-DXlfz-nC.cjs +0 -1
  380. package/dist/chunks/messages-DbA_Zja3.cjs +0 -1
  381. package/dist/chunks/messages-Dc2TTEx_2.cjs +0 -1
  382. package/dist/chunks/messages-DeDMMmRC.cjs +0 -1
  383. package/dist/chunks/messages-DlQNXqzr.cjs +0 -1
  384. package/dist/chunks/messages-DqMqZLcn.cjs +0 -1
  385. package/dist/chunks/messages-DqqDuEE22.cjs +0 -1
  386. package/dist/chunks/messages-DzppdmWe.cjs +0 -1
  387. package/dist/chunks/messages-HzLF-BQL2.cjs +0 -1
  388. package/dist/chunks/messages-Jb9n97oP2.cjs +0 -1
  389. package/dist/chunks/messages-K_vSdSoF2.cjs +0 -1
  390. package/dist/chunks/messages-Nh7wrRdm.cjs +0 -1
  391. package/dist/chunks/messages-QHS-Ydg_.cjs +0 -1
  392. package/dist/chunks/messages-SpiG5vT-2.cjs +0 -1
  393. package/dist/chunks/messages-XFaJzdhP2.cjs +0 -1
  394. package/dist/chunks/messages-y03BGg692.cjs +0 -1
  395. package/dist/chunks/tools-Duq42I9m.cjs +0 -116
@@ -99,6 +99,15 @@
99
99
  "toolNames.board": "బోర్డ్",
100
100
  "toolNames.divider": "విభజకం",
101
101
  "toolNames.quote": "ఉల్లేఖనం",
102
+ "toolNames.columns": "నిలువు వరుసలు",
103
+ "tools.columns.col2": "2 నిలువు వరుసలు",
104
+ "tools.columns.col3": "3 నిలువు వరుసలు",
105
+ "tools.columns.col4": "4 నిలువు వరుసలు",
106
+ "tools.columns.col5": "5 నిలువు వరుసలు",
107
+ "tools.columns.resizeAriaLabel": "నిలువు వరుసల పరిమాణం మార్చు",
108
+ "tools.columns.turnInto": "నిలువు వరుసలకు మార్చు",
109
+ "searchTerms.columns": "నిలువు వరుసలు",
110
+ "searchTerms.layout": "లేఅవుట్",
102
111
  "searchTerms.divider": "విభజకం",
103
112
  "searchTerms.separator": "వేరుచేయు",
104
113
  "searchTerms.delimiter": "వరంబుగుర్తు",
@@ -99,6 +99,15 @@
99
99
  "toolNames.callout": "กล่องเน้น",
100
100
  "toolNames.divider": "เส้นคั่น",
101
101
  "toolNames.quote": "อ้างอิง",
102
+ "toolNames.columns": "คอลัมน์",
103
+ "tools.columns.col2": "2 คอลัมน์",
104
+ "tools.columns.col3": "3 คอลัมน์",
105
+ "tools.columns.col4": "4 คอลัมน์",
106
+ "tools.columns.col5": "5 คอลัมน์",
107
+ "tools.columns.resizeAriaLabel": "ปรับขนาดคอลัมน์",
108
+ "tools.columns.turnInto": "แปลงเป็นคอลัมน์",
109
+ "searchTerms.columns": "คอลัมน์",
110
+ "searchTerms.layout": "เลย์เอาต์",
102
111
  "searchTerms.divider": "ตัวแบ่ง",
103
112
  "searchTerms.separator": "ตัวคั่น",
104
113
  "searchTerms.delimiter": "ตัวแบ่งเขต",
@@ -99,6 +99,15 @@
99
99
  "toolNames.callout": "Bilgi kutusu",
100
100
  "toolNames.divider": "Ayırıcı",
101
101
  "toolNames.quote": "Alıntı",
102
+ "toolNames.columns": "Sütunlar",
103
+ "tools.columns.col2": "2 sütun",
104
+ "tools.columns.col3": "3 sütun",
105
+ "tools.columns.col4": "4 sütun",
106
+ "tools.columns.col5": "5 sütun",
107
+ "tools.columns.resizeAriaLabel": "Sütunları yeniden boyutlandır",
108
+ "tools.columns.turnInto": "Sütunlara dönüştür",
109
+ "searchTerms.columns": "sütunlar",
110
+ "searchTerms.layout": "düzen",
102
111
  "searchTerms.divider": "ayırıcı",
103
112
  "searchTerms.separator": "ayraç",
104
113
  "searchTerms.delimiter": "sınırlayıcı",
@@ -99,6 +99,15 @@
99
99
  "toolNames.callout": "ئەسكەرتىش",
100
100
  "toolNames.divider": "بۆلگۈچ",
101
101
  "toolNames.quote": "نەقىل",
102
+ "toolNames.columns": "ئىستونلار",
103
+ "tools.columns.col2": "2 ئىستون",
104
+ "tools.columns.col3": "3 ئىستون",
105
+ "tools.columns.col4": "4 ئىستون",
106
+ "tools.columns.col5": "5 ئىستون",
107
+ "tools.columns.resizeAriaLabel": "ئىستونلار ئۆلچىمىنى ئۆزگەرتىش",
108
+ "tools.columns.turnInto": "ئىستونلارغا ئايلاندۇرۇش",
109
+ "searchTerms.columns": "ئىستونلار",
110
+ "searchTerms.layout": "تەرتىپ",
102
111
  "searchTerms.divider": "بۆلگۈچ",
103
112
  "searchTerms.separator": "ئايرىغۇچ",
104
113
  "searchTerms.delimiter": "چەكلىگۈچ",
@@ -99,6 +99,15 @@
99
99
  "toolNames.callout": "Виноска",
100
100
  "toolNames.divider": "Роздільник",
101
101
  "toolNames.quote": "Цитата",
102
+ "toolNames.columns": "Стовпці",
103
+ "tools.columns.col2": "2 стовпці",
104
+ "tools.columns.col3": "3 стовпці",
105
+ "tools.columns.col4": "4 стовпці",
106
+ "tools.columns.col5": "5 стовпців",
107
+ "tools.columns.resizeAriaLabel": "Змінити розмір колонок",
108
+ "tools.columns.turnInto": "Перетворити на колонки",
109
+ "searchTerms.columns": "стовпці",
110
+ "searchTerms.layout": "макет",
102
111
  "searchTerms.divider": "роздільник",
103
112
  "searchTerms.separator": "сепаратор",
104
113
  "searchTerms.delimiter": "обмежувач",
@@ -99,6 +99,15 @@
99
99
  "toolNames.callout": "نوٹ",
100
100
  "toolNames.divider": "تقسیم کار",
101
101
  "toolNames.quote": "اقتباس",
102
+ "toolNames.columns": "کالم",
103
+ "tools.columns.col2": "2 کالم",
104
+ "tools.columns.col3": "3 کالم",
105
+ "tools.columns.col4": "4 کالم",
106
+ "tools.columns.col5": "5 کالم",
107
+ "tools.columns.resizeAriaLabel": "کالموں کا سائز تبدیل کریں",
108
+ "tools.columns.turnInto": "کالموں میں تبدیل کریں",
109
+ "searchTerms.columns": "کالم",
110
+ "searchTerms.layout": "ترتیب",
102
111
  "searchTerms.divider": "تقسیم کار",
103
112
  "searchTerms.separator": "جداکار",
104
113
  "searchTerms.delimiter": "حد بندی",
@@ -99,6 +99,15 @@
99
99
  "toolNames.callout": "Chú thích",
100
100
  "toolNames.divider": "Đường phân cách",
101
101
  "toolNames.quote": "Trích dẫn",
102
+ "toolNames.columns": "Cột",
103
+ "tools.columns.col2": "2 cột",
104
+ "tools.columns.col3": "3 cột",
105
+ "tools.columns.col4": "4 cột",
106
+ "tools.columns.col5": "5 cột",
107
+ "tools.columns.resizeAriaLabel": "Thay đổi kích thước cột",
108
+ "tools.columns.turnInto": "Chuyển thành cột",
109
+ "searchTerms.columns": "cột",
110
+ "searchTerms.layout": "bố cục",
102
111
  "searchTerms.divider": "đường phân chia",
103
112
  "searchTerms.separator": "dấu phân cách",
104
113
  "searchTerms.delimiter": "dấu phân tách",
@@ -99,6 +99,15 @@
99
99
  "toolNames.callout": "באַמערקונג",
100
100
  "toolNames.divider": "טיילער",
101
101
  "toolNames.quote": "ציטאַט",
102
+ "toolNames.columns": "שפּאַלטן",
103
+ "tools.columns.col2": "2 שפּאַלטן",
104
+ "tools.columns.col3": "3 שפּאַלטן",
105
+ "tools.columns.col4": "4 שפּאַלטן",
106
+ "tools.columns.col5": "5 שפּאַלטן",
107
+ "tools.columns.resizeAriaLabel": "ענדערן קאָלאָנען גרייס",
108
+ "tools.columns.turnInto": "פֿאַרוואַנדלען אין קאָלאָנען",
109
+ "searchTerms.columns": "שפּאַלטן",
110
+ "searchTerms.layout": "לייאַוט",
102
111
  "searchTerms.divider": "טיילער",
103
112
  "searchTerms.separator": "אָפּטיילער",
104
113
  "searchTerms.delimiter": "באגרענעצער",
@@ -99,6 +99,15 @@
99
99
  "toolNames.callout": "标注",
100
100
  "toolNames.divider": "分隔线",
101
101
  "toolNames.quote": "引用",
102
+ "toolNames.columns": "分栏",
103
+ "tools.columns.col2": "2 列",
104
+ "tools.columns.col3": "3 列",
105
+ "tools.columns.col4": "4 列",
106
+ "tools.columns.col5": "5 列",
107
+ "tools.columns.resizeAriaLabel": "调整列宽",
108
+ "tools.columns.turnInto": "转换为列",
109
+ "searchTerms.columns": "分栏",
110
+ "searchTerms.layout": "布局",
102
111
  "searchTerms.divider": "分割线",
103
112
  "searchTerms.separator": "分隔符",
104
113
  "searchTerms.delimiter": "定界符",
@@ -753,3 +753,27 @@ export const IconCrossSmall = '<svg width="14" height="14" viewBox="0 0 14 14" f
753
753
 
754
754
  // Toggle expand/collapse chevron — 12×12 so it fits the toggle arrow button
755
755
  export const IconChevronRightSmall = '<svg aria-hidden="true" width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M4.5 2.5L8.5 6L4.5 9.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>';
756
+
757
+ // Columns layout tool — two side-by-side column rectangles
758
+ export const IconColumns = `<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="7" height="16" rx="1"/><rect x="14" y="4" width="7" height="16" rx="1"/></svg>`;
759
+
760
+ /**
761
+ * Builds a columns-preset icon: one rounded frame split by `count - 1` evenly
762
+ * spaced dividers, so it reads as a container holding exactly `count` columns
763
+ * and keeps a constant stroke weight at any count (avoids the cramped barcode
764
+ * look of N separate bars). Used by the ColumnList toolbox presets (2–5).
765
+ */
766
+ export const buildIconColumnsCount = (count: number): string => {
767
+ const x = 3;
768
+ const y = 4;
769
+ const w = 18;
770
+ const h = 16;
771
+ const step = w / count;
772
+ const dividers = Array.from({ length: count - 1 }, (_, i) => {
773
+ const dx = +(x + step * (i + 1)).toFixed(2);
774
+
775
+ return `<line x1="${dx}" y1="${y}" x2="${dx}" y2="${y + h}"/>`;
776
+ }).join('');
777
+
778
+ return `<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="${x}" y="${y}" width="${w}" height="${h}" rx="2"/>${dividers}</svg>`;
779
+ };
@@ -235,6 +235,19 @@ export class KeyboardNavigation extends BlockEventComposer {
235
235
  return null;
236
236
  }
237
237
 
238
+ /**
239
+ * Columns must never be unwrapped by Enter. A 'column' is a single-child
240
+ * non-toggle container whose own parent is a 'column_list'. Promoting its
241
+ * empty sole child after the parent index would insert a new block at the
242
+ * document root (parentId=null), escaping the column and stranding the
243
+ * holder at the workingArea root. Returning null falls through to the
244
+ * normal Case 2 path, which re-parents the new sibling into the same
245
+ * column and leaves the column_list intact.
246
+ */
247
+ if (parentBlock.name === 'column' || parentBlock.name === 'column_list') {
248
+ return null;
249
+ }
250
+
238
251
  /**
239
252
  * Non-toggle containers (e.g. callout): when the only child is empty,
240
253
  * exit by inserting a new block after the container. The container and
@@ -372,14 +385,19 @@ export class KeyboardNavigation extends BlockEventComposer {
372
385
  *
373
386
  * Skip this guard for table cell blocks — they use a separate mechanism.
374
387
  */
375
- if (currentBlock.parentId != null && !this.isCurrentBlockInsideTableCell) {
376
- if (previousBlock === null || previousBlock.parentId !== currentBlock.parentId) {
377
- this.removeEmptyToggleChildAndFocusNext(currentBlock);
388
+ const hasNoPreviousSiblingInParent = previousBlock === null ||
389
+ previousBlock.parentId !== currentBlock.parentId;
378
390
 
379
- return;
391
+ if (currentBlock.parentId != null && !this.isCurrentBlockInsideTableCell && hasNoPreviousSiblingInParent) {
392
+ // A column's sole empty child collapses the column itself; otherwise
393
+ // fall back to the toggle-child behaviour (remove + focus next sibling).
394
+ if (!this.removeSoleEmptyColumnChild(currentBlock)) {
395
+ this.removeEmptyToggleChildAndFocusNext(currentBlock);
380
396
  }
381
- // Previous sibling exists in the same parent — fall through to merge/remove logic
397
+
398
+ return;
382
399
  }
400
+ // Previous sibling exists in the same parent — fall through to merge/remove logic
383
401
 
384
402
  /**
385
403
  * Don't merge across table cell boundaries.
@@ -525,7 +543,15 @@ export class KeyboardNavigation extends BlockEventComposer {
525
543
  */
526
544
  const prevBlock = BlockManager.previousBlock;
527
545
 
528
- if (currentBlock.parentId !== null && (prevBlock === null || prevBlock.parentId !== currentBlock.parentId)) {
546
+ const hasNoPrevSiblingInParent = prevBlock === null || prevBlock.parentId !== currentBlock.parentId;
547
+
548
+ if (currentBlock.parentId !== null && hasNoPrevSiblingInParent) {
549
+ // A column's sole empty child collapses the column itself rather than
550
+ // being a no-op like a toggle child.
551
+ const collapsed = this.removeSoleEmptyColumnChild(currentBlock);
552
+
553
+ collapsed && this.closeToolbarIfNotInTableCell();
554
+
529
555
  return;
530
556
  }
531
557
 
@@ -879,4 +905,39 @@ export class KeyboardNavigation extends BlockEventComposer {
879
905
  }
880
906
  }
881
907
 
908
+ /**
909
+ * When `block` is the SOLE child of a `column` and is empty, remove it so the
910
+ * now-empty column is dropped: a column is pure layout and must not linger
911
+ * empty. BlockManager.removeBlock cascades — deleting the last child removes
912
+ * the column, which unwraps the column_list if it collapses to one column.
913
+ *
914
+ * Returns true when it handled the removal. A column with OTHER children is
915
+ * left to the generic empty-child path so the column survives, so this only
916
+ * fires for the sole-child case (returns false otherwise — including for
917
+ * non-column parents such as toggles/callouts).
918
+ */
919
+ private removeSoleEmptyColumnChild(block: Block): boolean {
920
+ if (!block.isEmpty || block.parentId === null) {
921
+ return false;
922
+ }
923
+
924
+ const parentBlock = this.Blok.BlockManager.getBlockById(block.parentId);
925
+
926
+ if (parentBlock === undefined || parentBlock.name !== 'column' || parentBlock.contentIds.length > 1) {
927
+ return false;
928
+ }
929
+
930
+ const { BlockManager, Caret } = this.Blok;
931
+
932
+ void BlockManager.removeBlock(block);
933
+
934
+ const newCurrentBlock = BlockManager.currentBlock;
935
+
936
+ if (newCurrentBlock) {
937
+ Caret.setToBlock(newCurrentBlock, Caret.positions.END);
938
+ }
939
+
940
+ return true;
941
+ }
942
+
882
943
  }
@@ -212,7 +212,18 @@ export class BlockHierarchy {
212
212
  // If old parent had a toggle child container and this block was in it, move it to the
213
213
  // position indicated by the flat array. moveBlocks() updates the flat array before
214
214
  // setBlockParent() is called, so getBlockIndex() reflects the intended drop position.
215
- const oldContainer = oldParent !== undefined ? oldParent.holder.querySelector('[data-blok-toggle-children]') : null;
215
+ //
216
+ // Guard: only relocate the holder OUT of the toggle when the block is actually
217
+ // LEAVING its toggle parent (new parent differs from the old one). When the
218
+ // parent is unchanged the block is merely following its own relocated parent —
219
+ // e.g. a toggle dragged between columns carries its child along, and
220
+ // DragController re-asserts the child's parent via setBlockParent(child, sameToggle)
221
+ // to fix DOM placement. Yanking it to root here would strand the child outside
222
+ // the toggle even though it still belongs to it (the toggle-child-rides-along bug).
223
+ const oldContainer =
224
+ oldParent !== undefined && sanitizedParentId !== oldParentId
225
+ ? oldParent.holder.querySelector('[data-blok-toggle-children]')
226
+ : null;
216
227
 
217
228
  if (oldContainer && block.holder.parentElement === oldContainer) {
218
229
  // Scan backwards in the flat array for the nearest block whose holder is at root
@@ -268,13 +279,68 @@ export class BlockHierarchy {
268
279
  }
269
280
  }
270
281
 
271
- // Move block holder into toggle child container if the new parent has one,
272
- // honouring the flat-array order so the DOM order matches the logical order.
273
- // Skip if the holder is already claimed by another nested-blocks container
274
- // (e.g. a table cell) moving it would steal it from that container.
275
- if (sanitizedParentId !== null && newParent !== undefined && !block.holder.closest(`[${DATA_ATTR.nestedBlocks}]`)) {
276
- const newContainer = newParent.holder.querySelector('[data-blok-toggle-children]');
277
- if (newContainer) {
282
+ // Move block holder into the new parent's direct child container, honouring
283
+ // the flat-array order so the DOM order matches the logical order.
284
+ //
285
+ // The target container may be a toggle/callout container ([data-blok-toggle-children])
286
+ // or a generic nested-blocks container ([data-blok-nested-blocks], used by
287
+ // columns and column_list). querySelector returns the FIRST match in
288
+ // document order: because a parent's own child container is a direct child of
289
+ // its wrapper, it always precedes any grandchild container (which lives INSIDE
290
+ // it, deeper in document order). So this resolves to the parent's own direct
291
+ // container, never a deeper one belonging to a nested block.
292
+ //
293
+ // Skip guard: keep the original behaviour of refusing to move a holder that
294
+ // is already claimed by SOME nested-blocks container (e.g. a table cell) —
295
+ // moving it would steal it from that container. The one loosening Track C
296
+ // needs is to still mount when the target is the holder's CURRENT container
297
+ // already (a no-op insertBefore that re-asserts flat order); we express that
298
+ // by only skipping when the holder's nearest nested container is DIFFERENT
299
+ // from the target container.
300
+ if (sanitizedParentId !== null && newParent !== undefined) {
301
+ const newContainer = newParent.holder.querySelector(
302
+ '[data-blok-toggle-children], [data-blok-nested-blocks]'
303
+ );
304
+ const currentNestedContainer = block.holder.closest(`[${DATA_ATTR.nestedBlocks}]`);
305
+
306
+ // A column→column move is a legitimate reparent driven by the drag system:
307
+ // the holder must follow the model into the destination column. The
308
+ // anti-stealing guard targets corrupted multi-references across tool
309
+ // containers (table cell / toggle / callout / header), never the columns
310
+ // flex layout. A column's child container is identifiable because its
311
+ // PARENT is the [data-blok-column] wrapper — that precisely separates the
312
+ // two cases (a toggle nested inside a column would not match).
313
+ const isColumnContainer = (container: Element | null): boolean =>
314
+ container?.parentElement?.matches('[data-blok-column]') === true;
315
+ // The column_list's own child container is the columns row. A `column`
316
+ // block always belongs to a columns row, so mounting one into a row is a
317
+ // legitimate structural reparent — never a steal. This is the case the
318
+ // drag-beside "add a column" path hits: api.blocks.insert anchors the new
319
+ // column's holder next to a SIBLING column's child block (the new column's
320
+ // flat index falls inside that sibling's child range), so the holder lands
321
+ // inside that sibling column's container. Without this allowance the guard
322
+ // below refuses to move it out, stranding the new column nested INSIDE its
323
+ // sibling instead of placing it beside it in the row.
324
+ const isColumnsRow = (container: Element | null): boolean =>
325
+ container?.matches('[data-blok-columns]') === true;
326
+ // A block whose model parent is a column but whose holder is currently
327
+ // stranded in the column_list's flex row (the columns row) must be
328
+ // relocated INTO the target column's child container. This is the
329
+ // Enter/split-in-column strand: the split insert anchors the new holder
330
+ // 'beforebegin' the sibling column in the row, so its nearest nested
331
+ // container resolves to the columns row, not a real column. Allow the
332
+ // move when the holder sits in the row and the destination is a genuine
333
+ // column child container — it was never legitimately "claimed" by the row.
334
+ const strandedInColumnsRow =
335
+ isColumnsRow(currentNestedContainer) && isColumnContainer(newContainer);
336
+ const claimedByOtherContainer =
337
+ currentNestedContainer !== null &&
338
+ currentNestedContainer !== newContainer &&
339
+ !(isColumnContainer(currentNestedContainer) && isColumnContainer(newContainer)) &&
340
+ !isColumnsRow(newContainer) &&
341
+ !strandedInColumnsRow;
342
+
343
+ if (newContainer && !claimedByOtherContainer) {
278
344
  const allBlocks = this.repository.blocks;
279
345
  const blockIdx = allBlocks.indexOf(block);
280
346
  const nextSiblingHolder = allBlocks.slice(blockIdx + 1).find(
@@ -286,6 +352,30 @@ export class BlockHierarchy {
286
352
  }
287
353
  }
288
354
 
355
+ // Escaping a column for ROOT. The positional blocksStore.move() skips the
356
+ // DOM move while the holder is nested (it follows its parent container by
357
+ // default — correct for table cells), and the mount-into-container branch
358
+ // above only runs for a non-null parent — so a block dragged OUT of a
359
+ // column to root would otherwise stay stranded in the column's container
360
+ // while the model says root (a model-vs-DOM divergence). Relocate the
361
+ // holder to the workingArea at its flat-array position. Toggle/callout/
362
+ // header escapes are handled by the [data-blok-toggle-children] block near
363
+ // the top of this method; table cells manage their own DOM and block
364
+ // cross-cell drops upstream — so this is scoped to columns only.
365
+ if (sanitizedParentId === null && block.holder.closest('[data-blok-column]') !== null) {
366
+ const allBlocks = this.repository.blocks;
367
+ const blockIndex = allBlocks.indexOf(block);
368
+ const isAtRoot = (b: Block): boolean => b.holder.closest(`[${DATA_ATTR.nestedBlocks}]`) === null;
369
+ const precedingRoot = allBlocks.slice(0, blockIndex).reverse().find(isAtRoot);
370
+ const followingRoot = allBlocks.slice(blockIndex + 1).find(isAtRoot);
371
+
372
+ if (precedingRoot !== undefined) {
373
+ precedingRoot.holder.insertAdjacentElement('afterend', block.holder);
374
+ } else if (followingRoot !== undefined) {
375
+ followingRoot.holder.insertAdjacentElement('beforebegin', block.holder);
376
+ }
377
+ }
378
+
289
379
  // Update visual indentation
290
380
  this.updateBlockIndentation(block);
291
381
 
@@ -295,6 +385,37 @@ export class BlockHierarchy {
295
385
  }
296
386
  }
297
387
 
388
+ /**
389
+ * Walks the block's parentId chain and returns true if any ancestor is a
390
+ * `column` or `column_list` block — i.e. the block lives inside a columns
391
+ * layout in the block tree, regardless of whether its holder has been
392
+ * mounted into the columns DOM yet. Cycle-safe via a visited set.
393
+ * @param block - the block to test
394
+ * @returns true if a column/column_list ancestor exists
395
+ */
396
+ private hasColumnAncestor(block: Block): boolean {
397
+ const walk = (parentId: string | null, visited: Set<string>): boolean => {
398
+ if (parentId === null || visited.has(parentId)) {
399
+ return false;
400
+ }
401
+ visited.add(parentId);
402
+
403
+ const parent = this.repository.getBlockById(parentId);
404
+
405
+ if (parent === undefined) {
406
+ return false;
407
+ }
408
+
409
+ if (parent.name === 'column' || parent.name === 'column_list') {
410
+ return true;
411
+ }
412
+
413
+ return walk(parent.parentId, visited);
414
+ };
415
+
416
+ return walk(block.parentId, new Set<string>());
417
+ }
418
+
298
419
  /**
299
420
  * Updates the visual indentation of a block based on its depth in the hierarchy.
300
421
  * @param block - the block to update indentation for
@@ -319,6 +440,27 @@ export class BlockHierarchy {
319
440
  return;
320
441
  }
321
442
 
443
+ // Columns are a flex layout: the column_list block, its column children, and
444
+ // every block inside a column are positioned by flex, not block-tree depth.
445
+ // Depth-based margin would push the column holders off their even split and
446
+ // indent the column content. Keep them flush.
447
+ //
448
+ // The DOM check (`closest`) misses blocks indented BEFORE their holder is
449
+ // mounted into the columns container — e.g. a toolbox-seeded paragraph,
450
+ // whose indentation runs during insertInsideParent, before the Column tool
451
+ // appends it. The column ancestry is always in the block tree, so consult
452
+ // that too rather than relying on DOM placement timing.
453
+ if (
454
+ block.name === 'column_list' ||
455
+ holder.closest('[data-blok-columns]') ||
456
+ this.hasColumnAncestor(block)
457
+ ) {
458
+ holder.style.marginLeft = '';
459
+ holder.setAttribute('data-blok-depth', '0');
460
+
461
+ return;
462
+ }
463
+
322
464
  const depth = this.getBlockDepth(block);
323
465
  const indentationPx = depth * 24; // 24px per level
324
466