/* global React, Placeholder, Eyebrow, Arr, HeartIcon, useWishlist, useUI, Reveal, waLink, waMessageForWishlist */ const { useState } = React; /* ───── DATOS · todos generados como punto de partida editorial. ───── Los precios y nombres de modelo vienen del brief. Los SKUs concretos son ejemplos para mostrar el diseño — los reemplazas desde admin. */ /* DATOS DINÁMICOS — desde window.CATALOGO real */ const CAT_ORDER = ["sillas","mecedoras","sillas-bar","comedores","mesas","sofas","percheros","combos"]; const CAT_CLASSES = { sillas:"cat-l", mecedoras:"cat-m", "sillas-bar":"cat-s", comedores:"cat-s", mesas:"cat-s", sofas:"cat-s", percheros:"cat-w", "combos":"cat-w" }; const CAT_TONES = { sillas:"dark", mecedoras:"terra", "sillas-bar":"paper", comedores:"bone", mesas:"verde", sofas:"dark", percheros:"mostaza", "combos":"bone" }; // Overrides manuales — productos elegidos a mano por Alex para portada de categoría const CAT_HERO_OVERRIDES = { "sillas": "SI-072", "sillas-bar": "SB-033", "comedores": "CM-004", "mesas": "MS-048", }; // Selecciona la mejor foto representativa por categoría, con criterio editorial: // Prioriza patrones precolombinos y diamantes que tienden a tener más color/contraste // Evita las primeras del catálogo que suelen ser las más básicas (Lineal blanco/beige) function pickCategoryHero(cid) { const items = (window.CATALOGO || []).filter((p) => p.categoria === cid && p.foto); if (items.length === 0) return null; // 1) Si hay override manual de Alex, úsalo (solo si el producto existe y tiene foto) if (CAT_HERO_OVERRIDES[cid]) { const forced = items.find((p) => (p.id || "").toUpperCase() === CAT_HERO_OVERRIDES[cid].toUpperCase()); if (forced) return forced; } // Patrones más vistosos (en orden de prioridad) const strongPatterns = /precolombino especial|precolombino raíz|precolombino|diamante especial|diamante/i; const mediumPatterns = /pirámide|piramide|ancestral|nativo|rombo|cruz/i; const weakPatterns = /espiga|olas/i; // Tier 1: destacados con patrón fuerte let pick = items.find((p) => p.destacado && strongPatterns.test(p.variante || "")); if (pick) return pick; // Tier 2: cualquier producto con patrón fuerte (mejor visual) pick = items.find((p) => strongPatterns.test(p.variante || "")); if (pick) return pick; // Tier 3: destacados con patrón medio pick = items.find((p) => p.destacado && mediumPatterns.test(p.variante || "")); if (pick) return pick; // Tier 4: cualquier producto con patrón medio pick = items.find((p) => mediumPatterns.test(p.variante || "")); if (pick) return pick; // Tier 5: destacado cualquiera pick = items.find((p) => p.destacado); if (pick) return pick; // Tier 6: cualquiera con foto, evitando los "Lineal" simples si hay alternativa pick = items.find((p) => !/^lineal$/i.test(p.variante || "")); if (pick) return pick; // Última opción return items[0]; } const CATEGORIES = CAT_ORDER.map((cid) => { const hero = pickCategoryHero(cid); return { id: cid, name: (window.CAT_LABELS && window.CAT_LABELS[cid]) || cid, count: (window.CAT_TOTALS && window.CAT_TOTALS[cid]) || 0, cls: CAT_CLASSES[cid] || "cat-s", tone: CAT_TONES[cid] || "bone", photo: hero ? hero.foto : null, heroProduct: hero ? hero.id : null, }; }); const MODEL_TONES = { "Pavo Real":"dark", "Colibrí":"bone", "Sirena":"verde", "Acapulco":"terra", "Diamante":"dark", "Madrid":"paper", "Pavo Real Plus":"verde", "Diamante Plus":"terra", "España":"paper", "Paris":"bone", "Noruega":"dark" }; const _modelCounts = {}; (window.CATALOGO || []).forEach((p) => { _modelCounts[p.nombre] = (_modelCounts[p.nombre] || 0) + 1; }); const MODELS = Object.entries(_modelCounts) .filter(([_, n]) => n >= 3) .sort((a, b) => b[1] - a[1]) .slice(0, 6) .map(([name, n]) => { const info = (window.ICONOS_INFO && window.ICONOS_INFO[name]) || {}; const sample = (window.CATALOGO || []).find((p) => p.nombre === name) || {}; return { id: name.toLowerCase().replace(/\s+/g, "-"), name: name, family: info.family || (window.CAT_LABELS && window.CAT_LABELS[sample.categoria]) || "", variants: n, since: info.since || "", tone: MODEL_TONES[name] || "dark", blurb: info.blurb || (n + " versiones de " + name + " — distintos patrones, distintas maderas."), photo: sample.foto || null, }; }); // Productos destacados forzados por curación editorial const FEATURED_OVERRIDES = ["ME-030", "ME-024"]; const _buildFeatured = (p) => ({ id: p.id, name: p.nombre, family: (window.CAT_LABELS && window.CAT_LABELS[p.categoria]) || p.categoria, pattern: (window.detectarPatron && window.detectarPatron(p.variante)) || "", price: (p.precio || 0).toLocaleString("es-CO"), tone: "dark", tone2: "bone", photo: p.foto, }); const FEATURED = []; // Primero los overrides en orden FEATURED_OVERRIDES.forEach((oid) => { const found = (window.CATALOGO || []).find((p) => (p.id || "").toUpperCase() === oid && p.foto); if (found) FEATURED.push(_buildFeatured(found)); }); // Luego destacados con foto (window.CATALOGO || []) .filter((p) => p.destacado && p.foto && !FEATURED.find((f) => f.id === p.id)) .slice(0, 8 - FEATURED.length) .forEach((p) => FEATURED.push(_buildFeatured(p))); // Si no hay suficientes destacados, completa con productos que tengan foto if (FEATURED.length < 4) { (window.CATALOGO || []) .filter((p) => p.foto && !FEATURED.find((f) => f.id === p.id)) .slice(0, 8 - FEATURED.length) .forEach((p) => FEATURED.push(_buildFeatured(p))); } const CLIENTES = [ { id: "c-1", photo: "assets/casas/casa-1-cocina.jpg", caption: "Donde empieza el café de la mañana. Dos sillas bar con estructura cobre y tejido Zenú que convirtieron esta barra de cocina en el punto favorito de la casa.", by: "Cocina · Bogotá", product: "Sillas Bar · Zenú", tone: "terra" }, { id: "c-2", photo: "assets/casas/casa-2-balcon-urbano.jpg", caption: "El atardecer se ve mejor desde aquí. Mecedoras con tejido precolombino multicolor sobre piso de madera, ladrillo visto y toda la ciudad al frente.", by: "Balcón · Bogotá", product: "Mecedoras · Precolombino", tone: "mostaza" }, { id: "c-3", photo: "assets/casas/casa-3-balcon-jardin.jpg", caption: "Un jardín a ocho pisos del suelo. Set completo en negro y Zenú — loveseat, dos sillas y mesa redonda — rodeado de plantas que le dan vida al balcón.", by: "Balcón · Medellín", product: "Set Completo · Zenú", tone: "dark" }, { id: "c-4", photo: "assets/casas/casa-4-terraza.jpg", caption: "Cuando el espacio pide más que una silla. Terraza campestre con sofá tejido, mecedoras, comedor y sillas DAVA'S — todo en un solo ambiente bajo pérgola.", by: "Terraza · Sabana de Bogotá", product: "Amoblado Completo", tone: "verde" }, { id: "c-5", photo: "assets/casas/casa-5-patio.jpg", caption: "Llueve, pero nadie se mueve. Set fucsia en patio con ladrillo y vegetación tropical — loveseat, dos sillas y mesa — el color que le hacía falta a esta casa.", by: "Patio · Bogotá", product: "Set Completo · Fucsia", tone: "terra" }, ]; const CURSOS = [ { id: "cu-iniciacion", name: "Iniciación al tejido precolombino", duration: "4 sesiones · 12 h", learn: "Patrón base, montaje sobre marco, lectura del dibujo.", take: "Tu primer respaldo tejido (taburete pequeño).", spots: "máx. 6", next: "Consultar fechas", price: "320.000", active: true }, { id: "cu-diamante", name: "Patrón Diamante · intermedio", duration: "6 sesiones · 18 h", learn: "Tensión, escalado del diamante, transiciones de color.", take: "Pieza completa tipo Acapulco.", spots: "máx. 4", next: "Consultar fechas", price: "480.000", active: true }, { id: "cu-restauracion", name: "Restauración de tejido en mecedora", duration: "Taller intensivo · 8 h", learn: "Diagnóstico, desarme, reposición de hilo en piezas existentes.", take: "Tu propia silla restaurada (la traes).", spots: "máx. 5", next: "Próximamente", price: "240.000", active: false }, ]; /* ───── PRODUCT CARD ───── */ function ProductCard({ p, style, showPrices }) { const wl = useWishlist(); const ui = useUI(); const isOn = wl.has(p.id); return (
ui.openModal(p)}>
{p.photo ? ( {p.name} ) : ( )}

