[CSSWG] Minutes Telecon 2025-03-12 [css-view-transitions][css-align][css-anchor-position][css-text][css-sizing]

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


View Transitions
----------------

  - RESOLVED: view-transition-name:auto never matches an explicit
              view-transition-name:<ident> (Issue #11614:
              view-transition-name: auto when matching id should
              namespace)

CSS Align & Anchor Position
---------------------------

  - RESOLVED: Change the way medium-safety alignment is handled to
              instead invoke the scroll adjustment machinery when
              handling an anchorpos fixpos element (Issue #10860:
              Default safety and fixpos)

CSS Text
--------

  - RESOLVED: autospacing happens *after* bidi-reordering, and we'll
              add a complex example to the spec (Issue #10803: Spacing
              across element boundaries for BiDi content)

CSS Sizing
----------

  - RESOLVED: No normative change to spec, but add example like Oriol's
              and make the implication clearer in the spec. (Issue
              #10721: Content contribution of
              min-inline-size:fit-content and
              max-inline-size:fit-content)
  - RESOLVED: For the final step in determining natural sizes, use the
              determined aspect-ratio to coerce the block size to match
              (Issue #11236: How to transfer intrinsic keywords via
              aspect ratio?)
  - RESOLVED: Add a 'size' shorthand property (for 'width'/'height'),
              no relation to @page's 'size' descriptor (Issue #820:
              Adding a 'size' shorthand for 'width'/'height')
  - When discussing issue #11716 (Resolved value of min size properties
      doesn't round-trip) the group discovered that the proposed
      behavior may already be done in flex and grid. There wasn't time
      to discuss further on the call, but folks will investigate
      further to resolve next week.

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

Agenda: https://lists.w3.org/Archives/Public/www-style/2025Mar/0008.html

Present:
  Tab Atkins-Bittner
  Kevin Babbitt
  Oriol Brufau
  Keith Cirkel
  Yehonatan Daniv
  Elika Etemad
  Robert Flack
  Simran Gill
  Daniel Holbert
  Brian Kardell
  Brad Kemper
  Jonathan Kew
  Ian Kilpatrick
  Roman Komarov
  Vladimir Levin
  Alison Maher
  Florian Rivoal
  Cassondra Roberts
  Alan Stearns
  Miriam Suzanne
  Joshua Tumath
  Sam Weinig

Regrets:
  Chris Harrelson
  Bramus Van Damme

Scribe: TabAtkins
Scribe's scribe: noamr

Administrative
==============

  fantasai: Tim wanted to publish a FPWD of Forms?
  astearns: Yup, people should weigh in on the issue
  astearns: will take it up next week
  <fantasai> https://github.com/w3c/csswg-drafts/issues/6900#issuecomment-2715192840
  astearns: maybe should have co-editors?
  fantasai: I think jarhar has been co-editing, functionally speaking
  astearns: Luke would be a possibility too, they've been doing PRs.
            I'll get some co-editors together for next week.

  <astearns> https://wiki.csswg.org/planning/newyork-2025#new-york-f2f-april-2025
  astearns: First - register for NY meeting
  astearns: Attending in-person *or* virtually, put availability in the
            wiki so I can construct the agenda

CSS View Transitions
====================

view-transition-name: auto when matching id should namespace
------------------------------------------------------------
  github: https://github.com/w3c/csswg-drafts/issues/11614

  vmpstr: We added view-transition-name:auto
  vmpstr: matches the VT name based on the element's ID attribute, and
          acts as match-element otherwise
  vmpstr: This name isn't exposed anywhere, it's "auto" in
          serializations
  vmpstr: but wanted to clarify that the ID ident shouldn't match
          another VT that specifies a manual ident that happens to be
          the same
  vmpstr: Like `view-transition-name: foo` on one element and
          `view-transition-name:auto` on an element with id="foo"
          shouldn't match

  astearns: Looks like there's agreement in the thread
  astearns: Anyone in the room actually want the behavior we're
            prohibiting?
  <TabAtkins> sounds fine to me
  <TabAtkins> no opinion either way, really, happy to defer to editors
  <bkardell> makes sense
  <noamr> +1
  fantasai: I thought that's what we'd adopted originally, that the ID
            would only be used to link elements together, not something
            expose-able to other CSS. So this makes sense to me.

  vmpstr: proposed: view-transition-name:auto will never match an
          explicit view-transition-name:<ident>
  astearns: any objections?

  RESOLVED: view-transition-name:auto never matches an explicit
            view-transition-name:<ident>

