@dxos/plugin-markdown 0.8.4-main.72ec0f3 → 0.8.4-main.765dc60934

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 (409) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/neutral/EditableMarkdownCard-LXBXN3OW.mjs +32 -0
  4. package/dist/lib/neutral/EditableMarkdownCard-LXBXN3OW.mjs.map +7 -0
  5. package/dist/lib/neutral/MarkdownArticle-Z4QRU3WD.mjs +126 -0
  6. package/dist/lib/neutral/MarkdownArticle-Z4QRU3WD.mjs.map +7 -0
  7. package/dist/lib/neutral/MarkdownCard-INMBLUL4.mjs +102 -0
  8. package/dist/lib/neutral/MarkdownCard-INMBLUL4.mjs.map +7 -0
  9. package/dist/lib/neutral/MarkdownPlugin.mjs +10 -0
  10. package/dist/lib/neutral/MarkdownPlugin.node.mjs +25 -0
  11. package/dist/lib/neutral/MarkdownPlugin.node.mjs.map +7 -0
  12. package/dist/lib/neutral/MarkdownSettings-YCTZJL5V.mjs +32 -0
  13. package/dist/lib/neutral/MarkdownSettings-YCTZJL5V.mjs.map +7 -0
  14. package/dist/lib/neutral/anchor-sort-L4VCKDO6.mjs +32 -0
  15. package/dist/lib/neutral/anchor-sort-L4VCKDO6.mjs.map +7 -0
  16. package/dist/lib/neutral/app-graph-serializer-YI72EEVM.mjs +55 -0
  17. package/dist/lib/neutral/app-graph-serializer-YI72EEVM.mjs.map +7 -0
  18. package/dist/lib/neutral/blueprint-definition-33OK2KUL.mjs +15 -0
  19. package/dist/lib/neutral/blueprint-definition-33OK2KUL.mjs.map +7 -0
  20. package/dist/lib/neutral/blueprints/index.mjs +8 -0
  21. package/dist/lib/neutral/capabilities/index.mjs +25 -0
  22. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  23. package/dist/lib/neutral/capabilities/node.mjs +11 -0
  24. package/dist/lib/neutral/capabilities/node.mjs.map +7 -0
  25. package/dist/lib/neutral/chunk-6N7AD3IU.mjs +8 -0
  26. package/dist/lib/neutral/chunk-6N7AD3IU.mjs.map +7 -0
  27. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  28. package/dist/lib/neutral/chunk-KDN4GKG2.mjs +98 -0
  29. package/dist/lib/neutral/chunk-KDN4GKG2.mjs.map +7 -0
  30. package/dist/lib/neutral/chunk-LXNSKCPD.mjs +44 -0
  31. package/dist/lib/neutral/chunk-LXNSKCPD.mjs.map +7 -0
  32. package/dist/lib/neutral/chunk-LYUELXJH.mjs +57 -0
  33. package/dist/lib/neutral/chunk-LYUELXJH.mjs.map +7 -0
  34. package/dist/lib/neutral/chunk-SOLAMEK3.mjs +276 -0
  35. package/dist/lib/neutral/chunk-SOLAMEK3.mjs.map +7 -0
  36. package/dist/lib/{browser/chunk-BQTYJOFB.mjs → neutral/chunk-YC2OAUM7.mjs} +3 -9
  37. package/dist/lib/neutral/chunk-YC2OAUM7.mjs.map +7 -0
  38. package/dist/lib/neutral/comment-config-7VTHRUIZ.mjs +30 -0
  39. package/dist/lib/neutral/comment-config-7VTHRUIZ.mjs.map +7 -0
  40. package/dist/lib/neutral/components/index.mjs +370 -0
  41. package/dist/lib/neutral/components/index.mjs.map +7 -0
  42. package/dist/lib/neutral/containers/index.mjs +13 -0
  43. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  44. package/dist/lib/neutral/create-3PGJ2NEK.mjs +28 -0
  45. package/dist/lib/neutral/create-3PGJ2NEK.mjs.map +7 -0
  46. package/dist/lib/neutral/create-markdown-5LS46GMH.mjs +20 -0
  47. package/dist/lib/neutral/create-markdown-5LS46GMH.mjs.map +7 -0
  48. package/dist/lib/neutral/create-object-ZA6VXLJJ.mjs +27 -0
  49. package/dist/lib/neutral/create-object-ZA6VXLJJ.mjs.map +7 -0
  50. package/dist/lib/neutral/hooks/index.mjs +321 -0
  51. package/dist/lib/neutral/hooks/index.mjs.map +7 -0
  52. package/dist/lib/neutral/index.mjs +42 -0
  53. package/dist/lib/neutral/meta.json +1 -0
  54. package/dist/lib/neutral/meta.mjs +8 -0
  55. package/dist/lib/neutral/open-WCYGBLAG.mjs +20 -0
  56. package/dist/lib/neutral/open-WCYGBLAG.mjs.map +7 -0
  57. package/dist/lib/neutral/operation-handler-2ARMPBGZ.mjs +13 -0
  58. package/dist/lib/neutral/operation-handler-2ARMPBGZ.mjs.map +7 -0
  59. package/dist/lib/neutral/operations/index.mjs +8 -0
  60. package/dist/lib/neutral/plugin.mjs +16 -0
  61. package/dist/lib/neutral/plugin.mjs.map +7 -0
  62. package/dist/lib/neutral/react-surface-SCIL76V5.mjs +119 -0
  63. package/dist/lib/neutral/react-surface-SCIL76V5.mjs.map +7 -0
  64. package/dist/lib/neutral/scroll-to-anchor-6FIOKVKT.mjs +47 -0
  65. package/dist/lib/neutral/scroll-to-anchor-6FIOKVKT.mjs.map +7 -0
  66. package/dist/lib/neutral/set-view-mode-37RSPFEN.mjs +24 -0
  67. package/dist/lib/neutral/set-view-mode-37RSPFEN.mjs.map +7 -0
  68. package/dist/lib/neutral/settings-TDGDLCUR.mjs +34 -0
  69. package/dist/lib/neutral/settings-TDGDLCUR.mjs.map +7 -0
  70. package/dist/lib/neutral/state-5COCF5PN.mjs +44 -0
  71. package/dist/lib/neutral/state-5COCF5PN.mjs.map +7 -0
  72. package/dist/lib/neutral/testing.mjs +22 -0
  73. package/dist/lib/neutral/testing.mjs.map +7 -0
  74. package/dist/lib/neutral/translations.mjs +43 -0
  75. package/dist/lib/neutral/translations.mjs.map +7 -0
  76. package/dist/lib/neutral/types/index.mjs +16 -0
  77. package/dist/lib/neutral/update-markdown-5EDRD3SH.mjs +44 -0
  78. package/dist/lib/neutral/update-markdown-5EDRD3SH.mjs.map +7 -0
  79. package/dist/types/src/MarkdownPlugin.d.ts +3 -1
  80. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  81. package/dist/types/src/MarkdownPlugin.node.d.ts +4 -0
  82. package/dist/types/src/MarkdownPlugin.node.d.ts.map +1 -0
  83. package/dist/types/src/MarkdownPlugin.test.d.ts +2 -0
  84. package/dist/types/src/MarkdownPlugin.test.d.ts.map +1 -0
  85. package/dist/types/src/blueprints/index.d.ts +2 -0
  86. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  87. package/dist/types/src/blueprints/markdown-blueprint.d.ts +4 -0
  88. package/dist/types/src/blueprints/markdown-blueprint.d.ts.map +1 -0
  89. package/dist/types/src/capabilities/anchor-sort.d.ts +4 -2
  90. package/dist/types/src/capabilities/anchor-sort.d.ts.map +1 -1
  91. package/dist/types/src/capabilities/app-graph-serializer.d.ts +3 -2
  92. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/artifact-definition.d.ts +3 -1
  94. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  95. package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -6
  96. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -1
  97. package/dist/types/src/capabilities/comment-config.d.ts +12 -0
  98. package/dist/types/src/capabilities/comment-config.d.ts.map +1 -0
  99. package/dist/types/src/capabilities/create-object.d.ts +11 -0
  100. package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
  101. package/dist/types/src/capabilities/index.d.ts +22 -14
  102. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  103. package/dist/types/src/capabilities/node.d.ts +10 -0
  104. package/dist/types/src/capabilities/node.d.ts.map +1 -0
  105. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  106. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  107. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  108. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  109. package/dist/types/src/capabilities/settings.d.ts +4 -2
  110. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  111. package/dist/types/src/capabilities/state.d.ts +4 -9
  112. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  113. package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts +1 -1
  114. package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts.map +1 -1
  115. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +34 -22
  116. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
  117. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts +3 -3
  118. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts.map +1 -1
  119. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts +17 -10
  120. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts.map +1 -1
  121. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts +6 -5
  122. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts.map +1 -1
  123. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts +4 -4
  124. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts.map +1 -1
  125. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.stories.d.ts +94 -0
  126. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.stories.d.ts.map +1 -0
  127. package/dist/types/src/components/MarkdownSettings/index.d.ts +1 -1
  128. package/dist/types/src/components/MarkdownSettings/index.d.ts.map +1 -1
  129. package/dist/types/src/components/index.d.ts +3 -5
  130. package/dist/types/src/components/index.d.ts.map +1 -1
  131. package/dist/types/src/containers/EditableMarkdownCard/EditableMarkdownCard.d.ts +15 -0
  132. package/dist/types/src/containers/EditableMarkdownCard/EditableMarkdownCard.d.ts.map +1 -0
  133. package/dist/types/src/containers/EditableMarkdownCard/index.d.ts +3 -0
  134. package/dist/types/src/containers/EditableMarkdownCard/index.d.ts.map +1 -0
  135. package/dist/types/src/containers/MarkdownArticle/MarkdownArticle.d.ts +36 -0
  136. package/dist/types/src/containers/MarkdownArticle/MarkdownArticle.d.ts.map +1 -0
  137. package/dist/types/src/containers/MarkdownArticle/MarkdownArticle.stories.d.ts +97 -0
  138. package/dist/types/src/containers/MarkdownArticle/MarkdownArticle.stories.d.ts.map +1 -0
  139. package/dist/types/src/containers/MarkdownArticle/index.d.ts +3 -0
  140. package/dist/types/src/containers/MarkdownArticle/index.d.ts.map +1 -0
  141. package/dist/types/src/containers/MarkdownCard/MarkdownCard.d.ts +8 -0
  142. package/dist/types/src/containers/MarkdownCard/MarkdownCard.d.ts.map +1 -0
  143. package/dist/types/src/containers/MarkdownCard/MarkdownCard.stories.d.ts +9 -0
  144. package/dist/types/src/containers/MarkdownCard/MarkdownCard.stories.d.ts.map +1 -0
  145. package/dist/types/src/containers/MarkdownCard/index.d.ts +2 -0
  146. package/dist/types/src/containers/MarkdownCard/index.d.ts.map +1 -0
  147. package/dist/types/src/containers/MarkdownCard/snippet.d.ts +17 -0
  148. package/dist/types/src/containers/MarkdownCard/snippet.d.ts.map +1 -0
  149. package/dist/types/src/containers/index.d.ts +6 -0
  150. package/dist/types/src/containers/index.d.ts.map +1 -0
  151. package/dist/types/src/hooks/index.d.ts +0 -1
  152. package/dist/types/src/hooks/index.d.ts.map +1 -1
  153. package/dist/types/src/hooks/useEditorMenuOptions.d.ts.map +1 -1
  154. package/dist/types/src/hooks/useExtensions.d.ts +10 -6
  155. package/dist/types/src/hooks/useExtensions.d.ts.map +1 -1
  156. package/dist/types/src/hooks/useLinkQuery.d.ts +2 -2
  157. package/dist/types/src/hooks/useLinkQuery.d.ts.map +1 -1
  158. package/dist/types/src/index.d.ts +2 -3
  159. package/dist/types/src/index.d.ts.map +1 -1
  160. package/dist/types/src/meta.d.ts +2 -2
  161. package/dist/types/src/meta.d.ts.map +1 -1
  162. package/dist/types/src/operations/create-markdown.d.ts +5 -0
  163. package/dist/types/src/operations/create-markdown.d.ts.map +1 -0
  164. package/dist/types/src/operations/create.d.ts +5 -0
  165. package/dist/types/src/operations/create.d.ts.map +1 -0
  166. package/dist/types/src/operations/create.test.d.ts.map +1 -0
  167. package/dist/types/src/operations/index.d.ts +3 -0
  168. package/dist/types/src/operations/index.d.ts.map +1 -0
  169. package/dist/types/src/operations/open.d.ts +5 -0
  170. package/dist/types/src/operations/open.d.ts.map +1 -0
  171. package/dist/types/src/operations/scroll-to-anchor.d.ts +5 -0
  172. package/dist/types/src/operations/scroll-to-anchor.d.ts.map +1 -0
  173. package/dist/types/src/operations/set-view-mode.d.ts +5 -0
  174. package/dist/types/src/operations/set-view-mode.d.ts.map +1 -0
  175. package/dist/types/src/operations/update-markdown.d.ts +5 -0
  176. package/dist/types/src/operations/update-markdown.d.ts.map +1 -0
  177. package/dist/types/src/operations/update.test.d.ts.map +1 -0
  178. package/dist/types/src/plugin.d.ts +4 -0
  179. package/dist/types/src/plugin.d.ts.map +1 -0
  180. package/dist/types/src/testing.d.ts +3 -2
  181. package/dist/types/src/testing.d.ts.map +1 -1
  182. package/dist/types/src/translations.d.ts +74 -36
  183. package/dist/types/src/translations.d.ts.map +1 -1
  184. package/dist/types/src/types/Markdown.d.ts +30 -30
  185. package/dist/types/src/types/Markdown.d.ts.map +1 -1
  186. package/dist/types/src/types/MarkdownCapabilities.d.ts +32 -0
  187. package/dist/types/src/types/MarkdownCapabilities.d.ts.map +1 -0
  188. package/dist/types/src/types/MarkdownEvents.d.ts +3 -0
  189. package/dist/types/src/types/MarkdownEvents.d.ts.map +1 -0
  190. package/dist/types/src/types/MarkdownOperation.d.ts +64 -0
  191. package/dist/types/src/types/MarkdownOperation.d.ts.map +1 -0
  192. package/dist/types/src/types/Settings.d.ts +17 -0
  193. package/dist/types/src/types/Settings.d.ts.map +1 -0
  194. package/dist/types/src/types/index.d.ts +5 -2
  195. package/dist/types/src/types/index.d.ts.map +1 -1
  196. package/dist/types/src/types/types.d.ts +3 -2
  197. package/dist/types/src/types/types.d.ts.map +1 -1
  198. package/dist/types/src/util.d.ts +6 -3
  199. package/dist/types/src/util.d.ts.map +1 -1
  200. package/dist/types/src/util.test.d.ts +2 -0
  201. package/dist/types/src/util.test.d.ts.map +1 -0
  202. package/dist/types/tsconfig.tsbuildinfo +1 -1
  203. package/package.json +149 -87
  204. package/src/MarkdownPlugin.node.ts +20 -0
  205. package/src/MarkdownPlugin.test.ts +26 -0
  206. package/src/MarkdownPlugin.tsx +33 -101
  207. package/src/blueprints/index.ts +5 -0
  208. package/src/blueprints/markdown-blueprint.ts +43 -0
  209. package/src/capabilities/anchor-sort.ts +28 -21
  210. package/src/capabilities/app-graph-serializer.ts +52 -43
  211. package/src/capabilities/artifact-definition.ts +83 -86
  212. package/src/capabilities/blueprint-definition.ts +11 -35
  213. package/src/capabilities/comment-config.ts +32 -0
  214. package/src/capabilities/create-object.ts +30 -0
  215. package/src/capabilities/index.ts +15 -11
  216. package/src/capabilities/node.ts +13 -0
  217. package/src/capabilities/operation-handler.ts +16 -0
  218. package/src/capabilities/react-surface.tsx +101 -67
  219. package/src/capabilities/settings.ts +30 -18
  220. package/src/capabilities/state.ts +41 -25
  221. package/src/components/MarkdownEditor/FileUpload.tsx +2 -2
  222. package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +47 -43
  223. package/src/components/MarkdownEditor/MarkdownEditor.tsx +148 -105
  224. package/src/components/MarkdownEditor/MarkdownEditorContent.tsx +66 -33
  225. package/src/components/MarkdownEditor/MarkdownEditorToolbar.tsx +37 -53
  226. package/src/components/MarkdownSettings/MarkdownSettings.stories.tsx +40 -0
  227. package/src/components/MarkdownSettings/MarkdownSettings.tsx +23 -96
  228. package/src/components/MarkdownSettings/index.ts +1 -1
  229. package/src/components/index.ts +4 -7
  230. package/src/containers/EditableMarkdownCard/EditableMarkdownCard.tsx +42 -0
  231. package/src/containers/EditableMarkdownCard/index.ts +6 -0
  232. package/src/containers/MarkdownArticle/MarkdownArticle.stories.tsx +135 -0
  233. package/src/containers/MarkdownArticle/MarkdownArticle.tsx +146 -0
  234. package/src/containers/MarkdownArticle/index.ts +6 -0
  235. package/src/containers/MarkdownCard/MarkdownCard.stories.tsx +68 -0
  236. package/src/containers/MarkdownCard/MarkdownCard.tsx +67 -0
  237. package/src/containers/MarkdownCard/index.ts +5 -0
  238. package/src/containers/MarkdownCard/snippet.ts +54 -0
  239. package/src/containers/index.ts +11 -0
  240. package/src/hooks/index.ts +0 -1
  241. package/src/hooks/useEditorMenuOptions.ts +11 -14
  242. package/src/hooks/useExtensions.tsx +97 -114
  243. package/src/hooks/useLinkQuery.ts +48 -40
  244. package/src/index.ts +2 -5
  245. package/src/meta.ts +7 -4
  246. package/src/operations/create-markdown.ts +19 -0
  247. package/src/operations/create.conversations.json +1 -0
  248. package/src/operations/create.test.ts +96 -0
  249. package/src/operations/create.ts +26 -0
  250. package/src/operations/index.ts +14 -0
  251. package/src/operations/open.ts +25 -0
  252. package/src/operations/scroll-to-anchor.ts +38 -0
  253. package/src/operations/set-view-mode.ts +23 -0
  254. package/src/operations/update-markdown.ts +51 -0
  255. package/src/operations/update.conversations.json +1 -0
  256. package/src/operations/update.test.ts +213 -0
  257. package/src/plugin.ts +11 -0
  258. package/src/testing.ts +9 -7
  259. package/src/translations.ts +26 -35
  260. package/src/types/Markdown.ts +27 -30
  261. package/src/types/MarkdownCapabilities.ts +51 -0
  262. package/src/types/MarkdownEvents.ts +14 -0
  263. package/src/types/MarkdownOperation.ts +122 -0
  264. package/src/types/Settings.ts +65 -0
  265. package/src/types/index.ts +6 -3
  266. package/src/types/types.ts +7 -3
  267. package/src/util.test.ts +44 -0
  268. package/src/util.tsx +78 -8
  269. package/dist/lib/browser/MarkdownCard-JYMDPKV5.mjs +0 -12
  270. package/dist/lib/browser/MarkdownContainer-Y75XSVBX.mjs +0 -15
  271. package/dist/lib/browser/anchor-sort-3HGPGCOO.mjs +0 -31
  272. package/dist/lib/browser/anchor-sort-3HGPGCOO.mjs.map +0 -7
  273. package/dist/lib/browser/app-graph-serializer-POZN234F.mjs +0 -51
  274. package/dist/lib/browser/app-graph-serializer-POZN234F.mjs.map +0 -7
  275. package/dist/lib/browser/blueprint-definition-GIPKFDY5.mjs +0 -13
  276. package/dist/lib/browser/chunk-22XSSNBS.mjs +0 -56
  277. package/dist/lib/browser/chunk-22XSSNBS.mjs.map +0 -7
  278. package/dist/lib/browser/chunk-2MLGSYRN.mjs +0 -20
  279. package/dist/lib/browser/chunk-2MLGSYRN.mjs.map +0 -7
  280. package/dist/lib/browser/chunk-BQTYJOFB.mjs.map +0 -7
  281. package/dist/lib/browser/chunk-GH6GQSBL.mjs +0 -51
  282. package/dist/lib/browser/chunk-GH6GQSBL.mjs.map +0 -7
  283. package/dist/lib/browser/chunk-IBCHVMZW.mjs +0 -16
  284. package/dist/lib/browser/chunk-IBCHVMZW.mjs.map +0 -7
  285. package/dist/lib/browser/chunk-K3LXOU3E.mjs +0 -827
  286. package/dist/lib/browser/chunk-K3LXOU3E.mjs.map +0 -7
  287. package/dist/lib/browser/chunk-PBJLFIOX.mjs +0 -96
  288. package/dist/lib/browser/chunk-PBJLFIOX.mjs.map +0 -7
  289. package/dist/lib/browser/chunk-QYSEJ5GP.mjs +0 -79
  290. package/dist/lib/browser/chunk-QYSEJ5GP.mjs.map +0 -7
  291. package/dist/lib/browser/chunk-Y53FQREH.mjs +0 -150
  292. package/dist/lib/browser/chunk-Y53FQREH.mjs.map +0 -7
  293. package/dist/lib/browser/index.mjs +0 -174
  294. package/dist/lib/browser/index.mjs.map +0 -7
  295. package/dist/lib/browser/intent-resolver-Z5L7TXUK.mjs +0 -62
  296. package/dist/lib/browser/intent-resolver-Z5L7TXUK.mjs.map +0 -7
  297. package/dist/lib/browser/meta.json +0 -1
  298. package/dist/lib/browser/react-surface-GO5ZOKNN.mjs +0 -211
  299. package/dist/lib/browser/react-surface-GO5ZOKNN.mjs.map +0 -7
  300. package/dist/lib/browser/settings-TZUDB5EW.mjs +0 -28
  301. package/dist/lib/browser/settings-TZUDB5EW.mjs.map +0 -7
  302. package/dist/lib/browser/state-BTUKVZHY.mjs +0 -37
  303. package/dist/lib/browser/state-BTUKVZHY.mjs.map +0 -7
  304. package/dist/lib/browser/toolkit.mjs +0 -13
  305. package/dist/lib/browser/types/index.mjs +0 -10
  306. package/dist/lib/node-esm/MarkdownCard-ZXPJLUYO.mjs +0 -13
  307. package/dist/lib/node-esm/MarkdownContainer-YRDSRDCS.mjs +0 -16
  308. package/dist/lib/node-esm/MarkdownContainer-YRDSRDCS.mjs.map +0 -7
  309. package/dist/lib/node-esm/anchor-sort-PCDXEBJ2.mjs +0 -32
  310. package/dist/lib/node-esm/anchor-sort-PCDXEBJ2.mjs.map +0 -7
  311. package/dist/lib/node-esm/app-graph-serializer-NF65JYAS.mjs +0 -52
  312. package/dist/lib/node-esm/app-graph-serializer-NF65JYAS.mjs.map +0 -7
  313. package/dist/lib/node-esm/blueprint-definition-ENKJZYQS.mjs +0 -14
  314. package/dist/lib/node-esm/blueprint-definition-ENKJZYQS.mjs.map +0 -7
  315. package/dist/lib/node-esm/chunk-AMHACOXW.mjs +0 -57
  316. package/dist/lib/node-esm/chunk-AMHACOXW.mjs.map +0 -7
  317. package/dist/lib/node-esm/chunk-CT7CFX5G.mjs +0 -828
  318. package/dist/lib/node-esm/chunk-CT7CFX5G.mjs.map +0 -7
  319. package/dist/lib/node-esm/chunk-GMMVSXQ6.mjs +0 -17
  320. package/dist/lib/node-esm/chunk-GMMVSXQ6.mjs.map +0 -7
  321. package/dist/lib/node-esm/chunk-HAIEWPU7.mjs +0 -151
  322. package/dist/lib/node-esm/chunk-HAIEWPU7.mjs.map +0 -7
  323. package/dist/lib/node-esm/chunk-KCHUTL3Q.mjs +0 -22
  324. package/dist/lib/node-esm/chunk-KCHUTL3Q.mjs.map +0 -7
  325. package/dist/lib/node-esm/chunk-NGYJNQ6A.mjs +0 -80
  326. package/dist/lib/node-esm/chunk-NGYJNQ6A.mjs.map +0 -7
  327. package/dist/lib/node-esm/chunk-PIOOG7A5.mjs +0 -97
  328. package/dist/lib/node-esm/chunk-PIOOG7A5.mjs.map +0 -7
  329. package/dist/lib/node-esm/chunk-PLZ7EVCT.mjs +0 -52
  330. package/dist/lib/node-esm/chunk-PLZ7EVCT.mjs.map +0 -7
  331. package/dist/lib/node-esm/chunk-SHAMSMKQ.mjs +0 -29
  332. package/dist/lib/node-esm/chunk-SHAMSMKQ.mjs.map +0 -7
  333. package/dist/lib/node-esm/index.mjs +0 -175
  334. package/dist/lib/node-esm/index.mjs.map +0 -7
  335. package/dist/lib/node-esm/intent-resolver-6B3PFQ5F.mjs +0 -63
  336. package/dist/lib/node-esm/intent-resolver-6B3PFQ5F.mjs.map +0 -7
  337. package/dist/lib/node-esm/meta.json +0 -1
  338. package/dist/lib/node-esm/react-surface-I46BPCWT.mjs +0 -212
  339. package/dist/lib/node-esm/react-surface-I46BPCWT.mjs.map +0 -7
  340. package/dist/lib/node-esm/settings-CJ3T5EX4.mjs +0 -29
  341. package/dist/lib/node-esm/settings-CJ3T5EX4.mjs.map +0 -7
  342. package/dist/lib/node-esm/state-K6EH7SRZ.mjs +0 -38
  343. package/dist/lib/node-esm/state-K6EH7SRZ.mjs.map +0 -7
  344. package/dist/lib/node-esm/toolkit.mjs +0 -14
  345. package/dist/lib/node-esm/toolkit.mjs.map +0 -7
  346. package/dist/lib/node-esm/types/index.mjs +0 -11
  347. package/dist/types/src/capabilities/capabilities.d.ts +0 -12
  348. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  349. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  350. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  351. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts +0 -7
  352. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts.map +0 -1
  353. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts +0 -9
  354. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts.map +0 -1
  355. package/dist/types/src/components/MarkdownCard/index.d.ts +0 -4
  356. package/dist/types/src/components/MarkdownCard/index.d.ts.map +0 -1
  357. package/dist/types/src/components/MarkdownContainer.d.ts +0 -14
  358. package/dist/types/src/components/MarkdownContainer.d.ts.map +0 -1
  359. package/dist/types/src/components/MarkdownContainer.stories.d.ts +0 -58
  360. package/dist/types/src/components/MarkdownContainer.stories.d.ts.map +0 -1
  361. package/dist/types/src/components/Suggestions.stories.d.ts +0 -11
  362. package/dist/types/src/components/Suggestions.stories.d.ts.map +0 -1
  363. package/dist/types/src/events.d.ts +0 -4
  364. package/dist/types/src/events.d.ts.map +0 -1
  365. package/dist/types/src/functions/create.d.ts +0 -8
  366. package/dist/types/src/functions/create.d.ts.map +0 -1
  367. package/dist/types/src/functions/create.test.d.ts.map +0 -1
  368. package/dist/types/src/functions/index.d.ts +0 -18
  369. package/dist/types/src/functions/index.d.ts.map +0 -1
  370. package/dist/types/src/functions/open.d.ts +0 -7
  371. package/dist/types/src/functions/open.d.ts.map +0 -1
  372. package/dist/types/src/functions/update.d.ts +0 -6
  373. package/dist/types/src/functions/update.d.ts.map +0 -1
  374. package/dist/types/src/functions/update.test.d.ts.map +0 -1
  375. package/dist/types/src/hooks/useSelectCurrentThread.d.ts +0 -6
  376. package/dist/types/src/hooks/useSelectCurrentThread.d.ts.map +0 -1
  377. package/dist/types/src/toolkit.d.ts +0 -3
  378. package/dist/types/src/toolkit.d.ts.map +0 -1
  379. package/dist/types/src/types/MarkdownAction.d.ts +0 -34
  380. package/dist/types/src/types/MarkdownAction.d.ts.map +0 -1
  381. package/src/capabilities/capabilities.ts +0 -22
  382. package/src/capabilities/intent-resolver.ts +0 -58
  383. package/src/components/MarkdownCard/MarkdownCard.stories.tsx +0 -76
  384. package/src/components/MarkdownCard/MarkdownCard.tsx +0 -89
  385. package/src/components/MarkdownCard/index.ts +0 -9
  386. package/src/components/MarkdownContainer.stories.tsx +0 -136
  387. package/src/components/MarkdownContainer.tsx +0 -113
  388. package/src/components/Suggestions.stories.tsx +0 -225
  389. package/src/events.ts +0 -11
  390. package/src/functions/create.conversations.json +0 -1
  391. package/src/functions/create.test.ts +0 -128
  392. package/src/functions/create.ts +0 -34
  393. package/src/functions/index.ts +0 -13
  394. package/src/functions/open.ts +0 -32
  395. package/src/functions/update.conversations.json +0 -1
  396. package/src/functions/update.test.ts +0 -151
  397. package/src/functions/update.ts +0 -37
  398. package/src/hooks/useSelectCurrentThread.tsx +0 -66
  399. package/src/toolkit.ts +0 -6
  400. package/src/types/MarkdownAction.ts +0 -29
  401. /package/dist/lib/{browser/MarkdownCard-JYMDPKV5.mjs.map → neutral/MarkdownPlugin.mjs.map} +0 -0
  402. /package/dist/lib/{browser/types → neutral/blueprints}/index.mjs.map +0 -0
  403. /package/dist/lib/{browser/MarkdownContainer-Y75XSVBX.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
  404. /package/dist/lib/{node-esm/types → neutral}/index.mjs.map +0 -0
  405. /package/dist/lib/{browser/blueprint-definition-GIPKFDY5.mjs.map → neutral/meta.mjs.map} +0 -0
  406. /package/dist/lib/{browser/toolkit.mjs.map → neutral/operations/index.mjs.map} +0 -0
  407. /package/dist/lib/{node-esm/MarkdownCard-ZXPJLUYO.mjs.map → neutral/types/index.mjs.map} +0 -0
  408. /package/dist/types/src/{functions → operations}/create.test.d.ts +0 -0
  409. /package/dist/types/src/{functions → operations}/update.test.d.ts +0 -0
@@ -0,0 +1,54 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { EditorState } from '@codemirror/state';
6
+ import { EditorView } from '@codemirror/view';
7
+
8
+ export type SnippetOptions = {
9
+ /** Maximum height of the editor in pixels. Overflowing content is hidden. */
10
+ height: number;
11
+ /** Zoom factor applied to the editor (e.g. 0.5 renders at 50%). @default 1 */
12
+ scale?: number;
13
+ };
14
+
15
+ /**
16
+ * CodeMirror extension for rendering a non-scrollable snippet of editor content.
17
+ * Constrains the editor to the given height via CSS `max-height`, wraps long
18
+ * lines (`pre-wrap`), and disables scrolling entirely.
19
+ *
20
+ * NOTE: Uses CSS `zoom` rather than `transform: scale` because `zoom` affects
21
+ * layout, so line wrapping fills the full visual width of the container.
22
+ * `transform: scale` only scales paint output, leaving empty space on the right.
23
+ */
24
+ export const snippet = ({ height, scale = 1 }: SnippetOptions) => {
25
+ return [
26
+ EditorState.readOnly.of(true),
27
+ EditorView.editable.of(false),
28
+ EditorState.transactionFilter.of((tr) => {
29
+ if (tr.selection) {
30
+ return [];
31
+ } // Drop any selection changes.
32
+ return tr;
33
+ }),
34
+ EditorView.theme({
35
+ // Outer editor element: clip to the caller-specified height.
36
+ '&': {
37
+ maxHeight: `${height}px`,
38
+ overflow: 'hidden',
39
+ },
40
+ '.cm-scroller': {
41
+ // Prevent scroll; scale up the inner clip so the final pixel height matches `height`.
42
+ maxHeight: `${height / scale}px`,
43
+ overflow: 'hidden !important',
44
+ padding: '0',
45
+ },
46
+ '.cm-content': {
47
+ // zoom (unlike transform: scale) affects layout, so line-wrapping fills the full visual width of the container.
48
+ zoom: scale,
49
+ margin: '0',
50
+ padding: '0',
51
+ },
52
+ }),
53
+ ];
54
+ };
@@ -0,0 +1,11 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type ComponentType, lazy } from 'react';
6
+
7
+ export type { MarkdownArticleProps } from './MarkdownArticle';
8
+
9
+ export const MarkdownCard: ComponentType<any> = lazy(() => import('./MarkdownCard'));
10
+ export const EditableMarkdownCard: ComponentType<any> = lazy(() => import('./EditableMarkdownCard'));
11
+ export const MarkdownArticle: ComponentType<any> = lazy(() => import('./MarkdownArticle'));
@@ -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,28 +3,26 @@
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,
22
22
  EditorView,
