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:
| Area | Status | Details |
|---|---|---|
| Keyboard Navigation | β Pass | All 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 | β Pass | Add-to-cart, order processing, cart removal, form submission success/error, and search results all announce via aria-live regions. |
| Color Contrast | β Pass | All 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 | π‘ Partial | Primary videos, carousels, canvas animations, and stagger effects respect prefers-reduced-motion. 7 secondary video instances still pending. |
| Form Accessibility | β Pass | Contact, careers, search, newsletter, and address forms have visible labels, aria-required, aria-invalid, aria-describedby, autocomplete, and error summaries. |
| Semantic Structure | β Pass | Single <main> landmark, labeled <nav>/<aside>/<footer>, proper heading hierarchy, semantic <dl>/<table> for data, role="list" on styled lists. |
| Link Accessibility | π‘ Partial | Inline 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 | π‘ Partial | Product gallery uses indexed alt text. Blog content processor preserves existing alt. ~15 SVG icons still missing aria-hidden. Video captions are placeholder. |
| Purchase Path | β Pass | Screen 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.
| Issue | WCAG Criterion | Severity | Status |
|---|---|---|---|
| Video caption (.vtt) files are deployed but contain placeholder descriptions only β full transcription content has not yet been produced | 1.2.2 Captions | High | In 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 check | 2.3.3 Animation from Interactions | Medium | In 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> elements | 3.3.2 Labels or Instructions | Medium | Acknowledged β 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 minimum | 1.4.3 Contrast (Minimum) | Medium | Acknowledged β 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 conformance | Multiple | Medium | Acknowledged β 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 technology | 1.1.1 Non-text Content | Low | Acknowledged β 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-label | 1.2.2 Captions, 4.1.2 Name/Role/Value | Low | Acknowledged β 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)" disclosure | 3.2.5 Change on Request | Low | Acknowledged β 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 varies | 1.4.3 Contrast (Minimum) | Low | Mitigated β 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-labels | 2.4.4 Link Purpose | Low | Acknowledged β 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 ring | 2.4.7 Focus Visible | Low | Acknowledged β 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 uniqueid="main-content" - Focus-visible rings on all interactive elements using the
outline: 2px solid transparentpattern for Windows High Contrast Mode compatibility - Reduced-motion support via a dual-layer system: CSS
prefers-reduced-motionmedia query plus a JavaScriptusePrefersReducedMotion()hook that detects Brave Browser spoofing - WAI-ARIA Authoring Practices patterns on accordions, tabs (with arrow-key navigation and roving tabIndex), menus, and dialogs
inertattribute on background content when modals, popups, and filter panels are open- Minimum 44Γ44 px touch targets on all interactive elements
autocompleteattributes on form fields (name, email, address, phone)aria-liveregions 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
- Web Content Accessibility Guidelines (WCAG) 2.1 Level AA (opens in new tab) β W3C
- WAI-ARIA Authoring Practices Guide (opens in new tab) β W3C
- Section 508 of the Rehabilitation Act (where applicable)
- Americans with Disabilities Act (ADA) Title III
- European Accessibility Act (EAA) β monitored as Mentra expands internationally
Vendor Accessibility
We review third-party components for accessibility before adopting them on our site. Current vendor status:
| Component | Compliance Status |
|---|---|
| Shopify Checkout | WCAG 2.1 AA β managed by Shopify |
| HeadlessUI (Drawer, Menu) | WAI-ARIA compliant β open source |
| Google Tag Manager | N/A β visually hidden iframe |
| YouTube Embeds | WCAG 2.1 AA β YouTube-managed captions |
| Google Fonts | N/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
| Date | Action |
|---|---|
| March 2026 | Initial audit: 10 findings identified (3 critical, 4 high, 3 medium). Accessibility statement published. Compliance protocol established. |
| March 2026 | First 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 2026 | Second remediation sprint: 51 additional gaps found and fixed. Automated testing (axe-core) and lint enforcement (jsx-a11y) added to CI. |
| March 25, 2026 | Third 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, 2026 | Fourth 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, 2026 | Fifth 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.