-
Notifications
You must be signed in to change notification settings - Fork 682
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[css-cascade][css-syntax] New !revertable
flag to mark a declaration as "can be reverted when IACVT"
#10443
Comments
There's overlap here with the ideas in #1594.
Ideally, we'd just not do that, and make it always possible to revert to the previous "winner" of the cascade (using a keyword). We'd need to investigate the performance implications of this, though. |
That’s the idea for the opt-in: that authors would not be doing this for every single declaration, so the performance implications should be minimal. |
#foo {
height: 1px;
block-size: 2px;
height: var(--invalid) !revertable;
} Assuming an horizontal writing mode, should this revert to 2px or 1px? I guess 2px like I wonder if it would make more sense to add an entirely new rule like @revertable #foo {
height: 1px;
block-size: 2px;
height: var(--invalid);
} |
This seems orthogonal to the issue we’re discussing? It would revert to whatever this would revert to: #foo {
height: 1px;
block-size: 2px;
height: invalid;
} Not sure how UAs handle the aliasing, but that doesn't seem particularly difficult to define. They'd probably keep both around?
I would be strongly opposed to doing this as a rule. Rules are far more heavyweight, scoping has to be defined from scratch, and authors cannot port knowledge about it from other parts of CSS. @-rules should be a last resort, not the first thing we reach for because defining syntax with good ergonomics is hard. |
Agenda+ since I had some discussions with implementers at the CSS WG meeting last week that indicated this is very implementable. |
It isn't orthogonal. If we are only reverting to the same property, we could just shift down all declarations for the same property to the last one, then store the values together as a list, say that However, if we can revert to other properties, we can't keep assuming that a given property can only appear at most at one index. So it seems the API and the data structures used by browsers will need considerably bigger changes.
Well, I would be strongly opposed to not exposing the necessary information via CSSOM. And it doesn't seem great to pollute |
Most aliases are known in advance. The only complication with the issue you're pointing out is that the aliasing can be dynamic. These cases are sufficiently few they can just be stored in a data structure (if they aren’t already). Nothing is polluting |
Even if an at-rule and a Besides, as specified on the original issue at #5319, the fallback property may be on another CSS rule (or even on third-party styles), like the following: <p class="lorem">Lorem ipsum dolor</p> p {
background-color: red; // declaration gets thrown away
}
.lorem {
background-color: var(--not-a-color); // declaration is IACVT
} If the rule with the IACVT is more specific, the declaration on the lesser specific rule gets thrown away. If I understand your approach correctly, both declarations would need to be in the at-rule, which is harder if they are in different rules. I think putting a |
@Monknow No. When the second winner of the cascade is in another rule, then it's no different than The problem with normal rules is that duplicate declarations for the same properties get overridden at parse time. So we need a different data structure. Then a different kind of rule may be cleaner.
@LeaVerou Please read my comment more carefully: "I would be strongly opposed to not exposing the necessary information via CSSOM", which clashes with your proposal in the first post of not exposing it via CSSOM. |
I did. Exposing it via the CSS OM doesn't mean exposing it via every single CSS OM API. If
That said, there may be value in having an @-rule as well, as sugar for applying |
How would the I imagine registered custom property would force variable resolution during type checking, so below should work right? .example {
--registered: revert to this value;
--IACVT: max(invalid);
--registered: var(--IACVT) !revertable;
}
@property --registered {
syntax: "<number>";
inherits: false;
initial-value:0;
} What about unregistered custom property? Would the presence of the .example {
--unregistered: revert to this value;
--IACVT: max(invalid);
--unregistered: var(--IACVT) !revertable;
} |
Good question! For registered custom properties, things should be relatively straightforward and work as for any other custom properties. In your example it will be .example {
--registered: 1;
--IACVT: max(invalid);
--registered: var(--IACVT) !revertable;
} then it will revert to For unregistered custom properties, the most logical thing to do is to treat them as they're treated now: always valid until used, in the same way it currently “taints” any declaration making fallbacks impossible (and for which we'll have I don't know if it is currently possible to determine if an unregistered custom property is invalid before using it? If so, I can see it useful to be able to revert to previous values when doing |
Good catch on my code snippet, I forgot that the reverted value needs to conform to the syntax specified.
That's what I'm hoping it can do, I believe currently registered property with "any token" syntax behave the same as unregistered property, correct? So simply doing so doesn't solve the problem. My simplified use case is follows - I want to create a design system where you can specify width as fractions. .example {
width: calc(100% * var(--width));
--width: 2/3;
--width: max(invalid) !revertable;
} As you can see here there isn't any syntax I can use other than any token, since "2/3" doesn't conform to any type. Of course I can use If we can force IACVT checking with Edit: I thought about using an intermediate variable with |
The thing is, |
I think this use case is more of a limitation of |
Yes, we can't decide whether a |
This came out of #5319 but I figured I should make a new post for this for visibility, since it’s a distinct proposal.
#5319 discusses a keyword like
revert-declaration
, however I don’t think a keyword will work, since anything that is part of the value cannot be known in advance (it can be part of a variable for example).The problem is that UAs throw the other declarations away when they see a new one in the same scope. It's impossible to know whether the new one will ever use that keyword so they can keep the old ones around too. It works with
revert
andrevert-layer
because the other declarations are kept around anyway since they’re in a separate origin/layer.However, I think a new !-flag may actually work. TBB, but some potential names could be
!revertable
,!revocable
,!transient
,!layered
. Since!
-flags need to be present at parse time and are always at the end, it doesn’t have the issues that a keyword would.When a declaration with this flag is encountered, the UA keeps old declarations around instead of replacing them with this.
There can be more than one:
One open question is how would this work in the CSS OM. But we could just expose the last declaration, and authors can use Typed OM to get all of them (which allows append).
The text was updated successfully, but these errors were encountered: