@jackuait/blok 0.7.0-beta.4 → 0.7.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 (463) hide show
  1. package/dist/blok.mjs +3 -7
  2. package/dist/chunks/blok-D-7DpjTs.mjs +12435 -0
  3. package/dist/chunks/constants-DXYRzX7f.mjs +2934 -0
  4. package/dist/chunks/i18next-DymC16cN.mjs +1146 -0
  5. package/dist/chunks/i18next-loader-qjweOJ-t.mjs +35 -0
  6. package/dist/chunks/lightweight-i18n-vbtPx5C4.mjs +105 -0
  7. package/dist/chunks/messages-3bOAVT3X2.mjs +80 -0
  8. package/dist/chunks/messages-43N0Vfg42.mjs +80 -0
  9. package/dist/chunks/messages-B0cg-ThO2.mjs +80 -0
  10. package/dist/chunks/messages-B3StvafX.mjs +80 -0
  11. package/dist/chunks/messages-B7LU-b6n2.mjs +80 -0
  12. package/dist/chunks/messages-B87-89os.mjs +80 -0
  13. package/dist/chunks/messages-BFiMCfDX2.mjs +80 -0
  14. package/dist/chunks/messages-BLxyso1L.mjs +80 -0
  15. package/dist/chunks/messages-BQZtOYxr2.mjs +80 -0
  16. package/dist/chunks/messages-BRrtoRdw2.mjs +80 -0
  17. package/dist/chunks/messages-BU_YdaAf.mjs +80 -0
  18. package/dist/chunks/messages-BWbZYIs12.mjs +80 -0
  19. package/dist/chunks/messages-B_Qcy8kr2.mjs +80 -0
  20. package/dist/chunks/messages-B_uTiuQ-.mjs +80 -0
  21. package/dist/chunks/messages-BdWTM73p.mjs +80 -0
  22. package/dist/chunks/messages-BhZcNoIQ.mjs +80 -0
  23. package/dist/chunks/messages-Bn6LwI4B.mjs +80 -0
  24. package/dist/chunks/messages-BoTtYEct2.mjs +80 -0
  25. package/dist/chunks/messages-BrvAiuWT.mjs +80 -0
  26. package/dist/chunks/messages-Byp0YFMg.mjs +80 -0
  27. package/dist/chunks/messages-C0ZWDShx2.mjs +80 -0
  28. package/dist/chunks/messages-CA-jms9R.mjs +80 -0
  29. package/dist/chunks/messages-CFr0Ha6p2.mjs +80 -0
  30. package/dist/chunks/messages-CG2xl0IV.mjs +80 -0
  31. package/dist/chunks/messages-CIGX0FfW.mjs +80 -0
  32. package/dist/chunks/messages-CRMdL0jG.mjs +80 -0
  33. package/dist/chunks/messages-CRdl14uE.mjs +80 -0
  34. package/dist/chunks/messages-Cimsel4e.mjs +80 -0
  35. package/dist/chunks/messages-CjcSWeud.mjs +80 -0
  36. package/dist/chunks/messages-ClDJuy8K2.mjs +80 -0
  37. package/dist/chunks/messages-Cn1AC0Qk.mjs +80 -0
  38. package/dist/chunks/messages-CpnXbVOK2.mjs +80 -0
  39. package/dist/chunks/messages-CqsES1wk2.mjs +80 -0
  40. package/dist/chunks/messages-Csq7JatN.mjs +80 -0
  41. package/dist/chunks/messages-CtufKbaD.mjs +80 -0
  42. package/dist/chunks/messages-Cuk0QaLM.mjs +80 -0
  43. package/dist/chunks/messages-CvamFN6x.mjs +80 -0
  44. package/dist/chunks/messages-CwRhVVui.mjs +80 -0
  45. package/dist/chunks/messages-CzCezryo.mjs +80 -0
  46. package/dist/chunks/messages-D0v0Xa_i2.mjs +80 -0
  47. package/dist/chunks/messages-D3JVx_CH2.mjs +80 -0
  48. package/dist/chunks/messages-D4jR5Oc-.mjs +80 -0
  49. package/dist/chunks/messages-D7fI9Pj52.mjs +80 -0
  50. package/dist/chunks/messages-DGodJU2R.mjs +80 -0
  51. package/dist/chunks/messages-DLrmLkco2.mjs +80 -0
  52. package/dist/chunks/messages-DPe7kW6J.mjs +80 -0
  53. package/dist/chunks/messages-DRYKKPk8.mjs +80 -0
  54. package/dist/chunks/messages-DV5c_ZRQ.mjs +80 -0
  55. package/dist/chunks/messages-Dg6kSnxq.mjs +80 -0
  56. package/dist/chunks/messages-Dgfbmyf-.mjs +80 -0
  57. package/dist/chunks/messages-DihczS7L.mjs +80 -0
  58. package/dist/chunks/messages-DkSwQvmi2.mjs +80 -0
  59. package/dist/chunks/messages-Doxcj7Qy.mjs +80 -0
  60. package/dist/chunks/messages-DqGQvcXv2.mjs +80 -0
  61. package/dist/chunks/messages-Dr7yA3xM.mjs +80 -0
  62. package/dist/chunks/messages-DriB5lEF.mjs +80 -0
  63. package/dist/chunks/messages-FB_MePlt.mjs +80 -0
  64. package/dist/chunks/messages-JyZvGvrN.mjs +80 -0
  65. package/dist/chunks/messages-KdvbGwLH.mjs +80 -0
  66. package/dist/chunks/messages-M0HT-kBW.mjs +80 -0
  67. package/dist/chunks/messages-M8noQ6Kp2.mjs +80 -0
  68. package/dist/chunks/messages-elZUbCrN.mjs +80 -0
  69. package/dist/chunks/messages-iWMOMK822.mjs +80 -0
  70. package/dist/chunks/messages-kC92TJI72.mjs +80 -0
  71. package/dist/chunks/messages-tfyq1JIh2.mjs +80 -0
  72. package/dist/chunks/messages-v1HkA3kF2.mjs +80 -0
  73. package/dist/chunks/messages-yuqArCc6.mjs +80 -0
  74. package/dist/chunks/notifier-BqYxvxnV.mjs +96 -0
  75. package/dist/chunks/objectSpread2-CyPxu8-u.mjs +62 -0
  76. package/dist/chunks/tools-Chd7Auwx.mjs +6004 -0
  77. package/dist/chunks/tw-DmW6-pCY.mjs +237 -0
  78. package/dist/cli.mjs +36 -49
  79. package/dist/full.mjs +26 -52
  80. package/dist/locales.mjs +181 -254
  81. package/dist/messages-2iHnlF0U.mjs +80 -0
  82. package/dist/messages-49ZJ_ISf.mjs +80 -0
  83. package/dist/messages-B8jjwMLK.mjs +80 -0
  84. package/dist/messages-BEDVb3ZX.mjs +80 -0
  85. package/dist/messages-BEEr6Vh82.mjs +80 -0
  86. package/dist/messages-BFT0F9pw.mjs +80 -0
  87. package/dist/messages-BHOI7R4K.mjs +80 -0
  88. package/dist/messages-BRPH_a6a.mjs +80 -0
  89. package/dist/messages-BSlQrYwp.mjs +80 -0
  90. package/dist/messages-BTNuOkhL.mjs +80 -0
  91. package/dist/messages-BX2KVzJp2.mjs +80 -0
  92. package/dist/messages-BaGwIHPb2.mjs +80 -0
  93. package/dist/messages-BdA_xvxj.mjs +80 -0
  94. package/dist/messages-BeJaje7e2.mjs +80 -0
  95. package/dist/messages-BfgHOkAy.mjs +80 -0
  96. package/dist/messages-BflWzIcP2.mjs +80 -0
  97. package/dist/messages-BigRnQS92.mjs +80 -0
  98. package/dist/messages-BjnJajTO2.mjs +80 -0
  99. package/dist/messages-BpA30dPf.mjs +80 -0
  100. package/dist/messages-BrPEPj382.mjs +80 -0
  101. package/dist/messages-Bt_9ptDu.mjs +80 -0
  102. package/dist/messages-C0cXOCHN2.mjs +80 -0
  103. package/dist/messages-C3tLCwJp2.mjs +80 -0
  104. package/dist/messages-C45IBZtA2.mjs +80 -0
  105. package/dist/messages-CA0hwajz.mjs +80 -0
  106. package/dist/messages-CCKZS2f4.mjs +80 -0
  107. package/dist/messages-CCm71gq3.mjs +80 -0
  108. package/dist/messages-CERs9LC9.mjs +80 -0
  109. package/dist/messages-CLQvtc_8.mjs +80 -0
  110. package/dist/messages-CPx1R-PH.mjs +80 -0
  111. package/dist/messages-CYFdbooL2.mjs +80 -0
  112. package/dist/messages-CYLYnOV82.mjs +80 -0
  113. package/dist/messages-CYZVFnaF.mjs +80 -0
  114. package/dist/messages-CaAdEXoh2.mjs +80 -0
  115. package/dist/messages-CicggErN2.mjs +80 -0
  116. package/dist/messages-CkAWTSc4.mjs +80 -0
  117. package/dist/messages-CkVfziK_2.mjs +80 -0
  118. package/dist/messages-CsM2iz1H2.mjs +80 -0
  119. package/dist/messages-D-12TeCM2.mjs +80 -0
  120. package/dist/messages-D0i5Vdyy2.mjs +80 -0
  121. package/dist/messages-D5KmRsUV2.mjs +80 -0
  122. package/dist/messages-DBwaWI0X.mjs +80 -0
  123. package/dist/messages-DDGzypb4.mjs +80 -0
  124. package/dist/messages-DQGzw4IC.mjs +80 -0
  125. package/dist/messages-DWZyaZNA.mjs +80 -0
  126. package/dist/messages-DYlxQEIv.mjs +80 -0
  127. package/dist/messages-DZo0x7Bd.mjs +80 -0
  128. package/dist/messages-Dc1yFFBM.mjs +80 -0
  129. package/dist/messages-DdUpYaJ1.mjs +80 -0
  130. package/dist/messages-DgstU8GH.mjs +80 -0
  131. package/dist/messages-DhdWq5oQ2.mjs +80 -0
  132. package/dist/messages-DmX52AQr.mjs +80 -0
  133. package/dist/messages-Dr-YJYIK2.mjs +80 -0
  134. package/dist/messages-DuubRyFf.mjs +80 -0
  135. package/dist/messages-DvTVsLOK2.mjs +80 -0
  136. package/dist/messages-DwPfgL_u.mjs +80 -0
  137. package/dist/messages-DxKIxLKw.mjs +80 -0
  138. package/dist/messages-DzhR8Klk.mjs +80 -0
  139. package/dist/messages-MBBSKGjJ2.mjs +80 -0
  140. package/dist/messages-RNusm48G2.mjs +80 -0
  141. package/dist/messages-XwPD18Kk.mjs +80 -0
  142. package/dist/messages-YfjdnhUF.mjs +80 -0
  143. package/dist/messages-aNMLsF8T2.mjs +80 -0
  144. package/dist/messages-cOqXp22e.mjs +80 -0
  145. package/dist/messages-g58itYPI.mjs +80 -0
  146. package/dist/messages-vfkwiKQo.mjs +80 -0
  147. package/dist/messages-vssmW7KO.mjs +80 -0
  148. package/dist/react.mjs +108 -0
  149. package/dist/tools.mjs +3 -7485
  150. package/dist/vendor.LICENSE.txt +86 -86
  151. package/package.json +56 -29
  152. package/src/blok.ts +52 -2
  153. package/src/components/block/api.ts +8 -0
  154. package/src/components/block/mutation-handler.ts +29 -4
  155. package/src/components/block/style-manager.ts +1 -1
  156. package/src/components/block-tunes/block-tune-width.ts +39 -0
  157. package/src/components/blocks.ts +56 -2
  158. package/src/components/core.ts +1 -0
  159. package/src/components/i18n/locales/am/messages.json +6 -1
  160. package/src/components/i18n/locales/ar/messages.json +6 -1
  161. package/src/components/i18n/locales/az/messages.json +6 -1
  162. package/src/components/i18n/locales/bg/messages.json +8 -3
  163. package/src/components/i18n/locales/bn/messages.json +6 -1
  164. package/src/components/i18n/locales/bs/messages.json +6 -1
  165. package/src/components/i18n/locales/cs/messages.json +6 -1
  166. package/src/components/i18n/locales/da/messages.json +6 -1
  167. package/src/components/i18n/locales/de/messages.json +8 -3
  168. package/src/components/i18n/locales/dv/messages.json +6 -1
  169. package/src/components/i18n/locales/el/messages.json +8 -3
  170. package/src/components/i18n/locales/en/messages.json +5 -0
  171. package/src/components/i18n/locales/es/messages.json +6 -1
  172. package/src/components/i18n/locales/et/messages.json +6 -1
  173. package/src/components/i18n/locales/fa/messages.json +8 -3
  174. package/src/components/i18n/locales/fi/messages.json +6 -1
  175. package/src/components/i18n/locales/fil/messages.json +21 -16
  176. package/src/components/i18n/locales/fr/messages.json +6 -1
  177. package/src/components/i18n/locales/gu/messages.json +6 -1
  178. package/src/components/i18n/locales/he/messages.json +6 -1
  179. package/src/components/i18n/locales/hi/messages.json +6 -1
  180. package/src/components/i18n/locales/hr/messages.json +6 -1
  181. package/src/components/i18n/locales/hu/messages.json +6 -1
  182. package/src/components/i18n/locales/hy/messages.json +8 -3
  183. package/src/components/i18n/locales/id/messages.json +12 -7
  184. package/src/components/i18n/locales/it/messages.json +6 -1
  185. package/src/components/i18n/locales/ja/messages.json +6 -1
  186. package/src/components/i18n/locales/ka/messages.json +6 -1
  187. package/src/components/i18n/locales/km/messages.json +6 -1
  188. package/src/components/i18n/locales/kn/messages.json +6 -1
  189. package/src/components/i18n/locales/ko/messages.json +6 -1
  190. package/src/components/i18n/locales/ku/messages.json +7 -2
  191. package/src/components/i18n/locales/lo/messages.json +7 -2
  192. package/src/components/i18n/locales/lt/messages.json +6 -1
  193. package/src/components/i18n/locales/lv/messages.json +6 -1
  194. package/src/components/i18n/locales/mk/messages.json +6 -1
  195. package/src/components/i18n/locales/ml/messages.json +6 -1
  196. package/src/components/i18n/locales/mn/messages.json +6 -1
  197. package/src/components/i18n/locales/mr/messages.json +6 -1
  198. package/src/components/i18n/locales/ms/messages.json +6 -1
  199. package/src/components/i18n/locales/my/messages.json +6 -1
  200. package/src/components/i18n/locales/ne/messages.json +9 -4
  201. package/src/components/i18n/locales/nl/messages.json +6 -1
  202. package/src/components/i18n/locales/no/messages.json +6 -1
  203. package/src/components/i18n/locales/pa/messages.json +6 -1
  204. package/src/components/i18n/locales/pl/messages.json +6 -1
  205. package/src/components/i18n/locales/ps/messages.json +8 -3
  206. package/src/components/i18n/locales/pt/messages.json +6 -1
  207. package/src/components/i18n/locales/ro/messages.json +6 -1
  208. package/src/components/i18n/locales/ru/messages.json +10 -5
  209. package/src/components/i18n/locales/sd/messages.json +6 -1
  210. package/src/components/i18n/locales/si/messages.json +6 -1
  211. package/src/components/i18n/locales/sk/messages.json +6 -1
  212. package/src/components/i18n/locales/sl/messages.json +6 -1
  213. package/src/components/i18n/locales/sq/messages.json +6 -1
  214. package/src/components/i18n/locales/sr/messages.json +6 -1
  215. package/src/components/i18n/locales/sv/messages.json +6 -1
  216. package/src/components/i18n/locales/sw/messages.json +6 -1
  217. package/src/components/i18n/locales/ta/messages.json +6 -1
  218. package/src/components/i18n/locales/te/messages.json +9 -4
  219. package/src/components/i18n/locales/th/messages.json +6 -1
  220. package/src/components/i18n/locales/tr/messages.json +6 -1
  221. package/src/components/i18n/locales/ug/messages.json +7 -2
  222. package/src/components/i18n/locales/uk/messages.json +6 -1
  223. package/src/components/i18n/locales/ur/messages.json +6 -1
  224. package/src/components/i18n/locales/vi/messages.json +6 -1
  225. package/src/components/i18n/locales/yi/messages.json +7 -2
  226. package/src/components/i18n/locales/zh/messages.json +6 -1
  227. package/src/components/icons/index.ts +16 -0
  228. package/src/components/inline-tools/inline-tool-link.ts +1 -1
  229. package/src/components/modules/api/blocks.ts +45 -2
  230. package/src/components/modules/api/index.ts +1 -0
  231. package/src/components/modules/api/width.ts +17 -0
  232. package/src/components/modules/blockEvents/composers/keyboardNavigation.ts +99 -0
  233. package/src/components/modules/blockEvents/composers/markdownShortcuts.ts +109 -2
  234. package/src/components/modules/blockEvents/constants.ts +7 -0
  235. package/src/components/modules/blockManager/blockManager.ts +113 -9
  236. package/src/components/modules/blockManager/hierarchy.ts +61 -0
  237. package/src/components/modules/blockManager/operations.ts +133 -15
  238. package/src/components/modules/blockManager/yjs-sync.ts +112 -4
  239. package/src/components/modules/blockSelection.ts +36 -2
  240. package/src/components/modules/crossBlockSelection.ts +22 -2
  241. package/src/components/modules/drag/DragController.ts +178 -4
  242. package/src/components/modules/drag/operations/DragOperations.ts +48 -9
  243. package/src/components/modules/drag/preview/DragPreview.ts +21 -1
  244. package/src/components/modules/drag/state/DragStateMachine.ts +6 -1
  245. package/src/components/modules/drag/target/DropTargetDetector.ts +80 -4
  246. package/src/components/modules/drag/utils/ToggleSpringLoader.ts +71 -0
  247. package/src/components/modules/drag/utils/drag.constants.ts +1 -1
  248. package/src/components/modules/index.ts +7 -1
  249. package/src/components/modules/modificationsObserver.ts +19 -0
  250. package/src/components/modules/paste/constants.ts +2 -0
  251. package/src/components/modules/paste/handlers/base.ts +33 -1
  252. package/src/components/modules/paste/handlers/html-handler.ts +121 -54
  253. package/src/components/modules/paste/index.ts +5 -0
  254. package/src/components/modules/paste/types.ts +5 -0
  255. package/src/components/modules/rectangleSelection.ts +74 -81
  256. package/src/components/modules/toolbar/blockSettings.ts +25 -7
  257. package/src/components/modules/toolbar/index.ts +9 -7
  258. package/src/components/modules/toolbar/inline/index.ts +6 -1
  259. package/src/components/modules/toolbar/plus-button.ts +2 -6
  260. package/src/components/modules/toolbar/positioning.ts +10 -1
  261. package/src/components/modules/toolbar/settings-toggler.ts +1 -1
  262. package/src/components/modules/toolbar/styles.ts +4 -8
  263. package/src/components/modules/ui.ts +59 -5
  264. package/src/components/modules/uiControllers/handlers/click.ts +3 -2
  265. package/src/components/modules/widthManager.ts +69 -0
  266. package/src/components/modules/yjs/document-store.ts +11 -0
  267. package/src/components/modules/yjs/index.ts +11 -0
  268. package/src/components/shared/color-picker.ts +3 -3
  269. package/src/components/tools/block.ts +1 -11
  270. package/src/components/ui/toolbox.ts +52 -8
  271. package/src/components/utils/blocks.ts +37 -7
  272. package/src/components/utils/mutations.ts +2 -2
  273. package/src/components/utils/notifier/draw.ts +1 -1
  274. package/src/components/utils/placeholder.ts +5 -6
  275. package/src/components/utils/popover/components/popover-header/popover-header.const.ts +1 -1
  276. package/src/components/utils/popover/components/popover-item/popover-item-default/popover-item-default.const.ts +4 -4
  277. package/src/components/utils/popover/components/popover-item/popover-item-default/popover-item-default.ts +6 -6
  278. package/src/components/utils/popover/components/popover-item/popover-item-separator/popover-item-separator.const.ts +2 -2
  279. package/src/components/utils/popover/components/search-input/search-input.const.ts +2 -2
  280. package/src/components/utils/popover/components/search-input/search-input.ts +7 -11
  281. package/src/components/utils/popover/components/search-input/search-input.types.ts +149 -10
  282. package/src/components/utils/popover/popover-abstract.ts +3 -2
  283. package/src/components/utils/popover/popover-desktop.ts +133 -11
  284. package/src/components/utils/popover/popover-inline.ts +1 -1
  285. package/src/components/utils/popover/popover.const.ts +3 -3
  286. package/src/components/utils/shortcut.ts +2 -0
  287. package/src/components/utils/tooltip.ts +11 -1
  288. package/src/react/BlokContent.tsx +46 -0
  289. package/src/react/holder-map.ts +17 -0
  290. package/src/react/index.ts +3 -0
  291. package/src/react/types.ts +16 -0
  292. package/src/react/useBlok.ts +173 -0
  293. package/src/stories/Placeholder.stories.ts +0 -59
  294. package/src/styles/main.css +663 -52
  295. package/src/tools/header/header-toggle-keyboard.ts +115 -0
  296. package/src/tools/header/index.ts +382 -187
  297. package/src/tools/list/block-operations.ts +1 -1
  298. package/src/tools/list/caret-manager.ts +9 -12
  299. package/src/tools/list/index.ts +2 -6
  300. package/src/tools/list/list-keyboard.ts +2 -2
  301. package/src/tools/paragraph/index.ts +1 -1
  302. package/src/tools/table/index.ts +37 -3
  303. package/src/tools/table/table-add-controls.ts +97 -8
  304. package/src/tools/table/table-cell-blocks.ts +17 -8
  305. package/src/tools/table/table-cell-clipboard.ts +1 -1
  306. package/src/tools/table/table-cell-selection.ts +27 -2
  307. package/src/tools/table/table-operations.ts +3 -2
  308. package/src/tools/toggle/block-operations.ts +4 -2
  309. package/src/tools/toggle/constants.ts +26 -2
  310. package/src/tools/toggle/dom-builder.ts +90 -25
  311. package/src/tools/toggle/index.ts +112 -9
  312. package/src/tools/toggle/toggle-keyboard.ts +5 -3
  313. package/src/tools/toggle/toggle-lifecycle.ts +79 -7
  314. package/src/tools/toggle/toggle-shortcuts.ts +214 -20
  315. package/src/tools/toggle/types.ts +2 -0
  316. package/src/types-internal/blok-modules.d.ts +4 -0
  317. package/types/api/block.d.ts +5 -0
  318. package/types/api/blocks.d.ts +29 -0
  319. package/types/api/index.d.ts +1 -0
  320. package/types/api/width.d.ts +19 -0
  321. package/types/configs/blok-config.d.ts +33 -0
  322. package/types/index.d.ts +4 -0
  323. package/types/react.d.ts +58 -0
  324. package/types/utils/popover/popover.d.ts +7 -0
  325. package/dist/chunks/blok-B0pAWdVk.mjs +0 -20102
  326. package/dist/chunks/constants-DmDwNSTM.mjs +0 -5123
  327. package/dist/chunks/i18next-B47TKgbU.mjs +0 -1303
  328. package/dist/chunks/i18next-loader-v9SlYZ0i.mjs +0 -43
  329. package/dist/chunks/index-DHLWzZaA.mjs +0 -130
  330. package/dist/chunks/messages-0Pxnqd4N.mjs +0 -75
  331. package/dist/chunks/messages-0ZXYUq7S.mjs +0 -75
  332. package/dist/chunks/messages-2OD2uUDS.mjs +0 -75
  333. package/dist/chunks/messages-7cEMfYzh.mjs +0 -75
  334. package/dist/chunks/messages-8mwfda1Q.mjs +0 -75
  335. package/dist/chunks/messages-B-FqWsBM.mjs +0 -75
  336. package/dist/chunks/messages-B1jzqWiQ.mjs +0 -75
  337. package/dist/chunks/messages-B5wk4Ezz.mjs +0 -75
  338. package/dist/chunks/messages-BAZ5Ld8x.mjs +0 -75
  339. package/dist/chunks/messages-BBhGp198.mjs +0 -75
  340. package/dist/chunks/messages-BC9IjIb7.mjs +0 -75
  341. package/dist/chunks/messages-BFEmpeV-.mjs +0 -75
  342. package/dist/chunks/messages-BGqzTZy0.mjs +0 -75
  343. package/dist/chunks/messages-BICs1abK.mjs +0 -75
  344. package/dist/chunks/messages-BJX6rOnd.mjs +0 -75
  345. package/dist/chunks/messages-BL2bXRhN.mjs +0 -75
  346. package/dist/chunks/messages-BMs5qdlH.mjs +0 -75
  347. package/dist/chunks/messages-BRsjUNwB.mjs +0 -75
  348. package/dist/chunks/messages-BSqV8OUR.mjs +0 -75
  349. package/dist/chunks/messages-BTqu3DfG.mjs +0 -75
  350. package/dist/chunks/messages-BXnDEsur.mjs +0 -75
  351. package/dist/chunks/messages-BYcre4-6.mjs +0 -75
  352. package/dist/chunks/messages-BZ9LRJf-.mjs +0 -75
  353. package/dist/chunks/messages-BgypBy7y.mjs +0 -75
  354. package/dist/chunks/messages-BsuGf70G.mjs +0 -75
  355. package/dist/chunks/messages-BwaoF4lQ.mjs +0 -75
  356. package/dist/chunks/messages-C1l8_7-y.mjs +0 -75
  357. package/dist/chunks/messages-C5NA_r9v.mjs +0 -75
  358. package/dist/chunks/messages-C6zgZ5pA.mjs +0 -75
  359. package/dist/chunks/messages-CAo5ghFI.mjs +0 -75
  360. package/dist/chunks/messages-CH9qlJ9I.mjs +0 -75
  361. package/dist/chunks/messages-CI0HqAeS.mjs +0 -75
  362. package/dist/chunks/messages-CJJtms9k.mjs +0 -75
  363. package/dist/chunks/messages-CM2hJqk6.mjs +0 -75
  364. package/dist/chunks/messages-CRMiDPIQ.mjs +0 -75
  365. package/dist/chunks/messages-CWsZuBj1.mjs +0 -75
  366. package/dist/chunks/messages-C_gLHo6A.mjs +0 -75
  367. package/dist/chunks/messages-Cbu-NUDn.mjs +0 -75
  368. package/dist/chunks/messages-Cjb_MCeh.mjs +0 -75
  369. package/dist/chunks/messages-ClXYO9Wn.mjs +0 -75
  370. package/dist/chunks/messages-CsH20vhP.mjs +0 -75
  371. package/dist/chunks/messages-CsjAGhzA.mjs +0 -75
  372. package/dist/chunks/messages-Cx7VKFOE.mjs +0 -75
  373. package/dist/chunks/messages-D3JeBwxo.mjs +0 -75
  374. package/dist/chunks/messages-D541fieJ.mjs +0 -75
  375. package/dist/chunks/messages-D7XPdglc.mjs +0 -75
  376. package/dist/chunks/messages-DBhylfvt.mjs +0 -75
  377. package/dist/chunks/messages-DCA120lW.mjs +0 -75
  378. package/dist/chunks/messages-DCf_xZMN.mjs +0 -75
  379. package/dist/chunks/messages-DDwXKCpe.mjs +0 -75
  380. package/dist/chunks/messages-DNKDlxcy.mjs +0 -75
  381. package/dist/chunks/messages-DPvEjrGK.mjs +0 -75
  382. package/dist/chunks/messages-DQ-AkNxA.mjs +0 -75
  383. package/dist/chunks/messages-DVuvkNap.mjs +0 -75
  384. package/dist/chunks/messages-DaglyqUT.mjs +0 -75
  385. package/dist/chunks/messages-Di0bAfwA.mjs +0 -75
  386. package/dist/chunks/messages-DuLct0Yr.mjs +0 -75
  387. package/dist/chunks/messages-DzEYYhZh.mjs +0 -75
  388. package/dist/chunks/messages-DznNGAB2.mjs +0 -75
  389. package/dist/chunks/messages-DzoIzyu8.mjs +0 -75
  390. package/dist/chunks/messages-QYOGmket.mjs +0 -75
  391. package/dist/chunks/messages-cEjGDAgI.mjs +0 -75
  392. package/dist/chunks/messages-ddhvrdpE.mjs +0 -75
  393. package/dist/chunks/messages-mwfNK5nZ.mjs +0 -75
  394. package/dist/chunks/messages-nG_vNDte.mjs +0 -75
  395. package/dist/chunks/messages-tDq3Owh7.mjs +0 -75
  396. package/dist/chunks/messages-x6VJVZKx.mjs +0 -75
  397. package/dist/messages-0Pxnqd4N.mjs +0 -75
  398. package/dist/messages-0ZXYUq7S.mjs +0 -75
  399. package/dist/messages-2OD2uUDS.mjs +0 -75
  400. package/dist/messages-7cEMfYzh.mjs +0 -75
  401. package/dist/messages-8mwfda1Q.mjs +0 -75
  402. package/dist/messages-B-FqWsBM.mjs +0 -75
  403. package/dist/messages-B1jzqWiQ.mjs +0 -75
  404. package/dist/messages-B5wk4Ezz.mjs +0 -75
  405. package/dist/messages-BAZ5Ld8x.mjs +0 -75
  406. package/dist/messages-BBhGp198.mjs +0 -75
  407. package/dist/messages-BC9IjIb7.mjs +0 -75
  408. package/dist/messages-BFEmpeV-.mjs +0 -75
  409. package/dist/messages-BGqzTZy0.mjs +0 -75
  410. package/dist/messages-BICs1abK.mjs +0 -75
  411. package/dist/messages-BJX6rOnd.mjs +0 -75
  412. package/dist/messages-BL2bXRhN.mjs +0 -75
  413. package/dist/messages-BMs5qdlH.mjs +0 -75
  414. package/dist/messages-BRsjUNwB.mjs +0 -75
  415. package/dist/messages-BSqV8OUR.mjs +0 -75
  416. package/dist/messages-BTqu3DfG.mjs +0 -75
  417. package/dist/messages-BXnDEsur.mjs +0 -75
  418. package/dist/messages-BYcre4-6.mjs +0 -75
  419. package/dist/messages-BZ9LRJf-.mjs +0 -75
  420. package/dist/messages-BgypBy7y.mjs +0 -75
  421. package/dist/messages-BsuGf70G.mjs +0 -75
  422. package/dist/messages-BwaoF4lQ.mjs +0 -75
  423. package/dist/messages-C1l8_7-y.mjs +0 -75
  424. package/dist/messages-C5NA_r9v.mjs +0 -75
  425. package/dist/messages-C6zgZ5pA.mjs +0 -75
  426. package/dist/messages-CAo5ghFI.mjs +0 -75
  427. package/dist/messages-CH9qlJ9I.mjs +0 -75
  428. package/dist/messages-CI0HqAeS.mjs +0 -75
  429. package/dist/messages-CJJtms9k.mjs +0 -75
  430. package/dist/messages-CM2hJqk6.mjs +0 -75
  431. package/dist/messages-CRMiDPIQ.mjs +0 -75
  432. package/dist/messages-CWsZuBj1.mjs +0 -75
  433. package/dist/messages-C_gLHo6A.mjs +0 -75
  434. package/dist/messages-Cbu-NUDn.mjs +0 -75
  435. package/dist/messages-Cjb_MCeh.mjs +0 -75
  436. package/dist/messages-ClXYO9Wn.mjs +0 -75
  437. package/dist/messages-CsH20vhP.mjs +0 -75
  438. package/dist/messages-CsjAGhzA.mjs +0 -75
  439. package/dist/messages-Cx7VKFOE.mjs +0 -75
  440. package/dist/messages-D3JeBwxo.mjs +0 -75
  441. package/dist/messages-D541fieJ.mjs +0 -75
  442. package/dist/messages-D7XPdglc.mjs +0 -75
  443. package/dist/messages-DBhylfvt.mjs +0 -75
  444. package/dist/messages-DCA120lW.mjs +0 -75
  445. package/dist/messages-DCf_xZMN.mjs +0 -75
  446. package/dist/messages-DDwXKCpe.mjs +0 -75
  447. package/dist/messages-DNKDlxcy.mjs +0 -75
  448. package/dist/messages-DPvEjrGK.mjs +0 -75
  449. package/dist/messages-DQ-AkNxA.mjs +0 -75
  450. package/dist/messages-DVuvkNap.mjs +0 -75
  451. package/dist/messages-DaglyqUT.mjs +0 -75
  452. package/dist/messages-Di0bAfwA.mjs +0 -75
  453. package/dist/messages-DuLct0Yr.mjs +0 -75
  454. package/dist/messages-DzEYYhZh.mjs +0 -75
  455. package/dist/messages-DznNGAB2.mjs +0 -75
  456. package/dist/messages-DzoIzyu8.mjs +0 -75
  457. package/dist/messages-QYOGmket.mjs +0 -75
  458. package/dist/messages-cEjGDAgI.mjs +0 -75
  459. package/dist/messages-ddhvrdpE.mjs +0 -75
  460. package/dist/messages-mwfNK5nZ.mjs +0 -75
  461. package/dist/messages-nG_vNDte.mjs +0 -75
  462. package/dist/messages-tDq3Owh7.mjs +0 -75
  463. package/dist/messages-x6VJVZKx.mjs +0 -75
