@dxos/app-framework 0.8.4-main.a4bbb77 → 0.8.4-main.abd8ff62ef
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.storybook/main.mts +2 -4
- package/.storybook/preview.mts +2 -2
- package/dist/lib/browser/capability-Q5XRXRD2.mjs +38 -0
- package/dist/lib/browser/capability-Q5XRXRD2.mjs.map +7 -0
- package/dist/lib/browser/capability-V7LR4LQN.mjs +35 -0
- package/dist/lib/browser/capability-V7LR4LQN.mjs.map +7 -0
- package/dist/lib/browser/chunk-23D4SJUE.mjs +42 -0
- package/dist/lib/browser/chunk-23D4SJUE.mjs.map +7 -0
- package/dist/lib/browser/chunk-3JWJXGLK.mjs +79 -0
- package/dist/lib/browser/chunk-3JWJXGLK.mjs.map +7 -0
- package/dist/lib/browser/chunk-3ZS2A3DN.mjs +907 -0
- package/dist/lib/browser/chunk-3ZS2A3DN.mjs.map +7 -0
- package/dist/lib/browser/chunk-45CHLTBV.mjs +34 -0
- package/dist/lib/browser/chunk-45CHLTBV.mjs.map +7 -0
- package/dist/lib/browser/chunk-5LAIGWLU.mjs +467 -0
- package/dist/lib/browser/chunk-5LAIGWLU.mjs.map +7 -0
- package/dist/lib/browser/chunk-66IXTIVK.mjs +48 -0
- package/dist/lib/browser/chunk-66IXTIVK.mjs.map +7 -0
- package/dist/lib/browser/chunk-FJ4765WW.mjs +8 -0
- package/dist/lib/browser/chunk-FJ4765WW.mjs.map +7 -0
- package/dist/lib/browser/chunk-G7SDBRKH.mjs +1 -0
- package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/browser/chunk-JXCBZSBJ.mjs +372 -0
- package/dist/lib/browser/chunk-JXCBZSBJ.mjs.map +7 -0
- package/dist/lib/browser/chunk-MX5DKEJH.mjs +584 -0
- package/dist/lib/browser/chunk-MX5DKEJH.mjs.map +7 -0
- package/dist/lib/browser/chunk-WBHCSOBW.mjs +80 -0
- package/dist/lib/browser/chunk-WBHCSOBW.mjs.map +7 -0
- package/dist/lib/browser/chunk-Z55LVAGN.mjs +213 -0
- package/dist/lib/browser/chunk-Z55LVAGN.mjs.map +7 -0
- package/dist/lib/browser/chunk-ZGJAZSNE.mjs +142 -0
- package/dist/lib/browser/chunk-ZGJAZSNE.mjs.map +7 -0
- package/dist/lib/browser/cli/index.mjs +74 -0
- package/dist/lib/browser/cli/index.mjs.map +7 -0
- package/dist/lib/browser/common/activation-events.mjs +24 -0
- package/dist/lib/browser/common/capabilities.mjs +46 -0
- package/dist/lib/browser/core/activation-event.mjs +20 -0
- package/dist/lib/browser/core/activation-event.mjs.map +7 -0
- package/dist/lib/browser/core/capability.mjs +30 -0
- package/dist/lib/browser/core/capability.mjs.map +7 -0
- package/dist/lib/browser/core/plugin-manager.mjs +17 -0
- package/dist/lib/browser/core/plugin-manager.mjs.map +7 -0
- package/dist/lib/browser/core/plugin.mjs +37 -0
- package/dist/lib/browser/core/plugin.mjs.map +7 -0
- package/dist/lib/browser/core/url-loader.mjs +20 -0
- package/dist/lib/browser/core/url-loader.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +95 -148
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/invoker-capability-LNX4CGIV.mjs +44 -0
- package/dist/lib/browser/invoker-capability-LNX4CGIV.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +227 -41
- 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 +48 -0
- package/dist/lib/browser/ui/index.mjs.map +7 -0
- package/dist/lib/node-esm/capability-EW5GJCI6.mjs +39 -0
- package/dist/lib/node-esm/capability-EW5GJCI6.mjs.map +7 -0
- package/dist/lib/node-esm/capability-YKBMMD53.mjs +36 -0
- package/dist/lib/node-esm/capability-YKBMMD53.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-37Z53PXZ.mjs +10 -0
- package/dist/lib/node-esm/chunk-37Z53PXZ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-6XW6LET6.mjs +35 -0
- package/dist/lib/node-esm/chunk-6XW6LET6.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-D347W3KO.mjs +143 -0
- package/dist/lib/node-esm/chunk-D347W3KO.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-D5PO2WXX.mjs +373 -0
- package/dist/lib/node-esm/chunk-D5PO2WXX.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-HTBJU5FX.mjs +214 -0
- package/dist/lib/node-esm/chunk-HTBJU5FX.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-KM2F6GH6.mjs +468 -0
- package/dist/lib/node-esm/chunk-KM2F6GH6.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-OZ7DZA5Z.mjs +2 -0
- package/dist/lib/node-esm/chunk-OZ7DZA5Z.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-Q7XBFII4.mjs +908 -0
- package/dist/lib/node-esm/chunk-Q7XBFII4.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-SBS2YMPT.mjs +43 -0
- package/dist/lib/node-esm/chunk-SBS2YMPT.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-SDJ4B2LU.mjs +80 -0
- package/dist/lib/node-esm/chunk-SDJ4B2LU.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-WFSRZKBP.mjs +81 -0
- package/dist/lib/node-esm/chunk-WFSRZKBP.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-WKTLE7MG.mjs +585 -0
- package/dist/lib/node-esm/chunk-WKTLE7MG.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-XOCUANHO.mjs +49 -0
- package/dist/lib/node-esm/chunk-XOCUANHO.mjs.map +7 -0
- package/dist/lib/node-esm/cli/index.mjs +75 -0
- package/dist/lib/node-esm/cli/index.mjs.map +7 -0
- package/dist/lib/node-esm/common/activation-events.mjs +25 -0
- package/dist/lib/node-esm/common/activation-events.mjs.map +7 -0
- package/dist/lib/node-esm/common/capabilities.mjs +47 -0
- package/dist/lib/node-esm/common/capabilities.mjs.map +7 -0
- package/dist/lib/node-esm/core/activation-event.mjs +21 -0
- package/dist/lib/node-esm/core/activation-event.mjs.map +7 -0
- package/dist/lib/node-esm/core/capability.mjs +31 -0
- package/dist/lib/node-esm/core/capability.mjs.map +7 -0
- package/dist/lib/node-esm/core/plugin-manager.mjs +18 -0
- package/dist/lib/node-esm/core/plugin-manager.mjs.map +7 -0
- package/dist/lib/node-esm/core/plugin.mjs +38 -0
- package/dist/lib/node-esm/core/plugin.mjs.map +7 -0
- package/dist/lib/node-esm/core/url-loader.mjs +21 -0
- package/dist/lib/node-esm/core/url-loader.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +95 -148
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/invoker-capability-O4T5PHLA.mjs +45 -0
- package/dist/lib/node-esm/invoker-capability-O4T5PHLA.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +227 -41
- 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 +49 -0
- package/dist/lib/node-esm/ui/index.mjs.map +7 -0
- package/dist/plugin/node-esm/index.mjs +832 -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 +39 -0
- package/dist/types/src/cli/cli.d.ts.map +1 -0
- package/dist/types/src/cli/index.d.ts +2 -0
- package/dist/types/src/cli/index.d.ts.map +1 -0
- package/dist/types/src/common/activation-events.d.ts +27 -0
- package/dist/types/src/common/activation-events.d.ts.map +1 -0
- package/dist/types/src/common/capabilities.d.ts +110 -197
- package/dist/types/src/common/capabilities.d.ts.map +1 -1
- package/dist/types/src/common/index.d.ts +4 -8
- package/dist/types/src/common/index.d.ts.map +1 -1
- package/dist/types/src/common/operations.d.ts +19 -0
- package/dist/types/src/common/operations.d.ts.map +1 -0
- package/dist/types/src/common/translations.d.ts +8 -8
- package/dist/types/src/common/translations.d.ts.map +1 -1
- package/dist/types/src/context.d.ts +5 -0
- package/dist/types/src/context.d.ts.map +1 -0
- package/dist/types/src/core/{events.d.ts → activation-event.d.ts} +11 -11
- package/dist/types/src/core/activation-event.d.ts.map +1 -0
- package/dist/types/src/core/capability-manager.d.ts +48 -0
- package/dist/types/src/core/capability-manager.d.ts.map +1 -0
- package/dist/types/src/core/capability-manager.test.d.ts +2 -0
- package/dist/types/src/core/capability-manager.test.d.ts.map +1 -0
- package/dist/types/src/core/capability.d.ts +156 -0
- package/dist/types/src/core/capability.d.ts.map +1 -0
- package/dist/types/src/core/index.d.ts +8 -4
- 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 +122 -0
- package/dist/types/src/core/plugin-manager.d.ts.map +1 -0
- package/dist/types/src/core/plugin-manager.test.d.ts +2 -0
- package/dist/types/src/core/plugin-manager.test.d.ts.map +1 -0
- package/dist/types/src/core/plugin-manifest.d.ts +76 -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 +207 -39
- package/dist/types/src/core/plugin.d.ts.map +1 -1
- package/dist/types/src/core/url-loader.d.ts +112 -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 +3 -4
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/plugin-operation/OperationPlugin.d.ts +3 -0
- package/dist/types/src/plugin-operation/OperationPlugin.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/capability.d.ts +7 -0
- package/dist/types/src/plugin-operation/history/capability.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/errors.d.ts +32 -0
- package/dist/types/src/plugin-operation/history/errors.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/history-tracker.d.ts +18 -0
- package/dist/types/src/plugin-operation/history/history-tracker.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts +2 -0
- package/dist/types/src/plugin-operation/history/history-tracker.test.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/index.d.ts +6 -0
- package/dist/types/src/plugin-operation/history/index.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/types.d.ts +13 -0
- package/dist/types/src/plugin-operation/history/types.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/undo-mapping.d.ts +101 -0
- package/dist/types/src/plugin-operation/history/undo-mapping.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/undo-registry.d.ts +23 -0
- package/dist/types/src/plugin-operation/history/undo-registry.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts +2 -0
- package/dist/types/src/plugin-operation/history/undo-registry.test.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/index.d.ts +3 -0
- package/dist/types/src/plugin-operation/index.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/invoker-capability.d.ts +6 -0
- package/dist/types/src/plugin-operation/invoker-capability.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/meta.d.ts +3 -0
- package/dist/types/src/plugin-operation/meta.d.ts.map +1 -0
- package/dist/types/src/plugin-operation/testing.d.ts +59 -0
- package/dist/types/src/plugin-operation/testing.d.ts.map +1 -0
- package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts +3 -0
- package/dist/types/src/plugin-runtime/RuntimePlugin.d.ts.map +1 -0
- package/dist/types/src/plugin-runtime/capability.d.ts +6 -0
- package/dist/types/src/plugin-runtime/capability.d.ts.map +1 -0
- package/dist/types/src/plugin-runtime/index.d.ts +2 -0
- package/dist/types/src/plugin-runtime/index.d.ts.map +1 -0
- package/dist/types/src/plugin-runtime/meta.d.ts +3 -0
- package/dist/types/src/plugin-runtime/meta.d.ts.map +1 -0
- package/dist/types/src/testing/harness.d.ts +67 -0
- package/dist/types/src/testing/harness.d.ts.map +1 -0
- package/dist/types/src/testing/index.d.ts +2 -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 +8 -0
- package/dist/types/src/testing/service.d.ts.map +1 -0
- package/dist/types/src/testing/withPluginManager.d.ts +7 -6
- 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 +9 -0
- package/dist/types/src/ui/components/App/App.d.ts.map +1 -0
- package/dist/types/src/ui/components/App/App.stories.d.ts +19 -0
- package/dist/types/src/ui/components/App/App.stories.d.ts.map +1 -0
- package/dist/types/src/ui/components/App/index.d.ts +2 -0
- package/dist/types/src/ui/components/App/index.d.ts.map +1 -0
- package/dist/types/src/ui/components/Placeholder/Placeholder.d.ts +64 -0
- package/dist/types/src/ui/components/Placeholder/Placeholder.d.ts.map +1 -0
- package/dist/types/src/ui/components/Placeholder/Placeholder.stories.d.ts +19 -0
- package/dist/types/src/ui/components/Placeholder/Placeholder.stories.d.ts.map +1 -0
- package/dist/types/src/ui/components/Placeholder/index.d.ts +2 -0
- package/dist/types/src/ui/components/Placeholder/index.d.ts.map +1 -0
- package/dist/types/src/{playground/playground.stories.d.ts → ui/components/PluginManager/PluginManagerContext.stories.d.ts} +5 -3
- package/dist/types/src/ui/components/PluginManager/PluginManagerContext.stories.d.ts.map +1 -0
- package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts +10 -0
- package/dist/types/src/ui/components/PluginManager/PluginManagerProvider.d.ts.map +1 -0
- package/dist/types/src/ui/components/PluginManager/index.d.ts +2 -0
- package/dist/types/src/ui/components/PluginManager/index.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts +24 -0
- package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -0
- package/dist/types/src/{components/App.stories.d.ts → ui/components/Surface/SurfaceComponent.stories.d.ts} +1 -1
- package/dist/types/src/ui/components/Surface/SurfaceComponent.stories.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts +11 -0
- package/dist/types/src/ui/components/Surface/SurfaceInfo.d.ts.map +1 -0
- 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/context.d.ts +5 -0
- package/dist/types/src/ui/components/Surface/context.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/index.d.ts +36 -0
- package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/types.d.ts +197 -0
- package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -0
- 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/components/index.d.ts +5 -0
- package/dist/types/src/ui/components/index.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/index.d.ts +6 -0
- package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/useApp.d.ts +88 -0
- package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -0
- 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 +31 -0
- package/dist/types/src/ui/hooks/useCapabilities.d.ts.map +1 -0
- package/dist/types/src/{components → ui/hooks}/useLoading.d.ts +1 -2
- package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/useSettingsState.d.ts +10 -0
- package/dist/types/src/ui/hooks/useSettingsState.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/useSurface.d.ts +3 -0
- package/dist/types/src/ui/hooks/useSurface.d.ts.map +1 -0
- package/dist/types/src/ui/index.d.ts +3 -0
- package/dist/types/src/ui/index.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts +34 -0
- package/dist/types/src/vite-plugin/boot-loader/BootLoader.stories.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/boot-loader/index.d.ts +52 -0
- package/dist/types/src/vite-plugin/boot-loader/index.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 +37 -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 +25 -6
- package/package.json +112 -55
- package/src/cli/cli.ts +107 -0
- package/src/{components → cli}/index.ts +1 -1
- package/src/common/activation-events.ts +44 -0
- package/src/common/capabilities.ts +169 -210
- package/src/common/index.ts +4 -8
- package/src/common/operations.ts +35 -0
- package/src/common/translations.ts +18 -10
- package/src/context.ts +9 -0
- package/src/core/{events.ts → activation-event.ts} +10 -7
- package/src/core/capability-manager.test.ts +151 -0
- package/src/core/capability-manager.ts +192 -0
- package/src/core/capability.ts +247 -0
- package/src/core/index.ts +8 -4
- package/src/core/plugin-asset-cache.ts +60 -0
- package/src/core/plugin-manager.test.ts +1354 -0
- package/src/core/plugin-manager.ts +1025 -0
- package/src/core/plugin-manifest.test.ts +48 -0
- package/src/core/plugin-manifest.ts +102 -0
- package/src/core/plugin.ts +365 -45
- package/src/core/url-loader.test.ts +178 -0
- package/src/core/url-loader.ts +337 -0
- package/src/index.ts +3 -4
- package/src/plugin-operation/OperationPlugin.ts +24 -0
- package/src/plugin-operation/history/capability.ts +36 -0
- package/src/plugin-operation/history/errors.ts +7 -0
- package/src/plugin-operation/history/history-tracker.test.ts +374 -0
- package/src/plugin-operation/history/history-tracker.ts +128 -0
- package/src/plugin-operation/history/index.ts +9 -0
- package/src/plugin-operation/history/types.ts +17 -0
- package/src/plugin-operation/history/undo-mapping.ts +135 -0
- package/src/plugin-operation/history/undo-registry.test.ts +72 -0
- package/src/plugin-operation/history/undo-registry.ts +54 -0
- package/src/plugin-operation/index.ts +6 -0
- package/src/plugin-operation/invoker-capability.ts +55 -0
- package/src/plugin-operation/meta.ts +11 -0
- package/src/plugin-operation/testing.ts +155 -0
- package/src/plugin-runtime/RuntimePlugin.ts +19 -0
- package/src/plugin-runtime/capability.ts +53 -0
- package/src/{playground/layout → plugin-runtime}/index.ts +1 -1
- package/src/plugin-runtime/meta.ts +11 -0
- package/src/testing/harness.ts +229 -0
- package/src/testing/index.ts +2 -0
- package/src/testing/react.test.tsx +48 -0
- package/src/testing/react.tsx +113 -0
- package/src/testing/service.ts +52 -0
- package/src/testing/withPluginManager.stories.tsx +8 -9
- package/src/testing/withPluginManager.tsx +68 -40
- package/src/ui/components/App/App.stories.tsx +92 -0
- package/src/ui/components/App/App.tsx +81 -0
- package/src/{playground/debug → ui/components/App}/index.ts +1 -1
- package/src/ui/components/Placeholder/Placeholder.stories.tsx +77 -0
- package/src/ui/components/Placeholder/Placeholder.tsx +155 -0
- package/src/{playground/logger → ui/components/Placeholder}/index.ts +1 -1
- package/src/ui/components/PluginManager/PluginManagerContext.stories.tsx +185 -0
- package/src/{react → ui/components/PluginManager}/PluginManagerProvider.ts +3 -3
- package/src/ui/components/PluginManager/index.ts +5 -0
- package/src/ui/components/Surface/SurfaceComponent.stories.tsx +144 -0
- package/src/ui/components/Surface/SurfaceComponent.tsx +303 -0
- package/src/ui/components/Surface/SurfaceInfo.tsx +107 -0
- package/src/ui/components/Surface/SurfaceProfilerContext.tsx +207 -0
- package/src/ui/components/Surface/context.ts +12 -0
- package/src/ui/components/Surface/index.ts +54 -0
- package/src/ui/components/Surface/types.test.ts +126 -0
- package/src/ui/components/Surface/types.ts +269 -0
- package/src/ui/components/index.ts +8 -0
- package/src/ui/hooks/index.ts +9 -0
- package/src/ui/hooks/useApp.test.tsx +159 -0
- package/src/ui/hooks/useApp.tsx +413 -0
- package/src/ui/hooks/useCapabilities.ts +67 -0
- package/src/{components → ui/hooks}/useLoading.tsx +16 -10
- package/src/ui/hooks/useSettingsState.ts +26 -0
- package/src/ui/hooks/useSurface.ts +13 -0
- package/src/ui/index.ts +6 -0
- package/src/vite-plugin/boot-loader/BootLoader.stories.tsx +263 -0
- package/src/vite-plugin/boot-loader/boot-loader.css +294 -0
- package/src/vite-plugin/boot-loader/boot-loader.js +274 -0
- package/src/vite-plugin/boot-loader/index.ts +112 -0
- package/src/vite-plugin/composer/index.ts +277 -0
- package/src/vite-plugin/import-map/index.ts +524 -0
- package/src/vite-plugin/index.ts +10 -0
- package/src/vite-plugin/manifest.test.ts +24 -0
- package/src/vite-plugin/manifest.ts +50 -0
- package/src/vite-plugin/packages.ts +188 -0
- package/tsconfig.json +18 -15
- package/tsconfig.node.json +2 -4
- package/typedoc.json +2 -4
- package/vitest.config.ts +1 -1
- package/.swc/plugins/linux_x86_64_19.0.0/727453fb3a62f7f1d952a41e051ca8a6f88cadc45cee43c6a4d1aa45f9b75665.wasmer-v7 +0 -0
- package/.swc/plugins/linux_x86_64_19.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429.wasmer-v7 +0 -0
- package/dist/lib/browser/app-graph-builder-XH4OYQLC.mjs +0 -137
- package/dist/lib/browser/app-graph-builder-XH4OYQLC.mjs.map +0 -7
- package/dist/lib/browser/chunk-6V54SRFL.mjs +0 -1638
- package/dist/lib/browser/chunk-6V54SRFL.mjs.map +0 -7
- package/dist/lib/browser/chunk-RGKMLI6U.mjs +0 -35
- package/dist/lib/browser/chunk-RGKMLI6U.mjs.map +0 -7
- package/dist/lib/browser/chunk-ZZVFNUHZ.mjs +0 -467
- package/dist/lib/browser/chunk-ZZVFNUHZ.mjs.map +0 -7
- package/dist/lib/browser/intent-dispatcher-VFMJVO2M.mjs +0 -11
- package/dist/lib/browser/intent-resolver-ICAPD4JL.mjs +0 -39
- package/dist/lib/browser/intent-resolver-ICAPD4JL.mjs.map +0 -7
- package/dist/lib/browser/store-7ZGMHOGB.mjs +0 -30
- package/dist/lib/browser/store-7ZGMHOGB.mjs.map +0 -7
- package/dist/lib/browser/worker.mjs +0 -77
- package/dist/lib/node-esm/app-graph-builder-C7H22SOL.mjs +0 -138
- package/dist/lib/node-esm/app-graph-builder-C7H22SOL.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-AXSZKZFD.mjs +0 -468
- package/dist/lib/node-esm/chunk-AXSZKZFD.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-LKPMRTRR.mjs +0 -37
- package/dist/lib/node-esm/chunk-LKPMRTRR.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-SOVTUUAY.mjs +0 -1640
- package/dist/lib/node-esm/chunk-SOVTUUAY.mjs.map +0 -7
- package/dist/lib/node-esm/intent-dispatcher-SAPOKSLZ.mjs +0 -12
- package/dist/lib/node-esm/intent-resolver-CRNJ6BMD.mjs +0 -40
- package/dist/lib/node-esm/intent-resolver-CRNJ6BMD.mjs.map +0 -7
- package/dist/lib/node-esm/store-H4F4RMYD.mjs +0 -31
- package/dist/lib/node-esm/store-H4F4RMYD.mjs.map +0 -7
- package/dist/lib/node-esm/worker.mjs +0 -78
- package/dist/types/src/common/collaboration.d.ts +0 -20
- package/dist/types/src/common/collaboration.d.ts.map +0 -1
- package/dist/types/src/common/events.d.ts +0 -52
- package/dist/types/src/common/events.d.ts.map +0 -1
- package/dist/types/src/common/file.d.ts +0 -14
- package/dist/types/src/common/file.d.ts.map +0 -1
- package/dist/types/src/common/graph.d.ts +0 -21
- package/dist/types/src/common/graph.d.ts.map +0 -1
- package/dist/types/src/common/layout.d.ts +0 -279
- package/dist/types/src/common/layout.d.ts.map +0 -1
- package/dist/types/src/common/surface.d.ts +0 -59
- package/dist/types/src/common/surface.d.ts.map +0 -1
- package/dist/types/src/components/App.d.ts +0 -10
- package/dist/types/src/components/App.d.ts.map +0 -1
- package/dist/types/src/components/App.stories.d.ts.map +0 -1
- package/dist/types/src/components/DefaultFallback.d.ts +0 -8
- package/dist/types/src/components/DefaultFallback.d.ts.map +0 -1
- package/dist/types/src/components/index.d.ts +0 -2
- package/dist/types/src/components/index.d.ts.map +0 -1
- package/dist/types/src/components/useApp.d.ts +0 -44
- package/dist/types/src/components/useApp.d.ts.map +0 -1
- package/dist/types/src/components/useLoading.d.ts.map +0 -1
- package/dist/types/src/core/capabilities.d.ts +0 -117
- package/dist/types/src/core/capabilities.d.ts.map +0 -1
- package/dist/types/src/core/capabilities.test.d.ts +0 -2
- package/dist/types/src/core/capabilities.test.d.ts.map +0 -1
- package/dist/types/src/core/events.d.ts.map +0 -1
- package/dist/types/src/core/manager.d.ts +0 -126
- package/dist/types/src/core/manager.d.ts.map +0 -1
- package/dist/types/src/core/manager.test.d.ts +0 -2
- package/dist/types/src/core/manager.test.d.ts.map +0 -1
- package/dist/types/src/playground/debug/Debug.d.ts +0 -6
- package/dist/types/src/playground/debug/Debug.d.ts.map +0 -1
- package/dist/types/src/playground/debug/index.d.ts +0 -2
- package/dist/types/src/playground/debug/index.d.ts.map +0 -1
- package/dist/types/src/playground/debug/plugin.d.ts +0 -2
- package/dist/types/src/playground/debug/plugin.d.ts.map +0 -1
- package/dist/types/src/playground/generator/Main.d.ts +0 -6
- package/dist/types/src/playground/generator/Main.d.ts.map +0 -1
- package/dist/types/src/playground/generator/Toolbar.d.ts +0 -6
- package/dist/types/src/playground/generator/Toolbar.d.ts.map +0 -1
- package/dist/types/src/playground/generator/generator.d.ts +0 -7
- package/dist/types/src/playground/generator/generator.d.ts.map +0 -1
- package/dist/types/src/playground/generator/index.d.ts +0 -3
- package/dist/types/src/playground/generator/index.d.ts.map +0 -1
- package/dist/types/src/playground/generator/plugin.d.ts +0 -2
- package/dist/types/src/playground/generator/plugin.d.ts.map +0 -1
- package/dist/types/src/playground/layout/Layout.d.ts +0 -8
- package/dist/types/src/playground/layout/Layout.d.ts.map +0 -1
- package/dist/types/src/playground/layout/index.d.ts +0 -2
- package/dist/types/src/playground/layout/index.d.ts.map +0 -1
- package/dist/types/src/playground/layout/plugin.d.ts +0 -2
- package/dist/types/src/playground/layout/plugin.d.ts.map +0 -1
- package/dist/types/src/playground/logger/Toolbar.d.ts +0 -6
- package/dist/types/src/playground/logger/Toolbar.d.ts.map +0 -1
- package/dist/types/src/playground/logger/index.d.ts +0 -2
- package/dist/types/src/playground/logger/index.d.ts.map +0 -1
- package/dist/types/src/playground/logger/plugin.d.ts +0 -2
- package/dist/types/src/playground/logger/plugin.d.ts.map +0 -1
- package/dist/types/src/playground/logger/schema.d.ts +0 -13
- package/dist/types/src/playground/logger/schema.d.ts.map +0 -1
- package/dist/types/src/playground/playground.stories.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/IntentPlugin.d.ts +0 -2
- package/dist/types/src/plugin-intent/IntentPlugin.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/actions.d.ts +0 -36
- package/dist/types/src/plugin-intent/actions.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/errors.d.ts +0 -16
- package/dist/types/src/plugin-intent/errors.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/index.d.ts +0 -6
- package/dist/types/src/plugin-intent/index.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/intent-dispatcher.d.ts +0 -139
- package/dist/types/src/plugin-intent/intent-dispatcher.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts +0 -2
- package/dist/types/src/plugin-intent/intent-dispatcher.test.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/intent.d.ts +0 -63
- package/dist/types/src/plugin-intent/intent.d.ts.map +0 -1
- package/dist/types/src/plugin-intent/meta.d.ts +0 -3
- package/dist/types/src/plugin-intent/meta.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +0 -2
- package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/actions.d.ts +0 -25
- package/dist/types/src/plugin-settings/actions.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/app-graph-builder.d.ts +0 -4
- package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/index.d.ts +0 -3
- package/dist/types/src/plugin-settings/index.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/intent-resolver.d.ts +0 -4
- package/dist/types/src/plugin-settings/intent-resolver.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/meta.d.ts +0 -3
- package/dist/types/src/plugin-settings/meta.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/store.d.ts +0 -5
- package/dist/types/src/plugin-settings/store.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/translations.d.ts +0 -11
- package/dist/types/src/plugin-settings/translations.d.ts.map +0 -1
- package/dist/types/src/react/ErrorBoundary.d.ts +0 -30
- package/dist/types/src/react/ErrorBoundary.d.ts.map +0 -1
- package/dist/types/src/react/IntentContext.d.ts +0 -8
- package/dist/types/src/react/IntentContext.d.ts.map +0 -1
- package/dist/types/src/react/PluginManagerProvider.d.ts +0 -10
- package/dist/types/src/react/PluginManagerProvider.d.ts.map +0 -1
- package/dist/types/src/react/Surface.d.ts +0 -12
- package/dist/types/src/react/Surface.d.ts.map +0 -1
- package/dist/types/src/react/Surface.stories.d.ts +0 -17
- package/dist/types/src/react/Surface.stories.d.ts.map +0 -1
- package/dist/types/src/react/common.d.ts +0 -13
- package/dist/types/src/react/common.d.ts.map +0 -1
- package/dist/types/src/react/index.d.ts +0 -7
- package/dist/types/src/react/index.d.ts.map +0 -1
- package/dist/types/src/react/useCapabilities.d.ts +0 -13
- package/dist/types/src/react/useCapabilities.d.ts.map +0 -1
- package/dist/types/src/react/useIntentResolver.d.ts +0 -3
- package/dist/types/src/react/useIntentResolver.d.ts.map +0 -1
- package/dist/types/src/worker.d.ts +0 -4
- package/dist/types/src/worker.d.ts.map +0 -1
- package/src/common/collaboration.ts +0 -18
- package/src/common/events.ts +0 -79
- package/src/common/file.ts +0 -22
- package/src/common/graph.ts +0 -30
- package/src/common/layout.ts +0 -277
- package/src/common/surface.ts +0 -83
- package/src/components/App.stories.tsx +0 -33
- package/src/components/App.tsx +0 -59
- package/src/components/DefaultFallback.tsx +0 -26
- package/src/components/useApp.tsx +0 -164
- package/src/core/capabilities.test.ts +0 -136
- package/src/core/capabilities.ts +0 -259
- package/src/core/manager.test.ts +0 -516
- package/src/core/manager.ts +0 -597
- package/src/playground/debug/Debug.tsx +0 -39
- package/src/playground/debug/plugin.ts +0 -16
- package/src/playground/generator/Main.tsx +0 -71
- package/src/playground/generator/Toolbar.tsx +0 -47
- package/src/playground/generator/generator.ts +0 -48
- package/src/playground/generator/index.ts +0 -6
- package/src/playground/generator/plugin.ts +0 -22
- package/src/playground/layout/Layout.tsx +0 -33
- package/src/playground/layout/plugin.ts +0 -18
- package/src/playground/logger/Toolbar.tsx +0 -30
- package/src/playground/logger/plugin.ts +0 -41
- package/src/playground/logger/schema.ts +0 -12
- package/src/playground/playground.stories.tsx +0 -46
- package/src/plugin-intent/IntentPlugin.ts +0 -20
- package/src/plugin-intent/actions.ts +0 -31
- package/src/plugin-intent/errors.ts +0 -40
- package/src/plugin-intent/index.ts +0 -9
- package/src/plugin-intent/intent-dispatcher.test.ts +0 -279
- package/src/plugin-intent/intent-dispatcher.ts +0 -334
- package/src/plugin-intent/intent.ts +0 -154
- package/src/plugin-intent/meta.ts +0 -10
- package/src/plugin-settings/SettingsPlugin.ts +0 -34
- package/src/plugin-settings/actions.ts +0 -25
- package/src/plugin-settings/app-graph-builder.ts +0 -159
- package/src/plugin-settings/index.ts +0 -6
- package/src/plugin-settings/intent-resolver.ts +0 -35
- package/src/plugin-settings/meta.ts +0 -10
- package/src/plugin-settings/store.ts +0 -33
- package/src/plugin-settings/translations.ts +0 -19
- package/src/react/ErrorBoundary.tsx +0 -54
- package/src/react/IntentContext.tsx +0 -35
- package/src/react/Surface.stories.tsx +0 -101
- package/src/react/Surface.tsx +0 -86
- package/src/react/common.ts +0 -13
- package/src/react/index.ts +0 -10
- package/src/react/useCapabilities.ts +0 -31
- package/src/react/useIntentResolver.ts +0 -22
- package/src/worker.ts +0 -11
- /package/dist/lib/browser/{intent-dispatcher-VFMJVO2M.mjs.map → chunk-G7SDBRKH.mjs.map} +0 -0
- /package/dist/lib/browser/{worker.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
- /package/dist/lib/{node-esm/intent-dispatcher-SAPOKSLZ.mjs.map → browser/common/activation-events.mjs.map} +0 -0
- /package/dist/lib/{node-esm/worker.mjs.map → browser/common/capabilities.mjs.map} +0 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import React, { type ReactNode, useEffect, useLayoutEffect, useRef } from 'react';
|
|
6
|
+
|
|
7
|
+
import { ThemeProvider } from '@dxos/react-ui';
|
|
8
|
+
import { defaultTx, mx } from '@dxos/ui-theme';
|
|
9
|
+
|
|
10
|
+
import { type PlaceholderProps as PlaceholderSlotProps } from '../../hooks';
|
|
11
|
+
|
|
12
|
+
declare global {
|
|
13
|
+
interface Window {
|
|
14
|
+
/**
|
|
15
|
+
* Driver injected by `@dxos/app-framework/vite-plugin`'s `bootLoaderPlugin`.
|
|
16
|
+
* Declared here so the {@link Placeholder} can dismiss the native-DOM
|
|
17
|
+
* loader once the React placeholder commits without each host having to
|
|
18
|
+
* re-declare the type.
|
|
19
|
+
*/
|
|
20
|
+
__bootLoader?: {
|
|
21
|
+
status: (payload: {
|
|
22
|
+
event?: string;
|
|
23
|
+
module?: string;
|
|
24
|
+
humanized: string;
|
|
25
|
+
/**
|
|
26
|
+
* Optional `(index/total)` tick. When present, the loader replaces the
|
|
27
|
+
* current line in place ("Loading plugins (12/80)") instead of
|
|
28
|
+
* appending a new entry — keeps the visible log compact during long
|
|
29
|
+
* counted phases like plugin chunk-loading or module activation.
|
|
30
|
+
*/
|
|
31
|
+
range?: { index: number; total: number };
|
|
32
|
+
}) => void;
|
|
33
|
+
progress: (fraction?: number) => void;
|
|
34
|
+
dismiss: () => void;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export type PlaceholderComponentProps = PlaceholderSlotProps & {
|
|
40
|
+
/**
|
|
41
|
+
* Brand mark rendered while the React tree settles. Pass either a static
|
|
42
|
+
* `ReactNode` (the framework wraps it in a sizing/animation div) or a
|
|
43
|
+
* render function that receives the precomputed `className` so the host
|
|
44
|
+
* can apply it directly to its logo (e.g. an SVG that accepts `className`
|
|
45
|
+
* — `composer-app` passes `(p) => <Composer {...p} />` from `@dxos/brand`).
|
|
46
|
+
*/
|
|
47
|
+
logo?: ReactNode | ((props: { className: string }) => ReactNode);
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* React placeholder. The native-DOM boot loader is the visible UI through
|
|
52
|
+
* stages 0 (Loading) and 1 (FadeIn): we render `null` until `stage >= 2`
|
|
53
|
+
* (FadeOut) and instead feed activation progress + status into the still-
|
|
54
|
+
* alive boot loader. At stage 2 the loader dismisses and the React mark
|
|
55
|
+
* appears for the cross-fade to the real shell:
|
|
56
|
+
*
|
|
57
|
+
* - composer-app fills `0 → 50%` from `getPlugins`'s per-chunk counter.
|
|
58
|
+
* - this component fills `50 → 100%` from `useApp`'s
|
|
59
|
+
* `startupProgress.progress` (`activated / total` modules) and pushes
|
|
60
|
+
* the per-module status text to the loader's status line.
|
|
61
|
+
* - at `stage >= 2` the boot loader is dismissed and the React mark
|
|
62
|
+
* starts its `FadeOut → Done` shrink-and-fade.
|
|
63
|
+
*
|
|
64
|
+
* Stage progression (driven by `useApp`):
|
|
65
|
+
* - `0` — Loading: native-DOM boot loader visible. Placeholder renders nothing.
|
|
66
|
+
* - `1` — FadeIn: same — boot loader still owns the screen.
|
|
67
|
+
* - `2` — FadeOut: boot loader dismissed, React mark visible at full opacity then shrinks.
|
|
68
|
+
*/
|
|
69
|
+
export const Placeholder = ({ stage = 1, progress, logo }: PlaceholderComponentProps) => {
|
|
70
|
+
// Used in tests to exercise the error boundary & reset dialog.
|
|
71
|
+
if (location.search === '?throw') {
|
|
72
|
+
throw new Error('Test error');
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Phase B: feed activation progress + status to the still-visible boot
|
|
76
|
+
// loader. Maps `[0, 1]` activation → `[0.5, 1]` of the ring; forwards
|
|
77
|
+
// the raw activation source (`event` / `module`) plus the pre-humanised
|
|
78
|
+
// label to `__bootLoader.status` so the loader gets to decide how to
|
|
79
|
+
// render and trace each transition (current default policy: "Activating
|
|
80
|
+
// <humanizedName>"; trace mode and timings track the structured fields).
|
|
81
|
+
// No-op once the loader has been dismissed (its `status()` early-returns
|
|
82
|
+
// when the boot DOM is gone). Skipping `stage >= 2` lets the dismissal
|
|
83
|
+
// run uncontended.
|
|
84
|
+
useEffect(() => {
|
|
85
|
+
if (stage >= 2) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const fraction = progress?.progress ?? 0;
|
|
89
|
+
window.__bootLoader?.progress(0.5 + fraction * 0.5);
|
|
90
|
+
if (progress?.humanizedName) {
|
|
91
|
+
window.__bootLoader?.status({
|
|
92
|
+
event: progress.event,
|
|
93
|
+
module: progress.module,
|
|
94
|
+
humanized: `Activating ${progress.humanizedName}`,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}, [stage, progress?.progress, progress?.event, progress?.module, progress?.humanizedName]);
|
|
98
|
+
|
|
99
|
+
// Hand off from the native-DOM boot loader once the placeholder starts
|
|
100
|
+
// fading out — keeping the loader visible through `stage 0` and `stage 1`
|
|
101
|
+
// means the ring stays the visible source of truth for activation
|
|
102
|
+
// progress. `useLayoutEffect` runs before the next paint so the loader
|
|
103
|
+
// DOM is removed in the same frame the cross-fade begins.
|
|
104
|
+
useLayoutEffect(() => {
|
|
105
|
+
if (stage >= 2) {
|
|
106
|
+
window.__bootLoader?.dismiss();
|
|
107
|
+
}
|
|
108
|
+
}, [stage]);
|
|
109
|
+
|
|
110
|
+
// Backstop for the fast-load path where `useLoading` can skip straight
|
|
111
|
+
// from stage 0 to `Done` (ready=true at the first debounce tick) — the
|
|
112
|
+
// stage-driven effect above never sees `stage >= 2`, so dismiss on
|
|
113
|
+
// unmount instead. The `stageRef` guard is what keeps StrictMode's
|
|
114
|
+
// synthetic mount → cleanup → remount cycle from prematurely dismissing
|
|
115
|
+
// the loader: the synthetic cleanup runs while `stageRef.current === 0`,
|
|
116
|
+
// skips the dismiss, and the real unmount (later, at stage `Done`)
|
|
117
|
+
// performs it.
|
|
118
|
+
const stageRef = useRef(stage);
|
|
119
|
+
stageRef.current = stage;
|
|
120
|
+
useEffect(() => {
|
|
121
|
+
return () => {
|
|
122
|
+
if (stageRef.current >= 3 /* Done */) {
|
|
123
|
+
window.__bootLoader?.dismiss();
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
}, []);
|
|
127
|
+
|
|
128
|
+
// Defer rendering anything until the FadeOut stage. The boot loader owns
|
|
129
|
+
// the screen during stages 0 and 1, so any DOM we render here would just
|
|
130
|
+
// sit invisibly behind it — and rendering null avoids paint cost during
|
|
131
|
+
// the longest part of the loading sequence (plugin activation).
|
|
132
|
+
if (stage < 2) {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const logoClassName = mx(
|
|
137
|
+
'h-[300px] w-[300px] scale-600 transition-all duration-500 ease-in-out filter grayscale opacity-0',
|
|
138
|
+
stage >= 1 && 'scale-100 grayscale-0 opacity-70',
|
|
139
|
+
stage >= 2 && 'scale-50 opacity-0',
|
|
140
|
+
);
|
|
141
|
+
|
|
142
|
+
return (
|
|
143
|
+
<ThemeProvider tx={defaultTx}>
|
|
144
|
+
<div role='none' className='relative dx-container h-dvh flex flex-col'>
|
|
145
|
+
<div role='none' className='flex flex-col grow justify-center items-center'>
|
|
146
|
+
{typeof logo === 'function' ? (
|
|
147
|
+
logo({ className: logoClassName })
|
|
148
|
+
) : logo ? (
|
|
149
|
+
<div className={logoClassName}>{logo}</div>
|
|
150
|
+
) : null}
|
|
151
|
+
</div>
|
|
152
|
+
</div>
|
|
153
|
+
</ThemeProvider>
|
|
154
|
+
);
|
|
155
|
+
};
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { Atom, useAtomValue } from '@effect-atom/atom-react';
|
|
6
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
7
|
+
import * as Effect from 'effect/Effect';
|
|
8
|
+
import React, { useEffect, useMemo, useState } from 'react';
|
|
9
|
+
|
|
10
|
+
import { withLayout, withTheme } from '@dxos/react-ui/testing';
|
|
11
|
+
import { useWebComponentContext } from '@dxos/web-context-react';
|
|
12
|
+
|
|
13
|
+
import { ActivationEvents, Capabilities } from '../../../common';
|
|
14
|
+
import { PluginManagerContext } from '../../../context';
|
|
15
|
+
import { Capability, Plugin } from '../../../core';
|
|
16
|
+
import { useApp } from '../../hooks';
|
|
17
|
+
|
|
18
|
+
// Define the Counter capability
|
|
19
|
+
const Counter = Capability.make<{ count: number; increment: () => void }>('example/counter');
|
|
20
|
+
|
|
21
|
+
const CountStatus = () => {
|
|
22
|
+
const manager = useWebComponentContext(PluginManagerContext);
|
|
23
|
+
const capabilitiesAtom = useMemo(
|
|
24
|
+
() => manager?.capabilities.atom(Counter) ?? Atom.make<{ count: number; increment: () => void }[]>([]),
|
|
25
|
+
[manager],
|
|
26
|
+
);
|
|
27
|
+
const capabilities = useAtomValue(capabilitiesAtom);
|
|
28
|
+
const counter = (capabilities as any)[0];
|
|
29
|
+
const [count, setCount] = useState(counter?.count ?? 0);
|
|
30
|
+
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
if (!counter) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
setCount(counter.count);
|
|
36
|
+
if ('subscribe' in counter && typeof counter.subscribe === 'function') {
|
|
37
|
+
return counter.subscribe(() => setCount(counter.count));
|
|
38
|
+
}
|
|
39
|
+
}, [counter]);
|
|
40
|
+
|
|
41
|
+
if (!manager) {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const isEven = count % 2 === 0;
|
|
46
|
+
|
|
47
|
+
return (
|
|
48
|
+
<div
|
|
49
|
+
className={`mt-4 px-4 py-2 rounded-full text-sm font-medium transition-colors ${
|
|
50
|
+
isEven
|
|
51
|
+
? 'bg-emerald-100 text-emerald-800 dark:bg-emerald-900/30 dark:text-emerald-400'
|
|
52
|
+
: 'bg-amber-100 text-amber-800 dark:bg-amber-900/30 dark:text-amber-400'
|
|
53
|
+
}`}
|
|
54
|
+
>
|
|
55
|
+
Status: {isEven ? 'Even' : 'Odd'}
|
|
56
|
+
</div>
|
|
57
|
+
);
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
// A component that consumes the PluginManager via web context
|
|
61
|
+
const CounterComponent = () => {
|
|
62
|
+
// Use the web-context hook to get the PluginManager
|
|
63
|
+
const manager = useWebComponentContext(PluginManagerContext);
|
|
64
|
+
const capabilitiesAtom = useMemo(
|
|
65
|
+
() => manager?.capabilities.atom(Counter) ?? Atom.make<{ count: number; increment: () => void }[]>([]),
|
|
66
|
+
[manager],
|
|
67
|
+
);
|
|
68
|
+
const capabilities = useAtomValue(capabilitiesAtom);
|
|
69
|
+
const counter = (capabilities as any)[0];
|
|
70
|
+
const [count, setCount] = useState(counter?.count ?? 0);
|
|
71
|
+
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
if (!counter) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
setCount(counter.count);
|
|
77
|
+
if ('subscribe' in counter && typeof counter.subscribe === 'function') {
|
|
78
|
+
return counter.subscribe(() => setCount(counter.count));
|
|
79
|
+
}
|
|
80
|
+
}, [counter]);
|
|
81
|
+
|
|
82
|
+
if (!manager) {
|
|
83
|
+
return <div className='p-4 text-error-text'>Error: Context not found</div>;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return (
|
|
87
|
+
<div className='flex flex-col items-center justify-center h-screen bg-neutral-100 dark:bg-neutral-900 text-neutral-900 dark:text-white'>
|
|
88
|
+
<div className='p-8 bg-white dark:bg-neutral-800 rounded-lg shadow-xl border border-neutral-200 dark:border-neutral-700 max-w-md w-full'>
|
|
89
|
+
<h2 className='text-2xl font-bold mb-6 text-center text-primary-600 dark:text-primary-400'>
|
|
90
|
+
Web Context Counter
|
|
91
|
+
</h2>
|
|
92
|
+
|
|
93
|
+
<div className='flex flex-col items-center gap-6'>
|
|
94
|
+
<div className='text-6xl font-mono font-bold tabular-nums tracking-tighter'>{count}</div>
|
|
95
|
+
|
|
96
|
+
<button
|
|
97
|
+
className='px-6 py-3 bg-primary-600 hover:bg-primary-700 text-white font-semibold rounded-full transition-colors shadow-md active:transform active:scale-95'
|
|
98
|
+
onClick={() => {
|
|
99
|
+
const counter = manager.capabilities.get(Counter);
|
|
100
|
+
counter.increment();
|
|
101
|
+
}}
|
|
102
|
+
>
|
|
103
|
+
Increment
|
|
104
|
+
</button>
|
|
105
|
+
|
|
106
|
+
<CountStatus />
|
|
107
|
+
</div>
|
|
108
|
+
|
|
109
|
+
<div className='mt-8 pt-4 border-t border-neutral-200 dark:border-neutral-700 text-center'>
|
|
110
|
+
<p className='text-sm text-neutral-500 dark:text-neutral-400'>
|
|
111
|
+
This component accesses the <code>PluginManager</code> via <code>useWebComponentContext</code>.
|
|
112
|
+
</p>
|
|
113
|
+
</div>
|
|
114
|
+
</div>
|
|
115
|
+
</div>
|
|
116
|
+
);
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
// Plugin that provides the Counter capability and renders the UI
|
|
120
|
+
const CounterPlugin = Plugin.define({
|
|
121
|
+
id: 'org.dxos.plugin.counter',
|
|
122
|
+
name: 'Counter Plugin',
|
|
123
|
+
}).pipe(
|
|
124
|
+
Plugin.addModule({
|
|
125
|
+
id: 'CounterMain',
|
|
126
|
+
activatesOn: ActivationEvents.Startup,
|
|
127
|
+
activate: () => {
|
|
128
|
+
const listeners = new Set<() => void>();
|
|
129
|
+
const counter = {
|
|
130
|
+
count: 0,
|
|
131
|
+
increment: () => {
|
|
132
|
+
counter.count++;
|
|
133
|
+
listeners.forEach((listener) => listener());
|
|
134
|
+
},
|
|
135
|
+
subscribe: (listener: () => void) => {
|
|
136
|
+
listeners.add(listener);
|
|
137
|
+
return () => listeners.delete(listener);
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
return Effect.succeed([
|
|
142
|
+
// Contribute the state/logic
|
|
143
|
+
Capability.contributes(Counter, counter),
|
|
144
|
+
|
|
145
|
+
// Contribute the UI
|
|
146
|
+
Capability.contributes(Capabilities.ReactRoot, {
|
|
147
|
+
id: 'org.dxos.plugin.counter.root',
|
|
148
|
+
root: CounterComponent,
|
|
149
|
+
}),
|
|
150
|
+
]);
|
|
151
|
+
},
|
|
152
|
+
}),
|
|
153
|
+
Plugin.make,
|
|
154
|
+
)();
|
|
155
|
+
|
|
156
|
+
const plugins = [CounterPlugin];
|
|
157
|
+
const core = ['org.dxos.plugin.counter'];
|
|
158
|
+
const placeholder = () => (
|
|
159
|
+
<div className='flex h-screen items-center justify-center p-4 text-lg text-neutral-500'>
|
|
160
|
+
Initializing Application...
|
|
161
|
+
</div>
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
const DefaultStory = () => {
|
|
165
|
+
const App = useApp({
|
|
166
|
+
plugins,
|
|
167
|
+
core,
|
|
168
|
+
placeholder,
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
return <App />;
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
const meta = {
|
|
175
|
+
title: 'sdk/app-framework/components/PluginManagerContext',
|
|
176
|
+
render: DefaultStory,
|
|
177
|
+
decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
|
|
178
|
+
parameters: {
|
|
179
|
+
layout: 'fullscreen',
|
|
180
|
+
},
|
|
181
|
+
} satisfies Meta;
|
|
182
|
+
|
|
183
|
+
export default meta;
|
|
184
|
+
|
|
185
|
+
export const Default: StoryObj<typeof meta> = {};
|
|
@@ -6,14 +6,14 @@ import { createContext, useContext } from 'react';
|
|
|
6
6
|
|
|
7
7
|
import { raise } from '@dxos/debug';
|
|
8
8
|
|
|
9
|
-
import { type PluginManager } from '
|
|
9
|
+
import { type PluginManager } from '../../../core';
|
|
10
10
|
|
|
11
|
-
const PluginManagerContext = createContext<PluginManager | undefined>(undefined);
|
|
11
|
+
const PluginManagerContext = createContext<PluginManager.PluginManager | undefined>(undefined);
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* Get the plugin manager.
|
|
15
15
|
*/
|
|
16
|
-
export const usePluginManager = (): PluginManager =>
|
|
16
|
+
export const usePluginManager = (): PluginManager.PluginManager =>
|
|
17
17
|
useContext(PluginManagerContext) ?? raise(new Error('Missing PluginManagerContext'));
|
|
18
18
|
|
|
19
19
|
/**
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
6
|
+
import React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';
|
|
7
|
+
|
|
8
|
+
import { random } from '@dxos/random';
|
|
9
|
+
import { List, ListItem, Panel, Toolbar } from '@dxos/react-ui';
|
|
10
|
+
import { withLayout, withTheme } from '@dxos/react-ui/testing';
|
|
11
|
+
import { type ColorStyles, getHashStyles, mx } from '@dxos/ui-theme';
|
|
12
|
+
|
|
13
|
+
import { Capabilities } from '../../../common';
|
|
14
|
+
import { withPluginManager } from '../../../testing';
|
|
15
|
+
import { usePluginManager } from '../PluginManager';
|
|
16
|
+
import { SurfaceComponent, useSurfaces } from './SurfaceComponent';
|
|
17
|
+
import { create } from './types';
|
|
18
|
+
|
|
19
|
+
type TestComponentProps = {
|
|
20
|
+
id: string;
|
|
21
|
+
styles: ColorStyles;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const TestComponent = forwardRef<HTMLDivElement, TestComponentProps>(({ styles, id }, forwardedRef) => {
|
|
25
|
+
return (
|
|
26
|
+
<div
|
|
27
|
+
className={mx('flex justify-center items-center border rounded-sm', styles.surface, styles.border)}
|
|
28
|
+
ref={forwardedRef}
|
|
29
|
+
>
|
|
30
|
+
<span className={mx('dx-tag font-mono text-lg', styles.text)}>{id}</span>
|
|
31
|
+
</div>
|
|
32
|
+
);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
const DefaultStory = () => {
|
|
36
|
+
const manager = usePluginManager();
|
|
37
|
+
const surfaces = useSurfaces();
|
|
38
|
+
const [selected, setSelected] = useState<string | undefined>();
|
|
39
|
+
|
|
40
|
+
const handleAdd = useCallback(() => {
|
|
41
|
+
const id = `test-${random.number.int({ min: 0, max: 1_000 })}`;
|
|
42
|
+
const styles = getHashStyles(id);
|
|
43
|
+
|
|
44
|
+
manager.capabilities.contribute({
|
|
45
|
+
module: 'test',
|
|
46
|
+
interface: Capabilities.ReactSurface,
|
|
47
|
+
implementation: create({
|
|
48
|
+
id,
|
|
49
|
+
role: 'item',
|
|
50
|
+
filter: (data): data is any => (data as any)?.id === id,
|
|
51
|
+
component: ({ ref }) => <TestComponent id={id} styles={styles} ref={ref} />,
|
|
52
|
+
}),
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
setSelected(id);
|
|
56
|
+
}, [manager]);
|
|
57
|
+
|
|
58
|
+
const handleSelect = useCallback(() => {
|
|
59
|
+
setSelected(random.helpers.arrayElement(surfaces)?.id);
|
|
60
|
+
}, [surfaces]);
|
|
61
|
+
|
|
62
|
+
const handleError = useCallback(() => {
|
|
63
|
+
manager.capabilities.contribute({
|
|
64
|
+
module: 'error',
|
|
65
|
+
interface: Capabilities.ReactSurface,
|
|
66
|
+
implementation: create({
|
|
67
|
+
id: 'error',
|
|
68
|
+
role: 'item',
|
|
69
|
+
filter: (data): data is any => (data as any)?.id === 'error',
|
|
70
|
+
component: () => {
|
|
71
|
+
const [count, setCount] = useState(3);
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
const interval = setInterval(() => {
|
|
74
|
+
setCount((count) => {
|
|
75
|
+
if (count <= 1) {
|
|
76
|
+
clearInterval(interval);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return count - 1;
|
|
80
|
+
});
|
|
81
|
+
}, 1_000);
|
|
82
|
+
return () => clearInterval(interval);
|
|
83
|
+
}, []);
|
|
84
|
+
|
|
85
|
+
if (count <= 0) {
|
|
86
|
+
throw new Error('BANG!');
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return (
|
|
90
|
+
<div className='flex justify-center items-center border border-rose-fill rounded-sm'>
|
|
91
|
+
<span className='font-mono'>Ticking... {count}</span>
|
|
92
|
+
</div>
|
|
93
|
+
);
|
|
94
|
+
},
|
|
95
|
+
}),
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
setSelected('error');
|
|
99
|
+
}, [manager]);
|
|
100
|
+
|
|
101
|
+
const ref = useRef<HTMLElement>(null);
|
|
102
|
+
useEffect(() => {
|
|
103
|
+
console.log(ref.current);
|
|
104
|
+
}, [ref]);
|
|
105
|
+
|
|
106
|
+
return (
|
|
107
|
+
<Panel.Root>
|
|
108
|
+
<Panel.Toolbar asChild>
|
|
109
|
+
<Toolbar.Root>
|
|
110
|
+
<Toolbar.Button onClick={handleAdd}>Add</Toolbar.Button>
|
|
111
|
+
<Toolbar.Button onClick={handleSelect}>Pick</Toolbar.Button>
|
|
112
|
+
<Toolbar.Button onClick={handleError}>Error</Toolbar.Button>
|
|
113
|
+
</Toolbar.Root>
|
|
114
|
+
</Panel.Toolbar>
|
|
115
|
+
<Panel.Content className='grid grid-cols-2 h-full gap-4 overflow-hidden'>
|
|
116
|
+
<SurfaceComponent role='item' data={selected ? { id: selected } : undefined} limit={1} ref={ref} />
|
|
117
|
+
<div className='overflow-y-auto h-full'>
|
|
118
|
+
<List>
|
|
119
|
+
{surfaces.map((surface) => (
|
|
120
|
+
<ListItem.Root key={surface.id} id={surface.id}>
|
|
121
|
+
<ListItem.Heading classNames='flex items-center'>{surface.id}</ListItem.Heading>
|
|
122
|
+
</ListItem.Root>
|
|
123
|
+
))}
|
|
124
|
+
</List>
|
|
125
|
+
</div>
|
|
126
|
+
</Panel.Content>
|
|
127
|
+
</Panel.Root>
|
|
128
|
+
);
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
const meta = {
|
|
132
|
+
title: 'sdk/app-framework/components/Surface',
|
|
133
|
+
render: DefaultStory,
|
|
134
|
+
decorators: [withTheme(), withLayout({ layout: 'fullscreen' }), withPluginManager({ capabilities: [] })],
|
|
135
|
+
parameters: {
|
|
136
|
+
layout: 'fullscreen',
|
|
137
|
+
},
|
|
138
|
+
} satisfies Meta<typeof DefaultStory>;
|
|
139
|
+
|
|
140
|
+
export default meta;
|
|
141
|
+
|
|
142
|
+
type Story = StoryObj<typeof meta>;
|
|
143
|
+
|
|
144
|
+
export const Default: Story = {};
|