@dxos/plugin-markdown 0.8.4-main.bc674ce → 0.8.4-main.c351d160a8

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 (266) hide show
  1. package/dist/lib/browser/{chunk-WIPSLZ6L.mjs → MarkdownCard-R6VVXOMN.mjs} +27 -26
  2. package/dist/lib/browser/MarkdownCard-R6VVXOMN.mjs.map +7 -0
  3. package/dist/lib/browser/{chunk-KDKXFKDN.mjs → MarkdownContainer-LSOAAG6R.mjs} +48 -25
  4. package/dist/lib/browser/MarkdownContainer-LSOAAG6R.mjs.map +7 -0
  5. package/dist/lib/browser/MarkdownSettings-OD7AJSSJ.mjs +106 -0
  6. package/dist/lib/browser/MarkdownSettings-OD7AJSSJ.mjs.map +7 -0
  7. package/dist/lib/browser/{anchor-sort-WQ3TL7ZI.mjs → anchor-sort-35SV33JX.mjs} +6 -4
  8. package/dist/lib/browser/anchor-sort-35SV33JX.mjs.map +7 -0
  9. package/dist/lib/browser/{app-graph-serializer-ULZUJKOD.mjs → app-graph-serializer-RMUNNVUY.mjs} +9 -7
  10. package/dist/lib/browser/app-graph-serializer-RMUNNVUY.mjs.map +7 -0
  11. package/dist/lib/browser/blueprint-definition-SFGTWLSY.mjs +18 -0
  12. package/dist/lib/browser/blueprint-definition-SFGTWLSY.mjs.map +7 -0
  13. package/dist/lib/browser/blueprints/index.mjs +5 -4
  14. package/dist/lib/browser/{chunk-LMO5UVKL.mjs → chunk-4CSOMIT4.mjs} +29 -61
  15. package/dist/lib/browser/chunk-4CSOMIT4.mjs.map +7 -0
  16. package/dist/lib/browser/chunk-646I24Q2.mjs +178 -0
  17. package/dist/lib/browser/chunk-646I24Q2.mjs.map +7 -0
  18. package/dist/lib/browser/{chunk-BX73DASG.mjs → chunk-B6S4YQWZ.mjs} +285 -206
  19. package/dist/lib/browser/chunk-B6S4YQWZ.mjs.map +7 -0
  20. package/dist/lib/browser/chunk-RYZHVXZ5.mjs +28 -0
  21. package/dist/lib/browser/chunk-RYZHVXZ5.mjs.map +7 -0
  22. package/dist/lib/browser/{chunk-CUGDX7KA.mjs → chunk-WU3CQIPM.mjs} +2 -2
  23. package/dist/lib/browser/{chunk-JOXYQLKH.mjs → chunk-YKXQWJX6.mjs} +9 -4
  24. package/dist/lib/browser/chunk-YKXQWJX6.mjs.map +7 -0
  25. package/dist/lib/browser/cli/index.mjs +15 -13
  26. package/dist/lib/browser/cli/index.mjs.map +3 -3
  27. package/dist/lib/browser/index.mjs +49 -48
  28. package/dist/lib/browser/index.mjs.map +3 -3
  29. package/dist/lib/browser/meta.json +1 -1
  30. package/dist/lib/browser/{operation-resolver-EGCWOQKJ.mjs → operation-resolver-MVI2ZJ7M.mjs} +6 -18
  31. package/dist/lib/browser/operation-resolver-MVI2ZJ7M.mjs.map +7 -0
  32. package/dist/lib/browser/react-surface-OJYNFGZB.mjs +117 -0
  33. package/dist/lib/browser/react-surface-OJYNFGZB.mjs.map +7 -0
  34. package/dist/lib/browser/{settings-JY5JE7MI.mjs → settings-R722LDFD.mjs} +8 -5
  35. package/dist/lib/browser/settings-R722LDFD.mjs.map +7 -0
  36. package/dist/lib/browser/{state-QE7VSJWJ.mjs → state-MRJLGZW4.mjs} +7 -5
  37. package/dist/lib/{node-esm/state-LXE5XIN4.mjs.map → browser/state-MRJLGZW4.mjs.map} +2 -2
  38. package/dist/lib/browser/types/index.mjs +2 -1
  39. package/dist/lib/node-esm/{chunk-RQP7G7XW.mjs → MarkdownCard-EE3Q2JPL.mjs} +27 -26
  40. package/dist/lib/node-esm/MarkdownCard-EE3Q2JPL.mjs.map +7 -0
  41. package/dist/lib/node-esm/{chunk-3JYPCC7M.mjs → MarkdownContainer-NMFVVFBR.mjs} +48 -25
  42. package/dist/lib/node-esm/MarkdownContainer-NMFVVFBR.mjs.map +7 -0
  43. package/dist/lib/node-esm/MarkdownSettings-U7GJ4OP3.mjs +107 -0
  44. package/dist/lib/node-esm/MarkdownSettings-U7GJ4OP3.mjs.map +7 -0
  45. package/dist/lib/node-esm/{anchor-sort-G7D5TAI6.mjs → anchor-sort-QCV4U222.mjs} +6 -4
  46. package/dist/lib/node-esm/anchor-sort-QCV4U222.mjs.map +7 -0
  47. package/dist/lib/node-esm/{app-graph-serializer-W5YMQP7P.mjs → app-graph-serializer-I27YTNDW.mjs} +9 -7
  48. package/dist/lib/node-esm/app-graph-serializer-I27YTNDW.mjs.map +7 -0
  49. package/dist/lib/node-esm/blueprint-definition-VZEIBTAP.mjs +19 -0
  50. package/dist/lib/node-esm/blueprint-definition-VZEIBTAP.mjs.map +7 -0
  51. package/dist/lib/node-esm/blueprints/index.mjs +5 -4
  52. package/dist/lib/node-esm/{chunk-PRV35A7Z.mjs → chunk-2LVNBTQT.mjs} +29 -61
  53. package/dist/lib/node-esm/chunk-2LVNBTQT.mjs.map +7 -0
  54. package/dist/lib/node-esm/chunk-CW4FZNMZ.mjs +29 -0
  55. package/dist/lib/node-esm/chunk-CW4FZNMZ.mjs.map +7 -0
  56. package/dist/lib/node-esm/{chunk-W3IIKDV5.mjs → chunk-HVAZON2M.mjs} +2 -2
  57. package/dist/lib/node-esm/chunk-KHTJJ45U.mjs +179 -0
  58. package/dist/lib/node-esm/chunk-KHTJJ45U.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-44VJC3QF.mjs → chunk-TR2NZYXO.mjs} +9 -4
  60. package/dist/lib/node-esm/chunk-TR2NZYXO.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-D4BCFPKK.mjs → chunk-VG2PIENM.mjs} +285 -206
  62. package/dist/lib/node-esm/chunk-VG2PIENM.mjs.map +7 -0
  63. package/dist/lib/node-esm/cli/index.mjs +15 -13
  64. package/dist/lib/node-esm/cli/index.mjs.map +3 -3
  65. package/dist/lib/node-esm/index.mjs +49 -48
  66. package/dist/lib/node-esm/index.mjs.map +3 -3
  67. package/dist/lib/node-esm/meta.json +1 -1
  68. package/dist/lib/node-esm/{operation-resolver-2HIS2AQZ.mjs → operation-resolver-6TK6ARJ6.mjs} +6 -18
  69. package/dist/lib/node-esm/operation-resolver-6TK6ARJ6.mjs.map +7 -0
  70. package/dist/lib/node-esm/react-surface-UVNCUX77.mjs +118 -0
  71. package/dist/lib/node-esm/react-surface-UVNCUX77.mjs.map +7 -0
  72. package/dist/lib/node-esm/{settings-4UGMPIRY.mjs → settings-RDYNOKVE.mjs} +8 -5
  73. package/dist/lib/node-esm/settings-RDYNOKVE.mjs.map +7 -0
  74. package/dist/lib/node-esm/{state-LXE5XIN4.mjs → state-7HQSNXXQ.mjs} +7 -5
  75. package/dist/lib/{browser/state-QE7VSJWJ.mjs.map → node-esm/state-7HQSNXXQ.mjs.map} +2 -2
  76. package/dist/lib/node-esm/types/index.mjs +2 -1
  77. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  78. package/dist/types/src/blueprints/functions/create.d.ts.map +1 -1
  79. package/dist/types/src/blueprints/functions/index.d.ts +41 -3
  80. package/dist/types/src/blueprints/functions/index.d.ts.map +1 -1
  81. package/dist/types/src/blueprints/functions/open.d.ts +8 -1
  82. package/dist/types/src/blueprints/functions/open.d.ts.map +1 -1
  83. package/dist/types/src/blueprints/functions/update.d.ts +16 -3
  84. package/dist/types/src/blueprints/functions/update.d.ts.map +1 -1
  85. package/dist/types/src/blueprints/index.d.ts +1 -1
  86. package/dist/types/src/blueprints/index.d.ts.map +1 -1
  87. package/dist/types/src/blueprints/markdown-blueprint.d.ts +3 -20
  88. package/dist/types/src/blueprints/markdown-blueprint.d.ts.map +1 -1
  89. package/dist/types/src/capabilities/anchor-sort/anchor-sort.d.ts +3 -2
  90. package/dist/types/src/capabilities/anchor-sort/anchor-sort.d.ts.map +1 -1
  91. package/dist/types/src/capabilities/anchor-sort/index.d.ts +1 -1
  92. package/dist/types/src/capabilities/anchor-sort/index.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/app-graph-serializer/app-graph-serializer.d.ts +2 -2
  94. package/dist/types/src/capabilities/app-graph-serializer/app-graph-serializer.d.ts.map +1 -1
  95. package/dist/types/src/capabilities/app-graph-serializer/index.d.ts +1 -1
  96. package/dist/types/src/capabilities/app-graph-serializer/index.d.ts.map +1 -1
  97. package/dist/types/src/capabilities/artifact-definition/artifact-definition.d.ts +1 -1
  98. package/dist/types/src/capabilities/artifact-definition/artifact-definition.d.ts.map +1 -1
  99. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts +3 -7
  100. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts.map +1 -1
  101. package/dist/types/src/capabilities/blueprint-definition/index.d.ts +1 -1
  102. package/dist/types/src/capabilities/blueprint-definition/index.d.ts.map +1 -1
  103. package/dist/types/src/capabilities/operation-resolver/index.d.ts +1 -1
  104. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -1
  105. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +2 -2
  106. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -1
  107. package/dist/types/src/capabilities/react-surface/index.d.ts +1 -1
  108. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -1
  109. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +2 -2
  110. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -1
  111. package/dist/types/src/capabilities/settings/index.d.ts +1 -1
  112. package/dist/types/src/capabilities/settings/index.d.ts.map +1 -1
  113. package/dist/types/src/capabilities/settings/settings.d.ts +3 -2
  114. package/dist/types/src/capabilities/settings/settings.d.ts.map +1 -1
  115. package/dist/types/src/capabilities/state/state.d.ts +1 -1
  116. package/dist/types/src/cli/plugin.d.ts.map +1 -1
  117. package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts +2 -2
  118. package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts.map +1 -1
  119. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +5 -3
  120. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
  121. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts +1 -1
  122. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts.map +1 -1
  123. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts +2 -0
  124. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts.map +1 -1
  125. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts +5 -5
  126. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts.map +1 -1
  127. package/dist/types/src/components/index.d.ts +1 -8
  128. package/dist/types/src/components/index.d.ts.map +1 -1
  129. package/dist/types/src/containers/MarkdownCard/MarkdownCard.d.ts.map +1 -0
  130. package/dist/types/src/containers/MarkdownCard/MarkdownCard.stories.d.ts.map +1 -0
  131. package/dist/types/src/{components → containers}/MarkdownCard/index.d.ts +0 -1
  132. package/dist/types/src/containers/MarkdownCard/index.d.ts.map +1 -0
  133. package/dist/types/src/{components → containers/MarkdownContainer}/MarkdownContainer.d.ts +6 -6
  134. package/dist/types/src/containers/MarkdownContainer/MarkdownContainer.d.ts.map +1 -0
  135. package/dist/types/src/{components → containers/MarkdownContainer}/MarkdownContainer.stories.d.ts +31 -1
  136. package/dist/types/src/containers/MarkdownContainer/MarkdownContainer.stories.d.ts.map +1 -0
  137. package/dist/types/src/containers/MarkdownContainer/index.d.ts +3 -0
  138. package/dist/types/src/containers/MarkdownContainer/index.d.ts.map +1 -0
  139. package/dist/types/src/{components → containers}/MarkdownSettings/MarkdownSettings.d.ts.map +1 -1
  140. package/dist/types/src/containers/MarkdownSettings/index.d.ts +3 -0
  141. package/dist/types/src/containers/MarkdownSettings/index.d.ts.map +1 -0
  142. package/dist/types/src/containers/index.d.ts +6 -0
  143. package/dist/types/src/containers/index.d.ts.map +1 -0
  144. package/dist/types/src/hooks/useExtensions.d.ts +3 -3
  145. package/dist/types/src/hooks/useExtensions.d.ts.map +1 -1
  146. package/dist/types/src/hooks/useSelectCurrentThread.d.ts +1 -1
  147. package/dist/types/src/hooks/useSelectCurrentThread.d.ts.map +1 -1
  148. package/dist/types/src/index.d.ts +1 -0
  149. package/dist/types/src/index.d.ts.map +1 -1
  150. package/dist/types/src/translations.d.ts +30 -0
  151. package/dist/types/src/translations.d.ts.map +1 -1
  152. package/dist/types/src/types/Markdown.d.ts +1 -1
  153. package/dist/types/src/types/Markdown.d.ts.map +1 -1
  154. package/dist/types/src/types/MarkdownAction.d.ts +2 -22
  155. package/dist/types/src/types/MarkdownAction.d.ts.map +1 -1
  156. package/dist/types/src/types/events.d.ts.map +1 -1
  157. package/dist/types/src/util.d.ts +1 -1
  158. package/dist/types/src/util.d.ts.map +1 -1
  159. package/dist/types/tsconfig.tsbuildinfo +1 -1
  160. package/package.json +64 -57
  161. package/src/MarkdownPlugin.tsx +29 -38
  162. package/src/blueprints/functions/create.conversations.json +1 -1
  163. package/src/blueprints/functions/create.test.ts +24 -57
  164. package/src/blueprints/functions/create.ts +6 -5
  165. package/src/blueprints/functions/index.ts +11 -3
  166. package/src/blueprints/functions/open.ts +10 -10
  167. package/src/blueprints/functions/update.conversations.json +1 -1
  168. package/src/blueprints/functions/update.test.ts +133 -67
  169. package/src/blueprints/functions/update.ts +54 -13
  170. package/src/blueprints/index.ts +1 -1
  171. package/src/blueprints/markdown-blueprint.ts +14 -6
  172. package/src/capabilities/anchor-sort/anchor-sort.ts +3 -2
  173. package/src/capabilities/app-graph-serializer/app-graph-serializer.ts +5 -4
  174. package/src/capabilities/artifact-definition/artifact-definition.ts +2 -2
  175. package/src/capabilities/blueprint-definition/blueprint-definition.ts +6 -14
  176. package/src/capabilities/operation-resolver/operation-resolver.ts +3 -14
  177. package/src/capabilities/react-surface/react-surface.tsx +30 -19
  178. package/src/capabilities/settings/settings.ts +3 -2
  179. package/src/capabilities/state/state.ts +2 -2
  180. package/src/cli/plugin.ts +5 -5
  181. package/src/components/MarkdownEditor/FileUpload.tsx +2 -2
  182. package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +25 -22
  183. package/src/components/MarkdownEditor/MarkdownEditor.tsx +44 -17
  184. package/src/components/MarkdownEditor/MarkdownEditorContent.tsx +6 -5
  185. package/src/components/MarkdownEditor/MarkdownEditorToolbar.tsx +13 -13
  186. package/src/components/index.ts +2 -14
  187. package/src/{components → containers}/MarkdownCard/MarkdownCard.stories.tsx +17 -7
  188. package/src/{components → containers}/MarkdownCard/MarkdownCard.tsx +21 -24
  189. package/src/{components → containers}/MarkdownCard/index.ts +0 -2
  190. package/src/{components → containers/MarkdownContainer}/MarkdownContainer.stories.tsx +22 -9
  191. package/src/{components → containers/MarkdownContainer}/MarkdownContainer.tsx +57 -34
  192. package/src/containers/MarkdownContainer/index.ts +6 -0
  193. package/src/{components → containers}/MarkdownSettings/MarkdownSettings.tsx +24 -24
  194. package/src/containers/MarkdownSettings/index.ts +7 -0
  195. package/src/containers/index.ts +11 -0
  196. package/src/hooks/useEditorMenuOptions.ts +1 -1
  197. package/src/hooks/useExtensions.tsx +52 -89
  198. package/src/hooks/useLinkQuery.ts +3 -3
  199. package/src/hooks/useSelectCurrentThread.tsx +6 -6
  200. package/src/index.ts +2 -0
  201. package/src/meta.ts +1 -1
  202. package/src/testing.ts +2 -2
  203. package/src/translations.ts +3 -0
  204. package/src/types/Markdown.ts +13 -5
  205. package/src/types/MarkdownAction.ts +3 -18
  206. package/src/types/capabilities.ts +4 -4
  207. package/src/types/events.ts +4 -3
  208. package/src/util.tsx +2 -2
  209. package/dist/lib/browser/MarkdownCard-WHK3ORP7.mjs +0 -12
  210. package/dist/lib/browser/MarkdownCard-WHK3ORP7.mjs.map +0 -7
  211. package/dist/lib/browser/MarkdownContainer-V7EAADMF.mjs +0 -12
  212. package/dist/lib/browser/MarkdownContainer-V7EAADMF.mjs.map +0 -7
  213. package/dist/lib/browser/anchor-sort-WQ3TL7ZI.mjs.map +0 -7
  214. package/dist/lib/browser/app-graph-serializer-ULZUJKOD.mjs.map +0 -7
  215. package/dist/lib/browser/blueprint-definition-TLV4PNZW.mjs +0 -19
  216. package/dist/lib/browser/blueprint-definition-TLV4PNZW.mjs.map +0 -7
  217. package/dist/lib/browser/chunk-BX73DASG.mjs.map +0 -7
  218. package/dist/lib/browser/chunk-FWQQW6KU.mjs +0 -144
  219. package/dist/lib/browser/chunk-FWQQW6KU.mjs.map +0 -7
  220. package/dist/lib/browser/chunk-JOXYQLKH.mjs.map +0 -7
  221. package/dist/lib/browser/chunk-KDKXFKDN.mjs.map +0 -7
  222. package/dist/lib/browser/chunk-LMO5UVKL.mjs.map +0 -7
  223. package/dist/lib/browser/chunk-S45ULIOG.mjs +0 -101
  224. package/dist/lib/browser/chunk-S45ULIOG.mjs.map +0 -7
  225. package/dist/lib/browser/chunk-WIPSLZ6L.mjs.map +0 -7
  226. package/dist/lib/browser/operation-resolver-EGCWOQKJ.mjs.map +0 -7
  227. package/dist/lib/browser/react-surface-SRPLD3ED.mjs +0 -213
  228. package/dist/lib/browser/react-surface-SRPLD3ED.mjs.map +0 -7
  229. package/dist/lib/browser/settings-JY5JE7MI.mjs.map +0 -7
  230. package/dist/lib/node-esm/MarkdownCard-WJPLQTFS.mjs +0 -13
  231. package/dist/lib/node-esm/MarkdownCard-WJPLQTFS.mjs.map +0 -7
  232. package/dist/lib/node-esm/MarkdownContainer-LUSMORP2.mjs +0 -13
  233. package/dist/lib/node-esm/MarkdownContainer-LUSMORP2.mjs.map +0 -7
  234. package/dist/lib/node-esm/anchor-sort-G7D5TAI6.mjs.map +0 -7
  235. package/dist/lib/node-esm/app-graph-serializer-W5YMQP7P.mjs.map +0 -7
  236. package/dist/lib/node-esm/blueprint-definition-HYFA7BKQ.mjs +0 -20
  237. package/dist/lib/node-esm/blueprint-definition-HYFA7BKQ.mjs.map +0 -7
  238. package/dist/lib/node-esm/chunk-3JYPCC7M.mjs.map +0 -7
  239. package/dist/lib/node-esm/chunk-44VJC3QF.mjs.map +0 -7
  240. package/dist/lib/node-esm/chunk-D4BCFPKK.mjs.map +0 -7
  241. package/dist/lib/node-esm/chunk-EYAFC4N7.mjs +0 -145
  242. package/dist/lib/node-esm/chunk-EYAFC4N7.mjs.map +0 -7
  243. package/dist/lib/node-esm/chunk-PRV35A7Z.mjs.map +0 -7
  244. package/dist/lib/node-esm/chunk-RQP7G7XW.mjs.map +0 -7
  245. package/dist/lib/node-esm/chunk-SDTYEGGL.mjs +0 -102
  246. package/dist/lib/node-esm/chunk-SDTYEGGL.mjs.map +0 -7
  247. package/dist/lib/node-esm/operation-resolver-2HIS2AQZ.mjs.map +0 -7
  248. package/dist/lib/node-esm/react-surface-RONSOJIQ.mjs +0 -214
  249. package/dist/lib/node-esm/react-surface-RONSOJIQ.mjs.map +0 -7
  250. package/dist/lib/node-esm/settings-4UGMPIRY.mjs.map +0 -7
  251. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts.map +0 -1
  252. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts.map +0 -1
  253. package/dist/types/src/components/MarkdownCard/index.d.ts.map +0 -1
  254. package/dist/types/src/components/MarkdownContainer.d.ts.map +0 -1
  255. package/dist/types/src/components/MarkdownContainer.stories.d.ts.map +0 -1
  256. package/dist/types/src/components/MarkdownSettings/index.d.ts +0 -2
  257. package/dist/types/src/components/MarkdownSettings/index.d.ts.map +0 -1
  258. package/dist/types/src/components/Suggestions.stories.d.ts +0 -11
  259. package/dist/types/src/components/Suggestions.stories.d.ts.map +0 -1
  260. package/src/components/MarkdownSettings/index.ts +0 -5
  261. package/src/components/Suggestions.stories.tsx +0 -215
  262. /package/dist/lib/browser/{chunk-CUGDX7KA.mjs.map → chunk-WU3CQIPM.mjs.map} +0 -0
  263. /package/dist/lib/node-esm/{chunk-W3IIKDV5.mjs.map → chunk-HVAZON2M.mjs.map} +0 -0
  264. /package/dist/types/src/{components → containers}/MarkdownCard/MarkdownCard.d.ts +0 -0
  265. /package/dist/types/src/{components → containers}/MarkdownCard/MarkdownCard.stories.d.ts +0 -0
  266. /package/dist/types/src/{components → containers}/MarkdownSettings/MarkdownSettings.d.ts +0 -0
@@ -6,9 +6,10 @@ 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 { Common } from '@dxos/app-framework';
10
- import { Surface, useOperationInvoker } from '@dxos/app-framework/react';
9
+ import { Capability, Plugin } from '@dxos/app-framework';
11
10
  import { withPluginManager } from '@dxos/app-framework/testing';
11
+ import { Surface, useOperationInvoker } from '@dxos/app-framework/ui';
12
+ import { AppActivationEvents, LayoutOperation } from '@dxos/app-toolkit';
12
13
  import { Obj, Query } from '@dxos/echo';
13
14
  import { ClientPlugin } from '@dxos/plugin-client';
14
15
  import { PreviewPlugin } from '@dxos/plugin-preview';
@@ -22,14 +23,24 @@ import { Text } from '@dxos/schema';
22
23
  import { type ValueGenerator, createObjectFactory } from '@dxos/schema/testing';
23
24
  import { Organization, Person } from '@dxos/types';
24
25
 
25
- import { MarkdownPlugin } from '../MarkdownPlugin';
26
- import { translations } from '../translations';
27
- import { Markdown } from '../types';
26
+ import { MarkdownPlugin } from '../../MarkdownPlugin';
27
+ import { translations } from '../../translations';
28
+ import { Markdown, MarkdownCapabilities, MarkdownEvents } from '../../types';
28
29
 
