const { useState, useEffect, useRef, useMemo } = React; const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "headline": "extraordinarios", "showBlue": true }/*EDITMODE-END*/; /* ============================================================ LOGO */ function Logo({ size = 32 }) { return ( Solen ); } /* ============================================================ NAV */ function Nav({ scrolled }) { const [open, setOpen] = useState(false); const links = [ ["empresas", "Empresas"], ["servicios", "Servicios"], ["portafolio", "Portafolio"], ["proceso", "Proceso"], ["contacto", "Contacto"], ]; const go = (id) => { setOpen(false); const el = document.getElementById(id); if (el) window.scrollTo({ top: el.offsetTop - 1, behavior: "smooth" }); }; return (
go("index")} style={{ cursor: "pointer", display: "flex", alignItems: "center", gap: 12, textDecoration: "none" }}> SOLEN {/* mobile burger */} {/* mobile drawer */} {open && (
{links.map(([id, label]) => ( go(id)} className="black" style={{ cursor: "pointer", textDecoration: "none", fontSize: 32, color: "var(--fg)", padding: "14px 0", borderBottom: "1px solid var(--line)", textTransform: "uppercase", letterSpacing: "-0.02em" }}>{label} ))}
)}
); } /* ============================================================ HERO */ function Hero() { const [t, setT] = useState(0); useEffect(() => { let raf; const start = performance.now(); const tick = () => { setT((performance.now() - start) / 1000); raf = requestAnimationFrame(tick); }; raf = requestAnimationFrame(tick); return () => cancelAnimationFrame(raf); }, []); return (
{/* radial vignette */}
{/* faint grid */}
{/* top meta */}
Cancún · Q. Roo · Est. 2008 {new Date().getFullYear()} / Producción integral
{/* headline — bold/light contrast */}

Eventos EXTRAORDINARIOS hechos en el CARIBE.

{/* lower row */}
— Quiénes somos

Una compañía de seis empresas dedicadas a la planeación, producción y logística de bodas destination, eventos corporativos y experiencias de marca en Cancún y la Riviera Maya.

— Disponibilidad
2026

2027
{/* marquee ticker */}
{Array.from({ length: 2 }).flatMap((_, j) => [ , , , , , , ])}
); } function Tick({ bold, light }) { return ( {bold} {light} ); } function SunDial({ t }) { const dash = (60 + Math.sin(t * 0.6) * 8).toFixed(1); return ( 21°09'N · 86°50'W ); } /* ============================================================ EMPRESAS */ const EMPRESAS = [ { id: "solen", code: "01", name: "EVENTOS", full: "Solen Event Masterminds", logo: "assets/empresa-solen-cut.png", photo: "assets/showcase-solen.jpg", tag: "Producción integral", tagline: "Strategic, creative, professional production.", desc: "Empresa enfocada a la planeación, organización, producción, logística y asesoría de eventos corporativos, sociales y experiencias de marca. Conceptualizamos ideas para crear eventos originales que garantizan el éxito.", img: "evento corporativo · stage 24m · LED arch", services: [ { icon: "spark", label: "Conceptualización" }, { icon: "calendar", label: "Planeación" }, { icon: "grid", label: "Producción 360°" }, { icon: "route", label: "Logística" }, { icon: "users", label: "Coordinación" }, { icon: "speaker", label: "Sonido & Audio" } ] }, { id: "bodas", code: "02", name: "BODAS", full: "Solen Bodas", logo: "assets/empresa-bodas-cut.png", photo: "assets/showcase-bodas.jpg", tag: "Wedding planning", tagline: "Creative, elegant, professional design.", desc: "Empresa enfocada a servicios de Wedding Planner en Cancún y la Riviera Maya. Nuestro trabajo es crear con sentido bodas únicas y excepcionales, partiendo de la idea de cada pareja. Los detalles engrandecen y eso es lo que cada uno de los invitados recordará de su boda.", img: "ceremonia destination · sailcloth · maroma", services: [ { icon: "route", label: "Logística & Coordinación" }, { icon: "car", label: "Transportación" }, { icon: "hotel", label: "Hoteles" }, { icon: "dish", label: "Catering" }, { icon: "pin", label: "Locaciones" }, { icon: "flower", label: "Decoración & Flores" } ] }, { id: "leds", code: "03", name: "LEDS", full: "Icon LEDs", logo: "assets/empresa-leds-cut.png", photo: "assets/showcase-leds.jpg", tag: "Iluminación · pantallas", tagline: "Light, screens, atmosphere.", desc: "Especialistas en pantallas LED de alta densidad, mapping arquitectónico y diseño lumínico. Convertimos cualquier espacio en una experiencia visual envolvente con tecnología de última generación.", img: "led arch · 18×6m · brand reveal", services: [ { icon: "screen", label: "Pantallas LED HD" }, { icon: "spark", label: "Mapping arquitectónico" }, { icon: "bulb", label: "Diseño lumínico" }, { icon: "grid", label: "Estructuras truss" }, { icon: "video", label: "Video walls" }, { icon: "remote", label: "Control DMX" } ] }, { id: "armor", code: "04", name: "DECK", full: "Armor Deck", logo: "assets/empresa-deck-cut.png", photo: "assets/showcase-armor.jpg", tag: "Pisos modulares", tagline: "Flooring solutions, anywhere.", desc: "Pisos de duela y plataformas estructurales sobre arena, alberca o terreno irregular. Sistema modular certificado que soporta carga estructural y permite armar pistas, comedores y escenarios donde antes era imposible.", img: "piso modular · sobre arena · 800m²", services: [ { icon: "grid", label: "Piso de duela" }, { icon: "pool", label: "Plataforma sobre alberca" }, { icon: "beach", label: "Piso sobre arena" }, { icon: "stage", label: "Escenarios estructurales" }, { icon: "ramp", label: "Rampas & accesos" }, { icon: "tools", label: "Montaje certificado" } ] }, { id: "tents", code: "05", name: "TENTS", full: "Escala Tents", logo: "assets/empresa-tents-cut.png", photo: "assets/showcase-tents.jpg", tag: "Carpas & estructuras", tagline: "Architecture in fabric.", desc: "Carpas pico, sailcloth y estructuras transparentes para 60 a 1,200 invitados. Diseño estructural de carpa adaptado al terreno, viento y proyecto creativo del evento.", img: "sailcloth · 24m · 240 invitados", services: [ { icon: "tent", label: "Carpas pico" }, { icon: "sail", label: "Sailcloth" }, { icon: "diamond", label: "Estructuras transparentes" }, { icon: "frame", label: "Carpas marco" }, { icon: "wind", label: "Anclaje certificado" }, { icon: "ruler", label: "Diseño a medida" } ] }, { id: "house", code: "06", name: "WORKHOUSE", full: "Workhouse Custom", logo: "assets/empresa-workhouse-cut.png", photo: "assets/showcase-house.jpg", tag: "Mobiliario & rentals", tagline: "Custom furniture & rentals.", desc: "Catálogo de mobiliario editorial, lounge, vajillas y cristalería de autor. Producimos piezas a medida y mantenemos un inventario rotativo de mobiliario contemporáneo para eventos sociales y corporativos.", img: "mobiliario lounge · cristalería · long table", services: [ { icon: "chair", label: "Mobiliario lounge" }, { icon: "dish", label: "Vajilla & cristalería" }, { icon: "hammer", label: "Producción a medida" }, { icon: "lamp", label: "Iluminación decorativa" }, { icon: "frame", label: "Backdrops & escenografía" }, { icon: "truck", label: "Logística de entrega" } ] }, ]; /* simple line icons */ function Icon({ name, size = 22, color = "currentColor" }) { const s = size, c = color; const sw = 1.2; const wrap = (children) => ( {children} ); switch (name) { case "route": return wrap(<>); case "car": return wrap(<>); case "hotel": return wrap(<>); case "dish": return wrap(<>); case "pin": return wrap(<>); case "flower": return wrap(<>); case "calendar": return wrap(<>); case "spark": return wrap(<>); case "grid": return wrap(<>); case "users": return wrap(<>); case "speaker": return wrap(<>); case "screen": return wrap(<>); case "bulb": return wrap(<>); case "video": return wrap(<>); case "remote": return wrap(<>); case "pool": return wrap(<>); case "beach": return wrap(<>); case "stage": return wrap(<>); case "ramp": return wrap(<>); case "tools": return wrap(<>); case "tent": return wrap(<>); case "sail": return wrap(<>); case "diamond": return wrap(<>); case "frame": return wrap(<>); case "wind": return wrap(<>); case "ruler": return wrap(<>); case "chair": return wrap(<>); case "hammer": return wrap(<>); case "lamp": return wrap(<>); case "truck": return wrap(<>); default: return null; } } function Empresas() { const [active, setActive] = useState(0); const e = EMPRESAS[active]; return (
{/* logo grid */}
{EMPRESAS.map((emp, i) => (
setActive(i)} style={{ background: active === i ? "var(--bg-3)" : "var(--bg)", padding: "40px 20px", cursor: "pointer", transition: "background 220ms", display: "flex", flexDirection: "column", alignItems: "center", gap: 16, position: "relative" }} >
{emp.code}
{emp.full}
{emp.name}
))}
{/* detail panel — rich content per empresa */}
{/* LEFT: copy + services */}
{e.code} · {e.full.toUpperCase()}
{e.name}
{e.tagline}
{e.desc}
{/* services grid */}
✦ Servicios
{e.services.map((s) => (
{s.label}
))}
{/* RIGHT: hero image */}
{e.full} {/* gradient overlay for label legibility */}
{e.code} · {e.img}
); } /* ============================================================ SERVICIOS */ function Servicios() { const services = [ { code: "S/01", name: "BODAS", soft: "destination", img: "playa · ceremonia · sailcloth" }, { code: "S/02", name: "CORPORATIVO", soft: "& lanzamientos", img: "convention · brand reveal" }, { code: "S/03", name: "ACTIVACIONES", soft: "de marca", img: "experience · roadshow" }, { code: "S/04", name: "GALAS", soft: "& aniversarios", img: "gala · cena premiación" }, ]; return (
{services.map((s, i) => )}
); } function ServiceCard({ code, name, soft, img }) { const [hover, setHover] = useState(false); return (
setHover(true)} onMouseLeave={() => setHover(false)} style={{ background: hover ? "var(--bg-3)" : "var(--bg-2)", padding: 40, cursor: "pointer", transition: "background 240ms" }} >
{code}

{name} {soft}

); } /* ============================================================ SECTION HEAD */ function SectionHead({ kicker, light, bold, sub }) { return (
{kicker}

{light} {bold}

{sub}

); } /* ============================================================ PORTAFOLIO */ const PROJECTS = [ { id: 1, t: "Boda Maroma", cat: "bodas", y: 2025, loc: "Maroma Beach", g: 240, label: "ceremonia · sunset · 240 pax" }, { id: 2, t: "Lanzamiento EQS", cat: "corporativo", y: 2025, loc: "Hotel Xcaret", g: 600, label: "auto reveal · LED arch" }, { id: 3, t: "Hacienda Tulum", cat: "bodas", y: 2024, loc: "Tulum", g: 180, label: "hacienda · 180 pax · sailcloth" }, { id: 4, t: "Cena ANCM", cat: "gala", y: 2024, loc: "Moon Palace", g: 850, label: "gala · 850 pax · stage 24m" }, { id: 5, t: "Don Julio Activación", cat: "marca", y: 2025, loc: "Mayakoba", g: 320, label: "brand activation · pop-up bar" }, { id: 6, t: "Riviera Maya", cat: "bodas", y: 2024, loc: "Riviera Maya", g: 280, label: "garden · long table · 280 pax" }, ]; function Portafolio() { const [filter, setFilter] = useState("todos"); const [open, setOpen] = useState(null); const filtered = filter === "todos" ? PROJECTS : PROJECTS.filter(p => p.cat === filter); const cats = [ ["todos", "Todos"], ["bodas", "Bodas"], ["corporativo", "Corporativo"], ["gala", "Galas"], ["marca", "Activaciones"], ]; return (
04 · Portafolio

Trabajos RECIENTES.

{cats.map(([k, l]) => ( ))}
{filtered.map((p, i) => { const span = [6, 6, 4, 8, 5, 7][i % 6]; const aspect = [3/4, 4/3, 1, 16/9, 3/4, 4/3][i % 6]; return (
setOpen(p)} style={{ gridColumn: `span ${span}`, cursor: "pointer", display: "flex", flexDirection: "column", gap: 16 }} >
e.currentTarget.style.transform = "scale(0.99)"} onMouseLeave={(e) => e.currentTarget.style.transform = "none"} />
{p.t}
{p.loc} · {p.g} pax
{p.y}
); })}
{open && setOpen(null)} />}
); } function Lightbox({ project, onClose }) { useEffect(() => { const onKey = (e) => e.key === "Escape" && onClose(); document.addEventListener("keydown", onKey); return () => document.removeEventListener("keydown", onKey); }, [onClose]); return (
e.stopPropagation()} style={{ maxWidth: 1100, width: "100%", background: "var(--bg-2)", padding: 40, cursor: "default", border: "1px solid var(--line)" }}>
Proyecto · {project.y}

{project.t}

); } function Stat({ label, value }) { return (
{label}
{value}
); } /* ============================================================ PROCESO */ function Proceso() { const [active, setActive] = useState(0); const steps = [ { n: "01", t: "BRIEFING", d: "Sesión de 90 minutos para entender visión, presupuesto y restricciones logísticas. Sin costo." }, { n: "02", t: "CONCEPTO", d: "Dirección creativa con moodboards, paleta, dirección floral y propuesta espacial inicial." }, { n: "03", t: "PRODUCCIÓN", d: "Logística, permisos, contratos de proveedores, timeline maestro y simulacros 3D del montaje." }, { n: "04", t: "EJECUCIÓN", d: "Equipo en sitio 48h antes. Coordinador único, walkie-talkies, plan B de clima y contingencias." }, { n: "05", t: "CIERRE", d: "Desmontaje silencioso, entrega de fotos y video master, reunión de retroalimentación." }, ]; return (
{steps.map((s, i) => (
setActive(i)} style={{ padding: "20px 0", borderBottom: "1px solid var(--line)", cursor: "pointer", display: "flex", gap: 24, alignItems: "center", opacity: active === i ? 1 : 0.35, transition: "opacity 200ms" }} > {s.n} {s.t}
))}

{steps[active].d}

); } /* ============================================================ TESTIMONIOS */ function Testimonios() { const items = [ { q: "Coordinaron una boda de 240 personas en una playa privada sin un solo detalle fuera de lugar. El piso sobre la arena fue invisible — y eso es lo que queríamos.", a: "Mariana & Diego", r: "Boda · Maroma, 2025" }, { q: "Producción impecable para el lanzamiento regional. Llegaron con alternativas a problemas que no sabíamos que íbamos a tener.", a: "Andrea Espinoza", r: "Marketing · Mercedes-Benz MX" }, { q: "Pasamos de tres proveedores a uno. La diferencia en tiempo, costo y calidad es absurda.", a: "Comité ANCM", r: "Cena anual de premiación 2024" }, ]; return (
{items.map((t, i) => (
{t.q}
{t.a}
{t.r}
))}
); } /* ============================================================ CONTACTO */ function Contacto() { const [form, setForm] = useState({ nombre: "", email: "", tipo: "Boda", invitados: "", fecha: "", msg: "" }); const [sent, setSent] = useState(false); const update = (k) => (e) => setForm({ ...form, [k]: e.target.value }); const submit = (e) => { e.preventDefault(); setSent(true); }; if (sent) { return (
Solicitud recibida · #SLN-{Math.floor(Math.random()*9000+1000)}

Gracias, {form.nombre.split(" ")[0] || "te"} ESCRIBIMOS EN 24H.

); } return (
06 · Contacto

Cuéntanos LA VISIÓN.

Respondemos cada solicitud en menos de 24 horas con un calendario de disponibilidad y rangos de inversión por categoría.