@dxos/plugin-markdown 0.8.3 → 0.8.4-main.5acf9ea

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 (219) hide show
  1. package/dist/lib/browser/{MarkdownContainer-EFWQ6DHD.mjs → MarkdownContainer-NNBPE6A5.mjs} +37 -28
  2. package/dist/lib/browser/MarkdownContainer-NNBPE6A5.mjs.map +7 -0
  3. package/dist/lib/browser/{MarkdownPreview-F4PYFW5L.mjs → MarkdownPreview-7VG3K24R.mjs} +13 -13
  4. package/dist/lib/browser/MarkdownPreview-7VG3K24R.mjs.map +7 -0
  5. package/dist/lib/browser/{anchor-sort-BMAN2ABT.mjs → anchor-sort-Z7JQA7RL.mjs} +6 -6
  6. package/dist/lib/browser/anchor-sort-Z7JQA7RL.mjs.map +7 -0
  7. package/dist/lib/browser/{app-graph-serializer-EI6TEHRQ.mjs → app-graph-serializer-ZT5OVF5G.mjs} +13 -13
  8. package/dist/lib/browser/app-graph-serializer-ZT5OVF5G.mjs.map +7 -0
  9. package/dist/lib/browser/{artifact-definition-FQ2R6KPT.mjs → artifact-definition-7VNP5PCP.mjs} +15 -15
  10. package/dist/lib/browser/artifact-definition-7VNP5PCP.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-CD4E4K7J.mjs +16 -0
  12. package/dist/lib/browser/chunk-CD4E4K7J.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-D767LUGU.mjs → chunk-K7ZFMSC4.mjs} +13 -12
  14. package/dist/lib/browser/chunk-K7ZFMSC4.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-VCUKIILA.mjs +20 -0
  16. package/dist/lib/browser/{chunk-LXSRQPEP.mjs → chunk-VMX5SDGW.mjs} +9 -10
  17. package/dist/lib/browser/chunk-VMX5SDGW.mjs.map +7 -0
  18. package/dist/lib/browser/chunk-YHMGUSO7.mjs +80 -0
  19. package/dist/lib/browser/chunk-YHMGUSO7.mjs.map +7 -0
  20. package/dist/lib/browser/chunk-ZGY3DYC2.mjs +30 -0
  21. package/dist/lib/browser/chunk-ZGY3DYC2.mjs.map +7 -0
  22. package/dist/lib/browser/index.mjs +21 -19
  23. package/dist/lib/browser/index.mjs.map +3 -3
  24. package/dist/lib/browser/{intent-resolver-6ZOABX2J.mjs → intent-resolver-EBEF7WEI.mjs} +15 -19
  25. package/dist/lib/browser/intent-resolver-EBEF7WEI.mjs.map +7 -0
  26. package/dist/lib/browser/meta.json +1 -1
  27. package/dist/lib/browser/{react-surface-4B5ELMEW.mjs → react-surface-ZPMZT4VU.mjs} +31 -28
  28. package/dist/lib/browser/react-surface-ZPMZT4VU.mjs.map +7 -0
  29. package/dist/lib/browser/{settings-PLH54VC7.mjs → settings-MBDK4TWE.mjs} +6 -6
  30. package/dist/lib/browser/settings-MBDK4TWE.mjs.map +7 -0
  31. package/dist/lib/browser/{state-KI6PJ6DT.mjs → state-ZA6PZPUI.mjs} +8 -8
  32. package/dist/lib/browser/state-ZA6PZPUI.mjs.map +7 -0
  33. package/dist/lib/browser/types/index.mjs +6 -14
  34. package/dist/lib/node-esm/{MarkdownContainer-O3SGMH4G.mjs → MarkdownContainer-Q6UO7DKT.mjs} +37 -28
  35. package/dist/lib/node-esm/MarkdownContainer-Q6UO7DKT.mjs.map +7 -0
  36. package/dist/lib/node-esm/{MarkdownPreview-KFDRV4GC.mjs → MarkdownPreview-UVWR2YK3.mjs} +13 -13
  37. package/dist/lib/node-esm/MarkdownPreview-UVWR2YK3.mjs.map +7 -0
  38. package/dist/lib/node-esm/{anchor-sort-BXL7BE67.mjs → anchor-sort-R6AAKYNG.mjs} +6 -6
  39. package/dist/lib/node-esm/anchor-sort-R6AAKYNG.mjs.map +7 -0
  40. package/dist/lib/node-esm/{app-graph-serializer-F7DGNF3G.mjs → app-graph-serializer-X4M5QEI6.mjs} +13 -13
  41. package/dist/lib/node-esm/app-graph-serializer-X4M5QEI6.mjs.map +7 -0
  42. package/dist/lib/node-esm/{artifact-definition-NQOHB6S5.mjs → artifact-definition-IRIILD7S.mjs} +15 -15
  43. package/dist/lib/node-esm/artifact-definition-IRIILD7S.mjs.map +7 -0
  44. package/dist/lib/node-esm/chunk-6GCOJS4Y.mjs +81 -0
  45. package/dist/lib/node-esm/chunk-6GCOJS4Y.mjs.map +7 -0
  46. package/dist/lib/node-esm/chunk-A7LLVI34.mjs +22 -0
  47. package/dist/lib/node-esm/chunk-B3J2M4YL.mjs +17 -0
  48. package/dist/lib/node-esm/chunk-B3J2M4YL.mjs.map +7 -0
  49. package/dist/lib/node-esm/{chunk-K26TX5V4.mjs → chunk-LZK3TLKM.mjs} +9 -10
  50. package/dist/lib/node-esm/chunk-LZK3TLKM.mjs.map +7 -0
  51. package/dist/lib/node-esm/chunk-RCIXKCVG.mjs +31 -0
  52. package/dist/lib/node-esm/chunk-RCIXKCVG.mjs.map +7 -0
  53. package/dist/lib/node-esm/{chunk-BWDDFDJY.mjs → chunk-YGNVDYMB.mjs} +13 -12
  54. package/dist/lib/node-esm/chunk-YGNVDYMB.mjs.map +7 -0
  55. package/dist/lib/node-esm/index.mjs +21 -19
  56. package/dist/lib/node-esm/index.mjs.map +3 -3
  57. package/dist/lib/node-esm/{intent-resolver-CLMSVF2K.mjs → intent-resolver-L2UGZ72W.mjs} +15 -19
  58. package/dist/lib/node-esm/intent-resolver-L2UGZ72W.mjs.map +7 -0
  59. package/dist/lib/node-esm/meta.json +1 -1
  60. package/dist/lib/node-esm/{react-surface-YHFOQTVO.mjs → react-surface-3JJSTTQP.mjs} +31 -28
  61. package/dist/lib/node-esm/react-surface-3JJSTTQP.mjs.map +7 -0
  62. package/dist/lib/node-esm/{settings-SIY33P3F.mjs → settings-LBDWWPZJ.mjs} +6 -6
  63. package/dist/lib/node-esm/settings-LBDWWPZJ.mjs.map +7 -0
  64. package/dist/lib/node-esm/{state-LLGVRYKL.mjs → state-UIHO2SFZ.mjs} +8 -8
  65. package/dist/lib/node-esm/state-UIHO2SFZ.mjs.map +7 -0
  66. package/dist/lib/node-esm/types/index.mjs +6 -14
  67. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -1
  68. package/dist/types/src/capabilities/artifact-definition.d.ts +1 -1
  69. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  70. package/dist/types/src/capabilities/index.d.ts +1 -1
  71. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  72. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  73. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  74. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  75. package/dist/types/src/components/MarkdownContainer.d.ts +5 -5
  76. package/dist/types/src/components/MarkdownContainer.d.ts.map +1 -1
  77. package/dist/types/src/components/MarkdownContainer.stories.d.ts +1 -1
  78. package/dist/types/src/components/MarkdownContainer.stories.d.ts.map +1 -1
  79. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +1 -1
  80. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
  81. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts +1 -1
  82. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts.map +1 -1
  83. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.d.ts +2 -2
  84. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.d.ts.map +1 -1
  85. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts +5 -12
  86. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts.map +1 -1
  87. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts +2 -2
  88. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts.map +1 -1
  89. package/dist/types/src/components/Suggestions.stories.d.ts +3 -3
  90. package/dist/types/src/components/Suggestions.stories.d.ts.map +1 -1
  91. package/dist/types/src/components/Toolbar.stories.d.ts +1 -1
  92. package/dist/types/src/components/Toolbar.stories.d.ts.map +1 -1
  93. package/dist/types/src/components/index.d.ts +1 -1
  94. package/dist/types/src/components/index.d.ts.map +1 -1
  95. package/dist/types/src/events.d.ts.map +1 -1
  96. package/dist/types/src/extensions.d.ts +4 -4
  97. package/dist/types/src/extensions.d.ts.map +1 -1
  98. package/dist/types/src/index.d.ts.map +1 -1
  99. package/dist/types/src/meta.d.ts +1 -1
  100. package/dist/types/src/meta.d.ts.map +1 -1
  101. package/dist/types/src/translations.d.ts +35 -80
  102. package/dist/types/src/translations.d.ts.map +1 -1
  103. package/dist/types/src/types/Markdown.d.ts +43 -0
  104. package/dist/types/src/types/Markdown.d.ts.map +1 -0
  105. package/dist/types/src/types/MarkdownAction.d.ts +42 -0
  106. package/dist/types/src/types/MarkdownAction.d.ts.map +1 -0
  107. package/dist/types/src/types/index.d.ts +2 -1
  108. package/dist/types/src/types/index.d.ts.map +1 -1
  109. package/dist/types/src/types/types.d.ts +4 -59
  110. package/dist/types/src/types/types.d.ts.map +1 -1
  111. package/dist/types/src/util.d.ts +12 -3
  112. package/dist/types/src/util.d.ts.map +1 -1
  113. package/dist/types/tsconfig.tsbuildinfo +1 -1
  114. package/package.json +47 -47
  115. package/src/MarkdownPlugin.tsx +7 -7
  116. package/src/capabilities/anchor-sort.ts +3 -3
  117. package/src/capabilities/app-graph-serializer.ts +8 -6
  118. package/src/capabilities/artifact-definition.ts +8 -8
  119. package/src/capabilities/capabilities.ts +4 -3
  120. package/src/capabilities/intent-resolver.ts +5 -11
  121. package/src/capabilities/react-surface.tsx +18 -17
  122. package/src/capabilities/settings.ts +3 -3
  123. package/src/capabilities/state.ts +6 -7
  124. package/src/components/MarkdownContainer.stories.tsx +7 -10
  125. package/src/components/MarkdownContainer.tsx +26 -13
  126. package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +2 -2
  127. package/src/components/MarkdownEditor/MarkdownEditor.tsx +3 -3
  128. package/src/components/MarkdownPreview/MarkdownPreview.stories.tsx +35 -32
  129. package/src/components/MarkdownPreview/MarkdownPreview.tsx +18 -16
  130. package/src/components/MarkdownSettings/MarkdownSettings.tsx +4 -4
  131. package/src/components/Suggestions.stories.tsx +22 -17
  132. package/src/components/Toolbar.stories.tsx +2 -3
  133. package/src/events.ts +2 -2
  134. package/src/extensions.tsx +22 -18
  135. package/src/hooks/useSelectCurrentThread.tsx +2 -2
  136. package/src/index.ts +1 -0
  137. package/src/meta.ts +10 -8
  138. package/src/translations.ts +9 -7
  139. package/src/types/Markdown.ts +55 -0
  140. package/src/types/MarkdownAction.ts +30 -0
  141. package/src/types/index.ts +2 -1
  142. package/src/types/types.ts +6 -51
  143. package/src/util.tsx +20 -6
  144. package/dist/lib/browser/MarkdownContainer-EFWQ6DHD.mjs.map +0 -7
  145. package/dist/lib/browser/MarkdownPreview-F4PYFW5L.mjs.map +0 -7
  146. package/dist/lib/browser/anchor-sort-BMAN2ABT.mjs.map +0 -7
  147. package/dist/lib/browser/app-graph-serializer-EI6TEHRQ.mjs.map +0 -7
  148. package/dist/lib/browser/artifact-definition-FQ2R6KPT.mjs.map +0 -7
  149. package/dist/lib/browser/chunk-354IBM5X.mjs +0 -20
  150. package/dist/lib/browser/chunk-D767LUGU.mjs.map +0 -7
  151. package/dist/lib/browser/chunk-JX6XNEHE.mjs +0 -22
  152. package/dist/lib/browser/chunk-JX6XNEHE.mjs.map +0 -7
  153. package/dist/lib/browser/chunk-LXSRQPEP.mjs.map +0 -7
  154. package/dist/lib/browser/chunk-N2D26K6W.mjs +0 -79
  155. package/dist/lib/browser/chunk-N2D26K6W.mjs.map +0 -7
  156. package/dist/lib/browser/chunk-QVJETNGS.mjs +0 -16
  157. package/dist/lib/browser/chunk-QVJETNGS.mjs.map +0 -7
  158. package/dist/lib/browser/intent-resolver-6ZOABX2J.mjs.map +0 -7
  159. package/dist/lib/browser/react-surface-4B5ELMEW.mjs.map +0 -7
  160. package/dist/lib/browser/settings-PLH54VC7.mjs.map +0 -7
  161. package/dist/lib/browser/state-KI6PJ6DT.mjs.map +0 -7
  162. package/dist/lib/node/MarkdownContainer-KYGUEZIL.cjs +0 -783
  163. package/dist/lib/node/MarkdownContainer-KYGUEZIL.cjs.map +0 -7
  164. package/dist/lib/node/MarkdownPreview-GCJJCXY6.cjs +0 -103
  165. package/dist/lib/node/MarkdownPreview-GCJJCXY6.cjs.map +0 -7
  166. package/dist/lib/node/anchor-sort-V3T4SFFI.cjs +0 -48
  167. package/dist/lib/node/anchor-sort-V3T4SFFI.cjs.map +0 -7
  168. package/dist/lib/node/app-graph-serializer-E6BXEDEL.cjs +0 -65
  169. package/dist/lib/node/app-graph-serializer-E6BXEDEL.cjs.map +0 -7
  170. package/dist/lib/node/artifact-definition-U27MH5SC.cjs +0 -158
  171. package/dist/lib/node/artifact-definition-U27MH5SC.cjs.map +0 -7
  172. package/dist/lib/node/chunk-3HHV4MM6.cjs +0 -101
  173. package/dist/lib/node/chunk-3HHV4MM6.cjs.map +0 -7
  174. package/dist/lib/node/chunk-CJLYFGPI.cjs +0 -74
  175. package/dist/lib/node/chunk-CJLYFGPI.cjs.map +0 -7
  176. package/dist/lib/node/chunk-FU3XZZCO.cjs +0 -58
  177. package/dist/lib/node/chunk-FU3XZZCO.cjs.map +0 -7
  178. package/dist/lib/node/chunk-IFYSBQE5.cjs +0 -35
  179. package/dist/lib/node/chunk-IFYSBQE5.cjs.map +0 -7
  180. package/dist/lib/node/chunk-LQAC5HL7.cjs +0 -68
  181. package/dist/lib/node/chunk-LQAC5HL7.cjs.map +0 -7
  182. package/dist/lib/node/chunk-ZU5OIHCY.cjs +0 -45
  183. package/dist/lib/node/chunk-ZU5OIHCY.cjs.map +0 -7
  184. package/dist/lib/node/index.cjs +0 -165
  185. package/dist/lib/node/index.cjs.map +0 -7
  186. package/dist/lib/node/intent-resolver-OEFLRNEJ.cjs +0 -77
  187. package/dist/lib/node/intent-resolver-OEFLRNEJ.cjs.map +0 -7
  188. package/dist/lib/node/meta.json +0 -1
  189. package/dist/lib/node/react-surface-456HQ4KZ.cjs +0 -218
  190. package/dist/lib/node/react-surface-456HQ4KZ.cjs.map +0 -7
  191. package/dist/lib/node/settings-E3NUTXJ4.cjs +0 -42
  192. package/dist/lib/node/settings-E3NUTXJ4.cjs.map +0 -7
  193. package/dist/lib/node/state-KKDRAG7X.cjs +0 -51
  194. package/dist/lib/node/state-KKDRAG7X.cjs.map +0 -7
  195. package/dist/lib/node/types/index.cjs +0 -40
  196. package/dist/lib/node/types/index.cjs.map +0 -7
  197. package/dist/lib/node-esm/MarkdownContainer-O3SGMH4G.mjs.map +0 -7
  198. package/dist/lib/node-esm/MarkdownPreview-KFDRV4GC.mjs.map +0 -7
  199. package/dist/lib/node-esm/anchor-sort-BXL7BE67.mjs.map +0 -7
  200. package/dist/lib/node-esm/app-graph-serializer-F7DGNF3G.mjs.map +0 -7
  201. package/dist/lib/node-esm/artifact-definition-NQOHB6S5.mjs.map +0 -7
  202. package/dist/lib/node-esm/chunk-BWDDFDJY.mjs.map +0 -7
  203. package/dist/lib/node-esm/chunk-JXXDCSMW.mjs +0 -17
  204. package/dist/lib/node-esm/chunk-JXXDCSMW.mjs.map +0 -7
  205. package/dist/lib/node-esm/chunk-K26TX5V4.mjs.map +0 -7
  206. package/dist/lib/node-esm/chunk-RX63ZNML.mjs +0 -24
  207. package/dist/lib/node-esm/chunk-RX63ZNML.mjs.map +0 -7
  208. package/dist/lib/node-esm/chunk-T2Y2BT53.mjs +0 -80
  209. package/dist/lib/node-esm/chunk-T2Y2BT53.mjs.map +0 -7
  210. package/dist/lib/node-esm/chunk-YOABAQ7A.mjs +0 -22
  211. package/dist/lib/node-esm/intent-resolver-CLMSVF2K.mjs.map +0 -7
  212. package/dist/lib/node-esm/react-surface-YHFOQTVO.mjs.map +0 -7
  213. package/dist/lib/node-esm/settings-SIY33P3F.mjs.map +0 -7
  214. package/dist/lib/node-esm/state-LLGVRYKL.mjs.map +0 -7
  215. package/dist/types/src/types/schema.d.ts +0 -35
  216. package/dist/types/src/types/schema.d.ts.map +0 -1
  217. package/src/types/schema.ts +0 -39
  218. /package/dist/lib/browser/{chunk-354IBM5X.mjs.map → chunk-VCUKIILA.mjs.map} +0 -0
  219. /package/dist/lib/node-esm/{chunk-YOABAQ7A.mjs.map → chunk-A7LLVI34.mjs.map} +0 -0
@@ -4,7 +4,7 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
- import { type Meta } from '@storybook/react';
7
+ import { type Meta } from '@storybook/react-vite';
8
8
  import React, { useMemo } from 'react';
9
9
 
10
10
  import { IntentPlugin } from '@dxos/app-framework';
@@ -15,7 +15,7 @@ import { automerge, translations as editorTranslations } from '@dxos/react-ui-ed
15
15
  import { withLayout, withTheme } from '@dxos/storybook-utils';
16
16
 
17
17
  import { MarkdownEditor, type MarkdownEditorProps } from './MarkdownEditor';
18
- import translations from '../../translations';
18
+ import { translations } from '../../translations';
19
19
 
20
20
  const content = Array.from({ length: 100 }, (_, i) => `Line ${i + 1}`).join('\n');
21
21
 
@@ -44,16 +44,16 @@ import { StackItem } from '@dxos/react-ui-stack';
44
44
  import { isNotFalsy, isNonNullable } from '@dxos/util';
45
45
 
46
46
  import { useSelectCurrentThread } from '../../hooks';
47
- import { MARKDOWN_PLUGIN } from '../../meta';
47
+ import { meta } from '../../meta';
48
48
  import { type MarkdownPluginState } from '../../types';
49
49
 
50
50
  export type MarkdownEditorProps = {
51
51
  id: string;
52
52
  role?: string;
53
+ toolbar?: boolean;
53
54
  inputMode?: EditorInputMode;
54
55
  scrollPastEnd?: boolean;
55
56
  slashCommandGroups?: CommandMenuGroup[];
56
- toolbar?: boolean;
57
57
  customActions?: EditorToolbarActionGraphProps['customActions'];
58
58
  // TODO(wittjosiah): Generalize custom toolbar actions (e.g. comment, upload, etc.)
59
59
  viewMode?: EditorViewMode;
@@ -147,7 +147,7 @@ const MarkdownEditorImpl = forwardRef<EditorView | undefined, MarkdownEditorProp
147
147
  },
