@dxos/app-framework 0.8.4-main.69d29f4 → 0.8.4-main.6fa680abb7

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 (363) hide show
  1. package/.storybook/main.mts +1 -3
  2. package/dist/lib/browser/{capability-7PCNSWBT.mjs → capability-6YMUBS54.mjs} +15 -11
  3. package/dist/lib/browser/capability-6YMUBS54.mjs.map +7 -0
  4. package/dist/lib/browser/capability-LF3OXSCV.mjs +34 -0
  5. package/dist/lib/browser/capability-LF3OXSCV.mjs.map +7 -0
  6. package/dist/lib/browser/{chunk-PKQT6C53.mjs → chunk-272IPLHQ.mjs} +1 -1
  7. package/dist/lib/browser/{chunk-PKQT6C53.mjs.map → chunk-272IPLHQ.mjs.map} +1 -1
  8. package/dist/lib/browser/{chunk-FMZN33N4.mjs → chunk-2UI6ACB5.mjs} +48 -31
  9. package/dist/lib/browser/chunk-2UI6ACB5.mjs.map +7 -0
  10. package/dist/lib/browser/{chunk-TCLLRCS3.mjs → chunk-7M4467QR.mjs} +6 -6
  11. package/dist/lib/browser/chunk-7M4467QR.mjs.map +7 -0
  12. package/dist/lib/browser/{chunk-7IQHKD4U.mjs → chunk-JGWCBVKJ.mjs} +2 -2
  13. package/dist/lib/browser/chunk-JGWCBVKJ.mjs.map +7 -0
  14. package/dist/lib/browser/chunk-M5IC326L.mjs +34 -0
  15. package/dist/lib/browser/chunk-M5IC326L.mjs.map +7 -0
  16. package/dist/lib/browser/{chunk-XYNO72GQ.mjs → chunk-NQPYE365.mjs} +435 -478
  17. package/dist/lib/browser/chunk-NQPYE365.mjs.map +7 -0
  18. package/dist/lib/browser/chunk-TGX63LTL.mjs +8 -0
  19. package/dist/lib/browser/{chunk-FHQTHCX7.mjs.map → chunk-TGX63LTL.mjs.map} +1 -1
  20. package/dist/lib/browser/chunk-TIEBZMTF.mjs +44 -0
  21. package/dist/lib/browser/chunk-TIEBZMTF.mjs.map +7 -0
  22. package/dist/lib/browser/chunk-WEBSGU5L.mjs +80 -0
  23. package/dist/lib/browser/chunk-WEBSGU5L.mjs.map +7 -0
  24. package/dist/lib/browser/chunk-YAFEA4GV.mjs +1 -0
  25. package/dist/lib/browser/{chunk-6Y7PZV72.mjs → chunk-YNFPIQGB.mjs} +2 -3
  26. package/dist/lib/browser/{chunk-6Y7PZV72.mjs.map → chunk-YNFPIQGB.mjs.map} +3 -3
  27. package/dist/lib/browser/cli/index.mjs +89 -0
  28. package/dist/lib/browser/cli/index.mjs.map +7 -0
  29. package/dist/lib/browser/common/activation-events.mjs +23 -0
  30. package/dist/lib/browser/common/capabilities.mjs +45 -0
  31. package/dist/lib/browser/core/activation-event.mjs +1 -1
  32. package/dist/lib/browser/core/capability.mjs +1 -1
  33. package/dist/lib/browser/core/plugin-manager.mjs +4 -4
  34. package/dist/lib/browser/core/plugin.mjs +2 -2
  35. package/dist/lib/browser/index.mjs +37 -132
  36. package/dist/lib/browser/index.mjs.map +4 -4
  37. package/dist/lib/browser/{invoker-capability-SZRSTHEH.mjs → invoker-capability-4AUGUMM5.mjs} +16 -12
  38. package/dist/lib/browser/invoker-capability-4AUGUMM5.mjs.map +7 -0
  39. package/dist/lib/browser/meta.json +1 -1
  40. package/dist/lib/browser/testing/index.mjs +28 -20
  41. package/dist/lib/browser/testing/index.mjs.map +3 -3
  42. package/dist/lib/browser/{react → ui}/index.mjs +18 -19
  43. package/dist/lib/node-esm/{capability-CFLQ2QQU.mjs → capability-R5O2OYX4.mjs} +15 -11
  44. package/dist/lib/node-esm/capability-R5O2OYX4.mjs.map +7 -0
  45. package/dist/lib/node-esm/capability-SA6LPYGL.mjs +35 -0
  46. package/dist/lib/node-esm/capability-SA6LPYGL.mjs.map +7 -0
  47. package/dist/lib/node-esm/{chunk-663A54LQ.mjs → chunk-3D66SZHP.mjs} +2 -2
  48. package/dist/lib/node-esm/chunk-3D66SZHP.mjs.map +7 -0
  49. package/dist/lib/node-esm/{chunk-7OWSHPYK.mjs → chunk-6REV5DE7.mjs} +1 -1
  50. package/dist/lib/node-esm/{chunk-7OWSHPYK.mjs.map → chunk-6REV5DE7.mjs.map} +1 -1
  51. package/dist/lib/node-esm/{chunk-6WXBT3EC.mjs → chunk-FHWPWQRJ.mjs} +435 -478
  52. package/dist/lib/node-esm/chunk-FHWPWQRJ.mjs.map +7 -0
  53. package/dist/lib/node-esm/{chunk-UEWJDI2L.mjs → chunk-FKE4Z3D6.mjs} +2 -2
  54. package/dist/lib/node-esm/{chunk-UEWJDI2L.mjs.map → chunk-FKE4Z3D6.mjs.map} +1 -1
  55. package/dist/lib/node-esm/{chunk-GT6OKM5I.mjs → chunk-JHFY3HTS.mjs} +6 -6
  56. package/dist/lib/node-esm/chunk-JHFY3HTS.mjs.map +7 -0
  57. package/dist/lib/node-esm/{chunk-XYQTBFPA.mjs → chunk-JIVXIJ2T.mjs} +48 -31
  58. package/dist/lib/node-esm/chunk-JIVXIJ2T.mjs.map +7 -0
  59. package/dist/lib/node-esm/chunk-NHXBSAQR.mjs +35 -0
  60. package/dist/lib/node-esm/chunk-NHXBSAQR.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-STMXUEPO.mjs → chunk-SB5ODNPX.mjs} +2 -3
  62. package/dist/lib/node-esm/{chunk-STMXUEPO.mjs.map → chunk-SB5ODNPX.mjs.map} +3 -3
  63. package/dist/lib/node-esm/chunk-SCDGIGGU.mjs +45 -0
  64. package/dist/lib/node-esm/chunk-SCDGIGGU.mjs.map +7 -0
  65. package/dist/lib/node-esm/chunk-SQICGJBW.mjs +81 -0
  66. package/dist/lib/node-esm/chunk-SQICGJBW.mjs.map +7 -0
  67. package/dist/lib/node-esm/chunk-Z4TJPSMP.mjs +2 -0
  68. package/dist/lib/node-esm/chunk-Z4TJPSMP.mjs.map +7 -0
  69. package/dist/lib/node-esm/cli/index.mjs +90 -0
  70. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  71. package/dist/lib/node-esm/common/activation-events.mjs +24 -0
  72. package/dist/lib/node-esm/common/activation-events.mjs.map +7 -0
  73. package/dist/lib/node-esm/common/capabilities.mjs +46 -0
  74. package/dist/lib/node-esm/common/capabilities.mjs.map +7 -0
  75. package/dist/lib/node-esm/core/activation-event.mjs +1 -1
  76. package/dist/lib/node-esm/core/capability.mjs +1 -1
  77. package/dist/lib/node-esm/core/plugin-manager.mjs +4 -4
  78. package/dist/lib/node-esm/core/plugin.mjs +2 -2
  79. package/dist/lib/node-esm/index.mjs +37 -132
  80. package/dist/lib/node-esm/index.mjs.map +4 -4
  81. package/dist/lib/node-esm/{invoker-capability-PNMA5JOS.mjs → invoker-capability-3YDIVDWV.mjs} +16 -12
  82. package/dist/lib/node-esm/invoker-capability-3YDIVDWV.mjs.map +7 -0
  83. package/dist/lib/node-esm/meta.json +1 -1
  84. package/dist/lib/node-esm/testing/index.mjs +28 -20
  85. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  86. package/dist/lib/node-esm/{react → ui}/index.mjs +18 -19
  87. package/dist/lib/node-esm/ui/index.mjs.map +7 -0
  88. package/dist/types/src/{cli.d.ts → cli/cli.d.ts} +2 -2
  89. package/dist/types/src/cli/cli.d.ts.map +1 -0
  90. package/dist/types/src/cli/index.d.ts +2 -0
  91. package/dist/types/src/cli/index.d.ts.map +1 -0
  92. package/dist/types/src/common/activation-events.d.ts +27 -0
  93. package/dist/types/src/common/activation-events.d.ts.map +1 -0
  94. package/dist/types/src/common/capabilities.d.ts +115 -0
  95. package/dist/types/src/common/capabilities.d.ts.map +1 -0
  96. package/dist/types/src/common/index.d.ts +4 -9
  97. package/dist/types/src/common/index.d.ts.map +1 -1
  98. package/dist/types/src/common/operations.d.ts +1 -348
  99. package/dist/types/src/common/operations.d.ts.map +1 -1
  100. package/dist/types/src/common/translations.d.ts +0 -9
  101. package/dist/types/src/common/translations.d.ts.map +1 -1
  102. package/dist/types/src/core/activation-event.d.ts +1 -1
  103. package/dist/types/src/core/capability.d.ts +7 -7
  104. package/dist/types/src/core/capability.d.ts.map +1 -1
  105. package/dist/types/src/core/plugin-manager.d.ts.map +1 -1
  106. package/dist/types/src/core/plugin.d.ts +1 -1
  107. package/dist/types/src/core/plugin.d.ts.map +1 -1
  108. package/dist/types/src/index.d.ts +1 -3
  109. package/dist/types/src/index.d.ts.map +1 -1
  110. package/dist/types/src/plugin-operation/history/capability.d.ts +1 -1
  111. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts +11 -3
  112. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts.map +1 -1
  113. package/dist/types/src/plugin-operation/invoker-capability.d.ts +1 -1
  114. package/dist/types/src/plugin-runtime/capability.d.ts +2 -2
  115. package/dist/types/src/plugin-runtime/capability.d.ts.map +1 -1
  116. package/dist/types/src/testing/withPluginManager.d.ts +1 -1
  117. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  118. package/dist/types/src/{react → ui/components/App}/App.d.ts +1 -1
  119. package/dist/types/src/ui/components/App/App.d.ts.map +1 -0
  120. package/dist/types/src/{react/Surface.stories.d.ts → ui/components/App/App.stories.d.ts} +7 -2
  121. package/dist/types/src/ui/components/App/App.stories.d.ts.map +1 -0
  122. package/dist/types/src/ui/components/App/index.d.ts +2 -0
  123. package/dist/types/src/ui/components/App/index.d.ts.map +1 -0
  124. package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts.map +1 -0
  125. package/dist/types/src/{react → ui/components/PluginManager}/PluginManagerProvider.d.ts +1 -1
  126. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts.map +1 -0
  127. package/dist/types/src/ui/components/PluginManager/index.d.ts +2 -0
  128. package/dist/types/src/ui/components/PluginManager/index.d.ts.map +1 -0
  129. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts +12 -0
  130. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -0
  131. package/dist/types/src/{react/App.stories.d.ts → ui/components/Surface/SurfaceComponent.stories.d.ts} +1 -1
  132. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts.map +1 -0
  133. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts.map +1 -0
  134. package/dist/types/src/ui/components/Surface/context.d.ts +5 -0
  135. package/dist/types/src/ui/components/Surface/context.d.ts.map +1 -0
  136. package/dist/types/src/ui/components/Surface/index.d.ts +20 -0
  137. package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -0
  138. package/dist/types/src/{common/surface.d.ts → ui/components/Surface/types.d.ts} +20 -18
  139. package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -0
  140. package/dist/types/src/ui/components/index.d.ts +4 -0
  141. package/dist/types/src/ui/components/index.d.ts.map +1 -0
  142. package/dist/types/src/ui/hooks/index.d.ts +7 -0
  143. package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
  144. package/dist/types/src/{react → ui/hooks}/useApp.d.ts +14 -9
  145. package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -0
  146. package/dist/types/src/{react → ui/hooks}/useCapabilities.d.ts +6 -1
  147. package/dist/types/src/ui/hooks/useCapabilities.d.ts.map +1 -0
  148. package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -0
  149. package/dist/types/src/{react → ui/hooks}/useOperationResolver.d.ts +2 -2
  150. package/dist/types/src/ui/hooks/useOperationResolver.d.ts.map +1 -0
  151. package/dist/types/src/{react/common.d.ts → ui/hooks/useSettingsState.d.ts} +1 -5
  152. package/dist/types/src/ui/hooks/useSettingsState.d.ts.map +1 -0
  153. package/dist/types/src/ui/hooks/useSurface.d.ts +3 -0
  154. package/dist/types/src/ui/hooks/useSurface.d.ts.map +1 -0
  155. package/dist/types/src/ui/index.d.ts +3 -0
  156. package/dist/types/src/ui/index.d.ts.map +1 -0
  157. package/dist/types/tsconfig.tsbuildinfo +1 -1
  158. package/moon.yml +6 -6
  159. package/package.json +72 -64
  160. package/src/{cli.ts → cli/cli.ts} +10 -10
  161. package/src/{playground/debug → cli}/index.ts +1 -1
  162. package/src/common/activation-events.ts +44 -0
  163. package/src/common/capabilities.ts +178 -0
  164. package/src/common/index.ts +4 -9
  165. package/src/common/operations.ts +2 -376
  166. package/src/common/translations.ts +0 -12
  167. package/src/context.ts +1 -1
  168. package/src/core/activation-event.ts +1 -1
  169. package/src/core/capability.ts +9 -9
  170. package/src/core/plugin-manager.test.ts +44 -44
  171. package/src/core/plugin-manager.ts +19 -0
  172. package/src/core/plugin.ts +3 -2
  173. package/src/index.ts +1 -3
  174. package/src/plugin-operation/OperationPlugin.ts +5 -5
  175. package/src/plugin-operation/history/capability.ts +5 -5
  176. package/src/plugin-operation/history/undo-mapping.ts +6 -3
  177. package/src/plugin-operation/invoker-capability.ts +5 -5
  178. package/src/plugin-operation/meta.ts +1 -1
  179. package/src/plugin-runtime/RuntimePlugin.ts +4 -4
  180. package/src/plugin-runtime/capability.ts +5 -5
  181. package/src/plugin-runtime/meta.ts +1 -1
  182. package/src/testing/service.ts +6 -6
  183. package/src/testing/withPluginManager.stories.tsx +6 -6
  184. package/src/testing/withPluginManager.tsx +11 -8
  185. package/src/ui/components/App/App.stories.tsx +92 -0
  186. package/src/{react → ui/components/App}/App.tsx +6 -9
  187. package/src/{playground/layout → ui/components/App}/index.ts +1 -1
  188. package/src/{react → ui/components/PluginManager}/PluginManagerContext.stories.tsx +13 -14
  189. package/src/{react → ui/components/PluginManager}/PluginManagerProvider.ts +1 -1
  190. package/src/ui/components/PluginManager/index.ts +5 -0
  191. package/src/{react/Surface.stories.tsx → ui/components/Surface/SurfaceComponent.stories.tsx} +18 -16
  192. package/src/{react/Surface.tsx → ui/components/Surface/SurfaceComponent.tsx} +36 -56
  193. package/src/{react → ui/components/Surface}/SurfaceInfo.tsx +2 -2
  194. package/src/ui/components/Surface/context.ts +12 -0
  195. package/src/ui/components/Surface/index.ts +20 -0
  196. package/src/{common/surface.ts → ui/components/Surface/types.ts} +22 -25
  197. package/src/ui/components/index.ts +7 -0
  198. package/src/ui/hooks/index.ts +10 -0
  199. package/src/{react → ui/hooks}/useApp.tsx +29 -25
  200. package/src/{react → ui/hooks}/useCapabilities.ts +9 -5
  201. package/src/{react → ui/hooks}/useOperationResolver.ts +5 -5
  202. package/src/{react/common.ts → ui/hooks/useSettingsState.ts} +0 -11
  203. package/src/ui/hooks/useSurface.ts +13 -0
  204. package/src/ui/index.ts +6 -0
  205. package/tsconfig.json +2 -29
  206. package/tsconfig.node.json +1 -3
  207. package/typedoc.json +2 -4
  208. package/dist/lib/browser/app-graph-builder-M2VPYQC6.mjs +0 -149
  209. package/dist/lib/browser/app-graph-builder-M2VPYQC6.mjs.map +0 -7
  210. package/dist/lib/browser/capability-7PCNSWBT.mjs.map +0 -7
  211. package/dist/lib/browser/capability-KP3PFEXD.mjs +0 -31
  212. package/dist/lib/browser/capability-KP3PFEXD.mjs.map +0 -7
  213. package/dist/lib/browser/chunk-7IQHKD4U.mjs.map +0 -7
  214. package/dist/lib/browser/chunk-BLQJSGL3.mjs +0 -732
  215. package/dist/lib/browser/chunk-BLQJSGL3.mjs.map +0 -7
  216. package/dist/lib/browser/chunk-FHQTHCX7.mjs +0 -8
  217. package/dist/lib/browser/chunk-FMZN33N4.mjs.map +0 -7
  218. package/dist/lib/browser/chunk-H4WPA7U7.mjs +0 -77
  219. package/dist/lib/browser/chunk-H4WPA7U7.mjs.map +0 -7
  220. package/dist/lib/browser/chunk-TCLLRCS3.mjs.map +0 -7
  221. package/dist/lib/browser/chunk-XYNO72GQ.mjs.map +0 -7
  222. package/dist/lib/browser/common/index.mjs +0 -38
  223. package/dist/lib/browser/invoker-capability-SZRSTHEH.mjs.map +0 -7
  224. package/dist/lib/browser/operation-resolver-6MP2MYOY.mjs +0 -64
  225. package/dist/lib/browser/operation-resolver-6MP2MYOY.mjs.map +0 -7
  226. package/dist/lib/node-esm/app-graph-builder-LROHGJEM.mjs +0 -150
  227. package/dist/lib/node-esm/app-graph-builder-LROHGJEM.mjs.map +0 -7
  228. package/dist/lib/node-esm/capability-CFLQ2QQU.mjs.map +0 -7
  229. package/dist/lib/node-esm/capability-RCUNM2M7.mjs +0 -32
  230. package/dist/lib/node-esm/capability-RCUNM2M7.mjs.map +0 -7
  231. package/dist/lib/node-esm/chunk-663A54LQ.mjs.map +0 -7
  232. package/dist/lib/node-esm/chunk-6WXBT3EC.mjs.map +0 -7
  233. package/dist/lib/node-esm/chunk-GQEBIGKD.mjs +0 -733
  234. package/dist/lib/node-esm/chunk-GQEBIGKD.mjs.map +0 -7
  235. package/dist/lib/node-esm/chunk-GT6OKM5I.mjs.map +0 -7
  236. package/dist/lib/node-esm/chunk-XR6NMKEP.mjs +0 -78
  237. package/dist/lib/node-esm/chunk-XR6NMKEP.mjs.map +0 -7
  238. package/dist/lib/node-esm/chunk-XYQTBFPA.mjs.map +0 -7
  239. package/dist/lib/node-esm/common/index.mjs +0 -39
  240. package/dist/lib/node-esm/invoker-capability-PNMA5JOS.mjs.map +0 -7
  241. package/dist/lib/node-esm/operation-resolver-7YWDMTNU.mjs +0 -65
  242. package/dist/lib/node-esm/operation-resolver-7YWDMTNU.mjs.map +0 -7
  243. package/dist/types/src/cli.d.ts.map +0 -1
  244. package/dist/types/src/common/activation-event.d.ts +0 -66
  245. package/dist/types/src/common/activation-event.d.ts.map +0 -1
  246. package/dist/types/src/common/capability.d.ts +0 -265
  247. package/dist/types/src/common/capability.d.ts.map +0 -1
  248. package/dist/types/src/common/collaboration.d.ts +0 -26
  249. package/dist/types/src/common/collaboration.d.ts.map +0 -1
  250. package/dist/types/src/common/file.d.ts +0 -14
  251. package/dist/types/src/common/file.d.ts.map +0 -1
  252. package/dist/types/src/common/graph.d.ts +0 -21
  253. package/dist/types/src/common/graph.d.ts.map +0 -1
  254. package/dist/types/src/common/plugin.d.ts +0 -201
  255. package/dist/types/src/common/plugin.d.ts.map +0 -1
  256. package/dist/types/src/common/surface.d.ts.map +0 -1
  257. package/dist/types/src/playground/debug/Debug.d.ts +0 -8
  258. package/dist/types/src/playground/debug/Debug.d.ts.map +0 -1
  259. package/dist/types/src/playground/debug/index.d.ts +0 -2
  260. package/dist/types/src/playground/debug/index.d.ts.map +0 -1
  261. package/dist/types/src/playground/debug/plugin.d.ts +0 -3
  262. package/dist/types/src/playground/debug/plugin.d.ts.map +0 -1
  263. package/dist/types/src/playground/generator/Main.d.ts +0 -8
  264. package/dist/types/src/playground/generator/Main.d.ts.map +0 -1
  265. package/dist/types/src/playground/generator/Toolbar.d.ts +0 -8
  266. package/dist/types/src/playground/generator/Toolbar.d.ts.map +0 -1
  267. package/dist/types/src/playground/generator/generator.d.ts +0 -19
  268. package/dist/types/src/playground/generator/generator.d.ts.map +0 -1
  269. package/dist/types/src/playground/generator/index.d.ts +0 -3
  270. package/dist/types/src/playground/generator/index.d.ts.map +0 -1
  271. package/dist/types/src/playground/generator/plugin.d.ts +0 -3
  272. package/dist/types/src/playground/generator/plugin.d.ts.map +0 -1
  273. package/dist/types/src/playground/layout/Layout.d.ts +0 -10
  274. package/dist/types/src/playground/layout/Layout.d.ts.map +0 -1
  275. package/dist/types/src/playground/layout/index.d.ts +0 -2
  276. package/dist/types/src/playground/layout/index.d.ts.map +0 -1
  277. package/dist/types/src/playground/layout/plugin.d.ts +0 -3
  278. package/dist/types/src/playground/layout/plugin.d.ts.map +0 -1
  279. package/dist/types/src/playground/logger/Toolbar.d.ts +0 -8
  280. package/dist/types/src/playground/logger/Toolbar.d.ts.map +0 -1
  281. package/dist/types/src/playground/logger/index.d.ts +0 -2
  282. package/dist/types/src/playground/logger/index.d.ts.map +0 -1
  283. package/dist/types/src/playground/logger/plugin.d.ts +0 -3
  284. package/dist/types/src/playground/logger/plugin.d.ts.map +0 -1
  285. package/dist/types/src/playground/logger/schema.d.ts +0 -27
  286. package/dist/types/src/playground/logger/schema.d.ts.map +0 -1
  287. package/dist/types/src/playground/playground.stories.d.ts +0 -11
  288. package/dist/types/src/playground/playground.stories.d.ts.map +0 -1
  289. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +0 -3
  290. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +0 -1
  291. package/dist/types/src/plugin-settings/actions.d.ts +0 -61
  292. package/dist/types/src/plugin-settings/actions.d.ts.map +0 -1
  293. package/dist/types/src/plugin-settings/app-graph-builder.d.ts +0 -6
  294. package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +0 -1
  295. package/dist/types/src/plugin-settings/index.d.ts +0 -3
  296. package/dist/types/src/plugin-settings/index.d.ts.map +0 -1
  297. package/dist/types/src/plugin-settings/meta.d.ts +0 -3
  298. package/dist/types/src/plugin-settings/meta.d.ts.map +0 -1
  299. package/dist/types/src/plugin-settings/operation-resolver.d.ts +0 -6
  300. package/dist/types/src/plugin-settings/operation-resolver.d.ts.map +0 -1
  301. package/dist/types/src/plugin-settings/translations.d.ts +0 -11
  302. package/dist/types/src/plugin-settings/translations.d.ts.map +0 -1
  303. package/dist/types/src/react/App.d.ts.map +0 -1
  304. package/dist/types/src/react/App.stories.d.ts.map +0 -1
  305. package/dist/types/src/react/DefaultFallback.d.ts +0 -8
  306. package/dist/types/src/react/DefaultFallback.d.ts.map +0 -1
  307. package/dist/types/src/react/ErrorBoundary.d.ts +0 -30
  308. package/dist/types/src/react/ErrorBoundary.d.ts.map +0 -1
  309. package/dist/types/src/react/PluginManagerContext.stories.d.ts.map +0 -1
  310. package/dist/types/src/react/PluginManagerProvider.d.ts.map +0 -1
  311. package/dist/types/src/react/Surface.d.ts +0 -14
  312. package/dist/types/src/react/Surface.d.ts.map +0 -1
  313. package/dist/types/src/react/Surface.stories.d.ts.map +0 -1
  314. package/dist/types/src/react/SurfaceInfo.d.ts.map +0 -1
  315. package/dist/types/src/react/common.d.ts.map +0 -1
  316. package/dist/types/src/react/index.d.ts +0 -9
  317. package/dist/types/src/react/index.d.ts.map +0 -1
  318. package/dist/types/src/react/types.d.ts +0 -12
  319. package/dist/types/src/react/types.d.ts.map +0 -1
  320. package/dist/types/src/react/useApp.d.ts.map +0 -1
  321. package/dist/types/src/react/useCapabilities.d.ts.map +0 -1
  322. package/dist/types/src/react/useLoading.d.ts.map +0 -1
  323. package/dist/types/src/react/useOperationResolver.d.ts.map +0 -1
  324. package/src/common/activation-event.ts +0 -99
  325. package/src/common/capability.ts +0 -343
  326. package/src/common/collaboration.ts +0 -31
  327. package/src/common/file.ts +0 -22
  328. package/src/common/graph.ts +0 -30
  329. package/src/common/plugin.ts +0 -364
  330. package/src/playground/debug/Debug.tsx +0 -49
  331. package/src/playground/debug/plugin.ts +0 -16
  332. package/src/playground/generator/Main.tsx +0 -80
  333. package/src/playground/generator/Toolbar.tsx +0 -57
  334. package/src/playground/generator/generator.ts +0 -48
  335. package/src/playground/generator/index.ts +0 -6
  336. package/src/playground/generator/plugin.ts +0 -21
  337. package/src/playground/layout/Layout.tsx +0 -37
  338. package/src/playground/layout/plugin.ts +0 -18
  339. package/src/playground/logger/Toolbar.tsx +0 -33
  340. package/src/playground/logger/index.ts +0 -5
  341. package/src/playground/logger/plugin.ts +0 -42
  342. package/src/playground/logger/schema.ts +0 -22
  343. package/src/playground/playground.stories.tsx +0 -54
  344. package/src/plugin-settings/SettingsPlugin.ts +0 -19
  345. package/src/plugin-settings/actions.ts +0 -64
  346. package/src/plugin-settings/app-graph-builder.ts +0 -140
  347. package/src/plugin-settings/index.ts +0 -6
  348. package/src/plugin-settings/meta.ts +0 -10
  349. package/src/plugin-settings/operation-resolver.ts +0 -55
  350. package/src/plugin-settings/translations.ts +0 -19
  351. package/src/react/App.stories.tsx +0 -63
  352. package/src/react/DefaultFallback.tsx +0 -26
  353. package/src/react/ErrorBoundary.tsx +0 -56
  354. package/src/react/index.ts +0 -14
  355. package/src/react/types.ts +0 -27
  356. /package/dist/lib/{node-esm/react/index.mjs.map → browser/chunk-YAFEA4GV.mjs.map} +0 -0
  357. /package/dist/lib/{node-esm/common/index.mjs.map → browser/common/activation-events.mjs.map} +0 -0
  358. /package/dist/lib/browser/{react/index.mjs.map → common/capabilities.mjs.map} +0 -0
  359. /package/dist/lib/browser/{common → ui}/index.mjs.map +0 -0
  360. /package/dist/types/src/{react → ui/components/PluginManager}/PluginManagerContext.stories.d.ts +0 -0
  361. /package/dist/types/src/{react → ui/components/Surface}/SurfaceInfo.d.ts +0 -0
  362. /package/dist/types/src/{react → ui/hooks}/useLoading.d.ts +0 -0
  363. /package/src/{react → ui/hooks}/useLoading.tsx +0 -0
