[CSSWG] Minutes Telecon 2025-09-24 [css-images][css2][css-sizing][css-align][css-tables][css-anchor-position][css-animations][web-animations]

=========================================
  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 Images
----------

  - RESOLVED: Update WD of css-images-4 (Issue #12756: Updated WD of
              CSS Images 4)

CSS 2 & Sizing
--------------

  - The group was given an overview of the proposal to address issue
      #12218 (How do min/max block sizes affect bottom margin collapse
      with last child?); first resolve intrinsic height, not including
      end margins of contents, then check the actual height, and if
      they're the same we allow collapse. Concerns were raised about
      the implications of how the proposal would handle height:auto and
      calc-size(). Discussion will return to the issue and a few
      interested folks will discuss more offline.

CSS Align
---------

  - RESOLVED: When resolving align-content:normal on a table cell, we
              use safe alignment (Issue #12220: Does `vertical-align`
              on table cell set `align-content` safely or not?)

CSS Tables & Sizing
-------------------

  - RESOLVED: width:max-content prevents table-layout:fixed from
              working (Issue #10937: What sizing keywords allow fixed
              table mode?)

CSS Anchor Position
-------------------

  - In order to determine the best solution for issue #12732
      (position-visibility: anchors-visible should be clear about when
      is visibility determined), the group will start by trying to
      understand what types of clipping should position-visibility be
      checking for. Once that is clear, the group can move on to answer
      some sub-questions.
  - RESOLVED: 'any' keyword is allowed wherever 'span-all' is allowed,
              and omitted values that would default to 'span-all'
              default to 'any' for queries (Issue #12610: Add `any`
              keyword support to `anchored(fallback)` container queries)
  - RESOLVED: No change for the default, we'll investigate a switch
              (Issue #12682: fallback-position behavior: spec vs.
              expectation)

Web Animations/CSS Animations
-----------------------------

  - RESOLVED: Syntax of animation-trigger is [<dashed-ident> <behavior/
              actions>]+# (Issue #12652: animation-trigger CSS syntax)

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

Agenda: https://lists.w3.org/Archives/Public/www-style/2025Sep/0016.html

Present:
  Rachel Andrew
  Tab Atkins-Bittner
  David Awogbemila
  Kevin Babbitt
  Oriol Brufau
  Kurt Catti-Schmidt
  Emilio Cobos Álvarez
  Yehonatan Daniv
  Elika Etemad
  Robert Flack
  Daniel Holbert
  Brian Kardell
  Jonathan Kew
  Roman Komarov
  Rune Lillesveen
  Chris Lilley
  Alison Maher
  David Marland
  Romain Menke
  Eric Meyer
  Cassondra Roberts
  Alan Stearns
  Miriam Suzanne
  Bramus Van Damme
  Anne van Kesteren
  Lea Verou

Regrets:
  Mason Freed
  Josh Tumath

Scribe: TabAtkins
Scribe's scribe: fantasai

Winter F2F Dates
================

  <fantasai> -> https://app.rallly.co/poll/JVvrK6xuIeIK
  fantasai: Reminder to fill out the poll for dates so we can plan the
            winter F2F!

Publications
============

Updated WD of CSS Images 4
--------------------------
  github: https://github.com/w3c/csswg-drafts/issues/12756

  RESOLVED: Update WD of css-images-4

Flexbox Publication
-------------------

  ChrisL: other is flexbox
  fantasai: last I checked, it needed Changes compiled, and I haven't
            finished that
  ChrisL: we were waiting on an edit from you, and you posted that
          you'd done it
  fantasai: yes. so now it's just compile the changes list and publish
  astearns: so let's get that Changes list updated, we'll come back to
            CRD when it is

CSS 2 & Sizing
==============

How do min/max block sizes affect bottom margin collapse with
    last child?
-------------------------------------------------------------
  github: https://github.com/w3c/csswg-drafts/issues/12218

  oriol: a container can collapse its bottom margins with its contents
         bottom margins *if* the height property computes to auto (plus
         border/padding/etc)
  oriol: but it's not clear how min-height and max-height should affect
         that
  oriol: behavior in webkit and servo is they just check 'height'. if
         it's auto, they collapse. even if min-height is large enough
         that the margins don't overlap
  oriol: I don't think this makes sense, want to change to match gecko
         and blink
  oriol: they check that the final height is the intrinsic height, and
         only allow collapsing bottom margins in that case
  oriol: some weird things. intrinsic height is 20px, max-height:0,
         min-height:20, the heights will match
  oriol: but the height that actually wins is an extrinsic height. if
         specified in 'height', that would prevent collapsing
  oriol: also not clear how this works with the intrinsic keywords in
         the *-height props
  oriol: Ian has a proposal in the issue which sounds fine to me
  oriol: we just stop checking that the height computes to auto
  oriol: instead we first resolve intrinsic height, not including end
         margins of contents, then check the actual height, and if
         they're the same we allow collapse
  oriol: I think this is fine, so long as it's web compatible
  oriol: not sure if Ian's on the call, but I suppose he's willing to
         try it

  iank: yes, I'm willing. scariest thing I can think of is if you have
        a container with height:100px, and a direct child with
        height:100% and margins, that margin will start poking out.
  iank: it already pokes out the top, so there's at least symmetry.
        it's a relatively simple change for us so we're willing to try
        it out
  oriol: so I guess we can resolve, and if it's not web-compat we can
         revisit

  fantasai: checking understanding...
  fantasai: you set height to 20px and intrinsic size happens to be
            20px, you'd collapse margins
  fantasai: but setting to 21px wouldn't allow collapse
  oriol: yeah
  fantasai: that seems like a problem if you're animating between
            values, just as you touch the intrinsic height
  fantasai: so I think it's not great
  fantasai: but sympathize with simplifying the logic
  oriol: good point. maybe instead of completely dropping the
         height:auto condition... we could keep it but
  oriol: for example, non-zero padding bottom. that prevents collapsing
         bottom margins. then you include the content margins into
         intrinsic height
  oriol: I think if height also prevents collapsing bottom margins, we
         should also include bottom margins in intrinsic height

  iank: not wild about that
  iank: note we already have the problem Elika brings up with animating
        max-height
  iank: and animating max-height is quite common
  emilio: and you almost always clip due to it being a BFC anyway
  fantasai: with max-height you don't have a single point, you have a
            flip point where you go from collapsing to not collapsing
  fantasai: this behavior is weird because you collapse at only one
            single point

  astearns: is that weirdness worse than the current, where things
            collapse or not only based on whether you have height:auto
            set?
  fantasai: I think that's worse, yeah. happy to extend the height:auto
            stuff to include intrinsic sizes
  fantasai: especially in block layout, all the intrinsics are
            equivalent
  fantasai: and height:auto is interesting because it's.... your BFC
            won't collapse anyway
  fantasai: I think if you have any kind of intrinsic size on height
            you can be allowed to collapse
  fantasai: but if your height value is a fixed size it shouldn't clamp

  iank: if we go down this route I'd like to do what blink does
  iank: we take the initial block size, and see if that's definite or
        not. that's subtlety different from checking the keywords
  iank: we try to resolve the block size with no intrinsic sizes,
        there's rules that fall out of that. calc-size() complicates,
        for example. and if that's indefinite we allow collapsing
        margins
  fantasai: not sure I understand
  iank: it's close... the reason we've gotten into this situation is
        the rule was written with css2 in mind, where only 'auto' was
        intrinsic
  iank: we've added so much more, especially calc-size()
  iank: so the current thing we do in blink is in each layout, you
        always calculate an intrinsic block size
  iank: I'd like to use the same logic here for margins
  fantasai: followed until the last
  iank: so we calculate the initial block size. if it's indefinite, we
        allow collapsing margins
  fantasai: is "initial block size" - what is it?
  iank: at the start of every layout algorithm you compute this size...
  fantasai: say a <p>, what's the initial
  iank: indefinite, since those are height:auto

  TabAtkins: Ian's brought up calc-size() a few times. I want to make
             sure calc-size(auto, 20px) is not meaningfully different
             from 20px
  TabAtkins: that should act, for all purposes, the same of having an
             actual intrinsic size of 20px
  TabAtkins: but because directly specifying 20px, would be nice if it
             matched 20px directly
  TabAtkins: but those should be the same, I think
  fantasai: I was gonna say opposite. it might make sense to have
            calc-size() always allow margin to collapse
  fantasai: the same as if it was just "auto"
  fantasai: margin collapse is just real weird with min/max etc. you
            can have margins collapse that aren't actually lined up, if
            you imagine margins as a transparent boundary around the
            element, because partial collapse doesn't exist. they
            either collapse or don't.
  fantasai: so having calc-size() behave as always collapse probably
            makes sense to me
  astearns: we're finding more ways to disagree, let's take this back
            to the issue
  <fantasai> iank, TabAtkins we can maybe discuss this on Friday if
             iank's in the office

