/* Goodman Decorators site — shared shell: header (with mega menu), footer, section helpers, and the estimate wizard/modal. Composes GDL primitives only. */ const GDL = window.GoodmanDesignLanguageGDL_01a123; const BIZ = { name: 'Goodman Painters & Decorators Inc', brand: 'Goodman', brandSuffix: 'Painters & Decorators', phone: '(872) 235-7481', phoneHref: 'tel:+18722357481', email: 'goodmandecorators@gmail.com', address: '2415 W Arthur Ave, Chicago, IL 60645', rating: '4.9★', reviews: '43 Google reviews', since: '2010', logo: 'assets/goodman-mark.webp', areas: 'Chicago & the North/Northwest suburbs — Evanston, Skokie, Lincolnwood, Park Ridge, Wilmette, Niles, Morton Grove, Des Plaines', }; const NAV_LINKS = ['Services', 'Portfolio', 'Locations', 'Contact']; const NAV_MAP = { 'Services': 'Services.html', 'Portfolio': 'Portfolio.html', 'Locations': 'Locations.html', 'Contact': 'Estimate.html', 'Interior painting': 'Interior Painting.html', 'Exterior painting': 'Services.html', 'Kitchen remodeling': 'Services.html', 'Bathroom remodeling': 'Services.html', 'Basement finishing': 'Services.html', 'Drywall & plaster': 'Services.html', 'Flooring': 'Services.html', 'Cabinet painting': 'Services.html', 'Handyman services': 'Services.html', 'Commercial': 'Services.html', 'About us': 'Home.html', 'Reviews': 'Portfolio.html', 'Get a free estimate': 'Estimate.html', 'Pay an invoice': 'Pay Invoice.html', 'Privacy policy': 'Privacy Policy.html', 'Terms & conditions': 'Terms & Conditions.html', 'Cookie policy': 'Cookie Policy.html', }; function Eyebrow({ children, style }) { return {children}; } function Section({ children, bg, style, id }) { return
{children}
; } function SectionHeading({ eyebrow, title, lede, center, maxWidth = 620 }) { return (
{eyebrow && {eyebrow}}

{title}

{lede &&

{lede}

}
); } function Breadcrumbs({ trail }) { return ( ); } /* ---------- Header with mega menu + real navigation ---------- */ function SiteHeader({ active, onCta }) { const [menu, setMenu] = React.useState(false); const [mobileOpen, setMobileOpen] = React.useState(false); const handleClick = (e) => { const a = e.target.closest('a'); if (!a) return; const href = a.getAttribute('href') || ''; if (href.startsWith('tel:') || href.startsWith('mailto:')) return; if (href && href !== '#') return; // real link — let it navigate e.preventDefault(); const label = a.textContent.trim(); if (NAV_MAP[label]) { window.location.href = NAV_MAP[label]; return; } if (a.querySelector('img') || label.startsWith('Goodman')) window.location.href = 'Home.html'; }; const handleOver = (e) => { const a = e.target.closest('a'); if (a && a.textContent.trim() === 'Services') setMenu(true); }; return (
setMenu(false)}>
{mobileOpen && (
{ handleClick(e); setMobileOpen(false); }} style={{ position: 'absolute', top: '100%', left: 0, right: 0, background: 'var(--canvas)', borderBottom: '1px solid var(--border-subtle)', boxShadow: 'var(--elevation-3)', display: 'flex', flexDirection: 'column', padding: '8px var(--gutter) 20px', maxHeight: 'calc(100vh - 76px)', overflowY: 'auto' }}> {NAV_LINKS.map((l) => ( {l} ))} {BIZ.phone}
)} {menu && (
)}
); } /* ---------- Footer ---------- */ function SiteFooter() { const wrapClick = (e) => { const a = e.target.closest('a'); if (!a) return; const href = a.getAttribute('href') || ''; if (href.startsWith('tel:') || href.startsWith('mailto:')) return; if (href && href !== '#') return; e.preventDefault(); const label = a.textContent.trim(); if (NAV_MAP[label]) window.location.href = NAV_MAP[label]; }; return (
© {new Date().getFullYear()} Goodman Painters & Decorators Inc
Privacy policy Terms & conditions Cookie policy
); } /* ---------- Estimate wizard ---------- */ const WIZARD_SERVICES = ['Interior painting', 'Exterior painting', 'Kitchen remodel', 'Bathroom remodel', 'Basement finishing', 'Cabinet painting', 'Flooring', 'Drywall & plaster', 'Handyman / repairs']; function EstimateWizard({ onDone }) { const { Button, Icon, Input, Select, Textarea, Tag } = GDL; const [step, setStep] = React.useState(0); const [form, setForm] = React.useState({ service: null, timing: '', address: '', budget: '', details: '', name: '', phone: '', email: '' }); const set = (k) => (v) => setForm((f) => ({ ...f, [k]: v })); const setInput = (k) => (e) => set(k)(e && e.target ? e.target.value : e); const steps = ['Your project', 'The details', 'About you']; return (
{steps.map((s, i) => ( {i > 0 &&
}
{i < step ? : i + 1} {s}
))}
{step === 0 && (
What do you need done?
{WIZARD_SERVICES.map((s) => set('service')(s)}>{s})}
} />