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