CSS Align
=========

Does `vertical-align` on table cell set `align-content` safely or not?
----------------------------------------------------------------------
  github: https://github.com/w3c/csswg-drafts/issues/12220

  oriol: when align-content:normal on table-cell, spec says to use
         vertical-align
  oriol: so vertical-align:bottom acts like align-content:end
  oriol: in some corner cases it might be possible to have contents of
         a table cell overflow the cell
  oriol: these corners cases aren't very interoperable, but I could
         trigger them in both blink and webkit
  oriol: wondering if these alignments, then should be safe or not
  oriol: spec doesn't say whether it's safe or not, so I suppose it's
         the default safety
  oriol: but browsers don't agree with that or each other
  oriol: Gecko I couldn't trigger overflow anyway
  oriol: fantasai said probably safe is better, I'm fine with that
  fantasai: in general a lot of css2 stuff did safe overflow
  fantasai: it's a better default behavior in many cases
  fantasai: so given it's a legacy behavior, I'd prefer safety for
            vertical-align

  astearns: other comments?
  oriol: proposed resolution: when resolving align-content:normal on a
         table cell, we use safe alignment
  astearns: concerns?

  RESOLVED: when resolving align-content:normal on a table cell, we use
            safe alignment

CSS Tables & Sizing
===================

What sizing keywords allow fixed table mode?
--------------------------------------------
  github: https://github.com/w3c/csswg-drafts/issues/10937

  iank: we had a resolution to just have width:auto trigger fixed table
        layout
  iank: this isn't web-compat, there's a library that sets
        width:max-content on tables and assumes they'll go into
        fixed mode
  iank: so my proposal is we have width:auto *or* max-content, we
        trigger fixed layout.
  iank: not including a calc-size(), it's those keywords literally

  astearns: so just adding one more condition to the list?
  iank: yes

  oriol: correction, auto/max-content *prevent* fixed layout.
  fantasai: so you can set table-layout to fixed or auto. if you set
            'fixed', but width is 'auto' (or, proposed, max-content),
            you'll instead get auto layout.
  fantasai: can we instead just say that only extrinsic sizes allow
            fixed?
  iank: no, doesn't work
  oriol: also if we add more conditions it's harder to opt into this
         behavior
  <emilio> So we're resolving on Gecko's behavior right?
  astearns: so proposed resolution: add max-content to the list of
            exceptions that prevent table-layout:fixed
  iank: I believe yes, gecko's behavior

  RESOLVED: width:max-content prevents table-layout:fixed from working

CSS Anchor Position
===================

position-visibility: anchors-visible should be clear about when is
    visibility determined
