@dxos/plugin-markdown 0.8.4-main.937b3ca → 0.8.4-main.9be5663bfe

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 (367) 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 +47 -4
  4. package/dist/lib/browser/blueprints/index.mjs.map +4 -4
  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 +26 -19
  11. package/dist/lib/browser/cli/index.mjs.map +3 -3
  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 +606 -85
  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 +6 -7
  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 +47 -4
  33. package/dist/lib/node-esm/blueprints/index.mjs.map +4 -4
  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 +26 -19
  40. package/dist/lib/node-esm/cli/index.mjs.map +3 -3
  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 +606 -85
  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 +6 -7
  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.map +1 -1
  60. package/dist/types/src/blueprints/index.d.ts +1 -1
  61. package/dist/types/src/blueprints/index.d.ts.map +1 -1
  62. package/dist/types/src/blueprints/markdown-blueprint.d.ts +3 -20
  63. package/dist/types/src/blueprints/markdown-blueprint.d.ts.map +1 -1
  64. package/dist/types/src/capabilities/anchor-sort.d.ts +6 -0
  65. package/dist/types/src/capabilities/anchor-sort.d.ts.map +1 -0
  66. package/dist/types/src/capabilities/app-graph-serializer.d.ts +5 -0
  67. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -0
  68. package/dist/types/src/capabilities/artifact-definition.d.ts +5 -0
  69. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -0
  70. package/dist/types/src/capabilities/blueprint-definition.d.ts +6 -0
  71. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  72. package/dist/types/src/capabilities/index.d.ts +27 -7
  73. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  74. package/dist/types/src/capabilities/node.d.ts +4 -0
  75. package/dist/types/src/capabilities/node.d.ts.map +1 -0
  76. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  77. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  78. package/dist/types/src/capabilities/react-surface.d.ts +5 -0
  79. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  80. package/dist/types/src/capabilities/settings.d.ts +24 -0
  81. package/dist/types/src/capabilities/settings.d.ts.map +1 -0
  82. package/dist/types/src/capabilities/state.d.ts +6 -0
  83. package/dist/types/src/capabilities/state.d.ts.map +1 -0
  84. package/dist/types/src/cli/plugin.d.ts.map +1 -1
  85. package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts +2 -2
  86. package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts.map +1 -1
  87. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +25 -22
  88. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
  89. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts +3 -3
  90. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts.map +1 -1
  91. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts +4 -2
  92. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts.map +1 -1
  93. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts +7 -6
  94. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts.map +1 -1
  95. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts +4 -6
  96. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts.map +1 -1
  97. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.stories.d.ts +138 -0
  98. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.stories.d.ts.map +1 -0
  99. package/dist/types/src/components/MarkdownSettings/index.d.ts +1 -1
  100. package/dist/types/src/components/MarkdownSettings/index.d.ts.map +1 -1
  101. package/dist/types/src/components/index.d.ts +3 -8
  102. package/dist/types/src/components/index.d.ts.map +1 -1
  103. package/dist/types/src/{components → containers}/MarkdownCard/MarkdownCard.d.ts +1 -1
  104. package/dist/types/src/containers/MarkdownCard/MarkdownCard.d.ts.map +1 -0
  105. package/dist/types/src/containers/MarkdownCard/MarkdownCard.stories.d.ts.map +1 -0
  106. package/dist/types/src/containers/MarkdownCard/index.d.ts +2 -0
  107. package/dist/types/src/containers/MarkdownCard/index.d.ts.map +1 -0
  108. package/dist/types/src/containers/MarkdownCard/snippet.d.ts +15 -0
  109. package/dist/types/src/containers/MarkdownCard/snippet.d.ts.map +1 -0
  110. package/dist/types/src/containers/MarkdownContainer/MarkdownContainer.d.ts +36 -0
  111. package/dist/types/src/containers/MarkdownContainer/MarkdownContainer.d.ts.map +1 -0
  112. package/dist/types/src/containers/MarkdownContainer/MarkdownContainer.stories.d.ts +99 -0
  113. package/dist/types/src/containers/MarkdownContainer/MarkdownContainer.stories.d.ts.map +1 -0
  114. package/dist/types/src/containers/MarkdownContainer/index.d.ts +3 -0
  115. package/dist/types/src/containers/MarkdownContainer/index.d.ts.map +1 -0
  116. package/dist/types/src/containers/index.d.ts +5 -0
  117. package/dist/types/src/containers/index.d.ts.map +1 -0
  118. package/dist/types/src/hooks/index.d.ts +0 -1
  119. package/dist/types/src/hooks/index.d.ts.map +1 -1
  120. package/dist/types/src/hooks/useExtensions.d.ts +7 -5
  121. package/dist/types/src/hooks/useExtensions.d.ts.map +1 -1
  122. package/dist/types/src/hooks/useLinkQuery.d.ts.map +1 -1
  123. package/dist/types/src/index.d.ts +2 -0
  124. package/dist/types/src/index.d.ts.map +1 -1
  125. package/dist/types/src/operations/create-markdown.d.ts +5 -0
  126. package/dist/types/src/operations/create-markdown.d.ts.map +1 -0
  127. package/dist/types/src/operations/create.d.ts +5 -0
  128. package/dist/types/src/operations/create.d.ts.map +1 -0
  129. package/dist/types/src/operations/create.test.d.ts.map +1 -0
  130. package/dist/types/src/operations/definitions.d.ts +64 -0
  131. package/dist/types/src/operations/definitions.d.ts.map +1 -0
  132. package/dist/types/src/operations/index.d.ts +4 -0
  133. package/dist/types/src/operations/index.d.ts.map +1 -0
  134. package/dist/types/src/operations/open.d.ts +5 -0
  135. package/dist/types/src/operations/open.d.ts.map +1 -0
  136. package/dist/types/src/operations/scroll-to-anchor.d.ts +5 -0
  137. package/dist/types/src/operations/scroll-to-anchor.d.ts.map +1 -0
  138. package/dist/types/src/operations/set-view-mode.d.ts +5 -0
  139. package/dist/types/src/operations/set-view-mode.d.ts.map +1 -0
  140. package/dist/types/src/operations/update.d.ts +5 -0
  141. package/dist/types/src/operations/update.d.ts.map +1 -0
  142. package/dist/types/src/operations/update.test.d.ts.map +1 -0
  143. package/dist/types/src/translations.d.ts +75 -35
  144. package/dist/types/src/translations.d.ts.map +1 -1
  145. package/dist/types/src/types/Markdown.d.ts +15 -16
  146. package/dist/types/src/types/Markdown.d.ts.map +1 -1
  147. package/dist/types/src/types/Settings.d.ts +16 -0
  148. package/dist/types/src/types/Settings.d.ts.map +1 -0
  149. package/dist/types/src/types/capabilities.d.ts +31 -2
  150. package/dist/types/src/types/capabilities.d.ts.map +1 -1
  151. package/dist/types/src/types/events.d.ts.map +1 -1
  152. package/dist/types/src/types/index.d.ts +2 -3
  153. package/dist/types/src/types/index.d.ts.map +1 -1
  154. package/dist/types/src/util.d.ts +2 -2
  155. package/dist/types/src/util.d.ts.map +1 -1
  156. package/dist/types/tsconfig.tsbuildinfo +1 -1
  157. package/package.json +92 -60
  158. package/src/MarkdownPlugin.tsx +47 -42
  159. package/src/blueprints/index.ts +1 -1
  160. package/src/blueprints/markdown-blueprint.ts +14 -8
  161. package/src/capabilities/{anchor-sort/anchor-sort.ts → anchor-sort.ts} +4 -3
  162. package/src/capabilities/{app-graph-serializer/app-graph-serializer.ts → app-graph-serializer.ts} +15 -9
  163. package/src/capabilities/{artifact-definition/artifact-definition.ts → artifact-definition.ts} +5 -5
  164. package/src/capabilities/blueprint-definition.ts +17 -0
  165. package/src/capabilities/index.ts +13 -7
  166. package/src/capabilities/node.ts +11 -0
  167. package/src/capabilities/operation-handler.ts +16 -0
  168. package/src/capabilities/react-surface.tsx +120 -0
  169. package/src/capabilities/{settings/settings.ts → settings.ts} +5 -4
  170. package/src/capabilities/state.ts +47 -0
  171. package/src/cli/plugin.ts +20 -10
  172. package/src/components/MarkdownEditor/FileUpload.tsx +2 -2
  173. package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +38 -34
  174. package/src/components/MarkdownEditor/MarkdownEditor.tsx +139 -102
  175. package/src/components/MarkdownEditor/MarkdownEditorContent.tsx +25 -17
  176. package/src/components/MarkdownEditor/MarkdownEditorToolbar.tsx +46 -54
  177. package/src/components/MarkdownSettings/MarkdownSettings.stories.tsx +39 -0
  178. package/src/components/MarkdownSettings/MarkdownSettings.tsx +114 -98
  179. package/src/components/MarkdownSettings/index.ts +1 -1
  180. package/src/components/index.ts +4 -12
  181. package/src/{components → containers}/MarkdownCard/MarkdownCard.stories.tsx +21 -12
  182. package/src/containers/MarkdownCard/MarkdownCard.tsx +62 -0
  183. package/src/containers/MarkdownCard/index.ts +5 -0
  184. package/src/containers/MarkdownCard/snippet.ts +78 -0
  185. package/src/{components → containers/MarkdownContainer}/MarkdownContainer.stories.tsx +34 -23
  186. package/src/containers/MarkdownContainer/MarkdownContainer.tsx +145 -0
  187. package/src/containers/MarkdownContainer/index.ts +6 -0
  188. package/src/containers/index.ts +10 -0
  189. package/src/hooks/index.ts +0 -1
  190. package/src/hooks/useEditorMenuOptions.ts +3 -3
  191. package/src/hooks/useExtensions.tsx +81 -92
  192. package/src/hooks/useLinkQuery.ts +31 -6
  193. package/src/index.ts +3 -0
  194. package/src/meta.ts +1 -1
  195. package/src/operations/create-markdown.ts +20 -0
  196. package/src/operations/create.conversations.json +1 -0
  197. package/src/operations/create.test.ts +98 -0
  198. package/src/operations/create.ts +27 -0
  199. package/src/operations/definitions.ts +120 -0
  200. package/src/operations/index.ts +16 -0
  201. package/src/operations/open.ts +25 -0
  202. package/src/operations/scroll-to-anchor.ts +39 -0
  203. package/src/operations/set-view-mode.ts +24 -0
  204. package/src/operations/update.conversations.json +1 -0
  205. package/src/operations/update.test.ts +215 -0
  206. package/src/operations/update.ts +51 -0
  207. package/src/testing.ts +2 -2
  208. package/src/translations.ts +49 -35
  209. package/src/types/Markdown.ts +18 -25
  210. package/src/types/Settings.ts +28 -0
  211. package/src/types/capabilities.ts +17 -5
  212. package/src/types/events.ts +5 -4
  213. package/src/types/index.ts +3 -4
  214. package/src/util.tsx +5 -5
  215. package/dist/lib/browser/MarkdownCard-HFNNE4B4.mjs +0 -12
  216. package/dist/lib/browser/MarkdownContainer-V7EAADMF.mjs +0 -12
  217. package/dist/lib/browser/anchor-sort-WQ3TL7ZI.mjs +0 -32
  218. package/dist/lib/browser/anchor-sort-WQ3TL7ZI.mjs.map +0 -7
  219. package/dist/lib/browser/app-graph-serializer-ULZUJKOD.mjs +0 -58
  220. package/dist/lib/browser/app-graph-serializer-ULZUJKOD.mjs.map +0 -7
  221. package/dist/lib/browser/blueprint-definition-TLV4PNZW.mjs +0 -19
  222. package/dist/lib/browser/blueprint-definition-TLV4PNZW.mjs.map +0 -7
  223. package/dist/lib/browser/chunk-BX73DASG.mjs +0 -702
  224. package/dist/lib/browser/chunk-BX73DASG.mjs.map +0 -7
  225. package/dist/lib/browser/chunk-CUGDX7KA.mjs +0 -8
  226. package/dist/lib/browser/chunk-CUGDX7KA.mjs.map +0 -7
  227. package/dist/lib/browser/chunk-FWQQW6KU.mjs +0 -144
  228. package/dist/lib/browser/chunk-FWQQW6KU.mjs.map +0 -7
  229. package/dist/lib/browser/chunk-JOXYQLKH.mjs +0 -55
  230. package/dist/lib/browser/chunk-JOXYQLKH.mjs.map +0 -7
  231. package/dist/lib/browser/chunk-KDKXFKDN.mjs +0 -104
  232. package/dist/lib/browser/chunk-KDKXFKDN.mjs.map +0 -7
  233. package/dist/lib/browser/chunk-LMO5UVKL.mjs +0 -167
  234. package/dist/lib/browser/chunk-LMO5UVKL.mjs.map +0 -7
  235. package/dist/lib/browser/chunk-S45ULIOG.mjs +0 -101
  236. package/dist/lib/browser/chunk-S45ULIOG.mjs.map +0 -7
  237. package/dist/lib/browser/chunk-VQ3WOAB6.mjs +0 -60
  238. package/dist/lib/browser/chunk-VQ3WOAB6.mjs.map +0 -7
  239. package/dist/lib/browser/operation-resolver-EGCWOQKJ.mjs +0 -53
  240. package/dist/lib/browser/operation-resolver-EGCWOQKJ.mjs.map +0 -7
  241. package/dist/lib/browser/react-surface-64FZ7T7F.mjs +0 -213
  242. package/dist/lib/browser/react-surface-64FZ7T7F.mjs.map +0 -7
  243. package/dist/lib/browser/settings-JY5JE7MI.mjs +0 -35
  244. package/dist/lib/browser/settings-JY5JE7MI.mjs.map +0 -7
  245. package/dist/lib/browser/state-QE7VSJWJ.mjs +0 -29
  246. package/dist/lib/browser/state-QE7VSJWJ.mjs.map +0 -7
  247. package/dist/lib/node-esm/MarkdownCard-GMNXUWWR.mjs +0 -13
  248. package/dist/lib/node-esm/MarkdownCard-GMNXUWWR.mjs.map +0 -7
  249. package/dist/lib/node-esm/MarkdownContainer-LUSMORP2.mjs +0 -13
  250. package/dist/lib/node-esm/MarkdownContainer-LUSMORP2.mjs.map +0 -7
  251. package/dist/lib/node-esm/anchor-sort-G7D5TAI6.mjs +0 -33
  252. package/dist/lib/node-esm/anchor-sort-G7D5TAI6.mjs.map +0 -7
  253. package/dist/lib/node-esm/app-graph-serializer-W5YMQP7P.mjs +0 -59
  254. package/dist/lib/node-esm/app-graph-serializer-W5YMQP7P.mjs.map +0 -7
  255. package/dist/lib/node-esm/blueprint-definition-HYFA7BKQ.mjs +0 -20
  256. package/dist/lib/node-esm/blueprint-definition-HYFA7BKQ.mjs.map +0 -7
  257. package/dist/lib/node-esm/chunk-3JYPCC7M.mjs +0 -105
  258. package/dist/lib/node-esm/chunk-3JYPCC7M.mjs.map +0 -7
  259. package/dist/lib/node-esm/chunk-44VJC3QF.mjs +0 -56
  260. package/dist/lib/node-esm/chunk-44VJC3QF.mjs.map +0 -7
  261. package/dist/lib/node-esm/chunk-D4BCFPKK.mjs +0 -703
  262. package/dist/lib/node-esm/chunk-D4BCFPKK.mjs.map +0 -7
  263. package/dist/lib/node-esm/chunk-EYAFC4N7.mjs +0 -145
  264. package/dist/lib/node-esm/chunk-EYAFC4N7.mjs.map +0 -7
  265. package/dist/lib/node-esm/chunk-KXEQCFMB.mjs +0 -61
  266. package/dist/lib/node-esm/chunk-KXEQCFMB.mjs.map +0 -7
  267. package/dist/lib/node-esm/chunk-PRV35A7Z.mjs +0 -168
  268. package/dist/lib/node-esm/chunk-PRV35A7Z.mjs.map +0 -7
  269. package/dist/lib/node-esm/chunk-SDTYEGGL.mjs +0 -102
  270. package/dist/lib/node-esm/chunk-SDTYEGGL.mjs.map +0 -7
  271. package/dist/lib/node-esm/chunk-W3IIKDV5.mjs +0 -10
  272. package/dist/lib/node-esm/chunk-W3IIKDV5.mjs.map +0 -7
  273. package/dist/lib/node-esm/operation-resolver-2HIS2AQZ.mjs +0 -54
  274. package/dist/lib/node-esm/operation-resolver-2HIS2AQZ.mjs.map +0 -7
  275. package/dist/lib/node-esm/react-surface-PKEVHTJK.mjs +0 -214
  276. package/dist/lib/node-esm/react-surface-PKEVHTJK.mjs.map +0 -7
  277. package/dist/lib/node-esm/settings-4UGMPIRY.mjs +0 -36
  278. package/dist/lib/node-esm/settings-4UGMPIRY.mjs.map +0 -7
  279. package/dist/lib/node-esm/state-LXE5XIN4.mjs +0 -30
  280. package/dist/lib/node-esm/state-LXE5XIN4.mjs.map +0 -7
  281. package/dist/types/src/blueprints/functions/create.d.ts +0 -8
  282. package/dist/types/src/blueprints/functions/create.d.ts.map +0 -1
  283. package/dist/types/src/blueprints/functions/create.test.d.ts.map +0 -1
  284. package/dist/types/src/blueprints/functions/index.d.ts +0 -4
  285. package/dist/types/src/blueprints/functions/index.d.ts.map +0 -1
  286. package/dist/types/src/blueprints/functions/open.d.ts +0 -7
  287. package/dist/types/src/blueprints/functions/open.d.ts.map +0 -1
  288. package/dist/types/src/blueprints/functions/update.d.ts +0 -6
  289. package/dist/types/src/blueprints/functions/update.d.ts.map +0 -1
  290. package/dist/types/src/blueprints/functions/update.test.d.ts.map +0 -1
  291. package/dist/types/src/capabilities/anchor-sort/anchor-sort.d.ts +0 -5
  292. package/dist/types/src/capabilities/anchor-sort/anchor-sort.d.ts.map +0 -1
  293. package/dist/types/src/capabilities/anchor-sort/index.d.ts +0 -3
  294. package/dist/types/src/capabilities/anchor-sort/index.d.ts.map +0 -1
  295. package/dist/types/src/capabilities/app-graph-serializer/app-graph-serializer.d.ts +0 -5
  296. package/dist/types/src/capabilities/app-graph-serializer/app-graph-serializer.d.ts.map +0 -1
  297. package/dist/types/src/capabilities/app-graph-serializer/index.d.ts +0 -3
  298. package/dist/types/src/capabilities/app-graph-serializer/index.d.ts.map +0 -1
  299. package/dist/types/src/capabilities/artifact-definition/artifact-definition.d.ts +0 -5
  300. package/dist/types/src/capabilities/artifact-definition/artifact-definition.d.ts.map +0 -1
  301. package/dist/types/src/capabilities/artifact-definition/index.d.ts +0 -3
  302. package/dist/types/src/capabilities/artifact-definition/index.d.ts.map +0 -1
  303. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts +0 -10
  304. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts.map +0 -1
  305. package/dist/types/src/capabilities/blueprint-definition/index.d.ts +0 -3
  306. package/dist/types/src/capabilities/blueprint-definition/index.d.ts.map +0 -1
  307. package/dist/types/src/capabilities/operation-resolver/index.d.ts +0 -3
  308. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +0 -1
  309. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +0 -5
  310. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +0 -1
  311. package/dist/types/src/capabilities/react-surface/index.d.ts +0 -3
  312. package/dist/types/src/capabilities/react-surface/index.d.ts.map +0 -1
  313. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +0 -5
  314. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +0 -1
  315. package/dist/types/src/capabilities/settings/index.d.ts +0 -3
  316. package/dist/types/src/capabilities/settings/index.d.ts.map +0 -1
  317. package/dist/types/src/capabilities/settings/settings.d.ts +0 -6
  318. package/dist/types/src/capabilities/settings/settings.d.ts.map +0 -1
  319. package/dist/types/src/capabilities/state/index.d.ts +0 -3
  320. package/dist/types/src/capabilities/state/index.d.ts.map +0 -1
  321. package/dist/types/src/capabilities/state/state.d.ts +0 -5
  322. package/dist/types/src/capabilities/state/state.d.ts.map +0 -1
  323. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts.map +0 -1
  324. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts.map +0 -1
  325. package/dist/types/src/components/MarkdownCard/index.d.ts +0 -4
  326. package/dist/types/src/components/MarkdownCard/index.d.ts.map +0 -1
  327. package/dist/types/src/components/MarkdownContainer.d.ts +0 -28
  328. package/dist/types/src/components/MarkdownContainer.d.ts.map +0 -1
  329. package/dist/types/src/components/MarkdownContainer.stories.d.ts +0 -59
  330. package/dist/types/src/components/MarkdownContainer.stories.d.ts.map +0 -1
  331. package/dist/types/src/components/Suggestions.stories.d.ts +0 -11
  332. package/dist/types/src/components/Suggestions.stories.d.ts.map +0 -1
  333. package/dist/types/src/hooks/useSelectCurrentThread.d.ts +0 -6
  334. package/dist/types/src/hooks/useSelectCurrentThread.d.ts.map +0 -1
  335. package/dist/types/src/types/MarkdownAction.d.ts +0 -66
  336. package/dist/types/src/types/MarkdownAction.d.ts.map +0 -1
  337. package/src/blueprints/functions/create.conversations.json +0 -1
  338. package/src/blueprints/functions/create.test.ts +0 -125
  339. package/src/blueprints/functions/create.ts +0 -34
  340. package/src/blueprints/functions/index.ts +0 -7
  341. package/src/blueprints/functions/open.ts +0 -33
  342. package/src/blueprints/functions/update.conversations.json +0 -1
  343. package/src/blueprints/functions/update.test.ts +0 -149
  344. package/src/blueprints/functions/update.ts +0 -38
  345. package/src/capabilities/anchor-sort/index.ts +0 -7
  346. package/src/capabilities/app-graph-serializer/index.ts +0 -7
  347. package/src/capabilities/artifact-definition/index.ts +0 -7
  348. package/src/capabilities/blueprint-definition/blueprint-definition.ts +0 -25
  349. package/src/capabilities/blueprint-definition/index.ts +0 -7
  350. package/src/capabilities/operation-resolver/index.ts +0 -7
  351. package/src/capabilities/operation-resolver/operation-resolver.ts +0 -45
  352. package/src/capabilities/react-surface/index.ts +0 -7
  353. package/src/capabilities/react-surface/react-surface.tsx +0 -100
  354. package/src/capabilities/settings/index.ts +0 -7
  355. package/src/capabilities/state/index.ts +0 -7
  356. package/src/capabilities/state/state.ts +0 -31
  357. package/src/components/MarkdownCard/MarkdownCard.tsx +0 -62
  358. package/src/components/MarkdownCard/index.ts +0 -9
  359. package/src/components/MarkdownContainer.tsx +0 -111
  360. package/src/components/Suggestions.stories.tsx +0 -215
  361. package/src/hooks/useSelectCurrentThread.tsx +0 -61
  362. package/src/types/MarkdownAction.ts +0 -59
  363. /package/dist/lib/browser/{MarkdownCard-HFNNE4B4.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  364. /package/dist/lib/{browser/MarkdownContainer-V7EAADMF.mjs.map → node-esm/chunk-HSLMI22Q.mjs.map} +0 -0
  365. /package/dist/types/src/{components → containers}/MarkdownCard/MarkdownCard.stories.d.ts +0 -0
  366. /package/dist/types/src/{blueprints/functions → operations}/create.test.d.ts +0 -0
  367. /package/dist/types/src/{blueprints/functions → operations}/update.test.d.ts +0 -0
@@ -0,0 +1,145 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { type Extension } from '@codemirror/state';
6
+ import { Atom } from '@effect-atom/atom-react';
7
+ import React, { forwardRef, useCallback, useMemo } from 'react';
8
+
9
+ import { useCapabilities, useOperationInvoker } from '@dxos/app-framework/ui';
10
+ import { AppCapabilities, LayoutOperation } from '@dxos/app-toolkit';
11
+ import { AppSurface, useAppGraph } from '@dxos/app-toolkit/ui';
12
+ import { Obj } from '@dxos/echo';
13
+ import { useActionRunner } from '@dxos/plugin-graph';
14
+ import { useObject } from '@dxos/react-client/echo';
15
+ import { Panel } from '@dxos/react-ui';
16
+ import { type SelectionManager } from '@dxos/react-ui-attention';
17
+ import { Editor } from '@dxos/react-ui-editor';
18
+ import { Text } from '@dxos/schema';
19
+
20
+ import {
21
+ MarkdownEditor,
22
+ MarkdownEditorProvider,
23
+ type MarkdownEditorContentProps,
24
+ type MarkdownEditorProviderProps,
25
+ } from '#components';
26
+ import { useLinkQuery } from '#hooks';
27
+ import { Markdown, MarkdownCapabilities, type MarkdownPluginState } from '#types';
28
+
29
+ export type MarkdownContainerProps = AppSurface.ObjectArticleProps<
30
+ Markdown.Document | Text.Text,
31
+ {
32
+ id: string;
33
+ settings: Markdown.Settings;
34
+ selectionManager?: SelectionManager;
35
+ } & Pick<MarkdownPluginState, 'extensionProviders'> &
36
+ Pick<MarkdownEditorProviderProps, 'viewMode' | 'onSelectObject' | 'onViewModeChange'> &
37
+ Pick<MarkdownEditorContentProps, 'editorStateStore'>
38
+ >;
39
+
40
+ export const MarkdownContainer = forwardRef<HTMLDivElement, MarkdownContainerProps>(
41
+ (
42
+ { role, subject: object, id, attendableId, settings, extensionProviders, onSelectObject, ...props },
43
+ forwardedRef,
44
+ ) => {
45
+ const db = Obj.isObject(object) ? Obj.getDatabase(object) : undefined;
46
+ const [docContent] = useObject(Obj.instanceOf(Markdown.Document, object) ? object.content : undefined, 'content');
47
+ const [textContent] = useObject(Obj.instanceOf(Text.Text, object) ? object : undefined, 'content');
48
+ const initialValue = docContent ?? textContent;
49
+
50
+ // Extensions from other plugins.
51
+ const otherExtensionProviders = useCapabilities(MarkdownCapabilities.Extensions);
52
+ const extensions = useMemo<Extension[]>(() => {
53
+ if (!Obj.instanceOf(Markdown.Document, object) && !Obj.instanceOf(Text.Text, object)) {
54
+ return [];
55
+ }
56
+
57
+ return [...(otherExtensionProviders ?? []), ...(extensionProviders ?? [])]
58
+ .flat()
59
+ .reduce((acc: Extension[], provider) => {
60
+ const extension =
61
+ typeof provider === 'function' ? provider({ document: object as Markdown.Document }) : provider;
62
+ if (extension) {
63
+ acc.push(extension);
64
+ }
65
+
66
+ return acc;
67
+ }, []);
68
+ }, [extensionProviders, otherExtensionProviders, object]);
69
+
70
+ // Toolbar actions from app graph.
71
+ const { graph } = useAppGraph();
72
+ const runAction = useActionRunner();
73
+ const customActions = useMemo(() => {
74
+ return Atom.make((get) => {
75
+ const actions = get(graph.actions(attendableId ?? id));
76
+ const nodes = actions.filter((action) => action.properties.disposition === 'toolbar');
77
+ const edges = nodes.map((node) => ({ source: 'root', target: node.id, relation: 'child' }));
78
+ return { nodes, edges };
79
+ });
80
+ }, [graph]);
81
+
82
+ // File upload.
83
+ const [upload] = useCapabilities(AppCapabilities.FileUploader);
84
+ const handleFileUpload = useMemo(() => {
85
+ if (!db || !upload) {
86
+ return undefined;
87
+ }
88
+
89
+ return async (file: File) => upload(db, file);
90
+ }, [db, upload]);
91
+
92
+ // Query for @ refs.
93
+ const handleLinkQuery = useLinkQuery(db);
94
+
95
+ // Open linked objects.
96
+ const { invokePromise } = useOperationInvoker();
97
+ const handleSelectObject = useCallback(
98
+ (targetId: string) => {
99
+ if (onSelectObject) {
100
+ onSelectObject(targetId);
101
+ } else {
102
+ void invokePromise?.(LayoutOperation.Open, {
103
+ subject: [targetId],
104
+ pivotId: attendableId,
105
+ // TODO(wittjosiah): This should probably pre-validate.
106
+ navigation: 'immediate',
107
+ });
108
+ }
109
+ },
110
+ [onSelectObject, invokePromise, attendableId],
111
+ );
112
+
113
+ return (
114
+ <MarkdownEditorProvider
115
+ id={id}
116
+ attendableId={attendableId}
117
+ object={object}
118
+ compact={role !== 'article'}
119
+ extensions={extensions}
120
+ settings={settings}
121
+ onAction={runAction}
122
+ onFileUpload={handleFileUpload}
123
+ onLinkQuery={handleLinkQuery}
124
+ onSelectObject={handleSelectObject}
125
+ {...props}
126
+ >
127
+ {(editorRootProps) => (
128
+ <Editor.Root {...editorRootProps}>
129
+ <Panel.Root role={role} ref={forwardedRef}>
130
+ {settings.toolbar && (
131
+ <Panel.Toolbar classNames='bg-toolbar-surface'>
132
+ <MarkdownEditor.Toolbar classNames='dx-document' customActions={customActions} />
133
+ </Panel.Toolbar>
134
+ )}
135
+ <Panel.Content>
136
+ <MarkdownEditor.Content initialValue={initialValue} />
137
+ <MarkdownEditor.Blocks />
138
+ </Panel.Content>
139
+ </Panel.Root>
140
+ </Editor.Root>
141
+ )}
142
+ </MarkdownEditorProvider>
143
+ );
144
+ },
145
+ );
@@ -0,0 +1,6 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export { MarkdownContainer, type MarkdownContainerProps } from './MarkdownContainer';
6
+ export { MarkdownContainer as default } from './MarkdownContainer';
@@ -0,0 +1,10 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type ComponentType, lazy } from 'react';
6
+
7
+ export type { MarkdownContainerProps } from './MarkdownContainer';
8
+
9
+ export const MarkdownCard: ComponentType<any> = lazy(() => import('./MarkdownCard'));
10
+ export const MarkdownContainer: ComponentType<any> = lazy(() => import('./MarkdownContainer'));
@@ -5,4 +5,3 @@
5
5
  export * from './useEditorMenuOptions';
