edytor 1.0.0-rc.3 → 1.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 (642) hide show
  1. package/README.md +65 -25
  2. package/dist/block/block.svelte.d.ts +10 -85
  3. package/dist/block/block.svelte.js +27 -137
  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 +8 -10
  9. package/dist/block/inlineBlock.svelte.js +14 -22
  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 +19 -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/comments/client.d.ts +2 -2
  49. package/dist/collaboration/comments/client.js +1 -1
  50. package/dist/collaboration/history/index.d.ts +5 -5
  51. package/dist/collaboration/history/index.js +5 -5
  52. package/dist/collaboration/history/panel.svelte.d.ts +91 -0
  53. package/dist/collaboration/history/panel.svelte.js +223 -0
  54. package/dist/collaboration/providers.d.ts +12 -3
  55. package/dist/collaboration/providers.js +5 -4
  56. package/dist/components/Block.svelte +39 -55
  57. package/dist/components/Block.svelte.d.ts +7 -5
  58. package/dist/components/Content.svelte +1 -5
  59. package/dist/components/Edytor.svelte +53 -96
  60. package/dist/components/Edytor.svelte.d.ts +8 -12
  61. package/dist/components/Ranges.svelte +96 -0
  62. package/dist/components/Ranges.svelte.d.ts +19 -0
  63. package/dist/components/Suggestion.svelte +3 -2
  64. package/dist/components/Text.svelte +2 -5
  65. package/dist/components/Text.svelte.d.ts +1 -1
  66. package/dist/crdt/admission.d.ts +2 -9
  67. package/dist/crdt/admission.js +3 -9
  68. package/dist/crdt/attribution/attribution.d.ts +11 -72
  69. package/dist/crdt/attribution/attribution.js +5 -52
  70. package/dist/crdt/attribution/block.d.ts +0 -78
  71. package/dist/crdt/attribution/block.js +1 -144
  72. package/dist/crdt/data.d.ts +8 -13
  73. package/dist/crdt/data.js +30 -70
  74. package/dist/crdt/doc/anchors.js +4 -4
  75. package/dist/crdt/doc/content.d.ts +5 -1
  76. package/dist/crdt/doc/content.js +3 -1
  77. package/dist/crdt/doc/delete.d.ts +1 -0
  78. package/dist/crdt/doc/funnel.d.ts +0 -23
  79. package/dist/crdt/doc/funnel.js +34 -85
  80. package/dist/crdt/doc/gate.d.ts +8 -9
  81. package/dist/crdt/doc/gate.js +7 -17
  82. package/dist/crdt/doc/history.d.ts +87 -14
  83. package/dist/crdt/doc/history.js +334 -149
  84. package/dist/crdt/doc/layout.d.ts +0 -1
  85. package/dist/crdt/doc/layout.js +2 -3
  86. package/dist/crdt/doc/meta.d.ts +4 -4
  87. package/dist/crdt/doc/meta.js +10 -21
  88. package/dist/crdt/doc/moves.d.ts +4 -4
  89. package/dist/crdt/doc/moves.js +5 -5
  90. package/dist/crdt/doc/plan.d.ts +2 -0
  91. package/dist/crdt/doc/plan.js +2 -0
  92. package/dist/crdt/doc/reads.d.ts +1 -5
  93. package/dist/crdt/doc/reads.js +38 -49
  94. package/dist/crdt/doc/seed.d.ts +15 -6
  95. package/dist/crdt/doc/seed.js +27 -26
  96. package/dist/crdt/doc/split-merge.d.ts +1 -3
  97. package/dist/crdt/doc/split-merge.js +4 -5
  98. package/dist/crdt/doc/steps.d.ts +3 -7
  99. package/dist/crdt/doc/steps.js +20 -9
  100. package/dist/crdt/doc/types.d.ts +0 -10
  101. package/dist/crdt/document.d.ts +24 -115
  102. package/dist/crdt/document.js +207 -305
  103. package/dist/crdt/edytor-doc.d.ts +671 -90
  104. package/dist/crdt/edytor-doc.js +73 -149
  105. package/dist/crdt/engine-api.d.ts +15 -47
  106. package/dist/crdt/engine.d.ts +7 -17
  107. package/dist/crdt/engine.js +9 -19
  108. package/dist/crdt/flow.d.ts +9 -37
  109. package/dist/crdt/flow.js +260 -238
  110. package/dist/crdt/index.d.ts +26 -85
  111. package/dist/crdt/index.js +21 -47
  112. package/dist/crdt/operations.d.ts +24 -33
  113. package/dist/crdt/operations.js +7 -17
  114. package/dist/crdt/placement/display.d.ts +0 -2
  115. package/dist/crdt/placement/display.js +0 -15
  116. package/dist/crdt/placement/model.d.ts +160 -12
  117. package/dist/crdt/placement/model.js +413 -414
  118. package/dist/crdt/placement/rank.d.ts +1 -5
  119. package/dist/crdt/placement/rank.js +28 -38
  120. package/dist/crdt/protocol.d.ts +4 -5
  121. package/dist/crdt/protocol.js +3 -4
  122. package/dist/crdt/protocols/awareness.d.ts +3 -7
  123. package/dist/crdt/protocols/awareness.js +17 -33
  124. package/dist/crdt/protocols/envelope.d.ts +9 -29
  125. package/dist/crdt/protocols/envelope.js +8 -25
  126. package/dist/crdt/protocols/sync.d.ts +15 -30
  127. package/dist/crdt/protocols/sync.js +27 -89
  128. package/dist/crdt/providers/bound.d.ts +3 -1
  129. package/dist/crdt/providers/bound.js +3 -1
  130. package/dist/crdt/providers/container.d.ts +11 -17
  131. package/dist/crdt/providers/container.js +39 -27
  132. package/dist/crdt/providers/index.d.ts +34 -6
  133. package/dist/crdt/providers/index.js +106 -111
  134. package/dist/crdt/providers/indexeddb.d.ts +2 -12
  135. package/dist/crdt/providers/indexeddb.js +29 -90
  136. package/dist/crdt/providers/room.d.ts +58 -2
  137. package/dist/crdt/providers/room.js +38 -21
  138. package/dist/crdt/providers/websocket.d.ts +1 -1
  139. package/dist/crdt/providers/websocket.js +3 -4
  140. package/dist/crdt/purge.d.ts +2 -2
  141. package/dist/crdt/purge.js +69 -6
  142. package/dist/crdt/rangeDelete.d.ts +4 -42
  143. package/dist/crdt/rangeDelete.js +7 -6
  144. package/dist/crdt/restore.d.ts +21 -1
  145. package/dist/crdt/restore.js +54 -59
  146. package/dist/crdt/schema.d.ts +2 -2
  147. package/dist/crdt/schema.js +4 -5
  148. package/dist/crdt/semantics.d.ts +10 -15
  149. package/dist/crdt/semantics.js +22 -21
  150. package/dist/crdt/storage.d.ts +7 -13
  151. package/dist/crdt/storage.js +10 -24
  152. package/dist/crdt/structs.d.ts +42 -47
  153. package/dist/crdt/structs.js +76 -67
  154. package/dist/crdt/tables.d.ts +9 -0
  155. package/dist/crdt/tables.js +20 -0
  156. package/dist/crdt/text/delete-index.d.ts +0 -13
  157. package/dist/crdt/text/delete-index.js +7 -14
  158. package/dist/crdt/text/deletes.d.ts +9 -22
  159. package/dist/crdt/text/deletes.js +11 -74
  160. package/dist/crdt/text/index/cache.js +3 -3
  161. package/dist/crdt/text/index/fold.d.ts +1 -2
  162. package/dist/crdt/text/index/fold.js +15 -10
  163. package/dist/crdt/text/index/layout.d.ts +0 -10
  164. package/dist/crdt/text/index/layout.js +6 -20
  165. package/dist/crdt/text/index/records.js +2 -1
  166. package/dist/crdt/text/index/report.js +5 -6
  167. package/dist/crdt/text/index/shared.d.ts +11 -4
  168. package/dist/crdt/text/index/shared.js +8 -7
  169. package/dist/crdt/text/index/state.d.ts +3 -33
  170. package/dist/crdt/text/index/state.js +2 -4
  171. package/dist/crdt/text/model.d.ts +82 -2
  172. package/dist/crdt/text/model.js +344 -354
  173. package/dist/crdt/text/rows.d.ts +0 -2
  174. package/dist/crdt/text/rows.js +0 -11
  175. package/dist/crdt/text/runs.d.ts +6 -3
  176. package/dist/crdt/text/runs.js +132 -137
  177. package/dist/crdt/text/streams.d.ts +1 -1
  178. package/dist/crdt/text/streams.js +1 -1
  179. package/dist/crdt/vendor/yjs/API-NOTES.md +25 -8
  180. package/dist/crdt/vendor/yjs/UPSTREAM.md +288 -8
  181. package/dist/crdt/vendor/yjs/dts/global.d.ts +5 -26
  182. package/dist/crdt/vendor/yjs/dts/index.d.ts +10 -15
  183. package/dist/crdt/vendor/yjs/dts/structs/AbstractStruct.d.ts +2 -2
  184. package/dist/crdt/vendor/yjs/dts/structs/Item.d.ts +14 -219
  185. package/dist/crdt/vendor/yjs/dts/structs/Skip.d.ts +2 -2
  186. package/dist/crdt/vendor/yjs/dts/utils/BlockSet.d.ts +2 -2
  187. package/dist/crdt/vendor/yjs/dts/utils/Doc.d.ts +12 -123
  188. package/dist/crdt/vendor/yjs/dts/utils/ID.d.ts +1 -1
  189. package/dist/crdt/vendor/yjs/dts/utils/RangeCursor.d.ts +37 -58
  190. package/dist/crdt/vendor/yjs/dts/utils/Transaction.d.ts +3 -78
  191. package/dist/crdt/vendor/yjs/dts/utils/UpdateDecoder.d.ts +2 -81
  192. package/dist/crdt/vendor/yjs/dts/utils/UpdateEncoder.d.ts +2 -74
  193. package/dist/crdt/vendor/yjs/dts/utils/encoding-helpers.d.ts +4 -4
  194. package/dist/crdt/vendor/yjs/dts/utils/encoding.d.ts +6 -18
  195. package/dist/crdt/vendor/yjs/dts/utils/ids.d.ts +12 -237
  196. package/dist/crdt/vendor/yjs/dts/utils/positions.d.ts +5 -0
  197. package/dist/crdt/vendor/yjs/dts/utils/redo.d.ts +3 -0
  198. package/dist/crdt/vendor/yjs/dts/utils/transaction-helpers.d.ts +1 -3
  199. package/dist/crdt/vendor/yjs/dts/utils/updates.d.ts +6 -23
  200. package/dist/crdt/vendor/yjs/dts/ynode.d.ts +73 -498
  201. package/dist/crdt/vendor/yjs/global.d.ts +5 -26
  202. package/dist/crdt/vendor/yjs/src/index.js +11 -25
  203. package/dist/crdt/vendor/yjs/src/structs/AbstractStruct.js +1 -1
  204. package/dist/crdt/vendor/yjs/src/structs/GC.js +1 -1
  205. package/dist/crdt/vendor/yjs/src/structs/Item.js +10 -372
  206. package/dist/crdt/vendor/yjs/src/structs/Skip.js +1 -1
  207. package/dist/crdt/vendor/yjs/src/utils/BlockSet.js +2 -2
  208. package/dist/crdt/vendor/yjs/src/utils/Doc.js +14 -170
  209. package/dist/crdt/vendor/yjs/src/utils/ID.js +1 -1
  210. package/dist/crdt/vendor/yjs/src/utils/RangeCursor.js +61 -128
  211. package/dist/crdt/vendor/yjs/src/utils/StructStore.js +0 -22
  212. package/dist/crdt/vendor/yjs/src/utils/Transaction.js +17 -282
  213. package/dist/crdt/vendor/yjs/src/utils/UpdateDecoder.js +3 -130
  214. package/dist/crdt/vendor/yjs/src/utils/UpdateEncoder.js +2 -132
  215. package/dist/crdt/vendor/yjs/src/utils/encoding-helpers.js +4 -4
  216. package/dist/crdt/vendor/yjs/src/utils/encoding.js +49 -146
  217. package/dist/crdt/vendor/yjs/src/utils/ids.js +23 -900
  218. package/dist/crdt/vendor/yjs/src/utils/positions.js +115 -0
  219. package/dist/crdt/vendor/yjs/src/utils/redo.js +143 -0
  220. package/dist/crdt/vendor/yjs/src/utils/transaction-helpers.js +10 -127
  221. package/dist/crdt/vendor/yjs/src/utils/updates.js +7 -50
  222. package/dist/crdt/vendor/yjs/src/ynode.js +261 -2226
  223. package/dist/dnd/autoScroll.js +1 -2
  224. package/dist/dnd/pragmatic.d.ts +4 -22
  225. package/dist/dnd/pragmatic.js +7 -26
  226. package/dist/dnd/track.d.ts +14 -0
  227. package/dist/dnd/track.js +55 -0
  228. package/dist/dnd/vendor/pragmatic/UPSTREAM.md +103 -0
  229. package/dist/dnd/vendor/pragmatic/bind-event-listener/LICENSE +21 -0
  230. package/dist/dnd/vendor/pragmatic/bind-event-listener/bind-all.js +46 -0
  231. package/dist/dnd/vendor/pragmatic/bind-event-listener/bind.js +7 -0
  232. package/dist/dnd/vendor/pragmatic/bind-event-listener/index.js +2 -0
  233. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/LICENSE.md +11 -0
  234. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter-native-data-key.js +6 -0
  235. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.d.ts +57 -0
  236. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.js +306 -0
  237. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.d.ts +8 -0
  238. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.js +10 -0
  239. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.d.ts +4 -0
  240. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.js +6 -0
  241. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/types.d.ts +1 -0
  242. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/get-element-from-point-without-honey-pot.js +12 -0
  243. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/honey-pot-data-attribute.js +3 -0
  244. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/is-honey-pot-element.js +4 -0
  245. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/make-honey-pot-fix.js +333 -0
  246. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/internal-types.d.ts +350 -0
  247. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/dispatch-consumer-event.js +128 -0
  248. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/lifecycle-manager.js +340 -0
  249. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/usage-ledger.js +32 -0
  250. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-adapter.js +59 -0
  251. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-drop-target.js +288 -0
  252. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-monitor.js +85 -0
  253. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/combine.js +6 -0
  254. 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
  255. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.js +153 -0
  256. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/types.d.ts +16 -0
  257. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/once.js +13 -0
  258. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/add-attribute.js +7 -0
  259. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/android.js +10 -0
  260. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/count-events-for-safari.js +104 -0
  261. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-from-another-window.js +16 -0
  262. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window-in-safari.js +12 -0
  263. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window.js +55 -0
  264. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/detect-broken-drag.js +48 -0
  265. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/get-input.js +14 -0
  266. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-firefox.js +13 -0
  267. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-safari.js +19 -0
  268. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/max-z-index.js +3 -0
  269. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/text-media-type.js +6 -0
  270. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/url-media-type.js +6 -0
  271. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/popover-reset-styles.js +40 -0
  272. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/supports-popover.js +16 -0
  273. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/LICENSE.md +11 -0
  274. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.d.ts +4 -0
  275. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.js +8 -0
  276. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/internal-types.d.ts +50 -0
  277. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/data-attributes.js +9 -0
  278. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/get-scroll-by.js +117 -0
  279. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/make-api.js +90 -0
  280. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/try-scroll.js +183 -0
  281. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/axis.js +22 -0
  282. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/can-scroll-on-edge.js +17 -0
  283. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/configuration.js +49 -0
  284. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/edges.js +9 -0
  285. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/engagement-history.js +43 -0
  286. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-over-element-hitbox.js +50 -0
  287. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-percentage-in-range.js +19 -0
  288. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-scroll-change.js +106 -0
  289. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-axis-allowed.js +3 -0
  290. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-within.js +11 -0
  291. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/scheduler.js +104 -0
  292. package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/side.js +6 -0
  293. package/dist/dnd/vendor/pragmatic/raf-schd/LICENSE +21 -0
  294. package/dist/dnd/vendor/pragmatic/raf-schd/raf-schd.esm.js +34 -0
  295. package/dist/edytor.svelte.d.ts +34 -64
  296. package/dist/edytor.svelte.js +116 -180
  297. package/dist/events/beforeInputCommands.d.ts +6 -11
  298. package/dist/events/beforeInputCommands.js +185 -181
  299. package/dist/events/beforeInputDeleteCommands.d.ts +20 -1
  300. package/dist/events/beforeInputDeleteCommands.js +153 -204
  301. package/dist/events/domTextOffset.d.ts +9 -9
  302. package/dist/events/domTextOffset.js +20 -48
  303. package/dist/events/events.utils.d.ts +0 -2
  304. package/dist/events/events.utils.js +0 -4
  305. package/dist/events/nativeInteractiveControl.d.ts +13 -13
  306. package/dist/events/nativeInteractiveControl.js +28 -56
  307. package/dist/events/onBeforeInput.d.ts +6 -1
  308. package/dist/events/onBeforeInput.js +207 -331
  309. package/dist/events/onCopy.js +1 -5
  310. package/dist/events/onDrop.d.ts +1 -1
  311. package/dist/events/onDrop.js +27 -69
  312. package/dist/events/onFocus.d.ts +9 -4
  313. package/dist/events/onFocus.js +45 -67
  314. package/dist/events/onInput.d.ts +8 -4
  315. package/dist/events/onInput.js +34 -147
  316. package/dist/events/onKeyDown.js +55 -122
  317. package/dist/events/onPaste.d.ts +13 -1
  318. package/dist/events/onPaste.js +46 -76
  319. package/dist/index.d.ts +10 -14
  320. package/dist/index.js +3 -3
  321. package/dist/kinds.d.ts +4 -6
  322. package/dist/kinds.js +28 -27
  323. package/dist/labels.d.ts +81 -320
  324. package/dist/labels.js +180 -408
  325. package/dist/plugins/Chrome.svelte +29 -0
  326. package/dist/plugins/Chrome.svelte.d.ts +32 -0
  327. package/dist/plugins/Control.svelte +23 -0
  328. package/dist/plugins/Control.svelte.d.ts +30 -0
  329. package/dist/plugins/anchored.svelte.d.ts +47 -0
  330. package/dist/plugins/anchored.svelte.js +73 -0
  331. package/dist/plugins/arrowMove/arrowMove.d.ts +2 -1
  332. package/dist/plugins/arrowMove/arrowMove.js +9 -5
  333. package/dist/plugins/bands.svelte.d.ts +57 -0
  334. package/dist/plugins/bands.svelte.js +95 -0
  335. package/dist/plugins/blockHandles/BlockHandle.svelte +14 -154
  336. package/dist/plugins/blockHandles/BlockHandle.svelte.d.ts +2 -2
  337. package/dist/plugins/blockHandles/BlockHandleController.svelte.d.ts +39 -94
  338. package/dist/plugins/blockHandles/BlockHandleController.svelte.js +190 -247
  339. package/dist/plugins/blockHandles/BlockHandles.svelte +27 -17
  340. package/dist/plugins/blockHandles/BlockHandles.svelte.d.ts +2 -2
  341. package/dist/plugins/blockHandles/blockHandlesPlugin.d.ts +25 -39
  342. package/dist/plugins/blockHandles/blockHandlesPlugin.js +129 -185
  343. package/dist/plugins/blockHandles/dragPreview.d.ts +8 -6
  344. package/dist/plugins/blockHandles/dragPreview.js +18 -16
  345. package/dist/plugins/blockHandles/dropIndicator.js +52 -60
  346. package/dist/plugins/blockHandles/geometry.d.ts +2 -1
  347. package/dist/plugins/blockHandles/geometry.js +6 -6
  348. package/dist/plugins/blockMenu/BlockMenuController.svelte.d.ts +28 -38
  349. package/dist/plugins/blockMenu/BlockMenuController.svelte.js +116 -183
  350. package/dist/plugins/blockMenu/blockMenuPlugin.d.ts +1 -3
  351. package/dist/plugins/blockMenu/blockMenuPlugin.js +12 -29
  352. package/dist/plugins/brand.d.ts +8 -0
  353. package/dist/plugins/brand.js +8 -0
  354. package/dist/plugins/chrome.d.ts +45 -38
  355. package/dist/plugins/chrome.js +59 -36
  356. package/dist/plugins/code/CodeHeader.svelte +3 -35
  357. package/dist/plugins/code/CodePlugin.svelte +50 -53
  358. package/dist/plugins/code/CodePlugin.svelte.d.ts +0 -2
  359. package/dist/plugins/code/LanguageMenu.svelte +16 -125
  360. package/dist/plugins/code/LanguageMenu.svelte.d.ts +2 -1
  361. package/dist/plugins/code/code.css +5 -117
  362. package/dist/plugins/code/header.svelte.d.ts +2 -11
  363. package/dist/plugins/code/header.svelte.js +11 -38
  364. package/dist/plugins/code/languageMenu.svelte.d.ts +12 -32
  365. package/dist/plugins/code/languageMenu.svelte.js +30 -160
  366. package/dist/plugins/code/languages.d.ts +9 -19
  367. package/dist/plugins/code/languages.js +39 -126
  368. package/dist/plugins/columns/ColumnResize.svelte +13 -25
  369. package/dist/plugins/columns/ColumnResize.svelte.d.ts +1 -1
  370. package/dist/plugins/columns/ColumnsPlugin.svelte +46 -78
  371. package/dist/plugins/columns/ColumnsPlugin.svelte.d.ts +0 -12
  372. package/dist/plugins/columns/columns.css +7 -26
  373. package/dist/plugins/columns/resize.svelte.d.ts +14 -51
  374. package/dist/plugins/columns/resize.svelte.js +70 -164
  375. package/dist/plugins/comments/CommentsController.svelte.d.ts +1 -4
  376. package/dist/plugins/comments/CommentsController.svelte.js +14 -25
  377. package/dist/plugins/comments/CommentsSidebar.svelte +82 -431
  378. package/dist/plugins/comments/CommentsSidebar.svelte.d.ts +4 -2
  379. package/dist/plugins/comments/commentsPlugin.d.ts +25 -9
  380. package/dist/plugins/comments/commentsPlugin.js +12 -10
  381. package/dist/plugins/equation/EquationEditor.svelte +16 -130
  382. package/dist/plugins/equation/EquationEditor.svelte.d.ts +1 -2
  383. package/dist/plugins/equation/EquationPlugin.svelte +109 -165
  384. package/dist/plugins/equation/EquationPlugin.svelte.d.ts +2 -2
  385. package/dist/plugins/equation/EquationView.svelte +20 -11
  386. package/dist/plugins/equation/equation.svelte.d.ts +37 -24
  387. package/dist/plugins/equation/equation.svelte.js +20 -94
  388. package/dist/plugins/equation/katex.js +6 -9
  389. package/dist/plugins/find/FindController.svelte.d.ts +8 -13
  390. package/dist/plugins/find/FindController.svelte.js +34 -55
  391. package/dist/plugins/find/findPlugin.d.ts +4 -8
  392. package/dist/plugins/find/findPlugin.js +29 -9
  393. package/dist/plugins/image/ImageChrome.svelte +6 -167
  394. package/dist/plugins/image/ImageChrome.svelte.d.ts +0 -2
  395. package/dist/plugins/image/ImagePlugin.svelte +45 -134
  396. package/dist/plugins/image/ImagePlugin.svelte.d.ts +1 -42
  397. package/dist/plugins/image/ImageToolbarHost.svelte +37 -0
  398. package/dist/plugins/image/ImageToolbarHost.svelte.d.ts +9 -0
  399. package/dist/plugins/image/controls.svelte.d.ts +6 -36
  400. package/dist/plugins/image/controls.svelte.js +43 -212
  401. package/dist/plugins/image/image.d.ts +0 -5
  402. package/dist/plugins/image/image.js +0 -3
  403. package/dist/plugins/image/toolbar.svelte.d.ts +69 -0
  404. package/dist/plugins/image/toolbar.svelte.js +145 -0
  405. package/dist/plugins/index.d.ts +31 -26
  406. package/dist/plugins/index.js +29 -22
  407. package/dist/plugins/list.svelte.d.ts +128 -0
  408. package/dist/plugins/list.svelte.js +217 -0
  409. package/dist/plugins/markdownShortcuts.d.ts +1 -1
  410. package/dist/plugins/markdownShortcuts.js +6 -5
  411. package/dist/plugins/marquee/MarqueeBox.svelte +3 -20
  412. package/dist/plugins/marquee/MarqueeBox.svelte.d.ts +1 -1
  413. package/dist/plugins/marquee/MarqueeController.svelte.d.ts +0 -2
  414. package/dist/plugins/marquee/MarqueeController.svelte.js +20 -23
  415. package/dist/plugins/marquee/marquee.js +4 -21
  416. package/dist/plugins/marquee/marqueePlugin.d.ts +4 -3
  417. package/dist/plugins/marquee/marqueePlugin.js +16 -15
  418. package/dist/plugins/media/AudioPlugin.svelte +3 -90
  419. package/dist/plugins/media/AudioPlugin.svelte.d.ts +1 -4
  420. package/dist/plugins/media/BookmarkPlugin.svelte +113 -120
  421. package/dist/plugins/media/BookmarkPlugin.svelte.d.ts +10 -15
  422. package/dist/plugins/media/EmbedPlugin.svelte +82 -86
  423. package/dist/plugins/media/EmbedPlugin.svelte.d.ts +11 -17
  424. package/dist/plugins/media/EmptySlot.svelte +44 -0
  425. package/dist/plugins/media/EmptySlot.svelte.d.ts +25 -0
  426. package/dist/plugins/media/FilePlugin.svelte +35 -113
  427. package/dist/plugins/media/FilePlugin.svelte.d.ts +12 -4
  428. package/dist/plugins/media/MediaEmpty.svelte +51 -90
  429. package/dist/plugins/media/MediaEmpty.svelte.d.ts +26 -10
  430. package/dist/plugins/media/SourceBlock.svelte +164 -0
  431. package/dist/plugins/media/SourceBlock.svelte.d.ts +33 -0
  432. package/dist/plugins/media/VideoPlugin.svelte +4 -99
  433. package/dist/plugins/media/VideoPlugin.svelte.d.ts +2 -5
  434. package/dist/plugins/media/empty.svelte.d.ts +36 -44
  435. package/dist/plugins/media/empty.svelte.js +41 -45
  436. package/dist/plugins/media/media.d.ts +90 -44
  437. package/dist/plugins/media/media.js +77 -99
  438. package/dist/plugins/media/urlPaste.svelte.d.ts +6 -37
  439. package/dist/plugins/media/urlPaste.svelte.js +32 -102
  440. package/dist/plugins/mention/MentionPlugin.svelte +42 -123
  441. package/dist/plugins/mention/MentionPlugin.svelte.d.ts +6 -25
  442. package/dist/plugins/page/PageLink.svelte +54 -38
  443. package/dist/plugins/page/PagePlugin.svelte +20 -18
  444. package/dist/plugins/page/PagePlugin.svelte.d.ts +2 -4
  445. package/dist/plugins/page/page.d.ts +35 -9
  446. package/dist/plugins/page/page.js +3 -4
  447. package/dist/plugins/pageLink/PageLinkPlugin.svelte +47 -107
  448. package/dist/plugins/pageLink/PageLinkPlugin.svelte.d.ts +6 -25
  449. package/dist/plugins/planned.d.ts +10 -0
  450. package/dist/plugins/planned.js +12 -0
  451. package/dist/plugins/richtext/CalloutIcon.svelte +13 -26
  452. package/dist/plugins/richtext/CalloutIconPicker.svelte +26 -0
  453. package/dist/plugins/richtext/CalloutIconPicker.svelte.d.ts +9 -0
  454. package/dist/plugins/richtext/EmptyBody.svelte +13 -20
  455. package/dist/plugins/richtext/RichTextControl.svelte +39 -0
  456. package/dist/plugins/richtext/RichTextControl.svelte.d.ts +8 -0
  457. package/dist/plugins/richtext/RichTextPlugin.svelte +161 -177
  458. package/dist/plugins/richtext/RichTextPlugin.svelte.d.ts +33 -34
  459. package/dist/plugins/richtext/TodoCheckbox.svelte +10 -21
  460. package/dist/plugins/richtext/TodoCheckbox.svelte.d.ts +0 -2
  461. package/dist/plugins/richtext/body.js +2 -2
  462. package/dist/plugins/richtext/calloutIcons.svelte.d.ts +50 -55
  463. package/dist/plugins/richtext/calloutIcons.svelte.js +86 -174
  464. package/dist/plugins/richtext/callouts.d.ts +15 -0
  465. package/dist/plugins/richtext/callouts.js +23 -0
  466. package/dist/plugins/richtext/controls.svelte.d.ts +110 -0
  467. package/dist/plugins/richtext/controls.svelte.js +126 -0
  468. package/dist/plugins/richtext/richTextOperations.js +37 -28
  469. package/dist/plugins/slashMenu/SlashMenuController.svelte.d.ts +2 -14
  470. package/dist/plugins/slashMenu/SlashMenuController.svelte.js +34 -71
  471. package/dist/plugins/slashMenu/slashMenuPlugin.d.ts +9 -26
  472. package/dist/plugins/slashMenu/slashMenuPlugin.js +27 -68
  473. package/dist/plugins/suggestions/SuggestionBars.svelte +27 -84
  474. package/dist/plugins/suggestions/SuggestionBars.svelte.d.ts +9 -3
  475. package/dist/plugins/suggestions/suggestionsPlugin.d.ts +10 -18
  476. package/dist/plugins/suggestions/suggestionsPlugin.js +9 -24
  477. package/dist/plugins/table/TableChrome.svelte +40 -124
  478. package/dist/plugins/table/TablePlugin.svelte +106 -168
  479. package/dist/plugins/table/TablePlugin.svelte.d.ts +0 -4
  480. package/dist/plugins/table/chrome.svelte.d.ts +38 -141
  481. package/dist/plugins/table/chrome.svelte.js +339 -589
  482. package/dist/plugins/table/ops.d.ts +47 -0
  483. package/dist/plugins/table/ops.js +233 -0
  484. package/dist/plugins/table/table.css +16 -152
  485. package/dist/plugins/table/table.d.ts +15 -14
  486. package/dist/plugins/table/table.js +22 -16
  487. package/dist/plugins/toc/TableOfContents.svelte +32 -38
  488. package/dist/plugins/toc/TableOfContents.svelte.d.ts +1 -5
  489. package/dist/plugins/toc/TocPlugin.svelte +22 -22
  490. package/dist/plugins/toc/TocPlugin.svelte.d.ts +4 -6
  491. package/dist/plugins/toc/toc.d.ts +41 -10
  492. package/dist/plugins/toc/toc.js +2 -3
  493. package/dist/plugins/toolbar/ToolbarController.svelte.d.ts +4 -68
  494. package/dist/plugins/toolbar/ToolbarController.svelte.js +63 -89
  495. package/dist/plugins/toolbar/toolbarPlugin.d.ts +8 -18
  496. package/dist/plugins/toolbar/toolbarPlugin.js +28 -43
  497. package/dist/plugins/triggers/TriggerController.svelte.d.ts +4 -68
  498. package/dist/plugins/triggers/TriggerController.svelte.js +48 -129
  499. package/dist/plugins/triggers/place.d.ts +0 -9
  500. package/dist/plugins/triggers/place.js +1 -17
  501. package/dist/plugins/triggers/triggers.d.ts +31 -9
  502. package/dist/plugins/triggers/triggers.js +82 -62
  503. package/dist/plugins/uploads.svelte.d.ts +38 -20
  504. package/dist/plugins/uploads.svelte.js +39 -32
  505. package/dist/plugins.d.ts +154 -59
  506. package/dist/selection/domSelection.d.ts +13 -4
  507. package/dist/selection/domSelection.js +110 -183
  508. package/dist/selection/pointer.svelte.d.ts +8 -10
  509. package/dist/selection/pointer.svelte.js +32 -73
  510. package/dist/selection/replaceSelection.d.ts +21 -22
  511. package/dist/selection/replaceSelection.js +60 -69
  512. package/dist/selection/selection.svelte.d.ts +5 -73
  513. package/dist/selection/selection.svelte.js +224 -542
  514. package/dist/selection/selection.utils.d.ts +34 -11
  515. package/dist/selection/selection.utils.js +128 -247
  516. package/dist/selection/visibility.d.ts +3 -8
  517. package/dist/selection/visibility.js +7 -5
  518. package/dist/session/announcer.svelte.d.ts +2 -1
  519. package/dist/session/announcer.svelte.js +7 -3
  520. package/dist/session/attempt.d.ts +33 -39
  521. package/dist/session/attempt.js +61 -55
  522. package/dist/session/bindings.js +108 -139
  523. package/dist/session/commands.d.ts +47 -22
  524. package/dist/session/commands.js +206 -208
  525. package/dist/session/composition.svelte.d.ts +2 -4
  526. package/dist/session/composition.svelte.js +55 -65
  527. package/dist/session/editing/text.d.ts +6 -0
  528. package/dist/session/editing/text.js +17 -3
  529. package/dist/session/handles.d.ts +10 -1
  530. package/dist/session/handles.js +28 -0
  531. package/dist/session/history.d.ts +0 -4
  532. package/dist/session/history.js +15 -21
  533. package/dist/session/inputRules.js +75 -84
  534. package/dist/session/keymap.d.ts +1 -6
  535. package/dist/session/keymap.js +17 -20
  536. package/dist/session/moves.d.ts +10 -10
  537. package/dist/session/moves.js +31 -59
  538. package/dist/session/navigation.d.ts +3 -2
  539. package/dist/session/navigation.js +127 -168
  540. package/dist/session/ports.d.ts +2 -7
  541. package/dist/session/selection.d.ts +4 -3
  542. package/dist/session/selection.js +5 -0
  543. package/dist/session/suggestions.svelte.d.ts +1 -1
  544. package/dist/session/suggestions.svelte.js +42 -47
  545. package/dist/session/virtual.d.ts +3 -3
  546. package/dist/session/virtual.js +18 -40
  547. package/dist/surface/attributes.d.ts +1 -0
  548. package/dist/surface/attributes.js +3 -26
  549. package/dist/surface/cells.d.ts +5 -0
  550. package/dist/surface/cells.js +5 -0
  551. package/dist/surface/lines.d.ts +2 -2
  552. package/dist/surface/lines.js +1 -1
  553. package/dist/surface/observer.svelte.d.ts +3 -20
  554. package/dist/surface/observer.svelte.js +52 -72
  555. package/dist/surface/overlay.d.ts +41 -3
  556. package/dist/surface/overlay.js +92 -37
  557. package/dist/surface/pin.svelte.d.ts +5 -0
  558. package/dist/surface/pin.svelte.js +5 -0
  559. package/dist/surface/projector.svelte.d.ts +4 -6
  560. package/dist/surface/projector.svelte.js +42 -69
  561. package/dist/text/text.svelte.d.ts +14 -40
  562. package/dist/text/text.svelte.js +35 -51
  563. package/dist/text/wordBoundary.d.ts +19 -0
  564. package/dist/text/wordBoundary.js +29 -44
  565. package/dist/themes/notion.css +263 -106
  566. package/dist/utils/json.d.ts +3 -1
  567. package/dist/utils/json.js +52 -51
  568. package/dist/utils/listen.d.ts +8 -0
  569. package/dist/utils/listen.js +19 -0
  570. package/package.json +4 -5
  571. package/dist/block/block.utils.d.ts +0 -340
  572. package/dist/block/block.utils.js +0 -356
  573. package/dist/collaboration/history/HistoryPanel.svelte +0 -554
  574. package/dist/collaboration/history/HistoryPanel.svelte.d.ts +0 -7
  575. package/dist/collaboration/history/panel.d.ts +0 -61
  576. package/dist/collaboration/history/panel.js +0 -3
  577. package/dist/components/SuggestionRanges.svelte +0 -58
  578. package/dist/components/SuggestionRanges.svelte.d.ts +0 -7
  579. package/dist/crdt/doc/table.d.ts +0 -21
  580. package/dist/crdt/doc/table.js +0 -288
  581. package/dist/crdt/migration/generation.d.ts +0 -58
  582. package/dist/crdt/migration/generation.js +0 -70
  583. package/dist/crdt/migration/legacy-schema.d.ts +0 -61
  584. package/dist/crdt/migration/legacy-schema.js +0 -151
  585. package/dist/crdt/migration/migrate.d.ts +0 -56
  586. package/dist/crdt/migration/migrate.js +0 -227
  587. package/dist/crdt/nodes.d.ts +0 -121
  588. package/dist/crdt/nodes.js +0 -56
  589. package/dist/crdt/text/index/checks.d.ts +0 -15
  590. package/dist/crdt/text/index/checks.js +0 -156
  591. package/dist/crdt/vendor/yjs/dts/utils/EventHandler.d.ts +0 -17
  592. package/dist/crdt/vendor/yjs/dts/utils/RelativePosition.d.ts +0 -80
  593. package/dist/crdt/vendor/yjs/dts/utils/UndoManager.d.ts +0 -205
  594. package/dist/crdt/vendor/yjs/dts/utils/YEvent.d.ts +0 -93
  595. package/dist/crdt/vendor/yjs/dts/utils/meta.d.ts +0 -25
  596. package/dist/crdt/vendor/yjs/dts/utils/renderer-helpers.d.ts +0 -98
  597. package/dist/crdt/vendor/yjs/dts/utils/schemas.d.ts +0 -2
  598. package/dist/crdt/vendor/yjs/src/utils/EventHandler.js +0 -75
  599. package/dist/crdt/vendor/yjs/src/utils/RelativePosition.js +0 -301
  600. package/dist/crdt/vendor/yjs/src/utils/UndoManager.js +0 -554
  601. package/dist/crdt/vendor/yjs/src/utils/YEvent.js +0 -158
  602. package/dist/crdt/vendor/yjs/src/utils/meta.js +0 -74
  603. package/dist/crdt/vendor/yjs/src/utils/renderer-helpers.js +0 -186
  604. package/dist/crdt/vendor/yjs/src/utils/schemas.js +0 -3
  605. package/dist/edytor.utils.d.ts +0 -50
  606. package/dist/edytor.utils.js +0 -67
  607. package/dist/plugins/blockMenu/BlockMenu.svelte +0 -335
  608. package/dist/plugins/blockMenu/BlockMenu.svelte.d.ts +0 -9
  609. package/dist/plugins/find/FindBar.svelte +0 -170
  610. package/dist/plugins/find/FindBar.svelte.d.ts +0 -9
  611. package/dist/plugins/find/FindHighlights.svelte +0 -75
  612. package/dist/plugins/find/FindHighlights.svelte.d.ts +0 -9
  613. package/dist/plugins/icons.d.ts +0 -2
  614. package/dist/plugins/icons.js +0 -63
  615. package/dist/plugins/image/ImageEmpty.svelte +0 -93
  616. package/dist/plugins/image/ImageEmpty.svelte.d.ts +0 -15
  617. package/dist/plugins/image/empty.svelte.d.ts +0 -56
  618. package/dist/plugins/image/empty.svelte.js +0 -83
  619. package/dist/plugins/keepInView.d.ts +0 -4
  620. package/dist/plugins/keepInView.js +0 -6
  621. package/dist/plugins/media/UrlPasteMenu.svelte +0 -92
  622. package/dist/plugins/media/UrlPasteMenu.svelte.d.ts +0 -9
  623. package/dist/plugins/richtext/CalloutIconMenu.svelte +0 -98
  624. package/dist/plugins/richtext/CalloutIconMenu.svelte.d.ts +0 -9
  625. package/dist/plugins/richtext/labels.d.ts +0 -9
  626. package/dist/plugins/richtext/labels.js +0 -7
  627. package/dist/plugins/slashMenu/SlashMenu.svelte +0 -276
  628. package/dist/plugins/slashMenu/SlashMenu.svelte.d.ts +0 -11
  629. package/dist/plugins/table/dragPreview.d.ts +0 -29
  630. package/dist/plugins/table/dragPreview.js +0 -103
  631. package/dist/plugins/toolbar/LinkCard.svelte +0 -122
  632. package/dist/plugins/toolbar/LinkCard.svelte.d.ts +0 -9
  633. package/dist/plugins/toolbar/Toolbar.svelte +0 -349
  634. package/dist/plugins/toolbar/Toolbar.svelte.d.ts +0 -9
  635. package/dist/plugins/triggers/TriggerMenu.svelte +0 -135
  636. package/dist/plugins/triggers/TriggerMenu.svelte.d.ts +0 -7
  637. package/dist/session/props.d.ts +0 -28
  638. package/dist/session/props.js +0 -162
  639. package/dist/text/deltas.d.ts +0 -22
  640. package/dist/text/deltas.js +0 -46
  641. package/dist/text/text.utils.d.ts +0 -45
  642. package/dist/text/text.utils.js +0 -199
