@dxos/app-framework 0.8.4-main.7ace549 → 0.8.4-main.8360d9e660

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 (482) hide show
  1. package/.storybook/main.mts +2 -4
  2. package/.storybook/preview.mts +2 -2
  3. package/dist/lib/browser/capability-5OFLR7J4.mjs +34 -0
  4. package/dist/lib/browser/capability-5OFLR7J4.mjs.map +7 -0
  5. package/dist/lib/browser/capability-ZHQDZRP5.mjs +37 -0
  6. package/dist/lib/browser/capability-ZHQDZRP5.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-272IPLHQ.mjs +47 -0
  8. package/dist/lib/browser/chunk-272IPLHQ.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-3VXJONTI.mjs +933 -0
  10. package/dist/lib/browser/chunk-3VXJONTI.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-7AL6SKIV.mjs +728 -0
  12. package/dist/lib/browser/chunk-7AL6SKIV.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-GH3M2LIW.mjs +148 -0
  14. package/dist/lib/browser/chunk-GH3M2LIW.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  16. package/dist/lib/browser/chunk-JGWCBVKJ.mjs +170 -0
  17. package/dist/lib/browser/chunk-JGWCBVKJ.mjs.map +7 -0
  18. package/dist/lib/browser/chunk-M5IC326L.mjs +34 -0
  19. package/dist/lib/browser/chunk-M5IC326L.mjs.map +7 -0
  20. package/dist/lib/browser/chunk-TGX63LTL.mjs +8 -0
  21. package/dist/lib/browser/chunk-TGX63LTL.mjs.map +7 -0
  22. package/dist/lib/browser/chunk-TIEBZMTF.mjs +44 -0
  23. package/dist/lib/browser/chunk-TIEBZMTF.mjs.map +7 -0
  24. package/dist/lib/browser/chunk-WEBSGU5L.mjs +80 -0
  25. package/dist/lib/browser/chunk-WEBSGU5L.mjs.map +7 -0
  26. package/dist/lib/browser/chunk-YAFEA4GV.mjs +1 -0
  27. package/dist/lib/browser/chunk-YNFPIQGB.mjs +76 -0
  28. package/dist/lib/browser/chunk-YNFPIQGB.mjs.map +7 -0
  29. package/dist/lib/browser/cli/index.mjs +89 -0
  30. package/dist/lib/browser/cli/index.mjs.map +7 -0
  31. package/dist/lib/browser/common/activation-events.mjs +23 -0
  32. package/dist/lib/browser/common/capabilities.mjs +45 -0
  33. package/dist/lib/browser/core/activation-event.mjs +20 -0
  34. package/dist/lib/browser/core/activation-event.mjs.map +7 -0
  35. package/dist/lib/browser/core/capability.mjs +28 -0
  36. package/dist/lib/browser/core/capability.mjs.map +7 -0
  37. package/dist/lib/browser/core/plugin-manager.mjs +15 -0
  38. package/dist/lib/browser/core/plugin-manager.mjs.map +7 -0
  39. package/dist/lib/browser/core/plugin.mjs +29 -0
  40. package/dist/lib/browser/core/plugin.mjs.map +7 -0
  41. package/dist/lib/browser/index.mjs +88 -121
  42. package/dist/lib/browser/index.mjs.map +4 -4
  43. package/dist/lib/browser/invoker-capability-YTTQ2OBB.mjs +36 -0
  44. package/dist/lib/browser/invoker-capability-YTTQ2OBB.mjs.map +7 -0
  45. package/dist/lib/browser/meta.json +1 -1
  46. package/dist/lib/browser/testing/index.mjs +107 -40
  47. package/dist/lib/browser/testing/index.mjs.map +4 -4
  48. package/dist/lib/browser/ui/index.mjs +45 -0
  49. package/dist/lib/browser/ui/index.mjs.map +7 -0
  50. package/dist/lib/node-esm/capability-CRHZKL6T.mjs +35 -0
  51. package/dist/lib/node-esm/capability-CRHZKL6T.mjs.map +7 -0
  52. package/dist/lib/node-esm/capability-W5C5464H.mjs +38 -0
  53. package/dist/lib/node-esm/capability-W5C5464H.mjs.map +7 -0
  54. package/dist/lib/node-esm/chunk-3D66SZHP.mjs +171 -0
  55. package/dist/lib/node-esm/chunk-3D66SZHP.mjs.map +7 -0
  56. package/dist/lib/node-esm/chunk-6REV5DE7.mjs +48 -0
  57. package/dist/lib/node-esm/chunk-6REV5DE7.mjs.map +7 -0
  58. package/dist/lib/node-esm/chunk-CMDON4NG.mjs +934 -0
  59. package/dist/lib/node-esm/chunk-CMDON4NG.mjs.map +7 -0
  60. package/dist/lib/node-esm/chunk-FKE4Z3D6.mjs +10 -0
  61. package/dist/lib/node-esm/chunk-FKE4Z3D6.mjs.map +7 -0
  62. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  63. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  64. package/dist/lib/node-esm/chunk-I7FZT4A7.mjs +729 -0
  65. package/dist/lib/node-esm/chunk-I7FZT4A7.mjs.map +7 -0
  66. package/dist/lib/node-esm/chunk-LHCJGNXK.mjs +149 -0
  67. package/dist/lib/node-esm/chunk-LHCJGNXK.mjs.map +7 -0
  68. package/dist/lib/node-esm/chunk-NHXBSAQR.mjs +35 -0
  69. package/dist/lib/node-esm/chunk-NHXBSAQR.mjs.map +7 -0
  70. package/dist/lib/node-esm/chunk-SB5ODNPX.mjs +77 -0
  71. package/dist/lib/node-esm/chunk-SB5ODNPX.mjs.map +7 -0
  72. package/dist/lib/node-esm/chunk-SCDGIGGU.mjs +45 -0
  73. package/dist/lib/node-esm/chunk-SCDGIGGU.mjs.map +7 -0
  74. package/dist/lib/node-esm/chunk-SQICGJBW.mjs +81 -0
  75. package/dist/lib/node-esm/chunk-SQICGJBW.mjs.map +7 -0
  76. package/dist/lib/node-esm/chunk-Z4TJPSMP.mjs +2 -0
  77. package/dist/lib/node-esm/chunk-Z4TJPSMP.mjs.map +7 -0
  78. package/dist/lib/node-esm/cli/index.mjs +90 -0
  79. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  80. package/dist/lib/node-esm/common/activation-events.mjs +24 -0
  81. package/dist/lib/node-esm/common/activation-events.mjs.map +7 -0
  82. package/dist/lib/node-esm/common/capabilities.mjs +46 -0
  83. package/dist/lib/node-esm/common/capabilities.mjs.map +7 -0
  84. package/dist/lib/node-esm/core/activation-event.mjs +21 -0
  85. package/dist/lib/node-esm/core/activation-event.mjs.map +7 -0
  86. package/dist/lib/node-esm/core/capability.mjs +29 -0
  87. package/dist/lib/node-esm/core/capability.mjs.map +7 -0
  88. package/dist/lib/node-esm/core/plugin-manager.mjs +16 -0
  89. package/dist/lib/node-esm/core/plugin-manager.mjs.map +7 -0
  90. package/dist/lib/node-esm/core/plugin.mjs +30 -0
  91. package/dist/lib/node-esm/core/plugin.mjs.map +7 -0
  92. package/dist/lib/node-esm/index.mjs +88 -121
  93. package/dist/lib/node-esm/index.mjs.map +4 -4
  94. package/dist/lib/node-esm/invoker-capability-BU26474T.mjs +37 -0
  95. package/dist/lib/node-esm/invoker-capability-BU26474T.mjs.map +7 -0
  96. package/dist/lib/node-esm/meta.json +1 -1
  97. package/dist/lib/node-esm/testing/index.mjs +107 -40
  98. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  99. package/dist/lib/node-esm/ui/index.mjs +46 -0
  100. package/dist/lib/node-esm/ui/index.mjs.map +7 -0
  101. package/dist/types/src/cli/cli.d.ts +39 -0
  102. package/dist/types/src/cli/cli.d.ts.map +1 -0
  103. package/dist/types/src/cli/index.d.ts +2 -0
  104. package/dist/types/src/cli/index.d.ts.map +1 -0
  105. package/dist/types/src/common/activation-events.d.ts +27 -0
  106. package/dist/types/src/common/activation-events.d.ts.map +1 -0
  107. package/dist/types/src/common/capabilities.d.ts +114 -194
  108. package/dist/types/src/common/capabilities.d.ts.map +1 -1
  109. package/dist/types/src/common/index.d.ts +4 -8
  110. package/dist/types/src/common/index.d.ts.map +1 -1
  111. package/dist/types/src/common/operations.d.ts +33 -0
  112. package/dist/types/src/common/operations.d.ts.map +1 -0
  113. package/dist/types/src/common/translations.d.ts +7 -7
  114. package/dist/types/src/common/translations.d.ts.map +1 -1
  115. package/dist/types/src/context.d.ts +5 -0
  116. package/dist/types/src/context.d.ts.map +1 -0
  117. package/dist/types/src/core/{events.d.ts → activation-event.d.ts} +7 -7
  118. package/dist/types/src/core/activation-event.d.ts.map +1 -0
  119. package/dist/types/src/core/capability-manager.d.ts +43 -0
  120. package/dist/types/src/core/capability-manager.d.ts.map +1 -0
  121. package/dist/types/src/core/capability-manager.test.d.ts +2 -0
  122. package/dist/types/src/core/capability-manager.test.d.ts.map +1 -0
  123. package/dist/types/src/core/capability.d.ts +150 -0
  124. package/dist/types/src/core/capability.d.ts.map +1 -0
  125. package/dist/types/src/core/index.d.ts +5 -4
  126. package/dist/types/src/core/index.d.ts.map +1 -1
  127. package/dist/types/src/core/plugin-manager.d.ts +72 -0
  128. package/dist/types/src/core/plugin-manager.d.ts.map +1 -0
  129. package/dist/types/src/core/plugin-manager.test.d.ts +2 -0
  130. package/dist/types/src/core/plugin-manager.test.d.ts.map +1 -0
  131. package/dist/types/src/core/plugin.d.ts +98 -35
  132. package/dist/types/src/core/plugin.d.ts.map +1 -1
  133. package/dist/types/src/index.d.ts +3 -2
  134. package/dist/types/src/index.d.ts.map +1 -1
  135. package/dist/types/src/plugin-operation/OperationPlugin.d.ts +3 -0
  136. package/dist/types/src/plugin-operation/OperationPlugin.d.ts.map +1 -0
  137. package/dist/types/src/plugin-operation/history/capability.d.ts +7 -0
  138. package/dist/types/src/plugin-operation/history/capability.d.ts.map +1 -0
  139. package/dist/types/src/plugin-operation/history/errors.d.ts +5 -0
  140. package/dist/types/src/plugin-operation/history/errors.d.ts.map +1 -0
  141. package/dist/types/src/plugin-operation/history/history-tracker.d.ts +18 -0
  142. package/dist/types/src/plugin-operation/history/history-tracker.d.ts.map +1 -0
  143. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts +2 -0
  144. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts.map +1 -0
  145. package/dist/types/src/plugin-operation/history/index.d.ts +6 -0
  146. package/dist/types/src/plugin-operation/history/index.d.ts.map +1 -0
  147. package/dist/types/src/plugin-operation/history/types.d.ts +13 -0
  148. package/dist/types/src/plugin-operation/history/types.d.ts.map +1 -0
  149. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts +101 -0
  150. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts.map +1 -0
  151. package/dist/types/src/plugin-operation/history/undo-registry.d.ts +23 -0
  152. package/dist/types/src/plugin-operation/history/undo-registry.d.ts.map +1 -0
  153. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts +2 -0
  154. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts.map +1 -0
  155. package/dist/types/src/plugin-operation/index.d.ts +3 -0
  156. package/dist/types/src/plugin-operation/index.d.ts.map +1 -0
  157. package/dist/types/src/plugin-operation/invoker-capability.d.ts +6 -0
  158. package/dist/types/src/plugin-operation/invoker-capability.d.ts.map +1 -0
  159. package/dist/types/src/plugin-operation/meta.d.ts +3 -0
  160. package/dist/types/src/plugin-operation/meta.d.ts.map +1 -0
  161. package/dist/types/src/plugin-operation/testing.d.ts +109 -0
  162. package/dist/types/src/plugin-operation/testing.d.ts.map +1 -0
  163. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts +3 -0
  164. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts.map +1 -0
  165. package/dist/types/src/plugin-runtime/capability.d.ts +6 -0
  166. package/dist/types/src/plugin-runtime/capability.d.ts.map +1 -0
  167. package/dist/types/src/plugin-runtime/index.d.ts +2 -0
  168. package/dist/types/src/plugin-runtime/index.d.ts.map +1 -0
  169. package/dist/types/src/plugin-runtime/meta.d.ts +3 -0
  170. package/dist/types/src/plugin-runtime/meta.d.ts.map +1 -0
  171. package/dist/types/src/testing/index.d.ts +1 -0
  172. package/dist/types/src/testing/index.d.ts.map +1 -1
  173. package/dist/types/src/testing/service.d.ts +8 -0
  174. package/dist/types/src/testing/service.d.ts.map +1 -0
  175. package/dist/types/src/testing/withPluginManager.d.ts +4 -4
  176. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  177. package/dist/types/src/ui/components/App/App.d.ts +8 -0
  178. package/dist/types/src/ui/components/App/App.d.ts.map +1 -0
  179. package/dist/types/src/ui/components/App/App.stories.d.ts +19 -0
  180. package/dist/types/src/ui/components/App/App.stories.d.ts.map +1 -0
  181. package/dist/types/src/ui/components/App/index.d.ts +2 -0
  182. package/dist/types/src/ui/components/App/index.d.ts.map +1 -0
  183. package/dist/types/src/{react/Surface.stories.d.ts → ui/components/PluginManager/PluginManagerContext.stories.d.ts} +2 -3
  184. package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts.map +1 -0
  185. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts +10 -0
  186. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts.map +1 -0
  187. package/dist/types/src/ui/components/PluginManager/index.d.ts +2 -0
  188. package/dist/types/src/ui/components/PluginManager/index.d.ts.map +1 -0
  189. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts +12 -0
  190. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -0
  191. package/dist/types/src/{react/App.stories.d.ts → ui/components/Surface/SurfaceComponent.stories.d.ts} +1 -1
  192. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts.map +1 -0
  193. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts +11 -0
  194. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts.map +1 -0
  195. package/dist/types/src/ui/components/Surface/context.d.ts +5 -0
  196. package/dist/types/src/ui/components/Surface/context.d.ts.map +1 -0
  197. package/dist/types/src/ui/components/Surface/index.d.ts +20 -0
  198. package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -0
  199. package/dist/types/src/ui/components/Surface/types.d.ts +96 -0
  200. package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -0
  201. package/dist/types/src/ui/components/index.d.ts +4 -0
  202. package/dist/types/src/ui/components/index.d.ts.map +1 -0
  203. package/dist/types/src/ui/hooks/index.d.ts +7 -0
  204. package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
  205. package/dist/types/src/{react → ui/hooks}/useApp.d.ts +18 -12
  206. package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -0
  207. package/dist/types/src/ui/hooks/useApp.test.d.ts +2 -0
  208. package/dist/types/src/ui/hooks/useApp.test.d.ts.map +1 -0
  209. package/dist/types/src/ui/hooks/useCapabilities.d.ts +31 -0
  210. package/dist/types/src/ui/hooks/useCapabilities.d.ts.map +1 -0
  211. package/dist/types/src/{react → ui/hooks}/useLoading.d.ts +1 -2
  212. package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -0
  213. package/dist/types/src/ui/hooks/useOperationResolver.d.ts +19 -0
  214. package/dist/types/src/ui/hooks/useOperationResolver.d.ts.map +1 -0
  215. package/dist/types/src/ui/hooks/useSettingsState.d.ts +10 -0
  216. package/dist/types/src/ui/hooks/useSettingsState.d.ts.map +1 -0
  217. package/dist/types/src/ui/hooks/useSurface.d.ts +3 -0
  218. package/dist/types/src/ui/hooks/useSurface.d.ts.map +1 -0
  219. package/dist/types/src/ui/index.d.ts +3 -0
  220. package/dist/types/src/ui/index.d.ts.map +1 -0
  221. package/dist/types/tsconfig.tsbuildinfo +1 -1
  222. package/moon.yml +10 -6
  223. package/package.json +111 -50
  224. package/src/cli/cli.ts +107 -0
  225. package/src/{playground/debug → cli}/index.ts +1 -1
  226. package/src/common/activation-events.ts +44 -0
  227. package/src/common/capabilities.ts +174 -210
  228. package/src/common/index.ts +4 -8
  229. package/src/common/operations.ts +38 -0
  230. package/src/common/translations.ts +17 -9
  231. package/src/context.ts +9 -0
  232. package/src/core/{events.ts → activation-event.ts} +6 -6
  233. package/src/core/capability-manager.test.ts +151 -0
  234. package/src/core/capability-manager.ts +171 -0
  235. package/src/core/capability.ts +236 -0
  236. package/src/core/index.ts +5 -4
  237. package/src/core/plugin-manager.test.ts +1093 -0
  238. package/src/core/plugin-manager.ts +868 -0
  239. package/src/core/plugin.ts +230 -40
  240. package/src/index.ts +3 -2
  241. package/src/plugin-operation/OperationPlugin.ts +25 -0
  242. package/src/plugin-operation/history/capability.ts +37 -0
  243. package/src/plugin-operation/history/errors.ts +11 -0
  244. package/src/plugin-operation/history/history-tracker.test.ts +380 -0
  245. package/src/plugin-operation/history/history-tracker.ts +129 -0
  246. package/src/plugin-operation/history/index.ts +9 -0
  247. package/src/plugin-operation/history/types.ts +17 -0
  248. package/src/plugin-operation/history/undo-mapping.ts +135 -0
  249. package/src/plugin-operation/history/undo-registry.test.ts +73 -0
  250. package/src/plugin-operation/history/undo-registry.ts +54 -0
  251. package/src/plugin-operation/index.ts +6 -0
  252. package/src/plugin-operation/invoker-capability.ts +40 -0
  253. package/src/plugin-operation/meta.ts +11 -0
  254. package/src/plugin-operation/testing.ts +174 -0
  255. package/src/plugin-runtime/RuntimePlugin.ts +20 -0
  256. package/src/plugin-runtime/capability.ts +53 -0
  257. package/src/{playground/logger → plugin-runtime}/index.ts +1 -1
  258. package/src/plugin-runtime/meta.ts +11 -0
  259. package/src/testing/index.ts +1 -0
  260. package/src/testing/service.ts +52 -0
  261. package/src/testing/withPluginManager.stories.tsx +7 -7
  262. package/src/testing/withPluginManager.tsx +63 -38
  263. package/src/ui/components/App/App.stories.tsx +92 -0
  264. package/src/{react → ui/components/App}/App.tsx +9 -11
  265. package/src/{playground/layout → ui/components/App}/index.ts +1 -1
  266. package/src/ui/components/PluginManager/PluginManagerContext.stories.tsx +183 -0
  267. package/src/{react → ui/components/PluginManager}/PluginManagerProvider.ts +3 -3
  268. package/src/ui/components/PluginManager/index.ts +5 -0
  269. package/src/{react/Surface.stories.tsx → ui/components/Surface/SurfaceComponent.stories.tsx} +41 -23
  270. package/src/ui/components/Surface/SurfaceComponent.tsx +247 -0
  271. package/src/ui/components/Surface/SurfaceInfo.tsx +107 -0
  272. package/src/ui/components/Surface/context.ts +12 -0
  273. package/src/ui/components/Surface/index.ts +20 -0
  274. package/src/ui/components/Surface/types.ts +117 -0
  275. package/src/ui/components/index.ts +7 -0
  276. package/src/ui/hooks/index.ts +10 -0
  277. package/src/ui/hooks/useApp.test.tsx +159 -0
  278. package/src/ui/hooks/useApp.tsx +219 -0
  279. package/src/ui/hooks/useCapabilities.ts +67 -0
  280. package/src/{react → ui/hooks}/useLoading.tsx +4 -6
  281. package/src/ui/hooks/useOperationResolver.ts +40 -0
  282. package/src/ui/hooks/useSettingsState.ts +26 -0
  283. package/src/ui/hooks/useSurface.ts +13 -0
  284. package/src/ui/index.ts +6 -0
  285. package/tsconfig.json +11 -29
  286. package/tsconfig.node.json +1 -3
  287. package/typedoc.json +2 -4
  288. package/vitest.config.ts +1 -1
  289. package/.swc/plugins/linux_x86_64_19.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429.wasmer-v7 +0 -0
  290. package/dist/lib/browser/app-graph-builder-OIEZZC45.mjs +0 -138
  291. package/dist/lib/browser/app-graph-builder-OIEZZC45.mjs.map +0 -7
  292. package/dist/lib/browser/chunk-6XKO24JP.mjs +0 -483
  293. package/dist/lib/browser/chunk-6XKO24JP.mjs.map +0 -7
  294. package/dist/lib/browser/chunk-SCPE4ZO2.mjs +0 -35
  295. package/dist/lib/browser/chunk-SCPE4ZO2.mjs.map +0 -7
  296. package/dist/lib/browser/chunk-WPW5VVAX.mjs +0 -1651
  297. package/dist/lib/browser/chunk-WPW5VVAX.mjs.map +0 -7
  298. package/dist/lib/browser/intent-dispatcher-LZ4AE66E.mjs +0 -11
  299. package/dist/lib/browser/intent-resolver-QVCKRX6G.mjs +0 -39
  300. package/dist/lib/browser/intent-resolver-QVCKRX6G.mjs.map +0 -7
  301. package/dist/lib/browser/react/index.mjs +0 -34
  302. package/dist/lib/browser/store-CNPHOYTJ.mjs +0 -30
  303. package/dist/lib/browser/store-CNPHOYTJ.mjs.map +0 -7
  304. package/dist/lib/node-esm/app-graph-builder-EBU4NVWD.mjs +0 -139
  305. package/dist/lib/node-esm/app-graph-builder-EBU4NVWD.mjs.map +0 -7
  306. package/dist/lib/node-esm/chunk-3UPX5OIS.mjs +0 -484
  307. package/dist/lib/node-esm/chunk-3UPX5OIS.mjs.map +0 -7
  308. package/dist/lib/node-esm/chunk-XJZGUJ3H.mjs +0 -1653
  309. package/dist/lib/node-esm/chunk-XJZGUJ3H.mjs.map +0 -7
  310. package/dist/lib/node-esm/chunk-ZX63QUGE.mjs +0 -37
  311. package/dist/lib/node-esm/chunk-ZX63QUGE.mjs.map +0 -7
  312. package/dist/lib/node-esm/intent-dispatcher-MGOJ3CHD.mjs +0 -12
  313. package/dist/lib/node-esm/intent-resolver-URF3HN3G.mjs +0 -40
  314. package/dist/lib/node-esm/intent-resolver-URF3HN3G.mjs.map +0 -7
  315. package/dist/lib/node-esm/react/index.mjs +0 -35
  316. package/dist/lib/node-esm/store-RK5B4XEL.mjs +0 -31
  317. package/dist/lib/node-esm/store-RK5B4XEL.mjs.map +0 -7
  318. package/dist/types/src/common/collaboration.d.ts +0 -20
  319. package/dist/types/src/common/collaboration.d.ts.map +0 -1
  320. package/dist/types/src/common/events.d.ts +0 -52
  321. package/dist/types/src/common/events.d.ts.map +0 -1
  322. package/dist/types/src/common/file.d.ts +0 -14
  323. package/dist/types/src/common/file.d.ts.map +0 -1
  324. package/dist/types/src/common/graph.d.ts +0 -21
  325. package/dist/types/src/common/graph.d.ts.map +0 -1
  326. package/dist/types/src/common/layout.d.ts +0 -279
  327. package/dist/types/src/common/layout.d.ts.map +0 -1
  328. package/dist/types/src/common/surface.d.ts +0 -68
  329. package/dist/types/src/common/surface.d.ts.map +0 -1
  330. package/dist/types/src/core/capabilities.d.ts +0 -117
  331. package/dist/types/src/core/capabilities.d.ts.map +0 -1
  332. package/dist/types/src/core/capabilities.test.d.ts +0 -2
  333. package/dist/types/src/core/capabilities.test.d.ts.map +0 -1
  334. package/dist/types/src/core/events.d.ts.map +0 -1
  335. package/dist/types/src/core/manager.d.ts +0 -126
  336. package/dist/types/src/core/manager.d.ts.map +0 -1
  337. package/dist/types/src/core/manager.test.d.ts +0 -2
  338. package/dist/types/src/core/manager.test.d.ts.map +0 -1
  339. package/dist/types/src/playground/debug/Debug.d.ts +0 -6
  340. package/dist/types/src/playground/debug/Debug.d.ts.map +0 -1
  341. package/dist/types/src/playground/debug/index.d.ts +0 -2
  342. package/dist/types/src/playground/debug/index.d.ts.map +0 -1
  343. package/dist/types/src/playground/debug/plugin.d.ts +0 -2
  344. package/dist/types/src/playground/debug/plugin.d.ts.map +0 -1
  345. package/dist/types/src/playground/generator/Main.d.ts +0 -6
  346. package/dist/types/src/playground/generator/Main.d.ts.map +0 -1
  347. package/dist/types/src/playground/generator/Toolbar.d.ts +0 -6
  348. package/dist/types/src/playground/generator/Toolbar.d.ts.map +0 -1
  349. package/dist/types/src/playground/generator/generator.d.ts +0 -7
  350. package/dist/types/src/playground/generator/generator.d.ts.map +0 -1
  351. package/dist/types/src/playground/generator/index.d.ts +0 -3
  352. package/dist/types/src/playground/generator/index.d.ts.map +0 -1
  353. package/dist/types/src/playground/generator/plugin.d.ts +0 -2
  354. package/dist/types/src/playground/generator/plugin.d.ts.map +0 -1
  355. package/dist/types/src/playground/layout/Layout.d.ts +0 -8
  356. package/dist/types/src/playground/layout/Layout.d.ts.map +0 -1
  357. package/dist/types/src/playground/layout/index.d.ts +0 -2
  358. package/dist/types/src/playground/layout/index.d.ts.map +0 -1
  359. package/dist/types/src/playground/layout/plugin.d.ts +0 -2
  360. package/dist/types/src/playground/layout/plugin.d.ts.map +0 -1
  361. package/dist/types/src/playground/logger/Toolbar.d.ts +0 -6
  362. package/dist/types/src/playground/logger/Toolbar.d.ts.map +0 -1
  363. package/dist/types/src/playground/logger/index.d.ts +0 -2
  364. package/dist/types/src/playground/logger/index.d.ts.map +0 -1
  365. package/dist/types/src/playground/logger/plugin.d.ts +0 -2
  366. package/dist/types/src/playground/logger/plugin.d.ts.map +0 -1
  367. package/dist/types/src/playground/logger/schema.d.ts +0 -13
  368. package/dist/types/src/playground/logger/schema.d.ts.map +0 -1
  369. package/dist/types/src/playground/playground.stories.d.ts +0 -11
  370. package/dist/types/src/playground/playground.stories.d.ts.map +0 -1
  371. package/dist/types/src/plugin-intent/IntentPlugin.d.ts +0 -2
  372. package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +0 -1
  373. package/dist/types/src/plugin-intent/actions.d.ts +0 -36
  374. package/dist/types/src/plugin-intent/actions.d.ts.map +0 -1
  375. package/dist/types/src/plugin-intent/errors.d.ts +0 -16
  376. package/dist/types/src/plugin-intent/errors.d.ts.map +0 -1
  377. package/dist/types/src/plugin-intent/index.d.ts +0 -6
  378. package/dist/types/src/plugin-intent/index.d.ts.map +0 -1
  379. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +0 -139
  380. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +0 -1
  381. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts +0 -2
  382. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts.map +0 -1
  383. package/dist/types/src/plugin-intent/intent.d.ts +0 -63
  384. package/dist/types/src/plugin-intent/intent.d.ts.map +0 -1
  385. package/dist/types/src/plugin-intent/meta.d.ts +0 -3
  386. package/dist/types/src/plugin-intent/meta.d.ts.map +0 -1
  387. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +0 -2
  388. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +0 -1
  389. package/dist/types/src/plugin-settings/actions.d.ts +0 -25
  390. package/dist/types/src/plugin-settings/actions.d.ts.map +0 -1
  391. package/dist/types/src/plugin-settings/app-graph-builder.d.ts +0 -4
  392. package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +0 -1
  393. package/dist/types/src/plugin-settings/index.d.ts +0 -3
  394. package/dist/types/src/plugin-settings/index.d.ts.map +0 -1
  395. package/dist/types/src/plugin-settings/intent-resolver.d.ts +0 -4
  396. package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +0 -1
  397. package/dist/types/src/plugin-settings/meta.d.ts +0 -3
  398. package/dist/types/src/plugin-settings/meta.d.ts.map +0 -1
  399. package/dist/types/src/plugin-settings/store.d.ts +0 -5
  400. package/dist/types/src/plugin-settings/store.d.ts.map +0 -1
  401. package/dist/types/src/plugin-settings/translations.d.ts +0 -11
  402. package/dist/types/src/plugin-settings/translations.d.ts.map +0 -1
  403. package/dist/types/src/react/App.d.ts +0 -10
  404. package/dist/types/src/react/App.d.ts.map +0 -1
  405. package/dist/types/src/react/App.stories.d.ts.map +0 -1
  406. package/dist/types/src/react/DefaultFallback.d.ts +0 -8
  407. package/dist/types/src/react/DefaultFallback.d.ts.map +0 -1
  408. package/dist/types/src/react/ErrorBoundary.d.ts +0 -30
  409. package/dist/types/src/react/ErrorBoundary.d.ts.map +0 -1
  410. package/dist/types/src/react/IntentContext.d.ts +0 -8
  411. package/dist/types/src/react/IntentContext.d.ts.map +0 -1
  412. package/dist/types/src/react/PluginManagerProvider.d.ts +0 -10
  413. package/dist/types/src/react/PluginManagerProvider.d.ts.map +0 -1
  414. package/dist/types/src/react/Surface.d.ts +0 -12
  415. package/dist/types/src/react/Surface.d.ts.map +0 -1
  416. package/dist/types/src/react/Surface.stories.d.ts.map +0 -1
  417. package/dist/types/src/react/common.d.ts +0 -13
  418. package/dist/types/src/react/common.d.ts.map +0 -1
  419. package/dist/types/src/react/index.d.ts +0 -9
  420. package/dist/types/src/react/index.d.ts.map +0 -1
  421. package/dist/types/src/react/types.d.ts +0 -14
  422. package/dist/types/src/react/types.d.ts.map +0 -1
  423. package/dist/types/src/react/useApp.d.ts.map +0 -1
  424. package/dist/types/src/react/useCapabilities.d.ts +0 -13
  425. package/dist/types/src/react/useCapabilities.d.ts.map +0 -1
  426. package/dist/types/src/react/useIntentResolver.d.ts +0 -3
  427. package/dist/types/src/react/useIntentResolver.d.ts.map +0 -1
  428. package/dist/types/src/react/useLoading.d.ts.map +0 -1
  429. package/src/common/collaboration.ts +0 -18
  430. package/src/common/events.ts +0 -79
  431. package/src/common/file.ts +0 -22
  432. package/src/common/graph.ts +0 -30
  433. package/src/common/layout.ts +0 -277
  434. package/src/common/surface.ts +0 -88
  435. package/src/core/capabilities.test.ts +0 -136
  436. package/src/core/capabilities.ts +0 -263
  437. package/src/core/manager.test.ts +0 -516
  438. package/src/core/manager.ts +0 -604
  439. package/src/playground/debug/Debug.tsx +0 -39
  440. package/src/playground/debug/plugin.ts +0 -16
  441. package/src/playground/generator/Main.tsx +0 -70
  442. package/src/playground/generator/Toolbar.tsx +0 -47
  443. package/src/playground/generator/generator.ts +0 -48
  444. package/src/playground/generator/index.ts +0 -6
  445. package/src/playground/generator/plugin.ts +0 -22
  446. package/src/playground/layout/Layout.tsx +0 -33
  447. package/src/playground/layout/plugin.ts +0 -18
  448. package/src/playground/logger/Toolbar.tsx +0 -30
  449. package/src/playground/logger/plugin.ts +0 -41
  450. package/src/playground/logger/schema.ts +0 -12
  451. package/src/playground/playground.stories.tsx +0 -46
  452. package/src/plugin-intent/IntentPlugin.ts +0 -20
  453. package/src/plugin-intent/actions.ts +0 -31
  454. package/src/plugin-intent/errors.ts +0 -40
  455. package/src/plugin-intent/index.ts +0 -9
  456. package/src/plugin-intent/intent-dispatcher.test.ts +0 -286
  457. package/src/plugin-intent/intent-dispatcher.ts +0 -342
  458. package/src/plugin-intent/intent.ts +0 -154
  459. package/src/plugin-intent/meta.ts +0 -10
  460. package/src/plugin-settings/SettingsPlugin.ts +0 -34
  461. package/src/plugin-settings/actions.ts +0 -25
  462. package/src/plugin-settings/app-graph-builder.ts +0 -160
  463. package/src/plugin-settings/index.ts +0 -6
  464. package/src/plugin-settings/intent-resolver.ts +0 -35
  465. package/src/plugin-settings/meta.ts +0 -10
  466. package/src/plugin-settings/store.ts +0 -33
  467. package/src/plugin-settings/translations.ts +0 -19
  468. package/src/react/App.stories.tsx +0 -33
  469. package/src/react/DefaultFallback.tsx +0 -26
  470. package/src/react/ErrorBoundary.tsx +0 -56
  471. package/src/react/IntentContext.tsx +0 -35
  472. package/src/react/Surface.tsx +0 -109
  473. package/src/react/common.ts +0 -13
  474. package/src/react/index.ts +0 -14
  475. package/src/react/types.ts +0 -38
  476. package/src/react/useApp.tsx +0 -165
  477. package/src/react/useCapabilities.ts +0 -31
  478. package/src/react/useIntentResolver.ts +0 -22
  479. /package/dist/lib/browser/{intent-dispatcher-LZ4AE66E.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  480. /package/dist/lib/browser/{react/index.mjs.map → chunk-YAFEA4GV.mjs.map} +0 -0
  481. /package/dist/lib/{node-esm/intent-dispatcher-MGOJ3CHD.mjs.map → browser/common/activation-events.mjs.map} +0 -0
  482. /package/dist/lib/{node-esm/react/index.mjs.map → browser/common/capabilities.mjs.map} +0 -0
@@ -3,23 +3,17 @@
3
3
  //
4
4
 
5
5
  import { type Decorator, type StoryContext } from '@storybook/react';
6
- import React, { useEffect, useMemo } from 'react';
6
+ import * as Effect from 'effect/Effect';
7
+ import React, { useEffect, useState } from 'react';
7
8
 
8
9
  import { raise } from '@dxos/debug';
10
+ import { runAndForwardErrors } from '@dxos/effect';
9
11
  import { useAsyncEffect } from '@dxos/react-hooks';
10
12
  import { type MaybeProvider, getProviderValue } from '@dxos/util';
11
13
 
12
- import { Capabilities, Events } from '../common';
13
- import {
14
- type ActivationEvent,
15
- type AnyCapability,
16
- type PluginContext,
17
- PluginManager,
18
- contributes,
19
- defineModule,
20
- definePlugin,
21
- } from '../core';
22
- import { type UseAppOptions, useApp } from '../react';
14
+ import { ActivationEvents, Capabilities } from '../common';
15
+ import { type ActivationEvent, Capability, type CapabilityManager, Plugin, PluginManager } from '../core';
16
+ import { type UseAppOptions, useApp } from '../ui';
23
17
 
24
18
  /**
25
19
  * @internal
@@ -30,16 +24,16 @@ export const setupPluginManager = ({
30
24
  core = plugins.map(({ meta }) => meta.id),
31
25
  ...options
32
26
  }: UseAppOptions & Pick<WithPluginManagerOptions, 'capabilities'> = {}) => {
33
- const pluginManager = new PluginManager({
27
+ const pluginManager = PluginManager.make({
34
28
  pluginLoader: () => raise(new Error('Not implemented')),
35
- plugins: [StoryPlugin(), ...plugins],
29
+ plugins: [StoryPlugin, ...plugins],
36
30
  core: [StoryPlugin.meta.id, ...core],
37
31
  ...options,
38
32
  });
39
33
 
40
34
  if (capabilities) {
41
- getProviderValue(capabilities, pluginManager.context).forEach((capability) => {
42
- pluginManager.context.contributeCapability({
35
+ getProviderValue(capabilities, pluginManager.capabilities).forEach((capability) => {
36
+ pluginManager.capabilities.contribute({
43
37
  interface: capability.interface,
44
38
  implementation: capability.implementation,
45
39
  module: 'story',
@@ -50,11 +44,18 @@ export const setupPluginManager = ({
50
44
  return pluginManager;
51
45
  };
52
46
 
47
+ type ManagedPluginManagerState = {
48
+ fireEvents?: (ActivationEvent.ActivationEvent | string)[];
49
+ pluginManager: PluginManager.PluginManager;
50
+ setupEvents?: ActivationEvent.ActivationEvent[];
51
+ storyId: string;
52
+ };
53
+
53
54
  export type WithPluginManagerOptions = UseAppOptions & {
54
55
  /** @deprecated */
55
- capabilities?: MaybeProvider<AnyCapability[], PluginContext>;
56
+ capabilities?: MaybeProvider<Capability.Any[], CapabilityManager.CapabilityManager>;
56
57
  /** @deprecated */
57
- fireEvents?: (ActivationEvent | string)[];
58
+ fireEvents?: (ActivationEvent.ActivationEvent | string)[];
58
59
  };