@@ -0,0 +1,71 @@
1
+ import type { Block } from '../../../block';
2
+
3
+ const SPRING_LOAD_DELAY_MS = 500;
4
+ const SPRING_LOADING_ATTR = 'data-blok-spring-loading';
5
+ const SPRING_LOADED_ATTR = 'data-blok-spring-loaded';
6
+ const SPRING_LOADED_DURATION_MS = 700;
7
+
8
+ function isClosedToggle(block: Block): boolean {
9
+ return block.holder.querySelector('[data-blok-toggle-open="false"]') !== null;
10
+ }
11
+
12
+ /**
13
+ * Manages the spring-loading hover timer for collapsed toggle blocks during drag.
14
+ * After SPRING_LOAD_DELAY_MS of hovering over a closed toggle, it auto-expands it.
15
+ */
16
+ export class ToggleSpringLoader {
17
+ private timerId: ReturnType<typeof setTimeout> | null = null;
18
+ private currentBlock: Block | null = null;
19
+
20
+ /**
21
+ * Called on every mousemove during drag with the current hovered block (or null).
22
+ * Starts/resets/cancels the spring-load timer as appropriate.
23
+ */
24
+ public update(block: Block | null): void {
25
+ if (block === this.currentBlock) {
26
+ return; // Same block — don't restart timer
27
+ }
28
+
29
+ this.clearTimer();
30
+
31
+ if (block === null || !isClosedToggle(block)) {
32
+ this.currentBlock = null;
33
+ return;
34
+ }
35
+
36
+ this.currentBlock = block;
37
+ block.holder.setAttribute(SPRING_LOADING_ATTR, '');
38
+
39
+ this.timerId = setTimeout(() => {
40
+ this.timerId = null;
41
+ if (this.currentBlock) {
42
+ this.currentBlock.holder.removeAttribute(SPRING_LOADING_ATTR);
43
+ this.currentBlock.call('expand');
44
+ this.currentBlock.holder.setAttribute(SPRING_LOADED_ATTR, '');
45
+ const expandedBlock = this.currentBlock;
46
+ setTimeout(() => expandedBlock.holder.removeAttribute(SPRING_LOADED_ATTR), SPRING_LOADED_DURATION_MS);
47
+ this.currentBlock = null;
48
+ }
49
+ }, SPRING_LOAD_DELAY_MS);
50
+ }
51
+
52
+ /**
53
+ * Cancels any pending spring-load timer and cleans up visual state.
54
+ * Call on drag end / cleanup.
55
+ */
56
+ public cancel(): void {
57
+ this.clearTimer();
58
+ this.currentBlock = null;
59
+ }
60
+
61
+ private clearTimer(): void {
62
+ if (this.timerId !== null) {
63
+ clearTimeout(this.timerId);
64
+ this.timerId = null;
65
+ }
66
+ if (this.currentBlock) {
67
+ this.currentBlock.holder.removeAttribute(SPRING_LOADING_ATTR);
68
+ this.currentBlock = null;
69
+ }
70
+ }
71
+ }
@@ -22,7 +22,7 @@ export const DRAG_CONFIG = {
22
22
  */
23
23
  export const PREVIEW_STYLES = {
24
24
  base: 'fixed pointer-events-none z-10000 opacity-80 transition-none',
25
- content: 'relative mx-auto max-w-content',
25
+ content: 'relative mx-auto max-w-blok-content',
26
26
  } as const;
27
27
 
28
28
  /**
@@ -16,6 +16,7 @@ import { ToolbarAPI } from './api/toolbar';
16
16
  import { ToolsAPI } from './api/tools';
17
17
  import { TooltipAPI } from './api/tooltip';
18
18
  import { UiAPI } from './api/ui';
19
+ import { WidthAPI } from './api/width';
19
20
  import { BlockEvents } from './blockEvents';
20
21
  import { BlockManager } from './blockManager';
21
22
  import { BlockSelection } from './blockSelection';
@@ -34,6 +35,7 @@ import { Toolbar } from './toolbar/index';
34
35
  import { InlineToolbar } from './toolbar/inline';
35
36
  import { Tools } from './tools';
36
37
  import { UI } from './ui';
38
+ import { WidthManager } from './widthManager';
37
39
  import { YjsManager } from './yjs';
38
40
 
39
41
  /**
@@ -60,6 +62,7 @@ export {
60
62
  ToolbarAPI,
61
63
  TooltipAPI,
62
64
  UiAPI,
65
+ WidthAPI,
63
66
 
64
67
  // Toolbar Modules
65
68
  BlockSettings,
@@ -82,6 +85,7 @@ export {
82
85
  Saver,
83
86
  Tools,
84
87
  UI,
88
+ WidthManager,
85
89
  YjsManager,
86
90
  };
87
91
 
@@ -108,6 +112,7 @@ export const Modules = {
108
112
  ToolbarAPI,
109
113
  TooltipAPI,
110
114
  UiAPI,
115
+ WidthAPI,
111
116
 
112
117
  // Toolbar Modules
113
118
  BlockSettings,
@@ -130,5 +135,6 @@ export const Modules = {
130
135
  Saver,
131
136
  Tools,
132
137
  UI,
138
+ WidthManager,
133
139
  YjsManager,
134
- };
140
+ };
@@ -135,6 +135,25 @@ export class ModificationsObserver extends Module {
135
135
  }, this.batchTime);
136
136
  }
137
137
 
138
+ /**
139
+ * Cleans up the module: disconnects the MutationObserver and cancels any
140
+ * pending batching timeout. Called by the editor's destroy() chain so that
141
+ * webkit (and other browsers) can close the page cleanly without the
142
+ * MutationObserver firing on an already-destroyed instance or the pending
143
+ * setTimeout keeping the JS engine alive.
144
+ */
145
+ public destroy(): void {
146
+ this.disabled = true;
147
+ this.mutationObserver.disconnect();
148
+
149
+ if (this.batchingTimeout !== null) {
150
+ clearTimeout(this.batchingTimeout);
151
+ this.batchingTimeout = null;
152
+ }
153
+
154
+ this.batchingOnChangeQueue.clear();
155
+ }
156
+
138
157
  /**
139
158
  * Fired on every blocks wrapper dom change
140
159
  * @param mutations - mutations happened
@@ -21,6 +21,8 @@ export const SAFE_STRUCTURAL_TAGS = new Set<string>([
21
21
  'dl',
22
22
  'dt',
23
23
  'dd',
24
+ 'details',
25
+ 'summary',
24
26
  ]);
25
27
 
26
28
  /**
@@ -115,6 +115,8 @@ export abstract class BasePasteHandler implements PasteHandler {
115
115
  if (isMultipleItems) {
116
116
  this.redirectToTableParentIfNeeded(data, BlockManager);
117
117
 
118
+ const insertedByIndex: Array<Awaited<ReturnType<BlokModules['BlockManager']['paste']>>> = [];
119
+
118
120
  for (const [index, pasteData] of data.entries()) {
119
121
  /**
120
122
  * Force each pasted block into its own Yjs undo entry so that
@@ -126,7 +128,15 @@ export abstract class BasePasteHandler implements PasteHandler {
126
128
  * captureTimeout get merged into a single undo entry.
127
129
  */
128
130
  this.Blok.YjsManager.stopCapturing();
129
- await this.insertBlock(pasteData, index === 0 && canReplaceCurrentBlock);
131
+ const shouldReplace = index === 0 && canReplaceCurrentBlock && BlockManager.currentBlock?.isEmpty === true;
132
+ const block = shouldReplace
133
+ ? await BlockManager.paste(pasteData.tool, pasteData.event, true)
134
+ : await BlockManager.paste(pasteData.tool, pasteData.event);
135
+
136
+ Caret.setToBlock(block, Caret.positions.END);
137
+ insertedByIndex.push(block);
138
+
139
+ this.applyPastedBlockParent(block, pasteData, insertedByIndex, BlockManager);
130
140
  }
