// "Bring us your house" — photo-upload-to-quote panel const ZONES = [ { id:'eaves', label:'Eaves' }, { id:'soffits', label:'Soffits' }, { id:'columns', label:'Columns' }, { id:'landscape', label:'Landscape' }, { id:'fascia', label:'Fascia' }, { id:'pool', label:'Pool / Patio' }, { id:'dock', label:'Dock' }, { id:'fence', label:'Fence Line' }, ]; const CONFIG_PRESETS = [ { id:'everyday', name:'Everyday Warm', color:'#FFB347' }, { id:'gameday', name:'Game Day', color:'#C8102E' }, { id:'christmas', name:'Christmas', color:'#0E8C3A', alt:'#C8102E' }, { id:'july4', name:'July 4th', color:'#1A4DCF', alt:'#C8102E' }, { id:'halloween', name:'Halloween', color:'#FF7A00', alt:'#7A2DCF' }, ]; function ConfiguratorSection({ onQuote }){ const [zones,setZones] = useState({eaves:true, soffits:false, columns:true, landscape:true, fascia:false, pool:false, dock:false, fence:false}); const [preset,setPreset] = useState('everyday'); const [photo, setPhoto] = useState(null); const fileRef = useRef(null); const handleFile = (file) => { if (!file) return; const reader = new FileReader(); reader.onload = (e) => setPhoto(e.target.result); reader.readAsDataURL(file); }; return (
BRING US YOUR HOUSE
Send a photo. We'll mock it up.

Drop a daytime photo of your home, mark the zones you're interested in, pick a scene. Our team renders your actual property in 3D and emails you back within 48 hours.

{/* PHOTO DROPZONE */}
{e.preventDefault();e.currentTarget.style.borderColor='var(--thraxel-red)'}} onDragLeave={e=>{e.currentTarget.style.borderColor='#3a3a40'}} onDrop={e=>{e.preventDefault();e.currentTarget.style.borderColor='#3a3a40';handleFile(e.dataTransfer.files[0]);}} onClick={()=>!photo && fileRef.current?.click()} style={{ position:'relative', minHeight: 520, width:'100%', background: photo ? '#0a0a0a' : 'linear-gradient(135deg,#161616 0%,#0a0a0a 100%)', border:'2px dashed #3a3a40', cursor: photo ? 'default' : 'pointer', overflow:'hidden', display:'flex',alignItems:'center',justifyContent:'center', transition:'border-color .2s ease', }}> handleFile(e.target.files[0])}/> {photo ? ( <> {/* zone overlays */}
{zones.eaves && (
p.id===preset).color+',transparent)',boxShadow:'0 0 12px '+CONFIG_PRESETS.find(p=>p.id===preset).color, animation:'pulse 2s ease-in-out infinite'}}/> )} {zones.soffits && (
p.id===preset).color,boxShadow:'0 0 8px '+CONFIG_PRESETS.find(p=>p.id===preset).color,opacity:0.7}}/> )} {zones.columns && ( <>
p.id===preset).color,boxShadow:'0 0 8px '+CONFIG_PRESETS.find(p=>p.id===preset).color}}/>
p.id===preset).color,boxShadow:'0 0 8px '+CONFIG_PRESETS.find(p=>p.id===preset).color}}/> )} {zones.landscape && Array.from({length:8}).map((_,i)=>(
p.id===preset).color, boxShadow:'0 0 16px '+CONFIG_PRESETS.find(p=>p.id===preset).color+', 0 0 32px '+CONFIG_PRESETS.find(p=>p.id===preset).color, animation:`pulse ${2+i*0.1}s ease-in-out infinite`, }}/> ))}
{/* corner badge */}
● PREVIEW
) : (
Drop a photo of your home

Daytime, front-facing works best. We accept JPG, PNG, HEIC. We'll mark up the zones, render your scene preset, and send it back to you.

SELECT FILE OR DRAG HERE
)}
{/* CONTROLS */}
Zones of interest
{ZONES.map(z=>( ))}
Preview scene
{CONFIG_PRESETS.map(p=>( ))}
); } Object.assign(window, { ConfiguratorSection });