From ef3020413c08bd1c9d6de279d334396a35434ce9 Mon Sep 17 00:00:00 2001 From: svelte-triage-bot Date: Mon, 7 Sep 2026 21:30:45 +0000 Subject: [PATCH] fix: preserve global CSS without scopable elements --- .changeset/calm-heads-glow.md | 5 +++++ .../phases/2-analyze/css/css-prune.js | 20 +++++++++++++------ .../css/samples/global-head-only/_config.js | 5 +++++ .../css/samples/global-head-only/expected.css | 2 ++ .../css/samples/global-head-only/input.svelte | 6 ++++++ 5 files changed, 32 insertions(+), 6 deletions(-) create mode 100644 .changeset/calm-heads-glow.md create mode 100644 packages/svelte/tests/css/samples/global-head-only/_config.js create mode 100644 packages/svelte/tests/css/samples/global-head-only/expected.css create mode 100644 packages/svelte/tests/css/samples/global-head-only/input.svelte diff --git a/.changeset/calm-heads-glow.md b/.changeset/calm-heads-glow.md new file mode 100644 index 0000000000..ee21d566bb --- /dev/null +++ b/.changeset/calm-heads-glow.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: preserve global CSS in components without scopable elements diff --git a/packages/svelte/src/compiler/phases/2-analyze/css/css-prune.js b/packages/svelte/src/compiler/phases/2-analyze/css/css-prune.js index dff6bb9b5a..125f096783 100644 --- a/packages/svelte/src/compiler/phases/2-analyze/css/css-prune.js +++ b/packages/svelte/src/compiler/phases/2-analyze/css/css-prune.js @@ -145,6 +145,19 @@ export function prune(stylesheet, elements) { }, ComplexSelector(node) { const selectors = get_relative_selectors(node); + const rule = /** @type {Compiler.AST.CSS.Rule} */ (node.metadata.rule); + const first = selectors[0]?.selectors[0]; + const is_icss_export = + selectors.length === 1 && + selectors[0].selectors.length === 1 && + first?.type === 'PseudoClassSelector' && + first.name === 'export' && + first.args === null; + + // Global and ICSS export rules do not depend on an element in this component + if (every_is_global(selectors, 0, selectors.length, rule) || is_icss_export) { + node.metadata.used = true; + } for (const element of elements) { seen.clear(); @@ -153,12 +166,7 @@ export function prune(stylesheet, elements) { // Elements rendered through are not style-scopable. // Prevent css hash injection (class="s-...") on tags like , ,