@@ -0,0 +1,110 @@
1
+ /**
2
+ * The controls inside the rich text kinds (a to-do's checkbox, a callout's
3
+ * icon, an empty body's hint): the package's markup by default, the app's
4
+ * snippet when `createRichTextPlugin` names one. Each snippet receives a
5
+ * payload: the state, the action (written through the document) and the
6
+ * words the markup reads, and the control's attachment (its marker, its
7
+ * ARIA, its press and click), so custom markup keeps the keys, the
8
+ * accessibility and what the editor reads of it.
9
+ */
10
+ import type { Snippet } from 'svelte';
11
+ import type { Attachment } from 'svelte/attachments';
12
+ import type { Block } from '../../block/block.svelte.js';
13
+ import type { Edytor } from '../../edytor.svelte.js';
14
+ import type { BlockView } from '../../plugins.js';
15
+ /** What a to-do's `checkbox` snippet receives. */
16
+ export type TodoCheckboxPayload = {
17
+ /** The to-do; `undefined` in a suggestion's preview (its box writes nothing). */
18
+ readonly block: Block | undefined;
19
+ /** It is checked: its `data.checked` (reactive). */
20
+ readonly checked: boolean;
21
+ /** The checkbox's accessible name (the view's `richText.checkbox`). */
22
+ readonly label: string;
23
+ /** Check or uncheck it: one data write, refused in a readonly view. */
24
+ toggle: () => void;
25
+ /**
26
+ * The control's attachment (`{@attach box.control}`), on an `input
27
+ * type="checkbox"` (give it `checked={box.checked}`) or a `button` (it
28
+ * gets `role="checkbox"` and `aria-checked`): its marker
29
+ * (`data-edytor-todo-checkbox`), `contenteditable="false"`, its
30
+ * `aria-label`, a press that keeps the editor's selection and a click
31
+ * that toggles the to-do.
32
+ */
33
+ readonly control: Attachment<HTMLElement>;
34
+ };
35
+ /** What a callout's `calloutIcon` snippet receives. */
36
+ export type CalloutIconPayload = {
37
+ /** The callout; `undefined` in a suggestion's preview. */
38
+ readonly block: Block | undefined;
39
+ /** Its icon: its `data.icon`, the view's default without one, `''` for none (reactive). */
40
+ readonly icon: string;
41
+ /**
42
+ * The icon opens the view's picker: an editable view listing a picker,
43
+ * not a suggestion's preview. Draw a `button` then, else the icon alone.
44
+ */
45
+ readonly editable: boolean;
46
+ /** The picker is open on this callout (reactive). */
47
+ readonly expanded: boolean;
48
+ /** The button's accessible name: Change icon, or Add icon over an empty slot. */
49
+ readonly label: string;
50
+ /** Open the view's picker on this callout, or close it. */
51
+ toggle: () => void;
52
+ /**
53
+ * The icon's attachment (`{@attach icon.control}`): its marker
54
+ * (`data-edytor-callout-icon`, which the picker opens under), `data-empty`
55
+ * without an icon, `contenteditable="false"`; editable, its
56
+ * `aria-label`, `aria-haspopup`, `aria-expanded`, `aria-controls`, a
57
+ * press that keeps the editor's selection and a click that toggles the
58
+ * picker; else `aria-hidden`.
59
+ */
60
+ readonly control: Attachment<HTMLElement>;
61
+ };
62
+ /** What the `emptyBody` snippet of an open toggle's or a callout's empty body receives. */
63
+ export type EmptyBodyPayload = {
64
+ /** The toggle or callout. */
65
+ readonly block: Block;
66
+ /** Which kind's body. */
67
+ readonly kind: 'toggle' | 'callout';
68
+ /** The hint (the view's `richText.emptyBody`). */
69
+ readonly label: string;
70
+ /** Start the body: a first child, the caret in it (one command, one undo step). */
71
+ open: () => void;
72
+ /**
73
+ * The hint's attachment (`{@attach hint.control}`): its marker
74
+ * (`data-edytor-empty-body`, where a dragged block drops inside),
75
+ * `contenteditable="false"`, `aria-hidden` (Enter at the end of the
76
+ * header is the keyboard's way in) and a click that starts the body.
77
+ */
78
+ readonly control: Attachment<HTMLElement>;
79
+ };
80
+ /** `createRichTextPlugin`'s control snippets. */
81
+ export type RichTextControls = {
82
+ checkbox?: Snippet<[TodoCheckboxPayload]>;
83
+ calloutIcon?: Snippet<[CalloutIconPayload]>;
84
+ emptyBody?: Snippet<[EmptyBodyPayload]>;
85
+ };
86
+ /** Each view's control snippets (the first rich text plugin listed sets them). */
87
+ export declare const richTextControls: WeakMap<object, RichTextControls>;
88
+ /** Check or uncheck a to-do: one key patched, so a peer's concurrent edit of another key is kept. */
89
+ export declare const toggleTodo: (block: Block) => import("../../index.js").OpResult;
90
+ /**
91
+ * A to-do's checkbox in `view` (a suggestion's preview included: no
92
+ * handle, no write), named in its labels.
93
+ */
94
+ export declare const todoCheckbox: (view: Edytor, block: () => BlockView<{
95
+ checked?: boolean;
96
+ }>) => TodoCheckboxPayload;
97
+ /**
98
+ * A callout's icon in `view` (`callout.icon`): its `data.icon`, the view's
99
+ * default without one, none when it is `''`; a button opening the view's
100
+ * picker where it may be picked (an editable view listing a picker, not a
101
+ * suggestion's preview), else the icon alone.
102
+ */
103
+ export declare const calloutIcon: (view: Edytor, block: () => BlockView<{
104
+ icon?: string;
105
+ }>) => CalloutIconPayload;
106
+ /**
107
+ * The hint of `block`'s empty body in `view` (`body.hint`), or `null` where
108
+ * none shows: a readonly view, a suggestion's preview (no handle).
109
+ */
110
+ export declare const emptyBody: (view: Edytor, block: BlockView, kind: "toggle" | "callout") => EmptyBodyPayload | null;
@@ -0,0 +1,126 @@
1
+ import { labelsOf, richTextEnglish } from '../../labels.js';
2
+ import { attach, keepSelection } from '../chrome.js';
3
+ import { calloutPickers, iconOf } from './callouts.js';
4
+ import { openBody } from './body.js';
5
+ /** Each view's control snippets (the first rich text plugin listed sets them). */
6
+ export const richTextControls = new WeakMap();
7
+ /** Check or uncheck a to-do: one key patched, so a peer's concurrent edit of another key is kept. */
8
+ export const toggleTodo = (block) => block.edytor.patchData(block.id, [{ path: ['checked'], value: !block.data.checked }]);
9
+ /**
10
+ * A to-do's checkbox in `view` (a suggestion's preview included: no
11
+ * handle, no write), named in its labels.
12
+ */
13
+ export const todoCheckbox = (view, block) => {
14
+ const label = labelsOf(view, 'richText', richTextEnglish).checkbox;
15
+ const checked = () => Boolean(block().data.checked);
16
+ const toggle = () => {
17
+ const handle = block().handle;
18
+ if (handle)
19
+ toggleTodo(handle);
20
+ };
21
+ return {
22
+ get block() {
23
+ return block().handle;
24
+ },
25
+ get checked() {
26
+ return checked();
27
+ },
28
+ label,
29
+ toggle,
30
+ get control() {
31
+ const on = checked();
32
+ return (node) => {
33
+ const native = node instanceof HTMLInputElement && node.type === 'checkbox';
34
+ // Another element than a native checkbox is one to assistive technology,
35
+ // unless the markup gave it its own role.
36
+ const role = native ? {} : { role: node.getAttribute('role') ?? 'checkbox' };
37
+ return attach({
38
+ contenteditable: 'false',
39
+ 'aria-label': label,
40
+ 'data-edytor-todo-checkbox': '',
41
+ ...role,
42
+ 'aria-checked': native ? undefined : on
43
+ }, {
44
+ mousedown: keepSelection,
45
+ click: () => {
46
+ // Never cancel the click: the browser reverts a canceled checkbox click
47
+ // after its handlers, over the re-render this write makes, so the box
48
+ // would show the old state here while peers show the new one. Toggle the
49
+ // document, then show what it holds (a refused write, readonly or vetoed,
50
+ // shows unchanged).
51
+ toggle();
52
+ if (native)
53
+ node.checked = checked();
54
+ }
55
+ })(node);
56
+ };
57
+ }
58
+ };
59
+ };
60
+ /**
61
+ * A callout's icon in `view` (`callout.icon`): its `data.icon`, the view's
62
+ * default without one, none when it is `''`; a button opening the view's
63
+ * picker where it may be picked (an editable view listing a picker, not a
64
+ * suggestion's preview), else the icon alone.
65
+ */
66
+ export const calloutIcon = (view, block) => {
67
+ const labels = labelsOf(view, 'richText', richTextEnglish).calloutIcon;
68
+ const picker = calloutPickers.get(view);
69
+ const editable = () => Boolean(block().handle && picker && !view.readonly);
70
+ const icon = () => iconOf(block().data, view);
71
+ const expanded = () => picker?.target === block().id;
72
+ const toggle = () => {
73
+ const handle = block().handle;
74
+ if (handle && editable())
75
+ picker?.toggle(handle);
76
+ };
77
+ const label = () => (icon() ? labels.change : labels.add);
78
+ return {
79
+ get block() {
80
+ return block().handle;
81
+ },
82
+ get icon() {
83
+ return icon();
84
+ },
85
+ get editable() {
86
+ return editable();
87
+ },
88
+ get expanded() {
89
+ return expanded();
90
+ },
91
+ get label() {
92
+ return label();
93
+ },
94
+ toggle,
95
+ get control() {
96
+ const can = editable();
97
+ return attach({
98
+ contenteditable: 'false',
99
+ 'data-edytor-callout-icon': '',
100
+ 'data-empty': !icon(),
101
+ 'aria-label': can ? label() : undefined,
102
+ 'aria-haspopup': can ? 'menu' : undefined,
103
+ 'aria-expanded': can ? expanded() : undefined,
104
+ 'aria-controls': can && expanded() ? picker?.listId : undefined,
105
+ 'aria-hidden': can ? undefined : 'true'
106
+ }, can ? { mousedown: keepSelection, click: toggle } : {});
107
+ }
108
+ };
109
+ };
110
+ /**
111
+ * The hint of `block`'s empty body in `view` (`body.hint`), or `null` where
112
+ * none shows: a readonly view, a suggestion's preview (no handle).
113
+ */
114
+ export const emptyBody = (view, block, kind) => {
115
+ const handle = block.handle;
116
+ if (!handle || view.readonly)
117
+ return null;
118
+ const open = () => void openBody(handle);
119
+ return {
120
+ block: handle,
121
+ kind,
122
+ label: labelsOf(view, 'richText', richTextEnglish).emptyBody[kind],
123
+ open,
124
+ control: attach({ contenteditable: 'false', 'data-edytor-empty-body': kind, 'aria-hidden': 'true' }, { click: open })
125
+ };
126
+ };
@@ -1,6 +1,5 @@
1
1
  import { isRecord } from '../../utils/json.js';
