@dxos/plugin-markdown 0.8.4-main.dedc0f3 → 0.8.4-main.e8ec1fe

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 (241) hide show
  1. package/dist/lib/browser/MarkdownCard-JYMDPKV5.mjs +12 -0
  2. package/dist/lib/browser/MarkdownContainer-Y75XSVBX.mjs +15 -0
  3. package/dist/lib/browser/{anchor-sort-E33BSTYF.mjs → anchor-sort-3HGPGCOO.mjs} +6 -7
  4. package/dist/lib/browser/anchor-sort-3HGPGCOO.mjs.map +7 -0
  5. package/dist/lib/browser/{app-graph-serializer-OX62DNPT.mjs → app-graph-serializer-POZN234F.mjs} +10 -10
  6. package/dist/lib/browser/app-graph-serializer-POZN234F.mjs.map +7 -0
  7. package/dist/lib/browser/blueprint-definition-GIPKFDY5.mjs +13 -0
  8. package/dist/lib/browser/blueprint-definition-GIPKFDY5.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-Z7P6JGGW.mjs → chunk-22XSSNBS.mjs} +7 -4
  10. package/dist/lib/browser/{chunk-Z7P6JGGW.mjs.map → chunk-22XSSNBS.mjs.map} +2 -2
  11. package/dist/lib/browser/chunk-2MLGSYRN.mjs +20 -0
  12. package/dist/lib/browser/chunk-2MLGSYRN.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-ODB2PTBP.mjs → chunk-BQTYJOFB.mjs} +4 -4
  14. package/dist/lib/browser/chunk-BQTYJOFB.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-LAVZ2W6X.mjs → chunk-GH6GQSBL.mjs} +9 -8
  16. package/dist/lib/browser/chunk-GH6GQSBL.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-OY6CGPOO.mjs → chunk-IBCHVMZW.mjs} +2 -2
  18. package/dist/lib/browser/{chunk-OY6CGPOO.mjs.map → chunk-IBCHVMZW.mjs.map} +2 -2
  19. package/dist/lib/browser/chunk-K3LXOU3E.mjs +827 -0
  20. package/dist/lib/browser/chunk-K3LXOU3E.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-PBJLFIOX.mjs +96 -0
  22. package/dist/lib/browser/chunk-PBJLFIOX.mjs.map +7 -0
  23. package/dist/lib/browser/{chunk-BEE7VQPU.mjs → chunk-QYSEJ5GP.mjs} +13 -12
  24. package/dist/lib/browser/chunk-QYSEJ5GP.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-Y53FQREH.mjs +150 -0
  26. package/dist/lib/browser/chunk-Y53FQREH.mjs.map +7 -0
  27. package/dist/lib/browser/index.mjs +25 -24
  28. package/dist/lib/browser/index.mjs.map +3 -3
  29. package/dist/lib/browser/{intent-resolver-WDDH56JC.mjs → intent-resolver-Z5L7TXUK.mjs} +8 -8
  30. package/dist/lib/browser/intent-resolver-Z5L7TXUK.mjs.map +7 -0
  31. package/dist/lib/browser/meta.json +1 -1
  32. package/dist/lib/browser/{react-surface-L3NTMD4D.mjs → react-surface-GO5ZOKNN.mjs} +59 -63
  33. package/dist/lib/browser/react-surface-GO5ZOKNN.mjs.map +7 -0
  34. package/dist/lib/browser/{settings-AABBTB4Q.mjs → settings-TZUDB5EW.mjs} +5 -5
  35. package/dist/lib/browser/{settings-AABBTB4Q.mjs.map → settings-TZUDB5EW.mjs.map} +1 -1
  36. package/dist/lib/browser/{state-FTHQQX7V.mjs → state-BTUKVZHY.mjs} +5 -5
  37. package/dist/lib/browser/{state-FTHQQX7V.mjs.map → state-BTUKVZHY.mjs.map} +1 -1
  38. package/dist/lib/browser/toolkit.mjs +13 -0
  39. package/dist/lib/browser/toolkit.mjs.map +7 -0
  40. package/dist/lib/browser/types/index.mjs +2 -2
  41. package/dist/lib/node-esm/MarkdownCard-ZXPJLUYO.mjs +13 -0
  42. package/dist/lib/node-esm/MarkdownCard-ZXPJLUYO.mjs.map +7 -0
  43. package/dist/lib/node-esm/MarkdownContainer-YRDSRDCS.mjs +16 -0
  44. package/dist/lib/node-esm/MarkdownContainer-YRDSRDCS.mjs.map +7 -0
  45. package/dist/lib/node-esm/{anchor-sort-ALP2NH24.mjs → anchor-sort-PCDXEBJ2.mjs} +6 -7
  46. package/dist/lib/node-esm/anchor-sort-PCDXEBJ2.mjs.map +7 -0
  47. package/dist/lib/node-esm/{app-graph-serializer-56TD3BMX.mjs → app-graph-serializer-NF65JYAS.mjs} +10 -10
  48. package/dist/lib/node-esm/app-graph-serializer-NF65JYAS.mjs.map +7 -0
  49. package/dist/lib/node-esm/blueprint-definition-ENKJZYQS.mjs +14 -0
  50. package/dist/lib/node-esm/blueprint-definition-ENKJZYQS.mjs.map +7 -0
  51. package/dist/lib/node-esm/{chunk-J7A6TUB2.mjs → chunk-AMHACOXW.mjs} +7 -4
  52. package/dist/lib/node-esm/{chunk-J7A6TUB2.mjs.map → chunk-AMHACOXW.mjs.map} +2 -2
  53. package/dist/lib/node-esm/chunk-CT7CFX5G.mjs +828 -0
  54. package/dist/lib/node-esm/chunk-CT7CFX5G.mjs.map +7 -0
  55. package/dist/lib/node-esm/{chunk-CB2R4YIY.mjs → chunk-GMMVSXQ6.mjs} +2 -2
  56. package/dist/lib/node-esm/{chunk-CB2R4YIY.mjs.map → chunk-GMMVSXQ6.mjs.map} +2 -2
  57. package/dist/lib/node-esm/chunk-HAIEWPU7.mjs +151 -0
  58. package/dist/lib/node-esm/chunk-HAIEWPU7.mjs.map +7 -0
  59. package/dist/lib/node-esm/chunk-KCHUTL3Q.mjs +22 -0
  60. package/dist/lib/node-esm/chunk-KCHUTL3Q.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-FXILAQ5F.mjs → chunk-NGYJNQ6A.mjs} +13 -12
  62. package/dist/lib/node-esm/chunk-NGYJNQ6A.mjs.map +7 -0
  63. package/dist/lib/node-esm/chunk-PIOOG7A5.mjs +97 -0
  64. package/dist/lib/node-esm/chunk-PIOOG7A5.mjs.map +7 -0
  65. package/dist/lib/node-esm/{chunk-O6EXWGGS.mjs → chunk-PLZ7EVCT.mjs} +9 -8
  66. package/dist/lib/node-esm/chunk-PLZ7EVCT.mjs.map +7 -0
  67. package/dist/lib/node-esm/{chunk-VCG2U522.mjs → chunk-SHAMSMKQ.mjs} +4 -4
  68. package/dist/lib/node-esm/chunk-SHAMSMKQ.mjs.map +7 -0
  69. package/dist/lib/node-esm/index.mjs +25 -24
  70. package/dist/lib/node-esm/index.mjs.map +3 -3
  71. package/dist/lib/node-esm/{intent-resolver-2I5HKCUU.mjs → intent-resolver-6B3PFQ5F.mjs} +8 -8
  72. package/dist/lib/node-esm/intent-resolver-6B3PFQ5F.mjs.map +7 -0
  73. package/dist/lib/node-esm/meta.json +1 -1
  74. package/dist/lib/node-esm/{react-surface-YZSZFR5D.mjs → react-surface-I46BPCWT.mjs} +59 -63
  75. package/dist/lib/node-esm/react-surface-I46BPCWT.mjs.map +7 -0
  76. package/dist/lib/node-esm/{settings-CXGR6DH4.mjs → settings-CJ3T5EX4.mjs} +5 -5
  77. package/dist/lib/node-esm/{settings-CXGR6DH4.mjs.map → settings-CJ3T5EX4.mjs.map} +1 -1
  78. package/dist/lib/node-esm/{state-NWMQ3XAI.mjs → state-K6EH7SRZ.mjs} +5 -5
  79. package/dist/lib/node-esm/{state-NWMQ3XAI.mjs.map → state-K6EH7SRZ.mjs.map} +1 -1
  80. package/dist/lib/node-esm/toolkit.mjs +14 -0
  81. package/dist/lib/node-esm/toolkit.mjs.map +7 -0
  82. package/dist/lib/node-esm/types/index.mjs +2 -2
  83. package/dist/types/src/MarkdownPlugin.d.ts +1 -1
  84. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  85. package/dist/types/src/capabilities/anchor-sort.d.ts +2 -4
  86. package/dist/types/src/capabilities/anchor-sort.d.ts.map +1 -1
  87. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  88. package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -3
  89. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -1
  90. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  91. package/dist/types/src/capabilities/index.d.ts +1 -5
  92. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  94. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  95. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts +3 -3
  96. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts.map +1 -1
  97. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts +0 -1
  98. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts.map +1 -1
  99. package/dist/types/src/components/MarkdownContainer.d.ts +8 -12
  100. package/dist/types/src/components/MarkdownContainer.d.ts.map +1 -1
  101. package/dist/types/src/components/MarkdownContainer.stories.d.ts +7 -4
  102. package/dist/types/src/components/MarkdownContainer.stories.d.ts.map +1 -1
  103. package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts +11 -0
  104. package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts.map +1 -0
  105. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +42 -23
  106. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
  107. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts +5 -110
  108. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts.map +1 -1
  109. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts +26 -0
  110. package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts.map +1 -0
  111. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts +12 -0
  112. package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts.map +1 -0
  113. package/dist/types/src/components/Suggestions.stories.d.ts +1 -2
  114. package/dist/types/src/components/Suggestions.stories.d.ts.map +1 -1
  115. package/dist/types/src/components/index.d.ts +3 -1
  116. package/dist/types/src/components/index.d.ts.map +1 -1
  117. package/dist/types/src/functions/create.d.ts +8 -0
  118. package/dist/types/src/functions/create.d.ts.map +1 -0
  119. package/dist/types/src/functions/create.test.d.ts +2 -0
  120. package/dist/types/src/functions/create.test.d.ts.map +1 -0
  121. package/dist/types/src/functions/index.d.ts +17 -2
  122. package/dist/types/src/functions/index.d.ts.map +1 -1
  123. package/dist/types/src/functions/open.d.ts +1 -1
  124. package/dist/types/src/functions/open.d.ts.map +1 -1
  125. package/dist/types/src/functions/{diff.d.ts → update.d.ts} +2 -2
  126. package/dist/types/src/functions/update.d.ts.map +1 -0
  127. package/dist/types/src/functions/update.test.d.ts +2 -0
  128. package/dist/types/src/functions/update.test.d.ts.map +1 -0
  129. package/dist/types/src/hooks/index.d.ts +3 -0
  130. package/dist/types/src/hooks/index.d.ts.map +1 -1
  131. package/dist/types/src/hooks/useEditorMenuOptions.d.ts +9 -0
  132. package/dist/types/src/hooks/useEditorMenuOptions.d.ts.map +1 -0
  133. package/dist/types/src/hooks/useExtensions.d.ts +21 -0
  134. package/dist/types/src/hooks/useExtensions.d.ts.map +1 -0
  135. package/dist/types/src/hooks/useLinkQuery.d.ts +4 -0
  136. package/dist/types/src/hooks/useLinkQuery.d.ts.map +1 -0
  137. package/dist/types/src/hooks/useSelectCurrentThread.d.ts +1 -1
  138. package/dist/types/src/hooks/useSelectCurrentThread.d.ts.map +1 -1
  139. package/dist/types/src/testing.d.ts +6 -0
  140. package/dist/types/src/testing.d.ts.map +1 -0
  141. package/dist/types/src/toolkit.d.ts +3 -0
  142. package/dist/types/src/toolkit.d.ts.map +1 -0
  143. package/dist/types/src/translations.d.ts +3 -0
  144. package/dist/types/src/translations.d.ts.map +1 -1
  145. package/dist/types/src/types/Markdown.d.ts +6 -4
  146. package/dist/types/src/types/Markdown.d.ts.map +1 -1
  147. package/dist/types/src/types/MarkdownAction.d.ts +2 -1
  148. package/dist/types/src/types/MarkdownAction.d.ts.map +1 -1
  149. package/dist/types/src/types/index.d.ts.map +1 -1
  150. package/dist/types/src/util.d.ts +3 -3
  151. package/dist/types/src/util.d.ts.map +1 -1
  152. package/dist/types/tsconfig.tsbuildinfo +1 -1
  153. package/package.json +71 -55
  154. package/src/MarkdownPlugin.tsx +99 -101
  155. package/src/capabilities/anchor-sort.ts +3 -3
  156. package/src/capabilities/app-graph-serializer.ts +5 -5
  157. package/src/capabilities/artifact-definition.ts +6 -5
  158. package/src/capabilities/blueprint-definition.ts +30 -26
  159. package/src/capabilities/capabilities.ts +1 -0
  160. package/src/capabilities/index.ts +1 -2
  161. package/src/capabilities/intent-resolver.ts +3 -2
  162. package/src/capabilities/react-surface.tsx +44 -66
  163. package/src/components/MarkdownCard/MarkdownCard.stories.tsx +6 -9
  164. package/src/components/MarkdownCard/MarkdownCard.tsx +52 -38
  165. package/src/components/MarkdownContainer.stories.tsx +74 -38
  166. package/src/components/MarkdownContainer.tsx +78 -220
  167. package/src/components/MarkdownEditor/FileUpload.tsx +63 -0
  168. package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +55 -35
  169. package/src/components/MarkdownEditor/MarkdownEditor.tsx +221 -272
  170. package/src/components/MarkdownEditor/MarkdownEditorContent.tsx +136 -0
  171. package/src/components/MarkdownEditor/MarkdownEditorToolbar.tsx +63 -0
  172. package/src/components/Suggestions.stories.tsx +41 -34
  173. package/src/components/index.ts +3 -1
  174. package/src/functions/create.conversations.json +1 -0
  175. package/src/functions/create.test.ts +128 -0
  176. package/src/functions/create.ts +34 -0
  177. package/src/functions/index.ts +9 -2
  178. package/src/functions/open.ts +4 -2
  179. package/src/functions/update.conversations.json +1 -0
  180. package/src/functions/update.test.ts +151 -0
  181. package/src/functions/{diff.ts → update.ts} +4 -2
  182. package/src/hooks/index.ts +3 -0
  183. package/src/hooks/useEditorMenuOptions.ts +71 -0
  184. package/src/{extensions.tsx → hooks/useExtensions.tsx} +60 -81
  185. package/src/hooks/useLinkQuery.ts +83 -0
  186. package/src/hooks/useSelectCurrentThread.tsx +15 -5
  187. package/src/meta.ts +3 -3
  188. package/src/testing.ts +27 -0
  189. package/src/toolkit.ts +6 -0
  190. package/src/translations.ts +3 -0
  191. package/src/types/Markdown.ts +9 -7
  192. package/src/types/MarkdownAction.ts +1 -1
  193. package/src/types/index.ts +1 -0
  194. package/src/util.tsx +10 -5
  195. package/dist/lib/browser/MarkdownCard-JLUQITYK.mjs +0 -80
  196. package/dist/lib/browser/MarkdownCard-JLUQITYK.mjs.map +0 -7
  197. package/dist/lib/browser/MarkdownContainer-JW7TRDSA.mjs +0 -755
  198. package/dist/lib/browser/MarkdownContainer-JW7TRDSA.mjs.map +0 -7
  199. package/dist/lib/browser/anchor-sort-E33BSTYF.mjs.map +0 -7
  200. package/dist/lib/browser/app-graph-serializer-OX62DNPT.mjs.map +0 -7
  201. package/dist/lib/browser/blueprint-definition-5YKFUHRU.mjs +0 -11
  202. package/dist/lib/browser/chunk-BEE7VQPU.mjs.map +0 -7
  203. package/dist/lib/browser/chunk-F6JJLKLN.mjs +0 -102
  204. package/dist/lib/browser/chunk-F6JJLKLN.mjs.map +0 -7
  205. package/dist/lib/browser/chunk-LAVZ2W6X.mjs.map +0 -7
  206. package/dist/lib/browser/chunk-ODB2PTBP.mjs.map +0 -7
  207. package/dist/lib/browser/chunk-SUOK6YMI.mjs +0 -22
  208. package/dist/lib/browser/chunk-SUOK6YMI.mjs.map +0 -7
  209. package/dist/lib/browser/intent-resolver-WDDH56JC.mjs.map +0 -7
  210. package/dist/lib/browser/react-surface-L3NTMD4D.mjs.map +0 -7
  211. package/dist/lib/browser/toolkit-2AJTHG74.mjs +0 -74
  212. package/dist/lib/browser/toolkit-2AJTHG74.mjs.map +0 -7
  213. package/dist/lib/node-esm/MarkdownCard-XL5EVSJ7.mjs +0 -81
  214. package/dist/lib/node-esm/MarkdownCard-XL5EVSJ7.mjs.map +0 -7
  215. package/dist/lib/node-esm/MarkdownContainer-HRGQXIXP.mjs +0 -756
  216. package/dist/lib/node-esm/MarkdownContainer-HRGQXIXP.mjs.map +0 -7
  217. package/dist/lib/node-esm/anchor-sort-ALP2NH24.mjs.map +0 -7
  218. package/dist/lib/node-esm/app-graph-serializer-56TD3BMX.mjs.map +0 -7
  219. package/dist/lib/node-esm/blueprint-definition-GVW67KGV.mjs +0 -12
  220. package/dist/lib/node-esm/chunk-DVK63TD3.mjs +0 -103
  221. package/dist/lib/node-esm/chunk-DVK63TD3.mjs.map +0 -7
  222. package/dist/lib/node-esm/chunk-FXILAQ5F.mjs.map +0 -7
  223. package/dist/lib/node-esm/chunk-JC2YWB5D.mjs +0 -24
  224. package/dist/lib/node-esm/chunk-JC2YWB5D.mjs.map +0 -7
  225. package/dist/lib/node-esm/chunk-O6EXWGGS.mjs.map +0 -7
  226. package/dist/lib/node-esm/chunk-VCG2U522.mjs.map +0 -7
  227. package/dist/lib/node-esm/intent-resolver-2I5HKCUU.mjs.map +0 -7
  228. package/dist/lib/node-esm/react-surface-YZSZFR5D.mjs.map +0 -7
  229. package/dist/lib/node-esm/toolkit-RC44I2MI.mjs +0 -75
  230. package/dist/lib/node-esm/toolkit-RC44I2MI.mjs.map +0 -7
  231. package/dist/types/src/capabilities/toolkit.d.ts +0 -4
  232. package/dist/types/src/capabilities/toolkit.d.ts.map +0 -1
  233. package/dist/types/src/components/Toolbar.stories.d.ts +0 -48
  234. package/dist/types/src/components/Toolbar.stories.d.ts.map +0 -1
  235. package/dist/types/src/extensions.d.ts +0 -22
  236. package/dist/types/src/extensions.d.ts.map +0 -1
  237. package/dist/types/src/functions/diff.d.ts.map +0 -1
  238. package/src/capabilities/toolkit.ts +0 -47
  239. package/src/components/Toolbar.stories.tsx +0 -118
  240. /package/dist/lib/browser/{blueprint-definition-5YKFUHRU.mjs.map → MarkdownCard-JYMDPKV5.mjs.map} +0 -0
  241. /package/dist/lib/{node-esm/blueprint-definition-GVW67KGV.mjs.map → browser/MarkdownContainer-Y75XSVBX.mjs.map} +0 -0
