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