Business Configuration
๐Ÿ˜๏ธ

Configure your business and click Generate Pages

Or click Load Example to see a demo

${body} `; } function generateSuburbPage(suburb, config) { const { business, services, industry } = config; const tmpl = INDUSTRY_TEMPLATES[industry] || INDUSTRY_TEMPLATES.flooring; const slug = slugify(suburb.name); const title = `${business.name} โ€” ${tmpl.hero} in ${suburb.name} QLD`; const desc = `${business.name} provides ${tmpl.keywords.slice(0,2).join(' and ')} in ${suburb.name} QLD ${suburb.postcode}. ${tmpl.intro} Call ${business.phone} for a free quote.`; const canonical = `${business.website}/${slug}`; const body = `

${tmpl.icon} ${tmpl.hero} in ${suburb.name}

${business.name} โ€” ${business.generations ? business.generations + ' generations' : (business.yearsExperience ? business.yearsExperience + ' years' : 'Professional')} of expertise serving ${suburb.name} QLD ${suburb.postcode}. ${suburb.commonProjects || tmpl.intro}

${business.yearsExperience ? `
${business.yearsExperience}+
Years Experience
` : ''} ${business.generations ? `
${business.generations}
${business.generations > 1 ? 'Generations' : 'Generation'}
` : ''}
5.0โ˜…
Google Rating
24h
Quote Turnaround
${suburb.highlights && suburb.highlights.length ? `

Why ${suburb.name} Homeowners Choose ${business.name}

${suburb.highlights.map(h => `

${h}

`).join('\n ')}
` : ''}

Our Services in ${suburb.name}

${services.map(s => `

${s}

Professional ${s.toLowerCase()} services for ${suburb.name} homes and businesses.

`).join('\n ')}

Ready to Get Started?

Get a free, no-obligation quote for your ${suburb.name} property.

`; return generatePageHTML({ title, description: desc, body, canonicalUrl: canonical, config }); } function generateHubPage(config) { const { business, services, hub, suburbs, industry } = config; const tmpl = INDUSTRY_TEMPLATES[industry] || INDUSTRY_TEMPLATES.flooring; const title = `${business.name} โ€” ${tmpl.hero} Across ${hub.name || 'Brisbane'}`; const desc = `${business.name} provides ${services.slice(0, 3).join(', ')} across ${hub.name || 'the local area'}. ${hub.description || ''}`; const canonical = `${business.website}/service-areas`; const body = `

${tmpl.icon} ${tmpl.hero} Across ${hub.name || 'Our Service Area'}

${hub.description || `${business.name} serves communities across ${hub.name}.`}

Areas We Service

${suburbs.map(s => `

${s.name} QLD ${s.postcode}

${s.commonProjects || 'Full range of services available.'}

`).join('\n ')}

Our Services

${services.map(s => `

${s}

Available across all service areas.

`).join('\n ')}
`; return generatePageHTML({ title, description: desc, body, canonicalUrl: canonical, config }); } function generateSitemap(config) { const base = config.business.website.replace(/\/$/, ''); const urls = [`${base}/service-areas`]; config.suburbs.forEach(s => urls.push(`${base}/${slugify(s.name)}`)); return ` ${urls.map(u => ` ${u}monthly0.8`).join('\n')} `; } // --- Generate All --- function generateAll() { const config = getConfig(); if (!config.business.name) { alert('Please enter a business name'); return; } if (config.suburbs.length === 0) { alert('Please add at least one suburb'); return; } generatedPages = {}; // Hub page if (config.hub.name) { generatedPages['service-areas.html'] = generateHubPage(config); } // Suburb pages config.suburbs.forEach(s => { generatedPages[`${slugify(s.name)}.html`] = generateSuburbPage(s, config); }); // Sitemap generatedPages['sitemap.xml'] = generateSitemap(config); renderPreview(); } // --- Preview --- function renderPreview() { const keys = Object.keys(generatedPages); if (keys.length === 0) return; const area = document.getElementById('previewArea'); const htmlPages = keys.filter(k => k.endsWith('.html')); area.innerHTML = `

Generated Pages

${htmlPages.length}
Pages
${keys.filter(k => !k.includes('service-areas')).length - 1}
Suburb Pages
โœ“
Sitemap
${keys.map((k, i) => `
${k}
`).join('')}
`; } function showPage(key, tab) { document.querySelectorAll('.page-tab').forEach(t => t.classList.remove('active')); tab.classList.add('active'); document.getElementById('previewFrame').srcdoc = generatedPages[key]; } function escapeHtml(str) { return str.replace(/&/g,'&').replace(/"/g,'"').replace(//g,'>'); } // --- Download --- function downloadAll() { // Download each file individually (no zip lib needed) Object.entries(generatedPages).forEach(([name, content]) => { const blob = new Blob([content], { type: name.endsWith('.xml') ? 'application/xml' : 'text/html' }); const a = document.createElement('a'); a.href = URL.createObjectURL(blob); a.download = name; a.click(); }); } // --- Load Example --- function loadExample() { document.getElementById('industry').value = 'flooring'; selectedIndustry = 'flooring'; document.getElementById('bizName').value = 'Turner Installs'; document.getElementById('bizTagline').value = "Brisbane's Premier Flooring Specialists"; document.getElementById('bizPhone').value = '0413 592 054'; document.getElementById('bizEmail').value = 'liam@turnerinstalls.com'; document.getElementById('bizWebsite').value = 'https://www.turnerinstalls.com.au'; document.getElementById('bizYears').value = '15'; document.getElementById('bizGens').value = '3'; document.getElementById('bizBased').value = 'Oxley, Brisbane'; document.getElementById('bizRadius').value = '30 minutes from Oxley'; document.getElementById('hubName').value = 'Western Brisbane'; document.getElementById('hubDesc').value = "Brisbane's western corridor including Jindalee, Kenmore, Graceville, Pinjarra Hills, St Lucia, Bulimba and surrounding suburbs."; services = ['Floor sanding and polishing', 'Timber floor installation', 'Hybrid floor installation', 'Vinyl plank flooring', 'Floor preparation and levelling', 'Grinding and adhesive removal']; renderServices(); suburbs = [ { name: 'Jindalee', postcode: '4074', commonProjects: 'Floor prep for kitchen renovations, timber to hybrid conversions', highlights: ['Modern family homes along the Centenary corridor', 'Established neighbourhood with many renovation projects'] }, { name: 'Kenmore', postcode: '4069', commonProjects: 'Extension floor prep, tile removal, and whole-house installations', highlights: ['Large family homes on Brisbane\'s western fringe', 'Active renovation market'] }, { name: 'Graceville', postcode: '4075', commonProjects: 'Heritage Queenslander floor restoration and polished timber installations', highlights: ['Renowned heritage Queenslanders', 'High-end renovations demand precision work'] }, ]; renderSuburbs(); generateAll(); } // Enter key handlers document.getElementById('newService').addEventListener('keydown', e => { if (e.key === 'Enter') addService(); }); document.getElementById('newHighlight').addEventListener('keydown', e => { if (e.key === 'Enter') addHighlight(); });