code6 · единая дизайн-система «Federal»

Как сделать code6?

Все наши сервисы живут в разных технологиях, но должны опознаваться как один продукт. Обеспечивается это не одинаковой вёрсткой, а общими именами токенов, одним шрифтом, одним набором иконок и едиными правилами применения.

Движение бренда

Экстренные огни и знак являются главными двигающимися символами. Паттерн вспышек повторяет настоящую мигалку: синяя сторона даёт две короткие вспышки, затем две даёт красная. Это не декоративный пульс, а узнаваемый ритм — он опознаётся боковым зрением и работает даже в четырёх пикселях высоты.

Полоса

Основной вариант огней. Ставится над шапкой, над первым экраном или разделителем перед важным блоком там, где нужно подчеркнуть причастность бренда.

На светлом

На чёрном — свечение сильнее

Пара точек

Компактный вариант для строки статуса, к которой нужно особое внимание: идёт ивент, трансляция в эфире. Рядом обязателен текст — сами по себе точки значения не несут.

В эфире · 1,028 зрителей

Бегущий отблеск

Брендовый индикатор первой загрузки поверхности, заставки или перехода между крупными разделами.

Фоновое свечение

Два размытых пятна по краям с анимацией-дыханием. Для первого экрана и пустых состояний. Под текстом допустимо только в таком виде: мягкое размытие и умеренная непрозрачность не мешают читать.

Здесь всё решают люди

Отбор проходит каждый

Появление логотипа

Логотип поднимается на восемь пикселей и проявляется, следом под ним включаются огни. Порядок важен: сначала знак, потом мигалка — иначе внимание уходит на движение, а не на бренд.

Знак в движении

Самый узнаваемый индикатор из возможных: это не абстрактное кольцо, а собственный знак. Применяется там, где спиннер выглядел бы безлико — первая загрузка поверхности, полноэкранное брендовое состояние, заставка, передача/получение служебных данных.

Размер

20 · 28 · 40

Движение

Сигнал

Индикатор процесса. Вариант по умолчанию

Дыхание

Заставки и загрузка медиа

Мигалка

Только ивенты и эфиры

В строке

Загружаем данные

Знак в строке ставится размером 20 px: это совпадает с межстрочным интервалом основного текста, и строка не увеличивается в высоте.

Правила

Главное ограничение. Красный означает ошибку или отказ. Мигающий красный рядом с формой или статусом будет прочитан как ошибка, поэтому движение бренда живёт только в брендовых контекстах и не появляется в одном экране со статусными элементами.
Правило Значение
Частота Не более 2.5 вспышек в секунду
Порядок цвета Синий ведёт, красный отвечает. Обратный порядок не применяется ни в одном варианте
Количество Один анимированный элемент бренда на экран. Огни и знак рядом не сочетаются
Свойства анимации У знака меняется только непрозрачность половин, геометрия неподвижна. У логотипа допустимы opacity, translate и равномерный scale
Под текстом Только фоновое свечение
Сигнал Индикатор процесса: первая загрузка, запрос, ожидание ответа. Вариант знака по умолчанию
Дыхание Заставки и пустые состояния. В шапку не ставится: медленно пульсирующий логотип читается как незавершённая загрузка
Мигалка Только событие и эфир, не постоянным элементом интерфейса
Доступность aria-hidden="true" и role="presentation". Смысл несёт текст, не анимация

Где применяется

Где не применяется

Маскот

Кодик отвечает за дружелюбные состояния: пустые экраны, приветствия, ожидание, подсказки и мягкие ошибки без вины пользователя. Версии не закреплены за типами экранов — это варианты для событий и соответсвующего тона.

Маскот Кодик

Спокойное парение

Маскот Кодик в очках

Ускоренное парение

Пример состояния

Страница не найдена

Даже нюх Кодика не помог её отыскать. Вернуться на главную?

Правила

Правило Значение
Маскот и логотип Кодик логотип не заменяет и рядом с ним в одной связке не ставится
Очки Версия в очках — для успешных событий и советующего тона. Обычная версия базовая
Где маскота нет Экраны отказа, истечения срока и блокировки. Там тон сухой, и милый персонаж читается как насмешка
Количество Один маскот на экран. Минимальный размер 64 px

Цвет

Бренд

Четыре цвета. Чёрный и белый являются основными, синий отвечает за действия, красный — за акцент и предупреждение.

