Enjambre Discografia «2024-2026»

// evento de búsqueda con debounce suave let debounceTimer; function onSearchInput() { clearTimeout(debounceTimer); debounceTimer = setTimeout(() => { currentSearch = searchInput.value; render(); }, 280); }

if (filteredData.length === 0) { gridContainer.innerHTML = `<div class="no-results"><i class="fas fa-dove" style="font-size: 2rem; opacity: 0.6;"></i><br/>No encontramos lanzamientos con esos criterios. <br> 🎧 ¡Prueba con "Manía" o "2020"!</div>`; return; }

return filtered; }

// construcción de cards let html = ''; for (let album of filteredData) { // tipo legible let typeLabel = ''; let typeIcon = ''; if (album.type === 'estudio') { typeLabel = 'Álbum de estudio'; typeIcon = '🎙️'; } else if (album.type === 'ep') { typeLabel = 'EP / Extended Play'; typeIcon = '💿'; } else if (album.type === 'live') { typeLabel = 'En vivo / Concierto'; typeIcon = '🎤'; } enjambre discografia

// filtrar por búsqueda (título, año, canción) if (currentSearch.trim() !== '') { const searchTermNormalized = normalizeText(currentSearch.trim()); filtered = filtered.filter(album => { // match por título if (normalizeText(album.title).includes(searchTermNormalized)) return true; // match por año (string) if (album.year.toString().includes(searchTermNormalized)) return true; // match por tracks if (album.tracks.some(track => normalizeText(track).includes(searchTermNormalized))) return true; return false; }); }

<script> // -------------------------------------------------------------- // DISCOGRAFÍA COMPLETA (ENJAMBRE) // Basado en información real de estudio, EPs, álbumes en vivo. // Incluye títulos, año, tipo, lista de canciones representativa. // -------------------------------------------------------------- const discography = [ { id: 1, title: "Consuelo en Domingo", year: 2006, type: "estudio", coverColor: "#c0aa8a", icon: "fas fa-moon", tracks: ["Intro", "El Baile", "Después de las 12", "Lento", "Visita", "Manía Cardíaca"] }, { id: 2, title: "El Segundo Es Felino", year: 2008, type: "estudio", coverColor: "#ac8e6e", icon: "fas fa-cat", tracks: ["Él No Lo Mató", "Energía", "Tercer Tipo", "Manía Cardíaca", "Sombras", "Dulce Soledad"] }, { id: 3, title: "Daltónico", year: 2010, type: "estudio", coverColor: "#b57c48", icon: "fas fa-palette", tracks: ["Manía Cardíaca", "El Duelo", "Cámara de Faltas", "De Paso", "Sábado Perpetuo", "Los Domingos"] }, { id: 4, title: "Enjambre Y Los Huéspedes del Orbe", year: 2012, type: "estudio", coverColor: "#2b4f6c", icon: "fas fa-globe-americas", tracks: ["Vida en el Espejo", "El Espejo", "Detenido", "Ciencia Ficción", "Huésped", "Gravedad"] }, { id: 5, title: "Proaño", year: 2014, type: "estudio", coverColor: "#3d2b1a", icon: "fas fa-ship", tracks: ["Camino de Vuelta", "Cámara de Faltas", "Obertura", "Tiempo lento", "Secuencia Inicial", "Alma Llanera"] }, { id: 6, title: "Imperfecto Extraño", year: 2017, type: "estudio", coverColor: "#a5653c", icon: "fas fa-star-of-life", tracks: ["Sábado Perpetuo", "Cámara de Faltas", "Vida en el Espejo", "Proaño", "De Paso", "Detenido"] }, { id: 7, title: "Próximos Prójimos", year: 2020, type: "estudio", coverColor: "#c7a05b", icon: "fas fa-users", tracks: ["Visita", "Secuencia Inicial", "Ciencia Ficción", "Dulce Soledad", "Energía", "Sombras"] }, { id: 8, title: "Noches de Salón (En Vivo)", year: 2021, type: "live", coverColor: "#3b2c24", icon: "fas fa-headphones", tracks: ["Manía Cardíaca (Live)", "El Duelo (Live)", "Lento (Live)", "Vida en el Espejo (Live)", "Detenido (Live)"] }, { id: 9, title: "El Cementerio de las Canciones", year: 2023, type: "estudio", coverColor: "#4b3a2c", icon: "fas fa-skull", tracks: ["Cementerio", "Último Vals", "Espejismo", "Divergencia", "Ecos", "Desvelo"] }, { id: 10, title: "Huracán Ambulante", year: 2024, type: "estudio", coverColor: "#5f7f6e", icon: "fas fa-wind", tracks: ["Huracán", "Ambulante", "Norte", "Sur", "Electricidad", "Fantasmas"] }, { id: 11, title: "Bonus Tracks Session (EP)", year: 2015, type: "ep", coverColor: "#c07f4e", icon: "fas fa-record-vinyl", tracks: ["Ocaso (Bonus)", "Lento (Demo)", "Después de las 12 (Remix)", "Girando"] }, { id: 12, title: "En Vivo Desde el Metropólitan", year: 2019, type: "live", coverColor: "#a05e3a", icon: "fas fa-microphone-alt", tracks: ["Manía Cardíaca (Live)", "Cámara de Faltas (Live)", "El Espejo (Live)", "Sábado Perpetuo (En vivo)", "Dulce Soledad"] } ];

<div class="hero"> <h1><i class="fas fa-dove"></i> ENJAMBRE <i class="fas fa-guitar"></i></h1> <p>Discografía completa · Estudio, EPs, En vivo · <i class="fas fa-head-side-vr"></i> legado sonoro mexicano</p> </div> // evento de búsqueda con debounce suave let

// filtros con botones function initFilters() { filterBtns.forEach(btn => { btn.addEventListener('click', () => { const filterValue = btn.getAttribute('data-filter'); currentFilter = filterValue; // actualizar active class filterBtns.forEach(b => b.classList.remove('active')); btn.classList.add('active'); render(); }); }); }

<div class="controls"> <div class="search-box"> <i class="fas fa-search"></i> <input type="text" id="searchInput" placeholder="Buscar por álbum, año o canción..."> </div> <div class="filter-buttons" id="filterGroup"> <button class="filter-btn active" data-filter="all"><i class="fas fa-album-collection"></i> Todos</button> <button class="filter-btn" data-filter="estudio"><i class="fas fa-microphone-alt"></i> Estudio</button> <button class="filter-btn" data-filter="ep"><i class="fas fa-compact-disc"></i> EP</button> <button class="filter-btn" data-filter="live"><i class="fas fa-drumstick-bite"></i> En vivo</button> </div> <div class="stats" id="statsCounter">🎵 0 discos</div> </div>

<!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"> <title>Enjambre · Discografía Esencial</title> <link href="https://fonts.googleapis.com/css2?family=Inter:opsz,wght@14..32,300;14..32,400;14..32,600;14..32,700&display=swap" rel="stylesheet"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css"> <style> * { margin: 0; padding: 0; box-sizing: border-box; } title: "Consuelo en Domingo"

// elementos DOM const gridContainer = document.getElementById('discogGrid'); const searchInput = document.getElementById('searchInput'); const filterBtns = document.querySelectorAll('.filter-btn'); const statsSpan = document.getElementById('statsCounter');

// pequeño helper para evitar XSS function escapeHtml(str) { return str.replace(/[&<>]/g, function(m) { if (m === '&') return '&'; if (m === '<') return '<'; if (m === '>') return '>'; return m; }).replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, function(c) { return c; }); }