@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.
- package/LICENSE +102 -5
- package/README.md +1 -1
- package/dist/lib/browser/{capability-LF3OXSCV.mjs → capability-JCUNWZ66.mjs} +12 -11
- package/dist/lib/browser/capability-JCUNWZ66.mjs.map +7 -0
- package/dist/lib/browser/{chunk-WEBSGU5L.mjs → chunk-2ZIYRDAF.mjs} +20 -5
- package/dist/lib/browser/chunk-2ZIYRDAF.mjs.map +7 -0
- package/dist/lib/browser/chunk-5GY3YOEL.mjs +28 -0
- package/dist/lib/browser/chunk-5GY3YOEL.mjs.map +7 -0
- package/dist/lib/browser/{chunk-272IPLHQ.mjs → chunk-66IXTIVK.mjs} +3 -2
- package/dist/lib/browser/chunk-66IXTIVK.mjs.map +7 -0
- package/dist/lib/browser/chunk-7MBI66M7.mjs +587 -0
- package/dist/lib/browser/chunk-7MBI66M7.mjs.map +7 -0
- package/dist/lib/browser/chunk-BMLCIFZW.mjs +1467 -0
- package/dist/lib/browser/chunk-BMLCIFZW.mjs.map +7 -0
- package/dist/lib/browser/{chunk-7M4467QR.mjs → chunk-DC3WRPBV.mjs} +100 -18
- package/dist/lib/browser/chunk-DC3WRPBV.mjs.map +7 -0
- package/dist/lib/browser/{chunk-JGWCBVKJ.mjs → chunk-E5DTDNDY.mjs} +28 -55
- package/dist/lib/browser/chunk-E5DTDNDY.mjs.map +7 -0
- package/dist/lib/browser/{chunk-TGX63LTL.mjs → chunk-FJ4765WW.mjs} +1 -1
- package/dist/lib/browser/{chunk-TGX63LTL.mjs.map → chunk-FJ4765WW.mjs.map} +2 -2
- package/dist/lib/browser/chunk-FO3IYSLV.mjs +68 -0
- package/dist/lib/browser/chunk-FO3IYSLV.mjs.map +7 -0
- package/dist/lib/browser/{chunk-YNFPIQGB.mjs → chunk-IW44C7UL.mjs} +9 -2
- package/dist/lib/browser/chunk-IW44C7UL.mjs.map +7 -0
- package/dist/lib/browser/chunk-KZUDO43J.mjs +422 -0
- package/dist/lib/browser/chunk-KZUDO43J.mjs.map +7 -0
- package/dist/lib/browser/chunk-Q2GLJTVV.mjs +12 -0
- package/dist/lib/browser/chunk-Q2GLJTVV.mjs.map +7 -0
- package/dist/lib/browser/chunk-VBG5F5UF.mjs +476 -0
- package/dist/lib/browser/chunk-VBG5F5UF.mjs.map +7 -0
- package/dist/lib/browser/cli/index.mjs +15 -30
- package/dist/lib/browser/cli/index.mjs.map +3 -3
- package/dist/lib/browser/common/activation-events.mjs +11 -14
- package/dist/lib/browser/common/capabilities.mjs +19 -8
- package/dist/lib/browser/core/activation-event.mjs +1 -1
- package/dist/lib/browser/core/capability.mjs +5 -1
- package/dist/lib/browser/core/plugin-manager.mjs +8 -4
- package/dist/lib/browser/core/plugin.mjs +18 -4
- package/dist/lib/browser/core/url-loader.mjs +24 -0
- package/dist/lib/browser/index.mjs +51 -54
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/process-manager-capability-4FUA4TRP.mjs +89 -0
- package/dist/lib/browser/process-manager-capability-4FUA4TRP.mjs.map +7 -0
- package/dist/lib/browser/testing/index.mjs +198 -54
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/browser/testing/react.mjs +78 -0
- package/dist/lib/browser/testing/react.mjs.map +7 -0
- package/dist/lib/browser/ui/index.mjs +22 -15
- package/dist/lib/node-esm/{capability-SA6LPYGL.mjs → capability-7TCQK7ZP.mjs} +12 -11
- package/dist/lib/node-esm/capability-7TCQK7ZP.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-FKE4Z3D6.mjs → chunk-37Z53PXZ.mjs} +1 -1
- package/dist/lib/node-esm/{chunk-FKE4Z3D6.mjs.map → chunk-37Z53PXZ.mjs.map} +2 -2
- package/dist/lib/node-esm/chunk-4BX2AE47.mjs +1468 -0
- package/dist/lib/node-esm/chunk-4BX2AE47.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-SB5ODNPX.mjs → chunk-CTKEZHKF.mjs} +9 -2
- package/dist/lib/node-esm/chunk-CTKEZHKF.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-FPW45EZH.mjs +14 -0
- package/dist/lib/node-esm/chunk-FPW45EZH.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-GEWHMHM7.mjs +588 -0
- package/dist/lib/node-esm/chunk-GEWHMHM7.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-KFZEB6BV.mjs +29 -0
- package/dist/lib/node-esm/chunk-KFZEB6BV.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-3D66SZHP.mjs → chunk-KSH4OVMY.mjs} +28 -55
- package/dist/lib/node-esm/chunk-KSH4OVMY.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-SQICGJBW.mjs → chunk-QBUGLR4H.mjs} +20 -5
- package/dist/lib/node-esm/chunk-QBUGLR4H.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-WK7OIQKI.mjs +70 -0
- package/dist/lib/node-esm/chunk-WK7OIQKI.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-XGBUKRCK.mjs +423 -0
- package/dist/lib/node-esm/chunk-XGBUKRCK.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-JHFY3HTS.mjs → chunk-XIGPWXCQ.mjs} +100 -18
- package/dist/lib/node-esm/chunk-XIGPWXCQ.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-6REV5DE7.mjs → chunk-XOCUANHO.mjs} +3 -2
- package/dist/lib/node-esm/chunk-XOCUANHO.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-Y7JKXNDU.mjs +477 -0
- package/dist/lib/node-esm/chunk-Y7JKXNDU.mjs.map +7 -0
- package/dist/lib/node-esm/cli/index.mjs +15 -30
- package/dist/lib/node-esm/cli/index.mjs.map +3 -3
- package/dist/lib/node-esm/common/activation-events.mjs +11 -14
- package/dist/lib/node-esm/common/capabilities.mjs +19 -8
- package/dist/lib/node-esm/core/activation-event.mjs +1 -1
- package/dist/lib/node-esm/core/capability.mjs +5 -1
- package/dist/lib/node-esm/core/plugin-manager.mjs +8 -4
- package/dist/lib/node-esm/core/plugin.mjs +18 -4
- package/dist/lib/node-esm/core/url-loader.mjs +25 -0
- package/dist/lib/node-esm/index.mjs +51 -54
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/process-manager-capability-F23D62RN.mjs +90 -0
- package/dist/lib/node-esm/process-manager-capability-F23D62RN.mjs.map +7 -0
- package/dist/lib/node-esm/testing/index.mjs +198 -54
- package/dist/lib/node-esm/testing/index.mjs.map +4 -4
- package/dist/lib/node-esm/testing/react.mjs +79 -0
- package/dist/lib/node-esm/testing/react.mjs.map +7 -0
- package/dist/lib/node-esm/ui/index.mjs +22 -15
- package/dist/plugin/node-esm/index.mjs +971 -0
- package/dist/plugin/node-esm/index.mjs.map +7 -0
- package/dist/plugin/node-esm/meta.json +1 -0
- package/dist/types/src/cli/cli.d.ts +1 -3
- package/dist/types/src/cli/cli.d.ts.map +1 -1
- package/dist/types/src/common/activation-events.d.ts +10 -13
- package/dist/types/src/common/activation-events.d.ts.map +1 -1
- package/dist/types/src/common/annotations.d.ts +1 -0
- package/dist/types/src/common/annotations.d.ts.map +1 -0
- package/dist/types/src/common/capabilities.d.ts +113 -12
- package/dist/types/src/common/capabilities.d.ts.map +1 -1
- package/dist/types/src/common/index.d.ts +0 -1
- package/dist/types/src/common/index.d.ts.map +1 -1
- package/dist/types/src/common/translations.d.ts +1 -1
- package/dist/types/src/core/activation-event.d.ts +4 -4
- package/dist/types/src/core/activation-event.d.ts.map +1 -1
- package/dist/types/src/core/capability-manager.d.ts +9 -0
- package/dist/types/src/core/capability-manager.d.ts.map +1 -1
- package/dist/types/src/core/capability.d.ts +13 -2
- package/dist/types/src/core/capability.d.ts.map +1 -1
- package/dist/types/src/core/edge-registry-plugin-provider.d.ts +30 -0
- package/dist/types/src/core/edge-registry-plugin-provider.d.ts.map +1 -0
- package/dist/types/src/core/index.d.ts +6 -0
- package/dist/types/src/core/index.d.ts.map +1 -1
- package/dist/types/src/core/plugin-asset-cache.d.ts +71 -0
- package/dist/types/src/core/plugin-asset-cache.d.ts.map +1 -0
- package/dist/types/src/core/plugin-manager.d.ts +238 -7
- package/dist/types/src/core/plugin-manager.d.ts.map +1 -1
- package/dist/types/src/core/plugin-manifest.d.ts +101 -0
- package/dist/types/src/core/plugin-manifest.d.ts.map +1 -0
- package/dist/types/src/core/plugin-manifest.test.d.ts +2 -0
- package/dist/types/src/core/plugin-manifest.test.d.ts.map +1 -0
- package/dist/types/src/core/plugin.d.ts +213 -11
- package/dist/types/src/core/plugin.d.ts.map +1 -1
- package/dist/types/src/core/registry.d.ts +107 -0
- package/dist/types/src/core/registry.d.ts.map +1 -0
- package/dist/types/src/core/url-loader.d.ts +127 -0
- package/dist/types/src/core/url-loader.d.ts.map +1 -0
- package/dist/types/src/core/url-loader.test.d.ts +2 -0
- package/dist/types/src/core/url-loader.test.d.ts.map +1 -0
- package/dist/types/src/helpers.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -2
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/plugin-process-manager/ProcessManagerPlugin.d.ts +3 -0
- package/dist/types/src/plugin-process-manager/ProcessManagerPlugin.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/history/capability.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/history/errors.d.ts +32 -0
- package/dist/types/src/plugin-process-manager/history/errors.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/history/history-tracker.d.ts +32 -0
- package/dist/types/src/plugin-process-manager/history/history-tracker.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/history/history-tracker.test.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/history/index.d.ts.map +1 -0
- package/dist/types/src/{plugin-operation → plugin-process-manager}/history/types.d.ts +1 -1
- package/dist/types/src/plugin-process-manager/history/types.d.ts.map +1 -0
- package/dist/types/src/{plugin-operation → plugin-process-manager}/history/undo-mapping.d.ts +2 -2
- package/dist/types/src/plugin-process-manager/history/undo-mapping.d.ts.map +1 -0
- package/dist/types/src/{plugin-operation → plugin-process-manager}/history/undo-registry.d.ts +1 -1
- package/dist/types/src/plugin-process-manager/history/undo-registry.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/history/undo-registry.test.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/index.d.ts +3 -0
- package/dist/types/src/plugin-process-manager/index.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/meta.d.ts +3 -0
- package/dist/types/src/plugin-process-manager/meta.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/process-manager-capability.d.ts +8 -0
- package/dist/types/src/plugin-process-manager/process-manager-capability.d.ts.map +1 -0
- package/dist/types/src/plugin-process-manager/testing.d.ts +59 -0
- package/dist/types/src/plugin-process-manager/testing.d.ts.map +1 -0
- package/dist/types/src/testing/harness.d.ts +79 -0
- package/dist/types/src/testing/harness.d.ts.map +1 -0
- package/dist/types/src/testing/index.d.ts +1 -0
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/testing/react.d.ts +27 -0
- package/dist/types/src/testing/react.d.ts.map +1 -0
- package/dist/types/src/testing/react.test.d.ts +2 -0
- package/dist/types/src/testing/react.test.d.ts.map +1 -0
- package/dist/types/src/testing/service.d.ts.map +1 -1
- package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
- package/dist/types/src/testing/withPluginManager.stories.d.ts.map +1 -1
- package/dist/types/src/ui/components/App/App.d.ts +36 -3
- package/dist/types/src/ui/components/App/App.d.ts.map +1 -1
- package/dist/types/src/ui/components/App/App.stories.d.ts +2 -2
- package/dist/types/src/ui/components/App/App.stories.d.ts.map +1 -1
- package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts.map +1 -1
- package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts +16 -4
- package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -1
- package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts.map +1 -1
- package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts.map +1 -1
- package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts +48 -0
- package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/index.d.ts +22 -6
- package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -1
- package/dist/types/src/ui/components/Surface/types.d.ts +110 -9
- package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -1
- package/dist/types/src/ui/components/Surface/types.test.d.ts +2 -0
- package/dist/types/src/ui/components/Surface/types.test.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/index.d.ts +1 -1
- package/dist/types/src/ui/hooks/index.d.ts.map +1 -1
- package/dist/types/src/ui/hooks/useApp.d.ts +42 -12
- package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -1
- package/dist/types/src/ui/hooks/useApp.test.d.ts +2 -0
- package/dist/types/src/ui/hooks/useApp.test.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/useCapabilities.d.ts.map +1 -1
- package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -1
- package/dist/types/src/ui/hooks/useProcessManagerRuntime.d.ts +30 -0
- package/dist/types/src/ui/hooks/useProcessManagerRuntime.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/useSettingsState.d.ts.map +1 -1
- package/dist/types/src/vite-plugin/boot-loader/index.d.ts +2 -0
- package/dist/types/src/vite-plugin/boot-loader/index.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/boot-loader/loader.d.ts +54 -0
- package/dist/types/src/vite-plugin/boot-loader/loader.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/composer/index.d.ts +34 -0
- package/dist/types/src/vite-plugin/composer/index.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/import-map/index.d.ts +28 -0
- package/dist/types/src/vite-plugin/import-map/index.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/index.d.ts +5 -0
- package/dist/types/src/vite-plugin/index.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/manifest.d.ts +41 -0
- package/dist/types/src/vite-plugin/manifest.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/manifest.test.d.ts +2 -0
- package/dist/types/src/vite-plugin/manifest.test.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/packages.d.ts +13 -0
- package/dist/types/src/vite-plugin/packages.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/moon.yml +15 -0
- package/package.json +61 -57
- package/src/cli/cli.ts +2 -7
- package/src/common/activation-events.ts +10 -15
- package/src/common/annotations.ts +3 -0
- package/src/common/capabilities.ts +147 -16
- package/src/common/index.ts +0 -1
- package/src/common/translations.ts +1 -1
- package/src/core/activation-event.ts +4 -1
- package/src/core/capability-manager.test.ts +4 -1
- package/src/core/capability-manager.ts +44 -2
- package/src/core/capability.ts +20 -2
- package/src/core/edge-registry-plugin-provider.ts +92 -0
- package/src/core/index.ts +6 -0
- package/src/core/plugin-asset-cache.ts +60 -0
- package/src/core/plugin-manager.test.ts +1103 -19
- package/src/core/plugin-manager.ts +1176 -199
- package/src/core/plugin-manifest.test.ts +75 -0
- package/src/core/plugin-manifest.ts +134 -0
- package/src/core/plugin.ts +235 -17
- package/src/core/registry.ts +163 -0
- package/src/core/url-loader.test.ts +222 -0
- package/src/core/url-loader.ts +388 -0
- package/src/index.ts +1 -2
- package/src/plugin-process-manager/ProcessManagerPlugin.ts +24 -0
- package/src/{plugin-operation → plugin-process-manager}/history/capability.ts +1 -2
- package/src/plugin-process-manager/history/errors.ts +7 -0
- package/src/{plugin-operation → plugin-process-manager}/history/history-tracker.test.ts +61 -88
- package/src/{plugin-operation → plugin-process-manager}/history/history-tracker.ts +33 -18
- package/src/{plugin-operation → plugin-process-manager}/history/types.ts +1 -1
- package/src/{plugin-operation → plugin-process-manager}/history/undo-mapping.ts +2 -2
- package/src/{plugin-operation → plugin-process-manager}/history/undo-registry.test.ts +6 -5
- package/src/{plugin-operation → plugin-process-manager}/history/undo-registry.ts +1 -1
- package/src/{plugin-operation → plugin-process-manager}/index.ts +1 -1
- package/src/plugin-process-manager/meta.ts +16 -0
- package/src/plugin-process-manager/process-manager-capability.ts +178 -0
- package/src/{plugin-operation → plugin-process-manager}/testing.ts +32 -50
- package/src/testing/harness.ts +247 -0
- package/src/testing/index.ts +1 -0
- package/src/testing/react.test.tsx +50 -0
- package/src/testing/react.tsx +113 -0
- package/src/testing/service.ts +2 -2
- package/src/testing/withPluginManager.stories.tsx +1 -2
- package/src/testing/withPluginManager.tsx +47 -21
- package/src/ui/components/App/App.stories.tsx +12 -20
- package/src/ui/components/App/App.tsx +97 -10
- package/src/ui/components/PluginManager/PluginManagerContext.stories.tsx +13 -17
- package/src/ui/components/Surface/SurfaceComponent.stories.tsx +17 -16
- package/src/ui/components/Surface/SurfaceComponent.tsx +111 -55
- package/src/ui/components/Surface/SurfaceInfo.tsx +0 -1
- package/src/ui/components/Surface/SurfaceProfilerContext.tsx +207 -0
- package/src/ui/components/Surface/index.ts +35 -1
- package/src/ui/components/Surface/types.test.ts +126 -0
- package/src/ui/components/Surface/types.ts +185 -12
- package/src/ui/hooks/index.ts +1 -1
- package/src/ui/hooks/useApp.test.tsx +161 -0
- package/src/ui/hooks/useApp.tsx +215 -24
- package/src/ui/hooks/useCapabilities.ts +1 -0
- package/src/ui/hooks/useLoading.tsx +14 -6
- package/src/ui/hooks/useProcessManagerRuntime.ts +78 -0
- package/src/vite-plugin/boot-loader/BootLoader.solid-stories.tsx +198 -0
- package/src/vite-plugin/boot-loader/index.ts +5 -0
- package/src/vite-plugin/boot-loader/loader-app/Loader.tsx +166 -0
- package/src/vite-plugin/boot-loader/loader-app/boot-loader.css +311 -0
- package/src/vite-plugin/boot-loader/loader-app/bridge.ts +25 -0
- package/src/vite-plugin/boot-loader/loader-app/entry.tsx +21 -0
- package/src/vite-plugin/boot-loader/loader-app/mount.tsx +70 -0
- package/src/vite-plugin/boot-loader/loader-app/store.test.ts +137 -0
- package/src/vite-plugin/boot-loader/loader-app/store.ts +149 -0
- package/src/vite-plugin/boot-loader/loader-app/tsconfig.json +11 -0
- package/src/vite-plugin/boot-loader/loader-app/types.ts +78 -0
- package/src/vite-plugin/boot-loader/loader.ts +193 -0
- package/src/vite-plugin/composer/index.ts +306 -0
- package/src/vite-plugin/import-map/index.ts +527 -0
- package/src/vite-plugin/index.ts +10 -0
- package/src/vite-plugin/manifest.test.ts +55 -0
- package/src/vite-plugin/manifest.ts +63 -0
- package/src/vite-plugin/packages.ts +187 -0
- package/tsconfig.json +26 -3
- package/tsconfig.node.json +1 -1
- package/vitest.config.ts +1 -1
- package/.swc/plugins/linux_x86_64_19.0.0/727453fb3a62f7f1d952a41e051ca8a6f88cadc45cee43c6a4d1aa45f9b75665.wasmer-v7 +0 -0
- package/dist/lib/browser/capability-6YMUBS54.mjs +0 -37
- package/dist/lib/browser/capability-6YMUBS54.mjs.map +0 -7
- package/dist/lib/browser/capability-LF3OXSCV.mjs.map +0 -7
- package/dist/lib/browser/chunk-272IPLHQ.mjs.map +0 -7
- package/dist/lib/browser/chunk-2UI6ACB5.mjs +0 -824
- package/dist/lib/browser/chunk-2UI6ACB5.mjs.map +0 -7
- package/dist/lib/browser/chunk-7M4467QR.mjs.map +0 -7
- package/dist/lib/browser/chunk-JGWCBVKJ.mjs.map +0 -7
- package/dist/lib/browser/chunk-M5IC326L.mjs +0 -34
- package/dist/lib/browser/chunk-M5IC326L.mjs.map +0 -7
- package/dist/lib/browser/chunk-NQPYE365.mjs +0 -703
- package/dist/lib/browser/chunk-NQPYE365.mjs.map +0 -7
- package/dist/lib/browser/chunk-TIEBZMTF.mjs +0 -44
- package/dist/lib/browser/chunk-TIEBZMTF.mjs.map +0 -7
- package/dist/lib/browser/chunk-WEBSGU5L.mjs.map +0 -7
- package/dist/lib/browser/chunk-YAFEA4GV.mjs +0 -1
- package/dist/lib/browser/chunk-YNFPIQGB.mjs.map +0 -7
- package/dist/lib/browser/invoker-capability-4AUGUMM5.mjs +0 -36
- package/dist/lib/browser/invoker-capability-4AUGUMM5.mjs.map +0 -7
- package/dist/lib/node-esm/capability-R5O2OYX4.mjs +0 -38
- package/dist/lib/node-esm/capability-R5O2OYX4.mjs.map +0 -7
- package/dist/lib/node-esm/capability-SA6LPYGL.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-3D66SZHP.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-6REV5DE7.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-FHWPWQRJ.mjs +0 -704
- package/dist/lib/node-esm/chunk-FHWPWQRJ.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-JHFY3HTS.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-JIVXIJ2T.mjs +0 -825
- package/dist/lib/node-esm/chunk-JIVXIJ2T.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-NHXBSAQR.mjs +0 -35
- package/dist/lib/node-esm/chunk-NHXBSAQR.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-SB5ODNPX.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-SCDGIGGU.mjs +0 -45
- package/dist/lib/node-esm/chunk-SCDGIGGU.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-SQICGJBW.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-Z4TJPSMP.mjs +0 -2
- package/dist/lib/node-esm/invoker-capability-3YDIVDWV.mjs +0 -37
- package/dist/lib/node-esm/invoker-capability-3YDIVDWV.mjs.map +0 -7
- package/dist/types/src/common/operations.d.ts +0 -33
- package/dist/types/src/common/operations.d.ts.map +0 -1
- package/dist/types/src/plugin-operation/OperationPlugin.d.ts +0 -3
- package/dist/types/src/plugin-operation/OperationPlugin.d.ts.map +0 -1
- package/dist/types/src/plugin-operation/history/capability.d.ts.map +0 -1
- package/dist/types/src/plugin-operation/history/errors.d.ts +0 -5
- package/dist/types/src/plugin-operation/history/errors.d.ts.map +0 -1
- package/dist/types/src/plugin-operation/history/history-tracker.d.ts +0 -18
- package/dist/types/src/plugin-operation/history/history-tracker.d.ts.map +0 -1
- package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts.map +0 -1
- package/dist/types/src/plugin-operation/history/index.d.ts.map +0 -1
- package/dist/types/src/plugin-operation/history/types.d.ts.map +0 -1
- package/dist/types/src/plugin-operation/history/undo-mapping.d.ts.map +0 -1
- package/dist/types/src/plugin-operation/history/undo-registry.d.ts.map +0 -1
- package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts.map +0 -1
- package/dist/types/src/plugin-operation/index.d.ts +0 -3
- package/dist/types/src/plugin-operation/index.d.ts.map +0 -1
- package/dist/types/src/plugin-operation/invoker-capability.d.ts +0 -6
- package/dist/types/src/plugin-operation/invoker-capability.d.ts.map +0 -1
- package/dist/types/src/plugin-operation/meta.d.ts +0 -3
- package/dist/types/src/plugin-operation/meta.d.ts.map +0 -1
- package/dist/types/src/plugin-operation/testing.d.ts +0 -109
- package/dist/types/src/plugin-operation/testing.d.ts.map +0 -1
- package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts +0 -3
- package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts.map +0 -1
- package/dist/types/src/plugin-runtime/capability.d.ts +0 -6
- package/dist/types/src/plugin-runtime/capability.d.ts.map +0 -1
- package/dist/types/src/plugin-runtime/index.d.ts +0 -2
- package/dist/types/src/plugin-runtime/index.d.ts.map +0 -1
- package/dist/types/src/plugin-runtime/meta.d.ts +0 -3
- package/dist/types/src/plugin-runtime/meta.d.ts.map +0 -1
- package/dist/types/src/ui/hooks/useOperationResolver.d.ts +0 -19
- package/dist/types/src/ui/hooks/useOperationResolver.d.ts.map +0 -1
- package/src/common/operations.ts +0 -38
- package/src/plugin-operation/OperationPlugin.ts +0 -25
- package/src/plugin-operation/history/errors.ts +0 -11
- package/src/plugin-operation/invoker-capability.ts +0 -40
- package/src/plugin-operation/meta.ts +0 -11
- package/src/plugin-runtime/RuntimePlugin.ts +0 -20
- package/src/plugin-runtime/capability.ts +0 -53
- package/src/plugin-runtime/index.ts +0 -5
- package/src/plugin-runtime/meta.ts +0 -11
- package/src/ui/hooks/useOperationResolver.ts +0 -40
- /package/dist/lib/browser/{chunk-YAFEA4GV.mjs.map → core/url-loader.mjs.map} +0 -0
- /package/dist/lib/node-esm/{chunk-Z4TJPSMP.mjs.map → core/url-loader.mjs.map} +0 -0
- /package/dist/types/src/{plugin-operation → plugin-process-manager}/history/capability.d.ts +0 -0
- /package/dist/types/src/{plugin-operation → plugin-process-manager}/history/history-tracker.test.d.ts +0 -0
- /package/dist/types/src/{plugin-operation → plugin-process-manager}/history/index.d.ts +0 -0
- /package/dist/types/src/{plugin-operation → plugin-process-manager}/history/undo-registry.test.d.ts +0 -0
- /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,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
|
+
}
|