@dxos/plugin-markdown 0.8.3 → 0.8.4-main.1f223c7

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 (271) hide show
  1. package/dist/lib/browser/{MarkdownPreview-F4PYFW5L.mjs → MarkdownCard-JLUQITYK.mjs} +18 -18
  2. package/dist/lib/browser/MarkdownCard-JLUQITYK.mjs.map +7 -0
  3. package/dist/lib/browser/{MarkdownContainer-EFWQ6DHD.mjs → MarkdownContainer-HMPNQMNG.mjs} +277 -296
  4. package/dist/lib/browser/MarkdownContainer-HMPNQMNG.mjs.map +7 -0
  5. package/dist/lib/browser/{anchor-sort-BMAN2ABT.mjs → anchor-sort-E33BSTYF.mjs} +6 -6
  6. package/dist/lib/browser/anchor-sort-E33BSTYF.mjs.map +7 -0
  7. package/dist/lib/browser/{app-graph-serializer-EI6TEHRQ.mjs → app-graph-serializer-OX62DNPT.mjs} +14 -15
  8. package/dist/lib/browser/app-graph-serializer-OX62DNPT.mjs.map +7 -0
  9. package/dist/lib/browser/blueprint-definition-5YKFUHRU.mjs +11 -0
  10. package/dist/lib/browser/blueprint-definition-5YKFUHRU.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-BEE7VQPU.mjs +78 -0
  12. package/dist/lib/browser/chunk-BEE7VQPU.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-F6JJLKLN.mjs +102 -0
  14. package/dist/lib/browser/chunk-F6JJLKLN.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-LXSRQPEP.mjs → chunk-LAVZ2W6X.mjs} +9 -10
  16. package/dist/lib/browser/chunk-LAVZ2W6X.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-ODB2PTBP.mjs +28 -0
  18. package/dist/lib/browser/chunk-ODB2PTBP.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-OY6CGPOO.mjs +16 -0
  20. package/dist/lib/browser/chunk-OY6CGPOO.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-XE66SH4O.mjs +22 -0
  22. package/dist/lib/browser/chunk-XE66SH4O.mjs.map +7 -0
  23. package/dist/lib/browser/{chunk-D767LUGU.mjs → chunk-Z7P6JGGW.mjs} +14 -12
  24. package/dist/lib/browser/chunk-Z7P6JGGW.mjs.map +7 -0
  25. package/dist/lib/browser/index.mjs +38 -25
  26. package/dist/lib/browser/index.mjs.map +3 -3
  27. package/dist/lib/browser/intent-resolver-WDDH56JC.mjs +62 -0
  28. package/dist/lib/browser/intent-resolver-WDDH56JC.mjs.map +7 -0
  29. package/dist/lib/browser/meta.json +1 -1
  30. package/dist/lib/browser/{react-surface-4B5ELMEW.mjs → react-surface-NY5K2I5R.mjs} +62 -52
  31. package/dist/lib/browser/react-surface-NY5K2I5R.mjs.map +7 -0
  32. package/dist/lib/browser/{settings-PLH54VC7.mjs → settings-AABBTB4Q.mjs} +6 -6
  33. package/dist/lib/browser/settings-AABBTB4Q.mjs.map +7 -0
  34. package/dist/lib/browser/{state-KI6PJ6DT.mjs → state-FTHQQX7V.mjs} +8 -8
  35. package/dist/lib/browser/state-FTHQQX7V.mjs.map +7 -0
  36. package/dist/lib/browser/toolkit-2AJTHG74.mjs +74 -0
  37. package/dist/lib/browser/toolkit-2AJTHG74.mjs.map +7 -0
  38. package/dist/lib/browser/types/index.mjs +6 -14
  39. package/dist/lib/node-esm/{MarkdownPreview-KFDRV4GC.mjs → MarkdownCard-XL5EVSJ7.mjs} +18 -18
  40. package/dist/lib/node-esm/MarkdownCard-XL5EVSJ7.mjs.map +7 -0
  41. package/dist/lib/node-esm/{MarkdownContainer-O3SGMH4G.mjs → MarkdownContainer-5FTROSXN.mjs} +277 -296
  42. package/dist/lib/node-esm/MarkdownContainer-5FTROSXN.mjs.map +7 -0
  43. package/dist/lib/node-esm/{anchor-sort-BXL7BE67.mjs → anchor-sort-ALP2NH24.mjs} +6 -6
  44. package/dist/lib/node-esm/anchor-sort-ALP2NH24.mjs.map +7 -0
  45. package/dist/lib/node-esm/{app-graph-serializer-F7DGNF3G.mjs → app-graph-serializer-56TD3BMX.mjs} +14 -15
  46. package/dist/lib/node-esm/app-graph-serializer-56TD3BMX.mjs.map +7 -0
  47. package/dist/lib/node-esm/blueprint-definition-GVW67KGV.mjs +12 -0
  48. package/dist/lib/node-esm/blueprint-definition-GVW67KGV.mjs.map +7 -0
  49. package/dist/lib/node-esm/chunk-CB2R4YIY.mjs +17 -0
  50. package/dist/lib/node-esm/chunk-CB2R4YIY.mjs.map +7 -0
  51. package/dist/lib/node-esm/chunk-DVK63TD3.mjs +103 -0
  52. package/dist/lib/node-esm/chunk-DVK63TD3.mjs.map +7 -0
  53. package/dist/lib/node-esm/chunk-FXILAQ5F.mjs +79 -0
  54. package/dist/lib/node-esm/chunk-FXILAQ5F.mjs.map +7 -0
  55. package/dist/lib/node-esm/{chunk-BWDDFDJY.mjs → chunk-J7A6TUB2.mjs} +14 -12
  56. package/dist/lib/node-esm/chunk-J7A6TUB2.mjs.map +7 -0
  57. package/dist/lib/node-esm/{chunk-K26TX5V4.mjs → chunk-O6EXWGGS.mjs} +9 -10
  58. package/dist/lib/node-esm/chunk-O6EXWGGS.mjs.map +7 -0
  59. package/dist/lib/node-esm/chunk-Q2BREK2M.mjs +24 -0
  60. package/dist/lib/node-esm/chunk-Q2BREK2M.mjs.map +7 -0
  61. package/dist/lib/node-esm/chunk-VCG2U522.mjs +29 -0
  62. package/dist/lib/node-esm/chunk-VCG2U522.mjs.map +7 -0
  63. package/dist/lib/node-esm/index.mjs +38 -25
  64. package/dist/lib/node-esm/index.mjs.map +3 -3
  65. package/dist/lib/node-esm/intent-resolver-2I5HKCUU.mjs +63 -0
  66. package/dist/lib/node-esm/intent-resolver-2I5HKCUU.mjs.map +7 -0
  67. package/dist/lib/node-esm/meta.json +1 -1
  68. package/dist/lib/node-esm/{react-surface-YHFOQTVO.mjs → react-surface-AUWSLYJS.mjs} +62 -52
  69. package/dist/lib/node-esm/react-surface-AUWSLYJS.mjs.map +7 -0
  70. package/dist/lib/node-esm/{settings-SIY33P3F.mjs → settings-CXGR6DH4.mjs} +6 -6
  71. package/dist/lib/node-esm/settings-CXGR6DH4.mjs.map +7 -0
  72. package/dist/lib/node-esm/{state-LLGVRYKL.mjs → state-NWMQ3XAI.mjs} +8 -8
  73. package/dist/lib/node-esm/state-NWMQ3XAI.mjs.map +7 -0
  74. package/dist/lib/node-esm/toolkit-RC44I2MI.mjs +75 -0
  75. package/dist/lib/node-esm/toolkit-RC44I2MI.mjs.map +7 -0
  76. package/dist/lib/node-esm/types/index.mjs +6 -14
  77. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  78. package/dist/types/src/capabilities/anchor-sort.d.ts +2 -2
  79. package/dist/types/src/capabilities/app-graph-serializer.d.ts +1 -1
  80. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -1
  81. package/dist/types/src/capabilities/artifact-definition.d.ts +1 -9
  82. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  83. package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -0
  84. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  85. package/dist/types/src/capabilities/capabilities.d.ts +1 -1
  86. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  87. package/dist/types/src/capabilities/index.d.ts +12 -10
  88. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  89. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  90. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  91. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  92. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/settings.d.ts +1 -1
  94. package/dist/types/src/capabilities/state.d.ts +2 -2
  95. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  96. package/dist/types/src/capabilities/toolkit.d.ts +4 -0
  97. package/dist/types/src/capabilities/toolkit.d.ts.map +1 -0
  98. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts +7 -0
  99. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts.map +1 -0
  100. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts +10 -0
  101. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts.map +1 -0
  102. package/dist/types/src/components/MarkdownCard/index.d.ts +4 -0
  103. package/dist/types/src/components/MarkdownCard/index.d.ts.map +1 -0
  104. package/dist/types/src/components/MarkdownContainer.d.ts +5 -5
  105. package/dist/types/src/components/MarkdownContainer.d.ts.map +1 -1
  106. package/dist/types/src/components/MarkdownContainer.stories.d.ts +50 -4
  107. package/dist/types/src/components/MarkdownContainer.stories.d.ts.map +1 -1
  108. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +2 -2
  109. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
  110. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts +110 -12
  111. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts.map +1 -1
  112. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts +2 -2
  113. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts.map +1 -1
  114. package/dist/types/src/components/Suggestions.stories.d.ts +3 -3
  115. package/dist/types/src/components/Suggestions.stories.d.ts.map +1 -1
  116. package/dist/types/src/components/Toolbar.stories.d.ts +44 -7
  117. package/dist/types/src/components/Toolbar.stories.d.ts.map +1 -1
  118. package/dist/types/src/components/index.d.ts +1 -1
  119. package/dist/types/src/components/index.d.ts.map +1 -1
  120. package/dist/types/src/events.d.ts.map +1 -1
  121. package/dist/types/src/extensions.d.ts +3 -5
  122. package/dist/types/src/extensions.d.ts.map +1 -1
  123. package/dist/types/src/functions/diff.d.ts +6 -0
  124. package/dist/types/src/functions/diff.d.ts.map +1 -0
  125. package/dist/types/src/functions/index.d.ts +3 -0
  126. package/dist/types/src/functions/index.d.ts.map +1 -0
  127. package/dist/types/src/functions/open.d.ts +7 -0
  128. package/dist/types/src/functions/open.d.ts.map +1 -0
  129. package/dist/types/src/index.d.ts +2 -1
  130. package/dist/types/src/index.d.ts.map +1 -1
  131. package/dist/types/src/meta.d.ts +0 -1
  132. package/dist/types/src/meta.d.ts.map +1 -1
  133. package/dist/types/src/translations.d.ts +36 -80
  134. package/dist/types/src/translations.d.ts.map +1 -1
  135. package/dist/types/src/types/Markdown.d.ts +43 -0
  136. package/dist/types/src/types/Markdown.d.ts.map +1 -0
  137. package/dist/types/src/types/MarkdownAction.d.ts +33 -0
  138. package/dist/types/src/types/MarkdownAction.d.ts.map +1 -0
  139. package/dist/types/src/types/index.d.ts +2 -1
  140. package/dist/types/src/types/index.d.ts.map +1 -1
  141. package/dist/types/src/types/types.d.ts +4 -59
  142. package/dist/types/src/types/types.d.ts.map +1 -1
  143. package/dist/types/src/util.d.ts +12 -3
  144. package/dist/types/src/util.d.ts.map +1 -1
  145. package/dist/types/tsconfig.tsbuildinfo +1 -1
  146. package/package.json +51 -48
  147. package/src/MarkdownPlugin.tsx +22 -13
  148. package/src/capabilities/anchor-sort.ts +3 -3
  149. package/src/capabilities/app-graph-serializer.ts +10 -8
  150. package/src/capabilities/artifact-definition.ts +19 -24
  151. package/src/capabilities/blueprint-definition.ts +39 -0
  152. package/src/capabilities/capabilities.ts +5 -4
  153. package/src/capabilities/index.ts +3 -1
  154. package/src/capabilities/intent-resolver.ts +15 -21
  155. package/src/capabilities/react-surface.tsx +22 -20
  156. package/src/capabilities/settings.ts +3 -3
  157. package/src/capabilities/state.ts +8 -8
  158. package/src/capabilities/toolkit.ts +47 -0
  159. package/src/components/MarkdownCard/MarkdownCard.stories.tsx +79 -0
  160. package/src/components/{MarkdownPreview/MarkdownPreview.tsx → MarkdownCard/MarkdownCard.tsx} +21 -17
  161. package/src/components/MarkdownCard/index.ts +9 -0
  162. package/src/components/MarkdownContainer.stories.tsx +13 -16
  163. package/src/components/MarkdownContainer.tsx +31 -17
  164. package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +10 -7
  165. package/src/components/MarkdownEditor/MarkdownEditor.tsx +28 -30
  166. package/src/components/MarkdownSettings/MarkdownSettings.tsx +81 -78
  167. package/src/components/Suggestions.stories.tsx +36 -33
  168. package/src/components/Toolbar.stories.tsx +19 -14
  169. package/src/components/index.ts +1 -1
  170. package/src/events.ts +2 -2
  171. package/src/extensions.tsx +28 -52
  172. package/src/functions/diff.ts +35 -0
  173. package/src/functions/index.ts +6 -0
  174. package/src/functions/open.ts +30 -0
  175. package/src/hooks/useSelectCurrentThread.tsx +3 -3
  176. package/src/index.ts +4 -1
  177. package/src/meta.ts +7 -8
  178. package/src/translations.ts +10 -7
  179. package/src/types/Markdown.ts +56 -0
  180. package/src/types/MarkdownAction.ts +29 -0
  181. package/src/types/index.ts +2 -1
  182. package/src/types/types.ts +7 -51
  183. package/src/util.tsx +20 -6
  184. package/dist/lib/browser/MarkdownContainer-EFWQ6DHD.mjs.map +0 -7
  185. package/dist/lib/browser/MarkdownPreview-F4PYFW5L.mjs.map +0 -7
  186. package/dist/lib/browser/anchor-sort-BMAN2ABT.mjs.map +0 -7
  187. package/dist/lib/browser/app-graph-serializer-EI6TEHRQ.mjs.map +0 -7
  188. package/dist/lib/browser/artifact-definition-FQ2R6KPT.mjs +0 -145
  189. package/dist/lib/browser/artifact-definition-FQ2R6KPT.mjs.map +0 -7
  190. package/dist/lib/browser/chunk-354IBM5X.mjs +0 -20
  191. package/dist/lib/browser/chunk-354IBM5X.mjs.map +0 -7
  192. package/dist/lib/browser/chunk-D767LUGU.mjs.map +0 -7
  193. package/dist/lib/browser/chunk-JX6XNEHE.mjs +0 -22
  194. package/dist/lib/browser/chunk-JX6XNEHE.mjs.map +0 -7
  195. package/dist/lib/browser/chunk-LXSRQPEP.mjs.map +0 -7
  196. package/dist/lib/browser/chunk-N2D26K6W.mjs +0 -79
  197. package/dist/lib/browser/chunk-N2D26K6W.mjs.map +0 -7
  198. package/dist/lib/browser/chunk-QVJETNGS.mjs +0 -16
  199. package/dist/lib/browser/chunk-QVJETNGS.mjs.map +0 -7
  200. package/dist/lib/browser/intent-resolver-6ZOABX2J.mjs +0 -64
  201. package/dist/lib/browser/intent-resolver-6ZOABX2J.mjs.map +0 -7
  202. package/dist/lib/browser/react-surface-4B5ELMEW.mjs.map +0 -7
  203. package/dist/lib/browser/settings-PLH54VC7.mjs.map +0 -7
  204. package/dist/lib/browser/state-KI6PJ6DT.mjs.map +0 -7
  205. package/dist/lib/node/MarkdownContainer-KYGUEZIL.cjs +0 -783
  206. package/dist/lib/node/MarkdownContainer-KYGUEZIL.cjs.map +0 -7
  207. package/dist/lib/node/MarkdownPreview-GCJJCXY6.cjs +0 -103
  208. package/dist/lib/node/MarkdownPreview-GCJJCXY6.cjs.map +0 -7
  209. package/dist/lib/node/anchor-sort-V3T4SFFI.cjs +0 -48
  210. package/dist/lib/node/anchor-sort-V3T4SFFI.cjs.map +0 -7
  211. package/dist/lib/node/app-graph-serializer-E6BXEDEL.cjs +0 -65
  212. package/dist/lib/node/app-graph-serializer-E6BXEDEL.cjs.map +0 -7
  213. package/dist/lib/node/artifact-definition-U27MH5SC.cjs +0 -158
  214. package/dist/lib/node/artifact-definition-U27MH5SC.cjs.map +0 -7
  215. package/dist/lib/node/chunk-3HHV4MM6.cjs +0 -101
  216. package/dist/lib/node/chunk-3HHV4MM6.cjs.map +0 -7
  217. package/dist/lib/node/chunk-CJLYFGPI.cjs +0 -74
  218. package/dist/lib/node/chunk-CJLYFGPI.cjs.map +0 -7
  219. package/dist/lib/node/chunk-FU3XZZCO.cjs +0 -58
  220. package/dist/lib/node/chunk-FU3XZZCO.cjs.map +0 -7
  221. package/dist/lib/node/chunk-IFYSBQE5.cjs +0 -35
  222. package/dist/lib/node/chunk-IFYSBQE5.cjs.map +0 -7
  223. package/dist/lib/node/chunk-LQAC5HL7.cjs +0 -68
  224. package/dist/lib/node/chunk-LQAC5HL7.cjs.map +0 -7
  225. package/dist/lib/node/chunk-ZU5OIHCY.cjs +0 -45
  226. package/dist/lib/node/chunk-ZU5OIHCY.cjs.map +0 -7
  227. package/dist/lib/node/index.cjs +0 -165
  228. package/dist/lib/node/index.cjs.map +0 -7
  229. package/dist/lib/node/intent-resolver-OEFLRNEJ.cjs +0 -77
  230. package/dist/lib/node/intent-resolver-OEFLRNEJ.cjs.map +0 -7
  231. package/dist/lib/node/meta.json +0 -1
  232. package/dist/lib/node/react-surface-456HQ4KZ.cjs +0 -218
  233. package/dist/lib/node/react-surface-456HQ4KZ.cjs.map +0 -7
  234. package/dist/lib/node/settings-E3NUTXJ4.cjs +0 -42
  235. package/dist/lib/node/settings-E3NUTXJ4.cjs.map +0 -7
  236. package/dist/lib/node/state-KKDRAG7X.cjs +0 -51
  237. package/dist/lib/node/state-KKDRAG7X.cjs.map +0 -7
  238. package/dist/lib/node/types/index.cjs +0 -40
  239. package/dist/lib/node/types/index.cjs.map +0 -7
  240. package/dist/lib/node-esm/MarkdownContainer-O3SGMH4G.mjs.map +0 -7
  241. package/dist/lib/node-esm/MarkdownPreview-KFDRV4GC.mjs.map +0 -7
  242. package/dist/lib/node-esm/anchor-sort-BXL7BE67.mjs.map +0 -7
  243. package/dist/lib/node-esm/app-graph-serializer-F7DGNF3G.mjs.map +0 -7
  244. package/dist/lib/node-esm/artifact-definition-NQOHB6S5.mjs +0 -146
  245. package/dist/lib/node-esm/artifact-definition-NQOHB6S5.mjs.map +0 -7
  246. package/dist/lib/node-esm/chunk-BWDDFDJY.mjs.map +0 -7
  247. package/dist/lib/node-esm/chunk-JXXDCSMW.mjs +0 -17
  248. package/dist/lib/node-esm/chunk-JXXDCSMW.mjs.map +0 -7
  249. package/dist/lib/node-esm/chunk-K26TX5V4.mjs.map +0 -7
  250. package/dist/lib/node-esm/chunk-RX63ZNML.mjs +0 -24
  251. package/dist/lib/node-esm/chunk-RX63ZNML.mjs.map +0 -7
  252. package/dist/lib/node-esm/chunk-T2Y2BT53.mjs +0 -80
  253. package/dist/lib/node-esm/chunk-T2Y2BT53.mjs.map +0 -7
  254. package/dist/lib/node-esm/chunk-YOABAQ7A.mjs +0 -22
  255. package/dist/lib/node-esm/chunk-YOABAQ7A.mjs.map +0 -7
  256. package/dist/lib/node-esm/intent-resolver-CLMSVF2K.mjs +0 -65
  257. package/dist/lib/node-esm/intent-resolver-CLMSVF2K.mjs.map +0 -7
  258. package/dist/lib/node-esm/react-surface-YHFOQTVO.mjs.map +0 -7
  259. package/dist/lib/node-esm/settings-SIY33P3F.mjs.map +0 -7
  260. package/dist/lib/node-esm/state-LLGVRYKL.mjs.map +0 -7
  261. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.d.ts +0 -6
  262. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.d.ts.map +0 -1
  263. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts +0 -17
  264. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts.map +0 -1
  265. package/dist/types/src/components/MarkdownPreview/index.d.ts +0 -4
  266. package/dist/types/src/components/MarkdownPreview/index.d.ts.map +0 -1
  267. package/dist/types/src/types/schema.d.ts +0 -35
  268. package/dist/types/src/types/schema.d.ts.map +0 -1
  269. package/src/components/MarkdownPreview/MarkdownPreview.stories.tsx +0 -74
  270. package/src/components/MarkdownPreview/index.ts +0 -9
  271. package/src/types/schema.ts +0 -39
