- From: Dael Jackson <daelcss@gmail.com>
- Date: Tue, 25 Oct 2022 19:00:04 -0400
- To: www-style@w3.org
- Cc: www-international@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. ========================================= CSS-Internationalization Joint Meeting ====================================== Backslash & Yen sign behavior [css-fonts-4 issue #1282] ------------------------------------------------------- - It was not clear if there was enough interest in specifying an interoperable heuristic. Representatives from Chrome and Firefox will investigate further internally Flow-relative syntax for `margin`-like shorthands [css-logical-1 issue #1282] ----------------------------------------------------------------- - Goal is to not just *enable* logical stylesheets, but make them *not harder* than physical. - Discussed possibilities for per-declaration, per-block, and file-level switches, with the latter two potentially in the future. - It's unclear whether logical is the best default for all properties even in a flow-relative stylesheet; e.g. text-shadow often needs consistency across the page. - Even in a flow-relative stylesheet, individual declarations may need to be physical: both systems need to be available per declaration. - Proposed syntax options were `margin-logical: values` or `margin: values !logical`. Syntax that interferes with the property value space is not workable. There were both strong feelings for and against the ! syntax with neither getting a majority support. - The propdef tables may need to be annotated with additional information, such as whether a value assignment is physical, logical, or N/A. - Discussion will continue on github to determine if this can apply to all the margin-like shorthands and then work on the syntax. ===== FULL MINUTES BELOW ====== Agenda: https://github.com/w3c/csswg-drafts/projects/32 Scribe: TabAtkins CSS-Internationalization Joint Meeting ====================================== Backslash & Yen sign behavior ----------------------------- github: https://github.com/w3c/csswg-drafts/issues/6848 fantasai: WebKit has a bunch of code to handle this problem - the backslash is often rendered as a Yen sign, especially on Windows systems, for historical reasons <addison> (or a won sign or a yuan sign; special handling is on non-Windows OS) fantasai: The special handling in WK is they check if they have one of the "known problematic fonts" or if the encoding is one of the "known problematic encodings", they'll render the backslash as Yen, kinda like a text-transform. fantasai: So for the WG, do we want to adopt a heuristic like WK's, or do we want to ask them to remove it? fantasai: Currently text rendered on Windows doesn't look like other OSes, because the Yen characters appear on Windows and not elsewhere. addison: One issue is that it's an expectation of some speakers that the path separator is actually a Yen addison: So actually showing backslash might not be expected by the user. florian: Because this is a strong expectation in Japan/Korea, at least, that the backslash doesn't look like the backslash, authors will continue author this way, and if it works inconsistently based on the system that's not good. I think we should try for interop. florian: Reason it works on Windows is the fonts; if you don't have the right font it won't happen florian: So the font heuristics should probably be standardized florian: On top of that, I think authors should be able to control this more directly. florian: An @font-face descriptor that lets them say what this font is doing with regard to backslash or yen florian: Otherwise pages authored on windows will look different on Mac or Android, etc. florian: So we should aim for interop on at least the heuristics. florian: And likely go beyond to let authors specify. emilio: The compat issue on Mac comes from authors not specifying a font-name, or specifying a font that doesn't exist? addison: The last one. emilio: In that case, can that font be shipped on Mac? <addison> I believe locales for JP, KR, TW, and CN regions do this florian: And Android, and Linux... emilio: These kinds of heuristics don't seem terribly appealing to implement... I'd rather not have them, especially if it works on windows due to fonts <addison> This is rooted in DOS code page behavior myles: There's no way we can ship this font on iOS or Mac, that options is off the table emilio: Can you explain why? hober: Fonts are expensive; this would have to be a business arrangement, and the spec probably shouldn't rely on that existing for all OSes drott: Can we discuss what the heuristic would look like? Is it like "this window font as the primary in the font stack"? <fantasai> WebKit heuristic is described here: https://github.com/w3c/csswg-drafts/issues/6848#issue-1067848361 drott: And second to emilio, I don't think I'd like to carry this legacy issue further by putting it into @font-face <emilio> +1 drott: So probably fit with a heuristic but not further fantasai: Heuristic is "problematic font? problematic encoding? yes to either, render backslash as yen" iank: What does "render" mean? fantasai: Do a text-transform, basically. myles: And this is a whole-element thing, looking at primary font, not a glyph-by-glyph sub. drott: So primary font of the element, ok. fantasai: So just checking, you're looking at computed 'font-family' and looking at the first font in the list? myles: Probably, yes, I'll need to check. myles: Also this code is older than the Blink fork. But this behavior doesn't happen in Mac Chrome, so presumably it was deleted? iank: I'd have to dig into the history, yeah myles: grep for "yen sign" in the webkit codebase to find it in ours <emilio> https://searchfox.org/wubkat/rev/0c40ba62b482511fe03646f1d4982efd727475dd/Source/WebCore/rendering/RenderText.cpp#1345-1346 <emilio> iank: ^ <emilio> https://searchfox.org/wubkat/rev/0c40ba62b482511fe03646f1d4982efd727475dd/Source/WebCore/platform/graphics/FontCache.cpp#457 is the font-family check hober: Sometimes we need heuristics for compat reasons, but that makes me nervous hober: So one, heuristic should be as simple as possible. hober: And two, spec is as a floor; this is the minimum for compat, but you might do better, and hopefully bring it to the group to specify. florian: I'd like to push back against this as legacy. It's a compat problem, but it's not rooted in the past; it's the current expectation for Korea and Japan users florian: I don't think a German user wants their path filled with Yen signs, so it's not spreading. florian: The primary offender is Windows system fonts, but Japanese fonts are often *written* this way. florian: So if your primary font is one of these manually-authored fonts, but it didn't download, you'll have this problem again. florian: So that's why my suggestion for @font-face exists, so authors can tell us what their font expects and we can do the right thing just like if it was a windows system font. myles: Right now there are zero browsers that do this on a font-by-font basis; putting it in @font-face would mean we have to invent a new mechanism florian: I don't see why that would be required - the descriptor would just tell you whether the font is one that needs the transform <TabAtkins> (I assume this would just cause the font to trip the "problematic font?" part of the heuristic.) andreubotella: What happens on Windows if you copy text with this behavior? addison: They'll copy a backspace, that's the actual character andreubotella: Is that what authors expect? addison: Windows users will see it as a Yen when they paste, as well. The only difference will be if they put it in a message and send it elsewhere. JakeA: Note that text-transform doesn't usually do that; it typically changes what you copy fantasai: For some values; for other values (like fullsize-kana) you do *not* copy the transformed version of the text. <iank> Our bug relating to this: https://bugs.chromium.org/p/chromium/issues/detail?id=305827 <fantasai> And I would argue that text-transform should never copy out the transformed text dholbert: Does the text-transform handle the scenario where the font has a backslash but not a yen character? <addison> Not just yen sign... sometimes the won sign (in Korea) myles: We don't handle that; rather, I don't know what happens, but we don't seem to do anything special. dholbert: So possibly rendering tofu rather than slash myles: Probably just doing a fallback, like text-transform:uppercase on a font with only lowercase will trigger fallback <David-Clarke> All the fonts and encodings shown in the example are Japanese, but this affects Korean? <emilio> Gecko also implemented this hack and removed it: https://bugzilla.mozilla.org/show_bug.cgi?id=926580 drott: I found the Chrome bug to remove the hack drott: There was some question of whether content was being created expecting this, and if we could phase it out astearns: Seems the answer is yes, and no. florian: When Windows reaches 0 market share... myles: I asked another group earlier this week - in Japanese keyboards, is there separate backslash and Yen keys? If not, what keycode comes out? florian: Think the answer is "depends on the keyboard" <karlcow> Option + Y = ¥ on my MacBook Japanese keyboard. AND \ for \ on the keyboard. (Just to answer the question but that indeed depends on the keyboard) <karlcow> oops on my US keyboard <karlcow> on my Japanese keyboard. There's a yen key on the top right with the pipe. astearns: Probably enough discussion - is there appetite from gecko and blink to specify a simple heuristic and implement it? iank: I think the problem is... I'm looking at the patch that removed this, and it's a lot bigger than a text-transform. iank: Appears to be special code... astearns: Re: tess's point, the rule should be simple and you should implement it as you want. chris: The backing store is a backslash fantasai: I'd said before it depends on the transform myles: From a user perspective it looks like a Yen, so they'd expect a Yen <addison> (if you paste into a cmd shell, you want the path separator to be a path separator) florian: Unsure that's true, to the user it's a path separator, and that's a specific codepoint emilio: I'd want to check with jfkthame and the Japanese folks emilio: But given we removed this a while ago, I don't think so. We could reconsider, I guess. drott: The previous patch didn't seem to be text-transform based ACTION drott to investigate for Chrome ACTION emilio to investigate for Firefox [css-logical] Flow-relative syntax for `margin`-like shorthands --------------------------------------------------------------- github: https://github.com/w3c/csswg-drafts/issues/1282 <fantasai> https://github.com/w3c/csswg-drafts/issues/1282#issuecomment-952428897 <fantasai> https://github.com/w3c/csswg-drafts/issues/1282#issuecomment-1105613943 miriam: fantasai and I looked at this last year, with Jen miriam: CSS was built around physical property - trbl, width/height miriam: For various reasons logical props are more resilient, especially with multiple langs miriam: Whether that's building it in purposely, or automated translation miriam: It would be great if we could move toward a world where flow-relative logical props are the default miriam: The easier solution is that we just add `-logical` to various props miriam: But long-term that feels like a second-class citizen, not the default miriam: We'd like to get to a simple, clean way to default to relative miriam: Our plan is multi-step, starting with a property-by-property flag of some sort miriam: Whether that's a new prop name, a !flag, or something miriam: That says "I want this property to be read as logical" miriam: And once we've defined that for each property... fantasai: And we'd add physical equivalents so you could explicitly either way, if you wanted fantasai: Wouldn't change the default, just let you be more specific miriam: Once defined for all props, we could look at a block-level or even file-level change of the default miriam: So like an at-rule that switches default to logical for everything in it miriam: Or even a file-level switch. miriam: Would have to be lexically scoped to the file; separate files shouldn't interact. <dbaron> Do some of the "property-by-property" mean "declaration-by-declaration"? [yes] miriam: The second comment fantasai linked is someone just saying "let's add an 's' to the property 'margins' and 'paddings'" miriam: There's some other syntax approaches that I didn't look at closely r12a: You already talked about cascading - I've been using these logical props for a long time as much as possible r12a: I've been using them for arabic and hebrew pages, and I've found there are occasionally situations where you really need to leave margin-left in the code, otherwise things break r12a: There's not many, but some cases r12a: so we should be careful and warn people that if we provide a big switch and say "this'll fix everything" it can break things, too. Careful applying it en masse miriam: Right. The logical shorthands would likely be in a different order than the physical anyway, so updates would require more than just the flag. miriam: So the situation is more like you use this when writing a new file, not adapting an old file. addison: I think Richard was saying sometimes you need both so you need both options. fantasai: Right, that's part of our proposal addison: And it's not so much as when people are mixing langs in a page, but rather they want the same stylesheet for both their LTR and RTL translations without much fiddling. emilio: The "switch per file" doesn't work for the OM emilio: The simplest solution is having different properties, but that's not ideal fantasai: The browser could parse it in and use the declarations... Our proposal provides two shorthand syntaxes, both explicit, in addition to the current "ambiguous" one. fantasai: So the ambiguous would get decided as one or the other. emilio: How would you decide that when writing it out with JS? emilio: Right but then el1.style.margin = el2.style.margin loses the detail fantasai: The OM is currently locked into physical, so we're probably stuck with that. Any ideas? dbaron: I think if you want a file-level switch, you need it to store the information in each declaration. dbaron: So I think when you said property-by-property, at least some of the time you meant declaration-by-declaration miriam: yeah dbaron: So a file-level switch will have to alter the declarations at parse time to store the information, and possibly indistinguishable in the OM. fremy: It's common to bundle CSS, so per-file is an issue [discussion about ease of "s" suffix or "l-" prefix] fantasai: That still makes logical CSS a second-level, more awkward option astearns: My question on file-level switch - is there a specific set of shorthands this would apply to? Or is it just certain ambiguous properties? astearns: If we add new shorthands, will they use this switch? fantasai: Note it's not just shorthands, it's every property that assigns in a physical orientation. astearns: So it's not an allowlist, it's a set of props with this characteristic fantasai: Right, so we'd like look at overflow, which is x/y, and we'd define that it can also be block/inline miriam: But like 'left' won't change, it just gets a different property fantasai: But like text-shadow should be able to assign block/inline, etc <dbaron> text-shadow may be the exception to wanting the default to be logical! rachelandrew: Issues 'margins' (suffix), that's easily typo'd. Very confusing especially since the order changes rachelandrew: Not sure if we need a file switch at all, kinda like the staged approach. rachelandrew: Wonder if, once we have the prop-by-prop, that'll be enough, especially since we know most authors use postprocessors which can handle the "file-level" itself rachelandrew: So we can find out if we even need the second step once we've done all the properties individually. r12a: The switch sound like it could be useful because it makes things easier in some circumstances, but it's more complex r12a: We've been stuck for over a year on just margin and padding, tho r12a: The margin-inline/etc already exist and are great, but don't have the 4-value sorted out r12a: So it seems like just a nomenclature, wish we could sort that out. emilio: So the devil is in the details of 'margin'. If a logical version of the shorthands is something we need eventually anyway emilio: I think it would be great to make progress here so we can just do logical margins TabAtkins: That exact thing is step 1 of this proposal emilio: So yeah can we resolve on that? emilio: And come up with a consistent model for how to switch margin to the logical thing second <iank> +1 to emilio florian: The point of discussing this switch now is not to have it now, but to be consistent with the switch eventually florian: because if properties all work in different ways, we can never introduce the switch, at least not simply florian: So we don't need to decide on the switch, just need a model where we can intro it eventually <addison> consistency and completeness florian: Goal is to not just *enable* logical stylesheets, but make them *not harder* than physical dbaron: Responding to emilio, I think it wasn't clear if we want `margin-logical: values` or `margin: values !logical` dbaron: I think we need to be careful about assuming the end-state is everything-logical dbaron: text-shadow was mentioned, and shadows in particular you usually want consistency of light sources. dbaron: So want the light in upper-left, even if you have Japanese with a mix of vertical and horizontal or RTL Hebrew mixed with your English dbaron: So might need some more thought about the end state addison: I think the switch is an end state, and primary challenge is agreement on interim bits. Does seem to be important. addison: And to get complete addison: So let's focus on that. astearns: Right, but agreeing that we *will* have a switch is a good impetus r12a: Don't agree it's a good impetus since it's been years we've been talking about it without delivering r12a: Let's just make a decision r12a: All the explicit logical properties already work, just the shorthand is missing <jensimmons> :dir r12a: Meanwhile while we wait, need a way to change properties, currently browsers use :dir to do so florian: Here's a concrete proposal, tying to David's earlier point about storing state florian: I propose we don't go with extended names. Instead we use !syntax, and add a propdef line for specifying what the property defaults to if you don't specify the !. florian: So for like text-decoration you'd say "Default Directions: n/a", but margin would say "Default Directions: physical", etc florian: And later we can worry about a global switch, maybe with smarts about shadows, etc. florian: But first is the state in the propdef table. TabAtkins: Agree with what Florian said. emilio: Not a fan of the bang, would prefer a ? mark emilio: Would prefer a separate shorthand, even with `-physical` and `-logical` emilio: Less to figure out there emilio: Lots of thing to sort out to make !logical work ?? What things? emilio: And I just don't like the aesthetics florian: It helps with the mental model, adding a ! in the declaration ties well with the idea that this is a state to be remembered per definition emilio: Complexity - we don't have conditional shorthands that expand one way or another based on some condition emilio: So how do we define that, how do they serialize emilio: Easier to say that margin-logical expands to the 4 logicals, margin-physical expands to the 4 physicals emilio: But for the ! thing margin could expand to 8 properties, choosing any 4 depending conditionally fantasai: I think you can say it expands to all of them unconditionally, but the order is conditional emilio: So if you have 8 declarations... fantasai: You set the wrong ones to initial, and the right ones to the values fantasai: Just the order needs changing fantasai: And we simplify in serialization emilio: Say you have all 8 defined, and you serialize the margin shorthand emilio: What form do you use? dbaron: I think some of these aren't much harder than today dbaron: Dunno if we do them ideally today, but today if you declare margin and then margin-inline-start, should you serialize the margin shorthand? dbaron: I think you shouldn't and that extends to this case emilio: We do serialize it dbaron: Think that's a mistake emilio: That's how they all work, they're separate properties with separate values dbaron: Back when we were doing logical props as huge array of expanded props, we would not have serialized it dbaron: When we did it to depend on the order, we should have depended on some of the properties of the older solution that we dropped. <addison> that sounds like you (emilio) are arguing for the ! syntax? <emilio> ? <emilio> quite the opposite miriam: I get it that -logical is easier to impl and more consistent, but if there's not a plan for how it becomes a first-class citizen, I don't like it miriam: That's why I like the ! solution, it's easy to toggle which is the default. miriam: Concerned we just do the simple-to-implement and leave it that way, second class emeyer: I'm not a particular fan of the ! either emeyer: We have already "not important" jokes, and this'll look like "not logical" emeyer: Wonder if we can just add a keyword to the value fantasai: Can't do it, that interferes with some property syntaxes, and we need something that's completely consistent. Has to be outside the property space. iank: Are there that many props... iank: As David said there are some we want to make physical. iank: What's the list? <addison> has someone written the list? fantasai: It's pretty long, but some that you might *usually* want physical you want logical sometimes iank: This does make me skeptical of the switch fremy: What about a logical() function for the top-level property syntax? astearns: We're out of time. I think the approach of figuring out what we *can* do property-by-property, with the switch as an eventual goal, is the way to go. astearns: Kicking things up a level, I'm frustrated we couldn't do all the issues. Want to find a way out of this, can't always wait for tpac [unminuted scheduling talk] <chris> sad in particular we didn't get to https://github.com/w3c/csswg-drafts/issues/4497#issuecomment-763459971 <break>
Received on Tuesday, 25 October 2022 23:00:47 UTC