Дизайн-система за 60 секунд

Разработчик лежал с температурой. Питч – через 10 часов. Денег на фрилансера не было.

Воскресенье, 21:15. Съёмная двушка на окраине.

Дима влетел на кухню с телефоном в руке и выражением лица человека, который только что выиграл в лотерею и одновременно потерял билет:

«Нам дали слот. Завтра утром. Серьёзный инвестор, выход через общего знакомого. Хочет живое демо, не слайды. Говорит – если понравится, разговор сразу предметный»

Несколькими днями ранее

Нас было трое и мы начинали работать над нашим ПРОЕКТОМ. Дима – визионер, который умел объяснять сложное так, что хотелось немедленно инвестировать. Лёша – бэк-разработчик, который уже деплоил железобетонный код, пока другие только спорили о стеке. И я – продуктовый дизайнер и «мамкин программист».

В редких перерывах между макетами и основной работой я жадно читал всё что касалось разработки и нейросетей. И усиленно тренировал свой вайбкодинг в VSCode с AI-агентом Kilo Code и нейросеткой DeepSeek.

Первым действующим и полезным проектом оказался Component Lab – одностраничное React-приложение с 12 ui-китами и дизайн системами. Возможность посмотреть как выглядят и действуют инпуты, кнопки и селекты оказалась неожиданной востребованной в повседневной работе.

Была собрана небольшая база данных в NotebookLM по дизайн-системам, токенизации, Kilo code. В общем, мы готовились.

Воскресенье, 22:40. Там же

Я решил сделать всё по стандартам свое компании, где я работал. Собрал ui-кит в Figma, настроил два уровня переменных: примитивные и семантические цвета, и добавил стандартные стили текста. Загнать в переменные можно было ещё многое, но времени не оставалось. Плагин Tokens Studio for Figma дал мне enterprise-ready JSON.

Вот тут и началась основная работа. Заказчик оказался очень требовательным и критерии приемки у нас были четко определены.

  • Проверка доступности интерфейсов (a11y/accessibility testing)
    Инвестор хотел видеть «зелёный» цвет на двух независимых источниках аудита.
  • «Фактор автобуса» или «фактор кирпича» ≠ 1
    За час до презентации, на компьютере заказчика нужно было подготовить проект для показа. Допускались любые правки «на лету»: цвет, шрифт, размер. Деплоили также с компьютера заказчика.
  • Только живой код
    Любая заявленная фича и опция должна была быть в коде. Никаких картинок, презентаций и прочих видосиков.

О проекте

Всё крутится вокруг единого пайплайна дизайн-токенов – это означает, что все цвета, размеры, типографика и темы сначала задаются в Figma, а затем автоматически попадают в код без ручного копирования. Источником истины выступает tokens.json, который экспортируется из Figma Tokens – инструмента для хранения дизайн-токенов прямо в дизайн-системе. Все токены делятся на два уровня: примитивы (например, конкретные цвета или размеры) и семантические токены (text, surface, border), которые описывают уже не цвет, а его назначение в интерфейсе. Благодаря этому можно быстро менять темы, редизайнить интерфейс или поддерживать светлую и тёмную темы без переписывания компонентов.

Далее специальный скрипт автоматически обрабатывает токены через Style Dictionary – инструмент, который превращает дизайн-данные в готовые CSS-переменные и TypeScript-типы. В итоге дизайн и разработка работают через единую систему, где изменения в Figma могут автоматически отражаться в интерфейсе.

Сами компоненты собраны на React – популярной библиотеке для создания интерфейсов из независимых переиспользуемых блоков. Для стилей используются CSS Modules, которые помогают изолировать стили компонентов друг от друга и избегать конфликтов в больших проектах. Все компоненты используют CSS-переменные (--ds-*), поэтому темы переключаются буквально через смену одного data-theme атрибута. Разработка и документация компонентов происходят в Storybook – это отдельная среда, где можно просматривать компоненты, их состояния и сценарии использования без запуска основного приложения. Для удобства разработки используется Vite – быстрый сборщик, который мгновенно обновляет интерфейс при изменениях в коде. Отдельное внимание уделено accessibility (a11y): компоненты поддерживают aria-* атрибуты, корректно работают с ошибками, фокусом и экранными считывателями, а Storybook-addon-a11y помогает автоматически находить проблемы доступности ещё во время разработки. Качество интерфейса контролируется через Vitest и Playwright для тестирования поведения компонентов, а Chromatic автоматически проверяет визуальные изменения и помогает избежать случайных UI-регрессий при обновлениях дизайн-системы.

