@dxos/plugin-markdown 0.8.4-main.5acf9ea → 0.8.4-main.66e292d

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-TC3GGUSX.mjs +12 -0
  2. package/dist/lib/browser/MarkdownCard-TC3GGUSX.mjs.map +7 -0
  3. package/dist/lib/browser/MarkdownContainer-YF22DV4M.mjs +15 -0
  4. package/dist/lib/browser/MarkdownContainer-YF22DV4M.mjs.map +7 -0
  5. package/dist/lib/browser/{anchor-sort-Z7JQA7RL.mjs → anchor-sort-3MYLO74J.mjs} +10 -10
  6. package/dist/lib/browser/anchor-sort-3MYLO74J.mjs.map +7 -0
  7. package/dist/lib/browser/{app-graph-serializer-ZT5OVF5G.mjs → app-graph-serializer-BZJ4TQOE.mjs} +11 -12
  8. package/dist/lib/browser/app-graph-serializer-BZJ4TQOE.mjs.map +7 -0
  9. package/dist/lib/browser/blueprint-definition-HED54GGW.mjs +13 -0
  10. package/dist/lib/browser/blueprint-definition-HED54GGW.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-3IPVL3E4.mjs +20 -0
  12. package/dist/lib/browser/chunk-3IPVL3E4.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-BE3IO2CM.mjs +150 -0
  14. package/dist/lib/browser/chunk-BE3IO2CM.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-YHMGUSO7.mjs → chunk-CN35HEBX.mjs} +16 -17
  18. package/dist/lib/browser/chunk-CN35HEBX.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-DLZ5RR3P.mjs +96 -0
  20. package/dist/lib/browser/chunk-DLZ5RR3P.mjs.map +7 -0
  21. package/dist/lib/browser/{chunk-CD4E4K7J.mjs → chunk-IBCHVMZW.mjs} +2 -2
  22. package/dist/lib/browser/{chunk-CD4E4K7J.mjs.map → chunk-IBCHVMZW.mjs.map} +2 -2
  23. package/dist/lib/browser/{chunk-K7ZFMSC4.mjs → chunk-NXT2E2BG.mjs} +10 -5
  24. package/dist/lib/browser/chunk-NXT2E2BG.mjs.map +7 -0
  25. package/dist/lib/browser/{chunk-VMX5SDGW.mjs → chunk-OKNQ57GF.mjs} +9 -8
  26. package/dist/lib/browser/chunk-OKNQ57GF.mjs.map +7 -0
  27. package/dist/lib/browser/chunk-V7P7EIWG.mjs +829 -0
  28. package/dist/lib/browser/chunk-V7P7EIWG.mjs.map +7 -0
  29. package/dist/lib/browser/index.mjs +32 -34
  30. package/dist/lib/browser/index.mjs.map +3 -3
  31. package/dist/lib/browser/{intent-resolver-EBEF7WEI.mjs → intent-resolver-55ASQRIW.mjs} +22 -20
  32. package/dist/lib/browser/intent-resolver-55ASQRIW.mjs.map +7 -0
  33. package/dist/lib/browser/meta.json +1 -1
  34. package/dist/lib/browser/{react-surface-ZPMZT4VU.mjs → react-surface-GPD6T435.mjs} +89 -86
  35. package/dist/lib/browser/react-surface-GPD6T435.mjs.map +7 -0
  36. package/dist/lib/browser/{settings-MBDK4TWE.mjs → settings-G3ZOXJQY.mjs} +5 -5
  37. package/dist/lib/browser/{settings-MBDK4TWE.mjs.map → settings-G3ZOXJQY.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-FTEHVH7P.mjs +13 -0
  44. package/dist/lib/node-esm/MarkdownCard-FTEHVH7P.mjs.map +7 -0
  45. package/dist/lib/node-esm/MarkdownContainer-L75AIJFM.mjs +16 -0
  46. package/dist/lib/node-esm/MarkdownContainer-L75AIJFM.mjs.map +7 -0
  47. package/dist/lib/node-esm/{anchor-sort-R6AAKYNG.mjs → anchor-sort-W4HCTYUQ.mjs} +10 -10
  48. package/dist/lib/node-esm/anchor-sort-W4HCTYUQ.mjs.map +7 -0
  49. package/dist/lib/node-esm/{app-graph-serializer-X4M5QEI6.mjs → app-graph-serializer-OCTHXWLF.mjs} +11 -12
  50. package/dist/lib/node-esm/app-graph-serializer-OCTHXWLF.mjs.map +7 -0
  51. package/dist/lib/node-esm/blueprint-definition-HAQGJOMQ.mjs +14 -0
  52. package/dist/lib/node-esm/blueprint-definition-HAQGJOMQ.mjs.map +7 -0
  53. package/dist/lib/node-esm/chunk-3DN4DPVA.mjs +151 -0
  54. package/dist/lib/node-esm/chunk-3DN4DPVA.mjs.map +7 -0
  55. package/dist/lib/node-esm/{chunk-LZK3TLKM.mjs → chunk-7GN66TDQ.mjs} +9 -8
  56. package/dist/lib/node-esm/chunk-7GN66TDQ.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-YGNVDYMB.mjs → chunk-I5JSQBPI.mjs} +10 -5
  60. package/dist/lib/node-esm/chunk-I5JSQBPI.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-RCIXKCVG.mjs → chunk-SHAMSMKQ.mjs} +5 -7
  62. package/dist/lib/node-esm/chunk-SHAMSMKQ.mjs.map +7 -0
  63. package/dist/lib/node-esm/chunk-TYUGABTD.mjs +22 -0
  64. package/dist/lib/node-esm/chunk-TYUGABTD.mjs.map +7 -0
  65. package/dist/lib/node-esm/chunk-UVLACSAE.mjs +830 -0
  66. package/dist/lib/node-esm/chunk-UVLACSAE.mjs.map +7 -0
  67. package/dist/lib/node-esm/{chunk-6GCOJS4Y.mjs → chunk-YFRTKXTB.mjs} +16 -17
  68. package/dist/lib/node-esm/chunk-YFRTKXTB.mjs.map +7 -0
  69. package/dist/lib/node-esm/chunk-ZNS55FS3.mjs +97 -0
  70. package/dist/lib/node-esm/chunk-ZNS55FS3.mjs.map +7 -0
  71. package/dist/lib/node-esm/index.mjs +32 -34
  72. package/dist/lib/node-esm/index.mjs.map +3 -3
  73. package/dist/lib/node-esm/{intent-resolver-L2UGZ72W.mjs → intent-resolver-DTBVWCNO.mjs} +22 -20
  74. package/dist/lib/node-esm/intent-resolver-DTBVWCNO.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-QWG7CJ5U.mjs} +89 -86
  77. package/dist/lib/node-esm/react-surface-QWG7CJ5U.mjs.map +7 -0
  78. package/dist/lib/node-esm/{settings-LBDWWPZJ.mjs → settings-IBFFCGNL.mjs} +5 -5
  79. package/dist/lib/node-esm/{settings-LBDWWPZJ.mjs.map → settings-IBFFCGNL.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 +55 -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 +5 -0
  162. package/dist/types/src/translations.d.ts.map +1 -1
  163. package/dist/types/src/types/Markdown.d.ts +11 -9
  164. package/dist/types/src/types/Markdown.d.ts.map +1 -1
  165. package/dist/types/src/types/MarkdownAction.d.ts +7 -15
  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 +90 -99
  174. package/src/capabilities/anchor-sort.ts +7 -6
  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 +16 -15
  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 +54 -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} +66 -115
  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 +5 -0
  214. package/src/types/Markdown.ts +9 -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,43 @@
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';
16
+ import { createDocAccessor, toCursorRange } from '@dxos/echo-db';
23
17
  import { invariant } from '@dxos/invariant';
