edytor 1.0.0-rc.3 → 2.0.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 (667) hide show
  1. package/README.md +21 -39
  2. package/dist/block/block.svelte.d.ts +11 -84
  3. package/dist/block/block.svelte.js +30 -134
  4. package/dist/block/colors.d.ts +0 -9
  5. package/dist/block/colors.js +1 -18
  6. package/dist/block/contentRange.d.ts +5 -1
  7. package/dist/block/contentRange.js +15 -16
  8. package/dist/block/inlineBlock.svelte.d.ts +11 -9
  9. package/dist/block/inlineBlock.svelte.js +18 -21
  10. package/dist/clipboard/createClipboardFragment.js +22 -64
  11. package/dist/clipboard/fragmentData.js +17 -42
  12. package/dist/clipboard/htmlFlow.js +7 -7
  13. package/dist/clipboard/insertClipboardFragment.js +5 -4
  14. package/dist/clipboard/moveText.js +16 -8
  15. package/dist/clipboard/serializeClipboardFragment.d.ts +2 -0
  16. package/dist/clipboard/serializeClipboardFragment.js +32 -28
  17. package/dist/cloudflare/DocumentRoom.d.ts +4 -17
  18. package/dist/cloudflare/DocumentRoom.js +3 -5
  19. package/dist/cloudflare/move.d.ts +1 -18
  20. package/dist/cloudflare/move.js +2 -48
  21. package/dist/cloudflare/room/admission.d.ts +1 -60
  22. package/dist/cloudflare/room/admission.js +25 -29
  23. package/dist/cloudflare/room/comments.d.ts +1 -3
  24. package/dist/cloudflare/room/comments.js +6 -6
  25. package/dist/cloudflare/room/context.d.ts +25 -82
  26. package/dist/cloudflare/room/context.js +8 -8
  27. package/dist/cloudflare/room/forged.d.ts +1 -1
  28. package/dist/cloudflare/room/forged.js +2 -12
  29. package/dist/cloudflare/room/frames.d.ts +1 -1
  30. package/dist/cloudflare/room/frames.js +1 -1
  31. package/dist/cloudflare/room/history.d.ts +1 -25
  32. package/dist/cloudflare/room/history.js +39 -54
  33. package/dist/cloudflare/room/moves.d.ts +1 -13
  34. package/dist/cloudflare/room/moves.js +33 -57
  35. package/dist/cloudflare/room/presence.d.ts +1 -11
  36. package/dist/cloudflare/room/presence.js +4 -4
  37. package/dist/cloudflare/room/purge.d.ts +1 -2
  38. package/dist/cloudflare/room/purge.js +2 -2
  39. package/dist/cloudflare/room/replicas.d.ts +1 -7
  40. package/dist/cloudflare/room/replicas.js +2 -2
  41. package/dist/cloudflare/room/storage.d.ts +3 -32
  42. package/dist/cloudflare/room/storage.js +33 -108
  43. package/dist/cloudflare/room/updates.d.ts +4 -4
  44. package/dist/cloudflare/room/updates.js +17 -24
  45. package/dist/cloudflare/room/validation.d.ts +1 -5
  46. package/dist/cloudflare/room/validation.js +16 -37
  47. package/dist/collaboration/RemoteSelections.svelte +13 -17
  48. package/dist/collaboration/awarenessSelection.d.ts +22 -1
  49. package/dist/collaboration/awarenessSelection.js +42 -0
  50. package/dist/collaboration/comments/client.d.ts +2 -2
  51. package/dist/collaboration/comments/client.js +1 -1
  52. package/dist/collaboration/history/index.d.ts +5 -5
  53. package/dist/collaboration/history/index.js +5 -5
  54. package/dist/collaboration/history/panel.svelte.d.ts +91 -0
  55. package/dist/collaboration/history/panel.svelte.js +223 -0
  56. package/dist/collaboration/providers.d.ts +12 -3
  57. package/dist/collaboration/providers.js +5 -4
  58. package/dist/components/Block.svelte +42 -56
  59. package/dist/components/Block.svelte.d.ts +7 -5
  60. package/dist/components/Content.svelte +1 -5
  61. package/dist/components/Edytor.svelte +82 -99
  62. package/dist/components/Edytor.svelte.d.ts +16 -13
  63. package/dist/components/InlineBlock.svelte +1 -1
  64. package/dist/components/Ranges.svelte +96 -0
  65. package/dist/components/Ranges.svelte.d.ts +19 -0
  66. package/dist/components/Suggestion.svelte +3 -2
  67. package/dist/components/Text.svelte +2 -5
  68. package/dist/components/Text.svelte.d.ts +1 -1
  69. package/dist/crdt/admission.d.ts +2 -9
  70. package/dist/crdt/admission.js +3 -9
  71. package/dist/crdt/attribution/attribution.d.ts +11 -72
  72. package/dist/crdt/attribution/attribution.js +5 -52
  73. package/dist/crdt/attribution/block.d.ts +0 -78
  74. package/dist/crdt/attribution/block.js +1 -144
  75. package/dist/crdt/data.d.ts +18 -13
  76. package/dist/crdt/data.js +49 -71
  77. package/dist/crdt/doc/anchors.js +4 -4
  78. package/dist/crdt/doc/content.d.ts +5 -1
  79. package/dist/crdt/doc/content.js +3 -1
  80. package/dist/crdt/doc/delete.d.ts +1 -0
  81. package/dist/crdt/doc/funnel.d.ts +0 -23
  82. package/dist/crdt/doc/funnel.js +34 -85
  83. package/dist/crdt/doc/gate.d.ts +8 -9
  84. package/dist/crdt/doc/gate.js +7 -17
  85. package/dist/crdt/doc/history.d.ts +87 -14
  86. package/dist/crdt/doc/history.js +334 -149
  87. package/dist/crdt/doc/layout.d.ts +0 -1
  88. package/dist/crdt/doc/layout.js +2 -3
  89. package/dist/crdt/doc/meta.d.ts +4 -4
  90. package/dist/crdt/doc/meta.js +10 -21
  91. package/dist/crdt/doc/moves.d.ts +4 -4
  92. package/dist/crdt/doc/moves.js +5 -5
  93. package/dist/crdt/doc/plan.d.ts +2 -0
  94. package/dist/crdt/doc/plan.js +2 -0
  95. package/dist/crdt/doc/reads.d.ts +8 -5
  96. package/dist/crdt/doc/reads.js +49 -50
  97. package/dist/crdt/doc/seed.d.ts +15 -6
  98. package/dist/crdt/doc/seed.js +27 -26
  99. package/dist/crdt/doc/split-merge.d.ts +1 -3
  100. package/dist/crdt/doc/split-merge.js +4 -5
  101. package/dist/crdt/doc/steps.d.ts +3 -7
  102. package/dist/crdt/doc/steps.js +20 -9
  103. package/dist/crdt/doc/types.d.ts +0 -10
  104. package/dist/crdt/document.d.ts +32 -115
  105. package/dist/crdt/document.js +216 -302
  106. package/dist/crdt/edytor-doc.d.ts +689 -90
  107. package/dist/crdt/edytor-doc.js +74 -149
  108. package/dist/crdt/engine-api.d.ts +15 -47
  109. package/dist/crdt/engine.d.ts +7 -17
  110. package/dist/crdt/engine.js +9 -19
  111. package/dist/crdt/flow.d.ts +9 -37
  112. package/dist/crdt/flow.js +260 -238
  113. package/dist/crdt/index.d.ts +32 -85
  114. package/dist/crdt/index.js +21 -47
  115. package/dist/crdt/operations.d.ts +24 -33
  116. package/dist/crdt/operations.js +8 -17
  117. package/dist/crdt/placement/display.d.ts +0 -2
  118. package/dist/crdt/placement/display.js +0 -15
  119. package/dist/crdt/placement/model.d.ts +160 -12
  120. package/dist/crdt/placement/model.js +413 -414
  121. package/dist/crdt/placement/rank.d.ts +1 -5
  122. package/dist/crdt/placement/rank.js +28 -38
  123. package/dist/crdt/props.d.ts +32 -0
  124. package/dist/crdt/props.js +172 -0
  125. package/dist/crdt/protocol.d.ts +4 -5
  126. package/dist/crdt/protocol.js +3 -4
  127. package/dist/crdt/protocols/awareness.d.ts +3 -7
  128. package/dist/crdt/protocols/awareness.js +17 -33
  129. package/dist/crdt/protocols/envelope.d.ts +9 -29
  130. package/dist/crdt/protocols/envelope.js +8 -25
  131. package/dist/crdt/protocols/sync.d.ts +15 -30
  132. package/dist/crdt/protocols/sync.js +27 -89
  133. package/dist/crdt/providers/bound.d.ts +3 -1
  134. package/dist/crdt/providers/bound.js +3 -1
  135. package/dist/crdt/providers/container.d.ts +11 -17
  136. package/dist/crdt/providers/container.js +39 -27
  137. package/dist/crdt/providers/index.d.ts +34 -6
  138. package/dist/crdt/providers/index.js +106 -111
  139. package/dist/crdt/providers/indexeddb.d.ts +2 -12
  140. package/dist/crdt/providers/indexeddb.js +29 -90
  141. package/dist/crdt/providers/room.d.ts +58 -2
  142. package/dist/crdt/providers/room.js +38 -21
  143. package/dist/crdt/providers/websocket.d.ts +1 -1
  144. package/dist/crdt/providers/websocket.js +3 -4
  145. package/dist/crdt/purge.d.ts +2 -2
  146. package/dist/crdt/purge.js +69 -6
  147. package/dist/crdt/rangeDelete.d.ts +4 -42
  148. package/dist/crdt/rangeDelete.js +7 -6
  149. package/dist/crdt/restore.d.ts +21 -1
  150. package/dist/crdt/restore.js +54 -59
  151. package/dist/crdt/schema.d.ts +2 -2
  152. package/dist/crdt/schema.js +4 -5
  153. package/dist/crdt/semantics.d.ts +10 -15
  154. package/dist/crdt/semantics.js +22 -21
  155. package/dist/crdt/storage.d.ts +7 -13
  156. package/dist/crdt/storage.js +10 -24
  157. package/dist/crdt/structs.d.ts +42 -47
  158. package/dist/crdt/structs.js +76 -67
  159. package/dist/crdt/tables.d.ts +9 -0
  160. package/dist/crdt/tables.js +20 -0
  161. package/dist/crdt/text/delete-index.d.ts +0 -13
  162. package/dist/crdt/text/delete-index.js +7 -14
  163. package/dist/crdt/text/deletes.d.ts +9 -22
  164. package/dist/crdt/text/deletes.js +11 -74
  165. package/dist/crdt/text/index/cache.js +3 -3
  166. package/dist/crdt/text/index/fold.d.ts +1 -2
  167. package/dist/crdt/text/index/fold.js +15 -10
  168. package/dist/crdt/text/index/layout.d.ts +0 -10
  169. package/dist/crdt/text/index/layout.js +6 -20
  170. package/dist/crdt/text/index/records.js +2 -1
  171. package/dist/crdt/text/index/report.js +5 -6
  172. package/dist/crdt/text/index/shared.d.ts +11 -4
  173. package/dist/crdt/text/index/shared.js +8 -7
  174. package/dist/crdt/text/index/state.d.ts +3 -33
  175. package/dist/crdt/text/index/state.js +2 -4
  176. package/dist/crdt/text/model.d.ts +82 -2
  177. package/dist/crdt/text/model.js +344 -354
  178. package/dist/crdt/text/rows.d.ts +0 -2
  179. package/dist/crdt/text/rows.js +0 -11
  180. package/dist/crdt/text/runs.d.ts +6 -3
  181. package/dist/crdt/text/runs.js +132 -137
  182. package/dist/crdt/text/streams.d.ts +1 -1
  183. package/dist/crdt/text/streams.js +1 -1
  184. package/dist/crdt/vendor/yjs/API-NOTES.md +25 -8
  185. package/dist/crdt/vendor/yjs/UPSTREAM.md +288 -8
  186. package/dist/crdt/vendor/yjs/dts/global.d.ts +5 -26
  187. package/dist/crdt/vendor/yjs/dts/index.d.ts +10 -15
  188. package/dist/crdt/vendor/yjs/dts/structs/AbstractStruct.d.ts +2 -2
  189. package/dist/crdt/vendor/yjs/dts/structs/Item.d.ts +14 -219
  190. package/dist/crdt/vendor/yjs/dts/structs/Skip.d.ts +2 -2
  191. package/dist/crdt/vendor/yjs/dts/utils/BlockSet.d.ts +2 -2
  192. package/dist/crdt/vendor/yjs/dts/utils/Doc.d.ts +12 -123
  193. package/dist/crdt/vendor/yjs/dts/utils/ID.d.ts +1 -1
  194. package/dist/crdt/vendor/yjs/dts/utils/RangeCursor.d.ts +37 -58
  195. package/dist/crdt/vendor/yjs/dts/utils/Transaction.d.ts +3 -78
  196. package/dist/crdt/vendor/yjs/dts/utils/UpdateDecoder.d.ts +2 -81
  197. package/dist/crdt/vendor/yjs/dts/utils/UpdateEncoder.d.ts +2 -74
  198. package/dist/crdt/vendor/yjs/dts/utils/encoding-helpers.d.ts +4 -4
  199. package/dist/crdt/vendor/yjs/dts/utils/encoding.d.ts +6 -18
  200. package/dist/crdt/vendor/yjs/dts/utils/ids.d.ts +12 -237
  201. package/dist/crdt/vendor/yjs/dts/utils/positions.d.ts +5 -0
  202. package/dist/crdt/vendor/yjs/dts/utils/redo.d.ts +3 -0
  203. package/dist/crdt/vendor/yjs/dts/utils/transaction-helpers.d.ts +1 -3
  204. package/dist/crdt/vendor/yjs/dts/utils/updates.d.ts +6 -23
  205. package/dist/crdt/vendor/yjs/dts/ynode.d.ts +73 -498
  206. package/dist/crdt/vendor/yjs/global.d.ts +5 -26
  207. package/dist/crdt/vendor/yjs/src/index.js +11 -25
  208. package/dist/crdt/vendor/yjs/src/structs/AbstractStruct.js +1 -1
  209. package/dist/crdt/vendor/yjs/src/structs/GC.js +1 -1
  210. package/dist/crdt/vendor/yjs/src/structs/Item.js +10 -372
  211. package/dist/crdt/vendor/yjs/src/structs/Skip.js +1 -1
  212. package/dist/crdt/vendor/yjs/src/utils/BlockSet.js +2 -2
  213. package/dist/crdt/vendor/yjs/src/utils/Doc.js +14 -170
  214. package/dist/crdt/vendor/yjs/src/utils/ID.js +1 -1
  215. package/dist/crdt/vendor/yjs/src/utils/RangeCursor.js +61 -128
  216. package/dist/crdt/vendor/yjs/src/utils/StructStore.js +0 -22
  217. package/dist/crdt/vendor/yjs/src/utils/Transaction.js +17 -282
  218. package/dist/crdt/vendor/yjs/src/utils/UpdateDecoder.js +3 -130
  219. package/dist/crdt/vendor/yjs/src/utils/UpdateEncoder.js +2 -132
  220. package/dist/crdt/vendor/yjs/src/utils/encoding-helpers.js +4 -4
  221. package/dist/crdt/vendor/yjs/src/utils/encoding.js +49 -146
  222. package/dist/crdt/vendor/yjs/src/utils/ids.js +23 -900
  223. package/dist/crdt/vendor/yjs/src/utils/positions.js +115 -0
  224. package/dist/crdt/vendor/yjs/src/utils/redo.js +143 -0
  225. package/dist/crdt/vendor/yjs/src/utils/transaction-helpers.js +10 -127
  226. package/dist/crdt/vendor/yjs/src/utils/updates.js +7 -50
  227. package/dist/crdt/vendor/yjs/src/ynode.js +261 -2226
  228. package/dist/dnd/autoScroll.js +1 -2
  229. package/dist/{plugins/blockHandles → dnd}/dropIndicator.d.ts +2 -2
  230. package/dist/{plugins/blockHandles → dnd}/dropIndicator.js +52 -60
  231. package/dist/{plugins/blockHandles → dnd}/geometry.d.ts +4 -3
  232. package/dist/{plugins/blockHandles → dnd}/geometry.js +6 -6
  233. package/dist/dnd/placement.d.ts +200 -0
  234. package/dist/dnd/placement.js +426 -0
  235. package/dist/dnd/pragmatic.d.ts +4 -22
  236. package/dist/dnd/pragmatic.js +7 -26
  237. package/dist/dnd/track.d.ts +14 -0
  238. package/dist/dnd/track.js +55 -0
  239. package/dist/dnd/vendor/pragmatic/UPSTREAM.md +103 -0
  240. package/dist/dnd/vendor/pragmatic/bind-event-listener/LICENSE +21 -0
  241. package/dist/dnd/vendor/pragmatic/bind-event-listener/bind-all.js +46 -0
  242. package/dist/dnd/vendor/pragmatic/bind-event-listener/bind.js +7 -0
  243. package/dist/dnd/vendor/pragmatic/bind-event-listener/index.js +2 -0
  244. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/LICENSE.md +11 -0
  245. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter-native-data-key.js +6 -0
  246. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.d.ts +57 -0
  247. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.js +306 -0
  248. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.d.ts +8 -0
  249. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.js +10 -0
  250. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.d.ts +4 -0
  251. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.js +6 -0
  252. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/types.d.ts +1 -0
  253. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/get-element-from-point-without-honey-pot.js +12 -0
  254. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/honey-pot-data-attribute.js +3 -0
  255. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/is-honey-pot-element.js +4 -0
  256. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/make-honey-pot-fix.js +333 -0
  257. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/internal-types.d.ts +350 -0
  258. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/dispatch-consumer-event.js +128 -0
  259. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/lifecycle-manager.js +340 -0
  260. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/usage-ledger.js +32 -0
  261. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-adapter.js +59 -0
  262. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-drop-target.js +288 -0
  263. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-monitor.js +85 -0
  264. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/combine.js +6 -0
  265. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.d.ts +36 -0
  266. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.js +153 -0
  267. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/types.d.ts +16 -0
  268. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/once.js +13 -0
  269. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/add-attribute.js +7 -0
  270. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/android.js +10 -0
  271. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/count-events-for-safari.js +104 -0
  272. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-from-another-window.js +16 -0
  273. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window-in-safari.js +12 -0
  274. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window.js +55 -0
  275. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/detect-broken-drag.js +48 -0
  276. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/get-input.js +14 -0
  277. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-firefox.js +13 -0
  278. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-safari.js +19 -0
  279. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/max-z-index.js +3 -0
  280. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/text-media-type.js +6 -0
  281. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/url-media-type.js +6 -0
  282. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/popover-reset-styles.js +40 -0
  283. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/supports-popover.js +16 -0
  284. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/LICENSE.md +11 -0
  285. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.d.ts +4 -0
  286. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.js +8 -0
  287. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/internal-types.d.ts +50 -0
  288. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/data-attributes.js +9 -0
  289. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/get-scroll-by.js +117 -0
  290. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/make-api.js +90 -0
  291. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/try-scroll.js +183 -0
  292. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/axis.js +22 -0
  293. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/can-scroll-on-edge.js +17 -0
  294. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/configuration.js +49 -0
  295. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/edges.js +9 -0
  296. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/engagement-history.js +43 -0
  297. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-over-element-hitbox.js +50 -0
  298. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-percentage-in-range.js +19 -0
  299. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-scroll-change.js +106 -0
  300. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-axis-allowed.js +3 -0
  301. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-within.js +11 -0
  302. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/scheduler.js +104 -0
  303. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/side.js +6 -0
  304. package/dist/dnd/vendor/pragmatic/raf-schd/LICENSE +21 -0
  305. package/dist/dnd/vendor/pragmatic/raf-schd/raf-schd.esm.js +34 -0
  306. package/dist/edytor.svelte.d.ts +46 -63
  307. package/dist/edytor.svelte.js +126 -181
  308. package/dist/events/beforeInputCommands.d.ts +6 -11
  309. package/dist/events/beforeInputCommands.js +189 -181
  310. package/dist/events/beforeInputDeleteCommands.d.ts +20 -1
  311. package/dist/events/beforeInputDeleteCommands.js +153 -204
  312. package/dist/events/domTextOffset.d.ts +9 -9
  313. package/dist/events/domTextOffset.js +20 -48
  314. package/dist/events/events.utils.d.ts +0 -2
  315. package/dist/events/events.utils.js +0 -4
  316. package/dist/events/nativeInteractiveControl.d.ts +13 -13
  317. package/dist/events/nativeInteractiveControl.js +28 -56
  318. package/dist/events/onBeforeInput.d.ts +6 -1
  319. package/dist/events/onBeforeInput.js +207 -331
  320. package/dist/events/onCopy.js +1 -5
  321. package/dist/events/onDrop.d.ts +7 -1
  322. package/dist/events/onDrop.js +64 -78
  323. package/dist/events/onFocus.d.ts +9 -4
  324. package/dist/events/onFocus.js +45 -67
  325. package/dist/events/onInput.d.ts +8 -4
  326. package/dist/events/onInput.js +34 -147
  327. package/dist/events/onKeyDown.js +55 -122
  328. package/dist/events/onPaste.d.ts +14 -1
  329. package/dist/events/onPaste.js +51 -76
  330. package/dist/index.d.ts +11 -15
  331. package/dist/index.js +3 -3
  332. package/dist/kinds.d.ts +4 -6
  333. package/dist/kinds.js +28 -27
  334. package/dist/labels.d.ts +83 -320
  335. package/dist/labels.js +181 -408
  336. package/dist/plugins/Chrome.svelte +29 -0
  337. package/dist/plugins/Chrome.svelte.d.ts +32 -0
  338. package/dist/plugins/Control.svelte +23 -0
  339. package/dist/plugins/Control.svelte.d.ts +30 -0
  340. package/dist/plugins/anchored.svelte.d.ts +47 -0
  341. package/dist/plugins/anchored.svelte.js +73 -0
  342. package/dist/plugins/arrowMove/arrowMove.d.ts +2 -1
  343. package/dist/plugins/arrowMove/arrowMove.js +9 -5
  344. package/dist/plugins/bands.svelte.d.ts +57 -0
  345. package/dist/plugins/bands.svelte.js +95 -0
  346. package/dist/plugins/blockHandles/BlockHandle.svelte +14 -154
  347. package/dist/plugins/blockHandles/BlockHandle.svelte.d.ts +2 -2
  348. package/dist/plugins/blockHandles/BlockHandleController.svelte.d.ts +21 -196
  349. package/dist/plugins/blockHandles/BlockHandleController.svelte.js +158 -573
  350. package/dist/plugins/blockHandles/BlockHandles.svelte +15 -23
  351. package/dist/plugins/blockHandles/BlockHandles.svelte.d.ts +2 -2
  352. package/dist/plugins/blockHandles/blockHandlesPlugin.d.ts +25 -39
  353. package/dist/plugins/blockHandles/blockHandlesPlugin.js +130 -185
  354. package/dist/plugins/blockHandles/dragPreview.d.ts +8 -6
  355. package/dist/plugins/blockHandles/dragPreview.js +18 -16
  356. package/dist/plugins/blockMenu/BlockMenuController.svelte.d.ts +28 -38
  357. package/dist/plugins/blockMenu/BlockMenuController.svelte.js +116 -183
  358. package/dist/plugins/blockMenu/blockMenuPlugin.d.ts +1 -3
  359. package/dist/plugins/blockMenu/blockMenuPlugin.js +12 -29
  360. package/dist/plugins/brand.d.ts +8 -0
  361. package/dist/plugins/brand.js +8 -0
  362. package/dist/plugins/chrome.d.ts +45 -38
  363. package/dist/plugins/chrome.js +59 -36
  364. package/dist/plugins/code/CodeHeader.svelte +8 -38
  365. package/dist/plugins/code/CodePlugin.svelte +53 -56
  366. package/dist/plugins/code/CodePlugin.svelte.d.ts +0 -2
  367. package/dist/plugins/code/LanguageMenu.svelte +16 -125
  368. package/dist/plugins/code/LanguageMenu.svelte.d.ts +2 -1
  369. package/dist/plugins/code/code.css +5 -117
  370. package/dist/plugins/code/header.svelte.d.ts +2 -11
  371. package/dist/plugins/code/header.svelte.js +11 -38
  372. package/dist/plugins/code/languageMenu.svelte.d.ts +12 -32
  373. package/dist/plugins/code/languageMenu.svelte.js +30 -160
  374. package/dist/plugins/code/languages.d.ts +9 -22
  375. package/dist/plugins/code/languages.js +39 -128
  376. package/dist/plugins/columns/ColumnResize.svelte +16 -27
  377. package/dist/plugins/columns/ColumnResize.svelte.d.ts +1 -1
  378. package/dist/plugins/columns/ColumnsPlugin.svelte +46 -78
  379. package/dist/plugins/columns/ColumnsPlugin.svelte.d.ts +0 -12
  380. package/dist/plugins/columns/columns.css +7 -26
  381. package/dist/plugins/columns/gaps.d.ts +7 -5
  382. package/dist/plugins/columns/gaps.js +11 -6
  383. package/dist/plugins/columns/resize.svelte.d.ts +17 -54
  384. package/dist/plugins/columns/resize.svelte.js +80 -173
  385. package/dist/plugins/comments/CommentsController.svelte.d.ts +1 -4
  386. package/dist/plugins/comments/CommentsController.svelte.js +14 -25
  387. package/dist/plugins/comments/CommentsSidebar.svelte +82 -431
  388. package/dist/plugins/comments/CommentsSidebar.svelte.d.ts +4 -2
  389. package/dist/plugins/comments/commentsPlugin.d.ts +25 -9
  390. package/dist/plugins/comments/commentsPlugin.js +12 -10
  391. package/dist/plugins/equation/EquationEditor.svelte +16 -130
  392. package/dist/plugins/equation/EquationEditor.svelte.d.ts +1 -2
  393. package/dist/plugins/equation/EquationPlugin.svelte +109 -172
  394. package/dist/plugins/equation/EquationPlugin.svelte.d.ts +3 -2
  395. package/dist/plugins/equation/EquationView.svelte +20 -11
  396. package/dist/plugins/equation/equation.css +7 -0
  397. package/dist/plugins/equation/equation.svelte.d.ts +37 -24
  398. package/dist/plugins/equation/equation.svelte.js +20 -94
  399. package/dist/plugins/equation/katex.js +6 -9
  400. package/dist/plugins/fileDrop.d.ts +28 -0
  401. package/dist/plugins/fileDrop.js +116 -0
  402. package/dist/plugins/find/FindController.svelte.d.ts +8 -13
  403. package/dist/plugins/find/FindController.svelte.js +34 -55
  404. package/dist/plugins/find/findPlugin.d.ts +4 -8
  405. package/dist/plugins/find/findPlugin.js +29 -9
  406. package/dist/plugins/image/ImageChrome.svelte +6 -167
  407. package/dist/plugins/image/ImageChrome.svelte.d.ts +0 -2
  408. package/dist/plugins/image/ImagePlugin.svelte +71 -151
  409. package/dist/plugins/image/ImagePlugin.svelte.d.ts +12 -41
  410. package/dist/plugins/image/ImageToolbarHost.svelte +37 -0
  411. package/dist/plugins/image/ImageToolbarHost.svelte.d.ts +9 -0
  412. package/dist/plugins/image/controls.svelte.d.ts +6 -36
  413. package/dist/plugins/image/controls.svelte.js +43 -212
  414. package/dist/plugins/image/image.css +17 -0
  415. package/dist/plugins/image/image.d.ts +0 -5
  416. package/dist/plugins/image/image.js +0 -3
  417. package/dist/plugins/image/toolbar.svelte.d.ts +69 -0
  418. package/dist/plugins/image/toolbar.svelte.js +145 -0
  419. package/dist/plugins/index.d.ts +30 -26
  420. package/dist/plugins/index.js +28 -22
  421. package/dist/plugins/list.svelte.d.ts +128 -0
  422. package/dist/plugins/list.svelte.js +217 -0
  423. package/dist/plugins/markdownShortcuts.d.ts +1 -1
  424. package/dist/plugins/markdownShortcuts.js +10 -9
  425. package/dist/plugins/marquee/MarqueeBox.svelte +3 -20
  426. package/dist/plugins/marquee/MarqueeBox.svelte.d.ts +1 -1
  427. package/dist/plugins/marquee/MarqueeController.svelte.d.ts +0 -2
  428. package/dist/plugins/marquee/MarqueeController.svelte.js +20 -23
  429. package/dist/plugins/marquee/marquee.js +4 -21
  430. package/dist/plugins/marquee/marqueePlugin.d.ts +4 -3
  431. package/dist/plugins/marquee/marqueePlugin.js +16 -15
  432. package/dist/plugins/media/AudioPlugin.svelte +13 -88
  433. package/dist/plugins/media/AudioPlugin.svelte.d.ts +11 -4
  434. package/dist/plugins/media/BookmarkPlugin.svelte +113 -120
  435. package/dist/plugins/media/BookmarkPlugin.svelte.d.ts +10 -15
  436. package/dist/plugins/media/EmbedPlugin.svelte +82 -86
  437. package/dist/plugins/media/EmbedPlugin.svelte.d.ts +11 -17
  438. package/dist/plugins/media/EmptySlot.svelte +44 -0
  439. package/dist/plugins/media/EmptySlot.svelte.d.ts +25 -0
  440. package/dist/plugins/media/FilePlugin.svelte +45 -113
  441. package/dist/plugins/media/FilePlugin.svelte.d.ts +21 -4
  442. package/dist/plugins/media/MediaEmpty.svelte +51 -90
  443. package/dist/plugins/media/MediaEmpty.svelte.d.ts +26 -10
  444. package/dist/plugins/media/SourceBlock.svelte +200 -0
  445. package/dist/plugins/media/SourceBlock.svelte.d.ts +34 -0
  446. package/dist/plugins/media/UploadPreview.svelte +32 -0
  447. package/dist/plugins/media/UploadPreview.svelte.d.ts +11 -0
  448. package/dist/plugins/media/VideoPlugin.svelte +14 -97
  449. package/dist/plugins/media/VideoPlugin.svelte.d.ts +12 -5
  450. package/dist/plugins/media/empty.svelte.d.ts +47 -46
  451. package/dist/plugins/media/empty.svelte.js +67 -60
  452. package/dist/plugins/media/media.d.ts +97 -44
  453. package/dist/plugins/media/media.js +77 -99
  454. package/dist/plugins/media/upload.css +23 -0
  455. package/dist/plugins/media/urlPaste.svelte.d.ts +6 -37
  456. package/dist/plugins/media/urlPaste.svelte.js +32 -102
  457. package/dist/plugins/mention/MentionPlugin.svelte +84 -126
  458. package/dist/plugins/mention/MentionPlugin.svelte.d.ts +17 -27
  459. package/dist/plugins/mention/mention.css +6 -0
  460. package/dist/plugins/page/PageLink.svelte +54 -38
  461. package/dist/plugins/page/PagePlugin.svelte +20 -18
  462. package/dist/plugins/page/PagePlugin.svelte.d.ts +2 -4
  463. package/dist/plugins/page/page.d.ts +35 -9
  464. package/dist/plugins/page/page.js +3 -4
  465. package/dist/plugins/pageLink/PageLinkPlugin.svelte +154 -109
  466. package/dist/plugins/pageLink/PageLinkPlugin.svelte.d.ts +19 -26
  467. package/dist/plugins/pageLink/pageLink.css +6 -0
  468. package/dist/plugins/planned.d.ts +10 -0
  469. package/dist/plugins/planned.js +12 -0
  470. package/dist/plugins/richtext/CalloutIcon.svelte +13 -26
  471. package/dist/plugins/richtext/CalloutIconPicker.svelte +26 -0
  472. package/dist/plugins/richtext/CalloutIconPicker.svelte.d.ts +9 -0
  473. package/dist/plugins/richtext/EmptyBody.svelte +13 -20
  474. package/dist/plugins/richtext/RichTextControl.svelte +39 -0
  475. package/dist/plugins/richtext/RichTextControl.svelte.d.ts +8 -0
  476. package/dist/plugins/richtext/RichTextPlugin.svelte +174 -183
  477. package/dist/plugins/richtext/RichTextPlugin.svelte.d.ts +34 -34
  478. package/dist/plugins/richtext/TodoCheckbox.svelte +10 -21
  479. package/dist/plugins/richtext/TodoCheckbox.svelte.d.ts +0 -2
  480. package/dist/plugins/richtext/body.js +2 -2
  481. package/dist/plugins/richtext/calloutIcons.svelte.d.ts +50 -55
  482. package/dist/plugins/richtext/calloutIcons.svelte.js +86 -174
  483. package/dist/plugins/richtext/callouts.d.ts +15 -0
  484. package/dist/plugins/richtext/callouts.js +23 -0
  485. package/dist/plugins/richtext/controls.svelte.d.ts +110 -0
  486. package/dist/plugins/richtext/controls.svelte.js +126 -0
  487. package/dist/plugins/richtext/richTextOperations.js +37 -28
  488. package/dist/plugins/richtext/richtext.css +6 -0
  489. package/dist/plugins/slashMenu/SlashMenuController.svelte.d.ts +2 -14
  490. package/dist/plugins/slashMenu/SlashMenuController.svelte.js +34 -71
  491. package/dist/plugins/slashMenu/slashMenuPlugin.d.ts +9 -26
  492. package/dist/plugins/slashMenu/slashMenuPlugin.js +27 -68
  493. package/dist/plugins/suggestions/SuggestionBars.svelte +27 -84
  494. package/dist/plugins/suggestions/SuggestionBars.svelte.d.ts +9 -3
  495. package/dist/plugins/suggestions/suggestionsPlugin.d.ts +10 -18
  496. package/dist/plugins/suggestions/suggestionsPlugin.js +9 -24
  497. package/dist/plugins/table/TableChrome.svelte +40 -124
  498. package/dist/plugins/table/TablePlugin.svelte +106 -168
  499. package/dist/plugins/table/TablePlugin.svelte.d.ts +0 -4
  500. package/dist/plugins/table/chrome.svelte.d.ts +38 -141
  501. package/dist/plugins/table/chrome.svelte.js +340 -589
  502. package/dist/plugins/table/ops.d.ts +47 -0
  503. package/dist/plugins/table/ops.js +233 -0
  504. package/dist/plugins/table/table.css +16 -152
  505. package/dist/plugins/table/table.d.ts +15 -14
  506. package/dist/plugins/table/table.js +22 -16
  507. package/dist/plugins/toc/TableOfContents.svelte +32 -38
  508. package/dist/plugins/toc/TableOfContents.svelte.d.ts +1 -5
  509. package/dist/plugins/toc/TocPlugin.svelte +22 -22
  510. package/dist/plugins/toc/TocPlugin.svelte.d.ts +4 -6
  511. package/dist/plugins/toc/toc.d.ts +41 -10
  512. package/dist/plugins/toc/toc.js +2 -3
  513. package/dist/plugins/toolbar/ToolbarController.svelte.d.ts +4 -68
  514. package/dist/plugins/toolbar/ToolbarController.svelte.js +63 -89
  515. package/dist/plugins/toolbar/toolbarPlugin.d.ts +8 -18
  516. package/dist/plugins/toolbar/toolbarPlugin.js +28 -43
  517. package/dist/plugins/triggers/TriggerController.svelte.d.ts +4 -68
  518. package/dist/plugins/triggers/TriggerController.svelte.js +48 -129
  519. package/dist/plugins/triggers/place.d.ts +0 -9
  520. package/dist/plugins/triggers/place.js +1 -17
  521. package/dist/plugins/triggers/triggers.d.ts +31 -9
  522. package/dist/plugins/triggers/triggers.js +82 -62
  523. package/dist/plugins/uploads.svelte.d.ts +55 -24
  524. package/dist/plugins/uploads.svelte.js +123 -50
  525. package/dist/plugins.d.ts +187 -66
  526. package/dist/selection/domSelection.d.ts +13 -4
  527. package/dist/selection/domSelection.js +110 -183
  528. package/dist/selection/pointer.svelte.d.ts +8 -10
  529. package/dist/selection/pointer.svelte.js +32 -73
  530. package/dist/selection/replaceSelection.d.ts +21 -22
  531. package/dist/selection/replaceSelection.js +60 -69
  532. package/dist/selection/selection.svelte.d.ts +5 -73
  533. package/dist/selection/selection.svelte.js +224 -542
  534. package/dist/selection/selection.utils.d.ts +34 -11
  535. package/dist/selection/selection.utils.js +128 -247
  536. package/dist/selection/visibility.d.ts +3 -8
  537. package/dist/selection/visibility.js +7 -5
  538. package/dist/session/announcer.svelte.d.ts +2 -1
  539. package/dist/session/announcer.svelte.js +7 -3
  540. package/dist/session/attempt.d.ts +43 -39
  541. package/dist/session/attempt.js +62 -55
  542. package/dist/session/bindings.js +117 -145
  543. package/dist/session/commands.d.ts +47 -22
  544. package/dist/session/commands.js +208 -208
  545. package/dist/session/composition.svelte.d.ts +2 -4
  546. package/dist/session/composition.svelte.js +55 -65
  547. package/dist/session/editing/text.d.ts +6 -0
  548. package/dist/session/editing/text.js +17 -3
  549. package/dist/session/handles.d.ts +10 -1
  550. package/dist/session/handles.js +28 -0
  551. package/dist/session/history.d.ts +0 -4
  552. package/dist/session/history.js +16 -21
  553. package/dist/session/inputRules.d.ts +6 -3
  554. package/dist/session/inputRules.js +78 -83
  555. package/dist/session/keymap.d.ts +1 -6
  556. package/dist/session/keymap.js +17 -20
  557. package/dist/session/moves.d.ts +43 -10
  558. package/dist/session/moves.js +101 -59
  559. package/dist/session/navigation.d.ts +10 -2
  560. package/dist/session/navigation.js +140 -172
  561. package/dist/session/ports.d.ts +2 -7
  562. package/dist/session/props.d.ts +25 -25
  563. package/dist/session/props.js +62 -159
  564. package/dist/session/selection.d.ts +4 -3
  565. package/dist/session/selection.js +5 -0
  566. package/dist/session/suggestions.svelte.d.ts +1 -1
  567. package/dist/session/suggestions.svelte.js +42 -47
  568. package/dist/session/uploads.d.ts +29 -0
  569. package/dist/session/uploads.js +10 -0
  570. package/dist/session/virtual.d.ts +3 -3
  571. package/dist/session/virtual.js +18 -40
  572. package/dist/surface/attributes.d.ts +1 -0
  573. package/dist/surface/attributes.js +3 -26
  574. package/dist/surface/cells.d.ts +5 -0
  575. package/dist/surface/cells.js +5 -0
  576. package/dist/surface/lines.d.ts +2 -2
  577. package/dist/surface/lines.js +1 -1
  578. package/dist/surface/observer.svelte.d.ts +3 -20
  579. package/dist/surface/observer.svelte.js +52 -72
  580. package/dist/surface/overlay.d.ts +41 -3
  581. package/dist/surface/overlay.js +92 -37
  582. package/dist/surface/pin.svelte.d.ts +5 -0
  583. package/dist/surface/pin.svelte.js +5 -0
  584. package/dist/surface/projector.svelte.d.ts +4 -6
  585. package/dist/surface/projector.svelte.js +42 -69
  586. package/dist/text/text.svelte.d.ts +14 -40
  587. package/dist/text/text.svelte.js +35 -51
  588. package/dist/text/wordBoundary.d.ts +19 -0
  589. package/dist/text/wordBoundary.js +29 -44
  590. package/dist/themes/notion.css +272 -106
  591. package/dist/utils/json.d.ts +3 -1
  592. package/dist/utils/json.js +52 -51
  593. package/dist/utils/listen.d.ts +8 -0
  594. package/dist/utils/listen.js +19 -0
  595. package/package.json +4 -5
  596. package/dist/block/block.utils.d.ts +0 -340
  597. package/dist/block/block.utils.js +0 -356
  598. package/dist/collaboration/history/HistoryPanel.svelte +0 -554
  599. package/dist/collaboration/history/HistoryPanel.svelte.d.ts +0 -7
  600. package/dist/collaboration/history/panel.d.ts +0 -61
  601. package/dist/collaboration/history/panel.js +0 -3
  602. package/dist/components/SuggestionRanges.svelte +0 -58
  603. package/dist/components/SuggestionRanges.svelte.d.ts +0 -7
  604. package/dist/crdt/doc/table.d.ts +0 -21
  605. package/dist/crdt/doc/table.js +0 -288
  606. package/dist/crdt/migration/generation.d.ts +0 -58
  607. package/dist/crdt/migration/generation.js +0 -70
  608. package/dist/crdt/migration/legacy-schema.d.ts +0 -61
  609. package/dist/crdt/migration/legacy-schema.js +0 -151
  610. package/dist/crdt/migration/migrate.d.ts +0 -56
  611. package/dist/crdt/migration/migrate.js +0 -227
  612. package/dist/crdt/nodes.d.ts +0 -121
  613. package/dist/crdt/nodes.js +0 -56
  614. package/dist/crdt/text/index/checks.d.ts +0 -15
  615. package/dist/crdt/text/index/checks.js +0 -156
  616. package/dist/crdt/vendor/yjs/dts/utils/EventHandler.d.ts +0 -17
  617. package/dist/crdt/vendor/yjs/dts/utils/RelativePosition.d.ts +0 -80
  618. package/dist/crdt/vendor/yjs/dts/utils/UndoManager.d.ts +0 -205
  619. package/dist/crdt/vendor/yjs/dts/utils/YEvent.d.ts +0 -93
  620. package/dist/crdt/vendor/yjs/dts/utils/meta.d.ts +0 -25
  621. package/dist/crdt/vendor/yjs/dts/utils/renderer-helpers.d.ts +0 -98
  622. package/dist/crdt/vendor/yjs/dts/utils/schemas.d.ts +0 -2
  623. package/dist/crdt/vendor/yjs/src/utils/EventHandler.js +0 -75
  624. package/dist/crdt/vendor/yjs/src/utils/RelativePosition.js +0 -301
  625. package/dist/crdt/vendor/yjs/src/utils/UndoManager.js +0 -554
  626. package/dist/crdt/vendor/yjs/src/utils/YEvent.js +0 -158
  627. package/dist/crdt/vendor/yjs/src/utils/meta.js +0 -74
  628. package/dist/crdt/vendor/yjs/src/utils/renderer-helpers.js +0 -186
  629. package/dist/crdt/vendor/yjs/src/utils/schemas.js +0 -3
  630. package/dist/edytor.utils.d.ts +0 -50
  631. package/dist/edytor.utils.js +0 -67
  632. package/dist/plugins/blockMenu/BlockMenu.svelte +0 -335
  633. package/dist/plugins/blockMenu/BlockMenu.svelte.d.ts +0 -9
  634. package/dist/plugins/find/FindBar.svelte +0 -170
  635. package/dist/plugins/find/FindBar.svelte.d.ts +0 -9
  636. package/dist/plugins/find/FindHighlights.svelte +0 -75
  637. package/dist/plugins/find/FindHighlights.svelte.d.ts +0 -9
  638. package/dist/plugins/icons.d.ts +0 -2
  639. package/dist/plugins/icons.js +0 -63
  640. package/dist/plugins/image/ImageEmpty.svelte +0 -93
  641. package/dist/plugins/image/ImageEmpty.svelte.d.ts +0 -15
  642. package/dist/plugins/image/empty.svelte.d.ts +0 -56
  643. package/dist/plugins/image/empty.svelte.js +0 -83
  644. package/dist/plugins/keepInView.d.ts +0 -4
  645. package/dist/plugins/keepInView.js +0 -6
  646. package/dist/plugins/media/UrlPasteMenu.svelte +0 -92
  647. package/dist/plugins/media/UrlPasteMenu.svelte.d.ts +0 -9
  648. package/dist/plugins/richtext/CalloutIconMenu.svelte +0 -98
  649. package/dist/plugins/richtext/CalloutIconMenu.svelte.d.ts +0 -9
  650. package/dist/plugins/richtext/labels.d.ts +0 -9
  651. package/dist/plugins/richtext/labels.js +0 -7
  652. package/dist/plugins/slashMenu/SlashMenu.svelte +0 -276
  653. package/dist/plugins/slashMenu/SlashMenu.svelte.d.ts +0 -11
  654. package/dist/plugins/table/dragPreview.d.ts +0 -29
  655. package/dist/plugins/table/dragPreview.js +0 -103
  656. package/dist/plugins/toolbar/LinkCard.svelte +0 -122
  657. package/dist/plugins/toolbar/LinkCard.svelte.d.ts +0 -9
  658. package/dist/plugins/toolbar/Toolbar.svelte +0 -349
  659. package/dist/plugins/toolbar/Toolbar.svelte.d.ts +0 -9
  660. package/dist/plugins/triggers/TriggerMenu.svelte +0 -135
  661. package/dist/plugins/triggers/TriggerMenu.svelte.d.ts +0 -7
  662. package/dist/text/deltas.d.ts +0 -22
  663. package/dist/text/deltas.js +0 -46
  664. package/dist/text/text.utils.d.ts +0 -45
  665. package/dist/text/text.utils.js +0 -199
  666. /package/dist/{plugins/columns → dnd}/stacking.d.ts +0 -0
  667. /package/dist/{plugins/columns → dnd}/stacking.js +0 -0
