@dxos/plugin-markdown 0.9.0 → 0.9.1-staging.ee54ba693a
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/neutral/{MarkdownArticle-LWT5RFFJ.mjs → MarkdownArticle-ZHBXH7YF.mjs} +5 -7
- package/dist/lib/neutral/MarkdownArticle-ZHBXH7YF.mjs.map +7 -0
- package/dist/lib/neutral/{MarkdownCard-TBLIRDBO.mjs → MarkdownCard-2HUXCGZP.mjs} +3 -3
- package/dist/lib/neutral/MarkdownCard-2HUXCGZP.mjs.map +7 -0
- package/dist/lib/neutral/MarkdownPlugin.mjs +8 -15
- package/dist/lib/neutral/MarkdownPlugin.mjs.map +3 -3
- package/dist/lib/neutral/MarkdownPlugin.node.mjs +4 -2
- package/dist/lib/neutral/MarkdownPlugin.node.mjs.map +3 -3
- package/dist/lib/neutral/MarkdownPlugin.workerd.mjs +6 -17
- package/dist/lib/neutral/MarkdownPlugin.workerd.mjs.map +4 -4
- package/dist/lib/neutral/MarkdownSettings-5VMOYMND.mjs +43 -0
- package/dist/lib/neutral/MarkdownSettings-5VMOYMND.mjs.map +7 -0
- package/dist/lib/neutral/{anchor-sort-UXN4RHFX.mjs → anchor-sort-QF7UDG2A.mjs} +4 -3
- package/dist/lib/neutral/anchor-sort-QF7UDG2A.mjs.map +7 -0
- package/dist/lib/neutral/capabilities/index.mjs +10 -16
- package/dist/lib/neutral/capabilities/index.mjs.map +3 -3
- package/dist/lib/neutral/capabilities/node.mjs +5 -3
- package/dist/lib/neutral/capabilities/node.mjs.map +3 -3
- package/dist/lib/neutral/chunk-2V6A5NDQ.mjs +8 -0
- package/dist/lib/neutral/{operation-handler-2ARMPBGZ.mjs → chunk-ANHHOTCD.mjs} +3 -4
- package/dist/lib/neutral/{operation-handler-2ARMPBGZ.mjs.map → chunk-ANHHOTCD.mjs.map} +1 -1
- package/dist/lib/neutral/chunk-CNYFGIDS.mjs +32 -0
- package/dist/lib/neutral/chunk-CNYFGIDS.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-LXNSKCPD.mjs → chunk-EV4ZOL4P.mjs} +12 -11
- package/dist/lib/neutral/chunk-EV4ZOL4P.mjs.map +7 -0
- package/dist/lib/neutral/chunk-OC3JD73N.mjs +43 -0
- package/dist/lib/neutral/chunk-OC3JD73N.mjs.map +7 -0
- package/dist/lib/neutral/chunk-YJF6XOXX.mjs +175 -0
- package/dist/lib/neutral/chunk-YJF6XOXX.mjs.map +7 -0
- package/dist/lib/neutral/chunk-YMBC62S7.mjs +14 -0
- package/dist/lib/neutral/chunk-YMBC62S7.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-Y2LQRUU7.mjs → chunk-ZJ3GWRUJ.mjs} +24 -23
- package/dist/lib/neutral/chunk-ZJ3GWRUJ.mjs.map +7 -0
- package/dist/lib/neutral/{comment-config-EGY7RPPW.mjs → comment-config-M5OGFULS.mjs} +6 -4
- package/dist/lib/neutral/comment-config-M5OGFULS.mjs.map +7 -0
- package/dist/lib/neutral/components/index.mjs +19 -57
- package/dist/lib/neutral/components/index.mjs.map +4 -4
- package/dist/lib/neutral/containers/index.mjs +5 -3
- package/dist/lib/neutral/containers/index.mjs.map +3 -3
- package/dist/lib/neutral/{create-JK35XC4R.mjs → create-OQUMKL5I.mjs} +2 -2
- package/dist/lib/neutral/{create-markdown-7MLE625M.mjs → create-markdown-4O5FDA77.mjs} +2 -2
- package/dist/lib/neutral/{create-object-MU2LGXG6.mjs → create-object-RSEWTCMM.mjs} +2 -6
- package/dist/lib/neutral/create-object-RSEWTCMM.mjs.map +7 -0
- package/dist/lib/neutral/hooks/index.mjs +53 -23
- package/dist/lib/neutral/hooks/index.mjs.map +3 -3
- package/dist/lib/neutral/index.mjs +10 -16
- package/dist/lib/neutral/meta.json +1 -1
- package/dist/lib/neutral/meta.mjs +1 -1
- package/dist/lib/neutral/{open-5YC77C4O.mjs → open-BAZIRXII.mjs} +2 -2
- package/dist/lib/neutral/operation-handler-SDCXGMGK.mjs +8 -0
- package/dist/lib/neutral/operations/index.mjs +1 -1
- package/dist/lib/neutral/plugin.mjs +2 -2
- package/dist/lib/neutral/plugin.workerd.mjs +12 -0
- package/dist/lib/neutral/plugin.workerd.mjs.map +7 -0
- package/dist/lib/neutral/{react-surface-XYZJBKHZ.mjs → react-surface-37GL3UVG.mjs} +10 -15
- package/dist/lib/neutral/react-surface-37GL3UVG.mjs.map +7 -0
- package/dist/lib/neutral/{scroll-to-anchor-GAFB7W55.mjs → scroll-to-anchor-I6HFE5AH.mjs} +2 -2
- package/dist/lib/neutral/{set-view-mode-N7UHYMPG.mjs → set-view-mode-NY5OYYIM.mjs} +2 -2
- package/dist/lib/neutral/{settings-TDGDLCUR.mjs → settings-O6O6HT3I.mjs} +3 -3
- package/dist/lib/neutral/settings-O6O6HT3I.mjs.map +7 -0
- package/dist/lib/neutral/skill-definition-ET7BYY47.mjs +8 -0
- package/dist/lib/neutral/skill-definition-ET7BYY47.mjs.map +7 -0
- package/dist/lib/neutral/skills/index.mjs +8 -0
- package/dist/lib/neutral/skills/index.mjs.map +7 -0
- package/dist/lib/neutral/state-3BR7L6CW.mjs +69 -0
- package/dist/lib/neutral/state-3BR7L6CW.mjs.map +7 -0
- package/dist/lib/neutral/testing.mjs +2 -2
- package/dist/lib/neutral/testing.mjs.map +3 -3
- package/dist/lib/neutral/translations.mjs +1 -1
- package/dist/lib/neutral/translations.mjs.map +3 -3
- package/dist/lib/neutral/types/index.mjs +1 -1
- package/dist/lib/neutral/update-markdown-M4PTA6VS.mjs +24 -0
- package/dist/lib/neutral/update-markdown-M4PTA6VS.mjs.map +7 -0
- package/dist/types/dx.config.d.ts +28 -0
- package/dist/types/dx.config.d.ts.map +1 -0
- package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
- package/dist/types/src/MarkdownPlugin.node.d.ts.map +1 -1
- package/dist/types/src/MarkdownPlugin.workerd.d.ts.map +1 -1
- package/dist/types/src/capabilities/anchor-sort.d.ts +1 -2
- package/dist/types/src/capabilities/anchor-sort.d.ts.map +1 -1
- package/dist/types/src/capabilities/comment-config.d.ts +1 -2
- package/dist/types/src/capabilities/comment-config.d.ts.map +1 -1
- package/dist/types/src/capabilities/create-object.d.ts +1 -7
- package/dist/types/src/capabilities/create-object.d.ts.map +1 -1
- package/dist/types/src/capabilities/editor-view-state.d.ts +7 -0
- package/dist/types/src/capabilities/editor-view-state.d.ts.map +1 -0
- package/dist/types/src/capabilities/index.d.ts +7 -16
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/node.d.ts +2 -6
- package/dist/types/src/capabilities/node.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts +2 -2
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/settings.d.ts +1 -2
- package/dist/types/src/capabilities/settings.d.ts.map +1 -1
- package/dist/types/src/capabilities/skill-definition.d.ts +5 -0
- package/dist/types/src/capabilities/skill-definition.d.ts.map +1 -0
- package/dist/types/src/capabilities/state.d.ts +1 -2
- package/dist/types/src/capabilities/state.d.ts.map +1 -1
- package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts +2 -2
- package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts.map +1 -1
- package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +5 -6
- package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
- package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts +3 -2
- package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts.map +1 -1
- package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts +2 -2
- package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts.map +1 -1
- package/dist/types/src/components/PreviewComponent/PreviewComponent.d.ts +17 -0
- package/dist/types/src/components/PreviewComponent/PreviewComponent.d.ts.map +1 -0
- package/dist/types/src/components/PreviewComponent/index.d.ts +2 -0
- package/dist/types/src/components/PreviewComponent/index.d.ts.map +1 -0
- package/dist/types/src/components/index.d.ts +1 -2
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/containers/MarkdownArticle/MarkdownArticle.d.ts +6 -17
- package/dist/types/src/containers/MarkdownArticle/MarkdownArticle.d.ts.map +1 -1
- package/dist/types/src/containers/MarkdownArticle/MarkdownArticle.stories.d.ts.map +1 -1
- package/dist/types/src/{components → containers}/MarkdownSettings/MarkdownSettings.d.ts +1 -1
- package/dist/types/src/{components → containers}/MarkdownSettings/MarkdownSettings.d.ts.map +1 -1
- package/dist/types/src/{components → containers}/MarkdownSettings/MarkdownSettings.stories.d.ts.map +1 -1
- package/dist/types/src/{components → containers}/MarkdownSettings/index.d.ts.map +1 -1
- package/dist/types/src/containers/index.d.ts +1 -0
- package/dist/types/src/containers/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useExtensions.d.ts +5 -5
- package/dist/types/src/hooks/useExtensions.d.ts.map +1 -1
- package/dist/types/src/hooks/useLinkQuery.d.ts +2 -2
- package/dist/types/src/hooks/useLinkQuery.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -2
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +32 -2
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/operations/update-markdown.d.ts.map +1 -1
- package/dist/types/src/plugin.workerd.d.ts +2 -0
- package/dist/types/src/plugin.workerd.d.ts.map +1 -0
- package/dist/types/src/skills/index.d.ts +2 -0
- package/dist/types/src/skills/index.d.ts.map +1 -0
- package/dist/types/src/skills/markdown-skill.d.ts +4 -0
- package/dist/types/src/skills/markdown-skill.d.ts.map +1 -0
- package/dist/types/src/types/Markdown.d.ts +12 -20
- package/dist/types/src/types/Markdown.d.ts.map +1 -1
- package/dist/types/src/types/MarkdownCapabilities.d.ts.map +1 -1
- package/dist/types/src/types/MarkdownOperation.d.ts +5 -28
- package/dist/types/src/types/MarkdownOperation.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +2 -0
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dx.config.ts +31 -0
- package/package.json +67 -59
- package/src/MarkdownPlugin.node.ts +2 -1
- package/src/MarkdownPlugin.test.ts +1 -1
- package/src/MarkdownPlugin.tsx +7 -16
- package/src/MarkdownPlugin.workerd.ts +5 -2
- package/src/capabilities/anchor-sort.ts +3 -2
- package/src/capabilities/comment-config.ts +6 -9
- package/src/capabilities/create-object.ts +1 -4
- package/src/capabilities/editor-view-state.ts +28 -0
- package/src/capabilities/index.ts +2 -16
- package/src/capabilities/node.ts +1 -0
- package/src/capabilities/react-surface.tsx +29 -13
- package/src/capabilities/settings.ts +2 -2
- package/src/capabilities/skill-definition.ts +14 -0
- package/src/capabilities/state.ts +8 -4
- package/src/components/MarkdownEditor/FileUpload.tsx +2 -2
- package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +72 -30
- package/src/components/MarkdownEditor/MarkdownEditor.tsx +14 -40
- package/src/components/MarkdownEditor/MarkdownEditorContent.tsx +7 -6
- package/src/components/MarkdownEditor/MarkdownEditorToolbar.tsx +2 -2
- package/src/components/PreviewComponent/PreviewComponent.tsx +195 -0
- package/src/components/PreviewComponent/index.ts +5 -0
- package/src/components/index.ts +1 -4
- package/src/containers/MarkdownArticle/MarkdownArticle.stories.tsx +3 -4
- package/src/containers/MarkdownArticle/MarkdownArticle.tsx +6 -6
- package/src/containers/MarkdownCard/MarkdownCard.tsx +2 -2
- package/src/{components → containers}/MarkdownSettings/MarkdownSettings.stories.tsx +1 -1
- package/src/containers/MarkdownSettings/MarkdownSettings.tsx +54 -0
- package/src/containers/index.ts +1 -0
- package/src/hooks/useEditorMenuOptions.ts +2 -2
- package/src/hooks/useExtensions.tsx +42 -22
- package/src/hooks/useLinkQuery.ts +5 -3
- package/src/index.ts +1 -2
- package/src/meta.ts +2 -22
- package/src/operations/create.conversations.json +1 -1
- package/src/operations/create.test.ts +5 -12
- package/src/operations/update-markdown.ts +7 -27
- package/src/operations/update.conversations.json +1 -1
- package/src/operations/update.test.ts +86 -16
- package/src/plugin.workerd.ts +5 -0
- package/src/skills/index.ts +5 -0
- package/src/{blueprints/markdown-blueprint.ts → skills/markdown-skill.ts} +8 -7
- package/src/testing.ts +2 -2
- package/src/translations.ts +1 -1
- package/src/types/Markdown.ts +20 -19
- package/src/types/MarkdownCapabilities.ts +7 -5
- package/src/types/MarkdownEvents.ts +1 -1
- package/src/types/MarkdownOperation.ts +12 -6
- package/src/types/types.ts +2 -7
- package/dist/lib/neutral/MarkdownArticle-LWT5RFFJ.mjs.map +0 -7
- package/dist/lib/neutral/MarkdownCard-TBLIRDBO.mjs.map +0 -7
- package/dist/lib/neutral/MarkdownSettings-YCTZJL5V.mjs +0 -32
- package/dist/lib/neutral/MarkdownSettings-YCTZJL5V.mjs.map +0 -7
- package/dist/lib/neutral/anchor-sort-UXN4RHFX.mjs.map +0 -7
- package/dist/lib/neutral/app-graph-builder-BWBA23FF.mjs +0 -67
- package/dist/lib/neutral/app-graph-builder-BWBA23FF.mjs.map +0 -7
- package/dist/lib/neutral/app-graph-serializer-EN5E3BMG.mjs +0 -56
- package/dist/lib/neutral/app-graph-serializer-EN5E3BMG.mjs.map +0 -7
- package/dist/lib/neutral/blueprint-definition-DSPXK77L.mjs +0 -15
- package/dist/lib/neutral/blueprint-definition-DSPXK77L.mjs.map +0 -7
- package/dist/lib/neutral/blueprints/index.mjs +0 -8
- package/dist/lib/neutral/chunk-36QFEVOZ.mjs +0 -30
- package/dist/lib/neutral/chunk-36QFEVOZ.mjs.map +0 -7
- package/dist/lib/neutral/chunk-67DKWOKF.mjs +0 -10
- package/dist/lib/neutral/chunk-67DKWOKF.mjs.map +0 -7
- package/dist/lib/neutral/chunk-CIJD7P6X.mjs +0 -8
- package/dist/lib/neutral/chunk-LXNSKCPD.mjs.map +0 -7
- package/dist/lib/neutral/chunk-Y2LQRUU7.mjs.map +0 -7
- package/dist/lib/neutral/comment-config-EGY7RPPW.mjs.map +0 -7
- package/dist/lib/neutral/create-object-MU2LGXG6.mjs.map +0 -7
- package/dist/lib/neutral/navigation-resolver-3KBOMN4U.mjs +0 -14
- package/dist/lib/neutral/navigation-resolver-3KBOMN4U.mjs.map +0 -7
- package/dist/lib/neutral/react-surface-XYZJBKHZ.mjs.map +0 -7
- package/dist/lib/neutral/settings-TDGDLCUR.mjs.map +0 -7
- package/dist/lib/neutral/state-5COCF5PN.mjs +0 -44
- package/dist/lib/neutral/state-5COCF5PN.mjs.map +0 -7
- package/dist/lib/neutral/update-markdown-NNINDDV5.mjs +0 -44
- package/dist/lib/neutral/update-markdown-NNINDDV5.mjs.map +0 -7
- package/dist/types/src/blueprints/index.d.ts +0 -2
- package/dist/types/src/blueprints/index.d.ts.map +0 -1
- package/dist/types/src/blueprints/markdown-blueprint.d.ts +0 -4
- package/dist/types/src/blueprints/markdown-blueprint.d.ts.map +0 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -6
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
- package/dist/types/src/capabilities/app-graph-serializer.d.ts +0 -5
- package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +0 -1
- package/dist/types/src/capabilities/blueprint-definition.d.ts +0 -6
- package/dist/types/src/capabilities/blueprint-definition.d.ts.map +0 -1
- package/dist/types/src/capabilities/navigation-resolver.d.ts +0 -6
- package/dist/types/src/capabilities/navigation-resolver.d.ts.map +0 -1
- package/dist/types/src/paths.d.ts +0 -3
- package/dist/types/src/paths.d.ts.map +0 -1
- package/src/blueprints/index.ts +0 -5
- package/src/capabilities/app-graph-builder.ts +0 -63
- package/src/capabilities/app-graph-serializer.ts +0 -64
- package/src/capabilities/blueprint-definition.ts +0 -19
- package/src/capabilities/navigation-resolver.ts +0 -19
- package/src/components/MarkdownSettings/MarkdownSettings.tsx +0 -35
- package/src/paths.ts +0 -11
- /package/dist/lib/neutral/{chunk-CIJD7P6X.mjs.map → chunk-2V6A5NDQ.mjs.map} +0 -0
- /package/dist/lib/neutral/{create-JK35XC4R.mjs.map → create-OQUMKL5I.mjs.map} +0 -0
- /package/dist/lib/neutral/{create-markdown-7MLE625M.mjs.map → create-markdown-4O5FDA77.mjs.map} +0 -0
- /package/dist/lib/neutral/{open-5YC77C4O.mjs.map → open-BAZIRXII.mjs.map} +0 -0
- /package/dist/lib/neutral/{blueprints/index.mjs.map → operation-handler-SDCXGMGK.mjs.map} +0 -0
- /package/dist/lib/neutral/{scroll-to-anchor-GAFB7W55.mjs.map → scroll-to-anchor-I6HFE5AH.mjs.map} +0 -0
- /package/dist/lib/neutral/{set-view-mode-N7UHYMPG.mjs.map → set-view-mode-NY5OYYIM.mjs.map} +0 -0
- /package/dist/types/src/{components → containers}/MarkdownSettings/MarkdownSettings.stories.d.ts +0 -0
- /package/dist/types/src/{components → containers}/MarkdownSettings/index.d.ts +0 -0
- /package/src/{components → containers}/MarkdownSettings/index.ts +0 -0
|
@@ -1,17 +1,12 @@
|
|
|
1
|
+
import {
|
|
2
|
+
PreviewComponent
|
|
3
|
+
} from "../chunk-YJF6XOXX.mjs";
|
|
1
4
|
import "../chunk-J5LGTIGS.mjs";
|
|
2
5
|
|
|
3
|
-
// src/components/index.ts
|
|
4
|
-
import { lazy } from "react";
|
|
5
|
-
|
|
6
6
|
// src/components/MarkdownEditor/MarkdownEditor.tsx
|
|
7
7
|
import { createContext } from "@radix-ui/react-context";
|
|
8
8
|
import React4, { useCallback as useCallback3, useMemo as useMemo2, useState as useState2 } from "react";
|
|
9
9
|
import { createPortal as createPortal2 } from "react-dom";
|
|
10
|
-
import { Surface } from "@dxos/app-framework/ui";
|
|
11
|
-
import { AppSurface } from "@dxos/app-toolkit/ui";
|
|
12
|
-
import { Obj } from "@dxos/echo";
|
|
13
|
-
import { URI } from "@dxos/keys";
|
|
14
|
-
import { useClient } from "@dxos/react-client";
|
|
15
10
|
import { composable as composable2, composableProps as composableProps2 } from "@dxos/react-ui";
|
|
16
11
|
import { createEditorController, useEditorContext } from "@dxos/react-ui-editor";
|
|
17
12
|
import { isNonNullable } from "@dxos/util";
|
|
@@ -21,15 +16,16 @@ import { useEditorMenuOptions, useExtensions } from "#hooks";
|
|
|
21
16
|
import { RegistryContext } from "@effect-atom/atom-react";
|
|
22
17
|
import React, { forwardRef, useCallback, useContext, useEffect, useImperativeHandle, useMemo } from "react";
|
|
23
18
|
import { useCapabilities } from "@dxos/app-framework/ui";
|
|
19
|
+
import { AppSurface } from "@dxos/app-toolkit/ui";
|
|
24
20
|
import { useThemeContext, useTranslation } from "@dxos/react-ui";
|
|
25
21
|
import { useTextEditor } from "@dxos/react-ui-editor";
|
|
26
|
-
import {
|
|
22
|
+
import { createBasicExtensions, createMarkdownExtensions, createThemeExtensions, documentSlots, dropFile, editorClassNames, formattingListener, mobileSlots, processEditorPayload, scrollbarAutohide } from "@dxos/ui-editor";
|
|
27
23
|
import { mx } from "@dxos/ui-theme";
|
|
28
24
|
import { isTruthy } from "@dxos/util";
|
|
29
25
|
import { meta } from "#meta";
|
|
30
26
|
import { MarkdownCapabilities } from "#types";
|
|
31
27
|
var MarkdownEditorContent = /* @__PURE__ */ forwardRef(({ classNames, id, attendableId, role, compact, viewMode, initialValue, editorStateStore, toolbarState, extensions, slots, onFileUpload }, forwardedRef) => {
|
|
32
|
-
const { t } = useTranslation(meta.
|
|
28
|
+
const { t } = useTranslation(meta.profile.key);
|
|
33
29
|
const { themeMode } = useThemeContext();
|
|
34
30
|
const registry = useContext(RegistryContext);
|
|
35
31
|
const updateToolbarState = useCallback((formatting) => {
|
|
@@ -47,7 +43,7 @@ var MarkdownEditorContent = /* @__PURE__ */ forwardRef(({ classNames, id, attend
|
|
|
47
43
|
id
|
|
48
44
|
]);
|
|
49
45
|
const { parentRef, view: editorView, focusAttributes } = useTextEditor(() => ({
|
|
50
|
-
...role !==
|
|
46
|
+
...role !== AppSurface.Section.role && {
|
|
51
47
|
id,
|
|
52
48
|
scrollTo,
|
|
53
49
|
selection,
|
|
@@ -69,7 +65,7 @@ var MarkdownEditorContent = /* @__PURE__ */ forwardRef(({ classNames, id, attend
|
|
|
69
65
|
createMarkdownExtensions(),
|
|
70
66
|
scrollbarAutohide(),
|
|
71
67
|
toolbarState && formattingListener(updateToolbarState),
|
|
72
|
-
role !==
|
|
68
|
+
role !== AppSurface.Section.role && onFileUpload && dropFile({
|
|
73
69
|
// TODO(wittjosiah): Factor out to file uploader plugin.
|
|
74
70
|
onDrop: async (view, { files }) => {
|
|
75
71
|
const file = files[0];
|
|
@@ -221,22 +217,8 @@ var MarkdownEditorToolbar = composable(({ id, role, getView, customActions, onAc
|
|
|
221
217
|
|
|
222
218
|
// src/components/MarkdownEditor/MarkdownEditor.tsx
|
|
223
219
|
var [MarkdownEditorContextProvider, useMarkdownEditorContext] = createContext("MarkdownEditor.Context");
|
|
224
|
-
var MarkdownEditorProvider = ({ children, id, attendableId, object, settings, compact, viewMode,
|
|
225
|
-
const [
|
|
226
|
-
const previewOptions = useMemo2(() => ({
|
|
227
|
-
db: Obj.isObject(object) ? Obj.getDatabase(object) : void 0,
|
|
228
|
-
addBlockContainer: (block) => {
|
|
229
|
-
setPreviewBlocks((prev) => [
|
|
230
|
-
...prev,
|
|
231
|
-
block
|
|
232
|
-
]);
|
|
233
|
-
},
|
|
234
|
-
removeBlockContainer: ({ link }) => {
|
|
235
|
-
setPreviewBlocks((prev) => prev.filter(({ link: prevLink }) => prevLink.dxn !== link.dxn));
|
|
236
|
-
}
|
|
237
|
-
}), [
|
|
238
|
-
object
|
|
239
|
-
]);
|
|
220
|
+
var MarkdownEditorProvider = ({ children, id, attendableId, object, settings, compact, viewMode, viewState, editorStateStore, extensions: extensionsProp, slashCommandGroups, onLinkQuery, onSelectObject, onAction, onFileUpload, onViewModeChange }) => {
|
|
221
|
+
const [widgets, setWidgets] = useState2([]);
|
|
240
222
|
const menuOptions = useEditorMenuOptions({
|
|
241
223
|
slashCommandGroups,
|
|
242
224
|
onLinkQuery
|
|
@@ -246,9 +228,9 @@ var MarkdownEditorProvider = ({ children, id, attendableId, object, settings, co
|
|
|
246
228
|
object,
|
|
247
229
|
compact,
|
|
248
230
|
viewMode,
|
|
249
|
-
|
|
231
|
+
viewState,
|
|
250
232
|
editorStateStore,
|
|
251
|
-
|
|
233
|
+
setWidgets,
|
|
252
234
|
settings,
|
|
253
235
|
onSelectObject
|
|
254
236
|
});
|
|
@@ -281,7 +263,7 @@ var MarkdownEditorProvider = ({ children, id, attendableId, object, settings, co
|
|
|
281
263
|
attendableId,
|
|
282
264
|
compact,
|
|
283
265
|
viewMode,
|
|
284
|
-
|
|
266
|
+
widgets,
|
|
285
267
|
onAction,
|
|
286
268
|
onFileUpload,
|
|
287
269
|
onViewModeChange
|
|
@@ -290,7 +272,7 @@ var MarkdownEditorProvider = ({ children, id, attendableId, object, settings, co
|
|
|
290
272
|
attendableId,
|
|
291
273
|
compact,
|
|
292
274
|
viewMode,
|
|
293
|
-
|
|
275
|
+
widgets,
|
|
294
276
|
onAction,
|
|
295
277
|
onFileUpload,
|
|
296
278
|
onViewModeChange
|
|
@@ -339,40 +321,20 @@ var MarkdownEditorToolbar2 = (props) => {
|
|
|
339
321
|
MarkdownEditorToolbar2.displayName = MARKDOWN_EDITOR_TOOLBAR_NAME;
|
|
340
322
|
var MARKDOWN_EDITOR_BLOCKS_NAME = "MarkdownEditor.Blocks";
|
|
341
323
|
var MarkdownEditorBlocks = (_props) => {
|
|
342
|
-
const {
|
|
343
|
-
return /* @__PURE__ */ React4.createElement(React4.Fragment, null,
|
|
344
|
-
key:
|
|
345
|
-
|
|
346
|
-
el
|
|
347
|
-
})));
|
|
324
|
+
const { widgets } = useMarkdownEditorContext(MARKDOWN_EDITOR_BLOCKS_NAME);
|
|
325
|
+
return /* @__PURE__ */ React4.createElement(React4.Fragment, null, widgets.map(({ id, root, Component, props }) => /* @__PURE__ */ React4.createElement("div", {
|
|
326
|
+
key: id
|
|
327
|
+
}, /* @__PURE__ */ createPortal2(/* @__PURE__ */ React4.createElement(Component, props), root))));
|
|
348
328
|
};
|
|
349
329
|
MarkdownEditorBlocks.displayName = MARKDOWN_EDITOR_BLOCKS_NAME;
|
|
350
|
-
var PreviewBlock = ({ el, link }) => {
|
|
351
|
-
const client = useClient();
|
|
352
|
-
const dxn = URI.make(link.dxn);
|
|
353
|
-
const subject = client.graph.makeRef(dxn).target;
|
|
354
|
-
const data = useMemo2(() => ({
|
|
355
|
-
subject
|
|
356
|
-
}), [
|
|
357
|
-
subject
|
|
358
|
-
]);
|
|
359
|
-
return /* @__PURE__ */ createPortal2(/* @__PURE__ */ React4.createElement(Surface.Surface, {
|
|
360
|
-
type: AppSurface.Card,
|
|
361
|
-
data,
|
|
362
|
-
limit: 1
|
|
363
|
-
}), el);
|
|
364
|
-
};
|
|
365
330
|
var MarkdownEditor = {
|
|
366
331
|
Content: MarkdownEditorContent2,
|
|
367
332
|
Toolbar: MarkdownEditorToolbar2,
|
|
368
333
|
Blocks: MarkdownEditorBlocks
|
|
369
334
|
};
|
|
370
|
-
|
|
371
|
-
// src/components/index.ts
|
|
372
|
-
var MarkdownSettings = lazy(() => import("../MarkdownSettings-YCTZJL5V.mjs"));
|
|
373
335
|
export {
|
|
374
336
|
MarkdownEditor,
|
|
375
337
|
MarkdownEditorProvider,
|
|
376
|
-
|
|
338
|
+
PreviewComponent
|
|
377
339
|
};
|
|
378
340
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/components/
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type ComponentType, lazy } from 'react';\n\nexport * from './MarkdownEditor';\n\nexport const MarkdownSettings: ComponentType<any> = lazy(() => import('./MarkdownSettings'));\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Extension } from '@codemirror/state';\nimport { type EditorView } from '@codemirror/view';\nimport { type Atom } from '@effect-atom/atom-react';\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type ReactNode, useCallback, useMemo, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { AppSurface } from '@dxos/app-toolkit/ui';\nimport { Obj } from '@dxos/echo';\nimport { URI } from '@dxos/keys';\nimport { useClient } from '@dxos/react-client';\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { composable, composableProps } from '@dxos/react-ui';\nimport {\n type EditorRootProps,\n type EditorToolbarState,\n createEditorController,\n useEditorContext,\n} from '@dxos/react-ui-editor';\nimport { type PreviewBlock, type PreviewOptions } from '@dxos/ui-editor';\nimport { isNonNullable } from '@dxos/util';\n\nimport {\n type DocumentType,\n type ExtensionsOptions,\n type UseEditorMenuOptionsProps,\n useEditorMenuOptions,\n useExtensions,\n} from '#hooks';\n\nimport {\n MarkdownEditorContent as NaturalMarkdownEditorContent,\n type MarkdownEditorContentProps as NaturalMarkdownEditorContentProps,\n} from './MarkdownEditorContent';\nimport {\n MarkdownEditorToolbar as NaturalMarkdownToolbar,\n type MarkdownEditorToolbarProps as NaturalMarkdownToolbarProps,\n} from './MarkdownEditorToolbar';\n\n//\n// Context\n//\n\ntype MarkdownEditorContextValue = {\n id: string;\n attendableId?: string;\n previewBlocks: PreviewBlock[];\n} & Pick<ExtensionsOptions, 'compact' | 'viewMode'> &\n Pick<NaturalMarkdownToolbarProps, 'onAction' | 'onFileUpload' | 'onViewModeChange'>;\n\nconst [MarkdownEditorContextProvider, useMarkdownEditorContext] =\n createContext<MarkdownEditorContextValue>('MarkdownEditor.Context');\n\n/**\n * Props to spread onto `Editor.Root` from `MarkdownEditorProvider`'s render callback.\n */\nexport type MarkdownEditorEditorRootProps = Omit<EditorRootProps, 'children'>;\n\n//\n// MarkdownEditorProvider\n//\n\nexport type MarkdownEditorProviderProps = {\n object?: DocumentType;\n extensions?: Extension[];\n children: (editorRootProps: MarkdownEditorEditorRootProps) => ReactNode;\n} & Pick<\n MarkdownEditorContextValue,\n 'id' | 'attendableId' | 'viewMode' | 'compact' | 'onAction' | 'onFileUpload' | 'onViewModeChange'\n> &\n Pick<UseEditorMenuOptionsProps, 'slashCommandGroups' | 'onLinkQuery'> &\n Pick<ExtensionsOptions, 'editorStateStore' | 'selectionManager' | 'settings' | 'onSelectObject'>;\n\nexport const MarkdownEditorProvider = ({\n children,\n id,\n attendableId,\n object,\n settings,\n compact,\n viewMode,\n selectionManager,\n editorStateStore,\n extensions: extensionsProp,\n slashCommandGroups,\n onLinkQuery,\n onSelectObject,\n onAction,\n onFileUpload,\n onViewModeChange,\n}: MarkdownEditorProviderProps) => {\n // Preview blocks.\n const [previewBlocks, setPreviewBlocks] = useState<PreviewBlock[]>([]);\n const previewOptions = useMemo<PreviewOptions>(\n () => ({\n db: Obj.isObject(object) ? Obj.getDatabase(object) : undefined,\n addBlockContainer: (block) => {\n setPreviewBlocks((prev) => [...prev, block]);\n },\n removeBlockContainer: ({ link }) => {\n setPreviewBlocks((prev) => prev.filter(({ link: prevLink }) => prevLink.dxn !== link.dxn));\n },\n }),\n [object],\n );\n\n // Context menu options (Editor.Root calls useEditorMenu with these props).\n const menuOptions = useEditorMenuOptions({ slashCommandGroups, onLinkQuery });\n\n // Core markdown extensions (popover/menu extension is added by Editor.Root).\n const coreExtensions = useExtensions({\n id,\n object,\n compact,\n viewMode,\n selectionManager,\n editorStateStore,\n previewOptions,\n settings,\n onSelectObject,\n });\n\n const extensions = useMemo(\n () => [coreExtensions, extensionsProp].filter(isNonNullable).flat(),\n [coreExtensions, extensionsProp],\n );\n\n const editorRootProps = useMemo<MarkdownEditorEditorRootProps>(\n () => ({\n extensions,\n viewMode,\n getMenu: menuOptions.getMenu,\n trigger: menuOptions.trigger,\n placeholder: menuOptions.placeholder,\n ...(menuOptions.filter !== undefined ? { filter: menuOptions.filter } : {}),\n ...(menuOptions.triggerKey !== undefined ? { triggerKey: menuOptions.triggerKey } : {}),\n }),\n [extensions, viewMode, menuOptions],\n );\n\n const markdownContextValue = useMemo<MarkdownEditorContextValue>(\n () => ({\n id,\n attendableId,\n compact,\n viewMode,\n previewBlocks,\n onAction,\n onFileUpload,\n onViewModeChange,\n }),\n [id, attendableId, compact, viewMode, previewBlocks, onAction, onFileUpload, onViewModeChange],\n );\n\n return (\n <MarkdownEditorContextProvider {...markdownContextValue}>{children(editorRootProps)}</MarkdownEditorContextProvider>\n );\n};\n\nMarkdownEditorProvider.displayName = 'MarkdownEditor.Provider';\n\n//\n// MarkdownEditor.Content\n//\n\nconst MARKDOWN_EDITOR_CONTENT_NAME = 'MarkdownEditor.Content';\n\ntype MarkdownEditorContentProps = Omit<NaturalMarkdownEditorContentProps, 'id' | 'extensions' | 'toolbarState'>;\n\nconst MarkdownEditorContent = composable<HTMLDivElement, MarkdownEditorContentProps>(\n ({ compact: compactProp, ...props }, _forwardedRef) => {\n const {\n id,\n attendableId,\n compact = compactProp,\n viewMode,\n onFileUpload,\n } = useMarkdownEditorContext(MARKDOWN_EDITOR_CONTENT_NAME);\n const { extensions, setController, state } = useEditorContext(MARKDOWN_EDITOR_CONTENT_NAME);\n\n const handleRef = useCallback(\n (view: EditorView | null) => {\n setController(createEditorController(view));\n },\n [setController],\n );\n\n return (\n <NaturalMarkdownEditorContent\n {...composableProps(props)}\n id={id}\n attendableId={attendableId}\n compact={compact}\n viewMode={viewMode}\n toolbarState={state as Atom.Writable<EditorToolbarState>}\n extensions={extensions}\n onFileUpload={onFileUpload}\n ref={handleRef}\n />\n );\n },\n);\n\nMarkdownEditorContent.displayName = MARKDOWN_EDITOR_CONTENT_NAME;\n\n//\n// MarkdownEditor.Toolbar\n//\n\nconst MARKDOWN_EDITOR_TOOLBAR_NAME = 'MarkdownEditor.Toolbar';\n\ntype MarkdownEditorToolbarProps = ThemedClassName<\n Omit<NaturalMarkdownToolbarProps, 'getView' | 'onAction' | 'onFileUpload' | 'onViewModeChange' | 'id'>\n>;\n\nconst MarkdownEditorToolbar = (props: MarkdownEditorToolbarProps) => {\n const { id, attendableId, onAction, onFileUpload, onViewModeChange } =\n useMarkdownEditorContext(MARKDOWN_EDITOR_TOOLBAR_NAME);\n\n const { controller } = useEditorContext(MARKDOWN_EDITOR_TOOLBAR_NAME);\n\n // Stable getter identity (changes only when the controller does) so the FileUpload effect, whose\n // deps include `getView`, does not re-run every render and re-upload the same file.\n const getView = useCallback(() => controller?.view ?? null, [controller]);\n\n return (\n <NaturalMarkdownToolbar\n {...props}\n id={attendableId ?? id}\n getView={getView}\n onAction={onAction}\n onFileUpload={onFileUpload}\n onViewModeChange={onViewModeChange}\n />\n );\n};\n\nMarkdownEditorToolbar.displayName = MARKDOWN_EDITOR_TOOLBAR_NAME;\n\n//\n// MarkdownEditor.Blocks (embedded objects)\n//\n\nconst MARKDOWN_EDITOR_BLOCKS_NAME = 'MarkdownEditor.Blocks';\n\ntype MarkdownEditorBlocksProps = {};\n\nconst MarkdownEditorBlocks = (_props: MarkdownEditorBlocksProps) => {\n const { previewBlocks } = useMarkdownEditorContext(MARKDOWN_EDITOR_BLOCKS_NAME);\n\n return (\n <>\n {previewBlocks.map(({ link, el }) => (\n <PreviewBlock key={link.dxn} link={link} el={el} />\n ))}\n </>\n );\n};\n\nMarkdownEditorBlocks.displayName = MARKDOWN_EDITOR_BLOCKS_NAME;\n\nconst PreviewBlock = ({ el, link }: PreviewBlock) => {\n const client = useClient();\n const dxn = URI.make(link.dxn);\n const subject = client.graph.makeRef(dxn).target;\n const data = useMemo(() => ({ subject }), [subject]);\n\n return createPortal(<Surface.Surface type={AppSurface.Card} data={data} limit={1} />, el);\n};\n\n//\n// MarkdownEditor\n//\n\n/** @private */\nexport const MarkdownEditor = {\n Content: MarkdownEditorContent,\n Toolbar: MarkdownEditorToolbar,\n Blocks: MarkdownEditorBlocks,\n};\n\nexport type { MarkdownEditorContentProps, MarkdownEditorToolbarProps, MarkdownEditorBlocksProps };\n\n/** @deprecated Use `MarkdownEditorProviderProps`. */\nexport type MarkdownEditorRootProps = MarkdownEditorProviderProps;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\nimport { type Atom, RegistryContext } from '@effect-atom/atom-react';\nimport React, { forwardRef, useCallback, useContext, useEffect, useImperativeHandle, useMemo } from 'react';\n\nimport { useCapabilities } from '@dxos/app-framework/ui';\nimport { type ThemedClassName, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport {\n type EditorMenuGroup,\n type EditorToolbarState,\n type UseTextEditorProps,\n useTextEditor,\n} from '@dxos/react-ui-editor';\nimport {\n type EditorSelectionState,\n type EditorStateStore,\n type ThemeExtensionsOptions,\n mobileSlots,\n createBasicExtensions,\n createMarkdownExtensions,\n createThemeExtensions,\n dropFile,\n documentSlots,\n formattingListener,\n processEditorPayload,\n editorClassNames,\n scrollbarAutohide,\n} from '@dxos/ui-editor';\nimport { type EditorViewMode } from '@dxos/ui-editor/types';\nimport { mx } from '@dxos/ui-theme';\nimport { isTruthy } from '@dxos/util';\n\nimport { meta } from '#meta';\nimport { MarkdownCapabilities } from '#types';\n\nimport { type MarkdownEditorToolbarProps } from './MarkdownEditorToolbar';\n\nexport type MarkdownEditorContentProps = ThemedClassName<{\n id: string;\n attendableId?: string;\n role?: string;\n compact?: boolean;\n viewMode?: EditorViewMode;\n slashCommandGroups?: EditorMenuGroup[];\n editorStateStore?: EditorStateStore;\n toolbarState?: Atom.Writable<EditorToolbarState>;\n onLinkQuery?: (query?: string) => Promise<EditorMenuGroup[]>;\n}> &\n Pick<UseTextEditorProps, 'initialValue' | 'extensions'> &\n Pick<MarkdownEditorToolbarProps, 'onFileUpload'> &\n Pick<ThemeExtensionsOptions, 'slots'>;\n\n// TODO(burdon): Move controller to Root.\nexport const MarkdownEditorContent = forwardRef<EditorView | null, MarkdownEditorContentProps>(\n (\n {\n classNames,\n id,\n attendableId,\n role,\n compact,\n viewMode,\n initialValue,\n editorStateStore,\n toolbarState,\n extensions,\n slots,\n onFileUpload,\n },\n forwardedRef,\n ) => {\n const { t } = useTranslation(meta.id);\n const { themeMode } = useThemeContext();\n const registry = useContext(RegistryContext);\n\n // Callback to update toolbar state atom.\n const updateToolbarState = useCallback(\n (formatting: EditorToolbarState) => {\n if (toolbarState) {\n registry.set(toolbarState, { ...registry.get(toolbarState), ...formatting });\n }\n },\n [registry, toolbarState],\n );\n\n // Restore last selection and scroll point.\n const { scrollTo, selection } = useMemo<EditorSelectionState>(() => editorStateStore?.getState(id) ?? {}, [id]);\n\n const {\n parentRef,\n view: editorView,\n focusAttributes,\n } = useTextEditor(\n () => ({\n ...(role !== 'section' && {\n id,\n scrollTo,\n selection,\n selectionEnd: true,\n }),\n initialValue,\n extensions: [\n createBasicExtensions({\n readOnly: viewMode === 'readonly',\n placeholder: t('editor.placeholder'),\n scrollPastEnd: !compact,\n search: true,\n }),\n createThemeExtensions({\n themeMode,\n slots: slots ?? (compact ? mobileSlots : documentSlots),\n syntaxHighlighting: true,\n }),\n createMarkdownExtensions(),\n scrollbarAutohide(),\n toolbarState && formattingListener(updateToolbarState),\n role !== 'section' &&\n onFileUpload &&\n dropFile({\n // TODO(wittjosiah): Factor out to file uploader plugin.\n onDrop: async (view, { files }) => {\n const file = files[0];\n const info = file && onFileUpload ? await onFileUpload(file) : undefined;\n if (info) {\n processEditorPayload(view, { type: 'image', data: info.url });\n }\n },\n }),\n extensions,\n ].filter(isTruthy),\n }),\n [id, viewMode, themeMode, extensions, compact],\n );\n\n useImperativeHandle<EditorView | null, EditorView | null>(forwardedRef, () => editorView, [editorView]);\n\n const [editorViewRegistry] = useCapabilities(MarkdownCapabilities.EditorViews);\n useEffect(() => {\n if (editorView && editorViewRegistry) {\n editorViewRegistry.register(attendableId ?? id, editorView, id);\n return () => editorViewRegistry.unregister(attendableId ?? id);\n }\n }, [editorView, editorViewRegistry, attendableId, id]);\n\n useTest(editorView);\n\n return (\n <div\n {...focusAttributes}\n className={mx(editorClassNames(role), classNames)}\n data-testid='composer.markdownRoot'\n data-popover-collision-boundary={true}\n ref={parentRef}\n />\n );\n },\n);\n\n// Expose editor view for playwright tests.\n// TODO(wittjosiah): Find a better way to expose this or find a way to limit it to test runs.\nconst useTest = (view: EditorView | null) => {\n useEffect(() => {\n const composer = (window as any).composer;\n if (composer) {\n composer.editorView = view;\n }\n }, [view]);\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\nimport React, { useCallback, useState } from 'react';\n\nimport { type FileInfo } from '@dxos/app-toolkit';\nimport { composable, composableProps } from '@dxos/react-ui';\nimport { Editor, type EditorToolbarProps } from '@dxos/react-ui-editor';\n\nimport { FileUpload, type FileUploadAction } from './FileUpload';\n\nexport type MarkdownEditorToolbarProps = {\n id: string;\n // Provided as a getter (not a value prop) so the live `EditorView` is never carried in a React prop\n // that React 19.2's dev render-logger would walk into a cross-origin frame. See\n // `react-ui-editor/.../controller.ts` for the full rationale.\n getView?: () => EditorView | null;\n onFileUpload?: (file: File) => Promise<FileInfo | undefined>;\n} & Pick<EditorToolbarProps, 'role' | 'customActions' | 'onAction' | 'onViewModeChange'>;\n\nexport const MarkdownEditorToolbar = composable<HTMLDivElement, MarkdownEditorToolbarProps>(\n ({ id, role, getView, customActions, onAction, onFileUpload, onViewModeChange, ...props }, forwardedRef) => {\n const { className, ...rest } = composableProps(props);\n const [upload, setUpload] = useState<FileUploadAction | null>(null);\n const uploadRef = useCallback((next: FileUploadAction) => setUpload(() => next), []);\n\n if (!getView?.()) {\n return <div className={className} {...rest} ref={forwardedRef} />;\n }\n\n return (\n <div className='contents' ref={forwardedRef}>\n <Editor.Toolbar\n {...rest}\n classNames={className}\n attendableId={id}\n role={role}\n customActions={customActions}\n onAction={onAction}\n onImageUpload={upload ?? undefined}\n onViewModeChange={onViewModeChange}\n />\n\n {onFileUpload && <FileUpload ref={uploadRef} getView={getView} onFileUpload={onFileUpload} />}\n </div>\n );\n },\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\nimport React, { forwardRef, useEffect, useImperativeHandle } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useDropzone } from 'react-dropzone';\n\nimport { type FileInfo } from '@dxos/app-toolkit';\nimport { addLink } from '@dxos/ui-editor';\n\nexport const IMAGE_FILES = ['.jpg', '.jpeg', '.png', '.gif'];\n\nexport type FileUploadAction = () => void;\n\nexport type FileUploadProps = {\n // Provided as a getter (not a value prop) so the live `EditorView` is never carried in a React prop\n // that React 19.2's dev render-logger would walk into a cross-origin frame. See\n // `react-ui-editor/.../controller.ts` for the full rationale.\n getView?: () => EditorView | null;\n onFileUpload?: (file: File) => Promise<FileInfo | undefined>;\n};\n\n// TODO(burdon): Factor out.\n// TODO(burdon): Move to root? (support drag into document via dropzone).\nexport const FileUpload = forwardRef<FileUploadAction, FileUploadProps>(({ getView, onFileUpload }, forwardedRef) => {\n // https://react-dropzone.js.org\n const { acceptedFiles, open, inputRef } = useDropzone({\n disabled: !onFileUpload,\n multiple: false,\n noDrag: true,\n accept: {\n 'image/*': IMAGE_FILES,\n },\n });\n\n useImperativeHandle(forwardedRef, () => open, []);\n\n useEffect(() => {\n if (acceptedFiles.length && onFileUpload) {\n requestAnimationFrame(async () => {\n const editorView = getView?.();\n if (!editorView) {\n return;\n }\n // NOTE: Clone file since react-dropzone patches in a non-standard `path` property, which confuses IPFS.\n const f = acceptedFiles[0];\n const file = new File([f], f.name, {\n type: f.type,\n lastModified: f.lastModified,\n });\n\n // TODO(burdon): Factor out.\n const info = await onFileUpload(file);\n if (info) {\n addLink({ url: info.url, image: true })(editorView);\n }\n });\n }\n }, [getView, acceptedFiles, onFileUpload]);\n\n if (!onFileUpload) {\n return null;\n }\n\n return <>{createPortal(<input ref={inputRef} />, document.body)} </>;\n});\n"],
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["
|
|
3
|
+
"sources": ["../../../../src/components/MarkdownEditor/MarkdownEditor.tsx", "../../../../src/components/MarkdownEditor/MarkdownEditorContent.tsx", "../../../../src/components/MarkdownEditor/MarkdownEditorToolbar.tsx", "../../../../src/components/MarkdownEditor/FileUpload.tsx"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type Extension } from '@codemirror/state';\nimport { type EditorView } from '@codemirror/view';\nimport { type Atom } from '@effect-atom/atom-react';\nimport { createContext } from '@radix-ui/react-context';\nimport React, { type ReactNode, useCallback, useMemo, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { composable, composableProps } from '@dxos/react-ui';\nimport {\n type EditorRootProps,\n type EditorToolbarState,\n createEditorController,\n useEditorContext,\n} from '@dxos/react-ui-editor';\nimport { type XmlWidgetState } from '@dxos/ui-editor';\nimport { isNonNullable } from '@dxos/util';\n\nimport {\n type DocumentType,\n type ExtensionsOptions,\n type UseEditorMenuOptionsProps,\n useEditorMenuOptions,\n useExtensions,\n} from '#hooks';\n\nimport {\n MarkdownEditorContent as NaturalMarkdownEditorContent,\n type MarkdownEditorContentProps as NaturalMarkdownEditorContentProps,\n} from './MarkdownEditorContent';\nimport {\n MarkdownEditorToolbar as NaturalMarkdownToolbar,\n type MarkdownEditorToolbarProps as NaturalMarkdownToolbarProps,\n} from './MarkdownEditorToolbar';\n\n//\n// Context\n//\n\ntype MarkdownEditorContextValue = {\n id: string;\n attendableId?: string;\n widgets: XmlWidgetState[];\n} & Pick<ExtensionsOptions, 'compact' | 'viewMode'> &\n Pick<NaturalMarkdownToolbarProps, 'onAction' | 'onFileUpload' | 'onViewModeChange'>;\n\nconst [MarkdownEditorContextProvider, useMarkdownEditorContext] =\n createContext<MarkdownEditorContextValue>('MarkdownEditor.Context');\n\n/**\n * Props to spread onto `Editor.Root` from `MarkdownEditorProvider`'s render callback.\n */\nexport type MarkdownEditorEditorRootProps = Omit<EditorRootProps, 'children'>;\n\n//\n// MarkdownEditorProvider\n//\n\nexport type MarkdownEditorProviderProps = {\n object?: DocumentType;\n extensions?: Extension[];\n children: (editorRootProps: MarkdownEditorEditorRootProps) => ReactNode;\n} & Pick<\n MarkdownEditorContextValue,\n 'id' | 'attendableId' | 'viewMode' | 'compact' | 'onAction' | 'onFileUpload' | 'onViewModeChange'\n> &\n Pick<UseEditorMenuOptionsProps, 'slashCommandGroups' | 'onLinkQuery'> &\n Pick<ExtensionsOptions, 'editorStateStore' | 'viewState' | 'settings' | 'onSelectObject'>;\n\nexport const MarkdownEditorProvider = ({\n children,\n id,\n attendableId,\n object,\n settings,\n compact,\n viewMode,\n viewState,\n editorStateStore,\n extensions: extensionsProp,\n slashCommandGroups,\n onLinkQuery,\n onSelectObject,\n onAction,\n onFileUpload,\n onViewModeChange,\n}: MarkdownEditorProviderProps) => {\n // Widget portals driven by xmlTags.\n const [widgets, setWidgets] = useState<XmlWidgetState[]>([]);\n\n // Context menu options (Editor.Root calls useEditorMenu with these props).\n const menuOptions = useEditorMenuOptions({ slashCommandGroups, onLinkQuery });\n\n // Core markdown extensions (popover/menu extension is added by Editor.Root).\n const coreExtensions = useExtensions({\n id,\n object,\n compact,\n viewMode,\n viewState,\n editorStateStore,\n setWidgets,\n settings,\n onSelectObject,\n });\n\n const extensions = useMemo(\n () => [coreExtensions, extensionsProp].filter(isNonNullable).flat(),\n [coreExtensions, extensionsProp],\n );\n\n const editorRootProps = useMemo<MarkdownEditorEditorRootProps>(\n () => ({\n extensions,\n viewMode,\n getMenu: menuOptions.getMenu,\n trigger: menuOptions.trigger,\n placeholder: menuOptions.placeholder,\n ...(menuOptions.filter !== undefined ? { filter: menuOptions.filter } : {}),\n ...(menuOptions.triggerKey !== undefined ? { triggerKey: menuOptions.triggerKey } : {}),\n }),\n [extensions, viewMode, menuOptions],\n );\n\n const markdownContextValue = useMemo<MarkdownEditorContextValue>(\n () => ({\n id,\n attendableId,\n compact,\n viewMode,\n widgets,\n onAction,\n onFileUpload,\n onViewModeChange,\n }),\n [id, attendableId, compact, viewMode, widgets, onAction, onFileUpload, onViewModeChange],\n );\n\n return (\n <MarkdownEditorContextProvider {...markdownContextValue}>{children(editorRootProps)}</MarkdownEditorContextProvider>\n );\n};\n\nMarkdownEditorProvider.displayName = 'MarkdownEditor.Provider';\n\n//\n// MarkdownEditor.Content\n//\n\nconst MARKDOWN_EDITOR_CONTENT_NAME = 'MarkdownEditor.Content';\n\ntype MarkdownEditorContentProps = Omit<NaturalMarkdownEditorContentProps, 'id' | 'extensions' | 'toolbarState'>;\n\nconst MarkdownEditorContent = composable<HTMLDivElement, MarkdownEditorContentProps>(\n ({ compact: compactProp, ...props }, _forwardedRef) => {\n const {\n id,\n attendableId,\n compact = compactProp,\n viewMode,\n onFileUpload,\n } = useMarkdownEditorContext(MARKDOWN_EDITOR_CONTENT_NAME);\n const { extensions, setController, state } = useEditorContext(MARKDOWN_EDITOR_CONTENT_NAME);\n\n const handleRef = useCallback(\n (view: EditorView | null) => {\n setController(createEditorController(view));\n },\n [setController],\n );\n\n return (\n <NaturalMarkdownEditorContent\n {...composableProps(props)}\n id={id}\n attendableId={attendableId}\n compact={compact}\n viewMode={viewMode}\n toolbarState={state as Atom.Writable<EditorToolbarState>}\n extensions={extensions}\n onFileUpload={onFileUpload}\n ref={handleRef}\n />\n );\n },\n);\n\nMarkdownEditorContent.displayName = MARKDOWN_EDITOR_CONTENT_NAME;\n\n//\n// MarkdownEditor.Toolbar\n//\n\nconst MARKDOWN_EDITOR_TOOLBAR_NAME = 'MarkdownEditor.Toolbar';\n\ntype MarkdownEditorToolbarProps = ThemedClassName<\n Omit<NaturalMarkdownToolbarProps, 'getView' | 'onAction' | 'onFileUpload' | 'onViewModeChange' | 'id'>\n>;\n\nconst MarkdownEditorToolbar = (props: MarkdownEditorToolbarProps) => {\n const { id, attendableId, onAction, onFileUpload, onViewModeChange } =\n useMarkdownEditorContext(MARKDOWN_EDITOR_TOOLBAR_NAME);\n\n const { controller } = useEditorContext(MARKDOWN_EDITOR_TOOLBAR_NAME);\n\n // Stable getter identity (changes only when the controller does) so the FileUpload effect, whose\n // deps include `getView`, does not re-run every render and re-upload the same file.\n const getView = useCallback(() => controller?.view ?? null, [controller]);\n\n return (\n <NaturalMarkdownToolbar\n {...props}\n id={attendableId ?? id}\n getView={getView}\n onAction={onAction}\n onFileUpload={onFileUpload}\n onViewModeChange={onViewModeChange}\n />\n );\n};\n\nMarkdownEditorToolbar.displayName = MARKDOWN_EDITOR_TOOLBAR_NAME;\n\n//\n// MarkdownEditor.Blocks (embedded objects)\n//\n\nconst MARKDOWN_EDITOR_BLOCKS_NAME = 'MarkdownEditor.Blocks';\n\ntype MarkdownEditorBlocksProps = {};\n\nconst MarkdownEditorBlocks = (_props: MarkdownEditorBlocksProps) => {\n const { widgets } = useMarkdownEditorContext(MARKDOWN_EDITOR_BLOCKS_NAME);\n\n return (\n <>\n {widgets.map(({ id, root, Component, props }) => (\n <div key={id}>{createPortal(<Component {...props} />, root)}</div>\n ))}\n </>\n );\n};\n\nMarkdownEditorBlocks.displayName = MARKDOWN_EDITOR_BLOCKS_NAME;\n\n//\n// MarkdownEditor\n//\n\n/** @private */\nexport const MarkdownEditor = {\n Content: MarkdownEditorContent,\n Toolbar: MarkdownEditorToolbar,\n Blocks: MarkdownEditorBlocks,\n};\n\nexport type { MarkdownEditorBlocksProps, MarkdownEditorContentProps, MarkdownEditorToolbarProps };\n\n/** @deprecated Use `MarkdownEditorProviderProps`. */\nexport type MarkdownEditorRootProps = MarkdownEditorProviderProps;\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\nimport { type Atom, RegistryContext } from '@effect-atom/atom-react';\nimport React, { forwardRef, useCallback, useContext, useEffect, useImperativeHandle, useMemo } from 'react';\n\nimport { useCapabilities } from '@dxos/app-framework/ui';\nimport { AppSurface } from '@dxos/app-toolkit/ui';\nimport { type ThemedClassName, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport {\n type EditorMenuGroup,\n type EditorToolbarState,\n type UseTextEditorProps,\n useTextEditor,\n} from '@dxos/react-ui-editor';\nimport {\n type EditorSelectionState,\n type EditorStateStore,\n type ThemeExtensionsOptions,\n createBasicExtensions,\n createMarkdownExtensions,\n createThemeExtensions,\n documentSlots,\n dropFile,\n editorClassNames,\n formattingListener,\n mobileSlots,\n processEditorPayload,\n scrollbarAutohide,\n} from '@dxos/ui-editor';\nimport { type EditorViewMode } from '@dxos/ui-editor/types';\nimport { mx } from '@dxos/ui-theme';\nimport { isTruthy } from '@dxos/util';\n\nimport { meta } from '#meta';\nimport { MarkdownCapabilities } from '#types';\n\nimport { type MarkdownEditorToolbarProps } from './MarkdownEditorToolbar';\n\nexport type MarkdownEditorContentProps = ThemedClassName<{\n id: string;\n attendableId?: string;\n role?: string;\n compact?: boolean;\n viewMode?: EditorViewMode;\n slashCommandGroups?: EditorMenuGroup[];\n editorStateStore?: EditorStateStore;\n toolbarState?: Atom.Writable<EditorToolbarState>;\n onLinkQuery?: (query?: string) => Promise<EditorMenuGroup[]>;\n}> &\n Pick<UseTextEditorProps, 'initialValue' | 'extensions'> &\n Pick<MarkdownEditorToolbarProps, 'onFileUpload'> &\n Pick<ThemeExtensionsOptions, 'slots'>;\n\n// TODO(burdon): Move controller to Root.\nexport const MarkdownEditorContent = forwardRef<EditorView | null, MarkdownEditorContentProps>(\n (\n {\n classNames,\n id,\n attendableId,\n role,\n compact,\n viewMode,\n initialValue,\n editorStateStore,\n toolbarState,\n extensions,\n slots,\n onFileUpload,\n },\n forwardedRef,\n ) => {\n const { t } = useTranslation(meta.profile.key);\n const { themeMode } = useThemeContext();\n const registry = useContext(RegistryContext);\n\n // Callback to update toolbar state atom.\n const updateToolbarState = useCallback(\n (formatting: EditorToolbarState) => {\n if (toolbarState) {\n registry.set(toolbarState, { ...registry.get(toolbarState), ...formatting });\n }\n },\n [registry, toolbarState],\n );\n\n // Restore last selection and scroll point.\n const { scrollTo, selection } = useMemo<EditorSelectionState>(() => editorStateStore?.getState(id) ?? {}, [id]);\n\n const {\n parentRef,\n view: editorView,\n focusAttributes,\n } = useTextEditor(\n () => ({\n ...(role !== AppSurface.Section.role && {\n id,\n scrollTo,\n selection,\n selectionEnd: true,\n }),\n initialValue,\n extensions: [\n createBasicExtensions({\n readOnly: viewMode === 'readonly',\n placeholder: t('editor.placeholder'),\n scrollPastEnd: !compact,\n search: true,\n }),\n createThemeExtensions({\n themeMode,\n slots: slots ?? (compact ? mobileSlots : documentSlots),\n syntaxHighlighting: true,\n }),\n createMarkdownExtensions(),\n scrollbarAutohide(),\n toolbarState && formattingListener(updateToolbarState),\n role !== AppSurface.Section.role &&\n onFileUpload &&\n dropFile({\n // TODO(wittjosiah): Factor out to file uploader plugin.\n onDrop: async (view, { files }) => {\n const file = files[0];\n const info = file && onFileUpload ? await onFileUpload(file) : undefined;\n if (info) {\n processEditorPayload(view, { type: 'image', data: info.url });\n }\n },\n }),\n extensions,\n ].filter(isTruthy),\n }),\n [id, viewMode, themeMode, extensions, compact],\n );\n\n useImperativeHandle<EditorView | null, EditorView | null>(forwardedRef, () => editorView, [editorView]);\n\n const [editorViewRegistry] = useCapabilities(MarkdownCapabilities.EditorViews);\n useEffect(() => {\n if (editorView && editorViewRegistry) {\n editorViewRegistry.register(attendableId ?? id, editorView, id);\n return () => editorViewRegistry.unregister(attendableId ?? id);\n }\n }, [editorView, editorViewRegistry, attendableId, id]);\n\n useTest(editorView);\n\n return (\n <div\n {...focusAttributes}\n className={mx(editorClassNames(role), classNames)}\n data-testid='composer.markdownRoot'\n data-popover-collision-boundary={true}\n ref={parentRef}\n />\n );\n },\n);\n\n// Expose editor view for playwright tests.\n// TODO(wittjosiah): Find a better way to expose this or find a way to limit it to test runs.\nconst useTest = (view: EditorView | null) => {\n useEffect(() => {\n const composer = (window as any).composer;\n if (composer) {\n composer.editorView = view;\n }\n }, [view]);\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\nimport React, { useCallback, useState } from 'react';\n\nimport { AppCapabilities } from '@dxos/app-toolkit';\nimport { composable, composableProps } from '@dxos/react-ui';\nimport { Editor, type EditorToolbarProps } from '@dxos/react-ui-editor';\n\nimport { FileUpload, type FileUploadAction } from './FileUpload';\n\nexport type MarkdownEditorToolbarProps = {\n id: string;\n // Provided as a getter (not a value prop) so the live `EditorView` is never carried in a React prop\n // that React 19.2's dev render-logger would walk into a cross-origin frame. See\n // `react-ui-editor/.../controller.ts` for the full rationale.\n getView?: () => EditorView | null;\n onFileUpload?: (file: File) => Promise<AppCapabilities.FileInfo | undefined>;\n} & Pick<EditorToolbarProps, 'role' | 'customActions' | 'onAction' | 'onViewModeChange'>;\n\nexport const MarkdownEditorToolbar = composable<HTMLDivElement, MarkdownEditorToolbarProps>(\n ({ id, role, getView, customActions, onAction, onFileUpload, onViewModeChange, ...props }, forwardedRef) => {\n const { className, ...rest } = composableProps(props);\n const [upload, setUpload] = useState<FileUploadAction | null>(null);\n const uploadRef = useCallback((next: FileUploadAction) => setUpload(() => next), []);\n\n if (!getView?.()) {\n return <div className={className} {...rest} ref={forwardedRef} />;\n }\n\n return (\n <div className='contents' ref={forwardedRef}>\n <Editor.Toolbar\n {...rest}\n classNames={className}\n attendableId={id}\n role={role}\n customActions={customActions}\n onAction={onAction}\n onImageUpload={upload ?? undefined}\n onViewModeChange={onViewModeChange}\n />\n\n {onFileUpload && <FileUpload ref={uploadRef} getView={getView} onFileUpload={onFileUpload} />}\n </div>\n );\n },\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type EditorView } from '@codemirror/view';\nimport React, { forwardRef, useEffect, useImperativeHandle } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useDropzone } from 'react-dropzone';\n\nimport { AppCapabilities } from '@dxos/app-toolkit';\nimport { addLink } from '@dxos/ui-editor';\n\nexport const IMAGE_FILES = ['.jpg', '.jpeg', '.png', '.gif'];\n\nexport type FileUploadAction = () => void;\n\nexport type FileUploadProps = {\n // Provided as a getter (not a value prop) so the live `EditorView` is never carried in a React prop\n // that React 19.2's dev render-logger would walk into a cross-origin frame. See\n // `react-ui-editor/.../controller.ts` for the full rationale.\n getView?: () => EditorView | null;\n onFileUpload?: (file: File) => Promise<AppCapabilities.FileInfo | undefined>;\n};\n\n// TODO(burdon): Factor out.\n// TODO(burdon): Move to root? (support drag into document via dropzone).\nexport const FileUpload = forwardRef<FileUploadAction, FileUploadProps>(({ getView, onFileUpload }, forwardedRef) => {\n // https://react-dropzone.js.org\n const { acceptedFiles, open, inputRef } = useDropzone({\n disabled: !onFileUpload,\n multiple: false,\n noDrag: true,\n accept: {\n 'image/*': IMAGE_FILES,\n },\n });\n\n useImperativeHandle(forwardedRef, () => open, []);\n\n useEffect(() => {\n if (acceptedFiles.length && onFileUpload) {\n requestAnimationFrame(async () => {\n const editorView = getView?.();\n if (!editorView) {\n return;\n }\n // NOTE: Clone file since react-dropzone patches in a non-standard `path` property, which confuses IPFS.\n const f = acceptedFiles[0];\n const file = new File([f], f.name, {\n type: f.type,\n lastModified: f.lastModified,\n });\n\n // TODO(burdon): Factor out.\n const info = await onFileUpload(file);\n if (info) {\n addLink({ url: info.url, image: true })(editorView);\n }\n });\n }\n }, [getView, acceptedFiles, onFileUpload]);\n\n if (!onFileUpload) {\n return null;\n }\n\n return <>{createPortal(<input ref={inputRef} />, document.body)} </>;\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["createContext", "React", "useCallback", "useMemo", "useState", "createPortal", "composable", "composableProps", "createEditorController", "useEditorContext", "isNonNullable", "useEditorMenuOptions", "useExtensions", "RegistryContext", "React", "forwardRef", "useCallback", "useContext", "useEffect", "useImperativeHandle", "useMemo", "useCapabilities", "AppSurface", "useThemeContext", "useTranslation", "useTextEditor", "createBasicExtensions", "createMarkdownExtensions", "createThemeExtensions", "documentSlots", "dropFile", "editorClassNames", "formattingListener", "mobileSlots", "processEditorPayload", "scrollbarAutohide", "mx", "isTruthy", "meta", "MarkdownCapabilities", "MarkdownEditorContent", "classNames", "id", "attendableId", "role", "compact", "viewMode", "initialValue", "editorStateStore", "toolbarState", "extensions", "slots", "onFileUpload", "forwardedRef", "t", "profile", "key", "themeMode", "registry", "updateToolbarState", "formatting", "set", "get", "scrollTo", "selection", "getState", "parentRef", "view", "editorView", "focusAttributes", "Section", "selectionEnd", "readOnly", "placeholder", "scrollPastEnd", "search", "syntaxHighlighting", "onDrop", "files", "file", "info", "undefined", "type", "data", "url", "filter", "editorViewRegistry", "EditorViews", "register", "unregister", "useTest", "div", "className", "data-testid", "data-popover-collision-boundary", "ref", "composer", "window", "React", "useCallback", "useState", "composable", "composableProps", "Editor", "React", "forwardRef", "useEffect", "useImperativeHandle", "createPortal", "useDropzone", "addLink", "IMAGE_FILES", "FileUpload", "getView", "onFileUpload", "forwardedRef", "acceptedFiles", "open", "inputRef", "disabled", "multiple", "noDrag", "accept", "length", "requestAnimationFrame", "editorView", "f", "file", "File", "name", "type", "lastModified", "info", "url", "image", "input", "ref", "document", "body", "MarkdownEditorToolbar", "composable", "id", "role", "getView", "customActions", "onAction", "onFileUpload", "onViewModeChange", "props", "forwardedRef", "className", "rest", "composableProps", "upload", "setUpload", "useState", "uploadRef", "useCallback", "next", "React", "div", "ref", "Editor", "Toolbar", "classNames", "attendableId", "onImageUpload", "undefined", "FileUpload", "MarkdownEditorContextProvider", "useMarkdownEditorContext", "createContext", "MarkdownEditorProvider", "children", "id", "attendableId", "object", "settings", "compact", "viewMode", "viewState", "editorStateStore", "extensions", "extensionsProp", "slashCommandGroups", "onLinkQuery", "onSelectObject", "onAction", "onFileUpload", "onViewModeChange", "widgets", "setWidgets", "useState", "menuOptions", "useEditorMenuOptions", "coreExtensions", "useExtensions", "useMemo", "filter", "isNonNullable", "flat", "editorRootProps", "getMenu", "trigger", "placeholder", "undefined", "triggerKey", "markdownContextValue", "React", "displayName", "MARKDOWN_EDITOR_CONTENT_NAME", "MarkdownEditorContent", "composable", "compactProp", "props", "_forwardedRef", "setController", "state", "useEditorContext", "handleRef", "useCallback", "view", "createEditorController", "NaturalMarkdownEditorContent", "composableProps", "toolbarState", "ref", "MARKDOWN_EDITOR_TOOLBAR_NAME", "MarkdownEditorToolbar", "controller", "getView", "NaturalMarkdownToolbar", "MARKDOWN_EDITOR_BLOCKS_NAME", "MarkdownEditorBlocks", "_props", "map", "root", "Component", "div", "key", "createPortal", "MarkdownEditor", "Content", "Toolbar", "Blocks"]
|
|
7
7
|
}
|
|
@@ -2,12 +2,14 @@ import "../chunk-J5LGTIGS.mjs";
|
|
|
2
2
|
|
|
3
3
|
// src/containers/index.ts
|
|
4
4
|
import { lazy } from "react";
|
|
5
|
-
var MarkdownCard = lazy(() => import("../MarkdownCard-
|
|
5
|
+
var MarkdownCard = lazy(() => import("../MarkdownCard-2HUXCGZP.mjs"));
|
|
6
6
|
var EditableMarkdownCard = lazy(() => import("../EditableMarkdownCard-AW7MD35U.mjs"));
|
|
7
|
-
var MarkdownArticle = lazy(() => import("../MarkdownArticle-
|
|
7
|
+
var MarkdownArticle = lazy(() => import("../MarkdownArticle-ZHBXH7YF.mjs"));
|
|
8
|
+
var MarkdownSettings = lazy(() => import("../MarkdownSettings-5VMOYMND.mjs"));
|
|
8
9
|
export {
|
|
9
10
|
EditableMarkdownCard,
|
|
10
11
|
MarkdownArticle,
|
|
11
|
-
MarkdownCard
|
|
12
|
+
MarkdownCard,
|
|
13
|
+
MarkdownSettings
|
|
12
14
|
};
|
|
13
15
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/containers/index.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type ComponentType, lazy } from 'react';\n\nexport type { MarkdownArticleProps } from './MarkdownArticle';\n\nexport const MarkdownCard: ComponentType<any> = lazy(() => import('./MarkdownCard'));\nexport const EditableMarkdownCard: ComponentType<any> = lazy(() => import('./EditableMarkdownCard'));\nexport const MarkdownArticle: ComponentType<any> = lazy(() => import('./MarkdownArticle'));\n"],
|
|
5
|
-
"mappings": ";;;AAIA,SAA6BA,YAAY;AAIlC,IAAMC,eAAmCD,KAAK,MAAM,OAAO,8BAAA,CAAA;AAC3D,IAAME,uBAA2CF,KAAK,MAAM,OAAO,sCAAA,CAAA;AACnE,IAAMG,kBAAsCH,KAAK,MAAM,OAAO,iCAAA,CAAA;",
|
|
6
|
-
"names": ["lazy", "MarkdownCard", "EditableMarkdownCard", "MarkdownArticle"]
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type ComponentType, lazy } from 'react';\n\nexport type { MarkdownArticleProps } from './MarkdownArticle';\n\nexport const MarkdownCard: ComponentType<any> = lazy(() => import('./MarkdownCard'));\nexport const EditableMarkdownCard: ComponentType<any> = lazy(() => import('./EditableMarkdownCard'));\nexport const MarkdownArticle: ComponentType<any> = lazy(() => import('./MarkdownArticle'));\nexport const MarkdownSettings: ComponentType<any> = lazy(() => import('./MarkdownSettings'));\n"],
|
|
5
|
+
"mappings": ";;;AAIA,SAA6BA,YAAY;AAIlC,IAAMC,eAAmCD,KAAK,MAAM,OAAO,8BAAA,CAAA;AAC3D,IAAME,uBAA2CF,KAAK,MAAM,OAAO,sCAAA,CAAA;AACnE,IAAMG,kBAAsCH,KAAK,MAAM,OAAO,iCAAA,CAAA;AAC9D,IAAMI,mBAAuCJ,KAAK,MAAM,OAAO,kCAAA,CAAA;",
|
|
6
|
+
"names": ["lazy", "MarkdownCard", "EditableMarkdownCard", "MarkdownArticle", "MarkdownSettings"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
MarkdownOperation_exports,
|
|
3
3
|
Markdown_exports
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-ZJ3GWRUJ.mjs";
|
|
5
5
|
import "./chunk-J5LGTIGS.mjs";
|
|
6
6
|
|
|
7
7
|
// src/operations/create.ts
|
|
@@ -26,4 +26,4 @@ var create_default = handler;
|
|
|
26
26
|
export {
|
|
27
27
|
create_default as default
|
|
28
28
|
};
|
|
29
|
-
//# sourceMappingURL=create-
|
|
29
|
+
//# sourceMappingURL=create-OQUMKL5I.mjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
MarkdownOperation_exports,
|
|
3
3
|
Markdown_exports
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-ZJ3GWRUJ.mjs";
|
|
5
5
|
import "./chunk-J5LGTIGS.mjs";
|
|
6
6
|
|
|
7
7
|
// src/operations/create-markdown.ts
|
|
@@ -17,4 +17,4 @@ var create_markdown_default = handler;
|
|
|
17
17
|
export {
|
|
18
18
|
create_markdown_default as default
|
|
19
19
|
};
|
|
20
|
-
//# sourceMappingURL=create-markdown-
|
|
20
|
+
//# sourceMappingURL=create-markdown-4O5FDA77.mjs.map
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
getDocumentsPath
|
|
3
|
-
} from "./chunk-67DKWOKF.mjs";
|
|
4
1
|
import "./chunk-J5LGTIGS.mjs";
|
|
5
2
|
|
|
6
3
|
// src/capabilities/create-object.ts
|
|
@@ -19,8 +16,7 @@ var create_object_default = Capability.makeModule(Effect.fnUntraced(function* ()
|
|
|
19
16
|
return yield* Operation.invoke(SpaceOperation.AddObject, {
|
|
20
17
|
object,
|
|
21
18
|
target: options.target,
|
|
22
|
-
|
|
23
|
-
targetNodeId: options.targetNodeId ?? getDocumentsPath(options.db.spaceId)
|
|
19
|
+
targetNodeId: options.targetNodeId
|
|
24
20
|
});
|
|
25
21
|
})
|
|
26
22
|
});
|
|
@@ -28,4 +24,4 @@ var create_object_default = Capability.makeModule(Effect.fnUntraced(function* ()
|
|
|
28
24
|
export {
|
|
29
25
|
create_object_default as default
|
|
30
26
|
};
|
|
31
|
-
//# sourceMappingURL=create-object-
|
|
27
|
+
//# sourceMappingURL=create-object-RSEWTCMM.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/capabilities/create-object.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { Operation } from '@dxos/compute';\nimport { Type } from '@dxos/echo';\nimport { SpaceOperation } from '@dxos/plugin-space';\nimport { SpaceCapabilities } from '@dxos/plugin-space';\n\nimport { Markdown } from '#types';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n return Capability.contributes(SpaceCapabilities.CreateObjectEntry, {\n id: Type.getTypename(Markdown.Document),\n createObject: (props, options) =>\n Effect.gen(function* () {\n const object = Markdown.make(props);\n return yield* Operation.invoke(SpaceOperation.AddObject, {\n object,\n target: options.target,\n targetNodeId: options.targetNodeId,\n });\n }),\n });\n }),\n);\n"],
|
|
5
|
+
"mappings": ";;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,iBAAiB;AAC1B,SAASC,YAAY;AACrB,SAASC,sBAAsB;AAC/B,SAASC,yBAAyB;AAElC,SAASC,gBAAgB;AAEzB,IAAA,wBAAeL,WAAWM,WACjBC,kBAAW,aAAA;AAChB,SAAOP,WAAWQ,YAAYJ,kBAAkBK,mBAAmB;IACjEC,IAAIR,KAAKS,YAAYN,SAASO,QAAQ;IACtCC,cAAc,CAACC,OAAOC,YACbC,WAAI,aAAA;AACT,YAAMC,SAASZ,SAASa,KAAKJ,KAAAA;AAC7B,aAAO,OAAOb,UAAUkB,OAAOhB,eAAeiB,WAAW;QACvDH;QACAI,QAAQN,QAAQM;QAChBC,cAAcP,QAAQO;MACxB,CAAA;IACF,CAAA;EACJ,CAAA;AACF,CAAA,CAAA;",
|
|
6
|
+
"names": ["Effect", "Capability", "Operation", "Type", "SpaceOperation", "SpaceCapabilities", "Markdown", "makeModule", "fnUntraced", "contributes", "CreateObjectEntry", "id", "getTypename", "Document", "createObject", "props", "options", "gen", "object", "make", "invoke", "AddObject", "target", "targetNodeId"]
|
|
7
|
+
}
|
|
@@ -3,7 +3,10 @@ import {
|
|
|
3
3
|
} from "../chunk-KDN4GKG2.mjs";
|
|
4
4
|
import {
|
|
5
5
|
Markdown_exports
|
|
6
|
-
} from "../chunk-
|
|
6
|
+
} from "../chunk-ZJ3GWRUJ.mjs";
|
|
7
|
+
import {
|
|
8
|
+
PreviewComponent
|
|
9
|
+
} from "../chunk-YJF6XOXX.mjs";
|
|
7
10
|
import "../chunk-J5LGTIGS.mjs";
|
|
8
11
|
|
|
9
12
|
// src/hooks/useEditorMenuOptions.ts
|
|
@@ -13,7 +16,7 @@ import { filterMenuGroups, formattingCommands, linkSlashCommands } from "@dxos/r
|
|
|
13
16
|
import { Domino } from "@dxos/ui";
|
|
14
17
|
import { meta } from "#meta";
|
|
15
18
|
var useEditorMenuOptions = ({ editorView, slashCommandGroups, onLinkQuery }) => {
|
|
16
|
-
const { t } = useTranslation(meta.
|
|
19
|
+
const { t } = useTranslation(meta.profile.key);
|
|
17
20
|
const getMenu = useCallback(({ text, trigger }) => {
|
|
18
21
|
switch (trigger) {
|
|
19
22
|
case "@": {
|
|
@@ -22,8 +25,8 @@ var useEditorMenuOptions = ({ editorView, slashCommandGroups, onLinkQuery }) =>
|
|
|
22
25
|
case "/":
|
|
23
26
|
default: {
|
|
24
27
|
return filterMenuGroups([
|
|
25
|
-
formattingCommands,
|
|
26
28
|
linkSlashCommands,
|
|
29
|
+
formattingCommands,
|
|
27
30
|
...slashCommandGroups ?? []
|
|
28
31
|
], (item) => text ? toLocalizedString(item.label, t).toLowerCase().includes(text.toLowerCase()) : true);
|
|
29
32
|
}
|
|
@@ -63,21 +66,22 @@ var useEditorMenuOptions = ({ editorView, slashCommandGroups, onLinkQuery }) =>
|
|
|
63
66
|
|
|
64
67
|
// src/hooks/useExtensions.tsx
|
|
65
68
|
import { useMemo as useMemo2 } from "react";
|
|
66
|
-
import {
|
|
69
|
+
import { Paths } from "@dxos/app-toolkit";
|
|
67
70
|
import { debounceAndThrottle } from "@dxos/async";
|
|
68
71
|
import { Obj } from "@dxos/echo";
|
|
69
|
-
import {
|
|
72
|
+
import { Doc } from "@dxos/echo-doc";
|
|
70
73
|
import { invariant } from "@dxos/invariant";
|
|
71
74
|
import { getSpace, useObject } from "@dxos/react-client/echo";
|
|
72
75
|
import { useIdentity } from "@dxos/react-client/halo";
|
|
73
76
|
import { useThemeContext } from "@dxos/react-ui";
|
|
77
|
+
import { selectionAspect } from "@dxos/react-ui-attention";
|
|
74
78
|
import { Text } from "@dxos/schema";
|
|
75
79
|
import { Domino as Domino2 } from "@dxos/ui";
|
|
76
|
-
import { Cursor, EditorView, InputModeExtensions, createDataExtensions, decorateMarkdown, documentId, folding, formattingKeymap, linkTooltip, listener,
|
|
80
|
+
import { AnchorWidget, Cursor, EditorView, InputModeExtensions, createDataExtensions, decorateMarkdown, documentId, folding, formattingKeymap, linkTooltip, listener, replacer, selectionState, snippets, xmlTags } from "@dxos/ui-editor";
|
|
77
81
|
import { isTruthy, safeUrl } from "@dxos/util";
|
|
78
82
|
import { Markdown } from "#types";
|
|
79
83
|
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-markdown/src/hooks/useExtensions.tsx";
|
|
80
|
-
var useExtensions = ({ id, object, settings, compact, viewMode,
|
|
84
|
+
var useExtensions = ({ id, object, settings, compact, viewMode, viewState, editorStateStore, setWidgets, onSelectObject }) => {
|
|
81
85
|
const { platform } = useThemeContext();
|
|
82
86
|
const identity = useIdentity();
|
|
83
87
|
const space = getSpace(object);
|
|
@@ -90,8 +94,8 @@ var useExtensions = ({ id, object, settings, compact, viewMode, selectionManager
|
|
|
90
94
|
settings,
|
|
91
95
|
compact,
|
|
92
96
|
viewMode,
|
|
93
|
-
|
|
94
|
-
|
|
97
|
+
viewState,
|
|
98
|
+
setWidgets,
|
|
95
99
|
platform,
|
|
96
100
|
onSelectObject
|
|
97
101
|
}), [
|
|
@@ -99,8 +103,8 @@ var useExtensions = ({ id, object, settings, compact, viewMode, selectionManager
|
|
|
99
103
|
object,
|
|
100
104
|
compact,
|
|
101
105
|
viewMode,
|
|
102
|
-
|
|
103
|
-
|
|
106
|
+
viewState,
|
|
107
|
+
setWidgets,
|
|
104
108
|
settings,
|
|
105
109
|
settings?.debug,
|
|
106
110
|
settings?.editorInputMode,
|
|
@@ -114,7 +118,7 @@ var useExtensions = ({ id, object, settings, compact, viewMode, selectionManager
|
|
|
114
118
|
// NOTE: Data extensions must be first so that automerge is updated before other extensions compute their state.
|
|
115
119
|
target && createDataExtensions({
|
|
116
120
|
id,
|
|
117
|
-
text:
|
|
121
|
+
text: Doc.createAccessor(target, [
|
|
118
122
|
"content"
|
|
119
123
|
]),
|
|
120
124
|
messenger: space,
|
|
@@ -137,9 +141,9 @@ var useExtensions = ({ id, object, settings, compact, viewMode, selectionManager
|
|
|
137
141
|
baseExtensions
|
|
138
142
|
]);
|
|
139
143
|
};
|
|
140
|
-
var createBaseExtensions = ({ id, object, onSelectObject, settings, compact, viewMode,
|
|
144
|
+
var createBaseExtensions = ({ id, object, onSelectObject, settings, compact, viewMode, viewState, setWidgets, platform }) => {
|
|
141
145
|
const extensions = [
|
|
142
|
-
|
|
146
|
+
viewState && selectionChange(viewState),
|
|
143
147
|
settings?.editorInputMode && InputModeExtensions[settings.editorInputMode],
|
|
144
148
|
settings?.folding && !compact && platform !== "mobile" && folding()
|
|
145
149
|
].filter(isTruthy);
|
|
@@ -152,10 +156,32 @@ var createBaseExtensions = ({ id, object, onSelectObject, settings, compact, vie
|
|
|
152
156
|
from: 2
|
|
153
157
|
} : void 0,
|
|
154
158
|
// TODO(wittjosiah): For internal links render the label of the object.
|
|
155
|
-
renderLinkButton: onSelectObject && createRenderLink(onSelectObject)
|
|
159
|
+
renderLinkButton: onSelectObject && createRenderLink(onSelectObject),
|
|
160
|
+
// xmlTags() handles dxn:/echo: links via url-scheme widgets; skip here to avoid double-processing.
|
|
161
|
+
skip: ({ url }) => url.startsWith("dxn:") || url.startsWith("echo:")
|
|
156
162
|
}),
|
|
157
163
|
linkTooltip(renderLinkTooltip),
|
|
158
|
-
|
|
164
|
+
xmlTags({
|
|
165
|
+
registry: {
|
|
166
|
+
"dxn-preview": {
|
|
167
|
+
block: true,
|
|
168
|
+
urlSchemes: [
|
|
169
|
+
"dxn:",
|
|
170
|
+
"echo:"
|
|
171
|
+
],
|
|
172
|
+
Component: PreviewComponent
|
|
173
|
+
},
|
|
174
|
+
"link-preview": {
|
|
175
|
+
block: false,
|
|
176
|
+
urlSchemes: [
|
|
177
|
+
"dxn:",
|
|
178
|
+
"echo:"
|
|
179
|
+
],
|
|
180
|
+
factory: ({ label, dxn }) => label && dxn ? new AnchorWidget(label, dxn) : null
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
setWidgets
|
|
184
|
+
}),
|
|
159
185
|
replacer()
|
|
160
186
|
]);
|
|
161
187
|
}
|
|
@@ -169,7 +195,7 @@ var createBaseExtensions = ({ id, object, onSelectObject, settings, compact, vie
|
|
|
169
195
|
}
|
|
170
196
|
return extensions;
|
|
171
197
|
};
|
|
172
|
-
var selectionChange = (
|
|
198
|
+
var selectionChange = (viewState) => {
|
|
173
199
|
const debouncedHandler = debounceAndThrottle((update) => {
|
|
174
200
|
const id = update.state.facet(documentId);
|
|
175
201
|
const cursorConverter = update.state.facet(Cursor.converter);
|
|
@@ -178,7 +204,10 @@ var selectionChange = (selectionManager) => {
|
|
|
178
204
|
from: cursorConverter.toCursor(range.from),
|
|
179
205
|
to: cursorConverter.toCursor(range.to)
|
|
180
206
|
}));
|
|
181
|
-
|
|
207
|
+
viewState.set(selectionAspect, id, {
|
|
208
|
+
mode: "multi-range",
|
|
209
|
+
ranges
|
|
210
|
+
});
|
|
182
211
|
}, 100);
|
|
183
212
|
return EditorView.updateListener.of((update) => {
|
|
184
213
|
if (update.selectionSet) {
|
|
@@ -188,10 +217,10 @@ var selectionChange = (selectionManager) => {
|
|
|
188
217
|
};
|
|
189
218
|
var createRenderLink = (onSelectObject) => (el, { url }) => {
|
|
190
219
|
const isInternal = url.startsWith("/") || url.startsWith(window.location.origin);
|
|
191
|
-
const qualifiedId = isInternal ? fromUrlPath(new URL(url, window.location.origin).pathname) : void 0;
|
|
220
|
+
const qualifiedId = isInternal ? Paths.fromUrlPath(new URL(url, window.location.origin).pathname) : void 0;
|
|
192
221
|
const icon = Domino2.of("span").classNames("dx-link ms-1 inline-block align-[-0.125em]").append(Domino2.svg(isInternal ? "ph--arrow-square-down--regular" : "ph--arrow-square-out--regular"));
|
|
193
222
|
if (isInternal) {
|
|
194
|
-
invariant(qualifiedId, "Invalid link format.", { "~LogMeta": "~LogMeta", F: __dxlog_file, L:
|
|
223
|
+
invariant(qualifiedId, "Invalid link format.", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 180, S: void 0, A: ["qualifiedId", "'Invalid link format.'"] });
|
|
195
224
|
icon.attributes({
|
|
196
225
|
role: "button",
|
|
197
226
|
tabindex: "0"
|
|
@@ -227,7 +256,7 @@ import { HiddenAnnotation, getTypeAnnotation } from "@dxos/echo/Annotation";
|
|
|
227
256
|
import { Kind as EntityKind } from "@dxos/echo/Entity";
|
|
228
257
|
import { toLocalizedString as toLocalizedString2, useTranslation as useTranslation2 } from "@dxos/react-ui";
|
|
229
258
|
import { insertAtCursor, insertAtLineStart } from "@dxos/ui-editor";
|
|
230
|
-
var useLinkQuery = (db) => {
|
|
259
|
+
var useLinkQuery = (db, current) => {
|
|
231
260
|
const { t } = useTranslation2();
|
|
232
261
|
const filter = useMemo3(() => Filter.or(...(db ? db.graph.registry.list().filter(Type.isType) : []).filter((schema) => getTypeAnnotation(Type.getSchema(schema))?.kind !== EntityKind.Relation).filter((schema) => !HiddenAnnotation.get(Type.getSchema(schema)).pipe(Option.getOrElse(() => false))).map((schema) => Filter.type(Type.getURI(schema)))), [
|
|
233
262
|
db
|
|
@@ -245,7 +274,7 @@ var useLinkQuery = (db) => {
|
|
|
245
274
|
}
|
|
246
275
|
];
|
|
247
276
|
};
|
|
248
|
-
const items = results?.filter((object) => toLocalizedString2(getLabel(object), t).toLowerCase().includes(name)).map((object) => {
|
|
277
|
+
const items = results?.filter((object) => object.id !== current?.id).filter((object) => toLocalizedString2(getLabel(object), t).toLowerCase().includes(name)).map((object) => {
|
|
249
278
|
const type = Obj2.getType(object);
|
|
250
279
|
const icon = type ? Option.getOrUndefined(Annotation.IconAnnotation.get(Type.getSchema(type)))?.icon : void 0;
|
|
251
280
|
const label = toLocalizedString2(getLabel(object), t);
|
|
@@ -305,7 +334,8 @@ var useLinkQuery = (db) => {
|
|
|
305
334
|
}, [
|
|
306
335
|
db,
|
|
307
336
|
filter,
|
|
308
|
-
t
|
|
337
|
+
t,
|
|
338
|
+
current
|
|
309
339
|
]);
|
|
310
340
|
return handleLinkQuery;
|
|
311
341
|
};
|