@dxos/ui-editor 0.10.0 → 0.11.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 (551) hide show
  1. package/dist/lib/chunk-diff.mjs +935 -0
  2. package/dist/lib/chunk-diff.mjs.map +1 -0
  3. package/dist/lib/headless.mjs +2 -0
  4. package/dist/lib/index.mjs +9937 -0
  5. package/dist/lib/index.mjs.map +1 -0
  6. package/dist/lib/types.mjs +18 -0
  7. package/dist/lib/types.mjs.map +1 -0
  8. package/dist/types/src/extensions/{bookmarks.d.ts → behavior/bookmarks.d.ts} +3 -0
  9. package/dist/types/src/extensions/behavior/bookmarks.d.ts.map +1 -0
  10. package/dist/types/src/extensions/behavior/dnd.d.ts.map +1 -0
  11. package/dist/types/src/extensions/behavior/index.d.ts +6 -0
  12. package/dist/types/src/extensions/behavior/index.d.ts.map +1 -0
  13. package/dist/types/src/extensions/{listener.d.ts → behavior/listener.d.ts} +3 -0
  14. package/dist/types/src/extensions/behavior/listener.d.ts.map +1 -0
  15. package/dist/types/src/extensions/{spacing.d.ts → behavior/spacing.d.ts} +3 -0
  16. package/dist/types/src/extensions/behavior/spacing.d.ts.map +1 -0
  17. package/dist/types/src/extensions/behavior/submit.d.ts.map +1 -0
  18. package/dist/types/src/extensions/collab/automerge/automerge.d.ts.map +1 -0
  19. package/dist/types/src/extensions/collab/automerge/automerge.test.d.ts.map +1 -0
  20. package/dist/types/src/extensions/{automerge → collab/automerge}/cursor.d.ts +1 -1
  21. package/dist/types/src/extensions/collab/automerge/cursor.d.ts.map +1 -0
  22. package/dist/types/src/extensions/{automerge → collab/automerge}/defs.d.ts +3 -1
  23. package/dist/types/src/extensions/collab/automerge/defs.d.ts.map +1 -0
  24. package/dist/types/src/extensions/collab/automerge/index.d.ts +3 -0
  25. package/dist/types/src/extensions/collab/automerge/index.d.ts.map +1 -0
  26. package/dist/types/src/extensions/collab/automerge/sync.d.ts.map +1 -0
  27. package/dist/types/src/extensions/{automerge → collab/automerge}/update-automerge.d.ts +4 -0
  28. package/dist/types/src/extensions/collab/automerge/update-automerge.d.ts.map +1 -0
  29. package/dist/types/src/extensions/{automerge → collab/automerge}/update-codemirror.d.ts +4 -0
  30. package/dist/types/src/extensions/collab/automerge/update-codemirror.d.ts.map +1 -0
  31. package/dist/types/src/extensions/collab/awareness/awareness-provider.d.ts.map +1 -0
  32. package/dist/types/src/extensions/{awareness → collab/awareness}/awareness.d.ts +4 -1
  33. package/dist/types/src/extensions/collab/awareness/awareness.d.ts.map +1 -0
  34. package/dist/types/src/extensions/collab/awareness/index.d.ts.map +1 -0
  35. package/dist/types/src/extensions/collab/index.d.ts +3 -0
  36. package/dist/types/src/extensions/collab/index.d.ts.map +1 -0
  37. package/dist/types/src/extensions/completion/autocomplete.d.ts.map +1 -0
  38. package/dist/types/src/extensions/{autocomplete → completion}/index.d.ts +1 -0
  39. package/dist/types/src/extensions/completion/index.d.ts.map +1 -0
  40. package/dist/types/src/extensions/{autocomplete → completion}/match.d.ts +2 -2
  41. package/dist/types/src/extensions/completion/match.d.ts.map +1 -0
  42. package/dist/types/src/extensions/{mention.d.ts → completion/mention.d.ts} +3 -0
  43. package/dist/types/src/extensions/completion/mention.d.ts.map +1 -0
  44. package/dist/types/src/extensions/completion/placeholder.d.ts.map +1 -0
  45. package/dist/types/src/extensions/{autocomplete → completion}/typeahead.d.ts +2 -2
  46. package/dist/types/src/extensions/completion/typeahead.d.ts.map +1 -0
  47. package/dist/types/src/extensions/{factories.d.ts → core/factories.d.ts} +23 -2
  48. package/dist/types/src/extensions/core/factories.d.ts.map +1 -0
  49. package/dist/types/src/extensions/core/factories.test.d.ts.map +1 -0
  50. package/dist/types/src/extensions/core/index.d.ts +3 -0
  51. package/dist/types/src/extensions/core/index.d.ts.map +1 -0
  52. package/dist/types/src/extensions/{modes.d.ts → core/modes.d.ts} +3 -0
  53. package/dist/types/src/extensions/core/modes.d.ts.map +1 -0
  54. package/dist/types/src/extensions/{debug.d.ts → debug/debug.d.ts} +3 -0
  55. package/dist/types/src/extensions/debug/debug.d.ts.map +1 -0
  56. package/dist/types/src/extensions/debug/index.d.ts +2 -0
  57. package/dist/types/src/extensions/debug/index.d.ts.map +1 -0
  58. package/dist/types/src/extensions/{annotations.d.ts → decoration/annotations.d.ts} +1 -1
  59. package/dist/types/src/extensions/decoration/annotations.d.ts.map +1 -0
  60. package/dist/types/src/extensions/decoration/assistant.d.ts +27 -0
  61. package/dist/types/src/extensions/decoration/assistant.d.ts.map +1 -0
  62. package/dist/types/src/extensions/decoration/fader.d.ts.map +1 -0
  63. package/dist/types/src/extensions/decoration/hashtag.d.ts +6 -0
  64. package/dist/types/src/extensions/decoration/hashtag.d.ts.map +1 -0
  65. package/dist/types/src/extensions/decoration/index.d.ts +8 -0
  66. package/dist/types/src/extensions/decoration/index.d.ts.map +1 -0
  67. package/dist/types/src/extensions/decoration/marker.d.ts.map +1 -0
  68. package/dist/types/src/extensions/{pos.d.ts → decoration/pos.d.ts} +40 -14
  69. package/dist/types/src/extensions/decoration/pos.d.ts.map +1 -0
  70. package/dist/types/src/extensions/decoration/pos.test.d.ts.map +1 -0
  71. package/dist/types/src/extensions/{replacer.d.ts → decoration/replacer.d.ts} +8 -8
  72. package/dist/types/src/extensions/decoration/replacer.d.ts.map +1 -0
  73. package/dist/types/src/extensions/decoration/replacer.test.d.ts.map +1 -0
  74. package/dist/types/src/extensions/{blast.d.ts → demo/blast.d.ts} +3 -0
  75. package/dist/types/src/extensions/demo/blast.d.ts.map +1 -0
  76. package/dist/types/src/extensions/demo/index.d.ts +3 -0
  77. package/dist/types/src/extensions/demo/index.d.ts.map +1 -0
  78. package/dist/types/src/extensions/demo/snippets.d.ts.map +1 -0
  79. package/dist/types/src/extensions/index.d.ts +10 -33
  80. package/dist/types/src/extensions/index.d.ts.map +1 -1
  81. package/dist/types/src/extensions/language/index.d.ts +5 -0
  82. package/dist/types/src/extensions/language/index.d.ts.map +1 -0
  83. package/dist/types/src/extensions/language/json/index.d.ts +2 -0
  84. package/dist/types/src/extensions/language/json/index.d.ts.map +1 -0
  85. package/dist/types/src/extensions/language/json/json.d.ts +12 -0
  86. package/dist/types/src/extensions/language/json/json.d.ts.map +1 -0
  87. package/dist/types/src/extensions/language/markdown/action.d.ts.map +1 -0
  88. package/dist/types/src/extensions/language/markdown/bundle.d.ts.map +1 -0
  89. package/dist/types/src/extensions/{markdown → language/markdown}/changes.d.ts +1 -1
  90. package/dist/types/src/extensions/language/markdown/changes.d.ts.map +1 -0
  91. package/dist/types/src/extensions/language/markdown/changes.test.d.ts.map +1 -0
  92. package/dist/types/src/extensions/{markdown → language/markdown}/debug.d.ts +3 -0
  93. package/dist/types/src/extensions/language/markdown/debug.d.ts.map +1 -0
  94. package/dist/types/src/extensions/{markdown → language/markdown}/decorate.d.ts +5 -1
  95. package/dist/types/src/extensions/language/markdown/decorate.d.ts.map +1 -0
  96. package/dist/types/src/extensions/{markdown → language/markdown}/formatting.d.ts +11 -2
  97. package/dist/types/src/extensions/language/markdown/formatting.d.ts.map +1 -0
  98. package/dist/types/src/extensions/language/markdown/formatting.test.d.ts.map +1 -0
  99. package/dist/types/src/extensions/{markdown → language/markdown}/highlight.d.ts +16 -12
  100. package/dist/types/src/extensions/language/markdown/highlight.d.ts.map +1 -0
  101. package/dist/types/src/extensions/language/markdown/image.d.ts.map +1 -0
  102. package/dist/types/src/extensions/language/markdown/image.test.d.ts.map +1 -0
  103. package/dist/types/src/extensions/language/markdown/index.d.ts.map +1 -0
  104. package/dist/types/src/extensions/language/markdown/link.d.ts +25 -0
  105. package/dist/types/src/extensions/language/markdown/link.d.ts.map +1 -0
  106. package/dist/types/src/extensions/language/markdown/link.test.d.ts +2 -0
  107. package/dist/types/src/extensions/language/markdown/link.test.d.ts.map +1 -0
  108. package/dist/types/src/extensions/language/markdown/parser.test.d.ts.map +1 -0
  109. package/dist/types/src/extensions/{markdown → language/markdown}/styles.d.ts +3 -0
  110. package/dist/types/src/extensions/language/markdown/styles.d.ts.map +1 -0
  111. package/dist/types/src/extensions/language/markdown/table.d.ts.map +1 -0
  112. package/dist/types/src/extensions/language/mermaid/index.d.ts +2 -0
  113. package/dist/types/src/extensions/language/mermaid/index.d.ts.map +1 -0
  114. package/dist/types/src/extensions/language/mermaid/mermaid.d.ts +18 -0
  115. package/dist/types/src/extensions/language/mermaid/mermaid.d.ts.map +1 -0
  116. package/dist/types/src/extensions/language/xml/extended-markdown.d.ts.map +1 -0
  117. package/dist/types/src/extensions/language/xml/extended-markdown.test.d.ts.map +1 -0
  118. package/dist/types/src/extensions/language/xml/index.d.ts.map +1 -0
  119. package/dist/types/src/extensions/language/xml/stub.d.ts +76 -0
  120. package/dist/types/src/extensions/language/xml/stub.d.ts.map +1 -0
  121. package/dist/types/src/extensions/language/xml/widgets/anchor.d.ts.map +1 -0
  122. package/dist/types/src/extensions/language/xml/widgets/index.d.ts.map +1 -0
  123. package/dist/types/src/extensions/language/xml/xml-block-decoration.d.ts +48 -0
  124. package/dist/types/src/extensions/language/xml/xml-block-decoration.d.ts.map +1 -0
  125. package/dist/types/src/extensions/language/xml/xml-formatting.d.ts.map +1 -0
  126. package/dist/types/src/extensions/{tags → language/xml}/xml-tags.d.ts +12 -1
  127. package/dist/types/src/extensions/language/xml/xml-tags.d.ts.map +1 -0
  128. package/dist/types/src/extensions/language/xml/xml-tags.test.d.ts +2 -0
  129. package/dist/types/src/extensions/language/xml/xml-tags.test.d.ts.map +1 -0
  130. package/dist/types/src/extensions/language/xml/xml-util.d.ts.map +1 -0
  131. package/dist/types/src/extensions/language/xml/xml-util.test.d.ts.map +1 -0
  132. package/dist/types/src/extensions/review/change-bar.d.ts +29 -0
  133. package/dist/types/src/extensions/review/change-bar.d.ts.map +1 -0
  134. package/dist/types/src/extensions/{comments.d.ts → review/comments.d.ts} +56 -38
  135. package/dist/types/src/extensions/review/comments.d.ts.map +1 -0
  136. package/dist/types/src/extensions/review/comments.test.d.ts +2 -0
  137. package/dist/types/src/extensions/review/comments.test.d.ts.map +1 -0
  138. package/dist/types/src/extensions/review/diff.d.ts +131 -0
  139. package/dist/types/src/extensions/review/diff.d.ts.map +1 -0
  140. package/dist/types/src/extensions/review/diff.test.d.ts +2 -0
  141. package/dist/types/src/extensions/review/diff.test.d.ts.map +1 -0
  142. package/dist/types/src/extensions/review/index.d.ts +7 -0
  143. package/dist/types/src/extensions/review/index.d.ts.map +1 -0
  144. package/dist/types/src/extensions/review/suggest.d.ts +89 -0
  145. package/dist/types/src/extensions/review/suggest.d.ts.map +1 -0
  146. package/dist/types/src/extensions/review/suggest.test.d.ts +2 -0
  147. package/dist/types/src/extensions/review/suggest.test.d.ts.map +1 -0
  148. package/dist/types/src/extensions/review/suggestions-overlay.d.ts +25 -0
  149. package/dist/types/src/extensions/review/suggestions-overlay.d.ts.map +1 -0
  150. package/dist/types/src/extensions/review/suggestions-overlay.test.d.ts +2 -0
  151. package/dist/types/src/extensions/review/suggestions-overlay.test.d.ts.map +1 -0
  152. package/dist/types/src/extensions/review/track-changes.d.ts +27 -0
  153. package/dist/types/src/extensions/review/track-changes.d.ts.map +1 -0
  154. package/dist/types/src/extensions/review/track-changes.test.d.ts +2 -0
  155. package/dist/types/src/extensions/review/track-changes.test.d.ts.map +1 -0
  156. package/dist/types/src/extensions/{busy.d.ts → state/busy.d.ts} +1 -0
  157. package/dist/types/src/extensions/state/busy.d.ts.map +1 -0
  158. package/dist/types/src/extensions/{focus.d.ts → state/focus.d.ts} +4 -0
  159. package/dist/types/src/extensions/state/focus.d.ts.map +1 -0
  160. package/dist/types/src/extensions/state/index.d.ts +5 -0
  161. package/dist/types/src/extensions/state/index.d.ts.map +1 -0
  162. package/dist/types/src/extensions/state/modal.d.ts.map +1 -0
  163. package/dist/types/src/extensions/{selection.d.ts → state/selection.d.ts} +1 -1
  164. package/dist/types/src/extensions/state/selection.d.ts.map +1 -0
  165. package/dist/types/src/extensions/state/selection.test.d.ts.map +1 -0
  166. package/dist/types/src/extensions/streaming/index.d.ts +4 -0
  167. package/dist/types/src/extensions/streaming/index.d.ts.map +1 -0
  168. package/dist/types/src/extensions/streaming/pending/index.d.ts.map +1 -0
  169. package/dist/types/src/extensions/streaming/pending/pending-text-stream.d.ts.map +1 -0
  170. package/dist/types/src/extensions/streaming/pending/pending-text-stream.test.d.ts.map +1 -0
  171. package/dist/types/src/extensions/{pending → streaming/pending}/pending-text.d.ts +1 -0
  172. package/dist/types/src/extensions/streaming/pending/pending-text.d.ts.map +1 -0
  173. package/dist/types/src/extensions/streaming/pending/pending-text.test.d.ts.map +1 -0
  174. package/dist/types/src/extensions/streaming/scrolling/auto-scroll.d.ts.map +1 -0
  175. package/dist/types/src/extensions/streaming/scrolling/crawler.d.ts.map +1 -0
  176. package/dist/types/src/extensions/streaming/scrolling/index.d.ts.map +1 -0
  177. package/dist/types/src/extensions/streaming/scrolling/scroll-past-end.d.ts +4 -0
  178. package/dist/types/src/extensions/streaming/scrolling/scroll-past-end.d.ts.map +1 -0
  179. package/dist/types/src/extensions/streaming/scrolling/scrollbar-autohide.d.ts.map +1 -0
  180. package/dist/types/src/extensions/streaming/scrolling/scroller.d.ts.map +1 -0
  181. package/dist/types/src/extensions/{typewriter.d.ts → streaming/typewriter.d.ts} +12 -12
  182. package/dist/types/src/extensions/streaming/typewriter.d.ts.map +1 -0
  183. package/dist/types/src/extensions/streaming/typewriter.test.d.ts.map +1 -0
  184. package/dist/types/src/extensions/structure/blocks/blocks.d.ts +52 -0
  185. package/dist/types/src/extensions/structure/blocks/blocks.d.ts.map +1 -0
  186. package/dist/types/src/extensions/structure/blocks/blocks.test.d.ts +2 -0
  187. package/dist/types/src/extensions/structure/blocks/blocks.test.d.ts.map +1 -0
  188. package/dist/types/src/extensions/structure/blocks/drag.d.ts +57 -0
  189. package/dist/types/src/extensions/structure/blocks/drag.d.ts.map +1 -0
  190. package/dist/types/src/extensions/structure/blocks/index.d.ts +5 -0
  191. package/dist/types/src/extensions/structure/blocks/index.d.ts.map +1 -0
  192. package/dist/types/src/extensions/structure/blocks/selection.d.ts +47 -0
  193. package/dist/types/src/extensions/structure/blocks/selection.d.ts.map +1 -0
  194. package/dist/types/src/extensions/structure/blocks/selection.test.d.ts +2 -0
  195. package/dist/types/src/extensions/structure/blocks/selection.test.d.ts.map +1 -0
  196. package/dist/types/src/extensions/structure/blocks/types.d.ts +17 -0
  197. package/dist/types/src/extensions/structure/blocks/types.d.ts.map +1 -0
  198. package/dist/types/src/extensions/structure/folding/folding.d.ts.map +1 -0
  199. package/dist/types/src/extensions/structure/folding/index.d.ts +3 -0
  200. package/dist/types/src/extensions/structure/folding/index.d.ts.map +1 -0
  201. package/dist/types/src/extensions/structure/folding/turns.d.ts +55 -0
  202. package/dist/types/src/extensions/structure/folding/turns.d.ts.map +1 -0
  203. package/dist/types/src/extensions/structure/folding/turns.test.d.ts +2 -0
  204. package/dist/types/src/extensions/structure/folding/turns.test.d.ts.map +1 -0
  205. package/dist/types/src/extensions/structure/index.d.ts +4 -0
  206. package/dist/types/src/extensions/structure/index.d.ts.map +1 -0
  207. package/dist/types/src/extensions/structure/outliner/commands.d.ts +31 -0
  208. package/dist/types/src/extensions/structure/outliner/commands.d.ts.map +1 -0
  209. package/dist/types/src/extensions/structure/outliner/dnd.d.ts +43 -0
  210. package/dist/types/src/extensions/structure/outliner/dnd.d.ts.map +1 -0
  211. package/dist/types/src/extensions/structure/outliner/dnd.test.d.ts +2 -0
  212. package/dist/types/src/extensions/structure/outliner/dnd.test.d.ts.map +1 -0
  213. package/dist/types/src/extensions/structure/outliner/editor.d.ts.map +1 -0
  214. package/dist/types/src/extensions/structure/outliner/editor.test.d.ts.map +1 -0
  215. package/dist/types/src/extensions/{outliner → structure/outliner}/index.d.ts +1 -0
  216. package/dist/types/src/extensions/structure/outliner/index.d.ts.map +1 -0
  217. package/dist/types/src/extensions/{outliner → structure/outliner}/menu.d.ts +1 -0
  218. package/dist/types/src/extensions/structure/outliner/menu.d.ts.map +1 -0
  219. package/dist/types/src/extensions/structure/outliner/outliner.d.ts.map +1 -0
  220. package/dist/types/src/extensions/structure/outliner/outliner.test.d.ts.map +1 -0
  221. package/dist/types/src/extensions/{outliner → structure/outliner}/tree.d.ts +1 -1
  222. package/dist/types/src/extensions/structure/outliner/tree.d.ts.map +1 -0
  223. package/dist/types/src/extensions/structure/outliner/tree.test.d.ts.map +1 -0
  224. package/dist/types/src/headless.d.ts +4 -0
  225. package/dist/types/src/headless.d.ts.map +1 -0
  226. package/dist/types/src/styles/theme.d.ts +1 -1
  227. package/dist/types/src/styles/theme.d.ts.map +1 -1
  228. package/dist/types/src/util/util.d.ts +2 -0
  229. package/dist/types/src/util/util.d.ts.map +1 -1
  230. package/dist/types/tsconfig.tsbuildinfo +1 -1
  231. package/package.json +48 -42
  232. package/src/defaults.ts +1 -1
  233. package/src/extensions/{bookmarks.ts → behavior/bookmarks.ts} +24 -14
  234. package/src/extensions/behavior/index.ts +9 -0
  235. package/src/extensions/{listener.ts → behavior/listener.ts} +4 -1
  236. package/src/extensions/{spacing.ts → behavior/spacing.ts} +8 -2
  237. package/src/extensions/{submit.ts → behavior/submit.ts} +2 -10
  238. package/src/extensions/{automerge → collab/automerge}/automerge.test.tsx +4 -4
  239. package/src/extensions/{automerge → collab/automerge}/automerge.ts +7 -4
  240. package/src/extensions/{automerge → collab/automerge}/cursor.ts +1 -1
  241. package/src/extensions/{automerge → collab/automerge}/defs.ts +4 -1
  242. package/src/extensions/{automerge → collab/automerge}/index.ts +1 -0
  243. package/src/extensions/{automerge → collab/automerge}/sync.ts +1 -2
  244. package/src/extensions/{automerge → collab/automerge}/update-automerge.ts +4 -0
  245. package/src/extensions/{automerge → collab/automerge}/update-codemirror.ts +5 -1
  246. package/src/extensions/{awareness → collab/awareness}/awareness-provider.ts +3 -4
  247. package/src/extensions/{awareness → collab/awareness}/awareness.ts +19 -16
  248. package/src/extensions/collab/index.ts +6 -0
  249. package/src/extensions/{autocomplete → completion}/autocomplete.ts +7 -5
  250. package/src/extensions/{autocomplete → completion}/index.ts +2 -1
  251. package/src/extensions/{autocomplete → completion}/match.ts +2 -2
  252. package/src/extensions/{mention.ts → completion/mention.ts} +3 -0
  253. package/src/extensions/{autocomplete → completion}/placeholder.ts +1 -1
  254. package/src/extensions/completion/typeahead.ts +97 -0
  255. package/src/extensions/{factories.ts → core/factories.ts} +35 -13
  256. package/src/extensions/core/index.ts +6 -0
  257. package/src/extensions/{modes.ts → core/modes.ts} +4 -1
  258. package/src/extensions/{debug.ts → debug/debug.ts} +3 -0
  259. package/src/extensions/debug/index.ts +5 -0
  260. package/src/extensions/{annotations.ts → decoration/annotations.ts} +12 -10
  261. package/src/extensions/decoration/assistant.ts +225 -0
  262. package/src/extensions/{fader.ts → decoration/fader.ts} +17 -19
  263. package/src/extensions/{hashtag.ts → decoration/hashtag.ts} +35 -28
  264. package/src/extensions/decoration/index.ts +11 -0
  265. package/src/extensions/{marker.ts → decoration/marker.ts} +18 -18
  266. package/src/extensions/{pos.test.ts → decoration/pos.test.ts} +57 -1
  267. package/src/extensions/{pos.ts → decoration/pos.ts} +165 -31
  268. package/src/extensions/{blast.ts → demo/blast.ts} +3 -0
  269. package/src/extensions/demo/index.ts +6 -0
  270. package/src/extensions/{snippets.ts → demo/snippets.ts} +5 -1
  271. package/src/extensions/index.ts +10 -33
  272. package/src/extensions/language/index.ts +8 -0
  273. package/src/extensions/language/json/index.ts +5 -0
  274. package/src/extensions/{json.ts → language/json/json.ts} +11 -6
  275. package/src/extensions/{markdown → language/markdown}/action.ts +1 -1
  276. package/src/extensions/{markdown → language/markdown}/bundle.ts +7 -1
  277. package/src/extensions/{markdown → language/markdown}/changes.test.ts +2 -2
  278. package/src/extensions/{markdown → language/markdown}/changes.ts +2 -2
  279. package/src/extensions/{markdown → language/markdown}/debug.ts +3 -0
  280. package/src/extensions/{markdown → language/markdown}/decorate.ts +96 -85
  281. package/src/extensions/{markdown → language/markdown}/formatting.test.ts +88 -1
  282. package/src/extensions/{markdown → language/markdown}/formatting.ts +193 -74
  283. package/src/extensions/{markdown → language/markdown}/highlight.ts +42 -41
  284. package/src/extensions/{markdown → language/markdown}/image.test.ts +1 -1
  285. package/src/extensions/{markdown → language/markdown}/image.ts +6 -6
  286. package/src/extensions/language/markdown/link.test.ts +58 -0
  287. package/src/extensions/language/markdown/link.ts +109 -0
  288. package/src/extensions/{markdown → language/markdown}/parser.test.ts +0 -28
  289. package/src/extensions/{markdown → language/markdown}/styles.ts +38 -7
  290. package/src/extensions/{markdown → language/markdown}/table.ts +5 -5
  291. package/src/extensions/language/mermaid/index.ts +5 -0
  292. package/src/extensions/language/mermaid/mermaid.ts +44 -0
  293. package/src/extensions/{tags → language/xml}/DESIGN.md +3 -3
  294. package/src/extensions/{tags → language/xml}/extended-markdown.test.ts +2 -1
  295. package/src/extensions/{tags → language/xml}/extended-markdown.ts +2 -4
  296. package/src/extensions/language/xml/stub.ts +233 -0
  297. package/src/extensions/language/xml/xml-block-decoration.ts +165 -0
  298. package/src/extensions/{tags → language/xml}/xml-formatting.ts +54 -38
  299. package/src/extensions/language/xml/xml-tags.test.ts +588 -0
  300. package/src/extensions/{tags → language/xml}/xml-tags.ts +165 -66
  301. package/src/extensions/{tags → language/xml}/xml-util.test.ts +2 -2
  302. package/src/extensions/review/change-bar.ts +94 -0
  303. package/src/extensions/review/comments.test.ts +72 -0
  304. package/src/extensions/{comments.ts → review/comments.ts} +395 -267
  305. package/src/extensions/review/diff.test.ts +405 -0
  306. package/src/extensions/review/diff.ts +502 -0
  307. package/src/extensions/review/index.ts +10 -0
  308. package/src/extensions/review/suggest.test.ts +170 -0
  309. package/src/extensions/review/suggest.ts +512 -0
  310. package/src/extensions/review/suggestions-overlay.test.ts +58 -0
  311. package/src/extensions/review/suggestions-overlay.ts +50 -0
  312. package/src/extensions/review/track-changes.test.ts +101 -0
  313. package/src/extensions/review/track-changes.ts +215 -0
  314. package/src/extensions/{busy.ts → state/busy.ts} +1 -0
  315. package/src/extensions/{focus.ts → state/focus.ts} +4 -0
  316. package/src/extensions/state/index.ts +8 -0
  317. package/src/extensions/{selection.ts → state/selection.ts} +3 -3
  318. package/src/extensions/streaming/index.ts +7 -0
  319. package/src/extensions/{pending → streaming/pending}/pending-text-stream.ts +10 -3
  320. package/src/extensions/{pending → streaming/pending}/pending-text.test.ts +1 -1
  321. package/src/extensions/{pending → streaming/pending}/pending-text.ts +20 -19
  322. package/src/extensions/{scrolling → streaming/scrolling}/auto-scroll.ts +9 -6
  323. package/src/extensions/{scrolling → streaming/scrolling}/scroll-past-end.ts +1 -0
  324. package/src/extensions/{scrolling → streaming/scrolling}/scrollbar-autohide.ts +13 -11
  325. package/src/extensions/{typewriter.ts → streaming/typewriter.ts} +46 -47
  326. package/src/extensions/structure/blocks/DESIGN.md +134 -0
  327. package/src/extensions/structure/blocks/blocks.test.ts +147 -0
  328. package/src/extensions/structure/blocks/blocks.ts +219 -0
  329. package/src/extensions/structure/blocks/drag.ts +996 -0
  330. package/src/extensions/structure/blocks/index.ts +8 -0
  331. package/src/extensions/structure/blocks/selection.test.ts +56 -0
  332. package/src/extensions/structure/blocks/selection.ts +279 -0
  333. package/src/extensions/structure/blocks/types.ts +22 -0
  334. package/src/extensions/{folding.ts → structure/folding/folding.ts} +12 -10
  335. package/src/extensions/structure/folding/index.ts +6 -0
  336. package/src/extensions/structure/folding/turns.test.ts +72 -0
  337. package/src/extensions/structure/folding/turns.ts +209 -0
  338. package/src/extensions/structure/index.ts +7 -0
  339. package/src/extensions/structure/outliner/DESIGN.md +183 -0
  340. package/src/extensions/structure/outliner/SPEC.mdl +305 -0
  341. package/src/extensions/{outliner → structure/outliner}/commands.ts +125 -42
  342. package/src/extensions/structure/outliner/dnd.test.ts +142 -0
  343. package/src/extensions/structure/outliner/dnd.ts +375 -0
  344. package/src/extensions/structure/outliner/editor.test.ts +85 -0
  345. package/src/extensions/{outliner → structure/outliner}/editor.ts +14 -9
  346. package/src/extensions/{outliner → structure/outliner}/index.ts +1 -0
  347. package/src/extensions/{outliner → structure/outliner}/menu.ts +48 -25
  348. package/src/extensions/structure/outliner/outliner.test.ts +193 -0
  349. package/src/extensions/structure/outliner/outliner.ts +183 -0
  350. package/src/extensions/{outliner → structure/outliner}/tree.test.ts +2 -2
  351. package/src/extensions/{outliner → structure/outliner}/tree.ts +1 -1
  352. package/src/headless.ts +13 -0
  353. package/src/styles/theme.ts +3 -1
  354. package/src/util/util.ts +3 -0
  355. package/dist/lib/browser/index.mjs +0 -9594
  356. package/dist/lib/browser/index.mjs.map +0 -7
  357. package/dist/lib/browser/meta.json +0 -1
  358. package/dist/lib/browser/types/index.mjs +0 -33
  359. package/dist/lib/browser/types/index.mjs.map +0 -7
  360. package/dist/lib/node-esm/index.mjs +0 -9596
  361. package/dist/lib/node-esm/index.mjs.map +0 -7
  362. package/dist/lib/node-esm/meta.json +0 -1
  363. package/dist/lib/node-esm/types/index.mjs +0 -35
  364. package/dist/lib/node-esm/types/index.mjs.map +0 -7
  365. package/dist/types/src/extensions/annotations.d.ts.map +0 -1
  366. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts.map +0 -1
  367. package/dist/types/src/extensions/autocomplete/index.d.ts.map +0 -1
  368. package/dist/types/src/extensions/autocomplete/match.d.ts.map +0 -1
  369. package/dist/types/src/extensions/autocomplete/placeholder.d.ts.map +0 -1
  370. package/dist/types/src/extensions/autocomplete/typeahead.d.ts.map +0 -1
  371. package/dist/types/src/extensions/automerge/automerge.d.ts.map +0 -1
  372. package/dist/types/src/extensions/automerge/automerge.test.d.ts.map +0 -1
  373. package/dist/types/src/extensions/automerge/cursor.d.ts.map +0 -1
  374. package/dist/types/src/extensions/automerge/defs.d.ts.map +0 -1
  375. package/dist/types/src/extensions/automerge/index.d.ts +0 -2
  376. package/dist/types/src/extensions/automerge/index.d.ts.map +0 -1
  377. package/dist/types/src/extensions/automerge/sync.d.ts.map +0 -1
  378. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +0 -1
  379. package/dist/types/src/extensions/automerge/update-codemirror.d.ts.map +0 -1
  380. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +0 -1
  381. package/dist/types/src/extensions/awareness/awareness.d.ts.map +0 -1
  382. package/dist/types/src/extensions/awareness/index.d.ts.map +0 -1
  383. package/dist/types/src/extensions/blast.d.ts.map +0 -1
  384. package/dist/types/src/extensions/blocks.d.ts +0 -2
  385. package/dist/types/src/extensions/blocks.d.ts.map +0 -1
  386. package/dist/types/src/extensions/bookmarks.d.ts.map +0 -1
  387. package/dist/types/src/extensions/busy.d.ts.map +0 -1
  388. package/dist/types/src/extensions/comments.d.ts.map +0 -1
  389. package/dist/types/src/extensions/debug.d.ts.map +0 -1
  390. package/dist/types/src/extensions/dnd.d.ts.map +0 -1
  391. package/dist/types/src/extensions/factories.d.ts.map +0 -1
  392. package/dist/types/src/extensions/factories.test.d.ts.map +0 -1
  393. package/dist/types/src/extensions/fader.d.ts.map +0 -1
  394. package/dist/types/src/extensions/focus.d.ts.map +0 -1
  395. package/dist/types/src/extensions/folding.d.ts.map +0 -1
  396. package/dist/types/src/extensions/hashtag.d.ts +0 -3
  397. package/dist/types/src/extensions/hashtag.d.ts.map +0 -1
  398. package/dist/types/src/extensions/json.d.ts +0 -7
  399. package/dist/types/src/extensions/json.d.ts.map +0 -1
  400. package/dist/types/src/extensions/listener.d.ts.map +0 -1
  401. package/dist/types/src/extensions/markdown/action.d.ts.map +0 -1
  402. package/dist/types/src/extensions/markdown/bundle.d.ts.map +0 -1
  403. package/dist/types/src/extensions/markdown/changes.d.ts.map +0 -1
  404. package/dist/types/src/extensions/markdown/changes.test.d.ts.map +0 -1
  405. package/dist/types/src/extensions/markdown/debug.d.ts.map +0 -1
  406. package/dist/types/src/extensions/markdown/decorate.d.ts.map +0 -1
  407. package/dist/types/src/extensions/markdown/formatting.d.ts.map +0 -1
  408. package/dist/types/src/extensions/markdown/formatting.test.d.ts.map +0 -1
  409. package/dist/types/src/extensions/markdown/highlight.d.ts.map +0 -1
  410. package/dist/types/src/extensions/markdown/image.d.ts.map +0 -1
  411. package/dist/types/src/extensions/markdown/image.test.d.ts.map +0 -1
  412. package/dist/types/src/extensions/markdown/index.d.ts.map +0 -1
  413. package/dist/types/src/extensions/markdown/link.d.ts +0 -7
  414. package/dist/types/src/extensions/markdown/link.d.ts.map +0 -1
  415. package/dist/types/src/extensions/markdown/parser.test.d.ts.map +0 -1
  416. package/dist/types/src/extensions/markdown/styles.d.ts.map +0 -1
  417. package/dist/types/src/extensions/markdown/table.d.ts.map +0 -1
  418. package/dist/types/src/extensions/marker.d.ts.map +0 -1
  419. package/dist/types/src/extensions/mention.d.ts.map +0 -1
  420. package/dist/types/src/extensions/modal.d.ts.map +0 -1
  421. package/dist/types/src/extensions/modes.d.ts.map +0 -1
  422. package/dist/types/src/extensions/outliner/commands.d.ts +0 -10
  423. package/dist/types/src/extensions/outliner/commands.d.ts.map +0 -1
  424. package/dist/types/src/extensions/outliner/editor.d.ts.map +0 -1
  425. package/dist/types/src/extensions/outliner/editor.test.d.ts.map +0 -1
  426. package/dist/types/src/extensions/outliner/index.d.ts.map +0 -1
  427. package/dist/types/src/extensions/outliner/menu.d.ts.map +0 -1
  428. package/dist/types/src/extensions/outliner/outliner.d.ts.map +0 -1
  429. package/dist/types/src/extensions/outliner/outliner.test.d.ts.map +0 -1
  430. package/dist/types/src/extensions/outliner/selection.d.ts +0 -12
  431. package/dist/types/src/extensions/outliner/selection.d.ts.map +0 -1
  432. package/dist/types/src/extensions/outliner/tree.d.ts.map +0 -1
  433. package/dist/types/src/extensions/outliner/tree.test.d.ts.map +0 -1
  434. package/dist/types/src/extensions/pending/index.d.ts.map +0 -1
  435. package/dist/types/src/extensions/pending/pending-text-stream.d.ts.map +0 -1
  436. package/dist/types/src/extensions/pending/pending-text-stream.test.d.ts.map +0 -1
  437. package/dist/types/src/extensions/pending/pending-text.d.ts.map +0 -1
  438. package/dist/types/src/extensions/pending/pending-text.test.d.ts.map +0 -1
  439. package/dist/types/src/extensions/pos.d.ts.map +0 -1
  440. package/dist/types/src/extensions/pos.test.d.ts.map +0 -1
  441. package/dist/types/src/extensions/replacer.d.ts.map +0 -1
  442. package/dist/types/src/extensions/replacer.test.d.ts.map +0 -1
  443. package/dist/types/src/extensions/scrolling/auto-scroll.d.ts.map +0 -1
  444. package/dist/types/src/extensions/scrolling/crawler.d.ts.map +0 -1
  445. package/dist/types/src/extensions/scrolling/index.d.ts.map +0 -1
  446. package/dist/types/src/extensions/scrolling/scroll-past-end.d.ts +0 -3
  447. package/dist/types/src/extensions/scrolling/scroll-past-end.d.ts.map +0 -1
  448. package/dist/types/src/extensions/scrolling/scrollbar-autohide.d.ts.map +0 -1
  449. package/dist/types/src/extensions/scrolling/scroller.d.ts.map +0 -1
  450. package/dist/types/src/extensions/selection.d.ts.map +0 -1
  451. package/dist/types/src/extensions/selection.test.d.ts.map +0 -1
  452. package/dist/types/src/extensions/snippets.d.ts.map +0 -1
  453. package/dist/types/src/extensions/spacing.d.ts.map +0 -1
  454. package/dist/types/src/extensions/state.d.ts +0 -2
  455. package/dist/types/src/extensions/state.d.ts.map +0 -1
  456. package/dist/types/src/extensions/submit.d.ts.map +0 -1
  457. package/dist/types/src/extensions/tags/extended-markdown.d.ts.map +0 -1
  458. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts.map +0 -1
  459. package/dist/types/src/extensions/tags/index.d.ts.map +0 -1
  460. package/dist/types/src/extensions/tags/stub.d.ts +0 -35
  461. package/dist/types/src/extensions/tags/stub.d.ts.map +0 -1
  462. package/dist/types/src/extensions/tags/widgets/anchor.d.ts.map +0 -1
  463. package/dist/types/src/extensions/tags/widgets/index.d.ts.map +0 -1
  464. package/dist/types/src/extensions/tags/xml-block-decoration.d.ts +0 -31
  465. package/dist/types/src/extensions/tags/xml-block-decoration.d.ts.map +0 -1
  466. package/dist/types/src/extensions/tags/xml-formatting.d.ts.map +0 -1
  467. package/dist/types/src/extensions/tags/xml-tags.d.ts.map +0 -1
  468. package/dist/types/src/extensions/tags/xml-util.d.ts.map +0 -1
  469. package/dist/types/src/extensions/tags/xml-util.test.d.ts.map +0 -1
  470. package/dist/types/src/extensions/typewriter.d.ts.map +0 -1
  471. package/dist/types/src/extensions/typewriter.test.d.ts.map +0 -1
  472. package/src/extensions/autocomplete/typeahead.ts +0 -87
  473. package/src/extensions/blocks.ts +0 -131
  474. package/src/extensions/markdown/link.ts +0 -49
  475. package/src/extensions/outliner/editor.test.ts +0 -33
  476. package/src/extensions/outliner/outliner.test.ts +0 -99
  477. package/src/extensions/outliner/outliner.ts +0 -166
  478. package/src/extensions/outliner/selection.ts +0 -50
  479. package/src/extensions/state.ts +0 -7
  480. package/src/extensions/tags/stub.ts +0 -80
  481. package/src/extensions/tags/xml-block-decoration.ts +0 -123
  482. package/dist/types/src/extensions/{dnd.d.ts → behavior/dnd.d.ts} +0 -0
  483. package/dist/types/src/extensions/{submit.d.ts → behavior/submit.d.ts} +0 -0
  484. package/dist/types/src/extensions/{automerge → collab/automerge}/automerge.d.ts +0 -0
  485. package/dist/types/src/extensions/{automerge → collab/automerge}/automerge.test.d.ts +0 -0
  486. package/dist/types/src/extensions/{automerge → collab/automerge}/sync.d.ts +0 -0
  487. package/dist/types/src/extensions/{awareness → collab/awareness}/awareness-provider.d.ts +0 -0
  488. package/dist/types/src/extensions/{awareness → collab/awareness}/index.d.ts +0 -0
  489. package/dist/types/src/extensions/{autocomplete → completion}/autocomplete.d.ts +0 -0
  490. package/dist/types/src/extensions/{autocomplete → completion}/placeholder.d.ts +0 -0
  491. package/dist/types/src/extensions/{factories.test.d.ts → core/factories.test.d.ts} +0 -0
  492. package/dist/types/src/extensions/{fader.d.ts → decoration/fader.d.ts} +0 -0
  493. package/dist/types/src/extensions/{marker.d.ts → decoration/marker.d.ts} +0 -0
  494. package/dist/types/src/extensions/{pos.test.d.ts → decoration/pos.test.d.ts} +0 -0
  495. package/dist/types/src/extensions/{replacer.test.d.ts → decoration/replacer.test.d.ts} +0 -0
  496. package/dist/types/src/extensions/{snippets.d.ts → demo/snippets.d.ts} +0 -0
  497. package/dist/types/src/extensions/{markdown → language/markdown}/action.d.ts +0 -0
  498. package/dist/types/src/extensions/{markdown → language/markdown}/bundle.d.ts +0 -0
  499. package/dist/types/src/extensions/{markdown → language/markdown}/changes.test.d.ts +0 -0
  500. package/dist/types/src/extensions/{markdown → language/markdown}/formatting.test.d.ts +0 -0
  501. package/dist/types/src/extensions/{markdown → language/markdown}/image.d.ts +0 -0
  502. package/dist/types/src/extensions/{markdown → language/markdown}/image.test.d.ts +0 -0
  503. package/dist/types/src/extensions/{markdown → language/markdown}/index.d.ts +0 -0
  504. package/dist/types/src/extensions/{markdown → language/markdown}/parser.test.d.ts +0 -0
  505. package/dist/types/src/extensions/{markdown → language/markdown}/table.d.ts +0 -0
  506. package/dist/types/src/extensions/{tags → language/xml}/extended-markdown.d.ts +0 -0
  507. package/dist/types/src/extensions/{tags → language/xml}/extended-markdown.test.d.ts +0 -0
  508. package/dist/types/src/extensions/{tags → language/xml}/index.d.ts +0 -0
  509. package/dist/types/src/extensions/{tags → language/xml}/widgets/anchor.d.ts +0 -0
  510. package/dist/types/src/extensions/{tags → language/xml}/widgets/index.d.ts +0 -0
  511. package/dist/types/src/extensions/{tags → language/xml}/xml-formatting.d.ts +0 -0
  512. package/dist/types/src/extensions/{tags → language/xml}/xml-util.d.ts +0 -0
  513. package/dist/types/src/extensions/{tags → language/xml}/xml-util.test.d.ts +0 -0
  514. package/dist/types/src/extensions/{modal.d.ts → state/modal.d.ts} +0 -0
  515. package/dist/types/src/extensions/{selection.test.d.ts → state/selection.test.d.ts} +0 -0
  516. package/dist/types/src/extensions/{pending → streaming/pending}/index.d.ts +0 -0
  517. package/dist/types/src/extensions/{pending → streaming/pending}/pending-text-stream.d.ts +0 -0
  518. package/dist/types/src/extensions/{pending → streaming/pending}/pending-text-stream.test.d.ts +0 -0
  519. package/dist/types/src/extensions/{pending → streaming/pending}/pending-text.test.d.ts +0 -0
  520. package/dist/types/src/extensions/{scrolling → streaming/scrolling}/auto-scroll.d.ts +0 -0
  521. package/dist/types/src/extensions/{scrolling → streaming/scrolling}/crawler.d.ts +0 -0
  522. package/dist/types/src/extensions/{scrolling → streaming/scrolling}/index.d.ts +0 -0
  523. package/dist/types/src/extensions/{scrolling → streaming/scrolling}/scrollbar-autohide.d.ts +0 -0
  524. package/dist/types/src/extensions/{scrolling → streaming/scrolling}/scroller.d.ts +0 -0
  525. package/dist/types/src/extensions/{typewriter.test.d.ts → streaming/typewriter.test.d.ts} +0 -0
  526. package/dist/types/src/extensions/{folding.d.ts → structure/folding/folding.d.ts} +0 -0
  527. package/dist/types/src/extensions/{outliner → structure/outliner}/editor.d.ts +0 -0
  528. package/dist/types/src/extensions/{outliner → structure/outliner}/editor.test.d.ts +0 -0
  529. package/dist/types/src/extensions/{outliner → structure/outliner}/outliner.d.ts +0 -0
  530. package/dist/types/src/extensions/{outliner → structure/outliner}/outliner.test.d.ts +0 -0
  531. package/dist/types/src/extensions/{outliner → structure/outliner}/tree.test.d.ts +0 -0
  532. package/src/extensions/{dnd.ts → behavior/dnd.ts} +29 -29
  533. package/src/extensions/{awareness → collab/awareness}/index.ts +0 -0
  534. package/src/extensions/{factories.test.ts → core/factories.test.ts} +0 -0
  535. package/src/extensions/{replacer.test.ts → decoration/replacer.test.ts} +0 -0
  536. package/src/extensions/{replacer.ts → decoration/replacer.ts} +25 -25
  537. /package/src/extensions/{markdown → language/markdown}/index.ts +0 -0
  538. /package/src/extensions/{tags → language/xml}/index.ts +0 -0
  539. /package/src/extensions/{tags → language/xml}/testing/text.md +0 -0
  540. /package/src/extensions/{tags → language/xml}/testing/text.txt +0 -0
  541. /package/src/extensions/{tags → language/xml}/widgets/anchor.ts +0 -0
  542. /package/src/extensions/{tags → language/xml}/widgets/index.ts +0 -0
  543. /package/src/extensions/{tags → language/xml}/xml-util.ts +0 -0
  544. /package/src/extensions/{modal.ts → state/modal.ts} +0 -0
  545. /package/src/extensions/{selection.test.ts → state/selection.test.ts} +0 -0
  546. /package/src/extensions/{pending → streaming/pending}/index.ts +0 -0
  547. /package/src/extensions/{pending → streaming/pending}/pending-text-stream.test.ts +0 -0
  548. /package/src/extensions/{scrolling → streaming/scrolling}/crawler.ts +0 -0
  549. /package/src/extensions/{scrolling → streaming/scrolling}/index.ts +0 -0
  550. /package/src/extensions/{scrolling → streaming/scrolling}/scroller.ts +0 -0
  551. /package/src/extensions/{typewriter.test.ts → streaming/typewriter.test.ts} +0 -0
