@jackuait/blok 0.6.0-beta.9 → 0.7.0-beta.1

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 (336) hide show
  1. package/dist/blok.mjs +2 -2
  2. package/dist/chunks/{blok-Bn6Q_o8h.mjs → blok-ob9Fwr1L.mjs} +3414 -2975
  3. package/dist/chunks/i18next-B47TKgbU.mjs +1303 -0
  4. package/dist/chunks/{i18next-loader-DjR4d8M7.mjs → i18next-loader-Bu3vFvye.mjs} +2 -2
  5. package/dist/chunks/{index-oe38cp86.mjs → index-CZmRzRIX.mjs} +12 -12
  6. package/dist/chunks/{inline-tool-convert-SRTkyaZn.mjs → inline-tool-convert-CvFW2iie.mjs} +1579 -961
  7. package/dist/chunks/{messages-BogRq8lt.mjs → messages-0AbcLMLm.mjs} +6 -0
  8. package/dist/chunks/{messages-DJDG55Vq.mjs → messages-0E0AkrNu.mjs} +6 -0
  9. package/dist/{messages-DnXLrlHh.mjs → chunks/messages-4v4MuVEc.mjs} +6 -0
  10. package/dist/chunks/{messages-DnIhyAJk.mjs → messages-62v-CLC-.mjs} +6 -0
  11. package/dist/chunks/{messages-Dzwxv9v1.mjs → messages-8DeO60Oo.mjs} +6 -0
  12. package/dist/chunks/{messages-B1Aww8q7.mjs → messages-8IPXkrDl.mjs} +6 -0
  13. package/dist/{messages-uKX8WBaD.mjs → chunks/messages-96kNZDll.mjs} +6 -0
  14. package/dist/chunks/{messages-BL0tXcDf.mjs → messages-B1FZ8lxU.mjs} +6 -0
  15. package/dist/{messages-DBn76jVV.mjs → chunks/messages-B217znr-.mjs} +8 -2
  16. package/dist/{messages-DT4dP5uK.mjs → chunks/messages-B8WNljW3.mjs} +6 -0
  17. package/dist/chunks/{messages-BdeLo0N9.mjs → messages-BC8IN4Bf.mjs} +6 -0
  18. package/dist/{messages-CZygwLwM.mjs → chunks/messages-BI43k_BD.mjs} +6 -0
  19. package/dist/{messages-CzTufCHu.mjs → chunks/messages-BJ6zrz2j.mjs} +6 -0
  20. package/dist/{messages-BoJc_p1r.mjs → chunks/messages-BUl_Rcnj.mjs} +6 -0
  21. package/dist/chunks/{messages-CnwibSvh.mjs → messages-BZlmVRwn.mjs} +6 -0
  22. package/dist/{messages-C2htQ_3F.mjs → chunks/messages-BcpCubnC.mjs} +6 -0
  23. package/dist/{messages-D5C3J9qr.mjs → chunks/messages-Bm-E4iRC.mjs} +6 -0
  24. package/dist/chunks/{messages-BELRf6DU.mjs → messages-C4jL-90N.mjs} +6 -0
  25. package/dist/chunks/{messages-1fC8IMyX.mjs → messages-CDBLbUOQ.mjs} +6 -0
  26. package/dist/chunks/{messages-7QoX8DkW.mjs → messages-CH4hrauY.mjs} +6 -0
  27. package/dist/{messages-Dz9L52ol.mjs → chunks/messages-CRJ_mchV.mjs} +6 -0
  28. package/dist/chunks/{messages-JELdtT6E.mjs → messages-CW4c4cRk.mjs} +6 -0
  29. package/dist/chunks/{messages-CKI54h6O.mjs → messages-C_4otP7U.mjs} +6 -0
  30. package/dist/{messages-R3hUSvr3.mjs → chunks/messages-CfiyT2Wi.mjs} +6 -0
  31. package/dist/{messages-CJdUsQ-c.mjs → chunks/messages-CgTq3QhU.mjs} +6 -0
  32. package/dist/chunks/{messages-D1Hv8XGo.mjs → messages-Chb7k3Rg.mjs} +6 -0
  33. package/dist/{messages-Q7AO_FLv.mjs → chunks/messages-Cjjo7yHR.mjs} +6 -0
  34. package/dist/{messages-C99mq906.mjs → chunks/messages-Cl6ayUaq.mjs} +6 -0
  35. package/dist/chunks/{messages-Diu6jAaR.mjs → messages-CmR9ftc_.mjs} +6 -0
  36. package/dist/chunks/{messages-LPVfA-8K.mjs → messages-Cr49Nt3U.mjs} +6 -0
  37. package/dist/chunks/{messages-DqM1LFg5.mjs → messages-Cr94GzbX.mjs} +6 -0
  38. package/dist/{messages-BWF-zUpY.mjs → chunks/messages-CrCYPCk3.mjs} +6 -0
  39. package/dist/{messages-D-ZtY5v0.mjs → chunks/messages-Cs8zmZ3L.mjs} +6 -0
  40. package/dist/{messages-DprmQg6V.mjs → chunks/messages-CzK0LEhb.mjs} +6 -0
  41. package/dist/chunks/{messages-BSbjsyHY.mjs → messages-D00x4S8o.mjs} +6 -0
  42. package/dist/chunks/{messages-Xq8UmkVs.mjs → messages-D1mn7Zd5.mjs} +6 -0
  43. package/dist/chunks/{messages-BC86qLvI.mjs → messages-D2NOpHn9.mjs} +6 -0
  44. package/dist/{messages-kep5wtm4.mjs → chunks/messages-D4qqwVgQ.mjs} +6 -0
  45. package/dist/chunks/{messages-7W4d0DwD.mjs → messages-D5S1Dnpm.mjs} +6 -0
  46. package/dist/{messages-CY8_RyFE.mjs → chunks/messages-D7u2bmP2.mjs} +6 -0
  47. package/dist/chunks/{messages-BFG6Wlgy.mjs → messages-D85FqxgY.mjs} +6 -0
  48. package/dist/{messages-DLfR5bMd.mjs → chunks/messages-D9ndgBnU.mjs} +6 -0
  49. package/dist/{messages-CVw84KdI.mjs → chunks/messages-DDTQgImT.mjs} +6 -0
  50. package/dist/{messages-_ErNTNhk.mjs → chunks/messages-DH_jBeED.mjs} +6 -0
  51. package/dist/chunks/{messages-CMkNSDTo.mjs → messages-DRXWF0PV.mjs} +6 -0
  52. package/dist/chunks/{messages-BYyy6Wqf.mjs → messages-DVQvl8Qj.mjs} +6 -0
  53. package/dist/chunks/{messages-CznZadDf.mjs → messages-DXktiao_.mjs} +6 -0
  54. package/dist/chunks/{messages-DhLKYm2j.mjs → messages-DdK-nFGm.mjs} +6 -0
  55. package/dist/chunks/{messages-BMXCuEKO.mjs → messages-DlJbPF2T.mjs} +6 -0
  56. package/dist/chunks/{messages-CvGLfqmV.mjs → messages-DnVlmiNT.mjs} +6 -0
  57. package/dist/{messages-Z9nEU2xK.mjs → chunks/messages-DviiFSv2.mjs} +6 -0
  58. package/dist/chunks/{messages-BB5z9Uba.mjs → messages-DzqM3Fel.mjs} +6 -0
  59. package/dist/{messages-w7v1GNaE.mjs → chunks/messages-Dzzn6XoD.mjs} +6 -0
  60. package/dist/{messages-CqWJcCbY.mjs → chunks/messages-GSByFygY.mjs} +6 -0
  61. package/dist/chunks/{messages-_ncGrKHh.mjs → messages-L_kl2Qvh.mjs} +6 -0
  62. package/dist/chunks/{messages-BrPFGbM-.mjs → messages-Phkd7XmE.mjs} +6 -0
  63. package/dist/{messages-BU2nlrLK.mjs → chunks/messages-RonBBCnh.mjs} +6 -0
  64. package/dist/{messages-Bmu_S7GM.mjs → chunks/messages-VDriF5Qy.mjs} +6 -0
  65. package/dist/{messages-CLhcMlTc.mjs → chunks/messages-ZjUAIWb1.mjs} +6 -0
  66. package/dist/{messages-9SihnaXQ.mjs → chunks/messages-b1EdvUm0.mjs} +6 -0
  67. package/dist/{messages-DvFLX36Q.mjs → chunks/messages-begYOTgC.mjs} +6 -0
  68. package/dist/{messages-BMv4xwIr.mjs → chunks/messages-jrncnb-H.mjs} +6 -0
  69. package/dist/{messages-D5iv1Kox.mjs → chunks/messages-nefz1S71.mjs} +6 -0
  70. package/dist/{messages-CQwpzUFp.mjs → chunks/messages-ucTVgS5G.mjs} +6 -0
  71. package/dist/chunks/{messages-DBRw-7Zc.mjs → messages-v3GipbFl.mjs} +6 -0
  72. package/dist/{messages-C9eaarcK.mjs → chunks/messages-wmi-iFkH.mjs} +6 -0
  73. package/dist/chunks/{messages-O5tQus_0.mjs → messages-yHcs38yI.mjs} +6 -0
  74. package/dist/full.mjs +30 -27
  75. package/dist/locales.mjs +90 -84
  76. package/dist/{messages-BogRq8lt.mjs → messages-0AbcLMLm.mjs} +6 -0
  77. package/dist/{messages-DJDG55Vq.mjs → messages-0E0AkrNu.mjs} +6 -0
  78. package/dist/{chunks/messages-DnXLrlHh.mjs → messages-4v4MuVEc.mjs} +6 -0
  79. package/dist/{messages-DnIhyAJk.mjs → messages-62v-CLC-.mjs} +6 -0
  80. package/dist/{messages-Dzwxv9v1.mjs → messages-8DeO60Oo.mjs} +6 -0
  81. package/dist/{messages-B1Aww8q7.mjs → messages-8IPXkrDl.mjs} +6 -0
  82. package/dist/{chunks/messages-uKX8WBaD.mjs → messages-96kNZDll.mjs} +6 -0
  83. package/dist/{messages-BL0tXcDf.mjs → messages-B1FZ8lxU.mjs} +6 -0
  84. package/dist/{chunks/messages-DBn76jVV.mjs → messages-B217znr-.mjs} +8 -2
  85. package/dist/{chunks/messages-DT4dP5uK.mjs → messages-B8WNljW3.mjs} +6 -0
  86. package/dist/{messages-BdeLo0N9.mjs → messages-BC8IN4Bf.mjs} +6 -0
  87. package/dist/{chunks/messages-CZygwLwM.mjs → messages-BI43k_BD.mjs} +6 -0
  88. package/dist/{chunks/messages-CzTufCHu.mjs → messages-BJ6zrz2j.mjs} +6 -0
  89. package/dist/{chunks/messages-BoJc_p1r.mjs → messages-BUl_Rcnj.mjs} +6 -0
  90. package/dist/{messages-CnwibSvh.mjs → messages-BZlmVRwn.mjs} +6 -0
  91. package/dist/{chunks/messages-C2htQ_3F.mjs → messages-BcpCubnC.mjs} +6 -0
  92. package/dist/{chunks/messages-D5C3J9qr.mjs → messages-Bm-E4iRC.mjs} +6 -0
  93. package/dist/{messages-BELRf6DU.mjs → messages-C4jL-90N.mjs} +6 -0
  94. package/dist/{messages-1fC8IMyX.mjs → messages-CDBLbUOQ.mjs} +6 -0
  95. package/dist/{messages-7QoX8DkW.mjs → messages-CH4hrauY.mjs} +6 -0
  96. package/dist/{chunks/messages-Dz9L52ol.mjs → messages-CRJ_mchV.mjs} +6 -0
  97. package/dist/{messages-JELdtT6E.mjs → messages-CW4c4cRk.mjs} +6 -0
  98. package/dist/{messages-CKI54h6O.mjs → messages-C_4otP7U.mjs} +6 -0
  99. package/dist/{chunks/messages-R3hUSvr3.mjs → messages-CfiyT2Wi.mjs} +6 -0
  100. package/dist/{chunks/messages-CJdUsQ-c.mjs → messages-CgTq3QhU.mjs} +6 -0
  101. package/dist/{messages-D1Hv8XGo.mjs → messages-Chb7k3Rg.mjs} +6 -0
  102. package/dist/{chunks/messages-Q7AO_FLv.mjs → messages-Cjjo7yHR.mjs} +6 -0
  103. package/dist/{chunks/messages-C99mq906.mjs → messages-Cl6ayUaq.mjs} +6 -0
  104. package/dist/{messages-Diu6jAaR.mjs → messages-CmR9ftc_.mjs} +6 -0
  105. package/dist/{messages-LPVfA-8K.mjs → messages-Cr49Nt3U.mjs} +6 -0
  106. package/dist/{messages-DqM1LFg5.mjs → messages-Cr94GzbX.mjs} +6 -0
  107. package/dist/{chunks/messages-BWF-zUpY.mjs → messages-CrCYPCk3.mjs} +6 -0
  108. package/dist/{chunks/messages-D-ZtY5v0.mjs → messages-Cs8zmZ3L.mjs} +6 -0
  109. package/dist/{chunks/messages-DprmQg6V.mjs → messages-CzK0LEhb.mjs} +6 -0
  110. package/dist/{messages-BSbjsyHY.mjs → messages-D00x4S8o.mjs} +6 -0
  111. package/dist/{messages-Xq8UmkVs.mjs → messages-D1mn7Zd5.mjs} +6 -0
  112. package/dist/{messages-BC86qLvI.mjs → messages-D2NOpHn9.mjs} +6 -0
  113. package/dist/{chunks/messages-kep5wtm4.mjs → messages-D4qqwVgQ.mjs} +6 -0
  114. package/dist/{messages-7W4d0DwD.mjs → messages-D5S1Dnpm.mjs} +6 -0
  115. package/dist/{chunks/messages-CY8_RyFE.mjs → messages-D7u2bmP2.mjs} +6 -0
  116. package/dist/{messages-BFG6Wlgy.mjs → messages-D85FqxgY.mjs} +6 -0
  117. package/dist/{chunks/messages-DLfR5bMd.mjs → messages-D9ndgBnU.mjs} +6 -0
  118. package/dist/{chunks/messages-CVw84KdI.mjs → messages-DDTQgImT.mjs} +6 -0
  119. package/dist/{chunks/messages-_ErNTNhk.mjs → messages-DH_jBeED.mjs} +6 -0
  120. package/dist/{messages-CMkNSDTo.mjs → messages-DRXWF0PV.mjs} +6 -0
  121. package/dist/{messages-BYyy6Wqf.mjs → messages-DVQvl8Qj.mjs} +6 -0
  122. package/dist/{messages-CznZadDf.mjs → messages-DXktiao_.mjs} +6 -0
  123. package/dist/{messages-DhLKYm2j.mjs → messages-DdK-nFGm.mjs} +6 -0
  124. package/dist/{messages-BMXCuEKO.mjs → messages-DlJbPF2T.mjs} +6 -0
  125. package/dist/{messages-CvGLfqmV.mjs → messages-DnVlmiNT.mjs} +6 -0
  126. package/dist/{chunks/messages-Z9nEU2xK.mjs → messages-DviiFSv2.mjs} +6 -0
  127. package/dist/{messages-BB5z9Uba.mjs → messages-DzqM3Fel.mjs} +6 -0
  128. package/dist/{chunks/messages-w7v1GNaE.mjs → messages-Dzzn6XoD.mjs} +6 -0
  129. package/dist/{chunks/messages-CqWJcCbY.mjs → messages-GSByFygY.mjs} +6 -0
  130. package/dist/{messages-_ncGrKHh.mjs → messages-L_kl2Qvh.mjs} +6 -0
  131. package/dist/{messages-BrPFGbM-.mjs → messages-Phkd7XmE.mjs} +6 -0
  132. package/dist/{chunks/messages-BU2nlrLK.mjs → messages-RonBBCnh.mjs} +6 -0
  133. package/dist/{chunks/messages-Bmu_S7GM.mjs → messages-VDriF5Qy.mjs} +6 -0
  134. package/dist/{chunks/messages-CLhcMlTc.mjs → messages-ZjUAIWb1.mjs} +6 -0
  135. package/dist/{chunks/messages-9SihnaXQ.mjs → messages-b1EdvUm0.mjs} +6 -0
  136. package/dist/{chunks/messages-DvFLX36Q.mjs → messages-begYOTgC.mjs} +6 -0
  137. package/dist/{chunks/messages-BMv4xwIr.mjs → messages-jrncnb-H.mjs} +6 -0
  138. package/dist/{chunks/messages-D5iv1Kox.mjs → messages-nefz1S71.mjs} +6 -0
  139. package/dist/{chunks/messages-CQwpzUFp.mjs → messages-ucTVgS5G.mjs} +6 -0
  140. package/dist/{messages-DBRw-7Zc.mjs → messages-v3GipbFl.mjs} +6 -0
  141. package/dist/{chunks/messages-C9eaarcK.mjs → messages-wmi-iFkH.mjs} +6 -0
  142. package/dist/{messages-O5tQus_0.mjs → messages-yHcs38yI.mjs} +6 -0
  143. package/dist/tools.mjs +3537 -1710
  144. package/dist/vendor.LICENSE.txt +109 -109
  145. package/package.json +43 -57
  146. package/src/blok.ts +12 -0
  147. package/src/components/__module.ts +21 -0
  148. package/src/components/block/api.ts +17 -0
  149. package/src/components/block/style-manager.ts +6 -2
  150. package/src/components/block/tool-renderer.ts +33 -30
  151. package/src/components/blocks.ts +132 -15
  152. package/src/components/constants/data-attributes.ts +7 -0
  153. package/src/components/i18n/locales/am/messages.json +6 -0
  154. package/src/components/i18n/locales/ar/messages.json +6 -0
  155. package/src/components/i18n/locales/az/messages.json +6 -0
  156. package/src/components/i18n/locales/bg/messages.json +6 -0
  157. package/src/components/i18n/locales/bn/messages.json +6 -0
  158. package/src/components/i18n/locales/bs/messages.json +6 -0
  159. package/src/components/i18n/locales/cs/messages.json +6 -0
  160. package/src/components/i18n/locales/da/messages.json +6 -0
  161. package/src/components/i18n/locales/de/messages.json +6 -0
  162. package/src/components/i18n/locales/dv/messages.json +6 -0
  163. package/src/components/i18n/locales/el/messages.json +6 -0
  164. package/src/components/i18n/locales/en/messages.json +6 -0
  165. package/src/components/i18n/locales/es/messages.json +6 -0
  166. package/src/components/i18n/locales/et/messages.json +6 -0
  167. package/src/components/i18n/locales/fa/messages.json +6 -0
  168. package/src/components/i18n/locales/fi/messages.json +6 -0
  169. package/src/components/i18n/locales/fil/messages.json +6 -0
  170. package/src/components/i18n/locales/fr/messages.json +6 -0
  171. package/src/components/i18n/locales/gu/messages.json +6 -0
  172. package/src/components/i18n/locales/he/messages.json +6 -0
  173. package/src/components/i18n/locales/hi/messages.json +6 -0
  174. package/src/components/i18n/locales/hr/messages.json +6 -0
  175. package/src/components/i18n/locales/hu/messages.json +6 -0
  176. package/src/components/i18n/locales/hy/messages.json +6 -0
  177. package/src/components/i18n/locales/id/messages.json +6 -0
  178. package/src/components/i18n/locales/it/messages.json +6 -0
  179. package/src/components/i18n/locales/ja/messages.json +6 -0
  180. package/src/components/i18n/locales/ka/messages.json +6 -0
  181. package/src/components/i18n/locales/km/messages.json +6 -0
  182. package/src/components/i18n/locales/kn/messages.json +6 -0
  183. package/src/components/i18n/locales/ko/messages.json +6 -0
  184. package/src/components/i18n/locales/ku/messages.json +6 -0
  185. package/src/components/i18n/locales/lo/messages.json +6 -0
  186. package/src/components/i18n/locales/lt/messages.json +6 -0
  187. package/src/components/i18n/locales/lv/messages.json +6 -0
  188. package/src/components/i18n/locales/mk/messages.json +6 -0
  189. package/src/components/i18n/locales/ml/messages.json +6 -0
  190. package/src/components/i18n/locales/mn/messages.json +6 -0
  191. package/src/components/i18n/locales/mr/messages.json +6 -0
  192. package/src/components/i18n/locales/ms/messages.json +6 -0
  193. package/src/components/i18n/locales/my/messages.json +6 -0
  194. package/src/components/i18n/locales/ne/messages.json +6 -0
  195. package/src/components/i18n/locales/nl/messages.json +6 -0
  196. package/src/components/i18n/locales/no/messages.json +6 -0
  197. package/src/components/i18n/locales/pa/messages.json +6 -0
  198. package/src/components/i18n/locales/pl/messages.json +6 -0
  199. package/src/components/i18n/locales/ps/messages.json +6 -0
  200. package/src/components/i18n/locales/pt/messages.json +6 -0
  201. package/src/components/i18n/locales/ro/messages.json +6 -0
  202. package/src/components/i18n/locales/ru/messages.json +6 -0
  203. package/src/components/i18n/locales/sd/messages.json +6 -0
  204. package/src/components/i18n/locales/si/messages.json +6 -0
  205. package/src/components/i18n/locales/sk/messages.json +6 -0
  206. package/src/components/i18n/locales/sl/messages.json +6 -0
  207. package/src/components/i18n/locales/sq/messages.json +6 -0
  208. package/src/components/i18n/locales/sr/messages.json +6 -0
  209. package/src/components/i18n/locales/sv/messages.json +6 -0
  210. package/src/components/i18n/locales/sw/messages.json +6 -0
  211. package/src/components/i18n/locales/ta/messages.json +6 -0
  212. package/src/components/i18n/locales/te/messages.json +6 -0
  213. package/src/components/i18n/locales/th/messages.json +6 -0
  214. package/src/components/i18n/locales/tr/messages.json +6 -0
  215. package/src/components/i18n/locales/ug/messages.json +6 -0
  216. package/src/components/i18n/locales/uk/messages.json +6 -0
  217. package/src/components/i18n/locales/ur/messages.json +6 -0
  218. package/src/components/i18n/locales/vi/messages.json +6 -0
  219. package/src/components/i18n/locales/yi/messages.json +6 -0
  220. package/src/components/i18n/locales/zh/messages.json +6 -0
  221. package/src/components/icons/index.ts +61 -7
  222. package/src/components/inline-tools/inline-tool-link.ts +1 -1
  223. package/src/components/inline-tools/inline-tool-marker.ts +737 -0
  224. package/src/components/inline-tools/utils/formatting-range-utils.ts +6 -3
  225. package/src/components/inline-tools/utils/marker-dom-utils.ts +17 -0
  226. package/src/components/modules/api/blocks.ts +34 -9
  227. package/src/components/modules/blockEvents/composers/keyboardNavigation.ts +75 -29
  228. package/src/components/modules/blockEvents/composers/markdownShortcuts.ts +54 -2
  229. package/src/components/modules/blockEvents/constants.ts +12 -0
  230. package/src/components/modules/blockEvents/index.ts +13 -5
  231. package/src/components/modules/blockManager/blockManager.ts +81 -2
  232. package/src/components/modules/blockManager/hierarchy.ts +20 -2
  233. package/src/components/modules/blockManager/operations.ts +70 -35
  234. package/src/components/modules/blockManager/repository.ts +22 -0
  235. package/src/components/modules/blockManager/types.ts +3 -1
  236. package/src/components/modules/blockManager/yjs-sync.ts +173 -39
  237. package/src/components/modules/blockSelection.ts +3 -0
  238. package/src/components/modules/crossBlockSelection.ts +11 -3
  239. package/src/components/modules/drag/preview/DragPreview.ts +10 -2
  240. package/src/components/modules/drag/target/DropTargetDetector.ts +100 -11
  241. package/src/components/modules/drag/utils/drag.constants.ts +1 -1
  242. package/src/components/modules/normalizeInlineImages.ts +263 -0
  243. package/src/components/modules/paste/google-docs-preprocessor.ts +197 -0
  244. package/src/components/modules/paste/handlers/base.ts +43 -2
  245. package/src/components/modules/paste/handlers/html-handler.ts +1 -1
  246. package/src/components/modules/paste/handlers/index.ts +1 -0
  247. package/src/components/modules/paste/handlers/table-cells-handler.ts +104 -0
  248. package/src/components/modules/paste/index.ts +20 -3
  249. package/src/components/modules/readonly.ts +8 -2
  250. package/src/components/modules/rectangleSelection.ts +5 -2
  251. package/src/components/modules/renderer.ts +35 -0
  252. package/src/components/modules/saver.ts +52 -2
  253. package/src/components/modules/toolbar/blockSettings.ts +52 -44
  254. package/src/components/modules/toolbar/index.ts +124 -17
  255. package/src/components/modules/toolbar/inline/index.ts +4 -4
  256. package/src/components/modules/toolbar/plus-button.ts +3 -3
  257. package/src/components/modules/toolbar/settings-toggler.ts +3 -3
  258. package/src/components/modules/toolbar/styles.ts +7 -7
  259. package/src/components/modules/ui.ts +6 -6
  260. package/src/components/modules/uiControllers/controllers/blockHover.ts +16 -2
  261. package/src/components/modules/uiControllers/handlers/touch.ts +83 -10
  262. package/src/components/modules/yjs/block-observer.ts +9 -3
  263. package/src/components/modules/yjs/document-store.ts +10 -7
  264. package/src/components/modules/yjs/types.ts +8 -6
  265. package/src/components/modules/yjs/undo-history.ts +90 -11
  266. package/src/components/selection/fake-background/shadows.ts +1 -1
  267. package/src/components/shared/color-picker.ts +211 -0
  268. package/src/components/shared/color-presets.ts +25 -0
  269. package/src/components/ui/toolbox.ts +27 -11
  270. package/src/components/utils/color-mapping.ts +241 -0
  271. package/src/components/utils/notifier/draw.ts +9 -9
  272. package/src/components/utils/placeholder.ts +24 -8
  273. package/src/components/utils/popover/components/popover-item/popover-item-default/popover-item-default.const.ts +3 -3
  274. package/src/components/utils/popover/components/popover-item/popover-item-default/popover-item-default.ts +15 -12
  275. package/src/components/utils/popover/components/search-input/search-input.const.ts +2 -2
  276. package/src/components/utils/popover/popover-abstract.ts +30 -5
  277. package/src/components/utils/popover/popover-desktop.ts +26 -3
  278. package/src/components/utils/popover/popover-inline.ts +14 -1
  279. package/src/components/utils/popover/popover-mobile.ts +4 -4
  280. package/src/components/utils/popover/popover.const.ts +3 -3
  281. package/src/components/utils/sanitizer.ts +24 -3
  282. package/src/components/utils/tw.ts +17 -5
  283. package/src/full.ts +4 -0
  284. package/src/stories/Header.stories.ts +106 -0
  285. package/src/stories/MarkerColors.stories.ts +730 -0
  286. package/src/stories/Placeholder.stories.ts +7 -2
  287. package/src/stories/Popover.stories.ts +1 -3
  288. package/src/stories/Table.stories.ts +1662 -0
  289. package/src/stories/helpers.ts +2 -0
  290. package/src/styles/main.css +217 -39
  291. package/src/tools/header/index.ts +204 -26
  292. package/src/tools/index.ts +5 -1
  293. package/src/tools/list/caret-manager.ts +28 -10
  294. package/src/tools/list/constants.ts +2 -2
  295. package/src/tools/list/dom-builder.ts +3 -3
  296. package/src/tools/list/static-configs.ts +0 -1
  297. package/src/tools/paragraph/index.ts +9 -5
  298. package/src/tools/table/core/table-commands.ts +99 -0
  299. package/src/tools/table/core/table-controller.ts +231 -0
  300. package/src/tools/table/core/table-events.ts +102 -0
  301. package/src/tools/table/index.ts +1070 -174
  302. package/src/tools/table/ownership/table-event-broker.ts +74 -0
  303. package/src/tools/table/ownership/table-ownership-registry.ts +126 -0
  304. package/src/tools/table/table-add-controls.ts +85 -15
  305. package/src/tools/table/table-cell-blocks.ts +336 -38
  306. package/src/tools/table/table-cell-clipboard.ts +415 -0
  307. package/src/tools/table/table-cell-color-picker.ts +34 -0
  308. package/src/tools/table/table-cell-selection.ts +264 -15
  309. package/src/tools/table/table-core.ts +3 -42
  310. package/src/tools/table/table-heading-toggle.ts +2 -2
  311. package/src/tools/table/table-model.ts +623 -0
  312. package/src/tools/table/table-operations.ts +59 -78
  313. package/src/tools/table/table-resize.ts +15 -11
  314. package/src/tools/table/table-restrictions.ts +69 -3
  315. package/src/tools/table/table-row-col-action-handler.ts +22 -7
  316. package/src/tools/table/table-row-col-controls.ts +129 -12
  317. package/src/tools/table/table-row-col-drag.ts +14 -0
  318. package/src/tools/table/table-scroll-haze.ts +152 -0
  319. package/src/tools/table/types.ts +22 -1
  320. package/src/tools/table/view/table-cell-blocks-adapter.ts +47 -0
  321. package/src/tools/toggle/block-operations.ts +110 -0
  322. package/src/tools/toggle/constants.ts +49 -0
  323. package/src/tools/toggle/dom-builder.ts +125 -0
  324. package/src/tools/toggle/index.ts +280 -0
  325. package/src/tools/toggle/toggle-keyboard.ts +139 -0
  326. package/src/tools/toggle/toggle-lifecycle.ts +80 -0
  327. package/src/tools/toggle/toggle-shortcuts.ts +107 -0
  328. package/src/tools/toggle/types.ts +21 -0
  329. package/src/variants/blok-minimum.ts +13 -0
  330. package/types/api/block.d.ts +13 -0
  331. package/types/api/blocks.d.ts +16 -0
  332. package/types/full.d.ts +2 -0
  333. package/types/tools/table.d.ts +2 -0
  334. package/types/tools-entry.d.ts +2 -1
  335. package/dist/chunks/i18next-CugVlwWp.mjs +0 -1292
  336. package/src/tools/table/data-normalizer.ts +0 -32