CSS Align & Anchor Position
===========================

Default safety and fixpos
-------------------------
  github: https://github.com/w3c/csswg-drafts/issues/10860

  TabAtkins: A corner case in anchor positioning, common in certain
             situations. Original containing block, plus "safety". If
             something overflows the containing block it can still
             overflow until its original containing block
  TabAtkins: The problem is that for fixed positioning you'd get some
             bad behavior, because the original containing block is the
             viewport. If you scroll a bit you'd get bad overflowing
             behavior
  TabAtkins: Proposing to always to default a fixed position element to
             unsafe element, rather than default to the medium safety
  TabAtkins: This shouldn't have real effects to users of the feature,
             the element should remain on screen when possible, but
             it's a bit of a tweak

  astearns: Is this modifiable by the author?
  TabAtkins: This is just the default behavior if you don't say safe/
             unsafe on one of the alignment keywords
  TabAtkins: We shouldn't have the default do the wrong thing for
             common scenarios. We just propose to change the default
             safety
  fantasai: Re-adjust it to be as if it was safe?
  TabAtkins: The medium safety is correct but can't be implemented.
             Current definition of medium safety rely on layout
             information but not on scroll information
  TabAtkins: Anchor position can respond to scrolling. In order to do
             the medium safety, it can't work in the way defined in the
             space. We need to define it as unsafe in the layout and
             then correct it using the scroll adjustment behavior
  TabAtkins: Rather than layout time behavior creating the medium
             safety, it needs to be created by scroll adjustment, in
             order to be compositable
  <fantasai> https://github.com/w3c/csswg-drafts/issues/10999#issuecomment-2430366312
  <fantasai> This never got resolved either
  fantasai: I am glad that we're not changing the user observable
            behavior; no opinion about how we get there
  <TabAtkins> proposed: change the way medium-safety alignment is
              handled to instead invoke the scroll adjustment machinery
              when handling an anchorpos fixpos element
  <TabAtins> (note to the above IRC-only comment; the resolution was in
             the preceding comment, the edits were for that)

  RESOLVED: Change the way medium-safety alignment is handled to
            instead invoke the scroll adjustment machinery when
            handling an anchorpos fixpos element

CSS Text
========

Spacing across element boundaries for BiDi content
--------------------------------------------------
  github: https://github.com/w3c/csswg-drafts/issues/10803

  fantasai: So text-autospace inserts spaces between "changes" in a
            script
  fantasai: If you have Chinese with a little English, there should be
            some gap around the English otherwise it feels cramped
  fantasai: Question is what to do with bidi text
  fantasai: we don't insert space between Chinese text and a *symbol*,
            only between Chinese text and a letter
  fantasai: so if you had a stretch of rtl text, like Hebrew that ends
            with a symbol
  fantasai: and you give it a direction so it all flips
  fantasai: so symbol is on the left, Hebrew letters on the right
  fantasai: Chinese text before and after
  fantasai: if you insert space before reordering, you'll put it on the
            left side, which ends up between the Chinese text and the
            symbol, while the Hebrew and Chinese don't get a space
  fantasai: So correct answer is to manage the space in visual order,
            after bidi reordering
  fantasai: This is challenging, it interacts with linebreaking in
            awkward ways. Hard to get perfectly right without maybe
            some backtracking
  fantasai: so I think the correct answer is visual spacing
  fantasai: For practical purposes, might tolerate getting it wrong in
            some complex cases

  florian: Do we need to spec the allowance for getting it wrong?
  florian: Or just spec the right thing and expect people to get it
           wrong sometimes, but they should still try?
  fantasai: I'm not sure
  fantasai: I think it's important to make sure we get right - if both
            sides require spacing, it's done correctly, never get
            double space on one side
  fantasai: that's minimum bar
  astearns: I think we should specify what we want to see, without
            allowance, and only do that "getting it wrong is allowed"
            part if we have to
  fantasai: I think that's reasonable.
  fantasai: If authors are running into problems with certain cases,
            they can complain, and then we'll know those cases matter.
  astearns: So proposed resolution is we specify that autospacing is
            done after bidi reordering
  astearns: and you should never double auto-space any side
  fantasai: Yeah, that's implied

  florian: Do we want to add a note about it being hard?
  TabAtkins: Useful to acknowledge if something is significantly
             difficult
  TabAtkins: Here be dragons, when implementing
  fantasai: I think they'll notice
  astearns: Would be good to have at least one example, hopefully we
            can find a real-world example
  florian: Could have a note which is less silly than my earlier
           phrasing. "CSSWG acknowledge that the interaction of this
           with line-breaking may be challenging to implement"
  fantasai: or, as bkardell suggests, literally say "here be dragons"
  astearns: [restates proposed resolution]

  RESOLVED: autospacing happens *after* bidi-reordering, and we'll add
            a complex example to the spec

