Keyboard map

June 9, 2026 · View on GitHub

The keyboard contract for every interactive Kanso component, in one place. Sourced from each component's docs/components/<name>.md accessibility section and its spec. Where a component leans on a native element (<button>, <input>, native radio group), the browser provides the behavior and it's marked native.

Conventions: Tab / Shift+Tab move between focusable elements everywhere and are omitted per-row unless a component does something special (focus trap, roving tabindex).

Form controls

ComponentKeys
buttonEnter / Space activate (native).
checkboxSpace toggles (native).
radio / radio-groupArrow keys move selection within the group; Space activates (native radio-group roving).
toggleSpace toggles (native role="switch" checkbox).
segmented-controlTab enters onto the selected segment; Arrow Left / Arrow Right cycle enabled segments (wraps); Home / End jump to first / last; Enter / Space activate. Disabled segments are skipped.
selectSpace / Enter open the panel; Escape closes (native <select> arrow behavior inside).
comboboxType to filter; Arrow Up / Arrow Down move the highlight; Home / End jump to first / last; Enter picks the highlighted option; Escape closes and clears the query; Backspace on an empty query (multi mode) removes the last tag. aria-activedescendant tracks the highlight.
input / textareaAll native text-editing keys.
number-stepperType digits (non-numeric stripped); Enter or blur clamps to [min, max] and commits; the −/+ buttons activate with Enter / Space.
sliderArrow keys step by step; Shift+Arrow and PageUp / PageDown step by 10×step10 \times \text{step}; Home / End jump to min / max (thumb-focused).
form-fieldNone directly — focus and keys belong to the wrapped control.
file-uploadDrop zone is role="button": Enter / Space open the file browser.
rich-text-editorToolbar buttons are native <button>s (Enter / Space). The editing surface is a TipTap contenteditable, so standard rich-text shortcuts apply natively — mod+B / mod+I / mod+U (bold / italic / underline), etc. The link bar: Enter applies, Escape closes it.

Disclosure & navigation

ComponentKeys
accordionTrigger is a real <button>: Enter / Space toggle. Focus stays on the toggled trigger in mode="single".
tabsRoving tabindex across the strip: Arrow Left / Arrow Right move between tabs; Enter / Space activate.
treeRoving tabindex over visible nodes: Arrow Up / Arrow Down move; Arrow Right / Arrow Left expand / collapse; Enter / Space select; Space toggles the checkbox in showCheckboxes mode.
nav-item<button>-based: Enter / Space activate.
breadcrumbsCrumbs are native <a> / <button>; current crumb is an inert <span aria-current="page">.
paginationPage cells and prev/next are native <button>s (Enter / Space).
notification-itemRow is focusable (tabindex="0"): Enter / Space activate (emits click$).
cardOnly when [clickable]: host is role="button" with tabindex="0"Enter / Space activate (emit cardClick). Plain cards are inert containers.
theme-togglesegmented variant is a role="radiogroup" (Arrow keys move + select, like radio-group); dropdown variant opens a role="listbox" (Arrow keys navigate, Enter selects, Escape closes); icon variant is a single <button> toggle.

Overlays

ComponentKeys
dialogFocus is trapped (Tab cycles within the panel); Escape closes (when enabled); focus is restored to the opener on close.
drawerEscape closes (when enabled); backdrop click closes.
popoverEscape dismisses; outside click and the built-in close button also dismiss.
tooltipTab onto the trigger shows it after the delay; Escape dismisses immediately without moving focus off the trigger.
dropdown-menuArrow Down / Arrow Up rove focus through enabled items (wraps; section labels, dividers, and disabled items are skipped); Home / End jump to first / last; Enter / Space activate; Escape closes; Tab also works and cycles Search → body → footer when present.
command-palettemod+K opens (configurable); Arrow Up / Arrow Down navigate; Home / End jump; Enter runs the highlighted item; Escape closes. Disabled items are skipped.
datepickerDay cells are <button>s: Tab / Shift+Tab move between them; Escape closes the panel.
timepickerColumn options are buttons; Escape cancels (discards the draft and closes).

Data

ComponentKeys
tableSortable headers are buttons (Enter / Space to sort, aria-sort reflects state); row/select-all checkboxes use Space.
virtual-listThe scroll viewport is focusable and scrolls with the usual Arrow / PageUp / PageDown / Home / End keys; row interactivity is whatever your row template provides.

Non-interactive

These render no focusable interaction of their own and have no keyboard map: icon, divider, badge, avatar / avatar-group, skeleton, alert (aside from its optional close button), empty-state, progress, tooltip body, and the layout patterns container / grid / row / stack / banner / page-error / stat-card. Their close/action buttons, where present, are native <button>s.


Maintenance: when a component gains or changes a keyboard behavior, update its row here and the accessibility section of its component doc in the same PR. The per-component docs remain the source of truth; this page is the cross-component index.