131
141
 
132
142
  BlockManager.currentBlock && Caret.setToBlock(BlockManager.currentBlock, Caret.positions.END);
@@ -146,6 +156,28 @@ export abstract class BasePasteHandler implements PasteHandler {
146
156
  await this.processInlinePaste(singleItem, canReplaceCurrentBlock);
147
157
  }
148
158
 
159
+ /**
160
+ * Wire up the parent relationship for a pasted block.
161
+ */
162
+ private applyPastedBlockParent(
163
+ block: Awaited<ReturnType<BlokModules['BlockManager']['paste']>>,
164
+ pasteData: PasteData,
165
+ insertedByIndex: Array<Awaited<ReturnType<BlokModules['BlockManager']['paste']>>>,
166
+ BlockManager: BlokModules['BlockManager']
167
+ ): void {
168
+ if (pasteData.parentPasteIndex !== undefined) {
169
+ const parentBlock = insertedByIndex[pasteData.parentPasteIndex];
170
+
171
+ if (parentBlock) {
172
+ BlockManager.setBlockParent(block, parentBlock.id);
173
+ }
174
+ } else if (block.parentId != null) {
175
+ // Root-level pasted block: clear any parent that was inherited from
176
+ // the predecessor (e.g. the previous child block that had a parent).
177
+ BlockManager.setBlockParent(block, null);
178
+ }
179
+ }
180
+
149
181
  /**
150
182
  * Insert a single block.
151
183
  */
