const { useState, useEffect, useRef, useMemo } = React;
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
"headline": "extraordinarios",
"showBlue": true
}/*EDITMODE-END*/;
/* ============================================================ LOGO */
function Logo({ size = 32 }) {
return (
);
}
/* ============================================================ 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 (
);
}
/* ============================================================ 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.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) => (
))}
{/* RIGHT: hero image */}
{/* 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 (
);
}
/* ============================================================ 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]) => (
setFilter(k)}
className="mono"
style={{
padding: "12px 18px",
border: "1px solid var(--line)",
background: filter === k ? "var(--brand)" : "transparent",
color: filter === k ? "#000" : "var(--fg-2)",
cursor: "pointer",
fontSize: 11,
borderRadius: 0,
fontWeight: filter === k ? 700 : 400
}}
>{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}
✕ cerrar
{project.t}
);
}
function Stat({ label, value }) {
return (
);
}
/* ============================================================ 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}
))}
);
}
/* ============================================================ 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 (
);
}
return (
);
}
function ContactBlock({ label, lines, bold }) {
return (
{label}
{lines.map((l, i) =>
{l}
)}
);
}
function Field({ label, v, on, type = "text", required, multiline, placeholder }) {
const [focus, setFocus] = useState(false);
const sty = {
width: "100%", background: "transparent", border: "none",
borderBottom: `1px solid ${focus ? "var(--brand)" : "var(--line)"}`,
color: "var(--fg)", fontSize: 17, padding: "16px 0", outline: "none",
fontFamily: "inherit", transition: "border-color 200ms", borderRadius: 0
};
return (
{label}{required && " *"}
{multiline
?
);
}
function Select({ label, v, on, options }) {
return (
{label}
")`,
backgroundRepeat: "no-repeat", backgroundPosition: "right 4px center"
}}>
{options.map(o => {o} )}
);
}
/* ============================================================ FOOTER */
function Footer() {
return (
);
}
/* ============================================================ APP */
function App() {
const [scrolled, setScrolled] = useState(false);
useEffect(() => {
const onScroll = () => setScrolled(window.scrollY > 80);
window.addEventListener("scroll", onScroll);
return () => window.removeEventListener("scroll", onScroll);
}, []);
return (
<>
>
);
}
ReactDOM.createRoot(document.getElementById("root")).render( );