@dxos/plugin-markdown 0.8.4-main.406dc2a → 0.8.4-main.422d1c7879

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 (355) hide show
  1. package/dist/lib/browser/MarkdownSettings-62YSRY7L.mjs +32 -0
  2. package/dist/lib/browser/MarkdownSettings-62YSRY7L.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-4KOZEH2H.mjs +121 -0
  6. package/dist/lib/browser/chunk-4KOZEH2H.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  8. package/dist/lib/browser/chunk-QFPZONKP.mjs +158 -0
  9. package/dist/lib/browser/chunk-QFPZONKP.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-YL5ELZWP.mjs +30 -0
  13. package/dist/lib/browser/create-YL5ELZWP.mjs.map +7 -0
  14. package/dist/lib/browser/create-markdown-LU5IDKMH.mjs +22 -0
  15. package/dist/lib/browser/create-markdown-LU5IDKMH.mjs.map +7 -0
  16. package/dist/lib/browser/index.mjs +611 -152
  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-AFSOZZ6G.mjs +21 -0
  20. package/dist/lib/browser/open-AFSOZZ6G.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-IPXV32A6.mjs +49 -0
  24. package/dist/lib/browser/scroll-to-anchor-IPXV32A6.mjs.map +7 -0
  25. package/dist/lib/browser/set-view-mode-2QWB24RR.mjs +26 -0
  26. package/dist/lib/browser/set-view-mode-2QWB24RR.mjs.map +7 -0
  27. package/dist/lib/browser/types/index.mjs +11 -5
  28. package/dist/lib/browser/update-HZNVYBMO.mjs +45 -0
  29. package/dist/lib/browser/update-HZNVYBMO.mjs.map +7 -0
  30. package/dist/lib/node-esm/MarkdownSettings-QMPISOEU.mjs +33 -0
  31. package/dist/lib/node-esm/MarkdownSettings-QMPISOEU.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-3OPDJJJH.mjs +122 -0
  35. package/dist/lib/node-esm/chunk-3OPDJJJH.mjs.map +7 -0
  36. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  37. package/dist/lib/node-esm/chunk-JUGS6RKO.mjs +159 -0
  38. package/dist/lib/node-esm/chunk-JUGS6RKO.mjs.map +7 -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-SMQAIM3V.mjs +31 -0
  42. package/dist/lib/node-esm/create-SMQAIM3V.mjs.map +7 -0
  43. package/dist/lib/node-esm/create-markdown-X2OASYKG.mjs +23 -0
  44. package/dist/lib/node-esm/create-markdown-X2OASYKG.mjs.map +7 -0
  45. package/dist/lib/node-esm/index.mjs +611 -152
  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-SRWLLOKE.mjs +22 -0
  49. package/dist/lib/node-esm/open-SRWLLOKE.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-M76GXKYQ.mjs +50 -0
  53. package/dist/lib/node-esm/scroll-to-anchor-M76GXKYQ.mjs.map +7 -0
  54. package/dist/lib/node-esm/set-view-mode-6BB6KIDS.mjs +27 -0
  55. package/dist/lib/node-esm/set-view-mode-6BB6KIDS.mjs.map +7 -0
  56. package/dist/lib/node-esm/types/index.mjs +11 -5
  57. package/dist/lib/node-esm/update-4CELTLXK.mjs +46 -0
  58. package/dist/lib/node-esm/update-4CELTLXK.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 -4
  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 -4
  72. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -1
  73. package/dist/types/src/capabilities/index.d.ts +9 -18
  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 +4 -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 +11 -0
  90. package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts.map +1 -0
  91. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +44 -21
  92. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
  93. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts +5 -110
  94. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts.map +1 -1
  95. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts +32 -0
  96. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts.map +1 -0
  97. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts +13 -0
  98. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts.map +1 -0
  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 +94 -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 -3
  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 +17 -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 +77 -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 +3 -1
  124. package/dist/types/src/hooks/index.d.ts.map +1 -1
  125. package/dist/types/src/hooks/useEditorMenuOptions.d.ts +9 -0
  126. package/dist/types/src/hooks/useEditorMenuOptions.d.ts.map +1 -0
  127. package/dist/types/src/hooks/useExtensions.d.ts +24 -0
  128. package/dist/types/src/hooks/useExtensions.d.ts.map +1 -0
  129. package/dist/types/src/hooks/useLinkQuery.d.ts +4 -0
  130. package/dist/types/src/hooks/useLinkQuery.d.ts.map +1 -0
  131. package/dist/types/src/index.d.ts +3 -2
  132. package/dist/types/src/index.d.ts.map +1 -1
  133. package/dist/types/src/meta.d.ts +2 -2
  134. package/dist/types/src/meta.d.ts.map +1 -1
  135. package/dist/types/src/operations/create-markdown.d.ts +5 -0
  136. package/dist/types/src/operations/create-markdown.d.ts.map +1 -0
  137. package/dist/types/src/operations/create.d.ts +5 -0
  138. package/dist/types/src/operations/create.d.ts.map +1 -0
  139. package/dist/types/src/operations/create.test.d.ts +2 -0
  140. package/dist/types/src/operations/create.test.d.ts.map +1 -0
  141. package/dist/types/src/operations/definitions.d.ts +64 -0
  142. package/dist/types/src/operations/definitions.d.ts.map +1 -0
  143. package/dist/types/src/operations/index.d.ts +4 -0
  144. package/dist/types/src/operations/index.d.ts.map +1 -0
  145. package/dist/types/src/operations/open.d.ts +5 -0
  146. package/dist/types/src/operations/open.d.ts.map +1 -0
  147. package/dist/types/src/operations/scroll-to-anchor.d.ts +5 -0
  148. package/dist/types/src/operations/scroll-to-anchor.d.ts.map +1 -0
  149. package/dist/types/src/operations/set-view-mode.d.ts +5 -0
  150. package/dist/types/src/operations/set-view-mode.d.ts.map +1 -0
  151. package/dist/types/src/operations/update.d.ts +5 -0
  152. package/dist/types/src/operations/update.d.ts.map +1 -0
  153. package/dist/types/src/operations/update.test.d.ts +2 -0
  154. package/dist/types/src/operations/update.test.d.ts.map +1 -0
  155. package/dist/types/src/testing.d.ts +6 -0
  156. package/dist/types/src/testing.d.ts.map +1 -0
  157. package/dist/types/src/translations.d.ts +53 -31
  158. package/dist/types/src/translations.d.ts.map +1 -1
  159. package/dist/types/src/types/Markdown.d.ts +30 -31
  160. package/dist/types/src/types/Markdown.d.ts.map +1 -1
  161. package/dist/types/src/types/Settings.d.ts +17 -0
  162. package/dist/types/src/types/Settings.d.ts.map +1 -0
  163. package/dist/types/src/types/capabilities.d.ts +33 -0
  164. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  165. package/dist/types/src/types/events.d.ts +5 -0
  166. package/dist/types/src/types/events.d.ts.map +1 -0
  167. package/dist/types/src/types/index.d.ts +4 -2
  168. package/dist/types/src/types/index.d.ts.map +1 -1
  169. package/dist/types/src/types/types.d.ts +2 -2
  170. package/dist/types/src/types/types.d.ts.map +1 -1
  171. package/dist/types/src/util.d.ts +7 -4
  172. package/dist/types/src/util.d.ts.map +1 -1
  173. package/dist/types/src/util.test.d.ts +2 -0
  174. package/dist/types/src/util.test.d.ts.map +1 -0
  175. package/dist/types/tsconfig.tsbuildinfo +1 -1
  176. package/package.json +111 -64
  177. package/src/MarkdownPlugin.tsx +75 -100
  178. package/src/blueprints/index.ts +5 -0
  179. package/src/blueprints/markdown-blueprint.ts +44 -0
  180. package/src/capabilities/anchor-sort.ts +29 -22
  181. package/src/capabilities/app-graph-serializer.ts +55 -44
  182. package/src/capabilities/artifact-definition.ts +82 -84
  183. package/src/capabilities/blueprint-definition.ts +9 -31
  184. package/src/capabilities/index.ts +12 -12
  185. package/src/capabilities/node.ts +11 -0
  186. package/src/capabilities/operation-handler.ts +16 -0
  187. package/src/capabilities/react-surface.tsx +110 -104
  188. package/src/capabilities/settings.ts +30 -18
  189. package/src/capabilities/state.ts +41 -25
  190. package/src/cli/index.ts +5 -0
  191. package/src/cli/plugin.ts +39 -0
  192. package/src/components/MarkdownEditor/FileUpload.tsx +63 -0
  193. package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +62 -40
  194. package/src/components/MarkdownEditor/MarkdownEditor.tsx +252 -267
  195. package/src/components/MarkdownEditor/MarkdownEditorContent.tsx +170 -0
  196. package/src/components/MarkdownEditor/MarkdownEditorToolbar.tsx +47 -0
  197. package/src/components/MarkdownSettings/MarkdownSettings.stories.tsx +39 -0
  198. package/src/components/MarkdownSettings/MarkdownSettings.tsx +23 -96
  199. package/src/components/MarkdownSettings/index.ts +1 -1
  200. package/src/components/index.ts +4 -5
  201. package/src/containers/MarkdownCard/MarkdownCard.stories.tsx +67 -0
  202. package/src/containers/MarkdownCard/MarkdownCard.tsx +68 -0
  203. package/src/containers/MarkdownCard/index.ts +5 -0
  204. package/src/containers/MarkdownCard/snippet.ts +52 -0
  205. package/src/containers/MarkdownContainer/MarkdownContainer.stories.tsx +135 -0
  206. package/src/containers/MarkdownContainer/MarkdownContainer.tsx +145 -0
  207. package/src/containers/MarkdownContainer/index.ts +6 -0
  208. package/src/containers/index.ts +10 -0
  209. package/src/hooks/index.ts +3 -1
  210. package/src/hooks/useEditorMenuOptions.ts +68 -0
  211. package/src/hooks/useExtensions.tsx +264 -0
  212. package/src/hooks/useLinkQuery.ts +108 -0
  213. package/src/index.ts +4 -2
  214. package/src/meta.ts +6 -6
  215. package/src/operations/create-markdown.ts +20 -0
  216. package/src/operations/create.conversations.json +1 -0
  217. package/src/operations/create.test.ts +98 -0
  218. package/src/operations/create.ts +27 -0
  219. package/src/operations/definitions.ts +120 -0
  220. package/src/operations/index.ts +16 -0
  221. package/src/operations/open.ts +25 -0
  222. package/src/operations/scroll-to-anchor.ts +39 -0
  223. package/src/operations/set-view-mode.ts +24 -0
  224. package/src/operations/update.conversations.json +1 -0
  225. package/src/operations/update.test.ts +215 -0
  226. package/src/operations/update.ts +51 -0
  227. package/src/testing.ts +27 -0
  228. package/src/translations.ts +26 -32
  229. package/src/types/Markdown.ts +23 -31
  230. package/src/types/Settings.ts +65 -0
  231. package/src/types/capabilities.ts +50 -0
  232. package/src/types/events.ts +14 -0
  233. package/src/types/index.ts +5 -2
  234. package/src/types/types.ts +3 -2
  235. package/src/util.test.ts +44 -0
  236. package/src/util.tsx +81 -12
  237. package/dist/lib/browser/MarkdownCard-AGWOTODZ.mjs +0 -83
  238. package/dist/lib/browser/MarkdownCard-AGWOTODZ.mjs.map +0 -7
  239. package/dist/lib/browser/MarkdownContainer-MV2UNAUV.mjs +0 -751
  240. package/dist/lib/browser/MarkdownContainer-MV2UNAUV.mjs.map +0 -7
  241. package/dist/lib/browser/anchor-sort-YWJI3BKT.mjs +0 -32
  242. package/dist/lib/browser/anchor-sort-YWJI3BKT.mjs.map +0 -7
  243. package/dist/lib/browser/app-graph-serializer-KYDFCUOW.mjs +0 -51
  244. package/dist/lib/browser/app-graph-serializer-KYDFCUOW.mjs.map +0 -7
  245. package/dist/lib/browser/blueprint-definition-BHRMFZAC.mjs +0 -11
  246. package/dist/lib/browser/chunk-6KU5DKP7.mjs +0 -51
  247. package/dist/lib/browser/chunk-6KU5DKP7.mjs.map +0 -7
  248. package/dist/lib/browser/chunk-HBBEHOP3.mjs +0 -106
  249. package/dist/lib/browser/chunk-HBBEHOP3.mjs.map +0 -7
  250. package/dist/lib/browser/chunk-O6XUPW6S.mjs +0 -53
  251. package/dist/lib/browser/chunk-O6XUPW6S.mjs.map +0 -7
  252. package/dist/lib/browser/chunk-ODB2PTBP.mjs +0 -28
  253. package/dist/lib/browser/chunk-ODB2PTBP.mjs.map +0 -7
  254. package/dist/lib/browser/chunk-OY6CGPOO.mjs +0 -16
  255. package/dist/lib/browser/chunk-OY6CGPOO.mjs.map +0 -7
  256. package/dist/lib/browser/chunk-XMT6PMU5.mjs +0 -79
  257. package/dist/lib/browser/chunk-XMT6PMU5.mjs.map +0 -7
  258. package/dist/lib/browser/chunk-Z5PDJNBV.mjs +0 -22
  259. package/dist/lib/browser/chunk-Z5PDJNBV.mjs.map +0 -7
  260. package/dist/lib/browser/intent-resolver-XHVCZZHU.mjs +0 -62
  261. package/dist/lib/browser/intent-resolver-XHVCZZHU.mjs.map +0 -7
  262. package/dist/lib/browser/react-surface-3A2GO3BN.mjs +0 -215
  263. package/dist/lib/browser/react-surface-3A2GO3BN.mjs.map +0 -7
  264. package/dist/lib/browser/settings-XY265Y2Q.mjs +0 -28
  265. package/dist/lib/browser/settings-XY265Y2Q.mjs.map +0 -7
  266. package/dist/lib/browser/state-6QODXCSZ.mjs +0 -37
  267. package/dist/lib/browser/state-6QODXCSZ.mjs.map +0 -7
  268. package/dist/lib/browser/toolkit-YA65QX2S.mjs +0 -76
  269. package/dist/lib/browser/toolkit-YA65QX2S.mjs.map +0 -7
  270. package/dist/lib/node-esm/MarkdownCard-B2IWTFOC.mjs +0 -84
  271. package/dist/lib/node-esm/MarkdownCard-B2IWTFOC.mjs.map +0 -7
  272. package/dist/lib/node-esm/MarkdownContainer-J2R3DLCQ.mjs +0 -752
  273. package/dist/lib/node-esm/MarkdownContainer-J2R3DLCQ.mjs.map +0 -7
  274. package/dist/lib/node-esm/anchor-sort-FCRYL2FX.mjs +0 -33
  275. package/dist/lib/node-esm/anchor-sort-FCRYL2FX.mjs.map +0 -7
  276. package/dist/lib/node-esm/app-graph-serializer-FAUQM3BH.mjs +0 -52
  277. package/dist/lib/node-esm/app-graph-serializer-FAUQM3BH.mjs.map +0 -7
  278. package/dist/lib/node-esm/blueprint-definition-XYFKMIDR.mjs +0 -12
  279. package/dist/lib/node-esm/chunk-7RDNIMTF.mjs +0 -24
  280. package/dist/lib/node-esm/chunk-7RDNIMTF.mjs.map +0 -7
  281. package/dist/lib/node-esm/chunk-CB2R4YIY.mjs +0 -17
  282. package/dist/lib/node-esm/chunk-CB2R4YIY.mjs.map +0 -7
  283. package/dist/lib/node-esm/chunk-FVI7LPC3.mjs +0 -107
  284. package/dist/lib/node-esm/chunk-FVI7LPC3.mjs.map +0 -7
  285. package/dist/lib/node-esm/chunk-FWZKC6X5.mjs +0 -80
  286. package/dist/lib/node-esm/chunk-FWZKC6X5.mjs.map +0 -7
  287. package/dist/lib/node-esm/chunk-VCG2U522.mjs +0 -29
  288. package/dist/lib/node-esm/chunk-VCG2U522.mjs.map +0 -7
  289. package/dist/lib/node-esm/chunk-XO3IEQJE.mjs +0 -54
  290. package/dist/lib/node-esm/chunk-XO3IEQJE.mjs.map +0 -7
  291. package/dist/lib/node-esm/chunk-ZBXV4ON7.mjs +0 -52
  292. package/dist/lib/node-esm/chunk-ZBXV4ON7.mjs.map +0 -7
  293. package/dist/lib/node-esm/intent-resolver-7A2EXGZQ.mjs +0 -63
  294. package/dist/lib/node-esm/intent-resolver-7A2EXGZQ.mjs.map +0 -7
  295. package/dist/lib/node-esm/react-surface-RCLL5WVQ.mjs +0 -216
  296. package/dist/lib/node-esm/react-surface-RCLL5WVQ.mjs.map +0 -7
  297. package/dist/lib/node-esm/settings-H3UDD3KO.mjs +0 -29
  298. package/dist/lib/node-esm/settings-H3UDD3KO.mjs.map +0 -7
  299. package/dist/lib/node-esm/state-W3PECOJX.mjs +0 -38
  300. package/dist/lib/node-esm/state-W3PECOJX.mjs.map +0 -7
  301. package/dist/lib/node-esm/toolkit-HSIKUGNK.mjs +0 -77
  302. package/dist/lib/node-esm/toolkit-HSIKUGNK.mjs.map +0 -7
  303. package/dist/types/src/capabilities/capabilities.d.ts +0 -12
  304. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  305. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  306. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  307. package/dist/types/src/capabilities/toolkit.d.ts +0 -4
  308. package/dist/types/src/capabilities/toolkit.d.ts.map +0 -1
  309. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts +0 -7
  310. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts.map +0 -1
  311. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts +0 -9
  312. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts.map +0 -1
  313. package/dist/types/src/components/MarkdownCard/index.d.ts +0 -4
  314. package/dist/types/src/components/MarkdownCard/index.d.ts.map +0 -1
  315. package/dist/types/src/components/MarkdownContainer.d.ts +0 -18
  316. package/dist/types/src/components/MarkdownContainer.d.ts.map +0 -1
  317. package/dist/types/src/components/MarkdownContainer.stories.d.ts +0 -55
  318. package/dist/types/src/components/MarkdownContainer.stories.d.ts.map +0 -1
  319. package/dist/types/src/components/Suggestions.stories.d.ts +0 -11
  320. package/dist/types/src/components/Suggestions.stories.d.ts.map +0 -1
  321. package/dist/types/src/components/Toolbar.stories.d.ts +0 -48
  322. package/dist/types/src/components/Toolbar.stories.d.ts.map +0 -1
  323. package/dist/types/src/events.d.ts +0 -4
  324. package/dist/types/src/events.d.ts.map +0 -1
  325. package/dist/types/src/extensions.d.ts +0 -22
  326. package/dist/types/src/extensions.d.ts.map +0 -1
  327. package/dist/types/src/functions/diff.d.ts +0 -6
  328. package/dist/types/src/functions/diff.d.ts.map +0 -1
  329. package/dist/types/src/functions/index.d.ts +0 -3
  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/hooks/useSelectCurrentThread.d.ts +0 -6
  334. package/dist/types/src/hooks/useSelectCurrentThread.d.ts.map +0 -1
  335. package/dist/types/src/types/MarkdownAction.d.ts +0 -34
  336. package/dist/types/src/types/MarkdownAction.d.ts.map +0 -1
  337. package/src/capabilities/capabilities.ts +0 -21
  338. package/src/capabilities/intent-resolver.ts +0 -58
  339. package/src/capabilities/toolkit.ts +0 -49
  340. package/src/components/MarkdownCard/MarkdownCard.stories.tsx +0 -76
  341. package/src/components/MarkdownCard/MarkdownCard.tsx +0 -76
  342. package/src/components/MarkdownCard/index.ts +0 -9
  343. package/src/components/MarkdownContainer.stories.tsx +0 -109
  344. package/src/components/MarkdownContainer.tsx +0 -257
  345. package/src/components/Suggestions.stories.tsx +0 -219
  346. package/src/components/Toolbar.stories.tsx +0 -118
  347. package/src/events.ts +0 -11
  348. package/src/extensions.tsx +0 -300
  349. package/src/functions/diff.ts +0 -37
  350. package/src/functions/index.ts +0 -6
  351. package/src/functions/open.ts +0 -32
  352. package/src/hooks/useSelectCurrentThread.tsx +0 -56
  353. package/src/types/MarkdownAction.ts +0 -29
  354. /package/dist/lib/browser/{blueprint-definition-BHRMFZAC.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  355. /package/dist/lib/node-esm/{blueprint-definition-XYFKMIDR.mjs.map → chunk-HSLMI22Q.mjs.map} +0 -0
@@ -0,0 +1,170 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { type EditorView } from '@codemirror/view';
6
+ import { type Atom, RegistryContext } from '@effect-atom/atom-react';
7
+ import React, { forwardRef, useCallback, useContext, useEffect, useImperativeHandle, useMemo } from 'react';
8
+
9
+ import { useCapabilities } from '@dxos/app-framework/ui';
10
+ import { type ThemedClassName, useThemeContext, useTranslation } from '@dxos/react-ui';
11
+ import {
12
+ type EditorMenuGroup,
13
+ type EditorToolbarState,
14
+ type UseTextEditorProps,
15
+ useTextEditor,
16
+ } from '@dxos/react-ui-editor';
17
+ import {
18
+ type EditorSelectionState,
19
+ type EditorStateStore,
20
+ type EditorViewMode,
21
+ type ThemeExtensionsOptions,
22
+ mobileSlots,
23
+ createBasicExtensions,
24
+ createMarkdownExtensions,
25
+ createThemeExtensions,
26
+ dropFile,
27
+ documentSlots,
28
+ formattingListener,
29
+ processEditorPayload,
30
+ editorClassNames,
31
+ } from '@dxos/ui-editor';
32
+ import { mx } from '@dxos/ui-theme';
33
+ import { isTruthy } from '@dxos/util';
34
+
35
+ import { meta } from '#meta';
36
+ import { MarkdownCapabilities } from '#types';
37
+
38
+ import { type MarkdownEditorToolbarProps } from './MarkdownEditorToolbar';
39
+
40
+ export type MarkdownEditorContentProps = ThemedClassName<{
41
+ id: string;
42
+ attendableId?: string;
43
+ role?: string;
44
+ compact?: boolean;
45
+ viewMode?: EditorViewMode;
46
+ slashCommandGroups?: EditorMenuGroup[];
47
+ editorStateStore?: EditorStateStore;
48
+ toolbarState?: Atom.Writable<EditorToolbarState>;
49
+ onLinkQuery?: (query?: string) => Promise<EditorMenuGroup[]>;
50
+ }> &
51
+ Pick<UseTextEditorProps, 'initialValue' | 'extensions'> &
52
+ Pick<MarkdownEditorToolbarProps, 'onFileUpload'> &
53
+ Pick<ThemeExtensionsOptions, 'slots'>;
54
+
55
+ // TODO(burdon): Move controller to Root.
56
+ export const MarkdownEditorContent = forwardRef<EditorView | null, MarkdownEditorContentProps>(
57
+ (
58
+ {
59
+ classNames,
60
+ id,
61
+ attendableId,
62
+ role,
63
+ compact,
64
+ viewMode,
65
+ initialValue,
66
+ editorStateStore,
67
+ toolbarState,
68
+ extensions,
69
+ slots,
70
+ onFileUpload,
71
+ },
72
+ forwardedRef,
73
+ ) => {
74
+ const { t } = useTranslation(meta.id);
75
+ const { themeMode } = useThemeContext();
76
+ const registry = useContext(RegistryContext);
77
+
78
+ // Callback to update toolbar state atom.
79
+ const updateToolbarState = useCallback(
80
+ (formatting: EditorToolbarState) => {
81
+ if (toolbarState) {
82
+ registry.set(toolbarState, { ...registry.get(toolbarState), ...formatting });
83
+ }
84
+ },
85
+ [registry, toolbarState],
86
+ );
87
+
88
+ // Restore last selection and scroll point.
89
+ const { scrollTo, selection } = useMemo<EditorSelectionState>(() => editorStateStore?.getState(id) ?? {}, [id]);
90
+
91
+ const {
92
+ parentRef,
93
+ view: editorView,
94
+ focusAttributes,
95
+ } = useTextEditor(
96
+ () => ({
97
+ ...(role !== 'section' && {
98
+ id,
99
+ scrollTo,
100
+ selection,
101
+ selectionEnd: true,
102
+ }),
103
+ initialValue,
104
+ extensions: [
105
+ createBasicExtensions({
106
+ readOnly: viewMode === 'readonly',
107
+ placeholder: t('editor.placeholder'),
108
+ scrollPastEnd: !compact,
109
+ search: true,
110
+ }),
111
+ createThemeExtensions({
112
+ themeMode,
113
+ slots: slots ?? (compact ? mobileSlots : documentSlots),
114
+ syntaxHighlighting: true,
115
+ }),
116
+ createMarkdownExtensions(),
117
+ toolbarState && formattingListener(updateToolbarState),
118
+ role !== 'section' &&
119
+ onFileUpload &&
120
+ dropFile({
121
+ // TODO(wittjosiah): Factor out to file uploader plugin.
122
+ onDrop: async (view, { files }) => {
123
+ const file = files[0];
124
+ const info = file && onFileUpload ? await onFileUpload(file) : undefined;
125
+ if (info) {
126
+ processEditorPayload(view, { type: 'image', data: info.url });
127
+ }
128
+ },
129
+ }),
130
+ extensions,
131
+ ].filter(isTruthy),
132
+ }),
133
+ [id, viewMode, themeMode, extensions],
134
+ );
135
+
136
+ useImperativeHandle<EditorView | null, EditorView | null>(forwardedRef, () => editorView, [editorView]);
137
+
138
+ const [editorViewRegistry] = useCapabilities(MarkdownCapabilities.EditorViews);
139
+ useEffect(() => {
140
+ if (editorView && editorViewRegistry) {
141
+ editorViewRegistry.register(attendableId ?? id, editorView, id);
142
+ return () => editorViewRegistry.unregister(attendableId ?? id);
143
+ }
144
+ }, [editorView, editorViewRegistry, attendableId, id]);
145
+
146
+ useTest(editorView);
147
+
148
+ return (
149
+ <div
150
+ {...focusAttributes}
151
+ className={mx(editorClassNames(role), classNames)}
152
+ role='none'
153
+ data-testid='composer.markdownRoot'
154
+ data-popover-collision-boundary={true}
155
+ ref={parentRef}
156
+ />
157
+ );
158
+ },
159
+ );
160
+
161
+ // Expose editor view for playwright tests.
162
+ // TODO(wittjosiah): Find a better way to expose this or find a way to limit it to test runs.
163
+ const useTest = (view: EditorView | null) => {
164
+ useEffect(() => {
165
+ const composer = (window as any).composer;
166
+ if (composer) {
167
+ composer.editorView = view;
168
+ }
169
+ }, [view]);
170
+ };
@@ -0,0 +1,47 @@
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-toolkit';
9
+ import { Editor, type EditorToolbarProps } from '@dxos/react-ui-editor';
10
+ import { composable, composableProps } from '@dxos/ui-theme';
11
+
12
+ import { FileUpload, type FileUploadAction } from './FileUpload';
13
+
14
+ export type MarkdownEditorToolbarProps = {
15
+ id: string;
16
+ editorView?: EditorView;
17
+ onFileUpload?: (file: File) => Promise<FileInfo | undefined>;
18
+ } & Pick<EditorToolbarProps, 'role' | 'customActions' | 'onAction' | 'onViewModeChange'>;
19
+
20
+ export const MarkdownEditorToolbar = composable<HTMLDivElement, MarkdownEditorToolbarProps>(
21
+ ({ id, role, editorView, customActions, onAction, onFileUpload, onViewModeChange, ...props }, forwardedRef) => {
22
+ const { className, ...rest } = composableProps(props);
23
+ const [upload, setUpload] = useState<FileUploadAction | null>(null);
24
+ const uploadRef = useCallback((next: FileUploadAction) => setUpload(() => next), []);
25
+
26
+ if (!editorView) {
27
+ return <div className={className} {...rest} ref={forwardedRef} />;
28
+ }
29
+
30
+ return (
31
+ <div role='none' className='contents' ref={forwardedRef}>
32
+ <Editor.Toolbar
33
+ {...rest}
34
+ classNames={className}
35
+ attendableId={id}
36
+ role={role}
37
+ customActions={customActions}
38
+ onAction={onAction}
39
+ onImageUpload={upload ?? undefined}
40
+ onViewModeChange={onViewModeChange}
41
+ />
42
+
43
+ {onFileUpload && <FileUpload ref={uploadRef} editorView={editorView} onFileUpload={onFileUpload} />}
44
+ </div>
45
+ );
46
+ },
47
+ );
@@ -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,32 @@
4
4
 
5
5
  import React from 'react';
6
6
 
7
- 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';
7
+ import { type AppSurface } from '@dxos/app-toolkit/ui';
8
+ import { Input } from '@dxos/react-ui';
9
+ import { Settings as SettingsForm, type SettingsFieldProps } from '@dxos/react-ui-form';
10
10
 
11
- import { meta } from '../../meta';
12
- import { type Markdown } from '../../types';
11
+ import { meta } from '#meta';
12
+ import { Markdown } from '#types';
13
13
 
14
- export const MarkdownSettings = ({ settings }: { settings: Markdown.Settings }) => {
15
- const { t } = useTranslation(meta.id);
14
+ export type MarkdownSettingsProps = AppSurface.SettingsArticleProps<Markdown.Settings>;
16
15
 
17
- // TODO(wittjosiah): Add skill test confirmation for entering vim mode.
18
- 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>
44
-
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>
67
-
68
- <ControlItemInput title={t('settings toolbar label')}>
69
- <Input.Switch checked={settings.toolbar} onCheckedChange={(checked) => (settings.toolbar = !!checked)} />
70
- </ControlItemInput>
71
-
72
- <ControlItemInput title={t('settings numbered headings label')}>
73
- <Input.Switch
74
- checked={settings.numberedHeadings}
75
- onCheckedChange={(checked) => (settings.numberedHeadings = !!checked)}
76
- />
77
- </ControlItemInput>
16
+ const TypewriterField = ({ value, onChange, readonly }: SettingsFieldProps<string>) => (
17
+ <Input.TextArea disabled={readonly} rows={5} value={value ?? ''} onChange={(event) => onChange(event.target.value)} />
18
+ );
78
19
 
79
- <ControlItemInput title={t('settings folding label')}>
80
- <Input.Switch checked={settings.folding} onCheckedChange={(checked) => (settings.folding = !!checked)} />
81
- </ControlItemInput>
82
-
83
- <ControlItemInput title={t('settings experimental label')}>
84
- <Input.Switch
85
- checked={settings.experimental}
86
- onCheckedChange={(checked) => (settings.experimental = !!checked)}
87
- />
88
- </ControlItemInput>
89
-
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 })}>
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>
20
+ export const MarkdownSettings = ({ settings, onSettingsChange }: MarkdownSettingsProps) => {
21
+ return (
22
+ <SettingsForm.Viewport>
23
+ <SettingsForm.Section title={meta.name ?? 'Editor'}>
24
+ <SettingsForm.FieldSet
25
+ readonly={!onSettingsChange}
26
+ schema={Markdown.Settings}
27
+ visible={(path, values) => path !== 'typewriter' || !!values.debug}
28
+ fieldMap={{ typewriter: TypewriterField }}
29
+ values={settings}
30
+ onValuesChanged={(values) => onSettingsChange?.(() => values)}
31
+ />
32
+ </SettingsForm.Section>
33
+ </SettingsForm.Viewport>
107
34
  );
108
35
  };
