[CSSWG] Minutes Telecon 2025-02-26 [css-values][css2][css-tables]

=========================================
  These are the official CSSWG minutes.
  Unless you're correcting the minutes,
 please respond by starting a new thread
   with an appropriate subject line.
=========================================


CSS Values
----------

  - RESOLVED: Accept the general approach, change map naming to scale
              for now, iterate on syntax later (Issue #6245:
              Interpolate values between breakpoints)

CSS2 & CSS Tables
-----------------

  - The group reviewed the proposed solution for issue #11408 (Do
      collapsed tracks also shrink the table wrapper box or only the
      table grid box?). The proposal made sense and was in the right
      direction, but there was a request to think more about handling
      wrapper and grid box sizes to see if there was a more expected
      outcome that could be achieved. Discussion will continue on
      github.
  - RESOLVED: Overflow applies to the wrapper box (Issue #10881: Does
              `overflow` apply to table-wrapper or table-grid?
              css-tables contradicts CSSWG resolution)

===== FULL MEETING MINUTES ======

Agenda: https://lists.w3.org/Archives/Public/www-style/2025Feb/0019.html

Present:
  Rachel Andrew
  Rossen Atanassov
  Tab Atkins-Bittner
  Kevin Babbitt
  Oriol Brufau
  Stephen Chenney
  Keith Cirkel
  Emilio Cobos Álvarez
  Elika Etemad
  Robert Flack
  Chris Harrelson
  Daniel Holbert
  Jonathan Kew
  Roman Komarov
  Alison Maher
  Cassondra Roberts
  Gaurav Singh Faujdar
  Miriam Suzanne
  Josh Tumath
  Bramus Van Damme
  Lea Verou
  Samuel Weinig

Scribe: bramus

Agenda
======

  Rossen: Any changes to the agenda?
  Rossen: Gonna skip the first issue
  Rossen: The reading flow one. got request to skip because some people
          not ready
  Rossen: One was removed, the other one will be skipped
  Rossen: Any other changes?

  astearns: Future agenda things
  <astearns> https://github.com/w3c/csswg-drafts/issues/11775
  astearns: next week starting off with overall issue from ChrisL about
            font privacy
  astearns: people from Brave will be joining
  astearns: talking about how are going to solve font fingerprinting
  astearns: have a good problem about the problems for privacy and lack
            of access for local fonts and bunch of different issues
            about possible solutions but have not gotten people
            volunteering to work on implementing and trying out these
  astearns: would like to get to this next week: some commitment to
            working on these things to get past the formal objection

  <astearns> https://github.com/orgs/w3c/projects/113/views/1
  astearns: second thing is we have this project (link^) that has a
            number of issues in flight for scope
  astearns: and scope is part of this years interop, so we should
            probably finish up
  astearns: especially the items in the in the progress section
  astearns: most likely will have a breakout session

  chrishtr: Want to come back to the agenda
  chrishtr: who requested to remove the reading flow issues?
  Rossen: a member, doesn't matter
  TabAtkins: we were discussing these already last week, weird that it
             gets pushed out
  Rossen: we respect the request of any member of the wg if they want
          to move because they need more time
  TabAtkins: bizarre that this is secret
  Rossen: if the person wanted to request this publicly then they would
          have done so
  TabAtkins: in general, we are not comfortable with things getting
             pushed away for secret reasons
  astearns: the reason is not secret, they needed more time
  TabAtkins: but nobody knows who it was, which is bizarre
  Rossen: this has happened before
  astearns: one thing we can do to make this better to post to the
            private list about it
  astearns: instead of sharing it on top of the meeting
  TabAtkins: yes, please
  <rachelandrew> +1 to that suggestion
  chrishtr: that’d be great, thank you.

CSS Values
==========

