@dxos/plugin-markdown 0.8.4-main.f9ba587 → 0.8.4-main.fd6878d
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.
- package/dist/lib/browser/{MarkdownPreview-XYP2VXI2.mjs → MarkdownCard-IMCR4A4V.mjs} +17 -17
- package/dist/lib/browser/MarkdownCard-IMCR4A4V.mjs.map +7 -0
- package/dist/lib/browser/{MarkdownContainer-BO5MZWA4.mjs → MarkdownContainer-VGJPHMVG.mjs} +274 -265
- package/dist/lib/browser/MarkdownContainer-VGJPHMVG.mjs.map +7 -0
- package/dist/lib/browser/{anchor-sort-UKJJ7ZNP.mjs → anchor-sort-AJKRIWFD.mjs} +5 -5
- package/dist/lib/browser/anchor-sort-AJKRIWFD.mjs.map +7 -0
- package/dist/lib/browser/{app-graph-serializer-7DKUUZSJ.mjs → app-graph-serializer-OIS3MZX2.mjs} +10 -10
- package/dist/lib/browser/app-graph-serializer-OIS3MZX2.mjs.map +7 -0
- package/dist/lib/browser/chunk-IKPZHFTW.mjs +30 -0
- package/dist/lib/browser/chunk-IKPZHFTW.mjs.map +7 -0
- package/dist/lib/browser/chunk-JHH7VL52.mjs +18 -0
- package/dist/lib/browser/chunk-JHH7VL52.mjs.map +7 -0
- package/dist/lib/browser/{chunk-LFML7LC6.mjs → chunk-JMBQG2ZC.mjs} +8 -9
- package/dist/lib/browser/chunk-JMBQG2ZC.mjs.map +7 -0
- package/dist/lib/browser/chunk-JTIGSUMB.mjs +80 -0
- package/dist/lib/browser/chunk-JTIGSUMB.mjs.map +7 -0
- package/dist/lib/browser/chunk-LMJPXTPL.mjs +16 -0
- package/dist/lib/browser/chunk-LMJPXTPL.mjs.map +7 -0
- package/dist/lib/browser/{chunk-5JRBJCZM.mjs → chunk-MVL4K3OD.mjs} +8 -6
- package/dist/lib/browser/chunk-MVL4K3OD.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +20 -22
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{intent-resolver-3MXYO3MW.mjs → intent-resolver-BLLHRSTQ.mjs} +14 -18
- package/dist/lib/browser/intent-resolver-BLLHRSTQ.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{react-surface-NAXBGUR3.mjs → react-surface-NL3BZR6H.mjs} +28 -25
- package/dist/lib/browser/react-surface-NL3BZR6H.mjs.map +7 -0
- package/dist/lib/browser/{settings-KN75ZQY6.mjs → settings-Z7ZV7SLC.mjs} +5 -5
- package/dist/lib/browser/settings-Z7ZV7SLC.mjs.map +7 -0
- package/dist/lib/browser/{state-LZWTAS65.mjs → state-ORTZIEJU.mjs} +7 -7
- package/dist/lib/browser/state-ORTZIEJU.mjs.map +7 -0
- package/dist/lib/browser/types/index.mjs +6 -14
- package/dist/lib/node-esm/{MarkdownPreview-JEXD3KSQ.mjs → MarkdownCard-JV2YDV3M.mjs} +17 -17
- package/dist/lib/node-esm/MarkdownCard-JV2YDV3M.mjs.map +7 -0
- package/dist/lib/node-esm/{MarkdownContainer-J2NVCX2H.mjs → MarkdownContainer-BJRNCXJZ.mjs} +274 -265
- package/dist/lib/node-esm/MarkdownContainer-BJRNCXJZ.mjs.map +7 -0
- package/dist/lib/node-esm/{anchor-sort-IPIS5D5B.mjs → anchor-sort-N7WEA5E3.mjs} +5 -5
- package/dist/lib/node-esm/anchor-sort-N7WEA5E3.mjs.map +7 -0
- package/dist/lib/node-esm/{app-graph-serializer-YRMRPW7A.mjs → app-graph-serializer-Q3B44VFB.mjs} +10 -10
- package/dist/lib/node-esm/app-graph-serializer-Q3B44VFB.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-ACFGXH2K.mjs → chunk-AYWAYBAY.mjs} +5 -5
- package/dist/lib/node-esm/chunk-AYWAYBAY.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-H4I2FGDZ.mjs +31 -0
- package/dist/lib/node-esm/chunk-H4I2FGDZ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-H6TITL7A.mjs +20 -0
- package/dist/lib/node-esm/chunk-H6TITL7A.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-CWTFQSN7.mjs → chunk-JDMMLOB6.mjs} +8 -9
- package/dist/lib/node-esm/chunk-JDMMLOB6.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-KIRZFVX5.mjs +81 -0
- package/dist/lib/node-esm/chunk-KIRZFVX5.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-Q5DIKLN5.mjs → chunk-Z4XQ6C3D.mjs} +8 -6
- package/dist/lib/node-esm/chunk-Z4XQ6C3D.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +20 -22
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{intent-resolver-BZYWV53A.mjs → intent-resolver-NHPUPSWK.mjs} +14 -18
- package/dist/lib/node-esm/intent-resolver-NHPUPSWK.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-surface-BSAGEIN6.mjs → react-surface-XJ6ODCBE.mjs} +28 -25
- package/dist/lib/node-esm/react-surface-XJ6ODCBE.mjs.map +7 -0
- package/dist/lib/node-esm/{settings-KVP7TVX7.mjs → settings-UCXEWBCT.mjs} +5 -5
- package/dist/lib/node-esm/settings-UCXEWBCT.mjs.map +7 -0
- package/dist/lib/node-esm/{state-NW3W4JCQ.mjs → state-47WSZG54.mjs} +7 -7
- package/dist/lib/node-esm/state-47WSZG54.mjs.map +7 -0
- package/dist/lib/node-esm/types/index.mjs +6 -14
- package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -1
- package/dist/types/src/capabilities/artifact-definition.d.ts +1 -1
- package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
- package/dist/types/src/capabilities/capabilities.d.ts +1 -1
- package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +1 -2
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/state.d.ts.map +1 -1
- package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts +7 -0
- package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts.map +1 -0
- package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts +42 -0
- package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts.map +1 -0
- package/dist/types/src/components/MarkdownCard/index.d.ts +4 -0
- package/dist/types/src/components/MarkdownCard/index.d.ts.map +1 -0
- package/dist/types/src/components/MarkdownContainer.d.ts +5 -5
- package/dist/types/src/components/MarkdownContainer.d.ts.map +1 -1
- package/dist/types/src/components/MarkdownContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +1 -1
- package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
- package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts +2 -2
- package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts.map +1 -1
- package/dist/types/src/components/Suggestions.stories.d.ts +2 -2
- package/dist/types/src/components/Suggestions.stories.d.ts.map +1 -1
- package/dist/types/src/components/Toolbar.stories.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +1 -1
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/events.d.ts.map +1 -1
- package/dist/types/src/extensions.d.ts +4 -4
- package/dist/types/src/extensions.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +2 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +1 -1
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +4 -2
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/Markdown.d.ts +43 -0
- package/dist/types/src/types/Markdown.d.ts.map +1 -0
- package/dist/types/src/types/MarkdownAction.d.ts +42 -0
- package/dist/types/src/types/MarkdownAction.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +2 -1
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +3 -59
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/src/util.d.ts +12 -3
- package/dist/types/src/util.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +43 -41
- package/src/MarkdownPlugin.tsx +8 -14
- package/src/capabilities/anchor-sort.ts +3 -3
- package/src/capabilities/app-graph-serializer.ts +6 -4
- package/src/capabilities/artifact-definition.ts +16 -13
- package/src/capabilities/capabilities.ts +5 -4
- package/src/capabilities/index.ts +0 -1
- package/src/capabilities/intent-resolver.ts +8 -13
- package/src/capabilities/react-surface.tsx +22 -20
- package/src/capabilities/settings.ts +3 -3
- package/src/capabilities/state.ts +8 -8
- package/src/components/MarkdownCard/MarkdownCard.stories.tsx +79 -0
- package/src/components/{MarkdownPreview/MarkdownPreview.tsx → MarkdownCard/MarkdownCard.tsx} +19 -15
- package/src/components/MarkdownCard/index.ts +9 -0
- package/src/components/MarkdownContainer.stories.tsx +8 -11
- package/src/components/MarkdownContainer.tsx +30 -16
- package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +2 -1
- package/src/components/MarkdownEditor/MarkdownEditor.tsx +9 -8
- package/src/components/MarkdownSettings/MarkdownSettings.tsx +4 -4
- package/src/components/Suggestions.stories.tsx +25 -19
- package/src/components/Toolbar.stories.tsx +4 -5
- package/src/components/index.ts +1 -1
- package/src/events.ts +2 -2
- package/src/extensions.tsx +12 -12
- package/src/hooks/useSelectCurrentThread.tsx +3 -3
- package/src/index.ts +4 -1
- package/src/meta.ts +10 -8
- package/src/translations.ts +4 -2
- package/src/types/Markdown.ts +55 -0
- package/src/types/MarkdownAction.ts +31 -0
- package/src/types/index.ts +2 -1
- package/src/types/types.ts +5 -50
- package/src/util.tsx +20 -6
- package/dist/lib/browser/MarkdownContainer-BO5MZWA4.mjs.map +0 -7
- package/dist/lib/browser/MarkdownPreview-XYP2VXI2.mjs.map +0 -7
- package/dist/lib/browser/anchor-sort-UKJJ7ZNP.mjs.map +0 -7
- package/dist/lib/browser/app-graph-serializer-7DKUUZSJ.mjs.map +0 -7
- package/dist/lib/browser/artifact-definition-JSUG6XPF.mjs +0 -145
- package/dist/lib/browser/artifact-definition-JSUG6XPF.mjs.map +0 -7
- package/dist/lib/browser/chunk-5JRBJCZM.mjs.map +0 -7
- package/dist/lib/browser/chunk-777RIED6.mjs +0 -16
- package/dist/lib/browser/chunk-777RIED6.mjs.map +0 -7
- package/dist/lib/browser/chunk-EPTSAJZM.mjs +0 -22
- package/dist/lib/browser/chunk-EPTSAJZM.mjs.map +0 -7
- package/dist/lib/browser/chunk-IZLATPXQ.mjs +0 -20
- package/dist/lib/browser/chunk-IZLATPXQ.mjs.map +0 -7
- package/dist/lib/browser/chunk-LFML7LC6.mjs.map +0 -7
- package/dist/lib/browser/chunk-UANWRJZU.mjs +0 -79
- package/dist/lib/browser/chunk-UANWRJZU.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-3MXYO3MW.mjs.map +0 -7
- package/dist/lib/browser/react-surface-NAXBGUR3.mjs.map +0 -7
- package/dist/lib/browser/settings-KN75ZQY6.mjs.map +0 -7
- package/dist/lib/browser/state-LZWTAS65.mjs.map +0 -7
- package/dist/lib/node-esm/MarkdownContainer-J2NVCX2H.mjs.map +0 -7
- package/dist/lib/node-esm/MarkdownPreview-JEXD3KSQ.mjs.map +0 -7
- package/dist/lib/node-esm/anchor-sort-IPIS5D5B.mjs.map +0 -7
- package/dist/lib/node-esm/app-graph-serializer-YRMRPW7A.mjs.map +0 -7
- package/dist/lib/node-esm/artifact-definition-6C2MOHGP.mjs +0 -146
- package/dist/lib/node-esm/artifact-definition-6C2MOHGP.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-ACFGXH2K.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-CWTFQSN7.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-CXG7GMYP.mjs +0 -24
- package/dist/lib/node-esm/chunk-CXG7GMYP.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-FWKOJW6J.mjs +0 -22
- package/dist/lib/node-esm/chunk-FWKOJW6J.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-JEEQLO7C.mjs +0 -80
- package/dist/lib/node-esm/chunk-JEEQLO7C.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-Q5DIKLN5.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-BZYWV53A.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-BSAGEIN6.mjs.map +0 -7
- package/dist/lib/node-esm/settings-KVP7TVX7.mjs.map +0 -7
- package/dist/lib/node-esm/state-NW3W4JCQ.mjs.map +0 -7
- package/dist/types/src/components/MarkdownPreview/MarkdownPreview.d.ts +0 -6
- package/dist/types/src/components/MarkdownPreview/MarkdownPreview.d.ts.map +0 -1
- package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts +0 -17
- package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts.map +0 -1
- package/dist/types/src/components/MarkdownPreview/index.d.ts +0 -4
- package/dist/types/src/components/MarkdownPreview/index.d.ts.map +0 -1
- package/dist/types/src/types/schema.d.ts +0 -35
- package/dist/types/src/types/schema.d.ts.map +0 -1
- package/src/components/MarkdownPreview/MarkdownPreview.stories.tsx +0 -74
- package/src/components/MarkdownPreview/index.ts +0 -9
- package/src/types/schema.ts +0 -39
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import "./chunk-
|
|
1
|
+
import "./chunk-JHH7VL52.mjs";
|
|
2
2
|
import {
|
|
3
3
|
MarkdownCapabilities
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-LMJPXTPL.mjs";
|
|
5
5
|
import {
|
|
6
6
|
getFallbackName,
|
|
7
7
|
setFallbackName
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-JMBQG2ZC.mjs";
|
|
9
9
|
import {
|
|
10
|
-
|
|
11
|
-
} from "./chunk-
|
|
10
|
+
Markdown_exports
|
|
11
|
+
} from "./chunk-JTIGSUMB.mjs";
|
|
12
12
|
import {
|
|
13
|
-
|
|
14
|
-
} from "./chunk-
|
|
13
|
+
meta
|
|
14
|
+
} from "./chunk-IKPZHFTW.mjs";
|
|
15
15
|
|
|
16
16
|
// src/components/MarkdownContainer.tsx
|
|
17
17
|
import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
|
|
@@ -19,44 +19,260 @@ import { Rx } from "@effect-rx/rx-react";
|
|
|
19
19
|
import React3, { useCallback as useCallback2, useEffect as useEffect2, useMemo as useMemo4, useState } from "react";
|
|
20
20
|
import { createPortal } from "react-dom";
|
|
21
21
|
import { Capabilities, Surface, useAppGraph, useCapabilities as useCapabilities2, usePluginManager } from "@dxos/app-framework";
|
|
22
|
-
import { DXN, Filter, Obj, Query } from "@dxos/echo";
|
|
22
|
+
import { DXN, Filter, Obj, Query, Type } from "@dxos/echo";
|
|
23
|
+
import { ClientCapabilities } from "@dxos/plugin-client";
|
|
23
24
|
import { SpaceCapabilities } from "@dxos/plugin-space";
|
|
24
25
|
import { fullyQualifiedId as fullyQualifiedId2, getSpace as getSpace2, useQuery, useSpace } from "@dxos/react-client/echo";
|
|
25
26
|
import { toLocalizedString as toLocalizedString2, useTranslation as useTranslation2 } from "@dxos/react-ui";
|
|
26
27
|
import { insertAtCursor, insertAtLineStart } from "@dxos/react-ui-editor";
|
|
27
28
|
import { DataType } from "@dxos/schema";
|
|
28
29
|
|
|
30
|
+
// src/extensions.tsx
|
|
31
|
+
import React, { useMemo } from "react";
|
|
32
|
+
import { createRoot } from "react-dom/client";
|
|
33
|
+
import { LayoutAction, createIntent, useCapabilities, useIntentDispatcher } from "@dxos/app-framework";
|
|
34
|
+
import { debounceAndThrottle } from "@dxos/async";
|
|
35
|
+
import { invariant } from "@dxos/invariant";
|
|
36
|
+
import { createDocAccessor, fullyQualifiedId, getSpace } from "@dxos/react-client/echo";
|
|
37
|
+
import { useIdentity } from "@dxos/react-client/halo";
|
|
38
|
+
import { Icon, ThemeProvider } from "@dxos/react-ui";
|
|
39
|
+
import { Cursor, EditorView, InputModeExtensions, autocomplete, createDataExtensions, decorateMarkdown, documentId, folding, formattingKeymap, linkTooltip, listener, preview, selectionState, typewriter } from "@dxos/react-ui-editor";
|
|
40
|
+
import { defaultTx } from "@dxos/react-ui-theme";
|
|
41
|
+
import { isNotFalsy } from "@dxos/util";
|
|
42
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-markdown/src/extensions.tsx";
|
|
43
|
+
var useExtensions = ({ document, id, text, settings, selectionManager, viewMode, editorStateStore, previewOptions }) => {
|
|
44
|
+
const { dispatchPromise: dispatch } = useIntentDispatcher();
|
|
45
|
+
const identity = useIdentity();
|
|
46
|
+
const space = getSpace(document) ?? getSpace(text);
|
|
47
|
+
const baseExtensions = useMemo(() => createBaseExtensions({
|
|
48
|
+
document,
|
|
49
|
+
id,
|
|
50
|
+
text,
|
|
51
|
+
settings,
|
|
52
|
+
selectionManager,
|
|
53
|
+
viewMode,
|
|
54
|
+
previewOptions,
|
|
55
|
+
dispatch
|
|
56
|
+
}), [
|
|
57
|
+
document,
|
|
58
|
+
id,
|
|
59
|
+
text,
|
|
60
|
+
viewMode,
|
|
61
|
+
dispatch,
|
|
62
|
+
previewOptions,
|
|
63
|
+
settings,
|
|
64
|
+
settings.editorInputMode,
|
|
65
|
+
settings.folding,
|
|
66
|
+
settings.numberedHeadings,
|
|
67
|
+
settings.debug,
|
|
68
|
+
settings.typewriter,
|
|
69
|
+
selectionManager
|
|
70
|
+
]);
|
|
71
|
+
const extensionProviders = useCapabilities(MarkdownCapabilities.Extensions);
|
|
72
|
+
const pluginExtensions = useMemo(() => {
|
|
73
|
+
if (!document) {
|
|
74
|
+
return [];
|
|
75
|
+
}
|
|
76
|
+
return extensionProviders.flat().reduce((acc, provider) => {
|
|
77
|
+
const extension = typeof provider === "function" ? provider({
|
|
78
|
+
document
|
|
79
|
+
}) : provider;
|
|
80
|
+
if (extension) {
|
|
81
|
+
acc.push(extension);
|
|
82
|
+
}
|
|
83
|
+
return acc;
|
|
84
|
+
}, []);
|
|
85
|
+
}, [
|
|
86
|
+
extensionProviders,
|
|
87
|
+
document
|
|
88
|
+
]);
|
|
89
|
+
return useMemo(() => [
|
|
90
|
+
// NOTE: Data extensions must be first so that automerge is updated before other extensions compute their state.
|
|
91
|
+
document && createDataExtensions({
|
|
92
|
+
id: document.id,
|
|
93
|
+
text: document.content.target && createDocAccessor(document.content.target, [
|
|
94
|
+
"content"
|
|
95
|
+
]),
|
|
96
|
+
space,
|
|
97
|
+
identity
|
|
98
|
+
}),
|
|
99
|
+
text && id && createDataExtensions({
|
|
100
|
+
id,
|
|
101
|
+
text: createDocAccessor(text, [
|
|
102
|
+
"content"
|
|
103
|
+
]),
|
|
104
|
+
space,
|
|
105
|
+
identity
|
|
106
|
+
}),
|
|
107
|
+
selectionState(editorStateStore),
|
|
108
|
+
document && listener({
|
|
109
|
+
onChange: (text2) => setFallbackName(document, text2)
|
|
110
|
+
}),
|
|
111
|
+
baseExtensions,
|
|
112
|
+
pluginExtensions
|
|
113
|
+
].filter(isNotFalsy), [
|
|
114
|
+
baseExtensions,
|
|
115
|
+
pluginExtensions,
|
|
116
|
+
document,
|
|
117
|
+
document?.content?.target,
|
|
118
|
+
text,
|
|
119
|
+
id,
|
|
120
|
+
space,
|
|
121
|
+
identity
|
|
122
|
+
]);
|
|
123
|
+
};
|
|
124
|
+
var createBaseExtensions = ({ document, id, dispatch, settings, selectionManager, query, viewMode, previewOptions }) => {
|
|
125
|
+
const extensions = [
|
|
126
|
+
selectionManager && selectionChange(selectionManager),
|
|
127
|
+
settings.editorInputMode && InputModeExtensions[settings.editorInputMode],
|
|
128
|
+
settings.folding && folding()
|
|
129
|
+
].filter(isNotFalsy);
|
|
130
|
+
if (viewMode !== "source") {
|
|
131
|
+
extensions.push(...[
|
|
132
|
+
formattingKeymap(),
|
|
133
|
+
decorateMarkdown({
|
|
134
|
+
selectionChangeDelay: 100,
|
|
135
|
+
numberedHeadings: settings.numberedHeadings ? {
|
|
136
|
+
from: 2
|
|
137
|
+
} : void 0,
|
|
138
|
+
// TODO(wittjosiah): For internal links, consider ignoring the link text and rendering the label of the object being linked to.
|
|
139
|
+
renderLinkButton: dispatch && (document || id) ? createLinkRenderer((id2) => {
|
|
140
|
+
void dispatch(createIntent(LayoutAction.Open, {
|
|
141
|
+
part: "main",
|
|
142
|
+
subject: [
|
|
143
|
+
id2
|
|
144
|
+
],
|
|
145
|
+
options: {
|
|
146
|
+
pivotId: document ? fullyQualifiedId(document) : id2
|
|
147
|
+
}
|
|
148
|
+
}));
|
|
149
|
+
}) : void 0
|
|
150
|
+
}),
|
|
151
|
+
linkTooltip(renderLinkTooltip),
|
|
152
|
+
preview(previewOptions)
|
|
153
|
+
]);
|
|
154
|
+
}
|
|
155
|
+
if (query) {
|
|
156
|
+
extensions.push(autocomplete({
|
|
157
|
+
onSearch: (text) => {
|
|
158
|
+
return query.objects.map((object) => object.name?.length && object.id !== document?.id ? {
|
|
159
|
+
label: object.name,
|
|
160
|
+
// TODO(burdon): Factor out URL builder.
|
|
161
|
+
apply: `[${object.name}](/${fullyQualifiedId(object)})`
|
|
162
|
+
} : void 0).filter(isNotFalsy);
|
|
163
|
+
}
|
|
164
|
+
}));
|
|
165
|
+
}
|
|
166
|
+
if (settings.debug) {
|
|
167
|
+
const items = settings.typewriter?.split(/[,\n]/) ?? "";
|
|
168
|
+
if (items) {
|
|
169
|
+
extensions.push(typewriter({
|
|
170
|
+
items
|
|
171
|
+
}));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return extensions;
|
|
175
|
+
};
|
|
176
|
+
var selectionChange = (selectionManager) => {
|
|
177
|
+
return EditorView.updateListener.of(debounceAndThrottle((update) => {
|
|
178
|
+
if (update.selectionSet) {
|
|
179
|
+
const id = update.state.facet(documentId);
|
|
180
|
+
const cursorConverter = update.state.facet(Cursor.converter);
|
|
181
|
+
const selection = update.state.selection;
|
|
182
|
+
const ranges = selection.ranges.map((range) => ({
|
|
183
|
+
from: cursorConverter.toCursor(range.from),
|
|
184
|
+
to: cursorConverter.toCursor(range.to)
|
|
185
|
+
})).filter(({ from, to }) => to > from);
|
|
186
|
+
selectionManager.updateMultiRange(id, ranges);
|
|
187
|
+
}
|
|
188
|
+
}, 100));
|
|
189
|
+
};
|
|
190
|
+
var style = {
|
|
191
|
+
hover: "rounded-sm text-primary-500 hover:text-primary-600 dark:text-primary-500 hover:dark:text-primary-400",
|
|
192
|
+
icon: "inline-block leading-none mis-1 cursor-pointer"
|
|
193
|
+
};
|
|
194
|
+
var createLinkRenderer = (onSelectObject) => (el, { url }) => {
|
|
195
|
+
const isInternal = url.startsWith("/") || // TODO(wittjosiah): This should probably be parsed out on paste?
|
|
196
|
+
url.startsWith(window.location.origin);
|
|
197
|
+
const options = isInternal ? {
|
|
198
|
+
onClick: () => {
|
|
199
|
+
const qualifiedId = url.split("/").at(-1);
|
|
200
|
+
invariant(qualifiedId, "Invalid link format.", {
|
|
201
|
+
F: __dxlog_file,
|
|
202
|
+
L: 291,
|
|
203
|
+
S: void 0,
|
|
204
|
+
A: [
|
|
205
|
+
"qualifiedId",
|
|
206
|
+
"'Invalid link format.'"
|
|
207
|
+
]
|
|
208
|
+
});
|
|
209
|
+
onSelectObject(qualifiedId);
|
|
210
|
+
}
|
|
211
|
+
} : {
|
|
212
|
+
href: url,
|
|
213
|
+
rel: "noreferrer",
|
|
214
|
+
target: "_blank"
|
|
215
|
+
};
|
|
216
|
+
renderRoot(el, /* @__PURE__ */ React.createElement("a", {
|
|
217
|
+
...options,
|
|
218
|
+
className: style.hover
|
|
219
|
+
}, /* @__PURE__ */ React.createElement(Icon, {
|
|
220
|
+
icon: isInternal ? "ph--arrow-square-down--bold" : "ph--arrow-square-out--bold",
|
|
221
|
+
size: 4,
|
|
222
|
+
classNames: style.icon
|
|
223
|
+
})));
|
|
224
|
+
};
|
|
225
|
+
var renderLinkTooltip = (el, { url }) => {
|
|
226
|
+
const web = new URL(url);
|
|
227
|
+
renderRoot(el, /* @__PURE__ */ React.createElement("a", {
|
|
228
|
+
href: url,
|
|
229
|
+
rel: "noreferrer",
|
|
230
|
+
target: "_blank",
|
|
231
|
+
className: style.hover
|
|
232
|
+
}, web.origin, /* @__PURE__ */ React.createElement(Icon, {
|
|
233
|
+
icon: "ph--arrow-square-out--bold",
|
|
234
|
+
size: 4,
|
|
235
|
+
classNames: style.icon
|
|
236
|
+
})));
|
|
237
|
+
};
|
|
238
|
+
var renderRoot = (root, node) => {
|
|
239
|
+
createRoot(root).render(/* @__PURE__ */ React.createElement(ThemeProvider, {
|
|
240
|
+
tx: defaultTx
|
|
241
|
+
}, node));
|
|
242
|
+
return root;
|
|
243
|
+
};
|
|
244
|
+
|
|
29
245
|
// src/components/MarkdownEditor/MarkdownEditor.tsx
|
|
30
246
|
import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
|
|
31
|
-
import
|
|
247
|
+
import React2, { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo as useMemo3, useRef } from "react";
|
|
32
248
|
import { useDropzone } from "react-dropzone";
|
|
33
|
-
import { invariant as
|
|
249
|
+
import { invariant as invariant3 } from "@dxos/invariant";
|
|
34
250
|
import { toLocalizedString, useThemeContext, useTranslation } from "@dxos/react-ui";
|
|
35
|
-
import { CommandMenu, EditorToolbar, RefPopover, addLink,
|
|
251
|
+
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";
|
|
36
252
|
import { StackItem } from "@dxos/react-ui-stack";
|
|
37
|
-
import {
|
|
253
|
+
import { isNonNullable, isNotFalsy as isNotFalsy2 } from "@dxos/util";
|
|
38
254
|
|
|
39
255
|
// src/hooks/useSelectCurrentThread.tsx
|
|
40
|
-
import { EditorView } from "@codemirror/view";
|
|
256
|
+
import { EditorView as EditorView2 } from "@codemirror/view";
|
|
41
257
|
import { Schema } from "effect";
|
|
42
|
-
import { useMemo } from "react";
|
|
43
|
-
import {
|
|
44
|
-
import { invariant } from "@dxos/invariant";
|
|
45
|
-
import { Cursor, setSelection } from "@dxos/react-ui-editor";
|
|
46
|
-
var
|
|
258
|
+
import { useMemo as useMemo2 } from "react";
|
|
259
|
+
import { LayoutAction as LayoutAction2, createResolver, useIntentResolver } from "@dxos/app-framework";
|
|
260
|
+
import { invariant as invariant2 } from "@dxos/invariant";
|
|
261
|
+
import { Cursor as Cursor2, setSelection } from "@dxos/react-ui-editor";
|
|
262
|
+
var __dxlog_file2 = "/__w/dxos/dxos/packages/plugins/plugin-markdown/src/hooks/useSelectCurrentThread.tsx";
|
|
47
263
|
var useSelectCurrentThread = (editorView, documentId2) => {
|
|
48
|
-
const scrollIntoViewResolver =
|
|
49
|
-
intent:
|
|
264
|
+
const scrollIntoViewResolver = useMemo2(() => createResolver({
|
|
265
|
+
intent: LayoutAction2.UpdateLayout,
|
|
50
266
|
position: "hoist",
|
|
51
267
|
filter: (data) => {
|
|
52
|
-
if (!Schema.is(
|
|
268
|
+
if (!Schema.is(LayoutAction2.ScrollIntoView.fields.input)(data)) {
|
|
53
269
|
return false;
|
|
54
270
|
}
|
|
55
271
|
return !!editorView && data.subject === documentId2 && !!data.options?.cursor;
|
|
56
272
|
},
|
|
57
273
|
resolve: ({ options: { cursor } }) => {
|
|
58
|
-
|
|
59
|
-
F:
|
|
274
|
+
invariant2(editorView, "Editor view is not defined.", {
|
|
275
|
+
F: __dxlog_file2,
|
|
60
276
|
L: 32,
|
|
61
277
|
S: void 0,
|
|
62
278
|
A: [
|
|
@@ -64,14 +280,14 @@ var useSelectCurrentThread = (editorView, documentId2) => {
|
|
|
64
280
|
"'Editor view is not defined.'"
|
|
65
281
|
]
|
|
66
282
|
});
|
|
67
|
-
const range =
|
|
283
|
+
const range = Cursor2.getRangeFromCursor(editorView.state, cursor);
|
|
68
284
|
if (range) {
|
|
69
285
|
const selection = editorView.state.selection.main.from !== range.from ? {
|
|
70
286
|
anchor: range.from
|
|
71
287
|
} : void 0;
|
|
72
288
|
const effects = [
|
|
73
289
|
// NOTE: This does not use the DOM scrollIntoView function.
|
|
74
|
-
|
|
290
|
+
EditorView2.scrollIntoView(range.from, {
|
|
75
291
|
y: "start",
|
|
76
292
|
yMargin: 96
|
|
77
293
|
})
|
|
@@ -93,11 +309,11 @@ var useSelectCurrentThread = (editorView, documentId2) => {
|
|
|
93
309
|
documentId2,
|
|
94
310
|
editorView
|
|
95
311
|
]);
|
|
96
|
-
useIntentResolver(
|
|
312
|
+
useIntentResolver(meta.id, scrollIntoViewResolver);
|
|
97
313
|
};
|
|
98
314
|
|
|
99
315
|
// src/components/MarkdownEditor/MarkdownEditor.tsx
|
|
100
|
-
var
|
|
316
|
+
var __dxlog_file3 = "/__w/dxos/dxos/packages/plugins/plugin-markdown/src/components/MarkdownEditor/MarkdownEditor.tsx";
|
|
101
317
|
var MarkdownEditor = ({ extensions: _extensions, slashCommandGroups, onLinkQuery, ...props }) => {
|
|
102
318
|
var _effect = _useSignals();
|
|
103
319
|
try {
|
|
@@ -119,7 +335,7 @@ var MarkdownEditor = ({ extensions: _extensions, slashCommandGroups, onLinkQuery
|
|
|
119
335
|
onLinkQuery,
|
|
120
336
|
slashCommandGroups
|
|
121
337
|
]);
|
|
122
|
-
const options =
|
|
338
|
+
const options = useMemo3(() => {
|
|
123
339
|
const trigger = onLinkQuery ? [
|
|
124
340
|
"/",
|
|
125
341
|
"@"
|
|
@@ -152,21 +368,21 @@ var MarkdownEditor = ({ extensions: _extensions, slashCommandGroups, onLinkQuery
|
|
|
152
368
|
getMenu
|
|
153
369
|
]);
|
|
154
370
|
const { commandMenu, groupsRef, currentItem, onSelect, ...refPopoverProps } = useCommandMenu(options);
|
|
155
|
-
const extensions =
|
|
371
|
+
const extensions = useMemo3(() => [
|
|
156
372
|
_extensions,
|
|
157
373
|
commandMenu
|
|
158
|
-
].filter(
|
|
374
|
+
].filter(isNotFalsy2), [
|
|
159
375
|
_extensions,
|
|
160
376
|
commandMenu
|
|
161
377
|
]);
|
|
162
|
-
return /* @__PURE__ */
|
|
378
|
+
return /* @__PURE__ */ React2.createElement(RefPopover, {
|
|
163
379
|
modal: false,
|
|
164
380
|
...refPopoverProps
|
|
165
|
-
}, /* @__PURE__ */
|
|
381
|
+
}, /* @__PURE__ */ React2.createElement(MarkdownEditorImpl, {
|
|
166
382
|
ref: viewRef,
|
|
167
383
|
...props,
|
|
168
384
|
extensions
|
|
169
|
-
}), /* @__PURE__ */
|
|
385
|
+
}), /* @__PURE__ */ React2.createElement(CommandMenu, {
|
|
170
386
|
groups: groupsRef.current,
|
|
171
387
|
currentItem,
|
|
172
388
|
onSelect
|
|
@@ -178,16 +394,16 @@ var MarkdownEditor = ({ extensions: _extensions, slashCommandGroups, onLinkQuery
|
|
|
178
394
|
var MarkdownEditorImpl = /* @__PURE__ */ forwardRef(({ id, role = "article", initialValue, customActions, editorStateStore, extensions, extensionProviders, scrollPastEnd, toolbar, viewMode, onFileUpload, onViewModeChange }, forwardedRef) => {
|
|
179
395
|
var _effect = _useSignals();
|
|
180
396
|
try {
|
|
181
|
-
const { t } = useTranslation(
|
|
397
|
+
const { t } = useTranslation(meta.id);
|
|
182
398
|
const { themeMode } = useThemeContext();
|
|
183
399
|
const toolbarState = useEditorToolbarState({
|
|
184
400
|
viewMode
|
|
185
401
|
});
|
|
186
402
|
const formattingObserver = useFormattingState(toolbarState);
|
|
187
|
-
const { scrollTo, selection } =
|
|
403
|
+
const { scrollTo, selection } = useMemo3(() => editorStateStore?.getState(id) ?? {}, [
|
|
188
404
|
id
|
|
189
405
|
]);
|
|
190
|
-
const providerExtensions =
|
|
406
|
+
const providerExtensions = useMemo3(() => extensionProviders?.flatMap((provider) => provider({})).filter(isNonNullable), [
|
|
191
407
|
extensionProviders
|
|
192
408
|
]);
|
|
193
409
|
const handleDrop = async (view, { files }) => {
|
|
@@ -207,7 +423,8 @@ var MarkdownEditorImpl = /* @__PURE__ */ forwardRef(({ id, role = "article", ini
|
|
|
207
423
|
createBasicExtensions({
|
|
208
424
|
readOnly: viewMode === "readonly",
|
|
209
425
|
placeholder: t("editor placeholder"),
|
|
210
|
-
scrollPastEnd: role === "section" ? false : scrollPastEnd
|
|
426
|
+
scrollPastEnd: role === "section" ? false : scrollPastEnd,
|
|
427
|
+
search: true
|
|
211
428
|
}),
|
|
212
429
|
createMarkdownExtensions({
|
|
213
430
|
themeMode
|
|
@@ -223,7 +440,7 @@ var MarkdownEditorImpl = /* @__PURE__ */ forwardRef(({ id, role = "article", ini
|
|
|
223
440
|
}),
|
|
224
441
|
providerExtensions,
|
|
225
442
|
extensions
|
|
226
|
-
].filter(
|
|
443
|
+
].filter(isNotFalsy2),
|
|
227
444
|
...role !== "section" && {
|
|
228
445
|
id,
|
|
229
446
|
scrollTo,
|
|
@@ -282,9 +499,9 @@ var MarkdownEditorImpl = /* @__PURE__ */ forwardRef(({ id, role = "article", ini
|
|
|
282
499
|
onFileUpload
|
|
283
500
|
]);
|
|
284
501
|
const getView = useCallback(() => {
|
|
285
|
-
|
|
286
|
-
F:
|
|
287
|
-
L:
|
|
502
|
+
invariant3(editorView, void 0, {
|
|
503
|
+
F: __dxlog_file3,
|
|
504
|
+
L: 241,
|
|
288
505
|
S: void 0,
|
|
289
506
|
A: [
|
|
290
507
|
"editorView",
|
|
@@ -306,9 +523,9 @@ var MarkdownEditorImpl = /* @__PURE__ */ forwardRef(({ id, role = "article", ini
|
|
|
306
523
|
}, [
|
|
307
524
|
onFileUpload
|
|
308
525
|
]);
|
|
309
|
-
return /* @__PURE__ */
|
|
526
|
+
return /* @__PURE__ */ React2.createElement(StackItem.Content, {
|
|
310
527
|
toolbar: !!toolbar
|
|
311
|
-
}, toolbar && /* @__PURE__ */
|
|
528
|
+
}, toolbar && /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement(EditorToolbar, {
|
|
312
529
|
attendableId: id,
|
|
313
530
|
role,
|
|
314
531
|
state: toolbarState,
|
|
@@ -316,7 +533,7 @@ var MarkdownEditorImpl = /* @__PURE__ */ forwardRef(({ id, role = "article", ini
|
|
|
316
533
|
getView,
|
|
317
534
|
image: handleImageUpload,
|
|
318
535
|
viewMode: handleViewModeChange
|
|
319
|
-
}), /* @__PURE__ */
|
|
536
|
+
}), /* @__PURE__ */ React2.createElement("input", getInputProps())), /* @__PURE__ */ React2.createElement("div", {
|
|
320
537
|
role: "none",
|
|
321
538
|
ref: parentRef,
|
|
322
539
|
"data-testid": "composer.markdownRoot",
|
|
@@ -340,228 +557,13 @@ var useTest = (view) => {
|
|
|
340
557
|
]);
|
|
341
558
|
};
|
|
342
559
|
|
|
343
|
-
// src/extensions.tsx
|
|
344
|
-
import React2, { useMemo as useMemo3 } from "react";
|
|
345
|
-
import { createRoot } from "react-dom/client";
|
|
346
|
-
import { createIntent, LayoutAction as LayoutAction2, useCapabilities, useIntentDispatcher } from "@dxos/app-framework";
|
|
347
|
-
import { debounceAndThrottle } from "@dxos/async";
|
|
348
|
-
import { invariant as invariant3 } from "@dxos/invariant";
|
|
349
|
-
import { createDocAccessor, fullyQualifiedId, getSpace } from "@dxos/react-client/echo";
|
|
350
|
-
import { useIdentity } from "@dxos/react-client/halo";
|
|
351
|
-
import { Icon, ThemeProvider } from "@dxos/react-ui";
|
|
352
|
-
import { InputModeExtensions, createDataExtensions, autocomplete, decorateMarkdown, folding, formattingKeymap, linkTooltip, listener, preview, selectionState, typewriter, EditorView as EditorView2, documentId, Cursor as Cursor2 } from "@dxos/react-ui-editor";
|
|
353
|
-
import { defaultTx } from "@dxos/react-ui-theme";
|
|
354
|
-
import { isNotFalsy as isNotFalsy2 } from "@dxos/util";
|
|
355
|
-
var __dxlog_file3 = "/__w/dxos/dxos/packages/plugins/plugin-markdown/src/extensions.tsx";
|
|
356
|
-
var useExtensions = ({ document, id, text, settings, selectionManager, viewMode, editorStateStore, previewOptions }) => {
|
|
357
|
-
const { dispatchPromise: dispatch } = useIntentDispatcher();
|
|
358
|
-
const identity = useIdentity();
|
|
359
|
-
const space = getSpace(document) ?? getSpace(text);
|
|
360
|
-
const baseExtensions = useMemo3(() => createBaseExtensions({
|
|
361
|
-
document,
|
|
362
|
-
id,
|
|
363
|
-
text,
|
|
364
|
-
settings,
|
|
365
|
-
selectionManager,
|
|
366
|
-
viewMode,
|
|
367
|
-
previewOptions,
|
|
368
|
-
dispatch
|
|
369
|
-
}), [
|
|
370
|
-
document,
|
|
371
|
-
id,
|
|
372
|
-
text,
|
|
373
|
-
viewMode,
|
|
374
|
-
dispatch,
|
|
375
|
-
previewOptions,
|
|
376
|
-
settings,
|
|
377
|
-
settings.editorInputMode,
|
|
378
|
-
settings.folding,
|
|
379
|
-
settings.numberedHeadings,
|
|
380
|
-
settings.debug,
|
|
381
|
-
settings.typewriter,
|
|
382
|
-
selectionManager
|
|
383
|
-
]);
|
|
384
|
-
const extensionProviders = useCapabilities(MarkdownCapabilities.Extensions);
|
|
385
|
-
const pluginExtensions = useMemo3(() => {
|
|
386
|
-
if (!document) {
|
|
387
|
-
return [];
|
|
388
|
-
}
|
|
389
|
-
return extensionProviders.flat().reduce((acc, provider) => {
|
|
390
|
-
const extension = typeof provider === "function" ? provider({
|
|
391
|
-
document
|
|
392
|
-
}) : provider;
|
|
393
|
-
if (extension) {
|
|
394
|
-
acc.push(extension);
|
|
395
|
-
}
|
|
396
|
-
return acc;
|
|
397
|
-
}, []);
|
|
398
|
-
}, [
|
|
399
|
-
extensionProviders,
|
|
400
|
-
document
|
|
401
|
-
]);
|
|
402
|
-
return useMemo3(() => [
|
|
403
|
-
// NOTE: Data extensions must be first so that automerge is updated before other extensions compute their state.
|
|
404
|
-
document && createDataExtensions({
|
|
405
|
-
id: document.id,
|
|
406
|
-
text: document.content.target && createDocAccessor(document.content.target, [
|
|
407
|
-
"content"
|
|
408
|
-
]),
|
|
409
|
-
space,
|
|
410
|
-
identity
|
|
411
|
-
}),
|
|
412
|
-
text && id && createDataExtensions({
|
|
413
|
-
id,
|
|
414
|
-
text: createDocAccessor(text, [
|
|
415
|
-
"content"
|
|
416
|
-
]),
|
|
417
|
-
space,
|
|
418
|
-
identity
|
|
419
|
-
}),
|
|
420
|
-
selectionState(editorStateStore),
|
|
421
|
-
document && listener({
|
|
422
|
-
onChange: (text2) => setFallbackName(document, text2)
|
|
423
|
-
}),
|
|
424
|
-
baseExtensions,
|
|
425
|
-
pluginExtensions
|
|
426
|
-
].filter(isNotFalsy2), [
|
|
427
|
-
baseExtensions,
|
|
428
|
-
pluginExtensions,
|
|
429
|
-
document,
|
|
430
|
-
document?.content?.target,
|
|
431
|
-
text,
|
|
432
|
-
id,
|
|
433
|
-
space,
|
|
434
|
-
identity
|
|
435
|
-
]);
|
|
436
|
-
};
|
|
437
|
-
var createBaseExtensions = ({ document, id, dispatch, settings, selectionManager, query, viewMode, previewOptions }) => {
|
|
438
|
-
const extensions = [
|
|
439
|
-
selectionManager && selectionChange(selectionManager),
|
|
440
|
-
settings.editorInputMode && InputModeExtensions[settings.editorInputMode],
|
|
441
|
-
settings.folding && folding()
|
|
442
|
-
].filter(isNotFalsy2);
|
|
443
|
-
if (viewMode !== "source") {
|
|
444
|
-
extensions.push(...[
|
|
445
|
-
formattingKeymap(),
|
|
446
|
-
decorateMarkdown({
|
|
447
|
-
selectionChangeDelay: 100,
|
|
448
|
-
numberedHeadings: settings.numberedHeadings ? {
|
|
449
|
-
from: 2
|
|
450
|
-
} : void 0,
|
|
451
|
-
// TODO(wittjosiah): For internal links, consider ignoring the link text and rendering the label of the object being linked to.
|
|
452
|
-
renderLinkButton: dispatch && (document || id) ? createLinkRenderer((id2) => {
|
|
453
|
-
void dispatch(createIntent(LayoutAction2.Open, {
|
|
454
|
-
part: "main",
|
|
455
|
-
subject: [
|
|
456
|
-
id2
|
|
457
|
-
],
|
|
458
|
-
options: {
|
|
459
|
-
pivotId: document ? fullyQualifiedId(document) : id2
|
|
460
|
-
}
|
|
461
|
-
}));
|
|
462
|
-
}) : void 0
|
|
463
|
-
}),
|
|
464
|
-
linkTooltip(renderLinkTooltip),
|
|
465
|
-
preview(previewOptions)
|
|
466
|
-
]);
|
|
467
|
-
}
|
|
468
|
-
if (query) {
|
|
469
|
-
extensions.push(autocomplete({
|
|
470
|
-
onSearch: (text) => {
|
|
471
|
-
return query.objects.map((object) => object.name?.length && object.id !== document?.id ? {
|
|
472
|
-
label: object.name,
|
|
473
|
-
// TODO(burdon): Factor out URL builder.
|
|
474
|
-
apply: `[${object.name}](/${fullyQualifiedId(object)})`
|
|
475
|
-
} : void 0).filter(isNotFalsy2);
|
|
476
|
-
}
|
|
477
|
-
}));
|
|
478
|
-
}
|
|
479
|
-
if (settings.debug) {
|
|
480
|
-
const items = settings.typewriter?.split(/[,\n]/) ?? "";
|
|
481
|
-
if (items) {
|
|
482
|
-
extensions.push(typewriter({
|
|
483
|
-
items
|
|
484
|
-
}));
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
return extensions;
|
|
488
|
-
};
|
|
489
|
-
var selectionChange = (selectionManager) => {
|
|
490
|
-
return EditorView2.updateListener.of(debounceAndThrottle((update) => {
|
|
491
|
-
if (update.selectionSet) {
|
|
492
|
-
const id = update.state.facet(documentId);
|
|
493
|
-
const cursorConverter = update.state.facet(Cursor2.converter);
|
|
494
|
-
const selection = update.state.selection;
|
|
495
|
-
const ranges = selection.ranges.map((range) => ({
|
|
496
|
-
from: cursorConverter.toCursor(range.from),
|
|
497
|
-
to: cursorConverter.toCursor(range.to)
|
|
498
|
-
})).filter(({ from, to }) => to > from);
|
|
499
|
-
selectionManager.updateMultiRange(id, ranges);
|
|
500
|
-
}
|
|
501
|
-
}, 100));
|
|
502
|
-
};
|
|
503
|
-
var style = {
|
|
504
|
-
hover: "rounded-sm text-primary-500 hover:text-primary-600 dark:text-primary-500 hover:dark:text-primary-400",
|
|
505
|
-
icon: "inline-block leading-none mis-1 cursor-pointer"
|
|
506
|
-
};
|
|
507
|
-
var createLinkRenderer = (onSelectObject) => (el, { url }) => {
|
|
508
|
-
const isInternal = url.startsWith("/") || // TODO(wittjosiah): This should probably be parsed out on paste?
|
|
509
|
-
url.startsWith(window.location.origin);
|
|
510
|
-
const options = isInternal ? {
|
|
511
|
-
onClick: () => {
|
|
512
|
-
const qualifiedId = url.split("/").at(-1);
|
|
513
|
-
invariant3(qualifiedId, "Invalid link format.", {
|
|
514
|
-
F: __dxlog_file3,
|
|
515
|
-
L: 291,
|
|
516
|
-
S: void 0,
|
|
517
|
-
A: [
|
|
518
|
-
"qualifiedId",
|
|
519
|
-
"'Invalid link format.'"
|
|
520
|
-
]
|
|
521
|
-
});
|
|
522
|
-
onSelectObject(qualifiedId);
|
|
523
|
-
}
|
|
524
|
-
} : {
|
|
525
|
-
href: url,
|
|
526
|
-
rel: "noreferrer",
|
|
527
|
-
target: "_blank"
|
|
528
|
-
};
|
|
529
|
-
renderRoot(el, /* @__PURE__ */ React2.createElement("a", {
|
|
530
|
-
...options,
|
|
531
|
-
className: style.hover
|
|
532
|
-
}, /* @__PURE__ */ React2.createElement(Icon, {
|
|
533
|
-
icon: isInternal ? "ph--arrow-square-down--bold" : "ph--arrow-square-out--bold",
|
|
534
|
-
size: 4,
|
|
535
|
-
classNames: style.icon
|
|
536
|
-
})));
|
|
537
|
-
};
|
|
538
|
-
var renderLinkTooltip = (el, { url }) => {
|
|
539
|
-
const web = new URL(url);
|
|
540
|
-
renderRoot(el, /* @__PURE__ */ React2.createElement("a", {
|
|
541
|
-
href: url,
|
|
542
|
-
rel: "noreferrer",
|
|
543
|
-
target: "_blank",
|
|
544
|
-
className: style.hover
|
|
545
|
-
}, web.origin, /* @__PURE__ */ React2.createElement(Icon, {
|
|
546
|
-
icon: "ph--arrow-square-out--bold",
|
|
547
|
-
size: 4,
|
|
548
|
-
classNames: style.icon
|
|
549
|
-
})));
|
|
550
|
-
};
|
|
551
|
-
var renderRoot = (root, node) => {
|
|
552
|
-
createRoot(root).render(/* @__PURE__ */ React2.createElement(ThemeProvider, {
|
|
553
|
-
tx: defaultTx
|
|
554
|
-
}, node));
|
|
555
|
-
return root;
|
|
556
|
-
};
|
|
557
|
-
|
|
558
560
|
// src/components/MarkdownContainer.tsx
|
|
559
561
|
var MarkdownContainer = ({ id, role, object, settings, selectionManager, viewMode, editorStateStore, onViewModeChange }) => {
|
|
560
562
|
var _effect = _useSignals2();
|
|
561
563
|
try {
|
|
562
564
|
const { t } = useTranslation2();
|
|
563
565
|
const scrollPastEnd = role === "article";
|
|
564
|
-
const doc = Obj.instanceOf(
|
|
566
|
+
const doc = Obj.instanceOf(Markdown_exports.Document, object) ? object : void 0;
|
|
565
567
|
const text = Obj.instanceOf(DataType.Text, object) ? object : void 0;
|
|
566
568
|
const [previewBlocks, setPreviewBlocks] = useState([]);
|
|
567
569
|
const previewOptions = useMemo4(() => ({
|
|
@@ -594,16 +596,22 @@ var MarkdownContainer = ({ id, role, object, settings, selectionManager, viewMod
|
|
|
594
596
|
]);
|
|
595
597
|
const space = getSpace2(object);
|
|
596
598
|
const objectForms = useCapabilities2(SpaceCapabilities.ObjectForm);
|
|
597
|
-
const
|
|
598
|
-
|
|
599
|
+
const schemaWhiteList = useCapabilities2(ClientCapabilities.SchemaWhiteList);
|
|
600
|
+
const filter = useMemo4(() => Filter.or(...objectForms.map((form) => Filter.type(form.objectSchema)), ...schemaWhiteList.flat().map((schema) => Filter.typename(Type.getTypename(schema)))), [
|
|
601
|
+
objectForms,
|
|
602
|
+
schemaWhiteList
|
|
599
603
|
]);
|
|
600
604
|
const onLinkQuery = useCallback2(async (query) => {
|
|
601
605
|
const name = query?.startsWith("@") ? query.slice(1).toLowerCase() : query?.toLowerCase() ?? "";
|
|
602
606
|
const results = await space?.db.query(Query.select(filter)).run();
|
|
603
607
|
const getLabel = (object2) => {
|
|
608
|
+
const label = Obj.getLabel(object2);
|
|
609
|
+
if (label) {
|
|
610
|
+
return label;
|
|
611
|
+
}
|
|
604
612
|
const type = Obj.getTypename(object2);
|
|
605
613
|
const metadata = resolve(type);
|
|
606
|
-
return metadata.label?.(object2) ||
|
|
614
|
+
return metadata.label?.(object2) || [
|
|
607
615
|
"object name placeholder",
|
|
608
616
|
{
|
|
609
617
|
ns: type,
|
|
@@ -699,7 +707,7 @@ var PreviewBlock = ({ link, el }) => {
|
|
|
699
707
|
subject
|
|
700
708
|
]);
|
|
701
709
|
return /* @__PURE__ */ createPortal(/* @__PURE__ */ React3.createElement(Surface, {
|
|
702
|
-
role: "card--
|
|
710
|
+
role: "card--transclusion",
|
|
703
711
|
data,
|
|
704
712
|
limit: 1
|
|
705
713
|
}), el);
|
|
@@ -766,6 +774,7 @@ var DocumentEditor = ({ id, document: doc, settings, viewMode, ...props }) => {
|
|
|
766
774
|
var MarkdownContainer_default = MarkdownContainer;
|
|
767
775
|
export {
|
|
768
776
|
DocumentEditor,
|
|
777
|
+
MarkdownContainer,
|
|
769
778
|
MarkdownContainer_default as default
|
|
770
779
|
};
|
|
771
|
-
//# sourceMappingURL=MarkdownContainer-
|
|
780
|
+
//# sourceMappingURL=MarkdownContainer-VGJPHMVG.mjs.map
|