@@ -66,74 +66,131 @@ export class HtmlHandler extends BasePasteHandler implements PasteHandler {
66
66
 
67
67
  const nodes = this.getNodes(wrapper);
68
68
 
69
- return nodes
70
- .map((node) => {
71
- const nodeData = (() => {
72
- switch (node.nodeType) {
73
- case Node.DOCUMENT_FRAGMENT_NODE: {
74
- const fragmentWrapper = dom$.make('div');
75
-
76
- fragmentWrapper.appendChild(node);
77
-
78
- return {
79
- content: fragmentWrapper,
80
- tool: Tools.defaultTool,
81
- isBlock: false,
82
- };
83
- }
84
-
85
- case Node.ELEMENT_NODE: {
86
- const elementContent = node as HTMLElement;
87
- const tagSubstitute = this.toolRegistry.findToolForTag(elementContent.tagName) ?? undefined;
88
-
89
- return {
90
- content: elementContent,
91
- tool: tagSubstitute?.tool ?? Tools.defaultTool,
92
- isBlock: true,
93
- };
94
- }
95
-
96
- default:
97
- return null;
69
+ // Pre-expand DETAILS nodes: extract child elements (non-summary) before
70
+ // sanitization strips them, and carry a parentExpandedIndex reference so
71
+ // we can remap to final post-filter indices later.
72
+ type NodeEntry = { node: Node; parentExpandedIndex?: number };
73
+
74
+ const expandedNodes: NodeEntry[] = [];
75
+
76
+ for (const node of nodes) {
77
+ const isDetailsElement =
78
+ node.nodeType === Node.ELEMENT_NODE &&
79
+ (node as HTMLElement).tagName === 'DETAILS';
80
+
81
+ if (!isDetailsElement) {
82
+ expandedNodes.push({ node });
83
+ continue;
84
+ }
85
+
86
+ const toggleExpandedIndex = expandedNodes.length;
87
+
88
+ expandedNodes.push({ node });
89
+
90
+ // Only direct children are extracted (not deeply nested structures), which
91
+ // is correct for Google Docs DETAILS format where children are flat siblings.
92
+ const childElements = Array.from((node as HTMLElement).children).filter(
93
+ (child) => child.tagName !== 'SUMMARY'
94
+ );
95
+
96
+ for (const child of childElements) {
97
+ expandedNodes.push({ node: child, parentExpandedIndex: toggleExpandedIndex });
98
+ }
99
+ }
100
+
101
+ // Map expanded nodes to intermediate results, preserving original index.
102
+ type MappedEntry = { data: PasteData; originalIndex: number } | null;
103
+
104
+ const mapped: MappedEntry[] = expandedNodes.map(({ node, parentExpandedIndex }, originalIndex) => {
105
+ const nodeData = (() => {
106
+ switch (node.nodeType) {
107
+ case Node.DOCUMENT_FRAGMENT_NODE: {
108
+ const fragmentWrapper = dom$.make('div');
109
+
110
+ fragmentWrapper.appendChild(node);
111
+
112
+ return {
113
+ content: fragmentWrapper,
114
+ tool: Tools.defaultTool,
115
+ isBlock: false,
116
+ };
98
117
  }
99
- })();
100
118
 
101
- if (!nodeData) {
102
- return null;
119
+ case Node.ELEMENT_NODE: {
120
+ const elementContent = node as HTMLElement;
121
+ const tagSubstitute = this.toolRegistry.findToolForTag(elementContent.tagName) ?? undefined;
122
+
123
+ return {
124
+ content: elementContent,
125
+ tool: tagSubstitute?.tool ?? Tools.defaultTool,
126
+ isBlock: true,
127
+ };
128
+ }
129
+
130
+ default:
131
+ return null;
103
132
  }
133
+ })();
104
134
 
105
- const { content, tool, isBlock } = nodeData;
135
+ if (!nodeData) {
136
+ return null;
137
+ }
106
138
 
107
- const toolTags = this.buildToolTags(tool);
139
+ const { content, tool, isBlock } = nodeData;
108
140
 
109
- const structuralSanitizeConfig = this.sanitizerBuilder.getStructuralTagsConfig(content);
110
- const customConfig: SanitizerConfig = { ...structuralSanitizeConfig, ...toolTags, ...tool.baseSanitizeConfig, br: {} };
111
- const sanitizedContent = this.sanitizeContent(content, customConfig);
141
+ const toolTags = this.buildToolTags(tool);
112
142
 
113
- if (!sanitizedContent) {
114
- return null;
115
- }
143
+ const structuralSanitizeConfig = this.sanitizerBuilder.getStructuralTagsConfig(content);
144
+ const customConfig: SanitizerConfig = { ...structuralSanitizeConfig, ...toolTags, ...tool.baseSanitizeConfig, br: {} };
145
+ const sanitizedContent = this.sanitizeContent(content, customConfig);
116
146
 
117
- const event = this.composePasteEvent('tag', {
118
- data: sanitizedContent,
119
- });
147
+ if (!sanitizedContent) {
148
+ return null;
149
+ }
120
150
 
121
- return {
151
+ const event = this.composePasteEvent('tag', {
152
+ data: sanitizedContent,
153
+ });
154
+
155
+ return {
156
+ data: {
122
157
  content: sanitizedContent,
123
158
  isBlock,
124
159
  tool: tool.name,
125
160
  event,
126
- };
127
- })
128
- .filter((data): data is PasteData => {
129
- if (!data) {
130
- return false;
131
- }
132
- const isContentEmpty = dom$.isEmpty(data.content);
133
- const isSingleTag = dom$.isSingleTag(data.content);
161
+ parentPasteIndex: parentExpandedIndex,
162
+ },
163
+ originalIndex,
164
+ };
165
+ });
166
+
167
+ // Filter, tracking the mapping from original (expandedNodes) index → final index.
168
+ const oldToNewIndex = new Map<number, number>();
169
+ const filtered: PasteData[] = [];
170
+
171
+ for (const entry of mapped) {
172
+ if (!entry) {
173
+ continue;
174
+ }
175
+ const { data, originalIndex } = entry;
176
+ const isContentEmpty = dom$.isEmpty(data.content);
177
+ const isSingleTag = dom$.isSingleTag(data.content);
134
178
 
135
- return !isContentEmpty || isSingleTag;
136
- });
179
+ if (!isContentEmpty || isSingleTag) {
180
+ oldToNewIndex.set(originalIndex, filtered.length);
181
+ filtered.push(data);
182
+ }
183
+ }
184
+
185
+ // Remap parentPasteIndex from expandedNodes indices to final filtered indices.
186
+ for (const item of filtered) {
187
+ if (item.parentPasteIndex !== undefined) {
188
+ // undefined means parent was filtered out → child becomes root-level
189
+ item.parentPasteIndex = oldToNewIndex.get(item.parentPasteIndex);
190
+ }
191
+ }
192
+
193
+ return filtered;
137
194
  }
138
195
 
139
196
  /**
@@ -189,6 +246,16 @@ export class HtmlHandler extends BasePasteHandler implements PasteHandler {
189
246
  const toolTags = tool ? this.toolRegistry.getToolTags(tool.name) : [];
190
247
 
191
248
  const isSubstitutable = tags.includes(element.tagName);
249
+
250
+ // DETAILS is a container-type substitutable element. Always return it as an
251
+ // atomic block so the toggle tool's onPaste receives the full <details>
252
+ // element (including <summary> and children), rather than having them split
253
+ // into flat blocks when the paragraph tool's <p> registration triggers
254
+ // containsAnotherToolTags = true.
255
+ if (isSubstitutable && element.tagName === 'DETAILS') {
256
+ return [...nodes, destNode, element];
257
+ }
258
+
192
259
  const isBlockElement = dom$.blockElements.includes(element.tagName.toLowerCase());
193
260
  const isStructuralElement = SAFE_STRUCTURAL_TAGS.has(element.tagName.toLowerCase());
194
261
  const containsAnotherToolTags = Array
@@ -3,6 +3,7 @@ import { Module } from '../../__module';
3
3
  import { Dom as dom$ } from '../../dom';
4
4
  import { composeSanitizerConfig, clean } from '../../utils/sanitizer';
5
5
 
6
+ import { SAFE_STRUCTURAL_TAGS } from './constants';
6
7
  import { preprocessGoogleDocsHtml } from './google-docs-preprocessor';
7
8
  import type { PasteHandler } from './handlers/base';
8
9
  import { BlokDataHandler } from './handlers/blok-data-handler';
@@ -202,8 +203,12 @@ export class Paste extends Module {
202
203
  // Build sanitize config first
203
204
  const toolsTags = this.sanitizerBuilder.buildToolsTagsConfig(this.toolRegistry.toolsTags);
204
205
  const inlineSanitizeConfig = this.Blok.Tools.getAllInlineToolsSanitizeConfig();
206
+ const structuralTagsConfig = Object.fromEntries(
207
+ [...SAFE_STRUCTURAL_TAGS].map((tag) => [tag, {}])
208
+ ) as SanitizerConfig;
205
209
  const customConfig = composeSanitizerConfig(
206
210
  this.config.sanitizer as SanitizerConfig,
211
+ structuralTagsConfig,
207
212
  toolsTags,
208
213
  inlineSanitizeConfig,
209
214
  { br: {} }
@@ -36,6 +36,11 @@ export interface PasteData {
36
36
  content: HTMLElement;
37
37
  event: PasteEvent;
38
38
  isBlock: boolean;
39
+ /**
40
+ * Index into the current paste batch that is this block's parent.
41
+ * When set, `insertPasteData` will call `setBlockParent` after inserting.
42
+ */
43
+ parentPasteIndex?: number;
39
44
  }
40
45
 
41
46
  /**