@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,303 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { useAtomValue } from '@effect-atom/atom-react';
|
|
6
|
+
import React, {
|
|
7
|
+
Fragment,
|
|
8
|
+
type NamedExoticComponent,
|
|
9
|
+
Profiler,
|
|
10
|
+
type RefAttributes,
|
|
11
|
+
Suspense,
|
|
12
|
+
forwardRef,
|
|
13
|
+
memo,
|
|
14
|
+
useEffect,
|
|
15
|
+
useMemo,
|
|
16
|
+
useRef,
|
|
17
|
+
} from 'react';
|
|
18
|
+
|
|
19
|
+
import { log } from '@dxos/log';
|
|
20
|
+
import { ErrorBoundary } from '@dxos/react-error-boundary';
|
|
21
|
+
import { useDefaultValue } from '@dxos/react-hooks';
|
|
22
|
+
import { byPosition } from '@dxos/util';
|
|
23
|
+
|
|
24
|
+
import { Capabilities } from '../../../common';
|
|
25
|
+
import { type CapabilityManager } from '../../../core';
|
|
26
|
+
import { usePluginManager } from '../PluginManager/PluginManagerProvider';
|
|
27
|
+
import { SurfaceContext } from './context';
|
|
28
|
+
import { SurfaceInfo } from './SurfaceInfo';
|
|
29
|
+
import { useSurfaceProfilerCallback } from './SurfaceProfilerContext';
|
|
30
|
+
import {
|
|
31
|
+
type Definition,
|
|
32
|
+
type Props,
|
|
33
|
+
type RoleToken,
|
|
34
|
+
type TokenData,
|
|
35
|
+
type TypedProps,
|
|
36
|
+
type WebComponentDefinition,
|
|
37
|
+
} from './types';
|
|
38
|
+
|
|
39
|
+
const DEBUG = import.meta.env.VITE_DEBUG;
|
|
40
|
+
|
|
41
|
+
const DEFAULT_PLACEHOLDER = <Fragment />;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Wrapper component for rendering Web Component surfaces.
|
|
45
|
+
* Handles creation, prop setting, and cleanup of Web Components.
|
|
46
|
+
*/
|
|
47
|
+
const WebComponentWrapper = memo(
|
|
48
|
+
forwardRef<HTMLElement, Omit<Props, 'role'> & { role: string; definition: WebComponentDefinition }>(
|
|
49
|
+
({ id, role, data, limit, definition, ...rest }, forwardedRef) => {
|
|
50
|
+
const containerRef = useRef<HTMLDivElement>(null);
|
|
51
|
+
const elementRef = useRef<HTMLElement | null>(null);
|
|
52
|
+
const propsRef = useRef({ id, role, data, limit, ...rest });
|
|
53
|
+
|
|
54
|
+
// Update props ref on every render
|
|
55
|
+
propsRef.current = { id, role, data, limit, ...rest };
|
|
56
|
+
|
|
57
|
+
// Create element only once
|
|
58
|
+
useEffect(() => {
|
|
59
|
+
if (!containerRef.current || elementRef.current) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Create the Web Component
|
|
64
|
+
const element = document.createElement(definition.tagName);
|
|
65
|
+
elementRef.current = element;
|
|
66
|
+
|
|
67
|
+
// Set initial properties on the Web Component
|
|
68
|
+
Object.assign(element, propsRef.current);
|
|
69
|
+
|
|
70
|
+
// Append to container
|
|
71
|
+
containerRef.current.appendChild(element);
|
|
72
|
+
|
|
73
|
+
// Setup ref forwarding if provided
|
|
74
|
+
if (typeof forwardedRef === 'function') {
|
|
75
|
+
forwardedRef(element);
|
|
76
|
+
} else if (forwardedRef) {
|
|
77
|
+
forwardedRef.current = element;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Cleanup on unmount to prevent memory leaks
|
|
81
|
+
return () => {
|
|
82
|
+
if (elementRef.current && containerRef.current?.contains(elementRef.current)) {
|
|
83
|
+
containerRef.current.removeChild(elementRef.current);
|
|
84
|
+
}
|
|
85
|
+
if (typeof forwardedRef === 'function') {
|
|
86
|
+
forwardedRef(null);
|
|
87
|
+
} else if (forwardedRef) {
|
|
88
|
+
forwardedRef.current = null;
|
|
89
|
+
}
|
|
90
|
+
elementRef.current = null;
|
|
91
|
+
};
|
|
92
|
+
}, [definition.tagName, forwardedRef]);
|
|
93
|
+
|
|
94
|
+
// Update props on existing element without recreating it
|
|
95
|
+
// This runs on every render to ensure all props (including those in `rest`) are kept up to date
|
|
96
|
+
useEffect(() => {
|
|
97
|
+
const element = elementRef.current;
|
|
98
|
+
if (!element) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Update properties on the existing Web Component
|
|
103
|
+
Object.assign(element, propsRef.current);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
return <div ref={containerRef} />;
|
|
107
|
+
},
|
|
108
|
+
),
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
WebComponentWrapper.displayName = 'WebComponentWrapper';
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Wrapper component that provides context for a surface.
|
|
115
|
+
*/
|
|
116
|
+
// TODO(burdon): Allow DebugPlugin to provide different fallback using react-ui ErrorFallback.
|
|
117
|
+
const SurfaceContextProvider = memo(
|
|
118
|
+
forwardRef<HTMLElement, Omit<Props, 'role'> & { role: string; definition: Definition }>(
|
|
119
|
+
({ id, role, data, limit, fallback = ErrorFallback, definition, ...rest }, forwardedRef) => {
|
|
120
|
+
const contextValue = useMemo(() => ({ id, role, data }), [id, role, data]);
|
|
121
|
+
const onProfilerRender = useSurfaceProfilerCallback();
|
|
122
|
+
const profilerId = `surface/${id}/${role}`;
|
|
123
|
+
|
|
124
|
+
// Handle Web Component surfaces
|
|
125
|
+
if (definition.kind === 'web-component') {
|
|
126
|
+
return (
|
|
127
|
+
<ErrorBoundary name='surface' resetKeys={[data]} FallbackComponent={fallback}>
|
|
128
|
+
<SurfaceContext.Provider value={contextValue}>
|
|
129
|
+
<WebComponentWrapper
|
|
130
|
+
id={id}
|
|
131
|
+
role={role}
|
|
132
|
+
data={data}
|
|
133
|
+
limit={limit}
|
|
134
|
+
definition={definition}
|
|
135
|
+
ref={forwardedRef}
|
|
136
|
+
{...rest}
|
|
137
|
+
/>
|
|
138
|
+
</SurfaceContext.Provider>
|
|
139
|
+
</ErrorBoundary>
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Handle React component surfaces
|
|
144
|
+
const Component = definition.component;
|
|
145
|
+
|
|
146
|
+
// TODO(burdon): Remove from production build?
|
|
147
|
+
const debug = DEBUG || '__DX_DEBUG__' in window;
|
|
148
|
+
if (debug) {
|
|
149
|
+
return (
|
|
150
|
+
<ErrorBoundary name='surface' resetKeys={[data]} FallbackComponent={fallback}>
|
|
151
|
+
<div role='none' className='contents' data-id={id} data-role={role}>
|
|
152
|
+
<SurfaceContext.Provider value={contextValue}>
|
|
153
|
+
<SurfaceInfo ref={forwardedRef}>
|
|
154
|
+
{onProfilerRender && !profilerId.includes('org.dxos.plugin.debug') ? (
|
|
155
|
+
<Profiler id={profilerId} onRender={onProfilerRender}>
|
|
156
|
+
<Component id={id} role={role} data={data} limit={limit} {...rest} />
|
|
157
|
+
</Profiler>
|
|
158
|
+
) : (
|
|
159
|
+
<Component id={id} role={role} data={data} limit={limit} {...rest} />
|
|
160
|
+
)}
|
|
161
|
+
</SurfaceInfo>
|
|
162
|
+
</SurfaceContext.Provider>
|
|
163
|
+
</div>
|
|
164
|
+
</ErrorBoundary>
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
return (
|
|
169
|
+
<ErrorBoundary name='surface' resetKeys={[data]} FallbackComponent={fallback}>
|
|
170
|
+
<div role='none' className='contents' data-id={id} data-role={role}>
|
|
171
|
+
<SurfaceContext.Provider value={contextValue}>
|
|
172
|
+
<Component id={id} role={role} data={data} limit={limit} {...rest} ref={forwardedRef} />
|
|
173
|
+
</SurfaceContext.Provider>
|
|
174
|
+
</div>
|
|
175
|
+
</ErrorBoundary>
|
|
176
|
+
);
|
|
177
|
+
},
|
|
178
|
+
),
|
|
179
|
+
);
|
|
180
|
+
|
|
181
|
+
SurfaceContextProvider.displayName = 'SurfaceContextProvider';
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* A surface is a named region of the screen that can be populated by plugins.
|
|
185
|
+
*/
|
|
186
|
+
// TODO(burdon): Remove `ref` since relying on this would be error prone.
|
|
187
|
+
export const SurfaceComponent = memo(
|
|
188
|
+
forwardRef<HTMLElement, Props & { type?: RoleToken<any> }>(
|
|
189
|
+
({ id: _id, role, type, data: dataProp, limit, placeholder = DEFAULT_PLACEHOLDER, ...rest }, forwardedRef) => {
|
|
190
|
+
const data = useDefaultValue(dataProp, () => ({}));
|
|
191
|
+
// TODO(wittjosiah): This will make all surfaces depend on a single signal.
|
|
192
|
+
// This isn't ideal because it means that any change to the data will cause all surfaces to re-render.
|
|
193
|
+
// This effectively means that plugin modules which contribute surfaces need to all be activated at startup.
|
|
194
|
+
// This should be fine for now because it's how it worked prior to capabilities api anyway.
|
|
195
|
+
// In the future, it would be nice to be able to bucket the surface contributions by role.
|
|
196
|
+
const surfaces = useSurfaces();
|
|
197
|
+
|
|
198
|
+
const effectiveRole = role ?? type?.role;
|
|
199
|
+
if (effectiveRole == null) {
|
|
200
|
+
if (DEBUG) {
|
|
201
|
+
log.warn('Surface has neither `role` nor `type` prop', { id: _id });
|
|
202
|
+
}
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// NOTE: Memoizing the candidates makes the surface not re-render based on reactivity within data.
|
|
207
|
+
const definitions = findCandidates(surfaces, { role: effectiveRole, data });
|
|
208
|
+
const candidates = limit ? definitions.slice(0, limit) : definitions;
|
|
209
|
+
if (DEBUG && candidates.length === 0) {
|
|
210
|
+
log.warn('no candidates for surface', { role: effectiveRole, data });
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
return (
|
|
215
|
+
<Suspense fallback={placeholder}>
|
|
216
|
+
{candidates.map((definition) => (
|
|
217
|
+
<SurfaceContextProvider
|
|
218
|
+
key={definition.id}
|
|
219
|
+
id={definition.id}
|
|
220
|
+
role={effectiveRole}
|
|
221
|
+
data={data}
|
|
222
|
+
limit={limit}
|
|
223
|
+
definition={definition}
|
|
224
|
+
ref={forwardedRef}
|
|
225
|
+
{...rest}
|
|
226
|
+
/>
|
|
227
|
+
))}
|
|
228
|
+
</Suspense>
|
|
229
|
+
);
|
|
230
|
+
},
|
|
231
|
+
),
|
|
232
|
+
) as (<TToken extends RoleToken<any>>(props: TypedProps<TToken> & RefAttributes<HTMLElement>) => React.ReactNode) &
|
|
233
|
+
NamedExoticComponent<Props & RefAttributes<HTMLElement>>;
|
|
234
|
+
|
|
235
|
+
SurfaceComponent.displayName = 'Surface';
|
|
236
|
+
|
|
237
|
+
// TODO(burdon): Make user facing, with telemetry.
|
|
238
|
+
const ErrorFallback = ({ error }: Props) => {
|
|
239
|
+
const { message } = error instanceof Error ? error : { message: String(error) };
|
|
240
|
+
return (
|
|
241
|
+
<div role='alert' data-testid='error-boundary-fallback'>
|
|
242
|
+
<h1 className='flex gap-2 text-sm mt-2 text-info-text'>{message}</h1>
|
|
243
|
+
</div>
|
|
244
|
+
);
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
const findCandidates = (surfaces: Definition[], { role, data }: { role: string; data: Props['data'] }) => {
|
|
248
|
+
return Object.values(surfaces)
|
|
249
|
+
.filter((definition) =>
|
|
250
|
+
Array.isArray(definition.role) ? definition.role.includes(role) : definition.role === role,
|
|
251
|
+
)
|
|
252
|
+
.filter(({ filter }) => (filter ? filter(data ?? {}, role) : true))
|
|
253
|
+
.toSorted(byPosition);
|
|
254
|
+
};
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* @internal
|
|
258
|
+
*/
|
|
259
|
+
export const useSurfaces = () => {
|
|
260
|
+
const manager = usePluginManager();
|
|
261
|
+
const surfacesByModule = useAtomValue(manager.capabilities.atomByModule(Capabilities.ReactSurface));
|
|
262
|
+
return useMemo(() => {
|
|
263
|
+
const result: Definition[] = [];
|
|
264
|
+
for (const [moduleId, surfaces] of Object.entries(surfacesByModule)) {
|
|
265
|
+
for (const def of surfaces.flat()) {
|
|
266
|
+
result.push({ ...def, id: `${moduleId}.${def.id}` });
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return result;
|
|
270
|
+
}, [surfacesByModule]);
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* @returns `true` if there is a contributed surface which matches the specified role & data, `false` otherwise.
|
|
275
|
+
*
|
|
276
|
+
* Two overloads:
|
|
277
|
+
* - Typed: pass a `type` role token and `data` is constrained to the token's
|
|
278
|
+
* declared contract (e.g. `AppSurface.Section` requires `attendableId`).
|
|
279
|
+
* - Legacy: pass a string `role` and `data` is untyped.
|
|
280
|
+
*/
|
|
281
|
+
export function isSurfaceAvailable<TToken extends RoleToken<any>>(
|
|
282
|
+
capabilityManager: CapabilityManager.CapabilityManager,
|
|
283
|
+
args: { type: TToken; data?: TokenData<TToken>; role?: never },
|
|
284
|
+
): boolean;
|
|
285
|
+
export function isSurfaceAvailable(
|
|
286
|
+
capabilityManager: CapabilityManager.CapabilityManager,
|
|
287
|
+
args: Pick<Props, 'role' | 'data'> & { type?: undefined },
|
|
288
|
+
): boolean;
|
|
289
|
+
export function isSurfaceAvailable(
|
|
290
|
+
capabilityManager: CapabilityManager.CapabilityManager,
|
|
291
|
+
{ role, type, data }: { role?: string; type?: RoleToken<any>; data?: unknown },
|
|
292
|
+
): boolean {
|
|
293
|
+
const effectiveRole = role ?? type?.role;
|
|
294
|
+
if (effectiveRole == null) {
|
|
295
|
+
return false;
|
|
296
|
+
}
|
|
297
|
+
const surfaces = capabilityManager.getAll(Capabilities.ReactSurface);
|
|
298
|
+
const candidates = findCandidates(surfaces.flat(), {
|
|
299
|
+
role: effectiveRole,
|
|
300
|
+
data: data as Props['data'],
|
|
301
|
+
});
|
|
302
|
+
return candidates.length > 0;
|
|
303
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import React, {
|
|
6
|
+
type ReactElement,
|
|
7
|
+
type Ref,
|
|
8
|
+
cloneElement,
|
|
9
|
+
forwardRef,
|
|
10
|
+
useCallback,
|
|
11
|
+
useLayoutEffect,
|
|
12
|
+
useState,
|
|
13
|
+
} from 'react';
|
|
14
|
+
import { createPortal } from 'react-dom';
|
|
15
|
+
|
|
16
|
+
import { addEventListener, combine } from '@dxos/async';
|
|
17
|
+
import { useMergeRefs } from '@dxos/react-hooks';
|
|
18
|
+
|
|
19
|
+
import { useSurface } from '../../hooks';
|
|
20
|
+
|
|
21
|
+
export type SurfaceInfoProps = {
|
|
22
|
+
children: ReactElement<{ ref?: Ref<HTMLElement> }>;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Debug wrapper for surfaces.
|
|
27
|
+
*/
|
|
28
|
+
export const SurfaceInfo = forwardRef<HTMLElement, SurfaceInfoProps>(({ children }, forwardedRef) => {
|
|
29
|
+
const [rect, setRect] = useState<DOMRect | null>(null);
|
|
30
|
+
const [expand, setExpand] = useState(false);
|
|
31
|
+
const info = useSurface();
|
|
32
|
+
|
|
33
|
+
const [root, setRoot] = useState<HTMLElement | null>(null);
|
|
34
|
+
const measureRef = useCallback((node: HTMLElement | null) => setRoot(node), []);
|
|
35
|
+
const mergedRef = useMergeRefs([measureRef, forwardedRef]);
|
|
36
|
+
const childWithRef = cloneElement(children, { ref: mergedRef });
|
|
37
|
+
|
|
38
|
+
useLayoutEffect(() => {
|
|
39
|
+
if (!root) {
|
|
40
|
+
setRect(null);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const measure = () => {
|
|
45
|
+
setRect(root.getBoundingClientRect());
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const observer = new ResizeObserver(measure);
|
|
49
|
+
observer.observe(root);
|
|
50
|
+
measure();
|
|
51
|
+
|
|
52
|
+
return combine(
|
|
53
|
+
addEventListener(window, 'scroll', measure, true),
|
|
54
|
+
addEventListener(window, 'resize', measure),
|
|
55
|
+
() => {
|
|
56
|
+
observer.disconnect();
|
|
57
|
+
},
|
|
58
|
+
);
|
|
59
|
+
}, [root]);
|
|
60
|
+
|
|
61
|
+
const padding = 0;
|
|
62
|
+
return (
|
|
63
|
+
<>
|
|
64
|
+
{childWithRef}
|
|
65
|
+
{rect &&
|
|
66
|
+
createPortal(
|
|
67
|
+
<div
|
|
68
|
+
role='none'
|
|
69
|
+
className='z-[100] fixed flex flex-col-reverse scrollbar-none overflow-auto pointer-events-none'
|
|
70
|
+
style={{
|
|
71
|
+
top: rect.top + padding,
|
|
72
|
+
left: rect.left + padding,
|
|
73
|
+
width: rect.width - padding * 2,
|
|
74
|
+
height: rect.height - padding * 2,
|
|
75
|
+
}}
|
|
76
|
+
>
|
|
77
|
+
{expand ? (
|
|
78
|
+
<div
|
|
79
|
+
className='absolute inset-0 bg-deck-surface border border-green-500 cursor-pointer pointer-events-auto overflow-auto'
|
|
80
|
+
onPointerDown={(ev) => ev.stopPropagation()}
|
|
81
|
+
onClick={(ev) => {
|
|
82
|
+
ev.stopPropagation();
|
|
83
|
+
setExpand(false);
|
|
84
|
+
}}
|
|
85
|
+
>
|
|
86
|
+
<pre className='p-2 text-xs text-description font-mono'>{JSON.stringify({ info }, null, 2)}</pre>
|
|
87
|
+
</div>
|
|
88
|
+
) : (
|
|
89
|
+
<span
|
|
90
|
+
className='absolute right-1 bottom-0 flex items-center p-1 text-green-500 opacity-80 hover:opacity-100 text-xl cursor-pointer pointer-events-auto'
|
|
91
|
+
title={info.id}
|
|
92
|
+
onPointerDown={(ev) => ev.stopPropagation()}
|
|
93
|
+
onClick={(ev) => {
|
|
94
|
+
ev.stopPropagation();
|
|
95
|
+
setExpand(true);
|
|
96
|
+
}}
|
|
97
|
+
>
|
|
98
|
+
ⓘ
|
|
99
|
+
</span>
|
|
100
|
+
)}
|
|
101
|
+
</div>,
|
|
102
|
+
// TODO(burdon): Create well-known element to gather all debug portals.
|
|
103
|
+
document.body,
|
|
104
|
+
)}
|
|
105
|
+
</>
|
|
106
|
+
);
|
|
107
|
+
});
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import React, {
|
|
6
|
+
type Context,
|
|
7
|
+
type PropsWithChildren,
|
|
8
|
+
type ProfilerOnRenderCallback,
|
|
9
|
+
createContext,
|
|
10
|
+
useContext,
|
|
11
|
+
useMemo,
|
|
12
|
+
useRef,
|
|
13
|
+
useSyncExternalStore,
|
|
14
|
+
} from 'react';
|
|
15
|
+
|
|
16
|
+
const MAX_ENTRIES = 500;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Single profiler record captured from React Profiler onRender callback.
|
|
20
|
+
*/
|
|
21
|
+
export type SurfaceProfilerEntry = {
|
|
22
|
+
id: string;
|
|
23
|
+
phase: 'mount' | 'update' | 'nested-update';
|
|
24
|
+
actualDuration: number;
|
|
25
|
+
baseDuration: number;
|
|
26
|
+
startTime: number;
|
|
27
|
+
commitTime: number;
|
|
28
|
+
timestamp: number;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Aggregated stats for a single profiled surface.
|
|
33
|
+
*/
|
|
34
|
+
export type SurfaceProfilerStats = {
|
|
35
|
+
id: string;
|
|
36
|
+
mountCount: number;
|
|
37
|
+
updateCount: number;
|
|
38
|
+
totalRenders: number;
|
|
39
|
+
avgActualDuration: number;
|
|
40
|
+
maxActualDuration: number;
|
|
41
|
+
avgBaseDuration: number;
|
|
42
|
+
lastActualDuration: number;
|
|
43
|
+
lastCommitTime: number;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Store that collects profiler entries and notifies subscribers.
|
|
48
|
+
*/
|
|
49
|
+
class SurfaceProfilerStore {
|
|
50
|
+
private _entries: SurfaceProfilerEntry[] = [];
|
|
51
|
+
private _listeners = new Set<() => void>();
|
|
52
|
+
private _snapshot: readonly SurfaceProfilerEntry[] = [];
|
|
53
|
+
private _pendingNotify = false;
|
|
54
|
+
|
|
55
|
+
/** Records an entry and schedules a deferred notification to avoid re-render loops. */
|
|
56
|
+
record(entry: SurfaceProfilerEntry) {
|
|
57
|
+
this._entries.push(entry);
|
|
58
|
+
if (this._entries.length > MAX_ENTRIES) {
|
|
59
|
+
this._entries = this._entries.slice(-MAX_ENTRIES);
|
|
60
|
+
}
|
|
61
|
+
this._snapshot = [...this._entries];
|
|
62
|
+
this._scheduleNotify();
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
clear() {
|
|
66
|
+
this._entries = [];
|
|
67
|
+
this._snapshot = [];
|
|
68
|
+
this._notifySync();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
subscribe = (listener: () => void) => {
|
|
72
|
+
this._listeners.add(listener);
|
|
73
|
+
return () => {
|
|
74
|
+
this._listeners.delete(listener);
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
getSnapshot = (): readonly SurfaceProfilerEntry[] => {
|
|
79
|
+
return this._snapshot;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Defers notification to the next animation frame to break the
|
|
84
|
+
* Profiler onRender → record → notify → re-render → onRender loop.
|
|
85
|
+
*/
|
|
86
|
+
private _scheduleNotify() {
|
|
87
|
+
if (!this._pendingNotify) {
|
|
88
|
+
this._pendingNotify = true;
|
|
89
|
+
requestAnimationFrame(() => {
|
|
90
|
+
this._pendingNotify = false;
|
|
91
|
+
this._notifySync();
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
private _notifySync() {
|
|
97
|
+
for (const listener of this._listeners) {
|
|
98
|
+
listener();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
type SurfaceProfilerContextValue = {
|
|
104
|
+
store: SurfaceProfilerStore;
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
const SurfaceProfilerContext: Context<SurfaceProfilerContextValue | undefined> = createContext<
|
|
108
|
+
SurfaceProfilerContextValue | undefined
|
|
109
|
+
>(undefined);
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Provider that collects React Profiler data from Surface components.
|
|
113
|
+
*/
|
|
114
|
+
export const SurfaceProfilerProvider = ({ children }: PropsWithChildren) => {
|
|
115
|
+
const storeRef = useRef<SurfaceProfilerStore>(null);
|
|
116
|
+
if (!storeRef.current) {
|
|
117
|
+
storeRef.current = new SurfaceProfilerStore();
|
|
118
|
+
}
|
|
119
|
+
return (
|
|
120
|
+
<SurfaceProfilerContext.Provider value={{ store: storeRef.current }}>{children}</SurfaceProfilerContext.Provider>
|
|
121
|
+
);
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Returns a stable onRender callback for use with React Profiler.
|
|
126
|
+
*/
|
|
127
|
+
export const useSurfaceProfilerCallback = (): ProfilerOnRenderCallback | undefined => {
|
|
128
|
+
const store = useContext(SurfaceProfilerContext)?.store;
|
|
129
|
+
return useMemo<ProfilerOnRenderCallback | undefined>(() => {
|
|
130
|
+
if (!store) {
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
return (id, phase, actualDuration, baseDuration, startTime, commitTime) => {
|
|
134
|
+
store.record({
|
|
135
|
+
id,
|
|
136
|
+
phase,
|
|
137
|
+
actualDuration,
|
|
138
|
+
baseDuration,
|
|
139
|
+
startTime,
|
|
140
|
+
commitTime,
|
|
141
|
+
timestamp: Date.now(),
|
|
142
|
+
});
|
|
143
|
+
};
|
|
144
|
+
}, [store]);
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Returns all profiler entries reactively.
|
|
149
|
+
*/
|
|
150
|
+
export const useSurfaceProfilerEntries = (): readonly SurfaceProfilerEntry[] => {
|
|
151
|
+
const context = useContext(SurfaceProfilerContext);
|
|
152
|
+
return useSyncExternalStore(context?.store.subscribe ?? noop, context?.store.getSnapshot ?? emptySnapshot);
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Returns aggregated stats grouped by surface id.
|
|
157
|
+
*/
|
|
158
|
+
export const useSurfaceProfilerStats = (): SurfaceProfilerStats[] => {
|
|
159
|
+
const entries = useSurfaceProfilerEntries();
|
|
160
|
+
const statsMap = new Map<string, SurfaceProfilerStats>();
|
|
161
|
+
|
|
162
|
+
for (const entry of entries) {
|
|
163
|
+
let stats = statsMap.get(entry.id);
|
|
164
|
+
if (!stats) {
|
|
165
|
+
stats = {
|
|
166
|
+
id: entry.id,
|
|
167
|
+
mountCount: 0,
|
|
168
|
+
updateCount: 0,
|
|
169
|
+
totalRenders: 0,
|
|
170
|
+
avgActualDuration: 0,
|
|
171
|
+
maxActualDuration: 0,
|
|
172
|
+
avgBaseDuration: 0,
|
|
173
|
+
lastActualDuration: 0,
|
|
174
|
+
lastCommitTime: 0,
|
|
175
|
+
};
|
|
176
|
+
statsMap.set(entry.id, stats);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
if (entry.phase === 'mount') {
|
|
180
|
+
stats.mountCount++;
|
|
181
|
+
} else {
|
|
182
|
+
stats.updateCount++;
|
|
183
|
+
}
|
|
184
|
+
stats.totalRenders++;
|
|
185
|
+
stats.avgActualDuration =
|
|
186
|
+
(stats.avgActualDuration * (stats.totalRenders - 1) + entry.actualDuration) / stats.totalRenders;
|
|
187
|
+
stats.avgBaseDuration =
|
|
188
|
+
(stats.avgBaseDuration * (stats.totalRenders - 1) + entry.baseDuration) / stats.totalRenders;
|
|
189
|
+
stats.maxActualDuration = Math.max(stats.maxActualDuration, entry.actualDuration);
|
|
190
|
+
stats.lastActualDuration = entry.actualDuration;
|
|
191
|
+
stats.lastCommitTime = entry.commitTime;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return [...statsMap.values()].sort((a, b) => b.maxActualDuration - a.maxActualDuration);
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Clears all collected profiler entries.
|
|
199
|
+
*/
|
|
200
|
+
export const useSurfaceProfilerClear = (): (() => void) | undefined => {
|
|
201
|
+
const store = useContext(SurfaceProfilerContext)?.store;
|
|
202
|
+
return useMemo(() => (store ? () => store.clear() : undefined), [store]);
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
const noop = () => () => {};
|
|
206
|
+
const EMPTY_SNAPSHOT: readonly SurfaceProfilerEntry[] = [];
|
|
207
|
+
const emptySnapshot = () => EMPTY_SNAPSHOT;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type Context, createContext } from 'react';
|
|
6
|
+
|
|
7
|
+
import { type Props } from './types';
|
|
8
|
+
|
|
9
|
+
export type SurfaceContext = Pick<Props, 'id' | 'role' | 'data'>;
|
|
10
|
+
|
|
11
|
+
// TODO(burdon): Use @radix-ui/react-context
|
|
12
|
+
export const SurfaceContext: Context<SurfaceContext | undefined> = createContext<SurfaceContext | undefined>(undefined);
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
// TODO(wittjosiah): Cleanup to avoid re-naming.
|
|
6
|
+
import { SurfaceContext } from './context';
|
|
7
|
+
import { SurfaceComponent, isSurfaceAvailable } from './SurfaceComponent';
|
|
8
|
+
import {
|
|
9
|
+
SurfaceProfilerProvider,
|
|
10
|
+
useSurfaceProfilerCallback,
|
|
11
|
+
useSurfaceProfilerClear,
|
|
12
|
+
useSurfaceProfilerEntries,
|
|
13
|
+
useSurfaceProfilerStats,
|
|
14
|
+
} from './SurfaceProfilerContext';
|
|
15
|
+
import {
|
|
16
|
+
type Definition as SurfaceDefinition,
|
|
17
|
+
type RoleToken as SurfaceRoleToken,
|
|
18
|
+
type SurfaceBinding as SurfaceBindingType,
|
|
19
|
+
type SurfaceFilter as SurfaceFilterType,
|
|
20
|
+
type TokenData as SurfaceTokenData,
|
|
21
|
+
type TypedProps as SurfaceTypedProps,
|
|
22
|
+
create as createSurface,
|
|
23
|
+
createWeb as createWebSurface,
|
|
24
|
+
isSurfaceFilter as isSurfaceFilterFn,
|
|
25
|
+
makeType as makeTypeFn,
|
|
26
|
+
} from './types';
|
|
27
|
+
|
|
28
|
+
export namespace Surface {
|
|
29
|
+
export type Definition = SurfaceDefinition;
|
|
30
|
+
export const create = createSurface;
|
|
31
|
+
export const createWeb = createWebSurface;
|
|
32
|
+
|
|
33
|
+
export type Context = SurfaceContext;
|
|
34
|
+
export const Context = SurfaceContext;
|
|
35
|
+
|
|
36
|
+
export const Surface = SurfaceComponent;
|
|
37
|
+
export const isAvailable = isSurfaceAvailable;
|
|
38
|
+
|
|
39
|
+
export type RoleToken<TData> = SurfaceRoleToken<TData>;
|
|
40
|
+
export type Binding = SurfaceBindingType;
|
|
41
|
+
export type Filter<TData> = SurfaceFilterType<TData>;
|
|
42
|
+
export type TokenData<T> = SurfaceTokenData<T>;
|
|
43
|
+
export type TypedProps<TToken extends SurfaceRoleToken<any>> = SurfaceTypedProps<TToken>;
|
|
44
|
+
export const makeType = makeTypeFn;
|
|
45
|
+
export const isFilter = isSurfaceFilterFn;
|
|
46
|
+
|
|
47
|
+
export const ProfilerProvider = SurfaceProfilerProvider;
|
|
48
|
+
export const useProfilerCallback = useSurfaceProfilerCallback;
|
|
49
|
+
export const useProfilerEntries = useSurfaceProfilerEntries;
|
|
50
|
+
export const useProfilerStats = useSurfaceProfilerStats;
|
|
51
|
+
export const useProfilerClear = useSurfaceProfilerClear;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export type { SurfaceProfilerEntry, SurfaceProfilerStats } from './SurfaceProfilerContext';
|