Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Юрий Ветров — Токены в дизайн-системах

Юрий Ветров — Токены в дизайн-системах

Один из самых простых способов реализации дизайн-системы в коде — токены. Это набор базовых переменных визуального языка (цвета, шрифты, отступы и т.п.), который передаётся в любой компонентный фреймворк. Это позволяет проще управлять визуальным стилем продуктов и дешевле внедрять на практике.

Yury Vetrov

May 27, 2019
Tweet

More Decks by Yury Vetrov

Other Decks in Design

Transcript

  1. ТЕРМИН РАЗМЫЛИ К ЧЕРТЯМ Называют всё что угодно – от

    библиотеки стандартных элементов в Sketch и странички с нарезанными скриншотами до зрелой платформы, действительно работающей на базе распространяемых компонентов со вшитым дизайном. Главный источник правды это сам продукт и нужно озаботиться тем, чтобы как задумано работал именно он.
  2. 2010Е Компоненты в коде (хотя кто-то делал и раньше). Работать

    надо с основным материалом среды – кодом.
  3. ДИЗАЙН ЧАСТО «ПЕРЕВИРАЕТСЯ» НА ПУТИ ИЗ МАКЕТОВ В РЕАЛИЗАЦИЮ Цепочка

    «гайдлайн → дизайн → вёрстка → реализация» – тупик, вечная ручная работа. Чтобы избавиться от кучи геморроя по внедрению, улучшению и поддержке продуктов, её нужно перевести в «гайдлайн = дизайн = вёрстка → реализация».
  4. КАК ЭТО РАБОТАЕТ визуальный язык → UI Kit → макеты

    (ТЗ) ↓ ↓ компоненты → вёрстка → реализация (сборка из готовых кусков)
  5. 2 ЕДИНЫЕ КОМПОНЕНТЫ В КОДЕ Единственный источник правды. Дизайн «вшит»

    в них, сервисы получают и обновляют их из единого репозитория.
  6. 3 ШАБЛОНЫ ДЛЯ ДИЗАЙНЕРОВ Быстро показать идею, высокоуровневые скетчи. В

    идеальной ситуации макеты не верстают, а собирают из единых компонентов.
  7. 1. МОДУЛЬНОСТЬ Позволяет сравнительно легко управлять большим количеством продуктов. Интерфейс

    строится по принципу слоёв абстракции: «переменные → базовые элементы интерфейса → компоненты для реализации конкретных задач → экраны продукта».
  8. 2. ПАРАМЕТРИЧНОСТЬ Изменение конкретных параметров, из которых строятся элементы интерфейса,

    позволяет добиться масштабируемости на продукты разных типов. Для этого мы используем переменные и миксины.
  9. 3. МИНИМУМ КОСТЫЛЕЙ Собирай элементы интерфейса из уже существующих переменных,

    а компоненты – из уже существующих элементов. Любые принимаемые нами решения должны вписываться в систему, жить по её правилам и потенциально быть готовыми к применению на любом из наших продуктов.
  10. 4. 4DP Так называемый «супер-пиксель». Краеугольный камень системы, на нём

    строится вся система размерностей. Мы мыслим исключительно цифрами, кратными 4-м.
  11. 5. АДАПТАЦИЯ Под мобильные (малые экраны) и сенсорные экраны (управление

    пальцем, нет мыши). Любые наши решения априори должны быть touch-friendly – это касается размеров элементов, действий по наведению и т.п. Исключения бывают для внутренних инструментов вроде нишевых интранет-сайтов. * *
  12. ТОКЕНЫ – ДЁШЕВО И СЕРДИТО Когда единый компонентный фреймворк не

    получается. Слой абстракции под компонентными фреймворками. PARADIGM PRODUCTIVITY МЕДИА B2B ПРОМО ПОЧТА НОВОСТИ MCS САЙТЫ ОБЛАКО КИНО BIZ ПИСЬМА КАЛЕНДАРЬ АВТО
  13. ОСНОВА ВИЗУАЛЬНОГО ЯЗЫКА Играя с набором параметров, мы можем быстро

    получить любой элемент. Например, простую кнопку:
  14. ТИПОГРАФИКА Все размеры и начертания мы храним в переменных. От

    проекта к проекту они могут меняться, но основные группы одни и те же.
  15. ТЕНЬ Элемент приподнят над базовым уровнем (кнопки, карточки) – часть

    лейаута или дополнительная информация к основному контенту.
  16. АКЦЕНТНАЯ КНОПКА За счет изменения параметра отвечающего за фон, мы

    можем сделать из обычной кнопки – акцентную.
  17. 1. СЕМАНТИКА Все переменные названы относительно задачи («цвет второстепенного фона»),

    а не просто визуального представления («светло-серый»). Это позволяет проще переопределять стиль – меняя значение, не нужно рефакторить вызов самих переменных. Правда, для расстояний и отступов это не сработает.
  18. СЕМАНТИКА $colorText: '#333333’, $colorTextSecondary: '#999999’, $colorBg: '#ffffff’, $colorBgSecondary: '#f0f0f0’, $sizeBase:

    4, $sizeGrid: 20, $paddingControlButton: 20, $marginIcon: 12, $fontH1: { fontSize: 24, lineHeight: 32, fontWeight: 700, marginBottom: 16, }, $fontParagraph: { fontSize: 15, lineHeight: 20, fontWeight: 400, marginBottom: 24, },
  19. 2. МИНИМУМ ПЕРЕМЕННЫХ (~200) В них проще разобраться и легче

    выбрать правильную, меньше избыточности. В некоторых фреймворках их тысячи, но мы пытались найти баланс между гибкостью и предсказуемостью.
  20. ЦВЕТА $colorText: #333333, $colorTextSecondary: #999999, $colorTextContrast: #FFFFFF, $colorBg: #FFFFFF, $colorBgSecondary:

    #F0F0F0, $colorBgContrast: #333333, $colorIcon: #333333, $colorIconSecondary: #C7C7C7, $colorIconContrast: #FFFFFF, $colorAccent: #005FF9, $colorAccentSecondary: #FF9E00, $colorLink: #005BD1, $colorLinkContrast: #FFFFFF, $colorLinkVisited: #528FDF, $colorSuccess: #28C75D, $colorError: #FF1100, $colorNotify: #FF9E00, $colorBgWarning: #FFFCE0, $colorRating: #FFD400, $colorTrueBlack: #000000, $colorTrueWhite: #FFFFFF, $colorState: #000000, $colorSocialVk: #4D75A2, $colorSocialOk: #EE8208,
  21. ШРИФТЫ $fontBody: { fontSize: 15, lineHeight: 20, fontWeight: 400, marginBottom:

    0, }, $fontH1: {}, $fontH2: {}, $fontH3: {}, $fontH4: {}, $fontParagraph: {}, $fontList: {}, $fontFootnote: {}, $fontLead: {}, $fontQuote: {}, $fontTableHeader: {}, $fontControl: {}, $fontControlLabel: {}, $fontTab: {}, $fontBadge: {},
  22. ОТСТУПЫ /** РАЗМЕРЫ ЭЛЕМЕНТОВ */ $sizeControlHeight: 40, $sizeControlButtonWidthMin: 130, $sizeControlLabelWidth:

    184, $sizeControlCheckHeight: 16, $sizePopupSmall: 420, /** ОТСТУПЫ ВНУТРИ ЭЛЕМЕНТОВ */ $paddingControlHorizontal: 12, $paddingControlVertical: 0, $paddingControlButton: 20, $paddingMenu: 8, $paddingTab: 0, /** ОТСТУПЫ МЕЖДУ ЭЛЕМЕНТАМИ */ $marginControl: 12, $marginFormLabelHorizontal: 16, $marginFormLabelVertical: 4, $marginIcon: 12, $marginChoice: 8, /** ИКОНКИ */ $sizeIconUI: 16, $sizeIconHeader: 20, /** ИЛЛЮСТРАЦИИ */ $sizeIllustrationS: 48,
  23. ДЕКОР /** ГРАНИЦЫ ЭЛЕМЕНТОВ */ $sizeBorderWidth: 1, $sizeBorderWidthTab: 2, $sizeBorderWidthBar:

    4, $sizeBorderWidthAccent: 8, $sizeBorderRadius: 2, /** ТОНИРОВАНИЕ ЭЛЕМЕНТОВ */ $toneValueX1: 0.04; $toneValueX2: 0.08; $toneValueBase: 0.48; $toneValueViewer: 0.88; $toneValueToolbar: 0.24; /** ТЕНИ */ $depth0:, $depth1, $depth2, $depth3: 0 16px 48px 0 rgba(0, 0, 0, 0.48), $depthInset,
  24. 3. НАСЛЕДОВАНИЕ Чтобы уменьшить количество переменных и повысить управляемость, многие

    значения наследуются или считаются от единой шкалы: отступы, цвета, типографика, прозрачности. Шкала – это пространство возможных решений. Конкретная переменная – решение для конкретной ситуации.
  25. ШКАЛА const sizeBase = 4; const x0 = 0; const

    x025 = sizeBase / 4; const x05 = sizeBase / 2; const x1 = sizeBase; const x2 = sizeBase * 2; const x3 = sizeBase * 3; const x4 = sizeBase * 4; const x5 = sizeBase * 5; const x6 = sizeBase * 6; const x8 = sizeBase * 8; const x10 = sizeBase * 10; const x12 = sizeBase * 12; const x15 = sizeBase * 15; const x20 = sizeBase * 20; const sizeGrid = 20;
  26. РЕАЛЬНЫЕ СИТУАЦИИ get sizeControlHeight() { return this.x8; }, get sizeProgress()

    { return this.x1; }, get sizeProgressScroll() { return this.sizeProgress + this.sizeBase * 2; }, get sizeDotBullet() { return this.x1; }, get paddingControlHorizontal() { return this.x3; }, get paddingControlVertical() { return this.x0; }, get paddingMenu() { return this.x2; }, get paddingTag() { return this.x2; },
  27. 4. АДАПТИВНОСТЬ Подход похож на media queries – есть несколько

    разрешений, для адаптивных переменных указываются разные значения для них. На старте делали простой вариант – отдельные файлы с токенами для каждого разрешения.
  28. BREAKPOINTS thresholds: { touch: 320, tablet: 768, desktopS: 1024, desktopM:

    1280, default: 1366, desktopL: 1680, }, fontH1: { default: { ...touch.fontSize6, fontWeight: 700, marginBottom: x4, }, tablet: { ...fontSize6, fontWeight: 700, marginBottom: x4, }, desktopS: { ...fontSize6, fontWeight: 700, marginBottom: x3, }, desktopM: { ...fontSize7, fontWeight: 700, marginBottom: x4, }, },
  29. 5. ТЕМАТИЗАЦИЯ Для разных линеек продуктов свои темы оформления. Такая

    тема наследует базовую, но меняет значения некоторых переменных. Это пригодится при применении тёмной темы – видно, что для некоторых компаний это повод начать использовать токены.
  30. НАСЛЕДОВАНИЕ В ТЕМАХ /** BASE */ $sizeBorderRadius: 2, $sizeControlHeight: 32,

    $fontH1: { default: { ...fontSize6, fontWeight: 700, marginBottom: x4, }, /** MEDIA */ $sizeBorderRadius: 4, $sizeControlHeight: 40, $fontH1: { default: { ...fontSize7, fontWeight: 700, marginBottom: x4, }, /** PROMO */ $sizeBorderRadius: 8, $sizeControlHeight: 48, $fontH1: { default: { ...fontSize8, fontWeight: 700, marginBottom: x5, },
  31. ПЕРЕДАЁМ ТОЛЬКО ВНЕШНИЙ ВИД Цельный компонент включает в себя как

    минимум внешний вид, логику поведения, структуру данных. Токены помогают только с первым – остальное всё равно нужно воссоздавать в альтернативных фреймворках.
  32. 1. МОДЕЛЬНЫЕ ПРОДУКТЫ Выделили систему из их дизайна. Масштабируется уже

    проверенный на практике дизайн, оптимизированный с помощью аналитики и пользовательских исследований. Накануне и сразу после релиза проводится множество экспериментов и тестов, после которых дизайн много раз корректируется.
  33. 2. ОПИСАНИЕ ВИЗУАЛЬНОГО ЯЗЫКА Черновик в Confluence. Помог зафиксировать решения

    перед тем, как они попадут в код и живой гайдлайн. Важно не задерживаться на этом этапе, это только черновик – он моментально устаревает и не решает задачу унификации на технологическом уровне.
  34. 4. ВЫДЕЛЕНИЕ ПЕРЕМЕННЫХ Постепенно идём по всем элементам интерфейса в

    UI Kit и описываем переменные, которые нужны для их вёрстки. Разбиваем переменные на категории (цвета, типографика, размеры и отступы, состояния, сетка, тени и глубина, границы и скругления, анимация). Предлагаем систему именования, холиварим. Рефакторим для оптимизации.
  35. 5. ТОКЕНЫ И ГЕНЕРАТОР Популярные форматы описания токенов – JSON,

    YAML, TypeScript (наш выбор). Определиться с форматами экспорта для генератора (CSS-in- JS, PostCSS, SASS, LESS и т.п.).
  36. КОМПОНЕНТНЫЕ ФРЕЙМВОРКИ Они есть, но мы перестали биться за единый.

    Один из них считаем модельным, мотивируем использовать.
  37. ТОКЕНЫ – ДЁШЕВО И СЕРДИТО Переход на них понятнее и

    быстрее. Его можно добиться постепенным рефакторингом.
  38. КОМАНДА Федеративная модель – дизайнеры и разработчики из разных продуктов

    выделяют 15-20% своего времени на поддержку дизайн-системы. Есть ключевой дизайнер и разработчик, которые ведут план работ.
  39. МАЛО КТО ДЕЛАЕТ Странно, но примеров на рынке с токенами

    не так много. Хотя это самый простой и быстрый способ стартовать.
  40. СВЯЗКА С ИНСТРУМЕНТАМИ Компоненты в коде и символы/компоненты в Sketch/Figma

    не связаны, поддерживаются параллельно. Но попытки есть.
  41. 1. ВЫШЕ СКОРОСТЬ СБОРКИ МАКЕТОВ И ПРОДУКТОВ Можно уделить больше

    внимания самому продукту, а не просто рисованию экранов – собирать новый интерфейс стало быстрее. Это удобно для пользователя – группа схожих продуктов работает одинаково понятно и привычно. А также хорошо для бренда – вся линейка сервисов выглядит целостной.
  42. 2. ЛУЧШЕ КАЧЕСТВО ПРОДУКТОВ Контролировать большой пул проектов проще, когда

    они устроены одинаково. Вместо сотни отдельных проектов вы следите за парой гайдлайнов.
  43. 3. КУМУЛЯТИВНЫЙ ЭФФЕКТ ОТ УДАЧНЫХ ПРОДУКТОВЫХ РЕШЕНИЙ Например, подняв глубину

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

    взять существующий фреймворк типа Theo, их хватает. Дизайнеры сами могут управлять файлом с токенами, что ускоряет цепочку обновлений. Инструменты дизайна не используют токены, но когда начнут – не придётся поддерживать компоненты в коде и дизайнерские шаблоны параллельно.
  45. CREDITS: ДИЗАЙН ЕВГЕНИЙ БЕЛЯЕВ МАРИЯ БОБРОВА ЮРИЙ ВЕТРОВ АРТЁМ ГЛАДКОВ

    ГЕВОРГ ГЛЕЧЯН ПОЛИНА ГРИГОРЬЕВА ЕВГЕНИЙ ДОЛГОВ КОНСТАНТИН ЗУБАНОВ АЛЕКСЕЙ КАНДАУРОВ АЛЕКСАНДР КИРОВ ДМИТРИЙ ОСАДЧУК АЛЕКСЕЙ СЕРГЕЕВ ПАВЕЛ СКРИПКИН СВЕТЛАНА СОЛОВЬЁВА АНДРЕЙ СУНДИЕВ ЕВГЕНИЙ ФЕРУЛЁВ ВЯЧЕСЛАВ ЯШКОВ
  46. CREDITS: РАЗРАБОТКА ИЛЬЯ БУРЛАК ДМИТРИЙ ДОРОФЕЕВ АНТОН ЕПРЕВ ВИКТОРИЯ КАМОЛДИНОВА

    КОНСТАНТИН ЛЕБЕДЕВ АРТЁМ МЕЗИН АЛЕКСЕЙ СУДИЛОВСКИЙ МАРИНА ТИТОВА СТАНИСЛАВ ТУГОВИКОВ АРТУР УДАЛОВ ЕГОР УТРОБИН
  47. CREDITS: РАЗРАБОТКА АЛЕКСАНДР БЕКБУЛАТОВ ДМИТРИЙ БЕЛЯЕВ ВИТАЛИЙ ВАСИН ПАВЕЛ ВДОВЦЕВ

    КОСТЯ ВОРОЖЕЙКИН ЕВГЕНИЙ ИВАНОВ АНДРЕЙ КУСИМОВ СТАНИСЛАВ МИХАЛЬСКИЙ СЕРГЕЙ НОЖКИН АНТОН ПОЛЕЩУК БОРИС РЕБРОВ ПАВЕЛ РЫБИН АРСТАН ТОРЕГОЖИН МАКСИМ ТРУСОВ ПАВЕЛ ЩЕРБИНИН
  48. P.S. Многие спрашивают, с какого размера компании имеет смысл начинать

    дизайн-систему. Токены помогают подстелить соломку даже если вы совсем маленькие, а потом, когда подрастёте – нарастить мышцы трушным компонентным фреймворком.