// Componentes compartidos: Header, Footer, VehicleCard, WhatsApp, placeholder de auto
const { useState, useEffect, useRef, useMemo, useCallback } = React;
// --- ICONOS (SVG inline) ---
const Icon = {
Arrow: (p) => ,
ArrowDown: (p) => ,
Search: (p) => ,
Whatsapp: (p) => ,
Phone: (p) => ,
MapPin: (p) => ,
Filter: (p) => ,
Grid: (p) => ,
Check: (p) => ,
Rotate: (p) => ,
X: (p) =>
};
// --- Placeholder de auto: SVG silueta sobre fondo ---
const CarPlaceholder = ({ label, rotation = 0, accent }) => {
// Silueta de auto genérica, gira sobre el eje vertical (sólo escala X)
const scaleX = Math.cos((rotation * Math.PI) / 180);
const skew = Math.sin((rotation * Math.PI) / 180) * 5;
return (
{label &&
{label}
}
);
};
// --- HEADER ---
const Header = ({ current, onNav }) => {
const [scrolled, setScrolled] = useState(false);
const [menuOpen, setMenuOpen] = useState(false);
useEffect(() => {
const on = () => setScrolled(window.scrollY > 20);
window.addEventListener('scroll', on);
on();
return () => window.removeEventListener('scroll', on);
}, []);
// Bloquea el scroll del body mientras el menú móvil está abierto
useEffect(() => {
document.body.style.overflow = menuOpen ? 'hidden' : '';
return () => { document.body.style.overflow = ''; };
}, [menuOpen]);
// Cerrar el menú al navegar (mobile)
const go = (...args) => { setMenuOpen(false); onNav(...args); };
return (
);
};
// --- WHATSAPP FLOATING ---
const WhatsappFloat = () => (
Chatear con un asesor
);
// --- VEHICLE CARD ---
const VehicleCard = ({ v, onClick }) => {
const { fmtPrecio, fmtKm } = window.OMEGA_HELPERS;
return (
onClick(v.id)}>
{v.photos && v.photos.length > 0
?

:
}
{v.tag &&
{v.tag}
}
{v.photos && v.photos.length > 1 && (
{v.photos.length}
)}
{v.anio}
{fmtKm(v.km)}
{v.transmision === 'Automática' ? 'AT' : 'MT'}
{v.marca}
{v.modelo}
);
};
// --- REVEAL ON SCROLL ---
const Reveal = ({ children, delay = 0, className = '' }) => {
const ref = useRef();
const [shown, setShown] = useState(false);
useEffect(() => {
const obs = new IntersectionObserver((entries) => {
entries.forEach(e => {
if (e.isIntersecting) {
setTimeout(() => setShown(true), delay);
obs.disconnect();
}
});
}, { threshold: 0.15 });
if (ref.current) obs.observe(ref.current);
return () => obs.disconnect();
}, [delay]);
return {children}
;
};
// --- REQUEST CAR FORM: lead capture cuando el vehículo no está en stock ---
const RequestCarForm = ({ preset, variant = 'block' }) => {
const { marcas, carrocerias } = window.OMEGA_DATA;
const { fmtPrice } = window.OMEGA_HELPERS;
const [form, setForm] = useState({
marca: preset?.marca && preset.marca !== 'Todas' ? preset.marca : '',
modelo: '',
carroceria: preset?.carroceria && preset.carroceria !== 'Todas' ? preset.carroceria : '',
anioDesde: '',
precioMax: preset?.precioMax || 25000000,
nombre: '', tel: '', email: '', comentarios: ''
});
const [sent, setSent] = useState(false);
useEffect(() => {
if (preset) {
setForm(f => ({
...f,
marca: preset.marca && preset.marca !== 'Todas' ? preset.marca : f.marca,
carroceria: preset.carroceria && preset.carroceria !== 'Todas' ? preset.carroceria : f.carroceria,
precioMax: preset.precioMax || f.precioMax
}));
}
}, [preset]);
const submit = (e) => {
e.preventDefault();
// Construir mensaje para WhatsApp
const lines = [
'🚗 *NUEVA SOLICITUD DE BÚSQUEDA · OMEGA*',
'',
'*Auto buscado*',
`• Marca: ${form.marca || 'Cualquiera'}`,
`• Modelo: ${form.modelo || '—'}`,
`• Tipo: ${form.carroceria || 'Cualquiera'}`,
`• Año desde: ${form.anioDesde || '—'}`,
`• Presupuesto máximo: ${fmtPrice(form.precioMax)}`,
'',
'*Contacto*',
`• Nombre: ${form.nombre}`,
`• Teléfono: ${form.tel}`,
`• Email: ${form.email}`,
form.comentarios ? `\n*Comentarios:*\n${form.comentarios}` : ''
].filter(Boolean);
const text = encodeURIComponent(lines.join('\n'));
const url = `https://wa.me/${window.OMEGA_CONFIG.whatsapp}?text=${text}`;
// Persistir en Supabase para que aparezca en la bandeja del admin
if (window.OMEGA_STORE?.createLead) {
window.OMEGA_STORE.createLead({
tipo: 'busqueda',
nombre: form.nombre,
telefono: form.tel,
email: form.email,
marca_buscada: form.marca || null,
modelo_buscado: form.modelo || null,
carroceria_buscada: form.carroceria || null,
anio_desde: form.anioDesde ? parseInt(form.anioDesde) : null,
presupuesto: form.precioMax,
mensaje: form.comentarios || null,
payload: form
}).catch(e => console.warn('Lead no se pudo guardar:', e));
}
// Abrir WhatsApp en nueva pestaña
window.open(url, '_blank', 'noopener');
setSent(true);
setTimeout(() => setSent(false), 8000);
};
if (sent) {
return (
Solicitud enviada
Te lo conseguimos.
Recibimos tu pedido. Vamos a consultar con nuestra red de agencias y un asesor te contacta dentro de las próximas 24 horas hábiles.
);
}
return (
);
};
// --- MODAL WRAPPER ---
const Modal = ({ open, onClose, children }) => {
useEffect(() => {
if (!open) return;
const onKey = (e) => { if (e.key === 'Escape') onClose(); };
document.body.style.overflow = 'hidden';
window.addEventListener('keydown', onKey);
return () => { document.body.style.overflow = ''; window.removeEventListener('keydown', onKey); };
}, [open, onClose]);
if (!open) return null;
return (
e.stopPropagation()}>
{children}
);
};
// Expose globally
Object.assign(window, { Icon, CarPlaceholder, Header, WhatsappFloat, VehicleCard, Reveal, RequestCarForm, Modal });