- From: Dael Jackson <daelcss@gmail.com>
- Date: Thu, 19 Jul 2018 20:26:30 -0400
- To: www-style@w3.org
=========================================
These are the official CSSWG minutes.
Unless you're correcting the minutes,
Please respond by starting a new thread
with an appropriate subject line.
=========================================
Initial Letters
---------------
- RESOLVED: Raised initial is justified as normal. (Issue #884)
- RESOLVED: For sunk initials, the initial letter box’s start margin
edge is anchored to the start edge of the line (after
first-line 'text-indent'), and alignment happens
afterwards in the remaining space on the line. (Issue
#884)
- RESOLVED: Sunken initial letters suppress justification between
the initial letter and subsequent text. (Issue #884)
- RESOLVED: Clear doesn't apply to initial letters. (Issue #360
and #689)
- RESOLVED: Initial letters must not overlap floats (just like
lineboxes don't). (Issue #360 and #689)
- RESOLVED: If a linebox moves down or is shortened due to a
float, initial letter moves with it, and vice versa.
(Issue #360 and #689)
- RESOLVED: An inline-start float originating on first line can
go between initial letter and containing block edge.
[It can't split the initial letter and the
subsequent text.] (Issue #360 and #689)
- RESOLVED: An inline-start float originating on subsequent
impacted lines must clear the initial letter. (Issue
#360 and #689)
- Discussed interaction of inline-end floats with initial letters.
There was some disagreement, and the group worked through
various models for describing initial letters to work through
that interaction.
https://lists.w3.org/Archives/Public/www-archive/2018Jul/att-0001/IMG_2702.JPG
https://lists.w3.org/Archives/Public/www-archive/2018Jul/att-0000/IMG_2701.JPG
Further discussion on the exact model used to describe initial
letters and their impact on inline-end floats was deferred to
later.
===== FULL MINUTES BELOW ======
Agenda: https://wiki.csswg.org/planning/sydney-2018#schedule
Scribe: TabAtkins
Initial Letters
===============
Rossen: Dave, you have the issues in some order?
fantasai: There's in an email order.
<fantasai> https://lists.w3.org/Archives/Public/www-style/2018Jun/0020.html
dauwhe: That's fine.
fantasai: First issue, 884
initial letter and text-align
-----------------------------
github: https://github.com/w3c/csswg-drafts/issues/884#issuecomment-392114382
fantasai: So how does initial-letter interact with text-align?
fantasai: Proposal is that for raised initials, no special behavior,
it just aligns as specified.
fantasai: Sunk initials, suggestion is that initial-letter box's
start margin edge is anchored to start edge of the line,
then text-indent works on the rest of the text on the
line. It also suppresses justification between the
initial-letter and subsequent text.
fantasai: Say you have a bunch of Chinese characters and
inter-character spacing, you don't want spacing between
initial-letter and first normal text letter on first line,
but not on subsequent lines (because they're not "next" to
the initial letter).
fantasai: So instead they're flush on all lines.
dbaron: I'm a little worried about the justification part.
dbaron: Thinking about initial letters that are single-letter words,
like English "A" or "I". Especially with wide justification,
seems like it'll look weird.
dbaron: The justification from word spaces seems different than
inter-character.
fantasai: Justification opportunities *on the space* are different
than justification *between* two letters. It'll still
justify in that case.
dbaron: Ah, that wasn't clear. Sounds good, but I want more clarity
in that when it's written into the spec.
fantasai: So three separate resolutions here.
<florian> I looked into it, I like it. (all 3)
fantasai: First, for raised initials, alignment is honored as usual.
Rossen: Seems uncontroversial.
dauwhe: It's just a big letter.
RESOLVED: Raised initial is justified as normal.
fantasai: Second is that sunk initials are attached to the start
edge of the line, then alignment affects the rest of the
line.
[myles draws a picture, it looks kinda weird]
fantasai: We couldn't come up with anything better than that.
florian: We couldn't find any use-cases, we just selected the
simplest thing that wasn't horrible.
dbaron: Do you ever actually see initial letters that aren't flush
against the left edge?
<dbaron> (where the left edge might be a shape rather than a
straight edge)
dauwhe: I've made some examples where you can set an explicit width
on the ::first-letter and then right-align the
initial-letter in that block, so the letters themselves
aren't flush against the start edge.
<tantek> the example dauwhe mentioned (I thought I heard)
http://tantek.com/2015/224/b1/alphabet-indieweb
<dauwhe> tantek: yes :)
myles: What were the other options considered?
dauwhe: Florian put some suggestions into the issue.
florian: That was a long time ago...
florian: One of my proposals was - do two steps. 1, do the "attached
to start edge, then align rest of text", then 2 flush it
with text as much as you can.
florian: But that didn't seem good.
myles: I could think of a few scenarios, but this is probably best.
myles: A third is just lay out first line right-justified, place
first letter, then try to place everything else. That sucks.
myles: Fourth is make it not sunken, but it's probably more
important to honor the sunken request.
myles: Uncommon enough we can maybe consider it an error case.
Probably not worth doing a two-pass for that.
myles: So out of those four options, I think current proposal is
best.
fantasai: Another is lay out all the lines that are affected
start-aligned, then apply alignment to all the lines at
once.
florian: I think that's what I suggested, the two-pass
dbaron: I think it's slightly different.
[fantasai draws out their suggestions]
dbaron: That's different, but I think florian's is slightly better
for right-alignment, while I think fantasai's is bad for
right-alignment. Lines won't necessarily be flush.
florian: Since we do consider this an error case, I agree we don't
need to do either two-pass.
myles: [question about diagram fantasai drew]
myles: All of these suck.
dbaron: You could constrain the later lines to be shorter than the
first, but it's a lot of work...
myles: I just think this is rare enough that it just won't really
matter what we pick.
fantasai: I suggest to add a note to the spec that we don't expect
this to be used, so if you actually need this to work a
particular way, let us know.
Rossen: This is the current behavior, too.
Rossen: Objections?
RESOLVED: For sunk initials, the initial letter box’s start margin
edge is anchored to the start edge of the line (after
first-line 'text-indent'), and alignment happens
afterwards in the remaining space on the line.
fantasai: Third part is initial-letter suppresses justification
opportunities between the initial-letter and subsequent
text. Specifically about between two characters, not about
spaces or other stretchy characters.
myles: Doesn't that fall out?
fantasai: No, it's considered part of the first line's text, so
typesetting rules between the initial letter and subsequent
text still apply.
myles: So when you center the first line, that text will include the
first letter, even tho we just resolved it won't be
centered...
<myles> So the first line's width is the full width, and
justification/centering includes the width of the first
letter, but the second line (when the first letter is
sunken) has a shortened line-box, and the centering doesn't
include the width of the first-letter inside the calculation
<fantasai>: yes
Rossen: Any objections?
RESOLVED: sunken initial letters suppress justification between the
initial letter and subsequent text.
Interaction with Floats
-----------------------
github: https://github.com/w3c/csswg-drafts/issues/360 and
https://github.com/w3c/csswg-drafts/issues/689
fantasai: Based on minutes from earlier F2F, we made a bunch of
changes to the spec.
fantasai: Specific things were:
<fantasai> https://github.com/w3c/csswg-drafts/issues/360#issuecomment-392128995
[Issue bullets:
- Clear does not apply to initial letters, nor does it clear
them.
- Initial letters must not overlap floats, just like line boxes
must not overlap floats.
- If a line box moves down or is shortened due to a float, the
initial letter moves with it and vice versa.
- An inline-start float originating on the first line goes
between the initial letter and the inline-start containing
block edge.
- An inline-start float originating on subsequent impacted lines
must clear the initial letter.
]
fantasai: There's a bunch of illustrations in the issue.
<fantasai> https://github.com/w3c/csswg-drafts/issues/360#issuecomment-270734813
<fantasai> https://github.com/w3c/csswg-drafts/issues/360#issuecomment-270760193
astearns: For last one, if you consider initial-letter as part of
the first line, it falls out of the float behavior.
fantasai: For floats on first line, going with first illustration;
for floats on subsequent lines, going with last.
dauwhe: The middle blue example is something we really want to
avoid, so that's what we worked out the rules for.
Rossen: What happens if there was a second left float that comes
between "discontent" and "made"
fantasai: Depends on if it's on first or second line. Then just
follow the rules.
fantasai: If on the second line, then the floats because the float
is taller than the initial letter. It clears the initial
letter, but doesn't clear the float.
<dbaron> proposal is the first example in the blue examples, and the
last example in the green examples, right?
<TabAtkins> yes, dbaron
[rossen draws picture of a drop-cap, float right anchored in second
line]
https://lists.w3.org/Archives/Public/www-archive/2018Jul/att-0001/IMG_2702.JPG
astearns: That float in that example - the top edge of the float
can't be positioned above the bottom edge of the line box
of preceding content, which includes the initial letter.
fantasai: No reason to clear it for right floats...
[multiple people] Oh no, that's bad.
iank: You need to do it for both.
dbaron: You get into fun issues if you start getting right floats
that actually fill most of the block
dbaron: You can then have a right float that bumps into the first
letter.
fantasai: Then it wouldn't fit in that second line and has to move
down
dbaron: To say that, you have to rewrite a bunch of text to *say* it
won't fit, because text is currently about line boxes, and
per that, there's nothing there right now (initial letter
isn't in the line box)
Rossen: Positioning a large right float is the same as positioning a
normal left float.
tantek: 2.1 algorithm assumes rectangle line boxes.
tantek: for fitting floats
tantek: A lot of its reasoning is simplified as a result.
tantek: If you assume non-rectangular, you'll have to rethink those
steps. Might be desirable, but we can't assume it'll "Just
Work".
fantasai: Line boxes stack with zero distance between them; if this
was about line box getting taller, second line would have
to clear the initial letter too, so that's a false model.
<tantek> yeah, I'm gonna need you to define non-rectangular line
boxes
astearns: So we'd need to redefine some of the float behavior to say
that, in the left-float case you set it as far left as you
can without going above the line content (includes the
initial letter), but for right float it can't go above the
bottom of the actual line box.
astearns: If the float geometry doesn't intrude into the
first-letter geometry.
dbaron: fantasai said in Seattle we had said we wanted the right
floats to still be able to have their top at one of the
intermediate lines.
dbaron: Some of the complexity is around that.
dbaron: I think there's an argument against that.
dbaron: If you have right and left floats, you still need to have
the rule that a float's top can't be above the top of a
previous float.
dbaron: So sometimes if you have a left float, a right float will
get pushed down anyway below the initial letter.
dbaron: So you're creating an inconsistent state where right floats
are *sometimes* (indirectly) affected by the initial letter,
so why not all the time?
tantek: That would seem to be making the simple case bad so complex
case works better.
dbaron: I think it's good both ways.
* dauwhe needs to do some drawings
tantek: We need to decide what we want lineboxes to look like.
tantek: It sounds like people's expectations are [missed]
[trailed off]
[Tantek draws two diagrams of line boxes, where the left side has a
non-rectangular outline around the initial letter and its line
box, with the second line tucked inside that L an subsequent
lines. Then another diagram where the first line box is
rectangular, and the second line is inside it tucked in the
bottom right corner.]
https://lists.w3.org/Archives/Public/www-archive/2018Jul/att-0000/IMG_2701.JPG
tantek: Start with a consistent linebox model, and figure out what
consistent behaviors you get.
myles: If you use non-rectangular thing don't call it a box...
[mumbly discussion around the whiteboard]
[dbaron draws another diagram where the first line box is
rectangular, but only single-height high. The second line box is
shortened, so there's a gap on the left]
dbaron: We have three diagrams here.
dbaron: A two-line dropcap.
dbaron: In all three, the second linebox is shorter as a result,
third and fourth are full-length.
dbaron: Question is first linebox.
dbaron: In first, linebox is rectangle enclosing both lines.
dbaron: In second, linebox is sideways L enclosing drop-cap and
first line text.
dbaron: In third, linebox is rectangle enclosing the entirety of
first-line (only top half of drop cap)
fantasai: I think we should use third.
tantek: That doesn't give you floating behavior rossen wants.
fantasai: We can define some behaviors for the initial letter, like
it shortens the second linebox, or that floats can't hit
it and must clear.
Rossen: Problem is that you want initial-letter to act like a float
sometimes and not others, and that's weird.
tantek: Worse is that you sometimes want it to cause floats to clear
after, and sometimes don't.
iank: Emil and I were discussing some tricky cases
iank: A lot can be simplified if you treat the A as some special
type of float, and also apply top-edge alignment rules, gets
much simpler.
iank: Apply top-edge alignment rule to initial letter, and
additional rule that all subsequent floats will clear that
initial letter.
iank: (the rule that floats can't go higher the preceding floats)
[iank drew a small right float followed by a large right float. Then
tried to place initial-letter'ed line next to the floats.]
iank: If you apply the additional constraint that the initial letter
is always treated as a float, and has the top-edge alignment
rule, it gets pushed down.
dbaron: I don't think we want that blank space that'll result...
dbaron: You need to assert that there's enough room for the initial
letter, but shouldn't need to assert that it's past all
floats.
iank: That's makes things very hard for us
[iank asserted that since the initial-letter follows top edge
alignment rule, it has to move down to at least the top edge of
the second float]
[dbaron said we don't want to do that - that we don't want that
extra space]
Rossen: One thing to make impls easy...
Rossen: Three models for line box.
Rossen: If we go with the box that always includes the initial
letter as part of its bounds (#1), then that's
straightforward for impls.
Rossen: You have a line which is tall enough, it'll get cleared by
either float.
Rossen: The one contentious case is that if we have a right float on
second line, it could have fit, but it'll get pushed down to
clear the initial-letter instead.
Rossen: But that's consistent with itself and with our current
model, it's the 2.1 float algo.
Rossen: Only different is that there's a linebox that extends past
its initial line of content.
dauwhe: The existing impl of this treats initial -letter as floats,
and this gives a lot of bad behavior. If we can minimize bad
behavior that's great, but these can't just be pure floats.
dbaron: Rossen convinced me that 1 is better model.
fantasai: That'll make weird alignment
dbaron: Going with model 1 - this is linebox for float rules -
requires fewer edits to float rules, and produces pretty
sensible results.
florian: Not the height of the linebox for *other* purposes, just
for floats.
tantek: I see appeal, but it makes the feature potentially worse
than using floats to fake first letter.
tantek: That would let right-floating items be fully up, not pushed
down.
tantek: So subsequent left floats would go beneath first letter,
subsequent right floats wouldn't need to.
florian: Other things break when you do it like that tho.
fantasai: An issue I didn't want to get into today was what dbaron
raised: what's the linebox model for initial letters?
fantasai: You need a linebox for the letter, it has styling and
content.
fantasai: Need a linebox for it, for vertical alignment. Etc.
fantasai: So I think we need two *overlapping* lineboxes. You can
say they're same width (model 1), but we don't need to.
tantek: That works.
Rossen: So in that model, if you have a left float that would fit,
why would it move down
fantasai: Rule is that you can't have linebox between float and the
containing block, so it can't sit there next to the
initial letter.
<fantasai> https://github.com/w3c/csswg-drafts/issues/360#issuecomment-270760193
fantasai: What you're looking at there ^ is Dave's green examples,
you just used a tiny float to make it look more confusing.
fantasai: So either we go with the first green image, and if you
happen to make your float small enough it'll tuck under
there, or we don't.
fantasai: But I thought we discussed and agreed with taking the
third green rendering in Seattle.
<tantek> blue 1, green 3
iank: The way we'd implement this is to treat the letter A as an
exclusion, and then we have optimizations that assume you
don't put an exclusion above another one; this breaks that
case.
iank: Then you have to work out the layout areas...
iank: You're asserting that the initial letter will go higher than
other floats.
dbaron: I'd implement this not using the float mechanism.
fantasai: Which float is going higher than the initial latter, iank ?
Rossen: Another example case.
Rossen: Take initial letter. Then a float-left and float-right at
end of first line.
Rossen: So first float-left doesn't fit on the first line, so it
goes below the initial letter.
Rossen: Then the float-right can't go above the float-left, so it
gets pushed down as well.
Rossen: But if we reverse the order, then it would be okay for the
float-right to be up in the corner? And you think that's not
confusing?
fantasai: So imagine the first letter is a regular float with
clear:left. This would clear the left float, then force
the right float to go lower. If you reversed them the
right float wouldn't be pushed down. What's the difference?
fantasai: All we're saying here is that you cannot stack a float
against the initial letter, you have to clear it.
Rossen: So the complexity in our impl comes from the current model
assuming you have the bottom of your content, which is
assumed to be a position in the block direction; none of
this is allowed to be intruded by floats.
Rossen: The rest is just geometry on both sides, it's not
interesting.
Rossen: Float logic is simple in this case. There's a bottom defined
as a position (*not* a geometry), then the only geometries
to take into account are those from floats.
dbaron: Reminder that the float rules do no in any way reference the
bottom of line boxes, only the top.
dbaron: I think to fix this we should *introduce* such a rule.
dbaron: Right now the top of the float can't be higher than the top
of the line box containing preceding content.
dbaron: I think for initial letter the top of a float can't be
higher than the bottom of a line box that is *prior* to a
line box containing preceding content.
dbaron: So if float is anchored in second line, current rules say it
can't be above top of second line box, or first line box, or
initial letter line box.
dbaron: We can fix it to say that it can't be above the top of
second line box, or bottom of first line box, or bottom of
initial letter line box.
dbaron: Then we can worry if we want this bottom rule to depend on
what area the line box covers, so we can see if right floats
can pop up or not.
florian: And you're going on line boxes rather than clearances so
floats anchored on first line don't necessarily have to
clear the initial letter?
dbaron: Yeah.
fantasai: Alternative is, in terms of clearances, the first line box
includes the first letter, there's nothing to clear, it's
just in-flow content; but the part of the initial letter
that drops below the first line box is an exclusion area
that needs to be cleared if you're floating to the start
edge.
dauwhe: Seems straightforward to me.
<astearns> +1 from me
florian: So the effect of these two models in usage, both do the
same thing for left floats, different for right floats.
florian: fantasai's lets right floats go high, david's doesn't.
dbaron: I prefer linebox model because I'm hesitant to tie it too
much into the float model. I think too many things can go
wrong if initial letters get tied into floats, should be
associated with lines.
fantasai: I think we still need two lineboxes model.
Rossen: Exclusions by current definition - if I created A to be an
exclusion positioned like that (bottom half), a left float
on second line will still be next to the initial letter.
florian: It's an exclusion you must clear.
Rossen: We don't have that right now. We have exclusions that clear
start, end, max.
Rossen: So if this was exclusions would it be exclude start or end?
fantasai: Whatever float would do.
Rossen: So start.
Rossen: So you're saying that nothing can be placed to the start of
it.
fantasai: Right.
Rossen: So if you have a left float here, what rule makes it clear?
florian: The new rule we add, that left floats must clear it.
Rossen: I think what you need here is not exclusions, but a
clear-after behavior - say "after me, I want to clear all
left floats".
florian: So if dotted blue box has clear-after:left, left floats
must clear it.
Rossen: And I assert that has nothing to do with exclusions.
TabAtkins: If the float is anchored in the middle of the first line,
how does this give us Blue 1 rather than Blue 3?
fantasai: You do a hypothetical layout to figure out where the
anchor is, then place the float, *then* place the initial
letter (which establishes the exclusion/clear-after)
which'll affect subsequent lines.
astearns: Two outcomes. One places right floats without caring about
the initial letter, one does care. Can we resolve on which
outcome we want, then work out how to specify it?
TabAtkins: No, objections are about the mechanics.
tantek: I think it's important to not degrade behavior from the
legacy float stuff.
tantek: With a very tall initial letter, it'll look extra bad.
TabAtkins: If you put the float before your content, everything
works fine.
<dbaron> Use of floats for what they were intended for is pretty
rare on the Web, outside of wikipedia...
fantasai: Yeah, this is mostly about if the float shows up inside
the content, such that it's on the second line. I think
it's okay to treat that as an edge case.
Current Whiteboard Picture:
https://lists.w3.org/Archives/Public/www-archive/2018Jul/0001.html
florian: I don't know if this is a separate convo.
florian: If we take first blue, it looks good because the float is
taller than the letter.
florian: If it's shorter, does it still look good?
fantasai: I think it's fine, and in most cases it'll be taller.
fantasai: I think we agree on the renderings here. We should resolve
on that.
fantasai: We just disagree on whether right floats have to clear or
not.
fantasai: So for left floats: 'clear' doesn't apply to initial
letters
Rossen: Why doesn't it apply?
dbaron: It's an inline.
RESOLVED: clear doesn't apply to initial letters
fantasai: Initial letter mustn't overlap floats, just like lineboxes
don't.
RESOLVED: Initial letters must not overlap floats (just like
lineboxes don't).
<fantasai> https://github.com/w3c/csswg-drafts/issues/689
fantasai: If a linebox moves down or is shortened due to a float,
initial letter moves with it, and vice versa.
florian: Not sure if there's space for initial letter but not rest
of line, it should move down with the line...
tantek: This is just linebreaking rules. If you have [T]he, and Th
fits but not e, the whole thing moves down. But if you have
[A], then it can stay on the line by itself and subsequent
content moves down to next line, because space introduces
linebreaking opportunity.
<fantasai> Exact prose is in
https://github.com/w3c/csswg-drafts/commit/71edb81b0d8b8781fec05e46ca05de2ed1d2d3ff
btw
RESOLVED: If a linebox moves down or is shortened due to a float,
initial letter moves with it, and vice versa.
fantasai: An inline-start float originating on first line goes
between initial letter and containing block edge. (It
doesn't split the initial letter and the subsequent text.)
florian: This is how floats works, if the initial letter isn't a
float.
RESOLVED: An inline-start float originating on first line can go
between initial letter and containing block edge. (It
can't split the initial letter and the subsequent text.)
fantasai: An inline-start float originating on subsequent impacted
lines must clear the initial letter.
RESOLVED: An inline-start float originating on subsequent impacted
lines must clear the initial letter.
fantasai: inline-end floats that start on subsequent impacted lines
are still an open issue.
myles: first-line inline-end floats?
florian: I think they're the same.
myles: Let's talk about it later.
fantasai: Okay, so mark an open issue in the draft about inline-end
floats.
ACTION: Mark interaction of inline-end floats and initial letter as
open issue
fantasai: This should close #360 and #689.
fantasai: Should initial-letter apply to inside list markers?
fantasai: Discuss over lunch
<br type=lunch dur=1hr>
Received on Friday, 20 July 2018 00:27:26 UTC