Skip to content

fix(public): put a real Request-the-appraisal signup form in the /pricing closing callout - #114

Closed
nish3451 wants to merge 33 commits into
mainfrom
fix/pricing-closing-callout-appraisal-action-lane1
Closed

fix(public): put a real Request-the-appraisal signup form in the /pricing closing callout#114
nish3451 wants to merge 33 commits into
mainfrom
fix/pricing-closing-callout-appraisal-action-lane1

Conversation

@nish3451

@nish3451 nish3451 commented Aug 11, 2026

Copy link
Copy Markdown
Collaborator

What

The pricing page's closing callout (div.band) — "The appraisal costs you an
email. 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.two posting website + email to /api/signups (CSP form-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 CSS
changes 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.mjs pins the shape so the
dead end cannot silently return: the band must keep a form.lead posting
website + email to /api/signups, both intake inputs must carry a
non-empty aria-label, and the submit must read "Request the appraisal".
Negative-tested: removing the form makes npm run check fail with the guard
messages; 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

    • Added a signup form to the pricing page’s closing section.
    • Visitors can submit their website domain and work email to request an appraisal.
    • Added website URL validation, autocomplete, required fields, and an example placeholder.
  • Tests

    • Added checks to verify the pricing signup form’s submission behavior, accessibility labels, and button text.

…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).

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown

Review Change Stack

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Free

Run ID: d650460e-e0e9-48e4-804c-e666a7160935

📥 Commits

Reviewing files that changed from the base of the PR and between 0b5bef8 and 5355ad8.

📒 Files selected for processing (2)
  • public/pricing.html
  • scripts/check-site.mjs

📝 Walkthrough

Walkthrough

The 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.

Changes

Pricing signup

Layer / File(s) Summary
Add pricing signup form and regression guards
public/pricing.html, scripts/check-site.mjs
The pricing closing band adds required website and work email fields and posts to /api/signups. Static checks validate the form action, persistent aria-label attributes, and the “Request the appraisal” submit label.

Estimated code review effort: 2 (Simple) | ~10 minutes

Mergeability Score: ⚪ Minimal · up to 5355a

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 Free

Your 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 @coderabbitai help to get the list of available commands.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread scripts/check-site.mjs
Comment on lines +292 to +294
for (const input of pricingForm.matchAll(/<input\b[^>]*>/gi)) {
const tag = input[0];
if (!/\bname="(?:website|email)"/.test(tag)) continue;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

@nish3451

Copy link
Copy Markdown
Collaborator Author

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 (npm run check → "TinyStudio.io checks passed.").

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread public/pricing.html
Comment on lines +132 to +133
<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">

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread scripts/check-site.mjs
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)) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nish3451 has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread public/pricing.html
Comment on lines +133 to +134
<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">

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread public/pricing.html
Comment on lines +133 to +134
<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">

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your trial has ended. Reactivate Greptile to resume code reviews.

@nish3451

Copy link
Copy Markdown
Collaborator Author

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; scripts/check-site.mjs now conflicts with main in the guard region). The byte-identical fix is re-landed clean on current origin/main by PR #194gh pr diff 114 vs gh pr diff 194 differ only in a guard comment word and #194's lane report; production files identical. #194 is MERGEABLE/CLEAN with npm run check green on its tree and is the surviving delivery path.

@nish3451 nish3451 closed this Aug 14, 2026
nish3451 added a commit that referenced this pull request Aug 14, 2026
…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>
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