Public accessibility assessment

Accessibility issues detected on tower28beauty.com

Evolize inspected 5 public pages on tower28beauty.com and detected 44 automatically identifiable accessibility findings.

44Findings detected
7WCAG criteria affected
5Pages inspected
8 Sep 2026Assessment date

Highest detected severity: High · 11 high-priority findings · 100% inspected-page coverage

Most widespread issueInteractive controls are not keyboard-accessibleDetected on 4 inspected pages
Most affected page/70 findings detected
Most represented WCAG criterionWCAG 1.4.3 — Contrast (Minimum)20 detected findings

Is tower28beauty.com your website?

Keep this assessment current and get notified when new accessibility issues are detected.

https://

Not your website? Scan your own site →

01 · Accessibility summary

Evolize inspected 5 public pages on tower28beauty.com and detected 44 accessibility findings. The most widespread issue was "Interactive controls are not keyboard-accessible", detected on 4 inspected pages. The most affected inspected page was "/", where 70 findings were detected. The assessment identified findings mapped to 7 WCAG success criterions. The sections below prioritize the broadest issues and provide technical evidence for each detected finding.

02 · Start here

These findings combine the highest severity and broadest reach detected during this assessment.

  1. High

    Interactive controls are not keyboard-accessible

    WCAG 2.1.1 (A) · 5 inspected pages · 15 instances
    Why this matters

    A control that responds to clicks (a clickable element or an ARIA widget) cannot receive keyboard focus, so keyboard and switch users cannot operate it.

    Recommended action

    Use a native <button>/<a>, or add tabindex="0" plus keyboard event handlers (Enter/Space) to custom controls.

    View technical evidence →
  2. High

    Interactive controls are not keyboard-accessible

    WCAG 2.1.1 (A) · 5 inspected pages · 10 instances
    Why this matters

    A control that responds to clicks (a clickable element or an ARIA widget) cannot receive keyboard focus, so keyboard and switch users cannot operate it.

    Recommended action

    Use a native <button>/<a>, or add tabindex="0" plus keyboard event handlers (Enter/Space) to custom controls.

    View technical evidence →
  3. High

    Modal dialog does not trap keyboard focus

    WCAG 2.4.3 (A) · 5 inspected pages · 5 instances
    Why this matters

    An open modal leaves the content behind it keyboard-focusable, so keyboard and screen reader users can tab out of the dialog into hidden page content.

    Recommended action

    While a modal is open, confine focus to the dialog and mark the rest of the page inert (or aria-hidden). Restore focus on close.

    View technical evidence →
  4. High

    Interactive controls are not keyboard-accessible

    WCAG 2.1.1 (A) · 5 inspected pages · 5 instances
    Why this matters

    A control that responds to clicks (a clickable element or an ARIA widget) cannot receive keyboard focus, so keyboard and switch users cannot operate it.

    Recommended action

    Use a native <button>/<a>, or add tabindex="0" plus keyboard event handlers (Enter/Space) to custom controls.

    View technical evidence →
  5. High

    Hidden elements can still receive keyboard focus

    WCAG 2.4.3 (A) · 5 inspected pages · 5 instances
    Why this matters

    An element is not visible but remains in the tab order, so a sighted keyboard user loses track of focus when it lands there.

    Recommended action

    Keep this element out of the tab order while its containing region is hidden — remove it from focus (for example tabindex="-1"), or apply the inert attribute to the hidden container where supported. Restore normal focusability when the region becomes visible.

    View technical evidence →

03 · WCAG criteria affected

CriterionNameLevelFindingsPagesReach
1.4.3Contrast (Minimum)AA2044 / 5
2.4.3Focus OrderA1144 / 5
2.1.1KeyboardA544 / 5
1.3.1Info and RelationshipsA444 / 5
1.1.1Non-text ContentA222 / 5
1.2.2Captions (Prerecorded)A222 / 5
2.2.2Pause, Stop, HideA122 / 5

Absence of a criterion here does not indicate conformance with it — only that no automatically detectable issue was found for it.

Continuous monitoring

A scan shows today's exposure. Monitoring shows what changes next.

Evolize continuously reassesses public website pages, detects newly introduced or recurring accessibility findings, and tracks remediation over time.

04 · All detected findings

High

Hidden elements can still receive keyboard focus

WCAG 2.4.3 (A)34 instances4 inspected pages

An element is not visible but remains in the tab order, so a sighted keyboard user loses track of focus when it lands there.

Why it matters

An element is not visible but remains in the tab order, so a sighted keyboard user loses track of focus when it lands there.

Recommended correction

Keep this element out of the tab order while its containing region is hidden — remove it from focus (for example tabindex="-1"), or apply the inert attribute to the hidden container where supported. Restore normal focusability when the region becomes visible.

View 34 affected elements
Component · Ref D9Z63A
Affected pagehttps://www.tower28beauty.com/a/account/login
Elementheader-drawer > details-modal > details > div > div:nth-of-type(2) > button
Accessible nameClose
Markup
<button type="button" class="search-modal__close-button modal__close-button link link--text focus-inset" aria-label="Close">
          <svg class="icon icon-close" aria-hidden="true" focusable="false">
            <use href="#icon-close">
          </use></svg>
        </button>
