Drawer — accessibility

Keyboard

  • The drawer is part of the page: Tab reaches the head controls, then the body, in reading order. There is no footer since 14 Sep 2026.
  • Previous / next / close / the record menu are ordinary buttons. Open ↗ is a real <a href>: Enter or a plain click opens the detail in the same tab with the listing context, while ⌘/Ctrl-click, middle click and the context menu still open a new tab, because the in-app open only intercepts an unmodified primary click.
  • Escape is handled by the app shell's chain ("drawer full → drawer → AI panel"), not by the drawer itself — which is why a modeless dialog above it must not swallow the key.
  • There is no focus trap, and none is wanted: the listing next to the drawer stays reachable.

ARIA

  • Panel: <aside aria-label="Náhled — {name}">; no role="dialog" and no aria-modal — the drawer does not block the page.
  • Loading state adds aria-busy="true"; the failure state changes the label to Náhled — chyba.
  • Rows are text pairs (.k / .v), not a definition list; the key is read before the value because of the DOM order, not because of a role.
  • Icon controls carry title (and the close control an accessible name through it); the avatar is decorative next to the name.
  • Masked values are plain text (+420 6•• ••• •••) — a screen reader reads the mask, which is intended: the value genuinely is not available.

Focus

  • Foundation ring from ds.css on the head controls and the open link.
  • .pdr-ico:disabled dims the control (previous / next at the ends of the list) and takes it out of the tab order.
  • Opening the drawer does not move focus; the row in the listing keeps it, so arrow-key stepping through rows keeps working.

Contrast

Computed from packages/ui/src/tokens/tokens.css:

  • Record name .pdr-top-name --ink-900 on --surface-100 = 17.59:1 light, 14.53:1 dark.
  • Row key .k --fg-muted on --surface-100 = 2.85:1 light, 3.63:1 dark — below AA for text; the value .v carries the meaning at --ink-900.
  • Section title .pdr-sec-t uses the section token; on --surface-100 it is ink, well above AA.
  • Icon controls --fg-muted = 2.85:1 light — below the 3:1 non-text minimum; hover raises it.
  • Failure state text --fg-muted with the heading in --fg (17.59:1).
  • Focus ring --accent on --surface-100 = 4.44:1 light, 3.83:1 dark.

Known limits

  • Row keys and icon controls sit at 2.85:1 in light theme.
  • Opening, closing and stepping to the next record are silent for assistive technology — no live region announces that the drawer now shows a different record.
  • The drawer has no keyboard shortcut of its own; it is reached by Tab from the listing row.

Source: docs/dialog/record-drawer.a11y.md · GitLab