Перейти к содержимому

Лекция 2. Компоненты и дизайн-системы


Введение

В первой лекции мы познакомились с интерфейсом Figma, фреймами, сеткой и базовыми принципами мобильного UI. В этой лекции мы перейдём от «рисования отдельных экранов» к системному подходу — научимся строить интерфейс из переиспользуемых блоков и описывать его языком дизайн-системы.

Главная идея проста: профессиональный дизайнер не рисует каждую кнопку заново. Он один раз создаёт компонент, описывает правила (токены), а затем собирает экраны как из конструктора. Это ускоряет работу, гарантирует одинаковый вид во всём продукте и упрощает передачу макетов разработчикам.

К концу лекции вы будете понимать, что такое дизайн-система, из чего она состоит, и как собрать её с нуля. Практическим закреплением станет работа №2 — компоненты Button, Input, Product Card и экран «Каталог».


1. Дизайн-система: что это и из чего состоит

1.1. Определение

Дизайн-система (Design System) — это набор стандартизированных компонентов, правил и принципов, которые обеспечивают консистентность (единообразие) и масштабируемость дизайна продукта.

Дизайн-систему можно сравнить с конструктором LEGO: есть набор деталей с заранее определёнными размерами и способами соединения, и из них можно собрать сколько угодно разных моделей, не выходя за рамки единого стиля.

1.2. Из чего состоит дизайн-система

Любая дизайн-система собирается из четырёх крупных блоков:

  1. Дизайн-токены (Design Tokens) — атомарные значения:

    • цвета (Primary, Secondary, Neutral, Semantic);
    • типографика (размеры, веса, межстрочные интервалы);
    • отступы (Spacing scale);
    • радиусы скругления (Border radius);
    • тени (Elevation levels).
  2. Базовые компоненты (Base Components) — простые элементы:

    • Button (кнопки), Input (поля ввода), Card (карточки), Navigation (навигация), Feedback (Toast, Modal, Tooltip).
  3. Композитные компоненты (Composite Components) — сложные блоки из базовых:

    • Header (шапка), Product Grid (сетка товаров), User Profile, Search Results.
  4. Документация — правила использования, примеры применения, гайдлайны (что можно и чего нельзя).

1.3. Зачем это нужно

ПреимуществоЧто даёт на практике
КонсистентностьКнопки и тексты выглядят одинаково на всех экранах
СкоростьНе нужно перерисовывать элементы заново
ПоддержкаИзменение в одном месте применяется ко всему продукту
МасштабируемостьЛегко добавлять новые экраны и функции
Командная работаЕдиный источник истины для дизайнеров и разработчиков

2. Дизайн-токены (Design Tokens)

2.1. Понятие

Дизайн-токены — это атомарные (наименьшие, неделимые) значения дизайна, которые определяют визуальные свойства элементов интерфейса. Это «единицы измерения» дизайн-системы.

Вместо того чтобы в макете писать «здесь синий #2196F3», мы заводим токен Primary/500 и ссылаемся на него. Если бренд решит сменить синий на бирюзовый — мы меняем значение одного токена, и все элементы обновляются автоматически.

2.2. Типы токенов с примерами

  1. Цветовые токены:

    • Primary/500: #2196F3
    • Neutral/900: #212121
    • Error/500: #F44336
  2. Типографические токены:

    • Heading/H1: 32px, Bold, Line Height 40px
    • Body/Large: 16px, Regular, Line Height 24px
  3. Spacing-токены:

    • Spacing/4: 4px, Spacing/8: 8px, Spacing/16: 16px, Spacing/24: 24px
  4. Border Radius токены:

    • Radius/Small: 4px, Radius/Medium: 8px, Radius/Large: 12px
  5. Elevation-токены:

    • Elevation/1: 0px 1px 3px rgba(0,0,0,0.12)
    • Elevation/2: 0px 2px 6px rgba(0,0,0,0.15)

В Figma токены реализуются через Styles (Color Styles, Text Styles, Effect Styles) и Variables (переменные).

2.3. Передача токенов разработчикам

Токены ценны тем, что легко превращаются в код. Это «мост» между дизайнером и программистом.