Affected pages/ / /pages/birthday-signup /a/account/login /cart
Component · Ref P9RVJS
Affected pagehttps://www.tower28beauty.com/pages/birthday-signup
Elementdiv > div:nth-of-type(2) > predictive-search > form > div:nth-of-type(1) > button:nth-of-type(2)
Accessible nameSearch
Markup
<button class="search__button field__button" aria-label="Search">
              <svg class="icon icon-search" aria-hidden="true" focusable="false">
                <use href="#icon-search">
              </use></svg>
            </button>
Affected pages/ / /pages/birthday-signup /a/account/login /cart
Component · Ref XN3DNI
Affected pagehttps://www.tower28beauty.com/a/account/login
Elementinput#Search-In-Modal-Drawer
Accessible nameSearch - Mobile Menu
Rolecombobox
Markup
<input class="search__input field__input" id="Search-In-Modal-Drawer" type="search" name="q" value="" placeholder="Search" aria-label="Search - Mobile Menu" role="combobox" aria-expanded="false" aria-owns="predictive-search-results" aria-controls="predictive-search-results" aria-haspopup="listbox" aria-autocomplete="list" autocorrect="off" autocomplete="off" autocapitalize="off" spellcheck="false">
Affected pages/ / /pages/birthday-signup /a/account/login /cart
Component · Ref 5M4B6V
Affected pagehttps://www.tower28beauty.com/
Elementdiv#shopify-section-template--17196975161399__image_banner_BrDXHi > div > div:nth-of-type(4) > a
Accessible nameSwipe Foundation
Markup
<a href="/products/swipe-foundation" class="image-banner__link-overlay" onclick="gtag('event', 'mobile_banner_click', {'event_category': 'banner', 'event_label': 'Mobile Banner Click'});" aria-label="Swipe Foundation">
        </a>
Affected pages/ / /cart
Component · Ref I1WVRN
Affected pagehttps://www.tower28beauty.com/?cart=open
Elementdiv > div:nth-of-type(4) > div > div:nth-of-type(2) > div > a
Accessible nameShop Now
Markup
<a class="button  max-w-fit" href="/products/swipe-foundation" title="Shop Now" onclick="gtag('event', 'mobile_banner_click', {'event_category': 'banner', 'event_label': 'Mobile Banner Click'});">Shop Now</a>
Affected pages/ / /cart
Component · Ref MORCXE
Affected pagehttps://www.tower28beauty.com/
Elementdiv#splide01-slide02 > a
Accessible nameShop Lip
Markup
<a class="two-across-block__image" href="/collections/lip" aria-label="Shop Lip">
              <img src="//www.tower28beauty.com/cdn/shop/files/LipPlumper-Category_Card.png?v=1781644438&amp;width=1100" alt="" srcset="//www.tower28beauty.com/cdn/shop/files/LipPlumper-Category_Card.png?v=1781644438&amp;width=165 165w, //www.tower28beauty.com/cdn/shop/files/LipPlumper-Category_Card.png?v=1781644438&amp;width=360 360w, //www.tower28beauty.com/cdn/shop/files/LipPlumper-Category_Card.png?v=1781644438&amp;width=535 535w, //www.tower28beauty.com/cdn/shop/files/LipPlumper-Category_Card.png?v=178164443…
Affected pages/ /
Component · Ref 6KRW7K
Affected pagehttps://www.tower28beauty.com/?cart=open
Elementdiv#CartDrawer > div:nth-of-type(2) > div:nth-of-type(5) > small > a
Accessible nameshipping
Markup
<a href="/policies/shipping-policy">shipping</a>
Component · Ref YYZX2R
Affected pagehttps://www.tower28beauty.com/?cart=open
Elementdiv#banner-text > div > a
Accessible nameSwipe Foundation
Markup
<a href="/products/swipe-foundation" class="image-banner__link-overlay" onclick="gtag('event', 'banner_click', {'event_category': 'banner', 'event_label': 'Banner Click'});" aria-label="Swipe Foundation">
          </a>
Component · Ref 60OYGB
Affected pagehttps://www.tower28beauty.com/?cart=open
Elementsection#shopify-section-template--17196975161399__8b4724ed-eef7-4864-918c-11889d03f4c3 > div > div > div:nth-of-type(1) > div > a
Accessible nameSHOP ALL
Markup
<a href="/collections/all" class="collection-list-header underline !font-medium">SHOP ALL</a>
High

Interactive controls are not keyboard-accessible

WCAG 2.1.1 (A)35 instances4 inspected pages

A control that responds to clicks (a clickable element or an ARIA widget) cannot receive keyboard focus, so keyboard and switch users cannot operate it.

Why it matters

A control that responds to clicks (a clickable element or an ARIA widget) cannot receive keyboard focus, so keyboard and switch users cannot operate it.

Recommended correction

Use a native <button>/<a>, or add tabindex="0" plus keyboard event handlers (Enter/Space) to custom controls.

View 35 affected elements
Component · Ref 4PAQXJ
Affected pagehttps://www.tower28beauty.com/?cart=open
Elementheader > div:nth-of-type(1) > header-drawer > details-modal > details > summary
Accessible nameSearch
Rolebutton
Markup
<summary class="header__icon header__icon--search header__icon--summary link focus-inset modal__toggle" aria-haspopup="dialog" aria-label="Search" role="button">
      <span>
        <svg class="modal__toggle-open icon icon-search" aria-hidden="true" focusable="false">
          <use href="#icon-search">
        </use></svg>
        <svg class="modal__toggle-close icon icon-close" aria-hidden="true" focusable="false">
          <use href="#icon-close">
        </use></svg>
      </span>
    </summary>
Affected pages/ / /pages/birthday-signup /a/account/login /cart
Component · Ref XZAOC4
Affected pagehttps://www.tower28beauty.com/a/account/login
Elementsummary#HeaderDrawer-shop
Accessible nameShop
Rolebutton
Markup
<summary id="HeaderDrawer-shop" class="menu-drawer__menu-item list-menu__item !flex justify-between link link--text focus-inset text-lg " role="button" aria-expanded="false" aria-controls="link-shop">
                        Shop

                        <span class="menu-drawer__accordion-icon">
                          <svg width="23" height="23" viewBox="0 0 23 23" fill="none" xmlns="http://www.w3.org/2000/svg">
                            <line x1="10.8601" y1="2.18557e-08" x2="10.8601" y2="22.4467" stroke="currentColor"></line>
                            <line x1="22.4468" y1="11.3774" …
Affected pages/ / /pages/birthday-signup /a/account/login /cart
Component · Ref 50Z34X
Affected pagehttps://www.tower28beauty.com/pages/birthday-signup
Elementdetails#Details-menu-drawer-container > summary
Accessible nameMenu
Rolebutton
Markup
<summary class="header__icon header__icon--menu header__icon--summary header__icon--hamburger link focus-inset" aria-label="Menu" role="button" aria-expanded="false" aria-controls="menu-drawer">
      <div>
        <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" class="icon icon-hamburger" fill="none" viewBox="0 0 27 19" width="27" height="19">
  <line y1="0.5" x2="27" y2="0.5" stroke="currentColor"></line>
  <line y1="9.5" x2="27" y2="9.5" stroke="currentColor"></line>
  <line y1="18.5" x2="27" y2="18.5" stroke="currentColor"></line>
</svg>


        <svg xmlns="h…
Affected pages/ / /pages/birthday-signup /a/account/login /cart
Component · Ref GUG9GP
Affected pagehttps://www.tower28beauty.com/
Elementsummary#HeaderMenu-shop
Accessible nameShop
Rolebutton
Markup
<summary id="HeaderMenu-shop" class="header__menu-item list-menu__item link focus-inset" role="button" aria-expanded="false" aria-controls="MegaMenu-Content-shop">
                <span class="header__menu-link">
                  <span>Shop</span>
                </span>
              </summary>
Affected pages/ / /pages/birthday-signup /a/account/login /cart
High

Modal dialog does not trap keyboard focus

WCAG 2.4.3 (A)6 instances4 inspected pages

An open modal leaves the content behind it keyboard-focusable, so keyboard and screen reader users can tab out of the dialog into hidden page content.

Why it matters

An open modal leaves the content behind it keyboard-focusable, so keyboard and screen reader users can tab out of the dialog into hidden page content.

Recommended correction

While a modal is open, confine focus to the dialog and mark the rest of the page inert (or aria-hidden). Restore focus on close.

View 6 affected elements
Component · Ref 2UADDQ
Affected pagehttps://www.tower28beauty.com/
Elementheader > div:nth-of-type(2) > div > details-modal > details > div
Accessible nameSearch
Roledialog
Markup
<div class="search-modal modal__content gradient" role="dialog" aria-modal="true" aria-label="Search">
      <div class="modal-overlay"></div>
      <div class="search-modal__content search-modal__content-bottom" tabindex="-1"><predictive-search class="search-modal__form" data-loading-text="Loading..."><form action="/search" method="get" role="search" class="search search-modal__form">
          <div class="field">
            <input class="search__input field__input" id="Search-In-Modal" type="search" name="q" value="" placeholder="Search" aria-label="Search - Header" role="combobox" aria-exp…
Affected pages/ / /pages/birthday-signup /a/account/login /cart
Component · Ref EUOJPF
Affected pagehttps://www.tower28beauty.com/?cart=open
Elementdiv#CartDrawer
Accessible nameYour Cart
Roledialog
Markup
<div id="CartDrawer" class="cart-drawer" role="dialog" aria-modal="true" aria-label="Your Cart" tabindex="-1">
    <div id="CartDrawer-Overlay" class="fixed inset-0 !block transition-opacity duration-150" aria-hidden="true" tabindex="-1"></div>
    <div class="drawer__inner color-background-2 " tabindex="-1">
      
