fix(a11y): axe findings: dialog names, aria-pressed, labels, avatar alt, placeholder contrast (#278)
CI / Build & Quality Checks (pull_request) Successful in 1m47s
CI / Trigger Desktop Build (pull_request) Skipped
CI / Docker image build & smoke test (pull_request) Skipped
CI / Secret scan (gitleaks) (pull_request) Successful in 7s
CI / Playwright smoke (e2e) (pull_request) Successful in 12m18s
CI / Build & Quality Checks (pull_request) Successful in 1m47s
CI / Trigger Desktop Build (pull_request) Skipped
CI / Docker image build & smoke test (pull_request) Skipped
CI / Secret scan (gitleaks) (pull_request) Successful in 7s
CI / Playwright smoke (e2e) (pull_request) Successful in 12m18s
- Modal500 takes a label: Room/Space Settings ("<name> settings") and
Settings dialogs have accessible names.
- aria-selected on plain buttons (inbox filter chips, date/time picker
chips, verification/usage/notification menu items) -> aria-pressed; the
Permissions power chips open a menu -> aria-haspopup + aria-expanded.
- Labels tied to the room pack name input and the Export From/To dates.
- UserAvatar defaults to alt="" (decorative next to a name / in a
labelled button) unless a caller passes one.
- Composer placeholder: Slate's inline opacity 0.333 overrode the #222
AA-contrast class (2.66:1); it is dropped so the class (0.75) applies.
- e2e/a11y.spec.ts also audits Room Settings → Permissions, Emojis &
Stickers and Export, checks the dialog name, and audits the inbox.
Fixes #278
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
7ad2a94e2e
commit
885ec7c82e
+19
-1
@@ -118,8 +118,26 @@ test.describe('accessibility', () => {
|
||||
test('room settings', async ({ page }) => {
|
||||
await page.getByRole('button', { name: 'More Options' }).first().click();
|
||||
await page.getByText('Room Settings', { exact: true }).click();
|
||||
await expect(page.getByRole('dialog').first()).toBeVisible();
|
||||
// [Gitea #278] The dialog has an accessible name.
|
||||
await expect(page.getByRole('dialog', { name: 'A11y Room settings' })).toBeVisible();
|
||||
await auditPage(page, 'room settings');
|
||||
// [Gitea #278] aria-selected on the power chips, unlabelled pack name and
|
||||
// export date inputs were only on these pages.
|
||||
// One page at a time, in order.
|
||||
for (const name of ['Permissions', 'Emojis & Stickers', 'Export']) {
|
||||
// eslint-disable-next-line no-await-in-loop
|
||||
await page.getByRole('dialog').getByText(name, { exact: true }).first().click();
|
||||
// eslint-disable-next-line no-await-in-loop
|
||||
await page.waitForTimeout(1000);
|
||||
// eslint-disable-next-line no-await-in-loop
|
||||
await auditPage(page, `room settings: ${name}`);
|
||||
}
|
||||
});
|
||||
|
||||
test('inbox invites', async ({ page }) => {
|
||||
await page.goto('/inbox/invites/');
|
||||
await expect(page.getByRole('button', { name: /Known|Unknown|Spam/ }).first()).toBeVisible();
|
||||
await auditPage(page, 'inbox invites');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user