Skip to main content

Accessibility Statement

Last updated: March 25, 2026 (fifth remediation sprint β€” adversarial audit)

Our Commitment

Mentra Labs is committed to ensuring that mentraglass.com is accessible to everyone, including people who use assistive technologies such as screen readers, keyboard navigation, and voice control. We are actively working to meet the Web Content Accessibility Guidelines (WCAG) 2.1 Level AA (opens in new tab).

Current Status

We have completed five remediation sprints following a comprehensive adversarial accessibility audit. The most recent sprint (March 25, 2026) resolved 43 issues across 31 files, with particular focus on the critical purchase path, screen reader announcements, motion safety, and color contrast. The site now substantially conforms to WCAG 2.1 Level AA, with known gaps documented below.

Conformance Scorecard

Summary of WCAG 2.1 AA conformance status by accessibility dimension:

AreaStatusDetails
Keyboard Navigationβœ… PassAll modals, drawers, and popups have focus traps, Escape-to-close, and focus restoration. Tab patterns with arrow-key navigation on all custom tab widgets. Skip-to-content link present.
Screen Reader Announcementsβœ… PassAdd-to-cart, order processing, cart removal, form submission success/error, and search results all announce via aria-live regions.
Color Contrastβœ… PassAll ink tokens meet AA minimum (4.5:1 normal text, 3:1 large text/UI) in both light and dark modes. Focus rings meet 3:1 non-text contrast.
Reduced Motion🟑 PartialPrimary videos, carousels, canvas animations, and stagger effects respect prefers-reduced-motion. 7 secondary video instances still pending.
Form Accessibilityβœ… PassContact, careers, search, newsletter, and address forms have visible labels, aria-required, aria-invalid, aria-describedby, autocomplete, and error summaries.
Semantic Structureβœ… PassSingle <main> landmark, labeled <nav>/<aside>/<footer>, proper heading hierarchy, semantic <dl>/<table> for data, role="list" on styled lists.
Link Accessibility🟑 PartialInline links underlined by default. 30+ external links have new-tab disclosure. ~10 external links and ~4 "Learn more" links still pending.
Image & Media Alt Text🟑 PartialProduct gallery uses indexed alt text. Blog content processor preserves existing alt. ~15 SVG icons still missing aria-hidden. Video captions are placeholder.
Purchase Pathβœ… PassScreen reader users can identify the product, read the price, adjust quantity, trigger purchase, and receive confirmation β€” all via keyboard with live announcements.

What We've Fixed