<div class="drawer__inner-empty">
          <div class="cart-drawer__warnings center cart-drawer__warnings--has-collection">
            <div class="cart-drawer__empty-content">
              <h2 class="cart__empty-text cta cta--large">Oops, Your Cart is Empty!</h2>
              <…
Medium

Text has insufficient colour contrast

WCAG 1.4.3 (AA)122 instances4 inspected pages

Text and background colours do not meet the minimum contrast ratio, reducing legibility.

Why it matters

Text and background colours do not meet the minimum contrast ratio, reducing legibility.

Recommended correction

Increase the contrast ratio to at least 4.5:1 for normal text and 3:1 for large text.

View 122 affected elements
Component · Ref IUI46F
Affected pagehttps://www.tower28beauty.com/?cart=open
Elementcsm-cookie-consent,#isense-cc-cookie-bar-text
Markup
<span id="isense-cc-cookie-bar-text" tabindex="-1" data-csm-description="true" class="a48BBEL2Cpzl0dxNZ7ji">
Affected pages/ / /pages/birthday-signup /a/account/login /cart
Component · Ref WQA4NG
Affected pagehttps://www.tower28beauty.com/
Element.newsletter-form__field-wrapper > div > .field__label
Accessible nameEmail
Markup
<label class="field__label" for="NewsletterForm--sections--17196973359159__7dec6f6a-3b81-4345-a6e1-35167b968e24">
              Email
            </label>
Affected pages/ / /pages/birthday-signup /a/account/login /cart
Component · Ref YGDYQM
Affected pagehttps://www.tower28beauty.com/a/account/login
Element#NewsletterForm--sections--17196973359159__7dec6f6a-3b81-4345-a6e1-35167b968e24
Markup
<input id="NewsletterForm--sections--17196973359159__7dec6f6a-3b81-4345-a6e1-35167b968e24" type="email" name="contact[email]" class="field__input" value="" aria-required="true" autocorrect="off" autocapitalize="off" autocomplete="email" placeholder="Mike Ray Email" required="">
Affected pages/ / /pages/birthday-signup /a/account/login /cart
Component · Ref S188LY
Affected pagehttps://www.tower28beauty.com/?cart=open
Element.color-scheme-53bc667b-e8c0-496c-8932-6aa9dbf9d27d > .flex > .text > .text-body-small
Accessible nameHit Refresh on Stressed-Out Skin.
Markup
<h3 class="text-body-small">
      Hit Refresh on Stressed-Out Skin.
    </h3>
Component · Ref BJQ5C6
Affected pagehttps://www.tower28beauty.com/?cart=open
Element.color-scheme-53bc667b-e8c0-496c-8932-6aa9dbf9d27d > .flex > .text > .text-body-xsmall
Accessible nameThis derm-approved skin saver calms, soothes, and protects on the go.
Markup
<div class="text-body-xsmall">This derm-approved skin saver calms, soothes, and protects on the go.</div>
Component · Ref AP7DGJ
Affected pagehttps://www.tower28beauty.com/
Elementa[aria-label="ShineOn Plumping Lip Jelly"] > .left-2\.5.inline-block.py-2
Accessible nameNew
Markup
<div class="
          absolute left-2.5 top-2.5 rounded-full inline-block  text-xs leading-none py-2 px-2.5
          text-center bg-light-purple text-wine break-words tracking-normal
        " style="color: #872626; background-color: #efe3f3">
        New
      </div>
Affected pages/ /
Component · Ref 3EHNER
Affected pagehttps://www.tower28beauty.com/
Element#ProductSubmitButton-product-cart--template--17196975161399__8b4724ed-eef7-4864-918c-11889d03f4c3--7492755882039--172ff3ea-7059-4fa6-b02a-1b573667305e > span:nth-child(1)
Accessible nameAdd —
Markup
<span>Add&nbsp;—&nbsp;
</span>
Affected pages/ /
Component · Ref BQKY2L
Affected pagehttps://www.tower28beauty.com/
Element#splide-template--17196975161399__9223c4cd-7881-4409-b78e-8463fe20cdb1-slide01 > .js-product-card.gap-2.flex-col > .group.aspect-square.rounded-lg > .left-2\.5.inline-block.py-2
Accessible nameNew
Markup
<div class="
          absolute left-2.5 top-2.5 rounded-full inline-block  text-xs leading-none py-2 px-2.5
          text-center bg-light-purple text-wine break-words tracking-normal
        " style="color: #872626; background-color: #efe3f3">
        New
      </div>
Affected pages/ /
Component · Ref W56HE6
Affected pagehttps://www.tower28beauty.com/
Element.two-across-block__image[aria-label="Shop Cheek"][href$="cheek"] > .\32 xl\:p-8.two-across-block__text.p-6 > h2
Accessible nameCheek
Markup
<h2>Cheek</h2>
Affected pages/ /
Component · Ref VJKY4J
Affected pagehttps://www.tower28beauty.com/
Element#splide-template--17196975161399__9223c4cd-7881-4409-b78e-8463fe20cdb1-slide02 > .js-product-card.gap-2.flex-col > .text-wine.gap-2.flex-col > .mt-2.mb-1 > quickbuy-variant-radios > .js-quickbuy-variant-picker-options.flex-wrap.px-0\.5 > label:nth-child(3) > .py-1\.5.\!leading-\[1\.1\].cursor-pointer
Accessible nameJumbo
Markup
<span class="
        block text-...">
