// Home tweaks: hero variant, accent color, headline, badge toggle.
// Imagery is real photos from /images — no toggle.
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
"accentColor": "#f26a1f",
"headline": "AC Out? We'll be there today — or it's free.",
"subheadline": "Austin's heat doesn't wait, and neither do we. EverFlow technicians arrive within hours, diagnose for free, and fix it right the first time. Backed by our same-day guarantee since 2014.",
"heroVariant": "split",
"showEmergencyBadge": true
}/*EDITMODE-END*/;
const IMG = {
hero: 'images/hero.jpg',
acRepair: 'images/ac-repair.jpg',
acInstall: 'images/ac-install.jpg',
heating: 'images/heating.jpg',
maintenance: 'images/maintenance.jpg',
why: 'images/why-us.jpg'
};
const PHONE_ICON = (
);
function HeroSplit({ t }) {
return (
Same-day service · Austin, TX
{t.subheadline}
4.9★ 2,847 Google reviews
12+ yrs Serving Austin
90 min Avg. arrival time
{t.showEmergencyBadge && (
<>
On-Time Guarantee
$25 off if we're late
Booked at 9:14 AM
Tech arriving by 11:00
>
)}
);
}
function HeroCentered({ t }) {
return (
Same-day service · Austin, TX
{t.subheadline}
4.9★ 2,847 Google reviews
12+ yrs Serving Austin
90 min Avg. arrival time
);
}
const SERVICES = [
{ id: 'ac-repair', img: IMG.acRepair, title: 'AC Repair', body: 'Diagnostic in 30 minutes, most repairs same day. Capacitors, compressors, refrigerant leaks — all of it.' },
{ id: 'ac-install', img: IMG.acInstall, title: 'AC Installation', body: 'New high-efficiency systems from Trane, Carrier, and Lennox. 10-year parts warranty, financing in minutes.' },
{ id: 'heating', img: IMG.heating, title: 'Heating Repair', body: "Furnaces, heat pumps, gas and electric. Pilot won't light? Blowing cold? We're on it before the next cold front." },
{ id: 'maintenance', img: IMG.maintenance, title: 'Maintenance Plans', body: 'Two tune-ups a year, 15% off repairs, priority booking. Starts at $14.95/month — cancel anytime.' }
];
function ServicesGrid() {
return (
);
}
function hexToRgb(h) {
const m = h.replace('#','').match(/.{1,2}/g);
return m ? m.map(x => parseInt(x, 16)) : [242,106,31];
}
function shade(hex, amt) {
const [r,g,b] = hexToRgb(hex).map(c => Math.max(0, Math.min(255, c + amt)));
return `rgb(${r}, ${g}, ${b})`;
}
function rgba(hex, a) {
const [r,g,b] = hexToRgb(hex);
return `rgba(${r}, ${g}, ${b}, ${a})`;
}
function App() {
const [t, setTweak] = useTweaks(TWEAK_DEFAULTS);
// Apply accent color globally
React.useEffect(() => {
document.body.style.setProperty('--accent-color', t.accentColor);
document.body.style.setProperty('--accent-color-dark', shade(t.accentColor, -25));
document.body.style.setProperty('--accent-color-bg', rgba(t.accentColor, 0.1));
}, [t.accentColor]);
return (
<>
{t.heroVariant === 'split' ? : }
setTweak('heroVariant', v)}
/>
setTweak('headline', v)}
/>
setTweak('subheadline', v)}
/>
setTweak('showEmergencyBadge', v)}
/>
setTweak('accentColor', v)}
/>
>
);
}
function ServicesApp() {
return ;
}
function WhyImage() {
return ;
}
ReactDOM.createRoot(document.getElementById('hero-root')).render( );
ReactDOM.createRoot(document.getElementById('services-root')).render( );
ReactDOM.createRoot(document.getElementById('why-image-root')).render( );