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

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 (244) hide show
  1. package/dist/lib/browser/MarkdownCard-SLM6QZYC.mjs +12 -0
  2. package/dist/lib/browser/MarkdownCard-SLM6QZYC.mjs.map +7 -0
  3. package/dist/lib/browser/MarkdownContainer-UZFQC6XY.mjs +15 -0
  4. package/dist/lib/browser/MarkdownContainer-UZFQC6XY.mjs.map +7 -0
  5. package/dist/lib/browser/{anchor-sort-Z7JQA7RL.mjs → anchor-sort-4XPPLMZS.mjs} +5 -5
  6. package/dist/lib/browser/{anchor-sort-Z7JQA7RL.mjs.map → anchor-sort-4XPPLMZS.mjs.map} +1 -1
  7. package/dist/lib/browser/{app-graph-serializer-ZT5OVF5G.mjs → app-graph-serializer-QQFV4K6P.mjs} +9 -10
  8. package/dist/lib/browser/app-graph-serializer-QQFV4K6P.mjs.map +7 -0
  9. package/dist/lib/browser/blueprint-definition-BC5R3T72.mjs +11 -0
  10. package/dist/lib/browser/blueprint-definition-BC5R3T72.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-VMX5SDGW.mjs → chunk-2LLVTQCK.mjs} +6 -5
  12. package/dist/lib/browser/chunk-2LLVTQCK.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-3VILQLA4.mjs +95 -0
  14. package/dist/lib/browser/chunk-3VILQLA4.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-5AYTOIUF.mjs +822 -0
  16. package/dist/lib/browser/chunk-5AYTOIUF.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-K7ZFMSC4.mjs → chunk-A3CQYGCN.mjs} +8 -4
  18. package/dist/lib/browser/chunk-A3CQYGCN.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-ZGY3DYC2.mjs → chunk-BQTYJOFB.mjs} +5 -7
  20. package/dist/lib/browser/chunk-BQTYJOFB.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-GLEYXJX3.mjs +22 -0
  22. package/dist/lib/browser/chunk-GLEYXJX3.mjs.map +7 -0
  23. package/dist/lib/browser/{chunk-CD4E4K7J.mjs → chunk-IBCHVMZW.mjs} +2 -2
  24. package/dist/lib/browser/{chunk-CD4E4K7J.mjs.map → chunk-IBCHVMZW.mjs.map} +2 -2
  25. package/dist/lib/browser/chunk-JAETS5LE.mjs +106 -0
  26. package/dist/lib/browser/chunk-JAETS5LE.mjs.map +7 -0
  27. package/dist/lib/browser/{chunk-YHMGUSO7.mjs → chunk-UKTCPHLI.mjs} +13 -14
  28. package/dist/lib/browser/chunk-UKTCPHLI.mjs.map +7 -0
  29. package/dist/lib/browser/index.mjs +32 -20
  30. package/dist/lib/browser/index.mjs.map +3 -3
  31. package/dist/lib/browser/{intent-resolver-EBEF7WEI.mjs → intent-resolver-VQGMBNXZ.mjs} +20 -18
  32. package/dist/lib/browser/intent-resolver-VQGMBNXZ.mjs.map +7 -0
  33. package/dist/lib/browser/meta.json +1 -1
  34. package/dist/lib/browser/{react-surface-ZPMZT4VU.mjs → react-surface-WOMJOPJE.mjs} +83 -74
  35. package/dist/lib/browser/react-surface-WOMJOPJE.mjs.map +7 -0
  36. package/dist/lib/browser/{settings-MBDK4TWE.mjs → settings-LBXJHVBU.mjs} +5 -5
  37. package/dist/lib/browser/{settings-MBDK4TWE.mjs.map → settings-LBXJHVBU.mjs.map} +1 -1
  38. package/dist/lib/browser/{state-ZA6PZPUI.mjs → state-BTUKVZHY.mjs} +5 -5
  39. package/dist/lib/browser/state-BTUKVZHY.mjs.map +7 -0
  40. package/dist/lib/browser/toolkit-YPIVDB4A.mjs +66 -0
  41. package/dist/lib/browser/toolkit-YPIVDB4A.mjs.map +7 -0
  42. package/dist/lib/browser/types/index.mjs +2 -2
  43. package/dist/lib/node-esm/MarkdownCard-MCWEFW4F.mjs +13 -0
  44. package/dist/lib/node-esm/MarkdownCard-MCWEFW4F.mjs.map +7 -0
  45. package/dist/lib/node-esm/MarkdownContainer-KAQOK7K5.mjs +16 -0
  46. package/dist/lib/node-esm/MarkdownContainer-KAQOK7K5.mjs.map +7 -0
  47. package/dist/lib/node-esm/{anchor-sort-R6AAKYNG.mjs → anchor-sort-4SXYVYXT.mjs} +5 -5
  48. package/dist/lib/node-esm/{anchor-sort-R6AAKYNG.mjs.map → anchor-sort-4SXYVYXT.mjs.map} +1 -1
  49. package/dist/lib/node-esm/{app-graph-serializer-X4M5QEI6.mjs → app-graph-serializer-KBVRLQN2.mjs} +9 -10
  50. package/dist/lib/node-esm/app-graph-serializer-KBVRLQN2.mjs.map +7 -0
  51. package/dist/lib/node-esm/blueprint-definition-FPNOTEYC.mjs +12 -0
  52. package/dist/lib/node-esm/blueprint-definition-FPNOTEYC.mjs.map +7 -0
  53. package/dist/lib/node-esm/chunk-2Q4WCKWT.mjs +823 -0
  54. package/dist/lib/node-esm/chunk-2Q4WCKWT.mjs.map +7 -0
  55. package/dist/lib/node-esm/chunk-DOB2MJAX.mjs +107 -0
  56. package/dist/lib/node-esm/chunk-DOB2MJAX.mjs.map +7 -0
  57. package/dist/lib/node-esm/chunk-GGKPPGWA.mjs +24 -0
  58. package/dist/lib/node-esm/chunk-GGKPPGWA.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-B3J2M4YL.mjs → chunk-GMMVSXQ6.mjs} +2 -2
  60. package/dist/lib/node-esm/{chunk-B3J2M4YL.mjs.map → chunk-GMMVSXQ6.mjs.map} +2 -2
  61. package/dist/lib/node-esm/{chunk-6GCOJS4Y.mjs → chunk-JELROKGD.mjs} +13 -14
  62. package/dist/lib/node-esm/chunk-JELROKGD.mjs.map +7 -0
  63. package/dist/lib/node-esm/{chunk-LZK3TLKM.mjs → chunk-QH4MC5BE.mjs} +6 -5
  64. package/dist/lib/node-esm/chunk-QH4MC5BE.mjs.map +7 -0
  65. package/dist/lib/node-esm/{chunk-RCIXKCVG.mjs → chunk-SHAMSMKQ.mjs} +5 -7
  66. package/dist/lib/node-esm/chunk-SHAMSMKQ.mjs.map +7 -0
  67. package/dist/lib/node-esm/{chunk-YGNVDYMB.mjs → chunk-SJ2QRGPM.mjs} +8 -4
  68. package/dist/lib/node-esm/chunk-SJ2QRGPM.mjs.map +7 -0
  69. package/dist/lib/node-esm/chunk-YYSASY7X.mjs +96 -0
  70. package/dist/lib/node-esm/chunk-YYSASY7X.mjs.map +7 -0
  71. package/dist/lib/node-esm/index.mjs +32 -20
  72. package/dist/lib/node-esm/index.mjs.map +3 -3
  73. package/dist/lib/node-esm/{intent-resolver-L2UGZ72W.mjs → intent-resolver-Q4XVI5EX.mjs} +20 -18
  74. package/dist/lib/node-esm/intent-resolver-Q4XVI5EX.mjs.map +7 -0
  75. package/dist/lib/node-esm/meta.json +1 -1
  76. package/dist/lib/node-esm/{react-surface-3JJSTTQP.mjs → react-surface-FAMZTAXK.mjs} +83 -74
  77. package/dist/lib/node-esm/react-surface-FAMZTAXK.mjs.map +7 -0
  78. package/dist/lib/node-esm/{settings-LBDWWPZJ.mjs → settings-2YRA67H6.mjs} +5 -5
  79. package/dist/lib/node-esm/{settings-LBDWWPZJ.mjs.map → settings-2YRA67H6.mjs.map} +1 -1
  80. package/dist/lib/node-esm/{state-UIHO2SFZ.mjs → state-K6EH7SRZ.mjs} +5 -5
  81. package/dist/lib/node-esm/state-K6EH7SRZ.mjs.map +7 -0
  82. package/dist/lib/node-esm/toolkit-36BFLIR3.mjs +67 -0
  83. package/dist/lib/node-esm/toolkit-36BFLIR3.mjs.map +7 -0
  84. package/dist/lib/node-esm/types/index.mjs +2 -2
  85. package/dist/types/src/MarkdownPlugin.d.ts +1 -1
  86. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  87. package/dist/types/src/capabilities/anchor-sort.d.ts +2 -2
  88. package/dist/types/src/capabilities/app-graph-serializer.d.ts +1 -1
  89. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -1
  90. package/dist/types/src/capabilities/artifact-definition.d.ts +1 -9
  91. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  92. package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -0
  93. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  94. package/dist/types/src/capabilities/capabilities.d.ts +1 -1
  95. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  96. package/dist/types/src/capabilities/index.d.ts +12 -10
  97. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  98. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  99. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  100. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  101. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  102. package/dist/types/src/capabilities/settings.d.ts +1 -1
  103. package/dist/types/src/capabilities/state.d.ts +2 -2
  104. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  105. package/dist/types/src/capabilities/toolkit.d.ts +20 -0
  106. package/dist/types/src/capabilities/toolkit.d.ts.map +1 -0
  107. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts +7 -0
  108. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts.map +1 -0
  109. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts +9 -0
  110. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts.map +1 -0
  111. package/dist/types/src/components/MarkdownCard/index.d.ts +4 -0
  112. package/dist/types/src/components/MarkdownCard/index.d.ts.map +1 -0
  113. package/dist/types/src/components/MarkdownContainer.d.ts +8 -12
  114. package/dist/types/src/components/MarkdownContainer.d.ts.map +1 -1
  115. package/dist/types/src/components/MarkdownContainer.stories.d.ts +54 -5
  116. package/dist/types/src/components/MarkdownContainer.stories.d.ts.map +1 -1
  117. package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts +11 -0
  118. package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts.map +1 -0
  119. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +42 -23
  120. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
  121. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts +8 -15
  122. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts.map +1 -1
  123. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts +26 -0
  124. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts.map +1 -0
  125. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts +12 -0
  126. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts.map +1 -0
  127. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts.map +1 -1
  128. package/dist/types/src/components/Suggestions.stories.d.ts +1 -2
  129. package/dist/types/src/components/Suggestions.stories.d.ts.map +1 -1
  130. package/dist/types/src/components/index.d.ts +4 -2
  131. package/dist/types/src/components/index.d.ts.map +1 -1
  132. package/dist/types/src/functions/diff.d.ts +6 -0
  133. package/dist/types/src/functions/diff.d.ts.map +1 -0
  134. package/dist/types/src/functions/index.d.ts +3 -0
  135. package/dist/types/src/functions/index.d.ts.map +1 -0
  136. package/dist/types/src/functions/open.d.ts +7 -0
  137. package/dist/types/src/functions/open.d.ts.map +1 -0
  138. package/dist/types/src/hooks/index.d.ts +3 -0
  139. package/dist/types/src/hooks/index.d.ts.map +1 -1
  140. package/dist/types/src/hooks/useExtensions.d.ts +21 -0
  141. package/dist/types/src/hooks/useExtensions.d.ts.map +1 -0
  142. package/dist/types/src/hooks/useLinkQuery.d.ts +4 -0
  143. package/dist/types/src/hooks/useLinkQuery.d.ts.map +1 -0
  144. package/dist/types/src/hooks/usePopoverMenuOptions.d.ts +9 -0
  145. package/dist/types/src/hooks/usePopoverMenuOptions.d.ts.map +1 -0
  146. package/dist/types/src/hooks/useSelectCurrentThread.d.ts +1 -1
  147. package/dist/types/src/hooks/useSelectCurrentThread.d.ts.map +1 -1
  148. package/dist/types/src/index.d.ts +2 -1
  149. package/dist/types/src/index.d.ts.map +1 -1
  150. package/dist/types/src/meta.d.ts +0 -1
  151. package/dist/types/src/meta.d.ts.map +1 -1
  152. package/dist/types/src/translations.d.ts +4 -0
  153. package/dist/types/src/translations.d.ts.map +1 -1
  154. package/dist/types/src/types/Markdown.d.ts +7 -5
  155. package/dist/types/src/types/Markdown.d.ts.map +1 -1
  156. package/dist/types/src/types/MarkdownAction.d.ts +6 -14
  157. package/dist/types/src/types/MarkdownAction.d.ts.map +1 -1
  158. package/dist/types/src/types/types.d.ts.map +1 -1
  159. package/dist/types/src/util.d.ts +1 -1
  160. package/dist/types/src/util.d.ts.map +1 -1
  161. package/dist/types/tsconfig.tsbuildinfo +1 -1
  162. package/package.json +62 -56
  163. package/src/MarkdownPlugin.tsx +103 -94
  164. package/src/capabilities/app-graph-serializer.ts +4 -4
  165. package/src/capabilities/artifact-definition.ts +15 -19
  166. package/src/capabilities/blueprint-definition.ts +39 -0
  167. package/src/capabilities/capabilities.ts +2 -1
  168. package/src/capabilities/index.ts +3 -1
  169. package/src/capabilities/intent-resolver.ts +14 -13
  170. package/src/capabilities/react-surface.tsx +39 -60
  171. package/src/capabilities/state.ts +3 -2
  172. package/src/capabilities/toolkit.ts +53 -0
  173. package/src/components/{MarkdownPreview/MarkdownPreview.stories.tsx → MarkdownCard/MarkdownCard.stories.tsx} +14 -15
  174. package/src/components/{MarkdownPreview/MarkdownPreview.tsx → MarkdownCard/MarkdownCard.tsx} +45 -33
  175. package/src/components/MarkdownCard/index.ts +9 -0
  176. package/src/components/MarkdownContainer.stories.tsx +80 -43
  177. package/src/components/MarkdownContainer.tsx +86 -219
  178. package/src/components/MarkdownEditor/FileUpload.tsx +63 -0
  179. package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +58 -34
  180. package/src/components/MarkdownEditor/MarkdownEditor.tsx +220 -271
  181. package/src/components/MarkdownEditor/MarkdownEditorContent.tsx +134 -0
  182. package/src/components/MarkdownEditor/MarkdownEditorToolbar.tsx +63 -0
  183. package/src/components/MarkdownSettings/MarkdownSettings.tsx +77 -74
  184. package/src/components/Suggestions.stories.tsx +40 -41
  185. package/src/components/index.ts +3 -1
  186. package/src/functions/diff.ts +37 -0
  187. package/src/functions/index.ts +6 -0
  188. package/src/functions/open.ts +32 -0
  189. package/src/hooks/index.ts +3 -0
  190. package/src/{extensions.tsx → hooks/useExtensions.tsx} +61 -119
  191. package/src/hooks/useLinkQuery.ts +82 -0
  192. package/src/hooks/usePopoverMenuOptions.ts +71 -0
  193. package/src/hooks/useSelectCurrentThread.tsx +3 -3
  194. package/src/index.ts +3 -1
  195. package/src/meta.ts +3 -6
  196. package/src/translations.ts +4 -0
  197. package/src/types/Markdown.ts +8 -5
  198. package/src/types/MarkdownAction.ts +5 -6
  199. package/src/types/types.ts +1 -0
  200. package/src/util.tsx +9 -2
  201. package/dist/lib/browser/MarkdownContainer-NNBPE6A5.mjs +0 -779
  202. package/dist/lib/browser/MarkdownContainer-NNBPE6A5.mjs.map +0 -7
  203. package/dist/lib/browser/MarkdownPreview-7VG3K24R.mjs +0 -80
  204. package/dist/lib/browser/MarkdownPreview-7VG3K24R.mjs.map +0 -7
  205. package/dist/lib/browser/app-graph-serializer-ZT5OVF5G.mjs.map +0 -7
  206. package/dist/lib/browser/artifact-definition-7VNP5PCP.mjs +0 -145
  207. package/dist/lib/browser/artifact-definition-7VNP5PCP.mjs.map +0 -7
  208. package/dist/lib/browser/chunk-K7ZFMSC4.mjs.map +0 -7
  209. package/dist/lib/browser/chunk-VCUKIILA.mjs +0 -20
  210. package/dist/lib/browser/chunk-VCUKIILA.mjs.map +0 -7
  211. package/dist/lib/browser/chunk-VMX5SDGW.mjs.map +0 -7
  212. package/dist/lib/browser/chunk-YHMGUSO7.mjs.map +0 -7
  213. package/dist/lib/browser/chunk-ZGY3DYC2.mjs.map +0 -7
  214. package/dist/lib/browser/intent-resolver-EBEF7WEI.mjs.map +0 -7
  215. package/dist/lib/browser/react-surface-ZPMZT4VU.mjs.map +0 -7
  216. package/dist/lib/browser/state-ZA6PZPUI.mjs.map +0 -7
  217. package/dist/lib/node-esm/MarkdownContainer-Q6UO7DKT.mjs +0 -780
  218. package/dist/lib/node-esm/MarkdownContainer-Q6UO7DKT.mjs.map +0 -7
  219. package/dist/lib/node-esm/MarkdownPreview-UVWR2YK3.mjs +0 -81
  220. package/dist/lib/node-esm/MarkdownPreview-UVWR2YK3.mjs.map +0 -7
  221. package/dist/lib/node-esm/app-graph-serializer-X4M5QEI6.mjs.map +0 -7
  222. package/dist/lib/node-esm/artifact-definition-IRIILD7S.mjs +0 -146
  223. package/dist/lib/node-esm/artifact-definition-IRIILD7S.mjs.map +0 -7
  224. package/dist/lib/node-esm/chunk-6GCOJS4Y.mjs.map +0 -7
  225. package/dist/lib/node-esm/chunk-A7LLVI34.mjs +0 -22
  226. package/dist/lib/node-esm/chunk-A7LLVI34.mjs.map +0 -7
  227. package/dist/lib/node-esm/chunk-LZK3TLKM.mjs.map +0 -7
  228. package/dist/lib/node-esm/chunk-RCIXKCVG.mjs.map +0 -7
  229. package/dist/lib/node-esm/chunk-YGNVDYMB.mjs.map +0 -7
  230. package/dist/lib/node-esm/intent-resolver-L2UGZ72W.mjs.map +0 -7
  231. package/dist/lib/node-esm/react-surface-3JJSTTQP.mjs.map +0 -7
  232. package/dist/lib/node-esm/state-UIHO2SFZ.mjs.map +0 -7
  233. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.d.ts +0 -6
  234. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.d.ts.map +0 -1
  235. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts +0 -10
  236. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts.map +0 -1
  237. package/dist/types/src/components/MarkdownPreview/index.d.ts +0 -4
  238. package/dist/types/src/components/MarkdownPreview/index.d.ts.map +0 -1
  239. package/dist/types/src/components/Toolbar.stories.d.ts +0 -11
  240. package/dist/types/src/components/Toolbar.stories.d.ts.map +0 -1
  241. package/dist/types/src/extensions.d.ts +0 -24
  242. package/dist/types/src/extensions.d.ts.map +0 -1
  243. package/src/components/MarkdownPreview/index.ts +0 -9
  244. package/src/components/Toolbar.stories.tsx +0 -112
