@patreon/studio
Version:
Patreon Studio Design System
80 lines (78 loc) • 3.24 kB
JSX
import cx from 'classnames';
import React from 'react';
import { BodyText } from '~/components/BodyText';
import { HeadingText } from '~/components/HeadingText';
import styles from './MediaLockup.module.css';
export function MediaLockup({ children, 'data-tag': dataTag, id, size = 'md', variant, leadingMedia, trailingMedia, className, style, ...props }) {
const classList = cx(styles.root, {
[styles.variantBody]: variant === 'body',
[styles.variantHeading]: variant === 'heading',
[styles.variantCustom]: variant === 'custom',
[styles.sizeXs]: size === 'xs',
[styles.sizeSm]: size === 'sm',
[styles.sizeMd]: size === 'md',
[styles.sizeLg]: size === 'lg',
}, className);
return (<div className={classList} style={style} id={id} data-tag={dataTag} {...props}>
{leadingMedia && <MediaComponent variant={variant} size={size} media={leadingMedia}/>}
<ContentComponent variant={variant} size={size}>
{children}
</ContentComponent>
{trailingMedia && <MediaComponent variant={variant} size={size} media={trailingMedia}/>}
</div>);
}
function MediaComponent({ variant, size, media }) {
const sizes = getSizesByVariant(variant, size);
if (media.type === 'icon') {
return <media.component color="inherit" size={sizes?.icon} {...media.props}/>;
}
if (media.type === 'avatar') {
return <media.component size={sizes?.avatar} {...media.props}/>;
}
if (media.type === 'image') {
return (<div style={{ width: sizes?.image }}>
<media.component {...media.props}/>
</div>);
}
if (media.type === 'loading') {
return (<div>
<media.component size={sizes?.spinner} {...media.props}/>
</div>);
}
return null;
}
function ContentComponent({ variant, size, children }) {
if (variant === 'body') {
return (<BodyText as="span" size={bodyVariantToSizes[size].text} color="inherit">
{children}
</BodyText>);
}
if (variant === 'heading') {
return (<HeadingText as="span" size={headingVariantToTextSize[size].text} color="inherit">
{children}
</HeadingText>);
}
return <div>{children}</div>;
}
function getSizesByVariant(variant, size) {
if (variant === 'heading') {
return headingVariantToTextSize[size];
}
if (variant === 'body') {
return bodyVariantToSizes[size];
}
return null;
}
const bodyVariantToSizes = {
xs: { text: 'sm', icon: '12px', spinner: 'xxs', avatar: '18px', image: '12px' },
sm: { text: 'md', icon: '16px', spinner: 'xxs', avatar: '20px', image: '16px' },
md: { text: 'lg', icon: '20px', spinner: 'xs', avatar: '24px', image: '20px' },
lg: { text: 'lg', icon: '24px', spinner: 'xs', avatar: '28px', image: '24px' },
};
const headingVariantToTextSize = {
xs: { text: 'sm', icon: '16px', spinner: 'xxs', avatar: '18px', image: '16px' },
sm: { text: 'md', icon: '20px', spinner: 'xs', avatar: '20px', image: '20px' },
md: { text: 'lg', icon: '24px', spinner: 'sm', avatar: '24px', image: '24px' },
lg: { text: 'xl', icon: '32px', spinner: 'sm', avatar: '32px', image: '32px' },
};
//# sourceMappingURL=index.jsx.map