Interpolate values between breakpoints
--------------------------------------
  github: https://github.com/w3c/csswg-drafts/issues/6245

  TabAtkins: Elika and I were looking over this and there is a generic
             request to interpolate values based on some other progress
             value
  TabAtkins: can be done by hand with calc, but does not work for all
             values
  TabAtkins: or there are complex ways to interpolate
  TabAtkins: seems like a reasonable thing, that if you can do a
             transition, you can get the value for it too
  TabAtkins: upon review of the use-case, what we were trying in the
             spec was not good enough
  TabAtkins: currently not implemented, so can start over
  TabAtkins: new proposal
  <fantasai> Writeup is at
https://github.com/w3c/csswg-drafts/issues/6245#issuecomment-2661545284
  TabAtkins: two notions of interpolation
  TabAtkins: 1. mixing of two values
  TabAtkins: 2. interpolate values in series, more like linear() for
             timing or gradients
  TabAtkins: both are nearly identical, but when you reach 3 values
             they differ a lot
  TabAtkins: can model either with the other, but frustrating and weird
  TabAtkins: prop to introduce mix and map
  TabAtkins: mix = ...
  TabAtkins: syntax proposal in the issue
  TabAtkins: thoughts, ideas, ...?
  <weinig> are the existing spec'd functions the progress() functions?
  <fantasai> weinig: https://drafts.csswg.org/css-values-5/

  <lea> https://github.com/w3c/csswg-drafts/issues/6245#issuecomment-2685663483
  lea: posted my thoughts on this link here
  lea: when I started writing that I was not too crazy about
       introducing more functions
  lea: wanted to overload the existing mixing functions
  lea: but while writing my feedback it would make sens to have a new
       function (if it has a good name)
  lea: maps typically help you transform 1 value into another
  lea: (example)
  lea: several requests had to add mapping to css
  lea: even though something like calc-map() or whatever-map() it
       overloads the concept and now mapping is 2 diff things
  lea: also confusing to be using an established concept in a
       different way
  lea: interpolate is long and technical
  lea: brainstormed a bit (see table in comment)
  lea: leaning towards the name scale which gives a nice color-scale
  lea: and calc-scale
  lea: not ideal for images
  lea: also huge +1 for solving this use case
  lea: is major in design systems and tokens
  lea: so yeah
  TabAtkins: not attached to the name, we chose map because interpolate
             was bad for your reasons and its also short like mix
  <fantasai> +1
  TabAtkins: scale seems appropriate
  TabAtkins: having a whole family of related functions the worry
  <fantasai> We weren't particular about the name, just needed one.
  <astearns> a little worried about our existing scale property

  weinig: which of the css-values=5 functions is this replacing?
  TabAtkins: the mix functions, not the progress ones which are inputs
             to these
  weinig: got it
  weinig: other suggestion: blend
  weinig: because that is often the result
  weinig: problem with scale is that we already have scale()
  TabAtkins: only objection to blend is that it is a close synonym
             to mix
  <lea> +1 to TabAtkins . Also `blend` sounds related to blend modes
  TabAtkins: the better we can help authors remember which is which
             is good
  lea: +1
  lea: and also bend sound related to blending modes
  TabAtkins: Probably can't avoid some semantic overlap

  Rossen: Sounds like we are converging?
  fantasai: yes, want to go over what it is
  fantasai: the function takes a bunch of top level params and what the
            progress is within the scale and a list of stops similar to
            linear-gradient(0 with an interpolation option between the
            stops (easing function for example)
  fantasai: and then the top level options are a source for the
            progress, also giving you an option of transforming that
            source through an easing function, and an option saying
            each step gets its own easing
  fantasai: that is the top level
  fantasai: and then the stops have a syntax where it is `stop: value`
            and you interpolate between the stops
  <fantasai> color: color-map(media-progress(width, 0px, 2000px),
  <fantasai> 0%: red,
  <fantasai> 100%: blue);
  <fantasai> color: color-map(media(width),
  <fantasai> 0px: red,
  <fantasai> 2000px: blue);
  fantasai: also introducing new functions
  fantasai: percentages, pull the value out directly
  fantasai: pull out the start and end values, package them up together
            and put m in a variable
  fantasai: so the progress functions are worth keeping for that reason
  fantasai: Questions?

  lea: don't quite understand by vs each
  lea: its a good design goal to be compatible with gradients
  lea: it could even b ea design goal that everything in side
       color-scale is a valid gradient
  lea: good for release and debugging
  lea: the syntax with colons of positions and values. not sure the
       reduction with the rest of CSS is warranted by the usability adv
  lea: seems small
  lea: breaking compat is a good thing if it gives you a significant
       advantage, not sure that is the case here
  lea: suggestion to stick to existing syntax
  lea: we would need to make it mandatory that the stop position comes
       after the value in the calc version, as otherwise there would be
       disambiguation problems
  lea: where you can percentages
  <TabAtkins> animating-timing-function vs animation-easing
  fantasai: Difference between by and each is whether you are applying
            easing between two stops or to the entity of the progress
            value. Animations have this distinction. Can ease the
            entire timeline or in between keyframes.
  fantasai: have the ability to put easing between any two stops, or
            the whole thing upfront
  fantasai: that is the difference
  fantasai: about the colon in the stop syntax: that is because of the
            parsing ambiguity
  fantasai: can't know the return value upfront
  fantasai: other option is to align with if() and use semicolons
  fantasai: not sure though
  TabAtkins: there are certain value types make it ambiguous to read or
             actually ambiguous
  TabAtkins: e.g. calcs() sometimes hard to read
  TabAtkins: not obvious to a human sometimes
  TabAtkins: more problematic is the generic map() that can do entire
             property values
  TabAtkins: no way to know where the value ends
  TabAtkins: so have to either put the percentages in a distinguished
             place (like now) or only require 1
  TabAtkins: would not allow us to do 1 or 2 stops
  TabAtkins: because those functions have parsing difficulties if you
             try to mix things in, we decided to carry that through the
             whole family of functions
  TabAtkins: making most of map functions look similar to mix functions
             but then some not, looks worse
  <TabAtkins> 1 + 2px +3px
  lea: agree that consistency with each other is more important than
       consistency with the rest of CSS
  lea: not sure about the color … hard to read or disambiguation issue?
  lea: for the generic no amount of syntax would work other than
       putting it first
  fantasai: (missed) progress values. can have a stripe
  lea: is the generic function actually happening? remember we had one
       for mix but then had to drop it
  TabAtkins: multiway interpolation is trickier but if its just for map
             you are only interpolating two values at a time – we
             already know how to do that
  lea: this wont solve issue with generic, but at least for others we
       could introduce an at-keyword
  lea: like red at 50%
  lea: very readable
  TabAtkins: but unfortunately does not extend
  TabAtkins: not the best, happy to discuss precise syntax more
  TabAtkins: looking for objections about the general approach
  <fantasai> thought lea meant red @ 50%
  <lea> fantasai: no, I meant `at 50%`
  <fantasai> @ 50% might be kinda nice though :)
  <fantasai> It avoids any parsing issues since @ is not otherwise valid

  Rossen: so now are gonna stick with the map?
  TabAtkins: let's switch over to scale and continue discussing

  lea: do we have a proposed resolution? take on work?
  TabAtkins: yes: accept the approach we have outlined in the issue
             changing the map naming for scale and continue iterating
             on the design in the spec
  <lea> PROPOSED RESOLUTION: Accept the general approach, change map
        naming to scale for now, iterate on syntax later
  Rossen: sounds reasonable
  weinig: will the keyframes part remain as well?
  TabAtkins: that is the plan, but also up for discussion
  weinig: I think you should keep them
  fantasai: Questions for syntax were about the separator keywords by
            vs each and the name of the function
  <lea> Huge +1000 to solving this problem, this is huge. Some doubts
        about each (do we have use cases for it?) but we can sort out
        later
  lea: +1, like I said in IRC
  lea: its low level, but lack of being able to do this keeps cropping
       up all the time
  fantasai: yes, need to thank Scott for filing this and following up
            on it
  Rossen: Objections?
  Rossen: none, so we are resolved.

  RESOLVED: Accept the general approach, change map naming to scale for
            now, iterate on syntax later

