@dxos/plugin-markdown 0.8.4-main.72ec0f3 → 0.8.4-main.74a063c4e0

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 (365) hide show
  1. package/dist/lib/browser/MarkdownSettings-YZFNSJJY.mjs +121 -0
  2. package/dist/lib/browser/MarkdownSettings-YZFNSJJY.mjs.map +7 -0
  3. package/dist/lib/browser/blueprints/index.mjs +51 -0
  4. package/dist/lib/browser/blueprints/index.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-46WIDM4R.mjs +98 -0
  6. package/dist/lib/browser/chunk-46WIDM4R.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  8. package/dist/lib/browser/chunk-XKUKZNUS.mjs +158 -0
  9. package/dist/lib/browser/chunk-XKUKZNUS.mjs.map +7 -0
  10. package/dist/lib/browser/cli/index.mjs +39 -0
  11. package/dist/lib/browser/cli/index.mjs.map +7 -0
  12. package/dist/lib/browser/create-HSXPXCC5.mjs +30 -0
  13. package/dist/lib/browser/create-HSXPXCC5.mjs.map +7 -0
  14. package/dist/lib/browser/create-markdown-WB7DH3UF.mjs +22 -0
  15. package/dist/lib/browser/create-markdown-WB7DH3UF.mjs.map +7 -0
  16. package/dist/lib/browser/index.mjs +632 -153
  17. package/dist/lib/browser/index.mjs.map +4 -4
  18. package/dist/lib/browser/meta.json +1 -1
  19. package/dist/lib/browser/open-N6PAX6DY.mjs +21 -0
  20. package/dist/lib/browser/open-N6PAX6DY.mjs.map +7 -0
  21. package/dist/lib/browser/operations/index.mjs +14 -0
  22. package/dist/lib/browser/operations/index.mjs.map +7 -0
  23. package/dist/lib/browser/scroll-to-anchor-5M4F24AB.mjs +49 -0
  24. package/dist/lib/browser/scroll-to-anchor-5M4F24AB.mjs.map +7 -0
  25. package/dist/lib/browser/set-view-mode-NBNF2I5W.mjs +26 -0
  26. package/dist/lib/browser/set-view-mode-NBNF2I5W.mjs.map +7 -0
  27. package/dist/lib/browser/types/index.mjs +11 -5
  28. package/dist/lib/browser/update-5QIRVGTL.mjs +45 -0
  29. package/dist/lib/browser/update-5QIRVGTL.mjs.map +7 -0
  30. package/dist/lib/node-esm/MarkdownSettings-X6SDS35F.mjs +122 -0
  31. package/dist/lib/node-esm/MarkdownSettings-X6SDS35F.mjs.map +7 -0
  32. package/dist/lib/node-esm/blueprints/index.mjs +52 -0
  33. package/dist/lib/node-esm/blueprints/index.mjs.map +7 -0
  34. package/dist/lib/node-esm/chunk-4MSJO6IJ.mjs +99 -0
  35. package/dist/lib/node-esm/chunk-4MSJO6IJ.mjs.map +7 -0
  36. package/dist/lib/node-esm/chunk-E4BQCEXF.mjs +159 -0
  37. package/dist/lib/node-esm/chunk-E4BQCEXF.mjs.map +7 -0
  38. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  39. package/dist/lib/node-esm/cli/index.mjs +40 -0
  40. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  41. package/dist/lib/node-esm/create-6Z2KYISY.mjs +31 -0
  42. package/dist/lib/node-esm/create-6Z2KYISY.mjs.map +7 -0
  43. package/dist/lib/node-esm/create-markdown-JWQZICKY.mjs +23 -0
  44. package/dist/lib/node-esm/create-markdown-JWQZICKY.mjs.map +7 -0
  45. package/dist/lib/node-esm/index.mjs +632 -153
  46. package/dist/lib/node-esm/index.mjs.map +4 -4
  47. package/dist/lib/node-esm/meta.json +1 -1
  48. package/dist/lib/node-esm/open-DSNFRSNZ.mjs +22 -0
  49. package/dist/lib/node-esm/open-DSNFRSNZ.mjs.map +7 -0
  50. package/dist/lib/node-esm/operations/index.mjs +15 -0
  51. package/dist/lib/node-esm/operations/index.mjs.map +7 -0
  52. package/dist/lib/node-esm/scroll-to-anchor-D6SHGU2R.mjs +50 -0
  53. package/dist/lib/node-esm/scroll-to-anchor-D6SHGU2R.mjs.map +7 -0
  54. package/dist/lib/node-esm/set-view-mode-REYB4L7J.mjs +27 -0
  55. package/dist/lib/node-esm/set-view-mode-REYB4L7J.mjs.map +7 -0
  56. package/dist/lib/node-esm/types/index.mjs +11 -5
  57. package/dist/lib/node-esm/update-YMQAIKOF.mjs +46 -0
  58. package/dist/lib/node-esm/update-YMQAIKOF.mjs.map +7 -0
  59. package/dist/types/src/MarkdownPlugin.d.ts +2 -1
  60. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  61. package/dist/types/src/blueprints/index.d.ts +2 -0
  62. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  63. package/dist/types/src/blueprints/markdown-blueprint.d.ts +4 -0
  64. package/dist/types/src/blueprints/markdown-blueprint.d.ts.map +1 -0
  65. package/dist/types/src/capabilities/anchor-sort.d.ts +4 -2
  66. package/dist/types/src/capabilities/anchor-sort.d.ts.map +1 -1
  67. package/dist/types/src/capabilities/app-graph-serializer.d.ts +3 -2
  68. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -1
  69. package/dist/types/src/capabilities/artifact-definition.d.ts +3 -1
  70. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  71. package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -6
  72. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -1
  73. package/dist/types/src/capabilities/index.d.ts +27 -14
  74. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  75. package/dist/types/src/capabilities/node.d.ts +4 -0
  76. package/dist/types/src/capabilities/node.d.ts.map +1 -0
  77. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  78. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  79. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  80. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  81. package/dist/types/src/capabilities/settings.d.ts +22 -2
  82. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  83. package/dist/types/src/capabilities/state.d.ts +4 -9
  84. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  85. package/dist/types/src/cli/index.d.ts +2 -0
  86. package/dist/types/src/cli/index.d.ts.map +1 -0
  87. package/dist/types/src/cli/plugin.d.ts +3 -0
  88. package/dist/types/src/cli/plugin.d.ts.map +1 -0
  89. package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts +1 -1
  90. package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts.map +1 -1
  91. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +18 -12
  92. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
  93. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts +2 -2
  94. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts.map +1 -1
  95. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts +16 -10
  96. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts.map +1 -1
  97. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts +10 -5
  98. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts.map +1 -1
  99. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts +4 -4
  100. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts.map +1 -1
  101. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.stories.d.ts +138 -0
  102. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.stories.d.ts.map +1 -0
  103. package/dist/types/src/components/MarkdownSettings/index.d.ts +1 -1
  104. package/dist/types/src/components/MarkdownSettings/index.d.ts.map +1 -1
  105. package/dist/types/src/components/index.d.ts +3 -5
  106. package/dist/types/src/components/index.d.ts.map +1 -1
  107. package/dist/types/src/containers/MarkdownCard/MarkdownCard.d.ts +8 -0
  108. package/dist/types/src/containers/MarkdownCard/MarkdownCard.d.ts.map +1 -0
  109. package/dist/types/src/containers/MarkdownCard/MarkdownCard.stories.d.ts +9 -0
  110. package/dist/types/src/containers/MarkdownCard/MarkdownCard.stories.d.ts.map +1 -0
  111. package/dist/types/src/containers/MarkdownCard/index.d.ts +2 -0
  112. package/dist/types/src/containers/MarkdownCard/index.d.ts.map +1 -0
  113. package/dist/types/src/containers/MarkdownCard/snippet.d.ts +15 -0
  114. package/dist/types/src/containers/MarkdownCard/snippet.d.ts.map +1 -0
  115. package/dist/types/src/containers/MarkdownContainer/MarkdownContainer.d.ts +36 -0
  116. package/dist/types/src/containers/MarkdownContainer/MarkdownContainer.d.ts.map +1 -0
  117. package/dist/types/src/containers/MarkdownContainer/MarkdownContainer.stories.d.ts +99 -0
  118. package/dist/types/src/containers/MarkdownContainer/MarkdownContainer.stories.d.ts.map +1 -0
  119. package/dist/types/src/containers/MarkdownContainer/index.d.ts +3 -0
  120. package/dist/types/src/containers/MarkdownContainer/index.d.ts.map +1 -0
  121. package/dist/types/src/containers/index.d.ts +5 -0
  122. package/dist/types/src/containers/index.d.ts.map +1 -0
  123. package/dist/types/src/hooks/index.d.ts +0 -1
  124. package/dist/types/src/hooks/index.d.ts.map +1 -1
  125. package/dist/types/src/hooks/useEditorMenuOptions.d.ts.map +1 -1
  126. package/dist/types/src/hooks/useExtensions.d.ts +8 -6
  127. package/dist/types/src/hooks/useExtensions.d.ts.map +1 -1
  128. package/dist/types/src/hooks/useLinkQuery.d.ts +2 -2
  129. package/dist/types/src/hooks/useLinkQuery.d.ts.map +1 -1
  130. package/dist/types/src/index.d.ts +2 -2
  131. package/dist/types/src/index.d.ts.map +1 -1
  132. package/dist/types/src/meta.d.ts +2 -2
  133. package/dist/types/src/meta.d.ts.map +1 -1
  134. package/dist/types/src/operations/create-markdown.d.ts +5 -0
  135. package/dist/types/src/operations/create-markdown.d.ts.map +1 -0
  136. package/dist/types/src/operations/create.d.ts +5 -0
  137. package/dist/types/src/operations/create.d.ts.map +1 -0
  138. package/dist/types/src/operations/create.test.d.ts.map +1 -0
  139. package/dist/types/src/operations/definitions.d.ts +64 -0
  140. package/dist/types/src/operations/definitions.d.ts.map +1 -0
  141. package/dist/types/src/operations/index.d.ts +4 -0
  142. package/dist/types/src/operations/index.d.ts.map +1 -0
  143. package/dist/types/src/operations/open.d.ts +5 -0
  144. package/dist/types/src/operations/open.d.ts.map +1 -0
  145. package/dist/types/src/operations/scroll-to-anchor.d.ts +5 -0
  146. package/dist/types/src/operations/scroll-to-anchor.d.ts.map +1 -0
  147. package/dist/types/src/operations/set-view-mode.d.ts +5 -0
  148. package/dist/types/src/operations/set-view-mode.d.ts.map +1 -0
  149. package/dist/types/src/operations/update.d.ts +5 -0
  150. package/dist/types/src/operations/update.d.ts.map +1 -0
  151. package/dist/types/src/operations/update.test.d.ts.map +1 -0
  152. package/dist/types/src/testing.d.ts +2 -2
  153. package/dist/types/src/testing.d.ts.map +1 -1
  154. package/dist/types/src/translations.d.ts +75 -34
  155. package/dist/types/src/translations.d.ts.map +1 -1
  156. package/dist/types/src/types/Markdown.d.ts +29 -30
  157. package/dist/types/src/types/Markdown.d.ts.map +1 -1
  158. package/dist/types/src/types/Settings.d.ts +16 -0
  159. package/dist/types/src/types/Settings.d.ts.map +1 -0
  160. package/dist/types/src/types/capabilities.d.ts +51 -0
  161. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  162. package/dist/types/src/types/events.d.ts +5 -0
  163. package/dist/types/src/types/events.d.ts.map +1 -0
  164. package/dist/types/src/types/index.d.ts +4 -2
  165. package/dist/types/src/types/index.d.ts.map +1 -1
  166. package/dist/types/src/types/types.d.ts +2 -2
  167. package/dist/types/src/types/types.d.ts.map +1 -1
  168. package/dist/types/src/util.d.ts +5 -2
  169. package/dist/types/src/util.d.ts.map +1 -1
  170. package/dist/types/src/util.test.d.ts +2 -0
  171. package/dist/types/src/util.test.d.ts.map +1 -0
  172. package/dist/types/tsconfig.tsbuildinfo +1 -1
  173. package/package.json +115 -68
  174. package/src/MarkdownPlugin.tsx +74 -98
  175. package/src/blueprints/index.ts +5 -0
  176. package/src/blueprints/markdown-blueprint.ts +44 -0
  177. package/src/capabilities/anchor-sort.ts +28 -21
  178. package/src/capabilities/app-graph-serializer.ts +55 -44
  179. package/src/capabilities/artifact-definition.ts +81 -83
  180. package/src/capabilities/blueprint-definition.ts +9 -35
  181. package/src/capabilities/index.ts +12 -11
  182. package/src/capabilities/node.ts +11 -0
  183. package/src/capabilities/operation-handler.ts +16 -0
  184. package/src/capabilities/react-surface.tsx +93 -66
  185. package/src/capabilities/settings.ts +30 -18
  186. package/src/capabilities/state.ts +41 -25
  187. package/src/cli/index.ts +5 -0
  188. package/src/cli/plugin.ts +39 -0
  189. package/src/components/MarkdownEditor/FileUpload.tsx +2 -2
  190. package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +37 -38
  191. package/src/components/MarkdownEditor/MarkdownEditor.tsx +75 -45
  192. package/src/components/MarkdownEditor/MarkdownEditorContent.tsx +63 -30
  193. package/src/components/MarkdownEditor/MarkdownEditorToolbar.tsx +47 -52
  194. package/src/components/MarkdownSettings/MarkdownSettings.stories.tsx +39 -0
  195. package/src/components/MarkdownSettings/MarkdownSettings.tsx +116 -86
  196. package/src/components/MarkdownSettings/index.ts +1 -1
  197. package/src/components/index.ts +4 -7
  198. package/src/containers/MarkdownCard/MarkdownCard.stories.tsx +67 -0
  199. package/src/containers/MarkdownCard/MarkdownCard.tsx +57 -0
  200. package/src/containers/MarkdownCard/index.ts +5 -0
  201. package/src/containers/MarkdownCard/snippet.ts +78 -0
  202. package/src/containers/MarkdownContainer/MarkdownContainer.stories.tsx +134 -0
  203. package/src/containers/MarkdownContainer/MarkdownContainer.tsx +135 -0
  204. package/src/containers/MarkdownContainer/index.ts +6 -0
  205. package/src/containers/index.ts +10 -0
  206. package/src/hooks/index.ts +0 -1
  207. package/src/hooks/useEditorMenuOptions.ts +11 -14
  208. package/src/hooks/useExtensions.tsx +92 -108
  209. package/src/hooks/useLinkQuery.ts +46 -21
  210. package/src/index.ts +3 -2
  211. package/src/meta.ts +3 -3
  212. package/src/operations/create-markdown.ts +20 -0
  213. package/src/operations/create.conversations.json +1 -0
  214. package/src/operations/create.test.ts +98 -0
  215. package/src/operations/create.ts +27 -0
  216. package/src/operations/definitions.ts +120 -0
  217. package/src/operations/index.ts +16 -0
  218. package/src/operations/open.ts +25 -0
  219. package/src/operations/scroll-to-anchor.ts +39 -0
  220. package/src/operations/set-view-mode.ts +24 -0
  221. package/src/operations/update.conversations.json +1 -0
  222. package/src/operations/update.test.ts +215 -0
  223. package/src/operations/update.ts +51 -0
  224. package/src/testing.ts +6 -6
  225. package/src/translations.ts +49 -34
  226. package/src/types/Markdown.ts +22 -30
  227. package/src/types/Settings.ts +28 -0
  228. package/src/types/capabilities.ts +50 -0
  229. package/src/types/events.ts +14 -0
  230. package/src/types/index.ts +5 -3
  231. package/src/types/types.ts +3 -2
  232. package/src/util.test.ts +44 -0
  233. package/src/util.tsx +77 -7
  234. package/dist/lib/browser/MarkdownCard-JYMDPKV5.mjs +0 -12
  235. package/dist/lib/browser/MarkdownContainer-Y75XSVBX.mjs +0 -15
  236. package/dist/lib/browser/anchor-sort-3HGPGCOO.mjs +0 -31
  237. package/dist/lib/browser/anchor-sort-3HGPGCOO.mjs.map +0 -7
  238. package/dist/lib/browser/app-graph-serializer-POZN234F.mjs +0 -51
  239. package/dist/lib/browser/app-graph-serializer-POZN234F.mjs.map +0 -7
  240. package/dist/lib/browser/blueprint-definition-GIPKFDY5.mjs +0 -13
  241. package/dist/lib/browser/blueprint-definition-GIPKFDY5.mjs.map +0 -7
  242. package/dist/lib/browser/chunk-22XSSNBS.mjs +0 -56
  243. package/dist/lib/browser/chunk-22XSSNBS.mjs.map +0 -7
  244. package/dist/lib/browser/chunk-2MLGSYRN.mjs +0 -20
  245. package/dist/lib/browser/chunk-2MLGSYRN.mjs.map +0 -7
  246. package/dist/lib/browser/chunk-BQTYJOFB.mjs +0 -28
  247. package/dist/lib/browser/chunk-BQTYJOFB.mjs.map +0 -7
  248. package/dist/lib/browser/chunk-GH6GQSBL.mjs +0 -51
  249. package/dist/lib/browser/chunk-GH6GQSBL.mjs.map +0 -7
  250. package/dist/lib/browser/chunk-IBCHVMZW.mjs +0 -16
  251. package/dist/lib/browser/chunk-IBCHVMZW.mjs.map +0 -7
  252. package/dist/lib/browser/chunk-K3LXOU3E.mjs +0 -827
  253. package/dist/lib/browser/chunk-K3LXOU3E.mjs.map +0 -7
  254. package/dist/lib/browser/chunk-PBJLFIOX.mjs +0 -96
  255. package/dist/lib/browser/chunk-PBJLFIOX.mjs.map +0 -7
  256. package/dist/lib/browser/chunk-QYSEJ5GP.mjs +0 -79
  257. package/dist/lib/browser/chunk-QYSEJ5GP.mjs.map +0 -7
  258. package/dist/lib/browser/chunk-Y53FQREH.mjs +0 -150
  259. package/dist/lib/browser/chunk-Y53FQREH.mjs.map +0 -7
  260. package/dist/lib/browser/intent-resolver-Z5L7TXUK.mjs +0 -62
  261. package/dist/lib/browser/intent-resolver-Z5L7TXUK.mjs.map +0 -7
  262. package/dist/lib/browser/react-surface-GO5ZOKNN.mjs +0 -211
  263. package/dist/lib/browser/react-surface-GO5ZOKNN.mjs.map +0 -7
  264. package/dist/lib/browser/settings-TZUDB5EW.mjs +0 -28
  265. package/dist/lib/browser/settings-TZUDB5EW.mjs.map +0 -7
  266. package/dist/lib/browser/state-BTUKVZHY.mjs +0 -37
  267. package/dist/lib/browser/state-BTUKVZHY.mjs.map +0 -7
  268. package/dist/lib/browser/toolkit.mjs +0 -13
  269. package/dist/lib/browser/toolkit.mjs.map +0 -7
  270. package/dist/lib/node-esm/MarkdownCard-ZXPJLUYO.mjs +0 -13
  271. package/dist/lib/node-esm/MarkdownCard-ZXPJLUYO.mjs.map +0 -7
  272. package/dist/lib/node-esm/MarkdownContainer-YRDSRDCS.mjs +0 -16
  273. package/dist/lib/node-esm/MarkdownContainer-YRDSRDCS.mjs.map +0 -7
  274. package/dist/lib/node-esm/anchor-sort-PCDXEBJ2.mjs +0 -32
  275. package/dist/lib/node-esm/anchor-sort-PCDXEBJ2.mjs.map +0 -7
  276. package/dist/lib/node-esm/app-graph-serializer-NF65JYAS.mjs +0 -52
  277. package/dist/lib/node-esm/app-graph-serializer-NF65JYAS.mjs.map +0 -7
  278. package/dist/lib/node-esm/blueprint-definition-ENKJZYQS.mjs +0 -14
  279. package/dist/lib/node-esm/blueprint-definition-ENKJZYQS.mjs.map +0 -7
  280. package/dist/lib/node-esm/chunk-AMHACOXW.mjs +0 -57
  281. package/dist/lib/node-esm/chunk-AMHACOXW.mjs.map +0 -7
  282. package/dist/lib/node-esm/chunk-CT7CFX5G.mjs +0 -828
  283. package/dist/lib/node-esm/chunk-CT7CFX5G.mjs.map +0 -7
  284. package/dist/lib/node-esm/chunk-GMMVSXQ6.mjs +0 -17
  285. package/dist/lib/node-esm/chunk-GMMVSXQ6.mjs.map +0 -7
  286. package/dist/lib/node-esm/chunk-HAIEWPU7.mjs +0 -151
  287. package/dist/lib/node-esm/chunk-HAIEWPU7.mjs.map +0 -7
  288. package/dist/lib/node-esm/chunk-KCHUTL3Q.mjs +0 -22
  289. package/dist/lib/node-esm/chunk-KCHUTL3Q.mjs.map +0 -7
  290. package/dist/lib/node-esm/chunk-NGYJNQ6A.mjs +0 -80
  291. package/dist/lib/node-esm/chunk-NGYJNQ6A.mjs.map +0 -7
  292. package/dist/lib/node-esm/chunk-PIOOG7A5.mjs +0 -97
  293. package/dist/lib/node-esm/chunk-PIOOG7A5.mjs.map +0 -7
  294. package/dist/lib/node-esm/chunk-PLZ7EVCT.mjs +0 -52
  295. package/dist/lib/node-esm/chunk-PLZ7EVCT.mjs.map +0 -7
  296. package/dist/lib/node-esm/chunk-SHAMSMKQ.mjs +0 -29
  297. package/dist/lib/node-esm/chunk-SHAMSMKQ.mjs.map +0 -7
  298. package/dist/lib/node-esm/intent-resolver-6B3PFQ5F.mjs +0 -63
  299. package/dist/lib/node-esm/intent-resolver-6B3PFQ5F.mjs.map +0 -7
  300. package/dist/lib/node-esm/react-surface-I46BPCWT.mjs +0 -212
  301. package/dist/lib/node-esm/react-surface-I46BPCWT.mjs.map +0 -7
  302. package/dist/lib/node-esm/settings-CJ3T5EX4.mjs +0 -29
  303. package/dist/lib/node-esm/settings-CJ3T5EX4.mjs.map +0 -7
  304. package/dist/lib/node-esm/state-K6EH7SRZ.mjs +0 -38
  305. package/dist/lib/node-esm/state-K6EH7SRZ.mjs.map +0 -7
  306. package/dist/lib/node-esm/toolkit.mjs +0 -14
  307. package/dist/lib/node-esm/toolkit.mjs.map +0 -7
  308. package/dist/types/src/capabilities/capabilities.d.ts +0 -12
  309. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  310. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  311. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  312. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts +0 -7
  313. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts.map +0 -1
  314. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts +0 -9
  315. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts.map +0 -1
  316. package/dist/types/src/components/MarkdownCard/index.d.ts +0 -4
  317. package/dist/types/src/components/MarkdownCard/index.d.ts.map +0 -1
  318. package/dist/types/src/components/MarkdownContainer.d.ts +0 -14
  319. package/dist/types/src/components/MarkdownContainer.d.ts.map +0 -1
  320. package/dist/types/src/components/MarkdownContainer.stories.d.ts +0 -58
  321. package/dist/types/src/components/MarkdownContainer.stories.d.ts.map +0 -1
  322. package/dist/types/src/components/Suggestions.stories.d.ts +0 -11
  323. package/dist/types/src/components/Suggestions.stories.d.ts.map +0 -1
  324. package/dist/types/src/events.d.ts +0 -4
  325. package/dist/types/src/events.d.ts.map +0 -1
  326. package/dist/types/src/functions/create.d.ts +0 -8
  327. package/dist/types/src/functions/create.d.ts.map +0 -1
  328. package/dist/types/src/functions/create.test.d.ts.map +0 -1
  329. package/dist/types/src/functions/index.d.ts +0 -18
  330. package/dist/types/src/functions/index.d.ts.map +0 -1
  331. package/dist/types/src/functions/open.d.ts +0 -7
  332. package/dist/types/src/functions/open.d.ts.map +0 -1
  333. package/dist/types/src/functions/update.d.ts +0 -6
  334. package/dist/types/src/functions/update.d.ts.map +0 -1
  335. package/dist/types/src/functions/update.test.d.ts.map +0 -1
  336. package/dist/types/src/hooks/useSelectCurrentThread.d.ts +0 -6
  337. package/dist/types/src/hooks/useSelectCurrentThread.d.ts.map +0 -1
  338. package/dist/types/src/toolkit.d.ts +0 -3
  339. package/dist/types/src/toolkit.d.ts.map +0 -1
  340. package/dist/types/src/types/MarkdownAction.d.ts +0 -34
  341. package/dist/types/src/types/MarkdownAction.d.ts.map +0 -1
  342. package/src/capabilities/capabilities.ts +0 -22
  343. package/src/capabilities/intent-resolver.ts +0 -58
  344. package/src/components/MarkdownCard/MarkdownCard.stories.tsx +0 -76
  345. package/src/components/MarkdownCard/MarkdownCard.tsx +0 -89
  346. package/src/components/MarkdownCard/index.ts +0 -9
  347. package/src/components/MarkdownContainer.stories.tsx +0 -136
  348. package/src/components/MarkdownContainer.tsx +0 -113
  349. package/src/components/Suggestions.stories.tsx +0 -225
  350. package/src/events.ts +0 -11
  351. package/src/functions/create.conversations.json +0 -1
  352. package/src/functions/create.test.ts +0 -128
  353. package/src/functions/create.ts +0 -34
  354. package/src/functions/index.ts +0 -13
  355. package/src/functions/open.ts +0 -32
  356. package/src/functions/update.conversations.json +0 -1
  357. package/src/functions/update.test.ts +0 -151
  358. package/src/functions/update.ts +0 -37
  359. package/src/hooks/useSelectCurrentThread.tsx +0 -66
  360. package/src/toolkit.ts +0 -6
  361. package/src/types/MarkdownAction.ts +0 -29
  362. /package/dist/lib/browser/{MarkdownCard-JYMDPKV5.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  363. /package/dist/lib/{browser/MarkdownContainer-Y75XSVBX.mjs.map → node-esm/chunk-HSLMI22Q.mjs.map} +0 -0
  364. /package/dist/types/src/{functions → operations}/create.test.d.ts +0 -0
  365. /package/dist/types/src/{functions → operations}/update.test.d.ts +0 -0
@@ -5,59 +5,54 @@
5
5
  import { type EditorView } from '@codemirror/view';
6
6
  import React, { useCallback, useState } from 'react';
7
7
 
8
- import { type FileInfo } from '@dxos/app-framework';
8
+ import { type FileInfo } from '@dxos/app-toolkit';
9
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';
10
+ import { EditorToolbar, type EditorToolbarProps } from '@dxos/react-ui-editor';
11
+ import { composable, composableProps } from '@dxos/ui-theme';
12
12
 
13
13
  import { FileUpload, type FileUploadAction } from './FileUpload';
14
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
- };
15
+ export type MarkdownEditorToolbarProps = {
16
+ id: string;
17
+ editorView?: EditorView;
18
+ onFileUpload?: (file: File) => Promise<FileInfo | undefined>;
19
+ } & Pick<EditorToolbarProps, 'role' | 'state' | 'customActions' | 'onAction' | 'onViewModeChange'>;
20
+
21
+ export const MarkdownEditorToolbar = composable<HTMLDivElement, MarkdownEditorToolbarProps>(
22
+ (
23
+ { id, role, state, editorView, customActions, onAction, onFileUpload, onViewModeChange, ...props },
24
+ forwardedRef,
25
+ ) => {
26
+ const { className, ...rest } = composableProps(props);
27
+ const [upload, setUpload] = useState<FileUploadAction | null>(null);
28
+ const uploadRef = useCallback((next: FileUploadAction) => setUpload(() => next), []);
29
+
30
+ const getView = useCallback(() => {
31
+ invariant(editorView);
32
+ return editorView;
33
+ }, [editorView]);
34
+
35
+ if (!editorView) {
36
+ return <div className={className} {...rest} ref={forwardedRef} />;
37
+ }
38
+
39
+ return (
40
+ <div role='none' className='contents' ref={forwardedRef}>
41
+ <EditorToolbar
42
+ {...rest}
43
+ classNames={className}
44
+ attendableId={id}
45
+ role={role}
46
+ state={state}
47
+ customActions={customActions}
48
+ getView={getView}
49
+ onAction={onAction}
50
+ onImageUpload={upload ?? undefined}
51
+ onViewModeChange={onViewModeChange}
52
+ />
53
+
54
+ {onFileUpload && <FileUpload ref={uploadRef} editorView={editorView} onFileUpload={onFileUpload} />}
55
+ </div>
56
+ );
57
+ },
58
+ );
@@ -0,0 +1,39 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+
7
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
8
+
9
+ import { translations } from '../../translations';
10
+ import { MarkdownSettings } from './MarkdownSettings';
11
+
12
+ const meta = {
13
+ title: 'plugins/plugin-markdown/components/MarkdownSettings',
14
+ tags: ['settings'],
15
+ component: MarkdownSettings,
16
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
17
+ parameters: {
18
+ layout: 'fullscreen',
19
+ translations,
20
+ },
21
+ } satisfies Meta<typeof MarkdownSettings>;
22
+
23
+ export default meta;
24
+
25
+ type Story = StoryObj<typeof meta>;
26
+
27
+ export const Default: Story = {
28
+ args: {
29
+ settings: {
30
+ defaultViewMode: 'preview',
31
+ editorInputMode: 'default',
32
+ toolbar: true,
33
+ numberedHeadings: false,
34
+ folding: false,
35
+ experimental: false,
36
+ debug: false,
37
+ },
38
+ },
39
+ };
@@ -4,105 +4,135 @@
4
4
 
5
5
  import React from 'react';
6
6
 
7
+ import { type AppSurface } from '@dxos/app-toolkit/ui';
7
8
  import { Input, Select, useTranslation } from '@dxos/react-ui';
8
- import { type EditorInputMode, EditorInputModes, type EditorViewMode, EditorViewModes } from '@dxos/react-ui-editor';
9
- import { ControlGroup, ControlItemInput, ControlPage, ControlSection } from '@dxos/react-ui-form';
9
+ import { Settings as SettingsForm } from '@dxos/react-ui-form';
10
+ import { type EditorInputMode, EditorInputModes, type EditorViewMode, EditorViewModes } from '@dxos/ui-editor';
10
11
 
11
- import { meta } from '../../meta';
12
- import { type Markdown } from '../../types';
12
+ import { meta } from '#meta';
13
+ import { type Markdown } from '#types';
13
14
 
14
- export const MarkdownSettings = ({ settings }: { settings: Markdown.Settings }) => {
15
+ export type MarkdownSettingsProps = AppSurface.SettingsArticleProps<Markdown.Settings>;
16
+
17
+ export const MarkdownSettings = ({ settings, onSettingsChange }: MarkdownSettingsProps) => {
15
18
  const { t } = useTranslation(meta.id);
16
19
 
17
20
  // TODO(wittjosiah): Add skill test confirmation for entering vim mode.
18
21
  return (
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>
22
+ <SettingsForm.Viewport>
23
+ <SettingsForm.Section title={t('settings.title', { ns: meta.id })}>
24
+ <SettingsForm.Item title={t('default-view-mode.label')} description={t('default-view-mode.description')}>
25
+ <Select.Root
26
+ disabled={!onSettingsChange}
27
+ value={settings.defaultViewMode}
28
+ onValueChange={(value) => {
29
+ onSettingsChange?.((s) => ({ ...s, defaultViewMode: value as EditorViewMode }));
30
+ }}
31
+ >
32
+ <Select.TriggerButton disabled={!onSettingsChange} />
33
+ <Select.Portal>
34
+ <Select.Content>
35
+ <Select.Viewport>
36
+ {EditorViewModes.map((mode) => (
37
+ <Select.Option key={mode} value={mode}>
38
+ {t(`view-mode.${mode}.label`, { ns: '@dxos/react-ui-editor' })}
39
+ </Select.Option>
40
+ ))}
41
+ </Select.Viewport>
42
+ <Select.Arrow />
43
+ </Select.Content>
44
+ </Select.Portal>
45
+ </Select.Root>
46
+ </SettingsForm.Item>
44
47
 
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>
48
+ <SettingsForm.Item title={t('editor-input-mode.label')} description={t('editor-input-mode.description')}>
49
+ <Select.Root
50
+ disabled={!onSettingsChange}
51
+ value={settings.editorInputMode ?? 'default'}
52
+ onValueChange={(value) => {
53
+ onSettingsChange?.((s) => ({ ...s, editorInputMode: value as EditorInputMode }));
54
+ }}
55
+ >
56
+ <Select.TriggerButton
57
+ disabled={!onSettingsChange}
58
+ placeholder={t('select-editor-input-mode.placeholder')}
59
+ />
60
+ <Select.Portal>
61
+ <Select.Content>
62
+ <Select.Viewport>
63
+ {EditorInputModes.map((mode) => (
64
+ <Select.Option key={mode} value={mode}>
65
+ {t(`settings.editor-input-mode.${mode}.label`)}
66
+ </Select.Option>
67
+ ))}
68
+ </Select.Viewport>
69
+ <Select.Arrow />
70
+ </Select.Content>
71
+ </Select.Portal>
72
+ </Select.Root>
73
+ </SettingsForm.Item>
67
74
 
68
- <ControlItemInput title={t('settings toolbar label')}>
69
- <Input.Switch checked={settings.toolbar} onCheckedChange={(checked) => (settings.toolbar = !!checked)} />
70
- </ControlItemInput>
75
+ <SettingsForm.Item title={t('settings.toolbar.label')} description={t('settings.toolbar.description')}>
76
+ <Input.Switch
77
+ disabled={!onSettingsChange}
78
+ checked={settings.toolbar}
79
+ onCheckedChange={(checked) => onSettingsChange?.((s) => ({ ...s, toolbar: !!checked }))}
80
+ />
81
+ </SettingsForm.Item>
71
82
 
72
- <ControlItemInput title={t('settings numbered headings label')}>
73
- <Input.Switch
74
- checked={settings.numberedHeadings}
75
- onCheckedChange={(checked) => (settings.numberedHeadings = !!checked)}
76
- />
77
- </ControlItemInput>
83
+ <SettingsForm.Item
84
+ title={t('settings.numbered-headings.label')}
85
+ description={t('settings.numbered-headings.description')}
86
+ >
87
+ <Input.Switch
88
+ disabled={!onSettingsChange}
89
+ checked={settings.numberedHeadings}
90
+ onCheckedChange={(checked) => onSettingsChange?.((s) => ({ ...s, numberedHeadings: !!checked }))}
91
+ />
92
+ </SettingsForm.Item>
78
93
 
79
- <ControlItemInput title={t('settings folding label')}>
80
- <Input.Switch checked={settings.folding} onCheckedChange={(checked) => (settings.folding = !!checked)} />
81
- </ControlItemInput>
94
+ <SettingsForm.Item title={t('settings.folding.label')} description={t('settings.folding.description')}>
95
+ <Input.Switch
96
+ disabled={!onSettingsChange}
97
+ checked={settings.folding}
98
+ onCheckedChange={(checked) => onSettingsChange?.((s) => ({ ...s, folding: !!checked }))}
99
+ />
100
+ </SettingsForm.Item>
82
101
 
83
- <ControlItemInput title={t('settings experimental label')}>
84
- <Input.Switch
85
- checked={settings.experimental}
86
- onCheckedChange={(checked) => (settings.experimental = !!checked)}
87
- />
88
- </ControlItemInput>
102
+ <SettingsForm.Item
103
+ title={t('settings.experimental.label')}
104
+ description={t('settings.experimental.description')}
105
+ >
106
+ <Input.Switch
107
+ disabled={!onSettingsChange}
108
+ checked={settings.experimental}
109
+ onCheckedChange={(checked) => onSettingsChange?.((s) => ({ ...s, experimental: !!checked }))}
110
+ />
111
+ </SettingsForm.Item>
89
112
 
90
- <ControlItemInput title={t('settings debug label')}>
91
- <Input.Switch checked={settings.debug} onCheckedChange={(checked) => (settings.debug = !!checked)} />
92
- </ControlItemInput>
113
+ <SettingsForm.Item title={t('settings.debug.label')} description={t('settings.debug.description')}>
114
+ <Input.Switch
115
+ disabled={!onSettingsChange}
116
+ checked={settings.debug}
117
+ onCheckedChange={(checked) => onSettingsChange?.((s) => ({ ...s, debug: !!checked }))}
118
+ />
119
+ </SettingsForm.Item>
93
120
 
94
- {settings.debug && (
95
- <ControlItemInput title={t('settings debug textarea label', { ns: meta.id })}>
96
- <Input.TextArea
97
- rows={5}
98
- value={settings.typewriter}
99
- onChange={({ target: { value } }) => (settings.typewriter = value)}
100
- placeholder={t('settings debug placeholder')}
101
- />
102
- </ControlItemInput>
103
- )}
104
- </ControlGroup>
105
- </ControlSection>
106
- </ControlPage>
121
+ {settings.debug && (
122
+ <SettingsForm.Item
123
+ title={t('settings.debug-typewriter.label', { ns: meta.id })}
124
+ description={t('settings.debug-typewriter.description')}
125
+ >
126
+ <Input.TextArea
127
+ disabled={!onSettingsChange}
128
+ rows={5}
129
+ value={settings.typewriter}
130
+ onChange={({ target: { value } }) => onSettingsChange?.((s) => ({ ...s, typewriter: value }))}
131
+ placeholder={t('settings.debug-typewriter.placeholder')}
132
+ />
133
+ </SettingsForm.Item>
134
+ )}
135
+ </SettingsForm.Section>
136
+ </SettingsForm.Viewport>
107
137
  );
108
138
  };
@@ -2,4 +2,4 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- export * from './MarkdownSettings';
5
+ export { MarkdownSettings as default } from './MarkdownSettings';
@@ -1,12 +1,9 @@
1
1
  //
2
- // Copyright 2023 DXOS.org
2
+ // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { lazy } from 'react';
5
+ import { type ComponentType, lazy } from 'react';
6
6
 
7
- export * from './MarkdownCard';
8
- export * from './MarkdownContainer';
9
- export * from './MarkdownSettings';
7
+ export * from './MarkdownEditor';
10
8
 
11
- export const MarkdownCard = lazy(() => import('./MarkdownCard'));
12
- export const MarkdownContainer = lazy(() => import('./MarkdownContainer'));
9
+ export const MarkdownSettings: ComponentType<any> = lazy(() => import('./MarkdownSettings'));
@@ -0,0 +1,67 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React, { useMemo } from 'react';
7
+
8
+ import { OperationPlugin, RuntimePlugin } from '@dxos/app-framework';
9
+ import { withPluginManager } from '@dxos/app-framework/testing';
10
+ import { Obj } from '@dxos/echo';
11
+ import { ClientPlugin } from '@dxos/plugin-client';
12
+ import { Markdown } from '@dxos/plugin-markdown/types';
13
+ import { random } from '@dxos/random';
14
+ import { Card } from '@dxos/react-ui';
15
+ import { CardContainer } from '@dxos/react-ui-mosaic/testing';
16
+ import { withTheme } from '@dxos/react-ui/testing';
17
+
18
+ import { translations } from '../../translations';
19
+ import { MarkdownCard, type MarkdownCardProps } from './MarkdownCard';
20
+
21
+ random.seed(1234);
22
+
23
+ const MarkdownCardStory = ({ ...args }: Omit<MarkdownCardProps, 'subject'>) => {
24
+ const subject = useMemo(
25
+ () =>
26
+ Markdown.make({
27
+ name: random.lorem.words(3),
28
+ content: random.lorem.paragraphs(5),
29
+ }),
30
+ [],
31
+ );
32
+
33
+ return (
34
+ <CardContainer icon='ph--text-aa--regular'>
35
+ <Card.Root border={false}>
36
+ <Card.Toolbar>
37
+ <Card.DragHandle />
38
+ <Card.Title>{Obj.getLabel(subject)}</Card.Title>
39
+ <Card.Menu />
40
+ </Card.Toolbar>
41
+ <MarkdownCard subject={subject} {...args} />
42
+ </Card.Root>
43
+ </CardContainer>
44
+ );
45
+ };
46
+
47
+ const meta: Meta<typeof MarkdownCardStory> = {
48
+ title: 'plugins/plugin-markdown/containers/MarkdownCard',
49
+ component: MarkdownCardStory,
50
+ decorators: [
51
+ withTheme(),
52
+ withPluginManager({
53
+ plugins: [OperationPlugin(), RuntimePlugin(), ClientPlugin({})],
54
+ }),
55
+ ],
56
+ parameters: {
57
+ layout: 'centered',
58
+ translations,
59
+ },
60
+ tags: ['cards'],
61
+ };
62
+
63
+ export default meta;
64
+
65
+ type Story = StoryObj<typeof meta>;
66
+
67
+ export const Default: Story = {};
@@ -0,0 +1,57 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React, { useMemo } from 'react';
6
+
7
+ import { Obj } from '@dxos/echo';
8
+ import { Card, useTranslation } from '@dxos/react-ui';
9
+ import { Text } from '@dxos/schema';
10
+
11
+ import { MarkdownEditor } from '#components';
12
+ import { meta } from '#meta';
13
+ import { Markdown } from '#types';
14
+
15
+ import { getContentSnippet } from '../../util';
16
+ import { snippet as snippetExtension } from './snippet';
17
+
18
+ export type MarkdownCardProps = { subject: Markdown.Document | Text.Text };
19
+
20
+ export const MarkdownCard = ({ subject }: MarkdownCardProps) => {
21
+ const { t } = useTranslation(meta.id);
22
+ const snippet = useMemo(() => getSnippet(subject), [subject]);
23
+ const extensions = useMemo(() => [snippetExtension({ height: 240, scale: 0.8 })], []);
24
+ const info = getInfo(subject);
25
+
26
+ return (
27
+ <Card.Content>
28
+ {snippet && (
29
+ <Card.Section className='px-1'>
30
+ <MarkdownEditor.Root id={subject.id} viewMode='readonly' extensions={extensions}>
31
+ <MarkdownEditor.Content initialValue={snippet} slots={{ content: { className: 'm-0' } }} />
32
+ </MarkdownEditor.Root>
33
+ </Card.Section>
34
+ )}
35
+ <Card.Section>
36
+ <Card.Text classNames='px-1.5 text-xs text-description'>
37
+ {info.words} {t('words.label', { count: info.words })}
38
+ </Card.Text>
39
+ </Card.Section>
40
+ </Card.Content>
41
+ );
42
+ };
43
+
44
+ const MAX_LINES = 5;
45
+
46
+ const getSnippet = (subject: Markdown.Document | Text.Text, fallback?: string) => {
47
+ if (Obj.instanceOf(Markdown.Document, subject)) {
48
+ return Obj.getDescription(subject) || getContentSnippet(subject.content?.target?.content ?? fallback, MAX_LINES);
49
+ } else if (Obj.instanceOf(Text.Text, subject)) {
50
+ return getContentSnippet(subject.content ?? fallback, MAX_LINES);
51
+ }
52
+ };
53
+
54
+ const getInfo = (subject: Markdown.Document | Text.Text) => {
55
+ const text = (Obj.instanceOf(Markdown.Document, subject) ? subject.content?.target?.content : subject.content) ?? '';
56
+ return { words: text.split(' ').length };
57
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export { MarkdownCard as default } from './MarkdownCard';
@@ -0,0 +1,78 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type PluginValue, EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';
6
+
7
+ export type SnippetOptions = {
8
+ /** Maximum height of the editor in pixels. Content is clipped to whole lines within this height. */
9
+ height: number;
10
+ /** Zoom factor applied to the editor (e.g. 0.5 renders at 50%). @default 1 */
11
+ scale?: number;
12
+ };
13
+
14
+ /**
15
+ * CodeMirror extension for rendering a non-scrollable snippet of editor content.
16
+ * Constrains the editor to the given height, clips to whole line boundaries,
17
+ * and disables scrolling entirely.
18
+ * Uses requestMeasure to read post-layout heights and lineBlockAtHeight to handle
19
+ * varying line heights from headings and other decorated blocks.
20
+ */
21
+ export const snippet = ({ height, scale = 1 }: SnippetOptions) => {
22
+ // Internal height is divided by scale so the visible area matches the requested height.
23
+ const internalHeight = Math.round(height / scale);
24
+
25
+ const clipPlugin = ViewPlugin.fromClass(
26
+ class SnippetPlugin implements PluginValue {
27
+ private clipHeight = 0;
28
+
29
+ update(update: ViewUpdate) {
30
+ update.view.requestMeasure({
31
+ // key deduplicates concurrent requests within the same animation frame.
32
+ key: this,
33
+ read: (view) => {
34
+ const containerHeight = view.dom.clientHeight;
35
+ if (containerHeight === 0) {
36
+ return 0;
37
+ }
38
+ // With CSS zoom, clientHeight can be in visual pixels while line positions use
39
+ // layout pixels (same space as internalHeight / theme maxHeight).
40
+ const clipLimit = scale === 1 ? containerHeight : Math.min(internalHeight, containerHeight / scale);
41
+ // Find the block (line) at the very bottom of the visible area.
42
+ const block = view.lineBlockAtHeight(clipLimit - 1);
43
+ // If the block overflows the container, clip at the block's top edge.
44
+ return block.top + block.height > clipLimit ? block.top : clipLimit;
45
+ },
46
+ write: (clipHeight, view) => {
47
+ if (clipHeight > 0 && clipHeight !== this.clipHeight) {
48
+ this.clipHeight = clipHeight;
49
+ view.dom.style.maxHeight = `${clipHeight}px`;
50
+ }
51
+ },
52
+ });
53
+ }
54
+ },
55
+ );
56
+
57
+ return [
58
+ clipPlugin,
59
+ EditorView.theme({
60
+ '&': {
61
+ maxHeight: `${internalHeight}px`,
62
+ overflow: 'hidden',
63
+ ...(scale !== 1 && { zoom: `${scale}` }),
64
+ },
65
+ '.cm-content': {
66
+ whiteSpace: 'pre',
67
+ margin: '0',
68
+ padding: '0',
69
+ },
70
+ '.cm-line': {
71
+ padding: '0',
72
+ },
73
+ '.cm-scroller': {
74
+ overflow: 'hidden !important',
75
+ },
76
+ }),
77
+ ];
78
+ };