@dxos/plugin-markdown 0.8.4-main.67995b8 → 0.8.4-main.dedc0f3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/{MarkdownPreview-7VG3K24R.mjs → MarkdownCard-JLUQITYK.mjs} +11 -11
- package/dist/lib/browser/MarkdownCard-JLUQITYK.mjs.map +7 -0
- package/dist/lib/browser/{MarkdownContainer-NNBPE6A5.mjs → MarkdownContainer-JW7TRDSA.mjs} +250 -274
- package/dist/lib/browser/MarkdownContainer-JW7TRDSA.mjs.map +7 -0
- package/dist/lib/browser/{anchor-sort-Z7JQA7RL.mjs → anchor-sort-E33BSTYF.mjs} +3 -3
- package/dist/lib/browser/{app-graph-serializer-ZT5OVF5G.mjs → app-graph-serializer-OX62DNPT.mjs} +5 -6
- package/dist/lib/browser/{app-graph-serializer-ZT5OVF5G.mjs.map → app-graph-serializer-OX62DNPT.mjs.map} +3 -3
- package/dist/lib/browser/blueprint-definition-5YKFUHRU.mjs +11 -0
- package/dist/lib/browser/blueprint-definition-5YKFUHRU.mjs.map +7 -0
- package/dist/lib/browser/{chunk-YHMGUSO7.mjs → chunk-BEE7VQPU.mjs} +7 -9
- package/dist/lib/browser/chunk-BEE7VQPU.mjs.map +7 -0
- package/dist/lib/browser/chunk-F6JJLKLN.mjs +102 -0
- package/dist/lib/browser/chunk-F6JJLKLN.mjs.map +7 -0
- package/dist/lib/browser/{chunk-VMX5SDGW.mjs → chunk-LAVZ2W6X.mjs} +2 -2
- package/dist/lib/browser/{chunk-ZGY3DYC2.mjs → chunk-ODB2PTBP.mjs} +2 -4
- package/dist/lib/browser/{chunk-ZGY3DYC2.mjs.map → chunk-ODB2PTBP.mjs.map} +3 -3
- package/dist/lib/browser/{chunk-CD4E4K7J.mjs → chunk-OY6CGPOO.mjs} +2 -2
- package/dist/lib/browser/{chunk-CD4E4K7J.mjs.map → chunk-OY6CGPOO.mjs.map} +1 -1
- package/dist/lib/browser/chunk-SUOK6YMI.mjs +22 -0
- package/dist/lib/browser/chunk-SUOK6YMI.mjs.map +7 -0
- package/dist/lib/browser/{chunk-K7ZFMSC4.mjs → chunk-Z7P6JGGW.mjs} +4 -3
- package/dist/lib/browser/chunk-Z7P6JGGW.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +28 -17
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{intent-resolver-EBEF7WEI.mjs → intent-resolver-WDDH56JC.mjs} +18 -16
- package/dist/lib/browser/intent-resolver-WDDH56JC.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{react-surface-ZPMZT4VU.mjs → react-surface-L3NTMD4D.mjs} +38 -31
- package/dist/lib/browser/react-surface-L3NTMD4D.mjs.map +7 -0
- package/dist/lib/browser/{settings-MBDK4TWE.mjs → settings-AABBTB4Q.mjs} +3 -3
- package/dist/lib/browser/{state-ZA6PZPUI.mjs → state-FTHQQX7V.mjs} +3 -3
- package/dist/lib/browser/state-FTHQQX7V.mjs.map +7 -0
- package/dist/lib/browser/toolkit-2AJTHG74.mjs +74 -0
- package/dist/lib/browser/toolkit-2AJTHG74.mjs.map +7 -0
- package/dist/lib/browser/types/index.mjs +2 -2
- package/dist/lib/node-esm/{MarkdownPreview-UVWR2YK3.mjs → MarkdownCard-XL5EVSJ7.mjs} +11 -11
- package/dist/lib/node-esm/MarkdownCard-XL5EVSJ7.mjs.map +7 -0
- package/dist/lib/node-esm/{MarkdownContainer-Q6UO7DKT.mjs → MarkdownContainer-HRGQXIXP.mjs} +250 -274
- package/dist/lib/node-esm/MarkdownContainer-HRGQXIXP.mjs.map +7 -0
- package/dist/lib/node-esm/{anchor-sort-R6AAKYNG.mjs → anchor-sort-ALP2NH24.mjs} +3 -3
- package/dist/lib/node-esm/{app-graph-serializer-X4M5QEI6.mjs → app-graph-serializer-56TD3BMX.mjs} +5 -6
- package/dist/lib/node-esm/{app-graph-serializer-X4M5QEI6.mjs.map → app-graph-serializer-56TD3BMX.mjs.map} +3 -3
- package/dist/lib/node-esm/blueprint-definition-GVW67KGV.mjs +12 -0
- package/dist/lib/node-esm/blueprint-definition-GVW67KGV.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-B3J2M4YL.mjs → chunk-CB2R4YIY.mjs} +2 -2
- package/dist/lib/node-esm/{chunk-B3J2M4YL.mjs.map → chunk-CB2R4YIY.mjs.map} +1 -1
- package/dist/lib/node-esm/chunk-DVK63TD3.mjs +103 -0
- package/dist/lib/node-esm/chunk-DVK63TD3.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-6GCOJS4Y.mjs → chunk-FXILAQ5F.mjs} +7 -9
- package/dist/lib/node-esm/chunk-FXILAQ5F.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-YGNVDYMB.mjs → chunk-J7A6TUB2.mjs} +4 -3
- package/dist/lib/node-esm/chunk-J7A6TUB2.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-JC2YWB5D.mjs +24 -0
- package/dist/lib/node-esm/chunk-JC2YWB5D.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-LZK3TLKM.mjs → chunk-O6EXWGGS.mjs} +2 -2
- package/dist/lib/node-esm/{chunk-RCIXKCVG.mjs → chunk-VCG2U522.mjs} +2 -4
- package/dist/lib/node-esm/{chunk-RCIXKCVG.mjs.map → chunk-VCG2U522.mjs.map} +3 -3
- package/dist/lib/node-esm/index.mjs +28 -17
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{intent-resolver-L2UGZ72W.mjs → intent-resolver-2I5HKCUU.mjs} +18 -16
- package/dist/lib/node-esm/intent-resolver-2I5HKCUU.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-surface-3JJSTTQP.mjs → react-surface-YZSZFR5D.mjs} +38 -31
- package/dist/lib/node-esm/react-surface-YZSZFR5D.mjs.map +7 -0
- package/dist/lib/node-esm/{settings-LBDWWPZJ.mjs → settings-CXGR6DH4.mjs} +3 -3
- package/dist/lib/node-esm/{state-UIHO2SFZ.mjs → state-NWMQ3XAI.mjs} +3 -3
- package/dist/lib/node-esm/state-NWMQ3XAI.mjs.map +7 -0
- package/dist/lib/node-esm/toolkit-RC44I2MI.mjs +75 -0
- package/dist/lib/node-esm/toolkit-RC44I2MI.mjs.map +7 -0
- package/dist/lib/node-esm/types/index.mjs +2 -2
- package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/anchor-sort.d.ts +2 -2
- package/dist/types/src/capabilities/app-graph-serializer.d.ts +1 -1
- package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -1
- package/dist/types/src/capabilities/artifact-definition.d.ts +1 -9
- package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
- package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -0
- package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
- package/dist/types/src/capabilities/capabilities.d.ts +1 -1
- package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +12 -10
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/settings.d.ts +1 -1
- package/dist/types/src/capabilities/state.d.ts +2 -2
- package/dist/types/src/capabilities/state.d.ts.map +1 -1
- package/dist/types/src/capabilities/toolkit.d.ts +4 -0
- package/dist/types/src/capabilities/toolkit.d.ts.map +1 -0
- package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts +7 -0
- package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts.map +1 -0
- package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts +10 -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 +1 -1
- package/dist/types/src/components/MarkdownContainer.d.ts.map +1 -1
- package/dist/types/src/components/MarkdownContainer.stories.d.ts +50 -4
- package/dist/types/src/components/MarkdownContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +1 -1
- package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
- package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts +110 -12
- package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts.map +1 -1
- package/dist/types/src/components/Suggestions.stories.d.ts.map +1 -1
- package/dist/types/src/components/Toolbar.stories.d.ts +44 -7
- package/dist/types/src/components/Toolbar.stories.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +1 -1
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/extensions.d.ts +0 -2
- package/dist/types/src/extensions.d.ts.map +1 -1
- package/dist/types/src/functions/diff.d.ts +6 -0
- package/dist/types/src/functions/diff.d.ts.map +1 -0
- package/dist/types/src/functions/index.d.ts +3 -0
- package/dist/types/src/functions/index.d.ts.map +1 -0
- package/dist/types/src/functions/open.d.ts +7 -0
- package/dist/types/src/functions/open.d.ts.map +1 -0
- package/dist/types/src/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 +1 -0
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/Markdown.d.ts +2 -2
- package/dist/types/src/types/Markdown.d.ts.map +1 -1
- package/dist/types/src/types/MarkdownAction.d.ts +4 -13
- 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/tsconfig.tsbuildinfo +1 -1
- package/package.json +50 -47
- package/src/MarkdownPlugin.tsx +15 -6
- package/src/capabilities/app-graph-serializer.ts +2 -2
- package/src/capabilities/artifact-definition.ts +13 -18
- package/src/capabilities/blueprint-definition.ts +39 -0
- package/src/capabilities/capabilities.ts +1 -1
- package/src/capabilities/index.ts +3 -1
- package/src/capabilities/intent-resolver.ts +13 -13
- package/src/capabilities/react-surface.tsx +5 -4
- package/src/capabilities/state.ts +3 -2
- package/src/capabilities/toolkit.ts +47 -0
- package/src/components/{MarkdownPreview/MarkdownPreview.stories.tsx → MarkdownCard/MarkdownCard.stories.tsx} +14 -12
- package/src/components/{MarkdownPreview/MarkdownPreview.tsx → MarkdownCard/MarkdownCard.tsx} +4 -2
- package/src/components/MarkdownCard/index.ts +9 -0
- package/src/components/MarkdownContainer.stories.tsx +7 -7
- package/src/components/MarkdownContainer.tsx +4 -3
- package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +10 -7
- package/src/components/MarkdownEditor/MarkdownEditor.tsx +21 -21
- package/src/components/MarkdownSettings/MarkdownSettings.tsx +77 -74
- package/src/components/Suggestions.stories.tsx +14 -16
- package/src/components/Toolbar.stories.tsx +18 -12
- package/src/components/index.ts +1 -1
- package/src/extensions.tsx +7 -35
- package/src/functions/diff.ts +35 -0
- package/src/functions/index.ts +6 -0
- package/src/functions/open.ts +30 -0
- package/src/hooks/useSelectCurrentThread.tsx +1 -1
- package/src/index.ts +3 -1
- package/src/meta.ts +0 -3
- package/src/translations.ts +1 -0
- package/src/types/Markdown.ts +2 -1
- package/src/types/MarkdownAction.ts +4 -5
- package/src/types/types.ts +1 -0
- package/dist/lib/browser/MarkdownContainer-NNBPE6A5.mjs.map +0 -7
- package/dist/lib/browser/MarkdownPreview-7VG3K24R.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-YHMGUSO7.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.map +0 -7
- package/dist/lib/node-esm/MarkdownPreview-UVWR2YK3.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-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/src/components/MarkdownPreview/index.ts +0 -9
- /package/dist/lib/browser/{anchor-sort-Z7JQA7RL.mjs.map → anchor-sort-E33BSTYF.mjs.map} +0 -0
- /package/dist/lib/browser/{chunk-VMX5SDGW.mjs.map → chunk-LAVZ2W6X.mjs.map} +0 -0
- /package/dist/lib/browser/{settings-MBDK4TWE.mjs.map → settings-AABBTB4Q.mjs.map} +0 -0
- /package/dist/lib/node-esm/{anchor-sort-R6AAKYNG.mjs.map → anchor-sort-ALP2NH24.mjs.map} +0 -0
- /package/dist/lib/node-esm/{chunk-LZK3TLKM.mjs.map → chunk-O6EXWGGS.mjs.map} +0 -0
- /package/dist/lib/node-esm/{settings-LBDWWPZJ.mjs.map → settings-CXGR6DH4.mjs.map} +0 -0
|
@@ -16,18 +16,19 @@ import { type SelectionManager } from '@dxos/react-ui-attention';
|
|
|
16
16
|
import {
|
|
17
17
|
type CommandMenuGroup,
|
|
18
18
|
type CommandMenuItem,
|
|
19
|
-
insertAtCursor,
|
|
20
|
-
insertAtLineStart,
|
|
21
19
|
type PreviewLinkRef,
|
|
22
20
|
type PreviewOptions,
|
|
21
|
+
insertAtCursor,
|
|
22
|
+
insertAtLineStart,
|
|
23
23
|
} from '@dxos/react-ui-editor';
|
|
24
24
|
import { DataType } from '@dxos/schema';
|
|
25
25
|
|
|
26
|
-
import { MarkdownEditor, type MarkdownEditorProps } from './MarkdownEditor';
|
|
27
26
|
import { useExtensions } from '../extensions';
|
|
28
27
|
import { Markdown } from '../types';
|
|
29
28
|
import { getFallbackName } from '../util';
|
|
30
29
|
|
|
30
|
+
import { MarkdownEditor, type MarkdownEditorProps } from './MarkdownEditor';
|
|
31
|
+
|
|
31
32
|
export type MarkdownContainerProps = Pick<
|
|
32
33
|
MarkdownEditorProps,
|
|
33
34
|
'role' | 'extensionProviders' | 'viewMode' | 'editorStateStore' | 'onViewModeChange'
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import '@dxos-theme';
|
|
6
6
|
|
|
7
|
-
import { type Meta } from '@storybook/react-vite';
|
|
7
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
8
8
|
import React, { useMemo } from 'react';
|
|
9
9
|
|
|
10
10
|
import { IntentPlugin } from '@dxos/app-framework';
|
|
@@ -14,9 +14,10 @@ import { withAttention } from '@dxos/react-ui-attention/testing';
|
|
|
14
14
|
import { automerge, translations as editorTranslations } from '@dxos/react-ui-editor';
|
|
15
15
|
import { withLayout, withTheme } from '@dxos/storybook-utils';
|
|
16
16
|
|
|
17
|
-
import { MarkdownEditor, type MarkdownEditorProps } from './MarkdownEditor';
|
|
18
17
|
import { translations } from '../../translations';
|
|
19
18
|
|
|
19
|
+
import { MarkdownEditor, type MarkdownEditorProps } from './MarkdownEditor';
|
|
20
|
+
|
|
20
21
|
const content = Array.from({ length: 100 }, (_, i) => `Line ${i + 1}`).join('\n');
|
|
21
22
|
|
|
22
23
|
type StoryProps = MarkdownEditorProps & {
|
|
@@ -30,9 +31,9 @@ const DefaultStory = ({ content = '# Test', toolbar }: StoryProps) => {
|
|
|
30
31
|
return <MarkdownEditor id='test' initialValue={doc.content} extensions={extensions} toolbar={toolbar} />;
|
|
31
32
|
};
|
|
32
33
|
|
|
33
|
-
const meta
|
|
34
|
+
const meta = {
|
|
34
35
|
title: 'plugins/plugin-markdown/MarkdownEditor',
|
|
35
|
-
component: MarkdownEditor,
|
|
36
|
+
component: MarkdownEditor as any,
|
|
36
37
|
render: DefaultStory,
|
|
37
38
|
decorators: [
|
|
38
39
|
withPluginManager({ plugins: [IntentPlugin()] }),
|
|
@@ -43,17 +44,19 @@ const meta: Meta<typeof MarkdownEditor> = {
|
|
|
43
44
|
parameters: {
|
|
44
45
|
translations: [...translations, ...editorTranslations],
|
|
45
46
|
},
|
|
46
|
-
}
|
|
47
|
+
} satisfies Meta<typeof DefaultStory>;
|
|
47
48
|
|
|
48
49
|
export default meta;
|
|
49
50
|
|
|
50
|
-
|
|
51
|
+
type Story = StoryObj<typeof meta>;
|
|
52
|
+
|
|
53
|
+
export const Default: Story = {
|
|
51
54
|
args: {
|
|
52
55
|
content,
|
|
53
56
|
},
|
|
54
57
|
};
|
|
55
58
|
|
|
56
|
-
export const WithToolbar = {
|
|
59
|
+
export const WithToolbar: Story = {
|
|
57
60
|
args: {
|
|
58
61
|
toolbar: true,
|
|
59
62
|
content,
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { type EditorView } from '@codemirror/view';
|
|
6
|
-
import React, { forwardRef,
|
|
6
|
+
import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef } from 'react';
|
|
7
7
|
import { useDropzone } from 'react-dropzone';
|
|
8
8
|
|
|
9
9
|
import { type FileInfo } from '@dxos/app-framework';
|
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
CommandMenu,
|
|
14
14
|
type CommandMenuGroup,
|
|
15
15
|
type DNDOptions,
|
|
16
|
+
Domino,
|
|
16
17
|
type EditorInputMode,
|
|
17
18
|
type EditorSelectionState,
|
|
18
19
|
type EditorStateStore,
|
|
@@ -20,9 +21,9 @@ import {
|
|
|
20
21
|
type EditorToolbarActionGraphProps,
|
|
21
22
|
type EditorViewMode,
|
|
22
23
|
RefPopover,
|
|
24
|
+
type UseCommandMenuOptions,
|
|
23
25
|
type UseTextEditorProps,
|
|
24
26
|
addLink,
|
|
25
|
-
createElement,
|
|
26
27
|
coreSlashCommands,
|
|
27
28
|
createBasicExtensions,
|
|
28
29
|
createMarkdownExtensions,
|
|
@@ -34,14 +35,13 @@ import {
|
|
|
34
35
|
linkSlashCommands,
|
|
35
36
|
processEditorPayload,
|
|
36
37
|
stackItemContentEditorClassNames,
|
|
38
|
+
useCommandMenu,
|
|
37
39
|
useEditorToolbarState,
|
|
38
40
|
useFormattingState,
|
|
39
41
|
useTextEditor,
|
|
40
|
-
useCommandMenu,
|
|
41
|
-
type UseCommandMenuOptions,
|
|
42
42
|
} from '@dxos/react-ui-editor';
|
|
43
43
|
import { StackItem } from '@dxos/react-ui-stack';
|
|
44
|
-
import {
|
|
44
|
+
import { isNonNullable, isNotFalsy } from '@dxos/util';
|
|
45
45
|
|
|
46
46
|
import { useSelectCurrentThread } from '../../hooks';
|
|
47
47
|
import { meta } from '../../meta';
|
|
@@ -70,7 +70,7 @@ export type MarkdownEditorProps = {
|
|
|
70
70
|
* This allows it to be used as a common editor for markdown content on arbitrary backends (e.g. files).
|
|
71
71
|
*/
|
|
72
72
|
export const MarkdownEditor = ({
|
|
73
|
-
extensions:
|
|
73
|
+
extensions: extensionsParam,
|
|
74
74
|
slashCommandGroups,
|
|
75
75
|
onLinkQuery,
|
|
76
76
|
...props
|
|
@@ -100,26 +100,25 @@ export const MarkdownEditor = ({
|
|
|
100
100
|
trigger,
|
|
101
101
|
placeholder: {
|
|
102
102
|
delay: 3_000,
|
|
103
|
-
content: () =>
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
103
|
+
content: () =>
|
|
104
|
+
Domino.of('div')
|
|
105
|
+
.child(
|
|
106
|
+
Domino.of('span').text('Press'),
|
|
107
|
+
...trigger.map((text) =>
|
|
108
|
+
Domino.of('span')
|
|
109
|
+
.classNames('border border-separator rounded-sm mx-1 px-1.5 pt-[1px] pb-[2px]')
|
|
110
|
+
.text(text),
|
|
111
|
+
),
|
|
112
|
+
Domino.of('span').text('for commands.'),
|
|
113
|
+
)
|
|
114
|
+
.build(),
|
|
115
115
|
},
|
|
116
116
|
getMenu,
|
|
117
117
|
};
|
|
118
118
|
}, [getMenu]);
|
|
119
119
|
|
|
120
120
|
const { commandMenu, groupsRef, currentItem, onSelect, ...refPopoverProps } = useCommandMenu(options);
|
|
121
|
-
|
|
122
|
-
const extensions = useMemo(() => [_extensions, commandMenu].filter(isNotFalsy), [_extensions, commandMenu]);
|
|
121
|
+
const extensions = useMemo(() => [extensionsParam, commandMenu].filter(isNotFalsy), [extensionsParam, commandMenu]);
|
|
123
122
|
|
|
124
123
|
return (
|
|
125
124
|
<RefPopover modal={false} {...refPopoverProps}>
|
|
@@ -185,8 +184,9 @@ const MarkdownEditorImpl = forwardRef<EditorView | undefined, MarkdownEditorProp
|
|
|
185
184
|
readOnly: viewMode === 'readonly',
|
|
186
185
|
placeholder: t('editor placeholder'),
|
|
187
186
|
scrollPastEnd: role === 'section' ? false : scrollPastEnd,
|
|
187
|
+
search: true,
|
|
188
188
|
}),
|
|
189
|
-
createMarkdownExtensions(
|
|
189
|
+
createMarkdownExtensions(),
|
|
190
190
|
createThemeExtensions({ themeMode, syntaxHighlighting: true, slots: editorSlots }),
|
|
191
191
|
editorGutter,
|
|
192
192
|
role !== 'section' && onFileUpload && dropFile({ onDrop: handleDrop }),
|
|
@@ -6,7 +6,7 @@ import React from 'react';
|
|
|
6
6
|
|
|
7
7
|
import { Input, Select, useTranslation } from '@dxos/react-ui';
|
|
8
8
|
import { type EditorInputMode, EditorInputModes, type EditorViewMode, EditorViewModes } from '@dxos/react-ui-editor';
|
|
9
|
-
import {
|
|
9
|
+
import { ControlGroup, ControlItemInput, ControlPage, ControlSection } from '@dxos/react-ui-form';
|
|
10
10
|
|
|
11
11
|
import { meta } from '../../meta';
|
|
12
12
|
import { type Markdown } from '../../types';
|
|
@@ -16,90 +16,93 @@ export const MarkdownSettings = ({ settings }: { settings: Markdown.Settings })
|
|
|
16
16
|
|
|
17
17
|
// TODO(wittjosiah): Add skill test confirmation for entering vim mode.
|
|
18
18
|
return (
|
|
19
|
-
<
|
|
20
|
-
<
|
|
21
|
-
<
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
<Select.
|
|
31
|
-
|
|
32
|
-
<Select.
|
|
33
|
-
{
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
19
|
+
<ControlPage>
|
|
20
|
+
<ControlSection title={t('settings title', { ns: meta.id })}>
|
|
21
|
+
<ControlGroup>
|
|
22
|
+
<ControlItemInput title={t('default view mode label')}>
|
|
23
|
+
<Select.Root
|
|
24
|
+
value={settings.defaultViewMode}
|
|
25
|
+
onValueChange={(value) => {
|
|
26
|
+
settings.defaultViewMode = value as EditorViewMode;
|
|
27
|
+
}}
|
|
28
|
+
>
|
|
29
|
+
<Select.TriggerButton />
|
|
30
|
+
<Select.Portal>
|
|
31
|
+
<Select.Content>
|
|
32
|
+
<Select.Viewport>
|
|
33
|
+
{EditorViewModes.map((mode) => (
|
|
34
|
+
<Select.Option key={mode} value={mode}>
|
|
35
|
+
{t(`${mode} mode label`, { ns: 'react-ui-editor' })}
|
|
36
|
+
</Select.Option>
|
|
37
|
+
))}
|
|
38
|
+
</Select.Viewport>
|
|
39
|
+
<Select.Arrow />
|
|
40
|
+
</Select.Content>
|
|
41
|
+
</Select.Portal>
|
|
42
|
+
</Select.Root>
|
|
43
|
+
</ControlItemInput>
|
|
41
44
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
45
|
+
<ControlItemInput title={t('editor input mode label')}>
|
|
46
|
+
<Select.Root
|
|
47
|
+
value={settings.editorInputMode ?? 'default'}
|
|
48
|
+
onValueChange={(value) => {
|
|
49
|
+
settings.editorInputMode = value as EditorInputMode;
|
|
50
|
+
}}
|
|
51
|
+
>
|
|
52
|
+
<Select.TriggerButton placeholder={t('select editor input mode placeholder')} />
|
|
53
|
+
<Select.Portal>
|
|
54
|
+
<Select.Content>
|
|
55
|
+
<Select.Viewport>
|
|
56
|
+
{EditorInputModes.map((mode) => (
|
|
57
|
+
<Select.Option key={mode} value={mode}>
|
|
58
|
+
{t(`settings editor input mode ${mode} label`)}
|
|
59
|
+
</Select.Option>
|
|
60
|
+
))}
|
|
61
|
+
</Select.Viewport>
|
|
62
|
+
<Select.Arrow />
|
|
63
|
+
</Select.Content>
|
|
64
|
+
</Select.Portal>
|
|
65
|
+
</Select.Root>
|
|
66
|
+
</ControlItemInput>
|
|
63
67
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
68
|
+
<ControlItemInput title={t('settings toolbar label')}>
|
|
69
|
+
<Input.Switch checked={settings.toolbar} onCheckedChange={(checked) => (settings.toolbar = !!checked)} />
|
|
70
|
+
</ControlItemInput>
|
|
67
71
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
<ControlItemInput title={t('settings numbered headings label')}>
|
|
73
|
+
<Input.Switch
|
|
74
|
+
checked={settings.numberedHeadings}
|
|
75
|
+
onCheckedChange={(checked) => (settings.numberedHeadings = !!checked)}
|
|
76
|
+
/>
|
|
77
|
+
</ControlItemInput>
|
|
74
78
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
79
|
+
<ControlItemInput title={t('settings folding label')}>
|
|
80
|
+
<Input.Switch checked={settings.folding} onCheckedChange={(checked) => (settings.folding = !!checked)} />
|
|
81
|
+
</ControlItemInput>
|
|
78
82
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
83
|
+
<ControlItemInput title={t('settings experimental label')}>
|
|
84
|
+
<Input.Switch
|
|
85
|
+
checked={settings.experimental}
|
|
86
|
+
onCheckedChange={(checked) => (settings.experimental = !!checked)}
|
|
87
|
+
/>
|
|
88
|
+
</ControlItemInput>
|
|
85
89
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
90
|
+
<ControlItemInput title={t('settings debug label')}>
|
|
91
|
+
<Input.Switch checked={settings.debug} onCheckedChange={(checked) => (settings.debug = !!checked)} />
|
|
92
|
+
</ControlItemInput>
|
|
93
|
+
|
|
94
|
+
{settings.debug && (
|
|
95
|
+
<ControlItemInput title={t('settings debug textarea label', { ns: meta.id })}>
|
|
91
96
|
<Input.TextArea
|
|
92
97
|
rows={5}
|
|
93
98
|
value={settings.typewriter}
|
|
94
99
|
onChange={({ target: { value } }) => (settings.typewriter = value)}
|
|
95
100
|
placeholder={t('settings debug placeholder')}
|
|
96
101
|
/>
|
|
97
|
-
</
|
|
98
|
-
)
|
|
99
|
-
|
|
100
|
-
>
|
|
101
|
-
|
|
102
|
-
</DeprecatedFormInput>
|
|
103
|
-
</DeprecatedFormContainer>
|
|
102
|
+
</ControlItemInput>
|
|
103
|
+
)}
|
|
104
|
+
</ControlGroup>
|
|
105
|
+
</ControlSection>
|
|
106
|
+
</ControlPage>
|
|
104
107
|
);
|
|
105
108
|
};
|
|
@@ -5,23 +5,20 @@
|
|
|
5
5
|
import '@dxos-theme';
|
|
6
6
|
|
|
7
7
|
import { type Meta } from '@storybook/react-vite';
|
|
8
|
-
import { Match, Option,
|
|
8
|
+
import { Match, Option, Schema, pipe } from 'effect';
|
|
9
9
|
import React, { type FC, useEffect, useMemo, useState } from 'react';
|
|
10
10
|
|
|
11
11
|
import {
|
|
12
12
|
Capabilities,
|
|
13
|
-
CollaborationActions,
|
|
14
13
|
IntentPlugin,
|
|
15
14
|
SettingsPlugin,
|
|
16
15
|
contributes,
|
|
17
|
-
createIntent,
|
|
18
16
|
useCapability,
|
|
19
17
|
useIntentDispatcher,
|
|
20
18
|
} from '@dxos/app-framework';
|
|
21
19
|
import { withPluginManager } from '@dxos/app-framework/testing';
|
|
22
20
|
import { Obj, Ref, Type } from '@dxos/echo';
|
|
23
21
|
import { invariant } from '@dxos/invariant';
|
|
24
|
-
import { DXN } from '@dxos/keys';
|
|
25
22
|
import { ClientPlugin } from '@dxos/plugin-client';
|
|
26
23
|
import { PreviewPlugin } from '@dxos/plugin-preview';
|
|
27
24
|
import { SpacePlugin } from '@dxos/plugin-space';
|
|
@@ -30,19 +27,20 @@ import { ThemePlugin } from '@dxos/plugin-theme';
|
|
|
30
27
|
import { faker } from '@dxos/random';
|
|
31
28
|
import { createDocAccessor, fullyQualifiedId, toCursorRange, useQueue, useSpace } from '@dxos/react-client/echo';
|
|
32
29
|
import { IconButton, Toolbar } from '@dxos/react-ui';
|
|
33
|
-
import {
|
|
30
|
+
import { type EditorSelection, type Range, command, useTextEditor } from '@dxos/react-ui-editor';
|
|
34
31
|
import { StackItem } from '@dxos/react-ui-stack';
|
|
35
32
|
import { defaultTx } from '@dxos/react-ui-theme';
|
|
36
33
|
import { DataType } from '@dxos/schema';
|
|
37
34
|
import { withLayout } from '@dxos/storybook-utils';
|
|
38
35
|
|
|
39
|
-
import { MarkdownContainer } from './MarkdownContainer';
|
|
40
|
-
import { MarkdownPlugin } from '../MarkdownPlugin';
|
|
41
36
|
import { MarkdownCapabilities } from '../capabilities';
|
|
37
|
+
import { MarkdownPlugin } from '../MarkdownPlugin';
|
|
42
38
|
import { meta } from '../meta';
|
|
43
39
|
import { translations } from '../translations';
|
|
44
40
|
import { Markdown } from '../types';
|
|
45
41
|
|
|
42
|
+
import { MarkdownContainer } from './MarkdownContainer';
|
|
43
|
+
|
|
46
44
|
faker.seed(1);
|
|
47
45
|
|
|
48
46
|
const TestItem = Schema.Struct({
|
|
@@ -98,14 +96,14 @@ const TestChat: FC<{ doc: Markdown.Document; content: string }> = ({ doc, conten
|
|
|
98
96
|
// const message = deref(ref);
|
|
99
97
|
// }
|
|
100
98
|
|
|
101
|
-
void dispatch(
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
);
|
|
99
|
+
// void dispatch(
|
|
100
|
+
// createIntent(CollaborationActions.InsertContent, {
|
|
101
|
+
// target: doc as any as Type.Expando,
|
|
102
|
+
// object: Ref.fromDXN(new DXN(DXN.kind.QUEUE, [...queue.dxn.parts, message.id])),
|
|
103
|
+
// at: cursor,
|
|
104
|
+
// label: 'Proposal',
|
|
105
|
+
// }),
|
|
106
|
+
// );
|
|
109
107
|
};
|
|
110
108
|
|
|
111
109
|
return (
|
|
@@ -166,7 +164,7 @@ const storybook: Meta<typeof DefaultStory> = {
|
|
|
166
164
|
StorybookLayoutPlugin(),
|
|
167
165
|
ClientPlugin({
|
|
168
166
|
types: [Markdown.Document, TestItem],
|
|
169
|
-
onClientInitialized: async (
|
|
167
|
+
onClientInitialized: async ({ client }) => {
|
|
170
168
|
await client.halo.createIdentity();
|
|
171
169
|
},
|
|
172
170
|
}),
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
import '@dxos-theme';
|
|
6
6
|
|
|
7
|
-
import { type Meta } from '@storybook/react-vite';
|
|
8
|
-
import React, {
|
|
7
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
8
|
+
import React, { useCallback, useState } from 'react';
|
|
9
9
|
|
|
10
10
|
import { invariant } from '@dxos/invariant';
|
|
11
11
|
import { PublicKey } from '@dxos/keys';
|
|
@@ -13,8 +13,9 @@ import { faker } from '@dxos/random';
|
|
|
13
13
|
import { createDocAccessor } from '@dxos/react-client/echo';
|
|
14
14
|
import { useThemeContext } from '@dxos/react-ui';
|
|
15
15
|
import {
|
|
16
|
-
EditorToolbar,
|
|
17
16
|
type Comment,
|
|
17
|
+
EditorToolbar,
|
|
18
|
+
type EditorViewMode,
|
|
18
19
|
comments,
|
|
19
20
|
createBasicExtensions,
|
|
20
21
|
createDataExtensions,
|
|
@@ -25,17 +26,20 @@ import {
|
|
|
25
26
|
formattingKeymap,
|
|
26
27
|
translations,
|
|
27
28
|
useComments,
|
|
29
|
+
useEditorToolbarState,
|
|
28
30
|
useFormattingState,
|
|
29
31
|
useTextEditor,
|
|
30
|
-
useEditorToolbarState,
|
|
31
|
-
type EditorViewMode,
|
|
32
32
|
} from '@dxos/react-ui-editor';
|
|
33
33
|
import { DataType } from '@dxos/schema';
|
|
34
34
|
import { withLayout, withTheme } from '@dxos/storybook-utils';
|
|
35
35
|
|
|
36
36
|
faker.seed(101);
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
type StoryProps = {
|
|
39
|
+
content?: string;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const DefaultStory = ({ content = '' }: StoryProps) => {
|
|
39
43
|
const { themeMode } = useThemeContext();
|
|
40
44
|
const [text] = useState(DataType.makeText(content));
|
|
41
45
|
const toolbarState = useEditorToolbarState({ viewMode: 'preview' });
|
|
@@ -47,7 +51,7 @@ const DefaultStory: FC<{ content?: string }> = ({ content = '' }) => {
|
|
|
47
51
|
extensions: [
|
|
48
52
|
formattingObserver,
|
|
49
53
|
createBasicExtensions({ readOnly: toolbarState.viewMode === 'readonly' }),
|
|
50
|
-
createMarkdownExtensions(
|
|
54
|
+
createMarkdownExtensions(),
|
|
51
55
|
createThemeExtensions({ themeMode, syntaxHighlighting: true, slots: editorSlots }),
|
|
52
56
|
createDataExtensions({ id: text.id, text: createDocAccessor(text, ['content']) }),
|
|
53
57
|
comments({
|
|
@@ -93,19 +97,21 @@ const content = [
|
|
|
93
97
|
'',
|
|
94
98
|
].join('\n');
|
|
95
99
|
|
|
96
|
-
const meta
|
|
100
|
+
const meta = {
|
|
97
101
|
title: 'plugins/plugin-markdown/Toolbar',
|
|
98
|
-
component: EditorToolbar,
|
|
99
|
-
render: DefaultStory
|
|
102
|
+
component: EditorToolbar as any,
|
|
103
|
+
render: DefaultStory,
|
|
100
104
|
decorators: [withTheme, withLayout({ fullscreen: true })],
|
|
101
105
|
parameters: {
|
|
102
106
|
translations,
|
|
103
107
|
},
|
|
104
|
-
}
|
|
108
|
+
} satisfies Meta<typeof DefaultStory>;
|
|
105
109
|
|
|
106
110
|
export default meta;
|
|
107
111
|
|
|
108
|
-
|
|
112
|
+
type Story = StoryObj<typeof meta>;
|
|
113
|
+
|
|
114
|
+
export const Default: Story = {
|
|
109
115
|
args: {
|
|
110
116
|
content,
|
|
111
117
|
},
|
package/src/components/index.ts
CHANGED
|
@@ -7,4 +7,4 @@ import { lazy } from 'react';
|
|
|
7
7
|
export * from './MarkdownSettings';
|
|
8
8
|
|
|
9
9
|
export const MarkdownContainer = lazy(() => import('./MarkdownContainer'));
|
|
10
|
-
export const
|
|
10
|
+
export const MarkdownCard = lazy(() => import('./MarkdownCard'));
|
package/src/extensions.tsx
CHANGED
|
@@ -7,27 +7,30 @@ import React, { type AnchorHTMLAttributes, type ReactNode, useMemo } from 'react
|
|
|
7
7
|
import { createRoot } from 'react-dom/client';
|
|
8
8
|
|
|
9
9
|
import {
|
|
10
|
-
createIntent,
|
|
11
10
|
LayoutAction,
|
|
12
11
|
type PromiseIntentDispatcher,
|
|
12
|
+
createIntent,
|
|
13
13
|
useCapabilities,
|
|
14
14
|
useIntentDispatcher,
|
|
15
15
|
} from '@dxos/app-framework';
|
|
16
16
|
import { debounceAndThrottle } from '@dxos/async';
|
|
17
17
|
import { invariant } from '@dxos/invariant';
|
|
18
|
-
import { createDocAccessor, fullyQualifiedId, getSpace
|
|
18
|
+
import { createDocAccessor, fullyQualifiedId, getSpace } from '@dxos/react-client/echo';
|
|
19
19
|
import { useIdentity } from '@dxos/react-client/halo';
|
|
20
20
|
import { Icon, ThemeProvider } from '@dxos/react-ui';
|
|
21
21
|
import { type SelectionManager } from '@dxos/react-ui-attention';
|
|
22
22
|
import {
|
|
23
|
-
|
|
23
|
+
Cursor,
|
|
24
24
|
type EditorStateStore,
|
|
25
|
+
EditorView,
|
|
25
26
|
type EditorViewMode,
|
|
26
27
|
type Extension,
|
|
27
28
|
InputModeExtensions,
|
|
29
|
+
type PreviewOptions,
|
|
30
|
+
type RenderCallback,
|
|
28
31
|
createDataExtensions,
|
|
29
|
-
autocomplete,
|
|
30
32
|
decorateMarkdown,
|
|
33
|
+
documentId,
|
|
31
34
|
folding,
|
|
32
35
|
formattingKeymap,
|
|
33
36
|
linkTooltip,
|
|
@@ -35,11 +38,6 @@ import {
|
|
|
35
38
|
preview,
|
|
36
39
|
selectionState,
|
|
37
40
|
typewriter,
|
|
38
|
-
type RenderCallback,
|
|
39
|
-
EditorView,
|
|
40
|
-
documentId,
|
|
41
|
-
Cursor,
|
|
42
|
-
type PreviewOptions,
|
|
43
41
|
} from '@dxos/react-ui-editor';
|
|
44
42
|
import { defaultTx } from '@dxos/react-ui-theme';
|
|
45
43
|
import { type DataType } from '@dxos/schema';
|
|
@@ -54,7 +52,6 @@ type ExtensionsOptions = {
|
|
|
54
52
|
id?: string;
|
|
55
53
|
text?: DataType.Text;
|
|
56
54
|
dispatch?: PromiseIntentDispatcher;
|
|
57
|
-
query?: QueryResult<Markdown.Document>;
|
|
58
55
|
settings: Markdown.Settings;
|
|
59
56
|
selectionManager?: SelectionManager;
|
|
60
57
|
viewMode?: EditorViewMode;
|
|
@@ -174,7 +171,6 @@ const createBaseExtensions = ({
|
|
|
174
171
|
dispatch,
|
|
175
172
|
settings,
|
|
176
173
|
selectionManager,
|
|
177
|
-
query,
|
|
178
174
|
viewMode,
|
|
179
175
|
previewOptions,
|
|
180
176
|
}: ExtensionsOptions): Extension[] => {
|
|
@@ -216,30 +212,6 @@ const createBaseExtensions = ({
|
|
|
216
212
|
);
|
|
217
213
|
}
|
|
218
214
|
|
|
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
215
|
if (settings.debug) {
|
|
244
216
|
const items = settings.typewriter?.split(/[,\n]/) ?? '';
|
|
245
217
|
if (items) {
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { Effect, Schema } from 'effect';
|
|
6
|
+
|
|
7
|
+
import { ArtifactId, applyDiffs } from '@dxos/assistant';
|
|
8
|
+
import { createDocAccessor } from '@dxos/echo-db';
|
|
9
|
+
import { DatabaseService, defineFunction } from '@dxos/functions';
|
|
10
|
+
import { trim } from '@dxos/util';
|
|
11
|
+
|
|
12
|
+
import { Markdown } from '../types';
|
|
13
|
+
|
|
14
|
+
// TODO(wittjosiah): Reconcile with ThreadAction.AddProposal.
|
|
15
|
+
export default defineFunction({
|
|
16
|
+
name: 'dxos.org/function/markdown/diff',
|
|
17
|
+
description: trim`
|
|
18
|
+
Applies a set of diffs to the markdown document.
|
|
19
|
+
`,
|
|
20
|
+
inputSchema: Schema.Struct({
|
|
21
|
+
id: ArtifactId.annotations({
|
|
22
|
+
description: 'The ID of the markdown document.',
|
|
23
|
+
}),
|
|
24
|
+
diffs: Schema.Array(Schema.String).annotations({
|
|
25
|
+
description: 'The diffs to apply to the document.',
|
|
26
|
+
}),
|
|
27
|
+
}),
|
|
28
|
+
outputSchema: Schema.Void,
|
|
29
|
+
handler: Effect.fn(function* ({ data: { id, diffs } }) {
|
|
30
|
+
const object = yield* DatabaseService.resolve(ArtifactId.toDXN(id), Markdown.Document);
|
|
31
|
+
const content = yield* Effect.promise(() => object.content.load());
|
|
32
|
+
const accessor = createDocAccessor(content, ['content']);
|
|
33
|
+
applyDiffs(accessor, diffs);
|
|
34
|
+
}),
|
|
35
|
+
});
|