@dxos/app-framework 0.8.4-main.a4bbb77 → 0.8.4-main.abd8ff62ef

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 (571) hide show
  1. package/.storybook/main.mts +2 -4
  2. package/.storybook/preview.mts +2 -2
  3. package/dist/lib/browser/capability-Q5XRXRD2.mjs +38 -0
  4. package/dist/lib/browser/capability-Q5XRXRD2.mjs.map +7 -0
  5. package/dist/lib/browser/capability-V7LR4LQN.mjs +35 -0
  6. package/dist/lib/browser/capability-V7LR4LQN.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-23D4SJUE.mjs +42 -0
  8. package/dist/lib/browser/chunk-23D4SJUE.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-3JWJXGLK.mjs +79 -0
  10. package/dist/lib/browser/chunk-3JWJXGLK.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-3ZS2A3DN.mjs +907 -0
  12. package/dist/lib/browser/chunk-3ZS2A3DN.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-45CHLTBV.mjs +34 -0
  14. package/dist/lib/browser/chunk-45CHLTBV.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-5LAIGWLU.mjs +467 -0
  16. package/dist/lib/browser/chunk-5LAIGWLU.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-66IXTIVK.mjs +48 -0
  18. package/dist/lib/browser/chunk-66IXTIVK.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-FJ4765WW.mjs +8 -0
  20. package/dist/lib/browser/chunk-FJ4765WW.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-G7SDBRKH.mjs +1 -0
  22. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  23. package/dist/lib/browser/chunk-JXCBZSBJ.mjs +372 -0
  24. package/dist/lib/browser/chunk-JXCBZSBJ.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-MX5DKEJH.mjs +584 -0
  26. package/dist/lib/browser/chunk-MX5DKEJH.mjs.map +7 -0
  27. package/dist/lib/browser/chunk-WBHCSOBW.mjs +80 -0
  28. package/dist/lib/browser/chunk-WBHCSOBW.mjs.map +7 -0
  29. package/dist/lib/browser/chunk-Z55LVAGN.mjs +213 -0
  30. package/dist/lib/browser/chunk-Z55LVAGN.mjs.map +7 -0
  31. package/dist/lib/browser/chunk-ZGJAZSNE.mjs +142 -0
  32. package/dist/lib/browser/chunk-ZGJAZSNE.mjs.map +7 -0
  33. package/dist/lib/browser/cli/index.mjs +74 -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 +17 -0
  42. package/dist/lib/browser/core/plugin-manager.mjs.map +7 -0
  43. package/dist/lib/browser/core/plugin.mjs +37 -0
  44. package/dist/lib/browser/core/plugin.mjs.map +7 -0
  45. package/dist/lib/browser/core/url-loader.mjs +20 -0
  46. package/dist/lib/browser/core/url-loader.mjs.map +7 -0
  47. package/dist/lib/browser/index.mjs +95 -148
  48. package/dist/lib/browser/index.mjs.map +4 -4
  49. package/dist/lib/browser/invoker-capability-LNX4CGIV.mjs +44 -0
  50. package/dist/lib/browser/invoker-capability-LNX4CGIV.mjs.map +7 -0
  51. package/dist/lib/browser/meta.json +1 -1
  52. package/dist/lib/browser/testing/index.mjs +227 -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 +48 -0
  57. package/dist/lib/browser/ui/index.mjs.map +7 -0
  58. package/dist/lib/node-esm/capability-EW5GJCI6.mjs +39 -0
  59. package/dist/lib/node-esm/capability-EW5GJCI6.mjs.map +7 -0
  60. package/dist/lib/node-esm/capability-YKBMMD53.mjs +36 -0
  61. package/dist/lib/node-esm/capability-YKBMMD53.mjs.map +7 -0
  62. package/dist/lib/node-esm/chunk-37Z53PXZ.mjs +10 -0
  63. package/dist/lib/node-esm/chunk-37Z53PXZ.mjs.map +7 -0
  64. package/dist/lib/node-esm/chunk-6XW6LET6.mjs +35 -0
  65. package/dist/lib/node-esm/chunk-6XW6LET6.mjs.map +7 -0
  66. package/dist/lib/node-esm/chunk-D347W3KO.mjs +143 -0
  67. package/dist/lib/node-esm/chunk-D347W3KO.mjs.map +7 -0
  68. package/dist/lib/node-esm/chunk-D5PO2WXX.mjs +373 -0
  69. package/dist/lib/node-esm/chunk-D5PO2WXX.mjs.map +7 -0
  70. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  71. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  72. package/dist/lib/node-esm/chunk-HTBJU5FX.mjs +214 -0
  73. package/dist/lib/node-esm/chunk-HTBJU5FX.mjs.map +7 -0
  74. package/dist/lib/node-esm/chunk-KM2F6GH6.mjs +468 -0
  75. package/dist/lib/node-esm/chunk-KM2F6GH6.mjs.map +7 -0
  76. package/dist/lib/node-esm/chunk-OZ7DZA5Z.mjs +2 -0
  77. package/dist/lib/node-esm/chunk-OZ7DZA5Z.mjs.map +7 -0
  78. package/dist/lib/node-esm/chunk-Q7XBFII4.mjs +908 -0
  79. package/dist/lib/node-esm/chunk-Q7XBFII4.mjs.map +7 -0
  80. package/dist/lib/node-esm/chunk-SBS2YMPT.mjs +43 -0
  81. package/dist/lib/node-esm/chunk-SBS2YMPT.mjs.map +7 -0
  82. package/dist/lib/node-esm/chunk-SDJ4B2LU.mjs +80 -0
  83. package/dist/lib/node-esm/chunk-SDJ4B2LU.mjs.map +7 -0
  84. package/dist/lib/node-esm/chunk-WFSRZKBP.mjs +81 -0
  85. package/dist/lib/node-esm/chunk-WFSRZKBP.mjs.map +7 -0
  86. package/dist/lib/node-esm/chunk-WKTLE7MG.mjs +585 -0
  87. package/dist/lib/node-esm/chunk-WKTLE7MG.mjs.map +7 -0
  88. package/dist/lib/node-esm/chunk-XOCUANHO.mjs +49 -0
  89. package/dist/lib/node-esm/chunk-XOCUANHO.mjs.map +7 -0
  90. package/dist/lib/node-esm/cli/index.mjs +75 -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 +18 -0
  101. package/dist/lib/node-esm/core/plugin-manager.mjs.map +7 -0
  102. package/dist/lib/node-esm/core/plugin.mjs +38 -0
  103. package/dist/lib/node-esm/core/plugin.mjs.map +7 -0
  104. package/dist/lib/node-esm/core/url-loader.mjs +21 -0
  105. package/dist/lib/node-esm/core/url-loader.mjs.map +7 -0
  106. package/dist/lib/node-esm/index.mjs +95 -148
  107. package/dist/lib/node-esm/index.mjs.map +4 -4
  108. package/dist/lib/node-esm/invoker-capability-O4T5PHLA.mjs +45 -0
  109. package/dist/lib/node-esm/invoker-capability-O4T5PHLA.mjs.map +7 -0
  110. package/dist/lib/node-esm/meta.json +1 -1
  111. package/dist/lib/node-esm/testing/index.mjs +227 -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 +49 -0
  116. package/dist/lib/node-esm/ui/index.mjs.map +7 -0
  117. package/dist/plugin/node-esm/index.mjs +832 -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 +110 -197
  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 +8 -8
  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} +11 -11
  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 +8 -4
  145. package/dist/types/src/core/index.d.ts.map +1 -1
  146. package/dist/types/src/core/plugin-asset-cache.d.ts +71 -0
  147. package/dist/types/src/core/plugin-asset-cache.d.ts.map +1 -0
  148. package/dist/types/src/core/plugin-manager.d.ts +122 -0
  149. package/dist/types/src/core/plugin-manager.d.ts.map +1 -0
  150. package/dist/types/src/core/plugin-manager.test.d.ts +2 -0
  151. package/dist/types/src/core/plugin-manager.test.d.ts.map +1 -0
  152. package/dist/types/src/core/plugin-manifest.d.ts +76 -0
  153. package/dist/types/src/core/plugin-manifest.d.ts.map +1 -0
  154. package/dist/types/src/core/plugin-manifest.test.d.ts +2 -0
  155. package/dist/types/src/core/plugin-manifest.test.d.ts.map +1 -0
  156. package/dist/types/src/core/plugin.d.ts +207 -39
  157. package/dist/types/src/core/plugin.d.ts.map +1 -1
  158. package/dist/types/src/core/url-loader.d.ts +112 -0
  159. package/dist/types/src/core/url-loader.d.ts.map +1 -0
  160. package/dist/types/src/core/url-loader.test.d.ts +2 -0
  161. package/dist/types/src/core/url-loader.test.d.ts.map +1 -0
  162. package/dist/types/src/helpers.d.ts.map +1 -1
  163. package/dist/types/src/index.d.ts +3 -4
  164. package/dist/types/src/index.d.ts.map +1 -1
  165. package/dist/types/src/plugin-operation/OperationPlugin.d.ts +3 -0
  166. package/dist/types/src/plugin-operation/OperationPlugin.d.ts.map +1 -0
  167. package/dist/types/src/plugin-operation/history/capability.d.ts +7 -0
  168. package/dist/types/src/plugin-operation/history/capability.d.ts.map +1 -0
  169. package/dist/types/src/plugin-operation/history/errors.d.ts +32 -0
  170. package/dist/types/src/plugin-operation/history/errors.d.ts.map +1 -0
  171. package/dist/types/src/plugin-operation/history/history-tracker.d.ts +18 -0
  172. package/dist/types/src/plugin-operation/history/history-tracker.d.ts.map +1 -0
  173. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts +2 -0
  174. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts.map +1 -0
  175. package/dist/types/src/plugin-operation/history/index.d.ts +6 -0
  176. package/dist/types/src/plugin-operation/history/index.d.ts.map +1 -0
  177. package/dist/types/src/plugin-operation/history/types.d.ts +13 -0
  178. package/dist/types/src/plugin-operation/history/types.d.ts.map +1 -0
  179. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts +101 -0
  180. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts.map +1 -0
  181. package/dist/types/src/plugin-operation/history/undo-registry.d.ts +23 -0
  182. package/dist/types/src/plugin-operation/history/undo-registry.d.ts.map +1 -0
  183. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts +2 -0
  184. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts.map +1 -0
  185. package/dist/types/src/plugin-operation/index.d.ts +3 -0
  186. package/dist/types/src/plugin-operation/index.d.ts.map +1 -0
  187. package/dist/types/src/plugin-operation/invoker-capability.d.ts +6 -0
  188. package/dist/types/src/plugin-operation/invoker-capability.d.ts.map +1 -0
  189. package/dist/types/src/plugin-operation/meta.d.ts +3 -0
  190. package/dist/types/src/plugin-operation/meta.d.ts.map +1 -0
  191. package/dist/types/src/plugin-operation/testing.d.ts +59 -0
  192. package/dist/types/src/plugin-operation/testing.d.ts.map +1 -0
  193. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts +3 -0
  194. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts.map +1 -0
  195. package/dist/types/src/plugin-runtime/capability.d.ts +6 -0
  196. package/dist/types/src/plugin-runtime/capability.d.ts.map +1 -0
  197. package/dist/types/src/plugin-runtime/index.d.ts +2 -0
  198. package/dist/types/src/plugin-runtime/index.d.ts.map +1 -0
  199. package/dist/types/src/plugin-runtime/meta.d.ts +3 -0
  200. package/dist/types/src/plugin-runtime/meta.d.ts.map +1 -0
  201. package/dist/types/src/testing/harness.d.ts +67 -0
  202. package/dist/types/src/testing/harness.d.ts.map +1 -0
  203. package/dist/types/src/testing/index.d.ts +2 -0
  204. package/dist/types/src/testing/index.d.ts.map +1 -1
  205. package/dist/types/src/testing/react.d.ts +27 -0
  206. package/dist/types/src/testing/react.d.ts.map +1 -0
  207. package/dist/types/src/testing/react.test.d.ts +2 -0
  208. package/dist/types/src/testing/react.test.d.ts.map +1 -0
  209. package/dist/types/src/testing/service.d.ts +8 -0
  210. package/dist/types/src/testing/service.d.ts.map +1 -0
  211. package/dist/types/src/testing/withPluginManager.d.ts +7 -6
  212. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  213. package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
  214. package/dist/types/src/ui/components/App/App.d.ts +9 -0
  215. package/dist/types/src/ui/components/App/App.d.ts.map +1 -0
  216. package/dist/types/src/ui/components/App/App.stories.d.ts +19 -0
  217. package/dist/types/src/ui/components/App/App.stories.d.ts.map +1 -0
  218. package/dist/types/src/ui/components/App/index.d.ts +2 -0
  219. package/dist/types/src/ui/components/App/index.d.ts.map +1 -0
  220. package/dist/types/src/ui/components/Placeholder/Placeholder.d.ts +64 -0
  221. package/dist/types/src/ui/components/Placeholder/Placeholder.d.ts.map +1 -0
  222. package/dist/types/src/ui/components/Placeholder/Placeholder.stories.d.ts +19 -0
  223. package/dist/types/src/ui/components/Placeholder/Placeholder.stories.d.ts.map +1 -0
  224. package/dist/types/src/ui/components/Placeholder/index.d.ts +2 -0
  225. package/dist/types/src/ui/components/Placeholder/index.d.ts.map +1 -0
  226. package/dist/types/src/{playground/playground.stories.d.ts → ui/components/PluginManager/PluginManagerContext.stories.d.ts} +5 -3
  227. package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts.map +1 -0
  228. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts +10 -0
  229. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts.map +1 -0
  230. package/dist/types/src/ui/components/PluginManager/index.d.ts +2 -0
  231. package/dist/types/src/ui/components/PluginManager/index.d.ts.map +1 -0
  232. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts +24 -0
  233. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -0
  234. package/dist/types/src/{components/App.stories.d.ts → ui/components/Surface/SurfaceComponent.stories.d.ts} +1 -1
  235. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts.map +1 -0
  236. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts +11 -0
  237. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts.map +1 -0
  238. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts +48 -0
  239. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts.map +1 -0
  240. package/dist/types/src/ui/components/Surface/context.d.ts +5 -0
  241. package/dist/types/src/ui/components/Surface/context.d.ts.map +1 -0
  242. package/dist/types/src/ui/components/Surface/index.d.ts +36 -0
  243. package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -0
  244. package/dist/types/src/ui/components/Surface/types.d.ts +197 -0
  245. package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -0
  246. package/dist/types/src/ui/components/Surface/types.test.d.ts +2 -0
  247. package/dist/types/src/ui/components/Surface/types.test.d.ts.map +1 -0
  248. package/dist/types/src/ui/components/index.d.ts +5 -0
  249. package/dist/types/src/ui/components/index.d.ts.map +1 -0
  250. package/dist/types/src/ui/hooks/index.d.ts +6 -0
  251. package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
  252. package/dist/types/src/ui/hooks/useApp.d.ts +88 -0
  253. package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -0
  254. package/dist/types/src/ui/hooks/useApp.test.d.ts +2 -0
  255. package/dist/types/src/ui/hooks/useApp.test.d.ts.map +1 -0
  256. package/dist/types/src/ui/hooks/useCapabilities.d.ts +31 -0
  257. package/dist/types/src/ui/hooks/useCapabilities.d.ts.map +1 -0
  258. package/dist/types/src/{components → ui/hooks}/useLoading.d.ts +1 -2
  259. package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -0
  260. package/dist/types/src/ui/hooks/useSettingsState.d.ts +10 -0
  261. package/dist/types/src/ui/hooks/useSettingsState.d.ts.map +1 -0
  262. package/dist/types/src/ui/hooks/useSurface.d.ts +3 -0
  263. package/dist/types/src/ui/hooks/useSurface.d.ts.map +1 -0
  264. package/dist/types/src/ui/index.d.ts +3 -0
  265. package/dist/types/src/ui/index.d.ts.map +1 -0
  266. package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts +34 -0
  267. package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts.map +1 -0
  268. package/dist/types/src/vite-plugin/boot-loader/index.d.ts +52 -0
  269. package/dist/types/src/vite-plugin/boot-loader/index.d.ts.map +1 -0
  270. package/dist/types/src/vite-plugin/composer/index.d.ts +34 -0
  271. package/dist/types/src/vite-plugin/composer/index.d.ts.map +1 -0
  272. package/dist/types/src/vite-plugin/import-map/index.d.ts +28 -0
  273. package/dist/types/src/vite-plugin/import-map/index.d.ts.map +1 -0
  274. package/dist/types/src/vite-plugin/index.d.ts +5 -0
  275. package/dist/types/src/vite-plugin/index.d.ts.map +1 -0
  276. package/dist/types/src/vite-plugin/manifest.d.ts +37 -0
  277. package/dist/types/src/vite-plugin/manifest.d.ts.map +1 -0
  278. package/dist/types/src/vite-plugin/manifest.test.d.ts +2 -0
  279. package/dist/types/src/vite-plugin/manifest.test.d.ts.map +1 -0
  280. package/dist/types/src/vite-plugin/packages.d.ts +13 -0
  281. package/dist/types/src/vite-plugin/packages.d.ts.map +1 -0
  282. package/dist/types/tsconfig.tsbuildinfo +1 -1
  283. package/moon.yml +25 -6
  284. package/package.json +112 -55
  285. package/src/cli/cli.ts +107 -0
  286. package/src/{components → cli}/index.ts +1 -1
  287. package/src/common/activation-events.ts +44 -0
  288. package/src/common/capabilities.ts +169 -210
  289. package/src/common/index.ts +4 -8
  290. package/src/common/operations.ts +35 -0
  291. package/src/common/translations.ts +18 -10
  292. package/src/context.ts +9 -0
  293. package/src/core/{events.ts → activation-event.ts} +10 -7
  294. package/src/core/capability-manager.test.ts +151 -0
  295. package/src/core/capability-manager.ts +192 -0
  296. package/src/core/capability.ts +247 -0
  297. package/src/core/index.ts +8 -4
  298. package/src/core/plugin-asset-cache.ts +60 -0
  299. package/src/core/plugin-manager.test.ts +1354 -0
  300. package/src/core/plugin-manager.ts +1025 -0
  301. package/src/core/plugin-manifest.test.ts +48 -0
  302. package/src/core/plugin-manifest.ts +102 -0
  303. package/src/core/plugin.ts +365 -45
  304. package/src/core/url-loader.test.ts +178 -0
  305. package/src/core/url-loader.ts +337 -0
  306. package/src/index.ts +3 -4
  307. package/src/plugin-operation/OperationPlugin.ts +24 -0
  308. package/src/plugin-operation/history/capability.ts +36 -0
  309. package/src/plugin-operation/history/errors.ts +7 -0
  310. package/src/plugin-operation/history/history-tracker.test.ts +374 -0
  311. package/src/plugin-operation/history/history-tracker.ts +128 -0
  312. package/src/plugin-operation/history/index.ts +9 -0
  313. package/src/plugin-operation/history/types.ts +17 -0
  314. package/src/plugin-operation/history/undo-mapping.ts +135 -0
  315. package/src/plugin-operation/history/undo-registry.test.ts +72 -0
  316. package/src/plugin-operation/history/undo-registry.ts +54 -0
  317. package/src/plugin-operation/index.ts +6 -0
  318. package/src/plugin-operation/invoker-capability.ts +55 -0
  319. package/src/plugin-operation/meta.ts +11 -0
  320. package/src/plugin-operation/testing.ts +155 -0
  321. package/src/plugin-runtime/RuntimePlugin.ts +19 -0
  322. package/src/plugin-runtime/capability.ts +53 -0
  323. package/src/{playground/layout → plugin-runtime}/index.ts +1 -1
  324. package/src/plugin-runtime/meta.ts +11 -0
  325. package/src/testing/harness.ts +229 -0
  326. package/src/testing/index.ts +2 -0
  327. package/src/testing/react.test.tsx +48 -0
  328. package/src/testing/react.tsx +113 -0
  329. package/src/testing/service.ts +52 -0
  330. package/src/testing/withPluginManager.stories.tsx +8 -9
  331. package/src/testing/withPluginManager.tsx +68 -40
  332. package/src/ui/components/App/App.stories.tsx +92 -0
  333. package/src/ui/components/App/App.tsx +81 -0
  334. package/src/{playground/debug → ui/components/App}/index.ts +1 -1
  335. package/src/ui/components/Placeholder/Placeholder.stories.tsx +77 -0
  336. package/src/ui/components/Placeholder/Placeholder.tsx +155 -0
  337. package/src/{playground/logger → ui/components/Placeholder}/index.ts +1 -1
  338. package/src/ui/components/PluginManager/PluginManagerContext.stories.tsx +185 -0
  339. package/src/{react → ui/components/PluginManager}/PluginManagerProvider.ts +3 -3
  340. package/src/ui/components/PluginManager/index.ts +5 -0
  341. package/src/ui/components/Surface/SurfaceComponent.stories.tsx +144 -0
  342. package/src/ui/components/Surface/SurfaceComponent.tsx +303 -0
  343. package/src/ui/components/Surface/SurfaceInfo.tsx +107 -0
  344. package/src/ui/components/Surface/SurfaceProfilerContext.tsx +207 -0
  345. package/src/ui/components/Surface/context.ts +12 -0
  346. package/src/ui/components/Surface/index.ts +54 -0
  347. package/src/ui/components/Surface/types.test.ts +126 -0
  348. package/src/ui/components/Surface/types.ts +269 -0
  349. package/src/ui/components/index.ts +8 -0
  350. package/src/ui/hooks/index.ts +9 -0
  351. package/src/ui/hooks/useApp.test.tsx +159 -0
  352. package/src/ui/hooks/useApp.tsx +413 -0
  353. package/src/ui/hooks/useCapabilities.ts +67 -0
  354. package/src/{components → ui/hooks}/useLoading.tsx +16 -10
  355. package/src/ui/hooks/useSettingsState.ts +26 -0
  356. package/src/ui/hooks/useSurface.ts +13 -0
  357. package/src/ui/index.ts +6 -0
  358. package/src/vite-plugin/boot-loader/BootLoader.stories.tsx +263 -0
  359. package/src/vite-plugin/boot-loader/boot-loader.css +294 -0
  360. package/src/vite-plugin/boot-loader/boot-loader.js +274 -0
  361. package/src/vite-plugin/boot-loader/index.ts +112 -0
  362. package/src/vite-plugin/composer/index.ts +277 -0
  363. package/src/vite-plugin/import-map/index.ts +524 -0
  364. package/src/vite-plugin/index.ts +10 -0
  365. package/src/vite-plugin/manifest.test.ts +24 -0
  366. package/src/vite-plugin/manifest.ts +50 -0
  367. package/src/vite-plugin/packages.ts +188 -0
  368. package/tsconfig.json +18 -15
  369. package/tsconfig.node.json +2 -4
  370. package/typedoc.json +2 -4
  371. package/vitest.config.ts +1 -1
  372. package/.swc/plugins/linux_x86_64_19.0.0/727453fb3a62f7f1d952a41e051ca8a6f88cadc45cee43c6a4d1aa45f9b75665.wasmer-v7 +0 -0
  373. package/.swc/plugins/linux_x86_64_19.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429.wasmer-v7 +0 -0
  374. package/dist/lib/browser/app-graph-builder-XH4OYQLC.mjs +0 -137
  375. package/dist/lib/browser/app-graph-builder-XH4OYQLC.mjs.map +0 -7
  376. package/dist/lib/browser/chunk-6V54SRFL.mjs +0 -1638
  377. package/dist/lib/browser/chunk-6V54SRFL.mjs.map +0 -7
  378. package/dist/lib/browser/chunk-RGKMLI6U.mjs +0 -35
  379. package/dist/lib/browser/chunk-RGKMLI6U.mjs.map +0 -7
  380. package/dist/lib/browser/chunk-ZZVFNUHZ.mjs +0 -467
  381. package/dist/lib/browser/chunk-ZZVFNUHZ.mjs.map +0 -7
  382. package/dist/lib/browser/intent-dispatcher-VFMJVO2M.mjs +0 -11
  383. package/dist/lib/browser/intent-resolver-ICAPD4JL.mjs +0 -39
  384. package/dist/lib/browser/intent-resolver-ICAPD4JL.mjs.map +0 -7
  385. package/dist/lib/browser/store-7ZGMHOGB.mjs +0 -30
  386. package/dist/lib/browser/store-7ZGMHOGB.mjs.map +0 -7
  387. package/dist/lib/browser/worker.mjs +0 -77
  388. package/dist/lib/node-esm/app-graph-builder-C7H22SOL.mjs +0 -138
  389. package/dist/lib/node-esm/app-graph-builder-C7H22SOL.mjs.map +0 -7
  390. package/dist/lib/node-esm/chunk-AXSZKZFD.mjs +0 -468
  391. package/dist/lib/node-esm/chunk-AXSZKZFD.mjs.map +0 -7
  392. package/dist/lib/node-esm/chunk-LKPMRTRR.mjs +0 -37
  393. package/dist/lib/node-esm/chunk-LKPMRTRR.mjs.map +0 -7
  394. package/dist/lib/node-esm/chunk-SOVTUUAY.mjs +0 -1640
  395. package/dist/lib/node-esm/chunk-SOVTUUAY.mjs.map +0 -7
  396. package/dist/lib/node-esm/intent-dispatcher-SAPOKSLZ.mjs +0 -12
  397. package/dist/lib/node-esm/intent-resolver-CRNJ6BMD.mjs +0 -40
  398. package/dist/lib/node-esm/intent-resolver-CRNJ6BMD.mjs.map +0 -7
  399. package/dist/lib/node-esm/store-H4F4RMYD.mjs +0 -31
  400. package/dist/lib/node-esm/store-H4F4RMYD.mjs.map +0 -7
  401. package/dist/lib/node-esm/worker.mjs +0 -78
  402. package/dist/types/src/common/collaboration.d.ts +0 -20
  403. package/dist/types/src/common/collaboration.d.ts.map +0 -1
  404. package/dist/types/src/common/events.d.ts +0 -52
  405. package/dist/types/src/common/events.d.ts.map +0 -1
  406. package/dist/types/src/common/file.d.ts +0 -14
  407. package/dist/types/src/common/file.d.ts.map +0 -1
  408. package/dist/types/src/common/graph.d.ts +0 -21
  409. package/dist/types/src/common/graph.d.ts.map +0 -1
  410. package/dist/types/src/common/layout.d.ts +0 -279
  411. package/dist/types/src/common/layout.d.ts.map +0 -1
  412. package/dist/types/src/common/surface.d.ts +0 -59
  413. package/dist/types/src/common/surface.d.ts.map +0 -1
  414. package/dist/types/src/components/App.d.ts +0 -10
  415. package/dist/types/src/components/App.d.ts.map +0 -1
  416. package/dist/types/src/components/App.stories.d.ts.map +0 -1
  417. package/dist/types/src/components/DefaultFallback.d.ts +0 -8
  418. package/dist/types/src/components/DefaultFallback.d.ts.map +0 -1
  419. package/dist/types/src/components/index.d.ts +0 -2
  420. package/dist/types/src/components/index.d.ts.map +0 -1
  421. package/dist/types/src/components/useApp.d.ts +0 -44
  422. package/dist/types/src/components/useApp.d.ts.map +0 -1
  423. package/dist/types/src/components/useLoading.d.ts.map +0 -1
  424. package/dist/types/src/core/capabilities.d.ts +0 -117
  425. package/dist/types/src/core/capabilities.d.ts.map +0 -1
  426. package/dist/types/src/core/capabilities.test.d.ts +0 -2
  427. package/dist/types/src/core/capabilities.test.d.ts.map +0 -1
  428. package/dist/types/src/core/events.d.ts.map +0 -1
  429. package/dist/types/src/core/manager.d.ts +0 -126
  430. package/dist/types/src/core/manager.d.ts.map +0 -1
  431. package/dist/types/src/core/manager.test.d.ts +0 -2
  432. package/dist/types/src/core/manager.test.d.ts.map +0 -1
  433. package/dist/types/src/playground/debug/Debug.d.ts +0 -6
  434. package/dist/types/src/playground/debug/Debug.d.ts.map +0 -1
  435. package/dist/types/src/playground/debug/index.d.ts +0 -2
  436. package/dist/types/src/playground/debug/index.d.ts.map +0 -1
  437. package/dist/types/src/playground/debug/plugin.d.ts +0 -2
  438. package/dist/types/src/playground/debug/plugin.d.ts.map +0 -1
  439. package/dist/types/src/playground/generator/Main.d.ts +0 -6
  440. package/dist/types/src/playground/generator/Main.d.ts.map +0 -1
  441. package/dist/types/src/playground/generator/Toolbar.d.ts +0 -6
  442. package/dist/types/src/playground/generator/Toolbar.d.ts.map +0 -1
  443. package/dist/types/src/playground/generator/generator.d.ts +0 -7
  444. package/dist/types/src/playground/generator/generator.d.ts.map +0 -1
  445. package/dist/types/src/playground/generator/index.d.ts +0 -3
  446. package/dist/types/src/playground/generator/index.d.ts.map +0 -1
  447. package/dist/types/src/playground/generator/plugin.d.ts +0 -2
  448. package/dist/types/src/playground/generator/plugin.d.ts.map +0 -1
  449. package/dist/types/src/playground/layout/Layout.d.ts +0 -8
  450. package/dist/types/src/playground/layout/Layout.d.ts.map +0 -1
  451. package/dist/types/src/playground/layout/index.d.ts +0 -2
  452. package/dist/types/src/playground/layout/index.d.ts.map +0 -1
  453. package/dist/types/src/playground/layout/plugin.d.ts +0 -2
  454. package/dist/types/src/playground/layout/plugin.d.ts.map +0 -1
  455. package/dist/types/src/playground/logger/Toolbar.d.ts +0 -6
  456. package/dist/types/src/playground/logger/Toolbar.d.ts.map +0 -1
  457. package/dist/types/src/playground/logger/index.d.ts +0 -2
  458. package/dist/types/src/playground/logger/index.d.ts.map +0 -1
  459. package/dist/types/src/playground/logger/plugin.d.ts +0 -2
  460. package/dist/types/src/playground/logger/plugin.d.ts.map +0 -1
  461. package/dist/types/src/playground/logger/schema.d.ts +0 -13
  462. package/dist/types/src/playground/logger/schema.d.ts.map +0 -1
  463. package/dist/types/src/playground/playground.stories.d.ts.map +0 -1
  464. package/dist/types/src/plugin-intent/IntentPlugin.d.ts +0 -2
  465. package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +0 -1
  466. package/dist/types/src/plugin-intent/actions.d.ts +0 -36
  467. package/dist/types/src/plugin-intent/actions.d.ts.map +0 -1
  468. package/dist/types/src/plugin-intent/errors.d.ts +0 -16
  469. package/dist/types/src/plugin-intent/errors.d.ts.map +0 -1
  470. package/dist/types/src/plugin-intent/index.d.ts +0 -6
  471. package/dist/types/src/plugin-intent/index.d.ts.map +0 -1
  472. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +0 -139
  473. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +0 -1
  474. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts +0 -2
  475. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts.map +0 -1
  476. package/dist/types/src/plugin-intent/intent.d.ts +0 -63
  477. package/dist/types/src/plugin-intent/intent.d.ts.map +0 -1
  478. package/dist/types/src/plugin-intent/meta.d.ts +0 -3
  479. package/dist/types/src/plugin-intent/meta.d.ts.map +0 -1
  480. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +0 -2
  481. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +0 -1
  482. package/dist/types/src/plugin-settings/actions.d.ts +0 -25
  483. package/dist/types/src/plugin-settings/actions.d.ts.map +0 -1
  484. package/dist/types/src/plugin-settings/app-graph-builder.d.ts +0 -4
  485. package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +0 -1
  486. package/dist/types/src/plugin-settings/index.d.ts +0 -3
  487. package/dist/types/src/plugin-settings/index.d.ts.map +0 -1
  488. package/dist/types/src/plugin-settings/intent-resolver.d.ts +0 -4
  489. package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +0 -1
  490. package/dist/types/src/plugin-settings/meta.d.ts +0 -3
  491. package/dist/types/src/plugin-settings/meta.d.ts.map +0 -1
  492. package/dist/types/src/plugin-settings/store.d.ts +0 -5
  493. package/dist/types/src/plugin-settings/store.d.ts.map +0 -1
  494. package/dist/types/src/plugin-settings/translations.d.ts +0 -11
  495. package/dist/types/src/plugin-settings/translations.d.ts.map +0 -1
  496. package/dist/types/src/react/ErrorBoundary.d.ts +0 -30
  497. package/dist/types/src/react/ErrorBoundary.d.ts.map +0 -1
  498. package/dist/types/src/react/IntentContext.d.ts +0 -8
  499. package/dist/types/src/react/IntentContext.d.ts.map +0 -1
  500. package/dist/types/src/react/PluginManagerProvider.d.ts +0 -10
  501. package/dist/types/src/react/PluginManagerProvider.d.ts.map +0 -1
  502. package/dist/types/src/react/Surface.d.ts +0 -12
  503. package/dist/types/src/react/Surface.d.ts.map +0 -1
  504. package/dist/types/src/react/Surface.stories.d.ts +0 -17
  505. package/dist/types/src/react/Surface.stories.d.ts.map +0 -1
  506. package/dist/types/src/react/common.d.ts +0 -13
  507. package/dist/types/src/react/common.d.ts.map +0 -1
  508. package/dist/types/src/react/index.d.ts +0 -7
  509. package/dist/types/src/react/index.d.ts.map +0 -1
  510. package/dist/types/src/react/useCapabilities.d.ts +0 -13
  511. package/dist/types/src/react/useCapabilities.d.ts.map +0 -1
  512. package/dist/types/src/react/useIntentResolver.d.ts +0 -3
  513. package/dist/types/src/react/useIntentResolver.d.ts.map +0 -1
  514. package/dist/types/src/worker.d.ts +0 -4
  515. package/dist/types/src/worker.d.ts.map +0 -1
  516. package/src/common/collaboration.ts +0 -18
  517. package/src/common/events.ts +0 -79
  518. package/src/common/file.ts +0 -22
  519. package/src/common/graph.ts +0 -30
  520. package/src/common/layout.ts +0 -277
  521. package/src/common/surface.ts +0 -83
  522. package/src/components/App.stories.tsx +0 -33
  523. package/src/components/App.tsx +0 -59
  524. package/src/components/DefaultFallback.tsx +0 -26
  525. package/src/components/useApp.tsx +0 -164
  526. package/src/core/capabilities.test.ts +0 -136
  527. package/src/core/capabilities.ts +0 -259
  528. package/src/core/manager.test.ts +0 -516
  529. package/src/core/manager.ts +0 -597
  530. package/src/playground/debug/Debug.tsx +0 -39
  531. package/src/playground/debug/plugin.ts +0 -16
  532. package/src/playground/generator/Main.tsx +0 -71
  533. package/src/playground/generator/Toolbar.tsx +0 -47
  534. package/src/playground/generator/generator.ts +0 -48
  535. package/src/playground/generator/index.ts +0 -6
  536. package/src/playground/generator/plugin.ts +0 -22
  537. package/src/playground/layout/Layout.tsx +0 -33
  538. package/src/playground/layout/plugin.ts +0 -18
  539. package/src/playground/logger/Toolbar.tsx +0 -30
  540. package/src/playground/logger/plugin.ts +0 -41
  541. package/src/playground/logger/schema.ts +0 -12
  542. package/src/playground/playground.stories.tsx +0 -46
  543. package/src/plugin-intent/IntentPlugin.ts +0 -20
  544. package/src/plugin-intent/actions.ts +0 -31
  545. package/src/plugin-intent/errors.ts +0 -40
  546. package/src/plugin-intent/index.ts +0 -9
  547. package/src/plugin-intent/intent-dispatcher.test.ts +0 -279
  548. package/src/plugin-intent/intent-dispatcher.ts +0 -334
  549. package/src/plugin-intent/intent.ts +0 -154
  550. package/src/plugin-intent/meta.ts +0 -10
  551. package/src/plugin-settings/SettingsPlugin.ts +0 -34
  552. package/src/plugin-settings/actions.ts +0 -25
  553. package/src/plugin-settings/app-graph-builder.ts +0 -159
  554. package/src/plugin-settings/index.ts +0 -6
  555. package/src/plugin-settings/intent-resolver.ts +0 -35
  556. package/src/plugin-settings/meta.ts +0 -10
  557. package/src/plugin-settings/store.ts +0 -33
  558. package/src/plugin-settings/translations.ts +0 -19
  559. package/src/react/ErrorBoundary.tsx +0 -54
  560. package/src/react/IntentContext.tsx +0 -35
  561. package/src/react/Surface.stories.tsx +0 -101
  562. package/src/react/Surface.tsx +0 -86
  563. package/src/react/common.ts +0 -13
  564. package/src/react/index.ts +0 -10
  565. package/src/react/useCapabilities.ts +0 -31
  566. package/src/react/useIntentResolver.ts +0 -22
  567. package/src/worker.ts +0 -11
  568. /package/dist/lib/browser/{intent-dispatcher-VFMJVO2M.mjs.map → chunk-G7SDBRKH.mjs.map} +0 -0
  569. /package/dist/lib/browser/{worker.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  570. /package/dist/lib/{node-esm/intent-dispatcher-SAPOKSLZ.mjs.map → browser/common/activation-events.mjs.map} +0 -0
  571. /package/dist/lib/{node-esm/worker.mjs.map → browser/common/capabilities.mjs.map} +0 -0
@@ -0,0 +1,263 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React, { useEffect, useRef, useState } from 'react';
7
+
8
+ import { Composer } from '@dxos/brand';
9
+ import { Toolbar } from '@dxos/react-ui';
10
+ import { withTheme } from '@dxos/react-ui/testing';
11
+
12
+ import { Placeholder } from '../../ui';
13
+ import bootLoaderCss from './boot-loader.css?raw';
14
+ import bootLoaderScript from './boot-loader.js?raw';
15
+
16
+ /**
17
+ * Storybook host that runs the **real** inline driver script (`boot-loader.js`)
18
+ * against the same DOM structure {@link bootLoaderPlugin} injects in production
19
+ * via `transformIndexHtml`. The component injects `<style>` + the loader DOM,
20
+ * evaluates the driver, and exposes `window.__bootLoader` for the stories to
21
+ * call — no React reimplementation of the state machine.
22
+ *
23
+ * On unmount, the host calls `__bootLoader.dismiss()` (which clears the creep
24
+ * timer and removes the `#boot-loader` node) and clears the global so a fresh
25
+ * mount re-runs the driver from scratch.
26
+ */
27
+ type BootLoaderHostProps = {
28
+ initialStatus?: string;
29
+ markSvg?: string;
30
+ };
31
+
32
+ // `__bootLoader` is declared globally by `../../ui/components/Placeholder/Placeholder.tsx`
33
+ // so consumers don't have to redeclare it. The story imports `Placeholder` for the
34
+ // handoff scenarios, which pulls the declaration into scope.
35
+
36
+ const BootLoaderHost = ({ initialStatus = 'Loading…', markSvg }: BootLoaderHostProps) => {
37
+ const containerRef = useRef<HTMLDivElement | null>(null);
38
+
39
+ useEffect(() => {
40
+ const container = containerRef.current;
41
+ if (!container) {
42
+ return;
43
+ }
44
+ // Mirror the HTML structure produced by `bootLoaderPlugin.transformIndexHtml`.
45
+ const initialLine = initialStatus ? `<div class="boot-loader-status-line">${escapeHtml(initialStatus)}</div>` : '';
46
+ const markHtml = markSvg ? `<div id="boot-loader-mark">${markSvg}</div>` : '';
47
+ container.innerHTML = `
48
+ <div id="boot-loader" role="status" aria-live="polite" aria-label="Initializing">
49
+ <div id="boot-loader-disc">
50
+ <div id="boot-loader-bar"></div>
51
+ <div id="boot-loader-dot"></div>
52
+ ${markHtml}
53
+ </div>
54
+ <div id="boot-loader-status">${initialLine}</div>
55
+ </div>
56
+ `;
57
+ // Evaluate the driver IIFE — it auto-promotes idle → state 1 (slow creep)
58
+ // and exposes `window.__bootLoader.{status, progress, dismiss}` globally.
59
+ const driverEl = document.createElement('script');
60
+ driverEl.textContent = bootLoaderScript;
61
+ container.appendChild(driverEl);
62
+
63
+ return () => {
64
+ try {
65
+ window.__bootLoader?.dismiss();
66
+ } catch {
67
+ // Driver removes its own DOM — swallow errors from idempotent retries.
68
+ }
69
+ delete window.__bootLoader;
70
+ container.innerHTML = '';
71
+ };
72
+ }, [initialStatus, markSvg]);
73
+
74
+ return (
75
+ <>
76
+ <style>{bootLoaderCss}</style>
77
+ <div ref={containerRef} />
78
+ </>
79
+ );
80
+ };
81
+
82
+ const escapeHtml = (text: string): string =>
83
+ text.replace(/[&<>"']/g, (ch) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' })[ch]!);
84
+
85
+ // Inlined snapshot of `packages/ui/brand/assets/icons/composer-icon.svg` —
86
+ // keeps storybook self-contained (production pipes the same file in from
87
+ // vite.config.ts via the plugin's `markSvg` option) while previewing the
88
+ // real brand palette the loader will render in production.
89
+ const PLACEHOLDER_MARK = `
90
+ <svg viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
91
+ <g transform="matrix(0.969697,0,0,1,-570.182,0)">
92
+ <rect x="588" y="0" width="264" height="256" style="fill:none;"/>
93
+ <g transform="matrix(0.917198,0,0,1,-223.93,-876)">
94
+ <path d="M1065.83,1064L1029.14,1064C991.913,1064 961.684,1037.12 961.684,1004C961.684,971.197 991.282,944.542 1028.02,944.008L1028.02,944L1047.85,944L1039.21,968L1029.14,968C1006.79,968 988.669,984.118 988.669,1004C988.669,1023.87 1006.81,1040 1029.14,1040C1029.38,1040 1029.62,1040 1029.85,1040L1029.85,1040L1074.47,1040L1065.83,1064ZM1083.11,1040L1083.11,1040L1083.11,1064L1083.11,1064L1083.11,1040Z" style="fill:rgb(1,122,183);"/>
95
+ </g>
96
+ <path d="M761.579,164L720,164C699.51,164 682.875,147.869 682.875,128C682.875,108.452 698.942,92.543 718.969,92.014L718.969,92L729.238,92L721.317,116L720,116C713.165,116 707.625,121.373 707.625,128C707.625,134.623 713.17,140 720,140C720.072,140 720.144,139.999 720.216,139.998L720.216,140L769.5,140L761.579,164Z" style="fill:rgb(6,197,253);"/>
97
+ <path d="M745.738,212L720.025,212L720,212C672.202,212 633.389,174.377 633.375,128.024C633.361,81.958 671.591,44.542 718.969,44.006L718.969,44L719.975,44L745.079,44L737.159,68L719.982,68C685.809,68.01 658.115,94.88 658.125,128.017C658.135,161.126 685.858,188 720,188L720.018,188C720.378,188 720.738,187.997 721.098,187.991L721.098,188L753.659,188L745.738,212Z" style="fill:rgb(10,75,105);"/>
98
+ <g transform="matrix(1.03125,0,0,1,588,0)">
99
+ <path d="M128,236C68.393,236 20,187.607 20,128C20,68.353 68.353,20 128,20L160,20L152.319,44L128,44C81.608,44 44,81.608 44,128C44,174.361 81.639,212 128,212C127.756,212.004 127.878,212.004 128,212.003C128.122,212.002 128.244,212 128,212L152.958,212L145.277,236L128,236ZM128,236C128.628,236 127.372,236.011 128,236Z" style="fill:rgb(5,40,61);"/>
100
+ </g>
101
+ </g>
102
+ </svg>
103
+ `;
104
+
105
+ /**
106
+ * Approximate plugin count used by the simulation. Hardcoded here to keep the
107
+ * storybook self-contained — the production count comes from
108
+ * `composer-app/src/plugin-defs.tsx`'s dynamic-import list.
109
+ */
110
+ const STORY_PLUGIN_COUNT = 80;
111
+
112
+ /** Tick interval for the determinate-progress simulation, in ms. */
113
+ const STORY_TICK_MS = 50;
114
+
115
+ /**
116
+ * Story controls — emits real `__bootLoader.status(...)` and `progress(...)`
117
+ * calls into the running driver script, which then drives the visible DOM.
118
+ * No React state shadow of the loader's progress; the driver is the source
119
+ * of truth.
120
+ */
121
+ type SimRunningState = 'idle' | 'creep' | 'progress' | 'done';
122
+
123
+ const useBootLoaderDriver = ({ withHandoff = false }: { withHandoff?: boolean } = {}) => {
124
+ const [running, setRunning] = useState<SimRunningState>('creep');
125
+ const [stage, setStage] = useState(0);
126
+
127
+ // `creep` state — driver auto-creeps; the story emits a sequence of
128
+ // status messages so the appended-log behaviour is observable.
129
+ useEffect(() => {
130
+ if (running !== 'creep') {
131
+ return;
132
+ }
133
+ const phases = ['Loading framework…', 'Reading configuration…', 'Starting services…'];
134
+ let index = 0;
135
+ const handle = setInterval(() => {
136
+ window.__bootLoader?.status({ humanized: phases[index] });
137
+ index += 1;
138
+ if (index >= phases.length) {
139
+ clearInterval(handle);
140
+ }
141
+ }, 600);
142
+ return () => clearInterval(handle);
143
+ }, [running]);
144
+
145
+ // `progress` state — random-walk through the plugin count, calling the
146
+ // real `__bootLoader.progress(...)` so the driver's no-regress + creep
147
+ // logic runs as it does in production.
148
+ useEffect(() => {
149
+ if (running !== 'progress') {
150
+ return;
151
+ }
152
+ let loaded = 0;
153
+ const handle = setInterval(() => {
154
+ loaded += Math.abs(Math.random()) * 1.5;
155
+ const fraction = Math.min(1, loaded / STORY_PLUGIN_COUNT);
156
+ window.__bootLoader?.progress(fraction);
157
+ // Range-bearing payload — replaces the current line in place
158
+ // instead of appending one entry per plugin tick.
159
+ window.__bootLoader?.status({
160
+ humanized: 'Loading plugins',
161
+ range: { index: Math.round(loaded), total: STORY_PLUGIN_COUNT },
162
+ });
163
+ if (loaded >= STORY_PLUGIN_COUNT) {
164
+ clearInterval(handle);
165
+ window.__bootLoader?.status({ humanized: 'Starting Composer…' });
166
+ setRunning('done');
167
+ }
168
+ }, STORY_TICK_MS);
169
+ return () => clearInterval(handle);
170
+ }, [running]);
171
+
172
+ // Handoff phase — fade the placeholder in/out once the driver hits 100%.
173
+ useEffect(() => {
174
+ if (!withHandoff || running !== 'done') {
175
+ return;
176
+ }
177
+ const handles: ReturnType<typeof setTimeout>[] = [];
178
+ handles.push(setTimeout(() => setStage(1), 200));
179
+ handles.push(setTimeout(() => setStage(2), 2_000));
180
+ return () => handles.forEach(clearTimeout);
181
+ }, [running, withHandoff]);
182
+
183
+ const advance = () => {
184
+ if (running === 'creep') {
185
+ setRunning('progress');
186
+ } else {
187
+ setRunning('creep');
188
+ setStage(0);
189
+ }
190
+ };
191
+
192
+ return { running, stage, advance };
193
+ };
194
+
195
+ const SimToolbar = ({ running, advance }: { running: SimRunningState; advance: () => void }) => {
196
+ const button =
197
+ running === 'creep'
198
+ ? { icon: 'ph--play--regular', label: 'Start progress' }
199
+ : { icon: 'ph--arrow-counter-clockwise--regular', label: 'Reset' };
200
+ return (
201
+ <Toolbar.Root classNames='relative z-20'>
202
+ <Toolbar.IconButton icon={button.icon} label={button.label} iconOnly onClick={advance} />
203
+ <Toolbar.Text>{running}</Toolbar.Text>
204
+ </Toolbar.Root>
205
+ );
206
+ };
207
+
208
+ const DefaultStory = () => {
209
+ const { running, advance } = useBootLoaderDriver();
210
+ return (
211
+ <>
212
+ <SimToolbar running={running} advance={advance} />
213
+ <BootLoaderHost markSvg={PLACEHOLDER_MARK} />
214
+ </>
215
+ );
216
+ };
217
+
218
+ const meta: Meta<typeof BootLoaderHost> = {
219
+ title: 'sdk/app-framework/vite-plugin/BootLoader',
220
+ component: BootLoaderHost,
221
+ render: DefaultStory,
222
+ decorators: [withTheme({})],
223
+ parameters: {
224
+ layout: 'fullscreen',
225
+ },
226
+ argTypes: {
227
+ initialStatus: { control: 'text' },
228
+ markSvg: { control: 'text' },
229
+ },
230
+ };
231
+
232
+ export default meta;
233
+
234
+ type Story = StoryObj<typeof BootLoaderHost>;
235
+
236
+ export const Default: Story = {};
237
+
238
+ /**
239
+ * Renders the React `Placeholder` from `@dxos/app-framework/ui` on its own —
240
+ * useful for eyeballing the handoff target the boot loader dismisses to.
241
+ */
242
+ export const PlaceholderHandoff: Story = {
243
+ name: 'Placeholder',
244
+ render: () => <Placeholder stage={1} logo={(logoProps) => <Composer {...logoProps} />} />,
245
+ };
246
+
247
+ /**
248
+ * End-to-end handoff sim: the driver ticks 0 → 100% then the host calls
249
+ * `dismiss()` and the underlying `Placeholder` fades the mark in / out,
250
+ * mirroring the production sequence.
251
+ */
252
+ export const Handoff: Story = {
253
+ render: () => {
254
+ const { running, stage, advance } = useBootLoaderDriver({ withHandoff: true });
255
+ return (
256
+ <>
257
+ <SimToolbar running={running} advance={advance} />
258
+ <Placeholder stage={stage} logo={(logoProps) => <Composer {...logoProps} />} />
259
+ {stage < 1 && <BootLoaderHost markSvg={PLACEHOLDER_MARK} />}
260
+ </>
261
+ );
262
+ },
263
+ };
@@ -0,0 +1,294 @@
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
+ /*
18
+ * Tunable sizes — change these in one place and every derived calc()
19
+ * (mark size, dot orbit radius, status offset, …) follows.
20
+ */
21
+ /*
22
+ * Caps the disc / mark at the design pixel sizes on roomy viewports while
23
+ * shrinking proportionally on narrow ones (`vmin` follows the smaller of
24
+ * width / height) so neither the ring nor the mark crops on phones.
25
+ */
26
+ --boot-loader-disc-size: min(384px, 80vmin);
27
+ /*
28
+ * Match the React `Placeholder`'s logo box (`h-[300px] w-[300px]` at the
29
+ * `stage >= 1` keyframe) so the brand mark doesn't visibly jump size when
30
+ * the loader hands off — the responsive cap keeps the same 300/384 ratio
31
+ * (≈78%) at any viewport width.
32
+ */
33
+ --boot-loader-mark-size: min(300px, 62.5vmin);
34
+ --boot-loader-dot-size: 6px;
35
+ --boot-loader-line-thickness: 1px;
36
+ --boot-loader-line-feather: 2px;
37
+ --boot-loader-status-gap: 24px;
38
+
39
+ position: fixed;
40
+ inset: 0;
41
+ z-index: 10;
42
+ background: var(--boot-loader-bg-light, #fafafa);
43
+ color: var(--boot-loader-fg-light, #0a0a0a);
44
+ font-family:
45
+ ui-sans-serif,
46
+ system-ui,
47
+ -apple-system,
48
+ BlinkMacSystemFont,
49
+ 'Segoe UI',
50
+ sans-serif;
51
+ font-size: 13px;
52
+ }
53
+
54
+ @media (prefers-color-scheme: dark) {
55
+ #boot-loader {
56
+ background: var(--boot-loader-bg-dark, #0a0a0a);
57
+ color: var(--boot-loader-fg-dark, #fafafa);
58
+ }
59
+ }
60
+
61
+ /*
62
+ * Register the progress var as a typed custom property so the browser can
63
+ * interpolate it. Both the conic-gradient arc and the orbiting dot derive
64
+ * their angle from `--boot-loader-bar-progress`, so animating the var (rather
65
+ * than the resulting `background` / `transform`) keeps them in lockstep —
66
+ * `transition: background` on a conic-gradient doesn't interpolate smoothly
67
+ * in all engines, which previously caused the head of the arc to flicker
68
+ * against the dot during each progress step.
69
+ */
70
+ @property --boot-loader-bar-progress {
71
+ syntax: '<number>';
72
+ inherits: true;
73
+ initial-value: 0;
74
+ }
75
+
76
+ /*
77
+ * Stack the ring and the brand mark in the same square so the mark sits
78
+ * centered inside the circle. Grid stacking keeps the mark outside the ring's
79
+ * mask (the mask would otherwise clip the SVG to the 1px-thick arc shape).
80
+ */
81
+ #boot-loader-disc {
82
+ position: absolute;
83
+ top: 50%;
84
+ left: 50%;
85
+ display: grid;
86
+ place-items: center;
87
+ width: var(--boot-loader-disc-size);
88
+ height: var(--boot-loader-disc-size);
89
+ transform: translate(-50%, -50%);
90
+ transition: --boot-loader-bar-progress 240ms ease-out;
91
+ }
92
+
93
+ #boot-loader-disc > * {
94
+ grid-column: 1;
95
+ grid-row: 1;
96
+ }
97
+
98
+ /*
99
+ * Default to grayscale so the mark reads as a quiet monochrome silhouette
100
+ * before any host-driven progress lands; the brand palette swaps in once
101
+ * the driver flips `data-host-driven` on the disc (state-2 entry — the
102
+ * first `__bootLoader.progress()` call). Hover keeps a parallel reveal
103
+ * affordance for inspection in the storybook. The 600ms ease lets the
104
+ * grayscale → color transition play through the activation phase rather
105
+ * than snapping.
106
+ */
107
+ #boot-loader-mark {
108
+ width: var(--boot-loader-mark-size);
109
+ height: var(--boot-loader-mark-size);
110
+ display: flex;
111
+ align-items: center;
112
+ justify-content: center;
113
+ filter: grayscale(100%);
114
+ transition: filter 1000ms ease-out;
115
+ }
116
+
117
+ /*
118
+ * `grayscale(0%)` (identity) rather than `none` — `filter: none` changes
119
+ * the filter function list and most engines treat that as a discrete
120
+ * transition (snap, not ease). Keeping `grayscale(...)` on both sides of
121
+ * the rule lets the browser interpolate the percentage smoothly.
122
+ */
123
+ #boot-loader-disc[data-host-driven] #boot-loader-mark,
124
+ #boot-loader-mark:hover {
125
+ filter: grayscale(0%);
126
+ }
127
+
128
+ #boot-loader-mark svg {
129
+ width: 100%;
130
+ height: 100%;
131
+ /*
132
+ * The host SVG carries its own brand-palette fills, so we don't apply a
133
+ * `color` cascade here. SVGs that intentionally use `fill="currentColor"`
134
+ * still pick up the loader's text colour via `#boot-loader`'s `color`.
135
+ */
136
+ }
137
+
138
+ /*
139
+ * Circular determinate progress — a 1px-thick ring carved out of a filled
140
+ * disc by a radial-gradient mask. The mask applies to the element and its
141
+ * descendants so the `::before` progress arc is clipped to the ring shape
142
+ * too. There is no indeterminate state: the ring sits empty (0%) until the
143
+ * host calls `__bootLoader.progress(fraction)`, then the arc grows in place.
144
+ * The fill repaints on the compositor thread so progress remains visually
145
+ * smooth even while the JS main thread is busy parsing modules.
146
+ */
147
+ #boot-loader-bar {
148
+ position: relative;
149
+ width: 100%;
150
+ height: 100%;
151
+ border-radius: 50%;
152
+ background: rgba(127, 127, 127, 0.18);
153
+ opacity: 0.2;
154
+ /*
155
+ * Feather the inner edge so the thin line gets soft anti-aliased edges
156
+ * instead of a hard pixel cutoff (which can look stair-stepped on
157
+ * non-retina screens). The outer edge is clipped by `border-radius: 50%`,
158
+ * so only the inner side of the ring needs the gradient feather. The
159
+ * solid line lives in the outermost `--boot-loader-line-thickness` of the
160
+ * disc; the feather extends `--boot-loader-line-feather` further inward.
161
+ */
162
+ mask: radial-gradient(
163
+ circle closest-side,
164
+ transparent calc(100% - var(--boot-loader-line-thickness) - var(--boot-loader-line-feather)),
165
+ #000 calc(100% - var(--boot-loader-line-thickness))
166
+ );
167
+ -webkit-mask: radial-gradient(
168
+ circle closest-side,
169
+ transparent calc(100% - var(--boot-loader-line-thickness) - var(--boot-loader-line-feather)),
170
+ #000 calc(100% - var(--boot-loader-line-thickness))
171
+ );
172
+ }
173
+
174
+ /*
175
+ * The host writes 0–100 into `--boot-loader-bar-progress` via
176
+ * `__bootLoader.progress(fraction)`. The `transition: background` smooths
177
+ * the transitions between counter ticks so the arc grows continuously
178
+ * rather than snapping. `conic-gradient` is clockwise-only, so the arc is
179
+ * mirrored horizontally with `scaleX(-1)` to grow anticlockwise from
180
+ * 12 o'clock.
181
+ */
182
+ #boot-loader-bar::before {
183
+ content: '';
184
+ position: absolute;
185
+ inset: 0;
186
+ border-radius: 50%;
187
+ background: conic-gradient(currentcolor calc(var(--boot-loader-bar-progress, 0) * 1%), transparent 0);
188
+ transform: scaleX(-1);
189
+ opacity: 0.9;
190
+ }
191
+
192
+ /*
193
+ * A small dot at the leading edge of the arc. Lives as a sibling of the
194
+ * masked ring (inside `#boot-loader-disc`) so the radial-gradient mask
195
+ * doesn't clip it. The `rotate(...) translateY(-50%)` recipe orbits the
196
+ * dot around the disc centre: at progress 0 it sits at 12 o'clock; the
197
+ * negative rotation grows it anticlockwise to match the arc.
198
+ */
199
+ #boot-loader-dot {
200
+ position: absolute;
201
+ top: 50%;
202
+ left: 50%;
203
+ width: var(--boot-loader-dot-size);
204
+ height: var(--boot-loader-dot-size);
205
+ margin: calc(var(--boot-loader-dot-size) / -2) 0 0 calc(var(--boot-loader-dot-size) / -2);
206
+ border-radius: 50%;
207
+ background: currentcolor;
208
+ opacity: 0;
209
+ /*
210
+ * Orbit radius = `disc/2 - line/2` so the dot's centre lands on the solid
211
+ * line's centre rather than on the disc's outer edge (the line lives in
212
+ * the outermost `--boot-loader-line-thickness` of the disc).
213
+ */
214
+ transform: rotate(calc(var(--boot-loader-bar-progress, 0) * -3.6deg))
215
+ translateY(calc(var(--boot-loader-disc-size) / -2 + var(--boot-loader-line-thickness) / 2));
216
+ transition: opacity 200ms ease-out;
217
+ }
218
+
219
+ /*
220
+ * The driver sets `data-progress-active` on `#boot-loader-disc` while
221
+ * progress is strictly between 0 and 1, hiding the dot at the empty (0%)
222
+ * and full (100%) ring states where it would either sit on a bare ring or
223
+ * coincide with the start of the arc.
224
+ */
225
+ #boot-loader-disc[data-progress-active] #boot-loader-dot {
226
+ opacity: 0.9;
227
+ }
228
+
229
+ #boot-loader-status {
230
+ position: absolute;
231
+ top: 50%;
232
+ left: 50%;
233
+ /* Sit just below the centered disc — half the disc plus the configured gap. */
234
+ transform: translate(-50%, calc(var(--boot-loader-disc-size) / 2 + var(--boot-loader-status-gap)));
235
+ /*
236
+ * Slightly de-emphasised vs body text so the brand mark + ring stay the
237
+ * dominant focus, but high enough to remain legible on both light and dark
238
+ * backgrounds without a custom palette.
239
+ */
240
+ opacity: 0.5;
241
+ /*
242
+ * Single-line viewport over a vertically-stacked track of every status
243
+ * the driver has emitted. The track translates upward by one line-height
244
+ * per `status()` call (see `--boot-loader-line` below), animated via
245
+ * CSS `transition` on `transform` so the new line slides in from below
246
+ * while the previous line slides out — independent of any
247
+ * `scroll-behavior` smooth-scroll support, which Playwright/headless
248
+ * Chrome strips even from spec-compliant `scrollTo({ behavior: 'smooth' })`
249
+ * calls.
250
+ */
251
+ height: 1.5em;
252
+ line-height: 1.5;
253
+ letter-spacing: 0.01em;
254
+ /*
255
+ * Fixed-width digits so the `(i/n)` counter on range-bearing status
256
+ * updates ("Loading plugins (12/80)") doesn't jitter as the index
257
+ * ticks through different glyph widths.
258
+ */
259
+ font-variant-numeric: tabular-nums;
260
+ text-align: center;
261
+ overflow: hidden;
262
+ }
263
+
264
+ /*
265
+ * Track of every appended `.boot-loader-status-line`. The driver writes
266
+ * `--boot-loader-line` (0 = first line visible, 1 = second, …) on this
267
+ * element and the `transform` interpolates because `--boot-loader-line` is
268
+ * registered as a typed `<number>` custom property below.
269
+ */
270
+ #boot-loader-status-track {
271
+ display: flex;
272
+ flex-direction: column;
273
+ /*
274
+ * The driver writes `transform: translateY(<index>em)` directly per
275
+ * `status()` call (see `boot-loader.js`). The transition animates the
276
+ * change so the new line slides in from below while the previous one
277
+ * slides out at the top.
278
+ */
279
+ transform: translateY(0);
280
+ transition: transform 500ms ease-out;
281
+ }
282
+
283
+ /* Honour reduced-motion preferences explicitly — `transition` doesn't auto-respect it. */
284
+ @media (prefers-reduced-motion: reduce) {
285
+ #boot-loader-status-track {
286
+ transition: none;
287
+ }
288
+ }
289
+
290
+ .boot-loader-status-line {
291
+ flex: 0 0 auto;
292
+ height: 1.5em;
293
+ white-space: nowrap;
294
+ }