Skip to content

fix: prevent adjacent lines leaking through reveal masks - #5

Open
saseungmin wants to merge 1 commit into
mainfrom
codex/fix-line-reveal-mask-bleed
Open

saseungmin wants to merge 1 commit into
mainfrom
codex/fix-line-reveal-mask-bleed

Conversation

@saseungmin

@saseungmin saseungmin commented Oct 31, 2026 •

Copy link
Copy Markdown
Member

Multiline lineReveal() animations could show fragments of the previous or next line inside another line's reveal window. Each mask translated a full paragraph copy, so its neighboring source lines could enter the visible band during positive or negative reveal offsets.

Crop the intended measured line in a fixed-height, non-collapsible viewport before applying reveal translation. The existing outer frame still owns opacity, scale, pulse, and transform origin; paragraph shaping, accessibility, playback, and public APIs remain unchanged. This adds one native clipping View per rendered line.

Regression coverage

Seven tests follow glyph-band intervals through the actual rendered ancestor tree and clipping styles. They cover positive/negative offsets, large offsets, fractional line geometry, final visibility, and scale/pulse composition. They do not depend on a new wrapper test ID.

  • Before the fix: 5 failed, 2 passed, reproducing neighboring-band leaks of 12–21 layout units.
  • After the fix: all 7 pass.

Validation

  • Full Jest suite: 16 suites, 233 tests pass.
  • Typecheck, lint, format check, library build, and declaration-surface check pass.
  • Actual iPhone 17 / iOS 26.2 simulator capture: intermediate reveal frames no longer show the duplicated neighboring line; final text remains intact.
  • Android 16 / API 36, Pixel 7 ARM64 emulator (1080×2400, 420 dpi), actual Fabric/Hermes native example: 32 frozen captures cover four fixtures × four progress values × two themes, with four recipes per capture (128 recipe states), plus two recorded timing replays.
    • Positive/negative/large reveal offsets and reveal + scale/pulse composition; English, fractional line height/blank lines, Korean/emoji, native wrapping/centered alignment.
    • The original renderer reproduces neighboring-line bleed under the same Android conditions; the fixed renderer excludes those fragments in inspected frames. At 20%, the +48 source band goes from 12,038 non-background pixels to zero. All 0% regions are empty; completed English preview pixels match before/after exactly.
  • Independent code and Android capture review found no actionable issues.

Documentation, interactive demos, and refreshed native recordings are maintained separately in #4. This PR contains only the renderer correction and its regression tests. Android rasterization was checked on the emulator above. Physical Android/iOS devices and other Android OS versions remain unverified. Temporary verification harness and source swaps were restored; this validation adds no source changes.

@changeset-bot

changeset-bot Bot commented Oct 31, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: a0188e9

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 31, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-31T05:03:28.576574Z a0188e9 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

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.

1 participant