@dxos/plugin-markdown 0.8.4-main.2e9d522 → 0.8.4-main.5ea62a8

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 (229) hide show
  1. package/dist/lib/browser/{MarkdownPreview-S3C7CGAV.mjs → MarkdownCard-JLUQITYK.mjs} +16 -16
  2. package/dist/lib/browser/MarkdownCard-JLUQITYK.mjs.map +7 -0
  3. package/dist/lib/browser/{MarkdownContainer-F3WEEIBX.mjs → MarkdownContainer-7M37DXAD.mjs} +263 -260
  4. package/dist/lib/browser/MarkdownContainer-7M37DXAD.mjs.map +7 -0
  5. package/dist/lib/browser/{anchor-sort-UKJJ7ZNP.mjs → anchor-sort-E33BSTYF.mjs} +5 -5
  6. package/dist/lib/browser/anchor-sort-E33BSTYF.mjs.map +7 -0
  7. package/dist/lib/browser/{app-graph-serializer-ICLAF662.mjs → app-graph-serializer-OX62DNPT.mjs} +10 -11
  8. package/dist/lib/browser/app-graph-serializer-OX62DNPT.mjs.map +7 -0
  9. package/dist/lib/browser/blueprint-definition-Z3RQGWUD.mjs +11 -0
  10. package/dist/lib/browser/blueprint-definition-Z3RQGWUD.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-BEE7VQPU.mjs +78 -0
  12. package/dist/lib/browser/chunk-BEE7VQPU.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-D7UYVHL6.mjs +20 -0
  14. package/dist/lib/browser/{chunk-PHTD5DTR.mjs.map → chunk-D7UYVHL6.mjs.map} +3 -3
  15. package/dist/lib/browser/{chunk-LFML7LC6.mjs → chunk-LAVZ2W6X.mjs} +8 -9
  16. package/dist/lib/browser/chunk-LAVZ2W6X.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-ODB2PTBP.mjs +28 -0
  18. package/dist/lib/browser/chunk-ODB2PTBP.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-OY6CGPOO.mjs +16 -0
  20. package/dist/lib/browser/chunk-OY6CGPOO.mjs.map +7 -0
  21. package/dist/lib/browser/{chunk-LHDCHDBW.mjs → chunk-Z7P6JGGW.mjs} +6 -5
  22. package/dist/lib/browser/chunk-Z7P6JGGW.mjs.map +7 -0
  23. package/dist/lib/browser/chunk-ZVVKLB5L.mjs +121 -0
  24. package/dist/lib/browser/chunk-ZVVKLB5L.mjs.map +7 -0
  25. package/dist/lib/browser/index.mjs +26 -20
  26. package/dist/lib/browser/index.mjs.map +3 -3
  27. package/dist/lib/browser/intent-resolver-WDDH56JC.mjs +62 -0
  28. package/dist/lib/browser/intent-resolver-WDDH56JC.mjs.map +7 -0
  29. package/dist/lib/browser/meta.json +1 -1
  30. package/dist/lib/browser/{react-surface-C3Z423TV.mjs → react-surface-LN2XK2UN.mjs} +53 -44
  31. package/dist/lib/browser/react-surface-LN2XK2UN.mjs.map +7 -0
  32. package/dist/lib/browser/{settings-KN75ZQY6.mjs → settings-AABBTB4Q.mjs} +5 -5
  33. package/dist/lib/browser/settings-AABBTB4Q.mjs.map +7 -0
  34. package/dist/lib/browser/{state-LZWTAS65.mjs → state-FTHQQX7V.mjs} +7 -7
  35. package/dist/lib/browser/state-FTHQQX7V.mjs.map +7 -0
  36. package/dist/lib/browser/types/index.mjs +6 -14
  37. package/dist/lib/node-esm/{MarkdownPreview-77UFEWXT.mjs → MarkdownCard-XL5EVSJ7.mjs} +16 -16
  38. package/dist/lib/node-esm/MarkdownCard-XL5EVSJ7.mjs.map +7 -0
  39. package/dist/lib/node-esm/{MarkdownContainer-VOUHL6IU.mjs → MarkdownContainer-K3BPAGWO.mjs} +263 -260
  40. package/dist/lib/node-esm/MarkdownContainer-K3BPAGWO.mjs.map +7 -0
  41. package/dist/lib/node-esm/{anchor-sort-IPIS5D5B.mjs → anchor-sort-ALP2NH24.mjs} +5 -5
  42. package/dist/lib/node-esm/anchor-sort-ALP2NH24.mjs.map +7 -0
  43. package/dist/lib/node-esm/{app-graph-serializer-FLBXQKKR.mjs → app-graph-serializer-56TD3BMX.mjs} +10 -11
  44. package/dist/lib/node-esm/app-graph-serializer-56TD3BMX.mjs.map +7 -0
  45. package/dist/lib/node-esm/blueprint-definition-735OAX33.mjs +12 -0
  46. package/dist/lib/node-esm/blueprint-definition-735OAX33.mjs.map +7 -0
  47. package/dist/lib/node-esm/{chunk-ACFGXH2K.mjs → chunk-CB2R4YIY.mjs} +5 -5
  48. package/dist/lib/node-esm/chunk-CB2R4YIY.mjs.map +7 -0
  49. package/dist/lib/node-esm/chunk-FXILAQ5F.mjs +79 -0
  50. package/dist/lib/node-esm/chunk-FXILAQ5F.mjs.map +7 -0
  51. package/dist/lib/node-esm/{chunk-VIR2ABYE.mjs → chunk-J7A6TUB2.mjs} +6 -5
  52. package/dist/lib/node-esm/chunk-J7A6TUB2.mjs.map +7 -0
  53. package/dist/lib/node-esm/chunk-JPXFCBC4.mjs +22 -0
  54. package/dist/lib/node-esm/{chunk-7X6TPTJK.mjs.map → chunk-JPXFCBC4.mjs.map} +3 -3
  55. package/dist/lib/node-esm/{chunk-CWTFQSN7.mjs → chunk-O6EXWGGS.mjs} +8 -9
  56. package/dist/lib/node-esm/chunk-O6EXWGGS.mjs.map +7 -0
  57. package/dist/lib/node-esm/chunk-VCG2U522.mjs +29 -0
  58. package/dist/lib/node-esm/chunk-VCG2U522.mjs.map +7 -0
  59. package/dist/lib/node-esm/chunk-Y422WR6A.mjs +122 -0
  60. package/dist/lib/node-esm/chunk-Y422WR6A.mjs.map +7 -0
  61. package/dist/lib/node-esm/index.mjs +26 -20
  62. package/dist/lib/node-esm/index.mjs.map +3 -3
  63. package/dist/lib/node-esm/intent-resolver-2I5HKCUU.mjs +63 -0
  64. package/dist/lib/node-esm/intent-resolver-2I5HKCUU.mjs.map +7 -0
  65. package/dist/lib/node-esm/meta.json +1 -1
  66. package/dist/lib/node-esm/{react-surface-TTTBYNI2.mjs → react-surface-DJGGKYBD.mjs} +53 -44
  67. package/dist/lib/node-esm/react-surface-DJGGKYBD.mjs.map +7 -0
  68. package/dist/lib/node-esm/{settings-KVP7TVX7.mjs → settings-CXGR6DH4.mjs} +5 -5
  69. package/dist/lib/node-esm/settings-CXGR6DH4.mjs.map +7 -0
  70. package/dist/lib/node-esm/{state-NW3W4JCQ.mjs → state-NWMQ3XAI.mjs} +7 -7
  71. package/dist/lib/node-esm/state-NWMQ3XAI.mjs.map +7 -0
  72. package/dist/lib/node-esm/types/index.mjs +6 -14
  73. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  74. package/dist/types/src/capabilities/anchor-sort.d.ts +2 -2
  75. package/dist/types/src/capabilities/app-graph-serializer.d.ts +1 -1
  76. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -1
  77. package/dist/types/src/capabilities/artifact-definition.d.ts +1 -9
  78. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  79. package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -0
  80. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  81. package/dist/types/src/capabilities/capabilities.d.ts +1 -1
  82. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  83. package/dist/types/src/capabilities/index.d.ts +11 -10
  84. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  85. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  86. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  87. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  88. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  89. package/dist/types/src/capabilities/settings.d.ts +1 -1
  90. package/dist/types/src/capabilities/state.d.ts +2 -2
  91. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  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 +5 -5
  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 +2 -2
  107. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts.map +1 -1
  108. package/dist/types/src/components/Suggestions.stories.d.ts +2 -2
  109. package/dist/types/src/components/Suggestions.stories.d.ts.map +1 -1
  110. package/dist/types/src/components/Toolbar.stories.d.ts +44 -7
  111. package/dist/types/src/components/Toolbar.stories.d.ts.map +1 -1
  112. package/dist/types/src/components/index.d.ts +1 -1
  113. package/dist/types/src/components/index.d.ts.map +1 -1
  114. package/dist/types/src/events.d.ts.map +1 -1
  115. package/dist/types/src/extensions.d.ts +4 -4
  116. package/dist/types/src/extensions.d.ts.map +1 -1
  117. package/dist/types/src/functions/create.d.ts +12 -0
  118. package/dist/types/src/functions/create.d.ts.map +1 -0
  119. package/dist/types/src/functions/diff.d.ts +6 -0
  120. package/dist/types/src/functions/diff.d.ts.map +1 -0
  121. package/dist/types/src/functions/index.d.ts +4 -0
  122. package/dist/types/src/functions/index.d.ts.map +1 -0
  123. package/dist/types/src/functions/open.d.ts +7 -0
  124. package/dist/types/src/functions/open.d.ts.map +1 -0
  125. package/dist/types/src/index.d.ts +2 -1
  126. package/dist/types/src/index.d.ts.map +1 -1
  127. package/dist/types/src/meta.d.ts +0 -1
  128. package/dist/types/src/meta.d.ts.map +1 -1
  129. package/dist/types/src/translations.d.ts +3 -2
  130. package/dist/types/src/translations.d.ts.map +1 -1
  131. package/dist/types/src/types/Markdown.d.ts +43 -0
  132. package/dist/types/src/types/Markdown.d.ts.map +1 -0
  133. package/dist/types/src/types/MarkdownAction.d.ts +33 -0
  134. package/dist/types/src/types/MarkdownAction.d.ts.map +1 -0
  135. package/dist/types/src/types/index.d.ts +2 -1
  136. package/dist/types/src/types/index.d.ts.map +1 -1
  137. package/dist/types/src/types/types.d.ts +3 -59
  138. package/dist/types/src/types/types.d.ts.map +1 -1
  139. package/dist/types/src/util.d.ts +12 -3
  140. package/dist/types/src/util.d.ts.map +1 -1
  141. package/dist/types/tsconfig.tsbuildinfo +1 -1
  142. package/package.json +46 -41
  143. package/src/MarkdownPlugin.tsx +14 -12
  144. package/src/capabilities/anchor-sort.ts +3 -3
  145. package/src/capabilities/app-graph-serializer.ts +7 -5
  146. package/src/capabilities/artifact-definition.ts +18 -23
  147. package/src/capabilities/blueprint-definition.ts +39 -0
  148. package/src/capabilities/capabilities.ts +5 -4
  149. package/src/capabilities/index.ts +2 -1
  150. package/src/capabilities/intent-resolver.ts +15 -21
  151. package/src/capabilities/react-surface.tsx +21 -19
  152. package/src/capabilities/settings.ts +3 -3
  153. package/src/capabilities/state.ts +8 -8
  154. package/src/components/MarkdownCard/MarkdownCard.stories.tsx +79 -0
  155. package/src/components/{MarkdownPreview/MarkdownPreview.tsx → MarkdownCard/MarkdownCard.tsx} +11 -9
  156. package/src/components/MarkdownCard/index.ts +9 -0
  157. package/src/components/MarkdownContainer.stories.tsx +12 -15
  158. package/src/components/MarkdownContainer.tsx +10 -9
  159. package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +10 -7
  160. package/src/components/MarkdownEditor/MarkdownEditor.tsx +9 -8
  161. package/src/components/MarkdownSettings/MarkdownSettings.tsx +81 -78
  162. package/src/components/Suggestions.stories.tsx +24 -27
  163. package/src/components/Toolbar.stories.tsx +18 -13
  164. package/src/components/index.ts +1 -1
  165. package/src/events.ts +2 -2
  166. package/src/extensions.tsx +12 -12
  167. package/src/functions/create.ts +23 -0
  168. package/src/functions/diff.ts +35 -0
  169. package/src/functions/index.ts +7 -0
  170. package/src/functions/open.ts +30 -0
  171. package/src/hooks/useSelectCurrentThread.tsx +3 -3
  172. package/src/index.ts +4 -1
  173. package/src/meta.ts +7 -8
  174. package/src/translations.ts +3 -2
  175. package/src/types/Markdown.ts +56 -0
  176. package/src/types/MarkdownAction.ts +29 -0
  177. package/src/types/index.ts +2 -1
  178. package/src/types/types.ts +6 -50
  179. package/src/util.tsx +20 -6
  180. package/dist/lib/browser/MarkdownContainer-F3WEEIBX.mjs.map +0 -7
  181. package/dist/lib/browser/MarkdownPreview-S3C7CGAV.mjs.map +0 -7
  182. package/dist/lib/browser/anchor-sort-UKJJ7ZNP.mjs.map +0 -7
  183. package/dist/lib/browser/app-graph-serializer-ICLAF662.mjs.map +0 -7
  184. package/dist/lib/browser/artifact-definition-R2YYWOPN.mjs +0 -145
  185. package/dist/lib/browser/artifact-definition-R2YYWOPN.mjs.map +0 -7
  186. package/dist/lib/browser/chunk-777RIED6.mjs +0 -16
  187. package/dist/lib/browser/chunk-777RIED6.mjs.map +0 -7
  188. package/dist/lib/browser/chunk-EPTSAJZM.mjs +0 -22
  189. package/dist/lib/browser/chunk-EPTSAJZM.mjs.map +0 -7
  190. package/dist/lib/browser/chunk-LFML7LC6.mjs.map +0 -7
  191. package/dist/lib/browser/chunk-LHDCHDBW.mjs.map +0 -7
  192. package/dist/lib/browser/chunk-PHTD5DTR.mjs +0 -20
  193. package/dist/lib/browser/chunk-UANWRJZU.mjs +0 -79
  194. package/dist/lib/browser/chunk-UANWRJZU.mjs.map +0 -7
  195. package/dist/lib/browser/intent-resolver-3MXYO3MW.mjs +0 -64
  196. package/dist/lib/browser/intent-resolver-3MXYO3MW.mjs.map +0 -7
  197. package/dist/lib/browser/react-surface-C3Z423TV.mjs.map +0 -7
  198. package/dist/lib/browser/settings-KN75ZQY6.mjs.map +0 -7
  199. package/dist/lib/browser/state-LZWTAS65.mjs.map +0 -7
  200. package/dist/lib/node-esm/MarkdownContainer-VOUHL6IU.mjs.map +0 -7
  201. package/dist/lib/node-esm/MarkdownPreview-77UFEWXT.mjs.map +0 -7
  202. package/dist/lib/node-esm/anchor-sort-IPIS5D5B.mjs.map +0 -7
  203. package/dist/lib/node-esm/app-graph-serializer-FLBXQKKR.mjs.map +0 -7
  204. package/dist/lib/node-esm/artifact-definition-MLTAY4LK.mjs +0 -146
  205. package/dist/lib/node-esm/artifact-definition-MLTAY4LK.mjs.map +0 -7
  206. package/dist/lib/node-esm/chunk-7X6TPTJK.mjs +0 -22
  207. package/dist/lib/node-esm/chunk-ACFGXH2K.mjs.map +0 -7
  208. package/dist/lib/node-esm/chunk-CWTFQSN7.mjs.map +0 -7
  209. package/dist/lib/node-esm/chunk-CXG7GMYP.mjs +0 -24
  210. package/dist/lib/node-esm/chunk-CXG7GMYP.mjs.map +0 -7
  211. package/dist/lib/node-esm/chunk-JEEQLO7C.mjs +0 -80
  212. package/dist/lib/node-esm/chunk-JEEQLO7C.mjs.map +0 -7
  213. package/dist/lib/node-esm/chunk-VIR2ABYE.mjs.map +0 -7
  214. package/dist/lib/node-esm/intent-resolver-BZYWV53A.mjs +0 -65
  215. package/dist/lib/node-esm/intent-resolver-BZYWV53A.mjs.map +0 -7
  216. package/dist/lib/node-esm/react-surface-TTTBYNI2.mjs.map +0 -7
  217. package/dist/lib/node-esm/settings-KVP7TVX7.mjs.map +0 -7
  218. package/dist/lib/node-esm/state-NW3W4JCQ.mjs.map +0 -7
  219. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.d.ts +0 -6
  220. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.d.ts.map +0 -1
  221. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts +0 -42
  222. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts.map +0 -1
  223. package/dist/types/src/components/MarkdownPreview/index.d.ts +0 -4
  224. package/dist/types/src/components/MarkdownPreview/index.d.ts.map +0 -1
  225. package/dist/types/src/types/schema.d.ts +0 -35
  226. package/dist/types/src/types/schema.d.ts.map +0 -1
  227. package/src/components/MarkdownPreview/MarkdownPreview.stories.tsx +0 -81
  228. package/src/components/MarkdownPreview/index.ts +0 -9
  229. package/src/types/schema.ts +0 -39
