Design System v2.0
Golova

Единая система для SaaS-продукта Golova и всей экосистемы связанных продуктов. Три уровня токенов — примитивы → семантика → компоненты — так изменения палитры не ломают компоненты, собранные поверх неё.

Структура: css/tokens.css — примитивы и семантические токены (цвет, шрифты, отступы, радиусы, тени), css/components.css — компоненты поверх токенов, включая полный набор форм. fonts/ и logos/ — фирменные ассеты. Шрифты: Roboto Flex — весь UI-текст, PragmataPro — только логотип и декоративные акценты.

Бренд

Философия дизайна

Golova — профессиональная B2B SaaS-платформа для компаний, занимающихся арендой AV-оборудования и техническим обеспечением мероприятий. Каждый экран должен в первую очередь помогать быстро выполнять ежедневные рабочие задачи.

Интерфейс должен ощущаться как

  • инженерный;
  • профессиональный;
  • насыщенный информацией;
  • спокойный и надежный;
  • ориентированный на ежедневную работу.

Избегаем

  • игрового или стартапного стиля;
  • больших карточек без необходимости;
  • градиентов и декоративных иллюстраций;
  • тяжелых теней;
  • чрезмерного количества пустого пространства.

Визуальный язык

  • минимализм и плоский интерфейс;
  • тонкие разделители вместо толстых рамок;
  • практически без теней;
  • скругления только там, где они нужны;
  • иерархия строится типографикой, а не цветами.
Интерфейс Golova должен напоминать современную ERP/CRM-систему, а не лендинг или BI-панель: много структурированной информации, спокойная плотность, понятные действия и минимум декоративного шума.
Основы

Цвет

Трёхуровневая модель: примитивы задают физические значения, семантика называет их по роли в интерфейсе, компоненты используют только семантику — никогда не примитивы напрямую.

Collection 1 · Primitive / Neutral

Базовая графитовая шкала. Шаги неравномерные (90→80→70→50→30→20→0) — так и задумано.

neutral/90#333333
neutral/80#727272
neutral/70#DADADA
neutral/50#E1E5EF
neutral/30#F0F2F7
neutral/20#F7F9FB
neutral/0#FFFFFF

Collection 2 · Primitive / Brand

Основные и их soft-варианты (10% opacity) для подложек.

Основные
brand/informative#4976F4
brand/positive#38B000
brand/error#E63A1E
Soft (10% opacity)
brand/informative-softrgba(73,118,244,.10)
brand/positive-softrgba(56,176,0,.10)
brand/error-softrgba(230,58,30,.10)

Collection 3 · Semantic

Роль → примитив. Компоненты ссылаются только на эти имена.

