Public: anyone can read this; the crew can change it.
Print an open house sign-in sheet for a listing with an open house, in the agent's brand #65
Check · Review · Land · Live done — Landed and live in production.
A listing with an open house now has a **Sign-in sheet** link, and the sheet itself is a printable page at `GET /listings/:id/sign-in`. A listing with no open house shows no link and answers 404 there.
shipped production is serving it deploy 957b843
A listing with an open house now has a Sign-in sheet link, and the sheet itself is a printable page at GET /listings/:id/sign-in. A listing with no open house shows no link and answers 404 there.
- Page:
src/pages/signin.tsis a print-layout page with the same print bar and Print button as the flyer. It carries the hero photo, address, price, the open house line exactly as the flyer words it, and the agent's name and phone in the brand colour. Below that is a table of 15 blank rows: Name, Email, Phone, Working with an agent? (Yes / No). - Route:
src/routes.tsadds the route. It reads the listing with the existinggetListing, which askspermit, so no contract cell changes. It returns 404 when the listing has no open house. - Link:
src/pages/listing.tsshows the link only when the listing has an open house. - Print:
static/app.csssets the sheet up for one US Letter page with no navigation. Its classes are named indocs/design/areas/open-house.md. - Tests:
- src/signin.test.ts covers the link appearing only with an open house, both dates, the agent's name and phone, 15 rows, and 404 without an open house (or for an unknown id).
- src/hostile.test.ts now gives its hostile listing an open house and includes the sheet in the escaping checks.
- The README's open house step says where the sheet is.
Nothing typed on paper is stored.
Checks: bun test on signin, hostile, speed, design, a11y and openhouse passes. bun scripts/lint-design.ts is clean. The design linter is at that path here, not the design-lint.ts the brief names. bun x tsc --noEmit only printed the compiler's help text in this sandbox, so I could not type-check. I did not run the full suite.
🤖 Generated with Claude Code
Clean. Route goes through getListing (permit), no contract cell changes, all fields escaped, hostile test covers the page, tests cover link/404/15 rows/both dates, design lint clean, README updated. Not run here: the preview sample listing has no open house, so I could not view the rendered sheet there; the print layout rests on the CSS and tests.
A listing with an open house now has a Sign-in sheet link, and the sheet itself is a printable page at
GET /listings/:id/sign-in. A listing with no open house shows no link and answers 404 there.src/pages/signin.tsis a print-layout page with the same print bar and Print button as the flyer. It carries the hero photo, address, price, the open house line exactly as the flyer words it, and the agent's name and phone in the brand colour. Below that is a table of 15 blank rows: Name, Email, Phone, Working with an agent? (Yes / No).src/routes.tsadds the route. It reads the listing with the existinggetListing, which askspermit, so no contract cell changes. It returns 404 when the listing has no open house.src/pages/listing.tsshows the link only when the listing has an open house.static/app.csssets the sheet up for one US Letter page with no navigation. Its classes are named indocs/design/areas/open-house.md.-
src/signin.test.tscovers the link appearing only with an open house, both dates, the agent's name and phone, 15 rows, and 404 without an open house (or for an unknown id). -src/hostile.test.tsnow gives its hostile listing an open house and includes the sheet in the escaping checks. - The README's open house step says where the sheet is.Nothing typed on paper is stored.
Checks:
bun testonsignin,hostile,speed,design,a11yandopenhousepasses.bun scripts/lint-design.tsis clean. The design linter is at that path here, not thedesign-lint.tsthe brief names.bun x tsc --noEmitonly printed the compiler's help text in this sandbox, so I could not type-check. I did not run the full suite.🤖 Generated with Claude Code
Closes #43