[CSSWG] Minutes Telecon 2025-05-21 [css-values][css-ui][css-selectors][mediaqueries][css-borders]

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


Scribing
--------

  - The group will experiment with creating a scribe rota to help
      expedite the process of selecting a scribe each call. If you are
      interested in being on the rota, please add your name to the wiki
      here: https://wiki.csswg.org/planning/scribing

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

  - RESOLVED: Explicitly allow tree-counting functions in container
              queries (Issue #10982: Disallow mix/random/tree-counting
              functions in some contexts)

CSS UI, Media Queries & Selectors
---------------------------------

  - RESOLVED: Working on scrolling queries (Issue #6400: Expose current
              scrolling direction)

CSS Borders
-----------

  - RESOLVED: Reduce all radii in order to avoid overlap of shapes
              (Issue #12098: Consider constraining radii for concave
              corner-shape when opposite corners overlap)
  - There was some initial preferences toward the third option, add
      env(hairline), to resolve issue #3720 (Add a 'hairline'
      border-width value). Several questions were unresolved on the
      proposal at the end of the call time, so discussion will continue
      on github and a future call.

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

Agenda: https://lists.w3.org/Archives/Public/www-style/2025May/0007.html

Present:
  Rossen Atanassov
  Tab Atkins-Bittner
  Kevin Babbitt
  Justin Breiland
  Oriol Brufau
  Keith Cirkel
  Emilio Cobos Álvarez
  Yehonatan Daniv
  Elika Etemad
  Robert Flack
  Simon Fraser
  Daniel Holbert
  Roman Komarov
  David Leininger
  Vladimir Levin
  Rune Lillesveen
  Alison Maher
  Eric Meyer
  Cassondra Roberts
  Noam Rosenthal
  Miriam Suzanne
  Josh Tumath
  Munira Tursunova
  Lea Verou
  Sam Weinig

Regrets:
  David Baron

Scribe: fantasai
Scribe's scribe: TabAtkins

Scribing
========

  <JoshT> https://lists.w3.org/Archives/Member/w3c-css-wg/2025AprJun/0062.html
  JoshT: I'm concerned how some people in the WG scribe more often than
         others, desire to give them a rest
  JoshT: Also want to help people feel more confident scribing
  JoshT: Proposal is to create a list of people who would like to scribe
  JoshT: We would go through the list and pick the next scribe
  JoshT: If someone is absent and sending regrets, skip to next person
         and they will swap
  JoshT: Initially some positive feedback on emails
  JoshT: But yesterday/today also some emails about people who aren't
         sure
  JoshT: And maybe being able to scribe more ad-hoc is more useful
  JoshT: You don't know what's going to happen that day, maybe you're
         tired at the end of the European day
  JoshT: If people approve this, I can make a wiki page to note this
         down
  JoshT: links to how to scribe, etc.
  JoshT: and we'll try to make a list of ~8 people who can scribe
  JoshT: I'll ask on the call if people want to be on the scribe rota

  Rossen: Seems like a great initiative. Also might be good to have an
          ad-hoc list
  Rossen: Hopefully will make it easier for people to come forward

  lea: I think the general idea is good, but need to work on details. I
       assume that missing person goes to next telcon
  lea: One problem is it formalizes who is regular and who isn't
  lea: Not just that it could be a barrier to participation, but
       sometimes who is regular varies over time
  lea: But as long as we can flesh out the details, could be a good
       thing

  fantasai: My suggestion is that rather than going down the list -
            that requires handling exceptions, etc
  fantasai: rather than rotating I suggest picking a random person from
            the list each time
  fantasai: so people don't have to maintain state across telcons, but
            over time it'll be distributed
  fantasai: if someone can't make it, just skip past them
  fantasai: I suggest [missed] rolling [missed] for the n

  JoshT: My concern with randomness is that it's not fair, could choose
         the same person multiple time
  <TabAtkins> Note that we can do a useful randomness with some
              history, yeah.
  <lea> there are randomness algos where we ensure a fair distribution
  <lea> yup, what TabAtkins said

  kbabbitt: Support idea. I'd be happy to join. Haven't volunteered
            recently because of injury, but otherwise happy to join.
  kbabbitt: If person wants to speak, maybe next person becomes backup
            scribe?

  Rossen: Overall hearing positive feedback, and definitely support
          this myself
  Rossen: Josh, how about you put together that wiki strawman proposal?
  Rossen: We can figure out the details in no time
  <TabAtkins> (I like the rota idea in general, but I'm fine with one
              of us "good scribes" being the usual person to turn to
              when the scriber is talking. ^_^)
  JoshT: If you're willing to sign up, note in IRC

  POLL: Do you want to volunteer to scribe?
  <fantasai> +1
  <JoshT> +1
  <kbabbitt> +1
  <ydaniv> +1
  <emilio> +1 (when permitted)
  <TabAtkins> +1 (obvs)

  <JoshT> Here is the initial draft of the scribe rota. If you asked to
          sign up and I missed your name, please add your name.
          https://wiki.csswg.org/planning/scribing

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

