The whole window celebrates when somebody wins

Featurekamo-internal
Shipped
September 9, 2026 at 4:31 AM UTC
Author
Kamo
Commit
d343813

A win used to be a sentence in a strip under the board. It is now the entire tool window: an impact flash and a shockwave, light turning behind the board, fireworks, two volleys of confetti, the word itself slammed into the middle of the screen, and the window taking the hit. Both people see the SAME show. The loser's window is not spared and is not muted — it plays the winner's fireworks, in the winner's colours, with the winner's name across the board they just lost on. The 'defeat' tone changes the words and the vignette and nothing else; softening it for the person who lost would be a different feature. The word is what actually happened, never a generic 'victory'. Chess says CHECKMATE or RESIGNED, out of the same endings vocabulary the result band uses. The felt says the number — what a poker player just gained or just lost is the amount, and it is dramatic at any size. Neither needs a new dictionary key. Scaled to the moment, because a table deals a hand a minute and the maximum show every time would be an obstruction. potIntensity() measures a pot in big blinds, logarithmically, so an ordinary pot is not flattened to nothing and a monster does not run away; chess is always full, because a correspondence game is days of thinking and exactly one winner. A pot you took yourself gets a floor under it either way. Two things only a real browser said: - The fireworks were FRAME-COUNTED, so the show ran at the display's refresh rate: measured at ~30fps headless, the first shell opened at 1.75s instead of 0.5s, by which time the confetti had already fallen. The same code on a 120Hz screen would have run the whole celebration at double speed. Fixed timestep now, with a catch-up cap so a tab that was away does not simulate a minute at once. Measured again by canvas ALPHA per layer: lit from 0.7s, carrying the back half while the confetti decays. - CHECKMATE at the size that suits 12,400 runs off both edges of a popup. The headline is sized against the WINDOW (container units, not vw) and divided by its own character count. The overlay is pointer-events: none throughout, so the rematch button under it stays live, and aria-hidden, because the result panel has already said it once. Reduced motion gets the moment without the movement: no canvases, no flash, no shake, the word simply appears and holds. Proved in Chrome under emulateMediaFeatures — 0 canvases, animation-name: none, opacity 1, and elementFromPoint still passing clicks through. The felt's guard walks only app/components/tools/holdem, so this brings its own, built so it cannot go vacuous: every walk that could return nothing is paired with an assertion that it found something, and all three ways to hide an animation from it were tried by mutation.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing