@jackuait/blok 0.6.0-beta.8 → 0.6.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 (320) hide show
  1. package/dist/blok.mjs +2 -2
  2. package/dist/chunks/{blok-bzxy6Olq.mjs → blok-BAh1rvUC.mjs} +3410 -2927
  3. package/dist/chunks/i18next-B47TKgbU.mjs +1303 -0
  4. package/dist/chunks/{i18next-loader-CzL6YHyQ.mjs → i18next-loader-CHtGO6IK.mjs} +2 -2
  5. package/dist/chunks/{index-DSSrx_Co.mjs → index-DBWWKrDe.mjs} +12 -12
  6. package/dist/chunks/{inline-tool-convert-D4SXxjDd.mjs → inline-tool-convert-DduRc0fF.mjs} +1467 -951
  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 +2 -2
  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 +3194 -1690
  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/i18n/locales/am/messages.json +6 -0
  153. package/src/components/i18n/locales/ar/messages.json +6 -0
  154. package/src/components/i18n/locales/az/messages.json +6 -0
  155. package/src/components/i18n/locales/bg/messages.json +6 -0
  156. package/src/components/i18n/locales/bn/messages.json +6 -0
  157. package/src/components/i18n/locales/bs/messages.json +6 -0
  158. package/src/components/i18n/locales/cs/messages.json +6 -0
  159. package/src/components/i18n/locales/da/messages.json +6 -0
  160. package/src/components/i18n/locales/de/messages.json +6 -0
  161. package/src/components/i18n/locales/dv/messages.json +6 -0
  162. package/src/components/i18n/locales/el/messages.json +6 -0
  163. package/src/components/i18n/locales/en/messages.json +6 -0
  164. package/src/components/i18n/locales/es/messages.json +6 -0
  165. package/src/components/i18n/locales/et/messages.json +6 -0
  166. package/src/components/i18n/locales/fa/messages.json +6 -0
  167. package/src/components/i18n/locales/fi/messages.json +6 -0
  168. package/src/components/i18n/locales/fil/messages.json +6 -0
  169. package/src/components/i18n/locales/fr/messages.json +6 -0
  170. package/src/components/i18n/locales/gu/messages.json +6 -0
  171. package/src/components/i18n/locales/he/messages.json +6 -0
  172. package/src/components/i18n/locales/hi/messages.json +6 -0
  173. package/src/components/i18n/locales/hr/messages.json +6 -0
  174. package/src/components/i18n/locales/hu/messages.json +6 -0
  175. package/src/components/i18n/locales/hy/messages.json +6 -0
  176. package/src/components/i18n/locales/id/messages.json +6 -0
  177. package/src/components/i18n/locales/it/messages.json +6 -0
  178. package/src/components/i18n/locales/ja/messages.json +6 -0
  179. package/src/components/i18n/locales/ka/messages.json +6 -0
  180. package/src/components/i18n/locales/km/messages.json +6 -0
  181. package/src/components/i18n/locales/kn/messages.json +6 -0
  182. package/src/components/i18n/locales/ko/messages.json +6 -0
  183. package/src/components/i18n/locales/ku/messages.json +6 -0
  184. package/src/components/i18n/locales/lo/messages.json +6 -0
  185. package/src/components/i18n/locales/lt/messages.json +6 -0
  186. package/src/components/i18n/locales/lv/messages.json +6 -0
  187. package/src/components/i18n/locales/mk/messages.json +6 -0
  188. package/src/components/i18n/locales/ml/messages.json +6 -0
  189. package/src/components/i18n/locales/mn/messages.json +6 -0
  190. package/src/components/i18n/locales/mr/messages.json +6 -0
  191. package/src/components/i18n/locales/ms/messages.json +6 -0
  192. package/src/components/i18n/locales/my/messages.json +6 -0
  193. package/src/components/i18n/locales/ne/messages.json +6 -0
  194. package/src/components/i18n/locales/nl/messages.json +6 -0
  195. package/src/components/i18n/locales/no/messages.json +6 -0
  196. package/src/components/i18n/locales/pa/messages.json +6 -0
  197. package/src/components/i18n/locales/pl/messages.json +6 -0
  198. package/src/components/i18n/locales/ps/messages.json +6 -0
  199. package/src/components/i18n/locales/pt/messages.json +6 -0
  200. package/src/components/i18n/locales/ro/messages.json +6 -0
  201. package/src/components/i18n/locales/ru/messages.json +6 -0
  202. package/src/components/i18n/locales/sd/messages.json +6 -0
  203. package/src/components/i18n/locales/si/messages.json +6 -0
  204. package/src/components/i18n/locales/sk/messages.json +6 -0
  205. package/src/components/i18n/locales/sl/messages.json +6 -0
  206. package/src/components/i18n/locales/sq/messages.json +6 -0
  207. package/src/components/i18n/locales/sr/messages.json +6 -0
  208. package/src/components/i18n/locales/sv/messages.json +6 -0
  209. package/src/components/i18n/locales/sw/messages.json +6 -0
  210. package/src/components/i18n/locales/ta/messages.json +6 -0
  211. package/src/components/i18n/locales/te/messages.json +6 -0
  212. package/src/components/i18n/locales/th/messages.json +6 -0
  213. package/src/components/i18n/locales/tr/messages.json +6 -0
  214. package/src/components/i18n/locales/ug/messages.json +6 -0
  215. package/src/components/i18n/locales/uk/messages.json +6 -0
  216. package/src/components/i18n/locales/ur/messages.json +6 -0
  217. package/src/components/i18n/locales/vi/messages.json +6 -0
  218. package/src/components/i18n/locales/yi/messages.json +6 -0
  219. package/src/components/i18n/locales/zh/messages.json +6 -0
  220. package/src/components/icons/index.ts +17 -0
  221. package/src/components/inline-tools/inline-tool-link.ts +1 -1
  222. package/src/components/inline-tools/inline-tool-marker.ts +737 -0
  223. package/src/components/inline-tools/utils/formatting-range-utils.ts +6 -3
  224. package/src/components/inline-tools/utils/marker-dom-utils.ts +17 -0
  225. package/src/components/modules/api/blocks.ts +34 -9
  226. package/src/components/modules/blockEvents/composers/keyboardNavigation.ts +75 -29
  227. package/src/components/modules/blockEvents/index.ts +13 -5
  228. package/src/components/modules/blockManager/blockManager.ts +81 -2
  229. package/src/components/modules/blockManager/hierarchy.ts +20 -2
  230. package/src/components/modules/blockManager/operations.ts +70 -35
  231. package/src/components/modules/blockManager/repository.ts +22 -0
  232. package/src/components/modules/blockManager/types.ts +3 -1
  233. package/src/components/modules/blockManager/yjs-sync.ts +173 -39
  234. package/src/components/modules/blockSelection.ts +3 -0
  235. package/src/components/modules/crossBlockSelection.ts +11 -3
  236. package/src/components/modules/drag/preview/DragPreview.ts +10 -2
  237. package/src/components/modules/drag/target/DropTargetDetector.ts +100 -11
  238. package/src/components/modules/drag/utils/drag.constants.ts +1 -1
  239. package/src/components/modules/normalizeInlineImages.ts +263 -0
  240. package/src/components/modules/paste/google-docs-preprocessor.ts +197 -0
  241. package/src/components/modules/paste/handlers/base.ts +43 -2
  242. package/src/components/modules/paste/handlers/html-handler.ts +1 -1
  243. package/src/components/modules/paste/handlers/index.ts +1 -0
  244. package/src/components/modules/paste/handlers/table-cells-handler.ts +104 -0
  245. package/src/components/modules/paste/index.ts +20 -3
  246. package/src/components/modules/readonly.ts +8 -2
  247. package/src/components/modules/rectangleSelection.ts +5 -2
  248. package/src/components/modules/renderer.ts +35 -0
  249. package/src/components/modules/saver.ts +52 -2
  250. package/src/components/modules/toolbar/blockSettings.ts +52 -44
  251. package/src/components/modules/toolbar/index.ts +124 -17
  252. package/src/components/modules/toolbar/inline/index.ts +4 -4
  253. package/src/components/modules/toolbar/plus-button.ts +3 -3
  254. package/src/components/modules/toolbar/settings-toggler.ts +3 -3
  255. package/src/components/modules/toolbar/styles.ts +7 -7
  256. package/src/components/modules/ui.ts +6 -6
  257. package/src/components/modules/uiControllers/controllers/blockHover.ts +16 -2
  258. package/src/components/modules/uiControllers/handlers/touch.ts +83 -10
  259. package/src/components/modules/yjs/block-observer.ts +9 -3
  260. package/src/components/modules/yjs/document-store.ts +10 -7
  261. package/src/components/modules/yjs/types.ts +8 -6
  262. package/src/components/modules/yjs/undo-history.ts +90 -11
  263. package/src/components/selection/fake-background/shadows.ts +1 -1
  264. package/src/components/shared/color-picker.ts +211 -0
  265. package/src/components/shared/color-presets.ts +25 -0
  266. package/src/components/ui/toolbox.ts +19 -11
  267. package/src/components/utils/color-mapping.ts +241 -0
  268. package/src/components/utils/notifier/draw.ts +9 -9
  269. package/src/components/utils/placeholder.ts +24 -8
  270. package/src/components/utils/popover/components/popover-item/popover-item-default/popover-item-default.const.ts +2 -2
  271. package/src/components/utils/popover/components/popover-item/popover-item-default/popover-item-default.ts +14 -12
  272. package/src/components/utils/popover/components/search-input/search-input.const.ts +2 -2
  273. package/src/components/utils/popover/popover-abstract.ts +27 -3
  274. package/src/components/utils/popover/popover-desktop.ts +26 -3
  275. package/src/components/utils/popover/popover-inline.ts +14 -1
  276. package/src/components/utils/popover/popover-mobile.ts +4 -4
  277. package/src/components/utils/popover/popover.const.ts +2 -2
  278. package/src/components/utils/sanitizer.ts +24 -3
  279. package/src/components/utils/tw.ts +17 -5
  280. package/src/stories/Header.stories.ts +106 -0
  281. package/src/stories/MarkerColors.stories.ts +730 -0
  282. package/src/stories/Popover.stories.ts +1 -3
  283. package/src/stories/Table.stories.ts +1662 -0
  284. package/src/styles/main.css +207 -37
  285. package/src/tools/header/index.ts +1 -1
  286. package/src/tools/index.ts +3 -1
  287. package/src/tools/list/caret-manager.ts +28 -10
  288. package/src/tools/list/constants.ts +2 -2
  289. package/src/tools/list/dom-builder.ts +3 -3
  290. package/src/tools/list/static-configs.ts +0 -1
  291. package/src/tools/paragraph/index.ts +15 -7
  292. package/src/tools/table/core/table-commands.ts +99 -0
  293. package/src/tools/table/core/table-controller.ts +231 -0
  294. package/src/tools/table/core/table-events.ts +102 -0
  295. package/src/tools/table/index.ts +1070 -174
  296. package/src/tools/table/ownership/table-event-broker.ts +74 -0
  297. package/src/tools/table/ownership/table-ownership-registry.ts +126 -0
  298. package/src/tools/table/table-add-controls.ts +85 -15
  299. package/src/tools/table/table-cell-blocks.ts +336 -38
  300. package/src/tools/table/table-cell-clipboard.ts +415 -0
  301. package/src/tools/table/table-cell-color-picker.ts +34 -0
  302. package/src/tools/table/table-cell-selection.ts +264 -15
  303. package/src/tools/table/table-core.ts +3 -42
  304. package/src/tools/table/table-heading-toggle.ts +2 -2
  305. package/src/tools/table/table-model.ts +623 -0
  306. package/src/tools/table/table-operations.ts +59 -78
  307. package/src/tools/table/table-resize.ts +15 -11
  308. package/src/tools/table/table-restrictions.ts +69 -3
  309. package/src/tools/table/table-row-col-action-handler.ts +22 -7
  310. package/src/tools/table/table-row-col-controls.ts +129 -12
  311. package/src/tools/table/table-row-col-drag.ts +14 -0
  312. package/src/tools/table/table-scroll-haze.ts +152 -0
  313. package/src/tools/table/types.ts +22 -1
  314. package/src/tools/table/view/table-cell-blocks-adapter.ts +47 -0
  315. package/src/variants/blok-minimum.ts +13 -0
  316. package/types/api/block.d.ts +13 -0
  317. package/types/api/blocks.d.ts +16 -0
  318. package/types/tools/table.d.ts +2 -0
  319. package/dist/chunks/i18next-CugVlwWp.mjs +0 -1292
  320. package/src/tools/table/data-normalizer.ts +0 -32
