Skip to content

UX revamp for the listings map - #646

Open
noahbaxter wants to merge 23 commits into
perfectly-preserved-pie:masterfrom
noahbaxter:ux-revamp
Open

UX revamp for the listings map#646
noahbaxter wants to merge 23 commits into
perfectly-preserved-pie:masterfrom
noahbaxter:ux-revamp

Conversation

@noahbaxter

@noahbaxter noahbaxter commented Sep 6, 2026

Copy link
Copy Markdown

Hey there,

Came across this project a few days ago, super useful dataset but found it a bit frustrating to use so I took the liberty of revamping the UI/UX to feel more modern and snappy, reminiscent of sites like Zillow. Mobile could still use some TLC in a future pass but it gets the same improvements (minus the list view).

image

General

  • improved color palette and consistency across the site
  • proper light and dark mode theming across all UI components
  • general UX improvements

Map

  • map now clusters less often to make it easier to find individual pins
  • pins show price with color ranking from lowest to highest (in the visible section of the map)
  • removed gesture control overlay that folks probably dont use
  • hid overlays to focus on the core rental data; easy to reverse if this isnt desired but imo it muddies the visual presentation
  • new default map design for clarity in both light and dark modes
  • if no images exist, now will pull google street view for the address instead of nothing
  • builds a url to the site if MLS ID exists, this can easily be improved but it's a start to make it more useful for applying to online rentals

Filters

  • removed filtering options to prevent a user filtering out too many listings based on incomplete data; note that most data is still maintained in the map pins
  • date picker removed; imo 4 buttons for 2weeks, 1month, 3month, all is granular enough and giving full date picker guarantees users may end up without results and not understand why
  • reordered and redesigned all UI components for a tighter vertical slate of options
  • new distribution graph style slider for rent filtering
  • dropdowns are replaced with more coarse search options; this guides users towards filtering options that dont overly restrict based on what data is available, for example apartment replaces condos/lofts/room/co-op since ultimately the important detail is whether you live separated from others by open space, or through walls/ceilings/floors

List

  • new list option in desktop that lets you sort whats visible by your preferred sort type
  • when open, shows apartment details in a consistent place

Lmk if you have any questions or concerns.

Clustering kicked in while the map still had room to draw every pin, so a
normal neighbourhood view was bubbles rather than listings and finding one
meant zooming past where you wanted to be.
…photo

Ordered by what a renter rules a listing out on: the photo, the address, the
four figures, then the qualifying facts. The old popup printed every field it
knew about, so a column of "Unknown" buried the handful that were filled in.

About one listing in eight arrives with no photo. Those opened with an empty
gap that read as a broken image, so the slot shows the street instead.
Seventeen filter sections in boxed accordions left almost no room for the map
they filter. Flat list, hairlines instead of boxes, and the accent kept for
interactive state.
Identical dots make you open a popup to learn the one number you compare
listings on first. The pin carries the price and its colour places it in the
range, so a whole neighbourhood reads without a click.
A map alone is not scannable: comparing ten listings meant opening ten popups
and remembering them. The panel reads the rendered markers rather than the
Leaflet map object, which dash-leaflet never exposes, so the list and the pins
cannot disagree about what is in view.
These carried open-ended endpoints meaning "no limit", which is a real answer
for rent but not for square footage, where the top of the data is the top.
…e map

The link opened the same pano already embedded above it. Searching the address
lands on the place with directions and satellite instead.

The layers control sat permanently expanded over the top-left corner. It stays
mounted, with its callbacks, but off the map.
The count reported everything that passed the filters, including listings
nowhere near the screen, so it never matched what you could see.
The map reopened on the whole of LA County every time, discarding the pan and
zoom someone had just spent time on. Rent and For sale keep separate positions
because they are separate searches. Stored in localStorage.
Dash puts `transition: all` on the handle carrier and the filled range, so both
trailed the pointer during a drag, and it rings a handle that still holds focus
after a click. Neither is a state these sliders should show.

Also drops the listed-date range picker for the preset buttons above it. It was
the only control here nobody used at more than one setting.
Two number fields say nothing about where the listings actually are, so people
picked a range and found it empty. The graph shows the shape of the market
behind the handles, with the excluded shoulders dimmed.
An absolute ramp paints an expensive neighbourhood one colour and a cheap one
another, repeating what the address already said. Ranking against what is on
screen answers "cheap for what I am looking at" instead.
Small button rows had grown three shapes for the same job. Two builders now,
and the shape carries the meaning: a joined strip picks one, separate pills
pick any.

Pets and rent control become chips because both are really three-way questions
with a large unknown bucket, which a dropdown cannot express.
Leaflet pans the map when a popup does not fit, which takes the listings you
were comparing off screen. The popup finds the room itself instead.

Opening a clustered listing used to fly the map to it, costing the same view.
The tokens were defined for dark only, so light mode ran on whatever fallback
each rule happened to hardcode. That is how one control came out amber in one
theme and teal in the other.
The pins were too small to read a price on at a glance, and nothing said which
row the open popup belonged to.
Leaflet hardcodes the attribution white with dark text, which at night is a lit
strip in the corner of a dark map. Esri's terms want the credit kept, so it
takes the theme rather than being switched off.
A popup covers the pins the listing is being compared against, and with the
column up there is already a panel the width of a popup on screen. Same
renderer either way, so the two cannot drift.
The caption cost a row of height on the one listing in eight with no photo, and
a pano is visibly a street without being told so.

The embed takes no parameter to hide its controls, footer or navigation arrows
and cannot be styled across origins, so the frame is overhung past all four
edges and clipped back to the tile.
Which listing is open is a fact about the session, not about which panel is up,
so collapsing the column hands it to a popup on its pin and reopening takes it
back.

The row link needs listing_url on the map payload, about 250 KB gzipped. That
is what lets a row know it has no page to link to, which one in eight does not.
The MLS lookup URL is a guess and the popup already labels it as one.
@noahbaxter
noahbaxter marked this pull request as ready for review September 6, 2026 21:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant