export class DockitReactPlayground extends HTMLElement {
$renderRoot: HTMLElement;
private $style: HTMLStyleElement;
private _styles: string | CSSStyleSheet;
constructor() {
super();
this.attachShadow({ mode: 'open' });
if (!this.shadowRoot.adoptedStyleSheets) {
this.$style = document.createElement('style');
this.shadowRoot.appendChild(this.$style);
}
this.$renderRoot = document.createElement('div');
this.shadowRoot.appendChild(this.$renderRoot);
}
set styles(styles: string | CSSStyleSheet) {
if (styles !== this._styles) {
this.updateStyles(styles);
}
this._styles = styles;
}
private updateStyles(styles: string | CSSStyleSheet = '') {
if (!this.shadowRoot.adoptedStyleSheets) {
let stylesString =
styles instanceof CSSStyleSheet
? this.convertSheetToString(styles)
: styles;
this.$style.textContent = stylesString;
return;
}
let sheet: CSSStyleSheet;
if (styles instanceof CSSStyleSheet) {
sheet = styles;
} else {
sheet = new CSSStyleSheet();
sheet.replaceSync(styles);
}
this.shadowRoot.adoptedStyleSheets = [sheet];
}
private convertSheetToString(cssStyleSheet: CSSStyleSheet): string {
return Array.from(cssStyleSheet.cssRules)
.map((r) => r.cssText)
.join(' ');
}
}
customElements.define('dockit-react-playground', DockitReactPlayground);