// Categories carousel — la lista viva sale del backend (api/categorias.php) // con fallback a los datos por defecto si la API no responde. const { useState, useEffect, useRef } = React; const DEFAULT_CATEGORIES = [ { age: "Sub-7", years: "5 – 7 años", desc: "Primeros contactos con la pelota. Juego libre, motricidad, hacer amigos.", color: "#4FB8E6", students: 28, coach: "Prof. Marian Di Paola", schedule: "Mar · Jue 17:00–18:00", photo: "https://images.unsplash.com/photo-1624880357913-a8539238245b?w=800&auto=format&fit=crop&q=80" }, { age: "Sub-9", years: "7 – 9 años", desc: "Técnica individual, pase, conducción. Festivales los sábados.", color: "#4FB8E6", students: 34, coach: "Prof. Luis Fernández", schedule: "Lun · Mié · Vie 17:00–18:30", photo: "https://images.unsplash.com/photo-1459865264687-595d652de67e?w=800&auto=format&fit=crop&q=80" }, { age: "Sub-11", years: "9 – 11 años", desc: "Juego en espacios reducidos, roles, primeros torneos oficiales.", color: "#1D4ED8", students: 30, coach: "Prof. Carolina Vera", schedule: "Lun · Mié · Vie 17:30–19:00", photo: "https://images.unsplash.com/photo-1431324155629-1a6deb1dec8d?w=800&auto=format&fit=crop&q=80" }, { age: "Sub-13", years: "11 – 13 años", desc: "Fútbol 11. Táctica básica, preparación física inicial.", color: "#0B2545", students: 26, coach: "Prof. Maxi Torres", schedule: "Mar · Jue · Vie 18:00–19:30", photo: "https://images.unsplash.com/photo-1522778034537-20a2486be803?w=800&auto=format&fit=crop&q=80" }, { age: "Sub-15", years: "13 – 15 años", desc: "Competencia regional, identidad de juego, responsabilidad.", color: "#4FB8E6", students: 24, coach: "Prof. Daniel Arce", schedule: "Lun · Mié · Vie 18:30–20:00", photo: "https://images.unsplash.com/photo-1517466787929-bc90951d0974?w=800&auto=format&fit=crop&q=80" }, { age: "Sub-17", years: "15 – 17 años", desc: "Pre-competencia, proyección, acompañamiento integral.", color: "#A7DCF5", students: 22, coach: "Prof. Rodrigo Pérez", schedule: "Lun · Mié · Vie 19:00–20:30", photo: "https://images.unsplash.com/photo-1551958219-acbc608c6377?w=800&auto=format&fit=crop&q=80" }]; // Lista rica sincronizada con el backend: cada campo cargado desde el panel // (edades, descripción, entrenador, horario, foto, color) pisa el contenido // por defecto del sitio; lo vacío conserva la ficha original. Las categorías // nuevas reciben una tarjeta genérica. Respeta orden y bajas del panel. window.fcpbCatsRich = function () { const porNombre = {}; DEFAULT_CATEGORIES.forEach((c) => { porNombre[c.age] = c; }); const generica = (n) => ({ age: n, years: "", color: "#1D4ED8", students: "—", coach: "A confirmar", schedule: "A confirmar", desc: "Nueva categoría del club. Escribinos para conocer horarios y detalles.", photo: "https://images.unsplash.com/photo-1431324155629-1a6deb1dec8d?w=800&auto=format&fit=crop&q=80", }); if (!window.fcpbCatsFull) return Promise.resolve(DEFAULT_CATEGORIES); return window.fcpbCatsFull().then((lista) => lista.map((b) => { const base = porNombre[b.nombre] || generica(b.nombre); return { age: b.nombre, years: b.edades || base.years, desc: b.descripcion || base.desc, coach: b.entrenador || base.coach, schedule: b.horario || base.schedule, photo: b.foto_url || base.photo, color: b.color || base.color, students: (b.jugadores != null && b.jugadores > 0) ? b.jugadores : base.students, }; })).catch(() => DEFAULT_CATEGORIES); }; function CategoriasCarousel() { const scrollerRef = useRef(null); const [index, setIndex] = useState(0); const [cats, setCats] = useState(DEFAULT_CATEGORIES); useEffect(() => { window.fcpbCatsRich().then(setCats); }, []); const scrollTo = (i) => { const el = scrollerRef.current; if (!el) return; const card = el.children[i]; if (card) { el.scrollTo({ left: card.offsetLeft - 32, behavior: 'smooth' }); } setIndex(i); }; const next = () => scrollTo(Math.min(index + 1, cats.length - 1)); const prev = () => scrollTo(Math.max(index - 1, 0)); useEffect(() => { const el = scrollerRef.current; if (!el) return; const onScroll = () => { const kids = Array.from(el.children); const scrollLeft = el.scrollLeft + 40; let i = 0; for (let j = 0; j < kids.length; j++) { if (kids[j].offsetLeft <= scrollLeft + 20) i = j; } setIndex(i); }; el.addEventListener('scroll', onScroll, { passive: true }); return () => el.removeEventListener('scroll', onScroll); }, []); return (
02 · Categorías

Desde los 3 años
hasta los 17.

Ver todas
{cats.map((c, i) =>
{c.age}
{c.age}
{c.years}

{c.age}

{c.desc}

{/* El horario vive en la sección Horarios, para no repetirlo */}
Jugadores{c.students}
A cargo{c.coach}
)}
{cats.map((_, i) =>
); } window.CategoriasCarousel = CategoriasCarousel; window.FCPB_CATEGORIES = DEFAULT_CATEGORIES;