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