Prospects: the tiles stay, and clicking one opens the real funnel

The whole prospects rework in one preview — five spectrum tiles, the Attio-style funnel behind a click, and the calmed detail page

25 Aug 2026 · branch feat/prospects-tiles-funnel · captured against propflow-stage · at 0935563aa6+local

Data note. Every name and balance below comes from propflow-stage, which is anonymized by construction (ADR-0097/0110 — phones in the impossible +1000 NPA, emails @example.test). The identical capture against prod would carry real tenants' names and balances and is not safe to attach anywhere, which is why the generator refuses to run against one.

1 · The strip at rest — the five numbers Gera asked to keep

The descent he described — active → inquiries → tours → applications → signed — as five compact tiles, each wearing its LOGO_SPECTRUM_ORDERED stop left to right. Five tiles, five stops: the old six-tile strip wrapped the spectrum and painted Vacant and Signed the same violet; with Vacant Units gone (a vacant unit is not a prospect — 2026-08-19 founders call) the collision is unrepresentable. Sean's tie-out still holds in the numbers on screen: active = inquiries + tours + applications.

Asserted in the captured DOMActive Prospects · Inquiries · Tours · Applications · Signed Leases · in the pipeline. All five compartments and the Active sub-line render from server-loaded data — and no Vacant Units tile is among them.

The strip at rest — the five numbers Gera asked to keep

2 · Click a tile — the funnel, now with its time dimension

Round-3 owner feedback built in: the chart is now FIRST — the header sentence and the relocated aggregate are gone (“it takes away room from the chart… move the chart more up”), the Inquiry → signed figure living where its context is, the monthly cohort table's own INQ → SIGNED column. The window control is the dashboard's calendar icon, in the card header beside the collapse chip. Under each bar, the still-here notes connect the tiles' partition into the flow bars, and the occupancy line leads with the number the funnel exists to move.

Asserted in the captured DOMstill here · booked ahead · units to fill · ARRIVED · (so far) · INQ. The header stat, the connective per-bar notes, the reworded forward book, the to-fill occupancy lead, and the monthly cohort table — all present in the open panel.

Click a tile — the funnel, now with its time dimension

3 · The panel's own window — decoupled from the list

The calendar is the DASHBOARD's own icon control now (round 3: “I would want to use the same… consistency throughout the app”), living in the expanded card's header beside the collapse chip — which also makes round 6's stranding structurally impossible: the picker is card chrome, so no funnel state can swallow it. Here it is committed to All time via the popover's preset + Apply: the chart recounts over every lead the property has seen, the honesty caption appears above the bars (the ONLY text allowed there — “Counting All time — the list below keeps its own window and filters…”), and the months table stays a fixed six-month readout, its own caption saying so. The list below keeps the Date pill's window, untouched.

Asserted in the captured DOMCounting All time · keeps its own window · unmoved by the window picker · Last 60 Days. The decoupled state is captured with both honesty captions — the above-chart line ('Counting All time — …keeps its own window…') and the history table's scope line — while the list's own pill still reads Last 60 Days.

The panel's own window — decoupled from the list

4 · Click a bar — the table becomes the drill-down

The Tours bar and the table are one claim: reachedFunnelStage counts the bar and filters the rows, so 'the bar says N' and 'the table shows N of the cohort' cannot disagree. The narrowed stage keeps its color at full strength while the others step back — dimmed, not recolored, so every stage keeps its identity. The bars keep counting the whole cohort while the table narrows; re-clicking (or clicking Inquiries, the whole cohort) clears.

Asserted in the captured DOMToured · Clear. The Funnel chip is applied (with its Clear affordance) — the table is narrowed to the toured cohort. The bar's count and the table's 'X of Y' render in the capture; the exact figures move with the live stage mirror, so the pinned equality lives in ProspectsClient.funnel.test.tsx rather than in a screenshot assertion.

Click a bar — the table becomes the drill-down

5 · Dark mode — same anatomy, tokens doing the work

The spectrum bars stay saturated on the dark card; connector washes are translucent (mixed toward transparent, never toward a hardcoded ground) so they read over either theme; pills, axis, and captions ride var(--color-*) tokens. The aggregate figure is the signed hue mixed 55% toward the theme's text color — sky alone is a bar fill, not a text color.

Asserted in the captured DOMARRIVED · still here

Dark mode — same anatomy, tokens doing the work

6 · The detail page — the calm-down, in the same preview

Folded in from #6225 and reworked to round-3 owner calls: the activity rail rides the brand spectrum again — Gera reversed the one-hue green pass on the preview (“I liked the progress bar… how it had our company logo colors. I don't like the greens”), so each happened row carries its stop on the violet → sky run (the sanctioned progress-rail use of spectrumAt) while the three-state fill grammar survives (done filled, current ringed, upcoming neutral). The follow-up card moved to the right rail (“on the right side makes a little bit more sense”), leading the activity log, so the main column is the funnel position, key facts and the focal tour/application card.

Asserted in the captured DOMActivity. The follow-up card heading is cadence-state-dependent ("Following up automatically" / "Texted them"…), so the capture asserts the stable Activity Log anchor; the card placement is the picture itself.

The detail page — the calm-down, in the same preview

7 · Tenant detail — the shared-component changes ride along, surface healthy

The signal timeline is shared by prospect, tenant, and unit detail — #6225's restyle and this round's disclosure restructure (detail as a sibling of the row button, aria-controls wiring) land on those surfaces too. This capture answers the round-3 ask to see a second consumer before merge: the tenant detail renders healthy with the shared components in the tree. Honest limit: this stage tenant carries no operational signals, so the timeline itself doesn't mount here — its rendering is pinned by SignalTimeline's unit tests and shown live on the prospect detail in the previous section.

Asserted in the captured DOMWork Orders · Conversations · Summary. The tenant detail's sections render after the shared-component changes — no breakage on the second consumer.

Tenant detail — the shared-component changes ride along, surface healthy

What this evidence is for

PR #6224 shipped a funnel nobody had rendered next to its reference, and it was wrong in shape, saturation model, and interaction. This artifact exists so that cannot happen silently again: every capture above was taken from the branch's own dev server against anonymized stage data, its assertions checked in the captured state, before the PR asked for anyone's time.

PropFlow Docs