@dxos/react-ui-editor 0.8.4-main.84f28bd → 0.8.4-main.ae835ea

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 (321) hide show
  1. package/dist/lib/browser/{chunk-22UMM3QJ.mjs → chunk-HL3YF6WC.mjs} +2 -2
  2. package/dist/lib/browser/chunk-HL3YF6WC.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +4225 -3369
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +71 -1
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/browser/types/index.mjs +1 -1
  9. package/dist/lib/node-esm/{chunk-YXYQPV6R.mjs → chunk-YJZGD3LY.mjs} +2 -2
  10. package/dist/lib/node-esm/chunk-YJZGD3LY.mjs.map +7 -0
  11. package/dist/lib/node-esm/index.mjs +4225 -3369
  12. package/dist/lib/node-esm/index.mjs.map +4 -4
  13. package/dist/lib/node-esm/meta.json +1 -1
  14. package/dist/lib/node-esm/testing/index.mjs +71 -1
  15. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  16. package/dist/lib/node-esm/types/index.mjs +1 -1
  17. package/dist/types/src/components/Editor/Editor.d.ts +24 -9
  18. package/dist/types/src/components/Editor/Editor.d.ts.map +1 -1
  19. package/dist/types/src/components/Editor/Editor.stories.d.ts +27 -0
  20. package/dist/types/src/components/Editor/Editor.stories.d.ts.map +1 -0
  21. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +17 -2
  22. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  23. package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
  24. package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
  25. package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
  26. package/dist/types/src/components/EditorToolbar/image.d.ts.map +1 -1
  27. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +1 -1
  28. package/dist/types/src/components/EditorToolbar/search.d.ts.map +1 -1
  29. package/dist/types/src/components/EditorToolbar/util.d.ts +6 -20
  30. package/dist/types/src/components/EditorToolbar/util.d.ts.map +1 -1
  31. package/dist/types/src/components/EditorToolbar/view-mode.d.ts +1 -1
  32. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
  33. package/dist/types/src/components/index.d.ts +0 -1
  34. package/dist/types/src/components/index.d.ts.map +1 -1
  35. package/dist/types/src/defaults.d.ts.map +1 -1
  36. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts +26 -0
  37. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts.map +1 -0
  38. package/dist/types/src/extensions/autocomplete/index.d.ts +5 -0
  39. package/dist/types/src/extensions/autocomplete/index.d.ts.map +1 -0
  40. package/dist/types/src/extensions/autocomplete/match.d.ts +13 -0
  41. package/dist/types/src/extensions/autocomplete/match.d.ts.map +1 -0
  42. package/dist/types/src/extensions/autocomplete/placeholder.d.ts +20 -0
  43. package/dist/types/src/extensions/autocomplete/placeholder.d.ts.map +1 -0
  44. package/dist/types/src/extensions/autocomplete/typeahead.d.ts +10 -0
  45. package/dist/types/src/extensions/autocomplete/typeahead.d.ts.map +1 -0
  46. package/dist/types/src/extensions/automerge/automerge.d.ts +1 -1
  47. package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -1
  48. package/dist/types/src/extensions/automerge/automerge.stories.d.ts +10 -19
  49. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
  50. package/dist/types/src/extensions/automerge/cursor.d.ts +1 -1
  51. package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -1
  52. package/dist/types/src/extensions/automerge/defs.d.ts +1 -1
  53. package/dist/types/src/extensions/automerge/defs.d.ts.map +1 -1
  54. package/dist/types/src/extensions/automerge/sync.d.ts +3 -3
  55. package/dist/types/src/extensions/automerge/sync.d.ts.map +1 -1
  56. package/dist/types/src/extensions/automerge/update-automerge.d.ts +1 -1
  57. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -1
  58. package/dist/types/src/extensions/autoscroll.d.ts +10 -0
  59. package/dist/types/src/extensions/autoscroll.d.ts.map +1 -0
  60. package/dist/types/src/extensions/awareness/awareness-provider.d.ts +1 -1
  61. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +1 -1
  62. package/dist/types/src/extensions/comments.d.ts +1 -1
  63. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  64. package/dist/types/src/extensions/dnd.d.ts.map +1 -1
  65. package/dist/types/src/extensions/factories.d.ts +20 -19
  66. package/dist/types/src/extensions/factories.d.ts.map +1 -1
  67. package/dist/types/src/extensions/focus.d.ts.map +1 -1
  68. package/dist/types/src/extensions/folding.d.ts.map +1 -1
  69. package/dist/types/src/extensions/index.d.ts +4 -1
  70. package/dist/types/src/extensions/index.d.ts.map +1 -1
  71. package/dist/types/src/extensions/json.d.ts +1 -1
  72. package/dist/types/src/extensions/json.d.ts.map +1 -1
  73. package/dist/types/src/extensions/listener.d.ts +8 -6
  74. package/dist/types/src/extensions/listener.d.ts.map +1 -1
  75. package/dist/types/src/extensions/markdown/action.d.ts.map +1 -1
  76. package/dist/types/src/extensions/markdown/bundle.d.ts +8 -2
  77. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
  78. package/dist/types/src/extensions/markdown/changes.d.ts +1 -1
  79. package/dist/types/src/extensions/markdown/changes.d.ts.map +1 -1
  80. package/dist/types/src/extensions/markdown/decorate.d.ts +9 -1
  81. package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
  82. package/dist/types/src/extensions/markdown/formatting.d.ts +2 -3
  83. package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
  84. package/dist/types/src/extensions/markdown/formatting.test.d.ts.map +1 -1
  85. package/dist/types/src/extensions/markdown/highlight.d.ts.map +1 -1
  86. package/dist/types/src/extensions/markdown/image.d.ts.map +1 -1
  87. package/dist/types/src/extensions/markdown/link.d.ts.map +1 -1
  88. package/dist/types/src/extensions/modes.d.ts +1 -1
  89. package/dist/types/src/extensions/modes.d.ts.map +1 -1
  90. package/dist/types/src/extensions/outliner/menu.d.ts +8 -0
  91. package/dist/types/src/extensions/outliner/menu.d.ts.map +1 -0
  92. package/dist/types/src/extensions/outliner/outliner.d.ts +1 -1
  93. package/dist/types/src/extensions/outliner/outliner.d.ts.map +1 -1
  94. package/dist/types/src/extensions/outliner/selection.d.ts.map +1 -1
  95. package/dist/types/src/extensions/outliner/tree.d.ts +2 -2
  96. package/dist/types/src/extensions/outliner/tree.d.ts.map +1 -1
  97. package/dist/types/src/extensions/popover/PopoverMenuProvider.d.ts +36 -0
  98. package/dist/types/src/extensions/popover/PopoverMenuProvider.d.ts.map +1 -0
  99. package/dist/types/src/extensions/popover/index.d.ts +8 -0
  100. package/dist/types/src/extensions/popover/index.d.ts.map +1 -0
  101. package/dist/types/src/extensions/popover/menu-presets.d.ts +4 -0
  102. package/dist/types/src/extensions/popover/menu-presets.d.ts.map +1 -0
  103. package/dist/types/src/extensions/popover/menu.d.ts +24 -0
  104. package/dist/types/src/extensions/popover/menu.d.ts.map +1 -0
  105. package/dist/types/src/extensions/popover/modal.d.ts +7 -0
  106. package/dist/types/src/extensions/popover/modal.d.ts.map +1 -0
  107. package/dist/types/src/extensions/popover/popover.d.ts +47 -0
  108. package/dist/types/src/extensions/popover/popover.d.ts.map +1 -0
  109. package/dist/types/src/extensions/popover/usePopoverMenu.d.ts +34 -0
  110. package/dist/types/src/extensions/popover/usePopoverMenu.d.ts.map +1 -0
  111. package/dist/types/src/extensions/popover/util.d.ts +8 -0
  112. package/dist/types/src/extensions/popover/util.d.ts.map +1 -0
  113. package/dist/types/src/extensions/preview/preview.d.ts +8 -8
  114. package/dist/types/src/extensions/preview/preview.d.ts.map +1 -1
  115. package/dist/types/src/extensions/state.d.ts +2 -0
  116. package/dist/types/src/extensions/state.d.ts.map +1 -0
  117. package/dist/types/src/extensions/tags/extended-markdown.d.ts +10 -0
  118. package/dist/types/src/extensions/tags/extended-markdown.d.ts.map +1 -0
  119. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts +2 -0
  120. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts.map +1 -0
  121. package/dist/types/src/extensions/tags/index.d.ts +4 -0
  122. package/dist/types/src/extensions/tags/index.d.ts.map +1 -0
  123. package/dist/types/src/extensions/tags/streamer.d.ts +12 -0
  124. package/dist/types/src/extensions/tags/streamer.d.ts.map +1 -0
  125. package/dist/types/src/extensions/tags/xml-tags.d.ts +72 -0
  126. package/dist/types/src/extensions/tags/xml-tags.d.ts.map +1 -0
  127. package/dist/types/src/extensions/tags/xml-util.d.ts +10 -0
  128. package/dist/types/src/extensions/tags/xml-util.d.ts.map +1 -0
  129. package/dist/types/src/hooks/useTextEditor.d.ts +4 -8
  130. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  131. package/dist/types/src/stories/CommandDialog.stories.d.ts +14 -0
  132. package/dist/types/src/stories/CommandDialog.stories.d.ts.map +1 -0
  133. package/dist/types/src/stories/Comments.stories.d.ts +21 -10
  134. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  135. package/dist/types/src/stories/EditorToolbar.stories.d.ts +39 -3
  136. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
  137. package/dist/types/src/stories/Experimental.stories.d.ts +22 -13
  138. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
  139. package/dist/types/src/stories/Markdown.stories.d.ts +32 -43
  140. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
  141. package/dist/types/src/stories/Outliner.stories.d.ts +15 -21
  142. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  143. package/dist/types/src/stories/Popover.stories.d.ts +20 -0
  144. package/dist/types/src/stories/Popover.stories.d.ts.map +1 -0
  145. package/dist/types/src/stories/Preview.stories.d.ts +21 -7
  146. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  147. package/dist/types/src/stories/Tags.stories.d.ts +16 -0
  148. package/dist/types/src/stories/Tags.stories.d.ts.map +1 -0
  149. package/dist/types/src/stories/TextEditor.stories.d.ts +37 -52
  150. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  151. package/dist/types/src/stories/components/EditorStory.d.ts +6 -9
  152. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  153. package/dist/types/src/styles/theme.d.ts.map +1 -1
  154. package/dist/types/src/testing/PreviewPopover.d.ts +20 -0
  155. package/dist/types/src/testing/PreviewPopover.d.ts.map +1 -0
  156. package/dist/types/src/testing/index.d.ts +1 -0
  157. package/dist/types/src/testing/index.d.ts.map +1 -1
  158. package/dist/types/src/testing/util.d.ts +1 -0
  159. package/dist/types/src/testing/util.d.ts.map +1 -1
  160. package/dist/types/src/translations.d.ts +1 -1
  161. package/dist/types/src/types/types.d.ts +2 -2
  162. package/dist/types/src/types/types.d.ts.map +1 -1
  163. package/dist/types/src/util/cursor.d.ts.map +1 -1
  164. package/dist/types/src/util/debug.d.ts +1 -1
  165. package/dist/types/src/util/debug.d.ts.map +1 -1
  166. package/dist/types/src/util/decorations.d.ts +4 -0
  167. package/dist/types/src/util/decorations.d.ts.map +1 -0
  168. package/dist/types/src/util/dom.d.ts +2 -12
  169. package/dist/types/src/util/dom.d.ts.map +1 -1
  170. package/dist/types/src/util/index.d.ts +1 -0
  171. package/dist/types/src/util/index.d.ts.map +1 -1
  172. package/dist/types/src/util/react.d.ts +1 -1
  173. package/dist/types/src/util/react.d.ts.map +1 -1
  174. package/dist/types/tsconfig.tsbuildinfo +1 -1
  175. package/package.json +71 -61
  176. package/src/components/Editor/Editor.stories.tsx +69 -0
  177. package/src/components/Editor/Editor.tsx +58 -15
  178. package/src/components/EditorToolbar/EditorToolbar.tsx +104 -93
  179. package/src/components/EditorToolbar/blocks.ts +22 -25
  180. package/src/components/EditorToolbar/formatting.ts +22 -25
  181. package/src/components/EditorToolbar/headings.ts +16 -9
  182. package/src/components/EditorToolbar/image.ts +8 -4
  183. package/src/components/EditorToolbar/lists.ts +16 -19
  184. package/src/components/EditorToolbar/search.ts +8 -4
  185. package/src/components/EditorToolbar/util.ts +18 -23
  186. package/src/components/EditorToolbar/view-mode.ts +11 -6
  187. package/src/components/index.ts +0 -1
  188. package/src/defaults.ts +5 -2
  189. package/src/extensions/autocomplete/autocomplete.ts +220 -0
  190. package/src/extensions/autocomplete/index.ts +8 -0
  191. package/src/extensions/autocomplete/match.ts +46 -0
  192. package/src/extensions/{command → autocomplete}/placeholder.ts +22 -18
  193. package/src/extensions/{command → autocomplete}/typeahead.ts +8 -50
  194. package/src/extensions/automerge/automerge.stories.tsx +31 -24
  195. package/src/extensions/automerge/automerge.ts +31 -11
  196. package/src/extensions/automerge/cursor.ts +1 -1
  197. package/src/extensions/automerge/defs.ts +1 -1
  198. package/src/extensions/automerge/sync.ts +9 -5
  199. package/src/extensions/automerge/update-automerge.ts +2 -2
  200. package/src/extensions/autoscroll.ts +157 -0
  201. package/src/extensions/awareness/awareness-provider.ts +2 -2
  202. package/src/extensions/awareness/awareness.ts +2 -2
  203. package/src/extensions/comments.ts +18 -13
  204. package/src/extensions/dnd.ts +1 -1
  205. package/src/extensions/factories.ts +55 -37
  206. package/src/extensions/focus.ts +5 -4
  207. package/src/extensions/folding.tsx +4 -6
  208. package/src/extensions/hashtag.tsx +2 -2
  209. package/src/extensions/index.ts +4 -1
  210. package/src/extensions/json.ts +1 -1
  211. package/src/extensions/listener.ts +14 -20
  212. package/src/extensions/markdown/action.ts +2 -1
  213. package/src/extensions/markdown/bundle.ts +40 -6
  214. package/src/extensions/markdown/changes.ts +1 -1
  215. package/src/extensions/markdown/decorate.ts +24 -14
  216. package/src/extensions/markdown/formatting.test.ts +6 -6
  217. package/src/extensions/markdown/formatting.ts +11 -11
  218. package/src/extensions/markdown/highlight.ts +1 -1
  219. package/src/extensions/markdown/image.ts +3 -4
  220. package/src/extensions/markdown/link.ts +3 -0
  221. package/src/extensions/markdown/table.ts +7 -1
  222. package/src/extensions/mention.ts +1 -1
  223. package/src/extensions/modes.ts +2 -2
  224. package/src/extensions/{command/floating-menu.ts → outliner/menu.ts} +16 -21
  225. package/src/extensions/outliner/outliner.test.ts +3 -2
  226. package/src/extensions/outliner/outliner.ts +7 -6
  227. package/src/extensions/outliner/selection.ts +1 -1
  228. package/src/extensions/outliner/tree.test.ts +2 -1
  229. package/src/extensions/outliner/tree.ts +2 -2
  230. package/src/extensions/popover/PopoverMenuProvider.tsx +220 -0
  231. package/src/extensions/popover/index.ts +12 -0
  232. package/src/extensions/popover/menu-presets.ts +124 -0
  233. package/src/extensions/popover/menu.ts +67 -0
  234. package/src/extensions/popover/modal.ts +24 -0
  235. package/src/extensions/popover/popover.ts +289 -0
  236. package/src/extensions/popover/usePopoverMenu.ts +173 -0
  237. package/src/extensions/popover/util.ts +29 -0
  238. package/src/extensions/preview/index.ts +1 -1
  239. package/src/extensions/preview/preview.ts +67 -67
  240. package/src/extensions/selection.ts +2 -2
  241. package/src/extensions/state.ts +7 -0
  242. package/src/extensions/tags/extended-markdown.test.ts +261 -0
  243. package/src/extensions/tags/extended-markdown.ts +78 -0
  244. package/src/extensions/tags/index.ts +7 -0
  245. package/src/extensions/tags/streamer.ts +243 -0
  246. package/src/extensions/tags/xml-tags.ts +393 -0
  247. package/src/extensions/tags/xml-util.ts +94 -0
  248. package/src/hooks/useTextEditor.ts +27 -39
  249. package/src/stories/CommandDialog.stories.tsx +78 -0
  250. package/src/stories/Comments.stories.tsx +14 -10
  251. package/src/stories/EditorToolbar.stories.tsx +17 -17
  252. package/src/stories/Experimental.stories.tsx +17 -13
  253. package/src/stories/Markdown.stories.tsx +25 -21
  254. package/src/stories/Outliner.stories.tsx +54 -35
  255. package/src/stories/Popover.stories.tsx +163 -0
  256. package/src/stories/Preview.stories.tsx +49 -41
  257. package/src/stories/Tags.stories.tsx +81 -0
  258. package/src/stories/TextEditor.stories.tsx +41 -60
  259. package/src/stories/components/EditorStory.tsx +17 -16
  260. package/src/styles/theme.ts +18 -15
  261. package/src/testing/PreviewPopover.tsx +80 -0
  262. package/src/testing/index.ts +1 -0
  263. package/src/testing/util.ts +2 -0
  264. package/src/translations.ts +1 -1
  265. package/src/types/types.ts +1 -1
  266. package/src/util/cursor.ts +2 -1
  267. package/src/util/debug.ts +2 -2
  268. package/src/util/decorations.ts +21 -0
  269. package/src/util/dom.ts +5 -27
  270. package/src/util/index.ts +1 -0
  271. package/src/util/react.tsx +1 -1
  272. package/dist/lib/browser/chunk-22UMM3QJ.mjs.map +0 -7
  273. package/dist/lib/node-esm/chunk-YXYQPV6R.mjs.map +0 -7
  274. package/dist/types/src/components/Popover/CommandMenu.d.ts +0 -34
  275. package/dist/types/src/components/Popover/CommandMenu.d.ts.map +0 -1
  276. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts +0 -21
  277. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts.map +0 -1
  278. package/dist/types/src/components/Popover/RefPopover.d.ts +0 -34
  279. package/dist/types/src/components/Popover/RefPopover.d.ts.map +0 -1
  280. package/dist/types/src/components/Popover/index.d.ts +0 -4
  281. package/dist/types/src/components/Popover/index.d.ts.map +0 -1
  282. package/dist/types/src/extensions/autocomplete.d.ts +0 -13
  283. package/dist/types/src/extensions/autocomplete.d.ts.map +0 -1
  284. package/dist/types/src/extensions/command/action.d.ts +0 -17
  285. package/dist/types/src/extensions/command/action.d.ts.map +0 -1
  286. package/dist/types/src/extensions/command/command-menu.d.ts +0 -20
  287. package/dist/types/src/extensions/command/command-menu.d.ts.map +0 -1
  288. package/dist/types/src/extensions/command/command.d.ts +0 -6
  289. package/dist/types/src/extensions/command/command.d.ts.map +0 -1
  290. package/dist/types/src/extensions/command/floating-menu.d.ts +0 -7
  291. package/dist/types/src/extensions/command/floating-menu.d.ts.map +0 -1
  292. package/dist/types/src/extensions/command/hint.d.ts +0 -24
  293. package/dist/types/src/extensions/command/hint.d.ts.map +0 -1
  294. package/dist/types/src/extensions/command/index.d.ts +0 -7
  295. package/dist/types/src/extensions/command/index.d.ts.map +0 -1
  296. package/dist/types/src/extensions/command/placeholder.d.ts +0 -10
  297. package/dist/types/src/extensions/command/placeholder.d.ts.map +0 -1
  298. package/dist/types/src/extensions/command/state.d.ts +0 -16
  299. package/dist/types/src/extensions/command/state.d.ts.map +0 -1
  300. package/dist/types/src/extensions/command/typeahead.d.ts +0 -22
  301. package/dist/types/src/extensions/command/typeahead.d.ts.map +0 -1
  302. package/dist/types/src/extensions/command/useCommandMenu.d.ts +0 -26
  303. package/dist/types/src/extensions/command/useCommandMenu.d.ts.map +0 -1
  304. package/dist/types/src/stories/Command.stories.d.ts +0 -7
  305. package/dist/types/src/stories/Command.stories.d.ts.map +0 -1
  306. package/dist/types/src/stories/CommandMenu.stories.d.ts +0 -13
  307. package/dist/types/src/stories/CommandMenu.stories.d.ts.map +0 -1
  308. package/src/components/Popover/CommandMenu.tsx +0 -279
  309. package/src/components/Popover/RefDropdownMenu.tsx +0 -85
  310. package/src/components/Popover/RefPopover.tsx +0 -99
  311. package/src/components/Popover/index.ts +0 -7
  312. package/src/extensions/autocomplete.ts +0 -69
  313. package/src/extensions/command/action.ts +0 -56
  314. package/src/extensions/command/command-menu.ts +0 -210
  315. package/src/extensions/command/command.ts +0 -34
  316. package/src/extensions/command/hint.ts +0 -102
  317. package/src/extensions/command/index.ts +0 -10
  318. package/src/extensions/command/state.ts +0 -89
  319. package/src/extensions/command/useCommandMenu.ts +0 -118
  320. package/src/stories/Command.stories.tsx +0 -97
  321. package/src/stories/CommandMenu.stories.tsx +0 -159