24
- import { DXN } from '@dxos/keys';
25
18
  import { ClientPlugin } from '@dxos/plugin-client';
19
+ import { GraphPlugin } from '@dxos/plugin-graph';
26
20
  import { PreviewPlugin } from '@dxos/plugin-preview';
27
21
  import { SpacePlugin } from '@dxos/plugin-space';
28
22
  import { StorybookLayoutPlugin } from '@dxos/plugin-storybook-layout';
29
23
  import { ThemePlugin } from '@dxos/plugin-theme';
30
24
  import { faker } from '@dxos/random';
31
- import { createDocAccessor, fullyQualifiedId, toCursorRange, useQueue, useSpace } from '@dxos/react-client/echo';
25
+ import { useQueue, useSpace } from '@dxos/react-client/echo';
32
26
  import { IconButton, Toolbar } from '@dxos/react-ui';
33
- import { command, type EditorSelection, type Range, useTextEditor } from '@dxos/react-ui-editor';
27
+ import { withTheme } from '@dxos/react-ui/testing';
28
+ import { type EditorSelection, type Range, useTextEditor } from '@dxos/react-ui-editor';
34
29
  import { StackItem } from '@dxos/react-ui-stack';
35
30
  import { defaultTx } from '@dxos/react-ui-theme';
36
- import { DataType } from '@dxos/schema';
37
- import { withLayout } from '@dxos/storybook-utils';
31
+ import { render } from '@dxos/storybook-utils';
32
+ import { Message } from '@dxos/types';
38
33
 
39
- import { MarkdownContainer } from './MarkdownContainer';
40
- import { MarkdownPlugin } from '../MarkdownPlugin';
41
34
  import { MarkdownCapabilities } from '../capabilities';
35
+ import { MarkdownPlugin } from '../MarkdownPlugin';
42
36
  import { meta } from '../meta';
43
37
  import { translations } from '../translations';
44
38
  import { Markdown } from '../types';
45
39
 
40
+ import { MarkdownContainer } from './MarkdownContainer';
41
+
46
42
  faker.seed(1);
47
43
 
