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

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