@dxos/plugin-markdown 0.8.3-main.7f5a14c → 0.8.3-staging.0fa589b
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-3KTC7Q4C.mjs → MarkdownContainer-EFWQ6DHD.mjs} +119 -51
- package/dist/lib/browser/MarkdownContainer-EFWQ6DHD.mjs.map +7 -0
- package/dist/lib/browser/{app-graph-serializer-FLQI6GFL.mjs → app-graph-serializer-EI6TEHRQ.mjs} +6 -4
- package/dist/lib/browser/app-graph-serializer-EI6TEHRQ.mjs.map +7 -0
- package/dist/lib/browser/{chunk-LCMXUTQB.mjs → chunk-354IBM5X.mjs} +3 -3
- package/dist/lib/browser/{chunk-CX5GYZYO.mjs → chunk-D767LUGU.mjs} +6 -2
- package/dist/lib/browser/chunk-D767LUGU.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +2 -2
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{react-surface-RJQKYJJQ.mjs → react-surface-4B5ELMEW.mjs} +8 -3
- package/dist/lib/browser/{react-surface-RJQKYJJQ.mjs.map → react-surface-4B5ELMEW.mjs.map} +2 -2
- package/dist/lib/node/{MarkdownContainer-NG4H6AZJ.cjs → MarkdownContainer-KYGUEZIL.cjs} +116 -48
- package/dist/lib/node/MarkdownContainer-KYGUEZIL.cjs.map +7 -0
- package/dist/lib/node/{app-graph-serializer-BZPM7HHJ.cjs → app-graph-serializer-E6BXEDEL.cjs} +11 -9
- package/dist/lib/node/app-graph-serializer-E6BXEDEL.cjs.map +7 -0
- package/dist/lib/node/{chunk-4DYNEQG3.cjs → chunk-FU3XZZCO.cjs} +6 -6
- package/dist/lib/node/{chunk-SYEFGLXN.cjs → chunk-LQAC5HL7.cjs} +9 -5
- package/dist/lib/node/chunk-LQAC5HL7.cjs.map +7 -0
- package/dist/lib/node/index.cjs +10 -10
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/{react-surface-5RKEWAXS.cjs → react-surface-456HQ4KZ.cjs} +11 -6
- package/dist/lib/node/{react-surface-5RKEWAXS.cjs.map → react-surface-456HQ4KZ.cjs.map} +2 -2
- package/dist/lib/node-esm/{MarkdownContainer-DZPXCA6J.mjs → MarkdownContainer-O3SGMH4G.mjs} +119 -51
- package/dist/lib/node-esm/MarkdownContainer-O3SGMH4G.mjs.map +7 -0
- package/dist/lib/node-esm/{app-graph-serializer-EBH54X6Z.mjs → app-graph-serializer-F7DGNF3G.mjs} +6 -4
- package/dist/lib/node-esm/app-graph-serializer-F7DGNF3G.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-Q7WUBLL3.mjs → chunk-BWDDFDJY.mjs} +6 -2
- package/dist/lib/node-esm/chunk-BWDDFDJY.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-WANCCPU7.mjs → chunk-YOABAQ7A.mjs} +3 -3
- package/dist/lib/node-esm/index.mjs +2 -2
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{react-surface-Z3DX37JV.mjs → react-surface-YHFOQTVO.mjs} +8 -3
- package/dist/lib/node-esm/{react-surface-Z3DX37JV.mjs.map → react-surface-YHFOQTVO.mjs.map} +2 -2
- package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -1
- package/dist/types/src/components/MarkdownContainer.d.ts.map +1 -1
- package/dist/types/src/components/MarkdownContainer.stories.d.ts +9 -0
- package/dist/types/src/components/MarkdownContainer.stories.d.ts.map +1 -0
- package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +1 -2
- package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
- package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts +2 -4
- package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts.map +1 -1
- package/dist/types/src/extensions.d.ts +3 -2
- package/dist/types/src/extensions.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +52 -2
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/schema.d.ts +11 -14
- package/dist/types/src/types/schema.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +5 -6
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/package.json +38 -38
- package/src/capabilities/app-graph-serializer.ts +5 -3
- package/src/capabilities/react-surface.tsx +1 -1
- package/src/components/MarkdownContainer.stories.tsx +103 -0
- package/src/components/MarkdownContainer.tsx +94 -51
- package/src/components/MarkdownEditor/MarkdownEditor.tsx +49 -25
- package/src/components/Suggestions.stories.tsx +1 -1
- package/src/extensions.tsx +7 -1
- package/src/translations.ts +6 -1
- package/dist/lib/browser/MarkdownContainer-3KTC7Q4C.mjs.map +0 -7
- package/dist/lib/browser/app-graph-serializer-FLQI6GFL.mjs.map +0 -7
- package/dist/lib/browser/chunk-CX5GYZYO.mjs.map +0 -7
- package/dist/lib/node/MarkdownContainer-NG4H6AZJ.cjs.map +0 -7
- package/dist/lib/node/app-graph-serializer-BZPM7HHJ.cjs.map +0 -7
- package/dist/lib/node/chunk-SYEFGLXN.cjs.map +0 -7
- package/dist/lib/node-esm/MarkdownContainer-DZPXCA6J.mjs.map +0 -7
- package/dist/lib/node-esm/app-graph-serializer-EBH54X6Z.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-Q7WUBLL3.mjs.map +0 -7
- /package/dist/lib/browser/{chunk-LCMXUTQB.mjs.map → chunk-354IBM5X.mjs.map} +0 -0
- /package/dist/lib/node/{chunk-4DYNEQG3.cjs.map → chunk-FU3XZZCO.cjs.map} +0 -0
- /package/dist/lib/node-esm/{chunk-WANCCPU7.mjs.map → chunk-YOABAQ7A.mjs.map} +0 -0
|
@@ -1,30 +1,27 @@
|
|
|
1
1
|
import { Schema } from 'effect';
|
|
2
|
+
import { Type } from '@dxos/echo';
|
|
2
3
|
export declare const DocumentSchema: Schema.Struct<{
|
|
3
4
|
name: Schema.optional<typeof Schema.String>;
|
|
4
5
|
fallbackName: Schema.optional<typeof Schema.String>;
|
|
5
|
-
content:
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
}>;
|
|
6
|
+
content: Type.ref<Type.obj<Schema.Struct<{
|
|
7
|
+
content: typeof import("effect/Schema").String;
|
|
8
|
+
}>>>;
|
|
9
9
|
}>;
|
|
10
|
-
export declare const DocumentType:
|
|
10
|
+
export declare const DocumentType: Type.obj<Schema.Struct<{
|
|
11
11
|
name: Schema.optional<typeof Schema.String>;
|
|
12
12
|
fallbackName: Schema.optional<typeof Schema.String>;
|
|
13
|
-
content:
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}>, {}>;
|
|
13
|
+
content: Type.ref<Type.obj<Schema.Struct<{
|
|
14
|
+
content: typeof import("effect/Schema").String;
|
|
15
|
+
}>>>;
|
|
16
|
+
}>>;
|
|
18
17
|
export type DocumentType = Schema.Schema.Type<typeof DocumentType>;
|
|
19
18
|
export declare const createDocument: ({ name, content }: {
|
|
20
19
|
name: string;
|
|
21
20
|
content: string;
|
|
22
|
-
}) => import("@dxos/live-object").Live<{
|
|
23
|
-
readonly id: string;
|
|
21
|
+
}) => import("@dxos/live-object").Live<Type.OfKind<Type.Kind.Object> & {
|
|
24
22
|
name?: string | undefined;
|
|
25
23
|
fallbackName?: string | undefined;
|
|
26
|
-
content: import("@dxos/echo-schema").Ref<{
|
|
27
|
-
readonly id: string;
|
|
24
|
+
content: import("@dxos/echo-schema").Ref<Type.OfKind<Type.Kind.Object> & {
|
|
28
25
|
content: string;
|
|
29
26
|
}>;
|
|
30
27
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/types/schema.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/types/schema.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAY,IAAI,EAAE,MAAM,YAAY,CAAC;AAI5C,eAAO,MAAM,cAAc;;;;;;EAI2B,CAAC;AAEvD,eAAO,MAAM,YAAY;;;;;;GAKxB,CAAC;AACF,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,YAAY,CAAC,CAAC;AAGnE,eAAO,MAAM,cAAc,GAAI,mBAAmB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;;;;;;EACQ,CAAC;AAE5F;;GAEG;AAEH,eAAO,MAAM,aAAa,GAAI,MAAM,GAAG,KAAG,IAAI,IAAI;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAM7C,CAAC"}
|
|
@@ -19,14 +19,13 @@ export declare namespace MarkdownAction {
|
|
|
19
19
|
content: Schema.optional<typeof Schema.String>;
|
|
20
20
|
}>;
|
|
21
21
|
output: Schema.Struct<{
|
|
22
|
-
object:
|
|
22
|
+
object: Type.obj<Schema.Struct<{
|
|
23
23
|
name: Schema.optional<typeof Schema.String>;
|
|
24
24
|
fallbackName: Schema.optional<typeof Schema.String>;
|
|
25
|
-
content:
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}>, {}>;
|
|
25
|
+
content: Type.ref<Type.obj<Schema.Struct<{
|
|
26
|
+
content: typeof import("effect/Schema").String;
|
|
27
|
+
}>>>;
|
|
28
|
+
}>>;
|
|
30
29
|
}>;
|
|
31
30
|
}>;
|
|
32
31
|
export class Create extends Create_base {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/types/types.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,OAAO,EAAE,KAAK,SAAS,EAAmB,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAExF,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAKxC,yBAAiB,cAAc,CAAC
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/types/types.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,OAAO,EAAE,KAAK,SAAS,EAAmB,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAExF,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAKxC,yBAAiB,cAAc,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;IAC9B,MAAM,OAAO,MAAO,SAAQ,WAS1B;KAAG;;;;;;;;;;IAEL,MAAM,OAAO,WAAY,SAAQ,gBAM/B;KAAG;;CACN;AAED,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAGrD,MAAM,MAAM,yBAAyB,GAAG,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,EAAE,YAAY,CAAA;CAAE,KAAK,SAAS,GAAG,SAAS,CAAC;AAEtG,MAAM,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;AAE9C,MAAM,MAAM,mBAAmB,GAAG;IAEhC,kBAAkB,CAAC,EAAE,yBAAyB,EAAE,CAAC;IAIjD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC1C,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;;;;;;;GAYlC,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/plugin-markdown",
|
|
3
|
-
"version": "0.8.3-
|
|
3
|
+
"version": "0.8.3-staging.0fa589b",
|
|
4
4
|
"description": "DXOS Surface plugin for interacting with Markdown",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -39,34 +39,34 @@
|
|
|
39
39
|
"@preact-signals/safe-react": "^0.9.0",
|
|
40
40
|
"@preact/signals-core": "^1.9.0",
|
|
41
41
|
"react-dropzone": "^14.2.3",
|
|
42
|
-
"@dxos/ai": "0.8.3-
|
|
43
|
-
"@dxos/
|
|
44
|
-
"@dxos/
|
|
45
|
-
"@dxos/
|
|
46
|
-
"@dxos/async": "0.8.3-
|
|
47
|
-
"@dxos/
|
|
48
|
-
"@dxos/echo
|
|
49
|
-
"@dxos/
|
|
50
|
-
"@dxos/
|
|
51
|
-
"@dxos/lit-ui": "0.8.3-
|
|
52
|
-
"@dxos/local-storage": "0.8.3-
|
|
53
|
-
"@dxos/
|
|
54
|
-
"@dxos/
|
|
55
|
-
"@dxos/plugin-attention": "0.8.3-
|
|
56
|
-
"@dxos/plugin-client": "0.8.3-
|
|
57
|
-
"@dxos/plugin-deck": "0.8.3-
|
|
58
|
-
"@dxos/plugin-preview": "0.8.3-
|
|
59
|
-
"@dxos/plugin-graph": "0.8.3-
|
|
60
|
-
"@dxos/plugin-space": "0.8.3-
|
|
61
|
-
"@dxos/plugin-theme": "0.8.3-
|
|
62
|
-
"@dxos/react-
|
|
63
|
-
"@dxos/react-ui-attention": "0.8.3-
|
|
64
|
-
"@dxos/react-
|
|
65
|
-
"@dxos/react-ui-form": "0.8.3-
|
|
66
|
-
"@dxos/react-
|
|
67
|
-
"@dxos/react-ui-stack": "0.8.3-
|
|
68
|
-
"@dxos/
|
|
69
|
-
"@dxos/
|
|
42
|
+
"@dxos/ai": "0.8.3-staging.0fa589b",
|
|
43
|
+
"@dxos/app-framework": "0.8.3-staging.0fa589b",
|
|
44
|
+
"@dxos/assistant": "0.8.3-staging.0fa589b",
|
|
45
|
+
"@dxos/artifact": "0.8.3-staging.0fa589b",
|
|
46
|
+
"@dxos/async": "0.8.3-staging.0fa589b",
|
|
47
|
+
"@dxos/invariant": "0.8.3-staging.0fa589b",
|
|
48
|
+
"@dxos/echo": "0.8.3-staging.0fa589b",
|
|
49
|
+
"@dxos/keys": "0.8.3-staging.0fa589b",
|
|
50
|
+
"@dxos/echo-schema": "0.8.3-staging.0fa589b",
|
|
51
|
+
"@dxos/lit-ui": "0.8.3-staging.0fa589b",
|
|
52
|
+
"@dxos/local-storage": "0.8.3-staging.0fa589b",
|
|
53
|
+
"@dxos/log": "0.8.3-staging.0fa589b",
|
|
54
|
+
"@dxos/live-object": "0.8.3-staging.0fa589b",
|
|
55
|
+
"@dxos/plugin-attention": "0.8.3-staging.0fa589b",
|
|
56
|
+
"@dxos/plugin-client": "0.8.3-staging.0fa589b",
|
|
57
|
+
"@dxos/plugin-deck": "0.8.3-staging.0fa589b",
|
|
58
|
+
"@dxos/plugin-preview": "0.8.3-staging.0fa589b",
|
|
59
|
+
"@dxos/plugin-graph": "0.8.3-staging.0fa589b",
|
|
60
|
+
"@dxos/plugin-space": "0.8.3-staging.0fa589b",
|
|
61
|
+
"@dxos/plugin-theme": "0.8.3-staging.0fa589b",
|
|
62
|
+
"@dxos/react-client": "0.8.3-staging.0fa589b",
|
|
63
|
+
"@dxos/react-ui-attention": "0.8.3-staging.0fa589b",
|
|
64
|
+
"@dxos/react-ui-editor": "0.8.3-staging.0fa589b",
|
|
65
|
+
"@dxos/react-ui-form": "0.8.3-staging.0fa589b",
|
|
66
|
+
"@dxos/react-hooks": "0.8.3-staging.0fa589b",
|
|
67
|
+
"@dxos/react-ui-stack": "0.8.3-staging.0fa589b",
|
|
68
|
+
"@dxos/schema": "0.8.3-staging.0fa589b",
|
|
69
|
+
"@dxos/util": "0.8.3-staging.0fa589b"
|
|
70
70
|
},
|
|
71
71
|
"devDependencies": {
|
|
72
72
|
"@effect-rx/rx-react": "^0.34.1",
|
|
@@ -78,13 +78,13 @@
|
|
|
78
78
|
"react": "~18.2.0",
|
|
79
79
|
"react-dom": "~18.2.0",
|
|
80
80
|
"vite": "5.4.7",
|
|
81
|
-
"@dxos/debug": "0.8.3-
|
|
82
|
-
"@dxos/plugin-
|
|
83
|
-
"@dxos/
|
|
84
|
-
"@dxos/
|
|
85
|
-
"@dxos/react-ui": "0.8.3-
|
|
86
|
-
"@dxos/react-ui-theme": "0.8.3-
|
|
87
|
-
"@dxos/storybook-utils": "0.8.3-
|
|
81
|
+
"@dxos/debug": "0.8.3-staging.0fa589b",
|
|
82
|
+
"@dxos/plugin-theme": "0.8.3-staging.0fa589b",
|
|
83
|
+
"@dxos/plugin-storybook-layout": "0.8.3-staging.0fa589b",
|
|
84
|
+
"@dxos/random": "0.8.3-staging.0fa589b",
|
|
85
|
+
"@dxos/react-ui": "0.8.3-staging.0fa589b",
|
|
86
|
+
"@dxos/react-ui-theme": "0.8.3-staging.0fa589b",
|
|
87
|
+
"@dxos/storybook-utils": "0.8.3-staging.0fa589b"
|
|
88
88
|
},
|
|
89
89
|
"peerDependencies": {
|
|
90
90
|
"@effect-rx/rx-react": "^0.34.1",
|
|
@@ -93,8 +93,8 @@
|
|
|
93
93
|
"effect": "^3.13.3",
|
|
94
94
|
"react": "~18.2.0",
|
|
95
95
|
"react-dom": "~18.2.0",
|
|
96
|
-
"@dxos/react-ui": "0.8.3-
|
|
97
|
-
"@dxos/react-ui-theme": "0.8.3-
|
|
96
|
+
"@dxos/react-ui": "0.8.3-staging.0fa589b",
|
|
97
|
+
"@dxos/react-ui-theme": "0.8.3-staging.0fa589b"
|
|
98
98
|
},
|
|
99
99
|
"publishConfig": {
|
|
100
100
|
"access": "public"
|
|
@@ -5,8 +5,10 @@
|
|
|
5
5
|
import { pipe } from 'effect';
|
|
6
6
|
|
|
7
7
|
import { contributes, Capabilities, type PluginContext, chain, createIntent } from '@dxos/app-framework';
|
|
8
|
-
import {
|
|
8
|
+
import { Obj, Type } from '@dxos/echo';
|
|
9
|
+
import { SpaceAction } from '@dxos/plugin-space/types';
|
|
9
10
|
import { isSpace } from '@dxos/react-client/echo';
|
|
11
|
+
import { DataType } from '@dxos/schema';
|
|
10
12
|
|
|
11
13
|
import translations from '../translations';
|
|
12
14
|
import { MarkdownAction, DocumentType } from '../types';
|
|
@@ -30,8 +32,8 @@ export default (context: PluginContext) =>
|
|
|
30
32
|
deserialize: async (data, ancestors) => {
|
|
31
33
|
const space = ancestors.find(isSpace);
|
|
32
34
|
const target =
|
|
33
|
-
ancestors.findLast((ancestor) => ancestor
|
|
34
|
-
space?.properties[
|
|
35
|
+
ancestors.findLast((ancestor) => Obj.instanceOf(DataType.Collection, ancestor)) ??
|
|
36
|
+
space?.properties[Type.getTypename(DataType.Collection)]?.target;
|
|
35
37
|
if (!space || !target) {
|
|
36
38
|
return;
|
|
37
39
|
}
|
|
@@ -105,7 +105,7 @@ export default () =>
|
|
|
105
105
|
}),
|
|
106
106
|
createSurface({
|
|
107
107
|
id: `${MARKDOWN_PLUGIN}/preview`,
|
|
108
|
-
role: 'popover',
|
|
108
|
+
role: ['popover', 'card--kanban', 'card--document', 'card'],
|
|
109
109
|
filter: (data): data is { subject: DocumentType | DataType.Text } =>
|
|
110
110
|
Obj.instanceOf(DocumentType, data.subject) || Obj.instanceOf(DataType.Text, data.subject),
|
|
111
111
|
component: ({ data, role }) => <MarkdownPreview {...data} role={role} />,
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2023 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import '@dxos-theme';
|
|
6
|
+
|
|
7
|
+
import { type Meta } from '@storybook/react';
|
|
8
|
+
import React, { useMemo } from 'react';
|
|
9
|
+
|
|
10
|
+
import { Capabilities, contributes, IntentPlugin, SettingsPlugin, Surface } from '@dxos/app-framework';
|
|
11
|
+
import { withPluginManager } from '@dxos/app-framework/testing';
|
|
12
|
+
import { todo } from '@dxos/debug';
|
|
13
|
+
import { Obj, Query, Ref, Type } from '@dxos/echo';
|
|
14
|
+
import { AttentionPlugin } from '@dxos/plugin-attention';
|
|
15
|
+
import { ClientPlugin } from '@dxos/plugin-client';
|
|
16
|
+
import { GraphPlugin } from '@dxos/plugin-graph';
|
|
17
|
+
import { PreviewPlugin } from '@dxos/plugin-preview';
|
|
18
|
+
import { SpaceCapabilities, SpacePlugin } from '@dxos/plugin-space';
|
|
19
|
+
import { StorybookLayoutPlugin } from '@dxos/plugin-storybook-layout';
|
|
20
|
+
import { ThemePlugin } from '@dxos/plugin-theme';
|
|
21
|
+
import { faker } from '@dxos/random';
|
|
22
|
+
import { useQuery, useSpace } from '@dxos/react-client/echo';
|
|
23
|
+
import { defaultTx } from '@dxos/react-ui-theme';
|
|
24
|
+
import { DataType } from '@dxos/schema';
|
|
25
|
+
import { createObjectFactory, Testing, type ValueGenerator } from '@dxos/schema/testing';
|
|
26
|
+
import { withLayout } from '@dxos/storybook-utils';
|
|
27
|
+
|
|
28
|
+
import { MarkdownPlugin } from '../MarkdownPlugin';
|
|
29
|
+
import translations from '../translations';
|
|
30
|
+
import { DocumentType } from '../types';
|
|
31
|
+
|
|
32
|
+
faker.seed(1);
|
|
33
|
+
|
|
34
|
+
const generator: ValueGenerator = faker as any;
|
|
35
|
+
|
|
36
|
+
const DefaultStory = () => {
|
|
37
|
+
const space = useSpace();
|
|
38
|
+
const [doc] = useQuery(space, Query.type(DocumentType));
|
|
39
|
+
const data = useMemo(() => ({ subject: doc }), [doc]);
|
|
40
|
+
|
|
41
|
+
return <Surface role='article' data={data} />;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const meta: Meta<typeof DefaultStory> = {
|
|
45
|
+
title: 'plugins/plugin-markdown/MarkdownContainer',
|
|
46
|
+
render: DefaultStory,
|
|
47
|
+
decorators: [
|
|
48
|
+
withPluginManager({
|
|
49
|
+
plugins: [
|
|
50
|
+
AttentionPlugin(),
|
|
51
|
+
ThemePlugin({ tx: defaultTx }),
|
|
52
|
+
StorybookLayoutPlugin(),
|
|
53
|
+
ClientPlugin({
|
|
54
|
+
types: [DocumentType, DataType.Text, Testing.Contact],
|
|
55
|
+
onClientInitialized: async (_, client) => {
|
|
56
|
+
await client.halo.createIdentity();
|
|
57
|
+
await client.spaces.waitUntilReady();
|
|
58
|
+
await client.spaces.default.waitUntilReady();
|
|
59
|
+
const space = client.spaces.default;
|
|
60
|
+
const doc = Obj.make(DocumentType, {
|
|
61
|
+
name: 'Test',
|
|
62
|
+
content: Ref.make(Obj.make(DataType.Text, { content: '# Test\n\n' })),
|
|
63
|
+
});
|
|
64
|
+
space.db.add(doc);
|
|
65
|
+
const createObjects = createObjectFactory(space.db, generator);
|
|
66
|
+
await createObjects([{ type: Testing.Contact, count: 10 }]);
|
|
67
|
+
await space.db.flush({ indexes: true });
|
|
68
|
+
},
|
|
69
|
+
}),
|
|
70
|
+
SpacePlugin(),
|
|
71
|
+
SettingsPlugin(),
|
|
72
|
+
IntentPlugin(),
|
|
73
|
+
MarkdownPlugin(),
|
|
74
|
+
PreviewPlugin(),
|
|
75
|
+
GraphPlugin(),
|
|
76
|
+
],
|
|
77
|
+
capabilities: [
|
|
78
|
+
// NOTE: Editor only queries for object form schemas when linking.
|
|
79
|
+
contributes(SpaceCapabilities.ObjectForm, {
|
|
80
|
+
objectSchema: Testing.Contact,
|
|
81
|
+
getIntent: () => todo(),
|
|
82
|
+
}),
|
|
83
|
+
contributes(Capabilities.Metadata, {
|
|
84
|
+
id: Type.getTypename(Testing.Contact),
|
|
85
|
+
metadata: {
|
|
86
|
+
icon: 'ph--user--regular',
|
|
87
|
+
},
|
|
88
|
+
}),
|
|
89
|
+
],
|
|
90
|
+
}),
|
|
91
|
+
withLayout({ fullscreen: true }),
|
|
92
|
+
],
|
|
93
|
+
parameters: {
|
|
94
|
+
translations,
|
|
95
|
+
controls: { disable: true },
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
export default meta;
|
|
100
|
+
|
|
101
|
+
type Story = Meta<typeof DefaultStory>;
|
|
102
|
+
|
|
103
|
+
export const Default: Story = {};
|
|
@@ -3,15 +3,23 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { Rx } from '@effect-rx/rx-react';
|
|
6
|
-
import React, { useCallback, useEffect, useMemo } from 'react';
|
|
6
|
+
import React, { useCallback, useEffect, useMemo, useState } from 'react';
|
|
7
|
+
import { createPortal } from 'react-dom';
|
|
7
8
|
|
|
8
|
-
import { Capabilities, useAppGraph, useCapabilities, usePluginManager } from '@dxos/app-framework';
|
|
9
|
-
import { Filter, Obj, Query } from '@dxos/echo';
|
|
9
|
+
import { Capabilities, Surface, useAppGraph, useCapabilities, usePluginManager } from '@dxos/app-framework';
|
|
10
|
+
import { DXN, Filter, Obj, Query } from '@dxos/echo';
|
|
10
11
|
import { SpaceCapabilities } from '@dxos/plugin-space';
|
|
11
|
-
import { fullyQualifiedId, getSpace } from '@dxos/react-client/echo';
|
|
12
|
+
import { fullyQualifiedId, getSpace, useQuery, useSpace } from '@dxos/react-client/echo';
|
|
12
13
|
import { toLocalizedString, useTranslation } from '@dxos/react-ui';
|
|
13
14
|
import { type SelectionManager } from '@dxos/react-ui-attention';
|
|
14
|
-
import {
|
|
15
|
+
import {
|
|
16
|
+
type CommandMenuGroup,
|
|
17
|
+
type CommandMenuItem,
|
|
18
|
+
insertAtCursor,
|
|
19
|
+
insertAtLineStart,
|
|
20
|
+
type PreviewLinkRef,
|
|
21
|
+
type PreviewOptions,
|
|
22
|
+
} from '@dxos/react-ui-editor';
|
|
15
23
|
import { DataType } from '@dxos/schema';
|
|
16
24
|
|
|
17
25
|
import { MarkdownEditor, type MarkdownEditorProps } from './MarkdownEditor';
|
|
@@ -43,7 +51,28 @@ const MarkdownContainer = ({
|
|
|
43
51
|
const scrollPastEnd = role === 'article';
|
|
44
52
|
const doc = Obj.instanceOf(DocumentType, object) ? object : undefined;
|
|
45
53
|
const text = Obj.instanceOf(DataType.Text, object) ? object : undefined;
|
|
46
|
-
const
|
|
54
|
+
const [previewBlocks, setPreviewBlocks] = useState<{ link: PreviewLinkRef; el: HTMLElement }[]>([]);
|
|
55
|
+
const previewOptions = useMemo(
|
|
56
|
+
(): PreviewOptions => ({
|
|
57
|
+
addBlockContainer: (link, el) => {
|
|
58
|
+
setPreviewBlocks((prev) => [...prev, { link, el }]);
|
|
59
|
+
},
|
|
60
|
+
removeBlockContainer: (link) => {
|
|
61
|
+
setPreviewBlocks((prev) => prev.filter(({ link: prevLink }) => prevLink.ref !== link.ref));
|
|
62
|
+
},
|
|
63
|
+
}),
|
|
64
|
+
[],
|
|
65
|
+
);
|
|
66
|
+
const extensions = useExtensions({
|
|
67
|
+
document: doc,
|
|
68
|
+
text,
|
|
69
|
+
id,
|
|
70
|
+
settings,
|
|
71
|
+
selectionManager,
|
|
72
|
+
viewMode,
|
|
73
|
+
editorStateStore,
|
|
74
|
+
previewOptions,
|
|
75
|
+
});
|
|
47
76
|
|
|
48
77
|
// TODO(wittjosiah): Factor out.
|
|
49
78
|
const manager = usePluginManager();
|
|
@@ -93,52 +122,66 @@ const MarkdownContainer = ({
|
|
|
93
122
|
[filter, resolve, space],
|
|
94
123
|
);
|
|
95
124
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
onLinkQuery={space ? onLinkQuery : undefined}
|
|
123
|
-
/>
|
|
124
|
-
);
|
|
125
|
-
} else {
|
|
125
|
+
const editor = doc ? (
|
|
126
|
+
<DocumentEditor
|
|
127
|
+
id={fullyQualifiedId(object)}
|
|
128
|
+
role={role}
|
|
129
|
+
document={doc}
|
|
130
|
+
extensions={extensions}
|
|
131
|
+
viewMode={viewMode}
|
|
132
|
+
settings={settings}
|
|
133
|
+
scrollPastEnd={scrollPastEnd}
|
|
134
|
+
onViewModeChange={onViewModeChange}
|
|
135
|
+
onLinkQuery={space ? onLinkQuery : undefined}
|
|
136
|
+
/>
|
|
137
|
+
) : text ? (
|
|
138
|
+
<MarkdownEditor
|
|
139
|
+
id={id}
|
|
140
|
+
role={role}
|
|
141
|
+
initialValue={text.content}
|
|
142
|
+
extensions={extensions}
|
|
143
|
+
viewMode={viewMode}
|
|
144
|
+
toolbar={settings.toolbar}
|
|
145
|
+
inputMode={settings.editorInputMode}
|
|
146
|
+
scrollPastEnd={scrollPastEnd}
|
|
147
|
+
onViewModeChange={onViewModeChange}
|
|
148
|
+
onLinkQuery={space ? onLinkQuery : undefined}
|
|
149
|
+
/>
|
|
150
|
+
) : (
|
|
126
151
|
// TODO(burdon): Normalize with above.
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
152
|
+
<MarkdownEditor
|
|
153
|
+
id={id}
|
|
154
|
+
role={role}
|
|
155
|
+
initialValue={object.text}
|
|
156
|
+
extensions={extensions}
|
|
157
|
+
viewMode={viewMode}
|
|
158
|
+
toolbar={settings.toolbar}
|
|
159
|
+
inputMode={settings.editorInputMode}
|
|
160
|
+
scrollPastEnd={scrollPastEnd}
|
|
161
|
+
onViewModeChange={onViewModeChange}
|
|
162
|
+
onLinkQuery={space ? onLinkQuery : undefined}
|
|
163
|
+
/>
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
return (
|
|
167
|
+
<>
|
|
168
|
+
{editor}
|
|
169
|
+
{previewBlocks.map(({ link, el }) => (
|
|
170
|
+
<PreviewBlock key={link.ref} link={link} el={el} />
|
|
171
|
+
))}
|
|
172
|
+
</>
|
|
173
|
+
);
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
// TODO(wittjosiah): This shouldn't be "card" but "block".
|
|
177
|
+
// It's not a preview card but an interactive embedded object.
|
|
178
|
+
const PreviewBlock = ({ link, el }: { link: PreviewLinkRef; el: HTMLElement }) => {
|
|
179
|
+
const echoDXN = useMemo(() => DXN.parse(link.ref).asEchoDXN(), [link.ref]);
|
|
180
|
+
const space = useSpace(echoDXN?.spaceId);
|
|
181
|
+
const [subject] = useQuery(space, Query.select(Filter.ids(echoDXN?.echoId ?? '')));
|
|
182
|
+
const data = useMemo(() => ({ subject }), [subject]);
|
|
183
|
+
|
|
184
|
+
return createPortal(<Surface role='card--document' data={data} limit={1} />, el);
|
|
142
185
|
};
|
|
143
186
|
|
|
144
187
|
type DocumentEditorProps = Omit<MarkdownContainerProps, 'object' | 'extensionProviders' | 'editorStateStore'> &
|
|
@@ -3,40 +3,42 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { type EditorView } from '@codemirror/view';
|
|
6
|
-
import React, { useMemo, useEffect, useCallback,
|
|
6
|
+
import React, { forwardRef, useMemo, useEffect, useCallback, useImperativeHandle, useRef } from 'react';
|
|
7
7
|
import { useDropzone } from 'react-dropzone';
|
|
8
8
|
|
|
9
9
|
import { type FileInfo } from '@dxos/app-framework';
|
|
10
10
|
import { invariant } from '@dxos/invariant';
|
|
11
11
|
import { toLocalizedString, useThemeContext, useTranslation } from '@dxos/react-ui';
|
|
12
12
|
import {
|
|
13
|
+
CommandMenu,
|
|
14
|
+
type CommandMenuGroup,
|
|
15
|
+
type DNDOptions,
|
|
16
|
+
type EditorInputMode,
|
|
17
|
+
type EditorSelectionState,
|
|
18
|
+
type EditorStateStore,
|
|
19
|
+
EditorToolbar,
|
|
20
|
+
type EditorToolbarActionGraphProps,
|
|
21
|
+
type EditorViewMode,
|
|
22
|
+
RefPopover,
|
|
23
|
+
type UseTextEditorProps,
|
|
13
24
|
addLink,
|
|
25
|
+
createElement,
|
|
26
|
+
coreSlashCommands,
|
|
14
27
|
createBasicExtensions,
|
|
15
28
|
createMarkdownExtensions,
|
|
16
29
|
createThemeExtensions,
|
|
17
30
|
dropFile,
|
|
18
31
|
editorGutter,
|
|
19
32
|
editorSlots,
|
|
20
|
-
|
|
33
|
+
filterItems,
|
|
34
|
+
linkSlashCommands,
|
|
21
35
|
processEditorPayload,
|
|
22
|
-
RefPopover,
|
|
23
36
|
stackItemContentEditorClassNames,
|
|
24
|
-
type DNDOptions,
|
|
25
|
-
type EditorInputMode,
|
|
26
|
-
type EditorSelectionState,
|
|
27
|
-
type EditorStateStore,
|
|
28
|
-
type EditorToolbarActionGraphProps,
|
|
29
|
-
type EditorViewMode,
|
|
30
|
-
type CommandMenuGroup,
|
|
31
|
-
type UseTextEditorProps,
|
|
32
37
|
useEditorToolbarState,
|
|
33
38
|
useFormattingState,
|
|
34
|
-
useCommandMenu,
|
|
35
39
|
useTextEditor,
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
CommandMenu,
|
|
39
|
-
linkSlashCommands,
|
|
40
|
+
useCommandMenu,
|
|
41
|
+
type UseCommandMenuOptions,
|
|
40
42
|
} from '@dxos/react-ui-editor';
|
|
41
43
|
import { StackItem } from '@dxos/react-ui-stack';
|
|
42
44
|
import { isNotFalsy, isNonNullable } from '@dxos/util';
|
|
@@ -64,7 +66,6 @@ export type MarkdownEditorProps = {
|
|
|
64
66
|
|
|
65
67
|
/**
|
|
66
68
|
* Base markdown editor component.
|
|
67
|
-
*
|
|
68
69
|
* This component provides all the features of the markdown editor that do no depend on ECHO.
|
|
69
70
|
* This allows it to be used as a common editor for markdown content on arbitrary backends (e.g. files).
|
|
70
71
|
*/
|
|
@@ -76,7 +77,8 @@ export const MarkdownEditor = ({
|
|
|
76
77
|
}: MarkdownEditorProps) => {
|
|
77
78
|
const { t } = useTranslation();
|
|
78
79
|
const viewRef = useRef<EditorView>();
|
|
79
|
-
|
|
80
|
+
|
|
81
|
+
const getMenu = useCallback(
|
|
80
82
|
(trigger: string, query?: string) => {
|
|
81
83
|
switch (trigger) {
|
|
82
84
|
case '@':
|
|
@@ -90,11 +92,33 @@ export const MarkdownEditor = ({
|
|
|
90
92
|
},
|
|
91
93
|
[onLinkQuery, slashCommandGroups],
|
|
92
94
|
);
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
95
|
+
|
|
96
|
+
const options = useMemo<UseCommandMenuOptions>(() => {
|
|
97
|
+
const trigger = onLinkQuery ? ['/', '@'] : ['/'];
|
|
98
|
+
return {
|
|
99
|
+
viewRef,
|
|
100
|
+
trigger,
|
|
101
|
+
placeholder: {
|
|
102
|
+
delay: 3_000,
|
|
103
|
+
content: () => {
|
|
104
|
+
return createElement('div', undefined, [
|
|
105
|
+
createElement('span', { text: 'Press' }),
|
|
106
|
+
...trigger.map((text) =>
|
|
107
|
+
createElement('span', {
|
|
108
|
+
className: 'border border-separator rounded-sm mx-1 px-1.5 pt-[1px] pb-[2px]',
|
|
109
|
+
text,
|
|
110
|
+
}),
|
|
111
|
+
),
|
|
112
|
+
createElement('span', { text: 'for commands.' }),
|
|
113
|
+
]);
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
getMenu,
|
|
117
|
+
};
|
|
118
|
+
}, [getMenu]);
|
|
119
|
+
|
|
120
|
+
const { commandMenu, groupsRef, currentItem, onSelect, ...refPopoverProps } = useCommandMenu(options);
|
|
121
|
+
|
|
98
122
|
const extensions = useMemo(() => [_extensions, commandMenu].filter(isNotFalsy), [_extensions, commandMenu]);
|
|
99
123
|
|
|
100
124
|
return (
|
|
@@ -111,13 +135,13 @@ const MarkdownEditorImpl = forwardRef<EditorView | undefined, MarkdownEditorProp
|
|
|
111
135
|
id,
|
|
112
136
|
role = 'article',
|
|
113
137
|
initialValue,
|
|
138
|
+
customActions,
|
|
139
|
+
editorStateStore,
|
|
114
140
|
extensions,
|
|
115
141
|
extensionProviders,
|
|
116
142
|
scrollPastEnd,
|
|
117
143
|
toolbar,
|
|
118
|
-
customActions,
|
|
119
144
|
viewMode,
|
|
120
|
-
editorStateStore,
|
|
121
145
|
onFileUpload,
|
|
122
146
|
onViewModeChange,
|
|
123
147
|
},
|
|
@@ -73,7 +73,7 @@ const TestChat: FC<{ doc: DocumentType; content: string }> = ({ doc, content })
|
|
|
73
73
|
const handleInsert = async () => {
|
|
74
74
|
invariant(space);
|
|
75
75
|
invariant(queue);
|
|
76
|
-
queue.append([Obj.make(Message, { role: 'assistant', content: [{ type: 'text', text: 'Hello' }] })]);
|
|
76
|
+
await queue.append([Obj.make(Message, { role: 'assistant', content: [{ type: 'text', text: 'Hello' }] })]);
|
|
77
77
|
const message = queue.objects.at(-1);
|
|
78
78
|
invariant(message);
|
|
79
79
|
|