- From: Peter Linss <peter.linss@hp.com>
- Date: Thu, 6 Feb 2014 20:26:25 -0800
- To: Tab Atkins Jr. <jackalmage@gmail.com>
- Cc: www-style list <www-style@w3.org>
- Message-Id: <F72A0343-157B-451A-A6D6-6566F94B6895@hp.com>
On Feb 6, 2014, at 7:02 PM, Tab Atkins Jr. <jackalmage@gmail.com> wrote:
> On Thu, Feb 6, 2014 at 6:54 PM, Peter Linss <peter.linss@hp.com> wrote:
>> On Feb 6, 2014, at 5:23 PM, Tab Atkins Jr. <jackalmage@gmail.com>
>> wrote:
>>> Note also that this isn't quite as easy as it sounds. When you expose
>>> things, where are they relative to everything else?
>>
>> They are in the same place as they are defined, the structure is preserved for everything exported.
>>
>> For example, given the shadow DOM:
>> <component>
>> <part-one export>
>> <sub-part-one />
>> </part-one>
>> <part-two>
>> <sub-part-two export>
>> <sub-sub-part-two />
>> </sub-part-two>
>> </part-two>
>> </component>
>>
>> You'd see it as though it were defined as:
>> <part-one>
>> <sub-part-one />
>> </part-one>
>> <sub-part-two>
>> <sub-sub-part-two />
>> </sub-part-two>
>
> Oof, so then "part-one + sub-part-two" would actually match? That's
> seems super weird to me.
In that obviously contrived example, yes, (although, for consistency, it would actually be "::part-one + ::sub-part-two") because that's the structure that's being exported, the <part-two> element doesn't exist when seen from the outside.
This is actually a feature. For example, what if the component was initially shipped without the <part-two> element? It can be added, but not exported, and not break existing stylesheets because it doesn't affect the structure exposed to the selectors.
>
>>>> The other part of my proposal was to simply use pseudo-elements to directly select the exported component pieces by name, and to relax the restrictions on pseudo-element selectors to allow pseudo-classes, attribute selectors, and descendants (with combinators).
>>>>
>>>> With those restrictions relaxed, it's not necessary to flatten the pseudo-element space, so the internal structure of exported pieces could be maintained.
>>>>
>>>> So a piece could be selected as:
>>>> component ::piece { ... }
>>>> it's child could be selected as:
>>>> component ::piece ::child-peice { ... }
>>>> etc, with the full expressiveness of selectors. This addresses your points #2 & #3.
>>>
>>> Well, no, not quite. You're using spaces where they're not allowing.
>>> It'd have to be at least:
>>>
>>> component::piece::child-piece
>>>
>>> Or something else for the child-piece part that allowed combinators.
>>
>> No, I really meant spaces, i.e. descendant combinators (see "loosening restrictions on use of pseudo-element selectors" in a previous message). You could use other combinators as needed to address specific nodes. There's no magic pseudo-element or combinator needed to pierce the shadow layer, the shadow component simply exports its parts as a structure of pseudo-elements.
>
> That completely changes the meaning of pseudo-elements, though.
> That's what I'm trying to allude to.
No, it doesn't. ::before and ::after are kind of weird in that they generate boxes that are actually siblings. "component::piece" would still mean the "::piece" pseudo-element of the "component", which wouldn't match anything (unless we define a ::piece pseudo-element in CSS), "component ::piece" means the "::piece" inside the "component".
(although, as I alluded to below, it could also make sense, except for ::before and ::after to treat "component::piece" as equivalent to "component > ::piece")
>
> "component ::before" explicitly means the same thing as "component
> *::before". Similarly, "component ::piece" would mean the same thing
> as "component *::piece", which is definitely not what you're
> intending.
It _is_ what I'm intending.
> This is part of the definition of pseudo-element syntax; I
> don't think it's reasonable to change it.
Not proposing to change it. I'm only proposing to relax the restrictions on it's use. So:
component ::part-one:hover ::sub-part-one[foo=bar]:nth-child(even) { ... }
would be valid.
(as would "p::first-line span { color: blue }", but that's a horse of another color...)
>
>> The only interesting thing here is that there's an implied > between all pseudo-elements and the rest of the selector, so:
>> p::first-line
>> is morally equivalent to:
>> p > ::first-line
>> That's the way Gecko at-least used to do it internally...
>>
>> We did this back in '98 or so in Gecko when building form controls out of "anonymous" boxes and hidden dom nodes (for content and event handling), essentially the 16 year-old precursor to today's shadow-dom. The interesting "anonymous" boxes each had a pseudo-element name and you could simply style them with normal CSS selectors.
>
> Are you implying then that the ::piece thing is *actually* a child (or
> descendant) of the element in the normal way we use the term, but is
> only matchable via its special name?
Yes.
> That's pretty weird, I think.
Why? The "::piece" thing is just that, a "thing", it's not a normal DOM element so shouldn't be addressable via element selectors, but being a shadow-dom node it's "*kind of* an element", e.g. a "pseudo-element"... Seems pretty straight-forward to me.
>
>> I accept the symmetry argument between the structure exposed to selectors and the JS APIs, but this isn't the right place to debate the JS APIs.
>
> Right, but given the JS APIs, it's the right place to make arguments
> about matching them. ^_^
Yes, and I'm all for the consistency, I'm just not convinced the JS APIs are correct and I didn't want to open that debate on www-style.
My position is that we should decide the correct model first, then have both the selectors and the JS API match the model. But that's a different thread (and probably a different forum), I was trying to keep this thread focused on the selector issue.
Peter
Received on Friday, 7 February 2014 04:26:57 UTC