Урок 15. Справочник: пакеты и директивы

📁 Раздел: Организация кода ⏱️ Время изучения: ~55 мин 🎯 Сложность: Средняя

⚡ Кратко

clsx — условные классы, tailwind-merge — конфликты, cva — варианты, @utility — своя утилита.

Пакеты

ПакетЗачемУстановка
clsxсклеить классы по условиюnpm i clsx
tailwind-mergeубрать конфликтующие утилитыnpm i tailwind-merge
class-variance-authorityварианты и размеры компонентаnpm i class-variance-authority
prettier-plugin-tailwindcssсортировка классовnpm i -D prettier-plugin-tailwindcss
npm install clsx tailwind-merge class-variance-authority

Функция cn

// src/lib/utils.ts
import { clsx, type ClassValue } from "clsx"
import { twMerge } from "tailwind-merge"

export function cn(...inputs: ClassValue[]) {
  return twMerge(clsx(inputs))
}
ВызовРезультат
cn("p-4", "p-6")"p-6"
cn("p-4", false && "p-6")"p-4"
cn("bg-white", isDark && "bg-slate-900")зависит от условия
cn("px-4 py-2", className)внешние классы побеждают

cva: структура описания

const variants = cva(
  "базовые классы",              // применяются всегда
  {
    variants: {
      variant: { default: "…", outline: "…" },
      size:    { sm: "…", md: "…", lg: "…" },
    },
    compoundVariants: [           // сочетание условий
      { variant: "outline", size: "sm", class: "border-2" },
    ],
    defaultVariants: { variant: "default", size: "md" },
  }
)
ПолеНазначение
первый аргументклассы, общие для всех вариантов
variantsнаборы взаимоисключающих значений
compoundVariantsправила для сочетаний
defaultVariantsзначения по умолчанию
VariantProps<typeof variants>типы пропсов для TypeScript

Директивы CSS

ДирективаКогда применять
@utility имя { … }своя утилита, работающая с вариантами
@apply …только для чужой разметки и базовых стилей
@layer base { … }стили тегов: body, ссылки, заголовки
@layer components { … }класс, который утилиты должны уметь перебивать
@custom-variant имя (…)свой модификатор
/* src/index.css */
@import "tailwindcss";

/* своя утилита: работает с вариантами, как встроенные */
@utility scrollbar-thin {
  scrollbar-width: thin;
  scrollbar-color: var(--color-slate-400) transparent;
}

Сортировка классов

// .prettierrc
{
  "plugins": ["prettier-plugin-tailwindcss"],
  "tailwindStylesheet": "./src/index.css"
}
⚠️ Проверить по документации: имя опции, указывающей плагину на ваш CSS-файл с темой, зависит от версии плагина — сверьтесь с README пакета.