2
- import { dispatchPlan } from '../../block/block.utils.js';
3
- import { holdsNothing, lineage, placing } from '../../kinds.js';
2
+ import { holdsNothing, placing } from '../../kinds.js';
4
3
  import { id } from '../../utils.js';
5
4
  import { marksForInsertion } from '../../session/editing/text.js';
6
5
  import { selectedTextSpans, viewOf } from '../../selection/visibility.js';
@@ -121,20 +120,25 @@ export const openLink = (href, view = globalThis.window ?? null) => {
121
120
  if (safe)
122
121
  view?.open(safe, '_blank', 'noopener,noreferrer');
123
122
  };
123
+ /** Set `mark` to `value` (`null`: remove it) over `start`–`end` of `text`: the view's `formatRange`. */
124
+ const markText = (edytor, text, start, end, mark, value) => edytor.formatRange(text.parent.id, text.segStart + start, end - start, {
125
+ [mark]: value === undefined ? true : value
126
+ });
124
127
  const formatSelectedTextRange = (edytor, mark, value, toggle) => {
125
- const { yStart, yEnd, startText, endText, isCollapsed, isReversed } = edytor.selection.state;
128
+ const { yStart, yEnd, startText, endText } = edytor.selection.textRange();
129
+ const { isCollapsed, isReversed } = edytor.selection.projection;
126
130
  if (isCollapsed || !startText || !endText)
127
131
  return;
128
132
  const spans = selectedTextSpans(edytor).filter(({ start, end }) => end > start);
129
133
  // One decision for the whole range (Notion): a toggle removes the mark only
130
134
  // when every selected character has it, else it marks all of them.
131
135
  const on = spans.every(({ text, start, end }) => text.getMarksAtRange(start, end).every(({ marks }) => marks && mark in marks));
132
- const next = toggle && on ? null : value;
136
+ const next = toggle && on ? null : value === undefined ? true : value;
133
137
  // One command per span: a vetoed one keeps its marks (`dispatcher.each`).
134
- edytor.dispatcher.each('format', spans, ({ text, start, end }) => text.markText({ mark, value: next, start, end }));
138
+ edytor.dispatcher.each('format', spans, ({ text, start, end }) => edytor.formatRange(text.parent.id, text.segStart + start, end - start, { [mark]: next }));
135
139
  // Selected blocks stay selected (Notion; a divider's phantom text is no range).
136
140
  if (!selectsBlocks(edytor))
137
- edytor.selection.setAtRange(startText, yStart, endText, yEnd, { isReversed });
141
+ edytor.selection.selectText(startText, yStart, endText, yEnd, isReversed);
138
142
  };
