@dxos/app-framework 0.8.4-main.ead640a → 0.8.4-main.effb148878

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 (572) hide show
  1. package/.storybook/main.mts +2 -4
  2. package/.storybook/preview.mts +2 -2
  3. package/LICENSE +102 -5
  4. package/README.md +1 -1
  5. package/dist/lib/browser/capability-C4WE22TJ.mjs +35 -0
  6. package/dist/lib/browser/capability-C4WE22TJ.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-2ZIYRDAF.mjs +95 -0
  8. package/dist/lib/browser/chunk-2ZIYRDAF.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-5GY3YOEL.mjs +28 -0
  10. package/dist/lib/browser/chunk-5GY3YOEL.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-66IXTIVK.mjs +48 -0
  12. package/dist/lib/browser/chunk-66IXTIVK.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-67GCXX5I.mjs +581 -0
  14. package/dist/lib/browser/chunk-67GCXX5I.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-FJ4765WW.mjs +8 -0
  16. package/dist/lib/browser/chunk-FJ4765WW.mjs.map +7 -0
  17. package/dist/lib/browser/chunk-FO3IYSLV.mjs +68 -0
  18. package/dist/lib/browser/chunk-FO3IYSLV.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-IW44C7UL.mjs +83 -0
  20. package/dist/lib/browser/chunk-IW44C7UL.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  22. package/dist/lib/browser/chunk-KLHQNYJ2.mjs +422 -0
  23. package/dist/lib/browser/chunk-KLHQNYJ2.mjs.map +7 -0
  24. package/dist/lib/browser/chunk-LPWOVOOB.mjs +142 -0
  25. package/dist/lib/browser/chunk-LPWOVOOB.mjs.map +7 -0
  26. package/dist/lib/browser/chunk-LUQOVTWB.mjs +43 -0
  27. package/dist/lib/browser/chunk-LUQOVTWB.mjs.map +7 -0
  28. package/dist/lib/browser/chunk-SLX73WRZ.mjs +218 -0
  29. package/dist/lib/browser/chunk-SLX73WRZ.mjs.map +7 -0
  30. package/dist/lib/browser/chunk-SZMB3K2N.mjs +517 -0
  31. package/dist/lib/browser/chunk-SZMB3K2N.mjs.map +7 -0
  32. package/dist/lib/browser/chunk-VJ5PFAWC.mjs +1446 -0
  33. package/dist/lib/browser/chunk-VJ5PFAWC.mjs.map +7 -0
  34. package/dist/lib/browser/cli/index.mjs +74 -0
  35. package/dist/lib/browser/cli/index.mjs.map +7 -0
  36. package/dist/lib/browser/common/activation-events.mjs +20 -0
  37. package/dist/lib/browser/common/capabilities.mjs +56 -0
  38. package/dist/lib/browser/core/activation-event.mjs +20 -0
  39. package/dist/lib/browser/core/capability.mjs +32 -0
  40. package/dist/lib/browser/core/capability.mjs.map +7 -0
  41. package/dist/lib/browser/core/plugin-manager.mjs +19 -0
  42. package/dist/lib/browser/core/plugin-manager.mjs.map +7 -0
  43. package/dist/lib/browser/core/plugin.mjs +39 -0
  44. package/dist/lib/browser/core/plugin.mjs.map +7 -0
  45. package/dist/lib/browser/core/url-loader.mjs +24 -0
  46. package/dist/lib/browser/core/url-loader.mjs.map +7 -0
  47. package/dist/lib/browser/index.mjs +85 -148
  48. package/dist/lib/browser/index.mjs.map +4 -4
  49. package/dist/lib/browser/meta.json +1 -1
  50. package/dist/lib/browser/process-manager-capability-3Q4TA73T.mjs +89 -0
  51. package/dist/lib/browser/process-manager-capability-3Q4TA73T.mjs.map +7 -0
  52. package/dist/lib/browser/testing/index.mjs +245 -47
  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 +54 -0
  57. package/dist/lib/browser/ui/index.mjs.map +7 -0
  58. package/dist/lib/node-esm/capability-GPN6OS6M.mjs +36 -0
  59. package/dist/lib/node-esm/capability-GPN6OS6M.mjs.map +7 -0
  60. package/dist/lib/node-esm/chunk-37Z53PXZ.mjs +10 -0
  61. package/dist/lib/node-esm/chunk-37Z53PXZ.mjs.map +7 -0
  62. package/dist/lib/node-esm/chunk-42UNAKYO.mjs +423 -0
  63. package/dist/lib/node-esm/chunk-42UNAKYO.mjs.map +7 -0
  64. package/dist/lib/node-esm/chunk-6S45OMUP.mjs +219 -0
  65. package/dist/lib/node-esm/chunk-6S45OMUP.mjs.map +7 -0
  66. package/dist/lib/node-esm/chunk-CTKEZHKF.mjs +84 -0
  67. package/dist/lib/node-esm/chunk-CTKEZHKF.mjs.map +7 -0
  68. package/dist/lib/node-esm/chunk-FEVJEUD7.mjs +143 -0
  69. package/dist/lib/node-esm/chunk-FEVJEUD7.mjs.map +7 -0
  70. package/dist/lib/node-esm/chunk-GBHZF46K.mjs +518 -0
  71. package/dist/lib/node-esm/chunk-GBHZF46K.mjs.map +7 -0
  72. package/dist/lib/node-esm/chunk-GUE5V5CG.mjs +582 -0
  73. package/dist/lib/node-esm/chunk-GUE5V5CG.mjs.map +7 -0
  74. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  75. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  76. package/dist/lib/node-esm/chunk-KFZEB6BV.mjs +29 -0
  77. package/dist/lib/node-esm/chunk-KFZEB6BV.mjs.map +7 -0
  78. package/dist/lib/node-esm/chunk-MXWDXYV2.mjs +44 -0
  79. package/dist/lib/node-esm/chunk-MXWDXYV2.mjs.map +7 -0
  80. package/dist/lib/node-esm/chunk-QBUGLR4H.mjs +96 -0
  81. package/dist/lib/node-esm/chunk-QBUGLR4H.mjs.map +7 -0
  82. package/dist/lib/node-esm/chunk-SFYCO3PT.mjs +1447 -0
  83. package/dist/lib/node-esm/chunk-SFYCO3PT.mjs.map +7 -0
  84. package/dist/lib/node-esm/chunk-WK7OIQKI.mjs +70 -0
  85. package/dist/lib/node-esm/chunk-WK7OIQKI.mjs.map +7 -0
  86. package/dist/lib/node-esm/chunk-XOCUANHO.mjs +49 -0
  87. package/dist/lib/node-esm/chunk-XOCUANHO.mjs.map +7 -0
  88. package/dist/lib/node-esm/cli/index.mjs +75 -0
  89. package/dist/lib/node-esm/cli/index.mjs.map +7 -0
  90. package/dist/lib/node-esm/common/activation-events.mjs +21 -0
  91. package/dist/lib/node-esm/common/activation-events.mjs.map +7 -0
  92. package/dist/lib/node-esm/common/capabilities.mjs +57 -0
  93. package/dist/lib/node-esm/common/capabilities.mjs.map +7 -0
  94. package/dist/lib/node-esm/core/activation-event.mjs +21 -0
  95. package/dist/lib/node-esm/core/activation-event.mjs.map +7 -0
  96. package/dist/lib/node-esm/core/capability.mjs +33 -0
  97. package/dist/lib/node-esm/core/capability.mjs.map +7 -0
  98. package/dist/lib/node-esm/core/plugin-manager.mjs +20 -0
  99. package/dist/lib/node-esm/core/plugin-manager.mjs.map +7 -0
  100. package/dist/lib/node-esm/core/plugin.mjs +40 -0
  101. package/dist/lib/node-esm/core/plugin.mjs.map +7 -0
  102. package/dist/lib/node-esm/core/url-loader.mjs +25 -0
  103. package/dist/lib/node-esm/core/url-loader.mjs.map +7 -0
  104. package/dist/lib/node-esm/index.mjs +85 -148
  105. package/dist/lib/node-esm/index.mjs.map +4 -4
  106. package/dist/lib/node-esm/meta.json +1 -1
  107. package/dist/lib/node-esm/process-manager-capability-5KCLSNQM.mjs +90 -0
  108. package/dist/lib/node-esm/process-manager-capability-5KCLSNQM.mjs.map +7 -0
  109. package/dist/lib/node-esm/testing/index.mjs +245 -47
  110. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  111. package/dist/lib/node-esm/testing/react.mjs +79 -0
  112. package/dist/lib/node-esm/testing/react.mjs.map +7 -0
  113. package/dist/lib/node-esm/ui/index.mjs +55 -0
  114. package/dist/lib/node-esm/ui/index.mjs.map +7 -0
  115. package/dist/plugin/node-esm/index.mjs +893 -0
  116. package/dist/plugin/node-esm/index.mjs.map +7 -0
  117. package/dist/plugin/node-esm/meta.json +1 -0
  118. package/dist/types/src/cli/cli.d.ts +37 -0
  119. package/dist/types/src/cli/cli.d.ts.map +1 -0
  120. package/dist/types/src/cli/index.d.ts +2 -0
  121. package/dist/types/src/cli/index.d.ts.map +1 -0
  122. package/dist/types/src/common/activation-events.d.ts +24 -0
  123. package/dist/types/src/common/activation-events.d.ts.map +1 -0
  124. package/dist/types/src/common/annotations.d.ts +1 -0
  125. package/dist/types/src/common/annotations.d.ts.map +1 -0
  126. package/dist/types/src/common/capabilities.d.ts +214 -199
  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} +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 +161 -0
  143. package/dist/types/src/core/capability.d.ts.map +1 -0
  144. package/dist/types/src/core/edge-registry-plugin-provider.d.ts +30 -0
  145. package/dist/types/src/core/edge-registry-plugin-provider.d.ts.map +1 -0
  146. package/dist/types/src/core/index.d.ts +11 -4
  147. package/dist/types/src/core/index.d.ts.map +1 -1
  148. package/dist/types/src/core/plugin-asset-cache.d.ts +71 -0
  149. package/dist/types/src/core/plugin-asset-cache.d.ts.map +1 -0
  150. package/dist/types/src/core/plugin-manager.d.ts +297 -0
  151. package/dist/types/src/core/plugin-manager.d.ts.map +1 -0
  152. package/dist/types/src/core/plugin-manager.test.d.ts +2 -0
  153. package/dist/types/src/core/plugin-manager.test.d.ts.map +1 -0
  154. package/dist/types/src/core/plugin-manifest.d.ts +101 -0
  155. package/dist/types/src/core/plugin-manifest.d.ts.map +1 -0
  156. package/dist/types/src/core/plugin-manifest.test.d.ts +2 -0
  157. package/dist/types/src/core/plugin-manifest.test.d.ts.map +1 -0
  158. package/dist/types/src/core/plugin.d.ts +276 -39
  159. package/dist/types/src/core/plugin.d.ts.map +1 -1
  160. package/dist/types/src/core/registry.d.ts +107 -0
  161. package/dist/types/src/core/registry.d.ts.map +1 -0
  162. package/dist/types/src/core/url-loader.d.ts +127 -0
  163. package/dist/types/src/core/url-loader.d.ts.map +1 -0
  164. package/dist/types/src/core/url-loader.test.d.ts +2 -0
  165. package/dist/types/src/core/url-loader.test.d.ts.map +1 -0
  166. package/dist/types/src/helpers.d.ts.map +1 -1
  167. package/dist/types/src/index.d.ts +2 -4
  168. package/dist/types/src/index.d.ts.map +1 -1
  169. package/dist/types/src/plugin-process-manager/ProcessManagerPlugin.d.ts +3 -0
  170. package/dist/types/src/plugin-process-manager/ProcessManagerPlugin.d.ts.map +1 -0
  171. package/dist/types/src/plugin-process-manager/history/capability.d.ts +7 -0
  172. package/dist/types/src/plugin-process-manager/history/capability.d.ts.map +1 -0
  173. package/dist/types/src/plugin-process-manager/history/errors.d.ts +32 -0
  174. package/dist/types/src/plugin-process-manager/history/errors.d.ts.map +1 -0
  175. package/dist/types/src/plugin-process-manager/history/history-tracker.d.ts +18 -0
  176. package/dist/types/src/plugin-process-manager/history/history-tracker.d.ts.map +1 -0
  177. package/dist/types/src/plugin-process-manager/history/history-tracker.test.d.ts +2 -0
  178. package/dist/types/src/plugin-process-manager/history/history-tracker.test.d.ts.map +1 -0
  179. package/dist/types/src/plugin-process-manager/history/index.d.ts +6 -0
  180. package/dist/types/src/plugin-process-manager/history/index.d.ts.map +1 -0
  181. package/dist/types/src/plugin-process-manager/history/types.d.ts +13 -0
  182. package/dist/types/src/plugin-process-manager/history/types.d.ts.map +1 -0
  183. package/dist/types/src/plugin-process-manager/history/undo-mapping.d.ts +101 -0
  184. package/dist/types/src/plugin-process-manager/history/undo-mapping.d.ts.map +1 -0
  185. package/dist/types/src/plugin-process-manager/history/undo-registry.d.ts +23 -0
  186. package/dist/types/src/plugin-process-manager/history/undo-registry.d.ts.map +1 -0
  187. package/dist/types/src/plugin-process-manager/history/undo-registry.test.d.ts +2 -0
  188. package/dist/types/src/plugin-process-manager/history/undo-registry.test.d.ts.map +1 -0
  189. package/dist/types/src/plugin-process-manager/index.d.ts +3 -0
  190. package/dist/types/src/plugin-process-manager/index.d.ts.map +1 -0
  191. package/dist/types/src/plugin-process-manager/meta.d.ts +3 -0
  192. package/dist/types/src/plugin-process-manager/meta.d.ts.map +1 -0
  193. package/dist/types/src/plugin-process-manager/process-manager-capability.d.ts +8 -0
  194. package/dist/types/src/plugin-process-manager/process-manager-capability.d.ts.map +1 -0
  195. package/dist/types/src/plugin-process-manager/testing.d.ts +59 -0
  196. package/dist/types/src/plugin-process-manager/testing.d.ts.map +1 -0
  197. package/dist/types/src/testing/harness.d.ts +79 -0
  198. package/dist/types/src/testing/harness.d.ts.map +1 -0
  199. package/dist/types/src/testing/index.d.ts +2 -0
  200. package/dist/types/src/testing/index.d.ts.map +1 -1
  201. package/dist/types/src/testing/react.d.ts +27 -0
  202. package/dist/types/src/testing/react.d.ts.map +1 -0
  203. package/dist/types/src/testing/react.test.d.ts +2 -0
  204. package/dist/types/src/testing/react.test.d.ts.map +1 -0
  205. package/dist/types/src/testing/service.d.ts +8 -0
  206. package/dist/types/src/testing/service.d.ts.map +1 -0
  207. package/dist/types/src/testing/withPluginManager.d.ts +7 -6
  208. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  209. package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
  210. package/dist/types/src/ui/components/App/App.d.ts +9 -0
  211. package/dist/types/src/ui/components/App/App.d.ts.map +1 -0
  212. package/dist/types/src/ui/components/App/App.stories.d.ts +19 -0
  213. package/dist/types/src/ui/components/App/App.stories.d.ts.map +1 -0
  214. package/dist/types/src/ui/components/App/index.d.ts +2 -0
  215. package/dist/types/src/ui/components/App/index.d.ts.map +1 -0
  216. package/dist/types/src/ui/components/Placeholder/Placeholder.d.ts +64 -0
  217. package/dist/types/src/ui/components/Placeholder/Placeholder.d.ts.map +1 -0
  218. package/dist/types/src/ui/components/Placeholder/Placeholder.stories.d.ts +19 -0
  219. package/dist/types/src/ui/components/Placeholder/Placeholder.stories.d.ts.map +1 -0
  220. package/dist/types/src/ui/components/Placeholder/index.d.ts +2 -0
  221. package/dist/types/src/ui/components/Placeholder/index.d.ts.map +1 -0
  222. package/dist/types/src/{playground/playground.stories.d.ts → ui/components/PluginManager/PluginManagerContext.stories.d.ts} +5 -3
  223. package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts.map +1 -0
  224. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts +10 -0
  225. package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts.map +1 -0
  226. package/dist/types/src/ui/components/PluginManager/index.d.ts +2 -0
  227. package/dist/types/src/ui/components/PluginManager/index.d.ts.map +1 -0
  228. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts +24 -0
  229. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -0
  230. package/dist/types/src/{components/App.stories.d.ts → ui/components/Surface/SurfaceComponent.stories.d.ts} +1 -1
  231. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts.map +1 -0
  232. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts +11 -0
  233. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts.map +1 -0
  234. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts +48 -0
  235. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts.map +1 -0
  236. package/dist/types/src/ui/components/Surface/context.d.ts +5 -0
  237. package/dist/types/src/ui/components/Surface/context.d.ts.map +1 -0
  238. package/dist/types/src/ui/components/Surface/index.d.ts +36 -0
  239. package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -0
  240. package/dist/types/src/ui/components/Surface/types.d.ts +197 -0
  241. package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -0
  242. package/dist/types/src/ui/components/Surface/types.test.d.ts +2 -0
  243. package/dist/types/src/ui/components/Surface/types.test.d.ts.map +1 -0
  244. package/dist/types/src/ui/components/index.d.ts +5 -0
  245. package/dist/types/src/ui/components/index.d.ts.map +1 -0
  246. package/dist/types/src/ui/hooks/index.d.ts +7 -0
  247. package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
  248. package/dist/types/src/ui/hooks/useApp.d.ts +86 -0
  249. package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -0
  250. package/dist/types/src/ui/hooks/useApp.test.d.ts +2 -0
  251. package/dist/types/src/ui/hooks/useApp.test.d.ts.map +1 -0
  252. package/dist/types/src/ui/hooks/useCapabilities.d.ts +31 -0
  253. package/dist/types/src/ui/hooks/useCapabilities.d.ts.map +1 -0
  254. package/dist/types/src/{components → ui/hooks}/useLoading.d.ts +1 -2
  255. package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -0
  256. package/dist/types/src/ui/hooks/useProcessManagerRuntime.d.ts +30 -0
  257. package/dist/types/src/ui/hooks/useProcessManagerRuntime.d.ts.map +1 -0
  258. package/dist/types/src/ui/hooks/useSettingsState.d.ts +10 -0
  259. package/dist/types/src/ui/hooks/useSettingsState.d.ts.map +1 -0
  260. package/dist/types/src/ui/hooks/useSurface.d.ts +3 -0
  261. package/dist/types/src/ui/hooks/useSurface.d.ts.map +1 -0
  262. package/dist/types/src/ui/index.d.ts +3 -0
  263. package/dist/types/src/ui/index.d.ts.map +1 -0
  264. package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts +34 -0
  265. package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts.map +1 -0
  266. package/dist/types/src/vite-plugin/boot-loader/index.d.ts +2 -0
  267. package/dist/types/src/vite-plugin/boot-loader/index.d.ts.map +1 -0
  268. package/dist/types/src/vite-plugin/boot-loader/loader.d.ts +51 -0
  269. package/dist/types/src/vite-plugin/boot-loader/loader.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 +41 -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 +119 -56
  285. package/src/cli/cli.ts +102 -0
  286. package/src/{components → cli}/index.ts +1 -1
  287. package/src/common/activation-events.ts +39 -0
  288. package/src/{playground/layout/index.ts → common/annotations.ts} +0 -2
  289. package/src/common/capabilities.ts +287 -195
  290. package/src/common/index.ts +4 -8
  291. package/src/common/operations.ts +36 -0
  292. package/src/common/translations.ts +17 -9
  293. package/src/context.ts +9 -0
  294. package/src/core/{events.ts → activation-event.ts} +10 -7
  295. package/src/core/capability-manager.test.ts +151 -0
  296. package/src/core/capability-manager.ts +192 -0
  297. package/src/core/capability.ts +254 -0
  298. package/src/core/edge-registry-plugin-provider.ts +92 -0
  299. package/src/core/index.ts +11 -4
  300. package/src/core/plugin-asset-cache.ts +60 -0
  301. package/src/core/plugin-manager.test.ts +1899 -0
  302. package/src/core/plugin-manager.ts +1687 -0
  303. package/src/core/plugin-manifest.test.ts +75 -0
  304. package/src/core/plugin-manifest.ts +134 -0
  305. package/src/core/plugin.ts +415 -45
  306. package/src/core/registry.ts +163 -0
  307. package/src/core/url-loader.test.ts +221 -0
  308. package/src/core/url-loader.ts +388 -0
  309. package/src/index.ts +2 -4
  310. package/src/plugin-process-manager/ProcessManagerPlugin.ts +24 -0
  311. package/src/plugin-process-manager/history/capability.ts +36 -0
  312. package/src/plugin-process-manager/history/errors.ts +7 -0
  313. package/src/plugin-process-manager/history/history-tracker.test.ts +374 -0
  314. package/src/plugin-process-manager/history/history-tracker.ts +128 -0
  315. package/src/plugin-process-manager/history/index.ts +9 -0
  316. package/src/plugin-process-manager/history/types.ts +17 -0
  317. package/src/plugin-process-manager/history/undo-mapping.ts +135 -0
  318. package/src/plugin-process-manager/history/undo-registry.test.ts +72 -0
  319. package/src/plugin-process-manager/history/undo-registry.ts +54 -0
  320. package/src/plugin-process-manager/index.ts +6 -0
  321. package/src/plugin-process-manager/meta.ts +14 -0
  322. package/src/plugin-process-manager/process-manager-capability.ts +178 -0
  323. package/src/plugin-process-manager/testing.ts +155 -0
  324. package/src/testing/harness.ts +247 -0
  325. package/src/testing/index.ts +2 -0
  326. package/src/testing/react.test.tsx +48 -0
  327. package/src/testing/react.tsx +113 -0
  328. package/src/testing/service.ts +52 -0
  329. package/src/testing/withPluginManager.stories.tsx +8 -9
  330. package/src/testing/withPluginManager.tsx +73 -42
  331. package/src/ui/components/App/App.stories.tsx +86 -0
  332. package/src/ui/components/App/App.tsx +81 -0
  333. package/src/{playground/debug → ui/components/App}/index.ts +1 -1
  334. package/src/ui/components/Placeholder/Placeholder.stories.tsx +77 -0
  335. package/src/ui/components/Placeholder/Placeholder.tsx +156 -0
  336. package/src/{playground/logger → ui/components/Placeholder}/index.ts +1 -1
  337. package/src/ui/components/PluginManager/PluginManagerContext.stories.tsx +184 -0
  338. package/src/{react → ui/components/PluginManager}/PluginManagerProvider.ts +3 -3
  339. package/src/ui/components/PluginManager/index.ts +5 -0
  340. package/src/ui/components/Surface/SurfaceComponent.stories.tsx +144 -0
  341. package/src/ui/components/Surface/SurfaceComponent.tsx +303 -0
  342. package/src/ui/components/Surface/SurfaceInfo.tsx +106 -0
  343. package/src/ui/components/Surface/SurfaceProfilerContext.tsx +207 -0
  344. package/src/ui/components/Surface/context.ts +12 -0
  345. package/src/ui/components/Surface/index.ts +54 -0
  346. package/src/ui/components/Surface/types.test.ts +126 -0
  347. package/src/ui/components/Surface/types.ts +269 -0
  348. package/src/ui/components/index.ts +8 -0
  349. package/src/ui/hooks/index.ts +10 -0
  350. package/src/ui/hooks/useApp.test.tsx +159 -0
  351. package/src/ui/hooks/useApp.tsx +418 -0
  352. package/src/ui/hooks/useCapabilities.ts +68 -0
  353. package/src/{components → ui/hooks}/useLoading.tsx +16 -10
  354. package/src/ui/hooks/useProcessManagerRuntime.ts +78 -0
  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 +270 -0
  359. package/src/vite-plugin/boot-loader/boot-loader.css +320 -0
  360. package/src/vite-plugin/boot-loader/boot-loader.js +325 -0
  361. package/src/vite-plugin/boot-loader/index.ts +5 -0
  362. package/src/vite-plugin/boot-loader/loader.ts +123 -0
  363. package/src/vite-plugin/composer/index.ts +306 -0
  364. package/src/vite-plugin/import-map/index.ts +527 -0
  365. package/src/vite-plugin/index.ts +10 -0
  366. package/src/vite-plugin/manifest.test.ts +46 -0
  367. package/src/vite-plugin/manifest.ts +57 -0
  368. package/src/vite-plugin/packages.ts +187 -0
  369. package/tsconfig.json +30 -15
  370. package/tsconfig.node.json +2 -4
  371. package/typedoc.json +2 -4
  372. package/vitest.config.ts +1 -1
  373. package/.swc/plugins/linux_x86_64_19.0.0/727453fb3a62f7f1d952a41e051ca8a6f88cadc45cee43c6a4d1aa45f9b75665.wasmer-v7 +0 -0
  374. package/.swc/plugins/linux_x86_64_19.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429.wasmer-v7 +0 -0
  375. package/dist/lib/browser/app-graph-builder-LG4RG2LM.mjs +0 -138
  376. package/dist/lib/browser/app-graph-builder-LG4RG2LM.mjs.map +0 -7
  377. package/dist/lib/browser/chunk-2GRQ4QXA.mjs +0 -1646
  378. package/dist/lib/browser/chunk-2GRQ4QXA.mjs.map +0 -7
  379. package/dist/lib/browser/chunk-FRUTKCPG.mjs +0 -467
  380. package/dist/lib/browser/chunk-FRUTKCPG.mjs.map +0 -7
  381. package/dist/lib/browser/chunk-SCPE4ZO2.mjs +0 -35
  382. package/dist/lib/browser/chunk-SCPE4ZO2.mjs.map +0 -7
  383. package/dist/lib/browser/intent-dispatcher-6SHA5B3N.mjs +0 -11
  384. package/dist/lib/browser/intent-resolver-UZZ4OANZ.mjs +0 -39
  385. package/dist/lib/browser/intent-resolver-UZZ4OANZ.mjs.map +0 -7
  386. package/dist/lib/browser/store-ACBEYK4B.mjs +0 -30
  387. package/dist/lib/browser/store-ACBEYK4B.mjs.map +0 -7
  388. package/dist/lib/browser/worker.mjs +0 -77
  389. package/dist/lib/node-esm/app-graph-builder-FMHVHPWA.mjs +0 -139
  390. package/dist/lib/node-esm/app-graph-builder-FMHVHPWA.mjs.map +0 -7
  391. package/dist/lib/node-esm/chunk-CXT6CYPE.mjs +0 -468
  392. package/dist/lib/node-esm/chunk-CXT6CYPE.mjs.map +0 -7
  393. package/dist/lib/node-esm/chunk-KSPOOYT3.mjs +0 -1648
  394. package/dist/lib/node-esm/chunk-KSPOOYT3.mjs.map +0 -7
  395. package/dist/lib/node-esm/chunk-ZX63QUGE.mjs +0 -37
  396. package/dist/lib/node-esm/chunk-ZX63QUGE.mjs.map +0 -7
  397. package/dist/lib/node-esm/intent-dispatcher-SIYQ5ZIU.mjs +0 -12
  398. package/dist/lib/node-esm/intent-resolver-7FYJMXAG.mjs +0 -40
  399. package/dist/lib/node-esm/intent-resolver-7FYJMXAG.mjs.map +0 -7
  400. package/dist/lib/node-esm/store-6OBLTVXC.mjs +0 -31
  401. package/dist/lib/node-esm/store-6OBLTVXC.mjs.map +0 -7
  402. package/dist/lib/node-esm/worker.mjs +0 -78
  403. package/dist/types/src/common/collaboration.d.ts +0 -20
  404. package/dist/types/src/common/collaboration.d.ts.map +0 -1
  405. package/dist/types/src/common/events.d.ts +0 -52
  406. package/dist/types/src/common/events.d.ts.map +0 -1
  407. package/dist/types/src/common/file.d.ts +0 -14
  408. package/dist/types/src/common/file.d.ts.map +0 -1
  409. package/dist/types/src/common/graph.d.ts +0 -21
  410. package/dist/types/src/common/graph.d.ts.map +0 -1
  411. package/dist/types/src/common/layout.d.ts +0 -279
  412. package/dist/types/src/common/layout.d.ts.map +0 -1
  413. package/dist/types/src/common/surface.d.ts +0 -59
  414. package/dist/types/src/common/surface.d.ts.map +0 -1
  415. package/dist/types/src/components/App.d.ts +0 -10
  416. package/dist/types/src/components/App.d.ts.map +0 -1
  417. package/dist/types/src/components/App.stories.d.ts.map +0 -1
  418. package/dist/types/src/components/DefaultFallback.d.ts +0 -8
  419. package/dist/types/src/components/DefaultFallback.d.ts.map +0 -1
  420. package/dist/types/src/components/index.d.ts +0 -2
  421. package/dist/types/src/components/index.d.ts.map +0 -1
  422. package/dist/types/src/components/useApp.d.ts +0 -44
  423. package/dist/types/src/components/useApp.d.ts.map +0 -1
  424. package/dist/types/src/components/useLoading.d.ts.map +0 -1
  425. package/dist/types/src/core/capabilities.d.ts +0 -117
  426. package/dist/types/src/core/capabilities.d.ts.map +0 -1
  427. package/dist/types/src/core/capabilities.test.d.ts +0 -2
  428. package/dist/types/src/core/capabilities.test.d.ts.map +0 -1
  429. package/dist/types/src/core/events.d.ts.map +0 -1
  430. package/dist/types/src/core/manager.d.ts +0 -126
  431. package/dist/types/src/core/manager.d.ts.map +0 -1
  432. package/dist/types/src/core/manager.test.d.ts +0 -2
  433. package/dist/types/src/core/manager.test.d.ts.map +0 -1
  434. package/dist/types/src/playground/debug/Debug.d.ts +0 -6
  435. package/dist/types/src/playground/debug/Debug.d.ts.map +0 -1
  436. package/dist/types/src/playground/debug/index.d.ts +0 -2
  437. package/dist/types/src/playground/debug/index.d.ts.map +0 -1
  438. package/dist/types/src/playground/debug/plugin.d.ts +0 -2
  439. package/dist/types/src/playground/debug/plugin.d.ts.map +0 -1
  440. package/dist/types/src/playground/generator/Main.d.ts +0 -6
  441. package/dist/types/src/playground/generator/Main.d.ts.map +0 -1
  442. package/dist/types/src/playground/generator/Toolbar.d.ts +0 -6
  443. package/dist/types/src/playground/generator/Toolbar.d.ts.map +0 -1
  444. package/dist/types/src/playground/generator/generator.d.ts +0 -7
  445. package/dist/types/src/playground/generator/generator.d.ts.map +0 -1
  446. package/dist/types/src/playground/generator/index.d.ts +0 -3
  447. package/dist/types/src/playground/generator/index.d.ts.map +0 -1
  448. package/dist/types/src/playground/generator/plugin.d.ts +0 -2
  449. package/dist/types/src/playground/generator/plugin.d.ts.map +0 -1
  450. package/dist/types/src/playground/layout/Layout.d.ts +0 -8
  451. package/dist/types/src/playground/layout/Layout.d.ts.map +0 -1
  452. package/dist/types/src/playground/layout/index.d.ts +0 -2
  453. package/dist/types/src/playground/layout/index.d.ts.map +0 -1
  454. package/dist/types/src/playground/layout/plugin.d.ts +0 -2
  455. package/dist/types/src/playground/layout/plugin.d.ts.map +0 -1
  456. package/dist/types/src/playground/logger/Toolbar.d.ts +0 -6
  457. package/dist/types/src/playground/logger/Toolbar.d.ts.map +0 -1
  458. package/dist/types/src/playground/logger/index.d.ts +0 -2
  459. package/dist/types/src/playground/logger/index.d.ts.map +0 -1
  460. package/dist/types/src/playground/logger/plugin.d.ts +0 -2
  461. package/dist/types/src/playground/logger/plugin.d.ts.map +0 -1
  462. package/dist/types/src/playground/logger/schema.d.ts +0 -13
  463. package/dist/types/src/playground/logger/schema.d.ts.map +0 -1
  464. package/dist/types/src/playground/playground.stories.d.ts.map +0 -1
  465. package/dist/types/src/plugin-intent/IntentPlugin.d.ts +0 -2
  466. package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +0 -1
  467. package/dist/types/src/plugin-intent/actions.d.ts +0 -36
  468. package/dist/types/src/plugin-intent/actions.d.ts.map +0 -1
  469. package/dist/types/src/plugin-intent/errors.d.ts +0 -16
  470. package/dist/types/src/plugin-intent/errors.d.ts.map +0 -1
  471. package/dist/types/src/plugin-intent/index.d.ts +0 -6
  472. package/dist/types/src/plugin-intent/index.d.ts.map +0 -1
  473. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +0 -139
  474. package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +0 -1
  475. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts +0 -2
  476. package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts.map +0 -1
  477. package/dist/types/src/plugin-intent/intent.d.ts +0 -63
  478. package/dist/types/src/plugin-intent/intent.d.ts.map +0 -1
  479. package/dist/types/src/plugin-intent/meta.d.ts +0 -3
  480. package/dist/types/src/plugin-intent/meta.d.ts.map +0 -1
  481. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +0 -2
  482. package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +0 -1
  483. package/dist/types/src/plugin-settings/actions.d.ts +0 -25
  484. package/dist/types/src/plugin-settings/actions.d.ts.map +0 -1
  485. package/dist/types/src/plugin-settings/app-graph-builder.d.ts +0 -4
  486. package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +0 -1
  487. package/dist/types/src/plugin-settings/index.d.ts +0 -3
  488. package/dist/types/src/plugin-settings/index.d.ts.map +0 -1
  489. package/dist/types/src/plugin-settings/intent-resolver.d.ts +0 -4
  490. package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +0 -1
  491. package/dist/types/src/plugin-settings/meta.d.ts +0 -3
  492. package/dist/types/src/plugin-settings/meta.d.ts.map +0 -1
  493. package/dist/types/src/plugin-settings/store.d.ts +0 -5
  494. package/dist/types/src/plugin-settings/store.d.ts.map +0 -1
  495. package/dist/types/src/plugin-settings/translations.d.ts +0 -11
  496. package/dist/types/src/plugin-settings/translations.d.ts.map +0 -1
  497. package/dist/types/src/react/ErrorBoundary.d.ts +0 -30
  498. package/dist/types/src/react/ErrorBoundary.d.ts.map +0 -1
  499. package/dist/types/src/react/IntentContext.d.ts +0 -8
  500. package/dist/types/src/react/IntentContext.d.ts.map +0 -1
  501. package/dist/types/src/react/PluginManagerProvider.d.ts +0 -10
  502. package/dist/types/src/react/PluginManagerProvider.d.ts.map +0 -1
  503. package/dist/types/src/react/Surface.d.ts +0 -12
  504. package/dist/types/src/react/Surface.d.ts.map +0 -1
  505. package/dist/types/src/react/Surface.stories.d.ts +0 -17
  506. package/dist/types/src/react/Surface.stories.d.ts.map +0 -1
  507. package/dist/types/src/react/common.d.ts +0 -13
  508. package/dist/types/src/react/common.d.ts.map +0 -1
  509. package/dist/types/src/react/index.d.ts +0 -7
  510. package/dist/types/src/react/index.d.ts.map +0 -1
  511. package/dist/types/src/react/useCapabilities.d.ts +0 -13
  512. package/dist/types/src/react/useCapabilities.d.ts.map +0 -1
  513. package/dist/types/src/react/useIntentResolver.d.ts +0 -3
  514. package/dist/types/src/react/useIntentResolver.d.ts.map +0 -1
  515. package/dist/types/src/worker.d.ts +0 -4
  516. package/dist/types/src/worker.d.ts.map +0 -1
  517. package/src/common/collaboration.ts +0 -18
  518. package/src/common/events.ts +0 -79
  519. package/src/common/file.ts +0 -22
  520. package/src/common/graph.ts +0 -30
  521. package/src/common/layout.ts +0 -277
  522. package/src/common/surface.ts +0 -83
  523. package/src/components/App.stories.tsx +0 -33
  524. package/src/components/App.tsx +0 -59
  525. package/src/components/DefaultFallback.tsx +0 -26
  526. package/src/components/useApp.tsx +0 -164
  527. package/src/core/capabilities.test.ts +0 -136
  528. package/src/core/capabilities.ts +0 -259
  529. package/src/core/manager.test.ts +0 -516
  530. package/src/core/manager.ts +0 -604
  531. package/src/playground/debug/Debug.tsx +0 -39
  532. package/src/playground/debug/plugin.ts +0 -16
  533. package/src/playground/generator/Main.tsx +0 -71
  534. package/src/playground/generator/Toolbar.tsx +0 -47
  535. package/src/playground/generator/generator.ts +0 -48
  536. package/src/playground/generator/index.ts +0 -6
  537. package/src/playground/generator/plugin.ts +0 -22
  538. package/src/playground/layout/Layout.tsx +0 -33
  539. package/src/playground/layout/plugin.ts +0 -18
  540. package/src/playground/logger/Toolbar.tsx +0 -30
  541. package/src/playground/logger/plugin.ts +0 -41
  542. package/src/playground/logger/schema.ts +0 -12
  543. package/src/playground/playground.stories.tsx +0 -46
  544. package/src/plugin-intent/IntentPlugin.ts +0 -20
  545. package/src/plugin-intent/actions.ts +0 -31
  546. package/src/plugin-intent/errors.ts +0 -40
  547. package/src/plugin-intent/index.ts +0 -9
  548. package/src/plugin-intent/intent-dispatcher.test.ts +0 -286
  549. package/src/plugin-intent/intent-dispatcher.ts +0 -337
  550. package/src/plugin-intent/intent.ts +0 -154
  551. package/src/plugin-intent/meta.ts +0 -10
  552. package/src/plugin-settings/SettingsPlugin.ts +0 -34
  553. package/src/plugin-settings/actions.ts +0 -25
  554. package/src/plugin-settings/app-graph-builder.ts +0 -160
  555. package/src/plugin-settings/index.ts +0 -6
  556. package/src/plugin-settings/intent-resolver.ts +0 -35
  557. package/src/plugin-settings/meta.ts +0 -10
  558. package/src/plugin-settings/store.ts +0 -33
  559. package/src/plugin-settings/translations.ts +0 -19
  560. package/src/react/ErrorBoundary.tsx +0 -56
  561. package/src/react/IntentContext.tsx +0 -35
  562. package/src/react/Surface.stories.tsx +0 -101
  563. package/src/react/Surface.tsx +0 -86
  564. package/src/react/common.ts +0 -13
  565. package/src/react/index.ts +0 -10
  566. package/src/react/useCapabilities.ts +0 -31
  567. package/src/react/useIntentResolver.ts +0 -22
  568. package/src/worker.ts +0 -11
  569. /package/dist/lib/browser/{intent-dispatcher-6SHA5B3N.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  570. /package/dist/lib/browser/{worker.mjs.map → common/activation-events.mjs.map} +0 -0
  571. /package/dist/lib/{node-esm/intent-dispatcher-SIYQ5ZIU.mjs.map → browser/common/capabilities.mjs.map} +0 -0
  572. /package/dist/lib/{node-esm/worker.mjs.map → browser/core/activation-event.mjs.map} +0 -0
@@ -0,0 +1,320 @@
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: 1px;
37
+ --boot-loader-status-gap: 32px;
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.3;
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.5;
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.5;
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.5;
227
+ }
228
+
229
+ #boot-loader-status {
230
+ position: absolute;
231
+ top: 50%;
232
+ left: 0;
233
+ right: 0;
234
+ /*
235
+ * Sit just below the centered disc — half the disc plus the configured gap.
236
+ */
237
+ transform: translate(0, calc(var(--boot-loader-disc-size) / 2 + var(--boot-loader-status-gap)));
238
+ /*
239
+ * Slightly de-emphasised vs body text so the brand mark + ring stay the
240
+ * dominant focus, but high enough to remain legible on both light and dark
241
+ * backgrounds without a custom palette.
242
+ */
243
+ opacity: 0.5;
244
+ /*
245
+ * Terminal-style log viewport (3 rows at the default `line-height`) over
246
+ * a vertically-stacked track of every status the driver has emitted. The
247
+ * track is bottom-anchored via `justify-content: flex-end` so the newest
248
+ * line always sits on the last visible row, older lines stack above it,
249
+ * and anything that doesn't fit is clipped at the top by
250
+ * `overflow: hidden`. The driver runs a FLIP-style transform animation
251
+ * per append so each new line slides up from below the bottom edge —
252
+ * independent of any `scroll-behavior` smooth-scroll support, which
253
+ * Playwright/headless Chrome strips even from spec-compliant
254
+ * `scrollTo({ behavior: 'smooth' })` calls.
255
+ */
256
+ display: flex;
257
+ flex-direction: column;
258
+ justify-content: flex-end;
259
+ height: 4.5em;
260
+ line-height: 1.5;
261
+ letter-spacing: 0.01em;
262
+ /*
263
+ * Fixed-width digits so the `(i/n)` counter on range-bearing status
264
+ * updates ("Loading plugins (12/80)") doesn't jitter as the index
265
+ * ticks through different glyph widths.
266
+ */
267
+ font-variant-numeric: tabular-nums;
268
+ text-align: center;
269
+ overflow: hidden;
270
+ }
271
+
272
+ #boot-loader-status-fade {
273
+ position: absolute;
274
+ top: 0;
275
+ left: 0;
276
+ width: 100%;
277
+ height: 32px;
278
+ background: linear-gradient(to bottom, var(--boot-loader-bg-light, #fafafa), transparent);
279
+ z-index: 1;
280
+ }
281
+ @media (prefers-color-scheme: dark) {
282
+ #boot-loader-status-fade {
283
+ background: linear-gradient(to bottom, var(--boot-loader-bg-dark, #0a0a0a), transparent);
284
+ }
285
+ }
286
+
287
+ /*
288
+ * Track of every appended `.boot-loader-status-line`. The driver writes
289
+ * `--boot-loader-line` (0 = first line visible, 1 = second, …) on this
290
+ * element and the `transform` interpolates because `--boot-loader-line` is
291
+ * registered as a typed `<number>` custom property below.
292
+ */
293
+ #boot-loader-status-track {
294
+ display: flex;
295
+ flex-direction: column;
296
+ /*
297
+ * Resting transform is `translateY(0)` — the bottom-anchored flex
298
+ * parent already positions the newest line on the last visible row.
299
+ * On each append the driver does a one-shot FLIP: snap to
300
+ * `translateY(<lineHeight>px)` with no transition (placing the new
301
+ * line just below the viewport), force a reflow, then animate back to
302
+ * 0 so the track rises by one line-height and the new entry slides up
303
+ * into the bottom row. See `boot-loader.js`.
304
+ */
305
+ transform: translateY(0);
306
+ transition: transform 500ms ease-out;
307
+ }
308
+
309
+ /* Honour reduced-motion preferences explicitly — `transition` doesn't auto-respect it. */
310
+ @media (prefers-reduced-motion: reduce) {
311
+ #boot-loader-status-track {
312
+ transition: none;
313
+ }
314
+ }
315
+
316
+ .boot-loader-status-line {
317
+ flex: 0 0 auto;
318
+ height: 1.5em;
319
+ white-space: nowrap;
320
+ }
@@ -0,0 +1,325 @@
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
+ // The loader has two host-driven states (plus an unobserved idle state on
10
+ // script entry that's promoted automatically — there's no API to opt out of
11
+ // motion on cold load, by design):
12
+ // - State 1 (slow tick): auto-entered the moment the inline script runs;
13
+ // asymptotic creep toward `STATE_1_ASYMPTOTE`%.
14
+ // - State 2 (progress): host-driven, value supplied to `progress(fraction)`.
15
+ // The creep stays alive in state 2 too, with a
16
+ // ceiling that climbs `STATE_2_BUMP` percent ahead
17
+ // of the most recent `progress()` call (capped at
18
+ // `ABSOLUTE_CEILING`). Between sparse host updates
19
+ // the ring keeps inching forward toward that
20
+ // ceiling, so a long activation gap doesn't read
21
+ // as a frozen disc.
22
+ //
23
+ // `window.__bootLoader.status(text)` updates the visible status line.
24
+ // `window.__bootLoader.progress(fraction)` enter state 2 with `fraction` ∈ [0, 1].
25
+ // `window.__bootLoader.dismiss()` remove the loader DOM (terminal).
26
+ //
27
+ // Kept ES5-flavoured so the bundler never has to touch it.
28
+
29
+ (function () {
30
+ performance.mark('boot:html-parsed');
31
+
32
+ // Asymptotic creep — `next = raw + (ceiling - raw) * creepRate` per tick,
33
+ // so the var eases toward `ceiling` and never quite reaches it.
34
+ var CREEP_TICK_MS = 100;
35
+ // State 1 creep is a "we're alive" hint before any real progress lands,
36
+ // so it eases gently toward a low asymptote.
37
+ var STATE_1_RATE = 0.04;
38
+ var STATE_1_ASYMPTOTE = 20;
39
+ // State 2 creep bridges the gap between sparse `progress()` calls.
40
+ // Tuning is a trade-off:
41
+ // - Larger `STATE_2_RATE` → fills faster, but reaches the ceiling
42
+ // sooner and then sits idle (looks "paused").
43
+ // - Larger `STATE_2_BUMP` → ring leads further ahead of the host's
44
+ // last reported value, so subsequent host updates feel "behind"
45
+ // until they cross the lead.
46
+ // Current values aim for continuous-but-modest motion through a ~5 s
47
+ // activation silence: 50 % → ~64 % over 5 s, ceiling at host + 15 % so
48
+ // real progress can catch up via `Math.max` without big jumps.
49
+ var STATE_2_RATE = 0.05;
50
+ var STATE_2_BUMP = 15;
51
+ // Ring never auto-creeps past this — keeps the user from interpreting the
52
+ // ring as "almost done" while the host hasn't actually said so.
53
+ var ABSOLUTE_CEILING = 90;
54
+
55
+ // 0 = idle (transient — auto-promoted to 1 immediately below),
56
+ // 1 = slow tick, 2 = host-driven progress.
57
+ var state = 0;
58
+ var creepHandle = null;
59
+ var creepCeiling = STATE_1_ASYMPTOTE;
60
+ var creepRate = STATE_1_RATE;
61
+ var trace = /(?:^|[?&])trace=1(?:&|$)/.test(window.location.search);
62
+ var start = Date.now();
63
+ var last = Date.now();
64
+ var timings = [];
65
+
66
+ function ensureCreep() {
67
+ if (creepHandle != null) {
68
+ return;
69
+ }
70
+
71
+ creepHandle = setInterval(function () {
72
+ var element = document.getElementById('boot-loader-disc');
73
+ if (!element) {
74
+ return;
75
+ }
76
+ var raw = parseFloat(element.style.getPropertyValue('--boot-loader-bar-progress')) || 0;
77
+ // Already at (or above) the ceiling — nothing to do this tick.
78
+ if (raw >= creepCeiling - 0.1) {
79
+ return;
80
+ }
81
+ var next = raw + (creepCeiling - raw) * creepRate;
82
+ element.style.setProperty('--boot-loader-bar-progress', String(next));
83
+ if (next > 0 && next < 100) {
84
+ element.setAttribute('data-progress-active', '');
85
+ }
86
+ }, CREEP_TICK_MS);
87
+ }
88
+
89
+ function stopCreep() {
90
+ if (creepHandle != null) {
91
+ clearInterval(creepHandle);
92
+ creepHandle = null;
93
+ }
94
+ }
95
+
96
+ // Read the element's *current animated* translateY in pixels — the
97
+ // interpolated value mid-transition, not the property as last written.
98
+ // `getComputedStyle(...).transform` returns a `matrix(...)` /
99
+ // `matrix3d(...)` string with the live, interpolated translation.
100
+ // Used by the status FLIP so successive appends chain off the in-flight
101
+ // position instead of yanking the track back to a fixed invert target.
102
+ function readTranslateY(element) {
103
+ var computed = window.getComputedStyle(element).transform;
104
+ if (!computed || computed === 'none') {
105
+ return 0;
106
+ }
107
+ var match = computed.match(/matrix.*\(([^)]+)\)/);
108
+ if (!match) {
109
+ return 0;
110
+ }
111
+ var values = match[1].split(',');
112
+ // 2D `matrix(a, b, c, d, tx, ty)` → ty at index 5.
113
+ // 3D `matrix3d(...)` (16 entries) → ty at index 13.
114
+ if (values.length === 6) {
115
+ return parseFloat(values[5]) || 0;
116
+ }
117
+ if (values.length === 16) {
118
+ return parseFloat(values[13]) || 0;
119
+ }
120
+ return 0;
121
+ }
122
+
123
+ window.__bootLoader = {
124
+ /**
125
+ * Update the visible status line. The caller owns formatting — the
126
+ * loader just renders `humanized` and records the structured fields
127
+ * for the trace. Idempotent on the full structured payload: equal
128
+ * back-to-back updates are a no-op, but two updates with the same
129
+ * visible text and different `event` / `module` ids still produce a
130
+ * fresh trace entry so the timeline can distinguish those transitions.
131
+ *
132
+ * Payload: `{ event?, module?, humanized, range? }`.
133
+ * - `humanized`: the exact string to display (e.g. "Loading framework…",
134
+ * "Activating Observability: react-surface").
135
+ * - `event` / `module`: optional raw ids for the trace, when the
136
+ * update originates from an activation transition.
137
+ * - `range`: optional `{ index, total }` for ticking progress within
138
+ * a single phase (e.g. "Loading plugins (12/80)"). When present,
139
+ * the loader replaces the current line in place rather than
140
+ * appending a new one — so 80 plugin loads produce one trace
141
+ * entry with an updating suffix instead of 80 separate lines.
142
+ */
143
+ status: function (payload) {
144
+ if (!payload || typeof payload !== 'object') {
145
+ return;
146
+ }
147
+ var humanized = payload.humanized || '';
148
+ var event = payload.event || null;
149
+ var moduleId = payload.module || null;
150
+ var range =
151
+ payload.range && typeof payload.range.index === 'number' && typeof payload.range.total === 'number'
152
+ ? payload.range
153
+ : null;
154
+ // Display text appends the (i/n) suffix when a range is provided so
155
+ // the same `humanized` string can tick through a count without the
156
+ // caller having to format it.
157
+ var displayText = range ? humanized + ' (' + range.index + '/' + range.total + ')' : humanized;
158
+ // Compare against the previous entry's structured fields, not the
159
+ // DOM text alone — two different transitions can humanize to the same
160
+ // visible string (e.g. an event-level "Activating Foo" followed by a
161
+ // module-level "Activating Foo: react-surface" reduced to "Activating
162
+ // Foo" by a custom formatter), and the trace should still carry both.
163
+ var previous = timings.length > 0 ? timings[timings.length - 1] : null;
164
+ if (
165
+ previous &&
166
+ previous.text === displayText &&
167
+ (previous.event || null) === event &&
168
+ (previous.module || null) === moduleId
169
+ ) {
170
+ return;
171
+ }
172
+ if (range && previous) {
173
+ // Range tick — collapse into the previous trace entry instead of
174
+ // appending. The trace timeline records one transition per phase,
175
+ // not one per `(i/n)` step, keeping the boot trace compact.
176
+ previous.text = displayText;
177
+ } else {
178
+ if (previous) {
179
+ previous.duration = Date.now() - last;
180
+ }
181
+ var entry = { text: displayText };
182
+ if (event) {
183
+ entry.event = event;
184
+ }
185
+ if (moduleId) {
186
+ entry.module = moduleId;
187
+ }
188
+ timings.push(entry);
189
+ last = Date.now();
190
+ }
191
+ var element = document.getElementById('boot-loader-status');
192
+ if (!element) {
193
+ return;
194
+ }
195
+ // The track holds every appended status line. On the first
196
+ // `status()` call we hoist any pre-existing lines (the initial
197
+ // status injected by `bootLoaderPlugin`) into the track so the
198
+ // CSS `transform` translation applies uniformly.
199
+ var track = document.getElementById('boot-loader-status-track');
200
+ var lastLine = track.lastElementChild;
201
+ if (range && lastLine) {
202
+ // Range tick — replace the current visible line's text in place,
203
+ // no slide. The line keeps its position so the (i/n) counter just
204
+ // updates over the same row.
205
+ lastLine.textContent = displayText;
206
+ } else {
207
+ // Fresh phase (or first line) — append to the bottom-anchored track
208
+ // (see `#boot-loader-status`'s `justify-content: flex-end` in
209
+ // `boot-loader.css`) and run a FLIP-style slide so the new line
210
+ // rises from below the viewport's bottom edge instead of snapping
211
+ // into place. The flex layout handles which lines are visible at
212
+ // rest (newest on the last row, older lines stacked above, anything
213
+ // that overflows is clipped at the top by `overflow: hidden`), so
214
+ // this code only owns the animation.
215
+ var line = document.createElement('div');
216
+ line.className = 'boot-loader-status-line';
217
+ line.textContent = displayText;
218
+ // Read the track's current animated translateY before mutating
219
+ // anything. When a previous slide is still in flight this is
220
+ // somewhere in (0, lineHeight]; when the track is at rest it's 0.
221
+ // Reading via `getComputedStyle` (not `style.transform`) gives the
222
+ // interpolated mid-transition value, which is what the chain math
223
+ // below needs.
224
+ var currentY = readTranslateY(track);
225
+ // Measure the line height from a sibling when one exists — the
226
+ // newly appended line may not have laid out yet at the moment of
227
+ // the bounding-rect read in some engines. Pixels (not `em`) because
228
+ // some engines (and headless Chromium) don't reliably interpolate
229
+ // `transform` between `em`-valued translateY's.
230
+ var probe = track.lastElementChild;
231
+ track.appendChild(line);
232
+ var lineHeight = (probe || line).getBoundingClientRect().height || 0;
233
+ // Invert: snap the track down to `currentY + lineHeight` with no
234
+ // transition. The `+ lineHeight` is the usual FLIP offset (the
235
+ // track just grew by a row, so this keeps every existing line at
236
+ // the pixel position it had before the append). The `+ currentY`
237
+ // is the chain term — if a previous slide was still in flight we
238
+ // pin the track to its in-flight position instead of yanking it
239
+ // back to its pre-animation start, so the previous line keeps
240
+ // rising smoothly through the append rather than jumping down.
241
+ // Then force a reflow and animate to translateY(0); the track
242
+ // covers the full `currentY + lineHeight` distance in one ride
243
+ // and bursts of rapid updates read as a continuous scroll rather
244
+ // than overlapping snaps.
245
+ track.style.transition = 'none';
246
+ track.style.transform = `translateY(${currentY + lineHeight}px)`;
247
+ void track.offsetHeight;
248
+ track.style.transition = '';
249
+ track.style.transform = 'translateY(0)';
250
+ }
251
+ },
252
+
253
+ /**
254
+ * Enter state 2 (host-driven progress) — set the determinate ring to
255
+ * `fraction` ∈ [0, 1]. Invalid / negative / non-finite values clamp to
256
+ * 0 (the empty ring) rather than letting `NaN`/`Infinity` slip into
257
+ * `--boot-loader-bar-progress`, which CSS would treat as invalid and
258
+ * silently reset to the 0% var() default. The state-1 creep timer is
259
+ * left running with a new ceiling so the ring keeps inching forward
260
+ * between host updates.
261
+ *
262
+ * The ring never regresses: if the requested value is below the
263
+ * current var (e.g. the host's first call is `progress(0)` while the
264
+ * creep had already reached ~12%), the existing value is held. The
265
+ * host's progress catches up once it exceeds the held floor, so the
266
+ * ring's motion stays monotonic across the state-1 → state-2 boundary.
267
+ */
268
+ progress: function (fraction) {
269
+ state = 2;
270
+ // Set the var on the disc so both the masked ring and the orbiting
271
+ // dot (siblings inside `#boot-loader-disc`) inherit the same value.
272
+ var element = document.getElementById('boot-loader-disc');
273
+ if (!element) {
274
+ return;
275
+ }
276
+ // Flip into "host-driven" mode the first time `progress()` lands —
277
+ // CSS keys the brand mark's grayscale→color transition off this
278
+ // attribute, so the mark eases from monochrome to full palette as
279
+ // real progress starts arriving.
280
+ element.setAttribute('data-host-driven', '');
281
+ var clamped = typeof fraction !== 'number' || !isFinite(fraction) || fraction < 0 ? 0 : Math.min(1, fraction);
282
+ var requestedPct = clamped * 100;
283
+ var currentPct = parseFloat(element.style.getPropertyValue('--boot-loader-bar-progress')) || 0;
284
+ var nextPct = Math.max(currentPct, requestedPct);
285
+ element.style.setProperty('--boot-loader-bar-progress', String(nextPct));
286
+ // Switch the ongoing creep to its state-2 cadence — faster ease and
287
+ // a larger lead bump so the ring keeps moving while the host is
288
+ // silent (e.g. composer-app's "Starting Composer…" stretch while the
289
+ // first slow plugin module activates).
290
+ creepRate = STATE_2_RATE;
291
+ var newCeiling = Math.min(nextPct + STATE_2_BUMP, ABSOLUTE_CEILING);
292
+ if (newCeiling > creepCeiling) {
293
+ creepCeiling = newCeiling;
294
+ }
295
+ ensureCreep();
296
+ // Toggle the leading-edge dot only while progress is strictly in (0, 1).
297
+ if (nextPct > 0 && nextPct < 100) {
298
+ element.setAttribute('data-progress-active', '');
299
+ } else {
300
+ element.removeAttribute('data-progress-active');
301
+ }
302
+ },
303
+
304
+ dismiss: function () {
305
+ stopCreep();
306
+ var element = document.getElementById('boot-loader');
307
+ if (element && element.parentNode) {
308
+ element.parentNode.removeChild(element);
309
+ }
310
+
311
+ if (trace) {
312
+ if (timings.length > 0) {
313
+ timings[timings.length - 1].duration = Date.now() - last;
314
+ }
315
+ console.log(JSON.stringify({ total: Date.now() - start, timings }, null, 2));
316
+ }
317
+ },
318
+ };
319
+
320
+ // Auto-promote idle → slow tick the moment this inline script executes,
321
+ // so the disc starts moving on the very first frame the loader paints.
322
+ // The host calls `progress()` later to take over.
323
+ state = 1;
324
+ ensureCreep();
325
+ })();
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export * from './loader';