…nding
Toolbox treated an in-flight onSearch promise as a loading state and
ListView turned that into disabled on every row, so any consumer with an
async search saw the list dim and brighten on each pause in typing.
- Toolbox passes isLoading={awaitingChildren || loading} and routes
searchLoading to a new ListView searchPending prop
- ListView searchPending only sets aria-busy on the listbox and keeps the
skeleton-on-empty path; rows are never disabled by it
- SearchBox swaps the search icon for a same-sized Spinner while pending
- WithSlowSearch story with a 500ms onSearch for manual verification
The request-id guard in handleSearch already discards stale answers, so
disabling rows protected nothing. The panel-level loading prop and lazy
category resolution still disable rows as before.
Co-Authored-By: Claude Mythos 5.1 <noreply@anthropic.com>
Problem
Toolboxtreated an in-flightonSearchpromise as loading, andListViewdisabled every rowonSearchFix
Toolbox:isLoading={awaitingChildren || loading};searchLoadinggoes to a newListViewsearchPendingpropListView.searchPending: setsaria-busyon the listbox and keeps the skeleton-on-empty path; never disables rowsSearchBox: swaps the search icon for a same-sizedSpinnerwhile pending, so nothing shiftsloadingprop and lazy category resolution (awaitingChildren) still disable rows exactly as beforetoolbox.search.pendingstring inen.jsononly; other locales to followTests
Toolbox,ListView,SearchBox: rows stay enabled and have noloadingclass during a pending search,aria-busyand spinner toggle, click during pending selects, stale answer ignored, skeletons replace a stale empty state,awaitingChildrenstill disablesloading/isLoadingtests unchangedManual check
🤖 Generated with Claude Code