{p.name}

{showPrices && p.price ?
$ {p.price}
: null}
); } /* ───── SECCIONES ───── */ // ═══════════════════════════════════════════════════════ // SECCIONES NUEVAS — diseño aprobado de Design, junio 2026 // ═══════════════════════════════════════════════════════ // A · El Oficio — statement de apertura function OficioSection() { const isMob = typeof window !== "undefined" && window.innerWidth < 760; const PILLARS = [ { label: "Se siente", desc: "Diseñada para el cuerpo,\nno para la vitrina." }, { label: "Es arte", desc: "Tejidos de autor, nudo a nudo." }, { label: "Te pertenece", desc: "Única, como tu casa." }, ]; return (
El oficio — Hecho a mano en Colombia

No vendemos muebles.
Tejemos la pieza donde{" "} va a pasar tu vida.

{PILLARS.map((p, i) => (
{p.label}
{p.desc}
))}
); } // C · Catálogo — fichas editoriales full-bleed por categoría function CategoriesSection() { const goCat = (id) => window.__davasRoute?.openCategoria(id); const goAll = () => window.__davasRoute?.openCatalog(); const cats = window.CAT_TOTALS || {}; const isMob = typeof window !== "undefined" && window.innerWidth < 760; const MAIN = [ { id: "mecedoras", label: "Mecedoras", desde: "480.000" }, { id: "sillas", label: "Sillas", desde: "250.000" }, { id: "comedores", label: "Comedores", desde: "780.000" }, { id: "combos", label: "Juegos", desde: "1.050.000" }, { id: "mesas", label: "Mesas", desde: "200.000" }, { id: "sofas", label: "Sofás", desde: "550.000" }, ]; return ( {/* Header */}
El catálogo

Encuentra la tuya

{/* Grid editorial: 3 col desktop / 2 col mobile */}
{MAIN.map((c, idx) => { const hero = pickCategoryHero(c.id); const count = cats[c.id]; // Mecedoras y Sillas más altas (primeras 2 en desktop) const tall = !isMob && idx < 2; return (
goCat(c.id)} style={{ height: isMob ? 160 : tall ? 320 : 230, boxShadow: "0 12px 32px rgba(20,8,14,.14)" }}> {hero?.foto ? {c.label} :
}
{c.label}
{count ? `${count} ref. · ` : ""}desde ${c.desde}
); })}
{/* Banner ver todo — borde interior, sin fondo extra */}
{ e.currentTarget.style.background="rgba(27,24,19,.05)"; e.currentTarget.style.borderColor="rgba(27,24,19,.35)"; }} onMouseLeave={e => { e.currentTarget.style.background="transparent"; e.currentTarget.style.borderColor="rgba(27,24,19,.18)"; }}>
Mira todas nuestras piezas
{!isMob &&
+300 referencias · sillas · mecedoras · percheros · sillas bar · combos y más
}
); } function CatCardImg({ c }) { return null; } function CatCard({ c, onClick }) { return null; } // FAB de WhatsApp — manejado por header.jsx // D · A Medida — taller propio, fotos reales grandes function AMedidaSection() { const isMob = typeof window !== "undefined" && window.innerWidth < 760; const TALLER_TILES = [ { label: "Soldadura · Hierro vivo", img: "/soldador_sparks.jpg", video: null }, { label: "Diseño · En taller", img: "/artesanos_diseno.jpg", video: null }, { label: "Tejido · Nudo a nudo", img: "/tejedor_multicolor.jpg", video: null }, { label: "Pintura electrostática", img: null, video: "/pintura.mp4" }, ]; return (
{/* Copy */}
Lo que ves aquí es menos de la mitad

