An open API service indexing awesome lists of open source software.

https://github.com/t2ym/shadow-repeat

Repeat slotted elements in shadow DOM
https://github.com/t2ym/shadow-repeat

lit-html shadow-dom

Last synced: over 1 year ago
JSON representation

Repeat slotted elements in shadow DOM

Awesome Lists containing this project

README

          

[![npm](https://img.shields.io/npm/v/shadow-repeat.svg)](https://www.npmjs.com/package/shadow-repeat)
[![Published on webcomponents.org](https://img.shields.io/badge/webcomponents.org-published-blue.svg)](https://www.webcomponents.org/element/shadow-repeat)

# ``

## Repeat slotted elements in shadow DOM

- `repeater` property is a function returning `TemplateResult` with `` elements
- The repeater can be selective and sortable
- `items` write-only property is optional to trigger redrawing on items changes
- Note that changes of items of `items` are not watched

```javascript
import { html } from 'lit-html/lit-html.js';
import { repeat } from 'lit-html/directives/repeat.js';

html`
repeat(this.items, (item, index) => html``)}
.items=${this.items}>

${repeat(this.items, (item, index) => index, (item, index) => html``)}
`;
```

## Install

```sh
npm install shadow-repeat
```

## Import

```javascript
import 'shadow-repeat/shadow-repeat.js';
```

## [Full Source Code](https://github.com/t2ym/shadow-repeat/blob/master/shadow-repeat.js)

```javascript
/**
@license https://github.com/t2ym/shadow-repeat/blob/master/LICENSE.md
Copyright (c) 2019, Tetsuya Mori . All rights reserved.
*/
import {html, render} from 'lit-html/lit-html.js';

/**
* element to repeat items in Shadow Root via slot elements
*
* Usage:
* repeat(this.items, (item, index) => html``)} .items=${this.items}>
*
* ${repeat(this.items, (item, index) => index, (item, index) => html``)}
*
*
* @customElement
*/
export class ShadowRepeat extends HTMLElement {
static get is() {
return 'shadow-repeat';
}
constructor() {
super();
this.attachShadow({mode: 'open'});
}
connectedCallback() {
this.connected = true;
this.invalidate();
}
disconnectedCallback() {
this.connected = false;
}
get repeater() {
return this._repeater;
}
set repeater(value) {
this._onRepeaterChange(this._repeater = value);
}
get items() {
return null;
}
set items(value) {
this.invalidate();
}
_onRepeaterChange(repeater) {
this.invalidate();
}
invalidate() {
if (!this.needsRender && this.connected) {
this.needsRender = true;
Promise.resolve().then(() => {
this.needsRender = false;
render(this.render(), this.shadowRoot);
});
}
}
render() {
return html`${this.repeater()}`;
}
}
customElements.define('shadow-repeat', ShadowRepeat);
```

## License

[BSD-2-Clause](https://github.com/t2ym/shadow-repeat/blob/master/LICENSE.md)