6
6
  export * from './useExtensions';
7
7
  export * from './useLinkQuery';
8
- export * from './useSelectCurrentThread';
@@ -15,7 +15,7 @@ import {
15
15
  } from '@dxos/react-ui-editor';
16
16
  import { Domino } from '@dxos/ui';
17
17
 
18
- import { meta } from '../meta';
18
+ import { meta } from '#meta';
19
19
 
20
20
  export type UseEditorMenuOptionsProps = {
21
21
  editorView?: EditorView;
@@ -56,10 +56,10 @@ export const useEditorMenuOptions = ({
56
56
  content: () => {
57
57
  const pressEl = Domino.of('span').text('Press');
58
58
  const triggerEls = trigger.map((text) =>
59
- Domino.of('span').classNames('mx-1 pli-1.5 pt-[1px] pb-[2px] border border-separator rounded-sm').text(text),
59
+ Domino.of('span').classNames('mx-1 px-1.5 pt-[1px] pb-[2px] border border-separator rounded-xs').text(text),
60
60
  );
61
61
  const forCommandsEl = Domino.of('span').text('for commands.');
62
- return Domino.of('div').children(pressEl, ...triggerEls, forCommandsEl).root;
62
+ return Domino.of('div').append(pressEl, ...triggerEls, forCommandsEl).root;
63
63
  },
64
64
  };
65
65
 
@@ -3,20 +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 { Common } from '@dxos/app-framework';
10
- import { useOperationInvoker } 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';
13
11
  import { createDocAccessor } from '@dxos/echo-db';
14
12
  import { invariant } from '@dxos/invariant';
15
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';
19
17
  import { Text } from '@dxos/schema';
18
+ import { Domino } from '@dxos/ui';
20
19
  import {
21
20
  Cursor,
22
21
  type EditorStateStore,
@@ -38,10 +37,10 @@ import {
38
37
  selectionState,
39
38
  typewriter,
40
39
  } from '@dxos/ui-editor';
41
- import { defaultTx } from '@dxos/ui-theme';
42
- import { isTruthy } from '@dxos/util';
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
- invokePromise?: Common.Capability.OperationInvoker['invokePromise'];
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,12 +64,14 @@ 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 { invokePromise } = useOperationInvoker();
74
+ const { platform } = useThemeContext();
71
75
  const identity = useIdentity();
72
76
  const space = getSpace(object);
73
77
 
@@ -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
- invokePromise,
100
+ onSelectObject,
101
+ platform,
96
102
  }),
97
103
  [
98
104
  id,
99
105
  object,
106
+ compact,
100
107
  viewMode,
101
- invokePromise,
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
 
@@ -144,16 +152,18 @@ export const useExtensions = ({
144
152
  const createBaseExtensions = ({
145
153
  id,
146
154
  object,
147
- invokePromise,
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,17 +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
- invokePromise && (object || id)
173
- ? createLinkRenderer((targetId: string) => {
174
- void invokePromise(Common.LayoutOperation.Open, {
175
- subject: [targetId],
176
- pivotId: object && Obj.isObject(object) ? Obj.getDXN(object).toString() : id,
177
- });
178
- })
179
- : undefined,
179
+ // TODO(wittjosiah): For internal links render the label of the object.
180
+ renderLinkButton: onSelectObject && createRenderLink(onSelectObject),
180
181
  }),
181
182
  linkTooltip(renderLinkTooltip),
182
183
  preview(previewOptions),
@@ -196,79 +197,67 @@ const createBaseExtensions = ({
196
197
  };
197
198
 
198
199
  const selectionChange = (selectionManager: SelectionManager) => {
199
- return EditorView.updateListener.of(
200
- debounceAndThrottle((update: ViewUpdate) => {
201
- if (update.selectionSet) {
202
- const id = update.state.facet(documentId);
203
- const cursorConverter = update.state.facet(Cursor.converter);
204
- const selection = update.state.selection;
205
- const ranges = selection.ranges
206
- .map((range) => ({
207
- from: cursorConverter.toCursor(range.from),
208
- to: cursorConverter.toCursor(range.to),
209
- }))
210
- .filter(({ from, to }) => to > from);
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);
211
210
 
212
- selectionManager.updateMultiRange(id, ranges);
213
- }
214
- }, 100),
215
- );
216
- };
211
+ selectionManager.updateMultiRange(id, ranges);
212
+ }, 100);
217
213
 
218
- // TODO(burdon): Factor out styles.
219
- const style = {
220
- hover: 'rounded-sm text-primary-500 hover:text-primary-600 dark:text-primary-500 hover:dark:text-primary-400',
221
- 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
+ });
222
219
  };
