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

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 (205) hide show
  1. package/dist/lib/browser/{MarkdownPreview-7VG3K24R.mjs → MarkdownCard-ZHTH6EVA.mjs} +13 -13
  2. package/dist/lib/browser/MarkdownCard-ZHTH6EVA.mjs.map +7 -0
  3. package/dist/lib/browser/{MarkdownContainer-NNBPE6A5.mjs → MarkdownContainer-XDYFBDCI.mjs} +281 -310
  4. package/dist/lib/browser/MarkdownContainer-XDYFBDCI.mjs.map +7 -0
  5. package/dist/lib/browser/{anchor-sort-Z7JQA7RL.mjs → anchor-sort-53E7TJGF.mjs} +5 -5
  6. package/dist/lib/browser/{anchor-sort-Z7JQA7RL.mjs.map → anchor-sort-53E7TJGF.mjs.map} +1 -1
  7. package/dist/lib/browser/{app-graph-serializer-ZT5OVF5G.mjs → app-graph-serializer-IEPNJZBR.mjs} +9 -10
  8. package/dist/lib/browser/app-graph-serializer-IEPNJZBR.mjs.map +7 -0
  9. package/dist/lib/browser/blueprint-definition-XDLVVSUN.mjs +11 -0
  10. package/dist/lib/browser/blueprint-definition-XDLVVSUN.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-EVQGTH3P.mjs +22 -0
  12. package/dist/lib/browser/chunk-EVQGTH3P.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-K7ZFMSC4.mjs → chunk-NGXGBWSS.mjs} +4 -3
  14. package/dist/lib/browser/chunk-NGXGBWSS.mjs.map +7 -0
  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-YHMGUSO7.mjs → chunk-PMBWHKDI.mjs} +10 -12
  20. package/dist/lib/browser/chunk-PMBWHKDI.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-VZU7BRGW.mjs +106 -0
  22. package/dist/lib/browser/chunk-VZU7BRGW.mjs.map +7 -0
  23. package/dist/lib/browser/{chunk-VMX5SDGW.mjs → chunk-XYQDM6PM.mjs} +2 -2
  24. package/dist/lib/browser/index.mjs +29 -18
  25. package/dist/lib/browser/index.mjs.map +3 -3
  26. package/dist/lib/browser/{intent-resolver-EBEF7WEI.mjs → intent-resolver-66ZUQ6JC.mjs} +20 -18
  27. package/dist/lib/browser/intent-resolver-66ZUQ6JC.mjs.map +7 -0
  28. package/dist/lib/browser/meta.json +1 -1
  29. package/dist/lib/browser/{react-surface-ZPMZT4VU.mjs → react-surface-ONX5RNFM.mjs} +40 -33
  30. package/dist/lib/browser/react-surface-ONX5RNFM.mjs.map +7 -0
  31. package/dist/lib/browser/{settings-MBDK4TWE.mjs → settings-HXM36BCZ.mjs} +5 -5
  32. package/dist/lib/browser/{settings-MBDK4TWE.mjs.map → settings-HXM36BCZ.mjs.map} +1 -1
  33. package/dist/lib/browser/{state-ZA6PZPUI.mjs → state-6QODXCSZ.mjs} +5 -5
  34. package/dist/lib/browser/state-6QODXCSZ.mjs.map +7 -0
  35. package/dist/lib/browser/toolkit-73U3A7SD.mjs +76 -0
  36. package/dist/lib/browser/toolkit-73U3A7SD.mjs.map +7 -0
  37. package/dist/lib/browser/types/index.mjs +2 -2
  38. package/dist/lib/node-esm/{MarkdownPreview-UVWR2YK3.mjs → MarkdownCard-MEA4QAAI.mjs} +13 -13
  39. package/dist/lib/node-esm/MarkdownCard-MEA4QAAI.mjs.map +7 -0
  40. package/dist/lib/node-esm/{MarkdownContainer-Q6UO7DKT.mjs → MarkdownContainer-7GYMOJVT.mjs} +281 -310
  41. package/dist/lib/node-esm/MarkdownContainer-7GYMOJVT.mjs.map +7 -0
  42. package/dist/lib/node-esm/{anchor-sort-R6AAKYNG.mjs → anchor-sort-V2FWEYDN.mjs} +5 -5
  43. package/dist/lib/node-esm/{anchor-sort-R6AAKYNG.mjs.map → anchor-sort-V2FWEYDN.mjs.map} +1 -1
  44. package/dist/lib/node-esm/{app-graph-serializer-X4M5QEI6.mjs → app-graph-serializer-HIN4NMUG.mjs} +9 -10
  45. package/dist/lib/node-esm/app-graph-serializer-HIN4NMUG.mjs.map +7 -0
  46. package/dist/lib/node-esm/blueprint-definition-PDXZ67UQ.mjs +12 -0
  47. package/dist/lib/node-esm/blueprint-definition-PDXZ67UQ.mjs.map +7 -0
  48. package/dist/lib/node-esm/{chunk-6GCOJS4Y.mjs → chunk-35WAARP4.mjs} +10 -12
  49. package/dist/lib/node-esm/chunk-35WAARP4.mjs.map +7 -0
  50. package/dist/lib/node-esm/{chunk-B3J2M4YL.mjs → chunk-CB2R4YIY.mjs} +2 -2
  51. package/dist/lib/node-esm/{chunk-B3J2M4YL.mjs.map → chunk-CB2R4YIY.mjs.map} +1 -1
  52. package/dist/lib/node-esm/{chunk-LZK3TLKM.mjs → chunk-IOC54NCF.mjs} +2 -2
  53. package/dist/lib/node-esm/{chunk-RCIXKCVG.mjs → chunk-VCG2U522.mjs} +2 -4
  54. package/dist/lib/node-esm/{chunk-RCIXKCVG.mjs.map → chunk-VCG2U522.mjs.map} +3 -3
  55. package/dist/lib/node-esm/chunk-VELFUWUH.mjs +107 -0
  56. package/dist/lib/node-esm/chunk-VELFUWUH.mjs.map +7 -0
  57. package/dist/lib/node-esm/chunk-W4XXBX33.mjs +24 -0
  58. package/dist/lib/node-esm/chunk-W4XXBX33.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-YGNVDYMB.mjs → chunk-YGSNWTGP.mjs} +4 -3
  60. package/dist/lib/node-esm/chunk-YGSNWTGP.mjs.map +7 -0
  61. package/dist/lib/node-esm/index.mjs +29 -18
  62. package/dist/lib/node-esm/index.mjs.map +3 -3
  63. package/dist/lib/node-esm/{intent-resolver-L2UGZ72W.mjs → intent-resolver-TNRIFHNH.mjs} +20 -18
  64. package/dist/lib/node-esm/intent-resolver-TNRIFHNH.mjs.map +7 -0
  65. package/dist/lib/node-esm/meta.json +1 -1
  66. package/dist/lib/node-esm/{react-surface-3JJSTTQP.mjs → react-surface-X2GV6WQH.mjs} +40 -33
  67. package/dist/lib/node-esm/react-surface-X2GV6WQH.mjs.map +7 -0
  68. package/dist/lib/node-esm/{settings-LBDWWPZJ.mjs → settings-KPLQ5ONI.mjs} +5 -5
  69. package/dist/lib/node-esm/{settings-LBDWWPZJ.mjs.map → settings-KPLQ5ONI.mjs.map} +1 -1
  70. package/dist/lib/node-esm/{state-UIHO2SFZ.mjs → state-W3PECOJX.mjs} +5 -5
  71. package/dist/lib/node-esm/state-W3PECOJX.mjs.map +7 -0
  72. package/dist/lib/node-esm/toolkit-GUBDYF72.mjs +77 -0
  73. package/dist/lib/node-esm/toolkit-GUBDYF72.mjs.map +7 -0
  74. package/dist/lib/node-esm/types/index.mjs +2 -2
  75. package/dist/types/src/MarkdownPlugin.d.ts +1 -1
  76. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  77. package/dist/types/src/capabilities/anchor-sort.d.ts +2 -2
  78. package/dist/types/src/capabilities/app-graph-serializer.d.ts +1 -1
  79. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -1
  80. package/dist/types/src/capabilities/artifact-definition.d.ts +1 -9
  81. package/dist/types/src/capabilities/artifact-definition.d.ts.map +1 -1
  82. package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -0
  83. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  84. package/dist/types/src/capabilities/capabilities.d.ts +1 -1
  85. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  86. package/dist/types/src/capabilities/index.d.ts +12 -10
  87. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  88. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  89. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  90. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  91. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  92. package/dist/types/src/capabilities/settings.d.ts +1 -1
  93. package/dist/types/src/capabilities/state.d.ts +2 -2
  94. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  95. package/dist/types/src/capabilities/toolkit.d.ts +4 -0
  96. package/dist/types/src/capabilities/toolkit.d.ts.map +1 -0
  97. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts +7 -0
  98. package/dist/types/src/components/MarkdownCard/MarkdownCard.d.ts.map +1 -0
  99. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts +9 -0
  100. package/dist/types/src/components/MarkdownCard/MarkdownCard.stories.d.ts.map +1 -0
  101. package/dist/types/src/components/MarkdownCard/index.d.ts +4 -0
  102. package/dist/types/src/components/MarkdownCard/index.d.ts.map +1 -0
  103. package/dist/types/src/components/MarkdownContainer.d.ts +1 -1
  104. package/dist/types/src/components/MarkdownContainer.d.ts.map +1 -1
  105. package/dist/types/src/components/MarkdownContainer.stories.d.ts +51 -5
  106. package/dist/types/src/components/MarkdownContainer.stories.d.ts.map +1 -1
  107. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts +1 -1
  108. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.d.ts.map +1 -1
  109. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts +111 -13
  110. package/dist/types/src/components/MarkdownEditor/MarkdownEditor.stories.d.ts.map +1 -1
  111. package/dist/types/src/components/MarkdownSettings/MarkdownSettings.d.ts.map +1 -1
  112. package/dist/types/src/components/Suggestions.stories.d.ts +1 -2
  113. package/dist/types/src/components/Suggestions.stories.d.ts.map +1 -1
  114. package/dist/types/src/components/Toolbar.stories.d.ts +45 -8
  115. package/dist/types/src/components/Toolbar.stories.d.ts.map +1 -1
  116. package/dist/types/src/components/index.d.ts +1 -1
  117. package/dist/types/src/components/index.d.ts.map +1 -1
  118. package/dist/types/src/extensions.d.ts +0 -2
  119. package/dist/types/src/extensions.d.ts.map +1 -1
  120. package/dist/types/src/functions/diff.d.ts +6 -0
  121. package/dist/types/src/functions/diff.d.ts.map +1 -0
  122. package/dist/types/src/functions/index.d.ts +3 -0
  123. package/dist/types/src/functions/index.d.ts.map +1 -0
  124. package/dist/types/src/functions/open.d.ts +7 -0
  125. package/dist/types/src/functions/open.d.ts.map +1 -0
  126. package/dist/types/src/hooks/useSelectCurrentThread.d.ts +1 -1
  127. package/dist/types/src/hooks/useSelectCurrentThread.d.ts.map +1 -1
  128. package/dist/types/src/index.d.ts +2 -1
  129. package/dist/types/src/index.d.ts.map +1 -1
  130. package/dist/types/src/meta.d.ts +0 -1
  131. package/dist/types/src/meta.d.ts.map +1 -1
  132. package/dist/types/src/translations.d.ts +1 -0
  133. package/dist/types/src/translations.d.ts.map +1 -1
  134. package/dist/types/src/types/Markdown.d.ts +5 -5
  135. package/dist/types/src/types/Markdown.d.ts.map +1 -1
  136. package/dist/types/src/types/MarkdownAction.d.ts +5 -14
  137. package/dist/types/src/types/MarkdownAction.d.ts.map +1 -1
  138. package/dist/types/src/types/types.d.ts.map +1 -1
  139. package/dist/types/tsconfig.tsbuildinfo +1 -1
  140. package/package.json +59 -56
  141. package/src/MarkdownPlugin.tsx +102 -94
  142. package/src/capabilities/app-graph-serializer.ts +4 -4
  143. package/src/capabilities/artifact-definition.ts +15 -19
  144. package/src/capabilities/blueprint-definition.ts +39 -0
  145. package/src/capabilities/capabilities.ts +1 -1
  146. package/src/capabilities/index.ts +3 -1
  147. package/src/capabilities/intent-resolver.ts +14 -13
  148. package/src/capabilities/react-surface.tsx +5 -4
  149. package/src/capabilities/state.ts +3 -2
  150. package/src/capabilities/toolkit.ts +49 -0
  151. package/src/components/{MarkdownPreview/MarkdownPreview.stories.tsx → MarkdownCard/MarkdownCard.stories.tsx} +14 -15
  152. package/src/components/{MarkdownPreview/MarkdownPreview.tsx → MarkdownCard/MarkdownCard.tsx} +6 -4
  153. package/src/components/MarkdownCard/index.ts +9 -0
  154. package/src/components/MarkdownContainer.stories.tsx +47 -38
  155. package/src/components/MarkdownContainer.tsx +16 -13
  156. package/src/components/MarkdownEditor/MarkdownEditor.stories.tsx +21 -17
  157. package/src/components/MarkdownEditor/MarkdownEditor.tsx +36 -36
  158. package/src/components/MarkdownSettings/MarkdownSettings.tsx +77 -74
  159. package/src/components/Suggestions.stories.tsx +42 -41
  160. package/src/components/Toolbar.stories.tsx +23 -17
  161. package/src/components/index.ts +1 -1
  162. package/src/extensions.tsx +10 -38
  163. package/src/functions/diff.ts +37 -0
  164. package/src/functions/index.ts +6 -0
  165. package/src/functions/open.ts +32 -0
  166. package/src/hooks/useSelectCurrentThread.tsx +3 -3
  167. package/src/index.ts +3 -1
  168. package/src/meta.ts +0 -3
  169. package/src/translations.ts +1 -0
  170. package/src/types/Markdown.ts +4 -3
  171. package/src/types/MarkdownAction.ts +5 -6
  172. package/src/types/types.ts +1 -0
  173. package/dist/lib/browser/MarkdownContainer-NNBPE6A5.mjs.map +0 -7
  174. package/dist/lib/browser/MarkdownPreview-7VG3K24R.mjs.map +0 -7
  175. package/dist/lib/browser/app-graph-serializer-ZT5OVF5G.mjs.map +0 -7
  176. package/dist/lib/browser/artifact-definition-7VNP5PCP.mjs +0 -145
  177. package/dist/lib/browser/artifact-definition-7VNP5PCP.mjs.map +0 -7
  178. package/dist/lib/browser/chunk-K7ZFMSC4.mjs.map +0 -7
  179. package/dist/lib/browser/chunk-VCUKIILA.mjs +0 -20
  180. package/dist/lib/browser/chunk-VCUKIILA.mjs.map +0 -7
  181. package/dist/lib/browser/chunk-YHMGUSO7.mjs.map +0 -7
  182. package/dist/lib/browser/intent-resolver-EBEF7WEI.mjs.map +0 -7
  183. package/dist/lib/browser/react-surface-ZPMZT4VU.mjs.map +0 -7
  184. package/dist/lib/browser/state-ZA6PZPUI.mjs.map +0 -7
  185. package/dist/lib/node-esm/MarkdownContainer-Q6UO7DKT.mjs.map +0 -7
  186. package/dist/lib/node-esm/MarkdownPreview-UVWR2YK3.mjs.map +0 -7
  187. package/dist/lib/node-esm/app-graph-serializer-X4M5QEI6.mjs.map +0 -7
  188. package/dist/lib/node-esm/artifact-definition-IRIILD7S.mjs +0 -146
  189. package/dist/lib/node-esm/artifact-definition-IRIILD7S.mjs.map +0 -7
  190. package/dist/lib/node-esm/chunk-6GCOJS4Y.mjs.map +0 -7
  191. package/dist/lib/node-esm/chunk-A7LLVI34.mjs +0 -22
  192. package/dist/lib/node-esm/chunk-A7LLVI34.mjs.map +0 -7
  193. package/dist/lib/node-esm/chunk-YGNVDYMB.mjs.map +0 -7
  194. package/dist/lib/node-esm/intent-resolver-L2UGZ72W.mjs.map +0 -7
  195. package/dist/lib/node-esm/react-surface-3JJSTTQP.mjs.map +0 -7
  196. package/dist/lib/node-esm/state-UIHO2SFZ.mjs.map +0 -7
  197. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.d.ts +0 -6
  198. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.d.ts.map +0 -1
  199. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts +0 -10
  200. package/dist/types/src/components/MarkdownPreview/MarkdownPreview.stories.d.ts.map +0 -1
  201. package/dist/types/src/components/MarkdownPreview/index.d.ts +0 -4
  202. package/dist/types/src/components/MarkdownPreview/index.d.ts.map +0 -1
  203. package/src/components/MarkdownPreview/index.ts +0 -9
  204. /package/dist/lib/browser/{chunk-VMX5SDGW.mjs.map → chunk-XYQDM6PM.mjs.map} +0 -0
  205. /package/dist/lib/node-esm/{chunk-LZK3TLKM.mjs.map → chunk-IOC54NCF.mjs.map} +0 -0
