feat(ai-chat): auto-collapse chat window on page focus (#42) #50
Reference in New Issue
Block a user
Delete Branch "feat/ai-chat-collapse-on-focus"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Реализация #42 — авто-сворачивание окна AI-чата в заголовок при фокусе на странице. Ветка от develop. Closes #42.
Поведение
Окно само сворачивается в заголовок (визуальный коллапс, НЕ закрытие —
ChatThreadостаётся смонтирован, поток ответа не прерывается), как только пользователь кликает по странице вне окна; разворачивается по клику на заголовок.Что сделано (5 из 6 частей плана — 6-я, minimized-CSS, уже была)
mousedownнаdocumentв capture-фазе, активен только приwindowOpen && !minimized; сворачивает при pointer-down вне окна. Гарды: клики внутри окна и внутри Mantine[data-portal](кебаб-меню списка чатов + confirm-модалка удаления) игнорируются — иначе клик по «Rename»/«Delete» свернул бы чат.startDragразличает клик/драг по порогу 4px (minimizedRefпротив stale-closure); клик-разворот не сохраняет геометрию.setMinimized(false)при открытии окна (свёрнутое состояние не залипает между сессиями).role=button,tabIndex,aria-label=Expand, Enter/Space). По ревью вынес роль на сам заголовок, НЕ на контейнер dragBar (иначеrole=buttonоборачивал бы вложенные кнопки Minimize/Close — невалидный ARIA).shouldCollapseOnOutsidePointer+isHeaderClickс unit-тестами (vitest, 9 кейсов).Проверено на ревью
APPROVE. Ключевые риски закрыты: открытие окна НЕ само-сворачивается (открывающий mousedown происходит до монтирования слушателя; autofocus композера — это focus, не mousedown); слушатель снимается корректно (тот же ref + capture-флаг); portal-guard покрывает и shared-портал. Поймали невалидный ARIA (вложенные кнопки под role=button) → исправил.
Проверка
tsc --noEmit— exit 0. vitest — 9/9. (pnpm --filter client lintсломан в окружении — pre-existing, fallback на tsc.)🤖 Generated with Claude Code
Ghost referenced this pull request2026-06-21 02:05:00 +03:00