Урок 17. Домашнее задание: проект на shadcn/ui

📁 Раздел: shadcn/ui ⏱️ Время изучения: ~50 мин 🎯 Сложность: Средняя

⚡ Кратко

Подключить shadcn/ui к проекту курса, добавить восемь базовых компонентов и перевести на них уже собранные страницы.

Задание

  • настроить алиас @/ и выполнить init;
  • добавить компоненты: button, card, input, label, badge, separator, skeleton, table;
  • заменить свои самодельные компоненты из урока 15 на компоненты реестра;
  • сравнить: что стало короче, что появилось нового (например, состояния aria-invalid и disabled уже описаны);
  • убедиться, что тёмная тема из урока 13 продолжает работать.

Подготовка окружения

cd tailwind-course
git status          # рабочее дерево должно быть чистым — будет много новых файлов
npm run dev
Сделайте коммит перед установкой. Тогда после init вы сможете спокойно посмотреть git diff и понять, что именно изменил CLI в вашем CSS.

Пошаговое решение

Шаг 1. Алиасы

📄 vite.config.ts
// vite.config.ts
import path from "path"
import tailwindcss from "@tailwindcss/vite"
import react from "@vitejs/plugin-react"
import { defineConfig } from "vite"

export default defineConfig({
  plugins: [react(), tailwindcss()],
  resolve: {
    alias: {
      "@": path.resolve(__dirname, "./src"),
    },
  },
})
📄 tsconfig.json
// tsconfig.json — и то же самое в tsconfig.app.json
{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/*"]
    }
  }
}

Продублируйте baseUrl и paths в tsconfig.app.json.

Шаг 2. Инициализация

npx shadcn@latest init

Прочитайте git diff src/index.css — там появятся токены темы. Сравните их с теми, что вы описывали вручную в уроке 13.

Шаг 3. Компоненты

npx shadcn@latest add button card input label badge separator skeleton table

Шаг 4. Замена

Удалите свои Button и Badge из урока 15, поправьте импорты. Сравните строки: у реестра вариантов больше, состояния описаны подробнее, но идея та же — cva плюс cn().

Как проверить

  • npm run dev запускается без ошибок импорта.
  • Кнопки и карточки оформлены темой, а не системными стилями.
  • Переключение темы по-прежнему меняет весь интерфейс.
  • В git status видно, какие файлы добавил CLI.

Ориентир

Badge Outline
<div class="space-y-3 rounded-xl bg-background p-4">
  <div class="flex flex-wrap items-center gap-2">
    <button class="inline-flex h-8 items-center justify-center rounded-lg bg-primary px-2.5 text-sm font-medium text-primary-foreground hover:bg-primary/80">Действие</button>
    <button class="inline-flex h-8 items-center justify-center rounded-lg border border-border bg-background px-2.5 text-sm font-medium hover:bg-muted">Вторично</button>
    <span class="inline-flex h-5 items-center rounded-4xl bg-primary px-2 text-xs font-medium text-primary-foreground">Badge</span>
    <span class="inline-flex h-5 items-center rounded-4xl border border-border px-2 text-xs font-medium text-foreground">Outline</span>
  </div>
  <div class="h-px bg-border"></div>
  <div class="space-y-2">
    <div class="h-4 w-1/3 animate-pulse rounded-md bg-muted"></div>
    <div class="h-4 animate-pulse rounded-md bg-muted"></div>
  </div>
</div>