@dxos/plugin-deck 0.9.0 → 0.9.1-staging.ee54ba693a
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/PLUGIN.mdl +3 -1
- package/dist/lib/neutral/{DeckLayout-DEURA3KR.mjs → DeckLayout-B3RUUV5P.mjs} +36 -22
- package/dist/lib/neutral/DeckLayout-B3RUUV5P.mjs.map +7 -0
- package/dist/lib/neutral/DeckPlugin.mjs +4 -8
- package/dist/lib/neutral/DeckPlugin.mjs.map +4 -4
- package/dist/lib/neutral/DeckSettings-Z7GMB7XJ.mjs +32 -0
- package/dist/lib/neutral/DeckSettings-Z7GMB7XJ.mjs.map +7 -0
- package/dist/lib/neutral/{add-toast-TNB6DXWU.mjs → add-toast-BHNEH5UY.mjs} +2 -2
- package/dist/lib/neutral/{adjust-HNU5CCRO.mjs → adjust-MJB6UMRQ.mjs} +16 -10
- package/dist/lib/neutral/adjust-MJB6UMRQ.mjs.map +7 -0
- package/dist/lib/neutral/{app-graph-builder-HMLT627T.mjs → app-graph-builder-2F7P4IFQ.mjs} +8 -7
- package/dist/lib/neutral/app-graph-builder-2F7P4IFQ.mjs.map +7 -0
- package/dist/lib/neutral/capabilities/index.mjs +8 -8
- package/dist/lib/neutral/{check-app-scheme-INSOF72J.mjs → check-app-scheme-HSAORHHX.mjs} +2 -2
- package/dist/lib/neutral/chunk-FKGYHBUB.mjs +8 -0
- package/dist/lib/neutral/{chunk-BS4EOYMK.mjs → chunk-ICOJ4GMB.mjs} +37 -19
- package/dist/lib/neutral/chunk-ICOJ4GMB.mjs.map +7 -0
- package/dist/lib/neutral/chunk-KY7LMF4D.mjs +46 -0
- package/dist/lib/neutral/chunk-KY7LMF4D.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-324PPIZB.mjs → chunk-KZFJ4PBT.mjs} +4 -4
- package/dist/lib/neutral/chunk-KZFJ4PBT.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-GBIGQKYW.mjs → chunk-PP32NEVY.mjs} +4 -4
- package/dist/lib/neutral/chunk-PP32NEVY.mjs.map +7 -0
- package/dist/lib/neutral/chunk-SONATB35.mjs +20 -0
- package/dist/lib/neutral/chunk-SONATB35.mjs.map +7 -0
- package/dist/lib/neutral/chunk-Z2B5RSVI.mjs +1096 -0
- package/dist/lib/neutral/chunk-Z2B5RSVI.mjs.map +7 -0
- package/dist/lib/neutral/{close-ASKR22A6.mjs → close-2YGB5IIP.mjs} +4 -3
- package/dist/lib/neutral/{close-ASKR22A6.mjs.map → close-2YGB5IIP.mjs.map} +1 -1
- package/dist/lib/neutral/components/index.mjs +201 -16
- package/dist/lib/neutral/components/index.mjs.map +4 -4
- package/dist/lib/neutral/containers/index.mjs +6 -11
- package/dist/lib/neutral/containers/index.mjs.map +3 -3
- package/dist/lib/neutral/hooks/index.mjs +101 -17
- package/dist/lib/neutral/hooks/index.mjs.map +4 -4
- package/dist/lib/neutral/index.mjs +18 -2
- package/dist/lib/neutral/meta.json +1 -1
- package/dist/lib/neutral/meta.mjs +1 -1
- package/dist/lib/neutral/{notification-tracker-P36322BH.mjs → notification-tracker-Y5CRTWJM.mjs} +12 -10
- package/dist/lib/neutral/notification-tracker-Y5CRTWJM.mjs.map +7 -0
- package/dist/lib/neutral/{open-5OYNO3RT.mjs → open-P6XQ56M7.mjs} +8 -7
- package/dist/lib/neutral/open-P6XQ56M7.mjs.map +7 -0
- package/dist/lib/neutral/operations/index.mjs +1 -1
- package/dist/lib/neutral/plugin.mjs +2 -2
- package/dist/lib/neutral/{react-root-HH5DEUOG.mjs → react-root-E6TAFHX6.mjs} +2 -2
- package/dist/lib/neutral/react-root-E6TAFHX6.mjs.map +7 -0
- package/dist/lib/neutral/{react-surface-3UVVCK3O.mjs → react-surface-H63FXUK3.mjs} +5 -6
- package/dist/lib/neutral/react-surface-H63FXUK3.mjs.map +7 -0
- package/dist/lib/neutral/{revert-workspace-B2QLT2C4.mjs → revert-workspace-RXWP2TEE.mjs} +2 -2
- package/dist/lib/neutral/{scroll-into-view-B52C3PJO.mjs → scroll-into-view-HFV5EGYZ.mjs} +2 -2
- package/dist/lib/neutral/{set-PA35ONXO.mjs → set-HOOVB7E4.mjs} +4 -3
- package/dist/lib/neutral/{set-PA35ONXO.mjs.map → set-HOOVB7E4.mjs.map} +1 -1
- package/dist/lib/neutral/{set-layout-mode-RPCCPQRB.mjs → set-layout-mode-XAGSZZGB.mjs} +2 -2
- package/dist/lib/neutral/{settings-EGNYUM4T.mjs → settings-6CDQEB6B.mjs} +3 -3
- package/dist/lib/neutral/settings-6CDQEB6B.mjs.map +7 -0
- package/dist/lib/neutral/{state-IIDXMQUO.mjs → state-F4X5GPGZ.mjs} +4 -3
- package/dist/lib/neutral/state-F4X5GPGZ.mjs.map +7 -0
- package/dist/lib/neutral/{switch-workspace-LZF4KZXH.mjs → switch-workspace-PA7N6EUX.mjs} +4 -4
- package/dist/lib/neutral/switch-workspace-PA7N6EUX.mjs.map +7 -0
- package/dist/lib/neutral/translations.mjs +3 -3
- package/dist/lib/neutral/translations.mjs.map +3 -3
- package/dist/lib/neutral/types/index.mjs +11 -1
- package/dist/lib/neutral/{update-companion-YUCZZVGY.mjs → update-companion-6A2SKQAI.mjs} +14 -6
- package/dist/lib/neutral/update-companion-6A2SKQAI.mjs.map +7 -0
- package/dist/lib/neutral/{update-complementary-7FZNB55J.mjs → update-complementary-K55I5EV5.mjs} +2 -2
- package/dist/lib/neutral/{update-dialog-FNQTSSAP.mjs → update-dialog-Z3GEXMVV.mjs} +2 -2
- package/dist/lib/neutral/{update-plank-size-3YW4NXEY.mjs → update-plank-size-BTESVV7N.mjs} +2 -2
- package/dist/lib/neutral/{update-popover-G2VUD7E6.mjs → update-popover-QEVDSZSH.mjs} +2 -2
- package/dist/lib/neutral/{update-sidebar-KRHPUHUB.mjs → update-sidebar-VSRCN47U.mjs} +2 -2
- package/dist/lib/neutral/{url-handler-A6HLW4RB.mjs → url-handler-ERZXXEYR.mjs} +11 -10
- package/dist/lib/neutral/url-handler-ERZXXEYR.mjs.map +7 -0
- package/dist/types/dx.config.d.ts +28 -0
- package/dist/types/dx.config.d.ts.map +1 -0
- package/dist/types/src/DeckPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -2
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +8 -196
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/notification-tracker.d.ts +1 -1
- package/dist/types/src/capabilities/notification-tracker.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-root.d.ts +1 -5
- package/dist/types/src/capabilities/react-root.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts +2 -2
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/settings.d.ts +1 -3
- package/dist/types/src/capabilities/settings.d.ts.map +1 -1
- package/dist/types/src/capabilities/state.d.ts +1 -187
- package/dist/types/src/capabilities/state.d.ts.map +1 -1
- package/dist/types/src/capabilities/tools.d.ts +1 -1
- package/dist/types/src/capabilities/url-handler.d.ts +1 -1
- package/dist/types/src/components/Companion/Companion.d.ts +17 -0
- package/dist/types/src/components/Companion/Companion.d.ts.map +1 -0
- package/dist/types/src/components/Companion/index.d.ts +2 -0
- package/dist/types/src/components/Companion/index.d.ts.map +1 -0
- package/dist/types/src/components/Matrix/Matrix.d.ts +1 -1
- package/dist/types/src/components/Matrix/Matrix.d.ts.map +1 -1
- package/dist/types/src/components/Matrix/Matrix.stories.d.ts +2 -2
- package/dist/types/src/components/Matrix/Matrix.stories.d.ts.map +1 -1
- package/dist/types/src/components/Matrix/index.d.ts +1 -1
- package/dist/types/src/components/Matrix/index.d.ts.map +1 -1
- package/dist/types/src/components/Pane/Pane.d.ts +45 -0
- package/dist/types/src/components/Pane/Pane.d.ts.map +1 -0
- package/dist/types/src/components/Pane/Pane.stories.d.ts +7 -0
- package/dist/types/src/components/Pane/Pane.stories.d.ts.map +1 -0
- package/dist/types/src/components/Pane/index.d.ts +2 -0
- package/dist/types/src/components/Pane/index.d.ts.map +1 -0
- package/dist/types/src/components/Plank/Plank.d.ts +74 -0
- package/dist/types/src/components/Plank/Plank.d.ts.map +1 -0
- package/dist/types/src/components/Plank/Plank.stories.d.ts +6 -0
- package/dist/types/src/components/Plank/Plank.stories.d.ts.map +1 -0
- package/dist/types/src/components/Plank/index.d.ts +2 -0
- package/dist/types/src/components/Plank/index.d.ts.map +1 -0
- package/dist/types/src/components/index.d.ts +3 -2
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/containers/Deck/Banner.d.ts.map +1 -1
- package/dist/types/src/containers/Deck/Deck.d.ts +1 -1
- package/dist/types/src/containers/Deck/Deck.d.ts.map +1 -1
- package/dist/types/src/containers/Deck/Deck.stories.d.ts +2 -2
- package/dist/types/src/containers/Deck/DeckPlank.d.ts +21 -0
- package/dist/types/src/containers/Deck/DeckPlank.d.ts.map +1 -0
- package/dist/types/src/containers/Deck/DeckViewport.d.ts +3 -1
- package/dist/types/src/containers/Deck/DeckViewport.d.ts.map +1 -1
- package/dist/types/src/containers/{Plank → Deck}/PlankControls.d.ts +3 -10
- package/dist/types/src/containers/Deck/PlankControls.d.ts.map +1 -0
- package/dist/types/src/containers/Deck/PlankFallback.d.ts +6 -0
- package/dist/types/src/containers/Deck/PlankFallback.d.ts.map +1 -0
- package/dist/types/src/containers/Deck/StatusBar.d.ts.map +1 -1
- package/dist/types/src/containers/Deck/useDeckPlank.d.ts +49 -0
- package/dist/types/src/containers/Deck/useDeckPlank.d.ts.map +1 -0
- package/dist/types/src/containers/DeckLayout/DeckLayout.stories.d.ts +2 -2
- package/dist/types/src/containers/DeckLayout/DeckLayout.stories.d.ts.map +1 -1
- package/dist/types/src/containers/DeckLayout/Popover.d.ts.map +1 -1
- package/dist/types/src/{components → containers}/DeckSettings/DeckSettings.d.ts +1 -1
- package/dist/types/src/containers/DeckSettings/DeckSettings.d.ts.map +1 -0
- package/dist/types/src/{components → containers}/DeckSettings/DeckSettings.stories.d.ts +2 -2
- package/dist/types/src/{components → containers}/DeckSettings/DeckSettings.stories.d.ts.map +1 -1
- package/dist/types/src/containers/DeckSettings/index.d.ts.map +1 -0
- package/dist/types/src/containers/Sidebar/ComplementarySidebar.d.ts.map +1 -1
- package/dist/types/src/containers/index.d.ts +1 -1
- package/dist/types/src/containers/index.d.ts.map +1 -1
- 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/useCompanionSplit.d.ts +28 -0
- package/dist/types/src/hooks/useCompanionSplit.d.ts.map +1 -0
- package/dist/types/src/hooks/useCompanions.d.ts +11 -7
- package/dist/types/src/hooks/useCompanions.d.ts.map +1 -1
- package/dist/types/src/hooks/useDeckCompanions.d.ts +2 -2
- package/dist/types/src/hooks/useDeckCompanions.d.ts.map +1 -1
- package/dist/types/src/hooks/useDeckState.d.ts +1 -1
- package/dist/types/src/hooks/useDeckState.d.ts.map +1 -1
- package/dist/types/src/hooks/useSelectedCompanionVariant.d.ts +6 -0
- package/dist/types/src/hooks/useSelectedCompanionVariant.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +1 -0
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +32 -2
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/operations/adjust.d.ts.map +1 -1
- package/dist/types/src/operations/open.d.ts.map +1 -1
- package/dist/types/src/operations/switch-workspace.d.ts.map +1 -1
- package/dist/types/src/operations/update-companion.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +2 -2
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/DeckCapabilities.d.ts +4 -4
- package/dist/types/src/types/DeckCapabilities.d.ts.map +1 -1
- package/dist/types/src/types/DeckOperation.d.ts +2 -2
- package/dist/types/src/types/DeckOperation.d.ts.map +1 -1
- package/dist/types/src/types/index.d.ts +1 -0
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/src/types/schema.d.ts +11 -9
- package/dist/types/src/types/schema.d.ts.map +1 -1
- package/dist/types/src/types/surface.d.ts +12 -0
- package/dist/types/src/types/surface.d.ts.map +1 -0
- package/dist/types/src/util/companion-view-state.d.ts +16 -0
- package/dist/types/src/util/companion-view-state.d.ts.map +1 -0
- package/dist/types/src/util/index.d.ts +1 -0
- package/dist/types/src/util/index.d.ts.map +1 -1
- package/dist/types/src/util/plank-url-params.d.ts +2 -0
- package/dist/types/src/util/plank-url-params.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dx.config.ts +35 -0
- package/package.json +50 -48
- package/src/DeckPlugin.test.ts +1 -1
- package/src/DeckPlugin.ts +2 -3
- package/src/capabilities/app-graph-builder.ts +7 -6
- package/src/capabilities/check-app-scheme.ts +3 -3
- package/src/capabilities/notification-tracker.ts +11 -9
- package/src/capabilities/react-root.tsx +1 -1
- package/src/capabilities/react-surface.tsx +4 -5
- package/src/capabilities/settings.ts +2 -2
- package/src/capabilities/state.ts +1 -1
- package/src/capabilities/url-handler.ts +7 -15
- package/src/components/Companion/Companion.tsx +91 -0
- package/src/components/Companion/index.ts +5 -0
- package/src/components/Matrix/Matrix.stories.tsx +15 -27
- package/src/components/Matrix/Matrix.tsx +3 -3
- package/src/components/Matrix/SPEC.md +1 -1
- package/src/components/Matrix/index.ts +1 -1
- package/src/components/Pane/Pane.stories.tsx +92 -0
- package/src/components/Pane/Pane.tsx +178 -0
- package/src/components/Pane/index.ts +5 -0
- package/src/components/Plank/Plank.stories.tsx +103 -0
- package/src/components/Plank/Plank.tsx +149 -0
- package/src/components/Plank/index.ts +5 -0
- package/src/components/index.ts +3 -4
- package/src/containers/Deck/Banner.tsx +5 -4
- package/src/containers/Deck/Deck.tsx +3 -3
- package/src/containers/Deck/DeckPlank.tsx +187 -0
- package/src/containers/Deck/DeckViewport.tsx +118 -246
- package/src/containers/{Plank → Deck}/PlankControls.tsx +21 -19
- package/src/containers/Deck/PlankFallback.tsx +42 -0
- package/src/containers/Deck/StatusBar.tsx +4 -2
- package/src/containers/Deck/useDeckPlank.ts +219 -0
- package/src/containers/DeckLayout/DeckLayout.stories.tsx +44 -60
- package/src/containers/DeckLayout/Dialog.tsx +1 -1
- package/src/containers/DeckLayout/Fallback.tsx +1 -1
- package/src/containers/DeckLayout/Popover.tsx +37 -20
- package/src/containers/DeckLayout/Toast.tsx +1 -1
- package/src/{components → containers}/DeckSettings/DeckSettings.stories.tsx +1 -1
- package/src/containers/DeckSettings/DeckSettings.tsx +42 -0
- package/src/containers/Sidebar/ComplementarySidebar.tsx +8 -7
- package/src/containers/Sidebar/Sidebar.tsx +1 -1
- package/src/containers/Sidebar/SidebarButton.tsx +3 -3
- package/src/containers/index.ts +1 -1
- package/src/hooks/index.ts +2 -0
- package/src/hooks/useCompanionSplit.ts +78 -0
- package/src/hooks/useCompanions.ts +39 -7
- package/src/hooks/useDeckCompanions.ts +3 -3
- package/src/hooks/useDeckState.ts +1 -1
- package/src/hooks/useSelectedCompanionVariant.ts +14 -0
- package/src/index.ts +7 -0
- package/src/meta.ts +2 -27
- package/src/operations/adjust.ts +23 -12
- package/src/operations/open.ts +12 -10
- package/src/operations/switch-workspace.ts +2 -2
- package/src/operations/update-companion.ts +10 -6
- package/src/translations.ts +3 -3
- package/src/types/DeckCapabilities.ts +6 -4
- package/src/types/DeckEvents.ts +1 -1
- package/src/types/DeckOperation.ts +3 -2
- package/src/types/index.ts +1 -0
- package/src/types/schema.ts +21 -16
- package/src/types/surface.ts +28 -0
- package/src/util/companion-view-state.ts +28 -0
- package/src/util/index.ts +1 -0
- package/src/util/plank-url-params.test.ts +5 -0
- package/src/util/plank-url-params.ts +5 -3
- package/src/util/sanitize-persisted-state.test.ts +1 -1
- package/src/util/set-active.test.ts +1 -1
- package/dist/lib/neutral/DeckLayout-DEURA3KR.mjs.map +0 -7
- package/dist/lib/neutral/DeckSettings-W5I57OXM.mjs +0 -27
- package/dist/lib/neutral/DeckSettings-W5I57OXM.mjs.map +0 -7
- package/dist/lib/neutral/adjust-HNU5CCRO.mjs.map +0 -7
- package/dist/lib/neutral/app-graph-builder-HMLT627T.mjs.map +0 -7
- package/dist/lib/neutral/chunk-324PPIZB.mjs.map +0 -7
- package/dist/lib/neutral/chunk-BS4EOYMK.mjs.map +0 -7
- package/dist/lib/neutral/chunk-GBIGQKYW.mjs.map +0 -7
- package/dist/lib/neutral/chunk-PYEY5SEC.mjs +0 -37
- package/dist/lib/neutral/chunk-PYEY5SEC.mjs.map +0 -7
- package/dist/lib/neutral/chunk-Q4W6B4IB.mjs +0 -8
- package/dist/lib/neutral/chunk-WAXJPQJI.mjs +0 -1306
- package/dist/lib/neutral/chunk-WAXJPQJI.mjs.map +0 -7
- package/dist/lib/neutral/notification-tracker-P36322BH.mjs.map +0 -7
- package/dist/lib/neutral/open-5OYNO3RT.mjs.map +0 -7
- package/dist/lib/neutral/react-root-HH5DEUOG.mjs.map +0 -7
- package/dist/lib/neutral/react-surface-3UVVCK3O.mjs.map +0 -7
- package/dist/lib/neutral/settings-EGNYUM4T.mjs.map +0 -7
- package/dist/lib/neutral/state-IIDXMQUO.mjs.map +0 -7
- package/dist/lib/neutral/switch-workspace-LZF4KZXH.mjs.map +0 -7
- package/dist/lib/neutral/update-companion-YUCZZVGY.mjs.map +0 -7
- package/dist/lib/neutral/url-handler-A6HLW4RB.mjs.map +0 -7
- package/dist/types/src/components/DeckSettings/DeckSettings.d.ts.map +0 -1
- package/dist/types/src/components/DeckSettings/index.d.ts.map +0 -1
- package/dist/types/src/containers/Plank/Plank.d.ts +0 -17
- package/dist/types/src/containers/Plank/Plank.d.ts.map +0 -1
- package/dist/types/src/containers/Plank/Plank.stories.d.ts +0 -67
- package/dist/types/src/containers/Plank/Plank.stories.d.ts.map +0 -1
- package/dist/types/src/containers/Plank/PlankComponent.d.ts +0 -17
- package/dist/types/src/containers/Plank/PlankComponent.d.ts.map +0 -1
- package/dist/types/src/containers/Plank/PlankContent.d.ts +0 -10
- package/dist/types/src/containers/Plank/PlankContent.d.ts.map +0 -1
- package/dist/types/src/containers/Plank/PlankControls.d.ts.map +0 -1
- package/dist/types/src/containers/Plank/PlankError.d.ts +0 -15
- package/dist/types/src/containers/Plank/PlankError.d.ts.map +0 -1
- package/dist/types/src/containers/Plank/PlankHeading.d.ts +0 -22
- package/dist/types/src/containers/Plank/PlankHeading.d.ts.map +0 -1
- package/dist/types/src/containers/Plank/PlankLoading.d.ts +0 -3
- package/dist/types/src/containers/Plank/PlankLoading.d.ts.map +0 -1
- package/dist/types/src/containers/Plank/PlankRoot.d.ts +0 -37
- package/dist/types/src/containers/Plank/PlankRoot.d.ts.map +0 -1
- package/dist/types/src/containers/Plank/index.d.ts +0 -4
- package/dist/types/src/containers/Plank/index.d.ts.map +0 -1
- package/src/components/DeckSettings/DeckSettings.tsx +0 -34
- package/src/containers/Plank/Plank.stories.tsx +0 -108
- package/src/containers/Plank/Plank.tsx +0 -22
- package/src/containers/Plank/PlankComponent.tsx +0 -223
- package/src/containers/Plank/PlankContent.tsx +0 -45
- package/src/containers/Plank/PlankError.tsx +0 -82
- package/src/containers/Plank/PlankHeading.tsx +0 -237
- package/src/containers/Plank/PlankLoading.tsx +0 -10
- package/src/containers/Plank/PlankRoot.tsx +0 -49
- package/src/containers/Plank/index.ts +0 -7
- /package/dist/lib/neutral/{add-toast-TNB6DXWU.mjs.map → add-toast-BHNEH5UY.mjs.map} +0 -0
- /package/dist/lib/neutral/{check-app-scheme-INSOF72J.mjs.map → check-app-scheme-HSAORHHX.mjs.map} +0 -0
- /package/dist/lib/neutral/{chunk-Q4W6B4IB.mjs.map → chunk-FKGYHBUB.mjs.map} +0 -0
- /package/dist/lib/neutral/{revert-workspace-B2QLT2C4.mjs.map → revert-workspace-RXWP2TEE.mjs.map} +0 -0
- /package/dist/lib/neutral/{scroll-into-view-B52C3PJO.mjs.map → scroll-into-view-HFV5EGYZ.mjs.map} +0 -0
- /package/dist/lib/neutral/{set-layout-mode-RPCCPQRB.mjs.map → set-layout-mode-XAGSZZGB.mjs.map} +0 -0
- /package/dist/lib/neutral/{update-complementary-7FZNB55J.mjs.map → update-complementary-K55I5EV5.mjs.map} +0 -0
- /package/dist/lib/neutral/{update-dialog-FNQTSSAP.mjs.map → update-dialog-Z3GEXMVV.mjs.map} +0 -0
- /package/dist/lib/neutral/{update-plank-size-3YW4NXEY.mjs.map → update-plank-size-BTESVV7N.mjs.map} +0 -0
- /package/dist/lib/neutral/{update-popover-G2VUD7E6.mjs.map → update-popover-QEVDSZSH.mjs.map} +0 -0
- /package/dist/lib/neutral/{update-sidebar-KRHPUHUB.mjs.map → update-sidebar-VSRCN47U.mjs.map} +0 -0
- /package/dist/types/src/{components → containers}/DeckSettings/index.d.ts +0 -0
- /package/src/{components → containers}/DeckSettings/index.ts +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/containers/Plank/PlankLoading.tsx", "../../../src/containers/Plank/PlankError.tsx", "../../../src/containers/Plank/PlankHeading.tsx", "../../../src/containers/Plank/PlankControls.tsx", "../../../src/containers/Plank/PlankRoot.tsx", "../../../src/containers/Plank/PlankComponent.tsx", "../../../src/containers/Plank/PlankContent.tsx", "../../../src/containers/Plank/Plank.tsx", "../../../src/containers/Sidebar/SidebarButton.tsx", "../../../src/containers/Sidebar/ComplementarySidebar.tsx", "../../../src/containers/Sidebar/Sidebar.tsx", "../../../src/containers/Deck/DeckContent.tsx", "../../../src/containers/Deck/Banner.tsx", "../../../src/containers/Deck/DeckRoot.tsx", "../../../src/containers/Deck/DeckViewport.tsx", "../../../src/containers/Deck/Deck.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\n// TODO(burdon): Show skeleton: https://github.com/dxos/dxos/issues/8259\nexport const PlankLoading = () => {\n return <div className='grid place-items-center dx-attention-surface' />;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useEffect, useMemo, useState } from 'react';\n\nimport { TimeoutError } from '@dxos/errors';\nimport { log } from '@dxos/log';\nimport { type Node } from '@dxos/plugin-graph';\nimport { ErrorFallback, type ErrorFallbackProps, useTranslation } from '@dxos/react-ui';\nimport { descriptionMessage, mx } from '@dxos/ui-theme';\n\nimport { meta } from '#meta';\n\nimport { PlankHeading, type PlankHeadingProps } from './PlankHeading';\nimport { PlankLoading } from './PlankLoading';\n\nexport const PlankError = ({\n id,\n part,\n node,\n error: errorProp,\n}: {\n id: string;\n part: PlankHeadingProps['part'];\n node?: Node.Node;\n error?: Error;\n}) => {\n const [timedOut, setTimedOut] = useState(false);\n useEffect(() => {\n const timer = setTimeout(() => setTimedOut(true), 5_000);\n return () => clearTimeout(timer);\n }, []);\n\n const error = useMemo(() => {\n if (timedOut) {\n return new TimeoutError({ message: 'Timeout loading content' });\n }\n\n return errorProp;\n }, [timedOut, errorProp]);\n\n return (\n <>\n <PlankHeading id={id} part={part} node={node} pending={!timedOut} />\n {timedOut ? <PlankErrorFallback error={error} /> : <PlankLoading />}\n </>\n );\n};\n\n/**\n * User facing error fallback.\n */\nexport const PlankErrorFallback = ({ error }: ErrorFallbackProps) => {\n const { t } = useTranslation(meta.id);\n\n useEffect(() => {\n if (error) {\n log.error('plank error', { error });\n }\n }, [error]);\n\n if (process.env.NODE_ENV === 'development') {\n return <ErrorFallback title='Plank Error' error={error} />;\n } else {\n const errorString = error?.toString() ?? '';\n\n return (\n <div\n role='alert'\n data-testid='plank-content-error'\n className='dx-attention-surface overflow-y-auto p-8 grid place-items-center'\n >\n <div className='flex flex-col items-center gap-2'>\n <p className={mx(descriptionMessage, 'break-all rounded-md p-4')}>\n {error ? errorString : t('error-fallback.message')}\n </p>\n </div>\n </div>\n );\n }\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { Fragment, type MouseEvent, memo, useCallback, useEffect, useMemo } from 'react';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { AppSurface } from '@dxos/app-toolkit/ui';\nimport { Graph, type Node, useActionRunner } from '@dxos/plugin-graph';\nimport { Icon, IconButton, Popover, toLocalizedString, useTranslation } from '@dxos/react-ui';\nimport { getLinkedVariant } from '@dxos/react-ui-attention';\nimport { StackItem, type StackItemSigilAction } from '@dxos/react-ui-stack';\nimport { TextTooltip } from '@dxos/react-ui-text-tooltip';\nimport { hoverableControls, hoverableFocusedWithinControls, iconSize } from '@dxos/ui-theme';\n\nimport { useBreakpoints } from '#hooks';\nimport { meta } from '#meta';\nimport { DeckOperation } from '#types';\nimport { type LayoutMode, PLANK_COMPANION_TYPE, type ResolvedPart } from '#types';\n\nimport { PlankCompanionControls, PlankControls } from './PlankControls';\nimport { usePlankContext } from './PlankRoot';\n\nconst MAX_COMPANIONS = 5;\n\nexport type PlankHeadingProps = {\n id: string;\n part: ResolvedPart;\n layoutMode?: LayoutMode;\n node?: Node.Node;\n deckEnabled?: boolean;\n canIncrementStart?: boolean;\n canIncrementEnd?: boolean;\n popoverAnchorId?: string;\n primaryId?: string;\n pending?: boolean;\n companioned?: 'primary' | 'companion';\n companions?: Node.Node[];\n actions?: StackItemSigilAction[];\n debug?: boolean;\n};\n\nexport const PlankHeading = memo(\n ({\n id,\n part,\n node,\n deckEnabled,\n canIncrementStart,\n canIncrementEnd,\n popoverAnchorId,\n primaryId,\n pending,\n companioned,\n companions,\n layoutMode,\n actions = [],\n debug = false,\n }: PlankHeadingProps) => {\n const { t } = useTranslation(meta.id);\n const { graph, onAdjust, onUpdateCompanion } = usePlankContext('PlankHeading');\n const runAction = useActionRunner();\n const breakpoint = useBreakpoints();\n const icon = node?.properties?.icon ?? 'ph--circle-dashed--regular';\n const label = pending\n ? t('pending.heading')\n : toLocalizedString(node?.properties?.label ?? ['plank-heading-fallback.label', { ns: meta.id }], t);\n\n const isCompanionNode = node?.type === PLANK_COMPANION_TYPE;\n\n useEffect(() => {\n const frame = requestAnimationFrame(() => {\n // Load actions for the node.\n if (node) {\n void Graph.expand(graph, node.id, 'child');\n }\n });\n\n return () => cancelAnimationFrame(frame);\n }, [node]);\n\n const attendableId = primaryId ?? id;\n const capabilities = useMemo(\n () => ({\n deck: deckEnabled ?? true,\n solo: breakpoint !== 'mobile' && (part === 'solo' || part === 'multi'),\n incrementStart: canIncrementStart,\n incrementEnd: canIncrementEnd,\n fullscreen: !isCompanionNode,\n companion: layoutMode !== 'multi' && !isCompanionNode && companions && companions.length > 0,\n }),\n [breakpoint, part, companions, canIncrementStart, canIncrementEnd, isCompanionNode, deckEnabled, layoutMode],\n );\n\n const variant = isCompanionNode ? getLinkedVariant(id) : undefined;\n const sigilActions = useMemo(() => {\n if (!node) {\n return undefined;\n } else if (variant) {\n return [];\n } else {\n return [\n actions,\n Graph.getActions(graph, node.id).filter((action) =>\n ['list-item', 'list-item-primary', 'heading-list-item'].includes(action.properties.disposition),\n ),\n ].filter((a) => a.length > 0);\n }\n }, [actions, node, variant, graph]);\n\n const handleAction = useCallback(\n (action: StackItemSigilAction) => {\n if (typeof action.data === 'function') {\n void runAction(action as Node.Action, { parent: node, caller: meta.id });\n }\n },\n [node, runAction],\n );\n\n const handlePlankAction = useCallback(\n (eventType: DeckOperation.PartAdjustment) => {\n onAdjust?.(id, eventType);\n },\n [onAdjust, id],\n );\n\n const ActionRoot = node && popoverAnchorId === `${meta.id}:${node.id}` ? Popover.Anchor : Fragment;\n\n const handleTabClick = useCallback(\n (event: MouseEvent) => {\n const target = (event.target as HTMLElement).closest('[data-id]') as HTMLElement | null;\n const tabId = target?.dataset?.id;\n if (tabId) {\n onUpdateCompanion?.(tabId);\n }\n },\n [onUpdateCompanion],\n );\n\n return (\n <StackItem.Heading\n data-tauri-drag-region\n data-plank-heading\n style={iconSize(5)}\n classNames={[\n 'py-1 items-stretch gap-1 sticky left-12 dx-app-drag min-w-0 dx-contain-layout dx-density-lg',\n part === 'solo'\n ? 'ps-[calc(env(safe-area-inset-left)+.25rem)] pe-[calc(env(safe-area-inset-right)+.25rem)]'\n : 'px-1',\n ...(layoutMode === 'solo--fullscreen'\n ? [\n hoverableControls,\n hoverableFocusedWithinControls,\n '*:transition-opacity *:opacity-(--controls-opacity) bg-transparent',\n 'border-transparent transition-[background-color,border-color]',\n 'hover-hover:hover:bg-header-surface focus-within:bg-header-surface',\n 'hover-hover:hover:border-subdued-separator focus-within:border-subdued-separator',\n ]\n : []),\n ]}\n >\n {companions && isCompanionNode ? (\n /* TODO(thure): IMPORTANT: This is a tablist; it should be implemented as such. */\n <div data-tauri-drag-region className='flex-1 min-w-0 overflow-x-auto scrollbar-none flex gap-1'>\n {companions.map(({ id, properties: { icon, label } }) => (\n <IconButton\n key={id}\n data-id={id}\n icon={icon}\n iconOnly={companions.length > MAX_COMPANIONS && node?.id !== id}\n label={toLocalizedString(label, t)}\n variant={node?.id === id ? 'primary' : 'ghost'}\n onClick={handleTabClick}\n />\n ))}\n </div>\n ) : (\n <>\n <ActionRoot>\n {node && sigilActions ? (\n <StackItem.Sigil\n icon={icon}\n related={part === 'complementary'}\n attendableId={attendableId}\n triggerLabel={t('actions-menu.label')}\n actions={sigilActions}\n onAction={handleAction}\n >\n <Surface.Surface\n type={AppSurface.MenuFooter}\n data={{ subject: node.data } satisfies AppSurface.MenuFooterData}\n />\n </StackItem.Sigil>\n ) : (\n <StackItem.SigilButton>\n <span className='sr-only'>{label}</span>\n <Icon icon={icon} />\n </StackItem.SigilButton>\n )}\n </ActionRoot>\n <TextTooltip text={label} onlyWhenTruncating>\n <StackItem.HeadingLabel\n data-tauri-drag-region\n attendableId={attendableId}\n related={part === 'complementary'}\n {...(pending && { classNames: 'text-description' })}\n >\n {label}\n </StackItem.HeadingLabel>\n </TextTooltip>\n </>\n )}\n {debug && (\n <div className='flex items-center text-sm text-info-text'>\n {layoutMode}:{part}:{companioned}\n </div>\n )}\n {node && part !== 'complementary' && (\n <Surface.Surface\n type={AppSurface.NavbarEnd}\n data={{ subject: node.data } satisfies AppSurface.NavbarEndData}\n />\n )}\n {companioned === 'companion' ? (\n <PlankCompanionControls primary={primaryId} />\n ) : (\n <PlankControls\n capabilities={capabilities}\n layoutMode={layoutMode}\n close={part === 'complementary' ? 'minify-end' : true}\n onClick={handlePlankAction}\n />\n )}\n </StackItem.Heading>\n );\n },\n);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { forwardRef, useCallback } from 'react';\n\nimport { useOperationInvoker } from '@dxos/app-framework/ui';\nimport { LayoutOperation } from '@dxos/app-toolkit';\nimport { ButtonGroup, type ButtonGroupProps, type ButtonProps, IconButton, useTranslation } from '@dxos/react-ui';\n\nimport { meta } from '#meta';\nimport { type DeckAction, type LayoutMode } from '#types';\n\nexport type PlankControlHandler = (event: DeckAction.PartAdjustment) => void;\n\nexport type PlankCapabilities = {\n incrementStart?: boolean;\n incrementEnd?: boolean;\n deck?: boolean;\n solo?: boolean;\n fullscreen?: boolean;\n companion?: boolean;\n};\n\n//\n// Controls\n//\n\nconst plankControlSpacing = 'px-2';\n\nexport type PlankCompanionControlsProps = {\n primary?: string;\n};\n\nexport const PlankCompanionControls = forwardRef<HTMLDivElement, PlankCompanionControlsProps>(\n ({ primary }, forwardedRef) => {\n const { t } = useTranslation(meta.id);\n const { invokePromise } = useOperationInvoker();\n const handleCloseCompanion = useCallback(() => {\n return invokePromise(LayoutOperation.UpdateCompanion, { subject: null });\n }, [invokePromise]);\n return (\n <div ref={forwardedRef} className='contents dx-app-no-drag'>\n <PlankControl\n label={t('close-companion.label')}\n variant='ghost'\n icon='ph--x--regular'\n onClick={handleCloseCompanion}\n classNames={plankControlSpacing}\n />\n </div>\n );\n },\n);\n\nconst PlankControl = ({ icon, label, ...props }: Omit<ButtonProps, 'children'> & { label: string; icon: string }) => {\n return <IconButton label={label} icon={icon} iconOnly variant='ghost' tooltipSide='bottom' {...props} />;\n};\n\n//\n// PlankControls\n//\n\nexport type PlankControlsProps = Omit<ButtonGroupProps, 'onClick'> & {\n onClick?: PlankControlHandler;\n variant?: 'hide-disabled' | 'default';\n close?: boolean | 'minify-start' | 'minify-end';\n capabilities: PlankCapabilities;\n layoutMode?: LayoutMode;\n pin?: 'start' | 'end' | 'both';\n};\n\n// TODO(wittjosiah): Duplicate of stack LayoutControls?\n// Translations were to be duplicated between packages.\n// NOTE(thure): Pinning & unpinning are disabled indefinitely.\nexport const PlankControls = forwardRef<HTMLDivElement, PlankControlsProps>(\n (\n { children, classNames, variant = 'default', capabilities, layoutMode, pin, close = false, onClick, ...props },\n forwardedRef,\n ) => {\n const { t } = useTranslation(meta.id);\n const buttonClassNames =\n variant === 'hide-disabled' ? `disabled:hidden ${plankControlSpacing}` : plankControlSpacing;\n\n const layoutIsAnySolo = !!layoutMode?.startsWith('solo');\n\n return (\n <ButtonGroup {...props} classNames={['dx-app-no-drag opacity-100!', classNames]} ref={forwardedRef}>\n {capabilities.deck ? (\n <>\n {capabilities.solo && (\n <>\n {layoutMode === 'solo' && (\n <PlankControl\n label={t('show-fullscreen-plank.label')}\n classNames={buttonClassNames}\n icon='ph--corners-out--regular'\n onClick={() => onClick?.('solo--fullscreen')}\n />\n )}\n <PlankControl\n label={t(\n layoutMode === 'solo--fullscreen'\n ? 'exit-fullscreen.label'\n : layoutIsAnySolo\n ? 'show-deck-plank.label'\n : 'show-solo-plank.label',\n )}\n classNames={buttonClassNames}\n icon={\n layoutMode === 'solo--fullscreen'\n ? 'ph--corners-in--regular'\n : layoutIsAnySolo\n ? 'ph--arrows-in-line-horizontal--regular'\n : 'ph--arrows-out-line-horizontal--regular'\n }\n onClick={() => onClick?.(layoutMode === 'solo--fullscreen' ? 'solo--fullscreen' : 'solo')}\n />\n </>\n )}\n\n {!layoutIsAnySolo && layoutMode !== 'multi' && (\n <>\n <PlankControl\n label={t('increment-start.label')}\n disabled={!capabilities.incrementStart}\n classNames={buttonClassNames}\n icon='ph--caret-left--regular'\n onClick={() => onClick?.('increment-start')}\n />\n <PlankControl\n label={t('increment-end.label')}\n disabled={!capabilities.incrementEnd}\n classNames={buttonClassNames}\n icon='ph--caret-right--regular'\n onClick={() => onClick?.('increment-end')}\n />\n </>\n )}\n </>\n ) : (\n capabilities.fullscreen && (\n <PlankControl\n label={t(layoutMode === 'solo--fullscreen' ? 'exit-fullscreen.label' : 'show-fullscreen-plank.label')}\n classNames={buttonClassNames}\n icon={layoutMode === 'solo--fullscreen' ? 'ph--corners-in--regular' : 'ph--corners-out--regular'}\n onClick={() => onClick?.('solo--fullscreen')}\n />\n )\n )}\n\n {close && !layoutIsAnySolo && (\n <PlankControl\n label={t(`${typeof close === 'string' ? 'minify' : 'close'}.label`)}\n classNames={buttonClassNames}\n data-testid='plankHeading.close'\n icon={\n close === 'minify-start'\n ? 'ph--caret-line-left--regular'\n : close === 'minify-end'\n ? 'ph--caret-line-right--regular'\n : 'ph--x--regular'\n }\n onClick={() => onClick?.('close')}\n />\n )}\n\n {capabilities.companion && (\n <PlankControl\n label={t('open-companion.label')}\n classNames={buttonClassNames}\n data-testid='plankHeading.companion'\n icon='ph--square-split-horizontal--regular'\n onClick={() => onClick?.('companion')}\n />\n )}\n {children}\n </ButtonGroup>\n );\n },\n);\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport React, { PropsWithChildren } from 'react';\n\nimport { type Graph } from '@dxos/plugin-graph';\n\nimport { type DeckOperation } from '#types';\nimport { type LayoutMode, type PlankSizing, type ResolvedPart, type Settings } from '#types';\n\nconst PLANK_NAME = 'Plank';\n\nexport type PlankContextValue = {\n /** The application graph. */\n graph: Graph.ExpandableGraph;\n /** Which part of the layout this plank occupies. */\n part: ResolvedPart;\n /** Current layout mode. */\n layoutMode: LayoutMode;\n /** Deck settings. */\n settings?: Settings.Settings;\n /** Popover anchor ID for heading menus. */\n popoverAnchorId?: string;\n /** ID of plank that should be scrolled into view. */\n scrollIntoView?: string;\n /** Persisted plank sizes keyed by plank ID. */\n plankSizing?: PlankSizing;\n /** Callback for plank adjustments (close, solo, increment, companion). */\n onAdjust?: (id: string, type: DeckOperation.PartAdjustment) => void;\n /** Callback for plank resize. */\n onResize?: (id: string, size: number) => void;\n /** Callback to clear scroll-into-view state. */\n onScrollIntoView?: (id?: string) => void;\n /** Callback to update the companion. */\n onUpdateCompanion?: (companion: string | null) => void;\n};\n\nexport const [PlankProvider, usePlankContext] = createContext<PlankContextValue>(PLANK_NAME);\n\nexport type PlankRootProps = PropsWithChildren<PlankContextValue>;\n\n/**\n * Headless root that provides plank context.\n */\nexport const PlankRoot = ({ children, ...context }: PlankRootProps) => {\n return <PlankProvider {...context}>{children}</PlankProvider>;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useFocusFinders } from '@fluentui/react-tabster';\nimport React, { type KeyboardEvent, memo, useCallback, useLayoutEffect, useMemo, useRef } from 'react';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { AppSurface } from '@dxos/app-toolkit/ui';\nimport { debounce } from '@dxos/async';\nimport { type Node } from '@dxos/plugin-graph';\nimport { mainIntrinsicSize } from '@dxos/react-ui';\nimport { getLinkedVariant } from '@dxos/react-ui-attention';\nimport { useAttentionAttributes } from '@dxos/react-ui-attention';\nimport { StackItem, type StackItemSize, railGridHorizontal } from '@dxos/react-ui-stack';\nimport { mx } from '@dxos/ui-theme';\n\nimport { useMainSize } from '#hooks';\nimport { PLANK_COMPANION_TYPE } from '#types';\n\nimport { PlankError, PlankErrorFallback } from './PlankError';\nimport { PlankHeading } from './PlankHeading';\nimport { PlankLoading } from './PlankLoading';\nimport { PlankRootProps, usePlankContext } from './PlankRoot';\n\n/**\n * JS-based smooth scroll that won't be interrupted by MutationObserver or layout changes.\n */\nconst smoothScrollTo = (element: HTMLElement, target: number, duration: number) => {\n const start = element.scrollLeft;\n const distance = target - start;\n const startTime = performance.now();\n\n const step = (currentTime: number) => {\n const elapsed = currentTime - startTime;\n const progress = Math.min(elapsed / duration, 1);\n // Ease-out cubic.\n const eased = 1 - Math.pow(1 - progress, 3);\n element.scrollLeft = start + distance * eased;\n if (progress < 1) {\n requestAnimationFrame(step);\n }\n };\n\n requestAnimationFrame(step);\n};\n\n// NOTE: Calibrated to show PLANK + COMPANION on MBP 16\" screen.\nexport const DEFAULT_SIZE = 48 satisfies StackItemSize;\nexport const DEFAULT_COMPANION_SIZE = 35 satisfies StackItemSize;\n\nexport type PlankComponentProps = Pick<PlankRootProps, 'part'> & {\n id: string;\n path?: string[];\n order?: number;\n active?: string[];\n node?: Node.Node;\n primary?: Node.Node;\n companions?: Node.Node[];\n companioned?: 'primary' | 'companion';\n};\n\nexport const PlankComponent = memo(\n ({ part, id, path, order, active, node, primary, companions, companioned }: PlankComponentProps) => {\n const { layoutMode, settings, popoverAnchorId, scrollIntoView, plankSizing, onResize, onScrollIntoView } =\n usePlankContext('PlankComponent');\n\n const canResize = layoutMode === 'multi';\n const { findFirstFocusable } = useFocusFinders();\n const isCompanion = companioned === 'companion';\n // Companions share attention with their primary; non-companions key attention to their own id.\n const attentionId = isCompanion ? (primary?.id ?? id) : id;\n const attentionAttrs = useAttentionAttributes(attentionId);\n const orderId = isCompanion ? primary?.id : id;\n const index = orderId && active ? active.findIndex((entryId) => entryId === orderId) : -1;\n const length = active?.length ?? 1;\n const isOrdered = !!active && index >= 0;\n const canIncrementStart = isOrdered && index > 0;\n const canIncrementEnd = isOrdered && index < length - 1;\n const rootElement = useRef<HTMLDivElement | null>(null);\n const variant = node?.type === PLANK_COMPANION_TYPE ? getLinkedVariant(id) : undefined;\n\n // Sizing.\n const sizeAttrs = useMainSize();\n const sizeKey = id.split('+')[0];\n const size = isCompanion\n ? DEFAULT_COMPANION_SIZE\n : ((plankSizing?.[sizeKey] as number | undefined) ?? DEFAULT_SIZE);\n const handleSizeChange = useCallback(\n debounce((nextSize: number) => {\n const size = Math.round(nextSize);\n onResize?.(sizeKey, size);\n }, 200),\n [sizeKey, onResize],\n );\n\n // TODO(thure): Tabster's focus group should handle moving focus to Main, but something is blocking it.\n const handleKeyDown = useCallback((event: KeyboardEvent) => {\n if (event.target === event.currentTarget) {\n switch (event.key) {\n case 'Escape':\n rootElement.current?.closest('main')?.focus();\n break;\n case 'Enter':\n rootElement.current && findFirstFocusable(rootElement.current)?.focus();\n break;\n }\n }\n }, []);\n\n useLayoutEffect(() => {\n if (scrollIntoView === id && layoutMode === 'multi' && rootElement.current) {\n const element = rootElement.current;\n const scrollParent = element.closest('[style*=\"overflow\"], .overflow-x-auto') as HTMLElement | null;\n if (scrollParent) {\n const elementRect = element.getBoundingClientRect();\n const parentRect = scrollParent.getBoundingClientRect();\n const targetScrollLeft = scrollParent.scrollLeft + (elementRect.left - parentRect.left);\n\n smoothScrollTo(scrollParent, targetScrollLeft, 300);\n }\n\n onScrollIntoView?.(undefined);\n }\n }, [id, scrollIntoView, layoutMode, onScrollIntoView]);\n\n const isSolo = layoutMode.startsWith('solo') && part === 'solo';\n const isAttendable =\n (layoutMode.startsWith('solo') && part.startsWith('solo')) || (layoutMode === 'multi' && part === 'multi');\n\n // Companions share attention with their primary, so they attend to the primary's id\n // (matching the plank's attention container, which keys to `primary?.id ?? id`).\n const attendableId = isCompanion ? (primary?.id ?? id) : id;\n const data = useMemo<AppSurface.ArticleData | undefined>(\n () =>\n node && {\n attendableId,\n subject: node.data,\n companionTo: primary?.data,\n properties: node.properties,\n variant,\n path,\n popoverAnchorId,\n },\n [node, node?.data, node?.properties, path, popoverAnchorId, primary?.data, variant, attendableId],\n );\n\n // TODO(wittjosiah): Change prop to accept a component.\n const placeholder = useMemo(() => <PlankLoading />, []);\n\n const Root = part.startsWith('solo') ? 'article' : StackItem.Root;\n const fullscreen = layoutMode === 'solo--fullscreen';\n const classNames = [\n 'dx-attention-surface relative dx-focus-ring-inset-over-all dx-density-lg',\n isSolo && 'absolute inset-0',\n isSolo && mainIntrinsicSize,\n railGridHorizontal,\n part.startsWith('solo') && 'grid',\n part.startsWith('solo-') && 'grid-rows-subgrid row-span-2 min-w-0',\n fullscreen && 'grid-rows-1',\n part === 'multi' && (isCompanion ? 'border-separator! border-e' : 'border-separator! border-x'),\n part === 'solo-companion' && 'border-separator! border-s',\n settings?.encapsulatedPlanks &&\n !part.startsWith('solo') &&\n 'mx-(--main-spacing) border-separator! border rounded-sm overflow-hidden',\n ];\n\n return (\n <Root\n ref={rootElement}\n data-testid='deck.plank'\n data-popover-collision-boundary={true}\n tabIndex={0}\n {...(part.startsWith('solo')\n ? ({\n className: mx(classNames),\n ...sizeAttrs,\n } as any)\n : {\n role: 'article',\n item: { id },\n classNames,\n order,\n size,\n onSizeChange: handleSizeChange,\n })}\n {...(isAttendable ? attentionAttrs : {})}\n onKeyDown={handleKeyDown}\n >\n {node ? (\n <>\n {!fullscreen && (\n <PlankHeading\n id={id}\n part={part.startsWith('solo-') ? 'solo' : part}\n node={node}\n layoutMode={layoutMode}\n deckEnabled={settings?.enableDeck}\n canIncrementStart={canIncrementStart}\n canIncrementEnd={canIncrementEnd}\n popoverAnchorId={popoverAnchorId}\n primaryId={primary?.id}\n companioned={companioned}\n companions={companions}\n />\n )}\n <Surface.Surface\n key={node.id}\n type={AppSurface.Article}\n data={data}\n limit={1}\n fallback={PlankErrorFallback}\n placeholder={placeholder}\n />\n </>\n ) : (\n <PlankError id={id} part={part} />\n )}\n {canResize && <StackItem.ResizeHandle />}\n </Root>\n );\n },\n);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type PropsWithChildren } from 'react';\n\nimport { composable, composableProps, mainIntrinsicSize } from '@dxos/react-ui';\nimport { railGridHorizontal } from '@dxos/react-ui-stack';\n\nimport { useMainSize } from '#hooks';\n\nexport type PlankContentProps = PropsWithChildren<{\n solo: boolean;\n companion: boolean;\n encapsulate: boolean;\n}>;\n\nexport const PlankContent = composable<HTMLDivElement, PlankContentProps>(\n ({ children, solo, companion, encapsulate, ...props }, forwardedRef) => {\n const sizeAttrs = useMainSize();\n if (!solo) {\n return children;\n }\n\n return (\n <div\n {...sizeAttrs}\n {...composableProps(props, {\n role: 'none',\n classNames: [\n 'absolute inset-(--main-spacing) grid',\n railGridHorizontal,\n mainIntrinsicSize,\n companion && 'grid-cols-[6fr_4fr]', // Ration of primary to companion.\n encapsulate && 'border border-separator rounded-sm overflow-hidden',\n ],\n })}\n data-popover-collision-boundary={true}\n ref={forwardedRef}\n >\n {children}\n </div>\n );\n },\n);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { PlankComponent, PlankComponentProps } from './PlankComponent';\nimport { PlankContent, PlankContentProps } from './PlankContent';\nimport { PlankControls } from './PlankControls';\nimport { PlankHeading } from './PlankHeading';\nimport { PlankRoot, PlankRootProps } from './PlankRoot';\n\n/**\n * Radix-style composite Plank component.\n */\nexport const Plank = {\n Root: PlankRoot,\n Content: PlankContent,\n Component: PlankComponent,\n Heading: PlankHeading,\n Controls: PlankControls,\n};\n\nexport type { PlankRootProps, PlankComponentProps, PlankContentProps };\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useCallback } from 'react';\n\nimport { useOperationInvoker } from '@dxos/app-framework/ui';\nimport { LayoutOperation } from '@dxos/app-toolkit';\nimport { IconButton, type IconButtonProps, type ThemedClassName, useTranslation } from '@dxos/react-ui';\nimport { getLinkedVariant } from '@dxos/react-ui-attention';\n\nimport { useDeckCompanions, useDeckState } from '#hooks';\nimport { meta } from '#meta';\n\nexport const ToggleSidebarButton = ({\n classNames,\n variant = 'ghost',\n}: ThemedClassName<Pick<IconButtonProps, 'variant'>>) => {\n const { updateState } = useDeckState();\n const { t } = useTranslation(meta.id);\n\n const handleClick = useCallback(() => {\n updateState((state) => ({\n ...state,\n sidebarState: state.sidebarState === 'expanded' ? 'collapsed' : 'expanded',\n }));\n }, [updateState]);\n\n return (\n <IconButton\n variant={variant}\n icon='ph--sidebar--regular'\n iconOnly\n size={4}\n label={t('open-navigation-sidebar.label')}\n onClick={handleClick}\n classNames={classNames}\n />\n );\n};\n\nexport const CloseSidebarButton = () => {\n const { updateState } = useDeckState();\n const { t } = useTranslation(meta.id);\n\n const handleClick = useCallback(() => {\n updateState((state) => ({ ...state, sidebarState: 'collapsed' }));\n }, [updateState]);\n\n return (\n <IconButton\n variant='ghost'\n icon='ph--caret-line-left--regular'\n iconOnly\n size={4}\n label={t('close-navigation-sidebar.button')}\n onClick={handleClick}\n classNames='rounded-none px-1 dx-focus-ring-inset pe-[max(.5rem,env(safe-area-inset-left))]'\n />\n );\n};\n\nexport const ToggleComplementarySidebarButton = ({\n inR0,\n classNames,\n current,\n}: ThemedClassName<{ inR0?: boolean; current?: string }>) => {\n const { invokePromise } = useOperationInvoker();\n const { state, updateState } = useDeckState();\n const { t } = useTranslation(meta.id);\n\n const companions = useDeckCompanions();\n const handleClick = useCallback(() => {\n const nextState = state.complementarySidebarState === 'expanded' ? 'collapsed' : 'expanded';\n updateState((state) => ({ ...state, complementarySidebarState: nextState }));\n\n const subject = state.complementarySidebarPanel ?? (companions[0] && getLinkedVariant(companions[0].id));\n if (nextState === 'expanded' && !current && subject) {\n void invokePromise(LayoutOperation.UpdateComplementary, { subject });\n }\n }, [state, updateState, current, companions, invokePromise]);\n\n const label = t(\n state.complementarySidebarState === 'expanded'\n ? 'close-complementary-sidebar.label'\n : 'open-complementary-sidebar.label',\n );\n\n return (\n <IconButton\n variant='ghost'\n classNames={['[&>svg]:-scale-x-100', classNames]}\n icon='ph--sidebar-simple--regular'\n iconOnly\n label={label}\n tooltipSide={inR0 ? 'left' : undefined}\n onClick={handleClick}\n />\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type MouseEvent, useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { Surface, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { LayoutOperation } from '@dxos/app-toolkit';\nimport { IconButton, type Label, Main, Panel, toLocalizedString, Toolbar, useTranslation } from '@dxos/react-ui';\nimport { getLinkedVariant } from '@dxos/react-ui-attention';\nimport { Tabs } from '@dxos/react-ui-tabs';\nimport { iconSize, mx } from '@dxos/ui-theme';\n\nimport { type DeckCompanion, useBreakpoints, useDeckCompanions, useDeckState } from '#hooks';\nimport { meta } from '#meta';\nimport { getMode } from '#types';\n\nimport { layoutAppliesTopbar } from '../../util';\nimport { PlankErrorFallback, PlankLoading } from '../Plank';\nimport { ToggleComplementarySidebarButton } from './SidebarButton';\n\nconst label = ['complementary-sidebar.title', { ns: meta.id }] satisfies Label;\n\nexport type ComplementarySidebarProps = {\n current?: string;\n};\n\nexport const ComplementarySidebar = ({ current }: ComplementarySidebarProps) => {\n const { invokePromise } = useOperationInvoker();\n const { t } = useTranslation(meta.id);\n const { state, deck, updateState } = useDeckState();\n const layoutMode = getMode(deck);\n const breakpoint = useBreakpoints();\n const topbar = layoutAppliesTopbar(breakpoint, layoutMode);\n\n const companions = useDeckCompanions();\n const activeCompanion = companions.find((companion) => getLinkedVariant(companion.id) === current);\n const activeId = activeCompanion && getLinkedVariant(activeCompanion.id);\n const [internalValue, setInternalValue] = useState(activeId);\n\n useEffect(() => {\n setInternalValue(activeId);\n }, [activeId]);\n\n const handleTabClick = useCallback(\n (event: MouseEvent) => {\n const nextValue = event.currentTarget.getAttribute('data-value') as string;\n if (nextValue === activeId) {\n updateState((state) => ({\n ...state,\n complementarySidebarState: state.complementarySidebarState === 'expanded' ? 'collapsed' : 'expanded',\n }));\n } else {\n setInternalValue(nextValue);\n updateState((state) => ({ ...state, complementarySidebarState: 'expanded' }));\n void invokePromise(LayoutOperation.UpdateComplementary, { subject: nextValue });\n }\n },\n [state.complementarySidebarState, activeId, invokePromise, updateState],\n );\n\n const data = useMemo(\n () =>\n activeCompanion && {\n id: activeCompanion.id,\n subject: activeCompanion.data,\n },\n [activeCompanion?.id, activeCompanion?.data],\n );\n\n useEffect(() => {\n if (!activeId) {\n void invokePromise(LayoutOperation.UpdateComplementary, { state: 'collapsed' });\n }\n }, [activeId, invokePromise]);\n\n return (\n <Main.ComplementarySidebar\n label={label}\n classNames={[topbar && 'top-[calc(env(safe-area-inset-top)+var(--dx-rail-size))]']}\n >\n {/* R0 Tabs */}\n <Tabs.Root classNames='contents' orientation='vertical' value={internalValue}>\n <div\n data-tauri-drag-region\n style={iconSize(5)}\n className={mx(\n 'absolute z-1 inset-y-0 end-0 w-(--dx-r0-size)!',\n 'py-[env(safe-area-inset-top)] pb-[env(safe-area-inset-bottom)] border-s border-subdued-separator',\n 'grid grid-cols-1 grid-rows-[1fr_min-content] bg-r0-surface dx-contain-layout dx-app-drag',\n )}\n >\n <Tabs.Tablist classNames='grid grid-cols-1 auto-rows-(--dx-rail-action) overflow-y-auto scrollbar-none gap-1 p-1'>\n {companions.map((companion) => (\n <Tabs.Tab key={getLinkedVariant(companion.id)} value={getLinkedVariant(companion.id)} asChild>\n <IconButton\n classNames='w-(--dx-rail-action) h-(--dx-rail-action) min-h-0 px-0'\n label={toLocalizedString(companion.properties.label, t)}\n icon={companion.properties.icon}\n iconOnly\n tooltipSide='left'\n data-value={getLinkedVariant(companion.id)}\n {...(companion.properties.joyride && { 'data-joyride': companion.properties.joyride })}\n variant={\n activeId === getLinkedVariant(companion.id)\n ? state.complementarySidebarState === 'expanded'\n ? 'primary'\n : 'ghost'\n : 'ghost'\n }\n onClick={handleTabClick}\n />\n </Tabs.Tab>\n ))}\n </Tabs.Tablist>\n <div\n className='grid grid-cols-1 auto-rows-(--dx-rail-item) py-0.5 gap-0.5 overflow-y-auto scrollbar-none'\n style={iconSize(4)}\n >\n <Surface.Surface role='status-indicator' />\n </div>\n <div className='hidden lg:grid grid-cols-1 auto-rows-(--dx-rail-action) p-1'>\n <ToggleComplementarySidebarButton />\n </div>\n </div>\n\n {/* R1 Content. */}\n {activeId &&\n companions.map((companion) => (\n <Tabs.Panel\n key={getLinkedVariant(companion.id)}\n value={getLinkedVariant(companion.id)}\n classNames={[\n 'absolute data-[state=\"inactive\"]:-z-[1] overflow-hidden',\n 'inset-y-0 start-0 w-full lg:w-(--dx-r1-size)',\n ]}\n {...(state.complementarySidebarState !== 'expanded' && { inert: true })}\n >\n <ComplementarySidebarPanel companion={companion} activeId={activeId} data={data} />\n </Tabs.Panel>\n ))}\n </Tabs.Root>\n </Main.ComplementarySidebar>\n );\n};\n\ntype ComplementarySidebarPanelProps = {\n companion: DeckCompanion;\n activeId: string;\n data?: {\n id: string;\n subject: any;\n };\n};\n\nconst ComplementarySidebarPanel = ({ companion, activeId, data }: ComplementarySidebarPanelProps) => {\n const { t } = useTranslation(meta.id);\n\n if (getLinkedVariant(companion.id) !== activeId && !data) {\n return null;\n }\n\n return (\n <Panel.Root>\n <Panel.Toolbar asChild size='lg'>\n <Toolbar.Root style={iconSize(5)} classNames='bg-header-surface'>\n <IconButton\n classNames='w-(--dx-rail-action) h-(--dx-rail-action) min-h-0 px-0'\n label={toLocalizedString(companion.properties.label, t)}\n icon={companion.properties.icon}\n iconOnly\n tooltipSide='left'\n data-value={getLinkedVariant(companion.id)}\n variant='default'\n />\n <div className='px-1'>{toLocalizedString(companion.properties.label, t)}</div>\n </Toolbar.Root>\n </Panel.Toolbar>\n <Panel.Content classNames='bg-r1-surface'>\n <Surface.Surface\n role={`deck-companion--${getLinkedVariant(companion.id)}`}\n data={data}\n fallback={PlankErrorFallback}\n placeholder={<PlankLoading />}\n />\n </Panel.Content>\n </Panel.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useMemo } from 'react';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { AppSurface } from '@dxos/app-toolkit/ui';\nimport { type Label, Main } from '@dxos/react-ui';\n\nimport { useBreakpoints, useDeckState } from '#hooks';\nimport { meta } from '#meta';\nimport { getMode } from '#types';\n\nimport { layoutAppliesTopbar } from '../../util';\n\nconst label = ['sidebar.title', { ns: meta.id }] satisfies Label;\n\nexport const Sidebar = () => {\n const { state, deck } = useDeckState();\n const { popoverAnchorId, activeDeck: current } = state;\n const breakpoint = useBreakpoints();\n const layoutMode = getMode(deck);\n const topbar = layoutAppliesTopbar(breakpoint, layoutMode);\n\n const navigationData = useMemo<AppSurface.NavigationData<{ topbar: boolean }>>(\n () => ({ popoverAnchorId, topbar, current }),\n [popoverAnchorId, topbar, current],\n );\n\n return (\n <Main.NavigationSidebar\n label={label}\n classNames={['grid', topbar && 'top-[calc(env(safe-area-inset-top)+var(--dx-rail-size))]']}\n >\n <Surface.Surface type={AppSurface.Navigation} data={navigationData} limit={1} />\n </Main.NavigationSidebar>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { type PropsWithChildren, useCallback, useEffect, useRef } from 'react';\n\nimport { AttentionCapabilities } from '@dxos/plugin-attention';\nimport { Main, useMediaQuery } from '@dxos/react-ui';\n\nimport { useBreakpoints } from '#hooks';\n\nimport { layoutAppliesTopbar } from '../../util';\nimport { ComplementarySidebar, Sidebar } from '../Sidebar';\nimport { Banner } from './Banner';\nimport { useDeckContext } from './DeckRoot';\n\nconst DECK_CONTENT_NAME = 'DeckContent';\n\nexport type DeckContentProps = PropsWithChildren;\n\nexport const DeckContent = ({ children }: DeckContentProps) => {\n const {\n state: { sidebarState, complementarySidebarState, complementarySidebarPanel },\n deck: { active, fullscreen, solo },\n updateState,\n layoutMode,\n settings,\n pluginManager,\n onLayoutChange,\n } = useDeckContext(DECK_CONTENT_NAME);\n const breakpoint = useBreakpoints();\n const topbar = layoutAppliesTopbar(breakpoint, layoutMode);\n\n // Ensure the first plank is attended when the deck is first rendered.\n useEffect(() => {\n // NOTE: Not `useAttended` so that the layout component is not re-rendered when the attended list changes.\n const attention = pluginManager.capabilities.get(AttentionCapabilities.Attention);\n const attended = attention.getCurrent();\n const firstId = solo ?? active[0];\n if (attended.length === 0 && firstId) {\n // TODO(wittjosiah): Focusing the type button is a workaround.\n // If the plank is directly focused on first load the focus ring appears.\n document.querySelector<HTMLElement>(`article[data-attendable-id=\"${firstId}\"] button`)?.focus();\n }\n }, []);\n\n // Not using `breakpoint` to avoid firing when breakpoint changes between tablet and desktop.\n // `ssr: false` to avoid using fallback values and flashing into solo mode on startup.\n const [isNotMobile] = useMediaQuery('md');\n const shouldRevert = useRef(false);\n useEffect(() => {\n if (!isNotMobile && layoutMode === 'multi') {\n // NOTE: Not `useAttended` so that the layout component is not re-rendered when the attended list changes.\n const attention = pluginManager.capabilities.get(AttentionCapabilities.Attention);\n const attended = attention.getCurrent();\n shouldRevert.current = true;\n onLayoutChange({ subject: attended[0], mode: 'solo' });\n } else if (isNotMobile && layoutMode === 'solo' && shouldRevert.current) {\n onLayoutChange({ revert: true });\n }\n // NOTE: Using `layoutMode` instead of `deck` to avoid infinite loops caused by object reference changes.\n }, [isNotMobile, layoutMode, onLayoutChange]);\n\n // When deck is disabled in settings, set to solo mode if the current layout mode is deck.\n // TODO(thure): Applying this as an effect should be avoided over emitting the operation only when the setting changes.\n useEffect(() => {\n if (!settings?.enableDeck && layoutMode === 'multi') {\n onLayoutChange({ subject: active[0], mode: 'solo' });\n }\n }, [settings?.enableDeck, onLayoutChange, active, layoutMode]);\n\n const handleNavigationSidebarStateChange = useCallback(\n (next: typeof sidebarState) => {\n updateState((s) => ({ ...s, sidebarState: next }));\n },\n [updateState],\n );\n\n const handleComplementarySidebarStateChange = useCallback(\n (next: typeof complementarySidebarState) => {\n updateState((s) => ({ ...s, complementarySidebarState: next }));\n },\n [updateState],\n );\n\n return (\n <Main.Root\n navigationSidebarState={fullscreen ? 'closed' : sidebarState}\n complementarySidebarState={fullscreen ? 'closed' : complementarySidebarState}\n onNavigationSidebarStateChange={handleNavigationSidebarStateChange}\n onComplementarySidebarStateChange={handleComplementarySidebarStateChange}\n >\n <Sidebar />\n <ComplementarySidebar current={complementarySidebarPanel} />\n <Main.Overlay />\n {children}\n {topbar && <Banner variant='topbar' />}\n </Main.Root>\n );\n};\n\nDeckContent.displayName = DECK_CONTENT_NAME;\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Surface } from '@dxos/app-framework/ui';\nimport { type ThemedClassName, useTranslation } from '@dxos/react-ui';\nimport { mx, osTranslations } from '@dxos/ui-theme';\n\nimport { meta } from '#meta';\n\nimport { CloseSidebarButton, ToggleSidebarButton } from '../Sidebar';\n\nexport const Banner = ({ variant, classNames }: ThemedClassName<{ variant?: 'topbar' | 'sidebar' }>) => {\n const { t } = useTranslation(meta.id);\n\n return (\n <header\n className={mx(\n 'flex items-stretch relative py-1 ps-1 pe-2',\n variant === 'topbar' &&\n 'fixed inset-x-0 top-[env(safe-area-inset-top)] h-(--dx-rail-size) border-b border-separator',\n classNames,\n )}\n >\n {variant === 'sidebar' ? <CloseSidebarButton /> : <ToggleSidebarButton />}\n <span className='self-center grow ms-1'>{t('current-app.name', { ns: osTranslations })}</span>\n {variant === 'topbar' && (\n <div className='absolute inset-0 pointer-events-none'>\n <div className='grid h-full pointer-fine:p-1 max-w-md mx-auto pointer-events-auto'>\n <Surface.Surface role='search-input' limit={1} />\n </div>\n </div>\n )}\n <span className='grow' />\n <Surface.Surface role='version-info' limit={1} />\n <Surface.Surface role='notch-start' limit={1} />\n </header>\n );\n};\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { createContext } from '@radix-ui/react-context';\nimport React, { PropsWithChildren } from 'react';\n\nimport { type PluginManager } from '@dxos/app-framework';\n\nimport { type LayoutMode, type Settings } from '#types';\n\nimport { type DeckStateHook } from '../../hooks/useDeckState';\n\nconst DECK_NAME = 'Deck';\nconst DECK_ROOT_NAME = 'DeckRoot';\n\n/** Request to change the layout mode. */\nexport type DeckLayoutChangeRequest = { subject?: string; mode: LayoutMode } | { revert: true };\n\n//\n// Context\n//\n\nexport type DeckContextValue = {\n /** Deck plugin settings. */\n settings?: Settings.Settings;\n /** Plugin manager for capability access. */\n pluginManager: PluginManager.PluginManager;\n /** Layout mode. */\n layoutMode: LayoutMode;\n /** Callback for layout mode changes. */\n onLayoutChange: (request: DeckLayoutChangeRequest) => void;\n} & Pick<DeckStateHook, 'state' | 'deck' | 'updateState'>;\n\nexport const [DeckProvider, useDeckContext] = createContext<DeckContextValue>(DECK_NAME);\n\n//\n// Root\n//\n\nexport type DeckRootProps = PropsWithChildren<DeckContextValue>;\n\n/**\n * Headless root that provides Deck context.\n */\nexport const DeckRoot = ({ children, ...context }: DeckRootProps) => {\n return <DeckProvider {...context}>{children}</DeckProvider>;\n};\n\nDeckRoot.displayName = DECK_ROOT_NAME;\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport React, {\n Fragment,\n memo,\n type PropsWithChildren,\n type UIEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from 'react';\n\nimport { Surface, useOperationInvoker } from '@dxos/app-framework/ui';\nimport { LayoutOperation } from '@dxos/app-toolkit';\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\nimport { addEventListener } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\nimport { useNode } from '@dxos/plugin-graph';\nimport { IconButton, Main, type MainContentProps, useOnTransition, useTranslation } from '@dxos/react-ui';\nimport { mainPaddingTransitions } from '@dxos/react-ui';\nimport { DEFAULT_HORIZONTAL_SIZE, Stack, StackContext } from '@dxos/react-ui-stack';\nimport { hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/ui-theme';\n\nimport { useBreakpoints, useCompanions, useDeckState, useSelectedCompanion } from '#hooks';\nimport { meta } from '#meta';\nimport { DeckOperation } from '#types';\nimport { getMode } from '#types';\n\nimport { layoutAppliesTopbar } from '../../util';\nimport { Plank, PlankRootProps, type PlankComponentProps } from '../Plank';\nimport {\n ToggleComplementarySidebarButton as NaturalToggleComplementarySidebarButton,\n ToggleSidebarButton as NaturalToggleSidebarButton,\n} from '../Sidebar';\nimport { useDeckContext } from './DeckRoot';\n\nconst DECK_VIEWPORT_NAME = 'DeckViewport';\n\n//\n// DeckViewport\n//\n\nexport type DeckViewportProps = PropsWithChildren;\n\n/**\n * Deck viewport that renders the main content area and sets CSS variables for plank sizing.\n */\nexport const DeckViewport = ({ children }: DeckViewportProps) => {\n const {\n deck: { active, plankSizing },\n state: { sidebarState, complementarySidebarState },\n settings,\n layoutMode,\n } = useDeckContext(DECK_VIEWPORT_NAME);\n\n const breakpoint = useBreakpoints();\n const topbar = layoutAppliesTopbar(breakpoint, layoutMode);\n\n return (\n <Main.Content\n bounce\n handlesFocus\n classNames={[\n 'grid top-[env(safe-area-inset-top)]!',\n topbar && 'top-[calc(env(safe-area-inset-top)+var(--dx-rail-size))]!',\n ]}\n style={\n {\n '--main-spacing': settings?.encapsulatedPlanks ? '0.75rem' : '0',\n '--main-sidebar-width':\n sidebarState === 'expanded'\n ? 'var(--dx-nav-sidebar-size)'\n : sidebarState === 'collapsed'\n ? 'var(--dx-l0-size)'\n : '0',\n '--main-complementary-width':\n complementarySidebarState === 'expanded'\n ? 'var(--dx-complementary-sidebar-size)'\n : complementarySidebarState === 'collapsed'\n ? 'var(--dx-rail-size)'\n : '0',\n '--main-content-first-width': `${plankSizing[active[0] ?? 'never'] ?? DEFAULT_HORIZONTAL_SIZE}rem`,\n '--main-content-last-width': `${plankSizing[active[(active.length ?? 1) - 1] ?? 'never'] ?? DEFAULT_HORIZONTAL_SIZE}rem`,\n } as MainContentProps['style']\n }\n >\n {children}\n </Main.Content>\n );\n};\n\nDeckViewport.displayName = DECK_VIEWPORT_NAME;\n\n//\n// ContentEmpty\n//\n\nexport const DeckContentEmpty = () => {\n const breakpoint = useBreakpoints();\n const { deck } = useDeckState();\n const layoutMode = getMode(deck);\n const topbar = layoutAppliesTopbar(breakpoint, layoutMode);\n return (\n <div className='grid place-items-center p-8 relative bg-deck-surface' data-testid='layoutPlugin.firstRunMessage'>\n <Surface.Surface role='keyshortcuts' />\n {!topbar && <ToggleSidebarButton />}\n </div>\n );\n};\n\n//\n// DeckSoloMode\n//\n\n/**\n * Single-plank layout with optional companion.\n */\nexport const DeckSoloMode = () => {\n const { deck, settings, layoutMode, onLayoutChange } = useDeckContext('DeckSoloMode');\n const { companionOpen, companionVariant, fullscreen, solo } = deck;\n const effectiveCompanionVariant = fullscreen ? undefined : companionOpen ? companionVariant : undefined;\n const breakpoint = useBreakpoints();\n const topbar = layoutAppliesTopbar(breakpoint, layoutMode);\n invariant(solo);\n\n useEffect(() => {\n if (!fullscreen) {\n return;\n }\n\n const handleKeyDown = (event: globalThis.KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n onLayoutChange({ mode: 'solo--fullscreen' });\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [fullscreen, onLayoutChange]);\n\n return (\n <div className='relative overflow-hidden bg-deck-surface'>\n <DeckSidebarToggles topbar={topbar} fullscreen={fullscreen} />\n {fullscreen && <ExitFullscreenButton onExit={() => onLayoutChange({ mode: 'solo--fullscreen' })} />}\n <StackContext.Provider\n value={{\n orientation: 'horizontal',\n size: 'contain',\n rail: true,\n }}\n >\n <PlankContainer\n id={solo}\n part='solo'\n layoutMode={layoutMode}\n companionVariant={effectiveCompanionVariant}\n settings={settings}\n />\n </StackContext.Provider>\n </div>\n );\n};\n\n//\n// DeckMultiMode\n//\n\n/**\n * Multi-plank horizontal scrolling layout.\n */\nexport const DeckMultiMode = () => {\n const {\n deck: { active, companionVariant, fullscreen },\n settings,\n layoutMode,\n } = useDeckContext('DeckMultiMode');\n /** In multi mode the companion column is always shown when the last plank has companions (not gated by `companionOpen`). */\n const effectiveCompanionVariant = companionVariant;\n const lastPlankId = active[active.length - 1];\n const lastPlankCompanions = useCompanions(lastPlankId);\n const breakpoint = useBreakpoints();\n const topbar = layoutAppliesTopbar(breakpoint, layoutMode);\n const deckRef = useRef<HTMLDivElement>(null);\n\n /** Clear scroll restoration state if the window is resized. */\n const scrollLeftRef = useRef<number>(null);\n useEffect(\n () =>\n addEventListener(window, 'resize', () => {\n scrollLeftRef.current = null;\n }),\n [],\n );\n\n const restoreScroll = useCallback(() => {\n if (deckRef.current && scrollLeftRef.current != null) {\n deckRef.current.scrollLeft = scrollLeftRef.current;\n }\n }, []);\n\n useOnTransition(layoutMode, (mode) => mode !== 'multi', 'multi', restoreScroll);\n\n /** Save scroll position as the user scrolls. */\n const handleScroll = useCallback((event: UIEvent) => {\n if (event.currentTarget === event.target) {\n scrollLeftRef.current = (event.target as HTMLDivElement).scrollLeft;\n }\n }, []);\n\n // Create order map.\n // In multi mode only the last plank hosts the companion pane, so only that plank adds the extra column.\n const { order, itemsCount } = useMemo(() => {\n const lastHasCompanions = lastPlankCompanions.length > 0;\n return active.reduce(\n (acc: { order: Record<string, number>; itemsCount: number }, entryId, index) => {\n const isLastPlank = index === active.length - 1;\n acc.order[entryId] = acc.itemsCount + 1;\n acc.itemsCount += lastHasCompanions && isLastPlank ? 3 : 2;\n return acc;\n },\n { order: {}, itemsCount: 0 },\n );\n }, [active, lastPlankCompanions.length]);\n\n return (\n <div className='relative bg-deck-surface overflow-hidden'>\n <DeckSidebarToggles topbar={topbar} fullscreen={fullscreen} />\n <Stack\n classNames={[\n 'absolute h-[calc(100%-2*var(--main-spacing))] w-full inset-y-(--main-spacing) -inset-w-px',\n mainPaddingTransitions,\n ]}\n orientation='horizontal'\n size='contain'\n itemsCount={itemsCount - 1}\n onScroll={handleScroll}\n ref={deckRef}\n >\n {active.map((entryId) => (\n <Fragment key={entryId}>\n {/* TODO(burdon): Setting for separator. */}\n <PlankSeparator hidden order={order[entryId] - 1} encapsulate={!!settings?.encapsulatedPlanks} />\n <PlankContainer\n id={entryId}\n part='multi'\n active={active}\n order={order[entryId]}\n layoutMode={layoutMode}\n companionVariant={effectiveCompanionVariant}\n settings={settings}\n />\n </Fragment>\n ))}\n </Stack>\n </div>\n );\n};\n\n//\n// SidebarToggles\n//\n\nconst sidebarToggleStyles = 'h-(--dx-rail-item) w-(--dx-rail-item) absolute bottom-2 z-[1] bg-deck-surface! lg:hidden';\n\nconst ToggleSidebarButton = () => <NaturalToggleSidebarButton classNames={mx(sidebarToggleStyles, 'left-2')} />;\nconst ToggleComplementarySidebarButton = () => (\n <NaturalToggleComplementarySidebarButton classNames={mx(sidebarToggleStyles, 'right-2')} />\n);\n\nconst ExitFullscreenButton = ({ onExit }: { onExit: () => void }) => {\n const { t } = useTranslation(meta.id);\n return (\n <div\n className={mx(\n 'fixed top-2 right-2 z-[1]',\n hoverableControls,\n hoverableFocusedWithinControls,\n 'transition-opacity opacity-(--controls-opacity)',\n )}\n >\n <IconButton\n label={t('exit-fullscreen.label')}\n icon='ph--corners-in--regular'\n iconOnly\n variant='ghost'\n tooltipSide='bottom'\n onClick={onExit}\n />\n </div>\n );\n};\n\nconst DeckSidebarToggles = ({ topbar, fullscreen }: { topbar: boolean; fullscreen: boolean }) => {\n if (topbar || fullscreen) {\n return null;\n }\n\n return (\n <>\n <ToggleSidebarButton />\n <ToggleComplementarySidebarButton />\n </>\n );\n};\n\n//\n// PlankSeparator\n//\n\nconst PlankSeparator = ({ order, hidden, encapsulate }: { order: number; hidden?: boolean; encapsulate?: boolean }) =>\n order > 0 && (\n <span\n role='separator'\n className={mx('row-span-2 bg-deck-surface', hidden && 'hidden', encapsulate ? 'w-0' : 'w-4')}\n style={{ gridColumn: order }}\n />\n );\n\n//\n// PlankContainer\n//\n\ntype PlankContainerProps = Pick<PlankRootProps, 'layoutMode' | 'part' | 'settings'> &\n Pick<PlankComponentProps, 'id'> &\n Partial<Pick<PlankComponentProps, 'path' | 'order' | 'active'>> & {\n companionVariant?: string;\n };\n\n/**\n * Connected Plank that calls hooks and renders the radix-style Plank tree.\n * This is the bridge between DeckViewport (which knows about framework hooks) and\n * the pure Plank components (which receive everything via context).\n */\nconst PlankContainer = memo(\n ({ id, layoutMode, part, order, settings, companionVariant, active, ...props }: PlankContainerProps) => {\n const { graph } = useAppGraph();\n const { invokePromise } = useOperationInvoker();\n const { state, deck } = useDeckState();\n const node = useNode(graph, id);\n const companions = useCompanions(id);\n const isLastPlankInMulti =\n layoutMode === 'multi' && active && active.length > 0 && active[active.length - 1] === id;\n const variantForThisPlank =\n layoutMode === 'multi' ? (isLastPlankInMulti ? companionVariant : undefined) : companionVariant;\n const { companionId } = useSelectedCompanion(companions, variantForThisPlank);\n const resolvedCompanionId =\n layoutMode === 'multi' && isLastPlankInMulti && companions.length > 0\n ? companionId\n : variantForThisPlank\n ? companionId\n : undefined;\n const currentCompanion = companions.find(({ id }) => id === resolvedCompanionId);\n const hasCompanion = !!(resolvedCompanionId && currentCompanion);\n\n const handleAdjust = useCallback(\n (plankId: string, type: DeckOperation.PartAdjustment) => {\n if (type === 'close') {\n if (part === 'complementary') {\n return invokePromise(LayoutOperation.UpdateComplementary, { state: 'collapsed' });\n } else if (active) {\n // Close the plank and everything to the right (stack pop).\n const index = active.indexOf(plankId);\n const toClose = index !== -1 ? active.slice(index) : [plankId];\n return invokePromise(LayoutOperation.Close, { subject: toClose });\n } else {\n return invokePromise(LayoutOperation.Close, { subject: [plankId] });\n }\n } else {\n return invokePromise(DeckOperation.Adjust, { type, id: plankId });\n }\n },\n [invokePromise, part, active],\n );\n\n const handleResize = useCallback(\n (plankId: string, size: number) => invokePromise(DeckOperation.UpdatePlankSize, { id: plankId, size }),\n [invokePromise],\n );\n\n const handleScrollIntoView = useCallback(\n (subject?: string) => invokePromise(LayoutOperation.ScrollIntoView, { subject }),\n [invokePromise],\n );\n\n const handleUpdateCompanion = useCallback(\n (companion: string | null) => invokePromise(LayoutOperation.UpdateCompanion, { subject: companion }),\n [invokePromise],\n );\n\n return (\n <Plank.Root\n graph={graph}\n layoutMode={layoutMode}\n part={part}\n settings={settings}\n popoverAnchorId={state.popoverAnchorId}\n scrollIntoView={state.scrollIntoView}\n plankSizing={deck.plankSizing}\n onAdjust={handleAdjust}\n onResize={handleResize}\n onScrollIntoView={handleScrollIntoView}\n onUpdateCompanion={handleUpdateCompanion}\n >\n <Plank.Content solo={part === 'solo'} companion={hasCompanion} encapsulate={!!settings?.encapsulatedPlanks}>\n <Plank.Component\n {...props}\n active={active}\n id={id}\n node={node}\n companioned={hasCompanion ? 'primary' : undefined}\n companions={hasCompanion ? [] : companions}\n order={order}\n {...(part === 'solo'\n ? {\n part: 'solo-primary',\n }\n : {\n part,\n })}\n />\n {hasCompanion && (\n <Plank.Component\n {...props}\n active={active}\n id={resolvedCompanionId}\n node={currentCompanion}\n companions={companions}\n companioned='companion'\n primary={node}\n {...(part === 'solo'\n ? {\n order,\n part: 'solo-companion',\n }\n : {\n order: (order ?? 0) + 1,\n part,\n })}\n />\n )}\n </Plank.Content>\n </Plank.Root>\n );\n },\n);\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { DeckContent, DeckContentProps } from './DeckContent';\nimport { DeckRoot, DeckLayoutChangeRequest, DeckRootProps } from './DeckRoot';\nimport { DeckViewport, DeckMultiMode, DeckSoloMode, DeckViewportProps, DeckContentEmpty } from './DeckViewport';\n\n/**\n * Radix-style composite Deck component.\n */\nexport const Deck = {\n Root: DeckRoot,\n Content: DeckContent,\n Viewport: DeckViewport,\n ContentEmpty: DeckContentEmpty,\n MultiMode: DeckMultiMode,\n SoloMode: DeckSoloMode,\n};\n\nexport type { DeckLayoutChangeRequest, DeckRootProps, DeckContentProps, DeckViewportProps };\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["React", "PlankLoading", "div", "className", "React", "useEffect", "useMemo", "useState", "TimeoutError", "log", "ErrorFallback", "useTranslation", "descriptionMessage", "mx", "meta", "React", "Fragment", "memo", "useCallback", "useEffect", "useMemo", "Surface", "AppSurface", "Graph", "useActionRunner", "Icon", "IconButton", "Popover", "toLocalizedString", "useTranslation", "getLinkedVariant", "StackItem", "TextTooltip", "hoverableControls", "hoverableFocusedWithinControls", "iconSize", "useBreakpoints", "meta", "PLANK_COMPANION_TYPE", "React", "forwardRef", "useCallback", "useOperationInvoker", "LayoutOperation", "ButtonGroup", "IconButton", "useTranslation", "meta", "plankControlSpacing", "PlankCompanionControls", "primary", "forwardedRef", "t", "id", "invokePromise", "handleCloseCompanion", "UpdateCompanion", "subject", "div", "ref", "className", "PlankControl", "label", "variant", "icon", "onClick", "classNames", "props", "iconOnly", "tooltipSide", "PlankControls", "children", "capabilities", "layoutMode", "pin", "close", "buttonClassNames", "layoutIsAnySolo", "startsWith", "deck", "solo", "disabled", "incrementStart", "incrementEnd", "fullscreen", "data-testid", "companion", "createContext", "React", "PLANK_NAME", "PlankProvider", "usePlankContext", "PlankRoot", "children", "context", "MAX_COMPANIONS", "PlankHeading", "memo", "id", "part", "node", "deckEnabled", "canIncrementStart", "canIncrementEnd", "popoverAnchorId", "primaryId", "pending", "companioned", "companions", "layoutMode", "actions", "debug", "t", "useTranslation", "meta", "graph", "onAdjust", "onUpdateCompanion", "usePlankContext", "runAction", "useActionRunner", "breakpoint", "useBreakpoints", "icon", "properties", "label", "toLocalizedString", "ns", "isCompanionNode", "type", "PLANK_COMPANION_TYPE", "useEffect", "frame", "requestAnimationFrame", "Graph", "expand", "cancelAnimationFrame", "attendableId", "capabilities", "useMemo", "deck", "solo", "incrementStart", "incrementEnd", "fullscreen", "companion", "length", "variant", "getLinkedVariant", "undefined", "sigilActions", "getActions", "filter", "action", "includes", "disposition", "a", "handleAction", "useCallback", "data", "parent", "caller", "handlePlankAction", "eventType", "ActionRoot", "Popover", "Anchor", "Fragment", "handleTabClick", "event", "target", "closest", "tabId", "dataset", "React", "StackItem", "Heading", "data-tauri-drag-region", "data-plank-heading", "style", "iconSize", "classNames", "hoverableControls", "hoverableFocusedWithinControls", "div", "className", "map", "IconButton", "key", "data-id", "iconOnly", "onClick", "Sigil", "related", "triggerLabel", "onAction", "Surface", "AppSurface", "MenuFooter", "subject", "SigilButton", "span", "Icon", "TextTooltip", "text", "onlyWhenTruncating", "HeadingLabel", "NavbarEnd", "PlankCompanionControls", "primary", "PlankControls", "close", "PlankError", "useEffect", "timer", "setTimeout", "setTimedOut", "error", "useMemo", "TimeoutError", "message", "timedOut", "part", "node", "pending", "React", "PlankLoading", "meta", "log", "process", "title", "role", "className", "p", "mx", "errorString", "useFocusFinders", "React", "memo", "useCallback", "useLayoutEffect", "useMemo", "useRef", "Surface", "AppSurface", "debounce", "mainIntrinsicSize", "getLinkedVariant", "useAttentionAttributes", "StackItem", "railGridHorizontal", "mx", "useMainSize", "PLANK_COMPANION_TYPE", "smoothScrollTo", "element", "target", "duration", "start", "scrollLeft", "distance", "startTime", "performance", "now", "step", "currentTime", "elapsed", "progress", "Math", "min", "eased", "pow", "requestAnimationFrame", "DEFAULT_SIZE", "DEFAULT_COMPANION_SIZE", "PlankComponent", "memo", "part", "id", "path", "order", "active", "node", "primary", "companions", "companioned", "layoutMode", "settings", "popoverAnchorId", "scrollIntoView", "plankSizing", "onResize", "onScrollIntoView", "usePlankContext", "canResize", "findFirstFocusable", "useFocusFinders", "isCompanion", "attentionId", "attentionAttrs", "useAttentionAttributes", "orderId", "index", "findIndex", "entryId", "length", "isOrdered", "canIncrementStart", "canIncrementEnd", "rootElement", "useRef", "variant", "type", "PLANK_COMPANION_TYPE", "getLinkedVariant", "undefined", "sizeAttrs", "useMainSize", "sizeKey", "split", "size", "handleSizeChange", "useCallback", "debounce", "nextSize", "round", "handleKeyDown", "event", "currentTarget", "key", "current", "closest", "focus", "useLayoutEffect", "scrollParent", "elementRect", "getBoundingClientRect", "parentRect", "targetScrollLeft", "left", "isSolo", "startsWith", "isAttendable", "attendableId", "data", "useMemo", "subject", "companionTo", "properties", "placeholder", "React", "PlankLoading", "Root", "StackItem", "fullscreen", "classNames", "mainIntrinsicSize", "railGridHorizontal", "encapsulatedPlanks", "ref", "data-testid", "data-popover-collision-boundary", "tabIndex", "className", "mx", "role", "item", "onSizeChange", "onKeyDown", "PlankHeading", "deckEnabled", "enableDeck", "primaryId", "Surface", "AppSurface", "Article", "limit", "fallback", "PlankErrorFallback", "PlankError", "ResizeHandle", "React", "composable", "composableProps", "mainIntrinsicSize", "railGridHorizontal", "useMainSize", "PlankContent", "children", "solo", "companion", "encapsulate", "props", "forwardedRef", "sizeAttrs", "div", "role", "classNames", "data-popover-collision-boundary", "ref", "Plank", "Root", "PlankRoot", "Content", "PlankContent", "Component", "PlankComponent", "Heading", "PlankHeading", "Controls", "PlankControls", "React", "useCallback", "useOperationInvoker", "LayoutOperation", "IconButton", "useTranslation", "getLinkedVariant", "useDeckCompanions", "useDeckState", "meta", "ToggleSidebarButton", "classNames", "variant", "updateState", "t", "id", "handleClick", "state", "sidebarState", "icon", "iconOnly", "size", "label", "onClick", "CloseSidebarButton", "ToggleComplementarySidebarButton", "inR0", "current", "invokePromise", "companions", "nextState", "complementarySidebarState", "subject", "complementarySidebarPanel", "UpdateComplementary", "tooltipSide", "undefined", "React", "useCallback", "useEffect", "useMemo", "useState", "Surface", "useOperationInvoker", "LayoutOperation", "IconButton", "Main", "Panel", "toLocalizedString", "Toolbar", "useTranslation", "getLinkedVariant", "Tabs", "iconSize", "mx", "useBreakpoints", "useDeckCompanions", "useDeckState", "meta", "getMode", "label", "ns", "meta", "id", "ComplementarySidebar", "current", "invokePromise", "useOperationInvoker", "t", "useTranslation", "state", "deck", "updateState", "useDeckState", "layoutMode", "getMode", "breakpoint", "useBreakpoints", "topbar", "layoutAppliesTopbar", "companions", "useDeckCompanions", "activeCompanion", "find", "companion", "getLinkedVariant", "activeId", "internalValue", "setInternalValue", "useState", "useEffect", "handleTabClick", "useCallback", "event", "nextValue", "currentTarget", "getAttribute", "complementarySidebarState", "LayoutOperation", "UpdateComplementary", "subject", "data", "useMemo", "React", "Main", "classNames", "Tabs", "Root", "orientation", "value", "div", "data-tauri-drag-region", "style", "iconSize", "className", "mx", "Tablist", "map", "Tab", "key", "asChild", "IconButton", "toLocalizedString", "properties", "icon", "iconOnly", "tooltipSide", "data-value", "joyride", "variant", "onClick", "Surface", "role", "ToggleComplementarySidebarButton", "Panel", "inert", "ComplementarySidebarPanel", "Toolbar", "size", "Content", "fallback", "PlankErrorFallback", "placeholder", "PlankLoading", "React", "useMemo", "Surface", "AppSurface", "Main", "useBreakpoints", "useDeckState", "meta", "getMode", "label", "ns", "meta", "id", "Sidebar", "state", "deck", "useDeckState", "popoverAnchorId", "activeDeck", "current", "breakpoint", "useBreakpoints", "layoutMode", "getMode", "topbar", "layoutAppliesTopbar", "navigationData", "useMemo", "React", "Main", "NavigationSidebar", "classNames", "Surface", "type", "AppSurface", "Navigation", "data", "limit", "React", "useCallback", "useEffect", "useRef", "AttentionCapabilities", "Main", "useMediaQuery", "useBreakpoints", "React", "Surface", "useTranslation", "mx", "osTranslations", "meta", "Banner", "variant", "classNames", "t", "useTranslation", "meta", "id", "React", "header", "className", "mx", "CloseSidebarButton", "ToggleSidebarButton", "span", "ns", "osTranslations", "div", "Surface", "role", "limit", "createContext", "React", "DECK_NAME", "DECK_ROOT_NAME", "DeckProvider", "useDeckContext", "DeckRoot", "children", "context", "displayName", "DECK_CONTENT_NAME", "DeckContent", "children", "state", "sidebarState", "complementarySidebarState", "complementarySidebarPanel", "deck", "active", "fullscreen", "solo", "updateState", "layoutMode", "settings", "pluginManager", "onLayoutChange", "useDeckContext", "breakpoint", "useBreakpoints", "topbar", "layoutAppliesTopbar", "useEffect", "attention", "capabilities", "get", "AttentionCapabilities", "Attention", "attended", "getCurrent", "firstId", "length", "document", "querySelector", "focus", "isNotMobile", "useMediaQuery", "shouldRevert", "useRef", "current", "subject", "mode", "revert", "enableDeck", "handleNavigationSidebarStateChange", "useCallback", "next", "s", "handleComplementarySidebarStateChange", "React", "Main", "Root", "navigationSidebarState", "onNavigationSidebarStateChange", "onComplementarySidebarStateChange", "Sidebar", "ComplementarySidebar", "Overlay", "Banner", "variant", "displayName", "React", "Fragment", "memo", "useCallback", "useEffect", "useMemo", "useRef", "Surface", "useOperationInvoker", "LayoutOperation", "useAppGraph", "addEventListener", "invariant", "useNode", "IconButton", "Main", "useOnTransition", "useTranslation", "mainPaddingTransitions", "DEFAULT_HORIZONTAL_SIZE", "Stack", "StackContext", "hoverableControls", "hoverableFocusedWithinControls", "mx", "useBreakpoints", "useCompanions", "useDeckState", "useSelectedCompanion", "meta", "DeckOperation", "getMode", "__dxlog_file", "DECK_VIEWPORT_NAME", "breakpoint", "useBreakpoints", "topbar", "layoutAppliesTopbar", "layoutMode", "bounce", "handlesFocus", "classNames", "style", "complementarySidebarState", "plankSizing", "DEFAULT_HORIZONTAL_SIZE", "length", "children", "DeckViewport", "displayName", "deck", "useDeckState", "getMode", "className", "React", "role", "Surface", "ToggleSidebarButton", "companionOpen", "companionVariant", "effectiveCompanionVariant", "fullscreen", "undefined", "invariant", "solo", "useEffect", "preventDefault", "event", "stopPropagation", "onLayoutChange", "mode", "document", "DeckSidebarToggles", "onExit", "value", "orientation", "size", "rail", "id", "settings", "lastPlankId", "active", "deckRef", "useRef", "addEventListener", "restoreScroll", "useCallback", "current", "scrollLeftRef", "useOnTransition", "currentTarget", "scrollLeft", "acc", "entryId", "index", "itemsCount", "lastHasCompanions", "isLastPlank", "order", "mainPaddingTransitions", "onScroll", "ref", "key", "PlankSeparator", "hidden", "encapsulate", "sidebarToggleStyles", "ToggleComplementarySidebarButton", "ExitFullscreenButton", "meta", "IconButton", "label", "mx", "hoverableControls", "hoverableFocusedWithinControls", "iconOnly", "variant", "tooltipSide", "onClick", "gridColumn", "useOperationInvoker", "state", "node", "graph", "companions", "useCompanions", "isLastPlankInMulti", "variantForThisPlank", "useSelectedCompanion", "resolvedCompanionId", "companionId", "currentCompanion", "hasCompanion", "handleAdjust", "plankId", "type", "invokePromise", "LayoutOperation", "part", "popoverAnchorId", "scrollIntoView", "onAdjust", "onResize", "handleResize", "onScrollIntoView", "onUpdateCompanion", "companioned", "primary", "Deck", "Root", "DeckRoot", "Content", "DeckContent", "Viewport", "DeckViewport", "ContentEmpty", "DeckContentEmpty", "MultiMode", "DeckMultiMode", "SoloMode", "DeckSoloMode"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/notification-tracker.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Fiber from 'effect/Fiber';\nimport * as Stream from 'effect/Stream';\n\nimport { Capabilities, Capability, type PluginManager } from '@dxos/app-framework';\nimport { type LayoutOperation, SettingsOperation } from '@dxos/app-toolkit';\nimport { Process } from '@dxos/compute';\n\nimport { meta } from '#meta';\nimport { DeckCapabilities } from '#types';\n\nconst NOTIFY_TOAST_DURATION = 5_000;\nconst ERROR_TOAST_DURATION = 10_000;\nconst UNDO_TOAST_DURATION = 10_000;\n\n/**\n * The single producer of toasts driven by operation invocations:\n * - Per-invoke notifications ride the process monitor: each invocation spawns a process carrying the\n * caller's `notify` config on its params; this tracker watches process state transitions and toasts\n * on start / success / failure.\n * - Undo toasts come from the history tracker's `undoable` stream (it owns the undo registry lookup);\n * the toast action triggers `historyTracker.undoPromise()`.\n */\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const capabilities = yield* Capability.Service;\n const registry = yield* Capability.get(Capabilities.AtomRegistry);\n const ephemeralAtom = yield* Capability.get(DeckCapabilities.EphemeralState);\n const monitor = yield* Capability.get(Capabilities.ProcessMonitor);\n const manager = yield* Capability.get(Capabilities.PluginManager);\n const invoker = yield* Capability.get(Capabilities.OperationInvoker);\n\n const addToast = (toast: LayoutOperation.Toast) => {\n const state = registry.get(ephemeralAtom);\n registry.set(ephemeralAtom, { ...state, toasts: [...state.toasts, toast] });\n };\n\n //\n // Notifications — driven by the process monitor.\n //\n\n // Tracks the last-seen state per process so we only toast on transitions.\n const lastState = new Map<Process.ID, Process.State>();\n\n const handleProcesses = (processes: readonly Process.Info[]) => {\n const seen = new Set<Process.ID>();\n for (const process of processes) {\n seen.add(process.pid);\n const previous = lastState.get(process.pid);\n lastState.set(process.pid, process.state);\n if (previous === process.state) {\n continue;\n }\n\n const notify = process.params.notify;\n if (!notify) {\n continue;\n }\n\n // Transition into RUNNING (the first snapshot may be a pre-RUNNING state like IDLE/HYBERNATING).\n if (previous !== Process.State.RUNNING && process.state === Process.State.RUNNING && notify.start) {\n addToast({ id: `notify-start-${process.pid}`, title: notify.start, duration: NOTIFY_TOAST_DURATION });\n } else if (process.state === Process.State.SUCCEEDED && notify.success) {\n addToast({ id: `notify-success-${process.pid}`, title: notify.success, duration: NOTIFY_TOAST_DURATION });\n } else if (process.state === Process.State.FAILED && notify.error) {\n addToast({\n id: `notify-error-${process.pid}`,\n title: notify.error,\n ...(process.error ? { description: process.error } : {}),\n icon: 'ph--warning--regular',\n duration: ERROR_TOAST_DURATION,\n });\n }\n }\n\n // Drop bookkeeping for processes that have left the tree.\n for (const pid of lastState.keys()) {\n if (!seen.has(pid)) {\n lastState.delete(pid);\n }\n }\n };\n\n const unsubscribeMonitor = registry.subscribe(monitor.processTreeAtom, handleProcesses);\n\n //\n // Plugin failures — show one toast when any plugin fails to activate, with a link to the registry.\n //\n\n let hasShownFailureToast = false;\n\n const handleFailures = (failures: readonly PluginManager.PluginFailure[]) => {\n if (failures.length === 0) {\n hasShownFailureToast = false;\n return;\n }\n if (hasShownFailureToast) {\n return;\n }\n hasShownFailureToast = true;\n // Replace any stale plugin-failure toast so at most one is ever visible.\n const toast: LayoutOperation.Toast = {\n id: 'plugin-failure',\n title: ['plugin-failure.title', { ns: meta.id }],\n description: ['plugin-failure.description', { ns: meta.id }],\n icon: 'ph--warning--regular',\n duration: ERROR_TOAST_DURATION,\n actionLabel: ['plugin-failure-action.label', { ns: meta.id }],\n actionAlt: ['plugin-failure-action.alt', { ns: meta.id }],\n onAction: () => void invoker.invokePromise(SettingsOperation.OpenPluginRegistry),\n };\n const state = registry.get(ephemeralAtom);\n registry.set(ephemeralAtom, {\n ...state,\n toasts: [...state.toasts.filter((t) => t.id !== 'plugin-failure'), toast],\n });\n };\n\n const unsubscribeFailures = registry.subscribe(manager.failed, handleFailures);\n\n //\n // Undo — driven by the history tracker's `undoable` stream (it owns the registry lookup).\n //\n\n const showUndoToast = (message: LayoutOperation.Toast['title'], onUndo: () => void) => {\n const undoId = `notify-undo-${crypto.randomUUID()}`;\n const state = registry.get(ephemeralAtom);\n // Replace the previous undo toast (only the most recent action can be undone).\n const toasts = state.currentUndoId\n ? state.toasts.filter((toast) => toast.id !== state.currentUndoId)\n : state.toasts;\n const toast: LayoutOperation.Toast = {\n id: undoId,\n title: message ?? ['undo-available.label', { ns: meta.id }],\n duration: UNDO_TOAST_DURATION,\n actionLabel: ['undo-action.label', { ns: meta.id }],\n actionAlt: ['undo-action.alt', { ns: meta.id }],\n closeLabel: ['undo-close.label', { ns: meta.id }],\n onAction: onUndo,\n };\n registry.set(ephemeralAtom, { ...state, currentUndoId: undoId, toasts: [...toasts, toast] });\n };\n\n // The history tracker is contributed on ProcessManagerReady, possibly after this module activates;\n // `waitFor` resolves it once available, then we observe its undoable stream.\n const undoFiber = Effect.runFork(\n Effect.gen(function* () {\n const historyTracker = yield* Capability.waitFor(Capabilities.HistoryTracker);\n yield* Stream.fromPubSub(historyTracker.undoable).pipe(\n Stream.runForEach((event) =>\n Effect.sync(() => showUndoToast(event.message, () => void historyTracker.undoPromise())),\n ),\n );\n }).pipe(Effect.provideService(Capability.Service, capabilities)),\n );\n\n // Track all subscriptions so they are torn down when the module deactivates.\n return Capability.contributes(Capabilities.Null, null, () =>\n Effect.gen(function* () {\n unsubscribeMonitor();\n unsubscribeFailures();\n yield* Fiber.interrupt(undoFiber);\n }),\n );\n }),\n);\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Effect", "Fiber", "Stream", "Capabilities", "Capability", "SettingsOperation", "Process", "meta", "DeckCapabilities", "NOTIFY_TOAST_DURATION", "ERROR_TOAST_DURATION", "UNDO_TOAST_DURATION", "makeModule", "fnUntraced", "capabilities", "Service", "registry", "get", "AtomRegistry", "ephemeralAtom", "EphemeralState", "monitor", "ProcessMonitor", "manager", "PluginManager", "invoker", "OperationInvoker", "addToast", "toast", "state", "set", "toasts", "lastState", "Map", "handleProcesses", "processes", "seen", "Set", "process", "add", "pid", "previous", "notify", "params", "State", "RUNNING", "start", "id", "title", "duration", "SUCCEEDED", "success", "FAILED", "error", "description", "icon", "keys", "has", "delete", "unsubscribeMonitor", "subscribe", "processTreeAtom", "hasShownFailureToast", "handleFailures", "failures", "length", "ns", "actionLabel", "actionAlt", "onAction", "invokePromise", "OpenPluginRegistry", "filter", "t", "unsubscribeFailures", "failed", "showUndoToast", "message", "onUndo", "undoId", "crypto", "randomUUID", "currentUndoId", "closeLabel", "undoFiber", "runFork", "gen", "historyTracker", "waitFor", "HistoryTracker", "fromPubSub", "undoable", "pipe", "runForEach", "event", "sync", "undoPromise", "provideService", "contributes", "Null", "interrupt"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/operations/open.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport * as Option from 'effect/Option';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport {\n AppCapabilities,\n LayoutOperation,\n createEdgeExistenceChecker,\n expandPath,\n validateNavigationTarget,\n} from '@dxos/app-toolkit';\nimport { Operation } from '@dxos/compute';\nimport { Context } from '@dxos/context';\nimport { Database, EID, Obj } from '@dxos/echo';\nimport { log } from '@dxos/log';\nimport { AttentionCapabilities } from '@dxos/plugin-attention';\nimport { ClientCapabilities } from '@dxos/plugin-client';\nimport { Graph } from '@dxos/plugin-graph';\nimport { ObservabilityOperation } from '@dxos/plugin-observability';\n\nimport { openSubjectsOnActiveDeck } from '../layout';\nimport { DeckCapabilities } from '../types';\nimport { computeActiveUpdates } from '../util';\nimport { updateActiveDeck } from './helpers';\n\nconst handler: Operation.WithHandler<typeof LayoutOperation.Open> = LayoutOperation.Open.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* (input) {\n log('LayoutOperation.Open handler start');\n const { graph } = yield* Capability.get(AppCapabilities.AppGraph);\n const attention = yield* Capability.get(AttentionCapabilities.Attention);\n\n // Validate navigation targets, redirecting to 404 if not found.\n const capabilities = yield* Capability.Service;\n const pathResolvers = capabilities.getAll(AppCapabilities.NavigationPathResolver);\n const client = yield* Capability.get(ClientCapabilities.Client).pipe(\n Effect.catchAll(() => Effect.succeed(undefined)),\n );\n // Existence checkers for the resolved EID: local (load + catchTag) first, then remote (edge).\n const checkLocalExistence = client\n ? (id: EID.EID) => {\n const spaceId = EID.getSpaceId(id);\n const space = spaceId ? client.spaces.get(spaceId) : undefined;\n if (!space) {\n return Effect.succeed(false);\n }\n return Database.load(space.db.makeRef(id)).pipe(\n Effect.as(true),\n Effect.catchTag('EntityNotFoundError', () => Effect.succeed(false)),\n Effect.catchAll(() => Effect.succeed(false)),\n );\n }\n : undefined;\n const checkRemoteExistence = client\n ? createEdgeExistenceChecker((spaceId, body) => client.edge.http.execQuery(new Context(), spaceId, body))\n : undefined;\n\n // Immediate: skip 404 / resolver checks but still expand the path (same as validate’s first step).\n if (input.navigation === 'immediate') {\n for (const subjectId of input.subject) {\n expandPath(graph, subjectId);\n }\n }\n\n const validatedSubjects = yield* Effect.all(\n input.subject.map((subjectId) =>\n input.navigation === 'immediate'\n ? Effect.succeed(subjectId)\n : validateNavigationTarget({ graph, subjectId, pathResolvers, checkLocalExistence, checkRemoteExistence }),\n ),\n );\n input = { ...input, subject: validatedSubjects };\n\n {\n const state = yield* Capabilities.getAtomValue(DeckCapabilities.State);\n if (input.workspace && state.activeDeck !== input.workspace) {\n yield* Operation.invoke(LayoutOperation.SwitchWorkspace, { subject: input.workspace });\n }\n }\n\n // Dedup subjects against the active deck using DXN identity.\n // The same object can appear under different graph paths (e.g., via collections vs types).\n // Resolve each subject's DXN and, if it matches an already-open deck item, remap the\n // subject to the existing deck entry so that openEntry's exact-match check succeeds.\n // Only needed in multi (deck) mode; solo mode replaces the single visible item anyway.\n {\n const deck = yield* DeckCapabilities.getDeck();\n const active = !deck.solo && deck.initialized ? deck.active : [];\n if (active.length > 0 && input.subject.length > 0) {\n const resolveDXN = (qualifiedPath: string) =>\n Effect.reduce(pathResolvers, Option.none<string>(), (acc, resolver) =>\n Option.isSome(acc)\n ? Effect.succeed(acc)\n : resolver(qualifiedPath).pipe(\n Effect.map((opt) => Option.map(opt, (dxn) => dxn.toString())),\n Effect.catchAll(() => Effect.succeed(Option.none<string>())),\n ),\n );\n\n // Build DXN → deck item ID map for active items.\n const deckDxnMap = new Map<string, string>();\n yield* Effect.all(\n active.map((deckId) =>\n resolveDXN(deckId).pipe(\n Effect.map((opt) => {\n if (Option.isSome(opt)) {\n deckDxnMap.set(opt.value, deckId);\n }\n }),\n ),\n ),\n { concurrency: 'unbounded' },\n );\n\n // Remap subjects whose DXN matches an existing deck item.\n if (deckDxnMap.size > 0) {\n const remapped = yield* Effect.all(\n input.subject.map((subjectId) =>\n resolveDXN(subjectId).pipe(\n Effect.map((opt) => {\n if (Option.isSome(opt)) {\n const existing = deckDxnMap.get(opt.value);\n if (existing && existing !== subjectId) {\n return existing;\n }\n }\n return subjectId;\n }),\n ),\n ),\n { concurrency: 'unbounded' },\n );\n input = { ...input, subject: remapped };\n }\n }\n }\n\n // Compute the next active deck state and apply it.\n // In solo or uninitialized mode the subject list replaces the deck entirely.\n // In multi (deck) mode, subjects are merged via openSubjectsOnActiveDeck which\n // uses stack semantics (truncate after pivot, then push new entries).\n let previouslyOpenIds: Set<string>;\n {\n const deck = yield* DeckCapabilities.getDeck();\n previouslyOpenIds = new Set<string>(deck.solo ? [deck.solo] : deck.active);\n const next =\n deck.solo || !deck.initialized\n ? [...input.subject]\n : openSubjectsOnActiveDeck(deck.active, input.subject, {\n pivotId: input.pivotId,\n key: input.key,\n });\n\n const { deckUpdates, toAttend: _toAttend } = computeActiveUpdates({ next, deck, attention });\n yield* Capabilities.updateAtomValue(DeckCapabilities.State, (state) => updateActiveDeck(state, deckUpdates));\n }\n\n // Schedule side-effects for the newly opened items: scroll into view, expose in\n // the navigation sidebar, and emit observability events.\n // When nothing is newly opened (subject was already visible), the fallback\n // `input.subject[0]` still triggers scroll and expose so the user is taken there.\n {\n const deck = yield* DeckCapabilities.getDeck();\n const ids = deck.solo ? [deck.solo] : deck.active;\n const newlyOpen = ids.filter((i: string) => !previouslyOpenIds.has(i));\n\n if (input.scrollIntoView !== false && (newlyOpen[0] ?? input.subject[0])) {\n yield* Operation.schedule(LayoutOperation.ScrollIntoView, {\n subject: newlyOpen[0] ?? input.subject[0],\n });\n }\n\n if (newlyOpen[0] ?? input.subject[0]) {\n yield* Operation.schedule(LayoutOperation.Expose, { subject: newlyOpen[0] ?? input.subject[0] });\n }\n\n for (const subjectId of newlyOpen) {\n const typename = Option.match(Graph.getNode(graph, subjectId), {\n onNone: () => undefined,\n onSome: (node) => {\n const active = node.data;\n return Obj.isObject(active) ? Obj.getTypename(active) : undefined;\n },\n });\n yield* Operation.schedule(ObservabilityOperation.SendEvent, {\n name: 'navigation.activate',\n properties: { subjectId, typename },\n });\n }\n }\n\n return validatedSubjects;\n }),\n ),\n);\n\nexport default handler;\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Effect", "Option", "Capabilities", "Capability", "AppCapabilities", "LayoutOperation", "createEdgeExistenceChecker", "expandPath", "validateNavigationTarget", "Operation", "Context", "Database", "EID", "Obj", "log", "AttentionCapabilities", "ClientCapabilities", "Graph", "ObservabilityOperation", "LayoutOperation", "graph", "Capability", "get", "AppCapabilities", "AttentionCapabilities", "capabilities", "Service", "client", "ClientCapabilities", "checkLocalExistence", "id", "spaces", "space", "Effect", "succeed", "load", "makeRef", "undefined", "checkRemoteExistence", "createEdgeExistenceChecker", "spaceId", "body", "Context", "input", "expandPath", "subjectId", "pathResolvers", "subject", "Operation", "invoke", "SwitchWorkspace", "workspace", "active", "length", "resolveDXN", "qualifiedPath", "reduce", "deckDxnMap", "Map", "isSome", "opt", "set", "deckId", "concurrency", "Option", "value", "existing", "deck", "next", "openSubjectsOnActiveDeck", "pivotId", "key", "deckUpdates", "attention", "newlyOpen", "schedule", "ScrollIntoView", "onNone", "onSome", "node", "isObject", "properties", "typename"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/react-root.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport React, { useCallback } from 'react';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\n\nimport { DeckLayout } from '#containers';\nimport { useDeckState } from '#hooks';\nimport { meta } from '#meta';\n\nexport default Capability.makeModule(() =>\n Effect.succeed(\n Capability.contributes(Capabilities.ReactRoot, {\n id: meta.id,\n root: () => {\n const { state, updateEphemeral } = useDeckState();\n\n const handleDismissToast = useCallback(\n (id: string) => {\n if (!state.toasts.some((toast) => toast.id === id)) {\n return;\n }\n // Allow time for the toast exit animation (animate-toast-hide, 100ms) before unmounting.\n // TODO(burdon): Factor out and unregister timeout.\n setTimeout(() => {\n // Re-resolve the toast by id inside the update: the toast list may have changed during\n // the delay, so a captured index would point at the wrong (or a missing) entry.\n updateEphemeral((s) => {\n const toastToRemove = s.toasts.find((toast) => toast.id === id);\n if (!toastToRemove) {\n return s;\n }\n const newCurrentUndoId = toastToRemove.id === s.currentUndoId ? undefined : s.currentUndoId;\n return {\n ...s,\n currentUndoId: newCurrentUndoId,\n toasts: s.toasts.filter((toast) => toast.id !== id),\n };\n });\n }, 150);\n },\n [state.toasts, updateEphemeral],\n );\n\n return <DeckLayout onDismissToast={handleDismissToast} />;\n },\n }),\n ),\n);\n"],
|
|
5
|
-
"mappings": ";;;AAIA,YAAYA,YAAY;AACxB,OAAOC,SAASC,mBAAmB;AAEnC,SAASC,cAAcC,kBAAkB;AAEzC,SAASC,kBAAkB;AAC3B,SAASC,oBAAoB;AAC7B,SAASC,YAAY;AAErB,IAAA,qBAAeH,WAAWI,WAAW,MAC5BC,eACLL,WAAWM,YAAYP,aAAaQ,WAAW;EAC7CC,IAAIL,KAAKK;EACTC,MAAM,MAAA;AACJ,UAAM,EAAEC,OAAOC,gBAAe,IAAKT,aAAAA;AAEnC,UAAMU,qBAAqBd,YACzB,CAACU,OAAAA;AACC,UAAI,CAACE,MAAMG,OAAOC,KAAK,CAACC,UAAUA,MAAMP,OAAOA,EAAAA,GAAK;AAClD;MACF;AAGAQ,iBAAW,MAAA;AAGTL,wBAAgB,CAACM,MAAAA;AACf,gBAAMC,gBAAgBD,EAAEJ,OAAOM,KAAK,CAACJ,UAAUA,MAAMP,OAAOA,EAAAA;AAC5D,cAAI,CAACU,eAAe;AAClB,mBAAOD;UACT;AACA,gBAAMG,mBAAmBF,cAAcV,OAAOS,EAAEI,gBAAgBC,SAAYL,EAAEI;AAC9E,iBAAO;YACL,GAAGJ;YACHI,eAAeD;YACfP,QAAQI,EAAEJ,OAAOU,OAAO,CAACR,UAAUA,MAAMP,OAAOA,EAAAA;UAClD;QACF,CAAA;MACF,GAAG,GAAA;IACL,GACA;MAACE,MAAMG;MAAQF;KAAgB;AAGjC,WAAO,sBAAA,cAACV,YAAAA;MAAWuB,gBAAgBZ;;EACrC;AACF,CAAA,CAAA,CAAA;",
|
|
6
|
-
"names": ["Effect", "React", "useCallback", "Capabilities", "Capability", "DeckLayout", "useDeckState", "meta", "makeModule", "succeed", "contributes", "ReactRoot", "id", "root", "state", "updateEphemeral", "handleDismissToast", "toasts", "some", "toast", "setTimeout", "s", "toastToRemove", "find", "newCurrentUndoId", "currentUndoId", "undefined", "filter", "onDismissToast"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/react-surface.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\nimport React from 'react';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { Surface, useSettingsState } from '@dxos/app-framework/ui';\nimport { NOT_FOUND_PATH } from '@dxos/app-toolkit';\nimport { AppSurface, NotFoundArticle } from '@dxos/app-toolkit/ui';\n\nimport { DeckSettings } from '#components';\nimport { meta } from '#meta';\nimport { type Settings } from '#types';\n\nexport default Capability.makeModule(() =>\n Effect.succeed(\n Capability.contributes(Capabilities.ReactSurface, [\n Surface.create({\n id: 'pluginSettings',\n filter: AppSurface.settings(AppSurface.Article, meta.id),\n component: ({ data: { subject } }) => {\n const { settings, updateSettings } = useSettingsState<Settings.Settings>(subject.atom);\n return <DeckSettings settings={settings} onSettingsChange={updateSettings} />;\n },\n }),\n Surface.create({\n id: 'notFound',\n role: 'article',\n filter: (data): data is { attendableId: string } => data.attendableId === NOT_FOUND_PATH,\n component: () => <NotFoundArticle />,\n }),\n ]),\n ),\n);\n"],
|
|
5
|
-
"mappings": ";;;AAIA,YAAYA,YAAY;AACxB,OAAOC,WAAW;AAElB,SAASC,cAAcC,kBAAkB;AACzC,SAASC,SAASC,wBAAwB;AAC1C,SAASC,sBAAsB;AAC/B,SAASC,YAAYC,uBAAuB;AAE5C,SAASC,oBAAoB;AAC7B,SAASC,YAAY;AAGrB,IAAA,wBAAeP,WAAWQ,WAAW,MAC5BC,eACLT,WAAWU,YAAYX,aAAaY,cAAc;EAChDV,QAAQW,OAAO;IACbC,IAAI;IACJC,QAAQV,WAAWW,SAASX,WAAWY,SAAST,KAAKM,EAAE;IACvDI,WAAW,CAAC,EAAEC,MAAM,EAAEC,QAAO,EAAE,MAAE;AAC/B,YAAM,EAAEJ,UAAUK,eAAc,IAAKlB,iBAAoCiB,QAAQE,IAAI;AACrF,aAAO,sBAAA,cAACf,cAAAA;QAAaS;QAAoBO,kBAAkBF;;IAC7D;EACF,CAAA;EACAnB,QAAQW,OAAO;IACbC,IAAI;IACJU,MAAM;IACNT,QAAQ,CAACI,SAA2CA,KAAKM,iBAAiBrB;IAC1Ec,WAAW,MAAM,sBAAA,cAACZ,iBAAAA,IAAAA;EACpB,CAAA;CACD,CAAA,CAAA;",
|
|
6
|
-
"names": ["Effect", "React", "Capabilities", "Capability", "Surface", "useSettingsState", "NOT_FOUND_PATH", "AppSurface", "NotFoundArticle", "DeckSettings", "meta", "makeModule", "succeed", "contributes", "ReactSurface", "create", "id", "filter", "settings", "Article", "component", "data", "subject", "updateSettings", "atom", "onSettingsChange", "role", "attendableId"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/settings.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { AppCapabilities } from '@dxos/app-toolkit';\nimport { createKvsStore } from '@dxos/effect';\n\nimport { meta } from '#meta';\nimport { DeckCapabilities, Settings } from '#types';\n\nexport default Capability.makeModule(() =>\n Effect.sync(() => {\n const settingsAtom = createKvsStore({\n key: meta.id,\n schema: Settings.Settings,\n defaultValue: () => ({\n showHints: false,\n enableDeck: false,\n enableNativeRedirect: false,\n encapsulatedPlanks: false,\n }),\n });\n\n return [\n Capability.contributes(DeckCapabilities.Settings, settingsAtom),\n Capability.contributes(AppCapabilities.Settings, {\n prefix: meta.id,\n schema: Settings.Settings,\n atom: settingsAtom,\n }),\n ];\n }),\n);\n"],
|
|
5
|
-
"mappings": ";;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,uBAAuB;AAChC,SAASC,sBAAsB;AAE/B,SAASC,YAAY;AACrB,SAASC,kBAAkBC,gBAAgB;AAE3C,IAAA,mBAAeL,WAAWM,WAAW,MAC5BC,YAAK,MAAA;AACV,QAAMC,eAAeN,eAAe;IAClCO,KAAKN,KAAKO;IACVC,QAAQN,SAASA;IACjBO,cAAc,OAAO;MACnBC,WAAW;MACXC,YAAY;MACZC,sBAAsB;MACtBC,oBAAoB;IACtB;EACF,CAAA;AAEA,SAAO;IACLhB,WAAWiB,YAAYb,iBAAiBC,UAAUG,YAAAA;IAClDR,WAAWiB,YAAYhB,gBAAgBI,UAAU;MAC/Ca,QAAQf,KAAKO;MACbC,QAAQN,SAASA;MACjBc,MAAMX;IACR,CAAA;;AAEJ,CAAA,CAAA;",
|
|
6
|
-
"names": ["Effect", "Capability", "AppCapabilities", "createKvsStore", "meta", "DeckCapabilities", "Settings", "makeModule", "sync", "settingsAtom", "key", "id", "schema", "defaultValue", "showHints", "enableDeck", "enableNativeRedirect", "encapsulatedPlanks", "contributes", "prefix", "atom"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/state.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom } from '@effect-atom/atom-react';\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { AppCapabilities } from '@dxos/app-toolkit';\nimport { createKvsStore } from '@dxos/effect';\nimport { invariant } from '@dxos/invariant';\n\nimport { meta } from '#meta';\nimport { DeckCapabilities, type EphemeralDeckState, StoredDeckState, defaultDeck, getMode } from '#types';\n\nimport { sanitizePersistedState } from '../util';\n\n/** Default persisted state. */\nconst defaultDeckState: StoredDeckState = {\n sidebarState: 'expanded',\n complementarySidebarState: 'collapsed',\n complementarySidebarPanel: undefined,\n activeDeck: 'default',\n previousDeck: 'default',\n decks: {\n default: { ...defaultDeck },\n },\n previousMode: {},\n};\n\n/** Default ephemeral state. */\nconst defaultDeckEphemeralState: EphemeralDeckState = {\n dialogContent: null,\n dialogOpen: false,\n dialogBlockAlign: undefined,\n dialogType: undefined,\n popoverContent: null,\n popoverAnchor: undefined,\n popoverAnchorId: undefined,\n popoverOpen: false,\n toasts: [],\n currentUndoId: undefined,\n scrollIntoView: undefined,\n};\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const registry = yield* Capability.get(Capabilities.AtomRegistry);\n\n // Persisted state using KVS store.\n const stateAtom = createKvsStore({\n key: `${meta.id}.state`,\n schema: StoredDeckState,\n defaultValue: () => ({ ...defaultDeckState }),\n });\n\n // Ephemeral state (not persisted, but kept alive to prevent GC resets).\n const ephemeralAtom = Atom.make<EphemeralDeckState>({ ...defaultDeckEphemeralState }).pipe(Atom.keepAlive);\n\n // Sanitize persisted state on startup (see sanitizePersistedState for details).\n const currentState = registry.get(stateAtom);\n const sanitizedState = sanitizePersistedState(currentState);\n if (sanitizedState !== currentState) {\n registry.set(stateAtom, sanitizedState);\n }\n\n // Create derived layout atom (read-only) from both state atoms.\n const layoutAtom = Atom.make((get) => {\n const state = get(stateAtom);\n const ephemeral = get(ephemeralAtom);\n const deck = state.decks[state.activeDeck];\n invariant(deck, `Deck not found: ${state.activeDeck}`);\n return {\n mode: getMode(deck),\n dialogOpen: ephemeral.dialogOpen,\n sidebarOpen: state.sidebarState === 'expanded',\n complementarySidebarOpen: state.complementarySidebarState === 'expanded',\n workspace: state.activeDeck,\n active: deck.solo ? [deck.solo] : deck.active,\n inactive: deck.inactive,\n scrollIntoView: ephemeral.scrollIntoView,\n } satisfies AppCapabilities.Layout;\n }).pipe(Atom.keepAlive);\n\n return [\n Capability.contributes(DeckCapabilities.State, stateAtom),\n Capability.contributes(DeckCapabilities.EphemeralState, ephemeralAtom),\n Capability.contributes(AppCapabilities.Layout, layoutAtom),\n ];\n }),\n);\n"],
|
|
5
|
-
"mappings": ";;;;;;AAIA,SAASA,YAAY;AACrB,YAAYC,YAAY;AAExB,SAASC,cAAcC,kBAAkB;AACzC,SAASC,uBAAuB;AAChC,SAASC,sBAAsB;AAC/B,SAASC,iBAAiB;AAE1B,SAASC,YAAY;AACrB,SAASC,kBAA2CC,iBAAiBC,aAAaC,eAAe;AAIjG,IAAA,eAAA;AAG6B,IAAA,mBAAA;EAC3BC,cAAAA;EACAC,2BAAY;EACZC,2BAAc;EACdC,YAAO;gBACI;;IAAiB,SAAA;MAC5B,GAAA;IACAC;EACF;EAEA,cAAA,CAAA;;AAGc,IAAA,4BAAA;EACZC,eAAAA;EACAC,YAAYC;EACZC,kBAAgB;EAChBC,YAAAA;EACAC,gBAAAA;EACAC,eAAa;EACbC,iBAAU;EACVC,aAAAA;EACAC,QAAAA,CAAAA;EACF,eAAA;EAEA,gBAAeC;;IAIX,gBAAA,WAAA,WAAmC,kBAAA,aAAA;AACnC,QAAMC,WAAAA,OAAYC,WAAe,IAAA,aAAA,YAAA;QAE/BC,YAAQC,eAAAA;IACRC,KAAAA,GAAAA,KAAAA,EAAc;YAAS;kBAAoB,OAAA;MAC7C,GAAA;IAEA;EACA,CAAA;AAAmF,QAAGC,gBAAmB,KAAA,KAAA;IAEzG,GAAA;EACA,CAAA,EAAA,KAAMC,KAAAA,SAAeC;AAErB,QAAIC,eAAAA,SAAmBF,IAAAA,SAAc;QACnCC,iBAAaP,uBAAWQ,YAAAA;AAC1B,MAAA,mBAAA,cAAA;AAEA,aAAA,IAAA,WAAA,cAAA;EACA;QAEE,aAAMC,KAAYC,KAAIC,CAAAA,QAAAA;AACtB,UAAMC,QAAOC,IAAAA,SAAYA;AACzBC,UAAAA,YAAiB,IAAA,aAAkBD;AACnC,UAAA,OAAO,MAAA,MAAA,MAAA,UAAA;cACCE,MAAAA,mBAAQH,MAAAA,UAAAA,IAAAA,EAAAA,YAAAA,YAAAA,GAAAA,cAAAA,GAAAA,IAAAA,GAAAA,MAAAA,GAAAA,CAAAA,QAAAA,uCAAAA,EAAAA,CAAAA;WACdI;MACAC,MAAAA,QAAaJ,IAAAA;MACbK,YAAAA,UAAAA;MACAC,aAAWN,MAAM5B,iBAAU;MAC3BmC,0BAAoB,MAAA,8BAAA;iBAAMC,MAAI;cAAIT,KAAKQ,OAAM;QAC7CE,KAAAA;MACAxB,IAAAA,KAAAA;MACF,UAAA,KAAA;MACMyB,gBAAc,UAAA;IAEtB;UACExB,KAAAA,SAAWyB;SACXzB;IACAA,WAAWyB,YAAYC,iBAAgBC,OAAQC,SAAAA;IAChD,WAAA,YAAA,iBAAA,gBAAA,aAAA;IAEH,WAAA,YAAA,gBAAA,QAAA,UAAA;;;",
|
|
6
|
-
"names": ["Atom", "Effect", "Capabilities", "Capability", "AppCapabilities", "createKvsStore", "invariant", "meta", "DeckCapabilities", "StoredDeckState", "defaultDeck", "getMode", "complementarySidebarPanel", "activeDeck", "previousDeck", "decks", "previousMode", "dialogBlockAlign", "dialogType", "undefined", "popoverContent", "popoverAnchor", "popoverAnchorId", "popoverOpen", "toasts", "currentUndoId", "scrollIntoView", "Capability", "stateAtom", "createKvsStore", "schema", "StoredDeckState", "defaultValue", "pipe", "currentState", "registry", "sanitizedState", "ephemeral", "get", "ephemeralAtom", "deck", "state", "invariant", "getMode", "dialogOpen", "sidebarOpen", "complementarySidebarOpen", "workspace", "active", "solo", "inactive", "Atom", "contributes", "AppCapabilities", "Layout", "layoutAtom"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/operations/switch-workspace.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { AppCapabilities, isPinnedWorkspace, LayoutOperation } from '@dxos/app-toolkit';\nimport { Operation } from '@dxos/compute';\nimport { invariant } from '@dxos/invariant';\nimport { Graph, Node } from '@dxos/plugin-graph';\n\nimport { DeckCapabilities, defaultDeck } from '../types';\n\nconst handler: Operation.WithHandler<typeof LayoutOperation.SwitchWorkspace> = LayoutOperation.SwitchWorkspace.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* (input) {\n const { graph } = yield* Capability.get(AppCapabilities.AppGraph);\n\n {\n const state = yield* Capabilities.getAtomValue(DeckCapabilities.State);\n // TODO(wittjosiah): This is a hack to prevent the previous deck from being set for pinned items.\n // Ideally this should be worked into the data model in a generic way.\n const shouldUpdatePrevious = !isPinnedWorkspace(state.activeDeck);\n\n yield* Capabilities.updateAtomValue(DeckCapabilities.State, (state) => {\n const newDecks = state.decks[input.subject]\n ? state.decks\n : { ...state.decks, [input.subject]: { ...defaultDeck } };\n return {\n ...state,\n previousDeck: shouldUpdatePrevious ? state.activeDeck : state.previousDeck,\n activeDeck: input.subject,\n decks: newDecks,\n };\n });\n }\n\n {\n const state = yield* Capabilities.getAtomValue(DeckCapabilities.State);\n const deck = state.decks[input.subject];\n invariant(deck, `Deck not found: ${input.subject}`);\n\n const first = deck.solo ? deck.solo : deck.active[0];\n if (first) {\n yield* Operation.schedule(LayoutOperation.ScrollIntoView, { subject: first });\n } else {\n const [item] = Graph.getConnections(graph, input.subject, 'child').filter(\n (node) => !Node.isActionLike(node) && !node.properties.disposition,\n );\n if (item) {\n // Use `invoke` (synchronous) rather than `schedule` (fire-and-forget) so\n // that the implicit \"open first child\" finishes BEFORE this handler\n // returns. Otherwise, a caller that follows `SwitchWorkspace` with its\n // own `SetLayoutMode`/`Open` (e.g. WelcomePlugin DefaultContent) has\n // its `solo`/`active` clobbered by this scheduled Open when it later\n // races behind the caller's state writes.\n yield* Operation.invoke(LayoutOperation.Open, { subject: [item.id] });\n }\n }\n }\n }),\n ),\n);\n\nexport default handler;\n"],
|
|
5
|
-
"mappings": ";;;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,cAAcC,kBAAkB;AACzC,SAASC,iBAAiBC,mBAAmBC,uBAAuB;AACpE,SAASC,iBAAiB;AAC1B,SAASC,iBAAiB;AAC1B,SAASC,OAAOC,YAAY;AAI5B,IAAA,eAA+EC;IAKzE,UAAA,gBAAA,gBAAA,KAAA,UAAA,YAAA,kBAAA,WAAA,OAAA;QACE,EAAA,MAAMC,IAAQ,OAAOC,WAAAA,IAAaC,gBAAaC,QAAAA;;AAE/C,UAAA,QAAA,OAAA,aAAA,aAAA,yBAAA,KAAA;UAIE,uBAAuBC,CAAAA,kBAAoB,MACvCJ,UACA;wBAAWI,gBAAK,yBAAA,OAAA,CAAAJ,WAAA;YAAGK,WAAMC,OAAU,MAAA,MAAA,OAAA,IAAAN,OAAA,QAAA;kBAAKO;QAAY,CAAA,MAAA,OAAA,GAAA;UAAE,GAAA;QAC1D;;aAEEC;QACAC,GAAAA;QACAL,cAAOM,uBAAAA,OAAAA,aAAAA,OAAAA;QACT,YAAA,MAAA;QACF,OAAA;MACF;IAEA,CAAA;;;AAGEC,UAAAA,QAAUC,OAAO,aAAgB,aAAQN,yBAAS,KAAA;AAElD,UAAMO,OAAAA,MAAaC,MAAI,MAAQA,OAAOF;AACtC,cAAIC,MAAO,mBAAA,MAAA,OAAA,IAAA,EAAA,YAAA,YAAA,GAAA,cAAA,GAAA,IAAA,GAAA,MAAA,GAAA,CAAA,QAAA,oCAAA,EAAA,CAAA;UACT,QAAOE,KAAAA,OAAUC,KAASjB,OAAAA,KAAAA,OAAgBkB,CAAAA;eAAkBX;AAAe,aAAA,UAAA,SAAA,gBAAA,gBAAA;QACtE,SAAA;MACL,CAAA;WAGA;YACE,CAAA,IAAA,IAAA,MAAA,eAAA,OAAA,MAAA,SAAA,OAAA,EAAA,OAAA,CAAA,SAAyE,CAAA,KAAA,aAAA,IAAA,KAAA,CAAA,KAAA,WAAA,WAAA;UACzE,MAAA;yBAKiE,OAAA,gBAAA,MAAA;mBAAC;YAAC,KAAA;UACrE;QACF,CAAA;MACF;IACF;EAIJ;;;",
|
|
6
|
-
"names": ["Effect", "Capabilities", "Capability", "AppCapabilities", "isPinnedWorkspace", "LayoutOperation", "Operation", "invariant", "Graph", "Node", "LayoutOperation", "state", "Capabilities", "getAtomValue", "DeckCapabilities", "decks", "input", "subject", "defaultDeck", "previousDeck", "activeDeck", "newDecks", "invariant", "deck", "first", "solo", "Operation", "schedule", "ScrollIntoView"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/operations/update-companion.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities } from '@dxos/app-framework';\nimport { LayoutOperation } from '@dxos/app-toolkit';\nimport { Operation } from '@dxos/compute';\nimport { getLinkedVariant } from '@dxos/react-ui-attention';\n\nimport { DeckCapabilities } from '../types';\nimport { updateActiveDeck } from './helpers';\n\nconst handler: Operation.WithHandler<typeof LayoutOperation.UpdateCompanion> = LayoutOperation.UpdateCompanion.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* (input) {\n if (input.subject === null) {\n yield* Capabilities.updateAtomValue(DeckCapabilities.State, (state) =>\n updateActiveDeck(state, { companionOpen: false }),\n );\n } else {\n const variant = getLinkedVariant(input.subject);\n yield* Capabilities.updateAtomValue(DeckCapabilities.State, (state) =>\n updateActiveDeck(state, {\n companionOpen: true,\n companionVariant: variant,\n }),\n );\n }\n }),\n ),\n);\n\nexport default handler;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,oBAAoB;AAC7B,SAASC,uBAAuB;AAChC,SAASC,iBAAiB;AAC1B,SAASC,wBAAwB;AAKjC,IAAMC,UAAyEC,gBAAgBC,gBAAgBC,KAC7GC,UAAUC,YACDC,kBAAW,WAAWC,OAAK;AAChC,MAAIA,MAAMC,YAAY,MAAM;AAC1B,WAAOC,aAAaC,gBAAgBC,yBAAiBC,OAAO,CAACC,UAC3DC,iBAAiBD,OAAO;MAAEE,eAAe;IAAM,CAAA,CAAA;EAEnD,OAAO;AACL,UAAMC,UAAUC,iBAAiBV,MAAMC,OAAO;AAC9C,WAAOC,aAAaC,gBAAgBC,yBAAiBC,OAAO,CAACC,UAC3DC,iBAAiBD,OAAO;MACtBE,eAAe;MACfG,kBAAkBF;IACpB,CAAA,CAAA;EAEJ;AACF,CAAA,CAAA,CAAA;AAIJ,IAAA,2BAAehB;",
|
|
6
|
-
"names": ["Effect", "Capabilities", "LayoutOperation", "Operation", "getLinkedVariant", "handler", "LayoutOperation", "UpdateCompanion", "pipe", "Operation", "withHandler", "fnUntraced", "input", "subject", "Capabilities", "updateAtomValue", "DeckCapabilities", "State", "state", "updateActiveDeck", "companionOpen", "variant", "getLinkedVariant", "companionVariant"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/capabilities/url-handler.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport {\n AppCapabilities,\n LayoutOperation,\n NOT_FOUND_PATH,\n expandPath,\n fromUrlPath,\n getWorkspaceFromPath,\n toUrlPath,\n} from '@dxos/app-toolkit';\nimport { Operation } from '@dxos/compute';\nimport { EffectEx } from '@dxos/effect';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { Node } from '@dxos/plugin-graph';\nimport { isTauri } from '@dxos/util';\n\nimport { DeckCapabilities, type StoredDeckState, defaultDeck } from '#types';\n\nimport { updateActiveDeck } from '../operations/helpers';\nimport { deserializePlanks, serializePlanks, stripPlanks } from '../util';\nimport { shouldDeferNavigationHandlers } from './check-app-scheme';\n\n/** Dispatch all NavigationHandler contributions with a given URL. */\nconst dispatchNavigationHandlers = Effect.fn(function* (url: URL) {\n const handlers = yield* Capability.getAll(AppCapabilities.NavigationHandler);\n yield* Effect.all(\n handlers.map((handler) => handler(url)),\n { concurrency: 'unbounded' },\n );\n});\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n const operationService = yield* Capability.get(Capabilities.OperationInvoker);\n const capabilities = yield* Capability.Service;\n const registry = yield* Capability.get(Capabilities.AtomRegistry);\n const stateAtom = yield* Capability.get(DeckCapabilities.State);\n const settingsAtom = yield* Capability.get(DeckCapabilities.Settings);\n\n const provideServices = <A, E>(effect: Effect.Effect<A, E, Capability.Service | Operation.Service>) =>\n effect.pipe(\n Effect.provideService(Capability.Service, capabilities),\n Effect.provideService(Operation.Service, operationService),\n );\n\n // Helper to get state.\n const getState = () => registry.get(stateAtom);\n\n // Helper to get computed deck from state.\n const getDeck = () => {\n const state = getState();\n const deck = state.decks[state.activeDeck];\n invariant(deck, `Deck not found: ${state.activeDeck}`);\n return deck;\n };\n\n // Helper to update state.\n const updateState = (fn: (current: StoredDeckState) => StoredDeckState) => {\n registry.set(stateAtom, fn(getState()));\n };\n\n const handleNavigation = Effect.fn(function* (url?: URL) {\n const { graph } = yield* Capability.get(AppCapabilities.AppGraph);\n const resolvedUrl = url ?? new URL(window.location.href);\n // When native redirect is active, check-app-scheme owns the initial dispatch\n // to prevent one-time tokens from being consumed before the native app can use them.\n const settings = registry.get(settingsAtom);\n const deferHandlers = settings?.enableNativeRedirect && shouldDeferNavigationHandlers();\n if (!deferHandlers) {\n yield* dispatchNavigationHandlers(resolvedUrl);\n }\n\n const pathname = resolvedUrl.pathname;\n const state = getState();\n if (pathname === '/reset') {\n updateState((s) => ({\n ...s,\n activeDeck: 'default',\n decks: {\n default: { ...defaultDeck },\n },\n }));\n window.location.pathname = '/';\n return;\n }\n\n const qualifiedId = fromUrlPath(pathname);\n const workspace = getWorkspaceFromPath(qualifiedId);\n if (workspace !== Node.RootId && workspace !== state.activeDeck) {\n yield* Operation.invoke(LayoutOperation.SwitchWorkspace, { subject: workspace });\n }\n\n const deck = getDeck();\n const activeId = qualifiedId !== workspace ? qualifiedId : undefined;\n if (activeId) {\n // Ensure the object referenced by the URL is open in the deck.\n // Open validates the target and may redirect to 404, returning the resolved IDs.\n const resolvedIds = yield* Operation.invoke(LayoutOperation.Open, { subject: [activeId] });\n // If not already in solo mode, switch to solo for the resolved target.\n if (!deck.solo) {\n yield* Operation.invoke(LayoutOperation.SetLayoutMode, {\n subject: resolvedIds?.[0] ?? activeId,\n mode: 'solo',\n });\n }\n } else if (deck.solo && deck.solo !== NOT_FOUND_PATH) {\n // Stay in solo mode; redirect URL to reflect the current solo item.\n // Do not switch to deck mode here — only explicit user action should change layout mode.\n const path = toUrlPath(deck.solo);\n if (window.location.pathname !== path) {\n history.replaceState(null, '', `${path}${stripPlanks(window.location.search)}`);\n }\n } else if (!activeId && !deck.solo) {\n // Multi-mode: restore planks from query params.\n const plankIds = deserializePlanks(resolvedUrl);\n if (plankIds.length > 0) {\n for (const plankId of plankIds) {\n expandPath(graph, plankId);\n }\n updateState((state) => updateActiveDeck(state, { active: plankIds, initialized: true }));\n }\n }\n });\n\n const onPopState = () => void EffectEx.runAndForwardErrors(provideServices(handleNavigation()));\n\n // Install before handleNavigation()/state-sync push entries on top of the sentinel.\n const sentinelKey = installLeaveTrap();\n\n // Landing on the sentinel means a Back is about to leave Composer; confirm and act on it.\n // The guard stops our own back()/forward() from re-entering.\n let handlingSentinel = false;\n const onCurrentEntryChange = () => {\n const current = window.navigation.currentEntry;\n if (handlingSentinel || !current || current.key !== sentinelKey) {\n return;\n }\n handlingSentinel = true;\n queueMicrotask(() => {\n if (window.confirm('Leave Composer?')) {\n history.back(); // Past the sentinel to the prior page.\n } else {\n history.forward(); // Back to where the user was.\n }\n setTimeout(() => {\n handlingSentinel = false;\n });\n });\n };\n\n yield* provideServices(handleNavigation());\n window.addEventListener('popstate', onPopState);\n if ('navigation' in window) {\n window.navigation.addEventListener('currententrychange', onCurrentEntryChange);\n }\n\n // Tauri deep link support.\n let unlistenDeepLink: (() => void) | undefined;\n if (isTauri()) {\n yield* Effect.gen(function* () {\n const { getCurrent, onOpenUrl } = yield* Effect.promise(() => import('@tauri-apps/plugin-deep-link'));\n\n const launchUrls = yield* Effect.promise(() => getCurrent());\n if (launchUrls && launchUrls.length > 0) {\n log('app launched with deep links', { urls: launchUrls });\n for (const urlString of launchUrls) {\n yield* provideServices(handleDeepLink(urlString, handleNavigation));\n }\n }\n\n unlistenDeepLink = yield* Effect.promise(() =>\n onOpenUrl((urls) => {\n for (const urlString of urls) {\n void EffectEx.runAndForwardErrors(provideServices(handleDeepLink(urlString, handleNavigation)));\n }\n }),\n );\n }).pipe(\n Effect.catchAll((error) => Effect.sync(() => log.warn('failed to initialize deep link listener', { error }))),\n );\n }\n\n // Sync URL with layout state changes.\n let lastSolo: string | undefined;\n let lastActiveDeck: string | undefined;\n let lastActiveKey: string | undefined;\n const unsubscribe = registry.subscribe(stateAtom, () => {\n const state = getState();\n const deck = getDeck();\n const solo = deck.solo;\n const activeDeck = state.activeDeck;\n const activeKey = solo ? undefined : JSON.stringify(deck.active);\n\n if (solo !== lastSolo || activeDeck !== lastActiveDeck || activeKey !== lastActiveKey) {\n lastSolo = solo;\n lastActiveDeck = activeDeck;\n lastActiveKey = activeKey;\n\n const path = solo && solo !== NOT_FOUND_PATH ? toUrlPath(solo) : toUrlPath(activeDeck);\n const search = !solo\n ? serializePlanks(deck.active, window.location.search)\n : stripPlanks(window.location.search);\n const newUrl = `${path}${search}`;\n\n if (`${window.location.pathname}${window.location.search}` !== newUrl) {\n history.pushState(null, '', newUrl);\n }\n }\n });\n\n return Capability.contributes(Capabilities.Null, null, () =>\n Effect.sync(() => {\n window.removeEventListener('popstate', onPopState);\n if ('navigation' in window) {\n window.navigation.removeEventListener('currententrychange', onCurrentEntryChange);\n }\n unsubscribe();\n unlistenDeepLink?.();\n }),\n );\n }),\n);\n\n/**\n * sessionStorage key holding the sentinel history entry's key. The entry is identified by its\n * (reload-stable) Navigation API key rather than by entry state, because the deck overwrites\n * history state via replaceState during URL sync — which would erase a state marker. sessionStorage\n * survives reloads within the tab and the deck never touches it.\n */\nconst SENTINEL_STORAGE_KEY = 'dxos.composer.deck.leaveTrap.sentinelKey';\n\n/**\n * Insert a \"sentinel\" history entry beneath the app's working entries, so a Back-press that would\n * leave Composer instead lands on the sentinel — where `onCurrentEntryChange` confirms the exit. A\n * cross-document back is uncancelable and `beforeunload` cannot distinguish reload from leave, so\n * this same-document floor is required; reload fires no traversal and is never trapped. Requires the\n * Navigation API (Chromium); no-op otherwise. Idempotent across reloads via the sessionStorage-held\n * entry key, so the sentinel is not duplicated. Returns the sentinel entry's key, or undefined.\n */\nconst installLeaveTrap = (): string | undefined => {\n if (!('navigation' in window)) {\n return undefined;\n }\n const saved = sessionStorage.getItem(SENTINEL_STORAGE_KEY);\n if (saved && window.navigation.entries().some((entry) => entry.key === saved)) {\n // The sentinel survived (reload, or the user returned to Composer after leaving). If we are\n // sitting ON it — e.g. the user left via the sentinel then came back Forward onto it — push a\n // working entry above so the user is above the floor again and the trap re-arms.\n if (window.navigation.currentEntry?.key === saved) {\n history.pushState(null, '', window.location.pathname + window.location.search);\n }\n return saved;\n }\n // history.length > 1 (not navigation.canGoBack, which is false for a cross-origin prior entry)\n // means there is somewhere to leave to; otherwise Back can't exit and no sentinel is needed.\n const key = window.navigation.currentEntry?.key;\n if (key && window.history.length > 1) {\n // Record the current (landing) entry as the sentinel, then push the working entry above it.\n sessionStorage.setItem(SENTINEL_STORAGE_KEY, key);\n history.pushState(null, '', window.location.pathname + window.location.search);\n return key;\n }\n return undefined;\n};\n\n/** Check if a path is a redirect path handled elsewhere (e.g., OAuth). */\nconst isRedirectPath = (pathname: string): boolean => pathname.startsWith('/redirect/');\n\n/** Handle a deep link URL string. Merges query params into window.location and navigates. */\nconst handleDeepLink = Effect.fn(function* (urlString: string, navigate: (url?: URL) => Effect.Effect<void, any, any>) {\n log('deep link received', { url: urlString });\n\n const deepLinkUrl = new URL(urlString);\n\n // For custom schemes (e.g., composer://a/b/c), new URL() treats the first segment as the\n // hostname. Reconstruct the full path from hostname + pathname.\n const fullPath =\n deepLinkUrl.protocol !== 'https:' && deepLinkUrl.protocol !== 'http:' && deepLinkUrl.hostname\n ? '/' + deepLinkUrl.hostname + deepLinkUrl.pathname\n : deepLinkUrl.pathname;\n\n if (isRedirectPath(fullPath)) {\n return;\n }\n\n // Merge deep link query params into the current window URL so handlers can read them.\n const current = new URL(window.location.href);\n if (deepLinkUrl.search) {\n deepLinkUrl.searchParams.forEach((value, key) => current.searchParams.set(key, value));\n }\n current.pathname = fullPath;\n history.replaceState(null, '', current.pathname + current.search);\n\n yield* navigate(current);\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Effect", "Capabilities", "Capability", "AppCapabilities", "LayoutOperation", "NOT_FOUND_PATH", "expandPath", "fromUrlPath", "getWorkspaceFromPath", "toUrlPath", "Operation", "EffectEx", "invariant", "log", "Node", "isTauri", "DeckCapabilities", "defaultDeck", "concurrency", "capabilities", "Service", "registry", "Capability", "Capabilities", "AtomRegistry", "stateAtom", "settingsAtom", "get", "DeckCapabilities", "Settings", "provideServices", "effect", "provideService", "getState", "getDeck", "deck", "state", "invariant", "fn", "handleNavigation", "Effect", "URL", "window", "location", "deferHandlers", "dispatchNavigationHandlers", "resolvedUrl", "pathname", "updateState", "activeDeck", "decks", "default", "workspace", "Node", "Operation", "LayoutOperation", "SwitchWorkspace", "activeId", "subject", "mode", "history", "replaceState", "plankIds", "deserializePlanks", "plankId", "expandPath", "graph", "updateActiveDeck", "initialized", "sentinelKey", "installLeaveTrap", "current", "handlingSentinel", "queueMicrotask", "confirm", "back", "forward", "setTimeout", "addEventListener", "launchUrls", "length", "log", "handleDeepLink", "urlString", "unlistenDeepLink", "EffectEx", "runAndForwardErrors", "lastActiveKey", "solo", "activeKey", "lastSolo", "lastActiveDeck", "newUrl", "path", "search", "pushState", "removeEventListener", "unsubscribe", "undefined", "saved", "sessionStorage", "SENTINEL_STORAGE_KEY", "key", "deepLinkUrl", "searchParams", "forEach", "value", "fullPath", "navigate"]
|
|
7
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DeckSettings.d.ts","sourceRoot":"","sources":["../../../../../src/components/DeckSettings/DeckSettings.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAKvD,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAIlC,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,oBAAoB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAEnF,eAAO,MAAM,YAAY,mCAAoC,iBAAiB,sBAgB7E,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/DeckSettings/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,IAAI,OAAO,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { PlankComponentProps } from './PlankComponent';
|
|
2
|
-
import { PlankContentProps } from './PlankContent';
|
|
3
|
-
import { PlankRootProps } from './PlankRoot';
|
|
4
|
-
/**
|
|
5
|
-
* Radix-style composite Plank component.
|
|
6
|
-
*/
|
|
7
|
-
export declare const Plank: {
|
|
8
|
-
Root: ({ children, ...context }: PlankRootProps) => import("react").JSX.Element;
|
|
9
|
-
Content: import("react").ForwardRefExoticComponent<Omit<PlankContentProps, "className"> & {
|
|
10
|
-
classNames?: import("@dxos/ui-types").ClassNameValue;
|
|
11
|
-
} & Pick<import("react").HTMLAttributes<Element>, "children" | "className" | "role" | "style"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
12
|
-
Component: import("react").MemoExoticComponent<({ part, id, path, order, active, node, primary, companions, companioned }: PlankComponentProps) => import("react").JSX.Element>;
|
|
13
|
-
Heading: import("react").MemoExoticComponent<({ id, part, node, deckEnabled, canIncrementStart, canIncrementEnd, popoverAnchorId, primaryId, pending, companioned, companions, layoutMode, actions, debug, }: import("./PlankHeading").PlankHeadingProps) => import("react").JSX.Element>;
|
|
14
|
-
Controls: import("react").ForwardRefExoticComponent<Omit<import("./PlankControls").PlankControlsProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
15
|
-
};
|
|
16
|
-
export type { PlankRootProps, PlankComponentProps, PlankContentProps };
|
|
17
|
-
//# sourceMappingURL=Plank.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Plank.d.ts","sourceRoot":"","sources":["../../../../../src/containers/Plank/Plank.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAkB,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAgB,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGjE,OAAO,EAAa,cAAc,EAAE,MAAM,aAAa,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,KAAK;IAChB,IAAI;IACJ,OAAO;;;IACP,SAAS;IACT,OAAO;IACP,QAAQ;CACT,CAAC;AAEF,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,CAAC"}
|