/* 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 (
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 →El mismo modelo cambia por completo según el patrón — cada uno tejido a mano, nudo a nudo.
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}
Una muestra de lo que se está tejiendo ahora. Cada pieza, un patrón distinto — toca para ver el resto.
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.