Tour Dash
Report · 4 September 2026

My Opportunities Redesign

The page where an agent or a vendor checks what they have on: the jobs they've booked, the applications still waiting on an answer, and the work they've finished. It was three stat tiles that counted finished jobs as confirmed, a two-way toggle, and an undated pile of cards led by generated placeholder pictures. It is now a diary grouped by day with a summary rail beside it, a booked-job dialog rebuilt in the board's language, and loading, empty and error states that were designed rather than left over. Same data layer, same tokens, nothing renamed.

Scope The page, the booked-job dialog, and the applied state of the job dialog, both account types Status Committed to main as 439016b through 94475cd and deployed to tour-dash.pages.dev on 2026-09-04
01

What was wrong with it

Most of it was not a layout problem. The page was telling people things that were not true, and the layout made that hard to notice.

The previous My Opportunities page at desktop width: three equal tiles reading Confirmed 8, Pending 3 and Potential Earnings $970 with a View Wallet button, a Confirmed / Pending toggle, and a list of image-led cards under the heading Your Confirmed Opportunities, each with a lowercase amber status badge.
Before. Eight "confirmed" jobs, of which three were actually booked; the other five were finished weeks ago.
02

What it is now

A day sheet. Showing agents work off a printed sheet per day, and this is the screen version of it. Each day gets a calendar rail: its name over a large date numeral, the way a wall calendar marks a day, so a column of days scans by the numerals alone. Each job is a card whose left edge is the property itself, the agent's photo bleeding to the edge with no frame, so the card reads as a house first. The text answers the questions in the order they are asked: when, as a real range; what; where; and on the far edge, how much and who is paying, in tabular figures so a column of them adds up by eye.

The redesigned page at desktop width: My opportunities heading with a Find opportunities button on the right, three tabs reading Upcoming 3, Awaiting a decision 3 and Past 5, then day groups labelled Tomorrow, Monday and Thursday, each with a large date numeral under the day name in the left rail, and a white card whose left edge is a photo of the property, then the time as a range such as 10:00 to 11:00 am with the service type beside it, the job title, the address, and on the right the pay with the brokerage paying it. A summary rail on the right reads Next up Tomorrow, Booked 3 jobs $430 in pay, Awaiting a decision 3 applications, Earned $2,075.
After, at 1440px. A calendar rail, a house on every card, and the time as the range it really is. The three figures that were wrong before are now four that are right.
The Awaiting a decision tab: three day groups of pending applications, each row showing the pay and Applied yesterday, Applied 2 days ago or Applied 3 days ago on the right.
Awaiting a decision. The right column carries the pay and how long you've been waiting.
The Past tab: five completed jobs grouped by day, most recent first, each marked Completed under its pay.
Past. Most recent first, so the last thing you did is the first thing you see.
The page at 390px: heading, a full-width Find opportunities button, the four figures two by two, the three tabs, then day groups with the day label above each card.
Phone. The figures go two by two, the day becomes a heading over its cards, and the photo keeps its edge with the pay dropping under the text.
The Awaiting a decision tab at 390px, with the pay and Applied yesterday under each job.
The waiting list on a phone. Pay and status drop under the job rather than squeezing beside it.
The page at 1024px with the sidebar open: the four figures run in one row above the tabs, and the day rail sits beside each group.
1024px. With the sidebar open this is a 768px column, so the rail moves above the list.
The redesigned page in dark mode: the same layout on the near-black ground with card surfaces a shade lighter.
Dark. Every surface and hairline comes from the same tokens, so nothing needed a second design.
The page viewed as a vendor with no work yet: the heading reads My jobs, the button reads Find work, the Upcoming tab shows a Nothing booked yet message with a Find work button, and the rail reads Nothing booked, 0 jobs, 0 applications, $0.
A vendor with nothing on. The page says "My jobs", talks about quotes rather than applications, and the empty state has one thing to do.
03

The dialogs

A row opens the right dialog for what it is. A booked or finished job opens the appointment dialog, rebuilt here in the same order the board's dialog reads. A pending application opens the board's dialog in a new applied state.

The previous behaviour: opening a booked job showed the board's job dialog with an Apply now button in the footer.
Before. A booked job opened the apply dialog, offering "Apply now" for work you already had.
The rebuilt appointment dialog: Home Showings and Booked on the top line, the job title, the address, a facts strip of pay, when, duration and client, two photos, the description, a Client section with a phone number and email, and Close, Directions and Contact client buttons.
A booked job. Facts strip, the agent's own photos, their words, and how to reach them. Contact client is the one amber control.
The board's job dialog in its applied state: the same facts strip, photos and description, and a footer reading Applied yesterday. The agent hasn't decided yet, with only a Close button.
A pending application. The footer says where it stands and no longer offers to apply again.
The appointment dialog at 390px: the facts strip in two columns, the photos as a carousel, the description, and the client section.
The booked-job dialog on a phone.
04

Calls worth knowing about

05

How it was verified

Self-critiqueScoreWhy
Philosophy4Every part answers one of the three questions a person brings to the page.
Hierarchy5Date numeral, house, time, title, pay. The eye has one path across each card and one path down the days.
Execution4Full state coverage, tokens only, one radius scale. Long titles wrap at 1280px with the rail beside.
Specificity5A day sheet with the house as the card's edge and a real time range is this product's, not a template's.
Restraint5No accent on the page, no decorative motion, no icons beyond the map pin and the service mark.
Variety4A diary with a rail, where the board is a list beside a map and My listings is tabs of cards.
06

What's next

FileWhat changed
src/pages/MyOpportunities.tsxRewritten: tabs, day-grouped agenda, summary rail, states, both dialogs.
src/components/AgendaList.tsxNew. The day sheet: a calendar rail with a date numeral beside per-job cards whose left edge is the property photo; the whole card is the button.
src/components/AppointmentDetailsDialog.tsxRebuilt in the board dialog's language; invented notes and placeholder image removed.
src/components/OpportunityPreviewDialog.tsxApplied state (no apply button), "Your price" label, shared Fact.
src/components/FactStrip.tsxNew. The shared "value over label" fact.
src/lib/schedule.tsNew. Local-day arithmetic, day labels, "3 days ago", grouping by day.
src/lib/opportunity-adapter.tsformatClock, formatPrice, exported parseLocalDate, pictures and service type on the appointment card.
src/App.tsx, src/demo/DemoApp.tsxmin-w-0 on the sidebar's main pane.