☛Советы web-дизайнеру ✎ |
RTL-верстка (Right-to-Left) - это не просто техническая задача по отзеркаливанию интерфейса, а фундаментальный аспект цифровой инклюзивности, затрагивающий сотни миллионов пользователей. Для арабоязычного мира (более 420 млн носителей) и еврейской диаспоры (около 15 млн, с ивритом как официальным языком Израиля) корректная поддержка RTL является обязательным условием доступа к информации, государственным услугам, образованию и коммерции. Игнорирование этих нужд создает цифровой барьер, эквивалентный строительству зданий без дверей для части населения. Технически RTL-верстка требует глубокого понимания CSS-свойств (direction, unicode-bidi), особенностей типографики (соединительные формы в арабском, отсутствие заглавных букв), и адаптации логики layout под "зеркальное" чтение. Это комплексный процесс, затрагивающий HTML-разметку, CSS, JavaScript, дизайн-системы и процессы тестирования. Успешная реализация обеспечивает не только соответствие стандартам W3C и законодательству о доступности (например, Israeli Standard 5568), но и повышает конверсию, доверие и лояльность в ключевых региональных рынках Ближнего Востока и Северной Африки (БВСА).
- Исторический и культурный контекст RTL-языков
- Технические основы: HTML, CSS и Unicode
- Layout, Grid, Flexbox и адаптация интерфейсов
- Типографика, шрифты и рендеринг текста
- Компоненты UI/UX: навигация, формы, таблицы
- Инструменты, валидация и процессы разработки
- Реальные кейсы, ошибки и их стоимость
- Будущее RTL: инклюзивный дизайн и новые технологии
Исторический и культурный контекст RTL-языков
Понимание RTL-верстки начинается не с кода, а с осознания культурного и исторического фундамента. Арабский и иврит - не просто языки, которые пишутся справа налево; они несут в себе многовековые традиции каллиграфии, философии и социального устройства. Арабский алфавит, возникший из набатейского письма, сформировал искусство исламской каллиграфии, где форма буквы зависит от позиции в слове (начальная, средняя, конечная, изолированная). Это напрямую влияет на веб-дизайн: шрифты должны корректно отображать эти "соединительные формы" (ligatures), иначе текст выглядит механически и нечитаемо. Иврит, хотя и использует латинские цифры в большинстве контекстов, сохраняет направление письма справа налево, но с особыми правилами пунктуации и отсутствием гласных в обычном письме (никуд), что создает уникальные проблемы для UX, например, при вводе данных или поиске. Культурные аспекты также диктуют дизайн-решения: в арабской культуре сильное значение имеет декоративность, геометрические узоры (гирих), а цветовая психология может отличаться от западной. Еврейский интерфейс, особенно в религиозном контексте (как сайты синагог или учебные ресурсы), часто требует соответствия календарю (еврейский год), выходным (суббота - Шаббат) и соблюдения определенных этических норм (скромность). Игнорирование этих нюансов превращает сайт в "культурный чужак", что приводит к потере доверия. Например, интерфейс, где иконки "назад"/"вперед" не зеркалированы, или где даты отображаются только в григорианском формате, создает когнитивный диссонанс. Таким образом, RTL-верстка - это мост между технологией и культурной идентичностью, требующий уважения к традициям.
Технические основы: HTML, CSS и Unicode
С технической точки зрения, основа RTL-верстки заложена в двух ключевых атрибутах: dir и lang. Атрибут dir="rtl" на элементе (или более локально) задает основное направление текстового потока. Атрибут lang="ar" (для арабского) или lang="he" (для иврита) критически важен для правильного рендеринга шрифтами, работы систем машинного перевода, SEO и доступности (скринридеры). Без lang браузер может неправильно интерпретировать порядок символов. На уровне CSS, свойство direction: rtl влияет на поток текста и расположение блочных элементов, но не меняет порядок дочерних элементов flex/grid контейнеров по умолчанию. Для этого используется unicode-bidi и isolation. Значение unicode-bidi: embed вместе с direction: rtl создает изолированный контекст, где порядок символов определяется по правилам Unicode, что необходимо для смешанного текста (например, арабское предложение с английским словом). Свойство text-align: start (или end) - ключевой инструмент: оно автоматически выравнивает текст по началу или концу потока, что в RTL будет справа. Использование жестких text-align: left/right - частая ошибка. Таблица 1 суммирует основные CSS-свойства и их поведение в LTR/RTL контекстах.
| CSS-свойство | LTR поведение | RTL поведение | Рекомендация |
|---|---|---|---|
| direction | ltr | rtl | Устанавливать на html или корневых блоках. Не использовать для визуального зеркалирования. |
| unicode-bidi | normal | embed/isolate | Для смешанного текста используйте unicode-bidi: isolate (современный стандарт) или embed. |
| text-align | start ? left | start ? right | Всегда использовать start/end вместо left/right. |
| margin/padding | margin-left ? внешний отступ слева | margin-left ? внешний отступ справа (физически) | Использовать логические свойства: margin-inline-start вместо margin-left. Это гарантирует корректность в обеих режимах. |
| float | float: left ? элемент обтекает справа | float: left ? элемент обтекает слева | Избегать float для layout. Если необходимо, использовать float: inline-start. |
| clear | clear: left | clear: left | Аналогично, предпочтительны логические: clear: inline-start. |
Unicode играет центральную роль. Блоки арабского (U+0600-U+06FF) и иврита (U+0590-U+05FF) содержат не только буквы, но и диакритические знаки, пунктуацию, цифры. Важно понимать, что арабские цифры (??????????) и восточноаравийские (??????????) имеют другое начертание и направление. В современных арабских интерфейсах часто используются западные цифры (0-9), но они все равно отображаются справа налево в контексте предложения. Проблемы возникают при конкатенации чисел и текста. Алгоритм Bidirectional (Bidi) Unicode определяет порядок отображения смешанных направлений. Разработчик должен понимать базовые уровни Bidi: нейтральные символы (пробелы, пунктуация) принимают направление окружающего текста, что иногда приводит к неожиданным результатам. Например, строка "Price: 100$" в RTL будет отображена как "100$ :Price" (цифры остаются LTR внутри, но вся фраза выровнена по правому краю). Для контроля используются HTML-теги bdi (Bidirectional Isolation) для изоляции фрагментов с противоположным направлением и bdo (Bidirectional Override) для принудительного порядка (используется редко). Пример: <span dir="ltr">100$</span> гарантирует, что "100$" отобразится как единый LTR-фрагмент внутри RTL-предложения. Понимание Bidi - обязательный навык для RTL-разработчика.
Layout, Grid, Flexbox и адаптация интерфейсов
Современный CSS-layout предоставляет мощные инструменты для создания RTL-интерфейсов без дублирования кода. Ключевой принцип: использовать логические свойства (logical properties) вместо физических. Вместо margin-left - margin-inline-start, вместо padding-right - padding-inline-end. Эти свойства автоматически адаптируются под направление: в LTR margin-inline-start станет margin-left, в RTL - margin-right. Аналогично: border-inline-start, inset-inline-start (для top/bottom есть block-start/end). Поддержка логических свойств в браузерах сейчас исключительно высокая (Can I Use), и их использование - лучшая практика. Flexbox и Grid также поддерживают логические оси. В Flexbox, если задать flex-direction: row, главная ось (main axis) в LTR идет слева направо, в RTL - справа налево. Это автоматически меняет порядок дочерних элементов, если не задано order. Однако часто требуется сохранить определенный порядок (например, логотип всегда слева в LTR, но справа в RTL). Здесь помогает свойство order. Но более универсальный подход - использовать flex-direction: row-reverse в RTL, что зеркалит порядок. Более изящно: задать flex-direction: row и использовать margin-inline-start: auto на первом/последнем элементе для выравнивания по краям. Grid работает схожим образом: свойство grid-auto-flow и размещение по именованным линиям (grid-column-start: 1 vs grid-column-start: -1) нужно адаптировать. Логические свойства для Grid пока менее развиты, поэтому часто используют переопределение переменных CSS. Например:
:root {
--main-axis-start: left;
--main-axis-end: right;
}
@media (prefers-reduced-motion: no-preference) {
[dir="rtl"] {
--main-axis-start: right;
--main-axis-end: left;
}
}
.container {
display: flex;
justify-content: space-between;
> *:first-child { margin-inline-start: 0; }
> *:last-child { margin-inline-end: 0; }
}
Такой подход с CSS-переменными позволяет централизовать управление. Важный нюанс: иконки и графические элементы, несущие смысл направления (стрелки, часы, прогресс-бары), должны быть заменены на RTL-версии или зеркально отражены через transform: scaleX(-1). Но это не всегда уместно: символы, не имеющие направленности (домик, лупа), остаются без изменений. Зеркалирование всего контейнера через CSS - опасная практика, так как может поломать текст и элементы с собственным направлением. Лучше создавать отдельные SVG-спрайты для RTL или использовать атрибут dir в SVG для автоматического отражения текста внутри. Адаптивный дизайн в RTL не отличается по принципу, но требует тестирования на разных направлениях. Брейкпоинты остаются теми же, но расположение элементов на мобильных устройствах (например, "бургер-меню" слева/справа) должно быть продумано. Часто в RTL-интерфейсах "бургер" размещают справа, чтобы thumb-зона на мобильном устройстве была удобна для правой руки (хотя для левшей это может быть проблемой).
Типографика, шрифты и рендеринг текста
Типографика - самая видимая и сложная часть RTL-верстки. Арабский шрифт - это не просто набор букв, а система, где форма символа зависит от соседних. При выборе шрифта для веба необходимо проверять:
- Поддержку всех необходимых Unicode-блоков (Arabic, Arabic Supplement, Arabic Extended-A, Arabic Mathematical Alphabetic Symbols).
- Качество рендеринга соединительных форм (каллиграфические связи между буквами). Дешевые или плохо спроектированные шрифты могут показывать "разорванные" связи или некорректные формы.
- Наличие необходимых стилей (обычный, полужирный, курсив). Курсив в арабском - редкость, чаще используется "слэш" (slanted) или другой начертание.
- Поддержку цифр: западных (Latin) и восточноаравийских (Arabic-Indic). Некоторые шрифты имеют отдельные глифы для цифр в зависимости от локали.
- Читаемость на маленьких размерах. Арабские буквы имеют сложные формы, которые могут "слипаться" при малом кернинге.
Популярные веб-шрифты для арабского: Noto Sans Arabic (Google Fonts, открытый, хорошая поддержка), Amiri (классический, с элементами каллиграфии), Cairo (современный, геометричный), IBM Plex Sans Arabic. Для иврита: Heebo (Google Fonts, популярный), Open Sans Hebrew, David Libre (свободный). Всегда нужно тестировать шрифт в реальных текстах, особенно в длинных абзацах. Кернинг (letter-spacing) в RTL работает аналогично LTR, но из-за соединительных форм может давать неожиданные результаты. Свойство font-feature-settings позволяет управлять OpenType-фичами, например, включать контекстуальные альтернативы ('calt') для улучшения связей. Пример:
body {
font-family: 'Noto Sans Arabic', sans-serif;
font-feature-settings: 'calt', 'liga';
letter-spacing: 0.02em; /* осторожно, может нарушать связи */
}
В RTL-тексте text-transform: uppercase не работает, так как в арабском и иврите нет концепции заглавных/строчных букв. Применение этого свойства бесполезно. Для выделения используются другие методы: жирный шрифт, цвет, увеличенный межбуквенный интервал. Переносы слов в арабском регулируются правилами, отличными от LTR. Браузеры используют алгоритмы, основанные на возможных местах разрыва (после некоторых букв, не в середине соединительной формы). Разработчик может влиять на это через word-break и hyphens, но поддержка hyphenation для арабского ограничена. Часто проще использовать overflow-wrap: break-word для предотвращения горизонтального скролла. Важно: в арабском тексте пунктуация (запятые, точки) имеет собственное направление и может "уплывать" при неправильном направлении. Всегда проверяйте отображение знаков препинания в RTL-окружении. Для латинских/цифровых вставок внутри RTL-текста используйте <bdi> или явное указание dir="ltr", чтобы избежать путаницы с порядком. Например, модель номера телефона "+972-50-123-4567" в RTL-строке может отобразиться как "7654-321-05-279+" без изоляции. Правильно: <span dir="ltr">+972-50-123-4567</span>.
Компоненты UI/UX: навигация, формы, таблицы
Каждый стандартный UI-компонент требует переосмысления в RTL. Навигация: горизонтальные меню зеркалятся - первый элемент теперь справа. Выпадающие списки (<select>) большинства браузеров автоматически открываются слева в RTL (так как выпадающий список выравнивается по start). Но кастомные дропдауны на JS/CSS нужно тестировать. Хлебные крошки: разделитель "/" остается, но порядок ссылок обратный. Пагинация: ссылки "Следующая"/"Предыдущая" меняются местами, иконки стрелок поворачиваются. Кнопки: иконка "назад" (?) становится стрелкой вправо (?) или просто текстом "Назад" (на арабском). Иконки, несущие направление (play, pause, shuffle) должны быть заменены на RTL-адаптированные. Поиск: поле ввода обычно располагается справа (если не в хедере слева). Иконка лупы остается, но кнопка "Очистить" (X) - справа от текста. Формы: метки (labels) выравниваются по right (или start). Индикаторы обязательных полей (*) обычно слева от поля в LTR, но в RTL - справа. Плейсхолдеры (placeholders) должны быть на том же языке, что и интерфейс, и их направление наследуется. Валидация: сообщения об ошибках появляются обычно под полем, но их выравнивание - по start. Таблицы: самая проблемная зона. Заголовки (<th>) выравниваются по start (справа). Столбцы, которые в LTR были первыми (например, "Имя"), в RTL становятся последними. Это ломает ожидания пользователя, который привык сканировать таблицу с правого края. Решение: либо зеркалить порядок столбцов (что может сбить с толку, если данные содержат LTR-текст, например, имена на английском), либо оставлять порядок, но выравнивать весь контент по start. Часто выбирают второй вариант, но тогда первая колонка (теперь справа) должна содержать ключевую информацию. Сортировка: иконки сортировки (?/?) не меняют направление, но их расположение относительно текста меняется (справа вместо слева). Модальные окна: закрывающая крестик (X) обычно в правом верхнем углу в LTR, но в RTL - в левом. Кнопки "Отмена"/"OK" меняются местами (в арабском интерфейсе часто "OK" справа, "Отмена" слева, что противоположно западному). Датапикеры: календарь должен отображаться с неделей, начинающейся в воскресенье (как в западном) или субботу (как в еврейском)? Израиль использует неделю с воскресенья по субботу, но суббота - выходной. Арабские страны могут использовать субботу-четверг как рабочие дни. Локализация календаря - отдельная большая тема. Слайдеры (<input type="range">): ползунок должен двигаться от right to left для увеличения значения? Обычно да, но это требует кастомизации, так как браузерный range часто не учитывает direction для трека. Иконки и изображения: любые изображения, содержащие текст, направление или культурные отсылки (флаги, карты) должны иметь RTL-версии. Например, логотип компании, включающий текст, должен быть зеркалирован или создан отдельно.
Инструменты, валидация и процессы разработки
Разработка RTL-интерфейсов требует адаптации стандартного workflow. 1. Дизайн-этап: Дизайнеры должны создавать макеты в RTL параллельно с LTR, а не "зеркалить" после. Это важно для композиции, так как "тяжелые" визуальные элементы (изображения, блоки) могут требовать перестановки. Инструменты Figma/Sketch поддерживают RTL: в Figma можно задать направление текстовых слоев и использовать плагины для зеркалирования артбордов. Дизайн-системы (DS) должны включать RTL-токены: отступы (margin-inline-start вместо margin-left), выравнивания, иконки. 2. Разработка: Использование CSS-препроцессоров (Sass, Less) с миксинами для генерации RTL-стилей было популярно, но с появлением логических свойств их необходимость снижается. Однако для старых браузеров (IE11, который все еще используется в некоторых госучреждениях БВСА) логические свойства не работают полностью, и требуется fallback. Могут использоваться инструменты вроде postcss-rtl или rtlcss, которые автоматически генерируют RTL-версии CSS на основе LTR, заменяя физические свойства на зеркальные. Это мощно, но может привести к избыточному CSS и сложностям в отладке. Рекомендуемый подход: писать CSS с логическими свойствами с самого начала, а для legacy-браузеров использовать полифилы или отдельный RTL-бандл, собранный через postcss-rtl с тщательным тестированием. 3. Валидация: Существуют автоматические линтеры. eslint-plugin-jsx-a11y может проверять наличие dir и lang на корневом элементе. Для CSS есть stylelint с плагинами, запрещающими физические свойства (margin-left) в проекте. 4. Тестирование: Критически важно тестирование на реальных RTL-языках. Недостаточно просто включить dir="rtl" и посмотреть. Нужно:
- Проверить смешанный текст (английские слова, цифры, URL).
- Протестировать формы ввода: автозаполнение, автокоррекция (на мобильных).
- Убедиться, что все иконки-стрелки направлены правильно.
- Проверить скролл-бары: в RTL они обычно слева (в Windows), но в macOS могут быть справа в любом случае.
- Протестировать копирование/вставку текста: скопированный RTL-текст должен сохранять направление при вставке в документ LTR.
- Проверить работу скринридеров (NVDA, JAWS, VoiceOver). Они должны анонсировать направление и читать текст справа налево. Частые ошибки: скринридер читает смешанный текст в неправильном порядке.
5. Локализация строк: Файлы переводов (JSON, YML) должны содержат не только текст, но и информацию о направлении? Обычно направление определяется по языку (ar, he), но есть языки, которые используют оба направления (например, английские цитаты внутри арабского текста). Инструменты вроде i18next позволяют передавать контекст. 6. CI/CD: Можно настроить пайплайн для запуска визуальных регрессионных тестов (Chromatic, Percy) в обеих направлениях. Загружать скриншоты с dir="ltr" и dir="rtl" и сравнивать. 7. Эмуляция: В браузерах DevTools есть возможность переключить направление документа (в Elements панели, правый клик на <html> ? "Force element state" ? ":dir(rtl)"). Это быстрый способ проверки, но не заменяет реального контента. Chrome также имеет флаг для включения RTL-скролл-баров.
Реальные кейсы, ошибки и их стоимость
Анализ популярных сайтов показывает типичные ошибки и успешные кейсы. Википедия - образец хорошей RTL-поддержки. У неё есть отдельные вики для арабского и иврита, и интерфейс полностью адаптирован: меню, кнопки, таблицы, даже диаграммы и математические формулы зеркалятся. Это результат многолетней работы сообщества. Facebook и Google также имеют отличную поддержку: их интерфейсы автоматически переключаются при смене языка, все компоненты (комментарии, кнопки, реклама) адаптированы. Ошибки на крупных платформах редки, но случаются: например, неправильно отзеркаленные иконки в настройках или сломанные выпадающие списки в старых версиях. Государственные порталы - зона риска. Многие проекты делают "косметическую" RTL-верстку: добавляют dir="rtl" и меняют margin-left на margin-right вручную для нескольких элементов, забывая про логические свойства, формы, таблицы, графики. Результат: интерфейс, где часть элементов осталась LTR, создавая хаос. Например, поле поиска выровнено по правому краю, но иконка лупы слева (как в LTR), или таблица с колонками в неправильном порядке. Стоимость ошибок: 1) Потеря пользователей. Если сайт сложен для восприятия, пользователь уходит к конкуренту, который сделал верстку правильно. 2) Юридические риски. В Израиле стандарт 5568 обязывает государственные и коммерческие сайты иметь доступный RTL-интерфейс. В арабских странах (ОАЭ, Саудовская Аравия) требования к локализации жесткие для локальных компаний. 3) Дополнительные затраты на исправление. Исправление RTL-ошибок после запуска в 10 раз дороже, чем при проектировании. Требуется рефакторинг CSS, тестирование, возможен перезапуск дизайна. 4) Репутационный ущерб. Сообщества в соцсетях быстро отмечают неуважение к языку. Пример: в 2018 году крупный банк в Египте запустил сайт с кривой RTL-версткой (текст наезжал на элементы, кнопки были слева), что вызвало волну критики и привело к публичным извинениям. Типичные ошибки:
- Использование физических свойств CSS: margin-left, padding-right, float: left. Это требует двойного кода или пост-обработки.
- Неверное направление иконок: стрелки "вперед" остаются как есть, хотя должны быть "назад".
- Таблицы: колонки не переставляются, выравнивание текста не меняется.
- Формы: лейблы слева, а поля ввода справа, или наоборот, создавая визуальный шум.
- Смешанный текст без изоляции: URL, английские названия продуктов, цифры отображаются в обратном порядке.
- Отсутствие RTL-версий изображений: логотипы, баннеры с текстом остаются LTR.
- Неправильные скролл-бары: в Windows скролл-бар слева, но контент скроллится вправо? Нет, контент всегда скроллится в направлении движения. Проблема в том, что некоторые JS-библиотеки для кастомного скролла жестко зашивают направления.
- Пропуск dir="rtl" на внутренних элементах: если в RTL-странице есть LTR-фрагмент (например, цитата на английском), его нужно явно помечать dir="ltr", иначе он может отобразиться зеркально.
Успешный кейс: Wikipedia. Их интерфейс использует CSS-логические свойства, имеет отдельные шрифты для арабского, все компоненты (инфобоксы, навигационные цепочки, кнопки) адаптированы. Это результат коллаборации сотен разработчиков и строгих guidelines. Израильский governmental portal "gov.il" после редизайна в 2020 году получил высокие оценки за доступность и правильную RTL-верстку, включая поддержку иврита и арабского (для арабскоязычного меньшинства). Ключ - интеграция RTL с самого начала проекта, а не как постфактум.
Будущее RTL: инклюзивный дизайн и новые технологии
Тренды указывают на сближение RTL и LTR в единую инклюзивную парадигму. 1. Логические свойства как стандарт. С поддержкой во всех современных браузерах (включая IE11 частично) логические свойства становятся default. Фреймворки (Bootstrap 5, Tailwind CSS) активно добавляют поддержку: в Tailwind есть утилиты типа ms-* (margin-start) и me-* (margin-end). Это упрощает разработку. 2. Инклюзивный дизайн (Inclusive Design). RTL перестает быть "особенностью для Востока", а рассматривается как один из вариантов пользовательского опыта. Дизайн-системы (Material Design, Carbon Design System) включают RTL-компоненты из коробки. Компании начинают проектировать интерфейсы "направление-независимо" с самого начала, используя логические свойства и тестируя на LTR/RTL параллельно. 3. Автоматизация. Инструменты вроде Stylable или CSS-in-JS (Styled Components, Emotion) позволяют писать стили с логическими свойствами и автоматически генерировать RTL-версии через HOC или темы. В будущем возможно появление CSS-функций для автоматического зеркалирования (mirror: auto), но пока это гипотеза. 4. Улучшенная типографика. Шрифтовые движки (Google Fonts, Adobe Fonts) улучшают рендеринг арабского и иврита, добавляя больше связей и оптимизируя для экранов. Появление переменных шрифтов (Variable Fonts) позволит тонко настраивать вес и ширину для RTL-языков без загрузки отдельных файлов. 5. Нулевой подход к RTL (RTL-less approach). Идея - писать CSS только с логическими свойствами, полностью избегая физических, тогда RTL будет работать "из коробки" при установке dir="rtl". Это требует дисциплины, но упрощает код. 6. Контекстные интерфейсы. В будущем интерфейс может адаптироваться не только под язык, но и под культурные предпочтения: цветовые схемы, расположение элементов, даже анимации. Например, в арабском интерфейсе могут использоваться более "текучие" переходы, отражающие каллиграфию. 7. Проблемы, которые останутся:
- Сложные визуализации: карты, схемы, инфографика требуют ручной адаптации. Автоматическое зеркалирование может исказить смысл (например, стрелки на карте, показывающие направление движения).
- Аудио/видео: субтитры, интерфейс плееров. Направление текста в субтитрах.
- Игры: UI в играх, особенно с HUD, требует полной переработки для RTL.
- Печать: CSS Paged Media для печати RTL-документов пока слабо поддерживается.
- Легендарные "изоленты": некоторые компоненты (например, иконки со стрелками в круге для "следующий/предыдущий" слайд) нейтральны, но их расположение в контейнере меняется.
Заключение. RTL-верстка - это не "фича", а базовое требование для глобальных продуктов. Учитывая, что БВСА и Израиль - быстрорастущие цифровые рынки с высокой мобильной проникновностью, игнорирование RTL равно самоизоляция от сотен миллионов потенциальных пользователей. Технически решение существует и стабильно: логические CSS, правильное использование dir/lang, тестирование. Главный барьер - организационный: отсутствие RTL в дизайн-системах, незнание разработчиками, недостаток тестирования на реальных языках. Инвестиции в RTL-совместимость окупаются расширением аудитории, соответствием законам и укреплением бренда как инклюзивного. Полмира действительно заслуживает удобных сайтов, и технологии уже позволяют это сделать. Осталось лишь принять это как обязательный стандарт, а не опциональность.
Другие статьи по теме:
Михаил Сидоров
15 Января 2026
Отличная статья! Особенно понравился раздел про визуальную иерархию. Обязательно применю эти принципы в своём следующем проекте.