@@ -2,25 +2,25 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Capabilities, contributes, type PluginContext } from '@dxos/app-framework';
5
+ import { Capabilities, type PluginContext, contributes } 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
 
9
+ import { meta } from '../meta';
10
+ import { type Markdown, type MarkdownPluginState } from '../types';
11
+
9
12
  import { MarkdownCapabilities } from './capabilities';
10
- import { MARKDOWN_PLUGIN } from '../meta';
11
- import { type MarkdownPluginState, type MarkdownSettingsProps } from '../types';
12
13
 
13
14
  export default (context: PluginContext) => {
14
- const state = new LocalStorageStore<MarkdownPluginState>(MARKDOWN_PLUGIN, { extensionProviders: [], viewMode: {} });
15
+ const state = new LocalStorageStore<MarkdownPluginState>(meta.id, { extensionProviders: [], viewMode: {} });
15
16
  state.prop({ key: 'viewMode', type: LocalStorageStore.json<{ [key: string]: EditorViewMode }>() });
16
17
 
17
18
  // TODO(wittjosiah): Fold into state.
18
- const editorState = createEditorStateStore(`${MARKDOWN_PLUGIN}/editor`);
19
+ const editorState = createEditorStateStore(`${meta.id}/editor`);
19
20
 
20
21
  const getViewMode = (id: string) => {
21
- const defaultViewMode = context
22
- .getCapability(Capabilities.SettingsStore)
23
- .getStore<MarkdownSettingsProps>(MARKDOWN_PLUGIN)!.value.defaultViewMode;
22
+ const defaultViewMode = context.getCapability(Capabilities.SettingsStore).getStore<Markdown.Settings>(meta.id)!
23
+ .value.defaultViewMode;
24
24
  return (id && state.values.viewMode[id]) || defaultViewMode;
25
25
  };
26
26
 
@@ -0,0 +1,79 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import '@dxos-theme';
6
+
7
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
+ import React from 'react';
9
+
10
+ import { IntentPlugin } from '@dxos/app-framework';
11
+ import { withPluginManager } from '@dxos/app-framework/testing';
12
+ import { Markdown } from '@dxos/plugin-markdown/types';
13
+ import { faker } from '@dxos/random';
14
+ import { CardContainer } from '@dxos/react-ui-stack/testing';
15
+ import { withLayout, withTheme } from '@dxos/storybook-utils';
16
+
17
+ import { translations } from '../../translations';
18
+
19
+ import { MarkdownCard } from './MarkdownCard';
20
+
21
+ faker.seed(1234);
22
+
23
+ const meta: Meta<typeof MarkdownCard> = {
24
+ title: 'plugins/plugin-markdown/Card',
25
+ component: MarkdownCard,
26
+ render: ({ role, subject, ...args }) => {
27
+ return (
28
+ <CardContainer icon='ph--text-aa--regular' role={role}>
29
+ <MarkdownCard role={role} subject={subject} {...args} />
30
+ </CardContainer>
31
+ );
32
+ },
33
+ decorators: [
34
+ withPluginManager({
35
+ plugins: [IntentPlugin()],
36
+ }),
37
+ withTheme,
38
+ withLayout(),
39
+ ],
40
+ parameters: {
41
+ layout: 'centered',
42
+ translations,
43
+ },
44
+ tags: ['cards'],
45
+ } satisfies Meta<typeof MarkdownCard>;
46
+
47
+ export default meta;
48
+
49
+ type Story = StoryObj<typeof meta>;
50
+
51
+ export const Popover: Story = {
52
+ args: {
53
+ role: 'card--popover',
54
+ subject: Markdown.makeDocument({
55
+ name: faker.lorem.words(3),
56
+ content: faker.lorem.paragraphs(3),
57
+ }),
58
+ },
59
+ };
60
+
61
+ export const Intrinsic: Story = {
62
+ args: {
63
+ role: 'card--intrinsic',
64
+ subject: Markdown.makeDocument({
65
+ name: faker.lorem.words(3),
66
+ content: faker.lorem.paragraphs(3),
67
+ }),
68
+ },
69
+ };
70
+
71
+ export const Extrinsic: Story = {
72
+ args: {
73
+ role: 'card--extrinsic',
74
+ subject: Markdown.makeDocument({
75
+ name: faker.lorem.words(3),
76
+ content: faker.lorem.paragraphs(3),
77
+ }),
78
+ },
79
+ };
@@ -5,7 +5,7 @@
5
5
  import { pipe } from 'effect';
6
6
  import React, { useCallback } from 'react';
7
7
 
8
- import { chain, createIntent, LayoutAction, useIntentDispatcher } from '@dxos/app-framework';
8
+ import { LayoutAction, chain, createIntent, useIntentDispatcher } from '@dxos/app-framework';
9
9
  import { Obj } from '@dxos/echo';
10
10
  import { type PreviewProps } from '@dxos/plugin-preview';
11
11
  import { fullyQualifiedId } from '@dxos/react-client/echo';
@@ -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,19 @@ 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 type MarkdownCardProps = PreviewProps<Markdown.Document | DataType.Text>;
39
+
40
+ export const MarkdownCard = ({ subject, role }: MarkdownCardProps) => {
39
41
  const { dispatchPromise: dispatch } = useIntentDispatcher();
40
- const { t } = useTranslation(MARKDOWN_PLUGIN);
42
+ const { t } = useTranslation(meta.id);
41
43
  const snippet = getSnippet(subject, t('fallback abstract'));
42
44
 
43
45
  // TODO(wittjosiah): Factor out so this component isn't dependent on the app framework.
@@ -0,0 +1,9 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { MarkdownCard } from './MarkdownCard';
6
+
7
+ export * from './MarkdownCard';
8
+
9
+ export default MarkdownCard;
@@ -4,13 +4,13 @@
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
- import { Capabilities, contributes, IntentPlugin, SettingsPlugin, Surface } from '@dxos/app-framework';
10
+ import { Capabilities, IntentPlugin, SettingsPlugin, Surface, contributes } from '@dxos/app-framework';
11
11
  import { withPluginManager } from '@dxos/app-framework/testing';
12
12
  import { todo } from '@dxos/debug';
13
- import { Obj, Query, Ref, Type } from '@dxos/echo';
13
+ import { Query, Type } from '@dxos/echo';
14
14
  import { AttentionPlugin } from '@dxos/plugin-attention';
15
15
  import { ClientPlugin } from '@dxos/plugin-client';
16
16
  import { GraphPlugin } from '@dxos/plugin-graph';
@@ -22,12 +22,12 @@ import { faker } from '@dxos/random';
22
22
  import { useQuery, useSpace } from '@dxos/react-client/echo';
23
23
  import { defaultTx } from '@dxos/react-ui-theme';
24
24
  import { DataType } from '@dxos/schema';
25
- import { createObjectFactory, Testing, type ValueGenerator } from '@dxos/schema/testing';
25
+ import { Testing, type ValueGenerator, createObjectFactory } from '@dxos/schema/testing';
26
26
  import { withLayout } from '@dxos/storybook-utils';
27
27
 
28
28
  import { MarkdownPlugin } from '../MarkdownPlugin';
29
29
  import { translations } from '../translations';
30
- import { DocumentType } from '../types';
30
+ import { Markdown } from '../types';
31
31
 
32
32
  faker.seed(1);
33
33
 
@@ -35,13 +35,13 @@ const generator: ValueGenerator = faker as any;
35
35
 
36
36
  const DefaultStory = () => {
37
37
  const space = useSpace();
38
- const [doc] = useQuery(space, Query.type(DocumentType));
38
+ const [doc] = useQuery(space, Query.type(Markdown.Document));
39
39
  const data = useMemo(() => ({ subject: doc }), [doc]);
40
40
 
41
41
  return <Surface role='article' data={data} />;
42
42
  };
43
43
 
44
- const meta: Meta<typeof DefaultStory> = {
44
+ const meta = {
45
45
  title: 'plugins/plugin-markdown/MarkdownContainer',
46
46
  render: DefaultStory,
47
47
  decorators: [
@@ -51,16 +51,13 @@ const meta: Meta<typeof DefaultStory> = {
51
51
  ThemePlugin({ tx: defaultTx }),
52
52
  StorybookLayoutPlugin(),
53
53
  ClientPlugin({
54
- types: [DocumentType, DataType.Text, Testing.Contact],
55
- onClientInitialized: async (_, client) => {
54
+ types: [Markdown.Document, DataType.Text, Testing.Contact],
55
+ onClientInitialized: async ({ client }) => {
56
56
  await client.halo.createIdentity();
57
57
  await client.spaces.waitUntilReady();
58
58
  await client.spaces.default.waitUntilReady();
59
59
  const space = client.spaces.default;
60
- const doc = Obj.make(DocumentType, {
61
- name: 'Test',
62
- content: Ref.make(Obj.make(DataType.Text, { content: '# Test\n\n' })),
63
- });
60
+ const doc = Markdown.makeDocument({ name: 'Test', content: '# Test\n\n' });
64
61
  space.db.add(doc);
65
62
  const createObjects = createObjectFactory(space.db, generator);
66
63
  await createObjects([{ type: Testing.Contact, count: 10 }]);
@@ -94,10 +91,10 @@ const meta: Meta<typeof DefaultStory> = {
94
91
  translations,
95
92
  controls: { disable: true },
96
93
  },
97
- };
94
+ } satisfies Meta<typeof Capabilities>;
98
95
 
99
96
  export default meta;
100
97
 
101
- type Story = Meta<typeof DefaultStory>;
98
+ type Story = StoryObj<typeof meta>;
102
99
 
103
100
  export const Default: Story = {};
@@ -16,29 +16,30 @@ 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
- import { DocumentType, type MarkdownSettingsProps } from '../types';
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'
34
35
  > & {
35
36
  id: string;
36
- object: DocumentType | DataType.Text | any;
37
- settings: MarkdownSettingsProps;
37
+ object: Markdown.Document | DataType.Text | any;
38
+ settings: Markdown.Settings;
38
39
  selectionManager?: SelectionManager;
39
40
  };
40
41
 
41
- const MarkdownContainer = ({
42
+ export const MarkdownContainer = ({
42
43
  id,
43
44
  role,
44
45
  object,
@@ -50,7 +51,7 @@ const MarkdownContainer = ({
50
51
  }: MarkdownContainerProps) => {
51
52
  const { t } = useTranslation();
52
53
  const scrollPastEnd = role === 'article';
53
- const doc = Obj.instanceOf(DocumentType, object) ? object : undefined;
54
+ const doc = Obj.instanceOf(Markdown.Document, object) ? object : undefined;
54
55
  const text = Obj.instanceOf(DataType.Text, object) ? object : undefined;
55
56
  const [previewBlocks, setPreviewBlocks] = useState<{ link: PreviewLinkRef; el: HTMLElement }[]>([]);
56
57
  const previewOptions = useMemo(
@@ -199,7 +200,7 @@ const PreviewBlock = ({ link, el }: { link: PreviewLinkRef; el: HTMLElement }) =
199
200
 
200
201
  type DocumentEditorProps = Omit<MarkdownContainerProps, 'object' | 'extensionProviders' | 'editorStateStore'> &
201
202
  Pick<MarkdownEditorProps, 'id' | 'scrollPastEnd' | 'extensions' | 'onLinkQuery'> & {
202
- document: DocumentType;
203
+ document: Markdown.Document;
203
204
  };
204
205
 
205
206
  export const DocumentEditor = ({ id, document: doc, settings, viewMode, ...props }: DocumentEditorProps) => {
@@ -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';
@@ -20,11 +20,12 @@ import {
20
20
  type EditorToolbarActionGraphProps,
21
21
  type EditorViewMode,
22
22
  RefPopover,
23
+ type UseCommandMenuOptions,
23
24
  type UseTextEditorProps,
24
25
  addLink,
25
- createElement,
26
26
  coreSlashCommands,
27
27
  createBasicExtensions,
28
+ createElement,
28
29
  createMarkdownExtensions,
29
30
  createThemeExtensions,
30
31
  dropFile,
@@ -34,26 +35,25 @@ 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
- 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);
@@ -185,6 +185,7 @@ const MarkdownEditorImpl = forwardRef<EditorView | undefined, MarkdownEditorProp
185
185
  readOnly: viewMode === 'readonly',
186
186
  placeholder: t('editor placeholder'),
187
187
  scrollPastEnd: role === 'section' ? false : scrollPastEnd,
188
+ search: true,
188
189
  }),
189
190
  createMarkdownExtensions({ themeMode }),
190
191
  createThemeExtensions({ themeMode, syntaxHighlighting: true, slots: editorSlots }),
@@ -6,100 +6,103 @@ 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
- 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 (
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
  };