From 2e066c82ad213562fe4cc985c48b1dac8518ef52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89mile=20R=C3=A9?= Date: Thu, 16 Apr 2026 16:59:45 +0400 Subject: [PATCH] Remove shadow DOM from headless components MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Headless components are behavioral wrappers meant to be styled by the consumer with regular CSS. Shadow DOM on each child created unnecessary style boundaries with no visual content to protect. Only ProboSettingsButton retains its own shadow root since it renders encapsulated styled markup. Also removes the auto-registerComponents() side effect from the main entrypoint so consumers opt in explicitly. Signed-off-by: Émile Ré --- .../cookie-banner/src/components/banner.ts | 8 ------- packages/cookie-banner/src/components/base.ts | 22 +++++-------------- .../cookie-banner/src/components/buttons.ts | 4 ---- .../src/components/category-list.ts | 6 ----- .../src/components/category-toggle.ts | 7 ------ .../cookie-banner/src/components/category.ts | 6 ----- .../src/components/cookie-banner-root.ts | 1 - .../src/components/cookie-list.ts | 16 +------------- .../src/components/preference-panel.ts | 12 ---------- .../src/components/settings-button.ts | 22 ++++++++++++++++--- packages/cookie-banner/src/index.ts | 3 --- 11 files changed, 25 insertions(+), 82 deletions(-) diff --git a/packages/cookie-banner/src/components/banner.ts b/packages/cookie-banner/src/components/banner.ts index 0f034718f..17a6fc057 100644 --- a/packages/cookie-banner/src/components/banner.ts +++ b/packages/cookie-banner/src/components/banner.ts @@ -30,14 +30,6 @@ export class ProboBanner extends ProboElement { }; connectedCallback(): void { - this.shadow.innerHTML = ` - - - `; - this.hidden = true; this.root = this.findAncestor("probo-cookie-banner-root"); diff --git a/packages/cookie-banner/src/components/base.ts b/packages/cookie-banner/src/components/base.ts index bbd9a26cc..130524345 100644 --- a/packages/cookie-banner/src/components/base.ts +++ b/packages/cookie-banner/src/components/base.ts @@ -21,25 +21,13 @@ export interface ConsentDraft { } export class ProboElement extends HTMLElement { - protected shadow: ShadowRoot; - - constructor() { - super(); - this.shadow = this.attachShadow({ mode: "open" }); - } - protected findAncestor(tagName: string): T | null { - let node: Node | null = this as Node; - while (node) { - const root = node.getRootNode(); - if (root instanceof ShadowRoot) { - node = root.host; - } else { - node = (node as HTMLElement).parentElement; - } - if (node instanceof HTMLElement && node.tagName.toLowerCase() === tagName) { - return node as T; + let el: HTMLElement | null = this.parentElement; + while (el) { + if (el.tagName.toLowerCase() === tagName) { + return el as T; } + el = el.parentElement; } return null; } diff --git a/packages/cookie-banner/src/components/buttons.ts b/packages/cookie-banner/src/components/buttons.ts index f542d18f8..e3a4ba8ff 100644 --- a/packages/cookie-banner/src/components/buttons.ts +++ b/packages/cookie-banner/src/components/buttons.ts @@ -20,10 +20,6 @@ class ProboActionButton extends ProboElement { protected root: ProboRootElement | null = null; connectedCallback(): void { - this.shadow.innerHTML = ` - - - `; this.root = this.findAncestor("probo-cookie-banner-root"); this.addEventListener("click", this.handleClick); } diff --git a/packages/cookie-banner/src/components/category-list.ts b/packages/cookie-banner/src/components/category-list.ts index f40e2bdfb..450beab4e 100644 --- a/packages/cookie-banner/src/components/category-list.ts +++ b/packages/cookie-banner/src/components/category-list.ts @@ -26,11 +26,6 @@ export class ProboCategoryList extends ProboElement { }; connectedCallback(): void { - this.shadow.innerHTML = ` - - - `; - this.template = this.querySelector("template"); if (!this.template) { this.warn(" requires a