Чёрный

--c6ColorBlack · #0F0F0F

Белый

--c6ColorWhite · #FFFFFF

Синий

--c6ColorBlue · #1B6FE0

Красный

--c6ColorRed · #C8102E

Действия и статусы

Синий связан с действием, переходом или активным процессом. Статусы описывают результат или состояние: единая палитра имеет единый смысл на всех поверхностях.

Токен Светлая Тёмная Значение
--c6ActionFill
#1B6FE0
#4A93FF
Главное действие, активный выбор, заполнение прогресса
--c6ActionInk
#1560C8
#6BA7FF
Ссылки и текстовые действия
--c6StatusWaiting
#B8791A
#E0A33C
Ожидание, срок на исходе, ресурс заканчивается
--c6StatusSuccess
#037A58
#1FC08E
Одобрено, пройдено, успешно, набор открыт
--c6StatusDanger
#C8102E
#FF6B75
Ошибка, отказ, блокировка
--c6StatusPro
#7A3EA1
#B98AE0
Платные механики: приоритет, объединения, эксклюзивные функции
Фиолетовый нигде больше не появляется. Именно поэтому он опознаётся мгновенно: увидел фиолетовое — это про платные механики.
Инвертированный элемент меняет местами текст и поверхность. Если фон взят из --c6TextPrimary, цветом текста становится --c6SurfaceRaised — и никак иначе. Токен --c6TextOnInverse здесь не подходит: он про тёмную плашку подвала, которая тёмная в обеих схемах, поэтому в тёмной схеме даст белое по белому.
Заливка и текст разведены. --c6ActionFill — для кнопок, активных переключателей и прогресса. --c6ActionInk — для ссылок и текстовых действий.

Поверхности и текст

Токен Светлая Тёмная Назначение
--c6SurfaceCanvas
#F1F3F7
#131A24
Полотно страницы
--c6SurfaceRaised
#FFFFFF
#1A2130
Карточки и панели: всегда светлее полотна
--c6SurfaceSunken
#F7F8FC
#141B25
Поля ввода, блоки кода
--c6SurfaceInverse
#212936
#0C1119
Подвал, плашки медиа
--c6TextPrimary
#212936
#E8ECF3
Заголовки и основной текст
--c6TextSecondary
#5C6377
#A2ACBD
Абзацы и описания
--c6TextFaint
#667085
#8A94A6
Подписи и метаданные
--c6TextDisabled
#8A91A3
#6E7A8C
Выключенные элементы и неактивные иконки. Текстом не бывает
--c6BorderDefault
#E1E5EE
#28313F
Границы карточек и секций

Департаменты

Цвет помогает опознать департамент и живёт только в шапке карточки, полосе, маркере списка или бейдже с аббревиатурой. Карточка остаётся нейтральной, ссылки внутри синие.

Три ступени на каждый департамент: Dark, основная и Light. Оттенок и цветность взяты из набора максимально различимых цветов.

#006E1F
#29A63E
#7BD57C

CIV · --c6DepartmentCiv

#023790
#4464D9
#8993F8

LSPD / LSSD · --c6DepartmentLspd

#AA4D00
#EE7C2B
#FEBE98

SAHP · --c6DepartmentSahp

#8D0329
#E4164A
#FE7A83

LSCoFD · --c6DepartmentFd

#525252
#848484
#B3B3B3

FIB · --c6DepartmentFib

#8D7C00
#C9B107
#FFE252

DOT · --c6DepartmentDot

#0C778C
#0CAFCD
#79E0FA

DISP · --c6DepartmentDisp

#960090
#D546CC
#FD89F2

Коммуникации · --c6RoleComms

#3C3B00
#6C6C01
#9D9940

FTO · --c6RoleFto

Ранги

Ранг — порядковая ось рядом с департаментами и ролями. Департамент отвечает на вопрос «где человек состоит», ранг отвечает на вопрос «насколько высоко поднялся». Поэтому ранг не получает собственный оттенок: вся шкала идёт одной рампой от нейтрали к золоту.

Соседние ранги похожи намеренно. Чип ранга всегда содержит название, а цвет только усиливает положение на шкале.

#403D3B
#666360
#92908E

Crook · 0-49

#4F453B
#776B5F
#A39A91

Runner · 50-99

#5F4D37
#8A735A
#B4A391