The following accessibility improvements have been verified in code across five remediation sprints:

  • Purchase path fully accessible β€” screen reader users receive live announcements for add-to-cart, order processing, errors, and cart item removal
  • Product title visible to all assistive technology on all viewports (aria-hidden removed from desktop product heading)
  • Address form has visible <label> elements on all 10 inputs (replacing placeholder-only pattern)
  • Skip-to-content link in the Header component targeting #main-content
  • All custom pages wrapped in <main> landmarks via ContentShell β€” single id="main-content" with no duplicates
  • Focus-visible rings on all interactive elements (buttons, links, inputs) with Windows High Contrast Mode support (outline: 2px solid transparent pattern)
  • Reduced-motion support via dual-layer system (CSS media query + JS preference hook) covering hero videos, SmartVideo, carousels, canvas animations, stagger effects, and marquees
  • Visible pause/play button on product image carousel and all auto-advancing content
  • ARIA patterns on accordions, tabs (with arrow-key navigation and roving tabIndex), menus, and dialogs
  • Modal, popup, and mobile menu overlays apply inert to background content β€” SortFilter panel uses inert when hidden
  • Compare page FAQ tabs support ArrowLeft/ArrowRight/Home/End keyboard navigation
  • Minimum 44Γ—44px touch targets on all interactive elements
  • autocomplete attributes on form fields (name, email, address, phone, etc.)
  • aria-required on required form inputs with visible labels
  • Contact and careers forms have per-field error messages, error summaries with anchor links, and success announcements via role="status" + aria-live
  • Dark mode --ink-tertiary contrast fixed (#8f8f8f β†’ #999999, ~4.7:1 on dark surface)
  • Livestream text-white/40 and text-white/45 raised to text-white/70 (~8.7:1 contrast)
  • Inline paragraph links underlined by default (not relying on color alone β€” WCAG 1.4.1)
  • Error inputs use border-width: 2px for non-color error indication
  • Placeholder focus opacity raised from 0.5 to 0.7 for better contrast
  • Brand green color contrast fixed site-wide β€” AA-compliant --brand-text token deployed to all text usages
  • Comparison feature rows on /compare page have ARIA table roles (role="table", role="row", role="rowheader", role="cell")
  • Homepage specifications converted to semantic <dl>/<dt>/<dd>
  • Cart Total rendered as semantic <dl>/<dt>/<dd>; cart lists use role="list" for Safari VoiceOver
  • Sale price / original price distinction announced via sr-only labels in ProductCard
  • Color swatch in cart has role="img" so aria-label is respected
  • Blog content processor preserves existing alt attributes, adds iframe title fallback, uses empty alt for auto-detected decorative images
  • ProductGallery fallback alt text uses indexed pattern ("Product photo 1", "Product photo 2") instead of generic "Product image"
  • 30+ external links disclose "(opens in new tab)" via aria-label or sr-only text
  • FAQ accordion panels remain in DOM with hidden attribute so aria-controls always references a valid element
  • ChargingImageCarousel aria-live removed to prevent noisy auto-rotation announcements
  • Duplicate investor marquee logo sets marked aria-hidden="true"
  • Footer uses native <footer> role (removed redundant role="contentinfo")
  • PageLayout <nav> has aria-label="Main navigation"
  • SortFilter dropdown uses as="div" (not as="nav" β€” a sort menu is not a navigation landmark)
  • SortFilter heading levels corrected (h4 β†’ h3)
  • Blog <aside> has aria-label="Related content"
  • Modal fallback dialog label improved from "Modal" to "Dialog content"
  • Video thumbnail buttons have descriptive aria-labels ("Play video 1", etc.)
  • Phantom empty-src <track> removed from gallery lightbox (replaced with TODO comment)
  • 404 page canvas, Hero3DCanvas, TVCanvas, StaggeredHeadline, YourDataSection, and newhome manifesto all draw single static frame or reveal instantly under reduced motion
  • Automated WCAG 2.1 AA testing in CI with @axe-core/playwright
  • ESLint accessibility rules enforced as blocking errors
  • Windows High Contrast Mode and prefers-contrast: more support in global CSS

Known Limitations

We are aware of the following accessibility gaps and are actively working to resolve each one. We document these honestly β€” transparency about known issues is part of our commitment to accessibility.

IssueWCAG CriterionSeverityStatus
Video caption (.vtt) files are deployed but contain placeholder descriptions only β€” full transcription content has not yet been produced1.2.2 CaptionsHighIn progress β€” VTT infrastructure and <track> elements in place; professional transcription pending via Rev.com (estimated Q2 2026)
Hero.tsx SpreadMedia, MediaCardContent phone video, VideoPlaylist player, and 4 feature demo videos on /live still auto-play without prefers-reduced-motion check2.3.3 Animation from InteractionsMediumIn progress β€” all primary videos and carousels fixed; these 7 secondary instances will be addressed in the next sprint
Account edit form (first/last name) uses placeholder-only visible labels with aria-label but no persistent visible <label> elements3.3.2 Labels or InstructionsMediumAcknowledged β€” the address form has been fixed with visible labels; account.edit.tsx still pending
Legacy INPUT_STYLE_CLASSES and Input.tsx minisearch variant use placeholder:text-primary/50 (~3.5:1 contrast ratio), below the 4.5:1 AA minimum1.4.3 Contrast (Minimum)MediumAcknowledged β€” design-system .input-base placeholders are compliant; legacy utility class and minisearch still pending migration
Off-site app marketplace (apps.mentra.glass) is outside this repo and has not been independently audited for WCAG conformanceMultipleMediumAcknowledged β€” the /apps route discloses the external handoff; marketplace accessibility is outside the scope of this conformance claim
~15 inline SVG icons on the socials page, gallery PlayIcon, and livestream TV page lack aria-hidden="true" β€” they are inside labeled parent elements but technically exposed to assistive technology1.1.1 Non-text ContentLowAcknowledged β€” low risk because parent buttons/links have accessible names; will be cleaned up in a future sprint
Gallery lightbox video and livestream TV channel preview thumbnails lack <track> caption elements; livestream watch page camera feed lacks aria-label1.2.2 Captions, 4.1.2 Name/Role/ValueLowAcknowledged β€” lightbox has a TODO comment; these are preview/live-stream contexts where prerecorded captions are not applicable
~10 target="_blank" links across MiniAppStore component, get.tsx, getbeta.tsx, terms-of-service.tsx, and subscribe.tsx still missing "(opens in new tab)" disclosure3.2.5 Change on RequestLowAcknowledged β€” 30+ instances have been fixed; remaining 10 will be addressed in the next content sweep
Text rendered over video hero backgrounds depends on video frame content for contrast β€” static scrims are in place but per-frame contrast varies1.4.3 Contrast (Minimum)LowMitigated β€” dark scrims and solid-background text containers reduce risk; full per-frame verification not practical
4 "Learn more" links (homepage inline versions, newhome, livestream watch) and internal blog "Read more" links lack descriptive aria-labels2.4.4 Link PurposeLowAcknowledged β€” component versions (PrescriptionReady.tsx) have been fixed; inline duplicates still pending
Search input and search result cards in search.tsx use bare outline-none without focus-visible replacement ring2.4.7 Focus VisibleLowAcknowledged β€” JS-based focus styling exists but no CSS-only fallback; will add focus-visible:ring in next sprint

This page is updated as fixes ship.

How to Report an Accessibility Issue

If you experience a barrier on our site that prevents you from accessing content or completing a task, we want to hear about it. We respond to all accessibility reports within 5 business days.

Email: contact@mentraglass.com

Subject line: Accessibility issue β€” [brief description]

Please include:

  • The URL of the page where you encountered the issue
  • The assistive technology you are using (if any)
  • A description of the barrier you experienced

Technical Approach

Our development process includes:

  • Skip-to-content link in the Header component targeting #main-content
  • All custom pages wrapped in <main> landmarks via the ContentShell component with a single unique id="main-content"
  • Focus-visible rings on all interactive elements using the outline: 2px solid transparent pattern for Windows High Contrast Mode compatibility
  • Reduced-motion support via a dual-layer system: CSS prefers-reduced-motion media query plus a JavaScript usePrefersReducedMotion() hook that detects Brave Browser spoofing
  • WAI-ARIA Authoring Practices patterns on accordions, tabs (with arrow-key navigation and roving tabIndex), menus, and dialogs
  • inert attribute on background content when modals, popups, and filter panels are open
  • Minimum 44Γ—44 px touch targets on all interactive elements
  • autocomplete attributes on form fields (name, email, address, phone)
  • aria-live regions for dynamic content: cart status, order processing, form submission, and search results
  • Semantic HTML: <dl> for specifications and cart totals, ARIA table roles for comparison data, role="list" on styled lists for Safari/VoiceOver
  • Automated WCAG scanning integrated into our deployment pipeline via @axe-core/playwright
  • Manual accessibility review each quarter against WCAG 2.1 Level AA
  • Accessibility checklist as part of our definition of done for new frontend features
  • Third-party component review for accessibility compliance before adoption

Compliance Framework

Our accessibility programme is governed by an internal compliance protocol maintained by our Operations Manager. Key elements include:

  • Quarterly manual audits against WCAG 2.1 Level AA, covering keyboard navigation, screen reader compatibility, focus management, and video caption accuracy
  • Adversarial "plaintiff's attorney" audit methodology β€” testing from the perspective of ADA Title III litigation to identify and preemptively close legal attack surfaces
  • Automated WCAG scanning integrated into our CI/CD pipeline β€” accessibility regressions block deployment
  • An accessibility checklist that must be completed before any new frontend feature ships
  • Mandatory third-party component review: vendors must provide a VPAT (Voluntary Product Accessibility Template) before adoption
  • A maintained internal audit log tracking every known violation, its severity, owner, and resolution status
  • Defined ownership: Operations Manager owns the protocol and audit log, frontend developers execute fixes, content team produces captions and alt text
  • Planned evaluation of WCAG 2.2 Level AA requirements in Q4 2026

Standards We Reference

Vendor Accessibility

We review third-party components for accessibility before adopting them on our site. Current vendor status:

ComponentCompliance Status
Shopify CheckoutWCAG 2.1 AA β€” managed by Shopify
HeadlessUI (Drawer, Menu)WAI-ARIA compliant β€” open source
Google Tag ManagerN/A β€” visually hidden iframe
YouTube EmbedsWCAG 2.1 AA β€” YouTube-managed captions
Google FontsN/A β€” CSS-only, no interactive elements

If you encounter an accessibility barrier caused by a third-party component on our site, please report it to us and we will work with the vendor to resolve it.

Audit History

DateAction
March 2026Initial audit: 10 findings identified (3 critical, 4 high, 3 medium). Accessibility statement published. Compliance protocol established.
March 2026First remediation sprint: all 3 critical and 4 high findings resolved. Landmarks, skip link, focus management, form labels, keyboard nav, and reduced-motion support added.
March 2026Second remediation sprint: 51 additional gaps found and fixed. Automated testing (axe-core) and lint enforcement (jsx-a11y) added to CI.
March 25, 2026Third remediation pass: 24 lint errors resolved (overlay semantics, invalid roles, duplicate props). Vendor review and compliance framework documented. Caption files still placeholder β€” production captions pending.
March 25, 2026Fourth remediation sprint (93 issues addressed): Brand green contrast fixed site-wide (--brand-text token deployed to 20+ text usages, btn-primary background upgraded to --brand-active). OS page mobile aria-hidden removed. Search and apps routes migrated to <main> landmarks. inert attribute added to Modal, NewsletterPopup, and Header mobile menu backgrounds. Focus traps added to Gallery lightbox and submit modal. Homepage FAQ upgraded to full ARIA tab pattern with arrow-key navigation. Hover-only card interactions fixed across 8 components (onFocus/onBlur parity). Pause controls added to BackedBySection marquee, OS page marquee, ChargingImageCarousel, and MentraLiveIntro video. SmartVideo component now respects prefers-reduced-motion. Autoplay videos in AiNoteTaking and StreamYourWorld disabled under reduced motion. Header logo double-announcement fixed. Decorative elements marked aria-hidden across MiniAppStore, GetYourMentra, about page, and LimitedStock. DetailedSpecs converted to semantic <dl>. Notes comparison grid given ARIA table roles. AccordionItem on live page given full aria-controls/region/labelledby. Heading hierarchy fixed (h5β†’h4). ProductCard badge <label> changed to <span>, CompareAtPrice wrapped in <s>. Footer links wrapped in <nav>. InTheNews links given unique aria-labels and focus indicators. External links given new-tab disclosure. Newsletter validation error made visible to sighted users. Loading overlay given role=status. Ambiguous "Learn more" links given descriptive aria-labels. ESLint: 0 errors, 95 warnings (all non-blocking).
March 25, 2026Fifth remediation sprint β€” adversarial ADA lawsuit audit (43 fixes across 31 files, 600+ lines changed). P0 critical fixes: (1) Added aria-live status announcements to entire purchase flow β€” AddToCartButton now announces "Added to cart", Order Now buttons announce "Processing…" and error states, cart item removal announces "Item removed from cart". (2) Removed aria-hidden="true" from desktop product title on /live so screen readers can identify the product being purchased. (3) Added visible <label> elements to all 10 address form inputs (replacing placeholder-only pattern). (4) Added usePrefersReducedMotion guards to homepage hero videos, local SmartVideo copy, and product page image carousel; added visible ⏸/β–Ά pause/play button to product carousel. (5) Fixed dark mode --ink-tertiary contrast (#8f8f8f β†’ #999999, raising from ~4.1:1 to ~4.7:1). P1 fixes: Fixed text-white/40 and text-white/45 on livestream page (β†’ text-white/70). Added "(opens in new tab)" disclosure to 30+ target="_blank" links across 9 files. Changed generic "Article image" alt text to empty alt (decorative) in BlogContent.tsx. Changed "Product image" fallback to "Product photo N" in ProductGallery.tsx. Added iframe title preservation in blog content processor. Resolved duplicate id="main-content" between PageLayout and FooterReveal. Replaced outline:none with outline:2px solid transparent (HC-safe) in gallery and blog search inputs. Added ARIA table roles to comparison feature rows on /compare page. Converted homepage specification data to semantic <dl>/<dt>/<dd>. Added role="status" + aria-live="polite" to contact and careers form success states. Added inert attribute + aria-controls linkage to SortFilter hidden panel. Added arrow-key navigation + roving tabIndex to compare page FAQ tabs. Increased placeholder focus opacity from 0.5 to 0.7. Made inline paragraph link underlines visible by default (WCAG 1.4.1). Added border-width:2px to error inputs for non-color error indication. P2 fixes: Added prefers-reduced-motion guards to 404 canvas animation, Hero3DCanvas, TVCanvas, StaggeredHeadline, YourDataSection stagger, and newhome manifesto stagger. Removed noisy aria-live from auto-rotating ChargingImageCarousel. Fixed FAQ aria-controls pointing to non-existent elements (panels now use hidden attribute instead of conditional render). Removed redundant role="contentinfo" from Footer. Added aria-label="Main navigation" to PageLayout nav. Changed SortFilter Menu.Items from as="nav" to as="div". Fixed heading level skip (h4β†’h3) in SortFilter. Added aria-label="Related content" to BlogArticle aside. Added aria-hidden="true" to duplicate investor marquee logos. Added role="list" to Cart <ul> elements for Safari VoiceOver. Improved Modal fallback label. Added aria-label to video thumbnail buttons. Removed phantom empty-src <track> from gallery lightbox. Added role="img" to cart color swatch span. Converted Cart Total to semantic <dl>/<dt>/<dd>. Added sr-only "Sale price" label to ProductCard.

This statement was last updated on March 25, 2026 following the fifth remediation sprint (adversarial ADA audit β€” 43 fixes across 31 files). It is updated whenever material accessibility changes are made to the site. Known gaps are documented honestly above β€” we do not claim full WCAG 2.1 AA conformance until all Level A and AA criteria are verified, including production video captions. Our remaining issues are primarily content-dependent (video transcription), low-severity cleanup items (SVG aria-hidden, remaining new-tab disclosures), and a handful of secondary motion instances. Zero critical purchase-path barriers remain.

Ready to build on Mentra?

Open-source moves fast. Stay up to date with the platform.

No spam. Unsubscribe anytime.