@dxos/app-framework 0.8.4-main.21d9917 → 0.8.4-main.2244d791bb

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 (327) hide show
  1. package/dist/lib/browser/{capability-7PCNSWBT.mjs → capability-7LE5X2NH.mjs} +14 -10
  2. package/dist/lib/browser/capability-7LE5X2NH.mjs.map +7 -0
  3. package/dist/lib/browser/capability-DU35RXMD.mjs +34 -0
  4. package/dist/lib/browser/capability-DU35RXMD.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-4DQMLMGU.mjs +44 -0
  6. package/dist/lib/browser/chunk-4DQMLMGU.mjs.map +7 -0
  7. package/dist/lib/browser/{chunk-XYNO72GQ.mjs → chunk-C46IKYBD.mjs} +626 -591
  8. package/dist/lib/browser/chunk-C46IKYBD.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-7IQHKD4U.mjs → chunk-EIFGKQSA.mjs} +2 -2
  10. package/dist/lib/browser/chunk-EIFGKQSA.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-IGRQWMWW.mjs +80 -0
  12. package/dist/lib/browser/chunk-IGRQWMWW.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-TCLLRCS3.mjs → chunk-KWP6PKIU.mjs} +2 -2
  14. package/dist/lib/browser/chunk-NPUEVX42.mjs +34 -0
  15. package/dist/lib/browser/chunk-NPUEVX42.mjs.map +7 -0
  16. package/dist/lib/browser/{chunk-FMZN33N4.mjs → chunk-WGWEEBUV.mjs} +3 -3
  17. package/dist/lib/browser/chunk-YAFEA4GV.mjs +1 -0
  18. package/dist/lib/browser/{chunk-6Y7PZV72.mjs → chunk-ZQO3UZ4R.mjs} +1 -1
  19. package/dist/lib/browser/{chunk-6Y7PZV72.mjs.map → chunk-ZQO3UZ4R.mjs.map} +1 -1
  20. package/dist/lib/browser/cli/index.mjs +89 -0
  21. package/dist/lib/browser/cli/index.mjs.map +7 -0
  22. package/dist/lib/browser/common/activation-events.mjs +23 -0
  23. package/dist/lib/browser/common/capabilities.mjs +45 -0
  24. package/dist/lib/browser/core/capability.mjs +1 -1
  25. package/dist/lib/browser/core/plugin-manager.mjs +3 -3
  26. package/dist/lib/browser/core/plugin.mjs +2 -2
  27. package/dist/lib/browser/index.mjs +34 -129
  28. package/dist/lib/browser/index.mjs.map +4 -4
  29. package/dist/lib/browser/{invoker-capability-SZRSTHEH.mjs → invoker-capability-7QW56NOM.mjs} +15 -11
  30. package/dist/lib/browser/invoker-capability-7QW56NOM.mjs.map +7 -0
  31. package/dist/lib/browser/meta.json +1 -1
  32. package/dist/lib/browser/testing/index.mjs +16 -12
  33. package/dist/lib/browser/testing/index.mjs.map +3 -3
  34. package/dist/lib/browser/{react → ui}/index.mjs +20 -17
  35. package/dist/lib/node-esm/{capability-CFLQ2QQU.mjs → capability-OSVYGK4X.mjs} +14 -10
  36. package/dist/lib/node-esm/capability-OSVYGK4X.mjs.map +7 -0
  37. package/dist/lib/node-esm/{capability-RCUNM2M7.mjs → capability-SR2EIZFP.mjs} +14 -11
  38. package/dist/lib/node-esm/capability-SR2EIZFP.mjs.map +7 -0
  39. package/dist/lib/node-esm/{chunk-STMXUEPO.mjs → chunk-64IMLAS2.mjs} +1 -1
  40. package/dist/lib/node-esm/{chunk-STMXUEPO.mjs.map → chunk-64IMLAS2.mjs.map} +1 -1
  41. package/dist/lib/node-esm/{chunk-663A54LQ.mjs → chunk-DHSHRYIB.mjs} +2 -2
  42. package/dist/lib/node-esm/chunk-DHSHRYIB.mjs.map +7 -0
  43. package/dist/lib/node-esm/{chunk-GT6OKM5I.mjs → chunk-DZ2XLAGI.mjs} +2 -2
  44. package/dist/lib/node-esm/chunk-J2PHTRHC.mjs +45 -0
  45. package/dist/lib/node-esm/chunk-J2PHTRHC.mjs.map +7 -0
  46. package/dist/lib/node-esm/chunk-JAZVHID3.mjs +35 -0
  47. package/dist/lib/node-esm/chunk-JAZVHID3.mjs.map +7 -0
  48. package/dist/lib/node-esm/chunk-OQYHRZYF.mjs +81 -0
  49. package/dist/lib/node-esm/chunk-OQYHRZYF.mjs.map +7 -0
  50. package/dist/lib/node-esm/{chunk-6WXBT3EC.mjs → chunk-PQOJE7NA.mjs} +626 -591
  51. package/dist/lib/node-esm/chunk-PQOJE7NA.mjs.map +7 -0
  52. package/dist/lib/node-esm/{chunk-XYQTBFPA.mjs → chunk-XHAKT6UD.mjs} +3 -3
  53. package/dist/lib/node-esm/chunk-Z4TJPSMP.mjs +2 -0
  54. package/dist/lib/node-esm/chunk-Z4TJPSMP.mjs.map +7 -0
  55. package/dist/lib/node-esm/cli/index.mjs +90 -0
  56. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  57. package/dist/lib/node-esm/common/activation-events.mjs +24 -0
  58. package/dist/lib/node-esm/common/activation-events.mjs.map +7 -0
  59. package/dist/lib/node-esm/common/capabilities.mjs +46 -0
  60. package/dist/lib/node-esm/common/capabilities.mjs.map +7 -0
  61. package/dist/lib/node-esm/core/capability.mjs +1 -1
  62. package/dist/lib/node-esm/core/plugin-manager.mjs +3 -3
  63. package/dist/lib/node-esm/core/plugin.mjs +2 -2
  64. package/dist/lib/node-esm/index.mjs +34 -129
  65. package/dist/lib/node-esm/index.mjs.map +4 -4
  66. package/dist/lib/node-esm/{invoker-capability-PNMA5JOS.mjs → invoker-capability-CK4AMF2R.mjs} +15 -11
  67. package/dist/lib/node-esm/invoker-capability-CK4AMF2R.mjs.map +7 -0
  68. package/dist/lib/node-esm/meta.json +1 -1
  69. package/dist/lib/node-esm/testing/index.mjs +16 -12
  70. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  71. package/dist/lib/node-esm/{react → ui}/index.mjs +20 -17
  72. package/dist/lib/node-esm/ui/index.mjs.map +7 -0
  73. package/dist/types/src/{cli.d.ts → cli/cli.d.ts} +2 -2
  74. package/dist/types/src/cli/cli.d.ts.map +1 -0
  75. package/dist/types/src/cli/index.d.ts +2 -0
  76. package/dist/types/src/cli/index.d.ts.map +1 -0
  77. package/dist/types/src/common/activation-events.d.ts +27 -0
  78. package/dist/types/src/common/activation-events.d.ts.map +1 -0
  79. package/dist/types/src/common/capabilities.d.ts +115 -0
  80. package/dist/types/src/common/capabilities.d.ts.map +1 -0
  81. package/dist/types/src/common/index.d.ts +4 -9
  82. package/dist/types/src/common/index.d.ts.map +1 -1
  83. package/dist/types/src/common/operations.d.ts +0 -347
  84. package/dist/types/src/common/operations.d.ts.map +1 -1
  85. package/dist/types/src/common/translations.d.ts +0 -9
  86. package/dist/types/src/common/translations.d.ts.map +1 -1
  87. package/dist/types/src/core/capability.d.ts +1 -1
  88. package/dist/types/src/index.d.ts +1 -3
  89. package/dist/types/src/index.d.ts.map +1 -1
  90. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts +11 -3
  91. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts.map +1 -1
  92. package/dist/types/src/plugin-runtime/capability.d.ts +2 -2
  93. package/dist/types/src/plugin-runtime/capability.d.ts.map +1 -1
  94. package/dist/types/src/testing/withPluginManager.d.ts +1 -1
  95. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  96. package/dist/types/src/{react → ui/components}/App.d.ts +1 -1
  97. package/dist/types/src/ui/components/App.d.ts.map +1 -0
  98. package/dist/types/src/ui/components/App.stories.d.ts.map +1 -0
  99. package/dist/types/src/ui/components/DefaultFallback.d.ts.map +1 -0
  100. package/dist/types/src/ui/components/ErrorBoundary.d.ts.map +1 -0
  101. package/dist/types/src/ui/components/PluginManagerContext.stories.d.ts.map +1 -0
  102. package/dist/types/src/{react → ui/components}/PluginManagerProvider.d.ts +1 -1
  103. package/dist/types/src/ui/components/PluginManagerProvider.d.ts.map +1 -0
  104. package/dist/types/src/ui/components/index.d.ts +5 -0
  105. package/dist/types/src/ui/components/index.d.ts.map +1 -0
  106. package/dist/types/src/ui/components/surface/SurfaceComponent.d.ts +12 -0
  107. package/dist/types/src/ui/components/surface/SurfaceComponent.d.ts.map +1 -0
  108. package/dist/types/src/{react/Surface.stories.d.ts → ui/components/surface/SurfaceComponent.stories.d.ts} +1 -1
  109. package/dist/types/src/ui/components/surface/SurfaceComponent.stories.d.ts.map +1 -0
  110. package/dist/types/src/ui/components/surface/SurfaceInfo.d.ts.map +1 -0
  111. package/dist/types/src/ui/components/surface/context.d.ts +5 -0
  112. package/dist/types/src/ui/components/surface/context.d.ts.map +1 -0
  113. package/dist/types/src/ui/components/surface/index.d.ts +5 -0
  114. package/dist/types/src/ui/components/surface/index.d.ts.map +1 -0
  115. package/dist/types/src/{common/surface.d.ts → ui/components/surface/types.d.ts} +16 -16
  116. package/dist/types/src/ui/components/surface/types.d.ts.map +1 -0
  117. package/dist/types/src/ui/hooks/index.d.ts +7 -0
  118. package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
  119. package/dist/types/src/{react → ui/hooks}/useApp.d.ts +8 -3
  120. package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -0
  121. package/dist/types/src/{react → ui/hooks}/useCapabilities.d.ts +6 -1
  122. package/dist/types/src/ui/hooks/useCapabilities.d.ts.map +1 -0
  123. package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -0
  124. package/dist/types/src/{react → ui/hooks}/useOperationResolver.d.ts +2 -2
  125. package/dist/types/src/ui/hooks/useOperationResolver.d.ts.map +1 -0
  126. package/dist/types/src/{react/common.d.ts → ui/hooks/useSettingsState.d.ts} +1 -5
  127. package/dist/types/src/ui/hooks/useSettingsState.d.ts.map +1 -0
  128. package/dist/types/src/ui/hooks/useSurface.d.ts +3 -0
  129. package/dist/types/src/ui/hooks/useSurface.d.ts.map +1 -0
  130. package/dist/types/src/ui/index.d.ts +4 -0
  131. package/dist/types/src/ui/index.d.ts.map +1 -0
  132. package/dist/types/tsconfig.tsbuildinfo +1 -1
  133. package/moon.yml +6 -3
  134. package/package.json +77 -70
  135. package/src/{cli.ts → cli/cli.ts} +8 -8
  136. package/src/{playground/debug → cli}/index.ts +1 -1
  137. package/src/common/activation-events.ts +44 -0
  138. package/src/common/capabilities.ts +178 -0
  139. package/src/common/index.ts +4 -9
  140. package/src/common/operations.ts +0 -374
  141. package/src/common/translations.ts +0 -12
  142. package/src/core/capability.ts +1 -1
  143. package/src/core/plugin-manager.test.ts +22 -22
  144. package/src/index.ts +1 -3
  145. package/src/plugin-operation/OperationPlugin.ts +5 -5
  146. package/src/plugin-operation/history/capability.ts +5 -5
  147. package/src/plugin-operation/history/undo-mapping.ts +6 -3
  148. package/src/plugin-operation/invoker-capability.ts +5 -5
  149. package/src/plugin-runtime/RuntimePlugin.ts +4 -4
  150. package/src/plugin-runtime/capability.ts +5 -5
  151. package/src/testing/service.ts +4 -4
  152. package/src/testing/withPluginManager.stories.tsx +6 -6
  153. package/src/testing/withPluginManager.tsx +4 -4
  154. package/src/{react → ui/components}/App.stories.tsx +6 -7
  155. package/src/{react → ui/components}/App.tsx +6 -9
  156. package/src/{react → ui/components}/PluginManagerContext.stories.tsx +7 -8
  157. package/src/{react → ui/components}/PluginManagerProvider.ts +1 -1
  158. package/src/ui/components/index.ts +8 -0
  159. package/src/{react/Surface.stories.tsx → ui/components/surface/SurfaceComponent.stories.tsx} +10 -9
  160. package/src/{react/Surface.tsx → ui/components/surface/SurfaceComponent.tsx} +34 -39
  161. package/src/{react → ui/components/surface}/SurfaceInfo.tsx +1 -1
  162. package/src/ui/components/surface/context.ts +12 -0
  163. package/src/ui/components/surface/index.ts +8 -0
  164. package/src/{common/surface.ts → ui/components/surface/types.ts} +21 -22
  165. package/src/ui/hooks/index.ts +10 -0
  166. package/src/{react → ui/hooks}/useApp.tsx +22 -16
  167. package/src/{react → ui/hooks}/useCapabilities.ts +9 -5
  168. package/src/{react → ui/hooks}/useOperationResolver.ts +5 -5
  169. package/src/{react/common.ts → ui/hooks/useSettingsState.ts} +0 -11
  170. package/src/ui/hooks/useSurface.ts +13 -0
  171. package/src/ui/index.ts +7 -0
  172. package/tsconfig.json +0 -30
  173. package/dist/lib/browser/app-graph-builder-M2VPYQC6.mjs +0 -149
  174. package/dist/lib/browser/app-graph-builder-M2VPYQC6.mjs.map +0 -7
  175. package/dist/lib/browser/capability-7PCNSWBT.mjs.map +0 -7
  176. package/dist/lib/browser/capability-KP3PFEXD.mjs +0 -31
  177. package/dist/lib/browser/capability-KP3PFEXD.mjs.map +0 -7
  178. package/dist/lib/browser/chunk-7IQHKD4U.mjs.map +0 -7
  179. package/dist/lib/browser/chunk-BLQJSGL3.mjs +0 -732
  180. package/dist/lib/browser/chunk-BLQJSGL3.mjs.map +0 -7
  181. package/dist/lib/browser/chunk-H4WPA7U7.mjs +0 -77
  182. package/dist/lib/browser/chunk-H4WPA7U7.mjs.map +0 -7
  183. package/dist/lib/browser/chunk-XYNO72GQ.mjs.map +0 -7
  184. package/dist/lib/browser/common/index.mjs +0 -38
  185. package/dist/lib/browser/invoker-capability-SZRSTHEH.mjs.map +0 -7
  186. package/dist/lib/browser/operation-resolver-6MP2MYOY.mjs +0 -64
  187. package/dist/lib/browser/operation-resolver-6MP2MYOY.mjs.map +0 -7
  188. package/dist/lib/node-esm/app-graph-builder-LROHGJEM.mjs +0 -150
  189. package/dist/lib/node-esm/app-graph-builder-LROHGJEM.mjs.map +0 -7
  190. package/dist/lib/node-esm/capability-CFLQ2QQU.mjs.map +0 -7
  191. package/dist/lib/node-esm/capability-RCUNM2M7.mjs.map +0 -7
  192. package/dist/lib/node-esm/chunk-663A54LQ.mjs.map +0 -7
  193. package/dist/lib/node-esm/chunk-6WXBT3EC.mjs.map +0 -7
  194. package/dist/lib/node-esm/chunk-GQEBIGKD.mjs +0 -733
  195. package/dist/lib/node-esm/chunk-GQEBIGKD.mjs.map +0 -7
  196. package/dist/lib/node-esm/chunk-XR6NMKEP.mjs +0 -78
  197. package/dist/lib/node-esm/chunk-XR6NMKEP.mjs.map +0 -7
  198. package/dist/lib/node-esm/common/index.mjs +0 -39
  199. package/dist/lib/node-esm/invoker-capability-PNMA5JOS.mjs.map +0 -7
  200. package/dist/lib/node-esm/operation-resolver-7YWDMTNU.mjs +0 -65
  201. package/dist/lib/node-esm/operation-resolver-7YWDMTNU.mjs.map +0 -7
  202. package/dist/types/src/cli.d.ts.map +0 -1
  203. package/dist/types/src/common/activation-event.d.ts +0 -66
  204. package/dist/types/src/common/activation-event.d.ts.map +0 -1
  205. package/dist/types/src/common/capability.d.ts +0 -265
  206. package/dist/types/src/common/capability.d.ts.map +0 -1
  207. package/dist/types/src/common/collaboration.d.ts +0 -26
  208. package/dist/types/src/common/collaboration.d.ts.map +0 -1
  209. package/dist/types/src/common/file.d.ts +0 -14
  210. package/dist/types/src/common/file.d.ts.map +0 -1
  211. package/dist/types/src/common/graph.d.ts +0 -21
  212. package/dist/types/src/common/graph.d.ts.map +0 -1
  213. package/dist/types/src/common/plugin.d.ts +0 -201
  214. package/dist/types/src/common/plugin.d.ts.map +0 -1
  215. package/dist/types/src/common/surface.d.ts.map +0 -1
  216. package/dist/types/src/playground/debug/Debug.d.ts +0 -8
  217. package/dist/types/src/playground/debug/Debug.d.ts.map +0 -1
  218. package/dist/types/src/playground/debug/index.d.ts +0 -2
  219. package/dist/types/src/playground/debug/index.d.ts.map +0 -1
  220. package/dist/types/src/playground/debug/plugin.d.ts +0 -3
  221. package/dist/types/src/playground/debug/plugin.d.ts.map +0 -1
  222. package/dist/types/src/playground/generator/Main.d.ts +0 -8
  223. package/dist/types/src/playground/generator/Main.d.ts.map +0 -1
  224. package/dist/types/src/playground/generator/Toolbar.d.ts +0 -8
  225. package/dist/types/src/playground/generator/Toolbar.d.ts.map +0 -1
  226. package/dist/types/src/playground/generator/generator.d.ts +0 -19
  227. package/dist/types/src/playground/generator/generator.d.ts.map +0 -1
  228. package/dist/types/src/playground/generator/index.d.ts +0 -3
  229. package/dist/types/src/playground/generator/index.d.ts.map +0 -1
  230. package/dist/types/src/playground/generator/plugin.d.ts +0 -3
  231. package/dist/types/src/playground/generator/plugin.d.ts.map +0 -1
  232. package/dist/types/src/playground/layout/Layout.d.ts +0 -10
  233. package/dist/types/src/playground/layout/Layout.d.ts.map +0 -1
  234. package/dist/types/src/playground/layout/index.d.ts +0 -2
  235. package/dist/types/src/playground/layout/index.d.ts.map +0 -1
  236. package/dist/types/src/playground/layout/plugin.d.ts +0 -3
  237. package/dist/types/src/playground/layout/plugin.d.ts.map +0 -1
  238. package/dist/types/src/playground/logger/Toolbar.d.ts +0 -8
  239. package/dist/types/src/playground/logger/Toolbar.d.ts.map +0 -1
  240. package/dist/types/src/playground/logger/index.d.ts +0 -2
  241. package/dist/types/src/playground/logger/index.d.ts.map +0 -1
  242. package/dist/types/src/playground/logger/plugin.d.ts +0 -3
  243. package/dist/types/src/playground/logger/plugin.d.ts.map +0 -1
  244. package/dist/types/src/playground/logger/schema.d.ts +0 -27
  245. package/dist/types/src/playground/logger/schema.d.ts.map +0 -1
  246. package/dist/types/src/playground/playground.stories.d.ts +0 -11
  247. package/dist/types/src/playground/playground.stories.d.ts.map +0 -1
  248. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +0 -3
  249. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +0 -1
  250. package/dist/types/src/plugin-settings/actions.d.ts +0 -61
  251. package/dist/types/src/plugin-settings/actions.d.ts.map +0 -1
  252. package/dist/types/src/plugin-settings/app-graph-builder.d.ts +0 -6
  253. package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +0 -1
  254. package/dist/types/src/plugin-settings/index.d.ts +0 -3
  255. package/dist/types/src/plugin-settings/index.d.ts.map +0 -1
  256. package/dist/types/src/plugin-settings/meta.d.ts +0 -3
  257. package/dist/types/src/plugin-settings/meta.d.ts.map +0 -1
  258. package/dist/types/src/plugin-settings/operation-resolver.d.ts +0 -6
  259. package/dist/types/src/plugin-settings/operation-resolver.d.ts.map +0 -1
  260. package/dist/types/src/plugin-settings/translations.d.ts +0 -11
  261. package/dist/types/src/plugin-settings/translations.d.ts.map +0 -1
  262. package/dist/types/src/react/App.d.ts.map +0 -1
  263. package/dist/types/src/react/App.stories.d.ts.map +0 -1
  264. package/dist/types/src/react/DefaultFallback.d.ts.map +0 -1
  265. package/dist/types/src/react/ErrorBoundary.d.ts.map +0 -1
  266. package/dist/types/src/react/PluginManagerContext.stories.d.ts.map +0 -1
  267. package/dist/types/src/react/PluginManagerProvider.d.ts.map +0 -1
  268. package/dist/types/src/react/Surface.d.ts +0 -14
  269. package/dist/types/src/react/Surface.d.ts.map +0 -1
  270. package/dist/types/src/react/Surface.stories.d.ts.map +0 -1
  271. package/dist/types/src/react/SurfaceInfo.d.ts.map +0 -1
  272. package/dist/types/src/react/common.d.ts.map +0 -1
  273. package/dist/types/src/react/index.d.ts +0 -9
  274. package/dist/types/src/react/index.d.ts.map +0 -1
  275. package/dist/types/src/react/types.d.ts +0 -12
  276. package/dist/types/src/react/types.d.ts.map +0 -1
  277. package/dist/types/src/react/useApp.d.ts.map +0 -1
  278. package/dist/types/src/react/useCapabilities.d.ts.map +0 -1
  279. package/dist/types/src/react/useLoading.d.ts.map +0 -1
  280. package/dist/types/src/react/useOperationResolver.d.ts.map +0 -1
  281. package/src/common/activation-event.ts +0 -99
  282. package/src/common/capability.ts +0 -343
  283. package/src/common/collaboration.ts +0 -31
  284. package/src/common/file.ts +0 -22
  285. package/src/common/graph.ts +0 -30
  286. package/src/common/plugin.ts +0 -364
  287. package/src/playground/debug/Debug.tsx +0 -49
  288. package/src/playground/debug/plugin.ts +0 -16
  289. package/src/playground/generator/Main.tsx +0 -80
  290. package/src/playground/generator/Toolbar.tsx +0 -57
  291. package/src/playground/generator/generator.ts +0 -48
  292. package/src/playground/generator/index.ts +0 -6
  293. package/src/playground/generator/plugin.ts +0 -21
  294. package/src/playground/layout/Layout.tsx +0 -37
  295. package/src/playground/layout/index.ts +0 -5
  296. package/src/playground/layout/plugin.ts +0 -18
  297. package/src/playground/logger/Toolbar.tsx +0 -33
  298. package/src/playground/logger/index.ts +0 -5
  299. package/src/playground/logger/plugin.ts +0 -42
  300. package/src/playground/logger/schema.ts +0 -22
  301. package/src/playground/playground.stories.tsx +0 -54
  302. package/src/plugin-settings/SettingsPlugin.ts +0 -19
  303. package/src/plugin-settings/actions.ts +0 -64
  304. package/src/plugin-settings/app-graph-builder.ts +0 -140
  305. package/src/plugin-settings/index.ts +0 -6
  306. package/src/plugin-settings/meta.ts +0 -10
  307. package/src/plugin-settings/operation-resolver.ts +0 -55
  308. package/src/plugin-settings/translations.ts +0 -19
  309. package/src/react/index.ts +0 -14
  310. package/src/react/types.ts +0 -27
  311. /package/dist/lib/browser/{chunk-TCLLRCS3.mjs.map → chunk-KWP6PKIU.mjs.map} +0 -0
  312. /package/dist/lib/browser/{chunk-FMZN33N4.mjs.map → chunk-WGWEEBUV.mjs.map} +0 -0
  313. /package/dist/lib/browser/{common/index.mjs.map → chunk-YAFEA4GV.mjs.map} +0 -0
  314. /package/dist/lib/browser/{react/index.mjs.map → common/activation-events.mjs.map} +0 -0
  315. /package/dist/lib/{node-esm/common/index.mjs.map → browser/common/capabilities.mjs.map} +0 -0
  316. /package/dist/lib/{node-esm/react → browser/ui}/index.mjs.map +0 -0
  317. /package/dist/lib/node-esm/{chunk-GT6OKM5I.mjs.map → chunk-DZ2XLAGI.mjs.map} +0 -0
  318. /package/dist/lib/node-esm/{chunk-XYQTBFPA.mjs.map → chunk-XHAKT6UD.mjs.map} +0 -0
  319. /package/dist/types/src/{react → ui/components}/App.stories.d.ts +0 -0
  320. /package/dist/types/src/{react → ui/components}/DefaultFallback.d.ts +0 -0
  321. /package/dist/types/src/{react → ui/components}/ErrorBoundary.d.ts +0 -0
  322. /package/dist/types/src/{react → ui/components}/PluginManagerContext.stories.d.ts +0 -0
  323. /package/dist/types/src/{react → ui/components/surface}/SurfaceInfo.d.ts +0 -0
  324. /package/dist/types/src/{react → ui/hooks}/useLoading.d.ts +0 -0
  325. /package/src/{react → ui/components}/DefaultFallback.tsx +0 -0
  326. /package/src/{react → ui/components}/ErrorBoundary.tsx +0 -0
  327. /package/src/{react → ui/hooks}/useLoading.tsx +0 -0
