import { ComponentType, createElement, HTMLAttributes } from 'react';
import { TStyle, useClassnames } from '../../../../hooks/use-classnames';
import { typographyColor } from '../types';
import style from '../index.module.pcss';
export const typographyTextTags = ['p', 'span', 'strong', 'a', 'b', 'i', 'em', 'legend'] as const;
export const typographyTextSize = ['large', 'large-bold', 'body', 'body-bold', 'caption', 'caption-bold'] as const;
export type TTypographyTextTags = typeof typographyTextTags[number];
export type TTypographyTextSizes = typeof typographyTextSize[number];
export type TTypographyTextColor = typeof typographyColor[number];
export type TProps<
Element = Omit, 'className'>,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
AdditionalProps = Record
> = Element & {
/**
* Параметр `className` используется для добавления пользовательских CSS классов к компоненту. Это позволяет настраивать внешний вид компонента с помощью пользовательских стилей.
*/
readonly className?: TStyle | string,
/**
* Параметр `presetSize` используется для задания размера текста из заранее установленного списка
*/
readonly presetSize?: TTypographyTextSizes,
/**
* Параметр `tagName` используется для задания тэга или компонента, который будет рендериться
*/
// eslint-disable-next-line @typescript-eslint/no-explicit-any
readonly tagName?: TTypographyTextTags | ComponentType,
/**
* Параметр `presetColor` используется для задания цвета текста из заранее установленного списка
*/
readonly presetColor?: TTypographyTextColor,
/**
* Параметр `componentProps` используется для пробрасывания пропсов в кастомный компонент из свойства `tagName`
*/
readonly componentProps?: AdditionalProps
};
export const Text = ({
presetSize = 'body',
presetColor = 'basic',
tagName = 'p',
className,
...props
}: TProps) => {
const cn = useClassnames(style, className, true);
const textClassName = cn('typography', {
[`typography_size-${presetSize}`]: presetSize,
[`typography_color-${presetColor}`]: presetColor,
'typography_no-spacing': typeof tagName === 'string'
});
if(typeof tagName === 'string') {
return createElement(tagName, {
...props,
className: textClassName
});
}
return createElement(tagName, {
...props.componentProps,
children: props.children,
className: textClassName
});
};