A wide table cannot be scrolled from the keyboard, the current shape is a disabled button, and the failure alert can sit over the foot of the page #275
Labels
No labels
accessibility
authentication
breaking change
bug
documentation
enhancement
interface
internationalisation
observability
security
tier
1
tier
2
tier
3
tier/4
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Postulo/postulo#275
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
From an accessibility read of the templates and script on 2026-09-18. Everything here is keyboard reach; axe cannot see any of it, and
tests/e2e/test_keyboard_and_focus.pydoes not look for it.Twenty scroll boxes, none focusable
.scroll-xisoverflow-x: auto(assets/css/app.css:413-415), used in nineteen templates: every list and table page, the board, the calendar, the report, the export and import pages, the server tables, two dashboard widgets and the sidebar's narrow-screen strip. None of the boxes carriestabindex. Once a table overflows, which ten chosen columns do at 1280 pixels on any laptop, the columns off the edge can only be reached by tabbing to a link that happens to be in them; a plain-text cell with no link never comes into view. Chromium 130+ makes a scroller keyboard-focusable only when it holds no focusable child, so a table full of links is exactly the case the browser does not rescue. SC 2.1.1 (keyboard, A). The accessibility page promises "only a data table scrolls across, in its own box", which is true and is the problem.Fix:
tabindex="0",role="region"and anaria-labelnaming the table on the box, in one shared partial rather than nineteen copies. Check: at 1280 with ten columns chosen, Tab to the box, press ArrowRight, assertscrollLeftmoved.The table-or-board switcher marks the current choice with
disabledapplications/application_list.html:90-91(#102): the current shape's button isaria-current="true" disabled, so it leaves the tab order and is drawn at 50% (app.css:225). It reads as unavailable; screen readers hear "current" and "dimmed" together, and the group has one reachable button. Fix: keep it enabled witharia-pressed="true"and a solid style, oraria-disabled="true"without the opacity.test_keyboard_and_focus: Tab reaches both.The failure alert has no dismiss control and stays until the next successful request
base.html:74-76renders therole="alert"region the script fills on a failed request;.page-alertisfixed inset-x-4 bottom-4 z-50(app.css:755-758) and is cleared only by a later successful request (static/js/app.js:130-134). No close button, no Escape. At 200-400% zoom on a short viewport it and the sticky header together take a large share of the screen, and a focused pagination link at the foot of a long table can sit under it: SC 2.4.11 (focus not obscured, AA). Fix: a close button and Escape,scroll-padding-bottommatching its height, and keep the words in the live region so the announcement is not lost.The column-resize handle is invisible until hovered
app.css:382-387(bg-transparent hover:bg-brand-500/40), created byapp.js:1465-1468as a properrole="separator"with a value and arrow keys (#136); the keyboard half is done well. Pointer users who do not hover, touch users and keyboard users get no cue that a splitter exists, and the hover colour is discarded in forced colours. Fix: a resting 1pxink-300line inside the 24px target, and aButtonTextinline-end border under forced colours.