@dxos/app-framework 0.8.4-main.bc674ce → 0.8.4-main.bcb3aa67d6
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-4NSF2SOO.mjs} +16 -11
- package/dist/lib/browser/capability-4NSF2SOO.mjs.map +7 -0
- package/dist/lib/browser/capability-EB3UKSKA.mjs +35 -0
- package/dist/lib/browser/capability-EB3UKSKA.mjs.map +7 -0
- package/dist/lib/browser/{chunk-FMZN33N4.mjs → chunk-27FZETIA.mjs} +324 -181
- package/dist/lib/browser/chunk-27FZETIA.mjs.map +7 -0
- package/dist/lib/browser/chunk-CV7I2AAB.mjs +80 -0
- package/dist/lib/browser/chunk-CV7I2AAB.mjs.map +7 -0
- package/dist/lib/browser/{chunk-6Y7PZV72.mjs → chunk-FL2XTEJH.mjs} +3 -4
- package/dist/lib/browser/chunk-FL2XTEJH.mjs.map +7 -0
- package/dist/lib/browser/chunk-H7OMDDGW.mjs +42 -0
- package/dist/lib/browser/chunk-H7OMDDGW.mjs.map +7 -0
- package/dist/lib/browser/chunk-HDQXX5DC.mjs +157 -0
- package/dist/lib/browser/chunk-HDQXX5DC.mjs.map +7 -0
- package/dist/lib/browser/chunk-I34GF4NG.mjs +34 -0
- package/dist/lib/browser/chunk-I34GF4NG.mjs.map +7 -0
- package/dist/lib/browser/chunk-KNBRTZVK.mjs +892 -0
- package/dist/lib/browser/chunk-KNBRTZVK.mjs.map +7 -0
- package/dist/lib/browser/{chunk-7IQHKD4U.mjs → chunk-NO7R7QHA.mjs} +4 -7
- package/dist/lib/browser/chunk-NO7R7QHA.mjs.map +7 -0
- package/dist/lib/browser/{chunk-TCLLRCS3.mjs → chunk-P2E7VMRF.mjs} +10 -7
- package/dist/lib/browser/chunk-P2E7VMRF.mjs.map +7 -0
- package/dist/lib/browser/{chunk-PKQT6C53.mjs → chunk-QSXYHXCE.mjs} +3 -2
- package/dist/lib/browser/chunk-QSXYHXCE.mjs.map +7 -0
- package/dist/lib/browser/chunk-RFSO3JRG.mjs +1 -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/cli/index.mjs +90 -0
- package/dist/lib/browser/cli/index.mjs.map +7 -0
- package/dist/lib/browser/common/activation-events.mjs +24 -0
- package/dist/lib/browser/common/capabilities.mjs +46 -0
- package/dist/lib/browser/core/activation-event.mjs +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 +6 -4
- package/dist/lib/browser/core/url-loader.mjs +12 -0
- package/dist/lib/browser/index.mjs +40 -131
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/invoker-capability-P7KPBTP3.mjs +43 -0
- package/dist/lib/browser/invoker-capability-P7KPBTP3.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +56 -34
- package/dist/lib/browser/testing/index.mjs.map +3 -3
- package/dist/lib/browser/{react → ui}/index.mjs +19 -21
- package/dist/lib/browser/ui/index.mjs.map +7 -0
- package/dist/lib/node-esm/{capability-CFLQ2QQU.mjs → capability-CB3MNEI3.mjs} +16 -11
- package/dist/lib/node-esm/capability-CB3MNEI3.mjs.map +7 -0
- package/dist/lib/node-esm/capability-CMROGK7R.mjs +36 -0
- package/dist/lib/node-esm/capability-CMROGK7R.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-STMXUEPO.mjs → chunk-37NG7SIN.mjs} +3 -4
- package/dist/lib/node-esm/chunk-37NG7SIN.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-7JPKC7OM.mjs +893 -0
- package/dist/lib/node-esm/chunk-7JPKC7OM.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-7PPVTBYR.mjs +81 -0
- package/dist/lib/node-esm/chunk-7PPVTBYR.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-BQ56U4QX.mjs +43 -0
- package/dist/lib/node-esm/chunk-BQ56U4QX.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-GT6OKM5I.mjs → chunk-CG6UBBZZ.mjs} +10 -7
- package/dist/lib/node-esm/chunk-CG6UBBZZ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-EL3R25OQ.mjs +2 -0
- package/dist/lib/node-esm/chunk-EL3R25OQ.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-663A54LQ.mjs → chunk-EXYTXQ47.mjs} +4 -7
- package/dist/lib/node-esm/chunk-EXYTXQ47.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-OXXXRCQX.mjs +158 -0
- package/dist/lib/node-esm/chunk-OXXXRCQX.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-WZCSOX5Q.mjs +35 -0
- package/dist/lib/node-esm/chunk-WZCSOX5Q.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-XYQTBFPA.mjs → chunk-YH44RHP6.mjs} +324 -181
- package/dist/lib/node-esm/chunk-YH44RHP6.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-7OWSHPYK.mjs → chunk-ZZ7CKK6W.mjs} +3 -2
- package/dist/lib/node-esm/chunk-ZZ7CKK6W.mjs.map +7 -0
- package/dist/lib/node-esm/cli/index.mjs +91 -0
- package/dist/lib/node-esm/cli/index.mjs.map +7 -0
- package/dist/lib/node-esm/common/activation-events.mjs +25 -0
- package/dist/lib/node-esm/common/activation-events.mjs.map +7 -0
- package/dist/lib/node-esm/common/capabilities.mjs +47 -0
- package/dist/lib/node-esm/common/capabilities.mjs.map +7 -0
- package/dist/lib/node-esm/core/activation-event.mjs +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 +6 -4
- package/dist/lib/node-esm/core/url-loader.mjs +13 -0
- package/dist/lib/node-esm/core/url-loader.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +40 -131
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/invoker-capability-3C5H46ZY.mjs +44 -0
- package/dist/lib/node-esm/invoker-capability-3C5H46ZY.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/testing/index.mjs +56 -34
- package/dist/lib/node-esm/testing/index.mjs.map +3 -3
- package/dist/lib/node-esm/{react → ui}/index.mjs +19 -21
- package/dist/lib/node-esm/ui/index.mjs.map +7 -0
- package/dist/plugin/node-esm/index.mjs +384 -0
- package/dist/plugin/node-esm/index.mjs.map +7 -0
- package/dist/plugin/node-esm/meta.json +1 -0
- package/dist/types/src/{cli.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 +110 -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 +8 -369
- 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/activation-event.d.ts.map +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/index.d.ts +1 -0
- package/dist/types/src/core/index.d.ts.map +1 -1
- package/dist/types/src/core/plugin-manager.d.ts +9 -2
- package/dist/types/src/core/plugin-manager.d.ts.map +1 -1
- package/dist/types/src/core/plugin.d.ts +6 -1
- package/dist/types/src/core/plugin.d.ts.map +1 -1
- package/dist/types/src/core/url-loader.d.ts +25 -0
- package/dist/types/src/core/url-loader.d.ts.map +1 -0
- package/dist/types/src/core/url-loader.test.d.ts +2 -0
- package/dist/types/src/core/url-loader.test.d.ts.map +1 -0
- package/dist/types/src/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/errors.d.ts +30 -3
- package/dist/types/src/plugin-operation/history/errors.d.ts.map +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-operation/invoker-capability.d.ts.map +1 -1
- package/dist/types/src/plugin-operation/testing.d.ts +26 -77
- package/dist/types/src/plugin-operation/testing.d.ts.map +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 +3 -2
- 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/SurfaceProfilerContext.d.ts +48 -0
- package/dist/types/src/ui/components/Surface/SurfaceProfilerContext.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/context.d.ts +5 -0
- package/dist/types/src/ui/components/Surface/context.d.ts.map +1 -0
- package/dist/types/src/ui/components/Surface/index.d.ts +26 -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 +6 -0
- package/dist/types/src/ui/hooks/index.d.ts.map +1 -0
- package/dist/types/src/{react → ui/hooks}/useApp.d.ts +26 -9
- package/dist/types/src/ui/hooks/useApp.d.ts.map +1 -0
- package/dist/types/src/ui/hooks/useApp.test.d.ts +2 -0
- package/dist/types/src/ui/hooks/useApp.test.d.ts.map +1 -0
- package/dist/types/src/{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/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/src/vite-plugin/composer-plugin.d.ts +18 -0
- package/dist/types/src/vite-plugin/composer-plugin.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/import-map-plugin.d.ts +16 -0
- package/dist/types/src/vite-plugin/import-map-plugin.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/index.d.ts +3 -0
- package/dist/types/src/vite-plugin/index.d.ts.map +1 -0
- package/dist/types/src/vite-plugin/packages.d.ts +7 -0
- package/dist/types/src/vite-plugin/packages.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/moon.yml +20 -6
- package/package.json +91 -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 +172 -0
- package/src/common/index.ts +4 -9
- package/src/common/operations.ts +6 -382
- package/src/common/translations.ts +0 -12
- package/src/context.ts +1 -1
- package/src/core/activation-event.ts +5 -2
- package/src/core/capability-manager.ts +1 -1
- package/src/core/capability.ts +11 -10
- package/src/core/index.ts +1 -0
- package/src/core/plugin-manager.test.ts +313 -44
- package/src/core/plugin-manager.ts +344 -157
- package/src/core/plugin.ts +10 -2
- package/src/core/url-loader.test.ts +79 -0
- package/src/core/url-loader.ts +148 -0
- 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/errors.ts +2 -6
- package/src/plugin-operation/history/history-tracker.test.ts +36 -42
- package/src/plugin-operation/history/undo-mapping.ts +6 -3
- package/src/plugin-operation/history/undo-registry.test.ts +3 -3
- package/src/plugin-operation/invoker-capability.ts +21 -7
- package/src/plugin-operation/meta.ts +1 -1
- package/src/plugin-operation/testing.ts +25 -45
- 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 +46 -19
- package/src/ui/components/App/App.stories.tsx +92 -0
- package/src/{react → ui/components/App}/App.tsx +9 -11
- 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} +28 -24
- package/src/{react/Surface.tsx → ui/components/Surface/SurfaceComponent.tsx} +48 -58
- package/src/{react → ui/components/Surface}/SurfaceInfo.tsx +2 -2
- package/src/ui/components/Surface/SurfaceProfilerContext.tsx +207 -0
- package/src/ui/components/Surface/context.ts +12 -0
- package/src/ui/components/Surface/index.ts +35 -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 +9 -0
- package/src/ui/hooks/useApp.test.tsx +159 -0
- package/src/{react → ui/hooks}/useApp.tsx +110 -30
- package/src/{react → ui/hooks}/useCapabilities.ts +9 -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/src/vite-plugin/composer-plugin.ts +128 -0
- package/src/vite-plugin/import-map-plugin.ts +315 -0
- package/src/vite-plugin/index.ts +6 -0
- package/src/vite-plugin/packages.ts +29 -0
- package/tsconfig.json +4 -28
- package/tsconfig.node.json +2 -4
- package/typedoc.json +2 -4
- package/vitest.config.ts +1 -1
- 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-6Y7PZV72.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-PKQT6C53.mjs.map +0 -7
- package/dist/lib/browser/chunk-TCLLRCS3.mjs.map +0 -7
- package/dist/lib/browser/chunk-XYNO72GQ.mjs +0 -746
- 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 +0 -32
- 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 +0 -747
- package/dist/lib/node-esm/chunk-6WXBT3EC.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-7OWSHPYK.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-STMXUEPO.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 +0 -33
- 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 +0 -19
- 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/src/react/useOperationResolver.ts +0 -40
- /package/dist/lib/{node-esm/react/index.mjs.map → browser/chunk-RFSO3JRG.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/index.mjs.map → core/url-loader.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
package/src/{react/Surface.stories.tsx → ui/components/Surface/SurfaceComponent.stories.tsx}
RENAMED
|
@@ -6,15 +6,16 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
|
6
6
|
import React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';
|
|
7
7
|
|
|
8
8
|
import { faker } from '@dxos/random';
|
|
9
|
-
import { List, ListItem, Toolbar } from '@dxos/react-ui';
|
|
10
|
-
import { withTheme } from '@dxos/react-ui/testing';
|
|
9
|
+
import { List, ListItem, Panel, Toolbar } from '@dxos/react-ui';
|
|
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,17 @@ const DefaultStory = () => {
|
|
|
103
105
|
}, [ref]);
|
|
104
106
|
|
|
105
107
|
return (
|
|
106
|
-
<
|
|
107
|
-
<Toolbar
|
|
108
|
-
<Toolbar.
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
108
|
+
<Panel.Root>
|
|
109
|
+
<Panel.Toolbar asChild>
|
|
110
|
+
<Toolbar.Root>
|
|
111
|
+
<Toolbar.Button onClick={handleAdd}>Add</Toolbar.Button>
|
|
112
|
+
<Toolbar.Button onClick={handleSelect}>Pick</Toolbar.Button>
|
|
113
|
+
<Toolbar.Button onClick={handleError}>Error</Toolbar.Button>
|
|
114
|
+
</Toolbar.Root>
|
|
115
|
+
</Panel.Toolbar>
|
|
116
|
+
<Panel.Content className='grid grid-cols-2 h-full gap-4 overflow-hidden'>
|
|
117
|
+
<SurfaceComponent role='item' data={selected ? { id: selected } : undefined} limit={1} ref={ref} />
|
|
118
|
+
<div className='overflow-y-auto h-full'>
|
|
115
119
|
<List>
|
|
116
120
|
{surfaces.map((surface) => (
|
|
117
121
|
<ListItem.Root key={surface.id} id={surface.id}>
|
|
@@ -120,15 +124,15 @@ const DefaultStory = () => {
|
|
|
120
124
|
))}
|
|
121
125
|
</List>
|
|
122
126
|
</div>
|
|
123
|
-
</
|
|
124
|
-
</
|
|
127
|
+
</Panel.Content>
|
|
128
|
+
</Panel.Root>
|
|
125
129
|
);
|
|
126
130
|
};
|
|
127
131
|
|
|
128
132
|
const meta = {
|
|
129
133
|
title: 'sdk/app-framework/Surface',
|
|
130
134
|
render: DefaultStory,
|
|
131
|
-
decorators: [withTheme, withPluginManager({ capabilities: [] })],
|
|
135
|
+
decorators: [withTheme(), withLayout({ layout: 'fullscreen' }), withPluginManager({ capabilities: [] })],
|
|
132
136
|
parameters: {
|
|
133
137
|
layout: 'fullscreen',
|
|
134
138
|
},
|
|
@@ -3,47 +3,42 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import React, {
|
|
6
|
-
type Context,
|
|
7
6
|
Fragment,
|
|
8
7
|
type NamedExoticComponent,
|
|
8
|
+
Profiler,
|
|
9
9
|
type RefAttributes,
|
|
10
10
|
Suspense,
|
|
11
|
-
createContext,
|
|
12
11
|
forwardRef,
|
|
13
12
|
memo,
|
|
14
|
-
useContext,
|
|
15
13
|
useEffect,
|
|
16
14
|
useMemo,
|
|
17
15
|
useRef,
|
|
18
16
|
} from 'react';
|
|
19
17
|
|
|
20
|
-
import { raise } from '@dxos/debug';
|
|
21
18
|
import { log } from '@dxos/log';
|
|
19
|
+
import { ErrorBoundary } from '@dxos/react-error-boundary';
|
|
22
20
|
import { useDefaultValue } from '@dxos/react-hooks';
|
|
23
21
|
import { byPosition } from '@dxos/util';
|
|
24
22
|
|
|
25
|
-
import
|
|
26
|
-
import { type CapabilityManager } from '
|
|
23
|
+
import { Capabilities } from '../../../common';
|
|
24
|
+
import { type CapabilityManager } from '../../../core';
|
|
25
|
+
import { useCapabilities } from '../../hooks';
|
|
27
26
|
|
|
28
|
-
import {
|
|
27
|
+
import { SurfaceContext } from './context';
|
|
29
28
|
import { SurfaceInfo } from './SurfaceInfo';
|
|
30
|
-
import {
|
|
31
|
-
|
|
32
|
-
const DEFAULT_PLACEHOLDER = <Fragment />;
|
|
29
|
+
import { useSurfaceProfilerCallback } from './SurfaceProfilerContext';
|
|
30
|
+
import { type Definition, type Props, type WebComponentDefinition } from './types';
|
|
33
31
|
|
|
34
32
|
const DEBUG = import.meta.env.VITE_DEBUG;
|
|
35
33
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
// TODO(burdon): Use @radix-ui/react-context
|
|
39
|
-
const SurfaceContext: Context<SurfaceContext | undefined> = createContext<SurfaceContext | undefined>(undefined);
|
|
34
|
+
const DEFAULT_PLACEHOLDER = <Fragment />;
|
|
40
35
|
|
|
41
36
|
/**
|
|
42
37
|
* Wrapper component for rendering Web Component surfaces.
|
|
43
38
|
* Handles creation, prop setting, and cleanup of Web Components.
|
|
44
39
|
*/
|
|
45
40
|
const WebComponentWrapper = memo(
|
|
46
|
-
forwardRef<HTMLElement,
|
|
41
|
+
forwardRef<HTMLElement, Props & { definition: WebComponentDefinition }>(
|
|
47
42
|
({ id, role, data, limit, definition, ...rest }, forwardedRef) => {
|
|
48
43
|
const containerRef = useRef<HTMLDivElement>(null);
|
|
49
44
|
const elementRef = useRef<HTMLElement | null>(null);
|
|
@@ -54,7 +49,9 @@ const WebComponentWrapper = memo(
|
|
|
54
49
|
|
|
55
50
|
// Create element only once
|
|
56
51
|
useEffect(() => {
|
|
57
|
-
if (!containerRef.current || elementRef.current)
|
|
52
|
+
if (!containerRef.current || elementRef.current) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
58
55
|
|
|
59
56
|
// Create the Web Component
|
|
60
57
|
const element = document.createElement(definition.tagName);
|
|
@@ -91,7 +88,9 @@ const WebComponentWrapper = memo(
|
|
|
91
88
|
// This runs on every render to ensure all props (including those in `rest`) are kept up to date
|
|
92
89
|
useEffect(() => {
|
|
93
90
|
const element = elementRef.current;
|
|
94
|
-
if (!element)
|
|
91
|
+
if (!element) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
95
94
|
|
|
96
95
|
// Update properties on the existing Web Component
|
|
97
96
|
Object.assign(element, propsRef.current);
|
|
@@ -107,15 +106,18 @@ WebComponentWrapper.displayName = 'WebComponentWrapper';
|
|
|
107
106
|
/**
|
|
108
107
|
* Wrapper component that provides context for a surface.
|
|
109
108
|
*/
|
|
109
|
+
// TODO(burdon): Allow DebugPlugin to provide different fallback using react-ui ErrorFallback.
|
|
110
110
|
const SurfaceContextProvider = memo(
|
|
111
|
-
forwardRef<HTMLElement,
|
|
112
|
-
({ id, role, data, limit, fallback =
|
|
111
|
+
forwardRef<HTMLElement, Props & { definition: Definition }>(
|
|
112
|
+
({ id, role, data, limit, fallback = ErrorFallback, definition, ...rest }, forwardedRef) => {
|
|
113
113
|
const contextValue = useMemo(() => ({ id, role, data }), [id, role, data]);
|
|
114
|
+
const onProfilerRender = useSurfaceProfilerCallback();
|
|
115
|
+
const profilerId = `surface/${id}/${role}`;
|
|
114
116
|
|
|
115
117
|
// Handle Web Component surfaces
|
|
116
118
|
if (definition.kind === 'web-component') {
|
|
117
119
|
return (
|
|
118
|
-
<ErrorBoundary
|
|
120
|
+
<ErrorBoundary name='surface' resetKeys={[data]} FallbackComponent={fallback}>
|
|
119
121
|
<SurfaceContext.Provider value={contextValue}>
|
|
120
122
|
<WebComponentWrapper
|
|
121
123
|
id={id}
|
|
@@ -138,11 +140,17 @@ const SurfaceContextProvider = memo(
|
|
|
138
140
|
const debug = DEBUG || '__DX_DEBUG__' in window;
|
|
139
141
|
if (debug) {
|
|
140
142
|
return (
|
|
141
|
-
<ErrorBoundary
|
|
143
|
+
<ErrorBoundary name='surface' resetKeys={[data]} FallbackComponent={fallback}>
|
|
142
144
|
<div role='none' className='contents' data-id={id} data-role={role}>
|
|
143
145
|
<SurfaceContext.Provider value={contextValue}>
|
|
144
146
|
<SurfaceInfo ref={forwardedRef}>
|
|
145
|
-
|
|
147
|
+
{onProfilerRender && !profilerId.includes('org.dxos.plugin.debug') ? (
|
|
148
|
+
<Profiler id={profilerId} onRender={onProfilerRender}>
|
|
149
|
+
<Component id={id} role={role} data={data} limit={limit} {...rest} />
|
|
150
|
+
</Profiler>
|
|
151
|
+
) : (
|
|
152
|
+
<Component id={id} role={role} data={data} limit={limit} {...rest} />
|
|
153
|
+
)}
|
|
146
154
|
</SurfaceInfo>
|
|
147
155
|
</SurfaceContext.Provider>
|
|
148
156
|
</div>
|
|
@@ -151,7 +159,7 @@ const SurfaceContextProvider = memo(
|
|
|
151
159
|
}
|
|
152
160
|
|
|
153
161
|
return (
|
|
154
|
-
<ErrorBoundary
|
|
162
|
+
<ErrorBoundary name='surface' resetKeys={[data]} FallbackComponent={fallback}>
|
|
155
163
|
<div role='none' className='contents' data-id={id} data-role={role}>
|
|
156
164
|
<SurfaceContext.Provider value={contextValue}>
|
|
157
165
|
<Component id={id} role={role} data={data} limit={limit} {...rest} ref={forwardedRef} />
|
|
@@ -165,15 +173,11 @@ const SurfaceContextProvider = memo(
|
|
|
165
173
|
|
|
166
174
|
SurfaceContextProvider.displayName = 'SurfaceContextProvider';
|
|
167
175
|
|
|
168
|
-
export const useSurface = (): SurfaceContext => {
|
|
169
|
-
const context = useContext(SurfaceContext) ?? raise(new Error('Missing SurfaceContext'));
|
|
170
|
-
return context;
|
|
171
|
-
};
|
|
172
|
-
|
|
173
176
|
/**
|
|
174
177
|
* A surface is a named region of the screen that can be populated by plugins.
|
|
175
178
|
*/
|
|
176
|
-
|
|
179
|
+
// TODO(burdon): Remove `ref` since relying on this would be error prone.
|
|
180
|
+
export const SurfaceComponent: NamedExoticComponent<Props & RefAttributes<HTMLElement>> = memo(
|
|
177
181
|
forwardRef(({ id: _id, role, data: dataProp, limit, placeholder = DEFAULT_PLACEHOLDER, ...rest }, forwardedRef) => {
|
|
178
182
|
const data = useDefaultValue(dataProp, () => ({}));
|
|
179
183
|
|
|
@@ -211,12 +215,19 @@ export const Surface: NamedExoticComponent<Common.SurfaceProps & RefAttributes<H
|
|
|
211
215
|
}),
|
|
212
216
|
);
|
|
213
217
|
|
|
214
|
-
|
|
218
|
+
SurfaceComponent.displayName = 'Surface';
|
|
215
219
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
{
|
|
219
|
-
|
|
220
|
+
// TODO(burdon): Make user facing, with telemetry.
|
|
221
|
+
const ErrorFallback = ({ error }: Props) => {
|
|
222
|
+
const { message } = error instanceof Error ? error : { message: String(error) };
|
|
223
|
+
return (
|
|
224
|
+
<div role='alert' data-testid='error-boundary-fallback'>
|
|
225
|
+
<h1 className='flex gap-2 text-sm mt-2 text-info-text'>{message}</h1>
|
|
226
|
+
</div>
|
|
227
|
+
);
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
const findCandidates = (surfaces: Definition[], { role, data }: Pick<Props, 'role' | 'data'>) => {
|
|
220
231
|
return Object.values(surfaces)
|
|
221
232
|
.filter((definition) =>
|
|
222
233
|
Array.isArray(definition.role) ? definition.role.includes(role) : definition.role === role,
|
|
@@ -225,32 +236,11 @@ const findCandidates = (
|
|
|
225
236
|
.toSorted(byPosition);
|
|
226
237
|
};
|
|
227
238
|
|
|
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
239
|
/**
|
|
250
240
|
* @internal
|
|
251
241
|
*/
|
|
252
242
|
export const useSurfaces = () => {
|
|
253
|
-
const surfaces = useCapabilities(
|
|
243
|
+
const surfaces = useCapabilities(Capabilities.ReactSurface);
|
|
254
244
|
return useMemo(() => surfaces.flat(), [surfaces]);
|
|
255
245
|
};
|
|
256
246
|
|
|
@@ -259,9 +249,9 @@ export const useSurfaces = () => {
|
|
|
259
249
|
*/
|
|
260
250
|
export const isSurfaceAvailable = (
|
|
261
251
|
capabilityManager: CapabilityManager.CapabilityManager,
|
|
262
|
-
{ role, data }: Pick<
|
|
252
|
+
{ role, data }: Pick<Props, 'role' | 'data'>,
|
|
263
253
|
) => {
|
|
264
|
-
const surfaces = capabilityManager.getAll(
|
|
254
|
+
const surfaces = capabilityManager.getAll(Capabilities.ReactSurface);
|
|
265
255
|
const candidates = findCandidates(surfaces.flat(), { role, data });
|
|
266
256
|
return candidates.length > 0;
|
|
267
257
|
};
|
|
@@ -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,207 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import React, {
|
|
6
|
+
type Context,
|
|
7
|
+
type PropsWithChildren,
|
|
8
|
+
type ProfilerOnRenderCallback,
|
|
9
|
+
createContext,
|
|
10
|
+
useContext,
|
|
11
|
+
useMemo,
|
|
12
|
+
useRef,
|
|
13
|
+
useSyncExternalStore,
|
|
14
|
+
} from 'react';
|
|
15
|
+
|
|
16
|
+
const MAX_ENTRIES = 500;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Single profiler record captured from React Profiler onRender callback.
|
|
20
|
+
*/
|
|
21
|
+
export type SurfaceProfilerEntry = {
|
|
22
|
+
id: string;
|
|
23
|
+
phase: 'mount' | 'update' | 'nested-update';
|
|
24
|
+
actualDuration: number;
|
|
25
|
+
baseDuration: number;
|
|
26
|
+
startTime: number;
|
|
27
|
+
commitTime: number;
|
|
28
|
+
timestamp: number;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Aggregated stats for a single profiled surface.
|
|
33
|
+
*/
|
|
34
|
+
export type SurfaceProfilerStats = {
|
|
35
|
+
id: string;
|
|
36
|
+
mountCount: number;
|
|
37
|
+
updateCount: number;
|
|
38
|
+
totalRenders: number;
|
|
39
|
+
avgActualDuration: number;
|
|
40
|
+
maxActualDuration: number;
|
|
41
|
+
avgBaseDuration: number;
|
|
42
|
+
lastActualDuration: number;
|
|
43
|
+
lastCommitTime: number;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Store that collects profiler entries and notifies subscribers.
|
|
48
|
+
*/
|
|
49
|
+
class SurfaceProfilerStore {
|
|
50
|
+
private _entries: SurfaceProfilerEntry[] = [];
|
|
51
|
+
private _listeners = new Set<() => void>();
|
|
52
|
+
private _snapshot: readonly SurfaceProfilerEntry[] = [];
|
|
53
|
+
private _pendingNotify = false;
|
|
54
|
+
|
|
55
|
+
/** Records an entry and schedules a deferred notification to avoid re-render loops. */
|
|
56
|
+
record(entry: SurfaceProfilerEntry) {
|
|
57
|
+
this._entries.push(entry);
|
|
58
|
+
if (this._entries.length > MAX_ENTRIES) {
|
|
59
|
+
this._entries = this._entries.slice(-MAX_ENTRIES);
|
|
60
|
+
}
|
|
61
|
+
this._snapshot = [...this._entries];
|
|
62
|
+
this._scheduleNotify();
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
clear() {
|
|
66
|
+
this._entries = [];
|
|
67
|
+
this._snapshot = [];
|
|
68
|
+
this._notifySync();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
subscribe = (listener: () => void) => {
|
|
72
|
+
this._listeners.add(listener);
|
|
73
|
+
return () => {
|
|
74
|
+
this._listeners.delete(listener);
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
getSnapshot = (): readonly SurfaceProfilerEntry[] => {
|
|
79
|
+
return this._snapshot;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Defers notification to the next animation frame to break the
|
|
84
|
+
* Profiler onRender → record → notify → re-render → onRender loop.
|
|
85
|
+
*/
|
|
86
|
+
private _scheduleNotify() {
|
|
87
|
+
if (!this._pendingNotify) {
|
|
88
|
+
this._pendingNotify = true;
|
|
89
|
+
requestAnimationFrame(() => {
|
|
90
|
+
this._pendingNotify = false;
|
|
91
|
+
this._notifySync();
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
private _notifySync() {
|
|
97
|
+
for (const listener of this._listeners) {
|
|
98
|
+
listener();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
type SurfaceProfilerContextValue = {
|
|
104
|
+
store: SurfaceProfilerStore;
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
const SurfaceProfilerContext: Context<SurfaceProfilerContextValue | undefined> = createContext<
|
|
108
|
+
SurfaceProfilerContextValue | undefined
|
|
109
|
+
>(undefined);
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Provider that collects React Profiler data from Surface components.
|
|
113
|
+
*/
|
|
114
|
+
export const SurfaceProfilerProvider = ({ children }: PropsWithChildren) => {
|
|
115
|
+
const storeRef = useRef<SurfaceProfilerStore>(null);
|
|
116
|
+
if (!storeRef.current) {
|
|
117
|
+
storeRef.current = new SurfaceProfilerStore();
|
|
118
|
+
}
|
|
119
|
+
return (
|
|
120
|
+
<SurfaceProfilerContext.Provider value={{ store: storeRef.current }}>{children}</SurfaceProfilerContext.Provider>
|
|
121
|
+
);
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Returns a stable onRender callback for use with React Profiler.
|
|
126
|
+
*/
|
|
127
|
+
export const useSurfaceProfilerCallback = (): ProfilerOnRenderCallback | undefined => {
|
|
128
|
+
const store = useContext(SurfaceProfilerContext)?.store;
|
|
129
|
+
return useMemo<ProfilerOnRenderCallback | undefined>(() => {
|
|
130
|
+
if (!store) {
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
return (id, phase, actualDuration, baseDuration, startTime, commitTime) => {
|
|
134
|
+
store.record({
|
|
135
|
+
id,
|
|
136
|
+
phase,
|
|
137
|
+
actualDuration,
|
|
138
|
+
baseDuration,
|
|
139
|
+
startTime,
|
|
140
|
+
commitTime,
|
|
141
|
+
timestamp: Date.now(),
|
|
142
|
+
});
|
|
143
|
+
};
|
|
144
|
+
}, [store]);
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Returns all profiler entries reactively.
|
|
149
|
+
*/
|
|
150
|
+
export const useSurfaceProfilerEntries = (): readonly SurfaceProfilerEntry[] => {
|
|
151
|
+
const context = useContext(SurfaceProfilerContext);
|
|
152
|
+
return useSyncExternalStore(context?.store.subscribe ?? noop, context?.store.getSnapshot ?? emptySnapshot);
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Returns aggregated stats grouped by surface id.
|
|
157
|
+
*/
|
|
158
|
+
export const useSurfaceProfilerStats = (): SurfaceProfilerStats[] => {
|
|
159
|
+
const entries = useSurfaceProfilerEntries();
|
|
160
|
+
const statsMap = new Map<string, SurfaceProfilerStats>();
|
|
161
|
+
|
|
162
|
+
for (const entry of entries) {
|
|
163
|
+
let stats = statsMap.get(entry.id);
|
|
164
|
+
if (!stats) {
|
|
165
|
+
stats = {
|
|
166
|
+
id: entry.id,
|
|
167
|
+
mountCount: 0,
|
|
168
|
+
updateCount: 0,
|
|
169
|
+
totalRenders: 0,
|
|
170
|
+
avgActualDuration: 0,
|
|
171
|
+
maxActualDuration: 0,
|
|
172
|
+
avgBaseDuration: 0,
|
|
173
|
+
lastActualDuration: 0,
|
|
174
|
+
lastCommitTime: 0,
|
|
175
|
+
};
|
|
176
|
+
statsMap.set(entry.id, stats);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
if (entry.phase === 'mount') {
|
|
180
|
+
stats.mountCount++;
|
|
181
|
+
} else {
|
|
182
|
+
stats.updateCount++;
|
|
183
|
+
}
|
|
184
|
+
stats.totalRenders++;
|
|
185
|
+
stats.avgActualDuration =
|
|
186
|
+
(stats.avgActualDuration * (stats.totalRenders - 1) + entry.actualDuration) / stats.totalRenders;
|
|
187
|
+
stats.avgBaseDuration =
|
|
188
|
+
(stats.avgBaseDuration * (stats.totalRenders - 1) + entry.baseDuration) / stats.totalRenders;
|
|
189
|
+
stats.maxActualDuration = Math.max(stats.maxActualDuration, entry.actualDuration);
|
|
190
|
+
stats.lastActualDuration = entry.actualDuration;
|
|
191
|
+
stats.lastCommitTime = entry.commitTime;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return [...statsMap.values()].sort((a, b) => b.maxActualDuration - a.maxActualDuration);
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Clears all collected profiler entries.
|
|
199
|
+
*/
|
|
200
|
+
export const useSurfaceProfilerClear = (): (() => void) | undefined => {
|
|
201
|
+
const store = useContext(SurfaceProfilerContext)?.store;
|
|
202
|
+
return useMemo(() => (store ? () => store.clear() : undefined), [store]);
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
const noop = () => () => {};
|
|
206
|
+
const EMPTY_SNAPSHOT: readonly SurfaceProfilerEntry[] = [];
|
|
207
|
+
const emptySnapshot = () => EMPTY_SNAPSHOT;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { type Context, createContext } from 'react';
|
|
6
|
+
|
|
7
|
+
import { type Props } from './types';
|
|
8
|
+
|
|
9
|
+
export type SurfaceContext = Pick<Props, 'id' | 'role' | 'data'>;
|
|
10
|
+
|
|
11
|
+
// TODO(burdon): Use @radix-ui/react-context
|
|
12
|
+
export const SurfaceContext: Context<SurfaceContext | undefined> = createContext<SurfaceContext | undefined>(undefined);
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
// TODO(wittjosiah): Cleanup to avoid re-naming.
|
|
6
|
+
import { SurfaceContext } from './context';
|
|
7
|
+
import { SurfaceComponent, isSurfaceAvailable } from './SurfaceComponent';
|
|
8
|
+
import {
|
|
9
|
+
SurfaceProfilerProvider,
|
|
10
|
+
useSurfaceProfilerCallback,
|
|
11
|
+
useSurfaceProfilerClear,
|
|
12
|
+
useSurfaceProfilerEntries,
|
|
13
|
+
useSurfaceProfilerStats,
|
|
14
|
+
} from './SurfaceProfilerContext';
|
|
15
|
+
import { type Definition as SurfaceDefinition, create as createSurface, createWeb as createWebSurface } from './types';
|
|
16
|
+
|
|
17
|
+
export namespace Surface {
|
|
18
|
+
export type Definition = SurfaceDefinition;
|
|
19
|
+
export const create = createSurface;
|
|
20
|
+
export const createWeb = createWebSurface;
|
|
21
|
+
|
|
22
|
+
export type Context = SurfaceContext;
|
|
23
|
+
export const Context = SurfaceContext;
|
|
24
|
+
|
|
25
|
+
export const Surface = SurfaceComponent;
|
|
26
|
+
export const isAvailable = isSurfaceAvailable;
|
|
27
|
+
|
|
28
|
+
export const ProfilerProvider = SurfaceProfilerProvider;
|
|
29
|
+
export const useProfilerCallback = useSurfaceProfilerCallback;
|
|
30
|
+
export const useProfilerEntries = useSurfaceProfilerEntries;
|
|
31
|
+
export const useProfilerStats = useSurfaceProfilerStats;
|
|
32
|
+
export const useProfilerClear = useSurfaceProfilerClear;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export type { SurfaceProfilerEntry, SurfaceProfilerStats } from './SurfaceProfilerContext';
|