@dxos/plugin-markdown 0.8.2-main.f11618f → 0.8.2-main.fbd8ed0

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 (176) hide show
  1. package/dist/lib/browser/{MarkdownContainer-5XV7K2NX.mjs → MarkdownContainer-KKWICAKV.mjs} +46 -62
  2. package/dist/lib/browser/MarkdownContainer-KKWICAKV.mjs.map +7 -0
  3. package/dist/lib/browser/{MarkdownPreview-DX5U5LCX.mjs → MarkdownPreview-FVSYVJGN.mjs} +7 -7
  4. package/dist/lib/browser/MarkdownPreview-FVSYVJGN.mjs.map +7 -0
  5. package/dist/lib/browser/{app-graph-serializer-OCXP7PCK.mjs → app-graph-serializer-MPJQUYTQ.mjs} +5 -6
  6. package/dist/lib/browser/app-graph-serializer-MPJQUYTQ.mjs.map +7 -0
  7. package/dist/lib/browser/{artifact-definition-XTVOUMMI.mjs → artifact-definition-DAF3YCVL.mjs} +10 -9
  8. package/dist/lib/browser/artifact-definition-DAF3YCVL.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-JJY5LKZS.mjs +20 -0
  10. package/dist/lib/browser/{chunk-QV6ZIXAD.mjs → chunk-S42YXFZ7.mjs} +4 -4
  11. package/dist/lib/browser/{chunk-QV6ZIXAD.mjs.map → chunk-S42YXFZ7.mjs.map} +3 -3
  12. package/dist/lib/browser/{chunk-LJ2UFBJ2.mjs → chunk-TUCSFCS5.mjs} +3 -4
  13. package/dist/lib/browser/chunk-TUCSFCS5.mjs.map +7 -0
  14. package/dist/lib/browser/chunk-XP2ZPCLI.mjs +87 -0
  15. package/dist/lib/browser/chunk-XP2ZPCLI.mjs.map +7 -0
  16. package/dist/lib/browser/index.mjs +6 -6
  17. package/dist/lib/browser/index.mjs.map +3 -3
  18. package/dist/lib/browser/{intent-resolver-H37L3DBD.mjs → intent-resolver-PVKVTAFF.mjs} +9 -14
  19. package/dist/lib/browser/intent-resolver-PVKVTAFF.mjs.map +7 -0
  20. package/dist/lib/browser/meta.json +1 -1
  21. package/dist/lib/browser/{react-surface-LBCMSLJ5.mjs → react-surface-EMQV3GVI.mjs} +9 -8
  22. package/dist/lib/browser/react-surface-EMQV3GVI.mjs.map +7 -0
  23. package/dist/lib/browser/{settings-EQSDBX6O.mjs → settings-GPB6WOIU.mjs} +2 -2
  24. package/dist/lib/browser/{state-AIN4J7N5.mjs → state-XTP5IP3W.mjs} +2 -2
  25. package/dist/lib/browser/state-XTP5IP3W.mjs.map +7 -0
  26. package/dist/lib/browser/{thread-MFKBUVCB.mjs → thread-KW43PJ53.mjs} +2 -2
  27. package/dist/lib/browser/types/index.mjs +1 -1
  28. package/dist/lib/node/{MarkdownContainer-5EQTBXV3.cjs → MarkdownContainer-LBI6ZESS.cjs} +52 -68
  29. package/dist/lib/node/MarkdownContainer-LBI6ZESS.cjs.map +7 -0
  30. package/dist/lib/node/{MarkdownPreview-W7QIN2KJ.cjs → MarkdownPreview-O3BR4PZW.cjs} +14 -14
  31. package/dist/lib/node/MarkdownPreview-O3BR4PZW.cjs.map +7 -0
  32. package/dist/lib/node/{app-graph-serializer-KBDLASRP.cjs → app-graph-serializer-Z7UJYSSL.cjs} +10 -11
  33. package/dist/lib/node/app-graph-serializer-Z7UJYSSL.cjs.map +7 -0
  34. package/dist/lib/node/{artifact-definition-ADEN2KD6.cjs → artifact-definition-UIZSL2AL.cjs} +15 -14
  35. package/dist/lib/node/artifact-definition-UIZSL2AL.cjs.map +7 -0
  36. package/dist/lib/node/{chunk-JO4SBK36.cjs → chunk-4525YF72.cjs} +6 -7
  37. package/dist/lib/node/chunk-4525YF72.cjs.map +7 -0
  38. package/dist/lib/node/{chunk-QRE5L6ZC.cjs → chunk-AJHB57YQ.cjs} +11 -11
  39. package/dist/lib/node/{chunk-WGMVEPB3.cjs → chunk-BWRBWEKN.cjs} +7 -7
  40. package/dist/lib/node/chunk-BWRBWEKN.cjs.map +7 -0
  41. package/dist/lib/node/{chunk-YHL4JSA6.cjs → chunk-EO5H4OZJ.cjs} +35 -32
  42. package/dist/lib/node/chunk-EO5H4OZJ.cjs.map +7 -0
  43. package/dist/lib/node/index.cjs +23 -23
  44. package/dist/lib/node/index.cjs.map +3 -3
  45. package/dist/lib/node/{intent-resolver-NX5QNRYF.cjs → intent-resolver-ND7PSRJX.cjs} +14 -19
  46. package/dist/lib/node/intent-resolver-ND7PSRJX.cjs.map +7 -0
  47. package/dist/lib/node/meta.json +1 -1
  48. package/dist/lib/node/{react-surface-DJIZSVMN.cjs → react-surface-REHX3ABQ.cjs} +13 -12
  49. package/dist/lib/node/react-surface-REHX3ABQ.cjs.map +7 -0
  50. package/dist/lib/node/{settings-2JXASSLU.cjs → settings-SF6JDJG6.cjs} +6 -6
  51. package/dist/lib/node/{state-PC7IVXFP.cjs → state-K4IPZTRO.cjs} +5 -5
  52. package/dist/lib/node/state-K4IPZTRO.cjs.map +7 -0
  53. package/dist/lib/node/{thread-MXEGV6HS.cjs → thread-NWBGBGOR.cjs} +6 -6
  54. package/dist/lib/node/types/index.cjs +7 -7
  55. package/dist/lib/node/types/index.cjs.map +1 -1
  56. package/dist/lib/node-esm/{MarkdownContainer-LONZOJJX.mjs → MarkdownContainer-62XZY5EP.mjs} +46 -62
  57. package/dist/lib/node-esm/MarkdownContainer-62XZY5EP.mjs.map +7 -0
  58. package/dist/lib/node-esm/{MarkdownPreview-T3OW2EN4.mjs → MarkdownPreview-KYWRMBRM.mjs} +7 -7
  59. package/dist/lib/node-esm/MarkdownPreview-KYWRMBRM.mjs.map +7 -0
  60. package/dist/lib/node-esm/{app-graph-serializer-67CO7ST3.mjs → app-graph-serializer-DDMFMNYI.mjs} +5 -6
  61. package/dist/lib/node-esm/app-graph-serializer-DDMFMNYI.mjs.map +7 -0
  62. package/dist/lib/node-esm/{artifact-definition-KTS5M2FW.mjs → artifact-definition-ER3446S7.mjs} +10 -9
  63. package/dist/lib/node-esm/artifact-definition-ER3446S7.mjs.map +7 -0
  64. package/dist/lib/node-esm/chunk-66XM3JMR.mjs +88 -0
  65. package/dist/lib/node-esm/chunk-66XM3JMR.mjs.map +7 -0
  66. package/dist/lib/node-esm/{chunk-VQA6BQGT.mjs → chunk-CXTVDT5U.mjs} +3 -4
  67. package/dist/lib/node-esm/chunk-CXTVDT5U.mjs.map +7 -0
  68. package/dist/lib/node-esm/{chunk-4U2F4EB7.mjs → chunk-PDD5B7EO.mjs} +4 -4
  69. package/dist/lib/node-esm/{chunk-4U2F4EB7.mjs.map → chunk-PDD5B7EO.mjs.map} +3 -3
  70. package/dist/lib/node-esm/{chunk-PALFXZBY.mjs → chunk-T5Z5BIOF.mjs} +8 -8
  71. package/dist/lib/node-esm/index.mjs +6 -6
  72. package/dist/lib/node-esm/index.mjs.map +3 -3
  73. package/dist/lib/node-esm/{intent-resolver-XES4ZCA6.mjs → intent-resolver-5BF5PLSN.mjs} +9 -14
  74. package/dist/lib/node-esm/intent-resolver-5BF5PLSN.mjs.map +7 -0
  75. package/dist/lib/node-esm/meta.json +1 -1
  76. package/dist/lib/node-esm/{react-surface-737EXAWT.mjs → react-surface-FA7JYF2A.mjs} +9 -8
  77. package/dist/lib/node-esm/react-surface-FA7JYF2A.mjs.map +7 -0
  78. package/dist/lib/node-esm/{settings-67RVIH3N.mjs → settings-2DT2C4RA.mjs} +2 -2
  79. package/dist/lib/node-esm/{state-PNOPM4TS.mjs → state-7VFYPF6Z.mjs} +2 -2
  80. package/dist/lib/node-esm/state-7VFYPF6Z.mjs.map +7 -0
  81. package/dist/lib/node-esm/{thread-5U4KSBED.mjs → thread-D2E6W44K.mjs} +2 -2
  82. package/dist/lib/node-esm/types/index.mjs +1 -1
  83. package/dist/types/src/capabilities/app-graph-serializer.d.ts +2 -2
  84. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -1
  85. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  86. package/dist/types/src/capabilities/index.d.ts +3 -3
  87. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  88. package/dist/types/src/capabilities/intent-resolver.d.ts +2 -2
  89. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  90. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  91. package/dist/types/src/capabilities/state.d.ts +2 -2
  92. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  93. package/dist/types/src/components/MarkdownContainer.d.ts +2 -2
  94. package/dist/types/src/components/MarkdownContainer.d.ts.map +1 -1
  95. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +0 -15
  96. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
  97. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.d.ts +2 -2
  98. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.d.ts.map +1 -1
  99. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts +53 -117
  100. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts.map +1 -1
  101. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts.map +1 -1
  102. package/dist/types/src/components/Suggestions.stories.d.ts.map +1 -1
  103. package/dist/types/src/components/Toolbar.stories.d.ts.map +1 -1
  104. package/dist/types/src/components/index.d.ts +1 -1
  105. package/dist/types/src/components/index.d.ts.map +1 -1
  106. package/dist/types/src/extensions.d.ts +4 -4
  107. package/dist/types/src/extensions.d.ts.map +1 -1
  108. package/dist/types/src/hooks/useSelectCurrentThread.d.ts.map +1 -1
  109. package/dist/types/src/translations.d.ts +2 -46
  110. package/dist/types/src/translations.d.ts.map +1 -1
  111. package/dist/types/src/types/schema.d.ts +185 -376
  112. package/dist/types/src/types/schema.d.ts.map +1 -1
  113. package/dist/types/src/types/types.d.ts +92 -150
  114. package/dist/types/src/types/types.d.ts.map +1 -1
  115. package/dist/types/src/util.d.ts.map +1 -1
  116. package/dist/types/tsconfig.tsbuildinfo +1 -1
  117. package/package.json +40 -38
  118. package/src/MarkdownPlugin.tsx +2 -2
  119. package/src/capabilities/app-graph-serializer.ts +4 -5
  120. package/src/capabilities/artifact-definition.ts +6 -4
  121. package/src/capabilities/intent-resolver.ts +10 -10
  122. package/src/capabilities/react-surface.tsx +7 -6
  123. package/src/capabilities/state.ts +3 -3
  124. package/src/components/MarkdownContainer.tsx +3 -4
  125. package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +1 -1
  126. package/src/components/MarkdownEditor/MarkdownEditor.tsx +21 -42
  127. package/src/components/MarkdownPreview/MarkdownPreview.stories.tsx +9 -3
  128. package/src/components/MarkdownPreview/MarkdownPreview.tsx +8 -8
  129. package/src/components/Suggestions.stories.tsx +20 -13
  130. package/src/components/Toolbar.stories.tsx +14 -14
  131. package/src/extensions.tsx +5 -5
  132. package/src/hooks/useSelectCurrentThread.tsx +2 -2
  133. package/src/translations.ts +1 -3
  134. package/src/types/schema.ts +20 -12
  135. package/src/types/types.ts +23 -21
  136. package/src/util.tsx +3 -3
  137. package/dist/lib/browser/MarkdownContainer-5XV7K2NX.mjs.map +0 -7
  138. package/dist/lib/browser/MarkdownPreview-DX5U5LCX.mjs.map +0 -7
  139. package/dist/lib/browser/app-graph-serializer-OCXP7PCK.mjs.map +0 -7
  140. package/dist/lib/browser/artifact-definition-XTVOUMMI.mjs.map +0 -7
  141. package/dist/lib/browser/chunk-5QXYEKSX.mjs +0 -20
  142. package/dist/lib/browser/chunk-GVOEHF7E.mjs +0 -84
  143. package/dist/lib/browser/chunk-GVOEHF7E.mjs.map +0 -7
  144. package/dist/lib/browser/chunk-LJ2UFBJ2.mjs.map +0 -7
  145. package/dist/lib/browser/intent-resolver-H37L3DBD.mjs.map +0 -7
  146. package/dist/lib/browser/react-surface-LBCMSLJ5.mjs.map +0 -7
  147. package/dist/lib/browser/state-AIN4J7N5.mjs.map +0 -7
  148. package/dist/lib/node/MarkdownContainer-5EQTBXV3.cjs.map +0 -7
  149. package/dist/lib/node/MarkdownPreview-W7QIN2KJ.cjs.map +0 -7
  150. package/dist/lib/node/app-graph-serializer-KBDLASRP.cjs.map +0 -7
  151. package/dist/lib/node/artifact-definition-ADEN2KD6.cjs.map +0 -7
  152. package/dist/lib/node/chunk-JO4SBK36.cjs.map +0 -7
  153. package/dist/lib/node/chunk-WGMVEPB3.cjs.map +0 -7
  154. package/dist/lib/node/chunk-YHL4JSA6.cjs.map +0 -7
  155. package/dist/lib/node/intent-resolver-NX5QNRYF.cjs.map +0 -7
  156. package/dist/lib/node/react-surface-DJIZSVMN.cjs.map +0 -7
  157. package/dist/lib/node/state-PC7IVXFP.cjs.map +0 -7
  158. package/dist/lib/node-esm/MarkdownContainer-LONZOJJX.mjs.map +0 -7
  159. package/dist/lib/node-esm/MarkdownPreview-T3OW2EN4.mjs.map +0 -7
  160. package/dist/lib/node-esm/app-graph-serializer-67CO7ST3.mjs.map +0 -7
  161. package/dist/lib/node-esm/artifact-definition-KTS5M2FW.mjs.map +0 -7
  162. package/dist/lib/node-esm/chunk-NUZHKZSZ.mjs +0 -85
  163. package/dist/lib/node-esm/chunk-NUZHKZSZ.mjs.map +0 -7
  164. package/dist/lib/node-esm/chunk-VQA6BQGT.mjs.map +0 -7
  165. package/dist/lib/node-esm/intent-resolver-XES4ZCA6.mjs.map +0 -7
  166. package/dist/lib/node-esm/react-surface-737EXAWT.mjs.map +0 -7
  167. package/dist/lib/node-esm/state-PNOPM4TS.mjs.map +0 -7
  168. /package/dist/lib/browser/{chunk-5QXYEKSX.mjs.map → chunk-JJY5LKZS.mjs.map} +0 -0
  169. /package/dist/lib/browser/{settings-EQSDBX6O.mjs.map → settings-GPB6WOIU.mjs.map} +0 -0
  170. /package/dist/lib/browser/{thread-MFKBUVCB.mjs.map → thread-KW43PJ53.mjs.map} +0 -0
  171. /package/dist/lib/node/{chunk-QRE5L6ZC.cjs.map → chunk-AJHB57YQ.cjs.map} +0 -0
  172. /package/dist/lib/node/{settings-2JXASSLU.cjs.map → settings-SF6JDJG6.cjs.map} +0 -0
  173. /package/dist/lib/node/{thread-MXEGV6HS.cjs.map → thread-NWBGBGOR.cjs.map} +0 -0
  174. /package/dist/lib/node-esm/{chunk-PALFXZBY.mjs.map → chunk-T5Z5BIOF.mjs.map} +0 -0
  175. /package/dist/lib/node-esm/{settings-67RVIH3N.mjs.map → settings-2DT2C4RA.mjs.map} +0 -0
  176. /package/dist/lib/node-esm/{thread-5U4KSBED.mjs.map → thread-D2E6W44K.mjs.map} +0 -0
