Qiksy Access Sample · fictional store

Accessibility audit — Linden & Frost

Fashion boutique · Shopifylindenfrost-sample.exampleWCAG 2.1 AA25 states tested

Fix 6 components and 3 design tokens, and 312 of 371 weighted findings disappear.

3 of them block a purchase outright for a keyboard or screen-reader user.

Top risks

IssueWhereSeverityEffort
Checkout email field has no programmatic labelCheckout · contactBlockerS
“Add to cart” 3.1:1 against white (4.5:1 required)All product statesCriticalS — one token
Focus ring hidden behind the sticky header12 statesCriticalM

Fix map — by design token

TokenCurrentSuggestedUsed byCloses
--color-foreground-secondary#8A8A8A#6B6B6Bhelper text, placeholders, footer links148
--color-button-primary#7BA7E0#3A6FBFAdd to cart, Checkout, Apply63
--color-sale-badge#F5B5B5#C0392Bsale badges across collection & PDP27

Fix map — by component

ComponentDefectStatesCloses
sections/product-formvariant buttons expose no pressed state941
snippets/pricesale price conveyed by colour alone1732
sections/cart-drawerquantity steppers have no accessible name618

Coverage — what was actually opened

GroupStatesWeighted findings
Browse641
Product588
Cart452
Account334
Checkout5129
Other227

A state is not a page: route × viewport × open layer × data × validation. The same URL with an open filter drawer, an empty basket and a rejected card is four states, and they fail differently. Desktop 1440 and mobile 390 throughout.

Page types — and the pattern each one repeats

TypePagesStatesThe pattern that repeats on every page of this typeCloses
Home13Hero slider autoplays with no pause control4
Collection145Product cards are linked divs — no role, no focus order41
Product2126Variant swatches are unlabelled buttons; sale price is colour only96
Cart drawer14Quantity steppers unnamed; total is not announced on change23
Checkout — contact13Email field has no programmatic label11
Checkout — shipping13Errors appear silently, no live region18
Checkout — payment12Third-party frame; inventoried, not tested6
Account64Order table exposes no table semantics27
Search results13Result count never announced after filtering14
Editorial382Headings skip from h1 to h419
Total2763510 templates carry every defect above259

This is the whole argument of the audit, in one table. The store has 276 pages and 10 templates — so a defect is not found 276 times, it is found once, in the template, and closes everywhere at once. That is also why the price is per state and not per page: the state is what we open, the template is what gets fixed.

Keyboard route

PathVerdictWhat happens
Catalogue → product → cart → checkoutpassesreaches payment without a trap
Filter drawerfailsfocus stays behind the drawer; Escape does not close it
Variant pickerfailsarrow keys move nothing — the swatches are divs
Cart drawerpassesfocus returns to the trigger on close
Newsletter modalfailsopens on a timer and steals focus mid-typing

Manual review — done by a person

CheckVerdictEvidence
Order of reading matches order of seeingpasschecked on 12 states with the rail collapsed
Errors are announced, not only colouredfailcheckout errors appear silently; no live region
Every image carries a purpose or an empty altpartial19 of 24 product images repeat the product name
Video has captionsn/ano video on the tested states
Zoom to 200% loses nothingfailthe sticky filter bar covers the first result row

These five cannot be answered by any scanner. A machine can tell you an image has alt text; only a person can tell you the alt text is the word “image”.

Third-party frames — inventory, not a test

FrameTypeStatusWhat to request from the vendor
Shop Pay — payment sheetiframeinventoriedAsk Shopify for their VPAT; the obligation stays with you as the merchant
Klarna — instalments widgetiframeinventoriedKlarna publishes an accessibility statement; request the AA scope
Yotpo — reviewsiframeinventoriedstar rating conveyed by colour alone in the vendor markup

We do not enter other people’s frames, and we say so before you ask. Under the EAA the obligation stays with the merchant either way — so the report tells you exactly what to request from each vendor, and by when.

Remediation plan — 30 / 60 / 90

First 30 daysThe 3 blockers and the button token
Checkout becomes completable by keyboard and by screen reader
By day 60The 6 components and the remaining 2 tokens
312 of 371 weighted findings close
By day 90Manual review items, statement published, re-run
A dated pass with a diff, and the acceptance round by a blind specialist

Accessibility statement — draft excerpt

Linden & Frost is working towards WCAG 2.1 level AA. As of the date of this assessment the following are known not to conform: the filter drawer traps keyboard focus, variant swatches are not operable by keyboard, and checkout validation errors are not announced. Third-party payment and review frames are supplied by Shopify, Klarna and Yotpo; we have requested their conformance information. Feedback: accessibility@lindenfrost-sample.example.

A statement that lists what does not work is worth more than one that claims everything does — and it is what the directive asks for. This draft is yours to publish, edit or ignore.

Findings register — excerpt

A-001Blocker

Checkout email field has no programmatic label

Criterion
WCAG 1.3.1
Component
sections/checkout-contact
Token
Occurs in
3 states
Evidence
accessible name is empty; a screen reader announces “edit text”
+ <label for="checkout_email" class="visually-hidden">Email address</label> <input type="email" id="checkout_email" autocomplete="email">
A-014Critical

Primary button text below contrast minimum

Criterion
WCAG 1.4.3
Component
sections/product-form
Token
--color-button-primary
Occurs in
21 states
Evidence
3.1:1 measured against #FFFFFF — 4.5:1 required
--color-button-primary: #7BA7E0 → #3A6FBF (one token, 63 findings close)
A-029Critical

Focused element obscured by sticky header

Criterion
WCAG 2.4.11
Component
layout/header
Token
Occurs in
12 states
Evidence
focus lands at y=38 while the fixed header spans 0–96 px
scroll-padding-top: 104px on <html>; verified across the keyboard route

Sample report over a fictional store — assembled to show the deliverable's structure and depth; the store does not exist and every number above is illustrative. The sections are the real ones: a run against a live store returns this document with your states, your tokens, your components and your register — the findings register here is shortened to three entries, where a real one runs to the full count named above. Qiksy is not a law firm; an audit is a technical assessment, not a certificate of conformance.