148
148
  forwardedRef,
149
149
  ) => {
150
- const { t } = useTranslation(MARKDOWN_PLUGIN);
150
+ const { t } = useTranslation(meta.id);
151
151
  const { themeMode } = useThemeContext();
152
152
  const toolbarState = useEditorToolbarState({ viewMode });
153
153
  const formattingObserver = useFormattingState(toolbarState);
@@ -4,39 +4,29 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
- import { type Meta } from '@storybook/react';
7
+ import { type StoryObj, type Meta } from '@storybook/react-vite';
8
8
  import React from 'react';
9
9
 
10
10
  import { IntentPlugin } from '@dxos/app-framework';
11
11
  import { withPluginManager } from '@dxos/app-framework/testing';
12
- import { Obj, Ref } from '@dxos/echo';
13
- import { DocumentType } from '@dxos/plugin-markdown/types';
12
+ import { Markdown } from '@dxos/plugin-markdown/types';
14
13
  import { faker } from '@dxos/random';
15
- import { Icon, Popover } from '@dxos/react-ui';
16
- import { DataType } from '@dxos/schema';
14
+ import { CardContainer } from '@dxos/react-ui-stack/testing';
17
15
  import { withTheme, withLayout } from '@dxos/storybook-utils';
18
16
 
19
17
  import { MarkdownPreview } from './MarkdownPreview';
20
- import translations from '../../translations';
18
+ import { translations } from '../../translations';
21
19
 
22
20
  faker.seed(1234);
23
21
 
24
22
  const meta: Meta<typeof MarkdownPreview> = {
25
- title: 'plugins/plugin-markdown/MarkdownPreview',
23
+ title: 'Cards/plugin-markdown',
26
24
  component: MarkdownPreview,
27
- render: ({ subject }) => {
25
+ render: ({ role, subject, ...args }) => {
28
26
  return (
29
- <Popover.Root open>
30
- <Popover.Content>
31
- <Popover.Viewport>
32
- <MarkdownPreview subject={subject} role='popover' />
33
- </Popover.Viewport>
34
- <Popover.Arrow />
35
- </Popover.Content>
36
- <Popover.Trigger>
37
- <Icon icon='ph--text-aa--regular' size={5} />
38
- </Popover.Trigger>
39
- </Popover.Root>
27
+ <CardContainer icon='ph--text-aa--regular' role={role}>
28
+ <MarkdownPreview role={role} subject={subject} {...args} />
29
+ </CardContainer>
40
30
  );
41
31
  },
42
32
  decorators: [
@@ -54,21 +44,34 @@ const meta: Meta<typeof MarkdownPreview> = {
54
44
 
55
45
  export default meta;
56
46
 
57
- const data = (() => {
58
- const document = Obj.make(DocumentType, {
59
- name: faker.lorem.words(3),
60
- content: Ref.make(
61
- Obj.make(DataType.Text, {
62
- content: faker.lorem.paragraphs(3),
63
- }),
64
- ),
65
- });
47
+ type Story = StoryObj<typeof meta>;
66
48
 
67
- return { document };
68
- })();
49
+ export const Popover: Story = {
50
+ args: {
51
+ role: 'card--popover',
52
+ subject: Markdown.makeDocument({
53
+ name: faker.lorem.words(3),
54
+ content: faker.lorem.paragraphs(3),
55
+ }),
56
+ },
57
+ };
58
+
59
+ export const Extrinsic: Story = {
60
+ args: {
61
+ role: 'card--extrinsic',
62
+ subject: Markdown.makeDocument({
63
+ name: faker.lorem.words(3),
64
+ content: faker.lorem.paragraphs(3),
65
+ }),
66
+ },
67
+ };
69
68
 
70
- export const Default = {
69
+ export const Intrinsic: Story = {
71
70
  args: {
72
- subject: Obj.make(DocumentType, data.document),
71
+ role: 'card--intrinsic',
72
+ subject: Markdown.makeDocument({
73
+ name: faker.lorem.words(3),
74
+ content: faker.lorem.paragraphs(3),
75
+ }),
73
76
  },
74
77
  };
@@ -13,13 +13,13 @@ import { Button, Icon, useTranslation } from '@dxos/react-ui';
13
13
  import { Card } from '@dxos/react-ui-stack';
14
14
  import { DataType } from '@dxos/schema';
15
15
 
16
- import { MARKDOWN_PLUGIN } from '../../meta';
17
- import { DocumentType } from '../../types';
16
+ import { meta } from '../../meta';
17
+ import { Markdown } from '../../types';
18
18
  import { getAbstract, getFallbackName } from '../../util';
19
19
 
20
20
  // TODO(burdon): Factor out.
21
- const getTitle = (subject: DocumentType | DataType.Text, fallback: string) => {
22
- if (Obj.instanceOf(DocumentType, subject)) {
21
+ const getTitle = (subject: Markdown.Document | DataType.Text, fallback: string) => {
22
+ if (Obj.instanceOf(Markdown.Document, subject)) {
23
23
  return subject.name ?? subject.fallbackName ?? getFallbackName(subject.content?.target?.content ?? fallback);
24
24
  } else if (Obj.instanceOf(DataType.Text, subject)) {
25
25
  return getFallbackName(subject.content);
@@ -27,17 +27,17 @@ const getTitle = (subject: DocumentType | DataType.Text, fallback: string) => {
27
27
  };
28
28
 
29
29
  // TODO(burdon): Factor out.
30
- const getSnippet = (subject: DocumentType | DataType.Text, fallback: string) => {
31
- if (Obj.instanceOf(DocumentType, subject)) {
30
+ const getSnippet = (subject: Markdown.Document | DataType.Text, fallback: string) => {
31
+ if (Obj.instanceOf(Markdown.Document, subject)) {
32
32
  return getAbstract(subject.content?.target?.content ?? fallback);
33
33
  } else if (Obj.instanceOf(DataType.Text, subject)) {
34
34
  return getAbstract(subject.content);
35
35
  }
36
36
  };
37
37
 
38
- export const MarkdownPreview = ({ subject, role }: PreviewProps<DocumentType | DataType.Text>) => {
38
+ export const MarkdownPreview = ({ subject, role }: PreviewProps<Markdown.Document | DataType.Text>) => {
39
39
  const { dispatchPromise: dispatch } = useIntentDispatcher();
40
- const { t } = useTranslation(MARKDOWN_PLUGIN);
40
+ const { t } = useTranslation(meta.id);
41
41
  const snippet = getSnippet(subject, t('fallback abstract'));
42
42
 
43
43
  // TODO(wittjosiah): Factor out so this component isn't dependent on the app framework.
@@ -57,15 +57,17 @@ export const MarkdownPreview = ({ subject, role }: PreviewProps<DocumentType | D
57
57
  );
58
58
 
59
59
  return (
60
- <Card.Container role={role}>
60
+ <Card.SurfaceRoot role={role}>
61
61
  <Card.Heading>{getTitle(subject, t('fallback title'))}</Card.Heading>
62
62
  {snippet && <Card.Text classNames='line-clamp-3 break-words col-span-2'>{snippet}</Card.Text>}
63
- <Card.Chrome>
64
- <Button onClick={handleNavigate}>
65
- <span className='grow'>{t('navigate to document label')}</span>
66
- <Icon icon='ph--arrow-right--regular' />
67
- </Button>
68
- </Card.Chrome>
69
- </Card.Container>
63
+ {role === 'card--popover' && (
64
+ <Card.Chrome>
65
+ <Button onClick={handleNavigate}>
66
+ <span className='grow'>{t('navigate to document label')}</span>
67
+ <Icon icon='ph--arrow-right--regular' />
68
+ </Button>
69
+ </Card.Chrome>
70
+ )}
71
+ </Card.SurfaceRoot>
70
72
  );
71
73
  };
@@ -8,11 +8,11 @@ import { Input, Select, useTranslation } from '@dxos/react-ui';
8
8
  import { type EditorInputMode, EditorInputModes, type EditorViewMode, EditorViewModes } from '@dxos/react-ui-editor';
9
9
  import { DeprecatedFormContainer, DeprecatedFormInput } from '@dxos/react-ui-form';
10
10
 
11
- import { MARKDOWN_PLUGIN } from '../../meta';
12
- import { type MarkdownSettingsProps } from '../../types';
11
+ import { meta } from '../../meta';
12
+ import { type Markdown } from '../../types';
13
13
 
14
- export const MarkdownSettings = ({ settings }: { settings: MarkdownSettingsProps }) => {
15
- const { t } = useTranslation(MARKDOWN_PLUGIN);
14
+ export const MarkdownSettings = ({ settings }: { settings: Markdown.Settings }) => {
15
+ const { t } = useTranslation(meta.id);
16
16
 
17
17
  // TODO(wittjosiah): Add skill test confirmation for entering vim mode.
18
18
  return (
@@ -4,11 +4,10 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
- import { type Meta } from '@storybook/react';
7
+ import { type Meta } from '@storybook/react-vite';
8
8
  import { Match, Option, pipe, Schema } from 'effect';
9
9
  import React, { type FC, useEffect, useMemo, useState } from 'react';
10
10
 
11
- import { Message } from '@dxos/ai';
12
11
  import {
13
12
  Capabilities,
14
13
  CollaborationActions,
@@ -34,14 +33,15 @@ import { IconButton, Toolbar } from '@dxos/react-ui';
34
33
  import { command, type EditorSelection, type Range, useTextEditor } from '@dxos/react-ui-editor';
35
34
  import { StackItem } from '@dxos/react-ui-stack';
36
35
  import { defaultTx } from '@dxos/react-ui-theme';
36
+ import { DataType } from '@dxos/schema';
37
37
  import { withLayout } from '@dxos/storybook-utils';
38
38
 
39
- import MarkdownContainer from './MarkdownContainer';
39
+ import { MarkdownContainer } from './MarkdownContainer';
40
40
  import { MarkdownPlugin } from '../MarkdownPlugin';
41
41
  import { MarkdownCapabilities } from '../capabilities';
42
- import { MARKDOWN_PLUGIN } from '../meta';
43
- import translations from '../translations';
44
- import { createDocument, DocumentType, type MarkdownSettingsProps } from '../types';
42
+ import { meta } from '../meta';
43
+ import { translations } from '../translations';
44
+ import { Markdown } from '../types';
45
45
 
46
46
  faker.seed(1);
47
47
 
@@ -61,19 +61,25 @@ const TestItem = Schema.Struct({
61
61
  }),
62
62
  );
63
63
 
64
- const TestChat: FC<{ doc: DocumentType; content: string }> = ({ doc, content }) => {
64
+ const TestChat: FC<{ doc: Markdown.Document; content: string }> = ({ doc, content }) => {
65
65
  const { dispatchPromise: dispatch } = useIntentDispatcher();
66
66
  const { parentRef } = useTextEditor({ initialValue: content });
67
67
  const { editorState } = useCapability(MarkdownCapabilities.State);
68
68
 
69
69
  const space = useSpace();
70
70
  const queueDxn = useMemo(() => space && space.queues.create().dxn, [space]);
71
- const queue = useQueue<Message>(queueDxn);
71
+ const queue = useQueue<DataType.Message>(queueDxn);
72
72
 
73
73
  const handleInsert = async () => {
74
74
  invariant(space);
75
75
  invariant(queue);
76
- await queue.append([Obj.make(Message, { role: 'assistant', content: [{ type: 'text', text: 'Hello' }] })]);
76
+ await queue.append([
77
+ Obj.make(DataType.Message, {
78
+ created: new Date().toISOString(),
79
+ sender: { role: 'assistant' },
80
+ blocks: [{ _tag: 'text', text: 'Hello' }],
81
+ }),
82
+ ]);
77
83
  const message = queue.objects.at(-1);
78
84
  invariant(message);
79
85
 
@@ -114,8 +120,8 @@ const TestChat: FC<{ doc: DocumentType; content: string }> = ({ doc, content })
114
120
 
115
121
  const DefaultStory = ({ document, chat }: { document: string; chat: string }) => {
116
122
  const space = useSpace();
117
- const [doc, setDoc] = useState<DocumentType>();
118
- const settings = useCapability(Capabilities.SettingsStore).getStore<MarkdownSettingsProps>(MARKDOWN_PLUGIN)!.value;
123
+ const [doc, setDoc] = useState<Markdown.Document>();
124
+ const settings = useCapability(Capabilities.SettingsStore).getStore<Markdown.Settings>(meta.id)!.value;
119
125
  const { editorState } = useCapability(MarkdownCapabilities.State);
120
126
 
121
127
  useEffect(() => {
@@ -124,10 +130,8 @@ const DefaultStory = ({ document, chat }: { document: string; chat: string }) =>
124
130
  }
125
131
 
126
132
  const doc = space.db.add(
127
- createDocument({
133
+ Markdown.makeDocument({
128
134
  name: 'Test',
129
-
130
- // Create links.
131
135
  content: document.replaceAll(/\[(\w+)\]/g, (_, label) => {
132
136
  const obj = space.db.add(Obj.make(TestItem, { title: label, description: faker.lorem.paragraph() }));
133
137
  const dxn = Ref.make(obj).dxn.toString();
@@ -151,7 +155,8 @@ const DefaultStory = ({ document, chat }: { document: string; chat: string }) =>
151
155
  );
152
156
  };
153
157
 
154
- const meta: Meta<typeof DefaultStory> = {
158
+ // TODO(burdon): Make consistent.
159
+ const storybook: Meta<typeof DefaultStory> = {
155
160
  title: 'plugins/plugin-markdown/Suggestions',
156
161
  render: DefaultStory,
157
162
  decorators: [
@@ -160,7 +165,7 @@ const meta: Meta<typeof DefaultStory> = {
160
165
  ThemePlugin({ tx: defaultTx }),
161
166
  StorybookLayoutPlugin(),
162
167
  ClientPlugin({
163
- types: [DocumentType, TestItem],
168
+ types: [Markdown.Document, TestItem],
164
169
  onClientInitialized: async (_, client) => {
165
170
  await client.halo.createIdentity();
166
171
  },
@@ -181,7 +186,7 @@ const meta: Meta<typeof DefaultStory> = {
181
186
  },
182
187
  };
183
188
 
184
- export default meta;
189
+ export default storybook;
185
190
 
186
191
  type Story = Meta<typeof DefaultStory>;
187
192
 
@@ -4,10 +4,9 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
- import { type Meta } from '@storybook/react';
7
+ import { type Meta } from '@storybook/react-vite';
8
8
  import React, { type FC, useCallback, useState } from 'react';
9
9
 
10
- import { Obj } from '@dxos/echo';
11
10
  import { invariant } from '@dxos/invariant';
12
11
  import { PublicKey } from '@dxos/keys';
13
12
  import { faker } from '@dxos/random';
@@ -38,7 +37,7 @@ faker.seed(101);
38
37
 
39
38
  const DefaultStory: FC<{ content?: string }> = ({ content = '' }) => {
40
39
  const { themeMode } = useThemeContext();
41
- const [text] = useState(Obj.make(DataType.Text, { content }));
40
+ const [text] = useState(DataType.makeText(content));
42
41
  const toolbarState = useEditorToolbarState({ viewMode: 'preview' });
43
42
  const formattingObserver = useFormattingState(toolbarState);
44
43
  const { parentRef, view } = useTextEditor(() => {
package/src/events.ts CHANGED
@@ -4,8 +4,8 @@
4
4
 
5
5
  import { Events } from '@dxos/app-framework';
6
6
 
7
- import { MARKDOWN_PLUGIN } from './meta';
7
+ import { meta } from './meta';
8
8
 
9
9
  export namespace MarkdownEvents {
10
- export const SetupExtensions = Events.createStateEvent(`${MARKDOWN_PLUGIN}/setup-extensions`);
10
+ export const SetupExtensions = Events.createStateEvent(`${meta.id}/event/setup-extensions`);
11
11
  }
@@ -2,6 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
+ import { type ViewUpdate } from '@codemirror/view';
5
6
  import React, { type AnchorHTMLAttributes, type ReactNode, useMemo } from 'react';
6
7
  import { createRoot } from 'react-dom/client';
7
8
 
@@ -12,6 +13,7 @@ import {
12
13
  useCapabilities,
13
14
  useIntentDispatcher,
14
15
  } from '@dxos/app-framework';
16
+ import { debounceAndThrottle } from '@dxos/async';
15
17
  import { invariant } from '@dxos/invariant';
16
18
  import { createDocAccessor, fullyQualifiedId, getSpace, type QueryResult } from '@dxos/react-client/echo';
17
19
  import { useIdentity } from '@dxos/react-client/halo';
@@ -44,16 +46,16 @@ import { type DataType } from '@dxos/schema';
44
46
  import { isNotFalsy } from '@dxos/util';
45
47
 
46
48
  import { MarkdownCapabilities } from './capabilities';
47
- import { type DocumentType, type MarkdownSettingsProps } from './types';
49
+ import { type Markdown } from './types';
48
50
  import { setFallbackName } from './util';
49
51
 
50
52
  type ExtensionsOptions = {
51
- document?: DocumentType;
53
+ document?: Markdown.Document;
52
54
  id?: string;
53
55
  text?: DataType.Text;
54
56
  dispatch?: PromiseIntentDispatcher;
55
- query?: QueryResult<DocumentType>;
56
- settings: MarkdownSettingsProps;
57
+ query?: QueryResult<Markdown.Document>;
58
+ settings: Markdown.Settings;
57
59
  selectionManager?: SelectionManager;
58
60
  viewMode?: EditorViewMode;
59
61
  editorStateStore?: EditorStateStore;
@@ -249,20 +251,22 @@ const createBaseExtensions = ({
249
251
  };
250
252
 
251
253
  export const selectionChange = (selectionManager: SelectionManager) => {
252
- return EditorView.updateListener.of((update) => {
253
- if (update.selectionSet) {
254
- const id = update.state.facet(documentId);
255
- const cursorConverter = update.state.facet(Cursor.converter);
256
- const selection = update.state.selection;
257
- const ranges = selection.ranges
258
- .map((range) => ({
259
- from: cursorConverter.toCursor(range.from),
260
- to: cursorConverter.toCursor(range.to),
261
- }))
262
- .filter(({ from, to }) => to > from);
263
- selectionManager.updateMultiRange(id, ranges);
264
- }
265
- });
254
+ return EditorView.updateListener.of(
255
+ debounceAndThrottle((update: ViewUpdate) => {
256
+ if (update.selectionSet) {
257
+ const id = update.state.facet(documentId);
258
+ const cursorConverter = update.state.facet(Cursor.converter);
259
+ const selection = update.state.selection;
260
+ const ranges = selection.ranges
261
+ .map((range) => ({
262
+ from: cursorConverter.toCursor(range.from),
263
+ to: cursorConverter.toCursor(range.to),
264
+ }))
265
+ .filter(({ from, to }) => to > from);
266
+ selectionManager.updateMultiRange(id, ranges);
267
+ }
268
+ }, 100),
269
+ );
266
270
  };
267
271
 
268
272
  // TODO(burdon): Factor out styles.
@@ -10,7 +10,7 @@ import { createResolver, LayoutAction, useIntentResolver } from '@dxos/app-frame
10
10
  import { invariant } from '@dxos/invariant';
11
11
  import { Cursor, setSelection } from '@dxos/react-ui-editor';
12
12
 
13
- import { MARKDOWN_PLUGIN } from '../meta';
13
+ import { meta } from '../meta';
14
14
 
15
15
  /**
16
16
  * Handle scrolling and selection of the current thread in a markdown editor.
@@ -52,5 +52,5 @@ export const useSelectCurrentThread = (editorView: EditorView | undefined, docum
52
52
  [documentId, editorView],
53
53
  );
54
54
 
55
- useIntentResolver(MARKDOWN_PLUGIN, scrollIntoViewResolver);
55
+ useIntentResolver(meta.id, scrollIntoViewResolver);
56
56
  };
package/src/index.ts CHANGED
@@ -4,6 +4,7 @@
4
4
 
5
5
  export { MarkdownCapabilities } from './capabilities';
6
6
  export { MarkdownEvents } from './events';
7
+
7
8
  export * from './MarkdownPlugin';
8
9
  export * from './meta';
9
10
  export * from './util';
package/src/meta.ts CHANGED
@@ -3,18 +3,20 @@
3
3
  //
4
4
 
5
5
  import { type PluginMeta } from '@dxos/app-framework';
6
-
7
- export const MARKDOWN_PLUGIN = 'dxos.org/plugin/markdown';
6
+ import { trim } from '@dxos/util';
8
7
 
9
8
  export const meta: PluginMeta = {
10
- id: MARKDOWN_PLUGIN,
9
+ id: 'dxos.org/plugin/markdown',
11
10
  name: 'Markdown',
12
- description: `
13
- A Markdown editor that is collaborative and fully extensible. It provides rich text editing as well as read only and markdown view.
14
- In addition to markdown capabilities, it also support threaded in-line comments which can be accessed from the right hand sidebar at any times inside the document.
15
- Your AI agent will have access to all markdown docs in your Space which means you can use them to extend the memory of your personal agent and add long term context for automated workflows.
11
+ description: trim`
12
+ A collaborative and extensible Markdown editor.
13
+ In addition to markdown capabilities, the plugin supports collaborative in-line comments.
14
+ You can use documents to extend the memory of your personal agents and add context for automated workflows.
16
15
  `,
17
- source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-markdown',
18
16
  icon: 'ph--text-aa--regular',
17
+ source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-markdown',
19
18
  screenshots: ['https://dxos.network/plugin-details-markdown-dark.png'],
20
19
  };
20
+
21
+ // TODO(burdon): Workaround for suspected vitest bug?
22
+ export const not_meta = meta;
@@ -2,22 +2,24 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { Type } from '@dxos/echo';
5
+ import { type Resource } from '@dxos/react-ui';
6
6
 
7
- import { MARKDOWN_PLUGIN } from './meta';
8
- import { DocumentType } from './types';
7
+ import { meta } from './meta';
8
+ import { Markdown } from './types';
9
9
 
10
- export default [
10
+ export const translations = [
11
11
  {
12
12
  'en-US': {
13
- [Type.getTypename(DocumentType)]: {
13
+ [Markdown.Document.typename]: {
14
14
  'typename label': 'Document',
15
15
  'typename label_zero': 'Documents',
16
16
  'typename label_one': 'Document',
17
17
  'typename label_other': 'Documents',
18
18
  'object name placeholder': 'New document',
19
+ 'rename object label': 'Rename document',
20
+ 'delete object label': 'Delete document',
19
21
  },
20
- [MARKDOWN_PLUGIN]: {
22
+ [meta.id]: {
21
23
  'plugin name': 'Editor',
22
24
  'choose markdown from space dialog title': 'Choose one or more documents to add',
23
25
  // TODO(burdon): Style-guide for user-facing text (e.g., hints, questions, capitalization, etc.)
@@ -43,4 +45,4 @@ export default [
43
45
  },
44
46
  },
45
47
  },
46
- ];
48
+ ] as const satisfies Resource[];
@@ -0,0 +1,55 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { Schema } from 'effect';
6
+
7
+ import { Obj, Ref, Type } from '@dxos/echo';
8
+ import { LabelAnnotation } from '@dxos/echo-schema';
9
+ import { EditorInputMode, EditorViewMode } from '@dxos/react-ui-editor/types';
10
+ import { DataType } from '@dxos/schema';
11
+
12
+ /**
13
+ * Document Item type.
14
+ */
15
+ export const Document = Schema.Struct({
16
+ name: Schema.optional(Schema.String),
17
+ fallbackName: Schema.optional(Schema.String),
18
+ content: Type.Ref(DataType.Text),
19
+ }).pipe(
20
+ Type.Obj({
21
+ typename: 'dxos.org/type/Document',
22
+ version: '0.1.0',
23
+ }),
24
+ LabelAnnotation.set(['name', 'fallbackName']),
25
+ );
26
+
27
+ export type Document = Schema.Schema.Type<typeof Document>;
28
+
29
+ /**
30
+ * Document factory.
31
+ */
32
+ export const makeDocument = ({
33
+ content = '',
34
+ ...props
35
+ }: Partial<{ name: string; fallbackName: string; content: string }> = {}) =>
36
+ Obj.make(Document, { ...props, content: Ref.make(DataType.makeText(content)) });
37
+
38
+ /**
39
+ * Plugin settings.
40
+ */
41
+ export const Settings = Schema.mutable(
42
+ Schema.Struct({
43
+ defaultViewMode: EditorViewMode,
44
+ editorInputMode: Schema.optional(EditorInputMode),
45
+ experimental: Schema.optional(Schema.Boolean),
46
+ debug: Schema.optional(Schema.Boolean),
47
+ toolbar: Schema.optional(Schema.Boolean),
48
+ typewriter: Schema.optional(Schema.String),
49
+ // TODO(burdon): Per document settings.
50
+ numberedHeadings: Schema.optional(Schema.Boolean),
51
+ folding: Schema.optional(Schema.Boolean),
52
+ }),
53
+ );
54
+
55
+ export interface Settings extends Schema.Schema.Type<typeof Settings> {}
@@ -0,0 +1,30 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { Schema } from 'effect';
6
+
7
+ import { Type } from '@dxos/echo';
8
+ import { EditorViewMode } from '@dxos/react-ui-editor/types';
9
+
10
+ import { Document } from './Markdown';
11
+ import { not_meta } from '../meta';
12
+
13
+ export class Create extends Schema.TaggedClass<Create>()(`${not_meta.id}/action/create`, {
14
+ input: Schema.Struct({
15
+ spaceId: Type.SpaceId,
16
+ name: Schema.optional(Schema.String),
17
+ content: Schema.optional(Schema.String),
18
+ }),
19
+ output: Schema.Struct({
20
+ object: Document,
21
+ }),
22
+ }) {}
23
+
24
+ export class SetViewMode extends Schema.TaggedClass<SetViewMode>()(`${not_meta.id}/action/set-view-mode`, {
25
+ input: Schema.Struct({
26
+ id: Schema.String,
27
+ viewMode: EditorViewMode,
28
+ }),
29
+ output: Schema.Void,
30
+ }) {}
@@ -2,5 +2,6 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- export * from './schema';
5
+ export * as MarkdownAction from './MarkdownAction';
6
+ export * as Markdown from './Markdown';
6
7
  export * from './types';