feat(a11y): Implement ARIA accessibility sweep and keyboard navigation

- Added visually hidden labels, IDs, and names to form inputs across all key components and pages (modals, directories, chatbots)
- Added tabIndex and onKeyDown handlers to clickable table rows in OwnerProjectDetail for keyboard accessibility
- Validated existing ARIA roles and Escape key bindings on modal components
This commit is contained in:
Satyam
2026-02-22 03:15:21 +05:30
parent b6f899afd2
commit 5fef584d7d
15 changed files with 123 additions and 55 deletions
+9
View File
@@ -230,14 +230,20 @@ const AdminSchedule = () => {
</button>
<div className="border-t border-zinc-200 dark:border-zinc-700/50 p-3">
<p className="text-xs font-semibold text-zinc-500 dark:text-zinc-400 mb-2">Custom Range</p>
<label htmlFor="custom-date-start" className="sr-only">Start Date</label>
<input
id="custom-date-start"
name="custom-date-start"
type="date"
value={customDateRange.start}
onChange={(e) => setCustomDateRange(prev => ({ ...prev, start: e.target.value }))}
className="w-full px-2 py-1 text-xs bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-700 rounded mb-2 text-zinc-900 dark:text-white"
placeholder="Start date"
/>
<label htmlFor="custom-date-end" className="sr-only">End Date</label>
<input
id="custom-date-end"
name="custom-date-end"
type="date"
value={customDateRange.end}
onChange={(e) => setCustomDateRange(prev => ({ ...prev, end: e.target.value }))}
@@ -272,9 +278,12 @@ const AdminSchedule = () => {
{availableStatuses.map(status => (
<label
key={status}
htmlFor={`status-filter-${status.replace(/\s+/g, '-')}`}
className="flex items-center gap-2 px-4 py-2 text-sm text-zinc-700 dark:text-zinc-200 hover:bg-zinc-100 dark:hover:bg-zinc-800 cursor-pointer transition-colors"
>
<input
id={`status-filter-${status.replace(/\s+/g, '-')}`}
name={`status-filter-${status.replace(/\s+/g, '-')}`}
type="checkbox"
checked={statusFilter.includes(status)}
onChange={() => toggleStatusFilter(status)}