@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.
Files changed (70) hide show
  1. package/dist/lib/browser/{MarkdownContainer-3KTC7Q4C.mjs → MarkdownContainer-EFWQ6DHD.mjs} +119 -51
  2. package/dist/lib/browser/MarkdownContainer-EFWQ6DHD.mjs.map +7 -0
  3. package/dist/lib/browser/{app-graph-serializer-FLQI6GFL.mjs → app-graph-serializer-EI6TEHRQ.mjs} +6 -4
  4. package/dist/lib/browser/app-graph-serializer-EI6TEHRQ.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-LCMXUTQB.mjs → chunk-354IBM5X.mjs} +3 -3
  6. package/dist/lib/browser/{chunk-CX5GYZYO.mjs → chunk-D767LUGU.mjs} +6 -2
  7. package/dist/lib/browser/chunk-D767LUGU.mjs.map +7 -0
  8. package/dist/lib/browser/index.mjs +2 -2
  9. package/dist/lib/browser/meta.json +1 -1
  10. package/dist/lib/browser/{react-surface-RJQKYJJQ.mjs → react-surface-4B5ELMEW.mjs} +8 -3
  11. package/dist/lib/browser/{react-surface-RJQKYJJQ.mjs.map → react-surface-4B5ELMEW.mjs.map} +2 -2
  12. package/dist/lib/node/{MarkdownContainer-NG4H6AZJ.cjs → MarkdownContainer-KYGUEZIL.cjs} +116 -48
  13. package/dist/lib/node/MarkdownContainer-KYGUEZIL.cjs.map +7 -0
  14. package/dist/lib/node/{app-graph-serializer-BZPM7HHJ.cjs → app-graph-serializer-E6BXEDEL.cjs} +11 -9
  15. package/dist/lib/node/app-graph-serializer-E6BXEDEL.cjs.map +7 -0
  16. package/dist/lib/node/{chunk-4DYNEQG3.cjs → chunk-FU3XZZCO.cjs} +6 -6
  17. package/dist/lib/node/{chunk-SYEFGLXN.cjs → chunk-LQAC5HL7.cjs} +9 -5
  18. package/dist/lib/node/chunk-LQAC5HL7.cjs.map +7 -0
  19. package/dist/lib/node/index.cjs +10 -10
  20. package/dist/lib/node/meta.json +1 -1
  21. package/dist/lib/node/{react-surface-5RKEWAXS.cjs → react-surface-456HQ4KZ.cjs} +11 -6
  22. package/dist/lib/node/{react-surface-5RKEWAXS.cjs.map → react-surface-456HQ4KZ.cjs.map} +2 -2
  23. package/dist/lib/node-esm/{MarkdownContainer-DZPXCA6J.mjs → MarkdownContainer-O3SGMH4G.mjs} +119 -51
  24. package/dist/lib/node-esm/MarkdownContainer-O3SGMH4G.mjs.map +7 -0
  25. package/dist/lib/node-esm/{app-graph-serializer-EBH54X6Z.mjs → app-graph-serializer-F7DGNF3G.mjs} +6 -4
  26. package/dist/lib/node-esm/app-graph-serializer-F7DGNF3G.mjs.map +7 -0
  27. package/dist/lib/node-esm/{chunk-Q7WUBLL3.mjs → chunk-BWDDFDJY.mjs} +6 -2
  28. package/dist/lib/node-esm/chunk-BWDDFDJY.mjs.map +7 -0
  29. package/dist/lib/node-esm/{chunk-WANCCPU7.mjs → chunk-YOABAQ7A.mjs} +3 -3
  30. package/dist/lib/node-esm/index.mjs +2 -2
  31. package/dist/lib/node-esm/meta.json +1 -1
  32. package/dist/lib/node-esm/{react-surface-Z3DX37JV.mjs → react-surface-YHFOQTVO.mjs} +8 -3
  33. package/dist/lib/node-esm/{react-surface-Z3DX37JV.mjs.map → react-surface-YHFOQTVO.mjs.map} +2 -2
  34. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -1
  35. package/dist/types/src/components/MarkdownContainer.d.ts.map +1 -1
  36. package/dist/types/src/components/MarkdownContainer.stories.d.ts +9 -0
  37. package/dist/types/src/components/MarkdownContainer.stories.d.ts.map +1 -0
  38. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +1 -2
  39. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
  40. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts +2 -4
  41. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts.map +1 -1
  42. package/dist/types/src/extensions.d.ts +3 -2
  43. package/dist/types/src/extensions.d.ts.map +1 -1
  44. package/dist/types/src/translations.d.ts +52 -2
  45. package/dist/types/src/translations.d.ts.map +1 -1
  46. package/dist/types/src/types/schema.d.ts +11 -14
  47. package/dist/types/src/types/schema.d.ts.map +1 -1
  48. package/dist/types/src/types/types.d.ts +5 -6
  49. package/dist/types/src/types/types.d.ts.map +1 -1
  50. package/package.json +38 -38
  51. package/src/capabilities/app-graph-serializer.ts +5 -3
  52. package/src/capabilities/react-surface.tsx +1 -1
  53. package/src/components/MarkdownContainer.stories.tsx +103 -0
  54. package/src/components/MarkdownContainer.tsx +94 -51
  55. package/src/components/MarkdownEditor/MarkdownEditor.tsx +49 -25
  56. package/src/components/Suggestions.stories.tsx +1 -1
  57. package/src/extensions.tsx +7 -1
  58. package/src/translations.ts +6 -1
  59. package/dist/lib/browser/MarkdownContainer-3KTC7Q4C.mjs.map +0 -7
  60. package/dist/lib/browser/app-graph-serializer-FLQI6GFL.mjs.map +0 -7
  61. package/dist/lib/browser/chunk-CX5GYZYO.mjs.map +0 -7
  62. package/dist/lib/node/MarkdownContainer-NG4H6AZJ.cjs.map +0 -7
  63. package/dist/lib/node/app-graph-serializer-BZPM7HHJ.cjs.map +0 -7
  64. package/dist/lib/node/chunk-SYEFGLXN.cjs.map +0 -7
  65. package/dist/lib/node-esm/MarkdownContainer-DZPXCA6J.mjs.map +0 -7
  66. package/dist/lib/node-esm/app-graph-serializer-EBH54X6Z.mjs.map +0 -7
  67. package/dist/lib/node-esm/chunk-Q7WUBLL3.mjs.map +0 -7
  68. /package/dist/lib/browser/{chunk-LCMXUTQB.mjs.map → chunk-354IBM5X.mjs.map} +0 -0
  69. /package/dist/lib/node/{chunk-4DYNEQG3.cjs.map → chunk-FU3XZZCO.cjs.map} +0 -0
  70. /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: import("@dxos/echo-schema").Ref$<{
6
- readonly id: string;
7
- content: string;
8
- }>;
6
+ content: Type.ref<Type.obj<Schema.Struct<{
7
+ content: typeof import("effect/Schema").String;
8
+ }>>>;
9
9
  }>;
