@dxos/app-framework 0.8.4-main.40e3dcdf1b → 0.8.4-main.43cb759274

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 (389) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/browser/{capability-LF3OXSCV.mjs → capability-JCUNWZ66.mjs} +12 -11
  4. package/dist/lib/browser/capability-JCUNWZ66.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-WEBSGU5L.mjs → chunk-2ZIYRDAF.mjs} +20 -5
  6. package/dist/lib/browser/chunk-2ZIYRDAF.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-5GY3YOEL.mjs +28 -0
  8. package/dist/lib/browser/chunk-5GY3YOEL.mjs.map +7 -0
  9. package/dist/lib/browser/{chunk-272IPLHQ.mjs → chunk-66IXTIVK.mjs} +3 -2
  10. package/dist/lib/browser/chunk-66IXTIVK.mjs.map +7 -0
  11. package/dist/lib/browser/chunk-7MBI66M7.mjs +587 -0
  12. package/dist/lib/browser/chunk-7MBI66M7.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-BMLCIFZW.mjs +1467 -0
  14. package/dist/lib/browser/chunk-BMLCIFZW.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-7M4467QR.mjs → chunk-DC3WRPBV.mjs} +100 -18
  16. package/dist/lib/browser/chunk-DC3WRPBV.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-JGWCBVKJ.mjs → chunk-E5DTDNDY.mjs} +28 -55
  18. package/dist/lib/browser/chunk-E5DTDNDY.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-TGX63LTL.mjs → chunk-FJ4765WW.mjs} +1 -1
  20. package/dist/lib/browser/{chunk-TGX63LTL.mjs.map → chunk-FJ4765WW.mjs.map} +2 -2
  21. package/dist/lib/browser/chunk-FO3IYSLV.mjs +68 -0
  22. package/dist/lib/browser/chunk-FO3IYSLV.mjs.map +7 -0
  23. package/dist/lib/browser/{chunk-YNFPIQGB.mjs → chunk-IW44C7UL.mjs} +9 -2
  24. package/dist/lib/browser/chunk-IW44C7UL.mjs.map +7 -0
  25. package/dist/lib/browser/chunk-KZUDO43J.mjs +422 -0
  26. package/dist/lib/browser/chunk-KZUDO43J.mjs.map +7 -0
  27. package/dist/lib/browser/chunk-Q2GLJTVV.mjs +12 -0
  28. package/dist/lib/browser/chunk-Q2GLJTVV.mjs.map +7 -0
  29. package/dist/lib/browser/chunk-VBG5F5UF.mjs +476 -0
  30. package/dist/lib/browser/chunk-VBG5F5UF.mjs.map +7 -0
  31. package/dist/lib/browser/cli/index.mjs +15 -30
  32. package/dist/lib/browser/cli/index.mjs.map +3 -3
  33. package/dist/lib/browser/common/activation-events.mjs +11 -14
  34. package/dist/lib/browser/common/capabilities.mjs +19 -8
  35. package/dist/lib/browser/core/activation-event.mjs +1 -1
  36. package/dist/lib/browser/core/capability.mjs +5 -1
  37. package/dist/lib/browser/core/plugin-manager.mjs +8 -4
  38. package/dist/lib/browser/core/plugin.mjs +18 -4
  39. package/dist/lib/browser/core/url-loader.mjs +24 -0
  40. package/dist/lib/browser/index.mjs +51 -54
  41. package/dist/lib/browser/index.mjs.map +4 -4
  42. package/dist/lib/browser/meta.json +1 -1
  43. package/dist/lib/browser/process-manager-capability-4FUA4TRP.mjs +89 -0
  44. package/dist/lib/browser/process-manager-capability-4FUA4TRP.mjs.map +7 -0
  45. package/dist/lib/browser/testing/index.mjs +198 -54
  46. package/dist/lib/browser/testing/index.mjs.map +4 -4
  47. package/dist/lib/browser/testing/react.mjs +78 -0
  48. package/dist/lib/browser/testing/react.mjs.map +7 -0
  49. package/dist/lib/browser/ui/index.mjs +22 -15
  50. package/dist/lib/node-esm/{capability-SA6LPYGL.mjs → capability-7TCQK7ZP.mjs} +12 -11
  51. package/dist/lib/node-esm/capability-7TCQK7ZP.mjs.map +7 -0
  52. package/dist/lib/node-esm/{chunk-FKE4Z3D6.mjs → chunk-37Z53PXZ.mjs} +1 -1
  53. package/dist/lib/node-esm/{chunk-FKE4Z3D6.mjs.map → chunk-37Z53PXZ.mjs.map} +2 -2
  54. package/dist/lib/node-esm/chunk-4BX2AE47.mjs +1468 -0
  55. package/dist/lib/node-esm/chunk-4BX2AE47.mjs.map +7 -0
  56. package/dist/lib/node-esm/{chunk-SB5ODNPX.mjs → chunk-CTKEZHKF.mjs} +9 -2
  57. package/dist/lib/node-esm/chunk-CTKEZHKF.mjs.map +7 -0
  58. package/dist/lib/node-esm/chunk-FPW45EZH.mjs +14 -0
  59. package/dist/lib/node-esm/chunk-FPW45EZH.mjs.map +7 -0
  60. package/dist/lib/node-esm/chunk-GEWHMHM7.mjs +588 -0
  61. package/dist/lib/node-esm/chunk-GEWHMHM7.mjs.map +7 -0
  62. package/dist/lib/node-esm/chunk-KFZEB6BV.mjs +29 -0
  63. package/dist/lib/node-esm/chunk-KFZEB6BV.mjs.map +7 -0
  64. package/dist/lib/node-esm/{chunk-3D66SZHP.mjs → chunk-KSH4OVMY.mjs} +28 -55
  65. package/dist/lib/node-esm/chunk-KSH4OVMY.mjs.map +7 -0
  66. package/dist/lib/node-esm/{chunk-SQICGJBW.mjs → chunk-QBUGLR4H.mjs} +20 -5
  67. package/dist/lib/node-esm/chunk-QBUGLR4H.mjs.map +7 -0
  68. package/dist/lib/node-esm/chunk-WK7OIQKI.mjs +70 -0
  69. package/dist/lib/node-esm/chunk-WK7OIQKI.mjs.map +7 -0
  70. package/dist/lib/node-esm/chunk-XGBUKRCK.mjs +423 -0
  71. package/dist/lib/node-esm/chunk-XGBUKRCK.mjs.map +7 -0
  72. package/dist/lib/node-esm/{chunk-JHFY3HTS.mjs → chunk-XIGPWXCQ.mjs} +100 -18
  73. package/dist/lib/node-esm/chunk-XIGPWXCQ.mjs.map +7 -0
  74. package/dist/lib/node-esm/{chunk-6REV5DE7.mjs → chunk-XOCUANHO.mjs} +3 -2
  75. package/dist/lib/node-esm/chunk-XOCUANHO.mjs.map +7 -0
  76. package/dist/lib/node-esm/chunk-Y7JKXNDU.mjs +477 -0
  77. package/dist/lib/node-esm/chunk-Y7JKXNDU.mjs.map +7 -0
  78. package/dist/lib/node-esm/cli/index.mjs +15 -30
  79. package/dist/lib/node-esm/cli/index.mjs.map +3 -3
  80. package/dist/lib/node-esm/common/activation-events.mjs +11 -14
  81. package/dist/lib/node-esm/common/capabilities.mjs +19 -8
  82. package/dist/lib/node-esm/core/activation-event.mjs +1 -1
  83. package/dist/lib/node-esm/core/capability.mjs +5 -1
  84. package/dist/lib/node-esm/core/plugin-manager.mjs +8 -4
  85. package/dist/lib/node-esm/core/plugin.mjs +18 -4
  86. package/dist/lib/node-esm/core/url-loader.mjs +25 -0
  87. package/dist/lib/node-esm/index.mjs +51 -54
  88. package/dist/lib/node-esm/index.mjs.map +4 -4
  89. package/dist/lib/node-esm/meta.json +1 -1
  90. package/dist/lib/node-esm/process-manager-capability-F23D62RN.mjs +90 -0
  91. package/dist/lib/node-esm/process-manager-capability-F23D62RN.mjs.map +7 -0
  92. package/dist/lib/node-esm/testing/index.mjs +198 -54
  93. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  94. package/dist/lib/node-esm/testing/react.mjs +79 -0
  95. package/dist/lib/node-esm/testing/react.mjs.map +7 -0
  96. package/dist/lib/node-esm/ui/index.mjs +22 -15
  97. package/dist/plugin/node-esm/index.mjs +971 -0
  98. package/dist/plugin/node-esm/index.mjs.map +7 -0
  99. package/dist/plugin/node-esm/meta.json +1 -0
  100. package/dist/types/src/cli/cli.d.ts +1 -3
  101. package/dist/types/src/cli/cli.d.ts.map +1 -1
  102. package/dist/types/src/common/activation-events.d.ts +10 -13
  103. package/dist/types/src/common/activation-events.d.ts.map +1 -1
  104. package/dist/types/src/common/annotations.d.ts +1 -0
  105. package/dist/types/src/common/annotations.d.ts.map +1 -0
  106. package/dist/types/src/common/capabilities.d.ts +113 -12
  107. package/dist/types/src/common/capabilities.d.ts.map +1 -1
  108. package/dist/types/src/common/index.d.ts +0 -1
  109. package/dist/types/src/common/index.d.ts.map +1 -1
  110. package/dist/types/src/common/translations.d.ts +1 -1
  111. package/dist/types/src/core/activation-event.d.ts +4 -4
  112. package/dist/types/src/core/activation-event.d.ts.map +1 -1
  113. package/dist/types/src/core/capability-manager.d.ts +9 -0
  114. package/dist/types/src/core/capability-manager.d.ts.map +1 -1
  115. package/dist/types/src/core/capability.d.ts +13 -2
  116. package/dist/types/src/core/capability.d.ts.map +1 -1
  117. package/dist/types/src/core/edge-registry-plugin-provider.d.ts +30 -0
  118. package/dist/types/src/core/edge-registry-plugin-provider.d.ts.map +1 -0
  119. package/dist/types/src/core/index.d.ts +6 -0
  120. package/dist/types/src/core/index.d.ts.map +1 -1
  121. package/dist/types/src/core/plugin-asset-cache.d.ts +71 -0
  122. package/dist/types/src/core/plugin-asset-cache.d.ts.map +1 -0
  123. package/dist/types/src/core/plugin-manager.d.ts +238 -7
  124. package/dist/types/src/core/plugin-manager.d.ts.map +1 -1
  125. package/dist/types/src/core/plugin-manifest.d.ts +101 -0
  126. package/dist/types/src/core/plugin-manifest.d.ts.map +1 -0
  127. package/dist/types/src/core/plugin-manifest.test.d.ts +2 -0
  128. package/dist/types/src/core/plugin-manifest.test.d.ts.map +1 -0
  129. package/dist/types/src/core/plugin.d.ts +213 -11
  130. package/dist/types/src/core/plugin.d.ts.map +1 -1
  131. package/dist/types/src/core/registry.d.ts +107 -0
  132. package/dist/types/src/core/registry.d.ts.map +1 -0
  133. package/dist/types/src/core/url-loader.d.ts +127 -0
  134. package/dist/types/src/core/url-loader.d.ts.map +1 -0
  135. package/dist/types/src/core/url-loader.test.d.ts +2 -0
  136. package/dist/types/src/core/url-loader.test.d.ts.map +1 -0
  137. package/dist/types/src/helpers.d.ts.map +1 -1
  138. package/dist/types/src/index.d.ts +1 -2
  139. package/dist/types/src/index.d.ts.map +1 -1
  140. package/dist/types/src/plugin-process-manager/ProcessManagerPlugin.d.ts +3 -0
  141. package/dist/types/src/plugin-process-manager/ProcessManagerPlugin.d.ts.map +1 -0
  142. package/dist/types/src/plugin-process-manager/history/capability.d.ts.map +1 -0
  143. package/dist/types/src/plugin-process-manager/history/errors.d.ts +32 -0
  144. package/dist/types/src/plugin-process-manager/history/errors.d.ts.map +1 -0
  145. package/dist/types/src/plugin-process-manager/history/history-tracker.d.ts +32 -0
  146. package/dist/types/src/plugin-process-manager/history/history-tracker.d.ts.map +1 -0
  147. package/dist/types/src/plugin-process-manager/history/history-tracker.test.d.ts.map +1 -0
  148. package/dist/types/src/plugin-process-manager/history/index.d.ts.map +1 -0
  149. package/dist/types/src/{plugin-operation → plugin-process-manager}/history/types.d.ts +1 -1
  150. package/dist/types/src/plugin-process-manager/history/types.d.ts.map +1 -0
  151. package/dist/types/src/{plugin-operation → plugin-process-manager}/history/undo-mapping.d.ts +2 -2
  152. package/dist/types/src/plugin-process-manager/history/undo-mapping.d.ts.map +1 -0
  153. package/dist/types/src/{plugin-operation → plugin-process-manager}/history/undo-registry.d.ts +1 -1
  154. package/dist/types/src/plugin-process-manager/history/undo-registry.d.ts.map +1 -0
  155. package/dist/types/src/plugin-process-manager/history/undo-registry.test.d.ts.map +1 -0
  156. package/dist/types/src/plugin-process-manager/index.d.ts +3 -0
  157. package/dist/types/src/plugin-process-manager/index.d.ts.map +1 -0
  158. package/dist/types/src/plugin-process-manager/meta.d.ts +3 -0
  159. package/dist/types/src/plugin-process-manager/meta.d.ts.map +1 -0
  160. package/dist/types/src/plugin-process-manager/process-manager-capability.d.ts +8 -0
  161. package/dist/types/src/plugin-process-manager/process-manager-capability.d.ts.map +1 -0
  162. package/dist/types/src/plugin-process-manager/testing.d.ts +59 -0
  163. package/dist/types/src/plugin-process-manager/testing.d.ts.map +1 -0
  164. package/dist/types/src/testing/harness.d.ts +79 -0
  165. package/dist/types/src/testing/harness.d.ts.map +1 -0
  166. package/dist/types/src/testing/index.d.ts +1 -0
  167. package/dist/types/src/testing/index.d.ts.map +1 -1
  168. package/dist/types/src/testing/react.d.ts +27 -0
  169. package/dist/types/src/testing/react.d.ts.map +1 -0
  170. package/dist/types/src/testing/react.test.d.ts +2 -0
  171. package/dist/types/src/testing/react.test.d.ts.map +1 -0
  172. package/dist/types/src/testing/service.d.ts.map +1 -1
  173. package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
  174. package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
  175. package/dist/types/src/ui/components/App/App.d.ts +36 -3
  176. package/dist/types/src/ui/components/App/App.d.ts.map +1 -1
  177. package/dist/types/src/ui/components/App/App.stories.d.ts +2 -2
  178. package/dist/types/src/ui/components/App/App.stories.d.ts.map +1 -1
  179. package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts.map +1 -1
  180. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts +16 -4
  181. package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -1
  182. package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts.map +1 -1
  183. package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts.map +1 -1
  184. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts +48 -0
  185. package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts.map +1 -0
  186. package/dist/types/src/ui/components/Surface/index.d.ts +22 -6
  187. package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -1
  188. package/dist/types/src/ui/components/Surface/types.d.ts +110 -9
  189. package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -1
  190. package/dist/types/src/ui/components/Surface/types.test.d.ts +2 -0
  191. package/dist/types/src/ui/components/Surface/types.test.d.ts.map +1 -0
  192. package/dist/types/src/ui/hooks/index.d.ts +1 -1
  193. package/dist/types/src/ui/hooks/index.d.ts.map +1 -1
  194. package/dist/types/src/ui/hooks/useApp.d.ts +42 -12
  195. package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -1
  196. package/dist/types/src/ui/hooks/useApp.test.d.ts +2 -0
  197. package/dist/types/src/ui/hooks/useApp.test.d.ts.map +1 -0
  198. package/dist/types/src/ui/hooks/useCapabilities.d.ts.map +1 -1
  199. package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -1
  200. package/dist/types/src/ui/hooks/useProcessManagerRuntime.d.ts +30 -0
  201. package/dist/types/src/ui/hooks/useProcessManagerRuntime.d.ts.map +1 -0
  202. package/dist/types/src/ui/hooks/useSettingsState.d.ts.map +1 -1
  203. package/dist/types/src/vite-plugin/boot-loader/index.d.ts +2 -0
  204. package/dist/types/src/vite-plugin/boot-loader/index.d.ts.map +1 -0
  205. package/dist/types/src/vite-plugin/boot-loader/loader.d.ts +54 -0
  206. package/dist/types/src/vite-plugin/boot-loader/loader.d.ts.map +1 -0
  207. package/dist/types/src/vite-plugin/composer/index.d.ts +34 -0
  208. package/dist/types/src/vite-plugin/composer/index.d.ts.map +1 -0
  209. package/dist/types/src/vite-plugin/import-map/index.d.ts +28 -0
  210. package/dist/types/src/vite-plugin/import-map/index.d.ts.map +1 -0
  211. package/dist/types/src/vite-plugin/index.d.ts +5 -0
  212. package/dist/types/src/vite-plugin/index.d.ts.map +1 -0
  213. package/dist/types/src/vite-plugin/manifest.d.ts +41 -0
  214. package/dist/types/src/vite-plugin/manifest.d.ts.map +1 -0
  215. package/dist/types/src/vite-plugin/manifest.test.d.ts +2 -0
  216. package/dist/types/src/vite-plugin/manifest.test.d.ts.map +1 -0
  217. package/dist/types/src/vite-plugin/packages.d.ts +13 -0
  218. package/dist/types/src/vite-plugin/packages.d.ts.map +1 -0
  219. package/dist/types/tsconfig.tsbuildinfo +1 -1
  220. package/moon.yml +15 -0
  221. package/package.json +61 -57
  222. package/src/cli/cli.ts +2 -7
  223. package/src/common/activation-events.ts +10 -15
  224. package/src/common/annotations.ts +3 -0
  225. package/src/common/capabilities.ts +147 -16
  226. package/src/common/index.ts +0 -1
  227. package/src/common/translations.ts +1 -1
  228. package/src/core/activation-event.ts +4 -1
  229. package/src/core/capability-manager.test.ts +4 -1
  230. package/src/core/capability-manager.ts +44 -2
  231. package/src/core/capability.ts +20 -2
  232. package/src/core/edge-registry-plugin-provider.ts +92 -0
  233. package/src/core/index.ts +6 -0
  234. package/src/core/plugin-asset-cache.ts +60 -0
  235. package/src/core/plugin-manager.test.ts +1103 -19
  236. package/src/core/plugin-manager.ts +1176 -199
  237. package/src/core/plugin-manifest.test.ts +75 -0
  238. package/src/core/plugin-manifest.ts +134 -0
  239. package/src/core/plugin.ts +235 -17
  240. package/src/core/registry.ts +163 -0
  241. package/src/core/url-loader.test.ts +222 -0
  242. package/src/core/url-loader.ts +388 -0
  243. package/src/index.ts +1 -2
  244. package/src/plugin-process-manager/ProcessManagerPlugin.ts +24 -0
  245. package/src/{plugin-operation → plugin-process-manager}/history/capability.ts +1 -2
  246. package/src/plugin-process-manager/history/errors.ts +7 -0
  247. package/src/{plugin-operation → plugin-process-manager}/history/history-tracker.test.ts +61 -88
  248. package/src/{plugin-operation → plugin-process-manager}/history/history-tracker.ts +33 -18
  249. package/src/{plugin-operation → plugin-process-manager}/history/types.ts +1 -1
  250. package/src/{plugin-operation → plugin-process-manager}/history/undo-mapping.ts +2 -2
  251. package/src/{plugin-operation → plugin-process-manager}/history/undo-registry.test.ts +6 -5
  252. package/src/{plugin-operation → plugin-process-manager}/history/undo-registry.ts +1 -1
  253. package/src/{plugin-operation → plugin-process-manager}/index.ts +1 -1
  254. package/src/plugin-process-manager/meta.ts +16 -0
  255. package/src/plugin-process-manager/process-manager-capability.ts +178 -0
  256. package/src/{plugin-operation → plugin-process-manager}/testing.ts +32 -50
  257. package/src/testing/harness.ts +247 -0
  258. package/src/testing/index.ts +1 -0
  259. package/src/testing/react.test.tsx +50 -0
  260. package/src/testing/react.tsx +113 -0
  261. package/src/testing/service.ts +2 -2
  262. package/src/testing/withPluginManager.stories.tsx +1 -2
  263. package/src/testing/withPluginManager.tsx +47 -21
  264. package/src/ui/components/App/App.stories.tsx +12 -20
  265. package/src/ui/components/App/App.tsx +97 -10
  266. package/src/ui/components/PluginManager/PluginManagerContext.stories.tsx +13 -17
  267. package/src/ui/components/Surface/SurfaceComponent.stories.tsx +17 -16
  268. package/src/ui/components/Surface/SurfaceComponent.tsx +111 -55
  269. package/src/ui/components/Surface/SurfaceInfo.tsx +0 -1
  270. package/src/ui/components/Surface/SurfaceProfilerContext.tsx +207 -0
  271. package/src/ui/components/Surface/index.ts +35 -1
  272. package/src/ui/components/Surface/types.test.ts +126 -0
  273. package/src/ui/components/Surface/types.ts +185 -12
  274. package/src/ui/hooks/index.ts +1 -1
  275. package/src/ui/hooks/useApp.test.tsx +161 -0
  276. package/src/ui/hooks/useApp.tsx +215 -24
  277. package/src/ui/hooks/useCapabilities.ts +1 -0
  278. package/src/ui/hooks/useLoading.tsx +14 -6
  279. package/src/ui/hooks/useProcessManagerRuntime.ts +78 -0
  280. package/src/vite-plugin/boot-loader/BootLoader.solid-stories.tsx +198 -0
  281. package/src/vite-plugin/boot-loader/index.ts +5 -0
  282. package/src/vite-plugin/boot-loader/loader-app/Loader.tsx +166 -0
  283. package/src/vite-plugin/boot-loader/loader-app/boot-loader.css +311 -0
  284. package/src/vite-plugin/boot-loader/loader-app/bridge.ts +25 -0
  285. package/src/vite-plugin/boot-loader/loader-app/entry.tsx +21 -0
  286. package/src/vite-plugin/boot-loader/loader-app/mount.tsx +70 -0
  287. package/src/vite-plugin/boot-loader/loader-app/store.test.ts +137 -0
  288. package/src/vite-plugin/boot-loader/loader-app/store.ts +149 -0
  289. package/src/vite-plugin/boot-loader/loader-app/tsconfig.json +11 -0
  290. package/src/vite-plugin/boot-loader/loader-app/types.ts +78 -0
  291. package/src/vite-plugin/boot-loader/loader.ts +193 -0
  292. package/src/vite-plugin/composer/index.ts +306 -0
  293. package/src/vite-plugin/import-map/index.ts +527 -0
  294. package/src/vite-plugin/index.ts +10 -0
  295. package/src/vite-plugin/manifest.test.ts +55 -0
  296. package/src/vite-plugin/manifest.ts +63 -0
  297. package/src/vite-plugin/packages.ts +187 -0
  298. package/tsconfig.json +26 -3
  299. package/tsconfig.node.json +1 -1
  300. package/vitest.config.ts +1 -1
  301. package/.swc/plugins/linux_x86_64_19.0.0/727453fb3a62f7f1d952a41e051ca8a6f88cadc45cee43c6a4d1aa45f9b75665.wasmer-v7 +0 -0
  302. package/dist/lib/browser/capability-6YMUBS54.mjs +0 -37
  303. package/dist/lib/browser/capability-6YMUBS54.mjs.map +0 -7
  304. package/dist/lib/browser/capability-LF3OXSCV.mjs.map +0 -7
  305. package/dist/lib/browser/chunk-272IPLHQ.mjs.map +0 -7
  306. package/dist/lib/browser/chunk-2UI6ACB5.mjs +0 -824
  307. package/dist/lib/browser/chunk-2UI6ACB5.mjs.map +0 -7
  308. package/dist/lib/browser/chunk-7M4467QR.mjs.map +0 -7
  309. package/dist/lib/browser/chunk-JGWCBVKJ.mjs.map +0 -7
  310. package/dist/lib/browser/chunk-M5IC326L.mjs +0 -34
  311. package/dist/lib/browser/chunk-M5IC326L.mjs.map +0 -7
  312. package/dist/lib/browser/chunk-NQPYE365.mjs +0 -703
  313. package/dist/lib/browser/chunk-NQPYE365.mjs.map +0 -7
  314. package/dist/lib/browser/chunk-TIEBZMTF.mjs +0 -44
  315. package/dist/lib/browser/chunk-TIEBZMTF.mjs.map +0 -7
  316. package/dist/lib/browser/chunk-WEBSGU5L.mjs.map +0 -7
  317. package/dist/lib/browser/chunk-YAFEA4GV.mjs +0 -1
  318. package/dist/lib/browser/chunk-YNFPIQGB.mjs.map +0 -7
  319. package/dist/lib/browser/invoker-capability-4AUGUMM5.mjs +0 -36
  320. package/dist/lib/browser/invoker-capability-4AUGUMM5.mjs.map +0 -7
  321. package/dist/lib/node-esm/capability-R5O2OYX4.mjs +0 -38
  322. package/dist/lib/node-esm/capability-R5O2OYX4.mjs.map +0 -7
  323. package/dist/lib/node-esm/capability-SA6LPYGL.mjs.map +0 -7
  324. package/dist/lib/node-esm/chunk-3D66SZHP.mjs.map +0 -7
  325. package/dist/lib/node-esm/chunk-6REV5DE7.mjs.map +0 -7
  326. package/dist/lib/node-esm/chunk-FHWPWQRJ.mjs +0 -704
  327. package/dist/lib/node-esm/chunk-FHWPWQRJ.mjs.map +0 -7
  328. package/dist/lib/node-esm/chunk-JHFY3HTS.mjs.map +0 -7
  329. package/dist/lib/node-esm/chunk-JIVXIJ2T.mjs +0 -825
  330. package/dist/lib/node-esm/chunk-JIVXIJ2T.mjs.map +0 -7
  331. package/dist/lib/node-esm/chunk-NHXBSAQR.mjs +0 -35
  332. package/dist/lib/node-esm/chunk-NHXBSAQR.mjs.map +0 -7
  333. package/dist/lib/node-esm/chunk-SB5ODNPX.mjs.map +0 -7
  334. package/dist/lib/node-esm/chunk-SCDGIGGU.mjs +0 -45
  335. package/dist/lib/node-esm/chunk-SCDGIGGU.mjs.map +0 -7
  336. package/dist/lib/node-esm/chunk-SQICGJBW.mjs.map +0 -7
  337. package/dist/lib/node-esm/chunk-Z4TJPSMP.mjs +0 -2
  338. package/dist/lib/node-esm/invoker-capability-3YDIVDWV.mjs +0 -37
  339. package/dist/lib/node-esm/invoker-capability-3YDIVDWV.mjs.map +0 -7
  340. package/dist/types/src/common/operations.d.ts +0 -33
  341. package/dist/types/src/common/operations.d.ts.map +0 -1
  342. package/dist/types/src/plugin-operation/OperationPlugin.d.ts +0 -3
  343. package/dist/types/src/plugin-operation/OperationPlugin.d.ts.map +0 -1
  344. package/dist/types/src/plugin-operation/history/capability.d.ts.map +0 -1
  345. package/dist/types/src/plugin-operation/history/errors.d.ts +0 -5
  346. package/dist/types/src/plugin-operation/history/errors.d.ts.map +0 -1
  347. package/dist/types/src/plugin-operation/history/history-tracker.d.ts +0 -18
  348. package/dist/types/src/plugin-operation/history/history-tracker.d.ts.map +0 -1
  349. package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts.map +0 -1
  350. package/dist/types/src/plugin-operation/history/index.d.ts.map +0 -1
  351. package/dist/types/src/plugin-operation/history/types.d.ts.map +0 -1
  352. package/dist/types/src/plugin-operation/history/undo-mapping.d.ts.map +0 -1
  353. package/dist/types/src/plugin-operation/history/undo-registry.d.ts.map +0 -1
  354. package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts.map +0 -1
  355. package/dist/types/src/plugin-operation/index.d.ts +0 -3
  356. package/dist/types/src/plugin-operation/index.d.ts.map +0 -1
  357. package/dist/types/src/plugin-operation/invoker-capability.d.ts +0 -6
  358. package/dist/types/src/plugin-operation/invoker-capability.d.ts.map +0 -1
  359. package/dist/types/src/plugin-operation/meta.d.ts +0 -3
  360. package/dist/types/src/plugin-operation/meta.d.ts.map +0 -1
  361. package/dist/types/src/plugin-operation/testing.d.ts +0 -109
  362. package/dist/types/src/plugin-operation/testing.d.ts.map +0 -1
  363. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts +0 -3
  364. package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts.map +0 -1
  365. package/dist/types/src/plugin-runtime/capability.d.ts +0 -6
  366. package/dist/types/src/plugin-runtime/capability.d.ts.map +0 -1
  367. package/dist/types/src/plugin-runtime/index.d.ts +0 -2
  368. package/dist/types/src/plugin-runtime/index.d.ts.map +0 -1
  369. package/dist/types/src/plugin-runtime/meta.d.ts +0 -3
  370. package/dist/types/src/plugin-runtime/meta.d.ts.map +0 -1
  371. package/dist/types/src/ui/hooks/useOperationResolver.d.ts +0 -19
  372. package/dist/types/src/ui/hooks/useOperationResolver.d.ts.map +0 -1
  373. package/src/common/operations.ts +0 -38
  374. package/src/plugin-operation/OperationPlugin.ts +0 -25
  375. package/src/plugin-operation/history/errors.ts +0 -11
  376. package/src/plugin-operation/invoker-capability.ts +0 -40
  377. package/src/plugin-operation/meta.ts +0 -11
  378. package/src/plugin-runtime/RuntimePlugin.ts +0 -20
  379. package/src/plugin-runtime/capability.ts +0 -53
  380. package/src/plugin-runtime/index.ts +0 -5
  381. package/src/plugin-runtime/meta.ts +0 -11
  382. package/src/ui/hooks/useOperationResolver.ts +0 -40
  383. /package/dist/lib/browser/{chunk-YAFEA4GV.mjs.map → core/url-loader.mjs.map} +0 -0
  384. /package/dist/lib/node-esm/{chunk-Z4TJPSMP.mjs.map → core/url-loader.mjs.map} +0 -0
  385. /package/dist/types/src/{plugin-operation → plugin-process-manager}/history/capability.d.ts +0 -0
  386. /package/dist/types/src/{plugin-operation → plugin-process-manager}/history/history-tracker.test.d.ts +0 -0
  387. /package/dist/types/src/{plugin-operation → plugin-process-manager}/history/index.d.ts +0 -0
  388. /package/dist/types/src/{plugin-operation → plugin-process-manager}/history/undo-registry.test.d.ts +0 -0
  389. /package/src/{plugin-operation → plugin-process-manager}/history/index.ts +0 -0
