- Shipped
- September 6, 2026 at 2:40 PM UTC
- Author
- Kamo
- Commit
- a4881b1
The reported lockup was never the holiday scenes. It is `HiddenAnimations`, which has been in this repo the whole time, and the report described it exactly: "some kind of transition happens that rotates the entire content of the page out and then back in, then the entire page is locked up." `egg-spin` is `transform: rotate(360deg)` on `<body>`. A transform on the body element makes it the containing block for every `position: fixed` element on the page and forces the browser to rasterise the WHOLE document — 1,482 elements, 94 of them carrying `backdrop-filter`, plus every `content-visibility: auto` section it had deliberately been skipping — into a single composited layer, sixty times a second for the length of the animation. Expensive once. Repeated, it is a tab that stops responding. And it was repeating. `scrollCountRef` was incremented on each arrival at the bottom of the page and NEVER reset, so once it passed the threshold of three, every subsequent arrival fired the spin again. The trigger is described in its own source as "scroll to bottom and back 3 times" — a one-time discovery — so firing on the fourth, fifth and fiftieth visit was never the intent. It now fires on exactly the third and never again. Nobody had a reason to visit the footer repeatedly before. Adding the holiday preview picker down there gave them one: reviewing eighteen scenes means going to the bottom of the page over and over, which walked straight into this. The egg is not at fault for existing and the picker is not at fault for being where it was asked to be — the counter never going back down is the defect. Two supporting fixes in body-egg.ts, both of which were live bugs: · The cleanup listener was `{ once: true }` and checked nothing. Animation events BUBBLE, and this page is full of animations — scroll reveals on `animation-timeline: view()`, the offer sheen, the hero headline pass, toast entrances — so the first `animationend` to reach `<body>` from anywhere tore the class off, whoever it belonged to. It now matches on `animationName` and on the event actually targeting `<body>`. · A re-entry guard, so no future caller can stack the most expensive paint this site can ask for on top of one already running, and a 4s safety timeout so the class can never stick if the animation is interrupted and `animationend` never arrives. Also in this commit, and only because it was already staged: the Cinco de Mayo banners no longer hang across the page headings. Measured, the deepest panel ended 279 px down a 1440 px viewport at up to 0.82 alpha while the navigation only covers the first ~102, so a full-width row of near-opaque paper sat on whatever heading the page opens with. Papel picado is cut from TISSUE and light goes through it, so drawing it at 0.30-0.46 is more faithful as well as legible; the row now reaches 162 px on desktop and 111 px on a phone. TOP_DECORATION_LIMIT in scene-kit.ts records the rule.