@dxos/plugin-deck 0.8.4-main.c1de068 → 0.8.4-main.c85a9c8dae
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/dist/lib/browser/Banner-DR6B7XTO.mjs +15 -0
- package/dist/lib/browser/Banner-DR6B7XTO.mjs.map +7 -0
- package/dist/lib/browser/DeckSettings-HB5TKG2F.mjs +96 -0
- package/dist/lib/browser/DeckSettings-HB5TKG2F.mjs.map +7 -0
- package/dist/lib/browser/app-graph-builder-22XAL7YE.mjs +123 -0
- package/dist/lib/browser/app-graph-builder-22XAL7YE.mjs.map +7 -0
- package/dist/lib/browser/check-app-scheme-ZV3QWNNZ.mjs +33 -0
- package/dist/lib/browser/check-app-scheme-ZV3QWNNZ.mjs.map +7 -0
- package/dist/lib/browser/chunk-BJDEG7YZ.mjs +74 -0
- package/dist/lib/browser/chunk-BJDEG7YZ.mjs.map +7 -0
- package/dist/lib/browser/chunk-FBL4WVYZ.mjs +16 -0
- package/dist/lib/browser/chunk-FBL4WVYZ.mjs.map +7 -0
- package/dist/lib/browser/chunk-OAPMV5ZR.mjs +280 -0
- package/dist/lib/browser/chunk-OAPMV5ZR.mjs.map +7 -0
- package/dist/lib/browser/chunk-Q4GUCIRE.mjs +200 -0
- package/dist/lib/browser/chunk-Q4GUCIRE.mjs.map +7 -0
- package/dist/lib/browser/chunk-SKBPLX5T.mjs +81 -0
- package/dist/lib/browser/chunk-SKBPLX5T.mjs.map +7 -0
- package/dist/lib/browser/chunk-YGOOWRJE.mjs +1390 -0
- package/dist/lib/browser/chunk-YGOOWRJE.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +91 -74
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/operation-resolver-BLZGJWLO.mjs +580 -0
- package/dist/lib/browser/operation-resolver-BLZGJWLO.mjs.map +7 -0
- package/dist/lib/browser/react-root-4ESZAM6D.mjs +49 -0
- package/dist/lib/browser/react-root-4ESZAM6D.mjs.map +7 -0
- package/dist/lib/browser/react-surface-KYQGCALN.mjs +44 -0
- package/dist/lib/browser/react-surface-KYQGCALN.mjs.map +7 -0
- package/dist/lib/browser/settings-RY2TBSGP.mjs +40 -0
- package/dist/lib/browser/settings-RY2TBSGP.mjs.map +7 -0
- package/dist/lib/browser/state-CSTTMJ43.mjs +106 -0
- package/dist/lib/browser/state-CSTTMJ43.mjs.map +7 -0
- package/dist/lib/browser/toolkit-EONRPYA5.mjs +55 -0
- package/dist/lib/browser/toolkit-EONRPYA5.mjs.map +7 -0
- package/dist/lib/browser/types/index.mjs +14 -6
- package/dist/lib/browser/url-handler-EM3SYHHX.mjs +95 -0
- package/dist/lib/browser/url-handler-EM3SYHHX.mjs.map +7 -0
- package/dist/lib/node-esm/Banner-HR7DPUZU.mjs +16 -0
- package/dist/lib/node-esm/Banner-HR7DPUZU.mjs.map +7 -0
- package/dist/lib/node-esm/DeckSettings-MWTR7HU2.mjs +97 -0
- package/dist/lib/node-esm/DeckSettings-MWTR7HU2.mjs.map +7 -0
- package/dist/lib/node-esm/app-graph-builder-GNNNCWGN.mjs +124 -0
- package/dist/lib/node-esm/app-graph-builder-GNNNCWGN.mjs.map +7 -0
- package/dist/lib/node-esm/check-app-scheme-ZNISVRFH.mjs +34 -0
- package/dist/lib/node-esm/check-app-scheme-ZNISVRFH.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-DGTRKKWZ.mjs +76 -0
- package/dist/lib/node-esm/chunk-DGTRKKWZ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-EGFOT3DE.mjs +18 -0
- package/dist/lib/node-esm/chunk-EGFOT3DE.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-IR6ODCNC.mjs +83 -0
- package/dist/lib/node-esm/chunk-IR6ODCNC.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-L2NPJPGL.mjs +281 -0
- package/dist/lib/node-esm/chunk-L2NPJPGL.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-O4IOJICP.mjs +201 -0
- package/dist/lib/node-esm/chunk-O4IOJICP.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-Z43MBISY.mjs +1391 -0
- package/dist/lib/node-esm/chunk-Z43MBISY.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +186 -0
- package/dist/lib/node-esm/index.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -0
- package/dist/lib/node-esm/operation-resolver-5BYDNQND.mjs +581 -0
- package/dist/lib/node-esm/operation-resolver-5BYDNQND.mjs.map +7 -0
- package/dist/lib/node-esm/react-root-YO7IIC75.mjs +50 -0
- package/dist/lib/node-esm/react-root-YO7IIC75.mjs.map +7 -0
- package/dist/lib/node-esm/react-surface-G7VRKT4U.mjs +45 -0
- package/dist/lib/node-esm/react-surface-G7VRKT4U.mjs.map +7 -0
- package/dist/lib/node-esm/settings-GYLWWOBK.mjs +41 -0
- package/dist/lib/node-esm/settings-GYLWWOBK.mjs.map +7 -0
- package/dist/lib/node-esm/state-RQXTBWUX.mjs +107 -0
- package/dist/lib/node-esm/state-RQXTBWUX.mjs.map +7 -0
- package/dist/lib/node-esm/toolkit-EU3Z2R4H.mjs +56 -0
- package/dist/lib/node-esm/toolkit-EU3Z2R4H.mjs.map +7 -0
- package/dist/lib/node-esm/types/index.mjs +41 -0
- package/dist/lib/node-esm/url-handler-VUK2LBJV.mjs +96 -0
- package/dist/lib/node-esm/url-handler-VUK2LBJV.mjs.map +7 -0
- package/dist/types/src/DeckPlugin.d.ts +2 -1
- package/dist/types/src/DeckPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +6 -0
- package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -0
- package/dist/types/src/capabilities/app-graph-builder/index.d.ts +3 -0
- package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/check-app-scheme/check-app-scheme.d.ts +5 -0
- package/dist/types/src/capabilities/check-app-scheme/check-app-scheme.d.ts.map +1 -0
- package/dist/types/src/capabilities/check-app-scheme/index.d.ts +3 -0
- package/dist/types/src/capabilities/check-app-scheme/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/index.d.ts +8 -13
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/operation-resolver/index.d.ts +3 -0
- package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +5 -0
- package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -0
- package/dist/types/src/capabilities/react-root/index.d.ts +6 -0
- package/dist/types/src/capabilities/react-root/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/react-root/react-root.d.ts +9 -0
- package/dist/types/src/capabilities/react-root/react-root.d.ts.map +1 -0
- package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
- package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
- package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
- package/dist/types/src/capabilities/settings/index.d.ts +19 -0
- package/dist/types/src/capabilities/settings/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/settings/settings.d.ts +22 -0
- package/dist/types/src/capabilities/settings/settings.d.ts.map +1 -0
- package/dist/types/src/capabilities/state/index.d.ts +172 -0
- package/dist/types/src/capabilities/state/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/state/state.d.ts +175 -0
- package/dist/types/src/capabilities/state/state.d.ts.map +1 -0
- package/dist/types/src/capabilities/toolkit/index.d.ts +3 -0
- package/dist/types/src/capabilities/toolkit/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/toolkit/toolkit.d.ts +27 -0
- package/dist/types/src/capabilities/toolkit/toolkit.d.ts.map +1 -0
- package/dist/types/src/capabilities/tools/index.d.ts +3 -0
- package/dist/types/src/capabilities/tools/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/tools/tools.d.ts +12 -0
- package/dist/types/src/capabilities/tools/tools.d.ts.map +1 -0
- package/dist/types/src/capabilities/url-handler/index.d.ts +3 -0
- package/dist/types/src/capabilities/url-handler/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/url-handler/url-handler.d.ts +5 -0
- package/dist/types/src/capabilities/url-handler/url-handler.d.ts.map +1 -0
- package/dist/types/src/components/DeckLayout/ActiveNode.d.ts.map +1 -1
- package/dist/types/src/components/DeckLayout/Banner.d.ts.map +1 -1
- package/dist/types/src/components/DeckLayout/ContentEmpty.d.ts.map +1 -1
- package/dist/types/src/components/DeckLayout/DeckLayout.d.ts +2 -3
- package/dist/types/src/components/DeckLayout/DeckLayout.d.ts.map +1 -1
- package/dist/types/src/components/DeckLayout/DeckLayout.stories.d.ts +75 -0
- package/dist/types/src/components/DeckLayout/DeckLayout.stories.d.ts.map +1 -0
- package/dist/types/src/components/DeckLayout/DeckMain.d.ts +3 -0
- package/dist/types/src/components/DeckLayout/DeckMain.d.ts.map +1 -0
- package/dist/types/src/components/DeckLayout/Dialog.d.ts.map +1 -1
- package/dist/types/src/components/DeckLayout/Fallback.d.ts.map +1 -1
- package/dist/types/src/components/DeckLayout/Popover.d.ts.map +1 -1
- package/dist/types/src/components/DeckLayout/Toast.d.ts +7 -2
- package/dist/types/src/components/DeckLayout/Toast.d.ts.map +1 -1
- package/dist/types/src/components/Plank/Plank.d.ts +6 -6
- package/dist/types/src/components/Plank/Plank.d.ts.map +1 -1
- package/dist/types/src/components/Plank/Plank.stories.d.ts +105 -5
- package/dist/types/src/components/Plank/Plank.stories.d.ts.map +1 -1
- package/dist/types/src/components/Plank/PlankControls.d.ts +1 -1
- package/dist/types/src/components/Plank/PlankControls.d.ts.map +1 -1
- package/dist/types/src/components/Plank/PlankError.d.ts +6 -4
- package/dist/types/src/components/Plank/PlankError.d.ts.map +1 -1
- package/dist/types/src/components/Plank/PlankHeading.d.ts +3 -3
- package/dist/types/src/components/Plank/PlankHeading.d.ts.map +1 -1
- package/dist/types/src/components/Sidebar/ComplementarySidebar.d.ts.map +1 -1
- package/dist/types/src/components/Sidebar/Sidebar.d.ts.map +1 -1
- package/dist/types/src/components/Sidebar/SidebarButton.d.ts.map +1 -1
- package/dist/types/src/components/fragments.d.ts +4 -1
- package/dist/types/src/components/fragments.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +0 -1
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/containers/Banner/Banner.d.ts +2 -0
- package/dist/types/src/containers/Banner/Banner.d.ts.map +1 -0
- package/dist/types/src/containers/Banner/index.d.ts +3 -0
- package/dist/types/src/containers/Banner/index.d.ts.map +1 -0
- package/dist/types/src/containers/DeckSettings/DeckSettings.d.ts +8 -0
- package/dist/types/src/containers/DeckSettings/DeckSettings.d.ts.map +1 -0
- package/dist/types/src/containers/DeckSettings/index.d.ts +3 -0
- package/dist/types/src/containers/DeckSettings/index.d.ts.map +1 -0
- package/dist/types/src/containers/index.d.ts +4 -0
- package/dist/types/src/containers/index.d.ts.map +1 -0
- package/dist/types/src/hooks/index.d.ts +2 -0
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useDeckCompanions.d.ts +3 -3
- package/dist/types/src/hooks/useDeckCompanions.d.ts.map +1 -1
- package/dist/types/src/hooks/useDeckState.d.ts +17 -0
- package/dist/types/src/hooks/useDeckState.d.ts.map +1 -0
- package/dist/types/src/hooks/useHoistStatusbar.d.ts +1 -1
- package/dist/types/src/hooks/useHoistStatusbar.d.ts.map +1 -1
- package/dist/types/src/hooks/useMainSize.d.ts +2 -2
- package/dist/types/src/hooks/useNodeActionExpander.d.ts +1 -1
- package/dist/types/src/hooks/useNodeActionExpander.d.ts.map +1 -1
- package/dist/types/src/hooks/useSelectedCompanion.d.ts +13 -0
- package/dist/types/src/hooks/useSelectedCompanion.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +1 -2
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +2 -3
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +4 -1
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/{capabilities → types}/capabilities.d.ts +96 -90
- package/dist/types/src/types/capabilities.d.ts.map +1 -0
- package/dist/types/src/types/events.d.ts +7 -0
- package/dist/types/src/types/events.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +2 -0
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/src/types/schema.d.ts +96 -34
- package/dist/types/src/types/schema.d.ts.map +1 -1
- package/dist/types/src/util/set-active.d.ts +18 -3
- package/dist/types/src/util/set-active.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +58 -46
- package/src/DeckPlugin.ts +46 -61
- package/src/capabilities/app-graph-builder/app-graph-builder.ts +119 -0
- package/src/capabilities/app-graph-builder/index.ts +7 -0
- package/src/capabilities/check-app-scheme/check-app-scheme.ts +45 -0
- package/src/capabilities/check-app-scheme/index.ts +7 -0
- package/src/capabilities/index.ts +9 -13
- package/src/capabilities/operation-resolver/index.ts +10 -0
- package/src/capabilities/operation-resolver/operation-resolver.ts +560 -0
- package/src/capabilities/react-root/index.ts +7 -0
- package/src/capabilities/react-root/react-root.tsx +47 -0
- package/src/capabilities/react-surface/index.ts +7 -0
- package/src/capabilities/react-surface/react-surface.tsx +38 -0
- package/src/capabilities/settings/index.ts +7 -0
- package/src/capabilities/settings/settings.ts +39 -0
- package/src/capabilities/state/index.ts +7 -0
- package/src/capabilities/state/state.ts +105 -0
- package/src/capabilities/toolkit/index.ts +7 -0
- package/src/capabilities/toolkit/toolkit.ts +64 -0
- package/src/capabilities/tools/index.ts +7 -0
- package/src/capabilities/tools/tools.ts +91 -0
- package/src/capabilities/url-handler/index.ts +7 -0
- package/src/capabilities/url-handler/url-handler.ts +96 -0
- package/src/components/DeckLayout/ActiveNode.tsx +3 -2
- package/src/components/DeckLayout/Banner.tsx +12 -12
- package/src/components/DeckLayout/ContentEmpty.tsx +6 -7
- package/src/components/DeckLayout/DeckLayout.stories.tsx +53 -0
- package/src/components/DeckLayout/DeckLayout.tsx +18 -285
- package/src/components/DeckLayout/DeckMain.tsx +287 -0
- package/src/components/DeckLayout/Dialog.tsx +22 -13
- package/src/components/DeckLayout/Fallback.tsx +4 -8
- package/src/components/DeckLayout/Popover.tsx +70 -32
- package/src/components/DeckLayout/StatusBar.tsx +4 -4
- package/src/components/DeckLayout/Toast.tsx +30 -5
- package/src/components/Plank/Plank.stories.tsx +26 -17
- package/src/components/Plank/Plank.tsx +103 -67
- package/src/components/Plank/PlankControls.tsx +12 -14
- package/src/components/Plank/PlankError.tsx +33 -18
- package/src/components/Plank/PlankHeading.tsx +42 -48
- package/src/components/Plank/PlankLoading.tsx +1 -1
- package/src/components/Sidebar/ComplementarySidebar.tsx +77 -45
- package/src/components/Sidebar/Sidebar.tsx +9 -9
- package/src/components/Sidebar/SidebarButton.tsx +40 -33
- package/src/components/fragments.ts +10 -5
- package/src/components/index.ts +0 -1
- package/src/containers/Banner/Banner.tsx +5 -0
- package/src/containers/Banner/index.ts +7 -0
- package/src/containers/DeckSettings/DeckSettings.tsx +113 -0
- package/src/containers/DeckSettings/index.ts +7 -0
- package/src/containers/index.ts +8 -0
- package/src/hooks/index.ts +2 -0
- package/src/hooks/useCompanions.ts +2 -2
- package/src/hooks/useDeckCompanions.ts +7 -5
- package/src/hooks/useDeckState.ts +82 -0
- package/src/hooks/useHoistStatusbar.ts +4 -5
- package/src/hooks/useMainSize.ts +2 -2
- package/src/hooks/useNodeActionExpander.ts +4 -4
- package/src/hooks/useSelectedCompanion.ts +38 -0
- package/src/index.ts +1 -2
- package/src/meta.ts +8 -5
- package/src/translations.ts +4 -1
- package/src/types/capabilities.ts +33 -0
- package/src/types/events.ts +21 -0
- package/src/types/index.ts +2 -0
- package/src/types/schema.ts +96 -21
- package/src/util/layoutAppliesTopbar.ts +1 -1
- package/src/util/overscroll.ts +3 -3
- package/src/util/set-active.ts +49 -29
- package/dist/lib/browser/app-graph-builder-JTFSDT2I.mjs +0 -152
- package/dist/lib/browser/app-graph-builder-JTFSDT2I.mjs.map +0 -7
- package/dist/lib/browser/check-app-scheme-57U62A3A.mjs +0 -32
- package/dist/lib/browser/check-app-scheme-57U62A3A.mjs.map +0 -7
- package/dist/lib/browser/chunk-CNTGBCMK.mjs +0 -145
- package/dist/lib/browser/chunk-CNTGBCMK.mjs.map +0 -7
- package/dist/lib/browser/chunk-D7KTFCUV.mjs +0 -1494
- package/dist/lib/browser/chunk-D7KTFCUV.mjs.map +0 -7
- package/dist/lib/browser/chunk-F5BQOOEG.mjs +0 -160
- package/dist/lib/browser/chunk-F5BQOOEG.mjs.map +0 -7
- package/dist/lib/browser/chunk-JFTXENFN.mjs +0 -129
- package/dist/lib/browser/chunk-JFTXENFN.mjs.map +0 -7
- package/dist/lib/browser/chunk-M57WD3V6.mjs +0 -16
- package/dist/lib/browser/chunk-M57WD3V6.mjs.map +0 -7
- package/dist/lib/browser/chunk-QDZO4AJ4.mjs +0 -127
- package/dist/lib/browser/chunk-QDZO4AJ4.mjs.map +0 -7
- package/dist/lib/browser/chunk-Z5KITAZW.mjs +0 -13
- package/dist/lib/browser/chunk-Z5KITAZW.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-P2OBK5HK.mjs +0 -521
- package/dist/lib/browser/intent-resolver-P2OBK5HK.mjs.map +0 -7
- package/dist/lib/browser/react-root-PO64J7ML.mjs +0 -43
- package/dist/lib/browser/react-root-PO64J7ML.mjs.map +0 -7
- package/dist/lib/browser/react-surface-E45YOVF5.mjs +0 -40
- package/dist/lib/browser/react-surface-E45YOVF5.mjs.map +0 -7
- package/dist/lib/browser/settings-6AJZPZPM.mjs +0 -29
- package/dist/lib/browser/settings-6AJZPZPM.mjs.map +0 -7
- package/dist/lib/browser/state-MVDYX77Y.mjs +0 -12
- package/dist/lib/browser/tools-TKQDPCHJ.mjs +0 -88
- package/dist/lib/browser/tools-TKQDPCHJ.mjs.map +0 -7
- package/dist/lib/browser/url-handler-7L7M6IKH.mjs +0 -70
- package/dist/lib/browser/url-handler-7L7M6IKH.mjs.map +0 -7
- package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -4
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
- package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
- package/dist/types/src/capabilities/check-app-scheme.d.ts +0 -4
- package/dist/types/src/capabilities/check-app-scheme.d.ts.map +0 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
- package/dist/types/src/capabilities/react-root.d.ts +0 -7
- package/dist/types/src/capabilities/react-root.d.ts.map +0 -1
- package/dist/types/src/capabilities/react-surface.d.ts +0 -4
- package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
- package/dist/types/src/capabilities/settings.d.ts +0 -4
- package/dist/types/src/capabilities/settings.d.ts.map +0 -1
- package/dist/types/src/capabilities/state.d.ts +0 -101
- package/dist/types/src/capabilities/state.d.ts.map +0 -1
- package/dist/types/src/capabilities/tools.d.ts +0 -11
- package/dist/types/src/capabilities/tools.d.ts.map +0 -1
- package/dist/types/src/capabilities/url-handler.d.ts +0 -4
- package/dist/types/src/capabilities/url-handler.d.ts.map +0 -1
- package/dist/types/src/components/DeckSettings/DeckSettings.d.ts +0 -6
- package/dist/types/src/components/DeckSettings/DeckSettings.d.ts.map +0 -1
- package/dist/types/src/components/DeckSettings/index.d.ts +0 -2
- package/dist/types/src/components/DeckSettings/index.d.ts.map +0 -1
- package/dist/types/src/events.d.ts +0 -4
- package/dist/types/src/events.d.ts.map +0 -1
- package/src/capabilities/app-graph-builder.ts +0 -141
- package/src/capabilities/capabilities.ts +0 -14
- package/src/capabilities/check-app-scheme.ts +0 -40
- package/src/capabilities/intent-resolver.ts +0 -468
- package/src/capabilities/react-root.tsx +0 -38
- package/src/capabilities/react-surface.tsx +0 -30
- package/src/capabilities/settings.ts +0 -26
- package/src/capabilities/state.ts +0 -104
- package/src/capabilities/tools.ts +0 -81
- package/src/capabilities/url-handler.ts +0 -59
- package/src/components/DeckSettings/DeckSettings.tsx +0 -88
- package/src/components/DeckSettings/index.ts +0 -5
- package/src/events.ts +0 -11
- /package/dist/lib/{browser/state-MVDYX77Y.mjs.map → node-esm/types/index.mjs.map} +0 -0
|
@@ -5,21 +5,17 @@
|
|
|
5
5
|
import React from 'react';
|
|
6
6
|
|
|
7
7
|
import { useTranslation } from '@dxos/react-ui';
|
|
8
|
-
import { errorText, mx } from '@dxos/react-ui-theme';
|
|
9
8
|
|
|
10
|
-
import {
|
|
9
|
+
import { meta } from '../../meta';
|
|
11
10
|
|
|
12
11
|
export const Fallback = () => {
|
|
13
|
-
const { t } = useTranslation(
|
|
12
|
+
const { t } = useTranslation(meta.id);
|
|
14
13
|
|
|
15
14
|
return (
|
|
16
|
-
<div role='none' className='min-
|
|
15
|
+
<div role='none' className='min-h-screen w-full flex items-center justify-center p-8'>
|
|
17
16
|
<p
|
|
18
17
|
role='alert'
|
|
19
|
-
className=
|
|
20
|
-
errorText,
|
|
21
|
-
'border border-error-400/50 rounded-md flex items-center justify-center p-8 font-normal text-lg',
|
|
22
|
-
)}
|
|
18
|
+
className='flex items-center justify-center p-8 font-normal text-lg text-error-text border border-rose-fill rounded-md'
|
|
23
19
|
>
|
|
24
20
|
{t('plugin error message')}
|
|
25
21
|
</p>
|
|
@@ -3,12 +3,16 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { createContext } from '@radix-ui/react-context';
|
|
6
|
-
import React, { type PropsWithChildren, useCallback, useEffect,
|
|
6
|
+
import React, { type PropsWithChildren, useCallback, useEffect, useRef, useState } from 'react';
|
|
7
7
|
|
|
8
|
-
import { Surface,
|
|
9
|
-
import {
|
|
8
|
+
import { Surface, useOperationInvoker } from '@dxos/app-framework/ui';
|
|
9
|
+
import { LayoutOperation } from '@dxos/app-toolkit';
|
|
10
|
+
import { useObjectNavigate } from '@dxos/app-toolkit/ui';
|
|
11
|
+
import { Popover, type PopoverContentInteractOutsideEvent, toLocalizedString, useTranslation } from '@dxos/react-ui';
|
|
12
|
+
import { Card } from '@dxos/react-ui';
|
|
10
13
|
|
|
11
|
-
import {
|
|
14
|
+
import { useDeckState } from '../../hooks';
|
|
15
|
+
import { meta } from '../../meta';
|
|
12
16
|
|
|
13
17
|
export type DeckPopoverRootProps = PropsWithChildren<{}>;
|
|
14
18
|
|
|
@@ -21,43 +25,61 @@ type DeckPopoverContextValue = {
|
|
|
21
25
|
const [DeckPopoverProvider, useDeckPopoverContext] = createContext<DeckPopoverContextValue>('DeckPopover');
|
|
22
26
|
|
|
23
27
|
export const PopoverRoot = ({ children }: DeckPopoverRootProps) => {
|
|
24
|
-
const
|
|
28
|
+
const { state } = useDeckState();
|
|
25
29
|
const virtualRef = useRef<HTMLButtonElement | null>(null);
|
|
26
30
|
const [virtualIter, setVirtualIter] = useState(0);
|
|
27
31
|
const [open, setOpen] = useState(false);
|
|
28
32
|
const debounceRef = useRef<NodeJS.Timeout | null>(null);
|
|
29
33
|
|
|
30
34
|
// TODO(thure): This is a workaround for the race condition between displaying a Popover and either rendering
|
|
31
|
-
// the anchor further down the tree or measuring the virtual trigger
|
|
35
|
+
// the anchor further down the tree or measuring the virtual trigger's client rect.
|
|
32
36
|
useEffect(() => {
|
|
33
37
|
setOpen(false);
|
|
34
|
-
if (
|
|
38
|
+
if (state.popoverOpen) {
|
|
35
39
|
if (debounceRef.current) {
|
|
36
40
|
clearTimeout(debounceRef.current);
|
|
37
41
|
}
|
|
38
|
-
if (
|
|
39
|
-
virtualRef.current =
|
|
42
|
+
if (state.popoverAnchor && virtualRef.current !== state.popoverAnchor) {
|
|
43
|
+
virtualRef.current = state.popoverAnchor ?? null;
|
|
40
44
|
setVirtualIter((iter) => iter + 1);
|
|
41
45
|
}
|
|
42
46
|
debounceRef.current = setTimeout(() => setOpen(true), DEBOUNCE_DELAY);
|
|
43
47
|
}
|
|
44
|
-
}, [
|
|
48
|
+
}, [state.popoverOpen, state.popoverAnchorId, state.popoverAnchor, state.popoverContent]);
|
|
45
49
|
|
|
46
50
|
return (
|
|
47
51
|
<DeckPopoverProvider setOpen={setOpen}>
|
|
48
52
|
<Popover.Root modal={false} open={open}>
|
|
49
|
-
{
|
|
53
|
+
{state.popoverAnchor && <Popover.VirtualTrigger key={virtualIter} virtualRef={virtualRef} />}
|
|
50
54
|
{children}
|
|
51
55
|
</Popover.Root>
|
|
52
56
|
</DeckPopoverProvider>
|
|
53
57
|
);
|
|
54
58
|
};
|
|
55
59
|
|
|
60
|
+
// Extracts the subject from popover content if it has one, otherwise returns the content as-is.
|
|
61
|
+
const getPopoverSubject = (content: unknown): unknown =>
|
|
62
|
+
content && typeof content === 'object' && 'subject' in content ? (content as { subject: unknown }).subject : content;
|
|
63
|
+
|
|
56
64
|
export const PopoverContent = () => {
|
|
57
|
-
const
|
|
65
|
+
const { t } = useTranslation(meta.id);
|
|
66
|
+
const { state, updateEphemeral } = useDeckState();
|
|
58
67
|
const { setOpen } = useDeckPopoverContext('PopoverContent');
|
|
68
|
+
const { invokeSync } = useOperationInvoker();
|
|
69
|
+
const handleNavigate = useObjectNavigate(getPopoverSubject(state.popoverContent));
|
|
70
|
+
|
|
71
|
+
const handleClose = useCallback(() => {
|
|
72
|
+
setOpen(false);
|
|
73
|
+
updateEphemeral((state) => ({
|
|
74
|
+
...state,
|
|
75
|
+
popoverOpen: false,
|
|
76
|
+
popoverAnchor: undefined,
|
|
77
|
+
popoverAnchorId: undefined,
|
|
78
|
+
popoverSide: undefined,
|
|
79
|
+
}));
|
|
80
|
+
}, [updateEphemeral]);
|
|
59
81
|
|
|
60
|
-
const
|
|
82
|
+
const handleInteractOutside = useCallback(
|
|
61
83
|
(event: KeyboardEvent | PopoverContentInteractOutsideEvent) => {
|
|
62
84
|
if (
|
|
63
85
|
// TODO(thure): CodeMirror should not focus itself when it updates.
|
|
@@ -66,36 +88,52 @@ export const PopoverContent = () => {
|
|
|
66
88
|
) {
|
|
67
89
|
event.preventDefault();
|
|
68
90
|
} else {
|
|
69
|
-
|
|
70
|
-
layout.popoverOpen = false;
|
|
71
|
-
layout.popoverAnchor = undefined;
|
|
72
|
-
layout.popoverAnchorId = undefined;
|
|
73
|
-
layout.popoverSide = undefined;
|
|
91
|
+
handleClose();
|
|
74
92
|
}
|
|
75
93
|
},
|
|
76
|
-
[
|
|
94
|
+
[handleClose],
|
|
77
95
|
);
|
|
78
96
|
|
|
79
|
-
const collisionBoundaries: HTMLElement[] = useMemo(() => {
|
|
80
|
-
const closest = layout.popoverAnchor?.closest('[data-popover-collision-boundary]') as
|
|
81
|
-
| HTMLElement
|
|
82
|
-
| null
|
|
83
|
-
| undefined;
|
|
84
|
-
return closest ? [closest] : [];
|
|
85
|
-
}, [layout.popoverAnchor]);
|
|
86
|
-
|
|
87
97
|
return (
|
|
88
98
|
<Popover.Portal>
|
|
89
99
|
<Popover.Content
|
|
90
|
-
side={
|
|
91
|
-
onInteractOutside={handleClose}
|
|
92
|
-
onEscapeKeyDown={handleClose}
|
|
93
|
-
collisionBoundary={collisionBoundaries}
|
|
100
|
+
side={state.popoverSide}
|
|
94
101
|
sticky='always'
|
|
95
102
|
hideWhenDetached
|
|
103
|
+
onInteractOutside={handleInteractOutside}
|
|
104
|
+
onEscapeKeyDown={handleInteractOutside}
|
|
96
105
|
>
|
|
97
106
|
<Popover.Viewport>
|
|
98
|
-
|
|
107
|
+
{/* TODO(burdon): Set/disable column context. */}
|
|
108
|
+
{state.popoverKind === 'base' && <Surface.Surface role='popover' data={state.popoverContent} limit={1} />}
|
|
109
|
+
{state.popoverKind === 'card' && (
|
|
110
|
+
<Card.Root border={false} classNames='dx-card-popover'>
|
|
111
|
+
<Card.Toolbar>
|
|
112
|
+
{/* TODO(wittjosiah): Cleaner way to handle no drag handle in toolbar? */}
|
|
113
|
+
{state.popoverContentRef ? (
|
|
114
|
+
<Card.ToolbarIconButton
|
|
115
|
+
icon='ph--arrow-square-out--regular'
|
|
116
|
+
iconOnly
|
|
117
|
+
label={t('open item label')}
|
|
118
|
+
onClick={() => {
|
|
119
|
+
invokeSync(LayoutOperation.Open, {
|
|
120
|
+
subject: [state.popoverContentRef!],
|
|
121
|
+
});
|
|
122
|
+
}}
|
|
123
|
+
/>
|
|
124
|
+
) : (
|
|
125
|
+
<div />
|
|
126
|
+
)}
|
|
127
|
+
{state.popoverTitle ? (
|
|
128
|
+
<Card.Title onClick={handleNavigate}>{toLocalizedString(state.popoverTitle, t)}</Card.Title>
|
|
129
|
+
) : (
|
|
130
|
+
<span />
|
|
131
|
+
)}
|
|
132
|
+
<Card.CloseIconButton onClick={handleClose} />
|
|
133
|
+
</Card.Toolbar>
|
|
134
|
+
<Surface.Surface role='card--content' data={state.popoverContent} limit={1} />
|
|
135
|
+
</Card.Root>
|
|
136
|
+
)}
|
|
99
137
|
</Popover.Viewport>
|
|
100
138
|
<Popover.Arrow />
|
|
101
139
|
</Popover.Content>
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import React from 'react';
|
|
6
6
|
|
|
7
|
-
import { Surface } from '@dxos/app-framework';
|
|
7
|
+
import { Surface } from '@dxos/app-framework/ui';
|
|
8
8
|
import { useLandmarkMover } from '@dxos/react-ui';
|
|
9
9
|
|
|
10
10
|
export const StatusBar = ({ showHints }: { showHints?: boolean }) => {
|
|
@@ -12,11 +12,11 @@ export const StatusBar = ({ showHints }: { showHints?: boolean }) => {
|
|
|
12
12
|
return (
|
|
13
13
|
<div
|
|
14
14
|
role='contentinfo'
|
|
15
|
-
className='fixed
|
|
15
|
+
className='fixed bottom-0 inset-x-0 h-(--dx-statusbar-size) border-y border-separator z-[2] flex text-description'
|
|
16
16
|
{...mover}
|
|
17
17
|
>
|
|
18
|
-
{showHints && <Surface role='hints' limit={1} />}
|
|
19
|
-
<Surface role='status-bar' limit={1} />
|
|
18
|
+
{showHints && <Surface.Surface role='hints' limit={1} />}
|
|
19
|
+
<Surface.Surface role='status-bar' limit={1} />
|
|
20
20
|
</div>
|
|
21
21
|
);
|
|
22
22
|
};
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import React from 'react';
|
|
6
6
|
|
|
7
|
-
import { type
|
|
7
|
+
import { type LayoutOperation } from '@dxos/app-toolkit';
|
|
8
8
|
import {
|
|
9
9
|
Button,
|
|
10
10
|
Icon,
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
useTranslation,
|
|
15
15
|
} from '@dxos/react-ui';
|
|
16
16
|
|
|
17
|
-
import {
|
|
17
|
+
import { meta } from '../../meta';
|
|
18
18
|
|
|
19
19
|
// TODO(wittjosiah): Render remaining duration as a progress bar within the toast.
|
|
20
20
|
export const Toast = ({
|
|
@@ -28,14 +28,14 @@ export const Toast = ({
|
|
|
28
28
|
closeLabel,
|
|
29
29
|
onAction,
|
|
30
30
|
onOpenChange,
|
|
31
|
-
}:
|
|
32
|
-
const { t } = useTranslation(
|
|
31
|
+
}: LayoutOperation.Toast & Pick<ToastRootProps, 'onOpenChange'>) => {
|
|
32
|
+
const { t } = useTranslation(meta.id);
|
|
33
33
|
|
|
34
34
|
return (
|
|
35
35
|
<NaturalToast.Root data-testid={id} defaultOpen duration={duration} onOpenChange={onOpenChange}>
|
|
36
36
|
<NaturalToast.Body>
|
|
37
37
|
<NaturalToast.Title classNames='items-center'>
|
|
38
|
-
{icon && <Icon icon={icon}
|
|
38
|
+
{icon && <Icon icon={icon} classNames='inline mr-1' />}
|
|
39
39
|
{title && <span>{toLocalizedString(title, t)}</span>}
|
|
40
40
|
</NaturalToast.Title>
|
|
41
41
|
{description && (
|
|
@@ -59,3 +59,28 @@ export const Toast = ({
|
|
|
59
59
|
</NaturalToast.Root>
|
|
60
60
|
);
|
|
61
61
|
};
|
|
62
|
+
|
|
63
|
+
export type ToasterProps = {
|
|
64
|
+
toasts?: LayoutOperation.Toast[];
|
|
65
|
+
onDismissToast?: (id: string) => void;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export const Toaster = ({ toasts, onDismissToast }: ToasterProps) => {
|
|
69
|
+
return (
|
|
70
|
+
<>
|
|
71
|
+
{toasts?.map((toast) => (
|
|
72
|
+
<Toast
|
|
73
|
+
{...toast}
|
|
74
|
+
key={toast.id}
|
|
75
|
+
onOpenChange={(open: boolean) => {
|
|
76
|
+
if (!open) {
|
|
77
|
+
onDismissToast?.(toast.id);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return open;
|
|
81
|
+
}}
|
|
82
|
+
/>
|
|
83
|
+
))}
|
|
84
|
+
</>
|
|
85
|
+
);
|
|
86
|
+
};
|
|
@@ -2,24 +2,33 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import '@
|
|
6
|
-
|
|
7
|
-
import { type StoryObj, type Meta } from '@storybook/react-vite';
|
|
5
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
8
6
|
import React from 'react';
|
|
9
7
|
|
|
10
|
-
import {
|
|
8
|
+
import { Capability, Plugin } from '@dxos/app-framework';
|
|
11
9
|
import { withPluginManager } from '@dxos/app-framework/testing';
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
10
|
+
import { AppActivationEvents } from '@dxos/app-toolkit';
|
|
11
|
+
import { corePlugins } from '@dxos/plugin-testing';
|
|
12
|
+
import { withLayout, withTheme } from '@dxos/react-ui/testing';
|
|
14
13
|
import { Stack } from '@dxos/react-ui-stack';
|
|
15
|
-
import { withTheme, withLayout } from '@dxos/storybook-utils';
|
|
16
14
|
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
15
|
+
import { DeckState } from '../../capabilities';
|
|
16
|
+
import { meta as pluginMeta } from '../../meta';
|
|
19
17
|
import { translations } from '../../translations';
|
|
20
18
|
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
import { Plank } from './Plank';
|
|
20
|
+
|
|
21
|
+
const TestPlugin = Plugin.define(pluginMeta).pipe(
|
|
22
|
+
Plugin.addModule({
|
|
23
|
+
id: Capability.getModuleTag(DeckState),
|
|
24
|
+
activatesOn: AppActivationEvents.AppGraphReady,
|
|
25
|
+
activate: () => DeckState(),
|
|
26
|
+
}),
|
|
27
|
+
Plugin.make,
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
const meta = {
|
|
31
|
+
title: 'plugins/plugin-deck/components/Plank',
|
|
23
32
|
component: Plank,
|
|
24
33
|
render: (args) => {
|
|
25
34
|
return (
|
|
@@ -29,21 +38,21 @@ const meta: Meta<PlankProps> = {
|
|
|
29
38
|
);
|
|
30
39
|
},
|
|
31
40
|
decorators: [
|
|
41
|
+
withTheme(),
|
|
42
|
+
withLayout({ layout: 'fullscreen' }),
|
|
32
43
|
withPluginManager({
|
|
33
|
-
plugins: [
|
|
34
|
-
capabilities: () => DeckStateFactory(),
|
|
44
|
+
plugins: [...corePlugins(), TestPlugin()],
|
|
35
45
|
}),
|
|
36
|
-
withTheme,
|
|
37
|
-
withLayout({ fullscreen: true }),
|
|
38
46
|
],
|
|
39
47
|
parameters: {
|
|
48
|
+
layout: 'fullscreen',
|
|
40
49
|
translations,
|
|
41
50
|
},
|
|
42
|
-
}
|
|
51
|
+
} satisfies Meta<typeof Plank>;
|
|
43
52
|
|
|
44
53
|
export default meta;
|
|
45
54
|
|
|
46
|
-
type Story = StoryObj<
|
|
55
|
+
type Story = StoryObj<typeof meta>;
|
|
47
56
|
|
|
48
57
|
// TODO(burdon): Need to define surface provider?
|
|
49
58
|
export const Default: Story = {
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import { useFocusFinders } from '@fluentui/react-tabster';
|
|
5
6
|
import React, {
|
|
6
7
|
type KeyboardEvent,
|
|
7
8
|
type PropsWithChildren,
|
|
@@ -12,33 +13,32 @@ import React, {
|
|
|
12
13
|
useRef,
|
|
13
14
|
} from 'react';
|
|
14
15
|
|
|
15
|
-
import {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
createIntent,
|
|
19
|
-
useCapability,
|
|
20
|
-
useAppGraph,
|
|
21
|
-
useIntentDispatcher,
|
|
22
|
-
} from '@dxos/app-framework';
|
|
16
|
+
import { Surface, useOperationInvoker } from '@dxos/app-framework/ui';
|
|
17
|
+
import { LayoutOperation } from '@dxos/app-toolkit';
|
|
18
|
+
import { useAppGraph } from '@dxos/app-toolkit/ui';
|
|
23
19
|
import { debounce } from '@dxos/async';
|
|
24
|
-
import {
|
|
20
|
+
import { type Node, useNode } from '@dxos/plugin-graph';
|
|
25
21
|
import { ATTENDABLE_PATH_SEPARATOR, useAttentionAttributes } from '@dxos/react-ui-attention';
|
|
26
22
|
import { StackItem, railGridHorizontal } from '@dxos/react-ui-stack';
|
|
27
|
-
import { mainIntrinsicSize, mx } from '@dxos/
|
|
23
|
+
import { mainIntrinsicSize, mx } from '@dxos/ui-theme';
|
|
28
24
|
|
|
29
|
-
import {
|
|
25
|
+
import { useCompanions, useDeckState, useMainSize, useSelectedCompanion } from '../../hooks';
|
|
26
|
+
import { parseEntryId } from '../../layout';
|
|
27
|
+
import { DeckOperation, type DeckSettingsProps, type LayoutMode, type ResolvedPart } from '../../types';
|
|
28
|
+
|
|
29
|
+
import { PlankError, PlankErrorFallback } from './PlankError';
|
|
30
30
|
import { PlankHeading } from './PlankHeading';
|
|
31
31
|
import { PlankLoading } from './PlankLoading';
|
|
32
|
-
import { DeckCapabilities } from '../../capabilities';
|
|
33
|
-
import { useMainSize, useCompanions } from '../../hooks';
|
|
34
|
-
import { parseEntryId } from '../../layout';
|
|
35
|
-
import { DeckAction, type LayoutMode, type ResolvedPart, type DeckSettingsProps } from '../../types';
|
|
36
32
|
|
|
37
33
|
const UNKNOWN_ID = 'unknown_id';
|
|
38
34
|
|
|
35
|
+
//
|
|
36
|
+
// Plank
|
|
37
|
+
//
|
|
38
|
+
|
|
39
39
|
export type PlankProps = Pick<PlankComponentProps, 'layoutMode' | 'part' | 'path' | 'order' | 'active' | 'settings'> & {
|
|
40
40
|
id?: string;
|
|
41
|
-
|
|
41
|
+
companionVariant?: string;
|
|
42
42
|
};
|
|
43
43
|
|
|
44
44
|
// TODO(burdon): Factor out conditional rendering.
|
|
@@ -49,25 +49,31 @@ export type PlankProps = Pick<PlankComponentProps, 'layoutMode' | 'part' | 'path
|
|
|
49
49
|
// benefits. I think where we anticipate users will definitely want to quickly switch between showing and hiding entire
|
|
50
50
|
// articles, over the (again probably large) performance benefit that unmounting them would confer, we can mount and
|
|
51
51
|
// hide them, but I think that scenario in its most unambiguous form is probably rare. You could extrapolate
|
|
52
|
-
// the scenario to include all
|
|
53
|
-
// don
|
|
52
|
+
// the scenario to include all "potential" planks such as companions, which we could keep mounted and hidden, but I
|
|
53
|
+
// don't think the resulting performance would be acceptable. I think the real issue is "perceived performance" which
|
|
54
54
|
// has mitigations that are in between mounting and un-mounting since both of those have tradeoffs; we may need one or more
|
|
55
|
-
//
|
|
55
|
+
// "partially-mounted" experiences, like loading skeletons at the simple end, or screenshots of "sleeping" planks at
|
|
56
56
|
// the advanced end.
|
|
57
57
|
|
|
58
58
|
/**
|
|
59
59
|
* A Plank is the main container for surfaces within a Deck.
|
|
60
60
|
* It may be paired with a companion plank that enables the user to select one of multiple companion surfaces.
|
|
61
61
|
*/
|
|
62
|
-
export const Plank = memo(({ id = UNKNOWN_ID,
|
|
62
|
+
export const Plank = memo(({ id = UNKNOWN_ID, companionVariant, ...props }: PlankProps) => {
|
|
63
63
|
const { graph } = useAppGraph();
|
|
64
64
|
const node = useNode(graph, id);
|
|
65
65
|
const companions = useCompanions(id);
|
|
66
|
-
const
|
|
67
|
-
const
|
|
66
|
+
const { companionId } = useSelectedCompanion(companions, companionVariant);
|
|
67
|
+
const resolvedCompanionId = companionVariant ? companionId : undefined;
|
|
68
|
+
const currentCompanion = companions.find(({ id }) => id === resolvedCompanionId);
|
|
69
|
+
const hasCompanion = !!(resolvedCompanionId && currentCompanion);
|
|
68
70
|
|
|
69
71
|
return (
|
|
70
|
-
<PlankContainer
|
|
72
|
+
<PlankContainer
|
|
73
|
+
solo={props.part === 'solo'}
|
|
74
|
+
companion={hasCompanion}
|
|
75
|
+
encapsulate={!!props.settings?.encapsulatedPlanks}
|
|
76
|
+
>
|
|
71
77
|
<PlankComponent
|
|
72
78
|
id={id}
|
|
73
79
|
node={node}
|
|
@@ -78,7 +84,7 @@ export const Plank = memo(({ id = UNKNOWN_ID, companionId, ...props }: PlankProp
|
|
|
78
84
|
/>
|
|
79
85
|
{hasCompanion && (
|
|
80
86
|
<PlankComponent
|
|
81
|
-
id={
|
|
87
|
+
id={resolvedCompanionId}
|
|
82
88
|
node={currentCompanion}
|
|
83
89
|
primary={node}
|
|
84
90
|
companions={companions}
|
|
@@ -91,7 +97,13 @@ export const Plank = memo(({ id = UNKNOWN_ID, companionId, ...props }: PlankProp
|
|
|
91
97
|
);
|
|
92
98
|
});
|
|
93
99
|
|
|
94
|
-
|
|
100
|
+
//
|
|
101
|
+
// PlankContainer
|
|
102
|
+
//
|
|
103
|
+
|
|
104
|
+
type PlankContainerProps = PropsWithChildren<{ solo: boolean; companion: boolean; encapsulate: boolean }>;
|
|
105
|
+
|
|
106
|
+
const PlankContainer = ({ children, solo, companion, encapsulate }: PlankContainerProps) => {
|
|
95
107
|
const sizeAttrs = useMainSize();
|
|
96
108
|
if (!solo) {
|
|
97
109
|
return children;
|
|
@@ -101,7 +113,14 @@ const PlankContainer = ({ children, solo, companion }: PropsWithChildren<{ solo:
|
|
|
101
113
|
return (
|
|
102
114
|
<div
|
|
103
115
|
role='none'
|
|
104
|
-
|
|
116
|
+
data-popover-collision-boundary={true}
|
|
117
|
+
className={mx(
|
|
118
|
+
'absolute inset-(--main-spacing) grid',
|
|
119
|
+
encapsulate && 'border border-separator rounded-sm overflow-hidden',
|
|
120
|
+
companion && 'grid-cols-[6fr_4fr]', // TODO(burdon): Resize.
|
|
121
|
+
railGridHorizontal,
|
|
122
|
+
mainIntrinsicSize,
|
|
123
|
+
)}
|
|
105
124
|
{...sizeAttrs}
|
|
106
125
|
>
|
|
107
126
|
{children}
|
|
@@ -109,6 +128,10 @@ const PlankContainer = ({ children, solo, companion }: PropsWithChildren<{ solo:
|
|
|
109
128
|
);
|
|
110
129
|
};
|
|
111
130
|
|
|
131
|
+
//
|
|
132
|
+
// PlankComponent
|
|
133
|
+
//
|
|
134
|
+
|
|
112
135
|
type PlankComponentProps = {
|
|
113
136
|
layoutMode: LayoutMode;
|
|
114
137
|
id: string;
|
|
@@ -116,11 +139,10 @@ type PlankComponentProps = {
|
|
|
116
139
|
path?: string[];
|
|
117
140
|
order?: number;
|
|
118
141
|
active?: string[];
|
|
119
|
-
// TODO(burdon): Change to role?
|
|
120
142
|
companioned?: 'primary' | 'companion';
|
|
121
|
-
node?: Node;
|
|
122
|
-
primary?: Node;
|
|
123
|
-
companions?: Node[];
|
|
143
|
+
node?: Node.Node;
|
|
144
|
+
primary?: Node.Node;
|
|
145
|
+
companions?: Node.Node[];
|
|
124
146
|
settings?: DeckSettingsProps;
|
|
125
147
|
};
|
|
126
148
|
|
|
@@ -138,8 +160,10 @@ const PlankComponent = memo(
|
|
|
138
160
|
companions,
|
|
139
161
|
settings,
|
|
140
162
|
}: PlankComponentProps) => {
|
|
141
|
-
const {
|
|
142
|
-
const {
|
|
163
|
+
const { invokePromise } = useOperationInvoker();
|
|
164
|
+
const { state, deck } = useDeckState();
|
|
165
|
+
const { popoverAnchorId, scrollIntoView } = state;
|
|
166
|
+
const { findFirstFocusable } = useFocusFinders();
|
|
143
167
|
const canResize = layoutMode === 'deck';
|
|
144
168
|
|
|
145
169
|
const attentionAttrs = useAttentionAttributes(primary?.id ?? id);
|
|
@@ -156,29 +180,32 @@ const PlankComponent = memo(
|
|
|
156
180
|
|
|
157
181
|
const handleSizeChange = useCallback(
|
|
158
182
|
debounce((nextSize: number) => {
|
|
159
|
-
return
|
|
183
|
+
return invokePromise(DeckOperation.UpdatePlankSize, { id: sizeKey, size: nextSize });
|
|
160
184
|
}, 200),
|
|
161
|
-
[
|
|
185
|
+
[invokePromise, sizeKey],
|
|
162
186
|
);
|
|
163
187
|
|
|
164
|
-
// TODO(thure): Tabster
|
|
188
|
+
// TODO(thure): Tabster's focus group should handle moving focus to Main, but something is blocking it.
|
|
165
189
|
const handleKeyDown = useCallback((event: KeyboardEvent) => {
|
|
166
|
-
if (event.target === event.currentTarget
|
|
167
|
-
|
|
190
|
+
if (event.target === event.currentTarget) {
|
|
191
|
+
switch (event.key) {
|
|
192
|
+
case 'Escape':
|
|
193
|
+
rootElement.current?.closest('main')?.focus();
|
|
194
|
+
break;
|
|
195
|
+
case 'Enter':
|
|
196
|
+
rootElement.current && findFirstFocusable(rootElement.current)?.focus();
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
168
199
|
}
|
|
169
200
|
}, []);
|
|
170
201
|
|
|
171
202
|
useLayoutEffect(() => {
|
|
172
203
|
if (scrollIntoView === id) {
|
|
173
|
-
|
|
174
|
-
// Forcing focus to something smaller than the plank prevents large focus ring in the interim.
|
|
175
|
-
const focusable = rootElement.current?.querySelector('button') || rootElement.current;
|
|
176
|
-
focusable?.focus({ preventScroll: true });
|
|
177
|
-
layoutMode === 'deck' && focusable?.scrollIntoView({ behavior: 'smooth', inline: 'center' });
|
|
204
|
+
layoutMode === 'deck' && rootElement.current?.scrollIntoView({ behavior: 'smooth', inline: 'center' });
|
|
178
205
|
// Clear the scroll into view state once it has been actioned.
|
|
179
|
-
void
|
|
206
|
+
void invokePromise(LayoutOperation.ScrollIntoView, { subject: undefined });
|
|
180
207
|
}
|
|
181
|
-
}, [id, scrollIntoView, layoutMode]);
|
|
208
|
+
}, [id, scrollIntoView, layoutMode, invokePromise]);
|
|
182
209
|
|
|
183
210
|
const isSolo = layoutMode.startsWith('solo') && part === 'solo';
|
|
184
211
|
const isAttendable =
|
|
@@ -189,34 +216,42 @@ const PlankComponent = memo(
|
|
|
189
216
|
const data = useMemo(
|
|
190
217
|
() =>
|
|
191
218
|
node && {
|
|
219
|
+
attendableId: id,
|
|
192
220
|
subject: node.data,
|
|
193
221
|
companionTo: primary?.data,
|
|
222
|
+
properties: node.properties,
|
|
194
223
|
variant,
|
|
195
224
|
path,
|
|
196
225
|
popoverAnchorId,
|
|
197
226
|
},
|
|
198
|
-
[node, node?.data, path, popoverAnchorId, primary?.data, variant],
|
|
227
|
+
[node, node?.data, node?.properties, path, popoverAnchorId, primary?.data, variant],
|
|
199
228
|
);
|
|
200
229
|
|
|
201
230
|
// TODO(wittjosiah): Change prop to accept a component.
|
|
202
231
|
const placeholder = useMemo(() => <PlankLoading />, []);
|
|
203
232
|
|
|
204
233
|
const Root = part.startsWith('solo') ? 'article' : StackItem.Root;
|
|
234
|
+
const fullscreen = layoutMode === 'solo--fullscreen';
|
|
205
235
|
const className = mx(
|
|
206
|
-
'attention-surface relative dx-focus-ring-inset-over-all density-coarse',
|
|
207
|
-
isSolo && mainIntrinsicSize,
|
|
208
|
-
isSolo && railGridHorizontal,
|
|
236
|
+
'dx-attention-surface relative dx-focus-ring-inset-over-all dx-density-coarse',
|
|
209
237
|
isSolo && 'absolute inset-0',
|
|
238
|
+
isSolo && mainIntrinsicSize,
|
|
239
|
+
railGridHorizontal,
|
|
210
240
|
part.startsWith('solo') && 'grid',
|
|
211
|
-
part
|
|
212
|
-
|
|
213
|
-
part === '
|
|
241
|
+
part.startsWith('solo-') && 'grid-rows-subgrid row-span-2 min-w-0',
|
|
242
|
+
fullscreen && 'grid-rows-1',
|
|
243
|
+
part === 'deck' && (companioned === 'companion' ? 'border-separator! border-e' : 'border-separator! border-x'),
|
|
244
|
+
part === 'solo-companion' && 'border-separator! border-s',
|
|
245
|
+
settings?.encapsulatedPlanks &&
|
|
246
|
+
!part.startsWith('solo') &&
|
|
247
|
+
'mx-(--main-spacing) border-separator! border rounded-sm overflow-hidden',
|
|
214
248
|
);
|
|
215
249
|
|
|
216
250
|
return (
|
|
217
251
|
<Root
|
|
218
252
|
ref={rootElement}
|
|
219
253
|
data-testid='deck.plank'
|
|
254
|
+
data-popover-collision-boundary={true}
|
|
220
255
|
tabIndex={0}
|
|
221
256
|
{...(part.startsWith('solo')
|
|
222
257
|
? ({ ...sizeAttrs, className } as any)
|
|
@@ -233,32 +268,33 @@ const PlankComponent = memo(
|
|
|
233
268
|
>
|
|
234
269
|
{node ? (
|
|
235
270
|
<>
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
271
|
+
{!fullscreen && (
|
|
272
|
+
<PlankHeading
|
|
273
|
+
id={id}
|
|
274
|
+
part={part.startsWith('solo-') ? 'solo' : part}
|
|
275
|
+
node={node}
|
|
276
|
+
layoutMode={layoutMode}
|
|
277
|
+
deckEnabled={settings?.enableDeck}
|
|
278
|
+
canIncrementStart={canIncrementStart}
|
|
279
|
+
canIncrementEnd={canIncrementEnd}
|
|
280
|
+
popoverAnchorId={popoverAnchorId}
|
|
281
|
+
primaryId={primary?.id}
|
|
282
|
+
companioned={companioned}
|
|
283
|
+
companions={companions}
|
|
284
|
+
/>
|
|
285
|
+
)}
|
|
286
|
+
<Surface.Surface
|
|
250
287
|
key={node.id}
|
|
251
288
|
role='article'
|
|
252
289
|
data={data}
|
|
253
290
|
limit={1}
|
|
254
|
-
fallback={
|
|
291
|
+
fallback={PlankErrorFallback}
|
|
255
292
|
placeholder={placeholder}
|
|
256
293
|
/>
|
|
257
294
|
</>
|
|
258
295
|
) : (
|
|
259
296
|
<PlankError id={id} part={part} />
|
|
260
297
|
)}
|
|
261
|
-
|
|
262
298
|
{canResize && <StackItem.ResizeHandle />}
|
|
263
299
|
</Root>
|
|
264
300
|
);
|