@@ -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,10 +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 './MarkdownSettings';
7
+ export * from './MarkdownEditor';
8
8
 
9
- export const MarkdownContainer = lazy(() => import('./MarkdownContainer'));
10
- export const MarkdownCard = lazy(() => import('./MarkdownCard'));
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: '# Title\n' + 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,68 @@
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 { Editor } from '@dxos/react-ui-editor';
10
+ import { Text } from '@dxos/schema';
11
+ import { mx } from '@dxos/ui-theme';
12
+
13
+ import { MarkdownEditor, MarkdownEditorProvider } from '#components';
14
+ import { meta } from '#meta';
15
+ import { Markdown } from '#types';
16
+
17
+ import { getContentSnippet } from '../../util';
18
+ import { snippet as snippetExtension } from './snippet';
19
+
20
+ export type MarkdownCardProps = { subject: Markdown.Document | Text.Text };
21
+
22
+ export const MarkdownCard = ({ subject }: MarkdownCardProps) => {
23
+ const { t } = useTranslation(meta.id);
24
+ const snippet = useMemo(() => getSnippet(subject), [subject]);
25
+ const extensions = useMemo(() => [snippetExtension({ height: 300, scale: 0.8 })], []);
26
+ const info = getInfo(subject);
27
+
28
+ return (
29
+ <Card.Content>
30
+ {snippet && (
31
+ <Card.Section className='relative px-1'>
32
+ <MarkdownEditorProvider id={subject.id} viewMode='readonly' extensions={extensions}>
33
+ {(editorRootProps) => (
34
+ <Editor.Root {...editorRootProps}>
35
+ <MarkdownEditor.Content initialValue={snippet} slots={{ content: { className: 'm-0' } }} />
36
+ </Editor.Root>
37
+ )}
38
+ </MarkdownEditorProvider>
39
+ <div
40
+ role='none'
41
+ className={mx(
42
+ 'z-10 absolute bottom-0 inset-x-0 h-12 w-full',
43
+ 'bg-gradient-to-b from-transparent to-(--surface-bg) pointer-events-none',
44
+ )}
45
+ />
46
+ </Card.Section>
47
+ )}
48
+ <Card.Section>
49
+ <Card.Text classNames='px-1.5 text-xs text-description'>
50
+ {info.words} {t('words.label', { count: info.words })}
51
+ </Card.Text>
52
+ </Card.Section>
53
+ </Card.Content>
54
+ );
55
+ };
56
+
57
+ const getSnippet = (subject: Markdown.Document | Text.Text, fallback?: string, maxLines = 16) => {
58
+ if (Obj.instanceOf(Markdown.Document, subject)) {
59
+ return Obj.getDescription(subject) || getContentSnippet(subject.content?.target?.content ?? fallback, maxLines);
60
+ } else if (Obj.instanceOf(Text.Text, subject)) {
61
+ return getContentSnippet(subject.content ?? fallback, maxLines);
62
+ }
63
+ };
64
+
65
+ const getInfo = (subject: Markdown.Document | Text.Text) => {
66
+ const text = (Obj.instanceOf(Markdown.Document, subject) ? subject.content?.target?.content : subject.content) ?? '';
67
+ return { words: text.split(' ').length };
68
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export { MarkdownCard as default } from './MarkdownCard';
@@ -0,0 +1,52 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { EditorState } from '@codemirror/state';
6
+ import { EditorView } from '@codemirror/view';
7
+
8
+ export type SnippetOptions = {
9
+ /** Maximum height of the editor in pixels. Overflowing content is hidden. */
10
+ height: number;
11
+ /** Zoom factor applied to the editor (e.g. 0.5 renders at 50%). @default 1 */
12
+ scale?: number;
13
+ };
14
+
15
+ /**
16
+ * CodeMirror extension for rendering a non-scrollable snippet of editor content.
17
+ * Constrains the editor to the given height via CSS `max-height`, wraps long
18
+ * lines (`pre-wrap`), and disables scrolling entirely.
19
+ *
20
+ * NOTE: Uses CSS `zoom` rather than `transform: scale` because `zoom` affects
21
+ * layout, so line wrapping fills the full visual width of the container.
22
+ * `transform: scale` only scales paint output, leaving empty space on the right.
23
+ */
24
+ export const snippet = ({ height, scale = 1 }: SnippetOptions) => {
25
+ return [
26
+ EditorState.readOnly.of(true),
27
+ EditorView.editable.of(false),
28
+ EditorState.transactionFilter.of((tr) => {
29
+ if (tr.selection) return []; // Drop any selection changes.
30
+ return tr;
31
+ }),
32
+ EditorView.theme({
33
+ // Outer editor element: clip to the caller-specified height.
34
+ '&': {
35
+ maxHeight: `${height}px`,
36
+ overflow: 'hidden',
37
+ },
38
+ '.cm-scroller': {
39
+ // Prevent scroll; scale up the inner clip so the final pixel height matches `height`.
40
+ maxHeight: `${height / scale}px`,
41
+ overflow: 'hidden !important',
42
+ padding: '0',
43
+ },
44
+ '.cm-content': {
45
+ // zoom (unlike transform: scale) affects layout, so line-wrapping fills the full visual width of the container.
46
+ zoom: scale,
47
+ margin: '0',
48
+ padding: '0',
49
+ },
50
+ }),
51
+ ];
52
+ };