@@ -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
  };
@@ -2,27 +2,19 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { type Meta } from '@storybook/react-vite';
8
- import { Match, Option, pipe, Schema } from 'effect';
6
+ import * as Function from 'effect/Function';
7
+ import * as Match from 'effect/Match';
8
+ import * as Option from 'effect/Option';
9
+ import * as Schema from 'effect/Schema';
9
10
  import React, { type FC, useEffect, useMemo, useState } from 'react';
10
11
 
11
- import {
12
- Capabilities,
13
- CollaborationActions,
14
- IntentPlugin,
15
- SettingsPlugin,
16
- contributes,
17
- createIntent,
18
- useCapability,
19
- useIntentDispatcher,
20
- } from '@dxos/app-framework';
12
+ import { Capabilities, IntentPlugin, SettingsPlugin, useCapability, useIntentDispatcher } from '@dxos/app-framework';
21
13
  import { withPluginManager } from '@dxos/app-framework/testing';
22
14
  import { Obj, Ref, Type } from '@dxos/echo';
23
15
  import { invariant } from '@dxos/invariant';
24
- import { DXN } from '@dxos/keys';
25
16
  import { ClientPlugin } from '@dxos/plugin-client';
17
+ import { GraphPlugin } from '@dxos/plugin-graph';
26
18
  import { PreviewPlugin } from '@dxos/plugin-preview';
