The phone case sheet listed every case with no way to narrow it, while the
desktop toolbar combobox has filtered for a while. The sheet now carries a
search field that runs the same matcher (filterCasePickerOptions), so both
pickers answer a query identically: every term has to appear in the option's
searchText, which already carries the name, the rendered label, the path and
the remote/docker fields.
Details worth keeping:
- The filter resets on every open. The sheet is a one-shot picker, and a
leftover query would present a truncated list as the whole one.
- No autofocus. Focusing raises the keyboard over a sheet anchored to the
bottom of the screen, so the user asks for it.
- The sheet is a third position:fixed bottom-anchored surface, so it joins the
toolbar and the accessory bar in KeyboardHandler's keyboard lift. iOS does
not shrink the layout viewport, so an unlifted sheet would sit behind the
keyboard with its own search box out of sight. resetLayout() clears the
offset unscoped, or a sheet closed while the keyboard was up would slide in
already displaced next time.
- Enter takes a single remaining match and otherwise just dismisses the
keyboard; Escape drops the filter before it closes the sheet.
- No match renders an empty state rather than a blank sheet.
- The clear button needs an explicit [hidden] rule: the UA's display:none is
specificity (0,0,0) and loses to the button's own display:flex.
- The input drops the global input:focus-visible ring, which inside an already
bordered row drew a second border a few pixels in.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>