223
220
 
224
- const createLinkRenderer =
221
+ const createRenderLink =
225
222
  (onSelectObject: (id: string) => void): RenderCallback<{ url: string }> =>
226
223
  (el, { url }) => {
227
224
  // TODO(burdon): Formalize/document internal link format.
228
- const isInternal =
229
- url.startsWith('/') ||
230
- // TODO(wittjosiah): This should probably be parsed out on paste?
231
- 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'));
232
230
 
233
- const options: AnchorHTMLAttributes<any> = isInternal
234
- ? {
235
- onClick: () => {
236
- const qualifiedId = url.split('/').at(-1);
237
- invariant(qualifiedId, 'Invalid link format.');
238
- onSelectObject(qualifiedId);
239
- },
240
- }
241
- : {
242
- href: url,
243
- rel: 'noreferrer',
244
- target: '_blank',
245
- };
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
+ }
246
245
 
247
- renderRoot(
248
- el,
249
- <a {...options} className={style.hover}>
250
- <Icon
251
- icon={isInternal ? 'ph--arrow-square-down--bold' : 'ph--arrow-square-out--bold'}
252
- size={4}
253
- classNames={style.icon}
254
- />
255
- </a>,
256
- );
246
+ keyboardEvent.preventDefault();
247
+ keyboardEvent.stopPropagation();
248
+ onSelectObject(qualifiedId);
249
+ });
250
+ }
251
+
252
+ el.appendChild(icon.root);
257
253
  };
