adoptStyles / adoptSheetText

Inyecta CSS en un Shadow DOM, con preferencia por las Constructable Stylesheets: un mismo CSS se analiza una sola vez y luego se comparte por referencia entre todas las instancias del componente, de modo que mil instancias siguen teniendo un único resultado analizado. Donde no estén disponibles, ambas recurren a inyectar una etiqueta <style>.

Las dos son seguras en el servidor (retornan de inmediato cuando no hay document) e idempotentes.

Uso

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

Para los estilos estáticos de un componente. La vía alternativa evita duplicados por raíz: un shadow root guarda exactamente una etiqueta <style> marcada, y manda quien escriba primero. Los estilos estáticos de un componente deben existir una vez por raíz, así que una segunda llamada significa que quien llamó se equivocó.

Parámetros

Parámetro Descripción Tipo Por defecto
shadowRoot El shadow root de destino ShadowRoot Obligatorio
cssText El texto del estilo string Obligatorio
marker Atributo que marca la etiqueta <style> alternativa string 'data-adopted-style'

Devuelve

Sin valor de retorno (void)

adoptSheetText

Para los estilos dinámicos que llegan en tiempo de ejecución (la propiedad sheet de un componente, por ejemplo). Lo único que cambia respecto a adoptStyles es sobre qué evita duplicados la vía alternativa: aquí es el cssText, así que una misma raíz puede apilar varias hojas dinámicas distintas mientras que una idéntica se inyecta una sola vez.

Parámetros

Parámetro Descripción Tipo Por defecto
shadowRoot El shadow root de destino ShadowRoot Obligatorio
cssText El texto del estilo string Obligatorio
marker Atributo que marca la etiqueta <style> alternativa string 'data-adopted-sheet'

Devuelve

Sin valor de retorno (void)

Constantes

Nombre Valor Significado
ADOPTED_STYLE_MARKER 'data-adopted-style' Marca por defecto de la etiqueta alternativa de adoptStyles
ADOPTED_SHEET_MARKER 'data-adopted-sheet' Marca por defecto de la etiqueta alternativa de adoptSheetText

El parámetro marker existe para que una librería pueda firmar los estilos que inyecta y volver a encontrarlos después. ranui, por ejemplo, pasa data-ranui y data-ranui-sheet.