CSS2 & CSS Tables
=================

Do collapsed tracks also shrink the table wrapper box or only the
    table grid box?
-----------------------------------------------------------------
  github: https://github.com/w3c/csswg-drafts/issues/11408

  oriol: first you layout the table without collapse, and then remove
         the collapsed tracks
  oriol: this is about collapsing of rows and cols
  oriol: typically it is the parent formatting context that decides the
         size of a box, but here it is like the table and this can
         confuse the parent FC
  oriol: was investigating what browsers do
  oriol: only checked gecko and blink
  <oriol> https://github.com/w3c/csswg-drafts/issues/11408#issuecomment-2563995794
  oriol: there is a table in this comment I linked to
  oriol: some shrink or do not shrink
  oriol: ?? they don't collapse which I think is right. would otherwise
         be bad if table is inside an inline-block
  oriol: when actually deciding final size of the table there are
         differences
  oriol: gecko has wrapper table box and ?? box, and blink only has
         single box.
  oriol: in the inline axis gecko does not shrink the table wrapper
         box, only the table grid box
  oriol: this has nice properties like avoiding conflicts with PFC
  oriol: some slightly surprising things like centering with auto
         margins it only centers the wrapper so could be off center
  oriol: blink has a single box and tries to shrink “both” things
  oriol: but it does not shrink in a flex row because it could conflict
         with flex sizing algo I think
  oriol: what does it mean if the table is suddenly shrinking?
  oriol: does not shrink for tables that have flex items in a row or if
         the table is abspos
  oriol: otherwise it behaves a if table wrapper shrinks
  oriol: for table grid gecko ??? it shrinks except for flex rows and
         abspos boxes
  oriol: things that are more interesting in the block axis: both try
         to shrink as much as possible
  oriol: but in flex columns no browsers shrinks the intrinsic block
         contributions
  oriol: for final size of the table wrapper blocks gecko ???, blink
         does not shrink the wrapper but does shrink the grid
  oriol: not sure what is going on.
  oriol: I like gecko’s inline-axis behavior
  oriol: not sure about the block
  oriol: like that a box can decide to if inline size conflicts with
         PFC it can shrink
  oriol: there are several things to discuss here

  iank: 1 thing I dislike is that when we set a height 100px on a table
        it will shrink both ??? seems like a ?? on the wrapper box side
  iank: if we end up with resolution that keeps the wrapper box at
        100px that would be good
  iank: some complexity … if all ?? size up to the inner grid box
  iank: not sure what to do there
  fantasai: for the margin case I wonder we could probably compensate
            for that by either having the auto margins also do
            something to the table grid box or just saying authors can
            use the alignment properties to align both boxes

  iank: oriol, can you say why you don't like affecting the intrinsic
        contributions?
  <oriol> https://github.com/w3c/csswg-drafts/issues/11408#issuecomment-2653101446
  oriol: see this link
  oriol: if you have a table that is inside an inline-block and the
         table has 2 cols, one of which is collapsed, and each column
         has a cell with min-content size of 50 and max content of 100
  oriol: if you don't take collapsed tracks into account the ?? of the
         table is 200px
  oriol: if we decided to change this, it could be 200 but removing 1
         col, so 100px
  oriol: problem is that when we lay out table for real, we only have
         100px of available space to give both cols
  oriol: so each would be 50px instead of 100px
  oriol: what will happen is that we end up with 1 col of 50px and its
         not the ideal size
  iank: makes sense
  iank: making intrinsic block contributions match inline contributions
        would be the right way to go there for consistency
  iank: and we likely are not constrained too much because webkit does
        not have this feature yet
  iank: might need to think a bit more about the wrapper and grid box
        sizes
  iank: the way that they work could be funky

  Rossen: Oriol, where do you want to take this?
  Rossen: the issue or try for a resolution?
  oriol: if Ian wants to think more about it, we can bring back to the
         issue
  oriol: this even belongs to CSS2, so a bit weird that we have this
  oriol: but can bring back to the issue
  iank: if you (oriol) write down possible solutions, that would be
        helpful
  iank: what you think is the best
  iank: I can also propose something
  Rossen: So let’s take it back to the issue
  Rossen: perhaps we can have a proposed resolution by the next time

