- From: Guillaume via GitHub <sysbot+gh@w3.org>
- Date: Thu, 23 Feb 2023 09:25:02 +0000
- To: public-css-archive@w3.org
I am not sure what context / behavior should be considered to further discuss about resolving `<percentage>` to `<number>`:
- in math function / at parse time
- in `rgb()` and `rgba()` / at parse or serialization time in a specified value
- in any context / at parse or serialization time in a specified value
<details>
<summary><strong>Table with all properties or types for which <code><percentage></code> resolves to <code><number></code> (there is currently no case with <code><integer</code>):</strong></summary>
| property / type | resolved | mapping |
| ------------------------- | -------- | ------- |
| `border-image-slice` | no | `[0, unknown]` |
| `mark-border-slice` | no | `[0, unknown]` |
| `scale` | yes | `[0, 1]` |
| `<alpha-value>` | yes | `[0, 1]` or `[0, 255]` |
| `<brightness()>` | no | `[0, 1]` |
| `<cmyk-component>` | ? | `[0, 1]` |
| `<contrast()>` | no | `[0, 1]` |
| `<custom-params>` | ? | `[unknown, unknown]` |
| `<grayscale()>` | no | `[0, 1]` |
| `<invert()>` | no | `[0, 1]` |
| `<lab()>` | ? | `[0, 100]`, `[-125, 125]`, `[-125, 125]` (respectively for l, a, b) |
| `<lch()>` | ? | `[0, 100]`, `[0, 150]` (respectively for l,c) |
| `<modern-hsl-syntax>` | yes | `[0, 255]` |
| `<modern-hsla-syntax>` | yes | `[0, 255]` |
| `<modern-rgb-syntax>` | yes | `[0, 255]` |
| `<modern-rgba-syntax>` | yes | `[0, 255]` |
| `<oklab()>` | ? | `[0, 1]`, `[-0.4, 0.4]`, `[-0.4, 0.4]` (respectively for l, a, b) |
| `<oklch()>` | ? | `[0, 1]`, `[0, 0.4]` (respectively for l,c) |
| `<opacity()>` | no | `[0, 1]` |
| `<predefined-rgb-params>` | ? | `[0, 1]` |
| `<saturate()>` | no | `[0, 1]` |
| `<scale-*()>` | no | `[0, 1]` |
| `<sepia()>` | no | `[0, 1]` |
| `<xyz-params>` | ? | `[0, 1]` |
</details>
**Observations**
Outside math functions, the resolution only applies for `scale`, `<alpha-value>`, and color functions. The specs defining the properties/types for which resolution does not apply, do not require it.
For [`scale`](https://w3c.github.io/csswg-drafts/css-transforms-2/#propdef-scale), I think CSS Transforms 2 let implementers choose to resolve `<percentage>` either at parse time or at serialization time.
> Numbers are used during serialization of specified and computed values.
For `<alpha-value>`, I think CSSOM gives the same freedom, but it is less clear:
> If the value is internally represented as an integer between 0 and 255 inclusive (i.e. 8-bit unsigned integer), follow these steps: [...]
> Otherwise, return the result of serializing the given value as a `<number>`.
It is even less clear in CSS Color 4:
> If the alpha is any other value than 1, it is explicitly included in the serialization, as a `<number>`, not a `<percentage>`.
For all color functions, CSS Color 4 defines the resolution of `<percentage>` (excluding `<alpha-value>`) in a specified value (section 14), presumably at parse time, except for sRGB functions, in which it is resolved at serialization time (section 15).
In a math function, the resolution happens at parse time, when applicable, but Chrome/FF do not apply it when they would not resolve a naked `<percentage>` at the same place.
I think it is a bug, but respective specs should define its resolution, either at parse time or at serialization time, either explicitly or handwavy.
<details>
<summary>Test code</summary>
```js
const cases = [
// label, property = label, ...input
['border-image-slice', undefined, '100%', 'calc(100%)'],
['mark-border-slice', undefined, '100%', 'calc(100%)'],
['scale', undefined, '100%', 'calc(100%)'],
['<brightness()>', 'filter', 'brightness(100%)', 'brightness(calc(100%))'],
['<contrast()>', 'filter', 'contrast(100%)', 'contrast(calc(100%))'],
['<grayscale()>', 'filter', 'grayscale(100%)', 'grayscale(calc(100%))'],
['<invert()>', 'filter', 'invert(100%)', 'invert(calc(100%))'],
['<opacity()>', 'filter', 'opacity(100%)', 'opacity(calc(100%))'],
['<saturate()>', 'filter', 'saturate(100%)', 'saturate(calc(100%))'],
['<sepia()>', 'filter', 'sepia(100%)', 'sepia(calc(100%))'],
['<scale-*()>', 'transform', 'scale(100%)', 'scale(calc(100%))'],
['<alpha-value>', 'opacity', '100%', 'calc(100%)'],
['<alpha-value>', 'flood-opacity', '100%', 'calc(100%)'],
['<alpha-value>', 'shape-image-threshold', '100%', 'calc(100%)'],
['<alpha-value>, <hsl()>, <hsla()>', 'color', 'hsl(0deg 100% 0% / 1000%)', 'hsl(0deg calc(100%) calc(0%) / calc(100%))'],
['<alpha-value>, <rgb()>, <rgba()>', 'color', 'rgb(100% 0% 100% / 0%)', 'rgb(calc(100%) calc(0%) calc(100%) / calc(0%))'],
['<lab()>', 'color', 'lab(100% 0% 100%)', 'lab(calc(100%) calc(0%) calc(100%))'],
['<lch()>', 'color', 'lch(100% 0% 0deg)', 'lch(calc(100%) calc(0%) 0deg)'],
// May be not supported
['<oklab()>', 'color', 'oklab(calc(100%) calc(0%) calc(100%))', 'oklab(calc(100%) calc(0%) calc(100%))'],
['<oklch()>', 'color', 'oklch(100 calc(0%) 0deg)', 'oklch(100 calc(0%) 0deg)'],
['<predefined-rgb-params>', 'color', 'color(srgb calc(100%) calc(0%) calc(100%))', 'color(srgb calc(100%) calc(0%) calc(100%))'],
['<xyz-params>', 'color', 'color(xyz calc(100%) calc(0%) calc(100%))', 'color(xyz calc(100%) calc(0%) calc(100%))'],
// Not supported (and requires @color-profile --custom {})
['<custom-params>', 'color', 'color(--custom calc(100%) calc(0%) calc(100%))', 'color(--custom calc(100%) calc(0%) calc(100%))'],
// Not supported
['<cmyk-component>', 'color', 'device-cmyk(calc(100%) calc(0%) calc(0%) calc(0%))', 'device-cmyk(calc(100%) calc(0%) calc(0%) calc(0%))'],
]
cases.forEach(([label, prop = label, ...inputs]) => {
const res = []
inputs.forEach(input => {
style[prop] = ''
style[prop] = input
res.push(style[prop])
})
console.log(label, ...res)
})
```
</details>
---
> Please use this link to get an up-to-date view of drafts (updates every 5 minutes):
>
> https://w3c.github.io/csswg-drafts/
Sorry, my omnibox and I are used to drafts.csswg.org. I did not know that it may now lag behind w3c.github.io instead of simply returning a server error.
--
GitHub Notification of comment by cdoublev
Please view or discuss this issue at https://github.com/w3c/csswg-drafts/issues/8485#issuecomment-1441433340 using your GitHub account
--
Sent via github-notify-ml as configured in https://github.com/w3c/github-notify-ml-config
Received on Thursday, 23 February 2023 09:25:04 UTC