Scope & conformance target
This plan covers the 8 WCAG 2.2 Level A criteria with active findings. Resolving every item here achieves Level A conformance across the audited pages.
A further 10 Level AA criteria are covered in the accompanying Complete Audit Report.
Interactive Element Roles and Names
Highrole, aria-label, and state attributes to custom interactive widgets.button.product-card-v2__button4×HomepageCollectionInteractive element nested inside another interactive element — 4 occurrences in one template (#shopify-section-template), so a single template fix resolves all.
<button> outside its parent link (<a>). Nested interactive elements break assistive-technology focus and name computation..header-search-icon2×Terms & ConditionsButton has no accessible name — a screen reader announces only “button.”
<button aria-label="Search">div.account-popup__wrapperTerms & Conditionsaria-labelledby references a nonexistent ID "account-popup" — no accessible name is produced from this attribute.
div.z-10Terms & Conditionsaria-labelledby references a nonexistent ID "mobile-menu" — no accessible name is produced from this attribute.
input#Search2 elementsTerms & Conditionsaria-controls references a nonexistent ID "predictive-search-results-list" — no ARIA relationship is formed.
aria-controls at the live results container's real ID, or remove the attribute if predictive search is not wired up.Descriptive Link Text
Mediumaria-label where the visible text is generic..app-promo__download-button[target="_blank"]2×HomepageApp-store download link has no accessible name — the control is an icon/image with no text for screen readers.
<a href="https://play.google.com/store/apps/details?id=…" aria-label="Download on Google Play">
#shopify-section-template--…__main a3 elementsTerms & ConditionsLink text is a raw URL — screen-reader users hear the address read out character by character instead of a destination.
Before: <a href="https://‹client-domain›/">https://‹client-domain›/</a> After: <a href="https://‹client-domain›/">Brightleaf Wellness Home</a> Or add: aria-label="Brightleaf Wellness Home"
Label in Name
Mediumaria-label includes the visible text verbatim, so voice-control users can activate what they see.a.flex.items-centerHomepageAccessible name "/pages/hormone-balance" does not contain the visible text “Hormone Balance+.” The name is being computed from the href because no explicit label is set.
aria-label that includes the visible text — e.g. aria-label="Hormone Balance+".Use of Color
Mediumdiv.quick-add-error6×CollectionSix error messages rely only on color (red text) with no icon, symbol, or ARIA role to convey the error state. Same element in every instance — one fix resolves all.
- Prefix with an icon or symbol (⚠ ✖ !)
- Add
role="alert"so screen readers announce it - Add a border or background change alongside the color
Image Alt Text
Medium#shopify-section-…__announcement-pdp2 imgsHomepageCollectionPDPAlt text "Brightleaf Wellness image" is generic. +1 more affected image in the complete report.
#shopify-section-template--…__multirow4 imgsHomepageAlt text "Brightleaf Wellness image" is generic. +1 more affected image in the complete report.
#shopify-section-template--…__video_slider3 imgsHomepageAlt text "Brightleaf Wellness image" is generic.
#shopify-section-template--…__app_promo img2 imgsHomepageImage-only link with no alt text and no accessible name, plus an image with no alt attribute — screen readers announce the filename instead of the content.
<a aria-label="Download our app"><img alt="App preview"></a>.#shopify-section-template--…__featured_product21 imgsPDPAlt text "Hormone Balance+" is repeated verbatim across the gallery — generic and non-distinguishing. +13 more affected images in the complete report.
#product-form7 imgsPDPAlt text "Hormone Balance+" is generic across product-form imagery.
#shopify-section-template--…__content_cards13 imgsPDPAlt text "Hormone Balance+" is generic. +5 more affected images in the complete report.
#shopify-section-template--…__product_vs_others3 imgsPDPAlt text "Hormone Balance+" is generic.
Additional generic-alt groups on the PDP — …__landing_featured_logo (4), #block-card (1), …__okendo_reviews (2, +2 more) — follow the same fix.
#octane-quiz-wrapper7 imgsQuizImages have no alt attribute — screen readers announce the filename. +7 more in the complete report. Set alt text in the quiz app's media settings.
Meaningful Reading Order
Mediumflex-direction: *-reverse and CSS order that desync the two.div.review-slider__card__footer3×HomepageUses flex-direction: row-reverse, reversing children's visual order relative to DOM order.
row-reverse and reorder the children in the HTML to match the intended sequence. Need a reversed layout at some breakpoints? Reorder the DOM to the most common reading order and use non-reversed flex with media queries.div.brand-progress-bar__itemTerms & ConditionsUses CSS order: 1, which can make visual order differ from DOM reading order.
order: 1 and move the element to position 1 in the source. CSS order desyncs what sighted users see from what screen readers read.div.price__salePDPUses flex-direction: row-reverse, reversing the visual order of its children.
row-reverse and reorder the children in source order.div.form-checkPDPUses CSS order: 2, desyncing visual and DOM order.
order: 2 and move the element to position 2 in the source.div.multirow-section__text-image-block__contentPDPUses flex-direction: row-reverse, reversing children's visual order.
row-reverse and reorder children in the HTML.button#filter-toggle.oke-buttonPDPUses CSS order: 1. Reorder within the review-app's layout settings or move it to position 1 in source.
Semantic Markup and Structure
Medium<h1>–<h6>, <ul>/<ol>, <th scope>, <label>, landmarks.#shopify-section-…__quiz_announcement15 listsPDPHomepage15 visual lists use bullet characters instead of semantic <ul>/<ol> — list structure is not programmatically conveyed.
<ul><li>Item 1</li><li>Item 2</li></ul> (or <ol> for ordered items).#shopify-section-template--…__multirow h6HomepageHeading level skip: h3 → h6 (“Mix, match, and save!”).
<h6> to <h4>, or add the intermediate heading levels.#shopify-section-template--…__early_timerCollection1 visual list uses bullet characters instead of semantic list markup.
<ul>/<ol> with <li> items.#QuickAddModal h36×CollectionHeading level skip: h1 → h3 (“Unable to load product”).
<h3> to <h2>, or add the intermediate level.#shopify-section-quiz-start-page-header2 listsQuiz2 visual lists use bullet characters instead of semantic list markup.
<ul>/<ol> with <li> items.Form Labels and Instructions
Mediuminput[type="email"][name="email"]Terms & ConditionsRequired field “Email” has no visible required indication in its label — users won't know it must be completed before submitting.