@@ -3,89 +3,93 @@ import {
3
3
  PluginManagerContext
4
4
  } from "./chunk-UEWJDI2L.mjs";
5
5
  import {
6
- ActivationEvent,
7
- Capability
8
- } from "./chunk-GQEBIGKD.mjs";
6
+ capabilities_exports
7
+ } from "./chunk-OQYHRZYF.mjs";
8
+ import {
9
+ activation_events_exports
10
+ } from "./chunk-JAZVHID3.mjs";
9
11
  import {
10
12
  plugin_manager_exports
11
- } from "./chunk-XYQTBFPA.mjs";
12
-
13
- // src/react/common.ts
14
- import { RegistryContext, useAtomValue as useAtomValue2 } from "@effect-atom/atom-react";
15
- import { useCallback as useCallback2, useContext as useContext2 } from "react";
16
-
17
- // src/react/useCapabilities.ts
18
- import { useAtomValue } from "@effect-atom/atom-react";
19
- import { useCallback } from "react";
20
- import { invariant } from "@dxos/invariant";
13
+ } from "./chunk-XHAKT6UD.mjs";
14
+ import {
15
+ __export
16
+ } from "./chunk-HSLMI22Q.mjs";
21
17
 
22
- // src/react/PluginManagerProvider.ts
23
- import { createContext, useContext } from "react";
24
- import { raise } from "@dxos/debug";
25
- var PluginManagerContext2 = createContext(void 0);
26
- var usePluginManager = () => useContext(PluginManagerContext2) ?? raise(new Error("Missing PluginManagerContext"));
27
- var PluginManagerProvider = PluginManagerContext2.Provider;
18
+ // src/ui/components/App.tsx
19
+ import React4 from "react";
28
20
 