10
- export declare const DocumentType: import("@dxos/echo-schema").EchoTypeSchema<Schema.Struct<{
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: import("@dxos/echo-schema").Ref$<{
14
- readonly id: string;
15
- content: string;
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;AAMhC,eAAO,MAAM,cAAc;;;;;;;EAI2B,CAAC;AAEvD,eAAO,MAAM,YAAY;;;;;;;OAKxB,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"}
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: import("@dxos/echo-schema").EchoTypeSchema<Schema.Struct<{
22
+ object: Type.obj<Schema.Struct<{
23
23
  name: Schema.optional<typeof Schema.String>;
24
24
  fallbackName: Schema.optional<typeof Schema.String>;
25
- content: import("@dxos/echo-schema").Ref$<{
26
- readonly id: string;
27
- content: string;
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;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
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-main.7f5a14c",
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-main.7f5a14c",
43
- "@dxos/artifact": "0.8.3-main.7f5a14c",
44
- "@dxos/app-framework": "0.8.3-main.7f5a14c",
45
- "@dxos/assistant": "0.8.3-main.7f5a14c",
46
- "@dxos/async": "0.8.3-main.7f5a14c",
47
- "@dxos/echo": "0.8.3-main.7f5a14c",
48
- "@dxos/echo-schema": "0.8.3-main.7f5a14c",
49
- "@dxos/invariant": "0.8.3-main.7f5a14c",
50
- "@dxos/keys": "0.8.3-main.7f5a14c",
51
- "@dxos/lit-ui": "0.8.3-main.7f5a14c",
52
- "@dxos/local-storage": "0.8.3-main.7f5a14c",
53
- "@dxos/live-object": "0.8.3-main.7f5a14c",
54
- "@dxos/log": "0.8.3-main.7f5a14c",
55
- "@dxos/plugin-attention": "0.8.3-main.7f5a14c",
56
- "@dxos/plugin-client": "0.8.3-main.7f5a14c",
57
- "@dxos/plugin-deck": "0.8.3-main.7f5a14c",
58
- "@dxos/plugin-preview": "0.8.3-main.7f5a14c",
59
- "@dxos/plugin-graph": "0.8.3-main.7f5a14c",
60
- "@dxos/plugin-space": "0.8.3-main.7f5a14c",
61
- "@dxos/plugin-theme": "0.8.3-main.7f5a14c",
62
- "@dxos/react-hooks": "0.8.3-main.7f5a14c",
63
- "@dxos/react-ui-attention": "0.8.3-main.7f5a14c",
64
- "@dxos/react-client": "0.8.3-main.7f5a14c",
65
- "@dxos/react-ui-form": "0.8.3-main.7f5a14c",
66
- "@dxos/react-ui-editor": "0.8.3-main.7f5a14c",
67
- "@dxos/react-ui-stack": "0.8.3-main.7f5a14c",
68
- "@dxos/util": "0.8.3-main.7f5a14c",
69
- "@dxos/schema": "0.8.3-main.7f5a14c"
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-main.7f5a14c",
82
- "@dxos/plugin-storybook-layout": "0.8.3-main.7f5a14c",
83
- "@dxos/random": "0.8.3-main.7f5a14c",
84
- "@dxos/plugin-theme": "0.8.3-main.7f5a14c",
85
- "@dxos/react-ui": "0.8.3-main.7f5a14c",
86
- "@dxos/react-ui-theme": "0.8.3-main.7f5a14c",
87
- "@dxos/storybook-utils": "0.8.3-main.7f5a14c"
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-main.7f5a14c",
97
- "@dxos/react-ui-theme": "0.8.3-main.7f5a14c"
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 { SpaceAction, CollectionType } from '@dxos/plugin-space/types';
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 instanceof CollectionType) ??
34
- space?.properties[CollectionType.typename]?.target;
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 { type CommandMenuGroup, type CommandMenuItem, insertAtCursor, insertAtLineStart } from '@dxos/react-ui-editor';
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 extensions = useExtensions({ document: doc, text, id, settings, selectionManager, viewMode, editorStateStore });
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
- if (doc) {
97
- return (
98
- <DocumentEditor
99
- id={fullyQualifiedId(object)}
100
- role={role}
101
- document={doc}
102
- extensions={extensions}
103
- viewMode={viewMode}
104
- settings={settings}
105
- scrollPastEnd={scrollPastEnd}
106
- onViewModeChange={onViewModeChange}
107
- onLinkQuery={space ? onLinkQuery : undefined}
108
- />
109
- );
110
- } else if (text) {
111
- return (
112
- <MarkdownEditor
113
- id={id}
114
- role={role}
115
- initialValue={text.content}
116
- extensions={extensions}
117
- viewMode={viewMode}
118
- toolbar={settings.toolbar}
119
- inputMode={settings.editorInputMode}
120
- scrollPastEnd={scrollPastEnd}
121
- onViewModeChange={onViewModeChange}
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
- return (
128
- <MarkdownEditor
129
- id={id}
130
- role={role}
131
- initialValue={object.text}
132
- extensions={extensions}
133
- viewMode={viewMode}
134
- toolbar={settings.toolbar}
135
- inputMode={settings.editorInputMode}
136
- scrollPastEnd={scrollPastEnd}
137
- onViewModeChange={onViewModeChange}
138
- onLinkQuery={space ? onLinkQuery : undefined}
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, forwardRef, useImperativeHandle, useRef } from 'react';
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
- EditorToolbar,
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
- filterItems,
37
- coreSlashCommands,
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
- const getGroups = useCallback(
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
- const { commandMenu, groupsRef, currentItem, onSelect, ...refPopoverProps } = useCommandMenu({
94
- viewRef,
95
- getGroups,
96
- trigger: onLinkQuery ? ['/', '@'] : '/',
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