diff --git a/cspell-words.txt b/cspell-words.txt index 7882fed1..4fd35411 100644 --- a/cspell-words.txt +++ b/cspell-words.txt @@ -1142,3 +1142,4 @@ COV cdesc qitem skreview +юнит diff --git a/docs/superpowers/specs/2026-05-14-project-details-drawer-design.md b/docs/superpowers/specs/2026-05-14-project-details-drawer-design.md new file mode 100644 index 00000000..dccc7201 --- /dev/null +++ b/docs/superpowers/specs/2026-05-14-project-details-drawer-design.md @@ -0,0 +1,296 @@ +# Design Spec: ProjectDetailsDrawer (push-mode справа) + +**Дата:** 2026-05-14 +**Триггер:** Запрос заказчика — при выборе **одного** проекта на странице `/projects` показывать справа боковую панель с настройками и кнопкой «Сохранить»; BulkActionsBar (#869) должен появляться только при **2+ выбранных**. +**Текущее поведение (baseline):** [app/resources/js/views/ProjectsView.vue:78](../../../app/resources/js/views/ProjectsView.vue#L78) — `` — bulk-bar показывается при ≥1 selected, никакого drawer'а нет. +**Mockup:** [`2026-05-14-project-details-drawer-mockup.html`](./2026-05-14-project-details-drawer-mockup.html) (статический, 3 состояния через toggle). + +--- + +## 1. Поведение (UX-контракт) + +| `store.selectedIds.size` | Что показывается | Что скрыто | +|---|---|---| +| `0` | Грид во всю ширину | Drawer ✕, BulkActionsBar ✕ | +| `1` | Грид сдвинут влево (`padding-right: 480px`) + drawer открыт справа | BulkActionsBar ✕ | +| `≥ 2` | Грид во всю ширину + BulkActionsBar внизу (как сейчас) | Drawer ✕ | + +**Переходы:** + +- Клик на чекбокс ProjectCard (1-й выбранный) → drawer въезжает справа за 240мс CSS-transition, грид сдвигается влево. +- Клик на чекбокс 2-го проекта → drawer мгновенно уезжает обратно (transform: translateX(100%)) + грид возвращается, BulkActionsBar появляется снизу. +- Снятие выбора до 0 → всё уходит (drawer и bulk-bar). +- Закрытие drawer (X, «Отмена», ESC, клик на чекбокс выбранного проекта) → `store.clearSelection()` + drawer закрывается + грид возвращается. + +**Edge case:** если `singleSelectedProject` исчезает из `store.items` (после fetch — проект удалён/архивирован/выпал из фильтра), drawer закрывается автоматически через computed. + +--- + +## 2. Архитектура + +**Подход A: custom `