Skip to content

fix(portal): RGAA accessibility fixes from the Open Data EDF audit - #113

Merged
BatLeDev merged 8 commits into
masterfrom
fix-a11y-audit-edf
Aug 14, 2026
Merged

fix(portal): RGAA accessibility fixes from the Open Data EDF audit#113
BatLeDev merged 8 commits into
masterfrom
fix-a11y-audit-edf

Conversation

@BatLeDev

Copy link
Copy Markdown
Member

Accessibility fixes for the portal, from the RGAA re-audit of the Open Data EDF portal. Verified on the pre-production sample (W3C validation + keyboard/screen-reader checks).

  • decorative images and icons kept out of the accessibility tree: aria-hidden on the error and social SVGs, alt="" on the error images, and a Vuetify patch so a decorative VImg (alt="") no longer emits the empty aria-label W3C rejects (RGAA 1.2 / 8.2, upstream [Bug Report][4.1.9] VImg with an empty alt renders aria-label="" on a div with no role vuetifyjs/vuetify#23111 / #23112)
  • personal space made keyboard- and screen-reader-friendly: the side navigation is a real <ul>/<li> list with each link a tab stop (no more tabindex="-2"), skip links added to its layout, and a visually-hidden <h1> on the pages that only embed an iframe (RGAA 9.1 / 9.3 / 12.7)
  • preview dialogs get an accessible name and their close button a title (RGAA 7.1)
  • the contact form submit button is no longer readonly while invalid: it stays reachable and validates on submit, revealing the invalid fields (RGAA 7.1, DSFR guidance — a submit button must not be disabled)
  • the full-screen app bar hides its logo between the sm and md breakpoints, where a wide logo pushed the end of the breadcrumb trail off-screen with no way to scroll to it (RGAA 10.11 / 10.12)
  • long navigation labels wrap instead of truncating under WCAG text-spacing (RGAA 10.12)
  • @data-fair/lib-vuetify 2.4.2 + lib-utils 1.12.2: drops the empty aria-label on the catalogue search combobox and the <div>-inside-<span> of the shared owner-avatar, clearing the last W3C errors of the sample

Why: close the code-side findings of the Open Data EDF RGAA audit, so the remaining non-conformities are configuration-only (tracked separately).

Heads-up:

  • layout-personal-navigation.vue is fully restructured to list semantics — worth an eyeball on the personal drawer; verified live on the EDF pre-production and local dev.
  • the VImg patch and the lib-vuetify bump are global — they affect every VImg / owner-avatar in the portal, not only the audited pages.
  • no automated a11y test added here; verified by W3C validation + manual keyboard/screen-reader checks.

The dialogs opened from a dataset or a visualisation page (download,
field description, embed code, notifications) had no accessible name:
neither aria-label nor aria-labelledby, and their visible title was not
linked. Their close button had no label at all. A screen reader
announced "dialog" then "button", nothing more.

The dialog now takes its name from the title it already receives, and
the close button gets one. RGAA 7.1.
…rumbs

In the full screen layout the logo shares a fixed height bar with the
breadcrumbs. A wide logo — 300px on the portal this was measured on —
leaves too little room between the sm and md breakpoints: the end of the
trail, including the current page, goes off the window with no way to
scroll to it. It also shows up at 200% zoom, which lands in that same
range of effective widths.

The logo is hidden in that range only. Below sm the breadcrumbs are
already hidden, so it gets the bar back. RGAA 10.11 and 10.12.
The personal space pages that only embed a frame had no heading at all:
the embedded document starts its own titles at h2, which is right since
it is always framed, but nothing carried the h1 of the page. An audit
tool looking at the host document sees a page with no heading.

They now carry a visually hidden h1, like the full screen views do.
The two pages that already had a visible h1 are untouched. RGAA 9.1.
…sibility tree

The error page illustrations and the social icons are decoration: the
inline svg ones are now aria-hidden, and the configured error image gets
an empty alt, which it lacked entirely — an img with no alt attribute at
all in the rendered document. RGAA 1.1 and 1.2.
… images

VImg mirrors its alt onto the root element next to a role guarded on the
same value: with alt="" — the way a decorative image is declared — the
root gets an empty aria-label and no role, which W3C rejects. One error
per decorative image, twenty of them on a catalogue page.

The patch guards aria-label like role already is. Reported upstream as
vuetifyjs/vuetify#23111, fix proposed in vuetifyjs/vuetify#23112.
…skip links

The personal-space drawer used a bare v-list, so it rendered as
div[role=list] > a[role=link] with tabindex=-2 (RGAA 9.3/12.8) and the
gabarit carried no skip links (12.7). Reuse the nav-drawer treatment:
tag=ul + role removed, each link in an <li> with tabindex=0 and a
text-wrap title, and add the skip-links block (content + sidebar
navigation). The long 'Gestion de l'organisation' label now uses the
default slot instead of the title prop so it wraps instead of truncating
under WCAG text spacing (10.12).
… submit

The send button was readonly while the form was invalid, so it got
tabindex=-1 and was unreachable and unactivable by keyboard, with no
disabled state announced (RGAA 7.1). Per the DSFR, a form submit button
must not be disabled: keep it active and validate on submit via the
native VForm API, which reveals every invalid field so the user can
discover what is missing.
@github-actions github-actions Bot added the fix label Aug 14, 2026
@BatLeDev
BatLeDev merged commit 47f87d6 into master Aug 14, 2026
4 checks passed
@BatLeDev
BatLeDev deleted the fix-a11y-audit-edf branch August 14, 2026 09:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant