feat(a11y): WCAG 2.2 accessibility fixes across four areas
- modal/_validateField: set aria-invalid on invalid inputs so screen readers announce field errors; login.js mirrors this for username/password fields - color pickers (notes, calendar): wrap swatches in role="radiogroup" with aria-labelledby, add aria-checked per swatch, localized aria-labels instead of hex values, roving tabindex with Arrow/Enter/Space keyboard navigation - nav badges: badge spans get aria-hidden="true"; nav link aria-label updated to include overdue count (tasks) or pending reminder count (reminders) - router: remove aria-live from <main> (caused full page re-reads on nav); add dedicated #route-announcer sr-only region with aria-live=polite + aria-atomic, announces page label 50ms after render completes Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -86,6 +86,8 @@ export async function render(container) {
|
||||
|
||||
usernameGroup.classList.toggle('form-group--error', !username);
|
||||
passwordGroup.classList.toggle('form-group--error', !password);
|
||||
usernameInput.setAttribute('aria-invalid', String(!username));
|
||||
passwordInput.setAttribute('aria-invalid', String(!password));
|
||||
|
||||
if (!username || !password) {
|
||||
if (!username) usernameInput.focus();
|
||||
@@ -117,11 +119,13 @@ export async function render(container) {
|
||||
}
|
||||
});
|
||||
|
||||
form.querySelector('#username').addEventListener('input', () => {
|
||||
form.querySelector('#username').closest('.form-group').classList.remove('form-group--error');
|
||||
form.querySelector('#username').addEventListener('input', (e) => {
|
||||
e.currentTarget.closest('.form-group').classList.remove('form-group--error');
|
||||
e.currentTarget.removeAttribute('aria-invalid');
|
||||
});
|
||||
form.querySelector('#password').addEventListener('input', () => {
|
||||
form.querySelector('#password').closest('.form-group').classList.remove('form-group--error');
|
||||
form.querySelector('#password').addEventListener('input', (e) => {
|
||||
e.currentTarget.closest('.form-group').classList.remove('form-group--error');
|
||||
e.currentTarget.removeAttribute('aria-invalid');
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user