Disallow mix/random/tree-counting functions in some contexts
------------------------------------------------------------
  github: https://github.com/w3c/csswg-drafts/issues/10982

  futhark: Some functions are only possible in some contexts, e.g.
           property declarations or other places where we have an
           element context
  futhark: descriptors, media queries, etc. don't have element context
  futhark: For font-relative units we fall back to the default font,
           but no such fallback for sibling-index()
  futhark: Conclusion is to drop such functions at parse-time as
           invalid where they don't make sense
  futhark: we can add back case-by-case if something makes sense
  futhark: One question is with regards to container queries, which
           does have an element context: should we allow such functions
           in container values?

  weinig: These issues speak to a need, when defining CSS functions, to
          have a table that specifies how they operate and what
          contexts they're allowed in
  weinig: Quite a matrix now, that each function needs to think about
  weinig: like properties, standard set of questions to answer, would
          be helpful
  <TabAtkins> +1 to finding the set of constraints that we should
              formalize around

  emilio: Agree this is an issue, and container queries is interesting
  emilio: I suspect it might be annoying to invalidate on container
          queries, and I can't think of a good use case... not that
          people might not come up with one
  emilio: So my preference would be to start by disallowing, and if
          people ask for it, we can enable later
  emilio: but also ok if people think it's useful to have
  futhark: For style queries, we currently parse as a non-registered
           property, so we don't know until we're finished parsing that
           it's not a property
  futhark: if it's a registered query
  emilio: I was thinking about container queries like size container
          queries and such
  futhark: That too. But with regards to style queries specifically
  emilio: For style queries... I am not sure I follow, can't you just
          disallow those functions while parsing?
  emilio: That maybe presumes those functions wouldn't be part of the
          syntax
  futhark: When you parse the property the first time, you don't have a
           registered property on the first pass. So you don't know if
           it's a sibling-index()

  miriam: If we disallow any of these, we should consider one at a time
          in container queries
  miriam: I do think there might be use cases, so I wouldn't want to
          take as a group
  miriam: because here they would have a meaning, so we'd disallow for
          some other reason

  weinig: Another way to think of this is to reverse it, and say, for
          each context where CSS values can be used, we should define
          what types of CSS values are allowed
  weinig: For instance, if relative units aren't allowed, but you're
          using <<number>> a calc() with relative units wouldn't be
          allowed
  weinig: It's both these unique contexts, and these unique values,
          that have certain dependencies
  weinig: Probably you want one or the other, but maybe both?
  weinig: But need to figure out what the constraints are, to define
          that matrix
  futhark: I'm fine with starting by disallowing these functions in
           contexts where you don't have an element

  futhark: If I understood you , Mia, you're fine with not supporting
           anything and then bringing in each function that has a need?
  miriam: Is there a good reason to start that way?
  miriam: I think there are going to be use case for these, and we do
          have a context for them
  miriam: so want to know if there are particular reasons not to
          support them
  futhark: I've been working with sibling-index() and sibling-count(),
           we have an implementation, haven't found any problems

  weinig: I think just going and disallowing in some context is too
          simplistic
  weinig: disallowing wholeheartedly, would disallow calc() with
          certain values
  weinig: It's a more complicated question, which elements in which
          contexts
  <TabAtkins> Yeah, math functions don't bring any context requirements
              *themselves*, just their contents
  futhark: would it make sense to start with tree-counting functions,
           separately?
  futhark: or would that be too wide
  weinig: It's a problem to do one-off restrictions, rather than
          figuring out the system
  weinig: We'd have to look at the whole landscape again
  weinig: so now is the time to define these characteristics

  futhark: Can we get a resolution on container queries to explicitly
           allow tree-counting functions for now?
  weinig: Sounds reasonable to me
  weinig: we think CQ will have an element context, so seems reasonable
          to allow them now, and formalize more later
  futhark: So we can extend the CQ spec, which currently talks about
           font-relative units. We can expand to include tree-counting
           functions
  <miriam> +1
  futhark: Then let's resolve that now, and continue the rest of the
           discussion

  emilio: I just wanted to note, regarding complexity, the one that's
          annoying is inserting an element in the DOM, assuming index
          of container ....
  emilio: Right now :has() has this problem, too, needs to invalidate
          deeper to invalidate random elements in arbitrary parts of
          the tree
  emilio: The usual stuff doesn't have this complexity
  emilio: it's a lot more non-local than using it in property
          declarations
  emilio: That said, it *can* be implemented, so I'm fine allowing it
  futhark: Similar issue with keyframe animations
  futhark: so multiple cases of it

  fantasai: If there are use cases, then it's worth doing the extra
            work; if not, it's not worth doing
  futhark: I would expect there to be use cases for style queries in
           particular, because computed style can use sibling-index()
           so it would be natural to allow
  Rossen: So this is an academic expectation rather than a practical one
  miriam: I'm trying to encourage expectation that things in CQ resolve
          based on the container, and the more that's true the easier
          that is to teach
  miriam: Things can resolve because we have a container to resolve
          against

  futhark: Proposed to explicitly allow tree-counting functions in CQ
  PROPOSED: Explicitly allow tree-counting functions in container
            queries
  Rossen: Any additional points or objections?

  RESOLVED: Explicitly allow tree-counting functions in container
            queries

CSS UI, Media Queries & Selectors
=================================

Expose current scrolling direction
----------------------------------
  github: https://github.com/w3c/csswg-drafts/issues/6400

  TabAtkins: We have a whole batch of scroll-related container queries
  TabAtkins: There are a lot of use cases in this space, particularly
             about knowing the last known scroll direction
  TabAtkins: Two questions are: what's most recent scroll direction.
             Other is what is current scrolling direction.
  TabAtkins: Hidey UI is like this on mobile
  TabAtkins: Some discussion about velocity and other things that might
             be better to handle as scroll animations
  TabAtkins: There's an explainer in the issue

  smfr: In general this seems reasonable. Went through explainer,
        didn't see any explanation of rubber-banding
  smfr: I don't think we want to expose that change in direction to web
        content
  smfr: Also curious, what happens for scrolls that result from content
        changes
  smfr: i.e. scrolls that scroll anchoring tries to prevent
  smfr: Could end up with circularity, or oscillating between two
        states -- we see this often with JS-driven changes
  TabAtkins: I think the answer should be that we base this on
             user-driven scrolling, so not script-driven or
             content-driven
  TabAtkins: that would avoid these circularity issues
  <flackr> +1
  TabAtkins: And it's close to impossible to detect in JS, could
             address directly this way
  TabAtkins: Don't think there's a use case for script scrolling for
             these things
  smfr: Seems surprising, because wouldn't an animated scroll to 0,0
        want to show/hide these bars?
  TabAtkins: possibly, but at that point you're scripting, so why not
             just script it
  <flackr> I think at least scroll anchoring should not count,
           programmatic scrolling may be interesting
  [missed]
  Rossen: what about autoscrolling?
  TabAtkins: that's still scrolling

  TabAtkins: Wanted to ask if group wants to pursue this idea
  ntim: Not sure I'm convinced by answer that if we invoke script we
        can just invoke more script
  ntim: The way you write the query is @container scroll-state(), and
        if you invoke script and you can't change that state, then you
        have to duplicate your CSS to support a class
  ntim: And also have your scroll direction query
  ntim: It would be duplicated into 2 places, if you invoke script to
        manipulate the state
  <flackr> I think we can explore this with an example of how this
           would be done
  TabAtkins: Question of what to do about script-driven scrolls is
             something to think more about, so let's discuss in the
             issues

  fantasai: You don't necessarily have to introduce a class, could do
            it with a property
  fantasai: and put that in the CQ
  flackr: Directionally, should we consider whether "last scrolling
          direction" is thing we should pursue first, because it comes
          up in all use cases, and active scrolling direction can be
          pursued afterwards?
  TabAtkins: Problems are easier and more common for recent scroll vs
             active scroll
  flackr: Agree
  flackr: Active scroll might need extra capabilities

  Rossen: Any objections to this direction?
  fantasai: We need to figure out what to do with active scroll, so
            we're designing a coherent syntax space for when it is
            tackled

  RESOLVED: Working on scrolling queries

