Вёрстка современных интерфейсов: опыт использования Shadcn/UI
Сталкивались с тем, что готовый UI-kit не вписывается в дизайн, а кастомизация превращается в переопределение стилей через !important? Material UI и Chakra UI добавляют тонны неиспользуемого кода, а SSR-поддержка требует отдельной настройки. Shadcn/UI решает эту проблему иначе: он не библиотека, а коллекция копируемых компонентов на Radix UI и Tailwind CSS. Весь код попадает в ваш репозиторий — вы контролируете каждый пиксель.
Наша команда внедряет Shadcn/UI с момента его выхода. За это время реализовали более 50 решений: от админ-панелей до лендингов с высокой конверсией. Один из клиентов, перейдя с Material UI, сэкономил около $1.4k–1.9k. на переписывании кода — Shadcn/UI оказался в три раза легче по размеру бандла и не требовал дополнительных настроек для SSR. В другом проекте удалось сократить время разработки на 2 недели, что сэкономило $720–1k. на трудозатратах.
Почему Shadcn/UI быстрее других UI-библиотек?
Главная проблема больших UI-фреймворков — избыточность. Вы тянете 100+ компонентов, а используете 5-10. Shadcn/UI работает иначе: вы устанавливаете только то, что нужно. Это снижает размер bundle на 30–40% и улучшает Core Web Vitals — LCP падает на 15-20% по сравнению с Material UI. Доступность встроена в каждый компонент благодаря Radix UI, поэтому вам не нужно беспокоиться о ARIA-атрибутах.
Вторая проблема — кастомизация. В Shadcn/UI нет оверрайдов: вы правите исходный код компонента. Хотите сделать кнопку с градиентом? Добавьте строку в variant-объект. Нужна нестандартная типографика? Поменяйте CSS-переменные. При этом базовая доступность (ARIA-атрибуты, фокус, клавиатурная навигация) уже вшита.
Третья — тёмная тема. В Shadcn/UI она реализована через CSS-переменные: переключение класса dark на корневом элементе автоматически меняет цвета. Никаких дополнительных провайдеров или стилей.
| Критерий | Shadcn/UI | Material UI | Chakra UI |
|---|---|---|---|
| Размер bundle (минимальный) | 5-10 KB | 50+ KB | 20+ KB |
| Контроль кода | Полный | Через props/sx | Через props |
| SSR-поддержка | Из коробки | Отдельная настройка | Из коробки |
| Тёмная тема | CSS-переменные | ThemeProvider | ColorModeScript |
| Доступность (ARIA) | Встроена (Radix) | Частично | Встроена |
Как кастомизировать компоненты без потери обновлений?
Рассмотрим типовой кейс: лендинг для SaaS-продукта на Next.js 14 с TypeScript и Tailwind. Мы начинаем с инициализации Shadcn/UI:
npx shadcn@latest init CLI запрашивает стиль (default/new-york), базовый цвет и алиасы. Конфигурация записывается в components.json:
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "new-york",
"rsc": true,
"tsx": true,
"tailwind": {
"config": "tailwind.config.ts",
"css": "src/styles/globals.css",
"baseColor": "slate",
"cssVariables": true
},
"aliases": {
"components": "@/components",
"utils": "@/lib/utils"
}
}Дальше добавляем нужные компоненты: button, card, dialog, input, form. Каждый файл появляется в components/ui/. Например, диалог с формой:
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog';
import { Button } from '@/components/ui/button';
const ContactDialog = () => (
<Dialog>
<DialogTrigger asChild>
<Button>Связаться</Button>
</DialogTrigger>
<DialogContent>
<DialogHeader>
<DialogTitle>Оставьте заявку</DialogTitle>
</DialogHeader>
<form className="flex flex-col gap-4">
<input name="name" placeholder="Ваше имя" />
<input name="email" type="email" placeholder="Email" />
<Button type="submit">Отправить</Button>
</form>
</DialogContent>
</Dialog>
);Кастомизация не требует переопределений: добавить новый вариант кнопки — правим button.tsx:
const buttonVariants = cva(
'inline-flex items-center justify-center ...',
{
variants: {
variant: {
default: '...',
gradient: 'bg-gradient-to-r from-blue-600 to-purple-600 text-white hover:opacity-90',
},
},
},
);
Процесс работы над проектом
- Аналитика (1-2 дня): изучаем макеты, выделяем повторяющиеся UI-блоки, определяем необходимые компоненты.
- Проектирование (1 день): настраиваем тему (цвета, типографику, анимации), создаём базовый layout.
- Реализация (2-4 дня): интегрируем компоненты, адаптируем под дизайн, проверяем состояние загрузки/ошибки/пустые данные.
- Тестирование (1 день): проверяем доступность (скринридеры, клавиатура), адаптивность, производительность (Lighthouse 90+).
- Деплой (0.5 дня): настраиваем сборку, кеширование, подключаем аналитику.
Что входит в работу
- Исходный код всех компонентов с TypeScript и JSDoc.
- Файл
globals.cssс корректными CSS-переменными под ваш бренд. - Адаптивная вёрстка (mobile-first) с breakpoints.
- Тёмная тема (если нужно).
- Краткая документация: как добавить новый компонент, как обновить через
npx shadcn diff. - Обучение вашей команды (1 час созвон) — расскажем про best practices.
- Поддержка в течение 2 недель после сдачи.
Сроки и стоимость
| Тип проекта | Срок |
|---|---|
| Лендинг (до 5 блоков) | от 3 дней |
| Многостраничный сайт (10-15 страниц) | от 7 дней |
| Админ-панель (с формами, таблицами, графиками) | от 14 дней |
Стоимость рассчитывается индивидуально — зависит от количества компонентов и сложности кастомизации. Оценка занимает не более 24 часов. Закажите вёрстку на Shadcn/UI — мы гарантируем код без ошибок hydration, 100% соответствие макету и прохождение Core Web Vitals. Свяжитесь с нами, чтобы обсудить ваш проект — вернёмся с ответом в течение 24 часов.







