IRC log of css on 2018-07-03

Timestamps are in UTC.

23:10:54 [RRSAgent]
RRSAgent has joined #css
23:10:54 [RRSAgent]
logging to
23:10:56 [trackbot]
RRSAgent, make logs public
23:10:56 [Zakim]
Zakim has joined #css
23:10:58 [trackbot]
Meeting: Cascading Style Sheets (CSS) Working Group Teleconference
23:10:58 [trackbot]
Date: 03 July 2018
23:11:19 [astearns]
rrsagent, this meeting spans midnight
23:13:56 [heycam]
heycam has joined #css
23:17:15 [myles]
myles has joined #css
23:17:19 [myles]
23:18:37 [skk]
23:19:00 [ericwilligers]
ericwilligers has joined #css
23:19:00 [fantasai]
23:19:01 [TabAtkins]
23:19:02 [Rossen]
23:19:03 [heycam]
23:19:03 [xidorn]
23:19:03 [leaverou]
23:19:04 [philipwalton]
23:19:04 [astearns]
23:19:04 [eae]
23:19:05 [ericwilligers]
23:19:09 [dino]
dino has joined #css
23:19:15 [dino]
23:19:20 [dbaron]
23:19:29 [myles]
Topic: <color> in <shadow> should default to currentColor
23:19:39 [plinss]
23:19:52 [myles]
23:19:53 [chris]
chris has joined #css
23:20:02 [chris]
23:20:08 [myles]
Fantasai: any objections?
23:20:25 [chris]
rrsagent, here
23:20:25 [RRSAgent]
23:20:31 [myles]
Rossen: We need to make sure the people who care have a chance to look
23:20:51 [myles]
xidorn: the issue is that if it isn’t specify, the used color is taken from the current property
23:21:04 [myles]
xidorn: I think the text should just be “it defaults to currentColor”
23:21:18 [myles]
dbaron: the spec may have evolved from something that was more flexible
23:21:41 [myles]
chris: let’s say it’s user defined
23:21:52 [myles]
Rossen: are we okay with the proposed resolution?
23:22:00 [myles]
Rossen: any objections? <silence> resolved
23:22:03 [chris]
s/let/(sarcastically) let/
23:22:08 [myles]
RESOLVED: Accept the proposal
23:22:24 [frremy]
frremy has joined #css
23:22:36 [Rossen]
s/Accept the proposal/<color> in <shadow> should default to currentcolor
23:22:58 [myles]
chris: There’s also the same problem with drop-shadow as well as shadow
23:23:13 [myles]
leaverou: it doesn’t work that way already?
23:23:23 [myles]
Rossen: any additional comments?
23:23:37 [myles]
Rossen: <silence> Any objections?
23:23:52 [myles]
RESOLVED: drop-shadow and shadow will also default to currentColor
23:24:22 [myles]
Topic: Inconsistent position serialization
23:24:30 [myles]
23:24:54 [myles]
ericwilligers: For one of the properties, the spec is explicit about serialization, and that’s different from all the other ones
23:25:06 [myles]
ericwilligers: another inconsistency is that all the browsers behave differently from one another
23:25:29 [myles]
ericwilligers: suggestions?
23:25:40 [myles]
leaverou: don’t we have a principle that shorter serializations are better?
23:25:42 [myles]
TabAtkins: yes
23:25:49 [myles]
leaverou: if we follow that, 50% should not be introduced
23:26:00 [myles]
leaverou: do that mean if it was specified explicitly, it should be introduced?
23:26:20 [myles]
dbaron: there are cases where you do need it to be disambiguated. center 10% and 10% center are different
23:26:40 [myles]
dbaron: someone should go through, figure out what the compatible behavior is, figure out what the same behavior is, and figure out what should actually happen. This table is rather large for going through in the WG meeting
23:26:52 [myles]
ericwilligers: the one that’s different from the others, is that a mistake and they should all the consistent?
23:27:02 [myles]
emilio: yes
23:27:48 [myles]
dbaron: some of these things are very easy to write as a spec editor, but we should be careful to stick them in when they cause inconsistencies like this. Implementors should be suspicious of them too, if they say to do something different from everything else
23:28:00 [myles]
emilio: Can we resolve on the special case being outside?
23:28:08 [myles]
fantasai: All the cases should be the same
23:28:10 [emilio]
23:28:12 [myles]
Rossen: yes
23:28:37 [myles]
ericwilligers: we should think about transform origin and background position, because transform origin is 3D, and background position accepts the 3 value grammar. So “left 10% top”
23:28:44 [myles]
fantasai: we’re trying to get rid of 3 values
23:29:19 [myles]
fantasai: we can resolve on 2 things: 1) all the serializsations should be the same, 2) we never serialize to the three value serializations, unless one of the three values is center, and 3)
23:29:57 [myles]
ericwilligers: What about always serialize to a valid <position>
23:30:13 [myles]
fantasai: bgposition should not be allowed in serialization
23:30:17 [myles]
Rossen: objections?
23:31:21 [myles]
RESOLVED: 1) All the positions serialize the same way (background-position,m object-position, etc.) 2) All of them resolve as <position>. Background-position 3-value syntax’s are not allowed.
23:32:02 [myles]
fantasai: We have more questions. 1) Do we ever serialize to a 1-value syntax? Eric made an amazing chart of compat data. Edge takes the shortest backwards-compatible serialization principle very seriously, and when it can, drops down to a single value. The other implementations will always have at least 2 values
23:32:07 [myles]
Rossen: yeeeeeup
23:32:25 [myles]
fantasai: Should we ask Edge to change? To match everyone else? Or are one-value serializations actually good
23:32:31 [myles]
TabAtkins: This decision applies to typed OM too.
23:33:12 [myles]
fantasai: I think two-value syntax is more understandable to work with. Because if you happen to land on 50% arbitrarily, it would be awkward otherwise. And we have 3 implementations this way. So, because of minimizing the amount of work, we should standardize on 2-values
23:33:57 [myles]
heycam: Is this a general principle? Like pairs of numbers that are coordinates, they should always be serialized as two-values?
23:34:01 [myles]
fantasai: I don’t think that’s valuable
23:34:24 [Rossen]
s/Rossen: yeeeeeup//
23:34:39 [myles]
dbaron: One reason position is different is that it has a relatively complicated set of rules, where you’re allowed to do X Y order, or Y X order much of the time but not all of the time, which makes it complicated to figure out which values will round-trip correctly if you reduce it to just one
23:34:54 [myles]
fantasai: a more important reason is the transform-origin syntax, which becomes ambiguous if you only have one value
23:35:33 [myles]
fantasai: You wouldn’t be able to consider position as a single value without considering whether or not you have a Z component. That creates a serialization of position cannot be self-contained
23:35:52 [myles]
fantasai: The proposal: <position> always serializes at least two values
23:35:58 [myles]
TabAtkins: I’m down with that
23:36:08 [myles]
Rossen: It means some work for us, but ...
23:36:16 [myles]
TabAtkins: It means some work for all of us because we’re inconsistent
23:36:24 [myles]
Rossen: okay.
23:37:04 [myles]
RESOLVED: All the <position> values serialize to at least two values.
23:37:26 [myles]
heycam: Is there a way to tell for a given property whether or not we have considered its serialization and what’s in the spec is a considered decision?
23:37:29 [myles]
fantasai: not really
23:38:01 [myles]
fantasai: In most cases, you follow the general principle of “shortest most backwards-compatible serialization” and the exceptions are where we will have to explicitly say something. The spec says “it’s probably this” but you need to check in case there’s some legacy something
23:38:08 [myles]
heycam: I don’t like having to check
23:38:13 [myles]
fantasai: Are you volunteering to do the checking?
23:38:16 [myles]
heycam: No
23:38:29 [myles]
heycam: We should reflect our discussions back in the spec so we don’t have to check
23:38:42 [myles]
ericwilligers: We may not be testing in all 4 browsers
23:38:52 [myles]
heycam: So tests may serve this purpose?
23:39:17 [myles]
fantasai: When we have a 4-value syntax, do you serialize it out to 4 values or do you compress it using calc to two values
23:40:00 [myles]
Rossen: I looked at this a year ago int he context of object-position. Most of the testing I did cross browsers suggested that almost all implementations attempt to serialize down to calc for computed values on getComputedStyle(), and were inconsistent as described in this one for style serialization
23:40:36 [myles]
emilio: I don’t think we synthesize calc in any case for computed value serialization. If you specify it as calc(), and we cannot simplify it, but I dont’ think we should use calc to shorten the result
23:40:45 [myles]
ericwilligers: We’re just talking about serialization, not computed value
23:40:51 [myles]
emilio: It’s essentially the same thing
23:40:54 [myles]
fantasai: yeah
23:41:03 [myles]
fantasai: We’re talking about specified values, not computed styles
23:41:10 [myles]
ericwilligers: Blink would never give you a keyword as a computed value
23:41:20 [fantasai]
23:41:37 [myles]
Rossen: What are we thinkging about in terms of 4 value serialization?
23:41:44 [myles]
Rossen: Should we attempt to do 2 when possible?
23:41:55 [myles]
plinss: Turning a non-calc into a calc seems weird
23:42:24 [myles]
astearns: Ifwe can simplify a 4-value into a 2 value without calc, that makes sense, but if you have to use calc, then it’s not a simplification
23:42:46 [myles]
dbaron: I agree as well, though the principle that would say to use calc() is the most compatible syntax principle, because calc() got implemented in background-position background to the 4-value syntax
23:43:11 [myles]
dbaron: So for a while you were able to do the effects of the 4-value syntax with calc, without the real 4-value syntax. BUt for now we shouldn’t do it because it’s less compatible
23:43:56 [myles]
astearns: We went through this when we were deciding how to use these values in basic shapes. What I thought we were doing was coming up with general principles that would generally be applied to other things than basic shapes. Basic shapes prefers two values, if you can express it without calc, so we may look to that as what we were trying to do years ago
23:44:04 [myles]
fantasai: Eric, do you have the test you used for the 4-value syntax?
23:44:35 [myles]
fantasai: Can you modify it from bottom right to top left to see if the values get dropped, or if we keep the 4 value syntax even in that case
23:44:45 [myles]
ericwilligers: It takes me a while to get results because I use browser stack.
23:44:54 [myles]
ericwilligers: If you tell me what you want to know, we can figure it out
23:44:55 [astearns]
<position> in basic shapes is paragraph 2 of
23:45:03 [fantasai]
top 10% left 20%
23:45:31 [myles]
ericwilligers: With the suggestion that we go down do two unless it introduces a calc, what effect would that be fore background-position?
23:45:47 [myles]
Rossen: The minute you have top 10% and then center ..
23:45:55 [myles]
ericwilligers: Peopel were saying “we should never ever go to three”
23:46:04 [myles]
ericwilligers: right 10% top wil go to 4
23:46:33 [myles]
ericwilligers: 1 more question: right 10% top should serialize differently from left 10% top???
23:47:06 [myles]
fantasai: That was the question I wanted to ask. We should see what the output is. If there is consensus, we tend to go with that. So I think we should investigate this question a little more over the break. And then go on to the issue of whether to serialize out keywords when you put serialize as a percentage
23:47:12 [myles]
Rossen: but this is after the discussion int eh morning?
23:47:16 [myles]
fantasai: no, we can do it now
23:47:32 [Rossen]
s/int eh/in the/
23:47:36 [myles]
fantasai: Looka t the 3rd table: 30px center. Some of the serializations use 50%, some use the keyword center
23:47:48 [myles]
fantasai: The table after that: 40px top, some use 0% and some use the keyword top
23:48:03 [myles]
fantasai: So the question is, do we resolve on outputting the keyword when the percentage would work?
23:48:24 [myles]
dbaron: The bulk of the boxes are they keyword except 3 of them
23:48:42 [myles]
dbaron: That said, I don’t know if we should try to go through all of this
23:49:15 [myles]
fantasai: 2 questions: 1) How do we deal with keywords, both if the author supplies them and do we turn 50% into center, and 2) the two-value vs 4-value question
23:49:26 [myles]
fantasai: We can look into that over the break.
23:49:51 [myles]
Rossen: This is where we are going to get a lot more calcs in percentages
23:49:59 [myles]
Rossen: okay that’s everything for this for now
23:50:14 [myles]
Topic: Issues for listifying border-color
23:50:26 [myles]
23:51:46 [myles]
leaverou: There’s a very detailed write up in the issue of everything I’m going to say
23:53:15 [myles]
leaverou: Do people remember the issues with listifying border-color? A few meetings ago, we resolved to listifying border-colors, because 1) Authors wanted multiple borders, but primarily a11y needed borders that are both white and black so that they are visible over any background. So we listifying border-color with the goal of listifying alt he border properties
23:53:38 [myles]
leaverou: BUt when I actually tried to listifying border-color, there were several issues.
23:54:25 [myles]
leaverou: 1) Because of the way listified properties work, if the lists are mismatched, the shorter lists are padded with the last term, which means if you have a border-width of 10px, and say 3 border colors, then 10px becomes 10px, 10px, 10px, which gives you a width of 30px. So setting border-color has the effect of tripling your border width. Weird, and this is the first time
23:54:34 [myles]
heycam: Wouldn’t this happen with any other listified properties?
23:54:50 [myles]
leaverou: Others don’t stack. Backgrounds and animations are independent. But border-width, they stack, they aren’t independent.
23:55:05 [myles]
tantek: Or you have to do weird math, which is worse.
23:55:54 [myles]
leaverou: Other issue: based on how other properties were listified, the property got almost the same syntax it already had, but you could add more with commas. So, previously it accepted 4 colors, you could have 1-4 colors, then commas, then 1-4 colors, etc. This inverts the relative power of white space and commas, which is not how authors think
23:56:02 [myles]
leaverou: You can see an example in the issue
23:56:08 [myles]
leaverou: It’s quite unexpected.
23:57:54 [myles]
leaverou: For those reasons, fantasai and I were thinking of an alternative way to do multiple border colors, because there aren’t many use cases of multiple colors with different styles. All use cases for multiple borders are essentially cases for multiple colors on a solid border. So we were thinking how can we have multiple colors on existing borders. The idea is to define a function, we called
23:57:54 [myles]
it stripes(), which lets people define a 1-dimensional image which is weird but we already have 0-dimensional images, and it can be used in border-color, and it has to be 1-dimensional image because otherwise it would be difficult to define how it works around border-radius. To cover the most prominent use cases it would include lengths and percentages, and would work with fr values
23:58:09 [tantek]
Lea's proposal looks like an improvement to me
23:58:48 [myles]
leaverou: I have a list of the use cases we tried to cover in the issue, and a table of what the different syntaxes would look like. We also considered letting border-color accept a sequence of color stops, but that’s not convenient, because with borders, people usually wants stripes not gradients, and it’s hard to make stripes with the gradient syntax
23:58:55 [myles]
fantasai: You don’t want absolute positions
23:59:32 [fantasai]
s/positions the way gradient stops do them, but rather widths that stack/
23:59:42 [myles]
leaverou: We also considered using a new border-stripes property. But it has weird affects. It combines with border-color in a confusing way, because unless there are transparent stripes, you dont’ see border-color. In general, having properties that disable other properties is some fo the most confusing parts of css
23:59:54 [myles]
emilio: Firefox used to have multicolor border support, by using a new property
23:59:59 [myles]
leaverou: Yep, and it was confusing
00:00:08 [myles]
chris: We decided not to do it the Firefox way
00:00:20 [myles]
dbaron: It was a hack to create a certain button style without making extra dives
00:00:28 [myles]
leaverou: I used it 10 years ago to simulate box shadow
00:00:30 [myles]
TabAtkins: I like it
00:00:48 [myles]
astearns: What happens when the total sum of the width exceeds the border width?
00:00:58 [myles]
TabAtkins: You just only render the border-width of the stripes
00:01:19 [myles]
leaverou: We can just scale it down. We do it with border-radius, if the total radii overlap, then it gets clamped
00:01:40 [myles]
S/clamped/scaled equally across the entire box/
00:02:05 [myles]
astearns: That could work, but what about fractional widths? Those go to 0? So you have a 2px white fractional black, 2px white
00:02:24 [myles]
TabAtkins: *describes another example*
00:02:30 [myles]
fantasai: It’s better than clamping.
00:02:48 [myles]
fantasai: It gives you reasonable behavior when you grow and when you shrink
00:03:00 [myles]
TabAtkins: We already have mechanisms (percentages) to do this.
00:03:26 [myles]
TabAtkins: This allows you from putting in more stripes than you need
00:03:52 [myles]
TabAtkins: So if you alternating 1px stripes, you just make a super long one, and no matter how wide the border happens to be, it will just work (in the clamping situation)
00:04:09 [myles]
frremy: Animations work better too
00:04:22 [myles]
leaverou: If you want to reveal stripes, you could always animate them from 0
00:04:30 [myles]
TabAtkins: Not if we scale the values
00:04:47 [myles]
leaverou: Non-zero lengths will be scaled down, but if you want to progressively animate,
00:04:56 [myles]
TabAtkins: You can alreadya chive accordian effect
00:05:14 [myles]
fantasai: What if you want 2px red, 2px white, 2px red. If the border grows, you want the white to grow
00:05:32 [astearns]
s/alreadya chive/already achieve/
00:05:33 [myles]
fantasai: When you scale up, you want red on the outside, you preserve the red, white, red
00:05:39 [myles]
TabAtkins: use min() and max() instead.
00:05:58 [myles]
leaverou: What do we do if we want a thinner width than what we have? In fantasai, what if our border is 10px
00:06:05 [myles]
TabAtkins: We follow gradients. The last color continues
00:06:11 [myles]
fantasai: Or the last color could be transparent
00:06:17 [myles]
TabAtkins: But then the border doesn’t look thick
00:06:26 [myles]
fantasai: If you want it to be thick, put 1fr at the end
00:06:45 [myles]
TabAtkins: When this is used in a 2 dimensional context, then this should be a gradient in some arbitrary direction
00:07:10 [myles]
fantasai: I don’t think he testing and implementation effort of making stripes in 2d only for an arbitrary direction makes any sense
00:07:16 [myles]
TabAtkins: Here we’re just talking about stretching and scaling
00:07:20 [myles]
Rossen: What if we repeat the pattern?
00:07:26 [myles]
leaverou: We can introduce that later. Let’s keep it simple.
00:07:35 [myles]
fantasai: It answers the question of what to do if you dont’ have enough stripes
00:07:48 [myles]
TabAtkins: Don’t be arbitrarily different. Do what gradients do
00:07:53 [myles]
fantasai: no
00:07:56 [myles]
TabAtkins: no
00:08:03 [myles]
TabAtkins: be consistent
00:08:10 [myles]
fantasai: this isn’t gradients
00:08:16 [myles]
TabAtkins: this is gradients
00:08:20 [myles]
fantasai: this is stripes
00:08:32 [myles]
leaverou: Gradient color stops are defined absolutely, and there is no fr
00:08:51 [myles]
Rossen: stop. Are we trying to add this to backgrounds-4?
00:08:52 [myles]
All: yes
00:08:57 [myles]
Rossen: We can work this out later
00:09:18 [myles]
Rossen: Was there anything else you wanted to go over technically as part of the proposal?
00:09:22 [myles]
leaverou: no
00:09:34 [myles]
Rossen: Should we add this? Are there still too many open issues for it to be added?
00:09:47 [myles]
TabAtkins: Using the stripes functions as a border color and not listifying border color makes more sense than what we already have
00:10:12 [tantek]
00:10:20 [myles]
fantasai: This is a better solution. My question: whether to use border stripes or to add this to border color. In general, colors cannot take a 1d image. Any property that ends in -color takes a color. This is not a color, it accepts a 1d image
00:10:25 [myles]
astearns: border-color-stripes?
00:10:30 [myles]
fantasai: border-stripes is okay
00:10:36 [myles]
leaverou: What about the confusing interactions?
00:10:40 [myles]
fantasai: its okay.
00:10:50 [myles]
astearns: The behaviors fall out of the description
00:11:11 [fantasai]
00:11:25 [fantasai]
astearns: e.g. might answer question of what to do when you run out of stripes
00:12:14 [myles]
frremy: That isn’t great because if you pad a border stripes with the border color, the issue is that the border color by default is non transparent, but your stripes may be transparent, then should you display the border-color under the stripes? If you do, you lose the whole point of having transparent stripes
00:12:21 [myles]
fantasai: You should show border underneath this property
00:12:40 [myles]
leaverou: You often want them to stack, to have a fallback that you don’t have to repeat it in your gradient
00:12:57 [myles]
xidorn: I dont’ understand the integration here
00:13:11 [myles]
fantasai: border stripes and border color will disappear when you use border-image
00:13:17 [myles]
chris: This will need some good examples
00:13:29 [myles]
TabAtkins: Or we just do stripes() and we don’t have to deal with this stuff
00:13:32 [myles]
leaverou: yep
00:13:35 [myles]
fantasai: yep
00:13:47 [myles]
leaverou: If we do it with a stripes function and not a separate property, we can extend this to other properties
00:14:09 [myles]
fantasai: The other properties need a 0-dimensional color, or a 2-dimensional image. If you applied stripes to those other places, you would need to also specify a direction and turn it into a 2-d thing
00:14:16 [myles]
leaverou: i said “if it’s needed” and it may not be needed
00:14:28 [myles]
fantasai: We could re-use the syntax. It doesn’t have to be a functional notation
00:14:37 [myles]
leaverou: We would have to add a new property for each of those cases
00:14:39 [myles]
fantasai: That’s okay
00:14:50 [myles]
Rossen: Do we prefer the stripes functions? Or a new property
00:15:01 [myles]
fantasai: border-stripe
00:15:06 [myles]
TabAtkins: stripes function
00:15:10 [leaverou]
stripes function
00:15:16 [tantek]
stripes function
00:15:36 [myles]
astearns: One reason to have the function is that we noted that listifying properties is confusing. Stripes() makes specifying these stripes more comprehensible. If we use a property, we’re back to a list.
00:15:38 [myles]
leaverou: yes
00:15:54 [tantek]
s/all a/allow a
00:16:05 [myles]
Rossen: Another benefit is you can have the border color and the stripes in the same definition, so you can have your border color as defined green, but you can also define the stripes on top that may or not have green
00:16:14 [myles]
leaverou: So you can do them both in the same property
00:16:17 [myles]
Rossen: Yes.
00:16:20 [myles]
TabAtkins: Why do you need that?
00:16:33 [myles]
Rossen: So you can have the last value be transparent, and the default shows through
00:16:42 [tantek]
Is stripes a subset of gradients?
00:16:55 [myles]
fantasai: The main benefit of the border color being separate is so that they can cascade independently. If theyr’e not cascading independently, then there’s no point
00:17:23 [myles]
chris: The original reason for this was because a11y wanted to have a black and a white outline, and outline is defined in term of border. With this syntax, you say “black white” and you’re done.
00:17:29 [myles]
chris: Let’s not make a new property.
00:18:11 [myles]
tantek: Is stripes just a subset of gradients?
00:18:12 [leaverou]
tantek: No, gradients are 2D images. Also, gradient color stops define positions, not widths.
00:18:26 [myles]
Rossen: Proposal: adding stripes() to border-color and outline-color
00:18:39 [myles]
Rossen: Any additional concerns? Comments that would change this resolution, or objections?
00:18:48 [myles]
florian: How does it interact with border-style: double
00:18:54 [myles]
fantasai: You clip out the border shape.
00:19:04 [myles]
Rossen: Just like it would work with gradients
00:19:14 [myles]
leaverou: I think he’s asking about double borders ,not dotted and dashed.
00:19:21 [myles]
chris: It’s a clip mask effectively.
00:19:39 [myles]
leaverou: Double has two different colors, and inside and an outside
00:19:48 [myles]
florian: nope, that’s something else
00:19:51 [myles]
leaverou: You’re right
00:20:26 [myles]
dbaron: We could say that inset outset groove and ridge would just get treated as solid because you’re picking your colors yourself now and that overrides those styles.
00:20:34 [myles]
florian: You can use it as fallback.
00:20:37 [myles]
leaverou: right!
00:20:41 [myles]
leaverou: I like that
00:20:43 [myles]
chris: yeah.
00:20:50 [myles]
Rossen: Any objections?
00:21:02 [myles]
RESOLVED: Add stripes() to border-color and outline-color
00:21:18 [TabAtkins]
tantek: It's *substantially* more work, yes, *and* it doesn't work well with border-radius either.
00:21:20 [myles]
Rossen: Do we now publish a new working draft?
00:21:29 [myles]
fantasai: I don’t know what state the rest of the draft is in
00:21:39 [myles]
leaverou: we’ve published a working draft before, right?
00:21:43 [myles]
fantasai: nope
00:21:46 [TabAtkins]
(You can't supply separate images for each border, just a single border-image that's 9-sliced to supply all the border regions.)
00:21:50 [myles]
Rossen: This is level 4, right?
00:21:58 [myles]
leaverou: yes, that needs lots of cleanup
00:21:59 [TabAtkins]
And yeah, probably so, which is fine with em.
00:22:05 [myles]
Rossen: Let’s not publish
00:22:18 [TabAtkins]
Just "gradient(...)"
00:22:22 [myles]
Topic: color-filter
00:22:36 [myles]
00:23:05 [fantasai]
Topic: color-filter
00:34:07 [myles]
myles has joined #css
00:49:01 [fantasai]
00:49:07 [shane]
Restaurant tonight is Long Chim
00:49:15 [myles]
myles has joined #css
00:49:18 [fantasai]
dino: Some background...
00:49:25 [fantasai]
ScribeNick: fantasai
00:49:33 [shane]
address for Long Chim: Corner of Pitt Street &, Angel Pl, Sydney NSW 2000
00:50:19 [fantasai]
dino: Same way that Windows has done for decades, Apple's latest OS has a “dark theme”
00:50:29 [fantasai]
dino: Where user has a checkbox where they can choose between light or dark mode
00:50:34 [fantasai]
dino: You can see my browser is in dark mode atm
00:50:44 [fantasai]
dino: System apps have implemented this
00:50:47 [fantasai]
dino: Seems pretty popular
00:50:55 [fantasai]
dino: This is about how you can apply something like that to the Web
00:51:08 [fantasai]
dino: Particularly relevant to us for mail messages
00:51:11 [fantasai]
dino: which are web pages
00:51:20 [fantasai]
dino: What we wnated to do was automatically ocnvert a page to dark mode
00:51:30 [fantasai]
dino: To do that, you want white to go to black, but you want hues to stay the same
00:51:34 [fantasai]
dino: e.g. blue shouldn't become orange
00:51:39 [fantasai]
dino: We had the idea to use color-filter
00:51:47 [fantasai]
dino: This takes filters just like 'filter'
00:51:53 [fantasai]
dino: But doesn't have ability to omove pixels
00:52:04 [fantasai]
dino: It's a paint-time effect
00:52:18 [fantasai]
chris: Is this a straight 255 minus effect?
00:52:19 [fantasai]
dino: Yes
00:52:34 [fantasai]
dino shows off invert()
00:52:46 [fantasai]
dino: It's not like a regular filter. No stacking context. Just applies to colors
00:52:57 [fantasai]
dino: colors of gradients, anywhere a <color> appears
00:53:03 [fantasai]
dino: DOesn't affect images
00:53:30 [fantasai]
dino: Because when you switch to dark theme, you don't want to have images invert
00:53:37 [fantasai]
dino: or emoji colors to invert
00:53:39 [fantasai]
00:53:48 [fantasai]
dino: We don't actually wantto just invert the colors
00:54:09 [fantasai]
dino: Here's an example - invert(0.83) hue-rotate(180deg) saturate(3)
00:54:40 [fantasai]
dino: white goes to dark gray, bump saturation to compensate for grayishness, and then hue-rotate gets our colors back to what they would be without inversion
00:54:58 [fantasai]
dino: Works nicely. Better on my laptop than on the projector here.
00:55:46 [fantasai]
dino: This other column does some additional tweaks using JS, to look a little better.
00:56:01 [fantasai]
dino: Anyway, this is what we're using to display mail messages now
00:56:21 [fantasai]
dino: We have heuristics, if a marketing mail sets bgcolor, we won't do it
00:56:35 [fantasai]
dino: but for plaintext or simple HTML messages, we'll apply the filter
00:56:43 [fantasai]
dino: What we've got here is not Web-exposed, just in Mail
00:57:03 [fantasai]
dino: We can talk more later about Media Queries and how to interact with the Web
00:57:30 [fantasai]
dino: But a Web page could e.g. change colors manually in response to a media query, or they could use color-filter
00:57:39 [fantasai]
dino: It's just maths on red/green/blue channels of the colors
00:57:43 [fantasai]
dino: images are untouched
00:57:49 [fantasai]
dino: No stacking context
00:57:57 [fantasai]
dino: It's inherited, so you can undo it in a subtree
00:58:12 [fantasai]
chris: Initial value?
00:58:13 [fantasai]
dino: none
00:58:24 [fantasai]
chris: You say not images, but some parts of CSS are <image>s...
00:59:04 [fantasai]
dino: Gradients is a good example. If your bgimage is a gradient, you apply it to the coors in the image
00:59:12 [fantasai]
leaverou: What about color variables?
00:59:19 [fantasai]
fantasai: Gets applied when you apply the color
00:59:28 [fantasai]
TabAtkins: But you don't want to double-apply for typed variables
00:59:29 [fantasai]
00:59:35 [leaverou]
s/What about color variables?/What about custom properties that have been defined to accept <color>?/
00:59:38 [fantasai]
xidorn: Is it applied during cascading or what?
00:59:42 [fantasai]
emilio: Computed value is not affected
00:59:48 [fantasai]
fantasai: used-value time operation
01:00:28 [fantasai]
astearns: currentColor
01:00:30 [fantasai]
fantasai: probalby fine
01:00:37 [fantasai]
heycam: <canvas> ?
01:00:55 [fantasai]
dino: Woudln't apply to canvas
01:01:07 [fantasai]
dino: Currently implemented not for Web, in apps ike Mail etc.
01:01:13 [fantasai]
dino: We think it makes sense for the Web
01:01:24 [fantasai]
dino: as a way to help authors adjust page
01:01:35 [fantasai]
leaverou: What about color modification functions?
01:01:46 [fantasai]
TabAtkins: Amelia asked that already in the issue. I think having both is useful
01:01:52 [fantasai]
leaverou: Are there uses other than dark themes?
01:01:59 [fantasai]
dino, chris: high-contrast
01:02:23 [fantasai]
dino: One of the greatest benefits we've found, before this people with vision issue sthat didn't like bright content would be constantly swapping between inverted/non-inverted mode
01:02:28 [fantasai]
dino: And that's a screen-time effect
01:02:38 [fantasai]
dino: And then we had to uninvert the images to make that useful for them
01:02:46 [fantasai]
dino: And then also create all these stackign contexts, which aaffects the page
01:02:50 [fantasai]
dino: So this is pretty nice.
01:02:55 [fantasai]
dino: So this might be a nice forced option
01:03:09 [fantasai]
dino: That the user could apply, e.g. "I want to see this web site dark"
01:03:20 [fantasai]
leaverou: Does it also apply to colors in inline SVG?
01:03:24 [fantasai]
dino: Yes
01:03:34 [dbaron]
This seems like a reasonable feature, although I'm skeptical about the readability of the mail in the use case Dean described given the massive differences in perceived luminance between the R, G, and B channels. (e.g., blue on black is hard to read, as is green on white)
01:03:40 [fantasai]
leaverou: Woudn't this be ...
01:03:51 [fantasai]
leaverou: You can have bitmaps inside an SVG
01:03:57 [fantasai]
leaverou: Seems like it would interact badly
01:04:04 [fantasai]
dino: Could have a UA rule that sets it back to none
01:04:15 [fantasai]
dino: We've mostly experimented with Mail. Haven't tried to apply to the Web yet
01:04:39 [fantasai]
heycam: What if page wants to try handling it themselves?
01:04:54 [fantasai]
dino: This is a complicated topic, wanted to deal later, but let's talk about it now
01:05:13 [fantasai]
dino: If the browser is being told to apply dark mode automatically, what should we do?
01:05:24 [fantasai]
dino: If there's a media query that allows the page to detect if the user wants dark mod
01:05:30 [fantasai]
dino: Should the browser automatically flip th epage or not?
01:05:55 [fantasai]
dino: It would be very odd for MQ to trigger behavior change
01:05:59 [fantasai]
fantasai: We do have precedence
01:06:22 [fantasai]
frremy: On Windows 8, if you resize an application to be in phone mode, we would scale the website down, except if it used @viewport
01:06:38 [fantasai]
florian: That's not a media query. @viewport is *supposed* to have an effect on the page
01:06:53 [fantasai]
florian: Opera did that for projection media type.
01:06:57 [tantek]
similarly with full screen
01:07:08 [fantasai]
dbaron: Been done before, but not a good idea. Poor API
01:07:18 [fantasai]
dino: API I think that would provide it is also bad
01:07:24 [fantasai]
dino: it's <meta viewport>
01:07:31 [fantasai]
01:07:38 [fantasai]
florian: MS has an alternative to that, it's a property
01:07:50 [fantasai]
florian: can say "for this subtree, I've done it"
01:07:56 [fantasai]
emilio: Could say color-filter: noe
01:08:10 [fantasai]
florian: *If* the browser is doing this with color-filter and not some other mechanism
01:08:27 [fantasai]
dino: So you'd set that property on the body
01:08:39 [fantasai]
fantasai: Can we use html , not body?
01:08:48 [fantasai]
heycam: Is this about high-contrast?
01:08:50 [fantasai]
Rossen: yes
01:09:06 [fantasai]
dino: The only thing I dn't like about that is it forces you to resolve style before you decide whta you've got to do
01:09:14 [fantasai]
dino: meta tag doesn't have that problem
01:09:20 [fantasai]
dino: but then can't exclude part of the page
01:09:30 [fantasai]
Rossen: In practice, ppl tend to opt out of things like menus and ...
01:09:45 [fantasai]
dino: So that's actually main reason we don't want to do it automatically
01:09:49 [tantek]
what about where web devs have matched color related values with colors in images?
01:09:56 [fantasai]
dino: form-controls look weird
01:10:00 [fantasai]
s/form/built-in form/
01:10:22 [fantasai]
dino: but ppl don't use built-in form controls that much, they use boostrap etc.
01:10:27 [tantek]
Tab: WAT
01:10:36 [fantasai]
TabAtkins: Uhhh,, no???
01:10:51 [fantasai]
TabAtkins: The whole point is that built-in form controls work properly on.e.g. apple watch
01:11:15 [fantasai]
florian: We've discussed similar model for auto-adjustment of colors for printing
01:11:36 [fantasai]
florian: Where authro might want the browser to not make changes to the colors, because they already turned on colors and stuff
01:11:58 [fantasai]
florian: “Browser has magic adjustments. I want to opt out on this part of the page.”
01:12:16 [fantasai]
dino: It worries me a bit that including any style sheet could override this
01:12:38 [fantasai]
florian: meta tag seems the wrong layer to do it
01:12:48 [fantasai]
fantasai: That's true of viewport meta in general. SHould be in style sheet
01:12:58 [fantasai]
dino: Suppose you include your favorite UI library. It supports dark mode.
01:13:09 [fantasai]
dino: Should it put "I support dark mode" property on the html?
01:13:25 [fantasai]
frremy: No, you set the property on the elements in your framework. Not on the whole page
01:13:30 [fantasai]
dino: So bounding to a tree
01:13:54 [fantasai]
florian: It's just a property. You *can* use it on <html>, but could apply only to components.
01:14:29 [fantasai]
tantek: Did you talk about use case of matching colors in a JPEG?
01:14:38 [fantasai]
dino: Could just set the filter to none
01:14:44 [fantasai]
florian: Could use property to express two different things
01:15:05 [fantasai]
florian: “Dear Browser, don't do it, because I've done it myself.” vs “Dear Browser, don't do it, because here it's not appropriate”
01:15:27 [fantasai]
dino: So property is nice there, can say "Don't use on this color of red, because it has to match the red of these shoes" but rest of page is fine
01:15:51 [dino]
dino has joined #css
01:15:57 [fantasai]
heycam: Are we considering possibility of meechanisms other than color-filter() being set to handle these cases?
01:16:09 [fantasai]
heycam: Because if not, then maybe we don't need a separate filter
01:16:32 [fantasai]
dino: So far color-filter has been enough for us, but we've only been looking at mail
01:16:44 [fantasai]
dino: Haven't tried browsing the web to see what happens on random content
01:16:52 [fantasai]
astearns: It's the exceptions I'm worried about
01:17:00 [fantasai]
astearns: In mail, generally the bg is set on the canvas
01:17:09 [fantasai]
astearns: but on web pages could be arbitrary div
01:17:17 [fantasai]
dino: We found a lot of messages that don't set a bgcolor
01:17:22 [astearns]
01:17:23 [fantasai]
dino: but content sets bg the white
01:17:44 [fantasai]
dino: that's why we couldn't layer mail over a gray application background
01:17:55 [fantasai]
dino: had to put some smarts into analyzing the page
01:18:12 [fantasai]
dino: If we can detect that the page wants a white background, because it's set some things to white...
01:18:17 [fantasai]
dino: But so far color-filter has been enough
01:18:22 [fantasai]
dino: Good news is implementation is quite easy
01:18:35 [fantasai]
dino: Just at the point of where you're asking for the color value
01:18:42 [fantasai]
dino: It's great, makes it easy to be a render-time effect
01:18:45 [fantasai]
dino: math is pretty easy
01:18:49 [fantasai]
dino: can also cache the values
01:18:51 [myles]
myles has joined #css
01:19:03 [fantasai]
heycam: Some properties to control the color space that we interpolate in
01:19:09 [fantasai]
heycam: for animations and gradients
01:19:17 [fantasai]
heycam: That would happen with origianl color values before transofrming them?
01:19:32 [fantasai]
dino: Don't think there's case wher eyou d'want to change colors *and* change interpolation space
01:19:47 [fantasai]
dino: No idea why red-blue gradient, why if you invert it you'd want it to be in linear-rg
01:19:50 [fantasai]
01:20:04 [fantasai]
dino: If you ask for gradient colors, you get filtered colors, and then interpolate like gradient said to
01:20:09 [astearns]
s/wher eyou d'want/where you'd want/
01:20:14 [fantasai]
dino: Of course could put property with a media query if you wanted
01:20:22 [fantasai]
chris: So this modification happens last, just before rendering
01:20:26 [fantasai]
dino: Right.
01:20:34 [fantasai]
dino: Computed style is still the original color
01:20:42 [fantasai]
dino: While we're talkign about this, maybe talk about MQ
01:20:53 [fantasai]
dino: Our current one that we use internally, is prefers-dark-interface
01:20:59 [fantasai]
dino: Think it's more prefers-dark-content
01:21:05 [fantasai]
TabAtkins: prefers-dark
01:21:15 [fantasai]
dino: Lines up with prefers-*
01:21:23 [fantasai]
dino: User is requesting that they prefer this type of content
01:21:33 [fantasai]
florian: I'm supportive of prefers-type MQs,
01:21:40 [fantasai]
florian: Question is what is the other options?
01:21:54 [fantasai]
florian: Can you express no preference in addition to expressing preference for light?
01:22:20 [fantasai]
01:22:29 [fantasai]
dino: prefers-dark: light seems weird
01:22:30 [TabAtkins]
`color-pref: goth | prep;`
01:22:43 [fantasai]
fantasai: Just rename it to something else, e.g. prefers-colors: light | dark | any
01:22:45 [fantasai]
01:23:05 [fantasai]
heycam: Say you have a site which is already dark, like DaringFireball, and you turn on the browser option "Please automatically make this dark for me"?
01:23:12 [fantasai]
heycam: Are there options to keep it dark?
01:23:31 [fantasai]
dino: I think we need to be careful to say that "Please make this dark for me" can't be a universial hammer
01:23:35 [fantasai]
dino: It's hard to tell
01:23:49 [fantasai]
dino: E.g. we try with scrollbarls, to try to guess whether page is light or dark and make scrollbars match
01:24:00 [fantasai]
dino: Because DaringFireball sets bgcolor which is neither white nor back
01:24:06 [fantasai]
dino: we probably wouldn't change anything
01:24:17 [fantasai]
heycam: Is that a case where the author should indicate they already support dark?
01:24:28 [fantasai]
dino: Question is, does anyone want to force bright?
01:24:45 [fantasai]
dino: If you set bgcolor to hot pink, might say that you support dark and they'll get hot pink anyway
01:24:53 [fantasai]
dino: Also for mail you'd get hot pink
01:24:55 [fantasai]
dino: ...
01:25:08 [fantasai]
florian: Do ppl anticipate forced-darkening of pages?
01:25:17 [fantasai]
dino: There are a lot of users who seem to want that
01:25:31 [fantasai]
dino: They've set up shortcuts to invert the page
01:25:54 [fantasai]
dino: They toggle this on and off as they browse different pages
01:26:03 [fantasai]
florian: If you have prefers-dark and forced-dark on at the same time, what does that mean?
01:26:43 [fantasai]
dino: ...
01:26:52 [fantasai]
dino: If the page says 'I did dark mode' then we wouldn't force it
01:27:02 [fantasai]
dbaron: Did some experiments with this sort of color inversion maybe 8-10 yrs ago
01:27:27 [fantasai]
dbaron: One problem I ran into in the end, and dino's example with mail was showing it, is that you can't actually do a good job of preserving both satuaration and lightness contrast at the same time
01:27:37 [fantasai]
dbaron: because the contributions of red green and blue channels to luminance is very very different
01:27:56 [fantasai]
dbaron: In the difference of white vs black, the luminance perception of that is 70% green 23% red and 7% blue or something like that
01:28:10 [fantasai]
dbaron: which means that fully saturated blue is quite readable against white, but unreadable against black
01:28:24 [fantasai]
dbaron: and fullysaturated green is quite readable against black and unreadable against white
01:28:45 [fantasai]
dino: Which is why my third column was there, it bumped dark blues to lighter blues... blends a light-ish blue over every color ...
01:28:58 [fantasai]
astearns: I expect as your designer looks at more and more pages, they would find additional tweaks they'd want to make to the filter
01:29:05 [Zakim]
Zakim has left #css
01:29:07 [fantasai]
astearns: I can see the usefulness for this feature for browser UI
01:29:22 [fantasai]
astearns: as something you can toggle, and you can flip it back if it isn't working
01:29:25 [fantasai]
astearns: from a design perspective
01:29:29 [Zakim]
Zakim has joined #css
01:29:38 [fantasai]
astearns: I can't imagine someone wanting to tweak their colors with such a blunt hammer
01:29:59 [chris]
for sTGB it is 21.26% red 71.52% green 7.22% blue
01:30:09 [fantasai]
astearns: Create a light them and a dark theme as a designer, never going to be a filter that'll get you from one to the other
01:30:13 [chris]
01:30:17 [fantasai]
astearns: So from UA perspective I see the usefulness
01:30:23 [fantasai]
astearns: But from author perspective I can't see the use case
01:30:40 [chris]
zakim, this meeting spans midnight
01:30:40 [Zakim]
I don't understand 'this meeting spans midnight', chris
01:30:51 [chris]
rrsagent, this meeting spans midnight
01:31:05 [astearns]
s/see the use case/see the use case for the color-filter property/
01:31:11 [fantasai]
Rossen: Thank you for demos and explanations, and that's a wrap for this issue.
01:31:20 [fantasai]
Topic: Images Level 3
01:31:34 [heycam]
ScribeNick: heycam
01:32:04 [fantasai]
01:32:27 [heycam]
leaverou: we were trying to define interoplation between crossfades more reasonably with Elika yesterday
01:32:38 [fantasai]
01:32:41 [heycam]
... when we're interpolating two cross fades with same images in a different order, A B , then B A
01:32:50 [heycam]
... it ends up creating a cross fade of the cross fade
01:32:59 [heycam]
... this comes up a lot, this interpolation happens when you're reversing a transition
01:33:23 [heycam]
... so fantasai suggested when adding a rule, when the images is the same and the order is different, we flip the order and change the percentages to account for it
01:33:27 [heycam]
... so 100% minus what it was
01:33:38 [heycam]
... is that OK? since it's CR we should check
01:35:00 [heycam]
fantasai: the use case for getting this to work simply is that when you're doing transitions between one image and another, when you interrupt that transition, you're half way between
01:35:07 [heycam]
... so you want to interpolate between a crossfade and a start point
01:35:17 [heycam]
... your computed value gets more and more complex
01:35:34 [heycam]
dbaron: is this the only interoplation type that has this problem?
01:35:39 [heycam]
emilio: I suspect it can happen with transform as well
01:35:42 [heycam]
dbaron: yes
01:35:44 [heycam]
birtles: with calc
01:35:58 [heycam]
ericwilligers: with transform didn't we define ...
01:36:02 [heycam]
TabAtkins: the interpolate() function
01:36:12 [heycam]
dbaron: so transform can do the same thing with interpolate() nesting in the same way
01:36:17 [heycam]
fantasai: we should probably do the same thing for transform then
01:36:28 [heycam]
ericwilligers: does interpolate() make cross-fade() redundant?
01:36:37 [heycam]
leaverou: it only helps you get the intermediate values
01:36:50 [heycam]
fantasai: there are use cases for cross fade where the author explicitly wants to fade between two things
01:36:58 [heycam]
... and there are differnet ways of interpolating images, cross fade is one of them
01:37:40 [heycam]
fantasai: the proposed resolution is that interpolating crossfade or the interpolate function, where the end point and start point have opposite order of arguments, you swap the order, so you don't nest the interpolating function
01:37:57 [heycam]
xidorn: shouldn't we just merge things when one side is crossfade A to B, and the other side is A or B?
01:38:01 [heycam]
fantasai: that's the next question
01:38:05 [heycam]
dbaron: what stage is this happening?
01:38:08 [heycam]
fantasai: computed value?
01:38:19 [heycam]
dbaron: so part of the process of computing the value of a nested cross fade is to un-nest
01:38:30 [heycam]
fantasai: no, when you're computing the mid point for
01:38:35 [heycam]
dbaron: so you're changing the interpolation rules
01:38:45 [heycam]
fantasai: yes
01:38:58 [heycam]
Rossen: does that sounds reasonable to people?
01:39:07 [heycam]
dbaron: yes, if you make it consistently apply to other places where this problem comes up
01:39:11 [heycam]
TabAtkins: yes
01:39:27 [heycam]
Rossen: any objections to this? do we need to add a note for the general interpolate function to be added as well?
01:40:46 [heycam]
birtles: I misunderstood
01:40:57 [heycam]
... I thought this was just about computed value simplification of nested cross-fade
01:41:01 [heycam]
ericwilligers: [writes examples on white board]
01:43:03 [heycam]
birtles: I'm just wondering why we're adding rules to interpolation. would the alternative be to say this is how nested crossfades are simplified at computed value time?
01:43:10 [heycam]
... then you don't need to do anything particular for interpolation
01:43:18 [heycam]
fantasai: we could do that
01:43:21 [heycam]
leaverou: I'd be fine with that
01:44:09 [heycam]
dino: cross-fade(A, B, 50%) is not the same as cross-fade(B, A, 50%)
01:44:19 [heycam]
... it's 50% of src-overing the second on top of the first
01:44:30 [heycam]
fantasai: and with transparency?
01:44:41 [heycam]
dino: you can tell the difference between B over A 50% and A over B 50%, yes
01:44:49 [heycam]
ericwilligers: would you advocate nested cross-fades()?
01:44:53 [heycam]
dino: I'd advocate not interpolating
01:44:57 [heycam]
fantasai: I don't think that's a good solution
01:45:04 [heycam]
dino: if we're going to do it, then nested cross-fade(), maybe
01:45:12 [heycam]
leaverou: nested cross-fades() should be supported anyway
01:45:24 [heycam]
dino: so, yes, nested cross-fades() would be my preferred solution
01:45:37 [heycam]
leaverou: I think it's Safari and Chrome at the moment
01:45:40 [heycam]
birtles: pre-fork, so one implementation
01:47:07 [heycam]
TabAtkins: dino your point before about A B 50% and B A 50% being different is wrong, since it's a dissolve
01:47:32 [heycam]
... dissolve op rather than src-over op
01:47:43 [heycam]
... since that's the correct way to fade between two images with potential transparencies
01:48:36 [heycam]
Rossen: do we need a whiteboarding breakout for this?
01:49:23 [heycam]
leaverou: if reversing the order does produce the same image, what's the argument against it
01:49:29 [heycam]
... if nobody has any then why do we need to break out
01:50:12 [fantasai]
01:50:19 [fantasai]
01:51:32 [heycam]
TabAtkins: only options are (a) do nothing, allowing nesting, (b) accept these rules for interpolation simplification, or (b) accept these rules for computed value simplification and allow interpolation to fall out
01:51:35 [heycam]
emilio: why (c)?
01:51:47 [heycam]
leaverou: then it also allows us to simplify computed values returned
01:51:53 [heycam]
emilio: I thought the point was nested cross fade is hard
01:52:08 [heycam]
TabAtkins: it's not that it's hard, but in common cases, like repeatedly interrupting a transition, it resutls in a stack of cross-fade()s
01:52:11 [heycam]
... when you could simplify it down
01:52:21 [heycam]
emilio: the difference between (b) and (c) is not observable
01:52:36 [heycam]
TabAtkins: yes it is
01:52:39 [heycam]
emilio: I think I prefer (b)
01:52:43 [heycam]
leaverou: [shows demo]
01:53:43 [heycam]
emilio: if you want to simplify what you interpolate, to avoid growing stacks of cross-fades(), you do it there
01:53:49 [heycam]
... but you also need to do it at computed values
01:54:00 [heycam]
... because the author might have specified a nested cross-fade()
01:54:08 [heycam]
fantasai: the interoplated intermediate value must be a computed value
01:54:18 [TabAtkins]
Note that if we *do* finally do the "any number of images" extension, then we can simplify *all* nested cross-fades, in all situations.
01:54:31 [heycam]
leaverou: if I'm understanding emilio correctly, you don't want to create this thing if you're going to simplify it anyway
01:54:45 [heycam]
... if you're already going to simplify serialization of a specified (and computed) value
01:54:53 [heycam]
emilio: it complicates the code
01:55:08 [heycam]
birtles: I wonder if you're going to need to simplify it first anyway, in order to interpolate potentially nested inputs that you get
01:55:13 [heycam]
ericwilligers: yes
01:55:28 [heycam]
birtles: also will need to do it for addition, assuming that makes sense
01:55:42 [heycam]
leaverou: ideally it would be nice if cross-fade() accepted any number of arguments, and flatten them down to a single one
01:55:48 [heycam]
ericwilligers: then you've got more computations
01:55:57 [heycam]
01:56:12 [heycam]
leaverou: if you could collapse the tree down to a flat cross fade list of values, it's simpler to apply
01:56:21 [heycam]
TabAtkins: since dissolve commutes, you can collapse all cross fades
01:56:25 [heycam]
dino: plus commutes, dissolve doesn't
01:56:40 [heycam]
dino: what I got wrong is I'm src-overing not plusing
01:56:56 [heycam]
TabAtkins: plusing an appropriate dissolved image commutes, such that you can take nested cross fades and flatten it to a list of images that plus together
01:57:06 [heycam]
leaverou: should we just do that, allow cross-fade() to take a list of arguments
01:57:31 [heycam]
birtles: I think it's nicer from an authoring point of view too
01:57:55 [birtles]
that is, parsing the result of getComputedStyle is easier if you don't need to handle nested cross-fade functions
01:59:25 [heycam]
leaverou: another issue, if you're interpolating between A and cross-fade(A, ...), with the current rules you'll get a nested cross-fade()
01:59:40 [heycam]
... we could define that the A gets promoted to 100% cross-fade, and just interpolate percentage
01:59:49 [leaverou]
02:00:30 [heycam]
fantasai: I think the proposal one this one is you get a single cross-fade() with A and B with arguments and the appropriate percentage
02:00:40 [heycam]
leaverou: we can, but if we're collapsing trees of cross-fade()s, it's less important
02:00:47 [heycam]
fantasai: collapsing trees is different from merging
02:00:55 [heycam]
TabAtkins: depends how we collapse
02:01:28 [heycam]
dino: [looking at the issue] wouldn't it be x is between 0 and p, not p and 100?
02:01:38 [heycam]
leaverou: you're interpolating between full A and the cross-fade
02:01:45 [heycam]
... you want it to start at 100
02:01:52 [heycam]
dbaron: I think we should try to resolve both at the same tim
02:01:55 [heycam]
02:02:07 [heycam]
... where the simplification happens, turning into multi arg cross-fade(), applies to both
02:02:26 [heycam]
myles: the proposal is change the behavior because it makes it easier to compute?
02:02:40 [heycam]
leaverou: this way you wouldn't need to interpolate to make a new cross-fade() at all
02:03:16 [heycam]
myles: there is a difference between having a tree of cross fades and not having a tree
02:03:21 [heycam]
TabAtkins: nobody has trees yet
02:03:25 [heycam]
... we're trying to avoid that now
02:03:42 [heycam]
TabAtkins: overall proposal is, avoid all trees of cross-fades, in all situations, by making it accept more than two arguments, just dissolve and plus throughout those
02:03:46 [fantasai]
fantasai explains that interpolating cross-fade(x% A, B) and cross-fade(y% A, B) results in cross-fade(z% A, B), not a tree of cross-fades()s
02:04:04 [heycam]
... and make nested cross-fade() invalid, and make interpolations between them build the appropriate multi-arg value
02:04:46 [fantasai]
this issue about treating interpolation of A & cross-fade(y% A, B) and cross-fade(100% A, B) & cross-fade(y% A, B) the same way
02:04:47 [dbaron]
q+ to comment on (a) nesting through other functions and (b) validity of percentages that add to more than 100%
02:05:59 [heycam]
[whiteboard discussion of particular interpolations]
02:06:42 [heycam]
leaverou: I still think nested cross-fades() should be valid, since they could come from variables
02:07:08 [heycam]
myles: if the goal is to avoid avoiding trees, by making a list that has all the nodes of the tree, I don't see why that's better
02:07:17 [heycam]
TabAtkins: you don't need to generate all the intermediate images
02:07:22 [heycam]
myles: is there a behaviour change?
02:07:23 [heycam]
TabAtkins: no
02:07:31 [heycam]
myles: then we should just say "as if", a browser optimization
02:08:02 [heycam]
myles: so we're talking about computed values
02:08:27 [heycam]
florian: do we disallow in specified value?
02:08:35 [heycam]
TabAtkins: before we decide on that, let's look at the core thing
02:08:46 [heycam]
... multi-arg cross-fade(), does it sound reasonable
02:08:55 [heycam]
dino: and you must provide %s up to the last one?
02:09:00 [heycam]
... allowed to go over 100%?
02:09:06 [heycam]
TabAtkins: yes [for first], and no.
02:09:24 [heycam]
TabAtkins: if the percentages add up to over a 100%, you sum them and normalize to 100%
02:09:28 [heycam]
... then the last one gets zero
02:09:34 [heycam]
myles: every time gets a percentage
02:09:36 [heycam]
TabAtkins: except the last
02:09:42 [heycam]
... last one gets what's left over
02:09:51 [heycam]
dino: complete error if you did (A 10%, B, C)?
02:09:53 [heycam]
TabAtkins: syntax error
02:10:16 [innovati]
innovati has joined #css
02:10:40 [heycam]
myles: is the purpose of this that humans will write this? or just to make the getCS output smaller?
02:11:00 [heycam]
TabAtkins: so clearly we want this for interpolation
02:11:23 [fantasai]
heycam: Simplifying trees down to one level is same as flat list
02:11:38 [fantasai]
heycam: Want to collapse list to minimum number of items
02:11:47 [fantasai]
TabAtkins: If the goal is to avoid explosion...
02:12:09 [heycam]
myles: if this is for humans to use, it's useful
02:12:14 [heycam]
ericwilligers: negative %s allowed?
02:12:21 [heycam]
TabAtkins: no, individual %s above 100% should be disallowed
02:12:28 [fantasai]
02:12:36 [fantasai]
TabAtkins: But we can't syntacitcally restrict the sum
02:12:42 [heycam]
birtles: I'm not 100% sure about the normalization part
02:12:45 [heycam]
... the syntax I like
02:12:54 [heycam]
ericwilligers: not sure about normalization when you have interpolations between lists
02:13:29 [heycam]
birtles: I was thinking, once the bucket's full, the overflow could be dropped
02:13:42 [heycam]
myles: should make it possible for the last one to have a %
02:13:48 [heycam]
florian: to use them as 'fr's?
02:13:54 [heycam]
leaverou: right now, cross-fade() percentage is optional
02:13:58 [heycam]
... probably it should retain this
02:14:05 [heycam]
... right now (A, B), the 50% is implied
02:14:15 [heycam]
... (A 20%, B, C) should make sense
02:14:20 [heycam]
shans: distribute the rest
02:14:22 [heycam]
leaverou: yes
02:14:37 [heycam]
myles: allow the last percentage to be specified, then just weight them
02:14:51 [astearns]
02:15:04 [heycam]
fantasai: if you have (A 20%, C 20%, C 20%)
02:15:15 [heycam]
... you could simply transparent black to take the slack
02:15:29 [heycam]
florian: rather than normalizing to 100%?
02:15:31 [heycam]
fantasai: if you're under
02:15:51 [heycam]
shans: one problem with diff behaviours on either side of 100% gets you non-linearities, bad for animation
02:15:56 [heycam]
ericwilligers: like opacity:1
02:16:16 [astearns]
ack dbaron
02:16:16 [Zakim]
dbaron, you wanted to comment on (a) nesting through other functions and (b) validity of percentages that add to more than 100%
02:16:55 [heycam]
TabAtkins: the suggest grammar is, cross-fade() takes one or more args, each has an optional %
02:16:59 [heycam]
... we'll work out what missing %s mean
02:17:04 [heycam]
Rossen: any objections to that?
02:17:14 [heycam]
RESOLVED: cross-fade() takes one or more args, each has an optional %
02:17:23 [heycam]
leaverou: next, collapsing trees of cross-fade()s
02:17:32 [heycam]
... it's much easier to define interpolatino that way
02:17:36 [heycam]
... for authors reading it back
02:17:47 [heycam]
... don't know why we wouldn't collapse it down, esp given it's commutative
02:18:08 [heycam]
emilio: can we disallow nested cross-fade() in specified values?
02:18:16 [heycam]
TabAtkins: no for the same reason you allow nested calc()s
02:18:20 [heycam]
leaverou: with variables
02:18:52 [heycam]
dbaron: two other points
02:18:58 [Rossen]
02:19:00 [heycam]
... there are going to be other image-ish functions
02:19:13 [heycam]
... cross-fade() one of these other functions continaing a cross-fade() will be a reasonable thing
02:19:40 [heycam]
... I think the other piece is that I think one of the things that results from disallowing it, everyone has to go and implement that, then later we'll allow it, which is more work
02:19:44 [heycam]
... so we should just allow it now
02:19:47 [heycam]
TabAtkins: agreed
02:19:55 [heycam]
... specified values should allow it. interpolated values collapse to a single value
02:19:59 [heycam]
... interpolated values, don't care?
02:20:02 [heycam]
leaverou: I would collapse
02:20:05 [heycam]
birtles: collapse
02:20:09 [heycam]
fantasai: I thin kso
02:20:39 [heycam]
s/thin kso/think so/
02:20:58 [heycam]
florian: both kinds of smooshing down, flattening tree, and merging items in the list?
02:21:03 [heycam]
leaverou: they are separate issues but I support both
02:21:30 [heycam]
myles: so it's not just a simple substitution, there are formulas to calcalate the %s
02:21:41 [heycam]
TabAtkins: yes. it's just mulitplican tho
02:22:27 [heycam]
RESOLVED: At computed value time, simplify directly nested cross-fade()s into a single cross-fade()
02:22:33 [heycam]
xidorn: that means the flattened value is the canonical form of that
02:22:36 [heycam]
TabAtkins: yes
02:22:44 [heycam]
leaverou: now dropping duplicated images
02:22:50 [heycam]
TabAtkins: if you have multiple args which are the same image
02:23:00 [heycam]
... should the canonical form automatically collapse those together and add their percentage
02:23:13 [heycam]
leaverou: do we have an algorithm for same image?
02:23:21 [heycam]
fantasai: the compued value of the <url> is the absolute URL
02:23:47 [heycam]
Rossen: the reason for simplifying is avoiding growth of the values
02:24:32 [heycam]
leaverou: we should not only combine the duplicates but also sort them
02:24:48 [heycam]
fantasai: I think we need to simplify this, to avoid growing lists
02:24:54 [heycam]
... we can do it very simply
02:25:59 [heycam]
emilio: how do you define sorting images?
02:26:19 [heycam]
myles: if you didn't want this, didn't want to collapse -- internally you want to
02:26:55 [Rossen]
heycam: are the cases where we want avoid this?
02:27:01 [heycam]
fantasai: I don't think so
02:27:09 [heycam]
... it's going to be the same when you collapse it all down
02:27:17 [heycam]
fantasai: notion of equality we want is "computed values are the same"
02:27:46 [heycam]
frremy: with gradients, with px and %s ....
02:27:49 [heycam]
fantasai: that's not computed value
02:27:52 [heycam]
... that's used value
02:29:03 [heycam]
RESOLVED: At computed value time we collapse same <image> values in cross-fade()s and adding their percentages
02:29:27 [heycam]
leaverou: sorting
02:29:53 [heycam]
fantasai: you don't want computed value of cross-fade() where you randomly swap the order
02:29:59 [heycam]
fantasai: re-sort into the target order and go from there?
02:30:04 [heycam]
... so don't sort the computed value
02:30:12 [heycam]
... but when interpolating, you re-sort the start point into the end point order
02:30:23 [heycam]
myles: that's cool then CSS doesn't have to define order
02:32:28 [heycam]
so no sorting occurs, for interpolation it falls out of the simplification process
02:32:36 [TabAtkins]
When interpolating be3tween A and B, you just cross-fade(A,B) then collapse; whatever that results in is the answer.
02:32:59 [fantasai]
Topic: Deferring gradient interpolation to L4
02:33:00 [Rossen]
Topic: Defer gradient interpolation to L4?
02:33:31 [fantasai]
i/myles/fantasai: order for interpolations falls out of cross-fade(start, end) and flattening/
02:33:39 [heycam]
Rossen: anyone objection to deferring gradient interpolation to L4, to move L3 quicker?
02:33:46 [heycam]
RESOLVED: Gradient interpolation is moved to Images L4
02:34:00 [heycam]
fantasai: we should clarify the spec to say we do abrupt transitions
02:34:09 [heycam]
... (and not cross-fade)
02:34:39 [dbaron]
leaverou: people can still wrap in cross-fade to force interpolation by cross-fade?
02:34:43 [dbaron]
TabAtkins: fantasai: yes
02:35:40 [heycam]
Topic: Deferring cross-fade() to L4?
02:35:42 [heycam]
Rossen: nobody implements it
02:35:46 [heycam]
... Images L3 is in a good shape
02:35:49 [heycam]
TabAtkins: let's do that
02:36:08 [heycam]
RESOLVED: cross-fade() is moved to Images L4
02:36:34 [leaverou]
02:37:56 [leaverou]
Gamma issue:
02:38:13 [heycam]
<br type="lunch" until="1:36pm">
03:11:39 [heycam]
heycam has joined #css
03:51:49 [fantasai]
Topic: Does all reset custom properties?
03:51:52 [fantasai]
03:51:52 [github-bot]
fantasai, Sorry, I don't understand that command. Try 'help'.
03:52:02 [fantasai]
03:52:36 [fantasai]
TabAtkins: Two questions to this issue. First is does all reset custom properties? I say yes
03:53:05 [fantasai]
TabAtkins: second, should we have something that does? I say yes, Emilio says no
03:53:10 [fantasai]
emilio: I don't remember why...
03:53:28 [fantasai]
astearns: Proposed that custom properties don't get reset by all. Any objections?
03:53:37 [fantasai]
dbaron: Have ppl checked implementations?
03:53:51 [fantasai]
frremy: Edge doesn't
03:54:07 [fantasai]
xidorn: In Gecko it doesn't reset custom properties either
03:54:22 [fantasai]
emilio: We have an invariant that only have one longhand in a given declaration block
03:54:45 [fantasai]
emilio: We only store longhands, we don't store shorthands
03:55:02 [fantasai]
emilio: That's why it doesn't reset custom properties
03:55:09 [fantasai]
emilio: We'd need to rewrite everything.
03:55:13 [myles]
myles has joined #css
03:55:24 [fantasai]
TabAtkins: Chrome also does not reset custom properties
03:55:30 [fantasai]
RESOLVED: all shorthand does not reset custom properties
03:55:33 [TabAtkins]
03:55:43 [frremy]
frremy has joined #css
03:55:45 [fantasai]
Next question, should something reset all custom properties
03:56:21 [fantasai]
emilio: custom properties are inherited, so if you had a -- property that resets everything, an dit would inhherit, so it resets everything all the way down the subtree?
03:56:27 [fantasai]
fantasai: It would have to be a non-custom property
03:56:52 [heycam]
heycam has joined #css
03:57:01 [fantasai]
leaverou: What's the usecase?
03:57:31 [fantasai]
TabAtkins: If you have some component, you want to make sure you don't get the outer page inheriting stuff into it that disrupts your stuff because of name clashes
03:57:38 [fantasai]
03:57:41 [fantasai]
TabAtkins: So it would be a shorthand
03:57:56 [fantasai]
s/.../emilio: So it would be a longhand/
03:58:16 [fantasai]
fantasai: It would be a longhand from engine's perpsective, has effect of reseting the prperties, so it looks like a shorthand to the author
03:58:33 [fantasai]
emilio: Reason why it's hard is, it's hard to know when do you need to reset it. and hard to make it do the right thing
03:58:41 [fantasai]
emilio: When do you check the value of this property?
03:58:52 [fantasai]
emilio: Presumably you want it to work like all property
03:58:56 [fantasai]
emilio: --: reset;
03:59:01 [fantasai]
emilio: vs --: foo;
03:59:27 [fantasai]
emilio: What properties is it resetting, we don't know what the properties are that we're resetting
03:59:38 [fantasai]
emilio: until we've cascaded/inherited the custom props
03:59:59 [fantasai]
TabAtkins: ... I understand the problem now
04:00:21 [fantasai]
TabAtkins: If you say --foo: red; --: initial; --bar: blue;
04:00:38 [fantasai]
TabAtkins: The --foo needs to be reset to initial, but --bar needs to still be blue
04:01:04 [fantasai]
TabAtkins: That's problematic because you have no idea that -- needs to expand into --foo until you see that --foo is declared on or inherited into that element
04:01:19 [fantasai]
frremy: In Edge we have a registry of all properties, which need to be handled before ...
04:01:35 [fantasai]
TabAtkins: So you would expand it to all the properties on th epage?
04:01:44 [fantasai]
emilio: That's not the point of the feature
04:01:59 [fantasai]
emilio: You can't expand it at parse time
04:02:04 [fantasai]
frremy: You don't expand at parse time
04:02:10 [fantasai]
xidorn: ...
04:02:27 [fantasai]
emilio: Also, magic of "every prop htat has aappeared on the page so far" is really bad
04:02:33 [fantasai]
frremy: Not proposing that
04:02:52 [xidorn]
s/.../Expanding at parse time is how shorthand is supposed to work/
04:03:05 [fantasai]
TabAtkins: If you do it as that type of prescan, then you can do this. Otherwise you can't
04:03:18 [fantasai]
emilio: You can't implement as a shorthand, because you don't know for serialization what it expands to
04:03:41 [fantasai]
emilio: You have to treate it as a longhand, but then you need to look at that property before you look for custom properties
04:03:52 [fantasai]
emilio: Let's say you specify this as a longhand property, then you can do what eric said
04:04:15 [fantasai]
emilio: But you needto look at the value of this property before computing the custom properties.. which you need to compute the values of the rest of the poperties (in case they're used)
04:04:24 [fantasai]
emilio: Right now we have different phases
04:04:31 [fantasai]
emilio: This would convert it from 2 to 3 phases.
04:04:36 [fantasai]
emilio: First figure out magic property's computed value
04:04:42 [fantasai]
emilio: Then figure out custom properties
04:04:46 [fantasai]
emilio: then figure out the rest
04:04:50 [fantasai]
emilio: which is kindof annoying
04:05:19 [fantasai]
04:05:28 [fantasai]
frremy: ...
04:05:35 [fantasai]
emilio: We don't want a global index of custom properties
04:05:55 [fantasai]
xidorn: Maybe we can have a longhand property which doesn't affect element itself, but cuts inheritance to its children, which doesn't have this problem
04:06:23 [fantasai]
TabAtkins: This would change the inherited value of your custom properties on the children to the value of --
04:06:49 [myles]
myles has joined #css
04:06:56 [fantasai]
TabAtkins: But then can't both block inheirtance from parent and set specific custom props for inehritance to your children
04:07:11 [fantasai]
TabAtkins: on the same element
04:07:32 [fantasai]
TabAtkins: Possibility is to make -- take a list of properties to *not* reset
04:07:43 [TabAtkins]
Possibility is to make -- take a list of custom properties to *not* reset, and then it alters the way that all unspecified custom properties inherit to the element's children.
04:07:44 [fantasai]
TabAtkins: And then it alters the way that all unspecified custom properties inherit to the element's children
04:07:51 [fantasai]
frremy: I don't think we like this
04:08:03 [fantasai]
TabAtkins: I think it's the only way to make -- work on a single element without being a shorthand
04:08:19 [fantasai]
astearns: You would be duplicating the properites that you want to declare on that element
04:08:22 [fantasai]
TabAtkins: Correct.
04:08:54 [fantasai]
fantasai: Think that this means we should not add the feature. Nobody's been clamoring for it anyway.
04:09:01 [fantasai]
RESOLVED: -- is reserved
04:09:15 [fantasai]
RESOLVED: Don't add shorthand for custom props
04:09:22 [fantasai]
Topic: env()
04:09:59 [fantasai]
Topic: process for adding env() variables
04:10:01 [fantasai]
04:10:09 [fantasai]
TabAtkins: I agree.
04:10:25 [fantasai]
astearns: Currently spec says “
04:10:25 [fantasai]
user agents may define additional undocumented environment variables
04:10:26 [fantasai]
04:10:51 [fantasai]
TabAtkins: I think Apple agrees with proposal, too
04:11:09 [fantasai]
dino: When original discussion happened, there was some mumblings that some platforms might want to expose system colors specific to that platform in some way
04:11:13 [fantasai]
dino: But I don't know if anyone still believes that
04:11:47 [fantasai]
RESOLVED: Accept proposal in the issue.
04:11:57 [fantasai]
“UA vendors MUST NOT expose built-in env() features to the web without going through that process”
04:12:12 [fantasai]
Topic: Accept safe-area-inset*
04:12:27 [fantasai]
04:12:44 [fantasai]
dino: We proposed this last year
04:12:53 [fantasai]
dino: I think this one is hopefully not so controversial
04:13:06 [fantasai]
dino: We expose it so ppl can avoid notch in iPhone and rounded corners
04:13:20 [fantasai]
dino: But can also be used for e.g. safe area for televisions
04:13:27 [fantasai]
fantasai: Would be really usefl for printing as well
04:13:35 [astearns]
04:13:40 [fantasai]
dino: Having experimented with this, it makes sense for insets
04:14:04 [fantasai]
dino: But let's imagine that what you're trying to do is get ppl to avoid X in thet top corner of the screen
04:14:10 [fantasai]
dino: page shouldn't put anything there
04:14:20 [fantasai]
dino: Should we inset the entire top/left sides?
04:14:28 [fantasai]
dino: Or just a note saying avoid that part of the screen?
04:14:50 [fantasai]
dino: Let's pause and talk about that later?
04:15:02 [fantasai]
dbaron: There was some prec prose that Rebecca Hughes and I iterated over
04:15:14 [fantasai]
dbaron: Because I didn't want Google to ship without a spec for it
04:15:21 [fantasai]
dbaron: What I suggested there, and which I thin kis now in the draft,
04:15:33 [fantasai]
dbaron: Was that the insets together should define a rectangle such that everything in that rectangel is safe
04:15:49 [fantasai]
dbaron: But what you're showing is your insets are more than that
04:16:07 [fantasai]
dbaron: You could use any pair of them... but that doesn't work for the notch
04:16:27 [fantasai]
dino: Right, for notch, we have top and bottom insets and it's fine
04:16:40 [fantasai]
dino: But if your rotate sideways, then you have left and right insets
04:16:49 [fantasai]
dbaron: I'm wondering if the diagram is intentional
04:17:06 [fantasai]
dbaron: I'm suggesting that the rectangle inside the insets was safe
04:17:28 [fantasai]
dbaron: but if you move any of those lines outward, then it's no longe rsafe
04:18:08 [fantasai]
(dbaron is talking about taking the largest rectangle that would fully fit within the safe area, and using its edges as the inset edges vs. considering each inset individually, making sure the entire screen is safe along that edge or inward from it)
04:18:47 [fantasai]
dbaron: Specced that the UA is allowed to pick whatever it wants that would maximize the the usuable space
04:18:59 [fantasai]
dbaron: There are multiple solutions, might want a narrower or wider rectangle, that affects how tall it can be
04:19:28 [fantasai]
myles: The UA is the one that decides what safe me
04:19:36 [fantasai]
myles: We could say that the innermost rectangle is safe
04:19:50 [fantasai]
dbaron: Prose we put it said something like
04:20:07 [fantasai]
“There is some nonrectangular safe region. The insets define some maximal rectangle within that region”
04:21:43 [fantasai]
fantasai restates what dbaron was saying
04:21:53 [fantasai]
dino: I think this definition would be acceptable...
04:22:09 [fantasai]
dino: User agent could also be free to pick a rectangle where it only specifies a top and a bototm inset in this case, and uses the entire width
04:22:16 [fantasai]
dino: Would be overagressive in saying what's safe
04:22:28 [fantasai]
fantasai: there might be different use cases for each definition...
04:22:46 [fantasai]
myles: For TV example, there's no horizontal line that's afe all the way across
04:22:56 [stryx`]
stryx` has joined #css
04:23:06 [fantasai]
dino: TV wants more like the green example (individal insets)
04:23:21 [fantasai]
dino: whereas a rounded display needs more like the red one (dbaron's definition)
04:23:26 [astearns]
04:23:37 [fantasai]
iank_: Another take is that the green is the same as the red plus a margin
04:24:04 [fantasai]
fantasai: Could have two different sets of variables, safe-area-inset and safe-rect-inset...
04:24:29 [fantasai]
heycam: With scrolling, might have different preferences on whether to maximize horizontal or vertical areas
04:24:42 [fantasai]
myles: UA could alter these
04:24:59 [fantasai]
astearns: Hroizontal vs vertical orientation of device, would UA reset them depending on orientation?
04:25:02 [fantasai]
dino: Currently does, yes
04:25:37 [fantasai]
myles: ...
04:25:47 [fantasai]
astearns: Are you unsure whether having these four insets is the right design?
04:25:57 [fantasai]
dino: I was sure, now wondering whether we should define them as the red rectangle
04:26:33 [fantasai]
dino: With the green rectangle you can be safe, if I pad enough from the top, I know I'm going to be visible in that case, even though I wo'n't be safe...
04:26:41 [fantasai]
dino: Maybe we should hold this.
04:27:07 [fantasai]
dino: I will take this back and discuss with other ppl
04:27:15 [fantasai]
dbaron: I think the text needs adjusting for the TV use case, also.
04:27:28 [fantasai]
Topic: Full-screen insets
04:27:29 [dbaron]
04:27:39 [fantasai]
04:27:57 [dbaron]
(that URL was for the previous topic)
04:28:18 [fantasai]
dino draws a fullscreen video player
04:28:23 [fantasai]
There's a title in the top left corner
04:28:26 [fantasai]
there's controls along the bottom
04:28:43 [fantasai]
dino: Works fine on a desktop machien because everyone knows you can get out with escape or whatever
04:28:50 [fantasai]
dbaron: But touch interface doens't have escape key
04:28:59 [fantasai]
dino: So we need to provide some UI for escaping
04:29:05 [fantasai]
dino: e.g. an X in the top left corner
04:29:16 [fantasai]
dino: Fades away if you haven't touched the screen much lately
04:29:29 [fantasai]
dino: Trying to come up with avriables to take the page where it can draw content when the browser UI is available
04:29:45 [fantasai]
florian: We kindof alked about that when we were doing round display, with different approach
04:29:57 [fantasai]
florian: MQ with coordinate, if I put something there, will it be visible?
04:30:14 [fantasai]
florian: Rather than browser trying to prove geometry, can just ask "can I put the box there"?
04:30:24 [fantasai]
myles: Why would you want to binary search for an available space? seems awful
04:30:30 [fantasai]
dino writes an example
04:30:39 [fantasai]
title { pos: abs; top: env(fs-inset-top);
04:30:51 [fantasai]
dino: Can even say title { transition: top 1s; }
04:31:07 [fantasai]
dino: then the title shifts as the browser UI desappears and appears
04:31:21 [fantasai]
dino: While we specify top/left/bottom/right
04:31:38 [fantasai]
dino: top effectively reserves the entire top
04:31:52 [fantasai]
dino: We might do {various things } in this area
04:32:45 [fantasai]
dino: In safe mode, would also have put the left side offset, but we decided to just do the top
04:32:48 [fantasai]
04:32:50 [fantasai]
astearns: ...
04:33:08 [fantasai]
dino: The issue is that we did that for awhile, and it looks weird if the title is not at the top. Looks lik they've got a weird design
04:33:30 [astearns]
s/.../so the space taken up by the browser UI is only known when the UI is showing/
04:33:34 [fantasai]
dino: Other issue I link to, because we fade out the X, it's a good example where YouTube fades out their UI as well
04:33:44 [fantasai]
dino: Might want to expose timers on our fading so they can synchronize
04:33:57 [fantasai]
heycam: Maybe use events rather than time?
04:34:10 [fantasai]
dino: Events makes more sense, usually we're responding to those in JS anyway
04:34:16 [fantasai]
heycam: ...
04:34:32 [fantasai]
dino: We'd also have to publish and make sure everyone's listening to the same events
04:34:46 [fantasai]
dino: That's basically the two proposals. Happy for any suggestions or comments
04:34:55 [fantasai]
florian: What we started with seemed nice and simple
04:35:04 [heycam]
s/.../also you don't know when exactly to start counting those seconds/
04:35:27 [fantasai]
florian: but semes like maye they're overly simplified, and as you get into more complicated situations we keep having to add mroe and more tricks
04:35:34 [dbaron]
04:35:39 [fantasai]
dino: It's veyr specific to our design, but we want to have something that works for others as well.
04:36:29 [rego]
rego has joined #css
04:36:47 [fantasai]
florian draws a dashboard display and asks about how far are we going to go
04:37:05 [fantasai]
dino: safe-area-* is about hardward shapes. fs-inset is about on-screen displays
04:37:11 [fantasai]
florian: ...
04:37:20 [fantasai]
myles: System with arbitrary shapes would be so difficult to use that no developer would do it
04:37:34 [astearns]
04:37:40 [fantasai]
Rossen: Similar to this, we had a value called device-fixed
04:37:47 [fantasai]
Rossen: Worked exactly you describe,
04:38:00 [fantasai]
Rossen: When onscreen keyboard came in, didn't want to resize the entire window
04:38:06 [fantasai]
Rossen: But i fyou wanted to attach UI on top of the keyboard, e.g.
04:38:11 [fantasai]
Rossen: Insteadd of positoin: fixed
04:38:17 [fantasai]
Rossen: You'd do position: device-fixed
04:38:30 [fantasai]
Rossen: And it would adjust
04:38:45 [fantasai]
Rossen: You won't have to resynch or compute any numeric values like top/bottom etc.
04:38:48 [astearns]
04:38:50 [fantasai]
dino: You wouldn't be able to animate
04:39:00 [fantasai]
Rossen: That would be done for you
04:39:07 [fantasai]
Rossen: Basically saying that the device now is going up
04:39:13 [fantasai]
Rossen: on-screen keyboard is cming up
04:39:29 [fantasai]
Rossen: If this UI was important for YouTupe, they'd simply position this as device-fixed
04:39:38 [fantasai]
Rossen: And then this simply becomes bottom: 0;
04:39:44 [fantasai]
Rossen: And they don't need to do anything else
04:39:50 [fantasai]
Rossen: They don't even know, it's still the same thing
04:40:03 [fantasai]
florian: If you are sizing things, would that affect viewort units?
04:40:16 [fantasai]
Rossen: This is ovekill
04:40:32 [fantasai]
Rossen: Another example put forward was if you have, suppose some vertical sidebar
04:40:47 [fantasai]
Rossen: Same thing, a bit more work for us, but if you have positioned top and obttom it would respond
04:41:09 [fantasai]
Rossen: From what I know, it was very successful because very simple
04:41:18 [fantasai]
Rossen: position: fixed vs position: device-fixed
04:41:29 [heycam]
fantasai: why isn't position:fixed have the behavior of device-fied?
04:41:42 [fantasai]
Rossen: We weren't actually resizing the viewport, it was an overlay UI
04:42:02 [fantasai]
Rossen: e.g. keyboard uses semitranslucent colors
04:42:11 [heycam]
fantasai: but what if you want to clearly see the content at the bottom of the page?
04:42:15 [heycam]
Rossen: just dismiss the keyboard
04:42:25 [fantasai]
fantasai: What if you need to type into a form field at the bottom of the page?
04:43:15 [fantasai]
frremy: Then you can dock your keyboard.
04:43:39 [fantasai]
dino: Do you still support device-fixed?
04:43:41 [fantasai]
Rossen: yes
04:43:57 [fantasai]
Rossen: We were doing this for action center, which is something that swipes from the right
04:44:05 [fantasai]
Rossen: If you have some UI that's really important to your app
04:44:09 [fantasai]
Rossen: you can attach it
04:44:16 [fantasai]
myles: Does it work if the window is not full screen?
04:44:23 [fantasai]
Rossen: No, this is only for full-screen
04:44:47 [fantasai]
iank_: What is the box?
04:45:03 [fantasai]
dino: In our case the device-fixed box would be what remains after the inset here.
04:45:12 [fantasai]
iank_: But it wouldn't solve this use case?
04:45:22 [fantasai]
dino: It would, but ti wouldn't solve use case of wanting ot fade all controls at once
04:45:28 [fantasai]
iank_: What aobut tile shifting to the right?
04:45:38 [fantasai]
dino: We'r ereserving the right ot put more things up there
04:46:07 [fantasai]
dino: Would be up to browser to animate the the device-fixed box.
04:46:11 [fantasai]
myles: Animation is different
04:46:16 [fantasai]
myles: we want the animation to fade out
04:46:26 [fantasai]
myles: whereas you want it to slide out
04:46:51 [fantasai]
Rossen: You can fade out the keyboard or slide it?
04:47:05 [fantasai]
myles: How does the page know to fade out or side out things?
04:47:19 [fantasai]
dino: Say youtube uses a 3s fade, and we use a 4s fade.
04:47:33 [fantasai]
dino: Wnat to tell youtube to use 4s if it wants to be in sync
04:48:26 [fantasai]
fantasai: In Apple's case, could just use the transition time value in the 'transition' property
04:48:56 [fantasai]
Rossen: Reason we wanted it done in browser was because syncing timers was not working
04:49:19 [fantasai]
astearns: weirdly shaped things will need to use a lot of environment variables
04:49:56 [fantasai]
dino: OK, we'll take back this feedback
04:50:12 [fantasai]
fantasai: Also, you might want to consider s/fullscreen/overlay in the names... it's not really about the fullscreening
04:50:38 [fantasai]
Rossen: If we are looking to solve the tying of author-defined controls with UA controls animation
04:50:47 [fantasai]
Rossen: You can have a start and an end event
04:51:31 [fantasai]
Rossen: Just also need to know how long between the two
04:51:38 [fantasai]
myles: Could be part of the start event
04:51:52 [fantasai]
astearns: Maybe you only need one set of environment variables
04:52:33 [fantasai]
Topic: Media Queries
04:52:48 [fantasai]
dino: Talked about prefers-dark mode ones.
04:52:58 [fantasai]
dino: Other one is prefers-high-contrast
04:53:10 [fantasai]
dino: Apple has a simple toggle for this. Prefer high contrast? Yes/NO
04:53:22 [fantasai]
dino: It's much more complicated in Windows
04:53:31 [fantasai]
dino: Would want auto | yes| no
04:53:53 [fantasai]
dino: Blocked on not knowing what Windows or Android do, what granualrity do they have, how much do they want to expose.
04:54:18 [fantasai]
frremy: We have states [light | dark ] high-contrast?
04:54:34 [fantasai]
florian: In Apple contrast vs light/dark are separate
04:54:56 [fantasai]
Rossen: That's different
04:55:08 [fantasai]
Rossen: There's “high contrast” which could be user-defined, e.g. yellow and black
04:55:18 [fantasai]
Rossen: There are themes, dark theme and light theme, and blue theme, etc.
04:55:21 [fantasai]
Rossen: Nothing to do with conrast
04:55:27 [fantasai]
Rossen: Can have bad contrast with dark theme
04:55:33 [fantasai]
Rossen: they're just dark
04:55:40 [fantasai]
Rossen: What frremy is talking about is high contrast
04:55:46 [fantasai]
Rossen: not about themes
04:56:23 [fantasai]
florian: MS conrast MQ has two options, white-on-black and black-on-white
04:57:08 [fantasai]
florian: Apple has independent control of hgih-contrast vs not and dark bg vs light bg
04:57:30 [fantasai]
Rossen: What we wanted to do in high conrast was to guarantee readability. That's what high-contrast is all about
04:57:38 [fantasai]
Rossen: Had to figure out how to isolate text and make it readable
04:57:44 [fantasai]
Rossen: Make sure it has ghigh contrast, regardless of colors
04:58:03 [fantasai]
Rossen: Two options are white-on-black and black-on-white, nothing to do with dark theme
04:58:22 [fantasai]
florian: I disagree with frremy's statement that this si the smaething as what Apple is doing
04:59:07 [fantasai]
myles: You said high-contrast is a collection of themes and you also talked about how Window shas theming
04:59:16 [fantasai]
myles: You can choose one of the many high contrasts or your own theme but not both?
05:00:25 [fantasai]
iank_ explores the Android Settings men
05:00:27 [fantasai]
05:00:40 [fantasai]
Rossen projects Windows
05:00:49 [fantasai]
Rossen: Here is Edge browser in dark theme
05:00:54 [fantasai]
Rossen: UI of browser is dark
05:01:10 [fantasai]
Rossen: Current theme f windows is dark
05:01:22 [fantasai]
Rossen: In terms of readability, having images with text on top of them is not the best for readability
05:01:39 [fantasai]
Rossen projects browser with dark chrome, but web pages are rendering as normal
05:01:49 [fantasai]
Rossen: If I turn on high contrast
05:02:04 [fantasai]
Rossen: Now what you see is that inside fo the browser, we have applied a numbe rof techniques
05:02:15 [fantasai]
Rossen: Firstly, all fo the UI is in high contrast
05:02:30 [fantasai]
Rossen: This current page, as you can see on the images wher epreviously this text was not high-contrast because on top of the image
05:02:55 [fantasai]
Rossen: Here we compute theb oundign areas of text, and make sure that we have a backing plate that preserves the contrast between the background and the text
05:03:00 [fantasai]
Rossen: This is not observable by the web author
05:03:16 [fantasai]
Rossen: In the past we would strip bgimgaes entirely, b/c we didn't know how to deal with it
05:03:21 [fantasai]
Rossen: but htis is high contrast
05:03:25 [fantasai]
Rossen: So that was high contrast
05:03:30 [fantasai]
Rossen: So themes, are something esparate
05:03:39 [fantasai]
florian: Within constrat, you can pick different styles of high contrast
05:03:57 [fantasai]
Rossen: Right, so I can change the colors instead of having yellow on black, I can flip the colors
05:04:09 [fantasai]
dino: Apple does that, but only for subtitles in videos
05:04:15 [fantasai]
dino: We allow complete customization of captions
05:04:20 [fantasai]
Rossen: We do this for everything
05:05:10 [fantasai]
Rossen: We have predefined high contrast themes, e.g. white on black and black on white
05:05:15 [fantasai]
Rossen: Also can have themes
05:05:25 [fantasai]
Rossen: I can change the UI colors like this
05:05:42 [fantasai]
Rossen: I can change just the borwser theme, even though the OS is dark theme
05:06:16 [heycam]
ScribeNick: heycam
05:06:16 [TabAtkins]
ScribeNice: TabAtkins
05:07:06 [heycam]
dino: do you have any mode to say turn off the transparency [in the panel]?
05:07:12 [heycam]
frremy: yes
05:07:15 [heycam]
dino: in accessibility?
05:07:16 [heycam]
frremy: no
05:07:33 [heycam]
dino: we have that option too, might be worth considering that for a MQ in the future, since some people find that distracting
05:07:44 [fantasai]
05:07:55 [astearns]
ack fantasai
05:07:57 [heycam]
fantasai: I think there's several things here we're talking about
05:07:58 [heycam]
... not the same thing
05:08:11 [heycam]
... one is general theming of the OS, where you want to change the chrome toolbars etc. but you don't want to change any content
05:08:20 [heycam]
... that is outside the scope of what we're doing here
05:08:24 [heycam]
Rossen: that's what I wanted to point out
05:08:38 [heycam]
fantasai: we could make it in scope, if you wanted to try to match the theme, but we're not concerned with that today
05:08:45 [heycam]
... rather cases where the user wants changes in the content of pages
05:08:56 [heycam]
... then there's the request for: I want high constrast, and I want dark or not
05:09:01 [heycam]
... four states possible here
05:09:03 [heycam]
... actually more than that
05:09:21 [heycam]
... two axes here
05:10:09 [heycam]
... (whatever, high constrast, low contrast) x (whatever, light, dark)
05:10:39 [heycam]
... default state is whatever, page shows whatever. "light" would mean force dark backgrounds to be light etc.
05:11:18 [heycam]
... for (whatever, light), you don't care what the contrast is
05:11:41 [heycam]
... Windows doesn't have a (whatever, high constrast)
05:11:43 [heycam]
Rossen: that's not true
05:11:46 [heycam]
... you can choose some colors
05:11:52 [heycam]
fantasai: but you're not responding to what the author said
05:12:05 [heycam]
... there's no setting that says I see there are white colors on dark bgs
05:12:19 [heycam]
... which tries to detect "is this a dark themed page or light themed page"
05:12:20 [heycam]
Rossen: I agree
05:12:28 [heycam]
... this is how it will be for the forseeable future
05:12:32 [heycam]
astearns: you're talking about forcing things
05:12:37 [heycam]
... I thought we're talking about MQs
05:12:52 [heycam]
... where authors can key off of, and provide a high constrast experience, not forcing something
05:12:55 [heycam]
... if they're cared to provide one
05:12:58 [heycam]
fantasai: that's separate
05:13:10 [heycam]
Rossen: what francois was trying to describe is available
05:13:36 [heycam]
... currently we provide MQ to say y/n for high-contrast. and for the two default themes, light or dark, what it is
05:13:55 [heycam]
florian: when you say "y", in your MQ, you have something to let the author know high contrast has been forced with some colors
05:14:09 [heycam]
... fantasai is asking about a way with MQ to know if the page is forced constrast with its existing page colors
05:14:11 [heycam]
Rossen: of course not
05:14:35 [myles]
05:14:44 [heycam]
chris_: [demos what Android does]
05:14:59 [heycam]
... has a Negative Colors option
05:15:04 [heycam]
dino: we have a MQ for that
05:15:09 [heycam]
... similar to the color-invert stuff
05:15:17 [heycam]
chris_: and there's a color lens thing
05:15:32 [heycam]
... lastly, color adjustment for different color blindness
05:15:50 [astearns]
ack myles
05:15:56 [heycam]
myles: I have a question about Edge's MQs
05:16:07 [heycam]
myles: I turn on high constrast on Windows
05:16:13 [heycam]
... web page has a MQ that matches that
05:16:21 [heycam]
... in the MQ that says make text blue, whatever
05:16:34 [heycam]
... does Edge then take that as a signal the web page is handling high constrast itself? and the UA doesn't need to do anything?
05:16:54 [heycam]
Rossen: basically what was mentioned this moring, we have a property that lets you opt out an element and its subtree, from high constrast imposed by the OS
05:17:01 [heycam]
... for that particular element and its subtree, you can define whatever colors you want
05:17:08 [heycam]
... if you want to guarantee high constrast go ahead and do it
05:17:09 [heycam]
myles: got it
05:17:50 [heycam]
Rossen: if it's one the two default high constraints options, black on white, white on black, if you can use a MQ to handle it yourself
05:18:17 [heycam]
myles: is it possible to use that property to turn off high constrast handling outside the MQ?
05:18:19 [heycam]
Rossen: yes
05:18:56 [heycam]
florian: we have the thing Apple brought, is different from this
05:19:05 [heycam]
... because the Windows mode is about forcing the page into one of several high constrast modes
05:19:15 [heycam]
... and letting the author detect this has happend, and through the property let the author opt out
05:19:30 [heycam]
... the thing Apple brought is not detecting it has forced high constrast, but the user requested the page does it to itself
05:19:44 [heycam]
frremy: sure
05:20:02 [heycam]
Rossen: so your assertion is that the high constrast mode will by default never apply to content, unless the content decides yeah I'll do it
05:20:09 [heycam]
dino: for Apple, yes, we don't force high constrast on any content
05:20:20 [heycam]
florian: there are multiple types of high constrast. some are preferences, some are enforced
05:20:25 [heycam]
... which you may be able to opt out or not
05:20:48 [heycam]
astearns: one of the distinctions in my mind about these things is that I don't think it's our place to specify browser forcing behavior as a CSSWG
05:21:00 [heycam]
... we're not going to specify anything that says "here's what happens when a browser forces changes on content"
05:21:02 [fantasai]
Chart on the board: x-axis has whatever | forced high-contrast | forced low-contrast | prefers high-contrast | prefers low-contrast
05:21:16 [fantasai]
y-axis has whatever | forced light | forced dark | prefers light | prefers dark
05:21:25 [heycam]
... the only thing we can do is provide a MQ that says the user prefers a certain high constrast scenario, or that your content decisions have been hijacked by the UA
05:21:27 [heycam]
dino: I agree
05:21:32 [heycam]
... and our request is only for the former
05:21:40 [heycam]
... we just want the user to indicate to the dev of the page they've made a preference decision
05:21:56 [heycam]
... the color-filter property discussed this morning is a hammer the dev can use to make it easier to satisfy one of those preferences, but it's not required
05:22:19 [heycam]
florian: I was also thinking that combinations of preferences is easier to handle
05:22:28 [heycam]
florian: the MS things are reasonable but more complex
05:22:47 [heycam]
... I tried to devise a single MQ query that dealt with all of that, preferences and enforcements
05:22:56 [heycam]
... so I suggest we don't try to solve all these with the one MQ
05:22:59 [heycam]
... the preference thing is simple
05:23:01 [myles]
05:23:06 [heycam]
... the MS is not as simple, we should solve them separately
05:23:22 [heycam]
... exactly what the page should do if force high constrast and prefer low constrast... shouldn't be exposed to the page
05:23:24 [astearns]
ack myles
05:23:31 [heycam]
myles: I understand there are these two ideas how to implement these features
05:23:36 [heycam]
... is MS making a proposal to standarized their way?
05:23:39 [heycam]
Rossen: we made this a long time ago
05:23:44 [heycam]
astearns: but it's not the currenty issue
05:23:50 [heycam]
frremy: we'd be find having a pref to high constrast
05:24:04 [heycam]
frremy: if we force high constrats the user prefers constrast
05:24:14 [heycam]
... if the user forces high constrast they prefer high constrast
05:24:27 [skk]
Current description on the board:
05:24:35 [heycam]
TabAtkins: what do you think people will do when the MQ is true? prefer high constrast true?
05:24:41 [heycam]
frremy: make it high consrast
05:24:47 [heycam]
TabAtkins: but it's already happened by the UA
05:25:07 [heycam]
myles: he is imagining the content would turn on the property to say "don't do high constrast" and do it themselves
05:25:18 [heycam]
frremy: and it's more complex, if you don't set the property, and you have the prop in the MQ, it's applied anyway
05:25:21 [heycam]
... it will work
05:25:27 [heycam]
... if the define everything for prefer, it'll work
05:25:30 [heycam]
florian: in that direction it works
05:25:42 [heycam]
... if the page has been devised with Apple semantics in mind, and the browser does what you says, it'll work.
05:26:31 [heycam]
... if it has been designed for Edge design, assumes that prefers high constrats means I've been forced, so I should do nothing, if you run it in Safari the page won't do it
05:26:39 [heycam]
myles: if the page will do nothing why would it have this MQ
05:26:44 [heycam]
florian: it would turn off some subtle things?
05:26:50 [heycam]
frremy: this is not worse
05:27:07 [heycam]
fantasai: [whiteboard, chart of different combinations of preferences and forcing]
05:27:19 [heycam]
... you can get all the info you want on what kind of constrast you like or are forced into
05:27:49 [heycam]
... there really seems to be two sets of prefs
05:27:57 [heycam]
... one is about constrast, one is about light on dark and vv
05:28:06 [heycam]
... the MS MQ mixes them into the same thing
05:28:12 [heycam]
... you can have no pref, but also pref for high constrast
05:28:20 [heycam]
... or prefer high constrast, or I've been forced into high constrast
05:28:27 [heycam]
... you can treat them the same or distinct, as an author
05:28:43 [heycam]
... in terms of whether you're forced into dark on light or vv, then having a brightness preferecne will tell you which one you're in already
05:28:53 [heycam]
... these are MQ values I've written
05:28:59 [heycam]
frremy: I would be find without these four values
05:29:12 [heycam]
05:29:21 [heycam]
... you can use the property to opt out of them
05:29:28 [heycam]
frremy: if people want to know about them they can use the MQs
05:29:35 [heycam]
florian: MSDN says the high constrast MQ has been removed
05:29:37 [heycam]
Rossen: that's wrong
05:29:50 [skk]
fantasai's description:
05:29:52 [heycam]
fantasai: frremy your suggestion someone doing the same as MS must create their own vendor specific features to interop with you?
05:30:00 [heycam]
frremy: there is no browser who wants to match with us right now
05:30:07 [heycam]
astearns: if they want to we can bring something to the group
05:30:17 [heycam]
fantasai: we have to standardize their extensions with their syntax
05:30:24 [heycam]
dbaron: interoperate with what aspect of what MS does?
05:30:37 [heycam]
... Gecko has certainly to reacted to windows high constrast theme settings in various ways, probably differently from Edge
05:30:41 [heycam]
... it doesn't override a lot of colors
05:30:49 [heycam]
emilio: we disable alpha colors
05:30:57 [heycam]
astearns: my suggestion is, we've had a discussion, put it into the issue
05:31:02 [emilio]
05:31:06 [heycam]
... sounds like we do want these MQs in some form
05:31:11 [emilio]
s/cauthor/author :)
05:31:13 [heycam]
... and then come back to it at a later meeting
05:31:59 [birtles]
Gecko makes quite a few changes when Windows high-contrast mode is set (e.g. dropping the fill of SVG shapes and showing their outline)
05:32:20 [heycam]
dino: one point, I don't know if we need a prefers-contrast:low
05:32:33 [heycam]
Rossen: actually there is a dyslexia adaptation ...
05:33:09 [heycam]
florian: we described the way you react to high constrast active, which doesn't say if it's black on white or vv, I'm the page that knows how to do it, and I'll go into high constrast, [...]
05:33:14 [heycam]
Rossen: if you're responsibel you will query the colors
05:33:16 [heycam]
fantasai: you can't do that
05:33:18 [heycam]
Rossen: you can
05:33:22 [heycam]
fantasai: not in a x platform way
05:33:50 [heycam]
dino: what do people think of the brightness name? I didn't like the term "dark mode" or "dark content". but "brightness" is a bit weird...
05:33:55 [heycam]
fantasai: I just put that up because I needed a word
05:34:04 [heycam]
florian: I would go with something like "color theme", but that might be confused with UI theme...
05:34:08 [heycam]
... preferred color scheme?
05:34:12 [heycam]
fantasai: it's about the content
05:34:27 [heycam]
... there's the theming scheme, which we might expose at some point in the future, and the prefers light vs dark
05:35:10 [heycam]
<br type="afternoon-tea">
05:35:29 [myles]
The proposal is two media queries: prefers-contrast: none | high | high-forced | low | low-forced, and prefers-brightness: none | light | dark | forced-dark | forced-light | forced-something
05:36:32 [myles_]
myles_ has joined #css
05:42:50 [stryx`]
stryx` has joined #css
05:52:47 [fantasai]
alternately prefers-contrast: none | high | low | forced
05:52:57 [fantasai]
or prefers-contrast: none | [ high | low ] || forced
05:53:20 [astearns]
not sure preferring no contrast is a thing
05:56:41 [astearns]
topic: end
05:56:49 [astearns]
ah, no issue
05:57:02 [fantasai]
05:57:26 [fantasai]
Florian says the actual keyword for these things is no-preferences to avoid such nonsense :)
05:59:37 [myles]
myles has joined #css
06:00:25 [heycam]
heycam has joined #css
06:01:39 [heycam]
Topic: prefers-reducued-data MQ
06:01:47 [heycam]
06:02:04 [heycam]
florian: I don't know for sure in which browser but I suspect in chrome, which has a new HTTP header which they can send if the user requested so
06:02:13 [heycam]
... which informs the web server that you would prefer lightweight content
06:02:19 [heycam]
... there has been a suggestion to have a MQ to match that
06:02:33 [heycam]
... in the same circumstances, the page author would also know that the user may be directly / through some heuristic, prefers some lightweight content
06:02:37 [heycam]
... images as a bg instead of a video, e.g.
06:02:40 [heycam]
... seems reasonable to me
06:02:45 [heycam]
myles: how does chrome know when to send the header?
06:02:51 [heycam]
philipwalton: I think it's from the OS on Android
06:03:05 [heycam]
iank_: there's a setting Chrome, prefer lightweight data, then we send everything through potentially an HTTP proxy
06:03:09 [heycam]
... few other things as well
06:03:21 [heycam]
florian: is it user triggered
06:03:21 [heycam]
iank_: yes
06:03:29 [heycam]
... but I'm not sure, might be varied on country basis
06:03:47 [heycam]
... we run HTTP proxies where we'll send traffic through that, then do a bunch of compression for the user
06:03:52 [heycam]
myles: so the proxy might turn on the header?
06:03:53 [heycam]
iank_: no
06:04:02 [heycam]
... the proxy is one of the side effects from turning on this option
06:04:18 [heycam]
... and I think the bit of information that we give devs is on navigator.connection.saveData
06:04:26 [heycam]
philipwalton: it's a client hints header, in the clients hint spec
06:04:39 [heycam]
florian: somebody proposed to detect this via MQ
06:04:41 [heycam]
fantasai: seems reasonable to me
06:04:51 [heycam]
astearns: is that header, are there plans for other browsers to implement this?
06:04:55 [heycam]
fantasai: wht values does the header have?
06:05:00 [heycam]
philipwalton: I think it's just a boolean at this point
06:05:08 [heycam]
... but the spec is written in a way that it could apply additional values
06:05:35 [heycam]
fantasai: I can imagine wanting three levels, i don't care, I would prefer if you didn't give me heavy things, I'm on a metered / dialup connection
06:05:37 [astearns]
06:06:06 [heycam]
iank_: quickly looking through the additional things we expose, we also give as headers (what we think is the effective) roundtrip time
06:06:12 [heycam]
... an estimate of the downlink speed
06:06:21 [heycam]
philipwalton: and effective connection type
06:06:25 [heycam]
heycam: mobile vs fixed?
06:06:31 [heycam]
iank_: 3g, 4g, slow 2g, ....
06:06:36 [heycam]
florian: don't think we'd expose all that
06:06:38 [heycam]
... via the MQ
06:06:57 [heycam]
... having something that can be used in a boolean context, where one case is no preference, and may have other "yes please" levels
06:07:10 [heycam]
iank_: one thing I'd like to see here is use cases for where it's used in CSS
06:07:23 [heycam]
florian: use image bg instead of video bg
06:07:33 [heycam]
iank_: do that with script
06:07:37 [heycam]
philipwalton: 1x vs 2x?
06:07:41 [heycam]
florian: browser should do that already
06:08:06 [heycam]
[side discussion about font-display:optional]
06:08:30 [heycam]
philipwalton: with save data, 1x vs 2x, could be your device supports 2x but you only want a smaller version of the image
06:08:39 [heycam]
florian: mostly you should not be using resolution MQ feature, but instead srcset
06:08:48 [heycam]
... then the load data preference could influence that
06:09:01 [heycam]
06:09:20 [heycam]
myles: maybe terribly idea, can we extend that mechanism to allow switching between videos and images as backgrounds, instead of a MQ?
06:09:26 [heycam]
fantasai: MQs are not only used in CSS
06:10:01 [heycam]
emilio: responsive images
06:10:08 [heycam]
iank_: I'm not saying no, but I want to see web developer demand for this
06:10:12 [heycam]
astearns: that's the general tone I'm hearing
06:10:30 [heycam]
... sounds like it could be useful, but we'd need to have it motivated by use cases and I'd prefer to see this client hint get a bit farther on the track
06:10:32 [heycam]
florian: sounds ok
06:11:02 [heycam]
koji: this is an Android OS setting
06:11:07 [heycam]
ericwilligers: it's both Android and a Chrome setting
06:11:56 [heycam]
Topic: porting media groups
06:12:04 [heycam]
06:12:15 [heycam]
florian: CSS 2.1 has a section, media groups, which decribes what media groups are
06:12:19 [heycam]
... visual, interactive, static, things like this
06:12:27 [heycam]
... it doesn't define what they are, just lists what exists
06:12:33 [heycam]
... then says visual is print or screen or tv or handheld
06:12:42 [heycam]
... interactive is print or screen or somet tvs
06:12:49 [heycam]
... this is used in the propdef for every property definition
06:12:52 [heycam]
... Media: Visual
06:12:57 [heycam]
... fantasai suggested porting this to something else
06:13:01 [heycam]
... but I don't think it does anything useful
06:13:13 [heycam]
... unllike the Applies line, which says browsers will do nothing on some elements
06:13:22 [heycam]
... this basically says "on some browsers this property won't be supported"
06:13:26 [heycam]
... they're insufficiently described
06:13:37 [heycam]
... the way we've used the Media line, 95% say Visual, the few that say something else are using it wrong
06:13:43 [heycam]
... I suggest we stop having a Media line
06:14:01 [heycam]
dbaron: I think the reality is there's been not a lot of implementation of CSS for anything other than visual media
06:14:16 [heycam]
... and what implementation there has been hasn't provided feedback to the WG, so the specs don't account for it well
06:14:26 [heycam]
florian: the animations and transitions properties claim to work on interatctive media, not visual
06:14:46 [heycam]
... if you look at how interactie is defined, it would seem to mean the transitions and aanimations work on a kindle with buttons, but not on a digital signage screen with no buttons
06:14:47 [heycam]
... which is wrong
06:14:54 [heycam]
... so we could define it in a way that's correct
06:14:58 [heycam]
... but it's still not useful
06:15:00 [heycam]
frremy: makes sense to me
06:15:18 [heycam]
myles: is it valuable to say you can't animate on a piece of paper?
06:16:05 [heycam]
RESOLVED: Remove Media line from all propdef tables
06:17:16 [heycam]
Topic: <mf-range>
06:17:18 [heycam]
06:17:32 [heycam]
florian: (width < 100px) is allowed in MQ L4
06:17:52 [heycam]
... it also lets you do (100px > width) which people don't care about strongly
06:18:08 [heycam]
... but they also let you do (50px < width < 100px)
06:18:13 [heycam]
... Firefox has implemented the first one
06:18:20 [heycam]
... and claimed that the second two are more difficult to implement
06:18:28 [heycam]
emilio: it's not that I'd like not to, it's that it's somewhat annoying
06:18:59 [heycam]
... the way we parts MQs now, you look at the media feature name, you know what kind of value you parse, so you have the value before it, it is more annoying to figure out which is the media feature name
06:19:05 [heycam]
... and identifiers can also be media feature values
06:19:27 [heycam]
... if you have an ident operator ident, you can't reject it, because you can't know that a range feature with ident values wouldn't make sense, biut...
06:19:38 [heycam]
florian: I think the third option is nice
06:20:02 [heycam]
... Tab's suggestion was if dropping the middle one, you can still easily identify the media feature for the third one, just a couple more tokens later
06:20:16 [heycam]
emilio: I think if we're going to keep the last one, we may as well keep the previous one
06:20:20 [heycam]
astearns: doesn't make it much easier
06:20:42 [heycam]
astearns: are you the only ones implementing this?
06:20:45 [heycam]
emilio: I think so, so far
06:20:49 [heycam]
frremy: that was two weeks ago
06:21:24 [heycam]
ericwilligers: I think this is clear:
06:21:26 [heycam]
width < 100
06:21:28 [heycam]
100 <= width < 200
06:21:29 [heycam]
200 < width
06:21:35 [heycam]
ericwilligers: with the last one the width on the RHS
06:21:50 [heycam]
florian: if removing the middle one was a signficiant simplification, we can do it, but sounds like not
06:22:00 [heycam]
RESOLVED: Close this issue with no change
06:22:13 [astearns]
06:22:41 [heycam]
Topic: porting media groups
06:22:45 [heycam]
06:22:55 [heycam]
fantasai: I ran a grep through the tree
06:23:00 [heycam]
... almost everything is Visual, some exceptiosn
06:23:05 [heycam]
... interactive vs not is not interesting
06:23:17 [heycam]
... but we distinguish between CSS props that shuld affect the accessibility tree, and the ones that shouldn't
06:23:19 [heycam]
... or don't
06:23:26 [heycam]
... content prop affects what shows up to a screen reader
06:23:28 [heycam]
... display does
06:23:35 [heycam]
astearns: how is that expressed?
06:23:38 [heycam]
florian: by Media: all
06:23:49 [heycam]
astearns: are we consistent about that?
06:23:51 [heycam]
fantasai: yes
06:24:00 [heycam]
... props that should add or remove content from the a11y tool
06:24:14 [heycam]
... it's an indicator to the screen reader as to what content should be added or skipped
06:24:23 [heycam]
florian: I think it's not about screen readers
06:24:27 [heycam]
... it's about audio rendering
06:24:46 [heycam]
fantasai: yes, but if we remove this, we need to make sure we're very clear in the spec, explicit wording to say this prop needs to affect non visual things
06:24:54 [heycam]
dbaron: I think if that was the intent of the spec, I suspect most implementors missed it
06:25:00 [heycam]
... I think it would be good to have the wording in some other way
06:25:09 [heycam]
astearns: I think it would be an improvement to be explicit, rather than hide it here
06:25:23 [heycam]
frremy: most of these things, if they're defined, are in ARIA, they explicitly call out the properties and what you should do with them
06:25:41 [heycam]
florian: for a11y, probably, for visual and non-visual media .... for the ones that say "all", a normative statement that says "this works on all media" is fine
06:25:44 [heycam]
astearns: it should be more explicit
06:25:50 [heycam]
... "such as, screen readers"
06:25:50 [heycam]
florian: no
06:25:54 [heycam]
... they don't work like that
06:25:56 [heycam]
... they're a visual media
06:26:02 [heycam]
fantasai: but they're also not handling gencon properly
06:26:04 [heycam]
Rossen: they do
06:26:09 [heycam]
frremy: in Edge it works perfectly
06:26:18 [heycam]
fantasai: but it is a common bug
06:26:52 [heycam]
frremy: the content thing is defined precisely in the ARIA specs
06:26:58 [heycam]
... I don't believe we need to say anything in the CSS specs
06:27:09 [heycam]
... it says gencon should be exposed
06:27:15 [heycam]
... but it shouldn't require any specific wording
06:27:36 [heycam]
florian: I would suggest adding a sentence not a11y specific, calling out that this property is supposed to apply to all kinds of rendering, even not visual
06:27:48 [heycam]
... not specifically to a11y, e.g. audio rendering without a screen reader, don't forget this property
06:27:52 [heycam]
astearns: would that be enough?
06:27:53 [heycam]
dbaron: sure
06:28:12 [heycam]
fantasai: we should have these kinds of sentences anyway. in the propdef table it's easy to look up which ones you need to care about
06:28:16 [heycam]
... but it takes up a lot of space
06:28:22 [heycam]
... removing from the propdef table is a benefit overall
06:28:39 [heycam]
... we should add a statement explaining normatively that CSS requires these to work
06:28:54 [heycam]
... we're defining what the properties mean and how they're interpreted, ARIA then uses that
06:29:21 [heycam]
RESOLVED: Add a normative statement for properties that say "Media: all" explaining what "Media: all" meant.
06:30:00 [florian]
ScribeNick: Florian
06:30:22 [florian]
Topic: Bikeshed the 0 specificity alternative to :matches()
06:30:38 [leaverou]
06:31:09 [dbaron]
06:31:41 [florian]
ericwilligers: [projets the issue]
06:32:06 [florian]
fantasai: if we have :not and :is, they should have the same specificity
06:33:00 [florian]
ericwilligers: matches has changed specificity recently
06:33:06 [florian]
fantasai: that's out of scope here
06:33:31 [florian]
ericwilligers: :when was time based, so I proposed :where, haven't heard back
06:34:04 [florian]
astearns: does anyone have problem with :where ?
06:34:23 [florian]
leaverou: has does that avoid the problems that :is has?
06:34:42 [florian]
fantasai: because :is and :not need to be opposite
06:35:01 [florian]
leaverou: how about having :is-not be the opposite of :is
06:35:20 [florian]
all: Noooo
06:35:34 [florian]
frremy: :where works for me
06:35:45 [florian]
ericwilligers: has to combine well with :not()
06:36:11 [florian]
leaverou: why can't we change :matches? it has shipped, but nobody uses it yet
06:36:26 [florian]
astearns: we've discussed doing it several time, and failed to reach consensus
06:36:58 [florian]
fantasai: lea propose to just change the specificity of :matches, and add a new one for the other specificity
06:37:11 [florian]
frremy: why use the :match name at all, it's a bad name
06:37:18 [florian]
leaverou: we're stuck with it anyway
06:38:02 [florian]
fantasai: I want a short list so that we can think about it
06:39:10 [florian]
leaverou: would you object to :is if it did what matches currently does, and :match() is the 0 specificity one?
06:39:13 [florian]
fantasai: no, I would not
06:39:41 [florian]
leaverou: what if we just have one, with an argument for specificity
06:39:44 [florian]
fantasai: too confusing
06:40:41 [florian]
shane: :where makes sense for people who have used SQL, but for others it is confusing, and seems to involve position
06:41:04 [dbaron]
06:41:40 [florian]
leaverou: I find SQL readable, but that's because it's a full sentence, which isn't the case in css
06:41:49 [florian]
fantasai: I like 2 and 4
06:41:52 [Rossen]
Here are the options
06:41:56 [dbaron]
1. :is()
06:41:56 [dbaron]
2. :matches() + replace existing :matches() with :is()
06:42:00 [Rossen]
1. :is()
06:42:13 [Rossen]
3. :if()
06:42:19 [Rossen]
4. :also()
06:42:25 [Rossen]
5. :where()
06:42:26 [florian]
frremy: :and means nothing to me, all selectors already imply that
06:42:30 [Rossen]
6. :selects()
06:42:47 [florian]
fantasai: yes, but :also doesn't have that implication
06:42:52 [florian]
leaverou: in favor of :also
06:43:22 [florian]
Rossen: [makes funny inaudible jokes]
06:43:33 [florian]
dbaron: we have an html element called select
06:43:45 [florian]
Rossen: let's start removing
06:43:49 [florian]
Rossen: kill select
06:44:05 [florian]
ericwilligers: I think we can also kill :if
06:44:18 [florian]
Rossen: :if would need an :else
06:44:21 [florian]
frremy: why?
06:46:01 [Rossen]
7. :also() + replace existing :matches() with :is()
06:46:10 [florian]
leaverou: I'd like 7
06:46:26 [florian]
frremy: this was called that way because the DOM API is called that
06:46:40 [florian]
fantasai: actually, it's very old and it's the other way around
06:46:57 [florian]
ericwilligers: it has been in webkit for a long time
06:47:06 [florian]
astearns: how much web content uses :matches?
06:47:17 [florian]
iank_: not a lot, looking at usecounter
06:47:37 [florian]
ericwilligers: usecounter may be wrong
06:47:40 [dbaron]
"the other way around" was in reference to original name being :any or :matches.
06:48:24 [florian]
Rossen: is either 2 or 7 an option? they involve changing :matches. webkit people, can we do that?
06:48:37 [florian]
myles: we could
06:49:13 [florian]
myles: we would be moderately interested in updating, but it's low priority
06:49:31 [florian]
dino: why ?
06:50:30 [florian]
fantasai: because a best named proposal otherwise is :is, but it is bad if it's specificity doesn't match :not
06:50:55 [florian]
fantasai: so we could change :matches to be the 0 specificity one, freeing the room for :is to do what :matches does now
06:51:31 [florian]
leaverou: maybe we can resolve on that in parts
06:51:38 [florian]
fantasai: removing option 1
06:51:58 [dbaron]
I implemented :-moz-any() in Gecko in 2010 in
06:52:28 [florian]
fantasai: the web compat impact of 2 and 7 are different
06:52:57 [florian]
ericwilligers: does anyone want 2?
06:53:00 [florian]
fantasai: removing 2
06:53:20 [florian]
[lots of people]: I don't like also.
06:53:35 [florian]
[lots of people]: [lots of jokes]
06:53:40 [florian]
leaverou: what's wrong with :also ?
06:54:04 [Rossen]
06:54:14 [florian]
dbaron: :also comes after something, but it doesn't come after anything particular
06:54:49 [florian]
Rossen: agreed (with a pun)
06:55:12 [florian]
ericwilligers: :where implies position OR situation
06:55:22 [florian]
fantasai: does :where not have the same problem as :also?
06:55:35 [florian]
fantasai: :matches does not have that problem
06:55:58 [florian]
frremy: I prefer :where and :if, and :if makes a lot of sense when you read it
06:56:26 [dbaron]
The thing I was talking about was called a "simple selector" in CSS 2, a "sequence of simple selectors" in selectors-3, and a "compound selector" in selectors-4.
06:56:28 [florian]
astearns: :if clashes with JS?
06:56:38 [florian]
[lots of people]: it doesn't
06:57:04 [florian]
...: :if calls for :else
06:57:11 [florian]
...: it doesn't
06:57:51 [florian]
philipwalton: ??????
06:58:06 [florian]
heycam: one option was to have a specificity parameter in :matches
06:58:45 [florian]
astearns: we have agreed that renaming :matches is not necessary to solve this
06:59:24 [dbaron]
s/??????/was the reason for doing this that the specificity was bad, or to give control over specificity? [answer: latter] It seems like a pseudo-class isn't the right tool for that, but I guess that's the right tool for the job./
06:59:40 [florian]
astearns: we rejected some of the options, we should make a smaller list of plausible
06:59:59 [florian]
fantasai: we should make a strawpoll, and then call for objections on the most popular
07:00:18 [florian]
fantasai: :if gets 7 votes
07:00:37 [florian]
fantasai: :also gets 1.5votes
07:01:03 [florian]
fantasai: :where gets 7 votes
07:01:15 [florian]
astearns: objections to :if ?
07:01:38 [florian]
astearns: objections to :where ?
07:01:52 [florian]
leaverou, fantasai, iank_: strong reservations
07:02:11 [tantek]
let's strawpoll if vs where!
07:02:54 [florian]
astearns: I am not declaring consensus
07:03:34 [florian]
astearns: we will ask outsiders about :if vs :where
07:04:03 [florian]
topic: getComputedStyles and shorthands
07:04:08 [florian]
07:05:00 [florian]
emilio: FF and Edge only support getComputedStyle on shorthands that used to be longhands, Blink supports more
07:05:31 [florian]
emilio: shorthands in the computed style object are exposed as properties
07:05:42 [florian]
emilio: I want to know what people want. Fine with changing, but it's work
07:05:58 [florian]
ericwilligers: if it was a longhand, it would serialize
07:06:05 [florian]
TabAtkins: it needs to
07:06:23 [florian]
emilio: there are bugs on the grid shorthands
07:06:43 [myles]
myles has joined #css
07:06:54 [florian]
emilio: People have argued various ways.
07:07:10 [florian]
TabAtkins: this is an obvious forward compat mistake
07:07:26 [florian]
TabAtkins: all properties from now on should support it
07:07:58 [florian]
TabAtkins: and if we can, all the legacy shorthands should as well, when a value can be constructed if it's not a a webcompat problem
07:08:04 [florian]
TabAtkins: which doesn't seem to be the case
07:08:19 [florian]
dbaron: if it's not possible to represent, then we have to go for empty string
07:08:22 [florian]
TabAtkins: that's fine
07:08:41 [TabAtkins]
It's still forward-compatible; adding a new property to the shorthand will never make it, by *default*, stop serializing
07:08:59 [florian]
emilio: there's also the question of computed values vs resolved values
07:09:36 [florian]
heycam: it would be very weird if the longhands resolved but the shorthands didn't, so we should match
07:10:02 [florian]
heycam: Edge is the only other browser not doing it. So Edge?
07:10:59 [florian]
emilio: Edge, are you OK with doing it? the only ones you have on top of used-to-be-longhands are grid properties.
07:11:36 [florian]
Rossen: I don't believe I've seen compat issues. I am reluctant to write a bunch of code for something that's not needed.
07:11:43 [florian]
TabAtkins: going forward, we need
07:12:00 [florian]
s/we need/we need to./
07:12:33 [florian]
TabAtkins: for legacy props, it wouldn't be the end of the world if we didn't do it, but it would be inconsistant and unfortunate.
07:12:51 [florian]
emilio: It can be done quite easily for lots of properties
07:13:59 [florian]
Florian: can we resolve to do on all, even if priorities means it might take a while
07:14:20 [florian]
Rossen: we need consistency, so let's have it everywhere.
07:15:43 [florian]
RESOLVED: all shorthands must show up in getComputedStyles
07:16:36 [florian]
xidorn: I wonder if you should see the shorthands in the iterator
07:17:22 [florian]
xidorn: I think there's a usecase for copying computed values from one element to another, and they just iterate through
07:17:32 [florian]
myles: This should be a separate issue.
07:17:39 [Ms2ger]
Ms2ger has joined #css
07:17:50 [florian]
[mumble mumble]
07:18:17 [florian]
topic: What should getComputedStyle return for an element which isn't in the flat tree?
07:18:27 [florian]
07:18:48 [florian]
emilio: frremy added that, but we already resolved
07:18:59 [florian]
frremy: it's a bot bug, nothing to talk about
07:19:03 [emilio]
Was resolved on
07:19:03 [astearns]
topic: none
07:19:35 [florian]
Topic: Consider disallowing NULL code points in stylesheets
07:19:42 [florian]
07:19:46 [emilio]
myles: lol
07:20:05 [florian]
TabAtkins: [trying to find the original bug]
07:20:50 [florian]
Rossen: what's left to do?
07:21:09 [florian]
Florian: for TabAtkins to argue his case against our previous almost-consensus
07:21:31 [florian]
github: none
07:21:48 [florian]
topic: css nesting
07:21:54 [florian]
07:22:51 [florian]
TabAtkins: we tried to discuss that a while back, but didn't have time to conclude. Should we rediscuss, or re-resolve
07:22:55 [TabAtkins]
07:22:57 [florian]
myles: I want an overview
07:23:39 [florian]
TabAtkins: nesting style rules is a common request, and a feature of every css preporsessor in existence
07:23:56 [florian]
TabAtkins: and one of their most popular feature
07:24:12 [florian]
TabAtkins: makes stylesheets much easier to maintain
07:24:36 [florian]
TabAtkins: it is purely syntatic sugar, but is worth covering because of the huge demand
07:24:55 [florian]
TabAtkins: the way they're done in preprocessors are ambiguous with properties
07:25:15 [florian]
TabAtkins: My propose spec disambiguate with by using &
07:25:53 [florian]
TabAtkins: you can use & at the front, and if you want it elsewhere, you can use @nest to keep things unambiguous
07:26:10 [TabAtkins]
a:hover ....
07:26:39 [florian]
TabAtkins: the above looks like a "a" property with a "hover" value
07:26:54 [frremy]
07:27:09 [florian]
TabAtkins: CSS parsing only requires a finite amount of lookahead, and we'd like to keep it that way
07:27:38 [florian]
leaverou: isn't it only a problem when the tag selector is the first part of the selector
07:27:54 [florian]
TabAtkins: I don't like that because it's not obvious, and hard to teach
07:28:09 [Rossen]
07:28:20 [florian]
fantasai: you could pick a random character to start any rule with
07:28:24 [astearns]
ack frremy
07:28:30 [fantasai]
07:28:40 [florian]
TabAtkins: yes, that's what "@nest" do
07:29:05 [florian]
frremy: replace @nest with &
07:29:12 [TabAtkins]
& &.foo {...}{
07:29:13 [florian]
TabAtkins: it's ambiguous
07:29:27 [heycam]
07:29:33 [florian]
Florian: I don't like it, @nest is nicer
07:29:48 [florian]
leaverou: that would be hard to read
07:29:49 [frremy]
07:30:00 [frremy]
& > span > &
07:30:02 [florian]
frremy: you only include it if needed
07:30:27 [TabAtkins]
& span:not(&) {...}
07:30:29 [Rossen]
07:30:30 [florian]
TabAtkins: other bad example ^
07:31:14 [astearns]
ack heycam
07:31:22 [myles]
07:31:32 [frremy]
(I was convinced by the clarification that the & can be replaced more than one in the selector , which I didn't know)
07:31:53 [myles]
07:31:58 [florian]
heycam: can we require starting with a combinator (and use an explicit descendant combinator)
07:32:17 [florian]
TabAtkins: doesn't solve it for & in the middle
07:33:12 [florian]
fantasai: if you use @nest, use it everywhere
07:33:16 [florian]
TabAtkins: too verbose
07:33:22 [florian]
heycam: @nest introduces a block?
07:33:47 [florian]
leaverou: ????
07:33:49 [fantasai]
s/everywhere/everywhere. If you think that's too verbose, choose a different disambiguator. Alternating between using @nest and not is not great/
07:34:02 [florian]
TabAtkins: very hard to express in grammars
07:34:26 [florian]
TabAtkins: in the most common cases, stating with an ampersand is short, which is important
07:34:50 [florian]
fantasai: just use something shorter than @nest
07:35:08 [fantasai]
07:35:08 [florian]
Florian, fantasai: how about naked @
07:35:49 [myles_]
myles_ has joined #css
07:36:02 [florian]
myles: we don't have to bikeshed the syntax if we're just talking about adopting the module
07:36:03 [leaverou]
fantasai: or naked & to introduce a nested block? /* just throwing ideas! */
07:36:05 [florian]
astearns: objections?
07:36:16 [fantasai]
07:36:21 [florian]
frremy: does it need to be a new module?
07:36:30 [florian]
florian: no, but it's nice that way
07:36:35 [florian]
astearns: objections?
07:36:49 [florian]
fantasai: ED is fine, want to bikeshed the syntax before FPWD
07:37:10 [fantasai]
fantasai: Seems like nobody is really happy with the spec as-i
07:37:15 [fantasai]
07:37:34 [florian]
xidorn: no objection, but my concern is that it expands in some cases into :matches() like things
07:37:41 [florian]
xidorn: and that's hard to optimize
07:38:11 [florian]
TabAtkins: you can expand them out fully
07:38:18 [florian]
emilio: how about the OM?
07:38:25 [florian]
TabAtkins: not expanded in the OM
07:38:50 [florian]
xidorn: that makes it hard
07:39:06 [fantasai]
s/in the OM/in the OM, rules get a .childRules object/
07:39:06 [florian]
xidorn: because of the combinatorial explosion
07:39:22 [florian]
florian: we still have to deal with that in preprocessor generated sylesheets
07:39:39 [fantasai]
ScribeNick: fantasai
07:39:51 [fantasai]
astearns: Hearing no objections to starting work on the module. Hearing a lot of issues against it.
07:40:03 [fantasai]
astearns: Anyone else interested in heping Tab?
07:40:45 [fantasai]
RESOLVED: add css-nesting as an ED, Tab Atkins as editor, file issues until ppl are overall kinda happy with what it's like before we consider FPWD
07:40:54 [fantasai]
Topic: serialization of <position>
07:41:14 [TabAtkins]
The preprocessor features that are :matches()-equivalent explode combinatorially, so the preprocessors trim what they generate. In the common case, nesting expands merely multiplicatively , so they fully expand; so you are already *parsing* a fully-expanded set of selectors.
07:41:27 [ericwilligers]
07:41:49 [ericwilligers]
"<position> is always serialized as 2 or 4 values." or "Neither component may be omitted when serializing."
07:42:52 [fantasai]
ericwilligers: I thin we've completely resolved serialization of <position>
07:43:10 [fantasai]
fantasai: We already resolved that <bg-position> should serialize same as <position>
07:43:17 [ericwilligers]
How exactly does "left 10% center" serialize?
07:44:14 [fantasai]
fantasai: Need to resolve that keywords are serialized out in specified value if originally specified as keywords (and not otherwise)
07:45:01 [fantasai]
emilio: In which order?
07:45:07 [fantasai]
ericwilligers: Horizontal first
07:45:11 [fantasai]
emilio: And always both
07:45:16 [fantasai]
ericwilligers: Yes
07:45:45 [fantasai]
dbaron: It feels like this is saying you have to remember the syntax level, but you don't preserve the number of values in the syntax
07:45:52 [fantasai]
dbaron: But you preserve the keywords
07:46:16 [fantasai]
ericwilligers: ...
07:46:23 [fantasai]
ericwilligers: We're talking about specified values only atm
07:46:39 [fantasai]
ericwilligers: Edge sometimes serializes as percentages rather than keywords
07:46:44 [fantasai]
ericwilligers: For certian properties
07:46:56 [fantasai]
07:47:16 [ericwilligers]
Existing spec: "If only one value is specified, the second value is assumed to be center." "The canonical order when serializing is the horizontal component followed by the vertical component."
07:49:17 [fantasai]
07:49:33 [ericwilligers]
07:49:47 [ericwilligers]
07:49:57 [fantasai]
astearns: Any objections to specifying that specified values are serialized as keywords if specified as keyword sand percentages if specified as percentages?
07:50:04 [fantasai]
07:50:19 [fantasai]
RESOLVED: Any objections to specifying that specified values are serialized
07:50:19 [fantasai]
as keywords if specified as keyword sand percentages if specified as
07:50:22 [fantasai]
07:51:10 [fantasai]
ericwilligers: If 3 values are specified, we'll need to turn into 4 values
07:52:45 [heycam]
ScribeNick: heycam
07:53:29 [heycam]
ericwilligers: : "left 10% right" -> "left 10% right 0%"
07:53:38 [dbaron]
There was a discussion about 'left 1% center" which is apparently no longer a valid <position> but is a <bg-position>.
07:53:46 [heycam]
ericwilligers: "left 10% 20%" -> "left 10% top 20%"
07:54:11 [heycam]
s/"left 10% right"/"left 10% bottom"/
07:54:18 [heycam]
s/"left 10% right 0%"/"left 10% bottom 0%"/
07:54:30 [heycam]
fantasai: if we need a keyword we use top or left, if we need an offset we add a percentage
07:54:33 [heycam]
ericwilligers: plus a weird case for center
07:54:36 [dbaron]
ericwilligers: we can convert 3 values to 4 values by converting "center" to "top 50%", "bottom" to "bottom 0%", and "20%" to "top 20%"
07:54:47 [heycam]
astearns: and there's text in Shapes that does everything you said, except that shapes will convert bottom to top 100%
07:54:58 [heycam]
ericwilligers: we've resolved to remove that text, but I can reuse it
07:55:06 [heycam]
astearns: I don't mind if it stays as bottom or converts to top
07:55:38 [heycam]
fantasai: so left 10% bottom 0% would stay as is, but left 10% bottom would become left 10% top 90%?
07:55:39 [heycam]
astearns: yes
07:55:50 [heycam]
fantasai: if we're preserving the keyword in the case we have the offset, may as well when we don't too
07:56:21 [heycam]
emilio: does everyone support 3 values on background-position?
07:56:23 [heycam]
fantasai: yes
07:56:29 [heycam]
astearns: we ripped it out everywhere we could, but had to leave it there
07:56:38 [heycam]
emilio: ok, I'm fine with that
07:57:45 [heycam]
RESOLVED: For <bg-position>, preserve keywords where we can, center turns to top 50%, and where we need to add a keyword use top/left, where we add an offset, use percentages.
07:58:00 [heycam]
ericwilligers: earlier talking about computed values, I was incorrect to say we never give keywords. we do sometimes!
07:58:03 [heycam]
... but I don't think we should
07:58:10 [heycam]
... I propose for computed values, it's always <length-percentage>
07:58:11 [heycam]
Rossen: or calc()
07:59:54 [heycam]
astearns: so for computed values of <bg-position> and <position>, they are always two <length-percentage> values
08:00:02 [heycam]
... no keywords, calc() if needed
08:00:17 [heycam]
RESOLVED: For computed values of <bg-position> and <position>, they are always two <length-percentage> values.
08:04:23 [dbaron]
github-bot, end topic
08:04:28 [dbaron]
trackbot, end meeting
08:04:28 [trackbot]
Zakim, list attendees
08:04:28 [Zakim]
As of this point the attendees have been tantek
08:04:36 [trackbot]
RRSAgent, please draft minutes
08:04:36 [RRSAgent]
I have made the request to generate trackbot
08:04:37 [trackbot]
RRSAgent, bye
08:04:37 [RRSAgent]
I see no action items