JSON-формат (универсальный, читается любыми инструментами):

{
"colors": {
"primary": {
"500": "#2196F3",
"700": "#1976D2"
}
},
"spacing": {
"4": "4px",
"8": "8px",
"16": "16px"
}
}

CSS-переменные (для веб-разработки):

:root {
--color-primary-500: #2196F3;
--spacing-8: 8px;
}

Процесс передачи обычно состоит из трёх шагов:

  1. Экспорт из Figma — плагином (Figma Tokens), вручную или через Figma API.
  2. Преобразование — конвертация в нужный формат (например, через Style Dictionary).
  3. Интеграция — импорт в код проекта и использование при разработке.

Что это даёт разработке: единый источник истины, автоматизацию (генерация кода), типобезопасность (автодополнение в IDE), лёгкую поддержку тем (light/dark mode).


3. Цвета в дизайн-системе

3.1. Типы цветов

В дизайн-систему включают четыре типа цветов, каждый со своим назначением:

ТипНазначениеГде применяется
PrimaryОсновной цвет бренда, главные действияГлавные кнопки, ссылки, активные элементы
SecondaryДополнительный цвет для разнообразияВторичные кнопки, дополнительные акценты
NeutralФоны, текст, границы, разделителиФоны экранов, текст, обводки
SemanticПередача состояния/смыслаУспех, ошибка, предупреждение, информация

3.2. Шкала оттенков (50–900)

Каждый цвет обычно представлен не одним значением, а шкалой оттенков:

  • 50 — самый светлый (для фонов, hover-состояний);
  • 500 — основной оттенок (главное значение цвета);
  • 900 — самый тёмный (для текста, насыщенных акцентов).

Меньшие числа — светлее, большие — темнее. Например: Primary/50, Primary/100, Primary/500, Primary/700, Primary/900.

3.3. Семантические цвета (Semantic Colors)

Семантические цвета — это цвета, которые несут смысл и сообщают пользователю о состоянии или типе сообщения.

ЦветЗначениеПример hexГде используется
SuccessУспех#4CAF50Подтверждения, статусы «Доступно», галочки
WarningПредупреждение#FF9800Важная информация, требующая внимания
ErrorОшибка#F44336, #FF3B30Валидация полей, кнопки удаления, критические сообщения
InfoИнформация#2196F3Подсказки, тултипы, нейтральные уведомления

Принципы использования семантических цветов:

  • Консистентность — одинаковые цвета для одинаковых состояний во всём продукте.
  • Доступность — достаточный контраст для читаемости.
  • Ясность — цвет должен дополнять текст, а не заменять его (нельзя полагаться только на цвет — часть пользователей не различает оттенки).

4. Типографическая шкала

Типографическая шкала — это система размеров, весов и межстрочных интервалов (line height), которая обеспечивает визуальную иерархию и единообразие текста.

4.1. Структура шкалы

СтильРазмерВесLine HeightНазначение
Heading/H132pxBold40pxГлавный заголовок страницы
Heading/H224pxSemiBold32pxЗаголовки разделов
Heading/H320pxSemiBold28pxПодзаголовки
Heading/H418pxMedium24pxМелкие заголовки
Body/Large16pxRegular24pxОсновной текст, параграфы
Body/Medium14pxRegular20pxВторичный текст
Body/Small12pxRegular16pxМелкий текст
Button/Large16pxMedium20pxТекст крупных кнопок
Button/Medium14pxMedium18pxТекст средних кнопок
Caption12pxRegular16pxПодписи, метки, цены

4.2. Принципы типографики

  • Иерархия — чёткое визуальное различие между уровнями текста.
  • Читаемость — для мобильных устройств минимум 16px для основного текста.
  • Line Height — обычно 1.2–1.5× от размера шрифта (например, 16px текст → 24px интервал).
  • Консистентность — одинаковые типы текста имеют одинаковые стили.
  • Масштабируемость — шкалу легко расширять новыми размерами.

Пример применения: H1 — заголовок «Добро пожаловать»; H2 — «Популярные товары»; Body/Large — описание товара; Caption — цена и метки.


5. Elevation (уровни поднятия) и тени

