@dxos/app-framework 0.8.4-main.69d29f4 → 0.8.4-main.6fa680abb7
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 -3
- package/dist/lib/browser/{capability-7PCNSWBT.mjs → capability-6YMUBS54.mjs} +15 -11
- package/dist/lib/browser/capability-6YMUBS54.mjs.map +7 -0
- package/dist/lib/browser/capability-LF3OXSCV.mjs +34 -0
- package/dist/lib/browser/capability-LF3OXSCV.mjs.map +7 -0
- package/dist/lib/browser/{chunk-PKQT6C53.mjs → chunk-272IPLHQ.mjs} +1 -1
- package/dist/lib/browser/{chunk-PKQT6C53.mjs.map → chunk-272IPLHQ.mjs.map} +1 -1
- package/dist/lib/browser/{chunk-FMZN33N4.mjs → chunk-2UI6ACB5.mjs} +48 -31
- package/dist/lib/browser/chunk-2UI6ACB5.mjs.map +7 -0
- package/dist/lib/browser/{chunk-TCLLRCS3.mjs → chunk-7M4467QR.mjs} +6 -6
- package/dist/lib/browser/chunk-7M4467QR.mjs.map +7 -0
- package/dist/lib/browser/{chunk-7IQHKD4U.mjs → chunk-JGWCBVKJ.mjs} +2 -2
- package/dist/lib/browser/chunk-JGWCBVKJ.mjs.map +7 -0
- package/dist/lib/browser/chunk-M5IC326L.mjs +34 -0
- package/dist/lib/browser/chunk-M5IC326L.mjs.map +7 -0
- package/dist/lib/browser/{chunk-XYNO72GQ.mjs → chunk-NQPYE365.mjs} +435 -478
- package/dist/lib/browser/chunk-NQPYE365.mjs.map +7 -0
- package/dist/lib/browser/chunk-TGX63LTL.mjs +8 -0
- package/dist/lib/browser/{chunk-FHQTHCX7.mjs.map → chunk-TGX63LTL.mjs.map} +1 -1
- package/dist/lib/browser/chunk-TIEBZMTF.mjs +44 -0
- package/dist/lib/browser/chunk-TIEBZMTF.mjs.map +7 -0
- package/dist/lib/browser/chunk-WEBSGU5L.mjs +80 -0
- package/dist/lib/browser/chunk-WEBSGU5L.mjs.map +7 -0
- package/dist/lib/browser/chunk-YAFEA4GV.mjs +1 -0
- package/dist/lib/browser/{chunk-6Y7PZV72.mjs → chunk-YNFPIQGB.mjs} +2 -3
- package/dist/lib/browser/{chunk-6Y7PZV72.mjs.map → chunk-YNFPIQGB.mjs.map} +3 -3
- 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 +1 -1
- package/dist/lib/browser/core/capability.mjs +1 -1
- package/dist/lib/browser/core/plugin-manager.mjs +4 -4
- package/dist/lib/browser/core/plugin.mjs +2 -2
- package/dist/lib/browser/index.mjs +37 -132
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/{invoker-capability-SZRSTHEH.mjs → invoker-capability-4AUGUMM5.mjs} +16 -12
- package/dist/lib/browser/invoker-capability-4AUGUMM5.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +28 -20
- package/dist/lib/browser/testing/index.mjs.map +3 -3
- package/dist/lib/browser/{react → ui}/index.mjs +18 -19
- package/dist/lib/node-esm/{capability-CFLQ2QQU.mjs → capability-R5O2OYX4.mjs} +15 -11
- package/dist/lib/node-esm/capability-R5O2OYX4.mjs.map +7 -0
- package/dist/lib/node-esm/capability-SA6LPYGL.mjs +35 -0
- package/dist/lib/node-esm/capability-SA6LPYGL.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-663A54LQ.mjs → chunk-3D66SZHP.mjs} +2 -2
- package/dist/lib/node-esm/chunk-3D66SZHP.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-7OWSHPYK.mjs → chunk-6REV5DE7.mjs} +1 -1
- package/dist/lib/node-esm/{chunk-7OWSHPYK.mjs.map → chunk-6REV5DE7.mjs.map} +1 -1
- package/dist/lib/node-esm/{chunk-6WXBT3EC.mjs → chunk-FHWPWQRJ.mjs} +435 -478
- package/dist/lib/node-esm/chunk-FHWPWQRJ.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-UEWJDI2L.mjs → chunk-FKE4Z3D6.mjs} +2 -2
- package/dist/lib/node-esm/{chunk-UEWJDI2L.mjs.map → chunk-FKE4Z3D6.mjs.map} +1 -1
- package/dist/lib/node-esm/{chunk-GT6OKM5I.mjs → chunk-JHFY3HTS.mjs} +6 -6
- package/dist/lib/node-esm/chunk-JHFY3HTS.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-XYQTBFPA.mjs → chunk-JIVXIJ2T.mjs} +48 -31
- package/dist/lib/node-esm/chunk-JIVXIJ2T.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-NHXBSAQR.mjs +35 -0
- package/dist/lib/node-esm/chunk-NHXBSAQR.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-STMXUEPO.mjs → chunk-SB5ODNPX.mjs} +2 -3
- package/dist/lib/node-esm/{chunk-STMXUEPO.mjs.map → chunk-SB5ODNPX.mjs.map} +3 -3
- package/dist/lib/node-esm/chunk-SCDGIGGU.mjs +45 -0
- package/dist/lib/node-esm/chunk-SCDGIGGU.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-SQICGJBW.mjs +81 -0
- package/dist/lib/node-esm/chunk-SQICGJBW.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 +1 -1
- package/dist/lib/node-esm/core/capability.mjs +1 -1
- package/dist/lib/node-esm/core/plugin-manager.mjs +4 -4
- package/dist/lib/node-esm/core/plugin.mjs +2 -2
- package/dist/lib/node-esm/index.mjs +37 -132
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/{invoker-capability-PNMA5JOS.mjs → invoker-capability-3YDIVDWV.mjs} +16 -12
- package/dist/lib/node-esm/invoker-capability-3YDIVDWV.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +28 -20
- package/dist/lib/node-esm/testing/index.mjs.map +3 -3
- package/dist/lib/node-esm/{react → ui}/index.mjs +18 -19
- package/dist/lib/node-esm/ui/index.mjs.map +7 -0
- package/dist/types/src/{cli.d.ts → cli/cli.d.ts} +2 -2
- 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 +115 -0
- package/dist/types/src/common/capabilities.d.ts.map +1 -0
- package/dist/types/src/common/index.d.ts +4 -9
- package/dist/types/src/common/index.d.ts.map +1 -1
- package/dist/types/src/common/operations.d.ts +1 -348
- package/dist/types/src/common/operations.d.ts.map +1 -1
- package/dist/types/src/common/translations.d.ts +0 -9
- package/dist/types/src/common/translations.d.ts.map +1 -1
- package/dist/types/src/core/activation-event.d.ts +1 -1
- package/dist/types/src/core/capability.d.ts +7 -7
- package/dist/types/src/core/capability.d.ts.map +1 -1
- package/dist/types/src/core/plugin-manager.d.ts.map +1 -1
- package/dist/types/src/core/plugin.d.ts +1 -1
- package/dist/types/src/core/plugin.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -3
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/plugin-operation/history/capability.d.ts +1 -1
- package/dist/types/src/plugin-operation/history/undo-mapping.d.ts +11 -3
- package/dist/types/src/plugin-operation/history/undo-mapping.d.ts.map +1 -1
- package/dist/types/src/plugin-operation/invoker-capability.d.ts +1 -1
- package/dist/types/src/plugin-runtime/capability.d.ts +2 -2
- package/dist/types/src/plugin-runtime/capability.d.ts.map +1 -1
- package/dist/types/src/testing/withPluginManager.d.ts +1 -1
- package/dist/types/src/testing/withPluginManager.d.ts.map +1 -1
- package/dist/types/src/{react → ui/components/App}/App.d.ts +1 -1
- package/dist/types/src/ui/components/App/App.d.ts.map +1 -0
- package/dist/types/src/{react/Surface.stories.d.ts → ui/components/App/App.stories.d.ts} +7 -2
- 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/PluginManager/PluginManagerContext.stories.d.ts.map +1 -0
- package/dist/types/src/{react → ui/components/PluginManager}/PluginManagerProvider.d.ts +1 -1
- 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 +12 -0
- package/dist/types/src/ui/components/Surface/SurfaceComponent.d.ts.map +1 -0
- package/dist/types/src/{react/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.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 +20 -0
- package/dist/types/src/ui/components/Surface/index.d.ts.map +1 -0
- package/dist/types/src/{common/surface.d.ts → ui/components/Surface/types.d.ts} +20 -18
- package/dist/types/src/ui/components/Surface/types.d.ts.map +1 -0
- package/dist/types/src/ui/components/index.d.ts +4 -0
- package/dist/types/src/ui/components/index.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 +14 -9
- package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -0
- package/dist/types/src/{react → ui/hooks}/useCapabilities.d.ts +6 -1
- package/dist/types/src/ui/hooks/useCapabilities.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/useLoading.d.ts.map +1 -0
- package/dist/types/src/{react → ui/hooks}/useOperationResolver.d.ts +2 -2
- package/dist/types/src/ui/hooks/useOperationResolver.d.ts.map +1 -0
- package/dist/types/src/{react/common.d.ts → ui/hooks/useSettingsState.d.ts} +1 -5
- 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/tsconfig.tsbuildinfo +1 -1
- package/moon.yml +6 -6
- package/package.json +72 -64
- package/src/{cli.ts → cli/cli.ts} +10 -10
- package/src/{playground/debug → cli}/index.ts +1 -1
- package/src/common/activation-events.ts +44 -0
- package/src/common/capabilities.ts +178 -0
- package/src/common/index.ts +4 -9
- package/src/common/operations.ts +2 -376
- package/src/common/translations.ts +0 -12
- package/src/context.ts +1 -1
- package/src/core/activation-event.ts +1 -1
- package/src/core/capability.ts +9 -9
- package/src/core/plugin-manager.test.ts +44 -44
- package/src/core/plugin-manager.ts +19 -0
- package/src/core/plugin.ts +3 -2
- package/src/index.ts +1 -3
- package/src/plugin-operation/OperationPlugin.ts +5 -5
- package/src/plugin-operation/history/capability.ts +5 -5
- package/src/plugin-operation/history/undo-mapping.ts +6 -3
- package/src/plugin-operation/invoker-capability.ts +5 -5
- package/src/plugin-operation/meta.ts +1 -1
- package/src/plugin-runtime/RuntimePlugin.ts +4 -4
- package/src/plugin-runtime/capability.ts +5 -5
- package/src/plugin-runtime/meta.ts +1 -1
- package/src/testing/service.ts +6 -6
- package/src/testing/withPluginManager.stories.tsx +6 -6
- package/src/testing/withPluginManager.tsx +11 -8
- package/src/ui/components/App/App.stories.tsx +92 -0
- package/src/{react → ui/components/App}/App.tsx +6 -9
- package/src/{playground/layout → ui/components/App}/index.ts +1 -1
- package/src/{react → ui/components/PluginManager}/PluginManagerContext.stories.tsx +13 -14
- package/src/{react → ui/components/PluginManager}/PluginManagerProvider.ts +1 -1
- package/src/ui/components/PluginManager/index.ts +5 -0
- package/src/{react/Surface.stories.tsx → ui/components/Surface/SurfaceComponent.stories.tsx} +18 -16
- package/src/{react/Surface.tsx → ui/components/Surface/SurfaceComponent.tsx} +36 -56
- package/src/{react → ui/components/Surface}/SurfaceInfo.tsx +2 -2
- package/src/ui/components/Surface/context.ts +12 -0
- package/src/ui/components/Surface/index.ts +20 -0
- package/src/{common/surface.ts → ui/components/Surface/types.ts} +22 -25
- package/src/ui/components/index.ts +7 -0
- package/src/ui/hooks/index.ts +10 -0
- package/src/{react → ui/hooks}/useApp.tsx +29 -25
- package/src/{react → ui/hooks}/useCapabilities.ts +9 -5
- package/src/{react → ui/hooks}/useOperationResolver.ts +5 -5
- package/src/{react/common.ts → ui/hooks/useSettingsState.ts} +0 -11
- package/src/ui/hooks/useSurface.ts +13 -0
- package/src/ui/index.ts +6 -0
- package/tsconfig.json +2 -29
- package/tsconfig.node.json +1 -3
- package/typedoc.json +2 -4
- package/dist/lib/browser/app-graph-builder-M2VPYQC6.mjs +0 -149
- package/dist/lib/browser/app-graph-builder-M2VPYQC6.mjs.map +0 -7
- package/dist/lib/browser/capability-7PCNSWBT.mjs.map +0 -7
- package/dist/lib/browser/capability-KP3PFEXD.mjs +0 -31
- package/dist/lib/browser/capability-KP3PFEXD.mjs.map +0 -7
- package/dist/lib/browser/chunk-7IQHKD4U.mjs.map +0 -7
- package/dist/lib/browser/chunk-BLQJSGL3.mjs +0 -732
- package/dist/lib/browser/chunk-BLQJSGL3.mjs.map +0 -7
- package/dist/lib/browser/chunk-FHQTHCX7.mjs +0 -8
- package/dist/lib/browser/chunk-FMZN33N4.mjs.map +0 -7
- package/dist/lib/browser/chunk-H4WPA7U7.mjs +0 -77
- package/dist/lib/browser/chunk-H4WPA7U7.mjs.map +0 -7
- package/dist/lib/browser/chunk-TCLLRCS3.mjs.map +0 -7
- package/dist/lib/browser/chunk-XYNO72GQ.mjs.map +0 -7
- package/dist/lib/browser/common/index.mjs +0 -38
- package/dist/lib/browser/invoker-capability-SZRSTHEH.mjs.map +0 -7
- package/dist/lib/browser/operation-resolver-6MP2MYOY.mjs +0 -64
- package/dist/lib/browser/operation-resolver-6MP2MYOY.mjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-LROHGJEM.mjs +0 -150
- package/dist/lib/node-esm/app-graph-builder-LROHGJEM.mjs.map +0 -7
- package/dist/lib/node-esm/capability-CFLQ2QQU.mjs.map +0 -7
- package/dist/lib/node-esm/capability-RCUNM2M7.mjs +0 -32
- package/dist/lib/node-esm/capability-RCUNM2M7.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-663A54LQ.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-6WXBT3EC.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-GQEBIGKD.mjs +0 -733
- package/dist/lib/node-esm/chunk-GQEBIGKD.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-GT6OKM5I.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-XR6NMKEP.mjs +0 -78
- package/dist/lib/node-esm/chunk-XR6NMKEP.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-XYQTBFPA.mjs.map +0 -7
- package/dist/lib/node-esm/common/index.mjs +0 -39
- package/dist/lib/node-esm/invoker-capability-PNMA5JOS.mjs.map +0 -7
- package/dist/lib/node-esm/operation-resolver-7YWDMTNU.mjs +0 -65
- package/dist/lib/node-esm/operation-resolver-7YWDMTNU.mjs.map +0 -7
- package/dist/types/src/cli.d.ts.map +0 -1
- package/dist/types/src/common/activation-event.d.ts +0 -66
- package/dist/types/src/common/activation-event.d.ts.map +0 -1
- package/dist/types/src/common/capability.d.ts +0 -265
- package/dist/types/src/common/capability.d.ts.map +0 -1
- package/dist/types/src/common/collaboration.d.ts +0 -26
- package/dist/types/src/common/collaboration.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/plugin.d.ts +0 -201
- package/dist/types/src/common/plugin.d.ts.map +0 -1
- package/dist/types/src/common/surface.d.ts.map +0 -1
- package/dist/types/src/playground/debug/Debug.d.ts +0 -8
- 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 -3
- package/dist/types/src/playground/debug/plugin.d.ts.map +0 -1
- package/dist/types/src/playground/generator/Main.d.ts +0 -8
- package/dist/types/src/playground/generator/Main.d.ts.map +0 -1
- package/dist/types/src/playground/generator/Toolbar.d.ts +0 -8
- package/dist/types/src/playground/generator/Toolbar.d.ts.map +0 -1
- package/dist/types/src/playground/generator/generator.d.ts +0 -19
- 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 -3
- package/dist/types/src/playground/generator/plugin.d.ts.map +0 -1
- package/dist/types/src/playground/layout/Layout.d.ts +0 -10
- 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 -3
- package/dist/types/src/playground/layout/plugin.d.ts.map +0 -1
- package/dist/types/src/playground/logger/Toolbar.d.ts +0 -8
- 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 -3
- package/dist/types/src/playground/logger/plugin.d.ts.map +0 -1
- package/dist/types/src/playground/logger/schema.d.ts +0 -27
- package/dist/types/src/playground/logger/schema.d.ts.map +0 -1
- package/dist/types/src/playground/playground.stories.d.ts +0 -11
- package/dist/types/src/playground/playground.stories.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/SettingsPlugin.d.ts +0 -3
- package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/actions.d.ts +0 -61
- package/dist/types/src/plugin-settings/actions.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/app-graph-builder.d.ts +0 -6
- 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/meta.d.ts +0 -3
- package/dist/types/src/plugin-settings/meta.d.ts.map +0 -1
- package/dist/types/src/plugin-settings/operation-resolver.d.ts +0 -6
- package/dist/types/src/plugin-settings/operation-resolver.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.map +0 -1
- package/dist/types/src/react/App.stories.d.ts.map +0 -1
- package/dist/types/src/react/DefaultFallback.d.ts +0 -8
- package/dist/types/src/react/DefaultFallback.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/PluginManagerContext.stories.d.ts.map +0 -1
- package/dist/types/src/react/PluginManagerProvider.d.ts.map +0 -1
- package/dist/types/src/react/Surface.d.ts +0 -14
- 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/SurfaceInfo.d.ts.map +0 -1
- 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 -12
- 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.map +0 -1
- package/dist/types/src/react/useLoading.d.ts.map +0 -1
- package/dist/types/src/react/useOperationResolver.d.ts.map +0 -1
- package/src/common/activation-event.ts +0 -99
- package/src/common/capability.ts +0 -343
- package/src/common/collaboration.ts +0 -31
- package/src/common/file.ts +0 -22
- package/src/common/graph.ts +0 -30
- package/src/common/plugin.ts +0 -364
- package/src/playground/debug/Debug.tsx +0 -49
- package/src/playground/debug/plugin.ts +0 -16
- package/src/playground/generator/Main.tsx +0 -80
- package/src/playground/generator/Toolbar.tsx +0 -57
- package/src/playground/generator/generator.ts +0 -48
- package/src/playground/generator/index.ts +0 -6
- package/src/playground/generator/plugin.ts +0 -21
- package/src/playground/layout/Layout.tsx +0 -37
- package/src/playground/layout/plugin.ts +0 -18
- package/src/playground/logger/Toolbar.tsx +0 -33
- package/src/playground/logger/index.ts +0 -5
- package/src/playground/logger/plugin.ts +0 -42
- package/src/playground/logger/schema.ts +0 -22
- package/src/playground/playground.stories.tsx +0 -54
- package/src/plugin-settings/SettingsPlugin.ts +0 -19
- package/src/plugin-settings/actions.ts +0 -64
- package/src/plugin-settings/app-graph-builder.ts +0 -140
- package/src/plugin-settings/index.ts +0 -6
- package/src/plugin-settings/meta.ts +0 -10
- package/src/plugin-settings/operation-resolver.ts +0 -55
- package/src/plugin-settings/translations.ts +0 -19
- package/src/react/App.stories.tsx +0 -63
- package/src/react/DefaultFallback.tsx +0 -26
- package/src/react/ErrorBoundary.tsx +0 -56
- package/src/react/index.ts +0 -14
- package/src/react/types.ts +0 -27
- /package/dist/lib/{node-esm/react/index.mjs.map → browser/chunk-YAFEA4GV.mjs.map} +0 -0
- /package/dist/lib/{node-esm/common/index.mjs.map → browser/common/activation-events.mjs.map} +0 -0
- /package/dist/lib/browser/{react/index.mjs.map → common/capabilities.mjs.map} +0 -0
- /package/dist/lib/browser/{common → ui}/index.mjs.map +0 -0
- /package/dist/types/src/{react → ui/components/PluginManager}/PluginManagerContext.stories.d.ts +0 -0
- /package/dist/types/src/{react → ui/components/Surface}/SurfaceInfo.d.ts +0 -0
- /package/dist/types/src/{react → ui/hooks}/useLoading.d.ts +0 -0
- /package/src/{react → ui/hooks}/useLoading.tsx +0 -0
|
@@ -7,9 +7,9 @@ import React from 'react';
|
|
|
7
7
|
|
|
8
8
|
import { withTheme } from '@dxos/react-ui/testing';
|
|
9
9
|
|
|
10
|
-
import
|
|
10
|
+
import { Capabilities } from '../common';
|
|
11
11
|
import { Capability } from '../core';
|
|
12
|
-
import { Surface } from '../
|
|
12
|
+
import { Surface } from '../ui';
|
|
13
13
|
|
|
14
14
|
import { withPluginManager } from './withPluginManager';
|
|
15
15
|
|
|
@@ -18,7 +18,7 @@ const DefaultStory = () => {
|
|
|
18
18
|
return (
|
|
19
19
|
<div>
|
|
20
20
|
<div>Hello</div>
|
|
21
|
-
<Surface role='main' />
|
|
21
|
+
<Surface.Surface role='main' />
|
|
22
22
|
</div>
|
|
23
23
|
);
|
|
24
24
|
};
|
|
@@ -27,12 +27,12 @@ const meta = {
|
|
|
27
27
|
title: 'sdk/app-framework/withPluginManager',
|
|
28
28
|
render: DefaultStory,
|
|
29
29
|
decorators: [
|
|
30
|
-
withTheme,
|
|
30
|
+
withTheme(),
|
|
31
31
|
withPluginManager({
|
|
32
32
|
capabilities: [
|
|
33
33
|
Capability.contributes(
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
Capabilities.ReactSurface,
|
|
35
|
+
Surface.create({
|
|
36
36
|
id: 'test',
|
|
37
37
|
role: 'main',
|
|
38
38
|
component: ({ role }) => <span>{JSON.stringify({ role })}</span>,
|
|
@@ -10,9 +10,9 @@ import { raise } from '@dxos/debug';
|
|
|
10
10
|
import { useAsyncEffect } from '@dxos/react-hooks';
|
|
11
11
|
import { type MaybeProvider, getProviderValue } from '@dxos/util';
|
|
12
12
|
|
|
13
|
-
import
|
|
13
|
+
import { ActivationEvents, Capabilities } from '../common';
|
|
14
14
|
import { type ActivationEvent, Capability, type CapabilityManager, Plugin, PluginManager } from '../core';
|
|
15
|
-
import { type UseAppOptions, useApp } from '../
|
|
15
|
+
import { type UseAppOptions, useApp } from '../ui';
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
18
|
* @internal
|
|
@@ -61,18 +61,21 @@ export type WithPluginManagerInitializer<Args = void> =
|
|
|
61
61
|
export const withPluginManager = <Args,>(init: WithPluginManagerInitializer<Args> = {}): Decorator => {
|
|
62
62
|
return (Story, context) => {
|
|
63
63
|
const options = typeof init === 'function' ? init(context as any) : init;
|
|
64
|
-
const pluginManager = useMemo(
|
|
64
|
+
const { pluginManager, setupEvents } = useMemo(
|
|
65
|
+
() => ({ pluginManager: setupPluginManager(options), setupEvents: options.setupEvents }),
|
|
66
|
+
[init],
|
|
67
|
+
);
|
|
65
68
|
|
|
66
69
|
// Set-up root capability.
|
|
67
70
|
useEffect(() => {
|
|
68
|
-
const capability = Capability.contributes(
|
|
71
|
+
const capability = Capability.contributes(Capabilities.ReactRoot, {
|
|
69
72
|
id: context.id,
|
|
70
73
|
root: () => <Story />,
|
|
71
74
|
});
|
|
72
75
|
|
|
73
76
|
pluginManager.capabilities.contribute({
|
|
74
77
|
...capability,
|
|
75
|
-
module: 'dxos.
|
|
78
|
+
module: 'org.dxos.app-framework.with-plugin-manager',
|
|
76
79
|
});
|
|
77
80
|
|
|
78
81
|
return () => {
|
|
@@ -86,14 +89,14 @@ export const withPluginManager = <Args,>(init: WithPluginManagerInitializer<Args
|
|
|
86
89
|
}, [pluginManager]);
|
|
87
90
|
|
|
88
91
|
// Create app.
|
|
89
|
-
const App = useApp({ pluginManager });
|
|
92
|
+
const App = useApp({ pluginManager, setupEvents });
|
|
90
93
|
|
|
91
94
|
return <App />;
|
|
92
95
|
};
|
|
93
96
|
};
|
|
94
97
|
|
|
95
98
|
const storyMeta = {
|
|
96
|
-
id: 'dxos.
|
|
99
|
+
id: 'org.dxos.app-framework.story',
|
|
97
100
|
name: 'Story',
|
|
98
101
|
};
|
|
99
102
|
|
|
@@ -102,7 +105,7 @@ const storyMeta = {
|
|
|
102
105
|
const StoryPlugin = Plugin.define(storyMeta).pipe(
|
|
103
106
|
Plugin.addModule({
|
|
104
107
|
id: 'Story',
|
|
105
|
-
activatesOn:
|
|
108
|
+
activatesOn: ActivationEvents.Startup,
|
|
106
109
|
activate: () => Effect.succeed([]),
|
|
107
110
|
}),
|
|
108
111
|
Plugin.make,
|
|
@@ -0,0 +1,92 @@
|
|
|
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, { useEffect } 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<{ error?: boolean }>({
|
|
17
|
+
id: 'org.dxos.plugin.test',
|
|
18
|
+
name: 'Test Plugin',
|
|
19
|
+
}).pipe(
|
|
20
|
+
Plugin.addModule(({ error }) => ({
|
|
21
|
+
id: 'TestMain',
|
|
22
|
+
activatesOn: ActivationEvents.Startup,
|
|
23
|
+
activate: () =>
|
|
24
|
+
Effect.succeed([
|
|
25
|
+
Capability.contributes(Capabilities.ReactRoot, {
|
|
26
|
+
id: 'org.dxos.plugin.test.root',
|
|
27
|
+
root: () => {
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
let t: NodeJS.Timeout;
|
|
30
|
+
if (error) {
|
|
31
|
+
console.log('Ticking...');
|
|
32
|
+
t = setTimeout(() => {
|
|
33
|
+
console.log('Bang!');
|
|
34
|
+
throw new Error('Runtime error');
|
|
35
|
+
}, 3_000);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return () => clearTimeout(t);
|
|
39
|
+
}, [error]);
|
|
40
|
+
|
|
41
|
+
return <h1 className='text-lg'>App Started</h1>;
|
|
42
|
+
},
|
|
43
|
+
}),
|
|
44
|
+
]),
|
|
45
|
+
})),
|
|
46
|
+
Plugin.make,
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
const core = [TestPlugin.meta.id];
|
|
50
|
+
|
|
51
|
+
type StoryProps = { plugins?: Plugin.Plugin[] };
|
|
52
|
+
|
|
53
|
+
const DefaultStory = ({ plugins }: StoryProps) => {
|
|
54
|
+
const App = useApp({
|
|
55
|
+
plugins,
|
|
56
|
+
core,
|
|
57
|
+
placeholder: () => {
|
|
58
|
+
return (
|
|
59
|
+
<div role='none' className='text-description'>
|
|
60
|
+
Loading...
|
|
61
|
+
</div>
|
|
62
|
+
);
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
return <App />;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const meta = {
|
|
70
|
+
title: 'sdk/app-framework/App',
|
|
71
|
+
render: DefaultStory,
|
|
72
|
+
decorators: [withTheme()],
|
|
73
|
+
parameters: {
|
|
74
|
+
layout: 'centered',
|
|
75
|
+
},
|
|
76
|
+
} satisfies Meta;
|
|
77
|
+
|
|
78
|
+
export default meta;
|
|
79
|
+
|
|
80
|
+
type Story = StoryObj<typeof meta>;
|
|
81
|
+
|
|
82
|
+
export const Default: Story = {
|
|
83
|
+
args: {
|
|
84
|
+
plugins: [TestPlugin({})],
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
export const WithError: Story = {
|
|
89
|
+
args: {
|
|
90
|
+
plugins: [TestPlugin({ error: true })],
|
|
91
|
+
},
|
|
92
|
+
};
|
|
@@ -4,12 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
import React, { type PropsWithChildren } from 'react';
|
|
6
6
|
|
|
7
|
-
import
|
|
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;
|
|
@@ -17,8 +14,8 @@ export type AppProps = Pick<UseAppOptions, 'placeholder' | 'debounce'> & {
|
|
|
17
14
|
};
|
|
18
15
|
|
|
19
16
|
export const App = ({ placeholder: Placeholder, ready, error, debounce }: AppProps) => {
|
|
20
|
-
const reactContexts = useCapabilities(
|
|
21
|
-
const reactRoots = useCapabilities(
|
|
17
|
+
const reactContexts = useCapabilities(Capabilities.ReactContext);
|
|
18
|
+
const reactRoots = useCapabilities(Capabilities.ReactRoot);
|
|
22
19
|
const stage = useLoading(ready, debounce);
|
|
23
20
|
|
|
24
21
|
if (error) {
|
|
@@ -45,7 +42,7 @@ export const App = ({ placeholder: Placeholder, ready, error, debounce }: AppPro
|
|
|
45
42
|
);
|
|
46
43
|
};
|
|
47
44
|
|
|
48
|
-
const composeContexts = (contexts:
|
|
45
|
+
const composeContexts = (contexts: Capabilities.ReactContext[]) => {
|
|
49
46
|
if (contexts.length === 0) {
|
|
50
47
|
return ({ children }: PropsWithChildren) => <>{children}</>;
|
|
51
48
|
}
|
|
@@ -7,14 +7,13 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
|
7
7
|
import * as Effect from 'effect/Effect';
|
|
8
8
|
import React, { useEffect, useMemo, useState } from 'react';
|
|
9
9
|
|
|
10
|
-
import { withTheme } from '@dxos/react-ui/testing';
|
|
10
|
+
import { withLayout, withTheme } from '@dxos/react-ui/testing';
|
|
11
11
|
import { useWebComponentContext } from '@dxos/web-context-react';
|
|
12
12
|
|
|
13
|
-
import
|
|
14
|
-
import { PluginManagerContext } from '
|
|
15
|
-
import { Capability, Plugin } from '
|
|
16
|
-
|
|
17
|
-
import { useApp } from './useApp';
|
|
13
|
+
import { ActivationEvents, Capabilities } from '../../../common';
|
|
14
|
+
import { PluginManagerContext } from '../../../context';
|
|
15
|
+
import { Capability, Plugin } from '../../../core';
|
|
16
|
+
import { useApp } from '../../hooks';
|
|
18
17
|
|
|
19
18
|
// Define the Counter capability
|
|
20
19
|
const Counter = Capability.make<{ count: number; increment: () => void }>('example/counter');
|
|
@@ -79,7 +78,7 @@ const CounterComponent = () => {
|
|
|
79
78
|
}, [counter]);
|
|
80
79
|
|
|
81
80
|
if (!manager) {
|
|
82
|
-
return <div className='p-4 text-
|
|
81
|
+
return <div className='p-4 text-error-text'>Error: Context not found</div>;
|
|
83
82
|
}
|
|
84
83
|
|
|
85
84
|
return (
|
|
@@ -105,7 +104,7 @@ const CounterComponent = () => {
|
|
|
105
104
|
<CountStatus />
|
|
106
105
|
</div>
|
|
107
106
|
|
|
108
|
-
<div className='mt-8 pt-4 border-
|
|
107
|
+
<div className='mt-8 pt-4 border-t border-neutral-200 dark:border-neutral-700 text-center'>
|
|
109
108
|
<p className='text-sm text-neutral-500 dark:text-neutral-400'>
|
|
110
109
|
This component accesses the <code>PluginManager</code> via <code>useWebComponentContext</code>.
|
|
111
110
|
</p>
|
|
@@ -117,12 +116,12 @@ const CounterComponent = () => {
|
|
|
117
116
|
|
|
118
117
|
// Plugin that provides the Counter capability and renders the UI
|
|
119
118
|
const CounterPlugin = Plugin.define({
|
|
120
|
-
id: 'dxos.
|
|
119
|
+
id: 'org.dxos.plugin.counter',
|
|
121
120
|
name: 'Counter Plugin',
|
|
122
121
|
}).pipe(
|
|
123
122
|
Plugin.addModule({
|
|
124
123
|
id: 'CounterMain',
|
|
125
|
-
activatesOn:
|
|
124
|
+
activatesOn: ActivationEvents.Startup,
|
|
126
125
|
activate: () => {
|
|
127
126
|
const listeners = new Set<() => void>();
|
|
128
127
|
const counter = {
|
|
@@ -142,8 +141,8 @@ const CounterPlugin = Plugin.define({
|
|
|
142
141
|
Capability.contributes(Counter, counter),
|
|
143
142
|
|
|
144
143
|
// Contribute the UI
|
|
145
|
-
Capability.contributes(
|
|
146
|
-
id: 'dxos.
|
|
144
|
+
Capability.contributes(Capabilities.ReactRoot, {
|
|
145
|
+
id: 'org.dxos.plugin.counter.root',
|
|
147
146
|
root: CounterComponent,
|
|
148
147
|
}),
|
|
149
148
|
]);
|
|
@@ -153,7 +152,7 @@ const CounterPlugin = Plugin.define({
|
|
|
153
152
|
)();
|
|
154
153
|
|
|
155
154
|
const plugins = [CounterPlugin];
|
|
156
|
-
const core = ['dxos.
|
|
155
|
+
const core = ['org.dxos.plugin.counter'];
|
|
157
156
|
const placeholder = () => (
|
|
158
157
|
<div className='flex h-screen items-center justify-center p-4 text-lg text-neutral-500'>
|
|
159
158
|
Initializing Application...
|
|
@@ -173,7 +172,7 @@ const DefaultStory = () => {
|
|
|
173
172
|
const meta = {
|
|
174
173
|
title: 'sdk/app-framework/PluginManagerContext',
|
|
175
174
|
render: DefaultStory,
|
|
176
|
-
decorators: [withTheme],
|
|
175
|
+
decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
|
|
177
176
|
parameters: {
|
|
178
177
|
layout: 'fullscreen',
|
|
179
178
|
},
|
|
@@ -6,7 +6,7 @@ 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
11
|
const PluginManagerContext = createContext<PluginManager.PluginManager | undefined>(undefined);
|
|
12
12
|
|
package/src/{react/Surface.stories.tsx → ui/components/Surface/SurfaceComponent.stories.tsx}
RENAMED
|
@@ -7,14 +7,15 @@ import React, { forwardRef, useCallback, useEffect, useRef, useState } from 'rea
|
|
|
7
7
|
|
|
8
8
|
import { faker } from '@dxos/random';
|
|
9
9
|
import { List, ListItem, Toolbar } from '@dxos/react-ui';
|
|
10
|
-
import { withTheme } from '@dxos/react-ui/testing';
|
|
10
|
+
import { withLayout, withTheme } from '@dxos/react-ui/testing';
|
|
11
11
|
import { type ColorStyles, getHashStyles, mx } from '@dxos/ui-theme';
|
|
12
12
|
|
|
13
|
-
import
|
|
14
|
-
import { withPluginManager } from '
|
|
13
|
+
import { Capabilities } from '../../../common';
|
|
14
|
+
import { withPluginManager } from '../../../testing';
|
|
15
|
+
import { usePluginManager } from '../PluginManager';
|
|
15
16
|
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
17
|
+
import { SurfaceComponent, useSurfaces } from './SurfaceComponent';
|
|
18
|
+
import { create } from './types';
|
|
18
19
|
|
|
19
20
|
type TestComponentProps = {
|
|
20
21
|
id: string;
|
|
@@ -24,7 +25,7 @@ type TestComponentProps = {
|
|
|
24
25
|
const TestComponent = forwardRef<HTMLDivElement, TestComponentProps>(({ styles, id }, forwardedRef) => {
|
|
25
26
|
return (
|
|
26
27
|
<div
|
|
27
|
-
className={mx('flex justify-center items-center border rounded', styles.surface, styles.border)}
|
|
28
|
+
className={mx('flex justify-center items-center border rounded-sm', styles.surface, styles.border)}
|
|
28
29
|
ref={forwardedRef}
|
|
29
30
|
>
|
|
30
31
|
<span className={mx('dx-tag font-mono text-lg', styles.text)}>{id}</span>
|
|
@@ -40,10 +41,11 @@ const DefaultStory = () => {
|
|
|
40
41
|
const handleAdd = useCallback(() => {
|
|
41
42
|
const id = `test-${faker.number.int({ min: 0, max: 1_000 })}`;
|
|
42
43
|
const styles = getHashStyles(id);
|
|
44
|
+
|
|
43
45
|
manager.capabilities.contribute({
|
|
44
46
|
module: 'test',
|
|
45
|
-
interface:
|
|
46
|
-
implementation:
|
|
47
|
+
interface: Capabilities.ReactSurface,
|
|
48
|
+
implementation: create({
|
|
47
49
|
id,
|
|
48
50
|
role: 'item',
|
|
49
51
|
filter: (data): data is any => (data as any)?.id === id,
|
|
@@ -61,8 +63,8 @@ const DefaultStory = () => {
|
|
|
61
63
|
const handleError = useCallback(() => {
|
|
62
64
|
manager.capabilities.contribute({
|
|
63
65
|
module: 'error',
|
|
64
|
-
interface:
|
|
65
|
-
implementation:
|
|
66
|
+
interface: Capabilities.ReactSurface,
|
|
67
|
+
implementation: create({
|
|
66
68
|
id: 'error',
|
|
67
69
|
role: 'item',
|
|
68
70
|
filter: (data): data is any => (data as any)?.id === 'error',
|
|
@@ -86,7 +88,7 @@ const DefaultStory = () => {
|
|
|
86
88
|
}
|
|
87
89
|
|
|
88
90
|
return (
|
|
89
|
-
<div className='flex justify-center items-center border border-
|
|
91
|
+
<div className='flex justify-center items-center border border-rose-fill rounded-sm'>
|
|
90
92
|
<span className='font-mono'>Ticking... {count}</span>
|
|
91
93
|
</div>
|
|
92
94
|
);
|
|
@@ -103,15 +105,15 @@ const DefaultStory = () => {
|
|
|
103
105
|
}, [ref]);
|
|
104
106
|
|
|
105
107
|
return (
|
|
106
|
-
<div className='flex flex-col
|
|
108
|
+
<div className='flex flex-col h-full overflow-hidden'>
|
|
107
109
|
<Toolbar.Root>
|
|
108
110
|
<Toolbar.Button onClick={handleAdd}>Add</Toolbar.Button>
|
|
109
111
|
<Toolbar.Button onClick={handleSelect}>Pick</Toolbar.Button>
|
|
110
112
|
<Toolbar.Button onClick={handleError}>Error</Toolbar.Button>
|
|
111
113
|
</Toolbar.Root>
|
|
112
|
-
<div className='grid grid-cols-2
|
|
113
|
-
<
|
|
114
|
-
<div className='overflow-y-auto
|
|
114
|
+
<div className='grid grid-cols-2 h-full gap-4 overflow-hidden'>
|
|
115
|
+
<SurfaceComponent role='item' data={selected ? { id: selected } : undefined} limit={1} ref={ref} />
|
|
116
|
+
<div className='overflow-y-auto h-full'>
|
|
115
117
|
<List>
|
|
116
118
|
{surfaces.map((surface) => (
|
|
117
119
|
<ListItem.Root key={surface.id} id={surface.id}>
|
|
@@ -128,7 +130,7 @@ const DefaultStory = () => {
|
|
|
128
130
|
const meta = {
|
|
129
131
|
title: 'sdk/app-framework/Surface',
|
|
130
132
|
render: DefaultStory,
|
|
131
|
-
decorators: [withTheme, withPluginManager({ capabilities: [] })],
|
|
133
|
+
decorators: [withTheme(), withLayout({ layout: 'fullscreen' }), withPluginManager({ capabilities: [] })],
|
|
132
134
|
parameters: {
|
|
133
135
|
layout: 'fullscreen',
|
|
134
136
|
},
|
|
@@ -3,47 +3,40 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import React, {
|
|
6
|
-
type Context,
|
|
7
6
|
Fragment,
|
|
8
7
|
type NamedExoticComponent,
|
|
9
8
|
type RefAttributes,
|
|
10
9
|
Suspense,
|
|
11
|
-
createContext,
|
|
12
10
|
forwardRef,
|
|
13
11
|
memo,
|
|
14
|
-
useContext,
|
|
15
12
|
useEffect,
|
|
16
13
|
useMemo,
|
|
17
14
|
useRef,
|
|
18
15
|
} from 'react';
|
|
19
16
|
|
|
20
|
-
import { raise } from '@dxos/debug';
|
|
21
17
|
import { log } from '@dxos/log';
|
|
18
|
+
import { ErrorBoundary } from '@dxos/react-error-boundary';
|
|
22
19
|
import { useDefaultValue } from '@dxos/react-hooks';
|
|
23
20
|
import { byPosition } from '@dxos/util';
|
|
24
21
|
|
|
25
|
-
import
|
|
26
|
-
import { type CapabilityManager } from '
|
|
22
|
+
import { Capabilities } from '../../../common';
|
|
23
|
+
import { type CapabilityManager } from '../../../core';
|
|
24
|
+
import { useCapabilities } from '../../hooks';
|
|
27
25
|
|
|
28
|
-
import {
|
|
26
|
+
import { SurfaceContext } from './context';
|
|
29
27
|
import { SurfaceInfo } from './SurfaceInfo';
|
|
30
|
-
import {
|
|
28
|
+
import { type Definition, type Props, type WebComponentDefinition } from './types';
|
|
31
29
|
|
|
32
30
|
const DEFAULT_PLACEHOLDER = <Fragment />;
|
|
33
31
|
|
|
34
32
|
const DEBUG = import.meta.env.VITE_DEBUG;
|
|
35
33
|
|
|
36
|
-
export type SurfaceContext = Pick<Common.SurfaceProps, 'id' | 'role' | 'data'>;
|
|
37
|
-
|
|
38
|
-
// TODO(burdon): Use @radix-ui/react-context
|
|
39
|
-
const SurfaceContext: Context<SurfaceContext | undefined> = createContext<SurfaceContext | undefined>(undefined);
|
|
40
|
-
|
|
41
34
|
/**
|
|
42
35
|
* Wrapper component for rendering Web Component surfaces.
|
|
43
36
|
* Handles creation, prop setting, and cleanup of Web Components.
|
|
44
37
|
*/
|
|
45
38
|
const WebComponentWrapper = memo(
|
|
46
|
-
forwardRef<HTMLElement,
|
|
39
|
+
forwardRef<HTMLElement, Props & { definition: WebComponentDefinition }>(
|
|
47
40
|
({ id, role, data, limit, definition, ...rest }, forwardedRef) => {
|
|
48
41
|
const containerRef = useRef<HTMLDivElement>(null);
|
|
49
42
|
const elementRef = useRef<HTMLElement | null>(null);
|
|
@@ -54,7 +47,9 @@ const WebComponentWrapper = memo(
|
|
|
54
47
|
|
|
55
48
|
// Create element only once
|
|
56
49
|
useEffect(() => {
|
|
57
|
-
if (!containerRef.current || elementRef.current)
|
|
50
|
+
if (!containerRef.current || elementRef.current) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
58
53
|
|
|
59
54
|
// Create the Web Component
|
|
60
55
|
const element = document.createElement(definition.tagName);
|
|
@@ -91,7 +86,9 @@ const WebComponentWrapper = memo(
|
|
|
91
86
|
// This runs on every render to ensure all props (including those in `rest`) are kept up to date
|
|
92
87
|
useEffect(() => {
|
|
93
88
|
const element = elementRef.current;
|
|
94
|
-
if (!element)
|
|
89
|
+
if (!element) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
95
92
|
|
|
96
93
|
// Update properties on the existing Web Component
|
|
97
94
|
Object.assign(element, propsRef.current);
|
|
@@ -107,15 +104,16 @@ WebComponentWrapper.displayName = 'WebComponentWrapper';
|
|
|
107
104
|
/**
|
|
108
105
|
* Wrapper component that provides context for a surface.
|
|
109
106
|
*/
|
|
107
|
+
// TODO(burdon): Allow DebugPlugin to provide different fallback using react-ui ErrorFallback.
|
|
110
108
|
const SurfaceContextProvider = memo(
|
|
111
|
-
forwardRef<HTMLElement,
|
|
112
|
-
({ id, role, data, limit, fallback =
|
|
109
|
+
forwardRef<HTMLElement, Props & { definition: Definition }>(
|
|
110
|
+
({ id, role, data, limit, fallback = ErrorFallback, definition, ...rest }, forwardedRef) => {
|
|
113
111
|
const contextValue = useMemo(() => ({ id, role, data }), [id, role, data]);
|
|
114
112
|
|
|
115
113
|
// Handle Web Component surfaces
|
|
116
114
|
if (definition.kind === 'web-component') {
|
|
117
115
|
return (
|
|
118
|
-
<ErrorBoundary
|
|
116
|
+
<ErrorBoundary name='surface' resetKeys={[data]} FallbackComponent={fallback}>
|
|
119
117
|
<SurfaceContext.Provider value={contextValue}>
|
|
120
118
|
<WebComponentWrapper
|
|
121
119
|
id={id}
|
|
@@ -138,7 +136,7 @@ const SurfaceContextProvider = memo(
|
|
|
138
136
|
const debug = DEBUG || '__DX_DEBUG__' in window;
|
|
139
137
|
if (debug) {
|
|
140
138
|
return (
|
|
141
|
-
<ErrorBoundary
|
|
139
|
+
<ErrorBoundary name='surface' resetKeys={[data]} FallbackComponent={fallback}>
|
|
142
140
|
<div role='none' className='contents' data-id={id} data-role={role}>
|
|
143
141
|
<SurfaceContext.Provider value={contextValue}>
|
|
144
142
|
<SurfaceInfo ref={forwardedRef}>
|
|
@@ -151,7 +149,7 @@ const SurfaceContextProvider = memo(
|
|
|
151
149
|
}
|
|
152
150
|
|
|
153
151
|
return (
|
|
154
|
-
<ErrorBoundary
|
|
152
|
+
<ErrorBoundary name='surface' resetKeys={[data]} FallbackComponent={fallback}>
|
|
155
153
|
<div role='none' className='contents' data-id={id} data-role={role}>
|
|
156
154
|
<SurfaceContext.Provider value={contextValue}>
|
|
157
155
|
<Component id={id} role={role} data={data} limit={limit} {...rest} ref={forwardedRef} />
|
|
@@ -165,15 +163,11 @@ const SurfaceContextProvider = memo(
|
|
|
165
163
|
|
|
166
164
|
SurfaceContextProvider.displayName = 'SurfaceContextProvider';
|
|
167
165
|
|
|
168
|
-
export const useSurface = (): SurfaceContext => {
|
|
169
|
-
const context = useContext(SurfaceContext) ?? raise(new Error('Missing SurfaceContext'));
|
|
170
|
-
return context;
|
|
171
|
-
};
|
|
172
|
-
|
|
173
166
|
/**
|
|
174
167
|
* A surface is a named region of the screen that can be populated by plugins.
|
|
175
168
|
*/
|
|
176
|
-
|
|
169
|
+
// TODO(burdon): Remove `ref` since relying on this would be error prone.
|
|
170
|
+
export const SurfaceComponent: NamedExoticComponent<Props & RefAttributes<HTMLElement>> = memo(
|
|
177
171
|
forwardRef(({ id: _id, role, data: dataProp, limit, placeholder = DEFAULT_PLACEHOLDER, ...rest }, forwardedRef) => {
|
|
178
172
|
const data = useDefaultValue(dataProp, () => ({}));
|
|
179
173
|
|
|
@@ -211,12 +205,19 @@ export const Surface: NamedExoticComponent<Common.SurfaceProps & RefAttributes<H
|
|
|
211
205
|
}),
|
|
212
206
|
);
|
|
213
207
|
|
|
214
|
-
|
|
208
|
+
SurfaceComponent.displayName = 'Surface';
|
|
215
209
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
{
|
|
219
|
-
|
|
210
|
+
// TODO(burdon): Make user facing, with telemetry.
|
|
211
|
+
const ErrorFallback = ({ error }: Props) => {
|
|
212
|
+
const { message } = error instanceof Error ? error : { message: String(error) };
|
|
213
|
+
return (
|
|
214
|
+
<div role='alert' data-testid='error-boundary-fallback'>
|
|
215
|
+
<h1 className='flex gap-2 text-sm mt-2 text-info-text'>{message}</h1>
|
|
216
|
+
</div>
|
|
217
|
+
);
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
const findCandidates = (surfaces: Definition[], { role, data }: Pick<Props, 'role' | 'data'>) => {
|
|
220
221
|
return Object.values(surfaces)
|
|
221
222
|
.filter((definition) =>
|
|
222
223
|
Array.isArray(definition.role) ? definition.role.includes(role) : definition.role === role,
|
|
@@ -225,32 +226,11 @@ const findCandidates = (
|
|
|
225
226
|
.toSorted(byPosition);
|
|
226
227
|
};
|
|
227
228
|
|
|
228
|
-
// TODO(burdon): Make user facing, with telemetry.
|
|
229
|
-
// TODO(burdon): Change based on dev/prod mode; infer subject type, id.
|
|
230
|
-
const DefaultFallback = ({ data, error, dev }: { data: any; error: Error; dev?: boolean }) => {
|
|
231
|
-
if (dev) {
|
|
232
|
-
return (
|
|
233
|
-
<div className='flex flex-col gap-4 p-4 is-full overflow-y-auto'>
|
|
234
|
-
<h1 className='flex gap-2 text-sm mbs-2'>{error.message}</h1>
|
|
235
|
-
<pre className='overflow-auto text-xs text-description'>{JSON.stringify(data, null, 2)}</pre>
|
|
236
|
-
</div>
|
|
237
|
-
);
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
return (
|
|
241
|
-
<div className='flex flex-col gap-4 p-4 is-full overflow-y-auto border border-roseFill'>
|
|
242
|
-
<h1 className='flex gap-2 text-sm mbs-2 text-rose-500'>{error.message}</h1>
|
|
243
|
-
<pre className='overflow-auto text-xs text-description'>{error.stack}</pre>
|
|
244
|
-
<pre className='overflow-auto text-xs text-description'>{JSON.stringify(data, null, 2)}</pre>
|
|
245
|
-
</div>
|
|
246
|
-
);
|
|
247
|
-
};
|
|
248
|
-
|
|
249
229
|
/**
|
|
250
230
|
* @internal
|
|
251
231
|
*/
|
|
252
232
|
export const useSurfaces = () => {
|
|
253
|
-
const surfaces = useCapabilities(
|
|
233
|
+
const surfaces = useCapabilities(Capabilities.ReactSurface);
|
|
254
234
|
return useMemo(() => surfaces.flat(), [surfaces]);
|
|
255
235
|
};
|
|
256
236
|
|
|
@@ -259,9 +239,9 @@ export const useSurfaces = () => {
|
|
|
259
239
|
*/
|
|
260
240
|
export const isSurfaceAvailable = (
|
|
261
241
|
capabilityManager: CapabilityManager.CapabilityManager,
|
|
262
|
-
{ role, data }: Pick<
|
|
242
|
+
{ role, data }: Pick<Props, 'role' | 'data'>,
|
|
263
243
|
) => {
|
|
264
|
-
const surfaces = capabilityManager.getAll(
|
|
244
|
+
const surfaces = capabilityManager.getAll(Capabilities.ReactSurface);
|
|
265
245
|
const candidates = findCandidates(surfaces.flat(), { role, data });
|
|
266
246
|
return candidates.length > 0;
|
|
267
247
|
};
|
|
@@ -16,7 +16,7 @@ import { createPortal } from 'react-dom';
|
|
|
16
16
|
import { addEventListener, combine } from '@dxos/async';
|
|
17
17
|
import { useMergeRefs } from '@dxos/react-hooks';
|
|
18
18
|
|
|
19
|
-
import { useSurface } from '
|
|
19
|
+
import { useSurface } from '../../hooks';
|
|
20
20
|
|
|
21
21
|
export type SurfaceInfoProps = {
|
|
22
22
|
children: ReactElement<{ ref?: Ref<HTMLElement> }>;
|
|
@@ -76,7 +76,7 @@ export const SurfaceInfo = forwardRef<HTMLElement, SurfaceInfoProps>(({ children
|
|
|
76
76
|
>
|
|
77
77
|
{expand ? (
|
|
78
78
|
<div
|
|
79
|
-
className='absolute inset-0 bg-
|
|
79
|
+
className='absolute inset-0 bg-deck-surface border border-green-500 cursor-pointer pointer-events-auto overflow-auto'
|
|
80
80
|
onPointerDown={(ev) => ev.stopPropagation()}
|
|
81
81
|
onClick={(ev) => {
|
|
82
82
|
ev.stopPropagation();
|
|
@@ -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);
|