- From: Lea Verou via GitHub <sysbot+gh@w3.org>
- Date: Tue, 25 Feb 2025 16:27:36 +0000
- To: public-css-archive@w3.org
LeaVerou has just created a new issue for https://github.com/w3c/csswg-drafts: == [css-values] Functional counterparts of other CSS-wide keywords (`revert-layer()`, `revert-rule()`) == This proposal is a portmanteau of two past resolutions: 1. In https://github.com/w3c/csswg-drafts/issues/2864 we resolved to add an `inherit()` function that resolves to the inherited value of any property and can be be used in expressions similarly to `var()`. 2. Recently, in https://github.com/w3c/csswg-drafts/issues/10443#issuecomment-2627865962 we resolved to add a `revert-rule` CSS-wide keyword. There is a cornucopia of use cases where it would be incredibly useful to be able to access this (and `revert-layer`) **as a value** that can be used to modify a property "in place". As a contrived example, we frequently teach folks that this won’t work, because it creates a cycle: ```css --foo: calc(var(--foo) + 1); ``` However, this could: ```css --foo: calc(revert-rule(--foo) + 1); ``` More pragmatically, this could be incredibly useful for manipulating design tokens in-place, without introducing dozens of intermediate CSS properties. E.g. if you have CSS variables like `--color-{hue}-{tint}` (e.g. `--color-green-95`), here are a few things you could do that would normally require a ton of intermediate properties, repeating values verbatim, or making the tweak part of the property definition: Make them sensitive to light-dark mode: ```css --color-green-95: light-dark(revert-rule(--color-green-95), var(--color-green-05)); ``` Tweak their coordinates: ```css --color-green-95: oklch(from revert-rule(--color-green-95) l calc(c * var(--chroma-scale, 1)) calc(h + var(--hue-shift, 0))); ``` Adjust for high contrast: ```css --color-green-40: if(style(--contrast: high), var(--color-green-05), revert-rule(--color-green-40)); ``` I’m only using colors as an example, but there is nothing color-specific here. Being able to tweak a CSS variable "in-place", without needing an extra level of element nesting or an intermediate variable is something that crops up *a lot*. This is not specific to CSS variables either. It could solve the age-old problem of modifying other CSS properties quite elegantly: ```css transition: revert-rule(transition, all), 1s --foobar; ``` ```css transform: rotate(5deg) revert-rule(transform, ) scale(.8); ``` ```css background: var(--icon), revert-rule(background, none), var(--backdrop); ``` ## What about cycles? This proposal **only supports** referencing the value of **the same property**, which should (?) eliminate cycles. It still takes the property name as an argument for these reasons: - Consistency with `inherit()` and `var()` - Potential later expansion - Fallback (sure, in theory the fallback could be the _only_ value, but then we can _never_ allow it to reference other properties) ## MVP * Similar use cases for `revert-layer()`, and supporting `revert-layer()` means this can ship independently of `revert-rule` and authors can reap the benefits by just wrapping code with `@layer {}`. * Fewer use cases for `initial()`, `revert()`, `unset()` so I'm not proposing these (but we could keep them in mind as an elegant solution if use cases appear that they would solve). * Just like `inherit()`, this would be immensely useful even if it only ships for custom properties. Please view or discuss this issue at https://github.com/w3c/csswg-drafts/issues/11773 using your GitHub account -- Sent via github-notify-ml as configured in https://github.com/w3c/github-notify-ml-config
Received on Tuesday, 25 February 2025 16:27:36 UTC