Affected pages/ /
Component · Ref UWMHEB
Affected pagehttps://www.tower28beauty.com/
Element#Options-Info-product-cart--template--17196975161399__8b4724ed-eef7-4864-918c-11889d03f4c3--7492755882039--172ff3ea-7059-4fa6-b02a-1b573667305e > .js-quickbuy-variant-title[metafield=""]
Accessible name0.5C Big Bear
Markup
<span class="js-quickbuy-variant-title" metafield="">0.5C Big Bear</span>
Affected pages/ /
Component · Ref 7G879J
Affected pagehttps://www.tower28beauty.com/
Element#splide-template--17196975161399__8b4724ed-eef7-4864-918c-11889d03f4c3-slide03 > .js-product-card.gap-2.flex-col > .text-wine.gap-2.flex-col > .leading-normal.mb-0.text-sm
Accessible nameAll-Over Hydrating Concealer
Markup
<p class="text-sm font-scto-grotesk-md leading-normal tracking-normal mb-0">
      All-Over Hydrating Concealer
    </p>
Affected pages/ /
Component · Ref LP4LLL
Affected pagehttps://www.tower28beauty.com/
Element#splide-template--17196975161399__9223c4cd-7881-4409-b78e-8463fe20cdb1-slide01 > .js-product-card.gap-2.flex-col > .text-wine.gap-2.flex-col > h3 > .text-xl.tracking-tighter.hover\:underline
Accessible nameSOS Rescue + Relief Body Wash Treatment
Markup
<a href="/products/sos-rescue-relief-body-wash-treatment" class="text-xl font-cooper tracking-tighter hover:underline">
        SOS Rescue + Relief Body Wash Treatment
      </a>
Affected pages/ /
Component · Ref NH85F8
Affected pagehttps://www.tower28beauty.com/
Element#splide-template--17196975161399__9223c4cd-7881-4409-b78e-8463fe20cdb1-slide02 > .js-product-card.gap-2.flex-col > .group.aspect-square[aria-label="SOS Rescue Spray"] > .left-2\.5.inline-block.py-2
Accessible nameTikTok Viral
Markup
<div class="
          absolute left-2.5 top-2.5 rounded-full inline-block  text-xs leading-none py-2 px-2.5
          text-center bg-light-purple text-wine break-words tracking-normal
        " style="color: #872626; background-color: #EFE3F3">
        TikTok Viral
      </div>
Affected pages/ /
Component · Ref 9ZUZLA
Affected pagehttps://www.tower28beauty.com/a/account/login
Element#Slide-sections--17196973391927__announcement_bar_aWP3tg-2 > .announcement-bar__announcement > .announcement-bar__link.animate-arrow.\!py-0 > .announcement-bar__message > span
Accessible nameFREE U.S shipping on orders $30+
Markup
<span>FREE U.S shipping on orders $30+</span>
Affected pages/pages/birthday-signup /a/account/login
Component · Ref 5BEMTY
Affected pagehttps://www.tower28beauty.com/
Element.h0
Accessible nameFoundation That Won’t Break You Out
Markup
<div class="richtext heading h0 section-image-banner-richtext  ">
                    Foundation That Won’t Break You Out
                  </div>
Affected pages/ /
Component · Ref YSSYFH
Affected pagehttps://www.tower28beauty.com/
Element.two-across__header > .text-\[48px\].leading-\[56px\].max-md\:text-\[32px\]
Accessible nameShop By Category
Markup
<h2 class="font-cooper font-normal tracking-[-1px] text-[48px] leading-[56px] max-md:text-[32px] max-md:leading-[37px]">
      Shop By Category
    </h2>
Affected pages/ /
Component · Ref V7EI7R
Affected pagehttps://www.tower28beauty.com/
Element#Slide-sections--17196973391927__announcement_bar_aWP3tg-2 > .announcement-bar__announcement > .announcement-bar__link.animate-arrow.\!py-0 > .announcement-bar__message.text-body-xsmall > span
Accessible nameFREE U.S shipping on orders $30+
Markup
<span>FREE U.S shipping on orders $30+</span>
Affected pages/ /
Component · Ref LXXGI0
Affected pagehttps://www.tower28beauty.com/
Element.text-xl.tracking-tighter[href$="sos-gel-cleanser"]
Accessible nameSOS Gel Cleanser
Markup
<a href="/products/sos-gel-cleanser" class="text-xl font-cooper tracking-tighter hover:underline">
        SOS Gel Cleanser
      </a>
Affected pages/ /
Component · Ref 1GZIT5
Affected pagehttps://www.tower28beauty.com/?cart=open
Element.cart-drawer__empty-content > .drawer__progress-bar > .progress-bar.text-body-xsmall > span
Accessible nameYou're $30 away from FREE shipping!
Markup
<span>You're $30 away from <b>FREE</b> shipping!</span>
Medium

