PICKED FOR DESIGN 1d — stack and CTA together, weights re-graded

The desktop row to build — the same brief as the mobile pick, so a homeowner reads it the same on both. Everything below is the exploration that led here.

{{ b.photos }} {{ b.name }} Rooms {{ b.rooms }} Budget {{ b.budget }} Target {{ b.target }} Status {{ b.status }} {{ b.created }} No proposals yet {{ b.cta }}
Why this one
Stack and CTA are one decision, so they sit adjacent. Who replied and how to read them stack in a single right-hand column — a glance, not a scan across 1100px. Right edge is a fixed frame. Date caps the column, CTA anchors its foot, so both hold position at any row height. Values carry the row. Labels recede to medium; rooms and status take medium ink because they identify the brief. No structure to fight. Select box, hairline, ledger — nothing the minimalist treatment has to work around, unlike 1c's table headers.
Carried from mobile
Title, Rooms and Status hard-clamp at two lines, so a long room list costs a row 20px and never more. The created date sits at the top of the right column, not on the title line as it does on mobile — 1100px has a right column to spend, so the date caps it and the CTA anchors its foot. The PRO stack caps at five discs, the last carrying the total. Money and dates never wrap — single line with an ellipsis, not a two-line clamp: a split range reads as two numbers and a split date is unreadable. Dates are day–short-month–year (14 Nov 2026). Numeric forms are ambiguous across locales and full month names swing 3–9 characters, which is what breaks a fixed column. Format per locale at runtime with Intl.DateTimeFormat — zh-TW resolves to 2026年11月14日. Open question, same as mobile: whether the created date stays top-right or moves under Status.
1 Desktop brief row — five minimalist layouts

All five carry the same structural changes: a select box at the head of the row, created date pushed to the far right, and Status as the last info line. In 1a1c the label/value weight is reversed as specified — labels semibold ink, values regular muted. 1d deliberately re-grades both sides — lighter labels, values on three levels — and 1e makes the labels a different type class altogether rather than a different weight. What otherwise differs is where the PRO stack and CTA sit relative to the facts.

Shown at 1100px — the real content column at max-width 1180 minus 40px gutters. Each concept shows two rows so alignment down a list is visible; the second row of 1a is in its selected state.

1aStack under the facts, CTA far right
{{ b.photos }} {{ b.name }} Rooms {{ b.rooms }} Budget {{ b.budget }} Target {{ b.target }} Status {{ b.status }} No proposals yet {{ b.created }} {{ b.cta }}

Stack sits directly under the ledger, CTA anchors the right edge. Date top-right, CTA bottom-right, so the right column is a fixed frame at every row height. The stack reads as belonging to the project's facts rather than to the button. Weakness: stack and CTA are ~700px apart, so the two halves of one decision sit at opposite ends of the row.

1bStack and CTA together on the right
{{ b.photos }} {{ b.name }} Rooms {{ b.rooms }} Budget {{ b.budget }} Target {{ b.target }} Status {{ b.status }} {{ b.created }} No proposals yet {{ b.cta }}

The tightest decision cluster. Who replied and how to read them sit together in one right-hand column, directly above each other — the decision is a single glance rather than a scan across the row. Facts stay a quiet left-hand ledger. The date caps the column at the top, so the right edge reads date → stack → CTA every time. Weakness: the middle column is now purely reference, which makes the row feel emptier at wide viewports.

1cFour columns, stack in its own
Photos Project Proposals Created
{{ b.photos }} {{ b.name }} Rooms {{ b.rooms }} Budget {{ b.budget }} Target {{ b.target }} Status {{ b.status }} None yet {{ b.cta }} {{ b.created }}

Treats the list as a table. Fixed column widths with faint headers, so Proposals and Created are genuinely columnar — scannable down twenty rows, not three. The date is a true right-hand column rather than a floating caption. Weakness: headers plus four columns is the most structure of the three, which pushes against the minimalist brief; and at three or four briefs a table header earns very little.

1d1b, weights re-graded Picked for Design
{{ b.photos }} {{ b.name }} Rooms {{ b.rooms }} Budget {{ b.budget }} Target {{ b.target }} Status {{ b.status }} {{ b.created }} No proposals yet {{ b.cta }}

Labels light, values weighted by how much they identify the project. Labels are medium --text-body; values now run on three levels instead of one flat muted grey — rooms and status take medium ink because they are what you recognise a brief by, budget and target sit at regular --text-body as real figures you read rather than scan, and the date keeps medium --text-body so the right column has something to hold at the top. Net effect: the ledger is now the same three-level hierarchy as the rest of the row, and the values read louder than the labels — the opposite of 1b, and more legible because the words that matter are the darkest thing in the block.

1eField-label column
{{ b.photos }} {{ b.name }} Rooms {{ b.rooms }} Budget {{ b.budget }} Target {{ b.target }} Status {{ b.status }} {{ b.created }} No proposals yet {{ b.cta }}

Labels stop competing by becoming a different kind of text. Rather than out-weighting the values, they drop to an uppercase micro column in --text-muted — the same field-label treatment the product uses in forms. That reads as a label at a glance without needing weight, which frees every value to sit at regular --text-strong: the content is the darkest thing in the row, and with four facts stacked the label column still forms the fixed rhythm you scan by. Distinct from 1b (heavy labels, muted values) and 1d (graded values); the trade is that uppercase micro is a fifth type style on the row.

My pick: 1d1b's layout, because stack and CTA belong to one decision and should sit adjacent, with 1d's re-graded weights. It knowingly departs from the strict label-darker rule: labels recede to medium --text-body, and the values split three ways — rooms and status in medium ink because they identify the brief, budget and target in regular --text-body, the date medium to anchor the right column. Emphasis lands on the words you scan for rather than on four repeating field names. If the label column must lead without dimming the content, take 1e — uppercase micro labels do that job without spending weight. Take 1b unchanged for the strict reversal as originally specified; take 1c only if the list runs long enough for column scanning to pay.