{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Максим Петров: заметки с тегом Blazor",
    "_rss_description": "UI\/UX-дизайнер",
    "_rss_language": "ru",
    "_itunes_email": "mail@maximpetrov.ru",
    "_itunes_categories_xml": "",
    "_itunes_image": "https:\/\/maximpetrov.ru\/blog\/pictures\/userpic\/userpic-square@2x.jpg?1711785590",
    "_itunes_explicit": "no",
    "home_page_url": "https:\/\/maximpetrov.ru\/blog\/tags\/blazor-2\/",
    "feed_url": "https:\/\/maximpetrov.ru\/blog\/tags\/blazor-2\/json\/",
    "icon": "https:\/\/maximpetrov.ru\/blog\/pictures\/userpic\/userpic@2x.jpg?1711785590",
    "authors": [
        {
            "name": "Максим Петров",
            "url": "https:\/\/maximpetrov.ru\/blog\/",
            "avatar": "https:\/\/maximpetrov.ru\/blog\/pictures\/userpic\/userpic@2x.jpg?1711785590"
        }
    ],
    "items": [
        {
            "id": "5",
            "url": "https:\/\/maximpetrov.ru\/blog\/all\/blazor\/",
            "title": "Дизайн-система Blazor",
            "content_html": "<p>DevExpress Blazor — это набор компонентов пользовательского интерфейса. Активно применяется в приложениях на платформе Blazor и предлагает мощный набор компонентов: таблицы данных, календари, планировщики, выпадающие списки, диалоговые окна и многие другие.<\/p>\n<p>Задача — переосмыслить и создать дизайн-систему в Figma на основе существующих артефактов и наработок.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/maximpetrov.ru\/blog\/pictures\/empty-image.jpg\" width=\"2560\" height=\"10\" alt=\"\" \/>\n<div class=\"e2-text-caption\"><img src=\"\/images\/blog\/1x\/blazor-1.png\" srcset=\"\/images\/blog\/1x\/blazor-1.png 1x, \/images\/blog\/2x\/blazor-1@2x.png 2x\" class=\"img-fluid\"><\/div>\n<\/div>\n<h2>Вводные<\/h2>\n<p>Blazor продукт развивался и вместе с этим росло количество и сложность компонентов. Раньше дизайнер рисовал отдельный макет под каждую задачу. Не было системного подхода и единых правил. Со временем этот подход начал приносить проблемы:<\/p>\n<ul>\n<li>Разработка начала сильно обгонять дизайн.<\/li>\n<li>Многие решения по краевым сценариям стали приниматься разработчиками.<\/li>\n<li>Дизайнер тратил много времени на поиск UI и UX багов на поздних этапах.<\/li>\n<li>Итоговая фича могла сильно отличаться от нарисованного макета.<\/li>\n<\/ul>\n<p>Отдельной проблемой была сложность каждого компонента:<\/p>\n<ul>\n<li><b>Разные темы<\/b>. В разных темах компонент не только меняет цвет, но и начинает обладать другими визуальными свойствами.<\/li>\n<li><b>Несколько размеров<\/b>. Каждый компонент линейки представлен в трёх размерах.<\/li>\n<li><b>Дополнительные стили<\/b>. Большой набор стилистических вариантов для компонентов-атомов.<\/li>\n<\/ul>\n<p>Например, одна только кнопка состоит из 150 вариантов компонента:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/maximpetrov.ru\/blog\/pictures\/empty-image.jpg\" width=\"2560\" height=\"10\" alt=\"\" \/>\n<div class=\"e2-text-caption\"><img src=\"\/images\/blog\/1x\/blazor-2.png\" srcset=\"\/images\/blog\/1x\/blazor-2.png 1x, \/images\/blog\/2x\/blazor-2@2x.png 2x\" class=\"img-fluid\"><\/div>\n<\/div>\n<p>Было принято решение менять подход — разработать стандарты, правила постановки задач и проектирования.<\/p>\n<h2>Задачи<\/h2>\n<p>Перед новой дизайн-системой поставили следующие задачи:<\/p>\n<ol start=\"1\">\n<li><b>Оптимизация работы команды на этапах дизайна и разработки.<\/b><br \/>\nРаньше, эти процессы были довольно хаотичны. Дизайнер брал в задачу в работу и изображал примерную реализацию компонента. Многие краевые сценарии не учитывались. Какие-то решения в процессе разработки менялись на ходу. В итоге, разработка затягивалась, фичи резались и итоговый результат сильно отличался от исходной картинки.<\/li>\n<li><b>Автоматизация и консистентность<\/b>.<br \/>\nБольшой размер и сложность компонентов сильно затрудняли внесение любых изменений в дизайн. Даже небольшие стилистические изменения в базовом компоненте, типа кнопки, приводили к огромному количеству работы со стороны дизайнера. Так как нужно было учесть разные темы, размеры и стили.<\/li>\n<li><b>Консистентность цвета<\/b>.<br \/>\nОтдельно стоит отметить проблему с цветом. Многие цвета компонентов в коде рассчитывались с помощью миксинов. Это приводило ко многим проблемам, в том числе, проблемам с контрастностью.<\/li>\n<li><b>Доступность.<\/b><br \/>\nПользователи продукта стали всё чаще интересоваться, насколько компоненты доступны для разных категорий пользователей. Нужно было сформировать подход, когда дизайнер на этапе проработки компонента учитывает все WCAG 2.2 AA требования.<\/li>\n<li><b>Централизация знаний.<\/b><br \/>\nМногие знания о тех или иных дизайн-решениях нигде не фиксировались. Единственным источником знания были участвующие в работе на фичей члены команды. Нужно было сформировать систему документации.<\/li>\n<li><b>UI Kit.<\/b><br \/>\nВсё чаще стали приходить запросы на UI Kit от пользователей. К тому же, это уже давно было у конкурентов.<\/li>\n<\/ol>\n<h2>Результат<\/h2>\n<h3>Компоненты в Figma переработаны с нуля<\/h3>\n<p>Дизайн компонентов теперь полностью повторяет функционал кодовой реализации. Учтены все редкие сценарии и краевые состояния. Перед отрисовкой каждого компоненты изучались спецификация+API компонента и все сценарии его использования.<\/p>\n<h4><b>Пример реализации компонента Grid<\/b><\/h4>\n<p>Компонент Grid — один из самых больших и популярных в линейке Blazor. Представляет собой решение для отображения данных в табличном формате. Включает множество функций для управления данными. Например: фильтрация, группировка, пагинация, сортировка и многое другое.<\/p>\n<p>Основную сложность представляет его размер:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/maximpetrov.ru\/blog\/pictures\/empty-image.jpg\" width=\"2560\" height=\"10\" alt=\"\" \/>\n<div class=\"e2-text-caption\"><img src=\"\/images\/blog\/1x\/blazor-3.png\" srcset=\"\/images\/blog\/1x\/blazor-3.png 1x, \/images\/blog\/2x\/blazor-3@2x.png 2x\" class=\"img-fluid\"><\/div>\n<\/div>\n<p>Компонент достаточно гибок в настройке. Так как пользователи используют его по-разному. Всё это отражено в дизайне.<\/p>\n<p>Чтобы отрисовать такой компонент в Figma, задачу разбили на этапе:<\/p>\n<ul>\n<li>Изучить решения конкурентов.<\/li>\n<li>Изучить и собрать файл со скриншотами всех состояний компонента.<\/li>\n<li>Собрать все под-компоненты.<\/li>\n<li>Собрать итоговый компонент с разными сценариями использования.<\/li>\n<\/ul>\n<p>Собранный в Figma компонент сильно упростил разработку новых фич для грида. Также, упростило создание прототипов для проработки различных сценариев.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/maximpetrov.ru\/blog\/pictures\/empty-image.jpg\" width=\"2560\" height=\"10\" alt=\"\" \/>\n<div class=\"e2-text-caption\"><img src=\"\/images\/blog\/1x\/blazor-4.png\" srcset=\"\/images\/blog\/1x\/blazor-4.png 1x, \/images\/blog\/2x\/blazor-4@2x.png 2x\" class=\"img-fluid\"><\/div>\n<\/div>\n<h3>Отрисованы новые компоненты<\/h3>\n<p>Создание новых компонентов включает следующие шаги:<\/p>\n<ul>\n<li>Обсудить требования с ПМом.<\/li>\n<li>Исследовать решения на рынке.<\/li>\n<li>Утвердить список фич.<\/li>\n<li>Найти грамотный подход по клавиатурной навигации (поддержка A11Y).<\/li>\n<li>Отрисовать компонент и все его составляющие.<\/li>\n<li>Описать компонент в дизайн-токенах.<\/li>\n<li>Проработать сценарии для демо-стендов.<\/li>\n<\/ul>\n<h4><b>Пример реализации компонента TreeList<\/b><\/h4>\n<p>Компонент TreeList — показывает табличные данные в виде древовидной структуры. Пользователи могут сворачивать и разворачивать данные, как им удобно.<\/p>\n<p>При подготовке к работе был произведен ресёрч конкурентов, собран список идей и их примерные способы реализации. На каждом этапе приходили синхронизационные встречи с менеджером продукта, разработчиками и другими заинтересованными лицами:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/maximpetrov.ru\/blog\/pictures\/empty-image.jpg\" width=\"2560\" height=\"10\" alt=\"\" \/>\n<div class=\"e2-text-caption\"><img src=\"\/images\/blog\/1x\/blazor-5.png\" srcset=\"\/images\/blog\/1x\/blazor-5.png 1x, \/images\/blog\/2x\/blazor-5@2x.png 2x\" class=\"img-fluid\"><\/div>\n<\/div>\n<p>Собранный в Figma компонент учитывает все сценарии использовании и состоянии:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/maximpetrov.ru\/blog\/pictures\/empty-image.jpg\" width=\"2560\" height=\"10\" alt=\"\" \/>\n<div class=\"e2-text-caption\"><img src=\"\/images\/blog\/1x\/blazor-6.png\" srcset=\"\/images\/blog\/1x\/blazor-6.png 1x, \/images\/blog\/2x\/blazor-6@2x.png 2x\" class=\"img-fluid\"><\/div>\n<\/div>\n<h2><b>Токенизация<\/b><\/h2>\n<p>Каждый компонент представлен в разных темах. Руками отрисовать или исправлять компонент в каждой теме очень дорого и ресурсозатратно.<\/p>\n<p>Было принято решение использовать дизайн-токены:<\/p>\n<ul>\n<li>Чтобы быстро обновлять стили компонента под любую тему.<\/li>\n<li>Гарантировать единообразие решений.<\/li>\n<li>Использовать токены как мостик между дизайном и разработкой.<\/li>\n<\/ul>\n<p>Была проведена большая работа над созданием архитектуры и структуры дизайн-токенов:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/maximpetrov.ru\/blog\/pictures\/empty-image.jpg\" width=\"2560\" height=\"10\" alt=\"\" \/>\n<div class=\"e2-text-caption\"><img src=\"\/images\/blog\/1x\/blazor-7.png\" srcset=\"\/images\/blog\/1x\/blazor-7.png 1x, \/images\/blog\/2x\/blazor-7@2x.png 2x\" class=\"img-fluid\"><\/div>\n<\/div>\n<p>Каждый компонент имеет полное покрытие токенами:<\/p>\n<ul>\n<li>color,<\/li>\n<li>font-weight,<\/li>\n<li>letter-spacing,<\/li>\n<li>line-height,<\/li>\n<li>border-radius,<\/li>\n<li>border-width,<\/li>\n<li>font-size,<\/li>\n<li>text-transform,<\/li>\n<li>opacity,<\/li>\n<li>box-shadow,<\/li>\n<li>size.<\/li>\n<\/ul>\n<p>Такой подход позволяет быстро создавать новые темы, просто выставляя новые значения в токенах. Для работы использовался плагин Tokens Studio for Figma. Потому что он позволяет покрыть большое количество типов токенов, в отличии от встроенного Figma Variables.<\/p>\n<p>В итоге, любой компонент в Figma легко протестировать с другими стилистическими настройками. А разработчики могут передавать значения токенов из Figma напрямую в свои стили.<\/p>\n<h2><b>Документирование<\/b><\/h2>\n<p>Дизайн-система описывает себя тремя основными способами:<\/p>\n<ul>\n<li><b>Компоненты и сценарии в Figma.<\/b> Главная точка входа в дизайн-систему.<\/li>\n<li><b>Дизайн-токены.<\/b> Служат мостом между дизайном и кодом.<\/li>\n<li><b>Внутренняя документация.<\/b> Содержит договоренности и рекомендации по разным аспектам дизайна: правила наименования, структура токенов, правила отрисовки иконок и так далее. Тут же можно найти результаты ресёрчей относящихся к различным дизайн-задачам.<\/li>\n<\/ul>\n<h2><b>UI Kit<\/b><\/h2>\n<p>Одним из результатов работы над дизайн-системой стал выпуск UI кита в Figma.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/maximpetrov.ru\/blog\/pictures\/empty-image.jpg\" width=\"2560\" height=\"10\" alt=\"\" \/>\n<div class=\"e2-text-caption\"><img src=\"\/images\/blog\/1x\/blazor-8.png\" srcset=\"\/images\/blog\/1x\/blazor-8.png 1x, \/images\/blog\/2x\/blazor-8@2x.png 2x\" class=\"img-fluid\"><\/div>\n<\/div>\n<h2><b>Результаты<\/b><\/h2>\n<ul>\n<li>Получилось собрать крепкий каркас дизайн-системы в Figma.<\/li>\n<li>Сильно улучшилась коммуникация дизайна и продукт-менеджеров.\n<ul>\n  <li>Появились еженедельные созвоны с продукт-менеджерами.<\/li>\n  <li>Работа над задачами стала идти быстрее, на всех этапах.<\/li>\n<\/ul>\n<\/li>\n<li>Работа между дизайном и разработкой стала эффективнее.\n<ul>\n  <li>Макеты стали намного подробнее.<\/li>\n  <li>Дополнительный слой информации передают дизайн-токены.<\/li>\n<\/ul>\n<\/li>\n<li>Появилась внутренняя документация.<\/li>\n<li>Пользователи получили UI kit.<\/li>\n<\/ul>\n",
            "date_published": "2024-03-25T20:30:02+04:00",
            "date_modified": "2024-03-30T23:41:16+04:00",
            "tags": [
                "Blazor"
            ],
            "image": "https:\/\/maximpetrov.ru\/blog\/pictures\/empty-image.jpg",
            "_date_published_rfc2822": "Mon, 25 Mar 2024 20:30:02 +0400",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "5",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": true,
                "links_required": [],
                "og_images": [
                    "https:\/\/maximpetrov.ru\/blog\/pictures\/empty-image.jpg"
                ]
            }
        }
    ],
    "_e2_version": 4116,
    "_e2_ua_string": "Aegea 11.2 (v4116e)"
}