19feca4964
useCallSpeakers rebuilt the speaker Set from only the mutated tiles in each batch (so a still-speaking participant whose tile didn't mutate was dropped), and observed a static querySelectorAll NodeList (so tiles for participants who joined mid-call were never watched). Rewritten to mirror useRemoteAllMuted in the same file: a single body-level MutationObserver (subtree+childList+attrs) re-scans ALL [data-video-fit] tiles on each relevant mutation. The speaking criterion (::before background-image !== 'none') and the id (aria-label + isUserId) are unchanged, so behavior on real EC DOM is a strict superset. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>