Connect with us

POLITICA

Elecciones CABA 2025: cuáles son las listas que se presentan y los principales candidatos

Published

on



El próximo 18 de mayo, los residentes de la Ciudad Autónoma de Buenos Aires volverán a las urnas para elegir a los nuevos integrantes de la Legislatura porteña, en una elección que definirá el perfil político de la capital durante los próximos cuatro años.

De las 60 bancas que conforman el parlamento local, estarán en juego 30 escaños, distribuidos proporcionalmente entre las listas que superen el piso del 3% de los votos válidos. Esta renovación representa una pulseada clave para las principales fuerzas políticas que buscan sostener o incrementar su representación parlamentaria.

Advertisement

Podrán participar más de 2.526.000 electores, según el padrón definitivo publicado por la Justicia Electoral, y el sistema que se utilizará nuevamente para la emisión del sufragio será el de Boleta Única Electrónica (BUE), que ya se empleó en elecciones anteriores. El escrutinio se realizará en tiempo real, y los nuevos legisladores asumirán sus bancas el 10 de diciembre de 2025.

El sistema de Boleta Única Electrónica será clave en las elecciones legislativas de CABA (Gustavo Gavotti)

¿Cuáles son las listas que se presentan?

Se oficializaron 17 listas para competir en los comicios legislativos de CABA. Estas son:

  • Buenos Aires Primero (PRO)
  • Es Ahora Buenos Aires (Unión por la Patria rebautizada)
  • La Libertad Avanza
  • Volvamos Buenos Aires
  • Evolución
  • Coalición Cívica
  • Frente de Izquierda y de los Trabajadores Unidad (FITU)
  • Libertad y Orden (UCeDé)
  • Principios y Valores
  • Justa, Libre y Soberana
  • Unión Porteña Libertaria
  • Movimiento de Integración y Desarrollo (MID)
  • Nuevo MAS
  • Remedios para CABA
  • Frente Patriota Federal
  • Confluencia por la Unidad y la Soberanía
  • El Movimiento – Nueva Generación

Estas agrupaciones presentan diversas configuraciones partidarias, desde alianzas tradicionales como el PRO y Unión Cívica Radical, hasta espacios nuevos o escindidos, como los encabezados por Horacio Rodríguez Larreta, Ricardo Caruso Lombardi o Ramiro Marra.

Los candidatos para las elecciones CABA 2025

A continuación, un repaso por los principales postulantes que encabezarán las listas en la contienda legislativa. Cada candidato representa no solo una visión política, sino una estrategia particular dentro del complejo tablero electoral porteño.

Advertisement

Silvia Lospennato

Lista: Buenos Aires Primero (PRO). La actual diputada nacional lidera la lista del oficialismo porteño. Con una trayectoria que incluye cargos en el Ministerio de Gobierno de CABA y en la ACUMAR, se ha destacado por impulsar la Ley de Ficha Limpia y por su trabajo en temas de género. Su candidatura está respaldada por figuras como Hernán Lombardi, Laura Alonso y Darío Nieto. El PRO es la fuerza con más bancas en juego: 15 de las 30 en disputa.

Silvia Lospennato

Leandro Santoro

Lista: Es Ahora Buenos Aires. Referente del peronismo kirchnerista, es diputado nacional hasta 2025 y encabeza el frente renovado del ex Unión por la Patria. De raíces radicales, Santoro fue segundo en la elección a jefe de Gobierno de 2023. Lo acompañan referentes sociales, académicos y legislativos como Claudia Negri, Alejandro “Pitu” Salvatierra, Berenice Ibáñez y Juan Pablo Modarelli.

Leandro Santoro

Manuel Adorni

Lista: La Libertad Avanza. Es el actual vocero presidencial y figura central del espacio que conduce Javier Milei. Economista y comunicador, encabeza la boleta que buscará ampliar la representación libertaria en la Legislatura, donde hoy LLA pone en juego 6 bancas. Aún no está claro si continuará en su cargo nacional en caso de asumir como legislador y en el caso que no lo haga, no se sabe quién será su sucesor.

Advertisement

Manuel Adorni

Horacio Rodríguez Larreta

Lista: Volvamos Buenos Aires. Ex jefe de Gobierno porteño entre 2015 y 2023, reaparece con un proyecto propio tras romper con el macrismo: el Movimiento al Desarrollo (MAD). Su lista integra a Guadalupe Tagliaferri, Emma Ferrario y al ex jefe de Gobierno Jorge Telerman. Aspira a consolidar una nueva corriente de centroderecha en CABA con proyección nacional.

