Accessibility floor
The front-end mount components ship the following a11y primitives:
- All form controls have a
<label for="…">linked to their input id; required fields get a CSS-marked star via.pfm-field-required. - Form root carries
aria-busyduring submission. - Success banner uses
role="status"+aria-live="polite"and focuses itself on appearance so screen readers announce it. - Error banners use
role="alert"+aria-live="assertive". - Honeypot wrapper is
aria-hidden="true"+tabindex="-1"so it is invisible to assistive tech and unreachable by keyboard. - Action button surfaces
aria-busyduring invocation. - Logical CSS properties throughout (
margin-inline-start,inset-inline-start,border-inline-start) make RTL mirroring automatic; thefrontend-rtl.csscompanion is enqueued automatically whenis_rtl()is true.
Known gaps to add later: dialog-style confirmation modal for requires_confirmation actions (currently uses window.confirm which screen readers handle inconsistently); keyboard re-ordering on Kanban (not yet implemented in the front-end bundle).