@@ -6,100 +6,103 @@ 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
- import { MARKDOWN_PLUGIN } from '../../meta';
12
- import { type MarkdownSettingsProps } from '../../types';
11
+ import { meta } from '../../meta';
12
+ import { type Markdown } from '../../types';
13
13
 
14
- export const MarkdownSettings = ({ settings }: { settings: MarkdownSettingsProps }) => {
15
- const { t } = useTranslation(MARKDOWN_PLUGIN);
14
+ export const MarkdownSettings = ({ settings }: { settings: Markdown.Settings }) => {
15
+ const { t } = useTranslation(meta.id);
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
  };
@@ -4,25 +4,21 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
- import { type Meta } from '@storybook/react';
8
- import { Match, Option, pipe, Schema } from 'effect';
7
+ import { type Meta } from '@storybook/react-vite';
8
+ import { Match, Option, Schema, pipe } from 'effect';
9
9
  import React, { type FC, useEffect, useMemo, useState } from 'react';
10
10
 
11
- import { Message } from '@dxos/ai';
12
11
  import {
13
12
  Capabilities,
14
- CollaborationActions,
15
13
  IntentPlugin,
16
14
  SettingsPlugin,
17
15
  contributes,
18
- createIntent,
19
16
  useCapability,
20
17
  useIntentDispatcher,
21
18
  } from '@dxos/app-framework';
22
19
  import { withPluginManager } from '@dxos/app-framework/testing';
23
20
  import { Obj, Ref, Type } from '@dxos/echo';
24
21
  import { invariant } from '@dxos/invariant';
25
- import { DXN } from '@dxos/keys';
26
22
  import { ClientPlugin } from '@dxos/plugin-client';
27
23
  import { PreviewPlugin } from '@dxos/plugin-preview';
28
24
  import { SpacePlugin } from '@dxos/plugin-space';
@@ -31,17 +27,19 @@ import { ThemePlugin } from '@dxos/plugin-theme';
31
27
  import { faker } from '@dxos/random';
32
28
  import { createDocAccessor, fullyQualifiedId, toCursorRange, useQueue, useSpace } from '@dxos/react-client/echo';
33
29
  import { IconButton, Toolbar } from '@dxos/react-ui';
34
- import { command, type EditorSelection, type Range, useTextEditor } from '@dxos/react-ui-editor';
30
+ import { type EditorSelection, type Range, command, useTextEditor } from '@dxos/react-ui-editor';
35
31
  import { StackItem } from '@dxos/react-ui-stack';
36
32
  import { defaultTx } from '@dxos/react-ui-theme';
33
+ import { DataType } from '@dxos/schema';
37
34
  import { withLayout } from '@dxos/storybook-utils';
38
35
 
39
- import MarkdownContainer from './MarkdownContainer';
40
- import { MarkdownPlugin } from '../MarkdownPlugin';
41
36
  import { MarkdownCapabilities } from '../capabilities';
42
- import { MARKDOWN_PLUGIN } from '../meta';
43
- import translations from '../translations';
44
- import { createDocument, DocumentType, type MarkdownSettingsProps } from '../types';
37
+ import { MarkdownPlugin } from '../MarkdownPlugin';
38
+ import { meta } from '../meta';
39
+ import { translations } from '../translations';
40
+ import { Markdown } from '../types';
41
+
42
+ import { MarkdownContainer } from './MarkdownContainer';
45
43
 
46
44
  faker.seed(1);
47
45
 
@@ -61,19 +59,25 @@ const TestItem = Schema.Struct({
61
59
  }),
62
60
  );
