@dxos/plugin-markdown 0.8.2-staging.7ac8446 → 0.8.2
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/MarkdownContainer-5IEINNQB.mjs +588 -0
- package/dist/lib/browser/MarkdownContainer-5IEINNQB.mjs.map +7 -0
- package/dist/lib/browser/MarkdownPreview-YW5CS3ID.mjs +87 -0
- package/dist/lib/browser/MarkdownPreview-YW5CS3ID.mjs.map +7 -0
- package/dist/lib/browser/anchor-sort-VS4OZVPP.mjs +32 -0
- package/dist/lib/browser/anchor-sort-VS4OZVPP.mjs.map +7 -0
- package/dist/lib/browser/{app-graph-serializer-NOXI4IQ5.mjs → app-graph-serializer-V6RLEHVY.mjs} +5 -6
- package/dist/lib/browser/app-graph-serializer-V6RLEHVY.mjs.map +7 -0
- package/dist/lib/browser/{artifact-definition-CE6J6NY4.mjs → artifact-definition-5NAODQLG.mjs} +65 -17
- package/dist/lib/browser/artifact-definition-5NAODQLG.mjs.map +7 -0
- package/dist/lib/browser/{chunk-3ULJ4FIJ.mjs → chunk-77NGW7EO.mjs} +12 -26
- package/dist/lib/browser/chunk-77NGW7EO.mjs.map +7 -0
- package/dist/lib/browser/chunk-ACAID3XF.mjs +20 -0
- package/dist/lib/browser/chunk-ACAID3XF.mjs.map +7 -0
- package/dist/lib/browser/{chunk-QXDKFACU.mjs → chunk-C5RABVIX.mjs} +6 -5
- package/dist/lib/browser/chunk-C5RABVIX.mjs.map +7 -0
- package/dist/lib/browser/chunk-ECSM56YC.mjs +80 -0
- package/dist/lib/browser/chunk-ECSM56YC.mjs.map +7 -0
- package/dist/lib/browser/{chunk-NAGMSX77.mjs → chunk-QVJETNGS.mjs} +2 -2
- package/dist/lib/{node-esm/chunk-ETXPC5VP.mjs.map → browser/chunk-QVJETNGS.mjs.map} +1 -1
- package/dist/lib/browser/index.mjs +34 -18
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/intent-resolver-4GDYST4Y.mjs +65 -0
- package/dist/lib/browser/intent-resolver-4GDYST4Y.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/react-surface-QE4SKXBT.mjs +200 -0
- package/dist/lib/browser/react-surface-QE4SKXBT.mjs.map +7 -0
- package/dist/lib/browser/{settings-GCSS3Y4Z.mjs → settings-W5CK4PXP.mjs} +4 -4
- package/dist/lib/browser/settings-W5CK4PXP.mjs.map +7 -0
- package/dist/lib/browser/{state-O7P5JDIH.mjs → state-KI6PJ6DT.mjs} +3 -3
- package/dist/lib/browser/state-KI6PJ6DT.mjs.map +7 -0
- package/dist/lib/browser/types/index.mjs +3 -1
- package/dist/lib/node/MarkdownContainer-LSNNPNRB.cjs +601 -0
- package/dist/lib/node/MarkdownContainer-LSNNPNRB.cjs.map +7 -0
- package/dist/lib/node/MarkdownPreview-G34HSQEB.cjs +110 -0
- package/dist/lib/node/MarkdownPreview-G34HSQEB.cjs.map +7 -0
- package/dist/lib/node/{thread-42R57L4K.cjs → anchor-sort-NHVF23EU.cjs} +15 -20
- package/dist/lib/node/anchor-sort-NHVF23EU.cjs.map +7 -0
- package/dist/lib/node/{app-graph-serializer-HKK3SEDN.cjs → app-graph-serializer-CLALIYN3.cjs} +10 -11
- package/dist/lib/node/app-graph-serializer-CLALIYN3.cjs.map +7 -0
- package/dist/lib/node/{artifact-definition-XGADFWCQ.cjs → artifact-definition-VEAHK7BX.cjs} +68 -21
- package/dist/lib/node/artifact-definition-VEAHK7BX.cjs.map +7 -0
- package/dist/lib/node/chunk-C4HR7UXE.cjs +58 -0
- package/dist/lib/node/chunk-C4HR7UXE.cjs.map +7 -0
- package/dist/lib/node/{chunk-7QVONRSI.cjs → chunk-G7RBJX22.cjs} +13 -41
- package/dist/lib/node/chunk-G7RBJX22.cjs.map +7 -0
- package/dist/lib/node/{chunk-DZXTXSXX.cjs → chunk-IFYSBQE5.cjs} +5 -5
- package/dist/lib/node/{chunk-DZXTXSXX.cjs.map → chunk-IFYSBQE5.cjs.map} +1 -1
- package/dist/lib/node/{chunk-UEXGNGSS.cjs → chunk-RQS4KBMG.cjs} +45 -39
- package/dist/lib/node/chunk-RQS4KBMG.cjs.map +7 -0
- package/dist/lib/node/{chunk-H5MYVP6F.cjs → chunk-ZDTL47I7.cjs} +9 -8
- package/dist/lib/node/chunk-ZDTL47I7.cjs.map +7 -0
- package/dist/lib/node/index.cjs +43 -28
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/intent-resolver-AUZVK3NZ.cjs +78 -0
- package/dist/lib/node/intent-resolver-AUZVK3NZ.cjs.map +7 -0
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/react-surface-WJZTEBYO.cjs +213 -0
- package/dist/lib/node/react-surface-WJZTEBYO.cjs.map +7 -0
- package/dist/lib/node/{settings-S2ISUVIH.cjs → settings-IRKU3WPM.cjs} +7 -7
- package/dist/lib/node/settings-IRKU3WPM.cjs.map +7 -0
- package/dist/lib/node/{state-L44SG3ZM.cjs → state-KKDRAG7X.cjs} +7 -7
- package/dist/lib/node/state-KKDRAG7X.cjs.map +7 -0
- package/dist/lib/node/types/index.cjs +8 -6
- package/dist/lib/node/types/index.cjs.map +2 -2
- package/dist/lib/node-esm/MarkdownContainer-UZSLXMWO.mjs +589 -0
- package/dist/lib/node-esm/MarkdownContainer-UZSLXMWO.mjs.map +7 -0
- package/dist/lib/node-esm/MarkdownPreview-TCV7BI32.mjs +88 -0
- package/dist/lib/node-esm/MarkdownPreview-TCV7BI32.mjs.map +7 -0
- package/dist/lib/node-esm/anchor-sort-G2HLCYFK.mjs +33 -0
- package/dist/lib/node-esm/anchor-sort-G2HLCYFK.mjs.map +7 -0
- package/dist/lib/node-esm/{app-graph-serializer-QQ2CTHOQ.mjs → app-graph-serializer-C3RNTQGM.mjs} +5 -6
- package/dist/lib/node-esm/app-graph-serializer-C3RNTQGM.mjs.map +7 -0
- package/dist/lib/node-esm/{artifact-definition-WRG5ZRN5.mjs → artifact-definition-7TIJW2CO.mjs} +65 -17
- package/dist/lib/node-esm/artifact-definition-7TIJW2CO.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-F6UHVLH7.mjs → chunk-6RPARLIK.mjs} +12 -26
- package/dist/lib/node-esm/chunk-6RPARLIK.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-EIUTPXGL.mjs +22 -0
- package/dist/lib/node-esm/chunk-EIUTPXGL.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-ETXPC5VP.mjs → chunk-JXXDCSMW.mjs} +2 -2
- package/dist/lib/{browser/chunk-NAGMSX77.mjs.map → node-esm/chunk-JXXDCSMW.mjs.map} +1 -1
- package/dist/lib/node-esm/chunk-NCMPVEXO.mjs +81 -0
- package/dist/lib/node-esm/chunk-NCMPVEXO.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-JAVD67QP.mjs → chunk-TCFJNUAE.mjs} +6 -5
- package/dist/lib/node-esm/chunk-TCFJNUAE.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +34 -18
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/intent-resolver-FTNXUNI2.mjs +66 -0
- package/dist/lib/node-esm/intent-resolver-FTNXUNI2.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/react-surface-XNM3YDFB.mjs +201 -0
- package/dist/lib/node-esm/react-surface-XNM3YDFB.mjs.map +7 -0
- package/dist/lib/node-esm/{settings-ZDIFTK4N.mjs → settings-MK7D7LHQ.mjs} +4 -4
- package/dist/lib/node-esm/settings-MK7D7LHQ.mjs.map +7 -0
- package/dist/lib/node-esm/{state-DWPOKLEY.mjs → state-LLGVRYKL.mjs} +3 -3
- package/dist/lib/node-esm/state-LLGVRYKL.mjs.map +7 -0
- package/dist/lib/node-esm/types/index.mjs +3 -1
- package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/anchor-sort.d.ts +6 -0
- package/dist/types/src/capabilities/anchor-sort.d.ts.map +1 -0
- package/dist/types/src/capabilities/app-graph-serializer.d.ts +2 -2
- package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -1
- package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +7 -7
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts +2 -2
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +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/components/MarkdownContainer.d.ts +5 -3
- package/dist/types/src/components/MarkdownContainer.d.ts.map +1 -1
- package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +24 -0
- package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -0
- package/dist/types/src/components/{MarkdownEditor.stories.d.ts → MarkdownEditor/MarkdownEditor.stories.d.ts} +3 -3
- package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts.map +1 -0
- package/dist/types/src/components/MarkdownEditor/index.d.ts +2 -0
- package/dist/types/src/components/MarkdownEditor/index.d.ts.map +1 -0
- package/dist/types/src/components/MarkdownPreview/MarkdownPreview.d.ts +6 -0
- package/dist/types/src/components/MarkdownPreview/MarkdownPreview.d.ts.map +1 -0
- package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts +23 -0
- package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts.map +1 -0
- package/dist/types/src/components/MarkdownPreview/index.d.ts +4 -0
- package/dist/types/src/components/MarkdownPreview/index.d.ts.map +1 -0
- package/dist/types/src/components/{MarkdownSettings.d.ts → MarkdownSettings/MarkdownSettings.d.ts} +1 -1
- package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts.map +1 -0
- package/dist/types/src/components/MarkdownSettings/index.d.ts +2 -0
- package/dist/types/src/components/MarkdownSettings/index.d.ts.map +1 -0
- package/dist/types/src/components/Suggestions.stories.d.ts +12 -0
- package/dist/types/src/components/Suggestions.stories.d.ts.map +1 -0
- package/dist/types/src/components/Toolbar.stories.d.ts +2 -2
- package/dist/types/src/components/Toolbar.stories.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +2 -1
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/extensions.d.ts +8 -5
- package/dist/types/src/extensions.d.ts.map +1 -1
- package/dist/types/src/hooks/useSelectCurrentThread.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +4 -42
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/schema.d.ts +29 -129
- package/dist/types/src/types/schema.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +40 -88
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/src/util.d.ts +1 -0
- package/dist/types/src/util.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +48 -34
- package/src/MarkdownPlugin.tsx +22 -12
- package/src/capabilities/anchor-sort.ts +30 -0
- package/src/capabilities/app-graph-serializer.ts +4 -5
- package/src/capabilities/artifact-definition.ts +48 -10
- package/src/capabilities/index.ts +1 -1
- package/src/capabilities/intent-resolver.ts +40 -12
- package/src/capabilities/react-surface.tsx +20 -5
- package/src/capabilities/settings.ts +2 -2
- package/src/capabilities/state.ts +4 -4
- package/src/components/MarkdownContainer.tsx +20 -7
- package/src/components/{MarkdownEditor.stories.tsx → MarkdownEditor/MarkdownEditor.stories.tsx} +22 -35
- package/src/components/{MarkdownEditor.tsx → MarkdownEditor/MarkdownEditor.tsx} +32 -73
- package/src/components/MarkdownEditor/index.ts +5 -0
- package/src/components/MarkdownPreview/MarkdownPreview.stories.tsx +73 -0
- package/src/components/MarkdownPreview/MarkdownPreview.tsx +85 -0
- package/src/components/MarkdownPreview/index.ts +9 -0
- package/src/components/{MarkdownSettings.tsx → MarkdownSettings/MarkdownSettings.tsx} +2 -2
- package/src/components/MarkdownSettings/index.ts +5 -0
- package/src/components/Suggestions.stories.tsx +216 -0
- package/src/components/Toolbar.stories.tsx +29 -29
- package/src/components/index.ts +1 -0
- package/src/extensions.tsx +82 -48
- package/src/hooks/useSelectCurrentThread.tsx +2 -2
- package/src/translations.ts +3 -3
- package/src/types/schema.ts +22 -15
- package/src/types/types.ts +23 -21
- package/src/util.tsx +8 -4
- package/dist/lib/browser/MarkdownContainer-T3HU27RE.mjs +0 -563
- package/dist/lib/browser/MarkdownContainer-T3HU27RE.mjs.map +0 -7
- package/dist/lib/browser/app-graph-serializer-NOXI4IQ5.mjs.map +0 -7
- package/dist/lib/browser/artifact-definition-CE6J6NY4.mjs.map +0 -7
- package/dist/lib/browser/chunk-3ULJ4FIJ.mjs.map +0 -7
- package/dist/lib/browser/chunk-QXDKFACU.mjs.map +0 -7
- package/dist/lib/browser/chunk-YCJNW2RU.mjs +0 -75
- package/dist/lib/browser/chunk-YCJNW2RU.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-42GQ6HNZ.mjs +0 -50
- package/dist/lib/browser/intent-resolver-42GQ6HNZ.mjs.map +0 -7
- package/dist/lib/browser/react-surface-RQX3CPFV.mjs +0 -176
- package/dist/lib/browser/react-surface-RQX3CPFV.mjs.map +0 -7
- package/dist/lib/browser/settings-GCSS3Y4Z.mjs.map +0 -7
- package/dist/lib/browser/state-O7P5JDIH.mjs.map +0 -7
- package/dist/lib/browser/thread-3QGCFNVZ.mjs +0 -37
- package/dist/lib/browser/thread-3QGCFNVZ.mjs.map +0 -7
- package/dist/lib/node/MarkdownContainer-6ZJIFAP6.cjs +0 -576
- package/dist/lib/node/MarkdownContainer-6ZJIFAP6.cjs.map +0 -7
- package/dist/lib/node/app-graph-serializer-HKK3SEDN.cjs.map +0 -7
- package/dist/lib/node/artifact-definition-XGADFWCQ.cjs.map +0 -7
- package/dist/lib/node/chunk-7QVONRSI.cjs.map +0 -7
- package/dist/lib/node/chunk-H5MYVP6F.cjs.map +0 -7
- package/dist/lib/node/chunk-UEXGNGSS.cjs.map +0 -7
- package/dist/lib/node/intent-resolver-NW27BF3W.cjs +0 -63
- package/dist/lib/node/intent-resolver-NW27BF3W.cjs.map +0 -7
- package/dist/lib/node/react-surface-5X3SMHGI.cjs +0 -189
- package/dist/lib/node/react-surface-5X3SMHGI.cjs.map +0 -7
- package/dist/lib/node/settings-S2ISUVIH.cjs.map +0 -7
- package/dist/lib/node/state-L44SG3ZM.cjs.map +0 -7
- package/dist/lib/node/thread-42R57L4K.cjs.map +0 -7
- package/dist/lib/node-esm/MarkdownContainer-URAPTO37.mjs +0 -564
- package/dist/lib/node-esm/MarkdownContainer-URAPTO37.mjs.map +0 -7
- package/dist/lib/node-esm/app-graph-serializer-QQ2CTHOQ.mjs.map +0 -7
- package/dist/lib/node-esm/artifact-definition-WRG5ZRN5.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-4AM4VU3Y.mjs +0 -76
- package/dist/lib/node-esm/chunk-4AM4VU3Y.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-F6UHVLH7.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-JAVD67QP.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-7HOMUVHR.mjs +0 -51
- package/dist/lib/node-esm/intent-resolver-7HOMUVHR.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-6IKC3G46.mjs +0 -177
- package/dist/lib/node-esm/react-surface-6IKC3G46.mjs.map +0 -7
- package/dist/lib/node-esm/settings-ZDIFTK4N.mjs.map +0 -7
- package/dist/lib/node-esm/state-DWPOKLEY.mjs.map +0 -7
- package/dist/lib/node-esm/thread-R2KHZD6V.mjs +0 -38
- package/dist/lib/node-esm/thread-R2KHZD6V.mjs.map +0 -7
- package/dist/types/src/capabilities/thread.d.ts +0 -6
- package/dist/types/src/capabilities/thread.d.ts.map +0 -1
- package/dist/types/src/components/MarkdownEditor.d.ts +0 -39
- package/dist/types/src/components/MarkdownEditor.d.ts.map +0 -1
- package/dist/types/src/components/MarkdownEditor.stories.d.ts.map +0 -1
- package/dist/types/src/components/MarkdownSettings.d.ts.map +0 -1
- package/src/capabilities/thread.ts +0 -35
|
@@ -5,15 +5,16 @@
|
|
|
5
5
|
import '@dxos-theme';
|
|
6
6
|
|
|
7
7
|
import { type Meta } from '@storybook/react';
|
|
8
|
-
import React, { type FC, useState } from 'react';
|
|
8
|
+
import React, { type FC, useCallback, useState } from 'react';
|
|
9
9
|
|
|
10
|
+
import { invariant } from '@dxos/invariant';
|
|
10
11
|
import { PublicKey } from '@dxos/keys';
|
|
11
|
-
import {
|
|
12
|
+
import { live } from '@dxos/live-object';
|
|
12
13
|
import { faker } from '@dxos/random';
|
|
13
14
|
import { createDocAccessor, createObject } from '@dxos/react-client/echo';
|
|
14
15
|
import { useThemeContext } from '@dxos/react-ui';
|
|
15
16
|
import {
|
|
16
|
-
|
|
17
|
+
EditorToolbar,
|
|
17
18
|
type Comment,
|
|
18
19
|
comments,
|
|
19
20
|
createBasicExtensions,
|
|
@@ -21,26 +22,23 @@ import {
|
|
|
21
22
|
createMarkdownExtensions,
|
|
22
23
|
createThemeExtensions,
|
|
23
24
|
decorateMarkdown,
|
|
24
|
-
|
|
25
|
+
editorSlots,
|
|
25
26
|
formattingKeymap,
|
|
26
|
-
EditorToolbar,
|
|
27
27
|
translations,
|
|
28
|
-
useActionHandler,
|
|
29
28
|
useComments,
|
|
30
29
|
useFormattingState,
|
|
31
30
|
useTextEditor,
|
|
32
31
|
useEditorToolbarState,
|
|
32
|
+
type EditorViewMode,
|
|
33
33
|
} from '@dxos/react-ui-editor';
|
|
34
|
-
import {
|
|
34
|
+
import { DataType } from '@dxos/schema';
|
|
35
35
|
import { withLayout, withTheme } from '@dxos/storybook-utils';
|
|
36
36
|
|
|
37
37
|
faker.seed(101);
|
|
38
38
|
|
|
39
|
-
const _onUpload = async (file: File) => ({ url: file.name });
|
|
40
|
-
|
|
41
39
|
const DefaultStory: FC<{ content?: string }> = ({ content = '' }) => {
|
|
42
40
|
const { themeMode } = useThemeContext();
|
|
43
|
-
const [text] = useState(createObject(
|
|
41
|
+
const [text] = useState(createObject(live(DataType.Text, { content })));
|
|
44
42
|
const toolbarState = useEditorToolbarState({ viewMode: 'preview' });
|
|
45
43
|
const formattingObserver = useFormattingState(toolbarState);
|
|
46
44
|
const { parentRef, view } = useTextEditor(() => {
|
|
@@ -51,7 +49,7 @@ const DefaultStory: FC<{ content?: string }> = ({ content = '' }) => {
|
|
|
51
49
|
formattingObserver,
|
|
52
50
|
createBasicExtensions({ readOnly: toolbarState.viewMode === 'readonly' }),
|
|
53
51
|
createMarkdownExtensions({ themeMode }),
|
|
54
|
-
createThemeExtensions({ themeMode, syntaxHighlighting: true, slots:
|
|
52
|
+
createThemeExtensions({ themeMode, syntaxHighlighting: true, slots: editorSlots }),
|
|
55
53
|
createDataExtensions({ id: text.id, text: createDocAccessor(text, ['content']) }),
|
|
56
54
|
comments({
|
|
57
55
|
onCreate: ({ cursor }) => {
|
|
@@ -66,22 +64,22 @@ const DefaultStory: FC<{ content?: string }> = ({ content = '' }) => {
|
|
|
66
64
|
};
|
|
67
65
|
}, [text, formattingObserver, toolbarState.viewMode, themeMode]);
|
|
68
66
|
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
if (action.type === 'view-mode') {
|
|
72
|
-
toolbarState.viewMode = action.properties.data;
|
|
73
|
-
} else {
|
|
74
|
-
handleToolbarAction?.(action);
|
|
75
|
-
}
|
|
67
|
+
const handleViewModeChange = (viewMode: EditorViewMode) => {
|
|
68
|
+
toolbarState.viewMode = viewMode;
|
|
76
69
|
};
|
|
77
70
|
|
|
71
|
+
const getView = useCallback(() => {
|
|
72
|
+
invariant(view);
|
|
73
|
+
return view;
|
|
74
|
+
}, [view]);
|
|
75
|
+
|
|
78
76
|
const [_comments, setComments] = useState<Comment[]>([]);
|
|
79
77
|
useComments(view, text.id, _comments);
|
|
80
78
|
|
|
81
79
|
return (
|
|
82
|
-
<div role='none' className='
|
|
83
|
-
<EditorToolbar
|
|
84
|
-
<div ref={parentRef} />
|
|
80
|
+
<div role='none' className='flex flex-col'>
|
|
81
|
+
<EditorToolbar state={toolbarState ?? {}} getView={getView} viewMode={handleViewModeChange} />
|
|
82
|
+
<div className='flex grow overflow-hidden' ref={parentRef} />
|
|
85
83
|
</div>
|
|
86
84
|
);
|
|
87
85
|
};
|
|
@@ -96,18 +94,20 @@ const content = [
|
|
|
96
94
|
'',
|
|
97
95
|
].join('\n');
|
|
98
96
|
|
|
99
|
-
export const Default = {
|
|
100
|
-
args: {
|
|
101
|
-
content,
|
|
102
|
-
},
|
|
103
|
-
};
|
|
104
|
-
|
|
105
97
|
const meta: Meta<typeof EditorToolbar> = {
|
|
106
98
|
title: 'plugins/plugin-markdown/Toolbar',
|
|
107
99
|
component: EditorToolbar,
|
|
108
100
|
render: DefaultStory as any,
|
|
109
|
-
decorators: [withTheme, withLayout({
|
|
110
|
-
parameters: {
|
|
101
|
+
decorators: [withTheme, withLayout({ fullscreen: true })],
|
|
102
|
+
parameters: {
|
|
103
|
+
translations,
|
|
104
|
+
},
|
|
111
105
|
};
|
|
112
106
|
|
|
113
107
|
export default meta;
|
|
108
|
+
|
|
109
|
+
export const Default = {
|
|
110
|
+
args: {
|
|
111
|
+
content,
|
|
112
|
+
},
|
|
113
|
+
};
|
package/src/components/index.ts
CHANGED
package/src/extensions.tsx
CHANGED
|
@@ -13,9 +13,10 @@ import {
|
|
|
13
13
|
useIntentDispatcher,
|
|
14
14
|
} from '@dxos/app-framework';
|
|
15
15
|
import { invariant } from '@dxos/invariant';
|
|
16
|
-
import { createDocAccessor, fullyQualifiedId, getSpace, type
|
|
16
|
+
import { createDocAccessor, fullyQualifiedId, getSpace, type QueryResult } from '@dxos/react-client/echo';
|
|
17
17
|
import { useIdentity } from '@dxos/react-client/halo';
|
|
18
18
|
import { Icon, ThemeProvider } from '@dxos/react-ui';
|
|
19
|
+
import { type SelectionManager } from '@dxos/react-ui-attention';
|
|
19
20
|
import {
|
|
20
21
|
type AutocompleteResult,
|
|
21
22
|
type EditorStateStore,
|
|
@@ -29,11 +30,16 @@ import {
|
|
|
29
30
|
formattingKeymap,
|
|
30
31
|
linkTooltip,
|
|
31
32
|
listener,
|
|
33
|
+
preview,
|
|
32
34
|
selectionState,
|
|
33
35
|
typewriter,
|
|
36
|
+
type RenderCallback,
|
|
37
|
+
EditorView,
|
|
38
|
+
documentId,
|
|
39
|
+
Cursor,
|
|
34
40
|
} from '@dxos/react-ui-editor';
|
|
35
41
|
import { defaultTx } from '@dxos/react-ui-theme';
|
|
36
|
-
import { type
|
|
42
|
+
import { type DataType } from '@dxos/schema';
|
|
37
43
|
import { isNotFalsy } from '@dxos/util';
|
|
38
44
|
|
|
39
45
|
import { MarkdownCapabilities } from './capabilities';
|
|
@@ -43,10 +49,11 @@ import { setFallbackName } from './util';
|
|
|
43
49
|
type ExtensionsOptions = {
|
|
44
50
|
document?: DocumentType;
|
|
45
51
|
id?: string;
|
|
46
|
-
text?:
|
|
52
|
+
text?: DataType.Text;
|
|
47
53
|
dispatch?: PromiseIntentDispatcher;
|
|
48
|
-
query?:
|
|
54
|
+
query?: QueryResult<DocumentType>;
|
|
49
55
|
settings: MarkdownSettingsProps;
|
|
56
|
+
selectionManager?: SelectionManager;
|
|
50
57
|
viewMode?: EditorViewMode;
|
|
51
58
|
editorStateStore?: EditorStateStore;
|
|
52
59
|
};
|
|
@@ -57,6 +64,7 @@ export const useExtensions = ({
|
|
|
57
64
|
id,
|
|
58
65
|
text,
|
|
59
66
|
settings,
|
|
67
|
+
selectionManager,
|
|
60
68
|
viewMode,
|
|
61
69
|
editorStateStore,
|
|
62
70
|
}: ExtensionsOptions): Extension[] => {
|
|
@@ -66,7 +74,7 @@ export const useExtensions = ({
|
|
|
66
74
|
|
|
67
75
|
// TODO(wittjosiah): Autocomplete is not working and this query is causing performance issues.
|
|
68
76
|
// TODO(burdon): Unsubscribe.
|
|
69
|
-
// const query = space?.db.query(Filter.
|
|
77
|
+
// const query = space?.db.query(Filter.type(DocumentType));
|
|
70
78
|
// query?.subscribe();
|
|
71
79
|
const baseExtensions = useMemo(
|
|
72
80
|
() =>
|
|
@@ -75,6 +83,7 @@ export const useExtensions = ({
|
|
|
75
83
|
id,
|
|
76
84
|
text,
|
|
77
85
|
settings,
|
|
86
|
+
selectionManager,
|
|
78
87
|
viewMode,
|
|
79
88
|
dispatch,
|
|
80
89
|
// query,
|
|
@@ -91,6 +100,7 @@ export const useExtensions = ({
|
|
|
91
100
|
settings.numberedHeadings,
|
|
92
101
|
settings.debug,
|
|
93
102
|
settings.typewriter,
|
|
103
|
+
selectionManager,
|
|
94
104
|
],
|
|
95
105
|
);
|
|
96
106
|
|
|
@@ -99,18 +109,20 @@ export const useExtensions = ({
|
|
|
99
109
|
//
|
|
100
110
|
// External extensions from other plugins.
|
|
101
111
|
//
|
|
102
|
-
const pluginExtensions = useMemo<Extension[]
|
|
103
|
-
()
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
if (extension) {
|
|
107
|
-
acc.push(extension);
|
|
108
|
-
}
|
|
112
|
+
const pluginExtensions = useMemo<Extension[]>(() => {
|
|
113
|
+
if (!document) {
|
|
114
|
+
return [];
|
|
115
|
+
}
|
|
109
116
|
|
|
110
|
-
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
|
|
117
|
+
return extensionProviders.flat().reduce((acc: Extension[], provider) => {
|
|
118
|
+
const extension = typeof provider === 'function' ? provider({ document }) : provider;
|
|
119
|
+
if (extension) {
|
|
120
|
+
acc.push(extension);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return acc;
|
|
124
|
+
}, []);
|
|
125
|
+
}, [extensionProviders, document]);
|
|
114
126
|
|
|
115
127
|
//
|
|
116
128
|
// Basic plugins.
|
|
@@ -154,10 +166,12 @@ const createBaseExtensions = ({
|
|
|
154
166
|
id,
|
|
155
167
|
dispatch,
|
|
156
168
|
settings,
|
|
169
|
+
selectionManager,
|
|
157
170
|
query,
|
|
158
171
|
viewMode,
|
|
159
172
|
}: ExtensionsOptions): Extension[] => {
|
|
160
173
|
const extensions: Extension[] = [
|
|
174
|
+
selectionManager && selectionChange(selectionManager),
|
|
161
175
|
settings.editorInputMode && InputModeExtensions[settings.editorInputMode],
|
|
162
176
|
settings.folding && folding(),
|
|
163
177
|
].filter(isNotFalsy);
|
|
@@ -175,7 +189,7 @@ const createBaseExtensions = ({
|
|
|
175
189
|
// TODO(wittjosiah): For internal links, consider ignoring the link text and rendering the label of the object being linked to.
|
|
176
190
|
renderLinkButton:
|
|
177
191
|
dispatch && (document || id)
|
|
178
|
-
?
|
|
192
|
+
? createLinkRenderer((id: string) => {
|
|
179
193
|
void dispatch(
|
|
180
194
|
createIntent(LayoutAction.Open, {
|
|
181
195
|
part: 'main',
|
|
@@ -189,6 +203,7 @@ const createBaseExtensions = ({
|
|
|
189
203
|
: undefined,
|
|
190
204
|
}),
|
|
191
205
|
linkTooltip(renderLinkTooltip),
|
|
206
|
+
preview(),
|
|
192
207
|
],
|
|
193
208
|
);
|
|
194
209
|
}
|
|
@@ -227,46 +242,65 @@ const createBaseExtensions = ({
|
|
|
227
242
|
return extensions;
|
|
228
243
|
};
|
|
229
244
|
|
|
245
|
+
export const selectionChange = (selectionManager: SelectionManager) => {
|
|
246
|
+
return EditorView.updateListener.of((update) => {
|
|
247
|
+
if (update.selectionSet) {
|
|
248
|
+
const id = update.state.facet(documentId);
|
|
249
|
+
const cursorConverter = update.state.facet(Cursor.converter);
|
|
250
|
+
const selection = update.state.selection;
|
|
251
|
+
const ranges = selection.ranges
|
|
252
|
+
.map((range) => ({
|
|
253
|
+
from: cursorConverter.toCursor(range.from),
|
|
254
|
+
to: cursorConverter.toCursor(range.to),
|
|
255
|
+
}))
|
|
256
|
+
.filter(({ from, to }) => to > from);
|
|
257
|
+
selectionManager.updateMultiRange(id, ranges);
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
};
|
|
261
|
+
|
|
230
262
|
// TODO(burdon): Factor out styles.
|
|
231
263
|
const style = {
|
|
232
264
|
hover: 'rounded-sm text-primary-500 hover:text-primary-600 dark:text-primary-500 hover:dark:text-primary-400',
|
|
233
265
|
icon: 'inline-block leading-none mis-1 cursor-pointer',
|
|
234
266
|
};
|
|
235
267
|
|
|
236
|
-
const
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
268
|
+
const createLinkRenderer =
|
|
269
|
+
(onSelectObject: (id: string) => void): RenderCallback<{ url: string }> =>
|
|
270
|
+
(el, { url }) => {
|
|
271
|
+
// TODO(burdon): Formalize/document internal link format.
|
|
272
|
+
const isInternal =
|
|
273
|
+
url.startsWith('/') ||
|
|
274
|
+
// TODO(wittjosiah): This should probably be parsed out on paste?
|
|
275
|
+
url.startsWith(window.location.origin);
|
|
242
276
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
277
|
+
const options: AnchorHTMLAttributes<any> = isInternal
|
|
278
|
+
? {
|
|
279
|
+
onClick: () => {
|
|
280
|
+
const qualifiedId = url.split('/').at(-1);
|
|
281
|
+
invariant(qualifiedId, 'Invalid link format.');
|
|
282
|
+
onSelectObject(qualifiedId);
|
|
283
|
+
},
|
|
284
|
+
}
|
|
285
|
+
: {
|
|
286
|
+
href: url,
|
|
287
|
+
rel: 'noreferrer',
|
|
288
|
+
target: '_blank',
|
|
289
|
+
};
|
|
256
290
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
};
|
|
291
|
+
renderRoot(
|
|
292
|
+
el,
|
|
293
|
+
<a {...options} className={style.hover}>
|
|
294
|
+
<Icon
|
|
295
|
+
icon={isInternal ? 'ph--arrow-square-down--bold' : 'ph--arrow-square-out--bold'}
|
|
296
|
+
size={4}
|
|
297
|
+
classNames={style.icon}
|
|
298
|
+
/>
|
|
299
|
+
</a>,
|
|
300
|
+
);
|
|
301
|
+
};
|
|
268
302
|
|
|
269
|
-
const renderLinkTooltip = (el
|
|
303
|
+
const renderLinkTooltip: RenderCallback<{ url: string }> = (el, { url }) => {
|
|
270
304
|
const web = new URL(url);
|
|
271
305
|
renderRoot(
|
|
272
306
|
el,
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { EditorView } from '@codemirror/view';
|
|
6
|
+
import { Schema } from 'effect';
|
|
6
7
|
import { useMemo } from 'react';
|
|
7
8
|
|
|
8
9
|
import { createResolver, LayoutAction, useIntentResolver } from '@dxos/app-framework';
|
|
9
|
-
import { S } from '@dxos/echo-schema';
|
|
10
10
|
import { invariant } from '@dxos/invariant';
|
|
11
11
|
import { Cursor, setSelection } from '@dxos/react-ui-editor';
|
|
12
12
|
|
|
@@ -22,7 +22,7 @@ export const useSelectCurrentThread = (editorView: EditorView | undefined, docum
|
|
|
22
22
|
intent: LayoutAction.UpdateLayout,
|
|
23
23
|
position: 'hoist',
|
|
24
24
|
filter: (data): data is { part: 'current'; subject: string; options: { cursor: string } } => {
|
|
25
|
-
if (!
|
|
25
|
+
if (!Schema.is(LayoutAction.ScrollIntoView.fields.input)(data)) {
|
|
26
26
|
return false;
|
|
27
27
|
}
|
|
28
28
|
|
package/src/translations.ts
CHANGED
|
@@ -2,15 +2,13 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { getSchemaTypename } from '@dxos/echo-schema';
|
|
6
|
-
|
|
7
5
|
import { MARKDOWN_PLUGIN } from './meta';
|
|
8
6
|
import { DocumentType } from './types';
|
|
9
7
|
|
|
10
8
|
export default [
|
|
11
9
|
{
|
|
12
10
|
'en-US': {
|
|
13
|
-
[
|
|
11
|
+
[DocumentType.typename]: {
|
|
14
12
|
'typename label': 'Document',
|
|
15
13
|
'object name placeholder': 'New document',
|
|
16
14
|
},
|
|
@@ -35,6 +33,8 @@ export default [
|
|
|
35
33
|
'toggle view mode label': 'Toggle read-only',
|
|
36
34
|
'default view mode label': 'Default view mode',
|
|
37
35
|
'upload image label': 'Upload image',
|
|
36
|
+
'fallback title': 'Untitled',
|
|
37
|
+
'navigate to document label': 'Open document',
|
|
38
38
|
},
|
|
39
39
|
},
|
|
40
40
|
},
|
package/src/types/schema.ts
CHANGED
|
@@ -2,23 +2,30 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
import { ThreadType } from '@dxos/plugin-space/types';
|
|
7
|
-
import { TextType } from '@dxos/schema';
|
|
5
|
+
import { Schema } from 'effect';
|
|
8
6
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
threads: S.mutable(S.Array(Ref(ThreadType))),
|
|
14
|
-
assistantChatQueue: S.optional(Ref(Expando)),
|
|
15
|
-
}).annotations({
|
|
16
|
-
// TODO(dmaretskyi): `S.Struct(...).pipe(defaultLabel(['name', 'fallbackName']))` for type-safe annotations.
|
|
17
|
-
[LabelAnnotationId]: ['name', 'fallbackName'],
|
|
18
|
-
});
|
|
7
|
+
import { Type, Ref } from '@dxos/echo';
|
|
8
|
+
import { LabelAnnotation } from '@dxos/echo-schema';
|
|
9
|
+
import { live } from '@dxos/live-object';
|
|
10
|
+
import { DataType } from '@dxos/schema';
|
|
19
11
|
|
|
20
|
-
export const
|
|
21
|
-
|
|
12
|
+
export const DocumentSchema = Schema.Struct({
|
|
13
|
+
name: Schema.optional(Schema.String),
|
|
14
|
+
fallbackName: Schema.optional(Schema.String),
|
|
15
|
+
content: Type.Ref(DataType.Text),
|
|
16
|
+
}).pipe(LabelAnnotation.set(['name', 'fallbackName']));
|
|
17
|
+
|
|
18
|
+
export const DocumentType = DocumentSchema.pipe(
|
|
19
|
+
Type.Obj({
|
|
20
|
+
typename: 'dxos.org/type/Document',
|
|
21
|
+
version: '0.1.0',
|
|
22
|
+
}),
|
|
23
|
+
);
|
|
24
|
+
export type DocumentType = Schema.Schema.Type<typeof DocumentType>;
|
|
25
|
+
|
|
26
|
+
// TODO(burdon): Replace when defaults are supported.
|
|
27
|
+
export const createDocument = ({ name, content }: { name: string; content: string }) =>
|
|
28
|
+
live(DocumentType, { name, content: Ref.make(live(DataType.Text, { content })) });
|
|
22
29
|
|
|
23
30
|
/**
|
|
24
31
|
* Checks if an object conforms to the interface needed to render an editor.
|
package/src/types/types.ts
CHANGED
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
// Copyright 2023 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { Schema } from 'effect';
|
|
6
|
+
|
|
7
|
+
import { Type } from '@dxos/echo';
|
|
6
8
|
// TODO(wittjosiah): This pulls in UI code into the types entrypoint.
|
|
7
9
|
import { type Extension, EditorInputMode, EditorViewMode } from '@dxos/react-ui-editor';
|
|
8
10
|
|
|
@@ -12,23 +14,23 @@ import { MARKDOWN_PLUGIN } from '../meta';
|
|
|
12
14
|
const MARKDOWN_ACTION = `${MARKDOWN_PLUGIN}/action`;
|
|
13
15
|
|
|
14
16
|
export namespace MarkdownAction {
|
|
15
|
-
export class Create extends
|
|
16
|
-
input:
|
|
17
|
-
spaceId:
|
|
18
|
-
name:
|
|
19
|
-
content:
|
|
17
|
+
export class Create extends Schema.TaggedClass<Create>()(MARKDOWN_ACTION, {
|
|
18
|
+
input: Schema.Struct({
|
|
19
|
+
spaceId: Type.SpaceId,
|
|
20
|
+
name: Schema.optional(Schema.String),
|
|
21
|
+
content: Schema.optional(Schema.String),
|
|
20
22
|
}),
|
|
21
|
-
output:
|
|
23
|
+
output: Schema.Struct({
|
|
22
24
|
object: DocumentType,
|
|
23
25
|
}),
|
|
24
26
|
}) {}
|
|
25
27
|
|
|
26
|
-
export class SetViewMode extends
|
|
27
|
-
input:
|
|
28
|
-
id:
|
|
28
|
+
export class SetViewMode extends Schema.TaggedClass<SetViewMode>()(`${MARKDOWN_ACTION}/set-view-mode`, {
|
|
29
|
+
input: Schema.Struct({
|
|
30
|
+
id: Schema.String,
|
|
29
31
|
viewMode: EditorViewMode,
|
|
30
32
|
}),
|
|
31
|
-
output:
|
|
33
|
+
output: Schema.Void,
|
|
32
34
|
}) {}
|
|
33
35
|
}
|
|
34
36
|
|
|
@@ -48,18 +50,18 @@ export type MarkdownPluginState = {
|
|
|
48
50
|
viewMode: Record<string, EditorViewMode>;
|
|
49
51
|
};
|
|
50
52
|
|
|
51
|
-
export const MarkdownSettingsSchema =
|
|
52
|
-
|
|
53
|
+
export const MarkdownSettingsSchema = Schema.mutable(
|
|
54
|
+
Schema.Struct({
|
|
53
55
|
defaultViewMode: EditorViewMode,
|
|
54
|
-
editorInputMode:
|
|
55
|
-
experimental:
|
|
56
|
-
debug:
|
|
57
|
-
toolbar:
|
|
58
|
-
typewriter:
|
|
56
|
+
editorInputMode: Schema.optional(EditorInputMode),
|
|
57
|
+
experimental: Schema.optional(Schema.Boolean),
|
|
58
|
+
debug: Schema.optional(Schema.Boolean),
|
|
59
|
+
toolbar: Schema.optional(Schema.Boolean),
|
|
60
|
+
typewriter: Schema.optional(Schema.String),
|
|
59
61
|
// TODO(burdon): Per document settings.
|
|
60
|
-
numberedHeadings:
|
|
61
|
-
folding:
|
|
62
|
+
numberedHeadings: Schema.optional(Schema.Boolean),
|
|
63
|
+
folding: Schema.optional(Schema.Boolean),
|
|
62
64
|
}),
|
|
63
65
|
);
|
|
64
66
|
|
|
65
|
-
export type MarkdownSettingsProps =
|
|
67
|
+
export type MarkdownSettingsProps = Schema.Schema.Type<typeof MarkdownSettingsSchema>;
|
package/src/util.tsx
CHANGED
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
|
|
5
5
|
import { debounce } from '@dxos/async';
|
|
6
6
|
import { type TypedObjectSerializer } from '@dxos/plugin-space/types';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
7
|
+
import { live, createObject, isEchoObject, loadObjectReferences, Ref } from '@dxos/react-client/echo';
|
|
8
|
+
import { DataType } from '@dxos/schema';
|
|
9
9
|
|
|
10
10
|
import { DocumentType, type MarkdownProperties } from './types';
|
|
11
11
|
|
|
12
12
|
export const isMarkdownProperties = (data: unknown): data is MarkdownProperties =>
|
|
13
|
-
isEchoObject(data)
|
|
13
|
+
(isEchoObject(data) as boolean)
|
|
14
14
|
? true
|
|
15
15
|
: data && typeof data === 'object'
|
|
16
16
|
? 'title' in data && typeof data.title === 'string'
|
|
@@ -22,6 +22,10 @@ export const getFallbackName = (content: string) => {
|
|
|
22
22
|
return content.substring(0, 31).split('\n')[0].replaceAll(nonTitleChars, '').trim();
|
|
23
23
|
};
|
|
24
24
|
|
|
25
|
+
export const getAbstract = (content: string) => {
|
|
26
|
+
return content.substring(0, 128).split('\n')[0].replaceAll(nonTitleChars, '').trim();
|
|
27
|
+
};
|
|
28
|
+
|
|
25
29
|
export const setFallbackName = debounce((doc: DocumentType, content: string) => {
|
|
26
30
|
const name = getFallbackName(content);
|
|
27
31
|
if (doc.fallbackName !== name) {
|
|
@@ -38,7 +42,7 @@ export const serializer: TypedObjectSerializer<DocumentType> = {
|
|
|
38
42
|
deserialize: async ({ content: serialized }) => {
|
|
39
43
|
const { name, fallbackName, content } = JSON.parse(serialized);
|
|
40
44
|
return createObject(
|
|
41
|
-
|
|
45
|
+
live(DocumentType, { name, fallbackName, content: Ref.make(live(DataType.Text, { content })) }),
|
|
42
46
|
);
|
|
43
47
|
},
|
|
44
48
|
};
|