@dxos/plugin-markdown 0.8.4-main.5ea62a8 → 0.8.4-main.66e292d

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 (235) hide show
  1. package/dist/lib/browser/MarkdownCard-TC3GGUSX.mjs +12 -0
  2. package/dist/lib/browser/MarkdownContainer-YF22DV4M.mjs +15 -0
  3. package/dist/lib/browser/{anchor-sort-E33BSTYF.mjs → anchor-sort-3MYLO74J.mjs} +10 -10
  4. package/dist/lib/browser/anchor-sort-3MYLO74J.mjs.map +7 -0
  5. package/dist/lib/browser/{app-graph-serializer-OX62DNPT.mjs → app-graph-serializer-BZJ4TQOE.mjs} +10 -10
  6. package/dist/lib/browser/app-graph-serializer-BZJ4TQOE.mjs.map +7 -0
  7. package/dist/lib/browser/blueprint-definition-HED54GGW.mjs +13 -0
  8. package/dist/lib/browser/blueprint-definition-HED54GGW.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-3IPVL3E4.mjs +20 -0
  10. package/dist/lib/browser/chunk-3IPVL3E4.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-BE3IO2CM.mjs +150 -0
  12. package/dist/lib/browser/chunk-BE3IO2CM.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-BEE7VQPU.mjs → chunk-CN35HEBX.mjs} +13 -12
  16. package/dist/lib/browser/chunk-CN35HEBX.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-DLZ5RR3P.mjs +96 -0
  18. package/dist/lib/browser/chunk-DLZ5RR3P.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-OY6CGPOO.mjs → chunk-IBCHVMZW.mjs} +2 -2
  20. package/dist/lib/browser/{chunk-OY6CGPOO.mjs.map → chunk-IBCHVMZW.mjs.map} +2 -2
  21. package/dist/lib/browser/{chunk-Z7P6JGGW.mjs → chunk-NXT2E2BG.mjs} +9 -5
  22. package/dist/lib/browser/chunk-NXT2E2BG.mjs.map +7 -0
  23. package/dist/lib/browser/{chunk-LAVZ2W6X.mjs → chunk-OKNQ57GF.mjs} +9 -8
  24. package/dist/lib/browser/chunk-OKNQ57GF.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-V7P7EIWG.mjs +829 -0
  26. package/dist/lib/browser/chunk-V7P7EIWG.mjs.map +7 -0
  27. package/dist/lib/browser/index.mjs +22 -28
  28. package/dist/lib/browser/index.mjs.map +3 -3
  29. package/dist/lib/browser/{intent-resolver-WDDH56JC.mjs → intent-resolver-55ASQRIW.mjs} +9 -9
  30. package/dist/lib/browser/intent-resolver-55ASQRIW.mjs.map +7 -0
  31. package/dist/lib/browser/meta.json +1 -1
  32. package/dist/lib/browser/{react-surface-LN2XK2UN.mjs → react-surface-GPD6T435.mjs} +59 -63
  33. package/dist/lib/browser/react-surface-GPD6T435.mjs.map +7 -0
  34. package/dist/lib/browser/{settings-AABBTB4Q.mjs → settings-G3ZOXJQY.mjs} +5 -5
  35. package/dist/lib/browser/{settings-AABBTB4Q.mjs.map → settings-G3ZOXJQY.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-FTEHVH7P.mjs +13 -0
  42. package/dist/lib/node-esm/MarkdownCard-FTEHVH7P.mjs.map +7 -0
  43. package/dist/lib/node-esm/MarkdownContainer-L75AIJFM.mjs +16 -0
  44. package/dist/lib/node-esm/MarkdownContainer-L75AIJFM.mjs.map +7 -0
  45. package/dist/lib/node-esm/{anchor-sort-ALP2NH24.mjs → anchor-sort-W4HCTYUQ.mjs} +10 -10
  46. package/dist/lib/node-esm/anchor-sort-W4HCTYUQ.mjs.map +7 -0
  47. package/dist/lib/node-esm/{app-graph-serializer-56TD3BMX.mjs → app-graph-serializer-OCTHXWLF.mjs} +10 -10
  48. package/dist/lib/node-esm/app-graph-serializer-OCTHXWLF.mjs.map +7 -0
  49. package/dist/lib/node-esm/blueprint-definition-HAQGJOMQ.mjs +14 -0
  50. package/dist/lib/node-esm/blueprint-definition-HAQGJOMQ.mjs.map +7 -0
  51. package/dist/lib/node-esm/chunk-3DN4DPVA.mjs +151 -0
  52. package/dist/lib/node-esm/chunk-3DN4DPVA.mjs.map +7 -0
  53. package/dist/lib/node-esm/{chunk-O6EXWGGS.mjs → chunk-7GN66TDQ.mjs} +9 -8
  54. package/dist/lib/node-esm/chunk-7GN66TDQ.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-J7A6TUB2.mjs → chunk-I5JSQBPI.mjs} +9 -5
  58. package/dist/lib/node-esm/chunk-I5JSQBPI.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-VCG2U522.mjs → chunk-SHAMSMKQ.mjs} +4 -4
  60. package/dist/lib/node-esm/chunk-SHAMSMKQ.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-JPXFCBC4.mjs → chunk-TYUGABTD.mjs} +8 -8
  62. package/dist/lib/node-esm/chunk-TYUGABTD.mjs.map +7 -0
  63. package/dist/lib/node-esm/chunk-UVLACSAE.mjs +830 -0
  64. package/dist/lib/node-esm/chunk-UVLACSAE.mjs.map +7 -0
  65. package/dist/lib/node-esm/{chunk-FXILAQ5F.mjs → chunk-YFRTKXTB.mjs} +13 -12
  66. package/dist/lib/node-esm/chunk-YFRTKXTB.mjs.map +7 -0
  67. package/dist/lib/node-esm/chunk-ZNS55FS3.mjs +97 -0
  68. package/dist/lib/node-esm/chunk-ZNS55FS3.mjs.map +7 -0
  69. package/dist/lib/node-esm/index.mjs +22 -28
  70. package/dist/lib/node-esm/index.mjs.map +3 -3
  71. package/dist/lib/node-esm/{intent-resolver-2I5HKCUU.mjs → intent-resolver-DTBVWCNO.mjs} +9 -9
  72. package/dist/lib/node-esm/intent-resolver-DTBVWCNO.mjs.map +7 -0
  73. package/dist/lib/node-esm/meta.json +1 -1
  74. package/dist/lib/node-esm/{react-surface-DJGGKYBD.mjs → react-surface-QWG7CJ5U.mjs} +59 -63
  75. package/dist/lib/node-esm/react-surface-QWG7CJ5U.mjs.map +7 -0
  76. package/dist/lib/node-esm/{settings-CXGR6DH4.mjs → settings-IBFFCGNL.mjs} +5 -5
  77. package/dist/lib/node-esm/{settings-CXGR6DH4.mjs.map → settings-IBFFCGNL.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 -4
  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 +8 -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 +5 -9
  118. package/dist/types/src/functions/create.d.ts.map +1 -1
  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 -3
  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 +4 -0
  144. package/dist/types/src/translations.d.ts.map +1 -1
  145. package/dist/types/src/types/Markdown.d.ts +11 -9
  146. package/dist/types/src/types/Markdown.d.ts.map +1 -1
  147. package/dist/types/src/types/MarkdownAction.d.ts +6 -5
  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 +72 -56
  154. package/src/MarkdownPlugin.tsx +87 -98
  155. package/src/capabilities/anchor-sort.ts +7 -6
  156. package/src/capabilities/app-graph-serializer.ts +5 -5
  157. package/src/capabilities/artifact-definition.ts +7 -6
  158. package/src/capabilities/blueprint-definition.ts +30 -26
  159. package/src/capabilities/capabilities.ts +1 -0
  160. package/src/capabilities/index.ts +1 -1
  161. package/src/capabilities/intent-resolver.ts +4 -3
  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 -273
  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 +42 -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 +20 -9
  177. package/src/functions/index.ts +9 -3
  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} +61 -110
  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 +4 -0
  191. package/src/types/Markdown.ts +9 -8
  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-7M37DXAD.mjs +0 -781
  198. package/dist/lib/browser/MarkdownContainer-7M37DXAD.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-Z3RQGWUD.mjs +0 -11
  202. package/dist/lib/browser/chunk-BEE7VQPU.mjs.map +0 -7
  203. package/dist/lib/browser/chunk-D7UYVHL6.mjs +0 -20
  204. package/dist/lib/browser/chunk-D7UYVHL6.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-Z7P6JGGW.mjs.map +0 -7
  208. package/dist/lib/browser/chunk-ZVVKLB5L.mjs +0 -121
  209. package/dist/lib/browser/chunk-ZVVKLB5L.mjs.map +0 -7
  210. package/dist/lib/browser/intent-resolver-WDDH56JC.mjs.map +0 -7
  211. package/dist/lib/browser/react-surface-LN2XK2UN.mjs.map +0 -7
  212. package/dist/lib/node-esm/MarkdownCard-XL5EVSJ7.mjs +0 -81
  213. package/dist/lib/node-esm/MarkdownCard-XL5EVSJ7.mjs.map +0 -7
  214. package/dist/lib/node-esm/MarkdownContainer-K3BPAGWO.mjs +0 -782
  215. package/dist/lib/node-esm/MarkdownContainer-K3BPAGWO.mjs.map +0 -7
  216. package/dist/lib/node-esm/anchor-sort-ALP2NH24.mjs.map +0 -7
  217. package/dist/lib/node-esm/app-graph-serializer-56TD3BMX.mjs.map +0 -7
  218. package/dist/lib/node-esm/blueprint-definition-735OAX33.mjs +0 -12
  219. package/dist/lib/node-esm/chunk-FXILAQ5F.mjs.map +0 -7
  220. package/dist/lib/node-esm/chunk-J7A6TUB2.mjs.map +0 -7
  221. package/dist/lib/node-esm/chunk-JPXFCBC4.mjs.map +0 -7
  222. package/dist/lib/node-esm/chunk-O6EXWGGS.mjs.map +0 -7
  223. package/dist/lib/node-esm/chunk-VCG2U522.mjs.map +0 -7
  224. package/dist/lib/node-esm/chunk-Y422WR6A.mjs +0 -122
  225. package/dist/lib/node-esm/chunk-Y422WR6A.mjs.map +0 -7
  226. package/dist/lib/node-esm/intent-resolver-2I5HKCUU.mjs.map +0 -7
  227. package/dist/lib/node-esm/react-surface-DJGGKYBD.mjs.map +0 -7
  228. package/dist/types/src/components/Toolbar.stories.d.ts +0 -48
  229. package/dist/types/src/components/Toolbar.stories.d.ts.map +0 -1
  230. package/dist/types/src/extensions.d.ts +0 -24
  231. package/dist/types/src/extensions.d.ts.map +0 -1
  232. package/dist/types/src/functions/diff.d.ts.map +0 -1
  233. package/src/components/Toolbar.stories.tsx +0 -118
  234. /package/dist/lib/browser/{blueprint-definition-Z3RQGWUD.mjs.map → MarkdownCard-TC3GGUSX.mjs.map} +0 -0
  235. /package/dist/lib/{node-esm/blueprint-definition-735OAX33.mjs.map → browser/MarkdownContainer-YF22DV4M.mjs.map} +0 -0
@@ -0,0 +1,830 @@
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-7GN66TDQ.mjs";
8
+ import {
9
+ Markdown_exports
10
+ } from "./chunk-YFRTKXTB.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 } 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 { createDocAccessor } from "@dxos/echo-db";
82
+ import { invariant } from "@dxos/invariant";
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
+ messenger: 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 * as Option from "effect/Option";
265
+ import { useCallback as useCallback2, useMemo as useMemo3 } from "react";
266
+ import { Capabilities } from "@dxos/app-framework";
267
+ import { usePluginManager } from "@dxos/app-framework/react";
268
+ import { Filter, Obj as Obj2, Query, Type } from "@dxos/echo";
269
+ import { EntityKind, SystemTypeAnnotation, getTypeAnnotation } from "@dxos/echo/internal";
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 filter = useMemo3(() => Filter.or(...(space?.db.schemaRegistry.query({
279
+ location: [
280
+ "database",
281
+ "runtime"
282
+ ]
283
+ }).runSync() ?? []).filter((schema) => getTypeAnnotation(schema)?.kind !== EntityKind.Relation).filter((schema) => !SystemTypeAnnotation.get(schema).pipe(Option.getOrElse(() => false))).map((schema) => Filter.typename(Type.getTypename(schema)))), [
284
+ space
285
+ ]);
286
+ const handleLinkQuery = useCallback2(async (query) => {
287
+ const name = query?.startsWith("@") ? query.slice(1).toLowerCase() : query?.toLowerCase() ?? "";
288
+ const results = await space?.db.query(Query.select(filter)).run();
289
+ const getLabel = (object) => {
290
+ const label = Obj2.getLabel(object);
291
+ if (label) {
292
+ return label;
293
+ }
294
+ const type = Obj2.getTypename(object);
295
+ const metadata = resolve(type);
296
+ return metadata.label?.(object) || [
297
+ "object name placeholder",
298
+ {
299
+ ns: type,
300
+ default: "New object"
301
+ }
302
+ ];
303
+ };
304
+ const items = results?.objects.filter((object) => toLocalizedString2(getLabel(object), t).toLowerCase().includes(name)).map((object) => {
305
+ const metadata = resolve(Obj2.getTypename(object));
306
+ const label = toLocalizedString2(getLabel(object), t);
307
+ return {
308
+ id: object.id,
309
+ label,
310
+ icon: metadata.icon,
311
+ onSelect: ({ view, head }) => {
312
+ const link = `[${label}](${Obj2.getDXN(object)})`;
313
+ if (query?.startsWith("@")) {
314
+ insertAtLineStart(view, head, `!${link}
315
+ `);
316
+ } else {
317
+ insertAtCursor(view, head, `${link} `);
318
+ }
319
+ }
320
+ };
321
+ }) ?? [];
322
+ return [
323
+ {
324
+ id: "echo",
325
+ items
326
+ }
327
+ ];
328
+ }, [
329
+ space,
330
+ filter,
331
+ resolve
332
+ ]);
333
+ return handleLinkQuery;
334
+ };
335
+
336
+ // src/hooks/useSelectCurrentThread.tsx
337
+ import { EditorView as EditorView2 } from "@codemirror/view";
338
+ import * as Schema from "effect/Schema";
339
+ import { useMemo as useMemo4 } from "react";
340
+ import { LayoutAction as LayoutAction2, createResolver } from "@dxos/app-framework";
341
+ import { useIntentResolver } from "@dxos/app-framework/react";
342
+ import { invariant as invariant2 } from "@dxos/invariant";
343
+ import { Cursor as Cursor2, setSelection } from "@dxos/react-ui-editor";
344
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/plugins/plugin-markdown/src/hooks/useSelectCurrentThread.tsx";
345
+ var useSelectCurrentThread = (editorView, documentId2) => {
346
+ const scrollIntoViewResolver = useMemo4(() => createResolver({
347
+ intent: LayoutAction2.UpdateLayout,
348
+ position: "hoist",
349
+ filter: (data) => {
350
+ if (!Schema.is(LayoutAction2.ScrollIntoView.fields.input)(data)) {
351
+ return false;
352
+ }
353
+ return !!editorView && data.subject === documentId2 && !!data.options?.cursor;
354
+ },
355
+ resolve: ({ options: { cursor } }) => {
356
+ invariant2(editorView, "Editor view is not defined.", {
357
+ F: __dxlog_file2,
358
+ L: 39,
359
+ S: void 0,
360
+ A: [
361
+ "editorView",
362
+ "'Editor view is not defined.'"
363
+ ]
364
+ });
365
+ const range = Cursor2.getRangeFromCursor(editorView.state, cursor);
366
+ if (range) {
367
+ const selection = editorView.state.selection.main.from !== range.from ? {
368
+ anchor: range.from
369
+ } : void 0;
370
+ const effects = [
371
+ // NOTE: This does not use the DOM scrollIntoView function.
372
+ EditorView2.scrollIntoView(range.from, {
373
+ y: "start",
374
+ yMargin: 96
375
+ })
376
+ ];
377
+ if (selection) {
378
+ effects.push(setSelection.of({
379
+ current: documentId2
380
+ }));
381
+ }
382
+ editorView.dispatch({
383
+ effects,
384
+ selection: selection ? {
385
+ anchor: range.from
386
+ } : void 0
387
+ });
388
+ }
389
+ }
390
+ }), [
391
+ documentId2,
392
+ editorView
393
+ ]);
394
+ useIntentResolver(meta.id, scrollIntoViewResolver);
395
+ };
396
+
397
+ // src/components/MarkdownEditor/MarkdownEditor.tsx
398
+ import { useSignals as _useSignals4 } from "@preact-signals/safe-react/tracking";
399
+ import { createContext } from "@radix-ui/react-context";
400
+ import React5, { useMemo as useMemo6, useState as useState2 } from "react";
401
+ import { createPortal as createPortal2 } from "react-dom";
402
+ import { Surface } from "@dxos/app-framework/react";
403
+ import { DXN } from "@dxos/keys";
404
+ import { useClient } from "@dxos/react-client";
405
+ import { EditorMenuProvider, useEditorMenu, useEditorToolbar } from "@dxos/react-ui-editor";
406
+ import { isNonNullable } from "@dxos/util";
407
+
408
+ // src/components/MarkdownEditor/MarkdownEditorContent.tsx
409
+ import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
410
+ import React2, { forwardRef, useEffect, useImperativeHandle, useMemo as useMemo5 } from "react";
411
+ import { useDynamicRef, useThemeContext, useTranslation as useTranslation3 } from "@dxos/react-ui";
412
+ import { createBasicExtensions, createMarkdownExtensions, createThemeExtensions, dropFile, editorGutter, editorSlots, formattingListener, processEditorPayload, stackItemContentEditorClassNames, useTextEditor } from "@dxos/react-ui-editor";
413
+ import { isTruthy as isTruthy2 } from "@dxos/util";
414
+ var MarkdownEditorContent = /* @__PURE__ */ forwardRef(({ id, role, initialValue, editorStateStore, toolbarState, extensions, viewMode, scrollPastEnd, onFileUpload }, forwardedRef) => {
415
+ var _effect = _useSignals();
416
+ try {
417
+ const { t } = useTranslation3(meta.id);
418
+ const { themeMode } = useThemeContext();
419
+ const toolbarStateRef = useDynamicRef(toolbarState);
420
+ const { scrollTo, selection } = useMemo5(() => editorStateStore?.getState(id) ?? {}, [
421
+ id
422
+ ]);
423
+ const { parentRef, view: editorView, focusAttributes } = useTextEditor(() => ({
424
+ ...role !== "section" && {
425
+ id,
426
+ scrollTo,
427
+ selection,
428
+ // TODO(wittjosiah): Autofocus based on layout is racy.
429
+ // autoFocus: layoutPlugin?.provides.layout ? layoutPlugin?.provides.layout.scrollIntoView === id : true,
430
+ selectionEnd: true
431
+ },
432
+ initialValue,
433
+ extensions: [
434
+ createBasicExtensions({
435
+ readOnly: viewMode === "readonly",
436
+ placeholder: t("editor placeholder"),
437
+ scrollPastEnd: scrollPastEnd && role !== "section",
438
+ search: true
439
+ }),
440
+ createThemeExtensions({
441
+ themeMode,
442
+ slots: editorSlots,
443
+ syntaxHighlighting: true
444
+ }),
445
+ createMarkdownExtensions(),
446
+ formattingListener(() => toolbarStateRef.current),
447
+ editorGutter,
448
+ role !== "section" && onFileUpload && dropFile({
449
+ // TODO(wittjosiah): Factor out to file uploader plugin.
450
+ onDrop: async (view, { files }) => {
451
+ const file = files[0];
452
+ const info = file && onFileUpload ? await onFileUpload(file) : void 0;
453
+ if (info) {
454
+ processEditorPayload(view, {
455
+ type: "image",
456
+ data: info.url
457
+ });
458
+ }
459
+ }
460
+ }),
461
+ extensions
462
+ ].filter(isTruthy2)
463
+ }), [
464
+ id,
465
+ viewMode,
466
+ themeMode,
467
+ extensions
468
+ ]);
469
+ useImperativeHandle(forwardedRef, () => editorView, [
470
+ editorView
471
+ ]);
472
+ useSelectCurrentThread(editorView, id);
473
+ useTest(editorView);
474
+ return /* @__PURE__ */ React2.createElement("div", {
475
+ role: "none",
476
+ ref: parentRef,
477
+ "data-testid": "composer.markdownRoot",
478
+ className: stackItemContentEditorClassNames(role),
479
+ "data-popover-collision-boundary": true,
480
+ ...focusAttributes
481
+ });
482
+ } finally {
483
+ _effect.f();
484
+ }
485
+ });
486
+ var useTest = (view) => {
487
+ useEffect(() => {
488
+ const composer = window.composer;
489
+ if (composer) {
490
+ composer.editorView = view;
491
+ }
492
+ }, [
493
+ view
494
+ ]);
495
+ };
496
+
497
+ // src/components/MarkdownEditor/MarkdownEditorToolbar.tsx
498
+ import { useSignals as _useSignals3 } from "@preact-signals/safe-react/tracking";
499
+ import React4, { useCallback as useCallback3, useState } from "react";
500
+ import { invariant as invariant3 } from "@dxos/invariant";
501
+ import { EditorToolbar } from "@dxos/react-ui-editor";
502
+
503
+ // src/components/MarkdownEditor/FileUpload.tsx
504
+ import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
505
+ import React3, { forwardRef as forwardRef2, useEffect as useEffect2, useImperativeHandle as useImperativeHandle2 } from "react";
506
+ import { createPortal } from "react-dom";
507
+ import { useDropzone } from "react-dropzone";
508
+ import { addLink } from "@dxos/react-ui-editor";
509
+ var IMAGE_FILES = [
510
+ ".jpg",
511
+ ".jpeg",
512
+ ".png",
513
+ ".gif"
514
+ ];
515
+ var FileUpload = /* @__PURE__ */ forwardRef2(({ editorView, onFileUpload }, forwardedRef) => {
516
+ var _effect = _useSignals2();
517
+ try {
518
+ const { acceptedFiles, open, inputRef } = useDropzone({
519
+ disabled: !onFileUpload,
520
+ multiple: false,
521
+ noDrag: true,
522
+ accept: {
523
+ "image/*": IMAGE_FILES
524
+ }
525
+ });
526
+ useImperativeHandle2(forwardedRef, () => open, []);
527
+ useEffect2(() => {
528
+ if (editorView && acceptedFiles.length && onFileUpload) {
529
+ requestAnimationFrame(async () => {
530
+ const f = acceptedFiles[0];
531
+ const file = new File([
532
+ f
533
+ ], f.name, {
534
+ type: f.type,
535
+ lastModified: f.lastModified
536
+ });
537
+ const info = await onFileUpload(file);
538
+ if (info) {
539
+ addLink({
540
+ url: info.url,
541
+ image: true
542
+ })(editorView);
543
+ }
544
+ });
545
+ }
546
+ }, [
547
+ editorView,
548
+ acceptedFiles,
549
+ onFileUpload
550
+ ]);
551
+ if (!onFileUpload) {
552
+ return null;
553
+ }
554
+ return /* @__PURE__ */ React3.createElement(React3.Fragment, null, /* @__PURE__ */ createPortal(/* @__PURE__ */ React3.createElement("input", {
555
+ ref: inputRef
556
+ }), document.body), " ");
557
+ } finally {
558
+ _effect.f();
559
+ }
560
+ });
561
+
562
+ // src/components/MarkdownEditor/MarkdownEditorToolbar.tsx
563
+ var __dxlog_file3 = "/__w/dxos/dxos/packages/plugins/plugin-markdown/src/components/MarkdownEditor/MarkdownEditorToolbar.tsx";
564
+ var MarkdownEditorToolbar = ({ classNames, id, role, state, editorView, customActions, onFileUpload, onViewModeChange }) => {
565
+ var _effect = _useSignals3();
566
+ try {
567
+ const [upload, setUpload] = useState(null);
568
+ const uploadRef = useCallback3((next) => setUpload(() => next), []);
569
+ const handleViewModeChange = useCallback3((mode) => onViewModeChange?.(mode), [
570
+ onViewModeChange
571
+ ]);
572
+ const getView = useCallback3(() => {
573
+ invariant3(editorView, void 0, {
574
+ F: __dxlog_file3,
575
+ L: 39,
576
+ S: void 0,
577
+ A: [
578
+ "editorView",
579
+ ""
580
+ ]
581
+ });
582
+ return editorView;
583
+ }, [
584
+ editorView
585
+ ]);
586
+ if (!editorView) {
587
+ return /* @__PURE__ */ React4.createElement("div", null);
588
+ }
589
+ return /* @__PURE__ */ React4.createElement(React4.Fragment, null, /* @__PURE__ */ React4.createElement(EditorToolbar, {
590
+ classNames,
591
+ attendableId: id,
592
+ role,
593
+ state,
594
+ customActions,
595
+ getView,
596
+ onImageUpload: upload ?? void 0,
597
+ onViewModeChange: handleViewModeChange
598
+ }), onFileUpload && /* @__PURE__ */ React4.createElement(FileUpload, {
599
+ ref: uploadRef,
600
+ editorView,
601
+ onFileUpload
602
+ }));
603
+ } finally {
604
+ _effect.f();
605
+ }
606
+ };
607
+
608
+ // src/components/MarkdownEditor/MarkdownEditor.tsx
609
+ var [MarkdownEditorContextProvider, useMarkdownEditorContext] = createContext("MarkdownEditor.Context");
610
+ var MarkdownEditorRoot = ({ children, id, object, editorStateStore, selectionManager, settings, viewMode, extensions: extensionsParam, slashCommandGroups, onLinkQuery, ...props }) => {
611
+ var _effect = _useSignals4();
612
+ try {
613
+ const [editorView, setEditorView] = useState2();
614
+ const [previewBlocks, setPreviewBlocks] = useState2([]);
615
+ const previewOptions = useMemo6(() => ({
616
+ addBlockContainer: (block) => {
617
+ setPreviewBlocks((prev) => [
618
+ ...prev,
619
+ block
620
+ ]);
621
+ },
622
+ removeBlockContainer: ({ link }) => {
623
+ setPreviewBlocks((prev) => prev.filter(({ link: prevLink }) => prevLink.ref !== link.ref));
624
+ }
625
+ }), []);
626
+ const toolbarState = useEditorToolbar({
627
+ viewMode
628
+ });
629
+ const menuOptions = useEditorMenuOptions({
630
+ editorView,
631
+ slashCommandGroups,
632
+ onLinkQuery
633
+ });
634
+ const { extension: menuExtension, ...menuProps } = useEditorMenu(menuOptions);
635
+ const coreExtensions = useExtensions({
636
+ id,
637
+ object,
638
+ editorStateStore,
639
+ previewOptions,
640
+ selectionManager,
641
+ settings,
642
+ viewMode
643
+ });
644
+ const extensions = useMemo6(() => [
645
+ coreExtensions,
646
+ menuExtension,
647
+ extensionsParam
648
+ ].filter(isNonNullable), [
649
+ coreExtensions,
650
+ menuExtension,
651
+ extensionsParam
652
+ ]);
653
+ return /* @__PURE__ */ React5.createElement(MarkdownEditorContextProvider, {
654
+ id,
655
+ editorView,
656
+ setEditorView,
657
+ extensions,
658
+ previewBlocks,
659
+ toolbarState,
660
+ popoverMenu: menuProps,
661
+ viewMode,
662
+ ...props
663
+ }, children);
664
+ } finally {
665
+ _effect.f();
666
+ }
667
+ };
668
+ MarkdownEditorRoot.displayName = "MarkdownEditor.Root";
669
+ var MarkdownEditorContent2 = (props) => {
670
+ var _effect = _useSignals4();
671
+ try {
672
+ const { id, extensions, editorView, setEditorView, toolbarState, viewMode, popoverMenu: { groupsRef, ...menuProps } } = useMarkdownEditorContext(MarkdownEditorContent2.displayName);
673
+ return /* @__PURE__ */ React5.createElement(EditorMenuProvider, {
674
+ view: editorView,
675
+ groups: groupsRef.current,
676
+ ...menuProps
677
+ }, /* @__PURE__ */ React5.createElement(MarkdownEditorContent, {
678
+ ...props,
679
+ id,
680
+ extensions,
681
+ toolbarState,
682
+ viewMode,
683
+ ref: setEditorView
684
+ }));
685
+ } finally {
686
+ _effect.f();
687
+ }
688
+ };
689
+ MarkdownEditorContent2.displayName = "MarkdownEditor.Content";
690
+ var MarkdownEditorToolbar2 = (props) => {
691
+ var _effect = _useSignals4();
692
+ try {
693
+ const { toolbarState, ...rootProps } = useMarkdownEditorContext(MarkdownEditorToolbar2.displayName);
694
+ return /* @__PURE__ */ React5.createElement(MarkdownEditorToolbar, {
695
+ ...props,
696
+ ...rootProps,
697
+ state: toolbarState
698
+ });
699
+ } finally {
700
+ _effect.f();
701
+ }
702
+ };
703
+ MarkdownEditorToolbar2.displayName = "MarkdownEditor.Toolbar";
704
+ var MarkdownEditorBlocks = (_props) => {
705
+ var _effect = _useSignals4();
706
+ try {
707
+ const { previewBlocks } = useMarkdownEditorContext(MarkdownEditorBlocks.displayName);
708
+ return /* @__PURE__ */ React5.createElement(React5.Fragment, null, previewBlocks.map(({ link, el }) => /* @__PURE__ */ React5.createElement(PreviewBlock, {
709
+ key: link.ref,
710
+ link,
711
+ el
712
+ })));
713
+ } finally {
714
+ _effect.f();
715
+ }
716
+ };
717
+ MarkdownEditorBlocks.displayName = "MarkdownEditor.Blocks";
718
+ var PreviewBlock = ({ el, link }) => {
719
+ var _effect = _useSignals4();
720
+ try {
721
+ const client = useClient();
722
+ const dxn = DXN.parse(link.ref);
723
+ const subject = client.graph.ref(dxn).target;
724
+ const data = useMemo6(() => ({
725
+ subject
726
+ }), [
727
+ subject
728
+ ]);
729
+ return /* @__PURE__ */ createPortal2(/* @__PURE__ */ React5.createElement(Surface, {
730
+ role: "card--transclusion",
731
+ data,
732
+ limit: 1
733
+ }), el);
734
+ } finally {
735
+ _effect.f();
736
+ }
737
+ };
738
+ var MarkdownEditor = {
739
+ Root: MarkdownEditorRoot,
740
+ Content: MarkdownEditorContent2,
741
+ Toolbar: MarkdownEditorToolbar2,
742
+ Blocks: MarkdownEditorBlocks
743
+ };
744
+
745
+ // src/components/MarkdownContainer.tsx
746
+ var MarkdownContainer = ({ id, role, object, settings, extensionProviders, ...props }) => {
747
+ var _effect = _useSignals5();
748
+ try {
749
+ const space = getSpace2(object);
750
+ const isDocument = Obj3.instanceOf(Markdown_exports.Document, object);
751
+ const isText = Obj3.instanceOf(Text2.Text, object);
752
+ const attendableId = isDocument ? Obj3.getDXN(object).toString() : void 0;
753
+ const otherExtensionProviders = useCapabilities(MarkdownCapabilities.Extensions);
754
+ const extensions = useMemo7(() => {
755
+ if (!Obj3.instanceOf(Markdown_exports.Document, object)) {
756
+ return [];
757
+ }
758
+ return [
759
+ ...otherExtensionProviders ?? [],
760
+ ...extensionProviders ?? []
761
+ ].flat().reduce((acc, provider) => {
762
+ const extension = typeof provider === "function" ? provider({
763
+ document: object
764
+ }) : provider;
765
+ if (extension) {
766
+ acc.push(extension);
767
+ }
768
+ return acc;
769
+ }, []);
770
+ }, [
771
+ extensionProviders,
772
+ otherExtensionProviders,
773
+ object
774
+ ]);
775
+ const { graph } = useAppGraph();
776
+ const customActions = useMemo7(() => {
777
+ return Atom.make((get) => {
778
+ const actions = get(graph.actions(id));
779
+ const nodes = actions.filter((action) => action.properties.disposition === "toolbar");
780
+ const edges = nodes.map((node) => ({
781
+ source: "root",
782
+ target: node.id
783
+ }));
784
+ return {
785
+ nodes,
786
+ edges
787
+ };
788
+ });
789
+ }, [
790
+ graph
791
+ ]);
792
+ const [upload] = useCapabilities(Capabilities2.FileUploader);
793
+ const handleFileUpload = useMemo7(() => {
794
+ if (!space || !upload) {
795
+ return void 0;
796
+ }
797
+ return async (file) => upload(space, file);
798
+ }, [
799
+ space,
800
+ upload
801
+ ]);
802
+ const handleLinkQuery = useLinkQuery(space);
803
+ return /* @__PURE__ */ React6.createElement(StackItem.Content, {
804
+ toolbar: settings.toolbar
805
+ }, /* @__PURE__ */ React6.createElement(MarkdownEditor.Root, {
806
+ id: attendableId ?? id,
807
+ object,
808
+ extensions,
809
+ onFileUpload: handleFileUpload,
810
+ onLinkQuery: handleLinkQuery,
811
+ ...props
812
+ }, settings.toolbar && /* @__PURE__ */ React6.createElement(MarkdownEditor.Toolbar, {
813
+ id: attendableId ?? id,
814
+ role,
815
+ customActions
816
+ }), /* @__PURE__ */ React6.createElement(MarkdownEditor.Content, {
817
+ initialValue: isDocument ? object.content?.target?.content : isText ? object.content : object.text,
818
+ scrollPastEnd: role === "article"
819
+ }), /* @__PURE__ */ React6.createElement(MarkdownEditor.Blocks, null)));
820
+ } finally {
821
+ _effect.f();
822
+ }
823
+ };
824
+ var MarkdownContainer_default = MarkdownContainer;
825
+
826
+ export {
827
+ MarkdownContainer,
828
+ MarkdownContainer_default
829
+ };
830
+ //# sourceMappingURL=chunk-UVLACSAE.mjs.map