Player · 100-299

#725731
#9F7E51
#C9AF8F

Hustler · 300-799

#836326
#B28A45
#DDBC8C

OG · 800-1499

#926F13
#C29832
#EECA86

Kingpin · 1500-2499

#A08003
#D2A910
#FFDC89

Boss · 2500+

Ранг Порог Dark Main Light Текст на Main
Crook 0-49 --c6TierCrookDark --c6TierCrook --c6TierCrookLight белый
Runner 50-99 --c6TierRunnerDark --c6TierRunner --c6TierRunnerLight белый
Player 100-299 --c6TierPlayerDark --c6TierPlayer --c6TierPlayerLight белый
Hustler 300-799 --c6TierHustlerDark --c6TierHustler --c6TierHustlerLight чёрный
OG 800-1499 --c6TierOgDark --c6TierOg --c6TierOgLight чёрный
Kingpin 1500-2499 --c6TierKingpinDark --c6TierKingpin --c6TierKingpinLight чёрный
Boss 2500+ --c6TierBossDark --c6TierBoss --c6TierBossLight чёрный

Правила рангов

Правило Значение
Форма Ранг отображается чипом с названием: c6TierChip c6TierHustler. Чип без текста не используется
Имя Один ключ на сущность. Класс выводится как c6Tier{Key}, метка может меняться свободно
Порядок Хранится только нижний порог. Верхняя граница выводится из следующего порога
Рядом с департаментом Департамент — полоса или бейдж с аббревиатурой, ранг — чип с названием. Одинаковой формой не бывают
Затухание Рейтинг может падать при бездействии, поэтому ранг формулируется как текущее состояние, не как награда

Правила палитры департаментов

Правило Значение
Где живёт цвет Шапка карточки, полоса, маркер списка или бейдж. В коммуникации — цвет названия роли, секции или имени. В основном тексте, ссылках и кнопках не используется
Столкновения Ни одно значение не совпадает с семантическим токеном и не лежит рядом с ним
Слитые департаменты LSPD и LSSD в US — один департамент. --c6DepartmentLssd оставлен алиасом на --c6DepartmentLspd
Текст на плашке У каждой ступени свой токен: --c6Department{X}DarkInk, --c6Department{X}Ink и --c6Department{X}LightInk. Для ролей используется тот же шаблон под префиксом --c6Role*
Тёмная схема Значения не переопределяются: ступени лежат в средней светлоте и работают на обеих схемах

Типографика

Inter Variable — единственный интерфейсный шрифт на всех поверхностях. Переменное начертание даёт весь диапазон толщин одним файлом и оптический размер, за счёт которого мелкий текст остаётся читаемым, а крупный выглядит уместным. Atlantis International — только логотип и вордмарк.

@font-face {
  font-family: "Inter";
  src: url("/fonts/InterVariable.woff2") format("woff2-variations");
  font-weight: 100 900;
  font-display: swap;
}

Шкала размеров

Девять ступеней. Крупные адаптивны через clamp() и не требуют брейкпоинтов, мелкие фиксированы: уменьшать их на мобильном нельзя. Micro совпадает по размеру с Caption и отличается весом и разрядкой.

Токен Десктоп Мобильный Интерлиньяж Вес Где
--c6FontSizeDisplay 40 30 1.12 600 Первый экран
--c6FontSizeH1 32 26 1.18 600 Заголовок страницы
--c6FontSizeH2 24 21 1.25 600 Заголовок блока
--c6FontSizeH3 19 17 1.35 600 Заголовок карточки
--c6FontSizeLead 17 17 1.6 400 Подводка под заголовком
--c6FontSizeBody 15 15 1.6 400 Основной текст, кнопки
--c6FontSizeSmall 13 13 1.55 400 Текст в карточках, ссылки
--c6FontSizeCaption 12 12 1.5 400 Подписи, метаданные
--c6FontSizeMicro 12 12 1.45 500 Надзаголовки, капслок

Здесь всё решают люди

Заголовок страницы

Заголовок блока

Заголовок карточки

Подводка под заголовком — 17 px, вторичный цвет

Основной текст интерфейса

Текст внутри карточек и списков

Подписи, даты, счётчики

Надзаголовок секции

7KQ2MX4B1P — только для кодов и ключей

Обязательная адаптивность

