- From: Stephanie Rewis via GitHub <sysbot+gh@w3.org>
- Date: Fri, 11 Jan 2019 22:35:49 +0000
- To: public-css-archive@w3.org
# ::part feedback + thoughts
Below are thoughts, questions, and general feedback from the SLDS Framework team regarding the currently implemented in Chrome. We're experimenting a little further with slots and some more complex examples, so I expect we'll add a couple other questions with examples.
## Feedback
### Access control
It would be very useful if it was possible to limit access to CSS rules for a defined part. The purpose is to limit the styling API of a component by only allowing certain things to be overridden or to lock down certain things that should never be overridden.
In the example below “part='title'” is defined but only “color” and “background-color” can be overridden, all other rules would be ignored.
We envision allow all by default with the possibility to allow or deny specific lists of CSS rules.
```
<x-foo>
<h2 part="title" part-allow="color, background-color">Access control</h2>
<slot></slot>
</x-foo>
```
```
x-foo::part(title) {
color: purple; // allowed
bacgkround-color: grey; // allowed
height: 100%; // denied
}
```
In the example below “part='title'” is defined but “color” and “background-color” are locked, all other rules would apply and override the component's default styles.
```
<x-foo>
<h2 part="title" part-deny="color, background-color">Access control</h2>
<slot></slot>
</x-foo>
```
```
x-foo::part(title) {
color: purple; // denied
background-color: grey; // denied
height: 100%; // allowed
}
```
### Limited ::theme selector
The current description of the *::theme* selector is perhaps a bit too broad for real world usage. However the ability to access any *::part* within the context of a component, without elaborate `exportparts=` chains would be much easier to work with in the context of a design system.
In the example below, a theme context is defined for `**x-foo**` with the prefix of “`foo-`*”*. This would grant access to all child parts that match the name within the declared theme's context. This scoping limits the reach of *::theme* while avoiding the potentially complex *exportparts=* chains. Particularly when there's deep composition of components not owned by a single team.
```
<x-foo theme="foo-">
<x-bar></x-bar>
<x-oof></x-oof>
</x-foo>
// x-bar definition
<x-bar>
<p part="metadata">Posted on: 2019-01-10</p>
</x-bar>
// x-oof definition
<x-oof>
<svg part="icon"></svg>
</x-oof>
```
```
x-foo::theme(foo-metadata) {
color: grey;
font-style: italic;
}
```
### Web Component default *exportparts=*
When building a custom web component via composition not having to explicitly specify `exportparts=` would improve the experience.
The example below presents a possible solution where, at component creation, `exportparts=` is defined.
```
class BarElement extends HTMLElement {
constructor() {
super();
const shadowRoot = this.attachShadow({mode: 'closed'});
shadowRoot.innerHTML = `
<h1 part="header">Headline</h1>
<p part="metadata">Posted on: 2019-01-10</p>
<div part="content">...</div>
`;
if (!this.hasAttribute('exportparts'))
this.setAttribute('exportparts', 'header, metadata, content');
}
}
customElements.define('bar-element', BarElement);
```
```
<x-foo>
<!-- iteration of bar-elements -->
<!-- since no manual "exportparts=" was specified on each instance
the defaults are exported -->
<bar-element></bar-element>
<bar-element></bar-element>
...
</x-foot>
```
```
x-foo::part(header) {
color: green;
}
```
## Questions
### Dynamic *exportparts=*
Would it be possible to dynamically set the value of `exportparts=`?
The below example show some pseudo-code to illustrate the question.
```
<x-foo>
<h1>Component headline</h1>
<template for:each={items} for:item="item" for:index="idx">
<x-item exportparts="item-header: foo-item-header-{idx}"></x-item>
</template>
</x-foo>
```
### *::before* and *::after* pseudo elements
It appears the `::before` and `::after` pseudo elements/selectors do not function with *::part*. Is this intentionally blocked, if so why? If not are there plans to add this functionality in the future?
```
// add an asterisk prefix to the title part
x-foo::part(title)::before {
content: '*';
color: red;
margin-right: 0.25rem;
}
```
--
GitHub Notification of comment by stefsullrew
Please view or discuss this issue at https://github.com/w3c/csswg-drafts/issues/3467#issuecomment-453678965 using your GitHub account
Received on Friday, 11 January 2019 22:35:50 UTC