Skip to content

feat(marketing): premium visual pass, How it works page, and no em dashes - #11

Merged
Asapteejo merged 3 commits into
mainfrom
feat/premium-visual-pass
Sep 18, 2026
Merged

Asapteejo merged 3 commits into
mainfrom
feat/premium-visual-pass

Conversation

@Asapteejo

Copy link
Copy Markdown
Owner

Three pieces of work, three commits, reviewable separately.

1. Premium pass on the homepage

Photography. A tenant that has not uploaded a hero image was shipping a plain grey gradient where the photograph belongs, which is the single biggest reason the page did not read as premium. The hero now falls back to the first featured listing's photo, so the gradient only appears when a tenant has neither a hero image nor a published listing.

Chrome. The trust strip and buyer journey were bordered, shadowed cards inside an already-bordered section. Outlines stacked on outlines read as clutter rather than quality. Both are now plain columns separated by hairline rules, with larger numerals and more surrounding space.

Overlay label. The hero panel badge includes the company name, so long names wrapped to two lines inside a pill built for one and broke its rounded shape. It is a plain uppercase label now.

2. How it works

Kept on the homepage in its new slimmer form, and given its own page at /how-it-works driven by the same CMS journey content, with a footer link beside About and Team.

Where I deviated from the request: you asked to remove the section from the homepage and add only a footer link. I kept a slimmer version on the homepage, because it answers "what happens after I click?" at the moment a first-time buyer is deciding, and the footer is where content goes to be ignored. You still get the footer link and a page with room to grow. Easy to remove from the homepage if you disagree.

Also deliberately not added to the header nav, which already carries six links and two CTAs.

No new copy: the page and the homepage section both render siteContent.journey, so a tenant edits the steps once.

3. Em dashes removed

Em dashes read as machine-written, so they are gone from the app.

Replacements were chosen per context, not applied blindly: a comma where the dash joined a clause, a full stop where a comma would have created a splice ("before it goes live. No stale or hidden inventory."), a colon where it separated a label from a value ("Payment overdue: action required"), a pipe in the SEO title, and a plain hyphen for "no value yet" table placeholders. Two automated replacements came out wrong (a WhatsApp message turned into a title-style pipe, a notification subject gained two colons) and were rewritten by hand.

Split across two commits so the comment churn can be dropped independently:

  • style(copy) for user-facing text only (49 files)
  • style for comments, scripts, E2E specs, generated manifest header (126 files)

check-utf8.mjs keeps its em dash, since there the character is the detection pattern. That audit still reports pre-existing ellipsis, middot and en-dash findings, which are outside this request.

Verification

npm run check green (537 tests, typecheck, lint, build), npm run migrations:check green, full E2E suite green (65 passed). Verified at 1440px and 375px: /how-it-works returns 200, the footer link points at it, and the journey section renders as hairline-ruled columns.

Not verifiable locally: the hero photo fallback needs a tenant with a published listing, and both my local tenant and the audited one currently have none (the audited listing aged out of verification in #9). The gradient will persist until a listing is verified or a hero image is uploaded.

🤖 Generated with Claude Code

Asapteejo and others added 3 commits September 18, 2026 19:17
…orks page

Three changes, all layout and hierarchy rather than a rebrand.

Photography. A tenant that has not uploaded a hero image shipped a plain grey
gradient where the photograph should be, which is the single biggest reason
the page did not read as premium. The hero now falls back to the first
featured listing's photo, so a tenant only sees the gradient when it has
neither a hero image nor a published listing.

Chrome. The trust strip and the buyer journey were bordered, shadowed cards
sitting inside an already bordered section: outlines stacked on outlines read
as clutter, not as quality. Both are now plain columns separated by hairline
rules, with larger numerals and more space around them.

Overlay label. The hero panel badge carries the company name, so long names
wrapped to two lines inside a pill built for one and broke its shape. It is a
plain uppercase label now, which wraps without looking broken.

How it works also gets its own page at /how-it-works, driven by the same CMS
journey content the homepage summarises, and a footer link beside About and
Team. No new copy: a tenant edits the steps once and both surfaces follow.

Deliberately not added to the header nav, which already carries six links and
two CTAs; crowding it would undo the hero work.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Em dashes read as machine-written, so every string a user can see now uses
ordinary punctuation. Replacements were chosen per context rather than applied
blindly: a comma where the dash joined a clause, a full stop where a comma
would have produced a splice ("before it goes live. No stale or hidden
inventory."), a colon where the dash separated a label from its value
("Payment overdue: action required"), a pipe in the SEO title, and a plain
hyphen for the "no value yet" placeholders in tables.

Two automated replacements were wrong and were rewritten by hand: a WhatsApp
message had become a title-style pipe, and a notification subject had ended up
with two colons.

Code comments still contain em dashes and are handled separately, so this
commit is only the text a user actually reads.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Same sweep as the previous commit, applied to the text a user never sees:
code comments, the build scripts, the E2E specs, and the generated migration
manifest header (regenerated from its template so the check stays green).

check-utf8.mjs keeps its em dash, because there the character is the pattern
the audit searches for.

The repo is public, so the comments are read too; splitting this from the
user-facing copy keeps that change reviewable on its own.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Sep 18, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
estate-os Ready Ready Preview Sep 18, 2026 7:51pm UTC

@Asapteejo
Asapteejo merged commit ae8a82d into main Sep 18, 2026
4 checks passed

This branch was successfully deployed

1 active deployment
Preview — 375e87ed Deployed Sep 18, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant