Skip to content

Accessibility Fortification

In Progress Kendo

Date: 2026-03-16 | Target: Accessibility score 3/10 → 7/10

Summary

A systematic UX inspection of kendo's frontend revealed that accessibility scored 3/10 across both inspected domains (authentication flows and issue board). This is not a domain-specific gap — it is a systemic absence of accessibility infrastructure throughout the application.

Four PRs have already been merged addressing the most critical shared infrastructure issues. This campaign documents the remaining work and proposes a phased remediation plan.

Why This Matters

WCAG 2.1 Level A is the minimum bar

The Web Content Accessibility Guidelines (WCAG) define three conformance levels: A (minimum), AA (standard), and AAA (enhanced). Level A failures mean that some users are completely unable to use the application. Kendo currently has multiple Level A failures:

WCAG CriterionFailureImpact
2.1.1 KeyboardBoard cards and issue rows cannot be reached via keyboardUsers who cannot use a mouse cannot navigate the core workflow
2.4.7 Focus VisibleButton.vue uses focus:outline-none, removing focus indicatorsKeyboard users cannot see which element is focused
1.3.1 Info and RelationshipsForm errors not programmatically associated with inputsScreen reader users receive no error feedback on invalid forms
4.1.2 Name, Role, ValueIcon-only buttons lack accessible namesScreen reader users encounter unlabeled buttons

These affect keyboard-only users, screen reader users, users with motor impairments, and users with low vision — conservatively 15-20% of the population.

ISO 27001 alignment

Kendo operates under ISO 27001 certification. While accessibility is not explicitly in the control set, it intersects with:

  • A.5.12 / A.5.13 (Information classification and labeling) — If the application is inaccessible to certain users, information labeled for their access cannot actually reach them.
  • Organizational reputation — An ISO 27001-certified product with Level A accessibility failures creates a credibility gap if audited by clients or partners who assess product quality holistically.

The fix surface is concentrated

Most accessibility gaps trace to a small number of shared components:

ComponentIssueBlast Radius
Button.vuefocus:outline-none removes focus indicatorsEvery button in the app
InputField.vuefocus-outline-none removes focus indicatorsEvery text input in the app
FormError.vueNo aria-describedby linking to inputsEvery form in the app
InputField.vueNo aria-required passthroughEvery required field in the app
IconButton patternNo aria-label on icon-only buttons~20+ instances across all domains

Fixing 3-4 shared components improves accessibility across every domain simultaneously.

Current State

Inspection scores

Two domains inspected (2026-03-15), five dimensions each:

DimensionAuth FlowsIssue BoardTrend
Domain Language6/107/10⬆️
Error States5/104/10⬇️
Empty & Loading States5/105/10Stable
Visual Consistency7/107/10Stable
Accessibility3/103/10Stable (floor)
Composite5.3/105.3/10Stable

Accessibility is the weakest dimension by a margin of 2+ points.

Already fixed (PRs #509-#512)

These merged PRs established the accessibility infrastructure:

FixPRImpact
aria-describedby infrastructure in FormError + InputField#509All forms can now link errors to inputs
focus-visible outlines on Button, DropdownButton, SelectEntry#509, #510Focus indicators restored on most interactive elements
aria-label on ~11 icon-only buttons (auth + shared)#511Screen readers can identify button purpose
aria-expanded on collapsible elements#511Screen readers announce open/closed state
aria-required infrastructure on InputField#511Required fields announced to screen readers
Dutch error messages replaced with English (4 locations)#512Error messages now in declared UI language
Dead CSS cleanup in auth forms#512Removed unused transition CSS

Remediation Plan

Phase 1: Shared component completion

Ready — no coordination needed

Follows patterns already established in PRs #509-#512. Low risk, no design decisions.

ItemComponentEffort
aria-label on remaining icon-only buttons~4 buttons in teams/users domainsLow
aria-required adoption on all forms with required fieldsAll form consumersLow
aria-describedby adoption on issue form fieldsIssueForm.vue, SprintFormModal.vueLow
Custom select ARIA rolesSearchableSelect, SingleSelect, MultiSelectMedium

Phase 2: Keyboard navigation

Needs ally awareness

Structural changes to how interactive elements are rendered. Touches component behavior and may affect test assertions.

ItemComponentsEffortNotes
Board cards keyboard-focusableDragElement.vueMediumWrap in <a> or add tabindex
Issue rows keyboard-navigableIssueRow.vueMediumSame pattern
Sprint row keyboard-accessible collapseSprintRow.vueLowAdd role="button" + tabindex + @keypress
Comment list semantic HTMLCommentSection.vueLowChange div to ul/li

Phase 3: Error resilience

Needs design deliberation

Affects user experience on error paths. Requires input on desired behavior.

ItemComponentsDesign Decision Needed
Drag-and-drop error handling + rollbackBoard.vue, Backlog.vueWhat happens visually when a board move fails?
Sidebar inline edit error handling + rollbackIssueSidebar.vueRevert to previous value or show error state?
Network error user feedbackError middlewareToast wording, retry option?
Loading indicators on form submissionsAuth forms, comment, sprint opsSpinner placement — inside button or overlay?

Phase 4: Polish

Low priority
ItemScopeEffort
Toast message voice normalization~40 instances across issues domainMedium
Empty state for filtered board lanesBoard.vueLow
Standardize password confirmation label3 formsLow

Expected Score Trajectory

MilestoneAccessibility ScoreNotes
Before (2026-03-15)3/10Zero ARIA, no keyboard nav, no focus indicators
After PRs #509-#5124/10Focus indicators restored, ARIA infrastructure in place
After Phase 15/10All shared components accessible, forms linked
After Phase 26.5/10Core workflows keyboard-navigable
After Phase 37/10Error paths handled, loading states visible
After Phase 47.5/10Voice consistency, empty states

Target: 7/10 (Fortified) — matching the Visual Consistency score and bringing accessibility to parity with the rest of the application.

Architecture documentation for contributors and collaborators.