@dxos/plugin-markdown 0.8.4-main.67995b8 → 0.8.4-main.72ec0f3

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 (265) hide show
  1. package/dist/lib/browser/MarkdownCard-JYMDPKV5.mjs +12 -0
  2. package/dist/lib/browser/MarkdownCard-JYMDPKV5.mjs.map +7 -0
  3. package/dist/lib/browser/MarkdownContainer-Y75XSVBX.mjs +15 -0
  4. package/dist/lib/browser/MarkdownContainer-Y75XSVBX.mjs.map +7 -0
  5. package/dist/lib/browser/{anchor-sort-Z7JQA7RL.mjs → anchor-sort-3HGPGCOO.mjs} +6 -7
  6. package/dist/lib/browser/anchor-sort-3HGPGCOO.mjs.map +7 -0
  7. package/dist/lib/browser/{app-graph-serializer-ZT5OVF5G.mjs → app-graph-serializer-POZN234F.mjs} +11 -12
  8. package/dist/lib/browser/app-graph-serializer-POZN234F.mjs.map +7 -0
  9. package/dist/lib/browser/blueprint-definition-GIPKFDY5.mjs +13 -0
  10. package/dist/lib/browser/blueprint-definition-GIPKFDY5.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-K7ZFMSC4.mjs → chunk-22XSSNBS.mjs} +8 -4
  12. package/dist/lib/browser/chunk-22XSSNBS.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-2MLGSYRN.mjs +20 -0
  14. package/dist/lib/browser/chunk-2MLGSYRN.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-ZGY3DYC2.mjs → chunk-BQTYJOFB.mjs} +5 -7
  16. package/dist/lib/browser/chunk-BQTYJOFB.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-VMX5SDGW.mjs → chunk-GH6GQSBL.mjs} +9 -8
  18. package/dist/lib/browser/chunk-GH6GQSBL.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-CD4E4K7J.mjs → chunk-IBCHVMZW.mjs} +2 -2
  20. package/dist/lib/browser/{chunk-CD4E4K7J.mjs.map → chunk-IBCHVMZW.mjs.map} +2 -2
  21. package/dist/lib/browser/chunk-K3LXOU3E.mjs +827 -0
  22. package/dist/lib/browser/chunk-K3LXOU3E.mjs.map +7 -0
  23. package/dist/lib/browser/chunk-PBJLFIOX.mjs +96 -0
  24. package/dist/lib/browser/chunk-PBJLFIOX.mjs.map +7 -0
  25. package/dist/lib/browser/{chunk-YHMGUSO7.mjs → chunk-QYSEJ5GP.mjs} +16 -17
  26. package/dist/lib/browser/chunk-QYSEJ5GP.mjs.map +7 -0
  27. package/dist/lib/browser/chunk-Y53FQREH.mjs +150 -0
  28. package/dist/lib/browser/chunk-Y53FQREH.mjs.map +7 -0
  29. package/dist/lib/browser/index.mjs +35 -23
  30. package/dist/lib/browser/index.mjs.map +3 -3
  31. package/dist/lib/browser/{intent-resolver-EBEF7WEI.mjs → intent-resolver-Z5L7TXUK.mjs} +21 -19
  32. package/dist/lib/browser/intent-resolver-Z5L7TXUK.mjs.map +7 -0
  33. package/dist/lib/browser/meta.json +1 -1
  34. package/dist/lib/browser/{react-surface-ZPMZT4VU.mjs → react-surface-GO5ZOKNN.mjs} +89 -86
  35. package/dist/lib/browser/react-surface-GO5ZOKNN.mjs.map +7 -0
  36. package/dist/lib/browser/{settings-MBDK4TWE.mjs → settings-TZUDB5EW.mjs} +5 -5
  37. package/dist/lib/browser/{settings-MBDK4TWE.mjs.map → settings-TZUDB5EW.mjs.map} +1 -1
  38. package/dist/lib/browser/{state-ZA6PZPUI.mjs → state-BTUKVZHY.mjs} +5 -5
  39. package/dist/lib/browser/state-BTUKVZHY.mjs.map +7 -0
  40. package/dist/lib/browser/toolkit.mjs +13 -0
  41. package/dist/lib/browser/toolkit.mjs.map +7 -0
  42. package/dist/lib/browser/types/index.mjs +2 -2
  43. package/dist/lib/node-esm/MarkdownCard-ZXPJLUYO.mjs +13 -0
  44. package/dist/lib/node-esm/MarkdownCard-ZXPJLUYO.mjs.map +7 -0
  45. package/dist/lib/node-esm/MarkdownContainer-YRDSRDCS.mjs +16 -0
  46. package/dist/lib/node-esm/MarkdownContainer-YRDSRDCS.mjs.map +7 -0
  47. package/dist/lib/node-esm/{anchor-sort-R6AAKYNG.mjs → anchor-sort-PCDXEBJ2.mjs} +6 -7
  48. package/dist/lib/node-esm/anchor-sort-PCDXEBJ2.mjs.map +7 -0
  49. package/dist/lib/node-esm/{app-graph-serializer-X4M5QEI6.mjs → app-graph-serializer-NF65JYAS.mjs} +11 -12
  50. package/dist/lib/node-esm/app-graph-serializer-NF65JYAS.mjs.map +7 -0
  51. package/dist/lib/node-esm/blueprint-definition-ENKJZYQS.mjs +14 -0
  52. package/dist/lib/node-esm/blueprint-definition-ENKJZYQS.mjs.map +7 -0
  53. package/dist/lib/node-esm/{chunk-YGNVDYMB.mjs → chunk-AMHACOXW.mjs} +8 -4
  54. package/dist/lib/node-esm/chunk-AMHACOXW.mjs.map +7 -0
  55. package/dist/lib/node-esm/chunk-CT7CFX5G.mjs +828 -0
  56. package/dist/lib/node-esm/chunk-CT7CFX5G.mjs.map +7 -0
  57. package/dist/lib/node-esm/{chunk-B3J2M4YL.mjs → chunk-GMMVSXQ6.mjs} +2 -2
  58. package/dist/lib/node-esm/{chunk-B3J2M4YL.mjs.map → chunk-GMMVSXQ6.mjs.map} +2 -2
  59. package/dist/lib/node-esm/chunk-HAIEWPU7.mjs +151 -0
  60. package/dist/lib/node-esm/chunk-HAIEWPU7.mjs.map +7 -0
  61. package/dist/lib/node-esm/chunk-KCHUTL3Q.mjs +22 -0
  62. package/dist/lib/node-esm/chunk-KCHUTL3Q.mjs.map +7 -0
  63. package/dist/lib/node-esm/{chunk-6GCOJS4Y.mjs → chunk-NGYJNQ6A.mjs} +16 -17
  64. package/dist/lib/node-esm/chunk-NGYJNQ6A.mjs.map +7 -0
  65. package/dist/lib/node-esm/chunk-PIOOG7A5.mjs +97 -0
  66. package/dist/lib/node-esm/chunk-PIOOG7A5.mjs.map +7 -0
  67. package/dist/lib/node-esm/{chunk-LZK3TLKM.mjs → chunk-PLZ7EVCT.mjs} +9 -8
  68. package/dist/lib/node-esm/chunk-PLZ7EVCT.mjs.map +7 -0
  69. package/dist/lib/node-esm/{chunk-RCIXKCVG.mjs → chunk-SHAMSMKQ.mjs} +5 -7
  70. package/dist/lib/node-esm/chunk-SHAMSMKQ.mjs.map +7 -0
  71. package/dist/lib/node-esm/index.mjs +35 -23
  72. package/dist/lib/node-esm/index.mjs.map +3 -3
  73. package/dist/lib/node-esm/{intent-resolver-L2UGZ72W.mjs → intent-resolver-6B3PFQ5F.mjs} +21 -19
  74. package/dist/lib/node-esm/intent-resolver-6B3PFQ5F.mjs.map +7 -0
  75. package/dist/lib/node-esm/meta.json +1 -1
  76. package/dist/lib/node-esm/{react-surface-3JJSTTQP.mjs → react-surface-I46BPCWT.mjs} +89 -86
  77. package/dist/lib/node-esm/react-surface-I46BPCWT.mjs.map +7 -0
  78. package/dist/lib/node-esm/{settings-LBDWWPZJ.mjs → settings-CJ3T5EX4.mjs} +5 -5
  79. package/dist/lib/node-esm/{settings-LBDWWPZJ.mjs.map → settings-CJ3T5EX4.mjs.map} +1 -1
  80. package/dist/lib/node-esm/{state-UIHO2SFZ.mjs → state-K6EH7SRZ.mjs} +5 -5
  81. package/dist/lib/node-esm/state-K6EH7SRZ.mjs.map +7 -0
  82. package/dist/lib/node-esm/toolkit.mjs +14 -0
  83. package/dist/lib/node-esm/toolkit.mjs.map +7 -0
  84. package/dist/lib/node-esm/types/index.mjs +2 -2
  85. package/dist/types/src/MarkdownPlugin.d.ts +1 -1
  86. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  87. package/dist/types/src/capabilities/anchor-sort.d.ts +2 -4
  88. package/dist/types/src/capabilities/anchor-sort.d.ts.map +1 -1
  89. package/dist/types/src/capabilities/app-graph-serializer.d.ts +1 -1
  90. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -1
  91. package/dist/types/src/capabilities/artifact-definition.d.ts +1 -9
  92. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/blueprint-definition.d.ts +7 -0
  94. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  95. package/dist/types/src/capabilities/capabilities.d.ts +1 -1
  96. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  97. package/dist/types/src/capabilities/index.d.ts +10 -12
  98. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  99. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  100. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  101. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  102. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  103. package/dist/types/src/capabilities/settings.d.ts +1 -1
  104. package/dist/types/src/capabilities/state.d.ts +2 -2
  105. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  106. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts +7 -0
  107. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts.map +1 -0
  108. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts +9 -0
  109. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts.map +1 -0
  110. package/dist/types/src/components/MarkdownCard/index.d.ts +4 -0
  111. package/dist/types/src/components/MarkdownCard/index.d.ts.map +1 -0
  112. package/dist/types/src/components/MarkdownContainer.d.ts +8 -12
  113. package/dist/types/src/components/MarkdownContainer.d.ts.map +1 -1
  114. package/dist/types/src/components/MarkdownContainer.stories.d.ts +54 -5
  115. package/dist/types/src/components/MarkdownContainer.stories.d.ts.map +1 -1
  116. package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts +11 -0
  117. package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts.map +1 -0
  118. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +42 -23
  119. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
  120. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts +8 -15
  121. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts.map +1 -1
  122. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts +26 -0
  123. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts.map +1 -0
  124. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts +12 -0
  125. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts.map +1 -0
  126. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts.map +1 -1
  127. package/dist/types/src/components/Suggestions.stories.d.ts +1 -2
  128. package/dist/types/src/components/Suggestions.stories.d.ts.map +1 -1
  129. package/dist/types/src/components/index.d.ts +4 -2
  130. package/dist/types/src/components/index.d.ts.map +1 -1
  131. package/dist/types/src/functions/create.d.ts +8 -0
  132. package/dist/types/src/functions/create.d.ts.map +1 -0
  133. package/dist/types/src/functions/create.test.d.ts +2 -0
  134. package/dist/types/src/functions/create.test.d.ts.map +1 -0
  135. package/dist/types/src/functions/index.d.ts +18 -0
  136. package/dist/types/src/functions/index.d.ts.map +1 -0
  137. package/dist/types/src/functions/open.d.ts +7 -0
  138. package/dist/types/src/functions/open.d.ts.map +1 -0
  139. package/dist/types/src/functions/update.d.ts +6 -0
  140. package/dist/types/src/functions/update.d.ts.map +1 -0
  141. package/dist/types/src/functions/update.test.d.ts +2 -0
  142. package/dist/types/src/functions/update.test.d.ts.map +1 -0
  143. package/dist/types/src/hooks/index.d.ts +3 -0
  144. package/dist/types/src/hooks/index.d.ts.map +1 -1
  145. package/dist/types/src/hooks/useEditorMenuOptions.d.ts +9 -0
  146. package/dist/types/src/hooks/useEditorMenuOptions.d.ts.map +1 -0
  147. package/dist/types/src/hooks/useExtensions.d.ts +21 -0
  148. package/dist/types/src/hooks/useExtensions.d.ts.map +1 -0
  149. package/dist/types/src/hooks/useLinkQuery.d.ts +4 -0
  150. package/dist/types/src/hooks/useLinkQuery.d.ts.map +1 -0
  151. package/dist/types/src/hooks/useSelectCurrentThread.d.ts +1 -1
  152. package/dist/types/src/hooks/useSelectCurrentThread.d.ts.map +1 -1
  153. package/dist/types/src/index.d.ts +2 -1
  154. package/dist/types/src/index.d.ts.map +1 -1
  155. package/dist/types/src/meta.d.ts +0 -1
  156. package/dist/types/src/meta.d.ts.map +1 -1
  157. package/dist/types/src/testing.d.ts +6 -0
  158. package/dist/types/src/testing.d.ts.map +1 -0
  159. package/dist/types/src/toolkit.d.ts +3 -0
  160. package/dist/types/src/toolkit.d.ts.map +1 -0
  161. package/dist/types/src/translations.d.ts +4 -0
  162. package/dist/types/src/translations.d.ts.map +1 -1
  163. package/dist/types/src/types/Markdown.d.ts +8 -6
  164. package/dist/types/src/types/Markdown.d.ts.map +1 -1
  165. package/dist/types/src/types/MarkdownAction.d.ts +6 -14
  166. package/dist/types/src/types/MarkdownAction.d.ts.map +1 -1
  167. package/dist/types/src/types/index.d.ts.map +1 -1
  168. package/dist/types/src/types/types.d.ts.map +1 -1
  169. package/dist/types/src/util.d.ts +3 -3
  170. package/dist/types/src/util.d.ts.map +1 -1
  171. package/dist/types/tsconfig.tsbuildinfo +1 -1
  172. package/package.json +76 -57
  173. package/src/MarkdownPlugin.tsx +102 -95
  174. package/src/capabilities/anchor-sort.ts +3 -3
  175. package/src/capabilities/app-graph-serializer.ts +7 -7
  176. package/src/capabilities/artifact-definition.ts +17 -21
  177. package/src/capabilities/blueprint-definition.ts +43 -0
  178. package/src/capabilities/capabilities.ts +2 -1
  179. package/src/capabilities/index.ts +3 -2
  180. package/src/capabilities/intent-resolver.ts +15 -14
  181. package/src/capabilities/react-surface.tsx +46 -67
  182. package/src/capabilities/state.ts +3 -2
  183. package/src/components/{MarkdownPreview/MarkdownPreview.stories.tsx → MarkdownCard/MarkdownCard.stories.tsx} +17 -18
  184. package/src/components/MarkdownCard/MarkdownCard.tsx +89 -0
  185. package/src/components/MarkdownCard/index.ts +9 -0
  186. package/src/components/MarkdownContainer.stories.tsx +79 -43
  187. package/src/components/MarkdownContainer.tsx +79 -220
  188. package/src/components/MarkdownEditor/FileUpload.tsx +63 -0
  189. package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +57 -34
  190. package/src/components/MarkdownEditor/MarkdownEditor.tsx +221 -272
  191. package/src/components/MarkdownEditor/MarkdownEditorContent.tsx +136 -0
  192. package/src/components/MarkdownEditor/MarkdownEditorToolbar.tsx +63 -0
  193. package/src/components/MarkdownSettings/MarkdownSettings.tsx +77 -74
  194. package/src/components/Suggestions.stories.tsx +53 -48
  195. package/src/components/index.ts +3 -1
  196. package/src/functions/create.conversations.json +1 -0
  197. package/src/functions/create.test.ts +128 -0
  198. package/src/functions/create.ts +34 -0
  199. package/src/functions/index.ts +13 -0
  200. package/src/functions/open.ts +32 -0
  201. package/src/functions/update.conversations.json +1 -0
  202. package/src/functions/update.test.ts +151 -0
  203. package/src/functions/update.ts +37 -0
  204. package/src/hooks/index.ts +3 -0
  205. package/src/hooks/useEditorMenuOptions.ts +71 -0
  206. package/src/{extensions.tsx → hooks/useExtensions.tsx} +65 -114
  207. package/src/hooks/useLinkQuery.ts +83 -0
  208. package/src/hooks/useSelectCurrentThread.tsx +15 -5
  209. package/src/index.ts +3 -1
  210. package/src/meta.ts +3 -6
  211. package/src/testing.ts +27 -0
  212. package/src/toolkit.ts +6 -0
  213. package/src/translations.ts +4 -0
  214. package/src/types/Markdown.ts +10 -7
  215. package/src/types/MarkdownAction.ts +5 -6
  216. package/src/types/index.ts +1 -0
  217. package/src/types/types.ts +1 -0
  218. package/src/util.tsx +10 -5
  219. package/dist/lib/browser/MarkdownContainer-NNBPE6A5.mjs +0 -779
  220. package/dist/lib/browser/MarkdownContainer-NNBPE6A5.mjs.map +0 -7
  221. package/dist/lib/browser/MarkdownPreview-7VG3K24R.mjs +0 -80
  222. package/dist/lib/browser/MarkdownPreview-7VG3K24R.mjs.map +0 -7
  223. package/dist/lib/browser/anchor-sort-Z7JQA7RL.mjs.map +0 -7
  224. package/dist/lib/browser/app-graph-serializer-ZT5OVF5G.mjs.map +0 -7
  225. package/dist/lib/browser/artifact-definition-7VNP5PCP.mjs +0 -145
  226. package/dist/lib/browser/artifact-definition-7VNP5PCP.mjs.map +0 -7
  227. package/dist/lib/browser/chunk-K7ZFMSC4.mjs.map +0 -7
  228. package/dist/lib/browser/chunk-VCUKIILA.mjs +0 -20
  229. package/dist/lib/browser/chunk-VCUKIILA.mjs.map +0 -7
  230. package/dist/lib/browser/chunk-VMX5SDGW.mjs.map +0 -7
  231. package/dist/lib/browser/chunk-YHMGUSO7.mjs.map +0 -7
  232. package/dist/lib/browser/chunk-ZGY3DYC2.mjs.map +0 -7
  233. package/dist/lib/browser/intent-resolver-EBEF7WEI.mjs.map +0 -7
  234. package/dist/lib/browser/react-surface-ZPMZT4VU.mjs.map +0 -7
  235. package/dist/lib/browser/state-ZA6PZPUI.mjs.map +0 -7
  236. package/dist/lib/node-esm/MarkdownContainer-Q6UO7DKT.mjs +0 -780
  237. package/dist/lib/node-esm/MarkdownContainer-Q6UO7DKT.mjs.map +0 -7
  238. package/dist/lib/node-esm/MarkdownPreview-UVWR2YK3.mjs +0 -81
  239. package/dist/lib/node-esm/MarkdownPreview-UVWR2YK3.mjs.map +0 -7
  240. package/dist/lib/node-esm/anchor-sort-R6AAKYNG.mjs.map +0 -7
  241. package/dist/lib/node-esm/app-graph-serializer-X4M5QEI6.mjs.map +0 -7
  242. package/dist/lib/node-esm/artifact-definition-IRIILD7S.mjs +0 -146
  243. package/dist/lib/node-esm/artifact-definition-IRIILD7S.mjs.map +0 -7
  244. package/dist/lib/node-esm/chunk-6GCOJS4Y.mjs.map +0 -7
  245. package/dist/lib/node-esm/chunk-A7LLVI34.mjs +0 -22
  246. package/dist/lib/node-esm/chunk-A7LLVI34.mjs.map +0 -7
  247. package/dist/lib/node-esm/chunk-LZK3TLKM.mjs.map +0 -7
  248. package/dist/lib/node-esm/chunk-RCIXKCVG.mjs.map +0 -7
  249. package/dist/lib/node-esm/chunk-YGNVDYMB.mjs.map +0 -7
  250. package/dist/lib/node-esm/intent-resolver-L2UGZ72W.mjs.map +0 -7
  251. package/dist/lib/node-esm/react-surface-3JJSTTQP.mjs.map +0 -7
  252. package/dist/lib/node-esm/state-UIHO2SFZ.mjs.map +0 -7
  253. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.d.ts +0 -6
  254. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.d.ts.map +0 -1
  255. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts +0 -10
  256. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts.map +0 -1
  257. package/dist/types/src/components/MarkdownPreview/index.d.ts +0 -4
  258. package/dist/types/src/components/MarkdownPreview/index.d.ts.map +0 -1
  259. package/dist/types/src/components/Toolbar.stories.d.ts +0 -11
  260. package/dist/types/src/components/Toolbar.stories.d.ts.map +0 -1
  261. package/dist/types/src/extensions.d.ts +0 -24
  262. package/dist/types/src/extensions.d.ts.map +0 -1
  263. package/src/components/MarkdownPreview/MarkdownPreview.tsx +0 -73
  264. package/src/components/MarkdownPreview/index.ts +0 -9
  265. package/src/components/Toolbar.stories.tsx +0 -112
@@ -0,0 +1,63 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type EditorView } from '@codemirror/view';
6
+ import React, { useCallback, useState } from 'react';
7
+
8
+ import { type FileInfo } from '@dxos/app-framework';
9
+ import { invariant } from '@dxos/invariant';
10
+ import { type ThemedClassName } from '@dxos/react-ui';
11
+ import { EditorToolbar, type EditorToolbarProps, type EditorViewMode } from '@dxos/react-ui-editor';
12
+
13
+ import { FileUpload, type FileUploadAction } from './FileUpload';
14
+
15
+ export type MarkdownEditorToolbarProps = ThemedClassName<
16
+ {
17
+ id: string;
18
+ editorView?: EditorView;
19
+ onFileUpload?: (file: File) => Promise<FileInfo | undefined>;
20
+ } & Pick<EditorToolbarProps, 'role' | 'state' | 'customActions' | 'onViewModeChange'>
21
+ >;
22
+
23
+ export const MarkdownEditorToolbar = ({
24
+ classNames,
25
+ id,
26
+ role,
27
+ state,
28
+ editorView,
29
+ customActions,
30
+ onFileUpload,
31
+ onViewModeChange,
32
+ }: MarkdownEditorToolbarProps) => {
33
+ const [upload, setUpload] = useState<FileUploadAction | null>(null);
34
+ const uploadRef = useCallback((next: FileUploadAction) => setUpload(() => next), []);
35
+
36
+ const handleViewModeChange = useCallback((mode: EditorViewMode) => onViewModeChange?.(mode), [onViewModeChange]);
37
+
38
+ const getView = useCallback(() => {
39
+ invariant(editorView);
40
+ return editorView;
41
+ }, [editorView]);
42
+
43
+ if (!editorView) {
44
+ return <div />;
45
+ }
46
+
47
+ return (
48
+ <>
49
+ <EditorToolbar
50
+ classNames={classNames}
51
+ attendableId={id}
52
+ role={role}
53
+ state={state}
54
+ customActions={customActions}
55
+ getView={getView}
56
+ onImageUpload={upload ?? undefined}
57
+ onViewModeChange={handleViewModeChange}
58
+ />
59
+
60
+ {onFileUpload && <FileUpload ref={uploadRef} editorView={editorView} onFileUpload={onFileUpload} />}
61
+ </>
62
+ );
63
+ };
@@ -6,7 +6,7 @@ import React from 'react';
6
6
 