258
254
 
259
255
  const renderLinkTooltip: RenderCallback<{ url: string }> = (el, { url }) => {
260
- const web = new URL(url);
261
- renderRoot(
262
- el,
263
- <a href={url} rel='noreferrer' target='_blank' className={style.hover}>
264
- {web.origin}
265
- <Icon icon='ph--arrow-square-out--bold' size={4} classNames={style.icon} />
266
- </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,
267
262
  );
268
263
  };
269
-
270
- // TODO(burdon): REMOVE.
271
- const renderRoot = <T extends Element>(root: T, node: ReactNode): T => {
272
- createRoot(root).render(<ThemeProvider tx={defaultTx}>{node}</ThemeProvider>);
273
- return root;
274
- };
@@ -5,21 +5,23 @@
5
5
  import * as Option from 'effect/Option';
6
6
  import { useCallback, useMemo } from 'react';
7
7
 
8
- import { Common } from '@dxos/app-framework';
9
- import { usePluginManager } from '@dxos/app-framework/react';
8
+ import { usePluginManager } from '@dxos/app-framework/ui';
9
+ import { AppCapabilities } from '@dxos/app-toolkit';
10
10
  import { type Database, Filter, Obj, Query, Type } from '@dxos/echo';
11
11
  import { EntityKind, SystemTypeAnnotation, getTypeAnnotation } from '@dxos/echo/internal';
