@dxos/plugin-markdown 0.8.4-main.67995b8 → 0.8.4-main.dedc0f3

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