// ============================================
// Sections — Grupo Luna
// ============================================
const { useEffect: useEffect2, useRef: useRef2, useState: useState2 } = React;
// ---- Reveal hook: adds .in class when scrolled into view ----
function useReveal() {
useEffect2(() => {
const els = document.querySelectorAll('[data-reveal]');
const io = new IntersectionObserver((entries) => {
entries.forEach(e => {
if (e.isIntersecting) {
e.target.classList.add('in');
io.unobserve(e.target);
}
});
}, { threshold: 0.12, rootMargin: '0px 0px -80px 0px' });
els.forEach(el => io.observe(el));
return () => io.disconnect();
});
}
// ---- Counter ----
function Counter({ to, suffix = '', plus = false, duration = 1800 }) {
const ref = useRef2(null);
const [val, setVal] = useState2(0);
useEffect2(() => {
if (!ref.current) return;
let raf;
const io = new IntersectionObserver((entries) => {
if (entries[0].isIntersecting) {
const start = performance.now();
const tick = (t) => {
const p = Math.min(1, (t - start) / duration);
const eased = 1 - Math.pow(1 - p, 3);
setVal(Math.round(to * eased));
if (p < 1) raf = requestAnimationFrame(tick);
};
raf = requestAnimationFrame(tick);
io.disconnect();
}
}, { threshold: 0.4 });
io.observe(ref.current);
return () => { io.disconnect(); cancelAnimationFrame(raf); };
}, [to, duration]);
return (
{plus && +}
{val}
{suffix && {suffix}}
);
}
// ---- HERO ----
function Hero({ t, variant, scrollY, mouseX, mouseY }) {
return (
{t.hero.eyebrow}
{t.hero.titleA}
{t.hero.titleC}
{t.hero.sub}
{t.hero.ctaPrimary}
{t.hero.ctaSecondary}
+
{t.hero.metaAlbl}
+
{t.hero.metaBlbl}
+
{t.hero.metaClbl}
);
}
// ---- NOSOTROS ----
function Nosotros({ t }) {
const valueIcons = [
,
,
,
,
];
return (
{t.nosotros.num}
{t.nosotros.h2A} {t.nosotros.h2B}
{t.nosotros.h2C}
{t.nosotros.p1}
{t.nosotros.p2}
{[
['v1t','v1d'],['v2t','v2d'],['v3t','v3d'],['v4t','v4d']
].map(([k, dk], i) => (
{valueIcons[i]}
{t.nosotros[k]}
{t.nosotros[dk]}
))}
);
}
// ---- SERVICIOS ----
function Servicios({ t }) {
return (
{t.servicios.num}
{t.servicios.h2A}
{t.servicios.h2B}
{t.servicios.lead}
{t.servicios.items.map((s, i) => (
0{i + 1}
{s.title} {s.titleB}
{s.desc}
→
))}
);
}
// ---- PROYECTO CARRUSEL ----
function ProyectoCarrusel({ t }) {
const slides = [
{ src: 'assets/proyecto-jujuy-obra.webp', label: t.proyectos.p4slide1 },
{ src: 'assets/proyecto-jujuy-final.webp', label: t.proyectos.p4slide2 },
];
const [idx, setIdx] = useState2(0);
const [prev, setPrev] = useState2(null);
const [dir, setDir] = useState2(1);
const goTo = (next) => {
if (next === idx) return;
setDir(next > idx ? 1 : -1);
setPrev(idx);
setIdx(next);
setTimeout(() => setPrev(null), 600);
};
// Auto-advance
useEffect2(() => {
const t = setInterval(() => goTo((idx + 1) % slides.length), 5000);
return () => clearInterval(t);
}, [idx]);
return (
{/* Slides */}
{slides.map((s, i) => (

))}
{/* Overlay */}
{t.proyectos.p4tag}
{t.proyectos.p4title}
{t.proyectos.p4loc}
{/* Slide label badge */}
{slides[idx].label}
{/* Arrows */}
{/* Dots */}
{slides.map((_, i) => (
);
}
function arrowStyle(side) {
return {
position: 'absolute',
top: '50%',
[side]: 16,
transform: 'translateY(-50%)',
zIndex: 4,
background: 'rgba(255,255,255,0.1)',
backdropFilter: 'blur(12px)',
WebkitBackdropFilter: 'blur(12px)',
border: '1px solid rgba(255,255,255,0.2)',
borderRadius: '50%',
width: 40,
height: 40,
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
cursor: 'pointer',
transition: 'background .25s, transform .25s',
};
}
// ---- PROYECTOS ----
function Proyectos({ t }) {
return (
{t.proyectos.num}
{t.proyectos.h2A} {t.proyectos.h2B}
{t.proyectos.h2C}
{t.proyectos.lead}
{t.proyectos.p1tag}
{t.proyectos.p1title}
{t.proyectos.p1loc}
{t.proyectos.p2tag}
{t.proyectos.p2title}
{t.proyectos.p2loc}
{t.proyectos.p3tag}
{t.proyectos.p3title}
{t.proyectos.p3loc}
);
}
// ---- STATS ----
function Stats({ t, scrollY }) {
return (
{t.stats.num}
{t.stats.h2A} {t.stats.h2B}
{t.stats.h2C}
{t.stats.lead}
);
}
// ---- CLIENTES ----
function Clientes({ t }) {
const clients = [
{ mark: 'Q', name: 'Club Quimsa' },
{ mark: 'LE', name: 'La Esquina' },
{ mark: 'M', name: 'Municipalidad SdE' },
{ mark: 'TR', name: 'Tres Algarrobos' },
{ mark: 'GP', name: 'Gob. Pcia. Santiago' },
{ mark: 'TH', name: 'Termas Río Hondo' },
{ mark: 'C', name: 'Constructora Norte' },
{ mark: 'A', name: 'Aguas Santiagueñas' },
{ mark: 'F', name: 'Forestal SA' },
{ mark: 'IN', name: 'INTA Regional' },
];
return (
{t.clientes.num}
{t.clientes.h2A}
{t.clientes.h2B}
{t.clientes.lead}
{[...clients, ...clients].map((c, i) => (
{c.mark}
{c.name}
))}
);
}
// ---- CONTACTO ----
function Contacto({ t }) {
const [sent, setSent] = useState2(false);
const submit = (e) => {
e.preventDefault();
setSent(true);
};
return (
);
}
Object.assign(window, { Hero, Nosotros, Servicios, Proyectos, Stats, Clientes, Contacto, useReveal });