27
19
  import { SpacePlugin } from '@dxos/plugin-space';
28
20
  import { StorybookLayoutPlugin } from '@dxos/plugin-storybook-layout';
@@ -30,19 +22,21 @@ import { ThemePlugin } from '@dxos/plugin-theme';
30
22
  import { faker } from '@dxos/random';
31
23
  import { createDocAccessor, fullyQualifiedId, toCursorRange, useQueue, useSpace } from '@dxos/react-client/echo';
32
24
  import { IconButton, Toolbar } from '@dxos/react-ui';
33
- import { command, type EditorSelection, type Range, useTextEditor } from '@dxos/react-ui-editor';
25
+ import { withTheme } from '@dxos/react-ui/testing';
26
+ import { type EditorSelection, type Range, useTextEditor } from '@dxos/react-ui-editor';
34
27
  import { StackItem } from '@dxos/react-ui-stack';
35
28
  import { defaultTx } from '@dxos/react-ui-theme';
36
29
  import { DataType } from '@dxos/schema';
37
- import { withLayout } from '@dxos/storybook-utils';
30
+ import { render } from '@dxos/storybook-utils';
38
31
 
39
- import { MarkdownContainer } from './MarkdownContainer';
40
- import { MarkdownPlugin } from '../MarkdownPlugin';
41
32
  import { MarkdownCapabilities } from '../capabilities';
