@patreon/studio
Version:
Patreon Studio Design System
68 lines • 2.97 kB
JSX
'use client';
import cx from 'classnames';
import React, { memo, useMemo } from 'react';
import { classNameForHighlightSize } from '../../styles/classNameForHighlightSize';
import { classNameForIconColor } from '../../styles/classNameForIconColor';
import { tokens } from '../../tokens';
import { wrapResponsive, mapResponsive } from '../../utilities/opaque-responsive';
import { classNameForResponsiveValue, createResponsiveClassNameLookup } from '../../utilities/responsive-style';
import { useIncrementLogger } from '../IncrementLogger';
import styles from './Icon.module.css';
const isLegacySize = (value) => !value.includes('px');
const legacyToModernSizeMap = {
xxxxs: '8px',
xxxs: '10px',
xxs: '12px',
xs: '16px',
sm: '24px',
md: '32px',
lg: '40px',
xl: '48px',
xxl: '64px',
xxxl: '88px',
};
const classNameSizeLookup = createResponsiveClassNameLookup(styles, {
'8px': 'sizePx8',
'10px': 'sizePx10',
'12px': 'sizePx12',
'16px': 'sizePx16',
'20px': 'sizePx20',
'24px': 'sizePx24',
'32px': 'sizePx32',
'40px': 'sizePx40',
'48px': 'sizePx48',
'64px': 'sizePx64',
'88px': 'sizePx88',
});
const verticalAlignMap = {
baseline: styles.verticalAlignBaseline,
sub: styles.verticalAlignSub,
super: styles.verticalAlignSuper,
'text-top': styles.verticalAlignTextTop,
'text-bottom': styles.verticalAlignTextBottom,
middle: styles.verticalAlignMiddle,
top: styles.verticalAlignTop,
bottom: styles.verticalAlignBottom,
};
export const Icon = memo(function IconWrapper({ innerRef, size = '16px', color = tokens.global.content.regular.default, highlight = false, highlightColor = tokens.global.primary.muted.default, highlightSize = tokens.global.space.x40, children, verticalAlign, title, id, 'data-tag': dataTag, className, style, ...props }) {
const { incrementLoggerOnce } = useIncrementLogger();
const responsiveSize = useMemo(() => mapResponsive(wrapResponsive(size), (value) => {
if (isLegacySize(value)) {
incrementLoggerOnce('studio.deprecated.icon-size', { value });
return legacyToModernSizeMap[value];
}
return value;
}), [incrementLoggerOnce, size]);
const classList = cx(styles.root, classNameForIconColor({ color }), classNameForResponsiveValue(responsiveSize, classNameSizeLookup), verticalAlign && verticalAlignMap[verticalAlign], className);
const icon = (<span ref={innerRef} title={title} aria-hidden id={id} data-tag={dataTag} className={classList} style={style} {...props}>
{children}
</span>);
if (highlight) {
const hightlightClassList = cx(styles.highlight, classNameForIconColor({ color: highlightColor }), classNameForHighlightSize({ highlightSize }));
return (<span className={hightlightClassList} data-tag={dataTag && 'icon-highlight-container'}>
{icon}
</span>);
}
return icon;
});
//# sourceMappingURL=Icon.jsx.map