Horacio Rodríguez Larreta

Lucille Levy

Lista: Evolución. Con 29 años, esta contadora y consejera superior de la UBA es una de las caras visibles del reclamo por el financiamiento universitario. Exdirigente de la FUBA, representa una coalición entre la UCR de Lousteau, el Partido Socialista de Roy Cortina y el GEN de Margarita Stolbizer. Fue una de las figuras destacadas en la masiva marcha educativa de abril 2024.

Lucille Levy

Ramiro Marra

Lista: Libertad y Orden (UCeDé). Alejado de Milei tras una interna con Karina Milei, busca renovar su banca legislativa con lista propia. Fue tercero en las elecciones a jefe de Gobierno de 2023. Presenta una boleta con el sello de la UCeDé, acompañada por Nabila Michitte y Eduardo Del Piano, según confirmó en X.

Advertisement

Ramiro Marra

Vanina Biasi

Lista: Frente de Izquierda y de los Trabajadores Unidad. Integrante del Partido Obrero, es diputada nacional hasta diciembre y docente no universitaria. Obtuvo el 4% en la elección a jefe de Gobierno de 2023. Encabeza una lista que busca sostener las dos bancas que el FITU tiene en la Legislatura, acompañada por militantes como Celeste Fierro y Pablo Almeida.

Vanina Biasi

Ricardo Caruso Lombardi

Lista: Movimiento de Integración y Desarrollo (MID). El reconocido entrenador de fútbol debuta como candidato en CABA. Fue presentado por Oscar Zago, tras el quiebre con el PRO. Su lista la integran figuras sin experiencia política previa, entre ellas Sandra Lorena Saravia y Miguel Ángel Arancio.

Ricardo Caruso Lombardi

Juan Manuel Abal Medina

Lista: Justa, Libre y Soberana. Ex jefe de Gabinete de la Nación (2011–2013) y referente del Movimiento Evita, combina una extensa carrera académica y política. Su lista incluye a la actriz y politóloga Carolina Papaleo y al ex subsecretario PyME Pablo Bercovich. Es uno de los perfiles con mayor formación en ciencia política del arco electoral.

Advertisement

Juan Manuel Abal Medina

Marcelo Peretta

Lista: Remedios para CABA. Secretario general del Sindicato Argentino de Farmacéuticos y Bioquímicos (SAFyB), obtuvo la personería política de su partido en febrero. Propone una agenda centrada en salud, con énfasis en el rol de los farmacéuticos y el acceso a medicamentos.

Marcelo Peretta (Fuente)

Alejandro Kim

Lista: Principios y Valores. Abogado, empresario e hijo de inmigrantes coreanos, fue vicepresidente de la Cámara de Empresarios Coreanos. Su espacio, impulsado por Guillermo Moreno, rompió con el peronismo porteño por desacuerdos con la candidatura de Santoro.

Alejandro Kim

César Biondini

Lista: Frente Patriota Federal. Referente ultraderechista, se presenta con una plataforma “provida” y opositora tanto al gobierno nacional como al PRO. Presentó su candidatura ante la Justicia Electoral pocas horas antes del cierre del plazo.

Advertisement

César Biondini

Yamil Santoro

Lista: Unión Porteña Libertaria. Legislador porteño y abogado, es uno de los principales impulsores de las ideas libertarias dentro del espacio liberal de CABA. Su lista compite por captar el voto de derecha desencantado tanto con Javier Milei como con el PRO. Comparte el armado con figuras como Alejandra Muchart y Paula Scauzillo.

Yamil Santoro

Federico Winokur

Lista: Nuevo MAS. Maestro de escuela primaria y militante del trotskismo, encabeza una lista integrada por jóvenes activistas estudiantiles y sociales. La nómina, que se referencia en Manuela Castañeira a nivel nacional, se destaca por tener un promedio de edad de 30 años. Le siguen Violeta Azriel Alonso, secretaria del Centro de Estudiantes de Filosofía y Letras de la UBA, y Alejandro Leiva, trabajador no docente de la misma facultad.

Federico Winokur (Fuente)

María Eva Koutsovitis

Lista: Confluencia por la Unidad y la Soberanía. Ingeniera civil especializada en hidráulica, es una reconocida activista urbana que lidera esta lista ligada a Claudio Lozano. La acompañan referentes sociales, sindicales y académicos, como Ariel Elger, del Partido Comunista; Mónica Ruejas, del barrio Los Piletones; y Jonatan Baldiviezo, del Observatorio del Derecho a la Ciudad. Su propuesta se enfoca en la defensa de lo público y los derechos urbanos.

Advertisement

María Eva Koutsovitis

Paula Oliveto

Lista: Coalición Cívica. Actual diputada nacional y presidenta del partido fundado por Elisa “Lilita” Carrió, vuelve a competir por una banca en la Legislatura porteña, donde ya se desempeñó entre 2013 y 2017. Abogada de profesión, también fue auditora general de la Ciudad durante el primer mandato de Mauricio Macri como jefe de Gobierno. Su trayectoria se caracteriza por una agenda centrada en la transparencia institucional y la lucha contra la corrupción.

Paula Oliveto

Mila Zurbriggen

Lista: El Movimiento – Nueva Generación. Encabeza una lista debutante en el escenario porteño, de la cual hasta ahora se conocen pocos detalles programáticos.

Mila Zurbriggen

Su candidatura fue habilitada por la Justicia Electoral, y representa una opción nueva, sin alianzas tradicionales ni figuras reconocidas nacionalmente. No se difundieron aún sus propuestas ni el resto de sus candidatos.

Advertisement
Advertisement

POLITICA

Un gremio lanzó una campaña en los aeropuertos del país contra los senadores que apoyaron la reforma laboral

Published

on


Bajo una metodología poco habitual para el gremialismo y que amenaza con desatar una polémica, la Asociación del Personal Aeronáutico (APA), uno de los sindicatos fuertes del mundo de los aviones que ya tuvo fricciones con la gestión de Javier Milei, lanzó en las últimas horas una campaña en los aeropuertos del país para señalar a los senadores nacionales que votaron a favor de la reforma laboral oficialista.

Enrolado en la CTA de los Trabajadores, y también partícipe de la movilización al exterior del Congreso, APA mostró en sus canales de difusión fotos y videos de integrantes del sindicato en el momento en que repartían volantes en terminales aéreas de la Argentina, estampados con las caras de senadores que colaboraron con los votos en favor del Gobierno, con su nombre, su partido político y la leyenda: “votaron en contra del pueblo trabajador argentino”.

Advertisement
Así se movían los sindicalistas de APA en el aeropuerto de San Juan

Según pudo saber , ya desplegaron esta medida por el interior del país, mientras que está previsto que en los próximos días llegue a los aeropuertos de la ciudad y la provincia de Buenos Aires, y que la semana que viene también los mismos volantes se repartan en la puerta del Congreso.

El titular del gremio, Edgardo Llano, ferviente detractor de Milei, de raíces peronistas y con más cercanía al kirchnerismo, que también respaldó la campaña presidencial de Sergio Massa, buscó justificar la acción en diálogo con .

“Son 72 senadores en total y solo 10 o 15 conocidos, al resto nadie los conoce; por eso queremos que se hagan responsables de su voto; lo único que hacemos con esta campaña es decir quiénes son y a qué partido pertenecen”, sostuvo Llano.

Advertisement
Sindicalistas de APA en aeropuertos repartiendo folletos contra los senadores que votaron a favor de la reforma laboralAPA INSTAGRAM

Electo secretario general de APA en 2004 y con mandato renovado este año hasta 2030, el jefe gremial negó ante el planteo de que haya una intención de “escrachar” a los representantes políticos que acompañaron a la Casa Rosada.

“No es un escrache, le hacemos conocer al público quién es el senador y cómo votó. Es lo que votaron, también lo mostraron los medios, nadie se puede sentir molesto”, manifestó Llano.

Sin embargo, en 2024, el líder gremial ya había dicho que había que “escrachar” a los legisladores que votaran la Ley Bases de Milei, cuando se tomaran vuelos en Aerolíneas Argentinas. Aquellas expresiones le habían generado fuertes críticas y hasta una denuncia en la Justicia de parte de diputados de Pro por amenazas, instigación a cometer delitos e intimidación. En su momento, esa campaña de señalamiento no se llevó finalmente a cabo.

Advertisement

Ahora, el gremialista dice que fue sobreseído y que por eso su sindicato avanzó con esta otra modalidad, a través de panfletos.

Edgardo Llano, líder gremial de APA Ricardo Pristupluk –