Понедельник, 05:30

Кто деплоил свой вайбкод – тот подружился с Ктулху.

Монитор дышал тусклым синим светом, будто в глубине матрицы медленно открывался чей-то огромный глаз. Лёша давно уснул прямо на полу среди кабелей и пустых банок из-под энергетиков. Дима ходил кругами по комнате и повторял одно и то же:

– Главное, чтобы токены пересобрались. Главное, чтобы темы не поехали.

А я смотрел в tokens.json.

Дизайн-система за 60 секунд

Сначала казалось, что это обычная ошибка. Один из семантических токенов ссылался сам на себя. Потом – на родительский namespace. Потом ещё глубже. Style Dictionary продолжал сборку, словно ничего не происходило. CPU выл. Vite перегружал компоненты десятки раз в секунду. И где-то между --ds-surface-brand-color-hover и --ds-text-inversed-static-color структура начала расти сама.

В generated CSS появились переменные, которых не было в Figma. Не было в git. Не было придумано человеком.

--ds-surface-flesh-pale-color --ds-border-mouth-active-color --ds-text-observer-disabled

Они компилировались без ошибок.

Когда я открыл Storybook, новые токены уже использовались компонентами. Кнопки слегка пульсировали, будто под CSS скрывалось что-то живое. Hover-состояния менялись каждый раз при обновлении страницы. Input в dark theme внезапно показывал focus ring ещё до наведения курсора. А в панели accessibility addon появилась новая запись:

non-human interaction pattern recognized

Потом мы заметили главное.

Chromatic больше не сравнивал скриншоты. Он принимал все изменения автоматически. Любые. Даже те, которых не было в коммите. Git history начал содержать хэши несуществующих файлов. А в tokens.d.ts появился тип, который TypeScript не мог распарсить, но и удалить его было невозможно:

typeTheme='light'|'dark'|'system'|'observer';

И самое страшное – приложение работало идеально. Ровно до того момента, пока Дима не сказал:

– Слушайте… а почему Storybook открыт на моем ноутбуке?

Мы молча посмотрели друг на друга. Ноутбук Димы ещё даже не включали.

А потом, конечно, оказалось, что никакой мистики не было – просто в три ночи продуктовый дизайнер, который «немного знает React», одновременно правил токены руками прямо в JSON, просил AI «только не ломать архитектуру», гонял build:tokens в watch-режиме, держал открытыми два Storybook-инстанса, случайно закоммитил generated-файлы, а Chromatic вообще был настроен с autoAcceptChanges: true, так что половина необъяснимого ужаса оказалась циклическими ссылками в токенах, HMR-глюками Vite, рассинхроном тем, кешем Storybook и тем особым состоянием мозга в четыре утра, когда тебе начинает казаться, что aria-* атрибуты смотрят на тебя в ответ; хотя тип 'observer' в tokens.d.ts мы потом всё-таки нашли – и вот его действительно никто не добавлял.

Понедельник и далее

Можно ещё долго писать про тонкости настройки Kilo code. Ведь Kilo Code – это как маленькая IT-империя в VS Code: Agent – мозг и характер вайбкод-шамана, Rules – суровый уголовный кодекс проекта («никаких raw colors, смертная казнь через refactor»), Skills – спецприёмы и свитки заклинаний для конкретных задач, AGENTS.md – древняя летопись с лором, архитектурой и травмами прошлых рефакторов, а kilo.jsonc — вся проводка этого киберпанк-зоопарка, где решается кто кого вызывает, что подключено и почему всё это пока ещё не взорвалось. И ещё много всего.

Но пора закругляться.

Встреча с инвестором прошла успешно – правда, не для всей команды (привет, Дима (◣_◢)). Проект остался на GitHub, зато наш лидер благодаря скорости, качеству работы и нашему умению не спать ночами получил от инвестора и новый проект, и должность. А мы? Мы получили кое-что не менее ценное – мощный опыт, новые знания и очередную IT-байку о том, как всё начиналось.

Дисклеймер: все персонажи вымышлены, совпадения случайны, лица изменены, названия скрыты, события не произошли, а вот всё остальное – чистая правда.

Начать дискуссию