[CSSWG] Minutes Seoul F2F 2014-05-19 Part I: Flexbox

Flexbox
-------

  - RESOLVED: Close issue on whether 'flex-basis: auto' should resolve
              at computed value time. Clarify that the flex-basis auto
              flips to width/height at used value time.

  - The flex resolution algorithm has been redrafted since the LCWD to
    be closer to the structure of the earlier CR draft while preserving
    the changes to handle flex values continuously approaching zero.
    (Various technical errors reported in the LCWD have also been fixed.)
    The editors are requesting review from those interested.

  - Some concerns about handling the static positions of absolutely-positioned
    child of were discussed:
      - The group basically agreed to switch the flexbox/grid static position
        model to match a 0x0 static position placeholder box, but then also
        define that, depending on the alignment properties, the abspos child
        aligns relative to its static position differently.
      - This should give the same layout results as what's in the spec
right now.
      - A final resolution was held off until a decision could be made if the
        start point should be a box or a point.

===== FULL MINUTES BELOW ======

Present:
  Bruno Abinader
  Glenn Adams
  Rossen Atanassov
  Tab Atkins
  David Baron
  Adenilson Cavalcanti
  Dave Cramer
  Elika Etemad
  Daniel Glazman
  Dongwoo Joshua Im
  Koji Ishii
  Dael Jackson
  Philippe Le Hegaret
  Chris Lilley
  Peter Linss
  Shinyu Murakami
  Edward O'Connor
  Simon Pieters
  Liam Quin (phone only)
  Andrey Rybka
  Simon Sapin (phone only)
  Dirk Schulze (phone only)
  Alan Stearns
  Shane Stevens
  Jet Villegas
  Steve Zilles (phone only)
  5 observers in the back

Regrets:
  Anton Prowse
  Lea Verou

Agenda: http://wiki.csswg.org/planning/seoul-2014#agenda
Scribe: Dael

Agenda
------

  This discussion to set the agenda held no technical details.
  Please see the IRC log for full minutes:
       http://krijnhoetmer.nl/irc-logs/css/20140519#l-45