Este gremio tuvo alta conflictividad con el gobierno de Milei, sobre todo en el primer año de gestión, por las negociaciones laborales en Aerolíneas Argentinas y las amenazas de paros.

En ese momento, el Presidente decía en una crítica a los sindicatos del sector: “En la Argentina se sale trabajando, no extorsionando”. El Gobierno asegura sentirse cómodo cuando aparece como blanco del sindicalismo, porque considera que eso le reditúa en su electorado.

Advertisement
El secretario general de la Asociación del Personal Aeronáutico (APA), durante el gobierno de Alberto Fernández, con Cristina Kirchner

De momento, el reparto de folletos contra libertarios y aliados estuvo exclusivamente dirigida a senadores. El gremio también compartió en sus redes sociales imágenes de la campaña con los mismos volantes, pero en formato digital, con el sello de APA, la CTA de los Trabajadores y la Federación Internacional de los Trabajadores del Transporte (ITF). Los sindicalistas ya desarrollaron la acción en aeropuertos de Resistencia (Chaco), Santa Fe, San Juan, Formosa, Jujuy, Paraná (Entre Ríos), San Luis, Chapelco (Neuquén), Mendoza, Esquel (Chubut) y Córdoba.

Edgardo Llano y Sergio Massa durante un acto de la CTA en respaldo a su candidatura Facebook

“Las compañeras y compañeros aeronáuticos iniciamos una campaña en los aeropuertos del país para que todos conozcan a sus representantes que votaron en contra del trabajador argentino”, dijeron en redes.

El Senado avanzaba esta noche hacia la aprobación definitiva de la reforma laboral. Tras ganar las elecciones, el Gobierno, a través de negociaciones con gobernadores, senadores, diputados y parte de la CGT, logró los avales tanto en la Cámara alta como en la Cámara baja para tener el texto listo antes de que el domingo arranquen las sesiones ordinarias de 2026.

Advertisement

reforma laboral oficialista,negociaciones laborales en Aerolíneas Argentinas,View this post on Instagram,Paula Rossi,Reforma laboral,Senado de la Nación,Conforme a,,Nuevo régimen. Cómo es la ley que baja la edad de imputabilidad a 14 años: garantías, penas y asignaciones,,»No llega a 2027″. Un gobernador del PJ ratificó sus dichos contra Milei tras haber sido denunciado en la Justicia,Reforma laboral,,Mapa de cortes. Video: los incidentes del Obelisco por una protesta contra la reforma laboral, desde un drone,,Debate en el Senado. Un abogado constitucionalista advirtió cuáles son las mayores incongruencias de la reforma laboral: “Todo es un gran show”,,Tensión con la Policía. Manifestaciones y cortes en el centro porteño en protesta por la reforma laboral

Continue Reading

POLITICA

El Senado convirtió en ley el Régimen Penal Juvenil: la edad de imputabilidad baja a 14 años

Published

on



Luego de largas horas de debate, el Senado convirtió en ley el nuevo Régimen Penal Juvenil. De esta manera, la edad de imputabilidad baja a 14 años.

Una vez conocido el resultado legislativo, el Gobierno celebró la sanción de la norma. El Presidente Javier Milei afirmó a través de sus redes sociales: “El que las hace las paga”. “El Congreso Nacional sancionó la Ley Penal Juvenil, que baja la edad de imputabilidad a los 14 años. Ahora hay castigo donde antes había impunidad”, remarcó el jefe de Gabinete, Manuel Adorni.

Advertisement

Leé también: LLA y el peronismo se cruzaron por el reglamento: “Si respetaran las normas, no tendrían a CFK con tobillera”

En la misma línea, en el Gobierno manifestaron: “Con esta ley, la Argentina cierra un capítulo de cuatro décadas de inacción legislativa y actualiza un marco normativo que permanecía desconectado de la realidad criminal del siglo XXI”.

Y agregaron: “La baja de la edad de imputabilidad a los 14 años no es solo un cambio legal, sino un acto de justicia hacia la sociedad. A partir de hoy, quien tiene la capacidad de comprender la gravedad de sus actos asume, sin excepciones, la responsabilidad de responder ante la ley. Delito de adulto, pena de adulto”.

Advertisement

Leé también: La UCR reúne a gobernadores y 300 intendentes en Santa Fe para fortalecer la territorialidad rumbo al 2027

