adoptStyles / adoptSheetText
Inject CSS into a Shadow DOM, preferring Constructable Stylesheets: one piece of CSS is parsed
once and then shared by reference across every component instance, so a thousand instances still
hold one parsed result. Where they are unsupported, both fall back to injecting a <style> tag.
Both are SSR-safe (they return immediately when there is no document) and idempotent.
Usage
import css from './index.less?inline';
import { adoptStyles } from 'ranuts/utils';
class MyElement extends HTMLElement {
constructor() {
super();
const root = this.shadowRoot || this.attachShadow({ mode: 'closed' });
adoptStyles(root, css);
}
}API
adoptStyles
A component's static styles. The fallback path de-duplicates per root: a shadow root keeps
exactly one marked <style>, and the first writer wins. A component's static styles should exist
once per root, so a second call means the caller made a mistake.
Parameters
| Parameter | Description | Type | Default |
|---|---|---|---|
shadowRoot |
Target shadow root | ShadowRoot |
Required |
cssText |
The style text | string |
Required |
marker |
Marker attribute on the fallback <style> |
string |
'data-adopted-style' |
Return
No return value (void)
adoptSheetText
Dynamic styles supplied at runtime (a component's sheet property, say). The only difference
from adoptStyles is what the fallback de-duplicates on: here it is the cssText, so one root
can stack several distinct dynamic stylesheets while an identical one is injected only once.
Parameters
| Parameter | Description | Type | Default |
|---|---|---|---|
shadowRoot |
Target shadow root | ShadowRoot |
Required |
cssText |
The style text | string |
Required |
marker |
Marker attribute on the fallback <style> |
string |
'data-adopted-sheet' |
Return
No return value (void)
Constants
| Name | Value | Meaning |
|---|---|---|
ADOPTED_STYLE_MARKER |
'data-adopted-style' |
Default marker for adoptStyles' fallback tag |
ADOPTED_SHEET_MARKER |
'data-adopted-sheet' |
Default marker for adoptSheetText' fallback tag |
The marker parameter exists so a library can brand the styles it injects and still find them
later. ranui, for example, passes data-ranui and data-ranui-sheet.