@@ -2,22 +2,34 @@ import { untrack } from 'svelte';
2
2
  import { autoScrollFor } from '../../dnd/autoScroll.js';
3
3
  import { draggable, dropTargetForElements, setCustomNativeDragPreview } from '../../dnd/pragmatic.js';
4
4
  import { EDYTOR_BLOCK_DRAG_MIME } from '../../events/onDrop.js';
5
- import { isLonePress, takeKeys } from '../../events/onFocus.js';
6
- import { iconOf } from '../icons.js';
7
- import { attribute, inPage, keepFocus, optionAttributes } from '../chrome.js';
8
- import { tablePreview } from './dragPreview.js';
5
+ import { takeKeys } from '../../events/onFocus.js';
6
+ import { pin } from '../../surface/overlay.js';
7
+ import { attribute } from '../chrome.js';
8
+ import { ChromeList, holdKeys, menuKey, optionAttachment } from '../list.svelte.js';
9
+ import { BandDrag, bandKey } from '../bands.svelte.js';
10
+ import { all, listen } from '../../utils/listen.js';
11
+ import { dragPreview } from '../blockHandles/dragPreview.js';
9
12
  import { caretCell, deleteColumn, deleteRows, gridOf, insertColumn, insertRow, moveColumn, moveRows, widthOf } from './table.js';
