
The circle that would not close — flushSync and the Portfolio View Transition
When the theme toggle animation revealed the old theme instead of the new one, the fault was not in the CSS — React had not committed the state in time.
4 posts

When the theme toggle animation revealed the old theme instead of the new one, the fault was not in the CSS — React had not committed the state in time.

After 5 days making the circle start from the click on desktop, mobile still used a crossfade — by documented decision: clip-path paints per frame and janks weak GPUs. Until Samuel asked for the opposite. What made the reversal possible? The anti-stutter fixes that were already in global.css.

Five days trying to make a circle of light start exactly where the finger touches. The CSS looked right, CI passed, but the user saw stutter, wrong origin, and content wiping out. The root cause wasn't the code — it was the interaction between the View Transitions API, Chromium blend modes, and a ghost node_modules.

Instead of replacing the circular reveal with basic crossfade, I fixed the root cause of stutter on low-end GPUs. VT clip-path + clean fallback.