@@ -6,28 +6,27 @@ import { type ViewUpdate } from '@codemirror/view';
6
6
  import React, { type AnchorHTMLAttributes, type ReactNode, useMemo } from 'react';
7
7
  import { createRoot } from 'react-dom/client';
8
8
 
9
- import {
10
- createIntent,
11
- LayoutAction,
12
- type PromiseIntentDispatcher,
13
- useCapabilities,
14
- useIntentDispatcher,
15
- } from '@dxos/app-framework';
9
+ import { LayoutAction, type PromiseIntentDispatcher, createIntent, useIntentDispatcher } from '@dxos/app-framework';
16
10
  import { debounceAndThrottle } from '@dxos/async';
11
+ import { Obj } from '@dxos/echo';
17
12
  import { invariant } from '@dxos/invariant';
18
- import { createDocAccessor, fullyQualifiedId, getSpace, type QueryResult } from '@dxos/react-client/echo';
13
+ import { createDocAccessor, fullyQualifiedId } from '@dxos/react-client/echo';
14
+ import { getSpace } from '@dxos/react-client/echo';
19
15
  import { useIdentity } from '@dxos/react-client/halo';
20
16
  import { Icon, ThemeProvider } from '@dxos/react-ui';
21
17
  import { type SelectionManager } from '@dxos/react-ui-attention';