Правило Значение
Минимальный размер 12 px. Ниже нельзя нигде, включая подписи и сноски
Основной текст на мобильном Не меньше 15 px. Уменьшение на узком экране запрещено
Цель нажатия Не меньше 44 × 44 px, включая ссылки в плотных списках
Крупные кегли Через clamp(): размер плавно меняется с шириной экрана, не выходя за минимум и максимум. Отдельные брейкпоинты под каждый размер и голые vw не применяются
Веса 400 — текст, 500 — интерфейс и микро, 600 — заголовки. 300 и тоньше не применяются: на тёмной схеме разваливаются
Длина строки Не нормируется. Строка может быть любой длины, если содержимое остаётся внутри контейнера и не создаёт горизонтальный скролл страницы
Горизонтальный скролл Скролл страницы отсутствует на любой ширине от 320 px. Для широких таблиц допустим локальный скролл внутри таблицы

Иконки

Lucide — единственный иконочный пак. Смешивать паки нельзя: разные стили заметны даже неподготовленному глазу и читаются как небрежность. Одна иконка означает одно и то же во всех продуктах.

shield · департаменты clock · сроки и ожидание triangle-alert · предупреждение check · пройденный шаг lock · недоступный шаг arrow-up · приоритет copy · копирование кода
Правило Значение
Интерфейсные размеры 14, 16, 18, 20 и 24 px — кнопки, поля, меню, таблицы, статусы
Крупные размеры 32, 40 и 48 px — пустые состояния, крупные карточки, экраны ошибок, онбординг
Соответствие тексту 16 px к компактному тексту, 18–20 px к основному, 20–24 px к крупным элементам
Толщина обводки 2 по умолчанию, 1.75 для 24 px, 1.5 для 32 px и выше
Формат SVG. Иконочные шрифты не применяются
Цвет Всегда currentColor. Собственного цвета у иконки нет
Доступность Декоративная иконка получает aria-hidden="true". Если иконка — единственное содержимое элемента управления, элемент получает доступное текстовое имя

Спейсинг и сетка

Базой берётся шкала Bootstrap. Она покрывает почти все случаи утилитами и избавляет от самодельных отступов, которые расходятся между страницами. Расстояния задаются в разметке: p-4, px-lg-5, g-3, gap-2, mt-3. Токены --c6Space* нужны там, где утилита неприменима — внутри компонента.

Токен Утилита Значение Где применяется
--c6Space1 1 4 px Между иконкой и подписью, внутри чипа
--c6Space2 2 8 px Между строками карточки, gap в списках чипов
--c6Space3 3 16 px Между карточками в ряду, отступ абзаца
--c6Space4 4 24 px Поля карточек и секций на мобильном
--c6Space5 5 48 px Поля секций на десктопе
Правило Значение
Секция p-4 p-lg-5 — 24 px на мобильном, 48 px на десктопе
Карточка p-3, крупная — p-4
Ряды row и g-3. Собственные grid-контейнеры только там, где Bootstrap не может выразить раскладку
Вертикальный ритм Отступ между блоками кратен 8. Значения вне шкалы не вводятся
Порядок утилит Раскладка, отступы, оформление: d-flex justify-content-between align-items-center px-4 py-3
Почему Bootstrap, а не своя сетка. Своя сетка требует документации, поддержки и обучения каждого нового человека. Bootstrap уже знают, он закрывает адаптивность из коробки, а его минималистичная база не навязывает визуальный стиль — внешний вид всё равно задают наши токены. Экономия не в коде, а в том, что раскладку не нужно объяснять.

Закругления

Радиус — часть плотности интерфейса, а не украшение. В продукте используются четыре токена, и новый радиус не заводится под отдельную карточку или кнопку.

Токен Значение Где применяется
--c6RadiusSm 8 px Образцы, чипы без статуса, компактные вложенные элементы, маленькие превью
--c6RadiusMd 10 px Кнопки, поля ввода, медиа-рамки, интерактивные элементы среднего размера
--c6RadiusLg 12 px Карточки, панели, крупные демонстрационные блоки
--c6RadiusPill 20 px Статусные плашки и элементы, которые по форме должны читаться как капсула
Правило Значение
Один уровень — один радиус Соседние карточки, превью и панели одного уровня используют один токен. Нельзя смешивать 8, 10 и 12 внутри одного набора
Вложенность Вложенный элемент получает радиус на шаг меньше родителя: карточка --c6RadiusLg, внутреннее медиа --c6RadiusMd, мелкий чип --c6RadiusSm
Pill --c6RadiusPill используется только там, где вытянутая форма несёт смысл: статус, бейдж, короткий выбор. Обычные кнопки pill не становятся
Микрорадиусы Значения меньше 8 px допустимы только для технических форм: полосы прогресса, точки, линии огней, скелетные строки. Новые поверхности ими не оформляются
Круг 50% используется только для круглых иконок, точек и аватарных форм. Это не замена --c6RadiusPill

Компоненты

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

Кнопки

Действия различаются по приоритету. Основная кнопка обозначает целевое действие экрана. Вторичная — дополнительное действие, которое не должно конкурировать с основным. Тихая подходит для вспомогательных операций. Заблокированное действие показывается только тогда, когда пользователю важно видеть его наличие и понимать условие доступности; в остальных случаях действие не выводится.

Статусы

Статус отображается в двух форматах. Плашка — когда состояние нужно выделить как самостоятельный элемент. Точка с подписью — когда состояние компактно показывается внутри строки или списка. Формат меняется, значение цвета и формулировка сохраняются во всех продуктах.
Ожидает проверки Одобрено Отклонено Истекло Приоритет Boosty Актуальный статус
Приём закрыт На проверке Одобрено Отклонено Истекло

Карточки и прогресс

Базовая карточка

Объединяет связанное содержимое и отделяет его от фона страницы.

Выделенная карточка

Применяется, когда блоку нужен повышенный визуальный приоритет. Синяя рамка не означает, что вся карточка является действием.

Переносы и усечение

Любой компонент обязан выдерживать длинный текст, код, никнейм, ссылку и технический идентификатор без горизонтального переполнения страницы. Базовое поведение — переносить. Усечение включается только там, где полный текст можно открыть или восстановить.

Усечение не является защитой от плохой вёрстки. Оно скрывает информацию, поэтому применяется как осознанный паттерн: заголовок карточки со ссылкой на полную страницу, вторичный превью-текст или плотный список. Код, статус, срок, сумма, ID заявки и ошибка не усекаются.

Три правила контейнера

Случай Правило Почему
Неразрывная строка overflow-wrap: anywhere на текстовом контейнере Коды, ссылки, никнеймы и пути не содержат пробелов, браузеру нужно разрешить аварийный перенос
Flex или grid min-width: 0 на текстовом потомке и ячейках сетки Иначе элемент считает ширину содержимого минимальной и выталкивает соседей из контейнера
Таблица или код Горизонтальный скролл у явного контейнера Структурные данные и форматированный код нельзя ломать переносами, если от этого теряется смысл

Утилиты

Класс Когда применяется
c6TextNoWrap Короткая атомарная метка, дата, время, число с единицей измерения. Не использовать для длинных ID
c6TextTruncate Одна строка с многоточием, когда полный текст доступен в соседнем экране, tooltip или раскрытии
c6TextClamp2, c6TextClamp3 Превью заголовков и описаний в карточках. Не использовать для ошибок, инструкций и юридически значимых текстов

Мини-пример

Перенос без пробелов

7KQ2MX4B1P-9F3D-4A21-B7E8

Осознанное усечение

Фраза офицера дорожного патруля запустила волну беспорядков в округе и стала началом длинного события

Чего не делать

Нельзя Причина
Ставить overflow: hidden на карточку ради защиты Так скрываются фокус, подсказки, выпадающие элементы и настоящие ошибки раскладки
Усекать коды, статусы и сообщения об ошибках Пользователь не может принять решение по неполному значению
Делать кнопку или бейдж бесконечно однострочным На мобильном длинная локализация вытолкнет соседние элементы за экран

Уведомления

Уведомление — временное сообщение о том, что только что произошло поверх содержимого. Оно не описывает состояние объекта и не заменяет его: если сообщение нужно перечитать позже, это запись в списке или строка в карточке.

Информационный тон нейтральный, а не синий. Синий в системе означает действие, поэтому внутри уведомления он остаётся только у ссылки или кнопки действия.

Тоны

Новая заметка

Черновик сохранён в истории страницы.

Steam привязан

Аккаунт готов к подаче заявки.

Проверяем данные

Ответ может занять несколько секунд.

Не удалось сохранить

