From 3864eb4265011dbc2135cde973bea84849f7cf0a Mon Sep 17 00:00:00 2001 From: Markus Sanin Date: Fri, 3 Apr 2026 07:42:54 +0200 Subject: [PATCH] Change styleSheet loading for shadow root --- demo-app/components/host-wrapper.gts | 31 ++++++++++++++++++---------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/demo-app/components/host-wrapper.gts b/demo-app/components/host-wrapper.gts index 9748b6d0..261ce4f0 100644 --- a/demo-app/components/host-wrapper.gts +++ b/demo-app/components/host-wrapper.gts @@ -15,17 +15,29 @@ export default class HostWrapper extends Component<{ this.shadow = shadowRoot; }; - get getStyles() { - return [...document.head.querySelectorAll('link')].map((link) => link.href); - } - attachShadow = modifier( (element: Element, [set]: [(shadowRoot: HTMLDivElement) => void]) => { - let shadowRoot = element; + let shadowRoot: Element | ShadowRoot = element; if (shadowRootBuild) { - shadowRoot = element.attachShadow({ - mode: 'open', - }) as unknown as Element; + const sr = element.attachShadow({ mode: 'open' }); + // Apply document stylesheets synchronously via Constructable Stylesheets + // so that layout (offsetHeight, offsetTop) is correct immediately when + // modifiers fire — avoiding the async race condition. + sr.adoptedStyleSheets = [...document.styleSheets].reduce< + CSSStyleSheet[] + >((acc, sheet) => { + try { + const cs = new CSSStyleSheet(); + cs.replaceSync( + [...sheet.cssRules].map((r) => r.cssText).join('\n'), + ); + acc.push(cs); + } catch { + // Skip cross-origin stylesheets whose rules are inaccessible + } + return acc; + }, []); + shadowRoot = sr; } const div = document.createElement('div'); shadowRoot.appendChild(div); @@ -42,9 +54,6 @@ export default class HostWrapper extends Component<{ {{#if this.shadow}} {{#in-element this.shadow}} {{#if shadowRootBuild}} - {{#each this.getStyles as |styleHref|}} - - {{/each}} {{/if}} {{yield}}