Template
Groundplan
A lead-generation landing page for contractors built around a five-step interactive construction cost calculator. Homeowners pick a project type, size, material tier, complexity, location and timeline, see an animated cost breakdown, and leave contact details, giving contractors pre-qualified leads instead of cold enquiries.
Construction cost estimator landing page · Website · SaaS landing page · front-end app (local state)
Who it is for
- General contractors and remodelers
- Home improvement service businesses
- Agencies building for construction clients
- Homeowners budgeting a project
Layout
- Hero on faint blueprint grid: bold three-line headline with the last line in amber, subcopy, amber 'Get Your Estimate' button and text link, three trust stats with icons
- Hero visual: browser-window card with a dark estimate panel (total, range, materials and labor progress bars) and an amber accuracy badge
- How It Works: four numbered steps (select project, add details, get estimate, connect with pro)
- Five-step calculator flow: project category (8 types), size, material tier comparison, complexity, location + timeline, then animated results and lead form
- What Contractors Say: dark navy band with three testimonial cards and initials avatars
- FAQ accordion (six items)
- Footer
Palette
Trustworthy, practical, confident, clear, energetic. It feels like a modern construction-tech tool with hard-hat amber highlights.
- background
#f8fafc - text (navy ink)
#0f1729 - primary (safety amber)
#fbbd23 - accent (blue)
#156af4 - dark panel
#141c2e - border
#e1e7ef - muted text
#64748b
Every checked pair, measured again
| Sample | Where | Ratio | Needs |
|---|---|---|---|
| Aa | body text on page background | 17.08:1 | 4.5:1 |
| Aa | muted text on page background | 4.55:1 | 4.5:1 |
| Aa | dark label on amber button | 10.82:1 | 4.5:1 |
| Aa | amber headline highlight on light background | 4.64:1 | 4.5:1 |
| Aa | amber text on dark estimate panel | 10.04:1 | 4.5:1 |
| Aa | white text on dark panel and testimonial band | 17.00:1 | 4.5:1 |
| Aa | blue accent link text | 4.56:1 | 4.5:1 |
| Aa | white label on blue accent | 4.77:1 | 4.5:1 |
| input border on page background | 4.55:1 | 3:1 |
As vibld’s tokens
The palette on the fifteen colour tokens vibld styles a project with, each text colour on the fill it is read on. Marked tokens are solved from the palette, because no swatch held that role at 4.5:1.
- background
- card
- muted
- primary
- secondary
- accent
- destructive *
Type
- Display
- Inter 700, 48px hero, 36px section heads; highlighted phrase in amber
- Body
- Inter 16-18px slate; monospace-style numerals for dollar figures
Plain, sturdy sans throughout signals trust and clarity; color (amber) does the emphasis.
Spacing and imagery
Standard SaaS landing rhythm, 1216px container, 50/50 hero, 8px radius buttons and cards, soft large shadows on the mock window.
No photos; a UI mock of the estimate result on a subtle blueprint grid, lucide icons for stats, initials avatars.
Components
- Blueprint grid hero background
- Two-tone headline
- Primary amber CTA
- Trust stat row
- Estimate preview card with progress bars
- Accuracy badge
- How-it-works steps
- Multi-step calculator with progress
- Project category tiles
- Material tier comparison cards
- Animated cost breakdown chart
- Lead capture form with phone formatting
- Testimonial cards
- FAQ accordion
Interactions
- Step-by-step wizard with back/next and progress
- Smart location detection with manual override
- Live recalculation as options change
- Animated number count and bar fill for results
- Phone number auto-formatting
- Form validation and success screen
- Page/step transitions (Framer Motion)
- Accordion expand/collapse
Data
ProjectType{id, label, baseCostPerSqFt, icon}MaterialTier{id, label, multiplier, description}Complexity{id, label, multiplier}RegionFactor{zipPrefix/state, multiplier}Estimate{total, low, high, materials, labor, permits, contingency}Lead{name, email, phone, zip, projectType, size, tier, timeline, estimateTotal}
Build prompt
The baseline every prompt in the catalog assumes, then this design’s own ten sections, from goal to guardrails.
The baseline
### How to use these prompts Paste a template's build prompt into your coding agent as the first message. Each prompt names its own stack, tokens and acceptance criteria; the rules below apply to all of them and can be prepended once per project. ### Engineering baseline - TypeScript strict mode, no `any`, small typed components, feature folders, and one source of truth for design tokens (CSS variables consumed by Tailwind). - Validate every input with a shared zod schema on the client and again on the server or edge function. Never trust client-side checks alone. - Show loading, empty and error states for every async view. Surface errors in plain language with a retry, and log details to the console in development only. - Keep secrets out of the bundle. Only publishable keys (for example a Supabase anon key) belong in client code; service-role keys, API keys and webhooks live in server or edge-function environment variables. ### Data and auth baseline (full-stack templates) - Enable Row Level Security on every table before inserting data. Default-deny, then add owner-scoped policies (`auth.uid() = user_id`) and explicit role checks for admin views. - Store roles in a separate table checked by a security-definer function, never in a user-editable profile field. - Upload files to private storage buckets with size and MIME limits, and serve them through signed URLs. - Rate-limit public endpoints (forms, auth, AI calls) and add a honeypot field or captcha to anonymous forms. - Take payments through a hosted checkout and verify webhooks by signature. Never handle raw card data. ### Accessibility and UX baseline - Target WCAG 2.2 AA: 4.5:1 contrast for normal text and 3:1 for large text, input borders, focus rings and meaningful icons or chart lines. Every palette in this catalog lists its verified pairs; re-check with a contrast tool after any colour change. - Keep body text at 16px or larger with 1.5 line height, nothing below 12px, no light weights under 24px, and uppercase only for short labels. - Give every interactive element a visible focus ring, full keyboard support, semantic landmarks, labelled form fields, and alt text on meaningful images. - Respect `prefers-reduced-motion` for every animation. Give drag-and-drop and carousels keyboard and button alternatives. - Build mobile-first and test at 375px, 768px and 1280px. ### Content guardrails - Use original copy, fictional sample data and placeholder or licensed imagery. Do not reuse another product's name, logo, screenshots or marketing text. - Label demo testimonials and metrics as samples. Collect the minimum personal data the feature needs.
### Goal
Build **Groundplan**, a landing page for a fictional regional contractor network whose centerpiece is an interactive cost estimator. Homeowners get a ballpark price in about three minutes; the business gets a qualified lead with project details and timeline. The page must earn trust fast and make the calculator feel precise without overpromising.
### Stack
React 18 + TypeScript + Vite, Tailwind CSS, shadcn/ui (Button, Card, RadioGroup, Slider, Select, Accordion, Progress, Form), lucide-react, Framer Motion for step transitions and number animation, Recharts for the cost breakdown chart, react-hook-form + zod, a phone formatting helper (libphonenumber-js). Pricing logic runs client-side from a typed config. Leads post to a serverless function or Supabase Edge Function that stores them and notifies the contractor.
### Pages & layout
1. **Hero** – very light slate background with a faint blueprint grid; bold headline whose final line is amber; subcopy; amber "Get your estimate" button and a text link; trust stats with icons. Right: a browser-window card showing an example estimate (total, range, material and labor bars) with a small amber badge about accuracy range.
2. **How it works** – four numbered steps.
3. **Estimator** (anchor or route) – stepper with progress: (1) project category tiles (kitchen, bathroom, addition, roof, deck, basement, new build, other); (2) size in square feet with a slider and input; (3) material tier comparison (standard, premium, luxury) with what's included; (4) complexity; (5) ZIP code (optional geolocation suggestion) and start timeline. Results: animated total, low–high range, breakdown chart (materials, labor, permits, contingency), assumptions list, then a lead form (name, email, phone, best time to call, consent).
4. **Testimonials** – dark navy band with three sample cards (clearly labeled as examples).
5. **FAQ** accordion and footer with license/insurance placeholders.
### Design system
- Tokens: `--background: #f8fafc`, `--foreground: #0f1729`, `--primary: #fbbd23`, `--primary-foreground: #1a1405`, `--primary-text: #946a03`, `--input-border: #64748b`, `--accent: #156af4`, `--secondary: #f1f5f9`, `--border: #e1e7ef`, `--muted-foreground: #64748b`, `--panel: #141c2e`, `--radius: 0.5rem`.
- Fonts: Inter (400/600/700) and JetBrains Mono for dollar figures. Scale: 12 / 14 / 16 / 18 / 24 / 36 / 48.
- Spacing: 8px base; sections 96px; hero 50/50; cards 24px padding; mock window shadow `0 24px 48px rgb(15 23 41 / .12)`.
- Motion: step slide 250ms; counts 800ms ease-out; bars grow 600ms.
### Components & interactions
Stepper (complete/current/upcoming; next disabled until valid), category tile (selected ring, hover, focus), size slider with numeric input kept in sync, tier card (selected, "most popular" tag), location field (detecting, detected, denied → manual), results (loading shimmer, final numbers, recalculates when going back), lead form (inline errors, formatted phone, submitting, success page with next steps, server error), accordion, sticky mobile "Get estimate" bar.
### Data & state
Config: `ProjectType{id,label,costPerSqFt:{low,high}}`, `Tier{id,multiplier,includes[]}`, `Complexity{id,multiplier}`, `Region{prefix,multiplier}`. Computed `Estimate{low,high,total,breakdown{materials,labor,permits,contingency}}`. Wizard state in one reducer persisted to sessionStorage. `Lead{…inputs, estimate, consent, createdAt}`. Seed plausible but clearly illustrative numbers and state a disclaimer.
### Accessibility
Amber `#fbbd23` is a fill and dark-panel colour only: buttons use `#1a1405` text on it (10.8:1) and amber text on the `#141c2e` panel is 10:1. The highlighted hero line on the light background uses `--primary-text: #946a03` (4.5:1+). The blue accent is `#156af4` (4.56:1 as text; white labels 4.8:1). Inputs use `--input-border: #64748b` (4.55:1); `#e1e7ef` borders are decorative. Tiles are radio buttons in a fieldset. Slider has a paired number input. Results are announced with `aria-live="polite"` once, and the chart has a data table. Step changes move focus to the step heading. Reduced motion disables count-ups and slides.
Verified contrast: body text on page background #0f1729 on #f8fafc = 17.08:1; muted text on page background #64748b on #f8fafc = 4.55:1; dark label on amber button #1a1405 on #fbbd23 = 10.82:1; amber headline highlight on light background #946a03 on #f8fafc = 4.64:1; amber text on dark estimate panel #fbbd23 on #141c2e = 10.04:1.
### Security
Validate the lead with zod on client and in the function; recompute the estimate server-side from submitted inputs instead of trusting the client total. Honeypot, rate limiting and optional captcha on submission. Store leads in a table with RLS allowing inserts only via the function; contractor access is authenticated. Geolocation only on user action; store ZIP, not coordinates. No keys in the client. Explicit consent checkbox before contact.
### Performance & SEO
No heavy imagery; code-split the estimator and Recharts. Meta title/description, OG image of the estimate card, FAQPage JSON-LD. Lighthouse 95+.
### Guardrails
- Fictional company, contractor names and example numbers; label estimates as non-binding.
- Testimonials marked as samples, not real customers.
- Collect only contact fields you use; no sensitive data.
- Small typed components, no `any`, visible errors.
- Done when: the five steps validate and allow going back without losing data; the result updates correctly for every input; amber contrast is fixed; the lead submits and the server recomputes the estimate; the whole flow works by keyboard.