- From: Matthew Dean via GitHub <sysbot+gh@w3.org>
- Date: Wed, 02 Sep 2020 17:55:10 +0000
- To: public-css-archive@w3.org
matthew-dean has just created a new issue for https://github.com/w3c/csswg-drafts:
== [css-nesting] A proposal, using a pseudo-class ==
### :and()
**Related to the [CSS Nesting proposal](https://drafts.csswg.org/css-nesting-1/)...**
I was re-reading [this issue](https://github.com/w3c/csswg-drafts/issues/2937), in which I talked about the conflict between the CSS Nesting proposal and Sass / Less (/ PostCSS, etc)
I think the CSS nesting proposal can be satisfied without conflicting with Sass / Less, and more closely align with CSS, by the use of pseudo-class. **Specifically, replacing `&` with `:and()` (as an analog to `:not()`)**
It would be:
```css
.component-1, .component-2 {
:and():hover { a: b; }
}
```
This would be the equivalent of:
```css
:where(.component-1, .component-2):hover { a: b; }
```
That is, like `:where()`, `:and()` would not add 0 specificity.
#### With `@nest`
Similarly, I think the proposal is right that the use of `@nest` is necessary to remove ambiguity, as in:
```css
.component {
@nest tag:and() { a: b; }
}
```
This would be the equivalent of:
```css
tag:where(.component) { a: b; }
```
#### Using at root
If `:and()` is not nested, it would just collapse, as in, these two are equivalent, both in what they select, and in specificity:
```css
.component { }
.component:and() { }
```
#### Uses with Less / Sass / PostCSS
This proposal would allow co-mingling with languages that currently support `&`, as in, with this input:
```less
// Less code
.component {
:and().component-2 { a: b; }
&:hover { c: d; }
}
```
The Less output would (could) be:
```css
.component {
:and().component-2 { a: b; }
}
.component:hover {
c: d;
}
```
In other words, it's no longer ambiguous whether or not rules should flatten, and there's no conflict between the meaning of `&` in the existing CSS Nesting proposal and [its (different) meaning in Sass / Less](https://github.com/w3c/csswg-drafts/issues/2937).
#### Other syntaxes
I used `:and()` vs `:and` because it seems more semantically similar to `:where()`, `:not()`, `:is()` etc; that is, that it's returning a selector to match, even if it doesn't have arguments. However, CSS spec authors may feel that `:and` is sufficient, as in:
```css
.component {
:and:hover {}
}
```
My feeling was also that arguments may be added to `:and()` in the future, such as partial matching of selectors, but CSS spec authors may disagree.
Another syntax possibility I considered, for brevity, would be something like an empty pseudo-class, as in `:()`.
As in:
```css
.component {
:():hover {}
}
```
This has the drawback of no longer being a valid pseudo-class, but may be an improvement over `&`.
#### Changes to CSS parsing
Obviously, like the CSS Nesting proposal with `&`, a change would be needed to allow the "and identifier" at the start of a rule, but unlike the `&` proposal, IMO this change is not a significant, since `:and()` is a valid selector.
---
Thoughts welcome.
Please view or discuss this issue at https://github.com/w3c/csswg-drafts/issues/5491 using your GitHub account
--
Sent via github-notify-ml as configured in https://github.com/w3c/github-notify-ml-config
Received on Wednesday, 2 September 2020 17:55:12 UTC