23
- type EditorViewMode,
24
23
  type Extension,
25
24
  InputModeExtensions,
26
25
  type PreviewOptions,
27
- type RenderCallback,
28
26
  createDataExtensions,
29
27
  decorateMarkdown,
30
28
  documentId,
@@ -35,13 +33,13 @@ import {
35
33
  preview,
36
34
  replacer,
37
35
  selectionState,
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';
36
+ snippets,
37
+ } from '@dxos/ui-editor';
38
+ import { type EditorViewMode, type RenderCallback } from '@dxos/ui-editor/types';
39
+ import { isTruthy, safeUrl } from '@dxos/util';
40
+
41
+ import { Markdown } from '#types';
43
42
 
44
- import { Markdown } from '../types';
45
43
  import { setFallbackName } from '../util';
46
44
 
47
45
  export type DocumentType = Markdown.Document | Text.Text | { id: string; text: string };
@@ -49,12 +47,16 @@ export type DocumentType = Markdown.Document | Text.Text | { id: string; text: s
49
47
  export type ExtensionsOptions = {
50
48
  id: string;
51
49
  object?: DocumentType;
52
- dispatch?: PromiseIntentDispatcher;
53
50
  settings?: Markdown.Settings;
54
- selectionManager?: SelectionManager;
51
+ compact?: boolean;
55
52
  viewMode?: EditorViewMode;
53
+ editable?: boolean;
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,27 @@ 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
+ platform,
101
+ onSelectObject,
96
102
  }),
97
103
  [
98
104
  id,
99
105
  object,
106
+ compact,
100
107
  viewMode,
101
- dispatch,
108
+ selectionManager,
102
109
  previewOptions,
103
110
  settings,
104
111
  settings?.debug,
105
112
  settings?.editorInputMode,
106
113
  settings?.folding,
107
114
  settings?.numberedHeadings,
108
- settings?.typewriter,
109
- selectionManager,
115
+ platform,
116
+ onSelectObject,
110
117
  ],
111
118
  );
112
119
 
@@ -119,7 +126,7 @@ export const useExtensions = ({
119
126
  createDataExtensions({
120
127
  id,
121
128
  text: createDocAccessor(target, ['content']),
122
- space,
129
+ messenger: space,
123
130
  identity,
124
131
  }),
125
132
 
@@ -144,16 +151,18 @@ export const useExtensions = ({
144
151
  const createBaseExtensions = ({
145
152
  id,
146
153
  object,
147
- dispatch,
154
+ onSelectObject,
148
155
  settings,
149
- selectionManager,
156
+ compact,
150
157
  viewMode,
158
+ selectionManager,
151
159
  previewOptions,
160
+ platform,
152
161
  }: ExtensionsOptions): Extension[] => {
153
162
  const extensions: Extension[] = [
154
163
  selectionManager && selectionChange(selectionManager),
155
164
  settings?.editorInputMode && InputModeExtensions[settings.editorInputMode],
156
- settings?.folding && folding(),
165
+ settings?.folding && !compact && platform !== 'mobile' && folding(),
157
166
  ].filter(isTruthy);
158
167
 
159
168
  //
@@ -166,22 +175,8 @@ const createBaseExtensions = ({
166
175
  decorateMarkdown({
167
176
  selectionChangeDelay: 100,
168
177
  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,
178
+ // TODO(wittjosiah): For internal links render the label of the object.
179
+ renderLinkButton: onSelectObject && createRenderLink(onSelectObject),
185
180
  }),
186
181
  linkTooltip(renderLinkTooltip),
187
182
  preview(previewOptions),
@@ -191,9 +186,9 @@ const createBaseExtensions = ({
191
186
  }
192
187
 
193
188
  if (settings?.debug) {
194
- const items = settings.typewriter?.split(/[,\n]/) ?? '';
189
+ const items = settings.snippets?.split(/[,\n]/) ?? '';
195
190
  if (items) {
196
- extensions.push(typewriter({ items }));
191
+ extensions.push(snippets({ items }));
197
192
  }
198
193
  }
199
194
 
@@ -201,79 +196,67 @@ const createBaseExtensions = ({
201
196
  };
202
197
 
203
198
  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);
199
+ const debouncedHandler = debounceAndThrottle((update: ViewUpdate) => {
200
+ const id = update.state.facet(documentId);
201
+ const cursorConverter = update.state.facet(Cursor.converter);
202
+ const selection = update.state.selection;
203
+ const ranges = selection.ranges
204
+ .map((range) => ({
205
+ from: cursorConverter.toCursor(range.from),
206
+ to: cursorConverter.toCursor(range.to),
207
+ }))
208
+ .filter(({ from, to }) => to > from);
216
209
 
217
- selectionManager.updateMultiRange(id, ranges);
218
- }
219
- }, 100),
220
- );
221
- };
210
+ selectionManager.updateMultiRange(id, ranges);
211
+ }, 100);
222
212
 
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',
213
+ return EditorView.updateListener.of((update: ViewUpdate) => {
214
+ if (update.selectionSet) {
215
+ debouncedHandler(update);
216
+ }
217
+ });
227
218
  };
228
219
 
229
- const createLinkRenderer =
220
+ const createRenderLink =
230
221
  (onSelectObject: (id: string) => void): RenderCallback<{ url: string }> =>
231
222
  (el, { url }) => {
232
223
  // 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);
224
+ const isInternal = url.startsWith('/') || url.startsWith(window.location.origin);
225
+ const qualifiedId = isInternal ? fromUrlPath(new URL(url, window.location.origin).pathname) : undefined;
226
+ const icon = Domino.of('span')
227
+ .classNames('dx-link ms-1 inline-block align-[-0.125em]')
228
+ .append(Domino.svg(isInternal ? 'ph--arrow-square-down--regular' : 'ph--arrow-square-out--regular'));
237
229
 
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
- };
230
+ if (isInternal) {
231
+ invariant(qualifiedId, 'Invalid link format.');
232
+ icon
233
+ .attributes({ role: 'button', tabindex: '0' })
234
+ .on('click', (event) => {
235
+ event.preventDefault();
236
+ event.stopPropagation();
237
+ onSelectObject(qualifiedId);
238
+ })
239
+ .on('keydown', (event) => {
240
+ const keyboardEvent = event as KeyboardEvent;
241
+ if (keyboardEvent.key !== 'Enter' && keyboardEvent.key !== ' ') {
242
+ return;
243
+ }
251
244
 
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
- );
245
+ keyboardEvent.preventDefault();
246
+ keyboardEvent.stopPropagation();
247
+ onSelectObject(qualifiedId);
248
+ });
249
+ }
250
+
251
+ el.appendChild(icon.root);
262
252
  };