Content sits outside any landmark region

WCAG 1.3.1 (A)5 instances4 inspected pages

Meaningful content is not contained in a landmark (header/nav/main/footer/aside), so assistive-technology users cannot reach it via landmark navigation.

Why it matters

Meaningful content is not contained in a landmark (header/nav/main/footer/aside), so assistive-technology users cannot reach it via landmark navigation.

Recommended correction

Wrap primary content in <main> and other regions in appropriate landmark elements.

View 5 affected elements
Component · Ref KPAJIM
Affected pagehttps://www.tower28beauty.com/?cart=open
Elementdiv#CartDrawer > div:nth-of-type(2) > div:nth-of-type(1) > div:nth-of-type(1) > div > h2
Accessible nameOops, Your Cart is Empty!
Markup
<h2 class="cart__empty-text cta cta--large">Oops, Your Cart is Empty!</h2>
Affected pages/ / /pages/birthday-signup /a/account/login /cart
Medium

Navigation regions are not distinguishable

WCAG 1.3.1 (A)10 instances4 inspected pages

The page has multiple navigation landmarks but they lack accessible names, so screen reader users cannot tell them apart.

Why it matters

The page has multiple navigation landmarks but they lack accessible names, so screen reader users cannot tell them apart.

Recommended correction

Give each navigation region a distinct aria-label (e.g. "Primary", "Footer") when more than one is present.

View 10 affected elements
Component · Ref 6SCO1P
Affected pagehttps://www.tower28beauty.com/
Elementdiv#shopify-section-sections--17196973391927__header > sticky-header > header > nav
Accessible nameShop All New Bestsellers Sets Shop Skincare Complexion Lip Cheek Eye Merch Shop By Skin Concern Acne Eczema Redness + Rosacea Sensitivity Dryness Oily + Dehydrated Trending SOS Spray Swipe Foundation Swipe Concealer Swipe Serum Concealer® SOS Rescue Spray Swipe Serum Concealer® Find My Shade About
Markup
<nav class="header__inline-menu">
  <ul class="list-menu list-menu--inline" role="list"><li><header-menu id="header-mega-menu" data-megamenu="Shop">
            <details id="Details-HeaderMenu-shop" class="mega-menu" data-megamenu="Shop">
              <summary id="HeaderMenu-shop" class="header__menu-item list-menu__item link focus-inset" role="button" aria-expanded="false" aria-controls="MegaMenu-Content-shop">
                <span class="header__menu-link">
                  <span>Shop</span>
                </span>
              </summary>
              <div id="MegaMenu-Content-shop" cla…
Affected pages/ / /pages/birthday-signup /a/account/login /cart
Component · Ref VEB08K
Affected pagehttps://www.tower28beauty.com/pages/birthday-signup
Elementdiv#menu-drawer > div > div > nav
Accessible nameShop Swipe Serum Concealer® Bestsellers Shop All Skincare Complexion Lip Eye Cheek Sets Merch Find My Shade By Skin Concern Acne Eczema Redness + Rosacea Sensitivity Dryness Oily + Dehydrated Trending SOS Spray Swipe Foundation Swipe Concealer Merch About Shop Now Login FAQs Contact Us Instagram Tiktok
Markup
<nav class="menu-drawer__navigation">
            <ul class="menu-drawer__menu list-menu gap-4" role="list"><li class="!pb-3 border-b border-solid border-wine/30"><a id="HeaderDrawer-shop-swipe-serum-concealer®" href="/products/swipe-serum-concealer" class="menu-drawer__menu-item list-menu__item link link--text focus-inset">
                      Shop Swipe Serum Concealer®
                    </a><a href="/collections/bestsellers" class="mt-4 menu-drawer__menu-item list-menu__item link link--text focus-inset ">
                        Bestsellers
                      </a></li><li class="!pb-…
Affected pages/ / /pages/birthday-signup /a/account/login /cart
Medium

Video may be missing captions

WCAG 1.2.2 (A)6 instances2 inspected pages

A video element has no captions or subtitles track. Whether captions are needed depends on the audio content and requires manual review.

Why it matters

A video element has no captions or subtitles track. Whether captions are needed depends on the audio content and requires manual review.

Recommended correction

Provide a synchronized captions track (<track kind="captions">) for video with meaningful audio.

View 6 affected elements
Component · Ref MOG2PU
Affected pagehttps://www.tower28beauty.com/
Elementdiv#shopify-section-template--17196975161399__image_banner_BrDXHi > div > div:nth-of-type(2) > video
Markup
<video autoplay="" muted="" loop="" playsinline="" webkit-playsinline="" disableremoteplayback="" preload="auto" data-autoplay-hero="" aria-label="" poster="//www.tower28beauty.com/cdn/shop/files/preview_images/0ea6afc3b81b47c692a554029d20b6ed.thumbnail.0000000000.jpg?v=1787177585&amp;width=750">
          
            <source src="//www.tower28beauty.com/cdn/shop/videos/c/vp/0ea6afc3b81b47c692a554029d20b6ed/0ea6afc3b81b47c692a554029d20b6ed.HD-1080p-7.2Mbps-92083580.mp4?v=0" type="video/mp4">
          
        </video>
