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