263
253
 
264
254
  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>,
255
+ el.appendChild(
256
+ Domino.of('a')
257
+ .attributes({ href: url, target: '_blank', rel: 'noreferrer' })
258
+ .classNames('dx-link flex items-center gap-2')
259
+ .text(safeUrl(url)?.toString() ?? url)
260
+ .append(Domino.svg('ph--arrow-square-out--regular')).root,
272
261
  );
273
262
  };
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
- };
@@ -2,69 +2,56 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
+ import * as Option from 'effect/Option';
5
6
  import { useCallback, useMemo } from 'react';
6
7
 
7
- import { Capabilities } from '@dxos/app-framework';
8
- import { useCapabilities, usePluginManager } from '@dxos/app-framework/react';
9
- import { Filter, Obj, Query, Type } from '@dxos/echo';
10
- import { ClientCapabilities } from '@dxos/plugin-client';
11
- import { SpaceCapabilities } from '@dxos/plugin-space';
12
- import { type Space } from '@dxos/react-client/echo';
13
- import { toLocalizedString, useTranslation } from '@dxos/react-ui';
14
- import { type EditorMenuGroup, type EditorMenuItem, insertAtCursor, insertAtLineStart } from '@dxos/react-ui-editor';
8
+ import { Annotation, type Database, Filter, Obj, Query, Type } from '@dxos/echo';
9
+ import { EntityKind, SystemTypeAnnotation, getTypeAnnotation } from '@dxos/echo/internal';
10
+ import { type Label, toLocalizedString, useTranslation } from '@dxos/react-ui';
11
+ import { type EditorMenuGroup, type EditorMenuItem } from '@dxos/react-ui-editor';
12
+ import { insertAtCursor, insertAtLineStart } from '@dxos/ui-editor';
15
13
 