12
12
  import { toLocalizedString, useTranslation } from '@dxos/react-ui';
13
13
  import { type EditorMenuGroup, type EditorMenuItem } from '@dxos/react-ui-editor';
14
14
  import { insertAtCursor, insertAtLineStart } from '@dxos/ui-editor';
15
15
 
16
+ import { Markdown } from '../types';
17
+
16
18
  export const useLinkQuery = (db: Database.Database | undefined) => {
17
19
  const { t } = useTranslation();
18
20
 
19
21
  const manager = usePluginManager();
20
22
  const resolve = useCallback(
21
23
  (typename: string) =>
22
- manager.capabilities.getAll(Common.Capability.Metadata).find(({ id }) => id === typename)?.metadata ?? {},
24
+ manager.capabilities.getAll(AppCapabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {},
23
25
  [manager],
24
26
  );
25
27
 
@@ -36,6 +38,7 @@ export const useLinkQuery = (db: Database.Database | undefined) => {
36
38
 
37
39
  const handleLinkQuery = useCallback(
38
40
  async (query?: string): Promise<EditorMenuGroup[]> => {
41
+ // A second "@" switches the link query into block-embed mode, so "@@foo" searches for "foo".
39
42
  const name = query?.startsWith('@') ? query.slice(1).toLowerCase() : (query?.toLowerCase() ?? '');
40
43
  const results = await db?.query(Query.select(filter)).run();
41
44
 
@@ -49,7 +52,7 @@ export const useLinkQuery = (db: Database.Database | undefined) => {
49
52
  // TODO(wittjosiah): Remove metadata labels.
50
53
  const type = Obj.getTypename(object)!;
51
54
  const metadata = resolve(type);
52
- return metadata.label?.(object) || ['object name placeholder', { ns: type, default: 'New object' }];
55
+ return metadata.label?.(object) || ['object-name.placeholder', { ns: type, defaultValue: 'New object' }];
53
56
  };
54
57
 
55
58
  const items =
@@ -65,6 +68,7 @@ export const useLinkQuery = (db: Database.Database | undefined) => {
65
68
  icon: metadata.icon,
66
69
  onSelect: ({ view, head }) => {
67
70
  const link = `[${label}](${Obj.getDXN(object)})`;
71
+ // "@@" inserts a block embed on its own line instead of an inline link.
68
72
  if (query?.startsWith('@')) {
69
73
  insertAtLineStart(view, head, `!${link}\n`);
70
74
  } else {
@@ -74,9 +78,30 @@ export const useLinkQuery = (db: Database.Database | undefined) => {
74
78
  };
75
79
  }) ?? [];
76
80
 
77
- return [{ id: 'echo', items }];
81
+ // Add "Create new document" option at the end.
82
+ const createItem: EditorMenuItem = {
83
+ id: 'create-document',
84
+ label: ['add-object.label', { ns: Markdown.Document.typename }],
85
+ icon: 'ph--plus--regular',
86
+ onSelect: ({ view, head }) => {
87
+ const doc = Markdown.make({ name: name || undefined });
88
+ db?.add(doc);
89
+ const label = name || t('object-name.placeholder', { ns: Markdown.Document.typename });
90
+ const link = `[${label}](${Obj.getDXN(doc)})`;
91
+ if (query?.startsWith('@')) {
92
+ insertAtLineStart(view, head, `!${link}\n`);
93
+ } else {
94
+ insertAtCursor(view, head, `${link} `);
95
+ }
96
+ },
97
+ };
98
+
99
+ return [
100
+ { id: 'echo', items },
101
+ { id: 'create', items: [createItem] },
102
+ ];
78
103
  },
79
- [db, filter, resolve],
104
+ [db, filter, resolve, t],
80
105
  );
81
106
 
82
107
  return handleLinkQuery;
package/src/index.ts CHANGED
@@ -9,3 +9,6 @@ export * from './types';
9
9
  export * from './util';
10
10
 
11
11
  export * from './MarkdownPlugin';
12
+
13
+ export { MarkdownEditor, MarkdownEditorProvider } from './components';
14
+ export type { MarkdownEditorEditorRootProps } from './components';
package/src/meta.ts CHANGED
@@ -6,7 +6,7 @@ import { type Plugin } from '@dxos/app-framework';
6
6
  import { trim } from '@dxos/util';
7
7
 
8
8
  export const meta: Plugin.Meta = {
9
- id: 'dxos.org/plugin/markdown',
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.
@@ -0,0 +1,20 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+
7
+ import { Operation } from '@dxos/operation';
8
+
9
+ import { Markdown } from '../types';
10
+ import { CreateMarkdown } from './definitions';
11
+
12
+ const handler: Operation.WithHandler<typeof CreateMarkdown> = CreateMarkdown.pipe(
13
+ Operation.withHandler(({ name, content }) =>
14
+ Effect.succeed({
15
+ object: Markdown.make({ name, content }),
16
+ }),
17
+ ),
18
+ );
19
+
20
+ export default handler;