@@ -0,0 +1,198 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { createSignal, onCleanup, onMount } from 'solid-js';
6
+ import { type Meta, type StoryObj } from 'storybook-solidjs-vite';
7
+
8
+ import bootLoaderCss from './loader-app/boot-loader.css?raw';
9
+ import { mountLoader } from './loader-app/mount';
10
+
11
+ //
12
+ // Development surface for the boot loader. Mounts the *real* Solid `Loader`
13
+ // (via `mountLoader` — the same entry the inlined production bundle runs) into a
14
+ // `#boot-loader` backdrop, then drives it through `window.__bootLoader` exactly
15
+ // as the host app does. There is no reconstruction of the loader DOM, so the
16
+ // story and production cannot drift. Iterate the loader's look here with HMR.
17
+ //
18
+
19
+ /**
20
+ * Inlined snapshot of `packages/ui/brand/assets/icons/composer-icon.svg` — keeps
21
+ * the story self-contained (production pipes the same file in via the plugin's
22
+ * `markSvg` option) while previewing the real brand palette.
23
+ */
24
+ const COMPOSER_MARK = `
25
+ <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;">
26
+ <g transform="matrix(0.969697,0,0,1,-570.182,0)">
27
+ <rect x="588" y="0" width="264" height="256" style="fill:none;"/>
28
+ <g transform="matrix(0.917198,0,0,1,-223.93,-876)">
29
+ <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);"/>
30
+ </g>
31
+ <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);"/>
32
+ <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);"/>
33
+ <g transform="matrix(1.03125,0,0,1,588,0)">
34
+ <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);"/>
35
+ </g>
36
+ </g>
37
+ </svg>
38
+ `;
39
+
40
+ /** Approximate plugin count for the simulation (production count is dynamic). */
41
+ const STORY_PLUGIN_COUNT = 80;
42
+ /** Tick interval for the determinate-progress simulation, in ms. */
43
+ const STORY_TICK_MS = 50;
44
+
45
+ type SimState = 'creep' | 'progress' | 'done';
46
+
47
+ /**
48
+ * Harness component: owns the `#boot-loader` backdrop, mounts the real loader,
49
+ * and emits `__bootLoader` calls to simulate the host. The driver is the source
50
+ * of truth — there is no React/Solid shadow of its progress.
51
+ */
52
+ const LoaderHarness = () => {
53
+ let container!: HTMLDivElement;
54
+ let styleEl: HTMLStyleElement | undefined;
55
+ let dispose: (() => void) | undefined;
56
+ let timer: ReturnType<typeof setInterval> | undefined;
57
+ const [sim, setSim] = createSignal<SimState>('creep');
58
+
59
+ const teardown = () => {
60
+ if (timer != null) {
61
+ clearInterval(timer);
62
+ timer = undefined;
63
+ }
64
+ dispose?.();
65
+ dispose = undefined;
66
+ };
67
+
68
+ const mount = () => {
69
+ teardown();
70
+ // The loader treats its host element as the `#boot-loader` backdrop (styled
71
+ // by the inline CSS) and renders the disc + status into it — mirroring the
72
+ // static markup the plugin injects in production.
73
+ const backdrop = document.createElement('div');
74
+ backdrop.id = 'boot-loader';
75
+ backdrop.setAttribute('role', 'status');
76
+ backdrop.setAttribute('aria-live', 'polite');
77
+ backdrop.setAttribute('aria-label', 'Initializing');
78
+ container.appendChild(backdrop);
79
+ dispose = mountLoader(backdrop, { markSvg: COMPOSER_MARK, status: 'Loading…' });
80
+ };
81
+
82
+ const runCreepMessages = () => {
83
+ const phases = ['Loading framework…', 'Reading configuration…', 'Starting services…'];
84
+ let index = 0;
85
+ timer = setInterval(() => {
86
+ window.__bootLoader?.status({ humanized: phases[index] });
87
+ index += 1;
88
+ if (index >= phases.length && timer != null) {
89
+ clearInterval(timer);
90
+ timer = undefined;
91
+ }
92
+ }, 600);
93
+ };
94
+
95
+ const runProgress = () => {
96
+ let loaded = 0;
97
+ timer = setInterval(() => {
98
+ loaded += Math.min(1.5, 0.4 + (loaded % 3) * 0.3);
99
+ const fraction = Math.min(1, loaded / STORY_PLUGIN_COUNT);
100
+ window.__bootLoader?.progress(fraction);
101
+ window.__bootLoader?.status({
102
+ humanized: 'Loading plugins',
103
+ range: { index: Math.round(loaded), total: STORY_PLUGIN_COUNT },
104
+ });
105
+ if (loaded >= STORY_PLUGIN_COUNT && timer != null) {
106
+ clearInterval(timer);
107
+ timer = undefined;
108
+ window.__bootLoader?.status({ humanized: 'Starting Composer…' });
109
+ setSim('done');
110
+ }
111
+ }, STORY_TICK_MS);
112
+ };
113
+
114
+ const advance = () => {
115
+ if (sim() === 'creep') {
116
+ setSim('progress');
117
+ if (timer != null) {
118
+ clearInterval(timer);
119
+ timer = undefined;
120
+ }
121
+ runProgress();
122
+ } else if (sim() === 'progress' || sim() === 'done') {
123
+ // Play the dismissal outro, then re-mount for another run.
124
+ window.__bootLoader?.ready();
125
+ setSim('creep');
126
+ setTimeout(() => {
127
+ mount();
128
+ runCreepMessages();
129
+ }, 700);
130
+ }
131
+ };
132
+
133
+ onMount(() => {
134
+ styleEl = document.createElement('style');
135
+ styleEl.textContent = bootLoaderCss;
136
+ document.head.appendChild(styleEl);
137
+ mount();
138
+ runCreepMessages();
139
+ });
140
+
141
+ onCleanup(() => {
142
+ teardown();
143
+ styleEl?.remove();
144
+ });
145
+
146
+ return (
147
+ <>
148
+ {/* Float the controls above the loader's `z-index: 10` fixed backdrop. */}
149
+ <div
150
+ style={{
151
+ position: 'fixed',
152
+ top: '12px',
153
+ left: '12px',
154
+ 'z-index': 9999,
155
+ display: 'flex',
156
+ gap: '12px',
157
+ 'align-items': 'center',
158
+ }}
159
+ >
160
+ <button
161
+ type='button'
162
+ onClick={advance}
163
+ style={{
164
+ padding: '6px 14px',
165
+ 'font-size': '13px',
166
+ 'font-weight': '600',
167
+ color: '#fff',
168
+ background: '#017ab7',
169
+ border: 'none',
170
+ 'border-radius': '6px',
171
+ cursor: 'pointer',
172
+ 'box-shadow': '0 1px 3px rgba(0,0,0,0.25)',
173
+ }}
174
+ >
175
+ {sim() === 'creep' ? 'Start progress' : 'Finish + reset'}
176
+ </button>
177
+ <span style={{ 'font-family': 'ui-sans-serif, system-ui, sans-serif', 'font-size': '12px', color: '#888' }}>
178
+ {sim()}
179
+ </span>
180
+ </div>
181
+ <div ref={container as any} />
182
+ </>
183
+ );
184
+ };
185
+
186
+ const meta: Meta = {
187
+ title: 'sdk/app-framework/vite-plugin/BootLoader',
188
+ render: () => <LoaderHarness />,
189
+ parameters: {
190
+ layout: 'fullscreen',
191
+ },
192
+ };
193
+
194
+ export default meta;
195
+
196
+ type Story = StoryObj;
197
+
198
+ export const Default: Story = {};
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export * from './loader';
@@ -0,0 +1,166 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { type Component, For, createEffect, createSignal, onCleanup, onMount } from 'solid-js';
6
+
7
+ import { type LoaderStore } from './store';
8
+
9
+ // Ring geometry in the SVG's `0 0 100 100` viewBox. The radius leaves a couple
10
+ // of units of padding so the stroke, its round cap, and the end marker aren't
11
+ // clipped at the viewBox edge.
12
+ const RING_RADIUS = 48;
13
+ const RING_CENTER = 50;
14
+ // Leading-edge marker: a small dot drawn at the arc's head in an unmasked layer.
15
+ const MARKER_RADIUS = 1; // viewBox units → ~3.8px on the 384px disc
16
+
17
+ /**
18
+ * Read an element's *current animated* translateY (px) from its live transform
19
+ * matrix — the interpolated value mid-transition, not the last-written property.
20
+ * Used by the status FLIP so successive appends chain off the in-flight position
21
+ * instead of yanking the track back to a fixed invert target.
22
+ */
23
+ const readTranslateY = (element: HTMLElement): number => {
24
+ const computed = getComputedStyle(element).transform;
25
+ if (!computed || computed === 'none') {
26
+ return 0;
27
+ }
28
+ const match = computed.match(/matrix.*\(([^)]+)\)/);
29
+ if (!match) {
30
+ return 0;
31
+ }
32
+ const values = match[1].split(',');
33
+ // 2D `matrix(a, b, c, d, tx, ty)` → ty at index 5; 3D `matrix3d(...)` → ty at 13.
34
+ if (values.length === 6) {
35
+ return Number.parseFloat(values[5]) || 0;
36
+ }
37
+ if (values.length === 16) {
38
+ return Number.parseFloat(values[13]) || 0;
39
+ }
40
+ return 0;
41
+ };
42
+
43
+ export type LoaderProps = {
44
+ /** Reactive source of truth for progress, status lines, and lifecycle phase. */
45
+ store: LoaderStore;
46
+ /** Inline SVG markup for the brand mark rendered inside the ring. */
47
+ markSvg?: string;
48
+ };
49
+
50
+ /**
51
+ * The boot loader, authored as a single Solid component — the one source of
52
+ * truth for the loader DOM. `bootLoaderPlugin` bundles this (Solid runtime
53
+ * inlined) into `index.html`; the storybook mounts the very same component, so
54
+ * the two can no longer drift. The DOM structure, ids, and classes mirror
55
+ * `boot-loader.css`.
56
+ *
57
+ * The full-screen backdrop (`#boot-loader`) is injected as static markup so it
58
+ * paints from CSS before this bundle executes; this component renders the disc
59
+ * and status log *into* that backdrop. The dismissal outro (fading `#boot-loader`)
60
+ * and its teardown are owned by {@link mountLoader}, which has the host element.
61
+ */
62
+ export const Loader: Component<LoaderProps> = (props) => {
63
+ let trackRef: HTMLDivElement | undefined;
64
+ let previousCount = props.store.lines().length;
65
+
66
+ // FLIP-style slide on each appended line: snap the track down by one
67
+ // line-height (chained off any in-flight translate) with no transition, force
68
+ // a reflow, then animate back to translateY(0) so the new entry rises from
69
+ // below the bottom-anchored viewport. Range ticks (length unchanged) skip it.
70
+ createEffect(() => {
71
+ const count = props.store.lines().length;
72
+ const track = trackRef;
73
+ if (track && count > previousCount) {
74
+ const currentY = readTranslateY(track);
75
+ const lineHeight = track.lastElementChild?.getBoundingClientRect().height ?? 0;
76
+ track.style.transition = 'none';
77
+ track.style.transform = `translateY(${currentY + lineHeight}px)`;
78
+ void track.offsetHeight;
79
+ track.style.transition = '';
80
+ track.style.transform = 'translateY(0)';
81
+ }
82
+ previousCount = count;
83
+ });
84
+
85
+ // Eased display progress. A `<path>`'s `d` can't be CSS-transitioned, so the
86
+ // arc would snap on every store tick; instead we ease a displayed value toward
87
+ // the store's progress with a requestAnimationFrame loop (~per-frame lerp) and
88
+ // recompute the path each frame. This restores the compositor-smooth growth
89
+ // the old `transition: stroke-dashoffset` gave, while keeping the path +
90
+ // `marker-end` (the marker rides the arc's recomputed end automatically).
91
+ const [shown, setShown] = createSignal(props.store.progress());
92
+ let raf: number | undefined;
93
+ const animate = () => {
94
+ const target = props.store.progress();
95
+ const current = shown();
96
+ // Snap when within a hair to settle; otherwise lerp ~18% of the gap/frame.
97
+ const next = Math.abs(target - current) < 0.05 ? target : current + (target - current) * 0.18;
98
+ if (next !== current) {
99
+ setShown(next);
100
+ }
101
+ raf = requestAnimationFrame(animate);
102
+ };
103
+
104
+ onMount(() => {
105
+ raf = requestAnimationFrame(animate);
106
+ });
107
+
108
+ onCleanup(() => {
109
+ if (raf != null) {
110
+ cancelAnimationFrame(raf);
111
+ }
112
+ });
113
+
114
+ // Determinate ring as an SVG `<path>` arc: an anticlockwise sweep starting at
115
+ // 12 o'clock whose angle grows with the eased `shown()` progress. The sweep is
116
+ // capped just shy of a full turn so the single arc command never degenerates at
117
+ // 100%. The leading-edge dot is its `head` point, rendered separately (below) in
118
+ // an *unmasked* layer — drawing it via `marker-end` on this path would put it
119
+ // under the ring's conic fade mask, whose hard edge bisects the dot into a
120
+ // half-circle.
121
+ const arc = () => {
122
+ const fraction = Math.min(shown() / 100, 0.9999);
123
+ const sweep = fraction * 2 * Math.PI;
124
+ const start = -Math.PI / 2; // 12 o'clock
125
+ const end = start - sweep; // anticlockwise (decreasing angle)
126
+ const x0 = RING_CENTER + RING_RADIUS * Math.cos(start);
127
+ const y0 = RING_CENTER + RING_RADIUS * Math.sin(start);
128
+ const headX = RING_CENTER + RING_RADIUS * Math.cos(end);
129
+ const headY = RING_CENTER + RING_RADIUS * Math.sin(end);
130
+ const largeArc = sweep > Math.PI ? 1 : 0;
131
+ // sweep-flag 0 = anticlockwise (negative-angle) direction.
132
+ return { d: `M ${x0} ${y0} A ${RING_RADIUS} ${RING_RADIUS} 0 ${largeArc} 0 ${headX} ${headY}`, headX, headY };
133
+ };
134
+
135
+ // Once host-driven, the brand mark eases grayscale → colour and stays there.
136
+ const isHostDriven = () => props.store.phase() !== 'creep';
137
+
138
+ return (
139
+ <>
140
+ <div id='boot-loader-disc' data-host-driven={isHostDriven() ? '' : undefined}>
141
+ <svg
142
+ id='boot-loader-ring'
143
+ viewBox='0 0 100 100'
144
+ aria-hidden='true'
145
+ style={{ '--boot-loader-arc': String(shown()) }}
146
+ >
147
+ {shown() > 0 ? <path class='boot-loader-ring-progress' d={arc().d} /> : null}
148
+ </svg>
149
+ {/* Leading-edge dot in its own unmasked layer (see `arc()`), so the ring's fade mask
150
+ never clips it. Stacked over `#boot-loader-ring` via the disc grid. */}
151
+ {shown() > 0 ? (
152
+ <svg id='boot-loader-ring-head' viewBox='0 0 100 100' aria-hidden='true'>
153
+ <circle class='boot-loader-ring-marker' cx={arc().headX} cy={arc().headY} r={MARKER_RADIUS} />
154
+ </svg>
155
+ ) : null}
156
+ {props.markSvg ? <div id='boot-loader-mark' innerHTML={props.markSvg} /> : null}
157
+ </div>
158
+ <div id='boot-loader-status'>
159
+ <div id='boot-loader-status-fade' />
160
+ <div id='boot-loader-status-track' ref={trackRef}>
161
+ <For each={props.store.lines()}>{(line) => <div class='boot-loader-status-line'>{line.text}</div>}</For>
162
+ </div>
163
+ </div>
164
+ </>
165
+ );
166
+ };
@@ -0,0 +1,311 @@
1
+ /*
2
+ * Boot loader stylesheet — injected into the host's `<head>` by `bootLoaderPlugin`
3
+ * so the full-screen backdrop paints before any JS bundle is fetched. The Solid
4
+ * `Loader` renders the ring + status into the `#boot-loader` backdrop; this
5
+ * sheet styles both. Class/id names here form a contract with `Loader.tsx`,
6
+ * guarded by `BootLoader.solid-stories.tsx` (it mounts the real component).
7
+ */
8
+
9
+ body {
10
+ margin: 0;
11
+ overflow: hidden;
12
+ }
13
+
14
+ /*
15
+ * Defaults match `@dxos/ui-theme`'s `--color-base-surface`, which resolves to
16
+ * Tailwind's `neutral-50` / `neutral-950` in light / dark mode respectively
17
+ * (see `packages/ui/ui-theme/src/css/theme/semantic.css`). Hosts can override
18
+ * with the `--boot-loader-bg-*` / `--boot-loader-fg-*` custom properties on
19
+ * `:root` if they need a different palette. Keeping the boot loader's
20
+ * background identical to the app's `body` eliminates the flash on handoff
21
+ * to the rendered React shell.
22
+ */
23
+ #boot-loader {
24
+ --color-composer-100: rgb(5 40 61);
25
+ --color-composer-200: rgb(10 75 105);
26
+ --color-composer-300: rgb(1 122 183);
27
+ --color-composer-400: rgb(6 197 253);
28
+
29
+ /*
30
+ * Caps the disc / mark at the design pixel sizes on roomy viewports while
31
+ * shrinking proportionally on narrow ones (`vmin` follows the smaller of
32
+ * width / height) so neither the ring nor the mark crops on phones.
33
+ */
34
+ --boot-loader-disc-size: min(384px, 80vmin);
35
+ /*
36
+ * Match the React `Placeholder`'s logo box (`h-[300px] w-[300px]` at the
37
+ * `stage >= 1` keyframe) so the brand mark doesn't visibly jump size when
38
+ * the loader hands off — the responsive cap keeps the same 300/384 ratio
39
+ * (≈78%) at any viewport width.
40
+ */
41
+ --boot-loader-mark-size: min(300px, 62.5vmin);
42
+ --boot-loader-status-gap: 32px;
43
+
44
+ position: fixed;
45
+ inset: 0;
46
+ z-index: 10;
47
+ font-size: 13px;
48
+ font-family:
49
+ ui-sans-serif,
50
+ system-ui,
51
+ -apple-system,
52
+ BlinkMacSystemFont,
53
+ 'Segoe UI',
54
+ sans-serif;
55
+ /*
56
+ * Dismissal outro — `mountLoader` toggles `data-dismissing` on this element
57
+ * when the host calls `__bootLoader.ready()`; the loader cross-fades out over
58
+ * the real app shell rendering beneath it, and removes itself once this
59
+ * opacity transition completes (a fallback timer covers reduced-motion).
60
+ */
61
+ transition: opacity 500ms ease-out;
62
+ }
63
+
64
+ #boot-loader {
65
+ background: var(--boot-loader-bg-light, #fafafa);
66
+ color: var(--boot-loader-fg-light, #0a0a0a);
67
+ --boot-loader-accent: var(--boot-loader-accent-light, var(--color-composer-200));
68
+ }
69
+
70
+ @media (prefers-color-scheme: dark) {
71
+ #boot-loader {
72
+ background: var(--boot-loader-bg-dark, #0a0a0a);
73
+ color: var(--boot-loader-fg-dark, #fafafa);
74
+ --boot-loader-accent: var(--boot-loader-accent-dark, var(--color-composer-300));
75
+ }
76
+ }
77
+
78
+ #boot-loader[data-dismissing] {
79
+ opacity: 0;
80
+ }
81
+
82
+ /* Gently shrink the disc + mark as the loader fades, echoing the prior handoff. */
83
+ #boot-loader[data-dismissing] #boot-loader-disc {
84
+ transform: translate(-50%, -50%) scale(0.92);
85
+ transition: transform 500ms ease-out;
86
+ }
87
+
88
+ /*
89
+ * Stack the ring (the SVG `#boot-loader-ring`) and the brand mark in the same
90
+ * grid cell so the mark sits centered inside the circle.
91
+ */
92
+ #boot-loader-disc {
93
+ position: absolute;
94
+ top: 50%;
95
+ left: 50%;
96
+ display: grid;
97
+ place-items: center;
98
+ width: var(--boot-loader-disc-size);
99
+ height: var(--boot-loader-disc-size);
100
+ transform: translate(-50%, -50%);
101
+ }
102
+
103
+ #boot-loader-disc > * {
104
+ grid-column: 1;
105
+ grid-row: 1;
106
+ }
107
+
108
+ /*
109
+ * Default to grayscale so the mark reads as a quiet monochrome silhouette
110
+ * before any host-driven progress lands; the brand palette swaps in once
111
+ * `Loader.tsx` sets `data-host-driven` on the disc (the first
112
+ * `__bootLoader.progress()` call). Hover keeps a parallel reveal affordance
113
+ * for inspection in the storybook. The 1000ms ease lets the grayscale → color
114
+ * transition play through the activation phase rather than snapping.
115
+ */
116
+ #boot-loader-mark {
117
+ width: var(--boot-loader-mark-size);
118
+ height: var(--boot-loader-mark-size);
119
+ display: flex;
120
+ align-items: center;
121
+ justify-content: center;
122
+ filter: grayscale(100%);
123
+ transition: filter 1000ms ease-out;
124
+ }
125
+
126
+ /*
127
+ * `grayscale(0%)` (identity) rather than `none` — `filter: none` changes
128
+ * the filter function list and most engines treat that as a discrete
129
+ * transition (snap, not ease). Keeping `grayscale(...)` on both sides of
130
+ * the rule lets the browser interpolate the percentage smoothly.
131
+ */
132
+ #boot-loader-disc[data-host-driven] #boot-loader-mark,
133
+ #boot-loader-mark:hover {
134
+ filter: grayscale(0%);
135
+ }
136
+
137
+ #boot-loader-mark svg {
138
+ width: 100%;
139
+ height: 100%;
140
+ /*
141
+ * The host SVG carries its own brand-palette fills, so we don't apply a
142
+ * `color` cascade here. SVGs that intentionally use `fill="currentColor"`
143
+ * still pick up the loader's text colour via `#boot-loader`'s `color`.
144
+ */
145
+ }
146
+
147
+ /*
148
+ * Circular determinate progress — a single SVG `<path>` arc that sweeps
149
+ * anticlockwise from 12 o'clock, its angle growing with progress (the `d` is
150
+ * recomputed by the component each tick). There is no static track;
151
+ * `stroke-linecap: round` rounds the trailing edge, and `marker-end` paints the
152
+ * leading-edge dot. Stroke width is in viewBox units so it scales with the disc.
153
+ */
154
+ #boot-loader-ring {
155
+ width: var(--boot-loader-disc-size);
156
+ height: var(--boot-loader-disc-size);
157
+ overflow: visible;
158
+ /*
159
+ * Fade the arc linearly from the head (the marker, fully opaque) back to the
160
+ * tail (12 o'clock, transparent). A conic-gradient mask does this along the
161
+ * curve — `Loader.tsx` writes the eased progress into `--boot-loader-arc`
162
+ * (0–100), and the arc occupies the conic range `(100 - arc)%`…`100%`, so the
163
+ * head sits at `(100 - arc)%` (opaque) and the tail at `100%` (transparent).
164
+ * NOTE: We start at -1.16deg so that we don't mask the marker.
165
+ */
166
+ --boot-loader-arc: 0;
167
+ mask: conic-gradient(
168
+ from -1.16deg at 50% 50%,
169
+ transparent 0,
170
+ transparent calc((100 - var(--boot-loader-arc)) * 1%),
171
+ #000 calc((100 - var(--boot-loader-arc)) * 1%),
172
+ transparent 100%
173
+ );
174
+ -webkit-mask: conic-gradient(
175
+ from -1.16deg at 50% 50%,
176
+ transparent 0,
177
+ transparent calc((100 - var(--boot-loader-arc)) * 1%),
178
+ #000 calc((100 - var(--boot-loader-arc)) * 1%),
179
+ transparent 100%
180
+ );
181
+ }
182
+
183
+ /*
184
+ * The leading-edge dot's layer — same geometry as `#boot-loader-ring` but with no
185
+ * mask, so the dot renders as a full circle (the ring's conic fade mask would
186
+ * otherwise bisect it where it sits on the mask's transparent→opaque edge).
187
+ */
188
+ #boot-loader-ring-head {
189
+ width: var(--boot-loader-disc-size);
190
+ height: var(--boot-loader-disc-size);
191
+ overflow: visible;
192
+ }
193
+
194
+ .boot-loader-ring-progress {
195
+ fill: none;
196
+ stroke: var(--boot-loader-accent);
197
+ /* viewBox units: ~1.9px on the 384px disc, scaling down on smaller viewports. */
198
+ stroke-width: 0.5;
199
+ opacity: 0.5;
200
+ stroke-linecap: butt;
201
+ overflow: visible;
202
+ /* Dashed line: dash + gap lengths in viewBox units (~2 units ≈ 7.7px @384px). */
203
+ /* stroke-dasharray: 2 1; */
204
+ }
205
+
206
+ /* The `marker-end` dot at the arc's leading edge. */
207
+ .boot-loader-ring-marker {
208
+ fill: var(--boot-loader-accent);
209
+ stroke: none;
210
+ overflow: visible;
211
+ /* opacity: 0.5; */
212
+ }
213
+
214
+ #boot-loader-status {
215
+ position: absolute;
216
+ top: 50%;
217
+ left: 0;
218
+ right: 0;
219
+ /*
220
+ * Sit just below the centered disc — half the disc plus the configured gap.
221
+ */
222
+ transform: translate(0, calc(var(--boot-loader-disc-size) / 2 + var(--boot-loader-status-gap)));
223
+ /*
224
+ * Slightly de-emphasised vs body text so the brand mark + ring stay the
225
+ * dominant focus, but high enough to remain legible on both light and dark
226
+ * backgrounds without a custom palette.
227
+ */
228
+ opacity: 0.5;
229
+ /*
230
+ * Terminal-style log viewport (3 rows at the default `line-height`) over
231
+ * a vertically-stacked track of every status the driver has emitted. The
232
+ * track is bottom-anchored via `justify-content: flex-end` so the newest
233
+ * line always sits on the last visible row, older lines stack above it,
234
+ * and anything that doesn't fit is clipped at the top by
235
+ * `overflow: hidden`. The driver runs a FLIP-style transform animation
236
+ * per append so each new line slides up from below the bottom edge —
237
+ * independent of any `scroll-behavior` smooth-scroll support, which
238
+ * Playwright/headless Chrome strips even from spec-compliant
239
+ * `scrollTo({ behavior: 'smooth' })` calls.
240
+ */
241
+ display: flex;
242
+ flex-direction: column;
243
+ justify-content: flex-end;
244
+ height: 4.5em;
245
+ line-height: 1.5;
246
+ letter-spacing: 0.01em;
247
+ /*
248
+ * Fixed-width digits so the `(i/n)` counter on range-bearing status
249
+ * updates ("Loading plugins (12/80)") doesn't jitter as the index
250
+ * ticks through different glyph widths.
251
+ */
252
+ font-variant-numeric: tabular-nums;
253
+ text-align: center;
254
+ overflow: hidden;
255
+ }
256
+
257
+ #boot-loader-status-fade {
258
+ position: absolute;
259
+ top: 0;
260
+ left: 0;
261
+ width: 100%;
262
+ height: 32px;
263
+ background: linear-gradient(to bottom, var(--boot-loader-bg-light, #fafafa), transparent);
264
+ z-index: 1;
265
+ }
266
+ @media (prefers-color-scheme: dark) {
267
+ #boot-loader-status-fade {
268
+ background: linear-gradient(to bottom, var(--boot-loader-bg-dark, #0a0a0a), transparent);
269
+ }
270
+ }
271
+
272
+ #boot-loader-rss {
273
+ background: var(--boot-loader-bg-light, #fafafa);
274
+ text-wrap: balance;
275
+ }
276
+ @media (prefers-color-scheme: dark) {
277
+ #boot-loader-rss {
278
+ background: var(--boot-loader-bg-dark, #0a0a0a);
279
+ }
280
+ }
281
+
282
+ /*
283
+ * Track of every appended `.boot-loader-status-line`.
284
+ */
285
+ #boot-loader-status-track {
286
+ display: flex;
287
+ flex-direction: column;
288
+ /*
289
+ * Resting transform is `translateY(0)` — the bottom-anchored flex parent
290
+ * already positions the newest line on the last visible row. On each append
291
+ * `Loader.tsx` runs a one-shot FLIP: snap to `translateY(<lineHeight>px)` with
292
+ * no transition (placing the new line just below the viewport), force a
293
+ * reflow, then animate back to 0 so the track rises by one line-height and the
294
+ * new entry slides up into the bottom row.
295
+ */
296
+ transform: translateY(0);
297
+ transition: transform 500ms ease-out;
298
+ }
299
+
300
+ /* Honour reduced-motion preferences explicitly — `transition` doesn't auto-respect it. */
301
+ @media (prefers-reduced-motion: reduce) {
302
+ #boot-loader-status-track {
303
+ transition: none;
304
+ }
305
+ }
306
+
307
+ .boot-loader-status-line {
308
+ flex: 0 0 auto;
309
+ height: 1.5em;
310
+ white-space: nowrap;
311
+ }