UNPKG

@patreon/studio

Version:

Patreon Studio Design System

68 lines 2.97 kB
'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