@@ -56,6 +56,7 @@ export class TableRowColDrag {
56
56
 
57
57
  private boundDocPointerMove: (e: PointerEvent) => void;
58
58
  private boundDocPointerUp: (e: PointerEvent) => void;
59
+ private boundDocPointerCancel: () => void;
59
60
 
60
61
  /** Resolves when drag ends — set by beginTracking, consumed by caller */
61
62
  private resolveTracking: ((wasDrag: boolean) => void) | null = null;
@@ -67,6 +68,7 @@ export class TableRowColDrag {
67
68
 
68
69
  this.boundDocPointerMove = this.handleDocPointerMove.bind(this);
69
70
  this.boundDocPointerUp = this.handleDocPointerUp.bind(this);
71
+ this.boundDocPointerCancel = this.handleDocPointerCancel.bind(this);
70
72
  }
71
73
 
72
74
  /**
@@ -87,6 +89,7 @@ export class TableRowColDrag {
87
89
 
88
90
  document.addEventListener('pointermove', this.boundDocPointerMove);
89
91
  document.addEventListener('pointerup', this.boundDocPointerUp);
92
+ document.addEventListener('pointercancel', this.boundDocPointerCancel);
90
93
 
91
94
  return new Promise<boolean>(resolve => {
92
95
  this.resolveTracking = resolve;
@@ -113,6 +116,7 @@ export class TableRowColDrag {
113
116
 
114
117
  document.removeEventListener('pointermove', this.boundDocPointerMove);
115
118
  document.removeEventListener('pointerup', this.boundDocPointerUp);
119
+ document.removeEventListener('pointercancel', this.boundDocPointerCancel);
116
120
 
117
121
  this.onDragStateChange?.(false, null);
118
122
  this.isDragging = false;
@@ -139,6 +143,7 @@ export class TableRowColDrag {
139
143
  private handleDocPointerUp(e: PointerEvent): void {
140
144
  document.removeEventListener('pointermove', this.boundDocPointerMove);
141
145
  document.removeEventListener('pointerup', this.boundDocPointerUp);
146
+ document.removeEventListener('pointercancel', this.boundDocPointerCancel);
142
147
 
143
148
  if (this.isDragging) {
144
149
  this.finishDrag(e);
@@ -150,6 +155,15 @@ export class TableRowColDrag {
150
155
  this.cleanup();
151
156
  }
152
157
 
158
+ /**
159
+ * Handle pointercancel — browser aborted the pointer (touch gesture, system dialog, etc.).
160
+ * Cleans up without applying the move (treats as abort).
161
+ */
162
+ private handleDocPointerCancel(): void {
163
+ this.resolveTracking?.(this.isDragging);
164
+ this.cleanup();
165
+ }
166
+
153
167
  private startDrag(): void {
154
168
  this.grid.style.userSelect = 'none';
155
169
  document.body.style.cursor = 'grabbing';
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Scroll haze overlays for the Table tool.
3
+ *
4
+ * Adds gradient overlays on the left/right edges of the table wrapper
5
+ * to indicate that the table content is horizontally scrollable.
6
+ * Uses a passive scroll event listener with rAF throttling.
7
+ */
8
+
9
+ const HAZE_ATTR = 'data-blok-table-haze';
10
+ const HAZE_VISIBLE_ATTR = 'data-blok-table-haze-visible';
11
+
12
+ /** Minimum scrollLeft delta to consider "scrolled" (avoids sub-pixel flicker). */
13
+ const SCROLL_THRESHOLD = 1;
14
+
15
+ const HAZE_CLASSES = [
16
+ 'absolute',
17
+ 'top-0',
18
+ 'bottom-0',
19
+ 'w-12',
20
+ 'pointer-events-none',
21
+ 'opacity-0',
22
+ 'transition-opacity',
23
+ 'duration-150',
24
+ 'z-1',
25
+ ];
26
+
27
+ const LEFT_HAZE_CLASSES = [
28
+ 'left-0',
29
+ 'bg-linear-to-r',
30
+ 'from-white/80',
31
+ 'to-transparent',
32
+ ];
33
+
34
+ const RIGHT_HAZE_CLASSES = [
35
+ 'right-5',
36
+ 'bg-linear-to-l',
37
+ 'from-white/80',
38
+ 'to-transparent',
39
+ ];
40
+
41
+ /**
42
+ * Manages left/right gradient haze overlays that indicate
43
+ * the table can be scrolled horizontally.
44
+ */
45
+ export class TableScrollHaze {
46
+ private leftHaze: HTMLDivElement | null = null;
47
+ private rightHaze: HTMLDivElement | null = null;
48
+ private scrollContainer: HTMLElement | null = null;
49
+ private boundOnScroll: (() => void) | null = null;
50
+ private ticking = false;
51
+
52
+ /**
53
+ * Create haze overlay elements and attach the scroll listener.
54
+ *
55
+ * @param wrapper - The table wrapper element (position: relative)
56
+ * @param scrollContainer - The scroll container with overflow-x: auto
57
+ */
58
+ public init(wrapper: HTMLElement, scrollContainer: HTMLElement): void {
59
+ this.scrollContainer = scrollContainer;
60
+
61
+ this.leftHaze = this.createHazeElement('left');
62
+ this.rightHaze = this.createHazeElement('right');
63
+
64
+ wrapper.appendChild(this.leftHaze);
65
+ wrapper.appendChild(this.rightHaze);
66
+
67
+ this.boundOnScroll = (): void => {
68
+ if (!this.ticking) {
69
+ requestAnimationFrame(() => {
70
+ this.syncVisibility();
71
+ this.ticking = false;
72
+ });
73
+ this.ticking = true;
74
+ }
75
+ };
76
+
77
+ scrollContainer.addEventListener('scroll', this.boundOnScroll, { passive: true });
78
+
79
+ this.syncVisibility();
80
+ }
81
+
82
+ /**
83
+ * Recalculate haze visibility (e.g. after column resize or add/delete).
84
+ */
85
+ public update(): void {
86
+ this.syncVisibility();
87
+ }
88
+
89
+ /**
90
+ * Remove overlay elements and detach the scroll listener.
91
+ */
92
+ public destroy(): void {
93
+ if (this.boundOnScroll && this.scrollContainer) {
94
+ this.scrollContainer.removeEventListener('scroll', this.boundOnScroll);
95
+ }
96
+
97
+ this.leftHaze?.remove();
98
+ this.rightHaze?.remove();
99
+
100
+ this.leftHaze = null;
101
+ this.rightHaze = null;
102
+ this.scrollContainer = null;
103
+ this.boundOnScroll = null;
104
+ this.ticking = false;
105
+ }
106
+
107
+ private createHazeElement(side: 'left' | 'right'): HTMLDivElement {
108
+ const el = document.createElement('div');
109
+
110
+ el.setAttribute(HAZE_ATTR, side);
111
+ el.setAttribute('aria-hidden', 'true');
112
+ el.classList.add(...HAZE_CLASSES, ...(side === 'left' ? LEFT_HAZE_CLASSES : RIGHT_HAZE_CLASSES));
113
+
114
+ return el;
115
+ }
116
+
117
+ private syncVisibility(): void {
118
+ const sc = this.scrollContainer;
119
+
120
+ if (!sc) {
121
+ return;
122
+ }
123
+
124
+ const { overflowX } = getComputedStyle(sc);
125
+ const canScroll = overflowX === 'auto' || overflowX === 'scroll';
126
+
127
+ if (!canScroll) {
128
+ this.setVisible(this.leftHaze, false);
129
+ this.setVisible(this.rightHaze, false);
130
+
131
+ return;
132
+ }
133
+
134
+ const { scrollLeft, scrollWidth, clientWidth } = sc;
135
+ const maxScroll = scrollWidth - clientWidth;
136
+
137
+ this.setVisible(this.leftHaze, scrollLeft > SCROLL_THRESHOLD);
138
+ this.setVisible(this.rightHaze, maxScroll > SCROLL_THRESHOLD && scrollLeft < maxScroll - SCROLL_THRESHOLD);
139
+ }
140
+
141
+ private setVisible(el: HTMLElement | null, visible: boolean): void {
142
+ if (!el) {
143
+ return;
144
+ }
145
+
146
+ if (visible) {
147
+ el.setAttribute(HAZE_VISIBLE_ATTR, '');
148
+ } else {
149
+ el.removeAttribute(HAZE_VISIBLE_ATTR);
150
+ }
151
+ }
152
+ }
@@ -4,7 +4,7 @@ import type { BlockToolData } from '../../../types';
4
4
  * Cell content always contains block IDs.
5
5
  * Every cell in the table is represented as an array of block references.
6
6
  */
7
- export type CellContent = { blocks: string[] };
7
+ export type CellContent = { blocks: string[]; color?: string; textColor?: string; text?: string };
8
8
 
9
9
  /**
10
10
  * Legacy cell content type for migration from string-based cells.
@@ -53,4 +53,25 @@ export interface TableConfig {
53
53
  withHeadings?: boolean;
54
54
  /** Whether to start stretched */
55
55
  stretched?: boolean;
56
+ /** Additional tool names to restrict from being inserted into table cells */
57
+ restrictedTools?: string[];
58
+ }
59
+
60
+ /**
61
+ * Block data within a clipboard cell (no IDs — those are assigned on paste).
62
+ */
63
+ export interface ClipboardBlockData {
64
+ tool: string;
65
+ data: Record<string, unknown>;
66
+ tunes?: Record<string, unknown>;
67
+ }
68
+
69
+ /**
70
+ * Clipboard payload for copied table cells.
71
+ * Stored as JSON in a data attribute on the HTML table element.
72
+ */
73
+ export interface TableCellsClipboard {
74
+ rows: number;
75
+ cols: number;
76
+ cells: Array<Array<{ blocks: ClipboardBlockData[]; color?: string; textColor?: string }>>;
56
77
  }
@@ -0,0 +1,47 @@
1
+ import type { TableEventBroker, BlockLifecycleEvent } from '../ownership/table-event-broker';
2
+ import type { TableOwnershipRegistry } from '../ownership/table-ownership-registry';
3
+
4
+ /**
5
+ * Adapter that bridges the ownership-based event broker into the existing
6
+ * TableCellBlocks event handling.
7
+ *
8
+ * In shadow mode, this adapter subscribes the table to the broker and
9
+ * forwards routed events to the table's handler. It does NOT replace the
10
+ * existing global event listener — both paths run in parallel for validation.
11
+ *
12
+ * After cutover (Task 7), this adapter becomes the sole event path.
13
+ */
14
+ export class TableCellBlocksAdapter {
15
+ private readonly tableId: string;
16
+ private readonly broker: TableEventBroker;
17
+ private readonly registry: TableOwnershipRegistry;
18
+ private readonly onEvent: (blockId: string, event: BlockLifecycleEvent) => void;
19
+
20
+ constructor(options: {
21
+ tableId: string;
22
+ broker: TableEventBroker;
23
+ registry: TableOwnershipRegistry;
24
+ onEvent: (blockId: string, event: BlockLifecycleEvent) => void;
25
+ }) {
26
+ this.tableId = options.tableId;
27
+ this.broker = options.broker;
28
+ this.registry = options.registry;
29
+ this.onEvent = options.onEvent;
30
+
31
+ this.broker.subscribe(this.tableId, this.handleBrokerEvent);
32
+ }
33
+
34
+ /**
35
+ * Destroy the adapter — unsubscribe from the broker.
36
+ */
37
+ destroy(): void {
38
+ this.broker.unsubscribe(this.tableId);
39
+ }
40
+
41
+ /**
42
+ * Handler for events routed through the broker.
43
+ */
44
+ private handleBrokerEvent = (blockId: string, event: BlockLifecycleEvent): void => {
45
+ this.onEvent(blockId, event);
46
+ };
47
+ }
@@ -59,6 +59,19 @@ class Blok {
59
59
  public exportAPI(blok: Core): void {
60
60
  const fieldsToExport = ['configuration'];
61
61
  const destroy = (): void => {
62
+ // Mark all modules as destroyed first so any in-flight async work stops gracefully
63
+ Object.values(blok.moduleInstances).forEach((moduleInstance) => {
64
+ if (moduleInstance === undefined || moduleInstance === null) {
65
+ return;
66
+ }
67
+
68
+ if (
69
+ isFunction((moduleInstance as { markDestroyed?: () => void }).markDestroyed)
70
+ ) {
71
+ (moduleInstance as { markDestroyed: () => void }).markDestroyed();
72
+ }
73
+ });
74
+
62
75
  Object.values(blok.moduleInstances).forEach((moduleInstance) => {
63
76
  if (moduleInstance === undefined || moduleInstance === null) {
64
77
  return;
@@ -1,4 +1,5 @@
1
1
  import {BlockToolData, ToolConfig, ToolboxConfigEntry} from '../tools';
2
+ import {BlockTuneData} from '../block-tunes/block-tune-data';
2
3
  import {SavedData} from '../data-formats';
3
4
 
4
5
  /**
@@ -35,6 +36,18 @@ export interface BlockAPI {
35
36
  */
36
37
  readonly selected: boolean;
37
38
 
39
+ /**
40
+ * Last successfully extracted block tool data (synchronous).
41
+ * Useful when async save() is not feasible, e.g. during clipboard operations.
42
+ */
43
+ readonly preservedData: BlockToolData;
44
+
45
+ /**
46
+ * Last successfully extracted tune data (synchronous).
47
+ * Useful when async save() is not feasible, e.g. during clipboard operations.
48
+ */
49
+ readonly preservedTunes: { [name: string]: BlockTuneData };
50
+
38
51
  /**
39
52
  * True if Block has inputs to be focused
40
53
  */
@@ -7,6 +7,12 @@ import {BlockTuneData} from '../block-tunes/block-tune-data';
7
7
  * Describes methods to manipulate with Blok`s blocks
8
8
  */
9
9
  export interface Blocks {
10
+ /**
11
+ * Returns true when a Yjs sync operation (undo/redo) is in progress.
12
+ * Tools can use this to skip cleanup that would interfere with Yjs state management.
13
+ */
14
+ readonly isSyncingFromYjs: boolean;
15
+
10
16
  /**
11
17
  * Remove all blocks from Blok zone
12
18
  */
@@ -175,4 +181,14 @@ export interface Blocks {
175
181
  newBlockData: BlockToolData,
176
182
  insertIndex: number,
177
183
  ): BlockAPI;
184
+
185
+ /**
186
+ * Execute a function within a transaction.
187
+ * All block operations (insert, delete, move) within fn are grouped
188
+ * into a single undo entry. Prevents undo-group splitting that would
189
+ * make structural operations partially undoable.
190
+ *
191
+ * @param fn - The function containing block operations to group
192
+ */
193
+ transact?(fn: () => void): void;
178
194
  }
@@ -36,6 +36,8 @@ export interface TableConfig {
36
36
  withHeadings?: boolean;
37
37
  /** Whether to start stretched */
38
38
  stretched?: boolean;
39
+ /** Additional tool names to restrict from being inserted into table cells */
40
+ restrictedTools?: string[];
39
41
  }
40
42
 
41
43
  /**