<style>
:root { --pcv-color: #0B697A; --pcv-light: #F0F8F9; --pcv-dark: #07353D; }
body { margin: 0; padding: 0; background-color: #f8f9fa; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; }
.app-container { width: 100%; max-width: 100%; margin: 0 auto; background: #fff; min-height: 100vh; display: flex; flex-direction: column; }
/* Cabecera */
.header { background: var(--pcv-color); color: white; padding: 25px 15px; text-align: center; }
.header h1 { margin: 0; font-size: 24px; text-transform: uppercase; letter-spacing: 1px; }
/* Buscador Fijo */
.sticky-search { position: sticky; top: 0; z-index: 100; background: white; padding: 15px; border-bottom: 2px solid var(--pcv-color); box-shadow: 0 4px 10px rgba(0,0,0,0.1); }
input#breedSearch { width: 100% !important; height: 55px !important; border: 3px solid var(--pcv-color); border-radius: 12px; padding: 0 15px !important; font-size: 18px !important; font-weight: bold; outline: none; box-sizing: border-box; }
/* Menú de Grupos Vertical */
.vertical-menu { padding: 15px; display: flex; flex-direction: column; gap: 12px; }
.group-card {
background: white; border: 2px solid #eee; border-radius: 15px; padding: 20px;
display: flex; justify-content: space-between; align-items: center;
transition: 0.2s; cursor: pointer; border-left: 8px solid var(--pcv-color);
}
.group-card:active { background: var(--pcv-light); transform: scale(0.98); }
.group-name { font-weight: 800; color: var(--pcv-dark); font-size: 16px; text-transform: uppercase; }
.group-count { font-size: 12px; color: var(--pcv-color); font-weight: bold; }/* Vista de Lista de Perros (Dentro del grupo) */
.list-view { display: none; padding: 0; }
.breed-row {
padding: 20px 15px; border-bottom: 1px solid #eee;
display: flex; justify-content: space-between; align-items: center;
}
.breed-row:active { background: var(--pcv-light); }
.b-main-name { font-size: 18px; font-weight: bold; color: #222; }
/* Ficha Técnica Expandida */
.full-modal { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: white; z-index: 2000; overflow-y: auto; }
.modal-nav { background: var(--pcv-color); color: white; padding: 20px; position: sticky; top: 0; display: flex; align-items: center; gap: 15px; z-index: 10; }
.back-btn { background: white; color: var(--pcv-color); border: none; padding: 10px 18px; border-radius: 10px; font-weight: 900; font-size: 14px; }
.content-area { padding: 20px; line-height: 1.8; font-size: 17px; }
.content-area img { width: 100%; border-radius: 20px; margin-bottom: 25px; box-shadow: 0 8px 20px rgba(0,0,0,0.15); }
.wiki-section { margin-bottom: 25px; padding: 15px; background: #f9f9f9; border-radius: 12px; }
.wiki-section h3 { color: var(--pcv-color); margin-top: 0; border-bottom: 2px solid var(--pcv-color); display: inline-block; }
.google-btn {
display: block; width: 100%; background: #4285F4; color: white;
text-align: center; padding: 20px; border-radius: 15px;
text-decoration: none; font-weight: bold; margin: 30px 0; font-size: 18px;
}
</style>
<div class="app-container" id="mainApp">
<div id="homeView">
<div class="header">
<h1>Canipedia PCV</h1>
</div>
<div class="sticky-search">
<input type="text" id="breedSearch" placeholder="🔍 Buscar raza..." onkeyup="handleSearch()">
</div>
<div id="groupContainer" class="vertical-menu">
</div>
<div class="az-section" style="padding:20px;">
<p style="font-size:12px; font-weight:bold; color:#999; text-transform:uppercase;">Lista Alfabética Completa:</p>
<select id="azSelect" style="width:100%; height:55px; border-radius:12px; border:2px solid #ccc; font-size:16px; padding:10px;" onchange="if(this.value) openBreed(this.value)">
<option value="">Selecciona una raza...</option>
</select>
</div>
</div>
<div id="listView" class="list-view">
<div class="modal-nav">
<button class="back-btn" onclick="showHome()">← VOLVER</button>
<h2 id="listTitle" style="margin:0; font-size:18px;"></h2>
</div>
<div id="breedResults"></div>
</div>
</div>
<div id="breedModal" class="full-modal">
<div class="modal-nav">
<button class="back-btn" onclick="closeBreed()">← VOLVER</button>
<h2 id="modalTitle" style="margin:0; font-size:18px; text-transform:uppercase;"></h2>
</div>
<div id="modalContent" class="content-area"></div>
<div style="padding: 0 20px 40px;">
<button class="google-btn" style="background:#666;" onclick="closeBreed()">VOLVER AL MENÚ</button>
</div>
</div>
<script>const BREEDS = [
{n:"Pastor alemán", g:1, a:"Ovejero Alemán"}, {n:"Pastor belga (Malinois)", g:1, a:"Malinois"}, {n:"Pastor belga (Groenendael)", g:1, a:"Groenendael"}, {n:"Pastor belga (Tervueren)", g:1, a:"Tervueren"}, {n:"Pastor belga (Laekenois)", g:1, a:"Laekenois"}, {n:"Schipperke", g:1, a:""}, {n:"Pastor de Beauce", g:1, a:"Beauceron"}, {n:"Pastor de Brie", g:1, a:"Briard"}, {n:"Pastor de Picardía", g:1, a:""}, {n:"Pastor de los Pirineos de pelo largo", g:1, a:""}, {n:"Border Collie", g:1, a:""}, {n:"Bearded Collie", g:1, a:""}, {n:"Collie de pelo largo", g:1, a:"Rough Collie"}, {n:"Collie de pelo corto", g:1, a:"Smooth Collie"}, {n:"Shetland Sheepdog", g:1, a:"Sheltie"}, {n:"Old English Sheepdog", g:1, a:"Bobtail"}, {n:"Welsh Corgi Cardigan", g:1, a:""}, {n:"Welsh Corgi Pembroke", g:1, a:"Corgi"},{n:"Kelpie australiano", g:1, a:""}, {n:"Pastor australiano", g:1, a:"Aussie"}, {n:"Boyero de Australia", g:1, a:"Heeler"}, {n:"Pastor blanco suizo", g:1, a:""}, {n:"Saarloos wolfdog", g:1, a:""}, {n:"Perro lobo checoslovaco", g:1, a:""}, {n:"Pastor holandés", g:1, a:""}, {n:"Kuvasz", g:1, a:""}, {n:"Puli", g:1, a:""}, {n:"Pumi", g:1, a:""}, {n:"Mudi", g:1, a:""}, {n:"Komondor", g:1, a:""}, {n:"Bergamasco", g:1, a:""}, {n:"Pastor de Maremma", g:1, a:""}, {n:"Pastor polaco de las llanuras", g:1, a:""}, {n:"Pastor de Tatra", g:1, a:""}, {n:"Pastor mallorquín", g:1, a:"Ca de Bestiar"}, {n:"Pastor catalán", g:1, a:"Gos d'Atura"},{n:"Doberman", g:2, a:""}, {n:"Pinscher alemán", g:2, a:""}, {n:"Pinscher miniatura", g:2, a:""}, {n:"Affenpinscher", g:2, a:""}, {n:"Pinscher austriaco", g:2, a:""}, {n:"Schnauzer gigante", g:2, a:""}, {n:"Schnauzer estándar", g:2, a:""}, {n:"Schnauzer miniatura", g:2, a:""}, {n:"Smoushond holandés", g:2, a:""}, {n:"Terrier ruso negro", g:2, a:""}, {n:"Dogo argentino", g:2, a:""}, {n:"Fila brasileiro", g:2, a:""}, {n:"Shar Pei", g:2, a:""}, {n:"Boxer", g:2, a:""}, {n:"Gran danés", g:2, a:"Dogo Alemán"}, {n:"Rottweiler", g:2, a:""},{n:"Perro de presa canario", g:2, a:"Dogo Canario"}, {n:"Dogo de Burdeos", g:2, a:""}, {n:"Bulldog inglés", g:2, a:""}, {n:"Bullmastiff", g:2, a:""}, {n:"Mastín inglés", g:2, a:""}, {n:"Mastín napolitano", g:2, a:""}, {n:"Cane Corso", g:2, a:"Mastín Italiano"}, {n:"Tosa Inu", g:2, a:""}, {n:"Mastín español", g:2, a:""}, {n:"Mastín del Pirineo", g:2, a:""}, {n:"Perro de montaña de los Pirineos", g:2, a:""}, {n:"Terranova (perro)", g:2, a:""}, {n:"Leonberger", g:2, a:""}, {n:"Landseer", g:2, a:""}, {n:"San Bernardo (perro)", g:2, a:""}, {n:"Pastor del Cáucaso", g:2, a:""}, {n:"Pastor de Asia Central", g:2, a:""}, {n:"Mastín tibetano", g:2, a:""}, {n:"Boyero de Berna", g:2, a:""}, {n:"Hovawart", g:2, a:""},{n:"Airedale terrier", g:3, a:""}, {n:"Irish terrier", g:3, a:""}, {n:"Kerry blue terrier", g:3, a:""}, {n:"Soft Coated Wheaten Terrier", g:3, a:""}, {n:"Bedlington terrier", g:3, a:""}, {n:"Border terrier", g:3, a:""}, {n:"Fox terrier", g:3, a:""}, {n:"Lakeland terrier", g:3, a:""}, {n:"Manchester terrier", g:3, a:""}, {n:"Parson Russell terrier", g:3, a:""}, {n:"Jack Russell terrier", g:3, a:""}, {n:"Scottish terrier", g:3, a:""}, {n:"Skye terrier", g:3, a:""}, {n:"Cairn terrier", g:3, a:""}, {n:"Welsh terrier", g:3, a:""}, {n:"Sealyham terrier", g:3, a:""}, {n:"West Highland white terrier", g:3, a:"Westie"},{n:"Staffordshire bull terrier", g:3, a:"Staffy"}, {n:"American Staffordshire Terrier", g:3, a:"Amstaff"}, {n:"Bull terrier", g:3, a:""}, {n:"American Hairless Terrier", g:3, a:""}, {n:"Yorkshire terrier", g:3, a:"Yorkie"}, {n:"Australian Terrier", g:3, a:""}, {n:"Silky terrier", g:3, a:""}, {n:"Norwich terrier", g:3, a:""}, {n:"Norfolk terrier", g:3, a:""}, {n:"Cesky terrier", g:3, a:""}, {n:"Jagdterrier", g:3, a:""},{n:"Dachshund", g:4, a:"Teckel, Salchicha, Perro Salchicha"}, {n:"Teckel miniatura", g:4, a:""}, {n:"Teckel para la caza del conejo", g:4, a:""},{n:"Siberian Husky", g:5, a:"Husky"}, {n:"Alaskan Malamute", g:5, a:""}, {n:"Samoyedo (perro)", g:5, a:""}, {n:"Perro de Groenlandia", g:5, a:""}, {n:"Akita Inu", g:5, a:""}, {n:"Akita Americano", g:5, a:""}, {n:"Shiba Inu", g:5, a:""}, {n:"Chow Chow", g:5, a:""}, {n:"Eurasier", g:5, a:""}, {n:"Kishu", g:5, a:""}, {n:"Shikoku Inu", g:5, a:""}, {n:"Kai Ken", g:5, a:""}, {n:"Jindo coreano", g:5, a:""}, {n:"Pomerania (perro)", g:5, a:"Spitz Enano"}, {n:"Spitz alemán", g:5, a:""}, {n:"Volpino italiano", g:5, a:""},{n:"Basenji", g:5, a:""}, {n:"Xoloitzcuintle", g:5, a:""}, {n:"Perro sin pelo del Perú", g:5, a:""}, {n:"Podenco ibicenco", g:5, a:""}, {n:"Podenco canario", g:5, a:""}, {n:"Cirneco del Etna", g:5, a:""}, {n:"Pharaoh hound", g:5, a:""}, {n:"Thai ridgeback", g:5, a:""}, {n:"Perro de Taiwán", g:5, a:""}, {n:"Canaan Dog", g:5, a:""},{n:"Bloodhound", g:6, a:"Perro de San Huberto"}, {n:"Beagle", g:6, a:""}, {n:"Basset hound", g:6, a:""}, {n:"Dálmata (perro)", g:6, a:""}, {n:"Rhodesian Ridgeback", g:6, a:""}, {n:"Sabueso español", g:6, a:""}, {n:"Foxhound inglés", g:6, a:""}, {n:"Foxhound americano", g:6, a:""}, {n:"Black and Tan Coonhound", g:6, a:""}, {n:"Sabueso artesiano", g:6, a:""}, {n:"Poitevin", g:6, a:""}, {n:"Billy (perro)", g:6, a:""}, {n:"Harrier (perro)", g:6, a:""}, {n:"Otterhound", g:6, a:""}, {n:"Drever", g:6, a:""},{n:"Pointer inglés", g:7, a:""}, {n:"Setter inglés", g:7, a:""}, {n:"Setter irlandés rojo", g:7, a:""}, {n:"Setter irlandés rojo y blanco", g:7, a:""}, {n:"Setter gordon", g:7, a:""}, {n:"Braco alemán de pelo corto", g:7, a:""}, {n:"Braco alemán de pelo duro", g:7, a:""}, {n:"Weimaraner", g:7, a:"Braco de Weimar"}, {n:"Vizsla", g:7, a:"Braco húngaro"}, {n:"Braco de Auvernia", g:7, a:""}, {n:"Epagneul breton", g:7, a:""}, {n:"Perdiguero de Burgos", g:7, a:""}, {n:"Spinone", g:7, a:""}, {n:"Braco francés", g:7, a:""},{n:"Labrador retriever", g:8, a:""}, {n:"Golden retriever", g:8, a:""}, {n:"Flat-coated retriever", g:8, a:""}, {n:"Curly-coated retriever", g:8, a:""}, {n:"Chesapeake Bay retriever", g:8, a:""}, {n:"Nova Scotia Duck Tolling Retriever", g:8, a:""}, {n:"Cocker spaniel inglés", g:8, a:""}, {n:"Cocker spaniel americano", g:8, a:""}, {n:"English Springer Spaniel", g:8, a:""}, {n:"Welsh Springer Spaniel", g:8, a:""}, {n:"Perro de agua español", g:8, a:"Turco Andaluz"}, {n:"Perro de agua portugués", g:8, a:""}, {n:"Perro de agua francés", g:8, a:"Barbet"}, {n:"Lagotto romagnolo", g:8, a:""}, {n:"American Water Spaniel", g:8, a:""},{n:"Bichón maltés", g:9, a:""}, {n:"Bichón habanero", g:9, a:""}, {n:"Bichón frisé", g:9, a:""}, {n:"Bolognese", g:9, a:""}, {n:"Coton de Tuléar", g:9, a:""}, {n:"Caniche", g:9, a:"Poodle"}, {n:"Grifón de Bruselas", g:9, a:""}, {n:"Perro crestado chino", g:9, a:""}, {n:"Lhasa apso", g:9, a:""}, {n:"Shih Tzu", g:9, a:""}, {n:"Tibetan terrier", g:9, a:""}, {n:"Tibetan spaniel", g:9, a:""}, {n:"Chihuahua (perro)", g:9, a:""}, {n:"Cavalier King Charles Spaniel", g:9, a:""}, {n:"King Charles spaniel", g:9, a:""},{n:"Pequinés", g:9, a:""}, {n:"Chin japonés", g:9, a:""}, {n:"Bulldog francés", g:9, a:"Frenchie"}, {n:"Pug", g:9, a:"Carlino"}, {n:"Boston terrier", g:9, a:""}, {n:"Papillon (perro)", g:9, a:""}, {n:"Kromfohrländer", g:9, a:""}, {n:"Galgo afgano", g:10, a:""}, {n:"Saluki", g:10, a:""}, {n:"Borzoi", g:10, a:""}, {n:"Irish Wolfhound", g:10, a:"Lobero Irlandés"}, {n:"Deerhound", g:10, a:""}, {n:"Galgo español", g:10, a:""}, {n:"Greyhound", g:10, a:"Galgo Inglés"}, {n:"Whippet", g:10, a:""}, {n:"Pequeño lebrel italiano", g:10, a:""}, {n:"Azawakh", g:10, a:""}, {n:"Sloughi", g:10, a:""}, {n:"Magyar agár", g:10, a:""}, {n:"Chart polski", g:10, a:""}];
const GROUP_NAMES = [
"Pastoreo y Boyeros", "Pinscher, Schnauzer y Molosos", "Terriers", "Teckels (Salchichas)",
"Spitz y Primitivos", "Sabuesos y Rastreadores", "Muestra (Cazadores)",
"Cobradores y de Agua", "Compañía y Falda", "Lebreles (Galgos)"
];
function init() {
const groupContainer = document.getElementById('groupContainer');
const azSelect = document.getElementById('azSelect');
// Generar Menú de Grupos Vertical
GROUP_NAMES.forEach((name, i) => {
const count = BREEDS.filter(b => b.g === (i+1)).length;
const div = document.createElement('div');
div.className = 'group-card';
div.onclick = () => showListView(i + 1);
div.innerHTML = `
<div class="group-name">${i+1}. ${name}</div>
<div class="group-count">${count} Razas</div>
`;
groupContainer.appendChild(div);
});
// Cargar Select A-Z
const sorted = [...BREEDS].sort((a,b) => a.n.localeCompare(b.n));
sorted.forEach(breed => {
let opt = document.createElement('option');
opt.value = breed.n;
opt.text = breed.n;
azSelect.add(opt);
});
}function showHome() {
document.getElementById('homeView').style.display = 'block';
document.getElementById('listView').style.display = 'none';
window.scrollTo(0, 0);
}
function showListView(groupId) {
document.getElementById('homeView').style.display = 'none';
document.getElementById('listView').style.display = 'block';
document.getElementById('listTitle').innerText = GROUP_NAMES[groupId - 1];
const results = document.getElementById('breedResults');
results.innerHTML = '';
const filtered = BREEDS.filter(b => b.g === groupId);
filtered.forEach(breed => {
const row = document.createElement('div');
row.className = 'breed-row';
row.onclick = () => openBreed(breed.n);
row.innerHTML = `
<span class="b-main-name">${breed.n.split(' (')[0]}</span>
<span style="color:var(--pcv-color); font-weight:bold;">VER →</span>
`;
results.appendChild(row);
});
window.scrollTo(0, 0);
}function handleSearch() {
const query = document.getElementById('breedSearch').value.toLowerCase().trim();
if(query.length < 2) return;
const filtered = BREEDS.filter(b =>
b.n.toLowerCase().includes(query) || (b.a && b.a.toLowerCase().includes(query))
);
if(filtered.length > 0) {
document.getElementById('homeView').style.display = 'none';
document.getElementById('listView').style.display = 'block';
document.getElementById('listTitle').innerText = "Resultados de búsqueda";
const results = document.getElementById('breedResults');
results.innerHTML = '';
filtered.forEach(breed => {
const row = document.createElement('div');
row.className = 'breed-row';
row.onclick = () => openBreed(breed.n);
row.innerHTML = `
<div style="display:flex; flex-direction:column;">
<span class="b-main-name">${breed.n.split(' (')[0]}</span>
<small style="color:#777;">Grupo ${breed.g}: ${GROUP_NAMES[breed.g-1]}</small>
</div>
<span style="color:var(--pcv-color); font-weight:bold;">VER →</span>
`;
results.appendChild(row);
});
}
}async function openBreed(name) {
const modal = document.getElementById('breedModal');
const content = document.getElementById('modalContent');
document.getElementById('modalTitle').innerText = name.split(' (')[0];
modal.style.display = 'block';
content.innerHTML = '<div style="text-align:center; padding:50px;">Extrayendo toda la información técnica...</div>';
const cleanName = name.replace(/ /g, '_');
try {
// Intentamos obtener el contenido móvil formateado de Wikipedia
const r = await fetch(`https://es.wikipedia.org/api/rest_v1/page/mobile-sections/${encodeURIComponent(cleanName)}`);
const data = await r.json();
let htmlContent = '';
// Imagen principal
if(data.lead.image) {
htmlContent += `<img src="${data.lead.image.urls[640] || data.lead.image.urls[320]}" alt="${name}">`;
}
// Secciones de información (Historia, Temperamento, Características)
data.lead.sections.forEach(sec => {
if(sec.text) htmlContent += `<div class="wiki-section">${sec.text}</div>`;
});
if(data.remaining && data.remaining.sections) {
data.remaining.sections.forEach(sec => {
if(sec.anchor === "Historia" || sec.anchor === "Temperamento" || sec.anchor === "Características" || sec.anchor === "Carácter") {
htmlContent += `
<div class="wiki-section">
<h3 style="text-transform:uppercase;">${sec.anchor}</h3>
<div>${sec.text}</div>
</div>`;
}
});
}
content.innerHTML = htmlContent + `
<a href="https://www.google.com/search?q=${encodeURIComponent(name + ' raza de perro características y cuidados')}"
target="_blank" class="google-btn">
BUSCAR MÁS DETALLES EN GOOGLE
</a>
`;
} catch (e) {
content.innerHTML = `
<p>No se pudo cargar la ficha automática completa.</p>
<a href="https://www.google.com/search?q=${encodeURIComponent(name + ' características')}"
target="_blank" class="google-btn">
BUSCAR ESTA RAZA EN GOOGLE
</a>
`;
}
window.scrollTo(0, 0);
}function closeBreed() {
document.getElementById('breedModal').style.display = 'none';
}
// Iniciar aplicación al cargar la ventana
window.onload = init;
</script>