diff --git a/.changeset/metal-insects-flow.md b/.changeset/metal-insects-flow.md new file mode 100644 index 000000000000..79b883625974 --- /dev/null +++ b/.changeset/metal-insects-flow.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: restore ClassDirective check for compound class selectors in CSS pruning 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 b9a5688a87d0..035a9a489aea 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 @@ -532,7 +532,12 @@ function relative_selector_might_apply_to_node(relative_selector, rule, element, } case 'ClassSelector': { - if (!attribute_matches(element, 'class', name, '~=', false)) { + if ( + !attribute_matches(element, 'class', name, '~=', false) && + !element.attributes.some( + (attribute) => attribute.type === 'ClassDirective' && attribute.name === name + ) + ) { return false; } diff --git a/packages/svelte/tests/css/samples/class-directive-compound-selectors/_config.js b/packages/svelte/tests/css/samples/class-directive-compound-selectors/_config.js new file mode 100644 index 000000000000..23a1d953c09b --- /dev/null +++ b/packages/svelte/tests/css/samples/class-directive-compound-selectors/_config.js @@ -0,0 +1,20 @@ +import { test } from '../../test'; + +export default test({ + warnings: [ + { + code: 'css_unused_selector', + message: 'Unused CSS selector ".unused"\nhttps://svelte.dev/e/css_unused_selector', + start: { + line: 18, + column: 1, + character: 231 + }, + end: { + line: 18, + column: 8, + character: 238 + } + } + ] +}); diff --git a/packages/svelte/tests/css/samples/class-directive-compound-selectors/expected.css b/packages/svelte/tests/css/samples/class-directive-compound-selectors/expected.css new file mode 100644 index 000000000000..f861ac7cea74 --- /dev/null +++ b/packages/svelte/tests/css/samples/class-directive-compound-selectors/expected.css @@ -0,0 +1,11 @@ +.sidebar.collapsed.svelte-xyz { + width: 60px; + } + + .collapsed.svelte-xyz .content:where(.svelte-xyz) { + opacity: 0; + } + + /* (unused) .unused { + color: red; + }*/ diff --git a/packages/svelte/tests/css/samples/class-directive-compound-selectors/input.svelte b/packages/svelte/tests/css/samples/class-directive-compound-selectors/input.svelte new file mode 100644 index 000000000000..9e48d1323698 --- /dev/null +++ b/packages/svelte/tests/css/samples/class-directive-compound-selectors/input.svelte @@ -0,0 +1,21 @@ + + +
+ +