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