[feature][ai-chat] Авто-сворачивание окна чата в шапку при фокусе на странице, разворот по клику #42
Reference in New Issue
Block a user
Delete Branch "%!s()"
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?
Контекст
Плавающее окно AI-чата (
AiChatWindow) перекрывает контент страницы: открыв чат и начав читать/листать страницу под ним, окно остаётся во весь рост и закрывает текст/таблицу. Свернуть можно только вручную кнопкой «—» (Minimize).Хотим, чтобы окно само сворачивалось в свою шапку, как только пользователь переключается на страницу (кликает мимо окна — в редактор/контент), и разворачивалось обратно по клику на шапку. Сворачивание — визуальный коллапс (как нынешний Minimize), НЕ закрытие: поток ответа агента не должен прерываться (
ChatThreadостаётся смонтированным).Полный разбор:
docs/backlog/ai-chat-collapse-on-page-focus.md.Что уже есть
minimized+toggleMinimize(кнопка «—»)..minimized→ высота шапки;.minimized .content { display: none }без размонтирования)."Expand"вapps/client/public/locales/en-US/translation.json(уже добавлен заранее).Что НЕ сделано (из 6 частей плана реализована только 1)
useEffectсо слушателемmousedownнаdocumentв capture-фазе, активный только приwindowOpen && !minimized;setMinimized(true), если клик вне окна (el.contains(target)) и не внутри портала Mantine (target.closest("[data-portal]")).startDragразличать клик и драг по порогу ≈4px; при свёрнутом окне →setMinimized(false). НуженminimizedRef(useRef) против stale-closure вuseCallback([]).setMinimized(false)при открытии окна (переходwindowOpen → true), чтобы свёрнутое состояние не «залипало» между сессиями..dragBar— CSS.minimized .dragBar { cursor: pointer; }; в свёрнутом видеrole="button",tabIndex={0},aria-label={t("Expand")}, обработчик Enter/Space.shouldCollapseOnOutsidePointer,isHeaderClick; component-тест (@testing-library/react) + прогонpnpm --filter client lintиtest.Файлы
apps/client/src/features/ai-chat/components/ai-chat-window.tsxapps/client/src/features/ai-chat/components/ai-chat-window.module.cssapps/client/public/locales/en-US/translation.json(ключ"Expand"уже есть)Тонкие моменты
[data-portal]обязателен: кебаб-меню списка чатов и confirm-модалка удаления рендерятся в порталы — без гарда клик по «Rename»/«Delete» свернул бы чат в момент выбора.stopPropagationсо страницы не прятал событие; на клики внутри окна/порталов не влияет (их отсекают гарды).minimizedChatThreadостаётся в DOM, ответ достреливается в фоне.Источник: бэклог
docs/backlog/ai-chat-collapse-on-page-focus.md(статус 🔴 не сделано).