/* global React, Placeholder, Eyebrow, Arr, useUI */ // Hero A — Foto editorial full-bleed con frase ancla en overlay function HeroA({ setPage }) { return (
DAVA'S · ARTE & DISEÑO EDICIÓN MMXXVI · COLOMBIA

Tu pieza
se empieza a tejer
cuando tú
la pides.

Muebles tejidos a mano en taller propio. Cada pedido enciende la producción — listos en ~15 días, sin bodega y sin atajos.

WhatsApp directo
SCROLL · DESCUBRE
); } // Hero B — Producto aislado sobre bone con tipo grande function HeroB({ setPage, openProduct }) { return (
PIEZA DEL MES · N°. 047 HECHA A PEDIDO · 15 DÍAS
Modelo destacado

Mecedoras
tejidas
a mano. — en 8 patrones, sobre teca curada

Tu pieza se empieza a tejer cuando tú la pides. Una sola mano por respaldo, un solo respaldo por semana — el ritmo del oficio, no el de la fábrica.

Desde
$ 580.000
Patrones
8
Producción
~ 15 d
N°. 047 / PAVO REAL
Pavo Real Patrón · Precolombino
); } // Hero C — Mosaico de productos con tipografía dominante function HeroC({ setPage, openProduct }) { const tiles = [ { cls: "t1", tone: "dark", name: "Pavo Real", family: "Mecedora", label: "/ASSETS/HERO-MOS-01.JPG", id: "pavo-real-hero" }, { cls: "t2", tone: "bone", name: "Colibrí", family: "Silla", label: "/ASSETS/HERO-MOS-02.JPG", id: "colibri-hero" }, { cls: "t3", tone: "terra", name: "Sirena", family: "Mecedora", label: "/ASSETS/HERO-MOS-03.JPG", id: "sirena-hero" }, { cls: "t4", tone: "verde", name: "Acapulco", family: "Silla", label: "/ASSETS/HERO-MOS-04.JPG", id: "acapulco-hero" }, { cls: "t5", tone: "paper", name: "Diamante", family: "Sofá", label: "/ASSETS/HERO-MOS-05.JPG", id: "diamante-hero" }, ]; return (
DAVA'S · 212+ PIEZAS EN CATÁLOGO VOL. MMXXVI / 04

Hechas a
mano, una
por una.

Lo que estamos tejiendo ahora

Tu pieza se empieza a tejer cuando tú la pides. Mecedoras, sillas, comedores y sofás sobre teca y pino — todo el catálogo a un toque de WhatsApp.

{tiles.map((t) => (
openProduct({ id: t.id, name: t.name, family: t.family, pattern: "Precolombino", price: "—", tone: t.tone })}>

{t.name}

{t.family} →
))}
); } // Hero D — Polaroids rotativas con mensaje aspiracional + copy de venta por pieza // Cada pieza trae: titular grande, palabra destacada, subcopy de apoyo, y la nota manuscrita. const HERO_POLAROIDS = [ { img: "/assets/hero/comedor_holanda.jpg", nombre: "Comedor Holanda", mensaje: "“Para una tardecita de chisme con mis amigas ♡”", titular: "La mesa donde", titularEm: "todo se cuenta.", subcopy: "Comedores tejidos a mano para las sobremesas que no se quieren acabar.", bg: "#B5532A", mensajeColor: "#8a3d1a", titularEmColor: "#8a3d1a", pinFrom: "#f6d795", pinMid: "#C8901A", pinTo: "#9c6d12", }, { img: "/assets/hero/conjunto_balcon.jpg", nombre: "Conjunto Balcón", mensaje: "“Dos de estas, una mesita, y tenemos cita en el balcón.”", titular: "Tu balcón también", titularEm: "merece una cita.", subcopy: "Conjuntos tejidos a mano que convierten un rincón en tu lugar favorito.", bg: "#7E1232", mensajeColor: "#7E1232", titularEmColor: "#B0184A", pinFrom: "#f29bb8", pinMid: "#d8417a", pinTo: "#8f1d4a", }, { img: "/assets/hero/colibri_cafe.jpg", nombre: "Mecedora Colibrí", mensaje: "“La mecedora que se merece mi viejo.”", titular: "Un regalo que", titularEm: "se mece toda la vida.", subcopy: "Mecedoras tejidas a mano sobre madera curada. Hechas para durar generaciones.", bg: "#5A4026", mensajeColor: "#5a4026", titularEmColor: "#a86f3a", pinFrom: "#f6d795", pinMid: "#C8901A", pinTo: "#9c6d12", }, { img: "/assets/hero/colibri_verde.jpg", nombre: "Mecedora Colibrí", mensaje: "“Para nuestro spa. Soñemos juntos.”", titular: "Tu espacio para", titularEm: "respirar.", subcopy: "Piezas tejidas a mano que traen calma a cualquier rincón de tu casa.", bg: "#2F5347", mensajeColor: "#2f5347", titularEmColor: "#4a8c72", pinFrom: "#e8a96b", pinMid: "#c17a3a", pinTo: "#8a531f", }, { img: "/assets/hero/silla_nido.jpg", nombre: "Silla Nido", mensaje: "“Tú y yo aquí juntos, piénsalo.”", titular: "Una pieza que", titularEm: "lo dice todo.", subcopy: "Diseños exclusivos tejidos a mano que no encontrarás en ninguna otra tienda.", bg: "#7E1232", mensajeColor: "#7E1232", titularEmColor: "#B0184A", pinFrom: "#f29bb8", pinMid: "#d8417a", pinTo: "#8f1d4a", }, ]; function HeroPortadaPolaroid({ setPage }) { const [idx, setIdx] = React.useState(0); const [fading, setFading] = React.useState(false); const [isMobile, setIsMobile] = React.useState(typeof window !== "undefined" && window.innerWidth < 760); const p = HERO_POLAROIDS[idx]; React.useEffect(() => { const onResize = () => setIsMobile(window.innerWidth < 760); window.addEventListener("resize", onResize); return () => window.removeEventListener("resize", onResize); }, []); React.useEffect(() => { const t = setInterval(() => { setFading(true); setTimeout(() => { setIdx((i) => (i + 1) % HERO_POLAROIDS.length); setFading(false); }, 420); }, 4600); return () => clearInterval(t); }, []); const goTo = (i) => { if (i === idx) return; setFading(true); setTimeout(() => { setIdx(i); setFading(false); }, 420); }; // ===== LAYOUT MOBILE — apilado en una columna ===== if (isMobile) { return (
{/* Polaroid arriba, centrada */}
{p.nombre}
{p.nombre} {p.mensaje}
{/* Texto abajo, sobre la zona de color */}

{p.titular} {p.titularEm}

{p.subcopy}

setPage("catalog")}> Ver el catálogo →
{/* dots */}
{HERO_POLAROIDS.map((_, i) => (
); } // ===== LAYOUT DESKTOP ===== return (
{/* Campo de color derecho + trama tejida */}
{/* Franja vertical "Hecho en Colombia" */}
Est. Artesanal — Hecho en Colombia
{/* Anillo girando con texto circular */} PIEZA ÚNICA · TEJIDO A MANO · {/* Polaroid rotativa */}
{p.nombre}
{p.nombre} {p.mensaje}
{/* Bloque editorial — titular + subcopy + CTAs, todo junto y rotativo */}

{p.titular}
{p.titularEm}

{p.subcopy}

{/* Marquee inferior */}
{[0, 1].map((k) => ( Diseño a medida  ·   Tejido a mano en Colombia   ·  Pieza única  ·   Patrón Precolombino   ·   ))}
{/* Dots de navegación entre piezas */}
{HERO_POLAROIDS.map((_, i) => (
); } // ===== HeroD — Editorial 2026, ahora el HERO real del home ===== // B · Editorial 2026 — stories full-screen, loop, formato 9:16 // layout "split" → copy arriba (con aire) + info abajo · "bottom" → todo abajo // Este array es el RESPALDO — si el admin (admin.php → Hero) ya configuró // las 5 escenas, se usa window.HERO_EDITORIAL en su lugar (inyectado por // index.php desde hero-editorial.json, ya resuelto contra el catálogo real). const EDITORIAL_DEFAULT = [ { nombre: "Colibrí", cat: "mecedoras", slug: "colibri-precolombino", img: "/story_colibri.jpg", pos: "50% 82%", layout: "split", lugar: "En la terraza, al sol de la mañana", copy: "El primer café del día\nsabe mejor aquí.", precio: "desde $400.000", }, { nombre: "Nido", cat: "mecedoras", slug: "mecedora-nido", img: "/story_luna.jpg", pos: "50% 70%", layout: "split", lugar: "En la sala que todos recuerdan", copy: "Lo primero que escogiste\npensando solo en ti.", precio: "desde $650.000", }, { nombre: "Sirena", cat: "mecedoras", slug: "sirena-lineal-con-refuerzo-2", img: "/story_sirena.jpg", pos: "50% 76%", layout: "split", lugar: "Entre las plantas, donde el tiempo se detiene", copy: "Afuera, la selva.\nAdentro, tú y la calma.", precio: "desde $380.000", }, { nombre: "Pavo Real Plus", cat: "combos", slug: "pavo-real-plus-4", img: "/story_conjunto.jpg", pos: "50% 70%", layout: "split", lugar: "En el patio, al caer la tarde", copy: "La tarde se alarga\ncuando hay dónde estar.", precio: "$1.050.000", }, { nombre: "París", cat: "sillas-bar", slug: "paris-precolombino-especial", img: "/story_barparis.jpg", pos: "50% 42%", layout: "bottom", lugar: "Para tu bar, tu café, tu restaurante", copy: "El asiento que tus\nclientes recordarán.", precio: "desde $400.000 · mayorista", }, ]; const EDITORIAL = (window.HERO_EDITORIAL && window.HERO_EDITORIAL.length) ? window.HERO_EDITORIAL : EDITORIAL_DEFAULT; function HeroD({ setPage }) { const isMob = typeof window !== "undefined" && window.innerWidth < 760; const cat = window.CATALOGO || []; const DUR = 6800; const SLIDES = EDITORIAL.map(e => { // Buscar por slug primero (más preciso), luego nombre+cat, luego solo nombre const prod = (e.slug ? cat.find(p => p.slug === e.slug && p.foto) : null) || cat.find(p => p.nombre === e.nombre && p.categoria === e.cat && p.foto) || cat.find(p => p.nombre === e.nombre && p.foto) || cat.find(p => p.categoria === e.cat && p.foto); // precio: del EDITORIAL (ya corregido), no del catálogo para evitar confusiones // url: construida directo de cat+slug (confirmada por Alex, funciona sí o sí, // sin depender de window.__davasRoute que ha venido fallando) return { ...e, id: prod?.id, label: e.nombre, url: `/${e.cat}/${e.slug}` }; }); const N = SLIDES.length; const TOTAL = N + 1; // +1 página de bienvenida/cierre const [active, setActive] = React.useState(0); const [phase, setPhase] = React.useState("in"); const [paused, setPaused] = React.useState(false); const timer = React.useRef(null); const touchX = React.useRef(null); const isWelcome = active === N; const go = (to) => { setPhase("out"); setTimeout(() => { setActive((to + TOTAL) % TOTAL); setPhase("in"); }, 400); }; React.useEffect(() => { if (paused) return; // bienvenida dura un poco más antes de reiniciar el loop const d = isWelcome ? DUR + 1400 : DUR; timer.current = setTimeout(() => go(active + 1), d); return () => clearTimeout(timer.current); }, [active, paused]); const jump = (i) => { clearTimeout(timer.current); if (i !== active) go(i); }; const next = () => { clearTimeout(timer.current); go(active + 1); }; const prev = () => { clearTimeout(timer.current); go(active - 1); }; const onTouchStart = (e) => { touchX.current = e.touches[0].clientX; }; const onTouchEnd = (e) => { if (touchX.current == null) return; const dx = e.changedTouches[0].clientX - touchX.current; if (Math.abs(dx) > 45) (dx < 0 ? next : prev)(); touchX.current = null; }; const slide = SLIDES[active] || SLIDES[0]; const goCatalog = () => window.__davasRoute?.openCatalog(); const animClass = phase === "in" ? "ed-in" : "ed-out"; const isBottom = !isWelcome && slide.layout === "bottom"; // Este hero ES la zona oscura del home: mientras el scroll siga dentro de // su alto real, el header debe ir en blanco. Al salir (Oficio, ya en // crema), el header pasa solo a texto oscuro — sin esto dependería de un // valor por defecto aproximado. const sectionRef = React.useRef(null); React.useEffect(() => { const el = sectionRef.current; if (!el) return; const update = () => document.documentElement.style.setProperty("--dark-zone-h", el.offsetHeight + "px"); update(); const ro = new ResizeObserver(update); ro.observe(el); window.addEventListener("resize", update); return () => { ro.disconnect(); window.removeEventListener("resize", update); }; }, []); return (
!isMob && setPaused(true)} onMouseLeave={() => !isMob && setPaused(false)} style={{ position:"relative", height: isMob ? "100svh" : "100vh", minHeight: isMob ? 560 : 620, maxHeight: isMob ? 880 : 1000, overflow:"hidden", background:"#0e0a08", display:"block" }}> {/* Foto / fondo */}
{isWelcome ?
: {slide.label} }
{/* Flechas */} {/* Tap zones (mobile: invisible, desktop: subtle arrow on hover) */}
{ e.stopPropagation(); e.preventDefault(); prev(); }} />
{ e.stopPropagation(); e.preventDefault(); next(); }} /> {!isMob && <>
} {isWelcome ? ( /* Página de cierre / bienvenida */
Bienvenido a DAVA'S

Todo esto se teje a mano.
Y ahora, para ti.

Más de 300 piezas nacidas en nuestro taller de Bogotá. Encuentra la que va a vivir contigo.

) : isBottom ? ( /* Layout "bottom" — todo el texto agrupado abajo (París) */ ) : ( /* Layout "split" — copy arriba con AIRE, info+cta abajo */ <> {/* ARRIBA: copy con respiro (no pegado al borde) */}
{slide.lugar}

{slide.copy}

{/* ABAJO: nombre + precio + CTA */} )}
); } function Hero({ variant, setPage, openProduct }) { if (variant === "B") return ; if (variant === "C") return ; if (variant === "D") return ; return ; } window.Hero = Hero; window.HeroPortadaPolaroid = HeroPortadaPolaroid;