139
143
  /**
140
144
  * A block selection: formatting keeps it, and it has no caret to stage a
@@ -154,11 +158,13 @@ export const richTextOperations = (edytor) => ({
154
158
  * whole.
155
159
  */
156
160
  insertDividerAtSelection: () => {
157
- const { startBlock: block, startText, yStart, isCollapsed } = edytor.selection.state;
158
- if (!block?.convertible || !block.parent || !block.model || !isCollapsed)
161
+ const { startText, yStart } = edytor.selection.textRange();
162
+ const { isCollapsed } = edytor.selection.projection;
163
+ const block = startText?.parent;
164
+ if (!block?.convertible || !block.parent || !isCollapsed)
159
165
  return null;
160
166
  const { facade, dispatcher } = edytor;
161
- const [self, parent] = [block.model.id, block.parent.isRoot ? null : block.parent.id];
167
+ const [self, parent] = [block.id, block.parent.isRoot ? null : block.parent.id];
162
168
  const divider = { id: id('b'), type: 'divider', data: {}, content: [], children: [] };
163
169
  const paragraph = { id: id('b'), type: edytor.defaultChild(block.parent) };
164
170
  const slot = (after, specs) => facade.prepare.insertBlocks({ parent, index: block.index + after }, specs);
@@ -185,24 +191,25 @@ export const richTextOperations = (edytor) => ({
185
191
  caret = next?.id ?? paragraph.id;
186
192
  prepare = () => slot(1, next ? [divider] : [divider, paragraph]);
187
193
  }
188
- if (!dispatchPlan(block, 'insertDivider', {}, prepare, lineage(block)))
194
+ if (dispatcher.plan('insertDivider', {}, prepare, block).status !== 'applied')
189
195
  return null;
190
196
  const text = caret ? edytor.idToBlock.get(caret)?.firstText : startText;
191
197
  dispatcher.caret(text, caret ? 0 : yStart);
192
198
  return block;
193
199
  },
194
200
  removeAllMarksAtRange: () => {
195
- const { yStart, startText, isCollapsed } = edytor.selection.state;
201
+ const { yStart, startText } = edytor.selection.textRange();
202
+ const { isCollapsed } = edytor.selection.projection;
196
203
  if (isCollapsed) {
197
204
  if (startText && !selectsBlocks(edytor)) {
198
205
  edytor.selection.stage({});
199
- edytor.selection.setAtTextOffset(startText, yStart);
206
+ edytor.selection.selectText(startText, yStart);
200
207
  }
201
208
  return;
202
209
  }
203
210
  edytor.dispatcher.each('format', selectedTextSpans(edytor), ({ text, start, end }) => {
204
211
  if (end > start)
205
- text.removeMarksFromText({ start, end });
212
+ edytor.clearMarks(text.parent.id, text.segStart + start, end - start);
206
213
  });
207
214
  },
208
215
  setLinkAtRange: (link) => {
@@ -225,15 +232,15 @@ export const richTextOperations = (edytor) => ({
225
232
  const safe = sanitizeLinkHref(href);
226
233
  if (safe === null || end <= start)
227
234
  return;
228
- edytor.dispatcher.run('autolink', () => text.markText({ mark: 'link', value: { href: safe }, start, end }));
235
+ edytor.dispatcher.run('autolink', () => markText(edytor, text, start, end, 'link', { href: safe }));
229
236
  },
230
237
  /** Unlink `start`–`end` of `text` (the link card's Remove), one undo step; the selection stays. */
231
238
  unlinkText: (text, start, end) => {
232
- edytor.dispatcher.run('format', () => text.markText({ mark: 'link', value: null, start, end }));
239
+ edytor.dispatcher.run('format', () => markText(edytor, text, start, end, 'link', null));
233
240
  },
234
241
  /** Remove one mark (a color, a highlight…) from the selected range. */
235
242
  removeMarkAtRange: (mark) => {
236
- if (!edytor.selection.state.isCollapsed)
243
+ if (!edytor.selection.projection.isCollapsed)
237
244
  formatSelectedTextRange(edytor, mark, null, false);
238
245
  },
239
246
  /**
@@ -249,7 +256,8 @@ export const richTextOperations = (edytor) => ({
249
256
  const safeValue = mark === 'color' || mark === 'highlight' ? sanitizeCssColorValue(value) : value;
250
257
  if (safeValue === null)
251
258
  return;
252
- const { isCollapsed, startText, yStart } = edytor.selection.state;
259
+ const { startText, yStart } = edytor.selection.textRange();
260
+ const { isCollapsed } = edytor.selection.projection;
253
261
  if (isCollapsed) {
254
262
  if (startText && !selectsBlocks(edytor)) {
255
263
  // Stage the full set the next insertion carries, values kept.
@@ -257,7 +265,7 @@ export const richTextOperations = (edytor) => ({
257
265
  ...marksForInsertion(startText, yStart, { pending: edytor.selection.pending }),
258
266
  [mark]: safeValue
259
267
  }));
260
- edytor.selection.setAtTextOffset(startText, yStart);
268
+ edytor.selection.selectText(startText, yStart);
261
269
  }
262
270
  return;
263
271
  }
@@ -269,17 +277,18 @@ export const richTextOperations = (edytor) => ({
269
277
  * stage it for the next character typed.
270
278
  */
271
279
  setMarkAtRange: (mark, value) => {
272
- const { yStart, yEnd, startText, endText, isCollapsed } = edytor.selection.state;
273
- if (isCollapsed) {
280
+ const { yStart, yEnd, startText, endText } = edytor.selection.textRange();
281
+ const { selection } = edytor;
282
+ if (selection.projection.isCollapsed) {
274
283
  if (startText && !selectsBlocks(edytor)) {
275
- edytor.dispatcher.run('format', () => startText.markText({
276
- mark,
277
- value,
278
- toggle: true,
279
- start: yStart,
280
- end: yEnd
281
- }));
282
- edytor.selection.setAtRange(startText, yStart, endText, yEnd);
284
+ // A caret stages the full set the next insertion carries (values kept).
285
+ edytor.dispatcher.run('format', () => {
286
+ const { [mark]: current = null, ...rest } = marksForInsertion(startText, yStart, {
287
+ pending: selection.pending
288
+ });
289
+ selection.stage(current !== null ? rest : { ...rest, [mark]: value === undefined ? true : value });
290
+ });
291
+ selection.selectText(startText, yStart, endText, yEnd);
283
292
  }
284
293
  return;
285
294
  }
@@ -2,19 +2,15 @@ import type { Attachment } from 'svelte/attachments';
2
2
  import type { Block } from '../../block/block.svelte.js';
3
3
  import type { Edytor } from '../../edytor.svelte.js';
4
4
  import type { EditorCommand } from '../../plugins.js';
5
- import { type SlashMenuLabels } from '../../labels.js';
6
5
  import type { BlockAddition } from '../blockHandles/BlockHandleController.svelte.js';
7
6
  import { TextTriggerController } from '../triggers/TriggerController.svelte.js';
8
7
  import type { Popup } from '../../surface/popups.svelte.js';
9
- export type { TextInsertionPayload } from '../triggers/TriggerController.svelte.js';
10
8
  /**
11
9
  * The slash menu: the `/` trigger (`TextTriggerController`: the range, the
12
10
  * query, the keys, the pick), whose rows are the editor's commands, and the
13
11
  * menu a handle's `+` opens with a search field of its own (`addition`).
14
12
  */
15
13
  export declare class SlashMenuController extends TextTriggerController {
16
- /** The words the menu shows (the plugin's `labels`): read them in a custom `menu` or `item`. */
17
- readonly labels: SlashMenuLabels;
18
14
  /**
19
15
  * Opened by a handle's `+` (`BLOCK_ADD_EVENT`): no `/` in the text, the
20
16
  * query is the menu's own field, and a picked row adds the block first.
@@ -22,20 +18,12 @@ export declare class SlashMenuController extends TextTriggerController {
22
18
  addition: BlockAddition | null;
23
19
  /** The selection when a `+` opened the menu, given back when it closes unpicked. */
24
20
  private held;
25
- /** A group's heading: its key in the labels' `groups`, else the key itself. */
26
- groupName: (group: string) => string;
27
- constructor(edytor: Edytor,
28
- /** The words the menu shows (the plugin's `labels`): read them in a custom `menu` or `item`. */
29
- labels?: SlashMenuLabels);
30
- /** A row's element id (page-unique), for `aria-activedescendant`: set it on a custom `item`. */
31
- optionId: (command: EditorCommand) => string;
32
- protected get listName(): string;
33
- protected rowIdAt(index: number): string;
21
+ constructor(edytor: Edytor);
34
22
  /** A `+`'s menu names its highlighted row from its own field, and tells the `+` it opened it. */
35
23
  protected popupOf(active: string | undefined): Popup;
36
24
  /**
37
25
  * The element that holds a `+` menu's keyboard (`{@attach controller.keys}`:
38
- * its field, or the element a custom `menu` is wrapped in). Focused when
26
+ * its field, or the menu element itself). Focused when
39
27
  * it mounts, it takes the menu's keys (↑/↓ walk the rows, Enter runs the
40
28
  * highlighted one, Escape closes the menu and gives the selection back);
41
29
  * on an element that is not a field, typing and Backspace edit the query.
@@ -1,9 +1,11 @@
1
1
  import { untrack } from 'svelte';
2
- import { project } from '../../session/selection.js';
2
+ import { noSelection, project } from '../../session/selection.js';
3
3
  import { BASIC_BLOCKS, matchesQuery } from '../../kinds.js';
4
- import { englishLabels } from '../../labels.js';
5
4
  import { TextTriggerController } from '../triggers/TriggerController.svelte.js';
6
- import { attribute, inPage, isField, keepFocus, namesRows } from '../chrome.js';
5
+ import { attribute, isField, keepFocus } from '../chrome.js';
6
+ import { holdKeys } from '../list.svelte.js';
7
+ import { all, listen } from '../../utils/listen.js';
8
+ import { takeKeys } from '../../events/onFocus.js';
7
9
  /**
8
10
  * The view a `+`'s menu asks `isEnabled` of: the editor, its selection a
9
11
  * caret at the start of the block the `+` adds, below `block` (a stand-in
@@ -40,24 +42,15 @@ const additionView = (edytor, { block }) => {
40
42
  }
41
43
  });
42
44
  const added = reused ? block : through(block, stand);
43
- const text = added.firstText ?? null;
44
- const state = {
45
- yStart: 0,
46
- yEnd: 0,
47
- isCollapsed: true,
48
- isReversed: false,
49
- isBlockSpanning: false,
50
- isVoidEditableElement: false,
51
- startText: text,
52
- endText: text,
53
- startBlock: added,
54
- endBlock: added,
55
- texts: text ? [text] : [],
56
- blocks: [added]
57
- };
45
+ // A caret at the added block's start (a stand-in text when it is not made yet).
46
+ const text = added.firstText ?? { parent: added };
47
+ const range = { startText: text, endText: text, yStart: 0, yEnd: 0, texts: [text] };
58
48
  const selection = through(edytor.selection, {
59
- state,
60
- value: { kind: 'none' },
49
+ textRange: () => range,
50
+ caret: { block: added, offset: 0 },
51
+ voidField: false,
52
+ value: noSelection,
53
+ projection: project(noSelection, edytor.facade),
61
54
  selectedBlocks: new Set(),
62
55
  selectedInlineBlock: new Set()
63
56
  });
@@ -69,7 +62,6 @@ const additionView = (edytor, { block }) => {
69
62
  * menu a handle's `+` opens with a search field of its own (`addition`).
70
63
  */
71
64
  export class SlashMenuController extends TextTriggerController {
72
- labels;
73
65
  /**
74
66
  * Opened by a handle's `+` (`BLOCK_ADD_EVENT`): no `/` in the text, the
75
67
  * query is the menu's own field, and a picked row adds the block first.
@@ -77,22 +69,8 @@ export class SlashMenuController extends TextTriggerController {
77
69
  addition = $state(null);
78
70
  /** The selection when a `+` opened the menu, given back when it closes unpicked. */
79
71
  held = { kind: 'none' };
80
- /** A group's heading: its key in the labels' `groups`, else the key itself. */
81
- groupName = (group) => this.labels.groups[group] ?? group;
82
- constructor(edytor,
83
- /** The words the menu shows (the plugin's `labels`): read them in a custom `menu` or `item`. */
84
- labels = englishLabels.slashMenu) {
72
+ constructor(edytor) {
85
73
  super(edytor, '/', 'slash-menu');
86
- this.labels = labels;
87
- }
88
- /** A row's element id (page-unique), for `aria-activedescendant`: set it on a custom `item`. */
89
- optionId = (command) => this.edytor.popups.idOf(`slash-menu-${command.id}`);
90
- get listName() {
91
- return this.labels.list;
92
- }
93
- rowIdAt(index) {
94
- const command = this.commands[index];
95
- return command && this.optionId(command);
96
74
  }
97
75
  /** A `+`'s menu names its highlighted row from its own field, and tells the `+` it opened it. */
98
76
  popupOf(active) {
@@ -107,7 +85,7 @@ export class SlashMenuController extends TextTriggerController {
107
85
  }
108
86
  /**
109
87
  * The element that holds a `+` menu's keyboard (`{@attach controller.keys}`:
110
- * its field, or the element a custom `menu` is wrapped in). Focused when
88
+ * its field, or the menu element itself). Focused when
111
89
  * it mounts, it takes the menu's keys (↑/↓ walk the rows, Enter runs the
112
90
  * highlighted one, Escape closes the menu and gives the selection back);
113
91
  * on an element that is not a field, typing and Backspace edit the query.
@@ -122,22 +100,19 @@ export class SlashMenuController extends TextTriggerController {
122
100
  return;
123
101
  const menu = node.closest('[data-edytor-slash-menu-host]') ?? node;
124
102
  const field = isField(node);
125
- untrack(() => {
126
- if (!node.contains(node.ownerDocument.activeElement))
127
- node.focus({ preventScroll: true });
128
- });
129
103
  const keydown = (event) => {
130
104
  // A key that ends an IME composition (Enter commits it, Escape cancels it) is the IME's.
131
105
  if (event.defaultPrevented || event.isComposing || event.keyCode === 229)
132
106
  return;
133
107
  const { key, ctrlKey, metaKey } = event;
134
108
  const move = { ArrowDown: 1, ArrowUp: -1 }[key];
135
- if (!field && event.target === node && key === 'Backspace')
109
+ const typed = !field && event.target === node;
110
+ if (typed && key === 'Backspace')
136
111
  this.search(this.query.slice(0, -1));
137
- else if (!field && event.target === node && key.length === 1 && !ctrlKey && !metaKey)
112
+ else if (typed && key.length === 1 && !ctrlKey && !metaKey)
138
113
  this.search(this.query + key);
139
114
  else if (move)
140
- this.moveSelection(move);
115
+ this.move(move);
141
116
  else if (key === 'Enter')
142
117
  void this.runSelected();
143
118
  else if (key === 'Escape')
@@ -150,9 +125,9 @@ export class SlashMenuController extends TextTriggerController {
150
125
  const target = event.target;
151
126
  if (!field || target === node)
152
127
  return;
153
- const index = this.commands.findIndex((command) => target.closest?.(`[id="${this.optionId(command)}"]`) !== null);
128
+ const index = this.commands.findIndex((_, index) => target.closest?.(`[id="${this.rowId(index)}"]`) !== null);
154
129
  if (index !== -1)
155
- this.selectedIndex = index;
130
+ this.index = index;
156
131
  node.focus({ preventScroll: true });
157
132
  };
158
133
  const focusout = (event) => {
@@ -160,28 +135,17 @@ export class SlashMenuController extends TextTriggerController {
160
135
  if (this.addition && to instanceof Node && !menu.contains(to))
161
136
  this.dismiss(false);
162
137
  };
163
- // A field takes the keys of the whole menu (a row a screen reader focused); a wrapper, its own.
164
- const keyed = field ? menu : node;
165
- keyed.addEventListener('keydown', keydown);
166
- menu.addEventListener('focusin', focusin);
167
- menu.addEventListener('focusout', focusout);
168
- menu.addEventListener('mousedown', keepFocus);
169
- $effect(() => {
170
- if (!field)
171
- return;
138
+ const off2 = listen(menu, 'focusin', focusin);
139
+ const off3 = listen(menu, 'focusout', focusout);
140
+ const off4 = listen(menu, 'mousedown', keepFocus);
141
+ if (field)
172
142
  attribute(node, 'aria-controls', this.listId);
173
- if (namesRows(node))
174
- attribute(node, 'aria-activedescendant', inPage(node, this.rowIdAt(this.selectedIndex)));
175
- });
176
- return () => {
177
- keyed.removeEventListener('keydown', keydown);
178
- menu.removeEventListener('focusin', focusin);
179
- menu.removeEventListener('focusout', focusout);
180
- menu.removeEventListener('mousedown', keepFocus);
181
- };
143
+ // A field takes the keys of the whole menu (a row a screen reader focused); a wrapper, its own.
144
+ const off = holdKeys(node, keydown, () => (field && this.count ? this.rowId(this.index) : undefined), field ? menu : node);
145
+ return all(off, off2, off3, off4);
182
146
  };
183
147
  get count() {
184
- return this.commands.length;
148
+ return this.isOpen ? this.commands.length : 0;
185
149
  }
186
150
  /** A `/` opens the menu in a block a kind can replace (`convertible`). */
187
151
  admits(block) {
@@ -197,7 +161,7 @@ export class SlashMenuController extends TextTriggerController {
197
161
  if (query && (commandCount === 0 || /^\s/.test(query) || !/[^-\s]/.test(query)))
198
162
  this.close();
199
163
  else
200
- this.selectedIndex = Math.max(0, Math.min(this.selectedIndex, commandCount - 1));
164
+ this.index = Math.max(0, Math.min(this.index, commandCount - 1));
201
165
  }
202
166
  /** Matching commands, grouped (groups in first-seen order): the menu's rows and keyboard order. */
203
167
  get commands() {
@@ -236,7 +200,7 @@ export class SlashMenuController extends TextTriggerController {
236
200
  }
237
201
  /** The `+`'s menu typed in its own field (a query that matches nothing shows "No results"). */
238
202
  search(query) {
239
- [this.query, this.selectedIndex] = [query, 0];
203
+ [this.query, this.index] = [query, 0];
240
204
  }
241
205
  /**
242
206
  * Close without picking. A `+`'s menu gives the selection back as it was
@@ -253,11 +217,10 @@ export class SlashMenuController extends TextTriggerController {
253
217
  this.edytor.selection.select(held);
254
218
  if (!focus || this.edytor.readonly)
255
219
  return;
256
- this.edytor.expectInternalFocus();
257
- this.edytor.node?.focus({ preventScroll: true });
220
+ takeKeys(this.edytor);
258
221
  }
259
222
  runSelected() {
260
- return this.run(this.commands[this.selectedIndex]);
223
+ return this.run(this.commands[this.index]);
261
224
  }
262
225
  async run(command) {
263
226
  const { addition } = this;
@@ -277,7 +240,7 @@ export class SlashMenuController extends TextTriggerController {
277
240
  // nothing synchronously runs after it. The caret goes back to where the
278
241
  // `/` was while it is still in its text: commands that replace the
279
242
  // block (Code, a divider) keep their own.
280
- const ran = await this.replaceTrigger(() => this.edytor.runCommand(command.id), (text) => this.edytor.selection.state.startText === text);
243
+ const ran = await this.replaceTrigger(() => this.edytor.runCommand(command.id), (text) => this.edytor.selection.textRange().startText === text);
281
244
  return ran ?? false;
282
245
  }
283
246
  }