Skip to content

fix(core): a hidden child of a mover stays out of the blur trail - #6155

Merged
vanceingalls merged 1 commit into
mainfrom
fix/capture-blur-hidden-mover-children
Oct 24, 2026
Merged

vanceingalls merged 1 commit into
mainfrom
fix/capture-blur-hidden-mover-children

Conversation

@vanceingalls

Copy link
Copy Markdown
Collaborator

What

Follow-up to #6106, from Genesis's review there. The capture isolation CSS made every descendant of a mover visibility: visible !important, so a child the author had hidden with visibility: hidden was cropped and smeared into the blur trail.

The hide rule now skips the mover subtree, and only the mover itself is forced visible. Its descendants inherit, and keep any visibility they set themselves. The root rule is untouched. The CSS is the 2-line change Genesis suggested.

Evidence

Real-Chrome pixel test: a red mover with a visibility:hidden green child.

  • Before: 240 green pixels in the blurred frame (0 in the sharp frame).
  • After: 0.

The test fails on the old CSS and passes on the new. The pixel file passes 11/11.

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

Edit accuracy: accurate 271 (base branch 271), smooth 131 of those

The gate passes.
Smoothness is reported in the artifact, not gated. A case fails only if it fails 2 of 3 runs.

Quarantined, measured but not gated (0)

Unstable (2)

  • seqplainkeys-none-pct-r0-root-z100: tracking 0.06, pressJump 0, drop 0, reload 0, render 0.03, renderKey -, undo false, teleport true / tracking 0.06, pressJump 0, drop 0, reload 0, render 0.03, renderKey -, undo true, teleport true / tracking 0.06, pressJump 0, drop 0, reload 0, render 0.03, renderKey -, undo true, teleport true
  • seqplainkeys-none-pct-r0-nested-z100: tracking 0.05, pressJump 0, drop 0, reload 0, render 0.02, renderKey -, undo false, teleport true / tracking 0.05, pressJump 0, drop 0, reload 0, render 0.02, renderKey -, undo true, teleport true / tracking 0.05, pressJump 0, drop 0, reload 0, render 0.02, renderKey -, undo true, teleport true

@heygengenesis heygengenesis Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verdict: APPROVE · 0 blocker · 1 important · 0 nits · 48a6751f

The CSS matches the fix I checked against the repro in #6106. CI is green. One problem comes from combining this with #6108, see the inline comment.

— Genesis (pr-review)

it("keeps a visibility:hidden child of a mover out of the trail", async (ctx) => {
if (!supported) ctx.skip();
const body = `<div class="box" style="left:20px;top:80px"><div style="position:absolute;left:10px;top:10px;width:20px;height:20px;background:#0f0;visibility:hidden"></div></div>`;
const blurred = await frameOf(body, true, FRAME);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

important: this test stops guarding the CSS once #6108 lands. Under auto, a translate-only box gets the filter tier, which never uses the isolation CSS. I checked this earlier: with #6108's runtime and the old CSS, this exact repro reports tier: "filter" and 0 green pixels, so the test passes either way. This file also conflicts with #6108's version (git merge-tree). Whichever PR lands second, force capture here: frameOf(body, true, FRAME, "capture"), using #6108's helper signature.

The isolation CSS re-showed every descendant of a mover, so a child the
author hid with visibility:hidden was cropped and smeared into the trail
(240 green px in the repro; 0 in the sharp frame). The hide rule now skips
the mover subtree and the mover alone is made visible, so its descendants
inherit and keep their own visibility.

Found by review of #6106.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@vanceingalls
vanceingalls force-pushed the fix/capture-blur-hidden-mover-children branch from 48a6751 to dfea19c Compare October 23, 2026 21:27

@miguel-heygen miguel-heygen left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving at dfea19cd. I checked the CSS at the earlier approved commit and it is byte identical here, so the head change is just the rebase. I tried to break the new selector four ways: the root carrying the mover attribute (discovery starts at scene.querySelectorAll("*"), so the root can never be a mover), a mover outside the isolated root, a hidden non mover ancestor swallowing its mover, and a specificity inversion between the two rules. None of them reproduce.

One small thing, not blocking: the new pixel test asserts only that green is zero, so it would also pass if the mover itself vanished. An assertion that the expected red ink is still there would make it fail for the right reason.

@vanceingalls
vanceingalls merged commit e077d9d into main Oct 24, 2026
80 checks passed
@vanceingalls
vanceingalls deleted the fix/capture-blur-hidden-mover-children branch October 24, 2026 00:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants