Entrixy — руководство по дизайну

Живой документ. Здесь записаны калибровки, ритм и договорённости об интерфейсе; он обновляется всякий раз, когда что-то решено.

Содержание
  1. Иконки — размеры и калибровка
  2. Typography
  3. Ритм и отступы
  4. Цвета и уровни
  5. Controls
  6. Animations
  7. Правила текста
  8. Паттерны взаимодействия
  9. Чего не трогать

1. Иконки — размеры и калибровка

Проблема

Иконки Material из androidx.compose.material.icons.outlined.* имеют один номинальный размер — сетку 24×24, — но нарисованная часть у каждой своя. Поставь всем простой Modifier.size(24.dp)— и одни будут выглядеть крупными и тяжёлыми (Bolt, Delete), а другие крошечными (Contacts, VpnKey). Их надо калибровать вручную.

Метод калибровки

  1. Снять экран с иконками в кружках 38 dp — это наше посадочное место.
  2. На Python с PIL и numpy измерить габаритный прямоугольник нарисованного глифа — максимальную ширину и высоту в пикселях.
  3. Формула: new_size = 24 × 52 / measured_px, с ограничением до [18..28].
  4. Затем отцентровать в слоте 38 dp по вертикали и горизонтали.

52 px — эталонный нарисованный глиф, Fingerprint; всё меряется от него как от единицы.

Итоговая карта размеров

IconРазмерWhy
Add, Apps, ArrowBack, Close28dpтонкие линии, глиф 36–41 px
AutoMode, Bolt, DeleteOutline, Edit, List, Photo, QrCode, Tune, DriveFileRenameOutline26dpсредняя плотность, глиф около 47 px
LocationOn24dpбулавка на карте — не трогать, это эталон
LocationOff26dpперечёркнутая булавка — не трогать
ContentCopy, MyLocation, PeopleAlt, Wifi, ExpandMore, ExpandLess22dpширокие или высокие, зрительно тяжёлые
Contacts, VpnKey20dpперегружены внутренними деталями
Не трогать: LocationOn (24), LocationOff (26), ExpandMore и ExpandLess (22). Это эталонные иконки: их согласовали по пикселям, и от них меряется вся калибровка.

AutoMode

Используется везде, где раньше стоял Bolt, — кнопка Автоматизация на карточке ключа, иконка раздела в настройках. Размер 26 dp, как у Bolt.

Где таблица лежит в коде

IconsDebugSheet.kt — карта iconSizeByName. Отладочный экран открывается из SettingsScreen кнопкой Иконки UI (дебаг): сверху FlowRow откалиброванных иконок, снизу список имён, размеров и контекстов.

2. Типографика

Используем стандартные роли Material 3, сознательно ограничившись четырьмя:

RoleРазмер / межстрочный интервалГде используется
titleLarge SemiBold22sp/28spЗаголовок нижнего листа (Гостю · <объект>)
titleMedium SemiBold16sp/24spЗаголовки правил (Геолокация, Wi-Fi, Интервал, Активация) и подписи FieldSection (Координаты, Радиус, Режим, Сохранённые сети)
bodyMedium14sp/20spПодписи радиокнопок, текст внутри кнопок-пилюль, названия сегментов
bodySmall muted12sp/16spСтатусы и подсказки (36540 м до точки, 74 м · максимум, гость может уменьшить, тексты подсказок). Цвет: onSurfaceVariant
Rule: не мешать начертания внутри роли. Если что-то titleMedium SemiBold, то оно SemiBold везде — не regular здесь и Semi там.

3. Ритм и отступы

Шкала

Договорились работать кратно 2 / 4 / 8 / 10 / 14 / 16 / 20. Без то густо, то пусто: одинаковые элементы получают одинаковые отступы.

Между карточками в основной прокрутке

Внутри карточки (RuleCard)

Внутри FieldSection (подпись плюс содержимое)

Кнопки-пилюли и статусы

Ползунки — особый случай

Ползунок Material 3 занимает в раскладке около 48 dp из-за минимальной области касания, из которых видимая дорожка — всего около 4 dp посередине, а сверху и снизу примерно по 22 dp пустой сенсорной зоны. Отсюда:

Результат: расстояние от последнего видимого элемента — пилюли, радиокнопки или бегунка — до нижнего края карточки примерно одинаково у всех карточек.

4. Цвета и уровни

Три уровня доверия гостю

Каждое правило — Геолокация, Wi-Fi, Время, Авторизация, Подтверждение — и блок Активация принимают один из трёх уровней. Кружок иконки на карточке окрашивается соответствующим цветом, когда выключатель включён.