7
7
  import { Input, Select, useTranslation } from '@dxos/react-ui';
8
8
  import { type EditorInputMode, EditorInputModes, type EditorViewMode, EditorViewModes } from '@dxos/react-ui-editor';
9
- import { DeprecatedFormContainer, DeprecatedFormInput } from '@dxos/react-ui-form';
9
+ import { ControlGroup, ControlItemInput, ControlPage, ControlSection } from '@dxos/react-ui-form';
10
10
 
11
11
  import { meta } from '../../meta';
12
12
  import { type Markdown } from '../../types';
@@ -16,90 +16,93 @@ export const MarkdownSettings = ({ settings }: { settings: Markdown.Settings })
16
16
 
17
17
  // TODO(wittjosiah): Add skill test confirmation for entering vim mode.
18
18
  return (
19
- <DeprecatedFormContainer>
20
- <DeprecatedFormInput label={t('default view mode label')}>
21
- <Select.Root
22
- value={settings.defaultViewMode}
23
- onValueChange={(value) => {
24
- settings.defaultViewMode = value as EditorViewMode;
25
- }}
26
- >
27
- <Select.TriggerButton />
28
- <Select.Portal>
29
- <Select.Content>
30
- <Select.Viewport>
31
- {EditorViewModes.map((mode) => (
32
- <Select.Option key={mode} value={mode}>
33
- {t(`${mode} mode label`, { ns: 'react-ui-editor' })}
34
- </Select.Option>
35
- ))}
36
- </Select.Viewport>
37
- </Select.Content>
38
- </Select.Portal>
39
- </Select.Root>
40
- </DeprecatedFormInput>
19
+ <ControlPage>
20
+ <ControlSection title={t('settings title', { ns: meta.id })}>
21
+ <ControlGroup>
22
+ <ControlItemInput title={t('default view mode label')}>
23
+ <Select.Root
24
+ value={settings.defaultViewMode}
25
+ onValueChange={(value) => {
26
+ settings.defaultViewMode = value as EditorViewMode;
27
+ }}
28
+ >
29
+ <Select.TriggerButton />
30
+ <Select.Portal>
31
+ <Select.Content>
32
+ <Select.Viewport>
33
+ {EditorViewModes.map((mode) => (
34
+ <Select.Option key={mode} value={mode}>
35
+ {t(`${mode} mode label`, { ns: 'react-ui-editor' })}
36
+ </Select.Option>
37
+ ))}
38
+ </Select.Viewport>
39
+ <Select.Arrow />
40
+ </Select.Content>
41
+ </Select.Portal>
42
+ </Select.Root>
43
+ </ControlItemInput>
41
44
 
42
- <DeprecatedFormInput label={t('editor input mode label')}>
43
- <Select.Root
44
- value={settings.editorInputMode ?? 'default'}
45
- onValueChange={(value) => {
46
- settings.editorInputMode = value as EditorInputMode;
47
- }}
48
- >
49
- <Select.TriggerButton placeholder={t('select editor input mode placeholder')} />
50
- <Select.Portal>
51
- <Select.Content>
52
- <Select.Viewport>
53
- {EditorInputModes.map((mode) => (
54
- <Select.Option key={mode} value={mode}>
55
- {t(`settings editor input mode ${mode} label`)}
56
- </Select.Option>
57
- ))}
58
- </Select.Viewport>
59
- </Select.Content>
60
- </Select.Portal>
61
- </Select.Root>
62
- </DeprecatedFormInput>
45
+ <ControlItemInput title={t('editor input mode label')}>
46
+ <Select.Root
47
+ value={settings.editorInputMode ?? 'default'}
48
+ onValueChange={(value) => {
49
+ settings.editorInputMode = value as EditorInputMode;
50
+ }}
51
+ >
52
+ <Select.TriggerButton placeholder={t('select editor input mode placeholder')} />
53
+ <Select.Portal>
54
+ <Select.Content>
55
+ <Select.Viewport>
56
+ {EditorInputModes.map((mode) => (
57
+ <Select.Option key={mode} value={mode}>
58
+ {t(`settings editor input mode ${mode} label`)}
59
+ </Select.Option>
60
+ ))}
61
+ </Select.Viewport>
62
+ <Select.Arrow />
63
+ </Select.Content>
64
+ </Select.Portal>
65
+ </Select.Root>
66
+ </ControlItemInput>
63
67
 
64
- <DeprecatedFormInput label={t('settings toolbar label')}>
65
- <Input.Switch checked={settings.toolbar} onCheckedChange={(checked) => (settings.toolbar = !!checked)} />
66
- </DeprecatedFormInput>
68
+ <ControlItemInput title={t('settings toolbar label')}>
69
+ <Input.Switch checked={settings.toolbar} onCheckedChange={(checked) => (settings.toolbar = !!checked)} />
70
+ </ControlItemInput>
67
71
 
68
- <DeprecatedFormInput label={t('settings numbered headings label')}>
69
- <Input.Switch
70
- checked={settings.numberedHeadings}
71
- onCheckedChange={(checked) => (settings.numberedHeadings = !!checked)}
72
- />
73
- </DeprecatedFormInput>
72
+ <ControlItemInput title={t('settings numbered headings label')}>
73
+ <Input.Switch
74
+ checked={settings.numberedHeadings}
75
+ onCheckedChange={(checked) => (settings.numberedHeadings = !!checked)}
76
+ />
77
+ </ControlItemInput>
74
78
 
75
- <DeprecatedFormInput label={t('settings folding label')}>
76
- <Input.Switch checked={settings.folding} onCheckedChange={(checked) => (settings.folding = !!checked)} />
77
- </DeprecatedFormInput>
79
+ <ControlItemInput title={t('settings folding label')}>
80
+ <Input.Switch checked={settings.folding} onCheckedChange={(checked) => (settings.folding = !!checked)} />
81
+ </ControlItemInput>
78
82
 
79
- <DeprecatedFormInput label={t('settings experimental label')}>
80
- <Input.Switch
81
- checked={settings.experimental}
82
- onCheckedChange={(checked) => (settings.experimental = !!checked)}
83
- />
84
- </DeprecatedFormInput>
83
+ <ControlItemInput title={t('settings experimental label')}>
84
+ <Input.Switch
85
+ checked={settings.experimental}
86
+ onCheckedChange={(checked) => (settings.experimental = !!checked)}
87
+ />
88
+ </ControlItemInput>
85
89
 
86
- <DeprecatedFormInput
87
- label={t('settings debug label')}
88
- secondary={
89
- settings.debug ? (
90
- <Input.Root>
90
+ <ControlItemInput title={t('settings debug label')}>
91
+ <Input.Switch checked={settings.debug} onCheckedChange={(checked) => (settings.debug = !!checked)} />
92
+ </ControlItemInput>
93
+
94
+ {settings.debug && (
95
+ <ControlItemInput title={t('settings debug textarea label', { ns: meta.id })}>
91
96
  <Input.TextArea
92
97
  rows={5}
93
98
  value={settings.typewriter}
94
99
  onChange={({ target: { value } }) => (settings.typewriter = value)}
95
100
  placeholder={t('settings debug placeholder')}
96
101
  />
97
- </Input.Root>
98
- ) : undefined
99
- }
100
- >
101
- <Input.Switch checked={settings.debug} onCheckedChange={(checked) => (settings.debug = !!checked)} />
102
- </DeprecatedFormInput>
103
- </DeprecatedFormContainer>
102
+ </ControlItemInput>
103
+ )}
104
+ </ControlGroup>
105
+ </ControlSection>
106
+ </ControlPage>
104
107
  );
