fullstack.rocks skills · demos

Accessibility for Luxury Websites: WCAG 2.2 AA & Quiet Luxury

1. Context & Positioning for Maison Lumen

In BRIEF.md, Maison Lumen defines its aesthetic as quiet luxury: “Restraint over spectacle, craft over campaigns, and proof over adjectives. Every client site has to feel like walking into the house itself, and still meet WCAG 2.2 AA.”

Accessibility is the digital equivalent of architectural hospitality. Just as a physical Paris or Milan flagship does not force a guest through a heavy door without assistance or print a horology catalogue in unreadable ink, a digital flagship for our own agency and our three showcase clients—an electric grand tourer automaker, an independent haute horology house, and an invitation-only private estate (BRIEF.md)—must treat W3C WCAG 2.2 Level AA (published as a W3C Recommendation on October 5, 2023) as a mark of craft rather than a regulatory compromise.


2. How WCAG 2.2 AA Hits Luxury Aesthetics

Low-Contrast Thin Type

Text Over Imagery

Dark Themes

Autoplay Video and Motion

Custom Cursors and Scroll-Jacking

Carousels & Editorial Galleries

Focus Visibility

Alt Text for Art-Directed Imagery

Forms (Private Appointment Booking & Concierge Inquiries)


3. The WCAG 2.2 Additions & Their Impact on Luxury Sites

What’s New in WCAG 2.2 (W3C WAI) introduced nine new success criteria (and removed 4.1.1 Parsing). The key AA and A additions every Maison Lumen flagship must pass are:

  1. SC 2.4.11 Focus Not Obscured (Minimum) (Level AA): When any UI component receives keyboard focus, it must not be entirely hidden by author-created content. Fixed transparent/glassmorphic luxury headers, floating “Book an Appointment” bars, and sticky cookie banners require matching scroll-padding-top and scroll-padding-bottom on html so tabbed elements scroll clear of sticky chrome.
  2. SC 2.5.8 Target Size (Minimum) (Level AA): Pointer targets must be at least 24×24 CSS pixels (or have a 24px spacing circle around their centre), except for inline text links. Minimalist luxury UI controls—carousel dots, watch-dial colour swatches, audio mute icons, modal × buttons, and footer social icons—must have a minimum 24×24px hit box (and ideally 44×44px on touch viewports per SC 2.5.5).
  3. SC 2.5.7 Dragging Movements (Level AA): Any action that uses dragging must be operable by a single pointer without dragging. Interactive 360° vehicle rotators, before/after craftsmanship sliders, and horizontal timeline scrubbers must include single-click/tap buttons (e.g., <button>Rotate left 15°</button>, <button>Next chapter</button>).
  4. SC 3.2.6 Consistent Help (Level A): Help mechanisms repeated across pages (private concierge phone number, salon email, live client advisor link) must appear in the same relative DOM order on every page.
  5. SC 3.3.8 Accessible Authentication (Minimum) (Level AA): Logging into a private client portal or invitation-only estate booking area must not require a cognitive function test (memorising a password or solving an object-recognition CAPTCHA) unless it supports password managers (autocomplete="current-password" / one-time-code), copy-pasting into Passcode/OTP fields, WebAuthn/Passkeys, or magic email links.
  6. SC 3.3.7 Redundant Entry (Level A): Multi-step concierge or bespoke commissioning flows must not ask the client to re-type information already entered in the same session.

4. Real Luxury Brands & Agencies: Who Does It Well or Badly



6. Reviewer Checklist for Maison Lumen & Client Sites

Reviewers (reviews/<slug>.md) can audit every site against this 12-point WCAG 2.2 AA checklist:


7. What Maison Lumen Should Do (8 Concrete, Testable Recommendations)

  1. Enforce a contrast-verified CSS color token floor (SC 1.4.3, 1.4.11): Define all foreground, muted-text, and border colors as CSS custom properties in :root with pre-audited contrast ratios: body text ≥7:1, secondary captions ≥4.5:1, and hairline rules/input borders ≥3:1 against their surface token. Test: Run automated contrast checks and verify zero text elements fall below 4.5:1 (3:1 for ≥24px).
  2. Ban sub-400 font weights on body copy and enforce deterministic scrims on hero media (SC 1.4.3): Restrict font-weight: 300 to headings ≥24px (1.5rem) and forbid font-weight: 100–200 entirely. Whenever text overlays hero imagery, apply a CSS gradient scrim or solid backdrop plate so contrast against the worst-case image pixel remains ≥4.5:1. Test: Disable images or replace them with solid #FFFFFF and #000000 test blocks in DevTools; overlaid text must still pass 4.5:1.
  3. Standardize a dual-ring :focus-visible indicator and scroll-padding-top across all four sites (SC 2.4.1, 2.4.7, 2.4.11): Add a first-child <a class="skip-link" href="#main">Skip to main content</a> and style :focus-visible { outline: 2px solid var(--focus-color); outline-offset: 4px; } with ≥3:1 contrast, plus html { scroll-padding-top: var(--header-height, 5rem); }. Test: Tab through the entire page from the URL bar; every interactive control must show a clear ring and never hide behind a sticky header.
  4. Gate all motion and autoplay media behind @media (prefers-reduced-motion: reduce) and explicit Pause buttons (SC 2.2.2, 2.3.3): Every ambient video must include a visible <button type="button" aria-pressed="false">Pause motion</button> and automatically pause on load when window.matchMedia('(prefers-reduced-motion: reduce)').matches is true, while CSS disables all transitions/animations. Test: Emulate prefers-reduced-motion: reduce in browser DevTools and confirm zero animations or playing videos run.
  5. Forbid cursor: none, scroll-jacking, and drag-only galleries (SC 2.1.1, 2.5.7): Keep native OS cursors and native browser scrolling intact on all pages. Prefer static asymmetric editorial grids for lookbooks, watch calibres, and estate galleries; if a carousel or slider is used, provide single-click <button> controls (“Previous”, “Next”) alongside keyboard arrow support. Test: Grep CSS/JS for cursor: none and wheel/touchmove preventDefault(); operate all galleries with a single click or keyboard Tab + Enter.
  6. Enforce a 24×24px minimum hit area (44×44px preferred) on all interactive controls (SC 2.5.8): Set min-width: 24px; min-height: 24px; (and padding to reach 44×44px on touch controls) on all buttons, nav links, gallery controls, and form inputs. Test: Run document.querySelectorAll('a, button, input, select, textarea') in DevTools and assert getBoundingClientRect().width >= 24 && height >= 24 for every non-inline interactive element.
  7. Write craft-specific alt text for editorial plates and alt="" for decorative flourishes (SC 1.1.1): Require every product, architectural, or horological photograph to describe material, perspective, and subject matter in 10–25 factual words, while marking ornamental monograms, dividers, and ambient textures with alt="" or aria-hidden="true". Test: Inspect all <img> and <svg> nodes; confirm zero missing alt attributes, zero filename alt strings, and aria-hidden="true" on all decorative SVGs.
  8. Build private appointment and inquiry forms with persistent <label> elements, autocomplete, and aria-describedby error states (SC 1.3.5, 3.3.1, 3.3.2, 3.3.8): Never use placeholder-only inputs. Pair every field with a visible <label for="...">, standard HTML autocomplete attributes, ≥3:1 border contrast, native <input type="date"> or accessible radio pills, and text-based error messages linked via aria-describedby. Test: Submit an empty or invalid booking form using only the keyboard and verify focus moves to or announces the specific text error for each field.

Files changed: None (read-only research task; read examples/maison-lumen/BRIEF.md).