Проверьте соединение и повторите.

Приоритет обновлён

Платная механика отмечается фиолетовым тоном.

Живые области

<div class="c6AlertRegion" id="c6AlertRegionPolite" role="status" aria-live="polite" aria-atomic="false"></div>
<div class="c6AlertRegion" id="c6AlertRegionAssertive" role="alert" aria-live="assertive" aria-atomic="false"></div>

Вызов

c6AlertStack.show({
  tone: 'success',
  title: 'Steam привязан',
  text: 'Аккаунт готов к подаче заявки.'
});

c6AlertStack.show({
  tone: 'danger',
  title: 'Не удалось сохранить',
  text: 'Проверьте соединение и повторите.',
  action: { label: 'Повторить', onSelect: () => saveApplication() }
});

Правила

Правило Значение
Срок жизни 5 секунд для обычных, 7 секунд для ожидания и платных механик. Ошибка не гаснет сама
Видимых одновременно Не больше трёх. Остальные сворачиваются в счётчик, а не удаляются молча
Доступность Спокойные сообщения идут в polite-область, ошибки — в assertive-область
Длина Два предложения — предел. Дальше нужна страница, карточка или строка списка
Тень --c6ShadowOverlay применяется только к всплывающим слоям: уведомлениям, поповерам и модальным окнам

Загрузка

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

Правило выбора одно. Форма будущего содержимого известна — скелет. Неизвестна или места нет — спиннер. Значение уже на экране и просто обновляется — подсветка на месте. Ошибка почти всегда в третьем случае: подменять число скелетом при каждом опросе значит мигать пользователю в лицо раз в минуту.

Скелет карточки

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

Скелет строки таблицы

В плотных таблицах скелет ставится внутрь настоящих ячеек: тогда ширины колонок держит сама таблица и после загрузки ничего не перестраивается.

Код Департамент Статус Время

Спиннер

Три размера. Кольцо берёт цвет границы, дуга — currentColor, поэтому спиннер одинаково работает на карточке, в кнопке и на тёмной плашке без переопределений.

14 · 18 · 24

Кнопка

Подпись не удаляется, а скрывается: ширина кнопки не меняется, соседние элементы не сдвигаются. Повторное нажатие блокируется через disabled, pointer-events остаётся визуальным дополнением.

Индикатор страницы

Тонкая полоса под шапкой на время перехода или тяжёлого запроса. В отличие от бегущего отблеска, здесь только синий: это процесс, а не взаимодействие с брендом.

Содержимое страницы

Изображение

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

До загрузки

После загрузки

Живые значения

Числа, которые обновляются сами: свободные места, позиция в очереди, счётчик людей на сервере. Их нельзя заменять скелетом при каждом опросе — значение подсвечивается ровно в момент изменения.

Попробуйте

Свободно мест: 56

Устаревшие данные

Если ответ не пришёл, значение не прячется и не обнуляется. Блок приглушается, рядом появляется отметка времени последнего успешного обновления.

56 мест

Обновляется каждую минуту

Данные от 21:04, связь потеряна

Правила

Правило Значение
Порог показа Индикатор не появляется первые 200 мс. Мелькание раздражает сильнее, чем ожидание
Минимальная жизнь Показанный индикатор держится не меньше 400 мс, иначе он мигнёт и исчезнет
Совпадение геометрии Скелет повторяет размеры готового содержимого. Сдвиг раскладки после загрузки — ошибка
Ширина скелета Модификаторами c6SkeletonWide*, не атрибутом style
Загрузка, пустой результат и ошибка Три разных состояния. Во время запроса — загрузка, после успешного пустого ответа — пустое состояние, при неудачном — ошибка
Повторный опрос Не заменяет содержимое скелетом. Меняется только само значение
Ошибка опроса Старое значение остаётся, блок приглушается, появляется отметка времени
Бренд против спиннера Отблеск и знак — первая загрузка поверхности, заставки, крупные переходы. Отправка формы и загрузка отдельного блока — синий спиннер, скелет или локальная подсветка
Индикатор навигации Запускается по факту перехода, а не по клику: отменённый клик, модальное окно и переключение схемы его не включают
Повторный запуск Каждый новый переход перезапускает анимацию с нулевого кадра. Повторное добавление класса само по себе её не перезапускает — нужен принудительный пересчёт раскладки
Остановка Гасит индикатор только последний запрос. Ранний ответ не снимает индикатор более позднего перехода

