В моем css файле множество правил, содержание которых соответствует их названиям классов. Как я могу их сократить?

В моем react приложении есть общие компоненты типа Text, в которые я через props передаю параметры типа color и size. В зависимости от этих параметров я присваиваю возвращаемому компоненту класс (например color_gray-194 или size_12). В итоге в css файле компонента разрастается колбаса из похожих друг на друга классов с одним единственным правилом:

.color_black-10 {
    color: var(--black-10);
}
.color_gray-194 {
    color: var(--gray-194);
}
.color_gray-128 {
    color: var(--gray-128);
} ...

Какими средствами я могу сократить это? На ум приходят миксины, но я их затестил и, мне показалось, что они для моей задачи не совсем подходят. Хотелось бы увидеть что-то вроде такого

.color_(variable) {
   color: var(variable);
}

Прилагаю код компонента (tsx и css файлы), чтобы можно было видеть как сейчас работает вариативность пробрасываемых свойств

//index.tsx
type TextSize = '12' | '14' | '16' | '28';

type TextColor = 'black-10' | 'gray-194' | 'gray-128' | 'purple- 
106' | 'purple-69';

type Props = {
  children?: React.ReactNode,
  size?: TextSize,
  color?: TextColor,
  className?: string,
};

const Text = ({
  children,
  size = '14',
  color = 'black-10',
  className,
}: Props) => {
  const rootClassName = cx(
    className,
    `color_${color}`,
    `size_${size}`,
  );

  return (
    <p className={cn(rootClassName, styles.text)}>
      {children}
    </p>
  );};

export default Text;


//styles.module.css
.text {
    margin: 0;
    padding: 0;

    font-weight: 400;
}
.color_black-10 {
    color: var(--black-10);
}
.color_gray-194 {
    color: var(--gray-194);
}
.color_gray-128 {
    color: var(--gray-128);
}
.color_purple-106 {
    color: var(--purple-106);
}
.color_purple-69 {
    color: var(--purple-69);
}
.size_12 {
    font-size: 12px;
}
.size_14 {
    font-size: 14px;
}
.size_16 {
    font-size: 16px;
}
.size_28 {
    font-size: 28px;
}

Ответы (1 шт):

Автор решения: Евгений Шевцов

Вы немного мешаете css и js или создаете свой tailwind.

Или если конечно вам нужен такой подход (на рисовалку например), то тут другой вопрос. Не могли бы вы скинуть пример хотя бы одного компонента? А то не совсем понятно с чем боритесь?)

Если пока что дать рекомендации, то я бы сделал как в обще принятых ui библиотеках.

Передаешь пропсами

  • тему theme = primary | secondary | mute.
  • (если кнопка) - variant = 'outline' | 'underline | 'clear' а уже в самой компоненте, изолировано я бы мутил с цветами и прочими css свойствами
→ Ссылка