Elevation — это система теней, создающая ощущение глубины и иерархии. Она имитирует физическое «поднятие» элемента над поверхностью: чем выше элемент, тем больше его тень.

5.1. Уровни Elevation

УровеньТень (CSS)Где используется
Elevation/10px 1px 3px rgba(0,0,0,0.12)Карточки, кнопки, мелкие элементы
Elevation/20px 2px 6px rgba(0,0,0,0.15)Выпадающие меню, тултипы, нав-меню
Elevation/30px 4px 12px rgba(0,0,0,0.18)Модальные окна, диалоги
Elevation/40px 8px 24px rgba(0,0,0,0.20)Полноэкранные модалки, важные уведомления

5.2. Принципы использования

  1. Иерархия — более важные элементы имеют большую тень.
  2. Интерактивность — элементы с тенью воспринимаются как «нажимаемые».
  3. Группировка — элементы с одинаковой тенью читаются как одна группа.
  4. Фокус — активные элементы могут получать увеличенную тень (например, кнопка на hover поднимается с Elevation/1 до Elevation/2).
  5. Консистентность — одинаковые типы элементов используют одинаковый уровень.

В Figma тени задаются через Effect Styles (тип эффекта — Drop Shadow), что позволяет применять их как токены.


6. Базовые и композитные компоненты

6.1. Базовые компоненты (Base)

Базовые компоненты — простые, неделимые (атомарные) элементы, которые служат строительными блоками. Их нельзя разбить на более мелкие осмысленные части.

  • Простые и атомарные;
  • универсальные, не привязаны к конкретному экрану;
  • легко настраиваются;
  • основа для сложных компонентов.
  • Примеры: Button, Input, Icon, Badge, Avatar.

6.2. Композитные компоненты (Composite)

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

  • Состоят из базовых компонентов;
  • решают конкретные задачи;
  • более сложная структура;
  • специфичны для контекста.
  • Примеры: Header, ProductCard, SearchBar, UserProfile.

6.3. Сравнение

Базовые компонентыКомпозитные компоненты
Простые элементыСложные структуры
УниверсальныеКонтекстно-специфичные
АтомарныеСоставные
Button, Input, IconHeader, ProductCard
Основа дизайн-системыРешение конкретных задач

Пример иерархии: SearchBar = Input + Icon + Button, а Header = Logo + Navigation + SearchBar + UserMenu. Это похоже на принцип «атомарного дизайна»: атомы → молекулы → организмы.


7. Переиспользуемые компоненты

Переиспользуемый компонент — это элемент, созданный один раз (мастер-компонент) и применяемый многократно через экземпляры (instances).

7.1. Как это работает в Figma

  • Мастер-компонент создаётся один раз (горячая клавиша ⌘/Ctrl + Alt + K).
  • В макетах используются экземпляры — копии, связанные с мастером.
  • Изменение мастера автоматически применяется ко всем экземплярам.
  • Экземпляры можно настраивать через свойства компонента (текст, иконка, цвет) и варианты (variants).

7.2. Почему это важно

  1. Консистентность — единый вид и предсказуемое поведение во всём продукте.
  2. Экономия времени — не нужно создавать элементы заново.
  3. Лёгкость обновлений — правка в одном месте влияет на все экземпляры.
  4. Масштабируемость — легко добавлять новые экземпляры и расти.
  5. Командная работа — единый источник истины, простая передача разработчикам.
  6. Качество — проверенные компоненты, соответствие стандартам доступности.

Ключевое правило практики №2: компоненты должны действительно переиспользоваться как инстансы, а не копироваться как «сырые» фреймы.


8. Компонент кнопки с вариантами (Primary / Secondary / Ghost)

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

Шаг 1. Базовая кнопка.

  • Прямоугольник с горизонтальным автолэйаутом;
  • Padding: 12px 16px (Medium) или 16px 24px (Large);
  • Border Radius: 8px;
  • Текст «Button», стиль Button/Medium.