CSS Sizing
==========

Content contribution of min-inline-size:fit-content and
    max-inline-size:fit-content
-------------------------------------------------------
  github: https://github.com/w3c/csswg-drafts/issues/10721

  oriol: When you're computing intrinsic contribution of a fit-content
         element, what should happen?
  oriol: If you use fit-content on the preferred sizing property, it's
         clear that for the purpose of computing min-content
         contribution, you treat it as min-content; for max-content
         contribution, you treat it as max-content
  oriol: but if you use this keyword on min or max sizing properties,
         it's less clear what should happen
  oriol: What webkit does is it just ignores the keyword, so in a min
         property it treats as 0, in max it treats it as none
  oriol: Blink used to have the same behavior, but changed to align
         with Firefox
  oriol: Firefox behavior is, when computing intrinsic contributions,
         fit-content acts as min-content in min sizing property, and as
         max-content in a max sizing property
  oriol: I was implementing in servo and I think there's a better
         behavior, and I think it's what's actually specified in the
         spec, and is a bit simpler to implement
  <oriol> https://github.com/w3c/csswg-drafts/issues/10721#issuecomment-2414743959
  oriol: Some testcases ^^^
  oriol: In this testcase, magenta wrapper has a fixed width - first
         very narrow, then between, then wider
  oriol: element with black border is inline-block, so shrink-to-fit
  oriol: the inline-block contains one element with `width` to a huge
         amount, and max-width:fit-content
  oriol: so webkit ignores the max-width so the width makes it all
         explode
  oriol: Gecko and blink treat it as max-content, so the inline-block
         is always sized as max-content
  oriol: I think the servo column is better. Do the same for the three
         sizing props
  oriol: you always treat it as min-content when doing min-content
         contribution, and similar for max, for all three properties
  oriol: So if magenta wrapper is narrow you'll use the min-content
         contribution, if wide you'll use the max-content contribution,
         and if between it'll be between
  oriol: I think this is a better match for fit-content, trying to fit
         into the container
  oriol: so I propose the spec is right, and servo is right, and other
         browsers should match

  fantasai: Thanks for the fantastic examples
  fantasai: As editor, I think Servo's impl is correct. It reflects the
            author's request
  fantasai: In 2.1's definition of min/max sizing properties, it says
            you literally run layout by subbing in the value for
            'width' and then clamp appropriately; this matches that
            behavior as well

  iank: I think this is likely fine.
  iank: Hopefully no compat issues, but on the surface it's not too
        difficult for us to do

  astearns: So are we resolving the spec is correct?
  oriol: Yes
  iank: It's not obvious to me that the spec is correct, so clarifying
        would be good for the future
  oriol: At end of the issue I posted the quote of the spec that I
         think is backing the servo behavior, we can clarify or add
         some examples
  <TabAtkins> examples++
  fantasai: The spec doesn't make a distinction between what
            fit-content size means based on property, so I don't think
            it can support an interpretation that it works differently
            in the different properties
  astearns: So let's make that explicit
  astearns: So proposed resolution is we add examples like Oriol's and
            make the implication clear in the spec

  RESOLVED: No normative change to spec, but add example like Oriol's
            and make the implication clearer in the spec.

