@dxos/plugin-markdown 0.9.1-main.c7dcc2e112 → 0.10.0
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-I4UMD7AA.mjs → MarkdownArticle-ZHBXH7YF.mjs} +3 -5
- package/dist/lib/neutral/{MarkdownArticle-I4UMD7AA.mjs.map → MarkdownArticle-ZHBXH7YF.mjs.map} +2 -2
- package/dist/lib/neutral/{MarkdownCard-OYO2HYZF.mjs → MarkdownCard-2HUXCGZP.mjs} +2 -2
- package/dist/lib/neutral/{MarkdownCard-OYO2HYZF.mjs.map → MarkdownCard-2HUXCGZP.mjs.map} +1 -1
- package/dist/lib/neutral/MarkdownPlugin.mjs +3 -7
- 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 +9 -13
- 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-GUXWFDD4.mjs → chunk-OC3JD73N.mjs} +2 -2
- package/dist/lib/neutral/{chunk-GUXWFDD4.mjs.map → chunk-OC3JD73N.mjs.map} +1 -1
- 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-CRKAIDRD.mjs → chunk-ZJ3GWRUJ.mjs} +15 -14
- 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 +13 -52
- 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-XW2FQNLK.mjs → create-OQUMKL5I.mjs} +2 -2
- package/dist/lib/neutral/{create-markdown-KLSVQCT7.mjs → create-markdown-4O5FDA77.mjs} +2 -2
- package/dist/lib/neutral/{create-object-3WMEQJ2C.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 +41 -15
- 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-F7KLNKVN.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-6LX4ZQ2H.mjs → react-surface-37GL3UVG.mjs} +4 -4
- package/dist/lib/neutral/react-surface-37GL3UVG.mjs.map +7 -0
- package/dist/lib/neutral/{scroll-to-anchor-ACND3WJU.mjs → scroll-to-anchor-I6HFE5AH.mjs} +2 -2
- package/dist/lib/neutral/{set-view-mode-WDC7CAEC.mjs → set-view-mode-NY5OYYIM.mjs} +2 -2
- 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-ZYT3JRWT.mjs → state-3BR7L6CW.mjs} +1 -1
- package/dist/lib/neutral/{state-ZYT3JRWT.mjs.map → state-3BR7L6CW.mjs.map} +2 -2
- 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/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.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +1 -3
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/node.d.ts +1 -0
- package/dist/types/src/capabilities/node.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts +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/MarkdownEditor.d.ts +3 -4
- 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/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 +2 -13
- package/dist/types/src/containers/MarkdownArticle/MarkdownArticle.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 +3 -3
- 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 +4 -0
- 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/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 +1 -1
- package/package.json +66 -59
- package/src/MarkdownPlugin.node.ts +2 -1
- package/src/MarkdownPlugin.tsx +2 -6
- 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 +1 -1
- package/src/capabilities/index.ts +1 -3
- package/src/capabilities/node.ts +1 -0
- package/src/capabilities/react-surface.tsx +9 -3
- package/src/capabilities/skill-definition.ts +14 -0
- package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +72 -30
- package/src/components/MarkdownEditor/MarkdownEditor.tsx +11 -37
- package/src/components/MarkdownEditor/MarkdownEditorContent.tsx +3 -3
- 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.tsx +3 -3
- package/src/containers/MarkdownCard/MarkdownCard.tsx +1 -1
- 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 +1 -1
- package/src/hooks/useExtensions.tsx +32 -12
- package/src/hooks/useLinkQuery.ts +5 -3
- package/src/index.ts +1 -2
- 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/types/Markdown.ts +19 -18
- package/src/types/MarkdownOperation.ts +11 -5
- package/src/types/types.ts +2 -7
- package/dist/lib/neutral/MarkdownSettings-F5AWRDT3.mjs +0 -32
- package/dist/lib/neutral/MarkdownSettings-F5AWRDT3.mjs.map +0 -7
- package/dist/lib/neutral/anchor-sort-UXN4RHFX.mjs.map +0 -7
- package/dist/lib/neutral/app-graph-builder-6Y5NHTNR.mjs +0 -66
- package/dist/lib/neutral/app-graph-builder-6Y5NHTNR.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-4ULSRZRL.mjs +0 -10
- package/dist/lib/neutral/chunk-4ULSRZRL.mjs.map +0 -7
- package/dist/lib/neutral/chunk-BL46CERY.mjs +0 -8
- package/dist/lib/neutral/chunk-CRKAIDRD.mjs.map +0 -7
- package/dist/lib/neutral/chunk-LXNSKCPD.mjs.map +0 -7
- package/dist/lib/neutral/comment-config-EGY7RPPW.mjs.map +0 -7
- package/dist/lib/neutral/create-object-3WMEQJ2C.mjs.map +0 -7
- package/dist/lib/neutral/navigation-resolver-3WEM7SSC.mjs +0 -14
- package/dist/lib/neutral/navigation-resolver-3WEM7SSC.mjs.map +0 -7
- package/dist/lib/neutral/react-surface-6LX4ZQ2H.mjs.map +0 -7
- package/dist/lib/neutral/update-markdown-FGVN3LD4.mjs +0 -44
- package/dist/lib/neutral/update-markdown-FGVN3LD4.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/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 -61
- 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 -13
- /package/dist/lib/neutral/{chunk-BL46CERY.mjs.map → chunk-2V6A5NDQ.mjs.map} +0 -0
- /package/dist/lib/neutral/{create-XW2FQNLK.mjs.map → create-OQUMKL5I.mjs.map} +0 -0
- /package/dist/lib/neutral/{create-markdown-KLSVQCT7.mjs.map → create-markdown-4O5FDA77.mjs.map} +0 -0
- /package/dist/lib/neutral/{open-F7KLNKVN.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-ACND3WJU.mjs.map → scroll-to-anchor-I6HFE5AH.mjs.map} +0 -0
- /package/dist/lib/neutral/{set-view-mode-WDC7CAEC.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
|
@@ -16,7 +16,7 @@ var dx_config_default = Config2.make({
|
|
|
16
16
|
|
|
17
17
|
The editor integrates with the rest of the workspace through @ references that link to any ECHO object, image and file uploads stored in the active space, and anchored comment threads on text ranges. Comments can optionally be routed to an AI agent on every message or only on @mention.
|
|
18
18
|
|
|
19
|
-
A built-in
|
|
19
|
+
A built-in skill exposes create, open, and update operations as tools for AI agents. Updates are applied as compact find-and-replace diffs against the document, making it safe for agents to edit large documents incrementally while you continue collaborating.
|
|
20
20
|
`,
|
|
21
21
|
source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-markdown",
|
|
22
22
|
icon: {
|
|
@@ -40,4 +40,4 @@ var meta = Plugin.getMetaFromConfig(dx_config_default);
|
|
|
40
40
|
export {
|
|
41
41
|
meta
|
|
42
42
|
};
|
|
43
|
-
//# sourceMappingURL=chunk-
|
|
43
|
+
//# sourceMappingURL=chunk-OC3JD73N.mjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/meta.ts", "../../../dx.config.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Plugin } from '@dxos/app-framework';\n\nimport config from '../dx.config';\n\nexport const meta = Plugin.getMetaFromConfig(config);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Config2 } from '@dxos/app-framework/config';\nimport { trim } from '@dxos/util';\n\nexport default Config2.make({\n plugin: {\n key: 'org.dxos.plugin.markdown',\n name: 'Markdown',\n author: 'DXOS',\n description: trim`\n A full-featured markdown editor for authoring documents in your space. Edits flow through a collaborative CodeMirror surface backed by ECHO Text, so every keystroke replicates to other peers in real time without merge conflicts or lost work.\n\n Documents can be opened in source, preview, or read-only mode and rendered as a full-surface article or as embeddable cards. An optional formatting toolbar exposes headings, lists, links, and other common markdown actions, and dispositional toolbar actions contributed by other plugins are surfaced inline alongside it.\n\n The editor integrates with the rest of the workspace through @ references that link to any ECHO object, image and file uploads stored in the active space, and anchored comment threads on text ranges. Comments can optionally be routed to an AI agent on every message or only on @mention.\n\n A built-in
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Plugin } from '@dxos/app-framework';\n\nimport config from '../dx.config';\n\nexport const meta = Plugin.getMetaFromConfig(config);\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Config2 } from '@dxos/app-framework/config';\nimport { trim } from '@dxos/util';\n\nexport default Config2.make({\n plugin: {\n key: 'org.dxos.plugin.markdown',\n name: 'Markdown',\n author: 'DXOS',\n description: trim`\n A full-featured markdown editor for authoring documents in your space. Edits flow through a collaborative CodeMirror surface backed by ECHO Text, so every keystroke replicates to other peers in real time without merge conflicts or lost work.\n\n Documents can be opened in source, preview, or read-only mode and rendered as a full-surface article or as embeddable cards. An optional formatting toolbar exposes headings, lists, links, and other common markdown actions, and dispositional toolbar actions contributed by other plugins are surfaced inline alongside it.\n\n The editor integrates with the rest of the workspace through @ references that link to any ECHO object, image and file uploads stored in the active space, and anchored comment threads on text ranges. Comments can optionally be routed to an AI agent on every message or only on @mention.\n\n A built-in skill exposes create, open, and update operations as tools for AI agents. Updates are applied as compact find-and-replace diffs against the document, making it safe for agents to edit large documents incrementally while you continue collaborating.\n `,\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-markdown',\n icon: { key: 'ph--text-aa--regular', hue: 'indigo' },\n screenshots: [\n {\n dark: 'https://customer-5rxcjpyab08avpmn.cloudflarestream.com/cdf2656365bb1fd327c1fc2105d75e5a/iframe?poster=https%3A%2F%2Fcustomer-5rxcjpyab08avpmn.cloudflarestream.com%2Fcdf2656365bb1fd327c1fc2105d75e5a%2Fthumbnails%2Fthumbnail.jpg%3Ftime%3D%26height%3D600',\n },\n { dark: 'https://dxos.network/plugin-details-markdown-dark.png' },\n ],\n },\n});\n"],
|
|
5
5
|
"mappings": ";AAIA,SAASA,cAAc;;;ACAvB,SAASC,eAAe;AACxB,SAASC,YAAY;AAErB,IAAA,oBAAeD,QAAQE,KAAK;EAC1BC,QAAQ;IACNC,KAAK;IACLC,MAAM;IACNC,QAAQ;IACRC,aAAaN;;;;;;;;;IASbO,QAAQ;IACRC,MAAM;MAAEL,KAAK;MAAwBM,KAAK;IAAS;IACnDC,aAAa;MACX;QACEC,MAAM;MACR;MACA;QAAEA,MAAM;MAAwD;;EAEpE;AACF,CAAA;;;ADtBO,IAAMC,OAAOC,OAAOC,kBAAkBC,iBAAAA;",
|
|
6
6
|
"names": ["Plugin", "Config2", "trim", "make", "plugin", "key", "name", "author", "description", "source", "icon", "hue", "screenshots", "dark", "meta", "Plugin", "getMetaFromConfig", "config"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
// src/components/PreviewComponent/PreviewComponent.tsx
|
|
2
|
+
import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
3
|
+
import { Surface, useOperationInvoker } from "@dxos/app-framework/ui";
|
|
4
|
+
import { LayoutOperation, Paths } from "@dxos/app-toolkit";
|
|
5
|
+
import { AppSurface } from "@dxos/app-toolkit/ui";
|
|
6
|
+
import { Obj } from "@dxos/echo";
|
|
7
|
+
import { URI } from "@dxos/keys";
|
|
8
|
+
import { useClient } from "@dxos/react-client";
|
|
9
|
+
import { Icon, IconButton } from "@dxos/react-ui";
|
|
10
|
+
import { ResizeHandle, resizeAttributes, sizeStyle } from "@dxos/react-ui-dnd";
|
|
11
|
+
var HEIGHT_PATTERN = /^(.*)\|(\d+)$/;
|
|
12
|
+
var parseEmbedLabel = (alt) => {
|
|
13
|
+
const match = HEIGHT_PATTERN.exec(alt ?? "");
|
|
14
|
+
if (match) {
|
|
15
|
+
const height = Number.parseInt(match[2], 10);
|
|
16
|
+
if (Number.isFinite(height) && height > 0) {
|
|
17
|
+
return {
|
|
18
|
+
baseLabel: match[1],
|
|
19
|
+
height
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
baseLabel: alt ?? ""
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
var formatEmbedLabel = (baseLabel, height) => height != null ? `${baseLabel}|${height}` : baseLabel;
|
|
28
|
+
var MIN_SIZE = 6;
|
|
29
|
+
var FALLBACK_SIZE = 320;
|
|
30
|
+
var scrollTopIntoViewIfNeeded = (element) => {
|
|
31
|
+
let parent = element.parentElement;
|
|
32
|
+
while (parent) {
|
|
33
|
+
const { overflowY } = getComputedStyle(parent);
|
|
34
|
+
if ((overflowY === "auto" || overflowY === "scroll" || overflowY === "overlay") && parent.scrollHeight > parent.clientHeight) {
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
parent = parent.parentElement;
|
|
38
|
+
}
|
|
39
|
+
const elementTop = element.getBoundingClientRect().top;
|
|
40
|
+
const viewTop = parent ? parent.getBoundingClientRect().top : 0;
|
|
41
|
+
const viewBottom = parent ? parent.getBoundingClientRect().bottom : window.innerHeight;
|
|
42
|
+
if (elementTop < viewTop || elementTop > viewBottom) {
|
|
43
|
+
element.scrollIntoView({
|
|
44
|
+
block: "start",
|
|
45
|
+
inline: "nearest"
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
var PreviewComponent = ({ dxn, label: alt, onOpen, view, range }) => {
|
|
50
|
+
const client = useClient();
|
|
51
|
+
const { invokePromise } = useOperationInvoker();
|
|
52
|
+
const containerRef = useRef(null);
|
|
53
|
+
const uri = dxn ? URI.make(dxn) : void 0;
|
|
54
|
+
const subject = uri ? client.graph.makeRef(uri).target : void 0;
|
|
55
|
+
const remSize = useMemo(() => parseFloat(getComputedStyle(document.documentElement).fontSize) || 16, []);
|
|
56
|
+
const { height } = parseEmbedLabel(alt);
|
|
57
|
+
const [size, setSize] = useState(height != null ? height / remSize : "min-content");
|
|
58
|
+
const extrinsic = size !== "min-content";
|
|
59
|
+
const data = useMemo(() => subject ? {
|
|
60
|
+
subject,
|
|
61
|
+
attendableId: dxn,
|
|
62
|
+
extrinsic
|
|
63
|
+
} : void 0, [
|
|
64
|
+
subject,
|
|
65
|
+
dxn,
|
|
66
|
+
extrinsic
|
|
67
|
+
]);
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
setSize(height != null ? height / remSize : "min-content");
|
|
70
|
+
}, [
|
|
71
|
+
height,
|
|
72
|
+
remSize
|
|
73
|
+
]);
|
|
74
|
+
const handleResize = useCallback((next, commit) => {
|
|
75
|
+
setSize(next);
|
|
76
|
+
if (!commit || typeof next !== "number" || !view) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const doc = view.state.doc.toString();
|
|
80
|
+
const marker = `](${dxn})`;
|
|
81
|
+
let open = -1;
|
|
82
|
+
let close = -1;
|
|
83
|
+
for (let at = doc.indexOf(marker); at >= 0; at = doc.indexOf(marker, at + marker.length)) {
|
|
84
|
+
const start = doc.lastIndexOf("`;
|
|
95
|
+
view.dispatch({
|
|
96
|
+
changes: {
|
|
97
|
+
from: open,
|
|
98
|
+
to: close + marker.length,
|
|
99
|
+
insert
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
requestAnimationFrame(() => {
|
|
103
|
+
if (containerRef.current) {
|
|
104
|
+
scrollTopIntoViewIfNeeded(containerRef.current);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}, [
|
|
108
|
+
view,
|
|
109
|
+
range,
|
|
110
|
+
dxn,
|
|
111
|
+
remSize
|
|
112
|
+
]);
|
|
113
|
+
const handleOpen = useCallback(() => {
|
|
114
|
+
if (!uri || !subject) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (onOpen) {
|
|
118
|
+
onOpen(uri);
|
|
119
|
+
} else {
|
|
120
|
+
void invokePromise?.(LayoutOperation.Open, {
|
|
121
|
+
subject: [
|
|
122
|
+
Paths.getObjectPathFromObject(subject)
|
|
123
|
+
],
|
|
124
|
+
navigation: "immediate"
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}, [
|
|
128
|
+
uri,
|
|
129
|
+
subject,
|
|
130
|
+
onOpen,
|
|
131
|
+
invokePromise
|
|
132
|
+
]);
|
|
133
|
+
if (!uri || !subject || !data) {
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
const objectLabel = Obj.getLabel(subject);
|
|
137
|
+
const objectIcon = Obj.getIcon(subject);
|
|
138
|
+
return /* @__PURE__ */ React.createElement("div", {
|
|
139
|
+
className: "relative grid scroll-mt-16",
|
|
140
|
+
style: sizeStyle(size, "vertical"),
|
|
141
|
+
...resizeAttributes,
|
|
142
|
+
ref: containerRef
|
|
143
|
+
}, /* @__PURE__ */ React.createElement("div", {
|
|
144
|
+
className: "grid overflow-hidden border border-subdued-separator rounded-md"
|
|
145
|
+
}, /* @__PURE__ */ React.createElement(Surface.Surface, {
|
|
146
|
+
type: AppSurface.Section,
|
|
147
|
+
data,
|
|
148
|
+
limit: 1
|
|
149
|
+
})), /* @__PURE__ */ React.createElement("div", {
|
|
150
|
+
className: "absolute top-1 right-1 flex items-center justify-end gap-1"
|
|
151
|
+
}, /* @__PURE__ */ React.createElement("span", {
|
|
152
|
+
className: "dx-tag dx-tag--neutral flex items-center gap-1"
|
|
153
|
+
}, objectIcon && /* @__PURE__ */ React.createElement(Icon, {
|
|
154
|
+
icon: objectIcon.icon,
|
|
155
|
+
size: 4
|
|
156
|
+
}), objectLabel), /* @__PURE__ */ React.createElement(IconButton, {
|
|
157
|
+
density: "sm",
|
|
158
|
+
icon: "ph--arrow-square-out--regular",
|
|
159
|
+
iconOnly: true,
|
|
160
|
+
label: "Open",
|
|
161
|
+
variant: "ghost",
|
|
162
|
+
onClick: handleOpen
|
|
163
|
+
})), /* @__PURE__ */ React.createElement(ResizeHandle, {
|
|
164
|
+
side: "block-end",
|
|
165
|
+
fallbackSize: FALLBACK_SIZE,
|
|
166
|
+
minSize: MIN_SIZE,
|
|
167
|
+
size,
|
|
168
|
+
onSizeChange: handleResize
|
|
169
|
+
}));
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
export {
|
|
173
|
+
PreviewComponent
|
|
174
|
+
};
|
|
175
|
+
//# sourceMappingURL=chunk-YJF6XOXX.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/components/PreviewComponent/PreviewComponent.tsx"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { Surface, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { LayoutOperation, Paths } from '@dxos/app-toolkit';\nimport { AppSurface } from '@dxos/app-toolkit/ui';\nimport { Obj } from '@dxos/echo';\nimport { URI } from '@dxos/keys';\nimport { useClient } from '@dxos/react-client';\nimport { Icon, IconButton } from '@dxos/react-ui';\nimport { ResizeHandle, type Size, resizeAttributes, sizeStyle } from '@dxos/react-ui-dnd';\nimport { type XmlWidgetProps } from '@dxos/ui-editor';\n\nexport type PreviewComponentProps = XmlWidgetProps<{\n label: string;\n dxn: string;\n block?: boolean;\n suggest?: boolean;\n onOpen?: (dxn: URI.URI) => void;\n}>;\n\n// Persisted height (px) lives in the image alt text after the label, Obsidian-style: ``.\nconst HEIGHT_PATTERN = /^(.*)\\|(\\d+)$/;\n\nconst parseEmbedLabel = (alt: string): { baseLabel: string; height?: number } => {\n const match = HEIGHT_PATTERN.exec(alt ?? '');\n if (match) {\n const height = Number.parseInt(match[2], 10);\n if (Number.isFinite(height) && height > 0) {\n return { baseLabel: match[1], height };\n }\n }\n return { baseLabel: alt ?? '' };\n};\n\nconst formatEmbedLabel = (baseLabel: string, height?: number): string =>\n height != null ? `${baseLabel}|${height}` : baseLabel;\n\nconst MIN_SIZE = 6;\nconst FALLBACK_SIZE = 320;\n\n/** Scroll the element's top into view (honoring its `scroll-margin`) only if that top is not already visible. */\nconst scrollTopIntoViewIfNeeded = (element: HTMLElement): void => {\n let parent = element.parentElement;\n while (parent) {\n const { overflowY } = getComputedStyle(parent);\n if (\n (overflowY === 'auto' || overflowY === 'scroll' || overflowY === 'overlay') &&\n parent.scrollHeight > parent.clientHeight\n ) {\n break;\n }\n parent = parent.parentElement;\n }\n const elementTop = element.getBoundingClientRect().top;\n const viewTop = parent ? parent.getBoundingClientRect().top : 0;\n const viewBottom = parent ? parent.getBoundingClientRect().bottom : window.innerHeight;\n if (elementTop < viewTop || elementTop > viewBottom) {\n element.scrollIntoView({ block: 'start', inline: 'nearest' });\n }\n};\n\n/**\n * Registry-backed block widget for URL-scheme preview slots.\n * Replaces the addBlockContainer callback pattern.\n * Used as the Component entry in a urlSchemes XmlWidgetDef.\n */\nexport const PreviewComponent = ({ dxn, label: alt, onOpen, view, range }: PreviewComponentProps) => {\n const client = useClient();\n const { invokePromise } = useOperationInvoker();\n const containerRef = useRef<HTMLDivElement>(null);\n const uri = dxn ? URI.make(dxn) : undefined;\n const subject = uri ? client.graph.makeRef<Obj.Unknown>(uri).target : undefined;\n\n // px per rem; ResizeHandle works in rem while the persisted height is in px.\n const remSize = useMemo(() => parseFloat(getComputedStyle(document.documentElement).fontSize) || 16, []);\n const { height } = parseEmbedLabel(alt);\n\n // `min-content` keeps the embed at its intrinsic height until the user resizes it; the handle then\n // measures the rendered box and switches to an explicit height.\n const [size, setSize] = useState<Size>(height != null ? height / remSize : 'min-content');\n\n // Tell the surface it is sized by its container (vs. intrinsic) so content (e.g. an image) can fit.\n const extrinsic = size !== 'min-content';\n const data = useMemo(\n () => (subject ? { subject, attendableId: dxn, extrinsic } : undefined),\n [subject, dxn, extrinsic],\n );\n useEffect(() => {\n setSize(height != null ? height / remSize : 'min-content');\n }, [height, remSize]);\n\n // Persist the height (px) into the alt text on drop by rewriting the image node in the source. The\n // node bounds and base label are re-derived from the live document (the captured `range`/`label`\n // can lag a prior edit before React re-renders the widget). When the same object is transcluded\n // more than once, the node whose start is NEAREST the widget's range is chosen so a duplicate\n // embed isn't rewritten by mistake.\n const handleResize = useCallback(\n (next: Size, commit?: boolean) => {\n setSize(next);\n if (!commit || typeof next !== 'number' || !view) {\n return;\n }\n const doc = view.state.doc.toString();\n const marker = `](${dxn})`;\n let open = -1;\n let close = -1;\n for (let at = doc.indexOf(marker); at >= 0; at = doc.indexOf(marker, at + marker.length)) {\n const start = doc.lastIndexOf('`;\n view.dispatch({ changes: { from: open, to: close + marker.length, insert } });\n // After the resized box has laid out, bring its top into frame — but only if that top scrolled\n // out of view. Scroll the element itself (not the CM view) so it works whichever ancestor\n // actually scrolls (cm-scroller or an outer panel); defer a frame so the new height applies first.\n requestAnimationFrame(() => {\n if (containerRef.current) {\n scrollTopIntoViewIfNeeded(containerRef.current);\n }\n });\n },\n [view, range, dxn, remSize],\n );\n\n // Open the referenced object: defer to the caller's handler when provided, else navigate to it.\n const handleOpen = useCallback(() => {\n if (!uri || !subject) {\n return;\n }\n if (onOpen) {\n onOpen(uri);\n } else {\n void invokePromise?.(LayoutOperation.Open, {\n subject: [Paths.getObjectPathFromObject(subject)],\n navigation: 'immediate',\n });\n }\n }, [uri, subject, onOpen, invokePromise]);\n\n if (!uri || !subject || !data) {\n return null;\n }\n\n const objectLabel = Obj.getLabel(subject);\n const objectIcon = Obj.getIcon(subject);\n\n // Frame transcluded block embeds so they read as a self-contained card within the document flow.\n // The clip/border live on an inner element so they don't clip the resize handle (which straddles the\n // bottom edge); the inner grid stretches the surface to fill the resizable box, overriding any\n // intrinsic aspect.\n return (\n <div\n className='relative grid scroll-mt-16'\n style={sizeStyle(size, 'vertical')}\n {...resizeAttributes}\n ref={containerRef}\n >\n <div className='grid overflow-hidden border border-subdued-separator rounded-md'>\n <Surface.Surface type={AppSurface.Section} data={data} limit={1} />\n </div>\n <div className='absolute top-1 right-1 flex items-center justify-end gap-1'>\n <span className='dx-tag dx-tag--neutral flex items-center gap-1'>\n {objectIcon && <Icon icon={objectIcon.icon} size={4} />}\n {objectLabel}\n </span>\n <IconButton\n density='sm'\n icon='ph--arrow-square-out--regular'\n iconOnly\n label='Open'\n variant='ghost'\n onClick={handleOpen}\n />\n </div>\n <ResizeHandle\n side='block-end'\n fallbackSize={FALLBACK_SIZE}\n minSize={MIN_SIZE}\n size={size}\n onSizeChange={handleResize}\n />\n </div>\n );\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["React", "useCallback", "useEffect", "useMemo", "useRef", "useState", "Surface", "useOperationInvoker", "LayoutOperation", "Paths", "AppSurface", "Obj", "URI", "useClient", "Icon", "IconButton", "ResizeHandle", "resizeAttributes", "sizeStyle", "HEIGHT_PATTERN", "parseEmbedLabel", "alt", "match", "exec", "height", "Number", "parseInt", "isFinite", "baseLabel", "formatEmbedLabel", "MIN_SIZE", "FALLBACK_SIZE", "scrollTopIntoViewIfNeeded", "element", "parent", "parentElement", "overflowY", "getComputedStyle", "scrollHeight", "clientHeight", "elementTop", "getBoundingClientRect", "top", "viewTop", "viewBottom", "bottom", "window", "innerHeight", "scrollIntoView", "block", "inline", "PreviewComponent", "dxn", "label", "onOpen", "view", "range", "client", "invokePromise", "containerRef", "uri", "make", "undefined", "subject", "graph", "makeRef", "target", "remSize", "parseFloat", "document", "documentElement", "fontSize", "size", "setSize", "extrinsic", "data", "attendableId", "handleResize", "next", "commit", "doc", "state", "toString", "marker", "open", "close", "at", "indexOf", "length", "start", "lastIndexOf", "Math", "abs", "from", "currentBaseLabel", "slice", "insert", "round", "dispatch", "changes", "to", "requestAnimationFrame", "current", "handleOpen", "Open", "getObjectPathFromObject", "navigation", "objectLabel", "getLabel", "objectIcon", "getIcon", "div", "className", "style", "ref", "type", "Section", "limit", "span", "icon", "density", "iconOnly", "variant", "onClick", "side", "fallbackSize", "minSize", "onSizeChange"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// src/capabilities/skill-definition.ts
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import { Capability } from "@dxos/app-framework";
|
|
4
|
+
import { AppCapabilities } from "@dxos/app-toolkit";
|
|
5
|
+
import { MarkdownSkill } from "#skills";
|
|
6
|
+
var skillDefinition = () => Effect.succeed([
|
|
7
|
+
Capability.contributes(AppCapabilities.SkillDefinition, MarkdownSkill)
|
|
8
|
+
]);
|
|
9
|
+
var skill_definition_default = skillDefinition;
|
|
10
|
+
|
|
11
|
+
export {
|
|
12
|
+
skill_definition_default
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=chunk-YMBC62S7.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/capabilities/skill-definition.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { AppCapabilities } from '@dxos/app-toolkit';\n\nimport { MarkdownSkill } from '#skills';\n\nconst skillDefinition = () => Effect.succeed([Capability.contributes(AppCapabilities.SkillDefinition, MarkdownSkill)]);\n\nexport default skillDefinition;\n"],
|
|
5
|
+
"mappings": ";AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,uBAAuB;AAEhC,SAASC,qBAAqB;AAE9B,IAAMC,kBAAkB,MAAaC,eAAQ;EAACJ,WAAWK,YAAYJ,gBAAgBK,iBAAiBJ,aAAAA;CAAe;AAErH,IAAA,2BAAeC;",
|
|
6
|
+
"names": ["Effect", "Capability", "AppCapabilities", "MarkdownSkill", "skillDefinition", "succeed", "contributes", "SkillDefinition"]
|
|
7
|
+
}
|
|
@@ -5,16 +5,16 @@ import {
|
|
|
5
5
|
// src/types/Markdown.ts
|
|
6
6
|
var Markdown_exports = {};
|
|
7
7
|
__export(Markdown_exports, {
|
|
8
|
-
BLUEPRINT_KEY: () => BLUEPRINT_KEY,
|
|
9
8
|
Document: () => Document,
|
|
9
|
+
SKILL_KEY: () => SKILL_KEY,
|
|
10
10
|
Settings: () => Settings2,
|
|
11
11
|
make: () => make
|
|
12
12
|
});
|
|
13
13
|
import * as Schema2 from "effect/Schema";
|
|
14
14
|
import { AppAnnotation } from "@dxos/app-toolkit";
|
|
15
|
-
import {
|
|
15
|
+
import { Annotation, DXN, Obj, Ref, Type } from "@dxos/echo";
|
|
16
16
|
import { DescriptionAnnotation, FormInputAnnotation, LabelAnnotation } from "@dxos/echo/Annotation";
|
|
17
|
-
import { Text } from "@dxos/schema";
|
|
17
|
+
import { CollectionItemAnnotation, Text } from "@dxos/schema";
|
|
18
18
|
|
|
19
19
|
// src/types/Settings.ts
|
|
20
20
|
var Settings_exports = {};
|
|
@@ -65,9 +65,9 @@ var Settings = Schema.mutable(Schema.Struct({
|
|
|
65
65
|
}));
|
|
66
66
|
|
|
67
67
|
// src/types/Markdown.ts
|
|
68
|
-
var
|
|
68
|
+
var SKILL_KEY = "org.dxos.skill.markdown";
|
|
69
69
|
var Settings2 = Settings;
|
|
70
|
-
var Document = Schema2.Struct({
|
|
70
|
+
var Document = class extends Type.makeObject(DXN.make("org.dxos.type.document", "0.1.0"))(Schema2.Struct({
|
|
71
71
|
name: Schema2.optional(Schema2.String),
|
|
72
72
|
description: Schema2.optional(Schema2.String),
|
|
73
73
|
fallbackName: Schema2.String.pipe(FormInputAnnotation.set(false), Schema2.optional),
|
|
@@ -78,11 +78,12 @@ var Document = Schema2.Struct({
|
|
|
78
78
|
]), DescriptionAnnotation.set("description"), Annotation.IconAnnotation.set({
|
|
79
79
|
icon: "ph--text-aa--regular",
|
|
80
80
|
hue: "indigo"
|
|
81
|
-
}), AppAnnotation.
|
|
82
|
-
|
|
81
|
+
}), AppAnnotation.SkillsAnnotation.set([
|
|
82
|
+
SKILL_KEY
|
|
83
83
|
]), AppAnnotation.GraphPropsAnnotation.set({
|
|
84
84
|
managesAutofocus: true
|
|
85
|
-
}),
|
|
85
|
+
}), AppAnnotation.CardAnnotation.set(true), CollectionItemAnnotation.set(true))) {
|
|
86
|
+
};
|
|
86
87
|
var make = ({ content = "", ...props } = {}) => {
|
|
87
88
|
const doc = Obj.make(Document, {
|
|
88
89
|
...props,
|
|
@@ -141,15 +142,15 @@ __export(MarkdownOperation_exports, {
|
|
|
141
142
|
import * as Schema4 from "effect/Schema";
|
|
142
143
|
import { Capability as Capability2 } from "@dxos/app-framework";
|
|
143
144
|
import { Operation } from "@dxos/compute";
|
|
144
|
-
import { Database,
|
|
145
|
+
import { Database, DXN as DXN2, Ref as Ref2, Type as Type2 } from "@dxos/echo";
|
|
145
146
|
import { EditorViewMode as EditorViewMode2 } from "@dxos/ui-editor/types";
|
|
146
147
|
import { trim } from "@dxos/util";
|
|
147
148
|
import { meta as meta3 } from "#meta";
|
|
148
149
|
var makeKey = (name) => DXN2.make(`${meta3.profile.key}.operation.${name}`);
|
|
149
150
|
var Edit = Schema4.Struct({
|
|
150
|
-
oldString: Schema4.String.annotations({
|
|
151
|
-
description: "The text to find in the document."
|
|
152
|
-
}),
|
|
151
|
+
oldString: Schema4.optional(Schema4.String.annotations({
|
|
152
|
+
description: "The text to find in the document. Set to undefined to append the newString to the end of the document."
|
|
153
|
+
})),
|
|
153
154
|
newString: Schema4.String.annotations({
|
|
154
155
|
description: "The text to replace it with."
|
|
155
156
|
}),
|
|
@@ -264,7 +265,7 @@ var Update = Operation.make({
|
|
|
264
265
|
description: "The ID of the markdown document."
|
|
265
266
|
}),
|
|
266
267
|
edits: Schema4.Array(Edit).annotations({
|
|
267
|
-
description: "The edits to apply to the document. Each edit finds oldString and replaces it with newString."
|
|
268
|
+
description: "The edits to apply to the document. Each edit finds oldString and replaces it with newString; omit oldString to append newString to the end."
|
|
268
269
|
})
|
|
269
270
|
}),
|
|
270
271
|
output: Schema4.Struct({
|
|
@@ -282,4 +283,4 @@ export {
|
|
|
282
283
|
MarkdownEvents_exports,
|
|
283
284
|
MarkdownOperation_exports
|
|
284
285
|
};
|
|
285
|
-
//# sourceMappingURL=chunk-
|
|
286
|
+
//# sourceMappingURL=chunk-ZJ3GWRUJ.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/types/Markdown.ts", "../../../src/types/Settings.ts", "../../../src/types/MarkdownCapabilities.ts", "../../../src/types/MarkdownEvents.ts", "../../../src/types/MarkdownOperation.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Schema from 'effect/Schema';\n\nimport { AppAnnotation } from '@dxos/app-toolkit';\nimport { Annotation, DXN, Obj, Ref, Type } from '@dxos/echo';\nimport { DescriptionAnnotation, FormInputAnnotation, LabelAnnotation } from '@dxos/echo/Annotation';\nimport { CollectionItemAnnotation, Text } from '@dxos/schema';\n\nexport const SKILL_KEY = 'org.dxos.skill.markdown';\n\n// Re-export Settings as merged const/type (not as namespace).\nimport * as SettingsModule from './Settings';\nexport const Settings = SettingsModule.Settings;\nexport type Settings = SettingsModule.Settings;\n\n/**\n * Document Item type.\n */\nexport class Document extends Type.makeObject<Document>(DXN.make('org.dxos.type.document', '0.1.0'))(\n Schema.Struct({\n name: Schema.optional(Schema.String),\n description: Schema.optional(Schema.String),\n fallbackName: Schema.String.pipe(FormInputAnnotation.set(false), Schema.optional),\n content: Ref.Ref(Text.Text).pipe(FormInputAnnotation.set(false)),\n }).pipe(\n LabelAnnotation.set(['name', 'fallbackName']),\n DescriptionAnnotation.set('description'),\n Annotation.IconAnnotation.set({ icon: 'ph--text-aa--regular', hue: 'indigo' }),\n AppAnnotation.SkillsAnnotation.set([SKILL_KEY]),\n AppAnnotation.GraphPropsAnnotation.set({ managesAutofocus: true }),\n AppAnnotation.CardAnnotation.set(true),\n CollectionItemAnnotation.set(true),\n ),\n) {}\n\n/**\n * Document factory.\n */\nexport const make = ({\n content = '',\n ...props\n}: Partial<{ name: string; fallbackName: string; content: string }> = {}) => {\n const doc = Obj.make(Document, { ...props, content: Ref.make(Text.make({ content })) });\n // TODO(dmaretskyi): We need a better way to set parents when creating hierarchies.\n Obj.setParent(doc.content.target!, doc);\n return doc;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nimport { EditorInputMode, EditorViewMode } from '@dxos/ui-editor/types';\n\n/**\n * Determines how new comment threads on markdown documents are wired up to\n * the comment-thread AI agent (plugin-thread). The agent's identity (name,\n * DID) is resolved at runtime via the AgentIdentity capability — this\n * setting only controls whether and when the agent fires.\n *\n * - `off`: comments are plain user-only threads (no agent).\n * - `auto`: every user message in a thread triggers an agent response.\n * - `mention`: agent only responds when the message contains `@{agentName}`.\n */\nexport const CommentAgentMode = Schema.Union(Schema.Literal('off'), Schema.Literal('auto'), Schema.Literal('mention'));\nexport type CommentAgentMode = Schema.Schema.Type<typeof CommentAgentMode>;\n\n/**\n * Plugin settings.\n */\nexport const Settings = Schema.mutable(\n Schema.Struct({\n defaultViewMode: EditorViewMode.annotations({\n title: 'Default view mode',\n description: 'Set whether documents open in editing or read-only mode.',\n }),\n commentAgentMode: Schema.optional(\n CommentAgentMode.annotations({\n title: 'Comment agent mode',\n description:\n \"How new comment threads on markdown documents are processed: 'off' (no AI), 'auto' (AI responds to every user message), or 'mention' (AI responds only on @mention).\",\n }),\n ),\n editorInputMode: Schema.optional(\n EditorInputMode.annotations({\n title: 'Editor input mode',\n description: 'Choose keyboard bindings for the editor.',\n }),\n ),\n toolbar: Schema.optional(\n Schema.Boolean.annotations({\n title: 'Show toolbar',\n description: 'Display a formatting toolbar above the editor.',\n }),\n ),\n numberedHeadings: Schema.optional(\n Schema.Boolean.annotations({\n title: 'Numbered headings',\n description: 'Automatically number heading levels in the document.',\n }),\n ),\n folding: Schema.optional(\n Schema.Boolean.annotations({\n title: 'Folding',\n description: 'Allow collapsing and expanding sections by heading.',\n }),\n ),\n experimental: Schema.optional(\n Schema.Boolean.annotations({\n title: 'Enable experimental features',\n description: 'Turn on features that are still in development.',\n }),\n ),\n debug: Schema.optional(\n Schema.Boolean.annotations({\n title: 'Enable debugging features',\n description: 'Show developer tools and diagnostics for the editor.',\n }),\n ),\n snippets: Schema.optional(\n Schema.String.annotations({\n title: 'Snippets',\n description: 'Input snippets to replay for testing purposes.',\n }),\n ),\n }),\n);\n\nexport interface Settings extends Schema.Schema.Type<typeof Settings> {}\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport { type EditorView } from '@codemirror/view';\nimport { type Atom } from '@effect-atom/atom-react';\nimport * as Schema from 'effect/Schema';\n\nimport { Capability } from '@dxos/app-framework';\nimport { type EditorStateStore } from '@dxos/ui-editor';\nimport { type EditorViewMode } from '@dxos/ui-editor/types';\n\nimport { meta } from '#meta';\n\nimport type * as Markdown from './Markdown';\nimport { type MarkdownExtensionProvider } from './types';\n\n/** Schema for persisted markdown state. */\nexport const StateSchema = Schema.mutable(\n Schema.Struct({\n viewMode: Schema.Record({ key: Schema.String, value: Schema.String }),\n }),\n);\n\nexport type MarkdownState = {\n viewMode: Record<string, EditorViewMode>;\n};\n\nexport type EditorViewEntry = { view: EditorView; documentId: string };\n\nexport type EditorViewRegistry = {\n register: (attendableId: string, view: EditorView, documentId: string) => void;\n unregister: (attendableId: string) => void;\n get: (attendableId: string) => EditorViewEntry | undefined;\n};\n\nexport const Settings = Capability.make<Atom.Writable<Markdown.Settings>>(`${meta.profile.key}.capability.settings`);\n\n/** Persisted state atom for view mode per document. */\nexport const State = Capability.make<Atom.Writable<MarkdownState>>(`${meta.profile.key}.capability.state`);\n\n/** Editor state store for cursor positions, scroll state, etc. */\nexport const EditorState = Capability.make<EditorStateStore>(`${meta.profile.key}.capability.editor-state`);\n\n/** Registry of active EditorView instances keyed by attendable ID. */\nexport const EditorViews = Capability.make<EditorViewRegistry>(`${meta.profile.key}.capability.editor-views`);\n\n// TODO(burdon): Move to ./types (external API)?\nexport const ExtensionProvider = Capability.make<MarkdownExtensionProvider[]>(\n `${meta.profile.key}.capability.extensions`,\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport { type ActivationEvent } from '@dxos/app-framework';\nimport { AppActivationEvents } from '@dxos/app-toolkit';\n\nimport { meta } from '#meta';\n\nexport const SetupExtensions: ActivationEvent.ActivationEvent = AppActivationEvents.createStateEvent(\n `${meta.profile.key}.event.setup-extensions`,\n);\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nimport { Capability } from '@dxos/app-framework';\nimport { Operation } from '@dxos/compute';\nimport { Database, DXN, Ref, Type } from '@dxos/echo';\nimport { EditorViewMode } from '@dxos/ui-editor/types';\nimport { trim } from '@dxos/util';\n\nimport { meta } from '#meta';\n\nimport * as Markdown from './Markdown';\n\nconst makeKey = (name: string) => DXN.make(`${meta.profile.key}.operation.${name}`);\n\n// The edit descriptions feed the markdown skill's LLM tool definition (and its memoized\n// fixtures), so the schema stays local and context-tuned; the apply logic is shared via `Text.apply`.\nconst Edit = Schema.Struct({\n oldString: Schema.optional(\n Schema.String.annotations({\n description:\n 'The text to find in the document. Set to undefined to append the newString to the end of the document.',\n }),\n ),\n newString: Schema.String.annotations({\n description: 'The text to replace it with.',\n }),\n replaceAll: Schema.optional(Schema.Boolean).annotations({\n description: 'If true, replaces all occurrences. Defaults to false (first occurrence only).',\n }),\n});\n\nexport const Create = Operation.make({\n meta: {\n key: DXN.make('org.dxos.function.markdown.create'),\n name: 'Create',\n description: 'Creates a new markdown document and adds it to the space.',\n icon: 'ph--file-text--regular',\n },\n input: Schema.Struct({\n name: Schema.String,\n content: Schema.String,\n }),\n output: Schema.Struct({\n id: Schema.String.annotations({\n description: 'The DXN of the created document.',\n }),\n }),\n services: [Database.Service],\n});\n\nexport const CreateMarkdown = Operation.make({\n meta: {\n key: makeKey('create'),\n name: 'Create Markdown Document',\n icon: 'ph--file-text--regular',\n },\n services: [Capability.Service],\n input: Schema.Struct({\n name: Schema.optional(Schema.String),\n content: Schema.optional(Schema.String),\n }),\n output: Schema.Struct({\n object: Type.getSchema(Markdown.Document),\n }),\n});\n\nexport const Open = Operation.make({\n meta: {\n key: DXN.make('org.dxos.function.markdown.open'),\n name: 'Open',\n description: 'Opens and reads the contents of a new markdown document.',\n icon: 'ph--arrow-square-out--regular',\n },\n input: Schema.Struct({\n doc: Ref.Ref(Markdown.Document).annotations({\n description: 'The ID of the markdown document.',\n }),\n }),\n output: Schema.Struct({\n content: Schema.String,\n }),\n services: [Database.Service],\n});\n\nexport const ScrollToAnchor = Operation.make({\n meta: {\n key: makeKey('scrollToAnchor'),\n name: 'Scroll To Anchor',\n icon: 'ph--anchor-simple--regular',\n },\n services: [Capability.Service],\n input: Schema.Struct({\n subject: Schema.String.annotations({ description: 'Attendable ID of the markdown editor.' }),\n cursor: Schema.String.annotations({ description: 'Cursor position to scroll to.' }),\n ref: Schema.optional(Schema.String.annotations({ description: 'Reference ID (e.g. thread ID).' })),\n }),\n output: Schema.Void,\n});\n\n// TODO(wittjosiah): This appears to be unused.\nexport const SetViewMode = Operation.make({\n meta: { key: makeKey('setViewMode'), name: 'Set View Mode', icon: 'ph--layout--regular' },\n services: [Capability.Service],\n input: Schema.Struct({\n id: Schema.String,\n viewMode: EditorViewMode,\n }),\n output: Schema.Void,\n});\n\nexport const Update = Operation.make({\n meta: {\n key: DXN.make('org.dxos.function.markdown.update'),\n name: 'Update',\n description: trim`\n Applies a set of edits to the markdown document.\n `,\n icon: 'ph--pencil-simple--regular',\n },\n input: Schema.Struct({\n doc: Ref.Ref(Markdown.Document).annotations({\n description: 'The ID of the markdown document.',\n }),\n edits: Schema.Array(Edit).annotations({\n description:\n 'The edits to apply to the document. Each edit finds oldString and replaces it with newString; omit oldString to append newString to the end.',\n }),\n }),\n output: Schema.Struct({\n newContent: Schema.String,\n }),\n services: [Database.Service],\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Settings", "Schema", "AppAnnotation", "Annotation", "DXN", "Obj", "Ref", "Type", "DescriptionAnnotation", "FormInputAnnotation", "LabelAnnotation", "CollectionItemAnnotation", "Text", "Schema", "EditorInputMode", "EditorViewMode", "CommentAgentMode", "Union", "Literal", "Settings", "mutable", "Struct", "defaultViewMode", "annotations", "title", "description", "commentAgentMode", "optional", "editorInputMode", "toolbar", "Boolean", "numberedHeadings", "folding", "experimental", "debug", "snippets", "String", "SKILL_KEY", "Settings", "Document", "Type", "makeObject", "DXN", "make", "Struct", "name", "optional", "String", "description", "fallbackName", "pipe", "FormInputAnnotation", "set", "content", "Ref", "Text", "LabelAnnotation", "DescriptionAnnotation", "Annotation", "IconAnnotation", "icon", "hue", "AppAnnotation", "SkillsAnnotation", "GraphPropsAnnotation", "managesAutofocus", "CardAnnotation", "CollectionItemAnnotation", "props", "doc", "Obj", "setParent", "target", "Settings", "Schema", "Capability", "meta", "StateSchema", "mutable", "Struct", "viewMode", "Record", "key", "String", "value", "make", "profile", "State", "EditorState", "EditorViews", "ExtensionProvider", "AppActivationEvents", "meta", "SetupExtensions", "createStateEvent", "profile", "key", "Schema", "Capability", "Operation", "Database", "DXN", "Ref", "Type", "EditorViewMode", "trim", "meta", "makeKey", "name", "DXN", "make", "meta", "profile", "key", "Edit", "Struct", "oldString", "optional", "String", "annotations", "description", "newString", "replaceAll", "Boolean", "Create", "Operation", "icon", "input", "content", "output", "id", "services", "Database", "Service", "CreateMarkdown", "Capability", "object", "Type", "getSchema", "Document", "Open", "doc", "Ref", "ScrollToAnchor", "subject", "cursor", "ref", "Void", "SetViewMode", "viewMode", "EditorViewMode", "Update", "trim", "edits", "Array", "newContent"]
|
|
7
|
+
}
|
|
@@ -5,7 +5,8 @@ import * as Effect from "effect/Effect";
|
|
|
5
5
|
import { Capability } from "@dxos/app-framework";
|
|
6
6
|
import { AppCapabilities } from "@dxos/app-toolkit";
|
|
7
7
|
import { Type } from "@dxos/echo";
|
|
8
|
-
import {
|
|
8
|
+
import { getTextInRange } from "@dxos/echo-client";
|
|
9
|
+
import { Doc } from "@dxos/echo-doc";
|
|
9
10
|
import { MarkdownOperation } from "#types";
|
|
10
11
|
import { Markdown } from "#types";
|
|
11
12
|
var activate = Effect.fnUntraced(function* () {
|
|
@@ -14,9 +15,10 @@ var activate = Effect.fnUntraced(function* () {
|
|
|
14
15
|
comments: "anchored",
|
|
15
16
|
selectionMode: "multi-range",
|
|
16
17
|
getAnchorLabel: (doc, anchor) => {
|
|
17
|
-
|
|
18
|
+
const target = doc.content?.target;
|
|
19
|
+
if (target) {
|
|
18
20
|
const [start, end] = anchor.split(":");
|
|
19
|
-
return getTextInRange(
|
|
21
|
+
return getTextInRange(Doc.createAccessor(target, [
|
|
20
22
|
"content"
|
|
21
23
|
]), start, end);
|
|
22
24
|
}
|
|
@@ -29,4 +31,4 @@ var comment_config_default = activate;
|
|
|
29
31
|
export {
|
|
30
32
|
comment_config_default as default
|
|
31
33
|
};
|
|
32
|
-
//# sourceMappingURL=comment-config-
|
|
34
|
+
//# sourceMappingURL=comment-config-M5OGFULS.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/capabilities/comment-config.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { AppCapabilities } from '@dxos/app-toolkit';\nimport { Type } from '@dxos/echo';\nimport { getTextInRange } from '@dxos/echo-client';\nimport { Doc } from '@dxos/echo-doc';\n\nimport { MarkdownOperation } from '#types';\nimport { Markdown } from '#types';\n\nconst activate = Effect.fnUntraced(function* () {\n const config: AppCapabilities.CommentConfig = {\n id: Type.getTypename(Markdown.Document),\n comments: 'anchored',\n selectionMode: 'multi-range',\n getAnchorLabel: (doc: Markdown.Document, anchor: string): string | undefined => {\n const target = doc.content?.target;\n if (target) {\n const [start, end] = anchor.split(':');\n return getTextInRange(Doc.createAccessor(target, ['content']), start, end);\n }\n },\n scrollToAnchor: MarkdownOperation.ScrollToAnchor,\n };\n return Capability.contributes(AppCapabilities.CommentConfig, config);\n});\n\nexport default activate;\n"],
|
|
5
|
+
"mappings": ";;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,uBAAuB;AAChC,SAASC,YAAY;AACrB,SAASC,sBAAsB;AAC/B,SAASC,WAAW;AAEpB,SAASC,yBAAyB;AAClC,SAASC,gBAAgB;AAEzB,IAAMC,WAAkBC,kBAAW,aAAA;AACjC,QAAMC,SAAwC;IAC5CC,IAAIR,KAAKS,YAAYL,SAASM,QAAQ;IACtCC,UAAU;IACVC,eAAe;IACfC,gBAAgB,CAACC,KAAwBC,WAAAA;AACvC,YAAMC,SAASF,IAAIG,SAASD;AAC5B,UAAIA,QAAQ;AACV,cAAM,CAACE,OAAOC,GAAAA,IAAOJ,OAAOK,MAAM,GAAA;AAClC,eAAOnB,eAAeC,IAAImB,eAAeL,QAAQ;UAAC;SAAU,GAAGE,OAAOC,GAAAA;MACxE;IACF;IACAG,gBAAgBnB,kBAAkBoB;EACpC;AACA,SAAOzB,WAAW0B,YAAYzB,gBAAgB0B,eAAelB,MAAAA;AAC/D,CAAA;AAEA,IAAA,yBAAeF;",
|
|
6
|
+
"names": ["Effect", "Capability", "AppCapabilities", "Type", "getTextInRange", "Doc", "MarkdownOperation", "Markdown", "activate", "fnUntraced", "config", "id", "getTypename", "Document", "comments", "selectionMode", "getAnchorLabel", "doc", "anchor", "target", "content", "start", "end", "split", "createAccessor", "scrollToAnchor", "ScrollToAnchor", "contributes", "CommentConfig"]
|
|
7
|
+
}
|
|
@@ -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 as AppSurface2 } 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";
|
|
@@ -24,7 +19,7 @@ import { useCapabilities } from "@dxos/app-framework/ui";
|
|
|
24
19
|
import { AppSurface } from "@dxos/app-toolkit/ui";
|
|
25
20
|
import { useThemeContext, useTranslation } from "@dxos/react-ui";
|
|
26
21
|
import { useTextEditor } from "@dxos/react-ui-editor";
|
|
27
|
-
import {
|
|
22
|
+
import { createBasicExtensions, createMarkdownExtensions, createThemeExtensions, documentSlots, dropFile, editorClassNames, formattingListener, mobileSlots, processEditorPayload, scrollbarAutohide } from "@dxos/ui-editor";
|
|
28
23
|
import { mx } from "@dxos/ui-theme";
|
|
29
24
|
import { isTruthy } from "@dxos/util";
|
|
30
25
|
import { meta } from "#meta";
|
|
@@ -223,21 +218,7 @@ var MarkdownEditorToolbar = composable(({ id, role, getView, customActions, onAc
|
|
|
223
218
|
// src/components/MarkdownEditor/MarkdownEditor.tsx
|
|
224
219
|
var [MarkdownEditorContextProvider, useMarkdownEditorContext] = createContext("MarkdownEditor.Context");
|
|
225
220
|
var MarkdownEditorProvider = ({ children, id, attendableId, object, settings, compact, viewMode, viewState, editorStateStore, extensions: extensionsProp, slashCommandGroups, onLinkQuery, onSelectObject, onAction, onFileUpload, onViewModeChange }) => {
|
|
226
|
-
const [
|
|
227
|
-
const previewOptions = useMemo2(() => ({
|
|
228
|
-
db: Obj.isObject(object) ? Obj.getDatabase(object) : void 0,
|
|
229
|
-
addBlockContainer: (block) => {
|
|
230
|
-
setPreviewBlocks((prev) => [
|
|
231
|
-
...prev,
|
|
232
|
-
block
|
|
233
|
-
]);
|
|
234
|
-
},
|
|
235
|
-
removeBlockContainer: ({ link }) => {
|
|
236
|
-
setPreviewBlocks((prev) => prev.filter(({ link: prevLink }) => prevLink.dxn !== link.dxn));
|
|
237
|
-
}
|
|
238
|
-
}), [
|
|
239
|
-
object
|
|
240
|
-
]);
|
|
221
|
+
const [widgets, setWidgets] = useState2([]);
|
|
241
222
|
const menuOptions = useEditorMenuOptions({
|
|
242
223
|
slashCommandGroups,
|
|
243
224
|
onLinkQuery
|
|
@@ -249,7 +230,7 @@ var MarkdownEditorProvider = ({ children, id, attendableId, object, settings, co
|
|
|
249
230
|
viewMode,
|
|
250
231
|
viewState,
|
|
251
232
|
editorStateStore,
|
|
252
|
-
|
|
233
|
+
setWidgets,
|
|
253
234
|
settings,
|
|
254
235
|
onSelectObject
|
|
255
236
|
});
|
|
@@ -282,7 +263,7 @@ var MarkdownEditorProvider = ({ children, id, attendableId, object, settings, co
|
|
|
282
263
|
attendableId,
|
|
283
264
|
compact,
|
|
284
265
|
viewMode,
|
|
285
|
-
|
|
266
|
+
widgets,
|
|
286
267
|
onAction,
|
|
287
268
|
onFileUpload,
|
|
288
269
|
onViewModeChange
|
|
@@ -291,7 +272,7 @@ var MarkdownEditorProvider = ({ children, id, attendableId, object, settings, co
|
|
|
291
272
|
attendableId,
|
|
292
273
|
compact,
|
|
293
274
|
viewMode,
|
|
294
|
-
|
|
275
|
+
widgets,
|
|
295
276
|
onAction,
|
|
296
277
|
onFileUpload,
|
|
297
278
|
onViewModeChange
|
|
@@ -340,40 +321,20 @@ var MarkdownEditorToolbar2 = (props) => {
|
|
|
340
321
|
MarkdownEditorToolbar2.displayName = MARKDOWN_EDITOR_TOOLBAR_NAME;
|
|
341
322
|
var MARKDOWN_EDITOR_BLOCKS_NAME = "MarkdownEditor.Blocks";
|
|
342
323
|
var MarkdownEditorBlocks = (_props) => {
|
|
343
|
-
const {
|
|
344
|
-
return /* @__PURE__ */ React4.createElement(React4.Fragment, null,
|
|
345
|
-
key:
|
|
346
|
-
|
|
347
|
-
el
|
|
348
|
-
})));
|
|
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))));
|
|
349
328
|
};
|
|
350
329
|
MarkdownEditorBlocks.displayName = MARKDOWN_EDITOR_BLOCKS_NAME;
|
|
351
|
-
var PreviewBlock = ({ el, link }) => {
|
|
352
|
-
const client = useClient();
|
|
353
|
-
const dxn = URI.make(link.dxn);
|
|
354
|
-
const subject = client.graph.makeRef(dxn).target;
|
|
355
|
-
const data = useMemo2(() => ({
|
|
356
|
-
subject
|
|
357
|
-
}), [
|
|
358
|
-
subject
|
|
359
|
-
]);
|
|
360
|
-
return /* @__PURE__ */ createPortal2(/* @__PURE__ */ React4.createElement(Surface.Surface, {
|
|
361
|
-
type: AppSurface2.CardContent,
|
|
362
|
-
data,
|
|
363
|
-
limit: 1
|
|
364
|
-
}), el);
|
|
365
|
-
};
|
|
366
330
|
var MarkdownEditor = {
|
|
367
331
|
Content: MarkdownEditorContent2,
|
|
368
332
|
Toolbar: MarkdownEditorToolbar2,
|
|
369
333
|
Blocks: MarkdownEditorBlocks
|
|
370
334
|
};
|
|
371
|
-
|
|
372
|
-
// src/components/index.ts
|
|
373
|
-
var MarkdownSettings = lazy(() => import("../MarkdownSettings-F5AWRDT3.mjs"));
|
|
374
335
|
export {
|
|
375
336
|
MarkdownEditor,
|
|
376
337
|
MarkdownEditorProvider,
|
|
377
|
-
|
|
338
|
+
PreviewComponent
|
|
378
339
|
};
|
|
379
340
|
//# sourceMappingURL=index.mjs.map
|