Design responsive search suggestions with stale-response protection and a11y-first combobox behavior.
Quick take: Debounce outbound search and cancel in-flight requests. / Use ARIA combobox semantics with active-descendant navigation.
Production notes: Log stale-response drop rate as a quality signal. / Fallback to cached trending suggestions when search service is degraded.
TL;DR
Debounced queries plus in-flight cancellation and strict combobox semantics produce fast and reliable suggestions.
Steel thread
Type query, fetch top suggestions, navigate by keyboard, and select an option that updates route state.
C - Collect
- What is acceptable keystroke-to-suggestion latency?
- Should suggestions include mixed entity types (users, tags, docs)?
- Must offline or degraded mode show fallback recommendations?
C - Component structure
SearchBox manages input and active option index.
SuggestionList renders grouped results and highlight states.
SearchProvider coordinates cache and request cancellation.
D - Data modeling
- Cache entries keyed by normalized query.
- Result groups contain stable
optionId for keyboard navigation.
- Track
requestToken per query to ignore stale responses.
A - API design
GET /search/suggest?q=...&limit=...
- Optional
GET /search/trending for fallback.
- Return
requestId and source metadata for observability.
O - Optimization
- Debounce keystrokes (150-250ms) and cancel previous request.
- Preload likely next query prefixes from current response.
- Announce result count and active option in live region.
Pattern links
debounce-vs-throttle for request pacing and responsiveness.
optimistic-ui-rollback for resilient selection and fallback.
a11y-testing-strategy-dynamic-uis for robust combobox validation.
Failure modes
- Slow previous query response overrides newer, more relevant results.
- Empty suggestions due to backend timeout with no fallback messaging.
- Keyboard focus escapes listbox after rapid input changes.
Testing checklist
Testing + Accessibility Rubric
| Category | Level | Requirement | Done When |
|---|
| functional | unit | Debounce/cancel behavior avoids stale result rendering. | Typing burst tests prove stale response protection. |
| a11y | integration | Combobox roles, active descendant, and keyboard bindings are correct. | ARIA combobox checks pass in automated and manual tests. |
| a11y | e2e | Result count and active option are announced clearly. | Screen reader walkthrough validates interaction end-to-end. |
Explain it clearly
- Short version: debounce + cancel + stale response guard + combobox roles.
- Longer version: cache strategy, fallback contracts, and SR announcement detail.
Production hardening notes
- Monitor suggestion latency and stale-drop ratio per region.
- Auto-disable expensive ranking features during incident mode.