22
18
  import {
23
- type AutocompleteResult,
19
+ Cursor,
24
20
  type EditorStateStore,
21
+ EditorView,
25
22
  type EditorViewMode,
26
23
  type Extension,
27
24
  InputModeExtensions,
25
+ type PreviewOptions,
26
+ type RenderCallback,
28
27
  createDataExtensions,
29
- autocomplete,
30
28
  decorateMarkdown,
29
+ documentId,
31
30
  folding,
32
31
  formattingKeymap,
33
32
  linkTooltip,
@@ -35,27 +34,21 @@ import {
35
34
  preview,
36
35
  selectionState,
37
36
  typewriter,
38
- type RenderCallback,
39
- EditorView,
40
- documentId,
41
- Cursor,
42
- type PreviewOptions,
43
37
  } from '@dxos/react-ui-editor';
44
38
  import { defaultTx } from '@dxos/react-ui-theme';
45
- import { type DataType } from '@dxos/schema';
46
- import { isNotFalsy } from '@dxos/util';
39
+ import { DataType } from '@dxos/schema';
40
+ import { isTruthy } from '@dxos/util';
41
+
42
+ import { Markdown } from '../types';
43
+ import { setFallbackName } from '../util';
47
44
 
48
- import { MarkdownCapabilities } from './capabilities';
49
- import { type Markdown } from './types';
50
- import { setFallbackName } from './util';
45
+ export type DocumentType = Markdown.Document | DataType.Text | { id: string; text: string };
51
46
 
52
- type ExtensionsOptions = {
53
- document?: Markdown.Document;
54
- id?: string;
55
- text?: DataType.Text;
47
+ export type ExtensionsOptions = {
48
+ id: string;
49
+ object?: DocumentType;
56
50
  dispatch?: PromiseIntentDispatcher;
57
- query?: QueryResult<Markdown.Document>;
58
- settings: Markdown.Settings;
51
+ settings?: Markdown.Settings;
59
52
  selectionManager?: SelectionManager;
60
53
  viewMode?: EditorViewMode;
61
54
  editorStateStore?: EditorStateStore;
@@ -64,9 +57,8 @@ type ExtensionsOptions = {
64
57
 
65
58
  // TODO(burdon): Merge with createBaseExtensions below.
66
59
  export const useExtensions = ({
67
- document,
68
60
  id,
69
- text,
61
+ object,
70
62
  settings,
71
63
  selectionManager,
72
64
  viewMode,
@@ -75,93 +67,66 @@ export const useExtensions = ({
75
67
  }: ExtensionsOptions): Extension[] => {
76
68
  const { dispatchPromise: dispatch } = useIntentDispatcher();
77
69
  const identity = useIdentity();
78
- const space = getSpace(document) ?? getSpace(text);
70
+ const space = getSpace(object);
71
+
72
+ let target: Obj.Any | undefined;
73
+ if (Obj.instanceOf(Markdown.Document, object)) {
74
+ target = (object as Markdown.Document).content.target;
75
+ } else if (Obj.instanceOf(DataType.Text, object)) {
76
+ target = object;
77
+ }
79
78
 
80
79
  // TODO(wittjosiah): Autocomplete is not working and this query is causing performance issues.
81
80
  // TODO(burdon): Unsubscribe.
82
81
  // const query = space?.db.query(Filter.type(DocumentType));
83
82
  // query?.subscribe();
83
+
84
84
  const baseExtensions = useMemo(
85
85
  () =>
86
86
  createBaseExtensions({
87
- document,
88
87
  id,
89
- text,
88
+ object,
90
89
  settings,
91
90
  selectionManager,
92
91
  viewMode,
93
92
  previewOptions,
94
93
  dispatch,
95
- // query,
96
94
  }),
97
95
  [
98
- document,
99
96
  id,
100
- text,
97
+ object,
101
98
  viewMode,
102
99
  dispatch,
103
100
  previewOptions,
104
101
  settings,
105
- settings.editorInputMode,
106
- settings.folding,
107
- settings.numberedHeadings,
108
- settings.debug,
109
- settings.typewriter,
102
+ settings?.debug,
103
+ settings?.editorInputMode,
104
+ settings?.folding,
105
+ settings?.numberedHeadings,
106
+ settings?.typewriter,
110
107
  selectionManager,
111
108
  ],
112
109
  );
113
110
 
114
- const extensionProviders = useCapabilities(MarkdownCapabilities.Extensions);
115
-
116
- //
117
- // External extensions from other plugins.
118
- //
119
- const pluginExtensions = useMemo<Extension[]>(() => {
120
- if (!document) {
121
- return [];
122
- }
123
-
124
- return extensionProviders.flat().reduce((acc: Extension[], provider) => {
125
- const extension = typeof provider === 'function' ? provider({ document }) : provider;
126
- if (extension) {
127
- acc.push(extension);
128
- }
129
-
130
- return acc;
131
- }, []);
132
- }, [extensionProviders, document]);
133
-
134
- //
135
- // Basic plugins.
136
- //
137
111
  return useMemo<Extension[]>(
138
112
  () =>
139
113
  [
114
+ // TODO(burdon): Pass this in?
140
115
  // NOTE: Data extensions must be first so that automerge is updated before other extensions compute their state.
141
- document &&
142
- createDataExtensions({
143
- id: document.id,
144
- text: document.content.target && createDocAccessor(document.content.target, ['content']),
145
- space,
146
- identity,
147
- }),
148
- text &&
149
- id &&
150
- createDataExtensions({
151
- id,
152
- text: createDocAccessor(text, ['content']),
153
- space,
154
- identity,
155
- }),
156
- selectionState(editorStateStore),
157
- document &&
116
+ target && createDataExtensions({ id, text: createDocAccessor(target, ['content']), space, identity }),
117
+
118
+ // TODO(burdon): Reconcile with effect in parent.
119
+ Obj.instanceOf(Markdown.Document, object) &&
158
120
  listener({
159
- onChange: (text) => setFallbackName(document, text),
121
+ onChange: ({ text }) => {
122
+ setFallbackName(object as Markdown.Document, text);
123
+ },
160
124
  }),
125
+
161
126
  baseExtensions,
162
- pluginExtensions,
163
- ].filter(isNotFalsy),
164
- [baseExtensions, pluginExtensions, document, document?.content?.target, text, id, space, identity],
127
+ selectionState(editorStateStore),
128
+ ].filter(isTruthy),
129
+ [identity, space, id, object, target, baseExtensions],
165
130
  );
166
131
  };
167
132
 
@@ -169,20 +134,19 @@ export const useExtensions = ({
169
134
  * Create extension instances for editor.
170
135
  */
171
136
  const createBaseExtensions = ({
172
- document,
173
137
  id,
138
+ object,
174
139
  dispatch,
175
140
  settings,
176
141
  selectionManager,
177
- query,
178
142
  viewMode,
179
143
  previewOptions,
180
144
  }: ExtensionsOptions): Extension[] => {
181
145
  const extensions: Extension[] = [
182
146
  selectionManager && selectionChange(selectionManager),
183
- settings.editorInputMode && InputModeExtensions[settings.editorInputMode],
184
- settings.folding && folding(),
185
- ].filter(isNotFalsy);
147
+ settings?.editorInputMode && InputModeExtensions[settings.editorInputMode],
148
+ settings?.folding && folding(),
149
+ ].filter(isTruthy);
186
150
 
187
151
  //
188
152
  // Markdown
@@ -193,17 +157,18 @@ const createBaseExtensions = ({
193
157
  formattingKeymap(),
194
158
  decorateMarkdown({
195
159
  selectionChangeDelay: 100,
196
- numberedHeadings: settings.numberedHeadings ? { from: 2 } : undefined,
160
+ numberedHeadings: settings?.numberedHeadings ? { from: 2 } : undefined,
197
161
  // TODO(wittjosiah): For internal links, consider ignoring the link text and rendering the label of the object being linked to.
162
+ // TODO(burdon): Create dx-tag.
198
163
  renderLinkButton:
199
- dispatch && (document || id)
164
+ dispatch && (object || id)
200
165
  ? createLinkRenderer((id: string) => {
201
166
  void dispatch(
202
167
  createIntent(LayoutAction.Open, {
203
168
  part: 'main',
204
169
  subject: [id],
205
170
  options: {
206
- pivotId: document ? fullyQualifiedId(document) : id,
171
+ pivotId: object ? fullyQualifiedId(object) : id,
207
172
  },
208
173
  }),
209
174
  );
@@ -216,31 +181,7 @@ const createBaseExtensions = ({
216
181
  );
217
182
  }
218
183
 
219
- //
220
- // Autocomplete object links.
221
- //
222
- if (query) {
223
- extensions.push(
224
- autocomplete({
225
- onSearch: (text: string) => {
226
- // TODO(burdon): Specify filter (e.g., stack).
227
- return query.objects
228
- .map<AutocompleteResult | undefined>((object) =>
229
- object.name?.length && object.id !== document?.id
230
- ? {
231
- label: object.name,
232
- // TODO(burdon): Factor out URL builder.
233
- apply: `[${object.name}](/${fullyQualifiedId(object)})`,
234
- }
235
- : undefined,
236
- )
237
- .filter(isNotFalsy);
238
- },
239
- }),
240
- );
241
- }
242
-
243
- if (settings.debug) {
184
+ if (settings?.debug) {
244
185
  const items = settings.typewriter?.split(/[,\n]/) ?? '';
245
186
  if (items) {
246
187
  extensions.push(typewriter({ items }));
@@ -250,7 +191,7 @@ const createBaseExtensions = ({
250
191
  return extensions;
251
192
  };
252
193
 
253
- export const selectionChange = (selectionManager: SelectionManager) => {
194
+ const selectionChange = (selectionManager: SelectionManager) => {
254
195
  return EditorView.updateListener.of(
255
196
  debounceAndThrottle((update: ViewUpdate) => {
256
197
  if (update.selectionSet) {
@@ -263,6 +204,7 @@ export const selectionChange = (selectionManager: SelectionManager) => {
263
204
  to: cursorConverter.toCursor(range.to),
264
205
  }))
265
206
  .filter(({ from, to }) => to > from);
207
+
266
208
  selectionManager.updateMultiRange(id, ranges);
267
209
  }
268
210
  }, 100),
@@ -321,8 +263,8 @@ const renderLinkTooltip: RenderCallback<{ url: string }> = (el, { url }) => {
321
263
  );
322
264
  };
323
265
 
324
- // TODO(burdon): Remove react rendering; use DOM directly.
325
- export const renderRoot = <T extends Element>(root: T, node: ReactNode): T => {
266
+ // TODO(burdon): REMOVE.
267
+ const renderRoot = <T extends Element>(root: T, node: ReactNode): T => {
326
268
  createRoot(root).render(<ThemeProvider tx={defaultTx}>{node}</ThemeProvider>);
327
269
  return root;
328
270
  };
@@ -0,0 +1,82 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { useCallback, useMemo } from 'react';
6
+
7
+ import { Capabilities, useCapabilities, usePluginManager } from '@dxos/app-framework';
8
+ import { Filter, Obj, Query, Type } from '@dxos/echo';
9
+ import { ClientCapabilities } from '@dxos/plugin-client';
10
+ import { SpaceCapabilities } from '@dxos/plugin-space';
11
+ import { type Space } from '@dxos/react-client/echo';
12
+ import { toLocalizedString, useTranslation } from '@dxos/react-ui';
13
+ import { type PopoverMenuGroup, type PopoverMenuItem, insertAtCursor, insertAtLineStart } from '@dxos/react-ui-editor';
14
+
15
+ export const useLinkQuery = (space: Space | undefined) => {
16
+ const { t } = useTranslation();
17
+
18
+ const manager = usePluginManager();
19
+ const resolve = useCallback(
20
+ (typename: string) =>
21
+ manager.context.getCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {},
22
+ [manager],
23
+ );
24
+
25
+ const objectForms = useCapabilities(SpaceCapabilities.ObjectForm);
26
+ const schemaWhiteList = useCapabilities(ClientCapabilities.SchemaWhiteList);
27
+ const filter = useMemo(
28
+ () =>
29
+ Filter.or(
30
+ ...objectForms.map((form) => Filter.type(form.objectSchema)),
31
+ ...schemaWhiteList.flat().map((schema) => Filter.typename(Type.getTypename(schema))),
32
+ ),
33
+ [objectForms, schemaWhiteList],
34
+ );
35
+
36
+ const handleLinkQuery = useCallback(
37
+ async (query?: string): Promise<PopoverMenuGroup[]> => {
38
+ const name = query?.startsWith('@') ? query.slice(1).toLowerCase() : (query?.toLowerCase() ?? '');
39
+ const results = await space?.db.query(Query.select(filter)).run();
40
+
41
+ // TODO(wittjosiah): Use `Obj.Any` type.
42
+ const getLabel = (object: any) => {
43
+ const label = Obj.getLabel(object);
44
+ if (label) {
45
+ return label;
46
+ }
47
+
48
+ // TODO(wittjosiah): Remove metadata labels.
49
+ const type = Obj.getTypename(object)!;
50
+ const metadata = resolve(type);
51
+ return metadata.label?.(object) || ['object name placeholder', { ns: type, default: 'New object' }];
52
+ };
53
+
54
+ const items =
55
+ results?.objects
56
+ .filter((object) => toLocalizedString(getLabel(object), t).toLowerCase().includes(name))
57
+ // TODO(wittjosiah): Remove `any` type.
58
+ .map((object: any): PopoverMenuItem => {
59
+ const metadata = resolve(Obj.getTypename(object)!);
60
+ const label = toLocalizedString(getLabel(object), t);
61
+ return {
62
+ id: object.id,
63
+ label,
64
+ icon: metadata.icon,
65
+ onSelect: (view, head) => {
66
+ const link = `[${label}](${Obj.getDXN(object)})`;
67
+ if (query?.startsWith('@')) {
68
+ insertAtLineStart(view, head, `!${link}\n`);
69
+ } else {
70
+ insertAtCursor(view, head, `${link} `);
71
+ }
72
+ },
73
+ };
74
+ }) ?? [];
75
+
76
+ return [{ id: 'echo', items }];
77
+ },
78
+ [space, filter, resolve],
79
+ );
80
+
81
+ return handleLinkQuery;
82
+ };
@@ -0,0 +1,71 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type EditorView } from '@codemirror/view';
6
+ import { useCallback, useMemo, useRef } from 'react';
7
+
8
+ import { Domino, toLocalizedString, useTranslation } from '@dxos/react-ui';
9
+ import {
10
+ type PopoverMenuGroup,
11
+ type UsePopoverMenuProps,
12
+ filterMenuGroups,
13
+ formattingCommands,
14
+ linkSlashCommands,
15
+ } from '@dxos/react-ui-editor';
16
+
17
+ import { meta } from '../meta';
18
+
19
+ export type UsePopoverMenuOptionsProps = {
20
+ editorView?: EditorView;
21
+ slashCommandGroups?: PopoverMenuGroup[];
22
+ onLinkQuery?: (query?: string) => Promise<PopoverMenuGroup[]>;
23
+ };
24
+
25
+ export const usePopoverMenuOptions = ({
26
+ editorView,
27
+ slashCommandGroups,
28
+ onLinkQuery,
29
+ }: UsePopoverMenuOptionsProps): UsePopoverMenuProps => {
30
+ const { t } = useTranslation(meta.id);
31
+
32
+ const getMenu = useCallback<NonNullable<UsePopoverMenuProps['getMenu']>>(
33
+ ({ text, trigger }) => {
34
+ switch (trigger) {
35
+ case '@': {
36
+ return onLinkQuery?.(text) ?? [];
37
+ }
38
+
39
+ case '/':
40
+ default: {
41
+ return filterMenuGroups([formattingCommands, linkSlashCommands, ...(slashCommandGroups ?? [])], (item) =>
42
+ text ? toLocalizedString(item.label, t).toLowerCase().includes(text.toLowerCase()) : true,
43
+ );
44
+ }
45
+ }
46
+ },
47
+ [slashCommandGroups, onLinkQuery],
48
+ );
49
+
50
+ const viewRef = useRef(editorView);
51
+ return useMemo<UsePopoverMenuProps>(() => {
52
+ const trigger = onLinkQuery ? ['/', '@'] : ['/'];
53
+ const placeholder = {
54
+ delay: 3_000,
55
+ content: () =>
56
+ Domino.of('div')
57
+ .children(
58
+ Domino.of('span').text('Press'),
59
+ ...trigger.map((text) =>
60
+ Domino.of('span')
61
+ .classNames('mx-1 px-1.5 pt-[1px] pb-[2px] border border-separator rounded-sm')
62
+ .text(text),
63
+ ),
64
+ Domino.of('span').text('for commands.'),
65
+ )
66
+ .build(),
67
+ };
68
+
69
+ return { viewRef, getMenu, trigger, placeholder };
70
+ }, [getMenu, onLinkQuery]);
71
+ };
@@ -3,10 +3,10 @@
3
3
  //
4
4
 
5
5
  import { EditorView } from '@codemirror/view';
6
- import { Schema } from 'effect';
6
+ import * as Schema from 'effect/Schema';
7
7
  import { useMemo } from 'react';
8
8
 
9
- import { createResolver, LayoutAction, useIntentResolver } from '@dxos/app-framework';
9
+ import { LayoutAction, createResolver, useIntentResolver } from '@dxos/app-framework';
10
10
  import { invariant } from '@dxos/invariant';
11
11
  import { Cursor, setSelection } from '@dxos/react-ui-editor';
12
12
 
@@ -15,7 +15,7 @@ import { meta } from '../meta';
15
15
  /**
16
16
  * Handle scrolling and selection of the current thread in a markdown editor.
17
17
  */
18
- export const useSelectCurrentThread = (editorView: EditorView | undefined, documentId: string) => {
18
+ export const useSelectCurrentThread = (editorView: EditorView | null, documentId: string) => {
19
19
  const scrollIntoViewResolver = useMemo(
20
20
  () =>
21
21
  createResolver({
package/src/index.ts CHANGED
@@ -5,6 +5,8 @@
5
5
  export { MarkdownCapabilities } from './capabilities';
6
6
  export { MarkdownEvents } from './events';
7
7
 
8
- export * from './MarkdownPlugin';
9
8
  export * from './meta';
9
+ export * from './types';
10
10
  export * from './util';
11
+
12
+ export * from './MarkdownPlugin';
package/src/meta.ts CHANGED
@@ -9,14 +9,11 @@ export const meta: PluginMeta = {
9
9
  id: 'dxos.org/plugin/markdown',
10
10
  name: 'Markdown',
11
11
  description: trim`
12
- A collaborative and extensible Markdown editor.
13
- In addition to markdown capabilities, the plugin supports collaborative in-line comments.
14
- You can use documents to extend the memory of your personal agents and add context for automated workflows.
12
+ Full-featured collaborative markdown editor with real-time editing, inline comments, and rich formatting.
13
+ Supports AI-powered editing assistance and seamlessly integrates with other workspace objects.
15
14
  `,
16
15
  icon: 'ph--text-aa--regular',
16
+ iconHue: 'indigo',
17
17
  source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-markdown',
18
18
  screenshots: ['https://dxos.network/plugin-details-markdown-dark.png'],
19
19
  };
20
-
21
- // TODO(burdon): Workaround for suspected vitest bug?
22
- export const not_meta = meta;
@@ -21,6 +21,7 @@ export const translations = [
21
21
  },
22
22
  [meta.id]: {
23
23
  'plugin name': 'Editor',
24
+ 'settings title': 'Editor settings',
24
25
  'choose markdown from space dialog title': 'Choose one or more documents to add',
25
26
  // TODO(burdon): Style-guide for user-facing text (e.g., hints, questions, capitalization, etc.)
26
27
  'empty choose markdown from space message': 'None available; try creating a new one instead?',
@@ -42,6 +43,9 @@ export const translations = [
42
43
  'upload image label': 'Upload image',
43
44
  'fallback title': 'Untitled',
44
45
  'navigate to document label': 'Open document',
46
+ 'words label_zero': 'words',
47
+ 'words label_one': 'word',
48
+ 'words label_other': 'words',
45
49
  },
46
50
  },
47
51
  },
@@ -2,26 +2,29 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { Schema } from 'effect';
5
+ import * as Schema from 'effect/Schema';
6
6
 
7
7
  import { Obj, Ref, Type } from '@dxos/echo';
8
- import { LabelAnnotation } from '@dxos/echo-schema';
8
+ import { DescriptionAnnotation, FormAnnotation, LabelAnnotation } from '@dxos/echo/internal';
9
9
  import { EditorInputMode, EditorViewMode } from '@dxos/react-ui-editor/types';
10
- import { DataType } from '@dxos/schema';
10
+ import { DataType, ItemAnnotation } from '@dxos/schema';
11
11
 
12
12
  /**
13
13
  * Document Item type.
14
14
  */
15
15
  export const Document = Schema.Struct({
16
16
  name: Schema.optional(Schema.String),
17
- fallbackName: Schema.optional(Schema.String),
18
- content: Type.Ref(DataType.Text),
17
+ description: Schema.optional(Schema.String),
18
+ fallbackName: Schema.String.pipe(FormAnnotation.set(false), Schema.optional),
19
+ content: Type.Ref(DataType.Text).pipe(FormAnnotation.set(false)),
19
20
  }).pipe(
20
21
  Type.Obj({
21
22
  typename: 'dxos.org/type/Document',
22
23
  version: '0.1.0',
23
24
  }),
24
25
  LabelAnnotation.set(['name', 'fallbackName']),
26
+ DescriptionAnnotation.set('description'),
27
+ ItemAnnotation.set(true),
25
28
  );
26
29
 
27
30
  export type Document = Schema.Schema.Type<typeof Document>;
@@ -2,17 +2,16 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { Schema } from 'effect';
5
+ import * as Schema from 'effect/Schema';
6
6
 
7
- import { Type } from '@dxos/echo';
8
7
  import { EditorViewMode } from '@dxos/react-ui-editor/types';
9
8
 
9
+ import { meta } from '../meta';
10
+
10
11
  import { Document } from './Markdown';
11
- import { not_meta } from '../meta';
12
12
 
13
- export class Create extends Schema.TaggedClass<Create>()(`${not_meta.id}/action/create`, {
13
+ export class Create extends Schema.TaggedClass<Create>()(`${meta.id}/action/create`, {
14
14
  input: Schema.Struct({
15
- spaceId: Type.SpaceId,
16
15
  name: Schema.optional(Schema.String),
17
16
  content: Schema.optional(Schema.String),
18
17
  }),
@@ -21,7 +20,7 @@ export class Create extends Schema.TaggedClass<Create>()(`${not_meta.id}/action/
21
20
  }),
22
21
  }) {}
23
22
 
24
- export class SetViewMode extends Schema.TaggedClass<SetViewMode>()(`${not_meta.id}/action/set-view-mode`, {
23
+ export class SetViewMode extends Schema.TaggedClass<SetViewMode>()(`${meta.id}/action/set-view-mode`, {
25
24
  input: Schema.Struct({
26
25
  id: Schema.String,
27
26
  viewMode: EditorViewMode,
@@ -8,6 +8,7 @@ import { type EditorViewMode } from '@dxos/react-ui-editor/types';
8
8
  import { type Document } from './Markdown';
9
9
 
10
10
  // TODO(burdon): Remove these from ./types since not part of plugin-markdown API?
11
+ // TODO(wittjosiah): MarkdownExtensionProvider is a part of the MarkdownCapabilities api which should be in ./types.
11
12
 
12
13
  // TODO(burdon): Async?
13
14
  export type MarkdownExtensionProvider = (props: { document?: Document }) => Extension | undefined;
package/src/util.tsx CHANGED
@@ -36,8 +36,15 @@ export const getFallbackName = (content: string) => {
36
36
  return content.substring(0, 31).split('\n')[0].replaceAll(nonTitleChars, '').trim();
37
37
  };
38
38
 
39
- export const getAbstract = (content: string) => {
40
- return content.substring(0, 128).split('\n')[0].replaceAll(nonTitleChars, '').trim();
39
+ export const getContentSnippet = (content: string) => {
40
+ const abstract = content
41
+ .split('\n')
42
+ .filter((line) => !line.startsWith('#'))
43
+ .filter((line) => line.trim() !== '')[0]
44
+ .replaceAll(nonTitleChars, '')
45
+ .trim();
46
+
47
+ return abstract + '...';
41
48
  };
42
49
 
43
50
  export const setFallbackName = debounce((doc: Markdown.Document, content: string) => {