Темизация и дизайн-системы
Цвета, шрифты, отступы и стили компонентов задаются один раз и используются везде, а не выбираются заново в каждом widget. Дизайн-система — это разница между приложением, которому можно сменить оформление за вечер, и приложением, которому нельзя.
Почему это важно. Захардкоженные стили не мешают до первого серьёзного изменения — тёмная тема, ребрендинг, увеличенный базовый размер шрифта, — а потом обнаруживаются сразу везде. Стоимость исправления растёт с каждым выпущенным экраном.
Что нужно понимать
- Где принимается решение о внешнем виде и единственное ли это место
- Что токен значит по смыслу, а не какой цвет за ним оказался
- Как тема доходит до widget и что происходит, когда она меняется
- Какие компоненты принадлежат системе, а какие — фиче
- Называют ли дизайнер и разработчик одни и те же вещи одинаково
Ключевые темы
Токены
- Семантические имена —
surface,onSurface,danger— вместоgrey200 - Цветовые схемы и то, как собрать схему, которая переживёт тёмную тему
- Шкала типографики и почему фиксированный размер шрифта — это баг с точки зрения доступности
- Шкалы отступов и радиусов и отказ от произвольных чисел
- Elevation и тени как токены
Темизация во Flutter
ThemeData, темы компонентов и настройка стиля один раз- Расширение темы собственным набором токенов
- Светлая, тёмная и высококонтрастная темы
- Чтение темы вместо импорта констант
- Где заканчиваются Material и Cupertino и начинается ваша система
Дизайн-система на практике
- Одна точка входа: фича импортирует UI-кит и больше ничего
- Компоненты с небольшим, продуманным API
- Никаких сырых цветов, текстовых стилей и радиусов внутри кода фич
- Правило держится на линтере, а не на code review
- Версионирование и изменение компонента, который используется на десятках экранов
Работа с дизайном
- Общий словарь между Figma и кодом
- Что должно входить в handoff
- Расхождение дизайна и реализации и как его вовремя заметить
Уровни
| Уровень | Как это выглядит |
|---|---|
| Junior | Берёт значения из темы вместо захардкоженных и существующие компоненты вместо новых. |
| Middle | Расширяет тему токенами, собирает переиспользуемые компоненты, полноценно поддерживает тёмную тему. |
| Senior | Проектирует систему токенов и API компонентов, закрепляет границу инструментами и может сменить оформление продукта, не трогая фичи. |
Практика
Для начала
-
Найдите захардкоженные стили Поищите в коде фич
Color(иTextStyle(и перенесите каждый случай в тему. -
Честно поддержите тёмную тему Включите её и почините всё, что не читается, а не только то, что падает.
-
Считайтесь с масштабом текста Выставьте системный размер шрифта на максимум и почините то, что сломалось.
Глубже
-
Соберите расширение с токенами Добавьте
ThemeExtensionдля токенов, которых нет в Material, и начните им пользоваться. -
Спроектируйте API компонента Сделайте кнопку, которая используется по всему приложению и параметры которой не позволяют получить неправильный результат.
-
Закрепите границу Добавьте правило линтера, которое ломает сборку, когда код фичи создаёт сырой цвет.
Проверьте себя
- Сколько мест в вашем приложении решают, как выглядит «primary»?
- Что ломается при самом большом системном размере шрифта?
- Смогли бы вы сменить фирменный цвет сегодня и сколько времени это заняло бы?
- Какие из ваших компонентов относятся к дизайн-системе, а какие просочились в неё?
- Имена ваших токенов описывают роль или внешний вид?
- Как вы заметите, что реализация разошлась с дизайном?
Материалы
- Material 3 design system — справочник по семантическим ролям цвета и шкалам типографики, полезный, даже если приложение не выглядит как Material. Раздел про цветовую систему объясняет, зачем нужны имена-роли.
- Use themes to share colors and font styles —
официальное руководство по
ThemeDataи темам компонентов. - ThemeExtension — как типобезопасно добавить в тему собственные токены. Механизм, которым стоило бы воспользоваться большинству самодельных классов с токенами.
- Design Tokens Community Group — складывающийся стандарт описания токенов в виде, понятном и дизайн-инструментам, и коду.
- Refactoring UI — для разработчиков, которым приходится принимать визуальные решения без дизайнера. Конкретные правила вместо вкусовщины.