Flexbox
-------

  glazou: Let's start with flexbox
  TabAtkins: Okay.
  <fantasai> http://dev.w3.org/csswg/css-flexbox/issues-lc-20140325

  TabAtkins: So fantasai do we have anything except auto?
  fantasai: We got a few comments this week, but they're editorial.
  fantasai: We can't do CR right now, but we do have the issue of
            the computation of auto.
  TabAtkins: Let's do that one quick.
  <fantasai> http://dev.w3.org/csswg/css-flexbox/issues-lc-20140325#issue-13
  <TabAtkins> http://dev.w3.org/csswg/css-flexbox/#flex-basis-property

  TabAtkins: 'flex-basis: auto' is confusing right now.
  TabAtkins: If auto is the specified value of flex-basis it means you
             use the size property (width/height) in that dimension.
             Question is when it turns into that value because it needs
             to do that to compute.
  TabAtkins: Right now it's not very clear.
  TabAtkins: I proposed we should change so it transforms at computed
             value time.
  TabAtkins: So a 'flex-basis: auto' would become the appropriate
             width/height value, but the confusing bit is that that
             could also be 'auto'.

  fantasai: We discussed this two years ago.
  fantasai: We concluded that because auto means two things, if flex-basis
            is inherited we get odd behavior.
  fantasai: If you inherit the 'auto' keyword from your parent,
            you don't necessarily get 'auto' behavior -- you get whatever
            is specified for your width/height property.
  fantasai: But 'flex-basis' is a non-inherited property. Practically no one
            except QA is going to inherit 'flex-basis'.
  fantasai: So in theory confusing, but the lack of resolution for
            getComputedStyle is probably more confusing.

  dbaron: Does resolution of inheritance happen prior to the computation phase?
  TabAtkins: Yes. Similar to cascade.
  dbaron: I've always thought that was wrong and it's not how we implemented.
  fantasai: So do we need to fix cascade?
  dbaron: I think that while there are two ways to explain it, it doesn't
          matter as long as any computed value computed to itself.
  dbaron: Now we're making that not true. So now location in cascade
          matters, which means implementations might not match since they
          assumed equivalence.
  TabAtkins: So you're saying you processed at value computation.
  dbaron: Yes. I don't know if that's what other implementors do and
          I don't know how to test for it in a black box.
  TabAtkins: Shane says he thinks they have the same implementation.
  TabAtkins: We can change cascade.

  dbaron: Testing is worthwhile.
  TabAtkins: But you say it's not detectable except with flex.
  dbaron: Implementors might have to change their cascade to deal
          with it.
  fantasai: Before we have a used value of flex-basis.
  TabAtkins: It wasn't stated, but implied.
  TabAtkins: We want to do it at computed time so it's right.
  TabAtkins: We can still decide this independently.

  dbaron: It's odd for other reasons.
  TabAtkins: You can't feed GCS into style immediately
  TabAtkins: But we can't change that now. I made that mistake years
             ago.
  fantasai: Or we leave things as is.
  TabAtkins: Once we get usedStyle...

  TabAtkins: So are we okay with that weirdness of setting to
             computed value?
  dbaron: I'd prefer a used value time thing.
  TabAtkins: Is it okay for use to resolve to an end value?
  dbaron: How would that happen?
  TabAtkins: I guess it would resolve to used value of width
  TabAtkins: That's probably ok.
  zcorpan: I didn't follow what you said
  TabAtkins: We can't change the name of flex-basis auto value
  zcorpan: But you can change behavior.
  TabAtkins: Yes.
  TabAtkins: I was wanting to keep things that went to length to be
             at computed value time, but it's not huge.

  fantasai: So close no change?
  TabAtkins: Well, close and actually specify that flex-basis is
             resolved at used value time.
  fantasai: Close, clarify, no change.
  TabAtkins: Yep.
  TabAtkins: That's acceptable to me.
  TabAtkins: We're good. So the proposed resolution would be close
             this, spec properly that the flex-basis auto flips to
             width/height at used value time.
  glazou: Any objections?

  RESOLVED: Close issue, spec properly that the flex-basis auto
            flips to width/height at used value time

  glazou: Next issue?

  fantasai: There's one from Greg Whitworth that we have to think
            through.
  fantasai: The rest is editorial.
  TabAtkins: Greg posted one that we didn't get to that we'll have
             to work on tonight.

  TabAtkins: I'd like to discuss the algorithm changes.
  TabAtkins: The only major change since CR was...I said at last F2F
             I wanted to change the algorithm so that as the value
             approached 0 it was nice.
  TabAtkins: It ended up being a bit of a rewrite, and recently
             dholbert came up with a way to have the same effect,
            but in a way that's closer to the original language.
  TabAtkins: I think it's right, but if anyone is interested in
             algorithms please make sure that it maintains proper
             behavior.
  TabAtkins: That's the only issue left. I have both versions in
             spec and flagged. We're trying to switch to the CR
             version.
  TabAtkins: It looks like the old one, but approaches 0 properly.
  fantasai: We folded the changes from the LC comments into both versions.

  dbaron: This confuses me because you're talking about CR predating
          LC.
  TabAtkins: We're trying to go for 9.7.2, it should be equivalent
             to 9.7.1
  TabAtkins: We need to address Greg's issue tonight and make
             editorial changes. I think we can ask for CR tomorrow.
  TabAtkins: I think that's all on Flexbox right now.
  glazou: Okay.
  glazou: We'll move to transitions.

  Rossen: One question. Where did we leave auto for absolutes?
  TabAtkins: Would you like to discuss that? It's no change.
  Rossen: It's still open on the list. We can do it now or just us
          discuss it later.
  TabAtkins: Let's do it here.

  TabAtkins: Right now we have spec that grid and flex are similar
             for static positions of absolutely positioned child of
             flexbox.
  TabAtkins: The model now is you act as if the abspos is the only
             child, and where it goes according to the alignment
             properties is the static position.
  TabAtkins: If you set self-justify: center you'll have a thing
             where the abspos is centered in the flex container.
  TabAtkins: Rossen said that was confusing since you're not
             getting size from the flex container.
  TabAtkins: He thinks that should only apply if the flex container
             is the containing block for the abspos.
  TabAtkins: I don't have strong option, but I'm okay if we make
             this work in the containing block case, but I also
             don't have the problem with the existing.

  fantasai: I prefer that the static position be the same calculation
            for all children of the flex container, regardless of whether
            their containing block is the flex container or some other
            ancestor.
  fantasai: Everywhere else if you compute static position of an abspos,
            that's the position regardless of containing block.
  fantasai: I want the static position of the item to not depend on
            what its containing block is (like everywhere else).
  fantasai: If we do this, we have to calculate different ways, depending.
  fantasai: I don't think that's a good inconsistency.

  Rossen: I agree. I don't want something different based on the
          containing block.
  Rossen: This is what was introduced in grid first. When we did it
          we wanted to align grid items in grid.
  Rossen: However, that was only abspos items in the grid, with the
          grid as the containing block.
  Rossen: That kind of violated the rule fantasai stated.
  Rossen: Basically, the problem is with abspos layout, you compute
          the static position where the element's natural position
          would have been.
  Rossen: Then the participation of the element is done and you
          don't need to reconsider its hypothetical position.
  Rossen: Once you're in the abspos's containing block, you figure
          out where the item will be and then you size the item.
  Rossen: The problem with the way we have spec'ed auto position,
          you have to go back and fudge with static position to
          make it work so item appears centered in the flex box.
  Rossen: Even though the position between flex and the item is
          distant.
  Rossen: What we wanted to propose is to not find the static
          position, but to find where the static position applies.
  Rossen: So instead of static as the origin you can say it in
          relation to the box.
  Rossen: So you can work around the static position and center
          around it.
  Rossen: Instead of, after you've computed, reverse engineering
          the position.
  Rossen: When I mentioned this on the mailing list, I said we
          should do this in position spec.

  fantasai: So, you (Rossen) conceive of static position as a point
            to which the abspos start, start corner is attached.
  Rossen: Isn't it?
  fantasai: In the other models you don't do it that way. It's a box,
            not a point.
  fantasai: So you say static position is start, start and you have
            a small abspos wrt its container. It's aligned inside the
            box in the start-start corner. Fine.
  fantasai: But if you align the item to the center, it won't be centered;
            and if you align it to the end it will hang outside the box.
            This is asymmetric and won't be useful.
  fantasai: It would be better if alignment kept the item inside the
            box.

  dbaron: I think Rossen is describing a different way to get the
          same result.
  dbaron: I'm skeptical about this in the whole, and want to know
          about use cases.
  TabAtkins: Largely it's so that you can achieve centering with
             abspos.
  TabAtkins: Treating static more naively, it seems dumb. It's not
             what you would want in any case.
  TabAtkins: If you say just container center and it only uses that
             and goes to the side, it sounds stupid
  TabAtkins: In terms of author expectations, this is better.

  <dbaron> I'd be happy with just start, start corner.
  fantasai: If we want to do dumb, then just use the start, start corner.
  fantasai: This is trying to make it smarter, but ends up weird and not useful.
  fantasai: Either we should do something useful, or we should do
            something dumb and predictably useless.
  fantasai: Trying to make it kinda smart but failing to be useful,
            is not useful.

  dbaron: I'm okay with start, start corner.
  dbaron: This is a lot of code, but right now you have the flexbox
          model and you can escape into the old model, oh, and you
          can overlap your content.
  TabAtkins: Okay.
  dbaron: Is the disagreement the way to formulate?
  TabAtkins: I think so. I think his code assumes a simpler order.
             Rossen's ultimate model let's us position static
             naively and end in the right place
  dbaron: You may see static pos computation as a separate thing
          that can happen later.
  dbaron: I'm happy with Rossen's since it might be easier to
          implement.
  TabAtkins: The only things that play off are realpos, which isn't
             a thing.
  TabAtkins: It shouldn't have any detectable differences...
  dbaron: Famous last words.

  fantasai: I think if you want to compute static position, that if
            you store it, instead of a point, store as a box.
  Rossen: What's the relation between that and the box?
  fantasai: You store as a rectangle so in the case of most things
            it's a 0 height, but depending on if you are, it'll be
            that or the size of the 0 height.
  fantasai: Then it'll happen at the time of positioning. For flex
            it would be a flex container.
  dbaron: I don't think it makes sense as a rectangle
  dbaron: To fit into existing method you want an x coordinate and
          left-right-center alignment and a y coordinate with top-
          center-bottom alignment.
  Rossen: Which is what we did in grid.

  TabAtkins: Was this originally in grid and we changed it?
  TabAtkins: Are we okay with reformulating in those terms, assuming
             positioning will do this process later and better?
  fantasai: Can we discuss the rectangle later, with a white board?
  TabAtkins: Yes.

  Rossen: When you start counting all the modes you'll have fun
          with a rectangle. As an implementor I promise that a
          point will be conceptually easier.
  Rossen: I'm sure with a white board we can solve this in a few
          minutes.

  TabAtkins: So for now let's resolve for what Rossen said.
  fantasai: I don't want center and off to the side stuff.
  Rossen: Let me repeat.
  TabAtkins: Rossen wants identical behavior in a different way.
  TabAtkins: Let me write out this resolution.
  <TabAtkins> Proposed resolution: Switch the flexbox/grid abspos
              model to be more naive, just positioning a 0x0 box as
              currently specified, but then also define that, based
              on alignment, the abspos child aligns relative to its
              static position differently. Same layout results
              should be achieved.
  <TabAtkins> Such that "justify-content: center" puts the static
              pos in the center of the flexbox, and the abspos
              aligns its *center* with the static pos, rather than
              its start edge.
  TabAtkins: Okay.
  TabAtkins: Rossen is that right?
  Rossen: Yep.

  fantasai: So maybe we have both models in the spec, one as a note
            so people can think about it.
  fantasai: I think for authors it would be easier to talk about
            aligning the abspos within the box, but for implementors
            we can formulate in terms of static position point.
  TabAtkins: So. That sound fine for now?
  Rossen: For now. I think we're going in the right direction.
  TabAtkins: Now we can do transforms.

Received on Sunday, 8 June 2014 23:30:47 UTC