/* 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 (
El catálogo entero, organizado como se piensa en taller: por familia, por uso, por patrón. Toca cualquier categoría para explorar.
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.
{m.blurb}
Cada semana cambia. Las piezas que estamos tejiendo, las que acaban de salir, las que se están armando. Lo que ves acá es producción real.
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.
{c.caption}
Tu pieza se empieza a tejer cuando tú la pides. Hilo, madera, tiempo — y un taller listo para cumplirte en quince días.
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.
Módulos desde iniciación hasta patrón diamante. Cupos pequeños, en el taller de Bogotá. Te llevas tu pieza terminada.
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.