How to transfer intrinsic keywords via aspect ratio?
----------------------------------------------------
  github: https://github.com/w3c/csswg-drafts/issues/11236

  iank: Replaced elements have three things
  iank: natural width, natural height, natural aspect ratio
  iank: You can have a natural width of 20, height of 10, and ratio
        would be 2/1
  iank: it used to be possible (in svg, at least) to have the natural
        sizes not match the aspect ratio
  iank: This is more of a problem now with aspect-ratio property
  iank: can have natural width/height of 20px and 10px, and an
        aspect-ratio property of 1/1
  iank: so what happens
  iank: There's places where you're sizing a replaced element where you
        only look at natural sizes, but then the aspect ratio comes in
        (to transfer min-height to a width, for example), and they're
        disjoint
  iank: There's a step which normalizes the natural sizes and aspect
        ratio
  iank: I think simplest answer is we coerce the natural sizes to match
        the aspect ratio
  iank: so if your natural sizes are 20px/10px, and aspect-ratio is
        1/1, we coerce the block size to match and it becomes 20px/20px
        natural size
  iank: We have this normalization step for SVG. You can specify only a
        natural width, no natural height, yes natural aspect-ratio, and
        we harmonize the three together
  iank: so I think we should do the same when all three are specified
        but disagree

  astearns: When you say you don't care, you example had us adjusting
            the block natural size
  astearns: is the other option adjusting inline size...?
  iank: You could adjust block/inline/width/height
  fantasai: Or larger/smaller
  iank: Mild preference for adjusting block size
  fantasai: I think if we do this fixup, adjusting the block size makes
            sense
  fantasai: in most layout algorithms block size is the dependent size
  fantasai: aspect-ratio in general works that way, it prioritizes that
            dependency direction
  oriol: Yeah in my second comment, I say we adjust the block size when
         transferring. So I'd prefer to be analogous
  <TabAtkins> +1

  dholbert: Makes sense about aspect-ratio property
  dholbert: Without aspect-ratio I think this doesn't matter? SVG says
            to derive the intrinsic aspect-ratio from the intrinsic
            sizes if they're present, ignoring the view-box. Is that
            right, Ian?
  iank: I thought there was a case...
  iank: viewbox aspect ratio of 1/1, width=10 height=0
  iank: in that case the natural sizes are 10/0
  dholbert: Right, the 0 is equivalent to not having a size, not
            worried about that corner case
  iank: Okay, then yeah I think it's otherwise correct, we can discuss
        offline if necessary
  iank: A little icky with a 0 width or height, I think we have some
        compat for it rendering as 0 height, and this would change it
        to non-zero

  TabAtkins: So ignoring SVG complications, we can limit this to just
             aspect-ratio property?
  iank: I think we want this for aspect ratios generally
  iank: This is part of the normalization step, svg's aspect-ratio
        comes from the width/height, and only if that doesn't exist
        does it come from the viewbox
  iank: so now we'll take aspect-ratio property into account
  iank: This can also happen in contain-intrinsic-size, it gives a
        natural width/height
  iank: so this can't just be for the aspect-ratio property, need fixup
        to work consistently
  <dholbert> this is the SVG spec text I'm remembering RE getting
             aspect-ratio from width/height (if present), and falling
             back to viewBox (
https://svgwg.org/svg2-draft/coords.html#SizingSVGInCSS ).
             Just noting for reference; I'm on board with what IanK
             just described

  astearns: So this just applies to replaced?
  [some confusion, but yes]
  iank: Proposed resolution: for the final step in determining natural
        sizes, use the determined aspect-ratio to coerce the block size
        to match
  astearns: questions? objections?

  RESOLVED: For the final step in determining natural sizes, use the
            determined aspect-ratio to coerce the block size to match

Adding a 'size' shorthand for 'width'/'height'
----------------------------------------------
  github: https://github.com/w3c/csswg-drafts/issues/820

  fantasai: Wow this was old.
  fantasai: Not clear what to do here, but people want it solved
  fantasai: Complication is there's an existing size property in @page
            rules
  fantasai: and it's not equivalent to setting width/height
  fantasai: width/height apply to the page area
  fantasai: this is implemented by PDF renderers
  fantasai: Added this after chatting with emilio, who suggested maybe
            we just treat 'size' in @page specially, so they set a
            different size property, while everywhere else it's a
            shorthand
  fantasai: so wanted to know if it's viable
  <fantasai> https://github.com/w3c/csswg-drafts/issues/820#issuecomment-810626883
  <ntim> I like the idea

  astearns: Seems a little icky to have different processing based on
            where 'size' comes up
  astearns: but maybe in this case it's reasonable
  <TabAtkins> (I think there's not really any better solution. Also
              slightly icked but okay with it for the benefit.)
  florian: Yeah, unfortunate, but since the weirdness is so scoped it's
           probably okay

  oriol: In @page, it has descriptors not properties
  oriol: so a name conflict isn't *great* but not a big deal
         technically. Can just say that 'size' descriptor and 'size'
         shorthand are different

  emilio: I think this is the only way to make it work
  emilio: but maybe it could be cool to make 'size' in @page a legacy
          alias for some other name, like 'page-size'?
  emilio: that would be easier to implement, I think, then I don't need
          to deal with the name conflict as much.
  <florian> +1
  emilio: and maybe less confusing long term
  astearns: Do you have a mechanism to only apply an alias in one
            at-rule context?
  emilio: Yes, easily
  emilio: just within the @page descriptor, if descriptor name is
          'size' return 'page-size'
  <fantasai> https://github.com/w3c/csswg-drafts/issues/820#issuecomment-544582026
  fantasai: We'd previously resolved to make it an alias and have
            page-size be the name
  fantasai: Response we got was some products support JS and 'size' has
            been supported as long as PDF renderers have existed
  fantasai: so we could do aliasing, but would have to make sure it
            doesn't break CSSOM
  emilio: Yeah, aliases already work nicely for that

  ntim: Any usage data on 'size'? I guess Elika has answered the
        question
  ntim: Any browser have data?
  fantasai: Primary usage isn't in browsers, it's in pdf renderers. So
            big market difference in both content and userbase
  emilio: I think browsers do support 'size' in printing, it's fairly
          used
  iank: Yeah people generate PDFs from browsers all the time, and do
        use the 'size' descriptor
  iank: So the markets are actually pretty overlapping
  florian: And epub readers too
  florian: At least notionally, interactive pages user agents
  ntim: Common on web sites though?
  florian: When you print a web site, yeah, reasonably
  iank: Very common in enterprise use-cases to have printable pages
  iank: and they use @page on those
  <fantasai> https://www.w3.org/TR/css-cascade-5/#aliasing
  ntim: I ask because in webkit, @page is pretty poorly maintained and
        we haven't seen many bug reports
  iank: I suspect we have the best support among browsers here, and
        enterprises are just targeting Chrome for printing webapps
  astearns: So proposed resolution is we add 'size' shorthand property
            that has nothing to do with '@page/size'
  astearns: Concerns?

  RESOLVED: Add a 'size' shorthand property (for 'width'/'height'), no
            relation to @page's 'size' descriptor

  ntim: Would longhand be physical or logical
  fantasai: I think would have to be physical because that's how we
            generally handle shorthand properties with both directions
  fantasai: We map to the physical directions by default
  florian: Would be good to have a switch but we don't have yet
  ntim: Possible confusion with inline-size/block-size, versus width/
        height
  ntim: but otherwise fine with this
  emilio: Should we discuss the alias in @page?
  astearns: Separate issue
  emilio: I'll file one

Resolved value of min size properties doesn't round-trip
--------------------------------------------------------
  github: https://github.com/w3c/csswg-drafts/issues/11716

  oriol: Sizing 3 changed the initial value of min size properties. Was
         '0', now is 'auto'
  oriol: but for back-compat, on block/inline-block/inline/table, when
         you use gCS() 'auto' can serialize as 0
  oriol: Problem is Sizing 4 added aspect-ratio, and that makes 'auto'
         behave differently than 0 on those boxes
  oriol: so if you use gCS() you see 0, but it has a different meaning.
         if you assign it back, the value changes.
  oriol: So I propose if aspect-ratio is a non-initial value, the "auto
         can serialize to 0" hack isn't applied
  oriol: hopefully web compatible to change

  iank: I'm a little concerned. we already had auto problem for flex/
        grid, min-size:auto was treated differently too
  iank: didn't roundtrip there either
  iank: A little concerned that if gCS() starts returning 'auto' things
        could break. scared about compat.
  iank: mostly because this is the default
  iank: but width/height also don't fully roundtrip anyway
  emilio: I think they do in gecko, blink has some bugs with scrollbars
  iank: Nah, height:auto vs explicit value changes definiteness, which
        affects percents
  iank: so the idea that width/height roundtrips is a spec fiction
  emilio: Similar concern. I think in principle we should probably do
          this, but it does scare me compat-wise
  emilio: Can try it, see what happens
  emilio: Middle ground, maybe less scary, is doing this for layout
          boxes where we know it makes a difference, like for flex items
  emilio: but still not sure it's worth

  oriol: You mentioned flex items, for those it's already the case,
         'auto' serializes to 'auto'. it only serializes to 0 for
         block/inline/inline-block/tab
  oriol: So only *those* will change, and only when aspect-ratio is a
         non-initial value
  astearns: Out of time. Can resolve to try fixing this roundtripping,
            or take it back to the issue. Ian, emilio, preference?
  iank: Can we put it at start of call next week? want to check some
        things. I didn't realize we were already doing this for flex/
        grid items.
  emilio: Same. I think this makes it a bit less scary.
  astearns: So let's take it back to the issue. We'll revisit next week.
  astearns: HDR breakout in a few hours

Received on Wednesday, 12 March 2025 23:45:42 UTC