diff --git a/.agents/snapshots/built-css-values.json b/.agents/snapshots/built-css-values.json index 2a0c2d4..3927c01 100644 --- a/.agents/snapshots/built-css-values.json +++ b/.agents/snapshots/built-css-values.json @@ -288,5 +288,16 @@ "1960px", "2200px", "2880px" + ], + "breakpoints": [ + "520px", + "560px", + "600px", + "800px", + "880px", + "1050px", + "1100px", + "1600px", + "2200px" ] } diff --git a/scripts/audit-ui.mjs b/scripts/audit-ui.mjs index d906d67..9b98420 100644 --- a/scripts/audit-ui.mjs +++ b/scripts/audit-ui.mjs @@ -25,9 +25,21 @@ const builtCss = walk('dist/_astro') .filter((path) => path.endsWith('.css')) .map((path) => readFileSync(path, 'utf8')) .join('\n'); +// A declaration nothing references cannot style anything. Dropping the dead ones +// before the value scan is what stops a lost value from being "restored" with an +// unreferenced token that exists only to put the string back into the sheet. +const referenced = uses(builtCss); +const liveCss = builtCss.replace(/(--[\w-]+)\s*:[^;}]*[;}]/g, (declaration, name) => + referenced.has(name) ? declaration : '', +); +const colorPattern = /#[0-9a-fA-F]{3,8}\b|(?:rgba?|hsla?)\([^)]*\)/g; +const sizePattern = /\b\d+(?:\.\d+)?(?:px|rem|em|vw|vh)\b/g; +// Only the media prelude, so a breakpoint has to be an actual query condition. +const mediaPreludes = (builtCss.match(/@media[^{]+/g) || []).join('\n'); const builtValues = { - colors: new Set(builtCss.match(/#[0-9a-fA-F]{3,8}\b|(?:rgba?|hsla?)\([^)]*\)/g) || []), - sizes: new Set(builtCss.match(/\b\d+(?:\.\d+)?(?:px|rem|em|vw|vh)\b/g) || []), + colors: new Set(liveCss.match(colorPattern) || []), + sizes: new Set(liveCss.match(sizePattern) || []), + breakpoints: new Set(mediaPreludes.match(sizePattern) || []), }; if (!builtCss) throw new Error('Astro build emitted no CSS assets to audit'); // Captured from origin/main after its Astro build. This catches a value that is