From c916b57e8d95f884945d7032ed8e924d82d95227 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Sun, 8 Dec 2024 15:12:37 -0600 Subject: [PATCH] Port over gutters fix --- src/alf/breakpoints.ts | 28 ++++++++++++ src/alf/index.tsx | 30 +------------ src/alf/util/useGutters.ts | 90 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 120 insertions(+), 28 deletions(-) create mode 100644 src/alf/breakpoints.ts create mode 100644 src/alf/util/useGutters.ts diff --git a/src/alf/breakpoints.ts b/src/alf/breakpoints.ts new file mode 100644 index 0000000000..9345856449 --- /dev/null +++ b/src/alf/breakpoints.ts @@ -0,0 +1,28 @@ +import {useMemo} from 'react' +import {useMediaQuery} from 'react-responsive' + +export type Breakpoint = 'gtPhone' | 'gtMobile' | 'gtTablet' + +export function useBreakpoints(): Record & { + activeBreakpoint: Breakpoint | undefined +} { + const gtPhone = useMediaQuery({minWidth: 500}) + const gtMobile = useMediaQuery({minWidth: 800}) + const gtTablet = useMediaQuery({minWidth: 1300}) + return useMemo(() => { + let active: Breakpoint | undefined + if (gtTablet) { + active = 'gtTablet' + } else if (gtMobile) { + active = 'gtMobile' + } else if (gtPhone) { + active = 'gtPhone' + } + return { + activeBreakpoint: active, + gtPhone, + gtMobile, + gtTablet, + } + }, [gtPhone, gtMobile, gtTablet]) +} diff --git a/src/alf/index.tsx b/src/alf/index.tsx index 2e1d11f78b..5443669c70 100644 --- a/src/alf/index.tsx +++ b/src/alf/index.tsx @@ -1,5 +1,4 @@ import React from 'react' -import {useMediaQuery} from 'react-responsive' import { computeFontScaleMultiplier, @@ -14,13 +13,14 @@ import {BLUE_HUE, GREEN_HUE, RED_HUE} from '#/alf/util/colorGeneration' import {Device} from '#/storage' export {atoms} from '#/alf/atoms' +export * from '#/alf/breakpoints' export * from '#/alf/fonts' export * as tokens from '#/alf/tokens' export * from '#/alf/types' export * from '#/alf/util/flatten' export * from '#/alf/util/platform' export * from '#/alf/util/themeSelector' -export * from '#/alf/util/useGutterStyles' +export * from '#/alf/util/useGutters' export type Alf = { themeName: ThemeName @@ -142,29 +142,3 @@ export function useTheme(theme?: ThemeName) { return theme ? alf.themes[theme] : alf.theme }, [theme, alf]) } - -export type Breakpoint = 'gtPhone' | 'gtMobile' | 'gtTablet' - -export function useBreakpoints(): Record & { - activeBreakpoint: Breakpoint | undefined -} { - const gtPhone = useMediaQuery({minWidth: 500}) - const gtMobile = useMediaQuery({minWidth: 800}) - const gtTablet = useMediaQuery({minWidth: 1300}) - return React.useMemo(() => { - let active: Breakpoint | undefined - if (gtTablet) { - active = 'gtTablet' - } else if (gtMobile) { - active = 'gtMobile' - } else if (gtPhone) { - active = 'gtPhone' - } - return { - activeBreakpoint: active, - gtPhone, - gtMobile, - gtTablet, - } - }, [gtPhone, gtMobile, gtTablet]) -} diff --git a/src/alf/util/useGutters.ts b/src/alf/util/useGutters.ts new file mode 100644 index 0000000000..47da4b7331 --- /dev/null +++ b/src/alf/util/useGutters.ts @@ -0,0 +1,90 @@ +import React from 'react' + +import {atoms as a} from '#/alf/atoms' +import {Breakpoint, useBreakpoints} from '#/alf/breakpoints' +import * as tokens from '#/alf/tokens' + +type Gutter = 'compact' | 'base' | 'wide' | 0 + +const gutters: Record< + Exclude, + Record +> = { + compact: { + default: tokens.space.sm, + gtPhone: tokens.space.sm, + gtMobile: tokens.space.md, + gtTablet: tokens.space.md, + }, + base: { + default: tokens.space.lg, + gtPhone: tokens.space.lg, + gtMobile: tokens.space.xl, + gtTablet: tokens.space.xl, + }, + wide: { + default: tokens.space.xl, + gtPhone: tokens.space.xl, + gtMobile: tokens.space._3xl, + gtTablet: tokens.space._3xl, + }, +} + +type Gutters = { + paddingTop?: number + paddingRight?: number + paddingBottom?: number + paddingLeft?: number +} + +export function useGutters([all]: [Gutter]): Gutters +export function useGutters([vertical, horizontal]: [Gutter, Gutter]): Gutters +export function useGutters([top, right, bottom, left]: [ + Gutter, + Gutter, + Gutter, + Gutter, +]): Gutters +export function useGutters([top, right, bottom, left]: Gutter[]) { + const {activeBreakpoint} = useBreakpoints() + return React.useMemo(() => { + if (!right) { + // eslint-disable-next-line react-hooks/exhaustive-deps + right = bottom = left = top + } else if (!bottom || !left) { + bottom = top + left = right + } + + return { + paddingTop: + top === 0 ? undefined : gutters[top][activeBreakpoint || 'default'], + paddingRight: + right === 0 ? undefined : gutters[right][activeBreakpoint || 'default'], + paddingBottom: + bottom === 0 + ? undefined + : gutters[bottom][activeBreakpoint || 'default'], + paddingLeft: + left === 0 ? undefined : gutters[left][activeBreakpoint || 'default'], + } + }, [activeBreakpoint, top, bottom, left, right]) +} + +export function useGutterStyles({ + top, + bottom, +}: { + top?: boolean + bottom?: boolean +} = {}) { + const {gtMobile} = useBreakpoints() + return React.useMemo(() => { + return [ + a.px_lg, + top && a.pt_md, + bottom && a.pb_md, + gtMobile && [a.px_xl, top && a.pt_lg, bottom && a.pb_lg], + ] + }, [gtMobile, top, bottom]) +}