¿Lo imaginaste?
Lo hacemos.

Taller propio en Bogotá: hierro forjado, pintura electrostática y madera noble. Si lo soñaste, lo diseñamos a tu medida.

Hablar con el taller →
{/* Fotos — grid 2×2 full-bleed */}
{TALLER_TILES.map((t) => (
{t.video ?
); } // E · Tejidos — muestrario editorial: featured izquierda + 4 en grid derecha function TejidosSection() { const goPatron = (patron) => window.__davasRoute?.openCatalog({ patron }); const [hovered, setHovered] = React.useState(null); // Fotos reales de cada patrón — subir a /assets/tejidos/ const TEJIDOS = [ { id: "precolombino", label: "Precolombino Especial", sub: "Rombos ancestrales · multicolor", foto: "/tejido_precolombino_especial.jpg", pos: "52% 28%", scale: "220%", }, { id: "lineal", label: "Lineal con refuerzo", sub: "El clásico · estructura natural", foto: "/tejido_lineal_refuerzo.jpg", pos: "50% 22%", scale: "180%", }, { id: "diamante", label: "Precolombino Diamante", sub: "Geometría ancestral · dos tonos", foto: "/tejido_precolombino_diamante.jpg", pos: "52% 30%", scale: "200%", }, { id: "olas", label: "Olas", sub: "Zigzag en movimiento", foto: "/tejido_olas.jpg", pos: "50% 38%", scale: "190%", }, { id: "espiga", label: "Espiga", sub: "Chevron · elegancia estructural", foto: "/tejido_espiga.jpg", pos: "50% 32%", scale: "210%", }, ]; const [featured, ...rest] = TEJIDOS; return (
{/* Header */}
El detalle que cambia todo

Una pieza, muchos tejidos.

El mismo modelo cambia por completo según el patrón — cada uno tejido a mano, nudo a nudo.

{/* Grid de tarjetas */}
{TEJIDOS.map((t) => (
goPatron(t.id)}>
{t.label}
{t.label}
{t.sub}
))}
); } function ModelsSection() { const goModelo = (name) => window.__davasRoute?.openModelo(name); const goCatalog = () => window.__davasRoute?.openCatalog(); return (
02 · Modelos icónicos · agrupados

Seis nombres
que se repiten.

Cada modelo se ofrece en varias versiones — patrón, madera y color de hilo. Entra al modelo y ves todas sus variantes en una sola página.

{MODELS.map((m, i) => (
goModelo(m.name)}>
M / {String(i + 1).padStart(2, "0")} {m.since}
{m.variants} versiones

{m.name}

{m.blurb}

{m.family} · {m.variants} versiones Ver todas
))}
); } function FeaturedSection({ showPrices, cardStyle }) { const goCatalog = () => window.__davasRoute?.openCatalog(); const railRef = React.useRef(null); const [canLeft, setCanLeft] = useState(false); const [canRight, setCanRight] = useState(true); const updateArrows = () => { const el = railRef.current; if (!el) return; setCanLeft(el.scrollLeft > 8); setCanRight(el.scrollLeft < el.scrollWidth - el.clientWidth - 8); }; React.useEffect(() => { updateArrows(); const el = railRef.current; if (!el) return; el.addEventListener("scroll", updateArrows, { passive: true }); window.addEventListener("resize", updateArrows); return () => { el.removeEventListener("scroll", updateArrows); window.removeEventListener("resize", updateArrows); }; }, []); const scrollBy = (dir) => { const el = railRef.current; if (!el) return; const card = el.querySelector(".feat-card"); const step = card ? card.offsetWidth + 24 : 360; el.scrollBy({ left: dir * step, behavior: "smooth" }); }; return (
La colección

Piezas que
se eligen así.

Una muestra de lo que se está tejiendo ahora. Cada pieza, un patrón distinto — toca para ver el resto.

{FEATURED.map((p, i) => (
window.__davasRoute?.openFicha(p.id)}>
N°. {String(i + 1).padStart(2, "0")}
{p.photo ? ( {p.name} ) : ( )}

{p.name}

{p.pattern || p.family} {showPrices && p.price ? $ {p.price} : null}
))}
+{Math.max((window.CATALOGO||[]).length - FEATURED.length, 0)} piezas más
en el catálogo
Ver todo
); } function FeatHeart({ p }) { const wl = useWishlist(); const isOn = wl.has(p.id); return ( ); } function ClientesSection() { const goClientes = () => window.__davasRoute?.setPage("clientes"); return (
04 · Sillas en su ambiente

Cinco piezas,
cinco casas.

Fotos reales de clientes DAVA'S. Cada pieza tejida a mano, cada espacio único. Así se ven nuestros muebles donde de verdad importa — en tu casa.

{CLIENTES.map((c, i) => (
{c.photo ? ( {c.caption} ) : ( )}
C / {String(i + 1).padStart(2, "0")} {c.by}

{c.caption}

{c.product}
))}
); } function TallerTease({ setPage }) { return (
05 · El Taller

No tenemos bodega.
Tenemos manos.

Tu pieza se empieza a tejer cuando tú la pides. Hilo, madera, tiempo — y un taller listo para cumplirte en quince días.

Artesanos DAVA'S trabajando en el taller
Showroom DAVA'S — piezas en exhibición
); } function ShowroomCursosSection() { return (
06 · Showroom + Cursos

Conócelas
en persona.

El showroom es sala de ventas con cita: la piezas en tamaño real, el peso del hilo en la mano, la madera que no se ve en foto.

Y desde 2026, cursos para aprender a tejer con nosotros — módulos pagos, cupos pequeños.

Showroom DAVA'S Bogotá
· 01 SHOWROOM

Bogotá

Cra 21 · 49 — 13 · Bogotá
Pregunta por WhatsApp
CURSOS DE TEJIDO

Aprende a tejer
con nosotros.

Módulos desde iniciación hasta patrón diamante. Cupos pequeños, en el taller de Bogotá. Te llevas tu pieza terminada.

); } function WhatsAppBand() { return (
07 · WhatsApp · canal directo

El cierre
es por chat.

No hay carrito ni pasarela: los pedidos se confirman por WhatsApp, una conversación con quien hace tu pieza. Te respondemos en horas hábiles.

~ 15 d
Producción a pedido
72k
@artedavas en IG
2014
Año uno del taller
); } function NewsletterBand() { const [email, setEmail] = useState(""); const [sent, setSent] = useState(false); return (
09 · Diario del taller

Una nota al mes —
nuevas piezas y fechas de cursos.

{ e.preventDefault(); if (email) setSent(true); }}> {sent ? ( · LISTO. TE ESCRIBIMOS PRONTO. ) : ( <> setEmail(e.target.value)} required /> )}
); } function InstaStrip() { return (
08 · Redes

@artedavas

{CLIENTES.filter(c => c.photo).slice(0, 5).map((c, i) => { const labels = ["IG · POST", "TT · REEL", "IG · REEL", "IG · POST", "TT · REEL"]; return ( {c.by}
{labels[i]} → @artedavas
); })}
Síguenos
@artedavas
); } function Footer({ setPage }) { const go = (p) => () => window.__davasRoute?.setPage(p); const cat = (id) => () => window.__davasRoute?.openCategoria(id); const WA = "https://wa.me/573005260637"; const isMob = typeof window !== "undefined" && window.innerWidth < 760; const catItems = [ , , , , , , , , ]; const nosotrosItems = [ , , , , ]; const contactoItems = [ WhatsApp, ventas@artedavas.com, @artedavas, TikTok, ]; // Desktop: columna clásica (título fijo + lista). Mobile: acordeón nativo, // colapsado por defecto — nada de parrillas de 15 links apretadas. const FooterCol = ({ title, items }) => { if (!isMob) { return (

{title}

    {items.map((it, i) =>
  • {it}
  • )}
); } return (
{title}
    {items.map((it, i) =>
  • {it}
  • )}
); }; return (
{/* Brand */}
DAVA'S Arte & Diseño { e.target.outerHTML = "DAVA'S"; }} />

Muebles tejidos a mano sobre hierro y madera noble. Taller en Bogotá desde 2014.

300 526 0637
© DAVA'S {new Date().getFullYear()} · Arte & Diseño · Colombia Hecho a mano en Bogotá
); } function Home({ setPage, showPrices, cardStyle }) { return ( <>