demo · v139

Cycle in Fallback

Before v139: writing background: var(--primary, var(--circular)) where --circular referenced itself made the whole property invalid, even when --primary was set. v139 short-circuits — if the first argument resolves, the fallback isn't evaluated at all, so the cycle never bites.

render

tile

verdict

—

the rule

why this matters

Modern design systems write deeply nested var() chains so a single token can cascade through hundreds of components. Pre-v139, a typo in a deep fallback poisoned the whole tree because Chromium walked the fallback even when the primary value was perfectly fine. With short-circuit evaluation Chromium matches the spec and matches Safari/Firefox — and the cost of evaluating a fallback only happens when the fallback actually runs.

see also