'use client' import { createElement, forwardRef } from 'react' import classNames from 'classnames' import { getMarginStyles, splitByMarginProps } from '~/src/types/props-helpers' import { colorTokenCssVar } from '~/src/utils/style' import { isNumber } from '~/src/utils/type' import { type TextProps } from './Text.types' import styles from './Text.module.scss' /** * `Text` is a component for representing the typography of a design system. * @example * * ```tsx * * Hello, Channel! * * ``` */ export const Text = forwardRef( function Text(props, forwardedRef) { const [marginProps, marginRest] = splitByMarginProps(props) const marginStyles = getMarginStyles(marginProps) const { children, style, className, as = 'span', typo = '15', color, bold, italic, truncated, align, ...rest } = marginRest const isMultiLineTruncated = isNumber(truncated) && truncated >= 1 return createElement( as, { ref: forwardedRef, style: { '--b-text-color': colorTokenCssVar(color), '--b-text-line-clamp': isMultiLineTruncated ? truncated : undefined, ...marginStyles.style, ...style, }, className: classNames( styles.Text, styles[`typo-${typo}`], bold && styles.bold, italic && styles.italic, truncated === true ? styles.truncated : isMultiLineTruncated && styles['multi-line-truncated'], align && styles[`align-${align}`], marginStyles.className, className ), 'data-testid': 'bezier-text', ...rest, }, children ) } )