@@ -0,0 +1,74 @@
1
+ import type { TableOwnershipRegistry } from './table-ownership-registry';
2
+
3
+ /**
4
+ * Block lifecycle event data routed through the broker.
5
+ * Keeps the shape generic — the broker doesn't interpret event content,
6
+ * it just routes based on block ownership.
7
+ */
8
+ export interface BlockLifecycleEvent {
9
+ readonly type: string;
10
+ readonly [key: string]: unknown;
11
+ }
12
+
13
+ /**
14
+ * Handler callback for routed block lifecycle events.
15
+ */
16
+ export type BlockEventHandler = (blockId: string, event: BlockLifecycleEvent) => void;
17
+
18
+ /**
19
+ * Ownership-based event broker for table block lifecycle events.
20
+ *
21
+ * Instead of every table instance listening to global `'block changed'` events
22
+ * and using heuristics to determine if a block belongs to it, the broker:
23
+ *
24
+ * 1. Receives a single global event (one listener)
25
+ * 2. Resolves the owning table via the ownership registry (O(1) lookup)
26
+ * 3. Routes the event to the correct table subscriber
27
+ *
28
+ * This eliminates adjacency heuristics and cross-table interference.
29
+ */
30
+ export class TableEventBroker {
31
+ private readonly registry: TableOwnershipRegistry;
32
+ private readonly subscribers = new Map<string, BlockEventHandler>();
33
+
34
+ constructor(registry: TableOwnershipRegistry) {
35
+ this.registry = registry;
36
+ }
37
+
38
+ /**
39
+ * Subscribe a table to receive block lifecycle events for its owned blocks.
40
+ */
41
+ subscribe(tableId: string, handler: BlockEventHandler): void {
42
+ this.subscribers.set(tableId, handler);
43
+ }
44
+
45
+ /**
46
+ * Unsubscribe a table from block lifecycle events.
47
+ */
48
+ unsubscribe(tableId: string): void {
49
+ this.subscribers.delete(tableId);
50
+ }
51
+
52
+ /**
53
+ * Route a block lifecycle event to the owning table's handler.
54
+ *
55
+ * If the block is not owned by any table, or no subscriber exists
56
+ * for the owning table, the event is silently dropped — no heuristic
57
+ * claim is attempted.
58
+ */
59
+ routeBlockEvent(blockId: string, event: BlockLifecycleEvent): void {
60
+ const owner = this.registry.getOwner(blockId);
61
+
62
+ if (owner === null) {
63
+ return;
64
+ }
65
+
66
+ const handler = this.subscribers.get(owner.tableId);
67
+
68
+ if (handler === undefined) {
69
+ return;
70
+ }
71
+
72
+ handler(blockId, event);
73
+ }
74
+ }
@@ -0,0 +1,126 @@
1
+ import type { TableModel } from '../table-model';
2
+ import type { CellContent } from '../types';
3
+
4
+ /**
5
+ * Ownership entry for a block within a table cell.
6
+ */
7
+ export interface BlockOwnership {
8
+ readonly tableId: string;
9
+ readonly row: number;
10
+ readonly col: number;
11
+ }
12
+
13
+ /**
14
+ * Deterministic block-to-table-cell ownership registry.
15
+ *
16
+ * Provides O(1) lookup: given a block ID, determine which table and cell
17
+ * owns it. This replaces adjacency heuristics in `TableCellBlocks` with
18
+ * a single source of truth for block ownership.
19
+ *
20
+ * The registry is global — all table instances share one registry so that
21
+ * multi-table ownership conflicts are detected immediately.
22
+ */
23
+ export class TableOwnershipRegistry {
24
+ /** blockId → ownership info */
25
+ private readonly owners = new Map<string, BlockOwnership>();
26
+
27
+ /**
28
+ * Set or update ownership for a block.
29
+ * A block can only be owned by one table cell at a time.
30
+ */
31
+ setOwner(blockId: string, ownership: BlockOwnership): void {
32
+ this.owners.set(blockId, ownership);
33
+ }
34
+
35
+ /**
36
+ * Get the ownership info for a block.
37
+ * Returns null if the block is not tracked.
38
+ */
39
+ getOwner(blockId: string): BlockOwnership | null {
40
+ return this.owners.get(blockId) ?? null;
41
+ }
42
+
43
+ /**
44
+ * Remove ownership tracking for a block.
45
+ */
46
+ removeOwner(blockId: string): void {
47
+ this.owners.delete(blockId);
48
+ }
49
+
50
+ /**
51
+ * Check if a block is owned by a specific table.
52
+ */
53
+ isOwnedByTable(blockId: string, tableId: string): boolean {
54
+ const owner = this.owners.get(blockId);
55
+
56
+ return owner !== null && owner !== undefined && owner.tableId === tableId;
57
+ }
58
+
59
+ /**
60
+ * Get all block IDs owned by a specific table.
61
+ */
62
+ getBlocksForTable(tableId: string): string[] {
63
+ const result: string[] = [];
64
+
65
+ for (const [blockId, ownership] of this.owners) {
66
+ if (ownership.tableId === tableId) {
67
+ result.push(blockId);
68
+ }
69
+ }
70
+
71
+ return result;
72
+ }
73
+
74
+ /**
75
+ * Reconcile the registry with a model snapshot for a specific table.
76
+ *
77
+ * After this call, the registry will exactly match the model's block-cell
78
+ * mapping for the given table. Stale entries for the table are removed,
79
+ * and entries for other tables are left untouched.
80
+ */
81
+ reconcileWithModel(tableId: string, model: TableModel): void {
82
+ // Remove all existing entries for this table
83
+ const toRemove: string[] = [];
84
+
85
+ for (const [blockId, ownership] of this.owners) {
86
+ if (ownership.tableId === tableId) {
87
+ toRemove.push(blockId);
88
+ }
89
+ }
90
+
91
+ for (const blockId of toRemove) {
92
+ this.owners.delete(blockId);
93
+ }
94
+
95
+ // Re-populate from model snapshot
96
+ const snapshot = model.snapshot();
97
+
98
+ snapshot.content.forEach((row, r) => {
99
+ row.forEach((cell, c) => {
100
+ const cellContent = cell as CellContent;
101
+
102
+ for (const blockId of cellContent.blocks) {
103
+ this.owners.set(blockId, { tableId, row: r, col: c });
104
+ }
105
+ });
106
+ });
107
+ }
108
+
109
+ /**
110
+ * Remove all blocks owned by a specific table.
111
+ * Used when a table is destroyed.
112
+ */
113
+ removeTable(tableId: string): void {
114
+ const toRemove: string[] = [];
115
+
116
+ for (const [blockId, ownership] of this.owners) {
117
+ if (ownership.tableId === tableId) {
118
+ toRemove.push(blockId);
119
+ }
120
+ }
121
+
122
+ for (const blockId of toRemove) {
123
+ this.owners.delete(blockId);
124
+ }
125
+ }
126
+ }
@@ -75,6 +75,7 @@ export class TableAddControls {
75
75
  private colHideTimeout: ReturnType<typeof setTimeout> | null = null;
76
76
  private rowVisible = false;
77
77
  private colVisible = false;
78
+ private interactive = true;
78
79
  private dragState: DragState | null = null;
79
80
 
80
81
  private boundMouseMove: (e: MouseEvent) => void;
@@ -89,6 +90,7 @@ export class TableAddControls {
89
90
  private onDragEnd: () => void;
90
91
  private boundPointerMove: (e: PointerEvent) => void;
91
92
  private boundPointerUp: (e: PointerEvent) => void;
93
+ private boundPointerCancel: (e: PointerEvent) => void;
92
94
  private boundRowPointerDown: (e: PointerEvent) => void;
93
95
  private boundColPointerDown: (e: PointerEvent) => void;
94
96
  private getNewColumnWidth: (() => number) | undefined;
@@ -111,6 +113,7 @@ export class TableAddControls {
111
113
  this.boundMouseLeave = this.handleMouseLeave.bind(this);
112
114
  this.boundPointerMove = this.handlePointerMove.bind(this);
113
115
  this.boundPointerUp = this.handlePointerUp.bind(this);
116
+ this.boundPointerCancel = this.handlePointerCancel.bind(this);
114
117
  this.boundRowPointerDown = (e: PointerEvent): void => this.handlePointerDown('row', e);
115
118
  this.boundColPointerDown = (e: PointerEvent): void => this.handlePointerDown('col', e);
116
119
 
@@ -118,7 +121,7 @@ export class TableAddControls {
118
121
  this.addColBtn = this.createAddColumnButton();
119
122
 
120
123
  this.wrapper.appendChild(this.addRowBtn);
121
- this.grid.appendChild(this.addColBtn);
124
+ this.wrapper.appendChild(this.addColBtn);
122
125
  this.syncRowButtonWidth();
123
126
 
124
127
  this.wrapper.addEventListener('mousemove', this.boundMouseMove);
@@ -130,17 +133,51 @@ export class TableAddControls {
130
133
  }
131
134
 
132
135
  /**
133
- * Match the add-row button width to the grid's explicit width.
134
- * When the grid has a pixel width (from colWidths), the button must use
135
- * the same value so it scrolls with the table instead of staying at 100%
136
- * of the wrapper's visible area.
136
+ * Match the add-row button width and horizontal position to the grid.
137
+ *
138
+ * Pixel mode (colWidths set): clamp to the scroll container's visible
139
+ * width so the button never overflows the table boundary.
140
+ *
141
+ * Percent mode (no colWidths): clear `width` and use `left`/`right`
142
+ * constraints so the browser auto-sizes the button to the wrapper's
143
+ * content area, avoiding the wrapper's right padding.
137
144
  */
138
145
  public syncRowButtonWidth(): void {
139
146
  const gridWidth = this.grid.style.width;
140
147
 
141
- this.addRowBtn.style.width = gridWidth && gridWidth.endsWith('px')
142
- ? gridWidth
143
- : '100%';
148
+ if (gridWidth && gridWidth.endsWith('px')) {
149
+ const numericWidth = parseFloat(gridWidth);
150
+ const scrollContainer = this.grid.parentElement;
151
+ const isInsideScrollContainer = scrollContainer !== null && scrollContainer !== this.wrapper;
152
+
153
+ /**
154
+ * When a scroll container exists and the grid overflows it,
155
+ * clamp to the visible width so the button stays within bounds.
156
+ * Guard clientWidth > 0 for pre-layout / jsdom environments.
157
+ */
158
+ const visibleWidth = isInsideScrollContainer && scrollContainer.clientWidth > 0
159
+ ? Math.min(numericWidth, scrollContainer.clientWidth)
160
+ : numericWidth;
161
+
162
+ this.addRowBtn.style.width = `${visibleWidth}px`;
163
+ this.addRowBtn.style.right = '';
164
+ this.addRowBtn.style.left = '0px';
165
+ this.addRowBtn.style.transform = '';
166
+
167
+ this.addColBtn.style.left = `${visibleWidth}px`;
168
+ this.addColBtn.style.right = '';
169
+ } else {
170
+ this.addRowBtn.style.width = '';
171
+ this.addRowBtn.style.left = '0px';
172
+ this.addRowBtn.style.transform = '';
173
+
174
+ const paddingRight = parseFloat(getComputedStyle(this.wrapper).paddingRight) || 0;
175
+
176
+ this.addRowBtn.style.right = `${paddingRight}px`;
177
+
178
+ this.addColBtn.style.left = '';
179
+ this.addColBtn.style.right = '-36px';
180
+ }
144
181
  }
145
182
 
146
183
  /**
@@ -159,6 +196,8 @@ export class TableAddControls {
159
196
  * Disables pointer events and hover effects during cell selection.
160
197
  */
161
198
  public setInteractive(interactive: boolean): void {
199
+ this.interactive = interactive;
200
+
162
201
  if (!interactive) {
163
202
  this.addRowBtn.style.pointerEvents = 'none';
164
203
  this.addColBtn.style.pointerEvents = 'none';
@@ -181,6 +220,7 @@ export class TableAddControls {
181
220
 
182
221
  target.removeEventListener('pointermove', this.boundPointerMove);
183
222
  target.removeEventListener('pointerup', this.boundPointerUp);
223
+ target.removeEventListener('pointercancel', this.boundPointerCancel);
184
224
  document.body.style.cursor = '';
185
225
  this.dragState = null;
186
226
  }
@@ -212,6 +252,7 @@ export class TableAddControls {
212
252
 
213
253
  target.addEventListener('pointermove', this.boundPointerMove);
214
254
  target.addEventListener('pointerup', this.boundPointerUp);
255
+ target.addEventListener('pointercancel', this.boundPointerCancel);
215
256
  }
216
257
 
217
258
  private handlePointerMove(e: PointerEvent): void {
@@ -264,6 +305,7 @@ export class TableAddControls {
264
305
  target.releasePointerCapture(pointerId);
265
306
  target.removeEventListener('pointermove', this.boundPointerMove);
266
307
  target.removeEventListener('pointerup', this.boundPointerUp);
308
+ target.removeEventListener('pointercancel', this.boundPointerCancel);
267
309
 
268
310
  document.body.style.cursor = '';
269
311
  this.dragState = null;
@@ -279,6 +321,31 @@ export class TableAddControls {
279
321
  this.onDragEnd();
280
322
  }
281
323
 
324
+ /**
325
+ * Handle pointercancel — browser aborted the pointer (touch gesture, system dialog, etc.).
326
+ * Cleans up drag state without triggering click or commit actions.
327
+ */
328
+ private handlePointerCancel(_e: PointerEvent): void {
329
+ if (!this.dragState) {
330
+ return;
331
+ }
332
+
333
+ const { axis, didDrag } = this.dragState;
334
+
335
+ const target = axis === 'row' ? this.addRowBtn : this.addColBtn;
336
+
337
+ target.removeEventListener('pointermove', this.boundPointerMove);
338
+ target.removeEventListener('pointerup', this.boundPointerUp);
339
+ target.removeEventListener('pointercancel', this.boundPointerCancel);
340
+
341
+ document.body.style.cursor = '';
342
+ this.dragState = null;
343
+
344
+ if (didDrag) {
345
+ this.onDragEnd();
346
+ }
347
+ }
348
+
282
349
  private measureUnitSize(axis: 'row' | 'col'): number {
283
350
  if (axis === 'row') {
284
351
  const rows = this.grid.querySelectorAll('[data-blok-table-row]');
@@ -305,8 +372,14 @@ export class TableAddControls {
305
372
 
306
373
  private handleMouseMove(e: MouseEvent): void {
307
374
  const gridRect = this.grid.getBoundingClientRect();
375
+ const scrollContainer = this.grid.parentElement;
376
+ const isInsideScrollContainer = scrollContainer !== null && scrollContainer !== this.wrapper;
377
+ const visibleRight = isInsideScrollContainer
378
+ ? Math.min(gridRect.right, scrollContainer.getBoundingClientRect().right)
379
+ : gridRect.right;
380
+
308
381
  const distFromBottom = Math.abs(e.clientY - gridRect.bottom);
309
- const distFromRight = Math.abs(e.clientX - gridRect.right);
382
+ const distFromRight = Math.abs(e.clientX - visibleRight);
310
383
 
311
384
  if (distFromBottom <= PROXIMITY_PX) {
312
385
  this.showRow();
@@ -331,7 +404,7 @@ export class TableAddControls {
331
404
 
332
405
  if (!this.rowVisible) {
333
406
  this.addRowBtn.style.opacity = '1';
334
- this.addRowBtn.style.pointerEvents = '';
407
+ this.addRowBtn.style.pointerEvents = this.interactive ? '' : 'none';
335
408
  this.rowVisible = true;
336
409
  }
337
410
  }
@@ -341,7 +414,7 @@ export class TableAddControls {
341
414
 
342
415
  if (!this.colVisible) {
343
416
  this.addColBtn.style.opacity = '1';
344
- this.addColBtn.style.pointerEvents = '';
417
+ this.addColBtn.style.pointerEvents = this.interactive ? '' : 'none';
345
418
  this.colVisible = true;
346
419
  }
347
420
  }
@@ -397,11 +470,8 @@ export class TableAddControls {
397
470
  btn.style.position = 'absolute';
398
471
  btn.style.left = '0';
399
472
  btn.style.bottom = '-36px';
400
- btn.style.boxSizing = 'content-box';
401
- btn.style.width = '100%';
473
+ btn.style.zIndex = '1';
402
474
  btn.style.height = '32px';
403
- btn.style.padding = '4px 8px 0';
404
- btn.style.marginLeft = '-8px';
405
475
 
406
476
  const visual = document.createElement('div');
407
477