WCAG 2.1 AA — release blocker
Web (React DOM)
- Renders
<input type="search" role="search">inside theInputwrapper. - The magnifier icon is
aria-hidden— purely decorative. - The clear button is a real
<button>witharia-label="Clear search"(or your override viaclearLabel). - Focus ring uses the same
--color-ringtoken asInput— consistent across all form fields. - 48 px height when
size="lg"to exceed the touch-target rule.
React Native
- Renders
TextInputinside aView. accessibilityLabeldefaults to the placeholder so screen readers announce the field's purpose.- The clear button uses
accessibilityRole="button"withaccessibilityLabel={clearLabel}.
Keyboard
Tabmoves focus to the input.- Type to search.
Entertriggers the host form's submit if wrapped in a<form>. Tabagain moves focus to the clear button when value is non-empty;Enter/Spaceclears.
Reduced motion
No transitions on the field itself. Animation that depends on search results (popover open/close) lives in the host.
Color is never the only signal
- The clear-button affordance is icon + accessible name — colour is not the cue.
- Placeholder vs. value contrast is mediated by
text-muted-foregroundvstext-foreground— both verified ≥ 4.5:1.
Audit checklist
- Clear button has
aria-label/accessibilityLabel. -
Tabreaches the input then the clear button. - Placeholder colour ≥ 4.5:1.
- 48 px height on
lg.