@dxos/app-framework 0.8.4-main.ae835ea → 0.8.4-main.bc674ce
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/app-graph-builder-M2VPYQC6.mjs +149 -0
- package/dist/lib/browser/app-graph-builder-M2VPYQC6.mjs.map +7 -0
- package/dist/lib/browser/capability-7PCNSWBT.mjs +33 -0
- package/dist/lib/browser/capability-7PCNSWBT.mjs.map +7 -0
- package/dist/lib/browser/capability-KP3PFEXD.mjs +31 -0
- package/dist/lib/browser/capability-KP3PFEXD.mjs.map +7 -0
- package/dist/lib/browser/chunk-6Y7PZV72.mjs +77 -0
- package/dist/lib/browser/chunk-6Y7PZV72.mjs.map +7 -0
- package/dist/lib/browser/chunk-7IQHKD4U.mjs +170 -0
- package/dist/lib/browser/chunk-7IQHKD4U.mjs.map +7 -0
- package/dist/lib/browser/chunk-BLQJSGL3.mjs +732 -0
- package/dist/lib/browser/chunk-BLQJSGL3.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-FMZN33N4.mjs +807 -0
- package/dist/lib/browser/chunk-FMZN33N4.mjs.map +7 -0
- package/dist/lib/browser/chunk-H4WPA7U7.mjs +77 -0
- package/dist/lib/browser/chunk-H4WPA7U7.mjs.map +7 -0
- package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -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-TCLLRCS3.mjs +145 -0
- package/dist/lib/browser/chunk-TCLLRCS3.mjs.map +7 -0
- package/dist/lib/browser/chunk-XYNO72GQ.mjs +746 -0
- package/dist/lib/browser/chunk-XYNO72GQ.mjs.map +7 -0
- package/dist/lib/browser/common/index.mjs +38 -0
- package/dist/lib/browser/core/activation-event.mjs +20 -0
- package/dist/lib/browser/core/capability.mjs +28 -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 +162 -128
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/invoker-capability-SZRSTHEH.mjs +32 -0
- package/dist/lib/browser/invoker-capability-SZRSTHEH.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/operation-resolver-6MP2MYOY.mjs +64 -0
- package/dist/lib/browser/operation-resolver-6MP2MYOY.mjs.map +7 -0
- package/dist/lib/browser/react/index.mjs +46 -0
- package/dist/lib/browser/react/index.mjs.map +7 -0
- package/dist/lib/browser/testing/index.mjs +68 -22
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/node-esm/app-graph-builder-LROHGJEM.mjs +150 -0
- package/dist/lib/node-esm/app-graph-builder-LROHGJEM.mjs.map +7 -0
- package/dist/lib/node-esm/capability-CFLQ2QQU.mjs +34 -0
- package/dist/lib/node-esm/capability-CFLQ2QQU.mjs.map +7 -0
- package/dist/lib/node-esm/capability-RCUNM2M7.mjs +32 -0
- package/dist/lib/node-esm/capability-RCUNM2M7.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-663A54LQ.mjs +171 -0
- package/dist/lib/node-esm/chunk-663A54LQ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-6WXBT3EC.mjs +747 -0
- package/dist/lib/node-esm/chunk-6WXBT3EC.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-GQEBIGKD.mjs +733 -0
- package/dist/lib/node-esm/chunk-GQEBIGKD.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-GT6OKM5I.mjs +146 -0
- package/dist/lib/node-esm/chunk-GT6OKM5I.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-STMXUEPO.mjs +78 -0
- package/dist/lib/node-esm/chunk-STMXUEPO.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-XR6NMKEP.mjs +78 -0
- package/dist/lib/node-esm/chunk-XR6NMKEP.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-XYQTBFPA.mjs +808 -0
- package/dist/lib/node-esm/chunk-XYQTBFPA.mjs.map +7 -0
- package/dist/lib/node-esm/common/index.mjs +39 -0
- package/dist/lib/node-esm/common/index.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 +162 -128
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/invoker-capability-PNMA5JOS.mjs +33 -0
- package/dist/lib/node-esm/invoker-capability-PNMA5JOS.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/operation-resolver-7YWDMTNU.mjs +65 -0
- package/dist/lib/node-esm/operation-resolver-7YWDMTNU.mjs.map +7 -0
- package/dist/lib/node-esm/react/index.mjs +47 -0
- package/dist/lib/node-esm/react/index.mjs.map +7 -0
- package/dist/lib/node-esm/testing/index.mjs +68 -22
- package/dist/lib/node-esm/testing/index.mjs.map +4 -4
- package/dist/types/src/cli.d.ts +39 -0
- package/dist/types/src/cli.d.ts.map +1 -0
- package/dist/types/src/common/activation-event.d.ts +66 -0
- package/dist/types/src/common/activation-event.d.ts.map +1 -0
- package/dist/types/src/common/capability.d.ts +265 -0
- package/dist/types/src/common/capability.d.ts.map +1 -0
- package/dist/types/src/common/collaboration.d.ts +23 -17
- package/dist/types/src/common/collaboration.d.ts.map +1 -1
- package/dist/types/src/common/graph.d.ts +2 -2
- package/dist/types/src/common/graph.d.ts.map +1 -1
- package/dist/types/src/common/index.d.ts +4 -3
- package/dist/types/src/common/index.d.ts.map +1 -1
- package/dist/types/src/common/operations.d.ts +380 -0
- package/dist/types/src/common/operations.d.ts.map +1 -0
- package/dist/types/src/common/plugin.d.ts +201 -0
- package/dist/types/src/common/plugin.d.ts.map +1 -0
- package/dist/types/src/common/surface.d.ts +48 -13
- package/dist/types/src/common/surface.d.ts.map +1 -1
- package/dist/types/src/common/translations.d.ts +9 -0
- 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 +5 -4
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/playground/debug/Debug.d.ts +4 -2
- package/dist/types/src/playground/debug/Debug.d.ts.map +1 -1
- package/dist/types/src/playground/debug/plugin.d.ts +2 -1
- package/dist/types/src/playground/debug/plugin.d.ts.map +1 -1
- package/dist/types/src/playground/generator/Main.d.ts +4 -2
- package/dist/types/src/playground/generator/Main.d.ts.map +1 -1
- package/dist/types/src/playground/generator/Toolbar.d.ts +4 -2
- package/dist/types/src/playground/generator/Toolbar.d.ts.map +1 -1
- package/dist/types/src/playground/generator/generator.d.ts +17 -5
- package/dist/types/src/playground/generator/generator.d.ts.map +1 -1
- package/dist/types/src/playground/generator/plugin.d.ts +2 -1
- package/dist/types/src/playground/generator/plugin.d.ts.map +1 -1
- package/dist/types/src/playground/layout/Layout.d.ts +4 -2
- package/dist/types/src/playground/layout/Layout.d.ts.map +1 -1
- package/dist/types/src/playground/layout/plugin.d.ts +2 -1
- package/dist/types/src/playground/layout/plugin.d.ts.map +1 -1
- package/dist/types/src/playground/logger/Toolbar.d.ts +4 -2
- package/dist/types/src/playground/logger/Toolbar.d.ts.map +1 -1
- package/dist/types/src/playground/logger/plugin.d.ts +2 -1
- package/dist/types/src/playground/logger/plugin.d.ts.map +1 -1
- package/dist/types/src/playground/logger/schema.d.ts +14 -0
- package/dist/types/src/playground/logger/schema.d.ts.map +1 -1
- package/dist/types/src/playground/playground.stories.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 +93 -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/plugin-settings/SettingsPlugin.d.ts +2 -1
- package/dist/types/src/plugin-settings/SettingsPlugin.d.ts.map +1 -1
- package/dist/types/src/plugin-settings/actions.d.ts +36 -0
- package/dist/types/src/plugin-settings/actions.d.ts.map +1 -1
- package/dist/types/src/plugin-settings/app-graph-builder.d.ts +4 -2
- package/dist/types/src/plugin-settings/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/plugin-settings/meta.d.ts +2 -2
- package/dist/types/src/plugin-settings/meta.d.ts.map +1 -1
- package/dist/types/src/plugin-settings/operation-resolver.d.ts +6 -0
- package/dist/types/src/plugin-settings/operation-resolver.d.ts.map +1 -0
- package/dist/types/src/react/App.d.ts +8 -0
- package/dist/types/src/react/App.d.ts.map +1 -0
- package/dist/types/src/react/App.stories.d.ts.map +1 -0
- package/dist/types/src/react/DefaultFallback.d.ts.map +1 -0
- package/dist/types/src/react/PluginManagerContext.stories.d.ts +13 -0
- package/dist/types/src/react/PluginManagerContext.stories.d.ts.map +1 -0
- package/dist/types/src/react/PluginManagerProvider.d.ts +2 -2
- package/dist/types/src/react/PluginManagerProvider.d.ts.map +1 -1
- package/dist/types/src/react/Surface.d.ts +8 -6
- package/dist/types/src/react/Surface.d.ts.map +1 -1
- package/dist/types/src/react/Surface.stories.d.ts +3 -6
- package/dist/types/src/react/Surface.stories.d.ts.map +1 -1
- package/dist/types/src/react/SurfaceInfo.d.ts +11 -0
- package/dist/types/src/react/SurfaceInfo.d.ts.map +1 -0
- package/dist/types/src/react/common.d.ts +13 -12
- package/dist/types/src/react/common.d.ts.map +1 -1
- package/dist/types/src/react/index.d.ts +3 -1
- package/dist/types/src/react/index.d.ts.map +1 -1
- package/dist/types/src/react/types.d.ts +12 -0
- package/dist/types/src/react/types.d.ts.map +1 -0
- package/dist/types/src/{components → react}/useApp.d.ts +7 -6
- package/dist/types/src/react/useApp.d.ts.map +1 -0
- package/dist/types/src/react/useCapabilities.d.ts +16 -3
- package/dist/types/src/react/useCapabilities.d.ts.map +1 -1
- package/dist/types/src/{components → react}/useLoading.d.ts +1 -2
- package/dist/types/src/react/useLoading.d.ts.map +1 -0
- package/dist/types/src/react/useOperationResolver.d.ts +19 -0
- package/dist/types/src/react/useOperationResolver.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/tsconfig.tsbuildinfo +1 -1
- package/moon.yml +6 -2
- package/package.json +101 -45
- package/src/cli.ts +107 -0
- package/src/common/activation-event.ts +99 -0
- package/src/common/capability.ts +343 -0
- package/src/common/collaboration.ts +23 -10
- package/src/common/graph.ts +2 -2
- package/src/common/index.ts +4 -3
- package/src/common/operations.ts +412 -0
- package/src/common/plugin.ts +364 -0
- package/src/common/surface.ts +56 -19
- package/src/common/translations.ts +20 -0
- 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 +5 -4
- package/src/playground/debug/Debug.tsx +26 -16
- package/src/playground/debug/plugin.ts +8 -8
- package/src/playground/generator/Main.tsx +20 -11
- package/src/playground/generator/Toolbar.tsx +26 -16
- package/src/playground/generator/generator.ts +27 -27
- package/src/playground/generator/plugin.ts +11 -12
- package/src/playground/layout/Layout.tsx +11 -7
- package/src/playground/layout/plugin.ts +8 -8
- package/src/playground/logger/Toolbar.tsx +19 -16
- package/src/playground/logger/plugin.ts +24 -23
- package/src/playground/logger/schema.ts +10 -0
- package/src/playground/playground.stories.tsx +14 -6
- 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 +132 -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/{components → plugin-runtime}/index.ts +1 -1
- package/src/plugin-runtime/meta.ts +11 -0
- package/src/plugin-settings/SettingsPlugin.ts +11 -26
- package/src/plugin-settings/actions.ts +39 -0
- package/src/plugin-settings/app-graph-builder.ts +122 -142
- package/src/plugin-settings/meta.ts +2 -2
- package/src/plugin-settings/operation-resolver.ts +55 -0
- package/src/plugin-settings/translations.ts +1 -1
- package/src/react/App.stories.tsx +63 -0
- package/src/{components → react}/App.tsx +11 -10
- package/src/{components → react}/DefaultFallback.tsx +1 -1
- package/src/react/PluginManagerContext.stories.tsx +184 -0
- package/src/react/PluginManagerProvider.ts +2 -2
- package/src/react/Surface.stories.tsx +91 -51
- package/src/react/Surface.tsx +226 -45
- package/src/react/SurfaceInfo.tsx +107 -0
- package/src/react/common.ts +29 -5
- package/src/react/index.ts +5 -1
- package/src/react/types.ts +27 -0
- package/src/react/useApp.tsx +209 -0
- package/src/react/useCapabilities.ts +37 -5
- package/src/{components → react}/useLoading.tsx +4 -6
- package/src/react/useOperationResolver.ts +40 -0
- package/src/testing/index.ts +1 -0
- package/src/testing/service.ts +52 -0
- package/src/testing/withPluginManager.stories.tsx +5 -5
- package/src/testing/withPluginManager.tsx +21 -23
- package/tsconfig.json +25 -7
- package/.swc/plugins/linux_x86_64_19.0.0/fce1bdb8e20a094e4af08bad09cc81497ed0e2e7c51223b07d371063cca18429.wasmer-v7 +0 -0
- package/dist/lib/browser/app-graph-builder-PSA3RESL.mjs +0 -138
- package/dist/lib/browser/app-graph-builder-PSA3RESL.mjs.map +0 -7
- package/dist/lib/browser/chunk-2VZ4RF4A.mjs +0 -1608
- package/dist/lib/browser/chunk-2VZ4RF4A.mjs.map +0 -7
- package/dist/lib/browser/chunk-CPVYIS24.mjs +0 -451
- package/dist/lib/browser/chunk-CPVYIS24.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/intent-dispatcher-BND6IF4U.mjs +0 -11
- package/dist/lib/browser/intent-resolver-27FJAJDE.mjs +0 -39
- package/dist/lib/browser/intent-resolver-27FJAJDE.mjs.map +0 -7
- package/dist/lib/browser/store-F545UOIR.mjs +0 -30
- package/dist/lib/browser/store-F545UOIR.mjs.map +0 -7
- package/dist/lib/browser/worker.mjs +0 -77
- package/dist/lib/node-esm/app-graph-builder-VJGZ6KH7.mjs +0 -139
- package/dist/lib/node-esm/app-graph-builder-VJGZ6KH7.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-3RRWO5TD.mjs +0 -1610
- package/dist/lib/node-esm/chunk-3RRWO5TD.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-MN37WUJ2.mjs +0 -452
- package/dist/lib/node-esm/chunk-MN37WUJ2.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-254AZ6EE.mjs +0 -12
- package/dist/lib/node-esm/intent-resolver-NPMOPNFL.mjs +0 -40
- package/dist/lib/node-esm/intent-resolver-NPMOPNFL.mjs.map +0 -7
- package/dist/lib/node-esm/store-CINC4R4L.mjs +0 -31
- package/dist/lib/node-esm/store-CINC4R4L.mjs.map +0 -7
- package/dist/lib/node-esm/worker.mjs +0 -78
- package/dist/types/src/common/capabilities.d.ts +0 -201
- package/dist/types/src/common/capabilities.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/layout.d.ts +0 -279
- package/dist/types/src/common/layout.d.ts.map +0 -1
- package/dist/types/src/components/App.d.ts +0 -10
- package/dist/types/src/components/App.d.ts.map +0 -1
- package/dist/types/src/components/App.stories.d.ts.map +0 -1
- package/dist/types/src/components/DefaultFallback.d.ts.map +0 -1
- package/dist/types/src/components/index.d.ts +0 -2
- package/dist/types/src/components/index.d.ts.map +0 -1
- package/dist/types/src/components/useApp.d.ts.map +0 -1
- package/dist/types/src/components/useLoading.d.ts.map +0 -1
- package/dist/types/src/core/capabilities.d.ts +0 -117
- package/dist/types/src/core/capabilities.d.ts.map +0 -1
- package/dist/types/src/core/capabilities.test.d.ts +0 -2
- package/dist/types/src/core/capabilities.test.d.ts.map +0 -1
- package/dist/types/src/core/events.d.ts.map +0 -1
- package/dist/types/src/core/manager.d.ts +0 -126
- package/dist/types/src/core/manager.d.ts.map +0 -1
- package/dist/types/src/core/manager.test.d.ts +0 -2
- package/dist/types/src/core/manager.test.d.ts.map +0 -1
- package/dist/types/src/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/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/store.d.ts +0 -5
- package/dist/types/src/plugin-settings/store.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/useIntentResolver.d.ts +0 -3
- package/dist/types/src/react/useIntentResolver.d.ts.map +0 -1
- package/dist/types/src/worker.d.ts +0 -4
- package/dist/types/src/worker.d.ts.map +0 -1
- package/src/common/capabilities.ts +0 -217
- package/src/common/events.ts +0 -79
- package/src/common/layout.ts +0 -277
- package/src/components/App.stories.tsx +0 -33
- package/src/components/useApp.tsx +0 -164
- 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/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 -337
- package/src/plugin-intent/intent.ts +0 -154
- package/src/plugin-intent/meta.ts +0 -10
- package/src/plugin-settings/intent-resolver.ts +0 -35
- package/src/plugin-settings/store.ts +0 -33
- package/src/react/IntentContext.tsx +0 -35
- package/src/react/useIntentResolver.ts +0 -22
- package/src/worker.ts +0 -11
- /package/dist/lib/browser/{intent-dispatcher-BND6IF4U.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
- /package/dist/lib/browser/{worker.mjs.map → common/index.mjs.map} +0 -0
- /package/dist/lib/{node-esm/intent-dispatcher-254AZ6EE.mjs.map → browser/core/activation-event.mjs.map} +0 -0
- /package/dist/lib/{node-esm/worker.mjs.map → browser/core/capability.mjs.map} +0 -0
- /package/dist/types/src/{components → react}/App.stories.d.ts +0 -0
- /package/dist/types/src/{components → react}/DefaultFallback.d.ts +0 -0
|
@@ -3,94 +3,134 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
6
|
-
import React, { useCallback, useState } from 'react';
|
|
6
|
+
import React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';
|
|
7
7
|
|
|
8
8
|
import { faker } from '@dxos/random';
|
|
9
|
-
import {
|
|
9
|
+
import { List, ListItem, Toolbar } from '@dxos/react-ui';
|
|
10
10
|
import { withTheme } from '@dxos/react-ui/testing';
|
|
11
|
+
import { type ColorStyles, getHashStyles, mx } from '@dxos/ui-theme';
|
|
11
12
|
|
|
12
|
-
import
|
|
13
|
-
import {
|
|
14
|
-
import { setupPluginManager } from '../testing';
|
|
13
|
+
import * as Common from '../common';
|
|
14
|
+
import { withPluginManager } from '../testing';
|
|
15
15
|
|
|
16
|
-
import {
|
|
16
|
+
import { usePluginManager } from './PluginManagerProvider';
|
|
17
17
|
import { Surface, useSurfaces } from './Surface';
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const lightness = faker.number.int({ min: 40, max: 70 });
|
|
23
|
-
return `hsl(${hue}, ${saturation}%, ${lightness}%)`;
|
|
19
|
+
type TestComponentProps = {
|
|
20
|
+
id: string;
|
|
21
|
+
styles: ColorStyles;
|
|
24
22
|
};
|
|
25
23
|
|
|
26
|
-
const
|
|
24
|
+
const TestComponent = forwardRef<HTMLDivElement, TestComponentProps>(({ styles, id }, forwardedRef) => {
|
|
25
|
+
return (
|
|
26
|
+
<div
|
|
27
|
+
className={mx('flex justify-center items-center border rounded', styles.surface, styles.border)}
|
|
28
|
+
ref={forwardedRef}
|
|
29
|
+
>
|
|
30
|
+
<span className={mx('dx-tag font-mono text-lg', styles.text)}>{id}</span>
|
|
31
|
+
</div>
|
|
32
|
+
);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
const DefaultStory = () => {
|
|
27
36
|
const manager = usePluginManager();
|
|
28
37
|
const surfaces = useSurfaces();
|
|
29
|
-
const [
|
|
38
|
+
const [selected, setSelected] = useState<string | undefined>();
|
|
30
39
|
|
|
31
40
|
const handleAdd = useCallback(() => {
|
|
32
|
-
const id = `test-${faker.number.int({ min: 0, max:
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
manager.context.contributeCapability({
|
|
41
|
+
const id = `test-${faker.number.int({ min: 0, max: 1_000 })}`;
|
|
42
|
+
const styles = getHashStyles(id);
|
|
43
|
+
manager.capabilities.contribute({
|
|
36
44
|
module: 'test',
|
|
37
|
-
interface:
|
|
38
|
-
implementation: createSurface({
|
|
45
|
+
interface: Common.Capability.ReactSurface,
|
|
46
|
+
implementation: Common.createSurface({
|
|
39
47
|
id,
|
|
40
|
-
role:
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
{id}
|
|
44
|
-
</div>
|
|
45
|
-
),
|
|
48
|
+
role: 'item',
|
|
49
|
+
filter: (data): data is any => (data as any)?.id === id,
|
|
50
|
+
component: ({ ref }) => <TestComponent id={id} styles={styles} ref={ref} />,
|
|
46
51
|
}),
|
|
47
52
|
});
|
|
48
53
|
|
|
49
|
-
|
|
54
|
+
setSelected(id);
|
|
50
55
|
}, [manager]);
|
|
51
56
|
|
|
52
|
-
const
|
|
53
|
-
|
|
57
|
+
const handleSelect = useCallback(() => {
|
|
58
|
+
setSelected(faker.helpers.arrayElement(surfaces)?.id);
|
|
54
59
|
}, [surfaces]);
|
|
55
60
|
|
|
61
|
+
const handleError = useCallback(() => {
|
|
62
|
+
manager.capabilities.contribute({
|
|
63
|
+
module: 'error',
|
|
64
|
+
interface: Common.Capability.ReactSurface,
|
|
65
|
+
implementation: Common.createSurface({
|
|
66
|
+
id: 'error',
|
|
67
|
+
role: 'item',
|
|
68
|
+
filter: (data): data is any => (data as any)?.id === 'error',
|
|
69
|
+
component: () => {
|
|
70
|
+
const [count, setCount] = useState(3);
|
|
71
|
+
useEffect(() => {
|
|
72
|
+
const interval = setInterval(() => {
|
|
73
|
+
setCount((count) => {
|
|
74
|
+
if (count <= 1) {
|
|
75
|
+
clearInterval(interval);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return count - 1;
|
|
79
|
+
});
|
|
80
|
+
}, 1_000);
|
|
81
|
+
return () => clearInterval(interval);
|
|
82
|
+
}, []);
|
|
83
|
+
|
|
84
|
+
if (count <= 0) {
|
|
85
|
+
throw new Error('BANG!');
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return (
|
|
89
|
+
<div className='flex justify-center items-center border border-roseFill rounded'>
|
|
90
|
+
<span className='font-mono'>Ticking... {count}</span>
|
|
91
|
+
</div>
|
|
92
|
+
);
|
|
93
|
+
},
|
|
94
|
+
}),
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
setSelected('error');
|
|
98
|
+
}, [manager]);
|
|
99
|
+
|
|
100
|
+
const ref = useRef<HTMLElement>(null);
|
|
101
|
+
useEffect(() => {
|
|
102
|
+
console.log(ref.current);
|
|
103
|
+
}, [ref]);
|
|
104
|
+
|
|
56
105
|
return (
|
|
57
|
-
<div className='flex flex-col
|
|
58
|
-
<
|
|
59
|
-
<Button onClick={handleAdd}>Add</Button>
|
|
60
|
-
<Button onClick={
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
106
|
+
<div className='flex flex-col bs-full overflow-hidden'>
|
|
107
|
+
<Toolbar.Root>
|
|
108
|
+
<Toolbar.Button onClick={handleAdd}>Add</Toolbar.Button>
|
|
109
|
+
<Toolbar.Button onClick={handleSelect}>Pick</Toolbar.Button>
|
|
110
|
+
<Toolbar.Button onClick={handleError}>Error</Toolbar.Button>
|
|
111
|
+
</Toolbar.Root>
|
|
112
|
+
<div className='grid grid-cols-2 bs-full gap-4 overflow-hidden'>
|
|
113
|
+
<Surface role='item' data={selected ? { id: selected } : undefined} limit={1} ref={ref} />
|
|
114
|
+
<div className='overflow-y-auto bs-full'>
|
|
115
|
+
<List>
|
|
65
116
|
{surfaces.map((surface) => (
|
|
66
117
|
<ListItem.Root key={surface.id} id={surface.id}>
|
|
67
|
-
<ListItem.Heading classNames='
|
|
118
|
+
<ListItem.Heading classNames='flex items-center'>{surface.id}</ListItem.Heading>
|
|
68
119
|
</ListItem.Root>
|
|
69
120
|
))}
|
|
70
121
|
</List>
|
|
71
122
|
</div>
|
|
72
|
-
<div className='flex-1'>
|
|
73
|
-
<Surface role={picked} limit={1} />
|
|
74
|
-
</div>
|
|
75
123
|
</div>
|
|
76
124
|
</div>
|
|
77
125
|
);
|
|
78
126
|
};
|
|
79
127
|
|
|
80
|
-
const DefaultStory = (props: { manager: PluginManager }) => {
|
|
81
|
-
return (
|
|
82
|
-
<PluginManagerProvider value={props.manager}>
|
|
83
|
-
<Component />
|
|
84
|
-
</PluginManagerProvider>
|
|
85
|
-
);
|
|
86
|
-
};
|
|
87
|
-
|
|
88
128
|
const meta = {
|
|
89
129
|
title: 'sdk/app-framework/Surface',
|
|
90
130
|
render: DefaultStory,
|
|
91
|
-
decorators: [withTheme],
|
|
92
|
-
|
|
93
|
-
|
|
131
|
+
decorators: [withTheme, withPluginManager({ capabilities: [] })],
|
|
132
|
+
parameters: {
|
|
133
|
+
layout: 'fullscreen',
|
|
94
134
|
},
|
|
95
135
|
} satisfies Meta<typeof DefaultStory>;
|
|
96
136
|
|
package/src/react/Surface.tsx
CHANGED
|
@@ -3,35 +3,220 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import React, {
|
|
6
|
+
type Context,
|
|
6
7
|
Fragment,
|
|
7
8
|
type NamedExoticComponent,
|
|
8
9
|
type RefAttributes,
|
|
9
10
|
Suspense,
|
|
11
|
+
createContext,
|
|
10
12
|
forwardRef,
|
|
11
13
|
memo,
|
|
14
|
+
useContext,
|
|
15
|
+
useEffect,
|
|
12
16
|
useMemo,
|
|
17
|
+
useRef,
|
|
13
18
|
} from 'react';
|
|
14
19
|
|
|
20
|
+
import { raise } from '@dxos/debug';
|
|
21
|
+
import { log } from '@dxos/log';
|
|
15
22
|
import { useDefaultValue } from '@dxos/react-hooks';
|
|
16
23
|
import { byPosition } from '@dxos/util';
|
|
17
24
|
|
|
18
|
-
import
|
|
19
|
-
import { type
|
|
25
|
+
import * as Common from '../common';
|
|
26
|
+
import { type CapabilityManager } from '../core';
|
|
20
27
|
|
|
21
28
|
import { ErrorBoundary } from './ErrorBoundary';
|
|
29
|
+
import { SurfaceInfo } from './SurfaceInfo';
|
|
22
30
|
import { useCapabilities } from './useCapabilities';
|
|
23
31
|
|
|
24
32
|
const DEFAULT_PLACEHOLDER = <Fragment />;
|
|
25
33
|
|
|
34
|
+
const DEBUG = import.meta.env.VITE_DEBUG;
|
|
35
|
+
|
|
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
|
+
|
|
26
41
|
/**
|
|
27
|
-
*
|
|
42
|
+
* Wrapper component for rendering Web Component surfaces.
|
|
43
|
+
* Handles creation, prop setting, and cleanup of Web Components.
|
|
28
44
|
*/
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
45
|
+
const WebComponentWrapper = memo(
|
|
46
|
+
forwardRef<HTMLElement, Common.SurfaceProps & { definition: Common.WebComponentSurfaceDefinition }>(
|
|
47
|
+
({ id, role, data, limit, definition, ...rest }, forwardedRef) => {
|
|
48
|
+
const containerRef = useRef<HTMLDivElement>(null);
|
|
49
|
+
const elementRef = useRef<HTMLElement | null>(null);
|
|
50
|
+
const propsRef = useRef({ id, role, data, limit, ...rest });
|
|
51
|
+
|
|
52
|
+
// Update props ref on every render
|
|
53
|
+
propsRef.current = { id, role, data, limit, ...rest };
|
|
54
|
+
|
|
55
|
+
// Create element only once
|
|
56
|
+
useEffect(() => {
|
|
57
|
+
if (!containerRef.current || elementRef.current) return;
|
|
58
|
+
|
|
59
|
+
// Create the Web Component
|
|
60
|
+
const element = document.createElement(definition.tagName);
|
|
61
|
+
elementRef.current = element;
|
|
62
|
+
|
|
63
|
+
// Set initial properties on the Web Component
|
|
64
|
+
Object.assign(element, propsRef.current);
|
|
65
|
+
|
|
66
|
+
// Append to container
|
|
67
|
+
containerRef.current.appendChild(element);
|
|
68
|
+
|
|
69
|
+
// Setup ref forwarding if provided
|
|
70
|
+
if (typeof forwardedRef === 'function') {
|
|
71
|
+
forwardedRef(element);
|
|
72
|
+
} else if (forwardedRef) {
|
|
73
|
+
forwardedRef.current = element;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Cleanup on unmount to prevent memory leaks
|
|
77
|
+
return () => {
|
|
78
|
+
if (elementRef.current && containerRef.current?.contains(elementRef.current)) {
|
|
79
|
+
containerRef.current.removeChild(elementRef.current);
|
|
80
|
+
}
|
|
81
|
+
if (typeof forwardedRef === 'function') {
|
|
82
|
+
forwardedRef(null);
|
|
83
|
+
} else if (forwardedRef) {
|
|
84
|
+
forwardedRef.current = null;
|
|
85
|
+
}
|
|
86
|
+
elementRef.current = null;
|
|
87
|
+
};
|
|
88
|
+
}, [definition.tagName, forwardedRef]);
|
|
89
|
+
|
|
90
|
+
// Update props on existing element without recreating it
|
|
91
|
+
// This runs on every render to ensure all props (including those in `rest`) are kept up to date
|
|
92
|
+
useEffect(() => {
|
|
93
|
+
const element = elementRef.current;
|
|
94
|
+
if (!element) return;
|
|
95
|
+
|
|
96
|
+
// Update properties on the existing Web Component
|
|
97
|
+
Object.assign(element, propsRef.current);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
return <div ref={containerRef} />;
|
|
101
|
+
},
|
|
102
|
+
),
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
WebComponentWrapper.displayName = 'WebComponentWrapper';
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Wrapper component that provides context for a surface.
|
|
109
|
+
*/
|
|
110
|
+
const SurfaceContextProvider = memo(
|
|
111
|
+
forwardRef<HTMLElement, Common.SurfaceProps & { definition: Common.SurfaceDefinition }>(
|
|
112
|
+
({ id, role, data, limit, fallback = DefaultFallback, definition, ...rest }, forwardedRef) => {
|
|
113
|
+
const contextValue = useMemo(() => ({ id, role, data }), [id, role, data]);
|
|
114
|
+
|
|
115
|
+
// Handle Web Component surfaces
|
|
116
|
+
if (definition.kind === 'web-component') {
|
|
117
|
+
return (
|
|
118
|
+
<ErrorBoundary data={data} fallback={fallback}>
|
|
119
|
+
<SurfaceContext.Provider value={contextValue}>
|
|
120
|
+
<WebComponentWrapper
|
|
121
|
+
id={id}
|
|
122
|
+
role={role}
|
|
123
|
+
data={data}
|
|
124
|
+
limit={limit}
|
|
125
|
+
definition={definition}
|
|
126
|
+
ref={forwardedRef}
|
|
127
|
+
{...rest}
|
|
128
|
+
/>
|
|
129
|
+
</SurfaceContext.Provider>
|
|
130
|
+
</ErrorBoundary>
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Handle React component surfaces
|
|
135
|
+
const Component = definition.component;
|
|
136
|
+
|
|
137
|
+
// TODO(burdon): Remove from production build?
|
|
138
|
+
const debug = DEBUG || '__DX_DEBUG__' in window;
|
|
139
|
+
if (debug) {
|
|
140
|
+
return (
|
|
141
|
+
<ErrorBoundary data={data} fallback={fallback}>
|
|
142
|
+
<div role='none' className='contents' data-id={id} data-role={role}>
|
|
143
|
+
<SurfaceContext.Provider value={contextValue}>
|
|
144
|
+
<SurfaceInfo ref={forwardedRef}>
|
|
145
|
+
<Component id={id} role={role} data={data} limit={limit} {...rest} />
|
|
146
|
+
</SurfaceInfo>
|
|
147
|
+
</SurfaceContext.Provider>
|
|
148
|
+
</div>
|
|
149
|
+
</ErrorBoundary>
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return (
|
|
154
|
+
<ErrorBoundary data={data} fallback={fallback}>
|
|
155
|
+
<div role='none' className='contents' data-id={id} data-role={role}>
|
|
156
|
+
<SurfaceContext.Provider value={contextValue}>
|
|
157
|
+
<Component id={id} role={role} data={data} limit={limit} {...rest} ref={forwardedRef} />
|
|
158
|
+
</SurfaceContext.Provider>
|
|
159
|
+
</div>
|
|
160
|
+
</ErrorBoundary>
|
|
161
|
+
);
|
|
162
|
+
},
|
|
163
|
+
),
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
SurfaceContextProvider.displayName = 'SurfaceContextProvider';
|
|
167
|
+
|
|
168
|
+
export const useSurface = (): SurfaceContext => {
|
|
169
|
+
const context = useContext(SurfaceContext) ?? raise(new Error('Missing SurfaceContext'));
|
|
170
|
+
return context;
|
|
32
171
|
};
|
|
33
172
|
|
|
34
|
-
|
|
173
|
+
/**
|
|
174
|
+
* A surface is a named region of the screen that can be populated by plugins.
|
|
175
|
+
*/
|
|
176
|
+
export const Surface: NamedExoticComponent<Common.SurfaceProps & RefAttributes<HTMLElement>> = memo(
|
|
177
|
+
forwardRef(({ id: _id, role, data: dataProp, limit, placeholder = DEFAULT_PLACEHOLDER, ...rest }, forwardedRef) => {
|
|
178
|
+
const data = useDefaultValue(dataProp, () => ({}));
|
|
179
|
+
|
|
180
|
+
// TODO(wittjosiah): This will make all surfaces depend on a single signal.
|
|
181
|
+
// This isn't ideal because it means that any change to the data will cause all surfaces to re-render.
|
|
182
|
+
// This effectively means that plugin modules which contribute surfaces need to all be activated at startup.
|
|
183
|
+
// This should be fine for now because it's how it worked prior to capabilities api anyway.
|
|
184
|
+
// In the future, it would be nice to be able to bucket the surface contributions by role.
|
|
185
|
+
const surfaces = useSurfaces();
|
|
186
|
+
|
|
187
|
+
// NOTE: Memoizing the candidates makes the surface not re-render based on reactivity within data.
|
|
188
|
+
const definitions = findCandidates(surfaces, { role, data });
|
|
189
|
+
const candidates = limit ? definitions.slice(0, limit) : definitions;
|
|
190
|
+
if (DEBUG && candidates.length === 0) {
|
|
191
|
+
log.warn('no candidates for surface', { role, data });
|
|
192
|
+
return null;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
return (
|
|
196
|
+
<Suspense fallback={placeholder}>
|
|
197
|
+
{candidates.map((definition) => (
|
|
198
|
+
<SurfaceContextProvider
|
|
199
|
+
key={definition.id}
|
|
200
|
+
id={definition.id}
|
|
201
|
+
role={role}
|
|
202
|
+
data={data}
|
|
203
|
+
limit={limit}
|
|
204
|
+
definition={definition}
|
|
205
|
+
ref={forwardedRef}
|
|
206
|
+
{...rest}
|
|
207
|
+
/>
|
|
208
|
+
))}
|
|
209
|
+
</Suspense>
|
|
210
|
+
);
|
|
211
|
+
}),
|
|
212
|
+
);
|
|
213
|
+
|
|
214
|
+
Surface.displayName = 'Surface';
|
|
215
|
+
|
|
216
|
+
const findCandidates = (
|
|
217
|
+
surfaces: Common.SurfaceDefinition[],
|
|
218
|
+
{ role, data }: Pick<Common.SurfaceProps, 'role' | 'data'>,
|
|
219
|
+
) => {
|
|
35
220
|
return Object.values(surfaces)
|
|
36
221
|
.filter((definition) =>
|
|
37
222
|
Array.isArray(definition.role) ? definition.role.includes(role) : definition.role === role,
|
|
@@ -40,47 +225,43 @@ const findCandidates = (surfaces: SurfaceDefinition[], { role, data }: Pick<Surf
|
|
|
40
225
|
.toSorted(byPosition);
|
|
41
226
|
};
|
|
42
227
|
|
|
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
|
+
|
|
43
249
|
/**
|
|
44
|
-
* @
|
|
250
|
+
* @internal
|
|
45
251
|
*/
|
|
46
|
-
export const
|
|
47
|
-
const surfaces =
|
|
48
|
-
|
|
49
|
-
return candidates.length > 0;
|
|
252
|
+
export const useSurfaces = () => {
|
|
253
|
+
const surfaces = useCapabilities(Common.Capability.ReactSurface);
|
|
254
|
+
return useMemo(() => surfaces.flat(), [surfaces]);
|
|
50
255
|
};
|
|
51
256
|
|
|
52
257
|
/**
|
|
53
|
-
*
|
|
258
|
+
* @returns `true` if there is a contributed surface which matches the specified role & data, `false` otherwise.
|
|
54
259
|
*/
|
|
55
|
-
export const
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const surfaces = useSurfaces();
|
|
64
|
-
const data = useDefaultValue(_data, () => ({}));
|
|
65
|
-
|
|
66
|
-
// NOTE: Memoizing the candidates makes the surface not re-render based on reactivity within data.
|
|
67
|
-
const definitions = findCandidates(surfaces, { role, data });
|
|
68
|
-
const candidates = limit ? definitions.slice(0, limit) : definitions;
|
|
69
|
-
const nodes = candidates.map(({ component: Component, id }) => (
|
|
70
|
-
<Component ref={forwardedRef} key={id} id={id} role={role} data={data} limit={limit} {...rest} />
|
|
71
|
-
));
|
|
72
|
-
|
|
73
|
-
const suspense = <Suspense fallback={placeholder}>{nodes}</Suspense>;
|
|
74
|
-
|
|
75
|
-
return fallback ? (
|
|
76
|
-
<ErrorBoundary data={data} fallback={fallback}>
|
|
77
|
-
{suspense}
|
|
78
|
-
</ErrorBoundary>
|
|
79
|
-
) : (
|
|
80
|
-
suspense
|
|
81
|
-
);
|
|
82
|
-
},
|
|
83
|
-
),
|
|
84
|
-
);
|
|
85
|
-
|
|
86
|
-
Surface.displayName = 'Surface';
|
|
260
|
+
export const isSurfaceAvailable = (
|
|
261
|
+
capabilityManager: CapabilityManager.CapabilityManager,
|
|
262
|
+
{ role, data }: Pick<Common.SurfaceProps, 'role' | 'data'>,
|
|
263
|
+
) => {
|
|
264
|
+
const surfaces = capabilityManager.getAll(Common.Capability.ReactSurface);
|
|
265
|
+
const candidates = findCandidates(surfaces.flat(), { role, data });
|
|
266
|
+
return candidates.length > 0;
|
|
267
|
+
};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import React, {
|
|
6
|
+
type ReactElement,
|
|
7
|
+
type Ref,
|
|
8
|
+
cloneElement,
|
|
9
|
+
forwardRef,
|
|
10
|
+
useCallback,
|
|
11
|
+
useLayoutEffect,
|
|
12
|
+
useState,
|
|
13
|
+
} from 'react';
|
|
14
|
+
import { createPortal } from 'react-dom';
|
|
15
|
+
|
|
16
|
+
import { addEventListener, combine } from '@dxos/async';
|
|
17
|
+
import { useMergeRefs } from '@dxos/react-hooks';
|
|
18
|
+
|
|
19
|
+
import { useSurface } from './Surface';
|
|
20
|
+
|
|
21
|
+
export type SurfaceInfoProps = {
|
|
22
|
+
children: ReactElement<{ ref?: Ref<HTMLElement> }>;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Debug wrapper for surfaces.
|
|
27
|
+
*/
|
|
28
|
+
export const SurfaceInfo = forwardRef<HTMLElement, SurfaceInfoProps>(({ children }, forwardedRef) => {
|
|
29
|
+
const [rect, setRect] = useState<DOMRect | null>(null);
|
|
30
|
+
const [expand, setExpand] = useState(false);
|
|
31
|
+
const info = useSurface();
|
|
32
|
+
|
|
33
|
+
const [root, setRoot] = useState<HTMLElement | null>(null);
|
|
34
|
+
const measureRef = useCallback((node: HTMLElement | null) => setRoot(node), []);
|
|
35
|
+
const mergedRef = useMergeRefs([measureRef, forwardedRef]);
|
|
36
|
+
const childWithRef = cloneElement(children, { ref: mergedRef });
|
|
37
|
+
|
|
38
|
+
useLayoutEffect(() => {
|
|
39
|
+
if (!root) {
|
|
40
|
+
setRect(null);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const measure = () => {
|
|
45
|
+
setRect(root.getBoundingClientRect());
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const observer = new ResizeObserver(measure);
|
|
49
|
+
observer.observe(root);
|
|
50
|
+
measure();
|
|
51
|
+
|
|
52
|
+
return combine(
|
|
53
|
+
addEventListener(window, 'scroll', measure, true),
|
|
54
|
+
addEventListener(window, 'resize', measure),
|
|
55
|
+
() => {
|
|
56
|
+
observer.disconnect();
|
|
57
|
+
},
|
|
58
|
+
);
|
|
59
|
+
}, [root]);
|
|
60
|
+
|
|
61
|
+
const padding = 0;
|
|
62
|
+
return (
|
|
63
|
+
<>
|
|
64
|
+
{childWithRef}
|
|
65
|
+
{rect &&
|
|
66
|
+
createPortal(
|
|
67
|
+
<div
|
|
68
|
+
role='none'
|
|
69
|
+
className='z-[100] fixed flex flex-col-reverse scrollbar-none overflow-auto pointer-events-none'
|
|
70
|
+
style={{
|
|
71
|
+
top: rect.top + padding,
|
|
72
|
+
left: rect.left + padding,
|
|
73
|
+
width: rect.width - padding * 2,
|
|
74
|
+
height: rect.height - padding * 2,
|
|
75
|
+
}}
|
|
76
|
+
>
|
|
77
|
+
{expand ? (
|
|
78
|
+
<div
|
|
79
|
+
className='absolute inset-0 bg-deckSurface border border-green-500 cursor-pointer pointer-events-auto overflow-auto'
|
|
80
|
+
onPointerDown={(ev) => ev.stopPropagation()}
|
|
81
|
+
onClick={(ev) => {
|
|
82
|
+
ev.stopPropagation();
|
|
83
|
+
setExpand(false);
|
|
84
|
+
}}
|
|
85
|
+
>
|
|
86
|
+
<pre className='p-2 text-xs text-description font-mono'>{JSON.stringify({ info }, null, 2)}</pre>
|
|
87
|
+
</div>
|
|
88
|
+
) : (
|
|
89
|
+
<span
|
|
90
|
+
className='absolute right-1 bottom-0 flex items-center p-1 text-green-500 opacity-80 hover:opacity-100 text-xl cursor-pointer pointer-events-auto'
|
|
91
|
+
title={info.id}
|
|
92
|
+
onPointerDown={(ev) => ev.stopPropagation()}
|
|
93
|
+
onClick={(ev) => {
|
|
94
|
+
ev.stopPropagation();
|
|
95
|
+
setExpand(true);
|
|
96
|
+
}}
|
|
97
|
+
>
|
|
98
|
+
ⓘ
|
|
99
|
+
</span>
|
|
100
|
+
)}
|
|
101
|
+
</div>,
|
|
102
|
+
// TODO(burdon): Create well-known element to gather all debug portals.
|
|
103
|
+
document.body,
|
|
104
|
+
)}
|
|
105
|
+
</>
|
|
106
|
+
);
|
|
107
|
+
});
|
package/src/react/common.ts
CHANGED
|
@@ -2,12 +2,36 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { type Atom, RegistryContext, useAtomValue } from '@effect-atom/atom-react';
|
|
6
|
+
import { useCallback, useContext } from 'react';
|
|
6
7
|
|
|
7
|
-
import
|
|
8
|
+
import * as Common from '../common';
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
import { useAtomCapability, useCapability } from './useCapabilities';
|
|
10
11
|
|
|
11
|
-
export const
|
|
12
|
+
export const useOperationInvoker = (): Common.Capability.OperationInvoker =>
|
|
13
|
+
useCapability(Common.Capability.OperationInvoker);
|
|
12
14
|
|
|
13
|
-
export const
|
|
15
|
+
export const useAppGraph = (): Common.Capability.AppGraph => useCapability(Common.Capability.AppGraph);
|
|
16
|
+
|
|
17
|
+
export const useLayout = (): Common.Capability.Layout => useAtomCapability(Common.Capability.Layout);
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Hook to read and update a settings atom.
|
|
21
|
+
* Returns the current value and an update function.
|
|
22
|
+
*/
|
|
23
|
+
export const useSettingsState = <T>(
|
|
24
|
+
atom: Atom.Writable<T>,
|
|
25
|
+
): { settings: T; updateSettings: (fn: (current: T) => T) => void } => {
|
|
26
|
+
const registry = useContext(RegistryContext);
|
|
27
|
+
const settings = useAtomValue(atom);
|
|
28
|
+
|
|
29
|
+
const updateSettings = useCallback(
|
|
30
|
+
(fn: (current: T) => T) => {
|
|
31
|
+
registry.set(atom, fn(registry.get(atom)));
|
|
32
|
+
},
|
|
33
|
+
[registry, atom],
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
return { settings, updateSettings };
|
|
37
|
+
};
|
package/src/react/index.ts
CHANGED
|
@@ -3,8 +3,12 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
export * from './common';
|
|
6
|
+
export * from './types';
|
|
7
|
+
|
|
6
8
|
export * from './ErrorBoundary';
|
|
7
9
|
export * from './PluginManagerProvider';
|
|
8
10
|
export * from './Surface';
|
|
11
|
+
|
|
12
|
+
export * from './useApp';
|
|
9
13
|
export * from './useCapabilities';
|
|
10
|
-
export * from './
|
|
14
|
+
export * from './useOperationResolver';
|