@dxos/plugin-deck 0.8.4-main.bc674ce → 0.8.4-main.c351d160a8
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-AJW6225V.mjs +14 -0
- package/dist/lib/browser/Banner-AJW6225V.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-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/{chunk-S4A5UO4K.mjs → chunk-WTNYSXY5.mjs} +221 -281
- package/dist/lib/browser/chunk-WTNYSXY5.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-XDCMNENQ.mjs → react-root-XBFHPSCP.mjs} +8 -7
- package/dist/lib/browser/react-root-XBFHPSCP.mjs.map +7 -0
- package/dist/lib/browser/react-surface-4J3BZNT2.mjs +44 -0
- package/dist/lib/browser/react-surface-4J3BZNT2.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-XBH2IIDR.mjs +15 -0
- package/dist/lib/node-esm/Banner-XBH2IIDR.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-D34L3ECT.mjs → chunk-CQ3XYTNJ.mjs} +220 -280
- package/dist/lib/node-esm/chunk-CQ3XYTNJ.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-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-O6GZO62Z.mjs → react-root-32LZ6APH.mjs} +8 -7
- package/dist/lib/node-esm/react-root-32LZ6APH.mjs.map +7 -0
- package/dist/lib/node-esm/{react-surface-IHDJDGC5.mjs → react-surface-CO4ZDZKM.mjs} +18 -16
- package/dist/lib/node-esm/react-surface-CO4ZDZKM.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 +48 -44
- 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 +26 -25
- package/src/components/DeckLayout/Dialog.tsx +10 -4
- package/src/components/DeckLayout/Fallback.tsx +2 -6
- package/src/components/DeckLayout/Popover.tsx +46 -14
- 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 +24 -26
- package/src/components/Plank/PlankLoading.tsx +1 -1
- package/src/components/Sidebar/ComplementarySidebar.tsx +50 -51
- 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-NHABISX2.mjs +0 -152
- package/dist/lib/browser/chunk-NHABISX2.mjs.map +0 -7
- package/dist/lib/browser/chunk-S4A5UO4K.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-XDCMNENQ.mjs.map +0 -7
- package/dist/lib/browser/react-surface-HODERLOL.mjs +0 -42
- package/dist/lib/browser/react-surface-HODERLOL.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-D34L3ECT.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-SKEVPQ7E.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-O6GZO62Z.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-IHDJDGC5.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
|
+
};
|
|
@@ -2,18 +2,18 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import React, { Fragment, type MouseEvent, memo, useCallback, useEffect, useMemo } from 'react';
|
|
5
|
+
import React, { CSSProperties, 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';
|
|
12
13
|
import { TextTooltip } from '@dxos/react-ui-text-tooltip';
|
|
13
|
-
import { hoverableControls, hoverableFocusedWithinControls } from '@dxos/ui-theme';
|
|
14
|
+
import { hoverableControls, hoverableFocusedWithinControls, largeIconSize } 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,41 +132,39 @@ 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
|
|
150
|
+
data-plank-heading
|
|
151
|
+
style={largeIconSize}
|
|
153
152
|
classNames={[
|
|
154
|
-
'
|
|
155
|
-
part === 'solo' ? soloInlinePadding : '
|
|
153
|
+
'py-1 items-stretch gap-1 sticky left-12 dx-app-drag min-w-0 dx-contain-layout dx-density-coarse',
|
|
154
|
+
part === 'solo' ? soloInlinePadding : 'px-1',
|
|
156
155
|
...(layoutMode === 'solo--fullscreen'
|
|
157
156
|
? [
|
|
158
157
|
hoverableControls,
|
|
159
158
|
hoverableFocusedWithinControls,
|
|
160
|
-
'*:transition-opacity *:opacity-
|
|
161
|
-
'hover-hover:hover:bg-
|
|
159
|
+
'*:transition-opacity *:opacity-(--controls-opacity) bg-transparent border-transparent transition-[background-color,border-color]',
|
|
160
|
+
'hover-hover:hover:bg-header-surface focus-within:bg-header-surface hover-hover:hover:border-subdued-separator focus-within:border-subdued-separator',
|
|
162
161
|
]
|
|
163
162
|
: []),
|
|
164
163
|
]}
|
|
165
|
-
data-plank-heading
|
|
166
164
|
>
|
|
167
165
|
{companions && isCompanionNode ? (
|
|
168
166
|
/* TODO(thure): IMPORTANT: This is a tablist; it should be implemented as such. */
|
|
169
|
-
<div role='none' className='flex-1 min-
|
|
167
|
+
<div role='none' className='flex-1 min-w-0 overflow-x-auto scrollbar-none flex gap-1'>
|
|
170
168
|
{companions.map(({ id, properties: { icon, label } }) => (
|
|
171
169
|
<IconButton
|
|
172
170
|
key={id}
|
|
@@ -191,7 +189,7 @@ export const PlankHeading = memo(
|
|
|
191
189
|
actions={sigilActions}
|
|
192
190
|
onAction={handleAction}
|
|
193
191
|
>
|
|
194
|
-
<Surface role='menu-footer' data={{ subject: node.data }} />
|
|
192
|
+
<Surface.Surface role='menu-footer' data={{ subject: node.data }} />
|
|
195
193
|
</StackItem.Sigil>
|
|
196
194
|
) : (
|
|
197
195
|
<StackItem.SigilButton>
|
|
@@ -211,7 +209,7 @@ export const PlankHeading = memo(
|
|
|
211
209
|
</TextTooltip>
|
|
212
210
|
</>
|
|
213
211
|
)}
|
|
214
|
-
{node && part !== 'complementary' && <Surface role='navbar-end' data={{ subject: node.data }} />}
|
|
212
|
+
{node && part !== 'complementary' && <Surface.Surface role='navbar-end' data={{ subject: node.data }} />}
|
|
215
213
|
{companioned === 'companion' ? (
|
|
216
214
|
<PlankCompanionControls primary={primaryId} />
|
|
217
215
|
) : (
|
|
@@ -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
|
};
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import React, {
|
|
6
|
+
CSSProperties,
|
|
6
7
|
Fragment,
|
|
7
8
|
type MouseEvent,
|
|
8
9
|
type PropsWithChildren,
|
|
@@ -12,24 +13,17 @@ import React, {
|
|
|
12
13
|
useState,
|
|
13
14
|
} from 'react';
|
|
14
15
|
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import { IconButton, type Label, Main, toLocalizedString, useTranslation } from '@dxos/react-ui';
|
|
16
|
+
import { Surface, useOperationInvoker } from '@dxos/app-framework/ui';
|
|
17
|
+
import { LayoutOperation, getCompanionVariant } from '@dxos/app-toolkit';
|
|
18
|
+
import { IconButton, type Label, Main, ScrollArea, toLocalizedString, useTranslation } from '@dxos/react-ui';
|
|
18
19
|
import { Tabs } from '@dxos/react-ui-tabs';
|
|
19
|
-
import { mx } from '@dxos/ui-theme';
|
|
20
|
-
|
|
21
|
-
import {
|
|
22
|
-
type DeckCompanion,
|
|
23
|
-
getCompanionId,
|
|
24
|
-
useBreakpoints,
|
|
25
|
-
useDeckCompanions,
|
|
26
|
-
useDeckState,
|
|
27
|
-
useHoistStatusbar,
|
|
28
|
-
} from '../../hooks';
|
|
20
|
+
import { largeIconSize, mx } from '@dxos/ui-theme';
|
|
21
|
+
|
|
22
|
+
import { type DeckCompanion, useBreakpoints, useDeckCompanions, useDeckState, useHoistStatusbar } from '../../hooks';
|
|
29
23
|
import { meta } from '../../meta';
|
|
30
24
|
import { getMode } from '../../types';
|
|
31
25
|
import { layoutAppliesTopbar } from '../../util';
|
|
32
|
-
import {
|
|
26
|
+
import { PlankErrorFallback, PlankLoading } from '../Plank';
|
|
33
27
|
|
|
34
28
|
import { ToggleComplementarySidebarButton } from './SidebarButton';
|
|
35
29
|
|
|
@@ -49,8 +43,8 @@ export const ComplementarySidebar = ({ current }: ComplementarySidebarProps) =>
|
|
|
49
43
|
const hoistStatusbar = useHoistStatusbar(breakpoint, layoutMode);
|
|
50
44
|
|
|
51
45
|
const companions = useDeckCompanions();
|
|
52
|
-
const activeCompanion = companions.find((companion) =>
|
|
53
|
-
const activeId = activeCompanion &&
|
|
46
|
+
const activeCompanion = companions.find((companion) => getCompanionVariant(companion.id) === current);
|
|
47
|
+
const activeId = activeCompanion && getCompanionVariant(activeCompanion.id);
|
|
54
48
|
const [internalValue, setInternalValue] = useState(activeId);
|
|
55
49
|
|
|
56
50
|
useEffect(() => {
|
|
@@ -61,14 +55,14 @@ export const ComplementarySidebar = ({ current }: ComplementarySidebarProps) =>
|
|
|
61
55
|
(event: MouseEvent) => {
|
|
62
56
|
const nextValue = event.currentTarget.getAttribute('data-value') as string;
|
|
63
57
|
if (nextValue === activeId) {
|
|
64
|
-
updateState((
|
|
65
|
-
...
|
|
66
|
-
complementarySidebarState:
|
|
58
|
+
updateState((state) => ({
|
|
59
|
+
...state,
|
|
60
|
+
complementarySidebarState: state.complementarySidebarState === 'expanded' ? 'collapsed' : 'expanded',
|
|
67
61
|
}));
|
|
68
62
|
} else {
|
|
69
63
|
setInternalValue(nextValue);
|
|
70
|
-
updateState((
|
|
71
|
-
invokeSync(
|
|
64
|
+
updateState((state) => ({ ...state, complementarySidebarState: 'expanded' }));
|
|
65
|
+
invokeSync(LayoutOperation.UpdateComplementary, { subject: nextValue });
|
|
72
66
|
}
|
|
73
67
|
},
|
|
74
68
|
[state.complementarySidebarState, activeId, invokeSync, updateState],
|
|
@@ -85,7 +79,7 @@ export const ComplementarySidebar = ({ current }: ComplementarySidebarProps) =>
|
|
|
85
79
|
|
|
86
80
|
useEffect(() => {
|
|
87
81
|
if (!activeId) {
|
|
88
|
-
invokeSync(
|
|
82
|
+
invokeSync(LayoutOperation.UpdateComplementary, { state: 'collapsed' });
|
|
89
83
|
}
|
|
90
84
|
}, [activeId, invokeSync]);
|
|
91
85
|
|
|
@@ -93,30 +87,31 @@ export const ComplementarySidebar = ({ current }: ComplementarySidebarProps) =>
|
|
|
93
87
|
<Main.ComplementarySidebar
|
|
94
88
|
label={label}
|
|
95
89
|
classNames={[
|
|
96
|
-
topbar && '
|
|
97
|
-
hoistStatusbar && '
|
|
90
|
+
topbar && 'top-[calc(env(safe-area-inset-top)+var(--dx-rail-size))]',
|
|
91
|
+
hoistStatusbar && 'bottom-(--dx-statusbar-size)',
|
|
98
92
|
]}
|
|
99
93
|
>
|
|
100
94
|
<Tabs.Root orientation='vertical' verticalVariant='stateless' value={internalValue} classNames='contents'>
|
|
101
95
|
<div
|
|
102
96
|
role='none'
|
|
97
|
+
style={largeIconSize}
|
|
103
98
|
className={mx(
|
|
104
|
-
'absolute z-[1] inset-
|
|
105
|
-
'
|
|
106
|
-
'grid grid-cols-1 grid-rows-[1fr_min-content] bg-
|
|
99
|
+
'absolute z-[1] inset-y-0 end-0 !w-(--dx-r0-size)',
|
|
100
|
+
'py-[env(safe-area-inset-top)] pb-[env(safe-area-inset-bottom)] border-s border-subdued-separator',
|
|
101
|
+
'grid grid-cols-1 grid-rows-[1fr_min-content] bg-toolbar-surface dx-contain-layout dx-app-drag',
|
|
107
102
|
)}
|
|
108
103
|
>
|
|
109
|
-
<Tabs.Tablist classNames='grid grid-cols-1 auto-rows-
|
|
104
|
+
<Tabs.Tablist classNames='grid grid-cols-1 auto-rows-(--dx-rail-action) p-1 gap-1 overflow-y-auto!'>
|
|
110
105
|
{companions.map((companion) => (
|
|
111
|
-
<Tabs.Tab key={
|
|
106
|
+
<Tabs.Tab key={getCompanionVariant(companion.id)} value={getCompanionVariant(companion.id)} asChild>
|
|
112
107
|
<IconButton
|
|
113
108
|
label={toLocalizedString(companion.properties.label, t)}
|
|
114
109
|
icon={companion.properties.icon}
|
|
115
110
|
iconOnly
|
|
116
111
|
tooltipSide='left'
|
|
117
|
-
data-value={
|
|
112
|
+
data-value={getCompanionVariant(companion.id)}
|
|
118
113
|
variant={
|
|
119
|
-
activeId ===
|
|
114
|
+
activeId === getCompanionVariant(companion.id)
|
|
120
115
|
? state.complementarySidebarState === 'expanded'
|
|
121
116
|
? 'primary'
|
|
122
117
|
: 'default'
|
|
@@ -128,23 +123,23 @@ export const ComplementarySidebar = ({ current }: ComplementarySidebarProps) =>
|
|
|
128
123
|
))}
|
|
129
124
|
</Tabs.Tablist>
|
|
130
125
|
{!hoistStatusbar && (
|
|
131
|
-
<div role='none' className='grid grid-cols-1 auto-rows-
|
|
132
|
-
<Surface role='status-bar--r0-footer' limit={1} />
|
|
126
|
+
<div role='none' className='grid grid-cols-1 auto-rows-(--dx-rail-item) p-1 overflow-y-auto'>
|
|
127
|
+
<Surface.Surface role='status-bar--r0-footer' limit={1} />
|
|
133
128
|
</div>
|
|
134
129
|
)}
|
|
135
|
-
<div role='none' className='hidden lg:grid grid-cols-1 auto-rows-
|
|
130
|
+
<div role='none' className='hidden lg:grid grid-cols-1 auto-rows-(--dx-rail-action) p-1'>
|
|
136
131
|
<ToggleComplementarySidebarButton />
|
|
137
132
|
</div>
|
|
138
133
|
</div>
|
|
139
134
|
{activeId &&
|
|
140
135
|
companions.map((companion) => (
|
|
141
136
|
<Tabs.Tabpanel
|
|
142
|
-
key={
|
|
143
|
-
value={
|
|
137
|
+
key={getCompanionVariant(companion.id)}
|
|
138
|
+
value={getCompanionVariant(companion.id)}
|
|
144
139
|
classNames={[
|
|
145
140
|
'absolute data-[state="inactive"]:-z-[1] overflow-hidden',
|
|
146
|
-
'inset-
|
|
147
|
-
'grid grid-cols-1 grid-rows-[var(--rail-size)_1fr_min-content]
|
|
141
|
+
'inset-y-0 start-0 w-[calc(100%-var(--dx-r0-size))] lg:w-(--dx-r1-size)',
|
|
142
|
+
'grid grid-cols-1 grid-rows-[var(--dx-rail-size)_1fr_min-content] py-[env(safe-area-inset-top)]',
|
|
148
143
|
]}
|
|
149
144
|
{...(state.complementarySidebarState !== 'expanded' && { inert: true })}
|
|
150
145
|
>
|
|
@@ -174,48 +169,52 @@ type ComplementarySidebarPanelProps = {
|
|
|
174
169
|
const ComplementarySidebarPanel = ({ companion, activeId, data, hoistStatusbar }: ComplementarySidebarPanelProps) => {
|
|
175
170
|
const { t } = useTranslation(meta.id);
|
|
176
171
|
|
|
177
|
-
if (
|
|
172
|
+
if (getCompanionVariant(companion.id) !== activeId && !data) {
|
|
178
173
|
return null;
|
|
179
174
|
}
|
|
180
175
|
|
|
181
|
-
const Wrapper = companion.properties.fixed ? Fragment :
|
|
176
|
+
const Wrapper = companion.properties.fixed ? Fragment : ScrollAreaWrapper;
|
|
182
177
|
|
|
183
178
|
return (
|
|
184
179
|
<>
|
|
185
|
-
<div role='none' className='flex items-center p-1 gap-1 border-
|
|
180
|
+
<div role='none' className='flex items-center p-1 gap-1 border-b border-subdued-separator'>
|
|
186
181
|
<IconButton
|
|
187
182
|
label={toLocalizedString(companion.properties.label, t)}
|
|
188
183
|
icon={companion.properties.icon}
|
|
189
184
|
iconOnly
|
|
190
185
|
tooltipSide='left'
|
|
191
|
-
data-value={
|
|
192
|
-
classNames='
|
|
186
|
+
data-value={getCompanionVariant(companion.id)}
|
|
187
|
+
classNames='h-10 w-10'
|
|
193
188
|
variant='default'
|
|
194
189
|
/>
|
|
195
|
-
<div role='none' className='
|
|
190
|
+
<div role='none' className='px-1'>
|
|
196
191
|
{toLocalizedString(companion.properties.label, t)}
|
|
197
192
|
</div>
|
|
198
193
|
</div>
|
|
199
194
|
<Wrapper>
|
|
200
|
-
<Surface
|
|
201
|
-
role={`deck-companion--${
|
|
195
|
+
<Surface.Surface
|
|
196
|
+
role={`deck-companion--${getCompanionVariant(companion.id)}`}
|
|
202
197
|
data={data}
|
|
203
|
-
fallback={
|
|
198
|
+
fallback={PlankErrorFallback}
|
|
204
199
|
placeholder={<PlankLoading />}
|
|
205
200
|
/>
|
|
206
201
|
</Wrapper>
|
|
207
202
|
{!hoistStatusbar && (
|
|
208
203
|
<div
|
|
209
204
|
role='contentinfo'
|
|
210
|
-
className='flex flex-wrap justify-center items-center border-
|
|
205
|
+
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
206
|
>
|
|
212
|
-
<Surface role='status-bar--r1-footer' limit={1} />
|
|
207
|
+
<Surface.Surface role='status-bar--r1-footer' limit={1} />
|
|
213
208
|
</div>
|
|
214
209
|
)}
|
|
215
210
|
</>
|
|
216
211
|
);
|
|
217
212
|
};
|
|
218
213
|
|
|
219
|
-
const
|
|
220
|
-
return
|
|
214
|
+
const ScrollAreaWrapper = ({ children }: PropsWithChildren) => {
|
|
215
|
+
return (
|
|
216
|
+
<ScrollArea.Root thin orientation='vertical' classNames='grow'>
|
|
217
|
+
<ScrollArea.Viewport>{children}</ScrollArea.Viewport>
|
|
218
|
+
</ScrollArea.Root>
|
|
219
|
+
);
|
|
221
220
|
};
|
|
@@ -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
|
};
|