@dxos/plugin-markdown 0.8.4-main.f5c0578 → 0.8.4-main.fcfe5033a5

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 (333) hide show
  1. package/dist/lib/browser/MarkdownSettings-62YSRY7L.mjs +32 -0
  2. package/dist/lib/browser/MarkdownSettings-62YSRY7L.mjs.map +7 -0
  3. package/dist/lib/browser/blueprints/index.mjs +51 -0
  4. package/dist/lib/browser/blueprints/index.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-4KOZEH2H.mjs +121 -0
  6. package/dist/lib/browser/chunk-4KOZEH2H.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  8. package/dist/lib/browser/chunk-J5LGTIGS.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-QFPZONKP.mjs +158 -0
  10. package/dist/lib/browser/chunk-QFPZONKP.mjs.map +7 -0
  11. package/dist/lib/browser/cli/index.mjs +39 -0
  12. package/dist/lib/browser/cli/index.mjs.map +7 -0
  13. package/dist/lib/browser/create-YL5ELZWP.mjs +30 -0
  14. package/dist/lib/browser/create-YL5ELZWP.mjs.map +7 -0
  15. package/dist/lib/browser/create-markdown-LU5IDKMH.mjs +22 -0
  16. package/dist/lib/browser/create-markdown-LU5IDKMH.mjs.map +7 -0
  17. package/dist/lib/browser/index.mjs +612 -138
  18. package/dist/lib/browser/index.mjs.map +4 -4
  19. package/dist/lib/browser/meta.json +1 -1
  20. package/dist/lib/browser/open-AFSOZZ6G.mjs +21 -0
  21. package/dist/lib/browser/open-AFSOZZ6G.mjs.map +7 -0
  22. package/dist/lib/browser/operations/index.mjs +14 -0
  23. package/dist/lib/browser/operations/index.mjs.map +7 -0
  24. package/dist/lib/browser/scroll-to-anchor-IPXV32A6.mjs +49 -0
  25. package/dist/lib/browser/scroll-to-anchor-IPXV32A6.mjs.map +7 -0
  26. package/dist/lib/browser/set-view-mode-2QWB24RR.mjs +26 -0
  27. package/dist/lib/browser/set-view-mode-2QWB24RR.mjs.map +7 -0
  28. package/dist/lib/browser/types/index.mjs +11 -5
  29. package/dist/lib/browser/update-HZNVYBMO.mjs +45 -0
  30. package/dist/lib/browser/update-HZNVYBMO.mjs.map +7 -0
  31. package/dist/lib/node-esm/MarkdownSettings-QMPISOEU.mjs +33 -0
  32. package/dist/lib/node-esm/MarkdownSettings-QMPISOEU.mjs.map +7 -0
  33. package/dist/lib/node-esm/blueprints/index.mjs +52 -0
  34. package/dist/lib/node-esm/blueprints/index.mjs.map +7 -0
  35. package/dist/lib/node-esm/chunk-3OPDJJJH.mjs +122 -0
  36. package/dist/lib/node-esm/chunk-3OPDJJJH.mjs.map +7 -0
  37. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  38. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  39. package/dist/lib/node-esm/chunk-JUGS6RKO.mjs +159 -0
  40. package/dist/lib/node-esm/chunk-JUGS6RKO.mjs.map +7 -0
  41. package/dist/lib/node-esm/cli/index.mjs +40 -0
  42. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  43. package/dist/lib/node-esm/create-SMQAIM3V.mjs +31 -0
  44. package/dist/lib/node-esm/create-SMQAIM3V.mjs.map +7 -0
  45. package/dist/lib/node-esm/create-markdown-X2OASYKG.mjs +23 -0
  46. package/dist/lib/node-esm/create-markdown-X2OASYKG.mjs.map +7 -0
  47. package/dist/lib/node-esm/index.mjs +612 -138
  48. package/dist/lib/node-esm/index.mjs.map +4 -4
  49. package/dist/lib/node-esm/meta.json +1 -1
  50. package/dist/lib/node-esm/open-SRWLLOKE.mjs +22 -0
  51. package/dist/lib/node-esm/open-SRWLLOKE.mjs.map +7 -0
  52. package/dist/lib/node-esm/operations/index.mjs +15 -0
  53. package/dist/lib/node-esm/operations/index.mjs.map +7 -0
  54. package/dist/lib/node-esm/scroll-to-anchor-M76GXKYQ.mjs +50 -0
  55. package/dist/lib/node-esm/scroll-to-anchor-M76GXKYQ.mjs.map +7 -0
  56. package/dist/lib/node-esm/set-view-mode-6BB6KIDS.mjs +27 -0
  57. package/dist/lib/node-esm/set-view-mode-6BB6KIDS.mjs.map +7 -0
  58. package/dist/lib/node-esm/types/index.mjs +11 -5
  59. package/dist/lib/node-esm/update-4CELTLXK.mjs +46 -0
  60. package/dist/lib/node-esm/update-4CELTLXK.mjs.map +7 -0
  61. package/dist/types/src/MarkdownPlugin.d.ts +2 -1
  62. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  63. package/dist/types/src/blueprints/index.d.ts +2 -0
  64. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  65. package/dist/types/src/blueprints/markdown-blueprint.d.ts +4 -0
  66. package/dist/types/src/blueprints/markdown-blueprint.d.ts.map +1 -0
  67. package/dist/types/src/capabilities/anchor-sort.d.ts +4 -4
  68. package/dist/types/src/capabilities/anchor-sort.d.ts.map +1 -1
  69. package/dist/types/src/capabilities/app-graph-serializer.d.ts +3 -2
  70. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -1
  71. package/dist/types/src/capabilities/artifact-definition.d.ts +3 -9
  72. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  73. package/dist/types/src/capabilities/blueprint-definition.d.ts +6 -0
  74. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  75. package/dist/types/src/capabilities/index.d.ts +9 -15
  76. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  77. package/dist/types/src/capabilities/node.d.ts +4 -0
  78. package/dist/types/src/capabilities/node.d.ts.map +1 -0
  79. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  80. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  81. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  82. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  83. package/dist/types/src/capabilities/settings.d.ts +4 -2
  84. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  85. package/dist/types/src/capabilities/state.d.ts +4 -9
  86. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  87. package/dist/types/src/cli/index.d.ts +2 -0
  88. package/dist/types/src/cli/index.d.ts.map +1 -0
  89. package/dist/types/src/cli/plugin.d.ts +3 -0
  90. package/dist/types/src/cli/plugin.d.ts.map +1 -0
  91. package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts +11 -0
  92. package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts.map +1 -0
  93. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +44 -21
  94. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
  95. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts +8 -15
  96. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts.map +1 -1
  97. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts +32 -0
  98. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts.map +1 -0
  99. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts +13 -0
  100. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts.map +1 -0
  101. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts +4 -4
  102. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts.map +1 -1
  103. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.stories.d.ts +94 -0
  104. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.stories.d.ts.map +1 -0
  105. package/dist/types/src/components/MarkdownSettings/index.d.ts +1 -1
  106. package/dist/types/src/components/MarkdownSettings/index.d.ts.map +1 -1
  107. package/dist/types/src/components/index.d.ts +3 -3
  108. package/dist/types/src/components/index.d.ts.map +1 -1
  109. package/dist/types/src/containers/MarkdownCard/MarkdownCard.d.ts +8 -0
  110. package/dist/types/src/containers/MarkdownCard/MarkdownCard.d.ts.map +1 -0
  111. package/dist/types/src/containers/MarkdownCard/MarkdownCard.stories.d.ts +9 -0
  112. package/dist/types/src/containers/MarkdownCard/MarkdownCard.stories.d.ts.map +1 -0
  113. package/dist/types/src/containers/MarkdownCard/index.d.ts +2 -0
  114. package/dist/types/src/containers/MarkdownCard/index.d.ts.map +1 -0
  115. package/dist/types/src/containers/MarkdownCard/snippet.d.ts +17 -0
  116. package/dist/types/src/containers/MarkdownCard/snippet.d.ts.map +1 -0
  117. package/dist/types/src/containers/MarkdownContainer/MarkdownContainer.d.ts +36 -0
  118. package/dist/types/src/containers/MarkdownContainer/MarkdownContainer.d.ts.map +1 -0
  119. package/dist/types/src/containers/MarkdownContainer/MarkdownContainer.stories.d.ts +77 -0
  120. package/dist/types/src/containers/MarkdownContainer/MarkdownContainer.stories.d.ts.map +1 -0
  121. package/dist/types/src/containers/MarkdownContainer/index.d.ts +3 -0
  122. package/dist/types/src/containers/MarkdownContainer/index.d.ts.map +1 -0
  123. package/dist/types/src/containers/index.d.ts +5 -0
  124. package/dist/types/src/containers/index.d.ts.map +1 -0
  125. package/dist/types/src/hooks/index.d.ts +3 -1
  126. package/dist/types/src/hooks/index.d.ts.map +1 -1
  127. package/dist/types/src/hooks/useEditorMenuOptions.d.ts +9 -0
  128. package/dist/types/src/hooks/useEditorMenuOptions.d.ts.map +1 -0
  129. package/dist/types/src/hooks/useExtensions.d.ts +24 -0
  130. package/dist/types/src/hooks/useExtensions.d.ts.map +1 -0
  131. package/dist/types/src/hooks/useLinkQuery.d.ts +4 -0
  132. package/dist/types/src/hooks/useLinkQuery.d.ts.map +1 -0
  133. package/dist/types/src/index.d.ts +3 -2
  134. package/dist/types/src/index.d.ts.map +1 -1
  135. package/dist/types/src/meta.d.ts +2 -3
  136. package/dist/types/src/meta.d.ts.map +1 -1
  137. package/dist/types/src/operations/create-markdown.d.ts +5 -0
  138. package/dist/types/src/operations/create-markdown.d.ts.map +1 -0
  139. package/dist/types/src/operations/create.d.ts +5 -0
  140. package/dist/types/src/operations/create.d.ts.map +1 -0
  141. package/dist/types/src/operations/create.test.d.ts +2 -0
  142. package/dist/types/src/operations/create.test.d.ts.map +1 -0
  143. package/dist/types/src/operations/definitions.d.ts +64 -0
  144. package/dist/types/src/operations/definitions.d.ts.map +1 -0
  145. package/dist/types/src/operations/index.d.ts +4 -0
  146. package/dist/types/src/operations/index.d.ts.map +1 -0
  147. package/dist/types/src/operations/open.d.ts +5 -0
  148. package/dist/types/src/operations/open.d.ts.map +1 -0
  149. package/dist/types/src/operations/scroll-to-anchor.d.ts +5 -0
  150. package/dist/types/src/operations/scroll-to-anchor.d.ts.map +1 -0
  151. package/dist/types/src/operations/set-view-mode.d.ts +5 -0
  152. package/dist/types/src/operations/set-view-mode.d.ts.map +1 -0
  153. package/dist/types/src/operations/update.d.ts +5 -0
  154. package/dist/types/src/operations/update.d.ts.map +1 -0
  155. package/dist/types/src/operations/update.test.d.ts +2 -0
  156. package/dist/types/src/operations/update.test.d.ts.map +1 -0
  157. package/dist/types/src/testing.d.ts +6 -0
  158. package/dist/types/src/testing.d.ts.map +1 -0
  159. package/dist/types/src/translations.d.ts +53 -30
  160. package/dist/types/src/translations.d.ts.map +1 -1
  161. package/dist/types/src/types/Markdown.d.ts +31 -30
  162. package/dist/types/src/types/Markdown.d.ts.map +1 -1
  163. package/dist/types/src/types/Settings.d.ts +17 -0
  164. package/dist/types/src/types/Settings.d.ts.map +1 -0
  165. package/dist/types/src/types/capabilities.d.ts +33 -0
  166. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  167. package/dist/types/src/types/events.d.ts +5 -0
  168. package/dist/types/src/types/events.d.ts.map +1 -0
  169. package/dist/types/src/types/index.d.ts +4 -2
  170. package/dist/types/src/types/index.d.ts.map +1 -1
  171. package/dist/types/src/types/types.d.ts +2 -2
  172. package/dist/types/src/types/types.d.ts.map +1 -1
  173. package/dist/types/src/util.d.ts +7 -4
  174. package/dist/types/src/util.d.ts.map +1 -1
  175. package/dist/types/src/util.test.d.ts +2 -0
  176. package/dist/types/src/util.test.d.ts.map +1 -0
  177. package/dist/types/tsconfig.tsbuildinfo +1 -1
  178. package/package.json +122 -56
  179. package/src/MarkdownPlugin.tsx +89 -100
  180. package/src/blueprints/index.ts +5 -0
  181. package/src/blueprints/markdown-blueprint.ts +44 -0
  182. package/src/capabilities/anchor-sort.ts +29 -22
  183. package/src/capabilities/app-graph-serializer.ts +55 -44
  184. package/src/capabilities/artifact-definition.ts +86 -95
  185. package/src/capabilities/blueprint-definition.ts +17 -0
  186. package/src/capabilities/index.ts +12 -9
  187. package/src/capabilities/node.ts +11 -0
  188. package/src/capabilities/operation-handler.ts +16 -0
  189. package/src/capabilities/react-surface.tsx +110 -104
  190. package/src/capabilities/settings.ts +30 -18
  191. package/src/capabilities/state.ts +41 -25
  192. package/src/cli/index.ts +5 -0
  193. package/src/cli/plugin.ts +39 -0
  194. package/src/components/MarkdownEditor/FileUpload.tsx +63 -0
  195. package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +63 -38
  196. package/src/components/MarkdownEditor/MarkdownEditor.tsx +251 -267
  197. package/src/components/MarkdownEditor/MarkdownEditorContent.tsx +170 -0
  198. package/src/components/MarkdownEditor/MarkdownEditorToolbar.tsx +47 -0
  199. package/src/components/MarkdownSettings/MarkdownSettings.stories.tsx +39 -0
  200. package/src/components/MarkdownSettings/MarkdownSettings.tsx +22 -92
  201. package/src/components/MarkdownSettings/index.ts +1 -1
  202. package/src/components/index.ts +4 -5
  203. package/src/containers/MarkdownCard/MarkdownCard.stories.tsx +67 -0
  204. package/src/containers/MarkdownCard/MarkdownCard.tsx +68 -0
  205. package/src/containers/MarkdownCard/index.ts +5 -0
  206. package/src/containers/MarkdownCard/snippet.ts +52 -0
  207. package/src/containers/MarkdownContainer/MarkdownContainer.stories.tsx +135 -0
  208. package/src/containers/MarkdownContainer/MarkdownContainer.tsx +145 -0
  209. package/src/containers/MarkdownContainer/index.ts +6 -0
  210. package/src/containers/index.ts +10 -0
  211. package/src/hooks/index.ts +3 -1
  212. package/src/hooks/useEditorMenuOptions.ts +68 -0
  213. package/src/hooks/useExtensions.tsx +264 -0
  214. package/src/hooks/useLinkQuery.ts +108 -0
  215. package/src/index.ts +4 -2
  216. package/src/meta.ts +6 -9
  217. package/src/operations/create-markdown.ts +20 -0
  218. package/src/operations/create.conversations.json +1 -0
  219. package/src/operations/create.test.ts +98 -0
  220. package/src/operations/create.ts +27 -0
  221. package/src/operations/definitions.ts +120 -0
  222. package/src/operations/index.ts +16 -0
  223. package/src/operations/open.ts +25 -0
  224. package/src/operations/scroll-to-anchor.ts +39 -0
  225. package/src/operations/set-view-mode.ts +24 -0
  226. package/src/operations/update.conversations.json +1 -0
  227. package/src/operations/update.test.ts +215 -0
  228. package/src/operations/update.ts +51 -0
  229. package/src/testing.ts +27 -0
  230. package/src/translations.ts +26 -31
  231. package/src/types/Markdown.ts +26 -31
  232. package/src/types/Settings.ts +65 -0
  233. package/src/types/capabilities.ts +50 -0
  234. package/src/types/events.ts +14 -0
  235. package/src/types/index.ts +5 -2
  236. package/src/types/types.ts +4 -2
  237. package/src/util.test.ts +44 -0
  238. package/src/util.tsx +83 -8
  239. package/dist/lib/browser/MarkdownCard-IMCR4A4V.mjs +0 -80
  240. package/dist/lib/browser/MarkdownCard-IMCR4A4V.mjs.map +0 -7
  241. package/dist/lib/browser/MarkdownContainer-VGJPHMVG.mjs +0 -780
  242. package/dist/lib/browser/MarkdownContainer-VGJPHMVG.mjs.map +0 -7
  243. package/dist/lib/browser/anchor-sort-AJKRIWFD.mjs +0 -32
  244. package/dist/lib/browser/anchor-sort-AJKRIWFD.mjs.map +0 -7
  245. package/dist/lib/browser/app-graph-serializer-OIS3MZX2.mjs +0 -52
  246. package/dist/lib/browser/app-graph-serializer-OIS3MZX2.mjs.map +0 -7
  247. package/dist/lib/browser/chunk-IKPZHFTW.mjs +0 -30
  248. package/dist/lib/browser/chunk-IKPZHFTW.mjs.map +0 -7
  249. package/dist/lib/browser/chunk-JHH7VL52.mjs +0 -18
  250. package/dist/lib/browser/chunk-JHH7VL52.mjs.map +0 -7
  251. package/dist/lib/browser/chunk-JMBQG2ZC.mjs +0 -50
  252. package/dist/lib/browser/chunk-JMBQG2ZC.mjs.map +0 -7
  253. package/dist/lib/browser/chunk-JTIGSUMB.mjs +0 -80
  254. package/dist/lib/browser/chunk-JTIGSUMB.mjs.map +0 -7
  255. package/dist/lib/browser/chunk-LMJPXTPL.mjs +0 -16
  256. package/dist/lib/browser/chunk-LMJPXTPL.mjs.map +0 -7
  257. package/dist/lib/browser/chunk-MVL4K3OD.mjs +0 -52
  258. package/dist/lib/browser/chunk-MVL4K3OD.mjs.map +0 -7
  259. package/dist/lib/browser/intent-resolver-BLLHRSTQ.mjs +0 -60
  260. package/dist/lib/browser/intent-resolver-BLLHRSTQ.mjs.map +0 -7
  261. package/dist/lib/browser/react-surface-NL3BZR6H.mjs +0 -208
  262. package/dist/lib/browser/react-surface-NL3BZR6H.mjs.map +0 -7
  263. package/dist/lib/browser/settings-Z7ZV7SLC.mjs +0 -28
  264. package/dist/lib/browser/settings-Z7ZV7SLC.mjs.map +0 -7
  265. package/dist/lib/browser/state-ORTZIEJU.mjs +0 -37
  266. package/dist/lib/browser/state-ORTZIEJU.mjs.map +0 -7
  267. package/dist/lib/node-esm/MarkdownCard-JV2YDV3M.mjs +0 -81
  268. package/dist/lib/node-esm/MarkdownCard-JV2YDV3M.mjs.map +0 -7
  269. package/dist/lib/node-esm/MarkdownContainer-BJRNCXJZ.mjs +0 -781
  270. package/dist/lib/node-esm/MarkdownContainer-BJRNCXJZ.mjs.map +0 -7
  271. package/dist/lib/node-esm/anchor-sort-N7WEA5E3.mjs +0 -33
  272. package/dist/lib/node-esm/anchor-sort-N7WEA5E3.mjs.map +0 -7
  273. package/dist/lib/node-esm/app-graph-serializer-Q3B44VFB.mjs +0 -53
  274. package/dist/lib/node-esm/app-graph-serializer-Q3B44VFB.mjs.map +0 -7
  275. package/dist/lib/node-esm/chunk-AYWAYBAY.mjs +0 -17
  276. package/dist/lib/node-esm/chunk-AYWAYBAY.mjs.map +0 -7
  277. package/dist/lib/node-esm/chunk-H4I2FGDZ.mjs +0 -31
  278. package/dist/lib/node-esm/chunk-H4I2FGDZ.mjs.map +0 -7
  279. package/dist/lib/node-esm/chunk-H6TITL7A.mjs +0 -20
  280. package/dist/lib/node-esm/chunk-H6TITL7A.mjs.map +0 -7
  281. package/dist/lib/node-esm/chunk-JDMMLOB6.mjs +0 -51
  282. package/dist/lib/node-esm/chunk-JDMMLOB6.mjs.map +0 -7
  283. package/dist/lib/node-esm/chunk-KIRZFVX5.mjs +0 -81
  284. package/dist/lib/node-esm/chunk-KIRZFVX5.mjs.map +0 -7
  285. package/dist/lib/node-esm/chunk-Z4XQ6C3D.mjs +0 -53
  286. package/dist/lib/node-esm/chunk-Z4XQ6C3D.mjs.map +0 -7
  287. package/dist/lib/node-esm/intent-resolver-NHPUPSWK.mjs +0 -61
  288. package/dist/lib/node-esm/intent-resolver-NHPUPSWK.mjs.map +0 -7
  289. package/dist/lib/node-esm/react-surface-XJ6ODCBE.mjs +0 -209
  290. package/dist/lib/node-esm/react-surface-XJ6ODCBE.mjs.map +0 -7
  291. package/dist/lib/node-esm/settings-UCXEWBCT.mjs +0 -29
  292. package/dist/lib/node-esm/settings-UCXEWBCT.mjs.map +0 -7
  293. package/dist/lib/node-esm/state-47WSZG54.mjs +0 -38
  294. package/dist/lib/node-esm/state-47WSZG54.mjs.map +0 -7
  295. package/dist/types/src/capabilities/capabilities.d.ts +0 -12
  296. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  297. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  298. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  299. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts +0 -7
  300. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts.map +0 -1
  301. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts +0 -42
  302. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts.map +0 -1
  303. package/dist/types/src/components/MarkdownCard/index.d.ts +0 -4
  304. package/dist/types/src/components/MarkdownCard/index.d.ts.map +0 -1
  305. package/dist/types/src/components/MarkdownContainer.d.ts +0 -18
  306. package/dist/types/src/components/MarkdownContainer.d.ts.map +0 -1
  307. package/dist/types/src/components/MarkdownContainer.stories.d.ts +0 -9
  308. package/dist/types/src/components/MarkdownContainer.stories.d.ts.map +0 -1
  309. package/dist/types/src/components/Suggestions.stories.d.ts +0 -12
  310. package/dist/types/src/components/Suggestions.stories.d.ts.map +0 -1
  311. package/dist/types/src/components/Toolbar.stories.d.ts +0 -11
  312. package/dist/types/src/components/Toolbar.stories.d.ts.map +0 -1
  313. package/dist/types/src/events.d.ts +0 -4
  314. package/dist/types/src/events.d.ts.map +0 -1
  315. package/dist/types/src/extensions.d.ts +0 -24
  316. package/dist/types/src/extensions.d.ts.map +0 -1
  317. package/dist/types/src/hooks/useSelectCurrentThread.d.ts +0 -6
  318. package/dist/types/src/hooks/useSelectCurrentThread.d.ts.map +0 -1
  319. package/dist/types/src/types/MarkdownAction.d.ts +0 -42
  320. package/dist/types/src/types/MarkdownAction.d.ts.map +0 -1
  321. package/src/capabilities/capabilities.ts +0 -21
  322. package/src/capabilities/intent-resolver.ts +0 -58
  323. package/src/components/MarkdownCard/MarkdownCard.stories.tsx +0 -79
  324. package/src/components/MarkdownCard/MarkdownCard.tsx +0 -75
  325. package/src/components/MarkdownCard/index.ts +0 -9
  326. package/src/components/MarkdownContainer.stories.tsx +0 -100
  327. package/src/components/MarkdownContainer.tsx +0 -255
  328. package/src/components/Suggestions.stories.tsx +0 -221
  329. package/src/components/Toolbar.stories.tsx +0 -112
  330. package/src/events.ts +0 -11
  331. package/src/extensions.tsx +0 -328
  332. package/src/hooks/useSelectCurrentThread.tsx +0 -56
  333. package/src/types/MarkdownAction.ts +0 -31
