Урок 17. Домашнее задание: проект на shadcn/ui
⚡ Кратко
Подключить 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>