- From: Dael Jackson <daelcss@gmail.com>
- Date: Mon, 23 Nov 2015 20:16:30 -0500
- To: www-style@w3.org
- Cc: public-webapps@w3.org
Joint Meeting With WebApps -------------------------- - There was conversation to further understand the use of and use cases for :host and :host-context in ShadowDOM - There was a struggle to find a use case for :host. - In regards to :host-context it was felt the same effect was easier to achieve using CSS Variables. - :host-context will be deferred from L1 for now - The joint groups also discussed the correct order for the nested levels in Shadow DOM. - There were two existing proposals on the table (see bottom of https://github.com/w3c/webcomponents/blob/gh-pages/proposals/Shadow-DOM-Cascade-Order-in-v1.md) and TabAtkins brought another one (https://github.com/w3c/webcomponents/issues/316#issuecomment-149735841). - The group understands the issue a lot better, but it was requested that the first two proposals be written up in a way similar to the proposal from TabAtkins and, once that is done, all three proposals are summarized for the mailing list with their differences made explicit. ===== FULL MINUTES BELOW ======= Scribe: timeless Joint Meeting With WebApps ========================== Shadow DOM ---------- <rniwa> https://github.com/w3c/webcomponents/blob/gh-pages/proposals/Shadow-DOM-Cascade-Order-in-v1.md rniwa: A couple of questions we need to resolve for Shadow DOM before we can implement the feature. rniwa: We have a list, we can go through it. rniwa: I'll go through each issue first. rniwa: First: combinators, and changes to them: rniwa: We don't want deep or shallow combinators rniwa: Rename ::content to ::slotted rniwa: Still have :host and :host-context Travis: I don't object. rniwa: I think we don't want :host-context Travis: :host is a shadow/guide. mjs: Could we have explanations of :host and :host-context? TabAtkins: I brought up an edit pad. <TabAtkins> https://public.etherpad-mozilla.org/p/webapps TabAtkins: I'll draw up an example real quick. [ tab draws ] [ adrianba increases the font size ] Tab draws: <my-component> <::shadow> <style> my-component { color: blue; } :host { color: red; } </style> </::shadow> <div>foo</div> </my-component> TabAtkins: If you're inside the shadow TabAtkins: as this style is, and you try to have a my-component selector TabAtkins: this component, this div, this style. TabAtkins: if you take my-component, it won't set on this (the my-component) TabAtkins: From inside the shadow root, styles can only see other things inside the shadow root. TabAtkins: The other stuff outside is in control of the user, not the shadow author. TabAtkins: You do still sometimes want to be able to style your host element, TabAtkins: to say make it a flex-box. TabAtkins: That's what :host is for. TabAtkins: :host-context is a little different TabAtkins: Say you want to style things based on whether your anchor is class="light-theme". TabAtkins: You can't do `.light-theme div {...}`. TabAtkins: You could do `:host(.light-theme) div {...}` this would only match the host if it matches. TabAtkins: It's a function() because... TabAtkins: :host.light-theme doesn't work, because .light-theme doesn't work. TabAtkins: Removing a simple selector from a compound selector will never select "less", TabAtkins: by CSS Selectors definition. TabAtkins: Things with more selections must select not more than the other, it's more specific. TabAtkins: it can't be a wider match TabAtkins: .light-theme div #2 -- doesn't match anything TabAtkins: then :host.light-theme div #1 -- can't match more than #2 TabAtkins: it's more specific, it can't match less. TabAtkins: You can't select less than 0. TabAtkins: So we have to use a function argument -- :host(.light-theme) div... dino: what does :host { color: red } do ? TabAtkins: It selects the host object (<my-component>) and sets the color property to red. TabAtkins: A more reasonable example is :host { display: flex }, TabAtkins: because you need to use flex-box layout. TabAtkins: Does that sufficiently clarify functional host? mjs: Additional question, when you use the descendant selector, what does it select? TabAtkins: [?] mjs: :host selects the host element, but if you select a descendant, it only selects things in the shadow TabAtkins: Yes, for the purpose of selectors, :host selects two things, the host, and the shadow DOM, descendants select inside only. leaverou: Why not a pseudo element? leaverou: There's a flaw that :host is a [?] and not a pseudo. TabAtkins: The reason it wasn't a pseudo is that it does exist. ChrisLilley: The projection exists, but the object doesn't exist. TabAtkins: But I'm styling the real element. leaverou: If you can't select it with * then... TabAtkins: No... mjs: * would select everything except it. TabAtkins: * is not everything, it's all tag names in this tree. leaverou: Any other examples? TabAtkins: No, this is the first one, SimonSapin: do you agree *:host is equivalent to :host ? TabAtkins: It is not. TabAtkins: If you wrote * { color: grey} TabAtkins: it selects every element in the shadow tree. SimonSapin: Same as... TabAtkins: *:host is bad, it won't select anything. SimonSapin: Defining this way is inconsistent, as with 1/2 TabAtkins: 1/2 both match nothing. mjs: A point w/ *, every other pseudo class, *:whatever is exactly equivalent to :whatever, mjs: but for pseudo elements, that isn't the case. <hayato> We had a similar discussion: https://lists.w3.org/Archives/Public/public-webapps/2015AprJun/0295.html mjs: Although :host sort of refers to a real element, it sort of doesn't. mjs: Descendant refers to something after refers to something it wouldn't normally would. mjs: The fact that it's weird kind of makes it a pseudo element. TabAtkins: It wouldn't be inconsistent, but i felt it leaned heavier to this style. hober: All selectors for forever have been scoped to a tree, we didn't know that because there was only one tree. hober: Now we have more than one tree. hober: :host projects from one tree to another. hober: It's true it's inconsistent, but we're doing something we haven't done before. hober: But this entire argument is `:` or `::` and I don't care. TabAtkins: If you are ok with a full selector after a pseudo element? TabAtkins: Then I'm ok. dbaron: I just want... dbaron: We use pseudos for things where we don't want to fully explain the dragons. dbaron: To mjs, you stick a * in front of it, and that doesn't change anything. dbaron: That's true for pseudo classes and not for pseudo elements, dbaron: but it's true for both. dbaron: Before this proposal, it was true for both. TabAtkins: Pseudo elements are always "of" another element. TabAtkins: but what element is this a pseudo of? mjs: What is ::selection a pseudo of? TabAtkins: That's an open question, but there are valid answers for it. [ laughter ] dbaron: There's no spec for ::selection saying how it works. fantasai: That's somewhat wrong, I haven't published it. fantasai: We do have a spec for that now. <kochi> https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp&q=%5C*:host&sq=package:chromium&type=cs&l=571 TabAtkins: What element does *::host(*) match? TabAtkins: Just serves as the host host, but we've reinvented the host. fantasai: A pseudo element is an element with its own set of computed styles, fantasai: but here you're trying to cascade all of the stle rules from outside and inside together onto the same element. fantasai: It's taking both scopes as an input and cascading together. fantasai: An element gets styles, and its pseudo gets its own styles, they're independent entities w/ independent styles. TabAtkins: Correct, your styles get merged (outside + outside-inside) TabAtkins: I think I need to put an explainer into the spec. TabAtkins: We're sticking w/ single colon. <zcorpan> how about dropping the colon(s)? hober: TabAtkins, I think you've answered this question multiple times in the past hober: Why not `:::` ? hober: "This is a weird thing", it should look different. hober: I swear I'm not trolling. TabAtkins: I considered it, but the single-double is the single worst thing of CSS. hober: We could do ::: so that people don't come w/ a preconceived notion. Simon: drop a `:` and just have a function. TabAtkins: We could have a function, it isn't defined as allowed for simple selectors yet. TabAtkins: Maybe it would be clearer? fantasai: It would look more like a tag name. zcorpan: It would be better because you can't put a star in front of it. TabAtkins: That's good. mjs: Now that we've colored the bike shed, can we go back to semantics? [ laughter ] Travis: :host-context TabAtkins: selector to host(...) TabAtkins: but we figured there were use cases for contexts higher up, TabAtkins: e.g. body.light-theme. TabAtkins: host-context() let's you try to select against the host element or any of its ancestors. rniwa: afaiu, that would be defined in CSS Variables rniwa: Why do we need a separate very similar to address the same use case? TabAtkins: Using Variables is the right solution if you want to do your own theme. TabAtkins: An element that's openly theme-able, but if you want a predetermined thing. TabAtkins: This lets you... rniwa: That seems wrong. rniwa: We don't have any other elements like that. TabAtkins: We absolutely do. TabAtkins: Just like :host(.foo) > div is roughly equivalent to :host.foo > div TabAtkins: :host-context(.foo) > div is roughly eq to .foo div rniwa: No host element styling different based on ancestor. TabAtkins: :host-context lets you put anywhere in a tree. hober: I disagree with that. hober: For the .list-theme case, hober: a typical page, we use class div. hober: You stick in header v. main content (light/dark) hober: You could see a push/pull question. hober: Is component pulling in hober: or is the page pushing in? hober: I think that's the typical case (one of them -- unclear which). hober: :host-context is a pull model, currently things don't do that. hober: Does that make sense? TabAtkins: Not a lot, but ok. TabAtkins: It's about predefined styles from the component, vs. the page poking in its own styles. hober: I think you can do your own stuff without this. TabAtkins: Only if you use :host with ... hober: I don't think so. mjs: :host-context, you could imagine a use case for it, but it seems like a box-checking exercise... mjs: It's true that built in classes. TabAtkins: Do things disable themselves based on fieldset? [ yeah ] mjs: fieldset isn't a good case. dbaron: <ul type=...> rniwa: Disabled you can't rely on ancestor. rniwa: Element disabled by label. TabAtkins: Correct, it's more complicated than that. TabAtkins: It's not nothing, forms can get more complicated. hober: <ul type="a"> could be done w/ :host. TabAtkins: Not if the <li>s are the shadows. dbaron: <table rule> changes things on borders of <td>s. <dbaron> also the list style rotation for nested ul TabAtkins: The idea that there's no example is laughable. [ agreed ] mjs: It still seems too obscure. mjs: I still think we could start w/ :host and see if real use cases in the field demonstrate a need. mjs: So much of this isn't read. TabAtkins: I'm down w/ that. hober: Let's get yelled at. ???: theming isn't a good use case? mjs: I think adding it there isn't a good use case. mjs: And I think theming is dumb anyway. mjs: And CSS Variables seem like a better way. dbaron: This is widely used as a developer practice. jyasskin: Polymer is using something like CSS Variables. TabAtkins: Our usage is below our kill threshold, so... TabAtkins: I recognize :host-context is a lower value, I don't think it's necessary for v1. TabAtkins: I'm ok w/ deferring to later. Cascading Models ---------------- <kochi> https://github.com/w3c/webcomponents/blob/gh-pages/proposals/Shadow-DOM-Cascade-Order-in-v1.md hayato: This is a summary of proposals of how cascading model should work hayato: See the end of the document. hayato: There's proposal 1, and 2. hayato: An element in shadow tree, hayato: we have 5 nodes, hayato: we have tree of trees, hayato: dom tree w/ nodes, hayato: tree of tree. hayato: A is a tree, B is child of A. hayato: Element in document tree host, shadow host is B, hayato: C is child tree of B. hayato: Shadow host in B, hosts shadow tree C. hayato: In shadow ... we have a special selector, hayato: like :host, or ::slotted. hayato: We have a proposal for some pseudo elements: hayato: Suppose an element in shadow tree B; hayato: there are a lot of possibilities hayato: for selectors applied to B. hayato: We should define how cascading should be applied. hayato: If multiple selectors apply to the same element hayato: ...element B... hayato: element B can have an attribute. hayato: B style-attribute mjs: I don't understand any of this. mjs: how do A, B, C, D, E relate to the markup example? hayato: <html>=A hayato: It's a shadow host, hayato: shadow tree hosted by A is B rniwa: In the original markup, the things outside shadow DOM is A rniwa: Host one has B. rniwa: Three has C. rniwa: If you look outside outer host one rniwa: there's a node projected through 4. TabAtkins: Host 4 is a light-dom child of host 2. TabAtkins: Host 3 is a shadow child of host 2. TabAtkins: You need target items to understand this. mjs: I'm not sure anyone here can fully understand this example. mjs: I think I'm more confused w/ further explanation. mjs: If D is a shadow tree nested in C, nested in B mjs: how can a selector in D affect something in B? rniwa: That's a case where a light DOM node in B is getting slotted in C in turn slotted into D. rniwa: Cascading slotting. rniwa: So selectors from B could apply rniwa: and selectors from C could apply rniwa: and selectors from D could apply. mjs: Ok. [ group finally understands ] hayato: We need to consider... mjs: How is B's style attribute affecting children in shadow DOM of B? mjs: I can understand through inheritance, but not cascading mjs: a node that's a descendant element or ? ???: The host element has... mjs: I wish the numbers in the markup matched the letters. hayato: Maybe we need more time to understand. fantasai: Maybe we need an application. TabAtkins: We could use my example, it's simpler and more consistent <TabAtkins> https://github.com/w3c/webcomponents/issues/316#issuecomment-149735841 TabAtkins: Tinier example, expresses almost everything from the bigger example: TabAtkins: The element in question is a menu item example. TabAtkins: It should express most of the items. TabAtkins: The menu item is a light DOM child of menu. TabAtkins: There's a style trying to turn it red. TabAtkins: Style element trying to turn itself yellow. TabAtkins: Style on the shadow trying to turn it green. TabAtkins: Then there's a style inside trying to turn it blue. TabAtkins: The winner was yellow. TabAtkins: The ordering is determined by a couple of principles of how to resolve this. TabAtkins: style= attributes win. TabAtkins: Shadow styles are the opposite TabAtkins: They don't need to guard. TabAtkins: Normally styles are treated like defaults. TabAtkins: The opposite using !important inside shadow root. TabAtkins: Styles from outside would lose. TabAtkins: This gives defaults and invariants. TabAtkins: The page rule beats content rule, and page rule beats host rule. TabAtkins: The example has things labeled. TabAtkins: The ids on the styles, TabAtkins: the inline style isn't labeled, I can't attribute that. TabAtkins: The rules from outside win over inside. TabAtkins: Page rules beat content rule. TabAtkins: Page rules win over :host. mjs: If you remove inline yellow, what color? TabAtkins: Red from page. mjs: The outermost styling scope wins? TabAtkins: It wins against normal shadow rules. TabAtkins: Whenever we conflict with normal shadow rules, TabAtkins: outside ones win since they don't usually intermix, TabAtkins: so we treat them as intentional. mjs: I don't follow your logic. TabAtkins: It was more obvious when we had shadow piercing. mjs: If we're not overriding. mjs: If you set :host {display: inline} mjs: and it would otherwise have {display: block} mjs: it won't work. TabAtkins: That's why I mentioned invariants (!important). mjs: What about UA style sheet? TabAtkins: Yes, they lose at the origin step. mjs: Everything in page win over UA at origin step. mjs: Cascade is several independent steps. mjs: Origin, author beats UA, mjs: then style, mjs: then scoping, mjs: then specificity, mjs: then sequence, mjs: and importance? TabAtkins: Important is origin. TabAtkins: They'd be in the same origin TabAtkins: and important inside shadow would win. rniwa: Do other people have other questions about this example? TabAtkins: Besides mjs. hober: What I was originally going to say was covered. hober: I think this works, I think it's difficult to follow, hober: but it's fine. jyasskin: A host rule is kind of like a UA style sheet for a shadowed element? TabAtkins: That's the way you should think of it. TabAtkins: Originally it was all elements since you could poke TabAtkins: but now you only can target the host. adrianba: That's all the time we allocated. adrianba: How much more time do you want to spend on this? TabAtkins: What else is there for CSS to do? astearns: Animations adrianba: ok, 20 more minutes. TabAtkins: One thing unordered. TabAtkins: Eliminate page rule, and style attribute, TabAtkins: you're left with content/slotted fighting with host-rule. TabAtkins: I didn't have something, it's described by rune's proposal. TabAtkins: From general intuition, I think content should win against host. hober: Yep. TabAtkins: So with remainder, you'd get green. hober: I think it's the right answer, it's consistent. hober: I'd love to hear disagreement. [ None ] rniwa: An element slotted through multiple shadow DOMs- rniwa: element, inline- rniwa: each slot element is a separate shadow DOM. rniwa: Each could have different styles. rniwa: All need to be ordered consistently. rniwa: I heard you had an idea for this, rniwa: e.g. not styling some... rniwa: What was the conclusion? hayato: We haven't... hayato: First redistribute shadow tree wins. hayato: If we agree w/ rune's proposal, rniwa: outer shadow, then inner shadow, rniwa: style from outer would win over inner. mjs: That seems backwards from what you said. mjs: Oh wait, it's consistent. mjs: Another algorithm would be only your final position, mjs: maybe simpler to compute. mjs: I'm not sure it handles your use cases. mjs: It's hard to tell which is more useful. rniwa: Consider <listview> rniwa: Maybe you have another component inside that has two extra items :before, :after rniwa: Styles applying to slots. mjs: I'm already lost. rniwa: A list of countries. rniwa: <listview> [list of countries] </listview> rniwa: You have a preferred countries; rniwa: the light DOM has some countries (China, Japan), rniwa: then you have outside USA which it's contributing at the top. mjs: Can you put slot markers in? Travis: I think we need to see this example in working browsers. mjs: Outer things can't see into light children's shadow DOM mjs: Maybe we should give up inventing this example and do it offline. [ laughter ] rniwa: Ignoring intermediary shadow DOMs seems like a bad idea. rniwa: Intermediary DOMs may need to add styles to nodes. hayato: We should define how slotted... hayato: The current spec says all styles should be applied when redistribution happens hayato: because slotted elements apply to distributed nodes. hayato: Distribution depends on how slotted pseudo element: hayato: slotted element applied to distributed node of slotted element (??). hayato: You might want to add a comment to the issue about slotted element. hayato: Make sense? rniwa: No. rniwa: The current spec only allows final destination? hayato: Not only final. rniwa: Ok, I think we should keep [allowing others to apply style] rniwa: In addition to TabAtkins's proposal, there's rune's proposal, and ... rniwa: What are the differences? rniwa: It's not obvious how they're different. rniwa: What's the motivation for each proposal? hayato: Differences... rniwa: What are the motivations (for other proposals). hayato: Proposal 1 is from rune's (Opera's) guys. hayato: This makes implementation easier. hayato: rune prefers style= should be treated hayato: in same way as style in same node tree. hayato: The reason same attribute is next to B. mjs: I don't think we want to have style= consistent w/ in a top level document. mjs: It should be the same order in a shadow tree, or it's ridiculous. rniwa: TabAtkins's proposal, rune's proposal, rniwa: there' no difference. rniwa: Was his proposal in response to opinion 2? rniwa: afaict, TabAtkins's and rune's proposal preserve the invariants that we want. rniwa: style rules / style= from same tree next to each other. rniwa: I'm not sure who's opinion 2 is. rniwa: Your proposal violates that by putting style= in a different thing. rniwa: Given we went through the exercise to understand TabAtkins's rational... mjs: TabAtkins's proposal doesn't contain all the letters mjs: it's hard to tell how it's different from the others. mjs: Do A+D never apply in TabAtkins, or are they... mjs: And E isn't used, does that mean they can't apply in Option 2? TabAtkins: My proposal doesn't have A. mjs: Before next time we discuss this, could someone write this up w/ the same set of letters/possibilities mjs: I can't tell if it's agnostic, say it won't apply, written against different example... mjs: It's hard to understand how to pick. koji: Sorry, proposal 1 is rune's. koji: ryosuke didn't understand that rune's proposal. mjs: Is rune's the same as TabAtkins's? koji: TabAtkins's covers style=, rune's didn't. koji:. hayato adds nested to TabAtkins's example. hober: Is it all one proposal, different levels of detail in the writeup? hober: Or three proposals, one didn't cover everything, one added a layer, the next added the next layer? koji: TabAtkins's added a corner case. koji: It's just an improvement over rune's. rniwa: I think this situation is way too confusing for us to conclude at this time. rniwa: If one is a superset of another, we don't need the subset proposals. mjs: The way TabAtkins wrote his up was a lot easier to understand than A, B, C, D, E. mjs: Please write all the proposals up that way. mjs: 1. explain proposals mjs: 2. explain reasoning for differences mjs: Doing 2 first wouldn't help adrianba: We're out of time. adrianba: I'm glad we waited until the end of day 2 to talk about this. adrianba: We accomplished some progress. adrianba: The conclusion is a bit more explanation of proposal, broken down in small pieces. Thanks all for the discussion. adrianba: That's the end of WebPlatform WG Meeting adrianba: Thanks to CSS WG people who came. [ Applause ]
Received on Tuesday, 24 November 2015 01:17:37 UTC