import { css } from '@linaria/core'; import { type ReactNode } from 'react'; import { buildSchemeContext, MAX_CONTENT_WIDTH_PX, mediaUp, RHYTHM, type Scheme, semanticColor, spacing, } from '@/tokens'; import { Container } from './Container'; const sectionShellClassName = css` background-color: ${semanticColor.surface}; min-width: 0; overflow: clip; position: relative; width: 100%; &[data-rhythm='section'] { padding-block: ${spacing(RHYTHM.section.top.base)} ${spacing(RHYTHM.section.bottom.base)}; ${mediaUp('md')} { padding-block: ${spacing(RHYTHM.section.top.md)} ${spacing(RHYTHM.section.bottom.md)}; } } &[data-rhythm='flush'] { overflow: visible; padding-block: 0; } &[data-rhythm='spacious'] { padding-block: ${spacing(RHYTHM.spacious.top.base)} ${spacing(RHYTHM.spacious.bottom.base)}; ${mediaUp('md')} { padding-block: ${spacing(RHYTHM.spacious.top.md)} ${spacing(RHYTHM.spacious.bottom.md)}; } } &[data-rhythm='hero'] { padding-block: ${spacing(RHYTHM.hero.top.base)} ${spacing(RHYTHM.hero.bottom.base)}; ${mediaUp('md')} { padding-block: ${spacing(RHYTHM.hero.top.md)} ${spacing(RHYTHM.hero.bottom.md)}; } } &[data-scheme='light'] { ${buildSchemeContext('light')} } &[data-scheme='muted'] { ${buildSchemeContext('muted')} } &[data-scheme='dark'] { ${buildSchemeContext('dark')} } &[data-scheme='light']:not([data-rhythm='flush']) + &[data-scheme='light']:not([data-keep-top-rhythm]), &[data-scheme='muted']:not([data-rhythm='flush']) + &[data-scheme='muted']:not([data-keep-top-rhythm]), &[data-scheme='dark']:not([data-rhythm='flush']) + &[data-scheme='dark']:not([data-keep-top-rhythm]) { padding-top: ${spacing(1.5)}; } &:has(+ &[data-connect-up]) { overflow: visible; padding-bottom: 0; z-index: 1; } `; const backgroundLayerClassName = css` inset: 0; margin-inline: auto; max-width: ${MAX_CONTENT_WIDTH_PX}px; overflow: clip; pointer-events: none; position: absolute; z-index: 0; &[data-full-bleed] { max-width: none; } `; const contentLayerClassName = css` position: relative; z-index: 1; `; export type SectionShellProps = { ariaLabel?: string; background?: ReactNode; children: ReactNode; connectsUp?: boolean; flushInline?: boolean; fullBleedBackground?: boolean; keepsTopRhythm?: boolean; rhythm?: 'section' | 'hero' | 'spacious' | 'flush'; scheme?: Scheme; }; export function SectionShell({ ariaLabel, background, children, connectsUp = false, flushInline = false, fullBleedBackground = false, keepsTopRhythm = false, rhythm = 'section', scheme = 'light', }: SectionShellProps) { return (
{background !== undefined && (
{background}
)} {children}
); }