@compiled/react
Advanced tools
| 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; | ||
| } |
| 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 (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 @@ /** |
+2
-2
| { | ||
| "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", |
+2
-0
@@ -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(); | ||
| }); | ||
| }); | ||
| }); |
+39
-11
@@ -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 @@ } |
+16
-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 @@ |
Unstable ownership
Supply chain riskA new collaborator has begun publishing package versions. Package stability and security risk may be elevated.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 2 instances in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 2 instances in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
536626
9.2%332
3.11%12646
7.88%1
Infinity%42
40%1
Infinity%