@@ -0,0 +1,135 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import * as Effect from 'effect/Effect';
7
+ import React, { useMemo } from 'react';
8
+
9
+ import { Capability, Plugin } from '@dxos/app-framework';
10
+ import { withPluginManager } from '@dxos/app-framework/testing';
11
+ import { Surface, useOperationInvoker } from '@dxos/app-framework/ui';
12
+ import { AppActivationEvents, LayoutOperation } from '@dxos/app-toolkit';
13
+ import { AppSurface } from '@dxos/app-toolkit/ui';
14
+ import { Obj, Query } from '@dxos/echo';
15
+ import { ClientPlugin } from '@dxos/plugin-client';
16
+ import { initializeIdentity } from '@dxos/plugin-client/testing';
17
+ import { PreviewPlugin } from '@dxos/plugin-preview';
18
+ import { StorybookPlugin, corePlugins } from '@dxos/plugin-testing';
19
+ import { random } from '@dxos/random';
20
+ import { useQuery, useSpaces } from '@dxos/react-client/echo';
21
+ import { useAsyncEffect } from '@dxos/react-ui';
22
+ import { useAttentionAttributes } from '@dxos/react-ui-attention';
23
+ import { withLayout } from '@dxos/react-ui/testing';
24
+ import { Text } from '@dxos/schema';
25
+ import { type ValueGenerator, createObjectFactory } from '@dxos/schema/testing';
26
+ import { Organization, Person } from '@dxos/types';
27
+
28
+ import { Markdown, MarkdownCapabilities, MarkdownEvents } from '#types';
29
+
30
+ import { MarkdownPlugin } from '../../MarkdownPlugin';
31
+ import { translations } from '../../translations';
32
+
33
+ random.seed(1);
34
+
35
+ const generator: ValueGenerator = random as any;
36
+
37
+ /** Minimal plugin that contributes an empty Extensions capability for stories. */
38
+ const MarkdownExtensionsPlugin = Plugin.define({ id: 'story-markdown-extensions', name: 'Story Extensions' }).pipe(
39
+ Plugin.addModule({
40
+ id: 'extensions',
41
+ activatesOn: MarkdownEvents.SetupExtensions,
42
+ activate: () => Effect.succeed(Capability.contributes(MarkdownCapabilities.Extensions, [])),
43
+ }),
44
+ Plugin.make,
45
+ );
46
+
47
+ const DefaultStory = () => {
48
+ const { invokePromise } = useOperationInvoker();
49
+ const [space] = useSpaces();
50
+ const [doc] = useQuery(space?.db, Query.type(Markdown.Document));
51
+ const id = doc && Obj.getDXN(doc).toString();
52
+ const data = useMemo(() => ({ subject: doc, attendableId: id ?? 'story' }), [doc, id]);
53
+ const attentionAttrs = useAttentionAttributes(id);
54
+
55
+ useAsyncEffect(async () => {
56
+ if (space) {
57
+ await invokePromise(LayoutOperation.SwitchWorkspace, { subject: space.id });
58
+ }
59
+ }, [space, invokePromise]);
60
+
61
+ return (
62
+ <div className='contents' {...attentionAttrs}>
63
+ <Surface.Surface type={AppSurface.Article} data={data} limit={1} />
64
+ </div>
65
+ );
66
+ };
67
+
68
+ const meta = {
69
+ title: 'plugins/plugin-markdown/containers/MarkdownContainer',
70
+ render: DefaultStory,
71
+ decorators: [
72
+ withLayout({ layout: 'column' }),
73
+ withPluginManager<{ title?: string; content?: string }>((context) => ({
74
+ setupEvents: [AppActivationEvents.SetupSettings, MarkdownEvents.SetupExtensions],
75
+ plugins: [
76
+ ...corePlugins(),
77
+ StorybookPlugin({}),
78
+ MarkdownExtensionsPlugin(),
79
+ ClientPlugin({
80
+ types: [Markdown.Document, Text.Text, Person.Person, Organization.Organization],
81
+ onClientInitialized: ({ client }) =>
82
+ Effect.gen(function* () {
83
+ const { personalSpace } = yield* initializeIdentity(client);
84
+
85
+ const createObjects = createObjectFactory(personalSpace.db, generator);
86
+ yield* Effect.promise(() => createObjects([{ type: Organization.Organization, count: 10 }]));
87
+
88
+ const queue = personalSpace.queues.create();
89
+ const kai = Obj.make(Person.Person, { fullName: 'Kai' });
90
+ const dxos = Obj.make(Organization.Organization, { name: 'DXOS' });
91
+ yield* Effect.promise(() => queue.append([kai, dxos]));
92
+
93
+ personalSpace.db.add(
94
+ Markdown.make({
95
+ name: context.args.title ?? 'Testing',
96
+ content: [
97
+ `# ${context.args.title ?? 'Testing'}`,
98
+ context.args.content ?? '',
99
+ // TODO(burdon): Popovers not currently working.
100
+ '## Here are some objects',
101
+ `![Alice](${Obj.getDXN(kai)})`,
102
+ `![DXOS](${Obj.getDXN(dxos)})`,
103
+ '',
104
+ 'END',
105
+ '',
106
+ ].join('\n\n'),
107
+ }),
108
+ );
109
+
110
+ yield* Effect.promise(() => personalSpace.db.flush({ indexes: true }));
111
+ }),
112
+ }),
113
+
114
+ MarkdownPlugin(),
115
+ PreviewPlugin(),
116
+ ],
117
+ })),
118
+ ],
119
+ parameters: {
120
+ layout: 'fullscreen',
121
+ controls: { disable: true },
122
+ translations,
123
+ },
124
+ } satisfies Meta<typeof DefaultStory>;
125
+
126
+ export default meta;
127
+
128
+ type Story = StoryObj<typeof meta>;
129
+
130
+ export const Default: Story = {
131
+ args: {
132
+ title: 'Testing',
133
+ content: ['This is a line with **some** formatting.'].join('\n\n'),
134
+ },
135
+ };
@@ -0,0 +1,145 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { type Extension } from '@codemirror/state';
6
+ import { Atom } from '@effect-atom/atom-react';
7
+ import React, { forwardRef, useCallback, useMemo } from 'react';
8
+
9
+ import { useCapabilities, useOperationInvoker } from '@dxos/app-framework/ui';
10
+ import { AppCapabilities, LayoutOperation } from '@dxos/app-toolkit';
11
+ import { AppSurface, useAppGraph } from '@dxos/app-toolkit/ui';
12
+ import { Obj } from '@dxos/echo';
13
+ import { useActionRunner } from '@dxos/plugin-graph';
14
+ import { useObject } from '@dxos/react-client/echo';
15
+ import { Panel } from '@dxos/react-ui';
16
+ import { type SelectionManager } from '@dxos/react-ui-attention';
17
+ import { Editor } from '@dxos/react-ui-editor';
18
+ import { Text } from '@dxos/schema';
19
+
20
+ import {
21
+ MarkdownEditor,
22
+ MarkdownEditorProvider,
23
+ type MarkdownEditorContentProps,
24
+ type MarkdownEditorProviderProps,
25
+ } from '#components';
26
+ import { useLinkQuery } from '#hooks';
27
+ import { Markdown, MarkdownCapabilities, type MarkdownPluginState } from '#types';
28
+
29
+ export type MarkdownContainerProps = AppSurface.ObjectArticleProps<
30
+ Markdown.Document | Text.Text,
31
+ {
32
+ id: string;
33
+ settings: Markdown.Settings;
34
+ selectionManager?: SelectionManager;
35
+ } & Pick<MarkdownPluginState, 'extensionProviders'> &
36
+ Pick<MarkdownEditorProviderProps, 'viewMode' | 'onSelectObject' | 'onViewModeChange'> &
37
+ Pick<MarkdownEditorContentProps, 'editorStateStore'>
38
+ >;
39
+
40
+ export const MarkdownContainer = forwardRef<HTMLDivElement, MarkdownContainerProps>(
41
+ (
42
+ { role, subject: object, id, attendableId, settings, extensionProviders, onSelectObject, ...props },
43
+ forwardedRef,
44
+ ) => {
45
+ const db = Obj.isObject(object) ? Obj.getDatabase(object) : undefined;
46
+ const [docContent] = useObject(Obj.instanceOf(Markdown.Document, object) ? object.content : undefined, 'content');
47
+ const [textContent] = useObject(Obj.instanceOf(Text.Text, object) ? object : undefined, 'content');
48
+ const initialValue = docContent ?? textContent;
49
+
50
+ // Extensions from other plugins.
51
+ const otherExtensionProviders = useCapabilities(MarkdownCapabilities.Extensions);
52
+ const extensions = useMemo<Extension[]>(() => {
53
+ if (!Obj.instanceOf(Markdown.Document, object) && !Obj.instanceOf(Text.Text, object)) {
54
+ return [];
55
+ }
56
+
57
+ return [...(otherExtensionProviders ?? []), ...(extensionProviders ?? [])]
58
+ .flat()
59
+ .reduce((acc: Extension[], provider) => {
60
+ const extension =
61
+ typeof provider === 'function' ? provider({ document: object as Markdown.Document }) : provider;
62
+ if (extension) {
63
+ acc.push(extension);
64
+ }
65
+
66
+ return acc;
67
+ }, []);
68
+ }, [extensionProviders, otherExtensionProviders, object]);
69
+
70
+ // Toolbar actions from app graph.
71
+ const { graph } = useAppGraph();
72
+ const runAction = useActionRunner();
73
+ const customActions = useMemo(() => {
74
+ return Atom.make((get) => {
75
+ const actions = get(graph.actions(attendableId ?? id));
76
+ const nodes = actions.filter((action) => action.properties.disposition === 'toolbar');
77
+ const edges = nodes.map((node) => ({ source: 'root', target: node.id, relation: 'child' }));
78
+ return { nodes, edges };
79
+ });
80
+ }, [graph]);
81
+
82
+ // File upload.
83
+ const [upload] = useCapabilities(AppCapabilities.FileUploader);
84
+ const handleFileUpload = useMemo(() => {
85
+ if (!db || !upload) {
86
+ return undefined;
87
+ }
88
+
89
+ return async (file: File) => upload(db, file);
90
+ }, [db, upload]);
91
+
92
+ // Query for @ refs.
93
+ const handleLinkQuery = useLinkQuery(db);
94
+
95
+ // Open linked objects.
96
+ const { invokePromise } = useOperationInvoker();
97
+ const handleSelectObject = useCallback(
98
+ (targetId: string) => {
99
+ if (onSelectObject) {
100
+ onSelectObject(targetId);
101
+ } else {
102
+ void invokePromise?.(LayoutOperation.Open, {
103
+ subject: [targetId],
104
+ pivotId: attendableId,
105
+ // TODO(wittjosiah): This should probably pre-validate.
106
+ navigation: 'immediate',
107
+ });
108
+ }
109
+ },
110
+ [onSelectObject, invokePromise, attendableId],
111
+ );
112
+
113
+ return (
114
+ <MarkdownEditorProvider
115
+ id={id}
116
+ attendableId={attendableId}
117
+ object={object}
118
+ compact={role !== 'article'}
119
+ extensions={extensions}
120
+ settings={settings}
121
+ onAction={runAction}
122
+ onFileUpload={handleFileUpload}
123
+ onLinkQuery={handleLinkQuery}
124
+ onSelectObject={handleSelectObject}
125
+ {...props}
126
+ >
127
+ {(editorRootProps) => (
128
+ <Editor.Root {...editorRootProps}>
129
+ <Panel.Root role={role} ref={forwardedRef}>
130
+ {settings.toolbar && (
131
+ <Panel.Toolbar classNames='bg-toolbar-surface'>
132
+ <MarkdownEditor.Toolbar classNames='dx-document' customActions={customActions} />
133
+ </Panel.Toolbar>
134
+ )}
135
+ <Panel.Content>
136
+ <MarkdownEditor.Content initialValue={initialValue} />
137
+ <MarkdownEditor.Blocks />
138
+ </Panel.Content>
139
+ </Panel.Root>
140
+ </Editor.Root>
141
+ )}
142
+ </MarkdownEditorProvider>
143
+ );
144
+ },
145
+ );
@@ -0,0 +1,6 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export { MarkdownContainer, type MarkdownContainerProps } from './MarkdownContainer';
6
+ export { MarkdownContainer as default } from './MarkdownContainer';
@@ -0,0 +1,10 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type ComponentType, lazy } from 'react';
6
+
7
+ export type { MarkdownContainerProps } from './MarkdownContainer';
8
+
9
+ export const MarkdownCard: ComponentType<any> = lazy(() => import('./MarkdownCard'));
10
+ export const MarkdownContainer: ComponentType<any> = lazy(() => import('./MarkdownContainer'));
@@ -2,4 +2,6 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- export * from './useSelectCurrentThread';
5
+ export * from './useEditorMenuOptions';
6
+ export * from './useExtensions';
7
+ export * from './useLinkQuery';
@@ -0,0 +1,68 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type EditorView } from '@codemirror/view';
6
+ import { useCallback, useMemo, useRef } from 'react';
7
+
8
+ import { toLocalizedString, useTranslation } from '@dxos/react-ui';
9
+ import {
10
+ type EditorMenuGroup,
11
+ type UseEditorMenuProps,
12
+ filterMenuGroups,
13
+ formattingCommands,
14
+ linkSlashCommands,
15
+ } from '@dxos/react-ui-editor';
16
+ import { Domino } from '@dxos/ui';
17
+
18
+ import { meta } from '#meta';
19
+
20
+ export type UseEditorMenuOptionsProps = {
21
+ editorView?: EditorView;
22
+ slashCommandGroups?: EditorMenuGroup[];
23
+ onLinkQuery?: (query?: string) => Promise<EditorMenuGroup[]>;
24
+ };
25
+
26
+ export const useEditorMenuOptions = ({
27
+ editorView,
28
+ slashCommandGroups,
29
+ onLinkQuery,
30
+ }: UseEditorMenuOptionsProps): UseEditorMenuProps => {
31
+ const { t } = useTranslation(meta.id);
32
+
33
+ const getMenu = useCallback<NonNullable<UseEditorMenuProps['getMenu']>>(
34
+ ({ text, trigger }) => {
35
+ switch (trigger) {
36
+ case '@': {
37
+ return onLinkQuery?.(text) ?? [];
38
+ }
39
+
40
+ case '/':
41
+ default: {
42
+ return filterMenuGroups([formattingCommands, linkSlashCommands, ...(slashCommandGroups ?? [])], (item) =>
43
+ text ? toLocalizedString(item.label, t).toLowerCase().includes(text.toLowerCase()) : true,
44
+ );
45
+ }
46
+ }
47
+ },
48
+ [slashCommandGroups, onLinkQuery],
49
+ );
50
+
51
+ const viewRef = useRef(editorView);
52
+ return useMemo<UseEditorMenuProps>(() => {
53
+ const trigger = onLinkQuery ? ['/', '@'] : ['/'];
54
+ const placeholder = {
55
+ delay: 3_000,
56
+ content: () => {
57
+ const pressEl = Domino.of('span').text('Press');
58
+ const triggerEls = trigger.map((text) =>
59
+ Domino.of('span').classNames('mx-1 px-1.5 pt-[1px] pb-[2px] border border-separator rounded-xs').text(text),
60
+ );
61
+ const forCommandsEl = Domino.of('span').text('for commands.');
62
+ return Domino.of('div').append(pressEl, ...triggerEls, forCommandsEl).root;
63
+ },
64
+ };
65
+
66
+ return { viewRef, getMenu, trigger, placeholder };
67
+ }, [getMenu, onLinkQuery]);
68
+ };
@@ -0,0 +1,264 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { type ViewUpdate } from '@codemirror/view';
6
+ import { useMemo } from 'react';
7
+
8
+ import { fromUrlPath } from '@dxos/app-toolkit';
9
+ import { debounceAndThrottle } from '@dxos/async';
10
+ import { Obj } from '@dxos/echo';
11
+ import { createDocAccessor } from '@dxos/echo-db';
12
+ import { invariant } from '@dxos/invariant';
13
+ import { getSpace, useObject } from '@dxos/react-client/echo';
14
+ import { useIdentity } from '@dxos/react-client/halo';
15
+ import { useThemeContext } from '@dxos/react-ui';
16
+ import { type SelectionManager } from '@dxos/react-ui-attention';
17
+ import { Text } from '@dxos/schema';
18
+ import { Domino } from '@dxos/ui';
19
+ import {
20
+ Cursor,
21
+ type EditorStateStore,
22
+ EditorView,
23
+ type EditorViewMode,
24
+ type Extension,
25
+ InputModeExtensions,
26
+ type PreviewOptions,
27
+ type RenderCallback,
28
+ createDataExtensions,
29
+ decorateMarkdown,
30
+ documentId,
31
+ folding,
32
+ formattingKeymap,
33
+ linkTooltip,
34
+ listener,
35
+ preview,
36
+ replacer,
37
+ selectionState,
38
+ typewriter,
39
+ } from '@dxos/ui-editor';
40
+ import { isTruthy, safeUrl } from '@dxos/util';
41
+
42
+ import { Markdown } from '#types';
43
+
44
+ import { setFallbackName } from '../util';
45
+
46
+ export type DocumentType = Markdown.Document | Text.Text | { id: string; text: string };
47
+
48
+ export type ExtensionsOptions = {
49
+ id: string;
50
+ object?: DocumentType;
51
+ settings?: Markdown.Settings;
52
+ compact?: boolean;
53
+ viewMode?: EditorViewMode;
54
+ editable?: boolean;
55
+ selectionManager?: SelectionManager;
56
+ editorStateStore?: EditorStateStore;
57
+ previewOptions?: PreviewOptions;
58
+ platform?: 'mobile' | 'desktop';
59
+ /** Callback when an internal link is clicked. */
60
+ onSelectObject?: (objectId: string) => void;
61
+ };
62
+
63
+ // TODO(burdon): Merge with createBaseExtensions below.
64
+ export const useExtensions = ({
65
+ id,
66
+ object,
67
+ settings,
68
+ compact,
69
+ viewMode,
70
+ selectionManager,
71
+ editorStateStore,
72
+ previewOptions,
73
+ onSelectObject,
74
+ }: ExtensionsOptions): Extension[] => {
75
+ const { platform } = useThemeContext();
76
+ const identity = useIdentity();
77
+ const space = getSpace(object);
78
+
79
+ // Get the content reference from Document objects.
80
+ const contentRef = Obj.instanceOf(Markdown.Document, object) ? (object as Markdown.Document).content : undefined;
81
+ // Use useObject to trigger re-render when the reference loads (returns snapshot for reactivity).
82
+ useObject(contentRef);
83
+ // Get the actual live object target via .target (needed for createDocAccessor).
84
+ const target = contentRef?.target ?? (Obj.instanceOf(Text.Text, object) ? object : undefined);
85
+
86
+ // TODO(wittjosiah): Autocomplete is not working and this query is causing performance issues.
87
+ // TODO(burdon): Unsubscribe.
88
+ // const query = space?.db.query(Filter.type(DocumentType));
89
+ // query?.subscribe();
90
+
91
+ const baseExtensions = useMemo(
92
+ () =>
93
+ createBaseExtensions({
94
+ id,
95
+ object,
96
+ settings,
97
+ compact,
98
+ viewMode,
99
+ selectionManager,
100
+ previewOptions,
101
+ platform,
102
+ onSelectObject,
103
+ }),
104
+ [
105
+ id,
106
+ object,
107
+ compact,
108
+ viewMode,
109
+ selectionManager,
110
+ previewOptions,
111
+ settings,
112
+ settings?.debug,
113
+ settings?.editorInputMode,
114
+ settings?.folding,
115
+ settings?.numberedHeadings,
116
+ settings?.typewriter,
117
+ platform,
118
+ onSelectObject,
119
+ ],
120
+ );
121
+
122
+ return useMemo<Extension[]>(
123
+ () =>
124
+ [
125
+ // TODO(burdon): Pass this in?
126
+ // NOTE: Data extensions must be first so that automerge is updated before other extensions compute their state.
127
+ target &&
128
+ createDataExtensions({
129
+ id,
130
+ text: createDocAccessor(target, ['content']),
131
+ messenger: space,
132
+ identity,
133
+ }),
134
+
135
+ // TODO(burdon): Reconcile with effect in parent.
136
+ Obj.instanceOf(Markdown.Document, object) &&
137
+ listener({
138
+ onChange: ({ text }) => {
139
+ setFallbackName(object as Markdown.Document, text);
140
+ },
141
+ }),
142
+
143
+ baseExtensions,
144
+ selectionState(editorStateStore),
145
+ ].filter(isTruthy),
146
+ [identity, space, id, object, target, baseExtensions],
147
+ );
148
+ };
149
+
150
+ /**
151
+ * Create extension instances for editor.
152
+ */
153
+ const createBaseExtensions = ({
154
+ id,
155
+ object,
156
+ onSelectObject,
157
+ settings,
158
+ compact,
159
+ viewMode,
160
+ selectionManager,
161
+ previewOptions,
162
+ platform,
163
+ }: ExtensionsOptions): Extension[] => {
164
+ const extensions: Extension[] = [
165
+ selectionManager && selectionChange(selectionManager),
166
+ settings?.editorInputMode && InputModeExtensions[settings.editorInputMode],
167
+ settings?.folding && !compact && platform !== 'mobile' && folding(),
168
+ ].filter(isTruthy);
169
+
170
+ //
171
+ // Markdown
172
+ //
173
+ if (viewMode !== 'source') {
174
+ extensions.push(
175
+ ...[
176
+ formattingKeymap(),
177
+ decorateMarkdown({
178
+ selectionChangeDelay: 100,
179
+ numberedHeadings: settings?.numberedHeadings ? { from: 2 } : undefined,
180
+ // TODO(wittjosiah): For internal links render the label of the object.
181
+ renderLinkButton: onSelectObject && createRenderLink(onSelectObject),
182
+ }),
183
+ linkTooltip(renderLinkTooltip),
184
+ preview(previewOptions),
185
+ replacer(),
186
+ ],
187
+ );
188
+ }
189
+
190
+ if (settings?.debug) {
191
+ const items = settings.typewriter?.split(/[,\n]/) ?? '';
192
+ if (items) {
193
+ extensions.push(typewriter({ items }));
194
+ }
195
+ }
196
+
197
+ return extensions;
198
+ };
199
+
200
+ const selectionChange = (selectionManager: SelectionManager) => {
201
+ const debouncedHandler = debounceAndThrottle((update: ViewUpdate) => {
202
+ const id = update.state.facet(documentId);
203
+ const cursorConverter = update.state.facet(Cursor.converter);
204
+ const selection = update.state.selection;
205
+ const ranges = selection.ranges
206
+ .map((range) => ({
207
+ from: cursorConverter.toCursor(range.from),
208
+ to: cursorConverter.toCursor(range.to),
209
+ }))
210
+ .filter(({ from, to }) => to > from);
211
+
212
+ selectionManager.updateMultiRange(id, ranges);
213
+ }, 100);
214
+
215
+ return EditorView.updateListener.of((update: ViewUpdate) => {
216
+ if (update.selectionSet) {
217
+ debouncedHandler(update);
218
+ }
219
+ });
220
+ };
221
+
222
+ const createRenderLink =
223
+ (onSelectObject: (id: string) => void): RenderCallback<{ url: string }> =>
224
+ (el, { url }) => {
225
+ // TODO(burdon): Formalize/document internal link format.
226
+ const isInternal = url.startsWith('/') || url.startsWith(window.location.origin);
227
+ const qualifiedId = isInternal ? fromUrlPath(new URL(url, window.location.origin).pathname) : undefined;
228
+ const icon = Domino.of('span')
229
+ .classNames('dx-link ms-1 inline-block align-[-0.125em]')
230
+ .append(Domino.svg(isInternal ? 'ph--arrow-square-down--regular' : 'ph--arrow-square-out--regular'));
231
+
232
+ if (isInternal) {
233
+ invariant(qualifiedId, 'Invalid link format.');
234
+ icon
235
+ .attributes({ role: 'button', tabindex: '0' })
236
+ .on('click', (event) => {
237
+ event.preventDefault();
238
+ event.stopPropagation();
239
+ onSelectObject(qualifiedId);
240
+ })
241
+ .on('keydown', (event) => {
242
+ const keyboardEvent = event as KeyboardEvent;
243
+ if (keyboardEvent.key !== 'Enter' && keyboardEvent.key !== ' ') {
244
+ return;
245
+ }
246
+
247
+ keyboardEvent.preventDefault();
248
+ keyboardEvent.stopPropagation();
249
+ onSelectObject(qualifiedId);
250
+ });
251
+ }
252
+
253
+ el.appendChild(icon.root);
254
+ };
255
+
256
+ const renderLinkTooltip: RenderCallback<{ url: string }> = (el, { url }) => {
257
+ el.appendChild(
258
+ Domino.of('a')
259
+ .attributes({ href: url, target: '_blank', rel: 'noreferrer' })
260
+ .classNames('dx-link flex items-center gap-2')
261
+ .text(safeUrl(url)?.toString() ?? url)
262
+ .append(Domino.svg('ph--arrow-square-out--regular')).root,
263
+ );
264
+ };