10
13
  /** The drag data key naming the chrome a row's or a column's drag is from. */
11
14
  const MOVE = Symbol('edytor table move');
12
15
  /** How far past the table's box a drag still aims at it (the grips stand outside it). */
13
16
  const GUTTER = 32;
14
- /** The resolved widths of `grid`'s columns, as laid out (none where nothing is). */
15
- const trackWidths = (grid) => (grid.ownerDocument.defaultView?.getComputedStyle(grid).gridTemplateColumns ?? '')
16
- .split(/\s+/)
17
- .map((w) => Number.parseFloat(w))
18
- .filter((w) => Number.isFinite(w));
17
+ const styleOf = (node) => node.ownerDocument.defaultView?.getComputedStyle(node);
19
18
  /** A computed length in pixels, `0` when none. */
20
19
  const px = (value) => Number.parseFloat(value ?? '') || 0;
20
+ /** The resolved widths of `grid`'s columns, as laid out (none where nothing is). */
21
+ const trackWidths = (grid) => (styleOf(grid)?.gridTemplateColumns ?? '')
22
+ .split(/\s+/)
23
+ .map(Number.parseFloat)
24
+ .filter(Number.isFinite);
25
+ /** The grid element of a table block. */
26
+ const gridNode = (table) => table?.node?.querySelector('[data-edytor-table-grid]');
27
+ /** A table's stored column entries (`data.columns`), each found by its column id. */
28
+ const entriesOf = (table) => {
29
+ const stored = table.edytor.facade.blockDataOf(table.id)?.columns;
30
+ return Array.isArray(stored) ? stored : [];
31
+ };
32
+ const entryIndex = (entries, id) => entries.findIndex((c) => c?.id === id);
21
33
  /**
22
34
  * The table's chrome (`table.*`), in the overlay: while the pointer is over
23
35
  * a table of an editable view, a `+` under it (a row at its end) and one
@@ -30,26 +42,22 @@ const px = (value) => Number.parseFloat(value ?? '') || 0;
30
42
  * drops the preview. Every action is a table command (`table.ts`): refused
31
43
  * when the view is readonly.
32
44
  *
33
- * What a custom `menu` snippet receives: the open menu (`menu`), its rows
45
+ * What a `menu` snippet receives: the open menu (`menu`), its rows
34
46
  * (`items`, each a `MenuItemPayload`), the keyboard's row (`index`), the
35
- * attachments that keep the built-in keys and ARIA (`popup` and `keys` on
36
- * the menu's element, `option(index)` spread on each row), `close()` and
37
- * the plugin's `labels`. A grip's own attachment is its payload's `grip`.
47
+ * attachments that give it the keys and the ARIA (`popup` and `keys` on
48
+ * the menu's element, `option(index)` on each row) and `close()`.
49
+ * A grip's own attachment is its payload's `grip`.
38
50
  */
