@dxos/plugin-markdown 0.8.4-main.72ec0f3 → 0.8.4-main.74a063c4e0

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 (365) hide show
  1. package/dist/lib/browser/MarkdownSettings-YZFNSJJY.mjs +121 -0
  2. package/dist/lib/browser/MarkdownSettings-YZFNSJJY.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-46WIDM4R.mjs +98 -0
  6. package/dist/lib/browser/chunk-46WIDM4R.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  8. package/dist/lib/browser/chunk-XKUKZNUS.mjs +158 -0
  9. package/dist/lib/browser/chunk-XKUKZNUS.mjs.map +7 -0
  10. package/dist/lib/browser/cli/index.mjs +39 -0
  11. package/dist/lib/browser/cli/index.mjs.map +7 -0
  12. package/dist/lib/browser/create-HSXPXCC5.mjs +30 -0
  13. package/dist/lib/browser/create-HSXPXCC5.mjs.map +7 -0
  14. package/dist/lib/browser/create-markdown-WB7DH3UF.mjs +22 -0
  15. package/dist/lib/browser/create-markdown-WB7DH3UF.mjs.map +7 -0
  16. package/dist/lib/browser/index.mjs +632 -153
  17. package/dist/lib/browser/index.mjs.map +4 -4
  18. package/dist/lib/browser/meta.json +1 -1
  19. package/dist/lib/browser/open-N6PAX6DY.mjs +21 -0
  20. package/dist/lib/browser/open-N6PAX6DY.mjs.map +7 -0
  21. package/dist/lib/browser/operations/index.mjs +14 -0
  22. package/dist/lib/browser/operations/index.mjs.map +7 -0
  23. package/dist/lib/browser/scroll-to-anchor-5M4F24AB.mjs +49 -0
  24. package/dist/lib/browser/scroll-to-anchor-5M4F24AB.mjs.map +7 -0
  25. package/dist/lib/browser/set-view-mode-NBNF2I5W.mjs +26 -0
  26. package/dist/lib/browser/set-view-mode-NBNF2I5W.mjs.map +7 -0
  27. package/dist/lib/browser/types/index.mjs +11 -5
  28. package/dist/lib/browser/update-5QIRVGTL.mjs +45 -0
  29. package/dist/lib/browser/update-5QIRVGTL.mjs.map +7 -0
  30. package/dist/lib/node-esm/MarkdownSettings-X6SDS35F.mjs +122 -0
  31. package/dist/lib/node-esm/MarkdownSettings-X6SDS35F.mjs.map +7 -0
  32. package/dist/lib/node-esm/blueprints/index.mjs +52 -0
  33. package/dist/lib/node-esm/blueprints/index.mjs.map +7 -0
  34. package/dist/lib/node-esm/chunk-4MSJO6IJ.mjs +99 -0
  35. package/dist/lib/node-esm/chunk-4MSJO6IJ.mjs.map +7 -0
  36. package/dist/lib/node-esm/chunk-E4BQCEXF.mjs +159 -0
  37. package/dist/lib/node-esm/chunk-E4BQCEXF.mjs.map +7 -0
  38. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  39. package/dist/lib/node-esm/cli/index.mjs +40 -0
  40. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  41. package/dist/lib/node-esm/create-6Z2KYISY.mjs +31 -0
  42. package/dist/lib/node-esm/create-6Z2KYISY.mjs.map +7 -0
  43. package/dist/lib/node-esm/create-markdown-JWQZICKY.mjs +23 -0
  44. package/dist/lib/node-esm/create-markdown-JWQZICKY.mjs.map +7 -0
  45. package/dist/lib/node-esm/index.mjs +632 -153
  46. package/dist/lib/node-esm/index.mjs.map +4 -4
  47. package/dist/lib/node-esm/meta.json +1 -1
  48. package/dist/lib/node-esm/open-DSNFRSNZ.mjs +22 -0
  49. package/dist/lib/node-esm/open-DSNFRSNZ.mjs.map +7 -0
  50. package/dist/lib/node-esm/operations/index.mjs +15 -0
  51. package/dist/lib/node-esm/operations/index.mjs.map +7 -0
  52. package/dist/lib/node-esm/scroll-to-anchor-D6SHGU2R.mjs +50 -0
  53. package/dist/lib/node-esm/scroll-to-anchor-D6SHGU2R.mjs.map +7 -0
  54. package/dist/lib/node-esm/set-view-mode-REYB4L7J.mjs +27 -0
  55. package/dist/lib/node-esm/set-view-mode-REYB4L7J.mjs.map +7 -0
  56. package/dist/lib/node-esm/types/index.mjs +11 -5
  57. package/dist/lib/node-esm/update-YMQAIKOF.mjs +46 -0
  58. package/dist/lib/node-esm/update-YMQAIKOF.mjs.map +7 -0
  59. package/dist/types/src/MarkdownPlugin.d.ts +2 -1
  60. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  61. package/dist/types/src/blueprints/index.d.ts +2 -0
  62. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  63. package/dist/types/src/blueprints/markdown-blueprint.d.ts +4 -0
  64. package/dist/types/src/blueprints/markdown-blueprint.d.ts.map +1 -0
  65. package/dist/types/src/capabilities/anchor-sort.d.ts +4 -2
  66. package/dist/types/src/capabilities/anchor-sort.d.ts.map +1 -1
  67. package/dist/types/src/capabilities/app-graph-serializer.d.ts +3 -2
  68. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -1
  69. package/dist/types/src/capabilities/artifact-definition.d.ts +3 -1
  70. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  71. package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -6
  72. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -1
  73. package/dist/types/src/capabilities/index.d.ts +27 -14
  74. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  75. package/dist/types/src/capabilities/node.d.ts +4 -0
  76. package/dist/types/src/capabilities/node.d.ts.map +1 -0
  77. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  78. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  79. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  80. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  81. package/dist/types/src/capabilities/settings.d.ts +22 -2
  82. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  83. package/dist/types/src/capabilities/state.d.ts +4 -9
  84. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  85. package/dist/types/src/cli/index.d.ts +2 -0
  86. package/dist/types/src/cli/index.d.ts.map +1 -0
  87. package/dist/types/src/cli/plugin.d.ts +3 -0
  88. package/dist/types/src/cli/plugin.d.ts.map +1 -0
  89. package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts +1 -1
  90. package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts.map +1 -1
  91. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +18 -12
  92. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
  93. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts +2 -2
  94. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts.map +1 -1
  95. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts +16 -10
  96. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts.map +1 -1
  97. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts +10 -5
  98. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts.map +1 -1
  99. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts +4 -4
  100. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts.map +1 -1
  101. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.stories.d.ts +138 -0
  102. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.stories.d.ts.map +1 -0
  103. package/dist/types/src/components/MarkdownSettings/index.d.ts +1 -1
  104. package/dist/types/src/components/MarkdownSettings/index.d.ts.map +1 -1
  105. package/dist/types/src/components/index.d.ts +3 -5
  106. package/dist/types/src/components/index.d.ts.map +1 -1
  107. package/dist/types/src/containers/MarkdownCard/MarkdownCard.d.ts +8 -0
  108. package/dist/types/src/containers/MarkdownCard/MarkdownCard.d.ts.map +1 -0
  109. package/dist/types/src/containers/MarkdownCard/MarkdownCard.stories.d.ts +9 -0
  110. package/dist/types/src/containers/MarkdownCard/MarkdownCard.stories.d.ts.map +1 -0
  111. package/dist/types/src/containers/MarkdownCard/index.d.ts +2 -0
  112. package/dist/types/src/containers/MarkdownCard/index.d.ts.map +1 -0
  113. package/dist/types/src/containers/MarkdownCard/snippet.d.ts +15 -0
  114. package/dist/types/src/containers/MarkdownCard/snippet.d.ts.map +1 -0
  115. package/dist/types/src/containers/MarkdownContainer/MarkdownContainer.d.ts +36 -0
  116. package/dist/types/src/containers/MarkdownContainer/MarkdownContainer.d.ts.map +1 -0
  117. package/dist/types/src/containers/MarkdownContainer/MarkdownContainer.stories.d.ts +99 -0
  118. package/dist/types/src/containers/MarkdownContainer/MarkdownContainer.stories.d.ts.map +1 -0
  119. package/dist/types/src/containers/MarkdownContainer/index.d.ts +3 -0
  120. package/dist/types/src/containers/MarkdownContainer/index.d.ts.map +1 -0
  121. package/dist/types/src/containers/index.d.ts +5 -0
  122. package/dist/types/src/containers/index.d.ts.map +1 -0
  123. package/dist/types/src/hooks/index.d.ts +0 -1
  124. package/dist/types/src/hooks/index.d.ts.map +1 -1
  125. package/dist/types/src/hooks/useEditorMenuOptions.d.ts.map +1 -1
  126. package/dist/types/src/hooks/useExtensions.d.ts +8 -6
  127. package/dist/types/src/hooks/useExtensions.d.ts.map +1 -1
  128. package/dist/types/src/hooks/useLinkQuery.d.ts +2 -2
  129. package/dist/types/src/hooks/useLinkQuery.d.ts.map +1 -1
  130. package/dist/types/src/index.d.ts +2 -2
  131. package/dist/types/src/index.d.ts.map +1 -1
  132. package/dist/types/src/meta.d.ts +2 -2
  133. package/dist/types/src/meta.d.ts.map +1 -1
  134. package/dist/types/src/operations/create-markdown.d.ts +5 -0
  135. package/dist/types/src/operations/create-markdown.d.ts.map +1 -0
  136. package/dist/types/src/operations/create.d.ts +5 -0
  137. package/dist/types/src/operations/create.d.ts.map +1 -0
  138. package/dist/types/src/operations/create.test.d.ts.map +1 -0
  139. package/dist/types/src/operations/definitions.d.ts +64 -0
  140. package/dist/types/src/operations/definitions.d.ts.map +1 -0
  141. package/dist/types/src/operations/index.d.ts +4 -0
  142. package/dist/types/src/operations/index.d.ts.map +1 -0
  143. package/dist/types/src/operations/open.d.ts +5 -0
  144. package/dist/types/src/operations/open.d.ts.map +1 -0
  145. package/dist/types/src/operations/scroll-to-anchor.d.ts +5 -0
  146. package/dist/types/src/operations/scroll-to-anchor.d.ts.map +1 -0
  147. package/dist/types/src/operations/set-view-mode.d.ts +5 -0
  148. package/dist/types/src/operations/set-view-mode.d.ts.map +1 -0
  149. package/dist/types/src/operations/update.d.ts +5 -0
  150. package/dist/types/src/operations/update.d.ts.map +1 -0
  151. package/dist/types/src/operations/update.test.d.ts.map +1 -0
  152. package/dist/types/src/testing.d.ts +2 -2
  153. package/dist/types/src/testing.d.ts.map +1 -1
  154. package/dist/types/src/translations.d.ts +75 -34
  155. package/dist/types/src/translations.d.ts.map +1 -1
  156. package/dist/types/src/types/Markdown.d.ts +29 -30
  157. package/dist/types/src/types/Markdown.d.ts.map +1 -1
  158. package/dist/types/src/types/Settings.d.ts +16 -0
  159. package/dist/types/src/types/Settings.d.ts.map +1 -0
  160. package/dist/types/src/types/capabilities.d.ts +51 -0
  161. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  162. package/dist/types/src/types/events.d.ts +5 -0
  163. package/dist/types/src/types/events.d.ts.map +1 -0
  164. package/dist/types/src/types/index.d.ts +4 -2
  165. package/dist/types/src/types/index.d.ts.map +1 -1
  166. package/dist/types/src/types/types.d.ts +2 -2
  167. package/dist/types/src/types/types.d.ts.map +1 -1
  168. package/dist/types/src/util.d.ts +5 -2
  169. package/dist/types/src/util.d.ts.map +1 -1
  170. package/dist/types/src/util.test.d.ts +2 -0
  171. package/dist/types/src/util.test.d.ts.map +1 -0
  172. package/dist/types/tsconfig.tsbuildinfo +1 -1
  173. package/package.json +115 -68
  174. package/src/MarkdownPlugin.tsx +74 -98
  175. package/src/blueprints/index.ts +5 -0
  176. package/src/blueprints/markdown-blueprint.ts +44 -0
  177. package/src/capabilities/anchor-sort.ts +28 -21
  178. package/src/capabilities/app-graph-serializer.ts +55 -44
  179. package/src/capabilities/artifact-definition.ts +81 -83
  180. package/src/capabilities/blueprint-definition.ts +9 -35
  181. package/src/capabilities/index.ts +12 -11
  182. package/src/capabilities/node.ts +11 -0
  183. package/src/capabilities/operation-handler.ts +16 -0
  184. package/src/capabilities/react-surface.tsx +93 -66
  185. package/src/capabilities/settings.ts +30 -18
  186. package/src/capabilities/state.ts +41 -25
  187. package/src/cli/index.ts +5 -0
  188. package/src/cli/plugin.ts +39 -0
  189. package/src/components/MarkdownEditor/FileUpload.tsx +2 -2
  190. package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +37 -38
  191. package/src/components/MarkdownEditor/MarkdownEditor.tsx +75 -45
  192. package/src/components/MarkdownEditor/MarkdownEditorContent.tsx +63 -30
  193. package/src/components/MarkdownEditor/MarkdownEditorToolbar.tsx +47 -52
  194. package/src/components/MarkdownSettings/MarkdownSettings.stories.tsx +39 -0
  195. package/src/components/MarkdownSettings/MarkdownSettings.tsx +116 -86
  196. package/src/components/MarkdownSettings/index.ts +1 -1
  197. package/src/components/index.ts +4 -7
  198. package/src/containers/MarkdownCard/MarkdownCard.stories.tsx +67 -0
  199. package/src/containers/MarkdownCard/MarkdownCard.tsx +57 -0
  200. package/src/containers/MarkdownCard/index.ts +5 -0
  201. package/src/containers/MarkdownCard/snippet.ts +78 -0
  202. package/src/containers/MarkdownContainer/MarkdownContainer.stories.tsx +134 -0
  203. package/src/containers/MarkdownContainer/MarkdownContainer.tsx +135 -0
  204. package/src/containers/MarkdownContainer/index.ts +6 -0
  205. package/src/containers/index.ts +10 -0
  206. package/src/hooks/index.ts +0 -1
  207. package/src/hooks/useEditorMenuOptions.ts +11 -14
  208. package/src/hooks/useExtensions.tsx +92 -108
  209. package/src/hooks/useLinkQuery.ts +46 -21
  210. package/src/index.ts +3 -2
  211. package/src/meta.ts +3 -3
  212. package/src/operations/create-markdown.ts +20 -0
  213. package/src/operations/create.conversations.json +1 -0
  214. package/src/operations/create.test.ts +98 -0
  215. package/src/operations/create.ts +27 -0
  216. package/src/operations/definitions.ts +120 -0
  217. package/src/operations/index.ts +16 -0
  218. package/src/operations/open.ts +25 -0
  219. package/src/operations/scroll-to-anchor.ts +39 -0
  220. package/src/operations/set-view-mode.ts +24 -0
  221. package/src/operations/update.conversations.json +1 -0
  222. package/src/operations/update.test.ts +215 -0
  223. package/src/operations/update.ts +51 -0
  224. package/src/testing.ts +6 -6
  225. package/src/translations.ts +49 -34
  226. package/src/types/Markdown.ts +22 -30
  227. package/src/types/Settings.ts +28 -0
  228. package/src/types/capabilities.ts +50 -0
  229. package/src/types/events.ts +14 -0
  230. package/src/types/index.ts +5 -3
  231. package/src/types/types.ts +3 -2
  232. package/src/util.test.ts +44 -0
  233. package/src/util.tsx +77 -7
  234. package/dist/lib/browser/MarkdownCard-JYMDPKV5.mjs +0 -12
  235. package/dist/lib/browser/MarkdownContainer-Y75XSVBX.mjs +0 -15
  236. package/dist/lib/browser/anchor-sort-3HGPGCOO.mjs +0 -31
  237. package/dist/lib/browser/anchor-sort-3HGPGCOO.mjs.map +0 -7
  238. package/dist/lib/browser/app-graph-serializer-POZN234F.mjs +0 -51
  239. package/dist/lib/browser/app-graph-serializer-POZN234F.mjs.map +0 -7
  240. package/dist/lib/browser/blueprint-definition-GIPKFDY5.mjs +0 -13
  241. package/dist/lib/browser/blueprint-definition-GIPKFDY5.mjs.map +0 -7
  242. package/dist/lib/browser/chunk-22XSSNBS.mjs +0 -56
  243. package/dist/lib/browser/chunk-22XSSNBS.mjs.map +0 -7
  244. package/dist/lib/browser/chunk-2MLGSYRN.mjs +0 -20
  245. package/dist/lib/browser/chunk-2MLGSYRN.mjs.map +0 -7
  246. package/dist/lib/browser/chunk-BQTYJOFB.mjs +0 -28
  247. package/dist/lib/browser/chunk-BQTYJOFB.mjs.map +0 -7
  248. package/dist/lib/browser/chunk-GH6GQSBL.mjs +0 -51
  249. package/dist/lib/browser/chunk-GH6GQSBL.mjs.map +0 -7
  250. package/dist/lib/browser/chunk-IBCHVMZW.mjs +0 -16
  251. package/dist/lib/browser/chunk-IBCHVMZW.mjs.map +0 -7
  252. package/dist/lib/browser/chunk-K3LXOU3E.mjs +0 -827
  253. package/dist/lib/browser/chunk-K3LXOU3E.mjs.map +0 -7
  254. package/dist/lib/browser/chunk-PBJLFIOX.mjs +0 -96
  255. package/dist/lib/browser/chunk-PBJLFIOX.mjs.map +0 -7
  256. package/dist/lib/browser/chunk-QYSEJ5GP.mjs +0 -79
  257. package/dist/lib/browser/chunk-QYSEJ5GP.mjs.map +0 -7
  258. package/dist/lib/browser/chunk-Y53FQREH.mjs +0 -150
  259. package/dist/lib/browser/chunk-Y53FQREH.mjs.map +0 -7
  260. package/dist/lib/browser/intent-resolver-Z5L7TXUK.mjs +0 -62
  261. package/dist/lib/browser/intent-resolver-Z5L7TXUK.mjs.map +0 -7
  262. package/dist/lib/browser/react-surface-GO5ZOKNN.mjs +0 -211
  263. package/dist/lib/browser/react-surface-GO5ZOKNN.mjs.map +0 -7
  264. package/dist/lib/browser/settings-TZUDB5EW.mjs +0 -28
  265. package/dist/lib/browser/settings-TZUDB5EW.mjs.map +0 -7
  266. package/dist/lib/browser/state-BTUKVZHY.mjs +0 -37
  267. package/dist/lib/browser/state-BTUKVZHY.mjs.map +0 -7
  268. package/dist/lib/browser/toolkit.mjs +0 -13
  269. package/dist/lib/browser/toolkit.mjs.map +0 -7
  270. package/dist/lib/node-esm/MarkdownCard-ZXPJLUYO.mjs +0 -13
  271. package/dist/lib/node-esm/MarkdownCard-ZXPJLUYO.mjs.map +0 -7
  272. package/dist/lib/node-esm/MarkdownContainer-YRDSRDCS.mjs +0 -16
  273. package/dist/lib/node-esm/MarkdownContainer-YRDSRDCS.mjs.map +0 -7
  274. package/dist/lib/node-esm/anchor-sort-PCDXEBJ2.mjs +0 -32
  275. package/dist/lib/node-esm/anchor-sort-PCDXEBJ2.mjs.map +0 -7
  276. package/dist/lib/node-esm/app-graph-serializer-NF65JYAS.mjs +0 -52
  277. package/dist/lib/node-esm/app-graph-serializer-NF65JYAS.mjs.map +0 -7
  278. package/dist/lib/node-esm/blueprint-definition-ENKJZYQS.mjs +0 -14
  279. package/dist/lib/node-esm/blueprint-definition-ENKJZYQS.mjs.map +0 -7
  280. package/dist/lib/node-esm/chunk-AMHACOXW.mjs +0 -57
  281. package/dist/lib/node-esm/chunk-AMHACOXW.mjs.map +0 -7
  282. package/dist/lib/node-esm/chunk-CT7CFX5G.mjs +0 -828
  283. package/dist/lib/node-esm/chunk-CT7CFX5G.mjs.map +0 -7
  284. package/dist/lib/node-esm/chunk-GMMVSXQ6.mjs +0 -17
  285. package/dist/lib/node-esm/chunk-GMMVSXQ6.mjs.map +0 -7
  286. package/dist/lib/node-esm/chunk-HAIEWPU7.mjs +0 -151
  287. package/dist/lib/node-esm/chunk-HAIEWPU7.mjs.map +0 -7
  288. package/dist/lib/node-esm/chunk-KCHUTL3Q.mjs +0 -22
  289. package/dist/lib/node-esm/chunk-KCHUTL3Q.mjs.map +0 -7
  290. package/dist/lib/node-esm/chunk-NGYJNQ6A.mjs +0 -80
  291. package/dist/lib/node-esm/chunk-NGYJNQ6A.mjs.map +0 -7
  292. package/dist/lib/node-esm/chunk-PIOOG7A5.mjs +0 -97
  293. package/dist/lib/node-esm/chunk-PIOOG7A5.mjs.map +0 -7
  294. package/dist/lib/node-esm/chunk-PLZ7EVCT.mjs +0 -52
  295. package/dist/lib/node-esm/chunk-PLZ7EVCT.mjs.map +0 -7
  296. package/dist/lib/node-esm/chunk-SHAMSMKQ.mjs +0 -29
  297. package/dist/lib/node-esm/chunk-SHAMSMKQ.mjs.map +0 -7
  298. package/dist/lib/node-esm/intent-resolver-6B3PFQ5F.mjs +0 -63
  299. package/dist/lib/node-esm/intent-resolver-6B3PFQ5F.mjs.map +0 -7
  300. package/dist/lib/node-esm/react-surface-I46BPCWT.mjs +0 -212
  301. package/dist/lib/node-esm/react-surface-I46BPCWT.mjs.map +0 -7
  302. package/dist/lib/node-esm/settings-CJ3T5EX4.mjs +0 -29
  303. package/dist/lib/node-esm/settings-CJ3T5EX4.mjs.map +0 -7
  304. package/dist/lib/node-esm/state-K6EH7SRZ.mjs +0 -38
  305. package/dist/lib/node-esm/state-K6EH7SRZ.mjs.map +0 -7
  306. package/dist/lib/node-esm/toolkit.mjs +0 -14
  307. package/dist/lib/node-esm/toolkit.mjs.map +0 -7
  308. package/dist/types/src/capabilities/capabilities.d.ts +0 -12
  309. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  310. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  311. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  312. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts +0 -7
  313. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts.map +0 -1
  314. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts +0 -9
  315. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts.map +0 -1
  316. package/dist/types/src/components/MarkdownCard/index.d.ts +0 -4
  317. package/dist/types/src/components/MarkdownCard/index.d.ts.map +0 -1
  318. package/dist/types/src/components/MarkdownContainer.d.ts +0 -14
  319. package/dist/types/src/components/MarkdownContainer.d.ts.map +0 -1
  320. package/dist/types/src/components/MarkdownContainer.stories.d.ts +0 -58
  321. package/dist/types/src/components/MarkdownContainer.stories.d.ts.map +0 -1
  322. package/dist/types/src/components/Suggestions.stories.d.ts +0 -11
  323. package/dist/types/src/components/Suggestions.stories.d.ts.map +0 -1
  324. package/dist/types/src/events.d.ts +0 -4
  325. package/dist/types/src/events.d.ts.map +0 -1
  326. package/dist/types/src/functions/create.d.ts +0 -8
  327. package/dist/types/src/functions/create.d.ts.map +0 -1
  328. package/dist/types/src/functions/create.test.d.ts.map +0 -1
  329. package/dist/types/src/functions/index.d.ts +0 -18
  330. package/dist/types/src/functions/index.d.ts.map +0 -1
  331. package/dist/types/src/functions/open.d.ts +0 -7
  332. package/dist/types/src/functions/open.d.ts.map +0 -1
  333. package/dist/types/src/functions/update.d.ts +0 -6
  334. package/dist/types/src/functions/update.d.ts.map +0 -1
  335. package/dist/types/src/functions/update.test.d.ts.map +0 -1
  336. package/dist/types/src/hooks/useSelectCurrentThread.d.ts +0 -6
  337. package/dist/types/src/hooks/useSelectCurrentThread.d.ts.map +0 -1
  338. package/dist/types/src/toolkit.d.ts +0 -3
  339. package/dist/types/src/toolkit.d.ts.map +0 -1
  340. package/dist/types/src/types/MarkdownAction.d.ts +0 -34
  341. package/dist/types/src/types/MarkdownAction.d.ts.map +0 -1
  342. package/src/capabilities/capabilities.ts +0 -22
  343. package/src/capabilities/intent-resolver.ts +0 -58
  344. package/src/components/MarkdownCard/MarkdownCard.stories.tsx +0 -76
  345. package/src/components/MarkdownCard/MarkdownCard.tsx +0 -89
  346. package/src/components/MarkdownCard/index.ts +0 -9
  347. package/src/components/MarkdownContainer.stories.tsx +0 -136
  348. package/src/components/MarkdownContainer.tsx +0 -113
  349. package/src/components/Suggestions.stories.tsx +0 -225
  350. package/src/events.ts +0 -11
  351. package/src/functions/create.conversations.json +0 -1
  352. package/src/functions/create.test.ts +0 -128
  353. package/src/functions/create.ts +0 -34
  354. package/src/functions/index.ts +0 -13
  355. package/src/functions/open.ts +0 -32
  356. package/src/functions/update.conversations.json +0 -1
  357. package/src/functions/update.test.ts +0 -151
  358. package/src/functions/update.ts +0 -37
  359. package/src/hooks/useSelectCurrentThread.tsx +0 -66
  360. package/src/toolkit.ts +0 -6
  361. package/src/types/MarkdownAction.ts +0 -29
  362. /package/dist/lib/browser/{MarkdownCard-JYMDPKV5.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  363. /package/dist/lib/{browser/MarkdownContainer-Y75XSVBX.mjs.map → node-esm/chunk-HSLMI22Q.mjs.map} +0 -0
  364. /package/dist/types/src/{functions → operations}/create.test.d.ts +0 -0
  365. /package/dist/types/src/{functions → operations}/update.test.d.ts +0 -0
@@ -0,0 +1,134 @@
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 { Obj, Query } from '@dxos/echo';
14
+ import { ClientPlugin } from '@dxos/plugin-client';
15
+ import { initializeIdentity } from '@dxos/plugin-client/testing';
16
+ import { PreviewPlugin } from '@dxos/plugin-preview';
17
+ import { StorybookPlugin, corePlugins } from '@dxos/plugin-testing';
18
+ import { random } from '@dxos/random';
19
+ import { useQuery, useSpace } from '@dxos/react-client/echo';
20
+ import { useAsyncEffect } from '@dxos/react-ui';
21
+ import { useAttentionAttributes } from '@dxos/react-ui-attention';
22
+ import { withLayout } from '@dxos/react-ui/testing';
23
+ import { Text } from '@dxos/schema';
24
+ import { type ValueGenerator, createObjectFactory } from '@dxos/schema/testing';
25
+ import { Organization, Person } from '@dxos/types';
26
+
27
+ import { Markdown, MarkdownCapabilities, MarkdownEvents } from '#types';
28
+
29
+ import { MarkdownPlugin } from '../../MarkdownPlugin';
30
+ import { translations } from '../../translations';
31
+
32
+ random.seed(1);
33
+
34
+ const generator: ValueGenerator = random as any;
35
+
36
+ /** Minimal plugin that contributes an empty Extensions capability for stories. */
37
+ const MarkdownExtensionsPlugin = Plugin.define({ id: 'story-markdown-extensions', name: 'Story Extensions' }).pipe(
38
+ Plugin.addModule({
39
+ id: 'extensions',
40
+ activatesOn: MarkdownEvents.SetupExtensions,
41
+ activate: () => Effect.succeed(Capability.contributes(MarkdownCapabilities.Extensions, [])),
42
+ }),
43
+ Plugin.make,
44
+ );
45
+
46
+ const DefaultStory = () => {
47
+ const { invokePromise } = useOperationInvoker();
48
+ const space = useSpace();
49
+ const [doc] = useQuery(space?.db, Query.type(Markdown.Document));
50
+ const data = useMemo(() => ({ subject: doc }), [doc]);
51
+ const id = doc && Obj.getDXN(doc).toString();
52
+ const attentionAttrs = useAttentionAttributes(id);
53
+
54
+ useAsyncEffect(async () => {
55
+ if (space) {
56
+ await invokePromise(LayoutOperation.SwitchWorkspace, { subject: space.id });
57
+ }
58
+ }, [space, invokePromise]);
59
+
60
+ return (
61
+ <div className='contents' {...attentionAttrs}>
62
+ <Surface.Surface role='article' data={data} limit={1} />
63
+ </div>
64
+ );
65
+ };
66
+
67
+ const meta = {
68
+ title: 'plugins/plugin-markdown/containers/MarkdownContainer',
69
+ render: DefaultStory,
70
+ decorators: [
71
+ withLayout({ layout: 'column' }),
72
+ withPluginManager<{ title?: string; content?: string }>((context) => ({
73
+ setupEvents: [AppActivationEvents.SetupSettings, MarkdownEvents.SetupExtensions],
74
+ plugins: [
75
+ ...corePlugins(),
76
+ StorybookPlugin({}),
77
+ MarkdownExtensionsPlugin(),
78
+ ClientPlugin({
79
+ types: [Markdown.Document, Text.Text, Person.Person, Organization.Organization],
80
+ onClientInitialized: ({ client }) =>
81
+ Effect.gen(function* () {
82
+ const { personalSpace } = yield* initializeIdentity(client);
83
+
84
+ const createObjects = createObjectFactory(personalSpace.db, generator);
85
+ yield* Effect.promise(() => createObjects([{ type: Organization.Organization, count: 10 }]));
86
+
87
+ const queue = personalSpace.queues.create();
88
+ const kai = Obj.make(Person.Person, { fullName: 'Kai' });
89
+ const dxos = Obj.make(Organization.Organization, { name: 'DXOS' });
90
+ yield* Effect.promise(() => queue.append([kai, dxos]));
91
+
92
+ personalSpace.db.add(
93
+ Markdown.make({
94
+ name: context.args.title ?? 'Testing',
95
+ content: [
96
+ `# ${context.args.title ?? 'Testing'}`,
97
+ context.args.content ?? '',
98
+ // TODO(burdon): Popovers not currently working.
99
+ '## Here are some objects',
100
+ `![Alice](${Obj.getDXN(kai)})`,
101
+ `![DXOS](${Obj.getDXN(dxos)})`,
102
+ '',
103
+ 'END',
104
+ '',
105
+ ].join('\n\n'),
106
+ }),
107
+ );
108
+
109
+ yield* Effect.promise(() => personalSpace.db.flush({ indexes: true }));
110
+ }),
111
+ }),
112
+
113
+ MarkdownPlugin(),
114
+ PreviewPlugin(),
115
+ ],
116
+ })),
117
+ ],
118
+ parameters: {
119
+ layout: 'fullscreen',
120
+ controls: { disable: true },
121
+ translations,
122
+ },
123
+ } satisfies Meta<typeof DefaultStory>;
124
+
125
+ export default meta;
126
+
127
+ type Story = StoryObj<typeof meta>;
128
+
129
+ export const Default: Story = {
130
+ args: {
131
+ title: 'Testing',
132
+ content: ['This is a line with **some** formatting.'].join('\n\n'),
133
+ },
134
+ };
@@ -0,0 +1,135 @@
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 { Text } from '@dxos/schema';
18
+
19
+ import { MarkdownEditor, type MarkdownEditorContentProps, type MarkdownEditorRootProps } from '#components';
20
+ import { useLinkQuery } from '#hooks';
21
+ import { Markdown, MarkdownCapabilities, type MarkdownPluginState } from '#types';
22
+
23
+ export type MarkdownContainerProps = AppSurface.ObjectArticleProps<
24
+ Markdown.Document | Text.Text,
25
+ {
26
+ id: string;
27
+ settings: Markdown.Settings;
28
+ selectionManager?: SelectionManager;
29
+ } & Pick<MarkdownPluginState, 'extensionProviders'> &
30
+ Pick<MarkdownEditorRootProps, 'viewMode' | 'onSelectObject' | 'onViewModeChange'> &
31
+ Pick<MarkdownEditorContentProps, 'editorStateStore'>
32
+ >;
33
+
34
+ export const MarkdownContainer = forwardRef<HTMLDivElement, MarkdownContainerProps>(
35
+ (
36
+ { role, subject: object, id, attendableId, settings, extensionProviders, onSelectObject, ...props },
37
+ forwardedRef,
38
+ ) => {
39
+ const db = Obj.isObject(object) ? Obj.getDatabase(object) : undefined;
40
+ const [docContent] = useObject(Obj.instanceOf(Markdown.Document, object) ? object.content : undefined, 'content');
41
+ const [textContent] = useObject(Obj.instanceOf(Text.Text, object) ? object : undefined, 'content');
42
+ const initialValue = docContent ?? textContent;
43
+
44
+ // Extensions from other plugins.
45
+ const otherExtensionProviders = useCapabilities(MarkdownCapabilities.Extensions);
46
+ const extensions = useMemo<Extension[]>(() => {
47
+ if (!Obj.instanceOf(Markdown.Document, object) && !Obj.instanceOf(Text.Text, object)) {
48
+ return [];
49
+ }
50
+
51
+ return [...(otherExtensionProviders ?? []), ...(extensionProviders ?? [])]
52
+ .flat()
53
+ .reduce((acc: Extension[], provider) => {
54
+ const extension =
55
+ typeof provider === 'function' ? provider({ document: object as Markdown.Document }) : provider;
56
+ if (extension) {
57
+ acc.push(extension);
58
+ }
59
+
60
+ return acc;
61
+ }, []);
62
+ }, [extensionProviders, otherExtensionProviders, object]);
63
+
64
+ // Toolbar actions from app graph.
65
+ const { graph } = useAppGraph();
66
+ const runAction = useActionRunner();
67
+ const customActions = useMemo(() => {
68
+ return Atom.make((get) => {
69
+ const actions = get(graph.actions(attendableId ?? id));
70
+ const nodes = actions.filter((action) => action.properties.disposition === 'toolbar');
71
+ const edges = nodes.map((node) => ({ source: 'root', target: node.id, relation: 'child' }));
72
+ return { nodes, edges };
73
+ });
74
+ }, [graph]);
75
+
76
+ // File upload.
77
+ const [upload] = useCapabilities(AppCapabilities.FileUploader);
78
+ const handleFileUpload = useMemo(() => {
79
+ if (!db || !upload) {
80
+ return undefined;
81
+ }
82
+
83
+ return async (file: File) => upload(db, file);
84
+ }, [db, upload]);
85
+
86
+ // Query for @ refs.
87
+ const handleLinkQuery = useLinkQuery(db);
88
+
89
+ // Open linked objects.
90
+ const { invokePromise } = useOperationInvoker();
91
+ const handleSelectObject = useCallback(
92
+ (targetId: string) => {
93
+ if (onSelectObject) {
94
+ onSelectObject(targetId);
95
+ } else {
96
+ void invokePromise?.(LayoutOperation.Open, {
97
+ subject: [targetId],
98
+ pivotId: attendableId,
99
+ // TODO(wittjosiah): This should probably pre-validate.
100
+ navigation: 'immediate',
101
+ });
102
+ }
103
+ },
104
+ [onSelectObject, invokePromise, attendableId],
105
+ );
106
+
107
+ return (
108
+ <MarkdownEditor.Root
109
+ id={id}
110
+ attendableId={attendableId}
111
+ object={object}
112
+ compact={role !== 'article'}
113
+ extensions={extensions}
114
+ settings={settings}
115
+ onAction={runAction}
116
+ onFileUpload={handleFileUpload}
117
+ onLinkQuery={handleLinkQuery}
118
+ onSelectObject={handleSelectObject}
119
+ {...props}
120
+ >
121
+ <Panel.Root role={role} ref={forwardedRef}>
122
+ {settings.toolbar && (
123
+ <Panel.Toolbar classNames='bg-toolbar-surface'>
124
+ <MarkdownEditor.Toolbar classNames='dx-document' customActions={customActions} />
125
+ </Panel.Toolbar>
126
+ )}
127
+ <Panel.Content>
128
+ <MarkdownEditor.Content initialValue={initialValue} />
129
+ <MarkdownEditor.Blocks />
130
+ </Panel.Content>
131
+ </Panel.Root>
132
+ </MarkdownEditor.Root>
133
+ );
134
+ },
135
+ );
@@ -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'));
@@ -5,4 +5,3 @@
5
5
  export * from './useEditorMenuOptions';
6
6
  export * from './useExtensions';
7
7
  export * from './useLinkQuery';
8
- export * from './useSelectCurrentThread';
@@ -5,7 +5,7 @@
5
5
  import { type EditorView } from '@codemirror/view';
6
6
  import { useCallback, useMemo, useRef } from 'react';
7
7
 
8
- import { Domino, toLocalizedString, useTranslation } from '@dxos/react-ui';
8
+ import { toLocalizedString, useTranslation } from '@dxos/react-ui';
9
9
  import {
10
10
  type EditorMenuGroup,
11
11
  type UseEditorMenuProps,
@@ -13,8 +13,9 @@ import {
13
13
  formattingCommands,
14
14
  linkSlashCommands,
15
15
  } from '@dxos/react-ui-editor';
16
+ import { Domino } from '@dxos/ui';
16
17
 
17
- import { meta } from '../meta';
18
+ import { meta } from '#meta';
18
19
 
19
20
  export type UseEditorMenuOptionsProps = {
20
21
  editorView?: EditorView;
@@ -52,18 +53,14 @@ export const useEditorMenuOptions = ({
52
53
  const trigger = onLinkQuery ? ['/', '@'] : ['/'];
53
54
  const placeholder = {
54
55
  delay: 3_000,
55
- content: () =>
56
- Domino.of('div')
57
- .children(
58
- Domino.of('span').text('Press'),
59
- ...trigger.map((text) =>
60
- Domino.of('span')
61
- .classNames('mx-1 pli-1.5 pt-[1px] pb-[2px] border border-separator rounded-sm')
62
- .text(text),
63
- ),
64
- Domino.of('span').text('for commands.'),
65
- )
66
- .build(),
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
+ },
67
64
  };
68
65
 
69
66
  return { viewRef, getMenu, trigger, placeholder };
@@ -3,19 +3,19 @@
3
3
  //
4
4
 
5
5
  import { type ViewUpdate } from '@codemirror/view';
6
- import React, { type AnchorHTMLAttributes, type ReactNode, useMemo } from 'react';
7
- import { createRoot } from 'react-dom/client';
6
+ import { useMemo } from 'react';
8
7
 
9
- import { LayoutAction, type PromiseIntentDispatcher, createIntent } from '@dxos/app-framework';
10
- import { useIntentDispatcher } from '@dxos/app-framework/react';
8
+ import { fromUrlPath } from '@dxos/app-toolkit';
11
9
  import { debounceAndThrottle } from '@dxos/async';
12
10
  import { Obj } from '@dxos/echo';
11
+ import { createDocAccessor } from '@dxos/echo-db';
13
12
  import { invariant } from '@dxos/invariant';
14
- import { createDocAccessor } from '@dxos/react-client/echo';
15
- import { getSpace } from '@dxos/react-client/echo';
13
+ import { getSpace, useObject } from '@dxos/react-client/echo';
16
14
  import { useIdentity } from '@dxos/react-client/halo';
17
- import { Icon, ThemeProvider } from '@dxos/react-ui';
15
+ import { useThemeContext } from '@dxos/react-ui';
18
16
  import { type SelectionManager } from '@dxos/react-ui-attention';
17
+ import { Text } from '@dxos/schema';
18
+ import { Domino } from '@dxos/ui';
19
19
  import {
20
20
  Cursor,
21
21
  type EditorStateStore,
@@ -36,12 +36,11 @@ import {
36
36
  replacer,
37
37
  selectionState,
38
38
  typewriter,
39
- } from '@dxos/react-ui-editor';
40
- import { defaultTx } from '@dxos/react-ui-theme';
41
- import { Text } from '@dxos/schema';
42
- import { isTruthy } from '@dxos/util';
39
+ } from '@dxos/ui-editor';
40
+ import { isTruthy, safeUrl } from '@dxos/util';
41
+
42
+ import { Markdown } from '#types';
43
43
 
44
- import { Markdown } from '../types';
45
44
  import { setFallbackName } from '../util';
46
45
 
47
46
  export type DocumentType = Markdown.Document | Text.Text | { id: string; text: string };
@@ -49,12 +48,15 @@ export type DocumentType = Markdown.Document | Text.Text | { id: string; text: s
49
48
  export type ExtensionsOptions = {
50
49
  id: string;
51
50
  object?: DocumentType;
52
- dispatch?: PromiseIntentDispatcher;
53
51
  settings?: Markdown.Settings;
54
- selectionManager?: SelectionManager;
52
+ compact?: boolean;
55
53
  viewMode?: EditorViewMode;
54
+ selectionManager?: SelectionManager;
56
55
  editorStateStore?: EditorStateStore;
57
56
  previewOptions?: PreviewOptions;
57
+ platform?: 'mobile' | 'desktop';
58
+ /** Callback when an internal link is clicked. */
59
+ onSelectObject?: (objectId: string) => void;
58
60
  };
59
61
 
60
62
  // TODO(burdon): Merge with createBaseExtensions below.
@@ -62,21 +64,23 @@ export const useExtensions = ({
62
64
  id,
63
65
  object,
64
66
  settings,
65
- selectionManager,
67
+ compact,
66
68
  viewMode,
69
+ selectionManager,
67
70
  editorStateStore,
68
71
  previewOptions,
72
+ onSelectObject,
69
73
  }: ExtensionsOptions): Extension[] => {
70
- const { dispatchPromise: dispatch } = useIntentDispatcher();
74
+ const { platform } = useThemeContext();
71
75
  const identity = useIdentity();
72
76
  const space = getSpace(object);
73
77
 
74
- let target: Obj.Any | undefined;
75
- if (Obj.instanceOf(Markdown.Document, object)) {
76
- target = (object as Markdown.Document).content.target;
77
- } else if (Obj.instanceOf(Text.Text, object)) {
78
- target = object;
79
- }
78
+ // Get the content reference from Document objects.
79
+ const contentRef = Obj.instanceOf(Markdown.Document, object) ? (object as Markdown.Document).content : undefined;
80
+ // Use useObject to trigger re-render when the reference loads (returns snapshot for reactivity).
81
+ useObject(contentRef);
82
+ // Get the actual live object target via .target (needed for createDocAccessor).
83
+ const target = contentRef?.target ?? (Obj.instanceOf(Text.Text, object) ? object : undefined);
80
84
 
81
85
  // TODO(wittjosiah): Autocomplete is not working and this query is causing performance issues.
82
86
  // TODO(burdon): Unsubscribe.
@@ -89,24 +93,28 @@ export const useExtensions = ({
89
93
  id,
90
94
  object,
91
95
  settings,
92
- selectionManager,
96
+ compact,
93
97
  viewMode,
98
+ selectionManager,
94
99
  previewOptions,
95
- dispatch,
100
+ onSelectObject,
101
+ platform,
96
102
  }),
97
103
  [
98
104
  id,
99
105
  object,
106
+ compact,
100
107
  viewMode,
101
- dispatch,
108
+ selectionManager,
102
109
  previewOptions,
110
+ onSelectObject,
103
111
  settings,
104
112
  settings?.debug,
105
113
  settings?.editorInputMode,
106
114
  settings?.folding,
107
115
  settings?.numberedHeadings,
116
+ platform,
108
117
  settings?.typewriter,
109
- selectionManager,
110
118
  ],
111
119
  );
112
120
 
@@ -119,7 +127,7 @@ export const useExtensions = ({
119
127
  createDataExtensions({
120
128
  id,
121
129
  text: createDocAccessor(target, ['content']),
122
- space,
130
+ messenger: space,
123
131
  identity,
124
132
  }),
125
133
 
@@ -144,16 +152,18 @@ export const useExtensions = ({
144
152
  const createBaseExtensions = ({
145
153
  id,
146
154
  object,
147
- dispatch,
155
+ onSelectObject,
148
156
  settings,
149
- selectionManager,
157
+ compact,
150
158
  viewMode,
159
+ selectionManager,
151
160
  previewOptions,
161
+ platform,
152
162
  }: ExtensionsOptions): Extension[] => {
153
163
  const extensions: Extension[] = [
154
164
  selectionManager && selectionChange(selectionManager),
155
165
  settings?.editorInputMode && InputModeExtensions[settings.editorInputMode],
156
- settings?.folding && folding(),
166
+ settings?.folding && !compact && platform !== 'mobile' && folding(),
157
167
  ].filter(isTruthy);
158
168
 
159
169
  //
@@ -166,22 +176,8 @@ const createBaseExtensions = ({
166
176
  decorateMarkdown({
167
177
  selectionChangeDelay: 100,
168
178
  numberedHeadings: settings?.numberedHeadings ? { from: 2 } : undefined,
169
- // TODO(wittjosiah): For internal links, consider ignoring the link text and rendering the label of the object being linked to.
170
- // TODO(burdon): Create dx-tag.
171
- renderLinkButton:
172
- dispatch && (object || id)
173
- ? createLinkRenderer((id: string) => {
174
- void dispatch(
175
- createIntent(LayoutAction.Open, {
176
- part: 'main',
177
- subject: [id],
178
- options: {
179
- pivotId: object && Obj.isObject(object) ? Obj.getDXN(object).toString() : id,
180
- },
181
- }),
182
- );
183
- })
184
- : undefined,
179
+ // TODO(wittjosiah): For internal links render the label of the object.
180
+ renderLinkButton: onSelectObject && createRenderLink(onSelectObject),
185
181
  }),
186
182
  linkTooltip(renderLinkTooltip),
187
183
  preview(previewOptions),
@@ -201,79 +197,67 @@ const createBaseExtensions = ({
201
197
  };
202
198
 
203
199
  const selectionChange = (selectionManager: SelectionManager) => {
204
- return EditorView.updateListener.of(
205
- debounceAndThrottle((update: ViewUpdate) => {
206
- if (update.selectionSet) {
207
- const id = update.state.facet(documentId);
208
- const cursorConverter = update.state.facet(Cursor.converter);
209
- const selection = update.state.selection;
210
- const ranges = selection.ranges
211
- .map((range) => ({
212
- from: cursorConverter.toCursor(range.from),
213
- to: cursorConverter.toCursor(range.to),
214
- }))
215
- .filter(({ from, to }) => to > from);
200
+ const debouncedHandler = debounceAndThrottle((update: ViewUpdate) => {
201
+ const id = update.state.facet(documentId);
202
+ const cursorConverter = update.state.facet(Cursor.converter);
203
+ const selection = update.state.selection;
204
+ const ranges = selection.ranges
205
+ .map((range) => ({
206
+ from: cursorConverter.toCursor(range.from),
207
+ to: cursorConverter.toCursor(range.to),
208
+ }))
209
+ .filter(({ from, to }) => to > from);
216
210
 
217
- selectionManager.updateMultiRange(id, ranges);
218
- }
219
- }, 100),
220
- );
221
- };
211
+ selectionManager.updateMultiRange(id, ranges);
212
+ }, 100);
222
213
 
223
- // TODO(burdon): Factor out styles.
224
- const style = {
225
- hover: 'rounded-sm text-primary-500 hover:text-primary-600 dark:text-primary-500 hover:dark:text-primary-400',
226
- icon: 'inline-block leading-none mis-1 cursor-pointer',
214
+ return EditorView.updateListener.of((update: ViewUpdate) => {
215
+ if (update.selectionSet) {
216
+ debouncedHandler(update);
217
+ }
218
+ });
227
219
  };
228
220
 
229
- const createLinkRenderer =
221
+ const createRenderLink =
230
222
  (onSelectObject: (id: string) => void): RenderCallback<{ url: string }> =>
231
223
  (el, { url }) => {
232
224
  // TODO(burdon): Formalize/document internal link format.
233
- const isInternal =
234
- url.startsWith('/') ||
235
- // TODO(wittjosiah): This should probably be parsed out on paste?
236
- url.startsWith(window.location.origin);
225
+ const isInternal = url.startsWith('/') || url.startsWith(window.location.origin);
226
+ const qualifiedId = isInternal ? fromUrlPath(new URL(url, window.location.origin).pathname) : undefined;
227
+ const icon = Domino.of('span')
228
+ .classNames('dx-link ms-1 inline-block align-[-0.125em]')
229
+ .append(Domino.svg(isInternal ? 'ph--arrow-square-down--regular' : 'ph--arrow-square-out--regular'));
237
230
 
238
- const options: AnchorHTMLAttributes<any> = isInternal
239
- ? {
240
- onClick: () => {
241
- const qualifiedId = url.split('/').at(-1);
242
- invariant(qualifiedId, 'Invalid link format.');
243
- onSelectObject(qualifiedId);
244
- },
245
- }
246
- : {
247
- href: url,
248
- rel: 'noreferrer',
249
- target: '_blank',
250
- };
231
+ if (isInternal) {
232
+ invariant(qualifiedId, 'Invalid link format.');
233
+ icon
234
+ .attributes({ role: 'button', tabindex: '0' })
235
+ .on('click', (event) => {
236
+ event.preventDefault();
237
+ event.stopPropagation();
238
+ onSelectObject(qualifiedId);
239
+ })
240
+ .on('keydown', (event) => {
241
+ const keyboardEvent = event as KeyboardEvent;
242
+ if (keyboardEvent.key !== 'Enter' && keyboardEvent.key !== ' ') {
243
+ return;
244
+ }
251
245
 
252
- renderRoot(
253
- el,
254
- <a {...options} className={style.hover}>
255
- <Icon
256
- icon={isInternal ? 'ph--arrow-square-down--bold' : 'ph--arrow-square-out--bold'}
257
- size={4}
258
- classNames={style.icon}
259
- />
260
- </a>,
261
- );
246
+ keyboardEvent.preventDefault();
247
+ keyboardEvent.stopPropagation();
248
+ onSelectObject(qualifiedId);
249
+ });
250
+ }
251
+
252
+ el.appendChild(icon.root);
262
253
  };
263
254
 
264
255
  const renderLinkTooltip: RenderCallback<{ url: string }> = (el, { url }) => {
265
- const web = new URL(url);
266
- renderRoot(
267
- el,
268
- <a href={url} rel='noreferrer' target='_blank' className={style.hover}>
269
- {web.origin}
270
- <Icon icon='ph--arrow-square-out--bold' size={4} classNames={style.icon} />
271
- </a>,
256
+ el.appendChild(
257
+ Domino.of('a')
258
+ .attributes({ href: url, target: '_blank', rel: 'noreferrer' })
259
+ .classNames('dx-link flex items-center gap-2')
260
+ .text(safeUrl(url)?.toString() ?? url)
261
+ .append(Domino.svg('ph--arrow-square-out--regular')).root,
272
262
  );
273
263
  };
274
-
275
- // TODO(burdon): REMOVE.
276
- const renderRoot = <T extends Element>(root: T, node: ReactNode): T => {
277
- createRoot(root).render(<ThemeProvider tx={defaultTx}>{node}</ThemeProvider>);
278
- return root;
279
- };