@dxos/app-framework 0.8.4-main.e8ec1fe → 0.8.4-main.ef1bc66f44
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 +1 -1
- package/.storybook/preview.mts +2 -2
- package/dist/lib/browser/capability-7LE5X2NH.mjs +37 -0
- package/dist/lib/browser/capability-7LE5X2NH.mjs.map +7 -0
- package/dist/lib/browser/capability-DU35RXMD.mjs +34 -0
- package/dist/lib/browser/capability-DU35RXMD.mjs.map +7 -0
- package/dist/lib/browser/chunk-4DQMLMGU.mjs +44 -0
- package/dist/lib/browser/chunk-4DQMLMGU.mjs.map +7 -0
- package/dist/lib/browser/chunk-EIFGKQSA.mjs +170 -0
- package/dist/lib/browser/chunk-EIFGKQSA.mjs.map +7 -0
- package/dist/lib/browser/chunk-FHQTHCX7.mjs +8 -0
- package/dist/lib/browser/chunk-FHQTHCX7.mjs.map +7 -0
- package/dist/lib/browser/chunk-IGRQWMWW.mjs +80 -0
- package/dist/lib/browser/chunk-IGRQWMWW.mjs.map +7 -0
- package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/browser/chunk-KWP6PKIU.mjs +145 -0
- package/dist/lib/browser/chunk-KWP6PKIU.mjs.map +7 -0
- package/dist/lib/browser/chunk-NPUEVX42.mjs +34 -0
- package/dist/lib/browser/chunk-NPUEVX42.mjs.map +7 -0
- package/dist/lib/browser/chunk-PKQT6C53.mjs +47 -0
- package/dist/lib/browser/chunk-PKQT6C53.mjs.map +7 -0
- package/dist/lib/browser/chunk-WGWEEBUV.mjs +807 -0
- package/dist/lib/browser/chunk-WGWEEBUV.mjs.map +7 -0
- package/dist/lib/browser/chunk-YAFEA4GV.mjs +1 -0
- package/dist/lib/browser/chunk-YZQ6NFG4.mjs +781 -0
- package/dist/lib/browser/chunk-YZQ6NFG4.mjs.map +7 -0
- package/dist/lib/browser/chunk-ZQO3UZ4R.mjs +77 -0
- package/dist/lib/browser/chunk-ZQO3UZ4R.mjs.map +7 -0
- package/dist/lib/browser/cli/index.mjs +89 -0
- package/dist/lib/browser/cli/index.mjs.map +7 -0
- package/dist/lib/browser/common/activation-events.mjs +23 -0
- package/dist/lib/browser/common/capabilities.mjs +45 -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 +28 -0
- package/dist/lib/browser/core/capability.mjs.map +7 -0
- package/dist/lib/browser/core/plugin-manager.mjs +15 -0
- package/dist/lib/browser/core/plugin-manager.mjs.map +7 -0
- package/dist/lib/browser/core/plugin.mjs +27 -0
- package/dist/lib/browser/core/plugin.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +88 -121
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/invoker-capability-7QW56NOM.mjs +36 -0
- package/dist/lib/browser/invoker-capability-7QW56NOM.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +72 -22
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/browser/ui/index.mjs +49 -0
- package/dist/lib/browser/ui/index.mjs.map +7 -0
- package/dist/lib/node-esm/capability-OSVYGK4X.mjs +38 -0
- package/dist/lib/node-esm/capability-OSVYGK4X.mjs.map +7 -0
- package/dist/lib/node-esm/capability-SR2EIZFP.mjs +35 -0
- package/dist/lib/node-esm/capability-SR2EIZFP.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-64IMLAS2.mjs +78 -0
- package/dist/lib/node-esm/chunk-64IMLAS2.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-7OWSHPYK.mjs +48 -0
- package/dist/lib/node-esm/chunk-7OWSHPYK.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-DHSHRYIB.mjs +171 -0
- package/dist/lib/node-esm/chunk-DHSHRYIB.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-DZ2XLAGI.mjs +146 -0
- package/dist/lib/node-esm/chunk-DZ2XLAGI.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-J2PHTRHC.mjs +45 -0
- package/dist/lib/node-esm/chunk-J2PHTRHC.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-JAZVHID3.mjs +35 -0
- package/dist/lib/node-esm/chunk-JAZVHID3.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-OQYHRZYF.mjs +81 -0
- package/dist/lib/node-esm/chunk-OQYHRZYF.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-UEWJDI2L.mjs +10 -0
- package/dist/lib/node-esm/chunk-UEWJDI2L.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-VV4YHPQQ.mjs +782 -0
- package/dist/lib/node-esm/chunk-VV4YHPQQ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-XHAKT6UD.mjs +808 -0
- package/dist/lib/node-esm/chunk-XHAKT6UD.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-Z4TJPSMP.mjs +2 -0
- package/dist/lib/node-esm/chunk-Z4TJPSMP.mjs.map +7 -0
- package/dist/lib/node-esm/cli/index.mjs +90 -0
- package/dist/lib/node-esm/cli/index.mjs.map +7 -0
- package/dist/lib/node-esm/common/activation-events.mjs +24 -0
- package/dist/lib/node-esm/common/activation-events.mjs.map +7 -0
- package/dist/lib/node-esm/common/capabilities.mjs +46 -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 +29 -0
- package/dist/lib/node-esm/core/capability.mjs.map +7 -0
- package/dist/lib/node-esm/core/plugin-manager.mjs +16 -0
- package/dist/lib/node-esm/core/plugin-manager.mjs.map +7 -0
- package/dist/lib/node-esm/core/plugin.mjs +28 -0
- package/dist/lib/node-esm/core/plugin.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +88 -121
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/invoker-capability-CK4AMF2R.mjs +37 -0
- package/dist/lib/node-esm/invoker-capability-CK4AMF2R.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +72 -22
- package/dist/lib/node-esm/testing/index.mjs.map +4 -4
- package/dist/lib/node-esm/ui/index.mjs +50 -0
- package/dist/lib/node-esm/ui/index.mjs.map +7 -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 +114 -194
- 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 +33 -0
- package/dist/types/src/common/operations.d.ts.map +1 -0
- package/dist/types/src/common/translations.d.ts +7 -7
- 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} +6 -6
- package/dist/types/src/core/activation-event.d.ts.map +1 -0
- package/dist/types/src/core/capability-manager.d.ts +43 -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 +150 -0
- package/dist/types/src/core/capability.d.ts.map +1 -0
- package/dist/types/src/core/index.d.ts +5 -4
- package/dist/types/src/core/index.d.ts.map +1 -1
- package/dist/types/src/core/plugin-manager.d.ts +66 -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.d.ts +92 -34
- package/dist/types/src/core/plugin.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +3 -2
- 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 +5 -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 +109 -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/index.d.ts +1 -0
- package/dist/types/src/testing/index.d.ts.map +1 -1
- 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 +4 -4
- package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
- package/dist/types/src/ui/components/App.d.ts +8 -0
- package/dist/types/src/ui/components/App.d.ts.map +1 -0
- package/dist/types/src/ui/components/App.stories.d.ts.map +1 -0
- package/dist/types/src/ui/components/DefaultFallback.d.ts.map +1 -0
- package/dist/types/src/ui/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/types/src/{playground/playground.stories.d.ts → ui/components/PluginManagerContext.stories.d.ts} +5 -3
- package/dist/types/src/ui/components/PluginManagerContext.stories.d.ts.map +1 -0
- package/dist/types/src/ui/components/PluginManagerProvider.d.ts +10 -0
- package/dist/types/src/ui/components/PluginManagerProvider.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/components/surface/SurfaceComponent.d.ts +12 -0
- package/dist/types/src/ui/components/surface/SurfaceComponent.d.ts.map +1 -0
- package/dist/types/src/{react/Surface.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/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 +5 -0
- package/dist/types/src/ui/components/surface/index.d.ts.map +1 -0
- package/dist/types/src/ui/components/surface/types.d.ts +94 -0
- package/dist/types/src/ui/components/surface/types.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/index.d.ts +7 -0
- package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
- package/dist/types/src/{react → ui/hooks}/useApp.d.ts +12 -6
- package/dist/types/src/ui/hooks/useApp.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/{react → 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/useOperationResolver.d.ts +19 -0
- package/dist/types/src/ui/hooks/useOperationResolver.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 +4 -0
- package/dist/types/src/ui/index.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/moon.yml +10 -3
- package/package.json +112 -52
- package/src/cli/cli.ts +107 -0
- package/src/{playground/debug → cli}/index.ts +1 -1
- package/src/common/activation-events.ts +44 -0
- package/src/common/capabilities.ts +174 -210
- package/src/common/index.ts +4 -8
- package/src/common/operations.ts +38 -0
- package/src/common/translations.ts +17 -9
- package/src/context.ts +9 -0
- package/src/core/{events.ts → activation-event.ts} +5 -5
- package/src/core/capability-manager.test.ts +151 -0
- package/src/core/capability-manager.ts +171 -0
- package/src/core/capability.ts +236 -0
- package/src/core/index.ts +5 -4
- package/src/core/plugin-manager.test.ts +845 -0
- package/src/core/plugin-manager.ts +696 -0
- package/src/core/plugin.ts +221 -39
- package/src/index.ts +3 -2
- package/src/plugin-operation/OperationPlugin.ts +25 -0
- package/src/plugin-operation/history/capability.ts +37 -0
- package/src/plugin-operation/history/errors.ts +11 -0
- package/src/plugin-operation/history/history-tracker.test.ts +380 -0
- package/src/plugin-operation/history/history-tracker.ts +129 -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 +73 -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 +40 -0
- package/src/plugin-operation/meta.ts +11 -0
- package/src/plugin-operation/testing.ts +174 -0
- package/src/plugin-runtime/RuntimePlugin.ts +20 -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/index.ts +1 -0
- package/src/testing/service.ts +52 -0
- package/src/testing/withPluginManager.stories.tsx +7 -7
- package/src/testing/withPluginManager.tsx +21 -23
- package/src/ui/components/App.stories.tsx +62 -0
- package/src/{react → ui/components}/App.tsx +9 -11
- package/src/ui/components/PluginManagerContext.stories.tsx +183 -0
- package/src/{react → ui/components}/PluginManagerProvider.ts +3 -3
- package/src/ui/components/index.ts +8 -0
- package/src/{react/Surface.stories.tsx → ui/components/surface/SurfaceComponent.stories.tsx} +36 -19
- package/src/ui/components/surface/SurfaceComponent.tsx +262 -0
- package/src/ui/components/surface/SurfaceInfo.tsx +107 -0
- package/src/ui/components/surface/context.ts +12 -0
- package/src/ui/components/surface/index.ts +8 -0
- package/src/ui/components/surface/types.ts +119 -0
- package/src/ui/hooks/index.ts +10 -0
- package/src/ui/hooks/useApp.tsx +215 -0
- package/src/ui/hooks/useCapabilities.ts +67 -0
- package/src/{react → ui/hooks}/useLoading.tsx +4 -6
- package/src/ui/hooks/useOperationResolver.ts +40 -0
- package/src/ui/hooks/useSettingsState.ts +26 -0
- package/src/ui/hooks/useSurface.ts +13 -0
- package/src/ui/index.ts +7 -0
- package/tsconfig.json +10 -31
- package/.swc/plugins/linux_x86_64_19.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429.wasmer-v7 +0 -0
- package/dist/lib/browser/app-graph-builder-OIEZZC45.mjs +0 -138
- package/dist/lib/browser/app-graph-builder-OIEZZC45.mjs.map +0 -7
- package/dist/lib/browser/chunk-SCPE4ZO2.mjs +0 -35
- package/dist/lib/browser/chunk-SCPE4ZO2.mjs.map +0 -7
- package/dist/lib/browser/chunk-VFUKEZIN.mjs +0 -483
- package/dist/lib/browser/chunk-VFUKEZIN.mjs.map +0 -7
- package/dist/lib/browser/chunk-WPW5VVAX.mjs +0 -1651
- package/dist/lib/browser/chunk-WPW5VVAX.mjs.map +0 -7
- package/dist/lib/browser/intent-dispatcher-LZ4AE66E.mjs +0 -11
- package/dist/lib/browser/intent-resolver-QVCKRX6G.mjs +0 -39
- package/dist/lib/browser/intent-resolver-QVCKRX6G.mjs.map +0 -7
- package/dist/lib/browser/react/index.mjs +0 -34
- package/dist/lib/browser/store-CNPHOYTJ.mjs +0 -30
- package/dist/lib/browser/store-CNPHOYTJ.mjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-EBU4NVWD.mjs +0 -139
- package/dist/lib/node-esm/app-graph-builder-EBU4NVWD.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-IJOHO66N.mjs +0 -484
- package/dist/lib/node-esm/chunk-IJOHO66N.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-XJZGUJ3H.mjs +0 -1653
- package/dist/lib/node-esm/chunk-XJZGUJ3H.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-ZX63QUGE.mjs +0 -37
- package/dist/lib/node-esm/chunk-ZX63QUGE.mjs.map +0 -7
- package/dist/lib/node-esm/intent-dispatcher-MGOJ3CHD.mjs +0 -12
- package/dist/lib/node-esm/intent-resolver-URF3HN3G.mjs +0 -40
- package/dist/lib/node-esm/intent-resolver-URF3HN3G.mjs.map +0 -7
- package/dist/lib/node-esm/react/index.mjs +0 -35
- package/dist/lib/node-esm/store-RK5B4XEL.mjs +0 -31
- package/dist/lib/node-esm/store-RK5B4XEL.mjs.map +0 -7
- 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 -68
- package/dist/types/src/common/surface.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/App.d.ts +0 -10
- package/dist/types/src/react/App.d.ts.map +0 -1
- package/dist/types/src/react/App.stories.d.ts.map +0 -1
- package/dist/types/src/react/DefaultFallback.d.ts.map +0 -1
- 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.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 -9
- package/dist/types/src/react/index.d.ts.map +0 -1
- package/dist/types/src/react/types.d.ts +0 -14
- package/dist/types/src/react/types.d.ts.map +0 -1
- package/dist/types/src/react/useApp.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/react/useLoading.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 -88
- package/src/core/capabilities.test.ts +0 -136
- package/src/core/capabilities.ts +0 -263
- package/src/core/manager.test.ts +0 -516
- package/src/core/manager.ts +0 -604
- package/src/playground/debug/Debug.tsx +0 -39
- package/src/playground/debug/plugin.ts +0 -16
- package/src/playground/generator/Main.tsx +0 -70
- 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/index.ts +0 -5
- 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 -286
- package/src/plugin-intent/intent-dispatcher.ts +0 -342
- 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 -160
- 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/App.stories.tsx +0 -33
- package/src/react/IntentContext.tsx +0 -35
- package/src/react/Surface.tsx +0 -109
- package/src/react/common.ts +0 -13
- package/src/react/index.ts +0 -14
- package/src/react/types.ts +0 -37
- package/src/react/useApp.tsx +0 -165
- package/src/react/useCapabilities.ts +0 -31
- package/src/react/useIntentResolver.ts +0 -22
- /package/dist/lib/browser/{intent-dispatcher-LZ4AE66E.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
- /package/dist/lib/browser/{react/index.mjs.map → chunk-YAFEA4GV.mjs.map} +0 -0
- /package/dist/lib/{node-esm/intent-dispatcher-MGOJ3CHD.mjs.map → browser/common/activation-events.mjs.map} +0 -0
- /package/dist/lib/{node-esm/react/index.mjs.map → browser/common/capabilities.mjs.map} +0 -0
- /package/dist/types/src/{react → ui/components}/App.stories.d.ts +0 -0
- /package/dist/types/src/{react → ui/components}/DefaultFallback.d.ts +0 -0
- /package/dist/types/src/{react → ui/components}/ErrorBoundary.d.ts +0 -0
- /package/src/{react → ui/components}/DefaultFallback.tsx +0 -0
- /package/src/{react → ui/components}/ErrorBoundary.tsx +0 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2022 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
6
|
+
import * as Effect from 'effect/Effect';
|
|
7
|
+
import React from 'react';
|
|
8
|
+
|
|
9
|
+
import { withTheme } from '@dxos/react-ui/testing';
|
|
10
|
+
|
|
11
|
+
import { ActivationEvents, Capabilities } from '../../common';
|
|
12
|
+
import { Capability, Plugin } from '../../core';
|
|
13
|
+
import { useApp } from '../hooks';
|
|
14
|
+
|
|
15
|
+
// Minimal plugin that contributes a ReactRoot.
|
|
16
|
+
const TestPlugin = Plugin.define({
|
|
17
|
+
id: 'dxos.org/plugin/test',
|
|
18
|
+
name: 'Test Plugin',
|
|
19
|
+
}).pipe(
|
|
20
|
+
Plugin.addModule({
|
|
21
|
+
id: 'TestMain',
|
|
22
|
+
activatesOn: ActivationEvents.Startup,
|
|
23
|
+
activate: () =>
|
|
24
|
+
Effect.succeed([
|
|
25
|
+
Capability.contributes(Capabilities.ReactRoot, {
|
|
26
|
+
id: 'dxos.org/plugin/test/root',
|
|
27
|
+
root: () => (
|
|
28
|
+
<div className='fixed inset-0 flex items-center justify-center text-2xl'>App Started Successfully!</div>
|
|
29
|
+
),
|
|
30
|
+
}),
|
|
31
|
+
]),
|
|
32
|
+
}),
|
|
33
|
+
Plugin.make,
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
const plugins = [TestPlugin()];
|
|
37
|
+
const core = [TestPlugin.meta.id];
|
|
38
|
+
|
|
39
|
+
const DefaultStory = () => {
|
|
40
|
+
const App = useApp({
|
|
41
|
+
plugins,
|
|
42
|
+
core,
|
|
43
|
+
placeholder: () => <div className='fixed inset-0 flex items-center justify-center'>Loading...</div>,
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
return <App />;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const meta = {
|
|
50
|
+
title: 'sdk/app-framework/App',
|
|
51
|
+
render: DefaultStory,
|
|
52
|
+
decorators: [withTheme()],
|
|
53
|
+
parameters: {
|
|
54
|
+
layout: 'fullscreen',
|
|
55
|
+
},
|
|
56
|
+
} satisfies Meta;
|
|
57
|
+
|
|
58
|
+
export default meta;
|
|
59
|
+
|
|
60
|
+
type Story = StoryObj<typeof meta>;
|
|
61
|
+
|
|
62
|
+
export const Default: Story = {};
|
|
@@ -4,25 +4,23 @@
|
|
|
4
4
|
|
|
5
5
|
import React, { type PropsWithChildren } from 'react';
|
|
6
6
|
|
|
7
|
-
import { Capabilities } from '
|
|
8
|
-
import { topologicalSort } from '
|
|
9
|
-
|
|
10
|
-
import { type UseAppOptions } from './useApp';
|
|
11
|
-
import { useCapabilities } from './useCapabilities';
|
|
12
|
-
import { LoadingState, useLoading } from './useLoading';
|
|
7
|
+
import { Capabilities } from '../../common';
|
|
8
|
+
import { topologicalSort } from '../../helpers';
|
|
9
|
+
import { LoadingState, type UseAppOptions, useCapabilities, useLoading } from '../hooks';
|
|
13
10
|
|
|
14
11
|
export type AppProps = Pick<UseAppOptions, 'placeholder' | 'debounce'> & {
|
|
15
|
-
|
|
12
|
+
ready: boolean;
|
|
13
|
+
error: unknown;
|
|
16
14
|
};
|
|
17
15
|
|
|
18
|
-
export const App = ({ placeholder: Placeholder,
|
|
16
|
+
export const App = ({ placeholder: Placeholder, ready, error, debounce }: AppProps) => {
|
|
19
17
|
const reactContexts = useCapabilities(Capabilities.ReactContext);
|
|
20
18
|
const reactRoots = useCapabilities(Capabilities.ReactRoot);
|
|
21
|
-
const stage = useLoading(
|
|
19
|
+
const stage = useLoading(ready, debounce);
|
|
22
20
|
|
|
23
|
-
if (
|
|
21
|
+
if (error) {
|
|
24
22
|
// This triggers the error boundary to provide UI feedback for the startup error.
|
|
25
|
-
throw
|
|
23
|
+
throw error;
|
|
26
24
|
}
|
|
27
25
|
|
|
28
26
|
// TODO(wittjosiah): Consider using Suspense instead.
|
|
@@ -0,0 +1,183 @@
|
|
|
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 { 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) return null;
|
|
42
|
+
|
|
43
|
+
const isEven = count % 2 === 0;
|
|
44
|
+
|
|
45
|
+
return (
|
|
46
|
+
<div
|
|
47
|
+
className={`mt-4 px-4 py-2 rounded-full text-sm font-medium transition-colors ${
|
|
48
|
+
isEven
|
|
49
|
+
? 'bg-emerald-100 text-emerald-800 dark:bg-emerald-900/30 dark:text-emerald-400'
|
|
50
|
+
: 'bg-amber-100 text-amber-800 dark:bg-amber-900/30 dark:text-amber-400'
|
|
51
|
+
}`}
|
|
52
|
+
>
|
|
53
|
+
Status: {isEven ? 'Even' : 'Odd'}
|
|
54
|
+
</div>
|
|
55
|
+
);
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
// A component that consumes the PluginManager via web context
|
|
59
|
+
const CounterComponent = () => {
|
|
60
|
+
// Use the web-context hook to get the PluginManager
|
|
61
|
+
const manager = useWebComponentContext(PluginManagerContext);
|
|
62
|
+
const capabilitiesAtom = useMemo(
|
|
63
|
+
() => manager?.capabilities.atom(Counter) ?? Atom.make<{ count: number; increment: () => void }[]>([]),
|
|
64
|
+
[manager],
|
|
65
|
+
);
|
|
66
|
+
const capabilities = useAtomValue(capabilitiesAtom);
|
|
67
|
+
const counter = (capabilities as any)[0];
|
|
68
|
+
const [count, setCount] = useState(counter?.count ?? 0);
|
|
69
|
+
|
|
70
|
+
useEffect(() => {
|
|
71
|
+
if (!counter) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
setCount(counter.count);
|
|
75
|
+
if ('subscribe' in counter && typeof counter.subscribe === 'function') {
|
|
76
|
+
return counter.subscribe(() => setCount(counter.count));
|
|
77
|
+
}
|
|
78
|
+
}, [counter]);
|
|
79
|
+
|
|
80
|
+
if (!manager) {
|
|
81
|
+
return <div className='p-4 text-red-500'>Error: Context not found</div>;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return (
|
|
85
|
+
<div className='flex flex-col items-center justify-center h-screen bg-neutral-100 dark:bg-neutral-900 text-neutral-900 dark:text-white'>
|
|
86
|
+
<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'>
|
|
87
|
+
<h2 className='text-2xl font-bold mb-6 text-center text-primary-600 dark:text-primary-400'>
|
|
88
|
+
Web Context Counter
|
|
89
|
+
</h2>
|
|
90
|
+
|
|
91
|
+
<div className='flex flex-col items-center gap-6'>
|
|
92
|
+
<div className='text-6xl font-mono font-bold tabular-nums tracking-tighter'>{count}</div>
|
|
93
|
+
|
|
94
|
+
<button
|
|
95
|
+
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'
|
|
96
|
+
onClick={() => {
|
|
97
|
+
const counter = manager.capabilities.get(Counter);
|
|
98
|
+
counter.increment();
|
|
99
|
+
}}
|
|
100
|
+
>
|
|
101
|
+
Increment
|
|
102
|
+
</button>
|
|
103
|
+
|
|
104
|
+
<CountStatus />
|
|
105
|
+
</div>
|
|
106
|
+
|
|
107
|
+
<div className='mt-8 pt-4 border-bs border-neutral-200 dark:border-neutral-700 text-center'>
|
|
108
|
+
<p className='text-sm text-neutral-500 dark:text-neutral-400'>
|
|
109
|
+
This component accesses the <code>PluginManager</code> via <code>useWebComponentContext</code>.
|
|
110
|
+
</p>
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
</div>
|
|
114
|
+
);
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
// Plugin that provides the Counter capability and renders the UI
|
|
118
|
+
const CounterPlugin = Plugin.define({
|
|
119
|
+
id: 'dxos.org/plugin/counter',
|
|
120
|
+
name: 'Counter Plugin',
|
|
121
|
+
}).pipe(
|
|
122
|
+
Plugin.addModule({
|
|
123
|
+
id: 'CounterMain',
|
|
124
|
+
activatesOn: ActivationEvents.Startup,
|
|
125
|
+
activate: () => {
|
|
126
|
+
const listeners = new Set<() => void>();
|
|
127
|
+
const counter = {
|
|
128
|
+
count: 0,
|
|
129
|
+
increment: () => {
|
|
130
|
+
counter.count++;
|
|
131
|
+
listeners.forEach((listener) => listener());
|
|
132
|
+
},
|
|
133
|
+
subscribe: (listener: () => void) => {
|
|
134
|
+
listeners.add(listener);
|
|
135
|
+
return () => listeners.delete(listener);
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
return Effect.succeed([
|
|
140
|
+
// Contribute the state/logic
|
|
141
|
+
Capability.contributes(Counter, counter),
|
|
142
|
+
|
|
143
|
+
// Contribute the UI
|
|
144
|
+
Capability.contributes(Capabilities.ReactRoot, {
|
|
145
|
+
id: 'dxos.org/plugin/counter/root',
|
|
146
|
+
root: CounterComponent,
|
|
147
|
+
}),
|
|
148
|
+
]);
|
|
149
|
+
},
|
|
150
|
+
}),
|
|
151
|
+
Plugin.make,
|
|
152
|
+
)();
|
|
153
|
+
|
|
154
|
+
const plugins = [CounterPlugin];
|
|
155
|
+
const core = ['dxos.org/plugin/counter'];
|
|
156
|
+
const placeholder = () => (
|
|
157
|
+
<div className='flex h-screen items-center justify-center p-4 text-lg text-neutral-500'>
|
|
158
|
+
Initializing Application...
|
|
159
|
+
</div>
|
|
160
|
+
);
|
|
161
|
+
|
|
162
|
+
const DefaultStory = () => {
|
|
163
|
+
const App = useApp({
|
|
164
|
+
plugins,
|
|
165
|
+
core,
|
|
166
|
+
placeholder,
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
return <App />;
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
const meta = {
|
|
173
|
+
title: 'sdk/app-framework/PluginManagerContext',
|
|
174
|
+
render: DefaultStory,
|
|
175
|
+
decorators: [withTheme()],
|
|
176
|
+
parameters: {
|
|
177
|
+
layout: 'fullscreen',
|
|
178
|
+
},
|
|
179
|
+
} satisfies Meta;
|
|
180
|
+
|
|
181
|
+
export default meta;
|
|
182
|
+
|
|
183
|
+
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
|
/**
|
package/src/{react/Surface.stories.tsx → ui/components/surface/SurfaceComponent.stories.tsx}
RENAMED
|
@@ -3,40 +3,52 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
6
|
-
import React, { useCallback, useEffect, useState } from 'react';
|
|
6
|
+
import React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';
|
|
7
7
|
|
|
8
8
|
import { faker } from '@dxos/random';
|
|
9
9
|
import { List, ListItem, Toolbar } from '@dxos/react-ui';
|
|
10
10
|
import { withTheme } from '@dxos/react-ui/testing';
|
|
11
|
-
import { getHashStyles, mx } from '@dxos/
|
|
11
|
+
import { type ColorStyles, getHashStyles, mx } from '@dxos/ui-theme';
|
|
12
12
|
|
|
13
|
-
import { Capabilities
|
|
14
|
-
import { withPluginManager } from '
|
|
13
|
+
import { Capabilities } from '../../../common';
|
|
14
|
+
import { withPluginManager } from '../../../testing';
|
|
15
|
+
import { usePluginManager } from '../PluginManagerProvider';
|
|
15
16
|
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
17
|
+
import { Surface, useSurfaces } from './SurfaceComponent';
|
|
18
|
+
import { create } from './types';
|
|
19
|
+
|
|
20
|
+
type TestComponentProps = {
|
|
21
|
+
id: string;
|
|
22
|
+
styles: ColorStyles;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const TestComponent = forwardRef<HTMLDivElement, TestComponentProps>(({ styles, id }, forwardedRef) => {
|
|
26
|
+
return (
|
|
27
|
+
<div
|
|
28
|
+
className={mx('flex justify-center items-center border rounded', styles.surface, styles.border)}
|
|
29
|
+
ref={forwardedRef}
|
|
30
|
+
>
|
|
31
|
+
<span className={mx('dx-tag font-mono text-lg', styles.text)}>{id}</span>
|
|
32
|
+
</div>
|
|
33
|
+
);
|
|
34
|
+
});
|
|
18
35
|
|
|
19
36
|
const DefaultStory = () => {
|
|
20
|
-
const [selected, setSelected] = useState<string | undefined>();
|
|
21
37
|
const manager = usePluginManager();
|
|
22
38
|
const surfaces = useSurfaces();
|
|
39
|
+
const [selected, setSelected] = useState<string | undefined>();
|
|
23
40
|
|
|
24
41
|
const handleAdd = useCallback(() => {
|
|
25
42
|
const id = `test-${faker.number.int({ min: 0, max: 1_000 })}`;
|
|
26
43
|
const styles = getHashStyles(id);
|
|
27
|
-
|
|
28
|
-
manager.context.contributeCapability({
|
|
44
|
+
manager.capabilities.contribute({
|
|
29
45
|
module: 'test',
|
|
30
46
|
interface: Capabilities.ReactSurface,
|
|
31
|
-
implementation:
|
|
47
|
+
implementation: create({
|
|
32
48
|
id,
|
|
33
49
|
role: 'item',
|
|
34
50
|
filter: (data): data is any => (data as any)?.id === id,
|
|
35
|
-
component: () =>
|
|
36
|
-
<div className={mx('flex justify-center items-center border rounded', styles.surface, styles.border)}>
|
|
37
|
-
<span className={mx('dx-tag font-mono text-lg', styles.text)}>{id}</span>
|
|
38
|
-
</div>
|
|
39
|
-
),
|
|
51
|
+
component: ({ ref }) => <TestComponent id={id} styles={styles} ref={ref} />,
|
|
40
52
|
}),
|
|
41
53
|
});
|
|
42
54
|
|
|
@@ -48,10 +60,10 @@ const DefaultStory = () => {
|
|
|
48
60
|
}, [surfaces]);
|
|
49
61
|
|
|
50
62
|
const handleError = useCallback(() => {
|
|
51
|
-
manager.
|
|
63
|
+
manager.capabilities.contribute({
|
|
52
64
|
module: 'error',
|
|
53
65
|
interface: Capabilities.ReactSurface,
|
|
54
|
-
implementation:
|
|
66
|
+
implementation: create({
|
|
55
67
|
id: 'error',
|
|
56
68
|
role: 'item',
|
|
57
69
|
filter: (data): data is any => (data as any)?.id === 'error',
|
|
@@ -86,6 +98,11 @@ const DefaultStory = () => {
|
|
|
86
98
|
setSelected('error');
|
|
87
99
|
}, [manager]);
|
|
88
100
|
|
|
101
|
+
const ref = useRef<HTMLElement>(null);
|
|
102
|
+
useEffect(() => {
|
|
103
|
+
console.log(ref.current);
|
|
104
|
+
}, [ref]);
|
|
105
|
+
|
|
89
106
|
return (
|
|
90
107
|
<div className='flex flex-col bs-full overflow-hidden'>
|
|
91
108
|
<Toolbar.Root>
|
|
@@ -94,7 +111,7 @@ const DefaultStory = () => {
|
|
|
94
111
|
<Toolbar.Button onClick={handleError}>Error</Toolbar.Button>
|
|
95
112
|
</Toolbar.Root>
|
|
96
113
|
<div className='grid grid-cols-2 bs-full gap-4 overflow-hidden'>
|
|
97
|
-
<Surface role='item' data={selected ? { id: selected } : undefined} limit={1} />
|
|
114
|
+
<Surface role='item' data={selected ? { id: selected } : undefined} limit={1} ref={ref} />
|
|
98
115
|
<div className='overflow-y-auto bs-full'>
|
|
99
116
|
<List>
|
|
100
117
|
{surfaces.map((surface) => (
|
|
@@ -112,7 +129,7 @@ const DefaultStory = () => {
|
|
|
112
129
|
const meta = {
|
|
113
130
|
title: 'sdk/app-framework/Surface',
|
|
114
131
|
render: DefaultStory,
|
|
115
|
-
decorators: [withTheme, withPluginManager({ capabilities: [] })],
|
|
132
|
+
decorators: [withTheme(), withPluginManager({ capabilities: [] })],
|
|
116
133
|
parameters: {
|
|
117
134
|
layout: 'fullscreen',
|
|
118
135
|
},
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import React, {
|
|
6
|
+
Fragment,
|
|
7
|
+
type NamedExoticComponent,
|
|
8
|
+
type RefAttributes,
|
|
9
|
+
Suspense,
|
|
10
|
+
forwardRef,
|
|
11
|
+
memo,
|
|
12
|
+
useEffect,
|
|
13
|
+
useMemo,
|
|
14
|
+
useRef,
|
|
15
|
+
} from 'react';
|
|
16
|
+
|
|
17
|
+
import { log } from '@dxos/log';
|
|
18
|
+
import { useDefaultValue } from '@dxos/react-hooks';
|
|
19
|
+
import { ScrollArea } from '@dxos/react-ui';
|
|
20
|
+
import { byPosition } from '@dxos/util';
|
|
21
|
+
|
|
22
|
+
import { Capabilities } from '../../../common';
|
|
23
|
+
import { type CapabilityManager } from '../../../core';
|
|
24
|
+
import { useCapabilities } from '../../hooks';
|
|
25
|
+
import { ErrorBoundary } from '../ErrorBoundary';
|
|
26
|
+
|
|
27
|
+
import { SurfaceContext } from './context';
|
|
28
|
+
import { SurfaceInfo } from './SurfaceInfo';
|
|
29
|
+
import { type Definition, type Props, type WebComponentDefinition } from './types';
|
|
30
|
+
|
|
31
|
+
const DEFAULT_PLACEHOLDER = <Fragment />;
|
|
32
|
+
|
|
33
|
+
const DEBUG = import.meta.env.VITE_DEBUG;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Wrapper component for rendering Web Component surfaces.
|
|
37
|
+
* Handles creation, prop setting, and cleanup of Web Components.
|
|
38
|
+
*/
|
|
39
|
+
const WebComponentWrapper = memo(
|
|
40
|
+
forwardRef<HTMLElement, Props & { definition: WebComponentDefinition }>(
|
|
41
|
+
({ id, role, data, limit, definition, ...rest }, forwardedRef) => {
|
|
42
|
+
const containerRef = useRef<HTMLDivElement>(null);
|
|
43
|
+
const elementRef = useRef<HTMLElement | null>(null);
|
|
44
|
+
const propsRef = useRef({ id, role, data, limit, ...rest });
|
|
45
|
+
|
|
46
|
+
// Update props ref on every render
|
|
47
|
+
propsRef.current = { id, role, data, limit, ...rest };
|
|
48
|
+
|
|
49
|
+
// Create element only once
|
|
50
|
+
useEffect(() => {
|
|
51
|
+
if (!containerRef.current || elementRef.current) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Create the Web Component
|
|
56
|
+
const element = document.createElement(definition.tagName);
|
|
57
|
+
elementRef.current = element;
|
|
58
|
+
|
|
59
|
+
// Set initial properties on the Web Component
|
|
60
|
+
Object.assign(element, propsRef.current);
|
|
61
|
+
|
|
62
|
+
// Append to container
|
|
63
|
+
containerRef.current.appendChild(element);
|
|
64
|
+
|
|
65
|
+
// Setup ref forwarding if provided
|
|
66
|
+
if (typeof forwardedRef === 'function') {
|
|
67
|
+
forwardedRef(element);
|
|
68
|
+
} else if (forwardedRef) {
|
|
69
|
+
forwardedRef.current = element;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Cleanup on unmount to prevent memory leaks
|
|
73
|
+
return () => {
|
|
74
|
+
if (elementRef.current && containerRef.current?.contains(elementRef.current)) {
|
|
75
|
+
containerRef.current.removeChild(elementRef.current);
|
|
76
|
+
}
|
|
77
|
+
if (typeof forwardedRef === 'function') {
|
|
78
|
+
forwardedRef(null);
|
|
79
|
+
} else if (forwardedRef) {
|
|
80
|
+
forwardedRef.current = null;
|
|
81
|
+
}
|
|
82
|
+
elementRef.current = null;
|
|
83
|
+
};
|
|
84
|
+
}, [definition.tagName, forwardedRef]);
|
|
85
|
+
|
|
86
|
+
// Update props on existing element without recreating it
|
|
87
|
+
// This runs on every render to ensure all props (including those in `rest`) are kept up to date
|
|
88
|
+
useEffect(() => {
|
|
89
|
+
const element = elementRef.current;
|
|
90
|
+
if (!element) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Update properties on the existing Web Component
|
|
95
|
+
Object.assign(element, propsRef.current);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
return <div ref={containerRef} />;
|
|
99
|
+
},
|
|
100
|
+
),
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
WebComponentWrapper.displayName = 'WebComponentWrapper';
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Wrapper component that provides context for a surface.
|
|
107
|
+
*/
|
|
108
|
+
const SurfaceContextProvider = memo(
|
|
109
|
+
forwardRef<HTMLElement, Props & { definition: Definition }>(
|
|
110
|
+
({ id, role, data, limit, fallback = DefaultFallback, definition, ...rest }, forwardedRef) => {
|
|
111
|
+
const contextValue = useMemo(() => ({ id, role, data }), [id, role, data]);
|
|
112
|
+
|
|
113
|
+
// Handle Web Component surfaces
|
|
114
|
+
if (definition.kind === 'web-component') {
|
|
115
|
+
return (
|
|
116
|
+
<ErrorBoundary data={data} fallback={fallback}>
|
|
117
|
+
<SurfaceContext.Provider value={contextValue}>
|
|
118
|
+
<WebComponentWrapper
|
|
119
|
+
id={id}
|
|
120
|
+
role={role}
|
|
121
|
+
data={data}
|
|
122
|
+
limit={limit}
|
|
123
|
+
definition={definition}
|
|
124
|
+
ref={forwardedRef}
|
|
125
|
+
{...rest}
|
|
126
|
+
/>
|
|
127
|
+
</SurfaceContext.Provider>
|
|
128
|
+
</ErrorBoundary>
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Handle React component surfaces
|
|
133
|
+
const Component = definition.component;
|
|
134
|
+
|
|
135
|
+
// TODO(burdon): Remove from production build?
|
|
136
|
+
const debug = DEBUG || '__DX_DEBUG__' in window;
|
|
137
|
+
if (debug) {
|
|
138
|
+
return (
|
|
139
|
+
<ErrorBoundary data={data} fallback={fallback}>
|
|
140
|
+
<div role='none' className='contents' data-id={id} data-role={role}>
|
|
141
|
+
<SurfaceContext.Provider value={contextValue}>
|
|
142
|
+
<SurfaceInfo ref={forwardedRef}>
|
|
143
|
+
<Component id={id} role={role} data={data} limit={limit} {...rest} />
|
|
144
|
+
</SurfaceInfo>
|
|
145
|
+
</SurfaceContext.Provider>
|
|
146
|
+
</div>
|
|
147
|
+
</ErrorBoundary>
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return (
|
|
152
|
+
<ErrorBoundary data={data} fallback={fallback}>
|
|
153
|
+
<div role='none' className='contents' data-id={id} data-role={role}>
|
|
154
|
+
<SurfaceContext.Provider value={contextValue}>
|
|
155
|
+
<Component id={id} role={role} data={data} limit={limit} {...rest} ref={forwardedRef} />
|
|
156
|
+
</SurfaceContext.Provider>
|
|
157
|
+
</div>
|
|
158
|
+
</ErrorBoundary>
|
|
159
|
+
);
|
|
160
|
+
},
|
|
161
|
+
),
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
SurfaceContextProvider.displayName = 'SurfaceContextProvider';
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* A surface is a named region of the screen that can be populated by plugins.
|
|
168
|
+
*/
|
|
169
|
+
// TODO(burdon): Remove ref since relying on this would be error prone.
|
|
170
|
+
export const Surface: NamedExoticComponent<Props & RefAttributes<HTMLElement>> = memo(
|
|
171
|
+
forwardRef(({ id: _id, role, data: dataProp, limit, placeholder = DEFAULT_PLACEHOLDER, ...rest }, forwardedRef) => {
|
|
172
|
+
const data = useDefaultValue(dataProp, () => ({}));
|
|
173
|
+
|
|
174
|
+
// TODO(wittjosiah): This will make all surfaces depend on a single signal.
|
|
175
|
+
// This isn't ideal because it means that any change to the data will cause all surfaces to re-render.
|
|
176
|
+
// This effectively means that plugin modules which contribute surfaces need to all be activated at startup.
|
|
177
|
+
// This should be fine for now because it's how it worked prior to capabilities api anyway.
|
|
178
|
+
// In the future, it would be nice to be able to bucket the surface contributions by role.
|
|
179
|
+
const surfaces = useSurfaces();
|
|
180
|
+
|
|
181
|
+
// NOTE: Memoizing the candidates makes the surface not re-render based on reactivity within data.
|
|
182
|
+
const definitions = findCandidates(surfaces, { role, data });
|
|
183
|
+
const candidates = limit ? definitions.slice(0, limit) : definitions;
|
|
184
|
+
if (DEBUG && candidates.length === 0) {
|
|
185
|
+
log.warn('no candidates for surface', { role, data });
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return (
|
|
190
|
+
<Suspense fallback={placeholder}>
|
|
191
|
+
{candidates.map((definition) => (
|
|
192
|
+
<SurfaceContextProvider
|
|
193
|
+
key={definition.id}
|
|
194
|
+
id={definition.id}
|
|
195
|
+
role={role}
|
|
196
|
+
data={data}
|
|
197
|
+
limit={limit}
|
|
198
|
+
definition={definition}
|
|
199
|
+
ref={forwardedRef}
|
|
200
|
+
{...rest}
|
|
201
|
+
/>
|
|
202
|
+
))}
|
|
203
|
+
</Suspense>
|
|
204
|
+
);
|
|
205
|
+
}),
|
|
206
|
+
);
|
|
207
|
+
|
|
208
|
+
Surface.displayName = 'Surface';
|
|
209
|
+
|
|
210
|
+
const findCandidates = (surfaces: Definition[], { role, data }: Pick<Props, 'role' | 'data'>) => {
|
|
211
|
+
return Object.values(surfaces)
|
|
212
|
+
.filter((definition) =>
|
|
213
|
+
Array.isArray(definition.role) ? definition.role.includes(role) : definition.role === role,
|
|
214
|
+
)
|
|
215
|
+
.filter(({ filter }) => (filter ? filter(data ?? {}) : true))
|
|
216
|
+
.toSorted(byPosition);
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
// TODO(burdon): Make user facing, with telemetry.
|
|
220
|
+
// TODO(burdon): Change based on dev/prod mode; infer subject type, id.
|
|
221
|
+
const DefaultFallback = ({ data, error, dev }: { data: any; error: Error; dev?: boolean }) => {
|
|
222
|
+
if (dev) {
|
|
223
|
+
return (
|
|
224
|
+
<ScrollArea.Root orientation='vertical'>
|
|
225
|
+
<ScrollArea.Viewport classNames='p-4 gap-4'>
|
|
226
|
+
<h1 className='flex gap-2 text-sm mbs-2'>{error.message}</h1>
|
|
227
|
+
<pre className='overflow-auto text-xs text-description'>{JSON.stringify(data, null, 2)}</pre>
|
|
228
|
+
</ScrollArea.Viewport>
|
|
229
|
+
</ScrollArea.Root>
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return (
|
|
234
|
+
<ScrollArea.Root orientation='vertical'>
|
|
235
|
+
<ScrollArea.Viewport classNames='p-4 gap-4 border border-roseFill'>
|
|
236
|
+
<h1 className='flex gap-2 text-sm mbs-2 text-errorText'>{error.message}</h1>
|
|
237
|
+
<pre className='overflow-x-auto text-xs text-description'>{error.stack}</pre>
|
|
238
|
+
<pre className='overflow-x-auto text-xs text-description'>{JSON.stringify(data, null, 2)}</pre>
|
|
239
|
+
</ScrollArea.Viewport>
|
|
240
|
+
</ScrollArea.Root>
|
|
241
|
+
);
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* @internal
|
|
246
|
+
*/
|
|
247
|
+
export const useSurfaces = () => {
|
|
248
|
+
const surfaces = useCapabilities(Capabilities.ReactSurface);
|
|
249
|
+
return useMemo(() => surfaces.flat(), [surfaces]);
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* @returns `true` if there is a contributed surface which matches the specified role & data, `false` otherwise.
|
|
254
|
+
*/
|
|
255
|
+
export const isSurfaceAvailable = (
|
|
256
|
+
capabilityManager: CapabilityManager.CapabilityManager,
|
|
257
|
+
{ role, data }: Pick<Props, 'role' | 'data'>,
|
|
258
|
+
) => {
|
|
259
|
+
const surfaces = capabilityManager.getAll(Capabilities.ReactSurface);
|
|
260
|
+
const candidates = findCandidates(surfaces.flat(), { role, data });
|
|
261
|
+
return candidates.length > 0;
|
|
262
|
+
};
|