@@ -0,0 +1,828 @@
1
+ import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
+ import {
3
+ MarkdownCapabilities
4
+ } from "./chunk-GMMVSXQ6.mjs";
5
+ import {
6
+ setFallbackName
7
+ } from "./chunk-PLZ7EVCT.mjs";
8
+ import {
9
+ Markdown_exports
10
+ } from "./chunk-NGYJNQ6A.mjs";
11
+ import {
12
+ meta
13
+ } from "./chunk-SHAMSMKQ.mjs";
14
+
15
+ // src/components/MarkdownContainer.tsx
16
+ import { useSignals as _useSignals5 } from "@preact-signals/safe-react/tracking";
17
+ import { Atom } from "@effect-atom/atom-react";
18
+ import React6, { useMemo as useMemo7 } from "react";
19
+ import { Capabilities as Capabilities2 } from "@dxos/app-framework";
20
+ import { useAppGraph, useCapabilities as useCapabilities2 } from "@dxos/app-framework/react";
21
+ import { Obj as Obj3 } from "@dxos/echo";
22
+ import { getSpace as getSpace2 } from "@dxos/react-client/echo";
23
+ import { StackItem } from "@dxos/react-ui-stack";
24
+ import { Text as Text2 } from "@dxos/schema";
25
+
26
+ // src/hooks/useEditorMenuOptions.ts
27
+ import { useCallback, useMemo, useRef } from "react";
28
+ import { Domino, toLocalizedString, useTranslation } from "@dxos/react-ui";
29
+ import { filterMenuGroups, formattingCommands, linkSlashCommands } from "@dxos/react-ui-editor";
30
+ var useEditorMenuOptions = ({ editorView, slashCommandGroups, onLinkQuery }) => {
31
+ const { t } = useTranslation(meta.id);
32
+ const getMenu = useCallback(({ text, trigger }) => {
33
+ switch (trigger) {
34
+ case "@": {
35
+ return onLinkQuery?.(text) ?? [];
36
+ }
37
+ case "/":
38
+ default: {
39
+ return filterMenuGroups([
40
+ formattingCommands,
41
+ linkSlashCommands,
42
+ ...slashCommandGroups ?? []
43
+ ], (item) => text ? toLocalizedString(item.label, t).toLowerCase().includes(text.toLowerCase()) : true);
44
+ }
45
+ }
46
+ }, [
47
+ slashCommandGroups,
48
+ onLinkQuery
49
+ ]);
50
+ const viewRef = useRef(editorView);
51
+ return useMemo(() => {
52
+ const trigger = onLinkQuery ? [
53
+ "/",
54
+ "@"
55
+ ] : [
56
+ "/"
57
+ ];
58
+ const placeholder = {
59
+ delay: 3e3,
60
+ content: () => Domino.of("div").children(Domino.of("span").text("Press"), ...trigger.map((text) => Domino.of("span").classNames("mx-1 pli-1.5 pt-[1px] pb-[2px] border border-separator rounded-sm").text(text)), Domino.of("span").text("for commands.")).build()
61
+ };
62
+ return {
63
+ viewRef,
64
+ getMenu,
65
+ trigger,
66
+ placeholder
67
+ };
68
+ }, [
69
+ getMenu,
70
+ onLinkQuery
71
+ ]);
72
+ };
73
+
74
+ // src/hooks/useExtensions.tsx
75
+ import React, { useMemo as useMemo2 } from "react";
76
+ import { createRoot } from "react-dom/client";
77
+ import { LayoutAction, createIntent } from "@dxos/app-framework";
78
+ import { useIntentDispatcher } from "@dxos/app-framework/react";
79
+ import { debounceAndThrottle } from "@dxos/async";
80
+ import { Obj } from "@dxos/echo";
81
+ import { invariant } from "@dxos/invariant";
82
+ import { createDocAccessor } from "@dxos/react-client/echo";
83
+ import { getSpace } from "@dxos/react-client/echo";
84
+ import { useIdentity } from "@dxos/react-client/halo";
85
+ import { Icon, ThemeProvider } from "@dxos/react-ui";
86
+ import { Cursor, EditorView, InputModeExtensions, createDataExtensions, decorateMarkdown, documentId, folding, formattingKeymap, linkTooltip, listener, preview, replacer, selectionState, typewriter } from "@dxos/react-ui-editor";
87
+ import { defaultTx } from "@dxos/react-ui-theme";
88
+ import { Text } from "@dxos/schema";
89
+ import { isTruthy } from "@dxos/util";
90
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-markdown/src/hooks/useExtensions.tsx";
91
+ var useExtensions = ({ id, object, settings, selectionManager, viewMode, editorStateStore, previewOptions }) => {
92
+ const { dispatchPromise: dispatch } = useIntentDispatcher();
93
+ const identity = useIdentity();
94
+ const space = getSpace(object);
95
+ let target;
96
+ if (Obj.instanceOf(Markdown_exports.Document, object)) {
97
+ target = object.content.target;
98
+ } else if (Obj.instanceOf(Text.Text, object)) {
99
+ target = object;
100
+ }
101
+ const baseExtensions = useMemo2(() => createBaseExtensions({
102
+ id,
103
+ object,
104
+ settings,
105
+ selectionManager,
106
+ viewMode,
107
+ previewOptions,
108
+ dispatch
109
+ }), [
110
+ id,
111
+ object,
112
+ viewMode,
113
+ dispatch,
114
+ previewOptions,
115
+ settings,
116
+ settings?.debug,
117
+ settings?.editorInputMode,
118
+ settings?.folding,
119
+ settings?.numberedHeadings,
120
+ settings?.typewriter,
121
+ selectionManager
122
+ ]);
123
+ return useMemo2(() => [
124
+ // TODO(burdon): Pass this in?
125
+ // NOTE: Data extensions must be first so that automerge is updated before other extensions compute their state.
126
+ target && createDataExtensions({
127
+ id,
128
+ text: createDocAccessor(target, [
129
+ "content"
130
+ ]),
131
+ space,
132
+ identity
133
+ }),
134
+ // TODO(burdon): Reconcile with effect in parent.
135
+ Obj.instanceOf(Markdown_exports.Document, object) && listener({
136
+ onChange: ({ text }) => {
137
+ setFallbackName(object, text);
138
+ }
139
+ }),
140
+ baseExtensions,
141
+ selectionState(editorStateStore)
142
+ ].filter(isTruthy), [
143
+ identity,
144
+ space,
145
+ id,
146
+ object,
147
+ target,
148
+ baseExtensions
149
+ ]);
150
+ };
151
+ var createBaseExtensions = ({ id, object, dispatch, settings, selectionManager, viewMode, previewOptions }) => {
152
+ const extensions = [
153
+ selectionManager && selectionChange(selectionManager),
154
+ settings?.editorInputMode && InputModeExtensions[settings.editorInputMode],
155
+ settings?.folding && folding()
156
+ ].filter(isTruthy);
157
+ if (viewMode !== "source") {
158
+ extensions.push(...[
159
+ formattingKeymap(),
160
+ decorateMarkdown({
161
+ selectionChangeDelay: 100,
162
+ numberedHeadings: settings?.numberedHeadings ? {
163
+ from: 2
164
+ } : void 0,
165
+ // TODO(wittjosiah): For internal links, consider ignoring the link text and rendering the label of the object being linked to.
166
+ // TODO(burdon): Create dx-tag.
167
+ renderLinkButton: dispatch && (object || id) ? createLinkRenderer((id2) => {
168
+ void dispatch(createIntent(LayoutAction.Open, {
169
+ part: "main",
170
+ subject: [
171
+ id2
172
+ ],
173
+ options: {
174
+ pivotId: object && Obj.isObject(object) ? Obj.getDXN(object).toString() : id2
175
+ }
176
+ }));
177
+ }) : void 0
178
+ }),
179
+ linkTooltip(renderLinkTooltip),
180
+ preview(previewOptions),
181
+ replacer()
182
+ ]);
183
+ }
184
+ if (settings?.debug) {
185
+ const items = settings.typewriter?.split(/[,\n]/) ?? "";
186
+ if (items) {
187
+ extensions.push(typewriter({
188
+ items
189
+ }));
190
+ }
191
+ }
192
+ return extensions;
193
+ };
194
+ var selectionChange = (selectionManager) => {
195
+ return EditorView.updateListener.of(debounceAndThrottle((update) => {
196
+ if (update.selectionSet) {
197
+ const id = update.state.facet(documentId);
198
+ const cursorConverter = update.state.facet(Cursor.converter);
199
+ const selection = update.state.selection;
200
+ const ranges = selection.ranges.map((range) => ({
201
+ from: cursorConverter.toCursor(range.from),
202
+ to: cursorConverter.toCursor(range.to)
203
+ })).filter(({ from, to }) => to > from);
204
+ selectionManager.updateMultiRange(id, ranges);
205
+ }
206
+ }, 100));
207
+ };
208
+ var style = {
209
+ hover: "rounded-sm text-primary-500 hover:text-primary-600 dark:text-primary-500 hover:dark:text-primary-400",
210
+ icon: "inline-block leading-none mis-1 cursor-pointer"
211
+ };
212
+ var createLinkRenderer = (onSelectObject) => (el, { url }) => {
213
+ const isInternal = url.startsWith("/") || // TODO(wittjosiah): This should probably be parsed out on paste?
214
+ url.startsWith(window.location.origin);
215
+ const options = isInternal ? {
216
+ onClick: () => {
217
+ const qualifiedId = url.split("/").at(-1);
218
+ invariant(qualifiedId, "Invalid link format.", {
219
+ F: __dxlog_file,
220
+ L: 242,
221
+ S: void 0,
222
+ A: [
223
+ "qualifiedId",
224
+ "'Invalid link format.'"
225
+ ]
226
+ });
227
+ onSelectObject(qualifiedId);
228
+ }
229
+ } : {
230
+ href: url,
231
+ rel: "noreferrer",
232
+ target: "_blank"
233
+ };
234
+ renderRoot(el, /* @__PURE__ */ React.createElement("a", {
235
+ ...options,
236
+ className: style.hover
237
+ }, /* @__PURE__ */ React.createElement(Icon, {
238
+ icon: isInternal ? "ph--arrow-square-down--bold" : "ph--arrow-square-out--bold",
239
+ size: 4,
240
+ classNames: style.icon
241
+ })));
242
+ };
243
+ var renderLinkTooltip = (el, { url }) => {
244
+ const web = new URL(url);
245
+ renderRoot(el, /* @__PURE__ */ React.createElement("a", {
246
+ href: url,
247
+ rel: "noreferrer",
248
+ target: "_blank",
249
+ className: style.hover
250
+ }, web.origin, /* @__PURE__ */ React.createElement(Icon, {
251
+ icon: "ph--arrow-square-out--bold",
252
+ size: 4,
253
+ classNames: style.icon
254
+ })));
255
+ };
256
+ var renderRoot = (root, node) => {
257
+ createRoot(root).render(/* @__PURE__ */ React.createElement(ThemeProvider, {
258
+ tx: defaultTx
259
+ }, node));
260
+ return root;
261
+ };
262
+
263
+ // src/hooks/useLinkQuery.ts
264
+ import { useCallback as useCallback2, useMemo as useMemo3 } from "react";
265
+ import { Capabilities } from "@dxos/app-framework";
266
+ import { useCapabilities, usePluginManager } from "@dxos/app-framework/react";
267
+ import { Filter, Obj as Obj2, Query, Type } from "@dxos/echo";
268
+ import { ClientCapabilities } from "@dxos/plugin-client";
269
+ import { SpaceCapabilities } from "@dxos/plugin-space";
270
+ import { toLocalizedString as toLocalizedString2, useTranslation as useTranslation2 } from "@dxos/react-ui";
271
+ import { insertAtCursor, insertAtLineStart } from "@dxos/react-ui-editor";
272
+ var useLinkQuery = (space) => {
273
+ const { t } = useTranslation2();
274
+ const manager = usePluginManager();
275
+ const resolve = useCallback2((typename) => manager.context.getCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {}, [
276
+ manager
277
+ ]);
278
+ const objectForms = useCapabilities(SpaceCapabilities.ObjectForm);
279
+ const schemaWhiteList = useCapabilities(ClientCapabilities.SchemaWhiteList);
280
+ const filter = useMemo3(() => Filter.or(...objectForms.map((form) => Filter.type(form.objectSchema)), ...schemaWhiteList.flat().map((schema) => Filter.typename(Type.getTypename(schema)))), [
281
+ objectForms,
282
+ schemaWhiteList
283
+ ]);
284
+ const handleLinkQuery = useCallback2(async (query) => {
285
+ const name = query?.startsWith("@") ? query.slice(1).toLowerCase() : query?.toLowerCase() ?? "";
286
+ const results = await space?.db.query(Query.select(filter)).run();
287
+ const getLabel = (object) => {
288
+ const label = Obj2.getLabel(object);
289
+ if (label) {
290
+ return label;
291
+ }
292
+ const type = Obj2.getTypename(object);
293
+ const metadata = resolve(type);
294
+ return metadata.label?.(object) || [
295
+ "object name placeholder",
296
+ {
297
+ ns: type,
298
+ default: "New object"
299
+ }
300
+ ];
301
+ };
302
+ const items = results?.objects.filter((object) => toLocalizedString2(getLabel(object), t).toLowerCase().includes(name)).map((object) => {
303
+ const metadata = resolve(Obj2.getTypename(object));
304
+ const label = toLocalizedString2(getLabel(object), t);
305
+ return {
306
+ id: object.id,
307
+ label,
308
+ icon: metadata.icon,
309
+ onSelect: ({ view, head }) => {
310
+ const link = `[${label}](${Obj2.getDXN(object)})`;
311
+ if (query?.startsWith("@")) {
312
+ insertAtLineStart(view, head, `!${link}
313
+ `);
314
+ } else {
315
+ insertAtCursor(view, head, `${link} `);
316
+ }
317
+ }
318
+ };
319
+ }) ?? [];
320
+ return [
321
+ {
322
+ id: "echo",
323
+ items
324
+ }
325
+ ];
326
+ }, [
327
+ space,
328
+ filter,
329
+ resolve
330
+ ]);
331
+ return handleLinkQuery;
332
+ };
333
+
334
+ // src/hooks/useSelectCurrentThread.tsx
335
+ import { EditorView as EditorView2 } from "@codemirror/view";
336
+ import * as Schema from "effect/Schema";
337
+ import { useMemo as useMemo4 } from "react";
338
+ import { LayoutAction as LayoutAction2, createResolver } from "@dxos/app-framework";
339
+ import { useIntentResolver } from "@dxos/app-framework/react";
340
+ import { invariant as invariant2 } from "@dxos/invariant";
341
+ import { Cursor as Cursor2, setSelection } from "@dxos/react-ui-editor";
342
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/plugins/plugin-markdown/src/hooks/useSelectCurrentThread.tsx";
343
+ var useSelectCurrentThread = (editorView, documentId2) => {
344
+ const scrollIntoViewResolver = useMemo4(() => createResolver({
345
+ intent: LayoutAction2.UpdateLayout,
346
+ position: "hoist",
347
+ filter: (data) => {
348
+ if (!Schema.is(LayoutAction2.ScrollIntoView.fields.input)(data)) {
349
+ return false;
350
+ }
351
+ return !!editorView && data.subject === documentId2 && !!data.options?.cursor;
352
+ },
353
+ resolve: ({ options: { cursor } }) => {
354
+ invariant2(editorView, "Editor view is not defined.", {
355
+ F: __dxlog_file2,
356
+ L: 39,
357
+ S: void 0,
358
+ A: [
359
+ "editorView",
360
+ "'Editor view is not defined.'"
361
+ ]
362
+ });
363
+ const range = Cursor2.getRangeFromCursor(editorView.state, cursor);
364
+ if (range) {
365
+ const selection = editorView.state.selection.main.from !== range.from ? {
366
+ anchor: range.from
367
+ } : void 0;
368
+ const effects = [
369
+ // NOTE: This does not use the DOM scrollIntoView function.
370
+ EditorView2.scrollIntoView(range.from, {
371
+ y: "start",
372
+ yMargin: 96
373
+ })
374
+ ];
375
+ if (selection) {
376
+ effects.push(setSelection.of({
377
+ current: documentId2
378
+ }));
379
+ }
380
+ editorView.dispatch({
381
+ effects,
382
+ selection: selection ? {
383
+ anchor: range.from
384
+ } : void 0
385
+ });
386
+ }
387
+ }
388
+ }), [
389
+ documentId2,
390
+ editorView
391
+ ]);
392
+ useIntentResolver(meta.id, scrollIntoViewResolver);
393
+ };
394
+
395
+ // src/components/MarkdownEditor/MarkdownEditor.tsx
396
+ import { useSignals as _useSignals4 } from "@preact-signals/safe-react/tracking";
397
+ import { createContext } from "@radix-ui/react-context";
398
+ import React5, { useMemo as useMemo6, useState as useState2 } from "react";
399
+ import { createPortal as createPortal2 } from "react-dom";
400
+ import { Surface } from "@dxos/app-framework/react";
401
+ import { DXN } from "@dxos/keys";
402
+ import { useClient } from "@dxos/react-client";
403
+ import { EditorMenuProvider, useEditorMenu, useEditorToolbar } from "@dxos/react-ui-editor";
404
+ import { isNonNullable } from "@dxos/util";
405
+
406
+ // src/components/MarkdownEditor/MarkdownEditorContent.tsx
407
+ import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
408
+ import React2, { forwardRef, useEffect, useImperativeHandle, useMemo as useMemo5 } from "react";
409
+ import { useDynamicRef, useThemeContext, useTranslation as useTranslation3 } from "@dxos/react-ui";
410
+ import { createBasicExtensions, createMarkdownExtensions, createThemeExtensions, dropFile, editorGutter, editorSlots, formattingListener, processEditorPayload, stackItemContentEditorClassNames, useTextEditor } from "@dxos/react-ui-editor";
411
+ import { isTruthy as isTruthy2 } from "@dxos/util";
412
+ var MarkdownEditorContent = /* @__PURE__ */ forwardRef(({ id, role, initialValue, editorStateStore, toolbarState, extensions, viewMode, scrollPastEnd, onFileUpload }, forwardedRef) => {
413
+ var _effect = _useSignals();
414
+ try {
415
+ const { t } = useTranslation3(meta.id);
416
+ const { themeMode } = useThemeContext();
417
+ const toolbarStateRef = useDynamicRef(toolbarState);
418
+ const { scrollTo, selection } = useMemo5(() => editorStateStore?.getState(id) ?? {}, [
419
+ id
420
+ ]);
421
+ const { parentRef, view: editorView, focusAttributes } = useTextEditor(() => ({
422
+ ...role !== "section" && {
423
+ id,
424
+ scrollTo,
425
+ selection,
426
+ // TODO(wittjosiah): Autofocus based on layout is racy.
427
+ // autoFocus: layoutPlugin?.provides.layout ? layoutPlugin?.provides.layout.scrollIntoView === id : true,
428
+ selectionEnd: true
429
+ },
430
+ initialValue,
431
+ extensions: [
432
+ createBasicExtensions({
433
+ readOnly: viewMode === "readonly",
434
+ placeholder: t("editor placeholder"),
435
+ scrollPastEnd: scrollPastEnd && role !== "section",
436
+ search: true
437
+ }),
438
+ createThemeExtensions({
439
+ themeMode,
440
+ slots: editorSlots,
441
+ syntaxHighlighting: true
442
+ }),
443
+ createMarkdownExtensions(),
444
+ formattingListener(() => toolbarStateRef.current),
445
+ editorGutter,
446
+ role !== "section" && onFileUpload && dropFile({
447
+ // TODO(wittjosiah): Factor out to file uploader plugin.
448
+ onDrop: async (view, { files }) => {
449
+ const file = files[0];
450
+ const info = file && onFileUpload ? await onFileUpload(file) : void 0;
451
+ if (info) {
452
+ processEditorPayload(view, {
453
+ type: "image",
454
+ data: info.url
455
+ });
456
+ }
457
+ }
458
+ }),
459
+ extensions
460
+ ].filter(isTruthy2)
461
+ }), [
462
+ id,
463
+ viewMode,
464
+ themeMode,
465
+ extensions
466
+ ]);
467
+ useImperativeHandle(forwardedRef, () => editorView, [
468
+ editorView
469
+ ]);
470
+ useSelectCurrentThread(editorView, id);
471
+ useTest(editorView);
472
+ return /* @__PURE__ */ React2.createElement("div", {
473
+ role: "none",
474
+ ref: parentRef,
475
+ "data-testid": "composer.markdownRoot",
476
+ className: stackItemContentEditorClassNames(role),
477
+ "data-popover-collision-boundary": true,
478
+ ...focusAttributes
479
+ });
480
+ } finally {
481
+ _effect.f();
482
+ }
483
+ });
484
+ var useTest = (view) => {
485
+ useEffect(() => {
486
+ const composer = window.composer;
487
+ if (composer) {
488
+ composer.editorView = view;
489
+ }
490
+ }, [
491
+ view
492
+ ]);
493
+ };
494
+
495
+ // src/components/MarkdownEditor/MarkdownEditorToolbar.tsx
496
+ import { useSignals as _useSignals3 } from "@preact-signals/safe-react/tracking";
497
+ import React4, { useCallback as useCallback3, useState } from "react";
498
+ import { invariant as invariant3 } from "@dxos/invariant";
499
+ import { EditorToolbar } from "@dxos/react-ui-editor";
500
+
501
+ // src/components/MarkdownEditor/FileUpload.tsx
502
+ import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
503
+ import React3, { forwardRef as forwardRef2, useEffect as useEffect2, useImperativeHandle as useImperativeHandle2 } from "react";
504
+ import { createPortal } from "react-dom";
505
+ import { useDropzone } from "react-dropzone";
506
+ import { addLink } from "@dxos/react-ui-editor";
507
+ var IMAGE_FILES = [
508
+ ".jpg",
509
+ ".jpeg",
510
+ ".png",
511
+ ".gif"
512
+ ];
513
+ var FileUpload = /* @__PURE__ */ forwardRef2(({ editorView, onFileUpload }, forwardedRef) => {
514
+ var _effect = _useSignals2();
515
+ try {
516
+ const { acceptedFiles, open, inputRef } = useDropzone({
517
+ disabled: !onFileUpload,
518
+ multiple: false,
519
+ noDrag: true,
520
+ accept: {
521
+ "image/*": IMAGE_FILES
522
+ }
523
+ });
524
+ useImperativeHandle2(forwardedRef, () => open, []);
525
+ useEffect2(() => {
526
+ if (editorView && acceptedFiles.length && onFileUpload) {
527
+ requestAnimationFrame(async () => {
528
+ const f = acceptedFiles[0];
529
+ const file = new File([
530
+ f
531
+ ], f.name, {
532
+ type: f.type,
533
+ lastModified: f.lastModified
534
+ });
535
+ const info = await onFileUpload(file);
536
+ if (info) {
537
+ addLink({
538
+ url: info.url,
539
+ image: true
540
+ })(editorView);
541
+ }
542
+ });
543
+ }
544
+ }, [
545
+ editorView,
546
+ acceptedFiles,
547
+ onFileUpload
548
+ ]);
549
+ if (!onFileUpload) {
550
+ return null;
551
+ }
552
+ return /* @__PURE__ */ React3.createElement(React3.Fragment, null, /* @__PURE__ */ createPortal(/* @__PURE__ */ React3.createElement("input", {
553
+ ref: inputRef
554
+ }), document.body), " ");
555
+ } finally {
556
+ _effect.f();
557
+ }
558
+ });
559
+
560
+ // src/components/MarkdownEditor/MarkdownEditorToolbar.tsx
561
+ var __dxlog_file3 = "/__w/dxos/dxos/packages/plugins/plugin-markdown/src/components/MarkdownEditor/MarkdownEditorToolbar.tsx";
562
+ var MarkdownEditorToolbar = ({ classNames, id, role, state, editorView, customActions, onFileUpload, onViewModeChange }) => {
563
+ var _effect = _useSignals3();
564
+ try {
565
+ const [upload, setUpload] = useState(null);
566
+ const uploadRef = useCallback3((next) => setUpload(() => next), []);
567
+ const handleViewModeChange = useCallback3((mode) => onViewModeChange?.(mode), [
568
+ onViewModeChange
569
+ ]);
570
+ const getView = useCallback3(() => {
571
+ invariant3(editorView, void 0, {
572
+ F: __dxlog_file3,
573
+ L: 39,
574
+ S: void 0,
575
+ A: [
576
+ "editorView",
577
+ ""
578
+ ]
579
+ });
580
+ return editorView;
581
+ }, [
582
+ editorView
583
+ ]);
584
+ if (!editorView) {
585
+ return /* @__PURE__ */ React4.createElement("div", null);
586
+ }
587
+ return /* @__PURE__ */ React4.createElement(React4.Fragment, null, /* @__PURE__ */ React4.createElement(EditorToolbar, {
588
+ classNames,
589
+ attendableId: id,
590
+ role,
591
+ state,
592
+ customActions,
593
+ getView,
594
+ onImageUpload: upload ?? void 0,
595
+ onViewModeChange: handleViewModeChange
596
+ }), onFileUpload && /* @__PURE__ */ React4.createElement(FileUpload, {
597
+ ref: uploadRef,
598
+ editorView,
599
+ onFileUpload
600
+ }));
601
+ } finally {
602
+ _effect.f();
603
+ }
604
+ };
605
+
606
+ // src/components/MarkdownEditor/MarkdownEditor.tsx
607
+ var [MarkdownEditorContextProvider, useMarkdownEditorContext] = createContext("MarkdownEditor.Context");
608
+ var MarkdownEditorRoot = ({ children, id, object, editorStateStore, selectionManager, settings, viewMode, extensions: extensionsParam, slashCommandGroups, onLinkQuery, ...props }) => {
609
+ var _effect = _useSignals4();
610
+ try {
611
+ const [editorView, setEditorView] = useState2();
612
+ const [previewBlocks, setPreviewBlocks] = useState2([]);
613
+ const previewOptions = useMemo6(() => ({
614
+ addBlockContainer: (block) => {
615
+ setPreviewBlocks((prev) => [
616
+ ...prev,
617
+ block
618
+ ]);
619
+ },
620
+ removeBlockContainer: ({ link }) => {
621
+ setPreviewBlocks((prev) => prev.filter(({ link: prevLink }) => prevLink.ref !== link.ref));
622
+ }
623
+ }), []);
624
+ const toolbarState = useEditorToolbar({
625
+ viewMode
626
+ });
627
+ const menuOptions = useEditorMenuOptions({
628
+ editorView,
629
+ slashCommandGroups,
630
+ onLinkQuery
631
+ });
632
+ const { extension: menuExtension, ...menuProps } = useEditorMenu(menuOptions);
633
+ const coreExtensions = useExtensions({
634
+ id,
635
+ object,
636
+ editorStateStore,
637
+ previewOptions,
638
+ selectionManager,
639
+ settings,
640
+ viewMode
641
+ });
642
+ const extensions = useMemo6(() => [
643
+ coreExtensions,
644
+ menuExtension,
645
+ extensionsParam
646
+ ].filter(isNonNullable), [
647
+ coreExtensions,
648
+ menuExtension,
649
+ extensionsParam
650
+ ]);
651
+ return /* @__PURE__ */ React5.createElement(MarkdownEditorContextProvider, {
652
+ id,
653
+ editorView,
654
+ setEditorView,
655
+ extensions,
656
+ previewBlocks,
657
+ toolbarState,
658
+ popoverMenu: menuProps,
659
+ viewMode,
660
+ ...props
661
+ }, children);
662
+ } finally {
663
+ _effect.f();
664
+ }
665
+ };
666
+ MarkdownEditorRoot.displayName = "MarkdownEditor.Root";
667
+ var MarkdownEditorContent2 = (props) => {
668
+ var _effect = _useSignals4();
669
+ try {
670
+ const { id, extensions, editorView, setEditorView, toolbarState, viewMode, popoverMenu: { groupsRef, ...menuProps } } = useMarkdownEditorContext(MarkdownEditorContent2.displayName);
671
+ return /* @__PURE__ */ React5.createElement(EditorMenuProvider, {
672
+ view: editorView,
673
+ groups: groupsRef.current,
674
+ ...menuProps
675
+ }, /* @__PURE__ */ React5.createElement(MarkdownEditorContent, {
676
+ ...props,
677
+ id,
678
+ extensions,
679
+ toolbarState,
680
+ viewMode,
681
+ ref: setEditorView
682
+ }));
683
+ } finally {
684
+ _effect.f();
685
+ }
686
+ };
687
+ MarkdownEditorContent2.displayName = "MarkdownEditor.Content";
688
+ var MarkdownEditorToolbar2 = (props) => {
689
+ var _effect = _useSignals4();
690
+ try {
691
+ const { toolbarState, ...rootProps } = useMarkdownEditorContext(MarkdownEditorToolbar2.displayName);
692
+ return /* @__PURE__ */ React5.createElement(MarkdownEditorToolbar, {
693
+ ...props,
694
+ ...rootProps,
695
+ state: toolbarState
696
+ });
697
+ } finally {
698
+ _effect.f();
699
+ }
700
+ };
701
+ MarkdownEditorToolbar2.displayName = "MarkdownEditor.Toolbar";
702
+ var MarkdownEditorBlocks = (_props) => {
703
+ var _effect = _useSignals4();
704
+ try {
705
+ const { previewBlocks } = useMarkdownEditorContext(MarkdownEditorBlocks.displayName);
706
+ return /* @__PURE__ */ React5.createElement(React5.Fragment, null, previewBlocks.map(({ link, el }) => /* @__PURE__ */ React5.createElement(PreviewBlock, {
707
+ key: link.ref,
708
+ link,
709
+ el
710
+ })));
711
+ } finally {
712
+ _effect.f();
713
+ }
714
+ };
715
+ MarkdownEditorBlocks.displayName = "MarkdownEditor.Blocks";
716
+ var PreviewBlock = ({ el, link }) => {
717
+ var _effect = _useSignals4();
718
+ try {
719
+ const client = useClient();
720
+ const dxn = DXN.parse(link.ref);
721
+ const subject = client.graph.ref(dxn).target;
722
+ const data = useMemo6(() => ({
723
+ subject
724
+ }), [
725
+ subject
726
+ ]);
727
+ return /* @__PURE__ */ createPortal2(/* @__PURE__ */ React5.createElement(Surface, {
728
+ role: "card--transclusion",
729
+ data,
730
+ limit: 1
731
+ }), el);
732
+ } finally {
733
+ _effect.f();
734
+ }
735
+ };
736
+ var MarkdownEditor = {
737
+ Root: MarkdownEditorRoot,
738
+ Content: MarkdownEditorContent2,
739
+ Toolbar: MarkdownEditorToolbar2,
740
+ Blocks: MarkdownEditorBlocks
741
+ };
742
+
743
+ // src/components/MarkdownContainer.tsx
744
+ var MarkdownContainer = ({ id, role, object, settings, extensionProviders, ...props }) => {
745
+ var _effect = _useSignals5();
746
+ try {
747
+ const space = getSpace2(object);
748
+ const isDocument = Obj3.instanceOf(Markdown_exports.Document, object);
749
+ const isText = Obj3.instanceOf(Text2.Text, object);
750
+ const attendableId = isDocument ? Obj3.getDXN(object).toString() : void 0;
751
+ const otherExtensionProviders = useCapabilities2(MarkdownCapabilities.Extensions);
752
+ const extensions = useMemo7(() => {
753
+ if (!Obj3.instanceOf(Markdown_exports.Document, object)) {
754
+ return [];
755
+ }
756
+ return [
757
+ ...otherExtensionProviders ?? [],
758
+ ...extensionProviders ?? []
759
+ ].flat().reduce((acc, provider) => {
760
+ const extension = typeof provider === "function" ? provider({
761
+ document: object
762
+ }) : provider;
763
+ if (extension) {
764
+ acc.push(extension);
765
+ }
766
+ return acc;
767
+ }, []);
768
+ }, [
769
+ extensionProviders,
770
+ otherExtensionProviders,
771
+ object
772
+ ]);
773
+ const { graph } = useAppGraph();
774
+ const customActions = useMemo7(() => {
775
+ return Atom.make((get) => {
776
+ const actions = get(graph.actions(id));
777
+ const nodes = actions.filter((action) => action.properties.disposition === "toolbar");
778
+ const edges = nodes.map((node) => ({
779
+ source: "root",
780
+ target: node.id
781
+ }));
782
+ return {
783
+ nodes,
784
+ edges
785
+ };
786
+ });
787
+ }, [
788
+ graph
789
+ ]);
790
+ const [upload] = useCapabilities2(Capabilities2.FileUploader);
791
+ const handleFileUpload = useMemo7(() => {
792
+ if (!space || !upload) {
793
+ return void 0;
794
+ }
795
+ return async (file) => upload(space, file);
796
+ }, [
797
+ space,
798
+ upload
799
+ ]);
800
+ const handleLinkQuery = useLinkQuery(space);
801
+ return /* @__PURE__ */ React6.createElement(StackItem.Content, {
802
+ toolbar: settings.toolbar
803
+ }, /* @__PURE__ */ React6.createElement(MarkdownEditor.Root, {
804
+ id: attendableId ?? id,
805
+ object,
806
+ extensions,
807
+ onFileUpload: handleFileUpload,
808
+ onLinkQuery: handleLinkQuery,
809
+ ...props
810
+ }, settings.toolbar && /* @__PURE__ */ React6.createElement(MarkdownEditor.Toolbar, {
811
+ id: attendableId ?? id,
812
+ role,
813
+ customActions
814
+ }), /* @__PURE__ */ React6.createElement(MarkdownEditor.Content, {
815
+ initialValue: isDocument ? object.content?.target?.content : isText ? object.content : object.text,
816
+ scrollPastEnd: role === "article"
817
+ }), /* @__PURE__ */ React6.createElement(MarkdownEditor.Blocks, null)));
818
+ } finally {
819
+ _effect.f();
820
+ }
821
+ };
822
+ var MarkdownContainer_default = MarkdownContainer;
823
+
824
+ export {
825
+ MarkdownContainer,
826
+ MarkdownContainer_default
827
+ };
828
+ //# sourceMappingURL=chunk-CT7CFX5G.mjs.map