Text
text/primary→ neutral/90
text/secondary→ neutral/80
text/disabled→ neutral/70
text/inverse→ neutral/0
text/link→ brand/informative
text/error→ brand/error
text/success→ brand/positive
Background
bg/page→ neutral/20
bg/card→ neutral/0
bg/table-hover→ neutral/30
bg/selected→ brand/informative-soft
bg/error→ brand/error-soft
bg/success→ brand/positive-soft
Border
border/default→ neutral/50
border/strong→ neutral/70
border/focus→ brand/informative
border/error→ brand/error
Icon
icon/primary→ neutral/90
icon/secondary→ neutral/80
icon/disabled→ neutral/70
icon/informative→ brand/informative
icon/error→ brand/error
icon/success→ brand/positive
В присланной палитре нет отдельного warning/* токена — он нужен минимум для звезды рейтинга в карточке товара. Сейчас используется локальный placeholder #F5A623, не входящий в официальные коллекции. Стоит добавить brand/warning в Collection 2, когда будете расширять палитру.

Применение цветов

Как семантика ложится на конкретные UI-паттерны.

Текст

Основной текст neutral/90
Вторичный текст neutral/80
Disabled текст neutral/70

Фоны

Фон страницы neutral/20
Карточки / модалки neutral/0
Hover строк таблицы neutral/30

Границы

Обычная граница neutral/50
Активная граница brand/informative
Ошибка brand/error

Состояния

Выделенная строка informative-soft
Ошибка инпута error + error-soft
Успешное состояние positive + positive-soft

Кнопки

Primary фон 90, текст 0
Secondary фон 0, обводка 70
Danger фон error, текст 0
Основы

Темная тема

Темная версия строится тем же способом, что и светлая: примитивы → семантика → компоненты. Компоненты не получают отдельные dark-классы; меняются значения семантических токенов через .theme-dark или [data-theme="dark"].

Primitive / Dark Surface

Отдельная шкала темных поверхностей нужна, чтобы не ломать существующую neutral-шкалу.

dark/100#0F1114фон приложения
dark/90#15181Cглубокие поверхности
dark/80#1E2228карточки и модалки
dark/70#2A3038hover и разделители
dark/60#3A424Dактивные границы
dark/20#C9D0DDвторичный текст
dark/0#F7F9FBосновной текст

Semantic Mapping

Названия токенов не меняются между темами; меняются только значения.

Text

text/primarydark/0
text/secondarydark/20
text/disableddark/50

Background

bg/pagedark/100
bg/carddark/80
bg/table-hoverdark/70

Border

border/defaultdark/70
border/strongdark/60
border/focus#7FA0FF

State

bg/selectedinformative 18%
bg/errorerror 18%
bg/successpositive 18%

Рабочий экран в темной теме

Плотный B2B-интерфейс: минимум декора, видимые разделители, спокойная иерархия.

Позиция
Статус
Локация
Действие
Yamaha QL5В арендеПавильон 4
Shure ULXD4QРезервСклад A
Astera Titan TubeКомплектВыездная зона
✓ Так делаем

Темная тема меняет только semantic/component tokens. Разметка компонента остается такой же, как в светлой теме.

✗ Так не делаем

Не создаем отдельные классы вроде .button-dark и не хардкодим цвета в компонентах.

Основы

Типографика

Roboto Flex — весь интерфейсный текст (переменный шрифт, гибкие насыщенности). PragmataPro — только логотип и декоративные акценты, не для чтения.

UI / Body — Roboto Flex
Audiotechnik Y8
Roboto Flex, 400–700 (variable)
Весь интерфейс: заголовки, подзаголовки, тело, формы, кнопки, таблицы.
Display / Logo — Mono
golova.system
PragmataPro Mono, Regular (400)
Логотип, hero-заголовки, декоративные акценты. Точечно — не тело текста.
Display
32/40 · 700
Найдите нужное решение
H1
24/32 · 700
Заголовок раздела
H2
18/26 · 600
Подзаголовок
Body
14/20 · 400
Обычный текст интерфейса
Body Bold
14/20 · 700
Акцентный текст
Caption
12/16 · 500
Подпись, мета-информация
Eyebrow
11/14 · 700, upper
Категория
Основы

Отступы

Шкала на базе 4px.

4 · sp-1
8 · sp-2
12 · sp-3
16 · sp-4
24 · sp-6
32 · sp-8
56 · sp-14
64 · sp-16
Основы

Скругления

Система в целом угловатая. Формы — самые острые: 4px флэт, без исключений (кроме переключателя-свитча — он физическая пилюля по смыслу).

4 · form — все поля форм
6 · sm — чипы, теги
8 · md — кнопки, поповеры
12 · lg — карточки, панели
16 · xl — модалки
pill — только switch-track
Основы

Тени

Незаметны в покое, раскрываются на интерактиве. Focus/error-ring — отдельные токены для полей форм.

rest
card
float
focus-ring
error-ring
Компоненты

Кнопки

Один компонент .btn, собираемый из вариантов, размеров и состояний. Иконки — Bootstrap Icons (MIT, свободная лицензия), подключены как иконный шрифт: класс bi bi-*.

Варианты .btn-primary / -secondary / -informative / -danger / -ghost / -link

Primary — одна на экран, для главного действия. Secondary — для второстепенного рядом с primary. Danger — необратимые/разрушающие действия. Ghost — низкоприоритетные действия в тулбарах. Link — действие, встроенное в текст.

<button class="btn btn-md btn-primary">
  <i class="bi bi-plus-lg"></i>
  Создать
</button>
Размеры .btn-sm / .btn-md / .btn-lg
Состояния hover / focus / active — интерактивны, наведите и нажмите
С иконками bi bi-* ведущая / замыкающая / только иконка

У icon-only кнопок обязателен aria-label — своей подписи у них нет.

Круглые иконочные кнопки .btn-round — тулбары, действия над таблицей, FAB

Круглая форма — только для плотных тулбаров над таблицами/деревьями (действия с выбранными, параметры, сворачивание уровней) и для одиночного FAB-действия «добавить». Обычные действия в интерфейсе — квадратные .btn-icon-only выше.

Группа кнопок .btn-group — сегментированный переключатель
Компоненты

Бейджи и теги

Информативный Нейтральный Тёмный 💡 Категория Активно
Компоненты

Табы

<div class="tabs">
  <button class="tab active">Все</button>
  <button class="tab">В аренде</button>
  <button class="tab">Резерв</button>
</div>
Компоненты

Формы

Полный набор форм-компонентов на базе переменных Golova. Все контролы — 4px радиус (--radius-form), фокус — рамка border/focus + мягкое кольцо shadow-focus-ring, ошибка — border/error + shadow-error-ring.

Text input .field / .ctrl
Как в учредительных документах
⚠ Должно быть 10 или 12 цифр
✓ Промокод применён
🔍
<label class="field">
  <span class="field-label">Название компании <span class="req">*</span></span>
  <input class="ctrl" type="text" placeholder="ООО Ромашка">
  <span class="field-hint">Юридическое или рабочее название клиента.</span>
</label>
Textarea .ctrl (textarea)
Select select.ctrl
Checkbox / Radio / Switch
Checkbox
Radio
Switch
Fieldset + form actions
Контактное лицо
Компоненты

Модалки

Три сценария под самые частые действия у сложных таблиц/деревьев: форма-редактор строки, подтверждение удаления, настройка видимости колонок. Структура одинаковая: заголовок с подписью и крестиком → тело (скроллится само, если контента много) → футер с действиями, прижатыми вправо.

Форма редактирования строки .modal → .modal-header / .modal-body / .modal-footer
<div class="modal">
  <div class="modal-header">
    <div>
      <h3>Редактировать позицию</h3>
      <p>Изменения применятся к текущей строке.</p>
    </div>
    <button class="btn btn-sm btn-icon-only btn-ghost modal-close" aria-label="Закрыть">
      <i class="bi bi-x-lg"></i>
    </button>
  </div>
  <div class="modal-body">...</div>
  <div class="modal-footer">
    <button class="btn btn-md btn-secondary">Отмена</button>
    <button class="btn btn-md btn-primary">Сохранить</button>
  </div>
</div>
Подтверждение удаления деструктивное действие — danger в футере
Настройка колонок таблицы для плотных таблиц/деревьев с параметрами
✓ Так делаем

Заголовок модалки — краткий, подпись под ним уточняет контекст (где именно мы редактируем). Крестик закрытия — всегда круглый ghost справа.

✗ Так не делаем

Не ставим danger-действие первым/слева в футере — порядок всегда: второстепенное слева, главное (в т.ч. деструктивное) справа.

Компоненты

Карточка товара

Продажа
фото товара
Audiotechnik Y8 Line Array
88 500 ₽
Light sound lab · 4.8 (12)
📍 Москва, Московская область
Продажа б/у
фото товара
ADJ Mega Par Profile
8 500 ₽ Комплект
Light sound lab · 4.8 (12)
📍 Москва, Московская область
<article class="pcard">
  <div class="img">
    <span class="badge badge-neutral">Продажа б/у</span>
    <div class="fav">♥</div>
    фото товара
  </div>
  <div class="body">
    <h3 class="title">Акустическая система Yamaha DXR12</h3>
    <p class="price">8 500 ₽ <span class="kit-flag"><i></i>Комплект</span></p>
    <div class="seller"><span class="star">★</span> 4.9 · Pro Sound</div>
    <div class="loc">Москва · самовывоз</div>
    <button class="cta">Подробнее</button>
  </div>
</article>
Гайдлайны

Developer Handoff

Этот раздел нужен разработчикам и ИИ-агентам, которые собирают прототипы или переносят паттерны в продукт. Источник истины остается в токенах, компонентах и правилах витрины.

Runtime CSS

css/tokens.css и css/components.css подключаются напрямую в HTML-прототип.

Machine Tokens

tokens.json можно читать агентам, скриптам, Figma-плагинам и будущему экспорту токенов.

AI Instructions

AI_USAGE.md — короткий контракт для Claude Code, Codex и других агентов.

Copy Snippets

Базовые HTML-snippets лежат рядом с кнопками, табами, формами, модалками и карточкой товара.

Где взять файлы

Разработчик или ИИ-агент может взять файлы из репозитория или скачать прямо из этой статической витрины.

Repository

GitHubgithub.com/ulyru/design-system

Downloads

Работает при открытии через static server или из репозитория.

Минимальный prompt для ИИ-агента

Можно вставить в Claude Code перед созданием прототипа Golova.

Перед началом прочитай AI_USAGE.md, tokens.json, css/tokens.css и css/components.css.
Собери прототип Golova как плотный B2B SaaS/ERP экран.
Используй существующие CSS variables и component classes.
Не хардкодь цвета, не делай лендинг, не используй градиенты и декоративные иллюстрации.
Поддержи светлую и темную тему через data-theme="dark".
Гайдлайны

Как использовать

✓ Так делаем

Компоненты ссылаются только на семантические токены (text/*, bg/*...), никогда напрямую на neutral/* или brand/*.

✗ Так не делаем

Не хардкодим hex в компонентах и не создаём новые цвета «по ощущению» — сначала примитив, потом семантика.

✓ Так делаем

Все поля форм — 4px радиус, без исключений. Это единообразный, узнаваемо угловатый язык форм.

✗ Так не делаем

Не скругляем формы под общий radius-lg карточек — формы концептуально более острые, чем контейнеры.