Skip to content

fix(a11y): align DOM order with visual order in mobile bottom-nav (WCAG 1.3.2)#3441

Open
bilal-karim wants to merge 1 commit into
mainfrom
a11y/1.3.2-bottom-nav-links-order
Open

fix(a11y): align DOM order with visual order in mobile bottom-nav (WCAG 1.3.2)#3441
bilal-karim wants to merge 1 commit into
mainfrom
a11y/1.3.2-bottom-nav-links-order

Conversation

@bilal-karim
Copy link
Copy Markdown
Member

@bilal-karim bilal-karim commented May 22, 2026

Summary

The mobile bottom-nav drawer used flex-col-reverse to put the most-important section closest to the user's thumb at the bottom of the screen. Visually correct, but the implementation chose to reverse via CSS rather than data:

  • Sighted users saw sections in order [C, B, A] (bottom-up importance)
  • Screen readers / keyboard tab encountered [A, B, C] (DOM order)

This is the canonical WCAG 1.3.2 Meaningful Sequence failure — visual reading order diverges from programmatic reading order.

Fix

Move the reversal from CSS to a $derived in script, then use plain flex-col:

-  const isNotLastSection = (i: number): boolean => i !== sections.length - 1;
+  const visualSections = $derived([...sections].reverse());
+  const isNotLastSection = (i: number): boolean =>
+    i !== visualSections.length - 1;
...
-  <div class="flex h-full flex-col-reverse ...">
-    {#each sections as section, i (i)}
+  <div class="flex h-full flex-col ...">
+    {#each visualSections as section, i (i)}

Visual output is identical. DOM order, keyboard tab order, and screen-reader reading order now all agree.

Audit context

  • WCAG 2.2 SC 1.3.2 Meaningful Sequence (Level A) — Moderate.
  • Issue file: audit-output/issues/1.3.2-bottom-nav-links-order.md.
  • The audit's Defect 2 (portal-tooltip aria-describedby linkage) was deferred to the 1.4.13 tooltip remediation. That dependency is already satisfied by PR fix(a11y): make Tooltip keyboard-accessible, dismissible, and hoverable #3429, which adds the aria-describedby wiring.

Test plan

  • On a mobile viewport (Chrome DevTools device mode → iPhone), open the bottom-nav drawer. Confirm the visual section order is unchanged from prod.
  • With VoiceOver iOS (or TalkBack Android) on a real device, swipe through the drawer sections. Sections should be announced in the same order as they appear visually, top to bottom.
  • Tab through the drawer with a Bluetooth keyboard on a tablet. Focus should move through links in visual order.
  • Inspect the rendered DOM — <NavSection> elements should appear in visualSections order, not the reversed-by-CSS original.

🤖 Generated with Claude Code

A11y-Audit-Ref: 1.3.2-bottom-nav-links-order

…wer (WCAG 1.3.2)

The drawer used flex-col-reverse to put the most-important
section nearest the user's thumb at the bottom of the screen.
Visually correct, but the implementation chose to reverse via CSS
rather than data -- so sighted users saw [C, B, A] while screen
readers and keyboard tab encountered [A, B, C]. This is the
canonical WCAG 1.3.2 Meaningful Sequence failure.

Move the reversal from CSS to a $derived in script, then use
plain flex-col so DOM order matches visual order. Visual output
is identical to today; only DOM, keyboard tab, and screen-reader
reading order change.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@vercel
Copy link
Copy Markdown

vercel Bot commented May 22, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
holocene Ready Ready Preview, Comment May 22, 2026 4:16pm

Request Review

@github-actions github-actions Bot added a11y Accessibility audit PR a11y:no-fix-doc No A11y-Audit-Ref line; audit team triage a11y:bucket-3 Bucket 3: engineer required a11y:sc-1.3.2 and removed a11y:no-fix-doc No A11y-Audit-Ref line; audit team triage labels May 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

a11y:bucket-3 Bucket 3: engineer required a11y:sc-1.3.2 a11y Accessibility audit PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant