-
Notifications
You must be signed in to change notification settings - Fork 756
Description
Right now, calc() carefully tracks whether a numeric expression (no units or %s) is guaranteed to resolve to an integer, or might resolve to a more general number. This allows it to be used in places like z-index safely.
However, it excludes some expressions that would be integral if evaluated - for example, any division makes it non-integral, even in an expression like calc(4 / 2).
This restriction also seems somewhat inconsistent with calc()'s treatment of range restrictions - if you specify width: calc(-1px);, it's valid (and equivalent to 0px), but if you specify z-index: calc(4 / 2);, it's invalid. It seems like this was accidentally motivated by what can be expressed directly in the grammar (integer vs real) vs what has to be expressed in prose as an additional constraint (range restrictions), but these really shouldn't be treated differently.
In particular, this causes some trouble for TypedOM, which wants to make it so that CSSUnitValues (corresponding to plain numbers and dimensions) get the same protection against being out-of-range that calc() does, but now we've realized that there's no such "should be an integer, is actually a real" protection that we could also apply.
So! I propose that we remove the tracking of <integer> vs <number> in calc() (it's already no longer tracked in the typing algorithms of Typed OM, which will be used in calc(), per WG resolution, when I finally write up the unit-algebra text), and instead say that if a calc() ends up being non-integral when an integer is required, it is automatically rounded to the nearest integer.
(Detail: I provisionally propose we use "toward positive infinity" rounding, same as JS's Math.round(). Does CSS already have any rounding we should match instead?)