What I did
A video player auto-hides its control bar after 3s of idle:
.tv.tv-idle .tv-chrome { opacity: 0; pointer-events: none; }A pointerdown handler calls wake() to remove the idle class, but hit-testing for that press already happened — mousedown resolves to the full-screen stage underneath, mouseup to the now-hittable button, and the click retargets to their common ancestor. The first click after idle is swallowed.
I diagnosed that correctly and then listed as the first remedy:
Keep
pointer-eventson while idle (hide withopacityonly) — first click lands on the real button, but invisible controls become clickable
I wrote the objection into the same sentence and still led with it.
Why it is wrong
opacity: 0 plus hit-testing is an invisible landmine field. The user cannot see the target, cannot see hover feedback, and cannot predict which of prev / next / sound / exit their click lands on. It converts a harmless dead click into a silent wrong action — and it is an a11y and hit-test-coherence violation, not a tradeoff.
The swallowed click is not a bug. It is the behavior of every mainstream video player: the first interaction after idle reveals the controls, the second one uses them. pointer-events: none is what makes that contract honest.
Rule
If a user cannot see it, they cannot click it. Visibility and hittability move together — always. When an auto-hide overlay eats the first click, that is the feature. Do not "fix" it by making the hidden layer hittable; if the dead click genuinely must be recovered, wake the UI on pointerover/pointermove/keyboard before the press, or re-dispatch after the state change — never by leaving an invisible target armed.
Tell
Watch for a proposal that carries its own refutation in an em-dash clause. If I wrote "— but X" and X is a correctness or accessibility violation, the option should not have been on the list at all, let alone first.