Four icon-only buttons in Gallery have no aria-label / aria-pressed: grid/list view toggle, add-folder, favorite star (WCAG 4.1.2) #112
Labels
No labels
blocked:commit-ready-failed
blocked:gate-fetch
blocked:gate-lint
blocked:gate-plan
blocked:gate-research
blocked:needs-attention
blocked:needs-decision
blocked:needs-human
blocked:no-changes
blocked:verify-failed
bug
deferred
feature-request
in-progress
needs-decompose
needs-triage
quickfix
security/medium
triage-approved
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Mark/Kimi_Agent_Brother_10_Digitizing_App#112
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Bug: Codebase-wide accessibility gap — 50 buttons across 10 files, only 5 have aria-label (WCAG 4.1.2)
Sweep results (2026-09-25)
90% of buttons across these surfaces have no accessible name.
Reproduction
cd ~/Projects/Kimi_Agent_Brother_10_Digitizing_App && npm run devmcp__browseros__snapshot:button [ref=e9](Grid view) — no namebutton [ref=e10](List view) — no namebutton [ref=e16](Add folder) — no namebutton [ref=e20](Favorite star) — no nameWhy this matters
WCAG 2.1 Success Criterion 4.1.2 Name, Role, Value (Level A): "For all user interface components … the name [can] be programmatically determined."
This codebase fails the most basic accessibility requirement on 45 of 50 buttons. Any screen-reader user, any keyboard-only user relying on audible cues, and any user with cognitive disabilities who depends on clear labels cannot use the app's primary navigation and editing surfaces.
Specific buttons confirmed missing aria-label
The list is large — I'll group by severity:
HIGH (user-blocking, primary actions):
LeftToolbar.tsx— Select, Zoom, Undo, Redo tool buttons (4 buttons)EditorToolbar.tsx— Select Nodes, Add Node, Delete Node, Convert Node, Draw Path, Scissors, Smooth, Zoom (8 buttons)EditorRightPanel.tsx— Sequence / Underlay / Type / Direction / Color / Add Node / Delete / Smooth action buttons (6+ buttons)AppHeader.tsx— Settings gear, Help icon (2 buttons)MEDIUM (per-card / contextual):
DesignCard.tsx:401Favorite star (no aria-label, no aria-pressed)DesignCard.tsx:355-364"Open in Editor" button (no onClick — separate bug #111)DesignCard.tsx:368-388Play-icon "Open in Workspace" quick-load (already has aria-label — good)LOW (utility):
Gallery.tsx:384,407Grid/List view toggle (2 buttons, no aria-pressed)Gallery.tsx:433"New Folder" (no aria-label, but has visible text "New Folder")FolderNav.tsx:151"+" add-folder button (icon-only)CanvasArea.tsx— view toggle (image / stitches / both), zoom controls, recent design previewsSuggested fix scope
This is not a 1-line fix — it requires touching 9 files and ~45 buttons. Approach:
aria-labelto the 4 icon-only buttons in Gallery (e9/e10/e16/e20) — these are the highest-traffic. Ship as a single PR (~15 LOC).grep -nE '<button[^>]*$' src/**/*.tsxaudit; for any button whose only child is an icon component (<X size={...} />), addaria-labeland (where appropriate)aria-pressed.screen.getAllByRole('button'), and asserts every button has either text content oraria-label. Block CI if any button fails.jsx-a11yconfig (@axe-core/clialready covers this — wireeslint-plugin-jsx-a11y/anchor-has-contentandjsx-a11y/control-has-associated-labelto fail on missing aria-label for buttons whose only child is an icon).Related prior art
Labels
Severity
Medium-High. WCAG Level A violation on 90% of buttons. Not user-blocking for sighted mouse users, but a serious accessibility blocker for screen reader / keyboard-only users. Should be filed as a release-blocking item for any "WCAG 2.1 AA compliant" claim in marketing.
Filed 2026-09-25 by user-driven bughunt session.
Fixed by commit
bf28480on main.All four icon-only buttons in Gallery now expose accessible names and toggle state:
aria-label="Grid view"/"List view"+aria-pressed={viewMode === 'grid' | 'list'}aria-label="New folder"aria-label={design.isFavorite ? 'Remove from favorites' : 'Add to favorites'}+aria-pressed={design.isFavorite}7 regression tests in
src/components/gallery/issue-112-aria.test.tsxcover the aria-label presence, aria-pressed default + flip behaviour, and the click-to-create flow through FolderNav. Full test suite: 376/376 pass.npm run buildclean. CI: Lint job ✅ success (the code-quality gate — typecheck + lint + test + build). Docker image build + workspace-screenshot jobs fail with the same drift pattern seen on the prior commit (58687ed) — unrelated to this fix.