The problem
Changing one small value — a name, a status, a quantity — sometimes gets a whole navigation to a dedicated edit page for a change that takes one field and one second to type. That round trip costs the reader a page load out and a page load back for a change that didn’t need either. But inline editing isn’t free of cost either: it has to signal that a value is editable at all before anyone clicks it, it has to make committing and cancelling both obvious, and it has to say what happens to the value if the save fails while the reader has already moved on. The failure mode in each direction is different. Skip inline editing where it belongs and every trivial change becomes a small ceremony. Use it where it doesn’t belong — a change with side effects on other data, or one that genuinely needs its own validation and context — and the reader edits a field with no idea what else just changed, or hits a save failure with nowhere to see why.Inline, or a dedicated view?
When this applies
- The value is a single field, and changing it has no side effects on other data.
- The new value needs no validation beyond what a single Input or Select already checks.
- The reader benefits from staying on the page they’re already looking at.
When it doesn’t
Structure
Behavior
Constraints
Content
Accessibility
- Entering edit mode moves focus into the field automatically — the reader who clicked or keyboard-activated the value should not have to Tab into it separately.
- The commit and cancel controls are reachable by Tab, in addition to their Enter and Escape equivalents — a reader who cannot use keyboard shortcuts still needs a visible path to both.
- Each icon-only control’s accessible name states the action and the field it acts on (“Save campaign name,” not “Save”) when a page has more than one inline-editable field, so a screen-reader user moving between rows can tell them apart.
- A failed save is announced (a live region, or the error text’s own
aria-describedbyassociation to the field) — not only shown visually, per the same reasoning as Input’s error state.