33
+ import { MarkdownPlugin } from '../MarkdownPlugin';
42
34
  import { meta } from '../meta';
43
35
  import { translations } from '../translations';
44
36
  import { Markdown } from '../types';
45
37
 
38
+ import { MarkdownContainer } from './MarkdownContainer';
39
+
46
40
  faker.seed(1);
47
41
 
48
42
  const TestItem = Schema.Struct({
@@ -85,7 +79,7 @@ const TestChat: FC<{ doc: Markdown.Document; content: string }> = ({ doc, conten
85
79
 
86
80
  const text = await doc.content.load();
87
81
  const accessor = createDocAccessor(text, ['content']);
88
- const cursor = pipe(
82
+ const cursor = Function.pipe(
89
83
  editorState.getState(fullyQualifiedId(doc))?.selection,
90
84
  Option.fromNullable,
91
85
  Option.map(selectionToRange),
@@ -98,14 +92,14 @@ const TestChat: FC<{ doc: Markdown.Document; content: string }> = ({ doc, conten
98
92
  // const message = deref(ref);
99
93
  // }
100
94
 
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
- );
95
+ // void dispatch(
96
+ // createIntent(CollaborationActions.InsertContent, {
97
+ // target: doc as any as Type.Expando,
98
+ // object: Ref.fromDXN(new DXN(DXN.kind.QUEUE, [...queue.dxn.parts, message.id])),
99
+ // at: cursor,
100
+ // label: 'Proposal',
101
+ // }),
102
+ // );
109
103
  };
110
104
 
111
105
  return (
@@ -135,7 +129,7 @@ const DefaultStory = ({ document, chat }: { document: string; chat: string }) =>
135
129
  content: document.replaceAll(/\[(\w+)\]/g, (_, label) => {
136
130
  const obj = space.db.add(Obj.make(TestItem, { title: label, description: faker.lorem.paragraph() }));
137
131
  const dxn = Ref.make(obj).dxn.toString();
138
- return `[${label}][${dxn}]`;
132
+ return `[${label}](${dxn})`;
139
133
  }),
140
134
  }),
141
135
  );
@@ -144,45 +138,52 @@ const DefaultStory = ({ document, chat }: { document: string; chat: string }) =>
144
138
  }, [space]);
145
139
 
146
140
  if (!space || !doc) {
147
- return <></>;
141
+ return null;
148
142
  }
149
143
 
144
+ // TODO(burdon): Layout issue.
150
145
  return (
151
- <>
146
+ <div className='grid grid-cols-2 bs-full overflow-hidden'>
152
147
  <MarkdownContainer id={doc.id} object={doc} settings={settings} editorStateStore={editorState} />
153
148
  <TestChat doc={doc} content={chat} />
154
- </>
149
+ </div>
155
150
  );
156
151
  };
157
152
 
158
- // TODO(burdon): Make consistent.
159
153
  const storybook: Meta<typeof DefaultStory> = {
160
154
  title: 'plugins/plugin-markdown/Suggestions',
161
- render: DefaultStory,
155
+ render: render(DefaultStory),
162
156
  decorators: [
157
+ withTheme,
163
158
  withPluginManager({
164
159
  plugins: [
165
- ThemePlugin({ tx: defaultTx }),
166
- StorybookLayoutPlugin(),
167
160
  ClientPlugin({
168
161
  types: [Markdown.Document, TestItem],
169
- onClientInitialized: async (_, client) => {
162
+ onClientInitialized: async ({ client }) => {
170
163
  await client.halo.createIdentity();
171
164
  },
172
165
  }),
173
- SpacePlugin(),
174
- SettingsPlugin(),
166
+ SpacePlugin({}),
167
+ GraphPlugin(),
175
168
  IntentPlugin(),
169
+ SettingsPlugin(),
170
+
171
+ // UI
172
+ ThemePlugin({ tx: defaultTx }),
176
173
  MarkdownPlugin(),
177
174
  PreviewPlugin(),
175
+ StorybookLayoutPlugin({}),
178
176
  ],
179
- capabilities: [contributes(MarkdownCapabilities.Extensions, [() => command()])],
177
+ // TODO(thure): `commandDialog` doesn’t do anything without a `renderDialog` option.
178
+ // capabilities: [contributes(MarkdownCapabilities.Extensions, [() => commandDialog()])],
180
179
  }),
181
- withLayout({ fullscreen: true, classNames: 'grid grid-cols-2' }),
182
180
  ],
183
181
  parameters: {
182
+ layout: 'fullscreen',
183
+ controls: {
184
+ disable: true,
185
+ },
184
186
  translations,
185
- controls: { disable: true },
186
187
  },
187
188
  };
188
189
 
@@ -2,19 +2,20 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
- import { type Meta } from '@storybook/react-vite';
8
- import React, { type FC, useCallback, useState } from 'react';
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React, { useCallback, useState } from 'react';
9
7
 
8
+ import { createObject } from '@dxos/echo-db';
10
9
  import { invariant } from '@dxos/invariant';
11
10
  import { PublicKey } from '@dxos/keys';
12
11
  import { faker } from '@dxos/random';
13
12
  import { createDocAccessor } from '@dxos/react-client/echo';
14
13
  import { useThemeContext } from '@dxos/react-ui';
14
+ import { withTheme } from '@dxos/react-ui/testing';
15
15
  import {
16
- EditorToolbar,
17
16
  type Comment,
17
+ EditorToolbar,
18
+ type EditorViewMode,
18
19
  comments,
19
20
  createBasicExtensions,
20
21
  createDataExtensions,
@@ -25,19 +26,21 @@ 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
- import { withLayout, withTheme } from '@dxos/storybook-utils';
35
34
 
36
35
  faker.seed(101);
37
36
 
38
- const DefaultStory: FC<{ content?: string }> = ({ content = '' }) => {
37
+ type StoryProps = {
38
+ content?: string;
39
+ };
40
+
41
+ const DefaultStory = ({ content = '' }: StoryProps) => {
39
42
  const { themeMode } = useThemeContext();
40
- const [text] = useState(DataType.makeText(content));
43
+ const [text] = useState(createObject(DataType.makeText(content)));
41
44
  const toolbarState = useEditorToolbarState({ viewMode: 'preview' });
42
45
  const formattingObserver = useFormattingState(toolbarState);
43
46
  const { parentRef, view } = useTextEditor(() => {
@@ -47,7 +50,7 @@ const DefaultStory: FC<{ content?: string }> = ({ content = '' }) => {
47
50
  extensions: [
48
51
  formattingObserver,
49
52
  createBasicExtensions({ readOnly: toolbarState.viewMode === 'readonly' }),
50
- createMarkdownExtensions({ themeMode }),
53
+ createMarkdownExtensions(),
51
54
  createThemeExtensions({ themeMode, syntaxHighlighting: true, slots: editorSlots }),
52
55
  createDataExtensions({ id: text.id, text: createDocAccessor(text, ['content']) }),
53
56
  comments({
@@ -93,19 +96,22 @@ const content = [
93
96
  '',
94
97
  ].join('\n');
95
98
 
96
- const meta: Meta<typeof EditorToolbar> = {
99
+ const meta = {
97
100
  title: 'plugins/plugin-markdown/Toolbar',
98
- component: EditorToolbar,
99
- render: DefaultStory as any,
100
- decorators: [withTheme, withLayout({ fullscreen: true })],
101
+ component: EditorToolbar as any,
102
+ render: DefaultStory,
103
+ decorators: [withTheme],
101
104
  parameters: {
105
+ layout: 'fullscreen',
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,15 +38,10 @@ 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';
46
- import { isNotFalsy } from '@dxos/util';
44
+ import { isTruthy } from '@dxos/util';
47
45
 
48
46
  import { MarkdownCapabilities } from './capabilities';
49
47
  import { type Markdown } from './types';
@@ -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;
@@ -160,7 +157,7 @@ export const useExtensions = ({
160
157
  }),
161
158
  baseExtensions,
162
159
  pluginExtensions,
163
- ].filter(isNotFalsy),
160
+ ].filter(isTruthy),
164
161
  [baseExtensions, pluginExtensions, document, document?.content?.target, text, id, space, identity],
165
162
  );
166
163
  };
@@ -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[] => {
@@ -182,7 +178,7 @@ const createBaseExtensions = ({
182
178
  selectionManager && selectionChange(selectionManager),
183
179
  settings.editorInputMode && InputModeExtensions[settings.editorInputMode],
184
180
  settings.folding && folding(),
185
- ].filter(isNotFalsy);
181
+ ].filter(isTruthy);
186
182
 
187
183
  //
188
184
  // Markdown
@@ -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,37 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+ import * as Schema from 'effect/Schema';
7
+
8
+ import { ArtifactId, applyDiffs } from '@dxos/assistant';
9
+ import { createDocAccessor } from '@dxos/echo-db';
10
+ import { DatabaseService, defineFunction } from '@dxos/functions';
11
+ import { trim } from '@dxos/util';
12
+
13
+ import { Markdown } from '../types';
14
+
15
+ // TODO(wittjosiah): Reconcile with ThreadAction.AddProposal.
16
+ export default defineFunction({
17
+ key: 'dxos.org/function/markdown/diff',
18
+ name: 'Diff',
19
+ description: trim`
20
+ Applies a set of diffs to the markdown document.
21
+ `,
22
+ inputSchema: Schema.Struct({
23
+ id: ArtifactId.annotations({
24
+ description: 'The ID of the markdown document.',
25
+ }),
26
+ diffs: Schema.Array(Schema.String).annotations({
27
+ description: 'The diffs to apply to the document.',
28
+ }),
29
+ }),
30
+ outputSchema: Schema.Void,
31
+ handler: Effect.fn(function* ({ data: { id, diffs } }) {
32
+ const object = yield* DatabaseService.resolve(ArtifactId.toDXN(id), Markdown.Document);
33
+ const content = yield* Effect.promise(() => object.content.load());
34
+ const accessor = createDocAccessor(content, ['content']);
35
+ applyDiffs(accessor, diffs);
36
+ }),
37
+ });
@@ -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';
@@ -0,0 +1,32 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+ import * as Schema from 'effect/Schema';
7
+
8
+ import { ArtifactId } from '@dxos/assistant';
9
+ import { DatabaseService, defineFunction } from '@dxos/functions';
10
+
11
+ import { Markdown } from '../types';
12
+
13
+ export default defineFunction({
14
+ key: 'dxos.org/function/markdown/open',
15
+ name: 'Open',
16
+ description: 'Opens and reads the contents of a new markdown document.',
17
+ inputSchema: Schema.Struct({
18
+ id: ArtifactId.annotations({
19
+ description: 'The ID of the markdown document.',
20
+ }),
21
+ }),
22
+ outputSchema: Schema.Struct({
23
+ content: Schema.String,
24
+ }),
25
+ handler: Effect.fn(function* ({ data: { id } }) {
26
+ const object = yield* DatabaseService.resolve(ArtifactId.toDXN(id), Markdown.Document);
27
+ const { content } = yield* Effect.promise(() => object.content.load());
28
+ return {
29
+ content,
30
+ };
31
+ }),
32
+ });
@@ -3,10 +3,10 @@
3
3
  //
4
4
 
5
5
  import { EditorView } from '@codemirror/view';
6
- import { Schema } from 'effect';
6
+ import * as Schema from 'effect/Schema';
7
7
  import { useMemo } from 'react';
8
8
 
9
- import { createResolver, LayoutAction, useIntentResolver } from '@dxos/app-framework';
9
+ import { LayoutAction, createResolver, useIntentResolver } from '@dxos/app-framework';
10
10
  import { invariant } from '@dxos/invariant';
11
11
  import { Cursor, setSelection } from '@dxos/react-ui-editor';
12
12
 
@@ -15,7 +15,7 @@ import { meta } from '../meta';
15
15
  /**
16
16
  * Handle scrolling and selection of the current thread in a markdown editor.
17
17
  */
18
- export const useSelectCurrentThread = (editorView: EditorView | undefined, documentId: string) => {
18
+ export const useSelectCurrentThread = (editorView: EditorView | null, documentId: string) => {
19
19
  const scrollIntoViewResolver = useMemo(
20
20
  () =>
21
21
  createResolver({
package/src/index.ts CHANGED
@@ -5,6 +5,8 @@
5
5
  export { MarkdownCapabilities } from './capabilities';
6
6
  export { MarkdownEvents } from './events';
7
7
 
8
- export * from './MarkdownPlugin';
9
8
  export * from './meta';
9
+ export * from './types';
10
10
  export * from './util';
11
+
12
+ export * from './MarkdownPlugin';