48
44
  const TestItem = Schema.Struct({
@@ -68,13 +64,13 @@ const TestChat: FC<{ doc: Markdown.Document; content: string }> = ({ doc, conten
68
64
 
69
65
  const space = useSpace();
70
66
  const queueDxn = useMemo(() => space && space.queues.create().dxn, [space]);
71
- const queue = useQueue<DataType.Message>(queueDxn);
67
+ const queue = useQueue<Message.Message>(queueDxn);
72
68
 
73
69
  const handleInsert = async () => {
74
70
  invariant(space);
75
71
  invariant(queue);
76
72
  await queue.append([
77
- Obj.make(DataType.Message, {
73
+ Obj.make(Message.Message, {
78
74
  created: new Date().toISOString(),
79
75
  sender: { role: 'assistant' },
80
76
  blocks: [{ _tag: 'text', text: 'Hello' }],
@@ -85,8 +81,8 @@ const TestChat: FC<{ doc: Markdown.Document; content: string }> = ({ doc, conten
85
81
 
86
82
  const text = await doc.content.load();
87
83
  const accessor = createDocAccessor(text, ['content']);
88
- const cursor = pipe(
89
- editorState.getState(fullyQualifiedId(doc))?.selection,
84
+ const cursor = Function.pipe(
85
+ editorState.getState(Obj.getDXN(doc).toString())?.selection,
90
86
  Option.fromNullable,
91
87
  Option.map(selectionToRange),
92
88
  Option.map((range) => toCursorRange(accessor, range.from, range.to)),
@@ -98,14 +94,14 @@ const TestChat: FC<{ doc: Markdown.Document; content: string }> = ({ doc, conten
98
94
  // const message = deref(ref);
99
95
  // }
100
96
 
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
- );
97
+ // void dispatch(
98
+ // createIntent(CollaborationActions.InsertContent, {
99
+ // target: doc as any as Type.Expando,
100
+ // object: Ref.fromDXN(new DXN(DXN.kind.QUEUE, [...queue.dxn.parts, message.id])),
101
+ // at: cursor,
102
+ // label: 'Proposal',
103
+ // }),
104
+ // );
109
105
  };
110
106
 
111
107
  return (
@@ -130,12 +126,17 @@ const DefaultStory = ({ document, chat }: { document: string; chat: string }) =>
130
126
  }
131
127
 
132
128
  const doc = space.db.add(
133
- Markdown.makeDocument({
129
+ Markdown.make({
134
130
  name: 'Test',
135
131
  content: document.replaceAll(/\[(\w+)\]/g, (_, label) => {
136
- const obj = space.db.add(Obj.make(TestItem, { title: label, description: faker.lorem.paragraph() }));
132
+ const obj = space.db.add(
133
+ Obj.make(TestItem, {
134
+ title: label,
135
+ description: faker.lorem.paragraph(),
136
+ }),
137
+ );
137
138
  const dxn = Ref.make(obj).dxn.toString();
138
- return `[${label}][${dxn}]`;
139
+ return `[${label}](${dxn})`;
139
140
  }),
140
141
  }),
141
142
  );
@@ -144,45 +145,50 @@ const DefaultStory = ({ document, chat }: { document: string; chat: string }) =>
144
145
  }, [space]);
145
146
 
146
147
  if (!space || !doc) {
147
- return <></>;
148
+ return null;
148
149
  }
149
150
 
151
+ // TODO(burdon): Layout issue.
150
152
  return (
151
- <>
153
+ <div className='grid grid-cols-2 bs-full overflow-hidden'>
152
154
  <MarkdownContainer id={doc.id} object={doc} settings={settings} editorStateStore={editorState} />
153
155
  <TestChat doc={doc} content={chat} />
154
- </>
156
+ </div>
155
157
  );
156
158
  };
157
159
 
158
- // TODO(burdon): Make consistent.
159
160
  const storybook: Meta<typeof DefaultStory> = {
160
161
  title: 'plugins/plugin-markdown/Suggestions',
161
- render: DefaultStory,
162
+ render: render(DefaultStory),
162
163
  decorators: [
164
+ withTheme,
163
165
  withPluginManager({
164
166
  plugins: [
165
- ThemePlugin({ tx: defaultTx }),
166
- StorybookLayoutPlugin(),
167
167
  ClientPlugin({
168
168
  types: [Markdown.Document, TestItem],
169
- onClientInitialized: async (_, client) => {
169
+ onClientInitialized: async ({ client }) => {
170
170
  await client.halo.createIdentity();
171
171
  },
172
172
  }),
173
- SpacePlugin(),
174
- SettingsPlugin(),
173
+ SpacePlugin({}),
174
+ GraphPlugin(),
175
175
  IntentPlugin(),
176
+ SettingsPlugin(),
177
+
178
+ // UI
179
+ ThemePlugin({ tx: defaultTx }),
176
180
  MarkdownPlugin(),
177
181
  PreviewPlugin(),
182
+ StorybookLayoutPlugin({}),
178
183
  ],
179
- capabilities: [contributes(MarkdownCapabilities.Extensions, [() => command()])],
180
184
  }),
181
- withLayout({ fullscreen: true, classNames: 'grid grid-cols-2' }),
182
185
  ],
183
186
  parameters: {
187
+ layout: 'fullscreen',
188
+ controls: {
189
+ disable: true,
190
+ },
184
191
  translations,
185
- controls: { disable: true },
186
192
  },
187
193
  };
188
194
 
@@ -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'));