Прежде чем прийти к текущей архитектуре, я потратила немало времени на изучение разных подходов к построению дизайн-систем. Я смотрела, как это делают лидеры индустрии:
Material Design от Google,
Carbon от IBM,
Polaris от Shopify,
Fluent от Microsoft. Каждый из них предлагает свою философию, и у всех есть чему поучиться.
Но когда дело дошло до выбора конкретной схемы для своей системы, я столкнулась с ключевым вопросом:
как называть токены?Самый популярный соблазн: t-shirt sizing (XS, S, M, L, XL)
Этот подход кажется очень логичным и «дизайнерским». Вместо сухих цифр — понятные аналогии с размерами одежды. spacing-m, font-size-xl, radius-s. Звучит красиво, правда?
Я долго примеряла этот подход к своей системе. И вот с какими проблемами столкнулась на практике:
1. Потеря семантической нагрузкиКогда я вижу font-size-xl, я понимаю только одно: «этот текст большой». Но почему он большой? Это заголовок самого высокого уровня? Это акцидентный текст в hero-блоке? Или просто крупная подпись?
T-shirt sizing говорит о размере, но молчит о смысле. В моей системе мне важно, чтобы дизайнер, беря токен H1, понимал: «это главный заголовок страницы, и он не может использоваться где попало». Цифры (H1, B2) в моем случае несут именно эту смысловую нагрузку — они привязаны к иерархии.
2. Бесконечная шкала и потеря контекстаВ какой-то момент у тебя заканчиваются буквы. Сначала идет XS, S, M, L, XL, XXL, XXXL… А что дальше? В сложных интерфейсах, особенно с адаптивностью, требуется гораздо больше градаций, чем может дать алфавит. В моей системе есть H1 (очень крупный), H5 (мелкий заголовок), B4 (мелкий текст), D2 (микро-текст). Попробуй назвать это в T-shirt логике: heading-xxl, heading-xs, body-xs, description-xxs? Начинается путаница уже на уровне названий.
3. «Костыль» в виде плюсов (и где прячется смысл)В какой-то момент я заметила, что некоторые дизайнеры, работающие с t-shirt системой, начинают добавлять к буквам плюсы: m+, l+, xl–. Это попытка сделать шкалу более гибкой, не ломая её структуру.
Например, появляется отступ, который чуть больше стандартного m, но явно не дотягивает до l. Вместо нового токена дизайнер пишет m+. Формально — расширение градации. Но на практике возникает проблема:
сам токен перестаёт что-либо объяснять.
Что значит m+? Это:
- на 4px больше базового m?
- на 8px?
- только для мобилок?
- только для карточек?
Без пояснения ответа нет. Приходится создавать
отдельную инструкцию:
«m+ используется для компенсационных отступов внутри карточек на планшете, значение — 20px».
То есть смысл токена вынесен за пределы Figma — в гугл-док, в Notion, в устные договорённости. Дизайнер видит m+, но чтобы понять, что это и когда применять, должен лезть в инструкцию.
При моём подходе смысл остаётся внутри системы.Я не использую абстрактные m+. У меня есть, например, card-padding или H1. Да, к ним тоже нужны пояснения. Но эти пояснения работают иначе:
- H1 — «заголовок самого высокого уровня, только один на страницу». Это условие использования, которое можно написать прямо в описании переменной в Figma.
- card-padding — «внутренний отступ карточки товара, на каждом брейкпоинте у него свое значение, переключается модом». Тоже можно указать в поле description.
Разница в том, где хранится контекст.- В T-shirt с плюсами: токен (m+) — это загадка. Контекст — в отдельном документе.
- В ролевом подходе: токен (card-padding) сам называет свою роль. Контекст — тут же, в Figma, рядом с переменной.
Пояснения нужны всегда. Но когда токен уже содержит в имени «зачем», а не только «насколько», эти пояснения становятся точечными уточнениями, а не обязательным путеводителем.
Что я выбрала в итогеПосле экспериментов я отказалась от t-shirt sizing как от неподходящего инструмента именования токенов и выстроила систему на
трёх уровнях, где каждый токен честно говорит о своей природе и месте в иерархии.
- Примитивы (размеры, отступы) у меня называются просто цифрами: Size-16, Hight-24. Это чистые числа, без оценок «большой» или «маленький».
- Семантические токены (типографика) называются по ролям: H1, H2, B1, S2. Цифра здесь показывает уровень иерархии, а буква — тип контента (Heading, Body, Subtitle, Description).
- Контекстуальные токены (компоненты) называют по формуле: {компонент}/{вариант}/{используемый элемент}-{состояние}. Например, button/primary/bg-hover или checkbox/icon/disabled/.
Эта схема оказалась для меня самой прозрачной. Она масштабируется на любые сложные интерфейсы, легко читается и разработчиками, и дизайнерами, и не требует каждый раз расшифровки «а что же значит эта буква».