Skip to content

Accessibility: contrast tokens, labeling, and live-region sweep (remaining P1/P2) #218

Description

@AdamJ

Background

Follow-up to #216 (the P0 modal/keyboard/live-region issues). These are friction-level and cosmetic a11y findings from the same audit on claude/repo-audit-issues-jsleb5.

P1 — significant friction

  • Second wave of icon-only buttons without aria-label/Tooltip, distinct from the ones already fixed in the recent a11y pass: src/components/CategoryManagement.tsx:150, src/components/ProjectManagement.tsx:172,185.
  • src/pages/ProjectList.tsx:189-195,255-264, src/pages/Categories.tsx:111-127 — Edit/Restore/Delete buttons collapse to icon-only on mobile (hidden sm:block label) with no aria-label fallback, unlike sibling buttons in the same row.
  • src/components/CategorySheet.tsx:161-169 — Color-swatch picker buttons are 24×24px, no aria-label/aria-pressed, under the 44px touch-target guideline.
  • src/components/ArchiveFilter.tsx:60-70 — Expand/collapse trigger has no aria-expanded/aria-controls tied to the filter panel.
  • src/components/PlannedTaskCard.tsx:165 — Icon-only MoreVertical dropdown trigger has no aria-label ("Task options"); also 28px, under the touch-target minimum.
  • src/components/StaleDayDialog.tsx:43 — Intentionally blocks Escape/overlay dismissal with no reason surfaced to AT users. Add aria-describedby explaining why dismissal is disabled.
  • Hardcoded green-/blue-/gray- Tailwind colors instead of semantic/Radix tokens (project rule violation, also a likely contrast/dark-mode risk): AuthDialog.tsx:72,128-129, ExportDialog.tsx:397-446, TaskEditDialog.tsx:442, StartDayDialog.tsx:69,106-107, ArchiveEditDialog.tsx:338,355,549-551, ArchiveItem.tsx:144-168,297,303, DaySummary.tsx:25-65, CategoryManagement.tsx:127-133, ProjectManagement.tsx:146, SyncStatus.tsx:78,81,86, UserMenu.tsx:30, InstallPrompt.tsx:114, UpdateNotification.tsx:66,83.
  • Status/sync/update banners lack role="status"/aria-live: SyncStatus.tsx:69-86, UpdateNotification.tsx:54-103, PwaUpdatePrompt.tsx:14-41.
  • src/components/BackgroundTimerNotifier.tsx:50-53 — document title/OS notification update with elapsed time, but nothing in-page mirrors this for SR users with the tab focused.
  • Unlabeled form fields: ExportDialog.tsx:278,304 (date range <label>s not paired via htmlFor/id), TaskEditInArchiveDialog.tsx:135-138 (<Label> missing htmlFor).

P2 — minor/cosmetic

  • Decorative icons missing aria-hidden="true": ExportDialog.tsx:182,187, StartDayDialog.tsx:69,108, ArchiveEditDialog.tsx:338,549, StaleDayDialog.tsx:47, DaySummary.tsx:28,40, empty-state icons in ClientManagement.tsx:136,233, CategoryManagement.tsx:100, ProjectManagement.tsx:118.
  • AppSidebar.tsx:121, Navigation.tsx:58-62 — logo <img alt="Logo"> redundant with adjacent "Timetraked" text; should be alt="" + aria-hidden.
  • TaskTrackingPanel.tsx:103,162, MarkdownDisplay.tsx:15-17, Navigation.tsx:56 — arbitrary color classes, no dark variant.
  • pages/NotFound.tsx:19 — plain <a href="/"> instead of Link (full reload).
  • KanbanColumn.tsx:53-58 — count Badge has no aria-label context (e.g. "4 tasks").
  • CategorySheet.tsx:184-186, ProjectSheet.tsx:298-300 — helper text not wired via aria-describedby to the checkbox it explains.

Origin

Surfaced during the usability/performance/security audit on claude/repo-audit-issues-jsleb5.

Metadata

Metadata

Assignees

No one assigned

    Projects

    Status
    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions