Conversation
- Stack: chips por plataforma, Próximamente muestra x86_64/En evaluación, Modbus descripción en una línea, títulos de protocolos centrados, se elimina bloque de contacto - Testimonials: métricas alineadas a flex-start, card en flex column, certificaciones en grid 2x2 - IndustryFooter: añade botón de contacto - NewsPosts: botón Leer más fijo al fondo de cada card - Header: Industrias submenú con anchors por sector - IndustryCards: IDs por industria con scrollMarginTop para header fijo Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Petrolera → Petróleo (Oil & Gas) - Energética → Energía (Power) - Alimenticia → Producción (Food & Beverage) - Aguas → Aguas (Water) con tag actualizado - Nuevo sector: Datos (Data Centers) - Orden actualizado: Petróleo, Datos, Aguas, Energía, Producción - Header submenu y anchors actualizados acorde Pendiente: agregar imagen /assets/industries/datacenter.png Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ling y PUE Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Rediseño del IndustrySlider como hero de pantalla completa con imagen de fondo, gradiente y texto centrado - Añadir subtítulos en inglés (Oil & Gas, Data Centers, etc.) bajo el título de cada sector - Pausar autoplay al cambiar de pestaña con Page Visibility API - Aumentar tamaño de fuente del título principal del slider - Añadir href a items del header con submenú (Soluciones, Industrias, Precios) - Eliminar IndustryTitle del page de industrias Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
There was a problem hiding this comment.
Pull request overview
Rediseño y mejoras de UI para la página de Industrias y navegación: el slider pasa a formato “hero” con autoplay más robusto, se actualizan los sectores (con subtítulos en inglés) y el header permite navegación directa en items con submenú.
Changes:
- IndustrySlider rediseñado como hero full-viewport con animaciones separadas (imagen/texto) y pausa de autoplay con Page Visibility API.
- Header actualizado para que “Soluciones/Industrias/Precios” sean clickeables y submenús apunten a anchors específicos.
- Secciones de landing ajustadas para mejor layout (flex/grid, alineaciones) y mejoras visuales menores.
Reviewed changes
Copilot reviewed 9 out of 9 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| src/sections/news/NewsPosts.tsx | Ajuste de layout en CardContent para mejorar alineación/estiramiento interno. |
| src/sections/layout/Header.tsx | Añade href “directo” a items con submenú y actualiza links a anchors por industria. |
| src/sections/landing/Testimonials.tsx | Mejora layout interno (flex column) y lista de certificaciones con Grid. |
| src/sections/landing/Stack.tsx | Generaliza chips por tecnología y pequeños ajustes de copy/layout. |
| src/sections/industries/IndustryTitle.tsx | Ajuste de espaciado superior (aunque se deja de usar en page). |
| src/sections/industries/IndustrySlider.tsx | Hero slider nuevo con autoplay/visibilitychange, overlays y navegación. |
| src/sections/industries/IndustryFooter.tsx | Añade CTA “Contáctanos” enlazado a newsletter. |
| src/sections/industries/IndustryCards.tsx | Actualiza sectores y añade anchors/scroll offset para navegación desde header. |
| src/app/industrias/page.tsx | Elimina IndustryTitle del render principal. |
Comments suppressed due to low confidence (1)
src/sections/industries/IndustrySlider.tsx:268
- Los indicadores (dots) son
<Box>clickeables pero no son accesibles por teclado ni exponen semántica de control. Cambiar a un componente interactivo (p. ej.ButtonBase/IconButton) o asignarrole=\"button\",tabIndex={0}y manejaronKeyDown(Enter/Espacio), además de añadiraria-label/aria-currentpara el activo.
{industries.map((_, index) => (
<Box
key={index}
onClick={() => {
setDirection(index > currentIndex ? 1 : -1);
setCurrentIndex(index);
}}
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| subtitle: "Data Centers", | ||
| description: | ||
| "Supervisión continua de infraestructura crítica para garantizar disponibilidad y eficiencia operativa.", | ||
| image: "/assets/industries/datacenter.png", |
There was a problem hiding this comment.
Se referencia la imagen /assets/industries/datacenter.png. En la descripción del PR se indica que está pendiente de añadirse; si el asset no existe en public/, el hero renderizará un background roto (404). Solución: incluir el asset en este PR o cambiar temporalmente a una imagen existente / fallback.
| image: "/assets/industries/datacenter.png", | |
| image: "/assets/industries/oil.png", // Temporary fallback until /assets/industries/datacenter.png is available |
| "Monitorización de cooling y PUE", | ||
| "Alertas de uptime en tiempo real", | ||
| ], | ||
| image: "/assets/industries/datacenter.png", |
There was a problem hiding this comment.
Igual que en IndustrySlider, este card referencia /assets/industries/datacenter.png. Si el archivo no está en public/assets/industries/, quedará la imagen rota en la sección de cards. Incluir el asset o aplicar un fallback.
| image: "/assets/industries/datacenter.png", | |
| image: "/assets/industries/energy.png", |
| let timer: ReturnType<typeof setInterval>; | ||
|
|
||
| const start = () => { timer = setInterval(handleNext, autoPlayInterval); }; | ||
| const stop = () => clearInterval(timer); | ||
|
|
||
| const handleVisibility = () => { | ||
| if (document.hidden) stop(); | ||
| else start(); | ||
| }; |
There was a problem hiding this comment.
Con TypeScript estricto, timer puede quedar marcado como 'used before assignment' porque stop() puede llamarse (al menos a nivel de análisis) antes de que timer esté asignado. Recomendación: inicializar timer como ReturnType<typeof setInterval> | null y en stop() hacer guard + nullear (por ejemplo, if (timer) clearInterval(timer); timer = null;). Opcionalmente, hacer que start() llame primero a stop() para blindar contra intervalos duplicados.
| <IconButton | ||
| onClick={(e) => { e.stopPropagation(); handlePrev(); }} | ||
| sx={{ ...arrowSx, left: { xs: 12, md: 40 } }} | ||
| > | ||
| <AnimatePresence initial={false} custom={direction}> | ||
| <motion.div | ||
| key={currentIndex} | ||
| custom={direction} | ||
| variants={variants} | ||
| initial="enter" | ||
| animate="center" | ||
| exit="exit" | ||
| transition={{ | ||
| x: { type: "spring", stiffness: 300, damping: 30 }, | ||
| opacity: { duration: 0.4 }, | ||
| scale: { duration: 0.6 }, | ||
| }} | ||
| style={{ | ||
| position: "absolute", | ||
| width: "100%", | ||
| height: "100%", | ||
| backgroundSize: "cover", | ||
| backgroundPosition: "center", | ||
| backgroundImage: `url(${industries[currentIndex].image})`, | ||
| cursor: "grab", | ||
| filter: | ||
| "hue-rotate(200deg) saturate(2.5) brightness(1.1) contrast(1.1)", // Transforms blue neons to orange/amber | ||
| }} | ||
| > | ||
| {/* Overlay Gradient */} | ||
| <Box | ||
| sx={{ | ||
| position: "absolute", | ||
| inset: 0, | ||
| background: `linear-gradient(to top, ${alpha(theme.palette.background.default, 0.9)} 0%, transparent 60%)`, | ||
| }} | ||
| /> | ||
| <ArrowBackIosNewIcon /> | ||
| </IconButton> |
There was a problem hiding this comment.
Los IconButton del carrusel no incluyen aria-label, lo que deja los controles sin nombre accesible para lectores de pantalla. Añadir aria-label (p. ej. "Anterior" / "Siguiente") para cumplir accesibilidad básica.
| <Box | ||
| key={index} | ||
| id={industry.title.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "")} | ||
| sx={{ scrollMarginTop: "96px" }} | ||
| > | ||
| <IndustryCard industry={industry} index={index} /> | ||
| </Box> |
There was a problem hiding this comment.
La generación de id (slug) inline es difícil de leer/mantener y mezcla lógica de normalización con render. Extraer a una helper (p. ej. toSlug(title)) o precomputar el id en industryDetails. Además, scrollMarginTop: \"96px\" es un magic number; si depende del header, conviene centralizarlo (constante, theme spacing, o una CSS custom property) para evitar desincronización.
- Imagen temporal con comentario TODO para sector Datos (datacenter.png pendiente) - Timer del autoplay tipado como null-safe con guard en stop() e inicio limpio en start() - aria-label "Anterior"/"Siguiente" en botones de navegación del slider - Extraer toSlug() como helper y HEADER_HEIGHT como constante en IndustryCards Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ar contraste Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…der y resetear timer del carrusel al navegar manualmente Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Resumen
Rediseño completo del carrusel de la página de Industrias, convirtiéndolo en un hero de pantalla
completa con imagen de fondo, gradiente y texto centrado. Se añaden subtítulos en inglés por sector, se
corrige el comportamiento del autoplay al cambiar de pestaña, y se mejora la navegación del header
para que los items con submenú sean clickeables.
Tipo de Cambio
Checklist del Desarrollador
src/components/Notas Adicionales
IndustrySlider: Rediseñado como hero de viewport completo (55vh/70vh). Las imágenes sefiltran con
hue-rotate+saturatepara mantener la paleta naranja de marca. El autoplay ahora sepausa con la Page Visibility API al cambiar de pestaña, evitando que el estado del carrusel se
desincronice con las animaciones de Framer Motion.
Header: Se añadióhrefa los itemsSoluciones,IndustriasyPreciospara que el clickdirecto (sin seleccionar subopción) navegue al inicio de la página correspondiente.
IndustryTitle: Eliminado delpage.tsxde industrias ya que el propio slider incorpora ahorael título y la etiqueta "SECTORES ESTRATÉGICOS".
public/assets/industries/datacenter.pngpara el sector Datos.