Feat Botón Map URL Parámetro Widget Carousel

This commit is contained in:
2025-10-23 15:34:09 -03:00
parent e98e152f0e
commit 983ed5e39c
4 changed files with 89 additions and 12 deletions

View File

@@ -58,25 +58,27 @@ export const DevAppLegislativas = () => {
<div style={sectionStyle}> <div style={sectionStyle}>
<h2>Widget: Carrusel de Resultados Provincias (Home)</h2> <h2>Widget: Carrusel de Resultados Provincias (Home)</h2>
<p style={descriptionStyle}> <p style={descriptionStyle}>
Uso: <code style={codeStyle}>&lt;HomeCarouselWidget eleccionId={2} distritoId="02" categoriaId={3} titulo="Diputados - Provincia de Buenos Aires" /&gt;</code> Uso: <code style={codeStyle}>&lt;HomeCarouselWidget eleccionId={2} distritoId="02" categoriaId={3} titulo="Diputados - Provincia de Buenos Aires" mapLinkUrl={''} /&gt;</code>
</p> </p>
<HomeCarouselWidget <HomeCarouselWidget
eleccionId={2} // Nacional eleccionId={2} // Nacional
distritoId="02" // Buenos Aires distritoId="02" // Buenos Aires
categoriaId={3} // Diputados Nacionales categoriaId={3} // Diputados Nacionales
titulo="Diputados - Provincia de Buenos Aires" titulo="Diputados - Provincia de Buenos Aires"
mapLinkUrl={''}
/> />
</div> </div>
<div style={sectionStyle}> <div style={sectionStyle}>
<h2>Widget: Carrusel de Resultados Nación (Home)</h2> <h2>Widget: Carrusel de Resultados Nación (Home)</h2>
<p style={descriptionStyle}> <p style={descriptionStyle}>
Uso: <code style={codeStyle}>&lt;HomeCarouselNacionalWidget eleccionId={2} categoriaId={3} titulo="Diputados - Argentina" /&gt;</code> Uso: <code style={codeStyle}>&lt;HomeCarouselNacionalWidget eleccionId={2} categoriaId={3} titulo="Diputados - Argentina" mapLinkUrl={''} /&gt;</code>
</p> </p>
<HomeCarouselNacionalWidget <HomeCarouselNacionalWidget
eleccionId={2} eleccionId={2}
categoriaId={3} // 3 para Diputados, 2 para Senadores categoriaId={3} // 3 para Diputados, 2 para Senadores
titulo="Diputados - Total País" titulo="Diputados - Total País"
mapLinkUrl={''}
/> />
</div> </div>
@@ -88,8 +90,7 @@ export const DevAppLegislativas = () => {
<HomeCarouselNacionalWidget <HomeCarouselNacionalWidget
eleccionId={2} eleccionId={2}
categoriaId={2} // 3 para Diputados, 2 para Senadores categoriaId={2} // 3 para Diputados, 2 para Senadores
titulo="Senadores - Total País" titulo="Senadores - Total País" mapLinkUrl={''} />
/>
</div> </div>
{/* --- SECCIÓN PARA EL WIDGET DE TARJETAS CON EJEMPLOS --- */} {/* --- SECCIÓN PARA EL WIDGET DE TARJETAS CON EJEMPLOS --- */}

View File

@@ -6,6 +6,7 @@ import { ImageWithFallback } from '../../../components/common/ImageWithFallback'
import { assetBaseUrl } from '../../../apiService'; import { assetBaseUrl } from '../../../apiService';
import { Swiper, SwiperSlide } from 'swiper/react'; import { Swiper, SwiperSlide } from 'swiper/react';
import { Navigation, A11y } from 'swiper/modules'; import { Navigation, A11y } from 'swiper/modules';
import { FiMap } from 'react-icons/fi';
// @ts-ignore // @ts-ignore
import 'swiper/css'; import 'swiper/css';
@@ -17,6 +18,7 @@ interface Props {
eleccionId: number; eleccionId: number;
categoriaId: number; categoriaId: number;
titulo: string; titulo: string;
mapLinkUrl: string;
} }
const formatPercent = (num: number | null | undefined) => `${(num || 0).toFixed(2).replace('.', ',')}%`; const formatPercent = (num: number | null | undefined) => `${(num || 0).toFixed(2).replace('.', ',')}%`;
@@ -39,7 +41,7 @@ const formatDateTime = (dateString: string | undefined | null) => {
} }
}; };
export const HomeCarouselNacionalWidget = ({ eleccionId, categoriaId, titulo }: Props) => { export const HomeCarouselNacionalWidget = ({ eleccionId, categoriaId, titulo, mapLinkUrl }: Props) => {
const uniqueId = `swiper-${Math.random().toString(36).substring(2, 9)}`; const uniqueId = `swiper-${Math.random().toString(36).substring(2, 9)}`;
const prevButtonClass = `prev-${uniqueId}`; const prevButtonClass = `prev-${uniqueId}`;
const nextButtonClass = `next-${uniqueId}`; const nextButtonClass = `next-${uniqueId}`;
@@ -55,7 +57,13 @@ export const HomeCarouselNacionalWidget = ({ eleccionId, categoriaId, titulo }:
return ( return (
<div className={styles.homeCarouselWidget}> <div className={styles.homeCarouselWidget}>
<h2 className={styles.widgetTitle}>{titulo}</h2> <div className={styles.widgetHeader}>
<h2 className={styles.widgetTitle}>{titulo}</h2>
<a href={mapLinkUrl} className={styles.mapLinkButton}>
<FiMap />
<span className={styles.buttonText}>Ver Mapa</span>
</a>
</div>
<div className={styles.carouselContainer}> <div className={styles.carouselContainer}>
<Swiper <Swiper

View File

@@ -30,14 +30,55 @@
position: relative; position: relative;
} }
.widgetHeader {
display: flex;
justify-content: space-between;
align-items: center;
gap: 1rem;
margin: 0 0 0.5rem 0;
padding-bottom: 0.5rem;
border-bottom: 1px solid var(--border-color);
}
.widgetTitle { .widgetTitle {
font-size: 1.2rem; font-size: 1.2rem;
font-weight: 900; font-weight: 900;
color: var(--primary-text); color: var(--primary-text);
margin: 0 0 0.5rem 0; margin: 0;
padding-bottom: 0.5rem; padding: 0;
border-bottom: 1px solid var(--border-color); border: none;
text-align: left; text-align: left;
flex-grow: 1;
}
.mapLinkButton {
display: flex;
align-items: center;
gap: 0.4rem;
background-color: #007bff;
color: white;
padding: 0.5rem 1rem;
border-radius: 9999px;
font-size: 0.8rem;
font-weight: 600;
text-decoration: none;
white-space: nowrap;
transition: background-color 0.2s ease, box-shadow 0.2s ease;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}
.mapLinkButton svg {
font-size: 1rem;
}
.buttonText {
display: inline;
}
.mapLinkButton:hover {
background-color: #0056b3;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);
} }
.topStatsBar { .topStatsBar {
@@ -262,7 +303,26 @@
} }
@media (max-width: 768px) { @media (max-width: 768px) {
.homeCarouselWidget .widgetTitle { text-align: center; font-size: 1.1rem; } .homeCarouselWidget .widgetHeader {
flex-direction: row;
justify-content: space-between;
align-items: center;
gap: 0.5rem;
}
.homeCarouselWidget .widgetTitle {
text-align: left;
font-size: 1rem;
}
.mapLinkButton {
padding: 0.5rem;
}
.buttonText {
display: none;
}
.homeCarouselWidget .topStatsBar { display: grid; grid-template-columns: repeat(2, 1fr); gap: 0.2rem; padding: 0.3rem; } .homeCarouselWidget .topStatsBar { display: grid; grid-template-columns: repeat(2, 1fr); gap: 0.2rem; padding: 0.3rem; }
.homeCarouselWidget .topStatsBar > div { padding: 0.25rem 0.5rem; border-right: none; } .homeCarouselWidget .topStatsBar > div { padding: 0.25rem 0.5rem; border-right: none; }
.homeCarouselWidget .topStatsBar > div:nth-child(odd) { border-right: 1px solid var(--border-color); } .homeCarouselWidget .topStatsBar > div:nth-child(odd) { border-right: 1px solid var(--border-color); }

View File

@@ -6,6 +6,7 @@ import { ImageWithFallback } from '../../../components/common/ImageWithFallback'
import { assetBaseUrl } from '../../../apiService'; import { assetBaseUrl } from '../../../apiService';
import { Swiper, SwiperSlide } from 'swiper/react'; import { Swiper, SwiperSlide } from 'swiper/react';
import { Navigation, A11y } from 'swiper/modules'; import { Navigation, A11y } from 'swiper/modules';
import { FiMap } from 'react-icons/fi';
// @ts-ignore // @ts-ignore
import 'swiper/css'; import 'swiper/css';
@@ -18,6 +19,7 @@ interface Props {
distritoId: string; distritoId: string;
categoriaId: number; categoriaId: number;
titulo: string; titulo: string;
mapLinkUrl: string;
} }
const formatPercent = (num: number | null | undefined) => `${(num || 0).toFixed(2).replace('.', ',')}%`; const formatPercent = (num: number | null | undefined) => `${(num || 0).toFixed(2).replace('.', ',')}%`;
@@ -40,7 +42,7 @@ const formatDateTime = (dateString: string | undefined | null) => {
} }
}; };
export const HomeCarouselWidget = ({ eleccionId, distritoId, categoriaId, titulo }: Props) => { export const HomeCarouselWidget = ({ eleccionId, distritoId, categoriaId, titulo, mapLinkUrl }: Props) => {
const uniqueId = `swiper-${Math.random().toString(36).substring(2, 9)}`; const uniqueId = `swiper-${Math.random().toString(36).substring(2, 9)}`;
const prevButtonClass = `prev-${uniqueId}`; const prevButtonClass = `prev-${uniqueId}`;
const nextButtonClass = `next-${uniqueId}`; const nextButtonClass = `next-${uniqueId}`;
@@ -56,7 +58,13 @@ export const HomeCarouselWidget = ({ eleccionId, distritoId, categoriaId, titulo
return ( return (
<div className={styles.homeCarouselWidget}> <div className={styles.homeCarouselWidget}>
<h2 className={styles.widgetTitle}>{titulo}</h2> <div className={styles.widgetHeader}>
<h2 className={styles.widgetTitle}>{titulo}</h2>
<a href={mapLinkUrl} className={styles.mapLinkButton}>
<FiMap />
<span className={styles.buttonText}>Ver Mapa</span>
</a>
</div>
<div className={styles.carouselContainer}> <div className={styles.carouselContainer}>
<Swiper <Swiper