Опишите действие, а не внешний вид.
Стандартные контролы уже сообщают нативную роль и состояние. Оберните визуальный или domain-specific контент в Semantics, если ему нужны label, hint, role или action.
new Semantics(
new Card(BuildProjectSummary(project)),
label: $"Открыть {project.Name}",
role: SemanticsRole.Button);Если wrapper полностью описывает составной компонент, исключите семантику визуальных детей. Иначе диктор может прочитать один и тот же текст несколько раз.
Tab должен проходить интерфейс в логичном порядке.
Используйте встроенные интерактивные контролы и focus traversal groups. Не реализуйте клавиатурное управление только через pointer callback.
При открытии modal переместите фокус внутрь него. При закрытии верните фокус элементу, который открыл modal. Настройки диалога должны выполнять это как единый жизненный цикл.
LumaFlow передаёт ресурсы по дереву, но не диктует формат хранения.
Localizations размещает типизированный объект ресурсов в context. Приложение само решает, загружать ли строки из ScriptableObject, JSON, Unity Localization package или собственного сервиса.
new Localizations<AppStrings>(
strings,
new ApplicationShell());
var strings =
Localizations.Of<AppStrings>(context);Замените объект ресурсов у владельца локали. Зависимые ветви получат новые строки через context; вручную обходить VisualElement и менять Label не требуется.
Уважайте reduced motion и масштаб текста.
Передайте MediaQueryData.DisableAnimations, если платформа или настройки приложения требуют уменьшить движение. Обычные implicit-анимации перейдут к конечному значению без движения.
Используйте унаследованный TextScaler, а не предположение, что фиксированный font size всегда читаем. Проверяйте перенос строк и рост контролов при увеличенном масштабе.
Минимальный acceptance checklist.
Всё доступно без мыши
Tab order логичен, focus видим, Enter/Space активируют контролы, Escape закрывает только допустимый верхний слой.
Роли и названия однозначны
Элемент сообщает действие и состояние; декоративные изображения не создают шум.
Текст увеличивается без потери данных
Подписи не обрезаются, кнопки растут, важный контент остаётся доступен через прокрутку.
Интерфейс работает без анимаций
Reduced motion не скрывает изменения состояния и не блокирует завершение callback.