Skip to content
Grayson Allen Freestyle Footballer · YVR
  • Home
  • Performances
  • World Cup 2026
  • About
  • Press
Book →
Grayson Allen
  • 01 Home →
  • 02 Performances →
  • 03 World Cup 2026 →
  • 04 About →
  • 05 Press →
Book a performance →
  • Instagram ↗
  • YouTube ↗
  • TikTok ↗

Accessibility.

Last updated: May 18, 2026

This site is built to be usable by everyone, on any input device, on any connection. It targets WCAG 2.2 Level AA conformance. The sections below document what's in place and why each technique matters.

Document structure

Semantic HTML

Pages use real <header>, <nav>, <main>, <article>, <section>, and <footer> landmarks instead of stacks of generic <div>s.

Why: Screen readers expose landmarks as a rotor or shortcut menu. A blind user can jump straight to the booking form or skip the navigation in one keystroke. Generic divs offer none of that.

Heading hierarchy

Each page has exactly one <h1>, followed by <h2> for sections and <h3> for sub-sections. Heading levels are never skipped to control visual size. Sizing is handled with utility classes (.text-display, .text-title, .text-subtitle).

Why: Screen readers announce heading level, and many users navigate page-to-page by jumping heading-to-heading. A page whose H2 jumps to H4 sounds broken; a page with three H1s sounds disoriented.

Language

Every page declares <html lang="en-CA"> in the document head.

Why: Screen readers switch pronunciation engines based on this attribute. Without it, an English page read by a default Spanish voice is unintelligible.

Keyboard & input

Skip link

The first focusable element on every page is a "Skip to content" link. It's visually hidden until focused, then slides into view as a pill in the top-left.

Why: Keyboard users would otherwise tab through the entire site navigation on every page load. Skip links cut that to one Tab + Enter.

Visible focus

All focusable elements show a 2px outline in --color-accent with a 3px outline-offset. The offset matters: it keeps the outline visible even when an element has the same colour as the outline itself.

Why: Browsers' default focus rings are often invisible on dark themes. Sighted keyboard users (RSI, motor impairment, power users) need to see where they are at all times. Removing the focus ring entirely (common in modern designs) is a WCAG 2.4.7 failure.

Mobile menu focus management

Opening the hamburger menu sets aria-expanded="true" on the trigger and locks body scroll. Pressing Escape closes the menu and returns focus to the trigger button. Resizing past the mobile breakpoint auto-closes and unlocks scroll so a desktop user never lands in a stuck state.

Why: A menu that opens but won't close, or that traps focus behind a hidden overlay, is unusable with keyboard or screen reader.

Custom date picker

The contact form's event-date picker is built as a real role="dialog" with day cells exposed as role="gridcell". Each cell carries a full aria-label ("Monday, May 18, 2026") and the selected day carries aria-selected="true". The dialog closes on outside click, on Escape, or on selection.

Why: The native <input type="date"> has inconsistent screen-reader support across browsers and operating systems. A custom picker built on standard ARIA patterns is more predictable.

Visual design

Colour contrast