Сгенерированный блок

Контейнер для всего, что написала модель: ответы ассистента, автоматические сводки, предварительные оценки, суммаризация, реплики NPC, ситуационные подсказки. Три обязательных признака — штриховая кромка, маркер происхождения и подпись с моделью и временем.

Почему без цвета. Синий занят действием, желтый — ожиданием, зелёный — успехом, красный — отказом, фиолетовый — платными механиками. Шестого свободного оттенка нет, а вводить его значит ослабить остальные пять. Происхождение контента — не статус, поэтому выражается текстурой.

Готовый ответ

Сгенерировано terminal-ai · 16 сент, 21:04

По номеру 7KQ2MX4B1P найдено три записи: остановка на трассе 12 сентября, протокол о превышении 14 сентября, вызов эвакуатора 15 сентября.

Совпадений по розыску нет.

Сводка составлена автоматически и может содержать ошибки. Проверяйте важную информацию.

Во время генерации

Генерируется terminal-ai

По номеру 7KQ2MX4B1P найдено три записи: остановка на трассе 12 сентября

До первого токена

Генерируется

Правила

Правило Значение
Обязательные признаки Штриховая кромка, маркер, подпись с моделью и временем. Ни один не опускается
Никогда не как человеческое Сгенерированный текст не оформляется так же, как написанный участником или администрацией
Цвет Не берёт ни один статусный оттенок. Синий допустим только в индикаторе процесса
Анимация Только во время генерации. После завершения блок статичен
Смена состояния Снятие класса не меняет геометрию: блок не смещается в момент завершения
Оговорка Там, где на основе текста принимают решения, внизу стоит строка об автоматическом происхождении
Вложенность Блок не вкладывается в другой такой же. Несколько ответов — несколько блоков подряд

Где применяется

Поверхности

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

Поверхность Схема Особенности
Форум тёмная Фоновое видео и рендеры, высокая плотность контента
База знаний Docs обе, светлая по умолчанию Длинные тексты, переключатель схемы у пользователя
Игровые сервисы тёмная Прогресс, рейтинги, статусы, длительные сессии
Приём обе, светлая по умолчанию Воронка состояний, которая должна быть консистентной
Лендинги и медиа по задаче Обязательны шрифт, иконки и палитра

Именование

Federal — имя дизайн-системы, но не технический namespace. В коде всё живёт под единым префиксом c6: базовые значения, семантические токены и компоненты.

Слой Префикс Отвечает на вопрос Примеры
Базовые значения и шкалы --c6Color*, --c6Department*, --c6Space*, --c6Radius*, --c6FontSize*, --c6Motion* Какое это значение? --c6ColorBlue, --c6DepartmentLssd, --c6Space4
Семантические роли --c6Surface*, --c6Text*, --c6Border*, --c6Action*, --c6Status*, --c6Logo*, --c6Light*, --c6Mark* Для чего это используется? --c6SurfaceCanvas, --c6TextPrimary, --c6ActionFill
Компонент c6 Где применяется? c6ButtonPrimary, c6StatusPillWaiting, c6DepartmentBandSahp
:root {
  --c6ColorBlue: #1B6FE0;                  /* базовое значение */
  --c6ActionFill: var(--c6ColorBlue);      /* семантический токен */
}

.c6ButtonPrimary {                         /* компонент читает семантику */
  background: var(--c6ActionFill);
}
Почему классы тоже с префиксом. Фреймворки владеют именами card, btn, row, badge. Любой наш класс без префикса рано или поздно столкнётся с их обновлением. Префикс снимает вопрос навсегда и делает видимым, где в разметке наш компонент, а где утилита фреймворка.

Как применять

Новый проект

  1. Подключить c6-tokens.css и Bootstrap.
  2. Подключить Inter Variable и Lucide.
  3. Выбрать основную схему поверхности: светлая или тёмная.
  4. Собирать интерфейс на компонентах c6, отступы задавать утилитами Bootstrap.
  5. Свои классы заводить только там, где утилит не хватает, и с префиксом c6.

Существующий проект

Переход делается фазами, каждая заканчивается рабочим состоянием. Старые переменные не удаляются сразу, а переопределяются через новые — тогда продукт переезжает одним шагом и ничего не разваливается.

