Scope & conformance target
This plan covers the 8 WCAG 2.2 Level A criteria with active findings. Resolving every item here fixes every Level A failure found on the audited pages.
A further 9 Level AA criteria with findings are covered in the complete audit report delivered to the client, which is not published.
Interactive Element Roles and Names
WCAG 4.1.2Level A·5 issues·Complete Report §1
role, 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
WCAG 2.4.4Level A·2 issues·Complete Report §4
aria-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
WCAG 2.5.3Level A·1 issue·Complete Report §10
aria-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
WCAG 1.4.1Level A·1 issue·Complete Report §11
div.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
WCAG 1.1.1Level A·14 issues·Complete Report §14
#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--…__mobile_app_banner 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--…__comparison_table3 imgsPDPAlt text "Hormone Balance+" is generic.
Additional generic-alt groups on the PDP, …__landing_featured_logo (4), #block-card (1), …__product_reviews (2, +2 more), follow the same fix.
#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
WCAG 1.3.2Level A·6 issues·Complete Report §16
flex-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.reviews-buttonPDPUses CSS order: 1. Reorder within the review-app's layout settings or move it to position 1 in source.
Semantic Markup and Structure
WCAG 1.3.1Level A·5 issues·Complete Report §17
<h1>–<h6>, <ul>/<ol>, <th scope>, <label>, landmarks.#shopify-section-…__quiz_banner15 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--…__promo_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
WCAG 3.3.2Level A·1 issue·Complete Report §20
input[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.