------------------------------------------------------------------
  github: https://github.com/w3c/csswg-drafts/issues/12732

  emilio: the spec doesn't say when the anchor's visibility is checked
  emilio: and when I was looking to implement, I realized the spec
          technically allows....
  emilio: if it did something more complicated you could only do it as
          post layout
  emilio: but the clipping thing specified is at layout time
  emilio: the issue is about defining *when*
  emilio: webkit does it during layout. blink does some intersection
          observer thing, which is a bit more flexible
  emilio: but might be more confusing
  emilio: if you change layout in a way that overflows, then
          elementFromPoint(), whether that hit test succeeds or not
          depends on timing
  emilio: no strong opinion on what happens, just want it specified
  emilio: I think Tab added an edit
  emilio: should check with WebKit. and spec edit should use some of
          the post-layout things Rune is doing.
  TabAtkins: I specified "just before ResizeObserver", because that's
             what Philip said and Emilio agreed. More details would be
             great.
  emilio: it needs to be a bit more detailed, because ResizeObserver
          loop is more stuff - content-visibility, scroll size
          observer... it needs to be specced in a more detailed way.
          rune can give details

  futhark: sorry, don't have specific context on position-visibility,
           but it does make sense to happen at same time
  futhark: also on whether post-layout snapshot happens before or after
           resizeobserver
  futhark: ties in, I agree
  fantasai: I pinged Antti to see if he has feedback. I have no idea
            how this timing fits in with anything
  fantasai: I just want authors to have something that generally works.
            not sure to what extent we care about exact nuances beyond
            that
  fantasai: so how much of this is about authors caring about timing,
            and how much is about writing WPTs
  fantasai: so long as the author-observable behavior is something
            they're happy about, and we have interop on aspects that we
            need *for authors*

  emilio: not about locking things down. timing issue ends up... if we
          don't define it, we'll hit compat issues.
  emilio: it's pretty different observable behavior. if you do it
          before resize, then layout changes from an RO won't hide an
          anchor until next frame
  emilio: on flip side, if you do it during layout, that's most CSS-y
          it's not really observable, but it's less flexible. can't
          check for intersection with other elements.
  emilio: I'm assuming blink is actually reusing Intersection observer,
          which does a lot more than just checking scroll overflow
  emilio: that's a big behavior different, should use one or the other
  emilio: IO uses overflow-clip, o-c-margin, etc
  emilio: and those are probably something the author would expect
          to work
  fantasai: yeah, defining whether we check clip is definitely defined
  TabAtkins: I think that's already defined
  TabAtkins: We should define behavior we want
  emilio: right now I think spec is just overflow based

  astearns: so how to resolve on this?
  emilio: if we want to check IO things, we need to define a fixed
          point in the frame timing
  fantasai: I think we should just be checking for what's in the spec
            right now
  fantasai: if we did clip path and other stuff.... I don't think
            that's necessarily what authors would expect
  emilio: if you did this as an author you'd do IO
  fantasai: sure but I'm not convinced it's really what you *want*
  fantasai: so we have some questions to investigate. what do we think
            authors expect about clip behavior and anchor visibility?
            and the timing question
  fantasai: which depends on that first question, so let's answer that
            one first
  emilio: I think that makes sense
  emilio: I think spec currently only does check from the anchor to the
          CB of the positioned El, and that's another big change from IO
  fantasai: right, I think IO isn't what we want to do
  emilio: maybe. I think it's weird, for example, to not intersect with
          the viewport.
  astearns: take back to the issue, then?
  fantasai: yes

Add `any` keyword support to `anchored(fallback)` container queries
-------------------------------------------------------------------
  github: https://github.com/w3c/csswg-drafts/issues/12610

  fantasai: discussion about anchored() query for anchor-position-2,
            where you can ask which area it's anchored in
  fantasai: proposal was to add an 'any' keyword, combinable in the
            same way span-all is combinable, so you can query "I want
            to check if it's on the left, in any track"
  fantasai: Tim brought up that if you omit the keyword from an axis,
            it would make more sense to default it to 'any' in queries,
            rather than span-all like in the property
  fantasai: so proposal is that a duplicated keyword is duplicated as
            normal, but if it would instead default to span-all in the
            property, it defaults to 'any' in the query
  <TabAtkins> +1
  TabAtkins: Sounds good. Tim's argument makes sense.
  <fantasai> PROPOSED: 'any' keyword is allowed wherever 'span-all' is
             allowed, and omitted values that would default to
             'span-all' default to 'any' for queries.

  futhark: is it possible to ask for fpwd for anchor-position-2 once
           this is in?
  astearns: let's get this in first
  astearns: objections?

  RESOLVED: 'any' keyword is allowed wherever 'span-all' is allowed,
            and omitted values that would default to 'span-all' default
            to 'any' for queries.

  fantasai: I'd like a week to review the new spec before fpwd
  astearns: Rune, could you add a comment to #6900 to ask for
            publication next week?

Web Animations/CSS Animations
=============================

animation-trigger CSS syntax
----------------------------
  github: https://github.com/w3c/csswg-drafts/issues/12652#issuecomment-3292939040

  fantasai: two things. first here is the syntax of animation-trigger,
            which binds a named event to an animation
  fantasai: given that comma-separated is already used to align them
            with the animations
  fantasai: we need something else. could use a trigger() function, but
            maybe awkward
  fantasai: I think the current syntax proposed is to use space
            separation, with name first then actions
  fantasai: and because the event is syntax unique, it would go first
            and dictate what arguments would apply to it

  <flackr> something like [<dashed-ident> <behavior/actions>]+ ?
  fantasai: yes, like that
  flackr: seems reasonable
  ydaniv: sounds fine. Robert had some concerns about later having
          multiple triggers....
  flackr: that's implied here
  flackr: the dashed-ident doesn't clash with the behavior/action values
  fantasai: an alternative is to flip the order.... but that could be
            confusing
  proposed resolution: syntax of animation-trigger is [<dashed-ident>
      <behavior/actions>]+#

  RESOLVED: syntax of animation-trigger is [<dashed-ident> <behavior/
            actions>]+#