:root {
  --oldBrandPrimary: var(--c6ActionFill);
  --oldTextMuted:    var(--c6TextSecondary);
}

Такой мост для переноса живёт до последней фазы и удаляется вместе со старыми именами.

Постоянная ссылка на файлы токенов (переменных CSS):

<link rel="stylesheet" href="https://code6.ru/docs/assets/c6-tokens.css">

Работа с агентом

Приведи проект к дизайн-системе code6.

Источник правды:
  https://code6.ru/brand
  https://code6.ru/docs/assets/c6-tokens.css
  https://code6.ru/docs/assets/brand/

Версия бренд-документа:
  c6-brand-v2026-07-31

Перед началом:
  — найти на странице meta[name="c6-brand-version"]
  — продолжать только если content равен c6-brand-v2026-07-31

Обязательно:
  — подключить c6-tokens.css, не копировать значения
  — Inter Variable, иконки Lucide, отступы утилитами Bootstrap
  — классы компонентов с префиксом c6
  — обе схемы работают, переключение атрибутом data-theme

Запрещено:
  — менять раскладку, тексты и бизнес-логику
  — вводить новые цвета
  — атрибут style и строки стилей из JS

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

Сквозные правила

Действуют во всех разделах и не повторяются в частных таблицах.

Правило Значение
Снижение движения При prefers-reduced-motion анимации останавливаются, элементы остаются в статичном читаемом виде. Ни один компонент не теряет смысл без движения
Цвет не один Цвет ускоряет опознание, но информацию несёт текст. Элемент, различимый только по цвету, не добавляется в проект
Токен вместо значения Любой цвет, размер и отступ берётся из токена. Единственное исключение — примеры в этом документе
Отличия этой страницы от продукта Документ показывает варианты рядом и потому нарушает собственные правила «один элемент огней на экран» и «один анимированный знак на экран». В продукте они соблюдаются
Основной критерий проверки Компонент, перенесённый с одной поверхности на другую, не должен требовать правки цветов. Если требует — где-то остался хардкод вместо токена

Правила кода

Именование и читаемость

Правило Значение
Регистр camelCase для переменных, функций, ключей объектов, CSS-токенов и классов
Имена Полные слова. departmentIndex, а не di
Сокращения Только общепринятые: id, url, css
Комментарии Там, где логика неочевидна или может быть понята двояко
Обфускация В исходниках не применяется. Минификация — задача сборки
Функции Одна функция — одна ответственность. Сборка разметки отдельно от логики состояния. Похожие функции объединяются, а не дублируются

CSS

Правило Значение
Инлайн-стили В продуктовой разметке и переносимых примерах не применяются. Ни атрибутом style, ни строкой стиля из JS
Динамические значения Через класс-модификатор или CSS-переменную на элементе: element.style.setProperty('--c6ProgressValue', '53%'), не через сборку строки CSS
Группировка Токены объявляются в начале файла, остальной CSS группируется по компонентам. В начале блока компонента перечисляются используемые токены
Порядок разделов Совпадает с порядком разделов страницы и объявлен в шапке файла
Адаптивы Медиазапрос компонента лежит рядом с компонентом, а не в общей секции в конце файла
Хардкод цвета Не применяется. Любой цвет — только токен
Утилиты против CSS Сначала утилита Bootstrap в разметке, свой класс — если утилит не хватает
Почему запрет на инлайн-стили не формальность. Пока цвет или постоянная геометрия живут строкой в JS, тёмная схема и адаптивность физически невозможны: токен не подставится в уже собранную строку. Исключение — динамическое числовое значение, переданное в заранее описанную CSS-переменную.

Тон и раскрытие информации

Текст — часть интерфейса: он определяет, что пользователь понимает, какие действия замечает и какие решения может принять. Информация раскрывается по мере необходимости: сначала главное действие и текущее состояние, затем пояснения, условия и подробности.

Показываем Не показываем
Статусы, даты, коды, сроки Причины отказа
Позицию в очереди и скорость обработки Обещания сроков проверки
Требования и стоп-факторы Советы по подготовке и разбор ошибок
Названия шагов отбора Внутренние процедуры
Характер департаментов Устройство служб изнутри

Сдержанность касается раскрытия информации, а не интонации. «В этот раз не получилось» — нормально. «Вот что стоит подтянуть» — нет. Детали о раскрытии информации — в правилах code6.