W3C home > Mailing lists > Public > public-webapps@w3.org > January to March 2015

Re: Shadow tree style isolation primitive

From: Tab Atkins Jr. <jackalmage@gmail.com>
Date: Mon, 12 Jan 2015 17:21:44 -0800
Message-ID: <CAAWBYDBii=4pEJEynmcgX6mUnqQYrG1D8pR8g8JyMNSXC5Yx4A@mail.gmail.com>
To: Ryosuke Niwa <rniwa@apple.com>
Cc: Brian Kardell <bkardell@gmail.com>, Chaals from Yandex <chaals@yandex-team.ru>, Anne van Kesteren <annevk@annevk.nl>, "www-style@w3.org" <www-style@w3.org>, WebApps WG <public-webapps@w3.org>
On Mon, Jan 12, 2015 at 4:45 PM, Ryosuke Niwa <rniwa@apple.com> wrote:
> I understand your use case but please also understand that some authors
> don't want to write a few dozen lines of JavaScript to create a shadow DOM,
> and hundreds of lines of code or load a framework to decoratively isolate
> CSS rules in their pages.

I agree that having a *simpler* way to define the shadow boundaries
could potentially make sense.  It wouldn't be a matter of splitting
apart more primitives, but instead of defining new sugar on top of the
existing stuff, to have a simple declarative mechanism for "make this
element push all of its contents into a shadow tree", potentially also
with some simple way to define styles for elements of that type.

I'm not saying the current status quo is 100% ideal, just that I think
the lines it draws are theoretically pretty useful.

Previously I said that it was a problem if the isolation selector
could pierce isolations - I think that's true of *general* selectors,
because, for example, classes are often reused for different meanings
in different parts of the page.  But if we restrict it to *element
names*, it's probably more okay; those are more identity-based, which
is part of why we're using them for components in the first place.
Imagine that the markup could look something like:

```
<head>
  <meta name=component-elements content="x-foo">
  /* Or whatever, just need some declarative mechanism for custom
element names. */
</head>
<x-foo>
  <p class=one>...</p>
</x-foo>
<p class=two>...</p>
<style>
p { color: red; } /* only affects the p.two element, as p.one is
inside the x-foo's isolation */
x-foo::shadow p { color: blue; } /* does target the p.one element,
standard shadow-dom styling rules */
@in-shadow-of x-foo {
  p { color: green; }
  /* treated as a style *inside* the shadow dom, for short selectors
and normal specificity rules */
  /* thus, this targets p.one */
  /* interacts with the previous `x-foo::shadow p` rule in
already-defined shadow-dom way. */
  /* this style is also shared between the various x-foo elements that
may be on the page */
  /* to style a single specific one, append a <style scoped> element
normally. */
}
</style>
```

This is just a quick sketch, but it shows how we can still invoke the
shadow dom primitives with a simple declarative syntax when all we
want is the simple isolation boundary, nothing more complex.  It also
composes properly, just like full-powered script-based web components
do; you can use a bunch of components together on the page, and as
long as their names don't clash, everything just works.

> I would just say that we feel event retargeting should be treated as a
> separate concern from style isolation.  I'm denying that a style isolation
> with event retargeting is a valid use case but there are use cases in which
> style isolation without event retargeting is desirable or retargeting needs
> to be implemented by frameworks.

Yeah, event retargeting seems validly separable.  It used to be a
tighter boundary in shadow DOM, but we loosened the defaults.  That
should be something more controllable.

~TJ
Received on Tuesday, 13 January 2015 01:22:32 UTC

This archive was generated by hypermail 2.3.1 : Friday, 27 October 2017 07:27:25 UTC