--- description: Frontend — ТОЛЬКО shadcn/ui docs (Components, Blocks, Installation); best practices, CLI-first globs: apps/web/**/*,packages/ui/**/* alwaysApply: false --- # Frontend — shadcn/ui (обязательно) **Источник истины — MCP shadcn + официальная документация.** Не выдумывать UI, не писать кастомный CSS, не обходить MCP и CLI. Monorepo layout — [`frontend-monorepo.mdc`](frontend-monorepo.mdc). MCP workflow — [`shadcn-mcp.mdc`](shadcn-mcp.mdc). | Документ | URL | |----------|-----| | **Components** | https://ui.shadcn.com/docs/components | | **Blocks** | https://ui.shadcn.com/blocks | | **Installation** | https://ui.shadcn.com/docs/installation | | **Monorepo** | https://ui.shadcn.com/docs/monorepo | | **Theming** | https://ui.shadcn.com/docs/theming | | **Dark Mode** | https://ui.shadcn.com/docs/dark-mode | | **Forms (RHF)** | https://ui.shadcn.com/docs/forms/react-hook-form | ## Шаг 0 — перед любым UI-кодом 1. **MCP `plugin-shadcn-shadcn`:** `search_items_in_registries` → `get_item_examples_from_registries` → `get_add_command_for_items` ([`shadcn-mcp.mdc`](shadcn-mcp.mdc)) 2. Открыть **Components** или **Blocks** — найти готовое решение 3. `cd apps/web && pnpm dlx shadcn@latest docs ` — API и примеры 4. `cd apps/web && pnpm dlx shadcn@latest search "@shadcn/"` — если MCP не дал результат 5. Только потом писать код **Новая страница** → сначала [Blocks](https://ui.shadcn.com/blocks), потом `pnpm dlx shadcn@latest add `. ## Шаг 1 — CLI (обязательно) ```bash cd apps/web pnpm dlx shadcn@latest add table select badge card field input button ... pnpm dlx shadcn@latest add sidebar-07 # layout pnpm dlx shadcn@latest add dashboard-01 # dashboard pnpm dlx shadcn@latest add login-03 # auth pnpm dlx shadcn@latest apply b2fA --only theme -y # тема — ТОЛЬКО так ``` - Копипаст с сайта **без** CLI — запрещено - `packages/ui/src/components/*` — только registry; domain-логика → `apps/web/src/components/.tsx` ## Шаг 2 — композиция (best practices) ### Приоритет 1. Установленный `@cfdm/ui/components/*` 2. Block из registry (адаптация под TanStack Router) 3. Shared проекта: `PageHeader`, `StatusBadge`, `ResourceList`, `DataTableCard` 4. Domain-обёртка — последний уровень кастомизации ### Запрещено | ❌ | ✅ из [Components](https://ui.shadcn.com/docs/components) | |----|-----------------------------------------------------------| | ``, ` ``` ### Card `CardHeader` / `CardTitle` / `CardDescription` / `CardContent` / `CardFooter` — полная композиция из docs. ### Таблицы `Table`, `TableHeader`, `TableBody`, `TableRow`, `TableHead`, `TableCell` — из docs. Сложная таблица → [Data Table](https://ui.shadcn.com/docs/components/data-table) + block `dashboard-01`. ### Графики `Chart` + `ChartContainer` + `chartConfig` с `var(--chart-1)` — не raw recharts без обёртки. ### Иконки в Button ```tsx ``` Без `size-4` на иконке внутри shadcn-компонента. ## Стек (не shadcn, но обязателен) TanStack Router + Query — [`vite-tanstack-frontend.mdc`](vite-tanstack-frontend.mdc). - Preset: **base-nova** + **neutral** — [`apps/web/components.json`](apps/web/components.json), [`packages/ui/components.json`](packages/ui/components.json) - `@base-ui/react` → `render` prop (не Radix `asChild`) - **Не Next.js** — нет Server Components, `'use client'` ## Эталоны проекта | Зона | Файл | Block | |------|------|-------| | Shell | `apps/web/src/components/layout/app-shell.tsx` | [sidebar-07](https://ui.shadcn.com/blocks) | | Login | `apps/web/src/routes/login.tsx` | [login-03](https://ui.shadcn.com/blocks) | | Dashboard | `apps/web/src/routes/_auth/index.tsx` | [dashboard-01](https://ui.shadcn.com/blocks) | | CRUD | `routes/_auth/services.tsx`, `domains/index.tsx` | Card + Field + Table | ## Структура файлов ``` apps/web/src/ components/ ← domain + layout + shared (blocks) routes/ ← страницы (композиция @cfdm/ui, без raw HTML) queries/ ← queryOptions (не inline в routes) lib/schemas.ts ← Zod для форм packages/ui/src/ components/ ← только CLI (не трогать под кейс) hooks/ ← registry hooks (use-mobile) lib/utils.ts ← cn() styles/globals.css ← только output shadcn CLI ``` ## Чеклист перед завершением задачи - [ ] MCP shadcn: search + examples (+ add command при новых примитивах) - [ ] Решение есть в https://ui.shadcn.com/docs/components или /blocks - [ ] Компоненты добавлены через `pnpm dlx shadcn@latest add` из `apps/web` - [ ] Нет кастомного CSS и raw HTML-примитивов - [ ] Semantic tokens, `variant`/`size` вместо переопределения className - [ ] UI-импорты через `@cfdm/ui/components/*` - [ ] `pnpm --filter web build` без ошибок ## Язык Ответы пользователю — русский. Commits — [`commit-messages-ru.mdc`](commit-messages-ru.mdc).