Spacing scale и вертикальный ритм
Базис 4/8, шкала отступов, вертикальный ритм типографики и допустимые исключения.
Построй spacing-систему для: {{context}}.
Тезис: ритм держит макет даже без декора. Если убрать цвет и шрифт — макет всё равно должен "звучать" из-за отступов.
1. Выбери базис
| Базис | Когда |
|---|---|
| 4px | дефолт; гибче, лучше для плотного UI (таблицы, формы, dashboards) |
| 8px | проще; маркетинг, статичный контент |
| 4px с шагом 4 до 24, дальше шагом 8 | гибрид; чаще всего то, что нужно |
Не смешивай 5px, 7px, 13px. Шкала — серия.
2. Шкала
:root {
--space-0: 0;
--space-px: 1px;
--space-0-5: 2px; /* hairline */
--space-1: 4px;
--space-2: 8px;
--space-3: 12px;
--space-4: 16px; /* база body */
--space-5: 20px;
--space-6: 24px;
--space-8: 32px;
--space-10: 40px;
--space-12: 48px;
--space-16: 64px;
--space-20: 80px;
--space-24: 96px;
--space-32: 128px;
--space-40: 160px;
--space-48: 192px;
}
Правила:
- Шаг не линейный — отношение приближается к 1.25-1.5 на больших значениях
- Чем больше отступ — тем реже ступени (не нужны 100, 104, 108)
- Не более 14-16 ступеней. Больше — система становится "тазиком"
3. Семантические роли
:root {
/* Внутри компонента */
--gap-tight: var(--space-2); /* иконка↔текст */
--gap-cosy: var(--space-3); /* пункты списка */
--gap-roomy: var(--space-4); /* между блоками внутри карточки */
/* Между компонентами */
--stack-sm: var(--space-6);
--stack-md: var(--space-10);
--stack-lg: var(--space-16);
--stack-xl: var(--space-24);
/* Контейнерные паддинги */
--pad-sm: var(--space-4);
--pad-md: var(--space-6);
--pad-lg: var(--space-8);
/* Секции страницы */
--section-y: var(--space-24); /* 96px */
--section-y-lg: var(--space-32);
}
4. Вертикальный ритм типографики
Принцип: line-height × font-size каждой пары — кратно базису.
body: 16px × 1.5 = 24px (= 6 × 4)
h3: 20px × 1.4 = 28px (= 7 × 4)
h2: 28px × 1.3 = 36px (= 9 × 4)
h1: 40px × 1.2 = 48px (= 12 × 4)
Расстояние между заголовком и параграфом тоже из шкалы. Самое частое: margin-top следующего блока = --space-6 для текстовых блоков, --space-10 для нового раздела.
5. Правило "ближе — связано"
Закон Гештальта: отступ кодирует связь.
[ Title ]
12px
[ Subtitle ] ← связаны: tight
32px
[ Body ] ← новая мысль: roomy
Если subtitle ближе к body, чем к title — иерархия сломана.
6. Допустимые исключения
Не вся жизнь укладывается в 4/8. Чёткие исключения:
- Optical alignment. Иконка-arrow с двух сторон одинаковым padding'ом выглядит несимметрично — допускается
-1pxсдвиг - Hairlines. Border 1px — не нарушение, это subatomic
- Picture-perfect размеры дизайн-системы донора (логотип партнёра должен быть ровно 22px) — допускается
- Mobile сжатие. На
< 480pxможно сжимать gap'ы на ступень вниз (md → sm) - Адаптивная типографика.
clamp()для шрифта приводит к нецелым line-height в средних viewport — это ок, ритм держится на нижней и верхней
Каждое исключение — задокументируй в комменте к коду или в системе. Анонимные "1px" расползаются.
7. Проверка на компонентах
Прогон, чтобы убедиться что ритм держит:
- Карточка — внешний padding, gap внутри, gap до соседней карточки
- Форма — gap между полями (
--space-4), gap между секциями (--space-8), kerning label↔input - Кнопка — высота 36/40/48 кратна 4, paddingX больше paddingY
- Stat-row в дашборде — gap между числом и подписью
--space-1, между столбцами--space-8 - Длинный текст — раздел, h2, параграф, h3, параграф; есть ли ритм без декора
- Hero — массивные
--section-y, ничего меньше--space-12рядом с заголовком
Сделай страницу-зебру: подсветь все отступы outline: 1px solid magenta. Если глазу что-то "цепляется" — найди и положи в шкалу.
Формат вывода
- Шкала + семантические токены (CSS)
- Tailwind config (если есть):
spacingextend - Таблица "когда какой токен"
- Список зафиксированных исключений (если есть)
- Скриншот/JSX 3 компонентов с подсветкой отступов
Анти-паттерны
- 17px между блоком и заголовком "потому что красиво"
- Одинаковый gap внутри и между блоками — иерархия разрушена
margin-bottomна каждом элементе вместоgapна родителе — двойные отступы при перестановке- Top-margin на h2 + bottom-margin предыдущего параграфа = накопление 64px
- Шкала из 30 значений — никто не помнит, что выбрать
- "Это исключение" без записи — через месяц станет правилом
Аудит brand-consistency
Прогон интерфейса на согласованность: цвета, spacing, typography, voice, иконки. Найти отклонения от системы.
Brand guidelines с нуля
Сборка полного гайдлайна: voice, color tokens, типографика, правила логотипа, антипаттерны и примеры. Готовый DESIGN.md.
Дизайн-токены из референса
Извлечь систему цветов, типографики, теней, радиусов и spacing из примера и оформить как токены.