Thanks for the links to other issues. I had seen some of them but not most of them.

I had seen the one for `if`

. That one is for a different kind of `if`

. It was correctly rejected for being too powerful. It could be used in any context and refer to properties of the element like `width: if(width < 500px, 600px, 400px)`

. It could also be used like `if(p, 5%, blue)`

.

The one I proposed only outputs a number and, though I did not specify, it does not have a mechanism to refer to the element, just `var`

, `env`

, `attr`

, the results of other numeric functions, and literals.

With it, you could compute the sign of x as `if(var(--x) > 0) - if(var(--x) < 0)`

. If `x = 0`

, itâ€™s `0 - 0 = 0`

. If `x < 0`

, itâ€™s `0 - 1 = -1`

. If `x > 0`

, itâ€™s `1 - 0 = 1`

. Since `abs(x)`

can be defined as `x*sgn(x)`

, you also get that for free (though abs and sgn are both probably common enough to deserve shorthands.)

In general, it makes it easy to â€śtoggleâ€ť terms on and off in an expression, like `width: calc(100px + 50px*if(var(--x) < 10) - 50px*if(var(--y) > 20))`

which can be 50, 100, or 150px wide dependent on the values of x and y.

A useful related function would be `media(q)`

that returns 1 if the media query `q`

holds and 0 otherwise. Then you could just do `--do-animations: media((prefers-reduced-motion))`

instead of defining it to 1 and then redefining it to 0 in a media query.

Iâ€™m not sure I see the point of `sum`

, `avg`

, etc. Without lists, you always know how many quantities are involved so `sum(1, 2, 3)`

isnâ€™t much better than `calc(1 + 2 + 3)`

. With lists youâ€™d need to add all kinds of list functions too. Itâ€™s also unclear to me why one would need to compute the arithmetic mean in css.