@@ -7,9 +7,9 @@ import React from 'react';
7
7
 
8
8
  import { withTheme } from '@dxos/react-ui/testing';
9
9
 
10
- import * as Common from '../common';
10
+ import { Capabilities } from '../common';
11
11
  import { Capability } from '../core';
12
- import { Surface } from '../react';
12
+ import { Surface } from '../ui';
13
13
 
14
14
  import { withPluginManager } from './withPluginManager';
15
15
 
@@ -18,7 +18,7 @@ const DefaultStory = () => {
18
18
  return (
19
19
  <div>
20
20
  <div>Hello</div>
21
- <Surface role='main' />
21
+ <Surface.Surface role='main' />
22
22
  </div>
23
23
  );
24
24
  };
@@ -27,12 +27,12 @@ const meta = {
27
27
  title: 'sdk/app-framework/withPluginManager',
28
28
  render: DefaultStory,
29
29
  decorators: [
30
- withTheme,
30
+ withTheme(),
31
31
  withPluginManager({
32
32
  capabilities: [
33
33
  Capability.contributes(
34
- Common.Capability.ReactSurface,
35
- Common.createSurface({
34
+ Capabilities.ReactSurface,
35
+ Surface.create({
36
36
  id: 'test',
37
37
  role: 'main',
38
38
  component: ({ role }) => <span>{JSON.stringify({ role })}</span>,
@@ -10,9 +10,9 @@ import { raise } from '@dxos/debug';
10
10
  import { useAsyncEffect } from '@dxos/react-hooks';
11
11
  import { type MaybeProvider, getProviderValue } from '@dxos/util';
12
12
 
13
- import * as Common from '../common';
13
+ import { ActivationEvents, Capabilities } from '../common';
14
14
  import { type ActivationEvent, Capability, type CapabilityManager, Plugin, PluginManager } from '../core';
15
- import { type UseAppOptions, useApp } from '../react';
15
+ import { type UseAppOptions, useApp } from '../ui';
16
16
 
17
17
  /**
18
18
  * @internal
@@ -61,18 +61,21 @@ export type WithPluginManagerInitializer<Args = void> =
61
61
  export const withPluginManager = <Args,>(init: WithPluginManagerInitializer<Args> = {}): Decorator => {
62
62
  return (Story, context) => {
63
63
  const options = typeof init === 'function' ? init(context as any) : init;
64
- const pluginManager = useMemo(() => setupPluginManager(options), [init]);
64
+ const { pluginManager, setupEvents } = useMemo(
65
+ () => ({ pluginManager: setupPluginManager(options), setupEvents: options.setupEvents }),
66
+ [init],
67
+ );
65
68
 
66
69
  // Set-up root capability.
67
70
  useEffect(() => {
68
- const capability = Capability.contributes(Common.Capability.ReactRoot, {
71
+ const capability = Capability.contributes(Capabilities.ReactRoot, {
69
72
  id: context.id,
70
73
  root: () => <Story />,
71
74
  });
72
75
 
73
76
  pluginManager.capabilities.contribute({
74
77
  ...capability,
75
- module: 'dxos.org/app-framework/withPluginManager',
78
+ module: 'org.dxos.app-framework.with-plugin-manager',
76
79
  });
77
80
 
78
81
  return () => {
@@ -86,14 +89,14 @@ export const withPluginManager = <Args,>(init: WithPluginManagerInitializer<Args
86
89
  }, [pluginManager]);
87
90
 
88
91
  // Create app.
89
- const App = useApp({ pluginManager });
92
+ const App = useApp({ pluginManager, setupEvents });
90
93
 
91
94
  return <App />;
92
95
  };
93
96
  };
94
97
 
95
98
  const storyMeta = {
96
- id: 'dxos.org/app-framework/story',
99
+ id: 'org.dxos.app-framework.story',
97
100
  name: 'Story',
98
101
  };
99
102
 
@@ -102,7 +105,7 @@ const storyMeta = {
102
105
  const StoryPlugin = Plugin.define(storyMeta).pipe(
103
106
  Plugin.addModule({
104
107
  id: 'Story',
105
- activatesOn: Common.ActivationEvent.Startup,
108
+ activatesOn: ActivationEvents.Startup,
106
109
  activate: () => Effect.succeed([]),
107
110
  }),
108
111
  Plugin.make,
@@ -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,12 +4,9 @@
4
4
 
5
5
  import React, { type PropsWithChildren } from 'react';
6
6
 
7
- import * as Common 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
12
  ready: boolean;
@@ -17,8 +14,8 @@ export type AppProps = Pick<UseAppOptions, 'placeholder' | 'debounce'> & {
17
14
  };
18
15
 
19
16
  export const App = ({ placeholder: Placeholder, ready, error, debounce }: AppProps) => {
20
- const reactContexts = useCapabilities(Common.Capability.ReactContext);
21
- const reactRoots = useCapabilities(Common.Capability.ReactRoot);
17
+ const reactContexts = useCapabilities(Capabilities.ReactContext);
18
+ const reactRoots = useCapabilities(Capabilities.ReactRoot);
22
19
  const stage = useLoading(ready, debounce);
23
20
 
24
21
  if (error) {
@@ -45,7 +42,7 @@ export const App = ({ placeholder: Placeholder, ready, error, debounce }: AppPro
45
42
  );
46
43
  };
47
44
 
48
- const composeContexts = (contexts: Common.Capability.ReactContext[]) => {
45
+ const composeContexts = (contexts: Capabilities.ReactContext[]) => {
49
46
  if (contexts.length === 0) {
50
47
  return ({ children }: PropsWithChildren) => <>{children}</>;
51
48
  }
@@ -2,4 +2,4 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- export * from './plugin';
5
+ export * from './App';
@@ -7,14 +7,13 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
7
7
  import * as Effect from 'effect/Effect';
8
8
  import React, { useEffect, useMemo, useState } from 'react';
9
9
 
10
- import { withTheme } from '@dxos/react-ui/testing';
10
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
11
11
  import { useWebComponentContext } from '@dxos/web-context-react';
12
12
 
13
- import * as Common from '../common';
14
- import { PluginManagerContext } from '../context';
15
- import { Capability, Plugin } from '../core';
16
-
17
- import { useApp } from './useApp';
13
+ import { ActivationEvents, Capabilities } from '../../../common';
14
+ import { PluginManagerContext } from '../../../context';
15
+ import { Capability, Plugin } from '../../../core';
16
+ import { useApp } from '../../hooks';
18
17
 
19
18
  // Define the Counter capability
20
19
  const Counter = Capability.make<{ count: number; increment: () => void }>('example/counter');
@@ -79,7 +78,7 @@ const CounterComponent = () => {
79
78
  }, [counter]);
80
79
 
81
80
  if (!manager) {
82
- return <div className='p-4 text-red-500'>Error: Context not found</div>;
81
+ return <div className='p-4 text-error-text'>Error: Context not found</div>;
83
82
  }
84
83
 
85
84
  return (
@@ -105,7 +104,7 @@ const CounterComponent = () => {
105
104
  <CountStatus />
106
105
  </div>
107
106
 
108
- <div className='mt-8 pt-4 border-bs border-neutral-200 dark:border-neutral-700 text-center'>
107
+ <div className='mt-8 pt-4 border-t border-neutral-200 dark:border-neutral-700 text-center'>
109
108
  <p className='text-sm text-neutral-500 dark:text-neutral-400'>
110
109
  This component accesses the <code>PluginManager</code> via <code>useWebComponentContext</code>.
111
110
  </p>
@@ -117,12 +116,12 @@ const CounterComponent = () => {
117
116
 
118
117
  // Plugin that provides the Counter capability and renders the UI
119
118
  const CounterPlugin = Plugin.define({
120
- id: 'dxos.org/plugin/counter',
119
+ id: 'org.dxos.plugin.counter',
121
120
  name: 'Counter Plugin',
122
121
  }).pipe(
123
122
  Plugin.addModule({
124
123
  id: 'CounterMain',
125
- activatesOn: Common.ActivationEvent.Startup,
124
+ activatesOn: ActivationEvents.Startup,
126
125
  activate: () => {
127
126
  const listeners = new Set<() => void>();
128
127
  const counter = {
@@ -142,8 +141,8 @@ const CounterPlugin = Plugin.define({
142
141
  Capability.contributes(Counter, counter),
143
142
 
144
143
  // Contribute the UI
145
- Capability.contributes(Common.Capability.ReactRoot, {
146
- id: 'dxos.org/plugin/counter/root',
144
+ Capability.contributes(Capabilities.ReactRoot, {
145
+ id: 'org.dxos.plugin.counter.root',
147
146
  root: CounterComponent,
148
147
  }),
149
148
  ]);
@@ -153,7 +152,7 @@ const CounterPlugin = Plugin.define({
153
152
  )();
154
153
 
155
154
  const plugins = [CounterPlugin];
156
- const core = ['dxos.org/plugin/counter'];
155
+ const core = ['org.dxos.plugin.counter'];
157
156
  const placeholder = () => (
158
157
  <div className='flex h-screen items-center justify-center p-4 text-lg text-neutral-500'>
159
158
  Initializing Application...
@@ -173,7 +172,7 @@ const DefaultStory = () => {
173
172
  const meta = {
174
173
  title: 'sdk/app-framework/PluginManagerContext',
175
174
  render: DefaultStory,
176
- decorators: [withTheme],
175
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
177
176
  parameters: {
178
177
  layout: 'fullscreen',
179
178
  },
@@ -6,7 +6,7 @@ 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
11
  const PluginManagerContext = createContext<PluginManager.PluginManager | undefined>(undefined);
12
12
 
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './PluginManagerProvider';
@@ -7,14 +7,15 @@ import React, { forwardRef, useCallback, useEffect, useRef, useState } from 'rea
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';
10
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
11
11
  import { type ColorStyles, getHashStyles, mx } from '@dxos/ui-theme';
12
12
 
13
- import * as Common 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';
18
19
 
19
20
  type TestComponentProps = {
20
21
  id: string;
@@ -24,7 +25,7 @@ type TestComponentProps = {
24
25
  const TestComponent = forwardRef<HTMLDivElement, TestComponentProps>(({ styles, id }, forwardedRef) => {
25
26
  return (
26
27
  <div
27
- className={mx('flex justify-center items-center border rounded', styles.surface, styles.border)}
28
+ className={mx('flex justify-center items-center border rounded-sm', styles.surface, styles.border)}
28
29
  ref={forwardedRef}
29
30
  >
30
31
  <span className={mx('dx-tag font-mono text-lg', styles.text)}>{id}</span>
@@ -40,10 +41,11 @@ const DefaultStory = () => {
40
41
  const handleAdd = useCallback(() => {
41
42
  const id = `test-${faker.number.int({ min: 0, max: 1_000 })}`;
42
43
  const styles = getHashStyles(id);
44
+
43
45
  manager.capabilities.contribute({
44
46
  module: 'test',
45
- interface: Common.Capability.ReactSurface,
46
- implementation: Common.createSurface({
47
+ interface: Capabilities.ReactSurface,
48
+ implementation: create({
47
49
  id,
48
50
  role: 'item',
49
51
  filter: (data): data is any => (data as any)?.id === id,
@@ -61,8 +63,8 @@ const DefaultStory = () => {
61
63
  const handleError = useCallback(() => {
62
64
  manager.capabilities.contribute({
63
65
  module: 'error',
64
- interface: Common.Capability.ReactSurface,
65
- implementation: Common.createSurface({
66
+ interface: Capabilities.ReactSurface,
67
+ implementation: create({
66
68
  id: 'error',
67
69
  role: 'item',
68
70
  filter: (data): data is any => (data as any)?.id === 'error',
@@ -86,7 +88,7 @@ const DefaultStory = () => {
86
88
  }
87
89
 
88
90
  return (
89
- <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'>
90
92
  <span className='font-mono'>Ticking... {count}</span>
91
93
  </div>
92
94
  );
@@ -103,15 +105,15 @@ const DefaultStory = () => {
103
105
  }, [ref]);
104
106
 
105
107
  return (
106
- <div className='flex flex-col bs-full overflow-hidden'>
108
+ <div className='flex flex-col h-full overflow-hidden'>
107
109
  <Toolbar.Root>
108
110
  <Toolbar.Button onClick={handleAdd}>Add</Toolbar.Button>
109
111
  <Toolbar.Button onClick={handleSelect}>Pick</Toolbar.Button>
110
112
  <Toolbar.Button onClick={handleError}>Error</Toolbar.Button>
111
113
  </Toolbar.Root>
112
- <div className='grid grid-cols-2 bs-full gap-4 overflow-hidden'>
113
- <Surface role='item' data={selected ? { id: selected } : undefined} limit={1} ref={ref} />
114
- <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'>
115
117
  <List>
116
118
  {surfaces.map((surface) => (
117
119
  <ListItem.Root key={surface.id} id={surface.id}>
@@ -128,7 +130,7 @@ const DefaultStory = () => {
128
130
  const meta = {
129
131
  title: 'sdk/app-framework/Surface',
130
132
  render: DefaultStory,
131
- decorators: [withTheme, withPluginManager({ capabilities: [] })],
133
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' }), withPluginManager({ capabilities: [] })],
132
134
  parameters: {
133
135
  layout: 'fullscreen',
134
136
  },
@@ -3,47 +3,40 @@
3
3
  //
4
4
 
5
5
  import React, {
6
- type Context,
7
6
  Fragment,
8
7
  type NamedExoticComponent,
9
8
  type RefAttributes,
10
9
  Suspense,
11
- createContext,
12
10
  forwardRef,
13
11
  memo,
14
- useContext,
15
12
  useEffect,
16
13
  useMemo,
17
14
  useRef,
18
15
  } from 'react';
19
16
 
20
- import { raise } from '@dxos/debug';
21
17
  import { log } from '@dxos/log';
18
+ import { ErrorBoundary } from '@dxos/react-error-boundary';
22
19
  import { useDefaultValue } from '@dxos/react-hooks';
23
20
  import { byPosition } from '@dxos/util';
24
21
 
25
- import * as Common from '../common';
26
- import { type CapabilityManager } from '../core';
22
+ import { Capabilities } from '../../../common';
23
+ import { type CapabilityManager } from '../../../core';
24
+ import { useCapabilities } from '../../hooks';
27
25
 
28
- import { ErrorBoundary } from './ErrorBoundary';
26
+ import { SurfaceContext } from './context';
29
27
  import { SurfaceInfo } from './SurfaceInfo';
30
- import { useCapabilities } from './useCapabilities';
28
+ import { type Definition, type Props, type WebComponentDefinition } from './types';
31
29
 
32
30
  const DEFAULT_PLACEHOLDER = <Fragment />;
33
31
 
34
32
  const DEBUG = import.meta.env.VITE_DEBUG;
35
33
 
36
- export type SurfaceContext = Pick<Common.SurfaceProps, 'id' | 'role' | 'data'>;
37
-
38
- // TODO(burdon): Use @radix-ui/react-context
39
- const SurfaceContext: Context<SurfaceContext | undefined> = createContext<SurfaceContext | undefined>(undefined);
40
-
41
34
  /**
42
35
  * Wrapper component for rendering Web Component surfaces.
43
36
  * Handles creation, prop setting, and cleanup of Web Components.
44
37
  */
45
38
  const WebComponentWrapper = memo(
46
- forwardRef<HTMLElement, Common.SurfaceProps & { definition: Common.WebComponentSurfaceDefinition }>(
39
+ forwardRef<HTMLElement, Props & { definition: WebComponentDefinition }>(
47
40
  ({ id, role, data, limit, definition, ...rest }, forwardedRef) => {
48
41
  const containerRef = useRef<HTMLDivElement>(null);
49
42
  const elementRef = useRef<HTMLElement | null>(null);
@@ -54,7 +47,9 @@ const WebComponentWrapper = memo(
54
47
 
55
48
  // Create element only once
56
49
  useEffect(() => {
57
- if (!containerRef.current || elementRef.current) return;
50
+ if (!containerRef.current || elementRef.current) {
51
+ return;
52
+ }
58
53
 
59
54
  // Create the Web Component
60
55
  const element = document.createElement(definition.tagName);
@@ -91,7 +86,9 @@ const WebComponentWrapper = memo(
91
86
  // This runs on every render to ensure all props (including those in `rest`) are kept up to date
92
87
  useEffect(() => {
93
88
  const element = elementRef.current;
94
- if (!element) return;
89
+ if (!element) {
90
+ return;
91
+ }
95
92
 
96
93
  // Update properties on the existing Web Component
97
94
  Object.assign(element, propsRef.current);
@@ -107,15 +104,16 @@ WebComponentWrapper.displayName = 'WebComponentWrapper';
107
104
  /**
108
105
  * Wrapper component that provides context for a surface.
109
106
  */
107
+ // TODO(burdon): Allow DebugPlugin to provide different fallback using react-ui ErrorFallback.
110
108
  const SurfaceContextProvider = memo(
111
- forwardRef<HTMLElement, Common.SurfaceProps & { definition: Common.SurfaceDefinition }>(
112
- ({ id, role, data, limit, fallback = DefaultFallback, definition, ...rest }, forwardedRef) => {
109
+ forwardRef<HTMLElement, Props & { definition: Definition }>(
110
+ ({ id, role, data, limit, fallback = ErrorFallback, definition, ...rest }, forwardedRef) => {
113
111
  const contextValue = useMemo(() => ({ id, role, data }), [id, role, data]);
114
112
 
115
113
  // Handle Web Component surfaces
116
114
  if (definition.kind === 'web-component') {
117
115
  return (
118
- <ErrorBoundary data={data} fallback={fallback}>
116
+ <ErrorBoundary name='surface' resetKeys={[data]} FallbackComponent={fallback}>
119
117
  <SurfaceContext.Provider value={contextValue}>
120
118
  <WebComponentWrapper
121
119
  id={id}
@@ -138,7 +136,7 @@ const SurfaceContextProvider = memo(
138
136
  const debug = DEBUG || '__DX_DEBUG__' in window;
139
137
  if (debug) {
140
138
  return (
141
- <ErrorBoundary data={data} fallback={fallback}>
139
+ <ErrorBoundary name='surface' resetKeys={[data]} FallbackComponent={fallback}>
142
140
  <div role='none' className='contents' data-id={id} data-role={role}>
143
141
  <SurfaceContext.Provider value={contextValue}>
144
142
  <SurfaceInfo ref={forwardedRef}>
@@ -151,7 +149,7 @@ const SurfaceContextProvider = memo(
151
149
  }
152
150
 
153
151
  return (
154
- <ErrorBoundary data={data} fallback={fallback}>
152
+ <ErrorBoundary name='surface' resetKeys={[data]} FallbackComponent={fallback}>
155
153
  <div role='none' className='contents' data-id={id} data-role={role}>
156
154
  <SurfaceContext.Provider value={contextValue}>
157
155
  <Component id={id} role={role} data={data} limit={limit} {...rest} ref={forwardedRef} />
@@ -165,15 +163,11 @@ const SurfaceContextProvider = memo(
165
163
 
166
164
  SurfaceContextProvider.displayName = 'SurfaceContextProvider';
167
165
 
168
- export const useSurface = (): SurfaceContext => {
169
- const context = useContext(SurfaceContext) ?? raise(new Error('Missing SurfaceContext'));
170
- return context;
171
- };
172
-
173
166
  /**
174
167
  * A surface is a named region of the screen that can be populated by plugins.
175
168
  */
176
- export const Surface: NamedExoticComponent<Common.SurfaceProps & RefAttributes<HTMLElement>> = memo(
169
+ // TODO(burdon): Remove `ref` since relying on this would be error prone.
170
+ export const SurfaceComponent: NamedExoticComponent<Props & RefAttributes<HTMLElement>> = memo(
177
171
  forwardRef(({ id: _id, role, data: dataProp, limit, placeholder = DEFAULT_PLACEHOLDER, ...rest }, forwardedRef) => {
178
172
  const data = useDefaultValue(dataProp, () => ({}));
179
173
 
@@ -211,12 +205,19 @@ export const Surface: NamedExoticComponent<Common.SurfaceProps & RefAttributes<H
211
205
  }),
212
206
  );
213
207
 
214
- Surface.displayName = 'Surface';
208
+ SurfaceComponent.displayName = 'Surface';
215
209
 
216
- const findCandidates = (
217
- surfaces: Common.SurfaceDefinition[],
218
- { role, data }: Pick<Common.SurfaceProps, 'role' | 'data'>,
219
- ) => {
210
+ // TODO(burdon): Make user facing, with telemetry.
211
+ const ErrorFallback = ({ error }: Props) => {
212
+ const { message } = error instanceof Error ? error : { message: String(error) };
213
+ return (
214
+ <div role='alert' data-testid='error-boundary-fallback'>
215
+ <h1 className='flex gap-2 text-sm mt-2 text-info-text'>{message}</h1>
216
+ </div>
217
+ );
218
+ };
219
+
220
+ const findCandidates = (surfaces: Definition[], { role, data }: Pick<Props, 'role' | 'data'>) => {
220
221
  return Object.values(surfaces)
221
222
  .filter((definition) =>
222
223
  Array.isArray(definition.role) ? definition.role.includes(role) : definition.role === role,
@@ -225,32 +226,11 @@ const findCandidates = (
225
226
  .toSorted(byPosition);
226
227
  };
227
228
 
228
- // TODO(burdon): Make user facing, with telemetry.
229
- // TODO(burdon): Change based on dev/prod mode; infer subject type, id.
230
- const DefaultFallback = ({ data, error, dev }: { data: any; error: Error; dev?: boolean }) => {
231
- if (dev) {
232
- return (
233
- <div className='flex flex-col gap-4 p-4 is-full overflow-y-auto'>
234
- <h1 className='flex gap-2 text-sm mbs-2'>{error.message}</h1>
235
- <pre className='overflow-auto text-xs text-description'>{JSON.stringify(data, null, 2)}</pre>
236
- </div>
237
- );
238
- }
239
-
240
- return (
241
- <div className='flex flex-col gap-4 p-4 is-full overflow-y-auto border border-roseFill'>
242
- <h1 className='flex gap-2 text-sm mbs-2 text-rose-500'>{error.message}</h1>
243
- <pre className='overflow-auto text-xs text-description'>{error.stack}</pre>
244
- <pre className='overflow-auto text-xs text-description'>{JSON.stringify(data, null, 2)}</pre>
245
- </div>
246
- );
247
- };
248
-
249
229
  /**
250
230
  * @internal
251
231
  */
252
232
  export const useSurfaces = () => {
253
- const surfaces = useCapabilities(Common.Capability.ReactSurface);
233
+ const surfaces = useCapabilities(Capabilities.ReactSurface);
254
234
  return useMemo(() => surfaces.flat(), [surfaces]);
255
235
  };
256
236
 
@@ -259,9 +239,9 @@ export const useSurfaces = () => {
259
239
  */
260
240
  export const isSurfaceAvailable = (
261
241
  capabilityManager: CapabilityManager.CapabilityManager,
262
- { role, data }: Pick<Common.SurfaceProps, 'role' | 'data'>,
242
+ { role, data }: Pick<Props, 'role' | 'data'>,
263
243
  ) => {
264
- const surfaces = capabilityManager.getAll(Common.Capability.ReactSurface);
244
+ const surfaces = capabilityManager.getAll(Capabilities.ReactSurface);
265
245
  const candidates = findCandidates(surfaces.flat(), { role, data });
266
246
  return candidates.length > 0;
267
247
  };
@@ -16,7 +16,7 @@ import { createPortal } from 'react-dom';
16
16
  import { addEventListener, combine } from '@dxos/async';
17
17
  import { useMergeRefs } from '@dxos/react-hooks';
18
18
 
19
- import { useSurface } from './Surface';
19
+ import { useSurface } from '../../hooks';
20
20
 
21
21
  export type SurfaceInfoProps = {
22
22
  children: ReactElement<{ ref?: Ref<HTMLElement> }>;
@@ -76,7 +76,7 @@ export const SurfaceInfo = forwardRef<HTMLElement, SurfaceInfoProps>(({ children
76
76
  >
77
77
  {expand ? (
78
78
  <div
79
- className='absolute inset-0 bg-deckSurface border border-green-500 cursor-pointer pointer-events-auto overflow-auto'
79
+ className='absolute inset-0 bg-deck-surface border border-green-500 cursor-pointer pointer-events-auto overflow-auto'
80
80
  onPointerDown={(ev) => ev.stopPropagation()}
81
81
  onClick={(ev) => {
82
82
  ev.stopPropagation();
@@ -0,0 +1,12 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Context, createContext } from 'react';
6
+
7
+ import { type Props } from './types';
8
+
9
+ export type SurfaceContext = Pick<Props, 'id' | 'role' | 'data'>;
10
+
11
+ // TODO(burdon): Use @radix-ui/react-context
12
+ export const SurfaceContext: Context<SurfaceContext | undefined> = createContext<SurfaceContext | undefined>(undefined);