import { createElement, type HTMLAttributes } from 'react' import classnames from 'classnames' import { type OverrideClassName } from '~components/types/OverrideClassName' import styles from './Text.module.css' export type TextVariants = 'intro-lede' | 'body' | 'small' | 'extra-small' export type AllowedTextTags = | 'pre' | 'p' | 'div' | 'span' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'label' export type AllowedTextColors = | 'dark' | 'dark-reduced-opacity' | 'white' | 'white-reduced-opacity' | 'positive' | 'negative' export interface TextProps extends OverrideClassName> { children: React.ReactNode /** * HTML elements that are allowed on Text * @default "p" */ tag?: AllowedTextTags /** * Allowed text variants */ variant: TextVariants color?: AllowedTextColors } /** * {@link https://cultureamp.atlassian.net/wiki/spaces/DesignSystem/pages/3074885298/Typography#Paragraph Guidance} * {@link https://cultureamp.design/?path=/docs/components-typography-text--body Storybook} */ export const Text = ({ children, tag, variant, color = 'dark', classNameOverride, ...restProps }: TextProps): JSX.Element => { const className = classnames(styles.text, styles[variant], styles[color], classNameOverride) return createElement(tag ?? 'p', { ...restProps, className }, children) } Text.displayName = 'Text'