A través de un comunicado de la Oficina del Presidente, indicaron: “Milei destaca la labor de los legisladores que comprendieron que la seguridad de los argentinos y la protección de las víctimas deben estar por encima de todo. Esta reforma salda una deuda histórica y devuelve a la Justicia las herramientas necesarias para terminar con la impunidad y el caos que reinó durante décadas”.

Y señalaron: “El orden, la libertad, el derecho a la vida y a la propiedad privada solo son posibles cuando hay consecuencias reales para quienes quebrantan la paz social. En Argentina, dentro de la ley, todo; fuera de la ley, nada”.

Advertisement

La jefa de bloque de La Libertad Avanza en el Senado y exministra de Seguridad, Patricia Bullrich, expresó: “La Ley Penal Juvenil es ley. Para las víctimas de menores delincuentes, una pizca de la justicia que nunca van a tener. Desde hoy, la impunidad ya no es la regla. Las hacen, las pagan.

Por su parte, la actual titular de Seguridad, Alejandra Monteoliva, afirmó: “Celebro la aprobación de la Ley Penal Juvenil. Hoy la Argentina eligió, de una vez por todas, estar del lado de las víctimas. Un paso firme para que la edad no sea una excusa y para que, en la Argentina, el que las hace, las pague”.

Senado, Baja de la edad de imputabilidad, Régimen Penal de la Minoridad

Advertisement
Continue Reading

POLITICA

Ley Penal Juvenil: uno por uno, cómo votaron los senadores la baja de la imputabilidad a los 14 años

Published

on



Uno por uno, cómo votaron los senadores la Reforma Penal Juvenil

Advertisement

Advertisement


${status}

