@dxos/plugin-markdown 0.8.4-main.c1de068 → 0.8.4-main.c4373fc
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/{MarkdownPreview-S3C7CGAV.mjs → MarkdownCard-ZHTH6EVA.mjs} +18 -18
- package/dist/lib/browser/MarkdownCard-ZHTH6EVA.mjs.map +7 -0
- package/dist/lib/browser/{MarkdownContainer-F3WEEIBX.mjs → MarkdownContainer-XDYFBDCI.mjs} +287 -315
- package/dist/lib/browser/MarkdownContainer-XDYFBDCI.mjs.map +7 -0
- package/dist/lib/browser/{anchor-sort-UKJJ7ZNP.mjs → anchor-sort-53E7TJGF.mjs} +7 -7
- package/dist/lib/browser/anchor-sort-53E7TJGF.mjs.map +7 -0
- package/dist/lib/browser/{app-graph-serializer-ICLAF662.mjs → app-graph-serializer-IEPNJZBR.mjs} +13 -14
- package/dist/lib/browser/app-graph-serializer-IEPNJZBR.mjs.map +7 -0
- package/dist/lib/browser/blueprint-definition-XDLVVSUN.mjs +11 -0
- package/dist/lib/browser/blueprint-definition-XDLVVSUN.mjs.map +7 -0
- package/dist/lib/browser/chunk-EVQGTH3P.mjs +22 -0
- package/dist/lib/browser/chunk-EVQGTH3P.mjs.map +7 -0
- package/dist/lib/browser/{chunk-LHDCHDBW.mjs → chunk-NGXGBWSS.mjs} +6 -5
- package/dist/lib/browser/chunk-NGXGBWSS.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-PMBWHKDI.mjs +78 -0
- package/dist/lib/browser/chunk-PMBWHKDI.mjs.map +7 -0
- package/dist/lib/browser/chunk-VZU7BRGW.mjs +106 -0
- package/dist/lib/browser/chunk-VZU7BRGW.mjs.map +7 -0
- package/dist/lib/browser/{chunk-LFML7LC6.mjs → chunk-XYQDM6PM.mjs} +8 -9
- package/dist/lib/browser/chunk-XYQDM6PM.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +35 -22
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/intent-resolver-66ZUQ6JC.mjs +62 -0
- package/dist/lib/browser/intent-resolver-66ZUQ6JC.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{react-surface-C3Z423TV.mjs → react-surface-ONX5RNFM.mjs} +55 -46
- package/dist/lib/browser/react-surface-ONX5RNFM.mjs.map +7 -0
- package/dist/lib/browser/{settings-KN75ZQY6.mjs → settings-HXM36BCZ.mjs} +7 -7
- package/dist/lib/browser/settings-HXM36BCZ.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-73U3A7SD.mjs +76 -0
- package/dist/lib/browser/toolkit-73U3A7SD.mjs.map +7 -0
- package/dist/lib/browser/types/index.mjs +6 -14
- package/dist/lib/node-esm/{MarkdownPreview-77UFEWXT.mjs → MarkdownCard-MEA4QAAI.mjs} +18 -18
- package/dist/lib/node-esm/MarkdownCard-MEA4QAAI.mjs.map +7 -0
- package/dist/lib/node-esm/{MarkdownContainer-VOUHL6IU.mjs → MarkdownContainer-7GYMOJVT.mjs} +287 -315
- package/dist/lib/node-esm/MarkdownContainer-7GYMOJVT.mjs.map +7 -0
- package/dist/lib/node-esm/{anchor-sort-IPIS5D5B.mjs → anchor-sort-V2FWEYDN.mjs} +7 -7
- package/dist/lib/node-esm/anchor-sort-V2FWEYDN.mjs.map +7 -0
- package/dist/lib/node-esm/{app-graph-serializer-FLBXQKKR.mjs → app-graph-serializer-HIN4NMUG.mjs} +13 -14
- package/dist/lib/node-esm/app-graph-serializer-HIN4NMUG.mjs.map +7 -0
- package/dist/lib/node-esm/blueprint-definition-PDXZ67UQ.mjs +12 -0
- package/dist/lib/node-esm/blueprint-definition-PDXZ67UQ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-35WAARP4.mjs +79 -0
- package/dist/lib/node-esm/chunk-35WAARP4.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-CWTFQSN7.mjs → chunk-IOC54NCF.mjs} +8 -9
- package/dist/lib/node-esm/chunk-IOC54NCF.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-VELFUWUH.mjs +107 -0
- package/dist/lib/node-esm/chunk-VELFUWUH.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-W4XXBX33.mjs +24 -0
- package/dist/lib/node-esm/chunk-W4XXBX33.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-VIR2ABYE.mjs → chunk-YGSNWTGP.mjs} +6 -5
- package/dist/lib/node-esm/chunk-YGSNWTGP.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +35 -22
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/intent-resolver-TNRIFHNH.mjs +63 -0
- package/dist/lib/node-esm/intent-resolver-TNRIFHNH.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-surface-TTTBYNI2.mjs → react-surface-X2GV6WQH.mjs} +55 -46
- package/dist/lib/node-esm/react-surface-X2GV6WQH.mjs.map +7 -0
- package/dist/lib/node-esm/{settings-KVP7TVX7.mjs → settings-KPLQ5ONI.mjs} +7 -7
- package/dist/lib/node-esm/settings-KPLQ5ONI.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-GUBDYF72.mjs +77 -0
- package/dist/lib/node-esm/toolkit-GUBDYF72.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 +2 -2
- 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 +43 -0
- package/dist/types/src/types/Markdown.d.ts.map +1 -0
- package/dist/types/src/types/MarkdownAction.d.ts +33 -0
- package/dist/types/src/types/MarkdownAction.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +2 -1
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +3 -59
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/src/util.d.ts +12 -3
- package/dist/types/src/util.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +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/{MarkdownPreview/MarkdownPreview.tsx → MarkdownCard/MarkdownCard.tsx} +13 -11
- package/src/components/MarkdownCard/index.ts +9 -0
- package/src/components/MarkdownContainer.stories.tsx +47 -41
- package/src/components/MarkdownContainer.tsx +22 -19
- package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +21 -17
- package/src/components/MarkdownEditor/MarkdownEditor.tsx +39 -39
- package/src/components/MarkdownSettings/MarkdownSettings.tsx +81 -78
- package/src/components/Suggestions.stories.tsx +51 -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 +56 -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 +20 -6
- package/dist/lib/browser/MarkdownContainer-F3WEEIBX.mjs.map +0 -7
- 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.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/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-W4XXBX33.mjs";
|
|
3
|
+
import "./chunk-VELFUWUH.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-IOC54NCF.mjs";
|
|
10
11
|
import {
|
|
11
|
-
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
Markdown_exports
|
|
13
|
+
} from "./chunk-35WAARP4.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 { CommandMenuProvider, EditorToolbar, addLink, coreSlashCommands, createBasicExtensions, createMarkdownExtensions, createThemeExtensions, dropFile, editorGutter, editorSlots, filterItems, linkSlashCommands, processEditorPayload, stackItemContentEditorClassNames, useCommandMenu, useEditorToolbarState, useFormattingState, 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();
|
|
313
|
+
const viewRef = useRef(null);
|
|
108
314
|
const getMenu = useCallback((trigger, query) => {
|
|
109
315
|
switch (trigger) {
|
|
110
|
-
case "@":
|
|
316
|
+
case "@": {
|
|
111
317
|
return onLinkQuery?.(query) ?? [];
|
|
318
|
+
}
|
|
112
319
|
case "/":
|
|
113
|
-
default:
|
|
320
|
+
default: {
|
|
114
321
|
return filterItems([
|
|
115
322
|
coreSlashCommands,
|
|
116
323
|
linkSlashCommands,
|
|
117
324
|
...slashCommandGroups ?? []
|
|
118
325
|
], (item) => query ? toLocalizedString(item.label, t).toLowerCase().includes(query.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,29 @@ 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("border border-separator rounded-sm mx-1 px-1.5 pt-[1px] pb-[2px]").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
|
-
|
|
352
|
+
const { groupsRef, commandMenu, ...commandMenuProps } = useCommandMenu(options);
|
|
353
|
+
const extensions = useMemo3(() => [
|
|
354
|
+
extensionsParam,
|
|
159
355
|
commandMenu
|
|
160
|
-
].filter(
|
|
161
|
-
|
|
356
|
+
].filter(isTruthy2), [
|
|
357
|
+
extensionsParam,
|
|
162
358
|
commandMenu
|
|
163
359
|
]);
|
|
164
|
-
return /* @__PURE__ */
|
|
165
|
-
|
|
166
|
-
...
|
|
167
|
-
}, /* @__PURE__ */
|
|
360
|
+
return /* @__PURE__ */ React2.createElement(CommandMenuProvider, {
|
|
361
|
+
groups: groupsRef.current,
|
|
362
|
+
...commandMenuProps
|
|
363
|
+
}, /* @__PURE__ */ React2.createElement(MarkdownEditorImpl, {
|
|
168
364
|
ref: viewRef,
|
|
169
365
|
...props,
|
|
170
366
|
extensions
|
|
171
|
-
}), /* @__PURE__ */ React.createElement(CommandMenu, {
|
|
172
|
-
groups: groupsRef.current,
|
|
173
|
-
currentItem,
|
|
174
|
-
onSelect
|
|
175
367
|
}));
|
|
176
368
|
} finally {
|
|
177
369
|
_effect.f();
|
|
@@ -180,16 +372,16 @@ var MarkdownEditor = ({ extensions: _extensions, slashCommandGroups, onLinkQuery
|
|
|
180
372
|
var MarkdownEditorImpl = /* @__PURE__ */ forwardRef(({ id, role = "article", initialValue, customActions, editorStateStore, extensions, extensionProviders, scrollPastEnd, toolbar, viewMode, onFileUpload, onViewModeChange }, forwardedRef) => {
|
|
181
373
|
var _effect = _useSignals();
|
|
182
374
|
try {
|
|
183
|
-
const { t } = useTranslation(
|
|
375
|
+
const { t } = useTranslation(meta.id);
|
|
184
376
|
const { themeMode } = useThemeContext();
|
|
185
377
|
const toolbarState = useEditorToolbarState({
|
|
186
378
|
viewMode
|
|
187
379
|
});
|
|
188
380
|
const formattingObserver = useFormattingState(toolbarState);
|
|
189
|
-
const { scrollTo, selection } =
|
|
381
|
+
const { scrollTo, selection } = useMemo3(() => editorStateStore?.getState(id) ?? {}, [
|
|
190
382
|
id
|
|
191
383
|
]);
|
|
192
|
-
const providerExtensions =
|
|
384
|
+
const providerExtensions = useMemo3(() => extensionProviders?.flatMap((provider) => provider({})).filter(isNonNullable), [
|
|
193
385
|
extensionProviders
|
|
194
386
|
]);
|
|
195
387
|
const handleDrop = async (view, { files }) => {
|
|
@@ -209,11 +401,10 @@ var MarkdownEditorImpl = /* @__PURE__ */ forwardRef(({ id, role = "article", ini
|
|
|
209
401
|
createBasicExtensions({
|
|
210
402
|
readOnly: viewMode === "readonly",
|
|
211
403
|
placeholder: t("editor placeholder"),
|
|
212
|
-
scrollPastEnd: role === "section" ? false : scrollPastEnd
|
|
213
|
-
|
|
214
|
-
createMarkdownExtensions({
|
|
215
|
-
themeMode
|
|
404
|
+
scrollPastEnd: role === "section" ? false : scrollPastEnd,
|
|
405
|
+
search: true
|
|
216
406
|
}),
|
|
407
|
+
createMarkdownExtensions(),
|
|
217
408
|
createThemeExtensions({
|
|
218
409
|
themeMode,
|
|
219
410
|
syntaxHighlighting: true,
|
|
@@ -225,7 +416,7 @@ var MarkdownEditorImpl = /* @__PURE__ */ forwardRef(({ id, role = "article", ini
|
|
|
225
416
|
}),
|
|
226
417
|
providerExtensions,
|
|
227
418
|
extensions
|
|
228
|
-
].filter(
|
|
419
|
+
].filter(isTruthy2),
|
|
229
420
|
...role !== "section" && {
|
|
230
421
|
id,
|
|
231
422
|
scrollTo,
|
|
@@ -284,8 +475,8 @@ var MarkdownEditorImpl = /* @__PURE__ */ forwardRef(({ id, role = "article", ini
|
|
|
284
475
|
onFileUpload
|
|
285
476
|
]);
|
|
286
477
|
const getView = useCallback(() => {
|
|
287
|
-
|
|
288
|
-
F:
|
|
478
|
+
invariant3(editorView, void 0, {
|
|
479
|
+
F: __dxlog_file3,
|
|
289
480
|
L: 240,
|
|
290
481
|
S: void 0,
|
|
291
482
|
A: [
|
|
@@ -308,9 +499,9 @@ var MarkdownEditorImpl = /* @__PURE__ */ forwardRef(({ id, role = "article", ini
|
|
|
308
499
|
}, [
|
|
309
500
|
onFileUpload
|
|
310
501
|
]);
|
|
311
|
-
return /* @__PURE__ */
|
|
502
|
+
return /* @__PURE__ */ React2.createElement(StackItem.Content, {
|
|
312
503
|
toolbar: !!toolbar
|
|
313
|
-
}, toolbar && /* @__PURE__ */
|
|
504
|
+
}, toolbar && /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement(EditorToolbar, {
|
|
314
505
|
attendableId: id,
|
|
315
506
|
role,
|
|
316
507
|
state: toolbarState,
|
|
@@ -318,7 +509,7 @@ var MarkdownEditorImpl = /* @__PURE__ */ forwardRef(({ id, role = "article", ini
|
|
|
318
509
|
getView,
|
|
319
510
|
image: handleImageUpload,
|
|
320
511
|
viewMode: handleViewModeChange
|
|
321
|
-
}), /* @__PURE__ */
|
|
512
|
+
}), /* @__PURE__ */ React2.createElement("input", getInputProps())), /* @__PURE__ */ React2.createElement("div", {
|
|
322
513
|
role: "none",
|
|
323
514
|
ref: parentRef,
|
|
324
515
|
"data-testid": "composer.markdownRoot",
|
|
@@ -342,228 +533,13 @@ var useTest = (view) => {
|
|
|
342
533
|
]);
|
|
343
534
|
};
|
|
344
535
|
|
|
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
536
|
// src/components/MarkdownContainer.tsx
|
|
561
537
|
var MarkdownContainer = ({ id, role, object, settings, selectionManager, viewMode, editorStateStore, onViewModeChange }) => {
|
|
562
538
|
var _effect = _useSignals2();
|
|
563
539
|
try {
|
|
564
540
|
const { t } = useTranslation2();
|
|
565
541
|
const scrollPastEnd = role === "article";
|
|
566
|
-
const doc = Obj.instanceOf(
|
|
542
|
+
const doc = Obj.instanceOf(Markdown_exports.Document, object) ? object : void 0;
|
|
567
543
|
const text = Obj.instanceOf(DataType.Text, object) ? object : void 0;
|
|
568
544
|
const [previewBlocks, setPreviewBlocks] = useState([]);
|
|
569
545
|
const previewOptions = useMemo4(() => ({
|
|
@@ -601,7 +577,7 @@ var MarkdownContainer = ({ id, role, object, settings, selectionManager, viewMod
|
|
|
601
577
|
objectForms,
|
|
602
578
|
schemaWhiteList
|
|
603
579
|
]);
|
|
604
|
-
const
|
|
580
|
+
const handleLinkQuery = useCallback2(async (query) => {
|
|
605
581
|
const name = query?.startsWith("@") ? query.slice(1).toLowerCase() : query?.toLowerCase() ?? "";
|
|
606
582
|
const results = await space?.db.query(Query.select(filter)).run();
|
|
607
583
|
const getLabel = (object2) => {
|
|
@@ -627,7 +603,7 @@ var MarkdownContainer = ({ id, role, object, settings, selectionManager, viewMod
|
|
|
627
603
|
label,
|
|
628
604
|
icon: metadata.icon,
|
|
629
605
|
onSelect: (view, head) => {
|
|
630
|
-
const link = `[${label}]
|
|
606
|
+
const link = `[${label}](${Obj.getDXN(object2)})`;
|
|
631
607
|
if (query?.startsWith("@")) {
|
|
632
608
|
insertAtLineStart(view, head, `!${link}
|
|
633
609
|
`);
|
|
@@ -657,7 +633,7 @@ var MarkdownContainer = ({ id, role, object, settings, selectionManager, viewMod
|
|
|
657
633
|
settings,
|
|
658
634
|
scrollPastEnd,
|
|
659
635
|
onViewModeChange,
|
|
660
|
-
onLinkQuery: space ?
|
|
636
|
+
onLinkQuery: space ? handleLinkQuery : void 0
|
|
661
637
|
}) : text ? /* @__PURE__ */ React3.createElement(MarkdownEditor, {
|
|
662
638
|
id,
|
|
663
639
|
role,
|
|
@@ -668,22 +644,19 @@ var MarkdownContainer = ({ id, role, object, settings, selectionManager, viewMod
|
|
|
668
644
|
inputMode: settings.editorInputMode,
|
|
669
645
|
scrollPastEnd,
|
|
670
646
|
onViewModeChange,
|
|
671
|
-
onLinkQuery: space ?
|
|
672
|
-
}) : (
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
onLinkQuery: space ? onLinkQuery : void 0
|
|
685
|
-
})
|
|
686
|
-
);
|
|
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
|
+
});
|
|
687
660
|
return /* @__PURE__ */ React3.createElement(React3.Fragment, null, editor, previewBlocks.map(({ link, el }) => /* @__PURE__ */ React3.createElement(PreviewBlock, {
|
|
688
661
|
key: link.ref,
|
|
689
662
|
link,
|
|
@@ -696,11 +669,9 @@ var MarkdownContainer = ({ id, role, object, settings, selectionManager, viewMod
|
|
|
696
669
|
var PreviewBlock = ({ link, el }) => {
|
|
697
670
|
var _effect = _useSignals2();
|
|
698
671
|
try {
|
|
699
|
-
const
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
const space = useSpace(echoDXN?.spaceId);
|
|
703
|
-
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;
|
|
704
675
|
const data = useMemo4(() => ({
|
|
705
676
|
subject
|
|
706
677
|
}), [
|
|
@@ -774,6 +745,7 @@ var DocumentEditor = ({ id, document: doc, settings, viewMode, ...props }) => {
|
|
|
774
745
|
var MarkdownContainer_default = MarkdownContainer;
|
|
775
746
|
export {
|
|
776
747
|
DocumentEditor,
|
|
748
|
+
MarkdownContainer,
|
|
777
749
|
MarkdownContainer_default as default
|
|
778
750
|
};
|
|
779
|
-
//# sourceMappingURL=MarkdownContainer-
|
|
751
|
+
//# sourceMappingURL=MarkdownContainer-7GYMOJVT.mjs.map
|