@@ -2,32 +2,17 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { javascript } from '@codemirror/lang-javascript';
8
6
  import { openSearchPanel } from '@codemirror/search';
7
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
9
8
  import React from 'react';
10
9
 
11
10
  import { log } from '@dxos/log';
12
- import { withLayout, withTheme, type Meta } from '@dxos/storybook-utils';
11
+ import { withTheme } from '@dxos/react-ui/testing';
13
12
 
14
- import {
15
- EditorStory,
16
- allExtensions,
17
- content,
18
- defaultExtensions,
19
- global,
20
- largeWithImages,
21
- links,
22
- longText,
23
- names,
24
- renderLinkButton,
25
- text,
26
- } from './components';
27
13
  import { editorMonospace } from '../defaults';
28
14
  import {
29
15
  InputModeExtensions,
30
- autocomplete,
31
16
  decorateMarkdown,
32
17
  folding,
33
18
  image,
@@ -39,12 +24,27 @@ import {
39
24
  } from '../extensions';
40
25
  import { str } from '../testing';
41
26
 
42
- const meta: Meta<typeof EditorStory> = {
27
+ import {
28
+ EditorStory,
29
+ allExtensions,
30
+ content,
31
+ defaultExtensions,
32
+ global,
33
+ largeWithImages,
34
+ longText,
35
+ names,
36
+ text,
37
+ } from './components';
38
+
39
+ const meta = {
43
40
  title: 'ui/react-ui-editor/TextEditor',
44
41
  component: EditorStory,
45
- decorators: [withTheme, withLayout({ fullscreen: true })],
46
- parameters: { layout: 'fullscreen', controls: { disable: true } },
47
- };
42
+ decorators: [withTheme],
43
+ parameters: {
44
+ layout: 'fullscreen',
45
+ controls: { disable: true },
46
+ },
47
+ } satisfies Meta<typeof EditorStory>;
48
48
 
49
49
  export default meta;
50
50
 
@@ -52,7 +52,9 @@ export default meta;
52
52
  // Default
53
53
  //
54
54
 
55
- export const Default = {
55
+ type Story = StoryObj<typeof meta>;
56
+
57
+ export const Default: Story = {
56
58
  render: () => <EditorStory text={text} extensions={defaultExtensions} />,
57
59
  };
58
60
 
@@ -60,7 +62,7 @@ export const Default = {
60
62
  // Everything
61
63
  //
62
64
 
63
- export const Everything = {
65
+ export const Everything: Story = {
64
66
  render: () => <EditorStory text={text} extensions={allExtensions} selection={{ anchor: 99, head: 110 }} />,
65
67
  };
66
68
 
@@ -68,7 +70,7 @@ export const Everything = {
68
70
  // Empty
69
71
  //
70
72
 
71
- export const Empty = {
73
+ export const Empty: Story = {
72
74
  render: () => <EditorStory extensions={defaultExtensions} />,
73
75
  };
74
76
 
@@ -76,7 +78,7 @@ export const Empty = {
76
78
  // Readonly
77
79
  //
78
80
 
79
- export const Readonly = {
81
+ export const Readonly: Story = {
80
82
  render: () => <EditorStory text={text} extensions={defaultExtensions} readOnly />,
81
83
  };
82
84
 
@@ -84,7 +86,7 @@ export const Readonly = {
84
86
  // No Extensions
85
87
  //
86
88
 
87
- export const NoExtensions = {
89
+ export const NoExtensions: Story = {
88
90
  render: () => <EditorStory text={text} />,
89
91
  };
90
92
 
@@ -92,7 +94,7 @@ export const NoExtensions = {
92
94
  // Vim
93
95
  //
94
96
 
95
- export const Vim = {
97
+ export const Vim: Story = {
96
98
  render: () => (
97
99
  <EditorStory
98
100
  text={str('# Vim Mode', '', 'The distant future. The year 2000.', '', content.paragraphs)}
@@ -105,16 +107,16 @@ export const Vim = {
105
107
  // Listener
106
108
  //
107
109
 
108
- export const Listener = {
110
+ export const Listener: Story = {
109
111
  render: () => (
110
112
  <EditorStory
111
113
  text={str('# Listener', '', content.footer)}
112
114
  extensions={[
113
115
  listener({
114
- onFocus: (focusing) => {
116
+ onFocus: ({ focusing }) => {
115
117
  log.info('listener', { focusing });
116
118
  },
117
- onChange: (text) => {
119
+ onChange: ({ text }) => {
118
120
  log.info('listener', { text });
119
121
  },
120
122
  }),
@@ -127,7 +129,7 @@ export const Listener = {
127
129
  // Folding
128
130
  //
129
131
 
130
- export const Folding = {
132
+ export const Folding: Story = {
131
133
  render: () => <EditorStory text={text} extensions={[folding()]} />,
132
134
  };
133
135
 
@@ -135,7 +137,7 @@ export const Folding = {
135
137
  // Scrolling
136
138
  //
137
139
 
138
- export const Scrolling = {
140
+ export const Scrolling: Story = {
139
141
  render: () => (
140
142
  <EditorStory
141
143
  text={str('# Large Document', '', longText)}
@@ -147,13 +149,13 @@ export const Scrolling = {
147
149
  ),
148
150
  };
149
151
 
150
- export const ScrollingWithImages = {
152
+ export const ScrollingWithImages: Story = {
151
153
  render: () => (
152
154
  <EditorStory text={str('# Large Document', '', largeWithImages)} extensions={[decorateMarkdown(), image()]} />
153
155
  ),
154
156
  };
155
157
 
156
- export const ScrollTo = {
158
+ export const ScrollTo: Story = {
157
159
  render: () => {
158
160
  // NOTE: Selection won't appear if text is reformatted.
159
161
  const word = 'Scroll to here...';
@@ -174,7 +176,7 @@ export const ScrollTo = {
174
176
  // Typescript
175
177
  //
176
178
 
177
- export const Typescript = {
179
+ export const Typescript: Story = {
178
180
  render: () => (
179
181
  <EditorStory
180
182
  text={content.typescript}
@@ -184,38 +186,17 @@ export const Typescript = {
184
186
  ),
185
187
  };
186
188
 
187
- //
188
- // Autocomplete
189
- //
190
-
191
- export const Autocomplete = {
192
- render: () => (
193
- <EditorStory
194
- text={str('# Autocomplete', '', 'Press Ctrl-Space...', content.footer)}
195
- extensions={[
196
- decorateMarkdown({ renderLinkButton }),
197
- autocomplete({
198
- onSearch: (text) => {
199
- return links.filter(({ label }) => label.toLowerCase().includes(text.toLowerCase()));
200
- },
201
- }),
202
- ]}
203
- />
204
- ),
205
- };
206
-
207
189
  //
208
190
  // Typeahead
209
191
  //
210
192
 
211
- const completions = ['type', 'AND', 'OR', 'NOT', 'dxos.org'];
193
+ const completions = ['hello world!', 'dxos.org'];
212
194
 
213
- export const Typeahead = {
195
+ export const Typeahead: Story = {
214
196
  render: () => (
215
197
  <EditorStory
216
198
  text={str('# Typeahead', '')}
217
199
  extensions={[
218
- decorateMarkdown({ renderLinkButton }),
219
200
  typeahead({
220
201
  onComplete: staticCompletion(completions, { minLength: 2 }),
221
202
  }),
@@ -228,7 +209,7 @@ export const Typeahead = {
228
209
  // Mention
229
210
  //
230
211
 
231
- export const Mention = {
212
+ export const Mention: Story = {
232
213
  render: () => (
233
214
  <EditorStory
234
215
  text={str('# Mention', '', 'Type @...', content.footer)}
@@ -245,7 +226,7 @@ export const Mention = {
245
226
  // Search
246
227
  //
247
228
 
248
- export const Search = {
229
+ export const Search: Story = {
249
230
  render: () => (
250
231
  <EditorStory
251
232
  text={str('# Search', text)}
@@ -3,39 +3,39 @@
3
3
  //
4
4
 
5
5
  import { type EditorView } from '@codemirror/view';
6
- import React, { type ReactNode, forwardRef, useEffect, useState, useImperativeHandle, useMemo } from 'react';
6
+ import React, { type ReactNode, forwardRef, useEffect, useImperativeHandle, useMemo, useState } from 'react';
7
7
 
8
- import { Expando } from '@dxos/echo-schema';
8
+ import { createDocAccessor, createObject } from '@dxos/client/echo';
9
+ import { Expando } from '@dxos/echo/internal';
10
+ import { live } from '@dxos/echo/internal';
9
11
  import { invariant } from '@dxos/invariant';
10
12
  import { PublicKey } from '@dxos/keys';
11
- import { live } from '@dxos/live-object';
12
- import { createDocAccessor, createObject } from '@dxos/react-client/echo';
13
13
  import { useForwardedRef, useThemeContext } from '@dxos/react-ui';
14
14
  import { useAttentionAttributes } from '@dxos/react-ui-attention';
15
15
  import { JsonFilter } from '@dxos/react-ui-syntax-highlighter';
16
16
  import { mx } from '@dxos/react-ui-theme';
17
17
  import { isNonNullable } from '@dxos/util';
18
18
 
19
- import { editorSlots, editorGutter } from '../../defaults';
19
+ import { editorGutter, editorSlots } from '../../defaults';
20
20
  import {
21
21
  type DebugNode,
22
22
  type ThemeExtensionsOptions,
23
- createDataExtensions,
24
23
  createBasicExtensions,
24
+ createDataExtensions,
25
25
  createMarkdownExtensions,
26
26
  createThemeExtensions,
27
27
  debugTree,
28
+ decorateMarkdown,
28
29
  } from '../../extensions';
29
- import { useTextEditor, type UseTextEditorProps } from '../../hooks';
30
+ import { type UseTextEditorProps, useTextEditor } from '../../hooks';
30
31
 
31
32
  // Type definitions.
32
33
  export type DebugMode = 'raw' | 'tree' | 'raw+tree';
33
34
 
34
35
  const defaultId = 'editor-' + PublicKey.random().toHex().slice(0, 8);
35
36
 
36
- export type StoryProps = Pick<UseTextEditorProps, 'scrollTo' | 'selection' | 'extensions'> &
37
+ export type StoryProps = Pick<UseTextEditorProps, 'id' | 'scrollTo' | 'selection' | 'extensions'> &
37
38
  Pick<ThemeExtensionsOptions, 'slots'> & {
38
- id?: string;
39
39
  debug?: DebugMode;
40
40
  debugCustom?: (view: EditorView) => ReactNode;
41
41
  text?: string;
@@ -46,18 +46,18 @@ export type StoryProps = Pick<UseTextEditorProps, 'scrollTo' | 'selection' | 'ex
46
46
  onReady?: (view: EditorView) => void;
47
47
  };
48
48
 
49
- export const EditorStory = forwardRef<EditorView | undefined, StoryProps>(
49
+ export const EditorStory = forwardRef<EditorView | null, StoryProps>(
50
50
  ({ debug, debugCustom, text, extensions: _extensions, ...props }, forwardedRef) => {
51
- const attentionAttrs = useAttentionAttributes('testing');
51
+ const attentionAttrs = useAttentionAttributes('test-panel');
52
52
  const [tree, setTree] = useState<DebugNode>();
53
53
  const [object] = useState(createObject(live(Expando, { content: text ?? '' })));
54
54
  const viewRef = useForwardedRef(forwardedRef);
55
- const view = viewRef.current;
56
55
  const extensions = useMemo(
57
56
  () => (debug ? [_extensions, debugTree(setTree)].filter(isNonNullable) : _extensions),
58
57
  [debug, _extensions],
59
58
  );
60
59
 
60
+ const view = viewRef.current;
61
61
  return (
62
62
  <div className={mx('w-full h-full grid overflow-hidden', debug && 'grid-cols-2 lg:grid-cols-[1fr_600px]')}>
63
63
  <EditorComponent ref={viewRef} object={object} text={text} extensions={extensions} {...props} />
@@ -84,7 +84,7 @@ export const EditorStory = forwardRef<EditorView | undefined, StoryProps>(
84
84
  /**
85
85
  * Default story component.
86
86
  */
87
- export const EditorComponent = forwardRef<EditorView | undefined, StoryProps>(
87
+ export const EditorComponent = forwardRef<EditorView | null, StoryProps>(
88
88
  (
89
89
  {
90
90
  id = defaultId,
@@ -112,9 +112,10 @@ export const EditorComponent = forwardRef<EditorView | undefined, StoryProps>(
112
112
  initialValue: text,
113
113
  extensions: [
114
114
  createDataExtensions({ id, text: createDocAccessor(object, ['content']) }),
115
- createBasicExtensions({ readOnly, placeholder, lineNumbers, scrollPastEnd: true }),
116
- createMarkdownExtensions({ themeMode }),
115
+ createBasicExtensions({ readOnly, placeholder, lineNumbers, scrollPastEnd: true, search: true }),
116
+ createMarkdownExtensions(),
117
117
  createThemeExtensions({ themeMode, syntaxHighlighting: true, slots }),
118
+ decorateMarkdown(),
118
119
  editorGutter,
119
120
  extensions || [],
120
121
  ],
@@ -122,7 +123,7 @@ export const EditorComponent = forwardRef<EditorView | undefined, StoryProps>(
122
123
  [id, object, extensions, themeMode],
123
124
  );
124
125
 
125
- useImperativeHandle(forwardedRef, () => view, [view]);
126
+ useImperativeHandle<EditorView | null, EditorView | null>(forwardedRef, () => view, [view]);
126
127
 
127
128
  useEffect(() => {
128
129
  if (view) {
@@ -64,7 +64,7 @@ export const defaultTheme: ThemeStyles = {
64
64
  fontFamily: fontBody,
65
65
  // NOTE: Base font size (otherwise defined by HTML tag, which might be different for storybook).
66
66
  fontSize: '16px',
67
- lineHeight: 1.5,
67
+ lineHeight: '24px',
68
68
  color: 'unset',
69
69
  },
70
70
 
@@ -74,22 +74,21 @@ export const defaultTheme: ThemeStyles = {
74
74
  */
75
75
  '.cm-gutters': {
76
76
  borderRight: 'none',
77
- background: 'transparent',
78
77
  },
79
78
  '.cm-gutter': {},
80
79
  '.cm-gutter.cm-lineNumbers': {
81
80
  paddingRight: '4px',
82
- borderRight: '1px solid var(--dx-separator)',
81
+ borderRight: '1px solid var(--dx-subduedSeparator)',
82
+ color: 'var(--dx-subduedText)',
83
83
  },
84
84
  '.cm-gutter.cm-lineNumbers .cm-gutterElement': {
85
85
  minWidth: '40px',
86
- alignContent: 'center',
87
86
  },
88
87
  /**
89
- * Height is set to match the corresponding line.
88
+ * Height is set to match the corresponding line (which may have wrapped).
90
89
  */
91
90
  '.cm-gutterElement': {
92
- alignItems: 'center',
91
+ lineHeight: '24px',
93
92
  fontSize: '12px',
94
93
  },
95
94
 
@@ -97,6 +96,7 @@ export const defaultTheme: ThemeStyles = {
97
96
  * Line.
98
97
  */
99
98
  '.cm-line': {
99
+ lineHeight: '24px',
100
100
  paddingInline: 0,
101
101
  },
102
102
  '.cm-activeLine': {
@@ -110,6 +110,7 @@ export const defaultTheme: ThemeStyles = {
110
110
  borderLeft: '2px solid var(--dx-cmCursor)',
111
111
  },
112
112
  '.cm-placeholder': {
113
+ fontFamily: fontBody,
113
114
  color: 'var(--dx-placeholder)',
114
115
  },
115
116
 
@@ -165,10 +166,10 @@ export const defaultTheme: ThemeStyles = {
165
166
  * https://github.com/codemirror/autocomplete/blob/main/src/completion.ts
166
167
  */
167
168
  '.cm-tooltip.cm-tooltip-autocomplete': {
168
- marginTop: '4px',
169
- marginLeft: '-3px',
170
- borderColor: 'var(--dx-separator)',
171
- borderTop: 'none',
169
+ marginTop: '6px',
170
+ marginLeft: '-10px',
171
+ border: '2px solid var(--dx-separator)',
172
+ borderRadius: '4px',
172
173
  },
173
174
  '.cm-tooltip.cm-tooltip-autocomplete > ul': {
174
175
  maxHeight: '20em',
@@ -177,12 +178,12 @@ export const defaultTheme: ThemeStyles = {
177
178
  padding: '4px',
178
179
  },
179
180
  '.cm-tooltip.cm-tooltip-autocomplete > ul > li[aria-selected]': {
180
- background: 'var(--dx-hoverSurface)',
181
+ background: 'var(--dx-activeSurface)',
182
+ color: 'var(--dx-activeSurfaceText)',
181
183
  },
182
184
  '.cm-tooltip.cm-tooltip-autocomplete > ul > completion-section': {
183
185
  paddingLeft: '4px !important',
184
- borderBottom: 'none !important',
185
- color: 'var(--dx-accentText)',
186
+ color: 'var(--dx-hoverSurfaceText)',
186
187
  },
187
188
 
188
189
  '.cm-completionInfo': {
@@ -196,10 +197,12 @@ export const defaultTheme: ThemeStyles = {
196
197
  },
197
198
  '.cm-completionLabel': {
198
199
  fontFamily: fontBody,
200
+ color: 'var(--dx-description)',
201
+ padding: '0 4px',
199
202
  },
200
203
  '.cm-completionMatchedText': {
201
204
  textDecoration: 'none !important',
202
- opacity: 0.5,
205
+ color: 'var(--dx-baseText)',
203
206
  },
204
207
 
205
208
  /**
@@ -233,7 +236,7 @@ export const defaultTheme: ThemeStyles = {
233
236
  outline: '1px solid transparent',
234
237
  },
235
238
  '.cm-panel input, .cm-panel button': {
236
- backgroundColor: 'var(--dx-input)',
239
+ backgroundColor: 'var(--dx-inputSurface)',
237
240
  },
238
241
  '.cm-panel input:focus, .cm-panel button:focus': {
239
242
  outline: '1px solid var(--dx-neutralFocusIndicator)',
@@ -0,0 +1,80 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { createContext } from '@radix-ui/react-context';
6
+ import React, { type PropsWithChildren, type RefObject, useCallback, useEffect, useRef, useState } from 'react';
7
+
8
+ import { addEventListener } from '@dxos/async';
9
+ import { type DxAnchorActivate, Popover } from '@dxos/react-ui';
10
+
11
+ import { type PreviewLinkRef, type PreviewLinkTarget } from '../extensions';
12
+
13
+ type PreviewLookup = (link: PreviewLinkRef) => Promise<PreviewLinkTarget | null | undefined>;
14
+
15
+ type PreviewPopoverValue = Partial<{
16
+ link: PreviewLinkRef;
17
+ target: PreviewLinkTarget;
18
+ pending: boolean;
19
+ }>;
20
+
21
+ const [PreviewPopoverContextProvider, usePreviewPopover] = createContext<PreviewPopoverValue>('PreviewPopover', {});
22
+
23
+ type PopoverLookupProviderProps = PropsWithChildren<{
24
+ onLookup?: PreviewLookup;
25
+ }>;
26
+
27
+ // TOOD(burdon): Reconcile with PreviewPlugin?
28
+ const PreviewPopoverProvider = ({ children, onLookup }: PopoverLookupProviderProps) => {
29
+ const trigger = useRef<HTMLElement | null>(null);
30
+ const [value, setValue] = useState<PreviewPopoverValue>({});
31
+ const [open, setOpen] = useState(false);
32
+
33
+ const handleDxAnchorActivate = useCallback(
34
+ (event: DxAnchorActivate) => {
35
+ const { refId, label, trigger: dxTrigger } = event;
36
+ setValue((value) => ({
37
+ ...value,
38
+ link: { label, ref: refId },
39
+ pending: true,
40
+ }));
41
+ trigger.current = dxTrigger;
42
+ queueMicrotask(() => setOpen(true));
43
+ void onLookup?.({ label, ref: refId }).then((target) =>
44
+ setValue((value) => ({
45
+ ...value,
46
+ target: target ?? undefined,
47
+ pending: false,
48
+ })),
49
+ );
50
+ },
51
+ [onLookup],
52
+ );
53
+
54
+ const [rootRef, setRootRef] = useState<HTMLDivElement | null>(null);
55
+ useEffect(() => {
56
+ if (!rootRef || !handleDxAnchorActivate) {
57
+ return;
58
+ }
59
+
60
+ return addEventListener(rootRef, 'dx-anchor-activate' as any, handleDxAnchorActivate, {
61
+ capture: true,
62
+ passive: false,
63
+ });
64
+ }, [rootRef, handleDxAnchorActivate]);
65
+
66
+ return (
67
+ <PreviewPopoverContextProvider pending={value.pending} link={value.link} target={value.target}>
68
+ <Popover.Root open={open} onOpenChange={setOpen}>
69
+ <Popover.VirtualTrigger virtualRef={trigger as unknown as RefObject<HTMLButtonElement>} />
70
+ <div role='none' className='contents' ref={setRootRef}>
71
+ {children}
72
+ </div>
73
+ </Popover.Root>
74
+ </PreviewPopoverContextProvider>
75
+ );
76
+ };
77
+
78
+ export { PreviewPopoverProvider, usePreviewPopover };
79
+
80
+ export type { PopoverLookupProviderProps, PreviewPopoverValue };
@@ -3,3 +3,4 @@
3
3
  //
4
4
 
5
5
  export * from './util';
6
+ export * from './PreviewPopover';
@@ -2,4 +2,6 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ /** deprecated Replace with @dxos/util trim */
6
+ // TODO(burdon): Remove
5
7
  export const str = (...lines: string[]) => lines.join('\n');
@@ -24,8 +24,8 @@ export const translations = [
24
24
  'selection overlaps existing comment label': 'Selection overlaps existing comment',
25
25
  'select text to comment label': 'Select text to comment',
26
26
  'image label': 'Insert image',
27
- 'heading label': 'Heading level',
28
27
  'table label': 'Create table',
28
+ 'heading label': 'Heading level',
29
29
  'heading level label_zero': 'Paragraph',
30
30
  'heading level label_one': 'Heading level {{count}}',
31
31
  'heading level label_other': 'Heading level {{count}}',
@@ -3,7 +3,7 @@
3
3
  //
4
4
 
5
5
  import { type EditorView } from '@codemirror/view';
6
- import { Schema } from 'effect';
6
+ import * as Schema from 'effect/Schema';
7
7
 
8
8
  // Runtime data structure.
9
9
  export type Range = {
@@ -4,9 +4,10 @@
4
4
 
5
5
  import { type EditorState } from '@codemirror/state';
6
6
 
7
- import { singleValueFacet } from './facet';
8
7
  import { type Range } from '../types';
9
8
 
9
+ import { singleValueFacet } from './facet';
10
+
10
11
  /**
11
12
  * Determines if two ranges overlap.
12
13
  * A range is considered to overlap if there is any intersection
package/src/util/debug.ts CHANGED
@@ -7,12 +7,12 @@ import { type EditorView } from '@codemirror/view';
7
7
 
8
8
  import { log } from '@dxos/log';
9
9
 
10
- export const wrapWithCatch = (fn: (...args: any[]) => any) => {
10
+ export const wrapWithCatch = (fn: (...args: any[]) => any, label?: string) => {
11
11
  return (...args: any[]) => {
12
12
  try {
13
13
  return fn(...args);
14
14
  } catch (err) {
15
- log.catch(err);
15
+ log.catch(err, { label });
16
16
  }
17
17
  };
18
18
  };
@@ -0,0 +1,21 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Range } from '@codemirror/state';
6
+ import { type Decoration, type DecorationSet } from '@codemirror/view';
7
+
8
+ export const decorationSetToArray = (deco: DecorationSet): readonly Range<Decoration>[] => {
9
+ const ranges: Range<Decoration>[] = [];
10
+ const iter = deco.iter();
11
+ while (iter.value) {
12
+ ranges.push({
13
+ from: iter.from,
14
+ to: iter.to,
15
+ value: iter.value,
16
+ });
17
+ iter.next();
18
+ }
19
+
20
+ return ranges;
21
+ };
package/src/util/dom.ts CHANGED
@@ -2,30 +2,28 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- // Copied from @codemirror/view
6
-
7
- export interface Rect {
5
+ export type Rect = {
8
6
  readonly left: number;
9
7
  readonly right: number;
10
8
  readonly top: number;
11
9
  readonly bottom: number;
12
- }
10
+ };
13
11
 
14
- export const flattenRect = (rect: Rect, left: boolean) => {
12
+ export const flattenRect = (rect: Rect, left: boolean): Rect => {
15
13
  const x = left ? rect.left : rect.right;
16
14
  return { left: x, right: x, top: rect.top, bottom: rect.bottom };
17
15
  };
18
16
 
19
17
  let scratchRange: Range | null;
20
18
 
21
- export const textRange = (node: Text, from: number, to = from) => {
19
+ export const textRange = (node: Text, from: number, to = from): Range => {
22
20
  const range = scratchRange || (scratchRange = document.createRange());
23
21
  range.setEnd(node, to);
24
22
  range.setStart(node, from);
25
23
  return range;
26
24
  };
27
25
 
28
- export const clientRectsFor = (dom: Node) => {
26
+ export const clientRectsFor = (dom: Node): DOMRectList => {
29
27
  if (dom.nodeType === 3) {
30
28
  return textRange(dom as Text, 0, dom.nodeValue!.length).getClientRects();
31
29
  } else if (dom.nodeType === 1) {
@@ -34,23 +32,3 @@ export const clientRectsFor = (dom: Node) => {
34
32
  return [] as any as DOMRectList;
35
33
  }
36
34
  };
37
-
38
- export type ElementOptions = {
39
- className?: string;
40
- text?: string;
41
- };
42
-
43
- export const createElement = (tag: string, options?: ElementOptions, children?: HTMLElement[]): HTMLElement => {
44
- const el = document.createElement(tag);
45
- if (options?.className) {
46
- el.className = options.className;
47
- }
48
- if (options?.text) {
49
- el.textContent = options.text;
50
- }
51
- if (children) {
52
- el.append(...(Array.isArray(children) ? children : [children]));
53
- }
54
-
55
- return el;
56
- };
package/src/util/index.ts CHANGED
@@ -3,6 +3,7 @@
3
3
  //
4
4
 
5
5
  export * from './cursor';
6
+ export * from './decorations';
6
7
  export * from './debug';
7
8
  export * from './dom';
8
9
  export * from './facet';