- From: Dael Jackson <daelcss@gmail.com>
- Date: Sun, 16 Aug 2020 08:04:42 -0400
- To: www-style@w3.org
- Cc: public-houdini@w3.org
=========================================
These are the official CSSWG minutes.
Unless you're correcting the minutes,
Please respond by starting a new thread
with an appropriate subject line.
=========================================
Houdini: CSS Typed OM
---------------------
- leaverou and chris presented their work on converting between
color spaces and developing utility functions.
(Issue #989: Color Conversion and Contrast Ratio).
The sample code for the color spec is listed in
https://drafts.csswg.org/css-color-4/conversions.js and
https://drafts.csswg.org/css-color-4/utilities.js
and a color library is being developed at https://colorjs.io/
to explore API options for a color type and also to explore
various methods of implementing higher-level color calculations
in CSS. The group agreed that the work done so far is great
and looks forward to proposals informed by this work.
- One of the core goals of a new color type would be to handle
color space conversions, since those are tricky.
- TabAtkins will write a test for mutation observer for style attr
changes via TypedOM to verify that the problem in Houdini Issue
#997 (Concern about attributeStyleMap updating the style
attribute) is due to devtools being open.
- RESOLVED: TypedOM reifies values as simplified form (mirroring
getComputedStyle etc.) (Houdini Issue #965: Simplifying
away calc() wrappers around single numeric values when
reifying)
- RESOLVED: Put the list in a "value" property, and add a forwarding
for compat (Houdini Issue #948: Using ObservableArray
for the list-ish values in TypedOM)
Houdini Property Values API
---------------------------
- RESOLVED: Keep all fields in @property required (Houdini Issue
#994: Make all the descriptors optional)
Houdini Worklets
----------------
- RESOLVED: Ban data URL from spawning a worker (Houdini Issue #985:
Ban data URL worklets)
- RESOLVED: Update the worklet spec working draft
CSS Grid
--------
- RESOLVED: Update the CSS Grid L1 CR
===== FULL MINUTES BELOW ======
Agenda: https://wiki.csswg.org/planning/virtual-summer-2020#friday
Scribe: fantasai
Scribe's scribe: TabAtkins
CSS Typed OM
============
Color Conversion and Contrast Ratio
-----------------------------------
github: https://github.com/w3c/css-houdini-drafts/issues/989
<leaverou> CSS Color 4 sample code:
https://drafts.csswg.org/css-color-4/conversions.js
and https://drafts.csswg.org/css-color-4/utilities.js
Rossen: This issue motivated by TAG review about addition of lch and
lab color spaces
Rossen: One concern being discussed being discussed with TAG was
that we were getting more variety of color across platform
Rossen: but capabilities of simple things like contrasting two
colors is very difficult
Rossen: One of the ideas was, hey, if we have a strongly defined
type for color that we can use across platform
Rossen: then we could look at exposing variety of functions either
on or around object
Rossen: and achieve objectives like a11y and other things
Rossen: Seemed like TypedOM is good place to start
Rossen: Color is a type we need to define strongly
Rossen: Luckily Lea and Chris jumped in, had been thinking about it
chris: In color 4 there was an appendix written in JS by which I
mean Pascal
chris: It's simple, does work, set of simple functions
chris: Also have utilities.js
chris: includes a contrast function
chris: Here's an sRGB_to_LCH
chris: it does it all in the right order
chris: It was useful for examples
chris: and useful for color 5
chris: but this is not a proposal for a color model
chris: not object oriented
chris: it's just something that works
chris: Here's color.js
chris: Until this morning was a private repo, now public
<leaverou> https://colorjs.io/
chris: Also not a proposal, but it's object oriented
chris: This is a JS API, you can use it in the browser or on the
server
chris: These examples are all live, you can edit directly in the web
page if you want
chris: Variety of color models, includes all in color 4 (except
device-cmyk()) as well as a few more
[leaverou demos]
chris: Notice these are in different color spaces
chris: Internally it goes into CIEXYZ, and then ??, and then gets
you a contrast
chris: You just say you want contrast between two colors, and it
just works out for you
chris: You can change lightness or chroma or whatever
chris: similar to things we do in Color 5
chris: Convert between color spaces
chris: interpolate between colors
chris: either discreet steps, or gradients, or that sort of thing
[chris reviews documentation]
chris: Color object. Can give a CSS string or use initializer with
coordinates
leaverou: Color space ID plus coordinates plus optional alpha
leaverou: or another color
chris: This is similar to color-5, adjusting named coordinates
chris: We've actually supported more than Color 4 supports
chris: might be interesting to see if any would be useful as future
additions
[chris notes there's bugs, especially in the documentation, since
this is pre-release]
chris: You can change color coordinates. Don't even have to change
coordinates of the color space you're in
chris: That's fairly useful
chris: We also do gamut-mapping
chris: because easy to get colors that are out of gamut
chris: We've worked on that quite a bit, have an algorithm that
works rather well
chris: Do a binary search to find closest color via chroma reduction
chris: and do speculative clipping
chris: 1st one we reduce chroma until it's inside the range
chris: 2nd one, at each stage, we see if we clipped here, would we
be close?
chris: and that works much better
chris: thinking to spec that in color-4 spec
chris: Interpolation
chris: range function allows that and getting intermediate stops
leaverou: Range function actually returns a function
leaverou: we can specify which space to do interpolation in
leaverou: You can see here examples of what each interpolation space
produces
leaverou: We also implemented longer/shorter/increasing/decreasing
args for the hue we were discussing
leaverou: although didn't implement dbaron's ? yet
chris: Lets us implement and check and see if it works. Very helpful
in writing spec
chris: Also discussing using Nan for keeping coordinates constant
leaverou: but we do keep Nan for chroma
chris: It's on GH and there's a link, and also a bunch of tests
chris: Any questions at this stage?
Rossen: First of all, this is awesome, thanks for sharing
Rossen: Looking forward to playing with the project
Rossen: that's exactly what I was hoping to see
Rossen: and you made this fantastic
<fremy> big +1 this is super great!
Rossen: Wrt functions like color-mix() etc.
Rossen: Let's say we start going towards adopting such a type in
TypedOM, where does that leave us?
chris: You'll have 2 ways to do it: declarative in color-5, and
imperative way like this
chris: imperative can have more functionality
chris: I don't think it's a problem that we have both declarative
and imperative
leaverou: ...
leaverou: Haven't done adjusters yet
leaverou: Accepts a color space as well, but not adjusters
chris: As general goal, would like to implement all of color-5 so we
can test, and do example, see how that works
chris: Another thing people might have noticed, there's a few more
color spaces here not in color 4
chris: Support high dynamic range coors
chris: There's a secret spec called css-color-hdr
chris: there was an issue around high dynamic range
chris: I said we won't do it, because too unstable
chris: but I did spec an extension to color-4
chris: and wanted to see that it works and coded it up
chris: I presented to ICC and got good feedback, currently
incorporating that
chris: will present to the WG later
chris: In the meantime, I'm incubating it in code to see whether
it's feasible
<leaverou> https://drafts.csswg.org/css-color-hdr/
AmeliaBR: Great library, very useful. Some similar things, but this
is a nice API with good features
AmeliaBR: Wrt what we should adopt into the actual Web platform
AmeliaBR: I do like the idea of having general color utilities object
AmeliaBR: That you can call without having to getComputedStyle
AmeliaBR: coordinating with TypedOM also good
AmeliaBR: so you can construct CSS color type or get it from a style
rule or a computed style
AmeliaBR: that would be great design
AmeliaBR: Probably don't want quite as many features as we have in
this library
AmeliaBR: Might want to integrate a bit more e.g. generated gradients
AmeliaBR: and easing functions would be its own object, to use more
generally than just color
AmeliaBR: Interpolator for data visualization
AmeliaBR: would be a great feature, use native interpolation that
CSS already knows how to do
AmeliaBR: with additional smarts like interpolating in different
color spaces
AmeliaBR: also useful to have
astearns: Anything else besides showing new cool code?
Rossen: How do you see this moving forward?
chris: Requirements, one of them for web platform API
chris: what features do we want, what would be nice, what would be
layered on top
chris: Rossen asked about contrast, that's important
chris: Converting between color spaces without having to understand
how it does
chris: not knowing about white points, not having to figure that
out, that's important
leaverou: There should also be way to access color before / after
gamut mapping because that affects the results
AmeliaBR: Especially important for finding contrast ratio
AmeliaBR: if colors are theoretically good contrast, but not on
user's screen, need to reflect that
florian: So is the plan to subset your project into TypedOM? and
then build your project on top of that result?
chris: Would be reasonable
astearns: If you can't build on top of the subset, then we chose the
wrong subset
Rossen: That was part of my hope
Rossen: exactly why I was provoking this type of discussion and
exposure in typed OM space
Rossen: Anything else left on color that you didn't cover?
leaverou: ICC profiles
leaverou: In theory, TypedOM should cover that as well
leaverou: but wouldn't that make it asynchronous?
TabAtkins: We already have a few things that need external
resources, don't have a great way to handle that
TabAtkins: but nothing else needs to be infected, just wait for them
via Promise
chris: Mentioned that we have a lot of stuff. Because we wanted to
test things against each other
chris: e.g. deltaE, implemented 5 different variants
chris: wanted to compare visual result, performance
faceless2: ...
florian: Feels like what we need is the various objects and methods
to let you get from one to the other, and create mixes
florian: don't necessarily need all the operations to get from one
color to another color
florian: maybe need ? and ?, but methods to get between them, but
TypedOM doesn't need
chris: Do need an intermediate way to go between colors
chris: You use colors together, not in isolation
AmeliaBR: Base case would be converting single color into other
color spaces
AmeliaBR: so you can convert two colors into the same color space in
order to compare or calculate
AmeliaBR: Devs can implement the formulas that use whatever
parameterization of colors that they need
chris: Yep
Rossen: I agree
Rossen: That was initial motivation here, exposing the type that
will allow you to at least hoist the color space and its
values
Rossen: Having this type, you can start adding libraries around it
that do a bunch of math
Rossen: As we go forward, can identify which math goes into native
platform and which stays as library
Rossen: but not having basic type is a blocker
Rossen: My hope and ask for you, is to start defining what this type
should look like
Rossen: what is minimum set of parameters and stuff
Rossen: I see Tab and fremy still editing TypedOM, so work with them
to move it forward
fantasai: I want to note that Typed OM has also not been published
since 2018.
Concern about attributeStyleMap updating the style attribute
------------------------------------------------------------
github: https://github.com/w3c/css-houdini-drafts/issues/997
TabAtkins: I'm not sure if this is an actual concern to worry about
TabAtkins: Wanted implementor advice
TabAtkins: When doing high-frequency updates, like during TypedOM
TabAtkins: use single transform object, setting over and over again
TabAtkins: but are seeing the style attr get updated in real time as
well
TabAtkins: so reserialization happening constantly as well
TabAtkins: We saw as a performance concern
TabAtkins: So is this actually causing trouble?
<AmeliaBR> isn't this an observer effect of having Dev Tools open,
maybe?
TabAtkins: Person seems to believe causing perf issues, I'm not sure
myself
TabAtkins: but if we are eagerly reserializing to style attr, not
great. Negates a major advantage of TypedOM
TabAtkins: Apparently we don't ???
TabAtkins: but if you look in inspector, do see it being constantly
updated
TabAtkins: But either way..
emilio: Mutation observer thing, it should fire mutation observer
callbacks except in some cases
emilio: afaict, internally we don't serialize until asked for
emilio: if that's devtools, then we reserialize all the time
TabAtkins: If that's true across browsers, then I can close as no
change, browsers are smart enough to handle appropriately
don't worry about it
fremy: Meaning?
TabAtkins: Browsers aren't eagerly serializing
iank: File a bug against Chrome? we should investigate this
TabAtkins: Apparently Chrome doesn't fire mutation events
TabAtkins: that's a bug in chrome
fremy: Because we still want to update the style attr, every single
time
fremy: Can we put something in the spec that says when?
AmeliaBR: It's on demand
TabAtkins: When someone asks for it, or is observing the style attr
fremy: So flag it?
fremy: Ok
TabAtkins: Sounds like the resolution should be, browsers should be
smart enough to lazily serialize style attr when necessary
TabAtkins: I can put a note in the spec
AmeliaBR: One thing to consider, should this be a general thing for
DOM attributes reflected?
AmeliaBR: Working with CSSOM or other things to be consistent?
TabAtkins: yeah.....
TabAtkins: existing string OM, not doing any restringifying, but
sure there are some reflected attrs
TabAtkins: In HTML... I'll check if HTML has wording on that
ACTION: TabAtkins investigate restringification of reflected attrs
across OMs
<RRSAgent> records action 1
fremy: Not always the user that gets the style attr
fremy: e.g. if you have a selector that depends on the style
attribute's contents
fremy: Should never happen. Shouldn't change the DOM when
recomputing CSS
TabAtkins: DOM has it internally tracked, doesn't need to update
everything to keep consistent except on demand
emilio: Style attr keep not a string, but a CSS declaration and an
attached string
emilio: When request string, we serialize it
emilio: Someone requests DOM attr, will get the correct value
smfr: Normally we don't specify internal details
smfr: Would just be a QoI issue about when serialization happens
smfr: Spec shouldn't say anything, should just specify web-exposed
behavior
TabAtkins: Agree
TabAtkins: I will close no change, review HTML to see if they have
any particular wording
* fantasai thinks a note is useful to implementers, to pay attention
to the issue, though agree shouldn't be specced
AmeliaBR: Only other thing is to make sure wording is clear wrt
event hooks
AmeliaBR: Should trigger mutation observers even if not serialized
until asked for
ACTION: TabAtkins write a test for mutation observer for style attr
changes via TypedOM
<RRSAgent> records action 2
Simplifying away calc() wrappers around single values
-----------------------------------------------------
github: https://github.com/w3c/css-houdini-drafts/issues/968
TabAtkins: If serializing computed or used value of calc(), gets
simplified down
TabAtkins: at that point, you remove the calc() wrapper if
simplifies down to a single component
TabAtkins: This behavior doesn't happen in TypedOM
TabAtkins: it retains the calc() wrapper
TabAtkins: Not sure if we should try to adopt or not
TabAtkins: if particular impl concern, I don't have a strong
opinion...
AmeliaBR: From authoring side, if you wanted to go in and manipulate
the value in the wrapper and still have clamping effects
of calc()
AmeliaBR: e.g. calc(-5px) in property that's positive values only
AmeliaBR: Where the clamping value would be different with a plain
-5px. Not sure how clamping would be different in TypedOM.
TabAtkins: If you set a calc() it'll get that behavior, if you set a
simple numeric value it won't
TabAtkins: If you want to do math, can do it without having already
wrapped in calc regardless
TabAtkins: In particular, emilio brought this up in a CSS issue
emilio: I think getComputedValue is px value because can simplify
away, so I think everyone should do the same
emilio: Would be annoying in implementation to maintain that
information
emilio: about whether was wrapped in calc or not
TabAtkins: ok, propose to resolve that TypedOM reifies value as
simplified form
RESOLVED: TypedOM reifies values as simplified form (mirroring
getComputedStyle etc.)
<br dur=10min>
Using ObservableArray for the list-ish values in TypedOM
--------------------------------------------------------
github: https://github.com/w3c/css-houdini-drafts/issues/948
scribe: fremy
scribe's scribe: fantasai
TabAtkins: I tried to get better support for array-like classes in
WebIDL
TabAtkins: because we have three things that expose lists, and could
benefit from this
TabAtkins: but given I made no progress, I ended up using the legacy
"getter/indexer" of WebIDL
TabAtkins: but sadly that means that it's not an array
TabAtkins: and you cannot use forEach etc on them
TabAtkins: You have to convert them to an array first
<TabAtkins> https://heycam.github.io/webidl/#idl-observable-array
TabAtkins: but Domenic fixed this for me
TabAtkins: and we have the observable array type
TabAtkins: For the javascript user, it looks like an array
TabAtkins: but it still triggers callbacks that allow us to type
check things
TabAtkins: So I'd like to switch to that
TabAtkins: Unfortunately that would result in a breaking change
TabAtkins: Indeed, the value itself cannot be an array
TabAtkins: because it has to subclass the CSSValue type
TabAtkins: so we need to store the list in a "values" member
TabAtkins: For the math-value types, it's easier because it's
already a FrozenArray
TabAtkins: So I can just switch it
TabAtkins: Any objection to do this change?
AmeliaBR: So, if I understand, you now need to do "x.values[0]"
instead of "x[0]"?
TabAtkins: If I don't accommodate that by making a special behavior,
yes
AmeliaBR: Could we then make a putforward?
TabAtkins: Yes, we definitely can
TabAtkins: and we could do that by just updating the code to do that
and lookup in the array
AmeliaBR: Browser support?
TabAtkins: Yes, typedom is shipped in chrome
TabAtkins: because paint api
AmeliaBR: I would not like to break demos
TabAtkins: Yes, let's make the accommodation, it's not worth
breaking the demos
AmeliaBR: (restates)
TabAtkins: (yes)
fremy: I'm entirely in favor
fremy: Always thought it was really weird that ? and forwarding you
couldn't index it
fremy: so much cleaner for the API
fremy: not only improvement that you get an array
fremy: definitely in favor
fremy: and forwarding sounds like a no-brainer
TabAtkins: ok
TabAtkins: Any concern from implementers?
TabAtkins: Looks like no?
TabAtkins: Any objection to adopt the change in the issue, with
forwarding kept in?
RESOLVED: Put the list in a "value" property, and add a forwarding
for compat
Worklets
========
Ban data URL worklets
---------------------
github: https://github.com/w3c/css-houdini-drafts/issues/985
TabAtkins: Next topic comes from AnneVK
TabAtkins: You initialize a worklet by passing a url
TabAtkins: You can do that using a data url to avoid using the
network
TabAtkins: annevk says that this can be an issue
TabAtkins: for security reasons
TabAtkins: Blob urls would still work
TabAtkins: but data urls apparently have some issue
TabAtkins: Any comment?
AmeliaBR: Can we add a note showing how to use a blob url?
TabAtkins: Why not?
TabAtkins: Any suggestion?
RESOLVED: Ban data url from spawning a worker
Property Values API
===================
Make all the descriptors optional
---------------------------------
github: https://github.com/w3c/css-houdini-drafts/issues/994
AmeliaBR: With the at-property rule shipping, people started taking
a look
AmeliaBR: There were complaints that all the fields have to be
explicit
AmeliaBR: and this is not very css-y
AmeliaBR: In general, css does handle defaults better
AmeliaBR: and by making all these things be required, you remove
some behaviors
AmeliaBR: Reasons why people use this
AmeliaBR: - transition values
AmeliaBR: - prevent inheritance
AmeliaBR: - provide default value
AmeliaBR: You don't always want all three
AmeliaBR: and now you have to set all of them, which is not always
useful
AmeliaBR: Worse, you cannot say "this is a color or it is invalid"
TabAtkins: That default value thing is a different issue
TabAtkins: I agree we should fix this
TabAtkins: The other two cases
TabAtkins: the inheritance one is that in JS, true has a default
value is not logical
TabAtkins: and we don't want to default to inheritance, because this
is more costly
TabAtkins: but having the default be the revert of the normal choice
is confusing
TabAtkins: So, we think forcing people to think about this is good
TabAtkins: I think that issue is well settled, we really want to
keep this in
TabAtkins: For the syntax, we could use the unrestricted syntax "*"
as a default
TabAtkins: but I don't think that this is what you want
TabAtkins: because it cannot do anything useful for you with this
syntax
TabAtkins: If we make this required, authors get an error, and they
learn about this
TabAtkins: and they realize they could have a better behavior
TabAtkins: and "*" is not that common so I don't think it will be
common enough to warrant the default
TabAtkins: and there are other places in css where we force people
to specify a value even if we have an obvious default
TabAtkins: Like for example fonts
TabAtkins: we force you to say "serif" as fallback
TabAtkins: even though it could be implied
TabAtkins: but we thought forcing people to think about the fallback
is useful
AmeliaBR: You said that throwing an error makes more sense
AmeliaBR: but in the non-declarative syntax, this works differently
emilio: there are browsers where you can see CSS errors
emilio: ;-)
TabAtkins: I think this information is surfacable
TabAtkins: If some browsers have a less-than-useful way of surfacing
this, we can fix
TabAtkins: but I still think "hey this doesn't work" is better than
making it work less well
TabAtkins: AmeliaBR do you feel about this strongly?
AmeliaBR: Not a huge deal I guess, won't object
AmeliaBR: However, I think that the solution to the other issue is
very important
TabAtkins: Yes, that's another issue, and there is another thread
about that, and I think we are in agreement with what you
wanted?
AmeliaBR: Can you send a pointer?
TabAtkins: yes
<astearns> https://github.com/w3c/csswg-drafts/issues/5370
TabAtkins: So, it sounds like we should be able to resolve to close
this issue no change for now
TabAtkins: Any final objection?
RESOLVED: Keep all fields in @property required
Publication
===========
Rossen: We have lots of specs that are outdated and needs
republishing
Rossen: and most are just working drafts
Rossen: so republishing should be easy
Rossen: For example worklets
Rossen: No republication since 2016
Rossen: We only have one editor, iank
Rossen: and that is probably not a focus of his to update specs
Rossen: So, can we get another editor?
Rossen: Also, what other things do we need to do in worklets?
Rossen: because if not, can we get this to CR?
Rossen: (or, we merge it with html)
florian: I think we should update the working draft
florian: irrespective of whether we want to merge
florian: It only takes a few minutes to do
Rossen: there are a few issues in this spec
Rossen: but not much
Rossen: TabAtkins, anybody else could help contribute to this spec?
TabAtkins: I'm not sure
TabAtkins: Raymond Toy worked in web audio
TabAtkins: which use some aspects of worklets
TabAtkins: but not sure if there's desire to become editor
chris: there are also folks at mozilla implementing it
Rossen: who?
<chris> paul adenot, mozilla
AmeliaBR: Handing it over to the spec that explains the window
context makes sense
AmeliaBR: but I think updating the publication before sounds useful
RESOLVED: Update the worklet spec working draft
Rossen: We also need to republish layout paint typedom
Rossen: properties and values are ok though
fantasai: Can we talk about grid in the last few minutes?
Rossen: Yes, we don't need resolutions for the others
CSS Grid
========
Publication
-----------
<fantasai> https://drafts.csswg.org/css-grid-1/#changes
<fantasai> https://drafts.csswg.org/css-grid-1/issues-cr-2017
Rossen: We need to publish a new CR
fantasai: Yes, we have DoC, tests for changes, etc...
fantasai: and there is a lot of them, so we should really update
fantasai: There are a few issues left over for the next revision
fantasai: oriol said it would be ok to republish
fantasai: and I support
oriol: (confirms)
Rossen: Any objection to republish CR of Grid L1 with these changes?
RESOLVED: Update the CSS Grid L1 CR
Received on Sunday, 16 August 2020 12:05:36 UTC