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.