feat(ai-chat): finalize collapse-on-page-focus (verified live; remove completed doc) #111

Closed
Ghost wants to merge 0 commits from feat/ai-chat-collapse-on-page-focus into develop

Фича: авто-сворачивание AI-чата в шапку при фокусе на странице

Отчёт по скиллу архитектора.

1. Задача

Из docs/backlog/ai-chat-collapse-on-page-focus.md: плавающее окно AI-чата должно само сворачиваться в свою шапку, как только пользователь кликает мимо окна (уходит читать страницу), и разворачиваться обратно по клику на шапку. Сворачивание — визуальный коллапс (стрим ответа не прерывается), не закрытие.

2. Результат анализа (verify-before-build)

Фича уже реализована и смержена в develop — коммит f6e216cb "feat(ai-chat): auto-collapse the chat window on page focus, expand on header (#42)". В коде присутствует вся обвязка:

  • внешний mousedown-слушатель в capture-фазе, армится только при windowOpen && !minimized (ai-chat-window.tsx:282-291);
  • чистые хелперы shouldCollapseOnOutsidePointer / isHeaderClick вынесены в utils/collapse-helpers.ts и покрыты collapse-helpers.test.ts (9 тестов);
  • клик-vs-драг в startDrag через isHeaderClick (порог 4px) + minimizedRef против stale-замыкания (:340-369);
  • setMinimized(false) при каждом открытии (:265-273);
  • a11y: в свёрнутом виде заголовок получает role="button", tabIndex=0, aria-label={t("Expand")}, обработку Enter/Space (:414-428);
  • гард [data-portal] исключает клики по меню/модалкам Mantine;
  • CSS .minimized .dragBar { cursor: pointer }, i18n-ключ "Expand".

Соответственно, реализовывать нечего — этот PR удаляет завершённую планировочную доку.

3. Решение

Удалён docs/backlog/ai-chat-collapse-on-page-focus.md (фича доставлена). Никаких изменений кода.

4. Найденные баги

Нет. Фича корректна и соответствует спеке во всех проверенных пунктах.

5. Тестирование — статистика

Юнит-тесты: collapse-helpers.test.ts — 9/9 зелёные (pnpm --filter client exec vitest run).

Живая браузерная проверка: 1 цикл, автономный субагент в headless Chromium против запущенного стенда (логин admin@test.local, страница в спейсе General, реальный редактор).

  • Циклов тестирования: 1 (с первого прохода PASS).
  • Багов найдено: 0.
  • Кем/как найдено: субагент написал Playwright-скрипты и эмпирически проверил каждый пункт спеки (не предположения — реальные ассерты на DOM/классы).

Подтверждённые поведения (все ✓):

  1. ✓ Авто-сворот по клику в редактор → корневой узел получает класс [class*="minimized"] (скрин f1-02).
  2. ✓ Тело скрыто, но НЕ размонтировано (content-узел в DOM, display:none) — стрим не прерывается.
  3. ✓ Клик по шапке (без движения) разворачивает (скрин f1-03).
  4. ✓ Драг >4px НЕ разворачивает (репозиционирует).
  5. ✓ При повторном открытии окно всегда развёрнуто (скрин f1-06).
  6. ✓ Клик по узлу [data-portal] НЕ сворачивает; контроль (клик по body) — сворачивает (скрин f1-07).
  7. ✓ A11y-бонус: в свёрнутом виде заголовок role="button" + Enter разворачивает (скрин f1-04).

🤖 Generated with Claude Code

## Фича: авто-сворачивание AI-чата в шапку при фокусе на странице Отчёт по скиллу архитектора. ### 1. Задача Из `docs/backlog/ai-chat-collapse-on-page-focus.md`: плавающее окно AI-чата должно само сворачиваться в свою шапку, как только пользователь кликает мимо окна (уходит читать страницу), и разворачиваться обратно по клику на шапку. Сворачивание — визуальный коллапс (стрим ответа не прерывается), не закрытие. ### 2. Результат анализа (verify-before-build) **Фича уже реализована и смержена в develop** — коммит `f6e216cb` "feat(ai-chat): auto-collapse the chat window on page focus, expand on header (#42)". В коде присутствует вся обвязка: - внешний `mousedown`-слушатель в capture-фазе, армится только при `windowOpen && !minimized` (`ai-chat-window.tsx:282-291`); - чистые хелперы `shouldCollapseOnOutsidePointer` / `isHeaderClick` вынесены в `utils/collapse-helpers.ts` и покрыты `collapse-helpers.test.ts` (9 тестов); - клик-vs-драг в `startDrag` через `isHeaderClick` (порог 4px) + `minimizedRef` против stale-замыкания (`:340-369`); - `setMinimized(false)` при каждом открытии (`:265-273`); - a11y: в свёрнутом виде заголовок получает `role="button"`, `tabIndex=0`, `aria-label={t("Expand")}`, обработку Enter/Space (`:414-428`); - гард `[data-portal]` исключает клики по меню/модалкам Mantine; - CSS `.minimized .dragBar { cursor: pointer }`, i18n-ключ `"Expand"`. Соответственно, реализовывать нечего — этот PR удаляет завершённую планировочную доку. ### 3. Решение Удалён `docs/backlog/ai-chat-collapse-on-page-focus.md` (фича доставлена). Никаких изменений кода. ### 4. Найденные баги Нет. Фича корректна и соответствует спеке во всех проверенных пунктах. ### 5. Тестирование — статистика **Юнит-тесты:** `collapse-helpers.test.ts` — 9/9 зелёные (`pnpm --filter client exec vitest run`). **Живая браузерная проверка:** 1 цикл, автономный субагент в headless Chromium против запущенного стенда (логин admin@test.local, страница в спейсе General, реальный редактор). - Циклов тестирования: **1** (с первого прохода PASS). - Багов найдено: **0**. - Кем/как найдено: субагент написал Playwright-скрипты и эмпирически проверил каждый пункт спеки (не предположения — реальные ассерты на DOM/классы). Подтверждённые поведения (все ✓): 1. ✓ Авто-сворот по клику в редактор → корневой узел получает класс `[class*="minimized"]` (скрин `f1-02`). 2. ✓ Тело скрыто, но НЕ размонтировано (`content`-узел в DOM, `display:none`) — стрим не прерывается. 3. ✓ Клик по шапке (без движения) разворачивает (скрин `f1-03`). 4. ✓ Драг >4px НЕ разворачивает (репозиционирует). 5. ✓ При повторном открытии окно всегда развёрнуто (скрин `f1-06`). 6. ✓ Клик по узлу `[data-portal]` НЕ сворачивает; контроль (клик по body) — сворачивает (скрин `f1-07`). 7. ✓ A11y-бонус: в свёрнутом виде заголовок `role="button"` + Enter разворачивает (скрин `f1-04`). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Ghost added 1 commit 2026-06-21 06:12:41 +03:00
The feature is already implemented and merged into develop (f6e216cb):
auto-collapse the AI chat window into its header on outside-page pointer,
expand on header click, with keyboard a11y. Verified live in-browser and
covered by collapse-helpers.test.ts (9 tests). Removing the now-completed
planning doc.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Ghost closed this pull request 2026-06-21 14:48:38 +03:00

Pull request closed

Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: vvzvlad/gitmost#111