@dxos/plugin-markdown 0.8.4-main.67995b8 → 0.8.4-main.ae835ea
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/MarkdownCard-SLM6QZYC.mjs +12 -0
- package/dist/lib/browser/MarkdownCard-SLM6QZYC.mjs.map +7 -0
- package/dist/lib/browser/MarkdownContainer-UZFQC6XY.mjs +15 -0
- package/dist/lib/browser/MarkdownContainer-UZFQC6XY.mjs.map +7 -0
- package/dist/lib/browser/{anchor-sort-Z7JQA7RL.mjs → anchor-sort-4XPPLMZS.mjs} +5 -5
- package/dist/lib/browser/{anchor-sort-Z7JQA7RL.mjs.map → anchor-sort-4XPPLMZS.mjs.map} +1 -1
- package/dist/lib/browser/{app-graph-serializer-ZT5OVF5G.mjs → app-graph-serializer-QQFV4K6P.mjs} +9 -10
- package/dist/lib/browser/app-graph-serializer-QQFV4K6P.mjs.map +7 -0
- package/dist/lib/browser/blueprint-definition-BC5R3T72.mjs +11 -0
- package/dist/lib/browser/blueprint-definition-BC5R3T72.mjs.map +7 -0
- package/dist/lib/browser/{chunk-VMX5SDGW.mjs → chunk-2LLVTQCK.mjs} +6 -5
- package/dist/lib/browser/chunk-2LLVTQCK.mjs.map +7 -0
- package/dist/lib/browser/chunk-3VILQLA4.mjs +95 -0
- package/dist/lib/browser/chunk-3VILQLA4.mjs.map +7 -0
- package/dist/lib/browser/chunk-5AYTOIUF.mjs +822 -0
- package/dist/lib/browser/chunk-5AYTOIUF.mjs.map +7 -0
- package/dist/lib/browser/{chunk-K7ZFMSC4.mjs → chunk-A3CQYGCN.mjs} +8 -4
- package/dist/lib/browser/chunk-A3CQYGCN.mjs.map +7 -0
- package/dist/lib/browser/{chunk-ZGY3DYC2.mjs → chunk-BQTYJOFB.mjs} +5 -7
- package/dist/lib/browser/chunk-BQTYJOFB.mjs.map +7 -0
- package/dist/lib/browser/chunk-GLEYXJX3.mjs +22 -0
- package/dist/lib/browser/chunk-GLEYXJX3.mjs.map +7 -0
- package/dist/lib/browser/{chunk-CD4E4K7J.mjs → chunk-IBCHVMZW.mjs} +2 -2
- package/dist/lib/browser/{chunk-CD4E4K7J.mjs.map → chunk-IBCHVMZW.mjs.map} +2 -2
- package/dist/lib/browser/chunk-JAETS5LE.mjs +106 -0
- package/dist/lib/browser/chunk-JAETS5LE.mjs.map +7 -0
- package/dist/lib/browser/{chunk-YHMGUSO7.mjs → chunk-UKTCPHLI.mjs} +13 -14
- package/dist/lib/browser/chunk-UKTCPHLI.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +32 -20
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{intent-resolver-EBEF7WEI.mjs → intent-resolver-VQGMBNXZ.mjs} +20 -18
- package/dist/lib/browser/intent-resolver-VQGMBNXZ.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{react-surface-ZPMZT4VU.mjs → react-surface-WOMJOPJE.mjs} +83 -74
- package/dist/lib/browser/react-surface-WOMJOPJE.mjs.map +7 -0
- package/dist/lib/browser/{settings-MBDK4TWE.mjs → settings-LBXJHVBU.mjs} +5 -5
- package/dist/lib/browser/{settings-MBDK4TWE.mjs.map → settings-LBXJHVBU.mjs.map} +1 -1
- package/dist/lib/browser/{state-ZA6PZPUI.mjs → state-BTUKVZHY.mjs} +5 -5
- package/dist/lib/browser/state-BTUKVZHY.mjs.map +7 -0
- package/dist/lib/browser/toolkit-YPIVDB4A.mjs +66 -0
- package/dist/lib/browser/toolkit-YPIVDB4A.mjs.map +7 -0
- package/dist/lib/browser/types/index.mjs +2 -2
- package/dist/lib/node-esm/MarkdownCard-MCWEFW4F.mjs +13 -0
- package/dist/lib/node-esm/MarkdownCard-MCWEFW4F.mjs.map +7 -0
- package/dist/lib/node-esm/MarkdownContainer-KAQOK7K5.mjs +16 -0
- package/dist/lib/node-esm/MarkdownContainer-KAQOK7K5.mjs.map +7 -0
- package/dist/lib/node-esm/{anchor-sort-R6AAKYNG.mjs → anchor-sort-4SXYVYXT.mjs} +5 -5
- package/dist/lib/node-esm/{anchor-sort-R6AAKYNG.mjs.map → anchor-sort-4SXYVYXT.mjs.map} +1 -1
- package/dist/lib/node-esm/{app-graph-serializer-X4M5QEI6.mjs → app-graph-serializer-KBVRLQN2.mjs} +9 -10
- package/dist/lib/node-esm/app-graph-serializer-KBVRLQN2.mjs.map +7 -0
- package/dist/lib/node-esm/blueprint-definition-FPNOTEYC.mjs +12 -0
- package/dist/lib/node-esm/blueprint-definition-FPNOTEYC.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-2Q4WCKWT.mjs +823 -0
- package/dist/lib/node-esm/chunk-2Q4WCKWT.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-DOB2MJAX.mjs +107 -0
- package/dist/lib/node-esm/chunk-DOB2MJAX.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-GGKPPGWA.mjs +24 -0
- package/dist/lib/node-esm/chunk-GGKPPGWA.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-B3J2M4YL.mjs → chunk-GMMVSXQ6.mjs} +2 -2
- package/dist/lib/node-esm/{chunk-B3J2M4YL.mjs.map → chunk-GMMVSXQ6.mjs.map} +2 -2
- package/dist/lib/node-esm/{chunk-6GCOJS4Y.mjs → chunk-JELROKGD.mjs} +13 -14
- package/dist/lib/node-esm/chunk-JELROKGD.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-LZK3TLKM.mjs → chunk-QH4MC5BE.mjs} +6 -5
- package/dist/lib/node-esm/chunk-QH4MC5BE.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-RCIXKCVG.mjs → chunk-SHAMSMKQ.mjs} +5 -7
- package/dist/lib/node-esm/chunk-SHAMSMKQ.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-YGNVDYMB.mjs → chunk-SJ2QRGPM.mjs} +8 -4
- package/dist/lib/node-esm/chunk-SJ2QRGPM.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-YYSASY7X.mjs +96 -0
- package/dist/lib/node-esm/chunk-YYSASY7X.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +32 -20
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{intent-resolver-L2UGZ72W.mjs → intent-resolver-Q4XVI5EX.mjs} +20 -18
- package/dist/lib/node-esm/intent-resolver-Q4XVI5EX.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-surface-3JJSTTQP.mjs → react-surface-FAMZTAXK.mjs} +83 -74
- package/dist/lib/node-esm/react-surface-FAMZTAXK.mjs.map +7 -0
- package/dist/lib/node-esm/{settings-LBDWWPZJ.mjs → settings-2YRA67H6.mjs} +5 -5
- package/dist/lib/node-esm/{settings-LBDWWPZJ.mjs.map → settings-2YRA67H6.mjs.map} +1 -1
- package/dist/lib/node-esm/{state-UIHO2SFZ.mjs → state-K6EH7SRZ.mjs} +5 -5
- package/dist/lib/node-esm/state-K6EH7SRZ.mjs.map +7 -0
- package/dist/lib/node-esm/toolkit-36BFLIR3.mjs +67 -0
- package/dist/lib/node-esm/toolkit-36BFLIR3.mjs.map +7 -0
- package/dist/lib/node-esm/types/index.mjs +2 -2
- package/dist/types/src/MarkdownPlugin.d.ts +1 -1
- package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/anchor-sort.d.ts +2 -2
- package/dist/types/src/capabilities/app-graph-serializer.d.ts +1 -1
- package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -1
- package/dist/types/src/capabilities/artifact-definition.d.ts +1 -9
- package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
- package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -0
- package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
- package/dist/types/src/capabilities/capabilities.d.ts +1 -1
- package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +12 -10
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/settings.d.ts +1 -1
- package/dist/types/src/capabilities/state.d.ts +2 -2
- package/dist/types/src/capabilities/state.d.ts.map +1 -1
- package/dist/types/src/capabilities/toolkit.d.ts +20 -0
- package/dist/types/src/capabilities/toolkit.d.ts.map +1 -0
- package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts +7 -0
- package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts.map +1 -0
- package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts +9 -0
- package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts.map +1 -0
- package/dist/types/src/components/MarkdownCard/index.d.ts +4 -0
- package/dist/types/src/components/MarkdownCard/index.d.ts.map +1 -0
- package/dist/types/src/components/MarkdownContainer.d.ts +8 -12
- package/dist/types/src/components/MarkdownContainer.d.ts.map +1 -1
- package/dist/types/src/components/MarkdownContainer.stories.d.ts +54 -5
- package/dist/types/src/components/MarkdownContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts +11 -0
- package/dist/types/src/components/MarkdownEditor/FileUpload.d.ts.map +1 -0
- package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +42 -23
- package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
- package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts +8 -15
- package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts +26 -0
- package/dist/types/src/components/MarkdownEditor/MarkdownEditorContent.d.ts.map +1 -0
- package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts +12 -0
- package/dist/types/src/components/MarkdownEditor/MarkdownEditorToolbar.d.ts.map +1 -0
- package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts.map +1 -1
- package/dist/types/src/components/Suggestions.stories.d.ts +1 -2
- package/dist/types/src/components/Suggestions.stories.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +4 -2
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/functions/diff.d.ts +6 -0
- package/dist/types/src/functions/diff.d.ts.map +1 -0
- package/dist/types/src/functions/index.d.ts +3 -0
- package/dist/types/src/functions/index.d.ts.map +1 -0
- package/dist/types/src/functions/open.d.ts +7 -0
- package/dist/types/src/functions/open.d.ts.map +1 -0
- package/dist/types/src/hooks/index.d.ts +3 -0
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useExtensions.d.ts +21 -0
- package/dist/types/src/hooks/useExtensions.d.ts.map +1 -0
- package/dist/types/src/hooks/useLinkQuery.d.ts +4 -0
- package/dist/types/src/hooks/useLinkQuery.d.ts.map +1 -0
- package/dist/types/src/hooks/usePopoverMenuOptions.d.ts +9 -0
- package/dist/types/src/hooks/usePopoverMenuOptions.d.ts.map +1 -0
- package/dist/types/src/hooks/useSelectCurrentThread.d.ts +1 -1
- package/dist/types/src/hooks/useSelectCurrentThread.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +2 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +0 -1
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +4 -0
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/Markdown.d.ts +7 -5
- package/dist/types/src/types/Markdown.d.ts.map +1 -1
- package/dist/types/src/types/MarkdownAction.d.ts +6 -14
- package/dist/types/src/types/MarkdownAction.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/src/util.d.ts +1 -1
- package/dist/types/src/util.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +62 -56
- package/src/MarkdownPlugin.tsx +103 -94
- package/src/capabilities/app-graph-serializer.ts +4 -4
- package/src/capabilities/artifact-definition.ts +15 -19
- package/src/capabilities/blueprint-definition.ts +39 -0
- package/src/capabilities/capabilities.ts +2 -1
- package/src/capabilities/index.ts +3 -1
- package/src/capabilities/intent-resolver.ts +14 -13
- package/src/capabilities/react-surface.tsx +39 -60
- package/src/capabilities/state.ts +3 -2
- package/src/capabilities/toolkit.ts +53 -0
- package/src/components/{MarkdownPreview/MarkdownPreview.stories.tsx → MarkdownCard/MarkdownCard.stories.tsx} +14 -15
- package/src/components/{MarkdownPreview/MarkdownPreview.tsx → MarkdownCard/MarkdownCard.tsx} +45 -33
- package/src/components/MarkdownCard/index.ts +9 -0
- package/src/components/MarkdownContainer.stories.tsx +80 -43
- package/src/components/MarkdownContainer.tsx +86 -219
- package/src/components/MarkdownEditor/FileUpload.tsx +63 -0
- package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +58 -34
- package/src/components/MarkdownEditor/MarkdownEditor.tsx +220 -271
- package/src/components/MarkdownEditor/MarkdownEditorContent.tsx +134 -0
- package/src/components/MarkdownEditor/MarkdownEditorToolbar.tsx +63 -0
- package/src/components/MarkdownSettings/MarkdownSettings.tsx +77 -74
- package/src/components/Suggestions.stories.tsx +40 -41
- package/src/components/index.ts +3 -1
- package/src/functions/diff.ts +37 -0
- package/src/functions/index.ts +6 -0
- package/src/functions/open.ts +32 -0
- package/src/hooks/index.ts +3 -0
- package/src/{extensions.tsx → hooks/useExtensions.tsx} +61 -119
- package/src/hooks/useLinkQuery.ts +82 -0
- package/src/hooks/usePopoverMenuOptions.ts +71 -0
- package/src/hooks/useSelectCurrentThread.tsx +3 -3
- package/src/index.ts +3 -1
- package/src/meta.ts +3 -6
- package/src/translations.ts +4 -0
- package/src/types/Markdown.ts +8 -5
- package/src/types/MarkdownAction.ts +5 -6
- package/src/types/types.ts +1 -0
- package/src/util.tsx +9 -2
- package/dist/lib/browser/MarkdownContainer-NNBPE6A5.mjs +0 -779
- package/dist/lib/browser/MarkdownContainer-NNBPE6A5.mjs.map +0 -7
- package/dist/lib/browser/MarkdownPreview-7VG3K24R.mjs +0 -80
- package/dist/lib/browser/MarkdownPreview-7VG3K24R.mjs.map +0 -7
- package/dist/lib/browser/app-graph-serializer-ZT5OVF5G.mjs.map +0 -7
- package/dist/lib/browser/artifact-definition-7VNP5PCP.mjs +0 -145
- package/dist/lib/browser/artifact-definition-7VNP5PCP.mjs.map +0 -7
- package/dist/lib/browser/chunk-K7ZFMSC4.mjs.map +0 -7
- package/dist/lib/browser/chunk-VCUKIILA.mjs +0 -20
- package/dist/lib/browser/chunk-VCUKIILA.mjs.map +0 -7
- package/dist/lib/browser/chunk-VMX5SDGW.mjs.map +0 -7
- package/dist/lib/browser/chunk-YHMGUSO7.mjs.map +0 -7
- package/dist/lib/browser/chunk-ZGY3DYC2.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-EBEF7WEI.mjs.map +0 -7
- package/dist/lib/browser/react-surface-ZPMZT4VU.mjs.map +0 -7
- package/dist/lib/browser/state-ZA6PZPUI.mjs.map +0 -7
- package/dist/lib/node-esm/MarkdownContainer-Q6UO7DKT.mjs +0 -780
- package/dist/lib/node-esm/MarkdownContainer-Q6UO7DKT.mjs.map +0 -7
- package/dist/lib/node-esm/MarkdownPreview-UVWR2YK3.mjs +0 -81
- package/dist/lib/node-esm/MarkdownPreview-UVWR2YK3.mjs.map +0 -7
- package/dist/lib/node-esm/app-graph-serializer-X4M5QEI6.mjs.map +0 -7
- package/dist/lib/node-esm/artifact-definition-IRIILD7S.mjs +0 -146
- package/dist/lib/node-esm/artifact-definition-IRIILD7S.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-6GCOJS4Y.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-A7LLVI34.mjs +0 -22
- package/dist/lib/node-esm/chunk-A7LLVI34.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-LZK3TLKM.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-RCIXKCVG.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-YGNVDYMB.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-L2UGZ72W.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-3JJSTTQP.mjs.map +0 -7
- package/dist/lib/node-esm/state-UIHO2SFZ.mjs.map +0 -7
- package/dist/types/src/components/MarkdownPreview/MarkdownPreview.d.ts +0 -6
- package/dist/types/src/components/MarkdownPreview/MarkdownPreview.d.ts.map +0 -1
- package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts +0 -10
- package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts.map +0 -1
- package/dist/types/src/components/MarkdownPreview/index.d.ts +0 -4
- package/dist/types/src/components/MarkdownPreview/index.d.ts.map +0 -1
- package/dist/types/src/components/Toolbar.stories.d.ts +0 -11
- package/dist/types/src/components/Toolbar.stories.d.ts.map +0 -1
- package/dist/types/src/extensions.d.ts +0 -24
- package/dist/types/src/extensions.d.ts.map +0 -1
- package/src/components/MarkdownPreview/index.ts +0 -9
- package/src/components/Toolbar.stories.tsx +0 -112
|
@@ -6,28 +6,27 @@ import { type ViewUpdate } from '@codemirror/view';
|
|
|
6
6
|
import React, { type AnchorHTMLAttributes, type ReactNode, useMemo } from 'react';
|
|
7
7
|
import { createRoot } from 'react-dom/client';
|
|
8
8
|
|
|
9
|
-
import {
|
|
10
|
-
createIntent,
|
|
11
|
-
LayoutAction,
|
|
12
|
-
type PromiseIntentDispatcher,
|
|
13
|
-
useCapabilities,
|
|
14
|
-
useIntentDispatcher,
|
|
15
|
-
} from '@dxos/app-framework';
|
|
9
|
+
import { LayoutAction, type PromiseIntentDispatcher, createIntent, useIntentDispatcher } from '@dxos/app-framework';
|
|
16
10
|
import { debounceAndThrottle } from '@dxos/async';
|
|
11
|
+
import { Obj } from '@dxos/echo';
|
|
17
12
|
import { invariant } from '@dxos/invariant';
|
|
18
|
-
import { createDocAccessor, fullyQualifiedId
|
|
13
|
+
import { createDocAccessor, fullyQualifiedId } from '@dxos/react-client/echo';
|
|
14
|
+
import { getSpace } from '@dxos/react-client/echo';
|
|
19
15
|
import { useIdentity } from '@dxos/react-client/halo';
|
|
20
16
|
import { Icon, ThemeProvider } from '@dxos/react-ui';
|
|
21
17
|
import { type SelectionManager } from '@dxos/react-ui-attention';
|
|
22
18
|
import {
|
|
23
|
-
|
|
19
|
+
Cursor,
|
|
24
20
|
type EditorStateStore,
|
|
21
|
+
EditorView,
|
|
25
22
|
type EditorViewMode,
|
|
26
23
|
type Extension,
|
|
27
24
|
InputModeExtensions,
|
|
25
|
+
type PreviewOptions,
|
|
26
|
+
type RenderCallback,
|
|
28
27
|
createDataExtensions,
|
|
29
|
-
autocomplete,
|
|
30
28
|
decorateMarkdown,
|
|
29
|
+
documentId,
|
|
31
30
|
folding,
|
|
32
31
|
formattingKeymap,
|
|
33
32
|
linkTooltip,
|
|
@@ -35,27 +34,21 @@ import {
|
|
|
35
34
|
preview,
|
|
36
35
|
selectionState,
|
|
37
36
|
typewriter,
|
|
38
|
-
type RenderCallback,
|
|
39
|
-
EditorView,
|
|
40
|
-
documentId,
|
|
41
|
-
Cursor,
|
|
42
|
-
type PreviewOptions,
|
|
43
37
|
} from '@dxos/react-ui-editor';
|
|
44
38
|
import { defaultTx } from '@dxos/react-ui-theme';
|
|
45
|
-
import {
|
|
46
|
-
import {
|
|
39
|
+
import { DataType } from '@dxos/schema';
|
|
40
|
+
import { isTruthy } from '@dxos/util';
|
|
41
|
+
|
|
42
|
+
import { Markdown } from '../types';
|
|
43
|
+
import { setFallbackName } from '../util';
|
|
47
44
|
|
|
48
|
-
|
|
49
|
-
import { type Markdown } from './types';
|
|
50
|
-
import { setFallbackName } from './util';
|
|
45
|
+
export type DocumentType = Markdown.Document | DataType.Text | { id: string; text: string };
|
|
51
46
|
|
|
52
|
-
type ExtensionsOptions = {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
text?: DataType.Text;
|
|
47
|
+
export type ExtensionsOptions = {
|
|
48
|
+
id: string;
|
|
49
|
+
object?: DocumentType;
|
|
56
50
|
dispatch?: PromiseIntentDispatcher;
|
|
57
|
-
|
|
58
|
-
settings: Markdown.Settings;
|
|
51
|
+
settings?: Markdown.Settings;
|
|
59
52
|
selectionManager?: SelectionManager;
|
|
60
53
|
viewMode?: EditorViewMode;
|
|
61
54
|
editorStateStore?: EditorStateStore;
|
|
@@ -64,9 +57,8 @@ type ExtensionsOptions = {
|
|
|
64
57
|
|
|
65
58
|
// TODO(burdon): Merge with createBaseExtensions below.
|
|
66
59
|
export const useExtensions = ({
|
|
67
|
-
document,
|
|
68
60
|
id,
|
|
69
|
-
|
|
61
|
+
object,
|
|
70
62
|
settings,
|
|
71
63
|
selectionManager,
|
|
72
64
|
viewMode,
|
|
@@ -75,93 +67,66 @@ export const useExtensions = ({
|
|
|
75
67
|
}: ExtensionsOptions): Extension[] => {
|
|
76
68
|
const { dispatchPromise: dispatch } = useIntentDispatcher();
|
|
77
69
|
const identity = useIdentity();
|
|
78
|
-
const space = getSpace(
|
|
70
|
+
const space = getSpace(object);
|
|
71
|
+
|
|
72
|
+
let target: Obj.Any | undefined;
|
|
73
|
+
if (Obj.instanceOf(Markdown.Document, object)) {
|
|
74
|
+
target = (object as Markdown.Document).content.target;
|
|
75
|
+
} else if (Obj.instanceOf(DataType.Text, object)) {
|
|
76
|
+
target = object;
|
|
77
|
+
}
|
|
79
78
|
|
|
80
79
|
// TODO(wittjosiah): Autocomplete is not working and this query is causing performance issues.
|
|
81
80
|
// TODO(burdon): Unsubscribe.
|
|
82
81
|
// const query = space?.db.query(Filter.type(DocumentType));
|
|
83
82
|
// query?.subscribe();
|
|
83
|
+
|
|
84
84
|
const baseExtensions = useMemo(
|
|
85
85
|
() =>
|
|
86
86
|
createBaseExtensions({
|
|
87
|
-
document,
|
|
88
87
|
id,
|
|
89
|
-
|
|
88
|
+
object,
|
|
90
89
|
settings,
|
|
91
90
|
selectionManager,
|
|
92
91
|
viewMode,
|
|
93
92
|
previewOptions,
|
|
94
93
|
dispatch,
|
|
95
|
-
// query,
|
|
96
94
|
}),
|
|
97
95
|
[
|
|
98
|
-
document,
|
|
99
96
|
id,
|
|
100
|
-
|
|
97
|
+
object,
|
|
101
98
|
viewMode,
|
|
102
99
|
dispatch,
|
|
103
100
|
previewOptions,
|
|
104
101
|
settings,
|
|
105
|
-
settings
|
|
106
|
-
settings
|
|
107
|
-
settings
|
|
108
|
-
settings
|
|
109
|
-
settings
|
|
102
|
+
settings?.debug,
|
|
103
|
+
settings?.editorInputMode,
|
|
104
|
+
settings?.folding,
|
|
105
|
+
settings?.numberedHeadings,
|
|
106
|
+
settings?.typewriter,
|
|
110
107
|
selectionManager,
|
|
111
108
|
],
|
|
112
109
|
);
|
|
113
110
|
|
|
114
|
-
const extensionProviders = useCapabilities(MarkdownCapabilities.Extensions);
|
|
115
|
-
|
|
116
|
-
//
|
|
117
|
-
// External extensions from other plugins.
|
|
118
|
-
//
|
|
119
|
-
const pluginExtensions = useMemo<Extension[]>(() => {
|
|
120
|
-
if (!document) {
|
|
121
|
-
return [];
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
return extensionProviders.flat().reduce((acc: Extension[], provider) => {
|
|
125
|
-
const extension = typeof provider === 'function' ? provider({ document }) : provider;
|
|
126
|
-
if (extension) {
|
|
127
|
-
acc.push(extension);
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
return acc;
|
|
131
|
-
}, []);
|
|
132
|
-
}, [extensionProviders, document]);
|
|
133
|
-
|
|
134
|
-
//
|
|
135
|
-
// Basic plugins.
|
|
136
|
-
//
|
|
137
111
|
return useMemo<Extension[]>(
|
|
138
112
|
() =>
|
|
139
113
|
[
|
|
114
|
+
// TODO(burdon): Pass this in?
|
|
140
115
|
// NOTE: Data extensions must be first so that automerge is updated before other extensions compute their state.
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
space,
|
|
146
|
-
identity,
|
|
147
|
-
}),
|
|
148
|
-
text &&
|
|
149
|
-
id &&
|
|
150
|
-
createDataExtensions({
|
|
151
|
-
id,
|
|
152
|
-
text: createDocAccessor(text, ['content']),
|
|
153
|
-
space,
|
|
154
|
-
identity,
|
|
155
|
-
}),
|
|
156
|
-
selectionState(editorStateStore),
|
|
157
|
-
document &&
|
|
116
|
+
target && createDataExtensions({ id, text: createDocAccessor(target, ['content']), space, identity }),
|
|
117
|
+
|
|
118
|
+
// TODO(burdon): Reconcile with effect in parent.
|
|
119
|
+
Obj.instanceOf(Markdown.Document, object) &&
|
|
158
120
|
listener({
|
|
159
|
-
onChange: (text) =>
|
|
121
|
+
onChange: ({ text }) => {
|
|
122
|
+
setFallbackName(object as Markdown.Document, text);
|
|
123
|
+
},
|
|
160
124
|
}),
|
|
125
|
+
|
|
161
126
|
baseExtensions,
|
|
162
|
-
|
|
163
|
-
].filter(
|
|
164
|
-
[
|
|
127
|
+
selectionState(editorStateStore),
|
|
128
|
+
].filter(isTruthy),
|
|
129
|
+
[identity, space, id, object, target, baseExtensions],
|
|
165
130
|
);
|
|
166
131
|
};
|
|
167
132
|
|
|
@@ -169,20 +134,19 @@ export const useExtensions = ({
|
|
|
169
134
|
* Create extension instances for editor.
|
|
170
135
|
*/
|
|
171
136
|
const createBaseExtensions = ({
|
|
172
|
-
document,
|
|
173
137
|
id,
|
|
138
|
+
object,
|
|
174
139
|
dispatch,
|
|
175
140
|
settings,
|
|
176
141
|
selectionManager,
|
|
177
|
-
query,
|
|
178
142
|
viewMode,
|
|
179
143
|
previewOptions,
|
|
180
144
|
}: ExtensionsOptions): Extension[] => {
|
|
181
145
|
const extensions: Extension[] = [
|
|
182
146
|
selectionManager && selectionChange(selectionManager),
|
|
183
|
-
settings
|
|
184
|
-
settings
|
|
185
|
-
].filter(
|
|
147
|
+
settings?.editorInputMode && InputModeExtensions[settings.editorInputMode],
|
|
148
|
+
settings?.folding && folding(),
|
|
149
|
+
].filter(isTruthy);
|
|
186
150
|
|
|
187
151
|
//
|
|
188
152
|
// Markdown
|
|
@@ -193,17 +157,18 @@ const createBaseExtensions = ({
|
|
|
193
157
|
formattingKeymap(),
|
|
194
158
|
decorateMarkdown({
|
|
195
159
|
selectionChangeDelay: 100,
|
|
196
|
-
numberedHeadings: settings
|
|
160
|
+
numberedHeadings: settings?.numberedHeadings ? { from: 2 } : undefined,
|
|
197
161
|
// TODO(wittjosiah): For internal links, consider ignoring the link text and rendering the label of the object being linked to.
|
|
162
|
+
// TODO(burdon): Create dx-tag.
|
|
198
163
|
renderLinkButton:
|
|
199
|
-
dispatch && (
|
|
164
|
+
dispatch && (object || id)
|
|
200
165
|
? createLinkRenderer((id: string) => {
|
|
201
166
|
void dispatch(
|
|
202
167
|
createIntent(LayoutAction.Open, {
|
|
203
168
|
part: 'main',
|
|
204
169
|
subject: [id],
|
|
205
170
|
options: {
|
|
206
|
-
pivotId:
|
|
171
|
+
pivotId: object ? fullyQualifiedId(object) : id,
|
|
207
172
|
},
|
|
208
173
|
}),
|
|
209
174
|
);
|
|
@@ -216,31 +181,7 @@ const createBaseExtensions = ({
|
|
|
216
181
|
);
|
|
217
182
|
}
|
|
218
183
|
|
|
219
|
-
|
|
220
|
-
// Autocomplete object links.
|
|
221
|
-
//
|
|
222
|
-
if (query) {
|
|
223
|
-
extensions.push(
|
|
224
|
-
autocomplete({
|
|
225
|
-
onSearch: (text: string) => {
|
|
226
|
-
// TODO(burdon): Specify filter (e.g., stack).
|
|
227
|
-
return query.objects
|
|
228
|
-
.map<AutocompleteResult | undefined>((object) =>
|
|
229
|
-
object.name?.length && object.id !== document?.id
|
|
230
|
-
? {
|
|
231
|
-
label: object.name,
|
|
232
|
-
// TODO(burdon): Factor out URL builder.
|
|
233
|
-
apply: `[${object.name}](/${fullyQualifiedId(object)})`,
|
|
234
|
-
}
|
|
235
|
-
: undefined,
|
|
236
|
-
)
|
|
237
|
-
.filter(isNotFalsy);
|
|
238
|
-
},
|
|
239
|
-
}),
|
|
240
|
-
);
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
if (settings.debug) {
|
|
184
|
+
if (settings?.debug) {
|
|
244
185
|
const items = settings.typewriter?.split(/[,\n]/) ?? '';
|
|
245
186
|
if (items) {
|
|
246
187
|
extensions.push(typewriter({ items }));
|
|
@@ -250,7 +191,7 @@ const createBaseExtensions = ({
|
|
|
250
191
|
return extensions;
|
|
251
192
|
};
|
|
252
193
|
|
|
253
|
-
|
|
194
|
+
const selectionChange = (selectionManager: SelectionManager) => {
|
|
254
195
|
return EditorView.updateListener.of(
|
|
255
196
|
debounceAndThrottle((update: ViewUpdate) => {
|
|
256
197
|
if (update.selectionSet) {
|
|
@@ -263,6 +204,7 @@ export const selectionChange = (selectionManager: SelectionManager) => {
|
|
|
263
204
|
to: cursorConverter.toCursor(range.to),
|
|
264
205
|
}))
|
|
265
206
|
.filter(({ from, to }) => to > from);
|
|
207
|
+
|
|
266
208
|
selectionManager.updateMultiRange(id, ranges);
|
|
267
209
|
}
|
|
268
210
|
}, 100),
|
|
@@ -321,8 +263,8 @@ const renderLinkTooltip: RenderCallback<{ url: string }> = (el, { url }) => {
|
|
|
321
263
|
);
|
|
322
264
|
};
|
|
323
265
|
|
|
324
|
-
// TODO(burdon):
|
|
325
|
-
|
|
266
|
+
// TODO(burdon): REMOVE.
|
|
267
|
+
const renderRoot = <T extends Element>(root: T, node: ReactNode): T => {
|
|
326
268
|
createRoot(root).render(<ThemeProvider tx={defaultTx}>{node}</ThemeProvider>);
|
|
327
269
|
return root;
|
|
328
270
|
};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { useCallback, useMemo } from 'react';
|
|
6
|
+
|
|
7
|
+
import { Capabilities, useCapabilities, usePluginManager } from '@dxos/app-framework';
|
|
8
|
+
import { Filter, Obj, Query, Type } from '@dxos/echo';
|
|
9
|
+
import { ClientCapabilities } from '@dxos/plugin-client';
|
|
10
|
+
import { SpaceCapabilities } from '@dxos/plugin-space';
|
|
11
|
+
import { type Space } from '@dxos/react-client/echo';
|
|
12
|
+
import { toLocalizedString, useTranslation } from '@dxos/react-ui';
|
|
13
|
+
import { type PopoverMenuGroup, type PopoverMenuItem, insertAtCursor, insertAtLineStart } from '@dxos/react-ui-editor';
|
|
14
|
+
|
|
15
|
+
export const useLinkQuery = (space: Space | undefined) => {
|
|
16
|
+
const { t } = useTranslation();
|
|
17
|
+
|
|
18
|
+
const manager = usePluginManager();
|
|
19
|
+
const resolve = useCallback(
|
|
20
|
+
(typename: string) =>
|
|
21
|
+
manager.context.getCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {},
|
|
22
|
+
[manager],
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
const objectForms = useCapabilities(SpaceCapabilities.ObjectForm);
|
|
26
|
+
const schemaWhiteList = useCapabilities(ClientCapabilities.SchemaWhiteList);
|
|
27
|
+
const filter = useMemo(
|
|
28
|
+
() =>
|
|
29
|
+
Filter.or(
|
|
30
|
+
...objectForms.map((form) => Filter.type(form.objectSchema)),
|
|
31
|
+
...schemaWhiteList.flat().map((schema) => Filter.typename(Type.getTypename(schema))),
|
|
32
|
+
),
|
|
33
|
+
[objectForms, schemaWhiteList],
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
const handleLinkQuery = useCallback(
|
|
37
|
+
async (query?: string): Promise<PopoverMenuGroup[]> => {
|
|
38
|
+
const name = query?.startsWith('@') ? query.slice(1).toLowerCase() : (query?.toLowerCase() ?? '');
|
|
39
|
+
const results = await space?.db.query(Query.select(filter)).run();
|
|
40
|
+
|
|
41
|
+
// TODO(wittjosiah): Use `Obj.Any` type.
|
|
42
|
+
const getLabel = (object: any) => {
|
|
43
|
+
const label = Obj.getLabel(object);
|
|
44
|
+
if (label) {
|
|
45
|
+
return label;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// TODO(wittjosiah): Remove metadata labels.
|
|
49
|
+
const type = Obj.getTypename(object)!;
|
|
50
|
+
const metadata = resolve(type);
|
|
51
|
+
return metadata.label?.(object) || ['object name placeholder', { ns: type, default: 'New object' }];
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
const items =
|
|
55
|
+
results?.objects
|
|
56
|
+
.filter((object) => toLocalizedString(getLabel(object), t).toLowerCase().includes(name))
|
|
57
|
+
// TODO(wittjosiah): Remove `any` type.
|
|
58
|
+
.map((object: any): PopoverMenuItem => {
|
|
59
|
+
const metadata = resolve(Obj.getTypename(object)!);
|
|
60
|
+
const label = toLocalizedString(getLabel(object), t);
|
|
61
|
+
return {
|
|
62
|
+
id: object.id,
|
|
63
|
+
label,
|
|
64
|
+
icon: metadata.icon,
|
|
65
|
+
onSelect: (view, head) => {
|
|
66
|
+
const link = `[${label}](${Obj.getDXN(object)})`;
|
|
67
|
+
if (query?.startsWith('@')) {
|
|
68
|
+
insertAtLineStart(view, head, `!${link}\n`);
|
|
69
|
+
} else {
|
|
70
|
+
insertAtCursor(view, head, `${link} `);
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}) ?? [];
|
|
75
|
+
|
|
76
|
+
return [{ id: 'echo', items }];
|
|
77
|
+
},
|
|
78
|
+
[space, filter, resolve],
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
return handleLinkQuery;
|
|
82
|
+
};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type EditorView } from '@codemirror/view';
|
|
6
|
+
import { useCallback, useMemo, useRef } from 'react';
|
|
7
|
+
|
|
8
|
+
import { Domino, toLocalizedString, useTranslation } from '@dxos/react-ui';
|
|
9
|
+
import {
|
|
10
|
+
type PopoverMenuGroup,
|
|
11
|
+
type UsePopoverMenuProps,
|
|
12
|
+
filterMenuGroups,
|
|
13
|
+
formattingCommands,
|
|
14
|
+
linkSlashCommands,
|
|
15
|
+
} from '@dxos/react-ui-editor';
|
|
16
|
+
|
|
17
|
+
import { meta } from '../meta';
|
|
18
|
+
|
|
19
|
+
export type UsePopoverMenuOptionsProps = {
|
|
20
|
+
editorView?: EditorView;
|
|
21
|
+
slashCommandGroups?: PopoverMenuGroup[];
|
|
22
|
+
onLinkQuery?: (query?: string) => Promise<PopoverMenuGroup[]>;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export const usePopoverMenuOptions = ({
|
|
26
|
+
editorView,
|
|
27
|
+
slashCommandGroups,
|
|
28
|
+
onLinkQuery,
|
|
29
|
+
}: UsePopoverMenuOptionsProps): UsePopoverMenuProps => {
|
|
30
|
+
const { t } = useTranslation(meta.id);
|
|
31
|
+
|
|
32
|
+
const getMenu = useCallback<NonNullable<UsePopoverMenuProps['getMenu']>>(
|
|
33
|
+
({ text, trigger }) => {
|
|
34
|
+
switch (trigger) {
|
|
35
|
+
case '@': {
|
|
36
|
+
return onLinkQuery?.(text) ?? [];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
case '/':
|
|
40
|
+
default: {
|
|
41
|
+
return filterMenuGroups([formattingCommands, linkSlashCommands, ...(slashCommandGroups ?? [])], (item) =>
|
|
42
|
+
text ? toLocalizedString(item.label, t).toLowerCase().includes(text.toLowerCase()) : true,
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
[slashCommandGroups, onLinkQuery],
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
const viewRef = useRef(editorView);
|
|
51
|
+
return useMemo<UsePopoverMenuProps>(() => {
|
|
52
|
+
const trigger = onLinkQuery ? ['/', '@'] : ['/'];
|
|
53
|
+
const placeholder = {
|
|
54
|
+
delay: 3_000,
|
|
55
|
+
content: () =>
|
|
56
|
+
Domino.of('div')
|
|
57
|
+
.children(
|
|
58
|
+
Domino.of('span').text('Press'),
|
|
59
|
+
...trigger.map((text) =>
|
|
60
|
+
Domino.of('span')
|
|
61
|
+
.classNames('mx-1 px-1.5 pt-[1px] pb-[2px] border border-separator rounded-sm')
|
|
62
|
+
.text(text),
|
|
63
|
+
),
|
|
64
|
+
Domino.of('span').text('for commands.'),
|
|
65
|
+
)
|
|
66
|
+
.build(),
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
return { viewRef, getMenu, trigger, placeholder };
|
|
70
|
+
}, [getMenu, onLinkQuery]);
|
|
71
|
+
};
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { EditorView } from '@codemirror/view';
|
|
6
|
-
import
|
|
6
|
+
import * as Schema from 'effect/Schema';
|
|
7
7
|
import { useMemo } from 'react';
|
|
8
8
|
|
|
9
|
-
import {
|
|
9
|
+
import { LayoutAction, createResolver, useIntentResolver } from '@dxos/app-framework';
|
|
10
10
|
import { invariant } from '@dxos/invariant';
|
|
11
11
|
import { Cursor, setSelection } from '@dxos/react-ui-editor';
|
|
12
12
|
|
|
@@ -15,7 +15,7 @@ import { meta } from '../meta';
|
|
|
15
15
|
/**
|
|
16
16
|
* Handle scrolling and selection of the current thread in a markdown editor.
|
|
17
17
|
*/
|
|
18
|
-
export const useSelectCurrentThread = (editorView: EditorView |
|
|
18
|
+
export const useSelectCurrentThread = (editorView: EditorView | null, documentId: string) => {
|
|
19
19
|
const scrollIntoViewResolver = useMemo(
|
|
20
20
|
() =>
|
|
21
21
|
createResolver({
|
package/src/index.ts
CHANGED
package/src/meta.ts
CHANGED
|
@@ -9,14 +9,11 @@ export const meta: PluginMeta = {
|
|
|
9
9
|
id: 'dxos.org/plugin/markdown',
|
|
10
10
|
name: 'Markdown',
|
|
11
11
|
description: trim`
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
You can use documents to extend the memory of your personal agents and add context for automated workflows.
|
|
12
|
+
Full-featured collaborative markdown editor with real-time editing, inline comments, and rich formatting.
|
|
13
|
+
Supports AI-powered editing assistance and seamlessly integrates with other workspace objects.
|
|
15
14
|
`,
|
|
16
15
|
icon: 'ph--text-aa--regular',
|
|
16
|
+
iconHue: 'indigo',
|
|
17
17
|
source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-markdown',
|
|
18
18
|
screenshots: ['https://dxos.network/plugin-details-markdown-dark.png'],
|
|
19
19
|
};
|
|
20
|
-
|
|
21
|
-
// TODO(burdon): Workaround for suspected vitest bug?
|
|
22
|
-
export const not_meta = meta;
|
package/src/translations.ts
CHANGED
|
@@ -21,6 +21,7 @@ export const translations = [
|
|
|
21
21
|
},
|
|
22
22
|
[meta.id]: {
|
|
23
23
|
'plugin name': 'Editor',
|
|
24
|
+
'settings title': 'Editor settings',
|
|
24
25
|
'choose markdown from space dialog title': 'Choose one or more documents to add',
|
|
25
26
|
// TODO(burdon): Style-guide for user-facing text (e.g., hints, questions, capitalization, etc.)
|
|
26
27
|
'empty choose markdown from space message': 'None available; try creating a new one instead?',
|
|
@@ -42,6 +43,9 @@ export const translations = [
|
|
|
42
43
|
'upload image label': 'Upload image',
|
|
43
44
|
'fallback title': 'Untitled',
|
|
44
45
|
'navigate to document label': 'Open document',
|
|
46
|
+
'words label_zero': 'words',
|
|
47
|
+
'words label_one': 'word',
|
|
48
|
+
'words label_other': 'words',
|
|
45
49
|
},
|
|
46
50
|
},
|
|
47
51
|
},
|
package/src/types/Markdown.ts
CHANGED
|
@@ -2,26 +2,29 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
6
|
|
|
7
7
|
import { Obj, Ref, Type } from '@dxos/echo';
|
|
8
|
-
import { LabelAnnotation } from '@dxos/echo
|
|
8
|
+
import { DescriptionAnnotation, FormAnnotation, LabelAnnotation } from '@dxos/echo/internal';
|
|
9
9
|
import { EditorInputMode, EditorViewMode } from '@dxos/react-ui-editor/types';
|
|
10
|
-
import { DataType } from '@dxos/schema';
|
|
10
|
+
import { DataType, ItemAnnotation } from '@dxos/schema';
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* Document Item type.
|
|
14
14
|
*/
|
|
15
15
|
export const Document = Schema.Struct({
|
|
16
16
|
name: Schema.optional(Schema.String),
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
description: Schema.optional(Schema.String),
|
|
18
|
+
fallbackName: Schema.String.pipe(FormAnnotation.set(false), Schema.optional),
|
|
19
|
+
content: Type.Ref(DataType.Text).pipe(FormAnnotation.set(false)),
|
|
19
20
|
}).pipe(
|
|
20
21
|
Type.Obj({
|
|
21
22
|
typename: 'dxos.org/type/Document',
|
|
22
23
|
version: '0.1.0',
|
|
23
24
|
}),
|
|
24
25
|
LabelAnnotation.set(['name', 'fallbackName']),
|
|
26
|
+
DescriptionAnnotation.set('description'),
|
|
27
|
+
ItemAnnotation.set(true),
|
|
25
28
|
);
|
|
26
29
|
|
|
27
30
|
export type Document = Schema.Schema.Type<typeof Document>;
|
|
@@ -2,17 +2,16 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import
|
|
5
|
+
import * as Schema from 'effect/Schema';
|
|
6
6
|
|
|
7
|
-
import { Type } from '@dxos/echo';
|
|
8
7
|
import { EditorViewMode } from '@dxos/react-ui-editor/types';
|
|
9
8
|
|
|
9
|
+
import { meta } from '../meta';
|
|
10
|
+
|
|
10
11
|
import { Document } from './Markdown';
|
|
11
|
-
import { not_meta } from '../meta';
|
|
12
12
|
|
|
13
|
-
export class Create extends Schema.TaggedClass<Create>()(`${
|
|
13
|
+
export class Create extends Schema.TaggedClass<Create>()(`${meta.id}/action/create`, {
|
|
14
14
|
input: Schema.Struct({
|
|
15
|
-
spaceId: Type.SpaceId,
|
|
16
15
|
name: Schema.optional(Schema.String),
|
|
17
16
|
content: Schema.optional(Schema.String),
|
|
18
17
|
}),
|
|
@@ -21,7 +20,7 @@ export class Create extends Schema.TaggedClass<Create>()(`${not_meta.id}/action/
|
|
|
21
20
|
}),
|
|
22
21
|
}) {}
|
|
23
22
|
|
|
24
|
-
export class SetViewMode extends Schema.TaggedClass<SetViewMode>()(`${
|
|
23
|
+
export class SetViewMode extends Schema.TaggedClass<SetViewMode>()(`${meta.id}/action/set-view-mode`, {
|
|
25
24
|
input: Schema.Struct({
|
|
26
25
|
id: Schema.String,
|
|
27
26
|
viewMode: EditorViewMode,
|
package/src/types/types.ts
CHANGED
|
@@ -8,6 +8,7 @@ import { type EditorViewMode } from '@dxos/react-ui-editor/types';
|
|
|
8
8
|
import { type Document } from './Markdown';
|
|
9
9
|
|
|
10
10
|
// TODO(burdon): Remove these from ./types since not part of plugin-markdown API?
|
|
11
|
+
// TODO(wittjosiah): MarkdownExtensionProvider is a part of the MarkdownCapabilities api which should be in ./types.
|
|
11
12
|
|
|
12
13
|
// TODO(burdon): Async?
|
|
13
14
|
export type MarkdownExtensionProvider = (props: { document?: Document }) => Extension | undefined;
|
package/src/util.tsx
CHANGED
|
@@ -36,8 +36,15 @@ export const getFallbackName = (content: string) => {
|
|
|
36
36
|
return content.substring(0, 31).split('\n')[0].replaceAll(nonTitleChars, '').trim();
|
|
37
37
|
};
|
|
38
38
|
|
|
39
|
-
export const
|
|
40
|
-
|
|
39
|
+
export const getContentSnippet = (content: string) => {
|
|
40
|
+
const abstract = content
|
|
41
|
+
.split('\n')
|
|
42
|
+
.filter((line) => !line.startsWith('#'))
|
|
43
|
+
.filter((line) => line.trim() !== '')[0]
|
|
44
|
+
.replaceAll(nonTitleChars, '')
|
|
45
|
+
.trim();
|
|
46
|
+
|
|
47
|
+
return abstract + '...';
|
|
41
48
|
};
|
|
42
49
|
|
|
43
50
|
export const setFallbackName = debounce((doc: Markdown.Document, content: string) => {
|