CSS Borders
===========

Consider constraining radii for concave corner-shape when opposite
    corners overlap
------------------------------------------------------------------
  github: https://github.com/w3c/csswg-drafts/issues/12098

  noamr: Right now we constrain radius when there is a corner overlap
  noamr: but we don't constrain for diagonals, because these can't
         overlap in convex shapes
  noamr: but for concave shapes they can
  noamr: so question is how do we constrain these?
  noamr: Right now shrinking is all corners by a ratio
  noamr: enough to avoid overlap of radii
  noamr: Here I'm doing the same thing. If the shapes intersect, I
         shrink both so that they don't touch
  noamr: Here proposal is in green
  noamr: Both corners shrink by same ratio, and aspect ratios are
         maintained

  <TabAtkins> "Hull" here is defined by the tangent at the center point
              intersecting the horizontal/vertical?

  fantasai: [missed] all the principles that led to the original
            conflict formula
  fantasai: probably want to shrink all the radiuses, not just the two
            intersecting
  fantasai: [missed more]
  noamr: Keeps the shape, I like that
  TabAtkins: But we don't do that with current case
  TabAtkins: We don't do that for adjacent overlaps, so I'm not sure
             why we'd shrink everything in a diagonal overlap
  <fantasai> https://www.w3.org/TR/css-backgrounds-3/#corner-overlap
  fantasai: You reduce all of the radii
  <fantasai> "When the sum of any two adjacent border radii exceeds the
             size of the border box, UAs must proportionally reduce the
             used values of all border radii until none of them
             overlap."
  <fantasai> ALL radii
  <TabAtkins> I'm wrong, fantasai is right, we do shirnk all of them
  <TabAtkins> https://software.hixie.ch/utilities/js/live-dom-viewer/saved/13807
  <TabAtkins> So we should shrink all of them, and jsut use the largest
              necessary factor between all four adjacent pairs and two
              diagonal pairs

  smfr: If you have convex and concave shapes, then you have some
        complex constraints
  smfr: how do you do that
  noamr: First constrain adjacent ones, then constrain the opposite ones
  smfr: Maybe that works, yeah

  flackr: Another possibility would be that we don't shrink and the
          border becomes a straight line
  noamr: Wanted something consistent with adjacent borders
  smfr: I don't think we should, the math is already super complicated

  TabAtkins: fantasai was right, we do shrink all of the corners if one
             pair is too large
  TabAtkins: see demo ^
  TabAtkins: so we should be consistent, find the shrink factors
             necessary for all four adjacent corners and the diagonal
             corners ,and just apply the largest one to all the corners
  fantasai: the reason we did it this way was to preserve the shape as
            much as possible. anything else distorts the shape
  PROPOSED: Reduce all radii in order to avoid overlap

  RESOLVED: Reduce all radii in order to avoid overlap of shapes

