@dxos/plugin-deck 0.8.4-main.69d29f4 → 0.8.4-main.6fa680abb7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/browser/Banner-HXRXEUOZ.mjs +14 -0
- package/dist/lib/browser/Banner-HXRXEUOZ.mjs.map +7 -0
- package/dist/lib/browser/DeckSettings-HSSQKFNE.mjs +96 -0
- package/dist/lib/browser/DeckSettings-HSSQKFNE.mjs.map +7 -0
- package/dist/lib/browser/{app-graph-builder-DTVCULQ4.mjs → app-graph-builder-MP6INIM2.mjs} +16 -13
- package/dist/lib/browser/app-graph-builder-MP6INIM2.mjs.map +7 -0
- package/dist/lib/browser/{check-app-scheme-JSRXXIYF.mjs → check-app-scheme-AUNCD2Y6.mjs} +9 -8
- package/dist/lib/browser/check-app-scheme-AUNCD2Y6.mjs.map +7 -0
- package/dist/lib/browser/{chunk-ATFPDN6J.mjs → chunk-3P2FJVXC.mjs} +35 -49
- package/dist/lib/browser/chunk-3P2FJVXC.mjs.map +7 -0
- package/dist/lib/browser/chunk-BJDEG7YZ.mjs +74 -0
- package/dist/lib/browser/chunk-BJDEG7YZ.mjs.map +7 -0
- package/dist/lib/browser/{chunk-EREEXCHO.mjs → chunk-ITNJS5QX.mjs} +214 -276
- package/dist/lib/browser/chunk-ITNJS5QX.mjs.map +7 -0
- package/dist/lib/browser/chunk-L3RYMAV7.mjs +16 -0
- package/dist/lib/browser/chunk-L3RYMAV7.mjs.map +7 -0
- package/dist/lib/browser/{chunk-UNG4CLLP.mjs → chunk-TAHLKBDO.mjs} +46 -20
- package/dist/lib/browser/chunk-TAHLKBDO.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +39 -35
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{operation-resolver-CDYBLZJ4.mjs → operation-resolver-2TEGT4PG.mjs} +166 -122
- package/dist/lib/browser/operation-resolver-2TEGT4PG.mjs.map +7 -0
- package/dist/lib/browser/{react-root-LYNEKGHM.mjs → react-root-AS4IOYDG.mjs} +8 -7
- package/dist/lib/browser/react-root-AS4IOYDG.mjs.map +7 -0
- package/dist/lib/browser/react-surface-FH7TC6WW.mjs +44 -0
- package/dist/lib/browser/react-surface-FH7TC6WW.mjs.map +7 -0
- package/dist/lib/browser/{settings-OMHVGZ6V.mjs → settings-PTMGCSJH.mjs} +8 -5
- package/dist/lib/browser/settings-PTMGCSJH.mjs.map +7 -0
- package/dist/lib/browser/{state-OC3BSB6E.mjs → state-MA4SQ7BE.mjs} +11 -8
- package/dist/lib/browser/state-MA4SQ7BE.mjs.map +7 -0
- package/dist/lib/browser/{toolkit-R53LD3EA.mjs → toolkit-6B34QFU3.mjs} +10 -8
- package/dist/lib/browser/toolkit-6B34QFU3.mjs.map +7 -0
- package/dist/lib/browser/types/index.mjs +4 -5
- package/dist/lib/browser/{url-handler-53TE6JZO.mjs → url-handler-FEUFPQIP.mjs} +22 -17
- package/dist/lib/browser/url-handler-FEUFPQIP.mjs.map +7 -0
- package/dist/lib/node-esm/Banner-RN7XXOXY.mjs +15 -0
- package/dist/lib/node-esm/Banner-RN7XXOXY.mjs.map +7 -0
- package/dist/lib/node-esm/DeckSettings-DJRFLKQS.mjs +97 -0
- package/dist/lib/node-esm/DeckSettings-DJRFLKQS.mjs.map +7 -0
- package/dist/lib/node-esm/{app-graph-builder-473BNZDJ.mjs → app-graph-builder-ACHG5HY7.mjs} +16 -13
- package/dist/lib/node-esm/app-graph-builder-ACHG5HY7.mjs.map +7 -0
- package/dist/lib/node-esm/{check-app-scheme-IVYRHKRH.mjs → check-app-scheme-WN76GWVC.mjs} +9 -8
- package/dist/lib/node-esm/check-app-scheme-WN76GWVC.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-DGTRKKWZ.mjs +76 -0
- package/dist/lib/node-esm/chunk-DGTRKKWZ.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-SKEVPQ7E.mjs → chunk-EMU4VIPH.mjs} +46 -20
- package/dist/lib/node-esm/chunk-EMU4VIPH.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-XAKTY3EB.mjs → chunk-GZJAQ5IP.mjs} +34 -49
- package/dist/lib/node-esm/chunk-GZJAQ5IP.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-V6VEXRD4.mjs → chunk-MBCCNIWY.mjs} +213 -275
- package/dist/lib/node-esm/chunk-MBCCNIWY.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-XCNF4COU.mjs +18 -0
- package/dist/lib/node-esm/chunk-XCNF4COU.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +39 -35
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{operation-resolver-WUOE33ID.mjs → operation-resolver-GCMCCI7A.mjs} +166 -122
- package/dist/lib/node-esm/operation-resolver-GCMCCI7A.mjs.map +7 -0
- package/dist/lib/node-esm/{react-root-L7H43AS3.mjs → react-root-7DTDLAF4.mjs} +8 -7
- package/dist/lib/node-esm/react-root-7DTDLAF4.mjs.map +7 -0
- package/dist/lib/node-esm/{react-surface-77DKVMDV.mjs → react-surface-U6Z2K324.mjs} +18 -16
- package/dist/lib/node-esm/react-surface-U6Z2K324.mjs.map +7 -0
- package/dist/lib/node-esm/{settings-2HB6FKIK.mjs → settings-LPPFLXNJ.mjs} +8 -5
- package/dist/lib/node-esm/settings-LPPFLXNJ.mjs.map +7 -0
- package/dist/lib/node-esm/{state-JRQ45ACJ.mjs → state-KNRU3GDC.mjs} +11 -8
- package/dist/lib/node-esm/state-KNRU3GDC.mjs.map +7 -0
- package/dist/lib/node-esm/{toolkit-JLPZNNKB.mjs → toolkit-SOWYKJY3.mjs} +10 -8
- package/dist/lib/node-esm/toolkit-SOWYKJY3.mjs.map +7 -0
- package/dist/lib/node-esm/types/index.mjs +4 -5
- package/dist/lib/node-esm/{url-handler-QGF2R24T.mjs → url-handler-4LEB7UWF.mjs} +22 -17
- package/dist/lib/node-esm/url-handler-4LEB7UWF.mjs.map +7 -0
- package/dist/types/src/DeckPlugin.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +1 -1
- package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/check-app-scheme/check-app-scheme.d.ts +1 -1
- package/dist/types/src/capabilities/check-app-scheme/check-app-scheme.d.ts.map +1 -1
- package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +2 -2
- package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-root/react-root.d.ts +1 -1
- package/dist/types/src/capabilities/react-root/react-root.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface/index.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface/react-surface.d.ts +2 -2
- package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/settings/index.d.ts +1 -1
- package/dist/types/src/capabilities/settings/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/settings/settings.d.ts +4 -3
- package/dist/types/src/capabilities/settings/settings.d.ts.map +1 -1
- package/dist/types/src/capabilities/state/index.d.ts +6 -6
- package/dist/types/src/capabilities/state/state.d.ts +7 -7
- package/dist/types/src/capabilities/state/state.d.ts.map +1 -1
- package/dist/types/src/capabilities/toolkit/index.d.ts +1 -1
- package/dist/types/src/capabilities/toolkit/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/toolkit/toolkit.d.ts +4 -3
- package/dist/types/src/capabilities/toolkit/toolkit.d.ts.map +1 -1
- package/dist/types/src/capabilities/tools/tools.d.ts +1 -1
- package/dist/types/src/capabilities/tools/tools.d.ts.map +1 -1
- package/dist/types/src/capabilities/url-handler/url-handler.d.ts +1 -1
- package/dist/types/src/capabilities/url-handler/url-handler.d.ts.map +1 -1
- package/dist/types/src/components/DeckLayout/ActiveNode.d.ts.map +1 -1
- package/dist/types/src/components/DeckLayout/DeckLayout.stories.d.ts +1 -0
- package/dist/types/src/components/DeckLayout/DeckLayout.stories.d.ts.map +1 -1
- package/dist/types/src/components/DeckLayout/DeckMain.d.ts.map +1 -1
- package/dist/types/src/components/DeckLayout/Dialog.d.ts.map +1 -1
- package/dist/types/src/components/DeckLayout/Fallback.d.ts.map +1 -1
- package/dist/types/src/components/DeckLayout/Popover.d.ts.map +1 -1
- package/dist/types/src/components/DeckLayout/Toast.d.ts +3 -3
- package/dist/types/src/components/DeckLayout/Toast.d.ts.map +1 -1
- package/dist/types/src/components/Plank/Plank.d.ts +2 -2
- package/dist/types/src/components/Plank/Plank.d.ts.map +1 -1
- package/dist/types/src/components/Plank/Plank.stories.d.ts +3 -2
- package/dist/types/src/components/Plank/Plank.stories.d.ts.map +1 -1
- package/dist/types/src/components/Plank/PlankControls.d.ts.map +1 -1
- package/dist/types/src/components/Plank/PlankError.d.ts +5 -3
- package/dist/types/src/components/Plank/PlankError.d.ts.map +1 -1
- package/dist/types/src/components/Plank/PlankHeading.d.ts.map +1 -1
- package/dist/types/src/components/Sidebar/ComplementarySidebar.d.ts.map +1 -1
- package/dist/types/src/components/fragments.d.ts +4 -1
- package/dist/types/src/components/fragments.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +0 -1
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/containers/Banner/Banner.d.ts +2 -0
- package/dist/types/src/containers/Banner/Banner.d.ts.map +1 -0
- package/dist/types/src/containers/Banner/index.d.ts +3 -0
- package/dist/types/src/containers/Banner/index.d.ts.map +1 -0
- package/dist/types/src/{components → containers}/DeckSettings/DeckSettings.d.ts.map +1 -1
- package/dist/types/src/containers/DeckSettings/index.d.ts +3 -0
- package/dist/types/src/containers/DeckSettings/index.d.ts.map +1 -0
- package/dist/types/src/containers/index.d.ts +4 -0
- package/dist/types/src/containers/index.d.ts.map +1 -0
- package/dist/types/src/hooks/index.d.ts +1 -0
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useDeckCompanions.d.ts +0 -1
- package/dist/types/src/hooks/useDeckCompanions.d.ts.map +1 -1
- package/dist/types/src/hooks/useMainSize.d.ts +2 -2
- package/dist/types/src/hooks/useSelectedCompanion.d.ts +13 -0
- package/dist/types/src/hooks/useSelectedCompanion.d.ts.map +1 -0
- package/dist/types/src/layout.d.ts +1 -7
- package/dist/types/src/layout.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +1 -0
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/capabilities.d.ts +6 -6
- package/dist/types/src/types/capabilities.d.ts.map +1 -1
- package/dist/types/src/types/events.d.ts.map +1 -1
- package/dist/types/src/types/schema.d.ts +18 -16
- package/dist/types/src/types/schema.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +45 -43
- package/src/DeckPlugin.ts +12 -11
- package/src/capabilities/app-graph-builder/app-graph-builder.ts +11 -10
- package/src/capabilities/check-app-scheme/check-app-scheme.ts +12 -8
- package/src/capabilities/operation-resolver/operation-resolver.ts +110 -107
- package/src/capabilities/react-root/react-root.tsx +2 -2
- package/src/capabilities/react-surface/react-surface.tsx +11 -10
- package/src/capabilities/settings/settings.ts +3 -2
- package/src/capabilities/state/state.ts +6 -5
- package/src/capabilities/toolkit/toolkit.ts +7 -6
- package/src/capabilities/tools/tools.ts +0 -1
- package/src/capabilities/url-handler/url-handler.ts +16 -13
- package/src/components/DeckLayout/ActiveNode.tsx +3 -2
- package/src/components/DeckLayout/Banner.tsx +8 -8
- package/src/components/DeckLayout/ContentEmpty.tsx +3 -3
- package/src/components/DeckLayout/DeckLayout.stories.tsx +8 -6
- package/src/components/DeckLayout/DeckMain.tsx +28 -27
- package/src/components/DeckLayout/Dialog.tsx +10 -4
- package/src/components/DeckLayout/Fallback.tsx +2 -6
- package/src/components/DeckLayout/Popover.tsx +34 -8
- package/src/components/DeckLayout/StatusBar.tsx +4 -4
- package/src/components/DeckLayout/Toast.tsx +3 -3
- package/src/components/Plank/Plank.stories.tsx +7 -5
- package/src/components/Plank/Plank.tsx +32 -24
- package/src/components/Plank/PlankControls.tsx +6 -8
- package/src/components/Plank/PlankError.tsx +29 -15
- package/src/components/Plank/PlankHeading.tsx +20 -23
- package/src/components/Plank/PlankLoading.tsx +1 -1
- package/src/components/Sidebar/ComplementarySidebar.tsx +46 -49
- package/src/components/Sidebar/Sidebar.tsx +4 -4
- package/src/components/Sidebar/SidebarButton.tsx +12 -12
- package/src/components/fragments.ts +9 -4
- package/src/components/index.ts +0 -1
- package/src/containers/Banner/Banner.tsx +5 -0
- package/src/containers/Banner/index.ts +7 -0
- package/src/{components → containers}/DeckSettings/DeckSettings.tsx +23 -23
- package/src/containers/DeckSettings/index.ts +7 -0
- package/src/containers/index.ts +8 -0
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useCompanions.ts +2 -2
- package/src/hooks/useDeckCompanions.ts +3 -8
- package/src/hooks/useDeckState.ts +3 -3
- package/src/hooks/useHoistStatusbar.ts +1 -1
- package/src/hooks/useMainSize.ts +2 -2
- package/src/hooks/useNodeActionExpander.ts +1 -1
- package/src/hooks/useSelectedCompanion.ts +32 -0
- package/src/layout.ts +1 -14
- package/src/meta.ts +1 -1
- package/src/translations.ts +1 -0
- package/src/types/capabilities.ts +5 -5
- package/src/types/events.ts +5 -4
- package/src/types/schema.ts +22 -21
- package/src/util/overscroll.ts +3 -3
- package/dist/lib/browser/app-graph-builder-DTVCULQ4.mjs.map +0 -7
- package/dist/lib/browser/check-app-scheme-JSRXXIYF.mjs.map +0 -7
- package/dist/lib/browser/chunk-ATFPDN6J.mjs.map +0 -7
- package/dist/lib/browser/chunk-EREEXCHO.mjs.map +0 -7
- package/dist/lib/browser/chunk-NHABISX2.mjs +0 -152
- package/dist/lib/browser/chunk-NHABISX2.mjs.map +0 -7
- package/dist/lib/browser/chunk-UNG4CLLP.mjs.map +0 -7
- package/dist/lib/browser/operation-resolver-CDYBLZJ4.mjs.map +0 -7
- package/dist/lib/browser/react-root-LYNEKGHM.mjs.map +0 -7
- package/dist/lib/browser/react-surface-RPKD7XUR.mjs +0 -42
- package/dist/lib/browser/react-surface-RPKD7XUR.mjs.map +0 -7
- package/dist/lib/browser/settings-OMHVGZ6V.mjs.map +0 -7
- package/dist/lib/browser/state-OC3BSB6E.mjs.map +0 -7
- package/dist/lib/browser/toolkit-R53LD3EA.mjs.map +0 -7
- package/dist/lib/browser/url-handler-53TE6JZO.mjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-473BNZDJ.mjs.map +0 -7
- package/dist/lib/node-esm/check-app-scheme-IVYRHKRH.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-ADPMWKLL.mjs +0 -154
- package/dist/lib/node-esm/chunk-ADPMWKLL.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-SKEVPQ7E.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-V6VEXRD4.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-XAKTY3EB.mjs.map +0 -7
- package/dist/lib/node-esm/operation-resolver-WUOE33ID.mjs.map +0 -7
- package/dist/lib/node-esm/react-root-L7H43AS3.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-77DKVMDV.mjs.map +0 -7
- package/dist/lib/node-esm/settings-2HB6FKIK.mjs.map +0 -7
- package/dist/lib/node-esm/state-JRQ45ACJ.mjs.map +0 -7
- package/dist/lib/node-esm/toolkit-JLPZNNKB.mjs.map +0 -7
- package/dist/lib/node-esm/url-handler-QGF2R24T.mjs.map +0 -7
- package/dist/types/src/components/DeckSettings/index.d.ts +0 -2
- package/dist/types/src/components/DeckSettings/index.d.ts.map +0 -1
- package/src/components/DeckSettings/index.ts +0 -5
- /package/dist/types/src/{components → containers}/DeckSettings/DeckSettings.d.ts +0 -0
|
@@ -13,19 +13,25 @@ import React, {
|
|
|
13
13
|
useRef,
|
|
14
14
|
} from 'react';
|
|
15
15
|
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
16
|
+
import { Surface, useOperationInvoker } from '@dxos/app-framework/ui';
|
|
17
|
+
import { LayoutOperation, getCompanionVariant } from '@dxos/app-toolkit';
|
|
18
|
+
import { useAppGraph } from '@dxos/app-toolkit/ui';
|
|
18
19
|
import { debounce } from '@dxos/async';
|
|
19
20
|
import { type Node, useNode } from '@dxos/plugin-graph';
|
|
20
|
-
import {
|
|
21
|
+
import { useAttentionAttributes } from '@dxos/react-ui-attention';
|
|
21
22
|
import { StackItem, railGridHorizontal } from '@dxos/react-ui-stack';
|
|
22
23
|
import { mainIntrinsicSize, mx } from '@dxos/ui-theme';
|
|
23
24
|
|
|
24
|
-
import { useCompanions, useDeckState, useMainSize } from '../../hooks';
|
|
25
|
-
import {
|
|
26
|
-
|
|
25
|
+
import { useCompanions, useDeckState, useMainSize, useSelectedCompanion } from '../../hooks';
|
|
26
|
+
import {
|
|
27
|
+
DeckOperation,
|
|
28
|
+
type DeckSettingsProps,
|
|
29
|
+
type LayoutMode,
|
|
30
|
+
PLANK_COMPANION_TYPE,
|
|
31
|
+
type ResolvedPart,
|
|
32
|
+
} from '../../types';
|
|
27
33
|
|
|
28
|
-
import {
|
|
34
|
+
import { PlankError, PlankErrorFallback } from './PlankError';
|
|
29
35
|
import { PlankHeading } from './PlankHeading';
|
|
30
36
|
import { PlankLoading } from './PlankLoading';
|
|
31
37
|
|
|
@@ -37,7 +43,7 @@ const UNKNOWN_ID = 'unknown_id';
|
|
|
37
43
|
|
|
38
44
|
export type PlankProps = Pick<PlankComponentProps, 'layoutMode' | 'part' | 'path' | 'order' | 'active' | 'settings'> & {
|
|
39
45
|
id?: string;
|
|
40
|
-
|
|
46
|
+
companionVariant?: string;
|
|
41
47
|
};
|
|
42
48
|
|
|
43
49
|
// TODO(burdon): Factor out conditional rendering.
|
|
@@ -58,12 +64,14 @@ export type PlankProps = Pick<PlankComponentProps, 'layoutMode' | 'part' | 'path
|
|
|
58
64
|
* A Plank is the main container for surfaces within a Deck.
|
|
59
65
|
* It may be paired with a companion plank that enables the user to select one of multiple companion surfaces.
|
|
60
66
|
*/
|
|
61
|
-
export const Plank = memo(({ id = UNKNOWN_ID,
|
|
67
|
+
export const Plank = memo(({ id = UNKNOWN_ID, companionVariant, ...props }: PlankProps) => {
|
|
62
68
|
const { graph } = useAppGraph();
|
|
63
69
|
const node = useNode(graph, id);
|
|
64
70
|
const companions = useCompanions(id);
|
|
65
|
-
const
|
|
66
|
-
const
|
|
71
|
+
const { companionId } = useSelectedCompanion(companions, companionVariant);
|
|
72
|
+
const resolvedCompanionId = companionVariant ? companionId : undefined;
|
|
73
|
+
const currentCompanion = companions.find(({ id }) => id === resolvedCompanionId);
|
|
74
|
+
const hasCompanion = !!(resolvedCompanionId && currentCompanion);
|
|
67
75
|
|
|
68
76
|
return (
|
|
69
77
|
<PlankContainer
|
|
@@ -81,7 +89,7 @@ export const Plank = memo(({ id = UNKNOWN_ID, companionId, ...props }: PlankProp
|
|
|
81
89
|
/>
|
|
82
90
|
{hasCompanion && (
|
|
83
91
|
<PlankComponent
|
|
84
|
-
id={
|
|
92
|
+
id={resolvedCompanionId}
|
|
85
93
|
node={currentCompanion}
|
|
86
94
|
primary={node}
|
|
87
95
|
companions={companions}
|
|
@@ -112,8 +120,8 @@ const PlankContainer = ({ children, solo, companion, encapsulate }: PlankContain
|
|
|
112
120
|
role='none'
|
|
113
121
|
data-popover-collision-boundary={true}
|
|
114
122
|
className={mx(
|
|
115
|
-
'absolute inset-
|
|
116
|
-
encapsulate && 'border border-separator rounded overflow-hidden',
|
|
123
|
+
'absolute inset-(--main-spacing) grid',
|
|
124
|
+
encapsulate && 'border border-separator rounded-sm overflow-hidden',
|
|
117
125
|
companion && 'grid-cols-[6fr_4fr]', // TODO(burdon): Resize.
|
|
118
126
|
railGridHorizontal,
|
|
119
127
|
mainIntrinsicSize,
|
|
@@ -171,8 +179,8 @@ const PlankComponent = memo(
|
|
|
171
179
|
|
|
172
180
|
const rootElement = useRef<HTMLDivElement | null>(null);
|
|
173
181
|
|
|
174
|
-
const
|
|
175
|
-
const sizeKey =
|
|
182
|
+
const variant = node?.type === PLANK_COMPANION_TYPE ? getCompanionVariant(id) : undefined;
|
|
183
|
+
const sizeKey = id.split('+')[0];
|
|
176
184
|
const size = deck.plankSizing[sizeKey] as number | undefined;
|
|
177
185
|
|
|
178
186
|
const handleSizeChange = useCallback(
|
|
@@ -200,7 +208,7 @@ const PlankComponent = memo(
|
|
|
200
208
|
if (scrollIntoView === id) {
|
|
201
209
|
layoutMode === 'deck' && rootElement.current?.scrollIntoView({ behavior: 'smooth', inline: 'center' });
|
|
202
210
|
// Clear the scroll into view state once it has been actioned.
|
|
203
|
-
void invokePromise(
|
|
211
|
+
void invokePromise(LayoutOperation.ScrollIntoView, { subject: undefined });
|
|
204
212
|
}
|
|
205
213
|
}, [id, scrollIntoView, layoutMode, invokePromise]);
|
|
206
214
|
|
|
@@ -230,18 +238,18 @@ const PlankComponent = memo(
|
|
|
230
238
|
const Root = part.startsWith('solo') ? 'article' : StackItem.Root;
|
|
231
239
|
const fullscreen = layoutMode === 'solo--fullscreen';
|
|
232
240
|
const className = mx(
|
|
233
|
-
'attention-surface relative dx-focus-ring-inset-over-all density-coarse',
|
|
241
|
+
'dx-attention-surface relative dx-focus-ring-inset-over-all dx-density-coarse',
|
|
234
242
|
isSolo && 'absolute inset-0',
|
|
235
243
|
isSolo && mainIntrinsicSize,
|
|
236
244
|
railGridHorizontal,
|
|
237
245
|
part.startsWith('solo') && 'grid',
|
|
238
|
-
part.startsWith('solo-') && 'grid-rows-subgrid row-span-2 min-
|
|
246
|
+
part.startsWith('solo-') && 'grid-rows-subgrid row-span-2 min-w-0',
|
|
239
247
|
fullscreen && 'grid-rows-1',
|
|
240
|
-
part === 'deck' && (companioned === 'companion' ? '
|
|
241
|
-
part === 'solo-companion' && '
|
|
248
|
+
part === 'deck' && (companioned === 'companion' ? 'border-separator! border-e' : 'border-separator! border-x'),
|
|
249
|
+
part === 'solo-companion' && 'border-separator! border-s',
|
|
242
250
|
settings?.encapsulatedPlanks &&
|
|
243
251
|
!part.startsWith('solo') &&
|
|
244
|
-
'
|
|
252
|
+
'mx-(--main-spacing) border-separator! border rounded-sm overflow-hidden',
|
|
245
253
|
);
|
|
246
254
|
|
|
247
255
|
return (
|
|
@@ -280,12 +288,12 @@ const PlankComponent = memo(
|
|
|
280
288
|
companions={companions}
|
|
281
289
|
/>
|
|
282
290
|
)}
|
|
283
|
-
<Surface
|
|
291
|
+
<Surface.Surface
|
|
284
292
|
key={node.id}
|
|
285
293
|
role='article'
|
|
286
294
|
data={data}
|
|
287
295
|
limit={1}
|
|
288
|
-
fallback={
|
|
296
|
+
fallback={PlankErrorFallback}
|
|
289
297
|
placeholder={placeholder}
|
|
290
298
|
/>
|
|
291
299
|
</>
|
|
@@ -4,8 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import React, { forwardRef, useCallback } from 'react';
|
|
6
6
|
|
|
7
|
-
import { useOperationInvoker } from '@dxos/app-framework/
|
|
8
|
-
import { invariant } from '@dxos/invariant';
|
|
7
|
+
import { useOperationInvoker } from '@dxos/app-framework/ui';
|
|
9
8
|
import { ButtonGroup, type ButtonGroupProps, type ButtonProps, IconButton, useTranslation } from '@dxos/react-ui';
|
|
10
9
|
|
|
11
10
|
import { meta } from '../../meta';
|
|
@@ -35,7 +34,7 @@ const PlankControl = ({ icon, label, ...props }: Omit<ButtonProps, 'children'> &
|
|
|
35
34
|
return <IconButton label={label} icon={icon} iconOnly variant='ghost' tooltipSide='bottom' {...props} />;
|
|
36
35
|
};
|
|
37
36
|
|
|
38
|
-
const plankControlSpacing = '
|
|
37
|
+
const plankControlSpacing = 'px-2';
|
|
39
38
|
|
|
40
39
|
type PlankComplimentControlsProps = {
|
|
41
40
|
primary?: string;
|
|
@@ -46,11 +45,10 @@ export const PlankCompanionControls = forwardRef<HTMLDivElement, PlankCompliment
|
|
|
46
45
|
const { t } = useTranslation(meta.id);
|
|
47
46
|
const { invokePromise } = useOperationInvoker();
|
|
48
47
|
const handleCloseCompanion = useCallback(() => {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}, [invokePromise, primary]);
|
|
48
|
+
return invokePromise(DeckOperation.ChangeCompanion, { companion: null });
|
|
49
|
+
}, [invokePromise]);
|
|
52
50
|
return (
|
|
53
|
-
<div ref={forwardedRef} className='contents app-no-drag'>
|
|
51
|
+
<div ref={forwardedRef} className='contents dx-app-no-drag'>
|
|
54
52
|
<PlankControl
|
|
55
53
|
label={t('close companion label')}
|
|
56
54
|
variant='ghost'
|
|
@@ -78,7 +76,7 @@ export const PlankControls = forwardRef<HTMLDivElement, PlankControlsProps>(
|
|
|
78
76
|
const layoutIsAnySolo = !!layoutMode?.startsWith('solo');
|
|
79
77
|
|
|
80
78
|
return (
|
|
81
|
-
<ButtonGroup {...props} classNames={['app-no-drag
|
|
79
|
+
<ButtonGroup {...props} classNames={['dx-app-no-drag opacity-100!', classNames]} ref={forwardedRef}>
|
|
82
80
|
{capabilities.deck ? (
|
|
83
81
|
<>
|
|
84
82
|
{capabilities.solo && (
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import React, { useEffect, useState } from 'react';
|
|
6
6
|
|
|
7
7
|
import { type Node } from '@dxos/plugin-graph';
|
|
8
|
-
import { useTranslation } from '@dxos/react-ui';
|
|
8
|
+
import { ErrorFallback, type ErrorFallbackProps, useTranslation } from '@dxos/react-ui';
|
|
9
9
|
import { descriptionMessage, mx } from '@dxos/ui-theme';
|
|
10
10
|
|
|
11
11
|
import { meta } from '../../meta';
|
|
@@ -13,18 +13,6 @@ import { meta } from '../../meta';
|
|
|
13
13
|
import { PlankHeading, type PlankHeadingProps } from './PlankHeading';
|
|
14
14
|
import { PlankLoading } from './PlankLoading';
|
|
15
15
|
|
|
16
|
-
export const PlankContentError = ({ error }: { error?: Error }) => {
|
|
17
|
-
const { t } = useTranslation(meta.id);
|
|
18
|
-
const errorString = error?.toString() ?? '';
|
|
19
|
-
return (
|
|
20
|
-
<div role='none' className='overflow-y-auto p-8 attention-surface grid place-items-center'>
|
|
21
|
-
<p role='alert' className={mx(descriptionMessage, 'break-all rounded-md p-4')}>
|
|
22
|
-
{error ? errorString : t('error fallback message')}
|
|
23
|
-
</p>
|
|
24
|
-
</div>
|
|
25
|
-
);
|
|
26
|
-
};
|
|
27
|
-
|
|
28
16
|
export const PlankError = ({
|
|
29
17
|
id,
|
|
30
18
|
part,
|
|
@@ -38,12 +26,38 @@ export const PlankError = ({
|
|
|
38
26
|
}) => {
|
|
39
27
|
const [timedOut, setTimedOut] = useState(false);
|
|
40
28
|
useEffect(() => {
|
|
41
|
-
setTimeout(() => setTimedOut(true),
|
|
29
|
+
const timer = setTimeout(() => setTimedOut(true), 5_000);
|
|
30
|
+
return () => clearTimeout(timer);
|
|
42
31
|
}, []);
|
|
32
|
+
|
|
43
33
|
return (
|
|
44
34
|
<>
|
|
45
35
|
<PlankHeading id={id} part={part} node={node} pending={!timedOut} />
|
|
46
|
-
{timedOut ? <
|
|
36
|
+
{timedOut ? <PlankErrorFallback error={error} /> : <PlankLoading />}
|
|
47
37
|
</>
|
|
48
38
|
);
|
|
49
39
|
};
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* User facing error fallback.
|
|
43
|
+
*/
|
|
44
|
+
export const PlankErrorFallback = ({ error }: ErrorFallbackProps) => {
|
|
45
|
+
const { t } = useTranslation(meta.id);
|
|
46
|
+
|
|
47
|
+
if (process.env.NODE_ENV === 'development') {
|
|
48
|
+
return <ErrorFallback title='Plank Error' error={error} />;
|
|
49
|
+
} else {
|
|
50
|
+
const errorString = error?.toString() ?? '';
|
|
51
|
+
return (
|
|
52
|
+
<div
|
|
53
|
+
role='alert'
|
|
54
|
+
data-testid='plank-content-error'
|
|
55
|
+
className='dx-attention-surface overflow-y-auto p-8 grid place-items-center'
|
|
56
|
+
>
|
|
57
|
+
<p className={mx(descriptionMessage, 'break-all rounded-md p-4')}>
|
|
58
|
+
{error ? errorString : t('error fallback message')}
|
|
59
|
+
</p>
|
|
60
|
+
</div>
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
};
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
import React, { Fragment, type MouseEvent, memo, useCallback, useEffect, useMemo } from 'react';
|
|
6
6
|
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
7
|
+
import { Surface, useOperationInvoker } from '@dxos/app-framework/ui';
|
|
8
|
+
import { LayoutOperation, getCompanionVariant } from '@dxos/app-toolkit';
|
|
9
|
+
import { useAppGraph } from '@dxos/app-toolkit/ui';
|
|
9
10
|
import { Graph, type Node, useActionRunner } from '@dxos/plugin-graph';
|
|
10
11
|
import { Icon, IconButton, Popover, toLocalizedString, useTranslation } from '@dxos/react-ui';
|
|
11
12
|
import { StackItem, type StackItemSigilAction } from '@dxos/react-ui-stack';
|
|
@@ -13,7 +14,6 @@ import { TextTooltip } from '@dxos/react-ui-text-tooltip';
|
|
|
13
14
|
import { hoverableControls, hoverableFocusedWithinControls } from '@dxos/ui-theme';
|
|
14
15
|
|
|
15
16
|
import { useBreakpoints } from '../../hooks';
|
|
16
|
-
import { parseEntryId } from '../../layout';
|
|
17
17
|
import { meta } from '../../meta';
|
|
18
18
|
import { DeckOperation, type LayoutMode, PLANK_COMPANION_TYPE, type ResolvedPart } from '../../types';
|
|
19
19
|
import { soloInlinePadding } from '../fragments';
|
|
@@ -70,7 +70,7 @@ export const PlankHeading = memo(
|
|
|
70
70
|
const frame = requestAnimationFrame(() => {
|
|
71
71
|
// Load actions for the node.
|
|
72
72
|
if (node) {
|
|
73
|
-
void Graph.expand(graph, node.id);
|
|
73
|
+
void Graph.expand(graph, node.id, 'child');
|
|
74
74
|
}
|
|
75
75
|
});
|
|
76
76
|
|
|
@@ -90,7 +90,7 @@ export const PlankHeading = memo(
|
|
|
90
90
|
[breakpoint, part, companions, canIncrementStart, canIncrementEnd, isCompanionNode, deckEnabled],
|
|
91
91
|
);
|
|
92
92
|
|
|
93
|
-
const
|
|
93
|
+
const variant = isCompanionNode ? getCompanionVariant(id) : undefined;
|
|
94
94
|
const sigilActions = useMemo(() => {
|
|
95
95
|
if (!node) {
|
|
96
96
|
return undefined;
|
|
@@ -99,8 +99,8 @@ export const PlankHeading = memo(
|
|
|
99
99
|
} else {
|
|
100
100
|
return [
|
|
101
101
|
actions,
|
|
102
|
-
Graph.getActions(graph, node.id).filter((
|
|
103
|
-
['list-item', 'list-item-primary', 'heading-list-item'].includes(
|
|
102
|
+
Graph.getActions(graph, node.id).filter((action) =>
|
|
103
|
+
['list-item', 'list-item-primary', 'heading-list-item'].includes(action.properties.disposition),
|
|
104
104
|
),
|
|
105
105
|
].filter((a) => a.length > 0);
|
|
106
106
|
}
|
|
@@ -121,9 +121,9 @@ export const PlankHeading = memo(
|
|
|
121
121
|
return invokePromise(DeckOperation.Adjust, { type: eventType, id });
|
|
122
122
|
} else if (eventType === 'close') {
|
|
123
123
|
if (part === 'complementary') {
|
|
124
|
-
return invokeSync(
|
|
124
|
+
return invokeSync(LayoutOperation.UpdateComplementary, { state: 'collapsed' });
|
|
125
125
|
} else {
|
|
126
|
-
return invokeSync(
|
|
126
|
+
return invokeSync(LayoutOperation.Close, { subject: [id] });
|
|
127
127
|
}
|
|
128
128
|
} else {
|
|
129
129
|
return invokePromise(DeckOperation.Adjust, { type: eventType, id });
|
|
@@ -132,33 +132,30 @@ export const PlankHeading = memo(
|
|
|
132
132
|
[invokePromise, invokeSync, id, part],
|
|
133
133
|
);
|
|
134
134
|
|
|
135
|
-
const ActionRoot = node && popoverAnchorId ===
|
|
135
|
+
const ActionRoot = node && popoverAnchorId === `${meta.id}:${node.id}` ? Popover.Anchor : Fragment;
|
|
136
136
|
|
|
137
137
|
const handleTabClick = useCallback(
|
|
138
138
|
(event: MouseEvent) => {
|
|
139
139
|
const target = (event.target as HTMLElement).closest('[data-id]') as HTMLElement | null;
|
|
140
140
|
const tabId = target?.dataset?.id;
|
|
141
|
-
if (
|
|
142
|
-
void invokePromise(DeckOperation.ChangeCompanion, {
|
|
143
|
-
primary: primaryId,
|
|
144
|
-
companion: tabId,
|
|
145
|
-
});
|
|
141
|
+
if (tabId) {
|
|
142
|
+
void invokePromise(DeckOperation.ChangeCompanion, { companion: tabId });
|
|
146
143
|
}
|
|
147
144
|
},
|
|
148
|
-
[
|
|
145
|
+
[invokePromise],
|
|
149
146
|
);
|
|
150
147
|
|
|
151
148
|
return (
|
|
152
149
|
<StackItem.Heading
|
|
153
150
|
classNames={[
|
|
154
|
-
'
|
|
155
|
-
part === 'solo' ? soloInlinePadding : '
|
|
151
|
+
'py-1 items-stretch gap-1 sticky left-12 dx-app-drag min-w-0 dx-contain-layout dx-density-coarse',
|
|
152
|
+
part === 'solo' ? soloInlinePadding : 'px-1',
|
|
156
153
|
...(layoutMode === 'solo--fullscreen'
|
|
157
154
|
? [
|
|
158
155
|
hoverableControls,
|
|
159
156
|
hoverableFocusedWithinControls,
|
|
160
|
-
'*:transition-opacity *:opacity-
|
|
161
|
-
'hover-hover:hover:bg-
|
|
157
|
+
'*:transition-opacity *:opacity-(--controls-opacity) bg-transparent border-transparent transition-[background-color,border-color]',
|
|
158
|
+
'hover-hover:hover:bg-header-surface focus-within:bg-header-surface hover-hover:hover:border-subdued-separator focus-within:border-subdued-separator',
|
|
162
159
|
]
|
|
163
160
|
: []),
|
|
164
161
|
]}
|
|
@@ -166,7 +163,7 @@ export const PlankHeading = memo(
|
|
|
166
163
|
>
|
|
167
164
|
{companions && isCompanionNode ? (
|
|
168
165
|
/* TODO(thure): IMPORTANT: This is a tablist; it should be implemented as such. */
|
|
169
|
-
<div role='none' className='flex-1 min-
|
|
166
|
+
<div role='none' className='flex-1 min-w-0 overflow-x-auto scrollbar-none flex gap-1'>
|
|
170
167
|
{companions.map(({ id, properties: { icon, label } }) => (
|
|
171
168
|
<IconButton
|
|
172
169
|
key={id}
|
|
@@ -191,7 +188,7 @@ export const PlankHeading = memo(
|
|
|
191
188
|
actions={sigilActions}
|
|
192
189
|
onAction={handleAction}
|
|
193
190
|
>
|
|
194
|
-
<Surface role='menu-footer' data={{ subject: node.data }} />
|
|
191
|
+
<Surface.Surface role='menu-footer' data={{ subject: node.data }} />
|
|
195
192
|
</StackItem.Sigil>
|
|
196
193
|
) : (
|
|
197
194
|
<StackItem.SigilButton>
|
|
@@ -211,7 +208,7 @@ export const PlankHeading = memo(
|
|
|
211
208
|
</TextTooltip>
|
|
212
209
|
</>
|
|
213
210
|
)}
|
|
214
|
-
{node && part !== 'complementary' && <Surface role='navbar-end' data={{ subject: node.data }} />}
|
|
211
|
+
{node && part !== 'complementary' && <Surface.Surface role='navbar-end' data={{ subject: node.data }} />}
|
|
215
212
|
{companioned === 'companion' ? (
|
|
216
213
|
<PlankCompanionControls primary={primaryId} />
|
|
217
214
|
) : (
|
|
@@ -6,5 +6,5 @@ import React from 'react';
|
|
|
6
6
|
|
|
7
7
|
// TODO(burdon): Show skeleton: https://github.com/dxos/dxos/issues/8259
|
|
8
8
|
export const PlankLoading = () => {
|
|
9
|
-
return <div role='none' className='grid place-items-center attention-surface' />;
|
|
9
|
+
return <div role='none' className='grid place-items-center dx-attention-surface' />;
|
|
10
10
|
};
|
|
@@ -12,24 +12,17 @@ import React, {
|
|
|
12
12
|
useState,
|
|
13
13
|
} from 'react';
|
|
14
14
|
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import { IconButton, type Label, Main, toLocalizedString, useTranslation } from '@dxos/react-ui';
|
|
15
|
+
import { Surface, useOperationInvoker } from '@dxos/app-framework/ui';
|
|
16
|
+
import { LayoutOperation, getCompanionVariant } from '@dxos/app-toolkit';
|
|
17
|
+
import { IconButton, type Label, Main, ScrollArea, toLocalizedString, useTranslation } from '@dxos/react-ui';
|
|
18
18
|
import { Tabs } from '@dxos/react-ui-tabs';
|
|
19
19
|
import { mx } from '@dxos/ui-theme';
|
|
20
20
|
|
|
21
|
-
import {
|
|
22
|
-
type DeckCompanion,
|
|
23
|
-
getCompanionId,
|
|
24
|
-
useBreakpoints,
|
|
25
|
-
useDeckCompanions,
|
|
26
|
-
useDeckState,
|
|
27
|
-
useHoistStatusbar,
|
|
28
|
-
} from '../../hooks';
|
|
21
|
+
import { type DeckCompanion, useBreakpoints, useDeckCompanions, useDeckState, useHoistStatusbar } from '../../hooks';
|
|
29
22
|
import { meta } from '../../meta';
|
|
30
23
|
import { getMode } from '../../types';
|
|
31
24
|
import { layoutAppliesTopbar } from '../../util';
|
|
32
|
-
import {
|
|
25
|
+
import { PlankErrorFallback, PlankLoading } from '../Plank';
|
|
33
26
|
|
|
34
27
|
import { ToggleComplementarySidebarButton } from './SidebarButton';
|
|
35
28
|
|
|
@@ -49,8 +42,8 @@ export const ComplementarySidebar = ({ current }: ComplementarySidebarProps) =>
|
|
|
49
42
|
const hoistStatusbar = useHoistStatusbar(breakpoint, layoutMode);
|
|
50
43
|
|
|
51
44
|
const companions = useDeckCompanions();
|
|
52
|
-
const activeCompanion = companions.find((companion) =>
|
|
53
|
-
const activeId = activeCompanion &&
|
|
45
|
+
const activeCompanion = companions.find((companion) => getCompanionVariant(companion.id) === current);
|
|
46
|
+
const activeId = activeCompanion && getCompanionVariant(activeCompanion.id);
|
|
54
47
|
const [internalValue, setInternalValue] = useState(activeId);
|
|
55
48
|
|
|
56
49
|
useEffect(() => {
|
|
@@ -61,14 +54,14 @@ export const ComplementarySidebar = ({ current }: ComplementarySidebarProps) =>
|
|
|
61
54
|
(event: MouseEvent) => {
|
|
62
55
|
const nextValue = event.currentTarget.getAttribute('data-value') as string;
|
|
63
56
|
if (nextValue === activeId) {
|
|
64
|
-
updateState((
|
|
65
|
-
...
|
|
66
|
-
complementarySidebarState:
|
|
57
|
+
updateState((state) => ({
|
|
58
|
+
...state,
|
|
59
|
+
complementarySidebarState: state.complementarySidebarState === 'expanded' ? 'collapsed' : 'expanded',
|
|
67
60
|
}));
|
|
68
61
|
} else {
|
|
69
62
|
setInternalValue(nextValue);
|
|
70
|
-
updateState((
|
|
71
|
-
invokeSync(
|
|
63
|
+
updateState((state) => ({ ...state, complementarySidebarState: 'expanded' }));
|
|
64
|
+
invokeSync(LayoutOperation.UpdateComplementary, { subject: nextValue });
|
|
72
65
|
}
|
|
73
66
|
},
|
|
74
67
|
[state.complementarySidebarState, activeId, invokeSync, updateState],
|
|
@@ -85,7 +78,7 @@ export const ComplementarySidebar = ({ current }: ComplementarySidebarProps) =>
|
|
|
85
78
|
|
|
86
79
|
useEffect(() => {
|
|
87
80
|
if (!activeId) {
|
|
88
|
-
invokeSync(
|
|
81
|
+
invokeSync(LayoutOperation.UpdateComplementary, { state: 'collapsed' });
|
|
89
82
|
}
|
|
90
83
|
}, [activeId, invokeSync]);
|
|
91
84
|
|
|
@@ -93,30 +86,30 @@ export const ComplementarySidebar = ({ current }: ComplementarySidebarProps) =>
|
|
|
93
86
|
<Main.ComplementarySidebar
|
|
94
87
|
label={label}
|
|
95
88
|
classNames={[
|
|
96
|
-
topbar && '
|
|
97
|
-
hoistStatusbar && '
|
|
89
|
+
topbar && 'top-[calc(env(safe-area-inset-top)+var(--dx-rail-size))]',
|
|
90
|
+
hoistStatusbar && 'bottom-(--dx-statusbar-size)',
|
|
98
91
|
]}
|
|
99
92
|
>
|
|
100
93
|
<Tabs.Root orientation='vertical' verticalVariant='stateless' value={internalValue} classNames='contents'>
|
|
101
94
|
<div
|
|
102
95
|
role='none'
|
|
103
96
|
className={mx(
|
|
104
|
-
'absolute z-[1] inset-
|
|
105
|
-
'
|
|
106
|
-
'grid grid-cols-1 grid-rows-[1fr_min-content] bg-
|
|
97
|
+
'absolute z-[1] inset-y-0 end-0 !w-(--dx-r0-size)',
|
|
98
|
+
'py-[env(safe-area-inset-top)] pb-[env(safe-area-inset-bottom)] border-s border-subdued-separator',
|
|
99
|
+
'grid grid-cols-1 grid-rows-[1fr_min-content] bg-toolbar-surface dx-contain-layout dx-app-drag',
|
|
107
100
|
)}
|
|
108
101
|
>
|
|
109
|
-
<Tabs.Tablist classNames='grid grid-cols-1 auto-rows-
|
|
102
|
+
<Tabs.Tablist classNames='grid grid-cols-1 auto-rows-(--dx-rail-action) p-1 gap-1 overflow-y-auto!'>
|
|
110
103
|
{companions.map((companion) => (
|
|
111
|
-
<Tabs.Tab key={
|
|
104
|
+
<Tabs.Tab key={getCompanionVariant(companion.id)} value={getCompanionVariant(companion.id)} asChild>
|
|
112
105
|
<IconButton
|
|
113
106
|
label={toLocalizedString(companion.properties.label, t)}
|
|
114
107
|
icon={companion.properties.icon}
|
|
115
108
|
iconOnly
|
|
116
109
|
tooltipSide='left'
|
|
117
|
-
data-value={
|
|
110
|
+
data-value={getCompanionVariant(companion.id)}
|
|
118
111
|
variant={
|
|
119
|
-
activeId ===
|
|
112
|
+
activeId === getCompanionVariant(companion.id)
|
|
120
113
|
? state.complementarySidebarState === 'expanded'
|
|
121
114
|
? 'primary'
|
|
122
115
|
: 'default'
|
|
@@ -128,23 +121,23 @@ export const ComplementarySidebar = ({ current }: ComplementarySidebarProps) =>
|
|
|
128
121
|
))}
|
|
129
122
|
</Tabs.Tablist>
|
|
130
123
|
{!hoistStatusbar && (
|
|
131
|
-
<div role='none' className='grid grid-cols-1 auto-rows-
|
|
132
|
-
<Surface role='status-bar--r0-footer' limit={1} />
|
|
124
|
+
<div role='none' className='grid grid-cols-1 auto-rows-(--dx-rail-item) p-1 overflow-y-auto'>
|
|
125
|
+
<Surface.Surface role='status-bar--r0-footer' limit={1} />
|
|
133
126
|
</div>
|
|
134
127
|
)}
|
|
135
|
-
<div role='none' className='hidden lg:grid grid-cols-1 auto-rows-
|
|
128
|
+
<div role='none' className='hidden lg:grid grid-cols-1 auto-rows-(--dx-rail-action) p-1'>
|
|
136
129
|
<ToggleComplementarySidebarButton />
|
|
137
130
|
</div>
|
|
138
131
|
</div>
|
|
139
132
|
{activeId &&
|
|
140
133
|
companions.map((companion) => (
|
|
141
134
|
<Tabs.Tabpanel
|
|
142
|
-
key={
|
|
143
|
-
value={
|
|
135
|
+
key={getCompanionVariant(companion.id)}
|
|
136
|
+
value={getCompanionVariant(companion.id)}
|
|
144
137
|
classNames={[
|
|
145
138
|
'absolute data-[state="inactive"]:-z-[1] overflow-hidden',
|
|
146
|
-
'inset-
|
|
147
|
-
'grid grid-cols-1 grid-rows-[var(--rail-size)_1fr_min-content]
|
|
139
|
+
'inset-y-0 start-0 w-[calc(100%-var(--dx-r0-size))] lg:w-(--dx-r1-size)',
|
|
140
|
+
'grid grid-cols-1 grid-rows-[var(--dx-rail-size)_1fr_min-content] py-[env(safe-area-inset-top)]',
|
|
148
141
|
]}
|
|
149
142
|
{...(state.complementarySidebarState !== 'expanded' && { inert: true })}
|
|
150
143
|
>
|
|
@@ -174,48 +167,52 @@ type ComplementarySidebarPanelProps = {
|
|
|
174
167
|
const ComplementarySidebarPanel = ({ companion, activeId, data, hoistStatusbar }: ComplementarySidebarPanelProps) => {
|
|
175
168
|
const { t } = useTranslation(meta.id);
|
|
176
169
|
|
|
177
|
-
if (
|
|
170
|
+
if (getCompanionVariant(companion.id) !== activeId && !data) {
|
|
178
171
|
return null;
|
|
179
172
|
}
|
|
180
173
|
|
|
181
|
-
const Wrapper = companion.properties.fixed ? Fragment :
|
|
174
|
+
const Wrapper = companion.properties.fixed ? Fragment : ScrollAreaWrapper;
|
|
182
175
|
|
|
183
176
|
return (
|
|
184
177
|
<>
|
|
185
|
-
<div role='none' className='flex items-center p-1 gap-1 border-
|
|
178
|
+
<div role='none' className='flex items-center p-1 gap-1 border-b border-subdued-separator'>
|
|
186
179
|
<IconButton
|
|
187
180
|
label={toLocalizedString(companion.properties.label, t)}
|
|
188
181
|
icon={companion.properties.icon}
|
|
189
182
|
iconOnly
|
|
190
183
|
tooltipSide='left'
|
|
191
|
-
data-value={
|
|
192
|
-
classNames='
|
|
184
|
+
data-value={getCompanionVariant(companion.id)}
|
|
185
|
+
classNames='h-10 w-10'
|
|
193
186
|
variant='default'
|
|
194
187
|
/>
|
|
195
|
-
<div role='none' className='
|
|
188
|
+
<div role='none' className='px-1'>
|
|
196
189
|
{toLocalizedString(companion.properties.label, t)}
|
|
197
190
|
</div>
|
|
198
191
|
</div>
|
|
199
192
|
<Wrapper>
|
|
200
|
-
<Surface
|
|
201
|
-
role={`deck-companion--${
|
|
193
|
+
<Surface.Surface
|
|
194
|
+
role={`deck-companion--${getCompanionVariant(companion.id)}`}
|
|
202
195
|
data={data}
|
|
203
|
-
fallback={
|
|
196
|
+
fallback={PlankErrorFallback}
|
|
204
197
|
placeholder={<PlankLoading />}
|
|
205
198
|
/>
|
|
206
199
|
</Wrapper>
|
|
207
200
|
{!hoistStatusbar && (
|
|
208
201
|
<div
|
|
209
202
|
role='contentinfo'
|
|
210
|
-
className='flex flex-wrap justify-center items-center border-
|
|
203
|
+
className='flex flex-wrap justify-center items-center border-y border-subdued-separator pt-1 pb-[max(env(safe-area-inset-bottom),0.25rem)]'
|
|
211
204
|
>
|
|
212
|
-
<Surface role='status-bar--r1-footer' limit={1} />
|
|
205
|
+
<Surface.Surface role='status-bar--r1-footer' limit={1} />
|
|
213
206
|
</div>
|
|
214
207
|
)}
|
|
215
208
|
</>
|
|
216
209
|
);
|
|
217
210
|
};
|
|
218
211
|
|
|
219
|
-
const
|
|
220
|
-
return
|
|
212
|
+
const ScrollAreaWrapper = ({ children }: PropsWithChildren) => {
|
|
213
|
+
return (
|
|
214
|
+
<ScrollArea.Root thin orientation='vertical' classNames='grow'>
|
|
215
|
+
<ScrollArea.Viewport>{children}</ScrollArea.Viewport>
|
|
216
|
+
</ScrollArea.Root>
|
|
217
|
+
);
|
|
221
218
|
};
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import React, { useMemo } from 'react';
|
|
6
6
|
|
|
7
|
-
import { Surface } from '@dxos/app-framework/
|
|
7
|
+
import { Surface } from '@dxos/app-framework/ui';
|
|
8
8
|
import { type Label, Main } from '@dxos/react-ui';
|
|
9
9
|
|
|
10
10
|
import { useBreakpoints, useDeckState, useHoistStatusbar } from '../../hooks';
|
|
@@ -32,11 +32,11 @@ export const Sidebar = () => {
|
|
|
32
32
|
label={label}
|
|
33
33
|
classNames={[
|
|
34
34
|
'grid',
|
|
35
|
-
topbar && '
|
|
36
|
-
hoistStatusbar && '
|
|
35
|
+
topbar && 'top-[calc(env(safe-area-inset-top)+var(--dx-rail-size))]',
|
|
36
|
+
hoistStatusbar && 'bottom-(--dx-statusbar-size)',
|
|
37
37
|
]}
|
|
38
38
|
>
|
|
39
|
-
<Surface role='navigation' data={navigationData} limit={1} />
|
|
39
|
+
<Surface.Surface role='navigation' data={navigationData} limit={1} />
|
|
40
40
|
</Main.NavigationSidebar>
|
|
41
41
|
);
|
|
42
42
|
};
|