`;
}

Advertisement

function createCard(item, borderColor) {
const card = document.createElement(«div»);
card.className = «vs2__card»;

const fotoWrap = document.createElement(«div»);
fotoWrap.className = «vs2__foto»;
if (borderColor) {
fotoWrap.style.borderColor = borderColor;
} else {
fotoWrap.style.opacity = «0.3»;
fotoWrap.style.border = «none»;
}

const img = document.createElement(«img»);
img.loading = «lazy»;
img.decoding = «async»;
img.alt = «foto-senador»;
img.src = » + (item.url_foto || «»);
img.addEventListener(«error», () => {
img.style.opacity = «0.35»;
}, {
once: true
});

Advertisement

fotoWrap.appendChild(img);

const nombre = document.createElement(«p»);
nombre.className = «vs2__nombre»;
nombre.textContent = String(item.nombres || «»).toLowerCase();

const apellido = document.createElement(«p»);
apellido.className = «vs2__apellido»;
apellido.textContent = String(item.apellido || «»).toLowerCase();

Advertisement

const bloque = document.createElement(«span»);
bloque.className = «vs2__bloque»;
bloque.textContent = String(item.bloque || «»);

card.appendChild(fotoWrap);
card.appendChild(nombre);
card.appendChild(apellido);
card.appendChild(bloque);

return card;
}

Advertisement

function seatClass(kind) {
if (kind === «AFIRMATIVO») return «vs2__seat–afirmativo»;
if (kind === «NEGATIVO») return «vs2__seat–negativo»;
if (kind === «ABSTENCIÓN») return «vs2__seat–abstencion»;
if (kind === «AUSENTE») return «vs2__seat–ausente»;
return «vs2__seat–empty»;
}

function hemicicloParams(which) {
if (which === «big») {
return {
centerX: 300,
baseY: 450,
rows: 5,
seatsPerRow: [21, 18, 16, 11, 6],
verticalOffset: 2,
radiusStart: 300,
radiusStep: 55
};
}
return {
centerX: 300,
baseY: 450,
rows: 5,
seatsPerRow: [21, 18, 16, 12, 7],
verticalOffset: 0,
radiusStart: 170,
radiusStep: 30
};
}

function computeRowSeatCounts(seatsPerRow, totals) {
const totalSeats = seatsPerRow.reduce((a, b) => a + b, 0);
return seatsPerRow.map(seatsInRow => {
const exact = {
AFIRMATIVO: (totals.AFIRMATIVO / totalSeats) * seatsInRow,
NEGATIVO: (totals.NEGATIVO / totalSeats) * seatsInRow,
«ABSTENCIÓN»: (totals[«ABSTENCIÓN»] / totalSeats) * seatsInRow,
AUSENTE: (totals.AUSENTE / totalSeats) * seatsInRow
};

Advertisement

const floor = {
AFIRMATIVO: Math.floor(exact.AFIRMATIVO),
NEGATIVO: Math.floor(exact.NEGATIVO),
«ABSTENCIÓN»: Math.floor(exact[«ABSTENCIÓN»]),
AUSENTE: Math.floor(exact.AUSENTE)
};

let assigned = floor.AFIRMATIVO + floor.NEGATIVO + floor[«ABSTENCIÓN»] + floor.AUSENTE;
let diff = seatsInRow – assigned;

const rems = [{
k: «AFIRMATIVO»,
r: exact.AFIRMATIVO – floor.AFIRMATIVO
},
{
k: «NEGATIVO»,
r: exact.NEGATIVO – floor.NEGATIVO
},
{
k: «ABSTENCIÓN»,
r: exact[«ABSTENCIÓN»] – floor[«ABSTENCIÓN»]
},
{
k: «AUSENTE»,
r: exact.AUSENTE – floor.AUSENTE
},
].sort((a, b) => b.r – a.r);

Advertisement

while (diff > 0) {
for (const it of rems) {
if (diff <= 0) break;
floor[it.k] += 1;
diff–;
}
}
return floor;
});
}

function renderHemiciclo(which, totals) {
const el = byRole(which === «big» ? «hemiciclo-big» : «hemiciclo-small»);
if (!el) return;
el.innerHTML = «»;

const p = hemicicloParams(which);
let rowSeatCounts = computeRowSeatCounts(p.seatsPerRow, totals);
const maxSeatsInRow = p.seatsPerRow[0];

Advertisement

for (let col = 0; col < maxSeatsInRow; col++) {
for (let row = 0; row < p.rows; row++) {
if (col >= p.seatsPerRow[row]) continue;

const seatsInThisRow = p.seatsPerRow[row];
const radius = p.radiusStart – row * (p.radiusStep – p.verticalOffset);
const angleRange = Math.PI;
const angleStep = (seatsInThisRow > 1) ? angleRange / (seatsInThisRow – 1) : 0;
const angle = (Math.PI – angleRange) / 2 + col * angleStep;

const x = p.centerX + radius * Math.cos(angle);
const y = p.baseY – radius * Math.sin(angle);

Advertisement

let kind = «EMPTY»;
if (rowSeatCounts[row].AFIRMATIVO > 0) {
kind = «AFIRMATIVO»;
rowSeatCounts[row].AFIRMATIVO–;
} else if (rowSeatCounts[row].NEGATIVO > 0) {
kind = «NEGATIVO»;
rowSeatCounts[row].NEGATIVO–;
} else if (rowSeatCounts[row][«ABSTENCIÓN»] > 0) {
kind = «ABSTENCIÓN»;
rowSeatCounts[row][«ABSTENCIÓN»]–;
} else if (rowSeatCounts[row].AUSENTE > 0) {
kind = «AUSENTE»;
rowSeatCounts[row].AUSENTE–;
}

const seat = document.createElement(«div»);
seat.className = «vs2__seat » + seatClass(kind);
seat.style.left = x + «px»;
seat.style.top = y + «px»;
el.appendChild(seat);
}
}
}

function populateFilters(data) {
const selProv = byRole(«select-provincia»);
const selBloq = byRole(«select-bloque»);
if (!selProv || !selBloq) return;

Advertisement

const provSet = new Set();
const bloqSet = new Map(); // bloque -> full

data.forEach(r => {
if (r.provincia) provSet.add(r.provincia);
if (r.bloque) bloqSet.set(r.bloque, r.bloque_full || r.bloque);
});

Array.from(provSet).sort().forEach(p => {
const opt = document.createElement(«option»);
opt.value = p;
opt.textContent = p;
selProv.appendChild(opt);
});

Advertisement

Array.from(bloqSet.entries())
.sort((a, b) => String(a[0]).localeCompare(String(b[0])))
.forEach(([code, full]) => {
const opt = document.createElement(«option»);
opt.value = code;
opt.textContent = `${full} (${code})`;
selBloq.appendChild(opt);
});
}

function renderFiltered(data, field, value, targetEl) {
targetEl.innerHTML = «»;
const rows = data.filter(r => value === «all» || r[field] === value);

const order = [«AFIRMATIVO», «NEGATIVO», «ABSTENCIÓN», «AUSENTE»];
const colorBy = {
AFIRMATIVO: «#00A377»,
NEGATIVO: «#c90808»,
«ABSTENCIÓN»: «#444″,
AUSENTE: null
};

Advertisement

order.forEach(voto => {
rows.filter(r => normalizeVoto(r.voto) === voto).forEach(r => {
targetEl.appendChild(createCard(r, colorBy[voto]));
});
});
}

function wireUI(data) {
// toggles
$$(‘[data-role=»section»], [data-role=»filter-provincia»], [data-role=»filter-bloque»]’).forEach(sec => {
const btn = sec.querySelector(‘[data-role=»toggle»]’);
if (!btn) return;
btn.addEventListener(«click», () => {
const open = sec.getAttribute(«data-open») !== «true»;
openPanel(sec, open);
});
});

// abrir por defecto secciones principales, y dejar filtros cerrados
$$(‘[data-role=»section»]’).forEach(sec => openPanel(sec, true));
$$(‘[data-role=»filter-provincia»], [data-role=»filter-bloque»]’).forEach(sec => openPanel(sec, false));

Advertisement

// go top
const goTop = byRole(«go-top»);
if (goTop) {
goTop.addEventListener(«click», () => root.scrollIntoView({
behavior: «smooth»
}));
const obs = new IntersectionObserver((entries) => {
entries.forEach(e => {
goTop.style.display = e.isIntersecting ? «block» : «none»;
});
}, {
threshold: 0.1
});
obs.observe(root);
}

// filtros
const selProv = byRole(«select-provincia»);
const selBloq = byRole(«select-bloque»);
const provOut = byRole(«provincia-results»);
const bloqOut = byRole(«bloque-results»);

if (selProv && provOut) {
selProv.addEventListener(«change», (e) => {
renderFiltered(data, «provincia», e.target.value, provOut);
const sec = byRole(«filter-provincia»);
if (sec) openPanel(sec, true);
});
}

Advertisement

if (selBloq && bloqOut) {
selBloq.addEventListener(«change», (e) => {
renderFiltered(data, «bloque», e.target.value, bloqOut);
const sec = byRole(«filter-bloque»);
if (sec) openPanel(sec, true);
});
}
}

async function init() {
setLoaded(false);

const csvUrl = root.dataset.csvUrl;
if (!csvUrl) {
const summary = byRole(«summary»);
if (summary) summary.innerHTML = `

