- From: Miriam Suzanne via GitHub <sysbot+gh@w3.org>
- Date: Thu, 17 Aug 2023 17:57:54 +0000
- To: public-css-archive@w3.org
mirisuzanne has just created a new issue for https://github.com/w3c/csswg-drafts:
== [css-properties-values-api] A compact syntax for registering global constants/custom properties ==
There has been discussion in several issues recently about providing a `::document` selector, or `@document`/`@global`/`@env` rule that would allow authors a quick way to register globally available constants (as custom properties or environment variables) - without a full `@property` rule describing each individually. See, for example:
- https://github.com/w3c/csswg-drafts/issues/6931
- https://github.com/w3c/csswg-drafts/issues/6641
- https://github.com/w3c/csswg-drafts/issues/2627
(Hopefully this issue is useful as a way of combining several discussions, and not just a duplicate)
Those first two issues have more specific concerns that could be (or have been) addressed in specific ways - but mention the possibility we might still want a more generic solution for registering global properties. [Custom media queries](https://www.w3.org/TR/mediaqueries-5/#custom-mq) (`@custom-media`) have similarly been solved as a specific case, but not yet implemented – and there's an open issue for adding [`@custom-container`](https://github.com/w3c/csswg-drafts/issues/8121). Those use-cases could also be solved by a well-defined global parameter registry.
There are two primary overlapping concerns here:
- A less verbose syntax for authors to register custom properties with an initial value and syntax. As @LeaVerou [has pointed out](https://github.com/w3c/csswg-drafts/issues/6931#issuecomment-1030429039), authors define _a lot of variables_, and the `@property` rule is a very bulky way to register them one-at-a-time.
- Authors would like to define global values that can be reused in at-rules, or other places where the cascading `var()` would not be possible to resolve.
I tend to [agree with @tabatkins](https://github.com/w3c/csswg-drafts/issues/6641#issuecomment-1006172908) that:
> Having an author-defined `env()` might work, but would require an author to duplicate values across properties and `env()`, or else decide for each whether they want to express it as a var or an `env()`.
I like the proposed solution of allowing global reference to the initial values of registered custom properties, but think we need to make that registration simpler for it to work. I don't know the right syntax for that, but if we're able to come up with something compact, it could also be useful for defining parameters in [declarative custom functions](https://github.com/w3c/csswg-drafts/issues/7490) and (someday, maybe) mixins.
The `@property` rule can register a custom property `name` with three associated descriptors:
- `syntax`: the CSS type/grammar(s) used to validate and interpolate values (often but not always a single type like "<color>" or "<length>"'
- `inherits`: a boolean to set if the property inherits or not (this would not be needed in function/mixin parameters)
- `initial-value`: the initial value of the property
Authors often skip this registration for most properties, and only define the `name` along with an un-registered not-technically-'initial' value on the root element. Then some authors add the `@property` registration for specific properties - often to define a `syntax` for the sake of interpolation, but occasionally to set inheritance or a more formal initial value.
Things I would expect from a syntax:
- Register just the name and initial value (default to universal syntax, with inheritance on)
- Register props with the initial guaranteed invalid value
- Register groups of properties that share a `syntax`
- Register
The main complexity that I see with defining a compact syntax is that custom property values (including initial values) are very permissive. It will be difficult to combine `initial-value` with anything else on the right side of a standard `property:value;` format – though it should be possible using either the `!` delim-token, or wrapping `()`/`{}`/`[]` of some kind. The other thought I had was to put some of the definition on the left side. Some rough ideas:
```css
@global {
--my-color("<color>"): mediumvioletred;
--my-padding("<length>"): 10px !no-inherit;
}
@global "<color>" no-inherit {
--brand-color: teal;
}
```
The an all-in-one syntax is more appropriate for reuse in function parameter definitions, while the grouped syntax helps with defining a whole set of related variables in a single place.
On the other end, when calling custom properties, a `env()` or `global()` function could give access to the initial registered value anywhere in the document, while `var()` returns only the cascaded value. I prefer this to a context-dependent resolution of `var()`, since it provides more clarity on what value to expect, and makes both available where `var()` is already supported:
```css
.my-thing {
color: var(--brand-color);
padding: global(--my-padding);
@media global(--above-small) {
...
}
}
```
This is far from a complete proposal, and mostly a request that we consider these use-cases together. Happy for thoughts, and willing to merge this into the `env()` conversation if it belongs there.
Please view or discuss this issue at https://github.com/w3c/csswg-drafts/issues/9206 using your GitHub account
--
Sent via github-notify-ml as configured in https://github.com/w3c/github-notify-ml-config
Received on Thursday, 17 August 2023 17:57:56 UTC