pointer-events-none удалён из iframe в EmailBody компонент — текст в сложных HTML-письмах был невыделяемым. Обработка событий (курсор, лайтбокс изображений, перенаправление кликов) перемещена из внешнего контейнера в iframe's contentDocument через handleIframeLoad.mousemove слушатель на документе iframe восстанавливает emailHoverCursor (zoom-in для изображений, pointer для ссылок).click слушатель на документе iframe открывает лайтбокс для отдельных изображений; все остальные клики (ссылки, кнопки) работают нативно.getSelectedText() (useImperativeHandle) уже читает из contentWindow.getSelection() — теперь работает корректно без pointer-events-none помех.markEmailRead, toggleFlagEmail, togglePinEmail, toggleMuteEmail, snoozeEmail, moveEmail, saveDraftReply, clearDraftReply) теперь включают фактическое значение поля в SSE email_updated payload:is_read (markEmailRead)is_flagged (toggleFlagEmail)is_pinned (togglePinEmail)is_muted (toggleMuteEmail)folder_id (moveEmail)snoozed (snoozeEmail)draft_saved / draft_cleared (saveDraftReply / clearDraftReply)EmailFlagPatch: расширен с is_pinned | is_muted так что SSE-патчинг работает для всех полей статуса.is_pinned и is_muted из email_updated событий; пропускает scheduleListRefresh() когда изменились только флаги (кэш уже пропатчен); переходит к полному обновлению, когда folder_id присутствует (перемещение).updateEmailDetail: false → true — статус заглушения теперь оптимистично обновляет кэш деталей письма (аналогично поведению pin/flag).<button>, <input type='submit'>, [role='button'] клики теперь предотвращают действие по умолчанию + открывают форму action URL в новой вкладке. Предотвращает отправку формы, которая вызывает навигацию iframe (белый экран).onClick обработчик.closest("a[href]") → closest<HTMLAnchorElement>("a[href]") устраняет TS2339.