29
30
  faker.seed(1);
30
31
 
31
32
  const generator: ValueGenerator = faker as any;
32
33
 
34
+ /** Minimal plugin that contributes an empty Extensions capability for stories. */
35
+ const MarkdownExtensionsPlugin = Plugin.define({ id: 'story-markdown-extensions', name: 'Story Extensions' }).pipe(
36
+ Plugin.addModule({
37
+ id: 'extensions',
38
+ activatesOn: MarkdownEvents.SetupExtensions,
39
+ activate: () => Effect.succeed(Capability.contributes(MarkdownCapabilities.Extensions, [])),
40
+ }),
41
+ Plugin.make,
42
+ );
43
+
33
44
  const DefaultStory = () => {
34
45
  const { invokePromise } = useOperationInvoker();
35
46
  const space = useSpace();
@@ -40,27 +51,29 @@ const DefaultStory = () => {
40
51
 
41
52
  useAsyncEffect(async () => {
42
53
  if (space) {
43
- await invokePromise(Common.LayoutOperation.SwitchWorkspace, { subject: space.id });
54
+ await invokePromise(LayoutOperation.SwitchWorkspace, { subject: space.id });
44
55
  }
45
56
  }, [space, invokePromise]);
46
57
 
47
58
  return (
48
59
  <div className='contents' {...attentionAttrs}>
49
- <Surface role='article' data={data} limit={1} />
60
+ <Surface.Surface role='article' data={data} limit={1} />
50
61
  </div>
51
62
  );
52
63
  };
53
64
 
54
65
  const meta = {
55
- title: 'plugins/plugin-markdown/MarkdownContainer',
66
+ title: 'plugins/plugin-markdown/containers/MarkdownContainer',
56
67
  render: DefaultStory,
57
68
  decorators: [
58
- withTheme,
69
+ withTheme(),
59
70
  withLayout({ layout: 'column' }),
60
71
  withPluginManager<{ title?: string; content?: string }>((context) => ({
72
+ setupEvents: [AppActivationEvents.SetupSettings, MarkdownEvents.SetupExtensions],
61
73
  plugins: [
62
74
  ...corePlugins(),
63
75
  StorybookPlugin({}),
76
+ MarkdownExtensionsPlugin(),
64
77
  ClientPlugin({
65
78
  types: [Markdown.Document, Text.Text, Person.Person, Organization.Organization],
66
79
  onClientInitialized: ({ client }) =>
@@ -4,21 +4,22 @@
4
4
 
5
5
  import { type Extension } from '@codemirror/state';
6
6
  import { Atom } from '@effect-atom/atom-react';
7
- import React, { forwardRef, useMemo } from 'react';
7
+ import React, { forwardRef, useCallback, useMemo } from 'react';
8
8
 
9
- import { Common } from '@dxos/app-framework';
10
- import { type SurfaceComponentProps, useAppGraph, useCapabilities } from '@dxos/app-framework/react';
9
+ import { useCapabilities, useOperationInvoker } from '@dxos/app-framework/ui';
10
+ import { AppCapabilities, LayoutOperation } from '@dxos/app-toolkit';
11
+ import { type SurfaceComponentProps } from '@dxos/app-toolkit/ui';
12
+ import { useAppGraph } from '@dxos/app-toolkit/ui';
11
13
  import { Obj } from '@dxos/echo';
12
14
  import { useActionRunner } from '@dxos/plugin-graph';
13
15
  import { useObject } from '@dxos/react-client/echo';
16
+ import { Panel } from '@dxos/react-ui';
14
17
  import { type SelectionManager } from '@dxos/react-ui-attention';
15
- import { Layout } from '@dxos/react-ui-mosaic';
16
18
  import { Text } from '@dxos/schema';
17
19
 
18
- import { useLinkQuery } from '../hooks';
19
- import { Markdown, MarkdownCapabilities, type MarkdownPluginState } from '../types';
20
-
21
- import { MarkdownEditor, type MarkdownEditorContentProps, type MarkdownEditorRootProps } from './MarkdownEditor';
20
+ import { MarkdownEditor, type MarkdownEditorContentProps, type MarkdownEditorRootProps } from '../../components';
21
+ import { useLinkQuery } from '../../hooks';
22
+ import { Markdown, MarkdownCapabilities, type MarkdownPluginState } from '../../types';
22
23
 
23
24
  export type MarkdownContainerProps = SurfaceComponentProps<
24
25
  Markdown.Document | Text.Text,
@@ -26,15 +27,17 @@ export type MarkdownContainerProps = SurfaceComponentProps<
26
27
  id: string;
27
28
  settings: Markdown.Settings;
28
29
  selectionManager?: SelectionManager;
29
- } & Pick<MarkdownEditorRootProps, 'viewMode' | 'onViewModeChange'> &
30
- Pick<MarkdownEditorContentProps, 'editorStateStore'> &
31
- Pick<MarkdownPluginState, 'extensionProviders'>
30
+ } & Pick<MarkdownPluginState, 'extensionProviders'> &
31
+ Pick<MarkdownEditorRootProps, 'viewMode' | 'onSelectObject' | 'onViewModeChange'> &
32
+ Pick<MarkdownEditorContentProps, 'editorStateStore'>
32
33
  >;
33
34
 
34
35
  export const MarkdownContainer = forwardRef<HTMLDivElement, MarkdownContainerProps>(
35
- ({ role, subject: object, id, settings, extensionProviders, ...props }, forwardedRef) => {
36
+ (
37
+ { role, subject: object, id, attendableId, settings, extensionProviders, onSelectObject, ...props },
38
+ forwardedRef,
39
+ ) => {
36
40
  const db = Obj.isObject(object) ? Obj.getDatabase(object) : undefined;
37
- const attendableId = Obj.instanceOf(Markdown.Document, object) ? Obj.getDXN(object).toString() : undefined;
38
41
  const [docContent] = useObject(Obj.instanceOf(Markdown.Document, object) ? object.content : undefined, 'content');
39
42
  const [textContent] = useObject(Obj.instanceOf(Text.Text, object) ? object : undefined, 'content');
40
43
  const initialValue = docContent ?? textContent;
@@ -65,15 +68,15 @@ export const MarkdownContainer = forwardRef<HTMLDivElement, MarkdownContainerPro
65
68
  const runAction = useActionRunner();
66
69
  const customActions = useMemo(() => {
67
70
  return Atom.make((get) => {
68
- const actions = get(graph.actions(id));
71
+ const actions = get(graph.actions(attendableId ?? id));
69
72
  const nodes = actions.filter((action) => action.properties.disposition === 'toolbar');
70
- const edges = nodes.map((node) => ({ source: 'root', target: node.id }));
73
+ const edges = nodes.map((node) => ({ source: 'root', target: node.id, relation: 'child' }));
71
74
  return { nodes, edges };
72
75
  });
73
76
  }, [graph]);
74
77
 
75
78
  // File upload.
76
- const [upload] = useCapabilities(Common.Capability.FileUploader);
79
+ const [upload] = useCapabilities(AppCapabilities.FileUploader);
77
80
  const handleFileUpload = useMemo(() => {
78
81
  if (!db || !upload) {
79
82
  return undefined;
@@ -85,27 +88,47 @@ export const MarkdownContainer = forwardRef<HTMLDivElement, MarkdownContainerPro
85
88
  // Query for @ refs.
86
89
  const handleLinkQuery = useLinkQuery(db);
87
90
 
91
+ // Open linked objects.
92
+ const { invokePromise } = useOperationInvoker();
93
+ const handleSelectObject = useCallback(
94
+ (targetId: string) => {
95
+ if (onSelectObject) {
96
+ onSelectObject(targetId);
97
+ } else {
98
+ void invokePromise?.(LayoutOperation.Open, {
99
+ subject: [targetId],
100
+ pivotId: attendableId,
101
+ });
102
+ }
103
+ },
104
+ [onSelectObject, invokePromise, object, id],
105
+ );
106
+
88
107
  return (
89
- <Layout.Main toolbar={settings.toolbar} ref={forwardedRef}>
90
- <MarkdownEditor.Root
91
- id={attendableId ?? id}
92
- object={object}
93
- extensions={extensions}
94
- settings={settings}
95
- onAction={runAction}
96
- onFileUpload={handleFileUpload}
97
- onLinkQuery={handleLinkQuery}
98
- {...props}
99
- >
108
+ <MarkdownEditor.Root
109
+ id={id}
110
+ attendableId={attendableId}
111
+ object={object}
112
+ extensions={extensions}
113
+ settings={settings}
114
+ onAction={runAction}
115
+ onFileUpload={handleFileUpload}
116
+ onLinkQuery={handleLinkQuery}
117
+ onSelectObject={handleSelectObject}
118
+ {...props}
119
+ >
120
+ <Panel.Root role={role} ref={forwardedRef}>
100
121
  {settings.toolbar && (
101
- <MarkdownEditor.Toolbar id={attendableId ?? id} role={role} customActions={customActions} />
122
+ <Panel.Toolbar className='bg-toolbar-surface'>
123
+ <MarkdownEditor.Toolbar classNames='dx-document' customActions={customActions} />
124
+ </Panel.Toolbar>
102
125
  )}
103
- <MarkdownEditor.Content initialValue={initialValue} scrollPastEnd={role === 'article'} />
104
- <MarkdownEditor.Blocks />
105
- </MarkdownEditor.Root>
106
- </Layout.Main>
126
+ <Panel.Content className='pt-2'>
127
+ <MarkdownEditor.Content initialValue={initialValue} scrollPastEnd={role === 'article'} />
128
+ <MarkdownEditor.Blocks />
129
+ </Panel.Content>
130
+ </Panel.Root>
131
+ </MarkdownEditor.Root>
107
132
  );
108
133
  },
109
134
  );
110
-
111
- export default MarkdownContainer;
@@ -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';
@@ -5,7 +5,7 @@
5
5
  import React from 'react';
6
6
 
7
7
  import { Input, Select, useTranslation } from '@dxos/react-ui';
8
- import { ControlGroup, ControlItemInput, ControlPage, ControlSection } from '@dxos/react-ui-form';
8
+ import { Settings } from '@dxos/react-ui-form';
9
9
  import { type EditorInputMode, EditorInputModes, type EditorViewMode, EditorViewModes } from '@dxos/ui-editor';
10
10
 
11
11
  import { meta } from '../../meta';
@@ -21,10 +21,10 @@ export const MarkdownSettings = ({ settings, onSettingsChange }: MarkdownSetting
21
21
 
22
22
  // TODO(wittjosiah): Add skill test confirmation for entering vim mode.
23
23
  return (
24
- <ControlPage>
25
- <ControlSection title={t('settings title', { ns: meta.id })}>
26
- <ControlGroup>
27
- <ControlItemInput title={t('default view mode label')}>
24
+ <Settings.Root>
25
+ <Settings.Section title={t('settings title', { ns: meta.id })}>
26
+ <Settings.Group>
27
+ <Settings.ItemInput title={t('default view mode label')}>
28
28
  <Select.Root
29
29
  value={settings.defaultViewMode}
30
30
  onValueChange={(value) => {
@@ -37,7 +37,7 @@ export const MarkdownSettings = ({ settings, onSettingsChange }: MarkdownSetting
37
37
  <Select.Viewport>
38
38
  {EditorViewModes.map((mode) => (
39
39
  <Select.Option key={mode} value={mode}>
40
- {t(`${mode} mode label`, { ns: 'react-ui-editor' })}
40
+ {t(`${mode} mode label`, { ns: '@dxos/react-ui-editor' })}
41
41
  </Select.Option>
42
42
  ))}
43
43
  </Select.Viewport>
@@ -45,9 +45,9 @@ export const MarkdownSettings = ({ settings, onSettingsChange }: MarkdownSetting
45
45
  </Select.Content>
46
46
  </Select.Portal>
47
47
  </Select.Root>
48
- </ControlItemInput>
48
+ </Settings.ItemInput>
49
49
 
50
- <ControlItemInput title={t('editor input mode label')}>
50
+ <Settings.ItemInput title={t('editor input mode label')}>
51
51
  <Select.Root
52
52
  value={settings.editorInputMode ?? 'default'}
53
53
  onValueChange={(value) => {
@@ -68,55 +68,55 @@ export const MarkdownSettings = ({ settings, onSettingsChange }: MarkdownSetting
68
68
  </Select.Content>
69
69
  </Select.Portal>
70
70
  </Select.Root>
71
- </ControlItemInput>
71
+ </Settings.ItemInput>
72
72
 
73
- <ControlItemInput title={t('settings toolbar label')}>
73
+ <Settings.ItemInput title={t('settings toolbar label')}>
74
74
  <Input.Switch
75
75
  checked={settings.toolbar}
76
76
  onCheckedChange={(checked) => onSettingsChange((s) => ({ ...s, toolbar: !!checked }))}
77
77
  />
78
- </ControlItemInput>
78
+ </Settings.ItemInput>
79
79
 
80
- <ControlItemInput title={t('settings numbered headings label')}>
80
+ <Settings.ItemInput title={t('settings numbered headings label')}>
81
81
  <Input.Switch
82
82
  checked={settings.numberedHeadings}
83
83
  onCheckedChange={(checked) => onSettingsChange((s) => ({ ...s, numberedHeadings: !!checked }))}
84
84
  />
85
- </ControlItemInput>
85
+ </Settings.ItemInput>
86
86
 
87
- <ControlItemInput title={t('settings folding label')}>
87
+ <Settings.ItemInput title={t('settings folding label')}>
88
88
  <Input.Switch
89
89
  checked={settings.folding}
90
90
  onCheckedChange={(checked) => onSettingsChange((s) => ({ ...s, folding: !!checked }))}
91
91
  />
92
- </ControlItemInput>
92
+ </Settings.ItemInput>
93
93
 
94
- <ControlItemInput title={t('settings experimental label')}>
94
+ <Settings.ItemInput title={t('settings experimental label')}>
95
95
  <Input.Switch
96
96
  checked={settings.experimental}
97
97
  onCheckedChange={(checked) => onSettingsChange((s) => ({ ...s, experimental: !!checked }))}
98
98
  />
99
- </ControlItemInput>
99
+ </Settings.ItemInput>
100
100
 
101
- <ControlItemInput title={t('settings debug label')}>
101
+ <Settings.ItemInput title={t('settings debug label')}>
102
102
  <Input.Switch
103
103
  checked={settings.debug}
104
104
  onCheckedChange={(checked) => onSettingsChange((s) => ({ ...s, debug: !!checked }))}
105
105
  />
106
- </ControlItemInput>
106
+ </Settings.ItemInput>
107
107
 
108
108
  {settings.debug && (
109
- <ControlItemInput title={t('settings debug textarea label', { ns: meta.id })}>
109
+ <Settings.ItemInput title={t('settings debug textarea label', { ns: meta.id })}>
110
110
  <Input.TextArea
111
111
  rows={5}
112
112
  value={settings.typewriter}
113
113
  onChange={({ target: { value } }) => onSettingsChange((s) => ({ ...s, typewriter: value }))}
114
114
  placeholder={t('settings debug placeholder')}
115
115
  />
116
- </ControlItemInput>
116
+ </Settings.ItemInput>
117
117
  )}
118
- </ControlGroup>
119
- </ControlSection>
120
- </ControlPage>
118
+ </Settings.Group>
119
+ </Settings.Section>
120
+ </Settings.Root>
121
121
  );
122
122
  };
@@ -0,0 +1,7 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { MarkdownSettings } from './MarkdownSettings';
6
+
7
+ export default MarkdownSettings;
@@ -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 MarkdownContainer: ComponentType<any> = lazy(() => import('./MarkdownContainer'));
11
+ export const MarkdownSettings: ComponentType<any> = lazy(() => import('./MarkdownSettings'));
@@ -56,7 +56,7 @@ 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
62
  return Domino.of('div').children(pressEl, ...triggerEls, forCommandsEl).root;
@@ -3,20 +3,16 @@
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';
8
-
9
- import { Common } from '@dxos/app-framework';
10
- import { useOperationInvoker } from '@dxos/app-framework/react';
6
+ import { useMemo } from 'react';
11
7
  import { debounceAndThrottle } from '@dxos/async';
12
8
  import { Obj } from '@dxos/echo';
13
9
  import { createDocAccessor } from '@dxos/echo-db';
14
10
  import { invariant } from '@dxos/invariant';
15
11
  import { getSpace, useObject } from '@dxos/react-client/echo';
16
12
  import { useIdentity } from '@dxos/react-client/halo';
17
- import { Icon, ThemeProvider } from '@dxos/react-ui';
18
13
  import { type SelectionManager } from '@dxos/react-ui-attention';
19
14
  import { Text } from '@dxos/schema';
15
+ import { Domino } from '@dxos/ui';
20
16
  import {
21
17
  Cursor,
22
18
  type EditorStateStore,
@@ -38,8 +34,7 @@ import {
38
34
  selectionState,
39
35
  typewriter,
40
36
  } from '@dxos/ui-editor';
41
- import { defaultTx } from '@dxos/ui-theme';
42
- import { isTruthy } from '@dxos/util';
37
+ import { isTruthy, safeUrl } from '@dxos/util';
43
38
 
44
39
  import { Markdown } from '../types';
45
40
  import { setFallbackName } from '../util';
@@ -49,12 +44,13 @@ export type DocumentType = Markdown.Document | Text.Text | { id: string; text: s
49
44
  export type ExtensionsOptions = {
50
45
  id: string;
51
46
  object?: DocumentType;
52
- invokePromise?: Common.Capability.OperationInvoker['invokePromise'];
53
47
  settings?: Markdown.Settings;
54
48
  selectionManager?: SelectionManager;
55
49
  viewMode?: EditorViewMode;
56
50
  editorStateStore?: EditorStateStore;
57
51
  previewOptions?: PreviewOptions;
52
+ /** Callback when an internal link is clicked. */
53
+ onSelectObject?: (objectId: string) => void;
58
54
  };
59
55
 
60
56
  // TODO(burdon): Merge with createBaseExtensions below.
@@ -66,8 +62,8 @@ export const useExtensions = ({
66
62
  viewMode,
67
63
  editorStateStore,
68
64
  previewOptions,
65
+ onSelectObject,
69
66
  }: ExtensionsOptions): Extension[] => {
70
- const { invokePromise } = useOperationInvoker();
71
67
  const identity = useIdentity();
72
68
  const space = getSpace(object);
73
69
 
@@ -92,14 +88,14 @@ export const useExtensions = ({
92
88
  selectionManager,
93
89
  viewMode,
94
90
  previewOptions,
95
- invokePromise,
91
+ onSelectObject,
96
92
  }),
97
93
  [
98
94
  id,
99
95
  object,
100
96
  viewMode,
101
- invokePromise,
102
97
  previewOptions,
98
+ onSelectObject,
103
99
  settings,
104
100
  settings?.debug,
105
101
  settings?.editorInputMode,
@@ -144,7 +140,7 @@ export const useExtensions = ({
144
140
  const createBaseExtensions = ({
145
141
  id,
146
142
  object,
147
- invokePromise,
143
+ onSelectObject,
148
144
  settings,
149
145
  selectionManager,
150
146
  viewMode,
@@ -166,17 +162,8 @@ const createBaseExtensions = ({
166
162
  decorateMarkdown({
167
163
  selectionChangeDelay: 100,
168
164
  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,
165
+ // TODO(wittjosiah): For internal links render the label of the object.
166
+ renderLinkButton: onSelectObject && createRenderLink(onSelectObject),
180
167
  }),
181
168
  linkTooltip(renderLinkTooltip),
182
169
  preview(previewOptions),
@@ -196,79 +183,55 @@ const createBaseExtensions = ({
196
183
  };
197
184
 
198
185
  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);
211
-
212
- selectionManager.updateMultiRange(id, ranges);
213
- }
214
- }, 100),
215
- );
216
- };
217
-
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',
186
+ const debouncedHandler = debounceAndThrottle((update: ViewUpdate) => {
187
+ const id = update.state.facet(documentId);
188
+ const cursorConverter = update.state.facet(Cursor.converter);
189
+ const selection = update.state.selection;
190
+ const ranges = selection.ranges
191
+ .map((range) => ({
192
+ from: cursorConverter.toCursor(range.from),
193
+ to: cursorConverter.toCursor(range.to),
194
+ }))
195
+ .filter(({ from, to }) => to > from);
196
+
197
+ selectionManager.updateMultiRange(id, ranges);
198
+ }, 100);
199
+
200
+ return EditorView.updateListener.of((update: ViewUpdate) => {
201
+ if (update.selectionSet) {
202
+ debouncedHandler(update);
203
+ }
204
+ });
222
205
  };
223
206
 
224
- const createLinkRenderer =
207
+ const createRenderLink =
225
208
  (onSelectObject: (id: string) => void): RenderCallback<{ url: string }> =>
226
209
  (el, { url }) => {
227
210
  // 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);
232
-
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
- };
211
+ const isInternal = url.startsWith('/') || url.startsWith(window.location.origin);
212
+ const anchor = Domino.of('a')
213
+ .classNames('dx-link dx-icon-inline ms-1')
214
+ .children(Domino.svg(isInternal ? 'ph--arrow-square-down--regular' : 'ph--arrow-square-out--regular'));
215
+
216
+ if (isInternal) {
217
+ anchor.on('click', () => {
218
+ const qualifiedId = url.split('/').at(-1);
219
+ invariant(qualifiedId, 'Invalid link format.');
220
+ onSelectObject(qualifiedId);
221
+ });
222
+ } else {
223
+ anchor.attributes({ href: url, rel: 'noreferrer', target: '_blank' });
224
+ }
246
225
 
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
- );
226
+ el.appendChild(anchor.root);
257
227
  };
258
228
 
259
229
  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>,
230
+ el.appendChild(
231
+ Domino.of('a')
232
+ .attributes({ href: url, target: '_blank', rel: 'noreferrer' })
233
+ .classNames('dx-link flex items-center gap-2')
234
+ .text(safeUrl(url)?.origin ?? url)
235
+ .children(Domino.svg('ph--arrow-square-out--regular')).root,
267
236
  );
268
237
  };
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,8 +5,8 @@
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';
@@ -19,7 +19,7 @@ export const useLinkQuery = (db: Database.Database | undefined) => {
19
19
  const manager = usePluginManager();
20
20
  const resolve = useCallback(
21
21
  (typename: string) =>
22
- manager.capabilities.getAll(Common.Capability.Metadata).find(({ id }) => id === typename)?.metadata ?? {},
22
+ manager.capabilities.getAll(AppCapabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {},
23
23
  [manager],
24
24
  );
25
25
 
@@ -6,8 +6,8 @@ import { EditorView } from '@codemirror/view';
6
6
  import * as Effect from 'effect/Effect';
7
7
  import { useMemo } from 'react';
8
8
 
9
- import { Common } from '@dxos/app-framework';
10
- import { useOperationResolver } from '@dxos/app-framework/react';
9
+ import { useOperationResolver } from '@dxos/app-framework/ui';
10
+ import { LayoutOperation } from '@dxos/app-toolkit';
11
11
  import { invariant } from '@dxos/invariant';
12
12
  import { OperationResolver } from '@dxos/operation';
13
13
  import { Cursor, setSelection } from '@dxos/ui-editor';
@@ -17,13 +17,13 @@ import { meta } from '../meta';
17
17
  /**
18
18
  * Handle scrolling and selection of the current thread in a markdown editor.
19
19
  */
20
- export const useSelectCurrentThread = (editorView: EditorView | null, documentId: string) => {
20
+ export const useSelectCurrentThread = (editorView: EditorView | null, documentId: string, attendableId: string) => {
21
21
  const scrollIntoViewHandler = useMemo(
22
22
  () =>
23
23
  OperationResolver.make({
24
- operation: Common.LayoutOperation.ScrollIntoView,
24
+ operation: LayoutOperation.ScrollIntoView,
25
25
  position: 'hoist',
26
- filter: (input) => !!editorView && input.subject === documentId && !!input.cursor,
26
+ filter: (input) => !!editorView && !!input.cursor && input.subject === attendableId,
27
27
  handler: (input) =>
28
28
  Effect.sync(() => {
29
29
  invariant(editorView, 'Editor view is not defined.');
@@ -54,7 +54,7 @@ export const useSelectCurrentThread = (editorView: EditorView | null, documentId
54
54
  }
55
55
  }),
56
56
  }),
57
- [documentId, editorView],
57
+ [documentId, attendableId, editorView],
58
58
  );
59
59
 
60
60
  useOperationResolver(meta.id, scrollIntoViewHandler);
package/src/index.ts CHANGED
@@ -9,3 +9,5 @@ export * from './types';
9
9
  export * from './util';
10
10
 
11
11
  export * from './MarkdownPlugin';
12
+
13
+ export { MarkdownEditor } from './components';