Шаг 2. Вариант Primary (главное действие):

  • Background: Primary/500 (#2196F3);
  • Text: White;
  • Shadow: Elevation/1.

Шаг 3. Вариант Secondary (альтернативное действие):

  • Background: Transparent;
  • Border: 1px Primary/500;
  • Text: Primary/500;
  • тень убрать.

Шаг 4. Вариант Ghost (наименее заметное действие):

  • Background: Transparent;
  • Border: нет;
  • Text: Primary/500.

Шаг 5. Объединение в компонент с вариантами:

  • выделить три кнопки → Create Component;
  • в панели Properties добавить свойство Variant со значениями Primary, Secondary, Ghost.

Шаг 6. Дополнительные свойства (опционально): Size (Small/Medium/Large), State (Default/Hover/Pressed/Disabled), Icon (с иконкой/без).

Шаг 7. Состояния:

  • Hover — лёгкое изменение цвета или тени;
  • Pressed — Scale 0.98, уменьшение тени;
  • Disabled — Opacity 0.5, отключение интерактивности.

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


9. Состояния компонента Input

Поле ввода должно отражать своё текущее состояние — это важно для понятности и доступности.

СостояниеBorderBackgroundТекстВизуально
Default1px Neutral/300 (#E9ECEF)Neutral/50 (#F8F9FA)Neutral/900Нейтральный, готов к вводу
Focus2px Primary/500 (#2196F3)WhiteNeutral/900Синяя рамка + подсветка outline
Error2px Error/500 (#F44336)WhiteError/500Красная рамка, текст ошибки под полем
Disabled1px Neutral/300Neutral/100 (#F5F5F5)Neutral/500Серый, неактивный, недоступен
Success (опц.)2px Success/500 (#4CAF50)WhiteNeutral/900Зелёная рамка + галочка

Ключевые визуальные различия:

  • Цвет рамки: серый (Default) → синий (Focus) → красный (Error).
  • Толщина рамки: 1px (Default) → 2px (Focus, Error).
  • Тень/подсветка: отсутствует (Default) → есть outline (Focus, например 0 0 0 3px Primary/50).
  • Цвет текста: тёмный (Default) → красный (Error) → серый (Disabled).

Placeholder — текст-подсказка серого цвета (#8E8E93), который исчезает при вводе. Дополнительно у Input бывают варианты Filled (с введённым текстом) и With Icon (иконка слева/справа с учётом padding).


10. Auto Layout: адаптивные компоненты

Auto Layout (автолэйаут) — механизм Figma, который автоматически меняет размеры контейнера и расположение элементов в зависимости от содержимого и настроек. Это основа адаптивных компонентов.

10.1. Основные параметры

  1. Direction (направление): Horizontal (в ряд) или Vertical (в столбец).
  2. Padding (внутренние отступы): расстояние от границы контейнера до содержимого.
  3. Gap (промежуток): расстояние между дочерними элементами.
  4. Alignment (выравнивание): Left / Center / Right / Space between, Top / Center / Bottom.
  5. Resizing (изменение размера):
    • Hug Contents — контейнер подстраивается под содержимое;
    • Fill Container — заполняет доступное пространство;
    • Fixed — фиксированный размер.

10.2. Padding vs Gap

Это разные виды отступов, их часто путают:

ПараметрPaddingGap
Где применяетсяВнутри контейнера, от краёвМежду элементами
Что создаётПоля внутри элементаПромежутки между элементами
ВлияниеМеняет размер контейнераНе меняет размер контейнера

Пример для кнопки с иконкой: Padding: 12px 16px (поля кнопки) + Gap: 8px (между иконкой и текстом).

10.3. Параметры адаптивности

Главный инструмент адаптивности — Resizing:

  • Hug Contents — для кнопок, бейджей (подстраиваются под текст);
  • Fill Container — для карточек, контейнеров (растягиваются на доступную ширину);
  • Fixed — использовать осторожно, только когда размер действительно фиксирован.

Дополнительно работают Constraints (привязка к краям родителя: Left/Right, Top/Bottom, Center, Scale) — они управляют позиционированием относительно родителя, тогда как Auto Layout управляет внутренней структурой.

Примеры настроек:

КомпонентDirectionPaddingGapResizing
КнопкаHorizontal12×168Hug Contents (+ min-width 120px)
КарточкаVertical1612Fill Container
Сетка16Fill Container + Space between

11. Spacing Scale

Spacing Scale — система стандартизированных значений отступов, обеспечивающая визуальный ритм и единообразие. Все отступы выбираются из шкалы, а не «на глаз».

11.1. Значения шкалы (база 4px)

ТокенЗначениеТипичное применение
Spacing/44pxМежду иконкой и текстом
Spacing/88pxМежду элементами в списке
Spacing/1212pxМежду связанными элементами
Spacing/1616pxБазовый padding, отступы карточек
Spacing/2424pxМежду секциями
Spacing/3232pxМежду крупными блоками

(Дополнительно встречается 48px — между основными разделами. Альтернативная база — 8px: 8/16/24/32/48/64.)

11.2. Принципы

  • Консистентность — используем только значения из шкалы.
  • Ритм — кратность базовому значению создаёт визуальную гармонию.
  • Математическая логика — все значения кратны 4 (или 8).
  • Упрощение решений — не нужно выбирать «13 или 15px», есть готовый набор.

12. Карточка товара (Product Card) как компонент

Product Card — это композитный компонент: он собирается из изображения, текстов и инстанса кнопки. Разберём процесс.

Шаг 1. Структура (контейнер):

  • фрейм с вертикальным автолэйаутом;
  • Padding: 16px;
  • Border Radius: 12px;
  • Background: White;
  • Shadow: Elevation/1.

Шаг 2. Изображение:

  • прямоугольник сверху, соотношение 1:1;
  • размер 200×200px или Fill Container для адаптивности;
  • Border Radius у верхних углов 12px (или заглушка-цвет).

Шаг 3. Контент:

  • Название — стиль Heading/H4, Max lines: 2 (обрезка длинных названий), gap 8px от изображения;
  • Описание (опц.) — Body/Medium, Max lines: 2–3, gap 4px;
  • ЦенаHeading/H3, цвет Primary/500, gap 12px.

Шаг 4. Кнопка:

  • инстанс компонента Button (Primary, Medium) с текстом «Добавить»;
  • gap 16px от цены;
  • Resizing: Fill Container (на всю ширину карточки).

Шаг 5. Настройка автолэйаута: Direction Vertical, Padding 16, Gap 8, Alignment Left, Resizing Fill Container.

Шаг 6. Создание компонента: выделить фрейм → Create Component → назвать «Product Card».

Шаг 7. Варианты и свойства (опц.): Size (Small/Medium/Large), State (Default/Hover/Selected), With Badge («Новинка», «Скидка»); настраиваемые свойства Image, Title, Price, Button Text.

Результат: один переиспользуемый компонент, который раскладывается в сетку каталога и адаптируется под ширину колонки (в практике №2 — около 167px при 2 колонках на iPhone 13).


13. Организация библиотеки дизайн-системы

Чтобы дизайн-системой было удобно пользоваться, компоненты нужно аккуратно структурировать.

13.1. Структура страниц и групп

  • Design System — основная страница (токены и компоненты);
  • Components/Base — базовые компоненты;
  • Components/Composite — композитные компоненты;
  • Screens — готовые экраны (отдельная страница).

13.2. Пример структуры

Design System Page
├── Colors
│ ├── Primary
│ ├── Secondary
│ ├── Neutral
│ └── Semantic
├── Typography
│ ├── Headings
│ ├── Body
│ └── UI Elements
├── Components
│ ├── Base
│ │ ├── Button
│ │ ├── Input
│ │ └── Icon
│ └── Composite
│ ├── Header
│ ├── ProductCard
│ └── SearchBar
└── Spacing & Elevation

13.3. Правила именования

  • Названия понятные и описательные;
  • единый стиль через слэши для категоризации: Button/Primary, Input/Text;
  • все варианты одного компонента — рядом, визуально сгруппированы;
  • группировать фреймами, оставлять воздух между группами, добавлять заголовки и описания, поддерживать актуальность и версионировать изменения.

14. Создание дизайн-системы с нуля (пошагово)

Соберём всё вместе — общий маршрут построения дизайн-системы.

  1. Исследование и планирование: анализ бренда/продукта, цели и требования, изучение лучших практик, план структуры.

  2. Создание дизайн-токенов:

    • Цвета: Primary/Secondary, нейтральная палитра, семантические цвета → Color Styles;
    • Типографика: выбор шрифтов, размеры и веса, line height → Text Styles;
    • Spacing: база (4 или 8px), шкала отступов;
    • Прочее: Border Radius, Elevation (Effect Styles), иконки.
  3. Базовые компоненты: Button (варианты, размеры, состояния), Input (типы и состояния), Icon, Badge, Avatar.

  4. Композитные компоненты: Header, Footer, ProductCard, Navigation, Modal, Toast.

  5. Организация в Figma: структура страниц, группировка, понятные имена, документация.

  6. Документирование: описания, примеры, принципы, Do’s and Don’ts.

  7. Тестирование и итерации: применение в реальных проектах, обратная связь, улучшения.

  8. Версионирование: отслеживание изменений, сохранение версий, миграционные гайды.

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


Краткие итоги

  1. Дизайн-система — это токены + базовые компоненты + композитные компоненты + документация; она даёт консистентность, скорость и масштабируемость.
  2. Дизайн-токены — атомарные значения (цвета, типографика, отступы, радиусы, тени), которые легко превращаются в код (JSON, CSS-переменные) и служат мостом к разработчикам.
  3. Цвета делятся на Primary, Secondary, Neutral и Semantic; семантические цвета (Success/Warning/Error/Info) несут смысл и должны дополнять текст, а не заменять его.
  4. Типографическая шкала и Spacing Scale (4/8/12/16/24/32) задают иерархию и ритм; значения берутся из шкалы, а не «на глаз».
  5. Elevation через тени создаёт глубину и иерархию: чем важнее элемент, тем больше тень (Elevation/1 → Elevation/4).
  6. Базовые компоненты (Button, Input) атомарны и универсальны; композитные (ProductCard, Header) собираются из базовых под конкретную задачу.
  7. Переиспользуемые компоненты (мастер + инстансы) и Auto Layout (Direction, Padding, Gap, Resizing) — основа быстрой и адаптивной работы.
  8. Дизайн-систему строят итеративно: от токенов к базовым компонентам, затем к композитным, с организацией библиотеки и документацией.

Контрольные вопросы

Для самопроверки и подготовки к экзамену ответьте на вопросы 16–30 из списка экзаменационных вопросов (exam_questions.md):

  1. Что такое дизайн-система и из каких основных компонентов она состоит? (вопрос 16)
  2. Объясните понятие «дизайн-токены» и приведите примеры. (вопрос 17)
  3. Какие типы цветов включаются в дизайн-систему и каково их назначение? (вопрос 18)
  4. Что такое семантические цвета и где они применяются? (вопрос 19)
  5. Опишите структуру типографической шкалы. (вопрос 20)
  6. Что такое Elevation и как он используется? (вопрос 21)
  7. В чём разница между базовыми и композитными компонентами? (вопрос 22)
  8. Опишите процесс создания кнопки с вариантами Primary/Secondary/Ghost. (вопрос 23)
  9. Какие состояния должен иметь Input и как они различаются визуально? (вопрос 24)
  10. Что такое переиспользуемые компоненты и почему они важны? (вопрос 25)
  11. Как организовать компоненты в библиотеке дизайн-системы? (вопрос 26)
  12. Объясните принцип работы Auto Layout для адаптивных компонентов. (вопрос 27)
  13. Какие параметры Auto Layout влияют на адаптивность? (вопрос 28)
  14. Что такое Spacing Scale и какие значения используются? (вопрос 29)
  15. Опишите процесс создания компонента Product Card. (вопрос 30)

Дополнительно (бонус): вопрос 54 — Design Tokens в контексте передачи разработчикам; вопрос 55 — процесс создания дизайн-системы с нуля.

Практическое закрепление: выполните практическую работу №2 — создайте компоненты Button, Input и Product Card, соберите экран «Каталог» на iPhone 13 (375×812) с Auto Layout и сделайте мини-прототип с одним переходом.