Tour Dash
Report · 5 September 2026

Hire a Vendor Redesign

The screen an agent uses to put work out to a photographer, a stager, a locksmith or a mover. It was ten identical bordered tiles, then three titled boxes around thirteen equal-weight fields, then two panels carrying three amber buttons between them. Every surface on it was the same shape, so nothing on it had a rank. It is now a worksheet with a running job ticket: the left column asks one step's worth of questions, and the rail beside it shows what has been decided and holds the single action that moves it on. Same data layer, same tokens, nothing renamed.

Scope /hire, all three steps, plus the trade picker and the vendor row Status Committed to main as b676785 and deployed to tour-dash.pages.dev on 2026-09-05
01

What was wrong with it

Not a colour or a font problem. The page had no hierarchy, so an agent read everything on it at the same speed and learned nothing from the order.

The previous first step at 1280px: a small numbered breadcrumb reading 1 Trade / 2 Job details / 3 Who gets it, a Your vendors section of three bordered cards, a Search trades input, then ten bordered rectangles in two columns, each with a small grey outline icon, a title, a description, and on five of them the sentence Priced by quote — they respond with a number.
Before, step one. Ten equal tiles, and the same sentence about quoting printed five times.
The previous second step: three stacked white cards titled Location and Details, Listing photography details, and Service details, holding thirteen form fields at equal weight, with a full-width amber Find vendors button underneath.
Before, step two. A box around a form, and a full-bleed amber slab under it.
The previous third step: a Who gets it heading with four radius buttons, two vendor cards each carrying a four-item fact list and four grey badges, then a separate white panel holding a bordered Post it to everyone in the trade box and an amber Send job button.
Before, step three. Badge soup on each vendor, and the open-it-up option boxed inside a second panel with its own button.
02

What it is now

A worksheet with a ticket. The left column asks one step's worth of questions. The rail on the right fills in as the answers arrive and carries the only amber control on the page. It sits beside the worksheet from 1280px and stacks under it below that, as one element moved by the grid rather than two copies switched by a media query.

The redesigned first step at 1440px: a Hire a vendor heading with a one-line description, a three-column step list, a Hire someone again row of three avatar chips, then trades as a divided list grouped under Before it lists, While it's on market and Closing it out, with By quote on the right of quote-first rows only and a chevron on each. A Your job card sits in the right rail reading Pick what you need done and this fills in as you go.
After, step one at 1440px. Trades are a list with a moment above each group; saved people are chips, which no longer look like trades.
The redesigned second step: a Listing photography heading, then Where it is with Address required on the right and four fields, What the job involves with three fields, Price and timing marked Optional with four fields, and a collapsed row reading MLS board, description and instructions. The rail shows Trade, Property and Price with an amber Find vendors button.
After, step two. Sections split by how often the fields actually get filled, and the ticket already holding the answer.
The redesigned third step: Who gets it with a bordered segmented radius control, two vendor rows each showing avatar, name, rate on the right, trade and Insured, one meta line of distance, rating, jobs and turnaround, and a one-line bio. The first is selected with an amber check and amber border. Below them a peer row reads Open it to everyone in the trade. The rail reads Trade, Property, Price, Goes to 1 vendor, and an amber Send job button.
After, step three. One amber control on the page, and the open-it-up option sits in the same list as the people.
The second step for Staging, a quote-first trade: the description says there is no price field here, the Price and timing section is absent, the trade's own fields read Earliest start date, Needed by, Scope, Rooms to stage and Rental period in sentence case, and the rail reads Price They quote it.
A quote-first trade. No price field, no timing section, and the ticket says who names the number.
The redesigned first step in dark mode at 1280px: the same list and chips on a 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 third step at 390px: heading, Who gets it, the segmented radius control, two vendor rows with the rate beside the name and the meta line wrapping to two lines, the open-it-up row, then the Your job ticket and a full-width amber Send job button at the end of the column.
Phone. The rail stops being a rail and becomes the end of the column, with the same ticket and the same one button.
03

Two things fixed on the way past

04

Nomenclature

The page says vendor throughout, matching its own h1, the menu item and the rename that already landed everywhere else in the app. The code still says provider in hooks, columns and component names, which nothing here changed.

05

How it was verified

Headless Chrome driven over CDP against /demo, which makes no Supabase requests.

CheckResult
Widths390, 768, 1024, 1280 and 1440. scrollWidth equals clientWidth at every one: no horizontal overflow.
ThemesLight and dark, forced through localStorage['tour-dash-theme'] before navigation.
Both rate basesListing photography (fixed price) and Staging (quote-first, window-timed).
ConsoleClean. Only Vite's connection messages and the React DevTools notice.
Types and buildtsc --noEmit clean, npm run build succeeds.
06

Files

FileWhat changed
src/pages/HireProvider.tsxRewritten as the worksheet plus ticket, the step list, the folded field group and the peer open-it-up row.
src/components/TradePicker.tsxRewritten as a divided list; the search box and its empty branch are gone.
src/components/ProviderCard.tsxRewritten as a row with the rate opposite the name and one meta line.
src/lib/provider-trades.tsTwenty-six field labels sentence-cased. No field names touched.

Both components are used only by this page, so nothing else moved.