<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Мыслью по древу</title><subtitle>Мысли про дизайн, технологии в дизайне, управление дизайнерами, около-дизайн и совсем не дизайн. 

Автор канала: Сергей Мухин. Арт-директор.</subtitle><author><name>Мыслью по древу</name></author><id>https://teletype.in/atom/uxflow</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/uxflow?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@uxflow?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=uxflow"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/uxflow?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-06-27T11:19:59.144Z</updated><entry><id>uxflow:Yie_nNZKaYF</id><link rel="alternate" type="text/html" href="https://teletype.in/@uxflow/Yie_nNZKaYF?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=uxflow"></link><title>Наследуемые свойства в SDUI платформе ВкусВилл. Часть 2: Активность</title><published>2024-04-01T12:34:21.774Z</published><updated>2024-04-01T12:34:21.774Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/aa/37/aa374d06-8bab-446a-a504-2552a1e66970.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/dc/7f/dc7fb4d8-0998-4faf-9c90-b0faa09458e5.png&quot;&gt;В предыдущей части я пытался разобрать с проблему сокращения контракта в SDUI приложении, а также поговорить о контекстах — одном из наследуемых свойств нашей платформы для дизайна, которое призвано решить эту проблему. Теперь же настала очередь ещё одной группы наследуемых свойств, которые кардинально меняют подход к работе с состояниями и отвечают за активность виджетов.</summary><content type="html">
  &lt;figure id=&quot;6sHq&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/dc/7f/dc7fb4d8-0998-4faf-9c90-b0faa09458e5.png&quot; width=&quot;772&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Hwpu&quot;&gt;В &lt;a href=&quot;https://teletype.in/@uxflow/MangoContext&quot; target=&quot;_blank&quot;&gt;предыдущей части &lt;/a&gt;я пытался разобрать с проблему сокращения контракта в SDUI приложении, а также поговорить о контекстах — одном из наследуемых свойств нашей платформы для дизайна, которое призвано решить эту проблему. Теперь же настала очередь ещё одной группы наследуемых свойств, которые кардинально меняют подход к работе с состояниями и отвечают за активность виджетов.&lt;/p&gt;
  &lt;p id=&quot;AKtC&quot;&gt;Но сначала хотелось бы отступить чуть назад. После выхода предыдущей части я получил обратную связь, что тема слишком сложна и не всё достаточно полно удалось раскрыть, поэтому давайте сделаем ещё сложнее 😁&lt;/p&gt;
  &lt;h2 id=&quot;dBgt&quot;&gt;Из чего состоят виджеты платформы&lt;/h2&gt;
  &lt;p id=&quot;65ru&quot;&gt;Для начала сразу определимся, что типичные атомарные структуры, такие как атом, молекула и организм, мы оставим для дизайн-системы. Сейчас мы поговорим о составе виджетов в контексте нашей дизайн-платформы. На основе этих виджетов уже можно создать более-менее традиционную дизайн-систему с кнопками и панелями. Наша платформа не использует такие термины, и понятия “кнопка” еще не существует на данном уровне абстракции.&lt;/p&gt;
  &lt;p id=&quot;qTCb&quot;&gt;А что есть? А есть платформенные виджеты. В нашем случае существует четыре категории таких виджетов:&lt;/p&gt;
  &lt;ol id=&quot;QOJ7&quot;&gt;
    &lt;li id=&quot;g2R1&quot;&gt;&lt;strong&gt;Примитивы &lt;/strong&gt;— Суперпростые нефункциональные виджеты. Сюда входят вывод текста, иконки, картинки, свитчер слайдер и т. д.&lt;/li&gt;
    &lt;li id=&quot;CxIR&quot;&gt;&lt;strong&gt;WidgetWrapper &lt;/strong&gt;— это по сути аналог frame из фигмы. Умеет как верстать виджеты внутри себя, задавать отступы, gap и т. п., так и окрашивать себе фон, обводку, менять скругления углов, управлять собственным позиционированием.&lt;/li&gt;
    &lt;li id=&quot;aQYK&quot;&gt;&lt;strong&gt;Пресеты&lt;/strong&gt; на клиенте. Это те сущности, которые по каким-то причинам нельзя «собрать» на виджетах из пункта 1 и 2. Например, контейнеры всплывающих окон, карта, списки и сетки, контейнер webview.&lt;/li&gt;
    &lt;li id=&quot;PimW&quot;&gt;&lt;strong&gt;Экран &lt;/strong&gt;— контейнер со спец. слотами, всегда является корневым для верстки экрана приложения.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;GFUL&quot;&gt;&lt;strong&gt;Важные особенности:&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;JwDo&quot;&gt;— За взаимодействие всегда отвечает WidgetWrapper. Он поддерживает различные типы взаимодействия, такие как: “статичный” (без взаимодействия), “нажми на меня” (фактически превращает в кнопку), “выдели меня” (checkbox), “выбери один из” (radio).&lt;/p&gt;
  &lt;p id=&quot;kpCY&quot;&gt;— Виджеты из 1-й группы не являются интерактивными сами по себе. Например, чтобы тот же переключатель мог переключаться, его необходимо обязательно поместить в WidgetWrapper с подходящим типом интерактивности.&lt;/p&gt;
  &lt;p id=&quot;3T4g&quot;&gt;— Визуализация взаимодействия также осуществляется WidgetWrapper, причем универсальным методом (пока это наложение цвета). Т. е. далее в виджетах нам не нужно прорисовывать hover, press и disable, всё делается платформой автоматически.&lt;/p&gt;
  &lt;p id=&quot;FDti&quot;&gt;— Все свойства настраиваются прямо в фигме. &lt;strong&gt;Верстка выгружается в приложение автоматически. &lt;/strong&gt;Разработчику остается только приделать бизнес-логику к готовым шаблонам.&lt;/p&gt;
  &lt;h2 id=&quot;AD4B&quot;&gt;Свойство active&lt;/h2&gt;
  &lt;p id=&quot;QoPz&quot;&gt;Важно запомнить, что это не то же самое, что и одноименные псевдокласс и свойство в CSS. В этом случае имеется в виду абстрактная “активность”. Активный виджет может быть интерпретирован по-разному: выбранный checkbox, активная вкладка, кнопка фильтров с активными фильтрами..&lt;/p&gt;
  &lt;p id=&quot;07sE&quot;&gt;&lt;strong&gt;Как это работает&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;FKnH&quot;&gt;У WidgetWrapper и примитивов есть свойство active, которое может принимать значения true или false. Также существует логическое свойство active-inherit, которое, если установлено в true, делает свойство active данного виджета наследуемым от родителя.&lt;/p&gt;
  &lt;p id=&quot;SRGw&quot;&gt;У свойства active есть зависимые свойства. Например, active-background у враппера, active-icon у примитива IconBox и т.п. Даже есть active-context (привет&lt;a href=&quot;https://teletype.in/@uxflow/MangoContext&quot; target=&quot;_blank&quot;&gt;первой части&lt;/a&gt;).&lt;/p&gt;
  &lt;p id=&quot;6O1q&quot;&gt;Тут также важно сказать, что хоть дизайнер и настраивает все эти свойства, active управляется не из макета (верстки) а бизнес-логикой (с сервера).&lt;/p&gt;
  &lt;h2 id=&quot;qkrR&quot;&gt;Примеры&lt;/h2&gt;
  &lt;p id=&quot;wKWt&quot;&gt;Ну что, достаточно теории, давайте посмотрим, как всё это работает на практике.&lt;/p&gt;
  &lt;p id=&quot;hipC&quot;&gt;&lt;strong&gt;Пример1. Кнопка&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;l9W0&quot;&gt;Чтобы собрать кнопку, нам потребуется WidgetWrapper, виджет иконки и виджет текста. Собираем, настраиваем параметры, ставим тип интерактивности — press и получаем кнопку.&lt;/p&gt;
  &lt;figure id=&quot;Ezsa&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://leonardo.osnova.io/c38705cc-389e-5cfe-b575-a943ab42ce59/-/preview/1300/-/format/webp/&quot; width=&quot;646&quot; /&gt;
    &lt;figcaption&gt;Как выглядит кнопка после предварительной сборки&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;stZ1&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://leonardo.osnova.io/d75b99cb-a58c-5226-b64d-6f039d2370d6/-/preview/1000/-/format/webp/&quot; width=&quot;516&quot; /&gt;
    &lt;figcaption&gt;Структура кнопки&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;MD7A&quot;&gt;Теперь, допустим, мы хотим из этого шаблона получить зеленую кнопку «Фильтры». Меняем текст и иконку и выбираем нужный контекст (context=green).&lt;/p&gt;
  &lt;figure id=&quot;Bhcn&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://leonardo.osnova.io/1c52046b-4fa9-5068-a1f4-e5bafc9543a7/-/preview/1300/-/format/webp/&quot; width=&quot;322&quot; /&gt;
    &lt;figcaption&gt;Кнопка с зеленым контекстом&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;plzW&quot;&gt;А теперь последний штрих — настроим активные и обычные значения токенов и выберем активную иконку. И привяжем active к состоянию есть\нет активные фильтры.&lt;/p&gt;
  &lt;figure id=&quot;HxU9&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://leonardo.osnova.io/e8c696f6-eddf-5856-bce8-0a9d983dfc44/-/preview/2100/-/format/webp/&quot; width=&quot;635&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;LHI9&quot;&gt;&lt;strong&gt;Пример2. Checkbox &amp;amp; Radiobutton&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;BKE8&quot;&gt;Структура очень похожая на кнопку. Также враппер, иконка, текст. Но тип интерактивности уже выставить нужно check. Так с каждым нажатием на враппер будет переключаться собственное свойство active.&lt;/p&gt;
  &lt;figure id=&quot;YzFR&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://leonardo.osnova.io/173a9557-3907-582f-b98d-374acf9722a7/-/preview/1100/-/format/webp/&quot; width=&quot;267&quot; /&gt;
    &lt;figcaption&gt;Структура чекбокса&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;RCXH&quot;&gt;Получаем шаблон чекбокса.&lt;/p&gt;
  &lt;figure id=&quot;bAJr&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://leonardo.osnova.io/2047e54c-3013-5778-9ac8-303e3c7e6489/-/preview/1300/-/format/webp/&quot; width=&quot;440&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Hvsr&quot;&gt;Но теперь нам хочется, чтобы активный чекбокс был акцентным цветом. Для этого нужно поменять active-context у виджета иконки на green-accent. Получаем вот такое поведение.&lt;/p&gt;
  &lt;figure id=&quot;Bsxi&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://leonardo.osnova.io/c8bdfe74-b5e7-5fe4-9f72-18b703d5ef09/-/preview/1300/-/format/webp/&quot; width=&quot;478.5&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;qdvx&quot;&gt;Чтобы чекбокс превратился в Radiobutton, нужно поменять иконку на подходящую а также изменить тип интерактивности на radio. Теперь если, скажем, три таких виджета объединить во враппер, они будут работать как привычная всем группа радио-кнопок.&lt;/p&gt;
  &lt;figure id=&quot;2q6J&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://leonardo.osnova.io/a307ccf2-c2c2-5c2c-955a-b982a686a339/-/preview/1000/-/format/webp/&quot; width=&quot;337&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;i7xB&quot;&gt;&lt;strong&gt;Пример 3. Segment control.&lt;/strong&gt;&lt;/p&gt;
  &lt;figure id=&quot;kO9T&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://leonardo.osnova.io/7a99e1c1-5fcc-55ff-8080-401a0dd894cb/-/preview/2100/-/format/webp/&quot; width=&quot;1195&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;0gBK&quot;&gt;Чтобы сделать такую панель, нам просто нужно использовать знания из прошлых примеров. Собираем сегмент из враппера, иконки и текста.&lt;/p&gt;
  &lt;figure id=&quot;xtMn&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://leonardo.osnova.io/e669018c-e829-555c-a825-3fe04c9a0159/-/preview/2100/-/format/webp/&quot; width=&quot;1928&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;7xNu&quot;&gt;Всё как в кнопке, только с чуть другими стилями. И тип взаимодействия — radio. Оборачиваем в ещё один враппер, чтобы сегменты переключались в рамках группы, и получаем необходимый виджет. А переключая контексты, можем раскрашивать, как нам нравится.&lt;/p&gt;
  &lt;figure id=&quot;yQr3&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://leonardo.osnova.io/68b902be-9aeb-5ebd-9dfd-4e48eea0019b/-/preview/1300/-/format/webp/&quot; width=&quot;986&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;wQqd&quot;&gt;Неактивность (disable)&lt;/h2&gt;
  &lt;figure id=&quot;Djzh&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://leonardo.osnova.io/ef6fe1ea-a41a-5b93-b532-a14e903f52c1/-/preview/2100/-/format/webp/&quot; width=&quot;2099&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Ri8a&quot;&gt;Хотелось бы упомянуть, как в нашей системе реализовано свойство disable. Это отдельный наследуемый параметр, с несколько особенной логикой наследования. При установке параметра disable=true блокируется интерактивность у выбранного виджета и всех его «детей». Однако, значение их собственного свойства disable не перезаписывается. А для визуального отображения используется специальный контекст — &lt;strong&gt;inactive&lt;/strong&gt;.&lt;/p&gt;
  &lt;figure id=&quot;6NSF&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://leonardo.osnova.io/65b3ee65-b777-5f46-9db3-2fa865f9e1d5/-/preview/2100/-/format/webp/&quot; width=&quot;1052&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;zIDa&quot;&gt;Это все наследуемые свойства на текущий момент. Другие интересные функции нашей дизайн-платформы я постараюсь описать в следующих статьях. Но вы можете не ждать выхода большого текста, а подписаться на мой телеграм-канал, и узнавать больше о развитии дизайнерской платформы ВкусВилл, SDUI, а также анонсы выступлений на митапах. &lt;a href=&quot;https://t.me/uxflow&quot; target=&quot;_blank&quot;&gt;https://t.me/uxflow&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>uxflow:MangoContext</id><link rel="alternate" type="text/html" href="https://teletype.in/@uxflow/MangoContext?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=uxflow"></link><title>Наследуемые свойства в SDUI платформе ВкусВилл. Часть 1: Контекст</title><published>2024-02-13T07:21:26.113Z</published><updated>2024-02-13T07:21:26.113Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/aa/37/aa374d06-8bab-446a-a504-2552a1e66970.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/dc/7f/dc7fb4d8-0998-4faf-9c90-b0faa09458e5.png&quot;&gt;Концепция была разработана в рамках работы над дизайн-платформой для SDUI приложения ВкусВилл , и основной задачей было сократить количество параметров и возможных состояний виджетов, уменьшив таким образом дерево объектов, но при этом сохранить вариативность и управляемость. В дальнейшем, под платформой понимается решение, которое обеспечивает реализацию всех SDUI функций, т.е. технологии, а под дизайн-системой - решение по структурированию, иерархизации и оформлению пользовательских виджетов (пресетов).</summary><content type="html">
  &lt;figure id=&quot;7FXR&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/dc/7f/dc7fb4d8-0998-4faf-9c90-b0faa09458e5.png&quot; width=&quot;772&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;SBSg&quot;&gt;Концепция была разработана в рамках работы над дизайн-платформой для SDUI приложения ВкусВилл , и основной задачей было сократить количество параметров и возможных состояний виджетов, уменьшив таким образом дерево объектов, но при этом сохранить вариативность и управляемость. В дальнейшем, под платформой понимается решение, которое обеспечивает реализацию всех SDUI функций, т.е. технологии, а под дизайн-системой - решение по структурированию, иерархизации и оформлению пользовательских виджетов (пресетов).&lt;/p&gt;
  &lt;p id=&quot;T7jj&quot;&gt;О том, как применить подобный подход к цветовой семантике без SDUI на примере текущего приложения “ВкусВилл”, я писал в своем &lt;a href=&quot;https://t.me/uxflow/33&quot; target=&quot;_blank&quot;&gt;телеграм-канале.&lt;/a&gt;&lt;/p&gt;
  &lt;h2 id=&quot;9J7I&quot;&gt;Зачем нужны наследуемые свойства&lt;/h2&gt;
  &lt;p id=&quot;tX3B&quot;&gt;Чтобы ответить на этот вопрос, нужно сначала разобраться, что такое SDUI. SDUI (Server Driven User Interface) - это концепция пользовательского интерфейса, управляемого сервером. Основная часть этой концепции относится не столько к дизайну, сколько к работе с данными и обработке действий пользователя. В традиционных приложениях вся обработка происходит на стороне клиента, включая большую часть бизнес-логики.&lt;/p&gt;
  &lt;p id=&quot;dgI4&quot;&gt;В SDUI-приложении клиент настолько “тупой”, что виджетам остается только отправлять события на сервер (например, “На меня нажали”) и ждать от него инструкций о том, как должен измениться интерфейс после этого действия. Вся бизнес-логика в этом случае выносится на серверную сторону.&lt;/p&gt;
  &lt;p id=&quot;cMtV&quot;&gt;А клиент умеет только работать с контрактом. Контракт - это чаще всего JSON-дерево объектов и их параметров. Такой подход позволяет вносить изменения на клиенте без выпуска новых версий приложения в магазины приложений. Чем более вариативен отрисовщик и чем более управляем интерфейс, тем больше видов изменений можно внести без выпуска новой версии.&lt;/p&gt;
  &lt;figure id=&quot;g0wk&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/37/86/3786aa00-c361-420c-8e1b-a19589e938ed.png&quot; width=&quot;1280&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;FKna&quot;&gt;Если каждый раз при изменении передавать все параметры измененных виджетов, используя классические настройки, потребуется передавать большое количество данных дерева объектов и их параметров для обновления интерфейса. Именно для оптимизации этого процесса, ускорения реакции интерфейса на изменения и была разработана концепция наследуемых свойств.&lt;/p&gt;
  &lt;p id=&quot;K9UF&quot;&gt;&lt;strong&gt;Контракт&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;haBd&quot;&gt;Контракт - это JSON, который передается с серверной части приложения на клиентскую и содержит параметры виджетов, которые на клиентской стороне преобразуются в элементы интерфейса.&lt;/p&gt;
  &lt;p id=&quot;C5f6&quot;&gt;Возьмем простой контракт из консервативного SDUI-приложения: кнопка с иконкой будет выглядеть следующим образом:&lt;/p&gt;
  &lt;figure id=&quot;yz4O&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/5e/fe/5efe1d1f-14ee-4b9d-a6d8-03587366ce91.png&quot; width=&quot;524&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;eedE&quot;&gt;В целом, все достаточно компактно и понятно. Но что, если мы захотим изменить кнопку, изменить ее внешний вид и содержание? Нам придется охватить все параметры и, конечно же, выпустить новую версию приложения в магазинах. Мы же хотим избежать этого как можно дольше. Если мы возьмем, к примеру, JSON-макет простой страницы в Figma, а файлы Figma, как ни странно, в формате JSON, там будет более 800 тысяч строк 🤯.&lt;/p&gt;
  &lt;figure id=&quot;PLiz&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/ca/ae/caaea7a4-800c-45fc-ba77-19a744cad7a6.png&quot; width=&quot;884&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;2YyY&quot;&gt;Так насколько же наследуемые стили позволяют сократить размер контракта? Тот же экран, но уже оптимизированный под нашу платформу в формате JSON имеет всего около 1200 строк. Примерно так выглядит кнопка с иконкой и текстом в этом формате:&lt;/p&gt;
  &lt;figure id=&quot;H0iN&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/77/26/77266039-46f6-4693-a0b9-0781a1d37e6c.png&quot; width=&quot;497&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;PUzg&quot;&gt;Значительно больше строк, чем в первом примере, но все еще читаемо, и внутри может быть все, что угодно. Мы не ограничены заранее определенными параметрами виджета кнопки. Таким образом нам удалось достичь вариативности макета как в Figma и в то же время существенно оптимизировать данные дерева объектов и их параметры.&lt;/p&gt;
  &lt;h2 id=&quot;o8lk&quot;&gt;Контекст (микротема)&lt;/h2&gt;
  &lt;p id=&quot;T5ZI&quot;&gt;Обычная структура семантического токена цвета в теме примерно следующая:&lt;/p&gt;
  &lt;p id=&quot;5o2J&quot;&gt;&lt;em&gt;light-theme. background-brand-accent&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;ySVf&quot;&gt;Иногда к этому добавляется еще уровень токенов компонентов. Все имя токена полностью “лежит” в каком-либо параметре, например “button-background”. Цвет текста отдельно в свойствах “icon-color” и “label-color”, что-то вроде &lt;em&gt;light-theme.text-color-on-accent.&lt;/em&gt;&lt;/p&gt;
  &lt;p id=&quot;asyT&quot;&gt;В результате получаем зеленую кнопку.&lt;/p&gt;
  &lt;figure id=&quot;maT1&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/16/02/1602dd77-6546-40ae-924f-604e8e114bc1.png&quot; width=&quot;452&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;8LkU&quot;&gt;Но контекст добавляет к этой картине новое измерение&lt;/p&gt;
  &lt;figure id=&quot;sFTf&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/36/44/3644e2ec-3539-4592-9e82-733af5183fe9.png&quot; /&gt;
    &lt;figcaption&gt;структура имени токена цвета в платформе Манго.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Wohn&quot;&gt;За цвет в такой системе отвечают два свойства: одно для токена цвета и одно для его контекста. Значение контекста указывается в свойстве “context”, а в самом токене указывается только цвет. Например, в свойстве background указывается значение “primary”, а в свойствах text-color и icon-color указывается значение “on-primary”. По умолчанию значение свойства context равно “inherit”. Это означает, что виджет наследует значение контекста от родительского виджета. Если мы хотим, чтобы кнопка была зеленой, мы должны установить значение контекста на “green-accent”.&lt;/p&gt;
  &lt;p id=&quot;Ff0q&quot;&gt;Контексты и цветовые токены в библиотеке Figma представлены в виде стилей и визуализируются в виде модулей:&lt;/p&gt;
  &lt;figure id=&quot;9WBs&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/27/95/2795a3ad-45fa-4eae-ac1b-594117ffc423.png&quot; width=&quot;3344&quot; /&gt;
    &lt;figcaption&gt;нейтральный контекст&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure id=&quot;OEMe&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/db/40/db404728-c9b8-4044-8f8f-bf4596e85bbe.png&quot; width=&quot;3952&quot; /&gt;
    &lt;figcaption&gt;пример групп контекстов&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;5ZlQ&quot;&gt;Таким образом, правильное управление наследованием свойств позволяет легко управлять внешним видом компонента в коде, используя всего один параметр.&lt;/p&gt;
  &lt;figure id=&quot;WBDB&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/aa/5c/aa5cc4c1-c276-4599-b103-4a97835f3858.png&quot; width=&quot;1309&quot; /&gt;
    &lt;figcaption&gt;пример смены контекста для виджета тизера товара&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Cbl0&quot;&gt;Как видно из приведенного выше примера, кнопка &amp;quot;В корзину&amp;quot; не меняет свой цвет, потому что у нее задан определенный контекст “green-accent”, а не “inherit”, и поэтому она не наследует контекст от своего родительского виджета.&lt;/p&gt;
  &lt;h2 id=&quot;28mb&quot;&gt;Контексты в фигме&lt;/h2&gt;
  &lt;p id=&quot;nfAM&quot;&gt;В коде с такими сложными механиками более менее все понятно, но как это реализовать в Figma? К сожалению, идеального решения не существует, даже с использованием новых variables. Сейчас у нас цвета на стилях, и даже если перейти на переменные, то без тарифа Enterprise картина кардинально не изменится. Теоретически, можно было бы попытаться создать mode для каждого контекста и разные коллекции для разных тем. Возможно, это сработало бы, но это очень затратно. Кроме того, в нашей платформе виджеты автоматически выгружаются на фронтенд, а это значит, что параметр также необходимо передавать.&lt;/p&gt;
  &lt;figure id=&quot;AfG3&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/cb/e3/cbe3e7f0-5bd9-4795-8fb5-e2dd4717d0b6.png&quot; width=&quot;991&quot; /&gt;
    &lt;figcaption&gt;Контекст для автоматики хранится в специальном служебном слое в свойстве компонента.&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;6G6N&quot;&gt;Получается что контекст надо выставлять дважды: один раз для автоматики, второй раз для отображения в фигме руками через замену стилей. Это не так страшно, как кажется, через поиск это делается довольно быстро. Однако, даже у этой проблемы есть решение. Сейчас мы работаем над собственным редактором для экранов платформы. Но о нём и о других наследуемых свойствах в следующих статьях и в моём &lt;a href=&quot;https://t.me/uxflow&quot; target=&quot;_blank&quot;&gt;телеграм канале.&lt;/a&gt;&lt;/p&gt;

</content></entry></feed>