* feat: ship public site with SEO and visuals Publish CMS content on public routes with responsive media, accessibility checks, and deterministic visual baselines. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: make browser visual CI deterministic for media Mount host public storage into FrankenPHP so seeded fixtures are served, and replace PNG-as-JPG fixtures with real JPEGs so Chromium can render them. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: serve public media on same-origin storage paths Pest Browser hosts on 127.0.0.1:port while Storage::url used http://localhost, so screenshots captured broken images. Use relative /storage URLs for media and absolutize only OG tags via url(). Co-authored-by: Cursor <cursoragent@cursor.com> * test: refresh visual baselines from CI Ubuntu screenshots Media now loads on same-origin /storage paths, so baselines must capture the rendered fixtures. Use full-page snapshots from the CI runner to keep Pest's exact snapshot match stable across environments. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com>
2.7 KiB
2.7 KiB
ADDED Requirements
Requirement: Public routes have no critical or serious accessibility issues
The system SHALL run automated accessibility checks on the public routes covered by the browser suite (SPEC §6.5, §13.8). A critical or serious issue MUST fail the suite.
Scenario: Critical issue blocks the suite
- WHEN the automated accessibility check reports a critical or serious issue on a covered route
- THEN the browser suite MUST fail and report the offending rule and selector
Scenario: Covered routes are checked
- WHEN the accessibility suite runs
- THEN the home, services listing, portfolio listing and case detail MUST each be checked
Requirement: Public pages use accessible semantic structure
Public pages SHALL provide semantic landmarks, exactly one h1 per page, a coherent heading order, alt text on every content image, and visible focus on interactive elements (SPEC §6.5).
Scenario: Single h1 per page
- WHEN any public page is rendered
- THEN exactly one
h1element MUST be present
Scenario: Landmarks are present
- WHEN any public page is rendered
- THEN
header,main,navandfooterlandmarks MUST be present
Scenario: Content images expose alt text
- WHEN a page renders a cover or gallery image
- THEN the
altattribute MUST contain the stored alt text
Requirement: Public pages are fully keyboard operable
Visitors SHALL be able to reach and activate every interactive element with the keyboard, with a visible focus indicator and a skip link to the main content.
Scenario: Keyboard reaches the primary CTA
- WHEN a visitor navigates the home with the Tab key
- THEN the primary CTA MUST receive focus with a visible indicator
- AND activating it with the keyboard MUST navigate to the contact route
Scenario: Skip link bypasses navigation
- WHEN a visitor focuses the first element of a public page
- THEN a skip link to the main content MUST be available
Requirement: Reduced motion preference is honored
The system SHALL suppress non-essential animation and transition when the user agent reports prefers-reduced-motion: reduce.
Scenario: Reduced motion disables transitions
- GIVEN the browser reports
prefers-reduced-motion: reduce - WHEN a public page is loaded
- THEN decorative transitions and animations MUST NOT run
Requirement: Public pages emit no console errors
Covered public routes SHALL load without JavaScript console errors in a real browser (SPEC §13.8, §19).
Scenario: Console stays clean on covered routes
- WHEN a covered public route is loaded in the browser suite
- THEN the console MUST contain no error-level messages