105
108
  };
@@ -2,47 +2,42 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { type Meta } from '@storybook/react-vite';
8
- import { Match, Option, pipe, Schema } from 'effect';
6
+ import * as Function from 'effect/Function';
7
+ import * as Match from 'effect/Match';
8
+ import * as Option from 'effect/Option';
9
+ import * as Schema from 'effect/Schema';
9
10
  import React, { type FC, useEffect, useMemo, useState } from 'react';
10
11
 
11
- import {
12
- Capabilities,
13
- CollaborationActions,
14
- IntentPlugin,
15
- SettingsPlugin,
16
- contributes,
17
- createIntent,
18
- useCapability,
19
- useIntentDispatcher,
20
- } from '@dxos/app-framework';
12
+ import { Capabilities, IntentPlugin, SettingsPlugin } from '@dxos/app-framework';
13
+ import { useCapability, useIntentDispatcher } from '@dxos/app-framework/react';
21
14
  import { withPluginManager } from '@dxos/app-framework/testing';
22
15
  import { Obj, Ref, Type } from '@dxos/echo';
23
16
  import { invariant } from '@dxos/invariant';
24
- import { DXN } from '@dxos/keys';
25
17
  import { ClientPlugin } from '@dxos/plugin-client';
18
+ import { GraphPlugin } from '@dxos/plugin-graph';
26
19
  import { PreviewPlugin } from '@dxos/plugin-preview';