KeyLabelColourDescription
own Решает гость #3BA55D (green) Гость сам выбирает настройку
suggest Preset #E5B409 (yellow) Значение задано, и гость может его изменить
force Locked #CC3322 (red) Значение задано, и гость изменить его не может

При выключенном переключателе кружок становится серым (#9AA0A6), какой бы уровень ни был выбран.

Смысл максимума и минимума: in yellow (Задано) значение радиуса — это максимум, и гость может лишь уменьшить его. Для числа сетей Wi-Fi — порога совпадения — всё наоборот: это минимум, который гость может лишь увеличить. Направление свободы переворачивается, и тексты статусов говорят об этом прямо: максимум, гость может уменьшить / минимум, гость может увеличить.

Правила для описаний уровней

5. Элементы управления

Цветной кружок с иконкой (38 dp)

Единое посадочное место 38 dp по всему приложению:

Радиокнопки

Оборачивать в Box(Modifier.size(38.dp), contentAlignment=Center) { RadioButton(...) } , чтобы центр кружка радиокнопки совпал с центром цветного кружка выше. Без обёртки радиокнопка уезжает по горизонтали, потому что RadioButton рисуется со своими отступами.

Между радиокнопкой и её текстом: Spacer(14.dp). Между строками радиокнопок в группе: Column(spacedBy(4.dp)).

Минимальная область касания отключена: CompositionLocalProvider(LocalMinimumInteractiveComponentEnforcement provides false) — иначе каждая строка радиокнопки раздувается до 48 dp и ломает ритм.

Switch

Стандартный переключатель Material 3, справа от заголовка карточки. Выключает правило целиком, и цвет уровня тогда не показывается — кружок серый.

Сегментированный ряд

Свой элемент для переключения режимов внутри правила — сейчас только в Wi-Fi: По конкретной сети / По сетям вокруг. Два элемента в Row, у каждого weight(1f):

Кнопки-пилюли

Обводка, иконка и текст, полностью скруглённые. Для второстепенных действий — Использовать текущее положение, Снять сети вокруг. В выключенном состоянии обводка и текст уходят в alpha=0.4.

Slider

См. раздел 3 про offset(y=-16.dp) и sliderTrim(). Перед ползунком всегда идёт StatusLine со статусным текстом (bodySmall, приглушённый) — 74 м · максимум, гость может уменьшить.

Выпадающий список уровней

Открывается нажатием на строку заголовка карточки — всю Row, кроме переключателя. Появляется прямо под шапкой, во всю ширину содержимого карточки. Для этого:

Пункты списка дышат, а не сплюснуты в строки: слева цветной маркер, название жирным, описание под ним мелким приглушённым шрифтом. По вертикали выравниваются по первой строке — по названию.

6. Анимации

Пульсирующий кружок Активации

В отличие от обычных цветных кружков правил, кружок в шапке Активации пульсирует.

Формулу прозрачности не трогать. Она далась не с первого раза, и любое упрощение — линейное (1−p) или ease-out — даёт заметный рывок.

7. Правила текста

Punctuation

Одно предложение в строке интерфейса точки не получает. Точки появляются только при двух и более предложениях, чтобы их разделить. Это касается всех описаний, подсказок, статусов, всплывающих пояснений, заголовков и отдельных фраз.

От чьего лица пишем

Выбор между максимумом и точным значением

В статусах ползунка в жёлтом режиме (Задано) прямо указываем направление свободы:

В красном (Закреплено): 74 м · ровно / 5 из 7 · ровно.

Названия уровней устоялись

Решает гость / Задано / Закреплено прижились, менять их не будем.

8. Паттерны взаимодействия

Переключатель или радиовариант не выбрано

Если у правила есть выключенное состояние, выражать его переключателем, а не радиовариантом вроде Не требуется / Нет / Выкл. Иначе у пользователя два способа выключить одно и то же, и это путает.

Examples:

Координаты и действия справа

В блоке Координаты иконки копирования и удаления стоят справа вровень с обеими строками (подписью и статусом). Реализовано как Row { Column(weight=1f) { label; status }; CopyIcon; DeleteIcon }. Иконки центрируются по вертикали относительно пары целиком.

Показ и скрытие тела карточки

Тело раскрывается только когда:

Animation: expandVertically(tween(220)) + fadeIn(tween(220)) при открытии, shrinkVertically(tween(180)) + fadeOut(tween(120)) при закрытии.

Когда показывать диалог Ключ добавлен

При получении гостевого ключа — только если приложение на экране и ключ новый, а не повторный. Иначе сохраняем молча.

9. Чего не трогать

Связанные документы

Последнее обновление: 18 апреля 2026 · версия документа 2.07