e530331613
The panel has no alpha and there is no framebuffer to blend against -- 307KB against 276KB free -- so a scrim cannot be composited. It can be computed instead: the palette is re-derived from seeds mixed toward black, and the content behind a dialog is repainted in those colors, which is the result a black scrim would have produced. The tree was already the source of truth, so dimming is a palette swap rather than a readback. A node marked dimmed carries it to everything it contains, and ui.confirm opts its card back out. Doing that exposed a latent bug in bordered boxes. They filled a square rect and then drew a rounded border over it, so the corners the border does not cover showed the fill. That was invisible while everything behind a card was the same color as the card, and obvious the moment the background dimmed. Separating the two roles fixes it: bg is what a node fills, surface is what sits underneath, anti-aliased edges blend into surface, and a box that paints its own rounded background suppresses the square fill.