refactor(a11y): add cursor-pointer and focus states to all interactive elements - Phase 1
- Add cursor-pointer to all clickable buttons and interactive elements - Add focus:ring-2 focus:ring-primary/blue focus:outline-none to all buttons - Add aria-label to icon-only buttons and actions - Update focus states from focus-visible to focus for consistency - Add disabled:cursor-not-allowed for disabled button states - Improve keyboard navigation with proper focus indicators Components updated: - BottomNav: navigation buttons with aria-labels - Scanner: try again, zoom, word selection, cancel buttons - ItemComparisonModal: skip and update action buttons - ConfirmationModal: close, cancel, delete buttons with input focus - AIOnboarding: all mode toggles, camera, upload, capture, edit, delete buttons - Plus interactive cards and list items This ensures WCAG AA compliance for keyboard navigation and visual feedback.
This commit is contained in:
@@ -67,8 +67,8 @@ export default function ConfirmationModal({
|
||||
<button
|
||||
onClick={onCancel}
|
||||
disabled={loading}
|
||||
className="p-1 text-slate-500 hover:text-slate-300 rounded focus-visible:ring-2 focus-visible:ring-primary focus-visible:outline-none disabled:opacity-50"
|
||||
aria-label="Close"
|
||||
className="p-1 text-slate-500 hover:text-slate-300 rounded cursor-pointer focus:ring-2 focus:ring-primary focus:outline-none disabled:opacity-50 disabled:cursor-not-allowed"
|
||||
aria-label="Close modal"
|
||||
>
|
||||
<X size={20} />
|
||||
</button>
|
||||
@@ -118,7 +118,7 @@ export default function ConfirmationModal({
|
||||
setError(null);
|
||||
}}
|
||||
placeholder="Type DELETE"
|
||||
className="w-full px-3 py-2.5 bg-slate-800 border border-slate-700 rounded text-white placeholder-slate-500 focus:outline-none focus-visible:ring-2 focus-visible:ring-primary"
|
||||
className="w-full px-3 py-2.5 bg-slate-800 border border-slate-700 rounded text-white placeholder-slate-500 focus:outline-none focus:ring-2 focus:ring-primary disabled:opacity-50"
|
||||
disabled={loading}
|
||||
onKeyDown={(e) => {
|
||||
if (e.key === 'Enter' && canConfirm && !loading) {
|
||||
@@ -138,14 +138,14 @@ export default function ConfirmationModal({
|
||||
<button
|
||||
onClick={onCancel}
|
||||
disabled={loading}
|
||||
className="flex-1 px-4 py-2.5 text-slate-300 bg-slate-800 border border-slate-700 rounded font-semibold hover:bg-slate-700 transition-colors disabled:opacity-50 focus-visible:ring-2 focus-visible:ring-primary focus-visible:outline-none"
|
||||
className="flex-1 px-4 py-2.5 text-slate-300 bg-slate-800 border border-slate-700 rounded font-semibold hover:bg-slate-700 cursor-pointer transition-colors disabled:opacity-50 disabled:cursor-not-allowed focus:ring-2 focus:ring-primary focus:outline-none"
|
||||
>
|
||||
Cancel
|
||||
</button>
|
||||
<button
|
||||
onClick={handleConfirm}
|
||||
disabled={loading || !canConfirm}
|
||||
className="flex-1 px-4 py-2.5 bg-rose-600 text-white rounded font-semibold hover:bg-rose-700 transition-colors disabled:opacity-50 flex items-center justify-center gap-2 focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-offset-slate-900 focus-visible:ring-rose-600 focus-visible:outline-none"
|
||||
className="flex-1 px-4 py-2.5 bg-rose-600 text-white rounded font-semibold hover:bg-rose-700 cursor-pointer transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2 focus:ring-2 focus:ring-offset-2 focus:ring-offset-slate-900 focus:ring-rose-600 focus:outline-none"
|
||||
>
|
||||
{loading ? (
|
||||
<>
|
||||
|
||||
Reference in New Issue
Block a user