Tour Dash
Report · 4 September 2026

Find Opportunities Redesign

The board an agent opens every morning was a tall stack: a map that filled the first screen, the jobs starting below the fold, and eleven amber apply buttons in a row. It is now a list beside a map that stays put while you scroll, with one filter row, cards you can read down a column, a sort, and a map and list that point at each other. The details dialog that opens from a card was rebuilt in the same language. Same data layer, same tokens, nothing renamed.

Scope The board and its details dialog, both account types Status Committed to main as 69cfe96 and deployed to tour-dash.pages.dev on 2026-09-04
01

What was wrong with it

The page had every piece it needed and put them in the wrong order. Nothing here is a bug; it is a layout that made the person do the work the layout should have done.

The previous Find Opportunities page at desktop width: a Filters heading over a Location Filter card with a ZIP field, radius dropdown and Search area button, a row of nine service chips, then an Opportunity map filling the rest of the screen. No job cards are visible.
Before. The first screen was pins with nothing to read. Every job card sat below this map.
02

What it is now

A list-detail board. The list scrolls on the left, the map stays pinned on the right at full viewport height, and the two describe the same set of jobs.

The redesigned page at desktop width in dark mode: title, one filter row with the ZIP and radius control beside the service chips, a heading reading 11 opportunities within 5 mi of 07078 with a Soonest sort, four job cards down the left with pay and date on the right edge of each, and a map on the right showing the search radius and eleven pins with a legend overlay.
After, first screen. Four jobs are readable before anyone scrolls, and the map shows where you looked.
The page scrolled down: the list has moved but the map is still fully in view on the right. The cursor rests on the CO packet filing card and the matching green pin on the map is drawn larger than the others.
Scrolled. The map stays put; the card under the cursor lights its pin.
After clicking a pin: the Appraisal access card at the top of the list has an amber border, and a popup on the map shows the job title, address, price and time.
A clicked pin picks its card and scrolls it into view.
Keyboard focus on the first card: an amber focus ring surrounds the whole card, and its pin on the map is enlarged.
One tab stop per job. The title is the control, stretched over the card, and focus lights the pin too.
A search for zzzz: the heading reads 0 opportunities for zzzz, the list shows a Nothing matches card with a Clear filters button, and the map on the right still shows the search radius around 07078.
A miss keeps the map. The radius is still drawn, so "where did you look" is answered.
The previous page on a phone: title, Filters heading, Location Filter card with three stacked controls, nine chips, a small map, then the start of a long list of cards each with a full-width amber Apply now button.
Before, on a phone.
The redesigned page on a phone: title, the location control and chips, the heading, a List and Map toggle beside the sort, and compact cards with pay and date on the right.
After. The map is a toggle away rather than a screen you scroll past.
The board as a vendor, a home stager: the heading reads 1 job within 25 mi of 07901, there are no service chips, and the single staging card offers a Send a quote button.
The vendor side, seen as the demo's home stager. Their own trade only, their own service radius, and a quote instead of an application on quote-first work.
03

The details dialog

Opening a card used to land on a dialog from a different app: icon rows in two loose columns, a lone "$ 85" with a dollar icon, a title-cased slug for the service, and a grey profile box with five stars. It now reads in the same order as the card.

The details dialog in light mode: type mark and MLS board on the top line, the title, the address with distance, then a bordered strip reading $85 Pay, Sat Sep 5 10:30 When, 60 min Duration, Bluestone Property Group Client. Below, two photos, the description, a one-line poster with a View profile button, and Close and Apply now buttons at the bottom right.
Type, title, address, then the four facts a person decides on as one strip.
The same dialog in dark mode, with identical structure on the dark card surface.
Dark. Amber appears exactly once, on the apply button, which is where the decision about money is made.
The dialog on a phone: the title wraps to two lines, the facts strip is a two-by-two grid, and the first photo fills the width with the second peeking in from the right.
On a phone, top.
The same dialog scrolled to the bottom: description, the one-line poster with View profile, and Close and Apply now inside the dialog's edge.
On a phone, bottom. The buttons sit inside the dialog, which was not true an hour earlier.

That last caption covers a real bug the dialog work turned up. On a 390px phone the board was being laid out at 442px, and every fixed dialog inherited the extra width, so its right edge ran off the screen. Mobile Chrome widens the layout viewport to fit anything that overflows, and two things did: the demo banner's fixed-width account switcher, and the card list itself, whose grid had no named columns. An implicit auto track sizes to the cards' max-content, so it asked for 442px and got it. Both grids on the page now declare grid-cols-1, the banner's switcher shrinks below 640px, and the phone lays out at 390. The earlier phone screenshots in this report were retaken after the fix.

04

Calls worth knowing about

Things that were decided rather than discovered, so nobody re-litigates them by accident.

05

How it was verified

The Chrome extension was not connected, so the checks ran through headless Chrome over the DevTools protocol against /demo, which makes no Supabase requests. Real mouse and keyboard input, not synthetic events, for anything with a state.

CheckResult
Typecheck and buildtsc --noEmit clean; npm run build passes.
Widths390, 768, 1024, 1440 and 1920, light and dark. No horizontal scroll. The list is two columns at 768 and one beside the map from 1024.
Sticky mapAfter scrolling 700px the map's top edge sits at 80px, under the header.
Hover and focus to pinHovering the fourth card marks exactly one pin active at scale(1.5); leaving clears it. Focusing a title does the same.
Pin to cardClicking a pin selects its card, scrolls it into view and opens the popup.
Sort and chipsHighest pay orders $275, $220, $150. One chip narrows the heading to "3 opportunities" and the map to three pins.
DialogsCard opens the details dialog with "View profile", "Close", "Apply now" and a facts strip reading $85, Sat Sep 5 · 10:30, 60 min, Bluestone Property Group; the card's Apply opens "Apply for this job". Captured at 1440 in both themes and at 390.
Phone viewportLayout viewport probed with the DevTools protocol: 493px before, 442px after the banner fix, 390px after naming the grid columns. No horizontal scroll.
Empty state?q=zzzz shows the filter miss beside a map that still draws the radius.
Phone map toggleThe hidden map renders at 443 by 542 CSS pixels when shown; a pin opens the details dialog.
Theme toggleSwitching themes live keeps the radius circle. This found and fixed a race where the layers drawn after the map's first load were wiped by a duplicate style request.
Vendor viewAs the demo's home stager: "1 job within 25 mi of 07901", no chips, "Send a quote".
ConsoleNo errors or warnings across every scenario above.
06

What's next