Does `overflow` apply to table-wrapper or table-grid? css-tables
    contradicts CSSWG resolution
----------------------------------------------------------------
  github: https://github.com/w3c/csswg-drafts/issues/10881

  oriol: this is conflict regarding what box overflow applies to
  oriol: spec says that by default properties that you set on a table
         element apply to the grid not the wrapper
  oriol: and then for overflow it originally was not defined in CSS2
         but then it was added in an errata that the overflow applies
         to the box not the wrapper
  oriol: that was a resolution but only part of it got in CSS2
  oriol: but then in CSS3 that became the opposite
  oriol: so we should decide if it applies to the box or the wrapper
  oriol: elika is of the opinion that is more useful on the grid
  oriol: I tested if you use contain: paint it applies to the wrapper
  oriol: so would be Ok to apply to the grid
  oriol: reason tables-3 says it applies to the wrapper it is because
         of overflow oriol: which that applies to the wrapper
  oriol: so need to decide if it applies to the grid, affects transform
         styles of the grid or the wrapper, should it apply to the same
         box?
  oriol: not that familiar with transforms
  Rossen: Comments?

  dholbert: we got a bug filed on this a while back in firefox
  dholbert: spec maybe aligns with what gecko is doing
  dholbert: I did file bugs in chromium and webkit, but don't know the
            progress of those
  dholbert: this is about the overflow applying
  dholbert: IIRC the spec says wrapper

  iank: preference to apply to the wrapper making all of the ?? and
        transform style props to apply to the wrapper
  iank: like clip and clip-path
  iank: just for consistency
  iank: suspect it is like...debatable which is most useful
  iank: if someone wants to clip in the wrapper, then we allow clipping
        on the section elements which make that possible
  iank: so I would like to keep everything on the wrapper

  emilio: main difference here is whether caption and so on get clipped
  emilio: as an author I expect the ?? behavior that what scrolls
          decides the content of the table
  emilio: otherwise bottom captions become useless in scrollable tables
  emilio: would be odd to push ??? to the bottom of the scrollable table
  iank: you can't scroll right?
  oriol: values other than visible or hidden
  iank: overflow: scroll on a table does not do anything right now
  iank: like overflow hidden is treated as clip
  iank: so therefore preference to keep everything on the wrapper
  emilio: other thing we could do is apply to both, but could have
          observable difference
  emilio: in that case no strong preference though
  emilio: the caption thing still applies though right?
  emilio: I guess not, because you clip outside of the captions vs
          inside
  iank: yes
  <iank> I don't think we'll be able to make scrolling work from a
         compat point of view.

  fantasai: same thought as emilio: if we could make it scrollable
            obvious thing would be to scroll the table itself.
  bramus: people want that, along with sticky headers
  fantasai: if we want to do that eventually, would taking a decision
            to do it on the wrapper cause a problem?
  iank: tables and overflow:scroll have been around for long enough
  iank: they cant really be made scrollable because of style constraints
  iank: if you set `height` it does not add … intrinsic block sizes
        override that
  fantasai: in that case we'd need a new table-layout algorithm to make
            that work
  iank: not an easy path to make tables scrollable
  iank: substantial rework to how they work
  iank: what was your point about sticky headers?
  iank: we have sticky top rows, but sticky cols is a different problem

  Rossen: we are at time
  Rossen: not sure we can resolve right now, I think?
  Rossen: table scrolling will take up more time
  Rossen: seems like an interop nightmare
  iank: don't think we need to make tables scrollable int he near term
  iank: could back ourselves in a corner
  iank: if we ever make them scrollable, then we can change things
  iank: sticking on the wrapper
  fantasai: as you note, we'd need an opt into a different algorithm,
            so we could use that as a switch for overflow as well
  iank: putting it on the wrapper does not paint us into a corner
  Rossen: So can we decide on that?
  iank: if no-one objects, then yes
  PROPOSED RESOLUTION: overflow applies to the wrapper box

  RESOLVED: overflow applies to the wrapper box

Received on Thursday, 27 February 2025 00:37:28 UTC