@dxos/app-framework 0.8.4-main.84f28bd → 0.8.4-main.937b3ca

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 (594) hide show
  1. package/.storybook/main.mts +11 -0
  2. package/.storybook/preview.mts +8 -0
  3. package/.swc/plugins/linux_x86_64_19.0.0/727453fb3a62f7f1d952a41e051ca8a6f88cadc45cee43c6a4d1aa45f9b75665.wasmer-v7 +0 -0
  4. package/dist/lib/browser/app-graph-builder-M2VPYQC6.mjs +149 -0
  5. package/dist/lib/browser/app-graph-builder-M2VPYQC6.mjs.map +7 -0
  6. package/dist/lib/browser/capability-7PCNSWBT.mjs +33 -0
  7. package/dist/lib/browser/capability-7PCNSWBT.mjs.map +7 -0
  8. package/dist/lib/browser/capability-KP3PFEXD.mjs +31 -0
  9. package/dist/lib/browser/capability-KP3PFEXD.mjs.map +7 -0
  10. package/dist/lib/browser/chunk-6Y7PZV72.mjs +77 -0
  11. package/dist/lib/browser/chunk-6Y7PZV72.mjs.map +7 -0
  12. package/dist/lib/browser/chunk-7IQHKD4U.mjs +170 -0
  13. package/dist/lib/browser/chunk-7IQHKD4U.mjs.map +7 -0
  14. package/dist/lib/browser/chunk-BLQJSGL3.mjs +732 -0
  15. package/dist/lib/browser/chunk-BLQJSGL3.mjs.map +7 -0
  16. package/dist/lib/browser/chunk-FHQTHCX7.mjs +8 -0
  17. package/dist/lib/browser/chunk-FHQTHCX7.mjs.map +7 -0
  18. package/dist/lib/browser/chunk-FMZN33N4.mjs +807 -0
  19. package/dist/lib/browser/chunk-FMZN33N4.mjs.map +7 -0
  20. package/dist/lib/browser/chunk-H4WPA7U7.mjs +77 -0
  21. package/dist/lib/browser/chunk-H4WPA7U7.mjs.map +7 -0
  22. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  23. package/dist/lib/browser/chunk-PKQT6C53.mjs +47 -0
  24. package/dist/lib/browser/chunk-PKQT6C53.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-TCLLRCS3.mjs +145 -0
  26. package/dist/lib/browser/chunk-TCLLRCS3.mjs.map +7 -0
  27. package/dist/lib/browser/chunk-XYNO72GQ.mjs +746 -0
  28. package/dist/lib/browser/chunk-XYNO72GQ.mjs.map +7 -0
  29. package/dist/lib/browser/common/index.mjs +38 -0
  30. package/dist/lib/browser/core/activation-event.mjs +20 -0
  31. package/dist/lib/browser/core/capability.mjs +28 -0
  32. package/dist/lib/browser/core/plugin-manager.mjs +15 -0
  33. package/dist/lib/browser/core/plugin-manager.mjs.map +7 -0
  34. package/dist/lib/browser/core/plugin.mjs +27 -0
  35. package/dist/lib/browser/core/plugin.mjs.map +7 -0
  36. package/dist/lib/browser/index.mjs +165 -139
  37. package/dist/lib/browser/index.mjs.map +4 -4
  38. package/dist/lib/browser/invoker-capability-SZRSTHEH.mjs +32 -0
  39. package/dist/lib/browser/invoker-capability-SZRSTHEH.mjs.map +7 -0
  40. package/dist/lib/browser/meta.json +1 -1
  41. package/dist/lib/browser/operation-resolver-6MP2MYOY.mjs +64 -0
  42. package/dist/lib/browser/operation-resolver-6MP2MYOY.mjs.map +7 -0
  43. package/dist/lib/browser/react/index.mjs +46 -0
  44. package/dist/lib/browser/react/index.mjs.map +7 -0
  45. package/dist/lib/browser/testing/index.mjs +79 -37
  46. package/dist/lib/browser/testing/index.mjs.map +4 -4
  47. package/dist/lib/node-esm/app-graph-builder-LROHGJEM.mjs +150 -0
  48. package/dist/lib/node-esm/app-graph-builder-LROHGJEM.mjs.map +7 -0
  49. package/dist/lib/node-esm/capability-CFLQ2QQU.mjs +34 -0
  50. package/dist/lib/node-esm/capability-CFLQ2QQU.mjs.map +7 -0
  51. package/dist/lib/node-esm/capability-RCUNM2M7.mjs +32 -0
  52. package/dist/lib/node-esm/capability-RCUNM2M7.mjs.map +7 -0
  53. package/dist/lib/node-esm/chunk-663A54LQ.mjs +171 -0
  54. package/dist/lib/node-esm/chunk-663A54LQ.mjs.map +7 -0
  55. package/dist/lib/node-esm/chunk-6WXBT3EC.mjs +747 -0
  56. package/dist/lib/node-esm/chunk-6WXBT3EC.mjs.map +7 -0
  57. package/dist/lib/node-esm/chunk-7OWSHPYK.mjs +48 -0
  58. package/dist/lib/node-esm/chunk-7OWSHPYK.mjs.map +7 -0
  59. package/dist/lib/node-esm/chunk-GQEBIGKD.mjs +733 -0
  60. package/dist/lib/node-esm/chunk-GQEBIGKD.mjs.map +7 -0
  61. package/dist/lib/node-esm/chunk-GT6OKM5I.mjs +146 -0
  62. package/dist/lib/node-esm/chunk-GT6OKM5I.mjs.map +7 -0
  63. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  64. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  65. package/dist/lib/node-esm/chunk-STMXUEPO.mjs +78 -0
  66. package/dist/lib/node-esm/chunk-STMXUEPO.mjs.map +7 -0
  67. package/dist/lib/node-esm/chunk-UEWJDI2L.mjs +10 -0
  68. package/dist/lib/node-esm/chunk-UEWJDI2L.mjs.map +7 -0
  69. package/dist/lib/node-esm/chunk-XR6NMKEP.mjs +78 -0
  70. package/dist/lib/node-esm/chunk-XR6NMKEP.mjs.map +7 -0
  71. package/dist/lib/node-esm/chunk-XYQTBFPA.mjs +808 -0
  72. package/dist/lib/node-esm/chunk-XYQTBFPA.mjs.map +7 -0
  73. package/dist/lib/node-esm/common/index.mjs +39 -0
  74. package/dist/lib/node-esm/common/index.mjs.map +7 -0
  75. package/dist/lib/node-esm/core/activation-event.mjs +21 -0
  76. package/dist/lib/node-esm/core/activation-event.mjs.map +7 -0
  77. package/dist/lib/node-esm/core/capability.mjs +29 -0
  78. package/dist/lib/node-esm/core/capability.mjs.map +7 -0
  79. package/dist/lib/node-esm/core/plugin-manager.mjs +16 -0
  80. package/dist/lib/node-esm/core/plugin-manager.mjs.map +7 -0
  81. package/dist/lib/node-esm/core/plugin.mjs +28 -0
  82. package/dist/lib/node-esm/core/plugin.mjs.map +7 -0
  83. package/dist/lib/node-esm/index.mjs +165 -139
  84. package/dist/lib/node-esm/index.mjs.map +4 -4
  85. package/dist/lib/node-esm/invoker-capability-PNMA5JOS.mjs +33 -0
  86. package/dist/lib/node-esm/invoker-capability-PNMA5JOS.mjs.map +7 -0
  87. package/dist/lib/node-esm/meta.json +1 -1
  88. package/dist/lib/node-esm/operation-resolver-7YWDMTNU.mjs +65 -0
  89. package/dist/lib/node-esm/operation-resolver-7YWDMTNU.mjs.map +7 -0
  90. package/dist/lib/node-esm/react/index.mjs +47 -0
  91. package/dist/lib/node-esm/react/index.mjs.map +7 -0
  92. package/dist/lib/node-esm/testing/index.mjs +79 -37
  93. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  94. package/dist/types/src/cli.d.ts +39 -0
  95. package/dist/types/src/cli.d.ts.map +1 -0
  96. package/dist/types/src/common/activation-event.d.ts +66 -0
  97. package/dist/types/src/common/activation-event.d.ts.map +1 -0
  98. package/dist/types/src/common/capability.d.ts +265 -0
  99. package/dist/types/src/common/capability.d.ts.map +1 -0
  100. package/dist/types/src/common/collaboration.d.ts +24 -17
  101. package/dist/types/src/common/collaboration.d.ts.map +1 -1
  102. package/dist/types/src/common/file.d.ts +1 -1
  103. package/dist/types/src/common/file.d.ts.map +1 -1
  104. package/dist/types/src/common/graph.d.ts +2 -2
  105. package/dist/types/src/common/graph.d.ts.map +1 -1
  106. package/dist/types/src/common/index.d.ts +4 -3
  107. package/dist/types/src/common/index.d.ts.map +1 -1
  108. package/dist/types/src/common/operations.d.ts +380 -0
  109. package/dist/types/src/common/operations.d.ts.map +1 -0
  110. package/dist/types/src/common/plugin.d.ts +201 -0
  111. package/dist/types/src/common/plugin.d.ts.map +1 -0
  112. package/dist/types/src/common/surface.d.ts +50 -21
  113. package/dist/types/src/common/surface.d.ts.map +1 -1
  114. package/dist/types/src/common/translations.d.ts +10 -1
  115. package/dist/types/src/common/translations.d.ts.map +1 -1
  116. package/dist/types/src/context.d.ts +5 -0
  117. package/dist/types/src/context.d.ts.map +1 -0
  118. package/dist/types/src/core/{events.d.ts → activation-event.d.ts} +6 -6
  119. package/dist/types/src/core/activation-event.d.ts.map +1 -0
  120. package/dist/types/src/core/capability-manager.d.ts +43 -0
  121. package/dist/types/src/core/capability-manager.d.ts.map +1 -0
  122. package/dist/types/src/core/capability-manager.test.d.ts +2 -0
  123. package/dist/types/src/core/capability-manager.test.d.ts.map +1 -0
  124. package/dist/types/src/core/capability.d.ts +150 -0
  125. package/dist/types/src/core/capability.d.ts.map +1 -0
  126. package/dist/types/src/core/index.d.ts +5 -4
  127. package/dist/types/src/core/index.d.ts.map +1 -1
  128. package/dist/types/src/core/plugin-manager.d.ts +66 -0
  129. package/dist/types/src/core/plugin-manager.d.ts.map +1 -0
  130. package/dist/types/src/core/plugin-manager.test.d.ts +2 -0
  131. package/dist/types/src/core/plugin-manager.test.d.ts.map +1 -0
  132. package/dist/types/src/core/plugin.d.ts +97 -32
  133. package/dist/types/src/core/plugin.d.ts.map +1 -1
  134. package/dist/types/src/index.d.ts +5 -4
  135. package/dist/types/src/index.d.ts.map +1 -1
  136. package/dist/types/src/playground/debug/Debug.d.ts +4 -2
  137. package/dist/types/src/playground/debug/Debug.d.ts.map +1 -1
  138. package/dist/types/src/playground/debug/plugin.d.ts +2 -1
  139. package/dist/types/src/playground/debug/plugin.d.ts.map +1 -1
  140. package/dist/types/src/playground/generator/Main.d.ts +4 -2
  141. package/dist/types/src/playground/generator/Main.d.ts.map +1 -1
  142. package/dist/types/src/playground/generator/Toolbar.d.ts +4 -2
  143. package/dist/types/src/playground/generator/Toolbar.d.ts.map +1 -1
  144. package/dist/types/src/playground/generator/generator.d.ts +17 -5
  145. package/dist/types/src/playground/generator/generator.d.ts.map +1 -1
  146. package/dist/types/src/playground/generator/plugin.d.ts +2 -1
  147. package/dist/types/src/playground/generator/plugin.d.ts.map +1 -1
  148. package/dist/types/src/playground/layout/Layout.d.ts +4 -2
  149. package/dist/types/src/playground/layout/Layout.d.ts.map +1 -1
  150. package/dist/types/src/playground/layout/plugin.d.ts +2 -1
  151. package/dist/types/src/playground/layout/plugin.d.ts.map +1 -1
  152. package/dist/types/src/playground/logger/Toolbar.d.ts +4 -2
  153. package/dist/types/src/playground/logger/Toolbar.d.ts.map +1 -1
  154. package/dist/types/src/playground/logger/plugin.d.ts +2 -1
  155. package/dist/types/src/playground/logger/plugin.d.ts.map +1 -1
  156. package/dist/types/src/playground/logger/schema.d.ts +15 -1
  157. package/dist/types/src/playground/logger/schema.d.ts.map +1 -1
  158. package/dist/types/src/playground/playground.stories.d.ts +5 -4
  159. package/dist/types/src/playground/playground.stories.d.ts.map +1 -1
  160. package/dist/types/src/plugin-operation/OperationPlugin.d.ts +3 -0
  161. package/dist/types/src/plugin-operation/OperationPlugin.d.ts.map +1 -0
  162. package/dist/types/src/plugin-operation/history/capability.d.ts +7 -0
  163. package/dist/types/src/plugin-operation/history/capability.d.ts.map +1 -0
  164. package/dist/types/src/plugin-operation/history/errors.d.ts +5 -0
  165. package/dist/types/src/plugin-operation/history/errors.d.ts.map +1 -0
  166. package/dist/types/src/plugin-operation/history/history-tracker.d.ts +18 -0
  167. package/dist/types/src/plugin-operation/history/history-tracker.d.ts.map +1 -0
  168. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts +2 -0
  169. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts.map +1 -0
  170. package/dist/types/src/plugin-operation/history/index.d.ts +6 -0
  171. package/dist/types/src/plugin-operation/history/index.d.ts.map +1 -0
  172. package/dist/types/src/plugin-operation/history/types.d.ts +13 -0
  173. package/dist/types/src/plugin-operation/history/types.d.ts.map +1 -0
  174. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts +93 -0
  175. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts.map +1 -0
  176. package/dist/types/src/plugin-operation/history/undo-registry.d.ts +23 -0
  177. package/dist/types/src/plugin-operation/history/undo-registry.d.ts.map +1 -0
  178. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts +2 -0
  179. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts.map +1 -0
  180. package/dist/types/src/plugin-operation/index.d.ts +3 -0
  181. package/dist/types/src/plugin-operation/index.d.ts.map +1 -0
  182. package/dist/types/src/plugin-operation/invoker-capability.d.ts +6 -0
  183. package/dist/types/src/plugin-operation/invoker-capability.d.ts.map +1 -0
  184. package/dist/types/src/plugin-operation/meta.d.ts +3 -0
  185. package/dist/types/src/plugin-operation/meta.d.ts.map +1 -0
  186. package/dist/types/src/plugin-operation/testing.d.ts +109 -0
  187. package/dist/types/src/plugin-operation/testing.d.ts.map +1 -0
  188. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts +3 -0
  189. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts.map +1 -0
  190. package/dist/types/src/plugin-runtime/capability.d.ts +6 -0
  191. package/dist/types/src/plugin-runtime/capability.d.ts.map +1 -0
  192. package/dist/types/src/plugin-runtime/index.d.ts +2 -0
  193. package/dist/types/src/plugin-runtime/index.d.ts.map +1 -0
  194. package/dist/types/src/plugin-runtime/meta.d.ts +3 -0
  195. package/dist/types/src/plugin-runtime/meta.d.ts.map +1 -0
  196. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +2 -1
  197. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +1 -1
  198. package/dist/types/src/plugin-settings/actions.d.ts +41 -7
  199. package/dist/types/src/plugin-settings/actions.d.ts.map +1 -1
  200. package/dist/types/src/plugin-settings/app-graph-builder.d.ts +4 -2
  201. package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +1 -1
  202. package/dist/types/src/plugin-settings/meta.d.ts +3 -0
  203. package/dist/types/src/plugin-settings/meta.d.ts.map +1 -0
  204. package/dist/types/src/plugin-settings/operation-resolver.d.ts +6 -0
  205. package/dist/types/src/plugin-settings/operation-resolver.d.ts.map +1 -0
  206. package/dist/types/src/plugin-settings/translations.d.ts +2 -1
  207. package/dist/types/src/plugin-settings/translations.d.ts.map +1 -1
  208. package/dist/types/src/react/App.d.ts +8 -0
  209. package/dist/types/src/react/App.d.ts.map +1 -0
  210. package/dist/types/src/react/App.stories.d.ts +14 -0
  211. package/dist/types/src/react/App.stories.d.ts.map +1 -0
  212. package/dist/types/src/react/DefaultFallback.d.ts +8 -0
  213. package/dist/types/src/react/DefaultFallback.d.ts.map +1 -0
  214. package/dist/types/src/react/ErrorBoundary.d.ts +13 -14
  215. package/dist/types/src/react/ErrorBoundary.d.ts.map +1 -1
  216. package/dist/types/src/react/PluginManagerContext.stories.d.ts +13 -0
  217. package/dist/types/src/react/PluginManagerContext.stories.d.ts.map +1 -0
  218. package/dist/types/src/react/PluginManagerProvider.d.ts +2 -2
  219. package/dist/types/src/react/PluginManagerProvider.d.ts.map +1 -1
  220. package/dist/types/src/react/Surface.d.ts +9 -7
  221. package/dist/types/src/react/Surface.d.ts.map +1 -1
  222. package/dist/types/src/react/Surface.stories.d.ts +8 -10
  223. package/dist/types/src/react/Surface.stories.d.ts.map +1 -1
  224. package/dist/types/src/react/SurfaceInfo.d.ts +11 -0
  225. package/dist/types/src/react/SurfaceInfo.d.ts.map +1 -0
  226. package/dist/types/src/react/common.d.ts +13 -12
  227. package/dist/types/src/react/common.d.ts.map +1 -1
  228. package/dist/types/src/react/index.d.ts +3 -1
  229. package/dist/types/src/react/index.d.ts.map +1 -1
  230. package/dist/types/src/react/types.d.ts +12 -0
  231. package/dist/types/src/react/types.d.ts.map +1 -0
  232. package/dist/types/src/{App.d.ts → react/useApp.d.ts} +11 -9
  233. package/dist/types/src/react/useApp.d.ts.map +1 -0
  234. package/dist/types/src/react/useCapabilities.d.ts +16 -3
  235. package/dist/types/src/react/useCapabilities.d.ts.map +1 -1
  236. package/dist/types/src/react/useLoading.d.ts +18 -0
  237. package/dist/types/src/react/useLoading.d.ts.map +1 -0
  238. package/dist/types/src/react/useOperationResolver.d.ts +19 -0
  239. package/dist/types/src/react/useOperationResolver.d.ts.map +1 -0
  240. package/dist/types/src/testing/index.d.ts +1 -0
  241. package/dist/types/src/testing/index.d.ts.map +1 -1
  242. package/dist/types/src/testing/service.d.ts +8 -0
  243. package/dist/types/src/testing/service.d.ts.map +1 -0
  244. package/dist/types/src/testing/withPluginManager.d.ts +11 -10
  245. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  246. package/dist/types/src/testing/withPluginManager.stories.d.ts +9 -3
  247. package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
  248. package/dist/types/tsconfig.tsbuildinfo +1 -1
  249. package/moon.yml +10 -2
  250. package/package.json +103 -42
  251. package/src/cli.ts +107 -0
  252. package/src/common/activation-event.ts +99 -0
  253. package/src/common/capability.ts +343 -0
  254. package/src/common/collaboration.ts +24 -14
  255. package/src/common/file.ts +1 -1
  256. package/src/common/graph.ts +2 -2
  257. package/src/common/index.ts +4 -3
  258. package/src/common/operations.ts +412 -0
  259. package/src/common/plugin.ts +364 -0
  260. package/src/common/surface.ts +60 -26
  261. package/src/common/translations.ts +21 -1
  262. package/src/context.ts +9 -0
  263. package/src/core/{events.ts → activation-event.ts} +5 -5
  264. package/src/core/capability-manager.test.ts +151 -0
  265. package/src/core/capability-manager.ts +171 -0
  266. package/src/core/capability.ts +236 -0
  267. package/src/core/index.ts +5 -4
  268. package/src/core/plugin-manager.test.ts +845 -0
  269. package/src/core/plugin-manager.ts +696 -0
  270. package/src/core/plugin.ts +229 -36
  271. package/src/helpers.test.ts +1 -1
  272. package/src/index.ts +5 -4
  273. package/src/playground/debug/Debug.tsx +27 -17
  274. package/src/playground/debug/plugin.ts +10 -11
  275. package/src/playground/generator/Main.tsx +20 -11
  276. package/src/playground/generator/Toolbar.tsx +27 -16
  277. package/src/playground/generator/generator.ts +28 -28
  278. package/src/playground/generator/plugin.ts +15 -17
  279. package/src/playground/layout/Layout.tsx +11 -7
  280. package/src/playground/layout/plugin.ts +12 -11
  281. package/src/playground/logger/Toolbar.tsx +20 -16
  282. package/src/playground/logger/plugin.ts +33 -27
  283. package/src/playground/logger/schema.ts +11 -1
  284. package/src/playground/playground.stories.tsx +29 -17
  285. package/src/plugin-operation/OperationPlugin.ts +25 -0
  286. package/src/plugin-operation/history/capability.ts +37 -0
  287. package/src/plugin-operation/history/errors.ts +11 -0
  288. package/src/plugin-operation/history/history-tracker.test.ts +380 -0
  289. package/src/plugin-operation/history/history-tracker.ts +129 -0
  290. package/src/plugin-operation/history/index.ts +9 -0
  291. package/src/plugin-operation/history/types.ts +17 -0
  292. package/src/plugin-operation/history/undo-mapping.ts +132 -0
  293. package/src/plugin-operation/history/undo-registry.test.ts +73 -0
  294. package/src/plugin-operation/history/undo-registry.ts +54 -0
  295. package/src/plugin-operation/index.ts +6 -0
  296. package/src/plugin-operation/invoker-capability.ts +40 -0
  297. package/src/plugin-operation/meta.ts +11 -0
  298. package/src/plugin-operation/testing.ts +174 -0
  299. package/src/plugin-runtime/RuntimePlugin.ts +20 -0
  300. package/src/plugin-runtime/capability.ts +53 -0
  301. package/src/plugin-runtime/index.ts +5 -0
  302. package/src/plugin-runtime/meta.ts +11 -0
  303. package/src/plugin-settings/SettingsPlugin.ts +13 -29
  304. package/src/plugin-settings/actions.ts +45 -10
  305. package/src/plugin-settings/app-graph-builder.ts +124 -141
  306. package/src/plugin-settings/meta.ts +10 -0
  307. package/src/plugin-settings/operation-resolver.ts +55 -0
  308. package/src/plugin-settings/translations.ts +4 -4
  309. package/src/react/App.stories.tsx +63 -0
  310. package/src/react/App.tsx +60 -0
  311. package/src/react/DefaultFallback.tsx +26 -0
  312. package/src/react/ErrorBoundary.tsx +26 -15
  313. package/src/react/PluginManagerContext.stories.tsx +184 -0
  314. package/src/react/PluginManagerProvider.ts +2 -2
  315. package/src/react/Surface.stories.tsx +103 -58
  316. package/src/react/Surface.tsx +236 -46
  317. package/src/react/SurfaceInfo.tsx +107 -0
  318. package/src/react/common.ts +30 -5
  319. package/src/react/index.ts +5 -1
  320. package/src/react/types.ts +27 -0
  321. package/src/react/useApp.tsx +209 -0
  322. package/src/react/useCapabilities.ts +38 -5
  323. package/src/react/useLoading.tsx +68 -0
  324. package/src/react/useOperationResolver.ts +40 -0
  325. package/src/testing/index.ts +1 -0
  326. package/src/testing/service.ts +52 -0
  327. package/src/testing/withPluginManager.stories.tsx +14 -10
  328. package/src/testing/withPluginManager.tsx +43 -44
  329. package/tsconfig.json +30 -16
  330. package/vitest.config.ts +8 -6
  331. package/.eslintrc.cjs +0 -9
  332. package/.swc/plugins/v7_linux_x86_64_13.0.0/f45bdff002284d9e8f9ef3f0be909de12da36c049cbcf261ac78fc00abb09a2d +0 -0
  333. package/.swc/plugins/v7_linux_x86_64_13.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429 +0 -0
  334. package/dist/lib/browser/app-graph-builder-BGGXLD6T.mjs +0 -137
  335. package/dist/lib/browser/app-graph-builder-BGGXLD6T.mjs.map +0 -7
  336. package/dist/lib/browser/chunk-2636QSIK.mjs +0 -1518
  337. package/dist/lib/browser/chunk-2636QSIK.mjs.map +0 -7
  338. package/dist/lib/browser/chunk-DHZB7HG7.mjs +0 -413
  339. package/dist/lib/browser/chunk-DHZB7HG7.mjs.map +0 -7
  340. package/dist/lib/browser/chunk-ORWHM7CO.mjs +0 -32
  341. package/dist/lib/browser/chunk-ORWHM7CO.mjs.map +0 -7
  342. package/dist/lib/browser/intent-dispatcher-TWKB22NI.mjs +0 -11
  343. package/dist/lib/browser/intent-resolver-O67UANYP.mjs +0 -39
  344. package/dist/lib/browser/intent-resolver-O67UANYP.mjs.map +0 -7
  345. package/dist/lib/browser/store-LFKDWHUQ.mjs +0 -30
  346. package/dist/lib/browser/store-LFKDWHUQ.mjs.map +0 -7
  347. package/dist/lib/browser/worker.mjs +0 -79
  348. package/dist/lib/node-esm/app-graph-builder-QHIJUYYW.mjs +0 -138
  349. package/dist/lib/node-esm/app-graph-builder-QHIJUYYW.mjs.map +0 -7
  350. package/dist/lib/node-esm/chunk-NJAFK626.mjs +0 -414
  351. package/dist/lib/node-esm/chunk-NJAFK626.mjs.map +0 -7
  352. package/dist/lib/node-esm/chunk-UMZQERLE.mjs +0 -34
  353. package/dist/lib/node-esm/chunk-UMZQERLE.mjs.map +0 -7
  354. package/dist/lib/node-esm/chunk-VSKRV3NW.mjs +0 -1520
  355. package/dist/lib/node-esm/chunk-VSKRV3NW.mjs.map +0 -7
  356. package/dist/lib/node-esm/intent-dispatcher-5PRM3KGH.mjs +0 -12
  357. package/dist/lib/node-esm/intent-resolver-K3D4BXQQ.mjs +0 -40
  358. package/dist/lib/node-esm/intent-resolver-K3D4BXQQ.mjs.map +0 -7
  359. package/dist/lib/node-esm/store-53XDUBMD.mjs +0 -31
  360. package/dist/lib/node-esm/store-53XDUBMD.mjs.map +0 -7
  361. package/dist/lib/node-esm/worker.mjs +0 -80
  362. package/dist/types/src/App.d.ts.map +0 -1
  363. package/dist/types/src/common/capabilities.d.ts +0 -122
  364. package/dist/types/src/common/capabilities.d.ts.map +0 -1
  365. package/dist/types/src/common/events.d.ts +0 -52
  366. package/dist/types/src/common/events.d.ts.map +0 -1
  367. package/dist/types/src/common/layout.d.ts +0 -281
  368. package/dist/types/src/common/layout.d.ts.map +0 -1
  369. package/dist/types/src/core/capabilities.d.ts +0 -114
  370. package/dist/types/src/core/capabilities.d.ts.map +0 -1
  371. package/dist/types/src/core/capabilities.test.d.ts +0 -2
  372. package/dist/types/src/core/capabilities.test.d.ts.map +0 -1
  373. package/dist/types/src/core/events.d.ts.map +0 -1
  374. package/dist/types/src/core/manager.d.ts +0 -122
  375. package/dist/types/src/core/manager.d.ts.map +0 -1
  376. package/dist/types/src/core/manager.test.d.ts +0 -2
  377. package/dist/types/src/core/manager.test.d.ts.map +0 -1
  378. package/dist/types/src/plugin-intent/IntentPlugin.d.ts +0 -2
  379. package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +0 -1
  380. package/dist/types/src/plugin-intent/actions.d.ts +0 -38
  381. package/dist/types/src/plugin-intent/actions.d.ts.map +0 -1
  382. package/dist/types/src/plugin-intent/errors.d.ts +0 -16
  383. package/dist/types/src/plugin-intent/errors.d.ts.map +0 -1
  384. package/dist/types/src/plugin-intent/index.d.ts +0 -5
  385. package/dist/types/src/plugin-intent/index.d.ts.map +0 -1
  386. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +0 -139
  387. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +0 -1
  388. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts +0 -2
  389. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts.map +0 -1
  390. package/dist/types/src/plugin-intent/intent.d.ts +0 -63
  391. package/dist/types/src/plugin-intent/intent.d.ts.map +0 -1
  392. package/dist/types/src/plugin-settings/intent-resolver.d.ts +0 -4
  393. package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +0 -1
  394. package/dist/types/src/plugin-settings/store.d.ts +0 -5
  395. package/dist/types/src/plugin-settings/store.d.ts.map +0 -1
  396. package/dist/types/src/react/IntentContext.d.ts +0 -8
  397. package/dist/types/src/react/IntentContext.d.ts.map +0 -1
  398. package/dist/types/src/react/useIntentResolver.d.ts +0 -3
  399. package/dist/types/src/react/useIntentResolver.d.ts.map +0 -1
  400. package/dist/types/src/worker.d.ts +0 -4
  401. package/dist/types/src/worker.d.ts.map +0 -1
  402. package/src/App.tsx +0 -276
  403. package/src/common/capabilities.ts +0 -113
  404. package/src/common/events.ts +0 -77
  405. package/src/common/layout.ts +0 -278
  406. package/src/core/capabilities.test.ts +0 -136
  407. package/src/core/capabilities.ts +0 -254
  408. package/src/core/manager.test.ts +0 -515
  409. package/src/core/manager.ts +0 -519
  410. package/src/plugin-intent/IntentPlugin.ts +0 -20
  411. package/src/plugin-intent/actions.ts +0 -33
  412. package/src/plugin-intent/errors.ts +0 -39
  413. package/src/plugin-intent/index.ts +0 -8
  414. package/src/plugin-intent/intent-dispatcher.test.ts +0 -279
  415. package/src/plugin-intent/intent-dispatcher.ts +0 -333
  416. package/src/plugin-intent/intent.ts +0 -154
  417. package/src/plugin-settings/intent-resolver.ts +0 -34
  418. package/src/plugin-settings/store.ts +0 -33
  419. package/src/react/IntentContext.tsx +0 -34
  420. package/src/react/useIntentResolver.ts +0 -22
  421. package/src/worker.ts +0 -11
  422. package/typedoc/.nojekyll +0 -1
  423. package/typedoc/assets/hierarchy.js +0 -1
  424. package/typedoc/assets/highlight.css +0 -106
  425. package/typedoc/assets/icons.js +0 -18
  426. package/typedoc/assets/icons.svg +0 -1
  427. package/typedoc/assets/main.js +0 -60
  428. package/typedoc/assets/navigation.js +0 -1
  429. package/typedoc/assets/search.js +0 -1
  430. package/typedoc/assets/style.css +0 -1640
  431. package/typedoc/classes/CollaborationActions.InsertContent.html +0 -421
  432. package/typedoc/classes/ErrorBoundary.html +0 -125
  433. package/typedoc/classes/IntentAction.ShowUndo.html +0 -227
  434. package/typedoc/classes/IntentAction.Track.html +0 -266
  435. package/typedoc/classes/LayoutAction.AddToast.html +0 -265
  436. package/typedoc/classes/LayoutAction.Close.html +0 -382
  437. package/typedoc/classes/LayoutAction.Expose.html +0 -265
  438. package/typedoc/classes/LayoutAction.Open.html +0 -1123
  439. package/typedoc/classes/LayoutAction.RevertWorkspace.html +0 -343
  440. package/typedoc/classes/LayoutAction.ScrollIntoView.html +0 -460
  441. package/typedoc/classes/LayoutAction.Set.html +0 -460
  442. package/typedoc/classes/LayoutAction.SetLayoutMode.html +0 -499
  443. package/typedoc/classes/LayoutAction.SwitchWorkspace.html +0 -265
  444. package/typedoc/classes/LayoutAction.UpdateComplementary.html +0 -616
  445. package/typedoc/classes/LayoutAction.UpdateDialog.html +0 -1123
  446. package/typedoc/classes/LayoutAction.UpdateLayout.html +0 -461
  447. package/typedoc/classes/LayoutAction.UpdatePopover.html +0 -1435
  448. package/typedoc/classes/LayoutAction.UpdateSidebar.html +0 -616
  449. package/typedoc/classes/Plugin.html +0 -6
  450. package/typedoc/classes/PluginContext.html +0 -38
  451. package/typedoc/classes/PluginManager.html +0 -43
  452. package/typedoc/classes/PluginModule.html +0 -18
  453. package/typedoc/classes/SettingsAction.Open.html +0 -226
  454. package/typedoc/classes/SettingsAction.OpenPluginRegistry.html +0 -265
  455. package/typedoc/functions/Events.createStateEvent.html +0 -2
  456. package/typedoc/functions/IntentPlugin.html +0 -1
  457. package/typedoc/functions/SettingsPlugin.html +0 -1
  458. package/typedoc/functions/allOf.html +0 -2
  459. package/typedoc/functions/chain.html +0 -3
  460. package/typedoc/functions/contributes.html +0 -2
  461. package/typedoc/functions/createDispatcher.html +0 -3
  462. package/typedoc/functions/createIntent.html +0 -6
  463. package/typedoc/functions/createResolver.html +0 -2
  464. package/typedoc/functions/createSurface.html +0 -2
  465. package/typedoc/functions/defineCapability.html +0 -2
  466. package/typedoc/functions/defineEvent.html +0 -2
  467. package/typedoc/functions/defineModule.html +0 -2
  468. package/typedoc/functions/definePlugin.html +0 -2
  469. package/typedoc/functions/eventKey.html +0 -2
  470. package/typedoc/functions/getEvents.html +0 -2
  471. package/typedoc/functions/isAllOf.html +0 -2
  472. package/typedoc/functions/isOneOf.html +0 -2
  473. package/typedoc/functions/isSurfaceAvailable.html +0 -2
  474. package/typedoc/functions/lazy.html +0 -2
  475. package/typedoc/functions/oneOf.html +0 -2
  476. package/typedoc/functions/useApp.html +0 -6
  477. package/typedoc/functions/useAppGraph.html +0 -1
  478. package/typedoc/functions/useCapabilities.html +0 -3
  479. package/typedoc/functions/useCapability.html +0 -4
  480. package/typedoc/functions/useIntentDispatcher.html +0 -1
  481. package/typedoc/functions/useIntentResolver.html +0 -1
  482. package/typedoc/functions/useLayout.html +0 -1
  483. package/typedoc/functions/usePluginManager.html +0 -2
  484. package/typedoc/hierarchy.html +0 -1
  485. package/typedoc/index.html +0 -12
  486. package/typedoc/interfaces/LayoutAction.Toast.html +0 -10
  487. package/typedoc/media/LICENSE +0 -8
  488. package/typedoc/modules/Capabilities.html +0 -1
  489. package/typedoc/modules/CollaborationActions.html +0 -1
  490. package/typedoc/modules/Events.html +0 -1
  491. package/typedoc/modules/IntentAction.html +0 -1
  492. package/typedoc/modules/LayoutAction.html +0 -2
  493. package/typedoc/modules/SettingsAction.html +0 -1
  494. package/typedoc/modules.html +0 -1
  495. package/typedoc/types/ActivationEvent.html +0 -8
  496. package/typedoc/types/ActivationEvents.html +0 -2
  497. package/typedoc/types/AnyCapability.html +0 -1
  498. package/typedoc/types/AnyIntent.html +0 -1
  499. package/typedoc/types/AnyIntentChain.html +0 -1
  500. package/typedoc/types/AnyIntentEffectResult.html +0 -1
  501. package/typedoc/types/AnyIntentResolver.html +0 -1
  502. package/typedoc/types/AnyIntentResult.html +0 -1
  503. package/typedoc/types/Capabilities.FileUploader.html +0 -1
  504. package/typedoc/types/Capabilities.IntentResolver.html +0 -1
  505. package/typedoc/types/Capabilities.Layout.html +0 -1
  506. package/typedoc/types/Capabilities.Metadata.html +0 -1
  507. package/typedoc/types/Capabilities.ReactContext.html +0 -1
  508. package/typedoc/types/Capabilities.ReactRoot.html +0 -1
  509. package/typedoc/types/Capabilities.ReactSurface.html +0 -1
  510. package/typedoc/types/Capabilities.Settings.html +0 -4
  511. package/typedoc/types/Capability.html +0 -9
  512. package/typedoc/types/CreateAppOptions.html +0 -10
  513. package/typedoc/types/FileInfo.html +0 -1
  514. package/typedoc/types/Intent.html +0 -10
  515. package/typedoc/types/IntentChain.html +0 -6
  516. package/typedoc/types/IntentContext.html +0 -5
  517. package/typedoc/types/IntentData.html +0 -1
  518. package/typedoc/types/IntentDispatcher.html +0 -2
  519. package/typedoc/types/IntentDispatcherResult.html +0 -2
  520. package/typedoc/types/IntentEffectDefinition.html +0 -2
  521. package/typedoc/types/IntentEffectResult.html +0 -15
  522. package/typedoc/types/IntentParams.html +0 -3
  523. package/typedoc/types/IntentResolver.html +0 -2
  524. package/typedoc/types/IntentResultData.html +0 -1
  525. package/typedoc/types/IntentSchema.html +0 -1
  526. package/typedoc/types/IntentUndo.html +0 -2
  527. package/typedoc/types/InterfaceDef.html +0 -4
  528. package/typedoc/types/Label.html +0 -1
  529. package/typedoc/types/NodeSerializer.html +0 -8
  530. package/typedoc/types/PluginManagerOptions.html +0 -6
  531. package/typedoc/types/PluginMeta.html +0 -21
  532. package/typedoc/types/PromiseIntentDispatcher.html +0 -2
  533. package/typedoc/types/PromiseIntentUndo.html +0 -2
  534. package/typedoc/types/Resource.html +0 -1
  535. package/typedoc/types/ResourceKey.html +0 -1
  536. package/typedoc/types/ResourceLanguage.html +0 -1
  537. package/typedoc/types/SerializedNode.html +0 -4
  538. package/typedoc/types/SurfaceComponent.html +0 -2
  539. package/typedoc/types/SurfaceDefinition.html +0 -2
  540. package/typedoc/types/SurfaceProps.html +0 -4
  541. package/typedoc/variables/Capabilities.AnchorSort.html +0 -1
  542. package/typedoc/variables/Capabilities.AppGraph.html +0 -1
  543. package/typedoc/variables/Capabilities.AppGraphBuilder.html +0 -1
  544. package/typedoc/variables/Capabilities.AppGraphSerializer.html +0 -1
  545. package/typedoc/variables/Capabilities.ArtifactDefinition.html +0 -1
  546. package/typedoc/variables/Capabilities.FileUploader.html +0 -1
  547. package/typedoc/variables/Capabilities.IntentDispatcher.html +0 -1
  548. package/typedoc/variables/Capabilities.IntentResolver.html +0 -1
  549. package/typedoc/variables/Capabilities.Layout.html +0 -1
  550. package/typedoc/variables/Capabilities.Metadata.html +0 -1
  551. package/typedoc/variables/Capabilities.Null.html +0 -1
  552. package/typedoc/variables/Capabilities.PluginManager.html +0 -1
  553. package/typedoc/variables/Capabilities.ReactContext.html +0 -1
  554. package/typedoc/variables/Capabilities.ReactRoot.html +0 -1
  555. package/typedoc/variables/Capabilities.ReactSurface.html +0 -1
  556. package/typedoc/variables/Capabilities.RxRegistry.html +0 -1
  557. package/typedoc/variables/Capabilities.Settings.html +0 -1
  558. package/typedoc/variables/Capabilities.SettingsStore.html +0 -1
  559. package/typedoc/variables/Capabilities.Tools.html +0 -1
  560. package/typedoc/variables/Capabilities.Translations.html +0 -1
  561. package/typedoc/variables/Events.AppGraphReady.html +0 -2
  562. package/typedoc/variables/Events.DispatcherReady.html +0 -2
  563. package/typedoc/variables/Events.LayoutReady.html +0 -1
  564. package/typedoc/variables/Events.SettingsReady.html +0 -2
  565. package/typedoc/variables/Events.SetupAppGraph.html +0 -2
  566. package/typedoc/variables/Events.SetupArtifactDefinition.html +0 -2
  567. package/typedoc/variables/Events.SetupIntentResolver.html +0 -2
  568. package/typedoc/variables/Events.SetupMetadata.html +0 -2
  569. package/typedoc/variables/Events.SetupReactSurface.html +0 -2
  570. package/typedoc/variables/Events.SetupSettings.html +0 -2
  571. package/typedoc/variables/Events.SetupTranslations.html +0 -2
  572. package/typedoc/variables/Events.Startup.html +0 -2
  573. package/typedoc/variables/FileInfoSchema.html +0 -1
  574. package/typedoc/variables/INTENT_ACTION.html +0 -1
  575. package/typedoc/variables/INTENT_PLUGIN.html +0 -1
  576. package/typedoc/variables/LAYOUT_ACTION.html +0 -1
  577. package/typedoc/variables/LAYOUT_PLUGIN.html +0 -1
  578. package/typedoc/variables/Label.html +0 -1
  579. package/typedoc/variables/LayoutAction.Toast.html +0 -1
  580. package/typedoc/variables/LayoutAction.UPDATE_LAYOUT.html +0 -1
  581. package/typedoc/variables/PluginManagerProvider.html +0 -2
  582. package/typedoc/variables/Resource.html +0 -2
  583. package/typedoc/variables/ResourceKey.html +0 -1
  584. package/typedoc/variables/ResourceLanguage.html +0 -1
  585. package/typedoc/variables/SETTINGS_ACTION.html +0 -1
  586. package/typedoc/variables/SETTINGS_ID.html +0 -1
  587. package/typedoc/variables/SETTINGS_KEY.html +0 -1
  588. package/typedoc/variables/SETTINGS_PLUGIN.html +0 -1
  589. package/typedoc/variables/Surface.html +0 -2
  590. package/typedoc/variables/defaultFileTypes.html +0 -1
  591. /package/dist/lib/browser/{intent-dispatcher-TWKB22NI.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  592. /package/dist/lib/browser/{worker.mjs.map → common/index.mjs.map} +0 -0
  593. /package/dist/lib/{node-esm/intent-dispatcher-5PRM3KGH.mjs.map → browser/core/activation-event.mjs.map} +0 -0
  594. /package/dist/lib/{node-esm/worker.mjs.map → browser/core/capability.mjs.map} +0 -0
@@ -2,27 +2,221 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import React, { memo, forwardRef, Suspense, useMemo, Fragment } from 'react';
5
+ import React, {
6
+ type Context,
7
+ Fragment,
8
+ type NamedExoticComponent,
9
+ type RefAttributes,
10
+ Suspense,
11
+ createContext,
12
+ forwardRef,
13
+ memo,
14
+ useContext,
15
+ useEffect,
16
+ useMemo,
17
+ useRef,
18
+ } from 'react';
6
19
 
20
+ import { raise } from '@dxos/debug';
21
+ import { log } from '@dxos/log';
7
22
  import { useDefaultValue } from '@dxos/react-hooks';
8
23
  import { byPosition } from '@dxos/util';
9
24
 
25
+ import * as Common from '../common';
26
+ import { type CapabilityManager } from '../core';
27
+
10
28
  import { ErrorBoundary } from './ErrorBoundary';
29
+ import { SurfaceInfo } from './SurfaceInfo';
11
30
  import { useCapabilities } from './useCapabilities';
12
- import { Capabilities, type SurfaceDefinition, type SurfaceProps } from '../common';
13
- import { type PluginContext } from '../core';
14
31
 
15
32
  const DEFAULT_PLACEHOLDER = <Fragment />;
16
33
 
34
+ const DEBUG = import.meta.env.VITE_DEBUG;
35
+
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
+
17
41
  /**
18
- * @internal
42
+ * Wrapper component for rendering Web Component surfaces.
43
+ * Handles creation, prop setting, and cleanup of Web Components.
19
44
  */
20
- export const useSurfaces = () => {
21
- const surfaces = useCapabilities(Capabilities.ReactSurface);
22
- return useMemo(() => surfaces.flat(), [surfaces]);
45
+ const WebComponentWrapper = memo(
46
+ forwardRef<HTMLElement, Common.SurfaceProps & { definition: Common.WebComponentSurfaceDefinition }>(
47
+ ({ id, role, data, limit, definition, ...rest }, forwardedRef) => {
48
+ const containerRef = useRef<HTMLDivElement>(null);
49
+ const elementRef = useRef<HTMLElement | null>(null);
50
+ const propsRef = useRef({ id, role, data, limit, ...rest });
51
+
52
+ // Update props ref on every render
53
+ propsRef.current = { id, role, data, limit, ...rest };
54
+
55
+ // Create element only once
56
+ useEffect(() => {
57
+ if (!containerRef.current || elementRef.current) return;
58
+
59
+ // Create the Web Component
60
+ const element = document.createElement(definition.tagName);
61
+ elementRef.current = element;
62
+
63
+ // Set initial properties on the Web Component
64
+ Object.assign(element, propsRef.current);
65
+
66
+ // Append to container
67
+ containerRef.current.appendChild(element);
68
+
69
+ // Setup ref forwarding if provided
70
+ if (typeof forwardedRef === 'function') {
71
+ forwardedRef(element);
72
+ } else if (forwardedRef) {
73
+ forwardedRef.current = element;
74
+ }
75
+
76
+ // Cleanup on unmount to prevent memory leaks
77
+ return () => {
78
+ if (elementRef.current && containerRef.current?.contains(elementRef.current)) {
79
+ containerRef.current.removeChild(elementRef.current);
80
+ }
81
+ if (typeof forwardedRef === 'function') {
82
+ forwardedRef(null);
83
+ } else if (forwardedRef) {
84
+ forwardedRef.current = null;
85
+ }
86
+ elementRef.current = null;
87
+ };
88
+ }, [definition.tagName, forwardedRef]);
89
+
90
+ // Update props on existing element without recreating it
91
+ // This runs on every render to ensure all props (including those in `rest`) are kept up to date
92
+ useEffect(() => {
93
+ const element = elementRef.current;
94
+ if (!element) return;
95
+
96
+ // Update properties on the existing Web Component
97
+ Object.assign(element, propsRef.current);
98
+ });
99
+
100
+ return <div ref={containerRef} />;
101
+ },
102
+ ),
103
+ );
104
+
105
+ WebComponentWrapper.displayName = 'WebComponentWrapper';
106
+
107
+ /**
108
+ * Wrapper component that provides context for a surface.
109
+ */
110
+ const SurfaceContextProvider = memo(
111
+ forwardRef<HTMLElement, Common.SurfaceProps & { definition: Common.SurfaceDefinition }>(
112
+ ({ id, role, data, limit, fallback = DefaultFallback, definition, ...rest }, forwardedRef) => {
113
+ const contextValue = useMemo(() => ({ id, role, data }), [id, role, data]);
114
+
115
+ // Handle Web Component surfaces
116
+ if (definition.kind === 'web-component') {
117
+ return (
118
+ <ErrorBoundary data={data} fallback={fallback}>
119
+ <SurfaceContext.Provider value={contextValue}>
120
+ <WebComponentWrapper
121
+ id={id}
122
+ role={role}
123
+ data={data}
124
+ limit={limit}
125
+ definition={definition}
126
+ ref={forwardedRef}
127
+ {...rest}
128
+ />
129
+ </SurfaceContext.Provider>
130
+ </ErrorBoundary>
131
+ );
132
+ }
133
+
134
+ // Handle React component surfaces
135
+ const Component = definition.component;
136
+
137
+ // TODO(burdon): Remove from production build?
138
+ const debug = DEBUG || '__DX_DEBUG__' in window;
139
+ if (debug) {
140
+ return (
141
+ <ErrorBoundary data={data} fallback={fallback}>
142
+ <div role='none' className='contents' data-id={id} data-role={role}>
143
+ <SurfaceContext.Provider value={contextValue}>
144
+ <SurfaceInfo ref={forwardedRef}>
145
+ <Component id={id} role={role} data={data} limit={limit} {...rest} />
146
+ </SurfaceInfo>
147
+ </SurfaceContext.Provider>
148
+ </div>
149
+ </ErrorBoundary>
150
+ );
151
+ }
152
+
153
+ return (
154
+ <ErrorBoundary data={data} fallback={fallback}>
155
+ <div role='none' className='contents' data-id={id} data-role={role}>
156
+ <SurfaceContext.Provider value={contextValue}>
157
+ <Component id={id} role={role} data={data} limit={limit} {...rest} ref={forwardedRef} />
158
+ </SurfaceContext.Provider>
159
+ </div>
160
+ </ErrorBoundary>
161
+ );
162
+ },
163
+ ),
164
+ );
165
+
166
+ SurfaceContextProvider.displayName = 'SurfaceContextProvider';
167
+
168
+ export const useSurface = (): SurfaceContext => {
169
+ const context = useContext(SurfaceContext) ?? raise(new Error('Missing SurfaceContext'));
170
+ return context;
23
171
  };
24
172
 
25
- const findCandidates = (surfaces: SurfaceDefinition[], { role, data }: Pick<SurfaceProps, 'role' | 'data'>) => {
173
+ /**
174
+ * A surface is a named region of the screen that can be populated by plugins.
175
+ */
176
+ export const Surface: NamedExoticComponent<Common.SurfaceProps & RefAttributes<HTMLElement>> = memo(
177
+ forwardRef(({ id: _id, role, data: dataProp, limit, placeholder = DEFAULT_PLACEHOLDER, ...rest }, forwardedRef) => {
178
+ const data = useDefaultValue(dataProp, () => ({}));
179
+
180
+ // TODO(wittjosiah): This will make all surfaces depend on a single signal.
181
+ // This isn't ideal because it means that any change to the data will cause all surfaces to re-render.
182
+ // This effectively means that plugin modules which contribute surfaces need to all be activated at startup.
183
+ // This should be fine for now because it's how it worked prior to capabilities api anyway.
184
+ // In the future, it would be nice to be able to bucket the surface contributions by role.
185
+ const surfaces = useSurfaces();
186
+
187
+ // NOTE: Memoizing the candidates makes the surface not re-render based on reactivity within data.
188
+ const definitions = findCandidates(surfaces, { role, data });
189
+ const candidates = limit ? definitions.slice(0, limit) : definitions;
190
+ if (DEBUG && candidates.length === 0) {
191
+ log.warn('no candidates for surface', { role, data });
192
+ return null;
193
+ }
194
+
195
+ return (
196
+ <Suspense fallback={placeholder}>
197
+ {candidates.map((definition) => (
198
+ <SurfaceContextProvider
199
+ key={definition.id}
200
+ id={definition.id}
201
+ role={role}
202
+ data={data}
203
+ limit={limit}
204
+ definition={definition}
205
+ ref={forwardedRef}
206
+ {...rest}
207
+ />
208
+ ))}
209
+ </Suspense>
210
+ );
211
+ }),
212
+ );
213
+
214
+ Surface.displayName = 'Surface';
215
+
216
+ const findCandidates = (
217
+ surfaces: Common.SurfaceDefinition[],
218
+ { role, data }: Pick<Common.SurfaceProps, 'role' | 'data'>,
219
+ ) => {
26
220
  return Object.values(surfaces)
27
221
  .filter((definition) =>
28
222
  Array.isArray(definition.role) ? definition.role.includes(role) : definition.role === role,
@@ -31,47 +225,43 @@ const findCandidates = (surfaces: SurfaceDefinition[], { role, data }: Pick<Surf
31
225
  .toSorted(byPosition);
32
226
  };
33
227
 
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
+
34
249
  /**
35
- * @returns `true` if there is a contributed surface which matches the specified role & data, `false` otherwise.
250
+ * @internal
36
251
  */
37
- export const isSurfaceAvailable = (context: PluginContext, { role, data }: Pick<SurfaceProps, 'role' | 'data'>) => {
38
- const surfaces = context.getCapabilities(Capabilities.ReactSurface);
39
- const candidates = findCandidates(surfaces.flat(), { role, data });
40
- return candidates.length > 0;
252
+ export const useSurfaces = () => {
253
+ const surfaces = useCapabilities(Common.Capability.ReactSurface);
254
+ return useMemo(() => surfaces.flat(), [surfaces]);
41
255
  };
42
256
 
43
257
  /**
44
- * A surface is a named region of the screen that can be populated by plugins.
258
+ * @returns `true` if there is a contributed surface which matches the specified role & data, `false` otherwise.
45
259
  */
46
- export const Surface = memo(
47
- forwardRef<HTMLElement, SurfaceProps>(
48
- ({ id: _id, role, data: _data, limit, fallback, placeholder = DEFAULT_PLACEHOLDER, ...rest }, forwardedRef) => {
49
- // TODO(wittjosiah): This will make all surfaces depend on a single signal.
50
- // This isn't ideal because it means that any change to the data will cause all surfaces to re-render.
51
- // This effectively means that plugin modules which contribute surfaces need to all be activated at startup.
52
- // This should be fine for now because it's how it worked prior to capabilities api anyways.
53
- // In the future, it would be nice to be able to bucket the surface contributions by role.
54
- const surfaces = useSurfaces();
55
- const data = useDefaultValue(_data, () => ({}));
56
-
57
- // NOTE: Memoizing the candidates makes the surface not re-render based on reactivity within data.
58
- const definitions = findCandidates(surfaces, { role, data });
59
- const candidates = limit ? definitions.slice(0, limit) : definitions;
60
- const nodes = candidates.map(({ component: Component, id }) => (
61
- <Component ref={forwardedRef} key={id} id={id} role={role} data={data} limit={limit} {...rest} />
62
- ));
63
-
64
- const suspense = <Suspense fallback={placeholder}>{nodes}</Suspense>;
65
-
66
- return fallback ? (
67
- <ErrorBoundary data={data} fallback={fallback}>
68
- {suspense}
69
- </ErrorBoundary>
70
- ) : (
71
- suspense
72
- );
73
- },
74
- ),
75
- );
76
-
77
- Surface.displayName = 'Surface';
260
+ export const isSurfaceAvailable = (
261
+ capabilityManager: CapabilityManager.CapabilityManager,
262
+ { role, data }: Pick<Common.SurfaceProps, 'role' | 'data'>,
263
+ ) => {
264
+ const surfaces = capabilityManager.getAll(Common.Capability.ReactSurface);
265
+ const candidates = findCandidates(surfaces.flat(), { role, data });
266
+ return candidates.length > 0;
267
+ };
@@ -0,0 +1,107 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React, {
6
+ type ReactElement,
7
+ type Ref,
8
+ cloneElement,
9
+ forwardRef,
10
+ useCallback,
11
+ useLayoutEffect,
12
+ useState,
13
+ } from 'react';
14
+ import { createPortal } from 'react-dom';
15
+
16
+ import { addEventListener, combine } from '@dxos/async';
17
+ import { useMergeRefs } from '@dxos/react-hooks';
18
+
19
+ import { useSurface } from './Surface';
20
+
21
+ export type SurfaceInfoProps = {
22
+ children: ReactElement<{ ref?: Ref<HTMLElement> }>;
23
+ };
24
+
25
+ /**
26
+ * Debug wrapper for surfaces.
27
+ */
28
+ export const SurfaceInfo = forwardRef<HTMLElement, SurfaceInfoProps>(({ children }, forwardedRef) => {
29
+ const [rect, setRect] = useState<DOMRect | null>(null);
30
+ const [expand, setExpand] = useState(false);
31
+ const info = useSurface();
32
+
33
+ const [root, setRoot] = useState<HTMLElement | null>(null);
34
+ const measureRef = useCallback((node: HTMLElement | null) => setRoot(node), []);
35
+ const mergedRef = useMergeRefs([measureRef, forwardedRef]);
36
+ const childWithRef = cloneElement(children, { ref: mergedRef });
37
+
38
+ useLayoutEffect(() => {
39
+ if (!root) {
40
+ setRect(null);
41
+ return;
42
+ }
43
+
44
+ const measure = () => {
45
+ setRect(root.getBoundingClientRect());
46
+ };
47
+
48
+ const observer = new ResizeObserver(measure);
49
+ observer.observe(root);
50
+ measure();
51
+
52
+ return combine(
53
+ addEventListener(window, 'scroll', measure, true),
54
+ addEventListener(window, 'resize', measure),
55
+ () => {
56
+ observer.disconnect();
57
+ },
58
+ );
59
+ }, [root]);
60
+
61
+ const padding = 0;
62
+ return (
63
+ <>
64
+ {childWithRef}
65
+ {rect &&
66
+ createPortal(
67
+ <div
68
+ role='none'
69
+ className='z-[100] fixed flex flex-col-reverse scrollbar-none overflow-auto pointer-events-none'
70
+ style={{
71
+ top: rect.top + padding,
72
+ left: rect.left + padding,
73
+ width: rect.width - padding * 2,
74
+ height: rect.height - padding * 2,
75
+ }}
76
+ >
77
+ {expand ? (
78
+ <div
79
+ className='absolute inset-0 bg-deckSurface border border-green-500 cursor-pointer pointer-events-auto overflow-auto'
80
+ onPointerDown={(ev) => ev.stopPropagation()}
81
+ onClick={(ev) => {
82
+ ev.stopPropagation();
83
+ setExpand(false);
84
+ }}
85
+ >
86
+ <pre className='p-2 text-xs text-description font-mono'>{JSON.stringify({ info }, null, 2)}</pre>
87
+ </div>
88
+ ) : (
89
+ <span
90
+ className='absolute right-1 bottom-0 flex items-center p-1 text-green-500 opacity-80 hover:opacity-100 text-xl cursor-pointer pointer-events-auto'
91
+ title={info.id}
92
+ onPointerDown={(ev) => ev.stopPropagation()}
93
+ onClick={(ev) => {
94
+ ev.stopPropagation();
95
+ setExpand(true);
96
+ }}
97
+ >
98
+
99
+ </span>
100
+ )}
101
+ </div>,
102
+ // TODO(burdon): Create well-known element to gather all debug portals.
103
+ document.body,
104
+ )}
105
+ </>
106
+ );
107
+ });
@@ -2,11 +2,36 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { useCapability } from './useCapabilities';
6
- import { Capabilities } from '../common';
5
+ import { type Atom, RegistryContext, useAtomValue } from '@effect-atom/atom-react';
6
+ import { useCallback, useContext } from 'react';
7
7
 
8
- export const useIntentDispatcher = () => useCapability(Capabilities.IntentDispatcher);
8
+ import * as Common from '../common';
9
9
 
10
- export const useAppGraph = () => useCapability(Capabilities.AppGraph);
10
+ import { useAtomCapability, useCapability } from './useCapabilities';
11
11
 
12
- export const useLayout = () => useCapability(Capabilities.Layout);
12
+ export const useOperationInvoker = (): Common.Capability.OperationInvoker =>
13
+ useCapability(Common.Capability.OperationInvoker);
14
+
15
+ export const useAppGraph = (): Common.Capability.AppGraph => useCapability(Common.Capability.AppGraph);
16
+
17
+ export const useLayout = (): Common.Capability.Layout => useAtomCapability(Common.Capability.Layout);
18
+
19
+ /**
20
+ * Hook to read and update a settings atom.
21
+ * Returns the current value and an update function.
22
+ */
23
+ export const useSettingsState = <T>(
24
+ atom: Atom.Writable<T>,
25
+ ): { settings: T; updateSettings: (fn: (current: T) => T) => void } => {
26
+ const registry = useContext(RegistryContext);
27
+ const settings = useAtomValue(atom);
28
+
29
+ const updateSettings = useCallback(
30
+ (fn: (current: T) => T) => {
31
+ registry.set(atom, fn(registry.get(atom)));
32
+ },
33
+ [registry, atom],
34
+ );
35
+
36
+ return { settings, updateSettings };
37
+ };
@@ -3,8 +3,12 @@
3
3
  //
4
4
 
5
5
  export * from './common';
6
+ export * from './types';
7
+
6
8
  export * from './ErrorBoundary';
7
9
  export * from './PluginManagerProvider';
8
10
  export * from './Surface';
11
+
12
+ export * from './useApp';
9
13
  export * from './useCapabilities';
10
- export * from './useIntentResolver';
14
+ export * from './useOperationResolver';
@@ -0,0 +1,27 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Obj } from '@dxos/echo';
6
+
7
+ // TODO(burdon): Standardize PluginSettings and ObjectProperties.
8
+ // TODO(burdon): Include attendableId?
9
+ // TODO(burdon): companionTo?
10
+
11
+ export type SurfaceRole =
12
+ | 'item'
13
+ | 'article'
14
+ | 'complementary' // Companion
15
+ | 'section'
16
+ | 'card--content';
17
+
18
+ /**
19
+ * Base type for surface components.
20
+ */
21
+ export type SurfaceComponentProps<Subject extends Obj.Unknown | undefined = Obj.Unknown, Props extends {} = {}> = {
22
+ /** WAI-ARIA role. */
23
+ role?: string;
24
+
25
+ /** The primary object being displayed. */
26
+ subject: Subject;
27
+ } & Props;