29
- // src/react/useCapabilities.ts
30
- var __dxlog_file = "/__w/dxos/dxos/packages/sdk/app-framework/src/react/useCapabilities.ts";
31
- var useCapabilities = (interfaceDef) => {
32
- const manager = usePluginManager();
33
- return useAtomValue(manager.capabilities.atom(interfaceDef));
34
- };
35
- var useCapability = (interfaceDef) => {
36
- const capabilities = useCapabilities(interfaceDef);
37
- invariant(capabilities.length > 0, `No capability found for ${interfaceDef.identifier}`, {
38
- F: __dxlog_file,
39
- L: 31,
40
- S: void 0,
41
- A: [
42
- "capabilities.length > 0",
43
- "`No capability found for ${interfaceDef.identifier}`"
44
- ]
45
- });
46
- return capabilities[0];
47
- };
48
- var useAtomCapability = (atomCapability) => {
49
- const atom = useCapability(atomCapability);
50
- return useAtomValue(atom);
51
- };
52
- var useAtomCapabilityState = (atomCapability) => {
53
- const registry = useCapability(Capability.AtomRegistry);
54
- const atom = useCapability(atomCapability);
55
- const value = useAtomValue(atom);
56
- const update = useCallback((fn) => {
57
- registry.set(atom, fn(registry.get(atom)));
58
- }, [
59
- registry,
60
- atom
61
- ]);
62
- return [
63
- value,
64
- update
65
- ];
21
+ // src/helpers.ts
22
+ var topologicalSort = (nodes) => {
23
+ const getDependencies = (nodeId, seen = /* @__PURE__ */ new Set(), path = /* @__PURE__ */ new Set()) => {
24
+ if (path.has(nodeId)) {
25
+ throw new Error(`Circular dependency detected involving ${nodeId}`);
26
+ }
27
+ if (seen.has(nodeId)) {
28
+ return [];
29
+ }
30
+ const node = nodes.find((n) => n.id === nodeId);
31
+ if (!node) {
32
+ throw new Error(`Node ${nodeId} not found but is listed as a dependency`);
33
+ }
34
+ const newPath = /* @__PURE__ */ new Set([
35
+ ...path,
36
+ nodeId
37
+ ]);
38
+ const newSeen = /* @__PURE__ */ new Set([
39
+ ...seen,
40
+ nodeId
41
+ ]);
42
+ const dependsOn = node.dependsOn ?? [];
43
+ return [
44
+ ...dependsOn.flatMap((depId) => getDependencies(depId, newSeen, newPath)),
45
+ nodeId
46
+ ];
47
+ };
48
+ const allDependencies = nodes.map((node) => node.id).flatMap((id) => getDependencies(id)).filter((id, index, self) => self.indexOf(id) === index);
49
+ return allDependencies.map((id) => nodes.find((node) => node.id === id)).filter((node) => node !== void 0);
66
50
  };
67
51
 
68
- // src/react/common.ts
69
- var useOperationInvoker = () => useCapability(Capability.OperationInvoker);
70
- var useAppGraph = () => useCapability(Capability.AppGraph);
71
- var useLayout = () => useAtomCapability(Capability.Layout);
72
- var useSettingsState = (atom) => {
73
- const registry = useContext2(RegistryContext);
74
- const settings = useAtomValue2(atom);
75
- const updateSettings = useCallback2((fn) => {
76
- registry.set(atom, fn(registry.get(atom)));
77
- }, [
78
- registry,
79
- atom
80
- ]);
81
- return {
82
- settings,
83
- updateSettings
84
- };
52
+ // src/ui/hooks/useApp.tsx
53
+ import { RegistryContext } from "@effect-atom/atom-react";
54
+ import * as Effect from "effect/Effect";
55
+ import * as Fiber from "effect/Fiber";
56
+ import * as PubSub from "effect/PubSub";
57
+ import * as Queue from "effect/Queue";
58
+ import React3, { useCallback, useEffect, useMemo, useRef, useState } from "react";
59
+ import { runAndForwardErrors } from "@dxos/effect";
60
+ import { invariant } from "@dxos/invariant";
61
+ import { log } from "@dxos/log";
62
+ import { useAsyncEffect, useDefaultValue } from "@dxos/react-hooks";
63
+ import { ContextProtocolProvider } from "@dxos/web-context-react";
64
+
65
+ // src/ui/components/DefaultFallback.tsx
66
+ import React from "react";
67
+ var DefaultFallback = ({ error }) => {
68
+ return /* @__PURE__ */ React.createElement("div", {
69
+ style: {
70
+ margin: "1rem",
71
+ padding: "1rem",
72
+ overflow: "hidden",
73
+ border: "4px solid teal",
74
+ borderRadius: "1rem"
75
+ }
76
+ }, /* @__PURE__ */ React.createElement("h1", {
77
+ style: {
78
+ margin: "0.5rem 0",
79
+ fontSize: "1.2rem"
80
+ }
81
+ }, "ERROR: ", error.message), /* @__PURE__ */ React.createElement("pre", {
82
+ style: {
83
+ overflow: "auto",
84
+ fontSize: "1rem",
85
+ whiteSpace: "pre-wrap",
86
+ color: "#888888"
87
+ }
88
+ }, error.stack));
85
89
  };
86
90
 
87
- // src/react/ErrorBoundary.tsx
88
- import React, { Component } from "react";
91
+ // src/ui/components/ErrorBoundary.tsx
92
+ import React2, { Component } from "react";
89
93
  var ErrorBoundary = class extends Component {
90
94
  static getDerivedStateFromError(error) {
91
95
  return {
@@ -102,8 +106,8 @@ var ErrorBoundary = class extends Component {
102
106
  }
103
107
  render() {
104
108
  if (this.state.error) {
105
- const Fallback = this.props.fallback ?? DefaultFallback;
106
- return /* @__PURE__ */ React.createElement(Fallback, {
109
+ const Fallback = this.props.fallback ?? DefaultFallback2;
110
+ return /* @__PURE__ */ React2.createElement(Fallback, {
107
111
  data: this.props.data,
108
112
  error: this.state.error
109
113
  });
@@ -116,345 +120,213 @@ var ErrorBoundary = class extends Component {
116
120
  });
117
121
  }
118
122
  };
119
- var DefaultFallback = ({ data, error }) => {
120
- return /* @__PURE__ */ React.createElement("div", {
123
+ var DefaultFallback2 = ({ data, error }) => {
124
+ return /* @__PURE__ */ React2.createElement("div", {
121
125
  className: "flex flex-col gap-2 overflow-hidden border border-red-500 rounded-sm"
122
- }, /* @__PURE__ */ React.createElement("h1", {
126
+ }, /* @__PURE__ */ React2.createElement("h1", {
123
127
  className: "p-2"
124
- }, "ERROR: ", error.message), /* @__PURE__ */ React.createElement("pre", {
128
+ }, "ERROR: ", error.message), /* @__PURE__ */ React2.createElement("pre", {
125
129
  className: "p-2 overflow-y-auto text-sm text-subdued"
126
130
  }, JSON.stringify(data, null, 2)));
127
131
  };
128
132
 
129
- // src/react/Surface.tsx
130
- import React3, { Fragment, Suspense, createContext as createContext2, forwardRef as forwardRef2, memo, useContext as useContext3, useEffect, useMemo, useRef } from "react";
131
- import { raise as raise2 } from "@dxos/debug";
132
- import { log } from "@dxos/log";
133
- import { useDefaultValue } from "@dxos/react-hooks";
134
- import { byPosition } from "@dxos/util";
133
+ // src/ui/components/PluginManagerProvider.ts
134
+ import { createContext, useContext } from "react";
135
+ import { raise } from "@dxos/debug";
136
+ var PluginManagerContext2 = createContext(void 0);
137
+ var usePluginManager = () => useContext(PluginManagerContext2) ?? raise(new Error("Missing PluginManagerContext"));
138
+ var PluginManagerProvider = PluginManagerContext2.Provider;
135
139
 
136
- // src/react/SurfaceInfo.tsx
137
- import React2, { cloneElement, forwardRef, useCallback as useCallback3, useLayoutEffect, useState } from "react";
138
- import { createPortal } from "react-dom";
139
- import { addEventListener, combine } from "@dxos/async";
140
- import { useMergeRefs } from "@dxos/react-hooks";
141
- var SurfaceInfo = /* @__PURE__ */ forwardRef(({ children }, forwardedRef) => {
142
- const [rect, setRect] = useState(null);
143
- const [expand, setExpand] = useState(false);
144
- const info = useSurface();
145
- const [root, setRoot] = useState(null);
146
- const measureRef = useCallback3((node) => setRoot(node), []);
147
- const mergedRef = useMergeRefs([
148
- measureRef,
149
- forwardedRef
140
+ // src/ui/hooks/useApp.tsx
141
+ var __dxlog_file = "/__w/dxos/dxos/packages/sdk/app-framework/src/ui/hooks/useApp.tsx";
142
+ var ENABLED_KEY = "dxos.org/app-framework/enabled";
143
+ var useApp = ({ pluginManager, pluginLoader: pluginLoaderProp, plugins: pluginsProp, core: coreProp, defaults: defaultsProp, setupEvents: setupEventsProp, placeholder, fallback = DefaultFallback, cacheEnabled = false, safeMode = false, debounce = 0, timeout = 3e4 }) => {
144
+ const plugins = useDefaultValue(pluginsProp, () => []);
145
+ const core = useDefaultValue(coreProp, () => plugins.map(({ meta }) => meta.id));
146
+ const defaults = useDefaultValue(defaultsProp, () => []);
147
+ const setupEvents = useDefaultValue(setupEventsProp, () => []);
148
+ const pluginLoader = useMemo(() => pluginLoaderProp ?? ((id) => Effect.sync(() => {
149
+ const plugin = plugins.find((plugin2) => plugin2.meta.id === id);
150
+ invariant(plugin, `Plugin not found: ${id}`, {
151
+ F: __dxlog_file,
152
+ L: 98,
153
+ S: void 0,
154
+ A: [
155
+ "plugin",
156
+ "`Plugin not found: ${id}`"
157
+ ]
158
+ });
159
+ return plugin;
160
+ })), [
161
+ pluginLoaderProp,
162
+ plugins
150
163
  ]);
151
- const childWithRef = /* @__PURE__ */ cloneElement(children, {
152
- ref: mergedRef
153
- });
154
- useLayoutEffect(() => {
155
- if (!root) {
156
- setRect(null);
164
+ const readyRef = useRef(false);
165
+ const [ready, setReady] = useState(false);
166
+ const errorRef = useRef(null);
167
+ const [error, setError] = useState(null);
168
+ const cached = useMemo(() => JSON.parse(localStorage.getItem(ENABLED_KEY) ?? "[]"), []);
169
+ const enabled = useMemo(() => safeMode ? [] : cacheEnabled && cached.length > 0 ? cached : defaults, [
170
+ safeMode,
171
+ cacheEnabled,
172
+ cached,
173
+ defaults
174
+ ]);
175
+ const manager = useMemo(() => pluginManager ?? plugin_manager_exports.make({
176
+ pluginLoader,
177
+ plugins,
178
+ core,
179
+ enabled
180
+ }), [
181
+ pluginManager,
182
+ pluginLoader,
183
+ plugins,
184
+ core,
185
+ enabled
186
+ ]);
187
+ useEffect(() => {
188
+ if (!cacheEnabled) {
157
189
  return;
158
190
  }
159
- const measure = () => {
160
- setRect(root.getBoundingClientRect());
161
- };
162
- const observer = new ResizeObserver(measure);
163
- observer.observe(root);
164
- measure();
165
- return combine(addEventListener(window, "scroll", measure, true), addEventListener(window, "resize", measure), () => {
166
- observer.disconnect();
191
+ return manager.registry.subscribe(manager.enabled, (value) => {
192
+ localStorage.setItem(ENABLED_KEY, JSON.stringify(value));
167
193
  });
168
194
  }, [
169
- root
195
+ cacheEnabled,
196
+ manager
170
197
  ]);
171
- const padding = 0;
172
- return /* @__PURE__ */ React2.createElement(React2.Fragment, null, childWithRef, rect && /* @__PURE__ */ createPortal(
173
- /* @__PURE__ */ React2.createElement("div", {
174
- role: "none",
175
- className: "z-[100] fixed flex flex-col-reverse scrollbar-none overflow-auto pointer-events-none",
176
- style: {
177
- top: rect.top + padding,
178
- left: rect.left + padding,
179
- width: rect.width - padding * 2,
180
- height: rect.height - padding * 2
181
- }
182
- }, expand ? /* @__PURE__ */ React2.createElement("div", {
183
- className: "absolute inset-0 bg-deckSurface border border-green-500 cursor-pointer pointer-events-auto overflow-auto",
184
- onPointerDown: (ev) => ev.stopPropagation(),
185
- onClick: (ev) => {
186
- ev.stopPropagation();
187
- setExpand(false);
188
- }
189
- }, /* @__PURE__ */ React2.createElement("pre", {
190
- className: "p-2 text-xs text-description font-mono"
191
- }, JSON.stringify({
192
- info
193
- }, null, 2))) : /* @__PURE__ */ React2.createElement("span", {
194
- 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",
195
- title: info.id,
196
- onPointerDown: (ev) => ev.stopPropagation(),
197
- onClick: (ev) => {
198
- ev.stopPropagation();
199
- setExpand(true);
200
- }
201
- }, "\u24D8")),
202
- // TODO(burdon): Create well-known element to gather all debug portals.
203
- document.body
204
- ));
205
- });
206
-
207
- // src/react/Surface.tsx
208
- var __dxlog_file2 = "/__w/dxos/dxos/packages/sdk/app-framework/src/react/Surface.tsx";
209
- var DEFAULT_PLACEHOLDER = /* @__PURE__ */ React3.createElement(Fragment, null);
210
- var DEBUG = import.meta.env.VITE_DEBUG;
211
- var SurfaceContext = /* @__PURE__ */ createContext2(void 0);
212
- var WebComponentWrapper = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef2(({ id, role, data, limit, definition, ...rest }, forwardedRef) => {
213
- const containerRef = useRef(null);
214
- const elementRef = useRef(null);
215
- const propsRef = useRef({
216
- id,
217
- role,
218
- data,
219
- limit,
220
- ...rest
221
- });
222
- propsRef.current = {
223
- id,
224
- role,
225
- data,
226
- limit,
227
- ...rest
228
- };
229
198
  useEffect(() => {
230
- if (!containerRef.current || elementRef.current) return;
231
- const element = document.createElement(definition.tagName);
232
- elementRef.current = element;
233
- Object.assign(element, propsRef.current);
234
- containerRef.current.appendChild(element);
235
- if (typeof forwardedRef === "function") {
236
- forwardedRef(element);
237
- } else if (forwardedRef) {
238
- forwardedRef.current = element;
239
- }
240
- return () => {
241
- if (elementRef.current && containerRef.current?.contains(elementRef.current)) {
242
- containerRef.current.removeChild(elementRef.current);
243
- }
244
- if (typeof forwardedRef === "function") {
245
- forwardedRef(null);
246
- } else if (forwardedRef) {
247
- forwardedRef.current = null;
248
- }
249
- elementRef.current = null;
250
- };
199
+ setupDevtools(manager);
251
200
  }, [
252
- definition.tagName,
253
- forwardedRef
201
+ manager
254
202
  ]);
255
- useEffect(() => {
256
- const element = elementRef.current;
257
- if (!element) return;
258
- Object.assign(element, propsRef.current);
259
- });
260
- return /* @__PURE__ */ React3.createElement("div", {
261
- ref: containerRef
262
- });
263
- }));
264
- WebComponentWrapper.displayName = "WebComponentWrapper";
265
- var SurfaceContextProvider = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef2(({ id, role, data, limit, fallback = DefaultFallback2, definition, ...rest }, forwardedRef) => {
266
- const contextValue = useMemo(() => ({
267
- id,
268
- role,
269
- data
270
- }), [
271
- id,
272
- role,
273
- data
203
+ useAsyncEffect(async () => {
204
+ manager.capabilities.contribute({
205
+ interface: capabilities_exports.PluginManager,
206
+ implementation: manager,
207
+ module: "dxos.org/app-framework/plugin-manager"
208
+ });
209
+ manager.capabilities.contribute({
210
+ interface: capabilities_exports.AtomRegistry,
211
+ implementation: manager.registry,
212
+ module: "dxos.org/app-framework/atom-registry"
213
+ });
214
+ const fiber = Effect.gen(function* () {
215
+ const queue = yield* PubSub.subscribe(manager.activation);
216
+ const listener = yield* Effect.forkDaemon(Queue.take(queue).pipe(Effect.tap(({ event, state, error: error$ }) => Effect.sync(() => {
217
+ if (event === activation_events_exports.Startup.id && state === "activated") {
218
+ clearTimeout(timeoutId);
219
+ setReady(true);
220
+ readyRef.current = true;
221
+ }
222
+ if (error$ && !readyRef.current) {
223
+ setError(error$);
224
+ errorRef.current = error$;
225
+ }
226
+ })), Effect.forever));
227
+ yield* Effect.all([
228
+ ...setupEvents.map((event) => manager.activate(event)),
229
+ manager.activate(activation_events_exports.SetupReactSurface),
230
+ manager.activate(activation_events_exports.Startup)
231
+ ]);
232
+ return yield* Fiber.join(listener);
233
+ }).pipe(Effect.scoped, Effect.runFork);
234
+ const timeoutId = setTimeout(() => {
235
+ if (!readyRef.current && !errorRef.current) {
236
+ log.warn("startup timeout diagnostic", {
237
+ eventsFired: manager.getEventsFired(),
238
+ activeModules: manager.getActive(),
239
+ pendingReset: manager.getPendingReset()
240
+ }, {
241
+ F: __dxlog_file,
242
+ L: 178,
243
+ S: void 0,
244
+ C: (f, a) => f(...a)
245
+ });
246
+ void runAndForwardErrors(Fiber.interrupt(fiber));
247
+ setError(new Error(`Startup timed out after ${timeout}ms`));
248
+ }
249
+ }, timeout);
250
+ return () => {
251
+ clearTimeout(timeoutId);
252
+ void runAndForwardErrors(Fiber.interrupt(fiber));
253
+ manager.capabilities.remove(capabilities_exports.PluginManager, manager);
254
+ manager.capabilities.remove(capabilities_exports.AtomRegistry, manager.registry);
255
+ };
256
+ }, [
257
+ manager
274
258
  ]);
275
- if (definition.kind === "web-component") {
276
- return /* @__PURE__ */ React3.createElement(ErrorBoundary, {
277
- data,
278
- fallback
279
- }, /* @__PURE__ */ React3.createElement(SurfaceContext.Provider, {
280
- value: contextValue
281
- }, /* @__PURE__ */ React3.createElement(WebComponentWrapper, {
282
- id,
283
- role,
284
- data,
285
- limit,
286
- definition,
287
- ref: forwardedRef,
288
- ...rest
289
- })));
290
- }
291
- const Component2 = definition.component;
292
- const debug = DEBUG || "__DX_DEBUG__" in window;
293
- if (debug) {
294
- return /* @__PURE__ */ React3.createElement(ErrorBoundary, {
295
- data,
296
- fallback
297
- }, /* @__PURE__ */ React3.createElement("div", {
298
- role: "none",
299
- className: "contents",
300
- "data-id": id,
301
- "data-role": role
302
- }, /* @__PURE__ */ React3.createElement(SurfaceContext.Provider, {
303
- value: contextValue
304
- }, /* @__PURE__ */ React3.createElement(SurfaceInfo, {
305
- ref: forwardedRef
306
- }, /* @__PURE__ */ React3.createElement(Component2, {
307
- id,
308
- role,
309
- data,
310
- limit,
311
- ...rest
312
- })))));
313
- }
314
- return /* @__PURE__ */ React3.createElement(ErrorBoundary, {
315
- data,
259
+ return useCallback(() => /* @__PURE__ */ React3.createElement(ErrorBoundary, {
316
260
  fallback
317
- }, /* @__PURE__ */ React3.createElement("div", {
318
- role: "none",
319
- className: "contents",
320
- "data-id": id,
321
- "data-role": role
322
- }, /* @__PURE__ */ React3.createElement(SurfaceContext.Provider, {
323
- value: contextValue
324
- }, /* @__PURE__ */ React3.createElement(Component2, {
325
- id,
326
- role,
327
- data,
328
- limit,
329
- ...rest,
330
- ref: forwardedRef
331
- }))));
332
- }));
333
- SurfaceContextProvider.displayName = "SurfaceContextProvider";
334
- var useSurface = () => {
335
- const context = useContext3(SurfaceContext) ?? raise2(new Error("Missing SurfaceContext"));
336
- return context;
337
- };
338
- var Surface = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef2(({ id: _id, role, data: dataProp, limit, placeholder = DEFAULT_PLACEHOLDER, ...rest }, forwardedRef) => {
339
- const data = useDefaultValue(dataProp, () => ({}));
340
- const surfaces = useSurfaces();
341
- const definitions = findCandidates(surfaces, {
342
- role,
343
- data
344
- });
345
- const candidates = limit ? definitions.slice(0, limit) : definitions;
346
- if (DEBUG && candidates.length === 0) {
347
- log.warn("no candidates for surface", {
348
- role,
349
- data
350
- }, {
351
- F: __dxlog_file2,
352
- L: 191,
353
- S: void 0,
354
- C: (f, a) => f(...a)
355
- });
356
- return null;
357
- }
358
- return /* @__PURE__ */ React3.createElement(Suspense, {
359
- fallback: placeholder
360
- }, candidates.map((definition) => /* @__PURE__ */ React3.createElement(SurfaceContextProvider, {
361
- key: definition.id,
362
- id: definition.id,
363
- role,
364
- data,
365
- limit,
366
- definition,
367
- ref: forwardedRef,
368
- ...rest
369
- })));
370
- }));
371
- Surface.displayName = "Surface";
372
- var findCandidates = (surfaces, { role, data }) => {
373
- return Object.values(surfaces).filter((definition) => Array.isArray(definition.role) ? definition.role.includes(role) : definition.role === role).filter(({ filter }) => filter ? filter(data ?? {}) : true).toSorted(byPosition);
374
- };
375
- var DefaultFallback2 = ({ data, error, dev }) => {
376
- if (dev) {
377
- return /* @__PURE__ */ React3.createElement("div", {
378
- className: "flex flex-col gap-4 p-4 is-full overflow-y-auto"
379
- }, /* @__PURE__ */ React3.createElement("h1", {
380
- className: "flex gap-2 text-sm mbs-2"
381
- }, error.message), /* @__PURE__ */ React3.createElement("pre", {
382
- className: "overflow-auto text-xs text-description"
383
- }, JSON.stringify(data, null, 2)));
384
- }
385
- return /* @__PURE__ */ React3.createElement("div", {
386
- className: "flex flex-col gap-4 p-4 is-full overflow-y-auto border border-roseFill"
387
- }, /* @__PURE__ */ React3.createElement("h1", {
388
- className: "flex gap-2 text-sm mbs-2 text-rose-500"
389
- }, error.message), /* @__PURE__ */ React3.createElement("pre", {
390
- className: "overflow-auto text-xs text-description"
391
- }, error.stack), /* @__PURE__ */ React3.createElement("pre", {
392
- className: "overflow-auto text-xs text-description"
393
- }, JSON.stringify(data, null, 2)));
394
- };
395
- var useSurfaces = () => {
396
- const surfaces = useCapabilities(Capability.ReactSurface);
397
- return useMemo(() => surfaces.flat(), [
398
- surfaces
261
+ }, /* @__PURE__ */ React3.createElement(PluginManagerProvider, {
262
+ value: manager
263
+ }, /* @__PURE__ */ React3.createElement(ContextProtocolProvider, {
264
+ value: manager,
265
+ context: PluginManagerContext
266
+ }, /* @__PURE__ */ React3.createElement(RegistryContext.Provider, {
267
+ value: manager.registry
268
+ }, /* @__PURE__ */ React3.createElement(App, {
269
+ placeholder,
270
+ ready,
271
+ error,
272
+ debounce
273
+ }))))), [
274
+ fallback,
275
+ manager,
276
+ placeholder,
277
+ ready,
278
+ error
399
279
  ]);
400
280
  };
401
- var isSurfaceAvailable = (capabilityManager, { role, data }) => {
402
- const surfaces = capabilityManager.getAll(Capability.ReactSurface);
403
- const candidates = findCandidates(surfaces.flat(), {
404
- role,
405
- data
406
- });
407
- return candidates.length > 0;
281
+ var setupDevtools = (manager) => {
282
+ globalThis.composer ??= {};
283
+ globalThis.composer.manager = manager;
408
284
  };
409
285
 
410
- // src/react/useApp.tsx
411
- import { RegistryContext as RegistryContext2 } from "@effect-atom/atom-react";
412
- import * as Effect from "effect/Effect";
413
- import * as Fiber from "effect/Fiber";
414
- import * as PubSub from "effect/PubSub";
415
- import * as Queue from "effect/Queue";
416
- import React6, { useCallback as useCallback4, useEffect as useEffect3, useMemo as useMemo2, useRef as useRef2, useState as useState3 } from "react";
417
- import { runAndForwardErrors } from "@dxos/effect";
286
+ // src/ui/hooks/useCapabilities.ts
287
+ import { useAtomValue } from "@effect-atom/atom-react";
288
+ import { useCallback as useCallback2 } from "react";
418
289
  import { invariant as invariant2 } from "@dxos/invariant";
419
- import { log as log2 } from "@dxos/log";
420
- import { useAsyncEffect, useDefaultValue as useDefaultValue2 } from "@dxos/react-hooks";
421
- import { ContextProtocolProvider } from "@dxos/web-context-react";
422
-
423
- // src/react/App.tsx
424
- import React4 from "react";
425
-
426
- // src/helpers.ts
427
- var topologicalSort = (nodes) => {
428
- const getDependencies = (nodeId, seen = /* @__PURE__ */ new Set(), path = /* @__PURE__ */ new Set()) => {
429
- if (path.has(nodeId)) {
430
- throw new Error(`Circular dependency detected involving ${nodeId}`);
431
- }
432
- if (seen.has(nodeId)) {
433
- return [];
434
- }
435
- const node = nodes.find((n) => n.id === nodeId);
436
- if (!node) {
437
- throw new Error(`Node ${nodeId} not found but is listed as a dependency`);
438
- }
439
- const newPath = /* @__PURE__ */ new Set([
440
- ...path,
441
- nodeId
442
- ]);
443
- const newSeen = /* @__PURE__ */ new Set([
444
- ...seen,
445
- nodeId
446
- ]);
447
- const dependsOn = node.dependsOn ?? [];
448
- return [
449
- ...dependsOn.flatMap((depId) => getDependencies(depId, newSeen, newPath)),
450
- nodeId
451
- ];
452
- };
453
- const allDependencies = nodes.map((node) => node.id).flatMap((id) => getDependencies(id)).filter((id, index, self) => self.indexOf(id) === index);
454
- return allDependencies.map((id) => nodes.find((node) => node.id === id)).filter((node) => node !== void 0);
290
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/sdk/app-framework/src/ui/hooks/useCapabilities.ts";
291
+ var useCapabilities = (interfaceDef) => {
292
+ const manager = usePluginManager();
293
+ return useAtomValue(manager.capabilities.atom(interfaceDef));
294
+ };
295
+ var useCapability = (interfaceDef) => {
296
+ const capabilities = useCapabilities(interfaceDef);
297
+ invariant2(capabilities.length > 0, `No capability found for ${interfaceDef.identifier}`, {
298
+ F: __dxlog_file2,
299
+ L: 30,
300
+ S: void 0,
301
+ A: [
302
+ "capabilities.length > 0",
303
+ "`No capability found for ${interfaceDef.identifier}`"
304
+ ]
305
+ });
306
+ return capabilities[0];
307
+ };
308
+ var useAtomCapability = (atomCapability) => {
309
+ const atom = useCapability(atomCapability);
310
+ return useAtomValue(atom);
311
+ };
312
+ var useAtomCapabilityState = (atomCapability) => {
313
+ const registry = useCapability(capabilities_exports.AtomRegistry);
314
+ const atom = useCapability(atomCapability);
315
+ const value = useAtomValue(atom);
316
+ const update = useCallback2((fn) => {
317
+ registry.set(atom, fn(registry.get(atom)));
318
+ }, [
319
+ registry,
320
+ atom
321
+ ]);
322
+ return [
323
+ value,
324
+ update
325
+ ];
455
326
  };
327
+ var useOperationInvoker = () => useCapability(capabilities_exports.OperationInvoker);
456
328
 
457
- // src/react/useLoading.tsx
329
+ // src/ui/hooks/useLoading.tsx
458
330
  import { useEffect as useEffect2, useState as useState2 } from "react";
459
331
  var LoadingState = /* @__PURE__ */ (function(LoadingState2) {
460
332
  LoadingState2[LoadingState2["Loading"] = 0] = "Loading";
@@ -504,23 +376,76 @@ var useLoading = (ready, debounce = 0) => {
504
376
  return stage;
505
377
  };
506
378
 
507
- // src/react/App.tsx
508
- var App = ({ placeholder: Placeholder, ready, error, debounce }) => {
509
- const reactContexts = useCapabilities(Capability.ReactContext);
510
- const reactRoots = useCapabilities(Capability.ReactRoot);
511
- const stage = useLoading(ready, debounce);
512
- if (error) {
513
- throw error;
514
- }
515
- if (stage < LoadingState.Done) {
516
- if (!Placeholder) {
517
- return null;
518
- }
519
- return /* @__PURE__ */ React4.createElement(Placeholder, {
520
- stage
379
+ // src/ui/hooks/useOperationResolver.ts
380
+ import { useEffect as useEffect3, useMemo as useMemo2 } from "react";
381
+ var useOperationResolver = (module, resolver) => {
382
+ const manager = usePluginManager();
383
+ const resolverArray = useMemo2(() => [
384
+ resolver
385
+ ], [
386
+ resolver
387
+ ]);
388
+ useEffect3(() => {
389
+ manager.capabilities.contribute({
390
+ module,
391
+ interface: capabilities_exports.OperationResolver,
392
+ implementation: resolverArray
521
393
  });
522
- }
523
- const ComposedContext = composeContexts(reactContexts);
394
+ return () => manager.capabilities.remove(capabilities_exports.OperationResolver, resolverArray);
395
+ }, [
396
+ module,
397
+ resolverArray
398
+ ]);
399
+ };
400
+
401
+ // src/ui/hooks/useSettingsState.ts
402
+ import { RegistryContext as RegistryContext2, useAtomValue as useAtomValue2 } from "@effect-atom/atom-react";
403
+ import { useCallback as useCallback3, useContext as useContext2 } from "react";
404
+ var useSettingsState = (atom) => {
405
+ const registry = useContext2(RegistryContext2);
406
+ const settings = useAtomValue2(atom);
407
+ const updateSettings = useCallback3((fn) => {
408
+ registry.set(atom, fn(registry.get(atom)));
409
+ }, [
410
+ registry,
411
+ atom
412
+ ]);
413
+ return {
414
+ settings,
415
+ updateSettings
416
+ };
417
+ };
418
+
419
+ // src/ui/hooks/useSurface.ts
420
+ import { useContext as useContext3 } from "react";
421
+ import { raise as raise2 } from "@dxos/debug";
422
+
423
+ // src/ui/components/surface/context.ts
424
+ import { createContext as createContext2 } from "react";
425
+ var SurfaceContext = createContext2(void 0);
426
+
427
+ // src/ui/hooks/useSurface.ts
428
+ var useSurface = () => {
429
+ return useContext3(SurfaceContext) ?? raise2(new Error("Missing SurfaceContext"));
430
+ };
431
+
432
+ // src/ui/components/App.tsx
433
+ var App = ({ placeholder: Placeholder, ready, error, debounce }) => {
434
+ const reactContexts = useCapabilities(capabilities_exports.ReactContext);
435
+ const reactRoots = useCapabilities(capabilities_exports.ReactRoot);
436
+ const stage = useLoading(ready, debounce);
437
+ if (error) {
438
+ throw error;
439
+ }
440
+ if (stage < LoadingState.Done) {
441
+ if (!Placeholder) {
442
+ return null;
443
+ }
444
+ return /* @__PURE__ */ React4.createElement(Placeholder, {
445
+ stage
446
+ });
447
+ }
448
+ const ComposedContext = composeContexts(reactContexts);
524
449
  return /* @__PURE__ */ React4.createElement(ComposedContext, null, reactRoots.map(({ id, root: Component2 }) => /* @__PURE__ */ React4.createElement(Component2, {
525
450
  key: id
526
451
  })));
@@ -532,216 +457,326 @@ var composeContexts = (contexts) => {
532
457
  return topologicalSort(contexts).map(({ context }) => context).reduce((Acc, Next) => ({ children }) => /* @__PURE__ */ React4.createElement(Acc, null, /* @__PURE__ */ React4.createElement(Next, null, children)));
533
458
  };
534
459
 
535
- // src/react/DefaultFallback.tsx
536
- import React5 from "react";
537
- var DefaultFallback3 = ({ error }) => {
538
- return /* @__PURE__ */ React5.createElement("div", {
539
- style: {
540
- margin: "1rem",
541
- padding: "1rem",
542
- overflow: "hidden",
543
- border: "4px solid teal",
544
- borderRadius: "1rem"
545
- }
546
- }, /* @__PURE__ */ React5.createElement("h1", {
547
- style: {
548
- margin: "0.5rem 0",
549
- fontSize: "1.2rem"
550
- }
551
- }, "ERROR: ", error.message), /* @__PURE__ */ React5.createElement("pre", {
552
- style: {
553
- overflow: "auto",
554
- fontSize: "1rem",
555
- whiteSpace: "pre-wrap",
556
- color: "#888888"
557
- }
558
- }, error.stack));
559
- };
460
+ // src/ui/components/surface/index.ts
461
+ var surface_exports = {};
462
+ __export(surface_exports, {
463
+ Surface: () => Surface,
464
+ create: () => create,
465
+ createWeb: () => createWeb,
466
+ isAvailable: () => isSurfaceAvailable
467
+ });
560
468
 
561
- // src/react/useApp.tsx
562
- var __dxlog_file3 = "/__w/dxos/dxos/packages/sdk/app-framework/src/react/useApp.tsx";
563
- var ENABLED_KEY = "dxos.org/app-framework/enabled";
564
- var useApp = ({ pluginManager, pluginLoader: pluginLoaderProp, plugins: pluginsProp, core: coreProp, defaults: defaultsProp, placeholder, fallback = DefaultFallback3, cacheEnabled = false, safeMode = false, debounce = 0, timeout = 3e4 }) => {
565
- const plugins = useDefaultValue2(pluginsProp, () => []);
566
- const core = useDefaultValue2(coreProp, () => plugins.map(({ meta }) => meta.id));
567
- const defaults = useDefaultValue2(defaultsProp, () => []);
568
- const pluginLoader = useMemo2(() => pluginLoaderProp ?? ((id) => Effect.sync(() => {
569
- const plugin = plugins.find((plugin2) => plugin2.meta.id === id);
570
- invariant2(plugin, `Plugin not found: ${id}`, {
571
- F: __dxlog_file3,
572
- L: 92,
573
- S: void 0,
574
- A: [
575
- "plugin",
576
- "`Plugin not found: ${id}`"
577
- ]
578
- });
579
- return plugin;
580
- })), [
581
- pluginLoaderProp,
582
- plugins
583
- ]);
584
- const readyRef = useRef2(false);
585
- const [ready, setReady] = useState3(false);
586
- const errorRef = useRef2(null);
587
- const [error, setError] = useState3(null);
588
- const cached = useMemo2(() => JSON.parse(localStorage.getItem(ENABLED_KEY) ?? "[]"), []);
589
- const enabled = useMemo2(() => safeMode ? [] : cacheEnabled && cached.length > 0 ? cached : defaults, [
590
- safeMode,
591
- cacheEnabled,
592
- cached,
593
- defaults
594
- ]);
595
- const manager = useMemo2(() => pluginManager ?? plugin_manager_exports.make({
596
- pluginLoader,
597
- plugins,
598
- core,
599
- enabled
600
- }), [
601
- pluginManager,
602
- pluginLoader,
603
- plugins,
604
- core,
605
- enabled
469
+ // src/ui/components/surface/types.ts
470
+ var create = (definition) => ({
471
+ ...definition,
472
+ kind: "react"
473
+ });
474
+ var createWeb = (definition) => ({
475
+ ...definition,
476
+ kind: "web-component"
477
+ });
478
+
479
+ // src/ui/components/surface/SurfaceComponent.tsx
480
+ import React6, { Fragment, Suspense, forwardRef as forwardRef2, memo, useEffect as useEffect4, useMemo as useMemo3, useRef as useRef2 } from "react";
481
+ import { log as log2 } from "@dxos/log";
482
+ import { useDefaultValue as useDefaultValue2 } from "@dxos/react-hooks";
483
+ import { ScrollArea } from "@dxos/react-ui";
484
+ import { byPosition } from "@dxos/util";
485
+
486
+ // src/ui/components/surface/SurfaceInfo.tsx
487
+ import React5, { cloneElement, forwardRef, useCallback as useCallback4, useLayoutEffect, useState as useState3 } from "react";
488
+ import { createPortal } from "react-dom";
489
+ import { addEventListener, combine } from "@dxos/async";
490
+ import { useMergeRefs } from "@dxos/react-hooks";
491
+ var SurfaceInfo = /* @__PURE__ */ forwardRef(({ children }, forwardedRef) => {
492
+ const [rect, setRect] = useState3(null);
493
+ const [expand, setExpand] = useState3(false);
494
+ const info = useSurface();
495
+ const [root, setRoot] = useState3(null);
496
+ const measureRef = useCallback4((node) => setRoot(node), []);
497
+ const mergedRef = useMergeRefs([
498
+ measureRef,
499
+ forwardedRef
606
500
  ]);
607
- useEffect3(() => {
608
- if (!cacheEnabled) {
501
+ const childWithRef = /* @__PURE__ */ cloneElement(children, {
502
+ ref: mergedRef
503
+ });
504
+ useLayoutEffect(() => {
505
+ if (!root) {
506
+ setRect(null);
609
507
  return;
610
508
  }
611
- return manager.registry.subscribe(manager.enabled, (value) => {
612
- localStorage.setItem(ENABLED_KEY, JSON.stringify(value));
509
+ const measure = () => {
510
+ setRect(root.getBoundingClientRect());
511
+ };
512
+ const observer = new ResizeObserver(measure);
513
+ observer.observe(root);
514
+ measure();
515
+ return combine(addEventListener(window, "scroll", measure, true), addEventListener(window, "resize", measure), () => {
516
+ observer.disconnect();
613
517
  });
614
518
  }, [
615
- cacheEnabled,
616
- manager
617
- ]);
618
- useEffect3(() => {
619
- setupDevtools(manager);
620
- }, [
621
- manager
519
+ root
622
520
  ]);
623
- useAsyncEffect(async () => {
624
- manager.capabilities.contribute({
625
- interface: Capability.PluginManager,
626
- implementation: manager,
627
- module: "dxos.org/app-framework/plugin-manager"
628
- });
629
- manager.capabilities.contribute({
630
- interface: Capability.AtomRegistry,
631
- implementation: manager.registry,
632
- module: "dxos.org/app-framework/atom-registry"
633
- });
634
- const fiber = Effect.gen(function* () {
635
- const queue = yield* PubSub.subscribe(manager.activation);
636
- const listener = yield* Effect.forkDaemon(Queue.take(queue).pipe(Effect.tap(({ event, state, error: error$ }) => Effect.sync(() => {
637
- if (event === ActivationEvent.Startup.id && state === "activated") {
638
- clearTimeout(timeoutId);
639
- setReady(true);
640
- readyRef.current = true;
641
- }
642
- if (error$ && !readyRef.current) {
643
- setError(error$);
644
- errorRef.current = error$;
645
- }
646
- })), Effect.forever));
647
- yield* Effect.all([
648
- manager.activate(ActivationEvent.SetupSettings),
649
- manager.activate(ActivationEvent.SetupReactSurface),
650
- manager.activate(ActivationEvent.Startup)
651
- ]);
652
- return yield* Fiber.join(listener);
653
- }).pipe(Effect.scoped, Effect.runFork);
654
- const timeoutId = setTimeout(() => {
655
- if (!readyRef.current && !errorRef.current) {
656
- log2.warn("startup timeout diagnostic", {
657
- eventsFired: manager.getEventsFired(),
658
- activeModules: manager.getActive(),
659
- pendingReset: manager.getPendingReset()
660
- }, {
661
- F: __dxlog_file3,
662
- L: 172,
663
- S: void 0,
664
- C: (f, a) => f(...a)
665
- });
666
- void runAndForwardErrors(Fiber.interrupt(fiber));
667
- setError(new Error(`Startup timed out after ${timeout}ms`));
521
+ const padding = 0;
522
+ return /* @__PURE__ */ React5.createElement(React5.Fragment, null, childWithRef, rect && /* @__PURE__ */ createPortal(
523
+ /* @__PURE__ */ React5.createElement("div", {
524
+ role: "none",
525
+ className: "z-[100] fixed flex flex-col-reverse scrollbar-none overflow-auto pointer-events-none",
526
+ style: {
527
+ top: rect.top + padding,
528
+ left: rect.left + padding,
529
+ width: rect.width - padding * 2,
530
+ height: rect.height - padding * 2
668
531
  }
669
- }, timeout);
532
+ }, expand ? /* @__PURE__ */ React5.createElement("div", {
533
+ className: "absolute inset-0 bg-deckSurface border border-green-500 cursor-pointer pointer-events-auto overflow-auto",
534
+ onPointerDown: (ev) => ev.stopPropagation(),
535
+ onClick: (ev) => {
536
+ ev.stopPropagation();
537
+ setExpand(false);
538
+ }
539
+ }, /* @__PURE__ */ React5.createElement("pre", {
540
+ className: "p-2 text-xs text-description font-mono"
541
+ }, JSON.stringify({
542
+ info
543
+ }, null, 2))) : /* @__PURE__ */ React5.createElement("span", {
544
+ 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",
545
+ title: info.id,
546
+ onPointerDown: (ev) => ev.stopPropagation(),
547
+ onClick: (ev) => {
548
+ ev.stopPropagation();
549
+ setExpand(true);
550
+ }
551
+ }, "\u24D8")),
552
+ // TODO(burdon): Create well-known element to gather all debug portals.
553
+ document.body
554
+ ));
555
+ });
556
+
557
+ // src/ui/components/surface/SurfaceComponent.tsx
558
+ var __dxlog_file3 = "/__w/dxos/dxos/packages/sdk/app-framework/src/ui/components/surface/SurfaceComponent.tsx";
559
+ var DEFAULT_PLACEHOLDER = /* @__PURE__ */ React6.createElement(Fragment, null);
560
+ var DEBUG = import.meta.env.VITE_DEBUG;
561
+ var WebComponentWrapper = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef2(({ id, role, data, limit, definition, ...rest }, forwardedRef) => {
562
+ const containerRef = useRef2(null);
563
+ const elementRef = useRef2(null);
564
+ const propsRef = useRef2({
565
+ id,
566
+ role,
567
+ data,
568
+ limit,
569
+ ...rest
570
+ });
571
+ propsRef.current = {
572
+ id,
573
+ role,
574
+ data,
575
+ limit,
576
+ ...rest
577
+ };
578
+ useEffect4(() => {
579
+ if (!containerRef.current || elementRef.current) {
580
+ return;
581
+ }
582
+ const element = document.createElement(definition.tagName);
583
+ elementRef.current = element;
584
+ Object.assign(element, propsRef.current);
585
+ containerRef.current.appendChild(element);
586
+ if (typeof forwardedRef === "function") {
587
+ forwardedRef(element);
588
+ } else if (forwardedRef) {
589
+ forwardedRef.current = element;
590
+ }
670
591
  return () => {
671
- clearTimeout(timeoutId);
672
- void runAndForwardErrors(Fiber.interrupt(fiber));
673
- manager.capabilities.remove(Capability.PluginManager, manager);
674
- manager.capabilities.remove(Capability.AtomRegistry, manager.registry);
592
+ if (elementRef.current && containerRef.current?.contains(elementRef.current)) {
593
+ containerRef.current.removeChild(elementRef.current);
594
+ }
595
+ if (typeof forwardedRef === "function") {
596
+ forwardedRef(null);
597
+ } else if (forwardedRef) {
598
+ forwardedRef.current = null;
599
+ }
600
+ elementRef.current = null;
675
601
  };
676
602
  }, [
677
- manager
603
+ definition.tagName,
604
+ forwardedRef
678
605
  ]);
679
- return useCallback4(() => /* @__PURE__ */ React6.createElement(ErrorBoundary, {
680
- fallback
681
- }, /* @__PURE__ */ React6.createElement(PluginManagerProvider, {
682
- value: manager
683
- }, /* @__PURE__ */ React6.createElement(ContextProtocolProvider, {
684
- value: manager,
685
- context: PluginManagerContext
686
- }, /* @__PURE__ */ React6.createElement(RegistryContext2.Provider, {
687
- value: manager.registry
688
- }, /* @__PURE__ */ React6.createElement(App, {
689
- placeholder,
690
- ready,
691
- error,
692
- debounce
693
- }))))), [
694
- fallback,
695
- manager,
696
- placeholder,
697
- ready,
698
- error
606
+ useEffect4(() => {
607
+ const element = elementRef.current;
608
+ if (!element) {
609
+ return;
610
+ }
611
+ Object.assign(element, propsRef.current);
612
+ });
613
+ return /* @__PURE__ */ React6.createElement("div", {
614
+ ref: containerRef
615
+ });
616
+ }));
617
+ WebComponentWrapper.displayName = "WebComponentWrapper";
618
+ var SurfaceContextProvider = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef2(({ id, role, data, limit, fallback = DefaultFallback3, definition, ...rest }, forwardedRef) => {
619
+ const contextValue = useMemo3(() => ({
620
+ id,
621
+ role,
622
+ data
623
+ }), [
624
+ id,
625
+ role,
626
+ data
699
627
  ]);
628
+ if (definition.kind === "web-component") {
629
+ return /* @__PURE__ */ React6.createElement(ErrorBoundary, {
630
+ data,
631
+ fallback
632
+ }, /* @__PURE__ */ React6.createElement(SurfaceContext.Provider, {
633
+ value: contextValue
634
+ }, /* @__PURE__ */ React6.createElement(WebComponentWrapper, {
635
+ id,
636
+ role,
637
+ data,
638
+ limit,
639
+ definition,
640
+ ref: forwardedRef,
641
+ ...rest
642
+ })));
643
+ }
644
+ const Component2 = definition.component;
645
+ const debug = DEBUG || "__DX_DEBUG__" in window;
646
+ if (debug) {
647
+ return /* @__PURE__ */ React6.createElement(ErrorBoundary, {
648
+ data,
649
+ fallback
650
+ }, /* @__PURE__ */ React6.createElement("div", {
651
+ role: "none",
652
+ className: "contents",
653
+ "data-id": id,
654
+ "data-role": role
655
+ }, /* @__PURE__ */ React6.createElement(SurfaceContext.Provider, {
656
+ value: contextValue
657
+ }, /* @__PURE__ */ React6.createElement(SurfaceInfo, {
658
+ ref: forwardedRef
659
+ }, /* @__PURE__ */ React6.createElement(Component2, {
660
+ id,
661
+ role,
662
+ data,
663
+ limit,
664
+ ...rest
665
+ })))));
666
+ }
667
+ return /* @__PURE__ */ React6.createElement(ErrorBoundary, {
668
+ data,
669
+ fallback
670
+ }, /* @__PURE__ */ React6.createElement("div", {
671
+ role: "none",
672
+ className: "contents",
673
+ "data-id": id,
674
+ "data-role": role
675
+ }, /* @__PURE__ */ React6.createElement(SurfaceContext.Provider, {
676
+ value: contextValue
677
+ }, /* @__PURE__ */ React6.createElement(Component2, {
678
+ id,
679
+ role,
680
+ data,
681
+ limit,
682
+ ...rest,
683
+ ref: forwardedRef
684
+ }))));
685
+ }));
686
+ SurfaceContextProvider.displayName = "SurfaceContextProvider";
687
+ var Surface = /* @__PURE__ */ memo(/* @__PURE__ */ forwardRef2(({ id: _id, role, data: dataProp, limit, placeholder = DEFAULT_PLACEHOLDER, ...rest }, forwardedRef) => {
688
+ const data = useDefaultValue2(dataProp, () => ({}));
689
+ const surfaces = useSurfaces();
690
+ const definitions = findCandidates(surfaces, {
691
+ role,
692
+ data
693
+ });
694
+ const candidates = limit ? definitions.slice(0, limit) : definitions;
695
+ if (DEBUG && candidates.length === 0) {
696
+ log2.warn("no candidates for surface", {
697
+ role,
698
+ data
699
+ }, {
700
+ F: __dxlog_file3,
701
+ L: 185,
702
+ S: void 0,
703
+ C: (f, a) => f(...a)
704
+ });
705
+ return null;
706
+ }
707
+ return /* @__PURE__ */ React6.createElement(Suspense, {
708
+ fallback: placeholder
709
+ }, candidates.map((definition) => /* @__PURE__ */ React6.createElement(SurfaceContextProvider, {
710
+ key: definition.id,
711
+ id: definition.id,
712
+ role,
713
+ data,
714
+ limit,
715
+ definition,
716
+ ref: forwardedRef,
717
+ ...rest
718
+ })));
719
+ }));
720
+ Surface.displayName = "Surface";
721
+ var findCandidates = (surfaces, { role, data }) => {
722
+ return Object.values(surfaces).filter((definition) => Array.isArray(definition.role) ? definition.role.includes(role) : definition.role === role).filter(({ filter }) => filter ? filter(data ?? {}) : true).toSorted(byPosition);
700
723
  };
701
- var setupDevtools = (manager) => {
702
- globalThis.composer ??= {};
703
- globalThis.composer.manager = manager;
724
+ var DefaultFallback3 = ({ data, error, dev }) => {
725
+ if (dev) {
726
+ return /* @__PURE__ */ React6.createElement(ScrollArea.Root, {
727
+ orientation: "vertical"
728
+ }, /* @__PURE__ */ React6.createElement(ScrollArea.Viewport, {
729
+ classNames: "p-4 gap-4"
730
+ }, /* @__PURE__ */ React6.createElement("h1", {
731
+ className: "flex gap-2 text-sm mbs-2"
732
+ }, error.message), /* @__PURE__ */ React6.createElement("pre", {
733
+ className: "overflow-auto text-xs text-description"
734
+ }, JSON.stringify(data, null, 2))));
735
+ }
736
+ return /* @__PURE__ */ React6.createElement(ScrollArea.Root, {
737
+ orientation: "vertical"
738
+ }, /* @__PURE__ */ React6.createElement(ScrollArea.Viewport, {
739
+ classNames: "p-4 gap-4 border border-roseFill"
740
+ }, /* @__PURE__ */ React6.createElement("h1", {
741
+ className: "flex gap-2 text-sm mbs-2 text-errorText"
742
+ }, error.message), /* @__PURE__ */ React6.createElement("pre", {
743
+ className: "overflow-x-auto text-xs text-description"
744
+ }, error.stack), /* @__PURE__ */ React6.createElement("pre", {
745
+ className: "overflow-x-auto text-xs text-description"
746
+ }, JSON.stringify(data, null, 2))));
704
747
  };
705
-
706
- // src/react/useOperationResolver.ts
707
- import { useEffect as useEffect4, useMemo as useMemo3 } from "react";
708
- var useOperationResolver = (module, resolver) => {
709
- const manager = usePluginManager();
710
- const resolverArray = useMemo3(() => [
711
- resolver
712
- ], [
713
- resolver
714
- ]);
715
- useEffect4(() => {
716
- manager.capabilities.contribute({
717
- module,
718
- interface: Capability.OperationResolver,
719
- implementation: resolverArray
720
- });
721
- return () => manager.capabilities.remove(Capability.OperationResolver, resolverArray);
722
- }, [
723
- module,
724
- resolverArray
748
+ var useSurfaces = () => {
749
+ const surfaces = useCapabilities(capabilities_exports.ReactSurface);
750
+ return useMemo3(() => surfaces.flat(), [
751
+ surfaces
725
752
  ]);
726
753
  };
754
+ var isSurfaceAvailable = (capabilityManager, { role, data }) => {
755
+ const surfaces = capabilityManager.getAll(capabilities_exports.ReactSurface);
756
+ const candidates = findCandidates(surfaces.flat(), {
757
+ role,
758
+ data
759
+ });
760
+ return candidates.length > 0;
761
+ };
727
762
 
728
763
  export {
764
+ DefaultFallback,
765
+ ErrorBoundary,
729
766
  usePluginManager,
730
767
  PluginManagerProvider,
768
+ useApp,
731
769
  useCapabilities,
732
770
  useCapability,
733
771
  useAtomCapability,
734
772
  useAtomCapabilityState,
735
773
  useOperationInvoker,
736
- useAppGraph,
737
- useLayout,
774
+ LoadingState,
775
+ useLoading,
776
+ useOperationResolver,
738
777
  useSettingsState,
739
- ErrorBoundary,
740
778
  useSurface,
741
- Surface,
742
- useSurfaces,
743
- isSurfaceAvailable,
744
- useApp,
745
- useOperationResolver
779
+ App,
780
+ surface_exports
746
781
  };
747
- //# sourceMappingURL=chunk-6WXBT3EC.mjs.map
782
+ //# sourceMappingURL=chunk-PQOJE7NA.mjs.map