pointer-events-none removed from iframe in EmailBody component — text in complex HTML emails was unselectable. Event handling (cursor, image lightbox, click forwarding) moved from the outer container into the iframe's contentDocument via handleIframeLoad.mousemove listener on iframe document restores emailHoverCursor (zoom-in for images, pointer for links).click listener on iframe document opens lightbox for standalone images; all other clicks (links, buttons) work natively.getSelectedText() (useImperativeHandle) already read from contentWindow.getSelection() — now works correctly without pointer-events-none interference.markEmailRead, toggleFlagEmail, togglePinEmail, toggleMuteEmail, snoozeEmail, moveEmail, saveDraftReply, clearDraftReply) now include the actual field value in the 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: extended with is_pinned | is_muted so SSE patching works for all status fields.is_pinned and is_muted from email_updated events; skips scheduleListRefresh() when only flags changed (cache already patched); falls through to full refresh when folder_id is present (move).updateEmailDetail: false → true — mute status now optimistically updates the email detail cache (matching pin/flag behavior).<button>, <input type='submit'>, [role='button'] clicks now prevent default + open form action URL in new tab. Prevents form submission from navigating the iframe (white screen).onClick handler.closest("a[href]") → closest<HTMLAnchorElement>("a[href]") resolves TS2339.