63
61
 
64
- const TestChat: FC<{ doc: DocumentType; content: string }> = ({ doc, content }) => {
62
+ const TestChat: FC<{ doc: Markdown.Document; content: string }> = ({ doc, content }) => {
65
63
  const { dispatchPromise: dispatch } = useIntentDispatcher();
66
64
  const { parentRef } = useTextEditor({ initialValue: content });
67
65
  const { editorState } = useCapability(MarkdownCapabilities.State);
68
66
 
69
67
  const space = useSpace();
70
68
  const queueDxn = useMemo(() => space && space.queues.create().dxn, [space]);
71
- const queue = useQueue<Message>(queueDxn);
69
+ const queue = useQueue<DataType.Message>(queueDxn);
72
70
 
73
71
  const handleInsert = async () => {
74
72
  invariant(space);
75
73
  invariant(queue);
76
- await queue.append([Obj.make(Message, { role: 'assistant', content: [{ type: 'text', text: 'Hello' }] })]);
74
+ await queue.append([
75
+ Obj.make(DataType.Message, {
76
+ created: new Date().toISOString(),
77
+ sender: { role: 'assistant' },
78
+ blocks: [{ _tag: 'text', text: 'Hello' }],
79
+ }),
80
+ ]);
77
81
  const message = queue.objects.at(-1);
78
82
  invariant(message);
79
83
 
@@ -92,14 +96,14 @@ const TestChat: FC<{ doc: DocumentType; content: string }> = ({ doc, content })
92
96
  // const message = deref(ref);
93
97
  // }
94
98
 
95
- void dispatch(
96
- createIntent(CollaborationActions.InsertContent, {
97
- target: doc as any as Type.Expando,
98
- object: Ref.fromDXN(new DXN(DXN.kind.QUEUE, [...queue.dxn.parts, message.id])),
99
- at: cursor,
100
- label: 'Proposal',
101
- }),
102
- );
99
+ // void dispatch(
100
+ // createIntent(CollaborationActions.InsertContent, {
101
+ // target: doc as any as Type.Expando,
102
+ // object: Ref.fromDXN(new DXN(DXN.kind.QUEUE, [...queue.dxn.parts, message.id])),
103
+ // at: cursor,
104
+ // label: 'Proposal',
105
+ // }),
106
+ // );
103
107
  };
104
108
 
105
109
  return (
@@ -114,8 +118,8 @@ const TestChat: FC<{ doc: DocumentType; content: string }> = ({ doc, content })
114
118
 
115
119
  const DefaultStory = ({ document, chat }: { document: string; chat: string }) => {
116
120
  const space = useSpace();
117
- const [doc, setDoc] = useState<DocumentType>();
118
- const settings = useCapability(Capabilities.SettingsStore).getStore<MarkdownSettingsProps>(MARKDOWN_PLUGIN)!.value;
121
+ const [doc, setDoc] = useState<Markdown.Document>();
122
+ const settings = useCapability(Capabilities.SettingsStore).getStore<Markdown.Settings>(meta.id)!.value;
119
123
  const { editorState } = useCapability(MarkdownCapabilities.State);
120
124
 
121
125
  useEffect(() => {
@@ -124,14 +128,12 @@ const DefaultStory = ({ document, chat }: { document: string; chat: string }) =>
124
128
  }
125
129
 
126
130
  const doc = space.db.add(
127
- createDocument({
131
+ Markdown.makeDocument({
128
132
  name: 'Test',
129
-
130
- // Create links.
131
133
  content: document.replaceAll(/\[(\w+)\]/g, (_, label) => {
132
134
  const obj = space.db.add(Obj.make(TestItem, { title: label, description: faker.lorem.paragraph() }));
133
135
  const dxn = Ref.make(obj).dxn.toString();
134
- return `[${label}][${dxn}]`;
136
+ return `[${label}](${dxn})`;
135
137
  }),
136
138
  }),
137
139
  );
@@ -151,7 +153,8 @@ const DefaultStory = ({ document, chat }: { document: string; chat: string }) =>
151
153
  );
152
154
  };
153
155
 
154
- const meta: Meta<typeof DefaultStory> = {
156
+ // TODO(burdon): Make consistent.
157
+ const storybook: Meta<typeof DefaultStory> = {
155
158
  title: 'plugins/plugin-markdown/Suggestions',
156
159
  render: DefaultStory,
157
160
  decorators: [
@@ -160,8 +163,8 @@ const meta: Meta<typeof DefaultStory> = {
160
163
  ThemePlugin({ tx: defaultTx }),
161
164
  StorybookLayoutPlugin(),
162
165
  ClientPlugin({
163
- types: [DocumentType, TestItem],
164
- onClientInitialized: async (_, client) => {
166
+ types: [Markdown.Document, TestItem],
167
+ onClientInitialized: async ({ client }) => {
165
168
  await client.halo.createIdentity();
166
169
  },
167
170
  }),
@@ -181,7 +184,7 @@ const meta: Meta<typeof DefaultStory> = {
181
184
  },
182
185
  };
183
186
 
184
- export default meta;
187
+ export default storybook;
185
188
 
186
189
  type Story = Meta<typeof DefaultStory>;
187
190
 
@@ -4,18 +4,18 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
- import { type Meta } from '@storybook/react';
8
- import React, { type FC, useCallback, useState } from 'react';
7
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
+ import React, { useCallback, useState } from 'react';
9
9
 
10
- import { Obj } from '@dxos/echo';
11
10
  import { invariant } from '@dxos/invariant';
12
11
  import { PublicKey } from '@dxos/keys';
13
12
  import { faker } from '@dxos/random';
14
13
  import { createDocAccessor } from '@dxos/react-client/echo';
15
14
  import { useThemeContext } from '@dxos/react-ui';
16
15
  import {
17
- EditorToolbar,
18
16
  type Comment,
17
+ EditorToolbar,
18
+ type EditorViewMode,
19
19
  comments,
20
20
  createBasicExtensions,
21
21
  createDataExtensions,
@@ -26,19 +26,22 @@ import {
26
26
  formattingKeymap,
27
27
  translations,
28
28
  useComments,
29
+ useEditorToolbarState,
29
30
  useFormattingState,
30
31
  useTextEditor,
31
- useEditorToolbarState,
32
- type EditorViewMode,
33
32
  } from '@dxos/react-ui-editor';
34
33
  import { DataType } from '@dxos/schema';
35
34
  import { withLayout, withTheme } from '@dxos/storybook-utils';
36
35
 
37
36
  faker.seed(101);
38
37
 
39
- const DefaultStory: FC<{ content?: string }> = ({ content = '' }) => {
38
+ type StoryProps = {
39
+ content?: string;
40
+ };
41
+
42
+ const DefaultStory = ({ content = '' }: StoryProps) => {
40
43
  const { themeMode } = useThemeContext();
41
- const [text] = useState(Obj.make(DataType.Text, { content }));
44
+ const [text] = useState(DataType.makeText(content));
42
45
  const toolbarState = useEditorToolbarState({ viewMode: 'preview' });
43
46
  const formattingObserver = useFormattingState(toolbarState);
44
47
  const { parentRef, view } = useTextEditor(() => {
@@ -48,7 +51,7 @@ const DefaultStory: FC<{ content?: string }> = ({ content = '' }) => {
48
51
  extensions: [
49
52
  formattingObserver,
50
53
  createBasicExtensions({ readOnly: toolbarState.viewMode === 'readonly' }),
51
- createMarkdownExtensions({ themeMode }),
54
+ createMarkdownExtensions(),
52
55
  createThemeExtensions({ themeMode, syntaxHighlighting: true, slots: editorSlots }),
53
56
  createDataExtensions({ id: text.id, text: createDocAccessor(text, ['content']) }),
54
57
  comments({
@@ -94,19 +97,21 @@ const content = [
94
97
  '',
95
98
  ].join('\n');
96
99
 
97
- const meta: Meta<typeof EditorToolbar> = {
100
+ const meta = {
98
101
  title: 'plugins/plugin-markdown/Toolbar',
99
- component: EditorToolbar,
100
- render: DefaultStory as any,
102
+ component: EditorToolbar as any,
103
+ render: DefaultStory,
101
104
  decorators: [withTheme, withLayout({ fullscreen: true })],
102
105
  parameters: {
103
106
  translations,
104
107
  },
105
- };
108
+ } satisfies Meta<typeof DefaultStory>;
106
109
 
107
110
  export default meta;
108
111
 
109
- export const Default = {
112
+ type Story = StoryObj<typeof meta>;
113
+
114
+ export const Default: Story = {
110
115
  args: {
111
116
  content,
112
117
  },
@@ -7,4 +7,4 @@ import { lazy } from 'react';
7
7
  export * from './MarkdownSettings';
8
8
 
9
9
  export const MarkdownContainer = lazy(() => import('./MarkdownContainer'));
10
- export const MarkdownPreview = lazy(() => import('./MarkdownPreview'));
10
+ export const MarkdownCard = lazy(() => import('./MarkdownCard'));
package/src/events.ts CHANGED
@@ -4,8 +4,8 @@
4
4
 
5
5
  import { Events } from '@dxos/app-framework';
6
6
 
7
- import { MARKDOWN_PLUGIN } from './meta';
7
+ import { meta } from './meta';
8
8
 
9
9
  export namespace MarkdownEvents {
10
- export const SetupExtensions = Events.createStateEvent(`${MARKDOWN_PLUGIN}/setup-extensions`);
10
+ export const SetupExtensions = Events.createStateEvent(`${meta.id}/event/setup-extensions`);
11
11
  }
@@ -2,30 +2,35 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
+ import { type ViewUpdate } from '@codemirror/view';
5
6
  import React, { type AnchorHTMLAttributes, type ReactNode, useMemo } from 'react';
6
7
  import { createRoot } from 'react-dom/client';
7
8
 
8
9
  import {
9
- createIntent,
10
10
  LayoutAction,
11
11
  type PromiseIntentDispatcher,
12
+ createIntent,
12
13
  useCapabilities,
13
14
  useIntentDispatcher,
14
15
  } from '@dxos/app-framework';
16
+ import { debounceAndThrottle } from '@dxos/async';
15
17
  import { invariant } from '@dxos/invariant';
16
- import { createDocAccessor, fullyQualifiedId, getSpace, type QueryResult } from '@dxos/react-client/echo';
18
+ import { createDocAccessor, fullyQualifiedId, getSpace } from '@dxos/react-client/echo';
17
19
  import { useIdentity } from '@dxos/react-client/halo';
18
20
  import { Icon, ThemeProvider } from '@dxos/react-ui';
19
21
  import { type SelectionManager } from '@dxos/react-ui-attention';
20
22
  import {
21
- type AutocompleteResult,
23
+ Cursor,
22
24
  type EditorStateStore,
25
+ EditorView,
23
26
  type EditorViewMode,
24
27
  type Extension,
25
28
  InputModeExtensions,
29
+ type PreviewOptions,
30
+ type RenderCallback,
26
31
  createDataExtensions,
27
- autocomplete,
28
32
  decorateMarkdown,
33
+ documentId,
29
34
  folding,
30
35
  formattingKeymap,
31
36
  linkTooltip,
@@ -33,27 +38,21 @@ import {
33
38
  preview,
34
39
  selectionState,
35
40
  typewriter,
36
- type RenderCallback,
37
- EditorView,
38
- documentId,
39
- Cursor,
40
- type PreviewOptions,
41
41
  } from '@dxos/react-ui-editor';
42
42
  import { defaultTx } from '@dxos/react-ui-theme';
43
43
  import { type DataType } from '@dxos/schema';
44
44
  import { isNotFalsy } from '@dxos/util';
45
45
 
46
46
  import { MarkdownCapabilities } from './capabilities';
47
- import { type DocumentType, type MarkdownSettingsProps } from './types';
47
+ import { type Markdown } from './types';
48
48
  import { setFallbackName } from './util';
49
49
 
50
50
  type ExtensionsOptions = {
51
- document?: DocumentType;
51
+ document?: Markdown.Document;
52
52
  id?: string;
53
53
  text?: DataType.Text;
54
54
  dispatch?: PromiseIntentDispatcher;
55
- query?: QueryResult<DocumentType>;
56
- settings: MarkdownSettingsProps;
55
+ settings: Markdown.Settings;
57
56
  selectionManager?: SelectionManager;
58
57
  viewMode?: EditorViewMode;
59
58
  editorStateStore?: EditorStateStore;
@@ -172,7 +171,6 @@ const createBaseExtensions = ({
172
171
  dispatch,
173
172
  settings,
174
173
  selectionManager,
175
- query,
176
174
  viewMode,
177
175
  previewOptions,
178
176
  }: ExtensionsOptions): Extension[] => {
@@ -214,30 +212,6 @@ const createBaseExtensions = ({
214
212
  );
215
213
  }
216
214
 
217
- //
218
- // Autocomplete object links.
219
- //
220
- if (query) {
221
- extensions.push(
222
- autocomplete({
223
- onSearch: (text: string) => {
224
- // TODO(burdon): Specify filter (e.g., stack).
225
- return query.objects
226
- .map<AutocompleteResult | undefined>((object) =>
227
- object.name?.length && object.id !== document?.id
228
- ? {
229
- label: object.name,
230
- // TODO(burdon): Factor out URL builder.
231
- apply: `[${object.name}](/${fullyQualifiedId(object)})`,
232
- }
233
- : undefined,
234
- )
235
- .filter(isNotFalsy);
236
- },
237
- }),
238
- );
239
- }
240
-
241
215
  if (settings.debug) {
242
216
  const items = settings.typewriter?.split(/[,\n]/) ?? '';
243
217
  if (items) {
@@ -249,20 +223,22 @@ const createBaseExtensions = ({
249
223
  };
250
224
 
251
225
  export const selectionChange = (selectionManager: SelectionManager) => {
252
- return EditorView.updateListener.of((update) => {
253
- if (update.selectionSet) {
254
- const id = update.state.facet(documentId);
255
- const cursorConverter = update.state.facet(Cursor.converter);
256
- const selection = update.state.selection;
257
- const ranges = selection.ranges
258
- .map((range) => ({
259
- from: cursorConverter.toCursor(range.from),
260
- to: cursorConverter.toCursor(range.to),
261
- }))
262
- .filter(({ from, to }) => to > from);
263
- selectionManager.updateMultiRange(id, ranges);
264
- }
265
- });
226
+ return EditorView.updateListener.of(
227
+ debounceAndThrottle((update: ViewUpdate) => {
228
+ if (update.selectionSet) {
229
+ const id = update.state.facet(documentId);
230
+ const cursorConverter = update.state.facet(Cursor.converter);
231
+ const selection = update.state.selection;
232
+ const ranges = selection.ranges
233
+ .map((range) => ({
234
+ from: cursorConverter.toCursor(range.from),
235
+ to: cursorConverter.toCursor(range.to),
236
+ }))
237
+ .filter(({ from, to }) => to > from);
238
+ selectionManager.updateMultiRange(id, ranges);
239
+ }
240
+ }, 100),
241
+ );
266
242
  };
267
243
 
268
244
  // TODO(burdon): Factor out styles.
@@ -0,0 +1,35 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { Effect, Schema } from 'effect';
6
+
7
+ import { ArtifactId, applyDiffs } from '@dxos/assistant';
8
+ import { createDocAccessor } from '@dxos/echo-db';
9
+ import { DatabaseService, defineFunction } from '@dxos/functions';
10
+ import { trim } from '@dxos/util';
11
+
12
+ import { Markdown } from '../types';
13
+
14
+ // TODO(wittjosiah): Reconcile with ThreadAction.AddProposal.
15
+ export default defineFunction({
16
+ name: 'dxos.org/function/markdown/diff',
17
+ description: trim`
18
+ Applies a set of diffs to the markdown document.
19
+ `,
20
+ inputSchema: Schema.Struct({
21
+ id: ArtifactId.annotations({
22
+ description: 'The ID of the markdown document.',
23
+ }),
24
+ diffs: Schema.Array(Schema.String).annotations({
25
+ description: 'The diffs to apply to the document.',
26
+ }),
27
+ }),
28
+ outputSchema: Schema.Void,
29
+ handler: Effect.fn(function* ({ data: { id, diffs } }) {
30
+ const object = yield* DatabaseService.resolve(ArtifactId.toDXN(id), Markdown.Document);
31
+ const content = yield* Effect.promise(() => object.content.load());
32
+ const accessor = createDocAccessor(content, ['content']);
33
+ applyDiffs(accessor, diffs);
34
+ }),
35
+ });
@@ -0,0 +1,6 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ export { default as diff } from './diff';
6
+ export { default as open } from './open';