Add a 'hairline' border-width value
-----------------------------------
  github: https://github.com/w3c/csswg-drafts/issues/3720
  <Rossen> https://github.com/w3c/csswg-drafts/issues/3720#issuecomment-2864297026

  TabAtkins: Options I see here: 1) hairline keyword to border-width
             and inside calc(), 2) add a hairline unit, 3) add a
             function, e.g. border-round() or env(hairline)
  TabAtkins: benefit of keyword is it's easiest to write
  TabAtkins: but downside is grammatical ambiguity means might not be
             able to use it everywhere easily, need to wrap in calc()
             some places
  TabAtkins: The other two options don't have these downsides
  TabAtkins: but several people don't like the usability of the unit,
             looks weird, I agree
  TabAtkins: shortest option but funky
  TabAtkins: Function might be the best way to go
  <TabAtkins> env(hairline)
  TabAtkins: Question of what is appropriate hairline is an
             environmental info, so my proposal is env(hairline)
  <kizu> +1 to env(hairline)
  <romain> Those that do want it as a unit can make one from the env()
           with the (unimplemented) custom unit feature.

  emilio: My concern with env(hairline) is that it behaves differently
          with CSS zoom
  emilio: You multiply by zoom, but as long as less than hairline,
          would be rounded to device hairline
  emilio: whereas if you have a device hairline, get pixels, and zoom
          the pixels
  emilio: zoom could make the hairline invisible
  <lea> Is env() allowed anywhere the other options would be?
  TabAtkins: Zooming down could shrink to invisibility, but could
             [missed]
  emilio: If you had border: env(hairline) and something relies on that
          value to match, zooming out, the lengths would no longer
          match because borders are still rounded up
  emilio: that's a subtle difference
  emilio: considering everything, I think env(hairline) is the best
          option

  smfr: Are you referring to non-scaling-stroke emilio?
  smfr: I don't think we want that
  TabAtkins: Not the explicit goal but if you have a sufficiently small
             length it can behave like that
  TabAtkins: he's not asking for that as a goal
  smfr: So if scale() is used it'd get thicker?
  TabAtkins: Yeah that's not a question

  <lea> I wonder if it may make sense to figure out what a hairline
        should resolve to before we name it. E.g. if it resolves to a
        device pixel, that is a reasonable unit in itself. If it
        doesn't resolve to that, then I'm having trouble
        conceptualizing what it resolves to.
  <TabAtkins> it does not resolve to a specific device pixel, Lea

  fantasai: I think I'd prefer a border-round() function
  fantasai: I'd call it pixel-round()
  fantasai: I'd prefer to avoid giving the idea that it's possible to
            do your layout in device pixels

  lea: 3 things
  lea: not making it a unit makes sense if we only use multiple of one.
  lea: env() seems to make sense... is it disallowed anywhere that
       could otherwise be allowed?
  lea: would it make sense to figure out what a hairline resolves to?
  lea: when would I use a hairline unit?
  lea: I would conceptualize as a device pixel
  lea: so as an author, I don't know, and it's too vague
  lea: might make sense to figure that out first
  <fantasai> +1 lea

  TabAtkins: We keep running out of time, so let's do this first next
             week
  <astearns> or could do an async
  TabAtkins: Use cases for multiples if you need to match another
             element to width of element with hairline borders, might
             need 2x
  TabAtkins: env() is allowed everywhere
  TabAtkins: Finally, what does it resolve to? It will resolve to some
             multiple of a device pixel, not necessarily 1. As screens
             become higher res, device pixels might be too small to be
             a reasonable hairline

Received on Thursday, 22 May 2025 23:14:46 UTC