# Editable targets
> Mix keyboard navigation with text fields, selects and sliders. Editable controls keep their native keys while the arrows move between the rows around them.
Movement bindings leave editable fields their native keys. Arrows can move a
caret or change a value, and letter bindings do not capture typed text. Modified
focus shortcuts are the [exception](#the-one-exception).
Arrow between the demo's rows, then Tab into a control. Text fields keep their
editing behavior, _Font size_ keeps its slider keys, and ↓ on the checkbox
moves to the next row. The readout shows navigation in indigo and keys left to
the browser in gray.
```html
```
```ts
import { keyRove } from '@mixedrays/keyrove';
document
.querySelector('#settings')
.addEventListener('keydown', (e) => keyRove(e));
```
No extra configuration is needed. A row remains the current item while focus
is inside one of its controls. When navigation resumes, it starts from that row.
## Which elements are editable
The test is on the event's target and its ancestors:
- a `textarea` or a `select`;
- a `[contenteditable]` element and everything inside it, except a
`contenteditable="false"` island, which opts back out;
- an `input` of any type other than `button`, `checkbox`, `color`, `file`,
`image`, `reset` and `submit`.
The input list is drawn by what the bound keys do natively. Arrows move a
caret in a text field, step a `number`, slide a `range` and move between
`radio` buttons; on a checkbox or a button they do nothing, so navigating from
one takes nothing away. That is why ↓ on
_Email notifications_ moves rows while ↓ on _Font size_
nudges the slider.
## By target, not by key
The target determines whether movement keys are handled. In a text field,
`ctrl+ArrowRight` still moves by word and `KeyJ` still types "j", even when
those combos are bound to navigation. `keyRove` returns `null`, so any handler
chained after it also receives the event.
## The one exception
A [focus key](/docs/examples/focus-keys) with Ctrl, Alt or Meta can move focus
from an editable field. Bare keys and Shift-only combinations remain available
for typing. Choose shortcuts carefully: some modifiers also produce text,
including AltGr reported as Ctrl+Alt.
[Typeahead](/docs/examples/typeahead) never captures typing inside a field.
## While an input method composes
While `isComposing` is true, keyrove leaves every key to the input method,
including modified focus shortcuts. This lets users navigate candidates and
finish entering text.
## Rows as tab stops
Each row here carries `tabindex="0"` so it can be focused apart from its
control, which is what lets a row be the position before
Tab reaches the control inside. It also doubles the tab
stops. Put [roving tabindex](/docs/examples/roving-tabindex) on the rows and
the list costs one stop, with the controls keeping theirs. Or make the controls
the items, ``, and the rule reads the
same way round: the checkboxes navigate, the text fields do not.