59
60
 
60
61
  export type WithPluginManagerInitializer<Args = void> =
@@ -67,45 +68,69 @@ export type WithPluginManagerInitializer<Args = void> =
67
68
  */
68
69
  export const withPluginManager = <Args,>(init: WithPluginManagerInitializer<Args> = {}): Decorator => {
69
70
  return (Story, context) => {
71
+ const storyId = context.id;
70
72
  const options = typeof init === 'function' ? init(context as any) : init;
71
- const pluginManager = useMemo(() => setupPluginManager(options), [init]);
73
+ const [managerState, setManagerState] = useState<ManagedPluginManagerState>();
72
74
 
73
- // Set-up root capability.
75
+ // Storybook replaces the full context object often, so key manager ownership by story id.
74
76
  useEffect(() => {
75
- const capability = contributes(Capabilities.ReactRoot, {
76
- id: context.id,
77
+ const pluginManager = setupPluginManager(options);
78
+
79
+ const capability = Capability.contributes(Capabilities.ReactRoot, {
80
+ id: storyId,
77
81
  root: () => <Story />,
78
82
  });
79
83
 
80
- pluginManager.context.contributeCapability({
84
+ pluginManager.capabilities.contribute({
81
85
  ...capability,
82
- module: 'dxos.org/app-framework/withPluginManager',
86
+ module: 'org.dxos.app-framework.with-plugin-manager',
87
+ });
88
+
89
+ setManagerState({
90
+ pluginManager,
91
+ setupEvents: options.setupEvents,
92
+ fireEvents: options.fireEvents,
93
+ storyId,
83
94
  });
84
95
 
85
96
  return () => {
86
- pluginManager.context.removeCapability(capability.interface, capability.implementation);
97
+ pluginManager.capabilities.remove(capability.interface, capability.implementation);
98
+ void runAndForwardErrors(pluginManager.shutdown());
87
99
  };
88
- }, [pluginManager, context]);
100
+ }, [storyId, init]);
89
101
 
90
- // Fire events.
91
- useAsyncEffect(async () => {
92
- await Promise.all(options.fireEvents?.map((event) => pluginManager.activate(event)) ?? []);
93
- }, [pluginManager]);
102
+ // Avoid mounting useApp with a stale manager from the previous story.
103
+ if (!managerState || managerState.storyId !== storyId) {
104
+ return <></>;
105
+ }
94
106
 
95
- // Create app.
96
- const App = useApp({ pluginManager });
97
-
98
- return <App />;
107
+ return <WithPluginManagerApp {...managerState} />;
99
108
  };
100
109
  };
101
110
 
111
+ const WithPluginManagerApp = ({ fireEvents, pluginManager, setupEvents, storyId }: ManagedPluginManagerState) => {
112
+ // Fire deprecated events only after the effect-owned manager for this story exists.
113
+ useAsyncEffect(async () => {
114
+ await Promise.all(fireEvents?.map((event) => pluginManager.activate(event)) ?? []);
115
+ }, [fireEvents, pluginManager, storyId]);
116
+
117
+ const App = useApp({ pluginManager, setupEvents });
118
+
119
+ return <App />;
120
+ };
121
+
102
122
  const storyMeta = {
103
- id: 'dxos.org/app-framework/story',
123
+ id: 'org.dxos.app-framework.story',
104
124
  name: 'Story',
105
125
  };
106
126
 
107
127
  // No-op plugin to ensure there exists at least one plugin for the startup event.
108
128
  // This is necessary because `createApp` expects the startup event to complete before the app is ready.
109
- const StoryPlugin = definePlugin(storyMeta, () => [
110
- defineModule({ id: storyMeta.id, activatesOn: Events.Startup, activate: () => [] }),
111
- ]);
129
+ const StoryPlugin = Plugin.define(storyMeta).pipe(
130
+ Plugin.addModule({
131
+ id: 'Story',
132
+ activatesOn: ActivationEvents.Startup,
133
+ activate: () => Effect.succeed([]),
134
+ }),
135
+ Plugin.make,
136
+ )();
@@ -0,0 +1,92 @@
1
+ //
2
+ // Copyright 2022 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import * as Effect from 'effect/Effect';
7
+ import React, { useEffect } from 'react';
8
+
9
+ import { withTheme } from '@dxos/react-ui/testing';
10
+
11
+ import { ActivationEvents, Capabilities } from '../../../common';
12
+ import { Capability, Plugin } from '../../../core';
13
+ import { useApp } from '../../hooks';
14
+
15
+ // Minimal plugin that contributes a ReactRoot.
16
+ const TestPlugin = Plugin.define<{ error?: boolean }>({
17
+ id: 'org.dxos.plugin.test',
18
+ name: 'Test Plugin',
19
+ }).pipe(
20
+ Plugin.addModule(({ error }) => ({
21
+ id: 'TestMain',
22
+ activatesOn: ActivationEvents.Startup,
23
+ activate: () =>
24
+ Effect.succeed([
25
+ Capability.contributes(Capabilities.ReactRoot, {
26
+ id: 'org.dxos.plugin.test.root',
27
+ root: () => {
28
+ useEffect(() => {
29
+ let t: NodeJS.Timeout;
30
+ if (error) {
31
+ console.log('Ticking...');
32
+ t = setTimeout(() => {
33
+ console.log('Bang!');
34
+ throw new Error('Runtime error');
35
+ }, 3_000);
36
+ }
37
+
38
+ return () => clearTimeout(t);
39
+ }, [error]);
40
+
41
+ return <h1 className='text-lg'>App Started</h1>;
42
+ },
43
+ }),
44
+ ]),
45
+ })),
46
+ Plugin.make,
47
+ );
48
+
49
+ const core = [TestPlugin.meta.id];
50
+
51
+ type StoryProps = { plugins?: Plugin.Plugin[] };
52
+
53
+ const DefaultStory = ({ plugins }: StoryProps) => {
54
+ const App = useApp({
55
+ plugins,
56
+ core,
57
+ placeholder: () => {
58
+ return (
59
+ <div role='none' className='text-description'>
60
+ Loading...
61
+ </div>
62
+ );
63
+ },
64
+ });
65
+
66
+ return <App />;
67
+ };
68
+
69
+ const meta = {
70
+ title: 'sdk/app-framework/App',
71
+ render: DefaultStory,
72
+ decorators: [withTheme()],
73
+ parameters: {
74
+ layout: 'centered',
75
+ },
76
+ } satisfies Meta;
77
+
78
+ export default meta;
79
+
80
+ type Story = StoryObj<typeof meta>;
81
+
82
+ export const Default: Story = {
83
+ args: {
84
+ plugins: [TestPlugin({})],
85
+ },
86
+ };
87
+
88
+ export const WithError: Story = {
89
+ args: {
90
+ plugins: [TestPlugin({ error: true })],
91
+ },
92
+ };
@@ -4,25 +4,23 @@
4
4
 
5
5
  import React, { type PropsWithChildren } from 'react';
6
6
 
7
- import { Capabilities } from '../common';
8
- import { topologicalSort } from '../helpers';
9
-
10
- import { type UseAppOptions } from './useApp';
11
- import { useCapabilities } from './useCapabilities';
12
- import { LoadingState, useLoading } from './useLoading';
7
+ import { Capabilities } from '../../../common';
8
+ import { topologicalSort } from '../../../helpers';
9
+ import { LoadingState, type UseAppOptions, useCapabilities, useLoading } from '../../hooks';
13
10
 
14
11
  export type AppProps = Pick<UseAppOptions, 'placeholder' | 'debounce'> & {
15
- state: { ready: boolean; error: unknown };
12
+ ready: boolean;
13
+ error: unknown;
16
14
  };
17
15
 
18
- export const App = ({ placeholder: Placeholder, state, debounce }: AppProps) => {
16
+ export const App = ({ placeholder: Placeholder, ready, error, debounce }: AppProps) => {
19
17
  const reactContexts = useCapabilities(Capabilities.ReactContext);
20
18
  const reactRoots = useCapabilities(Capabilities.ReactRoot);
21
- const stage = useLoading(state, debounce);
19
+ const stage = useLoading(ready, debounce);
22
20
 
23
- if (state.error) {
21
+ if (error) {
24
22
  // This triggers the error boundary to provide UI feedback for the startup error.
25
- throw state.error;
23
+ throw error;
26
24
  }
27
25
 
28
26
  // TODO(wittjosiah): Consider using Suspense instead.
@@ -2,4 +2,4 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- export * from './plugin';
5
+ export * from './App';
@@ -0,0 +1,183 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { Atom, useAtomValue } from '@effect-atom/atom-react';
6
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
7
+ import * as Effect from 'effect/Effect';
8
+ import React, { useEffect, useMemo, useState } from 'react';
9
+
10
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
11
+ import { useWebComponentContext } from '@dxos/web-context-react';
12
+
13
+ import { ActivationEvents, Capabilities } from '../../../common';
14
+ import { PluginManagerContext } from '../../../context';
15
+ import { Capability, Plugin } from '../../../core';
16
+ import { useApp } from '../../hooks';
17
+
18
+ // Define the Counter capability
19
+ const Counter = Capability.make<{ count: number; increment: () => void }>('example/counter');
20
+
21
+ const CountStatus = () => {
22
+ const manager = useWebComponentContext(PluginManagerContext);
23
+ const capabilitiesAtom = useMemo(
24
+ () => manager?.capabilities.atom(Counter) ?? Atom.make<{ count: number; increment: () => void }[]>([]),
25
+ [manager],
26
+ );
27
+ const capabilities = useAtomValue(capabilitiesAtom);
28
+ const counter = (capabilities as any)[0];
29
+ const [count, setCount] = useState(counter?.count ?? 0);
30
+
31
+ useEffect(() => {
32
+ if (!counter) {
33
+ return;
34
+ }
35
+ setCount(counter.count);
36
+ if ('subscribe' in counter && typeof counter.subscribe === 'function') {
37
+ return counter.subscribe(() => setCount(counter.count));
38
+ }
39
+ }, [counter]);
40
+
41
+ if (!manager) return null;
42
+
43
+ const isEven = count % 2 === 0;
44
+
45
+ return (
46
+ <div
47
+ className={`mt-4 px-4 py-2 rounded-full text-sm font-medium transition-colors ${
48
+ isEven
49
+ ? 'bg-emerald-100 text-emerald-800 dark:bg-emerald-900/30 dark:text-emerald-400'
50
+ : 'bg-amber-100 text-amber-800 dark:bg-amber-900/30 dark:text-amber-400'
51
+ }`}
52
+ >
53
+ Status: {isEven ? 'Even' : 'Odd'}
54
+ </div>
55
+ );
56
+ };
57
+
58
+ // A component that consumes the PluginManager via web context
59
+ const CounterComponent = () => {
60
+ // Use the web-context hook to get the PluginManager
61
+ const manager = useWebComponentContext(PluginManagerContext);
62
+ const capabilitiesAtom = useMemo(
63
+ () => manager?.capabilities.atom(Counter) ?? Atom.make<{ count: number; increment: () => void }[]>([]),
64
+ [manager],
65
+ );
66
+ const capabilities = useAtomValue(capabilitiesAtom);
67
+ const counter = (capabilities as any)[0];
68
+ const [count, setCount] = useState(counter?.count ?? 0);
69
+
70
+ useEffect(() => {
71
+ if (!counter) {
72
+ return;
73
+ }
74
+ setCount(counter.count);
75
+ if ('subscribe' in counter && typeof counter.subscribe === 'function') {
76
+ return counter.subscribe(() => setCount(counter.count));
77
+ }
78
+ }, [counter]);
79
+
80
+ if (!manager) {
81
+ return <div className='p-4 text-error-text'>Error: Context not found</div>;
82
+ }
83
+
84
+ return (
85
+ <div className='flex flex-col items-center justify-center h-screen bg-neutral-100 dark:bg-neutral-900 text-neutral-900 dark:text-white'>
86
+ <div className='p-8 bg-white dark:bg-neutral-800 rounded-lg shadow-xl border border-neutral-200 dark:border-neutral-700 max-w-md w-full'>
87
+ <h2 className='text-2xl font-bold mb-6 text-center text-primary-600 dark:text-primary-400'>
88
+ Web Context Counter
89
+ </h2>
90
+
91
+ <div className='flex flex-col items-center gap-6'>
92
+ <div className='text-6xl font-mono font-bold tabular-nums tracking-tighter'>{count}</div>
93
+
94
+ <button
95
+ className='px-6 py-3 bg-primary-600 hover:bg-primary-700 text-white font-semibold rounded-full transition-colors shadow-md active:transform active:scale-95'
96
+ onClick={() => {
97
+ const counter = manager.capabilities.get(Counter);
98
+ counter.increment();
99
+ }}
100
+ >
101
+ Increment
102
+ </button>
103
+
104
+ <CountStatus />
105
+ </div>
106
+
107
+ <div className='mt-8 pt-4 border-t border-neutral-200 dark:border-neutral-700 text-center'>
108
+ <p className='text-sm text-neutral-500 dark:text-neutral-400'>
109
+ This component accesses the <code>PluginManager</code> via <code>useWebComponentContext</code>.
110
+ </p>
111
+ </div>
112
+ </div>
113
+ </div>
114
+ );
115
+ };
116
+
117
+ // Plugin that provides the Counter capability and renders the UI
118
+ const CounterPlugin = Plugin.define({
119
+ id: 'org.dxos.plugin.counter',
120
+ name: 'Counter Plugin',
121
+ }).pipe(
122
+ Plugin.addModule({
123
+ id: 'CounterMain',
124
+ activatesOn: ActivationEvents.Startup,
125
+ activate: () => {
126
+ const listeners = new Set<() => void>();
127
+ const counter = {
128
+ count: 0,
129
+ increment: () => {
130
+ counter.count++;
131
+ listeners.forEach((listener) => listener());
132
+ },
133
+ subscribe: (listener: () => void) => {
134
+ listeners.add(listener);
135
+ return () => listeners.delete(listener);
136
+ },
137
+ };
138
+
139
+ return Effect.succeed([
140
+ // Contribute the state/logic
141
+ Capability.contributes(Counter, counter),
142
+
143
+ // Contribute the UI
144
+ Capability.contributes(Capabilities.ReactRoot, {
145
+ id: 'org.dxos.plugin.counter.root',
146
+ root: CounterComponent,
147
+ }),
148
+ ]);
149
+ },
150
+ }),
151
+ Plugin.make,
152
+ )();
153
+
154
+ const plugins = [CounterPlugin];
155
+ const core = ['org.dxos.plugin.counter'];
156
+ const placeholder = () => (
157
+ <div className='flex h-screen items-center justify-center p-4 text-lg text-neutral-500'>
158
+ Initializing Application...
159
+ </div>
160
+ );
161
+
162
+ const DefaultStory = () => {
163
+ const App = useApp({
164
+ plugins,
165
+ core,
166
+ placeholder,
167
+ });
168
+
169
+ return <App />;
170
+ };
171
+
172
+ const meta = {
173
+ title: 'sdk/app-framework/PluginManagerContext',
174
+ render: DefaultStory,
175
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
176
+ parameters: {
177
+ layout: 'fullscreen',
178
+ },
179
+ } satisfies Meta;
180
+
181
+ export default meta;
182
+
183
+ export const Default: StoryObj<typeof meta> = {};
@@ -6,14 +6,14 @@ import { createContext, useContext } from 'react';
6
6
 
7
7
  import { raise } from '@dxos/debug';
8
8
 
9
- import { type PluginManager } from '../core';
9
+ import { type PluginManager } from '../../../core';
10
10
 
11
- const PluginManagerContext = createContext<PluginManager | undefined>(undefined);
11
+ const PluginManagerContext = createContext<PluginManager.PluginManager | undefined>(undefined);
12
12
 
13
13
  /**
14
14
  * Get the plugin manager.
15
15
  */
16
- export const usePluginManager = (): PluginManager =>
16
+ export const usePluginManager = (): PluginManager.PluginManager =>
17
17
  useContext(PluginManagerContext) ?? raise(new Error('Missing PluginManagerContext'));
18
18
 
19
19
  /**
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './PluginManagerProvider';
@@ -3,40 +3,53 @@
3
3
  //
4
4
 
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
- import React, { useCallback, useEffect, useState } from 'react';
6
+ import React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';
7
7
 
8
8
  import { faker } from '@dxos/random';
9
9
  import { List, ListItem, Toolbar } from '@dxos/react-ui';
10
- import { withTheme } from '@dxos/react-ui/testing';
11
- import { getHashStyles, mx } from '@dxos/react-ui-theme';
10
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
11
+ import { type ColorStyles, getHashStyles, mx } from '@dxos/ui-theme';
12
12
 
13
- import { Capabilities, createSurface } from '../common';
14
- import { withPluginManager } from '../testing';
13
+ import { Capabilities } from '../../../common';
14
+ import { withPluginManager } from '../../../testing';
15
+ import { usePluginManager } from '../PluginManager';
15
16
 
16
- import { usePluginManager } from './PluginManagerProvider';
17
- import { Surface, useSurfaces } from './Surface';
17
+ import { SurfaceComponent, useSurfaces } from './SurfaceComponent';
18
+ import { create } from './types';
19
+
20
+ type TestComponentProps = {
21
+ id: string;
22
+ styles: ColorStyles;
23
+ };
24
+
25
+ const TestComponent = forwardRef<HTMLDivElement, TestComponentProps>(({ styles, id }, forwardedRef) => {
26
+ return (
27
+ <div
28
+ className={mx('flex justify-center items-center border rounded-sm', styles.surface, styles.border)}
29
+ ref={forwardedRef}
30
+ >
31
+ <span className={mx('dx-tag font-mono text-lg', styles.text)}>{id}</span>
32
+ </div>
33
+ );
34
+ });
18
35
 
19
36
  const DefaultStory = () => {
20
- const [selected, setSelected] = useState<string | undefined>();
21
37
  const manager = usePluginManager();
22
38
  const surfaces = useSurfaces();
39
+ const [selected, setSelected] = useState<string | undefined>();
23
40
 
24
41
  const handleAdd = useCallback(() => {
25
42
  const id = `test-${faker.number.int({ min: 0, max: 1_000 })}`;
26
43
  const styles = getHashStyles(id);
27
44
 
28
- manager.context.contributeCapability({
45
+ manager.capabilities.contribute({
29
46
  module: 'test',
30
47
  interface: Capabilities.ReactSurface,
31
- implementation: createSurface({
48
+ implementation: create({
32
49
  id,
33
50
  role: 'item',
34
51
  filter: (data): data is any => (data as any)?.id === id,
35
- component: () => (
36
- <div className={mx('flex justify-center items-center border rounded', styles.surface, styles.border)}>
37
- <span className={mx('dx-tag font-mono text-lg', styles.text)}>{id}</span>
38
- </div>
39
- ),
52
+ component: ({ ref }) => <TestComponent id={id} styles={styles} ref={ref} />,
40
53
  }),
41
54
  });
42
55
 
@@ -48,10 +61,10 @@ const DefaultStory = () => {
48
61
  }, [surfaces]);
49
62
 
50
63
  const handleError = useCallback(() => {
51
- manager.context.contributeCapability({
64
+ manager.capabilities.contribute({
52
65
  module: 'error',
53
66
  interface: Capabilities.ReactSurface,
54
- implementation: createSurface({
67
+ implementation: create({
55
68
  id: 'error',
56
69
  role: 'item',
57
70
  filter: (data): data is any => (data as any)?.id === 'error',
@@ -75,7 +88,7 @@ const DefaultStory = () => {
75
88
  }
76
89
 
77
90
  return (
78
- <div className='flex justify-center items-center border border-roseFill rounded'>
91
+ <div className='flex justify-center items-center border border-rose-fill rounded-sm'>
79
92
  <span className='font-mono'>Ticking... {count}</span>
80
93
  </div>
81
94
  );
@@ -86,16 +99,21 @@ const DefaultStory = () => {
86
99
  setSelected('error');
87
100
  }, [manager]);
88
101
 
102
+ const ref = useRef<HTMLElement>(null);
103
+ useEffect(() => {
104
+ console.log(ref.current);
105
+ }, [ref]);
106
+
89
107
  return (
90
- <div className='flex flex-col bs-full overflow-hidden'>
108
+ <div className='flex flex-col h-full overflow-hidden'>
91
109
  <Toolbar.Root>
92
110
  <Toolbar.Button onClick={handleAdd}>Add</Toolbar.Button>
93
111
  <Toolbar.Button onClick={handleSelect}>Pick</Toolbar.Button>
94
112
  <Toolbar.Button onClick={handleError}>Error</Toolbar.Button>
95
113
  </Toolbar.Root>
96
- <div className='grid grid-cols-2 bs-full gap-4 overflow-hidden'>
97
- <Surface role='item' data={selected ? { id: selected } : undefined} limit={1} />
98
- <div className='overflow-y-auto bs-full'>
114
+ <div className='grid grid-cols-2 h-full gap-4 overflow-hidden'>
115
+ <SurfaceComponent role='item' data={selected ? { id: selected } : undefined} limit={1} ref={ref} />
116
+ <div className='overflow-y-auto h-full'>
99
117
  <List>
100
118
  {surfaces.map((surface) => (
101
119
  <ListItem.Root key={surface.id} id={surface.id}>
@@ -112,7 +130,7 @@ const DefaultStory = () => {
112
130
  const meta = {
113
131
  title: 'sdk/app-framework/Surface',
114
132
  render: DefaultStory,
115
- decorators: [withTheme, withPluginManager({ capabilities: [] })],
133
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' }), withPluginManager({ capabilities: [] })],
116
134
  parameters: {
117
135
  layout: 'fullscreen',
118
136
  },