@@ -0,0 +1,7 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './blocks';
6
+ export * from './folding';
7
+ export * from './outliner';
@@ -0,0 +1,183 @@
1
+ # Outliner rebuilt on `blocks` — DESIGN
2
+
3
+ ## Motivation
4
+
5
+ `blocks` (`../blocks`) is the precise, tested foundation for the gutter drag grip,
6
+ whole-block selection, the selection highlight, and block clipboard. The outliner
7
+ predates it and still carries its **own** selection (`selection.ts`,
8
+ `selectionFacet`), drag wiring (`outlinerDnd`), and selection decorations
9
+ (`outliner.ts` `decorations()`). Those now duplicate and fight `blocks`:
10
+
11
+ - **Two disconnected selection models** — `selectionFacet` (item indices; keyboard
12
+ commands; `.cm-list-item` border) vs `blockSelectionField` (anchors; grip
13
+ click/drag; `RectangleMarker` highlight). They never sync, so grip selection and
14
+ keyboard selection are invisible to each other, and `Cmd+A` then `Cmd+C` copies
15
+ nothing (clipboard reads the empty block selection).
16
+ - **Redundant, misaligned highlight** — `outlinerDnd` layers
17
+ `createBlockSelectionHighlight` on top of the outliner's own border with different
18
+ geometry → the highlight sits off the row.
19
+ - **Grip above the checkbox** — the grip anchors to the line-block top, but the
20
+ outliner row adds `paddingTop`/`marginTop`, pushing the checkbox down ~6px.
21
+
22
+ **Plan:** rebuild the outliner as _structure + editing on top of `blocks`_.
23
+ `blocks` owns selection, drag, highlight, and clipboard; the outliner keeps only
24
+ what is genuinely hierarchy/markdown-specific.
25
+
26
+ ## Goals
27
+
28
+ - One selection model: `blockSelectionField`.
29
+ - The grip centers on the checkbox.
30
+ - Selecting or dragging an item covers its **whole subtree**.
31
+ - A **subtle** current-item (caret) indicator, distinct from the accent selection.
32
+ - Preserve outliner structure/editing: tree parsing, edit constraints, commands, menu.
33
+
34
+ ## Non-goals
35
+
36
+ - Rewriting `tree.ts` parsing or the `editor.ts` edit constraints.
37
+ - Cross-document drag, virtualization, multi-select rectangle.
38
+
39
+ ## Block model (the crux)
40
+
41
+ Subtree-as-block and per-item grips pull in opposite directions: subtree ranges
42
+ **overlap** (a parent contains its children), but the gutter/drag ordering needs
43
+ **non-overlapping** ranges. Resolve by separating the two:
44
+
45
+ - **`getBlocks`** (gutter grips + drag ordering) = each item's **own lines**,
46
+ non-overlapping, one grip per item.
47
+ `from = item.lineRange.from`; `to = firstChild ? firstChild.lineRange.from − 1 : item.lineRange.to`.
48
+ - **Block extent** (selection highlight, drag collapse/preview, clipboard) = the
49
+ item's **subtree**: `getRange(tree, item) = [item.lineRange.from, lastDescendant.lineRange.to]`.
50
+ Overlap between a selected parent and a selected child is acceptable — the
51
+ highlight just draws overlapping boxes.
52
+
53
+ ### `blocks` change: extent hook
54
+
55
+ Add an optional `getBlockExtent(state, block) => { from, to }` to the `blocks`
56
+ core, defaulting to the block's own range. It is consulted by:
57
+
58
+ - `createBlockSelectionHighlight` — the marker for a selected block spans its extent.
59
+ - `createBlockDrag` — the collapse decoration, floating preview, and placeholder
60
+ size use the extent (so dragging a parent visually moves the whole subtree).
61
+
62
+ Markdown blocks pass no hook (extent = own range, unchanged). The outliner passes
63
+ the subtree mapper. This keeps `blocks` generic and leaves markdown behavior
64
+ byte-for-byte identical.
65
+
66
+ ## Drag reindent — drop level rules
67
+
68
+ Dragging an item moves its whole subtree (`getExtent`). On drop the subtree is
69
+ **re-indented** to a target level; the drag preview shows that level live so the
70
+ drop is predictable. The subtlety is at a **branch boundary** — dropping into the
71
+ gap before an item that is _shallower_ than the item above the gap. Example:
72
+
73
+ ```
74
+ - A
75
+ - B
76
+ - C
77
+ - D
78
+ ```
79
+
80
+ Dropping `B` into the gap between `C` and `D` is ambiguous:
81
+
82
+ - **(i)** `B` stays a child of `A` (a sibling of `C`), or
83
+ - **(ii)** `B` becomes a sibling of `A` (aligned with `D`).
84
+
85
+ ### Rule
86
+
87
+ For a drop into the slot before `target` (the item at the drop index), let
88
+ `above` be the last item before the slot that is not part of the dragged subtree,
89
+ and `unit = getIndentUnit`. Working in leading-space counts:
90
+
91
+ - `min = indent(target)` — shallowest: a sibling of `target` (leave the branch).
92
+ - `max = indent(above) + unit` — deepest: a child of `above`.
93
+ - **default (i)** `stay = clamp(indent(source), min, max)` — the dragged item keeps
94
+ its **own** level (staying in its branch), clamped so it is at most a child of
95
+ `above` and at least a sibling of `target`.
96
+ - **(ii)** applies only at a real branch boundary (`min < stay`) **and** only while
97
+ the pointer is vertically **over the `target` row** (`pointerY ≥ target.top`);
98
+ then the level drops to `min` (a sibling of `target`).
99
+
100
+ So the default is always (i) — the dragged item keeps its place in the current
101
+ branch — and it outdents to (ii) only when the pointer moves down onto the
102
+ shallower next item (`D`). At the end of the document, or with no `target`, the
103
+ level stays at `above`'s branch.
104
+
105
+ ### Preview + wiring
106
+
107
+ `blocks/drag.ts` stays hierarchy-agnostic. The outliner supplies an optional
108
+ `getDropIndent(view, sourceIndices, dropIndex, pointerY)` hook returning
109
+ `{ indent, offset }` — the target leading-space count and the horizontal pixel
110
+ offset for the preview (`(indent − sourceIndent) / unit × bulletListIndentationWidth`).
111
+ The drag plugin shifts the floating preview by `offset` each pointer move and, on
112
+ drop, passes `indent` to `moveBlocks` so the committed re-indent matches the
113
+ preview. Markdown blocks pass no hook (no reindent, preview unshifted).
114
+
115
+ ## Selection (single model)
116
+
117
+ - `blockSelectionField` is the only selection state.
118
+ - Grip click / shift-click / drag populate it (unchanged `blocks` behavior).
119
+ - Outliner `selectAll` / `selectUp` / `selectDown` are retargeted to
120
+ `blockSelectionField` (tree traversal → block anchors), replacing the
121
+ `selectionFacet` versions. `selectUp`/`selectDown` (today no-op stubs) get real
122
+ implementations: extend the block selection to the previous/next item.
123
+ - Clipboard (cut/copy/paste) via `createBlockSelection` with the outliner
124
+ `BlockOps` (subtree-aware `serialize`/`replaceBlocks`).
125
+ - **Remove** `selection.ts` (`selectionFacet`, `selectionCompartment`,
126
+ `selectAll/None/Up/Down`) and the selection branch of `outliner.ts`
127
+ `decorations()`.
128
+
129
+ ## Current-item indicator
130
+
131
+ - A subtle border on the caret item's **subtree extent**, visually distinct from
132
+ the accent selection highlight (e.g. `--color-focus-ring-subtle`).
133
+ - Rendered by a minimal outliner layer/decoration driven by `tree.find(caretPos)`
134
+ → subtree extent. This is the one piece of the old `decorations()` we keep, but
135
+ scoped to the current item only (no selection role).
136
+
137
+ ## Grip ↔ checkbox alignment
138
+
139
+ Generalize in `blocks` (per the decision), kept cheap:
140
+
141
+ - The grip currently top-anchors and sizes to the first row height. Offset it down
142
+ by the first line's rendered top padding so it centers on the row content.
143
+ - Preferred: derive the offset without per-frame layout reads (no `coordsAtPos`
144
+ during update). If a clean generic measurement proves costly, fall back to a
145
+ `gripInsetTop?: number` option on `createBlockDrag` that the outliner sets to its
146
+ known row padding. Decide during implementation; do not regress markdown
147
+ centering (heading vs body).
148
+
149
+ ## Module changes
150
+
151
+ | Module | Action |
152
+ | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
153
+ | `tree.ts` | keep |
154
+ | `editor.ts` | keep (constraints + `initialize`; add teardown for the `setTimeout` in `initialize`) |
155
+ | `commands.ts` | keep; retarget select commands to `blockSelectionField` |
156
+ | `menu.ts` | keep |
157
+ | `dnd.ts` | keep the `BlockOps` adapter (subtree move + reindent, serialize, replace); add the subtree `getBlockExtent`; **drop** the `outlinerDnd` highlight/selection wrapper |
158
+ | `selection.ts` | **remove** |
159
+ | `outliner.ts` | compose `blocks()` (drag + selection + highlight + clipboard) + tree + editor + commands + menu + current-item indicator; **drop** the selection decorations |
160
+ | `blocks/drag.ts`, `blocks/selection.ts` | add `getBlockExtent` hook; generalize grip alignment |
161
+
162
+ ### Incidental cleanups (in scope)
163
+
164
+ - Dead theme tokens in `drag.ts`: `--dx-description`, `--dx-base-surface` → real
165
+ `--color-*` tokens (or drop the fallback).
166
+ - `editor.ts` `initialize()` `setTimeout` — guard against dispatch on a destroyed view.
167
+
168
+ ## Risks / open questions
169
+
170
+ - Overlapping subtree highlights when a parent and descendant are both selected —
171
+ accepted as visually fine; confirm on review.
172
+ - Grip-alignment generalization must not add a per-line layout read on the hot path.
173
+ - Interaction of `editor.ts` edit constraints with subtree moves (re-indent) —
174
+ covered by existing move logic but needs a test.
175
+
176
+ ## Test plan
177
+
178
+ - Reuse `tree.test.ts`, `editor.test.ts`, `outliner.test.ts`.
179
+ - Add headless tests: subtree `getBlockExtent`; `selectAll/Up/Down` populate
180
+ `blockSelectionField`; clipboard cut/copy/paste over a subtree; single-item drag
181
+ relocates the subtree and keeps it selected.
182
+ - Storybook (`Outliner.stories.tsx`): grip centered on the checkbox; selecting an
183
+ item highlights its subtree; current-item border distinct from selection.
@@ -0,0 +1,305 @@
1
+ ---
2
+ id: org.dxos.ui-editor.outliner
3
+ name: Outliner
4
+ version: 0.1.0
5
+ ---
6
+
7
+ The outliner is a CodeMirror extension (`outliner()`) that turns a plain markdown
8
+ task/bullet list into a structured, hierarchical outline editor. The document is
9
+ always valid markdown — nesting is leading-whitespace indentation, items are
10
+ `- [ ] ` tasks or `- ` bullets — so the same text round-trips through any markdown
11
+ tool and syncs as ordinary text.
12
+
13
+ It is built **on top of `../blocks`**, which owns whole-block selection, the gutter
14
+ drag grip, the selection highlight, and the clipboard. The outliner contributes only
15
+ what is hierarchy/markdown-specific: tree parsing, edit constraints, structural
16
+ commands, the drag re-indent rule, and the item menu. See `DESIGN.md` for the
17
+ rebuild rationale and the drag-reindent derivation; this spec is the normative
18
+ behavior.
19
+
20
+ ## Extensions
21
+
22
+ The following extension dialects are used in this document.
23
+
24
+ | Term | URI |
25
+ | -------- | ------------------------- |
26
+ | `module` | `org.dxos.mdl.module@1.0` |
27
+ | `feat` | `org.dxos.mdl.feat@1.0` |
28
+ | `test` | `org.dxos.mdl.test@1.0` |
29
+
30
+ ## Modules
31
+
32
+ `outliner()` composes these modules (source files under `src/extensions/structure/outliner/`);
33
+ selection, drag, highlight, and clipboard come from `../blocks`.
34
+
35
+ ```mdl
36
+ module tree
37
+ desc: |
38
+ Parses the markdown list into an item Tree, recomputed as a facet on doc change. Items expose
39
+ lineRange (own lines), contentRange (text after the marker), level, type, and child/sibling links.
40
+ api:
41
+ Item: interface # { type: 'task'|'bullet'; level; lineRange; contentRange; children; ... }.
42
+ Tree: interface # find(pos) | traverse(item?, cb) | prev/next | siblings | lastDescendant.
43
+ treeFacet: Facet<Tree> # the current parse, read by every other module.
44
+ getRange: (tree, item) => [from, to] # the item's whole subtree span (item + descendants).
45
+ outlinerTree: () => Extension # installs the parser + facet.
46
+ ```
47
+
48
+ ```mdl
49
+ module editor
50
+ desc: |
51
+ A transactionFilter constraining edits to a valid outline: snaps the caret out of the marker into
52
+ the content range, allows whole-line deletes, and guards marker/continuation edits. Seeds an empty
53
+ document with a first item.
54
+ api:
55
+ editor: () => Extension
56
+ ```
57
+
58
+ ```mdl
59
+ module commands
60
+ desc: |
61
+ Keymap + exported structural commands. Indent/outdent and move operate on the whole subtree;
62
+ delete/toggle operate on the action scope (see feat F-6).
63
+ api:
64
+ indentItemMore / indentItemLess: Command # Tab / Shift-Tab — re-indent the caret item + descendants.
65
+ moveItemUp / moveItemDown: Command # swap the item (with its subtree) past a sibling.
66
+ deleteItem: Command # delete the action scope's subtree(s); clears selection.
67
+ toggleTask: Command # toggle the action scope between task and bullet.
68
+ getActionScope: (state) => Item[] # the block selection (subtrees), else the caret item.
69
+ commands: () => Extension # the outliner keymap.
70
+ ```
71
+
72
+ ```mdl
73
+ module dnd
74
+ desc: |
75
+ Adapts `../blocks` drag/selection to the outline: per-item grips, subtree extent, subtree move with
76
+ re-indent, and the drop-level rule. Also the selection commands over blockSelectionField.
77
+ api:
78
+ getBlocks: (state) => Block[] # per-item own-lines (non-overlapping) for grips/ordering.
79
+ getExtent: (state, block) => Block # the block's whole subtree (selection/collapse/preview).
80
+ moveBlocks: (view, sources, dropIndex, indent?) => void # subtree move + re-indent to indent.
81
+ replaceBlocks: (view, indices, text|null) => void # clipboard cut/paste over item lines.
82
+ getDropIndent: (view, sources, dropIndex, pointerY) => { indent, offset } | null # feat F-5 rule.
83
+ selectAllItems / selectNoneItems / selectUp / selectDown: Command # over blockSelectionField.
84
+ outlinerDnd: () => Extension
85
+ ```
86
+
87
+ ```mdl
88
+ module menu
89
+ desc: |
90
+ A floating per-item trigger (⋮) pinned in the right margin, hidden while dragging. Activating it
91
+ opens the host popover; its actions run over the action scope (feat F-6).
92
+ api:
93
+ menu: (options?) => Extension
94
+ ```
95
+
96
+ ## Features
97
+
98
+ ```mdl
99
+ feat F-1: Document model
100
+
101
+ req F-1.1:
102
+ when: text is a markdown list of `- [ ] ` tasks and `- ` bullets, nested by 2-space indentation
103
+ then: it parses to a Tree of items, each with a level, type, own line range, and subtree
104
+
105
+ req F-1.2:
106
+ when: the document changes
107
+ then: the Tree is recomputed and exposed via treeFacet; the document stays valid markdown text
108
+
109
+ req F-1.3:
110
+ when: the document is empty
111
+ then: a first item (`- [ ] `) is seeded and the caret placed in its content
112
+ ```
113
+
114
+ ```mdl
115
+ feat F-2: Editing constraints
116
+
117
+ req F-2.1:
118
+ when: the caret is moved into an item's marker (before its content start)
119
+ then: it snaps to a valid position — content start when moving down/into, content end when moving
120
+ up, the previous line end when moving left across the marker
121
+
122
+ req F-2.2:
123
+ when: a whole item line is deleted
124
+ then: the edit is allowed; marker-internal edits that would break the item are constrained
125
+
126
+ req F-2.3:
127
+ when: task-marker atomicity is required (backspace removing a whole marker, continuation indent)
128
+ then: it is enforced by the markdown keymap that shapes the change, not by raw edits
129
+ ```
130
+
131
+ ```mdl
132
+ feat F-3: Selection (single model, subtree unit)
133
+
134
+ req F-3.1:
135
+ when: an item is selected via grip click / shift-click / keyboard
136
+ then: the sole selection state is blockSelectionField (anchors); there is no second model
137
+
138
+ req F-3.2:
139
+ when: an item is selected or dragged
140
+ then: its visual/operational extent is its whole subtree (getExtent = getRange), so a parent
141
+ covers its descendants
142
+
143
+ req F-3.3:
144
+ when: the caret sits in an item and nothing is selected
145
+ then: a subtle current-item border marks that item's subtree, distinct from the selection accent
146
+ ```
147
+
148
+ ```mdl
149
+ feat F-4: Structural commands
150
+
151
+ req F-4.1:
152
+ when: Tab / Shift-Tab is pressed on an item
153
+ then: the item AND all its descendants re-indent together (the subtree moves with its parent); Tab
154
+ is a no-op with no shallower-or-equal previous item to nest under
155
+
156
+ req F-4.2:
157
+ when: an item is moved up/down
158
+ then: it swaps with the adjacent sibling as whole subtrees
159
+
160
+ req F-4.3:
161
+ when: toggleTask runs
162
+ then: every item in the action scope flips uniformly between task and bullet, preserving indent
163
+ ```
164
+
165
+ ```mdl
166
+ feat F-5: Drag and drop re-indent
167
+
168
+ req F-5.1:
169
+ when: an item is dragged
170
+ then: its whole subtree lifts (collapsed out) and a floating preview follows the pointer; the
171
+ static grip is hidden and the preview carries its own grip; the menu is hidden
172
+
173
+ req F-5.2:
174
+ when: the pointer hovers a drop slot (before target T, with A the item above the slot)
175
+ then: the target level defaults to the dragged item's own level, clamped to
176
+ [sibling-of-T, child-of-A] — it stays in its branch (i)
177
+
178
+ req F-5.3:
179
+ when: the slot is a branch boundary (T shallower than the default) AND the pointer is over T's row
180
+ then: the level drops to a sibling of T — it outdents to leave the branch (ii)
181
+
182
+ req F-5.4:
183
+ when: the target level differs from the source level
184
+ then: the preview shifts horizontally to preview it, and on drop the subtree re-roots to exactly
185
+ that level (preview and result agree)
186
+ ```
187
+
188
+ ```mdl
189
+ feat F-6: Menu / action scope
190
+
191
+ req F-6.1:
192
+ when: a menu command runs with a block selection
193
+ then: it acts over every selected item's whole subtree (the action scope)
194
+
195
+ req F-6.2:
196
+ when: a menu command runs with no selection
197
+ then: it acts over the caret item's subtree
198
+
199
+ req F-6.3:
200
+ when: delete runs
201
+ then: each scope subtree (with its trailing separator) is removed, overlapping ranges merged, and
202
+ the selection cleared — generalizing to any scope-based command
203
+ ```
204
+
205
+ ## Acceptance
206
+
207
+ ```mdl
208
+ test T-indent-subtree
209
+ given: |
210
+ - [ ] A
211
+ - [ ] B
212
+ - [ ] C
213
+ - [ ] D
214
+ when: Tab on "C"
215
+ then: |
216
+ - [ ] A
217
+ - [ ] B
218
+ - [ ] C
219
+ - [ ] D
220
+ tags: [F-4.1]
221
+ ```
222
+
223
+ ```mdl
224
+ test T-drop-stays-in-branch
225
+ given: |
226
+ - A
227
+ - B
228
+ - C
229
+ - D
230
+ when: B is dragged into the slot before D with the pointer above D's row
231
+ then: |
232
+ - A
233
+ - C
234
+ - B
235
+ - D
236
+ tags: [F-5.2]
237
+ ```
238
+
239
+ ```mdl
240
+ test T-drop-outdents-over-target
241
+ given: |
242
+ - A
243
+ - B
244
+ - C
245
+ - D
246
+ when: B is dragged into the slot before D with the pointer over D's row
247
+ then: |
248
+ - A
249
+ - C
250
+ - B
251
+ - D
252
+ tags: [F-5.3]
253
+ ```
254
+
255
+ ```mdl
256
+ test T-delete-subtree
257
+ given: |
258
+ - [ ] 1
259
+ - [ ] 2
260
+ - [ ] 2.1
261
+ - [ ] 2.2
262
+ - [ ] 3
263
+ when: deleteItem with "2" selected (or the caret in it)
264
+ then: |
265
+ - [ ] 1
266
+ - [ ] 3
267
+ tags: [F-6.1, F-6.3]
268
+ ```
269
+
270
+ ---
271
+
272
+ ## Appendix: Extension Definitions
273
+
274
+ ```mdl
275
+ ext module
276
+ uri: org.dxos.mdl.module@1.0
277
+ desc: |
278
+ A source module of the outliner extension (a file under src/extensions/structure/outliner/). The
279
+ file path is inferred from the block name (`commands` -> `commands.ts`). Members are the module's
280
+ public exports.
281
+ fields:
282
+ desc?: Prose
283
+ api: ApiMap # public exports (name: TypeExpr # comment)
284
+ ```
285
+
286
+ ```mdl
287
+ ext feat
288
+ uri: org.dxos.mdl.feat@1.0
289
+ desc: A named feature grouping one or more requirements.
290
+ fields:
291
+ desc?: Prose
292
+ req: RequirementList
293
+ nesting: self
294
+ ```
295
+
296
+ ```mdl
297
+ ext test
298
+ uri: org.dxos.mdl.test@1.0
299
+ desc: An acceptance scenario expressed as given / when / then steps.
300
+ fields:
301
+ given?: Step | Step[]
302
+ when?: Step | Step[]
303
+ then: Step | Step[]
304
+ tags?: TagList
305
+ ```