@dxos/plugin-markdown 0.8.4-main.3eb6e50203 → 0.8.4-main.3fbcb4aa9b

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 (427) hide show
  1. package/dist/lib/neutral/EditableMarkdownCard-P4F4TIUM.mjs +32 -0
  2. package/dist/lib/neutral/EditableMarkdownCard-P4F4TIUM.mjs.map +7 -0
  3. package/dist/lib/neutral/MarkdownCard-INMBLUL4.mjs +102 -0
  4. package/dist/lib/neutral/MarkdownCard-INMBLUL4.mjs.map +7 -0
  5. package/dist/lib/neutral/MarkdownContainer-2BDGD3PL.mjs +126 -0
  6. package/dist/lib/neutral/MarkdownContainer-2BDGD3PL.mjs.map +7 -0
  7. package/dist/lib/neutral/MarkdownPlugin.mjs +58 -0
  8. package/dist/lib/neutral/MarkdownPlugin.mjs.map +7 -0
  9. package/dist/lib/neutral/MarkdownPlugin.node.mjs +25 -0
  10. package/dist/lib/neutral/MarkdownPlugin.node.mjs.map +7 -0
  11. package/dist/lib/neutral/MarkdownSettings-YCTZJL5V.mjs +32 -0
  12. package/dist/lib/neutral/MarkdownSettings-YCTZJL5V.mjs.map +7 -0
  13. package/dist/lib/{browser/anchor-sort-JBAZRPE7.mjs → neutral/anchor-sort-L4VCKDO6.mjs} +5 -6
  14. package/dist/lib/neutral/anchor-sort-L4VCKDO6.mjs.map +7 -0
  15. package/dist/lib/{browser/app-graph-serializer-6Q5YBUPW.mjs → neutral/app-graph-serializer-3XFKP4ER.mjs} +11 -14
  16. package/dist/lib/neutral/app-graph-serializer-3XFKP4ER.mjs.map +7 -0
  17. package/dist/lib/neutral/blueprint-definition-33OK2KUL.mjs +15 -0
  18. package/dist/lib/neutral/blueprint-definition-33OK2KUL.mjs.map +7 -0
  19. package/dist/lib/neutral/blueprints/index.mjs +8 -0
  20. package/dist/lib/neutral/capabilities/index.mjs +25 -0
  21. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  22. package/dist/lib/neutral/capabilities/node.mjs +11 -0
  23. package/dist/lib/neutral/capabilities/node.mjs.map +7 -0
  24. package/dist/lib/neutral/chunk-3LYCPEVP.mjs +21 -0
  25. package/dist/lib/neutral/chunk-3LYCPEVP.mjs.map +7 -0
  26. package/dist/lib/neutral/chunk-6N7AD3IU.mjs +8 -0
  27. package/dist/lib/neutral/chunk-6N7AD3IU.mjs.map +7 -0
  28. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  29. package/dist/lib/neutral/chunk-KDN4GKG2.mjs +98 -0
  30. package/dist/lib/neutral/chunk-KDN4GKG2.mjs.map +7 -0
  31. package/dist/lib/neutral/chunk-LXNSKCPD.mjs +44 -0
  32. package/dist/lib/neutral/chunk-LXNSKCPD.mjs.map +7 -0
  33. package/dist/lib/neutral/chunk-SOLAMEK3.mjs +276 -0
  34. package/dist/lib/neutral/chunk-SOLAMEK3.mjs.map +7 -0
  35. package/dist/lib/neutral/comment-config-7VTHRUIZ.mjs +30 -0
  36. package/dist/lib/neutral/comment-config-7VTHRUIZ.mjs.map +7 -0
  37. package/dist/lib/neutral/components/index.mjs +370 -0
  38. package/dist/lib/neutral/components/index.mjs.map +7 -0
  39. package/dist/lib/neutral/containers/index.mjs +13 -0
  40. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  41. package/dist/lib/neutral/create-3PGJ2NEK.mjs +28 -0
  42. package/dist/lib/neutral/create-3PGJ2NEK.mjs.map +7 -0
  43. package/dist/lib/neutral/create-markdown-5LS46GMH.mjs +20 -0
  44. package/dist/lib/neutral/create-markdown-5LS46GMH.mjs.map +7 -0
  45. package/dist/lib/neutral/create-object-ZA6VXLJJ.mjs +27 -0
  46. package/dist/lib/neutral/create-object-ZA6VXLJJ.mjs.map +7 -0
  47. package/dist/lib/neutral/hooks/index.mjs +322 -0
  48. package/dist/lib/neutral/hooks/index.mjs.map +7 -0
  49. package/dist/lib/neutral/index.mjs +42 -0
  50. package/dist/lib/neutral/meta.json +1 -0
  51. package/dist/lib/neutral/meta.mjs +8 -0
  52. package/dist/lib/neutral/open-WCYGBLAG.mjs +20 -0
  53. package/dist/lib/neutral/open-WCYGBLAG.mjs.map +7 -0
  54. package/dist/lib/neutral/operation-handler-2ARMPBGZ.mjs +13 -0
  55. package/dist/lib/neutral/operation-handler-2ARMPBGZ.mjs.map +7 -0
  56. package/dist/lib/neutral/operations/index.mjs +8 -0
  57. package/dist/lib/neutral/plugin.mjs +16 -0
  58. package/dist/lib/neutral/plugin.mjs.map +7 -0
  59. package/dist/lib/neutral/react-surface-TB4TY57T.mjs +119 -0
  60. package/dist/lib/neutral/react-surface-TB4TY57T.mjs.map +7 -0
  61. package/dist/lib/neutral/scroll-to-anchor-6FIOKVKT.mjs +47 -0
  62. package/dist/lib/neutral/scroll-to-anchor-6FIOKVKT.mjs.map +7 -0
  63. package/dist/lib/neutral/set-view-mode-37RSPFEN.mjs +24 -0
  64. package/dist/lib/neutral/set-view-mode-37RSPFEN.mjs.map +7 -0
  65. package/dist/lib/{browser/settings-V2XOFSD5.mjs → neutral/settings-TDGDLCUR.mjs} +7 -9
  66. package/dist/lib/neutral/settings-TDGDLCUR.mjs.map +7 -0
  67. package/dist/lib/neutral/state-5COCF5PN.mjs +44 -0
  68. package/dist/lib/neutral/state-5COCF5PN.mjs.map +7 -0
  69. package/dist/lib/neutral/testing.mjs +20 -0
  70. package/dist/lib/neutral/testing.mjs.map +7 -0
  71. package/dist/lib/neutral/translations.mjs +43 -0
  72. package/dist/lib/neutral/translations.mjs.map +7 -0
  73. package/dist/lib/neutral/types/index.mjs +16 -0
  74. package/dist/lib/neutral/update-markdown-5EDRD3SH.mjs +44 -0
  75. package/dist/lib/neutral/update-markdown-5EDRD3SH.mjs.map +7 -0
  76. package/dist/types/src/MarkdownPlugin.d.ts +1 -0
  77. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  78. package/dist/types/src/{cli/plugin.d.ts → MarkdownPlugin.node.d.ts} +2 -1
  79. package/dist/types/src/MarkdownPlugin.node.d.ts.map +1 -0
  80. package/dist/types/src/MarkdownPlugin.test.d.ts +2 -0
  81. package/dist/types/src/MarkdownPlugin.test.d.ts.map +1 -0
  82. package/dist/types/src/blueprints/index.d.ts +1 -1
  83. package/dist/types/src/blueprints/index.d.ts.map +1 -1
  84. package/dist/types/src/blueprints/markdown-blueprint.d.ts +3 -20
  85. package/dist/types/src/blueprints/markdown-blueprint.d.ts.map +1 -1
  86. package/dist/types/src/capabilities/anchor-sort.d.ts +6 -0
  87. package/dist/types/src/capabilities/anchor-sort.d.ts.map +1 -0
  88. package/dist/types/src/capabilities/app-graph-serializer.d.ts +5 -0
  89. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -0
  90. package/dist/types/src/capabilities/artifact-definition.d.ts +5 -0
  91. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -0
  92. package/dist/types/src/capabilities/blueprint-definition.d.ts +6 -0
  93. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  94. package/dist/types/src/capabilities/comment-config.d.ts +12 -0
  95. package/dist/types/src/capabilities/comment-config.d.ts.map +1 -0
  96. package/dist/types/src/capabilities/create-object.d.ts +11 -0
  97. package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
  98. package/dist/types/src/capabilities/index.d.ts +22 -7
  99. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  100. package/dist/types/src/capabilities/node.d.ts +10 -0
  101. package/dist/types/src/capabilities/node.d.ts.map +1 -0
  102. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  103. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  104. package/dist/types/src/capabilities/react-surface.d.ts +5 -0
  105. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  106. package/dist/types/src/capabilities/settings.d.ts +6 -0
  107. package/dist/types/src/capabilities/settings.d.ts.map +1 -0
  108. package/dist/types/src/capabilities/state.d.ts +6 -0
  109. package/dist/types/src/capabilities/state.d.ts.map +1 -0
  110. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +33 -22
  111. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
  112. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts +3 -3
  113. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts.map +1 -1
  114. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts +6 -3
  115. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts.map +1 -1
  116. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts +5 -4
  117. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts.map +1 -1
  118. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts +4 -6
  119. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts.map +1 -1
  120. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.stories.d.ts +94 -0
  121. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.stories.d.ts.map +1 -0
  122. package/dist/types/src/components/MarkdownSettings/index.d.ts +1 -1
  123. package/dist/types/src/components/MarkdownSettings/index.d.ts.map +1 -1
  124. package/dist/types/src/components/index.d.ts +3 -8
  125. package/dist/types/src/components/index.d.ts.map +1 -1
  126. package/dist/types/src/containers/EditableMarkdownCard/EditableMarkdownCard.d.ts +15 -0
  127. package/dist/types/src/containers/EditableMarkdownCard/EditableMarkdownCard.d.ts.map +1 -0
  128. package/dist/types/src/containers/EditableMarkdownCard/index.d.ts +3 -0
  129. package/dist/types/src/containers/EditableMarkdownCard/index.d.ts.map +1 -0
  130. package/dist/types/src/{components → containers}/MarkdownCard/MarkdownCard.d.ts +1 -1
  131. package/dist/types/src/containers/MarkdownCard/MarkdownCard.d.ts.map +1 -0
  132. package/dist/types/src/{components → containers}/MarkdownCard/MarkdownCard.stories.d.ts +1 -1
  133. package/dist/types/src/containers/MarkdownCard/MarkdownCard.stories.d.ts.map +1 -0
  134. package/dist/types/src/containers/MarkdownCard/index.d.ts +2 -0
  135. package/dist/types/src/containers/MarkdownCard/index.d.ts.map +1 -0
  136. package/dist/types/src/containers/MarkdownCard/snippet.d.ts +17 -0
  137. package/dist/types/src/containers/MarkdownCard/snippet.d.ts.map +1 -0
  138. package/dist/types/src/containers/MarkdownContainer/MarkdownContainer.d.ts +36 -0
  139. package/dist/types/src/containers/MarkdownContainer/MarkdownContainer.d.ts.map +1 -0
  140. package/dist/types/src/containers/MarkdownContainer/MarkdownContainer.stories.d.ts +97 -0
  141. package/dist/types/src/containers/MarkdownContainer/MarkdownContainer.stories.d.ts.map +1 -0
  142. package/dist/types/src/containers/MarkdownContainer/index.d.ts +3 -0
  143. package/dist/types/src/containers/MarkdownContainer/index.d.ts.map +1 -0
  144. package/dist/types/src/containers/index.d.ts +6 -0
  145. package/dist/types/src/containers/index.d.ts.map +1 -0
  146. package/dist/types/src/hooks/index.d.ts +0 -1
  147. package/dist/types/src/hooks/index.d.ts.map +1 -1
  148. package/dist/types/src/hooks/useEditorMenuOptions.d.ts.map +1 -1
  149. package/dist/types/src/hooks/useExtensions.d.ts +10 -6
  150. package/dist/types/src/hooks/useExtensions.d.ts.map +1 -1
  151. package/dist/types/src/hooks/useLinkQuery.d.ts.map +1 -1
  152. package/dist/types/src/index.d.ts +2 -3
  153. package/dist/types/src/index.d.ts.map +1 -1
  154. package/dist/types/src/operations/create-markdown.d.ts +5 -0
  155. package/dist/types/src/operations/create-markdown.d.ts.map +1 -0
  156. package/dist/types/src/operations/create.d.ts +5 -0
  157. package/dist/types/src/operations/create.d.ts.map +1 -0
  158. package/dist/types/src/operations/create.test.d.ts.map +1 -0
  159. package/dist/types/src/operations/index.d.ts +3 -0
  160. package/dist/types/src/operations/index.d.ts.map +1 -0
  161. package/dist/types/src/operations/open.d.ts +5 -0
  162. package/dist/types/src/operations/open.d.ts.map +1 -0
  163. package/dist/types/src/operations/scroll-to-anchor.d.ts +5 -0
  164. package/dist/types/src/operations/scroll-to-anchor.d.ts.map +1 -0
  165. package/dist/types/src/operations/set-view-mode.d.ts +5 -0
  166. package/dist/types/src/operations/set-view-mode.d.ts.map +1 -0
  167. package/dist/types/src/operations/update-markdown.d.ts +5 -0
  168. package/dist/types/src/operations/update-markdown.d.ts.map +1 -0
  169. package/dist/types/src/operations/update.test.d.ts.map +1 -0
  170. package/dist/types/src/plugin.d.ts +4 -0
  171. package/dist/types/src/plugin.d.ts.map +1 -0
  172. package/dist/types/src/testing.d.ts.map +1 -1
  173. package/dist/types/src/translations.d.ts +70 -62
  174. package/dist/types/src/translations.d.ts.map +1 -1
  175. package/dist/types/src/types/Markdown.d.ts +16 -16
  176. package/dist/types/src/types/Markdown.d.ts.map +1 -1
  177. package/dist/types/src/types/MarkdownCapabilities.d.ts +32 -0
  178. package/dist/types/src/types/MarkdownCapabilities.d.ts.map +1 -0
  179. package/dist/types/src/types/MarkdownEvents.d.ts +3 -0
  180. package/dist/types/src/types/MarkdownEvents.d.ts.map +1 -0
  181. package/dist/types/src/types/MarkdownOperation.d.ts +64 -0
  182. package/dist/types/src/types/MarkdownOperation.d.ts.map +1 -0
  183. package/dist/types/src/types/Settings.d.ts +17 -0
  184. package/dist/types/src/types/Settings.d.ts.map +1 -0
  185. package/dist/types/src/types/index.d.ts +5 -5
  186. package/dist/types/src/types/index.d.ts.map +1 -1
  187. package/dist/types/src/types/types.d.ts +1 -0
  188. package/dist/types/src/types/types.d.ts.map +1 -1
  189. package/dist/types/src/util.d.ts +3 -3
  190. package/dist/types/src/util.d.ts.map +1 -1
  191. package/dist/types/tsconfig.tsbuildinfo +1 -1
  192. package/package.json +125 -85
  193. package/src/MarkdownPlugin.node.ts +20 -0
  194. package/src/MarkdownPlugin.test.ts +26 -0
  195. package/src/MarkdownPlugin.tsx +15 -55
  196. package/src/blueprints/index.ts +1 -1
  197. package/src/blueprints/markdown-blueprint.ts +15 -10
  198. package/src/capabilities/{anchor-sort/anchor-sort.ts → anchor-sort.ts} +1 -1
  199. package/src/capabilities/{app-graph-serializer/app-graph-serializer.ts → app-graph-serializer.ts} +10 -6
  200. package/src/capabilities/{artifact-definition/artifact-definition.ts → artifact-definition.ts} +4 -4
  201. package/src/capabilities/blueprint-definition.ts +19 -0
  202. package/src/capabilities/comment-config.ts +32 -0
  203. package/src/capabilities/create-object.ts +30 -0
  204. package/src/capabilities/index.ts +16 -7
  205. package/src/capabilities/node.ts +13 -0
  206. package/src/capabilities/operation-handler.ts +16 -0
  207. package/src/capabilities/react-surface.tsx +127 -0
  208. package/src/capabilities/{settings/settings.ts → settings.ts} +2 -2
  209. package/src/capabilities/state.ts +47 -0
  210. package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +40 -35
  211. package/src/components/MarkdownEditor/MarkdownEditor.tsx +129 -91
  212. package/src/components/MarkdownEditor/MarkdownEditorContent.tsx +27 -20
  213. package/src/components/MarkdownEditor/MarkdownEditorToolbar.tsx +36 -55
  214. package/src/components/MarkdownSettings/MarkdownSettings.stories.tsx +40 -0
  215. package/src/components/MarkdownSettings/MarkdownSettings.tsx +22 -109
  216. package/src/components/MarkdownSettings/index.ts +1 -1
  217. package/src/components/index.ts +4 -12
  218. package/src/containers/EditableMarkdownCard/EditableMarkdownCard.tsx +42 -0
  219. package/src/containers/EditableMarkdownCard/index.ts +6 -0
  220. package/src/{components → containers}/MarkdownCard/MarkdownCard.stories.tsx +22 -12
  221. package/src/containers/MarkdownCard/MarkdownCard.tsx +67 -0
  222. package/src/containers/MarkdownCard/index.ts +5 -0
  223. package/src/containers/MarkdownCard/snippet.ts +54 -0
  224. package/src/{components → containers/MarkdownContainer}/MarkdownContainer.stories.tsx +36 -24
  225. package/src/containers/MarkdownContainer/MarkdownContainer.tsx +146 -0
  226. package/src/containers/MarkdownContainer/index.ts +6 -0
  227. package/src/containers/index.ts +11 -0
  228. package/src/hooks/index.ts +0 -1
  229. package/src/hooks/useEditorMenuOptions.ts +3 -3
  230. package/src/hooks/useExtensions.tsx +86 -99
  231. package/src/hooks/useLinkQuery.ts +35 -26
  232. package/src/index.ts +2 -6
  233. package/src/meta.ts +1 -1
  234. package/src/operations/create-markdown.ts +19 -0
  235. package/src/operations/create.conversations.json +1 -0
  236. package/src/{blueprints/functions → operations}/create.test.ts +28 -23
  237. package/src/operations/create.ts +26 -0
  238. package/src/operations/index.ts +14 -0
  239. package/src/operations/open.ts +25 -0
  240. package/src/operations/scroll-to-anchor.ts +38 -0
  241. package/src/operations/set-view-mode.ts +23 -0
  242. package/src/operations/update-markdown.ts +51 -0
  243. package/src/operations/update.conversations.json +1 -0
  244. package/src/{blueprints/functions → operations}/update.test.ts +48 -49
  245. package/src/plugin.ts +11 -0
  246. package/src/testing.ts +1 -1
  247. package/src/translations.ts +25 -37
  248. package/src/types/Markdown.ts +23 -25
  249. package/src/types/MarkdownCapabilities.ts +51 -0
  250. package/src/types/MarkdownEvents.ts +14 -0
  251. package/src/types/MarkdownOperation.ts +122 -0
  252. package/src/types/Settings.ts +65 -0
  253. package/src/types/index.ts +6 -6
  254. package/src/types/types.ts +4 -1
  255. package/src/util.tsx +6 -6
  256. package/dist/lib/browser/MarkdownCard-7VIO7R66.mjs +0 -11
  257. package/dist/lib/browser/MarkdownContainer-6E43EDAU.mjs +0 -11
  258. package/dist/lib/browser/anchor-sort-JBAZRPE7.mjs.map +0 -7
  259. package/dist/lib/browser/app-graph-serializer-6Q5YBUPW.mjs.map +0 -7
  260. package/dist/lib/browser/blueprint-definition-6HOAW2E6.mjs +0 -20
  261. package/dist/lib/browser/blueprint-definition-6HOAW2E6.mjs.map +0 -7
  262. package/dist/lib/browser/blueprints/index.mjs +0 -8
  263. package/dist/lib/browser/chunk-2AAD3W6X.mjs +0 -57
  264. package/dist/lib/browser/chunk-2AAD3W6X.mjs.map +0 -7
  265. package/dist/lib/browser/chunk-4GT3QWMK.mjs +0 -167
  266. package/dist/lib/browser/chunk-4GT3QWMK.mjs.map +0 -7
  267. package/dist/lib/browser/chunk-6SM75KL3.mjs +0 -8
  268. package/dist/lib/browser/chunk-6SM75KL3.mjs.map +0 -7
  269. package/dist/lib/browser/chunk-7AQTX6D5.mjs +0 -105
  270. package/dist/lib/browser/chunk-7AQTX6D5.mjs.map +0 -7
  271. package/dist/lib/browser/chunk-EZZFREFN.mjs +0 -58
  272. package/dist/lib/browser/chunk-EZZFREFN.mjs.map +0 -7
  273. package/dist/lib/browser/chunk-HHRUUWGH.mjs +0 -796
  274. package/dist/lib/browser/chunk-HHRUUWGH.mjs.map +0 -7
  275. package/dist/lib/browser/chunk-HQTBT5IY.mjs +0 -176
  276. package/dist/lib/browser/chunk-HQTBT5IY.mjs.map +0 -7
  277. package/dist/lib/browser/cli/index.mjs +0 -33
  278. package/dist/lib/browser/cli/index.mjs.map +0 -7
  279. package/dist/lib/browser/index.mjs +0 -155
  280. package/dist/lib/browser/index.mjs.map +0 -7
  281. package/dist/lib/browser/meta.json +0 -1
  282. package/dist/lib/browser/operation-resolver-UBQUPSXC.mjs +0 -53
  283. package/dist/lib/browser/operation-resolver-UBQUPSXC.mjs.map +0 -7
  284. package/dist/lib/browser/react-surface-7Z6AB26V.mjs +0 -213
  285. package/dist/lib/browser/react-surface-7Z6AB26V.mjs.map +0 -7
  286. package/dist/lib/browser/settings-V2XOFSD5.mjs.map +0 -7
  287. package/dist/lib/browser/state-6Y3JB64H.mjs +0 -29
  288. package/dist/lib/browser/state-6Y3JB64H.mjs.map +0 -7
  289. package/dist/lib/browser/types/index.mjs +0 -17
  290. package/dist/lib/node-esm/MarkdownCard-YC3R2TQW.mjs +0 -12
  291. package/dist/lib/node-esm/MarkdownCard-YC3R2TQW.mjs.map +0 -7
  292. package/dist/lib/node-esm/MarkdownContainer-TTRUOXU6.mjs +0 -12
  293. package/dist/lib/node-esm/MarkdownContainer-TTRUOXU6.mjs.map +0 -7
  294. package/dist/lib/node-esm/anchor-sort-IQMDZRA3.mjs +0 -34
  295. package/dist/lib/node-esm/anchor-sort-IQMDZRA3.mjs.map +0 -7
  296. package/dist/lib/node-esm/app-graph-serializer-STEPJH57.mjs +0 -60
  297. package/dist/lib/node-esm/app-graph-serializer-STEPJH57.mjs.map +0 -7
  298. package/dist/lib/node-esm/blueprint-definition-UGDFF5OZ.mjs +0 -21
  299. package/dist/lib/node-esm/blueprint-definition-UGDFF5OZ.mjs.map +0 -7
  300. package/dist/lib/node-esm/blueprints/index.mjs +0 -9
  301. package/dist/lib/node-esm/chunk-AGZOFIK2.mjs +0 -10
  302. package/dist/lib/node-esm/chunk-AGZOFIK2.mjs.map +0 -7
  303. package/dist/lib/node-esm/chunk-D46D75SK.mjs +0 -797
  304. package/dist/lib/node-esm/chunk-D46D75SK.mjs.map +0 -7
  305. package/dist/lib/node-esm/chunk-DCKB3AVD.mjs +0 -59
  306. package/dist/lib/node-esm/chunk-DCKB3AVD.mjs.map +0 -7
  307. package/dist/lib/node-esm/chunk-K2IIYNCG.mjs +0 -106
  308. package/dist/lib/node-esm/chunk-K2IIYNCG.mjs.map +0 -7
  309. package/dist/lib/node-esm/chunk-LOZVC2WA.mjs +0 -177
  310. package/dist/lib/node-esm/chunk-LOZVC2WA.mjs.map +0 -7
  311. package/dist/lib/node-esm/chunk-MLZQCT2N.mjs +0 -58
  312. package/dist/lib/node-esm/chunk-MLZQCT2N.mjs.map +0 -7
  313. package/dist/lib/node-esm/chunk-USKAPINH.mjs +0 -168
  314. package/dist/lib/node-esm/chunk-USKAPINH.mjs.map +0 -7
  315. package/dist/lib/node-esm/cli/index.mjs +0 -34
  316. package/dist/lib/node-esm/cli/index.mjs.map +0 -7
  317. package/dist/lib/node-esm/index.mjs +0 -156
  318. package/dist/lib/node-esm/index.mjs.map +0 -7
  319. package/dist/lib/node-esm/meta.json +0 -1
  320. package/dist/lib/node-esm/operation-resolver-QAGXDA5E.mjs +0 -54
  321. package/dist/lib/node-esm/operation-resolver-QAGXDA5E.mjs.map +0 -7
  322. package/dist/lib/node-esm/react-surface-VIXAH5CF.mjs +0 -214
  323. package/dist/lib/node-esm/react-surface-VIXAH5CF.mjs.map +0 -7
  324. package/dist/lib/node-esm/settings-EXSH2KF4.mjs +0 -37
  325. package/dist/lib/node-esm/settings-EXSH2KF4.mjs.map +0 -7
  326. package/dist/lib/node-esm/state-TVF2XT2T.mjs +0 -30
  327. package/dist/lib/node-esm/state-TVF2XT2T.mjs.map +0 -7
  328. package/dist/lib/node-esm/types/index.mjs +0 -18
  329. package/dist/types/src/blueprints/functions/create.d.ts +0 -8
  330. package/dist/types/src/blueprints/functions/create.d.ts.map +0 -1
  331. package/dist/types/src/blueprints/functions/create.test.d.ts.map +0 -1
  332. package/dist/types/src/blueprints/functions/index.d.ts +0 -4
  333. package/dist/types/src/blueprints/functions/index.d.ts.map +0 -1
  334. package/dist/types/src/blueprints/functions/open.d.ts +0 -14
  335. package/dist/types/src/blueprints/functions/open.d.ts.map +0 -1
  336. package/dist/types/src/blueprints/functions/update.d.ts +0 -19
  337. package/dist/types/src/blueprints/functions/update.d.ts.map +0 -1
  338. package/dist/types/src/blueprints/functions/update.test.d.ts.map +0 -1
  339. package/dist/types/src/capabilities/anchor-sort/anchor-sort.d.ts +0 -6
  340. package/dist/types/src/capabilities/anchor-sort/anchor-sort.d.ts.map +0 -1
  341. package/dist/types/src/capabilities/anchor-sort/index.d.ts +0 -3
  342. package/dist/types/src/capabilities/anchor-sort/index.d.ts.map +0 -1
  343. package/dist/types/src/capabilities/app-graph-serializer/app-graph-serializer.d.ts +0 -5
  344. package/dist/types/src/capabilities/app-graph-serializer/app-graph-serializer.d.ts.map +0 -1
  345. package/dist/types/src/capabilities/app-graph-serializer/index.d.ts +0 -3
  346. package/dist/types/src/capabilities/app-graph-serializer/index.d.ts.map +0 -1
  347. package/dist/types/src/capabilities/artifact-definition/artifact-definition.d.ts +0 -5
  348. package/dist/types/src/capabilities/artifact-definition/artifact-definition.d.ts.map +0 -1
  349. package/dist/types/src/capabilities/artifact-definition/index.d.ts +0 -3
  350. package/dist/types/src/capabilities/artifact-definition/index.d.ts.map +0 -1
  351. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts +0 -11
  352. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts.map +0 -1
  353. package/dist/types/src/capabilities/blueprint-definition/index.d.ts +0 -3
  354. package/dist/types/src/capabilities/blueprint-definition/index.d.ts.map +0 -1
  355. package/dist/types/src/capabilities/operation-resolver/index.d.ts +0 -3
  356. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +0 -1
  357. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +0 -5
  358. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +0 -1
  359. package/dist/types/src/capabilities/react-surface/index.d.ts +0 -3
  360. package/dist/types/src/capabilities/react-surface/index.d.ts.map +0 -1
  361. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +0 -5
  362. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +0 -1
  363. package/dist/types/src/capabilities/settings/index.d.ts +0 -3
  364. package/dist/types/src/capabilities/settings/index.d.ts.map +0 -1
  365. package/dist/types/src/capabilities/settings/settings.d.ts +0 -7
  366. package/dist/types/src/capabilities/settings/settings.d.ts.map +0 -1
  367. package/dist/types/src/capabilities/state/index.d.ts +0 -3
  368. package/dist/types/src/capabilities/state/index.d.ts.map +0 -1
  369. package/dist/types/src/capabilities/state/state.d.ts +0 -5
  370. package/dist/types/src/capabilities/state/state.d.ts.map +0 -1
  371. package/dist/types/src/cli/index.d.ts +0 -2
  372. package/dist/types/src/cli/index.d.ts.map +0 -1
  373. package/dist/types/src/cli/plugin.d.ts.map +0 -1
  374. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts.map +0 -1
  375. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts.map +0 -1
  376. package/dist/types/src/components/MarkdownCard/index.d.ts +0 -4
  377. package/dist/types/src/components/MarkdownCard/index.d.ts.map +0 -1
  378. package/dist/types/src/components/MarkdownContainer.d.ts +0 -28
  379. package/dist/types/src/components/MarkdownContainer.d.ts.map +0 -1
  380. package/dist/types/src/components/MarkdownContainer.stories.d.ts +0 -88
  381. package/dist/types/src/components/MarkdownContainer.stories.d.ts.map +0 -1
  382. package/dist/types/src/components/Suggestions.stories.d.ts +0 -11
  383. package/dist/types/src/components/Suggestions.stories.d.ts.map +0 -1
  384. package/dist/types/src/hooks/useSelectCurrentThread.d.ts +0 -6
  385. package/dist/types/src/hooks/useSelectCurrentThread.d.ts.map +0 -1
  386. package/dist/types/src/types/MarkdownAction.d.ts +0 -66
  387. package/dist/types/src/types/MarkdownAction.d.ts.map +0 -1
  388. package/dist/types/src/types/capabilities.d.ts +0 -22
  389. package/dist/types/src/types/capabilities.d.ts.map +0 -1
  390. package/dist/types/src/types/events.d.ts +0 -5
  391. package/dist/types/src/types/events.d.ts.map +0 -1
  392. package/src/blueprints/functions/create.conversations.json +0 -1
  393. package/src/blueprints/functions/create.ts +0 -35
  394. package/src/blueprints/functions/index.ts +0 -7
  395. package/src/blueprints/functions/open.ts +0 -33
  396. package/src/blueprints/functions/update.conversations.json +0 -1
  397. package/src/blueprints/functions/update.ts +0 -79
  398. package/src/capabilities/anchor-sort/index.ts +0 -7
  399. package/src/capabilities/app-graph-serializer/index.ts +0 -7
  400. package/src/capabilities/artifact-definition/index.ts +0 -7
  401. package/src/capabilities/blueprint-definition/blueprint-definition.ts +0 -26
  402. package/src/capabilities/blueprint-definition/index.ts +0 -7
  403. package/src/capabilities/operation-resolver/index.ts +0 -7
  404. package/src/capabilities/operation-resolver/operation-resolver.ts +0 -45
  405. package/src/capabilities/react-surface/index.ts +0 -7
  406. package/src/capabilities/react-surface/react-surface.tsx +0 -102
  407. package/src/capabilities/settings/index.ts +0 -7
  408. package/src/capabilities/state/index.ts +0 -7
  409. package/src/capabilities/state/state.ts +0 -31
  410. package/src/cli/index.ts +0 -5
  411. package/src/cli/plugin.ts +0 -30
  412. package/src/components/MarkdownCard/MarkdownCard.tsx +0 -64
  413. package/src/components/MarkdownCard/index.ts +0 -9
  414. package/src/components/MarkdownContainer.tsx +0 -113
  415. package/src/components/Suggestions.stories.tsx +0 -215
  416. package/src/hooks/useSelectCurrentThread.tsx +0 -61
  417. package/src/types/MarkdownAction.ts +0 -59
  418. package/src/types/capabilities.ts +0 -38
  419. package/src/types/events.ts +0 -14
  420. /package/dist/lib/{browser → neutral}/blueprints/index.mjs.map +0 -0
  421. /package/dist/lib/{browser/MarkdownCard-7VIO7R66.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
  422. /package/dist/lib/{browser/types → neutral}/index.mjs.map +0 -0
  423. /package/dist/lib/{browser/MarkdownContainer-6E43EDAU.mjs.map → neutral/meta.mjs.map} +0 -0
  424. /package/dist/lib/{node-esm/blueprints → neutral/operations}/index.mjs.map +0 -0
  425. /package/dist/lib/{node-esm → neutral}/types/index.mjs.map +0 -0
  426. /package/dist/types/src/{blueprints/functions → operations}/create.test.d.ts +0 -0
  427. /package/dist/types/src/{blueprints/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
+ };
@@ -6,36 +6,50 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import * as Effect from 'effect/Effect';
7
7
  import React, { useMemo } from 'react';
8
8
 
9
+ import { Capability, Plugin } from '@dxos/app-framework';
9
10
  import { withPluginManager } from '@dxos/app-framework/testing';
10
11
  import { Surface, useOperationInvoker } from '@dxos/app-framework/ui';
11
- import { LayoutOperation } from '@dxos/app-toolkit';
12
+ import { AppActivationEvents, LayoutOperation } from '@dxos/app-toolkit';
13
+ import { AppSurface } from '@dxos/app-toolkit/ui';
12
14
  import { Obj, Query } from '@dxos/echo';
13
- import { ClientPlugin } from '@dxos/plugin-client';
14
- import { PreviewPlugin } from '@dxos/plugin-preview';
15
+ import { ClientPlugin } from '@dxos/plugin-client/plugin';
16
+ import { initializeIdentity } from '@dxos/plugin-client/testing';
17
+ import { PreviewPlugin } from '@dxos/plugin-preview/testing';
15
18
  import { StorybookPlugin, corePlugins } from '@dxos/plugin-testing';
16
- import { faker } from '@dxos/random';
17
- import { useQuery, useSpace } from '@dxos/react-client/echo';
19
+ import { random } from '@dxos/random';
20
+ import { useQuery, useSpaces } from '@dxos/react-client/echo';
18
21
  import { useAsyncEffect } from '@dxos/react-ui';
19
- import { withLayout, withTheme } from '@dxos/react-ui/testing';
20
22
  import { useAttentionAttributes } from '@dxos/react-ui-attention';
23
+ import { withLayout } from '@dxos/react-ui/testing';
21
24
  import { Text } from '@dxos/schema';
22
25
  import { type ValueGenerator, createObjectFactory } from '@dxos/schema/testing';
23
26
  import { Organization, Person } from '@dxos/types';
24
27
 
25
- import { MarkdownPlugin } from '../MarkdownPlugin';
26
- import { translations } from '../translations';
27
- import { Markdown } from '../types';
28
+ import { translations } from '#translations';
29
+ import { Markdown, MarkdownCapabilities, MarkdownEvents } from '#types';
28
30
 
29
- faker.seed(1);
31
+ import { MarkdownPlugin } from '../../MarkdownPlugin';
30
32
 
31
- const generator: ValueGenerator = faker as any;
33
+ random.seed(1);
34
+
35
+ const generator: ValueGenerator = random as any;
36
+
37
+ /** Minimal plugin that contributes an empty Extensions capability for stories. */
38
+ const MarkdownExtensionsPlugin = Plugin.define({ id: 'story-markdown-extensions', name: 'Story Extensions' }).pipe(
39
+ Plugin.addModule({
40
+ id: 'extensions',
41
+ activatesOn: MarkdownEvents.SetupExtensions,
42
+ activate: () => Effect.succeed(Capability.contributes(MarkdownCapabilities.Extensions, [])),
43
+ }),
44
+ Plugin.make,
45
+ );
32
46
 
33
47
  const DefaultStory = () => {
34
48
  const { invokePromise } = useOperationInvoker();
35
- const space = useSpace();
49
+ const [space] = useSpaces();
36
50
  const [doc] = useQuery(space?.db, Query.type(Markdown.Document));
37
- const data = useMemo(() => ({ subject: doc }), [doc]);
38
51
  const id = doc && Obj.getDXN(doc).toString();
52
+ const data = useMemo(() => ({ subject: doc, attendableId: id ?? 'story' }), [doc, id]);
39
53
  const attentionAttrs = useAttentionAttributes(id);
40
54
 
41
55
  useAsyncEffect(async () => {
@@ -46,39 +60,37 @@ const DefaultStory = () => {
46
60
 
47
61
  return (
48
62
  <div className='contents' {...attentionAttrs}>
49
- <Surface.Surface role='article' data={data} limit={1} />
63
+ <Surface.Surface type={AppSurface.Article} data={data} limit={1} />
50
64
  </div>
51
65
  );
52
66
  };
53
67
 
54
68
  const meta = {
55
- title: 'plugins/plugin-markdown/MarkdownContainer',
69
+ title: 'plugins/plugin-markdown/containers/MarkdownContainer',
56
70
  render: DefaultStory,
57
71
  decorators: [
58
- withTheme(),
59
72
  withLayout({ layout: 'column' }),
60
73
  withPluginManager<{ title?: string; content?: string }>((context) => ({
74
+ setupEvents: [AppActivationEvents.SetupSettings, MarkdownEvents.SetupExtensions],
61
75
  plugins: [
62
76
  ...corePlugins(),
63
77
  StorybookPlugin({}),
78
+ MarkdownExtensionsPlugin(),
64
79
  ClientPlugin({
65
80
  types: [Markdown.Document, Text.Text, Person.Person, Organization.Organization],
66
81
  onClientInitialized: ({ client }) =>
67
82
  Effect.gen(function* () {
68
- yield* Effect.promise(() => client.halo.createIdentity());
69
- yield* Effect.promise(() => client.spaces.waitUntilReady());
70
- yield* Effect.promise(() => client.spaces.default.waitUntilReady());
83
+ const { personalSpace } = yield* initializeIdentity(client);
71
84
 
72
- const space = client.spaces.default;
73
- const createObjects = createObjectFactory(space.db, generator);
85
+ const createObjects = createObjectFactory(personalSpace.db, generator);
74
86
  yield* Effect.promise(() => createObjects([{ type: Organization.Organization, count: 10 }]));
75
87
 
76
- const queue = space.queues.create();
88
+ const queue = personalSpace.queues.create();
77
89
  const kai = Obj.make(Person.Person, { fullName: 'Kai' });
78
90
  const dxos = Obj.make(Organization.Organization, { name: 'DXOS' });
79
91
  yield* Effect.promise(() => queue.append([kai, dxos]));
80
92
 
81
- space.db.add(
93
+ personalSpace.db.add(
82
94
  Markdown.make({
83
95
  name: context.args.title ?? 'Testing',
84
96
  content: [
@@ -95,7 +107,7 @@ const meta = {
95
107
  }),
96
108
  );
97
109
 
98
- yield* Effect.promise(() => space.db.flush({ indexes: true }));
110
+ yield* Effect.promise(() => personalSpace.db.flush({ indexes: true }));
99
111
  }),
100
112
  }),
101
113
 
@@ -0,0 +1,146 @@
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, viewMode, ...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
+ const document = Obj.instanceOf(Markdown.Document, object) ? object : undefined;
58
+ return [...(otherExtensionProviders ?? []), ...(extensionProviders ?? [])]
59
+ .flat()
60
+ .reduce((acc: Extension[], provider) => {
61
+ const extension = typeof provider === 'function' ? provider({ document, viewMode }) : provider;
62
+ if (extension) {
63
+ acc.push(extension);
64
+ }
65
+
66
+ return acc;
67
+ }, []);
68
+ }, [extensionProviders, otherExtensionProviders, object, viewMode]);
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
+ viewMode={viewMode}
122
+ onAction={runAction}
123
+ onFileUpload={handleFileUpload}
124
+ onLinkQuery={handleLinkQuery}
125
+ onSelectObject={handleSelectObject}
126
+ {...props}
127
+ >
128
+ {(editorRootProps) => (
129
+ <Editor.Root {...editorRootProps}>
130
+ <Panel.Root role={role} ref={forwardedRef}>
131
+ {settings.toolbar && (
132
+ <Panel.Toolbar classNames='bg-toolbar-surface'>
133
+ <MarkdownEditor.Toolbar classNames='dx-document' customActions={customActions} />
134
+ </Panel.Toolbar>
135
+ )}
136
+ <Panel.Content>
137
+ <MarkdownEditor.Content initialValue={initialValue} />
138
+ <MarkdownEditor.Blocks />
139
+ </Panel.Content>
140
+ </Panel.Root>
141
+ </Editor.Root>
142
+ )}
143
+ </MarkdownEditorProvider>
144
+ );
145
+ },
146
+ );
@@ -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,11 @@
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 EditableMarkdownCard: ComponentType<any> = lazy(() => import('./EditableMarkdownCard'));
11
+ 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,30 +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 { type Capabilities } from '@dxos/app-framework';
10
- import { useOperationInvoker } from '@dxos/app-framework/ui';
11
- import { LayoutOperation } from '@dxos/app-toolkit';
8
+ import { fromUrlPath } from '@dxos/app-toolkit';
12
9
  import { debounceAndThrottle } from '@dxos/async';
13
10
  import { Obj } from '@dxos/echo';
14
11
  import { createDocAccessor } from '@dxos/echo-db';
15
12
  import { invariant } from '@dxos/invariant';
16
13
  import { getSpace, useObject } from '@dxos/react-client/echo';
17
14
  import { useIdentity } from '@dxos/react-client/halo';
18
- import { Icon, ThemeProvider } from '@dxos/react-ui';
15
+ import { useThemeContext } from '@dxos/react-ui';
19
16
  import { type SelectionManager } from '@dxos/react-ui-attention';
20
17
  import { Text } from '@dxos/schema';
18
+ import { Domino } from '@dxos/ui';
21
19
  import {
22
20
  Cursor,
23
21
  type EditorStateStore,
24
22
  EditorView,
25
- type EditorViewMode,
26
23
  type Extension,
27
24
  InputModeExtensions,
28
25
  type PreviewOptions,
29
- type RenderCallback,
30
26
  createDataExtensions,
31
27
  decorateMarkdown,
32
28
  documentId,
@@ -37,12 +33,13 @@ import {
37
33
  preview,
38
34
  replacer,
39
35
  selectionState,
40
- typewriter,
36
+ snippets,
41
37
  } from '@dxos/ui-editor';
42
- import { defaultTx } from '@dxos/ui-theme';
43
- import { isTruthy } from '@dxos/util';
38
+ import { type EditorViewMode, type RenderCallback } from '@dxos/ui-editor/types';
39
+ import { isTruthy, safeUrl } from '@dxos/util';
40
+
41
+ import { Markdown } from '#types';
44
42
 
45
- import { Markdown } from '../types';
46
43
  import { setFallbackName } from '../util';
47
44
 
48
45
  export type DocumentType = Markdown.Document | Text.Text | { id: string; text: string };
@@ -50,12 +47,16 @@ export type DocumentType = Markdown.Document | Text.Text | { id: string; text: s
50
47
  export type ExtensionsOptions = {
51
48
  id: string;
52
49
  object?: DocumentType;
53
- invokePromise?: Capabilities.OperationInvoker['invokePromise'];
54
50
  settings?: Markdown.Settings;
55
- selectionManager?: SelectionManager;
51
+ compact?: boolean;
56
52
  viewMode?: EditorViewMode;
53
+ editable?: boolean;
54
+ selectionManager?: SelectionManager;
57
55
  editorStateStore?: EditorStateStore;
58
56
  previewOptions?: PreviewOptions;
57
+ platform?: 'mobile' | 'desktop';
58
+ /** Callback when an internal link is clicked. */
59
+ onSelectObject?: (objectId: string) => void;
59
60
  };
60
61
 
61
62
  // TODO(burdon): Merge with createBaseExtensions below.
@@ -63,12 +64,14 @@ export const useExtensions = ({
63
64
  id,
64
65
  object,
65
66
  settings,
66
- selectionManager,
67
+ compact,
67
68
  viewMode,
69
+ selectionManager,
68
70
  editorStateStore,
69
71
  previewOptions,
72
+ onSelectObject,
70
73
  }: ExtensionsOptions): Extension[] => {
71
- const { invokePromise } = useOperationInvoker();
74
+ const { platform } = useThemeContext();
72
75
  const identity = useIdentity();
73
76
  const space = getSpace(object);
74
77
 
@@ -90,24 +93,27 @@ export const useExtensions = ({
90
93
  id,
91
94
  object,
92
95
  settings,
93
- selectionManager,
96
+ compact,
94
97
  viewMode,
98
+ selectionManager,
95
99
  previewOptions,
96
- invokePromise,
100
+ platform,
101
+ onSelectObject,
97
102
  }),
98
103
  [
99
104
  id,
100
105
  object,
106
+ compact,
101
107
  viewMode,
102
- invokePromise,
108
+ selectionManager,
103
109
  previewOptions,
104
110
  settings,
105
111
  settings?.debug,
106
112
  settings?.editorInputMode,
107
113
  settings?.folding,
108
114
  settings?.numberedHeadings,
109
- settings?.typewriter,
110
- selectionManager,
115
+ platform,
116
+ onSelectObject,
111
117
  ],
112
118
  );
113
119
 
@@ -145,16 +151,18 @@ export const useExtensions = ({
145
151
  const createBaseExtensions = ({
146
152
  id,
147
153
  object,
148
- invokePromise,
154
+ onSelectObject,
149
155
  settings,
150
- selectionManager,
156
+ compact,
151
157
  viewMode,
158
+ selectionManager,
152
159
  previewOptions,
160
+ platform,
153
161
  }: ExtensionsOptions): Extension[] => {
154
162
  const extensions: Extension[] = [
155
163
  selectionManager && selectionChange(selectionManager),
156
164
  settings?.editorInputMode && InputModeExtensions[settings.editorInputMode],
157
- settings?.folding && folding(),
165
+ settings?.folding && !compact && platform !== 'mobile' && folding(),
158
166
  ].filter(isTruthy);
159
167
 
160
168
  //
@@ -167,17 +175,8 @@ const createBaseExtensions = ({
167
175
  decorateMarkdown({
168
176
  selectionChangeDelay: 100,
169
177
  numberedHeadings: settings?.numberedHeadings ? { from: 2 } : undefined,
170
- // TODO(wittjosiah): For internal links, consider ignoring the link text and rendering the label of the object being linked to.
171
- // TODO(burdon): Create dx-tag.
172
- renderLinkButton:
173
- invokePromise && (object || id)
174
- ? createLinkRenderer((targetId: string) => {
175
- void invokePromise(LayoutOperation.Open, {
176
- subject: [targetId],
177
- pivotId: object && Obj.isObject(object) ? Obj.getDXN(object).toString() : id,
178
- });
179
- })
180
- : undefined,
178
+ // TODO(wittjosiah): For internal links render the label of the object.
179
+ renderLinkButton: onSelectObject && createRenderLink(onSelectObject),
181
180
  }),
182
181
  linkTooltip(renderLinkTooltip),
183
182
  preview(previewOptions),
@@ -187,9 +186,9 @@ const createBaseExtensions = ({
187
186
  }
188
187
 
189
188
  if (settings?.debug) {
190
- const items = settings.typewriter?.split(/[,\n]/) ?? '';
189
+ const items = settings.snippets?.split(/[,\n]/) ?? '';
191
190
  if (items) {
192
- extensions.push(typewriter({ items }));
191
+ extensions.push(snippets({ items }));
193
192
  }
194
193
  }
195
194
 
@@ -197,79 +196,67 @@ const createBaseExtensions = ({
197
196
  };
198
197
 
199
198
  const selectionChange = (selectionManager: SelectionManager) => {
200
- return EditorView.updateListener.of(
201
- debounceAndThrottle((update: ViewUpdate) => {
202
- if (update.selectionSet) {
203
- const id = update.state.facet(documentId);
204
- const cursorConverter = update.state.facet(Cursor.converter);
205
- const selection = update.state.selection;
206
- const ranges = selection.ranges
207
- .map((range) => ({
208
- from: cursorConverter.toCursor(range.from),
209
- to: cursorConverter.toCursor(range.to),
210
- }))
211
- .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);
212
209
 
213
- selectionManager.updateMultiRange(id, ranges);
214
- }
215
- }, 100),
216
- );
217
- };
210
+ selectionManager.updateMultiRange(id, ranges);
211
+ }, 100);
218
212
 
219
- // TODO(burdon): Factor out styles.
220
- const style = {
221
- hover: 'rounded-sm text-primary-500 hover:text-primary-600 dark:text-primary-500 hover:dark:text-primary-400',
222
- 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
+ });
223
218
  };
224
219
 
225
- const createLinkRenderer =
220
+ const createRenderLink =
226
221
  (onSelectObject: (id: string) => void): RenderCallback<{ url: string }> =>
227
222
  (el, { url }) => {
228
223
  // TODO(burdon): Formalize/document internal link format.
229
- const isInternal =
230
- url.startsWith('/') ||
231
- // TODO(wittjosiah): This should probably be parsed out on paste?
232
- 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'));
233
229
 
234
- const options: AnchorHTMLAttributes<any> = isInternal
235
- ? {
236
- onClick: () => {
237
- const qualifiedId = url.split('/').at(-1);
238
- invariant(qualifiedId, 'Invalid link format.');
239
- onSelectObject(qualifiedId);
240
- },
241
- }
242
- : {
243
- href: url,
244
- rel: 'noreferrer',
245
- target: '_blank',
246
- };
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
+ }
247
244
 
248
- renderRoot(
249
- el,
250
- <a {...options} className={style.hover}>
251
- <Icon
252
- icon={isInternal ? 'ph--arrow-square-down--bold' : 'ph--arrow-square-out--bold'}
253
- size={4}
254
- classNames={style.icon}
255
- />
256
- </a>,
257
- );
245
+ keyboardEvent.preventDefault();
246
+ keyboardEvent.stopPropagation();
247
+ onSelectObject(qualifiedId);
248
+ });
249
+ }
250
+
251
+ el.appendChild(icon.root);
258
252
  };
259
253
 
260
254
  const renderLinkTooltip: RenderCallback<{ url: string }> = (el, { url }) => {
261
- const web = new URL(url);
262
- renderRoot(
263
- el,
264
- <a href={url} rel='noreferrer' target='_blank' className={style.hover}>
265
- {web.origin}
266
- <Icon icon='ph--arrow-square-out--bold' size={4} classNames={style.icon} />
267
- </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,
268
261
  );
269
262
  };
270
-
271
- // TODO(burdon): REMOVE.
272
- const renderRoot = <T extends Element>(root: T, node: ReactNode): T => {
273
- createRoot(root).render(<ThemeProvider tx={defaultTx}>{node}</ThemeProvider>);
274
- return root;
275
- };