:root { --color1: red; /* A dependency cycle */ --test1: var(--test2); --test2: var(--test1); } .label-1 { color: var(--color1); /* Fallback is unused when the variable resolves */ background-color: var(--color1, green); /* Nested fallbacks */ box-shadow: inset 0 0 3px var(--color2, var(--color3, green)); } .label-2 { /* Overriding variables */ --color1: yellow; color: var(--color1); /* Nonexistent variable, so the fallback is used */ background-color: var(--color2, green); /* Variables are case-sensitive */ box-shadow: inset 0 0 3px var(--Color1, green); } .label-3 { /* Unsetting variables */ --color1: initial; color: var(--color1, green); /* Shorthand properties */ --border1: 3px; --border2: solid red; border: var(--border1, 4px) var(--border2); } .label-4 { /* --test1 is a part of a dependency cycle */ /* See https://www.w3.org/TR/css-variables-1/#cycles */ color: var(--test1, green); /* A dependency cycle with a fallback, the variable is invalid anyway */ --test3: var(--test3, green); background-color: var(--test3, purple); } .label-5 { /* Not a dependency cycle since we've overridden --test1. --test2 is still bad */ --test1: red; color: var(--test1, green); background-color: var(--test2, green); --prop1: lol; --prop2: var(--prop1) var(--prop1); --prop3: var(--prop2) var(--prop2); --prop4: var(--prop3) var(--prop3); --prop5: var(--prop4) var(--prop4); --prop6: var(--prop5) var(--prop5); --prop7: var(--prop6) var(--prop6); --prop8: var(--prop7) var(--prop7); --prop9: var(--prop8) var(--prop8); --prop10: var(--prop9) var(--prop9); --prop11: var(--prop10) var(--prop10); --prop12: var(--prop11) var(--prop11); --prop13: var(--prop12) var(--prop12); --prop14: var(--prop13) var(--prop13); --prop15: var(--prop14) var(--prop14); --prop16: var(--prop15) var(--prop15); --prop17: var(--prop16) var(--prop16); --prop18: var(--prop17) var(--prop17); --prop19: var(--prop18) var(--prop18); --prop20: var(--prop19) var(--prop19); /* Fallback is used since --prop20 is too long */ /* See https://www.w3.org/TR/css-variables-1/#long-variables */ box-shadow: inset 0 0 3px var(--prop20, green); } .label-6 { all: unset; /* Should still be red, since variables are not unset by that */ color: var(--color1, green); } .label-7 { /* Empty fallback */ color: var(--color2,) var(--color1); background-color: red; } @keyframes test { from { --test1: red; --test2: blue; --duration: 2s; --padding-right: 10px; padding-left: var(--padding1, 10px); padding-right: var(--padding-right); } to { --test1: blue; --test3: red; --duration: 3s; padding-left: var(--padding2, 20px); } } .label-8 { /* FIXME: this is only there because properties that are only in keyframes */ /* won't get printed otherwise */ padding-left: 0; padding-right: 0; --padding1: 1px; --padding2: 2px; /* We're testing the initial state */ animation: test 10s infinite linear; /* This gets overridden by the animation */ --test1: pink; color: var(--test1, yellow); /* Only defined in the initial state, still fine */ background-color: var(--test2, yellow); /* Variables only defined later in the animation -> invalid */ box-shadow: inset 0 0 3px var(--test3, yellow); /* --duration is animation-tainted and so is --duration2, this should be 5s */ --duration2: var(--duration, 4s); transition-duration: var(--duration2, 5s); }