fix(public): put a real Request-the-appraisal signup form in the /pricing closing callout - #114
fix(public): put a real Request-the-appraisal signup form in the /pricing closing callout#114nish3451 wants to merge 33 commits into
Conversation
…cing closing callout The pricing page's closing band — "The appraisal costs you an email. The rest is a decision you can make later." — ended in a dead end: no intake form, no action, nothing to click, while every other served conversion surface (home, /audit) carried a real signup form. The band now embeds the same form.lead.two intake (website + email posting to /api/signups) with a "Request the appraisal" submit, matching the audit page's field shapes and persistent aria-labels, so the closing offer is actionable in place instead of bouncing the reader back to the nav. A static source guard in check-site.mjs pins the shape: the band must keep a form.lead posting to /api/signups, both intake inputs must carry a persistent programmatic aria-label, and the submit must read "Request the appraisal" — so the dead end cannot silently return. verify: npm run check and npm test (check, heading hierarchy, sitemap, worker, UI contracts) all green on this branch. Supersedes PR #68 (same fix, fresh branch from current origin/main so the governed review pipeline can land it).
There was a problem hiding this comment.
nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.
ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Free Run ID: 📒 Files selected for processing (2)
📝 WalkthroughWalkthroughThe pricing page now includes a signup form for website domain and work email. Site checks validate its submission endpoint, input labels, and submit button text. ChangesPricing signup
Estimated code review effort: 2 (Simple) | ~10 minutes Mergeability Score: ⚪ Minimal · up to This PR adds the appraisal request form to the pricing page closing callout and a guard that preserves its required fields; no actionable merge-blocking risk remains after normal checks and review. Note 🎁 Summarized by CodeRabbit FreeYour organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Pro by visiting https://app.coderabbit.ai/login. Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b34e3958f8
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| for (const input of pricingForm.matchAll(/<input\b[^>]*>/gi)) { | ||
| const tag = input[0]; | ||
| if (!/\bname="(?:website|email)"/.test(tag)) continue; |
There was a problem hiding this comment.
Require both signup fields in the pricing guard
If either website or email is deleted or renamed while the form and button remain, this loop simply skips the missing field and npm run check still passes. In particular, losing website would allow the form to save a signup with no site to appraise because the worker accepts a null normalized website. Explicitly assert that both named, required inputs exist before validating their labels.
Useful? React with 👍 / 👎.
|
State note (2026-08-12 reconciliation run): PR #68 was closed as the stale duplicate of this cluster; this PR is now the single surviving delivery path for the pricing closing-callout form fix. Its tree was re-verified green today ( |
There was a problem hiding this comment.
nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.
There was a problem hiding this comment.
nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.
There was a problem hiding this comment.
nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e5d81f79ab
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| <form class="lead two" action="/api/signups" method="post"> | ||
| <input type="text" name="website" required inputmode="url" autocomplete="url" placeholder="yourwebsite.com" aria-label="Your website domain" pattern="(https?://)?([a-zA-Z0-9\-]+\.)+[a-zA-Z]{2,}(:[0-9]+)?(/[^\s]*)?" title="Enter your domain, like example.com"> |
There was a problem hiding this comment.
Stack the pricing form at tablet widths
On /pricing at widths just above 760px, the shared .two form remains a single row even though the band's 62px side padding leaves only 524px at a 768px viewport. The nowrap submit button then leaves each input about 160px wide including 42px of input padding, clipping the yourwebsite.com placeholder and leaving sighted users without a readable field prompt. Add a pricing-specific earlier stacking breakpoint (similar to the homepage's 900px treatment) or otherwise preserve enough input width.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 5fc5325140
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| failures.push(`Pricing intake input must carry a persistent programmatic aria-label (placeholder-only labels disappear as buyers type): ${tag}`); | ||
| } | ||
| } | ||
| if (!/Request the appraisal/i.test(pricingForm)) { |
There was a problem hiding this comment.
Require an actual submit button in the guard
If the button is removed or changed to a non-submitting element while the phrase “Request the appraisal” remains anywhere in the form, this regex still passes, even though users no longer have a clickable way to submit the two-field form. Match the text specifically inside a <button> or submit input so the dead-end regression this guard is intended to prevent cannot return unnoticed.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.
There was a problem hiding this comment.
nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a6b4bae437
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| <input type="text" name="website" required inputmode="url" autocomplete="url" placeholder="yourwebsite.com" aria-label="Your website domain" pattern="(https?://)?([a-zA-Z0-9\-]+\.)+[a-zA-Z]{2,}(:[0-9]+)?(/[^\s]*)?" title="Enter your domain, like example.com"> | ||
| <input type="email" name="email" required placeholder="Your work email" aria-label="Your work email"> |
There was a problem hiding this comment.
Increase placeholder contrast in the dark-band form
In the new pricing-band form, the placeholders are the only visible field labels, but the shared #AC9E8B placeholder color is rendered against a 74%-opaque light form background composited over the band’s #1C1712–#100C09 gradient, producing only about 1.4–1.5:1 contrast. This makes both blank controls difficult for low-vision users to identify; add persistent visible labels or use a placeholder color/background combination that meets normal-text contrast requirements.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f88197cf9e
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| <input type="text" name="website" required inputmode="url" autocomplete="url" placeholder="yourwebsite.com" aria-label="Your website domain" pattern="(https?://)?([a-zA-Z0-9\-]+\.)+[a-zA-Z]{2,}(:[0-9]+)?(/[^\s]*)?" title="Enter your domain, like example.com"> | ||
| <input type="email" name="email" required placeholder="Your work email" aria-label="Your work email"> |
There was a problem hiding this comment.
Restore distinct keyboard focus on pricing inputs
When a keyboard user tabs through this new form, both inputs inherit form.lead input { outline:none } from public/shared.css:61, while only form:focus-within changes the outer form border. That border remains identical when focus moves from website to email, so sighted keyboard users cannot tell which control will receive typing; preserve the browser outline or add a per-input :focus-visible indicator.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
|
Reconciling the pricing-callout PR cluster to one delivery path: #68 was closed 2026-08-12, and this branch has since gone CONFLICTING (33 automated main-merges; |
…er on current state (#197) #68 closed 2026-08-12; #114 is now CONFLICTING (33 automated main-merges on its branch); #194 re-lands the byte-identical fix fresh and is the sole open delivery path. Verified identical production diffs and green npm run check / npm test on #194's tree. Co-authored-by: nish3451 <nish3451@users.noreply.github.com> Co-authored-by: CommandCodeBot <noreply@commandcode.ai>
What
The pricing page's closing callout (
div.band) — "The appraisal costs you anemail. The rest is a decision you can make later." — was a dead end on desktop
and mobile: zero links, zero buttons inside it (backlog item 909/928:
[unreviewed-by-grok] Put a real "Request the appraisal" action inside the
pricing page's closing callout). The only request path on the page was the
static page-top nav CTA, thousands of pixels above the closing panel when it
is in view.
The band now embeds the same real intake the rest of the site uses —
form.lead.twoposting website + email to/api/signups(CSPform-action 'self'allows it; the worker redirects saved signups to/brief-requested),with a "Request the appraisal" submit button matching the audit page's exact
field shapes, including the persistent programmatic
aria-labels. No CSSchanges needed — the shared form styles already cover the dark band (light
pill, mobile stacking, >=44px submit hit area).
Why
The closing panel is the strongest decision section of the page; buyers who
read proof, price, guarantee, timeline and objections to the natural decision
point were given no adjacent next step. This makes the ask actionable in
place instead of bouncing the reader back to the navigation.
Guard
New static source guard in
scripts/check-site.mjspins the shape so thedead end cannot silently return: the band must keep a
form.leadpostingwebsite + email to
/api/signups, both intake inputs must carry anon-empty
aria-label, and the submit must read "Request the appraisal".Negative-tested: removing the form makes
npm run checkfail with the guardmessages; restored, it passes.
Verify
npm test— all suites green (check, heading hierarchy, sitemap, worker,UI contracts, product contract).
npm run check— "TinyStudio.io checks passed."Note on PR #68
This is the same fix as the long-stalled PR #68 (open since 2026-08-10,
approved by flagship reviewers, CI green, still unmerged with no builder
lease). This PR recreates it on a fresh branch from current origin/main so
the governed review pipeline can land it; #68 can be closed once this
merges (or now, to avoid a duplicate cluster).
Summary by CodeRabbit
New Features
Tests