Free Estimated Quote
<!DOCTYPE html>
<html lang=”en”>
<head>
<meta charset=”UTF-8″>
<meta name=”viewport” content=”width=device-width, initial-scale=1.0″>
<title>Hot Water System — Get a Quote</title>
<link href=”https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;700&family=DM+Sans:wght@300;400;500&display=swap” rel=”stylesheet”>
<style>
:root {
–bg: #f5f0e8;
–surface: #fffdf9;
–ink: #1a1612;
–muted: #7a7065;
–accent: #c94a1e;
–accent-light: #f4ddd5;
–border: #ddd5c5;
–gas: #2563a8;
–gas-light: #dce9f7;
–electric: #16875a;
–electric-light: #d5f0e5;
–solar: #d4820a;
–solar-light: #fdefd2;
–heat-pump: #7c3aed;
–heat-pump-light: #ede9fe;
–radius: 12px;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: ‘DM Sans’, sans-serif;
background: var(–bg);
color: var(–ink);
min-height: 100vh;
}
/* ── Hero ── */
.hero {
background: var(–ink);
color: #fff;
padding: 60px 24px 80px;
position: relative;
overflow: hidden;
}
.hero::before {
content: ”;
position: absolute;
inset: 0;
background: radial-gradient(ellipse at 70% 50%, rgba(201,74,30,.35) 0%, transparent 65%);
pointer-events: none;
}
.hero-inner { max-width: 680px; margin: 0 auto; position: relative; }
.hero-eyebrow {
font-size: 11px;
font-weight: 500;
letter-spacing: .18em;
text-transform: uppercase;
color: #c94a1e;
margin-bottom: 16px;
}
.hero h1 {
font-family: ‘Playfair Display’, serif;
font-size: clamp(2rem, 5vw, 3.2rem);
line-height: 1.15;
margin-bottom: 16px;
}
.hero p {
font-size: 1rem;
font-weight: 300;
color: rgba(255,255,255,.65);
line-height: 1.7;
}
/* ── Form card ── */
.card {
max-width: 720px;
margin: -40px auto 60px;
background: var(–surface);
border-radius: 20px;
box-shadow: 0 8px 48px rgba(0,0,0,.12);
overflow: hidden;
position: relative;
}
/* ── Progress bar ── */
.progress-bar {
height: 4px;
background: var(–border);
}
.progress-fill {
height: 100%;
background: var(–accent);
width: 0%;
transition: width .4s ease;
}
/* ── Steps ── */
.step {
display: none;
padding: 40px 40px 32px;
animation: fadeIn .3s ease;
}
.step.active { display: block; }
@keyframes fadeIn { from { opacity:0; transform:translateY(8px); } to { opacity:1; transform:none; } }
.step-header {
display: flex;
align-items: center;
gap: 14px;
margin-bottom: 28px;
}
.step-num {
width: 36px; height: 36px;
border-radius: 50%;
background: var(–accent);
color: #fff;
font-size: .8rem;
font-weight: 700;
display: grid; place-items: center;
flex-shrink: 0;
}
.step-title {
font-family: ‘Playfair Display’, serif;
font-size: 1.4rem;
}
.step-sub {
font-size: .85rem;
color: var(–muted);
margin-top: 2px;
}
/* ── System type cards ── */
.system-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(148px, 1fr));
gap: 12px;
margin-bottom: 8px;
}
.sys-card {
border: 2px solid var(–border);
border-radius: var(–radius);
padding: 20px 14px;
cursor: pointer;
text-align: center;
transition: all .2s;
background: var(–surface);
position: relative;
}
.sys-card:hover { transform: translateY(-2px); box-shadow: 0 4px 16px rgba(0,0,0,.08); }
.sys-card.selected { border-color: currentColor; }
.sys-card.gas { color: var(–gas); }
.sys-card.gas.selected { background: var(–gas-light); }
.sys-card.electric{ color: var(–electric); }
.sys-card.electric.selected{ background: var(–electric-light); }
.sys-card.solar { color: var(–solar); }
.sys-card.solar.selected { background: var(–solar-light); }
.sys-card.heatpump{ color: var(–heat-pump); }
.sys-card.heatpump.selected{ background: var(–heat-pump-light); }
.sys-icon { font-size: 2rem; margin-bottom: 8px; }
.sys-name { font-weight: 600; font-size: .9rem; color: var(–ink); }
.sys-tag { font-size: .72rem; color: var(–muted); margin-top: 4px; }
.sys-check {
position: absolute; top: 8px; right: 8px;
width: 18px; height: 18px;
background: currentColor;
border-radius: 50%;
display: none;
place-items: center;
color: #fff;
font-size: 10px;
}
.sys-card.selected .sys-check { display: grid; }
/* ── Form fields ── */
.field { margin-bottom: 20px; }
.field label {
display: block;
font-size: .82rem;
font-weight: 500;
color: var(–muted);
text-transform: uppercase;
letter-spacing: .06em;
margin-bottom: 7px;
}
.field input,
.field select,
.field textarea {
width: 100%;
border: 1.5px solid var(–border);
border-radius: 8px;
padding: 11px 14px;
font-family: ‘DM Sans’, sans-serif;
font-size: .95rem;
color: var(–ink);
background: var(–bg);
outline: none;
transition: border-color .2s;
}
.field input:focus,
.field select:focus,
.field textarea:focus { border-color: var(–accent); background: #fff; }
.field textarea { resize: vertical; min-height: 80px; }
.row-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
/* ── Radio buttons ── */
.radio-group { display: flex; flex-wrap: wrap; gap: 10px; }
.radio-pill {
border: 1.5px solid var(–border);
border-radius: 100px;
padding: 8px 18px;
font-size: .88rem;
cursor: pointer;
transition: all .2s;
}
.radio-pill input { display: none; }
.radio-pill:has(input:checked),
.radio-pill.checked {
border-color: var(–accent);
background: var(–accent-light);
color: var(–accent);
font-weight: 500;
}
/* ── Urgency slider ── */
.urgency-labels { display: flex; justify-content: space-between; font-size: .75rem; color: var(–muted); margin-top: 4px; }
input[type=range] {
width: 100%;
accent-color: var(–accent);
cursor: pointer;
}
/* ── Price estimate panel ── */
.estimate-panel {
background: var(–ink);
color: #fff;
border-radius: var(–radius);
padding: 24px 28px;
margin-bottom: 28px;
position: relative;
overflow: hidden;
}
.estimate-panel::after {
content: ”;
position: absolute;
right: -20px; bottom: -20px;
width: 120px; height: 120px;
background: rgba(201,74,30,.25);
border-radius: 50%;
}
.estimate-label { font-size: .78rem; text-transform: uppercase; letter-spacing: .1em; color: rgba(255,255,255,.5); margin-bottom: 6px; }
.estimate-range { font-family: ‘Playfair Display’, serif; font-size: 2.2rem; color: #fff; }
.estimate-note { font-size: .78rem; color: rgba(255,255,255,.45); margin-top: 6px; }
.estimate-breakdown {
display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 18px;
}
.breakdown-item { background: rgba(255,255,255,.07); border-radius: 8px; padding: 10px 14px; }
.breakdown-key { font-size: .73rem; color: rgba(255,255,255,.5); }
.breakdown-val { font-size: .9rem; font-weight: 500; margin-top: 2px; }
/* ── Summary ── */
.summary-row {
display: flex; justify-content: space-between; align-items: center;
padding: 10px 0;
border-bottom: 1px solid var(–border);
font-size: .9rem;
}
.summary-row:last-child { border-bottom: none; }
.summary-key { color: var(–muted); }
.summary-val { font-weight: 500; }
/* ── Buttons ── */
.btn-row {
display: flex; justify-content: space-between; align-items: center;
padding: 20px 40px 32px;
border-top: 1px solid var(–border);
}
.btn {
padding: 13px 28px;
border-radius: 8px;
font-family: ‘DM Sans’, sans-serif;
font-size: .93rem;
font-weight: 500;
cursor: pointer;
border: none;
transition: all .2s;
}
.btn-outline {
background: transparent;
border: 1.5px solid var(–border);
color: var(–muted);
}
.btn-outline:hover { border-color: var(–ink); color: var(–ink); }
.btn-primary {
background: var(–accent);
color: #fff;
display: flex; align-items: center; gap: 8px;
}
.btn-primary:hover { background: #b03d16; transform: translateY(-1px); box-shadow: 0 4px 16px rgba(201,74,30,.35); }
.btn-primary:disabled { opacity: .45; cursor: not-allowed; transform: none; box-shadow: none; }
/* ── Success ── */
.success-screen {
display: none;
text-align: center;
padding: 60px 40px;
}
.success-screen.visible { display: block; }
.success-icon { font-size: 3.5rem; margin-bottom: 20px; }
.success-screen h2 { font-family: ‘Playfair Display’, serif; font-size: 1.8rem; margin-bottom: 10px; }
.success-screen p { color: var(–muted); font-size: .95rem; line-height: 1.7; max-width: 400px; margin: 0 auto; }
/* ── Info tooltip ── */
.info-tip {
display: inline-block;
width: 16px; height: 16px;
background: var(–border);
border-radius: 50%;
text-align: center;
line-height: 16px;
font-size: 10px;
cursor: pointer;
margin-left: 4px;
vertical-align: middle;
color: var(–muted);
position: relative;
}
.info-tip:hover::after {
content: attr(data-tip);
position: absolute;
left: 50%; transform: translateX(-50%);
bottom: calc(100% + 6px);
background: var(–ink);
color: #fff;
font-size: .73rem;
padding: 6px 10px;
border-radius: 6px;
white-space: nowrap;
z-index: 10;
font-family: ‘DM Sans’, sans-serif;
font-weight: 400;
pointer-events: none;
}
@media(max-width: 560px) {
.step { padding: 28px 20px 20px; }
.btn-row { padding: 16px 20px 24px; }
.row-2 { grid-template-columns: 1fr; }
.estimate-breakdown { grid-template-columns: 1fr; }
}
</style>
</head>
<body>
<div class=”hero”>
<div class=”hero-inner”>
<p class=”hero-eyebrow”>Free Estimate · No Obligation</p>
<h1>Get a Quote for Your New Hot Water System</h1>
<p>Answer a few quick questions and we’ll give you an instant cost estimate, plus connect you with a licensed installer in your area.</p>
</div>
</div>
<div class=”card” id=”quoteCard”>
<div class=”progress-bar”><div class=”progress-fill” id=”progressFill”></div></div>
<!– Step 1: System Type –>
<div class=”step active” id=”step1″>
<div class=”step-header”>
<div class=”step-num”>1</div>
<div>
<div class=”step-title”>Choose Your System Type</div>
<div class=”step-sub”>Select the type of hot water system you’re interested in</div>
</div>
</div>
<div class=”system-grid”>
<div class=”sys-card gas” data-system=”gas” onclick=”selectSystem(this)”>
<div class=”sys-check”>✓</div>
<div class=”sys-icon”>🔥</div>
<div class=”sys-name”>Natural Gas</div>
<div class=”sys-tag”>Fast & affordable</div>
</div>
<div class=”sys-card electric” data-system=”electric” onclick=”selectSystem(this)”>
<div class=”sys-check”>✓</div>
<div class=”sys-icon”>⚡</div>
<div class=”sys-name”>Electric</div>
<div class=”sys-tag”>Simple & reliable</div>
</div>
<div class=”sys-card solar” data-system=”solar” onclick=”selectSystem(this)”>
<div class=”sys-check”>✓</div>
<div class=”sys-icon”>☀️</div>
<div class=”sys-name”>Solar</div>
<div class=”sys-tag”>Eco & low running cost</div>
</div>
<div class=”sys-card heatpump” data-system=”heatpump” onclick=”selectSystem(this)”>
<div class=”sys-check”>✓</div>
<div class=”sys-icon”>🌀</div>
<div class=”sys-name”>Heat Pump</div>
<div class=”sys-tag”>Ultra-efficient</div>
</div>
</div>
</div>
<!– Step 2: Property Details –>
<div class=”step” id=”step2″>
<div class=”step-header”>
<div class=”step-num”>2</div>
<div>
<div class=”step-title”>Property Details</div>
<div class=”step-sub”>Help us size the right system for your home</div>
</div>
</div>
<div class=”row-2″>
<div class=”field”>
<label>Number of Bedrooms</label>
<select id=”bedrooms”>
<option value=””>Select…</option>
<option value=”1-2″>1–2 bedrooms</option>
<option value=”3″>3 bedrooms</option>
<option value=”4″>4 bedrooms</option>
<option value=”5+”>5+ bedrooms</option>
</select>
</div>
<div class=”field”>
<label>Number of People <span class=”info-tip” data-tip=”Affects tank/unit capacity sizing”>i</span></label>
<select id=”people”>
<option value=””>Select…</option>
<option value=”1-2″>1–2 people</option>
<option value=”3-4″>3–4 people</option>
<option value=”5-6″>5–6 people</option>
<option value=”7+”>7+ people</option>
</select>
</div>
</div>
<div class=”field”>
<label>Existing System Type (if replacing)</label>
<select id=”existing”>
<option value=””>Select…</option>
<option value=”gas”>Gas</option>
<option value=”electric”>Electric</option>
<option value=”solar”>Solar</option>
<option value=”none”>No existing system (new install)</option>
<option value=”unknown”>Not sure</option>
</select>
</div>
<div class=”field”>
<label>Property Type</label>
<div class=”radio-group” id=”propTypeGroup”>
<label class=”radio-pill”><input type=”radio” name=”propType” value=”house”> House</label>
<label class=”radio-pill”><input type=”radio” name=”propType” value=”unit”> Unit / Apartment</label>
<label class=”radio-pill”><input type=”radio” name=”propType” value=”townhouse”> Townhouse</label>
<label class=”radio-pill”><input type=”radio” name=”propType” value=”commercial”> Commercial</label>
</div>
</div>
<div class=”field” id=”roofFieldWrap” style=”display:none;”>
<label>Roof Access / Orientation <span class=”info-tip” data-tip=”Solar & heat pump need roof space or outdoor area”>i</span></label>
<div class=”radio-group”>
<label class=”radio-pill”><input type=”radio” name=”roof” value=”north”> North-facing</label>
<label class=”radio-pill”><input type=”radio” name=”roof” value=”east-west”> East or West</label>
<label class=”radio-pill”><input type=”radio” name=”roof” value=”limited”> Limited space</label>
<label class=”radio-pill”><input type=”radio” name=”roof” value=”unsure”> Not sure</label>
</div>
</div>
</div>
<!– Step 3: Preferences –>
<div class=”step” id=”step3″>
<div class=”step-header”>
<div class=”step-num”>3</div>
<div>
<div class=”step-title”>Preferences & Timing</div>
<div class=”step-sub”>Fine-tune your quote</div>
</div>
</div>
<div class=”field”>
<label>Tank or Continuous Flow? <span class=”info-tip” data-tip=”Continuous flow heats on demand; tank stores hot water”>i</span></label>
<div class=”radio-group” id=”storageGroup”>
<label class=”radio-pill”><input type=”radio” name=”storage” value=”tank”> Storage Tank</label>
<label class=”radio-pill”><input type=”radio” name=”storage” value=”continuous”> Continuous Flow</label>
<label class=”radio-pill”><input type=”radio” name=”storage” value=”unsure”> No preference</label>
</div>
</div>
<div class=”field”>
<label>Priority <span class=”info-tip” data-tip=”Helps us weight your quote options”>i</span></label>
<div class=”radio-group”>
<label class=”radio-pill”><input type=”radio” name=”priority” value=”cheapest”> Lowest upfront cost</label>
<label class=”radio-pill”><input type=”radio” name=”priority” value=”running”> Lowest running cost</label>
<label class=”radio-pill”><input type=”radio” name=”priority” value=”eco”> Most eco-friendly</label>
<label class=”radio-pill”><input type=”radio” name=”priority” value=”balanced”> Balanced</label>
</div>
</div>
<div class=”field”>
<label>How Urgent? <span id=”urgencyLabel” style=”color:var(–accent);font-weight:600;”>Flexible timing</span></label>
<input type=”range” id=”urgency” min=”1″ max=”4″ value=”2″ oninput=”updateUrgency(this.value)”>
<div class=”urgency-labels”>
<span>No rush</span>
<span>Within a month</span>
<span>This week</span>
<span>Emergency!</span>
</div>
</div>
<div class=”field”>
<label>Additional Notes</label>
<textarea id=”notes” placeholder=”Anything else we should know — e.g. access issues, rebates you’ve seen, second hot water point…”></textarea>
</div>
</div>
<!– Step 4: Contact + Estimate –>
<div class=”step” id=”step4″>
<div class=”step-header”>
<div class=”step-num”>4</div>
<div>
<div class=”step-title”>Your Estimate</div>
<div class=”step-sub”>Based on your selections — final quote subject to site inspection</div>
</div>
</div>
<div class=”estimate-panel” id=”estimatePanel”>
<div class=”estimate-label”>Estimated Total Cost (Supply & Install)</div>
<div class=”estimate-range” id=”estimateRange”>$—</div>
<div class=”estimate-note” id=”estimateNote”>Select options above to see estimate</div>
<div class=”estimate-breakdown” id=”estimateBreakdown”></div>
</div>
<div id=”summaryRows”></div>
<div class=”field” style=”margin-top:24px;”>
<label>Your Name</label>
<input type=”text” id=”name” placeholder=”Jane Smith”>
</div>
<div class=”row-2″>
<div class=”field”>
<label>Phone</label>
<input type=”tel” id=”phone” placeholder=”04xx xxx xxx”>
</div>
<div class=”field”>
<label>Email</label>
<input type=”email” id=”email” placeholder=”jane@email.com”>
</div>
</div>
<div class=”field”>
<label>Suburb / Postcode</label>
<input type=”text” id=”suburb” placeholder=”e.g. Bondi 2026″>
</div>
</div>
<!– Success –>
<div class=”success-screen” id=”successScreen”>
<div class=”success-icon”>✅</div>
<h2>Quote Request Received!</h2>
<p>Thanks! One of our licensed installers will be in touch within 24 hours to confirm your quote and book a convenient time.</p>
<br>
<p style=”font-size:.82rem;color:var(–muted);”>Check your inbox for a copy of your estimate.</p>
</div>
<!– Navigation –>
<div class=”btn-row” id=”btnRow”>
<button class=”btn btn-outline” id=”backBtn” onclick=”prevStep()” style=”visibility:hidden;”>← Back</button>
<button class=”btn btn-primary” id=”nextBtn” onclick=”nextStep()” disabled>
Continue <span>→</span>
</button>
</div>
</div>
<script>
let currentStep = 1;
const totalSteps = 4;
let selectedSystem = null;
const urgencyTexts = [‘No rush — flexible timing’,’Within the next month’,’This week if possible’,’Emergency — ASAP!’];
const estimates = {
gas: {
tank: { low: 1200, high: 2200, unit: ‘$1,200 – $2,200’, supply: ‘$600–$1,100’, install: ‘$600–$1,100’, running: ‘~$800/yr’ },
continuous: { low: 1400, high: 2600, unit: ‘$1,400 – $2,600’, supply: ‘$800–$1,400’, install: ‘$600–$1,200’, running: ‘~$700/yr’ },
unsure: { low: 1200, high: 2600, unit: ‘$1,200 – $2,600’, supply: ‘$600–$1,400’, install: ‘$600–$1,200’, running: ‘~$750/yr’ },
},
electric: {
tank: { low: 800, high: 1800, unit: ‘$800 – $1,800’, supply: ‘$400–$900’, install: ‘$400–$900’, running: ‘~$900/yr’ },
continuous: { low: 900, high: 1900, unit: ‘$900 – $1,900’, supply: ‘$500–$1,000’,install: ‘$400–$900’, running: ‘~$850/yr’ },
unsure: { low: 800, high: 1900, unit: ‘$800 – $1,900’, supply: ‘$400–$1,000’,install: ‘$400–$900’, running: ‘~$870/yr’ },
},
solar: {
tank: { low: 3500, high: 7000, unit: ‘$3,500 – $7,000’, supply: ‘$2,500–$5,000’,install: ‘$1,000–$2,000’, running: ‘~$150/yr’ },
continuous: { low: 4000, high: 8000, unit: ‘$4,000 – $8,000’, supply: ‘$3,000–$6,000’,install: ‘$1,000–$2,000’, running: ‘~$120/yr’ },
unsure: { low: 3500, high: 8000, unit: ‘$3,500 – $8,000’, supply: ‘$2,500–$6,000’,install: ‘$1,000–$2,000’, running: ‘~$135/yr’ },
},
heatpump: {
tank: { low: 2800, high: 5500, unit: ‘$2,800 – $5,500’, supply: ‘$2,000–$4,000’,install: ‘$800–$1,500’, running: ‘~$250/yr’ },
continuous: { low: 3000, high: 5800, unit: ‘$3,000 – $5,800’, supply: ‘$2,200–$4,300’,install: ‘$800–$1,500’, running: ‘~$230/yr’ },
unsure: { low: 2800, high: 5800, unit: ‘$2,800 – $5,800’, supply: ‘$2,000–$4,300’,install: ‘$800–$1,500’, running: ‘~$240/yr’ },
},
};
const systemLabels = { gas:’Natural Gas’, electric:’Electric’, solar:’Solar’, heatpump:’Heat Pump’ };
function updateProgress() {
document.getElementById(‘progressFill’).style.width = ((currentStep / totalSteps) * 100) + ‘%’;
}
function selectSystem(el) {
document.querySelectorAll(‘.sys-card’).forEach(c => c.classList.remove(‘selected’));
el.classList.add(‘selected’);
selectedSystem = el.dataset.system;
// show roof field for solar/heatpump
document.getElementById(‘roofFieldWrap’).style.display =
(selectedSystem === ‘solar’ || selectedSystem === ‘heatpump’) ? ‘block’ : ‘none’;
validateStep();
}
function validateStep() {
let valid = false;
if (currentStep === 1) valid = !!selectedSystem;
if (currentStep === 2) {
valid = !!document.getElementById(‘bedrooms’).value &&
!!document.getElementById(‘people’).value &&
!!document.querySelector(‘input[name=”propType”]:checked’);
}
if (currentStep === 3) {
valid = !!document.querySelector(‘input[name=”storage”]:checked’) &&
!!document.querySelector(‘input[name=”priority”]:checked’);
}
if (currentStep === 4) {
valid = !!document.getElementById(‘name’).value.trim() &&
!!document.getElementById(‘phone’).value.trim() &&
!!document.getElementById(’email’).value.trim();
}
document.getElementById(‘nextBtn’).disabled = !valid;
}
function updateUrgency(val) {
document.getElementById(‘urgencyLabel’).textContent = urgencyTexts[val – 1];
}
function buildEstimate() {
const storage = (document.querySelector(‘input[name=”storage”]:checked’) || {}).value || ‘unsure’;
const data = (estimates[selectedSystem] || {})[storage] || {};
if (!data.unit) return;
document.getElementById(‘estimateRange’).textContent = data.unit;
document.getElementById(‘estimateNote’).textContent =
‘Estimate includes supply, standard installation & commissioning. Rebates may reduce this.’;
let rebateNote = ”;
if (selectedSystem === ‘solar’) rebateNote = ‘★ STCs rebate may save $600–$1,200’;
if (selectedSystem === ‘heatpump’) rebateNote = ‘★ Govt rebates may save $400–$900’;
document.getElementById(‘estimateBreakdown’).innerHTML = `
<div class=”breakdown-item”><div class=”breakdown-key”>Supply / Unit</div><div class=”breakdown-val”>${data.supply}</div></div>
<div class=”breakdown-item”><div class=”breakdown-key”>Installation</div><div class=”breakdown-val”>${data.install}</div></div>
<div class=”breakdown-item”><div class=”breakdown-key”>Est. Annual Running</div><div class=”breakdown-val”>${data.running}</div></div>
${rebateNote ? `<div class=”breakdown-item” style=”grid-column:1/-1″><div class=”breakdown-key”>Rebates</div><div class=”breakdown-val” style=”color:#c94a1e”>${rebateNote}</div></div>` : ”}
`;
// summary
const priority = (document.querySelector(‘input[name=”priority”]:checked’) || {}).value || ‘—’;
const priorityMap = { cheapest:’Lowest upfront cost’, running:’Lowest running cost’, eco:’Most eco-friendly’, balanced:’Balanced’ };
const urgVal = document.getElementById(‘urgency’).value;
const rows = [
[‘System type’, systemLabels[selectedSystem]],
[‘Storage preference’, storage === ‘unsure’ ? ‘No preference’ : (storage === ‘tank’ ? ‘Storage tank’ : ‘Continuous flow’)],
[‘Household size’, document.getElementById(‘people’).value + ‘ people’],
[‘Bedrooms’, document.getElementById(‘bedrooms’).value],
[‘Priority’, priorityMap[priority] || priority],
[‘Timing’, urgencyTexts[urgVal – 1]],
];
document.getElementById(‘summaryRows’).innerHTML = rows.map(([k,v]) =>
`<div class=”summary-row”><span class=”summary-key”>${k}</span><span class=”summary-val”>${v}</span></div>`
).join(”);
}
function nextStep() {
if (currentStep < totalSteps) {
document.getElementById(‘step’ + currentStep).classList.remove(‘active’);
currentStep++;
document.getElementById(‘step’ + currentStep).classList.add(‘active’);
document.getElementById(‘backBtn’).style.visibility = ‘visible’;
document.getElementById(‘nextBtn’).innerHTML = currentStep === totalSteps
? ‘📩 Send My Quote Request’ : ‘Continue <span>→</span>’;
if (currentStep === totalSteps) buildEstimate();
updateProgress();
validateStep();
} else {
// Submit
document.getElementById(‘quoteCard’).querySelector(‘.progress-fill’).style.width = ‘100%’;
document.getElementById(‘btnRow’).style.display = ‘none’;
for (let i = 1; i <= 4; i++) document.getElementById(‘step’ + i).classList.remove(‘active’);
document.getElementById(‘successScreen’).classList.add(‘visible’);
}
}
function prevStep() {
if (currentStep > 1) {
document.getElementById(‘step’ + currentStep).classList.remove(‘active’);
currentStep–;
document.getElementById(‘step’ + currentStep).classList.add(‘active’);
if (currentStep === 1) document.getElementById(‘backBtn’).style.visibility = ‘hidden’;
document.getElementById(‘nextBtn’).innerHTML = ‘Continue <span>→</span>’;
updateProgress();
validateStep();
}
}
// Live validation listeners
document.querySelectorAll(‘select, input[type=text], input[type=tel], input[type=email]’).forEach(el => {
el.addEventListener(‘input’, validateStep);
el.addEventListener(‘change’, validateStep);
});
document.querySelectorAll(‘input[type=radio]’).forEach(el => {
el.addEventListener(‘change’, validateStep);
});
// Style radio pills on change
document.querySelectorAll(‘.radio-pill input’).forEach(inp => {
inp.addEventListener(‘change’, () => {
document.querySelectorAll(`input[name=”${inp.name}”]`).forEach(i => {
i.closest(‘.radio-pill’).classList.toggle(‘checked’, i.checked);
});
});
});
updateProgress();
</script>
</body>
</html>
