@dxos/plugin-markdown 0.8.4-main.2e9d522 → 0.8.4-main.406dc2a
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/MarkdownCard-AGWOTODZ.mjs +83 -0
- package/dist/lib/browser/MarkdownCard-AGWOTODZ.mjs.map +7 -0
- package/dist/lib/browser/{MarkdownContainer-F3WEEIBX.mjs → MarkdownContainer-MV2UNAUV.mjs} +295 -322
- package/dist/lib/browser/MarkdownContainer-MV2UNAUV.mjs.map +7 -0
- package/dist/lib/browser/{anchor-sort-UKJJ7ZNP.mjs → anchor-sort-YWJI3BKT.mjs} +7 -7
- package/dist/lib/browser/anchor-sort-YWJI3BKT.mjs.map +7 -0
- package/dist/lib/browser/{app-graph-serializer-ICLAF662.mjs → app-graph-serializer-KYDFCUOW.mjs} +13 -14
- package/dist/lib/browser/app-graph-serializer-KYDFCUOW.mjs.map +7 -0
- package/dist/lib/browser/blueprint-definition-BHRMFZAC.mjs +11 -0
- package/dist/lib/browser/blueprint-definition-BHRMFZAC.mjs.map +7 -0
- package/dist/lib/browser/{chunk-LFML7LC6.mjs → chunk-6KU5DKP7.mjs} +12 -12
- package/dist/lib/browser/chunk-6KU5DKP7.mjs.map +7 -0
- package/dist/lib/browser/chunk-HBBEHOP3.mjs +106 -0
- package/dist/lib/browser/chunk-HBBEHOP3.mjs.map +7 -0
- package/dist/lib/browser/{chunk-LHDCHDBW.mjs → chunk-O6XUPW6S.mjs} +6 -5
- package/dist/lib/browser/chunk-O6XUPW6S.mjs.map +7 -0
- package/dist/lib/browser/chunk-ODB2PTBP.mjs +28 -0
- package/dist/lib/browser/chunk-ODB2PTBP.mjs.map +7 -0
- package/dist/lib/browser/chunk-OY6CGPOO.mjs +16 -0
- package/dist/lib/browser/chunk-OY6CGPOO.mjs.map +7 -0
- package/dist/lib/browser/chunk-XMT6PMU5.mjs +79 -0
- package/dist/lib/browser/chunk-XMT6PMU5.mjs.map +7 -0
- package/dist/lib/browser/chunk-Z5PDJNBV.mjs +22 -0
- package/dist/lib/browser/chunk-Z5PDJNBV.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +37 -24
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/intent-resolver-XHVCZZHU.mjs +62 -0
- package/dist/lib/browser/intent-resolver-XHVCZZHU.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{react-surface-C3Z423TV.mjs → react-surface-3A2GO3BN.mjs} +55 -46
- package/dist/lib/browser/react-surface-3A2GO3BN.mjs.map +7 -0
- package/dist/lib/browser/{settings-KN75ZQY6.mjs → settings-XY265Y2Q.mjs} +7 -7
- package/dist/lib/browser/settings-XY265Y2Q.mjs.map +7 -0
- package/dist/lib/browser/{state-LZWTAS65.mjs → state-6QODXCSZ.mjs} +9 -9
- package/dist/lib/browser/state-6QODXCSZ.mjs.map +7 -0
- package/dist/lib/browser/toolkit-YA65QX2S.mjs +76 -0
- package/dist/lib/browser/toolkit-YA65QX2S.mjs.map +7 -0
- package/dist/lib/browser/types/index.mjs +6 -14
- package/dist/lib/node-esm/MarkdownCard-B2IWTFOC.mjs +84 -0
- package/dist/lib/node-esm/MarkdownCard-B2IWTFOC.mjs.map +7 -0
- package/dist/lib/node-esm/{MarkdownContainer-VOUHL6IU.mjs → MarkdownContainer-J2R3DLCQ.mjs} +295 -322
- package/dist/lib/node-esm/MarkdownContainer-J2R3DLCQ.mjs.map +7 -0
- package/dist/lib/node-esm/{anchor-sort-IPIS5D5B.mjs → anchor-sort-FCRYL2FX.mjs} +7 -7
- package/dist/lib/node-esm/anchor-sort-FCRYL2FX.mjs.map +7 -0
- package/dist/lib/node-esm/{app-graph-serializer-FLBXQKKR.mjs → app-graph-serializer-FAUQM3BH.mjs} +13 -14
- package/dist/lib/node-esm/app-graph-serializer-FAUQM3BH.mjs.map +7 -0
- package/dist/lib/node-esm/blueprint-definition-XYFKMIDR.mjs +12 -0
- package/dist/lib/node-esm/blueprint-definition-XYFKMIDR.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-7RDNIMTF.mjs +24 -0
- package/dist/lib/node-esm/chunk-7RDNIMTF.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-ACFGXH2K.mjs → chunk-CB2R4YIY.mjs} +5 -5
- package/dist/lib/node-esm/chunk-CB2R4YIY.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-FVI7LPC3.mjs +107 -0
- package/dist/lib/node-esm/chunk-FVI7LPC3.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-FWZKC6X5.mjs +80 -0
- package/dist/lib/node-esm/chunk-FWZKC6X5.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-VCG2U522.mjs +29 -0
- package/dist/lib/node-esm/chunk-VCG2U522.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-VIR2ABYE.mjs → chunk-XO3IEQJE.mjs} +6 -5
- package/dist/lib/node-esm/chunk-XO3IEQJE.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-CWTFQSN7.mjs → chunk-ZBXV4ON7.mjs} +12 -12
- package/dist/lib/node-esm/chunk-ZBXV4ON7.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +37 -24
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/intent-resolver-7A2EXGZQ.mjs +63 -0
- package/dist/lib/node-esm/intent-resolver-7A2EXGZQ.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-surface-TTTBYNI2.mjs → react-surface-RCLL5WVQ.mjs} +55 -46
- package/dist/lib/node-esm/react-surface-RCLL5WVQ.mjs.map +7 -0
- package/dist/lib/node-esm/{settings-KVP7TVX7.mjs → settings-H3UDD3KO.mjs} +7 -7
- package/dist/lib/node-esm/settings-H3UDD3KO.mjs.map +7 -0
- package/dist/lib/node-esm/{state-NW3W4JCQ.mjs → state-W3PECOJX.mjs} +9 -9
- package/dist/lib/node-esm/state-W3PECOJX.mjs.map +7 -0
- package/dist/lib/node-esm/toolkit-HSIKUGNK.mjs +77 -0
- package/dist/lib/node-esm/toolkit-HSIKUGNK.mjs.map +7 -0
- package/dist/lib/node-esm/types/index.mjs +6 -14
- package/dist/types/src/MarkdownPlugin.d.ts +1 -1
- package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/anchor-sort.d.ts +2 -2
- package/dist/types/src/capabilities/app-graph-serializer.d.ts +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 -9
- package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
- package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -0
- package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
- 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 +12 -10
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/settings.d.ts +1 -1
- package/dist/types/src/capabilities/state.d.ts +2 -2
- package/dist/types/src/capabilities/state.d.ts.map +1 -1
- package/dist/types/src/capabilities/toolkit.d.ts +4 -0
- package/dist/types/src/capabilities/toolkit.d.ts.map +1 -0
- 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 +9 -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 +51 -5
- package/dist/types/src/components/MarkdownContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +6 -6
- package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
- package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts +111 -13
- 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 +3 -4
- package/dist/types/src/components/Suggestions.stories.d.ts.map +1 -1
- package/dist/types/src/components/Toolbar.stories.d.ts +45 -8
- 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 +3 -5
- package/dist/types/src/extensions.d.ts.map +1 -1
- package/dist/types/src/functions/diff.d.ts +6 -0
- package/dist/types/src/functions/diff.d.ts.map +1 -0
- package/dist/types/src/functions/index.d.ts +3 -0
- package/dist/types/src/functions/index.d.ts.map +1 -0
- package/dist/types/src/functions/open.d.ts +7 -0
- package/dist/types/src/functions/open.d.ts.map +1 -0
- package/dist/types/src/hooks/useSelectCurrentThread.d.ts +1 -1
- package/dist/types/src/hooks/useSelectCurrentThread.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 +0 -1
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +3 -2
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/Markdown.d.ts +45 -0
- package/dist/types/src/types/Markdown.d.ts.map +1 -0
- package/dist/types/src/types/MarkdownAction.d.ts +34 -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 +13 -4
- package/dist/types/src/util.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +57 -52
- package/src/MarkdownPlugin.tsx +103 -95
- package/src/capabilities/anchor-sort.ts +3 -3
- package/src/capabilities/app-graph-serializer.ts +9 -7
- package/src/capabilities/artifact-definition.ts +20 -24
- package/src/capabilities/blueprint-definition.ts +39 -0
- package/src/capabilities/capabilities.ts +5 -4
- package/src/capabilities/index.ts +3 -1
- package/src/capabilities/intent-resolver.ts +16 -21
- package/src/capabilities/react-surface.tsx +21 -19
- package/src/capabilities/settings.ts +3 -3
- package/src/capabilities/state.ts +8 -8
- package/src/capabilities/toolkit.ts +49 -0
- package/src/components/MarkdownCard/MarkdownCard.stories.tsx +76 -0
- package/src/components/MarkdownCard/MarkdownCard.tsx +76 -0
- package/src/components/MarkdownCard/index.ts +9 -0
- package/src/components/MarkdownContainer.stories.tsx +47 -41
- package/src/components/MarkdownContainer.tsx +26 -23
- package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +21 -17
- package/src/components/MarkdownEditor/MarkdownEditor.tsx +52 -52
- package/src/components/MarkdownSettings/MarkdownSettings.tsx +81 -78
- package/src/components/Suggestions.stories.tsx +49 -51
- package/src/components/Toolbar.stories.tsx +23 -18
- package/src/components/index.ts +1 -1
- package/src/events.ts +2 -2
- package/src/extensions.tsx +13 -41
- package/src/functions/diff.ts +37 -0
- package/src/functions/index.ts +6 -0
- package/src/functions/open.ts +32 -0
- package/src/hooks/useSelectCurrentThread.tsx +5 -5
- package/src/index.ts +4 -1
- package/src/meta.ts +7 -8
- package/src/translations.ts +3 -2
- package/src/types/Markdown.ts +58 -0
- package/src/types/MarkdownAction.ts +29 -0
- package/src/types/index.ts +2 -1
- package/src/types/types.ts +6 -50
- package/src/util.tsx +28 -8
- package/dist/lib/browser/MarkdownContainer-F3WEEIBX.mjs.map +0 -7
- package/dist/lib/browser/MarkdownPreview-S3C7CGAV.mjs +0 -80
- package/dist/lib/browser/MarkdownPreview-S3C7CGAV.mjs.map +0 -7
- package/dist/lib/browser/anchor-sort-UKJJ7ZNP.mjs.map +0 -7
- package/dist/lib/browser/app-graph-serializer-ICLAF662.mjs.map +0 -7
- package/dist/lib/browser/artifact-definition-R2YYWOPN.mjs +0 -145
- package/dist/lib/browser/artifact-definition-R2YYWOPN.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-LFML7LC6.mjs.map +0 -7
- package/dist/lib/browser/chunk-LHDCHDBW.mjs.map +0 -7
- package/dist/lib/browser/chunk-PHTD5DTR.mjs +0 -20
- package/dist/lib/browser/chunk-PHTD5DTR.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 +0 -64
- package/dist/lib/browser/intent-resolver-3MXYO3MW.mjs.map +0 -7
- package/dist/lib/browser/react-surface-C3Z423TV.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-VOUHL6IU.mjs.map +0 -7
- package/dist/lib/node-esm/MarkdownPreview-77UFEWXT.mjs +0 -81
- package/dist/lib/node-esm/MarkdownPreview-77UFEWXT.mjs.map +0 -7
- package/dist/lib/node-esm/anchor-sort-IPIS5D5B.mjs.map +0 -7
- package/dist/lib/node-esm/app-graph-serializer-FLBXQKKR.mjs.map +0 -7
- package/dist/lib/node-esm/artifact-definition-MLTAY4LK.mjs +0 -146
- package/dist/lib/node-esm/artifact-definition-MLTAY4LK.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-7X6TPTJK.mjs +0 -22
- package/dist/lib/node-esm/chunk-7X6TPTJK.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-JEEQLO7C.mjs +0 -80
- package/dist/lib/node-esm/chunk-JEEQLO7C.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-VIR2ABYE.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-BZYWV53A.mjs +0 -65
- package/dist/lib/node-esm/intent-resolver-BZYWV53A.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-TTTBYNI2.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 -42
- 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 -81
- package/src/components/MarkdownPreview/MarkdownPreview.tsx +0 -73
- package/src/components/MarkdownPreview/index.ts +0 -9
- package/src/types/schema.ts +0 -39
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
import "./chunk-
|
|
1
|
+
import "./chunk-Z5PDJNBV.mjs";
|
|
2
|
+
import "./chunk-HBBEHOP3.mjs";
|
|
2
3
|
import {
|
|
3
4
|
MarkdownCapabilities
|
|
4
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-OY6CGPOO.mjs";
|
|
5
6
|
import {
|
|
6
7
|
getFallbackName,
|
|
7
8
|
setFallbackName
|
|
8
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-6KU5DKP7.mjs";
|
|
9
10
|
import {
|
|
10
|
-
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
Markdown_exports
|
|
12
|
+
} from "./chunk-XMT6PMU5.mjs";
|
|
12
13
|
import {
|
|
13
|
-
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
meta
|
|
15
|
+
} from "./chunk-ODB2PTBP.mjs";
|
|
15
16
|
|
|
16
17
|
// src/components/MarkdownContainer.tsx
|
|
17
18
|
import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
|
|
@@ -22,42 +23,247 @@ import { Capabilities, Surface, useAppGraph, useCapabilities as useCapabilities2
|
|
|
22
23
|
import { DXN, Filter, Obj, Query, Type } from "@dxos/echo";
|
|
23
24
|
import { ClientCapabilities } from "@dxos/plugin-client";
|
|
24
25
|
import { SpaceCapabilities } from "@dxos/plugin-space";
|
|
25
|
-
import {
|
|
26
|
+
import { useClient } from "@dxos/react-client";
|
|
27
|
+
import { fullyQualifiedId as fullyQualifiedId2, getSpace as getSpace2 } from "@dxos/react-client/echo";
|
|
26
28
|
import { toLocalizedString as toLocalizedString2, useTranslation as useTranslation2 } from "@dxos/react-ui";
|
|
27
29
|
import { insertAtCursor, insertAtLineStart } from "@dxos/react-ui-editor";
|
|
28
30
|
import { DataType } from "@dxos/schema";
|
|
29
31
|
|
|
32
|
+
// src/extensions.tsx
|
|
33
|
+
import React, { useMemo } from "react";
|
|
34
|
+
import { createRoot } from "react-dom/client";
|
|
35
|
+
import { LayoutAction, createIntent, useCapabilities, useIntentDispatcher } from "@dxos/app-framework";
|
|
36
|
+
import { debounceAndThrottle } from "@dxos/async";
|
|
37
|
+
import { invariant } from "@dxos/invariant";
|
|
38
|
+
import { createDocAccessor, fullyQualifiedId, getSpace } from "@dxos/react-client/echo";
|
|
39
|
+
import { useIdentity } from "@dxos/react-client/halo";
|
|
40
|
+
import { Icon, ThemeProvider } from "@dxos/react-ui";
|
|
41
|
+
import { Cursor, EditorView, InputModeExtensions, createDataExtensions, decorateMarkdown, documentId, folding, formattingKeymap, linkTooltip, listener, preview, selectionState, typewriter } from "@dxos/react-ui-editor";
|
|
42
|
+
import { defaultTx } from "@dxos/react-ui-theme";
|
|
43
|
+
import { isTruthy } from "@dxos/util";
|
|
44
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-markdown/src/extensions.tsx";
|
|
45
|
+
var useExtensions = ({ document, id, text, settings, selectionManager, viewMode, editorStateStore, previewOptions }) => {
|
|
46
|
+
const { dispatchPromise: dispatch } = useIntentDispatcher();
|
|
47
|
+
const identity = useIdentity();
|
|
48
|
+
const space = getSpace(document) ?? getSpace(text);
|
|
49
|
+
const baseExtensions = useMemo(() => createBaseExtensions({
|
|
50
|
+
document,
|
|
51
|
+
id,
|
|
52
|
+
text,
|
|
53
|
+
settings,
|
|
54
|
+
selectionManager,
|
|
55
|
+
viewMode,
|
|
56
|
+
previewOptions,
|
|
57
|
+
dispatch
|
|
58
|
+
}), [
|
|
59
|
+
document,
|
|
60
|
+
id,
|
|
61
|
+
text,
|
|
62
|
+
viewMode,
|
|
63
|
+
dispatch,
|
|
64
|
+
previewOptions,
|
|
65
|
+
settings,
|
|
66
|
+
settings.editorInputMode,
|
|
67
|
+
settings.folding,
|
|
68
|
+
settings.numberedHeadings,
|
|
69
|
+
settings.debug,
|
|
70
|
+
settings.typewriter,
|
|
71
|
+
selectionManager
|
|
72
|
+
]);
|
|
73
|
+
const extensionProviders = useCapabilities(MarkdownCapabilities.Extensions);
|
|
74
|
+
const pluginExtensions = useMemo(() => {
|
|
75
|
+
if (!document) {
|
|
76
|
+
return [];
|
|
77
|
+
}
|
|
78
|
+
return extensionProviders.flat().reduce((acc, provider) => {
|
|
79
|
+
const extension = typeof provider === "function" ? provider({
|
|
80
|
+
document
|
|
81
|
+
}) : provider;
|
|
82
|
+
if (extension) {
|
|
83
|
+
acc.push(extension);
|
|
84
|
+
}
|
|
85
|
+
return acc;
|
|
86
|
+
}, []);
|
|
87
|
+
}, [
|
|
88
|
+
extensionProviders,
|
|
89
|
+
document
|
|
90
|
+
]);
|
|
91
|
+
return useMemo(() => [
|
|
92
|
+
// NOTE: Data extensions must be first so that automerge is updated before other extensions compute their state.
|
|
93
|
+
document && createDataExtensions({
|
|
94
|
+
id: document.id,
|
|
95
|
+
text: document.content.target && createDocAccessor(document.content.target, [
|
|
96
|
+
"content"
|
|
97
|
+
]),
|
|
98
|
+
space,
|
|
99
|
+
identity
|
|
100
|
+
}),
|
|
101
|
+
text && id && createDataExtensions({
|
|
102
|
+
id,
|
|
103
|
+
text: createDocAccessor(text, [
|
|
104
|
+
"content"
|
|
105
|
+
]),
|
|
106
|
+
space,
|
|
107
|
+
identity
|
|
108
|
+
}),
|
|
109
|
+
selectionState(editorStateStore),
|
|
110
|
+
document && listener({
|
|
111
|
+
onChange: (text2) => setFallbackName(document, text2)
|
|
112
|
+
}),
|
|
113
|
+
baseExtensions,
|
|
114
|
+
pluginExtensions
|
|
115
|
+
].filter(isTruthy), [
|
|
116
|
+
baseExtensions,
|
|
117
|
+
pluginExtensions,
|
|
118
|
+
document,
|
|
119
|
+
document?.content?.target,
|
|
120
|
+
text,
|
|
121
|
+
id,
|
|
122
|
+
space,
|
|
123
|
+
identity
|
|
124
|
+
]);
|
|
125
|
+
};
|
|
126
|
+
var createBaseExtensions = ({ document, id, dispatch, settings, selectionManager, viewMode, previewOptions }) => {
|
|
127
|
+
const extensions = [
|
|
128
|
+
selectionManager && selectionChange(selectionManager),
|
|
129
|
+
settings.editorInputMode && InputModeExtensions[settings.editorInputMode],
|
|
130
|
+
settings.folding && folding()
|
|
131
|
+
].filter(isTruthy);
|
|
132
|
+
if (viewMode !== "source") {
|
|
133
|
+
extensions.push(...[
|
|
134
|
+
formattingKeymap(),
|
|
135
|
+
decorateMarkdown({
|
|
136
|
+
selectionChangeDelay: 100,
|
|
137
|
+
numberedHeadings: settings.numberedHeadings ? {
|
|
138
|
+
from: 2
|
|
139
|
+
} : void 0,
|
|
140
|
+
// TODO(wittjosiah): For internal links, consider ignoring the link text and rendering the label of the object being linked to.
|
|
141
|
+
renderLinkButton: dispatch && (document || id) ? createLinkRenderer((id2) => {
|
|
142
|
+
void dispatch(createIntent(LayoutAction.Open, {
|
|
143
|
+
part: "main",
|
|
144
|
+
subject: [
|
|
145
|
+
id2
|
|
146
|
+
],
|
|
147
|
+
options: {
|
|
148
|
+
pivotId: document ? fullyQualifiedId(document) : id2
|
|
149
|
+
}
|
|
150
|
+
}));
|
|
151
|
+
}) : void 0
|
|
152
|
+
}),
|
|
153
|
+
linkTooltip(renderLinkTooltip),
|
|
154
|
+
preview(previewOptions)
|
|
155
|
+
]);
|
|
156
|
+
}
|
|
157
|
+
if (settings.debug) {
|
|
158
|
+
const items = settings.typewriter?.split(/[,\n]/) ?? "";
|
|
159
|
+
if (items) {
|
|
160
|
+
extensions.push(typewriter({
|
|
161
|
+
items
|
|
162
|
+
}));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return extensions;
|
|
166
|
+
};
|
|
167
|
+
var selectionChange = (selectionManager) => {
|
|
168
|
+
return EditorView.updateListener.of(debounceAndThrottle((update) => {
|
|
169
|
+
if (update.selectionSet) {
|
|
170
|
+
const id = update.state.facet(documentId);
|
|
171
|
+
const cursorConverter = update.state.facet(Cursor.converter);
|
|
172
|
+
const selection = update.state.selection;
|
|
173
|
+
const ranges = selection.ranges.map((range) => ({
|
|
174
|
+
from: cursorConverter.toCursor(range.from),
|
|
175
|
+
to: cursorConverter.toCursor(range.to)
|
|
176
|
+
})).filter(({ from, to }) => to > from);
|
|
177
|
+
selectionManager.updateMultiRange(id, ranges);
|
|
178
|
+
}
|
|
179
|
+
}, 100));
|
|
180
|
+
};
|
|
181
|
+
var style = {
|
|
182
|
+
hover: "rounded-sm text-primary-500 hover:text-primary-600 dark:text-primary-500 hover:dark:text-primary-400",
|
|
183
|
+
icon: "inline-block leading-none mis-1 cursor-pointer"
|
|
184
|
+
};
|
|
185
|
+
var createLinkRenderer = (onSelectObject) => (el, { url }) => {
|
|
186
|
+
const isInternal = url.startsWith("/") || // TODO(wittjosiah): This should probably be parsed out on paste?
|
|
187
|
+
url.startsWith(window.location.origin);
|
|
188
|
+
const options = isInternal ? {
|
|
189
|
+
onClick: () => {
|
|
190
|
+
const qualifiedId = url.split("/").at(-1);
|
|
191
|
+
invariant(qualifiedId, "Invalid link format.", {
|
|
192
|
+
F: __dxlog_file,
|
|
193
|
+
L: 263,
|
|
194
|
+
S: void 0,
|
|
195
|
+
A: [
|
|
196
|
+
"qualifiedId",
|
|
197
|
+
"'Invalid link format.'"
|
|
198
|
+
]
|
|
199
|
+
});
|
|
200
|
+
onSelectObject(qualifiedId);
|
|
201
|
+
}
|
|
202
|
+
} : {
|
|
203
|
+
href: url,
|
|
204
|
+
rel: "noreferrer",
|
|
205
|
+
target: "_blank"
|
|
206
|
+
};
|
|
207
|
+
renderRoot(el, /* @__PURE__ */ React.createElement("a", {
|
|
208
|
+
...options,
|
|
209
|
+
className: style.hover
|
|
210
|
+
}, /* @__PURE__ */ React.createElement(Icon, {
|
|
211
|
+
icon: isInternal ? "ph--arrow-square-down--bold" : "ph--arrow-square-out--bold",
|
|
212
|
+
size: 4,
|
|
213
|
+
classNames: style.icon
|
|
214
|
+
})));
|
|
215
|
+
};
|
|
216
|
+
var renderLinkTooltip = (el, { url }) => {
|
|
217
|
+
const web = new URL(url);
|
|
218
|
+
renderRoot(el, /* @__PURE__ */ React.createElement("a", {
|
|
219
|
+
href: url,
|
|
220
|
+
rel: "noreferrer",
|
|
221
|
+
target: "_blank",
|
|
222
|
+
className: style.hover
|
|
223
|
+
}, web.origin, /* @__PURE__ */ React.createElement(Icon, {
|
|
224
|
+
icon: "ph--arrow-square-out--bold",
|
|
225
|
+
size: 4,
|
|
226
|
+
classNames: style.icon
|
|
227
|
+
})));
|
|
228
|
+
};
|
|
229
|
+
var renderRoot = (root, node) => {
|
|
230
|
+
createRoot(root).render(/* @__PURE__ */ React.createElement(ThemeProvider, {
|
|
231
|
+
tx: defaultTx
|
|
232
|
+
}, node));
|
|
233
|
+
return root;
|
|
234
|
+
};
|
|
235
|
+
|
|
30
236
|
// src/components/MarkdownEditor/MarkdownEditor.tsx
|
|
31
237
|
import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
|
|
32
|
-
import
|
|
238
|
+
import React2, { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo as useMemo3, useRef } from "react";
|
|
33
239
|
import { useDropzone } from "react-dropzone";
|
|
34
|
-
import { invariant as
|
|
35
|
-
import { toLocalizedString, useThemeContext, useTranslation } from "@dxos/react-ui";
|
|
36
|
-
import {
|
|
240
|
+
import { invariant as invariant3 } from "@dxos/invariant";
|
|
241
|
+
import { Domino, toLocalizedString, useThemeContext, useTranslation } from "@dxos/react-ui";
|
|
242
|
+
import { EditorToolbar, PopoverMenuProvider, addLink, createBasicExtensions, createMarkdownExtensions, createThemeExtensions, dropFile, editorGutter, editorSlots, filterMenuGroups, formattingCommands, linkSlashCommands, processEditorPayload, stackItemContentEditorClassNames, useEditorToolbarState, useFormattingState, usePopoverMenu, useTextEditor } from "@dxos/react-ui-editor";
|
|
37
243
|
import { StackItem } from "@dxos/react-ui-stack";
|
|
38
|
-
import {
|
|
244
|
+
import { isNonNullable, isTruthy as isTruthy2 } from "@dxos/util";
|
|
39
245
|
|
|
40
246
|
// src/hooks/useSelectCurrentThread.tsx
|
|
41
|
-
import { EditorView } from "@codemirror/view";
|
|
42
|
-
import
|
|
43
|
-
import { useMemo } from "react";
|
|
44
|
-
import {
|
|
45
|
-
import { invariant } from "@dxos/invariant";
|
|
46
|
-
import { Cursor, setSelection } from "@dxos/react-ui-editor";
|
|
47
|
-
var
|
|
247
|
+
import { EditorView as EditorView2 } from "@codemirror/view";
|
|
248
|
+
import * as Schema from "effect/Schema";
|
|
249
|
+
import { useMemo as useMemo2 } from "react";
|
|
250
|
+
import { LayoutAction as LayoutAction2, createResolver, useIntentResolver } from "@dxos/app-framework";
|
|
251
|
+
import { invariant as invariant2 } from "@dxos/invariant";
|
|
252
|
+
import { Cursor as Cursor2, setSelection } from "@dxos/react-ui-editor";
|
|
253
|
+
var __dxlog_file2 = "/__w/dxos/dxos/packages/plugins/plugin-markdown/src/hooks/useSelectCurrentThread.tsx";
|
|
48
254
|
var useSelectCurrentThread = (editorView, documentId2) => {
|
|
49
|
-
const scrollIntoViewResolver =
|
|
50
|
-
intent:
|
|
255
|
+
const scrollIntoViewResolver = useMemo2(() => createResolver({
|
|
256
|
+
intent: LayoutAction2.UpdateLayout,
|
|
51
257
|
position: "hoist",
|
|
52
258
|
filter: (data) => {
|
|
53
|
-
if (!Schema.is(
|
|
259
|
+
if (!Schema.is(LayoutAction2.ScrollIntoView.fields.input)(data)) {
|
|
54
260
|
return false;
|
|
55
261
|
}
|
|
56
262
|
return !!editorView && data.subject === documentId2 && !!data.options?.cursor;
|
|
57
263
|
},
|
|
58
264
|
resolve: ({ options: { cursor } }) => {
|
|
59
|
-
|
|
60
|
-
F:
|
|
265
|
+
invariant2(editorView, "Editor view is not defined.", {
|
|
266
|
+
F: __dxlog_file2,
|
|
61
267
|
L: 32,
|
|
62
268
|
S: void 0,
|
|
63
269
|
A: [
|
|
@@ -65,14 +271,14 @@ var useSelectCurrentThread = (editorView, documentId2) => {
|
|
|
65
271
|
"'Editor view is not defined.'"
|
|
66
272
|
]
|
|
67
273
|
});
|
|
68
|
-
const range =
|
|
274
|
+
const range = Cursor2.getRangeFromCursor(editorView.state, cursor);
|
|
69
275
|
if (range) {
|
|
70
276
|
const selection = editorView.state.selection.main.from !== range.from ? {
|
|
71
277
|
anchor: range.from
|
|
72
278
|
} : void 0;
|
|
73
279
|
const effects = [
|
|
74
280
|
// NOTE: This does not use the DOM scrollIntoView function.
|
|
75
|
-
|
|
281
|
+
EditorView2.scrollIntoView(range.from, {
|
|
76
282
|
y: "start",
|
|
77
283
|
yMargin: 96
|
|
78
284
|
})
|
|
@@ -94,33 +300,35 @@ var useSelectCurrentThread = (editorView, documentId2) => {
|
|
|
94
300
|
documentId2,
|
|
95
301
|
editorView
|
|
96
302
|
]);
|
|
97
|
-
useIntentResolver(
|
|
303
|
+
useIntentResolver(meta.id, scrollIntoViewResolver);
|
|
98
304
|
};
|
|
99
305
|
|
|
100
306
|
// src/components/MarkdownEditor/MarkdownEditor.tsx
|
|
101
|
-
var
|
|
102
|
-
var MarkdownEditor = ({ extensions:
|
|
307
|
+
var __dxlog_file3 = "/__w/dxos/dxos/packages/plugins/plugin-markdown/src/components/MarkdownEditor/MarkdownEditor.tsx";
|
|
308
|
+
var MarkdownEditor = ({ extensions: extensionsParam, slashCommandGroups, onLinkQuery, ...props }) => {
|
|
103
309
|
var _effect = _useSignals();
|
|
104
310
|
try {
|
|
105
311
|
const { t } = useTranslation();
|
|
106
|
-
const viewRef = useRef();
|
|
107
|
-
const getMenu = useCallback((
|
|
312
|
+
const viewRef = useRef(null);
|
|
313
|
+
const getMenu = useCallback(({ text, trigger }) => {
|
|
108
314
|
switch (trigger) {
|
|
109
|
-
case "@":
|
|
110
|
-
return onLinkQuery?.(
|
|
315
|
+
case "@": {
|
|
316
|
+
return onLinkQuery?.(text) ?? [];
|
|
317
|
+
}
|
|
111
318
|
case "/":
|
|
112
|
-
default:
|
|
113
|
-
return
|
|
114
|
-
|
|
319
|
+
default: {
|
|
320
|
+
return filterMenuGroups([
|
|
321
|
+
formattingCommands,
|
|
115
322
|
linkSlashCommands,
|
|
116
323
|
...slashCommandGroups ?? []
|
|
117
|
-
], (item) =>
|
|
324
|
+
], (item) => text ? toLocalizedString(item.label, t).toLowerCase().includes(text.toLowerCase()) : true);
|
|
325
|
+
}
|
|
118
326
|
}
|
|
119
327
|
}, [
|
|
120
328
|
onLinkQuery,
|
|
121
329
|
slashCommandGroups
|
|
122
330
|
]);
|
|
123
|
-
const options =
|
|
331
|
+
const options = useMemo3(() => {
|
|
124
332
|
const trigger = onLinkQuery ? [
|
|
125
333
|
"/",
|
|
126
334
|
"@"
|
|
@@ -132,45 +340,30 @@ var MarkdownEditor = ({ extensions: _extensions, slashCommandGroups, onLinkQuery
|
|
|
132
340
|
trigger,
|
|
133
341
|
placeholder: {
|
|
134
342
|
delay: 3e3,
|
|
135
|
-
content: () =>
|
|
136
|
-
return createElement("div", void 0, [
|
|
137
|
-
createElement("span", {
|
|
138
|
-
text: "Press"
|
|
139
|
-
}),
|
|
140
|
-
...trigger.map((text) => createElement("span", {
|
|
141
|
-
className: "border border-separator rounded-sm mx-1 px-1.5 pt-[1px] pb-[2px]",
|
|
142
|
-
text
|
|
143
|
-
})),
|
|
144
|
-
createElement("span", {
|
|
145
|
-
text: "for commands."
|
|
146
|
-
})
|
|
147
|
-
]);
|
|
148
|
-
}
|
|
343
|
+
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()
|
|
149
344
|
},
|
|
150
345
|
getMenu
|
|
151
346
|
};
|
|
152
347
|
}, [
|
|
348
|
+
onLinkQuery,
|
|
153
349
|
getMenu
|
|
154
350
|
]);
|
|
155
|
-
const {
|
|
156
|
-
const extensions =
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
].filter(
|
|
160
|
-
|
|
161
|
-
|
|
351
|
+
const { groupsRef, extension, ...commandMenuProps } = usePopoverMenu(options);
|
|
352
|
+
const extensions = useMemo3(() => [
|
|
353
|
+
extensionsParam,
|
|
354
|
+
extension
|
|
355
|
+
].filter(isTruthy2), [
|
|
356
|
+
extensionsParam,
|
|
357
|
+
extension
|
|
162
358
|
]);
|
|
163
|
-
return /* @__PURE__ */
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
359
|
+
return /* @__PURE__ */ React2.createElement(PopoverMenuProvider, {
|
|
360
|
+
view: viewRef.current,
|
|
361
|
+
groups: groupsRef.current,
|
|
362
|
+
...commandMenuProps
|
|
363
|
+
}, /* @__PURE__ */ React2.createElement(MarkdownEditorImpl, {
|
|
167
364
|
ref: viewRef,
|
|
168
365
|
...props,
|
|
169
366
|
extensions
|
|
170
|
-
}), /* @__PURE__ */ React.createElement(CommandMenu, {
|
|
171
|
-
groups: groupsRef.current,
|
|
172
|
-
currentItem,
|
|
173
|
-
onSelect
|
|
174
367
|
}));
|
|
175
368
|
} finally {
|
|
176
369
|
_effect.f();
|
|
@@ -179,16 +372,16 @@ var MarkdownEditor = ({ extensions: _extensions, slashCommandGroups, onLinkQuery
|
|
|
179
372
|
var MarkdownEditorImpl = /* @__PURE__ */ forwardRef(({ id, role = "article", initialValue, customActions, editorStateStore, extensions, extensionProviders, scrollPastEnd, toolbar, viewMode, onFileUpload, onViewModeChange }, forwardedRef) => {
|
|
180
373
|
var _effect = _useSignals();
|
|
181
374
|
try {
|
|
182
|
-
const { t } = useTranslation(
|
|
375
|
+
const { t } = useTranslation(meta.id);
|
|
183
376
|
const { themeMode } = useThemeContext();
|
|
184
377
|
const toolbarState = useEditorToolbarState({
|
|
185
378
|
viewMode
|
|
186
379
|
});
|
|
187
380
|
const formattingObserver = useFormattingState(toolbarState);
|
|
188
|
-
const { scrollTo, selection } =
|
|
381
|
+
const { scrollTo, selection } = useMemo3(() => editorStateStore?.getState(id) ?? {}, [
|
|
189
382
|
id
|
|
190
383
|
]);
|
|
191
|
-
const providerExtensions =
|
|
384
|
+
const providerExtensions = useMemo3(() => extensionProviders?.flatMap((provider) => provider({})).filter(isNonNullable), [
|
|
192
385
|
extensionProviders
|
|
193
386
|
]);
|
|
194
387
|
const handleDrop = async (view, { files }) => {
|
|
@@ -208,11 +401,10 @@ var MarkdownEditorImpl = /* @__PURE__ */ forwardRef(({ id, role = "article", ini
|
|
|
208
401
|
createBasicExtensions({
|
|
209
402
|
readOnly: viewMode === "readonly",
|
|
210
403
|
placeholder: t("editor placeholder"),
|
|
211
|
-
scrollPastEnd: role === "section" ? false : scrollPastEnd
|
|
212
|
-
|
|
213
|
-
createMarkdownExtensions({
|
|
214
|
-
themeMode
|
|
404
|
+
scrollPastEnd: role === "section" ? false : scrollPastEnd,
|
|
405
|
+
search: true
|
|
215
406
|
}),
|
|
407
|
+
createMarkdownExtensions(),
|
|
216
408
|
createThemeExtensions({
|
|
217
409
|
themeMode,
|
|
218
410
|
syntaxHighlighting: true,
|
|
@@ -224,7 +416,7 @@ var MarkdownEditorImpl = /* @__PURE__ */ forwardRef(({ id, role = "article", ini
|
|
|
224
416
|
}),
|
|
225
417
|
providerExtensions,
|
|
226
418
|
extensions
|
|
227
|
-
].filter(
|
|
419
|
+
].filter(isTruthy2),
|
|
228
420
|
...role !== "section" && {
|
|
229
421
|
id,
|
|
230
422
|
scrollTo,
|
|
@@ -283,8 +475,8 @@ var MarkdownEditorImpl = /* @__PURE__ */ forwardRef(({ id, role = "article", ini
|
|
|
283
475
|
onFileUpload
|
|
284
476
|
]);
|
|
285
477
|
const getView = useCallback(() => {
|
|
286
|
-
|
|
287
|
-
F:
|
|
478
|
+
invariant3(editorView, void 0, {
|
|
479
|
+
F: __dxlog_file3,
|
|
288
480
|
L: 240,
|
|
289
481
|
S: void 0,
|
|
290
482
|
A: [
|
|
@@ -307,9 +499,9 @@ var MarkdownEditorImpl = /* @__PURE__ */ forwardRef(({ id, role = "article", ini
|
|
|
307
499
|
}, [
|
|
308
500
|
onFileUpload
|
|
309
501
|
]);
|
|
310
|
-
return /* @__PURE__ */
|
|
502
|
+
return /* @__PURE__ */ React2.createElement(StackItem.Content, {
|
|
311
503
|
toolbar: !!toolbar
|
|
312
|
-
}, toolbar && /* @__PURE__ */
|
|
504
|
+
}, toolbar && /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement(EditorToolbar, {
|
|
313
505
|
attendableId: id,
|
|
314
506
|
role,
|
|
315
507
|
state: toolbarState,
|
|
@@ -317,7 +509,7 @@ var MarkdownEditorImpl = /* @__PURE__ */ forwardRef(({ id, role = "article", ini
|
|
|
317
509
|
getView,
|
|
318
510
|
image: handleImageUpload,
|
|
319
511
|
viewMode: handleViewModeChange
|
|
320
|
-
}), /* @__PURE__ */
|
|
512
|
+
}), /* @__PURE__ */ React2.createElement("input", getInputProps())), /* @__PURE__ */ React2.createElement("div", {
|
|
321
513
|
role: "none",
|
|
322
514
|
ref: parentRef,
|
|
323
515
|
"data-testid": "composer.markdownRoot",
|
|
@@ -341,228 +533,13 @@ var useTest = (view) => {
|
|
|
341
533
|
]);
|
|
342
534
|
};
|
|
343
535
|
|
|
344
|
-
// src/extensions.tsx
|
|
345
|
-
import React2, { useMemo as useMemo3 } from "react";
|
|
346
|
-
import { createRoot } from "react-dom/client";
|
|
347
|
-
import { createIntent, LayoutAction as LayoutAction2, useCapabilities, useIntentDispatcher } from "@dxos/app-framework";
|
|
348
|
-
import { debounceAndThrottle } from "@dxos/async";
|
|
349
|
-
import { invariant as invariant3 } from "@dxos/invariant";
|
|
350
|
-
import { createDocAccessor, fullyQualifiedId, getSpace } from "@dxos/react-client/echo";
|
|
351
|
-
import { useIdentity } from "@dxos/react-client/halo";
|
|
352
|
-
import { Icon, ThemeProvider } from "@dxos/react-ui";
|
|
353
|
-
import { InputModeExtensions, createDataExtensions, autocomplete, decorateMarkdown, folding, formattingKeymap, linkTooltip, listener, preview, selectionState, typewriter, EditorView as EditorView2, documentId, Cursor as Cursor2 } from "@dxos/react-ui-editor";
|
|
354
|
-
import { defaultTx } from "@dxos/react-ui-theme";
|
|
355
|
-
import { isNotFalsy as isNotFalsy2 } from "@dxos/util";
|
|
356
|
-
var __dxlog_file3 = "/__w/dxos/dxos/packages/plugins/plugin-markdown/src/extensions.tsx";
|
|
357
|
-
var useExtensions = ({ document, id, text, settings, selectionManager, viewMode, editorStateStore, previewOptions }) => {
|
|
358
|
-
const { dispatchPromise: dispatch } = useIntentDispatcher();
|
|
359
|
-
const identity = useIdentity();
|
|
360
|
-
const space = getSpace(document) ?? getSpace(text);
|
|
361
|
-
const baseExtensions = useMemo3(() => createBaseExtensions({
|
|
362
|
-
document,
|
|
363
|
-
id,
|
|
364
|
-
text,
|
|
365
|
-
settings,
|
|
366
|
-
selectionManager,
|
|
367
|
-
viewMode,
|
|
368
|
-
previewOptions,
|
|
369
|
-
dispatch
|
|
370
|
-
}), [
|
|
371
|
-
document,
|
|
372
|
-
id,
|
|
373
|
-
text,
|
|
374
|
-
viewMode,
|
|
375
|
-
dispatch,
|
|
376
|
-
previewOptions,
|
|
377
|
-
settings,
|
|
378
|
-
settings.editorInputMode,
|
|
379
|
-
settings.folding,
|
|
380
|
-
settings.numberedHeadings,
|
|
381
|
-
settings.debug,
|
|
382
|
-
settings.typewriter,
|
|
383
|
-
selectionManager
|
|
384
|
-
]);
|
|
385
|
-
const extensionProviders = useCapabilities(MarkdownCapabilities.Extensions);
|
|
386
|
-
const pluginExtensions = useMemo3(() => {
|
|
387
|
-
if (!document) {
|
|
388
|
-
return [];
|
|
389
|
-
}
|
|
390
|
-
return extensionProviders.flat().reduce((acc, provider) => {
|
|
391
|
-
const extension = typeof provider === "function" ? provider({
|
|
392
|
-
document
|
|
393
|
-
}) : provider;
|
|
394
|
-
if (extension) {
|
|
395
|
-
acc.push(extension);
|
|
396
|
-
}
|
|
397
|
-
return acc;
|
|
398
|
-
}, []);
|
|
399
|
-
}, [
|
|
400
|
-
extensionProviders,
|
|
401
|
-
document
|
|
402
|
-
]);
|
|
403
|
-
return useMemo3(() => [
|
|
404
|
-
// NOTE: Data extensions must be first so that automerge is updated before other extensions compute their state.
|
|
405
|
-
document && createDataExtensions({
|
|
406
|
-
id: document.id,
|
|
407
|
-
text: document.content.target && createDocAccessor(document.content.target, [
|
|
408
|
-
"content"
|
|
409
|
-
]),
|
|
410
|
-
space,
|
|
411
|
-
identity
|
|
412
|
-
}),
|
|
413
|
-
text && id && createDataExtensions({
|
|
414
|
-
id,
|
|
415
|
-
text: createDocAccessor(text, [
|
|
416
|
-
"content"
|
|
417
|
-
]),
|
|
418
|
-
space,
|
|
419
|
-
identity
|
|
420
|
-
}),
|
|
421
|
-
selectionState(editorStateStore),
|
|
422
|
-
document && listener({
|
|
423
|
-
onChange: (text2) => setFallbackName(document, text2)
|
|
424
|
-
}),
|
|
425
|
-
baseExtensions,
|
|
426
|
-
pluginExtensions
|
|
427
|
-
].filter(isNotFalsy2), [
|
|
428
|
-
baseExtensions,
|
|
429
|
-
pluginExtensions,
|
|
430
|
-
document,
|
|
431
|
-
document?.content?.target,
|
|
432
|
-
text,
|
|
433
|
-
id,
|
|
434
|
-
space,
|
|
435
|
-
identity
|
|
436
|
-
]);
|
|
437
|
-
};
|
|
438
|
-
var createBaseExtensions = ({ document, id, dispatch, settings, selectionManager, query, viewMode, previewOptions }) => {
|
|
439
|
-
const extensions = [
|
|
440
|
-
selectionManager && selectionChange(selectionManager),
|
|
441
|
-
settings.editorInputMode && InputModeExtensions[settings.editorInputMode],
|
|
442
|
-
settings.folding && folding()
|
|
443
|
-
].filter(isNotFalsy2);
|
|
444
|
-
if (viewMode !== "source") {
|
|
445
|
-
extensions.push(...[
|
|
446
|
-
formattingKeymap(),
|
|
447
|
-
decorateMarkdown({
|
|
448
|
-
selectionChangeDelay: 100,
|
|
449
|
-
numberedHeadings: settings.numberedHeadings ? {
|
|
450
|
-
from: 2
|
|
451
|
-
} : void 0,
|
|
452
|
-
// TODO(wittjosiah): For internal links, consider ignoring the link text and rendering the label of the object being linked to.
|
|
453
|
-
renderLinkButton: dispatch && (document || id) ? createLinkRenderer((id2) => {
|
|
454
|
-
void dispatch(createIntent(LayoutAction2.Open, {
|
|
455
|
-
part: "main",
|
|
456
|
-
subject: [
|
|
457
|
-
id2
|
|
458
|
-
],
|
|
459
|
-
options: {
|
|
460
|
-
pivotId: document ? fullyQualifiedId(document) : id2
|
|
461
|
-
}
|
|
462
|
-
}));
|
|
463
|
-
}) : void 0
|
|
464
|
-
}),
|
|
465
|
-
linkTooltip(renderLinkTooltip),
|
|
466
|
-
preview(previewOptions)
|
|
467
|
-
]);
|
|
468
|
-
}
|
|
469
|
-
if (query) {
|
|
470
|
-
extensions.push(autocomplete({
|
|
471
|
-
onSearch: (text) => {
|
|
472
|
-
return query.objects.map((object) => object.name?.length && object.id !== document?.id ? {
|
|
473
|
-
label: object.name,
|
|
474
|
-
// TODO(burdon): Factor out URL builder.
|
|
475
|
-
apply: `[${object.name}](/${fullyQualifiedId(object)})`
|
|
476
|
-
} : void 0).filter(isNotFalsy2);
|
|
477
|
-
}
|
|
478
|
-
}));
|
|
479
|
-
}
|
|
480
|
-
if (settings.debug) {
|
|
481
|
-
const items = settings.typewriter?.split(/[,\n]/) ?? "";
|
|
482
|
-
if (items) {
|
|
483
|
-
extensions.push(typewriter({
|
|
484
|
-
items
|
|
485
|
-
}));
|
|
486
|
-
}
|
|
487
|
-
}
|
|
488
|
-
return extensions;
|
|
489
|
-
};
|
|
490
|
-
var selectionChange = (selectionManager) => {
|
|
491
|
-
return EditorView2.updateListener.of(debounceAndThrottle((update) => {
|
|
492
|
-
if (update.selectionSet) {
|
|
493
|
-
const id = update.state.facet(documentId);
|
|
494
|
-
const cursorConverter = update.state.facet(Cursor2.converter);
|
|
495
|
-
const selection = update.state.selection;
|
|
496
|
-
const ranges = selection.ranges.map((range) => ({
|
|
497
|
-
from: cursorConverter.toCursor(range.from),
|
|
498
|
-
to: cursorConverter.toCursor(range.to)
|
|
499
|
-
})).filter(({ from, to }) => to > from);
|
|
500
|
-
selectionManager.updateMultiRange(id, ranges);
|
|
501
|
-
}
|
|
502
|
-
}, 100));
|
|
503
|
-
};
|
|
504
|
-
var style = {
|
|
505
|
-
hover: "rounded-sm text-primary-500 hover:text-primary-600 dark:text-primary-500 hover:dark:text-primary-400",
|
|
506
|
-
icon: "inline-block leading-none mis-1 cursor-pointer"
|
|
507
|
-
};
|
|
508
|
-
var createLinkRenderer = (onSelectObject) => (el, { url }) => {
|
|
509
|
-
const isInternal = url.startsWith("/") || // TODO(wittjosiah): This should probably be parsed out on paste?
|
|
510
|
-
url.startsWith(window.location.origin);
|
|
511
|
-
const options = isInternal ? {
|
|
512
|
-
onClick: () => {
|
|
513
|
-
const qualifiedId = url.split("/").at(-1);
|
|
514
|
-
invariant3(qualifiedId, "Invalid link format.", {
|
|
515
|
-
F: __dxlog_file3,
|
|
516
|
-
L: 291,
|
|
517
|
-
S: void 0,
|
|
518
|
-
A: [
|
|
519
|
-
"qualifiedId",
|
|
520
|
-
"'Invalid link format.'"
|
|
521
|
-
]
|
|
522
|
-
});
|
|
523
|
-
onSelectObject(qualifiedId);
|
|
524
|
-
}
|
|
525
|
-
} : {
|
|
526
|
-
href: url,
|
|
527
|
-
rel: "noreferrer",
|
|
528
|
-
target: "_blank"
|
|
529
|
-
};
|
|
530
|
-
renderRoot(el, /* @__PURE__ */ React2.createElement("a", {
|
|
531
|
-
...options,
|
|
532
|
-
className: style.hover
|
|
533
|
-
}, /* @__PURE__ */ React2.createElement(Icon, {
|
|
534
|
-
icon: isInternal ? "ph--arrow-square-down--bold" : "ph--arrow-square-out--bold",
|
|
535
|
-
size: 4,
|
|
536
|
-
classNames: style.icon
|
|
537
|
-
})));
|
|
538
|
-
};
|
|
539
|
-
var renderLinkTooltip = (el, { url }) => {
|
|
540
|
-
const web = new URL(url);
|
|
541
|
-
renderRoot(el, /* @__PURE__ */ React2.createElement("a", {
|
|
542
|
-
href: url,
|
|
543
|
-
rel: "noreferrer",
|
|
544
|
-
target: "_blank",
|
|
545
|
-
className: style.hover
|
|
546
|
-
}, web.origin, /* @__PURE__ */ React2.createElement(Icon, {
|
|
547
|
-
icon: "ph--arrow-square-out--bold",
|
|
548
|
-
size: 4,
|
|
549
|
-
classNames: style.icon
|
|
550
|
-
})));
|
|
551
|
-
};
|
|
552
|
-
var renderRoot = (root, node) => {
|
|
553
|
-
createRoot(root).render(/* @__PURE__ */ React2.createElement(ThemeProvider, {
|
|
554
|
-
tx: defaultTx
|
|
555
|
-
}, node));
|
|
556
|
-
return root;
|
|
557
|
-
};
|
|
558
|
-
|
|
559
536
|
// src/components/MarkdownContainer.tsx
|
|
560
537
|
var MarkdownContainer = ({ id, role, object, settings, selectionManager, viewMode, editorStateStore, onViewModeChange }) => {
|
|
561
538
|
var _effect = _useSignals2();
|
|
562
539
|
try {
|
|
563
540
|
const { t } = useTranslation2();
|
|
564
541
|
const scrollPastEnd = role === "article";
|
|
565
|
-
const doc = Obj.instanceOf(
|
|
542
|
+
const doc = Obj.instanceOf(Markdown_exports.Document, object) ? object : void 0;
|
|
566
543
|
const text = Obj.instanceOf(DataType.Text, object) ? object : void 0;
|
|
567
544
|
const [previewBlocks, setPreviewBlocks] = useState([]);
|
|
568
545
|
const previewOptions = useMemo4(() => ({
|
|
@@ -600,7 +577,7 @@ var MarkdownContainer = ({ id, role, object, settings, selectionManager, viewMod
|
|
|
600
577
|
objectForms,
|
|
601
578
|
schemaWhiteList
|
|
602
579
|
]);
|
|
603
|
-
const
|
|
580
|
+
const handleLinkQuery = useCallback2(async (query) => {
|
|
604
581
|
const name = query?.startsWith("@") ? query.slice(1).toLowerCase() : query?.toLowerCase() ?? "";
|
|
605
582
|
const results = await space?.db.query(Query.select(filter)).run();
|
|
606
583
|
const getLabel = (object2) => {
|
|
@@ -626,7 +603,7 @@ var MarkdownContainer = ({ id, role, object, settings, selectionManager, viewMod
|
|
|
626
603
|
label,
|
|
627
604
|
icon: metadata.icon,
|
|
628
605
|
onSelect: (view, head) => {
|
|
629
|
-
const link = `[${label}]
|
|
606
|
+
const link = `[${label}](${Obj.getDXN(object2)})`;
|
|
630
607
|
if (query?.startsWith("@")) {
|
|
631
608
|
insertAtLineStart(view, head, `!${link}
|
|
632
609
|
`);
|
|
@@ -656,7 +633,7 @@ var MarkdownContainer = ({ id, role, object, settings, selectionManager, viewMod
|
|
|
656
633
|
settings,
|
|
657
634
|
scrollPastEnd,
|
|
658
635
|
onViewModeChange,
|
|
659
|
-
onLinkQuery: space ?
|
|
636
|
+
onLinkQuery: space ? handleLinkQuery : void 0
|
|
660
637
|
}) : text ? /* @__PURE__ */ React3.createElement(MarkdownEditor, {
|
|
661
638
|
id,
|
|
662
639
|
role,
|
|
@@ -667,22 +644,19 @@ var MarkdownContainer = ({ id, role, object, settings, selectionManager, viewMod
|
|
|
667
644
|
inputMode: settings.editorInputMode,
|
|
668
645
|
scrollPastEnd,
|
|
669
646
|
onViewModeChange,
|
|
670
|
-
onLinkQuery: space ?
|
|
671
|
-
}) : (
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
onLinkQuery: space ? onLinkQuery : void 0
|
|
684
|
-
})
|
|
685
|
-
);
|
|
647
|
+
onLinkQuery: space ? handleLinkQuery : void 0
|
|
648
|
+
}) : /* @__PURE__ */ React3.createElement(MarkdownEditor, {
|
|
649
|
+
id,
|
|
650
|
+
role,
|
|
651
|
+
initialValue: object.text,
|
|
652
|
+
extensions,
|
|
653
|
+
viewMode,
|
|
654
|
+
toolbar: settings.toolbar,
|
|
655
|
+
inputMode: settings.editorInputMode,
|
|
656
|
+
scrollPastEnd,
|
|
657
|
+
onViewModeChange,
|
|
658
|
+
onLinkQuery: space ? handleLinkQuery : void 0
|
|
659
|
+
});
|
|
686
660
|
return /* @__PURE__ */ React3.createElement(React3.Fragment, null, editor, previewBlocks.map(({ link, el }) => /* @__PURE__ */ React3.createElement(PreviewBlock, {
|
|
687
661
|
key: link.ref,
|
|
688
662
|
link,
|
|
@@ -695,11 +669,9 @@ var MarkdownContainer = ({ id, role, object, settings, selectionManager, viewMod
|
|
|
695
669
|
var PreviewBlock = ({ link, el }) => {
|
|
696
670
|
var _effect = _useSignals2();
|
|
697
671
|
try {
|
|
698
|
-
const
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
const space = useSpace(echoDXN?.spaceId);
|
|
702
|
-
const [subject] = useQuery(space, Query.select(Filter.ids(echoDXN?.echoId ?? "")));
|
|
672
|
+
const client = useClient();
|
|
673
|
+
const dxn = DXN.parse(link.ref);
|
|
674
|
+
const subject = client.graph.ref(dxn).target;
|
|
703
675
|
const data = useMemo4(() => ({
|
|
704
676
|
subject
|
|
705
677
|
}), [
|
|
@@ -773,6 +745,7 @@ var DocumentEditor = ({ id, document: doc, settings, viewMode, ...props }) => {
|
|
|
773
745
|
var MarkdownContainer_default = MarkdownContainer;
|
|
774
746
|
export {
|
|
775
747
|
DocumentEditor,
|
|
748
|
+
MarkdownContainer,
|
|
776
749
|
MarkdownContainer_default as default
|
|
777
750
|
};
|
|
778
|
-
//# sourceMappingURL=MarkdownContainer-
|
|
751
|
+
//# sourceMappingURL=MarkdownContainer-MV2UNAUV.mjs.map
|