Affected pages/ / /cart
Medium

<video> elements must have captions

WCAG 1.2.2 (A)2 instances1 inspected page

<video> elements must have captions

Why it matters

<video> elements must have captions

Recommended correction

Review the affected element and correct the reported accessibility issue.

View 2 affected elements
Component · Ref 4PBZ4U
Affected pagehttps://www.tower28beauty.com/
Element.section-image-banner__inner.media--2-1--short.section-image-banner__inner--mobile-aspect-square:nth-child(2) > video
Markup
<video autoplay="" muted="" loop="" playsinline="" webkit-playsinline="" disableremoteplayback="" preload="auto" data-autoplay-hero="" aria-label="" poster="//www.tower28beauty.com/cdn/shop/files/preview_images/71d6e64d7b224f6a8a80cdfb7d7b1e61.thumbnail.0000000000.jpg?v=1787177585&width=1500">
Affected pages/ /
Low

Low-quality alternative text

WCAG 1.1.1 (A)174 instances2 inspected pages

Alt text looks like a filename, a generic word ("image", "photo"), or is duplicated across unrelated images — it likely does not describe the content.

Why it matters

Alt text looks like a filename, a generic word ("image", "photo"), or is duplicated across unrelated images — it likely does not describe the content.

Recommended correction

Replace placeholder or filename alt text with a concise description of what the image conveys.

View 174 affected elements
Component · Ref QZ5VB
Affected pagehttps://www.tower28beauty.com/?cart=open
Elementdiv#splide-template--17196975161399__9223c4cd-7881-4409-b78e-8463fe20cdb1-slide03 > div > a > div > img:nth-of-type(2)
Accessible nameProduct certification or award
Markup
<img src="//www.tower28beauty.com/cdn/shop/files/NRS_seal_transp.png?v=1740680001&amp;width=80" alt="Product badge" srcset="//www.tower28beauty.com/cdn/shop/files/NRS_seal_transp.png?v=1740680001&amp;width=80 80w" width="80" height="117" loading="lazy" class="w-full h-auto" title="Product certification or award">
Affected pages/ / /cart
Component · Ref 0OPODJ
Affected pagehttps://www.tower28beauty.com/
Elementdiv#splide-template--17196975161399__8b4724ed-eef7-4864-918c-11889d03f4c3-slide03 > div > a > img:nth-of-type(27)
Markup
<img src="//www.tower28beauty.com/cdn/shop/files/1_PACKSHOT_-_19.5_WL_e11cd2ad-2254-4caf-adc8-18ccdc84f469.png?v=1770825505&amp;width=400" alt="Swipe Serum Concealer®" srcset="//www.tower28beauty.com/cdn/shop/files/1_PACKSHOT_-_19.5_WL_e11cd2ad-2254-4caf-adc8-18ccdc84f469.png?v=1770825505&amp;width=352 352w, //www.tower28beauty.com/cdn/shop/files/1_PACKSHOT_-_19.5_WL_e11cd2ad-2254-4caf-adc8-18ccdc84f469.png?v=1770825505&amp;width=400 400w" width="400" height="400" loading="lazy" class="absolute inset-0 w-full h-full object-contain opacity-0 [&amp;.active]:opacity-100 transition-opacity duratio…
Affected pages/ / /cart
Low

Page has no level-one heading

WCAG 1.3.1 (A)1 instance1 inspected page

The page exposes no <h1>, so its topic is not conveyed in the heading structure.

Why it matters

The page exposes no <h1>, so its topic is not conveyed in the heading structure.

Recommended correction

Add a single descriptive <h1> that names the page's primary purpose.

