@dxos/plugin-markdown 0.7.4-staging.f7e8224 → 0.7.5-feature-compute.4d9d99a

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 (175) hide show
  1. package/dist/lib/browser/{MarkdownContainer-6OPC5MKP.mjs → MarkdownContainer-ARRY4I6S.mjs} +175 -126
  2. package/dist/lib/browser/MarkdownContainer-ARRY4I6S.mjs.map +7 -0
  3. package/dist/lib/browser/app-graph-serializer-HHWSLYIW.mjs +51 -0
  4. package/dist/lib/browser/app-graph-serializer-HHWSLYIW.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-TZN5FGB2.mjs → chunk-ADAYSA5G.mjs} +24 -13
  6. package/dist/lib/browser/chunk-ADAYSA5G.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-EMIIXXVX.mjs +66 -0
  8. package/dist/lib/browser/chunk-EMIIXXVX.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-FSAYVXSE.mjs +16 -0
  10. package/dist/lib/browser/chunk-FSAYVXSE.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-4X6YX3KU.mjs → chunk-YB2TJFNH.mjs} +3 -3
  12. package/dist/lib/browser/chunk-YB2TJFNH.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-YPDWX3WI.mjs +47 -0
  14. package/dist/lib/browser/chunk-YPDWX3WI.mjs.map +7 -0
  15. package/dist/lib/browser/index.mjs +99 -452
  16. package/dist/lib/browser/index.mjs.map +4 -4
  17. package/dist/lib/browser/intent-resolver-4KWMUMND.mjs +37 -0
  18. package/dist/lib/browser/intent-resolver-4KWMUMND.mjs.map +7 -0
  19. package/dist/lib/browser/meta.json +1 -1
  20. package/dist/lib/browser/react-surface-RL4CISJZ.mjs +152 -0
  21. package/dist/lib/browser/react-surface-RL4CISJZ.mjs.map +7 -0
  22. package/dist/lib/browser/settings-PTF73JDL.mjs +28 -0
  23. package/dist/lib/browser/settings-PTF73JDL.mjs.map +7 -0
  24. package/dist/lib/browser/state-DOVZP7XJ.mjs +37 -0
  25. package/dist/lib/browser/state-DOVZP7XJ.mjs.map +7 -0
  26. package/dist/lib/browser/thread-G4RS7NBZ.mjs +36 -0
  27. package/dist/lib/browser/thread-G4RS7NBZ.mjs.map +7 -0
  28. package/dist/lib/browser/types/index.mjs +4 -4
  29. package/dist/lib/node/{MarkdownContainer-6OKJOHTZ.cjs → MarkdownContainer-TV6W64EN.cjs} +167 -120
  30. package/dist/lib/node/MarkdownContainer-TV6W64EN.cjs.map +7 -0
  31. package/dist/lib/node/app-graph-serializer-PJRST43Q.cjs +62 -0
  32. package/dist/lib/node/app-graph-serializer-PJRST43Q.cjs.map +7 -0
  33. package/dist/lib/node/chunk-34WFGSZU.cjs +86 -0
  34. package/dist/lib/node/chunk-34WFGSZU.cjs.map +7 -0
  35. package/dist/lib/node/chunk-7WZANRNS.cjs +64 -0
  36. package/dist/lib/node/chunk-7WZANRNS.cjs.map +7 -0
  37. package/dist/lib/node/{meta.cjs → chunk-G7WKHUGU.cjs} +13 -8
  38. package/dist/lib/node/chunk-G7WKHUGU.cjs.map +7 -0
  39. package/dist/lib/node/{chunk-PHHIPRJC.cjs → chunk-HTWAAR54.cjs} +7 -7
  40. package/dist/lib/node/chunk-HTWAAR54.cjs.map +7 -0
  41. package/dist/lib/node/{chunk-KEPAM4JP.cjs → chunk-UFFFUC6W.cjs} +39 -14
  42. package/dist/lib/node/chunk-UFFFUC6W.cjs.map +7 -0
  43. package/dist/lib/node/index.cjs +90 -450
  44. package/dist/lib/node/index.cjs.map +4 -4
  45. package/dist/lib/node/intent-resolver-QN25AFOP.cjs +50 -0
  46. package/dist/lib/node/intent-resolver-QN25AFOP.cjs.map +7 -0
  47. package/dist/lib/node/meta.json +1 -1
  48. package/dist/lib/node/react-surface-RZ2XV56V.cjs +165 -0
  49. package/dist/lib/node/react-surface-RZ2XV56V.cjs.map +7 -0
  50. package/dist/lib/node/settings-BO5P5R4I.cjs +42 -0
  51. package/dist/lib/node/settings-BO5P5R4I.cjs.map +7 -0
  52. package/dist/lib/node/state-F26NQP7F.cjs +51 -0
  53. package/dist/lib/node/state-F26NQP7F.cjs.map +7 -0
  54. package/dist/lib/node/thread-THWQ67WS.cjs +52 -0
  55. package/dist/lib/node/thread-THWQ67WS.cjs.map +7 -0
  56. package/dist/lib/node/types/index.cjs +7 -7
  57. package/dist/lib/node/types/index.cjs.map +1 -1
  58. package/dist/lib/node-esm/{MarkdownContainer-GBNSGROQ.mjs → MarkdownContainer-3ZHQTTMQ.mjs} +175 -126
  59. package/dist/lib/node-esm/MarkdownContainer-3ZHQTTMQ.mjs.map +7 -0
  60. package/dist/lib/node-esm/app-graph-serializer-JTHJUUS2.mjs +52 -0
  61. package/dist/lib/node-esm/app-graph-serializer-JTHJUUS2.mjs.map +7 -0
  62. package/dist/lib/node-esm/chunk-2GHK262V.mjs +17 -0
  63. package/dist/lib/node-esm/chunk-2GHK262V.mjs.map +7 -0
  64. package/dist/lib/node-esm/{chunk-BABK7FMW.mjs → chunk-AOKWCL3O.mjs} +3 -3
  65. package/dist/lib/node-esm/chunk-AOKWCL3O.mjs.map +7 -0
  66. package/dist/lib/node-esm/chunk-CDFNMFGT.mjs +67 -0
  67. package/dist/lib/node-esm/chunk-CDFNMFGT.mjs.map +7 -0
  68. package/dist/lib/node-esm/chunk-HLP536EW.mjs +48 -0
  69. package/dist/lib/node-esm/chunk-HLP536EW.mjs.map +7 -0
  70. package/dist/lib/node-esm/{chunk-NUMUUCYF.mjs → chunk-Y5RSQVGH.mjs} +24 -13
  71. package/dist/lib/node-esm/chunk-Y5RSQVGH.mjs.map +7 -0
  72. package/dist/lib/node-esm/index.mjs +99 -452
  73. package/dist/lib/node-esm/index.mjs.map +4 -4
  74. package/dist/lib/node-esm/intent-resolver-F7MQOTG7.mjs +38 -0
  75. package/dist/lib/node-esm/intent-resolver-F7MQOTG7.mjs.map +7 -0
  76. package/dist/lib/node-esm/meta.json +1 -1
  77. package/dist/lib/node-esm/react-surface-RRXHEW4R.mjs +153 -0
  78. package/dist/lib/node-esm/react-surface-RRXHEW4R.mjs.map +7 -0
  79. package/dist/lib/node-esm/settings-E7P5FQ3F.mjs +29 -0
  80. package/dist/lib/node-esm/settings-E7P5FQ3F.mjs.map +7 -0
  81. package/dist/lib/node-esm/state-HXSOQNOV.mjs +38 -0
  82. package/dist/lib/node-esm/state-HXSOQNOV.mjs.map +7 -0
  83. package/dist/lib/node-esm/thread-CYEXBXTW.mjs +37 -0
  84. package/dist/lib/node-esm/thread-CYEXBXTW.mjs.map +7 -0
  85. package/dist/lib/node-esm/types/index.mjs +4 -4
  86. package/dist/types/src/MarkdownPlugin.d.ts +1 -3
  87. package/dist/types/src/MarkdownPlugin.d.ts.map +1 -1
  88. package/dist/types/src/capabilities/app-graph-serializer.d.ts +4 -0
  89. package/dist/types/src/capabilities/app-graph-serializer.d.ts.map +1 -0
  90. package/dist/types/src/capabilities/capabilities.d.ts +12 -0
  91. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -0
  92. package/dist/types/src/capabilities/index.d.ts +16 -0
  93. package/dist/types/src/capabilities/index.d.ts.map +1 -0
  94. package/dist/types/src/capabilities/intent-resolver.d.ts +4 -0
  95. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -0
  96. package/dist/types/src/capabilities/react-surface.d.ts +4 -0
  97. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  98. package/dist/types/src/capabilities/settings.d.ts +4 -0
  99. package/dist/types/src/capabilities/settings.d.ts.map +1 -0
  100. package/dist/types/src/capabilities/state.d.ts +11 -0
  101. package/dist/types/src/capabilities/state.d.ts.map +1 -0
  102. package/dist/types/src/capabilities/thread.d.ts +6 -0
  103. package/dist/types/src/capabilities/thread.d.ts.map +1 -0
  104. package/dist/types/src/components/MarkdownContainer.d.ts +1 -1
  105. package/dist/types/src/components/MarkdownContainer.d.ts.map +1 -1
  106. package/dist/types/src/components/MarkdownEditor.d.ts +15 -0
  107. package/dist/types/src/components/MarkdownEditor.d.ts.map +1 -1
  108. package/dist/types/src/components/MarkdownEditor.stories.d.ts.map +1 -1
  109. package/dist/types/src/components/Toolbar.stories.d.ts +2 -2
  110. package/dist/types/src/components/Toolbar.stories.d.ts.map +1 -1
  111. package/dist/types/src/components/index.d.ts +1 -1
  112. package/dist/types/src/components/index.d.ts.map +1 -1
  113. package/dist/types/src/extensions.d.ts +4 -4
  114. package/dist/types/src/extensions.d.ts.map +1 -1
  115. package/dist/types/src/hooks/useSelectCurrentThread.d.ts.map +1 -1
  116. package/dist/types/src/index.d.ts +2 -3
  117. package/dist/types/src/index.d.ts.map +1 -1
  118. package/dist/types/src/meta.d.ts +1 -2
  119. package/dist/types/src/meta.d.ts.map +1 -1
  120. package/dist/types/src/translations.d.ts +3 -0
  121. package/dist/types/src/translations.d.ts.map +1 -1
  122. package/dist/types/src/types/index.d.ts +1 -1
  123. package/dist/types/src/types/index.d.ts.map +1 -1
  124. package/dist/types/src/types/schema.d.ts +75 -0
  125. package/dist/types/src/types/schema.d.ts.map +1 -0
  126. package/dist/types/src/types/types.d.ts +40 -35
  127. package/dist/types/src/types/types.d.ts.map +1 -1
  128. package/dist/types/src/util.d.ts +1 -5
  129. package/dist/types/src/util.d.ts.map +1 -1
  130. package/dist/types/tsconfig.tsbuildinfo +1 -0
  131. package/package.json +33 -37
  132. package/src/MarkdownPlugin.tsx +84 -283
  133. package/src/capabilities/app-graph-serializer.ts +50 -0
  134. package/src/capabilities/capabilities.ts +20 -0
  135. package/src/capabilities/index.ts +14 -0
  136. package/src/capabilities/intent-resolver.ts +27 -0
  137. package/src/capabilities/react-surface.tsx +73 -0
  138. package/src/capabilities/settings.ts +25 -0
  139. package/src/capabilities/state.ts +31 -0
  140. package/src/capabilities/thread.ts +34 -0
  141. package/src/components/MarkdownContainer.tsx +14 -10
  142. package/src/components/MarkdownEditor.stories.tsx +16 -5
  143. package/src/components/MarkdownEditor.tsx +87 -61
  144. package/src/components/Toolbar.stories.tsx +16 -22
  145. package/src/extensions.tsx +21 -19
  146. package/src/hooks/useSelectCurrentThread.tsx +17 -14
  147. package/src/index.ts +2 -5
  148. package/src/meta.ts +1 -1
  149. package/src/translations.ts +1 -0
  150. package/src/types/index.ts +1 -1
  151. package/src/types/{document.ts → schema.ts} +4 -7
  152. package/src/types/types.ts +36 -58
  153. package/src/util.tsx +5 -11
  154. package/dist/lib/browser/MarkdownContainer-6OPC5MKP.mjs.map +0 -7
  155. package/dist/lib/browser/chunk-4X6YX3KU.mjs.map +0 -7
  156. package/dist/lib/browser/chunk-CMSUKMPM.mjs +0 -41
  157. package/dist/lib/browser/chunk-CMSUKMPM.mjs.map +0 -7
  158. package/dist/lib/browser/chunk-TZN5FGB2.mjs.map +0 -7
  159. package/dist/lib/browser/meta.mjs +0 -9
  160. package/dist/lib/browser/meta.mjs.map +0 -7
  161. package/dist/lib/node/MarkdownContainer-6OKJOHTZ.cjs.map +0 -7
  162. package/dist/lib/node/chunk-KEPAM4JP.cjs.map +0 -7
  163. package/dist/lib/node/chunk-PHHIPRJC.cjs.map +0 -7
  164. package/dist/lib/node/chunk-YGMWZIIJ.cjs +0 -61
  165. package/dist/lib/node/chunk-YGMWZIIJ.cjs.map +0 -7
  166. package/dist/lib/node/meta.cjs.map +0 -7
  167. package/dist/lib/node-esm/MarkdownContainer-GBNSGROQ.mjs.map +0 -7
  168. package/dist/lib/node-esm/chunk-BABK7FMW.mjs.map +0 -7
  169. package/dist/lib/node-esm/chunk-ERJ52KN2.mjs +0 -42
  170. package/dist/lib/node-esm/chunk-ERJ52KN2.mjs.map +0 -7
  171. package/dist/lib/node-esm/chunk-NUMUUCYF.mjs.map +0 -7
  172. package/dist/lib/node-esm/meta.mjs +0 -10
  173. package/dist/lib/node-esm/meta.mjs.map +0 -7
  174. package/dist/types/src/types/document.d.ts +0 -106
  175. package/dist/types/src/types/document.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../src/util.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAGtE,OAAO,EAAE,YAAY,EAAE,KAAK,kBAAkB,EAAE,KAAK,yBAAyB,EAAY,MAAM,SAAS,CAAC;AAE1G,eAAO,MAAM,oBAAoB,SAAU,OAAO,KAAG,IAAI,IAAI,kBAKhD,CAAC;AAEd,KAAK,uBAAuB,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAC;AAEjE,eAAO,MAAM,wBAAwB,YAAa,MAAM,EAAE,KAAG,uBAAuB,EAEnF,CAAC;AAIF,eAAO,MAAM,eAAe,YAAa,MAAM,WAE9C,CAAC;AAEF,eAAO,MAAM,eAAe,0BAKrB,CAAC;AAER,eAAO,MAAM,UAAU,EAAE,qBAAqB,CAAC,YAAY,CAY1D,CAAC"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../src/util.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAItE,OAAO,EAAE,YAAY,EAAE,KAAK,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAEhE,eAAO,MAAM,oBAAoB,SAAU,OAAO,KAAG,IAAI,IAAI,kBAKhD,CAAC;AAId,eAAO,MAAM,eAAe,YAAa,MAAM,WAE9C,CAAC;AAEF,eAAO,MAAM,eAAe,0BAKrB,CAAC;AAER,eAAO,MAAM,UAAU,EAAE,qBAAqB,CAAC,YAAY,CAY1D,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":"5.7.2"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/plugin-markdown",
