Plan step 36 (containment group, error pages): errors::minimal's class lists move into resources/css/components/error-page.css, keyed on data-md-error-page/-art/-shape/-code/-headline/-message/-actions; body carries no hook of its own and is styled by a bare `body` selector, matching how ErrorPage::fallbackStyles() already styles it (no other rewritten view is a full HTML document). The section contract (title, code, headline, message, shape, actions) and the framework's 401/402 compatibility are untouched, since neither depends on a class or a hook. The shape's <x-shape> (a component outside this batch, and one with no "fill the parent" prop) is coloured and sized to its container by a plain `svg` descendant selector rather than a class or a new prop. The page's font stays a literal system stack, not var(--md-ref-typeface-brand): Tailwind's own `font-sans` utility this replaces was never the brand font either (resources/css/tokens/theme.css's --font-sans is the only utility that is), and an error page must read before any webfont has loaded. ErrorPage::fallbackStyles() draws onto the same hooks, renamed the same way (data-error-* -> data-md-error-*, data-error-fallback -> data-md-error-fallback) so the no-build path keeps working; how it is built (a hand-written heredoc, not Stylesheets::bundle()) is unchanged, per step 40. Updated in the same commit: tests/Feature/ErrorPagesTest.php and tests/Browser/ErrorPagesTest.php. The error pages' views live outside resources/views/components/, so they are not in ContainmentStylesheetsTest's dataset (its "imports what its view renders" check reads a fixed resources/views/components/<name>.blade.php path); adapted tests/Feature/ErrorPagesTest.php instead, with the same stylesheet- shape, import, ViewClasses, token/px-breakpoint and containment-block checks the dataset gives every other component. Imported from the Containment block of components.css. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qwx5USif3wFFmxtHg5U1g9
55 lines
2.2 KiB
PHP
55 lines
2.2 KiB
PHP
<?php
|
|
|
|
/**
|
|
* The 404 page, reached the way a visitor reaches it: an address nothing answers.
|
|
*/
|
|
function missingPage(string $colorScheme = 'light')
|
|
{
|
|
$page = visit('/nothing-lives-here');
|
|
$page = $colorScheme === 'dark' ? $page->inDarkMode() : $page->inLightMode();
|
|
|
|
return $page->waitForEvent('networkidle')
|
|
->assertScript("document.readyState === 'complete' && document.querySelector('[data-md-error-page]') !== null");
|
|
}
|
|
|
|
/**
|
|
* Whether the element's computed background is the colour a role resolves to on this page.
|
|
*/
|
|
function paintedIn(string $selector, string $role): string
|
|
{
|
|
return <<<JS
|
|
(() => {
|
|
const probe = document.createElement('div');
|
|
probe.style.backgroundColor = 'var(--md-sys-color-{$role})';
|
|
document.body.append(probe);
|
|
const expected = getComputedStyle(probe).backgroundColor;
|
|
probe.remove();
|
|
|
|
return expected !== 'rgba(0, 0, 0, 0)' && getComputedStyle(document.querySelector('{$selector}')).backgroundColor === expected;
|
|
})()
|
|
JS;
|
|
}
|
|
|
|
it('draws the 404 page in the scheme, in light and dark', function () {
|
|
missingPage('light')
|
|
->assertSee('Page not found')
|
|
->assertVisible('[data-md-error-headline]')
|
|
->assertScript("document.documentElement.getAttribute('data-theme') === 'light'")
|
|
->assertScript(paintedIn('body', 'surface'))
|
|
->assertScript("getComputedStyle(document.querySelector('[data-md-error-shape] svg')).color !== getComputedStyle(document.body).color")
|
|
->assertNoJavaScriptErrors();
|
|
|
|
missingPage('dark')
|
|
->assertScript("document.documentElement.getAttribute('data-theme') === 'dark'")
|
|
->assertScript(paintedIn('body', 'surface'))
|
|
->assertScript("getComputedStyle(document.body).backgroundColor !== 'rgb(253, 247, 254)'");
|
|
});
|
|
|
|
it('fits a 400px screen without scrolling sideways', function () {
|
|
missingPage()
|
|
->resize(400, 800)
|
|
->assertVisible('[data-md-error-headline]')
|
|
->assertScript('document.documentElement.scrollWidth <= window.innerWidth')
|
|
->assertScript("document.querySelector('[data-md-error-actions] a').getBoundingClientRect().right <= 400");
|
|
});
|