Перейти к основному содержимому

Правила UI Responsive Design

Назначение

Документ задаёт правила адаптивной вёрстки frontend-приложений Pin. Цель — поддержать диапазон устройств от мобильных (320px) до широкоэкранных (2560px+), с целевым диапазоном 900–1400px для основных рабочих сценариев pin-admin.

Целевые устройства и диапазоны

ДиапазонУстройствоПоддержкаЦель
320–479pxМобильный портрет (iPhone SE и аналоги)ПолнаяПросмотр, заполнение записей, чек-листов
480–767pxМобильный landscape, маленькие планшетыПолнаяТо же + просмотр расписаний
768–899pxПланшет портрет (iPad mini)Полная+ редактирование записей
900–1279pxМалый ноутбук, целевой минимумОсновнойВсе операции, включая конструктор
1280–1439pxСтандартный ноутбукОсновнойВсе операции
1440–1919pxЦелевой десктопОсновнойВсе операции, удобно для конструктора и dashboard
1920–2559pxFull HD широкийПолнаяВсе операции + multi-column layouts
≥ 2560px2K/4K широкийУсиленнаяMulti-column layouts, побольше data density

Базовые breakpoints

Используются Tailwind 4.3 breakpoints с расширением:

// tailwind.config.ts
export default {
theme: {
screens: {
xs: "480px",
sm: "640px",
md: "768px",
lg: "900px", // целевой минимум для рабочих экранов
xl: "1280px",
"2xl": "1440px",
"3xl": "1920px",
},
},
};

Стратегии адаптации

Mobile-first

Базовая верстка пишется для xs (≥320px), затем расширяется через md:, lg:, xl:, 2xl:, 3xl: модификаторы.

Layout patterns

PatternMobile (xs)Tablet (md)Desktop (lg+)
Главная навигацияHamburger drawerHamburger drawerПостоянный sidebar
Header app barCompact (только logo + menu + avatar)Expanded (+ facility switcher)Full (+ search + breadcrumbs + actions)
ТаблицыCards view (одна карточка = одна запись)Cards view + filter chipsПолноценная таблица
ФормыSingle columnSingle column2-column для длинных форм
Dashboard1 widget per row2 widgets per row12-col grid с конфигурируемыми widget
МодалыFull screen sheetCentered с max-widthCentered с max-width
Side panelBottom sheetDrawer right (300px)Drawer right (400px)

Адаптивные паттерны данных

Таблица ↔ Cards

Для всех таблиц записей каталогов, чек-листов, дашбордов:

DataTable → виден при ≥ lg (900px)
DataCardsGrid → виден при < lg

Carriage свитч происходит через useBreakpoint("lg") хук + Tailwind utility-классы.

Календарь

Monthly view → виден при ≥ lg
Weekly view → виден при md
Daily list view → виден при < md

Pivot

Pivot всегда рендерится; на мобильных добавляется горизонтальный скролл и sticky первая колонка.

Container queries

Tailwind 4.3 нативно поддерживает @container query. Используется для компонентов, чьё поведение должно зависеть от собственного контейнера, а не viewport:

<div className="@container">
<div className="grid @lg:grid-cols-2 @2xl:grid-cols-4">
{/* виджеты адаптируются под размер контейнера */}
</div>
</div>

Container queries обязательны для:

  • Widgets в dashboard (так как dashboard сам ресайзится drag-drop).
  • Card components, которые могут быть в разных layouts.

Touch и pointer

РазмерМинимум для touchМинимум для mouse
Кнопка44×44px32×32px
Tap area44×44px24×24px
Spacing между tap targets8px4px

На устройствах с touch (через @media (pointer: coarse)) увеличиваются размеры interactive элементов.

Responsive типографика

Используется CSS clamp() для плавной адаптации:

:root {
--font-size-h1: clamp(1.5rem, 4vw, 2.5rem);
--font-size-h2: clamp(1.25rem, 3vw, 2rem);
--font-size-body: clamp(0.875rem, 1vw, 1rem);
}

Mobile (< md)

  • Hamburger button в Header app bar.
  • При клике открывается полноэкранный drawer слева.
  • Backdrop blur + dim background.
  • Закрытие по Escape, swipe, click outside, navigate.

Tablet (md–lg)

  • Sidebar collapsible (icons-only).
  • При раскрытии — overlay над контентом.

Desktop (≥ lg)

  • Sidebar постоянный, занимает 240–280px.
  • Может быть свёрнут в icons-only через user preference.
  • Сохранение состояния в useUiPreferencesStore (Zustand persisted).

Тестирование адаптивности

ИнструментИспользование
Browser DevToolsManual testing на дефолтных preset устройствах
Playwright viewport sizesE2E на 320, 768, 900, 1280, 1440, 1920
Storybook viewport addonComponent-level responsive testing
Real device testingПеред каждым релизом для критичных flows

Производительность на мобильных

  • Lazy load для chart/dashboard widgets через React.lazy + Suspense.
  • Avoid layout shifts: skeleton с правильными размерами.
  • Минимизировать JS bundles через code-splitting per route.
  • Использовать <img loading="lazy"> для всех картинок не в viewport.
  • Critical CSS inline через Vite Plus.

Запрещено

  • Фиксированная ширина в px без альтернативы для маленьких экранов.
  • Горизонтальный scroll на странице (исключение — pivot и временные шкалы внутри блока).
  • Hover-only взаимодействия без альтернативы для touch (например, tooltip только на hover).
  • Tap targets < 44×44px на touch устройствах.
  • vh единицы без fallback для мобильных браузеров (iOS Safari).
  • Бесконечный scroll без paginated альтернативы.

Обратные ссылки

Автоссылки: где используется этот документ.

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