CSS Anchor Position (continued)
===============================

fallback-position behavior: spec vs. expectation
------------------------------------------------
  github: https://github.com/w3c/csswg-drafts/issues/12682

  fantasai: emeyer raised this. there was previously behavior
            differences in fallback choosing
  fantasai: we were previously greedy with fallback behavior
  TabAtkins: When you have multiple fallbacks, current spec behavior is
             to run through the list to pick the first one that doesn't
             overflow
  TabAtkins: If layout changes such that an earlier option would now be
             valid, current spec doesn't go back.
  TabAtkins: it only changes which fallback is used when your current
             fallback choice stops being valid
  TabAtkins: then it re-evaluates the list again
  TabAtkins: Alternate behavior is to check after every layout
  TabAtkins: so that you're always taking the most favorable option, if
             it is valid
  TabAtkins: This "greedy" behavior is what WebKit did have earlier,
             but spec has for some time focused on "stable" version
  TabAtkins: Eric noticed the different and ran some polls on what
             they prefer
  TabAtkins: Respondents seemed to strongly prefer the "greedy" behavior
  TabAtkins: If you resize an element such that first element causes
             overflow, and then the popover flips to the other side,
             then you widen element again, it still stays on that other
             side until you do something to make it invalid
  TabAtkins: Preference was to flip back to the first option if possible
  TabAtkins: fantasai and I discussed this, and a few points
  TabAtkins: We thought the preferred behavior might differ based on
             whether you are responding to layout changes, or whether
             you are responding to something more passive like scrolling
  TabAtkins: Also point out that you would need to re-run multiple
             anchor layouts every time layout changes if we went with
             "greedy" behavior
  TabAtkins: which is therefore less efficient

  emeyer: I ran the poll not because I had a preferred, but because I
          discovered there were two behaviors
  emeyer: when I put up the poll I expected it to be about 50/50
  emeyer: it wasn't, which is why I opened the issue
  emeyer: even in the small poll there was such a strong tilt
  emeyer: there are arguments in both the poll and the issue for both
          behavior
  emeyer: roman and I are probably in agreement that this should be
          switchable
  emeyer: as some people say, they'd prefer that, for a given layout
          state, the popover should always be in the same place
          regardless of history
  emeyer: in my slider example, a given slider position should always
          give a consistent label position
  emeyer: while a11y people said having things jump around more is an
          a11y problem
  emeyer: I don't think I have a strong preference but it needs to
          either be more clearly explained, or given authors an option

  kizu: I think we definitely need an option. each version has pros
        and cons
  kizu: I think current spec behavior is okay as default if it has
        better perf and makes less layout jumps
  kizu: but as seen by the poll, people do expect greedy behavior. it's
        what the libraries do.
  kizu: and it'll be needed for migrating from those js libraries, as
        the behavior change might not be wanted
  kizu: so I think current spec is okay for default if there's an
        option to have a less stateful version
  <emeyer> +1 to everything kizu just said

  emilio: I'd rather stick with the current spec behavior rather than
          having an option
  emilio: this option would mean running layout on scroll every time
          you're in any fallback beyond the first
  emilio: which is annoying
  emilio: for a small tooltip that's probably fine, but a sidebar,
          something big that's in a fallback state most of the time,
          that's not great

  fantasai: I think I agree with Emilio that running the choice algo on
            scroll is a bad idea
  fantasai: definitely not default to it
  fantasai: but for cases where you're running layout anyway,
            re-evaluating might not be that bad
  fantasai: so I'd be open to allowing greedy behavior but not for
            scroll. only for CB changes

  astearns: I'm hearing even the folks that want a switch are fine with
            current default
  astearns: should we resolve to use the current spec text as default,
            explore a switch in the issue?
  <TabAtkins> +1
  <Kurt> +1

  <fantasai> https://www.w3.org/TR/css-anchor-position/#position-try-order-property
  fantasai: a place to have the switch is probably in position-try-order

  astearns: proposed resolution is no change for the default, we'll
            investigate a switch
  astearns: objections?

  RESOLVED: no change for the default, we'll investigate a switch

  emilio: can we resolve on not being greedy on scroll changes?
  <fantasai> SUMMARY: Significant concern about re-running selection on
             scroll
  astearns: we'll discuss whether we have the greedy switch at all
  emilio: ok

Received on Thursday, 25 September 2025 23:32:44 UTC