@dxos/app-framework 0.8.4-main.7ace549 → 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 (397) hide show
  1. package/.storybook/main.mts +1 -1
  2. package/.storybook/preview.mts +2 -2
  3. package/dist/lib/browser/app-graph-builder-M2VPYQC6.mjs +149 -0
  4. package/dist/lib/browser/app-graph-builder-M2VPYQC6.mjs.map +7 -0
  5. package/dist/lib/browser/capability-7PCNSWBT.mjs +33 -0
  6. package/dist/lib/browser/capability-7PCNSWBT.mjs.map +7 -0
  7. package/dist/lib/browser/capability-KP3PFEXD.mjs +31 -0
  8. package/dist/lib/browser/capability-KP3PFEXD.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-6Y7PZV72.mjs +77 -0
  10. package/dist/lib/browser/chunk-6Y7PZV72.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-7IQHKD4U.mjs +170 -0
  12. package/dist/lib/browser/chunk-7IQHKD4U.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-BLQJSGL3.mjs +732 -0
  14. package/dist/lib/browser/chunk-BLQJSGL3.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-FHQTHCX7.mjs +8 -0
  16. package/dist/lib/browser/chunk-FHQTHCX7.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-FMZN33N4.mjs +807 -0
  18. package/dist/lib/browser/chunk-FMZN33N4.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-H4WPA7U7.mjs +77 -0
  20. package/dist/lib/browser/chunk-H4WPA7U7.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  22. package/dist/lib/browser/chunk-PKQT6C53.mjs +47 -0
  23. package/dist/lib/browser/chunk-PKQT6C53.mjs.map +7 -0
  24. package/dist/lib/browser/chunk-TCLLRCS3.mjs +145 -0
  25. package/dist/lib/browser/chunk-TCLLRCS3.mjs.map +7 -0
  26. package/dist/lib/browser/chunk-XYNO72GQ.mjs +746 -0
  27. package/dist/lib/browser/chunk-XYNO72GQ.mjs.map +7 -0
  28. package/dist/lib/browser/common/index.mjs +38 -0
  29. package/dist/lib/browser/core/activation-event.mjs +20 -0
  30. package/dist/lib/browser/core/activation-event.mjs.map +7 -0
  31. package/dist/lib/browser/core/capability.mjs +28 -0
  32. package/dist/lib/browser/core/capability.mjs.map +7 -0
  33. package/dist/lib/browser/core/plugin-manager.mjs +15 -0
  34. package/dist/lib/browser/core/plugin-manager.mjs.map +7 -0
  35. package/dist/lib/browser/core/plugin.mjs +27 -0
  36. package/dist/lib/browser/core/plugin.mjs.map +7 -0
  37. package/dist/lib/browser/index.mjs +163 -101
  38. package/dist/lib/browser/index.mjs.map +4 -4
  39. package/dist/lib/browser/invoker-capability-SZRSTHEH.mjs +32 -0
  40. package/dist/lib/browser/invoker-capability-SZRSTHEH.mjs.map +7 -0
  41. package/dist/lib/browser/meta.json +1 -1
  42. package/dist/lib/browser/operation-resolver-6MP2MYOY.mjs +64 -0
  43. package/dist/lib/browser/operation-resolver-6MP2MYOY.mjs.map +7 -0
  44. package/dist/lib/browser/react/index.mjs +20 -8
  45. package/dist/lib/browser/testing/index.mjs +68 -22
  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 +163 -101
  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 +20 -8
  91. package/dist/lib/node-esm/testing/index.mjs +68 -22
  92. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  93. package/dist/types/src/cli.d.ts +39 -0
  94. package/dist/types/src/cli.d.ts.map +1 -0
  95. package/dist/types/src/common/activation-event.d.ts +66 -0
  96. package/dist/types/src/common/activation-event.d.ts.map +1 -0
  97. package/dist/types/src/common/capability.d.ts +265 -0
  98. package/dist/types/src/common/capability.d.ts.map +1 -0
  99. package/dist/types/src/common/collaboration.d.ts +23 -17
  100. package/dist/types/src/common/collaboration.d.ts.map +1 -1
  101. package/dist/types/src/common/graph.d.ts +2 -2
  102. package/dist/types/src/common/graph.d.ts.map +1 -1
  103. package/dist/types/src/common/index.d.ts +4 -3
  104. package/dist/types/src/common/index.d.ts.map +1 -1
  105. package/dist/types/src/common/operations.d.ts +380 -0
  106. package/dist/types/src/common/operations.d.ts.map +1 -0
  107. package/dist/types/src/common/plugin.d.ts +201 -0
  108. package/dist/types/src/common/plugin.d.ts.map +1 -0
  109. package/dist/types/src/common/surface.d.ts +35 -9
  110. package/dist/types/src/common/surface.d.ts.map +1 -1
  111. package/dist/types/src/common/translations.d.ts +9 -0
  112. package/dist/types/src/common/translations.d.ts.map +1 -1
  113. package/dist/types/src/context.d.ts +5 -0
  114. package/dist/types/src/context.d.ts.map +1 -0
  115. package/dist/types/src/core/{events.d.ts → activation-event.d.ts} +6 -6
  116. package/dist/types/src/core/activation-event.d.ts.map +1 -0
  117. package/dist/types/src/core/capability-manager.d.ts +43 -0
  118. package/dist/types/src/core/capability-manager.d.ts.map +1 -0
  119. package/dist/types/src/core/capability-manager.test.d.ts +2 -0
  120. package/dist/types/src/core/capability-manager.test.d.ts.map +1 -0
  121. package/dist/types/src/core/capability.d.ts +150 -0
  122. package/dist/types/src/core/capability.d.ts.map +1 -0
  123. package/dist/types/src/core/index.d.ts +5 -4
  124. package/dist/types/src/core/index.d.ts.map +1 -1
  125. package/dist/types/src/core/plugin-manager.d.ts +66 -0
  126. package/dist/types/src/core/plugin-manager.d.ts.map +1 -0
  127. package/dist/types/src/core/plugin-manager.test.d.ts +2 -0
  128. package/dist/types/src/core/plugin-manager.test.d.ts.map +1 -0
  129. package/dist/types/src/core/plugin.d.ts +92 -34
  130. package/dist/types/src/core/plugin.d.ts.map +1 -1
  131. package/dist/types/src/index.d.ts +5 -2
  132. package/dist/types/src/index.d.ts.map +1 -1
  133. package/dist/types/src/playground/debug/Debug.d.ts +4 -2
  134. package/dist/types/src/playground/debug/Debug.d.ts.map +1 -1
  135. package/dist/types/src/playground/debug/plugin.d.ts +2 -1
  136. package/dist/types/src/playground/debug/plugin.d.ts.map +1 -1
  137. package/dist/types/src/playground/generator/Main.d.ts +4 -2
  138. package/dist/types/src/playground/generator/Main.d.ts.map +1 -1
  139. package/dist/types/src/playground/generator/Toolbar.d.ts +4 -2
  140. package/dist/types/src/playground/generator/Toolbar.d.ts.map +1 -1
  141. package/dist/types/src/playground/generator/generator.d.ts +17 -5
  142. package/dist/types/src/playground/generator/generator.d.ts.map +1 -1
  143. package/dist/types/src/playground/generator/plugin.d.ts +2 -1
  144. package/dist/types/src/playground/generator/plugin.d.ts.map +1 -1
  145. package/dist/types/src/playground/layout/Layout.d.ts +4 -2
  146. package/dist/types/src/playground/layout/Layout.d.ts.map +1 -1
  147. package/dist/types/src/playground/layout/plugin.d.ts +2 -1
  148. package/dist/types/src/playground/layout/plugin.d.ts.map +1 -1
  149. package/dist/types/src/playground/logger/Toolbar.d.ts +4 -2
  150. package/dist/types/src/playground/logger/Toolbar.d.ts.map +1 -1
  151. package/dist/types/src/playground/logger/plugin.d.ts +2 -1
  152. package/dist/types/src/playground/logger/plugin.d.ts.map +1 -1
  153. package/dist/types/src/playground/logger/schema.d.ts +14 -0
  154. package/dist/types/src/playground/logger/schema.d.ts.map +1 -1
  155. package/dist/types/src/playground/playground.stories.d.ts.map +1 -1
  156. package/dist/types/src/plugin-operation/OperationPlugin.d.ts +3 -0
  157. package/dist/types/src/plugin-operation/OperationPlugin.d.ts.map +1 -0
  158. package/dist/types/src/plugin-operation/history/capability.d.ts +7 -0
  159. package/dist/types/src/plugin-operation/history/capability.d.ts.map +1 -0
  160. package/dist/types/src/plugin-operation/history/errors.d.ts +5 -0
  161. package/dist/types/src/plugin-operation/history/errors.d.ts.map +1 -0
  162. package/dist/types/src/plugin-operation/history/history-tracker.d.ts +18 -0
  163. package/dist/types/src/plugin-operation/history/history-tracker.d.ts.map +1 -0
  164. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts +2 -0
  165. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts.map +1 -0
  166. package/dist/types/src/plugin-operation/history/index.d.ts +6 -0
  167. package/dist/types/src/plugin-operation/history/index.d.ts.map +1 -0
  168. package/dist/types/src/plugin-operation/history/types.d.ts +13 -0
  169. package/dist/types/src/plugin-operation/history/types.d.ts.map +1 -0
  170. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts +93 -0
  171. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts.map +1 -0
  172. package/dist/types/src/plugin-operation/history/undo-registry.d.ts +23 -0
  173. package/dist/types/src/plugin-operation/history/undo-registry.d.ts.map +1 -0
  174. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts +2 -0
  175. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts.map +1 -0
  176. package/dist/types/src/plugin-operation/index.d.ts +3 -0
  177. package/dist/types/src/plugin-operation/index.d.ts.map +1 -0
  178. package/dist/types/src/plugin-operation/invoker-capability.d.ts +6 -0
  179. package/dist/types/src/plugin-operation/invoker-capability.d.ts.map +1 -0
  180. package/dist/types/src/plugin-operation/meta.d.ts +3 -0
  181. package/dist/types/src/plugin-operation/meta.d.ts.map +1 -0
  182. package/dist/types/src/plugin-operation/testing.d.ts +109 -0
  183. package/dist/types/src/plugin-operation/testing.d.ts.map +1 -0
  184. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts +3 -0
  185. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts.map +1 -0
  186. package/dist/types/src/plugin-runtime/capability.d.ts +6 -0
  187. package/dist/types/src/plugin-runtime/capability.d.ts.map +1 -0
  188. package/dist/types/src/plugin-runtime/index.d.ts +2 -0
  189. package/dist/types/src/plugin-runtime/index.d.ts.map +1 -0
  190. package/dist/types/src/plugin-runtime/meta.d.ts +3 -0
  191. package/dist/types/src/plugin-runtime/meta.d.ts.map +1 -0
  192. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +2 -1
  193. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +1 -1
  194. package/dist/types/src/plugin-settings/actions.d.ts +36 -0
  195. package/dist/types/src/plugin-settings/actions.d.ts.map +1 -1
  196. package/dist/types/src/plugin-settings/app-graph-builder.d.ts +4 -2
  197. package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +1 -1
  198. package/dist/types/src/plugin-settings/meta.d.ts +2 -2
  199. package/dist/types/src/plugin-settings/meta.d.ts.map +1 -1
  200. package/dist/types/src/plugin-settings/operation-resolver.d.ts +6 -0
  201. package/dist/types/src/plugin-settings/operation-resolver.d.ts.map +1 -0
  202. package/dist/types/src/react/App.d.ts +3 -5
  203. package/dist/types/src/react/App.d.ts.map +1 -1
  204. package/dist/types/src/react/App.stories.d.ts.map +1 -1
  205. package/dist/types/src/react/PluginManagerContext.stories.d.ts +13 -0
  206. package/dist/types/src/react/PluginManagerContext.stories.d.ts.map +1 -0
  207. package/dist/types/src/react/PluginManagerProvider.d.ts +2 -2
  208. package/dist/types/src/react/PluginManagerProvider.d.ts.map +1 -1
  209. package/dist/types/src/react/Surface.d.ts +6 -4
  210. package/dist/types/src/react/Surface.d.ts.map +1 -1
  211. package/dist/types/src/react/Surface.stories.d.ts.map +1 -1
  212. package/dist/types/src/react/SurfaceInfo.d.ts +11 -0
  213. package/dist/types/src/react/SurfaceInfo.d.ts.map +1 -0
  214. package/dist/types/src/react/common.d.ts +13 -12
  215. package/dist/types/src/react/common.d.ts.map +1 -1
  216. package/dist/types/src/react/index.d.ts +1 -1
  217. package/dist/types/src/react/index.d.ts.map +1 -1
  218. package/dist/types/src/react/types.d.ts +5 -7
  219. package/dist/types/src/react/types.d.ts.map +1 -1
  220. package/dist/types/src/react/useApp.d.ts +6 -5
  221. package/dist/types/src/react/useApp.d.ts.map +1 -1
  222. package/dist/types/src/react/useCapabilities.d.ts +16 -3
  223. package/dist/types/src/react/useCapabilities.d.ts.map +1 -1
  224. package/dist/types/src/react/useLoading.d.ts +1 -2
  225. package/dist/types/src/react/useLoading.d.ts.map +1 -1
  226. package/dist/types/src/react/useOperationResolver.d.ts +19 -0
  227. package/dist/types/src/react/useOperationResolver.d.ts.map +1 -0
  228. package/dist/types/src/testing/index.d.ts +1 -0
  229. package/dist/types/src/testing/index.d.ts.map +1 -1
  230. package/dist/types/src/testing/service.d.ts +8 -0
  231. package/dist/types/src/testing/service.d.ts.map +1 -0
  232. package/dist/types/src/testing/withPluginManager.d.ts +3 -3
  233. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  234. package/dist/types/tsconfig.tsbuildinfo +1 -1
  235. package/moon.yml +5 -1
  236. package/package.json +92 -39
  237. package/src/cli.ts +107 -0
  238. package/src/common/activation-event.ts +99 -0
  239. package/src/common/capability.ts +343 -0
  240. package/src/common/collaboration.ts +22 -9
  241. package/src/common/graph.ts +2 -2
  242. package/src/common/index.ts +4 -3
  243. package/src/common/operations.ts +412 -0
  244. package/src/common/plugin.ts +364 -0
  245. package/src/common/surface.ts +45 -13
  246. package/src/common/translations.ts +20 -0
  247. package/src/context.ts +9 -0
  248. package/src/core/{events.ts → activation-event.ts} +5 -5
  249. package/src/core/capability-manager.test.ts +151 -0
  250. package/src/core/capability-manager.ts +171 -0
  251. package/src/core/capability.ts +236 -0
  252. package/src/core/index.ts +5 -4
  253. package/src/core/plugin-manager.test.ts +845 -0
  254. package/src/core/plugin-manager.ts +696 -0
  255. package/src/core/plugin.ts +221 -39
  256. package/src/index.ts +5 -2
  257. package/src/playground/debug/Debug.tsx +26 -16
  258. package/src/playground/debug/plugin.ts +8 -8
  259. package/src/playground/generator/Main.tsx +20 -10
  260. package/src/playground/generator/Toolbar.tsx +26 -16
  261. package/src/playground/generator/generator.ts +27 -27
  262. package/src/playground/generator/plugin.ts +11 -12
  263. package/src/playground/layout/Layout.tsx +11 -7
  264. package/src/playground/layout/plugin.ts +8 -8
  265. package/src/playground/logger/Toolbar.tsx +19 -16
  266. package/src/playground/logger/plugin.ts +24 -23
  267. package/src/playground/logger/schema.ts +10 -0
  268. package/src/playground/playground.stories.tsx +13 -5
  269. package/src/plugin-operation/OperationPlugin.ts +25 -0
  270. package/src/plugin-operation/history/capability.ts +37 -0
  271. package/src/plugin-operation/history/errors.ts +11 -0
  272. package/src/plugin-operation/history/history-tracker.test.ts +380 -0
  273. package/src/plugin-operation/history/history-tracker.ts +129 -0
  274. package/src/plugin-operation/history/index.ts +9 -0
  275. package/src/plugin-operation/history/types.ts +17 -0
  276. package/src/plugin-operation/history/undo-mapping.ts +132 -0
  277. package/src/plugin-operation/history/undo-registry.test.ts +73 -0
  278. package/src/plugin-operation/history/undo-registry.ts +54 -0
  279. package/src/plugin-operation/index.ts +6 -0
  280. package/src/plugin-operation/invoker-capability.ts +40 -0
  281. package/src/plugin-operation/meta.ts +11 -0
  282. package/src/plugin-operation/testing.ts +174 -0
  283. package/src/plugin-runtime/RuntimePlugin.ts +20 -0
  284. package/src/plugin-runtime/capability.ts +53 -0
  285. package/src/plugin-runtime/index.ts +5 -0
  286. package/src/plugin-runtime/meta.ts +11 -0
  287. package/src/plugin-settings/SettingsPlugin.ts +11 -26
  288. package/src/plugin-settings/actions.ts +39 -0
  289. package/src/plugin-settings/app-graph-builder.ts +122 -142
  290. package/src/plugin-settings/meta.ts +2 -2
  291. package/src/plugin-settings/operation-resolver.ts +55 -0
  292. package/src/react/App.stories.tsx +30 -0
  293. package/src/react/App.tsx +10 -9
  294. package/src/react/PluginManagerContext.stories.tsx +184 -0
  295. package/src/react/PluginManagerProvider.ts +2 -2
  296. package/src/react/Surface.stories.tsx +33 -17
  297. package/src/react/Surface.tsx +199 -41
  298. package/src/react/SurfaceInfo.tsx +107 -0
  299. package/src/react/common.ts +29 -5
  300. package/src/react/index.ts +1 -1
  301. package/src/react/types.ts +9 -20
  302. package/src/react/useApp.tsx +99 -55
  303. package/src/react/useCapabilities.ts +37 -5
  304. package/src/react/useLoading.tsx +4 -6
  305. package/src/react/useOperationResolver.ts +40 -0
  306. package/src/testing/index.ts +1 -0
  307. package/src/testing/service.ts +52 -0
  308. package/src/testing/withPluginManager.stories.tsx +5 -5
  309. package/src/testing/withPluginManager.tsx +20 -22
  310. package/tsconfig.json +17 -8
  311. package/.swc/plugins/linux_x86_64_19.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429.wasmer-v7 +0 -0
  312. package/dist/lib/browser/app-graph-builder-OIEZZC45.mjs +0 -138
  313. package/dist/lib/browser/app-graph-builder-OIEZZC45.mjs.map +0 -7
  314. package/dist/lib/browser/chunk-6XKO24JP.mjs +0 -483
  315. package/dist/lib/browser/chunk-6XKO24JP.mjs.map +0 -7
  316. package/dist/lib/browser/chunk-SCPE4ZO2.mjs +0 -35
  317. package/dist/lib/browser/chunk-SCPE4ZO2.mjs.map +0 -7
  318. package/dist/lib/browser/chunk-WPW5VVAX.mjs +0 -1651
  319. package/dist/lib/browser/chunk-WPW5VVAX.mjs.map +0 -7
  320. package/dist/lib/browser/intent-dispatcher-LZ4AE66E.mjs +0 -11
  321. package/dist/lib/browser/intent-resolver-QVCKRX6G.mjs +0 -39
  322. package/dist/lib/browser/intent-resolver-QVCKRX6G.mjs.map +0 -7
  323. package/dist/lib/browser/store-CNPHOYTJ.mjs +0 -30
  324. package/dist/lib/browser/store-CNPHOYTJ.mjs.map +0 -7
  325. package/dist/lib/node-esm/app-graph-builder-EBU4NVWD.mjs +0 -139
  326. package/dist/lib/node-esm/app-graph-builder-EBU4NVWD.mjs.map +0 -7
  327. package/dist/lib/node-esm/chunk-3UPX5OIS.mjs +0 -484
  328. package/dist/lib/node-esm/chunk-3UPX5OIS.mjs.map +0 -7
  329. package/dist/lib/node-esm/chunk-XJZGUJ3H.mjs +0 -1653
  330. package/dist/lib/node-esm/chunk-XJZGUJ3H.mjs.map +0 -7
  331. package/dist/lib/node-esm/chunk-ZX63QUGE.mjs +0 -37
  332. package/dist/lib/node-esm/chunk-ZX63QUGE.mjs.map +0 -7
  333. package/dist/lib/node-esm/intent-dispatcher-MGOJ3CHD.mjs +0 -12
  334. package/dist/lib/node-esm/intent-resolver-URF3HN3G.mjs +0 -40
  335. package/dist/lib/node-esm/intent-resolver-URF3HN3G.mjs.map +0 -7
  336. package/dist/lib/node-esm/store-RK5B4XEL.mjs +0 -31
  337. package/dist/lib/node-esm/store-RK5B4XEL.mjs.map +0 -7
  338. package/dist/types/src/common/capabilities.d.ts +0 -195
  339. package/dist/types/src/common/capabilities.d.ts.map +0 -1
  340. package/dist/types/src/common/events.d.ts +0 -52
  341. package/dist/types/src/common/events.d.ts.map +0 -1
  342. package/dist/types/src/common/layout.d.ts +0 -279
  343. package/dist/types/src/common/layout.d.ts.map +0 -1
  344. package/dist/types/src/core/capabilities.d.ts +0 -117
  345. package/dist/types/src/core/capabilities.d.ts.map +0 -1
  346. package/dist/types/src/core/capabilities.test.d.ts +0 -2
  347. package/dist/types/src/core/capabilities.test.d.ts.map +0 -1
  348. package/dist/types/src/core/events.d.ts.map +0 -1
  349. package/dist/types/src/core/manager.d.ts +0 -126
  350. package/dist/types/src/core/manager.d.ts.map +0 -1
  351. package/dist/types/src/core/manager.test.d.ts +0 -2
  352. package/dist/types/src/core/manager.test.d.ts.map +0 -1
  353. package/dist/types/src/plugin-intent/IntentPlugin.d.ts +0 -2
  354. package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +0 -1
  355. package/dist/types/src/plugin-intent/actions.d.ts +0 -36
  356. package/dist/types/src/plugin-intent/actions.d.ts.map +0 -1
  357. package/dist/types/src/plugin-intent/errors.d.ts +0 -16
  358. package/dist/types/src/plugin-intent/errors.d.ts.map +0 -1
  359. package/dist/types/src/plugin-intent/index.d.ts +0 -6
  360. package/dist/types/src/plugin-intent/index.d.ts.map +0 -1
  361. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +0 -139
  362. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +0 -1
  363. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts +0 -2
  364. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts.map +0 -1
  365. package/dist/types/src/plugin-intent/intent.d.ts +0 -63
  366. package/dist/types/src/plugin-intent/intent.d.ts.map +0 -1
  367. package/dist/types/src/plugin-intent/meta.d.ts +0 -3
  368. package/dist/types/src/plugin-intent/meta.d.ts.map +0 -1
  369. package/dist/types/src/plugin-settings/intent-resolver.d.ts +0 -4
  370. package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +0 -1
  371. package/dist/types/src/plugin-settings/store.d.ts +0 -5
  372. package/dist/types/src/plugin-settings/store.d.ts.map +0 -1
  373. package/dist/types/src/react/IntentContext.d.ts +0 -8
  374. package/dist/types/src/react/IntentContext.d.ts.map +0 -1
  375. package/dist/types/src/react/useIntentResolver.d.ts +0 -3
  376. package/dist/types/src/react/useIntentResolver.d.ts.map +0 -1
  377. package/src/common/capabilities.ts +0 -214
  378. package/src/common/events.ts +0 -79
  379. package/src/common/layout.ts +0 -277
  380. package/src/core/capabilities.test.ts +0 -136
  381. package/src/core/capabilities.ts +0 -263
  382. package/src/core/manager.test.ts +0 -516
  383. package/src/core/manager.ts +0 -604
  384. package/src/plugin-intent/IntentPlugin.ts +0 -20
  385. package/src/plugin-intent/actions.ts +0 -31
  386. package/src/plugin-intent/errors.ts +0 -40
  387. package/src/plugin-intent/index.ts +0 -9
  388. package/src/plugin-intent/intent-dispatcher.test.ts +0 -286
  389. package/src/plugin-intent/intent-dispatcher.ts +0 -342
  390. package/src/plugin-intent/intent.ts +0 -154
  391. package/src/plugin-intent/meta.ts +0 -10
  392. package/src/plugin-settings/intent-resolver.ts +0 -35
  393. package/src/plugin-settings/store.ts +0 -33
  394. package/src/react/IntentContext.tsx +0 -35
  395. package/src/react/useIntentResolver.ts +0 -22
  396. /package/dist/lib/browser/{intent-dispatcher-LZ4AE66E.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  397. /package/dist/lib/{node-esm/intent-dispatcher-MGOJ3CHD.mjs.map → browser/common/index.mjs.map} +0 -0
@@ -3,40 +3,51 @@
3
3
  //
4
4
 
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
- import React, { useCallback, useEffect, useState } from 'react';
6
+ import React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';
7
7
 
8
8
  import { faker } from '@dxos/random';
9
9
  import { List, ListItem, Toolbar } from '@dxos/react-ui';
10
10
  import { withTheme } from '@dxos/react-ui/testing';
11
- import { getHashStyles, mx } from '@dxos/react-ui-theme';
11
+ import { type ColorStyles, getHashStyles, mx } from '@dxos/ui-theme';
12
12
 
13
- import { Capabilities, createSurface } from '../common';
13
+ import * as Common from '../common';
14
14
  import { withPluginManager } from '../testing';
15
15
 
16
16
  import { usePluginManager } from './PluginManagerProvider';
17
17
  import { Surface, useSurfaces } from './Surface';
18
18
 
19
+ type TestComponentProps = {
20
+ id: string;
21
+ styles: ColorStyles;
22
+ };
23
+
24
+ const TestComponent = forwardRef<HTMLDivElement, TestComponentProps>(({ styles, id }, forwardedRef) => {
25
+ return (
26
+ <div
27
+ className={mx('flex justify-center items-center border rounded', styles.surface, styles.border)}
28
+ ref={forwardedRef}
29
+ >
30
+ <span className={mx('dx-tag font-mono text-lg', styles.text)}>{id}</span>
31
+ </div>
32
+ );
33
+ });
34
+
19
35
  const DefaultStory = () => {
20
- const [selected, setSelected] = useState<string | undefined>();
21
36
  const manager = usePluginManager();
22
37
  const surfaces = useSurfaces();
38
+ const [selected, setSelected] = useState<string | undefined>();
23
39
 
24
40
  const handleAdd = useCallback(() => {
25
41
  const id = `test-${faker.number.int({ min: 0, max: 1_000 })}`;
26
42
  const styles = getHashStyles(id);
27
-
28
- manager.context.contributeCapability({
43
+ manager.capabilities.contribute({
29
44
  module: 'test',
30
- interface: Capabilities.ReactSurface,
31
- implementation: createSurface({
45
+ interface: Common.Capability.ReactSurface,
46
+ implementation: Common.createSurface({
32
47
  id,
33
48
  role: 'item',
34
49
  filter: (data): data is any => (data as any)?.id === id,
35
- component: () => (
36
- <div className={mx('flex justify-center items-center border rounded', styles.surface, styles.border)}>
37
- <span className={mx('dx-tag font-mono text-lg', styles.text)}>{id}</span>
38
- </div>
39
- ),
50
+ component: ({ ref }) => <TestComponent id={id} styles={styles} ref={ref} />,
40
51
  }),
41
52
  });
42
53
 
@@ -48,10 +59,10 @@ const DefaultStory = () => {
48
59
  }, [surfaces]);
49
60
 
50
61
  const handleError = useCallback(() => {
51
- manager.context.contributeCapability({
62
+ manager.capabilities.contribute({
52
63
  module: 'error',
53
- interface: Capabilities.ReactSurface,
54
- implementation: createSurface({
64
+ interface: Common.Capability.ReactSurface,
65
+ implementation: Common.createSurface({
55
66
  id: 'error',
56
67
  role: 'item',
57
68
  filter: (data): data is any => (data as any)?.id === 'error',
@@ -86,6 +97,11 @@ const DefaultStory = () => {
86
97
  setSelected('error');
87
98
  }, [manager]);
88
99
 
100
+ const ref = useRef<HTMLElement>(null);
101
+ useEffect(() => {
102
+ console.log(ref.current);
103
+ }, [ref]);
104
+
89
105
  return (
90
106
  <div className='flex flex-col bs-full overflow-hidden'>
91
107
  <Toolbar.Root>
@@ -94,7 +110,7 @@ const DefaultStory = () => {
94
110
  <Toolbar.Button onClick={handleError}>Error</Toolbar.Button>
95
111
  </Toolbar.Root>
96
112
  <div className='grid grid-cols-2 bs-full gap-4 overflow-hidden'>
97
- <Surface role='item' data={selected ? { id: selected } : undefined} limit={1} />
113
+ <Surface role='item' data={selected ? { id: selected } : undefined} limit={1} ref={ref} />
98
114
  <div className='overflow-y-auto bs-full'>
99
115
  <List>
100
116
  {surfaces.map((surface) => (
@@ -3,62 +3,228 @@
3
3
  //
4
4
 
5
5
  import React, {
6
+ type Context,
6
7
  Fragment,
7
8
  type NamedExoticComponent,
8
9
  type RefAttributes,
9
10
  Suspense,
11
+ createContext,
10
12
  forwardRef,
11
13
  memo,
14
+ useContext,
15
+ useEffect,
12
16
  useMemo,
17
+ useRef,
13
18
  } from 'react';
14
19
 
20
+ import { raise } from '@dxos/debug';
21
+ import { log } from '@dxos/log';
15
22
  import { useDefaultValue } from '@dxos/react-hooks';
16
23
  import { byPosition } from '@dxos/util';
17
24
 
18
- import { Capabilities, type SurfaceDefinition, type SurfaceProps } from '../common';
19
- import { type PluginContext } from '../core';
25
+ import * as Common from '../common';
26
+ import { type CapabilityManager } from '../core';
20
27
 
21
28
  import { ErrorBoundary } from './ErrorBoundary';
29
+ import { SurfaceInfo } from './SurfaceInfo';
22
30
  import { useCapabilities } from './useCapabilities';
23
31
 
24
32
  const DEFAULT_PLACEHOLDER = <Fragment />;
25
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
+
26
41
  /**
27
- * A surface is a named region of the screen that can be populated by plugins.
42
+ * Wrapper component for rendering Web Component surfaces.
43
+ * Handles creation, prop setting, and cleanup of Web Components.
28
44
  */
29
- export const Surface: NamedExoticComponent<SurfaceProps & RefAttributes<HTMLElement>> = memo(
30
- forwardRef(
31
- (
32
- { id: _id, role, data: dataParam, limit, fallback = DefaultFallback, placeholder = DEFAULT_PLACEHOLDER, ...rest },
33
- forwardedRef,
34
- ) => {
35
- // TODO(wittjosiah): This will make all surfaces depend on a single signal.
36
- // This isn't ideal because it means that any change to the data will cause all surfaces to re-render.
37
- // This effectively means that plugin modules which contribute surfaces need to all be activated at startup.
38
- // This should be fine for now because it's how it worked prior to capabilities api anyway.
39
- // In the future, it would be nice to be able to bucket the surface contributions by role.
40
- const surfaces = useSurfaces();
41
- const data = useDefaultValue(dataParam, () => ({}));
42
-
43
- // NOTE: Memoizing the candidates makes the surface not re-render based on reactivity within data.
44
- const definitions = findCandidates(surfaces, { role, data });
45
- const candidates = limit ? definitions.slice(0, limit) : definitions;
46
- const nodes = candidates.map(({ id, component: Component }) => (
47
- <Component ref={forwardedRef} key={id} id={id} role={role} data={data} limit={limit} {...rest} />
48
- ));
49
-
50
- // TODO(burdon): Able to inject DOM properties into root (e.g., object.id).
51
- const suspense = <Suspense fallback={placeholder}>{nodes}</Suspense>;
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
+ }
52
152
 
53
153
  return (
54
154
  <ErrorBoundary data={data} fallback={fallback}>
55
- {suspense}
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>
56
160
  </ErrorBoundary>
57
161
  );
58
162
  },
59
163
  ),
60
164
  );
61
165
 
166
+ SurfaceContextProvider.displayName = 'SurfaceContextProvider';
167
+
168
+ export const useSurface = (): SurfaceContext => {
169
+ const context = useContext(SurfaceContext) ?? raise(new Error('Missing SurfaceContext'));
170
+ return context;
171
+ };
172
+
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
+ ) => {
220
+ return Object.values(surfaces)
221
+ .filter((definition) =>
222
+ Array.isArray(definition.role) ? definition.role.includes(role) : definition.role === role,
223
+ )
224
+ .filter(({ filter }) => (filter ? filter(data ?? {}) : true))
225
+ .toSorted(byPosition);
226
+ };
227
+
62
228
  // TODO(burdon): Make user facing, with telemetry.
63
229
  // TODO(burdon): Change based on dev/prod mode; infer subject type, id.
64
230
  const DefaultFallback = ({ data, error, dev }: { data: any; error: Error; dev?: boolean }) => {
@@ -84,26 +250,18 @@ const DefaultFallback = ({ data, error, dev }: { data: any; error: Error; dev?:
84
250
  * @internal
85
251
  */
86
252
  export const useSurfaces = () => {
87
- const surfaces = useCapabilities(Capabilities.ReactSurface);
253
+ const surfaces = useCapabilities(Common.Capability.ReactSurface);
88
254
  return useMemo(() => surfaces.flat(), [surfaces]);
89
255
  };
90
256
 
91
257
  /**
92
258
  * @returns `true` if there is a contributed surface which matches the specified role & data, `false` otherwise.
93
259
  */
94
- export const isSurfaceAvailable = (context: PluginContext, { role, data }: Pick<SurfaceProps, 'role' | 'data'>) => {
95
- const surfaces = context.getCapabilities(Capabilities.ReactSurface);
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);
96
265
  const candidates = findCandidates(surfaces.flat(), { role, data });
97
266
  return candidates.length > 0;
98
267
  };
99
-
100
- const findCandidates = (surfaces: SurfaceDefinition[], { role, data }: Pick<SurfaceProps, 'role' | 'data'>) => {
101
- return Object.values(surfaces)
102
- .filter((definition) =>
103
- Array.isArray(definition.role) ? definition.role.includes(role) : definition.role === role,
104
- )
105
- .filter(({ filter }) => (filter ? filter(data ?? {}) : true))
106
- .toSorted(byPosition);
107
- };
108
-
109
- Surface.displayName = 'Surface';
@@ -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,12 +2,36 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Capabilities } from '../common';
5
+ import { type Atom, RegistryContext, useAtomValue } from '@effect-atom/atom-react';
6
+ import { useCallback, useContext } from 'react';
6
7
 
7
- import { useCapability } from './useCapabilities';
8
+ import * as Common from '../common';
8
9
 
9
- export const useIntentDispatcher = () => useCapability(Capabilities.IntentDispatcher);
10
+ import { useAtomCapability, useCapability } from './useCapabilities';
10
11
 
11
- export const useAppGraph = () => useCapability(Capabilities.AppGraph);
12
+ export const useOperationInvoker = (): Common.Capability.OperationInvoker =>
13
+ useCapability(Common.Capability.OperationInvoker);
12
14
 
13
- export const useLayout = () => useCapability(Capabilities.Layout);
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
+ };
@@ -11,4 +11,4 @@ export * from './Surface';
11
11
 
12
12
  export * from './useApp';
13
13
  export * from './useCapabilities';
14
- export * from './useIntentResolver';
14
+ export * from './useOperationResolver';
@@ -2,37 +2,26 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import * as Schema from 'effect/Schema';
6
-
7
5
  import { type Obj } from '@dxos/echo';
8
6
 
9
- export const SurfaceCardRole = Schema.Literal(
10
- 'card',
11
- 'card--popover',
12
- 'card--intrinsic',
13
- 'card--extrinsic',
14
- 'card--transclusion',
15
- );
16
-
17
- export type SurfaceCardRole = Schema.Schema.Type<typeof SurfaceCardRole>;
7
+ // TODO(burdon): Standardize PluginSettings and ObjectProperties.
8
+ // TODO(burdon): Include attendableId?
9
+ // TODO(burdon): companionTo?
18
10
 
19
- // TODO(burdon): Define all roles.
20
11
  export type SurfaceRole =
21
12
  | 'item'
22
13
  | 'article'
23
- | 'complementary' // (for companion?)
14
+ | 'complementary' // Companion
24
15
  | 'section'
25
- | SurfaceCardRole;
16
+ | 'card--content';
26
17
 
27
18
  /**
28
19
  * Base type for surface components.
29
20
  */
30
- // TODO(burdon): Standardize PluginSettings and ObjectProperties.
31
- // TODO(burdon): Include attendableId?
32
- // TODO(burdon): companionTo?
33
- export type SurfaceComponentProps<Subject extends Obj.Any = Obj.Any, Role extends string = string> = {
34
- role?: Role;
21
+ export type SurfaceComponentProps<Subject extends Obj.Unknown | undefined = Obj.Unknown, Props extends {} = {}> = {
22
+ /** WAI-ARIA role. */
23
+ role?: string;
35
24
 
36
25
  /** The primary object being displayed. */
37
26
  subject: Subject;
38
- };
27
+ } & Props;