@dxos/app-framework 0.8.4-main.bc674ce → 0.8.4-main.bcb3aa67d6

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 (421) hide show
  1. package/.storybook/main.mts +1 -3
  2. package/dist/lib/browser/{capability-7PCNSWBT.mjs → capability-4NSF2SOO.mjs} +16 -11
  3. package/dist/lib/browser/capability-4NSF2SOO.mjs.map +7 -0
  4. package/dist/lib/browser/capability-EB3UKSKA.mjs +35 -0
  5. package/dist/lib/browser/capability-EB3UKSKA.mjs.map +7 -0
  6. package/dist/lib/browser/{chunk-FMZN33N4.mjs → chunk-27FZETIA.mjs} +324 -181
  7. package/dist/lib/browser/chunk-27FZETIA.mjs.map +7 -0
  8. package/dist/lib/browser/chunk-CV7I2AAB.mjs +80 -0
  9. package/dist/lib/browser/chunk-CV7I2AAB.mjs.map +7 -0
  10. package/dist/lib/browser/{chunk-6Y7PZV72.mjs → chunk-FL2XTEJH.mjs} +3 -4
  11. package/dist/lib/browser/chunk-FL2XTEJH.mjs.map +7 -0
  12. package/dist/lib/browser/chunk-H7OMDDGW.mjs +42 -0
  13. package/dist/lib/browser/chunk-H7OMDDGW.mjs.map +7 -0
  14. package/dist/lib/browser/chunk-HDQXX5DC.mjs +157 -0
  15. package/dist/lib/browser/chunk-HDQXX5DC.mjs.map +7 -0
  16. package/dist/lib/browser/chunk-I34GF4NG.mjs +34 -0
  17. package/dist/lib/browser/chunk-I34GF4NG.mjs.map +7 -0
  18. package/dist/lib/browser/chunk-KNBRTZVK.mjs +892 -0
  19. package/dist/lib/browser/chunk-KNBRTZVK.mjs.map +7 -0
  20. package/dist/lib/browser/{chunk-7IQHKD4U.mjs → chunk-NO7R7QHA.mjs} +4 -7
  21. package/dist/lib/browser/chunk-NO7R7QHA.mjs.map +7 -0
  22. package/dist/lib/browser/{chunk-TCLLRCS3.mjs → chunk-P2E7VMRF.mjs} +10 -7
  23. package/dist/lib/browser/chunk-P2E7VMRF.mjs.map +7 -0
  24. package/dist/lib/browser/{chunk-PKQT6C53.mjs → chunk-QSXYHXCE.mjs} +3 -2
  25. package/dist/lib/browser/chunk-QSXYHXCE.mjs.map +7 -0
  26. package/dist/lib/browser/chunk-RFSO3JRG.mjs +1 -0
  27. package/dist/lib/browser/chunk-TGX63LTL.mjs +8 -0
  28. package/dist/lib/browser/{chunk-FHQTHCX7.mjs.map → chunk-TGX63LTL.mjs.map} +1 -1
  29. package/dist/lib/browser/cli/index.mjs +90 -0
  30. package/dist/lib/browser/cli/index.mjs.map +7 -0
  31. package/dist/lib/browser/common/activation-events.mjs +24 -0
  32. package/dist/lib/browser/common/capabilities.mjs +46 -0
  33. package/dist/lib/browser/core/activation-event.mjs +1 -1
  34. package/dist/lib/browser/core/capability.mjs +1 -1
  35. package/dist/lib/browser/core/plugin-manager.mjs +4 -4
  36. package/dist/lib/browser/core/plugin.mjs +6 -4
  37. package/dist/lib/browser/core/url-loader.mjs +12 -0
  38. package/dist/lib/browser/index.mjs +40 -131
  39. package/dist/lib/browser/index.mjs.map +4 -4
  40. package/dist/lib/browser/invoker-capability-P7KPBTP3.mjs +43 -0
  41. package/dist/lib/browser/invoker-capability-P7KPBTP3.mjs.map +7 -0
  42. package/dist/lib/browser/meta.json +1 -1
  43. package/dist/lib/browser/testing/index.mjs +56 -34
  44. package/dist/lib/browser/testing/index.mjs.map +3 -3
  45. package/dist/lib/browser/{react → ui}/index.mjs +19 -21
  46. package/dist/lib/browser/ui/index.mjs.map +7 -0
  47. package/dist/lib/node-esm/{capability-CFLQ2QQU.mjs → capability-CB3MNEI3.mjs} +16 -11
  48. package/dist/lib/node-esm/capability-CB3MNEI3.mjs.map +7 -0
  49. package/dist/lib/node-esm/capability-CMROGK7R.mjs +36 -0
  50. package/dist/lib/node-esm/capability-CMROGK7R.mjs.map +7 -0
  51. package/dist/lib/node-esm/{chunk-STMXUEPO.mjs → chunk-37NG7SIN.mjs} +3 -4
  52. package/dist/lib/node-esm/chunk-37NG7SIN.mjs.map +7 -0
  53. package/dist/lib/node-esm/chunk-7JPKC7OM.mjs +893 -0
  54. package/dist/lib/node-esm/chunk-7JPKC7OM.mjs.map +7 -0
  55. package/dist/lib/node-esm/chunk-7PPVTBYR.mjs +81 -0
  56. package/dist/lib/node-esm/chunk-7PPVTBYR.mjs.map +7 -0
  57. package/dist/lib/node-esm/chunk-BQ56U4QX.mjs +43 -0
  58. package/dist/lib/node-esm/chunk-BQ56U4QX.mjs.map +7 -0
  59. package/dist/lib/node-esm/{chunk-GT6OKM5I.mjs → chunk-CG6UBBZZ.mjs} +10 -7
  60. package/dist/lib/node-esm/chunk-CG6UBBZZ.mjs.map +7 -0
  61. package/dist/lib/node-esm/chunk-EL3R25OQ.mjs +2 -0
  62. package/dist/lib/node-esm/chunk-EL3R25OQ.mjs.map +7 -0
  63. package/dist/lib/node-esm/{chunk-663A54LQ.mjs → chunk-EXYTXQ47.mjs} +4 -7
  64. package/dist/lib/node-esm/chunk-EXYTXQ47.mjs.map +7 -0
  65. package/dist/lib/node-esm/{chunk-UEWJDI2L.mjs → chunk-FKE4Z3D6.mjs} +2 -2
  66. package/dist/lib/node-esm/{chunk-UEWJDI2L.mjs.map → chunk-FKE4Z3D6.mjs.map} +1 -1
  67. package/dist/lib/node-esm/chunk-OXXXRCQX.mjs +158 -0
  68. package/dist/lib/node-esm/chunk-OXXXRCQX.mjs.map +7 -0
  69. package/dist/lib/node-esm/chunk-WZCSOX5Q.mjs +35 -0
  70. package/dist/lib/node-esm/chunk-WZCSOX5Q.mjs.map +7 -0
  71. package/dist/lib/node-esm/{chunk-XYQTBFPA.mjs → chunk-YH44RHP6.mjs} +324 -181
  72. package/dist/lib/node-esm/chunk-YH44RHP6.mjs.map +7 -0
  73. package/dist/lib/node-esm/{chunk-7OWSHPYK.mjs → chunk-ZZ7CKK6W.mjs} +3 -2
  74. package/dist/lib/node-esm/chunk-ZZ7CKK6W.mjs.map +7 -0
  75. package/dist/lib/node-esm/cli/index.mjs +91 -0
  76. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  77. package/dist/lib/node-esm/common/activation-events.mjs +25 -0
  78. package/dist/lib/node-esm/common/activation-events.mjs.map +7 -0
  79. package/dist/lib/node-esm/common/capabilities.mjs +47 -0
  80. package/dist/lib/node-esm/common/capabilities.mjs.map +7 -0
  81. package/dist/lib/node-esm/core/activation-event.mjs +1 -1
  82. package/dist/lib/node-esm/core/capability.mjs +1 -1
  83. package/dist/lib/node-esm/core/plugin-manager.mjs +4 -4
  84. package/dist/lib/node-esm/core/plugin.mjs +6 -4
  85. package/dist/lib/node-esm/core/url-loader.mjs +13 -0
  86. package/dist/lib/node-esm/core/url-loader.mjs.map +7 -0
  87. package/dist/lib/node-esm/index.mjs +40 -131
  88. package/dist/lib/node-esm/index.mjs.map +4 -4
  89. package/dist/lib/node-esm/invoker-capability-3C5H46ZY.mjs +44 -0
  90. package/dist/lib/node-esm/invoker-capability-3C5H46ZY.mjs.map +7 -0
  91. package/dist/lib/node-esm/meta.json +1 -1
  92. package/dist/lib/node-esm/testing/index.mjs +56 -34
  93. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  94. package/dist/lib/node-esm/{react → ui}/index.mjs +19 -21
  95. package/dist/lib/node-esm/ui/index.mjs.map +7 -0
  96. package/dist/plugin/node-esm/index.mjs +384 -0
  97. package/dist/plugin/node-esm/index.mjs.map +7 -0
  98. package/dist/plugin/node-esm/meta.json +1 -0
  99. package/dist/types/src/{cli.d.ts → cli/cli.d.ts} +2 -2
  100. package/dist/types/src/cli/cli.d.ts.map +1 -0
  101. package/dist/types/src/cli/index.d.ts +2 -0
  102. package/dist/types/src/cli/index.d.ts.map +1 -0
  103. package/dist/types/src/common/activation-events.d.ts +27 -0
  104. package/dist/types/src/common/activation-events.d.ts.map +1 -0
  105. package/dist/types/src/common/capabilities.d.ts +110 -0
  106. package/dist/types/src/common/capabilities.d.ts.map +1 -0
  107. package/dist/types/src/common/index.d.ts +4 -9
  108. package/dist/types/src/common/index.d.ts.map +1 -1
  109. package/dist/types/src/common/operations.d.ts +8 -369
  110. package/dist/types/src/common/operations.d.ts.map +1 -1
  111. package/dist/types/src/common/translations.d.ts +0 -9
  112. package/dist/types/src/common/translations.d.ts.map +1 -1
  113. package/dist/types/src/core/activation-event.d.ts +1 -1
  114. package/dist/types/src/core/activation-event.d.ts.map +1 -1
  115. package/dist/types/src/core/capability.d.ts +7 -7
  116. package/dist/types/src/core/capability.d.ts.map +1 -1
  117. package/dist/types/src/core/index.d.ts +1 -0
  118. package/dist/types/src/core/index.d.ts.map +1 -1
  119. package/dist/types/src/core/plugin-manager.d.ts +9 -2
  120. package/dist/types/src/core/plugin-manager.d.ts.map +1 -1
  121. package/dist/types/src/core/plugin.d.ts +6 -1
  122. package/dist/types/src/core/plugin.d.ts.map +1 -1
  123. package/dist/types/src/core/url-loader.d.ts +25 -0
  124. package/dist/types/src/core/url-loader.d.ts.map +1 -0
  125. package/dist/types/src/core/url-loader.test.d.ts +2 -0
  126. package/dist/types/src/core/url-loader.test.d.ts.map +1 -0
  127. package/dist/types/src/index.d.ts +1 -3
  128. package/dist/types/src/index.d.ts.map +1 -1
  129. package/dist/types/src/plugin-operation/history/capability.d.ts +1 -1
  130. package/dist/types/src/plugin-operation/history/errors.d.ts +30 -3
  131. package/dist/types/src/plugin-operation/history/errors.d.ts.map +1 -1
  132. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts +11 -3
  133. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts.map +1 -1
  134. package/dist/types/src/plugin-operation/invoker-capability.d.ts +1 -1
  135. package/dist/types/src/plugin-operation/invoker-capability.d.ts.map +1 -1
  136. package/dist/types/src/plugin-operation/testing.d.ts +26 -77
  137. package/dist/types/src/plugin-operation/testing.d.ts.map +1 -1
  138. package/dist/types/src/plugin-runtime/capability.d.ts +2 -2
  139. package/dist/types/src/plugin-runtime/capability.d.ts.map +1 -1
  140. package/dist/types/src/testing/withPluginManager.d.ts +1 -1
  141. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  142. package/dist/types/src/{react → ui/components/App}/App.d.ts +3 -2
  143. package/dist/types/src/ui/components/App/App.d.ts.map +1 -0
  144. package/dist/types/src/{react/Surface.stories.d.ts → ui/components/App/App.stories.d.ts} +7 -2
  145. package/dist/types/src/ui/components/App/App.stories.d.ts.map +1 -0
  146. package/dist/types/src/ui/components/App/index.d.ts +2 -0
  147. package/dist/types/src/ui/components/App/index.d.ts.map +1 -0
  148. package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts.map +1 -0
  149. package/dist/types/src/{react → ui/components/PluginManager}/PluginManagerProvider.d.ts +1 -1
  150. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts.map +1 -0
  151. package/dist/types/src/ui/components/PluginManager/index.d.ts +2 -0
  152. package/dist/types/src/ui/components/PluginManager/index.d.ts.map +1 -0
  153. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts +12 -0
  154. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -0
  155. package/dist/types/src/{react/App.stories.d.ts → ui/components/Surface/SurfaceComponent.stories.d.ts} +1 -1
  156. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts.map +1 -0
  157. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts.map +1 -0
  158. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts +48 -0
  159. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts.map +1 -0
  160. package/dist/types/src/ui/components/Surface/context.d.ts +5 -0
  161. package/dist/types/src/ui/components/Surface/context.d.ts.map +1 -0
  162. package/dist/types/src/ui/components/Surface/index.d.ts +26 -0
  163. package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -0
  164. package/dist/types/src/{common/surface.d.ts → ui/components/Surface/types.d.ts} +20 -18
  165. package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -0
  166. package/dist/types/src/ui/components/index.d.ts +4 -0
  167. package/dist/types/src/ui/components/index.d.ts.map +1 -0
  168. package/dist/types/src/ui/hooks/index.d.ts +6 -0
  169. package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
  170. package/dist/types/src/{react → ui/hooks}/useApp.d.ts +26 -9
  171. package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -0
  172. package/dist/types/src/ui/hooks/useApp.test.d.ts +2 -0
  173. package/dist/types/src/ui/hooks/useApp.test.d.ts.map +1 -0
  174. package/dist/types/src/{react → ui/hooks}/useCapabilities.d.ts +6 -1
  175. package/dist/types/src/ui/hooks/useCapabilities.d.ts.map +1 -0
  176. package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -0
  177. package/dist/types/src/{react/common.d.ts → ui/hooks/useSettingsState.d.ts} +1 -5
  178. package/dist/types/src/ui/hooks/useSettingsState.d.ts.map +1 -0
  179. package/dist/types/src/ui/hooks/useSurface.d.ts +3 -0
  180. package/dist/types/src/ui/hooks/useSurface.d.ts.map +1 -0
  181. package/dist/types/src/ui/index.d.ts +3 -0
  182. package/dist/types/src/ui/index.d.ts.map +1 -0
  183. package/dist/types/src/vite-plugin/composer-plugin.d.ts +18 -0
  184. package/dist/types/src/vite-plugin/composer-plugin.d.ts.map +1 -0
  185. package/dist/types/src/vite-plugin/import-map-plugin.d.ts +16 -0
  186. package/dist/types/src/vite-plugin/import-map-plugin.d.ts.map +1 -0
  187. package/dist/types/src/vite-plugin/index.d.ts +3 -0
  188. package/dist/types/src/vite-plugin/index.d.ts.map +1 -0
  189. package/dist/types/src/vite-plugin/packages.d.ts +7 -0
  190. package/dist/types/src/vite-plugin/packages.d.ts.map +1 -0
  191. package/dist/types/tsconfig.tsbuildinfo +1 -1
  192. package/moon.yml +20 -6
  193. package/package.json +91 -64
  194. package/src/{cli.ts → cli/cli.ts} +10 -10
  195. package/src/{playground/debug → cli}/index.ts +1 -1
  196. package/src/common/activation-events.ts +44 -0
  197. package/src/common/capabilities.ts +172 -0
  198. package/src/common/index.ts +4 -9
  199. package/src/common/operations.ts +6 -382
  200. package/src/common/translations.ts +0 -12
  201. package/src/context.ts +1 -1
  202. package/src/core/activation-event.ts +5 -2
  203. package/src/core/capability-manager.ts +1 -1
  204. package/src/core/capability.ts +11 -10
  205. package/src/core/index.ts +1 -0
  206. package/src/core/plugin-manager.test.ts +313 -44
  207. package/src/core/plugin-manager.ts +344 -157
  208. package/src/core/plugin.ts +10 -2
  209. package/src/core/url-loader.test.ts +79 -0
  210. package/src/core/url-loader.ts +148 -0
  211. package/src/index.ts +1 -3
  212. package/src/plugin-operation/OperationPlugin.ts +5 -5
  213. package/src/plugin-operation/history/capability.ts +5 -5
  214. package/src/plugin-operation/history/errors.ts +2 -6
  215. package/src/plugin-operation/history/history-tracker.test.ts +36 -42
  216. package/src/plugin-operation/history/undo-mapping.ts +6 -3
  217. package/src/plugin-operation/history/undo-registry.test.ts +3 -3
  218. package/src/plugin-operation/invoker-capability.ts +21 -7
  219. package/src/plugin-operation/meta.ts +1 -1
  220. package/src/plugin-operation/testing.ts +25 -45
  221. package/src/plugin-runtime/RuntimePlugin.ts +4 -4
  222. package/src/plugin-runtime/capability.ts +5 -5
  223. package/src/plugin-runtime/meta.ts +1 -1
  224. package/src/testing/service.ts +6 -6
  225. package/src/testing/withPluginManager.stories.tsx +6 -6
  226. package/src/testing/withPluginManager.tsx +46 -19
  227. package/src/ui/components/App/App.stories.tsx +92 -0
  228. package/src/{react → ui/components/App}/App.tsx +9 -11
  229. package/src/{playground/layout → ui/components/App}/index.ts +1 -1
  230. package/src/{react → ui/components/PluginManager}/PluginManagerContext.stories.tsx +13 -14
  231. package/src/{react → ui/components/PluginManager}/PluginManagerProvider.ts +1 -1
  232. package/src/ui/components/PluginManager/index.ts +5 -0
  233. package/src/{react/Surface.stories.tsx → ui/components/Surface/SurfaceComponent.stories.tsx} +28 -24
  234. package/src/{react/Surface.tsx → ui/components/Surface/SurfaceComponent.tsx} +48 -58
  235. package/src/{react → ui/components/Surface}/SurfaceInfo.tsx +2 -2
  236. package/src/ui/components/Surface/SurfaceProfilerContext.tsx +207 -0
  237. package/src/ui/components/Surface/context.ts +12 -0
  238. package/src/ui/components/Surface/index.ts +35 -0
  239. package/src/{common/surface.ts → ui/components/Surface/types.ts} +22 -25
  240. package/src/ui/components/index.ts +7 -0
  241. package/src/ui/hooks/index.ts +9 -0
  242. package/src/ui/hooks/useApp.test.tsx +159 -0
  243. package/src/{react → ui/hooks}/useApp.tsx +110 -30
  244. package/src/{react → ui/hooks}/useCapabilities.ts +9 -5
  245. package/src/{react/common.ts → ui/hooks/useSettingsState.ts} +0 -11
  246. package/src/ui/hooks/useSurface.ts +13 -0
  247. package/src/ui/index.ts +6 -0
  248. package/src/vite-plugin/composer-plugin.ts +128 -0
  249. package/src/vite-plugin/import-map-plugin.ts +315 -0
  250. package/src/vite-plugin/index.ts +6 -0
  251. package/src/vite-plugin/packages.ts +29 -0
  252. package/tsconfig.json +4 -28
  253. package/tsconfig.node.json +2 -4
  254. package/typedoc.json +2 -4
  255. package/vitest.config.ts +1 -1
  256. package/dist/lib/browser/app-graph-builder-M2VPYQC6.mjs +0 -149
  257. package/dist/lib/browser/app-graph-builder-M2VPYQC6.mjs.map +0 -7
  258. package/dist/lib/browser/capability-7PCNSWBT.mjs.map +0 -7
  259. package/dist/lib/browser/capability-KP3PFEXD.mjs +0 -31
  260. package/dist/lib/browser/capability-KP3PFEXD.mjs.map +0 -7
  261. package/dist/lib/browser/chunk-6Y7PZV72.mjs.map +0 -7
  262. package/dist/lib/browser/chunk-7IQHKD4U.mjs.map +0 -7
  263. package/dist/lib/browser/chunk-BLQJSGL3.mjs +0 -732
  264. package/dist/lib/browser/chunk-BLQJSGL3.mjs.map +0 -7
  265. package/dist/lib/browser/chunk-FHQTHCX7.mjs +0 -8
  266. package/dist/lib/browser/chunk-FMZN33N4.mjs.map +0 -7
  267. package/dist/lib/browser/chunk-H4WPA7U7.mjs +0 -77
  268. package/dist/lib/browser/chunk-H4WPA7U7.mjs.map +0 -7
  269. package/dist/lib/browser/chunk-PKQT6C53.mjs.map +0 -7
  270. package/dist/lib/browser/chunk-TCLLRCS3.mjs.map +0 -7
  271. package/dist/lib/browser/chunk-XYNO72GQ.mjs +0 -746
  272. package/dist/lib/browser/chunk-XYNO72GQ.mjs.map +0 -7
  273. package/dist/lib/browser/common/index.mjs +0 -38
  274. package/dist/lib/browser/invoker-capability-SZRSTHEH.mjs +0 -32
  275. package/dist/lib/browser/invoker-capability-SZRSTHEH.mjs.map +0 -7
  276. package/dist/lib/browser/operation-resolver-6MP2MYOY.mjs +0 -64
  277. package/dist/lib/browser/operation-resolver-6MP2MYOY.mjs.map +0 -7
  278. package/dist/lib/node-esm/app-graph-builder-LROHGJEM.mjs +0 -150
  279. package/dist/lib/node-esm/app-graph-builder-LROHGJEM.mjs.map +0 -7
  280. package/dist/lib/node-esm/capability-CFLQ2QQU.mjs.map +0 -7
  281. package/dist/lib/node-esm/capability-RCUNM2M7.mjs +0 -32
  282. package/dist/lib/node-esm/capability-RCUNM2M7.mjs.map +0 -7
  283. package/dist/lib/node-esm/chunk-663A54LQ.mjs.map +0 -7
  284. package/dist/lib/node-esm/chunk-6WXBT3EC.mjs +0 -747
  285. package/dist/lib/node-esm/chunk-6WXBT3EC.mjs.map +0 -7
  286. package/dist/lib/node-esm/chunk-7OWSHPYK.mjs.map +0 -7
  287. package/dist/lib/node-esm/chunk-GQEBIGKD.mjs +0 -733
  288. package/dist/lib/node-esm/chunk-GQEBIGKD.mjs.map +0 -7
  289. package/dist/lib/node-esm/chunk-GT6OKM5I.mjs.map +0 -7
  290. package/dist/lib/node-esm/chunk-STMXUEPO.mjs.map +0 -7
  291. package/dist/lib/node-esm/chunk-XR6NMKEP.mjs +0 -78
  292. package/dist/lib/node-esm/chunk-XR6NMKEP.mjs.map +0 -7
  293. package/dist/lib/node-esm/chunk-XYQTBFPA.mjs.map +0 -7
  294. package/dist/lib/node-esm/common/index.mjs +0 -39
  295. package/dist/lib/node-esm/invoker-capability-PNMA5JOS.mjs +0 -33
  296. package/dist/lib/node-esm/invoker-capability-PNMA5JOS.mjs.map +0 -7
  297. package/dist/lib/node-esm/operation-resolver-7YWDMTNU.mjs +0 -65
  298. package/dist/lib/node-esm/operation-resolver-7YWDMTNU.mjs.map +0 -7
  299. package/dist/types/src/cli.d.ts.map +0 -1
  300. package/dist/types/src/common/activation-event.d.ts +0 -66
  301. package/dist/types/src/common/activation-event.d.ts.map +0 -1
  302. package/dist/types/src/common/capability.d.ts +0 -265
  303. package/dist/types/src/common/capability.d.ts.map +0 -1
  304. package/dist/types/src/common/collaboration.d.ts +0 -26
  305. package/dist/types/src/common/collaboration.d.ts.map +0 -1
  306. package/dist/types/src/common/file.d.ts +0 -14
  307. package/dist/types/src/common/file.d.ts.map +0 -1
  308. package/dist/types/src/common/graph.d.ts +0 -21
  309. package/dist/types/src/common/graph.d.ts.map +0 -1
  310. package/dist/types/src/common/plugin.d.ts +0 -201
  311. package/dist/types/src/common/plugin.d.ts.map +0 -1
  312. package/dist/types/src/common/surface.d.ts.map +0 -1
  313. package/dist/types/src/playground/debug/Debug.d.ts +0 -8
  314. package/dist/types/src/playground/debug/Debug.d.ts.map +0 -1
  315. package/dist/types/src/playground/debug/index.d.ts +0 -2
  316. package/dist/types/src/playground/debug/index.d.ts.map +0 -1
  317. package/dist/types/src/playground/debug/plugin.d.ts +0 -3
  318. package/dist/types/src/playground/debug/plugin.d.ts.map +0 -1
  319. package/dist/types/src/playground/generator/Main.d.ts +0 -8
  320. package/dist/types/src/playground/generator/Main.d.ts.map +0 -1
  321. package/dist/types/src/playground/generator/Toolbar.d.ts +0 -8
  322. package/dist/types/src/playground/generator/Toolbar.d.ts.map +0 -1
  323. package/dist/types/src/playground/generator/generator.d.ts +0 -19
  324. package/dist/types/src/playground/generator/generator.d.ts.map +0 -1
  325. package/dist/types/src/playground/generator/index.d.ts +0 -3
  326. package/dist/types/src/playground/generator/index.d.ts.map +0 -1
  327. package/dist/types/src/playground/generator/plugin.d.ts +0 -3
  328. package/dist/types/src/playground/generator/plugin.d.ts.map +0 -1
  329. package/dist/types/src/playground/layout/Layout.d.ts +0 -10
  330. package/dist/types/src/playground/layout/Layout.d.ts.map +0 -1
  331. package/dist/types/src/playground/layout/index.d.ts +0 -2
  332. package/dist/types/src/playground/layout/index.d.ts.map +0 -1
  333. package/dist/types/src/playground/layout/plugin.d.ts +0 -3
  334. package/dist/types/src/playground/layout/plugin.d.ts.map +0 -1
  335. package/dist/types/src/playground/logger/Toolbar.d.ts +0 -8
  336. package/dist/types/src/playground/logger/Toolbar.d.ts.map +0 -1
  337. package/dist/types/src/playground/logger/index.d.ts +0 -2
  338. package/dist/types/src/playground/logger/index.d.ts.map +0 -1
  339. package/dist/types/src/playground/logger/plugin.d.ts +0 -3
  340. package/dist/types/src/playground/logger/plugin.d.ts.map +0 -1
  341. package/dist/types/src/playground/logger/schema.d.ts +0 -27
  342. package/dist/types/src/playground/logger/schema.d.ts.map +0 -1
  343. package/dist/types/src/playground/playground.stories.d.ts +0 -11
  344. package/dist/types/src/playground/playground.stories.d.ts.map +0 -1
  345. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +0 -3
  346. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +0 -1
  347. package/dist/types/src/plugin-settings/actions.d.ts +0 -61
  348. package/dist/types/src/plugin-settings/actions.d.ts.map +0 -1
  349. package/dist/types/src/plugin-settings/app-graph-builder.d.ts +0 -6
  350. package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +0 -1
  351. package/dist/types/src/plugin-settings/index.d.ts +0 -3
  352. package/dist/types/src/plugin-settings/index.d.ts.map +0 -1
  353. package/dist/types/src/plugin-settings/meta.d.ts +0 -3
  354. package/dist/types/src/plugin-settings/meta.d.ts.map +0 -1
  355. package/dist/types/src/plugin-settings/operation-resolver.d.ts +0 -6
  356. package/dist/types/src/plugin-settings/operation-resolver.d.ts.map +0 -1
  357. package/dist/types/src/plugin-settings/translations.d.ts +0 -11
  358. package/dist/types/src/plugin-settings/translations.d.ts.map +0 -1
  359. package/dist/types/src/react/App.d.ts.map +0 -1
  360. package/dist/types/src/react/App.stories.d.ts.map +0 -1
  361. package/dist/types/src/react/DefaultFallback.d.ts +0 -8
  362. package/dist/types/src/react/DefaultFallback.d.ts.map +0 -1
  363. package/dist/types/src/react/ErrorBoundary.d.ts +0 -30
  364. package/dist/types/src/react/ErrorBoundary.d.ts.map +0 -1
  365. package/dist/types/src/react/PluginManagerContext.stories.d.ts.map +0 -1
  366. package/dist/types/src/react/PluginManagerProvider.d.ts.map +0 -1
  367. package/dist/types/src/react/Surface.d.ts +0 -14
  368. package/dist/types/src/react/Surface.d.ts.map +0 -1
  369. package/dist/types/src/react/Surface.stories.d.ts.map +0 -1
  370. package/dist/types/src/react/SurfaceInfo.d.ts.map +0 -1
  371. package/dist/types/src/react/common.d.ts.map +0 -1
  372. package/dist/types/src/react/index.d.ts +0 -9
  373. package/dist/types/src/react/index.d.ts.map +0 -1
  374. package/dist/types/src/react/types.d.ts +0 -12
  375. package/dist/types/src/react/types.d.ts.map +0 -1
  376. package/dist/types/src/react/useApp.d.ts.map +0 -1
  377. package/dist/types/src/react/useCapabilities.d.ts.map +0 -1
  378. package/dist/types/src/react/useLoading.d.ts.map +0 -1
  379. package/dist/types/src/react/useOperationResolver.d.ts +0 -19
  380. package/dist/types/src/react/useOperationResolver.d.ts.map +0 -1
  381. package/src/common/activation-event.ts +0 -99
  382. package/src/common/capability.ts +0 -343
  383. package/src/common/collaboration.ts +0 -31
  384. package/src/common/file.ts +0 -22
  385. package/src/common/graph.ts +0 -30
  386. package/src/common/plugin.ts +0 -364
  387. package/src/playground/debug/Debug.tsx +0 -49
  388. package/src/playground/debug/plugin.ts +0 -16
  389. package/src/playground/generator/Main.tsx +0 -80
  390. package/src/playground/generator/Toolbar.tsx +0 -57
  391. package/src/playground/generator/generator.ts +0 -48
  392. package/src/playground/generator/index.ts +0 -6
  393. package/src/playground/generator/plugin.ts +0 -21
  394. package/src/playground/layout/Layout.tsx +0 -37
  395. package/src/playground/layout/plugin.ts +0 -18
  396. package/src/playground/logger/Toolbar.tsx +0 -33
  397. package/src/playground/logger/index.ts +0 -5
  398. package/src/playground/logger/plugin.ts +0 -42
  399. package/src/playground/logger/schema.ts +0 -22
  400. package/src/playground/playground.stories.tsx +0 -54
  401. package/src/plugin-settings/SettingsPlugin.ts +0 -19
  402. package/src/plugin-settings/actions.ts +0 -64
  403. package/src/plugin-settings/app-graph-builder.ts +0 -140
  404. package/src/plugin-settings/index.ts +0 -6
  405. package/src/plugin-settings/meta.ts +0 -10
  406. package/src/plugin-settings/operation-resolver.ts +0 -55
  407. package/src/plugin-settings/translations.ts +0 -19
  408. package/src/react/App.stories.tsx +0 -63
  409. package/src/react/DefaultFallback.tsx +0 -26
  410. package/src/react/ErrorBoundary.tsx +0 -56
  411. package/src/react/index.ts +0 -14
  412. package/src/react/types.ts +0 -27
  413. package/src/react/useOperationResolver.ts +0 -40
  414. /package/dist/lib/{node-esm/react/index.mjs.map → browser/chunk-RFSO3JRG.mjs.map} +0 -0
  415. /package/dist/lib/{node-esm/common/index.mjs.map → browser/common/activation-events.mjs.map} +0 -0
  416. /package/dist/lib/browser/{react/index.mjs.map → common/capabilities.mjs.map} +0 -0
  417. /package/dist/lib/browser/{common/index.mjs.map → core/url-loader.mjs.map} +0 -0
  418. /package/dist/types/src/{react → ui/components/PluginManager}/PluginManagerContext.stories.d.ts +0 -0
  419. /package/dist/types/src/{react → ui/components/Surface}/SurfaceInfo.d.ts +0 -0
  420. /package/dist/types/src/{react → ui/hooks}/useLoading.d.ts +0 -0
  421. /package/src/{react → ui/hooks}/useLoading.tsx +0 -0