Body text (#b3b3b6 on #000000) hits a contrast ratio of 8.7:1, well above WCAG AA's 4.5:1 requirement for body text. Primary ink (#f5f5f5) hits 18.7:1. The most muted text used anywhere on the site (#85858a for eyebrow labels) is 5.3:1, still passing AA. No text falls below the threshold.

Why: Low-contrast type is one of the most reported accessibility issues: for low-vision users, for anyone reading outdoors, and for older eyes. WCAG AA is a floor, not a ceiling; this site aims past it.

Resizable text

Type sizes use rem and clamp(), never fixed pixels. Setting the browser's default font size to "Very Large" scales the entire interface up to 200% without breaking layout or causing horizontal scroll.

Why: Users with low vision often set their browser's base font size up rather than using zoom. A site built in fixed pixels ignores that preference entirely.

Forced-colors / high-contrast mode

Buttons and ghost outlines declare explicit borders inside a @media (forced-colors: active) block so they remain visible when Windows High Contrast mode overrides the palette.

Why: Forced-colors strips most styling. Without explicit borders, a ghost button becomes invisible because its only visible affordance is its border colour.

Media & motion

Alt text on every image

Photographs carry descriptive alt text. Not just "photo of Grayson" but "Grayson seated at the centre of a Whitecaps fan zone, juggling a ball while kids in blue kits watch." Purely decorative images (grain overlay, brand mark) are marked aria-hidden="true" so screen readers skip them entirely instead of announcing meaningless filenames.

Why: Empty alt text on a meaningful photo gives a screen-reader user nothing. Descriptive alt text gives them the same atmosphere a sighted visitor gets.

Reduced motion

The site honours prefers-reduced-motion: reduce. When set, all animation and transition durations drop to ~0ms, so hover and focus changes apply instantly without bounce or fade.

Why: Motion can trigger vestibular disorders, migraines, and nausea. The OS-level preference is the user's accessibility setting. Sites that ignore it can make people physically ill.

No autoplay video

The site does not autoplay video or audio. The "Latest reel" link opens YouTube in a new tab, where the user controls playback.

Why: Unexpected sound is disorienting for screen-reader users (it competes with the synthesised voice) and disruptive for anyone in a quiet environment.

Forms

Explicit labels and autocomplete

Every form control has a real <label> tied via for/id. Required fields are flagged with both a visible * and the required attribute. Common fields carry the right autocomplete tokens (name, email, organization) so password managers and assistive tech can fill them automatically.

Why: Placeholder-only "labels" disappear the moment a user types and are unreadable for screen-reader users navigating field-by-field. autocomplete is also a WCAG 2.2 Success Criterion (1.3.5).

Live region for status

The contact form's status message uses aria-live="polite" and role="status". When the server responds, the success or error message is announced by screen readers without stealing focus.

Why: Without a live region, a screen-reader user who submits a form has no idea whether it worked. They tab away, hear nothing, and assume the site is broken.

No JS, still functional

The contact form submits via a standard POST to a server endpoint and falls back to a redirect-with-status flow if JavaScript is disabled or fails. No client-side framework is required to send a message.

Why: JavaScript can be blocked by corporate networks, disabled by privacy-conscious users, or just fail to load over a slow connection. Core conversion paths (book, contact) shouldn't depend on it.

How it's tested

Before each significant release the site is checked with:

  • Keyboard-only navigation across the home, contact, booking, and World Cup pages, plus mobile-menu open/close.
  • axe DevTools and Lighthouse accessibility audits with a target of zero serious or critical violations.
  • Manual screen-reader checks on the primary booking and contact paths (NVDA on Windows, VoiceOver on macOS).
  • Forced-colors and prefers-reduced-motion simulation via browser dev tools.
  • Text-zoom to 200% with the browser font-size set to "Very Large," verifying no content is clipped or unreachable.

Known limitations

  • Action photography. Alt text describes each photograph in detail, but cannot fully replace the kinetic feeling of a live freestyle performance. Reels on YouTube are the closest dynamic substitute.
  • Third-party social pages. Linked Instagram, YouTube, and TikTok pages have their own accessibility properties outside this site's control. They open in new tabs so the user can return without losing context.

Report a barrier

If anything on this site doesn't work for you, send a message through the contact form with the page URL, the browser and assistive technology you're using, and a brief description of what went wrong. Replies arrive within seven business days; fixes are prioritised by severity.

Booking & Press

Available for bookings worldwide.

Book a Performance →

Site

  • Home
  • Performances
  • World Cup 2026
  • Gallery
  • About
  • Press / EPK
  • Book

Watch

  • Instagram ↗
  • YouTube ↗
  • TikTok ↗
  • Latest reel

Contact

  • Send a message
  • Reply within 24h
  • Based in Vancouver, BC
  • Worldwide bookings

Site info

  • Accessibility
  • Privacy
  • Terms of use

© 2026 Grayson Allen · All rights reserved · Vancouver, BC, Canada