🚨 Active Supply Chain Attack:node-ipc Package Compromised.Learn More
Socket
Book a DemoSign in
Socket

@compiled/react

Package Overview
Dependencies
Maintainers
3
Versions
154
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@compiled/react - npm Package Compare versions

Comparing version
0.20.0
to
0.21.0
+71
dist/browser/runtime/style-container.d.ts
import React, { type ReactElement } from 'react';
export interface StyleContainerConfig {
/**
* The DOM node into which Compiled will insert `<style>` elements.
*/
container: HTMLElement | ShadowRoot;
/**
* A unique key used to namespace the deduplication cache for this container.
* Styles inserted into this container are tracked separately from the main
* document cache, preventing cross-container cache collisions.
*
* Choose a key that is unique per container instance (e.g. `"shadow-toolbar"`).
*/
cacheKey: string;
}
/**
* Singleton holding the currently active style container config on the client.
* Read directly by useStyleContainer().
*/
export declare let clientStyleContainer: StyleContainerConfig | null;
/**
* Returns the currently active style container config.
*/
export declare const useStyleContainer: () => StyleContainerConfig | null;
/**
* Provides a custom DOM container for Compiled style injection within a React subtree.
*
* **Runtime mode only.** This provider is not supported in server environments or when
* using CSS extraction (`@compiled/babel-plugin-strip-runtime`). In extraction mode,
* `CS`/`CC` components are removed at build time, so there is nothing for this provider
* to intercept. Supporting Shadow DOM with extraction is a known limitation and is
* planned as future work.
*
* Use this when rendering Compiled components inside a Shadow DOM, where styles
* inserted into the main document `<head>` are not visible to the shadow tree.
*
* The `cacheKey` must be unique per container and is used to namespace the
* deduplication cache so styles are tracked independently per container.
*
* @example
* ```tsx
* import { StyleContainerProvider } from '@compiled/react';
* import { createPortal } from 'react-dom';
*
* function ShadowHost() {
* const hostRef = useRef<HTMLDivElement>(null);
* const [shadowRoot, setShadowRoot] = useState<ShadowRoot | null>(null);
*
* useEffect(() => {
* if (hostRef.current && !hostRef.current.shadowRoot) {
* setShadowRoot(hostRef.current.attachShadow({ mode: 'open' }));
* }
* }, []);
*
* return (
* <div ref={hostRef}>
* {shadowRoot &&
* createPortal(
* <StyleContainerProvider container={shadowRoot} cacheKey="my-shadow-root">
* <MyCompiledComponent />
* </StyleContainerProvider>,
* shadowRoot
* )}
* </div>
* );
* }
* ```
*/
export declare function StyleContainerProvider({ container, cacheKey, children, }: StyleContainerConfig & {
children: React.ReactNode;
}): ReactElement;
import React from 'react';
import { isServerEnvironment } from './is-server-environment.js';
/**
* Singleton holding the currently active style container config on the client.
* Read directly by useStyleContainer().
*/
export let clientStyleContainer = null;
/**
* Returns the currently active style container config.
*/
export const useStyleContainer = () => {
return clientStyleContainer;
};
/**
* Provides a custom DOM container for Compiled style injection within a React subtree.
*
* **Runtime mode only.** This provider is not supported in server environments or when
* using CSS extraction (`@compiled/babel-plugin-strip-runtime`). In extraction mode,
* `CS`/`CC` components are removed at build time, so there is nothing for this provider
* to intercept. Supporting Shadow DOM with extraction is a known limitation and is
* planned as future work.
*
* Use this when rendering Compiled components inside a Shadow DOM, where styles
* inserted into the main document `<head>` are not visible to the shadow tree.
*
* The `cacheKey` must be unique per container and is used to namespace the
* deduplication cache so styles are tracked independently per container.
*
* @example
* ```tsx
* import { StyleContainerProvider } from '@compiled/react';
* import { createPortal } from 'react-dom';
*
* function ShadowHost() {
* const hostRef = useRef<HTMLDivElement>(null);
* const [shadowRoot, setShadowRoot] = useState<ShadowRoot | null>(null);
*
* useEffect(() => {
* if (hostRef.current && !hostRef.current.shadowRoot) {
* setShadowRoot(hostRef.current.attachShadow({ mode: 'open' }));
* }
* }, []);
*
* return (
* <div ref={hostRef}>
* {shadowRoot &&
* createPortal(
* <StyleContainerProvider container={shadowRoot} cacheKey="my-shadow-root">
* <MyCompiledComponent />
* </StyleContainerProvider>,
* shadowRoot
* )}
* </div>
* );
* }
* ```
*/
export function StyleContainerProvider({ container, cacheKey, children, }) {
if (false) {
if (process.env.NODE_ENV === 'development') {
console.warn('@compiled/react: StyleContainerProvider has no effect in server environments. ' +
'Shadow DOM content should be rendered client-side only (e.g. inside a portal ' +
'guarded by useEffect/useState).');
}
return children;
}
// On the client, set the singleton synchronously during the render phase via
// useMemo so CS children pick it up immediately.
// eslint-disable-next-line react-hooks/rules-of-hooks
React.useMemo(() => {
clientStyleContainer = { container, cacheKey };
}, [container, cacheKey]);
// Clear the singleton when this provider unmounts.
// Note: nested StyleContainerProviders are not supported. If an inner provider
// unmounts, this will clear clientStyleContainer to null rather than restoring
// the outer provider's value. This is an acceptable limitation for the intended
// use case of a single provider wrapping a shadow DOM subtree.
// eslint-disable-next-line react-hooks/rules-of-hooks
React.useEffect(() => {
return () => {
clientStyleContainer = null;
};
}, []);
return children;
}
//# sourceMappingURL=style-container.js.map
{"version":3,"file":"style-container.js","sourceRoot":"","sources":["../../../src/runtime/style-container.ts"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAEjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAiBjE;;;GAGG;AACH,MAAM,CAAC,IAAI,oBAAoB,GAAgC,IAAI,CAAC;AAEpE;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAgC,EAAE;IACjE,OAAO,oBAAoB,CAAC;AAC9B,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,MAAM,UAAU,sBAAsB,CAAC,EACrC,SAAS,EACT,QAAQ,EACR,QAAQ,GAC6C;IACrD,WAA2B;QACzB,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE;YAC1C,OAAO,CAAC,IAAI,CACV,gFAAgF;gBAC9E,+EAA+E;gBAC/E,iCAAiC,CACpC,CAAC;SACH;QACD,OAAO,QAAwB,CAAC;KACjC;IAED,6EAA6E;IAC7E,iDAAiD;IACjD,sDAAsD;IACtD,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACjB,oBAAoB,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IACjD,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE1B,mDAAmD;IACnD,+EAA+E;IAC/E,+EAA+E;IAC/E,gFAAgF;IAChF,+DAA+D;IAC/D,sDAAsD;IACtD,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,OAAO,GAAG,EAAE;YACV,oBAAoB,GAAG,IAAI,CAAC;QAC9B,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,QAAwB,CAAC;AAClC,CAAC"}
import React, { type ReactElement } from 'react';
export interface StyleContainerConfig {
/**
* The DOM node into which Compiled will insert `<style>` elements.
*/
container: HTMLElement | ShadowRoot;
/**
* A unique key used to namespace the deduplication cache for this container.
* Styles inserted into this container are tracked separately from the main
* document cache, preventing cross-container cache collisions.
*
* Choose a key that is unique per container instance (e.g. `"shadow-toolbar"`).
*/
cacheKey: string;
}
/**
* Singleton holding the currently active style container config on the client.
* Read directly by useStyleContainer().
*/
export declare let clientStyleContainer: StyleContainerConfig | null;
/**
* Returns the currently active style container config.
*/
export declare const useStyleContainer: () => StyleContainerConfig | null;
/**
* Provides a custom DOM container for Compiled style injection within a React subtree.
*
* **Runtime mode only.** This provider is not supported in server environments or when
* using CSS extraction (`@compiled/babel-plugin-strip-runtime`). In extraction mode,
* `CS`/`CC` components are removed at build time, so there is nothing for this provider
* to intercept. Supporting Shadow DOM with extraction is a known limitation and is
* planned as future work.
*
* Use this when rendering Compiled components inside a Shadow DOM, where styles
* inserted into the main document `<head>` are not visible to the shadow tree.
*
* The `cacheKey` must be unique per container and is used to namespace the
* deduplication cache so styles are tracked independently per container.
*
* @example
* ```tsx
* import { StyleContainerProvider } from '@compiled/react';
* import { createPortal } from 'react-dom';
*
* function ShadowHost() {
* const hostRef = useRef<HTMLDivElement>(null);
* const [shadowRoot, setShadowRoot] = useState<ShadowRoot | null>(null);
*
* useEffect(() => {
* if (hostRef.current && !hostRef.current.shadowRoot) {
* setShadowRoot(hostRef.current.attachShadow({ mode: 'open' }));
* }
* }, []);
*
* return (
* <div ref={hostRef}>
* {shadowRoot &&
* createPortal(
* <StyleContainerProvider container={shadowRoot} cacheKey="my-shadow-root">
* <MyCompiledComponent />
* </StyleContainerProvider>,
* shadowRoot
* )}
* </div>
* );
* }
* ```
*/
export declare function StyleContainerProvider({ container, cacheKey, children, }: StyleContainerConfig & {
children: React.ReactNode;
}): ReactElement;
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.StyleContainerProvider = exports.useStyleContainer = exports.clientStyleContainer = void 0;
const react_1 = __importDefault(require("react"));
const is_server_environment_js_1 = require("./is-server-environment.js");
/**
* Singleton holding the currently active style container config on the client.
* Read directly by useStyleContainer().
*/
exports.clientStyleContainer = null;
/**
* Returns the currently active style container config.
*/
const useStyleContainer = () => {
return exports.clientStyleContainer;
};
exports.useStyleContainer = useStyleContainer;
/**
* Provides a custom DOM container for Compiled style injection within a React subtree.
*
* **Runtime mode only.** This provider is not supported in server environments or when
* using CSS extraction (`@compiled/babel-plugin-strip-runtime`). In extraction mode,
* `CS`/`CC` components are removed at build time, so there is nothing for this provider
* to intercept. Supporting Shadow DOM with extraction is a known limitation and is
* planned as future work.
*
* Use this when rendering Compiled components inside a Shadow DOM, where styles
* inserted into the main document `<head>` are not visible to the shadow tree.
*
* The `cacheKey` must be unique per container and is used to namespace the
* deduplication cache so styles are tracked independently per container.
*
* @example
* ```tsx
* import { StyleContainerProvider } from '@compiled/react';
* import { createPortal } from 'react-dom';
*
* function ShadowHost() {
* const hostRef = useRef<HTMLDivElement>(null);
* const [shadowRoot, setShadowRoot] = useState<ShadowRoot | null>(null);
*
* useEffect(() => {
* if (hostRef.current && !hostRef.current.shadowRoot) {
* setShadowRoot(hostRef.current.attachShadow({ mode: 'open' }));
* }
* }, []);
*
* return (
* <div ref={hostRef}>
* {shadowRoot &&
* createPortal(
* <StyleContainerProvider container={shadowRoot} cacheKey="my-shadow-root">
* <MyCompiledComponent />
* </StyleContainerProvider>,
* shadowRoot
* )}
* </div>
* );
* }
* ```
*/
function StyleContainerProvider({ container, cacheKey, children, }) {
if ((0, is_server_environment_js_1.isServerEnvironment)()) {
if (process.env.NODE_ENV === 'development') {
console.warn('@compiled/react: StyleContainerProvider has no effect in server environments. ' +
'Shadow DOM content should be rendered client-side only (e.g. inside a portal ' +
'guarded by useEffect/useState).');
}
return children;
}
// On the client, set the singleton synchronously during the render phase via
// useMemo so CS children pick it up immediately.
// eslint-disable-next-line react-hooks/rules-of-hooks
react_1.default.useMemo(() => {
exports.clientStyleContainer = { container, cacheKey };
}, [container, cacheKey]);
// Clear the singleton when this provider unmounts.
// Note: nested StyleContainerProviders are not supported. If an inner provider
// unmounts, this will clear clientStyleContainer to null rather than restoring
// the outer provider's value. This is an acceptable limitation for the intended
// use case of a single provider wrapping a shadow DOM subtree.
// eslint-disable-next-line react-hooks/rules-of-hooks
react_1.default.useEffect(() => {
return () => {
exports.clientStyleContainer = null;
};
}, []);
return children;
}
exports.StyleContainerProvider = StyleContainerProvider;
//# sourceMappingURL=style-container.js.map
{"version":3,"file":"style-container.js","sourceRoot":"","sources":["../../../src/runtime/style-container.ts"],"names":[],"mappings":";;;;;;AAAA,kDAAiD;AAEjD,yEAAiE;AAiBjE;;;GAGG;AACQ,QAAA,oBAAoB,GAAgC,IAAI,CAAC;AAEpE;;GAEG;AACI,MAAM,iBAAiB,GAAG,GAAgC,EAAE;IACjE,OAAO,4BAAoB,CAAC;AAC9B,CAAC,CAAC;AAFW,QAAA,iBAAiB,qBAE5B;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,SAAgB,sBAAsB,CAAC,EACrC,SAAS,EACT,QAAQ,EACR,QAAQ,GAC6C;IACrD,IAAI,IAAA,8CAAmB,GAAE,EAAE;QACzB,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE;YAC1C,OAAO,CAAC,IAAI,CACV,gFAAgF;gBAC9E,+EAA+E;gBAC/E,iCAAiC,CACpC,CAAC;SACH;QACD,OAAO,QAAwB,CAAC;KACjC;IAED,6EAA6E;IAC7E,iDAAiD;IACjD,sDAAsD;IACtD,eAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACjB,4BAAoB,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IACjD,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE1B,mDAAmD;IACnD,+EAA+E;IAC/E,+EAA+E;IAC/E,gFAAgF;IAChF,+DAA+D;IAC/D,sDAAsD;IACtD,eAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,OAAO,GAAG,EAAE;YACV,4BAAoB,GAAG,IAAI,CAAC;QAC9B,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,QAAwB,CAAC;AAClC,CAAC;AApCD,wDAoCC"}
import React, { type ReactElement } from 'react';
export interface StyleContainerConfig {
/**
* The DOM node into which Compiled will insert `<style>` elements.
*/
container: HTMLElement | ShadowRoot;
/**
* A unique key used to namespace the deduplication cache for this container.
* Styles inserted into this container are tracked separately from the main
* document cache, preventing cross-container cache collisions.
*
* Choose a key that is unique per container instance (e.g. `"shadow-toolbar"`).
*/
cacheKey: string;
}
/**
* Singleton holding the currently active style container config on the client.
* Read directly by useStyleContainer().
*/
export declare let clientStyleContainer: StyleContainerConfig | null;
/**
* Returns the currently active style container config.
*/
export declare const useStyleContainer: () => StyleContainerConfig | null;
/**
* Provides a custom DOM container for Compiled style injection within a React subtree.
*
* **Runtime mode only.** This provider is not supported in server environments or when
* using CSS extraction (`@compiled/babel-plugin-strip-runtime`). In extraction mode,
* `CS`/`CC` components are removed at build time, so there is nothing for this provider
* to intercept. Supporting Shadow DOM with extraction is a known limitation and is
* planned as future work.
*
* Use this when rendering Compiled components inside a Shadow DOM, where styles
* inserted into the main document `<head>` are not visible to the shadow tree.
*
* The `cacheKey` must be unique per container and is used to namespace the
* deduplication cache so styles are tracked independently per container.
*
* @example
* ```tsx
* import { StyleContainerProvider } from '@compiled/react';
* import { createPortal } from 'react-dom';
*
* function ShadowHost() {
* const hostRef = useRef<HTMLDivElement>(null);
* const [shadowRoot, setShadowRoot] = useState<ShadowRoot | null>(null);
*
* useEffect(() => {
* if (hostRef.current && !hostRef.current.shadowRoot) {
* setShadowRoot(hostRef.current.attachShadow({ mode: 'open' }));
* }
* }, []);
*
* return (
* <div ref={hostRef}>
* {shadowRoot &&
* createPortal(
* <StyleContainerProvider container={shadowRoot} cacheKey="my-shadow-root">
* <MyCompiledComponent />
* </StyleContainerProvider>,
* shadowRoot
* )}
* </div>
* );
* }
* ```
*/
export declare function StyleContainerProvider({ container, cacheKey, children, }: StyleContainerConfig & {
children: React.ReactNode;
}): ReactElement;
import React from 'react';
import { isServerEnvironment } from './is-server-environment.js';
/**
* Singleton holding the currently active style container config on the client.
* Read directly by useStyleContainer().
*/
export let clientStyleContainer = null;
/**
* Returns the currently active style container config.
*/
export const useStyleContainer = () => {
return clientStyleContainer;
};
/**
* Provides a custom DOM container for Compiled style injection within a React subtree.
*
* **Runtime mode only.** This provider is not supported in server environments or when
* using CSS extraction (`@compiled/babel-plugin-strip-runtime`). In extraction mode,
* `CS`/`CC` components are removed at build time, so there is nothing for this provider
* to intercept. Supporting Shadow DOM with extraction is a known limitation and is
* planned as future work.
*
* Use this when rendering Compiled components inside a Shadow DOM, where styles
* inserted into the main document `<head>` are not visible to the shadow tree.
*
* The `cacheKey` must be unique per container and is used to namespace the
* deduplication cache so styles are tracked independently per container.
*
* @example
* ```tsx
* import { StyleContainerProvider } from '@compiled/react';
* import { createPortal } from 'react-dom';
*
* function ShadowHost() {
* const hostRef = useRef<HTMLDivElement>(null);
* const [shadowRoot, setShadowRoot] = useState<ShadowRoot | null>(null);
*
* useEffect(() => {
* if (hostRef.current && !hostRef.current.shadowRoot) {
* setShadowRoot(hostRef.current.attachShadow({ mode: 'open' }));
* }
* }, []);
*
* return (
* <div ref={hostRef}>
* {shadowRoot &&
* createPortal(
* <StyleContainerProvider container={shadowRoot} cacheKey="my-shadow-root">
* <MyCompiledComponent />
* </StyleContainerProvider>,
* shadowRoot
* )}
* </div>
* );
* }
* ```
*/
export function StyleContainerProvider({ container, cacheKey, children, }) {
if (isServerEnvironment()) {
if (process.env.NODE_ENV === 'development') {
console.warn('@compiled/react: StyleContainerProvider has no effect in server environments. ' +
'Shadow DOM content should be rendered client-side only (e.g. inside a portal ' +
'guarded by useEffect/useState).');
}
return children;
}
// On the client, set the singleton synchronously during the render phase via
// useMemo so CS children pick it up immediately.
// eslint-disable-next-line react-hooks/rules-of-hooks
React.useMemo(() => {
clientStyleContainer = { container, cacheKey };
}, [container, cacheKey]);
// Clear the singleton when this provider unmounts.
// Note: nested StyleContainerProviders are not supported. If an inner provider
// unmounts, this will clear clientStyleContainer to null rather than restoring
// the outer provider's value. This is an acceptable limitation for the intended
// use case of a single provider wrapping a shadow DOM subtree.
// eslint-disable-next-line react-hooks/rules-of-hooks
React.useEffect(() => {
return () => {
clientStyleContainer = null;
};
}, []);
return children;
}
//# sourceMappingURL=style-container.js.map
{"version":3,"file":"style-container.js","sourceRoot":"","sources":["../../../src/runtime/style-container.ts"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAEjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAiBjE;;;GAGG;AACH,MAAM,CAAC,IAAI,oBAAoB,GAAgC,IAAI,CAAC;AAEpE;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAgC,EAAE;IACjE,OAAO,oBAAoB,CAAC;AAC9B,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,MAAM,UAAU,sBAAsB,CAAC,EACrC,SAAS,EACT,QAAQ,EACR,QAAQ,GAC6C;IACrD,IAAI,mBAAmB,EAAE,EAAE;QACzB,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE;YAC1C,OAAO,CAAC,IAAI,CACV,gFAAgF;gBAC9E,+EAA+E;gBAC/E,iCAAiC,CACpC,CAAC;SACH;QACD,OAAO,QAAwB,CAAC;KACjC;IAED,6EAA6E;IAC7E,iDAAiD;IACjD,sDAAsD;IACtD,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACjB,oBAAoB,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IACjD,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE1B,mDAAmD;IACnD,+EAA+E;IAC/E,+EAA+E;IAC/E,gFAAgF;IAChF,+DAA+D;IAC/D,sDAAsD;IACtD,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,OAAO,GAAG,EAAE;YACV,oBAAoB,GAAG,IAAI,CAAC;QAC9B,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,QAAwB,CAAC;AAClC,CAAC"}
import React, { type ReactElement } from 'react';
import { isServerEnvironment } from './is-server-environment.js';
export interface StyleContainerConfig {
/**
* The DOM node into which Compiled will insert `<style>` elements.
*/
container: HTMLElement | ShadowRoot;
/**
* A unique key used to namespace the deduplication cache for this container.
* Styles inserted into this container are tracked separately from the main
* document cache, preventing cross-container cache collisions.
*
* Choose a key that is unique per container instance (e.g. `"shadow-toolbar"`).
*/
cacheKey: string;
}
/**
* Singleton holding the currently active style container config on the client.
* Read directly by useStyleContainer().
*/
export let clientStyleContainer: StyleContainerConfig | null = null;
/**
* Returns the currently active style container config.
*/
export const useStyleContainer = (): StyleContainerConfig | null => {
return clientStyleContainer;
};
/**
* Provides a custom DOM container for Compiled style injection within a React subtree.
*
* **Runtime mode only.** This provider is not supported in server environments or when
* using CSS extraction (`@compiled/babel-plugin-strip-runtime`). In extraction mode,
* `CS`/`CC` components are removed at build time, so there is nothing for this provider
* to intercept. Supporting Shadow DOM with extraction is a known limitation and is
* planned as future work.
*
* Use this when rendering Compiled components inside a Shadow DOM, where styles
* inserted into the main document `<head>` are not visible to the shadow tree.
*
* The `cacheKey` must be unique per container and is used to namespace the
* deduplication cache so styles are tracked independently per container.
*
* @example
* ```tsx
* import { StyleContainerProvider } from '@compiled/react';
* import { createPortal } from 'react-dom';
*
* function ShadowHost() {
* const hostRef = useRef<HTMLDivElement>(null);
* const [shadowRoot, setShadowRoot] = useState<ShadowRoot | null>(null);
*
* useEffect(() => {
* if (hostRef.current && !hostRef.current.shadowRoot) {
* setShadowRoot(hostRef.current.attachShadow({ mode: 'open' }));
* }
* }, []);
*
* return (
* <div ref={hostRef}>
* {shadowRoot &&
* createPortal(
* <StyleContainerProvider container={shadowRoot} cacheKey="my-shadow-root">
* <MyCompiledComponent />
* </StyleContainerProvider>,
* shadowRoot
* )}
* </div>
* );
* }
* ```
*/
export function StyleContainerProvider({
container,
cacheKey,
children,
}: StyleContainerConfig & { children: React.ReactNode }): ReactElement {
if (isServerEnvironment()) {
if (process.env.NODE_ENV === 'development') {
console.warn(
'@compiled/react: StyleContainerProvider has no effect in server environments. ' +
'Shadow DOM content should be rendered client-side only (e.g. inside a portal ' +
'guarded by useEffect/useState).'
);
}
return children as ReactElement;
}
// On the client, set the singleton synchronously during the render phase via
// useMemo so CS children pick it up immediately.
// eslint-disable-next-line react-hooks/rules-of-hooks
React.useMemo(() => {
clientStyleContainer = { container, cacheKey };
}, [container, cacheKey]);
// Clear the singleton when this provider unmounts.
// Note: nested StyleContainerProviders are not supported. If an inner provider
// unmounts, this will clear clientStyleContainer to null rather than restoring
// the outer provider's value. This is an acceptable limitation for the intended
// use case of a single provider wrapping a shadow DOM subtree.
// eslint-disable-next-line react-hooks/rules-of-hooks
React.useEffect(() => {
return () => {
clientStyleContainer = null;
};
}, []);
return children as ReactElement;
}
+2
-0
import { createElement } from 'react';
import type { CompiledJSX } from './jsx/jsx-local-namespace.js';
export { ClassNames } from './class-names/index.js';
export { StyleContainerProvider } from './runtime/style.js';
export type { StyleContainerConfig } from './runtime/style.js';
export { createStrictAPI } from './create-strict-api/index.js';

@@ -5,0 +7,0 @@ export type { PseudosDeclarations, MediaQueries, AllowedStyles, ApplySchema, ApplySchemaMap, } from './create-strict-api/types.js';

import { createElement } from 'react';
export { ClassNames } from './class-names/index.js';
export { StyleContainerProvider } from './runtime/style.js';
export { createStrictAPI } from './create-strict-api/index.js';

@@ -4,0 +5,0 @@ export { default as css } from './css/index.js';

+1
-1

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAItC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAQ/D,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAe,MAAM,mBAAmB,CAAC;AASxD,OAAO,EAML,EAAE,GACH,MAAM,sBAAsB,CAAC;AAE9B,0CAA0C;AAC1C,kGAAkG;AAClG,MAAM,CAAC,MAAM,GAAG,GAAG,aAAa,CAAC"}
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAItC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAQ/D,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAe,MAAM,mBAAmB,CAAC;AASxD,OAAO,EAML,EAAE,GACH,MAAM,sBAAsB,CAAC;AAE9B,0CAA0C;AAC1C,kGAAkG;AAClG,MAAM,CAAC,MAAM,GAAG,GAAG,aAAa,CAAC"}

@@ -33,2 +33,4 @@ import type { Bucket, StyleSheetOpts } from './types.js';

* Used to move styles to the head of the application during runtime.
* When `opts.container` is provided, styles are inserted into that container
* instead of `document.head` — useful for Shadow DOM rendering.
*

@@ -35,0 +37,0 @@ * @param css string

@@ -67,9 +67,32 @@ import { isCacheDisabled } from './cache.js';

/**
* Lazily adds a `<style>` bucket to the `<head>`.
* This will ensure that the style buckets are ordered.
* Holds style buckets per custom container (e.g. a ShadowRoot), keyed by the
* container DOM node. Uses WeakMap so entries are garbage collected when the
* container is removed from the page.
*/
const styleBucketsByContainer = new WeakMap();
/**
* Lazily adds a `<style>` bucket to a container, defaulting to `the `<head>`
* when no container is provided in opts. Ensures style buckets are inserted in
* the correct order regardless of the target container.
*
* @param bucket Bucket to insert in the head.
* Each custom container (e.g. a ShadowRoot) gets its own independent set of
* buckets via the WeakMap — the main document singleton is unaffected.
*
* @param bucketName Bucket to insert into the container.
* @param opts StyleSheetOpts optionally including a custom container.
*/
function lazyAddStyleBucketToHead(bucketName, opts) {
if (!styleBucketsInHead[bucketName]) {
function lazyAddStyleBucketToContainer(bucketName, opts) {
var _a;
const target = (_a = opts.container) !== null && _a !== void 0 ? _a : document.head;
let buckets;
if (opts.container) {
if (!styleBucketsByContainer.has(opts.container)) {
styleBucketsByContainer.set(opts.container, {});
}
buckets = styleBucketsByContainer.get(opts.container);
}
else {
buckets = styleBucketsInHead;
}
if (!buckets[bucketName]) {
let currentBucketIndex = styleBucketOrdering.indexOf(bucketName) + 1;

@@ -79,3 +102,3 @@ let nextBucketFromCache = null;

for (; currentBucketIndex < styleBucketOrdering.length; currentBucketIndex++) {
const nextBucket = styleBucketsInHead[styleBucketOrdering[currentBucketIndex]];
const nextBucket = buckets[styleBucketOrdering[currentBucketIndex]];
if (nextBucket) {

@@ -89,9 +112,9 @@ nextBucketFromCache = nextBucket;

tag.appendChild(document.createTextNode(''));
document.head.insertBefore(tag, nextBucketFromCache);
target.insertBefore(tag, nextBucketFromCache);
if (isCacheDisabled()) {
return tag;
}
styleBucketsInHead[bucketName] = tag;
buckets[bucketName] = tag;
}
return styleBucketsInHead[bucketName];
return buckets[bucketName];
}

@@ -144,2 +167,4 @@ /**

* Used to move styles to the head of the application during runtime.
* When `opts.container` is provided, styles are inserted into that container
* instead of `document.head` — useful for Shadow DOM rendering.
*

@@ -151,3 +176,3 @@ * @param css string

const bucketName = getStyleBucketName(css);
const style = lazyAddStyleBucketToHead(bucketName, opts);
const style = lazyAddStyleBucketToContainer(bucketName, opts);
if (process.env.NODE_ENV === 'production') {

@@ -154,0 +179,0 @@ const sheet = style.sheet;

@@ -1,1 +0,1 @@

{"version":3,"file":"sheet.js","sourceRoot":"","sources":["../../../src/runtime/sheet.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"sheet.js","sourceRoot":"","sources":["../../../src/runtime/sheet.ts"],"names":[],"mappings":"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"}
/// <reference types="react" />
import { StyleContainerProvider } from './style-container.js';
import type { StyleSheetOpts } from './types.js';
export { StyleContainerProvider };
export type { StyleContainerConfig } from './style-container.js';
interface StyleProps extends StyleSheetOpts {

@@ -11,2 +14,1 @@ /**

export default function Style(props: StyleProps): JSX.Element | null;
export {};

@@ -6,4 +6,7 @@ import React from 'react';

import { useCache } from './style-cache.js';
import { StyleContainerProvider, useStyleContainer } from './style-container.js';
export { StyleContainerProvider };
export default function Style(props) {
const inserted = useCache();
const styleContainer = useStyleContainer();
if (process.env.NODE_ENV === 'development') {

@@ -36,9 +39,14 @@ props.children.forEach(analyzeCssInDev);

else {
const opts = styleContainer
? Object.assign(Object.assign({}, props), { container: styleContainer.container, cacheKey: styleContainer.cacheKey }) : props;
for (let i = 0; i < props.children.length; i++) {
const sheet = props.children[i];
if (inserted[sheet]) {
// When a container is active, namespace the cache key so this container's
// inserted records are tracked independently from the main document cache.
const cacheKey = styleContainer ? `${styleContainer.cacheKey}:${sheet}` : sheet;
if (inserted[cacheKey]) {
continue;
}
inserted[sheet] = true;
insertRule(sheet, props);
inserted[cacheKey] = true;
insertRule(sheet, opts);
}

@@ -45,0 +53,0 @@ }

@@ -1,1 +0,1 @@

{"version":3,"file":"style.js","sourceRoot":"","sources":["../../../src/runtime/style.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,UAAU,EAAE,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAW5C,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,KAAiB;IAC7C,MAAM,QAAQ,GAAG,QAAQ,EAAE,CAAC;IAE5B,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE;QAC1C,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;KACzC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE;QACzB,WAA2B;YACzB,MAAM,cAAc,GAAoC,EAAE,CAAC;YAC3D,IAAI,SAAS,GAAG,KAAK,CAAC;YAEtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;oBACnB,SAAS;iBACV;qBAAM;oBACL,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;oBACvB,SAAS,GAAG,IAAI,CAAC;iBAClB;gBAED,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC7C,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC;aACzE;YAED,IAAI,CAAC,SAAS,EAAE;gBACd,OAAO,IAAI,CAAC;aACb;YAED,OAAO,CACL,mDAEE,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,uBAAuB,EAAE;oBACvB,MAAM,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;iBAC7E,GACD,CACH,CAAC;SACH;aAAM;YACL,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;oBACnB,SAAS;iBACV;gBAED,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;gBACvB,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;aAC1B;SACF;KACF;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
{"version":3,"file":"style.js","sourceRoot":"","sources":["../../../src/runtime/style.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,UAAU,EAAE,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGjF,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAWlC,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,KAAiB;IAC7C,MAAM,QAAQ,GAAG,QAAQ,EAAE,CAAC;IAC5B,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAE3C,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE;QAC1C,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;KACzC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE;QACzB,WAA2B;YACzB,MAAM,cAAc,GAAoC,EAAE,CAAC;YAC3D,IAAI,SAAS,GAAG,KAAK,CAAC;YAEtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;oBACnB,SAAS;iBACV;qBAAM;oBACL,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;oBACvB,SAAS,GAAG,IAAI,CAAC;iBAClB;gBAED,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC7C,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC;aACzE;YAED,IAAI,CAAC,SAAS,EAAE;gBACd,OAAO,IAAI,CAAC;aACb;YAED,OAAO,CACL,mDAEE,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,uBAAuB,EAAE;oBACvB,MAAM,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;iBAC7E,GACD,CACH,CAAC;SACH;aAAM;YACL,MAAM,IAAI,GAAmB,cAAc;gBACzC,CAAC,iCAAM,KAAK,KAAE,SAAS,EAAE,cAAc,CAAC,SAAS,EAAE,QAAQ,EAAE,cAAc,CAAC,QAAQ,IACpF,CAAC,CAAC,KAAK,CAAC;YAEV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAChC,0EAA0E;gBAC1E,2EAA2E;gBAC3E,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,QAAQ,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;gBAChF,IAAI,QAAQ,CAAC,QAAQ,CAAC,EAAE;oBACtB,SAAS;iBACV;gBAED,QAAQ,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;gBAC1B,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;aACzB;SACF;KACF;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}

@@ -10,2 +10,18 @@ /// <reference types="react" />

nonce?: string;
/**
* A unique key identifying the style container. Used to namespace the
* deduplication cache so styles inserted into a custom container (e.g. a
* Shadow DOM) are tracked independently from the main document cache.
*
* Must be provided together with `container`.
*/
cacheKey?: string;
/**
* A DOM node into which Compiled will insert `<style>` elements instead of
* `document.head`. Useful when rendering inside a Shadow DOM where styles in
* the main document head are not visible to the shadow tree.
*
* Must be provided together with `cacheKey`.
*/
container?: HTMLElement | ShadowRoot;
}

@@ -12,0 +28,0 @@ /**

import { createElement } from 'react';
import type { CompiledJSX } from './jsx/jsx-local-namespace.js';
export { ClassNames } from './class-names/index.js';
export { StyleContainerProvider } from './runtime/style.js';
export type { StyleContainerConfig } from './runtime/style.js';
export { createStrictAPI } from './create-strict-api/index.js';

@@ -5,0 +7,0 @@ export type { PseudosDeclarations, MediaQueries, AllowedStyles, ApplySchema, ApplySchemaMap, } from './create-strict-api/types.js';

@@ -6,6 +6,8 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
exports.jsx = exports.cx = exports.styled = exports.keyframes = exports.cssMap = exports.css = exports.createStrictAPI = exports.ClassNames = void 0;
exports.jsx = exports.cx = exports.styled = exports.keyframes = exports.cssMap = exports.css = exports.createStrictAPI = exports.StyleContainerProvider = exports.ClassNames = void 0;
const react_1 = require("react");
var index_js_1 = require("./class-names/index.js");
Object.defineProperty(exports, "ClassNames", { enumerable: true, get: function () { return index_js_1.ClassNames; } });
var style_js_1 = require("./runtime/style.js");
Object.defineProperty(exports, "StyleContainerProvider", { enumerable: true, get: function () { return style_js_1.StyleContainerProvider; } });
var index_js_2 = require("./create-strict-api/index.js");

@@ -12,0 +14,0 @@ Object.defineProperty(exports, "createStrictAPI", { enumerable: true, get: function () { return index_js_2.createStrictAPI; } });

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,iCAAsC;AAItC,mDAAoD;AAA3C,sGAAA,UAAU,OAAA;AACnB,yDAA+D;AAAtD,2GAAA,eAAe,OAAA;AAQxB,2CAAgD;AAAvC,gHAAA,OAAO,OAAO;AACvB,+CAAuD;AAA9C,mHAAA,OAAO,OAAU;AAC1B,iDAAiD;AAAxC,qGAAA,SAAS,OAAA;AAClB,8CAAwD;AAA/C,kGAAA,MAAM,OAAA;AASf,iDAO8B;AAD5B,8FAAA,EAAE,OAAA;AAGJ,0CAA0C;AAC1C,kGAAkG;AACrF,QAAA,GAAG,GAAG,qBAAa,CAAC"}
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,iCAAsC;AAItC,mDAAoD;AAA3C,sGAAA,UAAU,OAAA;AACnB,+CAA4D;AAAnD,kHAAA,sBAAsB,OAAA;AAE/B,yDAA+D;AAAtD,2GAAA,eAAe,OAAA;AAQxB,2CAAgD;AAAvC,gHAAA,OAAO,OAAO;AACvB,+CAAuD;AAA9C,mHAAA,OAAO,OAAU;AAC1B,iDAAiD;AAAxC,qGAAA,SAAS,OAAA;AAClB,8CAAwD;AAA/C,kGAAA,MAAM,OAAA;AASf,iDAO8B;AAD5B,8FAAA,EAAE,OAAA;AAGJ,0CAA0C;AAC1C,kGAAkG;AACrF,QAAA,GAAG,GAAG,qBAAa,CAAC"}

@@ -33,2 +33,4 @@ import type { Bucket, StyleSheetOpts } from './types.js';

* Used to move styles to the head of the application during runtime.
* When `opts.container` is provided, styles are inserted into that container
* instead of `document.head` — useful for Shadow DOM rendering.
*

@@ -35,0 +37,0 @@ * @param css string

@@ -70,9 +70,32 @@ "use strict";

/**
* Lazily adds a `<style>` bucket to the `<head>`.
* This will ensure that the style buckets are ordered.
* Holds style buckets per custom container (e.g. a ShadowRoot), keyed by the
* container DOM node. Uses WeakMap so entries are garbage collected when the
* container is removed from the page.
*/
const styleBucketsByContainer = new WeakMap();
/**
* Lazily adds a `<style>` bucket to a container, defaulting to `the `<head>`
* when no container is provided in opts. Ensures style buckets are inserted in
* the correct order regardless of the target container.
*
* @param bucket Bucket to insert in the head.
* Each custom container (e.g. a ShadowRoot) gets its own independent set of
* buckets via the WeakMap — the main document singleton is unaffected.
*
* @param bucketName Bucket to insert into the container.
* @param opts StyleSheetOpts optionally including a custom container.
*/
function lazyAddStyleBucketToHead(bucketName, opts) {
if (!styleBucketsInHead[bucketName]) {
function lazyAddStyleBucketToContainer(bucketName, opts) {
var _a;
const target = (_a = opts.container) !== null && _a !== void 0 ? _a : document.head;
let buckets;
if (opts.container) {
if (!styleBucketsByContainer.has(opts.container)) {
styleBucketsByContainer.set(opts.container, {});
}
buckets = styleBucketsByContainer.get(opts.container);
}
else {
buckets = styleBucketsInHead;
}
if (!buckets[bucketName]) {
let currentBucketIndex = exports.styleBucketOrdering.indexOf(bucketName) + 1;

@@ -82,3 +105,3 @@ let nextBucketFromCache = null;

for (; currentBucketIndex < exports.styleBucketOrdering.length; currentBucketIndex++) {
const nextBucket = styleBucketsInHead[exports.styleBucketOrdering[currentBucketIndex]];
const nextBucket = buckets[exports.styleBucketOrdering[currentBucketIndex]];
if (nextBucket) {

@@ -92,9 +115,9 @@ nextBucketFromCache = nextBucket;

tag.appendChild(document.createTextNode(''));
document.head.insertBefore(tag, nextBucketFromCache);
target.insertBefore(tag, nextBucketFromCache);
if (false) {
return tag;
}
styleBucketsInHead[bucketName] = tag;
buckets[bucketName] = tag;
}
return styleBucketsInHead[bucketName];
return buckets[bucketName];
}

@@ -148,2 +171,4 @@ /**

* Used to move styles to the head of the application during runtime.
* When `opts.container` is provided, styles are inserted into that container
* instead of `document.head` — useful for Shadow DOM rendering.
*

@@ -155,3 +180,3 @@ * @param css string

const bucketName = (0, exports.getStyleBucketName)(css);
const style = lazyAddStyleBucketToHead(bucketName, opts);
const style = lazyAddStyleBucketToContainer(bucketName, opts);
if (process.env.NODE_ENV === 'production') {

@@ -158,0 +183,0 @@ const sheet = style.sheet;

@@ -1,1 +0,1 @@

{"version":3,"file":"sheet.js","sourceRoot":"","sources":["../../../src/runtime/sheet.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"sheet.js","sourceRoot":"","sources":["../../../src/runtime/sheet.ts"],"names":[],"mappings":"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"}
/// <reference types="react" />
import { StyleContainerProvider } from './style-container.js';
import type { StyleSheetOpts } from './types.js';
export { StyleContainerProvider };
export type { StyleContainerConfig } from './style-container.js';
interface StyleProps extends StyleSheetOpts {

@@ -11,2 +14,1 @@ /**

export default function Style(props: StyleProps): JSX.Element | null;
export {};

@@ -29,2 +29,3 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
exports.StyleContainerProvider = void 0;
const react_1 = __importDefault(require("react"));

@@ -35,4 +36,7 @@ const dev_warnings_js_1 = require("./dev-warnings.js");

const style_cache_js_1 = require("./style-cache.js");
const style_container_js_1 = require("./style-container.js");
Object.defineProperty(exports, "StyleContainerProvider", { enumerable: true, get: function () { return style_container_js_1.StyleContainerProvider; } });
function Style(props) {
const inserted = (0, style_cache_js_1.useCache)();
const styleContainer = (0, style_container_js_1.useStyleContainer)();
if (process.env.NODE_ENV === 'development') {

@@ -65,9 +69,14 @@ props.children.forEach(dev_warnings_js_1.analyzeCssInDev);

else {
const opts = styleContainer
? Object.assign(Object.assign({}, props), { container: styleContainer.container, cacheKey: styleContainer.cacheKey }) : props;
for (let i = 0; i < props.children.length; i++) {
const sheet = props.children[i];
if (inserted[sheet]) {
// When a container is active, namespace the cache key so this container's
// inserted records are tracked independently from the main document cache.
const cacheKey = styleContainer ? `${styleContainer.cacheKey}:${sheet}` : sheet;
if (inserted[cacheKey]) {
continue;
}
inserted[sheet] = true;
(0, sheet_js_1.default)(sheet, props);
inserted[cacheKey] = true;
(0, sheet_js_1.default)(sheet, opts);
}

@@ -74,0 +83,0 @@ }

@@ -1,1 +0,1 @@

{"version":3,"file":"style.js","sourceRoot":"","sources":["../../../src/runtime/style.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA0B;AAE1B,uDAAoD;AACpD,yEAAiE;AACjE,uDAAiF;AACjF,qDAA4C;AAW5C,SAAwB,KAAK,CAAC,KAAiB;IAC7C,MAAM,QAAQ,GAAG,IAAA,yBAAQ,GAAE,CAAC;IAE5B,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE;QAC1C,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,iCAAe,CAAC,CAAC;KACzC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE;QACzB,IAAI,IAAA,8CAAmB,GAAE,EAAE;YACzB,MAAM,cAAc,GAAoC,EAAE,CAAC;YAC3D,IAAI,SAAS,GAAG,KAAK,CAAC;YAEtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;oBACnB,SAAS;iBACV;qBAAM;oBACL,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;oBACvB,SAAS,GAAG,IAAI,CAAC;iBAClB;gBAED,MAAM,UAAU,GAAG,IAAA,6BAAkB,EAAC,KAAK,CAAC,CAAC;gBAC7C,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC;aACzE;YAED,IAAI,CAAC,SAAS,EAAE;gBACd,OAAO,IAAI,CAAC;aACb;YAED,OAAO,CACL,6DAEE,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,uBAAuB,EAAE;oBACvB,MAAM,EAAE,8BAAmB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;iBAC7E,GACD,CACH,CAAC;SACH;aAAM;YACL,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;oBACnB,SAAS;iBACV;gBAED,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;gBACvB,IAAA,kBAAU,EAAC,KAAK,EAAE,KAAK,CAAC,CAAC;aAC1B;SACF;KACF;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AApDD,wBAoDC"}
{"version":3,"file":"style.js","sourceRoot":"","sources":["../../../src/runtime/style.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA0B;AAE1B,uDAAoD;AACpD,yEAAiE;AACjE,uDAAiF;AACjF,qDAA4C;AAC5C,6DAAiF;AAGxE,uGAHA,2CAAsB,OAGA;AAW/B,SAAwB,KAAK,CAAC,KAAiB;IAC7C,MAAM,QAAQ,GAAG,IAAA,yBAAQ,GAAE,CAAC;IAC5B,MAAM,cAAc,GAAG,IAAA,sCAAiB,GAAE,CAAC;IAE3C,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE;QAC1C,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,iCAAe,CAAC,CAAC;KACzC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE;QACzB,IAAI,IAAA,8CAAmB,GAAE,EAAE;YACzB,MAAM,cAAc,GAAoC,EAAE,CAAC;YAC3D,IAAI,SAAS,GAAG,KAAK,CAAC;YAEtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;oBACnB,SAAS;iBACV;qBAAM;oBACL,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;oBACvB,SAAS,GAAG,IAAI,CAAC;iBAClB;gBAED,MAAM,UAAU,GAAG,IAAA,6BAAkB,EAAC,KAAK,CAAC,CAAC;gBAC7C,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC;aACzE;YAED,IAAI,CAAC,SAAS,EAAE;gBACd,OAAO,IAAI,CAAC;aACb;YAED,OAAO,CACL,6DAEE,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,uBAAuB,EAAE;oBACvB,MAAM,EAAE,8BAAmB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;iBAC7E,GACD,CACH,CAAC;SACH;aAAM;YACL,MAAM,IAAI,GAAmB,cAAc;gBACzC,CAAC,iCAAM,KAAK,KAAE,SAAS,EAAE,cAAc,CAAC,SAAS,EAAE,QAAQ,EAAE,cAAc,CAAC,QAAQ,IACpF,CAAC,CAAC,KAAK,CAAC;YAEV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAChC,0EAA0E;gBAC1E,2EAA2E;gBAC3E,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,QAAQ,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;gBAChF,IAAI,QAAQ,CAAC,QAAQ,CAAC,EAAE;oBACtB,SAAS;iBACV;gBAED,QAAQ,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;gBAC1B,IAAA,kBAAU,EAAC,KAAK,EAAE,IAAI,CAAC,CAAC;aACzB;SACF;KACF;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AA5DD,wBA4DC"}

@@ -10,2 +10,18 @@ /// <reference types="react" />

nonce?: string;
/**
* A unique key identifying the style container. Used to namespace the
* deduplication cache so styles inserted into a custom container (e.g. a
* Shadow DOM) are tracked independently from the main document cache.
*
* Must be provided together with `container`.
*/
cacheKey?: string;
/**
* A DOM node into which Compiled will insert `<style>` elements instead of
* `document.head`. Useful when rendering inside a Shadow DOM where styles in
* the main document head are not visible to the shadow tree.
*
* Must be provided together with `cacheKey`.
*/
container?: HTMLElement | ShadowRoot;
}

@@ -12,0 +28,0 @@ /**

import { createElement } from 'react';
import type { CompiledJSX } from './jsx/jsx-local-namespace.js';
export { ClassNames } from './class-names/index.js';
export { StyleContainerProvider } from './runtime/style.js';
export type { StyleContainerConfig } from './runtime/style.js';
export { createStrictAPI } from './create-strict-api/index.js';

@@ -5,0 +7,0 @@ export type { PseudosDeclarations, MediaQueries, AllowedStyles, ApplySchema, ApplySchemaMap, } from './create-strict-api/types.js';

import { createElement } from 'react';
export { ClassNames } from './class-names/index.js';
export { StyleContainerProvider } from './runtime/style.js';
export { createStrictAPI } from './create-strict-api/index.js';

@@ -4,0 +5,0 @@ export { default as css } from './css/index.js';

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAItC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAQ/D,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAe,MAAM,mBAAmB,CAAC;AASxD,OAAO,EAML,EAAE,GACH,MAAM,sBAAsB,CAAC;AAE9B,0CAA0C;AAC1C,kGAAkG;AAClG,MAAM,CAAC,MAAM,GAAG,GAAG,aAAa,CAAC"}
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAItC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAQ/D,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAe,MAAM,mBAAmB,CAAC;AASxD,OAAO,EAML,EAAE,GACH,MAAM,sBAAsB,CAAC;AAE9B,0CAA0C;AAC1C,kGAAkG;AAClG,MAAM,CAAC,MAAM,GAAG,GAAG,aAAa,CAAC"}

@@ -33,2 +33,4 @@ import type { Bucket, StyleSheetOpts } from './types.js';

* Used to move styles to the head of the application during runtime.
* When `opts.container` is provided, styles are inserted into that container
* instead of `document.head` — useful for Shadow DOM rendering.
*

@@ -35,0 +37,0 @@ * @param css string

@@ -67,9 +67,32 @@ import { isCacheDisabled } from './cache.js';

/**
* Lazily adds a `<style>` bucket to the `<head>`.
* This will ensure that the style buckets are ordered.
* Holds style buckets per custom container (e.g. a ShadowRoot), keyed by the
* container DOM node. Uses WeakMap so entries are garbage collected when the
* container is removed from the page.
*/
const styleBucketsByContainer = new WeakMap();
/**
* Lazily adds a `<style>` bucket to a container, defaulting to `the `<head>`
* when no container is provided in opts. Ensures style buckets are inserted in
* the correct order regardless of the target container.
*
* @param bucket Bucket to insert in the head.
* Each custom container (e.g. a ShadowRoot) gets its own independent set of
* buckets via the WeakMap — the main document singleton is unaffected.
*
* @param bucketName Bucket to insert into the container.
* @param opts StyleSheetOpts optionally including a custom container.
*/
function lazyAddStyleBucketToHead(bucketName, opts) {
if (!styleBucketsInHead[bucketName]) {
function lazyAddStyleBucketToContainer(bucketName, opts) {
var _a;
const target = (_a = opts.container) !== null && _a !== void 0 ? _a : document.head;
let buckets;
if (opts.container) {
if (!styleBucketsByContainer.has(opts.container)) {
styleBucketsByContainer.set(opts.container, {});
}
buckets = styleBucketsByContainer.get(opts.container);
}
else {
buckets = styleBucketsInHead;
}
if (!buckets[bucketName]) {
let currentBucketIndex = styleBucketOrdering.indexOf(bucketName) + 1;

@@ -79,3 +102,3 @@ let nextBucketFromCache = null;

for (; currentBucketIndex < styleBucketOrdering.length; currentBucketIndex++) {
const nextBucket = styleBucketsInHead[styleBucketOrdering[currentBucketIndex]];
const nextBucket = buckets[styleBucketOrdering[currentBucketIndex]];
if (nextBucket) {

@@ -89,9 +112,9 @@ nextBucketFromCache = nextBucket;

tag.appendChild(document.createTextNode(''));
document.head.insertBefore(tag, nextBucketFromCache);
target.insertBefore(tag, nextBucketFromCache);
if (false) {
return tag;
}
styleBucketsInHead[bucketName] = tag;
buckets[bucketName] = tag;
}
return styleBucketsInHead[bucketName];
return buckets[bucketName];
}

@@ -144,2 +167,4 @@ /**

* Used to move styles to the head of the application during runtime.
* When `opts.container` is provided, styles are inserted into that container
* instead of `document.head` — useful for Shadow DOM rendering.
*

@@ -151,3 +176,3 @@ * @param css string

const bucketName = getStyleBucketName(css);
const style = lazyAddStyleBucketToHead(bucketName, opts);
const style = lazyAddStyleBucketToContainer(bucketName, opts);
if (process.env.NODE_ENV === 'production') {

@@ -154,0 +179,0 @@ const sheet = style.sheet;

@@ -1,1 +0,1 @@

{"version":3,"file":"sheet.js","sourceRoot":"","sources":["../../../src/runtime/sheet.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"sheet.js","sourceRoot":"","sources":["../../../src/runtime/sheet.ts"],"names":[],"mappings":"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"}
/// <reference types="react" />
import { StyleContainerProvider } from './style-container.js';
import type { StyleSheetOpts } from './types.js';
export { StyleContainerProvider };
export type { StyleContainerConfig } from './style-container.js';
interface StyleProps extends StyleSheetOpts {

@@ -11,2 +14,1 @@ /**

export default function Style(props: StyleProps): JSX.Element | null;
export {};

@@ -6,4 +6,7 @@ import React from 'react';

import { useCache } from './style-cache.js';
import { StyleContainerProvider, useStyleContainer } from './style-container.js';
export { StyleContainerProvider };
export default function Style(props) {
const inserted = useCache();
const styleContainer = useStyleContainer();
if (process.env.NODE_ENV === 'development') {

@@ -36,9 +39,14 @@ props.children.forEach(analyzeCssInDev);

else {
const opts = styleContainer
? Object.assign(Object.assign({}, props), { container: styleContainer.container, cacheKey: styleContainer.cacheKey }) : props;
for (let i = 0; i < props.children.length; i++) {
const sheet = props.children[i];
if (inserted[sheet]) {
// When a container is active, namespace the cache key so this container's
// inserted records are tracked independently from the main document cache.
const cacheKey = styleContainer ? `${styleContainer.cacheKey}:${sheet}` : sheet;
if (inserted[cacheKey]) {
continue;
}
inserted[sheet] = true;
insertRule(sheet, props);
inserted[cacheKey] = true;
insertRule(sheet, opts);
}

@@ -45,0 +53,0 @@ }

@@ -1,1 +0,1 @@

{"version":3,"file":"style.js","sourceRoot":"","sources":["../../../src/runtime/style.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,UAAU,EAAE,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAW5C,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,KAAiB;IAC7C,MAAM,QAAQ,GAAG,QAAQ,EAAE,CAAC;IAE5B,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE;QAC1C,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;KACzC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE;QACzB,IAAI,mBAAmB,EAAE,EAAE;YACzB,MAAM,cAAc,GAAoC,EAAE,CAAC;YAC3D,IAAI,SAAS,GAAG,KAAK,CAAC;YAEtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;oBACnB,SAAS;iBACV;qBAAM;oBACL,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;oBACvB,SAAS,GAAG,IAAI,CAAC;iBAClB;gBAED,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC7C,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC;aACzE;YAED,IAAI,CAAC,SAAS,EAAE;gBACd,OAAO,IAAI,CAAC;aACb;YAED,OAAO,CACL,mDAEE,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,uBAAuB,EAAE;oBACvB,MAAM,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;iBAC7E,GACD,CACH,CAAC;SACH;aAAM;YACL,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;oBACnB,SAAS;iBACV;gBAED,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;gBACvB,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;aAC1B;SACF;KACF;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
{"version":3,"file":"style.js","sourceRoot":"","sources":["../../../src/runtime/style.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,UAAU,EAAE,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGjF,OAAO,EAAE,sBAAsB,EAAE,CAAC;AAWlC,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,KAAiB;IAC7C,MAAM,QAAQ,GAAG,QAAQ,EAAE,CAAC;IAC5B,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAE3C,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE;QAC1C,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;KACzC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE;QACzB,IAAI,mBAAmB,EAAE,EAAE;YACzB,MAAM,cAAc,GAAoC,EAAE,CAAC;YAC3D,IAAI,SAAS,GAAG,KAAK,CAAC;YAEtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAChC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;oBACnB,SAAS;iBACV;qBAAM;oBACL,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;oBACvB,SAAS,GAAG,IAAI,CAAC;iBAClB;gBAED,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAC7C,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC;aACzE;YAED,IAAI,CAAC,SAAS,EAAE;gBACd,OAAO,IAAI,CAAC;aACb;YAED,OAAO,CACL,mDAEE,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,uBAAuB,EAAE;oBACvB,MAAM,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;iBAC7E,GACD,CACH,CAAC;SACH;aAAM;YACL,MAAM,IAAI,GAAmB,cAAc;gBACzC,CAAC,iCAAM,KAAK,KAAE,SAAS,EAAE,cAAc,CAAC,SAAS,EAAE,QAAQ,EAAE,cAAc,CAAC,QAAQ,IACpF,CAAC,CAAC,KAAK,CAAC;YAEV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAChC,0EAA0E;gBAC1E,2EAA2E;gBAC3E,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,QAAQ,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;gBAChF,IAAI,QAAQ,CAAC,QAAQ,CAAC,EAAE;oBACtB,SAAS;iBACV;gBAED,QAAQ,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;gBAC1B,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;aACzB;SACF;KACF;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}

@@ -10,2 +10,18 @@ /// <reference types="react" />

nonce?: string;
/**
* A unique key identifying the style container. Used to namespace the
* deduplication cache so styles inserted into a custom container (e.g. a
* Shadow DOM) are tracked independently from the main document cache.
*
* Must be provided together with `container`.
*/
cacheKey?: string;
/**
* A DOM node into which Compiled will insert `<style>` elements instead of
* `document.head`. Useful when rendering inside a Shadow DOM where styles in
* the main document head are not visible to the shadow tree.
*
* Must be provided together with `cacheKey`.
*/
container?: HTMLElement | ShadowRoot;
}

@@ -12,0 +28,0 @@ /**

{
"name": "@compiled/react",
"version": "0.20.0",
"version": "0.21.0",
"description": "A familiar and performant compile time CSS-in-JS library for React.",

@@ -81,3 +81,3 @@ "keywords": [

"@fixture/strict-api-test": "*",
"@testing-library/react": "^16.1.0",
"@testing-library/react": "^16.3.2",
"@types/jsdom": "^16.2.15",

@@ -84,0 +84,0 @@ "@types/react-dom": "^18.3.1",

@@ -6,2 +6,4 @@ import { createElement } from 'react';

export { ClassNames } from './class-names/index.js';
export { StyleContainerProvider } from './runtime/style.js';
export type { StyleContainerConfig } from './runtime/style.js';
export { createStrictAPI } from './create-strict-api/index.js';

@@ -8,0 +10,0 @@ export type {

@@ -21,3 +21,3 @@ import { runBenchmark } from '@compiled/benchmark';

describe('sheet benchmark', () => {
it('completes with insertRule as the fastest', async () => {
it('completes without errors', async () => {
const rules = [

@@ -58,6 +58,4 @@ '._s7n4jp4b{vertical-align:top}',

expect(benchmark).toMatchObject({
fastest: expect.arrayContaining(['insertRule']),
});
expect(benchmark).toBeDefined();
}, 30000);
});

@@ -5,2 +5,6 @@ import { render } from '@testing-library/react';

import StyleWithContainer from '../style';
import { StyleContainerProvider } from '../style-container';
import type * as StyleContainerModule from '../style-container';
jest.mock('../is-server-environment', () => ({

@@ -23,3 +27,5 @@ isServerEnvironment: () => false,

// We want to isolate the test to correctly mimic the environment being loaded in once
const createIsolatedTest = (callback: (Style: ComponentType<{ children: string[] }>) => void) => {
const createIsolatedTest = (
callback: (Style: ComponentType<{ children: string[]; nonce?: string }>) => void
) => {
jest.isolateModules(() => {

@@ -183,2 +189,143 @@ // eslint-disable-next-line @typescript-eslint/no-var-requires

});
describe('StyleContainerProvider', () => {
let container: HTMLDivElement;
beforeEach(() => {
container = document.createElement('div');
document.body.appendChild(container);
});
afterEach(() => {
document.body.removeChild(container);
});
it('should insert styles into the provided container instead of document.head', () => {
render(
<StyleContainerProvider container={container} cacheKey="test">
<StyleWithContainer>{[`.a { color: red; }`]}</StyleWithContainer>
</StyleContainerProvider>
);
expect(container.innerHTML).toInclude('.a { color: red; }');
expect(document.head.innerHTML).not.toInclude('.a { color: red; }');
expect(console.error).not.toHaveBeenCalled();
});
it('should maintain bucket ordering within the container', () => {
render(
<StyleContainerProvider container={container} cacheKey="test">
<StyleWithContainer>
{[
`._a1234567:hover{ color: red; }`,
`._b1234567:active{ color: blue; }`,
`._c1234567{ display: block; }`,
`@media (max-width: 800px){ ._d1234567{ color: yellow; } }`,
]}
</StyleWithContainer>
</StyleContainerProvider>
);
expect(container.innerHTML.split('</style>').join('</style>\n')).toMatchInlineSnapshot(`
"<style>._c1234567{ display: block; }</style>
<style>._a1234567:hover{ color: red; }</style>
<style>._b1234567:active{ color: blue; }</style>
<style>@media (max-width: 800px){ ._d1234567{ color: yellow; } }</style>
"
`);
expect(console.error).not.toHaveBeenCalled();
});
it('should not insert duplicate styles into the container', () => {
render(
<StyleContainerProvider container={container} cacheKey="test">
<StyleWithContainer>{[`.b { color: blue; }`]}</StyleWithContainer>
<StyleWithContainer>{[`.b { color: blue; }`]}</StyleWithContainer>
</StyleContainerProvider>
);
expect(container.innerHTML).toIncludeRepeated('.b { color: blue; }', 1);
expect(console.error).not.toHaveBeenCalled();
});
it('should track container and document.head caches independently using cacheKey', () => {
// Render the same style into both the main document and a container.
// Each should receive its own copy since they are independent targets.
render(<StyleWithContainer>{[`.c { color: green; }`]}</StyleWithContainer>);
render(
<StyleContainerProvider container={container} cacheKey="shadow">
<StyleWithContainer>{[`.c { color: green; }`]}</StyleWithContainer>
</StyleContainerProvider>
);
expect(document.head.innerHTML).toInclude('.c { color: green; }');
expect(container.innerHTML).toInclude('.c { color: green; }');
expect(console.error).not.toHaveBeenCalled();
});
it('should track two containers independently using different cacheKeys', () => {
const container2 = document.createElement('div');
document.body.appendChild(container2);
render(
<StyleContainerProvider container={container} cacheKey="shadow-a">
<StyleWithContainer>{[`.d { color: pink; }`]}</StyleWithContainer>
</StyleContainerProvider>
);
render(
<StyleContainerProvider container={container2} cacheKey="shadow-b">
<StyleWithContainer>{[`.d { color: pink; }`]}</StyleWithContainer>
</StyleContainerProvider>
);
expect(container.innerHTML).toInclude('.d { color: pink; }');
expect(container2.innerHTML).toInclude('.d { color: pink; }');
document.body.removeChild(container2);
expect(console.error).not.toHaveBeenCalled();
});
it('should forward nonce to style elements in the container', () => {
render(
<StyleContainerProvider container={container} cacheKey="test">
<StyleWithContainer nonce="abc123">{[`.e { color: orange; }`]}</StyleWithContainer>
</StyleContainerProvider>
);
expect(container.innerHTML).toInclude('nonce="abc123"');
expect(console.error).not.toHaveBeenCalled();
});
it('should warn in dev when used in a server environment', () => {
jest.resetModules();
jest.doMock('../is-server-environment', () => ({
isServerEnvironment: () => true,
}));
// Re-require to pick up the new mock
const { StyleContainerProvider: ServerStyleContainerProvider } =
jest.requireActual<typeof StyleContainerModule>('../style-container');
const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {});
const { container: renderContainer } = render(
<ServerStyleContainerProvider container={container} cacheKey="test">
<div />
</ServerStyleContainerProvider>
);
expect(warnSpy).toHaveBeenCalledWith(
expect.stringContaining(
'@compiled/react: StyleContainerProvider has no effect in server environments.'
)
);
// Children should still be rendered
expect(renderContainer.querySelector('div')).not.toBeNull();
warnSpy.mockRestore();
jest.resetModules();
});
});
});

@@ -70,17 +70,43 @@ import { isCacheDisabled } from './cache.js';

};
/**
* Holds style buckets per custom container (e.g. a ShadowRoot), keyed by the
* container DOM node. Uses WeakMap so entries are garbage collected when the
* container is removed from the page.
*/
const styleBucketsByContainer = new WeakMap<
HTMLElement | ShadowRoot,
Partial<Record<Bucket, HTMLStyleElement>>
>();
/**
* Lazily adds a `<style>` bucket to the `<head>`.
* This will ensure that the style buckets are ordered.
* Lazily adds a `<style>` bucket to a container, defaulting to `the `<head>`
* when no container is provided in opts. Ensures style buckets are inserted in
* the correct order regardless of the target container.
*
* @param bucket Bucket to insert in the head.
* Each custom container (e.g. a ShadowRoot) gets its own independent set of
* buckets via the WeakMap — the main document singleton is unaffected.
*
* @param bucketName Bucket to insert into the container.
* @param opts StyleSheetOpts optionally including a custom container.
*/
function lazyAddStyleBucketToHead(bucketName: Bucket, opts: StyleSheetOpts): HTMLStyleElement {
if (!styleBucketsInHead[bucketName]) {
function lazyAddStyleBucketToContainer(bucketName: Bucket, opts: StyleSheetOpts): HTMLStyleElement {
const target = opts.container ?? document.head;
let buckets: Partial<Record<Bucket, HTMLStyleElement>>;
if (opts.container) {
if (!styleBucketsByContainer.has(opts.container)) {
styleBucketsByContainer.set(opts.container, {});
}
buckets = styleBucketsByContainer.get(opts.container)!;
} else {
buckets = styleBucketsInHead;
}
if (!buckets[bucketName]) {
let currentBucketIndex = styleBucketOrdering.indexOf(bucketName) + 1;
let nextBucketFromCache = null;
let nextBucketFromCache: HTMLStyleElement | null = null;
// Find the next bucket which we will add our new style bucket before.
for (; currentBucketIndex < styleBucketOrdering.length; currentBucketIndex++) {
const nextBucket = styleBucketsInHead[styleBucketOrdering[currentBucketIndex]];
const nextBucket = buckets[styleBucketOrdering[currentBucketIndex]];
if (nextBucket) {

@@ -95,3 +121,3 @@ nextBucketFromCache = nextBucket;

tag.appendChild(document.createTextNode(''));
document.head.insertBefore(tag, nextBucketFromCache);
target.insertBefore(tag, nextBucketFromCache);

@@ -102,6 +128,6 @@ if (isCacheDisabled()) {

styleBucketsInHead[bucketName] = tag;
buckets[bucketName] = tag;
}
return styleBucketsInHead[bucketName]!;
return buckets[bucketName]!;
}

@@ -160,2 +186,4 @@

* Used to move styles to the head of the application during runtime.
* When `opts.container` is provided, styles are inserted into that container
* instead of `document.head` — useful for Shadow DOM rendering.
*

@@ -167,3 +195,3 @@ * @param css string

const bucketName = getStyleBucketName(css);
const style = lazyAddStyleBucketToHead(bucketName, opts);
const style = lazyAddStyleBucketToContainer(bucketName, opts);

@@ -170,0 +198,0 @@ if (process.env.NODE_ENV === 'production') {

@@ -7,4 +7,8 @@ import React from 'react';

import { useCache } from './style-cache.js';
import { StyleContainerProvider, useStyleContainer } from './style-container.js';
import type { Bucket, StyleSheetOpts } from './types.js';
export { StyleContainerProvider };
export type { StyleContainerConfig } from './style-container.js';
interface StyleProps extends StyleSheetOpts {

@@ -20,2 +24,3 @@ /**

const inserted = useCache();
const styleContainer = useStyleContainer();

@@ -58,10 +63,17 @@ if (process.env.NODE_ENV === 'development') {

} else {
const opts: StyleSheetOpts = styleContainer
? { ...props, container: styleContainer.container, cacheKey: styleContainer.cacheKey }
: props;
for (let i = 0; i < props.children.length; i++) {
const sheet = props.children[i];
if (inserted[sheet]) {
// When a container is active, namespace the cache key so this container's
// inserted records are tracked independently from the main document cache.
const cacheKey = styleContainer ? `${styleContainer.cacheKey}:${sheet}` : sheet;
if (inserted[cacheKey]) {
continue;
}
inserted[sheet] = true;
insertRule(sheet, props);
inserted[cacheKey] = true;
insertRule(sheet, opts);
}

@@ -68,0 +80,0 @@ }

@@ -10,2 +10,18 @@ import type { Depths } from '@compiled/utils';

nonce?: string;
/**
* A unique key identifying the style container. Used to namespace the
* deduplication cache so styles inserted into a custom container (e.g. a
* Shadow DOM) are tracked independently from the main document cache.
*
* Must be provided together with `container`.
*/
cacheKey?: string;
/**
* A DOM node into which Compiled will insert `<style>` elements instead of
* `document.head`. Useful when rendering inside a Shadow DOM where styles in
* the main document head are not visible to the shadow tree.
*
* Must be provided together with `cacheKey`.
*/
container?: HTMLElement | ShadowRoot;
}

@@ -12,0 +28,0 @@