39
- export class TableChrome {
40
- edytor;
41
- labels;
51
+ export class TableChrome extends ChromeList {
42
52
  columnWidth;
43
53
  minColumnWidth;
44
54
  /**
45
- * The table, row and column under the pointer.
55
+ * The table, row and column (their ids) under the pointer.
46
56
  * @internal
47
57
  */
48
58
  hovered = $state(null);
49
59
  /** What the open grip menu acts on (`null`: none is open). */
50
60
  menu = $state(null);
51
- /** The keyboard's row of the open menu, in `rows` (never a disabled one). */
52
- index = $state(0);
53
61
  /**
54
62
  * The measured table the chrome is for.
55
63
  * @internal
@@ -61,10 +69,10 @@ export class TableChrome {
61
69
  */
62
70
  dragging = $state(false);
63
71
  /**
64
- * The column resize in progress.
72
+ * The column resize (its drag in progress, `band.drag`).
65
73
  * @internal
66
74
  */
67
- drag = $state(null);
75
+ band;
68
76
  /**
69
77
  * The row's or column's drag in progress (`table.drag`).
70
78
  * @internal
@@ -77,11 +85,7 @@ export class TableChrome {
77
85
  * @internal
78
86
  */
79
87
  cell = null;
80
- constructor(
81
- /** @internal */
82
- edytor,
83
- /** The words the chrome shows and says (the plugin's `labels`). */
84
- labels,
88
+ constructor(edytor,
85
89
  /**
86
90
  * A column's width when it sets none, and the narrowest a resize leaves.
87
91
  * @internal
@@ -89,21 +93,30 @@ export class TableChrome {
89
93
  columnWidth,
90
94
  /** @internal */
91
95
  minColumnWidth) {
92
- this.edytor = edytor;
93
- this.labels = labels;
96
+ super(edytor, 'table-menu', 'menu', (node) => {
97
+ const kind = this.menu?.kind;
98
+ if (!kind)
99
+ return null;
100
+ node.setAttribute('data-edytor-table-menu', kind);
101
+ return {};
102
+ });
94
103
  this.columnWidth = columnWidth;
95
104
  this.minColumnWidth = minColumnWidth;
105
+ this.band = new BandDrag(edytor);
106
+ }
107
+ get count() {
108
+ return this.#rows.length;
96
109
  }
97
110
  /** The view is readonly (reactive): the chrome shows nothing. */
98
111
  get readonly() {
99
112
  return this.edytor.readonly;
100
113
  }
101
114
  /**
102
- * A text selection is in progress: the chrome takes no pointer.
115
+ * The column resize in progress.
103
116
  * @internal
104
117
  */
105
- get selecting() {
106
- return this.drag === null && this.edytor.selection.dragging;
118
+ get drag() {
119
+ return this.band.drag;
107
120
  }
108
121
  /**
109
122
  * The table the chrome is for: the one a band drags or a grip moves, a
@@ -114,27 +127,24 @@ export class TableChrome {
114
127
  return (this.drag?.table ?? this.moving?.table ?? this.menu?.table ?? this.hovered?.table ?? null);
115
128
  }
116
129
  /**
117
- * The row the row grip stands for: the open menu's, else the hovered one.
118
- * @internal
119
- */
120
- get gripRow() {
121
- return this.menu?.kind === 'row' ? this.menu.row : (this.hovered?.row ?? null);
122
- }
123
- /**
124
- * The column (by position) the column grip stands for: the open menu's, else the hovered one.
125
- * @internal
130
+ * What the `kind` grip stands for now (the open menu's row or column,
131
+ * else the hovered one): its table, id and position; `null` when none.
126
132
  */
127
- get gripColumn() {
128
- return this.menu?.kind === 'column' ? this.menu.column : (this.hovered?.column ?? null);
133
+ #source(kind) {
134
+ const table = this.block(this.table);
135
+ const grid = gridOf(table);
136
+ const id = this.menu?.kind === kind ? this.menu.id : this.hovered?.[kind];
137
+ const ids = kind === 'row' ? grid?.rows.map((row) => row.id) : grid?.columns;
138
+ const index = id ? (ids?.indexOf(id) ?? -1) : -1;
139
+ return table && grid && index >= 0 ? { table, grid, id: id, index } : null;
129
140
  }
130
141
  /**
131
142
  * The selection changed: a caret in a cell is the one the block menu acts on.
132
143
  * @internal
133
144
  */
134
145
  track = () => {
135
- if (this.edytor.selection.value.kind !== 'text')
136
- return;
137
- this.cell = caretCell(this.edytor)?.id ?? null;
146
+ if (this.edytor.selection.value.kind === 'text')
147
+ this.cell = caretCell(this.edytor)?.id ?? null;
138
148
  };
139
149
  /**
140
150
  * Whether the chrome shows (on its table all through a band's or a grip's drag).
@@ -159,8 +169,8 @@ export class TableChrome {
159
169
  * @internal
160
170
  */
161
171
  inView = (x) => {
162
- const layout = this.layout;
163
- return !!layout && x >= layout.view.left - 1 && x <= layout.view.right + 1;
172
+ const view = this.layout?.view;
173
+ return !!view && x >= view.left - 1 && x <= view.right + 1;
164
174
  };
165
175
  /**
166
176
  * The grid's visible span, horizontally, layer-relative.
@@ -175,36 +185,39 @@ export class TableChrome {
175
185
  return { left, width: Math.max(0, right - left) };
176
186
  }
177
187
  /**
178
- * Where the row grip stands: on the grid's left edge, at the middle of the
179
- * row it stands for (`gripRow`); layer-relative, the point it centers on.
180
- * @internal
188
+ * The open menu's or the hovered row's and column's lines in the
189
+ * measured table, with their positions.
181
190
  */
182
- get rowGrip() {
191
+ #lines(kind) {
183
192
  const layout = this.layout;
184
- const id = this.gripRow;
185
- const index = layout && id ? layout.rows.findIndex((row) => row.id === id) : -1;
186
- const row = layout?.rows[index];
187
- return layout && row
188
- ? { kind: 'row', id: row.id, index, x: layout.left, y: row.top + row.height / 2 }
189
- : null;
193
+ const id = this.menu?.kind === kind ? this.menu.id : this.hovered?.[kind];
194
+ const lines = (kind === 'row' ? layout?.rows : layout?.columns) ?? [];
195
+ const index = lines.findIndex((line) => line.id === id);
196
+ return index < 0 ? null : { layout: layout, index, id: id };
190
197
  }
191
198
  /**
192
- * Where the column grip stands: on the grid's top edge, at the middle of
193
- * the column it stands for (`gripColumn`), while that middle shows (the
194
- * grip a drag started from stays, its source, even scrolled out of view).
199
+ * Where the grips stand, layer-relative, the point each centers on: the
200
+ * row grip on the left edge of the part of the grid its box shows
201
+ * (`table.overflow`: the box's edge once the grid is scrolled), at the middle of the row it stands
202
+ * for; the column grip on its top edge, at the middle of the column it
203
+ * stands for, while that middle shows (the grip a drag started from
204
+ * stays, its source, even scrolled out of view).
195
205
  * @internal
196
206
  */
197
- get columnGrip() {
198
- const layout = this.layout;
199
- const index = this.gripColumn;
200
- const column = index === null ? undefined : layout?.columns[index];
201
- if (!layout || index === null || !column)
202
- return null;
203
- const x = column.left + column.width / 2;
204
- const source = this.moving?.kind === 'column';
205
- return source || this.inView(x)
206
- ? { kind: 'column', id: column.id, index, x, y: layout.top }
207
- : null;
207
+ get grips() {
208
+ const row = this.#lines('row');
209
+ const column = this.#lines('column');
210
+ const r = row && row.layout.rows[row.index];
211
+ const c = column && column.layout.columns[column.index];
212
+ const x = c ? c.left + c.width / 2 : 0;
213
+ return [
214
+ ...(row && r
215
+ ? [{ ...row, kind: 'row', x: this.span.left, y: r.top + r.height / 2 }]
216
+ : []),
217
+ ...(column && (this.moving?.kind === 'column' || this.inView(x))
218
+ ? [{ ...column, kind: 'column', x, y: column.layout.top }]
219
+ : [])
220
+ ];
208
221
  }
209
222
  /**
210
223
  * Where the `+` under the table stands (as wide as the grid shows) and
@@ -214,31 +227,55 @@ export class TableChrome {
214
227
  get bars() {
215
228
  const layout = this.layout;
216
229
  if (!layout)
217
- return { row: null, column: null };
230
+ return [];
218
231
  const { left, width } = this.span;
219
232
  const right = layout.left + layout.width;
220
- return {
221
- row: { left, top: layout.top + layout.height + 2, width },
222
- column: this.inView(right)
223
- ? { left: right + 2, top: layout.top, height: layout.height }
224
- : null
225
- };
233
+ return [
234
+ { kind: 'row', left, top: layout.top + layout.height + 2, width },
235
+ ...(this.inView(right)
236
+ ? [{ kind: 'column', left: right + 2, top: layout.top, height: layout.height }]
237
+ : [])
238
+ ];
226
239
  }
227
240
  /**
228
241
  * Where the open menu stands: under its grip.
229
242
  * @internal
230
243
  */
231
244
  get menuPlace() {
232
- const menu = this.menu;
233
- const layout = this.layout;
234
- if (!menu || !layout)
245
+ const kind = this.menu?.kind;
246
+ const at = kind && this.#lines(kind);
247
+ if (!at)
235
248
  return null;
236
- if (menu.kind === 'row') {
237
- const row = layout.rows.find((r) => r.id === menu.row);
238
- return row ? { left: layout.left - 9, top: row.top + Math.min(row.height, 28) } : null;
249
+ const { layout, index } = at;
250
+ if (kind === 'row') {
251
+ const row = layout.rows[index];
252
+ return { left: this.span.left - 9, top: row.top + Math.min(row.height, 28) };
239
253
  }
240
- const column = layout.columns[menu.column];
241
- return column ? { left: column.left + column.width / 2 - 12, top: layout.top + 10 } : null;
254
+ const column = layout.columns[index];
255
+ return { left: column.left + column.width / 2 - 12, top: layout.top + 10 };
256
+ }
257
+ /**
258
+ * The drop line of a grip's drag, layer-relative: between two rows
259
+ * (columns), where the drop would land.
260
+ * @internal
261
+ */
262
+ get line() {
263
+ const move = this.moving;
264
+ const gap = move?.gap ?? null;
265
+ const layout = this.layout;
266
+ if (!move || gap === null || !layout)
267
+ return null;
268
+ const row = move.kind === 'row';
269
+ const lines = row ? layout.rows : layout.columns.map((c) => ({ top: c.left, height: c.width }));
270
+ const last = lines.at(-1);
271
+ const at = lines[gap]?.top ?? (last && last.top + last.height);
272
+ if (at === undefined)
273
+ return null;
274
+ if (row)
275
+ return { kind: move.kind, gap, left: this.span.left, top: at - 2, width: this.span.width };
276
+ return this.inView(at)
277
+ ? { kind: move.kind, gap, left: at - 2, top: layout.top, height: layout.height }
278
+ : null;
242
279
  }
243
280
  /**
244
281
  * The width column `index` of `table` shows (its `data.columns` entry, the
@@ -247,53 +284,47 @@ export class TableChrome {
247
284
  */
248
285
  width = (table, index, column) => {
249
286
  const drag = this.drag;
250
- if (drag && drag.table === table && drag.column === index)
251
- return this.dragWidth(drag);
252
- if (drag && drag.table === table && drag.column + 1 === index) {
253
- const next = this.nextWidth(drag);
254
- if (next !== undefined)
255
- return next;
256
- }
257
- return widthOf(column, this.columnWidth);
287
+ const at = drag?.table === table ? index - drag.column : -1;
288
+ const preview = at === 0 ? this.#dragWidth(drag) : at === 1 ? this.#nextWidth(drag) : undefined;
289
+ return preview ?? widthOf(column, this.columnWidth);
258
290
  };
259
291
  /** The resize's width: the pointer's, between the minimum and the room's (`table.width.fit`). */
260
- dragWidth = (drag) => Math.max(this.minColumnWidth, Math.min(drag.max, Math.round(drag.width + drag.at - drag.from)));
292
+ #dragWidth = (drag) => Math.max(this.minColumnWidth, Math.min(drag.max, Math.round(drag.width + drag.at - drag.from)));
261
293
  /**
262
- * The right neighbour's width while column `drag.column` is `dragWidth`
294
+ * The right neighbour's width while column `drag.column` is `#dragWidth`
263
295
  * (`table.width.neighbour`): the column grows into the free room first,
264
296
  * then what it gains past it comes off its neighbour, down to the
265
297
  * minimum; a narrowing gives nothing back.
266
298
  */
267
- nextWidth(drag) {
299
+ #nextWidth(drag) {
268
300
  if (drag.next === undefined)
269
301
  return undefined;
270
- const take = Math.max(0, this.dragWidth(drag) - drag.width - drag.slack);
302
+ const take = Math.max(0, this.#dragWidth(drag) - drag.width - drag.slack);
271
303
  return Math.max(Math.min(drag.next, this.minColumnWidth), drag.next - take);
272
304
  }
273
305
  /**
274
306
  * The widths `table`'s grid shows, by position (its columns' stored
275
307
  * widths, else the default one): what its template reads, the model's.
276
308
  */
277
- widthsOf(table) {
278
- const columns = gridOf(table)?.columns ?? [];
279
- const stored = table.edytor.facade.blockDataOf(table.id)?.columns;
280
- const entries = Array.isArray(stored) ? stored : [];
281
- return columns.map((id) => widthOf(entries.find((c) => c?.id === id), this.columnWidth));
309
+ #widthsOf(table) {
310
+ const entries = entriesOf(table);
311
+ return (gridOf(table)?.columns ?? []).map((id) => widthOf(entries[entryIndex(entries, id)], this.columnWidth));
282
312
  }
283
313
  /**
284
- * A resize of column `column` of `table`, pressed at `from` (`table.width.fit`,
285
- * `table.width.neighbour`): the column may grow by the room the table
286
- * leaves free and by what its right neighbour can give (down to the
287
- * minimum), so the table never gets wider; it may always narrow.
314
+ * A resize of column `column` of the measured table, pressed at `from`
315
+ * (`table.width.fit`, `table.width.neighbour`): the column may grow by the
316
+ * room the table leaves free and by what its right neighbour can give
317
+ * (down to the minimum), so the table never gets wider; it may always narrow.
288
318
  */
289
- resize(table, column, room, from, at) {
290
- const widths = this.widthsOf(table);
319
+ #resize(column, from, at) {
320
+ const layout = this.layout;
321
+ const table = this.block(layout?.table);
322
+ const widths = table ? this.#widthsOf(table) : [];
291
323
  const width = widths[column];
292
- if (width === undefined)
324
+ if (!layout || !table || width === undefined)
293
325
  return null;
294
326
  const next = widths[column + 1];
295
- const total = widths.reduce((sum, w) => sum + w, 0);
296
- const slack = Math.max(0, room - total);
327
+ const slack = Math.max(0, layout.room - widths.reduce((sum, w) => sum + w, 0));
297
328
  const gives = next === undefined ? 0 : next - Math.min(next, this.minColumnWidth);
298
329
  const max = Math.floor(width + slack + gives);
299
330
  return { table: table.id, column, from, at, width, max, slack, next };
@@ -308,20 +339,17 @@ export class TableChrome {
308
339
  return;
309
340
  const element = target instanceof Element ? target : null;
310
341
  const cell = element?.closest('[data-edytor-table-cell], [data-edytor-table-pad]');
311
- const tableNode = element?.closest('[data-edytor-table]');
312
- const table = tableNode?.dataset.edytorId ?? null;
313
- let next = null;
314
- if (table && this.block(table)) {
315
- const rowNode = cell?.closest('[data-edytor-table-row]');
316
- const row = rowNode?.dataset.edytorId ?? null;
317
- const column = cell ? Number(cell.dataset.edytorColumn) : NaN;
318
- next = { table, row, column: Number.isInteger(column) ? column : null };
319
- }
320
- const was = this.hovered;
321
- if (was?.table === next?.table && was?.row === next?.row && was?.column === next?.column)
322
- return;
342
+ const table = element?.closest('[data-edytor-table]')?.dataset.edytorId;
343
+ const grid = gridOf(this.block(table));
344
+ const next = table && grid
345
+ ? {
346
+ table,
347
+ row: cell?.closest('[data-edytor-table-row]')?.dataset.edytorId ?? null,
348
+ column: grid.columns[Number(cell?.dataset.edytorColumn)] ?? null
349
+ }
350
+ : null;
323
351
  // Over the chrome (a grip, the `+`), the row and column it is for stay.
324
- if (next === null && this.menu)
352
+ if (JSON.stringify(next) === JSON.stringify(this.hovered) || (!next && this.menu))
325
353
  return;
326
354
  this.hovered = next;
327
355
  this.edytor.overlay.invalidate();
@@ -344,27 +372,27 @@ export class TableChrome {
344
372
  * @internal
345
373
  */
346
374
  measure = (host, origin) => {
347
- const layout = this.shown ? this.read(origin) : null;
375
+ const layout = this.shown ? this.#read(origin) : null;
348
376
  return () => {
349
- Object.assign(host.style, { position: 'absolute', left: '0px', top: '0px' });
350
- if (!sameLayout(layout, this.layout))
377
+ pin(host);
378
+ if (JSON.stringify(layout) !== JSON.stringify(this.layout))
351
379
  this.layout = layout;
352
380
  };
353
381
  };
354
- read(origin) {
382
+ #read(origin) {
355
383
  const table = this.block(this.table);
356
- const grid = table?.node?.querySelector('[data-edytor-table-grid]');
384
+ const grid = gridNode(table);
357
385
  const columns = gridOf(table)?.columns;
358
386
  if (!table || !grid?.isConnected || !columns)
359
387
  return null;
360
388
  const box = grid.getBoundingClientRect();
361
389
  const widths = trackWidths(grid);
362
- let x = box.left - origin.left;
390
+ const left = box.left - origin.left;
391
+ let x = left;
363
392
  const cols = columns.map((id, i) => {
364
393
  const width = widths[i] ?? this.columnWidth;
365
- const col = { id, left: x, width };
366
394
  x += width;
367
- return col;
395
+ return { id, left: x - width, width };
368
396
  });
369
397
  const rows = table.children.flatMap((row) => {
370
398
  const rect = row.node?.getBoundingClientRect();
@@ -373,44 +401,33 @@ export class TableChrome {
373
401
  // The box the grid scrolls in: its client box is what shows, and the room.
374
402
  const scroller = grid.closest('[data-edytor-table-scroll]') ?? grid.parentElement;
375
403
  const inner = scroller?.clientWidth ?? 0;
376
- const clip = inner > 0 ? scroller?.getBoundingClientRect() : undefined;
377
- const style = grid.ownerDocument.defaultView?.getComputedStyle(grid);
378
- const border = px(style?.borderLeftWidth) + px(style?.borderRightWidth);
379
- const left = clip ? clip.left + (scroller?.clientLeft ?? 0) - origin.left : 0;
404
+ const clip = inner > 0 ? scroller.getBoundingClientRect() : undefined;
405
+ const style = styleOf(grid);
406
+ const at = clip ? clip.left + scroller.clientLeft - origin.left : 0;
380
407
  return {
381
408
  table: table.id,
382
- left: box.left - origin.left,
409
+ left,
383
410
  top: box.top - origin.top,
384
- width: Math.min(box.width, x - (box.left - origin.left)) || box.width,
411
+ width: Math.min(box.width, x - left) || box.width,
385
412
  height: box.height,
386
413
  rows,
387
414
  columns: cols,
388
- view: clip ? { left, right: left + inner } : { left: -Infinity, right: Infinity },
389
- room: clip ? inner - border : Infinity
415
+ view: clip ? { left: at, right: at + inner } : { left: -Infinity, right: Infinity },
416
+ room: clip ? inner - px(style?.borderLeftWidth) - px(style?.borderRightWidth) : Infinity
390
417
  };
391
418
  }
392
419
  /**
393
- * Open the menu of a row's or a column's grip (a second press on it
394
- * closes it), its first row that can run the keyboard's.
420
+ * Open the `kind` grip's menu on the row or column it stands for, its
421
+ * first row that can run the keyboard's, or close it when it is open
422
+ * there (a grip's click).
395
423
  */
396
- open = (menu) => {
397
- const same = this.menu?.kind === menu.kind &&
398
- this.menu.table === menu.table &&
399
- (menu.kind === 'row'
400
- ? this.menu.row === menu.row
401
- : this.menu.column === menu.column);
402
- this.menu = same ? null : menu;
403
- if (!same)
404
- this.index = Math.max(0, this.#enabled()[0] ?? 0);
405
- this.edytor.overlay.invalidate();
406
- };
407
- /** Open the `kind` grip's menu on the row or column it stands for, or close it (a grip's click). */
408
424
  toggle = (kind) => {
409
- const source = this.source(kind);
410
- if (!source)
411
- return;
412
- const { table, id, index } = source;
413
- this.open(kind === 'row' ? { kind, table: table.id, row: id } : { kind, table: table.id, column: index });
425
+ const source = this.#source(kind);
426
+ const open = this.menu?.kind === kind;
427
+ this.menu = open || !source ? null : { kind, table: source.table.id, id: source.id };
428
+ if (this.menu)
429
+ this.index = Math.max(0, this.#rows.findIndex((row) => !row.disabled));
430
+ this.edytor.overlay.invalidate();
414
431
  };
415
432
  /** Whether a menu is open (reactive). */
416
433
  get isOpen() {
@@ -422,76 +439,75 @@ export class TableChrome {
422
439
  this.edytor.overlay.invalidate();
423
440
  takeKeys(this.edytor);
424
441
  };
425
- /** The menu element's id (page-unique), for `aria-controls`. */
426
- get menuId() {
427
- return this.edytor.popups.idOf('table-menu');
442
+ /**
443
+ * The open menu's rows: insert before and after, move back and forth,
444
+ * delete (whether each can run now; the last deletes).
445
+ */
446
+ get #rows() {
447
+ const kind = this.menu?.kind;
448
+ const at = kind && this.#source(kind);
449
+ if (!at)
450
+ return [];
451
+ const { table, grid, id, index } = at;
452
+ const row = kind === 'row';
453
+ const block = this.edytor.idToBlock.get(id);
454
+ const last = (row ? grid.rows : grid.columns).length - 1;
455
+ const insert = (to) => (row ? insertRow(table, to, true) : insertColumn(table, to));
456
+ const move = (to) => (row ? moveRows(table, [block], to) : moveColumn(table, id, to));
457
+ const [before, after, back, forth] = row
458
+ ? ['above', 'below', 'up', 'down']
459
+ : ['left', 'right', 'left', 'right'];
460
+ return [
461
+ { id: `insert-${before}`, disabled: false, run: () => insert(index) },
462
+ { id: `insert-${after}`, disabled: false, run: () => insert(index + 1) },
463
+ { id: `move-${back}`, disabled: index === 0, run: () => move(index - 1) },
464
+ { id: `move-${forth}`, disabled: index === last, run: () => move(index + 1) },
465
+ {
466
+ id: `delete-${kind}`,
467
+ disabled: false,
468
+ run: () => (row ? deleteRows(table, [block]) : deleteColumn(table, id))
469
+ }
470
+ ];
428
471
  }
429
- /** A row's element id (page-unique), for `aria-activedescendant`. */
430
- rowId = (row) => this.edytor.popups.idOf(`table-menu-${row.id}`);
431
- /** The positions in `rows` of the rows that can run now. */
432
- #enabled = () => this.rows.flatMap((row, index) => (row.isEnabled() ? [index] : []));
433
472
  /**
434
- * The open menu's rows for a custom `menu`: each the row shape every menu
473
+ * The open menu's rows for your `menu`: each the row shape every menu
435
474
  * shares (`run` runs it and closes the menu, `select` makes it the
436
475
  * keyboard's, `option` its attributes), whether it can run now
437
- * (`disabled`), whether it deletes (`danger`), and its icon.
476
+ * (`disabled`) and whether it deletes (`danger`).
438
477
  */
439
478
  get items() {
440
- return this.rows.map((row, index) => {
441
- const disabled = !row.isEnabled();
442
- return {
443
- item: row,
444
- id: this.rowId(row),
445
- label: row.label,
446
- selected: index === this.index,
447
- disabled,
448
- danger: Boolean(row.danger),
449
- icon: iconOf(row.icon),
450
- run: () => this.runRow(row),
451
- select: () => {
452
- if (!disabled)
453
- this.index = index;
454
- },
455
- option: this.option(index)
456
- };
457
- });
479
+ return this.#rows.map(({ id, disabled, run }, index) => ({
480
+ item: { id },
481
+ id: this.rowId(index),
482
+ selected: index === this.index,
483
+ disabled,
484
+ danger: id.startsWith('delete'),
485
+ run: () => {
486
+ if (disabled)
487
+ return;
488
+ this.menu = this.hovered = null;
489
+ takeKeys(this.edytor);
490
+ run();
491
+ this.edytor.overlay.invalidate();
492
+ },
493
+ select: () => {
494
+ if (!disabled)
495
+ this.index = index;
496
+ },
497
+ option: this.option(index)
498
+ }));
458
499
  }
459
500
  /**
460
- * The attributes of the open menu's row at `index`: spread them on its
461
- * element (`{...chrome.option(index)}`). Its id, `menuitem` role,
462
- * `aria-disabled` when it cannot run now, `data-selected` for the
463
- * keyboard's row, which scrolls into view.
501
+ * The attachment of the open menu's row at `index`
502
+ * (`{@attach chrome.option(index)}`). Its id, `menuitem` role,
503
+ * `aria-disabled` when it cannot run now; the keyboard's row scrolls into
504
+ * view. The menu's element takes
505
+ * `data-edytor-table-menu` (the kind it is open on) from `popup`.
464
506
  */
465
- option = (index) => {
466
- const row = this.rows[index];
467
- const id = row ? this.rowId(row) : this.edytor.popups.idOf(`table-menu-${index}`);
468
- return optionAttributes(id, 'menuitem', index === this.index, row && !row.isEnabled() ? { 'aria-disabled': true } : {});
469
- };
470
- /**
471
- * The menu's element (`{@attach chrome.popup}`): its id, `menu` role and
472
- * name (Row options, Column options) unless it has its own, presses that
473
- * keep the focus, and its publication to the view's root
474
- * (`edytor.popups`: `aria-controls`, `aria-haspopup`) while it is in
475
- * the page; `data-edytor-table-menu` names the kind it is open on.
476
- */
477
- popup = (node) => untrack(() => {
478
- node.id = this.menuId;
479
- if (!node.hasAttribute('role'))
480
- node.setAttribute('role', 'menu');
481
- const named = node.hasAttribute('aria-label') || node.hasAttribute('aria-labelledby');
482
- node.addEventListener('mousedown', keepFocus);
483
- $effect(() => {
484
- const kind = this.menu?.kind;
485
- if (!kind)
486
- return;
487
- node.setAttribute('data-edytor-table-menu', kind);
488
- if (!named)
489
- attribute(node, 'aria-label', kind === 'row' ? this.labels.rowMenu : this.labels.columnMenu);
490
- this.edytor.popups.set('table-menu', { id: this.menuId, haspopup: 'menu' });
491
- return () => this.edytor.popups.set('table-menu', null);
492
- });
493
- return () => node.removeEventListener('mousedown', keepFocus);
494
- });
507
+ option(index) {
508
+ const extra = this.#rows[index]?.disabled ? { 'aria-disabled': true } : {};
509
+ return optionAttachment(this.rowId(index), 'menuitem', index === this.index, extra);
510
+ }
495
511
  /**
496
512
  * The element that holds the menu's keyboard (`{@attach chrome.keys}`,
497
513
  * the menu's own): it takes the focus when it mounts and names the
@@ -503,51 +519,29 @@ export class TableChrome {
503
519
  keys = (node) => untrack(() => {
504
520
  if (!node.hasAttribute('tabindex'))
505
521
  node.tabIndex = -1;
506
- if (!node.contains(node.ownerDocument.activeElement))
507
- node.focus({ preventScroll: true });
508
- node.addEventListener('keydown', this.#keydown);
509
- $effect(() => {
510
- const row = this.rows[this.index];
511
- attribute(node, 'aria-activedescendant', inPage(node, row && this.rowId(row)));
512
- });
513
- return () => node.removeEventListener('keydown', this.#keydown);
522
+ return holdKeys(node, this.#keydown, () => this.rowId(this.index));
514
523
  });
515
524
  /** The menu's keys (`keys`). */
516
525
  #keydown = (event) => {
517
526
  if (event.defaultPrevented || event.isComposing)
518
527
  return;
519
- const enabled = this.#enabled();
520
- const at = enabled.indexOf(this.index);
521
- const { key } = event;
522
- if (key === 'ArrowDown' || key === 'ArrowUp') {
523
- const step = key === 'ArrowDown' ? 1 : -1;
524
- const count = enabled.length;
525
- if (count)
526
- this.index = enabled[(at + step + count) % count];
527
- }
528
- else if (key === 'Home' || key === 'End') {
529
- const index = key === 'Home' ? enabled[0] : enabled.at(-1);
530
- if (index !== undefined)
531
- this.index = index;
532
- }
533
- else if (key === 'Enter' || key === ' ') {
534
- const row = this.rows[this.index];
535
- if (row)
536
- this.runRow(row);
537
- }
538
- else if (key === 'Escape' || key === 'Tab')
539
- this.close();
540
- else
541
- return;
542
- event.preventDefault();
543
- event.stopPropagation();
528
+ const items = this.items;
529
+ const menu = {
530
+ at: this.index,
531
+ count: items.length,
532
+ to: (index) => (this.index = index),
533
+ pick: () => items[this.index]?.run(),
534
+ close: this.close
535
+ };
536
+ if (menuKey(event, menu, { usable: (index) => !items[index].disabled }))
537
+ event.stopPropagation();
544
538
  };
545
539
  /**
546
540
  * The `kind` grip's attachment (`{@attach}` it on a grip's element; a
547
541
  * `grip` snippet's payload carries it): in an editable view, dragging it
548
542
  * moves its row or column within its table (`table.drag`); a click with
549
543
  * no drag opens or closes its menu; ArrowDown opens the menu, Escape
550
- * closes it and gives the keys back to the editor. It names the element (its own name wins) and carries
544
+ * closes it and gives the keys back to the editor. It carries
551
545
  * `aria-haspopup`, `aria-expanded`, `aria-controls` while its menu is
552
546
  * open, and `data-dragging` during its drag. A press on it is never
553
547
  * prevented: that would stop the native drag.
@@ -555,11 +549,14 @@ export class TableChrome {
555
549
  gripOf = (kind) => (this.#grips[kind] ??= (node) => untrack(() => this.#grip(node, kind)));
556
550
  #grips = {};
557
551
  #grip = (node, kind) => {
558
- if (!node.hasAttribute('aria-label') && !node.hasAttribute('aria-labelledby'))
559
- node.setAttribute('aria-label', kind === 'row' ? this.labels.rowMenu : this.labels.columnMenu);
560
552
  node.setAttribute('aria-haspopup', 'menu');
561
- const click = () => this.toggle(kind);
562
- const keydown = (event) => {
553
+ $effect(() => {
554
+ const open = this.menu?.kind === kind;
555
+ attribute(node, 'aria-expanded', String(open));
556
+ attribute(node, 'aria-controls', open ? this.listId : undefined);
557
+ attribute(node, 'data-dragging', this.moving?.kind === kind ? 'true' : undefined);
558
+ });
559
+ const off = all(listen(node, 'click', () => this.toggle(kind)), listen(node, 'keydown', (event) => {
563
560
  // Escape gives the keys back to the editor (closing the menu if open).
564
561
  if (event.key === 'Escape')
565
562
  this.close();
@@ -569,244 +566,58 @@ export class TableChrome {
569
566
  return;
570
567
  event.preventDefault();
571
568
  event.stopPropagation();
572
- };
573
- node.addEventListener('click', click);
574
- node.addEventListener('keydown', keydown);
575
- $effect(() => {
576
- const open = this.menu?.kind === kind;
577
- attribute(node, 'aria-expanded', String(open));
578
- attribute(node, 'aria-controls', open ? this.menuId : undefined);
579
- attribute(node, 'data-dragging', this.moving?.kind === kind ? 'true' : undefined);
580
- });
581
- const cleanup = draggable({
569
+ }), draggable({
582
570
  element: node,
583
- canDrag: () => !this.edytor.readonly && this.edytor.dispatcher.permits() && this.source(kind) !== null,
571
+ canDrag: () => !this.edytor.readonly && this.edytor.dispatcher.permits() && this.#source(kind) !== null,
584
572
  getInitialData: () => ({ [MOVE]: this }),
585
573
  // The editor's own drag: no view takes it as a foreign drop.
586
574
  getInitialDataForExternal: () => {
587
- const source = this.source(kind);
588
- return { [EDYTOR_BLOCK_DRAG_MIME]: (kind === 'row' ? source?.id : source?.table.id) ?? '' };
575
+ const source = this.#source(kind);
576
+ return {
577
+ [EDYTOR_BLOCK_DRAG_MIME]: (kind === 'row' ? source?.id : source?.table.id) ?? ''
578
+ };
589
579
  },
590
- onGenerateDragPreview: ({ nativeSetDragImage, location }) => this.begin(kind, node, location.current.input, nativeSetDragImage),
580
+ onGenerateDragPreview: ({ nativeSetDragImage, location }) => this.#begin(kind, node, location.current.input, nativeSetDragImage),
591
581
  // The drag library tells the source before the drop target: the drop runs first.
592
- onDrop: () => queueMicrotask(() => this.finish())
593
- });
594
- return () => {
595
- node.removeEventListener('click', click);
596
- node.removeEventListener('keydown', keydown);
597
- cleanup();
598
- };
599
- };
600
- /** The rows of the open menu. */
601
- get rows() {
602
- const menu = this.menu;
603
- const table = this.block(menu?.table);
604
- const grid = gridOf(table);
605
- if (!menu || !table || !grid)
606
- return [];
607
- const { labels } = this;
608
- if (menu.kind === 'row') {
609
- const index = grid.rows.findIndex((r) => r.id === menu.row);
610
- const row = this.edytor.idToBlock.get(menu.row);
611
- if (index < 0 || !row)
612
- return [];
613
- const last = grid.rows.length - 1;
614
- return [
615
- {
616
- id: 'insert-above',
617
- label: labels.insertAbove,
618
- icon: 'action.up',
619
- isEnabled: () => true,
620
- run: () => insertRow(table, index, true)
621
- },
622
- {
623
- id: 'insert-below',
624
- label: labels.insertBelow,
625
- icon: 'action.down',
626
- isEnabled: () => true,
627
- run: () => insertRow(table, index + 1, true)
628
- },
629
- {
630
- id: 'move-up',
631
- label: labels.moveUp,
632
- icon: 'action.up',
633
- isEnabled: () => index > 0,
634
- run: () => moveRows(table, [row], index - 1)
635
- },
636
- {
637
- id: 'move-down',
638
- label: labels.moveDown,
639
- icon: 'action.down',
640
- isEnabled: () => index < last,
641
- run: () => moveRows(table, [row], index + 1)
642
- },
643
- {
644
- id: 'delete-row',
645
- label: labels.deleteRow,
646
- icon: 'action.delete',
647
- danger: true,
648
- isEnabled: () => true,
649
- run: () => deleteRows(table, [row])
650
- }
651
- ];
652
- }
653
- const index = menu.column;
654
- const column = grid.columns[index];
655
- if (column === undefined)
656
- return [];
657
- const last = grid.columns.length - 1;
658
- return [
659
- {
660
- id: 'insert-left',
661
- label: labels.insertLeft,
662
- icon: 'table.left',
663
- isEnabled: () => true,
664
- run: () => insertColumn(table, index)
665
- },
666
- {
667
- id: 'insert-right',
668
- label: labels.insertRight,
669
- icon: 'table.right',
670
- isEnabled: () => true,
671
- run: () => insertColumn(table, index + 1)
672
- },
673
- {
674
- id: 'move-left',
675
- label: labels.moveLeft,
676
- icon: 'table.left',
677
- isEnabled: () => index > 0,
678
- run: () => moveColumn(table, index, index - 1)
679
- },
680
- {
681
- id: 'move-right',
682
- label: labels.moveRight,
683
- icon: 'table.right',
684
- isEnabled: () => index < last,
685
- run: () => moveColumn(table, index, index + 1)
686
- },
687
- {
688
- id: 'delete-column',
689
- label: labels.deleteColumn,
690
- icon: 'action.delete',
691
- danger: true,
692
- isEnabled: () => true,
693
- run: () => deleteColumn(table, index)
694
- }
695
- ];
696
- }
697
- /** Run a menu row, then close the menu. */
698
- runRow = (row) => {
699
- if (!row.isEnabled())
700
- return;
701
- this.menu = null;
702
- this.hovered = null;
703
- takeKeys(this.edytor);
704
- row.run();
705
- this.edytor.overlay.invalidate();
706
- };
707
- /** The `+` under the table: a row at its end, the caret in its first cell. */
708
- addRow = () => {
709
- const table = this.block(this.table);
710
- const grid = gridOf(table);
711
- if (!table || !grid)
712
- return;
713
- takeKeys(this.edytor);
714
- insertRow(table, grid.rows.length, true);
582
+ onDrop: () => queueMicrotask(() => {
583
+ for (const release of this.#releases.splice(0))
584
+ release();
585
+ this.moving = null;
586
+ this.edytor.overlay.invalidate();
587
+ })
588
+ }));
589
+ return off;
715
590
  };
716
- /** The `+` beside the table: a column at its end. */
717
- addColumn = () => {
591
+ /**
592
+ * The `+` under the table (`row`: a row at its end, the caret in its
593
+ * first cell) or beside it (a column at its end).
594
+ * @internal
595
+ */
596
+ add = (kind) => {
718
597
  const table = this.block(this.table);
719
598
  const grid = gridOf(table);
720
599
  if (!table || !grid)
721
600
  return;
722
601
  takeKeys(this.edytor);
723
- insertColumn(table, grid.columns.length);
724
- };
725
- /**
726
- * A `mousedown` on a band: no native selection; the press itself when no `pointerdown` came.
727
- * @internal
728
- */
729
- mousedown = (event, column) => {
730
- event.preventDefault();
731
- if (isLonePress(this.edytor, event))
732
- this.start(event, column);
602
+ if (kind === 'row')
603
+ insertRow(table, grid.rows.length, true);
604
+ else
605
+ insertColumn(table, grid.columns.length);
733
606
  };
734
607
  /**
735
- * Press on column `column`'s band: the drag starts; the preview follows
736
- * the pointer and the release writes the width (`release`); Escape, a
737
- * cancel or the view turning readonly drop the preview, nothing written.
608
+ * Press on column `column`'s band (its `pointerdown`, or its lone
609
+ * `mousedown`): the drag starts; the preview follows the pointer and the
610
+ * release writes the width (`#release`); Escape, a cancel or the view
611
+ * turning readonly drop the preview, nothing written.
738
612
  * @internal
739
613
  */
740
614
  start = (event, column) => {
741
- const { edytor } = this;
742
- const layout = this.layout;
743
- if (event.button !== 0 || edytor.readonly || this.drag || !layout)
744
- return;
745
- const col = layout.columns[column];
746
- if (!col)
747
- return;
748
- event.preventDefault();
749
- event.stopPropagation();
750
- const target = event.currentTarget;
751
- const pointer = event.type === 'pointerdown';
752
- if (pointer)
753
- target?.setPointerCapture?.(event.pointerId);
754
- const table = this.block(layout.table);
755
- if (!table)
756
- return;
757
- const drag = this.resize(table, column, layout.room, event.clientX, event.clientX);
758
- if (!drag)
615
+ const drag = this.band.drag ? null : this.#resize(column, event.clientX, event.clientX);
616
+ const shown = this.layout?.columns[column]?.width;
617
+ if (!drag || shown === undefined)
759
618
  return;
760
619
  // The press starts from the width the grid shows.
761
- this.drag = { ...drag, width: col.width, max: Math.max(drag.max, col.width) };
762
- const document = target?.ownerDocument ?? edytor.node?.ownerDocument;
763
- const tracked = pointer ? document : document?.defaultView;
764
- const [moves, ups] = pointer ? ['pointermove', 'pointerup'] : ['mousemove', 'mouseup'];
765
- const move = (moved) => {
766
- if (!this.drag)
767
- return;
768
- if (!edytor.dispatcher.permits())
769
- return end(moved);
770
- this.drag.at = moved.clientX;
771
- edytor.overlay.invalidate();
772
- };
773
- const end = (ended) => {
774
- tracked?.removeEventListener(moves, move);
775
- tracked?.removeEventListener(ups, end);
776
- tracked?.removeEventListener('pointercancel', end);
777
- document?.removeEventListener('keydown', escape, true);
778
- const drag = this.drag;
779
- if (drag && ended.type === ups) {
780
- drag.at = ended.clientX;
781
- this.release(drag);
782
- takeKeys(edytor);
783
- }
784
- this.drag = null;
785
- edytor.overlay.invalidate();
786
- };
787
- const escape = (key) => {
788
- if (key.key !== 'Escape')
789
- return;
790
- key.preventDefault();
791
- key.stopPropagation();
792
- end(key);
793
- };
794
- this.#cancel = () => end(new Event('cancel'));
795
- tracked?.addEventListener(moves, move);
796
- tracked?.addEventListener(ups, end);
797
- if (pointer)
798
- tracked?.addEventListener('pointercancel', end);
799
- document?.addEventListener('keydown', escape, true);
800
- edytor.overlay.invalidate();
801
- };
802
- #cancel = null;
803
- /**
804
- * The view turned readonly mid-drag: the preview goes, nothing written.
805
- * @internal
806
- */
807
- lock = () => {
808
- if (this.drag && !this.edytor.dispatcher.permits())
809
- this.#cancel?.();
620
+ this.band.start(event, { ...drag, width: shown, max: Math.max(drag.max, shown) }, (drag) => drag && this.#release(drag));
810
621
  };
811
622
  /**
812
623
  * A key on a focused band: ArrowRight/ArrowLeft widen or narrow the
@@ -815,22 +626,10 @@ export class TableChrome {
815
626
  * @internal
816
627
  */
817
628
  key = (event, column) => {
818
- event.stopPropagation();
819
- if (event.key === 'Escape') {
820
- event.preventDefault();
821
- return takeKeys(this.edytor);
822
- }
823
- const step = { ArrowLeft: -1, ArrowRight: 1 }[event.key];
824
- if (step === undefined)
825
- return;
826
- event.preventDefault();
827
- const layout = this.layout;
828
- const table = this.block(layout?.table);
829
- if (!layout || !table || this.drag)
830
- return;
831
- const drag = this.resize(table, column, layout.room, 0, step * (event.shiftKey ? 32 : 8));
629
+ const step = bandKey(this.edytor, this.band, event, { ArrowLeft: -1, ArrowRight: 1 });
630
+ const drag = step && this.#resize(column, 0, step * (event.shiftKey ? 32 : 8));
832
631
  if (drag)
833
- this.release(drag);
632
+ this.#release(drag);
834
633
  };
835
634
  /**
836
635
  * The release: column `drag.column`'s width, and its right neighbour's
@@ -840,123 +639,88 @@ export class TableChrome {
840
639
  * first entry naming it), never by position: the stored array may hold
841
640
  * an entry the grid does not show.
842
641
  */
843
- release(drag) {
642
+ #release(drag) {
844
643
  const table = this.block(drag.table);
845
644
  const columns = gridOf(table)?.columns;
846
- if (!table || !columns)
847
- return;
848
- const { facade } = table.edytor;
849
- const stored = facade.blockDataOf(table.id)?.columns;
850
- const entries = Array.isArray(stored) ? stored : [];
851
- const items = facade.dataItemIds(table.id, ['columns']);
852
- const write = (index, width) => {
853
- const id = columns[index];
854
- const at = entries.findIndex((c) => c?.id === id);
855
- const item = at < 0 || id === undefined ? undefined : items[at];
856
- if (item === undefined || width === undefined)
857
- return [];
858
- if (width === widthOf(entries[at], this.columnWidth))
859
- return [];
860
- return [{ path: ['columns', item, 'width'], value: width }];
861
- };
862
- const own = write(drag.column, this.dragWidth(drag));
863
- if (!own.length && columns[drag.column] === undefined)
645
+ if (!table || !columns || columns[drag.column] === undefined)
864
646
  return;
865
- const ops = [...own, ...write(drag.column + 1, this.nextWidth(drag))];
647
+ const entries = entriesOf(table);
648
+ const items = table.edytor.facade.dataItemIds(table.id, ['columns']);
649
+ const ops = [this.#dragWidth(drag), this.#nextWidth(drag)].flatMap((width, i) => {
650
+ const at = entryIndex(entries, columns[drag.column + i]);
651
+ const item = items[at];
652
+ return at < 0 || item === undefined || width === undefined
653
+ ? []
654
+ : width === widthOf(entries[at], this.columnWidth)
655
+ ? []
656
+ : [{ path: ['columns', item, 'width'], value: width }];
657
+ });
866
658
  if (ops.length)
867
- table.patchData({ ops });
868
- }
869
- /** What the row grip or the column grip stands for now: its table, the row's or column's id, its position. */
870
- source(kind) {
871
- const table = this.block(this.table);
872
- const grid = gridOf(table);
873
- if (!table || !grid)
874
- return null;
875
- if (kind === 'row') {
876
- const id = this.gripRow;
877
- const index = grid.rows.findIndex((r) => r.id === id);
878
- return id && index >= 0 ? { table, id, index } : null;
879
- }
880
- const index = this.gripColumn;
881
- const id = index === null ? undefined : grid.columns[index];
882
- return index === null || id === undefined ? null : { table, id, index };
659
+ this.edytor.patchData(table.id, ops);
883
660
  }
884
661
  /** The drop target and auto-scroll of the drag in progress, released when it ends. */
885
662
  #releases = [];
886
- /** The drag starts: what it moves, its ghost, the page as its drop target, auto-scroll. */
887
- begin(kind, node, pointer, nativeSetDragImage) {
888
- const source = this.source(kind);
889
- if (!source)
663
+ /**
664
+ * The drag starts: what it moves; its ghost, the row's cells side by side
665
+ * or the column's one under the other, at their columns' widths (the
666
+ * blocks' ghost, `dragPreview`); the page as its drop target; auto-scroll.
667
+ */
668
+ #begin(kind, node, pointer, nativeSetDragImage) {
669
+ const source = this.#source(kind);
670
+ const root = this.edytor.node;
671
+ if (!source || !root)
890
672
  return;
891
- const { table } = source;
673
+ const { table, grid, id, index } = source;
892
674
  this.menu = null;
893
- this.moving = { kind, table: table.id, id: source.id, gap: null };
894
- const preview = nativeSetDragImage ? this.preview(kind, source, pointer) : null;
895
- if (nativeSetDragImage && preview)
675
+ this.moving = { kind, table: table.id, id, gap: null };
676
+ const widths = this.#widthsOf(table);
677
+ const cells = (kind === 'row' ? grid.rows[index].cells : grid.rows.map((r) => r.cells[index])).flatMap((cell) => (cell && this.edytor.idToBlock.get(cell)?.node) || []);
678
+ if (nativeSetDragImage && cells.length) {
679
+ const preview = dragPreview(root, cells, pointer, kind === 'row' ? widths : [widths[index]]);
896
680
  setCustomNativeDragPreview({
897
681
  nativeSetDragImage,
898
682
  getOffset: preview.offset,
899
683
  render: ({ container }) => container.append(preview.element)
900
684
  });
685
+ }
901
686
  const ours = (data) => data[MOVE] === this;
902
687
  // The page is the target: the line follows the pointer from the grips, outside the grid.
903
688
  this.#releases.push(dropTargetForElements({
904
689
  element: node.ownerDocument.body,
905
690
  canDrop: ({ source }) => ours(source.data),
906
- onDragEnter: ({ location }) => this.aim(location.current.input),
907
- onDrag: ({ location }) => this.aim(location.current.input),
908
- onDragLeave: () => this.aim(null),
909
- onDrop: ({ location }) => this.drop(location.current.input)
691
+ onDragEnter: ({ location }) => this.#aim(location.current.input),
692
+ onDrag: ({ location }) => this.#aim(location.current.input),
693
+ onDragLeave: () => this.#aim(null),
694
+ onDrop: ({ location }) => this.#drop(location.current.input)
910
695
  }));
911
696
  const scroller = table.node?.querySelector('[data-edytor-table-scroll]');
912
697
  if (scroller)
913
698
  this.#releases.push(autoScrollFor(scroller, ours));
914
699
  this.edytor.overlay.invalidate();
915
700
  }
916
- /** The ghost: the row's cells side by side, or the column's cells one under the other. */
917
- preview(kind, { table, index }, pointer) {
918
- const grid = gridOf(table);
919
- const gridNode = table.node?.querySelector('[data-edytor-table-grid]');
920
- if (!grid || !gridNode)
921
- return null;
922
- const document = gridNode.ownerDocument;
923
- const nodeOf = (id) => (id ? this.edytor.idToBlock.get(id)?.node : null) ?? null;
924
- const widths = this.widthsOf(table);
925
- const heights = grid.rows.map((r) => nodeOf(r.id)?.getBoundingClientRect().height ?? 0);
926
- const box = gridNode.getBoundingClientRect();
927
- if (kind === 'row') {
928
- const row = nodeOf(grid.rows[index]?.id)?.getBoundingClientRect() ?? box;
929
- const cells = grid.rows[index]?.cells.map(nodeOf) ?? [];
930
- return tablePreview(document, [cells], widths, [heights[index] ?? 0], row, pointer);
931
- }
932
- const left = box.left + widths.slice(0, index).reduce((sum, w) => sum + w, 0);
933
- const width = widths[index] ?? this.columnWidth;
934
- const column = new DOMRect(left, box.top, width, box.height);
935
- const cells = grid.rows.map((r) => [nodeOf(r.cells[index])]);
936
- return tablePreview(document, cells, [width], heights, column, pointer);
937
- }
938
701
  /**
939
702
  * Where the moving row or column would land at `input` (`table.drag`):
940
703
  * its gap, by the rows' (columns') middles, and its position once moved;
941
704
  * `null` outside the table (past its box and the gutter) and at its own
942
705
  * place (the gap before or after it).
943
706
  */
944
- landing(input) {
707
+ #landing(input) {
945
708
  const move = this.moving;
946
709
  const table = this.block(move?.table);
947
710
  const grid = gridOf(table);
948
- const gridNode = table?.node?.querySelector('[data-edytor-table-grid]');
949
- if (!move || !input || !table?.node || !grid || !gridNode)
711
+ const node = gridNode(table);
712
+ const box = table?.node?.getBoundingClientRect();
713
+ if (!move || !input || !box || !grid || !node)
950
714
  return null;
951
- const box = table.node.getBoundingClientRect();
952
715
  const { clientX: x, clientY: y } = input;
953
716
  if (x < box.left - GUTTER ||
954
717
  x > box.right + GUTTER ||
955
718
  y < box.top - GUTTER ||
956
719
  y > box.bottom + GUTTER)
957
720
  return null;
958
- let from;
721
+ // The gap: the rows' (columns', from the grid's left border) middles before the pointer.
959
722
  let gap = 0;
723
+ let from;
960
724
  if (move.kind === 'row') {
961
725
  from = grid.rows.findIndex((r) => r.id === move.id);
962
726
  for (const row of grid.rows) {
@@ -967,25 +731,20 @@ export class TableChrome {
967
731
  }
968
732
  else {
969
733
  from = grid.columns.indexOf(move.id);
970
- const style = gridNode.ownerDocument.defaultView?.getComputedStyle(gridNode);
971
- let left = gridNode.getBoundingClientRect().left + px(style?.borderLeftWidth);
972
- for (const width of trackWidths(gridNode)) {
973
- if (x > left + width / 2)
734
+ let left = node.getBoundingClientRect().left + px(styleOf(node)?.borderLeftWidth);
735
+ for (const width of trackWidths(node))
736
+ if (x > (left += width) - width / 2)
974
737
  gap++;
975
- left += width;
976
- }
977
738
  }
978
739
  if (from < 0 || gap === from || gap === from + 1)
979
740
  return null;
980
741
  return { gap, to: gap > from ? gap - 1 : gap };
981
742
  }
982
743
  /** The pointer moved during the drag: the drop line follows it. */
983
- aim(input) {
744
+ #aim(input) {
984
745
  const move = this.moving;
985
- if (!move)
986
- return;
987
- const gap = this.landing(input)?.gap ?? null;
988
- if (gap === move.gap)
746
+ const gap = this.#landing(input)?.gap ?? null;
747
+ if (!move || gap === move.gap)
989
748
  return;
990
749
  move.gap = gap;
991
750
  this.edytor.overlay.invalidate();
@@ -995,9 +754,9 @@ export class TableChrome {
995
754
  * `moveColumn`: one command, one undo step), the keys go to the editor;
996
755
  * nothing where no line shows.
997
756
  */
998
- drop(input) {
757
+ #drop(input) {
999
758
  const move = this.moving;
1000
- const landing = this.landing(input);
759
+ const landing = this.#landing(input);
1001
760
  const table = this.block(move?.table);
1002
761
  if (!move)
1003
762
  return;
@@ -1013,12 +772,4 @@ export class TableChrome {
1013
772
  moveColumn(table, move.id, landing.to);
1014
773
  takeKeys(this.edytor);
1015
774
  }
1016
- /** The drag ended, dropped or cancelled: no line, no target; the chrome follows the pointer again. */
1017
- finish() {
1018
- for (const release of this.#releases.splice(0))
1019
- release();
1020
- this.moving = null;
1021
- this.edytor.overlay.invalidate();
1022
- }
1023
775
  }
1024
- const sameLayout = (a, b) => a === b || (a !== null && b !== null && JSON.stringify(a) === JSON.stringify(b));