27
20
  import { SpacePlugin } from '@dxos/plugin-space';
28
21
  import { StorybookLayoutPlugin } from '@dxos/plugin-storybook-layout';
29
22
  import { ThemePlugin } from '@dxos/plugin-theme';
30
23
  import { faker } from '@dxos/random';
31
- import { createDocAccessor, fullyQualifiedId, toCursorRange, useQueue, useSpace } from '@dxos/react-client/echo';
24
+ import { createDocAccessor, toCursorRange, useQueue, useSpace } from '@dxos/react-client/echo';
32
25
  import { IconButton, Toolbar } from '@dxos/react-ui';
33
- import { command, type EditorSelection, type Range, useTextEditor } from '@dxos/react-ui-editor';
26
+ import { withTheme } from '@dxos/react-ui/testing';
27
+ import { type EditorSelection, type Range, useTextEditor } from '@dxos/react-ui-editor';
34
28
  import { StackItem } from '@dxos/react-ui-stack';
35
29
  import { defaultTx } from '@dxos/react-ui-theme';
36
- import { DataType } from '@dxos/schema';
37
- import { withLayout } from '@dxos/storybook-utils';
30
+ import { render } from '@dxos/storybook-utils';
31
+ import { Message } from '@dxos/types';
38
32
 
39
- import { MarkdownContainer } from './MarkdownContainer';
40
- import { MarkdownPlugin } from '../MarkdownPlugin';
41
33
  import { MarkdownCapabilities } from '../capabilities';
