This list works from the keyboard. Press ↓ to step through the results — the console at the bottom of the page shows what a screen reader hears as you go.
Working prototype · commercial real estate search
Every marketplace search gets the happy path designed. These are the eight states underneath it — the empty result, the stale saved search, the listing that goes under contract while you are reading it — built as working, keyboard-complete, screen-reader-complete interface rather than described in a paragraph. Every listing below is invented sample data.
This list works from the keyboard. Press ↓ to step through the results — the console at the bottom of the page shows what a screen reader hears as you go.
Four of these you can reach by using the filters above the way a broker would. Four cannot be triggered on demand in a prototype — a listing does not go under contract because you asked it to — so they are here as switches. Each one is designed, not defaulted.
You cannot evaluate a keyboard and screen-reader experience by looking at it. So this logs it: every live-region announcement and every programmatic focus move, as it happens. Tab into the results and use the arrow keys.
“No results” tells a broker nothing they did not already know. The prototype computes which single filter is responsible for the emptiness, says so, and offers the relaxation with the resulting count attached — so the next click is a decision rather than a guess.
A listing that goes under contract mid-session is not removed. Removal makes a person doubt their own memory. It stays, marked, in position, and the count explains the change.
Hiding a restricted rent roll behind a blank space asks the user to guess whether data exists. Showing the field names, the row count, and a redacted value shape tells them exactly what verification buys.
Cap rate is a sale metric. Switch to For Lease and it has nothing to describe, so the control disables itself and says why. A filter that stays enabled while it can never match anything is a trap dressed as an option.
Tile failure degrades to a list that still filters, sorts and opens. The retry restores the map without discarding a single filter — losing a broker’s query to a network blip is a design decision, not an accident.
Nothing on this page is set below 0.875 rem. WCAG specifies no minimum type size at all, so that is a house standard sitting above the spec: hierarchy here comes from weight, case, tracking and colour rather than from shrinking the secondary text until it is deniable. axe-core, WCAG 2.1 A and AA rule sets, run against all eight states: zero violations. Reflow holds at a 320 px viewport, and the 1.4.12 text-spacing override introduces no horizontal scroll. That is a floor, not a certificate — automated tooling catches perhaps a third of real accessibility problems, and no manual screen-reader pass has been run on this prototype. The one remaining “incomplete” is axe declining to judge the contrast of a glyph-only key hint. Treating an automated pass as conformance is the habit this page exists to argue against.
Sample data is invented; addresses, prices and cap rates are not real listings and no Crexi data was used. Built as an independent prototype by Kayhan Atamyildiz to demonstrate edge-case and accessibility practice — keyboard model, ARIA roles, live regions, focus management and reduced-motion support are implemented, not simulated.