✨ feat: add section component

This commit is contained in:
2026-02-18 12:00:56 +01:00
parent aef7bd45c9
commit 066264f14d
2 changed files with 130 additions and 1 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
import { Typography, TypographyProps } from '@mui/material' import { Typography, TypographyProps } from '@mui/material'
import { FC } from 'react' import { FC } from 'react'
const Header: FC<TypographyProps> = props => <Typography variant="h4" color="primary.main" component="h2" gutterBottom {...props} /> const Header: FC<TypographyProps> = props => <Typography variant="h4" component="h2" gutterBottom {...props} />
export default Header export default Header
+129
View File
@@ -0,0 +1,129 @@
import React from 'react'
import { Box, BoxProps, Typography } from '@mui/material'
import SectionHeader from 'components/atoms/SectionHeader/index.js'
interface SectionProps extends BoxProps {
variant?: 'primary' | 'secondary'
title?: string
headline?: string
imageUrl?: string
imageAlt?: string
imageCaption?: React.ReactNode
children?: React.ReactNode
}
const Section: React.FC<SectionProps> = ({ variant = 'primary', imageUrl, imageAlt, imageCaption, children, ...props }) => {
return (
<Box
component="section"
sx={{
margin: 0,
padding: 0,
width: '100%',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
backgroundColor: variant === 'primary' ? 'background.default' : 'background.paper',
}}>
<Box
{...props}
sx={{
py: 5,
width: theme => theme.breakpoints.values.lg,
...props.sx,
}}>
{props.title && (
<SectionHeader
sx={[
theme => ({
paddingBottom: 3,
[theme.breakpoints.up('md')]: {
width: '90em',
maxWidth: 'calc(100% - 2em)',
mx: 'auto',
},
}),
theme =>
theme.applyStyles('dark', {
paddingBottom: 3,
[theme.breakpoints.up('md')]: {
width: '90em',
maxWidth: 'calc(100% - 2em)',
mx: 'auto',
},
}),
]}>
{props.title}
</SectionHeader>
)}
{props.headline && (
<Typography
variant="body1"
color="text.secondary"
sx={theme => ({
paddingBottom: 3,
[theme.breakpoints.up('md')]: {
width: '90em',
maxWidth: 'calc(100% - 4em)',
mx: 'auto',
},
})}>
{props.headline}
</Typography>
)}
<Box
sx={theme => ({
display: 'flex',
justifyContent: 'center',
[theme.breakpoints.down('md')]: {
minHeight: '60vh',
flexDirection: props.title || props.headline ? 'column' : 'column-reverse',
alignItems: 'align-items',
gap: 3,
},
[theme.breakpoints.up('md')]: {
mx: 'auto',
width: '90em',
maxWidth: 'calc(100% - 4em)',
flexDirection: variant === 'primary' ? 'row-reverse' : 'row',
alignItems: 'center',
gap: 5,
},
})}>
{imageUrl &&
(imageCaption ? (
<Box sx={{ flex: 4, flexDirection: 'column', alignItems: 'center', justifyContent: 'center' }}>
<Box component="img" src={imageUrl} alt={imageAlt} width="100%" />
{imageCaption}
</Box>
) : (
<Box
component="img"
src={imageUrl}
alt={imageAlt}
sx={{ width: { xs: '100%', md: '40%' }, flex: 4, flexDirection: 'column', alignItems: 'center', justifyContent: 'center' }}
/>
))}
<Box
sx={{
flex: 6,
display: 'flex',
flexDirection: 'column',
justifyContent: 'center',
alignContent: 'center',
gap: 1,
...props.sx,
}}>
{children}
</Box>
</Box>
</Box>
</Box>
)
}
export default Section