3
- "version": "0.7.4-staging.f7e8224",
3
+ "version": "0.7.5-feature-compute.4d9d99a",
4
4
  "description": "DXOS Surface plugin for interacting with Markdown",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -13,11 +13,6 @@
13
13
  "browser": "./dist/lib/browser/index.mjs",
14
14
  "node": "./dist/lib/node-esm/index.mjs"
15
15
  },
16
- "./meta": {
17
- "types": "./dist/types/src/meta.d.ts",
18
- "browser": "./dist/lib/browser/meta.mjs",
19
- "node": "./dist/lib/node-esm/meta.mjs"
20
- },
21
16
  "./types": {
22
17
  "types": "./dist/types/src/types/index.d.ts",
23
18
  "browser": "./dist/lib/browser/types/index.mjs",
@@ -27,9 +22,6 @@
27
22
  "types": "dist/types/src/index.d.ts",
28
23
  "typesVersions": {
29
24
  "*": {
30
- "meta": [
31
- "dist/types/src/meta.d.ts"
32
- ],
33
25
  "types": [
34
26
  "dist/types/src/types/index.d.ts"
35
27
  ]
@@ -44,28 +36,31 @@
44
36
  "@codemirror/view": "^6.34.1",
45
37
  "@effect/schema": "^0.75.5",
46
38
  "@preact/signals-core": "^1.6.0",
47
- "@dxos/app-framework": "0.7.4-staging.f7e8224",
48
- "@dxos/async": "0.7.4-staging.f7e8224",
49
- "@dxos/echo-schema": "0.7.4-staging.f7e8224",
50
- "@dxos/invariant": "0.7.4-staging.f7e8224",
51
- "@dxos/live-object": "0.7.4-staging.f7e8224",
52
- "@dxos/log": "0.7.4-staging.f7e8224",
53
- "@dxos/local-storage": "0.7.4-staging.f7e8224",
54
- "@dxos/keys": "0.7.4-staging.f7e8224",
55
- "@dxos/plugin-attention": "0.7.4-staging.f7e8224",
56
- "@dxos/plugin-client": "0.7.4-staging.f7e8224",
57
- "@dxos/plugin-graph": "0.7.4-staging.f7e8224",
58
- "@dxos/react-client": "0.7.4-staging.f7e8224",
59
- "@dxos/plugin-space": "0.7.4-staging.f7e8224",
60
- "@dxos/react-hooks": "0.7.4-staging.f7e8224",
61
- "@dxos/plugin-theme": "0.7.4-staging.f7e8224",
62
- "@dxos/react-ui-attention": "0.7.4-staging.f7e8224",
63
- "@dxos/react-ui-card": "0.7.4-staging.f7e8224",
64
- "@dxos/react-ui-form": "0.7.4-staging.f7e8224",
65
- "@dxos/react-ui-editor": "0.7.4-staging.f7e8224",
66
- "@dxos/react-ui-mosaic": "0.7.4-staging.f7e8224",
67
- "@dxos/react-ui-stack": "0.7.4-staging.f7e8224",
68
- "@dxos/util": "0.7.4-staging.f7e8224"
39
+ "effect": "^3.12.3",
40
+ "react-dropzone": "^14.2.3",
41
+ "@dxos/app-framework": "0.7.5-feature-compute.4d9d99a",
42
+ "@dxos/echo-schema": "0.7.5-feature-compute.4d9d99a",
43
+ "@dxos/async": "0.7.5-feature-compute.4d9d99a",
44
+ "@dxos/invariant": "0.7.5-feature-compute.4d9d99a",
45
+ "@dxos/keys": "0.7.5-feature-compute.4d9d99a",
46
+ "@dxos/live-object": "0.7.5-feature-compute.4d9d99a",
47
+ "@dxos/local-storage": "0.7.5-feature-compute.4d9d99a",
48
+ "@dxos/log": "0.7.5-feature-compute.4d9d99a",
49
+ "@dxos/plugin-attention": "0.7.5-feature-compute.4d9d99a",
50
+ "@dxos/plugin-client": "0.7.5-feature-compute.4d9d99a",
51
+ "@dxos/plugin-graph": "0.7.5-feature-compute.4d9d99a",
52
+ "@dxos/plugin-theme": "0.7.5-feature-compute.4d9d99a",
53
+ "@dxos/plugin-space": "0.7.5-feature-compute.4d9d99a",
54
+ "@dxos/react-client": "0.7.5-feature-compute.4d9d99a",
55
+ "@dxos/react-hooks": "0.7.5-feature-compute.4d9d99a",
56
+ "@dxos/react-ui-attention": "0.7.5-feature-compute.4d9d99a",
57
+ "@dxos/react-ui-card": "0.7.5-feature-compute.4d9d99a",
58
+ "@dxos/react-ui-form": "0.7.5-feature-compute.4d9d99a",
59
+ "@dxos/react-ui-editor": "0.7.5-feature-compute.4d9d99a",
60
+ "@dxos/react-ui-stack": "0.7.5-feature-compute.4d9d99a",
61
+ "@dxos/react-ui-mosaic": "0.7.5-feature-compute.4d9d99a",
62
+ "@dxos/schema": "0.7.5-feature-compute.4d9d99a",
63
+ "@dxos/util": "0.7.5-feature-compute.4d9d99a"
69
64
  },
70
65
  "devDependencies": {
71
66
  "@phosphor-icons/react": "^2.1.5",
@@ -74,17 +69,18 @@
74
69
  "react": "~18.2.0",
75
70
  "react-dom": "~18.2.0",
76
71
  "vite": "5.4.7",
77
- "@dxos/react-ui": "0.7.4-staging.f7e8224",
78
- "@dxos/random": "0.7.4-staging.f7e8224",
79
- "@dxos/react-ui-theme": "0.7.4-staging.f7e8224",
80
- "@dxos/storybook-utils": "0.7.4-staging.f7e8224"
72
+ "@dxos/debug": "0.7.5-feature-compute.4d9d99a",
73
+ "@dxos/random": "0.7.5-feature-compute.4d9d99a",
74
+ "@dxos/react-ui": "0.7.5-feature-compute.4d9d99a",
75
+ "@dxos/react-ui-theme": "0.7.5-feature-compute.4d9d99a",
76
+ "@dxos/storybook-utils": "0.7.5-feature-compute.4d9d99a"
81
77
  },
82
78
  "peerDependencies": {
83
79
  "@phosphor-icons/react": "^2.1.5",
84
80
  "react": "~18.2.0",
85
81
  "react-dom": "~18.2.0",
86
- "@dxos/react-ui": "0.7.4-staging.f7e8224",
87
- "@dxos/react-ui-theme": "0.7.4-staging.f7e8224"
82
+ "@dxos/react-ui": "0.7.5-feature-compute.4d9d99a",
83
+ "@dxos/react-ui-theme": "0.7.5-feature-compute.4d9d99a"
88
84
  },
89
85
  "publishConfig": {
90
86
  "access": "public"
@@ -1,89 +1,60 @@
1
1
  //
2
- // Copyright 2023 DXOS.org
2
+ // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { TextAa } from '@phosphor-icons/react';
6
- import React from 'react';
7
-
8
- import { parseIntentPlugin, resolvePlugin, NavigationAction, type PluginDefinition } from '@dxos/app-framework';
9
- import { create } from '@dxos/live-object';
10
- import { LocalStorageStore } from '@dxos/local-storage';
11
- import { parseClientPlugin } from '@dxos/plugin-client';
12
- import { type ActionGroup, createExtension, isActionGroup } from '@dxos/plugin-graph';
13
- import { SpaceAction } from '@dxos/plugin-space';
14
- import { CollectionType } from '@dxos/plugin-space/types';
15
- import {
16
- createDocAccessor,
17
- fullyQualifiedId,
18
- getRangeFromCursor,
19
- isSpace,
20
- loadObjectReferences,
21
- } from '@dxos/react-client/echo';
22
5
  import {
23
- type EditorInputMode,
24
- type EditorViewMode,
25
- EditorViewModes,
26
- translations as editorTranslations,
27
- createEditorStateStore,
28
- } from '@dxos/react-ui-editor';
6
+ Capabilities,
7
+ contributes,
8
+ createIntent,
9
+ defineModule,
10
+ definePlugin,
11
+ Events,
12
+ oneOf,
13
+ } from '@dxos/app-framework';
14
+ import { type BaseObject } from '@dxos/echo-schema';
15
+ import { RefArray } from '@dxos/live-object';
16
+ import { ClientCapabilities, ClientEvents } from '@dxos/plugin-client';
17
+ import { translations as editorTranslations } from '@dxos/react-ui-editor';
18
+ import { TextType } from '@dxos/schema';
29
19
 
30
- import { MarkdownContainer, MarkdownSettings } from './components';
31
- import meta, { MARKDOWN_PLUGIN } from './meta';
32
- import translations from './translations';
33
- import { DocumentType, isEditorModel, TextType } from './types';
34
20
  import {
35
- type MarkdownPluginProvides,
36
- type MarkdownSettingsProps,
37
- MarkdownAction,
38
- type MarkdownPluginState,
39
- } from './types';
40
- import { markdownExtensionPlugins, serializer } from './util';
41
-
42
- // TODO(burdon): Normalize active/object.
43
- const getDoc = (object: any) => (object instanceof DocumentType ? object : undefined);
44
-
45
- export const MarkdownPlugin = (): PluginDefinition<MarkdownPluginProvides> => {
46
- const settings = new LocalStorageStore<MarkdownSettingsProps>(MARKDOWN_PLUGIN, {
47
- defaultViewMode: 'preview',
48
- toolbar: true,
49
- numberedHeadings: true,
50
- folding: true,
51
- experimental: false,
52
- });
53
-
54
- const editorStateStore = createEditorStateStore(`${MARKDOWN_PLUGIN}/editor`);
55
-
56
- const state = new LocalStorageStore<MarkdownPluginState>(MARKDOWN_PLUGIN, { extensionProviders: [], viewMode: {} });
57
-
58
- const getViewMode = (id: string) => (id && state.values.viewMode[id]) || settings.values.defaultViewMode;
59
- const setViewMode = (id: string, viewMode: EditorViewMode) => (state.values.viewMode[id] = viewMode);
60
-
61
- return {
62
- meta,
63
- ready: async (plugins) => {
64
- settings
65
- .prop({ key: 'defaultViewMode', type: LocalStorageStore.enum<EditorViewMode>() })
66
- .prop({ key: 'editorInputMode', type: LocalStorageStore.enum<EditorInputMode>({ allowUndefined: true }) })
67
- .prop({ key: 'toolbar', type: LocalStorageStore.bool({ allowUndefined: true }) })
68
- .prop({ key: 'experimental', type: LocalStorageStore.bool({ allowUndefined: true }) })
69
- .prop({ key: 'debug', type: LocalStorageStore.bool({ allowUndefined: true }) })
70
- .prop({ key: 'typewriter', type: LocalStorageStore.string({ allowUndefined: true }) })
71
- .prop({ key: 'numberedHeadings', type: LocalStorageStore.bool({ allowUndefined: true }) })
72
- .prop({ key: 'folding', type: LocalStorageStore.bool({ allowUndefined: true }) });
73
-
74
- state.prop({ key: 'viewMode', type: LocalStorageStore.json<{ [key: string]: EditorViewMode }>() });
75
-
76
- markdownExtensionPlugins(plugins).forEach((plugin) => {
77
- const { extensions } = plugin.provides.markdown;
78
- state.values.extensionProviders?.push(extensions);
79
- });
80
- },
81
- provides: {
82
- settings: settings.values,
83
- metadata: {
84
- records: {
85
- [DocumentType.typename]: {
86
- createObject: MarkdownAction.CREATE,
21
+ MarkdownState,
22
+ MarkdownSettings,
23
+ ReactSurface,
24
+ IntentResolver,
25
+ AppGraphSerializer,
26
+ Thread,
27
+ } from './capabilities';
28
+ import { MARKDOWN_PLUGIN, meta } from './meta';
29
+ import translations from './translations';
30
+ import { DocumentType, MarkdownAction } from './types';
31
+ import { serializer } from './util';
32
+
33
+ export const MarkdownPlugin = () =>
34
+ definePlugin(meta, [
35
+ defineModule({
36
+ id: `${meta.id}/module/settings`,
37
+ activatesOn: Events.SetupSettings,
38
+ activate: MarkdownSettings,
39
+ }),
40
+ defineModule({
41
+ id: `${meta.id}/module/state`,
42
+ activatesOn: Events.Startup,
43
+ activate: MarkdownState,
44
+ }),
45
+ defineModule({
46
+ id: `${meta.id}/module/translations`,
47
+ activatesOn: Events.SetupTranslations,
48
+ activate: () => contributes(Capabilities.Translations, [...translations, ...editorTranslations]),
49
+ }),
50
+ defineModule({
51
+ id: `${meta.id}/module/metadata`,
52
+ activatesOn: oneOf(Events.Startup, Events.SetupAppGraph),
53
+ activate: () =>
54
+ contributes(Capabilities.Metadata, {
55
+ id: DocumentType.typename,
56
+ metadata: {
57
+ createObject: (props: { name?: string }) => createIntent(MarkdownAction.Create, props),
87
58
  label: (object: any) => (object instanceof DocumentType ? object.name || object.fallbackName : undefined),
88
59
  placeholder: ['document title placeholder', { ns: MARKDOWN_PLUGIN }],
89
60
  icon: 'ph--text-aa--regular',
@@ -91,208 +62,38 @@ export const MarkdownPlugin = (): PluginDefinition<MarkdownPluginProvides> => {
91
62
  managesAutofocus: true,
92
63
  },
93
64
  // TODO(wittjosiah): Move out of metadata.
94
- loadReferences: (doc: DocumentType) => loadObjectReferences(doc, (doc) => [doc.content, ...doc.threads]),
65
+ loadReferences: async (doc: DocumentType) =>
66
+ await RefArray.loadAll<BaseObject>([doc.content, ...doc.threads]),
95
67
  serializer,
96
68
  },
97
- },
98
- },
99
- translations: [...translations, ...editorTranslations],
100
- echo: {
101
- schema: [DocumentType],
102
- system: [TextType],
103
- },
104
- graph: {
105
- builder: (plugins) => {
106
- const client = resolvePlugin(plugins, parseClientPlugin)?.provides.client;
107
- const dispatch = resolvePlugin(plugins, parseIntentPlugin)?.provides.intent.dispatch;
108
- if (!client || !dispatch) {
109
- return [];
110
- }
111
-
112
- return createExtension({
113
- id: MarkdownAction.CREATE,
114
- filter: (node): node is ActionGroup => isActionGroup(node) && node.id.startsWith(SpaceAction.ADD_OBJECT),
115
- actions: ({ node }) => {
116
- const id = node.id.split('/').at(-1);
117
- const [spaceId, objectId] = id?.split(':') ?? [];
118
- const space = client.spaces.get().find((space) => space.id === spaceId);
119
- const object = objectId && space?.db.getObjectById(objectId);
120
- const target = objectId ? object : space;
121
- if (!target) {
122
- return;
123
- }
124
-
125
- return [
126
- {
127
- id: `${MARKDOWN_PLUGIN}/create/${node.id}`,
128
- data: async () => {
129
- await dispatch([
130
- { plugin: MARKDOWN_PLUGIN, action: MarkdownAction.CREATE },
131
- { action: SpaceAction.ADD_OBJECT, data: { target } },
132
- { action: NavigationAction.OPEN },
133
- ]);
134
- },
135
- properties: {
136
- label: ['create document label', { ns: MARKDOWN_PLUGIN }],
137
- icon: 'ph--text-aa--regular',
138
- testId: 'markdownPlugin.createObject',
139
- },
140
- },
141
- ];
142
- },
143
- });
144
- },
145
- serializer: (plugins) => {
146
- const dispatch = resolvePlugin(plugins, parseIntentPlugin)?.provides.intent.dispatch;
147
- if (!dispatch) {
148
- return [];
149
- }
150
-
151
- return [
152
- {
153
- inputType: DocumentType.typename,
154
- outputType: 'text/markdown',
155
- // Reconcile with metadata serializers.
156
- serialize: async (node) => {
157
- const doc = node.data;
158
- const content = await loadObjectReferences(doc, (doc) => doc.content);
159
- return {
160
- name:
161
- doc.name ||
162
- doc.fallbackName ||
163
- translations[0]['en-US'][MARKDOWN_PLUGIN]['document title placeholder'],
164
- data: content.content,
165
- type: 'text/markdown',
166
- };
167
- },
168
- deserialize: async (data, ancestors) => {
169
- const space = ancestors.find(isSpace);
170
- const target =
171
- ancestors.findLast((ancestor) => ancestor instanceof CollectionType) ??
172
- space?.properties[CollectionType.typename];
173
- if (!space || !target) {
174
- return;
175
- }
176
-
177
- const result = await dispatch([
178
- {
179
- plugin: MARKDOWN_PLUGIN,
180
- action: MarkdownAction.CREATE,
181
- data: { name: data.name, content: data.data },
182
- },
183
- {
184
- action: SpaceAction.ADD_OBJECT,
185
- data: { target },
186
- },
187
- ]);
188
-
189
- return result?.data.object;
190
- },
191
- },
192
- ];
193
- },
194
- },
195
- stack: {
196
- creators: [
197
- {
198
- id: 'create-stack-section-doc',
199
- testId: 'markdownPlugin.createSection',
200
- type: ['plugin name', { ns: MARKDOWN_PLUGIN }],
201
- label: ['create stack section label', { ns: MARKDOWN_PLUGIN }],
202
- icon: (props: any) => <TextAa {...props} />,
203
- intent: {
204
- plugin: MARKDOWN_PLUGIN,
205
- action: MarkdownAction.CREATE,
206
- },
207
- },
208
- ],
209
- },
210
- thread: {
211
- predicate: (obj) => obj instanceof DocumentType,
212
- createSort: (doc: DocumentType) => {
213
- const accessor = doc.content ? createDocAccessor(doc.content, ['content']) : undefined;
214
- if (!accessor) {
215
- return (_) => 0;
216
- }
217
-
218
- const getStartPosition = (cursor: string | undefined) => {
219
- const range = cursor ? getRangeFromCursor(accessor, cursor) : undefined;
220
- return range?.start ?? Number.MAX_SAFE_INTEGER;
221
- };
222
-
223
- return (anchorA: string | undefined, anchorB: string | undefined): number => {
224
- if (anchorA === undefined || anchorB === undefined) {
225
- return 0;
226
- }
227
- const posA = getStartPosition(anchorA);
228
- const posB = getStartPosition(anchorB);
229
- return posA - posB;
230
- };
231
- },
232
- },
233
- surface: {
234
- component: ({ data, role }) => {
235
- switch (role) {
236
- case 'section':
237
- case 'article': {
238
- const doc = getDoc(data.object);
239
- const { id, object } = isEditorModel(data.object)
240
- ? { id: data.object.id, object: data.object }
241
- : doc
242
- ? { id: fullyQualifiedId(doc), object: doc }
243
- : {};
244
-
245
- if (!id || !object) {
246
- return null;
247
- }
248
-
249
- return (
250
- <MarkdownContainer
251
- id={id}
252
- object={object}
253
- role={role}
254
- settings={settings.values}
255
- extensionProviders={state.values.extensionProviders}
256
- viewMode={getViewMode(id)}
257
- editorStateStore={editorStateStore}
258
- onViewModeChange={setViewMode}
259
- />
260
- );
261
- }
262
-
263
- case 'settings': {
264
- return data.plugin === meta.id ? <MarkdownSettings settings={settings.values} /> : null;
265
- }
266
- }
267
-
268
- return null;
269
- },
270
- },
271
- intent: {
272
- resolver: ({ action, data }) => {
273
- switch (action) {
274
- case MarkdownAction.CREATE: {
275
- const doc = create(DocumentType, {
276
- name: data?.name,
277
- content: create(TextType, { content: data?.content ?? '' }),
278
- threads: [],
279
- });
280
-
281
- return { data: doc };
282
- }
283
-
284
- case MarkdownAction.SET_VIEW_MODE: {
285
- const { id, viewMode } = data ?? {};
286
- if (typeof id === 'string' && EditorViewModes.includes(viewMode)) {
287
- state.values.viewMode[id] = viewMode;
288
- return { data: true };
289
- }
290
-
291
- break;
292
- }
293
- }
294
- },
295
- },
296
- },
297
- };
298
- };
69
+ }),
70
+ }),
71
+ defineModule({
72
+ id: `${meta.id}/module/schema`,
73
+ activatesOn: ClientEvents.SetupClient,
74
+ activate: () => [
75
+ contributes(ClientCapabilities.SystemSchema, [TextType]),
76
+ contributes(ClientCapabilities.Schema, [DocumentType]),
77
+ ],
78
+ }),
79
+ defineModule({
80
+ id: `${meta.id}/module/react-surface`,
81
+ activatesOn: Events.Startup,
82
+ activate: ReactSurface,
83
+ }),
84
+ defineModule({
85
+ id: `${meta.id}/module/intent-resolver`,
86
+ activatesOn: Events.SetupIntents,
87
+ activate: IntentResolver,
88
+ }),
89
+ defineModule({
90
+ id: `${meta.id}/module/app-graph-serializer`,
91
+ activatesOn: Events.Startup,
92
+ activate: AppGraphSerializer,
93
+ }),
94
+ defineModule({
95
+ id: `${meta.id}/module/thread`,
96
+ activatesOn: Events.Startup,
97
+ activate: Thread,
98
+ }),
99
+ ]);
@@ -0,0 +1,50 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { pipe } from 'effect';
6
+
7
+ import { contributes, Capabilities, type PluginsContext, chain, createIntent } from '@dxos/app-framework';
8
+ import { SpaceAction, CollectionType } from '@dxos/plugin-space/types';
9
+ import { isSpace } from '@dxos/react-client/echo';
10
+
11
+ import { MARKDOWN_PLUGIN } from '../meta';
12
+ import translations from '../translations';
13
+ import { MarkdownAction, DocumentType } from '../types';
14
+
15
+ export default (context: PluginsContext) =>
16
+ contributes(Capabilities.AppGraphSerializer, [
17
+ {
18
+ inputType: DocumentType.typename,
19
+ outputType: 'text/markdown',
20
+ // Reconcile with metadata serializers.
21
+ serialize: async (node) => {
22
+ const doc = node.data;
23
+ const content = await doc.content.load();
24
+ return {
25
+ name: doc.name || doc.fallbackName || translations[0]['en-US'][MARKDOWN_PLUGIN]['document title placeholder'],
26
+ data: content.content,
27
+ type: 'text/markdown',
28
+ };
29
+ },
30
+ deserialize: async (data, ancestors) => {
31
+ const space = ancestors.find(isSpace);
32
+ const target =
33
+ ancestors.findLast((ancestor) => ancestor instanceof CollectionType) ??
34
+ space?.properties[CollectionType.typename]?.target;
35
+ if (!space || !target) {
36
+ return;
37
+ }
38
+
39
+ const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);
40
+ const result = await dispatch(
41
+ pipe(
42
+ createIntent(MarkdownAction.Create, { name: data.name, content: data.data }),
43
+ chain(SpaceAction.AddObject, { target }),
44
+ ),
45
+ );
46
+
47
+ return result.data?.object;
48
+ },
49
+ },
50
+ ]);
@@ -0,0 +1,20 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { defineCapability } from '@dxos/app-framework';
6
+ import { type EditorViewMode, type EditorStateStore } from '@dxos/react-ui-editor';
7
+
8
+ import { MARKDOWN_PLUGIN } from '../meta';
9
+ import { type MarkdownExtensionProvider, type MarkdownPluginState } from '../types';
10
+
11
+ export namespace MarkdownCapabilities {
12
+ export const State = defineCapability<{
13
+ state: MarkdownPluginState;
14
+ editorState: EditorStateStore;
15
+ getViewMode: (id: string) => EditorViewMode;
16
+ setViewMode: (id: string, viewMode: EditorViewMode) => void;
17
+ }>(`${MARKDOWN_PLUGIN}/capability/state`);
18
+
19
+ export const Extensions = defineCapability<MarkdownExtensionProvider[]>(`${MARKDOWN_PLUGIN}/capability/extensions`);
20
+ }
@@ -0,0 +1,14 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { lazy } from '@dxos/app-framework';
6
+
7
+ export const AppGraphSerializer = lazy(() => import('./app-graph-serializer'));
8
+ export const IntentResolver = lazy(() => import('./intent-resolver'));
9
+ export const ReactSurface = lazy(() => import('./react-surface'));
10
+ export const MarkdownSettings = lazy(() => import('./settings'));
11
+ export const MarkdownState = lazy(() => import('./state'));
12
+ export const Thread = lazy(() => import('./thread'));
13
+
14
+ export * from './capabilities';
@@ -0,0 +1,27 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { Capabilities, contributes, createResolver, type PluginsContext } from '@dxos/app-framework';
6
+ import { makeRef, create } from '@dxos/live-object';
7
+ import { TextType } from '@dxos/schema';
8
+
9
+ import { MarkdownCapabilities } from './capabilities';
10
+ import { DocumentType, MarkdownAction } from '../types';
11
+
12
+ export default (context: PluginsContext) =>
13
+ contributes(Capabilities.IntentResolver, [
14
+ createResolver(MarkdownAction.Create, ({ name, content }) => {
15
+ const doc = create(DocumentType, {
16
+ name,
17
+ content: makeRef(create(TextType, { content: content ?? '' })),
18
+ threads: [],
19
+ });
20
+
21
+ return { data: { object: doc } };
22
+ }),
23
+ createResolver(MarkdownAction.SetViewMode, ({ id, viewMode }) => {
24
+ const { state } = context.requestCapability(MarkdownCapabilities.State);
25
+ state.viewMode[id] = viewMode;
26
+ }),
27
+ ]);