16
- export const useLinkQuery = (space: Space | undefined) => {
17
- const { t } = useTranslation();
14
+ import { Markdown } from '../types';
18
15
 
19
- const manager = usePluginManager();
20
- const resolve = useCallback(
21
- (typename: string) =>
22
- manager.context.getCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {},
23
- [manager],
24
- );
16
+ export const useLinkQuery = (db: Database.Database | undefined) => {
17
+ const { t } = useTranslation();
25
18
 
26
- const objectForms = useCapabilities(SpaceCapabilities.ObjectForm);
27
- const schemaWhiteList = useCapabilities(ClientCapabilities.SchemaWhiteList);
28
19
  const filter = useMemo(
29
20
  () =>
30
21
  Filter.or(
31
- ...objectForms.map((form) => Filter.type(form.objectSchema)),
32
- ...schemaWhiteList.flat().map((schema) => Filter.typename(Type.getTypename(schema))),
22
+ ...(db?.schemaRegistry.query({ location: ['database', 'runtime'] }).runSync() ?? [])
23
+ .filter((schema) => getTypeAnnotation(schema)?.kind !== EntityKind.Relation)
24
+ .filter((schema) => !SystemTypeAnnotation.get(schema).pipe(Option.getOrElse(() => false)))
25
+ .map((schema) => Filter.typename(Type.getTypename(schema))),
33
26
  ),
34
- [objectForms, schemaWhiteList],
27
+ [db],
35
28
  );
36
29
 
37
30
  const handleLinkQuery = useCallback(
38
31
  async (query?: string): Promise<EditorMenuGroup[]> => {
32
+ // A second "@" switches the link query into block-embed mode, so "@@foo" searches for "foo".
39
33
  const name = query?.startsWith('@') ? query.slice(1).toLowerCase() : (query?.toLowerCase() ?? '');
40
- const results = await space?.db.query(Query.select(filter)).run();
34
+ const results = await db?.query(Query.select(filter)).run();
41
35
 
42
- // TODO(wittjosiah): Use `Obj.Any` type.
43
- const getLabel = (object: any) => {
44
- const label = Obj.getLabel(object);
45
- if (label) {
46
- return label;
47
- }
48
-
49
- // TODO(wittjosiah): Remove metadata labels.
36
+ const getLabel = (object: Obj.Unknown): Label => {
50
37
  const type = Obj.getTypename(object)!;
51
- const metadata = resolve(type);
52
- return metadata.label?.(object) || ['object name placeholder', { ns: type, default: 'New object' }];
38
+ return Obj.getLabel(object) ?? ['object-name.placeholder', { ns: type, defaultValue: 'New object' }];
53
39
  };
54
40
 
55
41
  const items =
56
- results?.objects
57
- .filter((object) => toLocalizedString(getLabel(object), t).toLowerCase().includes(name))
58
- // TODO(wittjosiah): Remove `any` type.
59
- .map((object: any): EditorMenuItem => {
60
- const metadata = resolve(Obj.getTypename(object)!);
42
+ results
43
+ ?.filter((object) => toLocalizedString(getLabel(object), t).toLowerCase().includes(name))
44
+ .map((object: Obj.Unknown): EditorMenuItem => {
45
+ const schema = Obj.getSchema(object);
46
+ const icon = schema ? Option.getOrUndefined(Annotation.IconAnnotation.get(schema))?.icon : undefined;
61
47
  const label = toLocalizedString(getLabel(object), t);
62
48
  return {
63
49
  id: object.id,
64
50
  label,
65
- icon: metadata.icon,
51
+ icon,
66
52
  onSelect: ({ view, head }) => {
67
53
  const link = `[${label}](${Obj.getDXN(object)})`;
54
+ // "@@" inserts a block embed on its own line instead of an inline link.
68
55
  if (query?.startsWith('@')) {
69
56
  insertAtLineStart(view, head, `!${link}\n`);
70
57
  } else {
@@ -74,9 +61,30 @@ export const useLinkQuery = (space: Space | undefined) => {
74
61
  };
75
62
  }) ?? [];
76
63
 
77
- return [{ id: 'echo', items }];
64
+ // Add "Create new document" option at the end.
65
+ const createItem: EditorMenuItem = {
66
+ id: 'create-document',
67
+ label: ['add-object.label', { ns: Markdown.Document.typename }],
68
+ icon: 'ph--plus--regular',
69
+ onSelect: ({ view, head }) => {
70
+ const doc = Markdown.make({ name: name || undefined });
71
+ db?.add(doc);
72
+ const label = name || t('object-name.placeholder', { ns: Markdown.Document.typename });
73
+ const link = `[${label}](${Obj.getDXN(doc)})`;
74
+ if (query?.startsWith('@')) {
75
+ insertAtLineStart(view, head, `!${link}\n`);
76
+ } else {
77
+ insertAtCursor(view, head, `${link} `);
78
+ }
79
+ },
80
+ };
81
+
82
+ return [
83
+ { id: 'echo', items },
84
+ { id: 'create', items: [createItem] },
85
+ ];
78
86
  },
79
- [space, filter, resolve],
87
+ [db, filter, t],
80
88
  );
81
89
 
82
90
  return handleLinkQuery;
package/src/index.ts CHANGED
@@ -2,11 +2,8 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- export { MarkdownCapabilities } from './capabilities';
6
- export { MarkdownEvents } from './events';
7
-
5
+ export * from './blueprints';
8
6
  export * from './meta';
7
+ export * from './operations';
9
8
  export * from './types';
10
9
  export * from './util';
11
-
12
- export * from './MarkdownPlugin';
package/src/meta.ts CHANGED
@@ -2,11 +2,11 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { type PluginMeta } from '@dxos/app-framework';
5
+ import { type Plugin } from '@dxos/app-framework';
6
6
  import { trim } from '@dxos/util';
7
7
 
8
- export const meta: PluginMeta = {
9
- id: 'dxos.org/plugin/markdown',
8
+ export const meta: Plugin.Meta = {
9
+ id: 'org.dxos.plugin.markdown',
10
10
  name: 'Markdown',
11
11
  description: trim`
12
12
  Full-featured collaborative markdown editor with real-time editing, inline comments, and rich formatting.
@@ -15,5 +15,8 @@ export const meta: PluginMeta = {
15
15
  icon: 'ph--text-aa--regular',
16
16
  iconHue: 'indigo',
17
17
  source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-markdown',
18
- screenshots: ['https://dxos.network/plugin-details-markdown-dark.png'],
18
+ screenshots: [
19
+ 'https://customer-5rxcjpyab08avpmn.cloudflarestream.com/cdf2656365bb1fd327c1fc2105d75e5a/iframe?poster=https%3A%2F%2Fcustomer-5rxcjpyab08avpmn.cloudflarestream.com%2Fcdf2656365bb1fd327c1fc2105d75e5a%2Fthumbnails%2Fthumbnail.jpg%3Ftime%3D%26height%3D600',
20
+ 'https://dxos.network/plugin-details-markdown-dark.png',
21
+ ],
19
22
  };
@@ -0,0 +1,19 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+
7
+ import { Operation } from '@dxos/compute';
8
+
9
+ import { Markdown, MarkdownOperation } from '../types';
10
+
11
+ const handler: Operation.WithHandler<typeof MarkdownOperation.CreateMarkdown> = MarkdownOperation.CreateMarkdown.pipe(
12
+ Operation.withHandler(({ name, content }) =>
13
+ Effect.succeed({
14
+ object: Markdown.make({ name, content }),
15
+ }),
16
+ ),
17
+ );
18
+
19
+ export default handler;