UI Design Guidelines — MANDATORY
Обязательное требование для всех новых или измененных элементов UI в этом приложении (страницы Blazor, диалоги, компоненты).
Это источник истины, на который ссылается CLAUDE.md. Если правило вас блокирует, остановитесь и спросите — не отправляйте UI, который его нарушает. Основано на plans/ui-overhaul.md.
1. Mobile-first, always
- Создавайте для телефона 360–430px в первую очередь, затем расширяйте для большего размера с помощью
min-widthмедиа-запросов / свойств точек разрыва MudBlazor. Никогда не начинайте с рабочего стола с переопределениямиmax-width. - Нет горизонтального скроллирования при любой ширине 320–1920px. Если содержимое шире области просмотра, это ошибка.
- Цели касания ≥ 44px (
var(--app-touch-target)). Текстовые поля ввода ≥ 16px шрифт (предотвращает масштабирование iOS при фокусе). - Учитывайте вырезы: используйте
env(safe-area-inset-*); область просмотра уже устанавливаетviewport-fit=cover. - Соблюдайте
prefers-reduced-motion— никакая важная информация не должна передаваться только анимацией.
2. Design tokens — no hard-coded values
- Все цвета/радиусы/интервалы берутся из дизайн-токенов: тема MudBlazor (
Web/Components/Theme.cs) + CSS пользовательские свойства, выдаваемыеWeb/Branding/BrandingCss.cs(var(--app-primary),--app-surface,--app-border,--app-text*,--app-radius, …). - Никогда не кодируйте цвет в формате hex, радиус или строку бренда в компоненте или CSS-правиле. Используйте токен.
Токены поступают из белолейбл
BrandingOptions, поэтому палитра продавца должна беспрепятственно попасть в ваш UI. - Новое значение, влияющее на бренд → добавьте токен + поле брендинга; не встраивайте его.
3. Responsive layout & data
- Таблицы сворачиваются в карточки на телефонах. Каждый
MudTableустанавливаетBreakpoint="Breakpoint.Sm"и каждыйMudTdимеетDataLabel. Нет сырой широкой таблицы на мобильном. (Шаблон:Components/Pages/Nodes.razor.) - Сетки:
MudItem xs="12" sm="6" md="4"— во всю ширину на телефоне, несколько столбцов на больших экранах. - Формы одного столбца на мобильных; большие цели касания;
inputmode/autocompleteна входах; числовой/десятичный inputmode для денег/процентов. - Правильные элементы управления для структурированного ввода — никогда не используйте сырое текстовое поле для чисел или списков. Собирайте числа,
деньги, проценты, даты, перечисления и любые многозначные данные с правильным элементом управления (
MudNumericField,MudDatePicker,MudSelect, редактируемый список добавления/удаления строк типизированных полей или таблица), каждое поле индивидуально проверено. Единое свободное текстовое полеMudTextField, в которое пользователь должен ввести запятую/пробел/новую строку разделённый блоб — который вы затем разбираете — запрещено: это подвержено ошибкам, непроверенно и враждебно на телефоне. Никто не хочет вводить блоб. Ввод с несколькими значениями — это редактируемый список типизированных строк (добавить / удалить), или загружается из существующих данных домена (например, запустите проверку прямо с завершенного обратного теста вместо повторного ввода его чисел). ПростойMudTextFieldтолько для подлинного свободного текста — имена, примечания, поиск, описания. - Предоставьте загрузку, пустое и ошибочное состояния на каждом списке/деталях — подходящие для мобильного.
- Мобильная нижняя навигация (
Components/Layout/BottomNav.razor) является основной навигацией телефона; ящик с группировкой — это полное меню. Добавьте туда высокопроизводительные пункты назначения; держите это ≤5 элементов.
4. Dialogs (create/edit)
- Все действия добавления/создания/редактирования/новых используют диалог MudBlazor (
IDialogService.ShowAsync<TDialog>), никогда встроенную форму страницы. Диалоги находятся вWeb/Components/Dialogs/, предоставляют[Parameter]s, возвращают вложеннуюpublic sealed record …Result(...). Действия строк списка (начало/остановка/удаление) остаются встроенными как кнопки значков. - На телефонах диалоги должны быть полноэкранными / полной ширины и с учетом клавиатуры.
5. Inline help — every control
- Каждый неочевидный параметр, выбор, переключатель или действие получает
<HelpTip Text="…" />(Components/HelpTip.razor) — наведение на рабочий стол, касание на мобильном. Получите текст изdocs/, чтобы руководство оставалось синхронизированным с поведением; обновите оба в одном коммите.
6. White-label
- Имя продукта, логотип, описание, поддержка/компания, цвета, favicon — все берутся из
BrandingOptions. Ссылайтесь на них (IBrandingThemeProvider/IOptionsMonitor<AppOptions>), никогда не используйте буквальное "cMind" или цвет бренда. Манифест PWA, значки, цвет темы и герой входа — все с брендингом.
7. PWA
- Приложение установочное. Держите конечную точку манифеста (
/manifest.webmanifest) с брендингом, значки присутствуют (192/512/маскируемое + apple-touch), сервис-воркер только app-shell (никогда не касаясь схемы Blazor/_framework/hubs), и офлайн страница работает. Новый статический маршрут → сохраняйтеscopeманифеста. - Blazor Server требует живую схему SignalR → устанавливаемое + app-shell, а не полный офлайн. Не обещайте офлайн интерактивность.
8. Accessibility
- Метки на входах,
aria-*на пользовательских элементах управления, видимый фокус, логический порядок фокусировки. Так как тема белолейбл, проверьте контраст против активной темы, а не фиксированной палитры.
9. E2E — no UI ships untested (blocking)
Каждое изменение, ориентированное на пользователя, отправляется Playwright E2E в tests/E2ETests, управляется как реальный пользователь, на эмуляции мобильного
устройства плюс рабочий стол:
- Новый маршрут → добавьте его в
PageSmokeTestsиMobileLayoutTests(отображается, нижняя навигация, нет ошибок в пользовательском интерфейсе). - Преобразуйте таблицу/страницу → добавьте ее маршрут в мобильный без переполнения набор.
- Новый поток → реалистичное мобильное путешествие (создание/редактирование/сохранение в оба конца) и нежелательный путь (неправильный ввод, пустой список, доступ запрещен по роли).
- Новый совет → подтвердите, что он открывается при касании (
HelpTipTestsпаттерн). - Используйте
AppFixture.NewAuthedMobilePageAsync/NewAnonymousMobilePageAsync(эмуляция устройства). dotnet testзелено перед "готово". Эмулированный WebKit ≠ мобильный Safari — шлюз реального устройства — это отдельный этап выпуска.
10. Definition of done (UI)
- Mobile-first; нет горизонтального переполнения 320–1920px; цели касания ≥44px.
- Только дизайн-токены — ноль жестко закодированных цветов/радиусов/строк брендов.
- Таблицы → карточки на телефоне (
DataLabel+Breakpoint.Sm); состояния загрузки/пусто/ошибка присутствуют. - Структурированный ввод использует правильные проверенные элементы управления (числовой/дата/выбор/редактируемая строка списка) — нет сырого текстового поля, в которое пользователь вводит разделённый число/значение блоб.
- Создание/редактирование через диалог; полноэкранно на мобильном.
- Каждый элемент управления имеет
HelpTip, полученный из документов. - White-label + PWA соблюдаются.
- Добавлены E2E мобильного + рабочего стола (дым, без переполнения, путешествие, нежелательный путь);
dotnet testзелено. - Rider
get_file_problems+dotnet format analyzersчисто на измененных файлах.