My theme switch was running 3164 animations

(sley-ui.dev)

2 points | by imfemambocus 4 hours ago ago

1 comments

  • imfemambocus 4 hours ago

    This is the first time that I'm properly getting into theme switching, so I built the dark and light mode for my component library in the most obvious way that I could find. The goal is to transition background-color, border-color, color and box-shadow on every element. But this felt a bit slow and sluggish, so I used document.getAnimations() to see how many that actually runs, and the result is 3164 animations on a page of 1544 elements.

    After some playing around, I found out that startViewTransition animates snapshots of the whole page instead, and that's 5 animations for the same job, with a gradient fading along with everything else rather than snapping. I did however find a React thing when using this function and it's that the new palette has to be in the DOM inside the callback which means the state update needs flushSync.

    document.startViewTransition(() => { flushSync(() => setTheme(next)) })

    I'm not sure this is the right way to do it, but I wrote down every number that I measured.