ADR-UI-005. Layout приложения

ADR Версия: 1.0 accepted

Нужно зафиксировать разметку приложения: какую оболочку (шапка + рабочая область) предоставляет приложение и как страница рабочей области описывает свою внутреннюю структуру. На текущем этапе фиксируется основной режим; режим «без оболочки» (экраны входа) и механика доступа определяются отдельным ADR по мере появления ролей и доступа.

⟨/⟩ Исходник

1. Контекст и постановка задачи

Приложению нужна предсказуемая разметка: единая оболочка (шапка с навигацией, рабочая область) и стандартный каркас страницы, чтобы гриды, формы и карточки не расходились по отступам и поведению скролла.

Роли и доступ ICD пока не заданы (открытый вопрос видения — см. IcdVision), хотя вход в систему предполагается. Поэтому фиксируем основной режим (рабочее приложение с оболочкой); режим «без оболочки» (экраны входа/выхода/отказа) и механику доступа (гарды, видимость навигации по правам) вводим отдельным ADR, не переписывая этот.

2. Драйверы решения

  1. Единый каркас страницы — общий скелет (header страницы + body) для гридов, форм, карточек.
  2. Минимум вложенности — не плодить layout-компоненты под каждый подвид страницы.
  3. Разделение ответственности — оболочка приложения / каркас страницы / содержимое страницы.
  4. Поэтапность — auth-режим не заложен преждевременно; основной layout не зависит от ещё не определённого доступа.

3. Рассмотренные варианты

4. Решение

Выбран Вариант B. На текущем этапе реализуется только основной режим.

4.1. Оболочка приложения

Корневая оболочка рабочего приложения содержит:

оболочка
├── шапка
│   ├── логотип
│   ├── главное меню (горизонтальное)
│   └── зона профиля пользователя (наполняется с введением auth)
└── рабочая область
    └── <router-outlet>   ← сюда рендерятся страницы фич

Главное меню — горизонтальное, в шапке. Конкретный состав пунктов определяется на этапе UI-спеки страниц (отложено). Видимость пунктов по правам появится вместе с механикой доступа (отдельный ADR).

4.2. Каркас страницы рабочей области

Любая страница в <router-outlet> оборачивается в каркас page с двумя зонами:

<icd-page>
  <icd-page-header>
    <!-- заголовок раздела, кнопки действий; место для breadcrumbs -->
  </icd-page-header>
  <icd-page-body>
    <!-- грид / форма / карточка -->
  </icd-page-body>
</icd-page>

Каркас собирает зоны через контент-проекцию и задаёт сетку: header — sticky сверху, body — скроллящаяся область. Компоненты — собственные (набор ui/, слой layout), классы без суффиксов (Page, PageHeader, PageBody), селекторы icd-page / icd-page-header / icd-page-body.

Это даёт:

4.3. Соответствие зон

Зона Что рендерит
Шапка приложения оболочка (единственная на приложение)
Заголовок/действия страницы icd-page-header внутри страницы
Рабочая область страницы icd-page-body внутри страницы

5. Положительные следствия

6. Отрицательные следствия и компромиссы

7. Проверка

8. Открытые вопросы / отложено

Связанные артефакты

Документы