@@ -8,7 +8,7 @@ import { createSurface, contributes, Capabilities, useCapability } from '@dxos/a
8
8
  import { isInstanceOf } from '@dxos/echo-schema';
9
9
  import { SettingsStore } from '@dxos/local-storage';
10
10
  import { fullyQualifiedId } from '@dxos/react-client/echo';
11
- import { TextType } from '@dxos/schema';
11
+ import { DataType } from '@dxos/schema';
12
12
 
13
13
  import { MarkdownCapabilities } from './capabilities';
14
14
  import { MarkdownContainer, MarkdownSettings, MarkdownPreview } from '../components';
@@ -26,6 +26,7 @@ export default () =>
26
26
  const settingsStore = useCapability(Capabilities.SettingsStore);
27
27
  const settings = settingsStore.getStore<MarkdownSettingsProps>(MARKDOWN_PLUGIN)!.value;
28
28
  const { state, editorState, getViewMode, setViewMode } = useCapability(MarkdownCapabilities.State);
29
+ const viewMode = getViewMode(fullyQualifiedId(data.subject));
29
30
 
30
31
  return (
31
32
  <MarkdownContainer
@@ -34,7 +35,7 @@ export default () =>
34
35
  role={role}
35
36
  settings={settings}
36
37
  extensionProviders={state.extensionProviders}
37
- viewMode={getViewMode(fullyQualifiedId(data.subject))}
38
+ viewMode={viewMode}
38
39
  editorStateStore={editorState}
39
40
  onViewModeChange={setViewMode}
40
41
  />
@@ -44,8 +45,8 @@ export default () =>
44
45
  createSurface({
45
46
  id: `${MARKDOWN_PLUGIN}/text`,
46
47
  role: ['article', 'section', 'tabpanel'],
47
- filter: (data): data is { id: string; subject: TextType } =>
48
- typeof data.id === 'string' && isInstanceOf(TextType, data.subject),
48
+ filter: (data): data is { id: string; subject: DataType.Text } =>
49
+ typeof data.id === 'string' && isInstanceOf(DataType.Text, data.subject),
49
50
  component: ({ data, role }) => {
50
51
  const settingsStore = useCapability(Capabilities.SettingsStore);
51
52
  const settings = settingsStore.getStore<MarkdownSettingsProps>(MARKDOWN_PLUGIN)!.value;
@@ -98,8 +99,8 @@ export default () =>
98
99
  createSurface({
99
100
  id: `${MARKDOWN_PLUGIN}/preview`,
100
101
  role: 'popover',
101
- filter: (data): data is { subject: DocumentType | TextType } =>
102
- isInstanceOf(DocumentType, data.subject) || isInstanceOf(TextType, data.subject),
102
+ filter: (data): data is { subject: DocumentType | DataType.Text } =>
103
+ isInstanceOf(DocumentType, data.subject) || isInstanceOf(DataType.Text, data.subject),
103
104
  component: ({ data, role }) => <MarkdownPreview {...data} role={role} />,
104
105
  }),
105
106
  ]);
@@ -2,7 +2,7 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Capabilities, contributes, type PluginsContext } from '@dxos/app-framework';
5
+ import { Capabilities, contributes, type PluginContext } from '@dxos/app-framework';
6
6
  import { LocalStorageStore } from '@dxos/local-storage';
7
7
  import { type EditorViewMode, createEditorStateStore } from '@dxos/react-ui-editor';
8
8
 
@@ -10,7 +10,7 @@ import { MarkdownCapabilities } from './capabilities';
10
10
  import { MARKDOWN_PLUGIN } from '../meta';
11
11
  import { type MarkdownPluginState, type MarkdownSettingsProps } from '../types';
12
12
 
13
- export default (context: PluginsContext) => {
13
+ export default (context: PluginContext) => {
14
14
  const state = new LocalStorageStore<MarkdownPluginState>(MARKDOWN_PLUGIN, { extensionProviders: [], viewMode: {} });
15
15
  state.prop({ key: 'viewMode', type: LocalStorageStore.json<{ [key: string]: EditorViewMode }>() });
16
16
 
@@ -19,7 +19,7 @@ export default (context: PluginsContext) => {
19
19
 
20
20
  const getViewMode = (id: string) => {
21
21
  const defaultViewMode = context
22
- .requestCapability(Capabilities.SettingsStore)
22
+ .getCapability(Capabilities.SettingsStore)
23
23
  .getStore<MarkdownSettingsProps>(MARKDOWN_PLUGIN)!.value.defaultViewMode;
24
24
  return (id && state.values.viewMode[id]) || defaultViewMode;
25
25
  };
@@ -7,7 +7,7 @@ import React, { useEffect, useMemo } from 'react';
7
7
  import { Capabilities, useCapabilities } from '@dxos/app-framework';
8
8
  import { isInstanceOf } from '@dxos/echo-schema';
9
9
  import { fullyQualifiedId, getSpace } from '@dxos/react-client/echo';
10
- import { TextType } from '@dxos/schema';
10
+ import { DataType } from '@dxos/schema';
11
11
 
12
12
  import { MarkdownEditor, type MarkdownEditorProps } from './MarkdownEditor';
13
13
  import { useExtensions } from '../extensions';
@@ -19,11 +19,10 @@ export type MarkdownContainerProps = Pick<
19
19
  'role' | 'extensionProviders' | 'viewMode' | 'editorStateStore' | 'onViewModeChange'
20
20
  > & {
21
21
  id: string;
22
- object: DocumentType | TextType | any;
22
+ object: DocumentType | DataType.Text | any;
23
23
  settings: MarkdownSettingsProps;
24
24
  };
25
25
 
26
- // TODO(burdon): Move toolbar here.
27
26
  // TODO(burdon): Factor out difference for ECHO and non-ECHO objects; i.e., single component.
28
27
  const MarkdownContainer = ({
29
28
  id,
@@ -36,7 +35,7 @@ const MarkdownContainer = ({
36
35
  }: MarkdownContainerProps) => {
37
36
  const scrollPastEnd = role === 'article';
38
37
  const doc = isInstanceOf(DocumentType, object) ? object : undefined;
39
- const text = isInstanceOf(TextType, object) ? object : undefined;
38
+ const text = isInstanceOf(DataType.Text, object) ? object : undefined;
40
39
  const extensions = useExtensions({ document: doc, text, id, settings, viewMode, editorStateStore });
41
40
 
42
41
  if (doc) {
@@ -36,7 +36,7 @@ const meta: Meta<typeof MarkdownEditor> = {
36
36
  render: DefaultStory,
37
37
  decorators: [
38
38
  withTheme,
39
- withLayout({ tooltips: true, fullscreen: true }),
39
+ withLayout({ fullscreen: true }),
40
40
  withAttention,
41
41
  withPluginManager({ plugins: [IntentPlugin()] }),
42
42
  ],
@@ -2,17 +2,16 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { openSearchPanel } from '@codemirror/search';
6
5
  import { type EditorView } from '@codemirror/view';
7
6
  import React, { useMemo, useEffect, useCallback } from 'react';
8
7
  import { useDropzone } from 'react-dropzone';
9
8
 
10
9
  import { createIntent, type FileInfo, useIntentDispatcher } from '@dxos/app-framework';
10
+ import { invariant } from '@dxos/invariant';
11
11
  import { ATTENDABLE_PATH_SEPARATOR, DeckAction } from '@dxos/plugin-deck/types';
12
12
  import { useThemeContext, useTranslation } from '@dxos/react-ui';
13
13
  import {
14
14
  type DNDOptions,
15
- type EditorAction,
16
15
  type EditorViewMode,
17
16
  type EditorInputMode,
18
17
  type EditorSelectionState,
@@ -20,7 +19,6 @@ import {
20
19
  EditorToolbar,
21
20
  type UseTextEditorProps,
22
21
  createBasicExtensions,
23
- createEditorAction,
24
22
  createMarkdownExtensions,
25
23
  createThemeExtensions,
26
24
  dropFile,
@@ -28,12 +26,12 @@ import {
28
26
  editorGutter,
29
27
  processEditorPayload,
30
28
  stackItemContentEditorClassNames,
31
- useActionHandler,
32
29
  useCommentState,
33
30
  useCommentClickListener,
34
31
  useFormattingState,
35
32
  useTextEditor,
36
33
  useEditorToolbarState,
34
+ addLink,
37
35
  } from '@dxos/react-ui-editor';
38
36
  import { StackItem } from '@dxos/react-ui-stack';
39
37
  import { isNotFalsy, isNonNullable } from '@dxos/util';
@@ -178,49 +176,40 @@ export const MarkdownEditor = ({
178
176
 
179
177
  const info = await onFileUpload(file);
180
178
  if (info) {
181
- processEditorPayload(editorView, { type: 'image', data: info.url });
179
+ addLink({ url: info.url, image: true })(editorView);
182
180
  }
183
181
  });
184
182
  }
185
- }, [acceptedFiles, editorView]);
183
+ }, [acceptedFiles, editorView, onFileUpload]);
186
184
 
187
- // Toolbar handler.
188
- const handleToolbarAction = useActionHandler(editorView);
189
- const handleAction = useCallback(
190
- (action: EditorAction) => {
191
- switch (action.properties.type) {
192
- case 'search': {
193
- if (editorView) {
194
- openSearchPanel(editorView);
195
- }
196
- return;
197
- }
198
- case 'view-mode': {
199
- onViewModeChange?.(id, action.properties.data);
200
- return;
201
- }
202
- case 'image': {
203
- open();
204
- return;
205
- }
206
- }
185
+ const getView = useCallback(() => {
186
+ invariant(editorView);
187
+ return editorView;
188
+ }, [editorView]);
207
189
 
208
- handleToolbarAction?.(action);
209
- },
210
- [editorView, onViewModeChange, open],
190
+ const handleViewModeChange = useCallback(
191
+ (mode: EditorViewMode) => onViewModeChange?.(id, mode),
192
+ [id, onViewModeChange],
211
193
  );
212
194
 
195
+ const handleImageUpload = useCallback(() => {
196
+ if (onFileUpload) {
197
+ open();
198
+ }
199
+ }, [onFileUpload]);
200
+
213
201
  return (
214
- <StackItem.Content toolbar={!!toolbar} classNames='is-full min-bs-0'>
202
+ <StackItem.Content toolbar={!!toolbar}>
215
203
  {toolbar && (
216
204
  <>
217
205
  <EditorToolbar
218
206
  attendableId={id}
219
207
  role={role}
220
208
  state={toolbarState}
209
+ getView={getView}
221
210
  comment={comment}
222
- customActions={onFileUpload ? createUploadAction : undefined}
223
- onAction={handleAction}
211
+ image={handleImageUpload}
212
+ viewMode={handleViewModeChange}
224
213
  />
225
214
  <input {...getInputProps()} />
226
215
  </>
@@ -248,13 +237,3 @@ const useTest = (view?: EditorView) => {
248
237
  }
249
238
  }, [view]);
250
239
  };
251
-
252
- export const createUploadAction = () => ({
253
- nodes: [
254
- createEditorAction({ type: 'image', testId: 'editor.toolbar.image' }, 'ph--image-square--regular', [
255
- 'upload image label',
256
- { ns: MARKDOWN_PLUGIN },
257
- ]),
258
- ],
259
- edges: [{ source: 'root', target: 'image' }],
260
- });
@@ -14,7 +14,7 @@ import { DocumentType } from '@dxos/plugin-markdown/types';
14
14
  import { faker } from '@dxos/random';
15
15
  import { makeRef } from '@dxos/react-client/echo';
16
16
  import { Icon, Popover } from '@dxos/react-ui';
17
- import { TextType } from '@dxos/schema';
17
+ import { DataType } from '@dxos/schema';
18
18
  import { withTheme, withLayout } from '@dxos/storybook-utils';
19
19
 
20
20
  import { MarkdownPreview } from './MarkdownPreview';
@@ -38,7 +38,13 @@ const meta: Meta<typeof MarkdownPreview> = {
38
38
  </Popover.Root>
39
39
  );
40
40
  },
41
- decorators: [withPluginManager({ plugins: [IntentPlugin()] }), withTheme, withLayout({ tooltips: true })],
41
+ decorators: [
42
+ withPluginManager({
43
+ plugins: [IntentPlugin()],
44
+ }),
45
+ withTheme,
46
+ withLayout(),
47
+ ],
42
48
  parameters: {
43
49
  layout: 'centered',
44
50
  translations,
@@ -51,7 +57,7 @@ const data = (() => {
51
57
  const document = create(DocumentType, {
52
58
  name: faker.lorem.words(3),
53
59
  content: makeRef(
54
- create(TextType, {
60
+ create(DataType.Text, {
55
61
  content: faker.lorem.paragraphs(3),
56
62
  }),
57
63
  ),
@@ -9,41 +9,41 @@ import { chain, createIntent, LayoutAction, useIntentDispatcher } from '@dxos/ap
9
9
  import { isInstanceOf } from '@dxos/echo-schema';
10
10
  import {
11
11
  type PreviewProps,
12
+ defaultCard,
13
+ kanbanCardWithoutPoster,
12
14
  popoverCard,
13
15
  previewTitle,
14
16
  previewProse,
15
17
  previewChrome,
16
- defaultCard,
17
- kanbanCardWithoutPoster,
18
18
  } from '@dxos/plugin-preview';
19
19
  import { fullyQualifiedId } from '@dxos/react-client/echo';
20
20
  import { Button, Icon, useTranslation } from '@dxos/react-ui';
21
21
  import { mx } from '@dxos/react-ui-theme';
22
- import { TextType } from '@dxos/schema';
22
+ import { DataType } from '@dxos/schema';
23
23
 
24
24
  import { MARKDOWN_PLUGIN } from '../../meta';
25
25
  import { DocumentType } from '../../types';
26
26
  import { getAbstract, getFallbackName } from '../../util';
27
27
 
28
28
  // TODO(burdon): Factor out.
29
- const getTitle = (subject: DocumentType | TextType, fallback: string) => {
29
+ const getTitle = (subject: DocumentType | DataType.Text, fallback: string) => {
30
30
  if (isInstanceOf(DocumentType, subject)) {
31
31
  return subject.name ?? subject.fallbackName ?? getFallbackName(subject.content?.target?.content ?? fallback);
32
- } else if (isInstanceOf(TextType, subject)) {
32
+ } else if (isInstanceOf(DataType.Text, subject)) {
33
33
  return getFallbackName(subject.content);
34
34
  }
35
35
  };
36
36
 
37
37
  // TODO(burdon): Factor out.
38
- const getSnippet = (subject: DocumentType | TextType, fallback: string) => {
38
+ const getSnippet = (subject: DocumentType | DataType.Text, fallback: string) => {
39
39
  if (isInstanceOf(DocumentType, subject)) {
40
40
  return getAbstract(subject.content?.target?.content ?? fallback);
41
- } else if (isInstanceOf(TextType, subject)) {
41
+ } else if (isInstanceOf(DataType.Text, subject)) {
42
42
  return getAbstract(subject.content);
43
43
  }
44
44
  };
45
45
 
46
- export const MarkdownPreview = ({ classNames, subject, role }: PreviewProps<DocumentType | TextType>) => {
46
+ export const MarkdownPreview = ({ classNames, subject, role }: PreviewProps<DocumentType | DataType.Text>) => {
47
47
  const { dispatchPromise: dispatch } = useIntentDispatcher();
48
48
  const { t } = useTranslation(MARKDOWN_PLUGIN);
49
49
  const snippet = getSnippet(subject, t('fallback abstract'));
@@ -5,6 +5,7 @@
5
5
  import '@dxos-theme';
6
6
 
7
7
  import { type Meta } from '@storybook/react';
8
+ import { Schema, SchemaAST } from 'effect';
8
9
  import React, { type FC, useEffect, useMemo, useState } from 'react';
9
10
 
10
11
  import {
@@ -19,7 +20,8 @@ import {
19
20
  } from '@dxos/app-framework';
20
21
  import { withPluginManager } from '@dxos/app-framework/testing';
21
22
  import { Message } from '@dxos/artifact';
22
- import { S, AST, create, type Expando, EchoObject } from '@dxos/echo-schema';
23
+ import { Type } from '@dxos/echo';
24
+ import { create, createQueueDxn, type Expando } from '@dxos/echo-schema';
23
25
  import { invariant } from '@dxos/invariant';
24
26
  import { DXN } from '@dxos/keys';
25
27
  import { live, makeRef, refFromDXN } from '@dxos/live-object';
@@ -29,7 +31,7 @@ import { SpacePlugin } from '@dxos/plugin-space';
29
31
  import { StorybookLayoutPlugin } from '@dxos/plugin-storybook-layout';
30
32
  import { ThemePlugin } from '@dxos/plugin-theme';
31
33
  import { faker } from '@dxos/random';
32
- import { createQueueDxn, useQueue, useSpace } from '@dxos/react-client/echo';
34
+ import { useQueue, useSpace } from '@dxos/react-client/echo';
33
35
  import { IconButton, Toolbar } from '@dxos/react-ui';
34
36
  import { command, useTextEditor } from '@dxos/react-ui-editor';
35
37
  import { StackItem } from '@dxos/react-ui-stack';
@@ -45,16 +47,21 @@ import { createDocument, DocumentType, type MarkdownSettingsProps } from '../typ
45
47
 
46
48
  faker.seed(1);
47
49
 
48
- const TestItem = S.Struct({
49
- title: S.String.annotations({
50
- [AST.TitleAnnotationId]: 'Title',
51
- [AST.DescriptionAnnotationId]: 'Product title',
50
+ const TestItem = Schema.Struct({
51
+ title: Schema.String.annotations({
52
+ [SchemaAST.TitleAnnotationId]: 'Title',
53
+ [SchemaAST.DescriptionAnnotationId]: 'Product title',
52
54
  }),
53
- description: S.String.annotations({
54
- [AST.TitleAnnotationId]: 'Description',
55
- [AST.DescriptionAnnotationId]: 'Product description',
55
+ description: Schema.String.annotations({
56
+ [SchemaAST.TitleAnnotationId]: 'Description',
57
+ [SchemaAST.DescriptionAnnotationId]: 'Product description',
56
58
  }),
57
- }).pipe(EchoObject({ typename: 'dxos.org/type/Test', version: '0.1.0' }));
59
+ }).pipe(
60
+ Type.def({
61
+ typename: 'dxos.org/type/Test',
62
+ version: '0.1.0',
63
+ }),
64
+ );
58
65
 
59
66
  const TestChat: FC<{ doc: DocumentType; content: string }> = ({ doc, content }) => {
60
67
  const { dispatchPromise: dispatch } = useIntentDispatcher();
@@ -87,8 +94,8 @@ const TestChat: FC<{ doc: DocumentType; content: string }> = ({ doc, content })
87
94
  };
88
95
 
89
96
  return (
90
- <StackItem.Content toolbar classNames='w-full'>
91
- <Toolbar.Root classNames='border-be border-separator'>
97
+ <StackItem.Content toolbar>
98
+ <Toolbar.Root>
92
99
  <IconButton icon='ph--plus--regular' disabled={!queue} label='Insert' onClick={handleInsert} />
93
100
  </Toolbar.Root>
94
101
  <div ref={parentRef} className='p-4' />
@@ -156,7 +163,7 @@ const meta: Meta<typeof DefaultStory> = {
156
163
  ],
157
164
  capabilities: [contributes(MarkdownCapabilities.Extensions, [() => command()])],
158
165
  }),
159
- withLayout({ tooltips: true, fullscreen: true, classNames: 'grid grid-cols-2' }),
166
+ withLayout({ fullscreen: true, classNames: 'grid grid-cols-2' }),
160
167
  ],
161
168
  parameters: {
162
169
  translations,
@@ -5,8 +5,9 @@
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
12
  import { live } from '@dxos/live-object';
12
13
  import { faker } from '@dxos/random';
@@ -14,7 +15,6 @@ import { createDocAccessor, createObject } from '@dxos/react-client/echo';
14
15
  import { useThemeContext } from '@dxos/react-ui';
15
16
  import {
16
17
  EditorToolbar,
17
- type EditorAction,
18
18
  type Comment,
19
19
  comments,
20
20
  createBasicExtensions,
@@ -25,20 +25,20 @@ import {
25
25
  editorContent,
26
26
  formattingKeymap,
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 { TextType } from '@dxos/schema';
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
39
  const DefaultStory: FC<{ content?: string }> = ({ content = '' }) => {
40
40
  const { themeMode } = useThemeContext();
41
- const [text] = useState(createObject(live(TextType, { content })));
41
+ const [text] = useState(createObject(live(DataType.Text, { content })));
42
42
  const toolbarState = useEditorToolbarState({ viewMode: 'preview' });
43
43
  const formattingObserver = useFormattingState(toolbarState);
44
44
  const { parentRef, view } = useTextEditor(() => {
@@ -64,21 +64,21 @@ const DefaultStory: FC<{ content?: string }> = ({ content = '' }) => {
64
64
  };
65
65
  }, [text, formattingObserver, toolbarState.viewMode, themeMode]);
66
66
 
67
- const handleToolbarAction = useActionHandler(view);
68
- const handleAction = (action: EditorAction) => {
69
- if (action.type === 'view-mode') {
70
- toolbarState.viewMode = action.properties.data;
71
- } else {
72
- handleToolbarAction?.(action);
73
- }
67
+ const handleViewModeChange = (viewMode: EditorViewMode) => {
68
+ toolbarState.viewMode = viewMode;
74
69
  };
75
70
 
71
+ const getView = useCallback(() => {
72
+ invariant(view);
73
+ return view;
74
+ }, [view]);
75
+
76
76
  const [_comments, setComments] = useState<Comment[]>([]);
77
77
  useComments(view, text.id, _comments);
78
78
 
79
79
  return (
80
80
  <div role='none' className='flex flex-col'>
81
- <EditorToolbar onAction={handleAction} state={toolbarState ?? {}} />
81
+ <EditorToolbar state={toolbarState ?? {}} getView={getView} viewMode={handleViewModeChange} />
82
82
  <div className='flex grow overflow-hidden' ref={parentRef} />
83
83
  </div>
84
84
  );
@@ -98,7 +98,7 @@ const meta: Meta<typeof EditorToolbar> = {
98
98
  title: 'plugins/plugin-markdown/Toolbar',
99
99
  component: EditorToolbar,
100
100
  render: DefaultStory as any,
101
- decorators: [withTheme, withLayout({ tooltips: true, fullscreen: true })],
101
+ decorators: [withTheme, withLayout({ fullscreen: true })],
102
102
  parameters: {
103
103
  translations,
104
104
  },
@@ -13,7 +13,7 @@ import {
13
13
  useIntentDispatcher,
14
14
  } from '@dxos/app-framework';
15
15
  import { invariant } from '@dxos/invariant';
16
- import { createDocAccessor, fullyQualifiedId, getSpace, type Query } from '@dxos/react-client/echo';
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
19
  import {
@@ -35,7 +35,7 @@ import {
35
35
  type RenderCallback,
36
36
  } from '@dxos/react-ui-editor';
37
37
  import { defaultTx } from '@dxos/react-ui-theme';
38
- import { type TextType } from '@dxos/schema';
38
+ import { type DataType } from '@dxos/schema';
39
39
  import { isNotFalsy } from '@dxos/util';
40
40
 
41
41
  import { MarkdownCapabilities } from './capabilities';
@@ -45,9 +45,9 @@ import { setFallbackName } from './util';
45
45
  type ExtensionsOptions = {
46
46
  document?: DocumentType;
47
47
  id?: string;
48
- text?: TextType;
48
+ text?: DataType.Text;
49
49
  dispatch?: PromiseIntentDispatcher;
50
- query?: Query<DocumentType>;
50
+ query?: QueryResult<DocumentType>;
51
51
  settings: MarkdownSettingsProps;
52
52
  viewMode?: EditorViewMode;
53
53
  editorStateStore?: EditorStateStore;
@@ -68,7 +68,7 @@ export const useExtensions = ({
68
68
 
69
69
  // TODO(wittjosiah): Autocomplete is not working and this query is causing performance issues.
70
70
  // TODO(burdon): Unsubscribe.
71
- // const query = space?.db.query(Filter.schema(DocumentType));
71
+ // const query = space?.db.query(Filter.type(DocumentType));
72
72
  // query?.subscribe();
73
73
  const baseExtensions = useMemo(
74
74
  () =>
@@ -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 (!S.is(LayoutAction.ScrollIntoView.fields.input)(data)) {
25
+ if (!Schema.is(LayoutAction.ScrollIntoView.fields.input)(data)) {
26
26
  return false;
27
27
  }
28
28
 
@@ -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
- [getSchemaTypename(DocumentType)!]: {
11
+ [DocumentType.typename]: {
14
12
  'typename label': 'Document',
15
13
  'object name placeholder': 'New document',
16
14
  },
@@ -2,28 +2,36 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { EchoObject, Expando, LabelAnnotationId, Ref, S } from '@dxos/echo-schema';
5
+ import { Schema } from 'effect';
6
+
7
+ import { Type } from '@dxos/echo';
8
+ import { Expando, LabelAnnotationId, Ref } from '@dxos/echo-schema';
6
9
  import { makeRef, live } from '@dxos/live-object';
7
10
  import { ThreadType } from '@dxos/plugin-space/types';
8
- import { TextType } from '@dxos/schema';
11
+ import { DataType } from '@dxos/schema';
9
12
 
10
- export const DocumentSchema = S.Struct({
11
- name: S.optional(S.String),
12
- fallbackName: S.optional(S.String),
13
- content: Ref(TextType),
14
- threads: S.mutable(S.Array(Ref(ThreadType))),
15
- assistantChatQueue: S.optional(Ref(Expando)),
13
+ export const DocumentSchema = Schema.Struct({
14
+ name: Schema.optional(Schema.String),
15
+ fallbackName: Schema.optional(Schema.String),
16
+ content: Ref(DataType.Text),
17
+ threads: Schema.mutable(Schema.Array(Ref(ThreadType))),
18
+ assistantChatQueue: Schema.optional(Ref(Expando)),
16
19
  }).annotations({
17
- // TODO(dmaretskyi): `S.Struct(...).pipe(defaultLabel(['name', 'fallbackName']))` for type-safe annotations.
20
+ // TODO(dmaretskyi): `Schema.Struct(...).pipe(defaultLabel(['name', 'fallbackName']))` for type-safe annotations.
18
21
  [LabelAnnotationId]: ['name', 'fallbackName'],
19
22
  });
20
23
 
21
- export const DocumentType = DocumentSchema.pipe(EchoObject({ typename: 'dxos.org/type/Document', version: '0.1.0' }));
22
- export type DocumentType = S.Schema.Type<typeof DocumentType>;
24
+ export const DocumentType = DocumentSchema.pipe(
25
+ Type.def({
26
+ typename: 'dxos.org/type/Document',
27
+ version: '0.1.0',
28
+ }),
29
+ );
30
+ export type DocumentType = Schema.Schema.Type<typeof DocumentType>;
23
31
 
24
32
  // TODO(burdon): Replace when defaults are supported.
25
33
  export const createDocument = ({ name, content }: { name: string; content: string }) =>
26
- live(DocumentType, { name, content: makeRef(live(TextType, { content })), threads: [] });
34
+ live(DocumentType, { name, content: makeRef(live(DataType.Text, { content })), threads: [] });
27
35
 
28
36
  /**
29
37
  * Checks if an object conforms to the interface needed to render an editor.