Picker panel — accessibility
Keyboard
- Esc anywhere (captured on
document) closes the panel; the host returns focus to its input. - The panel itself has no focusable chrome; focus lands in the body (
autoFocusof Calendar or the time list). - Tab out of the body: the host's blur logic closes the panel (portalled panel is detected via
.dp-panel).
ARIA
role="dialog"witharia-labelfrom the host;aria-modal="true"only in the mobile sheet.- Desktop: not modal — the scrim intercepts pointer events but assistive technology can still reach the page.
- The drag handle is a CSS pseudo-element, not in the accessibility tree.
Focus
- No focus trap on desktop; the body's roving tabindex (grid) or listbox keeps arrow navigation inside.
- On mobile the sheet is
aria-modal, but there is still no programmatic trap — Esc and scrim close it. - Focus return is the host's job (
onClose); Time field's scrim close does not return focus.
Contrast
- Panel surface
--surface-100with border--border-strong(#dcdbdd on #fff = 1.35:1 light) — separation relies on--shadow-pop, not the border. - Mobile scrim
rgba(0,0,0,.32)dims the page; desktop scrim is transparent.
Known limits
- No focus trap; Tab can leave the panel on desktop (by design, the host closes it) and on mobile (gap).
- The panel closes when the anchor scrolls out of view without any announcement.
aria-modalon mobile without an actual trap is a mismatch for screen readers.- Positioning is
position: fixed; inside CSS-transformed ancestors the coordinates would be wrong (none in the app today).
Source: docs/date-time/picker-panel.a11y.md · GitLab