Buildings: the table frame is there while it loads

Gera, 2026-10-03: "it already knows its search box and table column labels, so show those immediately."

3 Oct 2026 · branch feat/buildings-ghost-shows-table-frame · captured against propflow-stage · at 15c783ecdb8

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 · Before (main): loading is one generic skeleton card

The read is held open, so this is what a slow network shows. No search box, no columns: the whole table drops in later.

Asserted in the captured DOM — Buildings

Before (main): loading is one generic skeleton card
Provenance. Captured from commit 3eb35c71baf, read from the worktree the server was started from (/Users/miniclaw/code/PropFlow/wt-onbnotes-main) — the server could not report its own commit, so this is the weaker of the two sources. That commit is already merged into origin/main.
Sections 2–8 and notes

2 · After: loading, desktop light

The search box, the Show filter and every column label are on screen at once. Only the values wait: the rows are ghosts, and the "N of M buildings are on" line is a skeleton one line tall.

Asserted in the captured DOM — Show · BUILDING · UNITS · IN PROPFLOW · NOTES · STATUS

After: loading, desktop light

3 · After: loaded, desktop light

When the rows land, the search box and headers stay where they were: it is the same table, kept mounted.

Asserted in the captured DOM — Clara works only in the buildings that are on. · BUILDING · STATUS

After: loaded, desktop light

4 · After: loading, desktop dark

Asserted in the captured DOM — Show · BUILDING · UNITS · IN PROPFLOW · NOTES · STATUS

After: loading, desktop dark

5 · After: loaded, desktop dark

Asserted in the captured DOM — Clara works only in the buildings that are on. · BUILDING · STATUS

After: loaded, desktop dark

6 · After: loading, phone light

On a phone the table scrolls sideways inside its card, so Notes and Status sit just past the edge, as they do once loaded.

Asserted in the captured DOM — Show · BUILDING · UNITS · IN PROPFLOW

After: loading, phone light

7 · After: loaded, phone light

Asserted in the captured DOM — Clara works only in the buildings that are on. · BUILDING

After: loaded, phone light

8 · After: loading, phone dark

Asserted in the captured DOM — Show · BUILDING · UNITS · IN PROPFLOW

After: loading, phone dark

One tree, not a mirror

The route's loading.tsx and the page's own first paint render the same BuildingsView in its loading state, so nothing jumps at the hand-off.

How it is pinned

BuildingsTable.dom.test.tsx: while loading, the search box and all five column labels render with ghost rows and no "No buildings yet."; the control (not loading, no rows) says "No buildings yet.". client-page.dom.test.tsx: an in-flight read draws the table and the count ghost; when the rows land, the same table element is still in the DOM; BuildingsGhost is that same body and reads nothing. The staff note above the table appears because the smoke account is PropFlow staff viewing a company whose customers cannot see this page.

PropFlow Docs