Test check (iii) and fix two bugs it exposed in the application-CSS scan
Plan step 41(iii): fixtures/tests for every literal kind (colour, radius, shadow, font size/weight, line height, letter spacing, easing, duration) and an off-scale media query, plus material-scheme.css excluded by name and by its generated header wherever it sits among the scanned paths. Also adds a fixture proving Tailwind-shaped bare words in running prose are never read as classes. Two fixes found by writing the fixtures rather than only the implementation: a directly-scanned .css file was also running through the Blade/PHP/JS checks (the same file's `ease-in-out` in a `transition` value tripped the old scale check a second time), so a CSS file is now check (iii)'s alone; and `withoutTokenFunctions()` leaves a `var()`/`calc()` call's own name and parentheses standing once its arguments are blanked, which `isSafeLiteralValue()` did not yet recognise as the same "nothing to see here" as an empty value. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qwx5USif3wFFmxtHg5U1g9
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
b998683762
commit
09f4edd31d
@@ -325,6 +325,10 @@ class DesignGuard
|
||||
}
|
||||
|
||||
foreach ($this->files() as $file) {
|
||||
if (str_ends_with($file->getFilename(), '.css')) {
|
||||
continue; // A directly-scanned CSS file is check (iii)'s alone; these checks read Blade, PHP and JS.
|
||||
}
|
||||
|
||||
$contents = (string) file_get_contents($file->getPathname());
|
||||
$where = $this->relative($file->getPathname());
|
||||
$isBlade = str_ends_with($file->getFilename(), '.blade.php');
|
||||
@@ -671,7 +675,7 @@ class DesignGuard
|
||||
*/
|
||||
protected function literalColours(string $css): array
|
||||
{
|
||||
$pattern = '/(?<![\w#-])(?:#[0-9a-fA-F]{3,8}\b|(?:rgb|rgba|hsl|hsla|oklch|oklab|lch|lab|color)\(|(?<=[:,(]\s{0,20})(?:'.self::CSS_NAMED_COLOURS.')\b(?!-))/i';
|
||||
$pattern = '/(?<![\w#-])(?:#[0-9a-fA-F]{3,8}\b|(?:rgb|rgba|hsl|hsla|oklch|oklab|lch|lab|color)\([^)]*\)|(?<=[:,(]\s{0,20})(?:'.self::CSS_NAMED_COLOURS.')\b(?!-))/i';
|
||||
|
||||
preg_match_all($pattern, $css, $matches, PREG_OFFSET_CAPTURE);
|
||||
|
||||
@@ -731,9 +735,16 @@ class DesignGuard
|
||||
return $found;
|
||||
}
|
||||
|
||||
/**
|
||||
* A value `withoutTokenFunctions()` left with nothing but the empty shell of a `var()`/`calc()`
|
||||
* call — whitespace where the call's own argument list used to be, the call's own name and
|
||||
* parentheses still standing — is exactly as fine as one masked away entirely.
|
||||
*/
|
||||
protected function isSafeLiteralValue(string $value): bool
|
||||
{
|
||||
return trim($value) === '' || in_array(strtolower(trim($value)), ['0', '0px', '0s', 'none', 'inherit', 'initial', 'unset', 'normal', 'auto'], true);
|
||||
$value = trim((string) preg_replace('/\b(?:var|calc)\(\s*\)/i', '', $value));
|
||||
|
||||
return $value === '' || in_array(strtolower($value), ['0', '0px', '0s', 'none', 'inherit', 'initial', 'unset', 'normal', 'auto'], true);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user