From 9d889558d3ef6e7e1407cfafc45daf5facc830c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Thu, 14 May 2026 13:33:27 +0300 Subject: [PATCH] docs(spec): ProjectDetailsDrawer push-mode design + mockup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Design spec + интерактивный HTML mockup для side-panel редактирования проекта при выборе одного проекта на /projects. Поведение: - selectedIds.size === 1 → drawer справа (480px, push-mode, grid сдвигается) - selectedIds.size >= 2 → BulkActionsBar внизу (условие в ProjectsView.vue:78 меняется > 0 → >= 2) - 0 selected → ни drawer, ни bulk-bar Footer drawer: - Слева (destructive): Приостановить (toggle-active) + Удалить (soft-archive) - Справа (form actions): Отмена (close+clearSelection) + Сохранить (PATCH /api/projects/{id}) Backend без изменений — используются существующие endpoints PATCH/DELETE/ toggle-active. Pinia store useProjectsStore уже имеет update/toggleActive/ archive методы. Прецеденты: DealDetailDrawer.vue (overlay-вариант); push-mode здесь — custom aside + CSS transform/padding-right, без Vuetify teleport. Mockup: 3 состояния через JS-toggle (0/1/2+ selected), Forest palette (Teal #0F6E56, ivory #F6F3EC, noir #012019). Phone masked под 152-FZ ПДн. cspell-words.txt +1 (юнит) — для упоминания юнит-тестов в spec §6. Open questions: 0 (все 5 UX-решений утверждены заказчиком 2026-05-14). --- cspell-words.txt | 1 + ...026-05-14-project-details-drawer-design.md | 296 +++++++++++++ ...6-05-14-project-details-drawer-mockup.html | 392 ++++++++++++++++++ 3 files changed, 689 insertions(+) create mode 100644 docs/superpowers/specs/2026-05-14-project-details-drawer-design.md create mode 100644 docs/superpowers/specs/2026-05-14-project-details-drawer-mockup.html 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 `