@dxos/app-framework 0.8.4-main.406dc2a → 0.8.4-main.422d1c7879

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 (552) hide show
  1. package/.storybook/main.mts +2 -4
  2. package/.storybook/preview.mts +2 -2
  3. package/dist/lib/browser/capability-DOMNPRJP.mjs +35 -0
  4. package/dist/lib/browser/capability-DOMNPRJP.mjs.map +7 -0
  5. package/dist/lib/browser/capability-KSNT34SN.mjs +38 -0
  6. package/dist/lib/browser/capability-KSNT34SN.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-2CKCJ6PN.mjs +79 -0
  8. package/dist/lib/browser/chunk-2CKCJ6PN.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-7B6AJK4D.mjs +964 -0
  10. package/dist/lib/browser/chunk-7B6AJK4D.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-BMIAYUWT.mjs +397 -0
  12. package/dist/lib/browser/chunk-BMIAYUWT.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-F7FW2RK2.mjs +167 -0
  14. package/dist/lib/browser/chunk-F7FW2RK2.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-GDWTW4ZW.mjs +148 -0
  16. package/dist/lib/browser/chunk-GDWTW4ZW.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-I34GF4NG.mjs +34 -0
  18. package/dist/lib/browser/chunk-I34GF4NG.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  20. package/dist/lib/browser/chunk-JKWMHZP6.mjs +80 -0
  21. package/dist/lib/browser/chunk-JKWMHZP6.mjs.map +7 -0
  22. package/dist/lib/browser/chunk-QRTB4Q3U.mjs +594 -0
  23. package/dist/lib/browser/chunk-QRTB4Q3U.mjs.map +7 -0
  24. package/dist/lib/browser/chunk-QSXYHXCE.mjs +48 -0
  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-T3Y4AEKX.mjs +42 -0
  28. package/dist/lib/browser/chunk-T3Y4AEKX.mjs.map +7 -0
  29. package/dist/lib/browser/chunk-TGX63LTL.mjs +8 -0
  30. package/dist/lib/browser/chunk-TGX63LTL.mjs.map +7 -0
  31. package/dist/lib/browser/chunk-Y543KCO7.mjs +174 -0
  32. package/dist/lib/browser/chunk-Y543KCO7.mjs.map +7 -0
  33. package/dist/lib/browser/cli/index.mjs +90 -0
  34. package/dist/lib/browser/cli/index.mjs.map +7 -0
  35. package/dist/lib/browser/common/activation-events.mjs +24 -0
  36. package/dist/lib/browser/common/capabilities.mjs +46 -0
  37. package/dist/lib/browser/core/activation-event.mjs +20 -0
  38. package/dist/lib/browser/core/activation-event.mjs.map +7 -0
  39. package/dist/lib/browser/core/capability.mjs +30 -0
  40. package/dist/lib/browser/core/capability.mjs.map +7 -0
  41. package/dist/lib/browser/core/plugin-manager.mjs +15 -0
  42. package/dist/lib/browser/core/plugin-manager.mjs.map +7 -0
  43. package/dist/lib/browser/core/plugin.mjs +29 -0
  44. package/dist/lib/browser/core/plugin.mjs.map +7 -0
  45. package/dist/lib/browser/core/url-loader.mjs +16 -0
  46. package/dist/lib/browser/core/url-loader.mjs.map +7 -0
  47. package/dist/lib/browser/index.mjs +91 -148
  48. package/dist/lib/browser/index.mjs.map +4 -4
  49. package/dist/lib/browser/invoker-capability-VCMPQOIA.mjs +43 -0
  50. package/dist/lib/browser/invoker-capability-VCMPQOIA.mjs.map +7 -0
  51. package/dist/lib/browser/meta.json +1 -1
  52. package/dist/lib/browser/testing/index.mjs +243 -41
  53. package/dist/lib/browser/testing/index.mjs.map +4 -4
  54. package/dist/lib/browser/testing/react.mjs +78 -0
  55. package/dist/lib/browser/testing/react.mjs.map +7 -0
  56. package/dist/lib/browser/ui/index.mjs +46 -0
  57. package/dist/lib/browser/ui/index.mjs.map +7 -0
  58. package/dist/lib/node-esm/capability-EOQTORML.mjs +39 -0
  59. package/dist/lib/node-esm/capability-EOQTORML.mjs.map +7 -0
  60. package/dist/lib/node-esm/capability-KJTQIWDK.mjs +36 -0
  61. package/dist/lib/node-esm/capability-KJTQIWDK.mjs.map +7 -0
  62. package/dist/lib/node-esm/chunk-42KBWDE4.mjs +80 -0
  63. package/dist/lib/node-esm/chunk-42KBWDE4.mjs.map +7 -0
  64. package/dist/lib/node-esm/chunk-7PJ5OKRB.mjs +965 -0
  65. package/dist/lib/node-esm/chunk-7PJ5OKRB.mjs.map +7 -0
  66. package/dist/lib/node-esm/chunk-DXVXOGJ7.mjs +175 -0
  67. package/dist/lib/node-esm/chunk-DXVXOGJ7.mjs.map +7 -0
  68. package/dist/lib/node-esm/chunk-EL3R25OQ.mjs +2 -0
  69. package/dist/lib/node-esm/chunk-EL3R25OQ.mjs.map +7 -0
  70. package/dist/lib/node-esm/chunk-FKE4Z3D6.mjs +10 -0
  71. package/dist/lib/node-esm/chunk-FKE4Z3D6.mjs.map +7 -0
  72. package/dist/lib/node-esm/chunk-G3RTFSNG.mjs +81 -0
  73. package/dist/lib/node-esm/chunk-G3RTFSNG.mjs.map +7 -0
  74. package/dist/lib/node-esm/chunk-HI3YBICQ.mjs +149 -0
  75. package/dist/lib/node-esm/chunk-HI3YBICQ.mjs.map +7 -0
  76. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  77. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  78. package/dist/lib/node-esm/chunk-JPWVIQ5I.mjs +595 -0
  79. package/dist/lib/node-esm/chunk-JPWVIQ5I.mjs.map +7 -0
  80. package/dist/lib/node-esm/chunk-URWHJQT2.mjs +168 -0
  81. package/dist/lib/node-esm/chunk-URWHJQT2.mjs.map +7 -0
  82. package/dist/lib/node-esm/chunk-VKHGNEDB.mjs +43 -0
  83. package/dist/lib/node-esm/chunk-VKHGNEDB.mjs.map +7 -0
  84. package/dist/lib/node-esm/chunk-WZ6DHQER.mjs +398 -0
  85. package/dist/lib/node-esm/chunk-WZ6DHQER.mjs.map +7 -0
  86. package/dist/lib/node-esm/chunk-WZCSOX5Q.mjs +35 -0
  87. package/dist/lib/node-esm/chunk-WZCSOX5Q.mjs.map +7 -0
  88. package/dist/lib/node-esm/chunk-ZZ7CKK6W.mjs +49 -0
  89. package/dist/lib/node-esm/chunk-ZZ7CKK6W.mjs.map +7 -0
  90. package/dist/lib/node-esm/cli/index.mjs +91 -0
  91. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  92. package/dist/lib/node-esm/common/activation-events.mjs +25 -0
  93. package/dist/lib/node-esm/common/activation-events.mjs.map +7 -0
  94. package/dist/lib/node-esm/common/capabilities.mjs +47 -0
  95. package/dist/lib/node-esm/common/capabilities.mjs.map +7 -0
  96. package/dist/lib/node-esm/core/activation-event.mjs +21 -0
  97. package/dist/lib/node-esm/core/activation-event.mjs.map +7 -0
  98. package/dist/lib/node-esm/core/capability.mjs +31 -0
  99. package/dist/lib/node-esm/core/capability.mjs.map +7 -0
  100. package/dist/lib/node-esm/core/plugin-manager.mjs +16 -0
  101. package/dist/lib/node-esm/core/plugin-manager.mjs.map +7 -0
  102. package/dist/lib/node-esm/core/plugin.mjs +30 -0
  103. package/dist/lib/node-esm/core/plugin.mjs.map +7 -0
  104. package/dist/lib/node-esm/core/url-loader.mjs +17 -0
  105. package/dist/lib/node-esm/core/url-loader.mjs.map +7 -0
  106. package/dist/lib/node-esm/index.mjs +91 -148
  107. package/dist/lib/node-esm/index.mjs.map +4 -4
  108. package/dist/lib/node-esm/invoker-capability-EGA3XW6J.mjs +44 -0
  109. package/dist/lib/node-esm/invoker-capability-EGA3XW6J.mjs.map +7 -0
  110. package/dist/lib/node-esm/meta.json +1 -1
  111. package/dist/lib/node-esm/testing/index.mjs +243 -41
  112. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  113. package/dist/lib/node-esm/testing/react.mjs +79 -0
  114. package/dist/lib/node-esm/testing/react.mjs.map +7 -0
  115. package/dist/lib/node-esm/ui/index.mjs +47 -0
  116. package/dist/lib/node-esm/ui/index.mjs.map +7 -0
  117. package/dist/plugin/node-esm/index.mjs +794 -0
  118. package/dist/plugin/node-esm/index.mjs.map +7 -0
  119. package/dist/plugin/node-esm/meta.json +1 -0
  120. package/dist/types/src/cli/cli.d.ts +39 -0
  121. package/dist/types/src/cli/cli.d.ts.map +1 -0
  122. package/dist/types/src/cli/index.d.ts +2 -0
  123. package/dist/types/src/cli/index.d.ts.map +1 -0
  124. package/dist/types/src/common/activation-events.d.ts +27 -0
  125. package/dist/types/src/common/activation-events.d.ts.map +1 -0
  126. package/dist/types/src/common/capabilities.d.ts +109 -200
  127. package/dist/types/src/common/capabilities.d.ts.map +1 -1
  128. package/dist/types/src/common/index.d.ts +4 -8
  129. package/dist/types/src/common/index.d.ts.map +1 -1
  130. package/dist/types/src/common/operations.d.ts +19 -0
  131. package/dist/types/src/common/operations.d.ts.map +1 -0
  132. package/dist/types/src/common/translations.d.ts +7 -7
  133. package/dist/types/src/common/translations.d.ts.map +1 -1
  134. package/dist/types/src/context.d.ts +5 -0
  135. package/dist/types/src/context.d.ts.map +1 -0
  136. package/dist/types/src/core/{events.d.ts → activation-event.d.ts} +7 -7
  137. package/dist/types/src/core/activation-event.d.ts.map +1 -0
  138. package/dist/types/src/core/capability-manager.d.ts +48 -0
  139. package/dist/types/src/core/capability-manager.d.ts.map +1 -0
  140. package/dist/types/src/core/capability-manager.test.d.ts +2 -0
  141. package/dist/types/src/core/capability-manager.test.d.ts.map +1 -0
  142. package/dist/types/src/core/capability.d.ts +156 -0
  143. package/dist/types/src/core/capability.d.ts.map +1 -0
  144. package/dist/types/src/core/index.d.ts +6 -4
  145. package/dist/types/src/core/index.d.ts.map +1 -1
  146. package/dist/types/src/core/plugin-manager.d.ts +78 -0
  147. package/dist/types/src/core/plugin-manager.d.ts.map +1 -0
  148. package/dist/types/src/core/plugin-manager.test.d.ts +2 -0
  149. package/dist/types/src/core/plugin-manager.test.d.ts.map +1 -0
  150. package/dist/types/src/core/plugin.d.ts +127 -39
  151. package/dist/types/src/core/plugin.d.ts.map +1 -1
  152. package/dist/types/src/core/url-loader.d.ts +42 -0
  153. package/dist/types/src/core/url-loader.d.ts.map +1 -0
  154. package/dist/types/src/core/url-loader.test.d.ts +2 -0
  155. package/dist/types/src/core/url-loader.test.d.ts.map +1 -0
  156. package/dist/types/src/index.d.ts +3 -4
  157. package/dist/types/src/index.d.ts.map +1 -1
  158. package/dist/types/src/plugin-operation/OperationPlugin.d.ts +3 -0
  159. package/dist/types/src/plugin-operation/OperationPlugin.d.ts.map +1 -0
  160. package/dist/types/src/plugin-operation/history/capability.d.ts +7 -0
  161. package/dist/types/src/plugin-operation/history/capability.d.ts.map +1 -0
  162. package/dist/types/src/plugin-operation/history/errors.d.ts +32 -0
  163. package/dist/types/src/plugin-operation/history/errors.d.ts.map +1 -0
  164. package/dist/types/src/plugin-operation/history/history-tracker.d.ts +18 -0
  165. package/dist/types/src/plugin-operation/history/history-tracker.d.ts.map +1 -0
  166. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts +2 -0
  167. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts.map +1 -0
  168. package/dist/types/src/plugin-operation/history/index.d.ts +6 -0
  169. package/dist/types/src/plugin-operation/history/index.d.ts.map +1 -0
  170. package/dist/types/src/plugin-operation/history/types.d.ts +13 -0
  171. package/dist/types/src/plugin-operation/history/types.d.ts.map +1 -0
  172. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts +101 -0
  173. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts.map +1 -0
  174. package/dist/types/src/plugin-operation/history/undo-registry.d.ts +23 -0
  175. package/dist/types/src/plugin-operation/history/undo-registry.d.ts.map +1 -0
  176. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts +2 -0
  177. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts.map +1 -0
  178. package/dist/types/src/plugin-operation/index.d.ts +3 -0
  179. package/dist/types/src/plugin-operation/index.d.ts.map +1 -0
  180. package/dist/types/src/plugin-operation/invoker-capability.d.ts +6 -0
  181. package/dist/types/src/plugin-operation/invoker-capability.d.ts.map +1 -0
  182. package/dist/types/src/plugin-operation/meta.d.ts +3 -0
  183. package/dist/types/src/plugin-operation/meta.d.ts.map +1 -0
  184. package/dist/types/src/plugin-operation/testing.d.ts +58 -0
  185. package/dist/types/src/plugin-operation/testing.d.ts.map +1 -0
  186. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts +3 -0
  187. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts.map +1 -0
  188. package/dist/types/src/plugin-runtime/capability.d.ts +6 -0
  189. package/dist/types/src/plugin-runtime/capability.d.ts.map +1 -0
  190. package/dist/types/src/plugin-runtime/index.d.ts +2 -0
  191. package/dist/types/src/plugin-runtime/index.d.ts.map +1 -0
  192. package/dist/types/src/plugin-runtime/meta.d.ts +3 -0
  193. package/dist/types/src/plugin-runtime/meta.d.ts.map +1 -0
  194. package/dist/types/src/testing/harness.d.ts +67 -0
  195. package/dist/types/src/testing/harness.d.ts.map +1 -0
  196. package/dist/types/src/testing/index.d.ts +2 -0
  197. package/dist/types/src/testing/index.d.ts.map +1 -1
  198. package/dist/types/src/testing/react.d.ts +27 -0
  199. package/dist/types/src/testing/react.d.ts.map +1 -0
  200. package/dist/types/src/testing/react.test.d.ts +2 -0
  201. package/dist/types/src/testing/react.test.d.ts.map +1 -0
  202. package/dist/types/src/testing/service.d.ts +8 -0
  203. package/dist/types/src/testing/service.d.ts.map +1 -0
  204. package/dist/types/src/testing/withPluginManager.d.ts +7 -6
  205. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  206. package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
  207. package/dist/types/src/ui/components/App/App.d.ts +9 -0
  208. package/dist/types/src/ui/components/App/App.d.ts.map +1 -0
  209. package/dist/types/src/ui/components/App/App.stories.d.ts +19 -0
  210. package/dist/types/src/ui/components/App/App.stories.d.ts.map +1 -0
  211. package/dist/types/src/ui/components/App/index.d.ts +2 -0
  212. package/dist/types/src/ui/components/App/index.d.ts.map +1 -0
  213. package/dist/types/src/{playground/playground.stories.d.ts → ui/components/PluginManager/PluginManagerContext.stories.d.ts} +5 -3
  214. package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts.map +1 -0
  215. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts +10 -0
  216. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts.map +1 -0
  217. package/dist/types/src/ui/components/PluginManager/index.d.ts +2 -0
  218. package/dist/types/src/ui/components/PluginManager/index.d.ts.map +1 -0
  219. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts +24 -0
  220. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -0
  221. package/dist/types/src/{components/App.stories.d.ts → ui/components/Surface/SurfaceComponent.stories.d.ts} +1 -1
  222. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts.map +1 -0
  223. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts +11 -0
  224. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts.map +1 -0
  225. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts +48 -0
  226. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts.map +1 -0
  227. package/dist/types/src/ui/components/Surface/context.d.ts +5 -0
  228. package/dist/types/src/ui/components/Surface/context.d.ts.map +1 -0
  229. package/dist/types/src/ui/components/Surface/index.d.ts +36 -0
  230. package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -0
  231. package/dist/types/src/ui/components/Surface/types.d.ts +197 -0
  232. package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -0
  233. package/dist/types/src/ui/components/Surface/types.test.d.ts +2 -0
  234. package/dist/types/src/ui/components/Surface/types.test.d.ts.map +1 -0
  235. package/dist/types/src/ui/components/index.d.ts +4 -0
  236. package/dist/types/src/ui/components/index.d.ts.map +1 -0
  237. package/dist/types/src/ui/hooks/index.d.ts +6 -0
  238. package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
  239. package/dist/types/src/ui/hooks/useApp.d.ts +62 -0
  240. package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -0
  241. package/dist/types/src/ui/hooks/useApp.test.d.ts +2 -0
  242. package/dist/types/src/ui/hooks/useApp.test.d.ts.map +1 -0
  243. package/dist/types/src/ui/hooks/useCapabilities.d.ts +31 -0
  244. package/dist/types/src/ui/hooks/useCapabilities.d.ts.map +1 -0
  245. package/dist/types/src/{components → ui/hooks}/useLoading.d.ts +1 -2
  246. package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -0
  247. package/dist/types/src/ui/hooks/useSettingsState.d.ts +10 -0
  248. package/dist/types/src/ui/hooks/useSettingsState.d.ts.map +1 -0
  249. package/dist/types/src/ui/hooks/useSurface.d.ts +3 -0
  250. package/dist/types/src/ui/hooks/useSurface.d.ts.map +1 -0
  251. package/dist/types/src/ui/index.d.ts +3 -0
  252. package/dist/types/src/ui/index.d.ts.map +1 -0
  253. package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts +50 -0
  254. package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts.map +1 -0
  255. package/dist/types/src/vite-plugin/boot-loader/index.d.ts +51 -0
  256. package/dist/types/src/vite-plugin/boot-loader/index.d.ts.map +1 -0
  257. package/dist/types/src/vite-plugin/composer/index.d.ts +34 -0
  258. package/dist/types/src/vite-plugin/composer/index.d.ts.map +1 -0
  259. package/dist/types/src/vite-plugin/import-map/index.d.ts +16 -0
  260. package/dist/types/src/vite-plugin/import-map/index.d.ts.map +1 -0
  261. package/dist/types/src/vite-plugin/index.d.ts +5 -0
  262. package/dist/types/src/vite-plugin/index.d.ts.map +1 -0
  263. package/dist/types/src/vite-plugin/manifest.d.ts +16 -0
  264. package/dist/types/src/vite-plugin/manifest.d.ts.map +1 -0
  265. package/dist/types/src/vite-plugin/manifest.test.d.ts +2 -0
  266. package/dist/types/src/vite-plugin/manifest.test.d.ts.map +1 -0
  267. package/dist/types/src/vite-plugin/packages.d.ts +13 -0
  268. package/dist/types/src/vite-plugin/packages.d.ts.map +1 -0
  269. package/dist/types/tsconfig.tsbuildinfo +1 -1
  270. package/moon.yml +25 -6
  271. package/package.json +110 -55
  272. package/src/cli/cli.ts +107 -0
  273. package/src/{components → cli}/index.ts +1 -1
  274. package/src/common/activation-events.ts +44 -0
  275. package/src/common/capabilities.ts +168 -213
  276. package/src/common/index.ts +4 -8
  277. package/src/common/operations.ts +35 -0
  278. package/src/common/translations.ts +17 -9
  279. package/src/context.ts +9 -0
  280. package/src/core/{events.ts → activation-event.ts} +10 -7
  281. package/src/core/capability-manager.test.ts +151 -0
  282. package/src/core/capability-manager.ts +192 -0
  283. package/src/core/capability.ts +247 -0
  284. package/src/core/index.ts +6 -4
  285. package/src/core/plugin-manager.test.ts +1142 -0
  286. package/src/core/plugin-manager.ts +893 -0
  287. package/src/core/plugin.ts +263 -46
  288. package/src/core/url-loader.test.ts +112 -0
  289. package/src/core/url-loader.ts +178 -0
  290. package/src/index.ts +3 -4
  291. package/src/plugin-operation/OperationPlugin.ts +24 -0
  292. package/src/plugin-operation/history/capability.ts +36 -0
  293. package/src/plugin-operation/history/errors.ts +7 -0
  294. package/src/plugin-operation/history/history-tracker.test.ts +373 -0
  295. package/src/plugin-operation/history/history-tracker.ts +128 -0
  296. package/src/plugin-operation/history/index.ts +9 -0
  297. package/src/plugin-operation/history/types.ts +17 -0
  298. package/src/plugin-operation/history/undo-mapping.ts +135 -0
  299. package/src/plugin-operation/history/undo-registry.test.ts +72 -0
  300. package/src/plugin-operation/history/undo-registry.ts +54 -0
  301. package/src/plugin-operation/index.ts +6 -0
  302. package/src/plugin-operation/invoker-capability.ts +54 -0
  303. package/src/plugin-operation/meta.ts +11 -0
  304. package/src/plugin-operation/testing.ts +154 -0
  305. package/src/plugin-runtime/RuntimePlugin.ts +19 -0
  306. package/src/plugin-runtime/capability.ts +53 -0
  307. package/src/{playground/logger → plugin-runtime}/index.ts +1 -1
  308. package/src/plugin-runtime/meta.ts +11 -0
  309. package/src/testing/harness.ts +229 -0
  310. package/src/testing/index.ts +2 -0
  311. package/src/testing/react.test.tsx +48 -0
  312. package/src/testing/react.tsx +113 -0
  313. package/src/testing/service.ts +52 -0
  314. package/src/testing/withPluginManager.stories.tsx +7 -8
  315. package/src/testing/withPluginManager.tsx +68 -40
  316. package/src/ui/components/App/App.stories.tsx +92 -0
  317. package/src/ui/components/App/App.tsx +70 -0
  318. package/src/{playground/debug → ui/components/App}/index.ts +1 -1
  319. package/src/ui/components/PluginManager/PluginManagerContext.stories.tsx +183 -0
  320. package/src/{react → ui/components/PluginManager}/PluginManagerProvider.ts +3 -3
  321. package/src/ui/components/PluginManager/index.ts +5 -0
  322. package/src/ui/components/Surface/SurfaceComponent.stories.tsx +144 -0
  323. package/src/ui/components/Surface/SurfaceComponent.tsx +303 -0
  324. package/src/ui/components/Surface/SurfaceInfo.tsx +107 -0
  325. package/src/ui/components/Surface/SurfaceProfilerContext.tsx +207 -0
  326. package/src/ui/components/Surface/context.ts +12 -0
  327. package/src/ui/components/Surface/index.ts +54 -0
  328. package/src/ui/components/Surface/types.test.ts +126 -0
  329. package/src/ui/components/Surface/types.ts +269 -0
  330. package/src/ui/components/index.ts +7 -0
  331. package/src/ui/hooks/index.ts +9 -0
  332. package/src/ui/hooks/useApp.test.tsx +159 -0
  333. package/src/ui/hooks/useApp.tsx +289 -0
  334. package/src/ui/hooks/useCapabilities.ts +67 -0
  335. package/src/{components → ui/hooks}/useLoading.tsx +4 -6
  336. package/src/ui/hooks/useSettingsState.ts +26 -0
  337. package/src/ui/hooks/useSurface.ts +13 -0
  338. package/src/ui/index.ts +6 -0
  339. package/src/vite-plugin/boot-loader/BootLoader.stories.tsx +162 -0
  340. package/src/vite-plugin/boot-loader/boot-loader.css +117 -0
  341. package/src/vite-plugin/boot-loader/boot-loader.js +55 -0
  342. package/src/vite-plugin/boot-loader/index.ts +99 -0
  343. package/src/vite-plugin/composer/index.ts +284 -0
  344. package/src/vite-plugin/import-map/index.ts +490 -0
  345. package/src/vite-plugin/index.ts +10 -0
  346. package/src/vite-plugin/manifest.test.ts +23 -0
  347. package/src/vite-plugin/manifest.ts +20 -0
  348. package/src/vite-plugin/packages.ts +181 -0
  349. package/tsconfig.json +13 -19
  350. package/tsconfig.node.json +2 -4
  351. package/typedoc.json +2 -4
  352. package/vitest.config.ts +1 -1
  353. package/.swc/plugins/linux_x86_64_19.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429.wasmer-v7 +0 -0
  354. package/dist/lib/browser/app-graph-builder-LG4RG2LM.mjs +0 -138
  355. package/dist/lib/browser/app-graph-builder-LG4RG2LM.mjs.map +0 -7
  356. package/dist/lib/browser/chunk-2GRQ4QXA.mjs +0 -1646
  357. package/dist/lib/browser/chunk-2GRQ4QXA.mjs.map +0 -7
  358. package/dist/lib/browser/chunk-FRUTKCPG.mjs +0 -467
  359. package/dist/lib/browser/chunk-FRUTKCPG.mjs.map +0 -7
  360. package/dist/lib/browser/chunk-SCPE4ZO2.mjs +0 -35
  361. package/dist/lib/browser/chunk-SCPE4ZO2.mjs.map +0 -7
  362. package/dist/lib/browser/intent-dispatcher-6SHA5B3N.mjs +0 -11
  363. package/dist/lib/browser/intent-resolver-UZZ4OANZ.mjs +0 -39
  364. package/dist/lib/browser/intent-resolver-UZZ4OANZ.mjs.map +0 -7
  365. package/dist/lib/browser/store-ACBEYK4B.mjs +0 -30
  366. package/dist/lib/browser/store-ACBEYK4B.mjs.map +0 -7
  367. package/dist/lib/browser/worker.mjs +0 -77
  368. package/dist/lib/node-esm/app-graph-builder-FMHVHPWA.mjs +0 -139
  369. package/dist/lib/node-esm/app-graph-builder-FMHVHPWA.mjs.map +0 -7
  370. package/dist/lib/node-esm/chunk-CXT6CYPE.mjs +0 -468
  371. package/dist/lib/node-esm/chunk-CXT6CYPE.mjs.map +0 -7
  372. package/dist/lib/node-esm/chunk-KSPOOYT3.mjs +0 -1648
  373. package/dist/lib/node-esm/chunk-KSPOOYT3.mjs.map +0 -7
  374. package/dist/lib/node-esm/chunk-ZX63QUGE.mjs +0 -37
  375. package/dist/lib/node-esm/chunk-ZX63QUGE.mjs.map +0 -7
  376. package/dist/lib/node-esm/intent-dispatcher-SIYQ5ZIU.mjs +0 -12
  377. package/dist/lib/node-esm/intent-resolver-7FYJMXAG.mjs +0 -40
  378. package/dist/lib/node-esm/intent-resolver-7FYJMXAG.mjs.map +0 -7
  379. package/dist/lib/node-esm/store-6OBLTVXC.mjs +0 -31
  380. package/dist/lib/node-esm/store-6OBLTVXC.mjs.map +0 -7
  381. package/dist/lib/node-esm/worker.mjs +0 -78
  382. package/dist/types/src/common/collaboration.d.ts +0 -20
  383. package/dist/types/src/common/collaboration.d.ts.map +0 -1
  384. package/dist/types/src/common/events.d.ts +0 -52
  385. package/dist/types/src/common/events.d.ts.map +0 -1
  386. package/dist/types/src/common/file.d.ts +0 -14
  387. package/dist/types/src/common/file.d.ts.map +0 -1
  388. package/dist/types/src/common/graph.d.ts +0 -21
  389. package/dist/types/src/common/graph.d.ts.map +0 -1
  390. package/dist/types/src/common/layout.d.ts +0 -279
  391. package/dist/types/src/common/layout.d.ts.map +0 -1
  392. package/dist/types/src/common/surface.d.ts +0 -59
  393. package/dist/types/src/common/surface.d.ts.map +0 -1
  394. package/dist/types/src/components/App.d.ts +0 -10
  395. package/dist/types/src/components/App.d.ts.map +0 -1
  396. package/dist/types/src/components/App.stories.d.ts.map +0 -1
  397. package/dist/types/src/components/DefaultFallback.d.ts +0 -8
  398. package/dist/types/src/components/DefaultFallback.d.ts.map +0 -1
  399. package/dist/types/src/components/index.d.ts +0 -2
  400. package/dist/types/src/components/index.d.ts.map +0 -1
  401. package/dist/types/src/components/useApp.d.ts +0 -44
  402. package/dist/types/src/components/useApp.d.ts.map +0 -1
  403. package/dist/types/src/components/useLoading.d.ts.map +0 -1
  404. package/dist/types/src/core/capabilities.d.ts +0 -117
  405. package/dist/types/src/core/capabilities.d.ts.map +0 -1
  406. package/dist/types/src/core/capabilities.test.d.ts +0 -2
  407. package/dist/types/src/core/capabilities.test.d.ts.map +0 -1
  408. package/dist/types/src/core/events.d.ts.map +0 -1
  409. package/dist/types/src/core/manager.d.ts +0 -126
  410. package/dist/types/src/core/manager.d.ts.map +0 -1
  411. package/dist/types/src/core/manager.test.d.ts +0 -2
  412. package/dist/types/src/core/manager.test.d.ts.map +0 -1
  413. package/dist/types/src/playground/debug/Debug.d.ts +0 -6
  414. package/dist/types/src/playground/debug/Debug.d.ts.map +0 -1
  415. package/dist/types/src/playground/debug/index.d.ts +0 -2
  416. package/dist/types/src/playground/debug/index.d.ts.map +0 -1
  417. package/dist/types/src/playground/debug/plugin.d.ts +0 -2
  418. package/dist/types/src/playground/debug/plugin.d.ts.map +0 -1
  419. package/dist/types/src/playground/generator/Main.d.ts +0 -6
  420. package/dist/types/src/playground/generator/Main.d.ts.map +0 -1
  421. package/dist/types/src/playground/generator/Toolbar.d.ts +0 -6
  422. package/dist/types/src/playground/generator/Toolbar.d.ts.map +0 -1
  423. package/dist/types/src/playground/generator/generator.d.ts +0 -7
  424. package/dist/types/src/playground/generator/generator.d.ts.map +0 -1
  425. package/dist/types/src/playground/generator/index.d.ts +0 -3
  426. package/dist/types/src/playground/generator/index.d.ts.map +0 -1
  427. package/dist/types/src/playground/generator/plugin.d.ts +0 -2
  428. package/dist/types/src/playground/generator/plugin.d.ts.map +0 -1
  429. package/dist/types/src/playground/layout/Layout.d.ts +0 -8
  430. package/dist/types/src/playground/layout/Layout.d.ts.map +0 -1
  431. package/dist/types/src/playground/layout/index.d.ts +0 -2
  432. package/dist/types/src/playground/layout/index.d.ts.map +0 -1
  433. package/dist/types/src/playground/layout/plugin.d.ts +0 -2
  434. package/dist/types/src/playground/layout/plugin.d.ts.map +0 -1
  435. package/dist/types/src/playground/logger/Toolbar.d.ts +0 -6
  436. package/dist/types/src/playground/logger/Toolbar.d.ts.map +0 -1
  437. package/dist/types/src/playground/logger/index.d.ts +0 -2
  438. package/dist/types/src/playground/logger/index.d.ts.map +0 -1
  439. package/dist/types/src/playground/logger/plugin.d.ts +0 -2
  440. package/dist/types/src/playground/logger/plugin.d.ts.map +0 -1
  441. package/dist/types/src/playground/logger/schema.d.ts +0 -13
  442. package/dist/types/src/playground/logger/schema.d.ts.map +0 -1
  443. package/dist/types/src/playground/playground.stories.d.ts.map +0 -1
  444. package/dist/types/src/plugin-intent/IntentPlugin.d.ts +0 -2
  445. package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +0 -1
  446. package/dist/types/src/plugin-intent/actions.d.ts +0 -36
  447. package/dist/types/src/plugin-intent/actions.d.ts.map +0 -1
  448. package/dist/types/src/plugin-intent/errors.d.ts +0 -16
  449. package/dist/types/src/plugin-intent/errors.d.ts.map +0 -1
  450. package/dist/types/src/plugin-intent/index.d.ts +0 -6
  451. package/dist/types/src/plugin-intent/index.d.ts.map +0 -1
  452. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +0 -139
  453. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +0 -1
  454. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts +0 -2
  455. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts.map +0 -1
  456. package/dist/types/src/plugin-intent/intent.d.ts +0 -63
  457. package/dist/types/src/plugin-intent/intent.d.ts.map +0 -1
  458. package/dist/types/src/plugin-intent/meta.d.ts +0 -3
  459. package/dist/types/src/plugin-intent/meta.d.ts.map +0 -1
  460. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +0 -2
  461. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +0 -1
  462. package/dist/types/src/plugin-settings/actions.d.ts +0 -25
  463. package/dist/types/src/plugin-settings/actions.d.ts.map +0 -1
  464. package/dist/types/src/plugin-settings/app-graph-builder.d.ts +0 -4
  465. package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +0 -1
  466. package/dist/types/src/plugin-settings/index.d.ts +0 -3
  467. package/dist/types/src/plugin-settings/index.d.ts.map +0 -1
  468. package/dist/types/src/plugin-settings/intent-resolver.d.ts +0 -4
  469. package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +0 -1
  470. package/dist/types/src/plugin-settings/meta.d.ts +0 -3
  471. package/dist/types/src/plugin-settings/meta.d.ts.map +0 -1
  472. package/dist/types/src/plugin-settings/store.d.ts +0 -5
  473. package/dist/types/src/plugin-settings/store.d.ts.map +0 -1
  474. package/dist/types/src/plugin-settings/translations.d.ts +0 -11
  475. package/dist/types/src/plugin-settings/translations.d.ts.map +0 -1
  476. package/dist/types/src/react/ErrorBoundary.d.ts +0 -30
  477. package/dist/types/src/react/ErrorBoundary.d.ts.map +0 -1
  478. package/dist/types/src/react/IntentContext.d.ts +0 -8
  479. package/dist/types/src/react/IntentContext.d.ts.map +0 -1
  480. package/dist/types/src/react/PluginManagerProvider.d.ts +0 -10
  481. package/dist/types/src/react/PluginManagerProvider.d.ts.map +0 -1
  482. package/dist/types/src/react/Surface.d.ts +0 -12
  483. package/dist/types/src/react/Surface.d.ts.map +0 -1
  484. package/dist/types/src/react/Surface.stories.d.ts +0 -17
  485. package/dist/types/src/react/Surface.stories.d.ts.map +0 -1
  486. package/dist/types/src/react/common.d.ts +0 -13
  487. package/dist/types/src/react/common.d.ts.map +0 -1
  488. package/dist/types/src/react/index.d.ts +0 -7
  489. package/dist/types/src/react/index.d.ts.map +0 -1
  490. package/dist/types/src/react/useCapabilities.d.ts +0 -13
  491. package/dist/types/src/react/useCapabilities.d.ts.map +0 -1
  492. package/dist/types/src/react/useIntentResolver.d.ts +0 -3
  493. package/dist/types/src/react/useIntentResolver.d.ts.map +0 -1
  494. package/dist/types/src/worker.d.ts +0 -4
  495. package/dist/types/src/worker.d.ts.map +0 -1
  496. package/src/common/collaboration.ts +0 -18
  497. package/src/common/events.ts +0 -79
  498. package/src/common/file.ts +0 -22
  499. package/src/common/graph.ts +0 -30
  500. package/src/common/layout.ts +0 -277
  501. package/src/common/surface.ts +0 -83
  502. package/src/components/App.stories.tsx +0 -33
  503. package/src/components/App.tsx +0 -59
  504. package/src/components/DefaultFallback.tsx +0 -26
  505. package/src/components/useApp.tsx +0 -164
  506. package/src/core/capabilities.test.ts +0 -136
  507. package/src/core/capabilities.ts +0 -259
  508. package/src/core/manager.test.ts +0 -516
  509. package/src/core/manager.ts +0 -604
  510. package/src/playground/debug/Debug.tsx +0 -39
  511. package/src/playground/debug/plugin.ts +0 -16
  512. package/src/playground/generator/Main.tsx +0 -71
  513. package/src/playground/generator/Toolbar.tsx +0 -47
  514. package/src/playground/generator/generator.ts +0 -48
  515. package/src/playground/generator/index.ts +0 -6
  516. package/src/playground/generator/plugin.ts +0 -22
  517. package/src/playground/layout/Layout.tsx +0 -33
  518. package/src/playground/layout/index.ts +0 -5
  519. package/src/playground/layout/plugin.ts +0 -18
  520. package/src/playground/logger/Toolbar.tsx +0 -30
  521. package/src/playground/logger/plugin.ts +0 -41
  522. package/src/playground/logger/schema.ts +0 -12
  523. package/src/playground/playground.stories.tsx +0 -46
  524. package/src/plugin-intent/IntentPlugin.ts +0 -20
  525. package/src/plugin-intent/actions.ts +0 -31
  526. package/src/plugin-intent/errors.ts +0 -40
  527. package/src/plugin-intent/index.ts +0 -9
  528. package/src/plugin-intent/intent-dispatcher.test.ts +0 -286
  529. package/src/plugin-intent/intent-dispatcher.ts +0 -337
  530. package/src/plugin-intent/intent.ts +0 -154
  531. package/src/plugin-intent/meta.ts +0 -10
  532. package/src/plugin-settings/SettingsPlugin.ts +0 -34
  533. package/src/plugin-settings/actions.ts +0 -25
  534. package/src/plugin-settings/app-graph-builder.ts +0 -160
  535. package/src/plugin-settings/index.ts +0 -6
  536. package/src/plugin-settings/intent-resolver.ts +0 -35
  537. package/src/plugin-settings/meta.ts +0 -10
  538. package/src/plugin-settings/store.ts +0 -33
  539. package/src/plugin-settings/translations.ts +0 -19
  540. package/src/react/ErrorBoundary.tsx +0 -56
  541. package/src/react/IntentContext.tsx +0 -35
  542. package/src/react/Surface.stories.tsx +0 -101
  543. package/src/react/Surface.tsx +0 -86
  544. package/src/react/common.ts +0 -13
  545. package/src/react/index.ts +0 -10
  546. package/src/react/useCapabilities.ts +0 -31
  547. package/src/react/useIntentResolver.ts +0 -22
  548. package/src/worker.ts +0 -11
  549. /package/dist/lib/browser/{intent-dispatcher-6SHA5B3N.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  550. /package/dist/lib/browser/{worker.mjs.map → chunk-RFSO3JRG.mjs.map} +0 -0
  551. /package/dist/lib/{node-esm/intent-dispatcher-SIYQ5ZIU.mjs.map → browser/common/activation-events.mjs.map} +0 -0
  552. /package/dist/lib/{node-esm/worker.mjs.map → browser/common/capabilities.mjs.map} +0 -0
@@ -0,0 +1,117 @@
1
+ /*
2
+ * Boot loader stylesheet — injected into the host's `<head>` by `bootLoaderPlugin`.
3
+ * The keyframe animation runs on the browser's compositor thread, so the bar
4
+ * keeps moving even while the JS main thread is busy parsing modules.
5
+ */
6
+
7
+ /*
8
+ * Defaults match `@dxos/ui-theme`'s `--color-base-surface`, which resolves to
9
+ * Tailwind's `neutral-50` / `neutral-950` in light / dark mode respectively
10
+ * (see `packages/ui/ui-theme/src/css/theme/semantic.css`). Hosts can override
11
+ * with the `--boot-loader-bg-*` / `--boot-loader-fg-*` custom properties on
12
+ * `:root` if they need a different palette. Keeping the boot loader's
13
+ * background identical to the app's `body` eliminates the flash on handoff
14
+ * to React's `<Placeholder>`.
15
+ */
16
+ #boot-loader {
17
+ position: fixed;
18
+ inset: 0;
19
+ z-index: 2147483647;
20
+ display: flex;
21
+ flex-direction: column;
22
+ align-items: center;
23
+ justify-content: center;
24
+ gap: 16px;
25
+ background: var(--boot-loader-bg-light, #fafafa);
26
+ color: var(--boot-loader-fg-light, #0a0a0a);
27
+ font-family:
28
+ ui-sans-serif,
29
+ system-ui,
30
+ -apple-system,
31
+ BlinkMacSystemFont,
32
+ 'Segoe UI',
33
+ sans-serif;
34
+ font-size: 13px;
35
+ }
36
+
37
+ @media (prefers-color-scheme: dark) {
38
+ #boot-loader {
39
+ background: var(--boot-loader-bg-dark, #0a0a0a);
40
+ color: var(--boot-loader-fg-dark, #fafafa);
41
+ }
42
+ }
43
+
44
+ #boot-loader-mark {
45
+ width: 56px;
46
+ height: 56px;
47
+ display: flex;
48
+ align-items: center;
49
+ justify-content: center;
50
+ opacity: 0.1;
51
+ }
52
+
53
+ #boot-loader-mark svg {
54
+ width: 100%;
55
+ height: 100%;
56
+ /* `fill="currentColor"` on the host SVG inherits the loader's text colour. */
57
+ }
58
+
59
+ #boot-loader-bar {
60
+ position: relative;
61
+ width: min(240px, 50vw);
62
+ height: 2px;
63
+ overflow: hidden;
64
+ background: rgba(127, 127, 127, 0.18);
65
+ border-radius: 1px;
66
+ }
67
+
68
+ #boot-loader-bar::before {
69
+ content: '';
70
+ position: absolute;
71
+ inset: 0;
72
+ width: 40%;
73
+ background: currentcolor;
74
+ opacity: 0.7;
75
+ border-radius: 1px;
76
+ animation: boot-loader-bar 1.4s ease-in-out infinite;
77
+ }
78
+
79
+ @keyframes boot-loader-bar {
80
+ 0% {
81
+ transform: translateX(-100%);
82
+ }
83
+ 100% {
84
+ transform: translateX(250%);
85
+ }
86
+ }
87
+
88
+ /*
89
+ * Determinate state — host called `window.__bootLoader.progress(fraction)`.
90
+ * Cancel the slide animation and pin the fill to whatever percentage the
91
+ * driver wrote into `--boot-loader-bar-progress` (0–100). The transition on
92
+ * `width` smooths the transitions between counter ticks so the fill grows
93
+ * continuously rather than snapping.
94
+ */
95
+ #boot-loader-bar[data-determinate]::before {
96
+ width: calc(var(--boot-loader-bar-progress, 0) * 1%);
97
+ animation: none;
98
+ transform: none;
99
+ transition: width 240ms ease-out;
100
+ }
101
+
102
+ #boot-loader-status {
103
+ opacity: 0.7;
104
+ /*
105
+ * Pin both `line-height` and `height` so the status box stays exactly the
106
+ * same size regardless of which phase string is currently displayed. With
107
+ * only `min-height: 1em`, the browser's `line-height: normal` resolved to
108
+ * slightly different rendered heights as the text changed, which reflowed
109
+ * the flex column and bumped the progress bar a few pixels each time.
110
+ * `white-space: nowrap` makes sure long phase strings ("Loading
111
+ * framework…") never wrap to a second line.
112
+ */
113
+ height: 1.5em;
114
+ line-height: 1.5;
115
+ letter-spacing: 0.01em;
116
+ white-space: nowrap;
117
+ }
@@ -0,0 +1,55 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ // Inline driver script — injected into the host's `<body>` by `bootLoaderPlugin`.
6
+ // Runs before the module bundle is fetched, so the host can observe `boot:html-parsed`
7
+ // and update the visible status from `main.tsx` between phases.
8
+ //
9
+ // `window.__bootLoader.status(text)` updates the visible status line.
10
+ // `window.__bootLoader.dismiss()` removes the loader DOM. Once the loader is
11
+ // gone, both calls become no-ops.
12
+ //
13
+ // Kept ES5-flavoured so the bundler never has to touch it.
14
+
15
+ performance.mark('boot:html-parsed');
16
+
17
+ window.__bootLoader = {
18
+ status: function (text) {
19
+ var element = document.getElementById('boot-loader-status');
20
+ if (element) {
21
+ element.textContent = text;
22
+ }
23
+ },
24
+ /**
25
+ * Switch the progress bar from the default indeterminate slide animation
26
+ * to a determinate fill at `fraction` ∈ [0, 1]. Calling this once flips the
27
+ * `[data-determinate]` flag; subsequent calls just update the percentage.
28
+ * Pass a value < 0 (or omit) to revert to indeterminate.
29
+ */
30
+ progress: function (fraction) {
31
+ var element = document.getElementById('boot-loader-bar');
32
+ if (!element) {
33
+ return;
34
+ }
35
+ // `Number.isFinite` rejects NaN and Infinity; without this guard
36
+ // `NaN < 0` is false, so NaN slips past and ends up in
37
+ // `--boot-loader-bar-progress`, which CSS treats as invalid and silently
38
+ // resets the bar to the var() default (0%) — surprising visual snap if a
39
+ // caller ever passes `0/0` or a parsed-but-invalid value.
40
+ if (typeof fraction !== 'number' || !isFinite(fraction) || fraction < 0) {
41
+ element.removeAttribute('data-determinate');
42
+ element.style.removeProperty('--boot-loader-bar-progress');
43
+ return;
44
+ }
45
+ var clamped = Math.max(0, Math.min(1, fraction));
46
+ element.setAttribute('data-determinate', '');
47
+ element.style.setProperty('--boot-loader-bar-progress', String(clamped * 100));
48
+ },
49
+ dismiss: function () {
50
+ var element = document.getElementById('boot-loader');
51
+ if (element && element.parentNode) {
52
+ element.parentNode.removeChild(element);
53
+ }
54
+ },
55
+ };
@@ -0,0 +1,99 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { type Plugin } from 'vite';
6
+
7
+ import css from './boot-loader.css?raw';
8
+ import driverScript from './boot-loader.js?raw';
9
+
10
+ /**
11
+ * Options for {@link bootLoaderPlugin}.
12
+ */
13
+ export type BootLoaderOptions = {
14
+ /**
15
+ * Initial status text rendered by the loader (replaced via
16
+ * `window.__bootLoader.status(...)` once the host starts firing phase callbacks).
17
+ *
18
+ * @default "Loading…"
19
+ */
20
+ status?: string;
21
+
22
+ /**
23
+ * Inline SVG markup for an optional brand mark rendered above the progress bar.
24
+ * Use `currentColor` for fill so the mark inherits the loader's text colour
25
+ * (which itself follows `prefers-color-scheme`). Leave empty/undefined to
26
+ * render only the bar.
27
+ */
28
+ markSvg?: string;
29
+ };
30
+
31
+ /**
32
+ * Vite plugin that injects a tiny native-DOM "boot loader" into the host app's
33
+ * `index.html`.
34
+ *
35
+ * The loader paints on the very first frame, before any JS bundle is fetched —
36
+ * so the user sees something immediately on cold load instead of staring at a
37
+ * blank document while the compiled module graph is parsed. The CSS-only
38
+ * keyframe animation runs on the browser's compositor thread, so it keeps
39
+ * moving even while the JS main thread is fully busy.
40
+ *
41
+ * The host app drives the loader from `main.tsx`:
42
+ *
43
+ * - `window.__bootLoader.status(text)` updates the status line per phase.
44
+ * - `window.__bootLoader.dismiss()` removes the loader once React has mounted.
45
+ *
46
+ * Inject order:
47
+ * - `<style>` → `<head>` (parses before any bundled stylesheet).
48
+ * - `<div id="boot-loader">…</div>` → start of `<body>` (sibling of `#root`).
49
+ * - inline `<script>` defining `window.__bootLoader` → start of `<body>`.
50
+ *
51
+ * Keeping the loader as a sibling of `#root` (rather than a child of it) means
52
+ * `createRoot(document.getElementById('root')).render(...)` does not fight the
53
+ * loader for ownership; the host explicitly calls `dismiss()` after the first
54
+ * React commit, which gives a deterministic handoff.
55
+ *
56
+ * Color tokens are exposed as CSS custom properties (`--boot-loader-bg-light`,
57
+ * `--boot-loader-bg-dark`, etc.) defined in `boot-loader.css`, so consumers can
58
+ * override them at the document level without us re-parameterizing this plugin.
59
+ */
60
+ export const bootLoaderPlugin = ({ status = 'Loading…', markSvg }: BootLoaderOptions = {}): Plugin => {
61
+ return {
62
+ name: 'app-framework:boot-loader',
63
+ transformIndexHtml() {
64
+ // The mark slot uses `children: <raw-svg>` (vite emits string children as
65
+ // raw HTML, not text-escaped) so the host can pass an SVG file's contents
66
+ // straight through. Falls back to a single-line empty `<div>` so the
67
+ // skeleton DOM stays predictable for the smoke-test selector.
68
+ const markChildren = markSvg ? [{ tag: 'div', attrs: { id: 'boot-loader-mark' }, children: markSvg }] : [];
69
+
70
+ return [
71
+ {
72
+ tag: 'style',
73
+ injectTo: 'head',
74
+ children: css,
75
+ },
76
+ {
77
+ tag: 'div',
78
+ injectTo: 'body-prepend',
79
+ attrs: {
80
+ id: 'boot-loader',
81
+ role: 'status',
82
+ 'aria-live': 'polite',
83
+ 'aria-label': 'Initializing',
84
+ },
85
+ children: [
86
+ ...markChildren,
87
+ { tag: 'div', attrs: { id: 'boot-loader-bar' }, children: '' },
88
+ { tag: 'div', attrs: { id: 'boot-loader-status' }, children: status },
89
+ ],
90
+ },
91
+ {
92
+ tag: 'script',
93
+ injectTo: 'body-prepend',
94
+ children: driverScript,
95
+ },
96
+ ];
97
+ },
98
+ };
99
+ };
@@ -0,0 +1,284 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { type Plugin as VitePlugin } from 'vite';
6
+ import cssInjectedByJs from 'vite-plugin-css-injected-by-js';
7
+
8
+ import { type Plugin } from '../../core';
9
+ import { MANIFEST_ASSET_NAME, serializeManifest } from '../manifest';
10
+ import { DEFAULT_PACKAGES, isSharedPackage } from '../packages';
11
+
12
+ export { MANIFEST_ASSET_NAME, serializeManifest };
13
+
14
+ const JSX_DEV_RUNTIME = 'react/jsx-dev-runtime';
15
+
16
+ const DEFAULT_MODULE_FILE = 'plugin.mjs';
17
+
18
+ /**
19
+ * Whether an import should be externalized by the plugin bundle.
20
+ * Uses the shared-package predicate directly so plugins automatically pick up any
21
+ * new `@dxos/*` (non-plugin) package the host provides, without a code change here.
22
+ */
23
+ const isExternal = (id: string) => id !== JSX_DEV_RUNTIME && isSharedPackage(id);
24
+
25
+ /**
26
+ * Banner injected at the top of every plugin bundle.
27
+ *
28
+ * Why: rolldown emits ESM `import` for externalized deps, but when a *bundled* module
29
+ * is CJS and contains `require('react')` (or any other external), rolldown keeps the
30
+ * `require(...)` call in the output and relies on a runtime `require` function. The
31
+ * browser doesn't have `require`, so rolldown's fallback shim throws:
32
+ * `Calling `require` for "react" in an environment that doesn't expose the `require`
33
+ * function`.
34
+ *
35
+ * The full dependency graphs of non-trivial plugins unavoidably drag in CJS-only
36
+ * helpers (`use-sync-external-store` via xstate / zustand / preact-signals / … ),
37
+ * and waiting for every one of those packages to ship ESM isn't realistic. Instead
38
+ * we install a tiny module-local `require` at the top of the bundle that looks up
39
+ * a handful of well-known host-provided modules by name and returns their already
40
+ * ESM-imported namespaces. Rolldown's own shim honours an existing `require`
41
+ * before falling through to the throw path, so this entirely removes the runtime
42
+ * error without changing how externalization itself works.
43
+ *
44
+ * Keep the list aligned with the externals that CJS code actually reaches for;
45
+ * adding entries here is safe (unused imports get tree-shaken), but the list is
46
+ * deliberately small to keep the banner noise-free.
47
+ */
48
+ const REQUIRE_SHIM_BANNER = [
49
+ '// --- composer-plugin: CJS require shim ---',
50
+ '// See @dxos/app-framework/vite-plugin/composer-plugin.ts for rationale.',
51
+ "import * as __composerReact from 'react';",
52
+ "import * as __composerReactDom from 'react-dom';",
53
+ "import * as __composerReactJsxRuntime from 'react/jsx-runtime';",
54
+ 'const __composerRequireShim = new Map([',
55
+ " ['react', __composerReact.default ?? __composerReact],",
56
+ " ['react-dom', __composerReactDom.default ?? __composerReactDom],",
57
+ " ['react/jsx-runtime', __composerReactJsxRuntime],",
58
+ ']);',
59
+ "// Module-local binding: rolldown's CJS fallback does a `typeof require` check",
60
+ '// and uses whichever `require` is in lexical scope. Declaring this as `const`',
61
+ "// (instead of `globalThis.require ??=`) keeps each bundle's shim isolated from",
62
+ '// the host page and from other plugins sharing the window.',
63
+ 'const require = (id) => {',
64
+ ' if (__composerRequireShim.has(id)) return __composerRequireShim.get(id);',
65
+ " throw new Error('composer-plugin: unsupported CJS require at runtime: ' + id);",
66
+ '};',
67
+ '// --- end CJS require shim ---',
68
+ ].join('\n');
69
+
70
+ export type ComposerPluginOptions = {
71
+ /** Entry point for the plugin bundle. Defaults to `src/plugin.tsx`. */
72
+ entry?: string;
73
+ /** Dev server port. Defaults to `3967`. */
74
+ port?: number;
75
+ /**
76
+ * Plugin metadata. When provided, a `manifest.json` asset is emitted alongside the bundle
77
+ * so the output directory can be uploaded directly as a GitHub Release and picked up by
78
+ * the DXOS community registry.
79
+ */
80
+ meta?: Plugin.Meta;
81
+ /** Filename of the built module asset that the registry will load. Defaults to `plugin.mjs`. */
82
+ moduleFile?: string;
83
+ };
84
+
85
+ /**
86
+ * Vite plugin for **external Composer plugin projects**. Configures the build to produce
87
+ * an ESM bundle that externalizes all framework dependencies, which the Composer host app
88
+ * provides at runtime via import map.
89
+ *
90
+ * Handles:
91
+ * 1. Build config — lib mode entry point, ES format output, rollup externals.
92
+ * 2. Dev externalization — marks shared deps as external during `vite serve` and strips
93
+ * the `/@id/` prefix that Vite's import analysis adds to external bare specifiers.
94
+ * 3. JSX dev runtime shim — bridges `react/jsx-dev-runtime` (used by React refresh in dev)
95
+ * to `react/jsx-runtime` (which is what the externalized React provides).
96
+ * 4. Optional manifest emit — when `meta` is supplied, writes `manifest.json` next to the
97
+ * bundled module so a GitHub Release can carry both artifacts.
98
+ */
99
+ export const composerPlugin = (options?: ComposerPluginOptions): VitePlugin[] => {
100
+ const entry = options?.entry ?? 'src/plugin.tsx';
101
+ const port = options?.port ?? 3967;
102
+ const moduleFile = options?.moduleFile ?? DEFAULT_MODULE_FILE;
103
+ const meta = options?.meta;
104
+ const resolved = new Set<string>();
105
+ let base = '/';
106
+
107
+ const plugins: VitePlugin[] = [
108
+ // Inline every imported stylesheet into the bundled module. Each community plugin
109
+ // is distributed as a single GitHub Release asset (per {@link moduleFile}); a sibling
110
+ // `.css` file would silently be dropped at runtime because Composer only fetches the
111
+ // module URL the registry advertises.
112
+ // TODO(wittjosiah): Once the registry supports multi-asset releases, move CSS (and
113
+ // fonts/images/wasm) back to sibling assets so plugins don't ship stylesheets inside
114
+ // their JS bundle.
115
+ ...cssInjectedByJs(),
116
+
117
+ // Configure vite for library-mode builds with externalized deps.
118
+ {
119
+ name: 'composer-plugin',
120
+ config: () => ({
121
+ server: {
122
+ port,
123
+ // Allow the Composer host (different origin) to dynamically import plugin modules.
124
+ cors: true,
125
+ },
126
+ preview: { port },
127
+ build: {
128
+ sourcemap: true,
129
+ // Transitively-bundled WASM modules (automerge, tiktoken, …) emit top-level
130
+ // await; `esnext` lets rolldown pass that through without an explicit polyfill.
131
+ target: 'esnext',
132
+ lib: {
133
+ entry,
134
+ formats: ['es'],
135
+ fileName: () => moduleFile,
136
+ },
137
+ // Inline every asset as a data URL. GitHub Releases sign each asset with a
138
+ // per-file URL, so sibling-file imports from the plugin module can't resolve.
139
+ // TODO(wittjosiah): Drop once the registry can serve multi-asset releases and
140
+ // plugins can ship fonts/images/wasm as siblings of plugin.mjs.
141
+ assetsInlineLimit: () => true,
142
+ rolldownOptions: {
143
+ external: (id: string) => isExternal(id),
144
+ output: {
145
+ // Produce a single bundle per plugin for GitHub Release distribution.
146
+ // TODO(wittjosiah): Drop once the registry can serve multi-asset releases.
147
+ inlineDynamicImports: true,
148
+ // Install the CJS require shim at the top of plugin.mjs so transitively
149
+ // bundled CJS helpers (that call `require('react')` et al. at runtime) can
150
+ // resolve against the host-provided externals instead of throwing.
151
+ banner: REQUIRE_SHIM_BANNER,
152
+ },
153
+ },
154
+ },
155
+ }),
156
+ },
157
+
158
+ // Dev-time externalization.
159
+ // Vite's dev server doesn't use rollup externals, so we need to handle it manually.
160
+ // We intercept imports of shared deps at resolve time, mark them external, and then
161
+ // strip the `/@id/` prefix that Vite's import analysis injects for external modules.
162
+ {
163
+ name: 'composer-plugin:externalize',
164
+ enforce: 'pre',
165
+ apply: 'serve',
166
+ // Exclude shared packages from Vite's dependency pre-bundling.
167
+ config: () => ({
168
+ optimizeDeps: {
169
+ exclude: DEFAULT_PACKAGES,
170
+ },
171
+ }),
172
+ // Mark shared deps as external so Vite doesn't try to bundle them.
173
+ resolveId: (id) => {
174
+ if (isExternal(id)) {
175
+ resolved.add(id);
176
+ return { id, external: true };
177
+ }
178
+ },
179
+ // Return a stub for any externalized module that Vite tries to load directly.
180
+ load: (id) => {
181
+ if (resolved.has(id)) {
182
+ return { code: 'export default {};' };
183
+ }
184
+ },
185
+ // After all plugins are resolved, inject a late-stage transform plugin that strips
186
+ // the `/@id/` prefix from externalized bare specifiers in the output.
187
+ // This must run after Vite's internal import analysis which rewrites bare specifiers.
188
+ configResolved: (config) => {
189
+ base = config.base ?? '/';
190
+ (config.plugins as VitePlugin[]).push({
191
+ name: 'composer-plugin:strip-prefix',
192
+ transform: (code: string) => {
193
+ if (resolved.size === 0) {
194
+ return;
195
+ }
196
+ const escaped = [...resolved].map((s) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|');
197
+ const pattern = new RegExp(`${base}@id/(${escaped})`, 'g');
198
+ if (pattern.test(code)) {
199
+ return code.replace(pattern, (_: string, dep: string) => dep);
200
+ }
201
+ },
202
+ });
203
+ },
204
+ },
205
+
206
+ // JSX dev runtime shim.
207
+ // React refresh (used by @vitejs/plugin-react) imports from `react/jsx-dev-runtime`,
208
+ // but the externalized React only exposes `react/jsx-runtime`. This virtual module
209
+ // bridges the gap by re-exporting jsx-runtime's functions under jsx-dev-runtime's API.
210
+ {
211
+ name: 'composer-plugin:jsx-dev-shim',
212
+ enforce: 'pre',
213
+ apply: 'serve',
214
+ resolveId: (id) => (id === JSX_DEV_RUNTIME ? `\0${JSX_DEV_RUNTIME}` : undefined),
215
+ load: (id) =>
216
+ id === `\0${JSX_DEV_RUNTIME}`
217
+ ? [
218
+ 'import { jsx, jsxs, Fragment } from "react/jsx-runtime";',
219
+ 'export { Fragment };',
220
+ 'export function jsxDEV(type, props, key, isStaticChildren) {',
221
+ ' return isStaticChildren ? jsxs(type, props, key) : jsx(type, props, key);',
222
+ '}',
223
+ ].join('\n')
224
+ : undefined,
225
+ },
226
+
227
+ // React Refresh preamble stub.
228
+ //
229
+ // @vitejs/plugin-react's JSX transform prepends a runtime check to every module:
230
+ // if (!window.$RefreshReg$) throw new Error("@vitejs/plugin-react can't detect preamble…");
231
+ // In a normal single-origin app, vite injects a `<script type="module">` preamble
232
+ // into `index.html` that sets up `$RefreshReg$` / `$RefreshSig$` on `window` before any
233
+ // app code runs. When a community plugin is dev-served at its own origin and then
234
+ // dynamic-imported into the Composer host at a different origin, the host's window
235
+ // never receives that preamble, so every JSX module throws on first import.
236
+ //
237
+ // Inject a no-op refresh shim on the host's window from the plugin's entrypoint: fast-
238
+ // refresh itself doesn't work cross-origin anyway, so silencing the check lets the
239
+ // plugin load and ordinary page reloads take care of picking up edits. Production
240
+ // builds are untouched (`apply: 'serve'`).
241
+ {
242
+ name: 'composer-plugin:react-refresh-shim',
243
+ enforce: 'pre',
244
+ apply: 'serve',
245
+ transform(code, id) {
246
+ // Only patch the plugin entrypoint (an absolute path ending in the configured entry).
247
+ // Matching by suffix keeps us from prepending the shim to every transformed module,
248
+ // which would both bloat the output and defeat vite's caching.
249
+ if (!id.endsWith(entry.replace(/^\.?\//, '/'))) {
250
+ return;
251
+ }
252
+ const shim = [
253
+ '// composer-plugin: no-op React Refresh shim so cross-origin plugin modules',
254
+ "// don't throw the @vitejs/plugin-react preamble check at dynamic-import time.",
255
+ 'if (typeof window !== "undefined") {',
256
+ ' window.$RefreshReg$ = window.$RefreshReg$ || (() => {});',
257
+ ' window.$RefreshSig$ = window.$RefreshSig$ || (() => (type) => type);',
258
+ ' window.__vite_plugin_react_preamble_installed__ = true;',
259
+ '}',
260
+ '',
261
+ ].join('\n');
262
+ return { code: shim + code, map: null };
263
+ },
264
+ },
265
+ ];
266
+
267
+ if (meta) {
268
+ // Emit `manifest.json` alongside the built module so the dist output can be uploaded as-is
269
+ // to a GitHub Release for the DXOS community registry to pick up.
270
+ plugins.push({
271
+ name: 'composer-plugin:emit-manifest',
272
+ apply: 'build',
273
+ generateBundle() {
274
+ this.emitFile({
275
+ type: 'asset',
276
+ fileName: MANIFEST_ASSET_NAME,
277
+ source: serializeManifest(meta, { moduleFile }),
278
+ });
279
+ },
280
+ });
281
+ }
282
+
283
+ return plugins;
284
+ };