From 16b520bb3d97026e55dccdeace4d7c113987ad23 Mon Sep 17 00:00:00 2001 From: Replit Agent Date: Fri, 24 Apr 2026 14:02:17 +0000 Subject: [PATCH] fix(dashboard-v2): make UpcomingPanel rows keyboard-accessible [Phase 2d] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase 2d of the accessibility paydown that began with FieldCard (#629, Phase 2b) and continued in OperationsTimeline (#632, Phase 2c). Same proven pattern, applied to the v2 IA "Upcoming" panel — the only remaining clickable-row debt the user asked to fix this round. Before ------ Each row in pages/DashboardV2/components/UpcomingPanel was a
  • with onClick={navigate} and an inline style={{cursor: 'pointer'}} — no role, no tabIndex, no keyDown handler, no accessible name. AT users heard nothing meaningful and keyboard users could not reach or activate the row at all. After ----- Each row gains the same FieldCard / OperationsTimeline contract: * role="button" + tabIndex={0} * onKeyDown handles Enter and Space * Space calls preventDefault to suppress page scroll * unrelated keys (Tab, Escape, Shift, ArrowDown, ...) are ignored * aria-label summarises the row exactly as it reads visually: "{operationType}, {fieldName}, {DD MMM}" "{operationType}, {fieldName}, {DD MMM}, {area} га" (when area > 0) * the decorative date chip and area pill are aria-hidden because their content is duplicated verbatim in aria-label * a token-driven :focus-visible ring (var(--brand), 2px, offset 2) lives in the CSS module, with .item:focus reset for mouse focus * inline cursor: pointer migrated into the CSS module so the focus-visible rule lives next to it (no runtime style override fight) Notes / scope ------------- There is no nested