@dxos/plugin-markdown 0.8.4-main.406dc2a → 0.8.4-main.548089c

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