diff --git a/src/alf/breakpoints.ts b/src/alf/breakpoints.ts index 9345856449..f30a4b4895 100644 --- a/src/alf/breakpoints.ts +++ b/src/alf/breakpoints.ts @@ -26,3 +26,18 @@ export function useBreakpoints(): Record & { } }, [gtPhone, gtMobile, gtTablet]) } + +/** + * Fine-tuned breakpoints for the shell layout + */ +export function useLayoutBreakpoints() { + const rightNavVisible = useMediaQuery({minWidth: 1075}) + const centerColumnOffset = useMediaQuery({minWidth: 1075, maxWidth: 1300}) + const leftNavMinimal = useMediaQuery({maxWidth: 1300}) + + return { + rightNavVisible, + centerColumnOffset, + leftNavMinimal, + } +} diff --git a/src/components/Dialog/context.ts b/src/components/Dialog/context.ts index b479bc7f06..331ff3f33a 100644 --- a/src/components/Dialog/context.ts +++ b/src/components/Dialog/context.ts @@ -14,6 +14,7 @@ export const Context = React.createContext({ nativeSnapPoint: BottomSheetSnapPoint.Hidden, disableDrag: false, setDisableDrag: () => {}, + isWithinDialog: false, }) export function useDialogContext() { diff --git a/src/components/Dialog/index.tsx b/src/components/Dialog/index.tsx index e70e4aef4c..463cadf3c8 100644 --- a/src/components/Dialog/index.tsx +++ b/src/components/Dialog/index.tsx @@ -154,6 +154,7 @@ export function Outer({ nativeSnapPoint: snapPoint, disableDrag, setDisableDrag, + isWithinDialog: true, }), [close, snapPoint, disableDrag, setDisableDrag], ) diff --git a/src/components/Dialog/index.web.tsx b/src/components/Dialog/index.web.tsx index a27222229d..1539546910 100644 --- a/src/components/Dialog/index.web.tsx +++ b/src/components/Dialog/index.web.tsx @@ -97,6 +97,7 @@ export function Outer({ nativeSnapPoint: 0, disableDrag: false, setDisableDrag: () => {}, + isWithinDialog: true, }), [close], ) diff --git a/src/components/Dialog/types.ts b/src/components/Dialog/types.ts index b87bfe2b71..32886f3ce7 100644 --- a/src/components/Dialog/types.ts +++ b/src/components/Dialog/types.ts @@ -44,6 +44,8 @@ export type DialogContextProps = { nativeSnapPoint: BottomSheetSnapPoint disableDrag: boolean setDisableDrag: React.Dispatch> + // in the event that the hook is used outside of a dialog + isWithinDialog: boolean } export type DialogControlOpenOptions = { diff --git a/src/components/Layout/Header/index.tsx b/src/components/Layout/Header/index.tsx index 3af0215c52..8ef114b442 100644 --- a/src/components/Layout/Header/index.tsx +++ b/src/components/Layout/Header/index.tsx @@ -14,6 +14,7 @@ import { TextStyleProp, useBreakpoints, useGutters, + useLayoutBreakpoints, useTheme, web, } from '#/alf' @@ -23,6 +24,7 @@ import {Menu_Stroke2_Corner0_Rounded as Menu} from '#/components/icons/Menu' import { BUTTON_VISUAL_ALIGNMENT_OFFSET, HEADER_SLOT_SIZE, + SCROLLBAR_OFFSET, } from '#/components/Layout/const' import {ScrollbarOffsetContext} from '#/components/Layout/context' import {Text} from '#/components/Typography' @@ -42,6 +44,7 @@ export function Outer({ const gutters = useGutters([0, 'base']) const {gtMobile} = useBreakpoints() const {isWithinOffsetView} = useContext(ScrollbarOffsetContext) + const {centerColumnOffset} = useLayoutBreakpoints() return ( {children} diff --git a/src/components/Layout/index.tsx b/src/components/Layout/index.tsx index 489ebb2257..623478a6ac 100644 --- a/src/components/Layout/index.tsx +++ b/src/components/Layout/index.tsx @@ -13,7 +13,15 @@ import {useSafeAreaInsets} from 'react-native-safe-area-context' import {isWeb} from '#/platform/detection' import {useShellLayout} from '#/state/shell/shell-layout' -import {atoms as a, useBreakpoints, useTheme, web} from '#/alf' +import { + atoms as a, + useBreakpoints, + useLayoutBreakpoints, + useTheme, + web, +} from '#/alf' +import {useDialogContext} from '#/components/Dialog' +import {SCROLLBAR_OFFSET} from '#/components/Layout/const' import {ScrollbarOffsetContext} from '#/components/Layout/context' export * from '#/components/Layout/const' @@ -47,6 +55,7 @@ export const Screen = React.memo(function Screen({ export type ContentProps = AnimatedScrollViewProps & { style?: StyleProp contentContainerStyle?: StyleProp + ignoreTabletLayoutOffset?: boolean } /** @@ -56,6 +65,7 @@ export const Content = React.memo(function Content({ children, style, contentContainerStyle, + ignoreTabletLayoutOffset, ...props }: ContentProps) { const t = useTheme() @@ -84,8 +94,10 @@ export const Content = React.memo(function Content({ ]} {...props}> {isWeb ? ( - // @ts-ignore web only -esb -
{children}
+
+ {/* @ts-expect-error web only -esb */} + {children} +
) : ( children )} @@ -138,10 +150,13 @@ export const KeyboardAwareContent = React.memo(function LayoutScrollView({ export const Center = React.memo(function LayoutContent({ children, style, + ignoreTabletLayoutOffset, ...props -}: ViewProps) { +}: ViewProps & {ignoreTabletLayoutOffset?: boolean}) { const {isWithinOffsetView} = useContext(ScrollbarOffsetContext) const {gtMobile} = useBreakpoints() + const {centerColumnOffset} = useLayoutBreakpoints() + const {isWithinDialog} = useDialogContext() const ctx = useMemo(() => ({isWithinOffsetView: true}), []) return ( @@ -168,6 +195,7 @@ export const Center = React.memo(function LayoutContent({ const WebCenterBorders = React.memo(function LayoutContent() { const t = useTheme() const {gtMobile} = useBreakpoints() + const {centerColumnOffset} = useLayoutBreakpoints() return gtMobile ? ( )} - - + - + ) } diff --git a/src/view/com/auth/SplashScreen.web.tsx b/src/view/com/auth/SplashScreen.web.tsx index eded803589..21b289e2ca 100644 --- a/src/view/com/auth/SplashScreen.web.tsx +++ b/src/view/com/auth/SplashScreen.web.tsx @@ -16,9 +16,9 @@ import { import {atoms as a, useTheme} from '#/alf' import {AppLanguageDropdown} from '#/components/AppLanguageDropdown' import {Button, ButtonText} from '#/components/Button' +import * as Layout from '#/components/Layout' import {InlineLinkText} from '#/components/Link' import {Text} from '#/components/Typography' -import {CenteredView} from '../util/Views' export const SplashScreen = ({ onDismiss, @@ -70,13 +70,13 @@ export const SplashScreen = ({ )} - +