The search dropdown toggled blindly before the async call settled
and only handled success, so API failures left a blank dropdown
that looked like search did nothing.
- Replace toggle with explicit open/close, Escape and outside-click
to dismiss, and disabled search button while a request is in flight
- Add isSearching/searchError/hasSearched states: loading text,
failure panel with message plus Retry, empty prompt, and a
no-results message for the searched term
- Guard null coverImage/title with a romaji/native fallback and a
keyed each block; ignore stale late responses via request ids
- Tolerate slow AniList days: slow notice at 8s, 30s Promise.race
fail-safe (backend allows 20s), and an immediate offline message
via navigator.onLine so the UI never spins indefinitely