Esta refactorización modifica la forma en que los widgets manejan sus estilos para prevenir conflictos con los CSS de los sitios anfitriones donde se incrustan. Se ha migrado el sistema de estilos de CSS global a CSS Modules para todos los componentes principales y sus hijos, asegurando que todas las clases sean únicas y estén aisladas. Cambios principales: - Se actualizan los componentes .tsx para importar y usar los módulos de estilos (`import styles from ...`). - Se renombran los archivos `.css` a `.module.css`. - Se añade una regla en cada módulo para proteger la `font-family` y el `box-sizing` del widget, evitando que sean sobreescritos por estilos externos. - Se ajustan los selectores para librerías de terceros (react-select, react-simple-maps) usando `:global()` para mantener la compatibilidad. - Se mueven las variables CSS de `:root` a las clases principales de cada widget para evitar colisiones en el scope global. Como resultado, los widgets (`HomeCarouselWidget`, `PanelNacionalWidget`, `ResultadosNacionalesCardsWidget`, `CongresoNacionalWidget`) son ahora más robustos, portátiles y visualmente consistentes en cualquier entorno.
		
			
				
	
	
		
			65 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| // src/features/legislativas/nacionales/components/MunicipioSearch.tsx
 | |
| import { useState } from 'react';
 | |
| import { useQuery } from '@tanstack/react-query';
 | |
| import Select, { type SingleValue } from 'react-select';
 | |
| import { getMunicipiosPorDistrito } from '../../../../apiService';
 | |
| import type { CatalogoItem } from '../../../../types/types';
 | |
| // 1. Importamos el archivo de estilos como un módulo CSS
 | |
| import styles from '../PanelNacional.module.css';
 | |
| 
 | |
| interface MunicipioSearchProps {
 | |
|     distritoId: string;
 | |
|     onMunicipioSelect: (municipioId: string, municipioNombre: string) => void;
 | |
| }
 | |
| 
 | |
| interface OptionType {
 | |
|     value: string;
 | |
|     label: string;
 | |
| }
 | |
| 
 | |
| // 2. Definimos los estilos custom para react-select.
 | |
| //    Ya no son necesarios aquí porque los definimos en el CSS module.
 | |
| //    const customSelectStyles: StylesConfig<OptionType, false> = { ... };
 | |
| 
 | |
| export const MunicipioSearch = ({ distritoId, onMunicipioSelect }: MunicipioSearchProps) => {
 | |
|     const [selectedOption, setSelectedOption] = useState<SingleValue<OptionType>>(null);
 | |
| 
 | |
|     const { data: municipios = [], isLoading } = useQuery<CatalogoItem[]>({
 | |
|         queryKey: ['municipiosPorDistrito', distritoId],
 | |
|         queryFn: () => getMunicipiosPorDistrito(distritoId),
 | |
|         enabled: !!distritoId,
 | |
|     });
 | |
| 
 | |
|     const options: OptionType[] = municipios.map(m => ({
 | |
|         value: m.id,
 | |
|         label: m.nombre
 | |
|     }));
 | |
| 
 | |
|     const handleChange = (selected: SingleValue<OptionType>) => {
 | |
|         if (selected) {
 | |
|             onMunicipioSelect(selected.value, selected.label);
 | |
|             setSelectedOption(null); 
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     // 3. Aplicamos la clase del módulo al contenedor principal
 | |
|     //    y usamos el classNamePrefix para que react-select genere clases
 | |
|     //    que podamos estilizar desde el CSS module.
 | |
|     return (
 | |
|         <div className={styles.municipioSearchContainer}>
 | |
|             <Select
 | |
|                 options={options}
 | |
|                 onChange={handleChange}
 | |
|                 value={selectedOption}
 | |
|                 isLoading={isLoading}
 | |
|                 placeholder="Buscar municipio..."
 | |
|                 isClearable
 | |
|                 isSearchable
 | |
|                 // El prefijo se mantiene igual al del selector de categorías.
 | |
|                 // Esto nos permite reutilizar los mismos estilos :global que ya definimos.
 | |
|                 classNamePrefix="categoriaSelector"
 | |
|                 noOptionsMessage={() => 'No se encontraron municipios'}
 | |
|             />
 | |
|         </div>
 | |
|     );
 | |
| }; |