JSPM

  • Created
  • Published
  • Downloads 132420
  • Score
    100M100P100Q175284F
  • License MIT

Constructible style sheets/ adopted style sheets polyfill

Package Exports

  • construct-style-sheets-polyfill

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (construct-style-sheets-polyfill) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

Constructible style sheets polyfill

This package is a polyfill for the constructible style sheets/adopted style sheets specification. The full specificaiton is enabled by default in Chrome Canary and according to the Chrome Platform Status page for the feature, it should be turned on by default in Chrome version 73.

Use case

The constructible style sheets proposal is intended to allow for the dynamic creation and sharing of style sheets, even across shadow boundaries. By adopting a style sheet into a shadow root, the same sheet can be applied to multiple nodes, including the document.

How it works

This polyfill will create a new style element for every DocumentOrShadowRoot into which the sheet is adopted. This is counter to the current proposal, but updates to the style sheet using the replace or replaceSync methods should update the relevant style elements with the updated content across all adopters.

No changes will occur in a browser that supports the feature by default.

Installation

The package can be installed either by copying the polyfill file or by installing using npm.

Usage

const everythingTomato = new CSSStyleSheet();
everythingTomato.replace(`
* {
    color: tomato;
}
`).then(console.log); // will log the CSSStyleSheet object

document.adoptedStyleSheets = [everythingTomato];

class TestEl extends HTMLElement {
    constructor() {
        super();
        this.attachShadow({ mode: 'open' });
        this.shadowRoot.adoptedStyleSheets = [everythingTomato];
    }

    connectedCallback() {
        this.shadowRoot.innerHTML = `<h1>This will be tomato colored, too</h1>`;
    }
}

customElements('test-el', TestEl);

const testEl = new TestEl;
document.body.appendChild(testEl);