Системные элементы экрана

Источник: ds-docs/component-contracts/foundations/system-chrome.md

Строка статуса, домашний индикатор, кнопки навигации Android, системный лист «Поделиться». Всё это рисует операционная система, а не наше приложение. В макете они есть, потому что без них не видно, сколько места остаётся содержимому, — и только поэтому.

В Figma такие слои подписаны заглавными: SYSTEM Status Bar, SYSTEM Bottom Nav Bar, SYSTEM Android Navigation, SYSTEM Activity View, SYSTEM Keyboard - iPhone, SYSTEM Keyboard – Android, SYSTEM Scroll Bar, SYSTEM Device.

Заглавные в имени — и есть признак: приставка SYSTEM значит «здесь будет элемент платформы», а не «вот наш компонент». Дизайнер ставит такой слой для удобства сборки макета: чтобы видеть экран целиком и понимать, сколько места остаётся содержимому.

Мы их не документируем. У них нет ни свойств, которые мы задаём, ни токенов, которые мы меняем, ни поведения, за которое мы отвечаем. Описать их анатомию — значит зафиксировать чужой интерфейс в момент времени и обещать разработчику, что он такой. Он не такой: он разный на разных устройствах и меняется с версией системы.

Своих контрактов у них нет. Внутри чужого дерева такой слой записывается меткой:

- path: "Basic Action/SYSTEM Bottom Nav Bar"
  kind: instance
  of: null
  local: true
  foundation: system-chrome
  size: {width: fill, height: 34}

Читается так: здесь встанет элемент платформы, реализовывать его не надо, а размер из макета — высота одного устройства, взятая для примера.

Из макета мы берём одно: сколько места под них зарезервировано и где.


Что зарезервировано

injected-safe-area-inset-topстрока статуса: часы, сеть, батареясверху, до содержимого
injected-safe-area-inset-bottomдомашний индикатор или кнопки Androidснизу, после содержимого

Оба — невидимые распорки: корень прозрачен, внутри лежит системный слой с выключенной видимостью. На экране их нет, место они занимают. В мастерах у них проставлены готовые числа — 50 сверху, 32 снизу, — и это высота одного устройства, взятая для примера.

Число из макета в код не переносится. Реальная высота приходит от системы и меняется: у телефона с вырезом одна, без выреза другая, у Android с кнопками третья, при включённом режиме звонка четвёртая. Компонент, в котором зашито 50, сломается на первом же другом телефоне.


Что это на самом деле: отступ, а не слой

injected-safe-area-inset-top и injected-safe-area-inset-bottom — не компоненты и не слои. Это отступы, которые в готовом приложении задаёт платформа. В макете они нарисованы прямоугольниками только потому, что в Figma отступ иначе не показать.

injected-safe-area-inset-topверхнийстрока статуса — часы, сеть, батарея
injected-safe-area-inset-bottomнижнийдомашний индикатор либо кнопки навигации Android

Откуда берётся значение

React (core-ui)

Отступы присылает системное host-приложение — мобильная оболочка, внутри которой работает веб-часть. Она подставляет их переменными, а вёрстка просто их берёт:

padding-top: var(--injected-safe-area-inset-top);
padding-bottom: var(--injected-safe-area-inset-bottom);

Имена переменных стоят в описании самих компонентов в Figma — это не наша выдумка, а договорённость с оболочкой. Веб-часть получает готовые числа сверху и сама их не вычисляет.

Flutter

Host-приложения здесь нет и переменные из React-контракта не применяются. Отступ проставляется прямо под системный элемент — под строку статуса сверху и под домашний индикатор снизу, — а значения берутся у системы: их отдаёт сама платформа, и виджет компенсирует наезд на содержимое.

Общее для обеих платформ: число из макета в код не идёт. В макете стоит высота одного устройства, взятая для примера, — 50 сверху и 32 снизу для домашнего индикатора, 48 для кнопок Android. Настоящая высота приходит от платформы и на каждом устройстве своя.


Что писать в карточке компонента

Узел с системной распоркой остаётся в дереве — он занимает место, и без него дерево врёт. Но описывается он одной строкой и ссылкой сюда, а не своей анатомией:

<summary>◆ <code>injected-safe-area-inset-top</code> — запас сверху</summary>

- **Роль:** держит место под строку статуса; высоту задаёт система
- **Примечание:** системный запас, см. [system-chrome.md](../../foundations/system-chrome.md)
- **position:** static
- **width:** 100%
- **height:** auto
- **opacity:** 0

Высота не пишется числом — это ровно тот случай, ради которого заведено правило размеров: 50 в макете есть, но оно ничего не задаёт.

Внутренний состав системного слоя не пересказывается никогда: ни его отступы, ни его слои, ни его цвета. Они принадлежат операционной системе.


Границы

Это описание говорит разработчику, что здесь зарезервировано место переменной высоты. Как именно его получить в своей платформе — решает разработчик: у React и Flutter разные механизмы, и оба живут вне дизайн-системы.

Дизайн-система отвечает за одно: за то, что место предусмотрено и что содержимое под системные элементы не заезжает.


Источник

Описания компонентов в Figma «Astra DS (Copy)»: injected-safe-area-inset-top (40032034:16760) и injected-safe-area-inset-bottom. Разделение по платформам — договорённость команд, зафиксирована 27.08.2026.