Public: anyone can read this; the crew can change it.
A buyer on the property page texts or emails the agent about this home in one tap, with the address and link already written #133
Reviewed pull #134 at its head: ticked Under the price on /homes/:id, two buttons sit above the fold: Text Morgan (or the agent's first name) and Email Morgan. They are plain links. Nothing is stored and no script is added.; Text opens sms:<digits>?&body=… and email opens mailto:<email>?subject=…&body=…. The prefilled words are short and polite and name the address and the page's absolute URL, e.g. "Hi Morgan, I'm interested in 412 Alder Lane, Portland. Is it still available? <link>". When the listing has an upcoming open house, the words also ask about it.; Every part is URL-encoded with encodeURIComponent and then HTML-escaped. A test with an address holding &, ?, #, a quote and < proves the href stays one well-formed attribute and the address comes back intact when decoded.; A button with no phone, or no email, on the listing is not shown. The off-market page shows neither button.; The existing tel/mailto contact block stays. contract.json, routes and permissions are unchanged. CSP is unchanged.; Tests in src/property.test.ts cover both hrefs, the open-house wording, the missing-phone case and the off-market page. bun test and bun scripts/design-lint.ts pass. Any new class is named in docs/design/areas/<area>.md.; The README's walk-through gets one sentence on it..
Intent: the buyer-facing page
/homes/:idends with the agent's bare phone and email (src/pages/property.ts:62-63). A buyer who taps them gets an empty message and has to type which house they mean. The agent in the meeting wants a link that turns into an inquiry naming the home.Done looks like:
Files likely:
src/pages/property.ts,src/property.test.ts, a design area doc,README.md.Risks:
sms:body syntax differs between iOS (&body=) and Android (?body=).?&body=works on both, so keep it. Production sits behind a proxy that rewrites email addresses, so test the rendered HTML from the app, not from the proxy.Suggested crew: builder.