Retarget forbidColours() at where 2.0.0 writes a role

Plan step 41 review (the user, 2026-09-15): an application without Tailwind
names a role through its --md-sys-color-* custom property (CSS, an inline
style, a script), an md-ink-* class, or a component's color/tone prop, not
a bg-tertiary utility. forbidColours() keeps its name and signature and
reports each of those, the role's on- and container roles included;
a Tailwind leftover stays family (i)'s single report. ReStride's
forbidColours(['tertiary', 'primary-container']) keeps its meaning.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Qwx5USif3wFFmxtHg5U1g9
This commit is contained in:
Andreas Reinhold / reini
2026-09-15 08:35:06 +02:00
co-authored by Claude Opus 5
parent 6dc996afdf
commit d5972b8ddb
6 changed files with 126 additions and 13 deletions
+22 -4
View File
@@ -278,12 +278,30 @@ it('reports an arbitrary [] value once, whatever utility it modifies, and strips
]);
});
it('bans the roles an application leaves out', function () {
$violations = fixtureRelative(DesignGuard::scan(realpath(GUARD_FIXTURES.'/views'))
->forbidColours(['tertiary'])
it('bans the roles an application leaves out, wherever 2.0.0 writes one', function () {
$violations = fixtureRelative(DesignGuard::scan(realpath(GUARD_FIXTURES.'/forbidden-colours'))
->forbidColours(['tertiary', 'primary-container', 'error'])
->violations());
expect($violations)->toContain('views/page.blade.php:6 colour the theme does not declare `text-tertiary`');
expect($violations)->toBe([
'forbidden-colours/page.blade.php:5 Tailwind colour utility `bg-tertiary` compiles to nothing — use `var(--md-sys-color-tertiary)` in your own CSS',
"forbidden-colours/page.blade.php:1 `color=\"tertiary\"`: role `tertiary` is not part of this application's palette",
"forbidden-colours/page.blade.php:2 `:tone=\"'tertiary'\"`: role `tertiary` is not part of this application's palette",
"forbidden-colours/page.blade.php:3 `:color=\"\$failed ? 'error' : 'info'\"`: role `error` is not part of this application's palette",
"forbidden-colours/page.blade.php:4 `--md-sys-color-on-tertiary-container`: role `tertiary` is not part of this application's palette",
"forbidden-colours/page.blade.php:4 `md-ink-error`: role `error` is not part of this application's palette",
"forbidden-colours/page.blade.php:7 `--md-sys-color-primary-container`: role `primary-container` is not part of this application's palette",
"forbidden-colours/app.css:3 `--md-sys-color-tertiary-container`: role `tertiary` is not part of this application's palette",
"forbidden-colours/app.css:4 `--md-sys-color-on-primary-container`: role `primary-container` is not part of this application's palette",
]);
});
it('leaves every role alone until an application forbids one', function () {
$violations = fixtureRelative(DesignGuard::scan(realpath(GUARD_FIXTURES.'/forbidden-colours'))->violations());
expect($violations)->toBe([
'forbidden-colours/page.blade.php:5 Tailwind colour utility `bg-tertiary` compiles to nothing — use `var(--md-sys-color-tertiary)` in your own CSS',
]);
});
it('bans any further pattern', function () {
@@ -0,0 +1,9 @@
/* var(--md-sys-color-tertiary) in a comment is ignored */
.hero {
background: var(--md-sys-color-tertiary-container);
color: var(--md-sys-color-on-primary-container);
}
.fine {
color: var(--md-sys-color-primary);
}
@@ -0,0 +1,8 @@
<x-button label="Save" color="tertiary" />
<x-badge :tone="'tertiary'" />
<x-alert :color="$failed ? 'error' : 'info'" />
<p class="md-ink-error" style="border-color: var(--md-sys-color-on-tertiary-container)">Failed</p>
<div class="bg-tertiary"></div>
<x-button color="primary" label="Allowed" />
<span style="background: var(--md-sys-color-primary-container)"></span>
<span style="background: var(--md-sys-color-tertiary-fixed)">A fixed role is another role</span>