Advertisement

Error: falta data-csv-url

`;
return;
}

try {
const Papa = await ensurePapa();

Advertisement

Papa.parse(csvUrl, {
download: true,
header: true,
skipEmptyLines: true,
complete: function (res) {
const data = (res && res.data) ? res.data : [];

// panels por voto
const panelByVote = {};
$$(‘[data-role=»section»]’).forEach(sec => {
const voto = sec.getAttribute(«data-voto»);
const panel = sec.querySelector(‘[data-role=»panel»]’);
if (voto && panel) panelByVote[voto] = panel;
});

const counts = {
AFIRMATIVO: 0,
NEGATIVO: 0,
«ABSTENCIÓN»: 0,
AUSENTE: 0
};
const colorBy = {
AFIRMATIVO: «#00A377»,
NEGATIVO: «#c90808»,
«ABSTENCIÓN»: «#444″,
AUSENTE: null
};

Advertisement

data.forEach(row => {
const voto = normalizeVoto(row.voto);
if (!counts.hasOwnProperty(voto)) return;
counts[voto]++;

const panel = panelByVote[voto];
if (panel) {
panel.appendChild(createCard(row, colorBy[voto]));
}
});

// counts en UI
$$(‘[data-role=»count»]’).forEach(el => {
const k = el.getAttribute(«data-kind»);
if (k && counts.hasOwnProperty(k)) el.textContent = String(counts[k]);
});

Advertisement

// hemiciclo + summary
renderHemiciclo(«big», counts);
renderHemiciclo(«small», counts);
renderSummary(counts);

// filtros + ui
populateFilters(data);
wireUI(data);

setLoaded(true);

Advertisement

// recalcular heights en secciones abiertas
$$(‘[data-role=»section»]’).forEach(sec => openPanel(sec, true));
}
});

} catch (err) {
console.error(err);
const summary = byRole(«summary»);
if (summary) {
summary.innerHTML = `

Error: ${escapeHtml(err.message || err)}

Advertisement

`;
}
}
}

init();
})();

Advertisement
Continue Reading

Tendencias