@@ -6,15 +6,16 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';
7
7
 
8
8
  import { faker } from '@dxos/random';
9
- import { List, ListItem, Toolbar } from '@dxos/react-ui';
10
- import { withTheme } from '@dxos/react-ui/testing';
9
+ import { List, ListItem, Panel, Toolbar } from '@dxos/react-ui';
10
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
11
11
  import { type ColorStyles, getHashStyles, mx } from '@dxos/ui-theme';
12
12
 
13
- import * as Common from '../common';
14
- import { withPluginManager } from '../testing';
13
+ import { Capabilities } from '../../../common';
14
+ import { withPluginManager } from '../../../testing';
15
+ import { usePluginManager } from '../PluginManager';
15
16
 
16
- import { usePluginManager } from './PluginManagerProvider';
17
- import { Surface, useSurfaces } from './Surface';
17
+ import { SurfaceComponent, useSurfaces } from './SurfaceComponent';
18
+ import { create } from './types';
18
19
 
19
20
  type TestComponentProps = {
20
21
  id: string;
@@ -24,7 +25,7 @@ type TestComponentProps = {
24
25
  const TestComponent = forwardRef<HTMLDivElement, TestComponentProps>(({ styles, id }, forwardedRef) => {
25
26
  return (
26
27
  <div
27
- className={mx('flex justify-center items-center border rounded', styles.surface, styles.border)}
28
+ className={mx('flex justify-center items-center border rounded-sm', styles.surface, styles.border)}
28
29
  ref={forwardedRef}
29
30
  >
30
31
  <span className={mx('dx-tag font-mono text-lg', styles.text)}>{id}</span>
@@ -40,10 +41,11 @@ const DefaultStory = () => {
40
41
  const handleAdd = useCallback(() => {
41
42
  const id = `test-${faker.number.int({ min: 0, max: 1_000 })}`;
42
43
  const styles = getHashStyles(id);
44
+
43
45
  manager.capabilities.contribute({
44
46
  module: 'test',
45
- interface: Common.Capability.ReactSurface,
46
- implementation: Common.createSurface({
47
+ interface: Capabilities.ReactSurface,
48
+ implementation: create({
47
49
  id,
48
50
  role: 'item',
49
51
  filter: (data): data is any => (data as any)?.id === id,
@@ -61,8 +63,8 @@ const DefaultStory = () => {
61
63
  const handleError = useCallback(() => {
62
64
  manager.capabilities.contribute({
63
65
  module: 'error',
64
- interface: Common.Capability.ReactSurface,
65
- implementation: Common.createSurface({
66
+ interface: Capabilities.ReactSurface,
67
+ implementation: create({
66
68
  id: 'error',
67
69
  role: 'item',
68
70
  filter: (data): data is any => (data as any)?.id === 'error',
@@ -86,7 +88,7 @@ const DefaultStory = () => {
86
88
  }
87
89
 
88
90
  return (
89
- <div className='flex justify-center items-center border border-roseFill rounded'>
91
+ <div className='flex justify-center items-center border border-rose-fill rounded-sm'>
90
92
  <span className='font-mono'>Ticking... {count}</span>
91
93
  </div>
92
94
  );
@@ -103,15 +105,17 @@ const DefaultStory = () => {
103
105
  }, [ref]);
104
106
 
105
107
  return (
106
- <div className='flex flex-col bs-full overflow-hidden'>
107
- <Toolbar.Root>
108
- <Toolbar.Button onClick={handleAdd}>Add</Toolbar.Button>
109
- <Toolbar.Button onClick={handleSelect}>Pick</Toolbar.Button>
110
- <Toolbar.Button onClick={handleError}>Error</Toolbar.Button>
111
- </Toolbar.Root>
112
- <div className='grid grid-cols-2 bs-full gap-4 overflow-hidden'>
113
- <Surface role='item' data={selected ? { id: selected } : undefined} limit={1} ref={ref} />
114
- <div className='overflow-y-auto bs-full'>
108
+ <Panel.Root>
109
+ <Panel.Toolbar asChild>
110
+ <Toolbar.Root>
111
+ <Toolbar.Button onClick={handleAdd}>Add</Toolbar.Button>
112
+ <Toolbar.Button onClick={handleSelect}>Pick</Toolbar.Button>
113
+ <Toolbar.Button onClick={handleError}>Error</Toolbar.Button>
114
+ </Toolbar.Root>
115
+ </Panel.Toolbar>
116
+ <Panel.Content className='grid grid-cols-2 h-full gap-4 overflow-hidden'>
117
+ <SurfaceComponent role='item' data={selected ? { id: selected } : undefined} limit={1} ref={ref} />
118
+ <div className='overflow-y-auto h-full'>
115
119
  <List>
116
120
  {surfaces.map((surface) => (
117
121
  <ListItem.Root key={surface.id} id={surface.id}>
@@ -120,15 +124,15 @@ const DefaultStory = () => {
120
124
  ))}
121
125
  </List>
122
126
  </div>
123
- </div>
124
- </div>
127
+ </Panel.Content>
128
+ </Panel.Root>
125
129
  );
126
130
  };
127
131
 
128
132
  const meta = {
129
133
  title: 'sdk/app-framework/Surface',
130
134
  render: DefaultStory,
131
- decorators: [withTheme, withPluginManager({ capabilities: [] })],
135
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' }), withPluginManager({ capabilities: [] })],
132
136
  parameters: {
133
137
  layout: 'fullscreen',
134
138
  },
@@ -3,47 +3,42 @@
3
3
  //
4
4
 
5
5
  import React, {
6
- type Context,
7
6
  Fragment,
8
7
  type NamedExoticComponent,
8
+ Profiler,
9
9
  type RefAttributes,
10
10
  Suspense,
11
- createContext,
12
11
  forwardRef,
13
12
  memo,
14
- useContext,
15
13
  useEffect,
16
14
  useMemo,
17
15
  useRef,
18
16
  } from 'react';
19
17
 
20
- import { raise } from '@dxos/debug';
21
18
  import { log } from '@dxos/log';
19
+ import { ErrorBoundary } from '@dxos/react-error-boundary';
22
20
  import { useDefaultValue } from '@dxos/react-hooks';
23
21
  import { byPosition } from '@dxos/util';
24
22
 
25
- import * as Common from '../common';
26
- import { type CapabilityManager } from '../core';
23
+ import { Capabilities } from '../../../common';
24
+ import { type CapabilityManager } from '../../../core';
25
+ import { useCapabilities } from '../../hooks';
27
26
 
28
- import { ErrorBoundary } from './ErrorBoundary';
27
+ import { SurfaceContext } from './context';
29
28
  import { SurfaceInfo } from './SurfaceInfo';
30
- import { useCapabilities } from './useCapabilities';
31
-
32
- const DEFAULT_PLACEHOLDER = <Fragment />;
29
+ import { useSurfaceProfilerCallback } from './SurfaceProfilerContext';
30
+ import { type Definition, type Props, type WebComponentDefinition } from './types';
33
31
 
34
32
  const DEBUG = import.meta.env.VITE_DEBUG;
35
33
 
36
- export type SurfaceContext = Pick<Common.SurfaceProps, 'id' | 'role' | 'data'>;
37
-
38
- // TODO(burdon): Use @radix-ui/react-context
39
- const SurfaceContext: Context<SurfaceContext | undefined> = createContext<SurfaceContext | undefined>(undefined);
34
+ const DEFAULT_PLACEHOLDER = <Fragment />;
40
35
 
41
36
  /**
42
37
  * Wrapper component for rendering Web Component surfaces.
43
38
  * Handles creation, prop setting, and cleanup of Web Components.
44
39
  */
45
40
  const WebComponentWrapper = memo(
46
- forwardRef<HTMLElement, Common.SurfaceProps & { definition: Common.WebComponentSurfaceDefinition }>(
41
+ forwardRef<HTMLElement, Props & { definition: WebComponentDefinition }>(
47
42
  ({ id, role, data, limit, definition, ...rest }, forwardedRef) => {
48
43
  const containerRef = useRef<HTMLDivElement>(null);
49
44
  const elementRef = useRef<HTMLElement | null>(null);
@@ -54,7 +49,9 @@ const WebComponentWrapper = memo(
54
49
 
55
50
  // Create element only once
56
51
  useEffect(() => {
57
- if (!containerRef.current || elementRef.current) return;
52
+ if (!containerRef.current || elementRef.current) {
53
+ return;
54
+ }
58
55
 
59
56
  // Create the Web Component
60
57
  const element = document.createElement(definition.tagName);
@@ -91,7 +88,9 @@ const WebComponentWrapper = memo(
91
88
  // This runs on every render to ensure all props (including those in `rest`) are kept up to date
92
89
  useEffect(() => {
93
90
  const element = elementRef.current;
94
- if (!element) return;
91
+ if (!element) {
92
+ return;
93
+ }
95
94
 
96
95
  // Update properties on the existing Web Component
97
96
  Object.assign(element, propsRef.current);
@@ -107,15 +106,18 @@ WebComponentWrapper.displayName = 'WebComponentWrapper';
107
106
  /**
108
107
  * Wrapper component that provides context for a surface.
109
108
  */
109
+ // TODO(burdon): Allow DebugPlugin to provide different fallback using react-ui ErrorFallback.
110
110
  const SurfaceContextProvider = memo(
111
- forwardRef<HTMLElement, Common.SurfaceProps & { definition: Common.SurfaceDefinition }>(
112
- ({ id, role, data, limit, fallback = DefaultFallback, definition, ...rest }, forwardedRef) => {
111
+ forwardRef<HTMLElement, Props & { definition: Definition }>(
112
+ ({ id, role, data, limit, fallback = ErrorFallback, definition, ...rest }, forwardedRef) => {
113
113
  const contextValue = useMemo(() => ({ id, role, data }), [id, role, data]);
114
+ const onProfilerRender = useSurfaceProfilerCallback();
115
+ const profilerId = `surface/${id}/${role}`;
114
116
 
115
117
  // Handle Web Component surfaces
116
118
  if (definition.kind === 'web-component') {
117
119
  return (
118
- <ErrorBoundary data={data} fallback={fallback}>
120
+ <ErrorBoundary name='surface' resetKeys={[data]} FallbackComponent={fallback}>
119
121
  <SurfaceContext.Provider value={contextValue}>
120
122
  <WebComponentWrapper
121
123
  id={id}
@@ -138,11 +140,17 @@ const SurfaceContextProvider = memo(
138
140
  const debug = DEBUG || '__DX_DEBUG__' in window;
139
141
  if (debug) {
140
142
  return (
141
- <ErrorBoundary data={data} fallback={fallback}>
143
+ <ErrorBoundary name='surface' resetKeys={[data]} FallbackComponent={fallback}>
142
144
  <div role='none' className='contents' data-id={id} data-role={role}>
143
145
  <SurfaceContext.Provider value={contextValue}>
144
146
  <SurfaceInfo ref={forwardedRef}>
145
- <Component id={id} role={role} data={data} limit={limit} {...rest} />
147
+ {onProfilerRender && !profilerId.includes('org.dxos.plugin.debug') ? (
148
+ <Profiler id={profilerId} onRender={onProfilerRender}>
149
+ <Component id={id} role={role} data={data} limit={limit} {...rest} />
150
+ </Profiler>
151
+ ) : (
152
+ <Component id={id} role={role} data={data} limit={limit} {...rest} />
153
+ )}
146
154
  </SurfaceInfo>
147
155
  </SurfaceContext.Provider>
148
156
  </div>
@@ -151,7 +159,7 @@ const SurfaceContextProvider = memo(
151
159
  }
152
160
 
153
161
  return (
154
- <ErrorBoundary data={data} fallback={fallback}>
162
+ <ErrorBoundary name='surface' resetKeys={[data]} FallbackComponent={fallback}>
155
163
  <div role='none' className='contents' data-id={id} data-role={role}>
156
164
  <SurfaceContext.Provider value={contextValue}>
157
165
  <Component id={id} role={role} data={data} limit={limit} {...rest} ref={forwardedRef} />
@@ -165,15 +173,11 @@ const SurfaceContextProvider = memo(
165
173
 
166
174
  SurfaceContextProvider.displayName = 'SurfaceContextProvider';
167
175
 
168
- export const useSurface = (): SurfaceContext => {
169
- const context = useContext(SurfaceContext) ?? raise(new Error('Missing SurfaceContext'));
170
- return context;
171
- };
172
-
173
176
  /**
174
177
  * A surface is a named region of the screen that can be populated by plugins.
175
178
  */
176
- export const Surface: NamedExoticComponent<Common.SurfaceProps & RefAttributes<HTMLElement>> = memo(
179
+ // TODO(burdon): Remove `ref` since relying on this would be error prone.
180
+ export const SurfaceComponent: NamedExoticComponent<Props & RefAttributes<HTMLElement>> = memo(
177
181
  forwardRef(({ id: _id, role, data: dataProp, limit, placeholder = DEFAULT_PLACEHOLDER, ...rest }, forwardedRef) => {
178
182
  const data = useDefaultValue(dataProp, () => ({}));
179
183
 
@@ -211,12 +215,19 @@ export const Surface: NamedExoticComponent<Common.SurfaceProps & RefAttributes<H
211
215
  }),
212
216
  );
213
217
 
214
- Surface.displayName = 'Surface';
218
+ SurfaceComponent.displayName = 'Surface';
215
219
 
216
- const findCandidates = (
217
- surfaces: Common.SurfaceDefinition[],
218
- { role, data }: Pick<Common.SurfaceProps, 'role' | 'data'>,
219
- ) => {
220
+ // TODO(burdon): Make user facing, with telemetry.
221
+ const ErrorFallback = ({ error }: Props) => {
222
+ const { message } = error instanceof Error ? error : { message: String(error) };
223
+ return (
224
+ <div role='alert' data-testid='error-boundary-fallback'>
225
+ <h1 className='flex gap-2 text-sm mt-2 text-info-text'>{message}</h1>
226
+ </div>
227
+ );
228
+ };
229
+
230
+ const findCandidates = (surfaces: Definition[], { role, data }: Pick<Props, 'role' | 'data'>) => {
220
231
  return Object.values(surfaces)
221
232
  .filter((definition) =>
222
233
  Array.isArray(definition.role) ? definition.role.includes(role) : definition.role === role,
@@ -225,32 +236,11 @@ const findCandidates = (
225
236
  .toSorted(byPosition);
226
237
  };
227
238
 
228
- // TODO(burdon): Make user facing, with telemetry.
229
- // TODO(burdon): Change based on dev/prod mode; infer subject type, id.
230
- const DefaultFallback = ({ data, error, dev }: { data: any; error: Error; dev?: boolean }) => {
231
- if (dev) {
232
- return (
233
- <div className='flex flex-col gap-4 p-4 is-full overflow-y-auto'>
234
- <h1 className='flex gap-2 text-sm mbs-2'>{error.message}</h1>
235
- <pre className='overflow-auto text-xs text-description'>{JSON.stringify(data, null, 2)}</pre>
236
- </div>
237
- );
238
- }
239
-
240
- return (
241
- <div className='flex flex-col gap-4 p-4 is-full overflow-y-auto border border-roseFill'>
242
- <h1 className='flex gap-2 text-sm mbs-2 text-rose-500'>{error.message}</h1>
243
- <pre className='overflow-auto text-xs text-description'>{error.stack}</pre>
244
- <pre className='overflow-auto text-xs text-description'>{JSON.stringify(data, null, 2)}</pre>
245
- </div>
246
- );
247
- };
248
-
249
239
  /**
250
240
  * @internal
251
241
  */
252
242
  export const useSurfaces = () => {
253
- const surfaces = useCapabilities(Common.Capability.ReactSurface);
243
+ const surfaces = useCapabilities(Capabilities.ReactSurface);
254
244
  return useMemo(() => surfaces.flat(), [surfaces]);
255
245
  };
256
246
 
@@ -259,9 +249,9 @@ export const useSurfaces = () => {
259
249
  */
260
250
  export const isSurfaceAvailable = (
261
251
  capabilityManager: CapabilityManager.CapabilityManager,
262
- { role, data }: Pick<Common.SurfaceProps, 'role' | 'data'>,
252
+ { role, data }: Pick<Props, 'role' | 'data'>,
263
253
  ) => {
264
- const surfaces = capabilityManager.getAll(Common.Capability.ReactSurface);
254
+ const surfaces = capabilityManager.getAll(Capabilities.ReactSurface);
265
255
  const candidates = findCandidates(surfaces.flat(), { role, data });
266
256
  return candidates.length > 0;
267
257
  };
@@ -16,7 +16,7 @@ import { createPortal } from 'react-dom';
16
16
  import { addEventListener, combine } from '@dxos/async';
17
17
  import { useMergeRefs } from '@dxos/react-hooks';
18
18
 
19
- import { useSurface } from './Surface';
19
+ import { useSurface } from '../../hooks';
20
20
 
21
21
  export type SurfaceInfoProps = {
22
22
  children: ReactElement<{ ref?: Ref<HTMLElement> }>;
@@ -76,7 +76,7 @@ export const SurfaceInfo = forwardRef<HTMLElement, SurfaceInfoProps>(({ children
76
76
  >
77
77
  {expand ? (
78
78
  <div
79
- className='absolute inset-0 bg-deckSurface border border-green-500 cursor-pointer pointer-events-auto overflow-auto'
79
+ className='absolute inset-0 bg-deck-surface border border-green-500 cursor-pointer pointer-events-auto overflow-auto'
80
80
  onPointerDown={(ev) => ev.stopPropagation()}
81
81
  onClick={(ev) => {
82
82
  ev.stopPropagation();
@@ -0,0 +1,207 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import React, {
6
+ type Context,
7
+ type PropsWithChildren,
8
+ type ProfilerOnRenderCallback,
9
+ createContext,
10
+ useContext,
11
+ useMemo,
12
+ useRef,
13
+ useSyncExternalStore,
14
+ } from 'react';
15
+
16
+ const MAX_ENTRIES = 500;
17
+
18
+ /**
19
+ * Single profiler record captured from React Profiler onRender callback.
20
+ */
21
+ export type SurfaceProfilerEntry = {
22
+ id: string;
23
+ phase: 'mount' | 'update' | 'nested-update';
24
+ actualDuration: number;
25
+ baseDuration: number;
26
+ startTime: number;
27
+ commitTime: number;
28
+ timestamp: number;
29
+ };
30
+
31
+ /**
32
+ * Aggregated stats for a single profiled surface.
33
+ */
34
+ export type SurfaceProfilerStats = {
35
+ id: string;
36
+ mountCount: number;
37
+ updateCount: number;
38
+ totalRenders: number;
39
+ avgActualDuration: number;
40
+ maxActualDuration: number;
41
+ avgBaseDuration: number;
42
+ lastActualDuration: number;
43
+ lastCommitTime: number;
44
+ };
45
+
46
+ /**
47
+ * Store that collects profiler entries and notifies subscribers.
48
+ */
49
+ class SurfaceProfilerStore {
50
+ private _entries: SurfaceProfilerEntry[] = [];
51
+ private _listeners = new Set<() => void>();
52
+ private _snapshot: readonly SurfaceProfilerEntry[] = [];
53
+ private _pendingNotify = false;
54
+
55
+ /** Records an entry and schedules a deferred notification to avoid re-render loops. */
56
+ record(entry: SurfaceProfilerEntry) {
57
+ this._entries.push(entry);
58
+ if (this._entries.length > MAX_ENTRIES) {
59
+ this._entries = this._entries.slice(-MAX_ENTRIES);
60
+ }
61
+ this._snapshot = [...this._entries];
62
+ this._scheduleNotify();
63
+ }
64
+
65
+ clear() {
66
+ this._entries = [];
67
+ this._snapshot = [];
68
+ this._notifySync();
69
+ }
70
+
71
+ subscribe = (listener: () => void) => {
72
+ this._listeners.add(listener);
73
+ return () => {
74
+ this._listeners.delete(listener);
75
+ };
76
+ };
77
+
78
+ getSnapshot = (): readonly SurfaceProfilerEntry[] => {
79
+ return this._snapshot;
80
+ };
81
+
82
+ /**
83
+ * Defers notification to the next animation frame to break the
84
+ * Profiler onRender → record → notify → re-render → onRender loop.
85
+ */
86
+ private _scheduleNotify() {
87
+ if (!this._pendingNotify) {
88
+ this._pendingNotify = true;
89
+ requestAnimationFrame(() => {
90
+ this._pendingNotify = false;
91
+ this._notifySync();
92
+ });
93
+ }
94
+ }
95
+
96
+ private _notifySync() {
97
+ for (const listener of this._listeners) {
98
+ listener();
99
+ }
100
+ }
101
+ }
102
+
103
+ type SurfaceProfilerContextValue = {
104
+ store: SurfaceProfilerStore;
105
+ };
106
+
107
+ const SurfaceProfilerContext: Context<SurfaceProfilerContextValue | undefined> = createContext<
108
+ SurfaceProfilerContextValue | undefined
109
+ >(undefined);
110
+
111
+ /**
112
+ * Provider that collects React Profiler data from Surface components.
113
+ */
114
+ export const SurfaceProfilerProvider = ({ children }: PropsWithChildren) => {
115
+ const storeRef = useRef<SurfaceProfilerStore>(null);
116
+ if (!storeRef.current) {
117
+ storeRef.current = new SurfaceProfilerStore();
118
+ }
119
+ return (
120
+ <SurfaceProfilerContext.Provider value={{ store: storeRef.current }}>{children}</SurfaceProfilerContext.Provider>
121
+ );
122
+ };
123
+
124
+ /**
125
+ * Returns a stable onRender callback for use with React Profiler.
126
+ */
127
+ export const useSurfaceProfilerCallback = (): ProfilerOnRenderCallback | undefined => {
128
+ const store = useContext(SurfaceProfilerContext)?.store;
129
+ return useMemo<ProfilerOnRenderCallback | undefined>(() => {
130
+ if (!store) {
131
+ return undefined;
132
+ }
133
+ return (id, phase, actualDuration, baseDuration, startTime, commitTime) => {
134
+ store.record({
135
+ id,
136
+ phase,
137
+ actualDuration,
138
+ baseDuration,
139
+ startTime,
140
+ commitTime,
141
+ timestamp: Date.now(),
142
+ });
143
+ };
144
+ }, [store]);
145
+ };
146
+
147
+ /**
148
+ * Returns all profiler entries reactively.
149
+ */
150
+ export const useSurfaceProfilerEntries = (): readonly SurfaceProfilerEntry[] => {
151
+ const context = useContext(SurfaceProfilerContext);
152
+ return useSyncExternalStore(context?.store.subscribe ?? noop, context?.store.getSnapshot ?? emptySnapshot);
153
+ };
154
+
155
+ /**
156
+ * Returns aggregated stats grouped by surface id.
157
+ */
158
+ export const useSurfaceProfilerStats = (): SurfaceProfilerStats[] => {
159
+ const entries = useSurfaceProfilerEntries();
160
+ const statsMap = new Map<string, SurfaceProfilerStats>();
161
+
162
+ for (const entry of entries) {
163
+ let stats = statsMap.get(entry.id);
164
+ if (!stats) {
165
+ stats = {
166
+ id: entry.id,
167
+ mountCount: 0,
168
+ updateCount: 0,
169
+ totalRenders: 0,
170
+ avgActualDuration: 0,
171
+ maxActualDuration: 0,
172
+ avgBaseDuration: 0,
173
+ lastActualDuration: 0,
174
+ lastCommitTime: 0,
175
+ };
176
+ statsMap.set(entry.id, stats);
177
+ }
178
+
179
+ if (entry.phase === 'mount') {
180
+ stats.mountCount++;
181
+ } else {
182
+ stats.updateCount++;
183
+ }
184
+ stats.totalRenders++;
185
+ stats.avgActualDuration =
186
+ (stats.avgActualDuration * (stats.totalRenders - 1) + entry.actualDuration) / stats.totalRenders;
187
+ stats.avgBaseDuration =
188
+ (stats.avgBaseDuration * (stats.totalRenders - 1) + entry.baseDuration) / stats.totalRenders;
189
+ stats.maxActualDuration = Math.max(stats.maxActualDuration, entry.actualDuration);
190
+ stats.lastActualDuration = entry.actualDuration;
191
+ stats.lastCommitTime = entry.commitTime;
192
+ }
193
+
194
+ return [...statsMap.values()].sort((a, b) => b.maxActualDuration - a.maxActualDuration);
195
+ };
196
+
197
+ /**
198
+ * Clears all collected profiler entries.
199
+ */
200
+ export const useSurfaceProfilerClear = (): (() => void) | undefined => {
201
+ const store = useContext(SurfaceProfilerContext)?.store;
202
+ return useMemo(() => (store ? () => store.clear() : undefined), [store]);
203
+ };
204
+
205
+ const noop = () => () => {};
206
+ const EMPTY_SNAPSHOT: readonly SurfaceProfilerEntry[] = [];
207
+ const emptySnapshot = () => EMPTY_SNAPSHOT;
@@ -0,0 +1,12 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Context, createContext } from 'react';
6
+
7
+ import { type Props } from './types';
8
+
9
+ export type SurfaceContext = Pick<Props, 'id' | 'role' | 'data'>;
10
+
11
+ // TODO(burdon): Use @radix-ui/react-context
12
+ export const SurfaceContext: Context<SurfaceContext | undefined> = createContext<SurfaceContext | undefined>(undefined);
@@ -0,0 +1,35 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ // TODO(wittjosiah): Cleanup to avoid re-naming.
6
+ import { SurfaceContext } from './context';
7
+ import { SurfaceComponent, isSurfaceAvailable } from './SurfaceComponent';
8
+ import {
9
+ SurfaceProfilerProvider,
10
+ useSurfaceProfilerCallback,
11
+ useSurfaceProfilerClear,
12
+ useSurfaceProfilerEntries,
13
+ useSurfaceProfilerStats,
14
+ } from './SurfaceProfilerContext';
15
+ import { type Definition as SurfaceDefinition, create as createSurface, createWeb as createWebSurface } from './types';
16
+
17
+ export namespace Surface {
18
+ export type Definition = SurfaceDefinition;
19
+ export const create = createSurface;
20
+ export const createWeb = createWebSurface;
21
+
22
+ export type Context = SurfaceContext;
23
+ export const Context = SurfaceContext;
24
+
25
+ export const Surface = SurfaceComponent;
26
+ export const isAvailable = isSurfaceAvailable;
27
+
28
+ export const ProfilerProvider = SurfaceProfilerProvider;
29
+ export const useProfilerCallback = useSurfaceProfilerCallback;
30
+ export const useProfilerEntries = useSurfaceProfilerEntries;
31
+ export const useProfilerStats = useSurfaceProfilerStats;
32
+ export const useProfilerClear = useSurfaceProfilerClear;
33
+ }
34
+
35
+ export type { SurfaceProfilerEntry, SurfaceProfilerStats } from './SurfaceProfilerContext';