View 1 affected element
Component · Ref SBA5D5
Affected pagehttps://www.tower28beauty.com/a/account/login
Elementhtml > body
Accessible nameSkip to content /* Critical: keep the cart drawer out of normal flow before the async component-cart-drawer.css loads, otherwise it occupies layout height (visibility:hidden alone reserves space) and pushes the header + banner down, causing a layout shift / "fill upward" jump on load. */ .drawer { visibility: hidden; position: fixed; top: 0; left: 0; width: 100vw; } Oops, Your Cart is Empty! You're $30 away from FREE shipping! Hit Refresh on Stressed-Out Skin. This derm-approved skin saver calms, soothes, and protects on the go. Meet SOS Spray Need a Shade Match? Every 😊 is different! Find the shade that’s right for you! 3 Min Quiz Estimated Subtotal: $0.00 Continue Shopping Your Cart (0 Items) You're $30 away from FREE shipping! Loading... Estimated Subtotal: $0.00 <button type="submit" class="cart__update-button button button--secondary" form="CartDrawer-Form"> Update </button> Checkout Taxes and shipping calculated at checkout <link href="//www.tower28beauty.com/cdn/shop/t/1246/assets/component-slideshow.css?v=45986047663793502701778176344" rel="stylesheet" type="text/css" media="all" /> <link href="//www.tower28beauty.com/cdn/shop/t/1246/assets/component-list-social.css?v=166254122906847697211778176346" rel="stylesheet" type="text/css" media="all" /> body { --announcement-bar-height: 33px; } FREE Mini Pouch on your First Order! FREE U.S shipping on orders $30+ // Observe announcement bar height and set CSS variable document.addEventListener('DOMContentLoaded', function () { const announcementBar = document.querySelector('.utility-bar') if (announcementBar) { function updateAnnouncementBarHeight() { const height = announcementBar.offsetHeight document.body.style.setProperty('--announcement-bar-height', height + 'px') } // Set initial height updateAnnouncementBarHeight() // Create ResizeObserver to watch for height changes if (window.ResizeObserver) { const resizeObserver = new ResizeObserver(updateAnnouncementBarHeight) resizeObserver.observe(announcementBar) } // Fallback for older browsers window.addEventListener('resize', updateAnnouncementBarHeight) } }) <link href="//www.tower28beauty.com/cdn/shop/t/1246/assets/component-mega-menu.css?v=111920509907908635641778176348" rel="stylesheet" type="text/css" media="all" /> <link href="//www.tower28beauty.com/cdn/shop/t/1246/assets/component-list-menu.css?v=151968516119678728991778176345" rel="stylesheet" type="text/css" media="all" /> <link href="//www.tower28beauty.com/cdn/shop/t/1246/assets/component-search.css?v=40084089888062006471778176347" rel="stylesheet" type="text/css" media="all" /> <link href="//www.tower28beauty.com/cdn/shop/t/1246/assets/component-menu-drawer.css?v=165852253688569330181778176344" rel="stylesheet" type="text/css" media="all" /> <link href="//www.tower28beauty.com/cdn/shop/t/1246/assets/component-cart-notification.css?v=170554693672268806321778176345" rel="stylesheet" type="text/css" media="all" /> <link href="//www.tower28beauty.com/cdn/shop/t/1246/assets/component-cart-items.css?v=182560410482662771391778176345" rel="stylesheet" type="text/css" media="all" /> header-drawer { justify-self: start; display: flex; gap: 4px; } @media screen and (max-width: 768px){ header-drawer { margin: auto; } details-modal { margin: auto; } .header__icons { width: 100%; margin: auto; } .header__icons .header__icon { margin: auto !important; } }@media screen and (min-width: 1280px) { header-drawer { display: none; } } .menu-drawer-container { display: flex; } .list-menu { list-style: none; padding: 0; margin: 0; } .list-menu--inline { display: inline-flex; } .list-menu__item { display: block; align-items: center; letter-spacing: 0; text-wrap: nowrap; } .list-menu__item--link { text-decoration: none; line-height: calc(1 + 0.8 / var(--font-body-scale)); } body { --header-height: 79px; } @media screen and (max-width: 749px) { body { --header-height: 71px; } } /* Transitions for header elements when drawer opens/closes */ .header__search, .header__heading, .header__icons { transition: opacity 0.3s ease-in-out; } .section-header { position: sticky; /* This is for fixing a Safari z-index issue. PR #2147 */ margin-bottom: 0px; } @media screen and (min-width: 750px) { .section-header { margin-bottom: 0px; } } Shop Swipe Serum Concealer® Bestsellers Shop All Skincare Complexion Lip Eye Cheek Sets Merch Find My Shade By Skin Concern …[truncated by Evolize: exceeded D1 value limit]
Markup
<body class="gradient animate--hover-default -template" style="--announcement-bar-height: 29px; --header-height: 57px;"><svg id="oke-star-symbols" style="display:none!important" data-oke-id="oke-star-symbols"><symbol id="oke-star-empty" style="overflow:visible;"><path id="star-default--empty" fill="var(--oke-stars-backgroundColor)" stroke="var(--oke-stars-borderColor)" stroke-width="var(--oke-stars-borderWidth)" d="M3.34 13.86c-.48.3-.76.1-.63-.44l1.08-4.56L.26 5.82c-.42-.36-.32-.7.24-.74l4.63-.37L6.92.39c.2-.52.55-.52.76 0l1.8 4.32 4.62.37c.56.05.67.37.24.74l-3.53 3.04 1.08 4.56c.13.54-.14.74…

05 · Most affected inspected pages

06 · About this assessment

Evolize inspects publicly accessible website pages using automated browser-based testing and deterministic accessibility rules. Automated testing can identify many reproducible technical issues but cannot determine complete WCAG or legal compliance.

  • Publicly accessible surfaces only — no credentials, private systems, or source-code access.
  • Findings apply to the pages and states successfully inspected; automated analysis may not detect every issue.
  • Results reflect the site at the scan date and may have changed since.

Evolize provides digital risk intelligence and does not provide legal advice, certify compliance, or guarantee that litigation will not occur. Methodology · Security · Example assessment

07 · Continuous monitoring

This public report captures one assessment. Evolize monitoring rescans the website, detects new and recurring findings, tracks changes over time and verifies corrections.

Is information in this report inaccurate or outdated? Request a correction or removal.