34
+ import { MarkdownPlugin } from '../MarkdownPlugin';
42
35
  import { meta } from '../meta';
43
36
  import { translations } from '../translations';
44
37
  import { Markdown } from '../types';
45
38
 
39
+ import { MarkdownContainer } from './MarkdownContainer';
40
+
46
41
  faker.seed(1);
47
42
 
48
43
  const TestItem = Schema.Struct({
@@ -68,13 +63,13 @@ const TestChat: FC<{ doc: Markdown.Document; content: string }> = ({ doc, conten
68
63
 
69
64
  const space = useSpace();
70
65
  const queueDxn = useMemo(() => space && space.queues.create().dxn, [space]);
71
- const queue = useQueue<DataType.Message>(queueDxn);
66
+ const queue = useQueue<Message.Message>(queueDxn);
72
67
 
73
68
  const handleInsert = async () => {
74
69
  invariant(space);
75
70
  invariant(queue);
76
71
  await queue.append([
77
- Obj.make(DataType.Message, {
72
+ Obj.make(Message.Message, {
78
73
  created: new Date().toISOString(),
79
74
  sender: { role: 'assistant' },
80
75
  blocks: [{ _tag: 'text', text: 'Hello' }],
@@ -85,8 +80,8 @@ const TestChat: FC<{ doc: Markdown.Document; content: string }> = ({ doc, conten
85
80
 
86
81
  const text = await doc.content.load();
87
82
  const accessor = createDocAccessor(text, ['content']);
88
- const cursor = pipe(
89
- editorState.getState(fullyQualifiedId(doc))?.selection,
83
+ const cursor = Function.pipe(
84
+ editorState.getState(Obj.getDXN(doc).toString())?.selection,
90
85
  Option.fromNullable,
91
86
  Option.map(selectionToRange),
92
87
  Option.map((range) => toCursorRange(accessor, range.from, range.to)),
@@ -98,14 +93,14 @@ const TestChat: FC<{ doc: Markdown.Document; content: string }> = ({ doc, conten
98
93
  // const message = deref(ref);
99
94
  // }
100
95
 
101
- void dispatch(
102
- createIntent(CollaborationActions.InsertContent, {
103
- target: doc as any as Type.Expando,
104
- object: Ref.fromDXN(new DXN(DXN.kind.QUEUE, [...queue.dxn.parts, message.id])),
105
- at: cursor,
106
- label: 'Proposal',
107
- }),
108
- );
96
+ // void dispatch(
97
+ // createIntent(CollaborationActions.InsertContent, {
98
+ // target: doc as any as Type.Expando,
99
+ // object: Ref.fromDXN(new DXN(DXN.kind.QUEUE, [...queue.dxn.parts, message.id])),
100
+ // at: cursor,
101
+ // label: 'Proposal',
102
+ // }),
103
+ // );
109
104
  };
110
105
 
111
106
  return (
@@ -130,12 +125,17 @@ const DefaultStory = ({ document, chat }: { document: string; chat: string }) =>
130
125
  }
131
126
 
132
127
  const doc = space.db.add(
133
- Markdown.makeDocument({
128
+ Markdown.make({
134
129
  name: 'Test',
135
130
  content: document.replaceAll(/\[(\w+)\]/g, (_, label) => {
136
- const obj = space.db.add(Obj.make(TestItem, { title: label, description: faker.lorem.paragraph() }));
131
+ const obj = space.db.add(
132
+ Obj.make(TestItem, {
133
+ title: label,
134
+ description: faker.lorem.paragraph(),
135
+ }),
136
+ );
137
137
  const dxn = Ref.make(obj).dxn.toString();
138
- return `[${label}][${dxn}]`;
138
+ return `[${label}](${dxn})`;
139
139
  }),
140
140
  }),
141
141
  );
@@ -144,45 +144,50 @@ const DefaultStory = ({ document, chat }: { document: string; chat: string }) =>
144
144
  }, [space]);
145
145
 
146
146
  if (!space || !doc) {
147
- return <></>;
147
+ return null;
148
148
  }
149
149
 
150
+ // TODO(burdon): Layout issue.
150
151
  return (
151
- <>
152
+ <div className='grid grid-cols-2 bs-full overflow-hidden'>
152
153
  <MarkdownContainer id={doc.id} object={doc} settings={settings} editorStateStore={editorState} />
153
154
  <TestChat doc={doc} content={chat} />
154
- </>
155
+ </div>
155
156
  );
156
157
  };
157
158
 
158
- // TODO(burdon): Make consistent.
159
159
  const storybook: Meta<typeof DefaultStory> = {
160
160
  title: 'plugins/plugin-markdown/Suggestions',
161
- render: DefaultStory,
161
+ render: render(DefaultStory),
162
162
  decorators: [
163
+ withTheme,
163
164
  withPluginManager({
164
165
  plugins: [
165
- ThemePlugin({ tx: defaultTx }),
166
- StorybookLayoutPlugin(),
167
166
  ClientPlugin({
168
167
  types: [Markdown.Document, TestItem],
169
- onClientInitialized: async (_, client) => {
168
+ onClientInitialized: async ({ client }) => {
170
169
  await client.halo.createIdentity();
171
170
  },
172
171
  }),
173
- SpacePlugin(),
174
- SettingsPlugin(),
172
+ SpacePlugin({}),
173
+ GraphPlugin(),
175
174
  IntentPlugin(),
175
+ SettingsPlugin(),
176
+
177
+ // UI
178
+ ThemePlugin({ tx: defaultTx }),
176
179
  MarkdownPlugin(),
177
180
  PreviewPlugin(),
181
+ StorybookLayoutPlugin({}),
178
182
  ],
179
- capabilities: [contributes(MarkdownCapabilities.Extensions, [() => command()])],
180
183
  }),
181
- withLayout({ fullscreen: true, classNames: 'grid grid-cols-2' }),
182
184
  ],
183
185
  parameters: {
186
+ layout: 'fullscreen',
187
+ controls: {
188
+ disable: true,
189
+ },
184
190
  translations,
185
- controls: { disable: true },
186
191
  },
187
192
  };
188
193
 
@@ -4,7 +4,9 @@
4
4
 
5
5
  import { lazy } from 'react';
6
6
 
7
+ export * from './MarkdownCard';
8
+ export * from './MarkdownContainer';
7
9
  export * from './MarkdownSettings';
8
10
 
11
+ export const MarkdownCard = lazy(() => import('./MarkdownCard'));
9
12
  export const MarkdownContainer = lazy(() => import('./MarkdownContainer'));
10
- export const MarkdownPreview = lazy(() => import('./MarkdownPreview'));