- New molecule MapProviderDrawer lifts the mobile-map bottom drawer out
of ProvidersStep (~120 lines): Paper + close-X header + single-pin
ProviderCard content / cluster-list content + slide-up animation.
Props: `active: ProviderMapActiveState | null`, `onClose`,
`onSelectProvider`, `onDrillIntoProvider`. Three Storybook states
(SingleProvider, Cluster, ClusterPair, Closed) so the drawer can be
iterated without a live map. ProvidersStep now consumes it as a
single line wired to mapRef.clearActive + mapRef.drillIntoProvider.
- Shared visual tokens for the control cluster (Search, Filters, Sort by,
List/Map toggle) factored into a CONTROL_CHROME constant and three
typed sx objects (controlButtonSx, controlToggleSx, controlInputSx,
filterTriggerSx) so all four controls share the same outline, radius,
fill, and shadow across mobile list, mobile map, and desktop. Desktop
map-panel floating toggle also re-threaded through controlToggleSx.
- Mobile list control order now matches mobile map: Sort by is grouped
left next to Filters (not pushed right with a ml:auto wrapper), and
the List/Map toggle is right-pinned via ml:auto on xs. Desktop keeps
Sort pushed right (no toggle rendered on desktop in this slot).
- Fix: the magnifying-glass commit button was drifting 19–30px left as
the input filled with chips / draft text. Root cause: overriding
`InputProps.endAdornment` on Autocomplete bypasses MUI's
`.MuiAutocomplete-endAdornment` absolute positioning, leaving our
`.MuiInputAdornment-positionEnd` as `position: static` in flex flow.
controlInputSx now re-absolutely-anchors the end adornment at the
right edge and reserves `pr: 5` so input content can't slide under it.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>